├── .DS_Store ├── .dockerignore ├── .gitignore ├── .npmignore ├── .travis.yml ├── Dockerfile ├── LICENSE ├── README.md ├── coffeelint.json ├── command.coffee ├── command.js ├── docs ├── .DS_Store ├── _config.yml ├── css │ ├── .DS_Store │ └── vitality-octo-green.css ├── device-mockups │ ├── .DS_Store │ ├── device-mockups.min.css │ └── macbook │ │ └── macbook.png ├── img │ ├── .DS_Store │ ├── 300x300spiral.png │ ├── battlebot.png │ ├── battlebot2.png │ ├── battlebot3.png │ ├── battlebot4.png │ ├── battlebot5.png │ ├── battlebot6.png │ ├── crypto.png │ ├── favicon.ico │ ├── keywall.jpg │ ├── meshblu-code.jpeg │ ├── mobile-screens.png │ ├── octoblu-color.png │ ├── octoblu-inverse-spiral.png │ ├── octoblu-inverse.png │ ├── octoblu-team1.jpg │ ├── octoblu.png │ ├── particle-blinkytape.jpg │ ├── tablet-screens.png │ ├── team1.png │ ├── team2.png │ ├── team3.png │ ├── team4.png │ └── tempetownlake.jpg ├── index.html ├── js │ ├── contact_me.js │ ├── jqBootstrapValidation.js │ ├── vitality-mixitup.js │ └── vitality.js └── vendor │ ├── animate.css │ ├── animate.css │ └── animate.min.css │ ├── bootstrap │ ├── css │ │ ├── bootstrap-grid.css │ │ ├── bootstrap-grid.min.css │ │ ├── bootstrap-reboot.css │ │ ├── bootstrap-reboot.min.css │ │ ├── bootstrap.css │ │ └── bootstrap.min.css │ └── js │ │ ├── bootstrap.js │ │ └── bootstrap.min.js │ ├── font-awesome │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── less │ │ ├── animated.less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── screen-reader.less │ │ ├── stacked.less │ │ └── variables.less │ └── scss │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss │ ├── jquery.easing │ ├── jquery.easing.compatibility.js │ ├── jquery.easing.js │ └── jquery.easing.min.js │ ├── jquery │ ├── jquery.js │ └── jquery.min.js │ ├── magnific-popup │ ├── jquery.magnific-popup.js │ ├── jquery.magnific-popup.min.js │ └── magnific-popup.css │ ├── mixitup │ ├── mixitup.js │ └── mixitup.min.js │ ├── owl-carousel │ ├── AjaxLoader.gif │ ├── grabbing.png │ ├── owl.carousel.css │ ├── owl.carousel.js │ ├── owl.carousel.min.js │ ├── owl.theme.css │ └── owl.transitions.css │ ├── tether │ ├── tether.js │ └── tether.min.js │ ├── vide │ ├── jquery.vide.js │ └── jquery.vide.min.js │ └── wowjs │ ├── wow.js │ └── wow.min.js ├── index.js ├── package.json ├── run-in-docker.sh ├── sample.env ├── src └── meshblu-core-runner.coffee ├── test-start.sh └── yarn.lock /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/.DS_Store -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | coverage 2 | node_modules 3 | .git 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | *.dockerfile-dev 39 | .npmrc-dev 40 | .bin-dev 41 | 42 | meshblu.json 43 | skynet.txt 44 | dist 45 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | deploy 29 | test 30 | .nyc_output 31 | meshblu.json 32 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '8' 4 | branches: 5 | only: 6 | - "/^v[0-9]/" 7 | services: 8 | - redis 9 | - mongodb 10 | before_deploy: 11 | - npm run build 12 | deploy: 13 | provider: npm 14 | email: serveradmin@octoblu.com 15 | skip_cleanup: true 16 | api_key: 17 | secure: XmrfhODbEycUQ05QlsuGedpO8nc2vLZaoOjdrUGP8AZulv/f2maC2JTF3JoVSfzm6PJjToMXMav2UXLZpoOM11cHrfCrUyVIxD1rgxbFohDdMoxJUcLVcA+iaPQubexodluwcc5Na8cPDisq8QplgTmFN+EJLHgFPvZCXeKYWNw= 18 | on: 19 | tags: true 20 | branches: true 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM octoblu/node:8-webservice-onbuild 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Octoblu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Meshblu 2 | 3 | Meshblu is a cross-protocol IoT machine-to-machine instant messaging system. It is the core messaging system for Citrix's [Octoblu](https://octoblu.com) IoT platform. 4 | 5 | **Supported Protocols:** HTTP, Socket.io, Websocket, MQTT, CoAP, AMQP, and XMPP. 6 | 7 | ## Version 2.0 8 | 9 | We have completely re-written Meshblu into many small components or micro-services. This Meshblu 1.0 repository is being preserved for historical reference. 10 | 11 | All of the new Meshblu components are prefixed with `meshblu-core`. See a list [here](https://github.com/octoblu?utf8=%E2%9C%93&query=meshblu-core). 12 | 13 | Meshblu is dependent on `node.js`, `redis`, `mongodb`, and either `npm` or `yarn`. 14 | 15 | ### Production 16 | 17 | In order to run a barebones `meshblu-core` cluster, you'll need the following repositories. 18 | 19 | 1. [meshblu-core-dispatcher](https://github.com/octoblu/meshblu-core-dispatcher) 20 | 1. [meshblu-core-worker-webhook](https://github.com/octoblu/meshblu-core-worker-webhook) 21 | 1. [meshblu-core-protocol-adapter-http](https://github.com/octoblu/meshblu-core-protocol-adapter-http) 22 | 23 | All `meshblu-core` services and workers have a `Dockerfile`. 24 | 25 | A production Meshblu cluster will consist of many services and workers. We currently don't have documentation for running a complex cluster but we are working on it. 26 | 27 | ### Development 28 | 29 | For development use, you can run the bundled barebones cluster: 30 | 31 | #### Installation 32 | 33 | ```bash 34 | git clone https://github.com/octoblu/meshblu 35 | cd meshblu 36 | npm install 37 | ``` 38 | 39 | #### See Usage 40 | 41 | ```bash 42 | node command.js --help 43 | ``` 44 | 45 | #### Basic Example w/ env 46 | 47 | ```bash 48 | #!/bin/bash 49 | 50 | # For development usage only 51 | 52 | env \ 53 | PRIVATE_KEY_BASE64="..." \ 54 | PUBLIC_KEY_BASE64="..." \ 55 | PEPPER='some-random-string' \ 56 | MESHBLU_HTTP_PORT='3000' \ 57 | node command.js 58 | ``` 59 | 60 | See `./test-start.sh` 61 | 62 | #### Basic Example w/ args 63 | 64 | ```bash 65 | #!/bin/bash 66 | 67 | # For development usage only 68 | 69 | node command.js \ 70 | --private-key-base64 '...' \ 71 | --public-key-base64 '...' \ 72 | --pepper 'some-other-random-string' \ 73 | --meshblu-http-port 3000 74 | ``` 75 | 76 | #### Debug Mode 77 | 78 | It is normal not see any debug output by default. If you want to see debug output, use the environment `DEBUG=*`, or something more specific, like `DEBUG=meshblu*`. 79 | 80 | #### It's Alive! 81 | 82 | To verify that Meshblu 2.0 is alive and well, open [http://localhost:3000/status](http://localhost:3000/status) in a web browser or open a new terminal tab and run: 83 | 84 | ```` 85 | curl http://localhost:3000/status 86 | ```` 87 | You should see Meshblu 2.0 respond with: 88 | 89 | ```` 90 | {"meshblu":"online"} 91 | ```` 92 | 93 | You can register a new IoT device by running: 94 | 95 | ```` 96 | curl -X POST http://localhost:3000/devices 97 | ```` 98 | 99 | You should see Meshblu 2.0 respond with an authentication UUID and Token as well as the device's security whitelist settings like this: 100 | 101 | ```` 102 | { online: false, 103 | discoverWhitelist: [ '*' ], 104 | configureWhitelist: [ '*' ], 105 | sendWhitelist: [ '*' ], 106 | receiveWhitelist: [ '*' ], 107 | uuid: 'b112c941-7973-4e2b-8dbe-b7bba27ae199', 108 | meshblu: 109 | { createdAt: '2016-11-15T16:07:07.801Z', 110 | hash: 'Dy5NlIlmygrrnhp0Cln+zb77nHlYdobc+HwbRVzWdPs=' }, 111 | _id: '582b32ab67899618f48c2e1b', 112 | token: 'd5bcf1a57f4ccefa0ecdc672c7090e7949cc8244' } 113 | ```` 114 | 115 | #### Meshblu API Documentation 116 | 117 | Checkout our [developer docs](http://developer.octoblu.com) for more information on our HTTP REST API as well as documentation for all other protocol APIs, security whitelists and blacklists, connectors, data forwarders, and overall Meshblu architecture. 118 | 119 | 120 | #### Introducing the Meshblu CLI 121 | 122 | We have a convenient command line interface for simplifying the interaction with the Meshblu API. 123 | 124 | ```bash 125 | # Install the meshblu cli utility 126 | npm install --global meshblu-util 127 | # Register a device 128 | meshblu-util register -U http://localhost:3000 > meshblu.json 129 | # Fetch the device 130 | meshblu-util get 131 | # Update the device 132 | meshblu-util update -d '{"type": "some-device"}' 133 | # Fetch the updated device 134 | meshblu-util get 135 | ``` 136 | 137 | 138 | ## List of `meshblu-core` components 139 | 140 | ### Workers 141 | 142 | 1. [meshblu-core-dispatcher](https://github.com/octoblu/meshblu-core-dispatcher) 143 | 1. [meshblu-core-worker-webhook](https://github.com/octoblu/meshblu-core-worker-webhook) 144 | 145 | ### Protocol Adapters 146 | 147 | 1. [meshblu-core-protocol-adapter-socket.io](https://github.com/octoblu/meshblu-core-protocol-adapter-socket.io) 148 | 1. [meshblu-core-protocol-adapter-http](https://github.com/octoblu/meshblu-core-protocol-adapter-http) 149 | 1. [meshblu-core-protocol-adapter-xmpp](https://github.com/octoblu/meshblu-core-protocol-adapter-xmpp) 150 | 1. [meshblu-core-protocol-adapter-coap](https://github.com/octoblu/meshblu-core-protocol-adapter-coap) 151 | 1. [meshblu-core-protocol-adapter-mqtt](https://github.com/octoblu/meshblu-core-protocol-adapter-mqtt) 152 | 1. [meshblu-core-protocol-adapter-http-streaming](https://github.com/octoblu/meshblu-core-protocol-adapter-http-streaming) 153 | 154 | ### Firehoses 155 | 156 | 1. [meshblu-core-worker-firehose-amqp](https://github.com/octoblu/meshblu-core-worker-firehose-amqp) 157 | 1. [meshblu-core-firehose-socket.io](https://github.com/octoblu/meshblu-core-firehose-socket.io) 158 | 159 | ### Balancers 160 | 161 | 1. [meshblu-haproxy](https://github.com/octoblu/meshblu-haproxy) 162 | 1. [meshblu-balancer-http-streaming](https://github.com/octoblu/meshblu-balancer-http-streaming) 163 | 1. [meshblu-balancer-firehose-socket.io](https://github.com/octoblu/meshblu-balancer-firehose-socket.io) 164 | 1. [meshblu-balancer-xmpp](https://github.com/octoblu/meshblu-balancer-xmpp) 165 | 1. [meshblu-balancer-websocket](https://github.com/octoblu/meshblu-balancer-websocket) 166 | 1. [meshblu-balancer-mqtt](https://github.com/octoblu/meshblu-balancer-mqtt) 167 | 1. [meshblu-balancer-coap](https://github.com/octoblu/meshblu-balancer-coap) 168 | 1. [meshblu-balancer-socket.io](https://github.com/octoblu/meshblu-balancer-socket.io) 169 | 170 | ### Core Datastores 171 | 172 | 1. [meshblu-core-datastore](https://github.com/octoblu/meshblu-core-datastore) 173 | 1. [meshblu-core-cache](https://github.com/octoblu/meshblu-core-cache) 174 | 175 | ### Core Managers 176 | 177 | 1. [meshblu-core-manager-token](https://github.com/octoblu/meshblu-core-manager-token) 178 | 1. [meshblu-core-manager-device](https://github.com/octoblu/meshblu-core-manager-device) 179 | 1. [meshblu-core-manager-hydrant](https://github.com/octoblu/meshblu-core-manager-hydrant) 180 | 1. [meshblu-core-manager-whitelist](https://github.com/octoblu/meshblu-core-manager-whitelist) 181 | 1. [meshblu-core-manager-webhook](https://github.com/octoblu/meshblu-core-manager-webhook) 182 | 1. [meshblu-core-manager-subscription](https://github.com/octoblu/meshblu-core-manager-subscription) 183 | 1. [meshblu-core-manager-root-token](https://github.com/octoblu/meshblu-core-manager-root-token) 184 | 1. [meshblu-core-manager-messenger](https://github.com/octoblu/meshblu-core-manager-messenger) 185 | 186 | ### Core Tasks 187 | 188 | 1. [meshblu-core-task-black-list-token](https://github.com/octoblu/meshblu-core-task-black-list-token) 189 | 1. [meshblu-core-task-check-broadcast-received-whitelist](https://github.com/octoblu/meshblu-core-task-check-broadcast-received-whitelist) 190 | 1. [meshblu-core-task-check-broadcast-sent-whitelist](https://github.com/octoblu/meshblu-core-task-check-broadcast-sent-whitelist) 191 | 1. [meshblu-core-task-check-configure-as-whitelist](https://github.com/octoblu/meshblu-core-task-check-configure-as-whitelist) 192 | 1. [meshblu-core-task-check-configure-whitelist](https://github.com/octoblu/meshblu-core-task-check-configure-whitelist) 193 | 1. [meshblu-core-task-check-discover-as-whitelist](https://github.com/octoblu/meshblu-core-task-check-discover-as-whitelist) 194 | 1. [meshblu-core-task-check-discover-whitelist](https://github.com/octoblu/meshblu-core-task-check-discover-whitelist) 195 | 1. [meshblu-core-task-check-discoveras-whitelist](https://github.com/octoblu/meshblu-core-task-check-discoveras-whitelist) 196 | 1. [meshblu-core-task-check-forwarded-for](https://github.com/octoblu/meshblu-core-task-check-forwarded-for) 197 | 1. [meshblu-core-task-check-receive-as-whitelist](https://github.com/octoblu/meshblu-core-task-check-receive-as-whitelist) 198 | 1. [meshblu-core-task-check-receive-whitelist](https://github.com/octoblu/meshblu-core-task-check-receive-whitelist) 199 | 1. [meshblu-core-task-check-root-token](https://github.com/octoblu/meshblu-core-task-check-root-token) 200 | 1. [meshblu-core-task-check-send-as-whitelist](https://github.com/octoblu/meshblu-core-task-check-send-as-whitelist) 201 | 1. [meshblu-core-task-check-send-whitelist](https://github.com/octoblu/meshblu-core-task-check-send-whitelist) 202 | 1. [meshblu-core-task-check-token](https://github.com/octoblu/meshblu-core-task-check-token) 203 | 1. [meshblu-core-task-check-token-black-list](https://github.com/octoblu/meshblu-core-task-check-token-black-list) 204 | 1. [meshblu-core-task-check-token-cache](https://github.com/octoblu/meshblu-core-task-check-token-cache) 205 | 1. [meshblu-core-task-check-update-device-is-valid](https://github.com/octoblu/meshblu-core-task-check-update-device-is-valid) 206 | 1. [meshblu-core-task-check-whitelist-broadcast-as](https://github.com/octoblu/meshblu-core-task-check-whitelist-broadcast-as) 207 | 1. [meshblu-core-task-check-whitelist-broadcast-received](https://github.com/octoblu/meshblu-core-task-check-whitelist-broadcast-received) 208 | 1. [meshblu-core-task-check-whitelist-broadcast-sent](https://github.com/octoblu/meshblu-core-task-check-whitelist-broadcast-sent) 209 | 1. [meshblu-core-task-check-whitelist-configure-as](https://github.com/octoblu/meshblu-core-task-check-whitelist-configure-as) 210 | 1. [meshblu-core-task-check-whitelist-configure-received](https://github.com/octoblu/meshblu-core-task-check-whitelist-configure-received) 211 | 1. [meshblu-core-task-check-whitelist-configure-sent](https://github.com/octoblu/meshblu-core-task-check-whitelist-configure-sent) 212 | 1. [meshblu-core-task-check-whitelist-configure-update](https://github.com/octoblu/meshblu-core-task-check-whitelist-configure-update) 213 | 1. [meshblu-core-task-check-whitelist-discover-as](https://github.com/octoblu/meshblu-core-task-check-whitelist-discover-as) 214 | 1. [meshblu-core-task-check-whitelist-discover-view](https://github.com/octoblu/meshblu-core-task-check-whitelist-discover-view) 215 | 1. [meshblu-core-task-check-whitelist-message-as](https://github.com/octoblu/meshblu-core-task-check-whitelist-message-as) 216 | 1. [meshblu-core-task-check-whitelist-message-from](https://github.com/octoblu/meshblu-core-task-check-whitelist-message-from) 217 | 1. [meshblu-core-task-check-whitelist-message-received](https://github.com/octoblu/meshblu-core-task-check-whitelist-message-received) 218 | 1. [meshblu-core-task-check-whitelist-message-sent](https://github.com/octoblu/meshblu-core-task-check-whitelist-message-sent) 219 | 1. [meshblu-core-task-create-session-token](https://github.com/octoblu/meshblu-core-task-create-session-token) 220 | 1. [meshblu-core-task-create-subscription](https://github.com/octoblu/meshblu-core-task-create-subscription) 221 | 1. [meshblu-core-task-deliver-webhook](https://github.com/octoblu/meshblu-core-task-deliver-webhook) 222 | 1. [meshblu-core-task-enforce-message-rate-limit](https://github.com/octoblu/meshblu-core-task-enforce-message-rate-limit) 223 | 1. [meshblu-core-task-enqueue-deprecated-webhooks](https://github.com/octoblu/meshblu-core-task-enqueue-deprecated-webhooks) 224 | 1. [meshblu-core-task-enqueue-jobs-for-forward-broadcast-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-forward-broadcast-received) 225 | 1. [meshblu-core-task-enqueue-jobs-for-forward-configure-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-forward-configure-received) 226 | 1. [meshblu-core-task-enqueue-jobs-for-forward-unregister-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-forward-unregister-received) 227 | 1. [meshblu-core-task-enqueue-jobs-for-subscriptions-broadcast-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-subscriptions-broadcast-received) 228 | 1. [meshblu-core-task-enqueue-jobs-for-subscriptions-broadcast-sent](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-subscriptions-broadcast-sent) 229 | 1. [meshblu-core-task-enqueue-jobs-for-subscriptions-configure-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-subscriptions-configure-received) 230 | 1. [meshblu-core-task-enqueue-jobs-for-subscriptions-configure-sent](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-subscriptions-configure-sent) 231 | 1. [meshblu-core-task-enqueue-jobs-for-subscriptions-message-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-subscriptions-message-received) 232 | 1. [meshblu-core-task-enqueue-jobs-for-subscriptions-message-sent](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-subscriptions-message-sent) 233 | 1. [meshblu-core-task-enqueue-jobs-for-subscriptions-unregister-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-subscriptions-unregister-received) 234 | 1. [meshblu-core-task-enqueue-jobs-for-subscriptions-unregister-sent](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-subscriptions-unregister-sent) 235 | 1. [meshblu-core-task-enqueue-jobs-for-webhooks-broadcast-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-webhooks-broadcast-received) 236 | 1. [meshblu-core-task-enqueue-jobs-for-webhooks-broadcast-sent](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-webhooks-broadcast-sent) 237 | 1. [meshblu-core-task-enqueue-jobs-for-webhooks-configure-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-webhooks-configure-received) 238 | 1. [meshblu-core-task-enqueue-jobs-for-webhooks-configure-sent](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-webhooks-configure-sent) 239 | 1. [meshblu-core-task-enqueue-jobs-for-webhooks-message-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-webhooks-message-received) 240 | 1. [meshblu-core-task-enqueue-jobs-for-webhooks-message-sent](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-webhooks-message-sent) 241 | 1. [meshblu-core-task-enqueue-jobs-for-webhooks-unregister-received](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-webhooks-unregister-received) 242 | 1. [meshblu-core-task-enqueue-jobs-for-webhooks-unregister-sent](https://github.com/octoblu/meshblu-core-task-enqueue-jobs-for-webhooks-unregister-sent) 243 | 1. [meshblu-core-task-enqueue-webhooks](https://github.com/octoblu/meshblu-core-task-enqueue-webhooks) 244 | 1. [meshblu-core-task-find-and-update-device](https://github.com/octoblu/meshblu-core-task-find-and-update-device) 245 | 1. [meshblu-core-task-forbidden](https://github.com/octoblu/meshblu-core-task-forbidden) 246 | 1. [meshblu-core-task-get-authorized-subscription-types](https://github.com/octoblu/meshblu-core-task-get-authorized-subscription-types) 247 | 1. [meshblu-core-task-get-broadcast-subscription-types](https://github.com/octoblu/meshblu-core-task-get-broadcast-subscription-types) 248 | 1. [meshblu-core-task-get-device](https://github.com/octoblu/meshblu-core-task-get-device) 249 | 1. [meshblu-core-task-get-device-public-key](https://github.com/octoblu/meshblu-core-task-get-device-public-key) 250 | 1. [meshblu-core-task-get-global-public-key](https://github.com/octoblu/meshblu-core-task-get-global-public-key) 251 | 1. [meshblu-core-task-get-status](https://github.com/octoblu/meshblu-core-task-get-status) 252 | 1. [meshblu-core-task-get-subscriptions](https://github.com/octoblu/meshblu-core-task-get-subscriptions) 253 | 1. [meshblu-core-task-migrate-root-token](https://github.com/octoblu/meshblu-core-task-migrate-root-token) 254 | 1. [meshblu-core-task-no-content](https://github.com/octoblu/meshblu-core-task-no-content) 255 | 1. [meshblu-core-task-protect-your-as](https://github.com/octoblu/meshblu-core-task-protect-your-as) 256 | 1. [meshblu-core-task-publish-broadcast-received](https://github.com/octoblu/meshblu-core-task-publish-broadcast-received) 257 | 1. [meshblu-core-task-publish-configure-received](https://github.com/octoblu/meshblu-core-task-publish-configure-received) 258 | 1. [meshblu-core-task-publish-deprecated-subscriptions](https://github.com/octoblu/meshblu-core-task-publish-deprecated-subscriptions) 259 | 1. [meshblu-core-task-publish-message](https://github.com/octoblu/meshblu-core-task-publish-message) 260 | 1. [meshblu-core-task-publish-message-received](https://github.com/octoblu/meshblu-core-task-publish-message-received) 261 | 1. [meshblu-core-task-publish-subscriptions](https://github.com/octoblu/meshblu-core-task-publish-subscriptions) 262 | 1. [meshblu-core-task-publish-unregister-received](https://github.com/octoblu/meshblu-core-task-publish-unregister-received) 263 | 1. [meshblu-core-task-register-device](https://github.com/octoblu/meshblu-core-task-register-device) 264 | 1. [meshblu-core-task-reject-your-as](https://github.com/octoblu/meshblu-core-task-reject-your-as) 265 | 1. [meshblu-core-task-remove-device-cache](https://github.com/octoblu/meshblu-core-task-remove-device-cache) 266 | 1. [meshblu-core-task-remove-root-session-token](https://github.com/octoblu/meshblu-core-task-remove-root-session-token) 267 | 1. [meshblu-core-task-remove-subscription](https://github.com/octoblu/meshblu-core-task-remove-subscription) 268 | 1. [meshblu-core-task-remove-token-cache](https://github.com/octoblu/meshblu-core-task-remove-token-cache) 269 | 1. [meshblu-core-task-reset-token](https://github.com/octoblu/meshblu-core-task-reset-token) 270 | 1. [meshblu-core-task-revoke-all-tokens](https://github.com/octoblu/meshblu-core-task-revoke-all-tokens) 271 | 1. [meshblu-core-task-revoke-session-token](https://github.com/octoblu/meshblu-core-task-revoke-session-token) 272 | 1. [meshblu-core-task-revoke-token-by-query](https://github.com/octoblu/meshblu-core-task-revoke-token-by-query) 273 | 1. [meshblu-core-task-search-device](https://github.com/octoblu/meshblu-core-task-search-device) 274 | 1. [meshblu-core-task-search-token](https://github.com/octoblu/meshblu-core-task-search-token) 275 | 1. [meshblu-core-task-send-message](https://github.com/octoblu/meshblu-core-task-send-message) 276 | 1. [meshblu-core-task-send-message-2](https://github.com/octoblu/meshblu-core-task-send-message-2) 277 | 1. [meshblu-core-task-unregister-device](https://github.com/octoblu/meshblu-core-task-unregister-device) 278 | 1. [meshblu-core-task-update-device](https://github.com/octoblu/meshblu-core-task-update-device) 279 | 1. [meshblu-core-task-update-message-rate](https://github.com/octoblu/meshblu-core-task-update-message-rate) 280 | 281 | ### Clients 282 | 283 | 1. [node-meshblu-socket.io](https://github.com/octoblu/node-meshblu-socket.io) 284 | 1. [node-meshblu-firehose-socket.io](https://github.com/octoblu/node-meshblu-firehose-socket.io) 285 | 1. [node-meshblu-http](https://github.com/octoblu/node-meshblu-http) 286 | 1. [node-meshblu-websocket](https://github.com/octoblu/node-meshblu-websocket) 287 | 1. [node-meshblu-mqtt](https://github.com/octoblu/node-meshblu-mqtt) 288 | 1. [node-meshblu-xmpp](https://github.com/octoblu/node-meshblu-xmpp) 289 | 1. [node-meshblu-amqp](https://github.com/octoblu/node-meshblu-amqp) 290 | 1. [node-meshblu-coap](https://github.com/octoblu/node-meshblu-coap) 291 | 1. [browser-meshblu-http](https://github.com/octoblu/browser-meshblu-http) 292 | 1. [swift-meshblu-http](https://github.com/octoblu/swift-meshblu-http) 293 | 294 | ### Utilities 295 | 296 | 1. [meshblu-util](https://github.com/octoblu/meshblu-util) 297 | 298 | ## Legacy Meshblu 1.x 299 | 300 | View it [here](https://github.com/octoblu/meshblu/blob/legacy-meshblu/README.md) 301 | -------------------------------------------------------------------------------- /coffeelint.json: -------------------------------------------------------------------------------- 1 | { 2 | "arrow_spacing": { 3 | "level": "ignore" 4 | }, 5 | "braces_spacing": { 6 | "level": "ignore", 7 | "spaces": 0, 8 | "empty_object_spaces": 0 9 | }, 10 | "camel_case_classes": { 11 | "level": "error" 12 | }, 13 | "coffeescript_error": { 14 | "level": "error" 15 | }, 16 | "colon_assignment_spacing": { 17 | "level": "ignore", 18 | "spacing": { 19 | "left": 0, 20 | "right": 0 21 | } 22 | }, 23 | "cyclomatic_complexity": { 24 | "value": 10, 25 | "level": "warn" 26 | }, 27 | "duplicate_key": { 28 | "level": "error" 29 | }, 30 | "empty_constructor_needs_parens": { 31 | "level": "ignore" 32 | }, 33 | "ensure_comprehensions": { 34 | "level": "warn" 35 | }, 36 | "eol_last": { 37 | "level": "ignore" 38 | }, 39 | "indentation": { 40 | "value": 2, 41 | "level": "error" 42 | }, 43 | "line_endings": { 44 | "level": "ignore", 45 | "value": "unix" 46 | }, 47 | "max_line_length": { 48 | "value": 180, 49 | "level": "error", 50 | "limitComments": true 51 | }, 52 | "missing_fat_arrows": { 53 | "level": "ignore", 54 | "is_strict": false 55 | }, 56 | "newlines_after_classes": { 57 | "value": 3, 58 | "level": "ignore" 59 | }, 60 | "no_backticks": { 61 | "level": "error" 62 | }, 63 | "no_debugger": { 64 | "level": "warn", 65 | "console": false 66 | }, 67 | "no_empty_functions": { 68 | "level": "ignore" 69 | }, 70 | "no_empty_param_list": { 71 | "level": "ignore" 72 | }, 73 | "no_implicit_braces": { 74 | "level": "ignore", 75 | "strict": true 76 | }, 77 | "no_implicit_parens": { 78 | "strict": true, 79 | "level": "ignore" 80 | }, 81 | "no_interpolation_in_single_quotes": { 82 | "level": "ignore" 83 | }, 84 | "no_nested_string_interpolation": { 85 | "level": "warn" 86 | }, 87 | "no_plusplus": { 88 | "level": "ignore" 89 | }, 90 | "no_private_function_fat_arrows": { 91 | "level": "warn" 92 | }, 93 | "no_stand_alone_at": { 94 | "level": "ignore" 95 | }, 96 | "no_tabs": { 97 | "level": "error" 98 | }, 99 | "no_this": { 100 | "level": "ignore" 101 | }, 102 | "no_throwing_strings": { 103 | "level": "error" 104 | }, 105 | "no_trailing_semicolons": { 106 | "level": "error" 107 | }, 108 | "no_trailing_whitespace": { 109 | "level": "error", 110 | "allowed_in_comments": false, 111 | "allowed_in_empty_lines": true 112 | }, 113 | "no_unnecessary_double_quotes": { 114 | "level": "ignore" 115 | }, 116 | "no_unnecessary_fat_arrows": { 117 | "level": "ignore" 118 | }, 119 | "non_empty_constructor_needs_parens": { 120 | "level": "ignore" 121 | }, 122 | "prefer_english_operator": { 123 | "level": "ignore", 124 | "doubleNotLevel": "ignore" 125 | }, 126 | "space_operators": { 127 | "level": "ignore" 128 | }, 129 | "spacing_after_comma": { 130 | "level": "ignore" 131 | }, 132 | "transform_messes_up_line_numbers": { 133 | "level": "warn" 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /command.coffee: -------------------------------------------------------------------------------- 1 | dashdash = require 'dashdash' 2 | UUID = require 'uuid' 3 | MeshbluCoreRunner = require './src/meshblu-core-runner' 4 | packageJSON = require './package.json' 5 | SigtermHandler = require 'sigterm-handler' 6 | 7 | options = [ 8 | { 9 | name: 'version' 10 | type: 'bool' 11 | help: 'Print tool version and exit.' 12 | } 13 | { 14 | names: ['help', 'h'] 15 | type: 'bool' 16 | help: 'Print this help and exit.' 17 | } 18 | { 19 | names: ['test-start'] 20 | type: 'bool' 21 | help: 'Verify start and then die. (used for testing)' 22 | } 23 | { 24 | names: ['namespace', 'n'] 25 | type: 'string' 26 | help: 'request/response queue namespace' 27 | default: 'meshblu' 28 | env: 'NAMESPACE' 29 | } 30 | { 31 | names: ['request-queue-name'] 32 | type: 'string' 33 | help: 'request queue namespace' 34 | default: 'v2:request:queue' 35 | env: 'REQUEST_QUEUE_NAME' 36 | } 37 | { 38 | names: ['response-queue-base-name'] 39 | type: 'string' 40 | help: 'response queue base namespace' 41 | default: 'v2:response:queue' 42 | env: 'RESPONSE_QUEUE_BASE_NAME' 43 | } 44 | { 45 | names: ['single-run', 's'] 46 | type: 'bool' 47 | help: 'perform only one job, then exit' 48 | } 49 | { 50 | names: ['timeout', 't'] 51 | type: 'positiveInteger' 52 | help: 'seconds to wait for the next job' 53 | default: 15 54 | } 55 | { 56 | names: ['concurrency', 'c'] 57 | type: 'positiveInteger' 58 | help: 'number of concurrent jobs to process' 59 | default: 3 60 | env: 'CONCURRENCY' 61 | } 62 | { 63 | name: 'redis-uri' 64 | type: 'string' 65 | help: 'URI for Redis' 66 | env: 'REDIS_URI', 67 | default: 'redis://localhost:6379' 68 | } 69 | { 70 | name: 'cache-redis-uri' 71 | type: 'string' 72 | help: 'Cache URI for Redis' 73 | env: 'CACHE_REDIS_URI', 74 | default: 'redis://localhost:6379' 75 | } 76 | { 77 | name: 'firehose-redis-uri' 78 | type: 'string' 79 | help: 'URI for Firehose redis' 80 | env: 'FIREHOSE_REDIS_URI' 81 | default: 'redis://localhost:6379' 82 | } 83 | { 84 | name: 'firehose-port' 85 | type: 'number' 86 | help: 'Port for firehose service' 87 | env: 'FIREHOSE_PORT' 88 | default: 3080 89 | } 90 | { 91 | name: 'disable-firehose' 92 | type: 'bool' 93 | help: 'Flag to disabled firehose' 94 | env: 'FIREHOSE_DISABLED' 95 | default: false 96 | } 97 | { 98 | name: 'firehose-namespace' 99 | type: 'string' 100 | help: 'Namespace for firehose' 101 | env: 'FIREHOSE_HOSE' 102 | default: 'messages' 103 | } 104 | { 105 | name: 'mongodb-uri' 106 | type: 'string' 107 | help: 'URI for MongoDB' 108 | env: 'MONGODB_URI' 109 | default: 'mongodb://localhost:27017/meshblu-test' 110 | } 111 | { 112 | name: 'pepper' 113 | type: 'string' 114 | help: 'Pepper for encryption' 115 | env: 'PEPPER' 116 | } 117 | { 118 | name: 'alias-server-uri' 119 | type: 'string' 120 | help: 'URI for alias server' 121 | env: 'ALIAS_SERVER_URI' 122 | } 123 | { 124 | name: 'worker-name' 125 | type: 'string' 126 | help: 'name of this worker' 127 | env: 'WORKER_NAME' 128 | } 129 | { 130 | name: 'job-log-redis-uri' 131 | type: 'string' 132 | help: 'URI for job log Redis' 133 | env: 'JOB_LOG_REDIS_URI' 134 | default: 'redis://localhost:6379' 135 | } 136 | { 137 | name: 'job-log-queue' 138 | type: 'string' 139 | help: 'Job log queue name' 140 | env: 'JOB_LOG_QUEUE' 141 | default: 'meshblu-core-log' 142 | } 143 | { 144 | name: 'job-log-sample-rate' 145 | type: 'number' 146 | help: 'Job log sample rate (0.00 to 1.00)' 147 | env: 'JOB_LOG_SAMPLE_RATE' 148 | default: '0.00' 149 | } 150 | { 151 | name: 'job-timeout-seconds' 152 | type: 'positiveInteger' 153 | help: 'Timeout for job execution' 154 | env: 'JOB_TIMEOUT_SECONDS', 155 | default: 30 156 | } 157 | { 158 | name: 'max-connections' 159 | type: 'positiveInteger' 160 | help: 'Max number of redis connections of the http protocol' 161 | env: 'CONNECTION_POOL_MAX_CONNECTIONS', 162 | default: 50 163 | } 164 | { 165 | name: 'meshblu-http-port' 166 | type: 'positiveInteger' 167 | help: 'Port to listen on for HTTP' 168 | env: 'MESHBLU_HTTP_PORT', 169 | default: 80 170 | } 171 | { 172 | name: 'private-key-base64' 173 | type: 'string' 174 | help: 'Base64-encoded private key' 175 | env: 'PRIVATE_KEY_BASE64' 176 | } 177 | { 178 | name: 'public-key-base64' 179 | type: 'string' 180 | help: 'Base64-encoded public key' 181 | env: 'PUBLIC_KEY_BASE64' 182 | } 183 | { 184 | name: 'webhook-queue-name' 185 | type: 'string' 186 | env: 'WEBHOOK_QUEUE_NAME' 187 | default: 'webhooks' 188 | help: 'Name of Redis webhook work queue' 189 | }, 190 | { 191 | name: 'webhook-queue-timeout' 192 | type: 'positiveInteger' 193 | env: 'WEBHOOK_QUEUE_TIMEOUT' 194 | default: 30 195 | help: 'BRPOP timeout (in seconds) for webhooks' 196 | }, 197 | { 198 | name: 'webhook-request-timeout' 199 | type: 'positiveInteger' 200 | env: 'WEBHOOK_REQUEST_TIMEOUT' 201 | default: 5 202 | help: 'Request timeout (in seconds) for webhooks' 203 | }, 204 | { 205 | name: 'webhook-namespace' 206 | type: 'string' 207 | env: 'WEBHOOK_NAMESPACE' 208 | default: 'meshblu-webhooks' 209 | help: 'Redis namespace for webhooks' 210 | }, 211 | { 212 | name: 'disable-webhook-worker' 213 | type: 'bool' 214 | env: 'DISABLE_WEBHOOK_WORKER' 215 | default: false 216 | help: 'option for disabling webhook worker.' 217 | } 218 | ] 219 | 220 | parser = dashdash.createParser(options: options) 221 | try 222 | opts = parser.parse(process.argv) 223 | catch error 224 | console.error 'meshblu: error: %s', error.message 225 | process.exit 1 226 | 227 | if opts.version 228 | console.log "meshblu v#{packageJSON.version}" 229 | process.exit 0 230 | 231 | if opts.help 232 | help = parser.help({includeEnv: true, includeDefaults: true}).trimRight() 233 | console.log 'usage: node command.js [OPTIONS]\n' + 'options:\n' + help 234 | process.exit 0 235 | 236 | if opts.private_key_base64? 237 | privateKey = new Buffer(opts.private_key_base64, 'base64').toString('utf8') 238 | 239 | if opts.public_key_base64? 240 | publicKey = new Buffer(opts.public_key_base64, 'base64').toString('utf8') 241 | 242 | meshbluConfig = 243 | hostname: 'localhost' 244 | port: opts.meshblu_http_port 245 | protocol: 'http' 246 | 247 | opts.pepper ||= process.env.TOKEN 248 | 249 | options = { 250 | dispatcherWorker: 251 | namespace: opts.namespace 252 | requestQueueName: opts.request_queue_name 253 | timeoutSeconds: opts.timeout 254 | redisUri: opts.redis_uri 255 | cacheRedisUri: opts.cache_redis_uri 256 | firehoseRedisUri: opts.firehose_redis_uri 257 | mongoDBUri: opts.mongodb_uri 258 | pepper: opts.pepper 259 | workerName: opts.worker_name 260 | aliasServerUri: opts.alias_server_uri 261 | jobLogRedisUri: opts.job_log_redis_uri 262 | jobLogQueue: opts.job_log_queue 263 | jobLogSampleRate: opts.job_log_sample_rate 264 | privateKey: privateKey 265 | publicKey: publicKey 266 | singleRun: opts.single_run 267 | concurrency: opts.concurrency 268 | meshbluHttp: 269 | redisUri: opts.redis_uri 270 | cacheRedisUri: opts.cache_redis_uri 271 | requestQueueName: opts.request_queue_name 272 | responseQueueName: "#{opts.responseQueueBaseName}:#{UUID.v1()}" 273 | responseQueueBaseName: opts.response_queue_base_name 274 | namespace: opts.namespace 275 | jobLogRedisUri: opts.job_log_redis_uri 276 | jobLogQueue: opts.job_log_queue 277 | jobLogSampleRate: opts.job_log_sample_rate 278 | jobTimeoutSeconds: opts.job_timeout_seconds 279 | maxConnections: opts.max_connections 280 | port: opts.meshblu_http_port 281 | webhookWorker: 282 | disable: opts.disable_webhook_worker 283 | namespace: opts.webhook_namespace 284 | redisUri: opts.redis_uri 285 | queueName: opts.webhook_queue_name 286 | queueTimeout: opts.webhook_queue_timeout 287 | requestTimeout: opts.webhook_request_timeout 288 | jobLogRedisUri: opts.job_log_redis_uri 289 | jobLogQueue: opts.job_log_queue 290 | jobLogSampleRate: opts.job_log_sample_rate 291 | privateKey: privateKey 292 | meshbluConfig: meshbluConfig 293 | meshbluFirehose: 294 | disable: opts.disable_firehose 295 | namespace: opts.firehose_namespace 296 | redisUri: opts.redis_uri 297 | firehoseRedisUri: opts.firehose_redis_uri 298 | port: opts.firehose_port 299 | meshbluConfig: meshbluConfig 300 | } 301 | 302 | meshbluCoreRunner = new MeshbluCoreRunner options 303 | 304 | sigtermHandler = new SigtermHandler({ events: ['SIGTERM', 'SIGINT'] }) 305 | sigtermHandler.register meshbluCoreRunner.stop 306 | 307 | meshbluCoreRunner.catchErrors() 308 | meshbluCoreRunner.on 'error', (error) -> throw error 309 | meshbluCoreRunner.prepare (error) => 310 | if error 311 | meshbluCoreRunner.reportError error 312 | console.error error.stack 313 | process.exit 1 314 | 315 | meshbluCoreRunner.run (error) => 316 | if error 317 | meshbluCoreRunner.reportError error 318 | console.error error.stack 319 | process.exit 1 320 | if opts.test_start 321 | return process.exit(0) 322 | -------------------------------------------------------------------------------- /command.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('coffee-script/register'); 4 | require('./command.coffee'); 5 | -------------------------------------------------------------------------------- /docs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/.DS_Store -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /docs/css/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/css/.DS_Store -------------------------------------------------------------------------------- /docs/device-mockups/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/device-mockups/.DS_Store -------------------------------------------------------------------------------- /docs/device-mockups/device-mockups.min.css: -------------------------------------------------------------------------------- 1 | .device-mockup{position:relative;width:100%;padding-bottom:61.775701%}.device-mockup>.device{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;background-size:100% 100%;background-repeat:no-repeat;background-image:url(macbook/macbook.png)}.device-mockup>.device>.screen{position:absolute;top:11.0438729%;bottom:14.6747352%;left:13.364486%;right:13.364486%;overflow:hidden}.device-mockup>.device>.button{position:absolute;top:0;left:0;display:none;overflow:hidden;border-radius:100%;-webkit-border-radius:100%;-moz-border-radius:100%;cursor:pointer}.device-mockup.imac{padding-bottom:81.230769%}.device-mockup.imac>.device{background-image:url(imac/imac.png)}.device-mockup.imac>.device>.screen{top:8.20707071%;bottom:31.6919192%;left:6.61538462%;right:6.61538462%}.device-mockup.macbook{padding-bottom:61.775701%}.device-mockup.macbook>.device{background-image:url(macbook/macbook.png)}.device-mockup.macbook>.device>.screen{top:11.0438729%;bottom:14.6747352%;left:13.364486%;right:13.364486%}.device-mockup.macbook_2015{padding-bottom:57.5%}.device-mockup.macbook_2015.grey>.device,.device-mockup.macbook_2015>.device{background-image:url(macbook_2015/grey.png)}.device-mockup.macbook_2015.silver>.device,.device-mockup.macbook_2015>.device{background-image:url(macbook_2015/silver.png)}.device-mockup.macbook_2015.gold>.device,.device-mockup.macbook_2015>.device{background-image:url(macbook_2015/gold.png)}.device-mockup.macbook_2015>.device>.screen{top:7.5%;bottom:10.9%;left:12.46%;right:12.56%}.device-mockup.iphone5,.device-mockup.iphone5.portrait{padding-bottom:210.57%}.device-mockup.iphone5.landscape{padding-bottom:47.49%}.device-mockup.iphone5.black>.device,.device-mockup.iphone5.portrait.black>.device,.device-mockup.iphone5>.device{background-image:url(iphone5/iphone5_port_black.png)}.device-mockup.iphone5.landscape.black>.device,.device-mockup.iphone5.landscape>.device{background-image:url(iphone5/iphone5_land_black.png)}.device-mockup.iphone5.portrait.white>.device,.device-mockup.iphone5.white>.device{background-image:url(iphone5/iphone5_port_white.png)}.device-mockup.iphone5.landscape.white>.device{background-image:url(iphone5/iphone5_land_white.png)}.device-mockup.iphone5.portrait>.device>.screen,.device-mockup.iphone5>.device>.screen{top:14.78%;bottom:13.78%;left:8.77%;right:7.77%}.device-mockup.iphone5.landscape>.device>.screen{top:7.422488%;bottom:8.422488%;left:14.919127%;right:14.019127%}.device-mockup.iphone5.portrait>.device>.button,.device-mockup.iphone5>.device>.button{display:block;top:88.3%;bottom:2.5%;left:40%;right:40%}.device-mockup.iphone5.landscape>.device>.button{display:block;top:40%;bottom:41%;left:88.4%;right:2.3%}.device-mockup.iphone_se,.device-mockup.iphone_se.portrait{padding-bottom:209.83%}.device-mockup.iphone_se.landscape{padding-bottom:47.66%}.device-mockup.iphone_se.black>.device,.device-mockup.iphone_se.portrait.black>.device,.device-mockup.iphone_se>.device{background-image:url(iphone_se/iphone_se_port_black.png)}.device-mockup.iphone_se.landscape.black>.device,.device-mockup.iphone_se.landscape>.device{background-image:url(iphone_se/iphone_se_land_black.png)}.device-mockup.iphone_se.portrait.white>.device,.device-mockup.iphone_se.white>.device{background-image:url(iphone_se/iphone_se_port_white.png)}.device-mockup.iphone_se.landscape.white>.device{background-image:url(iphone_se/iphone_se_land_white.png)}.device-mockup.iphone_se.gold>.device,.device-mockup.iphone_se.portrait.gold>.device{background-image:url(iphone_se/iphone_se_port_gold.png)}.device-mockup.iphone_se.landscape.gold>.device{background-image:url(iphone_se/iphone_se_land_gold.png)}.device-mockup.iphone_se.portrait.rose>.device,.device-mockup.iphone_se.rose>.device{background-image:url(iphone_se/iphone_se_port_rose.png)}.device-mockup.iphone_se.landscape.rose>.device{background-image:url(iphone_se/iphone_se_land_rose.png)}.device-mockup.iphone_se.portrait>.device>.screen,.device-mockup.iphone_se>.device>.screen{top:16.28%;bottom:16.28%;left:11.77%;right:11.77%}.device-mockup.iphone_se.landscape>.device>.screen{top:11.722488%;bottom:11.722488%;left:16.0191273%;right:16.0191273%}.device-mockup.iphone_se.portrait>.device>.button,.device-mockup.iphone_se>.device>.button{display:block;top:86.3%;bottom:5.5%;left:42%;right:42%}.device-mockup.iphone_se.landscape>.device>.button{display:block;top:42%;bottom:42%;left:86.4%;right:5.1%}.device-mockup.iphone6,.device-mockup.iphone6.portrait{padding-bottom:207.19%}.device-mockup.iphone6.landscape{padding-bottom:48.76%}.device-mockup.iphone6.black>.device,.device-mockup.iphone6.portrait.black>.device,.device-mockup.iphone6>.device{background-image:url(iphone_6/iphone_6_port_black.png)}.device-mockup.iphone6.landscape.black>.device,.device-mockup.iphone6.landscape>.device{background-image:url(iphone_6/iphone_6_land_black.png)}.device-mockup.iphone6.portrait.white>.device,.device-mockup.iphone6.white>.device{background-image:url(iphone_6/iphone_6_port_white.png)}.device-mockup.iphone6.landscape.white>.device{background-image:url(iphone_6/iphone_6_land_white.png)}.device-mockup.iphone6.gold>.device,.device-mockup.iphone6.portrait.gold>.device{background-image:url(iphone_6/iphone_6_port_gold.png)}.device-mockup.iphone6.landscape.gold>.device{background-image:url(iphone_6/iphone_6_land_gold.png)}.device-mockup.iphone6.portrait>.device>.screen,.device-mockup.iphone6>.device>.screen{top:12.58%;bottom:12.88%;left:6.77%;right:6.77%}.device-mockup.iphone6.landscape>.device>.screen{top:6.77%;bottom:6.77%;left:12.58%;right:12.88%}.device-mockup.iphone6.portrait>.device>.button,.device-mockup.iphone6>.device>.button{display:block;top:88.6%;bottom:3.2%;left:42%;right:42%}.device-mockup.iphone6.landscape>.device>.button{display:block;top:42%;bottom:42%;left:88.6%;right:3.2%}.device-mockup.iphone6_plus,.device-mockup.iphone6_plus.portrait{padding-bottom:201.76%}.device-mockup.iphone6_plus.landscape{padding-bottom:49.56%}.device-mockup.iphone6_plus.black>.device,.device-mockup.iphone6_plus.portrait.black>.device,.device-mockup.iphone6_plus>.device{background-image:url(iphone_6_plus/iphone_6_plus_black_port.png)}.device-mockup.iphone6_plus.landscape.black>.device,.device-mockup.iphone6_plus.landscape>.device{background-image:url(iphone_6_plus/iphone_6_plus_black_land.png)}.device-mockup.iphone6_plus.portrait.white>.device,.device-mockup.iphone6_plus.white>.device{background-image:url(iphone_6_plus/iphone_6_plus_white_port.png)}.device-mockup.iphone6_plus.landscape.white>.device{background-image:url(iphone_6_plus/iphone_6_plus_white_land.png)}.device-mockup.iphone6_plus.gold>.device,.device-mockup.iphone6_plus.portrait.gold>.device{background-image:url(iphone_6_plus/iphone_6_plus_gold_port.png)}.device-mockup.iphone6_plus.landscape.gold>.device{background-image:url(iphone_6_plus/iphone_6_plus_gold_land.png)}.device-mockup.iphone6_plus.portrait>.device>.screen,.device-mockup.iphone6_plus>.device>.screen{top:11.58%;bottom:11.58%;left:5.97%;right:5.97%}.device-mockup.iphone6_plus.landscape>.device>.screen{top:5.97%;bottom:5.97%;left:11.38%;right:11.58%}.device-mockup.iphone6_plus.portrait>.device>.button,.device-mockup.iphone6_plus>.device>.button{display:block;top:89.9%;bottom:3.2%;left:43%;right:43%}.device-mockup.iphone6_plus.landscape>.device>.button{display:block;top:43%;bottom:43%;left:89.9%;right:3.2%}.device-mockup.ipad,.device-mockup.ipad.portrait{padding-bottom:128.406276%}.device-mockup.ipad.landscape{padding-bottom:79.9086758%}.device-mockup.ipad.black>.device,.device-mockup.ipad.portrait.black>.device,.device-mockup.ipad>.device{background-image:url(ipad/ipad_port_black.png)}.device-mockup.ipad.portrait.white>.device,.device-mockup.ipad.white>.device{background-image:url(ipad/ipad_port_white.png)}.device-mockup.ipad.landscape.black>.device,.device-mockup.ipad.landscape>.device{background-image:url(ipad/ipad_land_black.png)}.device-mockup.ipad.landscape.white>.device{background-image:url(ipad/ipad_land_white.png)}.device-mockup.ipad.portrait>.device>.screen,.device-mockup.ipad>.device>.screen{top:12.025723%;bottom:12.154341%;left:13.45995%;right:13.45995%}.device-mockup.ipad.landscape>.device>.screen{top:13.87755102%;bottom:13.87755102%;left:11.5459883%;right:11.5459883%}.device-mockup.ipad.portrait>.device>.button,.device-mockup.ipad>.device>.button{display:block;top:90.2%;bottom:5.5%;left:47.3%;right:47.3%}.device-mockup.ipad.landscape>.device>.button{display:block;top:47.3%;bottom:47.3%;left:90.8%;right:4.9%}.device-mockup.ipad_air,.device-mockup.ipad_air.portrait{padding-bottom:141.27%}.device-mockup.ipad_air.landscape{padding-bottom:70.79%}.device-mockup.ipad_air.grey>.device,.device-mockup.ipad_air.portrait.grey>.device,.device-mockup.ipad_air>.device{background-image:url(ipad_air/ipad_air_gray_port.png)}.device-mockup.ipad_air.portrait.silver>.device,.device-mockup.ipad_air.silver>.device{background-image:url(ipad_air/ipad_air_silver_port.png)}.device-mockup.ipad_air.landscape.grey>.device,.device-mockup.ipad_air.landscape>.device{background-image:url(ipad_air/ipad_air_gray_land.png)}.device-mockup.ipad_air.landscape.silver>.device{background-image:url(ipad_air/ipad_air_silver_land.png)}.device-mockup.ipad_air.portrait>.device>.screen,.device-mockup.ipad_air>.device>.screen{top:9.025723%;bottom:9.154341%;left:7.45995%;right:6.45995%}.device-mockup.ipad_air.landscape>.device>.screen{top:6.877551%;bottom:6.877551%;left:9.545988%;right:9.545988%}.device-mockup.ipad_air.portrait>.device>.button,.device-mockup.ipad_air>.device>.button{display:block;top:93.2%;bottom:2.5%;left:47.3%;right:47.3%}.device-mockup.ipad_air.landscape>.device>.button{display:block;top:47.3%;bottom:47.3%;left:93.1%;right:2.1%}.device-mockup.ipad_air_2,.device-mockup.ipad_air_2.portrait{padding-bottom:141.38%}.device-mockup.ipad_air_2.landscape{padding-bottom:70.73%}.device-mockup.ipad_air_2.grey>.device,.device-mockup.ipad_air_2.portrait.grey>.device,.device-mockup.ipad_air_2>.device{background-image:url(ipad_air_2/ipad_air_2_gray_port.png)}.device-mockup.ipad_air_2.portrait.silver>.device,.device-mockup.ipad_air_2.silver>.device{background-image:url(ipad_air_2/ipad_air_2_silver_port.png)}.device-mockup.ipad_air_2.gold>.device,.device-mockup.ipad_air_2.portrait.gold>.device{background-image:url(ipad_air_2/ipad_air_2_gold_port.png)}.device-mockup.ipad_air_2.landscape.grey>.device,.device-mockup.ipad_air_2.landscape>.device{background-image:url(ipad_air_2/ipad_air_2_gray_land.png)}.device-mockup.ipad_air_2.landscape.silver>.device{background-image:url(ipad_air_2/ipad_air_2_silver_land.png)}.device-mockup.ipad_air_2.landscape.gold>.device{background-image:url(ipad_air_2/ipad_air_2_gold_land.png)}.device-mockup.ipad_air_2.portrait>.device>.screen,.device-mockup.ipad_air_2>.device>.screen{top:9.025723%;bottom:8.854341%;left:6.15995%;right:6.15995%}.device-mockup.ipad_air_2.landscape>.device>.screen{top:6.277551%;bottom:6.277551%;left:8.545988%;right:8.545988%}.device-mockup.ipad_air_2.portrait>.device>.button,.device-mockup.ipad_air_2>.device>.button{display:block;top:93.2%;bottom:2.1%;left:46.3%;right:46.5%}.device-mockup.ipad_air_2.landscape>.device>.button{display:block;top:46.5%;bottom:46.8%;left:93.5%;right:1.9%}.device-mockup.ipad_pro,.device-mockup.ipad_pro.portrait{padding-bottom:138.63%}.device-mockup.ipad_pro.landscape{padding-bottom:72.14%}.device-mockup.ipad_pro.grey>.device,.device-mockup.ipad_pro.portrait.grey>.device,.device-mockup.ipad_pro>.device{background-image:url(ipad_pro/ipad_pro_port_black.png)}.device-mockup.ipad_pro.portrait.silver>.device,.device-mockup.ipad_pro.silver>.device{background-image:url(ipad_pro/ipad_pro_port_silver.png)}.device-mockup.ipad_pro.gold>.device,.device-mockup.ipad_pro.portrait.gold>.device{background-image:url(ipad_pro/ipad_pro_port_gold.png)}.device-mockup.ipad_pro.landscape.grey>.device,.device-mockup.ipad_pro.landscape>.device{background-image:url(ipad_pro/ipad_pro_land_black.png)}.device-mockup.ipad_pro.landscape.silver>.device{background-image:url(ipad_pro/ipad_pro_land_silver.png)}.device-mockup.ipad_pro.landscape.gold>.device{background-image:url(ipad_pro/ipad_pro_land_gold.png)}.device-mockup.ipad_pro.portrait>.device>.screen,.device-mockup.ipad_pro>.device>.screen{top:7.025723%;bottom:6.854341%;left:5.15995%;right:5.15995%}.device-mockup.ipad_pro.landscape>.device>.screen{top:5.177551%;bottom:5.177551%;left:6.945988%;right:6.945988%}.device-mockup.ipad_pro.portrait>.device>.button,.device-mockup.ipad_pro>.device>.button{display:block;top:94.9%;bottom:1.5%;left:47.3%;right:47.1%}.device-mockup.ipad_pro.landscape>.device>.button{display:block;top:47.5%;bottom:47.5%;left:94.8%;right:1.5%}.device-mockup.galaxy_s3,.device-mockup.galaxy_s3.portrait{padding-bottom:178.787879%}.device-mockup.galaxy_s3.landscape{padding-bottom:55.9322034%}.device-mockup.galaxy_s3.black>.device,.device-mockup.galaxy_s3.portrait.black>.device,.device-mockup.galaxy_s3>.device{background-image:url(galaxy_s3/s3_port_black.png)}.device-mockup.galaxy_s3.landscape.black>.device,.device-mockup.galaxy_s3.landscape>.device{background-image:url(galaxy_s3/s3_land_black.png)}.device-mockup.galaxy_s3.portrait.white>.device,.device-mockup.galaxy_s3.white>.device{background-image:url(galaxy_s3/s3_port_white.png)}.device-mockup.galaxy_s3.landscape.white>.device{background-image:url(galaxy_s3/s3_land_white.png)}.device-mockup.galaxy_s3.portrait>.device>.screen,.device-mockup.galaxy_s3>.device>.screen{top:12.3728814%;bottom:15.5367232%;left:13.8383838%;right:13.8383838%}.device-mockup.galaxy_s3.landscape>.device>.screen{top:13.8383838%;bottom:13.8383838%;left:12.3728814%;right:15.5367232%}.device-mockup.galaxy_s5,.device-mockup.galaxy_s5.portrait{padding-bottom:194.188862%}.device-mockup.galaxy_s5.landscape{padding-bottom:51.496259%}.device-mockup.galaxy_s5.black>.device,.device-mockup.galaxy_s5.portrait.black>.device,.device-mockup.galaxy_s5>.device{background-image:url(galaxy_s5/galaxy_s5_port_black.png)}.device-mockup.galaxy_s5.landscape.black>.device,.device-mockup.galaxy_s5.landscape>.device{background-image:url(galaxy_s5/galaxy_s5_land_black.png)}.device-mockup.galaxy_s5.portrait.white>.device,.device-mockup.galaxy_s5.white>.device{background-image:url(galaxy_s5/galaxy_s5_port_white.png)}.device-mockup.galaxy_s5.landscape.white>.device{background-image:url(galaxy_s5/galaxy_s5_land_white.png)}.device-mockup.galaxy_s5.portrait>.device>.screen,.device-mockup.galaxy_s5>.device>.screen{top:10.2%;bottom:10.1%;left:6.3%;right:6.4%}.device-mockup.galaxy_s5.landscape>.device>.screen{top:6.6%;bottom:6.2%;left:10.15%;right:10%}.device-mockup.galaxy_tab4,.device-mockup.galaxy_tab4.landscape{padding-bottom:72.689464%}.device-mockup.galaxy_tab4.black>.device,.device-mockup.galaxy_tab4.landscape.black>.device,.device-mockup.galaxy_tab4>.device{background-image:url(galaxy_tab4/galaxy_tab4_land_black.png)}.device-mockup.galaxy_tab4.landscape.white>.device,.device-mockup.galaxy_tab4.white>.device{background-image:url(galaxy_tab4/galaxy_tab4_land_white.png)}.device-mockup.galaxy_tab4.landscape>.device>.screen,.device-mockup.galaxy_tab4>.device>.screen{top:11.5%;bottom:11.5%;left:5.4%;right:5.2%}.device-mockup.lumia920,.device-mockup.lumia920.portrait{padding-bottom:172.796353%}.device-mockup.lumia920.landscape{padding-bottom:56.3330381%}.device-mockup.lumia920.portrait>.device,.device-mockup.lumia920>.device{background-image:url(lumia920/lumia920_port.png)}.device-mockup.lumia920.landscape>.device{background-image:url(lumia920/lumia920_land.png)}.device-mockup.lumia920.portrait>.device>.screen,.device-mockup.lumia920>.device>.screen{top:10.6420405%;bottom:18.9973615%;left:13.5258359%;right:13.5258359%}.device-mockup.lumia920.landscape>.device>.screen{top:12.2641509%;bottom:12.2641509%;left:10.5403012%;right:18.6005314%}.device-mockup.nexus7,.device-mockup.nexus7.portrait{padding-bottom:156.521739%}.device-mockup.nexus7.landscape{padding-bottom:63.6678201%}.device-mockup.nexus7.portrait>.device,.device-mockup.nexus7>.device{background-image:url(nexus7/nexus7_port.png)}.device-mockup.nexus7.landscape>.device{background-image:url(nexus7/nexus7_land.png)}.device-mockup.nexus7.portrait>.device>.screen,.device-mockup.nexus7>.device>.screen{top:13.1365741%;bottom:12.7893519%;left:13.7681159%;right:13.7681159%}.device-mockup.nexus7.landscape>.device>.screen{top:13.7681159%;bottom:13.7681159%;left:13.0911188%;right:13.0911188%}.device-mockup.surface,.device-mockup.surface.landscape{padding-bottom:64.7584973%}.device-mockup.surface.landscape>.device,.device-mockup.surface>.device{background-image:url(surface/surface.png)}.device-mockup.surface.landscape>.device>.screen,.device-mockup.surface>.device>.screen{top:14.5488029%;bottom:14.9171271%;left:9.36195587%;right:9.36195587%}.device-mockup.samsung_tv,.device-mockup.samsung_tv.landscape{padding-bottom:64.68%}.device-mockup.samsung_tv.landscape>.device,.device-mockup.samsung_tv>.device{background-image:url(samsung_tv/samsung_tv.png)}.device-mockup.samsung_tv.landscape>.device>.screen,.device-mockup.samsung_tv>.device>.screen{top:2.148803%;bottom:12.817127%;left:1.261956%;right:1.361956%} -------------------------------------------------------------------------------- /docs/device-mockups/macbook/macbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/device-mockups/macbook/macbook.png -------------------------------------------------------------------------------- /docs/img/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/.DS_Store -------------------------------------------------------------------------------- /docs/img/300x300spiral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/300x300spiral.png -------------------------------------------------------------------------------- /docs/img/battlebot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/battlebot.png -------------------------------------------------------------------------------- /docs/img/battlebot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/battlebot2.png -------------------------------------------------------------------------------- /docs/img/battlebot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/battlebot3.png -------------------------------------------------------------------------------- /docs/img/battlebot4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/battlebot4.png -------------------------------------------------------------------------------- /docs/img/battlebot5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/battlebot5.png -------------------------------------------------------------------------------- /docs/img/battlebot6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/battlebot6.png -------------------------------------------------------------------------------- /docs/img/crypto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/crypto.png -------------------------------------------------------------------------------- /docs/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/favicon.ico -------------------------------------------------------------------------------- /docs/img/keywall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/keywall.jpg -------------------------------------------------------------------------------- /docs/img/meshblu-code.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/meshblu-code.jpeg -------------------------------------------------------------------------------- /docs/img/mobile-screens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/mobile-screens.png -------------------------------------------------------------------------------- /docs/img/octoblu-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/octoblu-color.png -------------------------------------------------------------------------------- /docs/img/octoblu-inverse-spiral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/octoblu-inverse-spiral.png -------------------------------------------------------------------------------- /docs/img/octoblu-inverse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/octoblu-inverse.png -------------------------------------------------------------------------------- /docs/img/octoblu-team1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/octoblu-team1.jpg -------------------------------------------------------------------------------- /docs/img/octoblu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/octoblu.png -------------------------------------------------------------------------------- /docs/img/particle-blinkytape.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/particle-blinkytape.jpg -------------------------------------------------------------------------------- /docs/img/tablet-screens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/tablet-screens.png -------------------------------------------------------------------------------- /docs/img/team1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/team1.png -------------------------------------------------------------------------------- /docs/img/team2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/team2.png -------------------------------------------------------------------------------- /docs/img/team3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/team3.png -------------------------------------------------------------------------------- /docs/img/team4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/team4.png -------------------------------------------------------------------------------- /docs/img/tempetownlake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/img/tempetownlake.jpg -------------------------------------------------------------------------------- /docs/js/contact_me.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | 3 | $("#contactForm input,#contactForm textarea").jqBootstrapValidation({ 4 | preventSubmit: true, 5 | submitError: function($form, event, errors) { 6 | // additional error messages or events 7 | }, 8 | submitSuccess: function($form, event) { 9 | event.preventDefault(); // prevent default submit behaviour 10 | // get values from FORM 11 | var name = $("input#name").val(); 12 | var email = $("input#email").val(); 13 | var phone = $("input#phone").val(); 14 | var message = $("textarea#message").val(); 15 | var firstName = name; // For Success/Failure Message 16 | // Check for white space in name for Success/Fail message 17 | if (firstName.indexOf(' ') >= 0) { 18 | firstName = name.split(' ').slice(0, -1).join(' '); 19 | } 20 | $.ajax({ 21 | url: "./mail/contact_me.php", 22 | type: "POST", 23 | data: { 24 | name: name, 25 | phone: phone, 26 | email: email, 27 | message: message 28 | }, 29 | cache: false, 30 | success: function() { 31 | // Success message 32 | $('#success').html("
"); 33 | $('#success > .alert-success').html(""); 35 | $('#success > .alert-success') 36 | .append("Your message has been sent. "); 37 | $('#success > .alert-success') 38 | .append('
'); 39 | 40 | //clear all fields 41 | $('#contactForm').trigger("reset"); 42 | }, 43 | error: function() { 44 | // Fail message 45 | $('#success').html("
"); 46 | $('#success > .alert-danger').html(""); 48 | $('#success > .alert-danger').append("Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!"); 49 | $('#success > .alert-danger').append('
'); 50 | //clear all fields 51 | $('#contactForm').trigger("reset"); 52 | }, 53 | }) 54 | }, 55 | filter: function() { 56 | return $(this).is(":visible"); 57 | }, 58 | }); 59 | 60 | $("a[data-toggle=\"tab\"]").click(function(e) { 61 | e.preventDefault(); 62 | $(this).tab("show"); 63 | }); 64 | }); 65 | 66 | 67 | /*When clicking on Full hide fail/success boxes */ 68 | $('#name').focus(function() { 69 | $('#success').html(''); 70 | }); 71 | -------------------------------------------------------------------------------- /docs/js/vitality-mixitup.js: -------------------------------------------------------------------------------- 1 | // Mixitup Settings 2 | var containerEl = document.querySelector('#portfolioList'); 3 | var mixer = mixitup(containerEl); 4 | -------------------------------------------------------------------------------- /docs/js/vitality.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Vitality v2.0.0 (http://themes.startbootstrap.com/vitality-v2.0.0) 3 | * Copyright 2013-2017 Start Bootstrap 4 | * Purchase a license to use this theme at (https://wrapbootstrap.com) 5 | */ 6 | /*! 7 | * Vitality v2.0.0 (http://themes.startbootstrap.com/vitality-v2.0.0) 8 | * Copyright 2013-2017 Start Bootstrap 9 | * Purchase a license to use this theme at (https://wrapbootstrap.com) 10 | */ 11 | 12 | // Load WOW.js on non-touch devices 13 | var isPhoneDevice = "ontouchstart" in document.documentElement; 14 | $(document).ready(function() { 15 | if (isPhoneDevice) { 16 | //mobile 17 | } else { 18 | //desktop 19 | // Initialize WOW.js 20 | wow = new WOW({ 21 | offset: 50 22 | }) 23 | wow.init(); 24 | } 25 | }); 26 | 27 | (function($) { 28 | "use strict"; // Start of use strict 29 | 30 | // Collapse the navbar when page is scrolled 31 | $(window).scroll(function() { 32 | if ($("#mainNav").offset().top > 100) { 33 | $("#mainNav").addClass("navbar-shrink"); 34 | } else { 35 | $("#mainNav").removeClass("navbar-shrink"); 36 | } 37 | }); 38 | 39 | // Activate scrollspy to add active class to navbar items on scroll 40 | $('body').scrollspy({ 41 | target: '#mainNav', 42 | offset: 68 43 | }); 44 | 45 | // Smooth Scrolling: Smooth scrolls to an ID on the current page 46 | // To use this feature, add a link on your page that links to an ID, and add the .page-scroll class to the link itself. See the docs for more details. 47 | $('a.page-scroll').bind('click', function(event) { 48 | var $anchor = $(this); 49 | $('html, body').stop().animate({ 50 | scrollTop: ($($anchor.attr('href')).offset().top - 68) 51 | }, 1250, 'easeInOutExpo'); 52 | event.preventDefault(); 53 | }); 54 | 55 | // Closes responsive menu when a link is clicked 56 | $('.navbar-collapse>ul>li>a, .navbar-brand').click(function() { 57 | $('.navbar-collapse').collapse('hide'); 58 | }); 59 | 60 | // Activates floating label headings for the contact form 61 | $("body").on("input propertychange", ".floating-label-form-group", function(e) { 62 | $(this).toggleClass("floating-label-form-group-with-value", !!$(e.target).val()); 63 | }).on("focus", ".floating-label-form-group", function() { 64 | $(this).addClass("floating-label-form-group-with-focus"); 65 | }).on("blur", ".floating-label-form-group", function() { 66 | $(this).removeClass("floating-label-form-group-with-focus"); 67 | }); 68 | 69 | // Owl Carousel Settings 70 | $(".team-carousel").owlCarousel({ 71 | items: 3, 72 | navigation: true, 73 | pagination: false, 74 | navigationText: [ 75 | "", 76 | "" 77 | ], 78 | }); 79 | 80 | $(".portfolio-carousel").owlCarousel({ 81 | singleItem: true, 82 | navigation: true, 83 | pagination: false, 84 | navigationText: [ 85 | "", 86 | "" 87 | ], 88 | autoHeight: true, 89 | mouseDrag: false, 90 | touchDrag: false, 91 | transitionStyle: "fadeUp" 92 | }); 93 | 94 | $(".testimonials-carousel, .mockup-carousel").owlCarousel({ 95 | singleItem: true, 96 | navigation: true, 97 | pagination: true, 98 | autoHeight: true, 99 | navigationText: [ 100 | "", 101 | "" 102 | ], 103 | transitionStyle: "backSlide" 104 | }); 105 | 106 | $(".portfolio-gallery").owlCarousel({ 107 | items: 3, 108 | }); 109 | 110 | // Magnific Popup jQuery Lightbox Gallery Settings 111 | $('.gallery-link').magnificPopup({ 112 | type: 'image', 113 | gallery: { 114 | enabled: true 115 | }, 116 | image: { 117 | titleSrc: 'title' 118 | } 119 | }); 120 | 121 | // Magnific Popup Settings 122 | $('.mix').magnificPopup({ 123 | type: 'image', 124 | image: { 125 | titleSrc: 'title' 126 | } 127 | }); 128 | 129 | // Vide - Video Background Settings 130 | $('header.video').vide({ 131 | mp4: "mp4/camera.mp4", 132 | poster: "img/agency/backgrounds/bg-mobile-fallback.jpg" 133 | }, { 134 | posterType: 'jpg' 135 | }); 136 | 137 | })(jQuery); // End of use strict 138 | -------------------------------------------------------------------------------- /docs/vendor/bootstrap/css/bootstrap-grid.min.css: -------------------------------------------------------------------------------- 1 | @-ms-viewport{width:device-width}html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}.container{position:relative;margin-left:auto;margin-right:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{position:relative;margin-left:auto;margin-right:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}/*# sourceMappingURL=bootstrap-grid.min.css.map */ -------------------------------------------------------------------------------- /docs/vendor/bootstrap/css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */ 2 | html { 3 | font-family: sans-serif; 4 | line-height: 1.15; 5 | -ms-text-size-adjust: 100%; 6 | -webkit-text-size-adjust: 100%; 7 | } 8 | 9 | body { 10 | margin: 0; 11 | } 12 | 13 | article, 14 | aside, 15 | footer, 16 | header, 17 | nav, 18 | section { 19 | display: block; 20 | } 21 | 22 | h1 { 23 | font-size: 2em; 24 | margin: 0.67em 0; 25 | } 26 | 27 | figcaption, 28 | figure, 29 | main { 30 | display: block; 31 | } 32 | 33 | figure { 34 | margin: 1em 40px; 35 | } 36 | 37 | hr { 38 | -webkit-box-sizing: content-box; 39 | box-sizing: content-box; 40 | height: 0; 41 | overflow: visible; 42 | } 43 | 44 | pre { 45 | font-family: monospace, monospace; 46 | font-size: 1em; 47 | } 48 | 49 | a { 50 | background-color: transparent; 51 | -webkit-text-decoration-skip: objects; 52 | } 53 | 54 | a:active, 55 | a:hover { 56 | outline-width: 0; 57 | } 58 | 59 | abbr[title] { 60 | border-bottom: none; 61 | text-decoration: underline; 62 | text-decoration: underline dotted; 63 | } 64 | 65 | b, 66 | strong { 67 | font-weight: inherit; 68 | } 69 | 70 | b, 71 | strong { 72 | font-weight: bolder; 73 | } 74 | 75 | code, 76 | kbd, 77 | samp { 78 | font-family: monospace, monospace; 79 | font-size: 1em; 80 | } 81 | 82 | dfn { 83 | font-style: italic; 84 | } 85 | 86 | mark { 87 | background-color: #ff0; 88 | color: #000; 89 | } 90 | 91 | small { 92 | font-size: 80%; 93 | } 94 | 95 | sub, 96 | sup { 97 | font-size: 75%; 98 | line-height: 0; 99 | position: relative; 100 | vertical-align: baseline; 101 | } 102 | 103 | sub { 104 | bottom: -0.25em; 105 | } 106 | 107 | sup { 108 | top: -0.5em; 109 | } 110 | 111 | audio, 112 | video { 113 | display: inline-block; 114 | } 115 | 116 | audio:not([controls]) { 117 | display: none; 118 | height: 0; 119 | } 120 | 121 | img { 122 | border-style: none; 123 | } 124 | 125 | svg:not(:root) { 126 | overflow: hidden; 127 | } 128 | 129 | button, 130 | input, 131 | optgroup, 132 | select, 133 | textarea { 134 | font-family: sans-serif; 135 | font-size: 100%; 136 | line-height: 1.15; 137 | margin: 0; 138 | } 139 | 140 | button, 141 | input { 142 | overflow: visible; 143 | } 144 | 145 | button, 146 | select { 147 | text-transform: none; 148 | } 149 | 150 | button, 151 | html [type="button"], 152 | [type="reset"], 153 | [type="submit"] { 154 | -webkit-appearance: button; 155 | } 156 | 157 | button::-moz-focus-inner, 158 | [type="button"]::-moz-focus-inner, 159 | [type="reset"]::-moz-focus-inner, 160 | [type="submit"]::-moz-focus-inner { 161 | border-style: none; 162 | padding: 0; 163 | } 164 | 165 | button:-moz-focusring, 166 | [type="button"]:-moz-focusring, 167 | [type="reset"]:-moz-focusring, 168 | [type="submit"]:-moz-focusring { 169 | outline: 1px dotted ButtonText; 170 | } 171 | 172 | fieldset { 173 | border: 1px solid #c0c0c0; 174 | margin: 0 2px; 175 | padding: 0.35em 0.625em 0.75em; 176 | } 177 | 178 | legend { 179 | -webkit-box-sizing: border-box; 180 | box-sizing: border-box; 181 | color: inherit; 182 | display: table; 183 | max-width: 100%; 184 | padding: 0; 185 | white-space: normal; 186 | } 187 | 188 | progress { 189 | display: inline-block; 190 | vertical-align: baseline; 191 | } 192 | 193 | textarea { 194 | overflow: auto; 195 | } 196 | 197 | [type="checkbox"], 198 | [type="radio"] { 199 | -webkit-box-sizing: border-box; 200 | box-sizing: border-box; 201 | padding: 0; 202 | } 203 | 204 | [type="number"]::-webkit-inner-spin-button, 205 | [type="number"]::-webkit-outer-spin-button { 206 | height: auto; 207 | } 208 | 209 | [type="search"] { 210 | -webkit-appearance: textfield; 211 | outline-offset: -2px; 212 | } 213 | 214 | [type="search"]::-webkit-search-cancel-button, 215 | [type="search"]::-webkit-search-decoration { 216 | -webkit-appearance: none; 217 | } 218 | 219 | ::-webkit-file-upload-button { 220 | -webkit-appearance: button; 221 | font: inherit; 222 | } 223 | 224 | details, 225 | menu { 226 | display: block; 227 | } 228 | 229 | summary { 230 | display: list-item; 231 | } 232 | 233 | canvas { 234 | display: inline-block; 235 | } 236 | 237 | template { 238 | display: none; 239 | } 240 | 241 | [hidden] { 242 | display: none; 243 | } 244 | 245 | html { 246 | -webkit-box-sizing: border-box; 247 | box-sizing: border-box; 248 | } 249 | 250 | *, 251 | *::before, 252 | *::after { 253 | -webkit-box-sizing: inherit; 254 | box-sizing: inherit; 255 | } 256 | 257 | @-ms-viewport { 258 | width: device-width; 259 | } 260 | 261 | html { 262 | -ms-overflow-style: scrollbar; 263 | -webkit-tap-highlight-color: transparent; 264 | } 265 | 266 | body { 267 | font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; 268 | font-size: 1rem; 269 | font-weight: normal; 270 | line-height: 1.5; 271 | color: #292b2c; 272 | background-color: #fff; 273 | } 274 | 275 | [tabindex="-1"]:focus { 276 | outline: none !important; 277 | } 278 | 279 | h1, h2, h3, h4, h5, h6 { 280 | margin-top: 0; 281 | margin-bottom: .5rem; 282 | } 283 | 284 | p { 285 | margin-top: 0; 286 | margin-bottom: 1rem; 287 | } 288 | 289 | abbr[title], 290 | abbr[data-original-title] { 291 | cursor: help; 292 | } 293 | 294 | address { 295 | margin-bottom: 1rem; 296 | font-style: normal; 297 | line-height: inherit; 298 | } 299 | 300 | ol, 301 | ul, 302 | dl { 303 | margin-top: 0; 304 | margin-bottom: 1rem; 305 | } 306 | 307 | ol ol, 308 | ul ul, 309 | ol ul, 310 | ul ol { 311 | margin-bottom: 0; 312 | } 313 | 314 | dt { 315 | font-weight: bold; 316 | } 317 | 318 | dd { 319 | margin-bottom: .5rem; 320 | margin-left: 0; 321 | } 322 | 323 | blockquote { 324 | margin: 0 0 1rem; 325 | } 326 | 327 | a { 328 | color: #0275d8; 329 | text-decoration: none; 330 | } 331 | 332 | a:focus, a:hover { 333 | color: #014c8c; 334 | text-decoration: underline; 335 | } 336 | 337 | a:not([href]):not([tabindex]) { 338 | color: inherit; 339 | text-decoration: none; 340 | } 341 | 342 | a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover { 343 | color: inherit; 344 | text-decoration: none; 345 | } 346 | 347 | a:not([href]):not([tabindex]):focus { 348 | outline: 0; 349 | } 350 | 351 | pre { 352 | margin-top: 0; 353 | margin-bottom: 1rem; 354 | overflow: auto; 355 | } 356 | 357 | figure { 358 | margin: 0 0 1rem; 359 | } 360 | 361 | img { 362 | vertical-align: middle; 363 | } 364 | 365 | [role="button"] { 366 | cursor: pointer; 367 | } 368 | 369 | a, 370 | area, 371 | button, 372 | [role="button"], 373 | input, 374 | label, 375 | select, 376 | summary, 377 | textarea { 378 | -ms-touch-action: manipulation; 379 | touch-action: manipulation; 380 | } 381 | 382 | table { 383 | border-collapse: collapse; 384 | background-color: transparent; 385 | } 386 | 387 | caption { 388 | padding-top: 0.75rem; 389 | padding-bottom: 0.75rem; 390 | color: #636c72; 391 | text-align: left; 392 | caption-side: bottom; 393 | } 394 | 395 | th { 396 | text-align: left; 397 | } 398 | 399 | label { 400 | display: inline-block; 401 | margin-bottom: .5rem; 402 | } 403 | 404 | button:focus { 405 | outline: 1px dotted; 406 | outline: 5px auto -webkit-focus-ring-color; 407 | } 408 | 409 | input, 410 | button, 411 | select, 412 | textarea { 413 | line-height: inherit; 414 | } 415 | 416 | input[type="radio"]:disabled, 417 | input[type="checkbox"]:disabled { 418 | cursor: not-allowed; 419 | } 420 | 421 | input[type="date"], 422 | input[type="time"], 423 | input[type="datetime-local"], 424 | input[type="month"] { 425 | -webkit-appearance: listbox; 426 | } 427 | 428 | textarea { 429 | resize: vertical; 430 | } 431 | 432 | fieldset { 433 | min-width: 0; 434 | padding: 0; 435 | margin: 0; 436 | border: 0; 437 | } 438 | 439 | legend { 440 | display: block; 441 | width: 100%; 442 | padding: 0; 443 | margin-bottom: .5rem; 444 | font-size: 1.5rem; 445 | line-height: inherit; 446 | } 447 | 448 | input[type="search"] { 449 | -webkit-appearance: none; 450 | } 451 | 452 | output { 453 | display: inline-block; 454 | } 455 | 456 | [hidden] { 457 | display: none !important; 458 | } 459 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /docs/vendor/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[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:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}html{-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}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]{cursor:help}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}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}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse;background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{line-height:inherit}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}/*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /docs/vendor/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/vendor/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /docs/vendor/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/vendor/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /docs/vendor/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/vendor/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /docs/vendor/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /docs/vendor/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/vendor/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /docs/vendor/font-awesome/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /docs/vendor/jquery.easing/jquery.easing.compatibility.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Easing Compatibility v1 - http://gsgd.co.uk/sandbox/jquery/easing 3 | * 4 | * Adds compatibility for applications that use the pre 1.2 easing names 5 | * 6 | * Copyright (c) 2007 George Smith 7 | * Licensed under the MIT License: 8 | * http://www.opensource.org/licenses/mit-license.php 9 | */ 10 | 11 | (function($){ 12 | $.extend( $.easing, 13 | { 14 | easeIn: function (x, t, b, c, d) { 15 | return $.easing.easeInQuad(x, t, b, c, d); 16 | }, 17 | easeOut: function (x, t, b, c, d) { 18 | return $.easing.easeOutQuad(x, t, b, c, d); 19 | }, 20 | easeInOut: function (x, t, b, c, d) { 21 | return $.easing.easeInOutQuad(x, t, b, c, d); 22 | }, 23 | expoin: function(x, t, b, c, d) { 24 | return $.easing.easeInExpo(x, t, b, c, d); 25 | }, 26 | expoout: function(x, t, b, c, d) { 27 | return $.easing.easeOutExpo(x, t, b, c, d); 28 | }, 29 | expoinout: function(x, t, b, c, d) { 30 | return $.easing.easeInOutExpo(x, t, b, c, d); 31 | }, 32 | bouncein: function(x, t, b, c, d) { 33 | return $.easing.easeInBounce(x, t, b, c, d); 34 | }, 35 | bounceout: function(x, t, b, c, d) { 36 | return $.easing.easeOutBounce(x, t, b, c, d); 37 | }, 38 | bounceinout: function(x, t, b, c, d) { 39 | return $.easing.easeInOutBounce(x, t, b, c, d); 40 | }, 41 | elasin: function(x, t, b, c, d) { 42 | return $.easing.easeInElastic(x, t, b, c, d); 43 | }, 44 | elasout: function(x, t, b, c, d) { 45 | return $.easing.easeOutElastic(x, t, b, c, d); 46 | }, 47 | elasinout: function(x, t, b, c, d) { 48 | return $.easing.easeInOutElastic(x, t, b, c, d); 49 | }, 50 | backin: function(x, t, b, c, d) { 51 | return $.easing.easeInBack(x, t, b, c, d); 52 | }, 53 | backout: function(x, t, b, c, d) { 54 | return $.easing.easeOutBack(x, t, b, c, d); 55 | }, 56 | backinout: function(x, t, b, c, d) { 57 | return $.easing.easeInOutBack(x, t, b, c, d); 58 | } 59 | });})(jQuery); 60 | -------------------------------------------------------------------------------- /docs/vendor/jquery.easing/jquery.easing.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Easing v1.4.1 - http://gsgd.co.uk/sandbox/jquery/easing/ 3 | * Open source under the BSD License. 4 | * Copyright © 2008 George McGinley Smith 5 | * All rights reserved. 6 | * https://raw.github.com/gdsmith/jquery-easing/master/LICENSE 7 | */ 8 | 9 | (function (factory) { 10 | if (typeof define === "function" && define.amd) { 11 | define(['jquery'], function ($) { 12 | return factory($); 13 | }); 14 | } else if (typeof module === "object" && typeof module.exports === "object") { 15 | exports = factory(require('jquery')); 16 | } else { 17 | factory(jQuery); 18 | } 19 | })(function($){ 20 | 21 | // Preserve the original jQuery "swing" easing as "jswing" 22 | $.easing.jswing = $.easing.swing; 23 | 24 | var pow = Math.pow, 25 | sqrt = Math.sqrt, 26 | sin = Math.sin, 27 | cos = Math.cos, 28 | PI = Math.PI, 29 | c1 = 1.70158, 30 | c2 = c1 * 1.525, 31 | c3 = c1 + 1, 32 | c4 = ( 2 * PI ) / 3, 33 | c5 = ( 2 * PI ) / 4.5; 34 | 35 | // x is the fraction of animation progress, in the range 0..1 36 | function bounceOut(x) { 37 | var n1 = 7.5625, 38 | d1 = 2.75; 39 | if ( x < 1/d1 ) { 40 | return n1*x*x; 41 | } else if ( x < 2/d1 ) { 42 | return n1*(x-=(1.5/d1))*x + 0.75; 43 | } else if ( x < 2.5/d1 ) { 44 | return n1*(x-=(2.25/d1))*x + 0.9375; 45 | } else { 46 | return n1*(x-=(2.625/d1))*x + 0.984375; 47 | } 48 | } 49 | 50 | $.extend( $.easing, 51 | { 52 | def: 'easeOutQuad', 53 | swing: function (x) { 54 | return $.easing[$.easing.def](x); 55 | }, 56 | easeInQuad: function (x) { 57 | return x * x; 58 | }, 59 | easeOutQuad: function (x) { 60 | return 1 - ( 1 - x ) * ( 1 - x ); 61 | }, 62 | easeInOutQuad: function (x) { 63 | return x < 0.5 ? 64 | 2 * x * x : 65 | 1 - pow( -2 * x + 2, 2 ) / 2; 66 | }, 67 | easeInCubic: function (x) { 68 | return x * x * x; 69 | }, 70 | easeOutCubic: function (x) { 71 | return 1 - pow( 1 - x, 3 ); 72 | }, 73 | easeInOutCubic: function (x) { 74 | return x < 0.5 ? 75 | 4 * x * x * x : 76 | 1 - pow( -2 * x + 2, 3 ) / 2; 77 | }, 78 | easeInQuart: function (x) { 79 | return x * x * x * x; 80 | }, 81 | easeOutQuart: function (x) { 82 | return 1 - pow( 1 - x, 4 ); 83 | }, 84 | easeInOutQuart: function (x) { 85 | return x < 0.5 ? 86 | 8 * x * x * x * x : 87 | 1 - pow( -2 * x + 2, 4 ) / 2; 88 | }, 89 | easeInQuint: function (x) { 90 | return x * x * x * x * x; 91 | }, 92 | easeOutQuint: function (x) { 93 | return 1 - pow( 1 - x, 5 ); 94 | }, 95 | easeInOutQuint: function (x) { 96 | return x < 0.5 ? 97 | 16 * x * x * x * x * x : 98 | 1 - pow( -2 * x + 2, 5 ) / 2; 99 | }, 100 | easeInSine: function (x) { 101 | return 1 - cos( x * PI/2 ); 102 | }, 103 | easeOutSine: function (x) { 104 | return sin( x * PI/2 ); 105 | }, 106 | easeInOutSine: function (x) { 107 | return -( cos( PI * x ) - 1 ) / 2; 108 | }, 109 | easeInExpo: function (x) { 110 | return x === 0 ? 0 : pow( 2, 10 * x - 10 ); 111 | }, 112 | easeOutExpo: function (x) { 113 | return x === 1 ? 1 : 1 - pow( 2, -10 * x ); 114 | }, 115 | easeInOutExpo: function (x) { 116 | return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? 117 | pow( 2, 20 * x - 10 ) / 2 : 118 | ( 2 - pow( 2, -20 * x + 10 ) ) / 2; 119 | }, 120 | easeInCirc: function (x) { 121 | return 1 - sqrt( 1 - pow( x, 2 ) ); 122 | }, 123 | easeOutCirc: function (x) { 124 | return sqrt( 1 - pow( x - 1, 2 ) ); 125 | }, 126 | easeInOutCirc: function (x) { 127 | return x < 0.5 ? 128 | ( 1 - sqrt( 1 - pow( 2 * x, 2 ) ) ) / 2 : 129 | ( sqrt( 1 - pow( -2 * x + 2, 2 ) ) + 1 ) / 2; 130 | }, 131 | easeInElastic: function (x) { 132 | return x === 0 ? 0 : x === 1 ? 1 : 133 | -pow( 2, 10 * x - 10 ) * sin( ( x * 10 - 10.75 ) * c4 ); 134 | }, 135 | easeOutElastic: function (x) { 136 | return x === 0 ? 0 : x === 1 ? 1 : 137 | pow( 2, -10 * x ) * sin( ( x * 10 - 0.75 ) * c4 ) + 1; 138 | }, 139 | easeInOutElastic: function (x) { 140 | return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? 141 | -( pow( 2, 20 * x - 10 ) * sin( ( 20 * x - 11.125 ) * c5 )) / 2 : 142 | pow( 2, -20 * x + 10 ) * sin( ( 20 * x - 11.125 ) * c5 ) / 2 + 1; 143 | }, 144 | easeInBack: function (x) { 145 | return c3 * x * x * x - c1 * x * x; 146 | }, 147 | easeOutBack: function (x) { 148 | return 1 + c3 * pow( x - 1, 3 ) + c1 * pow( x - 1, 2 ); 149 | }, 150 | easeInOutBack: function (x) { 151 | return x < 0.5 ? 152 | ( pow( 2 * x, 2 ) * ( ( c2 + 1 ) * 2 * x - c2 ) ) / 2 : 153 | ( pow( 2 * x - 2, 2 ) *( ( c2 + 1 ) * ( x * 2 - 2 ) + c2 ) + 2 ) / 2; 154 | }, 155 | easeInBounce: function (x) { 156 | return 1 - bounceOut( 1 - x ); 157 | }, 158 | easeOutBounce: bounceOut, 159 | easeInOutBounce: function (x) { 160 | return x < 0.5 ? 161 | ( 1 - bounceOut( 1 - 2 * x ) ) / 2 : 162 | ( 1 + bounceOut( 2 * x - 1 ) ) / 2; 163 | } 164 | }); 165 | 166 | }); 167 | -------------------------------------------------------------------------------- /docs/vendor/jquery.easing/jquery.easing.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],function($){return factory($)})}else if(typeof module==="object"&&typeof module.exports==="object"){exports=factory(require("jquery"))}else{factory(jQuery)}})(function($){$.easing.jswing=$.easing.swing;var pow=Math.pow,sqrt=Math.sqrt,sin=Math.sin,cos=Math.cos,PI=Math.PI,c1=1.70158,c2=c1*1.525,c3=c1+1,c4=2*PI/3,c5=2*PI/4.5;function bounceOut(x){var n1=7.5625,d1=2.75;if(x<1/d1){return n1*x*x}else if(x<2/d1){return n1*(x-=1.5/d1)*x+.75}else if(x<2.5/d1){return n1*(x-=2.25/d1)*x+.9375}else{return n1*(x-=2.625/d1)*x+.984375}}$.extend($.easing,{def:"easeOutQuad",swing:function(x){return $.easing[$.easing.def](x)},easeInQuad:function(x){return x*x},easeOutQuad:function(x){return 1-(1-x)*(1-x)},easeInOutQuad:function(x){return x<.5?2*x*x:1-pow(-2*x+2,2)/2},easeInCubic:function(x){return x*x*x},easeOutCubic:function(x){return 1-pow(1-x,3)},easeInOutCubic:function(x){return x<.5?4*x*x*x:1-pow(-2*x+2,3)/2},easeInQuart:function(x){return x*x*x*x},easeOutQuart:function(x){return 1-pow(1-x,4)},easeInOutQuart:function(x){return x<.5?8*x*x*x*x:1-pow(-2*x+2,4)/2},easeInQuint:function(x){return x*x*x*x*x},easeOutQuint:function(x){return 1-pow(1-x,5)},easeInOutQuint:function(x){return x<.5?16*x*x*x*x*x:1-pow(-2*x+2,5)/2},easeInSine:function(x){return 1-cos(x*PI/2)},easeOutSine:function(x){return sin(x*PI/2)},easeInOutSine:function(x){return-(cos(PI*x)-1)/2},easeInExpo:function(x){return x===0?0:pow(2,10*x-10)},easeOutExpo:function(x){return x===1?1:1-pow(2,-10*x)},easeInOutExpo:function(x){return x===0?0:x===1?1:x<.5?pow(2,20*x-10)/2:(2-pow(2,-20*x+10))/2},easeInCirc:function(x){return 1-sqrt(1-pow(x,2))},easeOutCirc:function(x){return sqrt(1-pow(x-1,2))},easeInOutCirc:function(x){return x<.5?(1-sqrt(1-pow(2*x,2)))/2:(sqrt(1-pow(-2*x+2,2))+1)/2},easeInElastic:function(x){return x===0?0:x===1?1:-pow(2,10*x-10)*sin((x*10-10.75)*c4)},easeOutElastic:function(x){return x===0?0:x===1?1:pow(2,-10*x)*sin((x*10-.75)*c4)+1},easeInOutElastic:function(x){return x===0?0:x===1?1:x<.5?-(pow(2,20*x-10)*sin((20*x-11.125)*c5))/2:pow(2,-20*x+10)*sin((20*x-11.125)*c5)/2+1},easeInBack:function(x){return c3*x*x*x-c1*x*x},easeOutBack:function(x){return 1+c3*pow(x-1,3)+c1*pow(x-1,2)},easeInOutBack:function(x){return x<.5?pow(2*x,2)*((c2+1)*2*x-c2)/2:(pow(2*x-2,2)*((c2+1)*(x*2-2)+c2)+2)/2},easeInBounce:function(x){return 1-bounceOut(1-x)},easeOutBounce:bounceOut,easeInOutBounce:function(x){return x<.5?(1-bounceOut(1-2*x))/2:(1+bounceOut(2*x-1))/2}})}); -------------------------------------------------------------------------------- /docs/vendor/magnific-popup/jquery.magnific-popup.min.js: -------------------------------------------------------------------------------- 1 | /*! Magnific Popup - v1.1.0 - 2016-02-20 2 | * http://dimsemenov.com/plugins/magnific-popup/ 3 | * Copyright (c) 2016 Dmitry Semenov; */ 4 | !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isLowIE=b.isIE8=document.all&&!document.addEventListener,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(c,d){if(void 0===d||d===!1)return!0;if(e=c.split("_"),e.length>1){var f=b.find(p+"-"+e[0]);if(f.length>0){var g=e[1];"replaceWith"===g?f[0]!==d[0]&&f.replaceWith(d):"img"===g?f.is("img")?f.attr("src",d):f.replaceWith(a("").attr("src",d).attr("class",f.attr("class"))):f.attr(e[1],d)}}else b.find(p+"-"+c).html(d)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("
");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I="ajax",J=function(){H&&a(document.body).removeClass(H)},K=function(){J(),b.req&&b.req.abort()};a.magnificPopup.registerModule(I,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){b.types.push(I),H=b.st.ajax.cursor,w(h+"."+I,K),w("BeforeChange."+I,K)},getAjax:function(c){H&&a(document.body).addClass(H),b.updateStatus("loading");var d=a.extend({url:c.src,success:function(d,e,f){var g={data:d,xhr:f};y("ParseAjax",g),b.appendContent(a(g.data),I),c.finished=!0,J(),b._setFocus(),setTimeout(function(){b.wrap.addClass(q)},16),b.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),c.finished=c.loadError=!0,b.updateStatus("error",b.st.ajax.tError.replace("%url%",c.src))}},b.st.ajax.settings);return b.req=a.ajax(d),""}}});var L,M=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){L&&clearInterval(L),L=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(L),c++,void(3===c?e(10):40===c?e(50):100===c&&e(500)))},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:M(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(L&&clearInterval(L),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var N,O=function(){return void 0===N&&(N=void 0!==document.createElement("p").style.MozTransform),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return O()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var P="iframe",Q="//about:blank",R=function(a){if(b.currTemplate[P]){var c=b.currTemplate[P].find("iframe");c.length&&(a||(c[0].src=Q),b.isIE8&&c.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){b.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(h+"."+P,function(){R()})},getIframe:function(c,d){var e=c.src,f=b.st.iframe;a.each(f.patterns,function(){return e.indexOf(this.index)>-1?(this.id&&(e="string"==typeof this.id?e.substr(e.lastIndexOf(this.id)+this.id.length,e.length):this.id.call(this,e)),e=this.src.replace("%id%",e),!1):void 0});var g={};return f.srcAction&&(g[f.srcAction]=e),b._parseMarkup(d,g,c),b.updateStatus("ready"),d}}});var S=function(a){var c=b.items.length;return a>c-1?a-c:0>a?c+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=b.st.gallery,e=".mfp-gallery";return b.direction=!0,c&&c.enabled?(f+=" mfp-gallery",w(m+e,function(){c.navigateByImgClick&&b.wrap.on("click"+e,".mfp-img",function(){return b.items.length>1?(b.next(),!1):void 0}),d.on("keydown"+e,function(a){37===a.keyCode?b.prev():39===a.keyCode&&b.next()})}),w("UpdateStatus"+e,function(a,c){c.text&&(c.text=T(c.text,b.currItem.index,b.items.length))}),w(l+e,function(a,d,e,f){var g=b.items.length;e.counter=g>1?T(c.tCounter,f.index,g):""}),w("BuildControls"+e,function(){if(b.items.length>1&&c.arrows&&!b.arrowLeft){var d=c.arrowMarkup,e=b.arrowLeft=a(d.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(s),f=b.arrowRight=a(d.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(s);e.click(function(){b.prev()}),f.click(function(){b.next()}),b.container.append(e.add(f))}}),w(n+e,function(){b._preloadTimeout&&clearTimeout(b._preloadTimeout),b._preloadTimeout=setTimeout(function(){b.preloadNearbyImages(),b._preloadTimeout=null},16)}),void w(h+e,function(){d.off(e),b.wrap.off("click"+e),b.arrowRight=b.arrowLeft=null})):!1},next:function(){b.direction=!0,b.index=S(b.index+1),b.updateItemHTML()},prev:function(){b.direction=!1,b.index=S(b.index-1),b.updateItemHTML()},goTo:function(a){b.direction=a>=b.index,b.index=a,b.updateItemHTML()},preloadNearbyImages:function(){var a,c=b.st.gallery.preload,d=Math.min(c[0],b.items.length),e=Math.min(c[1],b.items.length);for(a=1;a<=(b.direction?e:d);a++)b._preloadItem(b.index+a);for(a=1;a<=(b.direction?d:e);a++)b._preloadItem(b.index-a)},_preloadItem:function(c){if(c=S(c),!b.items[c].preloaded){var d=b.items[c];d.parsed||(d=b.parseEl(c)),y("LazyLoad",d),"image"===d.type&&(d.img=a('').on("load.mfploader",function(){d.hasSize=!0}).on("error.mfploader",function(){d.hasSize=!0,d.loadError=!0,y("LazyLoadError",d)}).attr("src",d.src)),d.preloaded=!0}}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+U,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+U,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()}); -------------------------------------------------------------------------------- /docs/vendor/magnific-popup/magnific-popup.css: -------------------------------------------------------------------------------- 1 | /* Magnific Popup CSS */ 2 | .mfp-bg { 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | height: 100%; 7 | z-index: 1042; 8 | overflow: hidden; 9 | position: fixed; 10 | background: #0b0b0b; 11 | opacity: 0.8; } 12 | 13 | .mfp-wrap { 14 | top: 0; 15 | left: 0; 16 | width: 100%; 17 | height: 100%; 18 | z-index: 1043; 19 | position: fixed; 20 | outline: none !important; 21 | -webkit-backface-visibility: hidden; } 22 | 23 | .mfp-container { 24 | text-align: center; 25 | position: absolute; 26 | width: 100%; 27 | height: 100%; 28 | left: 0; 29 | top: 0; 30 | padding: 0 8px; 31 | box-sizing: border-box; } 32 | 33 | .mfp-container:before { 34 | content: ''; 35 | display: inline-block; 36 | height: 100%; 37 | vertical-align: middle; } 38 | 39 | .mfp-align-top .mfp-container:before { 40 | display: none; } 41 | 42 | .mfp-content { 43 | position: relative; 44 | display: inline-block; 45 | vertical-align: middle; 46 | margin: 0 auto; 47 | text-align: left; 48 | z-index: 1045; } 49 | 50 | .mfp-inline-holder .mfp-content, 51 | .mfp-ajax-holder .mfp-content { 52 | width: 100%; 53 | cursor: auto; } 54 | 55 | .mfp-ajax-cur { 56 | cursor: progress; } 57 | 58 | .mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { 59 | cursor: -moz-zoom-out; 60 | cursor: -webkit-zoom-out; 61 | cursor: zoom-out; } 62 | 63 | .mfp-zoom { 64 | cursor: pointer; 65 | cursor: -webkit-zoom-in; 66 | cursor: -moz-zoom-in; 67 | cursor: zoom-in; } 68 | 69 | .mfp-auto-cursor .mfp-content { 70 | cursor: auto; } 71 | 72 | .mfp-close, 73 | .mfp-arrow, 74 | .mfp-preloader, 75 | .mfp-counter { 76 | -webkit-user-select: none; 77 | -moz-user-select: none; 78 | user-select: none; } 79 | 80 | .mfp-loading.mfp-figure { 81 | display: none; } 82 | 83 | .mfp-hide { 84 | display: none !important; } 85 | 86 | .mfp-preloader { 87 | color: #CCC; 88 | position: absolute; 89 | top: 50%; 90 | width: auto; 91 | text-align: center; 92 | margin-top: -0.8em; 93 | left: 8px; 94 | right: 8px; 95 | z-index: 1044; } 96 | .mfp-preloader a { 97 | color: #CCC; } 98 | .mfp-preloader a:hover { 99 | color: #FFF; } 100 | 101 | .mfp-s-ready .mfp-preloader { 102 | display: none; } 103 | 104 | .mfp-s-error .mfp-content { 105 | display: none; } 106 | 107 | button.mfp-close, 108 | button.mfp-arrow { 109 | overflow: visible; 110 | cursor: pointer; 111 | background: transparent; 112 | border: 0; 113 | -webkit-appearance: none; 114 | display: block; 115 | outline: none; 116 | padding: 0; 117 | z-index: 1046; 118 | box-shadow: none; 119 | touch-action: manipulation; } 120 | 121 | button::-moz-focus-inner { 122 | padding: 0; 123 | border: 0; } 124 | 125 | .mfp-close { 126 | width: 44px; 127 | height: 44px; 128 | line-height: 44px; 129 | position: absolute; 130 | right: 0; 131 | top: 0; 132 | text-decoration: none; 133 | text-align: center; 134 | opacity: 0.65; 135 | padding: 0 0 18px 10px; 136 | color: #FFF; 137 | font-style: normal; 138 | font-size: 28px; 139 | font-family: Arial, Baskerville, monospace; } 140 | .mfp-close:hover, 141 | .mfp-close:focus { 142 | opacity: 1; } 143 | .mfp-close:active { 144 | top: 1px; } 145 | 146 | .mfp-close-btn-in .mfp-close { 147 | color: #333; } 148 | 149 | .mfp-image-holder .mfp-close, 150 | .mfp-iframe-holder .mfp-close { 151 | color: #FFF; 152 | right: -6px; 153 | text-align: right; 154 | padding-right: 6px; 155 | width: 100%; } 156 | 157 | .mfp-counter { 158 | position: absolute; 159 | top: 0; 160 | right: 0; 161 | color: #CCC; 162 | font-size: 12px; 163 | line-height: 18px; 164 | white-space: nowrap; } 165 | 166 | .mfp-arrow { 167 | position: absolute; 168 | opacity: 0.65; 169 | margin: 0; 170 | top: 50%; 171 | margin-top: -55px; 172 | padding: 0; 173 | width: 90px; 174 | height: 110px; 175 | -webkit-tap-highlight-color: transparent; } 176 | .mfp-arrow:active { 177 | margin-top: -54px; } 178 | .mfp-arrow:hover, 179 | .mfp-arrow:focus { 180 | opacity: 1; } 181 | .mfp-arrow:before, 182 | .mfp-arrow:after { 183 | content: ''; 184 | display: block; 185 | width: 0; 186 | height: 0; 187 | position: absolute; 188 | left: 0; 189 | top: 0; 190 | margin-top: 35px; 191 | margin-left: 35px; 192 | border: medium inset transparent; } 193 | .mfp-arrow:after { 194 | border-top-width: 13px; 195 | border-bottom-width: 13px; 196 | top: 8px; } 197 | .mfp-arrow:before { 198 | border-top-width: 21px; 199 | border-bottom-width: 21px; 200 | opacity: 0.7; } 201 | 202 | .mfp-arrow-left { 203 | left: 0; } 204 | .mfp-arrow-left:after { 205 | border-right: 17px solid #FFF; 206 | margin-left: 31px; } 207 | .mfp-arrow-left:before { 208 | margin-left: 25px; 209 | border-right: 27px solid #3F3F3F; } 210 | 211 | .mfp-arrow-right { 212 | right: 0; } 213 | .mfp-arrow-right:after { 214 | border-left: 17px solid #FFF; 215 | margin-left: 39px; } 216 | .mfp-arrow-right:before { 217 | border-left: 27px solid #3F3F3F; } 218 | 219 | .mfp-iframe-holder { 220 | padding-top: 40px; 221 | padding-bottom: 40px; } 222 | .mfp-iframe-holder .mfp-content { 223 | line-height: 0; 224 | width: 100%; 225 | max-width: 900px; } 226 | .mfp-iframe-holder .mfp-close { 227 | top: -40px; } 228 | 229 | .mfp-iframe-scaler { 230 | width: 100%; 231 | height: 0; 232 | overflow: hidden; 233 | padding-top: 56.25%; } 234 | .mfp-iframe-scaler iframe { 235 | position: absolute; 236 | display: block; 237 | top: 0; 238 | left: 0; 239 | width: 100%; 240 | height: 100%; 241 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); 242 | background: #000; } 243 | 244 | /* Main image in popup */ 245 | img.mfp-img { 246 | width: auto; 247 | max-width: 100%; 248 | height: auto; 249 | display: block; 250 | line-height: 0; 251 | box-sizing: border-box; 252 | padding: 40px 0 40px; 253 | margin: 0 auto; } 254 | 255 | /* The shadow behind the image */ 256 | .mfp-figure { 257 | line-height: 0; } 258 | .mfp-figure:after { 259 | content: ''; 260 | position: absolute; 261 | left: 0; 262 | top: 40px; 263 | bottom: 40px; 264 | display: block; 265 | right: 0; 266 | width: auto; 267 | height: auto; 268 | z-index: -1; 269 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); 270 | background: #444; } 271 | .mfp-figure small { 272 | color: #BDBDBD; 273 | display: block; 274 | font-size: 12px; 275 | line-height: 14px; } 276 | .mfp-figure figure { 277 | margin: 0; } 278 | 279 | .mfp-bottom-bar { 280 | margin-top: -36px; 281 | position: absolute; 282 | top: 100%; 283 | left: 0; 284 | width: 100%; 285 | cursor: auto; } 286 | 287 | .mfp-title { 288 | text-align: left; 289 | line-height: 18px; 290 | color: #F3F3F3; 291 | word-wrap: break-word; 292 | padding-right: 36px; } 293 | 294 | .mfp-image-holder .mfp-content { 295 | max-width: 100%; } 296 | 297 | .mfp-gallery .mfp-image-holder .mfp-figure { 298 | cursor: pointer; } 299 | 300 | @media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) { 301 | /** 302 | * Remove all paddings around the image on small screen 303 | */ 304 | .mfp-img-mobile .mfp-image-holder { 305 | padding-left: 0; 306 | padding-right: 0; } 307 | .mfp-img-mobile img.mfp-img { 308 | padding: 0; } 309 | .mfp-img-mobile .mfp-figure:after { 310 | top: 0; 311 | bottom: 0; } 312 | .mfp-img-mobile .mfp-figure small { 313 | display: inline; 314 | margin-left: 5px; } 315 | .mfp-img-mobile .mfp-bottom-bar { 316 | background: rgba(0, 0, 0, 0.6); 317 | bottom: 0; 318 | margin: 0; 319 | top: auto; 320 | padding: 3px 5px; 321 | position: fixed; 322 | box-sizing: border-box; } 323 | .mfp-img-mobile .mfp-bottom-bar:empty { 324 | padding: 0; } 325 | .mfp-img-mobile .mfp-counter { 326 | right: 5px; 327 | top: 3px; } 328 | .mfp-img-mobile .mfp-close { 329 | top: 0; 330 | right: 0; 331 | width: 35px; 332 | height: 35px; 333 | line-height: 35px; 334 | background: rgba(0, 0, 0, 0.6); 335 | position: fixed; 336 | text-align: center; 337 | padding: 0; } } 338 | 339 | @media all and (max-width: 900px) { 340 | .mfp-arrow { 341 | -webkit-transform: scale(0.75); 342 | transform: scale(0.75); } 343 | .mfp-arrow-left { 344 | -webkit-transform-origin: 0; 345 | transform-origin: 0; } 346 | .mfp-arrow-right { 347 | -webkit-transform-origin: 100%; 348 | transform-origin: 100%; } 349 | .mfp-container { 350 | padding-left: 6px; 351 | padding-right: 6px; } } 352 | -------------------------------------------------------------------------------- /docs/vendor/owl-carousel/AjaxLoader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/vendor/owl-carousel/AjaxLoader.gif -------------------------------------------------------------------------------- /docs/vendor/owl-carousel/grabbing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoblu/meshblu/e017c997642ef6e839c1a13aca1c5fc1d13d544c/docs/vendor/owl-carousel/grabbing.png -------------------------------------------------------------------------------- /docs/vendor/owl-carousel/owl.carousel.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Core Owl Carousel CSS File 3 | * v1.3.3 4 | */ 5 | 6 | /* clearfix */ 7 | .owl-carousel .owl-wrapper:after { 8 | content: "."; 9 | display: block; 10 | clear: both; 11 | visibility: hidden; 12 | line-height: 0; 13 | height: 0; 14 | } 15 | /* display none until init */ 16 | .owl-carousel{ 17 | display: none; 18 | position: relative; 19 | width: 100%; 20 | -ms-touch-action: pan-y; 21 | } 22 | .owl-carousel .owl-wrapper{ 23 | display: none; 24 | position: relative; 25 | -webkit-transform: translate3d(0px, 0px, 0px); 26 | } 27 | .owl-carousel .owl-wrapper-outer{ 28 | overflow: hidden; 29 | position: relative; 30 | width: 100%; 31 | } 32 | .owl-carousel .owl-wrapper-outer.autoHeight{ 33 | -webkit-transition: height 500ms ease-in-out; 34 | -moz-transition: height 500ms ease-in-out; 35 | -ms-transition: height 500ms ease-in-out; 36 | -o-transition: height 500ms ease-in-out; 37 | transition: height 500ms ease-in-out; 38 | } 39 | 40 | .owl-carousel .owl-item{ 41 | float: left; 42 | } 43 | .owl-controls .owl-page, 44 | .owl-controls .owl-buttons div{ 45 | cursor: pointer; 46 | } 47 | .owl-controls { 48 | -webkit-user-select: none; 49 | -khtml-user-select: none; 50 | -moz-user-select: none; 51 | -ms-user-select: none; 52 | user-select: none; 53 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 54 | } 55 | 56 | /* mouse grab icon */ 57 | .grabbing { 58 | cursor:url(grabbing.png) 8 8, move; 59 | } 60 | 61 | /* fix */ 62 | .owl-carousel .owl-wrapper, 63 | .owl-carousel .owl-item{ 64 | -webkit-backface-visibility: hidden; 65 | -moz-backface-visibility: hidden; 66 | -ms-backface-visibility: hidden; 67 | -webkit-transform: translate3d(0,0,0); 68 | -moz-transform: translate3d(0,0,0); 69 | -ms-transform: translate3d(0,0,0); 70 | } 71 | 72 | -------------------------------------------------------------------------------- /docs/vendor/owl-carousel/owl.theme.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Owl Carousel Owl Demo Theme 3 | * v1.3.3 4 | */ 5 | 6 | .owl-theme .owl-controls{ 7 | margin-top: 10px; 8 | text-align: center; 9 | } 10 | 11 | /* Styling Next and Prev buttons */ 12 | 13 | .owl-theme .owl-controls .owl-buttons div{ 14 | color: #FFF; 15 | display: inline-block; 16 | zoom: 1; 17 | *display: inline;/*IE7 life-saver */ 18 | margin: 5px; 19 | padding: 3px 10px; 20 | font-size: 12px; 21 | -webkit-border-radius: 30px; 22 | -moz-border-radius: 30px; 23 | border-radius: 30px; 24 | background: #869791; 25 | filter: Alpha(Opacity=50);/*IE7 fix*/ 26 | opacity: 0.5; 27 | } 28 | /* Clickable class fix problem with hover on touch devices */ 29 | /* Use it for non-touch hover action */ 30 | .owl-theme .owl-controls.clickable .owl-buttons div:hover{ 31 | filter: Alpha(Opacity=100);/*IE7 fix*/ 32 | opacity: 1; 33 | text-decoration: none; 34 | } 35 | 36 | /* Styling Pagination*/ 37 | 38 | .owl-theme .owl-controls .owl-page{ 39 | display: inline-block; 40 | zoom: 1; 41 | *display: inline;/*IE7 life-saver */ 42 | } 43 | .owl-theme .owl-controls .owl-page span{ 44 | display: block; 45 | width: 12px; 46 | height: 12px; 47 | margin: 5px 7px; 48 | filter: Alpha(Opacity=50);/*IE7 fix*/ 49 | opacity: 0.5; 50 | -webkit-border-radius: 20px; 51 | -moz-border-radius: 20px; 52 | border-radius: 20px; 53 | background: #869791; 54 | } 55 | 56 | .owl-theme .owl-controls .owl-page.active span, 57 | .owl-theme .owl-controls.clickable .owl-page:hover span{ 58 | filter: Alpha(Opacity=100);/*IE7 fix*/ 59 | opacity: 1; 60 | } 61 | 62 | /* If PaginationNumbers is true */ 63 | 64 | .owl-theme .owl-controls .owl-page span.owl-numbers{ 65 | height: auto; 66 | width: auto; 67 | color: #FFF; 68 | padding: 2px 10px; 69 | font-size: 12px; 70 | -webkit-border-radius: 30px; 71 | -moz-border-radius: 30px; 72 | border-radius: 30px; 73 | } 74 | 75 | /* preloading images */ 76 | .owl-item.loading{ 77 | min-height: 150px; 78 | background: url(AjaxLoader.gif) no-repeat center center 79 | } -------------------------------------------------------------------------------- /docs/vendor/owl-carousel/owl.transitions.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Owl Carousel CSS3 Transitions 3 | * v1.3.2 4 | */ 5 | 6 | .owl-origin { 7 | -webkit-perspective: 1200px; 8 | -webkit-perspective-origin-x : 50%; 9 | -webkit-perspective-origin-y : 50%; 10 | -moz-perspective : 1200px; 11 | -moz-perspective-origin-x : 50%; 12 | -moz-perspective-origin-y : 50%; 13 | perspective : 1200px; 14 | } 15 | /* fade */ 16 | .owl-fade-out { 17 | z-index: 10; 18 | -webkit-animation: fadeOut .7s both ease; 19 | -moz-animation: fadeOut .7s both ease; 20 | animation: fadeOut .7s both ease; 21 | } 22 | .owl-fade-in { 23 | -webkit-animation: fadeIn .7s both ease; 24 | -moz-animation: fadeIn .7s both ease; 25 | animation: fadeIn .7s both ease; 26 | } 27 | /* backSlide */ 28 | .owl-backSlide-out { 29 | -webkit-animation: backSlideOut 1s both ease; 30 | -moz-animation: backSlideOut 1s both ease; 31 | animation: backSlideOut 1s both ease; 32 | } 33 | .owl-backSlide-in { 34 | -webkit-animation: backSlideIn 1s both ease; 35 | -moz-animation: backSlideIn 1s both ease; 36 | animation: backSlideIn 1s both ease; 37 | } 38 | /* goDown */ 39 | .owl-goDown-out { 40 | -webkit-animation: scaleToFade .7s ease both; 41 | -moz-animation: scaleToFade .7s ease both; 42 | animation: scaleToFade .7s ease both; 43 | } 44 | .owl-goDown-in { 45 | -webkit-animation: goDown .6s ease both; 46 | -moz-animation: goDown .6s ease both; 47 | animation: goDown .6s ease both; 48 | } 49 | /* scaleUp */ 50 | .owl-fadeUp-in { 51 | -webkit-animation: scaleUpFrom .5s ease both; 52 | -moz-animation: scaleUpFrom .5s ease both; 53 | animation: scaleUpFrom .5s ease both; 54 | } 55 | 56 | .owl-fadeUp-out { 57 | -webkit-animation: scaleUpTo .5s ease both; 58 | -moz-animation: scaleUpTo .5s ease both; 59 | animation: scaleUpTo .5s ease both; 60 | } 61 | /* Keyframes */ 62 | /*empty*/ 63 | @-webkit-keyframes empty { 64 | 0% {opacity: 1} 65 | } 66 | @-moz-keyframes empty { 67 | 0% {opacity: 1} 68 | } 69 | @keyframes empty { 70 | 0% {opacity: 1} 71 | } 72 | @-webkit-keyframes fadeIn { 73 | 0% { opacity:0; } 74 | 100% { opacity:1; } 75 | } 76 | @-moz-keyframes fadeIn { 77 | 0% { opacity:0; } 78 | 100% { opacity:1; } 79 | } 80 | @keyframes fadeIn { 81 | 0% { opacity:0; } 82 | 100% { opacity:1; } 83 | } 84 | @-webkit-keyframes fadeOut { 85 | 0% { opacity:1; } 86 | 100% { opacity:0; } 87 | } 88 | @-moz-keyframes fadeOut { 89 | 0% { opacity:1; } 90 | 100% { opacity:0; } 91 | } 92 | @keyframes fadeOut { 93 | 0% { opacity:1; } 94 | 100% { opacity:0; } 95 | } 96 | @-webkit-keyframes backSlideOut { 97 | 25% { opacity: .5; -webkit-transform: translateZ(-500px); } 98 | 75% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(-200%); } 99 | 100% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(-200%); } 100 | } 101 | @-moz-keyframes backSlideOut { 102 | 25% { opacity: .5; -moz-transform: translateZ(-500px); } 103 | 75% { opacity: .5; -moz-transform: translateZ(-500px) translateX(-200%); } 104 | 100% { opacity: .5; -moz-transform: translateZ(-500px) translateX(-200%); } 105 | } 106 | @keyframes backSlideOut { 107 | 25% { opacity: .5; transform: translateZ(-500px); } 108 | 75% { opacity: .5; transform: translateZ(-500px) translateX(-200%); } 109 | 100% { opacity: .5; transform: translateZ(-500px) translateX(-200%); } 110 | } 111 | @-webkit-keyframes backSlideIn { 112 | 0%, 25% { opacity: .5; -webkit-transform: translateZ(-500px) translateX(200%); } 113 | 75% { opacity: .5; -webkit-transform: translateZ(-500px); } 114 | 100% { opacity: 1; -webkit-transform: translateZ(0) translateX(0); } 115 | } 116 | @-moz-keyframes backSlideIn { 117 | 0%, 25% { opacity: .5; -moz-transform: translateZ(-500px) translateX(200%); } 118 | 75% { opacity: .5; -moz-transform: translateZ(-500px); } 119 | 100% { opacity: 1; -moz-transform: translateZ(0) translateX(0); } 120 | } 121 | @keyframes backSlideIn { 122 | 0%, 25% { opacity: .5; transform: translateZ(-500px) translateX(200%); } 123 | 75% { opacity: .5; transform: translateZ(-500px); } 124 | 100% { opacity: 1; transform: translateZ(0) translateX(0); } 125 | } 126 | @-webkit-keyframes scaleToFade { 127 | to { opacity: 0; -webkit-transform: scale(.8); } 128 | } 129 | @-moz-keyframes scaleToFade { 130 | to { opacity: 0; -moz-transform: scale(.8); } 131 | } 132 | @keyframes scaleToFade { 133 | to { opacity: 0; transform: scale(.8); } 134 | } 135 | @-webkit-keyframes goDown { 136 | from { -webkit-transform: translateY(-100%); } 137 | } 138 | @-moz-keyframes goDown { 139 | from { -moz-transform: translateY(-100%); } 140 | } 141 | @keyframes goDown { 142 | from { transform: translateY(-100%); } 143 | } 144 | 145 | @-webkit-keyframes scaleUpFrom { 146 | from { opacity: 0; -webkit-transform: scale(1.5); } 147 | } 148 | @-moz-keyframes scaleUpFrom { 149 | from { opacity: 0; -moz-transform: scale(1.5); } 150 | } 151 | @keyframes scaleUpFrom { 152 | from { opacity: 0; transform: scale(1.5); } 153 | } 154 | 155 | @-webkit-keyframes scaleUpTo { 156 | to { opacity: 0; -webkit-transform: scale(1.5); } 157 | } 158 | @-moz-keyframes scaleUpTo { 159 | to { opacity: 0; -moz-transform: scale(1.5); } 160 | } 161 | @keyframes scaleUpTo { 162 | to { opacity: 0; transform: scale(1.5); } 163 | } -------------------------------------------------------------------------------- /docs/vendor/vide/jquery.vide.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Vide - v0.5.1 3 | * Easy as hell jQuery plugin for video backgrounds. 4 | * http://vodkabears.github.io/vide/ 5 | * 6 | * Made by Ilya Makarov 7 | * Under MIT License 8 | */ 9 | !(function(root, factory) { 10 | if (typeof define === 'function' && define.amd) { 11 | define(['jquery'], factory); 12 | } else if (typeof exports === 'object') { 13 | factory(require('jquery')); 14 | } else { 15 | factory(root.jQuery); 16 | } 17 | })(this, function($) { 18 | 19 | 'use strict'; 20 | 21 | /** 22 | * Name of the plugin 23 | * @private 24 | * @const 25 | * @type {String} 26 | */ 27 | var PLUGIN_NAME = 'vide'; 28 | 29 | /** 30 | * Default settings 31 | * @private 32 | * @const 33 | * @type {Object} 34 | */ 35 | var DEFAULTS = { 36 | volume: 1, 37 | playbackRate: 1, 38 | muted: true, 39 | loop: true, 40 | autoplay: true, 41 | position: '50% 50%', 42 | posterType: 'detect', 43 | resizing: true, 44 | bgColor: 'transparent', 45 | className: '' 46 | }; 47 | 48 | /** 49 | * Not implemented error message 50 | * @private 51 | * @const 52 | * @type {String} 53 | */ 54 | var NOT_IMPLEMENTED_MSG = 'Not implemented'; 55 | 56 | /** 57 | * Parse a string with options 58 | * @private 59 | * @param {String} str 60 | * @returns {Object|String} 61 | */ 62 | function parseOptions(str) { 63 | var obj = {}; 64 | var delimiterIndex; 65 | var option; 66 | var prop; 67 | var val; 68 | var arr; 69 | var len; 70 | var i; 71 | 72 | // Remove spaces around delimiters and split 73 | arr = str.replace(/\s*:\s*/g, ':').replace(/\s*,\s*/g, ',').split(','); 74 | 75 | // Parse a string 76 | for (i = 0, len = arr.length; i < len; i++) { 77 | option = arr[i]; 78 | 79 | // Ignore urls and a string without colon delimiters 80 | if ( 81 | option.search(/^(http|https|ftp):\/\//) !== -1 || 82 | option.search(':') === -1 83 | ) { 84 | break; 85 | } 86 | 87 | delimiterIndex = option.indexOf(':'); 88 | prop = option.substring(0, delimiterIndex); 89 | val = option.substring(delimiterIndex + 1); 90 | 91 | // If val is an empty string, make it undefined 92 | if (!val) { 93 | val = undefined; 94 | } 95 | 96 | // Convert a string value if it is like a boolean 97 | if (typeof val === 'string') { 98 | val = val === 'true' || (val === 'false' ? false : val); 99 | } 100 | 101 | // Convert a string value if it is like a number 102 | if (typeof val === 'string') { 103 | val = !isNaN(val) ? +val : val; 104 | } 105 | 106 | obj[prop] = val; 107 | } 108 | 109 | // If nothing is parsed 110 | if (prop == null && val == null) { 111 | return str; 112 | } 113 | 114 | return obj; 115 | } 116 | 117 | /** 118 | * Parse a position option 119 | * @private 120 | * @param {String} str 121 | * @returns {Object} 122 | */ 123 | function parsePosition(str) { 124 | str = '' + str; 125 | 126 | // Default value is a center 127 | var args = str.split(/\s+/); 128 | var x = '50%'; 129 | var y = '50%'; 130 | var len; 131 | var arg; 132 | var i; 133 | 134 | for (i = 0, len = args.length; i < len; i++) { 135 | arg = args[i]; 136 | 137 | // Convert values 138 | if (arg === 'left') { 139 | x = '0%'; 140 | } else if (arg === 'right') { 141 | x = '100%'; 142 | } else if (arg === 'top') { 143 | y = '0%'; 144 | } else if (arg === 'bottom') { 145 | y = '100%'; 146 | } else if (arg === 'center') { 147 | if (i === 0) { 148 | x = '50%'; 149 | } else { 150 | y = '50%'; 151 | } 152 | } else { 153 | if (i === 0) { 154 | x = arg; 155 | } else { 156 | y = arg; 157 | } 158 | } 159 | } 160 | 161 | return { x: x, y: y }; 162 | } 163 | 164 | /** 165 | * Search a poster 166 | * @private 167 | * @param {String} path 168 | * @param {Function} callback 169 | */ 170 | function findPoster(path, callback) { 171 | var onLoad = function() { 172 | callback(this.src); 173 | }; 174 | 175 | $('').on('load', onLoad); 176 | $('').on('load', onLoad); 177 | $('').on('load', onLoad); 178 | $('').on('load', onLoad); 179 | } 180 | 181 | /** 182 | * Vide constructor 183 | * @param {HTMLElement} element 184 | * @param {Object|String} path 185 | * @param {Object|String} options 186 | * @constructor 187 | */ 188 | function Vide(element, path, options) { 189 | this.$element = $(element); 190 | 191 | // Parse path 192 | if (typeof path === 'string') { 193 | path = parseOptions(path); 194 | } 195 | 196 | // Parse options 197 | if (!options) { 198 | options = {}; 199 | } else if (typeof options === 'string') { 200 | options = parseOptions(options); 201 | } 202 | 203 | // Remove an extension 204 | if (typeof path === 'string') { 205 | path = path.replace(/\.\w*$/, ''); 206 | } else if (typeof path === 'object') { 207 | for (var i in path) { 208 | if (path.hasOwnProperty(i)) { 209 | path[i] = path[i].replace(/\.\w*$/, ''); 210 | } 211 | } 212 | } 213 | 214 | this.settings = $.extend({}, DEFAULTS, options); 215 | this.path = path; 216 | 217 | // https://github.com/VodkaBears/Vide/issues/110 218 | try { 219 | this.init(); 220 | } catch (e) { 221 | if (e.message !== NOT_IMPLEMENTED_MSG) { 222 | throw e; 223 | } 224 | } 225 | } 226 | 227 | /** 228 | * Initialization 229 | * @public 230 | */ 231 | Vide.prototype.init = function() { 232 | var vide = this; 233 | var path = vide.path; 234 | var poster = path; 235 | var sources = ''; 236 | var $element = vide.$element; 237 | var settings = vide.settings; 238 | var position = parsePosition(settings.position); 239 | var posterType = settings.posterType; 240 | var $video; 241 | var $wrapper; 242 | 243 | // Set styles of a video wrapper 244 | $wrapper = vide.$wrapper = $('
') 245 | .addClass(settings.className) 246 | .css({ 247 | position: 'absolute', 248 | 'z-index': -1, 249 | top: 0, 250 | left: 0, 251 | bottom: 0, 252 | right: 0, 253 | overflow: 'hidden', 254 | '-webkit-background-size': 'cover', 255 | '-moz-background-size': 'cover', 256 | '-o-background-size': 'cover', 257 | 'background-size': 'cover', 258 | 'background-color': settings.bgColor, 259 | 'background-repeat': 'no-repeat', 260 | 'background-position': position.x + ' ' + position.y 261 | }); 262 | 263 | // Get a poster path 264 | if (typeof path === 'object') { 265 | if (path.poster) { 266 | poster = path.poster; 267 | } else { 268 | if (path.mp4) { 269 | poster = path.mp4; 270 | } else if (path.webm) { 271 | poster = path.webm; 272 | } else if (path.ogv) { 273 | poster = path.ogv; 274 | } 275 | } 276 | } 277 | 278 | // Set a video poster 279 | if (posterType === 'detect') { 280 | findPoster(poster, function(url) { 281 | $wrapper.css('background-image', 'url(' + url + ')'); 282 | }); 283 | } else if (posterType !== 'none') { 284 | $wrapper.css('background-image', 'url(' + poster + '.' + posterType + ')'); 285 | } 286 | 287 | // If a parent element has a static position, make it relative 288 | if ($element.css('position') === 'static') { 289 | $element.css('position', 'relative'); 290 | } 291 | 292 | $element.prepend($wrapper); 293 | 294 | if (typeof path === 'object') { 295 | if (path.mp4) { 296 | sources += ''; 297 | } 298 | 299 | if (path.webm) { 300 | sources += ''; 301 | } 302 | 303 | if (path.ogv) { 304 | sources += ''; 305 | } 306 | 307 | $video = vide.$video = $(''); 308 | } else { 309 | $video = vide.$video = $(''); 314 | } 315 | 316 | // https://github.com/VodkaBears/Vide/issues/110 317 | try { 318 | $video 319 | 320 | // Set video properties 321 | .prop({ 322 | autoplay: settings.autoplay, 323 | loop: settings.loop, 324 | volume: settings.volume, 325 | muted: settings.muted, 326 | defaultMuted: settings.muted, 327 | playbackRate: settings.playbackRate, 328 | defaultPlaybackRate: settings.playbackRate 329 | }); 330 | } catch (e) { 331 | throw new Error(NOT_IMPLEMENTED_MSG); 332 | } 333 | 334 | // Video alignment 335 | $video.css({ 336 | margin: 'auto', 337 | position: 'absolute', 338 | 'z-index': -1, 339 | top: position.y, 340 | left: position.x, 341 | '-webkit-transform': 'translate(-' + position.x + ', -' + position.y + ')', 342 | '-ms-transform': 'translate(-' + position.x + ', -' + position.y + ')', 343 | '-moz-transform': 'translate(-' + position.x + ', -' + position.y + ')', 344 | transform: 'translate(-' + position.x + ', -' + position.y + ')', 345 | 346 | // Disable visibility, while loading 347 | visibility: 'hidden', 348 | opacity: 0 349 | }) 350 | 351 | // Resize a video, when it's loaded 352 | .one('canplaythrough.' + PLUGIN_NAME, function() { 353 | vide.resize(); 354 | }) 355 | 356 | // Make it visible, when it's already playing 357 | .one('playing.' + PLUGIN_NAME, function() { 358 | $video.css({ 359 | visibility: 'visible', 360 | opacity: 1 361 | }); 362 | $wrapper.css('background-image', 'none'); 363 | }); 364 | 365 | // Resize event is available only for 'window' 366 | // Use another code solutions to detect DOM elements resizing 367 | $element.on('resize.' + PLUGIN_NAME, function() { 368 | if (settings.resizing) { 369 | vide.resize(); 370 | } 371 | }); 372 | 373 | // Append a video 374 | $wrapper.append($video); 375 | }; 376 | 377 | /** 378 | * Get a video element 379 | * @public 380 | * @returns {HTMLVideoElement} 381 | */ 382 | Vide.prototype.getVideoObject = function() { 383 | return this.$video[0]; 384 | }; 385 | 386 | /** 387 | * Resize a video background 388 | * @public 389 | */ 390 | Vide.prototype.resize = function() { 391 | if (!this.$video) { 392 | return; 393 | } 394 | 395 | var $wrapper = this.$wrapper; 396 | var $video = this.$video; 397 | var video = $video[0]; 398 | 399 | // Get a native video size 400 | var videoHeight = video.videoHeight; 401 | var videoWidth = video.videoWidth; 402 | 403 | // Get a wrapper size 404 | var wrapperHeight = $wrapper.height(); 405 | var wrapperWidth = $wrapper.width(); 406 | 407 | if (wrapperWidth / videoWidth > wrapperHeight / videoHeight) { 408 | $video.css({ 409 | 410 | // +2 pixels to prevent an empty space after transformation 411 | width: wrapperWidth + 2, 412 | height: 'auto' 413 | }); 414 | } else { 415 | $video.css({ 416 | width: 'auto', 417 | 418 | // +2 pixels to prevent an empty space after transformation 419 | height: wrapperHeight + 2 420 | }); 421 | } 422 | }; 423 | 424 | /** 425 | * Destroy a video background 426 | * @public 427 | */ 428 | Vide.prototype.destroy = function() { 429 | delete $[PLUGIN_NAME].lookup[this.index]; 430 | this.$video && this.$video.off(PLUGIN_NAME); 431 | this.$element.off(PLUGIN_NAME).removeData(PLUGIN_NAME); 432 | this.$wrapper.remove(); 433 | }; 434 | 435 | /** 436 | * Special plugin object for instances. 437 | * @public 438 | * @type {Object} 439 | */ 440 | $[PLUGIN_NAME] = { 441 | lookup: [] 442 | }; 443 | 444 | /** 445 | * Plugin constructor 446 | * @param {Object|String} path 447 | * @param {Object|String} options 448 | * @returns {JQuery} 449 | * @constructor 450 | */ 451 | $.fn[PLUGIN_NAME] = function(path, options) { 452 | var instance; 453 | 454 | this.each(function() { 455 | instance = $.data(this, PLUGIN_NAME); 456 | 457 | // Destroy the plugin instance if exists 458 | instance && instance.destroy(); 459 | 460 | // Create the plugin instance 461 | instance = new Vide(this, path, options); 462 | instance.index = $[PLUGIN_NAME].lookup.push(instance) - 1; 463 | $.data(this, PLUGIN_NAME, instance); 464 | }); 465 | 466 | return this; 467 | }; 468 | 469 | $(document).ready(function() { 470 | var $window = $(window); 471 | 472 | // Window resize event listener 473 | $window.on('resize.' + PLUGIN_NAME, function() { 474 | for (var len = $[PLUGIN_NAME].lookup.length, i = 0, instance; i < len; i++) { 475 | instance = $[PLUGIN_NAME].lookup[i]; 476 | 477 | if (instance && instance.settings.resizing) { 478 | instance.resize(); 479 | } 480 | } 481 | }); 482 | 483 | // https://github.com/VodkaBears/Vide/issues/68 484 | $window.on('unload.' + PLUGIN_NAME, function() { 485 | return false; 486 | }); 487 | 488 | // Auto initialization 489 | // Add 'data-vide-bg' attribute with a path to the video without extension 490 | // Also you can pass options throw the 'data-vide-options' attribute 491 | // 'data-vide-options' must be like 'muted: false, volume: 0.5' 492 | $(document).find('[data-' + PLUGIN_NAME + '-bg]').each(function(i, element) { 493 | var $element = $(element); 494 | var options = $element.data(PLUGIN_NAME + '-options'); 495 | var path = $element.data(PLUGIN_NAME + '-bg'); 496 | 497 | $element[PLUGIN_NAME](path, options); 498 | }); 499 | }); 500 | 501 | }); 502 | -------------------------------------------------------------------------------- /docs/vendor/vide/jquery.vide.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Vide - v0.5.1 3 | * Easy as hell jQuery plugin for video backgrounds. 4 | * http://vodkabears.github.io/vide/ 5 | * 6 | * Made by Ilya Makarov 7 | * Under MIT License 8 | */ 9 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b("object"==typeof exports?require("jquery"):a.jQuery)}(this,function(a){"use strict";function b(a){var b,c,d,e,f,g,h,i={};for(f=a.replace(/\s*:\s*/g,":").replace(/\s*,\s*/g,",").split(","),h=0,g=f.length;h').on("load",d),a('').on("load",d),a('').on("load",d),a('').on("load",d)}function e(c,d,e){if(this.$element=a(c),"string"==typeof d&&(d=b(d)),e?"string"==typeof e&&(e=b(e)):e={},"string"==typeof d)d=d.replace(/\.\w*$/,"");else if("object"==typeof d)for(var f in d)d.hasOwnProperty(f)&&(d[f]=d[f].replace(/\.\w*$/,""));this.settings=a.extend({},g,e),this.path=d;try{this.init()}catch(i){if(i.message!==h)throw i}}var f="vide",g={volume:1,playbackRate:1,muted:!0,loop:!0,autoplay:!0,position:"50% 50%",posterType:"detect",resizing:!0,bgColor:"transparent",className:""},h="Not implemented";e.prototype.init=function(){var b,e,f=this,g=f.path,i=g,j="",k=f.$element,l=f.settings,m=c(l.position),n=l.posterType;e=f.$wrapper=a("
").addClass(l.className).css({position:"absolute","z-index":-1,top:0,left:0,bottom:0,right:0,overflow:"hidden","-webkit-background-size":"cover","-moz-background-size":"cover","-o-background-size":"cover","background-size":"cover","background-color":l.bgColor,"background-repeat":"no-repeat","background-position":m.x+" "+m.y}),"object"==typeof g&&(g.poster?i=g.poster:g.mp4?i=g.mp4:g.webm?i=g.webm:g.ogv&&(i=g.ogv)),"detect"===n?d(i,function(a){e.css("background-image","url("+a+")")}):"none"!==n&&e.css("background-image","url("+i+"."+n+")"),"static"===k.css("position")&&k.css("position","relative"),k.prepend(e),"object"==typeof g?(g.mp4&&(j+=''),g.webm&&(j+=''),g.ogv&&(j+=''),b=f.$video=a("")):b=f.$video=a('');try{b.prop({autoplay:l.autoplay,loop:l.loop,volume:l.volume,muted:l.muted,defaultMuted:l.muted,playbackRate:l.playbackRate,defaultPlaybackRate:l.playbackRate})}catch(o){throw new Error(h)}b.css({margin:"auto",position:"absolute","z-index":-1,top:m.y,left:m.x,"-webkit-transform":"translate(-"+m.x+", -"+m.y+")","-ms-transform":"translate(-"+m.x+", -"+m.y+")","-moz-transform":"translate(-"+m.x+", -"+m.y+")",transform:"translate(-"+m.x+", -"+m.y+")",visibility:"hidden",opacity:0}).one("canplaythrough.vide",function(){f.resize()}).one("playing.vide",function(){b.css({visibility:"visible",opacity:1}),e.css("background-image","none")}),k.on("resize.vide",function(){l.resizing&&f.resize()}),e.append(b)},e.prototype.getVideoObject=function(){return this.$video[0]},e.prototype.resize=function(){if(this.$video){var a=this.$wrapper,b=this.$video,c=b[0],d=c.videoHeight,e=c.videoWidth,f=a.height(),g=a.width();g/e>f/d?b.css({width:g+2,height:"auto"}):b.css({width:"auto",height:f+2})}},e.prototype.destroy=function(){delete a[f].lookup[this.index],this.$video&&this.$video.off(f),this.$element.off(f).removeData(f),this.$wrapper.remove()},a[f]={lookup:[]},a.fn[f]=function(b,c){var d;return this.each(function(){d=a.data(this,f),d&&d.destroy(),d=new e(this,b,c),d.index=a[f].lookup.push(d)-1,a.data(this,f,d)}),this},a(document).ready(function(){var b=a(window);b.on("resize.vide",function(){for(var b,c=a[f].lookup.length,d=0;d= 0) { 361 | target = event.target || event.srcElement; 362 | return target.className = target.className.replace(this.config.animateClass, '').trim(); 363 | } 364 | }; 365 | 366 | WOW.prototype.customStyle = function(box, hidden, duration, delay, iteration) { 367 | if (hidden) { 368 | this.cacheAnimationName(box); 369 | } 370 | box.style.visibility = hidden ? 'hidden' : 'visible'; 371 | if (duration) { 372 | this.vendorSet(box.style, { 373 | animationDuration: duration 374 | }); 375 | } 376 | if (delay) { 377 | this.vendorSet(box.style, { 378 | animationDelay: delay 379 | }); 380 | } 381 | if (iteration) { 382 | this.vendorSet(box.style, { 383 | animationIterationCount: iteration 384 | }); 385 | } 386 | this.vendorSet(box.style, { 387 | animationName: hidden ? 'none' : this.cachedAnimationName(box) 388 | }); 389 | return box; 390 | }; 391 | 392 | WOW.prototype.vendors = ["moz", "webkit"]; 393 | 394 | WOW.prototype.vendorSet = function(elem, properties) { 395 | var name, results, value, vendor; 396 | results = []; 397 | for (name in properties) { 398 | value = properties[name]; 399 | elem["" + name] = value; 400 | results.push((function() { 401 | var j, len, ref, results1; 402 | ref = this.vendors; 403 | results1 = []; 404 | for (j = 0, len = ref.length; j < len; j++) { 405 | vendor = ref[j]; 406 | results1.push(elem["" + vendor + (name.charAt(0).toUpperCase()) + (name.substr(1))] = value); 407 | } 408 | return results1; 409 | }).call(this)); 410 | } 411 | return results; 412 | }; 413 | 414 | WOW.prototype.vendorCSS = function(elem, property) { 415 | var j, len, ref, result, style, vendor; 416 | style = getComputedStyle(elem); 417 | result = style.getPropertyCSSValue(property); 418 | ref = this.vendors; 419 | for (j = 0, len = ref.length; j < len; j++) { 420 | vendor = ref[j]; 421 | result = result || style.getPropertyCSSValue("-" + vendor + "-" + property); 422 | } 423 | return result; 424 | }; 425 | 426 | WOW.prototype.animationName = function(box) { 427 | var animationName, error; 428 | try { 429 | animationName = this.vendorCSS(box, 'animation-name').cssText; 430 | } catch (error) { 431 | animationName = getComputedStyle(box).getPropertyValue('animation-name'); 432 | } 433 | if (animationName === 'none') { 434 | return ''; 435 | } else { 436 | return animationName; 437 | } 438 | }; 439 | 440 | WOW.prototype.cacheAnimationName = function(box) { 441 | return this.animationNameCache.set(box, this.animationName(box)); 442 | }; 443 | 444 | WOW.prototype.cachedAnimationName = function(box) { 445 | return this.animationNameCache.get(box); 446 | }; 447 | 448 | WOW.prototype.scrollHandler = function() { 449 | return this.scrolled = true; 450 | }; 451 | 452 | WOW.prototype.scrollCallback = function() { 453 | var box; 454 | if (this.scrolled) { 455 | this.scrolled = false; 456 | this.boxes = (function() { 457 | var j, len, ref, results; 458 | ref = this.boxes; 459 | results = []; 460 | for (j = 0, len = ref.length; j < len; j++) { 461 | box = ref[j]; 462 | if (!(box)) { 463 | continue; 464 | } 465 | if (this.isVisible(box)) { 466 | this.show(box); 467 | continue; 468 | } 469 | results.push(box); 470 | } 471 | return results; 472 | }).call(this); 473 | if (!(this.boxes.length || this.config.live)) { 474 | return this.stop(); 475 | } 476 | } 477 | }; 478 | 479 | WOW.prototype.offsetTop = function(element) { 480 | var top; 481 | while (element.offsetTop === void 0) { 482 | element = element.parentNode; 483 | } 484 | top = element.offsetTop; 485 | while (element = element.offsetParent) { 486 | top += element.offsetTop; 487 | } 488 | return top; 489 | }; 490 | 491 | WOW.prototype.isVisible = function(box) { 492 | var bottom, offset, top, viewBottom, viewTop; 493 | offset = box.getAttribute('data-wow-offset') || this.config.offset; 494 | viewTop = (this.config.scrollContainer && this.config.scrollContainer.scrollTop) || window.pageYOffset; 495 | viewBottom = viewTop + Math.min(this.element.clientHeight, this.util().innerHeight()) - offset; 496 | top = this.offsetTop(box); 497 | bottom = top + box.clientHeight; 498 | return top <= viewBottom && bottom >= viewTop; 499 | }; 500 | 501 | WOW.prototype.util = function() { 502 | return this._util != null ? this._util : this._util = new Util(); 503 | }; 504 | 505 | WOW.prototype.disabled = function() { 506 | return !this.config.mobile && this.util().isMobile(navigator.userAgent); 507 | }; 508 | 509 | return WOW; 510 | 511 | })(); 512 | 513 | }).call(this); 514 | -------------------------------------------------------------------------------- /docs/vendor/wowjs/wow.min.js: -------------------------------------------------------------------------------- 1 | /*! WOW - v1.1.2 - 2016-04-08 2 | * Copyright (c) 2016 Matthieu Aussaguel;*/(function(){var a,b,c,d,e,f=function(a,b){return function(){return a.apply(b,arguments)}},g=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=function(){function a(){}return a.prototype.extend=function(a,b){var c,d;for(c in b)d=b[c],null==a[c]&&(a[c]=d);return a},a.prototype.isMobile=function(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)},a.prototype.createEvent=function(a,b,c,d){var e;return null==b&&(b=!1),null==c&&(c=!1),null==d&&(d=null),null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e},a.prototype.emitEvent=function(a,b){return null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b in(null!=a)?a["on"+b]():void 0},a.prototype.addEvent=function(a,b,c){return null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c},a.prototype.removeEvent=function(a,b,c){return null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]},a.prototype.innerHeight=function(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight},a}(),c=this.WeakMap||this.MozWeakMap||(c=function(){function a(){this.keys=[],this.values=[]}return a.prototype.get=function(a){var b,c,d,e,f;for(f=this.keys,b=d=0,e=f.length;e>d;b=++d)if(c=f[b],c===a)return this.values[b]},a.prototype.set=function(a,b){var c,d,e,f,g;for(g=this.keys,c=e=0,f=g.length;f>e;c=++e)if(d=g[c],d===a)return void(this.values[c]=b);return this.keys.push(a),this.values.push(b)},a}()),a=this.MutationObserver||this.WebkitMutationObserver||this.MozMutationObserver||(a=function(){function a(){"undefined"!=typeof console&&null!==console&&console.warn("MutationObserver is not supported by your browser."),"undefined"!=typeof console&&null!==console&&console.warn("WOW.js cannot detect dom mutations, please call .sync() after loading new content.")}return a.notSupported=!0,a.prototype.observe=function(){},a}()),d=this.getComputedStyle||function(a,b){return this.getPropertyValue=function(b){var c;return"float"===b&&(b="styleFloat"),e.test(b)&&b.replace(e,function(a,b){return b.toUpperCase()}),(null!=(c=a.currentStyle)?c[b]:void 0)||null},this},e=/(\-([a-z]){1})/g,this.WOW=function(){function e(a){null==a&&(a={}),this.scrollCallback=f(this.scrollCallback,this),this.scrollHandler=f(this.scrollHandler,this),this.resetAnimation=f(this.resetAnimation,this),this.start=f(this.start,this),this.scrolled=!0,this.config=this.util().extend(a,this.defaults),null!=a.scrollContainer&&(this.config.scrollContainer=document.querySelector(a.scrollContainer)),this.animationNameCache=new c,this.wowEvent=this.util().createEvent(this.config.boxClass)}return e.prototype.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0,live:!0,callback:null,scrollContainer:null},e.prototype.init=function(){var a;return this.element=window.document.documentElement,"interactive"===(a=document.readyState)||"complete"===a?this.start():this.util().addEvent(document,"DOMContentLoaded",this.start),this.finished=[]},e.prototype.start=function(){var b,c,d,e;if(this.stopped=!1,this.boxes=function(){var a,c,d,e;for(d=this.element.querySelectorAll("."+this.config.boxClass),e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.all=function(){var a,c,d,e;for(d=this.boxes,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.boxes.length)if(this.disabled())this.resetStyle();else for(e=this.boxes,c=0,d=e.length;d>c;c++)b=e[c],this.applyStyle(b,!0);return this.disabled()||(this.util().addEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().addEvent(window,"resize",this.scrollHandler),this.interval=setInterval(this.scrollCallback,50)),this.config.live?new a(function(a){return function(b){var c,d,e,f,g;for(g=[],c=0,d=b.length;d>c;c++)f=b[c],g.push(function(){var a,b,c,d;for(c=f.addedNodes||[],d=[],a=0,b=c.length;b>a;a++)e=c[a],d.push(this.doSync(e));return d}.call(a));return g}}(this)).observe(document.body,{childList:!0,subtree:!0}):void 0},e.prototype.stop=function(){return this.stopped=!0,this.util().removeEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().removeEvent(window,"resize",this.scrollHandler),null!=this.interval?clearInterval(this.interval):void 0},e.prototype.sync=function(b){return a.notSupported?this.doSync(this.element):void 0},e.prototype.doSync=function(a){var b,c,d,e,f;if(null==a&&(a=this.element),1===a.nodeType){for(a=a.parentNode||a,e=a.querySelectorAll("."+this.config.boxClass),f=[],c=0,d=e.length;d>c;c++)b=e[c],g.call(this.all,b)<0?(this.boxes.push(b),this.all.push(b),this.stopped||this.disabled()?this.resetStyle():this.applyStyle(b,!0),f.push(this.scrolled=!0)):f.push(void 0);return f}},e.prototype.show=function(a){return this.applyStyle(a),a.className=a.className+" "+this.config.animateClass,null!=this.config.callback&&this.config.callback(a),this.util().emitEvent(a,this.wowEvent),this.util().addEvent(a,"animationend",this.resetAnimation),this.util().addEvent(a,"oanimationend",this.resetAnimation),this.util().addEvent(a,"webkitAnimationEnd",this.resetAnimation),this.util().addEvent(a,"MSAnimationEnd",this.resetAnimation),a},e.prototype.applyStyle=function(a,b){var c,d,e;return d=a.getAttribute("data-wow-duration"),c=a.getAttribute("data-wow-delay"),e=a.getAttribute("data-wow-iteration"),this.animate(function(f){return function(){return f.customStyle(a,b,d,c,e)}}(this))},e.prototype.animate=function(){return"requestAnimationFrame"in window?function(a){return window.requestAnimationFrame(a)}:function(a){return a()}}(),e.prototype.resetStyle=function(){var a,b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(a.style.visibility="visible");return e},e.prototype.resetAnimation=function(a){var b;return a.type.toLowerCase().indexOf("animationend")>=0?(b=a.target||a.srcElement,b.className=b.className.replace(this.config.animateClass,"").trim()):void 0},e.prototype.customStyle=function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a},e.prototype.vendors=["moz","webkit"],e.prototype.vendorSet=function(a,b){var c,d,e,f;d=[];for(c in b)e=b[c],a[""+c]=e,d.push(function(){var b,d,g,h;for(g=this.vendors,h=[],b=0,d=g.length;d>b;b++)f=g[b],h.push(a[""+f+c.charAt(0).toUpperCase()+c.substr(1)]=e);return h}.call(this));return d},e.prototype.vendorCSS=function(a,b){var c,e,f,g,h,i;for(h=d(a),g=h.getPropertyCSSValue(b),f=this.vendors,c=0,e=f.length;e>c;c++)i=f[c],g=g||h.getPropertyCSSValue("-"+i+"-"+b);return g},e.prototype.animationName=function(a){var b;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=d(a).getPropertyValue("animation-name")}return"none"===b?"":b},e.prototype.cacheAnimationName=function(a){return this.animationNameCache.set(a,this.animationName(a))},e.prototype.cachedAnimationName=function(a){return this.animationNameCache.get(a)},e.prototype.scrollHandler=function(){return this.scrolled=!0},e.prototype.scrollCallback=function(){var a;return!this.scrolled||(this.scrolled=!1,this.boxes=function(){var b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],a&&(this.isVisible(a)?this.show(a):e.push(a));return e}.call(this),this.boxes.length||this.config.live)?void 0:this.stop()},e.prototype.offsetTop=function(a){for(var b;void 0===a.offsetTop;)a=a.parentNode;for(b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop;return b},e.prototype.isVisible=function(a){var b,c,d,e,f;return c=a.getAttribute("data-wow-offset")||this.config.offset,f=this.config.scrollContainer&&this.config.scrollContainer.scrollTop||window.pageYOffset,e=f+Math.min(this.element.clientHeight,this.util().innerHeight())-c,d=this.offsetTop(a),b=d+a.clientHeight,e>=d&&b>=f},e.prototype.util=function(){return null!=this._util?this._util:this._util=new b},e.prototype.disabled=function(){return!this.config.mobile&&this.util().isMobile(navigator.userAgent)},e}()}).call(this); -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require("coffee-script/register") 4 | module.exports = require("./src/meshblu-core-runner") 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "meshblu-server", 3 | "version": "5.3.5", 4 | "description": "A bundled version of meshblu-core", 5 | "main": "dist/meshblu-core-runner.js", 6 | "repository": { 7 | "url": "git@github.com:octoblu/meshblu.git", 8 | "type": "git" 9 | }, 10 | "bin": { 11 | "meshblu": "./command.js" 12 | }, 13 | "scripts": { 14 | "start": "node command.js", 15 | "start:profile": "node --trace-sync-io command.js", 16 | "test": "./test-start.sh --test-start", 17 | "build": "coffee --compile --output dist/ --map src/*.coffee" 18 | }, 19 | "author": "Octoblu, Inc ", 20 | "license": "MIT", 21 | "dependencies": { 22 | "async": "^2.5.0", 23 | "coffee-script": "^1.12.7", 24 | "dashdash": "^1.14.0", 25 | "debug": "^3.1.0", 26 | "meshblu-core-dispatcher": "^20.1.5", 27 | "meshblu-core-firehose-socket.io": "^2.0.1", 28 | "meshblu-core-protocol-adapter-http": "^6.1.3", 29 | "meshblu-core-worker-webhook": "^4.1.8", 30 | "sigterm-handler": "^2.0.0", 31 | "uuid": "^3.1.0" 32 | } 33 | } -------------------------------------------------------------------------------- /run-in-docker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | SCRIPT_NAME='run-in-docker' 4 | 5 | matches_debug() { 6 | if [ -z "$DEBUG" ]; then 7 | return 1 8 | fi 9 | if [[ $SCRIPT_NAME == "$DEBUG" ]]; then 10 | return 0 11 | fi 12 | return 1 13 | } 14 | 15 | debug() { 16 | local cyan='\033[0;36m' 17 | local no_color='\033[0;0m' 18 | local message="$@" 19 | matches_debug || return 0 20 | (>&2 echo -e "[${cyan}${SCRIPT_NAME}${no_color}]: $message") 21 | } 22 | 23 | script_directory(){ 24 | local source="${BASH_SOURCE[0]}" 25 | local dir="" 26 | 27 | while [ -h "$source" ]; do # resolve $source until the file is no longer a symlink 28 | dir="$( cd -P "$( dirname "$source" )" && pwd )" 29 | source="$(readlink "$source")" 30 | [[ $source != /* ]] && source="$dir/$source" # if $source was a relative symlink, we need to resolve it relative to the path where the symlink file was located 31 | done 32 | 33 | dir="$( cd -P "$( dirname "$source" )" && pwd )" 34 | 35 | echo "$dir" 36 | } 37 | 38 | assert_required_params() { 39 | local example_arg="$1" 40 | 41 | if [ -n "$example_arg" ]; then 42 | return 0 43 | fi 44 | 45 | usage 46 | 47 | if [ -z "$example_arg" ]; then 48 | echo "Missing example_arg argument" 49 | fi 50 | 51 | exit 1 52 | } 53 | 54 | usage(){ 55 | echo "USAGE: ${SCRIPT_NAME}" 56 | echo '' 57 | echo 'Description: ...' 58 | echo '' 59 | echo 'Arguments:' 60 | echo ' -h, --help print this help text' 61 | echo ' -v, --version print the version' 62 | echo '' 63 | echo 'Environment:' 64 | echo ' DEBUG print debug output' 65 | echo '' 66 | } 67 | 68 | version(){ 69 | local directory 70 | directory="$(script_directory)" 71 | 72 | if [ -f "$directory/VERSION" ]; then 73 | cat "$directory/VERSION" 74 | else 75 | echo "unknown-version" 76 | fi 77 | } 78 | 79 | build() { 80 | docker build -t local/meshblu:dev . 81 | } 82 | 83 | cleanup(){ 84 | cleanup_meshblu \ 85 | && cleanup_mongo \ 86 | && cleanup_redis \ 87 | && cleanup_network 88 | } 89 | 90 | cleanup_meshblu(){ 91 | docker ps | awk '{print $NF}' | grep '^meshblu$' /dev/null || return 0 92 | 93 | docker rm -f meshblu > /dev/null 94 | } 95 | 96 | cleanup_mongo(){ 97 | docker ps | awk '{print $NF}' | grep '^meshblu-mongo$' > /dev/null || return 0 98 | 99 | docker rm -f meshblu-mongo > /dev/null 100 | } 101 | 102 | cleanup_network(){ 103 | docker network ls | awk '{print $2}' | grep '^meshblu$' > /dev/null || return 0 104 | 105 | docker network rm meshblu > /dev/null 106 | } 107 | 108 | cleanup_redis(){ 109 | docker ps | awk '{print $NF}' | grep '^meshblu-redis$' > /dev/null || return 0 110 | 111 | docker rm -f meshblu-redis > /dev/null 112 | } 113 | 114 | create_network() { 115 | docker network create --attachable meshblu > /dev/null 116 | } 117 | 118 | run() { 119 | create_network \ 120 | && run_mongo \ 121 | && run_redis \ 122 | && printf '\n================\nStarting meshblu...\n===============\n' \ 123 | && run_meshblu 124 | } 125 | 126 | run_meshblu() { 127 | docker run --env-file=./sample.env --network=meshblu --publish=3000:80 local/meshblu:dev 128 | } 129 | 130 | run_mongo() { 131 | docker run --detach --name=meshblu-mongo --network=meshblu --publish=27017 mongo 132 | } 133 | 134 | run_redis() { 135 | docker run --detach --name=meshblu-redis --network=meshblu --publish=6379 redis 136 | } 137 | 138 | main() { 139 | # Define args up here 140 | while [ "$1" != "" ]; do 141 | local param="$1" 142 | # local value="$2" 143 | case "$param" in 144 | -h | --help) 145 | usage 146 | exit 0 147 | ;; 148 | -v | --version) 149 | version 150 | exit 0 151 | ;; 152 | # Arg with value 153 | # -x | --example) 154 | # example="$value" 155 | # shift 156 | # ;; 157 | # Arg without value 158 | # -e | --example-flag) 159 | # example_flag='true' 160 | # ;; 161 | *) 162 | if [ "${param::1}" == '-' ]; then 163 | echo "ERROR: unknown parameter \"$param\"" 164 | usage 165 | exit 1 166 | fi 167 | # Set main arguments 168 | # if [ -z "$main_arg" ]; then 169 | # main_arg="$param" 170 | # elif [ -z "$main_arg_2"]; then 171 | # main_arg_2="$param" 172 | # fi 173 | ;; 174 | esac 175 | shift 176 | done 177 | 178 | # assert_required_params "$example_arg" 179 | cleanup && build && run 180 | } 181 | 182 | main "$@" 183 | -------------------------------------------------------------------------------- /sample.env: -------------------------------------------------------------------------------- 1 | MONGODB_URI=mongodb://meshblu-mongo:27017/meshblu 2 | PRIVATE_KEY_BASE64=LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBenNZYS9mdi9NVFdkeTRwMUhLVDlpb0FTNStaTHdjY0RIWDYxN3FtUXN2MzhFdXVVCjdkSGUvWTNDeWpkZ1pxU1pZcmxySDkwMVIwTUFhdFoxd2xleWN5ZHV1KzJNWVZlRmtqSlBmajN1UUdkUHJ2bTgKWDQ4VlVEenU2b002bm96ZUFINFVUNEpoVEwraTlKZmROOE9KRVozMzd6MlpHMDZ4Sk04R1BZNWVxWVhidExsMgpmbDErTW55RDlLVWozQ2xCR1I1bkFTczVhUWhadWowN3ZQUnQrREF5ZmtqYmhaakc2V0dEc2RIaGhpdFpLNC9NCkR1enc2c2pOcUJQdjBDQzBtT3EyTEw5OGttWjk2TFJEM0pJbHZSdzl1Y3RUallyVUpOemNJRUJ4Q3h1cjllQ3oKVnlYRWtib09QanZTTUZaT1pkeXVyckR5UmNVU3ZwK2NYZUVPZ1FJREFRQUJBb0lCQUJyRlVWZFMyZjVnQjdjRApqUmdSVUhZdkVNT1BjSDE5SzYwVTY2OGpxd1ZSbHVKSU4vYjJkaDF6emlWcU9BUHlDWjNiamNBSlhzMkVJaml5CjNYbzA2bmk0UVVENWgzUk81WTlCRGtPMDl2VEZxMjVuRFBsK1IrOGtoSFkrV1VlUHkycGE2SHhHMEJ3a3I0OWwKWGhITE1pTGl4ZWZtbkwwSldpdisxYnNBaE1jRHZ2VGhKWnp4Z0F5T01Va1JKMGwxdUVlbzlmelZqQ2JjRThsMAo2dDdnOXdSbEd2WXVJdllLWmpoR094UzhFRVlrS1Z3RXJxdG8vMmM4dm0rSmpNaHkvQU92MUFKcCtGTHNCenBwCkQzcS9NUmM5eEdFV2U3S3NyNi9xdGpmVDY4dHdUT2FtVVdQc0U2aXlDYnNCNDR6aHQ3VjJWRURELzFhT3Y5WEoKNnhlL0xYRUNnWUVBOVRtdm5FdE5TYnd5NFBCL0NlWHA4Ym1aL1JHbXNDd2JUZkxkeG1heHNPZlUzNUtBU3NmOQpJZERFTzV2RjhEOUZkUXdyMmZpNzVSbEM1Nms3SCtqbmpBN09OanUvRVZPQytVMzY2QnRSemZhVlRidEhzM2dHCkQ4Z1Jra3RBdnRqNUc0MkdldUl2c3V3bmZob2Z1OVdaWG56Z1c4RkQ4eEY5b1AyT2lXV1BUbjBDZ1lFQTE5dnEKQWRkZTNGVEthVE54akZJODl1NUhWQkZpSy85bWpncGtMMi9wTWNqQjdLSVNzT1hCSzIxQ296UUlPekIvZ1pROQpzc2tOL2tPKzN2VUt0SUlST25EVk54SkgzeHJxRnpqQUhybVpETmtkM1J5UmltTHM3NnR3QkhQdlV4M1R2MXJqCnZQMkgzZ2YveE5Gc1BBdDRsUTlrWEp3RVpDdGdRMTJDbkZraEsxVUNnWUFCckM0TmM5b0lHYmVESDBET2tYbmkKQXpFUXI5RWlQSHJITWxQZTZZNW10WDRYTkVtWnVQbDZCSkdDRXBMc0M1SnV0UEdMb0Eyd0IxY1VlMndDMExUYgptTEpCWG5EMExreWpaS3ZFYjRORVUxMDdWWDZzczdIZTQ2OXkvdjVuRHRYTUlVLzhnSlJ3dFBtais0dWgzVmdaCmMrS1gzWjZZQnRPRGlKY3pTclVLaFFLQmdESW80eWJNWWptMjVsWXQ0eHZsWEU5UkxYZ0dsaFo5UWRxTjVadjAKV0c3K0pMb1ZLMXk1OXZwZGFGZStWbzlTaEw2YXNQK2pvc0hNQWtXVEVZckNrcmhPMGV6N0xZSlZvY0lGcVBjNgp6NnJocFFQbGlKaHN4bnduRFYrcmhSaCtYTjhoZ3J3KytkeUpaVkRhRFZtaW5NR2Vrd2JHSm1zVWZVa0tLTGltCktZUUZBb0dBQU9ieFU2d0Y2YzZobURrMkczQmh0SjI3b1BEa1RsUEg0V3dDYUpaMXhvTkdnSWs4cjVEUkR5aVgKelF3SnJPYmJhTXlMbkUxenJPMU83QWJseEdVUnRhbm5qUTR1WUlsbDRLWEVnQTBNWnVlUnlFU1dURnM4TVNtbQpaMXIxRVJSQVVHeG5nVE9aNkY2WFlsaW45eEtaZ0NyUmxDbng4VFRZazNRTDBHZEk5WEk9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== 3 | PUBLIC_KEY_BASE64=LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF6c1lhL2Z2L01UV2R5NHAxSEtUOQppb0FTNStaTHdjY0RIWDYxN3FtUXN2MzhFdXVVN2RIZS9ZM0N5amRnWnFTWllybHJIOTAxUjBNQWF0WjF3bGV5CmN5ZHV1KzJNWVZlRmtqSlBmajN1UUdkUHJ2bThYNDhWVUR6dTZvTTZub3plQUg0VVQ0SmhUTCtpOUpmZE44T0oKRVozMzd6MlpHMDZ4Sk04R1BZNWVxWVhidExsMmZsMStNbnlEOUtVajNDbEJHUjVuQVNzNWFRaFp1ajA3dlBSdAorREF5ZmtqYmhaakc2V0dEc2RIaGhpdFpLNC9NRHV6dzZzak5xQlB2MENDMG1PcTJMTDk4a21aOTZMUkQzSklsCnZSdzl1Y3RUallyVUpOemNJRUJ4Q3h1cjllQ3pWeVhFa2JvT1BqdlNNRlpPWmR5dXJyRHlSY1VTdnArY1hlRU8KZ1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg== 4 | REDIS_URI=redis://meshblu-redis:6379 5 | CACHE_REDIS_URI=redis://meshblu-redis:6379 6 | FIREHOSE_REDIS_URI=redis://meshblu-redis:6379 7 | JOB_LOG_REDIS_URI=redis://meshblu-redis:6379 8 | TOKEN=super-secret 9 | -------------------------------------------------------------------------------- /src/meshblu-core-runner.coffee: -------------------------------------------------------------------------------- 1 | async = require('async') 2 | {EventEmitter} = require 'events' 3 | DispatcherWorker = require('meshblu-core-dispatcher') 4 | MeshbluHttp = require('meshblu-core-protocol-adapter-http') 5 | MeshbluFirehose = require('meshblu-core-firehose-socket.io') 6 | WebhookWorker = require('meshblu-core-worker-webhook') 7 | debug = require('debug')('meshblu:meshblu-core-runner') 8 | 9 | class MeshbluCoreRunner extends EventEmitter 10 | constructor: (options) -> 11 | @dispatcherWorker = new DispatcherWorker options.dispatcherWorker 12 | @meshbluHttp = new MeshbluHttp options.meshbluHttp 13 | if @_isFirehoseEnabled options 14 | @meshbluFirehose = new MeshbluFirehose options.meshbluFirehose 15 | if @_isWebhookWorkerEnabled options 16 | @webhookWorker = new WebhookWorker options.webhookWorker 17 | 18 | catchErrors: => 19 | debug '->catchErrors' 20 | @dispatcherWorker.catchErrors() 21 | 22 | destroy: (callback) => 23 | debug '->destroy' 24 | tasks = [] 25 | tasks.push @meshbluHttp.destroy 26 | tasks.push @meshbluFirehose.stop if @meshbluFirehose? 27 | tasks.push @dispatcherWorker.stop 28 | tasks.push @webhookWorker.stop if @webhookWorker? 29 | async.parallel tasks, callback 30 | 31 | prepare: (callback) => 32 | debug '->prepare' 33 | @dispatcherWorker.prepare callback 34 | 35 | reportError: => 36 | debug '->reportError' 37 | @dispatcherWorker.reportError arguments... 38 | 39 | stop: (callback) => 40 | debug '->stop' 41 | tasks = [] 42 | tasks.push @meshbluHttp.stop 43 | tasks.push @meshbluFirehose.stop if @meshbluFirehose? 44 | tasks.push @dispatcherWorker.stop 45 | tasks.push @webhookWorker.stop if @webhookWorker? 46 | async.parallel tasks, callback 47 | 48 | run: (callback) => 49 | debug '->run' 50 | @dispatcherWorker.run (error) => 51 | @emit 'error', error if error? 52 | 53 | @webhookWorker?.start (error) => 54 | @emit 'error', error if error? 55 | 56 | @meshbluFirehose?.run (error) => 57 | @emit 'error', error if error? 58 | 59 | @meshbluHttp.run callback 60 | 61 | _isFirehoseEnabled: (options) => 62 | return false unless options.meshbluFirehose? 63 | return !options.meshbluFirehose.disable 64 | 65 | _isWebhookWorkerEnabled: (options) => 66 | return false unless options.webhookWorker? 67 | return !options.webhookWorker.disable 68 | 69 | module.exports = MeshbluCoreRunner 70 | -------------------------------------------------------------------------------- /test-start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # For development usage only 6 | 7 | main() { 8 | env \ 9 | PRIVATE_KEY_BASE64="Ii0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS1cbk1JSUVvZ0lCQUFLQ0FRRUFnL283RUFQbDc2MW4rMWppc1Y2aE9MSU5iTXBFMHNjVVdwSjg5OW5RNnozS0FXV0pcbmM0RXVaOXJHZnNEVVJZUWNoUUNYZVoxV21WOWluV3liYXN0Y0liRGg0Y1l6K0oxUWRPQUNEWnFxL2ptY3hwZk1cbkVqR012VFFZM1JMd2lGTytlMmFkS29LUHRkQnpwUHl2dUg3SFJ3S0JqSEZId0cxeDlMalpXS21YRFUvOGNIQVhcbmNSRmRJdlBxYnZJWHQ4VjE5V3VHMnVEc2FvQytRNzdoc0RJd0xTQkVucENab1BIb0pITUJDZG9hdVJaTk9kSWFcblYzdTdFSDBUeExrek9CcVJYV09GV0crSFBLYURGZ2pjT1RidloyTHg5RkhRMjdZTHE5SFcxbGVpcENxbEpvR0hcbkM4T3pmZy9kRFVNTHRDZGNScmZYWXcyYVJHM1BsZGpoTHFQRXN3SURBUUFCQW9JQkFEa004SDhwMERuZGNmZWJcbkl0T2Rubi9OcURRQTgrTlJuNkRQZGlvR0JHUE1ZQWhlaGg1aUYxZFpvVGlsenAwR1VQWEZuYlU2cUhiQVh2YkNcblBpVGFKOGVBbVFScUU0bERKOForRnlVZVdSQndneTd0NjQ5cHovYnlFRlZ3bkgyeUJjTitSaTVjSmhkb05yVjVcbmJkU0pLVWV1ODZWc1NxSUtMWnFtVlg0WVFXM0ZLQU16SWoxeERJVHpmSHR0UG5VaFQ3WS9lK1lNa0xuVVg2UnhcbnJ5UkdtK0x4ZlRqdEFOSFZranlyL1VGMjQzSk9aZTFZQ1BTRzFKTmJDdnVMMHJCQ0pLRE41NXZ1YWI5MW9wZ2pcbkR5S1RNV1pxSzE5c2dieFV0SEF3cEMzVXlsbkM5eFdHTlphdFpROG9jTjRrL29VN1VxS2IyU1pIVFZGTmtpZkhcbk1BRVpROEVDZ1lFQXpFcERsb2V2S1JNeUducmxWQ2FGejVFWmhEZ1ZBRGJ0QkFpUFNmTWhoMjdYd0l3WitETlJcbmp0cGxTM0VpNHltSWRnbm1FWHlERFZsdUg5MnRyV0tPS1J3eFZJMU9UMTZGN0IyVUEzY2lWcW1KZmp6MFBDaWtcbjlOUkNFeUIxNENSaUF5UmlHWndEbkhXNko3K0pNSjBLM1JWWFpKWmFJZnZldVR6ZFBwSlBJQ01DZ1lFQXBXSXpcbmQzUlZRMzdpMnJkbWVsbjNYcHhzNGhLM2ViVU80VFRuRnJmQkF1QS9YcDhvVGtTaVNDd1dRaWNwM0xMTUdWWHRcbjVMUnhPMUFuNDlrL2pWREhYdGtxS1o2K00yTUZoQzFOM3RWNE1oTDFMVzltcmRUQUZKTXFLQWNneHhXcXU2R0hcbnpqQ1liRGpyTkpvL1F6a2t4bjJINHFIbW1lbEtKUkNOcnNvQnlqRUNnWUJ5YU5qblViL2dNaGJxUzQ5cGpGVitcblJKWFV2WS9OV2ZWdFA5bjNvVWxTenRuWHhONjZhUXN4Qk5DYjZwV09RUEZpb2ZLT01udzJtcklZK0k1T3Z4WThcbm9jUml4T3hwZU5kcHY3cm9JZTFDT1pwOTcyY2MxZXBrRHdlZUxKeTNWY2pxVjVMMUlySEhDd3VoUFJ4NDlFcGtcblBKS0FDOUFZbmpWQzZucEJrN0RxbndLQmdCcXNiZlNVTkxSQUlNSjUxZk5oMHozVktOS0Zoa1lBNTdkMjJ0YVZcbktISVlUT0FyOTBvNFU1d2tVQ3EzT2s4NEh5YnU3d0YyQU5VNkpsVGZVeHF0cnBvam1HTkNFUmNrbjEwa0dXMFpcbkxOdVdweWgrMFNhMEs0Nmw5YVNqRWF4S1dGRU95bUo4Ly9oa2JicjhMYnZmMllpUjhucWc5aHBZdi9hZVp0dU1cbkJTSGhBb0dBT3hYeUw1NXlmWU5sY1loRWhtdWUwWTJoZXpnZDcxeEJXNXM1UW5ibXY3VDRpMXJsM1VvWkNiM0RcbjZEM3QvTDk1VjBiWjJheE9BQkwvMEF6RDFqeDVaaFM4cG5jTzJJNVpZTEZob0RiOWlqYWRTSU9BNy9iQjYwdW1cbkxGNlNiT0cyM3BCTUxPRllyU0pOS3kyRzJuS2JZTlN4WGV6cW5xMXB4SWRSRWtRa3NiQT1cbi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tIgo=" \ 10 | PUBLIC_KEY_BASE64="Ii0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWcvbzdFQVBsNzYxbisxamlzVjZoXG5PTElOYk1wRTBzY1VXcEo4OTluUTZ6M0tBV1dKYzRFdVo5ckdmc0RVUllRY2hRQ1hlWjFXbVY5aW5XeWJhc3RjXG5JYkRoNGNZeitKMVFkT0FDRFpxcS9qbWN4cGZNRWpHTXZUUVkzUkx3aUZPK2UyYWRLb0tQdGRCenBQeXZ1SDdIXG5Sd0tCakhGSHdHMXg5TGpaV0ttWERVLzhjSEFYY1JGZEl2UHFidklYdDhWMTlXdUcydURzYW9DK1E3N2hzREl3XG5MU0JFbnBDWm9QSG9KSE1CQ2RvYXVSWk5PZElhVjN1N0VIMFR4TGt6T0JxUlhXT0ZXRytIUEthREZnamNPVGJ2XG5aMkx4OUZIUTI3WUxxOUhXMWxlaXBDcWxKb0dIQzhPemZnL2REVU1MdENkY1JyZlhZdzJhUkczUGxkamhMcVBFXG5zd0lEQVFBQlxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tIgo=" \ 11 | PEPPER='meshblu-test-pepper' \ 12 | MESHBLU_HTTP_PORT='3000' \ 13 | node command.js "$@" 14 | } 15 | 16 | main "$@" 17 | --------------------------------------------------------------------------------