├── .gitignore ├── favicon.ico ├── sass-watch.bat ├── icons ├── apple-icon.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon-96x96.png ├── ms-icon-70x70.png ├── apple-icon-57x57.png ├── apple-icon-60x60.png ├── apple-icon-72x72.png ├── apple-icon-76x76.png ├── ms-icon-144x144.png ├── ms-icon-150x150.png ├── ms-icon-310x310.png ├── android-icon-36x36.png ├── android-icon-48x48.png ├── android-icon-72x72.png ├── android-icon-96x96.png ├── apple-icon-114x114.png ├── apple-icon-120x120.png ├── apple-icon-144x144.png ├── apple-icon-152x152.png ├── apple-icon-180x180.png ├── android-icon-144x144.png ├── android-icon-192x192.png └── apple-icon-precomposed.png ├── data ├── textures │ ├── grass.png │ ├── moss.png │ ├── checker.png │ ├── fur-cow.png │ ├── fur-leo.png │ ├── fur-wolf.png │ ├── even-alpha.png │ ├── fur-chick.png │ ├── moss-alpha.png │ ├── bg-gradient.png │ └── uneven-alpha.png └── models │ ├── box10_rounded-indices.bin │ └── box10_rounded-strides.bin ├── styles ├── scss │ ├── _common.scss │ └── site.scss └── css │ ├── site.css.map │ ├── site.css │ └── theme.min.css ├── .editorconfig ├── js ├── app.js ├── app │ ├── framework │ │ ├── BinaryDataLoader.js │ │ ├── UncompressedTextureLoader.js │ │ ├── CompressedTextureLoader.js │ │ ├── FullModel.js │ │ ├── BaseShader.js │ │ ├── utils │ │ │ └── FullscreenUtils.js │ │ └── BaseRenderer.js │ ├── VignetteData.js │ ├── DiffuseColoredShader.js │ ├── DiffuseShader.js │ ├── FurPresets.js │ ├── main.js │ ├── FurShader.js │ └── FurRenderer.js └── lib │ └── require.js ├── browserconfig.xml ├── manifest.json ├── LICENSE.txt ├── README.md └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | /.sass-cache 2 | /node_modules 3 | /temp 4 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/favicon.ico -------------------------------------------------------------------------------- /sass-watch.bat: -------------------------------------------------------------------------------- 1 | sass --watch styles\scss\site.scss:styles\css\site.css --style compressed 2 | -------------------------------------------------------------------------------- /icons/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon.png -------------------------------------------------------------------------------- /data/textures/grass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/grass.png -------------------------------------------------------------------------------- /data/textures/moss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/moss.png -------------------------------------------------------------------------------- /icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/favicon-16x16.png -------------------------------------------------------------------------------- /icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/favicon-32x32.png -------------------------------------------------------------------------------- /icons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/favicon-96x96.png -------------------------------------------------------------------------------- /icons/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/ms-icon-70x70.png -------------------------------------------------------------------------------- /data/textures/checker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/checker.png -------------------------------------------------------------------------------- /data/textures/fur-cow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/fur-cow.png -------------------------------------------------------------------------------- /data/textures/fur-leo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/fur-leo.png -------------------------------------------------------------------------------- /data/textures/fur-wolf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/fur-wolf.png -------------------------------------------------------------------------------- /icons/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-57x57.png -------------------------------------------------------------------------------- /icons/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-60x60.png -------------------------------------------------------------------------------- /icons/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-72x72.png -------------------------------------------------------------------------------- /icons/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-76x76.png -------------------------------------------------------------------------------- /icons/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/ms-icon-144x144.png -------------------------------------------------------------------------------- /icons/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/ms-icon-150x150.png -------------------------------------------------------------------------------- /icons/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/ms-icon-310x310.png -------------------------------------------------------------------------------- /styles/scss/_common.scss: -------------------------------------------------------------------------------- 1 | $screen-sm-min: 768px; 2 | $screen-md-min: 992px; 3 | $screen-lg-min: 1200px; 4 | -------------------------------------------------------------------------------- /data/textures/even-alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/even-alpha.png -------------------------------------------------------------------------------- /data/textures/fur-chick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/fur-chick.png -------------------------------------------------------------------------------- /data/textures/moss-alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/moss-alpha.png -------------------------------------------------------------------------------- /icons/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-36x36.png -------------------------------------------------------------------------------- /icons/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-48x48.png -------------------------------------------------------------------------------- /icons/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-72x72.png -------------------------------------------------------------------------------- /icons/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-96x96.png -------------------------------------------------------------------------------- /icons/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-114x114.png -------------------------------------------------------------------------------- /icons/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-120x120.png -------------------------------------------------------------------------------- /icons/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-144x144.png -------------------------------------------------------------------------------- /icons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-152x152.png -------------------------------------------------------------------------------- /icons/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-180x180.png -------------------------------------------------------------------------------- /data/textures/bg-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/bg-gradient.png -------------------------------------------------------------------------------- /data/textures/uneven-alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/textures/uneven-alpha.png -------------------------------------------------------------------------------- /icons/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-144x144.png -------------------------------------------------------------------------------- /icons/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/android-icon-192x192.png -------------------------------------------------------------------------------- /icons/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/icons/apple-icon-precomposed.png -------------------------------------------------------------------------------- /data/models/box10_rounded-indices.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/models/box10_rounded-indices.bin -------------------------------------------------------------------------------- /data/models/box10_rounded-strides.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keaukraine/webgl-fur/HEAD/data/models/box10_rounded-strides.bin -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.html] 2 | indent_style = space 3 | indent_size = 4 4 | 5 | [*.css] 6 | indent_style = space 7 | indent_size = 4 8 | 9 | [*.scss] 10 | indent_style = space 11 | indent_size = 4 12 | 13 | [*.js] 14 | indent_style = space 15 | indent_size = 4 16 | -------------------------------------------------------------------------------- /js/app.js: -------------------------------------------------------------------------------- 1 | requirejs.config({ 2 | 'baseUrl': 'js/app', 3 | 'paths': { 4 | 'app': '../app', 5 | 'jquery': 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min', 6 | 'bootstrap-slider': 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.7.2/bootstrap-slider.min' 7 | } 8 | }); 9 | 10 | requirejs(['app/main']); 11 | -------------------------------------------------------------------------------- /browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | #ffffff 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /js/app/framework/BinaryDataLoader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(function() { 4 | 5 | function BinaryDataLoader() {} 6 | 7 | /** 8 | * Static function to load binary data 9 | * @param {string} url - URL for content 10 | * @param {Function} - callback to receive binary data 11 | */ 12 | BinaryDataLoader.load = function(url, callback) { 13 | var root = this, 14 | xhr = new XMLHttpRequest(); 15 | 16 | xhr.open('GET', url, true); 17 | xhr.responseType = 'arraybuffer'; 18 | xhr.onload = function() { 19 | callback && callback(this.response); 20 | }; 21 | xhr.send(null); 22 | } 23 | 24 | return BinaryDataLoader; 25 | }); 26 | -------------------------------------------------------------------------------- /js/app/VignetteData.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(function() { 4 | 5 | /** 6 | * Helper class to render billboard taking whole screen. 7 | * @class 8 | */ 9 | function VignetteData() { 10 | this.quadTriangles = [ 11 | // X, Y, Z, U, V 12 | -1.0, -1.0, -5.0, 0.0, 0.0, // 0. left-bottom 13 | 1.0, -1.0, -5.0, 1.0, 0.0, // 1. right-bottom 14 | -1.0, 1.0, -5.0, 0.0, 1.0, // 2. left-top 15 | 1.0, 1.0, -5.0, 1.0, 1.0 // 3. right-top 16 | ]; 17 | } 18 | 19 | VignetteData.prototype = { 20 | buffer: null, 21 | 22 | initGL: function(gl) { 23 | this.buffer = gl.createBuffer(); 24 | gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); 25 | gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.quadTriangles), gl.STATIC_DRAW); 26 | } 27 | } 28 | 29 | return VignetteData; 30 | }); 31 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/icons\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/icons\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/icons\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/icons\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/icons\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/icons\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /js/app/DiffuseColoredShader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(['DiffuseShader'], function(DiffuseShader) { 4 | 5 | /** 6 | * Simple diffuse texture multiplied by color shader. 7 | * @class 8 | */ 9 | class DiffuseColoredShader extends DiffuseShader { 10 | fillCode() { 11 | super.fillCode(); 12 | 13 | this.fragmentShaderCode = 'precision mediump float;\n' + 14 | 'varying vec2 vTextureCoord;\n' + 15 | 'uniform sampler2D sTexture;\n' + 16 | 'uniform vec4 color;\n' + 17 | '\n' + 18 | 'void main() {\n' + 19 | ' gl_FragColor = texture2D(sTexture, vTextureCoord) * color;\n' + 20 | '}'; 21 | } 22 | 23 | fillUniformsAttributes() { 24 | super.fillUniformsAttributes(); 25 | this.color = this.getUniform('color'); 26 | } 27 | } 28 | 29 | return DiffuseColoredShader; 30 | }); 31 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016-2017 Oleksandr Popov, Dmytro Popov 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 4 | files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 5 | modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 6 | is furnished to do so, subject to the following conditions: 7 | 8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 9 | 10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 11 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 12 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 13 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 14 | -------------------------------------------------------------------------------- /js/app/DiffuseShader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(['framework/BaseShader'], function(BaseShader) { 4 | 5 | /** 6 | * Simple diffuse texture shader. 7 | * @class 8 | */ 9 | class DiffuseShader extends BaseShader { 10 | fillCode() { 11 | this.vertexShaderCode = 'uniform mat4 view_proj_matrix;\n' + 12 | 'attribute vec4 rm_Vertex;\n' + 13 | 'attribute vec2 rm_TexCoord0;\n' + 14 | 'varying vec2 vTextureCoord;\n' + 15 | '\n' + 16 | 'void main() {\n' + 17 | ' gl_Position = view_proj_matrix * rm_Vertex;\n' + 18 | ' vTextureCoord = rm_TexCoord0;\n' + 19 | '}'; 20 | 21 | this.fragmentShaderCode = 'precision mediump float;\n' + 22 | 'varying vec2 vTextureCoord;\n' + 23 | 'uniform sampler2D sTexture;\n' + 24 | '\n' + 25 | 'void main() {\n' + 26 | ' gl_FragColor = texture2D(sTexture, vTextureCoord);\n' + 27 | '}'; 28 | } 29 | 30 | fillUniformsAttributes() { 31 | this.view_proj_matrix = this.getUniform('view_proj_matrix'); 32 | this.rm_Vertex = this.getAttrib('rm_Vertex'); 33 | this.rm_TexCoord0 = this.getAttrib('rm_TexCoord0'); 34 | this.sTexture = this.getUniform('sTexture'); 35 | } 36 | } 37 | 38 | return DiffuseShader; 39 | }); 40 | -------------------------------------------------------------------------------- /js/app/framework/UncompressedTextureLoader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(function() { 4 | 5 | /** 6 | * Constructor. No need to create an instance of this class because it has only static methods 7 | */ 8 | function UncompressedTextureLoader() {} 9 | 10 | /** 11 | * Loads texture from any image format supported by browser 12 | * @param {string} url - URL to texture 13 | * @param {Function} callbak - callback called after texture is loaded to GPU 14 | * @return {number} - WebGL texture 15 | */ 16 | UncompressedTextureLoader.load = function(url, callback) { 17 | var texture = gl.createTexture(); 18 | 19 | texture.image = new Image(); 20 | texture.image.src = url; 21 | texture.image.onload = function() { 22 | gl.bindTexture(gl.TEXTURE_2D, texture); 23 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.image); 24 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); 25 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); 26 | gl.bindTexture(gl.TEXTURE_2D, null); 27 | 28 | if (texture.image && texture.image.src) { 29 | console.log('Loaded texture ' + url + ' [' + texture.image.width + 'x' + texture.image.height + ']'); 30 | } 31 | 32 | callback && callback(); 33 | }; 34 | 35 | return texture; 36 | } 37 | 38 | return UncompressedTextureLoader; 39 | }); 40 | -------------------------------------------------------------------------------- /styles/css/site.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAEA,IAAK,CACD,gBAAgB,CAAE,IAAI,CAG1B,SAAU,CACN,OAAO,CAAE,KAAK,CACd,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CACb,aAAa,CAAE,GAAG,CAClB,aAAa,CAAE,IAAI,CACnB,MAAM,CAAE,sBAAsB,CAE9B,aAAM,CACF,aAAa,CAAE,CAAC,CAChB,MAAM,CAAE,IAAI,CACZ,QAAQ,CAAE,QAAQ,CAClB,OAAO,CAAE,KAAK,CACd,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,KAAK,CACZ,MAAM,CAAE,KAAK,CAIrB,SAAU,CACN,QAAQ,CAAE,QAAQ,CAClB,GAAG,CAAE,CAAC,CACN,IAAI,CAAE,CAAC,CACP,KAAK,CAAE,CAAC,CACR,MAAM,CAAE,IAAI,CACZ,OAAO,CAAE,IAAI,CACb,WAAW,CAAE,IAAI,CACjB,OAAO,CAAE,IAAI,CAEb,yBAAkC,CAVtC,SAAU,CAWF,WAAW,CAAE,IAAI,CACjB,YAAY,CAAE,IAAI,EAGtB,aAAM,CACF,OAAO,CAAE,CAAC,CACV,WAAW,CAAE,IAAI,CAEjB,yBAAkC,CAJtC,aAAM,CAKE,WAAW,CAAE,CAAC,CACd,YAAY,CAAE,IAAI,EAI1B,wBAAe,CACX,KAAK,CAAE,IAAI,CACX,WAAW,CAAE,mBAAwB,CACrC,WAAW,CAAE,CAAC,CAGlB,iBAAQ,CACJ,SAAS,CAAE,IAAI,CAIvB,aAAc,CACV,QAAQ,CAAE,QAAQ,CAElB,6BAAgB,CACZ,KAAK,CAAE,IAAI,CACX,WAAW,CAAE,mBAAwB,CAGzC,wBAAa,CACT,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,IAAI,CAET,uCAAe,CACX,OAAO,CAAE,YAAY,CAGzB,sCAAc,CACV,OAAO,CAAE,IAAI,CAGjB,4BAAM,CACF,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,IAAI,CAET,2CAAe,CACX,OAAO,CAAE,IAAI,CAGjB,0CAAc,CACV,OAAO,CAAE,YAAY,CAKjC,8BAAmB,CACf,IAAI,CAAE,IAAI,CACV,GAAG,CAAE,IAAI,CAET,kDAAoB,CAChB,OAAO,CAAE,YAAY,CAGzB,kDAAoB,CAChB,OAAO,CAAE,IAAI,CAGjB,kCAAM,CACF,IAAI,CAAE,IAAI,CACV,GAAG,CAAE,IAAI,CAIT,uDAAoB,CAChB,OAAO,CAAE,IAAI,CAGjB,uDAAoB,CAChB,OAAO,CAAE,YAAY,CAKjC,8BAAmB,CACf,IAAI,CAAE,IAAI,CACV,GAAG,CAAE,GAAG,CAGZ,0BAAe,CACX,KAAK,CAAE,IAAI,CACX,GAAG,CAAE,GAAG,CAKZ,qBAAQ,CACJ,SAAS,CAAE,IAAI,CAEnB,qBAAQ,CACJ,SAAS,CAAE,IAAI,CAEnB,qBAAQ,CACJ,SAAS,CAAE,IAAI,CAEnB,qBAAQ,CACJ,SAAS,CAAE,IAAI", 4 | "sources": ["../scss/site.scss"], 5 | "names": [], 6 | "file": "site.css" 7 | } -------------------------------------------------------------------------------- /styles/css/site.css: -------------------------------------------------------------------------------- 1 | body{background-color:#ccc}.canvasGL{display:block;width:100vw;height:100vh;border-radius:7px;border-radius:30px;border:20px solid transparent}.fs .canvasGL{border-radius:0;border:none;position:absolute;display:block;top:0;left:0;width:100vw;height:100vh}.controls{position:absolute;top:0;left:0;right:0;margin:20px;padding:20px;padding-top:60px;opacity:0.88}@media (min-width: 768px){.controls{padding-top:20px;padding-left:50px}}.fs .controls{padding:0;padding-top:60px}@media (min-width: 768px){.fs .controls{padding-top:0;padding-left:30px}}.controls .control-label{color:#fff;text-shadow:#030303 0px 0px 8px;padding-top:0}.controls .slider{min-width:100%}.control-icon{position:absolute}.control-icon .material-icons{color:#fff;text-shadow:#030303 0px 0px 8px}.control-icon.control-fs{right:40px;top:40px}.control-icon.control-fs .icon-enter-fs{display:inline-block}.control-icon.control-fs .icon-exit-fs{display:none}.fs .control-icon.control-fs{right:20px;top:20px}.fs .control-icon.control-fs .icon-enter-fs{display:none}.fs .control-icon.control-fs .icon-exit-fs{display:inline-block}.control-icon.control-settings{left:40px;top:40px}.control-icon.control-settings .icon-show-settings{display:inline-block}.control-icon.control-settings .icon-hide-settings{display:none}.fs .control-icon.control-settings{left:20px;top:20px}.control-icon.control-settings.open .icon-show-settings{display:none}.control-icon.control-settings.open .icon-hide-settings{display:inline-block}.control-icon.control-previous{left:40px;top:50%}.control-icon.control-next{right:40px;top:50%}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px} 2 | /*# sourceMappingURL=site.css.map */ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WebGL 2 Fur demo 2 | 3 | Fur/grass WebGL 2 demo. Implemented using instanced rendering. 4 | 5 | Works in latest Chrome and Firefox. 6 | Live demo is here - https://keaukraine.github.io/webgl-fur/ 7 | 8 | ## Used Libraries 9 | 10 | * Twitter Bootstrap used under the MIT License https://github.com/twbs/bootstrap/blob/master/LICENSE 11 | * Material Icons by Google used under Apache License https://design.google.com/icons/ 12 | * bootstrap-slider by Kyle Kemp, Rohit Kalkur, and contributors used under MIT License https://github.com/seiyria/bootstrap-slider 13 | * RequireJS, Released under the MIT license https://github.com/requirejs/requirejs/blob/master/LICENSE 14 | * jQuery used under the MIT license https://jquery.org/license/ 15 | * gl-matrix, a high performance matrix and vector operations by Brandon Jones and Colin MacKenzie IV 16 | * WebGL initialization code is based on http://learningwebgl.com/ tutorials 17 | * Basic low-level WebGL framework - https://github.com/keaukraine/webgl-framework 18 | 19 | ## License 20 | 21 | **The MIT License** 22 | 23 | Copyright (c) 2016-2017 Oleksandr Popov, Dmytro Popov 24 | 25 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 26 | 27 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 | -------------------------------------------------------------------------------- /js/app/FurPresets.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(function() { 4 | 5 | function FurPresets() {} 6 | 7 | FurPresets.presets = [{ 8 | 'name': 'Leopard', 9 | 'layers': 20, 10 | 'thickness': 0.15, 11 | 'waveScale': 0.5, 12 | 'diffuseTexture': 'fur-leo.png', 13 | 'alphaTexture': 'uneven-alpha.png', 14 | 'startColor': [0.6, 0.6, 0.6, 1.0], 15 | 'endColor': [1.0, 1.0, 1.0, 0.0] 16 | }, { 17 | 'name': 'Cow', 18 | 'layers': 10, 19 | 'thickness': 0.15, 20 | 'waveScale': 0.2, 21 | 'diffuseTexture': 'fur-cow.png', 22 | 'alphaTexture': 'uneven-alpha.png', 23 | 'startColor': [0.7, 0.7, 0.7, 1.0], 24 | 'endColor': [1.0, 1.0, 1.0, 0.0] 25 | }, { 26 | 'name': 'Chick', 27 | 'layers': 13, 28 | 'thickness': 0.13, 29 | 'waveScale': 0.12, 30 | 'diffuseTexture': 'fur-chick.png', 31 | 'alphaTexture': 'even-alpha.png', 32 | 'startColor': [1.15, 1.15, 1.15, 1.0], 33 | 'endColor': [0.95, 0.95, 0.95, 0.2] 34 | }, { 35 | 'name': 'Timber Wolf', 36 | 'layers': 20, 37 | 'thickness': 0.15, 38 | 'waveScale': 0.3, 39 | 'diffuseTexture': 'fur-wolf.png', 40 | 'alphaTexture': 'uneven-alpha.png', 41 | 'startColor': [0.0, 0.0, 0.0, 1.0], 42 | 'endColor': [1.0, 1.0, 1.0, 0.0] 43 | }, { 44 | 'name': 'Moss', 45 | 'layers': 7, 46 | 'thickness': 0.13, 47 | 'waveScale': 0.0, 48 | 'diffuseTexture': 'moss.png', 49 | 'alphaTexture': 'moss-alpha.png', 50 | 'startColor': [0.2, 0.2, 0.2, 1.0], 51 | 'endColor': [1.0, 1.0, 1.0, 0.8] 52 | }]; 53 | 54 | FurPresets._current = 0; 55 | 56 | FurPresets.current = function() { 57 | return this.presets[this._current]; 58 | }; 59 | 60 | FurPresets.next = function() { 61 | this._current++; 62 | if (this._current >= this.presets.length) { 63 | this._current = 0; 64 | } 65 | 66 | return this.presets[this._current]; 67 | }; 68 | 69 | FurPresets.previous = function() { 70 | this._current--; 71 | if (this._current < 0) { 72 | this._current = this.presets.length - 1; 73 | } 74 | 75 | return this.presets[this._current]; 76 | }; 77 | 78 | return FurPresets; 79 | }); 80 | -------------------------------------------------------------------------------- /js/app/framework/CompressedTextureLoader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(['./BinaryDataLoader'], function(BinaryDataLoader) { 4 | 5 | /** 6 | * Constructor. No need to create an instance of this class because it has only static methods 7 | */ 8 | function CompressedTextureLoader() {} 9 | 10 | /** 11 | * Loads ETC1 texture from PKM format 12 | * @param {string} url - URL to texture in PKM format 13 | * @param {Function} callbak - callback called after texture is loaded to GPU 14 | * @return {number} - WebGL texture 15 | */ 16 | CompressedTextureLoader.loadETC1 = function(url, callback) { 17 | var root = this, 18 | texture = gl.createTexture(); 19 | 20 | var PKM_HEADER_SIZE = 16; // size of PKM header 21 | var PKM_HEADER_WIDTH_OFFSET = 8; // offset to texture width 22 | var PKM_HEADER_HEIGHT_OFFSET = 10; // offset to texture height 23 | 24 | BinaryDataLoader.load(url, function(data) { 25 | var bufWidth, bufHeight, bufData, 26 | width, height; 27 | 28 | var ETC1_RGB8_OES = 36196; 29 | 30 | if (data.byteLength > 0) { 31 | // Endianness depends on machine architecture, can't read Int16 32 | // In PKM, width and height are big-endian, and x86 is little-endian and ARM is bi-endian 33 | bufWidth = new Uint8Array(data, PKM_HEADER_WIDTH_OFFSET, 2); 34 | width = bufWidth[0]*256 + bufWidth[1]; 35 | bufHeight = new Uint8Array(data, PKM_HEADER_HEIGHT_OFFSET, 2); 36 | height = bufHeight[0]*256 + bufHeight[1]; 37 | bufData = new Uint8Array(data, PKM_HEADER_SIZE, data.byteLength - PKM_HEADER_SIZE); 38 | 39 | gl.bindTexture(gl.TEXTURE_2D, texture); 40 | gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ETC1_RGB8_OES, width, height, 0, bufData); 41 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); 42 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); 43 | gl.bindTexture(gl.TEXTURE_2D, null); 44 | 45 | console.log('Loaded texture ' + url + ' [' + width + 'x' + height + ']'); 46 | 47 | callback && callback(); 48 | } 49 | }); 50 | 51 | return texture; 52 | } 53 | 54 | return CompressedTextureLoader; 55 | }); 56 | -------------------------------------------------------------------------------- /js/app/framework/FullModel.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(['./BinaryDataLoader'], function(BinaryDataLoader) { 4 | 5 | /** 6 | * Class to represent mesh data 7 | * @class 8 | */ 9 | function FullModel() { 10 | this.bufferIndices = null; 11 | this.bufferStrides = null; 12 | this.numIndices = 0; 13 | } 14 | 15 | FullModel.prototype = { 16 | 17 | /** 18 | * Loads binary data for mesh 19 | * @param {string} url - URL for mesh files without trailing "-*.bin" 20 | * @param {Function} callback when data is loaded 21 | */ 22 | load: function(url, callback) { 23 | var root = this; 24 | 25 | function loadBuffer(buffer, target, arrayBuffer) { 26 | var byteArray = new Uint8Array(arrayBuffer, 0, arrayBuffer.byteLength); 27 | gl.bindBuffer(target, buffer); 28 | gl.bufferData(target, byteArray, gl.STATIC_DRAW); 29 | } 30 | 31 | BinaryDataLoader.load(url + '-indices.bin', 32 | function(data) { 33 | root.bufferIndices = gl.createBuffer(); 34 | console.log('Loaded ' + url + '-indices.bin: ' + data.byteLength + ' bytes'); 35 | loadBuffer(root.bufferIndices, gl.ELEMENT_ARRAY_BUFFER, data); 36 | root.numIndices = data.byteLength / 2 / 3; 37 | root.bufferIndices && root.bufferStrides && callback(); 38 | } 39 | ); 40 | BinaryDataLoader.load(url + '-strides.bin', 41 | function(data) { 42 | root.bufferStrides = gl.createBuffer(); 43 | console.log('Loaded ' + url + '-strides.bin: ' + data.byteLength + ' bytes'); 44 | loadBuffer(root.bufferStrides, gl.ARRAY_BUFFER, data); 45 | root.bufferIndices && root.bufferStrides && callback(); 46 | } 47 | ); 48 | }, 49 | 50 | /** 51 | * Binds buffers for glDrawElements() call 52 | */ 53 | bindBuffers: function() { 54 | gl.bindBuffer(gl.ARRAY_BUFFER, this.bufferStrides); 55 | gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufferIndices); 56 | }, 57 | 58 | /** 59 | * Returns number of inices in model 60 | * @return {number} - number of indices 61 | */ 62 | getNumIndices: function() { 63 | return this.numIndices; 64 | } 65 | } 66 | 67 | return FullModel; 68 | }); 69 | -------------------------------------------------------------------------------- /styles/scss/site.scss: -------------------------------------------------------------------------------- 1 | @import "common"; 2 | 3 | body { 4 | background-color: #ccc; 5 | } 6 | 7 | .canvasGL { 8 | display: block; 9 | width: 100vw; 10 | height: 100vh; 11 | border-radius: 7px; 12 | border-radius: 30px; 13 | border: 20px solid transparent; 14 | 15 | .fs & { 16 | border-radius: 0; 17 | border: none; 18 | position: absolute; 19 | display: block; 20 | top: 0; 21 | left: 0; 22 | width: 100vw; 23 | height: 100vh; 24 | } 25 | } 26 | 27 | .controls { 28 | position: absolute; 29 | top: 0; 30 | left: 0; 31 | right: 0; 32 | margin: 20px; 33 | padding: 20px; 34 | padding-top: 60px; 35 | opacity: 0.88; 36 | 37 | @media(min-width: $screen-sm-min) { 38 | padding-top: 20px; 39 | padding-left: 50px; 40 | } 41 | 42 | .fs & { 43 | padding: 0; 44 | padding-top: 60px; 45 | 46 | @media(min-width: $screen-sm-min) { 47 | padding-top: 0; 48 | padding-left: 30px; 49 | } 50 | } 51 | 52 | .control-label { 53 | color: #fff; 54 | text-shadow: rgb(3, 3, 3) 0px 0px 8px; 55 | padding-top: 0; 56 | } 57 | 58 | .slider { 59 | min-width: 100%; 60 | } 61 | } 62 | 63 | .control-icon { 64 | position: absolute; 65 | 66 | .material-icons { 67 | color: #fff; 68 | text-shadow: rgb(3, 3, 3) 0px 0px 8px; 69 | } 70 | 71 | &.control-fs { 72 | right: 40px; 73 | top: 40px; 74 | 75 | .icon-enter-fs { 76 | display: inline-block; 77 | } 78 | 79 | .icon-exit-fs { 80 | display: none; 81 | } 82 | 83 | .fs & { 84 | right: 20px; 85 | top: 20px; 86 | 87 | .icon-enter-fs { 88 | display: none; 89 | } 90 | 91 | .icon-exit-fs { 92 | display: inline-block; 93 | } 94 | } 95 | } 96 | 97 | &.control-settings { 98 | left: 40px; 99 | top: 40px; 100 | 101 | .icon-show-settings { 102 | display: inline-block; 103 | } 104 | 105 | .icon-hide-settings { 106 | display: none; 107 | } 108 | 109 | .fs & { 110 | left: 20px; 111 | top: 20px; 112 | } 113 | 114 | &.open { 115 | .icon-show-settings { 116 | display: none; 117 | } 118 | 119 | .icon-hide-settings { 120 | display: inline-block; 121 | } 122 | } 123 | } 124 | 125 | &.control-previous { 126 | left: 40px; 127 | top: 50%; 128 | } 129 | 130 | &.control-next { 131 | right: 40px; 132 | top: 50%; 133 | } 134 | } 135 | 136 | .material-icons { 137 | &.md-18 { 138 | font-size: 18px; 139 | } 140 | &.md-24 { 141 | font-size: 24px; 142 | } 143 | &.md-36 { 144 | font-size: 36px; 145 | } 146 | &.md-48 { 147 | font-size: 48px; 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /js/app/framework/BaseShader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(function() { 4 | 5 | class BaseShader { 6 | 7 | /** 8 | * Constructor. Compiles shader. 9 | */ 10 | constructor() { 11 | this.vertexShaderCode = ''; 12 | this.fragmentShaderCode = ''; 13 | this.program = null; 14 | 15 | this.fillCode(); 16 | this.initShader(); 17 | } 18 | 19 | /** 20 | * Used to fill shader code. Put actual shader code to this.vertexShaderCode and this.fragmentShaderCode 21 | */ 22 | fillCode() {} 23 | 24 | getShader(gl, type, code) { 25 | var shader = gl.createShader(type); 26 | 27 | gl.shaderSource(shader, code); 28 | gl.compileShader(shader); 29 | 30 | if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { 31 | console.warn(gl.getShaderInfoLog(shader)); 32 | return null; 33 | } 34 | 35 | return shader; 36 | } 37 | 38 | /** 39 | * Retrieve and save uniforms and attributes for actual shader here 40 | */ 41 | fillUniformsAttributes() {} 42 | 43 | /** 44 | * Get shader unform location 45 | * @param {string} uniform - uniform name 46 | * @return {number} - uniform location 47 | */ 48 | getUniform(uniform) { 49 | return gl.getUniformLocation(this.program, uniform); 50 | } 51 | 52 | /** 53 | * Get shader attribute location 54 | * @param {string} attrib - uniform name 55 | * @return {number} - attribute location 56 | */ 57 | getAttrib(attrib) { 58 | return gl.getAttribLocation(this.program, attrib); 59 | } 60 | 61 | /** 62 | * Initializes shader. No need to call this manually, this is called in constructor. 63 | */ 64 | initShader() { 65 | var shaderProgram, 66 | fragmentShader = this.getShader(gl, gl.FRAGMENT_SHADER, this.fragmentShaderCode), 67 | vertexShader = this.getShader(gl, gl.VERTEX_SHADER, this.vertexShaderCode); 68 | 69 | shaderProgram = gl.createProgram(); 70 | gl.attachShader(shaderProgram, vertexShader); 71 | gl.attachShader(shaderProgram, fragmentShader); 72 | gl.linkProgram(shaderProgram); 73 | 74 | if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { 75 | console.warn(this.constructor.name + ': Could not initialise shader'); 76 | } else { 77 | console.log(this.constructor.name + ': Initialised shader'); 78 | } 79 | 80 | gl.useProgram(shaderProgram); 81 | this.program = shaderProgram; 82 | 83 | this.fillUniformsAttributes(); 84 | } 85 | 86 | /** 87 | * Activates shader. 88 | */ 89 | use() { 90 | if (this.program) { 91 | gl.useProgram(this.program); 92 | } 93 | } 94 | 95 | /** 96 | * Deletes shader. 97 | */ 98 | deleteProgram() { 99 | gl.deleteProgram(this.program); 100 | } 101 | }; 102 | 103 | return BaseShader; 104 | }); 105 | -------------------------------------------------------------------------------- /js/app/framework/utils/FullscreenUtils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileOverview Cross-browser full-screen utilities 3 | * @author Oleksandr Popov 4 | */ 5 | 6 | 'use strict'; 7 | 8 | define(function() { 9 | 10 | function FullScreenUtils() {} 11 | 12 | /** 13 | * Enters fullscreen 14 | */ 15 | FullScreenUtils.enterFullScreen = function() { 16 | if (document.documentElement.requestFullscreen) { 17 | if (!document.fullscreenElement) { 18 | document.documentElement.requestFullscreen(); 19 | } 20 | } 21 | if (document.documentElement.webkitRequestFullScreen) { 22 | if (!document.webkitFullscreenElement) { 23 | document.documentElement.webkitRequestFullscreen(); 24 | } 25 | } 26 | if (document.documentElement.mozRequestFullScreen) { 27 | if (!document.mozFullscreenElement) { 28 | document.documentElement.mozRequestFullScreen(); 29 | } 30 | } 31 | } 32 | 33 | /** 34 | * Exits fullscreen 35 | */ 36 | FullScreenUtils.exitFullScreen = function() { 37 | if (document.documentElement.requestFullscreen) { 38 | if (document.exitFullscreen) { 39 | document.exitFullscreen(); 40 | } 41 | } 42 | if (document.documentElement.webkitRequestFullscreen) { 43 | if (document.webkitExitFullscreen) { 44 | document.webkitExitFullscreen(); 45 | } 46 | } 47 | if (document.documentElement.mozRequestFullScreen) { 48 | if (document.mozCancelFullScreen) { 49 | document.mozCancelFullScreen(); 50 | } 51 | } 52 | } 53 | 54 | /** 55 | * Adds cross-browser fullscreenchange event 56 | * @param {function} exitHandler - function to be called on fullscreenchange event 57 | */ 58 | FullScreenUtils.addFullScreenListener = function(exitHandler) { 59 | if (document.documentElement.requestFullscreen) { 60 | document.addEventListener('fullscreenchange', exitHandler, false); 61 | } 62 | if (document.documentElement.webkitRequestFullScreen) { 63 | document.addEventListener('webkitfullscreenchange', exitHandler, false); 64 | } 65 | if (document.documentElement.mozRequestFullScreen) { 66 | document.addEventListener('mozfullscreenchange', exitHandler, false); 67 | } 68 | } 69 | 70 | /** 71 | * Checks fullscreen state 72 | * @return {Boolean} - true if fullscreen is active, false if not 73 | */ 74 | FullScreenUtils.isFullScreen = function() { 75 | if (document.documentElement.requestFullscreen) { 76 | return !!document.fullscreenElement; 77 | } 78 | if (document.documentElement.webkitRequestFullscreen) { 79 | return !!document.webkitFullscreenElement; 80 | } 81 | if (document.documentElement.mozRequestFullScreen) { 82 | return !!document.mozFullScreenElement; 83 | } 84 | } 85 | 86 | /** 87 | * Checks for full-screen API availability 88 | * @return {Boolean} - true if fullscrees is supported, false if not 89 | */ 90 | FullScreenUtils.isFullScreenSupported = function() { 91 | return !!document.documentElement.requestFullscreen || !!document.documentElement.webkitRequestFullScreen || !!document.documentElement.mozRequestFullScreen; 92 | } 93 | 94 | return FullScreenUtils; 95 | }); 96 | -------------------------------------------------------------------------------- /js/app/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define([ 4 | 'FurRenderer', 5 | 'jquery', 6 | 'bootstrap-slider', 7 | 'framework/utils/FullscreenUtils' 8 | ], 9 | function( 10 | FurRenderer, 11 | $, 12 | Slider, 13 | FullScreenUtils) { 14 | 15 | var renderer, 16 | timeoutHideName; 17 | 18 | /** 19 | * Initialize renderer 20 | */ 21 | function initRenderer() { 22 | var oldYaw = 0; 23 | 24 | window.gl = null; 25 | 26 | if (renderer) { 27 | renderer.resetLoaded(); 28 | } 29 | 30 | renderer = new FurRenderer(); 31 | renderer.init('canvasGL', true); 32 | } 33 | 34 | function initUI() { 35 | // initialize fullscreen if supported 36 | if (FullScreenUtils.isFullScreenSupported()) { 37 | $('#toggleFullscreen').on('click', function(e) { 38 | var $body = $('body'); 39 | 40 | if ($body.hasClass('fs')) { 41 | FullScreenUtils.exitFullScreen(); 42 | } else { 43 | FullScreenUtils.enterFullScreen(); 44 | } 45 | FullScreenUtils.addFullScreenListener(function() { 46 | if (FullScreenUtils.isFullScreen()) { 47 | $body.addClass('fs'); 48 | } else { 49 | $body.removeClass('fs'); 50 | } 51 | }); 52 | }); 53 | } else { 54 | $('#toggleFullscreen').addClass('hidden'); 55 | } 56 | 57 | // toggle settings visibility 58 | $('#toggleSettings').on('click', function(e) { 59 | var $this = $(this), 60 | $controls = $('#row-settings, #nextPreset, #previousPreset'); 61 | 62 | $this.toggleClass('open'); 63 | $controls.toggle(); 64 | $('#presetName').hide(); 65 | }); 66 | 67 | $('#nextPreset').on('click', function(e) { 68 | renderer.chooseNextPreset(); 69 | }); 70 | 71 | $('#previousPreset').on('click', function(e) { 72 | renderer.choosePreviousPreset(); 73 | }); 74 | 75 | $('input.slider').slider(); 76 | 77 | $('#sliderLayers').on('change', function(e) { 78 | renderer.layers = e.value.newValue; 79 | }); 80 | $('#sliderThickness').on('change', function(e) { 81 | renderer.thickness = e.value.newValue; 82 | }); 83 | 84 | renderer.onPresetLoaded = function() { 85 | $('#sliderLayers').slider('setValue', renderer.layers); 86 | $('#sliderThickness').slider('setValue', renderer.thickness); 87 | 88 | clearTimeout(timeoutHideName); 89 | $('#presetName') 90 | .show() 91 | .text(renderer.presetName); 92 | timeoutHideName = setTimeout(function() { 93 | $('#presetName').hide(); 94 | }, 3000); 95 | }; 96 | } 97 | 98 | $(function() { 99 | initRenderer(); 100 | initUI(); 101 | }); 102 | }); 103 | -------------------------------------------------------------------------------- /js/app/FurShader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define(['framework/BaseShader'], function(BaseShader) { 4 | 5 | class FurShader extends BaseShader { 6 | fillCode() { 7 | this.vertexShaderCode = '#version 300 es\r\n' + 8 | 'precision highp float;\r\n' + 9 | 'uniform mat4 view_proj_matrix;\r\n' + 10 | 'uniform float layerThickness;\r\n' + 11 | 'uniform float layersCount;\r\n' + 12 | 'uniform vec4 colorStart;\r\n' + 13 | 'uniform vec4 colorEnd;\r\n' + 14 | 'uniform float time;\r\n' + 15 | 'uniform float waveScale;\r\n' + 16 | 'uniform float stiffness;\r\n' + 17 | '\r\n' + 18 | 'in vec4 rm_Vertex;\r\n' + 19 | 'in vec2 rm_TexCoord0;\r\n' + 20 | 'in vec3 rm_Normal;\r\n' + 21 | '\r\n' + 22 | 'out vec2 vTexCoord0;\r\n' + 23 | 'out vec4 vAO;\r\n' + 24 | '\r\n' + 25 | 'const float PI2 = 6.2831852;\r\n' + 26 | 'const float RANDOM_COEFF_1 = 0.1376;\r\n' + 27 | 'const float RANDOM_COEFF_2 = 0.3726;\r\n' + 28 | 'const float RANDOM_COEFF_3 = 0.2546;\r\n' + 29 | '\r\n' + 30 | 'void main( void )\r\n' + 31 | '{\r\n' + 32 | ' float f = float(gl_InstanceID + 1) * layerThickness;\r\n' + 33 | ' float layerCoeff = float(gl_InstanceID) / layersCount;\r\n' + 34 | ' vec4 vertex = rm_Vertex + vec4(rm_Normal, 0.0) * vec4(f, f, f, 0.0);\r\n' + 35 | ' float timePi2 = time * PI2;\r\n' + 36 | ' float waveScaleFinal = waveScale * pow(layerCoeff, stiffness);\r\n' + 37 | '\r\n' + 38 | ' vertex.x += sin(timePi2 + ((rm_Vertex.x+rm_Vertex.y+rm_Vertex.z) * RANDOM_COEFF_1)) * waveScaleFinal;\r\n' + 39 | ' vertex.y += cos(timePi2 + ((rm_Vertex.x-rm_Vertex.y+rm_Vertex.z) * RANDOM_COEFF_2)) * waveScaleFinal;\r\n' + 40 | ' vertex.z += sin(timePi2 + ((rm_Vertex.x+rm_Vertex.y-rm_Vertex.z) * RANDOM_COEFF_3)) * waveScaleFinal;\r\n' + 41 | ' gl_Position = view_proj_matrix * vertex;\r\n' + 42 | ' vTexCoord0 = vec2(rm_TexCoord0);\r\n' + 43 | ' vAO = mix(colorStart, colorEnd, layerCoeff);\r\n' + 44 | '}'; 45 | 46 | this.fragmentShaderCode = '#version 300 es\r\n' + 47 | 'precision highp float;\r\n' + 48 | 'uniform sampler2D diffuseMap;\r\n' + 49 | 'uniform sampler2D alphaMap;\r\n' + 50 | 'in vec2 vTexCoord0;\r\n' + 51 | 'in vec4 vAO;\r\n' + 52 | 'out vec4 fragColor;\r\n' + 53 | '\r\n' + 54 | 'void main()\r\n' + 55 | '{\r\n' + 56 | ' vec4 diffuseColor = texture(diffuseMap, vTexCoord0);\r\n' + 57 | ' float alphaColor = texture(alphaMap, vTexCoord0).r;\r\n' + 58 | ' fragColor = diffuseColor * vAO;\r\n' + 59 | ' fragColor.a *= alphaColor;\r\n' + 60 | '}'; 61 | } 62 | 63 | fillUniformsAttributes() { 64 | this.view_proj_matrix = this.getUniform('view_proj_matrix'); 65 | this.rm_Vertex = this.getAttrib('rm_Vertex'); 66 | this.rm_TexCoord0 = this.getAttrib('rm_TexCoord0'); 67 | this.rm_Normal = this.getAttrib('rm_Normal'); 68 | this.diffuseMap = this.getUniform('diffuseMap'); 69 | this.alphaMap = this.getUniform('alphaMap'); 70 | this.layerThickness = this.getUniform('layerThickness'); 71 | this.layersCount = this.getUniform('layersCount'); 72 | this.colorStart = this.getUniform('colorStart'); 73 | this.colorEnd = this.getUniform('colorEnd'); 74 | this.time = this.getUniform('time'); 75 | this.waveScale = this.getUniform('waveScale'); 76 | this.stiffness = this.getUniform('stiffness'); 77 | } 78 | } 79 | 80 | return FurShader; 81 | }); 82 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | Fur WebGL 2 demo 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 41 |
42 |
43 |
44 |
45 |

Loading...

46 |
47 |
48 | 0% 49 |
50 |
51 |
52 |
53 |
54 |
55 | 58 |
59 |
60 |
61 |
62 |

63 |

64 |
65 |
66 | 91 |
92 |
93 | 97 | 101 | 104 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /js/app/framework/BaseRenderer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define([ 4 | './utils/MatrixUtils' 5 | ], 6 | function(MatrixUtils) { 7 | 8 | /** 9 | * Constructor 10 | */ 11 | function BaseRenderer() { 12 | this.mMMatrix = MatrixUtils.mat4.create(); 13 | this.mVMatrix = MatrixUtils.mat4.create(); 14 | this.mMVPMatrix = MatrixUtils.mat4.create(); 15 | this.mProjMatrix = MatrixUtils.mat4.create(); 16 | 17 | this.matOrtho = MatrixUtils.mat4.create(); 18 | MatrixUtils.mat4.ortho(this.matOrtho, -1, 1, -1, 1, 2.0, 250); 19 | 20 | this.boundTick = this.tick.bind(this); 21 | } 22 | 23 | /** 24 | * Logs last GL error to console 25 | */ 26 | BaseRenderer.prototype.logGLError = function() { 27 | var err = gl.getError(); 28 | if (err !== gl.NO_ERROR) { 29 | console.warn('WebGL error #' + err); 30 | } 31 | } 32 | 33 | /** 34 | * Binds 2D texture. 35 | * @param {number} textureUnit - texture unit to a 36 | * @param {number} textureID - texture to be used 37 | * @param {number} uniformID - shader's uniform ID 38 | */ 39 | BaseRenderer.prototype.setTexture2D = function(textureUnit, textureID, uniformID) { 40 | gl.activeTexture(gl.TEXTURE0 + textureUnit); 41 | gl.bindTexture(gl.TEXTURE_2D, textureID); 42 | gl.uniform1i(uniformID, textureUnit); 43 | } 44 | 45 | /** 46 | * Binds cubemap texture. 47 | * @param {number} textureUnit - texture unit to a 48 | * @param {number} textureID - texture to be used 49 | * @param {number} uniformID - shader's uniform ID 50 | */ 51 | BaseRenderer.prototype.setTextureCubemap = function(textureUnit, textureID, uniformID) { 52 | gl.ActiveTexture(gl.TEXTURE0 + textureUnit); 53 | gl.BindTexture(gl.TEXTURE_CUBE_MAP, textureID); 54 | gl.Uniform1i(uniformID, textureUnit); 55 | } 56 | 57 | /** 58 | * Calculates FOV for matrix. 59 | * @param {Mat4} matrix - output matrix 60 | * @param {number} fovY - vertical FOV in degrees 61 | * @param {number} aspect - aspect ratio of viewport 62 | * @param {number} zNear - near clipping plane distance 63 | * @param {number} zFar - far clipping plane distance 64 | */ 65 | BaseRenderer.prototype.setFOV = function(matrix, fovY, aspect, zNear, zFar) { 66 | var fW, fH; 67 | 68 | fH = Math.tan(fovY / 360.0 * 3.1415926) * zNear; 69 | fW = fH * aspect; 70 | MatrixUtils.mat4.frustum(matrix, -fW, fW, -fH, fH, zNear, zFar); 71 | } 72 | 73 | /** 74 | * Calculates MVP matrix. Saved in this.mMVPMatrix 75 | */ 76 | BaseRenderer.prototype.calculateMVPMatrix = function(tx, ty, tz, rx, ry, rz, sx, sy, sz) { 77 | MatrixUtils.mat4.identity(this.mMMatrix); 78 | MatrixUtils.mat4.rotate(this.mMMatrix, this.mMMatrix, 0, [1, 0, 0]); 79 | MatrixUtils.mat4.translate(this.mMMatrix, this.mMMatrix, [tx, ty, tz]); 80 | MatrixUtils.mat4.scale(this.mMMatrix, this.mMMatrix, [sx, sy, sz]); 81 | MatrixUtils.mat4.rotateX(this.mMMatrix, this.mMMatrix, rx); 82 | MatrixUtils.mat4.rotateY(this.mMMatrix, this.mMMatrix, ry); 83 | MatrixUtils.mat4.rotateZ(this.mMMatrix, this.mMMatrix, rz); 84 | MatrixUtils.mat4.multiply(this.mMVPMatrix, this.mVMatrix, this.mMMatrix); 85 | MatrixUtils.mat4.multiply(this.mMVPMatrix, this.mProjMatrix, this.mMVPMatrix); 86 | } 87 | 88 | /** 89 | * Called before WebGL initialization 90 | */ 91 | BaseRenderer.prototype.onBeforeInit = function() {} 92 | 93 | /** 94 | * Called right after WebGL initialization 95 | */ 96 | BaseRenderer.prototype.onAfterInit = function() {} 97 | 98 | /** 99 | * Called on WebGL initialization error 100 | */ 101 | BaseRenderer.prototype.onInitError = function() {} 102 | 103 | /** 104 | * Shaders initialization code goes here 105 | */ 106 | BaseRenderer.prototype.initShaders = function() {} 107 | 108 | /** 109 | * Load WebGL data here 110 | */ 111 | BaseRenderer.prototype.loadData = function() {} 112 | 113 | /** 114 | * Perform each frame's draw calls here 115 | */ 116 | BaseRenderer.prototype.drawScene = function() { 117 | gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); 118 | gl.clearColor(0.0, 0.0, 0.0, 1.0); 119 | gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 120 | } 121 | 122 | /** 123 | * Update timers and aminate stuff here 124 | */ 125 | BaseRenderer.prototype.animate = function() {} 126 | 127 | /** 128 | * Called on each frame 129 | */ 130 | BaseRenderer.prototype.tick = function() { 131 | requestAnimationFrame(this.boundTick); 132 | this.resizeCanvas(); 133 | this.drawScene(); 134 | this.animate(); 135 | } 136 | 137 | /** 138 | * Initializes WebGL context 139 | * @param {HTMLElement} canvas - canvas to initialize WebGL 140 | */ 141 | BaseRenderer.prototype.initGL = function(canvas) { 142 | var gl = null; 143 | 144 | try { 145 | gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); 146 | gl.viewportWidth = canvas.width; 147 | gl.viewportHeight = canvas.height; 148 | this.isETC1Supported = !!gl.getExtension('WEBGL_compressed_texture_etc1'); 149 | } catch (e) {} 150 | if (!gl) { 151 | console.warn('Could not initialise WebGL'); 152 | } 153 | 154 | return gl; 155 | }; 156 | 157 | /** 158 | * Initializes WebGL 2 context 159 | * @param {HTMLElement} canvas - canvas to initialize WebGL 160 | */ 161 | BaseRenderer.prototype.initGL2 = function(canvas) { 162 | var gl = null; 163 | 164 | try { 165 | gl = canvas.getContext('webgl2'); 166 | } catch (e) {} 167 | this.isWebGL2 = !!gl; 168 | 169 | if (!this.isWebGL2) { 170 | console.warn('Could not initialise WebGL 2, falling back to WebGL 1'); 171 | return this.initGL(canvas); 172 | } else { 173 | return gl; 174 | } 175 | }; 176 | 177 | /** 178 | * Initializes WebGL and calls all callbacks. Assigns current WebGL context to global window.gl 179 | * @param {String} canvasID - ID of canvas element to initialize WebGL 180 | */ 181 | BaseRenderer.prototype.init = function(canvasID, requestWebGL2) { 182 | this.onBeforeInit(); 183 | 184 | this.canvas = document.getElementById(canvasID); 185 | window.gl = !!requestWebGL2 ? this.initGL2(this.canvas) : this.initGL(this.canvas); 186 | 187 | if (window.gl) { 188 | this.onAfterInit(); 189 | this.initShaders(); 190 | this.loadData(); 191 | this.boundTick(); 192 | } else { 193 | this.onInitError(); 194 | } 195 | } 196 | 197 | /** 198 | * Adjusts viewport according to resizing of canvas 199 | */ 200 | BaseRenderer.prototype.resizeCanvas = function() { 201 | var cssToRealPixels = window.devicePixelRatio || 1, 202 | displayWidth = Math.floor(this.canvas.clientWidth * cssToRealPixels), 203 | displayHeight = Math.floor(this.canvas.clientHeight * cssToRealPixels); 204 | 205 | if (this.canvas.width != displayWidth || this.canvas.height != displayHeight) { 206 | this.canvas.width = displayWidth; 207 | this.canvas.height = displayHeight; 208 | } 209 | } 210 | 211 | return BaseRenderer; 212 | }); 213 | -------------------------------------------------------------------------------- /js/lib/require.js: -------------------------------------------------------------------------------- 1 | /** vim: et:ts=4:sw=4:sts=4 2 | * @license RequireJS 2.3.1 Copyright jQuery Foundation and other contributors. 3 | * Released under MIT license, https://github.com/requirejs/requirejs/blob/master/LICENSE 4 | */ 5 | var requirejs,require,define;!function(global,setTimeout){function commentReplace(e,t){return t||""}function isFunction(e){return"[object Function]"===ostring.call(e)}function isArray(e){return"[object Array]"===ostring.call(e)}function each(e,t){if(e){var i;for(i=0;i-1&&(!e[i]||!t(e[i],i,e));i-=1);}}function hasProp(e,t){return hasOwn.call(e,t)}function getOwn(e,t){return hasProp(e,t)&&e[t]}function eachProp(e,t){var i;for(i in e)if(hasProp(e,i)&&t(e[i],i))break}function mixin(e,t,i,r){return t&&eachProp(t,function(t,n){!i&&hasProp(e,n)||(!r||"object"!=typeof t||!t||isArray(t)||isFunction(t)||t instanceof RegExp?e[n]=t:(e[n]||(e[n]={}),mixin(e[n],t,i,r)))}),e}function bind(e,t){return function(){return t.apply(e,arguments)}}function scripts(){return document.getElementsByTagName("script")}function defaultOnError(e){throw e}function getGlobal(e){if(!e)return e;var t=global;return each(e.split("."),function(e){t=t[e]}),t}function makeError(e,t,i,r){var n=new Error(t+"\nhttp://requirejs.org/docs/errors.html#"+e);return n.requireType=e,n.requireModules=r,i&&(n.originalError=i),n}function newContext(e){function t(e){var t,i;for(t=0;t0&&(e.splice(t-1,2),t-=2)}}function i(e,i,r){var n,o,a,s,u,c,d,p,f,l,h,m,g=i&&i.split("/"),v=y.map,x=v&&v["*"];if(e&&(e=e.split("/"),d=e.length-1,y.nodeIdCompat&&jsSuffixRegExp.test(e[d])&&(e[d]=e[d].replace(jsSuffixRegExp,"")),"."===e[0].charAt(0)&&g&&(m=g.slice(0,g.length-1),e=m.concat(e)),t(e),e=e.join("/")),r&&v&&(g||x)){a=e.split("/");e:for(s=a.length;s>0;s-=1){if(c=a.slice(0,s).join("/"),g)for(u=g.length;u>0;u-=1)if(o=getOwn(v,g.slice(0,u).join("/")),o&&(o=getOwn(o,c))){p=o,f=s;break e}!l&&x&&getOwn(x,c)&&(l=getOwn(x,c),h=s)}!p&&l&&(p=l,f=h),p&&(a.splice(0,f,p),e=a.join("/"))}return n=getOwn(y.pkgs,e),n?n:e}function r(e){isBrowser&&each(scripts(),function(t){if(t.getAttribute("data-requiremodule")===e&&t.getAttribute("data-requirecontext")===q.contextName)return t.parentNode.removeChild(t),!0})}function n(e){var t=getOwn(y.paths,e);if(t&&isArray(t)&&t.length>1)return t.shift(),q.require.undef(e),q.makeRequire(null,{skipMap:!0})([e]),!0}function o(e){var t,i=e?e.indexOf("!"):-1;return i>-1&&(t=e.substring(0,i),e=e.substring(i+1,e.length)),[t,e]}function a(e,t,r,n){var a,s,u,c,d=null,p=t?t.name:null,f=e,l=!0,h="";return e||(l=!1,e="_@r"+(A+=1)),c=o(e),d=c[0],e=c[1],d&&(d=i(d,p,n),s=getOwn(j,d)),e&&(d?h=s&&s.normalize?s.normalize(e,function(e){return i(e,p,n)}):e.indexOf("!")===-1?i(e,p,n):e:(h=i(e,p,n),c=o(h),d=c[0],h=c[1],r=!0,a=q.nameToUrl(h))),u=!d||s||r?"":"_unnormalized"+(T+=1),{prefix:d,name:h,parentMap:t,unnormalized:!!u,url:a,originalName:f,isDefine:l,id:(d?d+"!"+h:h)+u}}function s(e){var t=e.id,i=getOwn(S,t);return i||(i=S[t]=new q.Module(e)),i}function u(e,t,i){var r=e.id,n=getOwn(S,r);!hasProp(j,r)||n&&!n.defineEmitComplete?(n=s(e),n.error&&"error"===t?i(n.error):n.on(t,i)):"defined"===t&&i(j[r])}function c(e,t){var i=e.requireModules,r=!1;t?t(e):(each(i,function(t){var i=getOwn(S,t);i&&(i.error=e,i.events.error&&(r=!0,i.emit("error",e)))}),r||req.onError(e))}function d(){globalDefQueue.length&&(each(globalDefQueue,function(e){var t=e[0];"string"==typeof t&&(q.defQueueMap[t]=!0),O.push(e)}),globalDefQueue=[])}function p(e){delete S[e],delete k[e]}function f(e,t,i){var r=e.map.id;e.error?e.emit("error",e.error):(t[r]=!0,each(e.depMaps,function(r,n){var o=r.id,a=getOwn(S,o);!a||e.depMatched[n]||i[o]||(getOwn(t,o)?(e.defineDep(n,j[o]),e.check()):f(a,t,i))}),i[r]=!0)}function l(){var e,t,i=1e3*y.waitSeconds,o=i&&q.startTime+i<(new Date).getTime(),a=[],s=[],u=!1,d=!0;if(!x){if(x=!0,eachProp(k,function(e){var i=e.map,c=i.id;if(e.enabled&&(i.isDefine||s.push(e),!e.error))if(!e.inited&&o)n(c)?(t=!0,u=!0):(a.push(c),r(c));else if(!e.inited&&e.fetched&&i.isDefine&&(u=!0,!i.prefix))return d=!1}),o&&a.length)return e=makeError("timeout","Load timeout for modules: "+a,null,a),e.contextName=q.contextName,c(e);d&&each(s,function(e){f(e,{},{})}),o&&!t||!u||!isBrowser&&!isWebWorker||w||(w=setTimeout(function(){w=0,l()},50)),x=!1}}function h(e){hasProp(j,e[0])||s(a(e[0],null,!0)).init(e[1],e[2])}function m(e,t,i,r){e.detachEvent&&!isOpera?r&&e.detachEvent(r,t):e.removeEventListener(i,t,!1)}function g(e){var t=e.currentTarget||e.srcElement;return m(t,q.onScriptLoad,"load","onreadystatechange"),m(t,q.onScriptError,"error"),{node:t,id:t&&t.getAttribute("data-requiremodule")}}function v(){var e;for(d();O.length;){if(e=O.shift(),null===e[0])return c(makeError("mismatch","Mismatched anonymous define() module: "+e[e.length-1]));h(e)}q.defQueueMap={}}var x,b,q,E,w,y={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},S={},k={},M={},O=[],j={},P={},R={},A=1,T=1;return E={require:function(e){return e.require?e.require:e.require=q.makeRequire(e.map)},exports:function(e){if(e.usingExports=!0,e.map.isDefine)return e.exports?j[e.map.id]=e.exports:e.exports=j[e.map.id]={}},module:function(e){return e.module?e.module:e.module={id:e.map.id,uri:e.map.url,config:function(){return getOwn(y.config,e.map.id)||{}},exports:e.exports||(e.exports={})}}},b=function(e){this.events=getOwn(M,e.id)||{},this.map=e,this.shim=getOwn(y.shim,e.id),this.depExports=[],this.depMaps=[],this.depMatched=[],this.pluginMaps={},this.depCount=0},b.prototype={init:function(e,t,i,r){r=r||{},this.inited||(this.factory=t,i?this.on("error",i):this.events.error&&(i=bind(this,function(e){this.emit("error",e)})),this.depMaps=e&&e.slice(0),this.errback=i,this.inited=!0,this.ignore=r.ignore,r.enabled||this.enabled?this.enable():this.check())},defineDep:function(e,t){this.depMatched[e]||(this.depMatched[e]=!0,this.depCount-=1,this.depExports[e]=t)},fetch:function(){if(!this.fetched){this.fetched=!0,q.startTime=(new Date).getTime();var e=this.map;return this.shim?void q.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],bind(this,function(){return e.prefix?this.callPlugin():this.load()})):e.prefix?this.callPlugin():this.load()}},load:function(){var e=this.map.url;P[e]||(P[e]=!0,q.load(this.map.id,e))},check:function(){if(this.enabled&&!this.enabling){var e,t,i=this.map.id,r=this.depExports,n=this.exports,o=this.factory;if(this.inited){if(this.error)this.emit("error",this.error);else if(!this.defining){if(this.defining=!0,this.depCount<1&&!this.defined){if(isFunction(o)){if(this.events.error&&this.map.isDefine||req.onError!==defaultOnError)try{n=q.execCb(i,o,r,n)}catch(t){e=t}else n=q.execCb(i,o,r,n);if(this.map.isDefine&&void 0===n&&(t=this.module,t?n=t.exports:this.usingExports&&(n=this.exports)),e)return e.requireMap=this.map,e.requireModules=this.map.isDefine?[this.map.id]:null,e.requireType=this.map.isDefine?"define":"require",c(this.error=e)}else n=o;if(this.exports=n,this.map.isDefine&&!this.ignore&&(j[i]=n,req.onResourceLoad)){var a=[];each(this.depMaps,function(e){a.push(e.normalizedMap||e)}),req.onResourceLoad(q,this.map,a)}p(i),this.defined=!0}this.defining=!1,this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else hasProp(q.defQueueMap,i)||this.fetch()}},callPlugin:function(){var e=this.map,t=e.id,r=a(e.prefix);this.depMaps.push(r),u(r,"defined",bind(this,function(r){var n,o,d,f=getOwn(R,this.map.id),l=this.map.name,h=this.map.parentMap?this.map.parentMap.name:null,m=q.makeRequire(e.parentMap,{enableBuildCallback:!0});return this.map.unnormalized?(r.normalize&&(l=r.normalize(l,function(e){return i(e,h,!0)})||""),o=a(e.prefix+"!"+l,this.map.parentMap),u(o,"defined",bind(this,function(e){this.map.normalizedMap=o,this.init([],function(){return e},null,{enabled:!0,ignore:!0})})),d=getOwn(S,o.id),void(d&&(this.depMaps.push(o),this.events.error&&d.on("error",bind(this,function(e){this.emit("error",e)})),d.enable()))):f?(this.map.url=q.nameToUrl(f),void this.load()):(n=bind(this,function(e){this.init([],function(){return e},null,{enabled:!0})}),n.error=bind(this,function(e){this.inited=!0,this.error=e,e.requireModules=[t],eachProp(S,function(e){0===e.map.id.indexOf(t+"_unnormalized")&&p(e.map.id)}),c(e)}),n.fromText=bind(this,function(i,r){var o=e.name,u=a(o),d=useInteractive;r&&(i=r),d&&(useInteractive=!1),s(u),hasProp(y.config,t)&&(y.config[o]=y.config[t]);try{req.exec(i)}catch(e){return c(makeError("fromtexteval","fromText eval for "+t+" failed: "+e,e,[t]))}d&&(useInteractive=!0),this.depMaps.push(u),q.completeLoad(o),m([o],n)}),void r.load(e.name,m,n,y))})),q.enable(r,this),this.pluginMaps[r.id]=r},enable:function(){k[this.map.id]=this,this.enabled=!0,this.enabling=!0,each(this.depMaps,bind(this,function(e,t){var i,r,n;if("string"==typeof e){if(e=a(e,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap),this.depMaps[t]=e,n=getOwn(E,e.id))return void(this.depExports[t]=n(this));this.depCount+=1,u(e,"defined",bind(this,function(e){this.undefed||(this.defineDep(t,e),this.check())})),this.errback?u(e,"error",bind(this,this.errback)):this.events.error&&u(e,"error",bind(this,function(e){this.emit("error",e)}))}i=e.id,r=S[i],hasProp(E,i)||!r||r.enabled||q.enable(e,this)})),eachProp(this.pluginMaps,bind(this,function(e){var t=getOwn(S,e.id);t&&!t.enabled&&q.enable(e,this)})),this.enabling=!1,this.check()},on:function(e,t){var i=this.events[e];i||(i=this.events[e]=[]),i.push(t)},emit:function(e,t){each(this.events[e],function(e){e(t)}),"error"===e&&delete this.events[e]}},q={config:y,contextName:e,registry:S,defined:j,urlFetched:P,defQueue:O,defQueueMap:{},Module:b,makeModuleMap:a,nextTick:req.nextTick,onError:c,configure:function(e){if(e.baseUrl&&"/"!==e.baseUrl.charAt(e.baseUrl.length-1)&&(e.baseUrl+="/"),"string"==typeof e.urlArgs){var t=e.urlArgs;e.urlArgs=function(e,i){return(i.indexOf("?")===-1?"?":"&")+t}}var i=y.shim,r={paths:!0,bundles:!0,config:!0,map:!0};eachProp(e,function(e,t){r[t]?(y[t]||(y[t]={}),mixin(y[t],e,!0,!0)):y[t]=e}),e.bundles&&eachProp(e.bundles,function(e,t){each(e,function(e){e!==t&&(R[e]=t)})}),e.shim&&(eachProp(e.shim,function(e,t){isArray(e)&&(e={deps:e}),!e.exports&&!e.init||e.exportsFn||(e.exportsFn=q.makeShimExports(e)),i[t]=e}),y.shim=i),e.packages&&each(e.packages,function(e){var t,i;e="string"==typeof e?{name:e}:e,i=e.name,t=e.location,t&&(y.paths[i]=e.location),y.pkgs[i]=e.name+"/"+(e.main||"main").replace(currDirRegExp,"").replace(jsSuffixRegExp,"")}),eachProp(S,function(e,t){e.inited||e.map.unnormalized||(e.map=a(t,null,!0))}),(e.deps||e.callback)&&q.require(e.deps||[],e.callback)},makeShimExports:function(e){function t(){var t;return e.init&&(t=e.init.apply(global,arguments)),t||e.exports&&getGlobal(e.exports)}return t},makeRequire:function(t,n){function o(i,r,u){var d,p,f;return n.enableBuildCallback&&r&&isFunction(r)&&(r.__requireJsBuild=!0),"string"==typeof i?isFunction(r)?c(makeError("requireargs","Invalid require call"),u):t&&hasProp(E,i)?E[i](S[t.id]):req.get?req.get(q,i,t,o):(p=a(i,t,!1,!0),d=p.id,hasProp(j,d)?j[d]:c(makeError("notloaded",'Module name "'+d+'" has not been loaded yet for context: '+e+(t?"":". Use require([])")))):(v(),q.nextTick(function(){v(),f=s(a(null,t)),f.skipMap=n.skipMap,f.init(i,r,u,{enabled:!0}),l()}),o)}return n=n||{},mixin(o,{isBrowser:isBrowser,toUrl:function(e){var r,n=e.lastIndexOf("."),o=e.split("/")[0],a="."===o||".."===o;return n!==-1&&(!a||n>1)&&(r=e.substring(n,e.length),e=e.substring(0,n)),q.nameToUrl(i(e,t&&t.id,!0),r,!0)},defined:function(e){return hasProp(j,a(e,t,!1,!0).id)},specified:function(e){return e=a(e,t,!1,!0).id,hasProp(j,e)||hasProp(S,e)}}),t||(o.undef=function(e){d();var i=a(e,t,!0),n=getOwn(S,e);n.undefed=!0,r(e),delete j[e],delete P[i.url],delete M[e],eachReverse(O,function(t,i){t[0]===e&&O.splice(i,1)}),delete q.defQueueMap[e],n&&(n.events.defined&&(M[e]=n.events),p(e))}),o},enable:function(e){var t=getOwn(S,e.id);t&&s(e).enable()},completeLoad:function(e){var t,i,r,o=getOwn(y.shim,e)||{},a=o.exports;for(d();O.length;){if(i=O.shift(),null===i[0]){if(i[0]=e,t)break;t=!0}else i[0]===e&&(t=!0);h(i)}if(q.defQueueMap={},r=getOwn(S,e),!t&&!hasProp(j,e)&&r&&!r.inited){if(!(!y.enforceDefine||a&&getGlobal(a)))return n(e)?void 0:c(makeError("nodefine","No define call for "+e,null,[e]));h([e,o.deps||[],o.exportsFn])}l()},nameToUrl:function(e,t,i){var r,n,o,a,s,u,c,d=getOwn(y.pkgs,e);if(d&&(e=d),c=getOwn(R,e))return q.nameToUrl(c,t,i);if(req.jsExtRegExp.test(e))s=e+(t||"");else{for(r=y.paths,n=e.split("/"),o=n.length;o>0;o-=1)if(a=n.slice(0,o).join("/"),u=getOwn(r,a)){isArray(u)&&(u=u[0]),n.splice(0,o,u);break}s=n.join("/"),s+=t||(/^data\:|^blob\:|\?/.test(s)||i?"":".js"),s=("/"===s.charAt(0)||s.match(/^[\w\+\.\-]+:/)?"":y.baseUrl)+s}return y.urlArgs&&!/^blob\:/.test(s)?s+y.urlArgs(e,s):s},load:function(e,t){req.load(q,e,t)},execCb:function(e,t,i,r){return t.apply(r,i)},onScriptLoad:function(e){if("load"===e.type||readyRegExp.test((e.currentTarget||e.srcElement).readyState)){interactiveScript=null;var t=g(e);q.completeLoad(t.id)}},onScriptError:function(e){var t=g(e);if(!n(t.id)){var i=[];return eachProp(S,function(e,r){0!==r.indexOf("_@r")&&each(e.depMaps,function(e){if(e.id===t.id)return i.push(r),!0})}),c(makeError("scripterror",'Script error for "'+t.id+(i.length?'", needed by: '+i.join(", "):'"'),e,[t.id]))}}},q.require=q.makeRequire(),q}function getInteractiveScript(){return interactiveScript&&"interactive"===interactiveScript.readyState?interactiveScript:(eachReverse(scripts(),function(e){if("interactive"===e.readyState)return interactiveScript=e}),interactiveScript)}var req,s,head,baseElement,dataMain,src,interactiveScript,currentlyAddingScript,mainScript,subPath,version="2.3.1",commentRegExp=/\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,cjsRequireRegExp=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,jsSuffixRegExp=/\.js$/,currDirRegExp=/^\.\//,op=Object.prototype,ostring=op.toString,hasOwn=op.hasOwnProperty,isBrowser=!("undefined"==typeof window||"undefined"==typeof navigator||!window.document),isWebWorker=!isBrowser&&"undefined"!=typeof importScripts,readyRegExp=isBrowser&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,defContextName="_",isOpera="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),contexts={},cfg={},globalDefQueue=[],useInteractive=!1;if("undefined"==typeof define){if("undefined"!=typeof requirejs){if(isFunction(requirejs))return;cfg=requirejs,requirejs=void 0}"undefined"==typeof require||isFunction(require)||(cfg=require,require=void 0),req=requirejs=function(e,t,i,r){var n,o,a=defContextName;return isArray(e)||"string"==typeof e||(o=e,isArray(t)?(e=t,t=i,i=r):e=[]),o&&o.context&&(a=o.context),n=getOwn(contexts,a),n||(n=contexts[a]=req.s.newContext(a)),o&&n.configure(o),n.require(e,t,i)},req.config=function(e){return req(e)},req.nextTick="undefined"!=typeof setTimeout?function(e){setTimeout(e,4)}:function(e){e()},require||(require=req),req.version=version,req.jsExtRegExp=/^\/|:|\?|\.js$/,req.isBrowser=isBrowser,s=req.s={contexts:contexts,newContext:newContext},req({}),each(["toUrl","undef","defined","specified"],function(e){req[e]=function(){var t=contexts[defContextName];return t.require[e].apply(t,arguments)}}),isBrowser&&(head=s.head=document.getElementsByTagName("head")[0],baseElement=document.getElementsByTagName("base")[0],baseElement&&(head=s.head=baseElement.parentNode)),req.onError=defaultOnError,req.createNode=function(e,t,i){var r=e.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");return r.type=e.scriptType||"text/javascript",r.charset="utf-8",r.async=!0,r},req.load=function(e,t,i){var r,n=e&&e.config||{};if(isBrowser)return r=req.createNode(n,t,i),r.setAttribute("data-requirecontext",e.contextName),r.setAttribute("data-requiremodule",t),!r.attachEvent||r.attachEvent.toString&&r.attachEvent.toString().indexOf("[native code")<0||isOpera?(r.addEventListener("load",e.onScriptLoad,!1),r.addEventListener("error",e.onScriptError,!1)):(useInteractive=!0,r.attachEvent("onreadystatechange",e.onScriptLoad)),r.src=i,n.onNodeCreated&&n.onNodeCreated(r,n,t,i),currentlyAddingScript=r,baseElement?head.insertBefore(r,baseElement):head.appendChild(r),currentlyAddingScript=null,r;if(isWebWorker)try{setTimeout(function(){},0),importScripts(i),e.completeLoad(t)}catch(r){e.onError(makeError("importscripts","importScripts failed for "+t+" at "+i,r,[t]))}},isBrowser&&!cfg.skipDataMain&&eachReverse(scripts(),function(e){if(head||(head=e.parentNode),dataMain=e.getAttribute("data-main"))return mainScript=dataMain,cfg.baseUrl||mainScript.indexOf("!")!==-1||(src=mainScript.split("/"),mainScript=src.pop(),subPath=src.length?src.join("/")+"/":"./",cfg.baseUrl=subPath),mainScript=mainScript.replace(jsSuffixRegExp,""),req.jsExtRegExp.test(mainScript)&&(mainScript=dataMain),cfg.deps=cfg.deps?cfg.deps.concat(mainScript):[mainScript],!0}),define=function(e,t,i){var r,n;"string"!=typeof e&&(i=t,t=e,e=null),isArray(t)||(i=t,t=null),!t&&isFunction(i)&&(t=[],i.length&&(i.toString().replace(commentRegExp,commentReplace).replace(cjsRequireRegExp,function(e,i){t.push(i)}),t=(1===i.length?["require"]:["require","exports","module"]).concat(t))),useInteractive&&(r=currentlyAddingScript||getInteractiveScript(),r&&(e||(e=r.getAttribute("data-requiremodule")),n=contexts[r.getAttribute("data-requirecontext")])),n?(n.defQueue.push([e,t,i]),n.defQueueMap[e]=!0):globalDefQueue.push([e,t,i])},define.amd={jQuery:!0},req.exec=function(text){return eval(text)},req(cfg)}}(this,setTimeout); -------------------------------------------------------------------------------- /js/app/FurRenderer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | define([ 4 | 'framework/BaseRenderer', 5 | 'jquery', 6 | 'FurShader', 7 | 'DiffuseShader', 8 | 'DiffuseColoredShader', 9 | 'framework/utils/MatrixUtils', 10 | 'framework/FullModel', 11 | 'framework/UncompressedTextureLoader', 12 | 'framework/CompressedTextureLoader', 13 | 'FurPresets', 14 | 'VignetteData' 15 | ], 16 | function( 17 | BaseRenderer, 18 | $, 19 | FurShader, 20 | DiffuseShader, 21 | DiffuseColoredShader, 22 | MatrixUtils, 23 | FullModel, 24 | UncompressedTextureLoader, 25 | CompressedTextureLoader, 26 | FurPresets, 27 | VignetteData) { 28 | 29 | class FurRenderer extends BaseRenderer { 30 | constructor() { 31 | super(); 32 | 33 | this.loadedItemsCount = 0; // couter of loaded OpenGL buffers+textures 34 | this.loaded = false; // won't draw until this is true 35 | 36 | this.angleYaw = 0; // camera rotation angle 37 | this.lastTime = 0; // used for animating camera 38 | this.furTimer = 0; 39 | this.windTimer = 0; 40 | this.loadingNextFur = false; 41 | 42 | this.currentPreset = null; 43 | this.nextPreset = null; 44 | 45 | this.matOrtho = MatrixUtils.mat4.create(); 46 | MatrixUtils.mat4.ortho(this.matOrtho, -1, 1, -1, 1, 2.0, 250); 47 | 48 | this.ITEMS_TO_LOAD = 4; // total number of OpenGL buffers+textures to load 49 | this.FLOAT_SIZE_BYTES = 4; // float size, used to calculate stride sizes 50 | this.TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * this.FLOAT_SIZE_BYTES; 51 | this.TRIANGLE_VERTICES_DATA_POS_OFFSET = 0; 52 | this.TRIANGLE_VERTICES_DATA_UV_OFFSET = 3; 53 | this.FOV_LANDSCAPE = 25.0; // FOV for landscape 54 | this.FOV_PORTRAIT = 40.0; // FOV for portrait 55 | this.YAW_COEFF_NORMAL = 12000.0; // camera rotation speed 56 | this.DISTANCE_TO_NEXT_CUBE = 200; 57 | 58 | this.FUR_ANIMATION_SPEED = 1500.0; 59 | this.FUR_WIND_SPEED = 8310.0; 60 | this.FUR_STIFFNESS = 2.75; 61 | } 62 | 63 | /** 64 | * Resets loaded state for renderer 65 | */ 66 | resetLoaded() { 67 | this.loaded = false; 68 | this.loadedItemsCount = 0; 69 | } 70 | 71 | onAfterInit() { 72 | super.onAfterInit(); 73 | 74 | if (!this.isWebGL2) { 75 | this.onInitError(); 76 | } 77 | } 78 | 79 | onBeforeInit() { 80 | super.onBeforeInit(); 81 | 82 | $('#canvasGL').show(); 83 | } 84 | 85 | onInitError() { 86 | super.onInitError(); 87 | 88 | $('#canvasGL').hide(); 89 | $('#alertError').show(); 90 | } 91 | 92 | initShaders() { 93 | this.shaderDiffuse = new DiffuseShader(); 94 | this.shaderDiffuseColored = new DiffuseColoredShader(); 95 | this.shaderFur = new FurShader(); 96 | } 97 | 98 | /** 99 | * Callback for all loading function. Updates loading progress and allows rendering after loading all stuff 100 | */ 101 | updateLoadedObjectsCount() { 102 | var percent, 103 | $progress = $('#progressLoading'); 104 | 105 | this.loadedItemsCount++; // increase loaded objects counter 106 | 107 | percent = Math.floor(this.loadedItemsCount * 100 / this.ITEMS_TO_LOAD) + '%'; 108 | $progress 109 | .css('width', percent) 110 | .html(percent); // update loading progress 111 | 112 | if (this.loadedItemsCount >= this.ITEMS_TO_LOAD) { 113 | this.loaded = true; // allow rendering 114 | console.log('Loaded all assets'); 115 | $('#row-progress').hide(); 116 | $('.control-icon').show(); 117 | this.onPresetLoaded && this.onPresetLoaded(); 118 | } 119 | } 120 | 121 | /** 122 | * loads all WebGL buffers and textures. Uses updateLoadedObjectsCount() callback to indicate that data is loaded to GPU 123 | */ 124 | loadData() { 125 | var boundUpdateCallback = this.updateLoadedObjectsCount.bind(this); 126 | 127 | this.modelCube = new FullModel(); 128 | this.modelCube.load('data/models/box10_rounded', boundUpdateCallback); 129 | // this.textureChecker = UncompressedTextureLoader.load('data/textures/checker.png', boundUpdateCallback); 130 | this.textureBackground = UncompressedTextureLoader.load('data/textures/bg-gradient.png', boundUpdateCallback); 131 | 132 | this.currentPreset = Object.assign({}, FurPresets.current()); 133 | 134 | this.textureFurDiffuse = UncompressedTextureLoader.load('data/textures/' + this.getCurrentPresetParameter('diffuseTexture'), boundUpdateCallback); 135 | this.textureFurAlpha = UncompressedTextureLoader.load('data/textures/' + this.getCurrentPresetParameter('alphaTexture'), boundUpdateCallback); 136 | 137 | this.vignette = new VignetteData(); 138 | this.vignette.initGL(gl); 139 | } 140 | 141 | getCurrentPresetParameter(param) { 142 | return this.currentPreset[param]; 143 | } 144 | 145 | getNextPresetParameter(param) { 146 | return this.nextPreset[param]; 147 | } 148 | 149 | loadNextFurTextures(callback) { 150 | this.textureFurDiffuseNext && gl.deleteTexture(this.textureFurDiffuseNext); 151 | this.textureFurAlphaNext && gl.deleteTexture(this.textureFurAlphaNext); 152 | 153 | this.textureFurDiffuseNext = UncompressedTextureLoader.load('data/textures/' + this.getNextPresetParameter('diffuseTexture'), callback); 154 | this.textureFurAlphaNext = UncompressedTextureLoader.load('data/textures/' + this.getNextPresetParameter('alphaTexture'), callback); 155 | } 156 | 157 | get layers() { 158 | return this.currentPreset['layers']; 159 | } 160 | 161 | set layers(value) { 162 | this.currentPreset['layers'] = value; 163 | } 164 | 165 | get thickness() { 166 | return this.currentPreset['thickness']; 167 | } 168 | 169 | set thickness(value) { 170 | this.currentPreset['thickness'] = value; 171 | } 172 | 173 | get presetName() { 174 | return this.currentPreset['name']; 175 | } 176 | 177 | loadPreset(preset) { 178 | var root = this, 179 | counter = 0; 180 | 181 | this.nextPreset = preset; 182 | this.loadingNextFur = true; 183 | 184 | root.loadNextFurTextures(function() { 185 | counter++; 186 | if (counter == 2) { 187 | root.loadingNextFur = false; 188 | } 189 | }); 190 | } 191 | 192 | chooseNextPreset() { 193 | this.loadPreset(FurPresets.next()); 194 | } 195 | 196 | choosePreviousPreset() { 197 | this.loadPreset(FurPresets.previous()); 198 | } 199 | 200 | /** 201 | * Loads either ETC1 from PKM or falls back to loading PNG 202 | * @param {string} url - URL to texture without extension 203 | */ 204 | loadETC1WithFallback(url) { 205 | var boundUpdateCallback = this.updateLoadedObjectsCount.bind(this); 206 | 207 | if (this.isETC1Supported) { 208 | return CompressedTextureLoader.loadETC1(url + '.pkm', boundUpdateCallback); 209 | } else { 210 | return UncompressedTextureLoader.load(url + '.png', boundUpdateCallback); 211 | } 212 | } 213 | 214 | /** 215 | * Calculates camera matrix 216 | * @param {unmber} a - position in [0...1] range 217 | */ 218 | positionCamera(a) { 219 | MatrixUtils.mat4.identity(this.mVMatrix); 220 | MatrixUtils.mat4.lookAt(this.mVMatrix, [190, 0, 270], [0, 0, 0], [0, 0, 1]); 221 | } 222 | 223 | /** 224 | * Calculates projection matrix 225 | */ 226 | setCameraFOV(multiplier) { 227 | var ratio; 228 | 229 | if (gl.canvas.height > 0) { 230 | ratio = gl.canvas.width / gl.canvas.height; 231 | } else { 232 | ratio = 1.0; 233 | } 234 | 235 | if (gl.canvas.width >= gl.canvas.height) { 236 | this.setFOV(this.mProjMatrix, this.FOV_LANDSCAPE * multiplier, ratio, 20.0, 1000.0); 237 | } else { 238 | this.setFOV(this.mProjMatrix, this.FOV_PORTRAIT * multiplier, ratio, 20.0, 1000.0); 239 | } 240 | } 241 | 242 | /** 243 | * Issues actual draw calls 244 | */ 245 | drawScene() { 246 | if (!this.loaded) { 247 | return; 248 | } 249 | 250 | if (!this.loadingNextFur) { 251 | if (this.textureFurDiffuseNext && this.textureFurAlphaNext) { 252 | this.currentPreset = Object.assign({}, FurPresets.current()); 253 | this.onPresetLoaded && this.onPresetLoaded(); 254 | gl.deleteTexture(this.textureFurDiffuse); 255 | gl.deleteTexture(this.textureFurAlpha); 256 | this.textureFurDiffuse = this.textureFurDiffuseNext; 257 | this.textureFurAlpha = this.textureFurAlphaNext; 258 | this.textureFurDiffuseNext = null; 259 | this.textureFurAlphaNext = null; 260 | } 261 | } 262 | 263 | gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); 264 | gl.clearColor(0.3, 0.3, 0.3, 1.0); 265 | gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 266 | 267 | gl.enable(gl.DEPTH_TEST); 268 | gl.enable(gl.CULL_FACE); 269 | gl.cullFace(gl.BACK); 270 | 271 | gl.depthMask(false); 272 | this.drawVignette(this.textureBackground); 273 | gl.depthMask(true); 274 | 275 | this.positionCamera(0.0); 276 | this.setCameraFOV(0.6); 277 | 278 | this.drawCubeDiffuse(this.textureFurDiffuse, this.currentPreset); 279 | 280 | gl.disable(gl.CULL_FACE); 281 | gl.enable(gl.BLEND); 282 | // gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); // too dim 283 | // gl.blendFunc(gl.SRC_ALPHA, gl.ONE); // too bright 284 | gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE); 285 | 286 | this.drawFur(this.textureFurDiffuse, this.textureFurAlpha, this.currentPreset); 287 | 288 | gl.disable(gl.BLEND); 289 | } 290 | 291 | drawVignette(texture) { 292 | this.shaderDiffuse.use(); 293 | 294 | this.setTexture2D(0, texture, this.shaderDiffuse.sTexture); 295 | 296 | gl.bindBuffer(gl.ARRAY_BUFFER, this.vignette.buffer); 297 | 298 | gl.vertexAttribPointer(this.shaderDiffuse.rm_Vertex, 3, gl.FLOAT, false, this.TRIANGLE_VERTICES_DATA_STRIDE_BYTES, this.TRIANGLE_VERTICES_DATA_POS_OFFSET * this.FLOAT_SIZE_BYTES); 299 | gl.enableVertexAttribArray(this.shaderDiffuse.rm_Vertex); 300 | 301 | gl.vertexAttribPointer(this.shaderDiffuse.rm_TexCoord0, 2, gl.FLOAT, false, this.TRIANGLE_VERTICES_DATA_STRIDE_BYTES, this.TRIANGLE_VERTICES_DATA_UV_OFFSET * this.FLOAT_SIZE_BYTES); 302 | gl.enableVertexAttribArray(this.shaderDiffuse.rm_TexCoord0); 303 | 304 | gl.uniformMatrix4fv(this.shaderDiffuse.view_proj_matrix, false, this.matOrtho); 305 | gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); 306 | } 307 | 308 | 309 | drawCubeDiffuse(texture, preset) { 310 | this.shaderDiffuseColored.use(); 311 | this.setTexture2D(0, texture, this.shaderDiffuseColored.sTexture); 312 | gl.uniform4f(this.shaderDiffuseColored.color, preset.startColor[0], preset.startColor[1], preset.startColor[2], preset.startColor[3]); 313 | this.drawDiffuseNormalStrideVBOTranslatedRotatedScaled(this.shaderDiffuseColored, this.modelCube, 0, 0, 0, 0, 0, this.angleYaw, 1, 1, 1); 314 | } 315 | 316 | drawLoadingCube() { 317 | this.shaderDiffuseColored.use(); 318 | this.setTexture2D(0, this.textureChecker, this.shaderDiffuseColored.sTexture); 319 | gl.uniform4f(this.shaderDiffuseColored.color, 0.8, 0.8, 0.8, 1); 320 | this.drawDiffuseNormalStrideVBOTranslatedRotatedScaled(this.shaderDiffuseColored, this.modelCube, 0, 0, 0, 0, 0, this.angleYaw, 1, 1, 1); 321 | } 322 | 323 | drawFur(textureDiffuse, textureAlpha, preset) { 324 | this.shaderFur.use(); 325 | this.setTexture2D(0, textureDiffuse, this.shaderFur.diffuseMap); 326 | this.setTexture2D(1, textureAlpha, this.shaderFur.alphaMap); 327 | this.drawFurVBOTranslatedRotatedScaledInstanced(preset, this.shaderFur, this.modelCube, 0, 0, 0, 0, 0, this.angleYaw, 1, 1, 1); 328 | } 329 | 330 | drawDiffuseNormalStrideVBOTranslatedRotatedScaled(shader, model, tx, ty, tz, rx, ry, rz, sx, sy, sz) { 331 | model.bindBuffers(); 332 | 333 | gl.enableVertexAttribArray(shader.rm_Vertex); 334 | gl.enableVertexAttribArray(shader.rm_TexCoord0); 335 | 336 | gl.vertexAttribPointer(shader.rm_Vertex, 3, gl.FLOAT, false, 4 * (3 + 2 + 3), 0); 337 | gl.vertexAttribPointer(shader.rm_TexCoord0, 2, gl.FLOAT, false, 4 * (3 + 2 + 3), 4 * (3)); 338 | 339 | this.calculateMVPMatrix(tx, ty, tz, rx, ry, rz, sx, sy, sz); 340 | 341 | gl.uniformMatrix4fv(shader.view_proj_matrix, false, this.mMVPMatrix); 342 | gl.drawElements(gl.TRIANGLES, model.getNumIndices() * 3, gl.UNSIGNED_SHORT, 0); 343 | } 344 | 345 | drawFurVBOTranslatedRotatedScaledInstanced(preset, shader, model, tx, ty, tz, rx, ry, rz, sx, sy, sz) { 346 | var a = Math.sin(this.windTimer * 6.2831852) / 2 + 0.5, 347 | scale = preset.waveScale * 0.4 + (a * preset.waveScale * 0.6); 348 | 349 | model.bindBuffers(); 350 | 351 | gl.enableVertexAttribArray(shader.rm_Vertex); 352 | gl.enableVertexAttribArray(shader.rm_TexCoord0); 353 | gl.enableVertexAttribArray(shader.rm_Normal); 354 | 355 | gl.vertexAttribPointer(shader.rm_Vertex, 3, gl.FLOAT, false, 4 * (3 + 2 + 3), 0); 356 | gl.vertexAttribPointer(shader.rm_TexCoord0, 2, gl.FLOAT, false, 4 * (3 + 2 + 3), 4 * (3)); 357 | gl.vertexAttribPointer(shader.rm_Normal, 3, gl.FLOAT, false, 4 * (3 + 2 + 3), 4 * (3 + 2)); 358 | 359 | this.calculateMVPMatrix(tx, ty, tz, rx, ry, rz, sx, sy, sz); 360 | 361 | gl.uniformMatrix4fv(shader.view_proj_matrix, false, this.mMVPMatrix); 362 | gl.uniform1f(shader.layerThickness, preset.thickness); 363 | gl.uniform1f(shader.layersCount, preset.layers); 364 | gl.uniform4f(shader.colorStart, preset.startColor[0], preset.startColor[1], preset.startColor[2], preset.startColor[3]); 365 | gl.uniform4f(shader.colorEnd, preset.endColor[0], preset.endColor[1], preset.endColor[2], preset.endColor[3]); 366 | gl.uniform1f(shader.time, this.furTimer); 367 | gl.uniform1f(shader.waveScale, scale); 368 | gl.uniform1f(shader.stiffness, this.FUR_STIFFNESS); 369 | gl.drawElementsInstanced(gl.TRIANGLES, model.getNumIndices() * 3, gl.UNSIGNED_SHORT, 0, preset.layers); 370 | } 371 | 372 | /** 373 | * Updates camera rotation 374 | */ 375 | animate() { 376 | var timeNow = new Date().getTime(), 377 | elapsed; 378 | 379 | if (this.lastTime != 0) { 380 | elapsed = timeNow - this.lastTime; 381 | 382 | this.angleYaw += elapsed / this.YAW_COEFF_NORMAL; 383 | this.angleYaw %= 360.0; 384 | 385 | this.furTimer += elapsed / this.FUR_ANIMATION_SPEED; 386 | this.furTimer %= 1.0; 387 | 388 | this.windTimer += elapsed / this.FUR_WIND_SPEED; 389 | this.windTimer %= 1.0; 390 | } 391 | 392 | this.lastTime = timeNow; 393 | } 394 | } 395 | 396 | return FurRenderer; 397 | }); 398 | -------------------------------------------------------------------------------- /styles/css/theme.min.css: -------------------------------------------------------------------------------- 1 | /*! Generated by Live LESS Theme Customizer */ 2 | .label,sub,sup{vertical-align:baseline} 3 | body,figure{margin:0} 4 | .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px} 5 | html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:10px;-webkit-tap-highlight-color:transparent} 6 | article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block} 7 | audio,canvas,progress,video{display:inline-block;vertical-align:baseline} 8 | audio:not([controls]){display:none;height:0} 9 | [hidden],template{display:none} 10 | a{background-color:transparent} 11 | a:active,a:hover{outline:0} 12 | b,optgroup,strong{font-weight:700} 13 | dfn{font-style:italic} 14 | h1{margin:.67em 0} 15 | mark{background:#ff0;color:#000} 16 | sub,sup{font-size:75%;line-height:0;position:relative} 17 | sup{top:-.5em} 18 | sub{bottom:-.25em} 19 | img{border:0;vertical-align:middle} 20 | svg:not(:root){overflow:hidden} 21 | hr{box-sizing:content-box;height:0} 22 | pre,textarea{overflow:auto} 23 | code,kbd,pre,samp{font-size:1em} 24 | button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0} 25 | button{overflow:visible} 26 | button,select{text-transform:none} 27 | button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer} 28 | button[disabled],html input[disabled]{cursor:default} 29 | button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} 30 | input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0} 31 | input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto} 32 | input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none} 33 | table{border-collapse:collapse;border-spacing:0} 34 | td,th{padding:0} 35 | @media print{blockquote,img,pre,tr{page-break-inside:avoid} 36 | *,:after,:before{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important} 37 | a,a:visited{text-decoration:underline} 38 | a[href]:after{content:" (" attr(href) ")"} 39 | abbr[title]:after{content:" (" attr(title) ")"} 40 | a[href^="javascript:"]:after,a[href^="#"]:after{content:""} 41 | blockquote,pre{border:1px solid #999} 42 | thead{display:table-header-group} 43 | img{max-width:100%!important} 44 | h2,h3,p{orphans:3;widows:3} 45 | h2,h3{page-break-after:avoid} 46 | .navbar{display:none} 47 | .btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important} 48 | .label{border:1px solid #000} 49 | .table{border-collapse:collapse!important} 50 | .table td,.table th{background-color:#fff!important} 51 | .table-bordered td,.table-bordered th{border:1px solid #ddd!important} 52 | } 53 | .img-thumbnail,body{background-color:#fff} 54 | .btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none} 55 | @font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')} 56 | .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} 57 | .glyphicon-asterisk:before{content:"\002a"} 58 | .glyphicon-plus:before{content:"\002b"} 59 | .glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"} 60 | .glyphicon-minus:before{content:"\2212"} 61 | .glyphicon-cloud:before{content:"\2601"} 62 | .glyphicon-envelope:before{content:"\2709"} 63 | .glyphicon-pencil:before{content:"\270f"} 64 | .glyphicon-glass:before{content:"\e001"} 65 | .glyphicon-music:before{content:"\e002"} 66 | .glyphicon-search:before{content:"\e003"} 67 | .glyphicon-heart:before{content:"\e005"} 68 | .glyphicon-star:before{content:"\e006"} 69 | .glyphicon-star-empty:before{content:"\e007"} 70 | .glyphicon-user:before{content:"\e008"} 71 | .glyphicon-film:before{content:"\e009"} 72 | .glyphicon-th-large:before{content:"\e010"} 73 | .glyphicon-th:before{content:"\e011"} 74 | .glyphicon-th-list:before{content:"\e012"} 75 | .glyphicon-ok:before{content:"\e013"} 76 | .glyphicon-remove:before{content:"\e014"} 77 | .glyphicon-zoom-in:before{content:"\e015"} 78 | .glyphicon-zoom-out:before{content:"\e016"} 79 | .glyphicon-off:before{content:"\e017"} 80 | .glyphicon-signal:before{content:"\e018"} 81 | .glyphicon-cog:before{content:"\e019"} 82 | .glyphicon-trash:before{content:"\e020"} 83 | .glyphicon-home:before{content:"\e021"} 84 | .glyphicon-file:before{content:"\e022"} 85 | .glyphicon-time:before{content:"\e023"} 86 | .glyphicon-road:before{content:"\e024"} 87 | .glyphicon-download-alt:before{content:"\e025"} 88 | .glyphicon-download:before{content:"\e026"} 89 | .glyphicon-upload:before{content:"\e027"} 90 | .glyphicon-inbox:before{content:"\e028"} 91 | .glyphicon-play-circle:before{content:"\e029"} 92 | .glyphicon-repeat:before{content:"\e030"} 93 | .glyphicon-refresh:before{content:"\e031"} 94 | .glyphicon-list-alt:before{content:"\e032"} 95 | .glyphicon-lock:before{content:"\e033"} 96 | .glyphicon-flag:before{content:"\e034"} 97 | .glyphicon-headphones:before{content:"\e035"} 98 | .glyphicon-volume-off:before{content:"\e036"} 99 | .glyphicon-volume-down:before{content:"\e037"} 100 | .glyphicon-volume-up:before{content:"\e038"} 101 | .glyphicon-qrcode:before{content:"\e039"} 102 | .glyphicon-barcode:before{content:"\e040"} 103 | .glyphicon-tag:before{content:"\e041"} 104 | .glyphicon-tags:before{content:"\e042"} 105 | .glyphicon-book:before{content:"\e043"} 106 | .glyphicon-bookmark:before{content:"\e044"} 107 | .glyphicon-print:before{content:"\e045"} 108 | .glyphicon-camera:before{content:"\e046"} 109 | .glyphicon-font:before{content:"\e047"} 110 | .glyphicon-bold:before{content:"\e048"} 111 | .glyphicon-italic:before{content:"\e049"} 112 | .glyphicon-text-height:before{content:"\e050"} 113 | .glyphicon-text-width:before{content:"\e051"} 114 | .glyphicon-align-left:before{content:"\e052"} 115 | .glyphicon-align-center:before{content:"\e053"} 116 | .glyphicon-align-right:before{content:"\e054"} 117 | .glyphicon-align-justify:before{content:"\e055"} 118 | .glyphicon-list:before{content:"\e056"} 119 | .glyphicon-indent-left:before{content:"\e057"} 120 | .glyphicon-indent-right:before{content:"\e058"} 121 | .glyphicon-facetime-video:before{content:"\e059"} 122 | .glyphicon-picture:before{content:"\e060"} 123 | .glyphicon-map-marker:before{content:"\e062"} 124 | .glyphicon-adjust:before{content:"\e063"} 125 | .glyphicon-tint:before{content:"\e064"} 126 | .glyphicon-edit:before{content:"\e065"} 127 | .glyphicon-share:before{content:"\e066"} 128 | .glyphicon-check:before{content:"\e067"} 129 | .glyphicon-move:before{content:"\e068"} 130 | .glyphicon-step-backward:before{content:"\e069"} 131 | .glyphicon-fast-backward:before{content:"\e070"} 132 | .glyphicon-backward:before{content:"\e071"} 133 | .glyphicon-play:before{content:"\e072"} 134 | .glyphicon-pause:before{content:"\e073"} 135 | .glyphicon-stop:before{content:"\e074"} 136 | .glyphicon-forward:before{content:"\e075"} 137 | .glyphicon-fast-forward:before{content:"\e076"} 138 | .glyphicon-step-forward:before{content:"\e077"} 139 | .glyphicon-eject:before{content:"\e078"} 140 | .glyphicon-chevron-left:before{content:"\e079"} 141 | .glyphicon-chevron-right:before{content:"\e080"} 142 | .glyphicon-plus-sign:before{content:"\e081"} 143 | .glyphicon-minus-sign:before{content:"\e082"} 144 | .glyphicon-remove-sign:before{content:"\e083"} 145 | .glyphicon-ok-sign:before{content:"\e084"} 146 | .glyphicon-question-sign:before{content:"\e085"} 147 | .glyphicon-info-sign:before{content:"\e086"} 148 | .glyphicon-screenshot:before{content:"\e087"} 149 | .glyphicon-remove-circle:before{content:"\e088"} 150 | .glyphicon-ok-circle:before{content:"\e089"} 151 | .glyphicon-ban-circle:before{content:"\e090"} 152 | .glyphicon-arrow-left:before{content:"\e091"} 153 | .glyphicon-arrow-right:before{content:"\e092"} 154 | .glyphicon-arrow-up:before{content:"\e093"} 155 | .glyphicon-arrow-down:before{content:"\e094"} 156 | .glyphicon-share-alt:before{content:"\e095"} 157 | .glyphicon-resize-full:before{content:"\e096"} 158 | .glyphicon-resize-small:before{content:"\e097"} 159 | .glyphicon-exclamation-sign:before{content:"\e101"} 160 | .glyphicon-gift:before{content:"\e102"} 161 | .glyphicon-leaf:before{content:"\e103"} 162 | .glyphicon-fire:before{content:"\e104"} 163 | .glyphicon-eye-open:before{content:"\e105"} 164 | .glyphicon-eye-close:before{content:"\e106"} 165 | .glyphicon-warning-sign:before{content:"\e107"} 166 | .glyphicon-plane:before{content:"\e108"} 167 | .glyphicon-calendar:before{content:"\e109"} 168 | .glyphicon-random:before{content:"\e110"} 169 | .glyphicon-comment:before{content:"\e111"} 170 | .glyphicon-magnet:before{content:"\e112"} 171 | .glyphicon-chevron-up:before{content:"\e113"} 172 | .glyphicon-chevron-down:before{content:"\e114"} 173 | .glyphicon-retweet:before{content:"\e115"} 174 | .glyphicon-shopping-cart:before{content:"\e116"} 175 | .glyphicon-folder-close:before{content:"\e117"} 176 | .glyphicon-folder-open:before{content:"\e118"} 177 | .glyphicon-resize-vertical:before{content:"\e119"} 178 | .glyphicon-resize-horizontal:before{content:"\e120"} 179 | .glyphicon-hdd:before{content:"\e121"} 180 | .glyphicon-bullhorn:before{content:"\e122"} 181 | .glyphicon-bell:before{content:"\e123"} 182 | .glyphicon-certificate:before{content:"\e124"} 183 | .glyphicon-thumbs-up:before{content:"\e125"} 184 | .glyphicon-thumbs-down:before{content:"\e126"} 185 | .glyphicon-hand-right:before{content:"\e127"} 186 | .glyphicon-hand-left:before{content:"\e128"} 187 | .glyphicon-hand-up:before{content:"\e129"} 188 | .glyphicon-hand-down:before{content:"\e130"} 189 | .glyphicon-circle-arrow-right:before{content:"\e131"} 190 | .glyphicon-circle-arrow-left:before{content:"\e132"} 191 | .glyphicon-circle-arrow-up:before{content:"\e133"} 192 | .glyphicon-circle-arrow-down:before{content:"\e134"} 193 | .glyphicon-globe:before{content:"\e135"} 194 | .glyphicon-wrench:before{content:"\e136"} 195 | .glyphicon-tasks:before{content:"\e137"} 196 | .glyphicon-filter:before{content:"\e138"} 197 | .glyphicon-briefcase:before{content:"\e139"} 198 | .glyphicon-fullscreen:before{content:"\e140"} 199 | .glyphicon-dashboard:before{content:"\e141"} 200 | .glyphicon-paperclip:before{content:"\e142"} 201 | .glyphicon-heart-empty:before{content:"\e143"} 202 | .glyphicon-link:before{content:"\e144"} 203 | .glyphicon-phone:before{content:"\e145"} 204 | .glyphicon-pushpin:before{content:"\e146"} 205 | .glyphicon-usd:before{content:"\e148"} 206 | .glyphicon-gbp:before{content:"\e149"} 207 | .glyphicon-sort:before{content:"\e150"} 208 | .glyphicon-sort-by-alphabet:before{content:"\e151"} 209 | .glyphicon-sort-by-alphabet-alt:before{content:"\e152"} 210 | .glyphicon-sort-by-order:before{content:"\e153"} 211 | .glyphicon-sort-by-order-alt:before{content:"\e154"} 212 | .glyphicon-sort-by-attributes:before{content:"\e155"} 213 | .glyphicon-sort-by-attributes-alt:before{content:"\e156"} 214 | .glyphicon-unchecked:before{content:"\e157"} 215 | .glyphicon-expand:before{content:"\e158"} 216 | .glyphicon-collapse-down:before{content:"\e159"} 217 | .glyphicon-collapse-up:before{content:"\e160"} 218 | .glyphicon-log-in:before{content:"\e161"} 219 | .glyphicon-flash:before{content:"\e162"} 220 | .glyphicon-log-out:before{content:"\e163"} 221 | .glyphicon-new-window:before{content:"\e164"} 222 | .glyphicon-record:before{content:"\e165"} 223 | .glyphicon-save:before{content:"\e166"} 224 | .glyphicon-open:before{content:"\e167"} 225 | .glyphicon-saved:before{content:"\e168"} 226 | .glyphicon-import:before{content:"\e169"} 227 | .glyphicon-export:before{content:"\e170"} 228 | .glyphicon-send:before{content:"\e171"} 229 | .glyphicon-floppy-disk:before{content:"\e172"} 230 | .glyphicon-floppy-saved:before{content:"\e173"} 231 | .glyphicon-floppy-remove:before{content:"\e174"} 232 | .glyphicon-floppy-save:before{content:"\e175"} 233 | .glyphicon-floppy-open:before{content:"\e176"} 234 | .glyphicon-credit-card:before{content:"\e177"} 235 | .glyphicon-transfer:before{content:"\e178"} 236 | .glyphicon-cutlery:before{content:"\e179"} 237 | .glyphicon-header:before{content:"\e180"} 238 | .glyphicon-compressed:before{content:"\e181"} 239 | .glyphicon-earphone:before{content:"\e182"} 240 | .glyphicon-phone-alt:before{content:"\e183"} 241 | .glyphicon-tower:before{content:"\e184"} 242 | .glyphicon-stats:before{content:"\e185"} 243 | .glyphicon-sd-video:before{content:"\e186"} 244 | .glyphicon-hd-video:before{content:"\e187"} 245 | .glyphicon-subtitles:before{content:"\e188"} 246 | .glyphicon-sound-stereo:before{content:"\e189"} 247 | .glyphicon-sound-dolby:before{content:"\e190"} 248 | .glyphicon-sound-5-1:before{content:"\e191"} 249 | .glyphicon-sound-6-1:before{content:"\e192"} 250 | .glyphicon-sound-7-1:before{content:"\e193"} 251 | .glyphicon-copyright-mark:before{content:"\e194"} 252 | .glyphicon-registration-mark:before{content:"\e195"} 253 | .glyphicon-cloud-download:before{content:"\e197"} 254 | .glyphicon-cloud-upload:before{content:"\e198"} 255 | .glyphicon-tree-conifer:before{content:"\e199"} 256 | .glyphicon-tree-deciduous:before{content:"\e200"} 257 | .glyphicon-cd:before{content:"\e201"} 258 | .glyphicon-save-file:before{content:"\e202"} 259 | .glyphicon-open-file:before{content:"\e203"} 260 | .glyphicon-level-up:before{content:"\e204"} 261 | .glyphicon-copy:before{content:"\e205"} 262 | .glyphicon-paste:before{content:"\e206"} 263 | .glyphicon-alert:before{content:"\e209"} 264 | .glyphicon-equalizer:before{content:"\e210"} 265 | .glyphicon-king:before{content:"\e211"} 266 | .glyphicon-queen:before{content:"\e212"} 267 | .glyphicon-pawn:before{content:"\e213"} 268 | .glyphicon-bishop:before{content:"\e214"} 269 | .glyphicon-knight:before{content:"\e215"} 270 | .glyphicon-baby-formula:before{content:"\e216"} 271 | .glyphicon-tent:before{content:"\26fa"} 272 | .glyphicon-blackboard:before{content:"\e218"} 273 | .glyphicon-bed:before{content:"\e219"} 274 | .glyphicon-apple:before{content:"\f8ff"} 275 | .glyphicon-erase:before{content:"\e221"} 276 | .glyphicon-hourglass:before{content:"\231b"} 277 | .glyphicon-lamp:before{content:"\e223"} 278 | .glyphicon-duplicate:before{content:"\e224"} 279 | .glyphicon-piggy-bank:before{content:"\e225"} 280 | .glyphicon-scissors:before{content:"\e226"} 281 | .glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"} 282 | .glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"} 283 | .glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"} 284 | .glyphicon-scale:before{content:"\e230"} 285 | .glyphicon-ice-lolly:before{content:"\e231"} 286 | .glyphicon-ice-lolly-tasted:before{content:"\e232"} 287 | .glyphicon-education:before{content:"\e233"} 288 | .glyphicon-option-horizontal:before{content:"\e234"} 289 | .glyphicon-option-vertical:before{content:"\e235"} 290 | .glyphicon-menu-hamburger:before{content:"\e236"} 291 | .glyphicon-modal-window:before{content:"\e237"} 292 | .glyphicon-oil:before{content:"\e238"} 293 | .glyphicon-grain:before{content:"\e239"} 294 | .glyphicon-sunglasses:before{content:"\e240"} 295 | .glyphicon-text-size:before{content:"\e241"} 296 | .glyphicon-text-color:before{content:"\e242"} 297 | .glyphicon-text-background:before{content:"\e243"} 298 | .glyphicon-object-align-top:before{content:"\e244"} 299 | .glyphicon-object-align-bottom:before{content:"\e245"} 300 | .glyphicon-object-align-horizontal:before{content:"\e246"} 301 | .glyphicon-object-align-left:before{content:"\e247"} 302 | .glyphicon-object-align-vertical:before{content:"\e248"} 303 | .glyphicon-object-align-right:before{content:"\e249"} 304 | .glyphicon-triangle-right:before{content:"\e250"} 305 | .glyphicon-triangle-left:before{content:"\e251"} 306 | .glyphicon-triangle-bottom:before{content:"\e252"} 307 | .glyphicon-triangle-top:before{content:"\e253"} 308 | .glyphicon-console:before{content:"\e254"} 309 | .glyphicon-superscript:before{content:"\e255"} 310 | .glyphicon-subscript:before{content:"\e256"} 311 | .glyphicon-menu-left:before{content:"\e257"} 312 | .glyphicon-menu-right:before{content:"\e258"} 313 | .glyphicon-menu-down:before{content:"\e259"} 314 | .glyphicon-menu-up:before{content:"\e260"} 315 | *,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} 316 | body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333} 317 | button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit} 318 | a{color:#428bca;text-decoration:none} 319 | a:focus,a:hover{color:#2a6496;text-decoration:underline} 320 | a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px} 321 | .carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto} 322 | .img-rounded{border-radius:6px} 323 | .img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto} 324 | .img-circle{border-radius:50%} 325 | hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee} 326 | .sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0} 327 | .sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} 328 | [role=button]{cursor:pointer} 329 | .h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit} 330 | .h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777} 331 | .h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px} 332 | .h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%} 333 | .h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px} 334 | .h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%} 335 | .h1,h1{font-size:36px} 336 | .h2,h2{font-size:30px} 337 | .h3,h3{font-size:24px} 338 | .h4,h4{font-size:18px} 339 | .h5,h5{font-size:14px} 340 | .h6,h6{font-size:12px} 341 | p{margin:0 0 10px} 342 | .lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4} 343 | address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143} 344 | dt,kbd kbd,label{font-weight:700} 345 | @media (min-width:768px){.lead{font-size:21px} 346 | } 347 | .small,small{font-size:85%} 348 | .mark,mark{background-color:#fcf8e3;padding:.2em} 349 | .list-inline,.list-unstyled{list-style:none;padding-left:0} 350 | .text-left{text-align:left} 351 | .text-right{text-align:right} 352 | .btn,.text-center{text-align:center} 353 | .text-justify{text-align:justify} 354 | .text-nowrap{white-space:nowrap} 355 | .text-lowercase{text-transform:lowercase} 356 | .text-uppercase{text-transform:uppercase} 357 | .text-capitalize{text-transform:capitalize} 358 | .text-muted{color:#777} 359 | .text-primary{color:#428bca} 360 | a.text-primary:focus,a.text-primary:hover{color:#3071a9} 361 | .text-success{color:#3c763d} 362 | a.text-success:focus,a.text-success:hover{color:#2b542c} 363 | .text-info{color:#31708f} 364 | a.text-info:focus,a.text-info:hover{color:#245269} 365 | .text-warning{color:#8a6d3b} 366 | a.text-warning:focus,a.text-warning:hover{color:#66512c} 367 | .text-danger{color:#a94442} 368 | a.text-danger:focus,a.text-danger:hover{color:#843534} 369 | .bg-primary{color:#fff;background-color:#428bca} 370 | a.bg-primary:focus,a.bg-primary:hover{background-color:#3071a9} 371 | .bg-success{background-color:#dff0d8} 372 | a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3} 373 | .bg-info{background-color:#d9edf7} 374 | a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee} 375 | .bg-warning{background-color:#fcf8e3} 376 | a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5} 377 | .bg-danger{background-color:#f2dede} 378 | a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9} 379 | pre code,table{background-color:transparent} 380 | .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee} 381 | dl,ol,ul{margin-top:0} 382 | ol,ul{margin-bottom:10px} 383 | ol ol,ol ul,ul ol,ul ul{margin-bottom:0} 384 | .list-inline{margin-left:-5px} 385 | .list-inline>li{display:inline-block;padding-left:5px;padding-right:5px} 386 | dl{margin-bottom:20px} 387 | dd{margin-left:0} 388 | @media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} 389 | .dl-horizontal dd{margin-left:180px} 390 | } 391 | abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777} 392 | .initialism{font-size:90%;text-transform:uppercase} 393 | blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee} 394 | blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0} 395 | blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777} 396 | blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'} 397 | .blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right} 398 | caption,th{text-align:left} 399 | code,kbd{padding:2px 4px;font-size:90%} 400 | .blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''} 401 | .blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'} 402 | address{margin-bottom:20px;font-style:normal} 403 | code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace} 404 | code{color:#c7254e;background-color:#f9f2f4;border-radius:4px} 405 | kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)} 406 | kbd kbd{padding:0;font-size:100%;box-shadow:none} 407 | pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px} 408 | .container,.container-fluid{margin-right:auto;margin-left:auto} 409 | pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0} 410 | .container,.container-fluid{padding-left:15px;padding-right:15px} 411 | .pre-scrollable{overflow-y:scroll} 412 | @media (min-width:768px){.container{width:750px} 413 | } 414 | @media (min-width:992px){.container{width:970px} 415 | } 416 | @media (min-width:1200px){.container{width:1170px} 417 | } 418 | .row{margin-left:-15px;margin-right:-15px} 419 | .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-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-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-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px} 420 | .col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left} 421 | .col-xs-12{width:100%} 422 | .col-xs-11{width:91.66666667%} 423 | .col-xs-10{width:83.33333333%} 424 | .col-xs-9{width:75%} 425 | .col-xs-8{width:66.66666667%} 426 | .col-xs-7{width:58.33333333%} 427 | .col-xs-6{width:50%} 428 | .col-xs-5{width:41.66666667%} 429 | .col-xs-4{width:33.33333333%} 430 | .col-xs-3{width:25%} 431 | .col-xs-2{width:16.66666667%} 432 | .col-xs-1{width:8.33333333%} 433 | .col-xs-pull-12{right:100%} 434 | .col-xs-pull-11{right:91.66666667%} 435 | .col-xs-pull-10{right:83.33333333%} 436 | .col-xs-pull-9{right:75%} 437 | .col-xs-pull-8{right:66.66666667%} 438 | .col-xs-pull-7{right:58.33333333%} 439 | .col-xs-pull-6{right:50%} 440 | .col-xs-pull-5{right:41.66666667%} 441 | .col-xs-pull-4{right:33.33333333%} 442 | .col-xs-pull-3{right:25%} 443 | .col-xs-pull-2{right:16.66666667%} 444 | .col-xs-pull-1{right:8.33333333%} 445 | .col-xs-pull-0{right:auto} 446 | .col-xs-push-12{left:100%} 447 | .col-xs-push-11{left:91.66666667%} 448 | .col-xs-push-10{left:83.33333333%} 449 | .col-xs-push-9{left:75%} 450 | .col-xs-push-8{left:66.66666667%} 451 | .col-xs-push-7{left:58.33333333%} 452 | .col-xs-push-6{left:50%} 453 | .col-xs-push-5{left:41.66666667%} 454 | .col-xs-push-4{left:33.33333333%} 455 | .col-xs-push-3{left:25%} 456 | .col-xs-push-2{left:16.66666667%} 457 | .col-xs-push-1{left:8.33333333%} 458 | .col-xs-push-0{left:auto} 459 | .col-xs-offset-12{margin-left:100%} 460 | .col-xs-offset-11{margin-left:91.66666667%} 461 | .col-xs-offset-10{margin-left:83.33333333%} 462 | .col-xs-offset-9{margin-left:75%} 463 | .col-xs-offset-8{margin-left:66.66666667%} 464 | .col-xs-offset-7{margin-left:58.33333333%} 465 | .col-xs-offset-6{margin-left:50%} 466 | .col-xs-offset-5{margin-left:41.66666667%} 467 | .col-xs-offset-4{margin-left:33.33333333%} 468 | .col-xs-offset-3{margin-left:25%} 469 | .col-xs-offset-2{margin-left:16.66666667%} 470 | .col-xs-offset-1{margin-left:8.33333333%} 471 | .col-xs-offset-0{margin-left:0} 472 | @media (min-width:768px){.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{float:left} 473 | .col-sm-12{width:100%} 474 | .col-sm-11{width:91.66666667%} 475 | .col-sm-10{width:83.33333333%} 476 | .col-sm-9{width:75%} 477 | .col-sm-8{width:66.66666667%} 478 | .col-sm-7{width:58.33333333%} 479 | .col-sm-6{width:50%} 480 | .col-sm-5{width:41.66666667%} 481 | .col-sm-4{width:33.33333333%} 482 | .col-sm-3{width:25%} 483 | .col-sm-2{width:16.66666667%} 484 | .col-sm-1{width:8.33333333%} 485 | .col-sm-pull-12{right:100%} 486 | .col-sm-pull-11{right:91.66666667%} 487 | .col-sm-pull-10{right:83.33333333%} 488 | .col-sm-pull-9{right:75%} 489 | .col-sm-pull-8{right:66.66666667%} 490 | .col-sm-pull-7{right:58.33333333%} 491 | .col-sm-pull-6{right:50%} 492 | .col-sm-pull-5{right:41.66666667%} 493 | .col-sm-pull-4{right:33.33333333%} 494 | .col-sm-pull-3{right:25%} 495 | .col-sm-pull-2{right:16.66666667%} 496 | .col-sm-pull-1{right:8.33333333%} 497 | .col-sm-pull-0{right:auto} 498 | .col-sm-push-12{left:100%} 499 | .col-sm-push-11{left:91.66666667%} 500 | .col-sm-push-10{left:83.33333333%} 501 | .col-sm-push-9{left:75%} 502 | .col-sm-push-8{left:66.66666667%} 503 | .col-sm-push-7{left:58.33333333%} 504 | .col-sm-push-6{left:50%} 505 | .col-sm-push-5{left:41.66666667%} 506 | .col-sm-push-4{left:33.33333333%} 507 | .col-sm-push-3{left:25%} 508 | .col-sm-push-2{left:16.66666667%} 509 | .col-sm-push-1{left:8.33333333%} 510 | .col-sm-push-0{left:auto} 511 | .col-sm-offset-12{margin-left:100%} 512 | .col-sm-offset-11{margin-left:91.66666667%} 513 | .col-sm-offset-10{margin-left:83.33333333%} 514 | .col-sm-offset-9{margin-left:75%} 515 | .col-sm-offset-8{margin-left:66.66666667%} 516 | .col-sm-offset-7{margin-left:58.33333333%} 517 | .col-sm-offset-6{margin-left:50%} 518 | .col-sm-offset-5{margin-left:41.66666667%} 519 | .col-sm-offset-4{margin-left:33.33333333%} 520 | .col-sm-offset-3{margin-left:25%} 521 | .col-sm-offset-2{margin-left:16.66666667%} 522 | .col-sm-offset-1{margin-left:8.33333333%} 523 | .col-sm-offset-0{margin-left:0} 524 | } 525 | @media (min-width:992px){.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{float:left} 526 | .col-md-12{width:100%} 527 | .col-md-11{width:91.66666667%} 528 | .col-md-10{width:83.33333333%} 529 | .col-md-9{width:75%} 530 | .col-md-8{width:66.66666667%} 531 | .col-md-7{width:58.33333333%} 532 | .col-md-6{width:50%} 533 | .col-md-5{width:41.66666667%} 534 | .col-md-4{width:33.33333333%} 535 | .col-md-3{width:25%} 536 | .col-md-2{width:16.66666667%} 537 | .col-md-1{width:8.33333333%} 538 | .col-md-pull-12{right:100%} 539 | .col-md-pull-11{right:91.66666667%} 540 | .col-md-pull-10{right:83.33333333%} 541 | .col-md-pull-9{right:75%} 542 | .col-md-pull-8{right:66.66666667%} 543 | .col-md-pull-7{right:58.33333333%} 544 | .col-md-pull-6{right:50%} 545 | .col-md-pull-5{right:41.66666667%} 546 | .col-md-pull-4{right:33.33333333%} 547 | .col-md-pull-3{right:25%} 548 | .col-md-pull-2{right:16.66666667%} 549 | .col-md-pull-1{right:8.33333333%} 550 | .col-md-pull-0{right:auto} 551 | .col-md-push-12{left:100%} 552 | .col-md-push-11{left:91.66666667%} 553 | .col-md-push-10{left:83.33333333%} 554 | .col-md-push-9{left:75%} 555 | .col-md-push-8{left:66.66666667%} 556 | .col-md-push-7{left:58.33333333%} 557 | .col-md-push-6{left:50%} 558 | .col-md-push-5{left:41.66666667%} 559 | .col-md-push-4{left:33.33333333%} 560 | .col-md-push-3{left:25%} 561 | .col-md-push-2{left:16.66666667%} 562 | .col-md-push-1{left:8.33333333%} 563 | .col-md-push-0{left:auto} 564 | .col-md-offset-12{margin-left:100%} 565 | .col-md-offset-11{margin-left:91.66666667%} 566 | .col-md-offset-10{margin-left:83.33333333%} 567 | .col-md-offset-9{margin-left:75%} 568 | .col-md-offset-8{margin-left:66.66666667%} 569 | .col-md-offset-7{margin-left:58.33333333%} 570 | .col-md-offset-6{margin-left:50%} 571 | .col-md-offset-5{margin-left:41.66666667%} 572 | .col-md-offset-4{margin-left:33.33333333%} 573 | .col-md-offset-3{margin-left:25%} 574 | .col-md-offset-2{margin-left:16.66666667%} 575 | .col-md-offset-1{margin-left:8.33333333%} 576 | .col-md-offset-0{margin-left:0} 577 | } 578 | @media (min-width:1200px){.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{float:left} 579 | .col-lg-12{width:100%} 580 | .col-lg-11{width:91.66666667%} 581 | .col-lg-10{width:83.33333333%} 582 | .col-lg-9{width:75%} 583 | .col-lg-8{width:66.66666667%} 584 | .col-lg-7{width:58.33333333%} 585 | .col-lg-6{width:50%} 586 | .col-lg-5{width:41.66666667%} 587 | .col-lg-4{width:33.33333333%} 588 | .col-lg-3{width:25%} 589 | .col-lg-2{width:16.66666667%} 590 | .col-lg-1{width:8.33333333%} 591 | .col-lg-pull-12{right:100%} 592 | .col-lg-pull-11{right:91.66666667%} 593 | .col-lg-pull-10{right:83.33333333%} 594 | .col-lg-pull-9{right:75%} 595 | .col-lg-pull-8{right:66.66666667%} 596 | .col-lg-pull-7{right:58.33333333%} 597 | .col-lg-pull-6{right:50%} 598 | .col-lg-pull-5{right:41.66666667%} 599 | .col-lg-pull-4{right:33.33333333%} 600 | .col-lg-pull-3{right:25%} 601 | .col-lg-pull-2{right:16.66666667%} 602 | .col-lg-pull-1{right:8.33333333%} 603 | .col-lg-pull-0{right:auto} 604 | .col-lg-push-12{left:100%} 605 | .col-lg-push-11{left:91.66666667%} 606 | .col-lg-push-10{left:83.33333333%} 607 | .col-lg-push-9{left:75%} 608 | .col-lg-push-8{left:66.66666667%} 609 | .col-lg-push-7{left:58.33333333%} 610 | .col-lg-push-6{left:50%} 611 | .col-lg-push-5{left:41.66666667%} 612 | .col-lg-push-4{left:33.33333333%} 613 | .col-lg-push-3{left:25%} 614 | .col-lg-push-2{left:16.66666667%} 615 | .col-lg-push-1{left:8.33333333%} 616 | .col-lg-push-0{left:auto} 617 | .col-lg-offset-12{margin-left:100%} 618 | .col-lg-offset-11{margin-left:91.66666667%} 619 | .col-lg-offset-10{margin-left:83.33333333%} 620 | .col-lg-offset-9{margin-left:75%} 621 | .col-lg-offset-8{margin-left:66.66666667%} 622 | .col-lg-offset-7{margin-left:58.33333333%} 623 | .col-lg-offset-6{margin-left:50%} 624 | .col-lg-offset-5{margin-left:41.66666667%} 625 | .col-lg-offset-4{margin-left:33.33333333%} 626 | .col-lg-offset-3{margin-left:25%} 627 | .col-lg-offset-2{margin-left:16.66666667%} 628 | .col-lg-offset-1{margin-left:8.33333333%} 629 | .col-lg-offset-0{margin-left:0} 630 | } 631 | caption{padding-top:8px;padding-bottom:8px;color:#777} 632 | .table{width:100%;max-width:100%;margin-bottom:20px} 633 | .table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd} 634 | .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd} 635 | .table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0} 636 | .table>tbody+tbody{border-top:2px solid #ddd} 637 | .table .table{background-color:#fff} 638 | .table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px} 639 | .table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd} 640 | .table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px} 641 | .table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9} 642 | .table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5} 643 | table col[class*=col-]{position:static;float:none;display:table-column} 644 | table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell} 645 | .btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left} 646 | .table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8} 647 | .table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8} 648 | .table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6} 649 | .table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7} 650 | .table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3} 651 | .table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3} 652 | .table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc} 653 | .table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede} 654 | .table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc} 655 | .table-responsive{overflow-x:auto;min-height:.01%} 656 | @media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd} 657 | .table-responsive>.table{margin-bottom:0} 658 | .table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap} 659 | .table-responsive>.table-bordered{border:0} 660 | .table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0} 661 | .table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0} 662 | .table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0} 663 | } 664 | fieldset,legend{padding:0;border:0} 665 | fieldset{margin:0;min-width:0} 666 | legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border-bottom:1px solid #e5e5e5} 667 | label{display:inline-block;max-width:100%;margin-bottom:5px} 668 | input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none} 669 | input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal} 670 | .form-control,output{display:block;font-size:14px;line-height:1.42857143;color:#555} 671 | input[type=file]{display:block} 672 | input[type=range]{display:block;width:100%} 673 | select[multiple],select[size]{height:auto} 674 | input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px} 675 | output{padding-top:7px} 676 | .form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s} 677 | .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)} 678 | .form-control::-moz-placeholder{color:#999;opacity:1} 679 | .form-control:-ms-input-placeholder{color:#999} 680 | .form-control::-webkit-input-placeholder{color:#999} 681 | .has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d} 682 | .form-control::-ms-expand{border:0;background-color:transparent} 683 | .form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1} 684 | .form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed} 685 | textarea.form-control{height:auto} 686 | @media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px} 687 | .input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px} 688 | .input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px} 689 | } 690 | .form-group{margin-bottom:15px} 691 | .checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px} 692 | .checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer} 693 | .checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9} 694 | .checkbox+.checkbox,.radio+.radio{margin-top:-5px} 695 | .checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer} 696 | .checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px} 697 | .checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed} 698 | .form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px} 699 | .form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0} 700 | .form-group-sm .form-control,.input-sm{font-size:12px;padding:5px 10px;border-radius:3px} 701 | .input-sm{height:30px;line-height:1.5} 702 | select.input-sm{height:30px;line-height:30px} 703 | select[multiple].input-sm,textarea.input-sm{height:auto} 704 | .form-group-sm .form-control{height:30px;line-height:1.5} 705 | .form-group-sm select.form-control{height:30px;line-height:30px} 706 | .form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto} 707 | .form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5} 708 | .form-group-lg .form-control,.input-lg{font-size:18px;padding:10px 16px;border-radius:6px} 709 | .input-lg{height:46px;line-height:1.3333333} 710 | select.input-lg{height:46px;line-height:46px} 711 | select[multiple].input-lg,textarea.input-lg{height:auto} 712 | .form-group-lg .form-control{height:46px;line-height:1.3333333} 713 | .form-group-lg select.form-control{height:46px;line-height:46px} 714 | .form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto} 715 | .form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333} 716 | .has-feedback{position:relative} 717 | .has-feedback .form-control{padding-right:42.5px} 718 | .form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none} 719 | .collapsing,.dropdown,.dropup{position:relative} 720 | .form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px} 721 | .form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px} 722 | .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} 723 | .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168} 724 | .has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8} 725 | .has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b} 726 | .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} 727 | .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b} 728 | .has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3} 729 | .has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442} 730 | .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} 731 | .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483} 732 | .has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede} 733 | .has-feedback label~.form-control-feedback{top:25px} 734 | .has-feedback label.sr-only~.form-control-feedback{top:0} 735 | .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373} 736 | @media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block} 737 | .form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle} 738 | .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle} 739 | .form-inline .input-group{display:inline-table;vertical-align:middle} 740 | .form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto} 741 | .form-inline .input-group>.form-control{width:100%} 742 | .form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle} 743 | .form-inline .checkbox label,.form-inline .radio label{padding-left:0} 744 | .form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0} 745 | .form-inline .has-feedback .form-control-feedback{top:0} 746 | } 747 | .form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px} 748 | .form-horizontal .checkbox,.form-horizontal .radio{min-height:27px} 749 | .form-horizontal .form-group{margin-left:-15px;margin-right:-15px} 750 | .form-horizontal .has-feedback .form-control-feedback{right:15px} 751 | @media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px} 752 | .form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px} 753 | .form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px} 754 | } 755 | .btn{display:inline-block;margin-bottom:0;font-weight:400;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} 756 | .btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px} 757 | .btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none} 758 | .btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} 759 | .btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none} 760 | a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none} 761 | .btn-default{color:#333;background-color:#fff;border-color:#ccc} 762 | .btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c} 763 | .btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad} 764 | .btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c} 765 | .btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc} 766 | .btn-default .badge{color:#fff;background-color:#333} 767 | .btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd} 768 | .btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#3071a9;border-color:#193c5a} 769 | .btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e} 770 | .btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#285e8e;border-color:#193c5a} 771 | .btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd} 772 | .btn-primary .badge{color:#428bca;background-color:#fff} 773 | .btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c} 774 | .btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625} 775 | .btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439} 776 | .btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625} 777 | .btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none} 778 | .btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c} 779 | .btn-success .badge{color:#5cb85c;background-color:#fff} 780 | .btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da} 781 | .btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85} 782 | .btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc} 783 | .btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85} 784 | .btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da} 785 | .btn-info .badge{color:#5bc0de;background-color:#fff} 786 | .btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236} 787 | .btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d} 788 | .btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512} 789 | .btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d} 790 | .btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236} 791 | .btn-warning .badge{color:#f0ad4e;background-color:#fff} 792 | .btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a} 793 | .btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19} 794 | .btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925} 795 | .btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19} 796 | .btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a} 797 | .btn-danger .badge{color:#d9534f;background-color:#fff} 798 | .btn-link{color:#428bca;font-weight:400;border-radius:0} 799 | .btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none} 800 | .btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent} 801 | .btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent} 802 | .btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none} 803 | .btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px} 804 | .btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} 805 | .btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px} 806 | .btn-block{display:block;width:100%} 807 | .btn-block+.btn-block{margin-top:5px} 808 | input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%} 809 | .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear} 810 | .fade.in{opacity:1} 811 | .collapse{display:none} 812 | .collapse.in{display:block} 813 | tr.collapse.in{display:table-row} 814 | tbody.collapse.in{display:table-row-group} 815 | .collapsing{height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease} 816 | .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent} 817 | .dropdown-toggle:focus{outline:0} 818 | .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box} 819 | .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0} 820 | .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0} 821 | .btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0} 822 | .dropdown-header,.dropdown-menu>li>a{white-space:nowrap;padding:3px 20px;line-height:1.42857143} 823 | .dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0} 824 | .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5} 825 | .dropdown-menu>li>a{display:block;clear:both;font-weight:400;color:#333} 826 | .dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5} 827 | .dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#428bca} 828 | .dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777} 829 | .dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed} 830 | .open>.dropdown-menu{display:block} 831 | .open>a{outline:0} 832 | .dropdown-menu-left{left:0;right:auto} 833 | .dropdown-header{display:block;font-size:12px;color:#777} 834 | .dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990} 835 | .nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{left:auto;top:auto} 836 | .pull-right>.dropdown-menu{right:0;left:auto} 837 | .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9;content:""} 838 | .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px} 839 | @media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0} 840 | .navbar-right .dropdown-menu-left{left:0;right:auto} 841 | } 842 | .btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle} 843 | .btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left} 844 | .btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2} 845 | .btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px} 846 | .btn-toolbar{margin-left:-5px} 847 | .btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px} 848 | .btn .caret,.btn-group>.btn:first-child{margin-left:0} 849 | .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0} 850 | .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px} 851 | .btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px} 852 | .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} 853 | .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none} 854 | .btn-lg .caret{border-width:5px 5px 0} 855 | .dropup .btn-lg .caret{border-width:0 5px 5px} 856 | .btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%} 857 | .media-object.img-thumbnail,.nav>li>a>img{max-width:none} 858 | .btn-group-vertical>.btn-group>.btn{float:none} 859 | .btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0} 860 | .btn-group-vertical>.btn:first-child:not(:last-child){border-radius:4px 4px 0 0} 861 | .btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px} 862 | .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0} 863 | .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0} 864 | .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0} 865 | .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate} 866 | .btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%} 867 | .btn-group-justified>.btn-group .btn{width:100%} 868 | .btn-group-justified>.btn-group .dropdown-menu{left:auto} 869 | [data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none} 870 | .input-group{position:relative;display:table;border-collapse:separate} 871 | .input-group[class*=col-]{float:none;padding-left:0;padding-right:0} 872 | .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0} 873 | .input-group .form-control:focus{z-index:3} 874 | .input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px} 875 | select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px} 876 | select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto} 877 | .input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} 878 | select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px} 879 | select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto} 880 | .input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell} 881 | .nav>li,.nav>li>a{position:relative;display:block} 882 | .input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0} 883 | .input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle} 884 | .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px} 885 | .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px} 886 | .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px} 887 | .input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0} 888 | .input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0} 889 | .input-group-addon:first-child{border-right:0} 890 | .input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0} 891 | .input-group-addon:last-child{border-left:0} 892 | .input-group-btn{position:relative;font-size:0;white-space:nowrap} 893 | .input-group-btn>.btn{position:relative} 894 | .input-group-btn>.btn+.btn{margin-left:-1px} 895 | .input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2} 896 | .input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px} 897 | .input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px} 898 | .nav{margin-bottom:0;padding-left:0;list-style:none} 899 | .nav>li>a{padding:10px 15px} 900 | .nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee} 901 | .nav>li.disabled>a{color:#777} 902 | .nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed} 903 | .nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca} 904 | .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5} 905 | .nav-tabs{border-bottom:1px solid #ddd} 906 | .nav-tabs>li{float:left;margin-bottom:-1px} 907 | .nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0} 908 | .nav-tabs>li>a:hover{border-color:#eee #eee #ddd} 909 | .nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default} 910 | .nav-tabs.nav-justified{width:100%;border-bottom:0} 911 | .nav-tabs.nav-justified>li{float:none} 912 | .nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px} 913 | .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd} 914 | @media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%} 915 | .nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0} 916 | .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff} 917 | } 918 | .nav-pills>li{float:left} 919 | .nav-justified>li,.nav-stacked>li{float:none} 920 | .nav-pills>li>a{border-radius:4px} 921 | .nav-pills>li+li{margin-left:2px} 922 | .nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca} 923 | .nav-stacked>li+li{margin-top:2px;margin-left:0} 924 | .nav-justified{width:100%} 925 | .nav-justified>li>a{text-align:center;margin-bottom:5px} 926 | .nav-tabs-justified{border-bottom:0} 927 | .nav-tabs-justified>li>a{margin-right:0;border-radius:4px} 928 | .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd} 929 | @media (min-width:768px){.nav-justified>li{display:table-cell;width:1%} 930 | .nav-justified>li>a{margin-bottom:0} 931 | .nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0} 932 | .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff} 933 | } 934 | .tab-content>.tab-pane{display:none} 935 | .tab-content>.active{display:block} 936 | .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0} 937 | .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent} 938 | .navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch} 939 | .navbar-collapse.in{overflow-y:auto} 940 | @media (min-width:768px){.navbar{border-radius:4px} 941 | .navbar-header{float:left} 942 | .navbar-collapse{width:auto;border-top:0;box-shadow:none} 943 | .navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important} 944 | .navbar-collapse.in{overflow-y:visible} 945 | .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0} 946 | } 947 | .carousel-inner,.embed-responsive,.modal,.modal-open,.progress{overflow:hidden} 948 | @media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px} 949 | } 950 | .container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px} 951 | .navbar-static-top{z-index:1000;border-width:0 0 1px} 952 | .navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030} 953 | .navbar-fixed-top{top:0;border-width:0 0 1px} 954 | .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0} 955 | .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px} 956 | .navbar-brand:focus,.navbar-brand:hover{text-decoration:none} 957 | .navbar-brand>img{display:block} 958 | @media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0} 959 | .navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0} 960 | .navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px} 961 | } 962 | .navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px} 963 | .navbar-toggle:focus{outline:0} 964 | .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px} 965 | .navbar-toggle .icon-bar+.icon-bar{margin-top:4px} 966 | .navbar-nav{margin:7.5px -15px} 967 | .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px} 968 | @media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none} 969 | .navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px} 970 | .navbar-nav .open .dropdown-menu>li>a{line-height:20px} 971 | .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none} 972 | } 973 | .progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-danger,.progress-striped .progress-bar-info,.progress-striped .progress-bar-success,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} 974 | @media (min-width:768px){.navbar-toggle{display:none} 975 | .navbar-nav{float:left;margin:0} 976 | .navbar-nav>li{float:left} 977 | .navbar-nav>li>a{padding-top:15px;padding-bottom:15px} 978 | } 979 | .navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px} 980 | @media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block} 981 | .navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle} 982 | .navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle} 983 | .navbar-form .input-group{display:inline-table;vertical-align:middle} 984 | .navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto} 985 | .navbar-form .input-group>.form-control{width:100%} 986 | .navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle} 987 | .navbar-form .checkbox label,.navbar-form .radio label{padding-left:0} 988 | .navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0} 989 | .navbar-form .has-feedback .form-control-feedback{top:0} 990 | } 991 | .btn .badge,.btn .label{position:relative;top:-1px} 992 | .breadcrumb>li,.pagination{display:inline-block} 993 | @media (max-width:767px){.navbar-form .form-group{margin-bottom:5px} 994 | .navbar-form .form-group:last-child{margin-bottom:0} 995 | } 996 | @media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none} 997 | } 998 | .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0} 999 | .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0} 1000 | .navbar-btn{margin-top:8px;margin-bottom:8px} 1001 | .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px} 1002 | .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px} 1003 | .navbar-text{margin-top:15px;margin-bottom:15px} 1004 | @media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px} 1005 | .navbar-left{float:left!important} 1006 | .navbar-right{float:right!important;margin-right:-15px} 1007 | .navbar-right~.navbar-right{margin-right:0} 1008 | } 1009 | .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7} 1010 | .navbar-default .navbar-brand{color:#777} 1011 | .navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent} 1012 | .navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777} 1013 | .navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent} 1014 | .navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7} 1015 | .navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent} 1016 | .navbar-default .navbar-toggle{border-color:#ddd} 1017 | .navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd} 1018 | .navbar-default .navbar-toggle .icon-bar{background-color:#888} 1019 | .navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7} 1020 | .navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555} 1021 | @media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777} 1022 | .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent} 1023 | .navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7} 1024 | .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent} 1025 | } 1026 | .navbar-default .navbar-link{color:#777} 1027 | .navbar-default .navbar-link:hover{color:#333} 1028 | .navbar-default .btn-link{color:#777} 1029 | .navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333} 1030 | .navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc} 1031 | .navbar-inverse{background-color:#222;border-color:#080808} 1032 | .navbar-inverse .navbar-brand{color:#9d9d9d} 1033 | .navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent} 1034 | .navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d} 1035 | .navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent} 1036 | .navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808} 1037 | .navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent} 1038 | .navbar-inverse .navbar-toggle{border-color:#333} 1039 | .navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333} 1040 | .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff} 1041 | .navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010} 1042 | .navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff} 1043 | @media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808} 1044 | .navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808} 1045 | .navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d} 1046 | .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent} 1047 | .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808} 1048 | .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent} 1049 | } 1050 | .navbar-inverse .navbar-link{color:#9d9d9d} 1051 | .navbar-inverse .navbar-link:hover{color:#fff} 1052 | .navbar-inverse .btn-link{color:#9d9d9d} 1053 | .navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff} 1054 | .navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444} 1055 | .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px} 1056 | .breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc} 1057 | .breadcrumb>.active{color:#777} 1058 | .pagination{padding-left:0;margin:20px 0;border-radius:4px} 1059 | .pager li,.pagination>li{display:inline} 1060 | .pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px} 1061 | .pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px} 1062 | .pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px} 1063 | .pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#2a6496;background-color:#eee;border-color:#ddd} 1064 | .pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default} 1065 | .pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed} 1066 | .pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333} 1067 | .pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px} 1068 | .pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px} 1069 | .pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5} 1070 | .badge,.label{text-align:center;font-weight:700;line-height:1;white-space:nowrap} 1071 | .pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px} 1072 | .pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px} 1073 | .pager{padding-left:0;margin:20px 0;list-style:none;text-align:center} 1074 | .pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px} 1075 | .pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee} 1076 | .pager .next>a,.pager .next>span{float:right} 1077 | .pager .previous>a,.pager .previous>span{float:left} 1078 | .pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed} 1079 | .label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em} 1080 | a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer} 1081 | .label:empty{display:none} 1082 | .label-default{background-color:#777} 1083 | .label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e} 1084 | .label-primary{background-color:#428bca} 1085 | .label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9} 1086 | .label-success{background-color:#5cb85c} 1087 | .label-success[href]:focus,.label-success[href]:hover{background-color:#449d44} 1088 | .label-info{background-color:#5bc0de} 1089 | .label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5} 1090 | .label-warning{background-color:#f0ad4e} 1091 | .label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f} 1092 | .label-danger{background-color:#d9534f} 1093 | .label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c} 1094 | .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px} 1095 | .badge:empty{display:none} 1096 | .media-object,.thumbnail{display:block} 1097 | .btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px} 1098 | a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer} 1099 | .list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff} 1100 | .jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit} 1101 | .list-group-item>.badge{float:right} 1102 | .list-group-item>.badge+.badge{margin-right:5px} 1103 | .nav-pills>li>a>.badge{margin-left:3px} 1104 | .jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee} 1105 | .jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200} 1106 | .alert .alert-link,.close{font-weight:700} 1107 | .alert,.thumbnail{margin-bottom:20px} 1108 | .jumbotron>hr{border-top-color:#d5d5d5} 1109 | .container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px} 1110 | .jumbotron .container{max-width:100%} 1111 | @media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px} 1112 | .container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px} 1113 | .jumbotron .h1,.jumbotron h1{font-size:63px} 1114 | } 1115 | .thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out} 1116 | .thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto} 1117 | a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca} 1118 | .thumbnail .caption{padding:9px;color:#333} 1119 | .alert{padding:15px;border:1px solid transparent;border-radius:4px} 1120 | .alert h4{margin-top:0;color:inherit} 1121 | .alert>p,.alert>ul{margin-bottom:0} 1122 | .alert>p+p{margin-top:5px} 1123 | .alert-dismissable,.alert-dismissible{padding-right:35px} 1124 | .alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit} 1125 | .modal,.modal-backdrop{right:0;bottom:0;left:0} 1126 | .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d} 1127 | .alert-success hr{border-top-color:#c9e2b3} 1128 | .alert-success .alert-link{color:#2b542c} 1129 | .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f} 1130 | .alert-info hr{border-top-color:#a6e1ec} 1131 | .alert-info .alert-link{color:#245269} 1132 | .alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b} 1133 | .alert-warning hr{border-top-color:#f7e1b5} 1134 | .alert-warning .alert-link{color:#66512c} 1135 | .alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442} 1136 | .alert-danger hr{border-top-color:#e4b9c0} 1137 | .alert-danger .alert-link{color:#843534} 1138 | @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0} 1139 | to{background-position:0 0} 1140 | } 1141 | @keyframes progress-bar-stripes{from{background-position:40px 0} 1142 | to{background-position:0 0} 1143 | } 1144 | .progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)} 1145 | .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease} 1146 | .progress-bar-striped,.progress-striped .progress-bar{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px} 1147 | .progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite} 1148 | .progress-bar-success{background-color:#5cb85c} 1149 | .progress-striped .progress-bar-success{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} 1150 | .progress-bar-info{background-color:#5bc0de} 1151 | .progress-striped .progress-bar-info{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} 1152 | .progress-bar-warning{background-color:#f0ad4e} 1153 | .progress-striped .progress-bar-warning{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} 1154 | .progress-bar-danger{background-color:#d9534f} 1155 | .progress-striped .progress-bar-danger{background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} 1156 | .media{margin-top:15px} 1157 | .media:first-child{margin-top:0} 1158 | .media,.media-body{zoom:1;overflow:hidden} 1159 | .media-body{width:10000px} 1160 | .media-right,.media>.pull-right{padding-left:10px} 1161 | .media-left,.media>.pull-left{padding-right:10px} 1162 | .media-body,.media-left,.media-right{display:table-cell;vertical-align:top} 1163 | .media-middle{vertical-align:middle} 1164 | .media-bottom{vertical-align:bottom} 1165 | .media-heading{margin-top:0;margin-bottom:5px} 1166 | .media-list{padding-left:0;list-style:none} 1167 | .list-group{margin-bottom:20px;padding-left:0} 1168 | .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd} 1169 | .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px} 1170 | .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} 1171 | a.list-group-item,button.list-group-item{color:#555} 1172 | a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333} 1173 | a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5} 1174 | button.list-group-item{width:100%;text-align:left} 1175 | .list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#eee;color:#777;cursor:not-allowed} 1176 | .list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit} 1177 | .list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777} 1178 | .list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca} 1179 | .list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit} 1180 | .list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#e1edf7} 1181 | .list-group-item-success{color:#3c763d;background-color:#dff0d8} 1182 | a.list-group-item-success,button.list-group-item-success{color:#3c763d} 1183 | a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit} 1184 | a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6} 1185 | a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d} 1186 | .list-group-item-info{color:#31708f;background-color:#d9edf7} 1187 | a.list-group-item-info,button.list-group-item-info{color:#31708f} 1188 | a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit} 1189 | a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3} 1190 | a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f} 1191 | .list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3} 1192 | a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b} 1193 | a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit} 1194 | a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc} 1195 | a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b} 1196 | .list-group-item-danger{color:#a94442;background-color:#f2dede} 1197 | a.list-group-item-danger,button.list-group-item-danger{color:#a94442} 1198 | a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit} 1199 | a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc} 1200 | a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442} 1201 | .panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit} 1202 | .list-group-item-heading{margin-top:0;margin-bottom:5px} 1203 | .list-group-item-text{margin-bottom:0;line-height:1.3} 1204 | .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)} 1205 | .panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0} 1206 | .panel-body{padding:15px} 1207 | .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px} 1208 | .panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0} 1209 | .panel-title{margin-top:0;font-size:16px} 1210 | .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px} 1211 | .panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0} 1212 | .panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px} 1213 | .panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px} 1214 | .panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px} 1215 | .panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0} 1216 | .panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-right-radius:3px;border-top-left-radius:3px} 1217 | .list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0} 1218 | .panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px} 1219 | .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px} 1220 | .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px} 1221 | .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px} 1222 | .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px} 1223 | .panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd} 1224 | .panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0} 1225 | .panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0} 1226 | .panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0} 1227 | .panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0} 1228 | .panel>.table-responsive{border:0;margin-bottom:0} 1229 | .panel-group{margin-bottom:20px} 1230 | .panel-group .panel{margin-bottom:0;border-radius:4px} 1231 | .panel-group .panel+.panel{margin-top:5px} 1232 | .panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd} 1233 | .panel-group .panel-footer{border-top:0} 1234 | .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd} 1235 | .panel-default{border-color:#ddd} 1236 | .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd} 1237 | .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd} 1238 | .panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333} 1239 | .panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd} 1240 | .panel-primary{border-color:#428bca} 1241 | .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca} 1242 | .panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca} 1243 | .panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff} 1244 | .panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca} 1245 | .panel-success{border-color:#d6e9c6} 1246 | .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6} 1247 | .panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6} 1248 | .panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d} 1249 | .panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6} 1250 | .panel-info{border-color:#bce8f1} 1251 | .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1} 1252 | .panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1} 1253 | .panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f} 1254 | .panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1} 1255 | .panel-warning{border-color:#faebcc} 1256 | .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc} 1257 | .panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc} 1258 | .panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b} 1259 | .panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc} 1260 | .panel-danger{border-color:#ebccd1} 1261 | .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1} 1262 | .panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1} 1263 | .panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442} 1264 | .panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1} 1265 | .embed-responsive{position:relative;display:block;height:0;padding:0} 1266 | .embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0} 1267 | .embed-responsive-16by9{padding-bottom:56.25%} 1268 | .embed-responsive-4by3{padding-bottom:75%} 1269 | .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)} 1270 | .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)} 1271 | .well-lg{padding:24px;border-radius:6px} 1272 | .well-sm{padding:9px;border-radius:3px} 1273 | .close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)} 1274 | .popover,.tooltip{text-decoration:none;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal} 1275 | .close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)} 1276 | button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none} 1277 | .modal-content,.popover{background-clip:padding-box} 1278 | .modal{display:none;position:fixed;top:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0} 1279 | .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out} 1280 | .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)} 1281 | .modal-open .modal{overflow-x:hidden;overflow-y:auto} 1282 | .modal-dialog{position:relative;width:auto;margin:10px} 1283 | .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0} 1284 | .modal-backdrop{position:fixed;top:0;z-index:1040;background-color:#000} 1285 | .modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)} 1286 | .modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)} 1287 | .modal-header{padding:15px;border-bottom:1px solid #e5e5e5} 1288 | .tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{top:0;border-width:0 5px 5px;border-bottom-color:#000} 1289 | .modal-header .close{margin-top:-2px} 1290 | .modal-title{margin:0;line-height:1.42857143} 1291 | .modal-body{position:relative;padding:15px} 1292 | .modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5} 1293 | .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0} 1294 | .modal-footer .btn-group .btn+.btn{margin-left:-1px} 1295 | .modal-footer .btn-block+.btn-block{margin-left:0} 1296 | .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll} 1297 | @media (min-width:768px){.modal-dialog{width:600px;margin:30px auto} 1298 | .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)} 1299 | .modal-sm{width:300px} 1300 | } 1301 | .tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000} 1302 | @media (min-width:992px){.modal-lg{width:900px} 1303 | } 1304 | .tooltip{position:absolute;z-index:1070;display:block;text-align:left;text-align:start;font-size:12px;opacity:0;filter:alpha(opacity=0)} 1305 | .tooltip.in{opacity:.9;filter:alpha(opacity=90)} 1306 | .tooltip.top{margin-top:-3px;padding:5px 0} 1307 | .tooltip.right{margin-left:3px;padding:0 5px} 1308 | .tooltip.bottom{margin-top:3px;padding:5px 0} 1309 | .tooltip.left{margin-left:-3px;padding:0 5px} 1310 | .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px} 1311 | .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid} 1312 | .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000} 1313 | .tooltip.top-left .tooltip-arrow{right:5px} 1314 | .tooltip.top-right .tooltip-arrow{left:5px} 1315 | .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000} 1316 | .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000} 1317 | .tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px} 1318 | .tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px} 1319 | .tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px} 1320 | .popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;text-align:start;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)} 1321 | .carousel-caption,.carousel-control{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6)} 1322 | .popover.top{margin-top:-10px} 1323 | .popover.right{margin-left:10px} 1324 | .popover.bottom{margin-top:10px} 1325 | .popover.left{margin-left:-10px} 1326 | .popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0} 1327 | .popover-content{padding:9px 14px} 1328 | .popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid} 1329 | .carousel,.carousel-inner{position:relative} 1330 | .popover>.arrow{border-width:11px} 1331 | .popover>.arrow:after{border-width:10px;content:""} 1332 | .popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px} 1333 | .popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff} 1334 | .popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px} 1335 | .popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)} 1336 | .popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff} 1337 | .popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px} 1338 | .popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff} 1339 | .popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)} 1340 | .popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff} 1341 | .carousel-inner{width:100%} 1342 | .carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left} 1343 | .carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1} 1344 | @media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px} 1345 | .carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0} 1346 | .carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0} 1347 | .carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0} 1348 | } 1349 | .carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block} 1350 | .carousel-inner>.active{left:0} 1351 | .carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%} 1352 | .carousel-inner>.next{left:100%} 1353 | .carousel-inner>.prev{left:-100%} 1354 | .carousel-inner>.next.left,.carousel-inner>.prev.right{left:0} 1355 | .carousel-inner>.active.left{left:-100%} 1356 | .carousel-inner>.active.right{left:100%} 1357 | .carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;text-align:center;background-color:transparent} 1358 | .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)} 1359 | .carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)} 1360 | .carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)} 1361 | .carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block} 1362 | .carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px} 1363 | .carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px} 1364 | .carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif} 1365 | .carousel-control .icon-prev:before{content:'\2039'} 1366 | .carousel-control .icon-next:before{content:'\203a'} 1367 | .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center} 1368 | .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:transparent} 1369 | .carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff} 1370 | .carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;text-align:center} 1371 | .carousel-caption .btn,.text-hide{text-shadow:none} 1372 | @media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px} 1373 | .carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px} 1374 | .carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px} 1375 | .carousel-caption{left:20%;right:20%;padding-bottom:30px} 1376 | .carousel-indicators{bottom:20px} 1377 | } 1378 | .btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table} 1379 | .btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both} 1380 | .center-block{display:block;margin-left:auto;margin-right:auto} 1381 | .pull-right{float:right!important} 1382 | .pull-left{float:left!important} 1383 | .hide{display:none!important} 1384 | .show{display:block!important} 1385 | .hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important} 1386 | .invisible{visibility:hidden} 1387 | .text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0} 1388 | .affix{position:fixed} 1389 | @-ms-viewport{width:device-width} 1390 | @media (max-width:767px){.visible-xs{display:block!important} 1391 | table.visible-xs{display:table!important} 1392 | tr.visible-xs{display:table-row!important} 1393 | td.visible-xs,th.visible-xs{display:table-cell!important} 1394 | .visible-xs-block{display:block!important} 1395 | .visible-xs-inline{display:inline!important} 1396 | .visible-xs-inline-block{display:inline-block!important} 1397 | } 1398 | @media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important} 1399 | table.visible-sm{display:table!important} 1400 | tr.visible-sm{display:table-row!important} 1401 | td.visible-sm,th.visible-sm{display:table-cell!important} 1402 | .visible-sm-block{display:block!important} 1403 | .visible-sm-inline{display:inline!important} 1404 | .visible-sm-inline-block{display:inline-block!important} 1405 | } 1406 | @media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important} 1407 | table.visible-md{display:table!important} 1408 | tr.visible-md{display:table-row!important} 1409 | td.visible-md,th.visible-md{display:table-cell!important} 1410 | .visible-md-block{display:block!important} 1411 | .visible-md-inline{display:inline!important} 1412 | .visible-md-inline-block{display:inline-block!important} 1413 | } 1414 | @media (min-width:1200px){.visible-lg{display:block!important} 1415 | table.visible-lg{display:table!important} 1416 | tr.visible-lg{display:table-row!important} 1417 | td.visible-lg,th.visible-lg{display:table-cell!important} 1418 | .visible-lg-block{display:block!important} 1419 | .visible-lg-inline{display:inline!important} 1420 | .visible-lg-inline-block{display:inline-block!important} 1421 | } 1422 | @media (max-width:767px){.hidden-xs{display:none!important} 1423 | } 1424 | @media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important} 1425 | } 1426 | @media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important} 1427 | } 1428 | @media (min-width:1200px){.hidden-lg{display:none!important} 1429 | } 1430 | .visible-print{display:none!important} 1431 | @media print{.visible-print{display:block!important} 1432 | table.visible-print{display:table!important} 1433 | tr.visible-print{display:table-row!important} 1434 | td.visible-print,th.visible-print{display:table-cell!important} 1435 | } 1436 | .visible-print-block{display:none!important} 1437 | @media print{.visible-print-block{display:block!important} 1438 | } 1439 | .visible-print-inline{display:none!important} 1440 | @media print{.visible-print-inline{display:inline!important} 1441 | } 1442 | .visible-print-inline-block{display:none!important} 1443 | @media print{.visible-print-inline-block{display:inline-block!important} 1444 | .hidden-print{display:none!important} 1445 | } --------------------------------------------------------------------------------