├── www ├── error.html ├── aws.ico ├── favicon.ico ├── datatables │ └── images │ │ ├── sort_asc.png │ │ ├── sort_both.png │ │ ├── sort_desc.png │ │ ├── sort_asc_disabled.png │ │ └── sort_desc_disabled.png ├── bootstrap │ ├── img │ │ ├── glyphicons-halflings.png │ │ └── glyphicons-halflings-white.png │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ └── css │ │ ├── bootstrap-responsive.min.css │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.css │ │ └── bootstrap-responsive.css ├── App_Data │ └── PublishProfiles │ │ └── vmcompare - Web Deploy.pubxml ├── store │ └── store.js ├── website.publishproj └── default.css ├── .vs ├── ProjectSettings.json ├── slnx.sqlite ├── azureVMs.info │ └── v15 │ │ └── .suo ├── ec2instances.info │ └── v15 │ │ └── .suo └── VSWorkspaceState.json ├── .gitignore ├── .travis.yml ├── requirements.txt ├── LICENSE ├── README.md ├── fabfile.py ├── render.py ├── in ├── base.mako ├── index.html.mako └── withaws.html.mako ├── mixwithaws.py ├── updateprices.py ├── data └── azurevirtualmachinesSpec.csv └── scrape.py /www/error.html: -------------------------------------------------------------------------------- 1 | Error, error! 2 | -------------------------------------------------------------------------------- /.vs/ProjectSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "CurrentProjectSetting": null 3 | } -------------------------------------------------------------------------------- /www/aws.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/aws.ico -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.DS_store 3 | .idea 4 | env 5 | venv 6 | .fab_tasks~ 7 | .env 8 | -------------------------------------------------------------------------------- /.vs/slnx.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/.vs/slnx.sqlite -------------------------------------------------------------------------------- /www/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/favicon.ico -------------------------------------------------------------------------------- /.vs/azureVMs.info/v15/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/.vs/azureVMs.info/v15/.suo -------------------------------------------------------------------------------- /.vs/ec2instances.info/v15/.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/.vs/ec2instances.info/v15/.suo -------------------------------------------------------------------------------- /www/datatables/images/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/datatables/images/sort_asc.png -------------------------------------------------------------------------------- /www/datatables/images/sort_both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/datatables/images/sort_both.png -------------------------------------------------------------------------------- /www/datatables/images/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/datatables/images/sort_desc.png -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 2.7 3 | install: 4 | - pip install -r requirements.txt 5 | script: 6 | fab deploy 7 | -------------------------------------------------------------------------------- /www/bootstrap/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/bootstrap/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /www/datatables/images/sort_asc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/datatables/images/sort_asc_disabled.png -------------------------------------------------------------------------------- /www/datatables/images/sort_desc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/datatables/images/sort_desc_disabled.png -------------------------------------------------------------------------------- /www/bootstrap/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/bootstrap/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /www/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /www/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /www/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tikyau/azurecompare/master/www/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | fabric 2 | boto 3 | mako 4 | lxml 5 | paramiko 6 | pycrypto 7 | requests==2.9.1 8 | azure-mgmt-commerce 9 | azure-common 10 | azure-mgmt-resource -------------------------------------------------------------------------------- /.vs/VSWorkspaceState.json: -------------------------------------------------------------------------------- 1 | { 2 | "ExpandedNodes": [ 3 | "", 4 | "\\in", 5 | "\\www", 6 | "\\www\\datatables", 7 | "\\www\\store" 8 | ], 9 | "SelectedNode": "\\www\\default.js", 10 | "PreviewInSolutionExplorer": false 11 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Waqas Ali (waqasaliabbasi.com) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Azure VM Compare 2 | 3 | As my first project in my summer internship at Microsoft Hong Kong, I was asked to look into solving the problem of analyzing the offerings of Azure Virtual Machines and comparing it with AWS EC2 instances. I henceforth found a solution in the form of EC2instances.info, forked the github, ported it for Azure and implemented several new features. 4 | 5 | There is a lot of room for refinement, enhancement, improvement and testing, and if you think you can contribute to this project please do. Also, all kind of feedback is also welcome. 6 | 7 | 8 | ### Running locally 9 | 10 | Make sure you have LibXML and Python development files. On Ubuntu, run `sudo apt-get install python-dev libxml2-dev libxslt1-dev libssl-dev`. 11 | 12 | 1. Clone the git repo 13 | 2. `cd azurecompare/` 14 | 3. `virtualenv env` (make sure you have virtualenv package installed) 15 | 4. `source env/bin/activate` 16 | 5. `pip install -r requirements.txt` 17 | 6. `fab build` 18 | 7. `fab serve` 19 | 8. Browse to http://localhost:8080 20 | 9. `deactivate` (to exit virtualenv) 21 | 22 | 23 | ### Requirements 24 | 25 | - Python 2.7+ with virtualenv 26 | - [Fabric](http://docs.fabfile.org/en/1.8/) 1.1+ 27 | - [Mako](http://www.makotemplates.org/) 28 | - [lxml](http://lxml.de/) 29 | 30 | -------------------------------------------------------------------------------- /www/App_Data/PublishProfiles/vmcompare - Web Deploy.pubxml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | MSDeploy 9 | AzureWebSite 10 | Debug 11 | Any CPU 12 | http://vmcompare.azurewebsites.net 13 | True 14 | False 15 | vmcompare.scm.azurewebsites.net:443 16 | vmcompare 17 | 18 | True 19 | WMSVC 20 | True 21 | $vmcompare 22 | <_SavePWD>True 23 | <_DestinationType>AzureWebSite 24 | 25 | -------------------------------------------------------------------------------- /fabfile.py: -------------------------------------------------------------------------------- 1 | import SimpleHTTPServer 2 | import SocketServer 3 | import os 4 | import traceback 5 | 6 | from fabric.api import abort, task 7 | from fabric.contrib.console import confirm 8 | 9 | from render import render 10 | from updateprices import updateprices 11 | from scrape import scrape 12 | from mixwithaws import mixaws 13 | 14 | abspath = lambda filename: os.path.join(os.path.abspath(os.path.dirname(__file__)), 15 | filename) 16 | 17 | @task 18 | def build(): 19 | updateprices('data/azurevirtualmachinesSpec.csv','data/azurevirtualmachines.json') 20 | scrape_ec2() 21 | mixaws('data/azurevirtualmachines.json','data/awsinstances.json', 'data/azureawsmixed.json') 22 | render_html() 23 | 24 | @task 25 | def scrape_ec2(): 26 | ec2_file = 'AWSinstances.json' 27 | try: 28 | scrape(ec2_file) 29 | except Exception as e: 30 | print "ERROR: Unable to scrape data: %s" % e 31 | print traceback.print_exc() 32 | 33 | @task 34 | def serve(ipaddr='127.0.0.1', port=8080): 35 | """Serve site contents locally for development""" 36 | port = int(port) 37 | os.chdir("www/") 38 | httpd = SocketServer.TCPServer((ipaddr, port), SimpleHTTPServer.SimpleHTTPRequestHandler) 39 | print "Serving on http://{}:{}".format(httpd.socket.getsockname()[0], httpd.socket.getsockname()[1]) 40 | httpd.serve_forever() 41 | 42 | 43 | @task 44 | def render_html(): 45 | """Render HTML but do not update data from Amazon""" 46 | render('data/azurevirtualmachines.json', 'in/index.html.mako', 'www/index.html') 47 | render('data/azureawsmixed.json', 'in/withaws.html.mako', 'www/withaws/index.html') 48 | 49 | @task(default=True) 50 | def update(): 51 | """Build and deploy the site""" 52 | build() 53 | serve() 54 | #deploy() 55 | -------------------------------------------------------------------------------- /render.py: -------------------------------------------------------------------------------- 1 | import mako.template 2 | import mako.lookup 3 | import mako.exceptions 4 | import json 5 | import datetime 6 | 7 | def json_load_byteified(file_handle): 8 | return _byteify( 9 | json.load(file_handle, object_hook=_byteify), 10 | ignore_dicts=True 11 | ) 12 | 13 | def json_loads_byteified(json_text): 14 | return _byteify( 15 | json.loads(json_text, object_hook=_byteify), 16 | ignore_dicts=True 17 | ) 18 | 19 | def _byteify(data, ignore_dicts = False): 20 | # if this is a unicode string, return its string representation 21 | if isinstance(data, unicode): 22 | return data.encode('utf-8') 23 | # if this is a list of values, return list of byteified values 24 | if isinstance(data, list): 25 | return [ _byteify(item, ignore_dicts=True) for item in data ] 26 | # if this is a dictionary, return dictionary of byteified keys and values 27 | # but only if we haven't already byteified it 28 | if isinstance(data, dict) and not ignore_dicts: 29 | return { 30 | _byteify(key, ignore_dicts=True): _byteify(value, ignore_dicts=True) 31 | for key, value in data.iteritems() 32 | } 33 | # if it's anything else, return it in its original form 34 | return data 35 | 36 | def render(data_file, template_file, destination_file): 37 | """Build the HTML content from scraped data""" 38 | lookup = mako.lookup.TemplateLookup(directories=['.']) 39 | template = mako.template.Template(filename=template_file, lookup=lookup) 40 | print "Loading data from %s..." % data_file 41 | with open(data_file) as f: 42 | instances = json_load_byteified(f) 43 | #for i in instances: 44 | # add_render_info(i) 45 | print "Rendering to %s..." % destination_file 46 | generated_at = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC') 47 | with open(destination_file, 'w') as fh: 48 | try: 49 | fh.write(template.render(instances=instances, generated_at=generated_at)) 50 | except: 51 | print mako.exceptions.text_error_template().render() 52 | 53 | if __name__ == '__main__': 54 | render('data/azurevirtualmachines.json', 'in/index.html.mako', 'www/index.html') 55 | -------------------------------------------------------------------------------- /www/store/store.js: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2010-2013 Marcus Westin */ 2 | "use strict";(function(e,t){typeof define=="function"&&define.amd?define([],t):typeof exports=="object"?module.exports=t():e.store=t()})(this,function(){function o(){try{return r in t&&t[r]}catch(e){return!1}}var e={},t=typeof window!="undefined"?window:global,n=t.document,r="localStorage",i="script",s;e.disabled=!1,e.version="1.3.20",e.set=function(e,t){},e.get=function(e,t){},e.has=function(t){return e.get(t)!==undefined},e.remove=function(e){},e.clear=function(){},e.transact=function(t,n,r){r==null&&(r=n,n=null),n==null&&(n={});var i=e.get(t,n);r(i),e.set(t,i)},e.getAll=function(){},e.forEach=function(){},e.serialize=function(e){return JSON.stringify(e)},e.deserialize=function(e){if(typeof e!="string")return undefined;try{return JSON.parse(e)}catch(t){return e||undefined}};if(o())s=t[r],e.set=function(t,n){return n===undefined?e.remove(t):(s.setItem(t,e.serialize(n)),n)},e.get=function(t,n){var r=e.deserialize(s.getItem(t));return r===undefined?n:r},e.remove=function(e){s.removeItem(e)},e.clear=function(){s.clear()},e.getAll=function(){var t={};return e.forEach(function(e,n){t[e]=n}),t},e.forEach=function(t){for(var n=0;ndocument.w=window'),a.close(),u=a.w.frames[0].document,s=u.createElement("div")}catch(f){s=n.createElement("div"),u=n.body}var l=function(t){return function(){var n=Array.prototype.slice.call(arguments,0);n.unshift(s),u.appendChild(s),s.addBehavior("#default#userData"),s.load(r);var i=t.apply(e,n);return u.removeChild(s),i}},c=new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]","g"),h=function(e){return e.replace(/^d/,"___$&").replace(c,"___")};e.set=l(function(t,n,i){return n=h(n),i===undefined?e.remove(n):(t.setAttribute(n,e.serialize(i)),t.save(r),i)}),e.get=l(function(t,n,r){n=h(n);var i=e.deserialize(t.getAttribute(n));return i===undefined?r:i}),e.remove=l(function(e,t){t=h(t),e.removeAttribute(t),e.save(r)}),e.clear=l(function(e){var t=e.XMLDocument.documentElement.attributes;e.load(r);for(var n=t.length-1;n>=0;n--)e.removeAttribute(t[n].name);e.save(r)}),e.getAll=function(t){var n={};return e.forEach(function(e,t){n[e]=t}),n},e.forEach=l(function(t,n){var r=t.XMLDocument.documentElement.attributes;for(var i=0,s;s=r[i];++i)n(s.name,e.deserialize(t.getAttribute(s.name)))})}try{var p="__storejs__";e.set(p,p),e.get(p)!=p&&(e.disabled=!0),e.remove(p)}catch(f){e.disabled=!0}return e.enabled=!e.disabled,e}); 3 | -------------------------------------------------------------------------------- /www/website.publishproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 14 | 15 | 16 | 17 | Debug 18 | AnyCPU 19 | 10.0.30319 20 | 2.0 21 | {9aaf8eca-da72-4dfd-87c1-448fcda15ade} 22 | $(MSBuildThisFileDirectory) 23 | /www 24 | v4.0 25 | 26 | 27 | 28 | 29 | 10.0 30 | 31 | 10.5 32 | $(VisualStudioVersion) 33 | 34 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(WebPublishTargetsVersion) 35 | <_WebPublishTargetsPath Condition=" '$(_WebPublishTargetsPath)'=='' ">$(VSToolsPath) 36 | 1.0.0.0 37 | 1.0.0.0 38 | 39 | 40 | 41 | $(AssemblyFileVersion) 42 | 43 | 44 | $(AssemblyVersion) 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /in/base.mako: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Azure - VM Compare 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 31 | 32 |
33 | 34 | ${self.body()} 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /mixwithaws.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import json 3 | 4 | from collections import defaultdict 5 | 6 | def mixaws(datafile, awsdatafile, mixeddatafile): 7 | with open(datafile) as data_file: 8 | instances = json.load(data_file) 9 | 10 | with open(awsdatafile) as data_file: 11 | awsdata = json.load(data_file) 12 | 13 | awsregion = { 14 | 'AP East' : 'N/A', 15 | 'AP Southeast' : 'ap-southeast-1', 16 | 'AU East' : 'ap-southeast-2', 17 | 'AU Southeast' : 'N/A', 18 | 'BR South' : 'sa-east-1', 19 | 'CA Central' : 'ca-central-1', 20 | 'CA East' : 'N/A', 21 | 'EU North' : 'eu-central-1', 22 | 'EU West' : 'eu-west-1', 23 | 'IN Central' : 'ap-south-1', 24 | 'IN South' : 'N/A', 25 | 'IN West' : 'N/A', 26 | 'JA East' : 'N/A', 27 | 'JA West' : 'ap-northeast-1', 28 | 'KR Central' : 'ap-northeast-2', 29 | 'KR South' : 'N/A', 30 | 'UK South' : 'eu-west-2', 31 | 'UK West' : 'N/A', 32 | 'US Central' : 'N/A', 33 | 'US East' : 'us-east-1', 34 | 'US East 2' : 'us-east-2', 35 | 'US Gov AZ' : 'N/A', 36 | 'US Gov TX' : 'N/A', 37 | 'US North Central' : 'N/A', 38 | 'US South Central' : 'N/A', 39 | 'US West' : 'us-west-1', 40 | 'US West 2' : 'us-west-2', 41 | 'US West Central' : 'N/A', 42 | 'USGov' : 'N/A', 43 | } 44 | 45 | for inst in awsdata: 46 | nested_dict = lambda: defaultdict(nested_dict) 47 | instance = nested_dict() 48 | instance['name'] = "(AWS) " + inst['pretty_name'] 49 | instance['cores'] = inst['vCPU'] 50 | instance['memory'] = '%.2f' % round(inst['memory'], 2) 51 | if inst['storage'] != None: 52 | instance['storage'] = inst['storage']['size'] 53 | else: 54 | instance['storage'] = "EBS Only" 55 | if inst['GPU'] == 0: 56 | instance['GPU'] = 'N/A' 57 | else: 58 | instance['GPU'] = inst['GPU'] 59 | for region in awsregion.keys(): 60 | instance['pricing'][region.encode('utf-8')]['linux'] = 'N/A' 61 | instance['pricing'][region.encode('utf-8')]['windows'] = 'N/A' 62 | instance['pricing'][region.encode('utf-8')]['sql-web'] = 'N/A' 63 | instance['pricing'][region.encode('utf-8')]['sql-standard'] = 'N/A' 64 | if awsregion[region.encode('utf-8')] != 'N/A': 65 | if awsregion[region.encode('utf-8')] in inst['pricing'].keys(): 66 | if 'linux' in inst['pricing'][awsregion[region.encode('utf-8')]].keys(): 67 | instance['pricing'][region.encode('utf-8')]['linux'] = inst['pricing'][awsregion[region.encode('utf-8')]]['linux']['ondemand'] 68 | if 'mswin' in inst['pricing'][awsregion[region.encode('utf-8')]].keys(): 69 | instance['pricing'][region.encode('utf-8')]['windows'] = inst['pricing'][awsregion[region.encode('utf-8')]]['mswin']['ondemand'] 70 | if 'mswinSQLWeb' in inst['pricing'][awsregion[region.encode('utf-8')]].keys(): 71 | instance['pricing'][region.encode('utf-8')]['sql-web'] = inst['pricing'][awsregion[region.encode('utf-8')]]['mswinSQLWeb']['ondemand'] 72 | if 'mswinSQL' in inst['pricing'][awsregion[region.encode('utf-8')]].keys(): 73 | instance['pricing'][region.encode('utf-8')]['sql-standard'] = inst['pricing'][awsregion[region.encode('utf-8')]]['mswinSQL']['ondemand'] 74 | instances.append(instance) 75 | 76 | print ("Saving instances...") 77 | with open(mixeddatafile, 'w') as f: 78 | json.dump(instances, 79 | f, 80 | indent=2, 81 | sort_keys=True, 82 | separators=(',', ': ')) 83 | 84 | if __name__ == '__main__': 85 | mixaws('data/azurevirtualmachines.json','data/awsinstances.json', 'data/azureawsmixed.json') -------------------------------------------------------------------------------- /www/default.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 5px 20px; 3 | } 4 | 5 | .ec2instances .page-header { 6 | margin-top: 0; 7 | border-bottom: 0; 8 | } 9 | 10 | .dataTables_filter { 11 | float: right; 12 | } 13 | 14 | #menu { 15 | margin-bottom: 10px; 16 | } 17 | 18 | #filters { 19 | margin-bottom: 10px; 20 | /* float so that the search input from the data table below can share the same 'row' as the filters */ 21 | float: left !important; 22 | min-width: 600px; 23 | } 24 | 25 | #filters input { 26 | width: 5rem; 27 | } 28 | 29 | #data { 30 | margin-top: 10px; 31 | clear: both; 32 | } 33 | 34 | #data a { 35 | color: #333; 36 | text-decoration: underline; 37 | } 38 | 39 | #data tr { 40 | background-color: white; 41 | cursor: pointer; 42 | } 43 | 44 | #data tr.highlight, #data tr.highlight:hover { 45 | background-color: #D3FFFF; 46 | } 47 | 48 | #data th, #data td { 49 | white-space: nowrap; 50 | } 51 | 52 | #data th { 53 | background-color: #eee; 54 | } 55 | 56 | #data td { 57 | font-size: 13px; 58 | vertical-align: middle; 59 | } 60 | 61 | #total { 62 | cursor: default !important; 63 | background-color: #eee; 64 | } 65 | 66 | #totalazure { 67 | background-color: #D3FFFF !important; 68 | } 69 | 70 | tr.aws.highlight { 71 | background-color: #FFE4C4 !important; 72 | } 73 | 74 | #totalaws { 75 | background-color: #FFE4C4 !important; 76 | } 77 | 78 | #data td.name { 79 | text-align: left; 80 | } 81 | #data td.quantity { 82 | text-align: center; 83 | } 84 | 85 | #data input { 86 | text-align: center; 87 | } 88 | 89 | input[type="number"]::-webkit-outer-spin-button, 90 | input[type="number"]::-webkit-inner-spin-button { 91 | -webkit-appearance: none; 92 | margin: 0; 93 | } 94 | 95 | input[type="number"] { 96 | -moz-appearance: textfield; 97 | } 98 | 99 | ::-ms-clear { 100 | display: none; 101 | } 102 | 103 | 104 | #data td.cores { 105 | text-align: center; 106 | } 107 | 108 | #data td.memory { 109 | text-align: center; 110 | } 111 | 112 | #data td.computeunits { 113 | text-align: left; 114 | } 115 | 116 | #data td.storage { 117 | text-align: center; 118 | } 119 | 120 | #data td.architecture { 121 | text-align: right; 122 | } 123 | 124 | #data td.ioperf { 125 | text-align: left; 126 | } 127 | 128 | #data td.maxips { 129 | text-align: right; 130 | } 131 | 132 | #data td.apiname { 133 | text-align: left; 134 | } 135 | 136 | /* Bootstrap overrides */ 137 | .dropdown-menu .active a { 138 | color: #fff !important; 139 | } 140 | 141 | .dropdown-menu li > a:hover { 142 | background: #0044cc !important; 143 | } 144 | 145 | .share-url { 146 | text-align: left; 147 | margin-left: 5px; 148 | margin-bottom: 0px !important; 149 | } 150 | 151 | .btn-sm { 152 | height: 26px; 153 | padding: 3px 0px; 154 | } 155 | 156 | .csvAzureButton { 157 | margin-right: 3.5px; 158 | } 159 | 160 | .well p:last-child { 161 | margin-bottom: 0; 162 | } 163 | 164 | th.quantity, th.cores, th.memory, th.storage { 165 | text-align: center; 166 | } 167 | 168 | /* DataTables: http://datatables.net/blog/Twitter_Bootstrap_2 */ 169 | table.table thead .sorting, 170 | table.table thead .sorting_asc, 171 | table.table thead .sorting_desc, 172 | table.table thead .sorting_asc_disabled, 173 | table.table thead .sorting_desc_disabled { 174 | cursor: pointer; 175 | *cursor: hand; 176 | } 177 | 178 | table.table thead .sorting { background: url('datatables/images/sort_both.png') no-repeat center right; } 179 | table.table thead .sorting_asc { background: url('datatables/images/sort_asc.png') no-repeat center right; } 180 | table.table thead .sorting_desc { background: url('datatables/images/sort_desc.png') no-repeat center right; } 181 | 182 | table.table thead .sorting_asc_disabled { background: url('datatables/images/sort_asc_disabled.png') no-repeat center right; } 183 | table.table thead .sorting_desc_disabled { background: url('datatables/images/sort_desc_disabled.png') no-repeat center right; } 184 | 185 | /* This class is applied to the DataTables search box by our own code once it renders */ 186 | input.search { 187 | margin-left: 5px; 188 | width: 150px; 189 | display: inline; 190 | } 191 | 192 | /* Bootstrap overrides *******************************************************/ 193 | .tooltip-inner { 194 | /* let text wrap in tooltips */ 195 | white-space: pre-wrap; 196 | } 197 | -------------------------------------------------------------------------------- /updateprices.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import csv 3 | import json 4 | import os 5 | 6 | print ("Importing Azure libraries...") 7 | from azure.mgmt.commerce import UsageManagementClient 8 | from azure.common.credentials import UserPassCredentials 9 | from azure.mgmt.resource.resources import ResourceManagementClient 10 | 11 | from collections import defaultdict 12 | 13 | def updateprices(specfile, datafile): 14 | 15 | #Replace this with your subscription id 16 | subscription_id = 'fd454c6b-2edf-40e4-bac3-bbf985868950' 17 | 18 | # See above for details on creating different types of AAD credentials 19 | credentials = UserPassCredentials( 20 | os.environ['AZURELOGIN'], # Your user 21 | os.environ['AZUREPASSWORD'], # Your password 22 | ) 23 | 24 | print ("Connecting to Azure...") 25 | commerce_client = UsageManagementClient( 26 | credentials, 27 | subscription_id 28 | ) 29 | 30 | resource_client = ResourceManagementClient( 31 | credentials, 32 | subscription_id 33 | ) 34 | resource_client.providers.register('Microsoft.Commerce') 35 | 36 | print ("Getting latest instance data...") 37 | # OfferDurableID: https://azure.microsoft.com/en-us/support/legal/offer-details/ 38 | rate = commerce_client.rate_card.get( 39 | "OfferDurableId eq 'MS-AZR-0003P' and Currency eq 'USD' and Locale eq 'en-US' and RegionInfo eq 'US'" 40 | , raw = True) 41 | 42 | rate = json.loads(rate.response._content) 43 | 44 | print ("Finding virtual machines...") 45 | virtualmachines = [x for x in rate['Meters'] if x['MeterCategory'] == "Virtual Machines"] 46 | 47 | csvfile = open(specfile) 48 | instancesSpec = list(csv.reader(csvfile, delimiter=',')) 49 | 50 | instances = [] 51 | print ("Finding regions...") 52 | regions = set([]) 53 | addOnsList = {} 54 | for vm in virtualmachines: 55 | if vm['MeterRegion'] != '': 56 | regions.add(vm['MeterRegion']) 57 | elif 'VM' not in vm['MeterSubCategory']: 58 | addOnsList[vm['MeterSubCategory']] = vm['MeterRates']['0'] 59 | 60 | print ("Initializing virtual machines from spec...") 61 | for vm in instancesSpec[1:]: 62 | nested_dict = lambda: defaultdict(nested_dict) 63 | instance = nested_dict() 64 | instance['name'] = vm[0] 65 | instance['cores'] = vm[1] 66 | instance['memory'] = vm[2] 67 | instance['storage'] = vm[3] 68 | instance['GPU'] = vm[4] 69 | for region in regions: 70 | instance['pricing'][region.encode('utf-8')]['linux'] = "N/A" 71 | instance['pricing'][region.encode('utf-8')]['windows'] = "N/A" 72 | instance['pricing'][region.encode('utf-8')]['linux-low-priority'] = "N/A" 73 | instance['pricing'][region.encode('utf-8')]['windows-low-priority'] = "N/A" 74 | instance['pricing'][region.encode('utf-8')]['msft-r-server-linux'] = "N/A" 75 | instance['pricing'][region.encode('utf-8')]['sql-web'] = "N/A" 76 | instance['pricing'][region.encode('utf-8')]['sql-standard'] = "N/A" 77 | instance['pricing'][region.encode('utf-8')]['sql-enterprise'] = "N/A" 78 | instance['pricing'][region.encode('utf-8')]['biztalk-standard'] = "N/A" 79 | instance['pricing'][region.encode('utf-8')]['biztalk-enterprise'] = "N/A" 80 | instance['pricing'][region.encode('utf-8')]['oracle-java'] = "N/A" 81 | instance['pricing'][region.encode('utf-8')]['redhat-enterprise-linux'] = "N/A" 82 | instances.append(instance) 83 | 84 | virtualmachines = [x for x in rate['Meters'] if x['MeterCategory'] == "Virtual Machines" and x['MeterRegion'] != ''] 85 | print ("Updating prices...") 86 | for vm in virtualmachines: 87 | found = False 88 | for specification in instancesSpec[1:]: 89 | for allowed in specification[5:]: 90 | if vm['MeterSubCategory'].encode('utf-8') == allowed: 91 | found = True 92 | i = int(instancesSpec[1:].index(specification)) 93 | type = instancesSpec[0][specification.index(allowed)] 94 | if found: 95 | break 96 | if found: 97 | break 98 | if found: 99 | instances[i]['pricing'][vm['MeterRegion'].encode('utf-8')][type] = vm['MeterRates']['0'] 100 | 101 | for inst in instances: 102 | for addon in addOnsList: 103 | found = False 104 | for allowed in instancesSpec[1:][instances.index(inst)][9:]: 105 | if addon == allowed: 106 | found = True 107 | type = instancesSpec[0][instancesSpec[1:][instances.index(inst)].index(allowed)] 108 | if found: 109 | break 110 | if found: 111 | for region in regions: 112 | if inst['pricing'][region]['linux'] != "N/A": 113 | inst['pricing'][region][type] = round(addOnsList[addon] + inst['pricing'][region]['linux'],5) 114 | 115 | print ("Saving instances...") 116 | with open(datafile, 'w') as f: 117 | json.dump(instances, 118 | f, 119 | indent=2, 120 | sort_keys=True, 121 | separators=(',', ': ')) 122 | 123 | if __name__ == '__main__': 124 | updateprices('data/azurevirtualmachinesSpec.csv','data/azurevirtualmachines.json') -------------------------------------------------------------------------------- /in/index.html.mako: -------------------------------------------------------------------------------- 1 | <%! 2 | active_ = "azurevms" 3 | import json 4 | %> 5 | <%inherit file="base.mako" /> 6 | 7 | <%block name="header"> 8 |

VMCompare.azurewebsites.net Easy Azure Virtual Machines Comparison

9 | 10 | 11 | 89 | 90 |
91 | Filter: 92 | Min Cores: 93 | Min Memory (GiB): 94 | Min Storage (GB): 95 |
96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | % for platform in ['linux', 'windows','sql-web','sql-standard','sql-enterprise','msft-r-server-linux','biztalk-standard','biztalk-enterprise','oracle-java','redhat-enterprise-linux']: 129 | 130 | % endfor 131 | 132 | 133 | 134 | % for inst in instances: 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | % for platform in ['linux', 'windows','sql-web','sql-standard','sql-enterprise','msft-r-server-linux','biztalk-standard','biztalk-enterprise','oracle-java','redhat-enterprise-linux']: 143 | ## note that the contents in these cost cells are overwritten by the JS change_cost() func, but the initial 144 | ## data here is used for sorting (and anyone with JS disabled...) 145 | ## for more info, see https://github.com/powdahound/ec2instances.info/issues/140 146 | 155 | % endfor 156 | 157 | % endfor 158 | 159 |
NameQuantityCoresMemory (GiB)Storage (GB)GPUsLinux (hourly)Windows (hourly)SQL Server Web (hourly)SQL Server Standard (hourly)SQL Server Enterprise (hourly)MSFT R Server for Linux (hourly)BizTalk Server Standard (hourly)BizTalk Server Enterprise (hourly)Java Development Environment (hourly)Red Hat Enterprise Linux (hourly)
Total (0 Selected)$0.000
${inst['name']}${inst['cores']}${inst['memory']}${inst['storage']}${inst['GPU']} 147 | % if inst['pricing'].get('AP Southeast', {}).get(platform) != "N/A": 148 | 149 | $${inst['pricing']['AP Southeast'][platform]} 150 | 151 | % else: 152 | unavailable 153 | % endif 154 |
160 | -------------------------------------------------------------------------------- /in/withaws.html.mako: -------------------------------------------------------------------------------- 1 | <%! 2 | active_ = "withaws" 3 | import json 4 | %> 5 | <%inherit file="base.mako" /> 6 | 7 | <%block name="header"> 8 |

VMCompare.azurewebsites.net Easy Azure Virtual Machines Comparison

9 | 10 | 11 | 89 | 90 |
91 | Filter: 92 | Min Cores: 93 | Min Memory (GiB): 94 | Min Storage (GB): 95 |
96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | % for platform in ['linux', 'windows','sql-web','sql-standard']: 121 | 122 | % endfor 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | % for platform in ['linux', 'windows','sql-web','sql-standard']: 132 | 133 | % endfor 134 | 135 | 136 | 137 | % for inst in instances: 138 | % if '(AWS)' in inst['name']: 139 | 140 | % else: 141 | 142 | % endif 143 | % if '(AWS)' in inst['name']: 144 | 145 | % else: 146 | 147 | % endif 148 | 149 | 150 | 151 | % if inst['storage'] == "EBS Only": 152 | 153 | % else: 154 | 155 | % endif 156 | 157 | % for platform in ['linux', 'windows','sql-web','sql-standard']: 158 | ## note that the contents in these cost cells are overwritten by the JS change_cost() func, but the initial 159 | ## data here is used for sorting (and anyone with JS disabled...) 160 | ## for more info, see https://github.com/powdahound/ec2instances.info/issues/140 161 | 170 | % endfor 171 | 172 | % endfor 173 | 174 |
NameQuantityCoresMemory (GiB)Storage (GB)GPUsLinuxWindowsSQL Server WebSQL Server Standard
Total (0 Selected)$0.000 hourly
Total (0 Selected)$0.000 hourly
${inst['name'].replace("(AWS) ","")}${inst['name']}${inst['cores']}${inst['memory']}EBS Only${inst['storage']}${inst['GPU']} 162 | % if inst['pricing'].get('AP Southeast', {}).get(platform) != "N/A": 163 | 164 | $${inst['pricing']['AP Southeast'][platform]} hourly 165 | 166 | % else: 167 | unavailable 168 | % endif 169 |
175 | 176 |
177 |

178 | Why? 179 | Because it's time-consuming to compare virtual machines using Azure's own pricing, pricing calculator, and other pages. 180 |

181 |

182 | Who? 183 | It was started for AWS by @powdahound and contributed to by many at GitHub. WaqasAliAbbasi ported and improved it for Azure under the supervision of Patrick Lam and Brian Law at Microsoft Hong Kong. 184 |

185 |

186 | How? 187 | Azure Virtual Machine specifications are semi-automatically updated while the prices are regularly refreshed through Azure RateCard API. This was last done at ${generated_at}. 188 |

189 | 190 |

191 | Warning: This site is not maintained by or affiliated with Microsoft. The data shown is not guaranteed to be accurate or current. Please report issues you see. 192 |

193 | 194 |
-------------------------------------------------------------------------------- /www/bootstrap/css/bootstrap-responsive.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Responsive v2.2.1 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} 10 | -------------------------------------------------------------------------------- /www/bootstrap/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.2.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{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);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)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -------------------------------------------------------------------------------- /www/bootstrap/css/bootstrap-theme.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"bootstrap-theme.css","sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAeA;;;;;;EAME,0CAAA;EC+CA,6FAAA;EACQ,qFAAA;EC5DT;AFiBC;;;;;;;;;;;;EC0CA,0DAAA;EACQ,kDAAA;EC7CT;AFqCC;;EAEE,wBAAA;EEnCH;AFwCD;EG/CI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EA+B2C,2BAAA;EAA2B,oBAAA;EE7BvE;AFAC;;EAEE,2BAAA;EACA,8BAAA;EEEH;AFCC;;EAEE,2BAAA;EACA,uBAAA;EECH;AFEC;;EAEE,2BAAA;EACA,wBAAA;EEAH;AFeD;EGhDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0BD;AFxBC;;EAEE,2BAAA;EACA,8BAAA;EE0BH;AFvBC;;EAEE,2BAAA;EACA,uBAAA;EEyBH;AFtBC;;EAEE,2BAAA;EACA,wBAAA;EEwBH;AFRD;EGjDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkDD;AFhDC;;EAEE,2BAAA;EACA,8BAAA;EEkDH;AF/CC;;EAEE,2BAAA;EACA,uBAAA;EEiDH;AF9CC;;EAEE,2BAAA;EACA,wBAAA;EEgDH;AF/BD;EGlDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0ED;AFxEC;;EAEE,2BAAA;EACA,8BAAA;EE0EH;AFvEC;;EAEE,2BAAA;EACA,uBAAA;EEyEH;AFtEC;;EAEE,2BAAA;EACA,wBAAA;EEwEH;AFtDD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkGD;AFhGC;;EAEE,2BAAA;EACA,8BAAA;EEkGH;AF/FC;;EAEE,2BAAA;EACA,uBAAA;EEiGH;AF9FC;;EAEE,2BAAA;EACA,wBAAA;EEgGH;AF7ED;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0HD;AFxHC;;EAEE,2BAAA;EACA,8BAAA;EE0HH;AFvHC;;EAEE,2BAAA;EACA,uBAAA;EEyHH;AFtHC;;EAEE,2BAAA;EACA,wBAAA;EEwHH;AF7FD;;ECbE,oDAAA;EACQ,4CAAA;EC8GT;AFvFD;;EGvEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHsEF,2BAAA;EE6FD;AF3FD;;;EG5EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4EF,2BAAA;EEiGD;AFvFD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ4GA,oBAAA;EC9CA,6FAAA;EACQ,qFAAA;EC4IT;AFlGD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;ECqJT;AF/FD;;EAEE,gDAAA;EEiGD;AF7FD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EFgOD;AFrGD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;EC0KT;AF9GD;;EAWI,2CAAA;EEuGH;AFlGD;;;EAGE,kBAAA;EEoGD;AF1FD;EACE,+CAAA;EC3FA,4FAAA;EACQ,oFAAA;ECwLT;AFlFD;EGtJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8FD;AFzFD;EGvJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsGD;AFhGD;EGxJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8GD;AFvGD;EGzJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsHD;AFtGD;EGlKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2QH;AFnGD;EG5KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkRH;AFzGD;EG7KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDyRH;AF/GD;EG9KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDgSH;AFrHD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuSH;AF3HD;EGhLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8SH;AF9HD;EGnJI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDoRH;AF1HD;EACE,oBAAA;EC/IA,oDAAA;EACQ,4CAAA;EC4QT;AF3HD;;;EAGE,+BAAA;EGpME,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHkMF,uBAAA;EEiID;AFvHD;ECjKE,mDAAA;EACQ,2CAAA;EC2RT;AFjHD;EG1NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8UH;AFvHD;EG3NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqVH;AF7HD;EG5NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4VH;AFnID;EG7NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmWH;AFzID;EG9NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0WH;AF/ID;EG/NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDiXH;AF9ID;EGvOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHqOF,uBAAA;EC1LA,2FAAA;EACQ,mFAAA;EC+UT","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",null,"// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} -------------------------------------------------------------------------------- /www/bootstrap/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.2.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | .btn-default, 8 | .btn-primary, 9 | .btn-success, 10 | .btn-info, 11 | .btn-warning, 12 | .btn-danger { 13 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); 14 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 15 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); 16 | } 17 | .btn-default:active, 18 | .btn-primary:active, 19 | .btn-success:active, 20 | .btn-info:active, 21 | .btn-warning:active, 22 | .btn-danger:active, 23 | .btn-default.active, 24 | .btn-primary.active, 25 | .btn-success.active, 26 | .btn-info.active, 27 | .btn-warning.active, 28 | .btn-danger.active { 29 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 30 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); 31 | } 32 | .btn:active, 33 | .btn.active { 34 | background-image: none; 35 | } 36 | .btn-default { 37 | text-shadow: 0 1px 0 #fff; 38 | background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); 39 | background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); 40 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); 41 | background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); 42 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 43 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 44 | background-repeat: repeat-x; 45 | border-color: #dbdbdb; 46 | border-color: #ccc; 47 | } 48 | .btn-default:hover, 49 | .btn-default:focus { 50 | background-color: #e0e0e0; 51 | background-position: 0 -15px; 52 | } 53 | .btn-default:active, 54 | .btn-default.active { 55 | background-color: #e0e0e0; 56 | border-color: #dbdbdb; 57 | } 58 | .btn-default:disabled, 59 | .btn-default[disabled] { 60 | background-color: #e0e0e0; 61 | background-image: none; 62 | } 63 | .btn-primary { 64 | background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); 65 | background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); 66 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); 67 | background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); 68 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); 69 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 70 | background-repeat: repeat-x; 71 | border-color: #2b669a; 72 | } 73 | .btn-primary:hover, 74 | .btn-primary:focus { 75 | background-color: #2d6ca2; 76 | background-position: 0 -15px; 77 | } 78 | .btn-primary:active, 79 | .btn-primary.active { 80 | background-color: #2d6ca2; 81 | border-color: #2b669a; 82 | } 83 | .btn-primary:disabled, 84 | .btn-primary[disabled] { 85 | background-color: #2d6ca2; 86 | background-image: none; 87 | } 88 | .btn-success { 89 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 90 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 91 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 92 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 93 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 94 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 95 | background-repeat: repeat-x; 96 | border-color: #3e8f3e; 97 | } 98 | .btn-success:hover, 99 | .btn-success:focus { 100 | background-color: #419641; 101 | background-position: 0 -15px; 102 | } 103 | .btn-success:active, 104 | .btn-success.active { 105 | background-color: #419641; 106 | border-color: #3e8f3e; 107 | } 108 | .btn-success:disabled, 109 | .btn-success[disabled] { 110 | background-color: #419641; 111 | background-image: none; 112 | } 113 | .btn-info { 114 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 115 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 116 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 117 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 118 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 119 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 120 | background-repeat: repeat-x; 121 | border-color: #28a4c9; 122 | } 123 | .btn-info:hover, 124 | .btn-info:focus { 125 | background-color: #2aabd2; 126 | background-position: 0 -15px; 127 | } 128 | .btn-info:active, 129 | .btn-info.active { 130 | background-color: #2aabd2; 131 | border-color: #28a4c9; 132 | } 133 | .btn-info:disabled, 134 | .btn-info[disabled] { 135 | background-color: #2aabd2; 136 | background-image: none; 137 | } 138 | .btn-warning { 139 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 140 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 141 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 142 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 143 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 144 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 145 | background-repeat: repeat-x; 146 | border-color: #e38d13; 147 | } 148 | .btn-warning:hover, 149 | .btn-warning:focus { 150 | background-color: #eb9316; 151 | background-position: 0 -15px; 152 | } 153 | .btn-warning:active, 154 | .btn-warning.active { 155 | background-color: #eb9316; 156 | border-color: #e38d13; 157 | } 158 | .btn-warning:disabled, 159 | .btn-warning[disabled] { 160 | background-color: #eb9316; 161 | background-image: none; 162 | } 163 | .btn-danger { 164 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 165 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 166 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 167 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 168 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 169 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 170 | background-repeat: repeat-x; 171 | border-color: #b92c28; 172 | } 173 | .btn-danger:hover, 174 | .btn-danger:focus { 175 | background-color: #c12e2a; 176 | background-position: 0 -15px; 177 | } 178 | .btn-danger:active, 179 | .btn-danger.active { 180 | background-color: #c12e2a; 181 | border-color: #b92c28; 182 | } 183 | .btn-danger:disabled, 184 | .btn-danger[disabled] { 185 | background-color: #c12e2a; 186 | background-image: none; 187 | } 188 | .thumbnail, 189 | .img-thumbnail { 190 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 191 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 192 | } 193 | .dropdown-menu > li > a:hover, 194 | .dropdown-menu > li > a:focus { 195 | background-color: #e8e8e8; 196 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 197 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 198 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 199 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 200 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 201 | background-repeat: repeat-x; 202 | } 203 | .dropdown-menu > .active > a, 204 | .dropdown-menu > .active > a:hover, 205 | .dropdown-menu > .active > a:focus { 206 | background-color: #357ebd; 207 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); 208 | background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); 209 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); 210 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); 211 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); 212 | background-repeat: repeat-x; 213 | } 214 | .navbar-default { 215 | background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); 216 | background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); 217 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); 218 | background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); 219 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 220 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 221 | background-repeat: repeat-x; 222 | border-radius: 4px; 223 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 224 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); 225 | } 226 | .navbar-default .navbar-nav > .active > a { 227 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); 228 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); 229 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3)); 230 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); 231 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); 232 | background-repeat: repeat-x; 233 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 234 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); 235 | } 236 | .navbar-brand, 237 | .navbar-nav > li > a { 238 | text-shadow: 0 1px 0 rgba(255, 255, 255, .25); 239 | } 240 | .navbar-inverse { 241 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); 242 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); 243 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); 244 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); 245 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 246 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 247 | background-repeat: repeat-x; 248 | } 249 | .navbar-inverse .navbar-nav > .active > a { 250 | background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); 251 | background-image: -o-linear-gradient(top, #222 0%, #282828 100%); 252 | background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828)); 253 | background-image: linear-gradient(to bottom, #222 0%, #282828 100%); 254 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); 255 | background-repeat: repeat-x; 256 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 257 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); 258 | } 259 | .navbar-inverse .navbar-brand, 260 | .navbar-inverse .navbar-nav > li > a { 261 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); 262 | } 263 | .navbar-static-top, 264 | .navbar-fixed-top, 265 | .navbar-fixed-bottom { 266 | border-radius: 0; 267 | } 268 | .alert { 269 | text-shadow: 0 1px 0 rgba(255, 255, 255, .2); 270 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 271 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); 272 | } 273 | .alert-success { 274 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 275 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 276 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 277 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 278 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 279 | background-repeat: repeat-x; 280 | border-color: #b2dba1; 281 | } 282 | .alert-info { 283 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 284 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 285 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 286 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 287 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 288 | background-repeat: repeat-x; 289 | border-color: #9acfea; 290 | } 291 | .alert-warning { 292 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 293 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 294 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 295 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 296 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 297 | background-repeat: repeat-x; 298 | border-color: #f5e79e; 299 | } 300 | .alert-danger { 301 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 302 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 303 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 304 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 305 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 306 | background-repeat: repeat-x; 307 | border-color: #dca7a7; 308 | } 309 | .progress { 310 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 311 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 312 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 313 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 314 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 315 | background-repeat: repeat-x; 316 | } 317 | .progress-bar { 318 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); 319 | background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); 320 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); 321 | background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); 322 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); 323 | background-repeat: repeat-x; 324 | } 325 | .progress-bar-success { 326 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 327 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 328 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 329 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 330 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 331 | background-repeat: repeat-x; 332 | } 333 | .progress-bar-info { 334 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 335 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 336 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 337 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 338 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 339 | background-repeat: repeat-x; 340 | } 341 | .progress-bar-warning { 342 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 343 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 344 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 345 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 346 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 347 | background-repeat: repeat-x; 348 | } 349 | .progress-bar-danger { 350 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 351 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 352 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 353 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 354 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 355 | background-repeat: repeat-x; 356 | } 357 | .progress-bar-striped { 358 | 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); 359 | 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); 360 | 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); 361 | } 362 | .list-group { 363 | border-radius: 4px; 364 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 365 | box-shadow: 0 1px 2px rgba(0, 0, 0, .075); 366 | } 367 | .list-group-item.active, 368 | .list-group-item.active:hover, 369 | .list-group-item.active:focus { 370 | text-shadow: 0 -1px 0 #3071a9; 371 | background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); 372 | background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); 373 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); 374 | background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); 375 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); 376 | background-repeat: repeat-x; 377 | border-color: #3278b3; 378 | } 379 | .panel { 380 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 381 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 382 | } 383 | .panel-default > .panel-heading { 384 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 385 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 386 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 387 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 388 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 389 | background-repeat: repeat-x; 390 | } 391 | .panel-primary > .panel-heading { 392 | background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); 393 | background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); 394 | background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); 395 | background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); 396 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); 397 | background-repeat: repeat-x; 398 | } 399 | .panel-success > .panel-heading { 400 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 401 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 402 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 403 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 404 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 405 | background-repeat: repeat-x; 406 | } 407 | .panel-info > .panel-heading { 408 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 409 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 410 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 411 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 412 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 413 | background-repeat: repeat-x; 414 | } 415 | .panel-warning > .panel-heading { 416 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 417 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 418 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 419 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 420 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 421 | background-repeat: repeat-x; 422 | } 423 | .panel-danger > .panel-heading { 424 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 425 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 426 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 427 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 428 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 429 | background-repeat: repeat-x; 430 | } 431 | .well { 432 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 433 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 434 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 435 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 436 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 437 | background-repeat: repeat-x; 438 | border-color: #dcdcdc; 439 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 440 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); 441 | } 442 | /*# sourceMappingURL=bootstrap-theme.css.map */ 443 | -------------------------------------------------------------------------------- /data/azurevirtualmachinesSpec.csv: -------------------------------------------------------------------------------- 1 | name,cores,memory,storage,GPU,linux,windows,linux-low-priority,windows-low-priority,msft-r-server-linux,sql-web,sql-standard,sql-enterprise,biztalk-standard,biztalk-enterprise,oracle-java,redhat-enterprise-linux 2 | A0 Basic,1,0.75,20,N/A,BASIC.A0 VM,BASIC.A0 VM (Windows),,,MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (1 core),Red Hat Enterprise Linux (1 core) 3 | A0 Standard,1,0.75,20,N/A,A0 VM,A0 VM (Windows),,,MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (1 core),Red Hat Enterprise Linux (1 core) 4 | A1 Basic,1,1.75,40,N/A,BASIC.A1 VM,BASIC.A1 VM (Windows),,,MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (1 core),Red Hat Enterprise Linux (1 core) 5 | A1 Standard,1,1.75,70,N/A,A1 VM,A1 VM (Windows),A1 VM Low Priority,A1 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (1 core),Red Hat Enterprise Linux (1 core) 6 | A2 Basic,2,3.50,60,N/A,BASIC.A2 VM,BASIC.A2 VM (Windows),,,MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 7 | A2 Standard,2,3.50,135,N/A,A2 VM,A2 VM (Windows),A2 VM Low Priority,A2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 8 | A3 Basic,4,7.00,120,N/A,BASIC.A3 VM,BASIC.A3 VM (Windows),,,MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 9 | A3 Standard,4,7.00,285,N/A,A3 VM,A3 VM (Windows),A3 VM Low Priority,A3 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 10 | A4 Basic,8,14.00,240,N/A,BASIC.A4 VM,BASIC.A4 VM (Windows),,,MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 11 | A4,8,14.00,605,N/A,A4 VM,A4 VM (Windows),A4 VM Low Priority,A4 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 12 | A5,2,14.00,135,N/A,A5 VM,A5 VM (Windows),A5 VM Low Priority,A5 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 13 | A6,4,28.00,285,N/A,A6 VM,A6 VM (Windows),A6 VM Low Priority,A6 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 14 | A7,8,56.00,605,N/A,A7 VM,A7 VM (Windows),A7 VM Low Priority,A7 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 15 | A8,8,56.00,382,N/A,A8 VM,A8 VM (Windows),A8 VM Low Priority,A8 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 16 | A9,16,112.00,382,N/A,A9 VM,A9 VM (Windows),A9 VM Low Priority,A9 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 17 | A10,8,56.00,382,N/A,A10 VM,A10 VM (Windows),A10 VM Low Priority,A10 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 18 | A11,16,112.00,382,N/A,A11 VM,A11 VM (Windows),A11 VM Low Priority,A11 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 19 | A1 v2,1,2.00,10,N/A,Standard_A1_v2 VM,Standard_A1_v2 VM (Windows),Standard_A1_v2 VM Low Priority,Standard_A1_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (1 core),Red Hat Enterprise Linux (1 core) 20 | A2 v2,2,4.00,20,N/A,Standard_A2_v2 VM,Standard_A2_v2 VM (Windows),Standard_A2_v2 VM Low Priority,Standard_A2_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 21 | A4 v2,4,8.00,40,N/A,Standard_A4_v2 VM,Standard_A4_v2 VM (Windows),Standard_A4_v2 VM Low Priority,Standard_A4_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 22 | A8 v2,8,16.00,80,N/A,Standard_A8_v2 VM,Standard_A8_v2 VM (Windows),Standard_A8_v2 VM Low Priority,Standard_A8_v2 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 23 | A2m v2,2,16.00,20,N/A,Standard_A2m_v2 VM,Standard_A2m_v2 VM (Windows),Standard_A2m_v2 VM Low Priority,Standard_A2m_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 24 | A4m v2,4,32.00,40,N/A,Standard_A4m_v2 VM,Standard_A4m_v2 VM (Windows),Standard_A4m_v2 VM Low Priority,Standard_A4m_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 25 | A8m v2,8,64.00,80,N/A,Standard_A8m_v2 VM,Standard_A8m_v2 VM (Windows),Standard_A8m_v2 VM Low Priority,Standard_A8m_v2 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 26 | D1,1,3.50,50,N/A,Standard_D1 VM,Standard_D1 VM (Windows),Standard_D1 VM Low Priority,Standard_D1 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (1 core),Red Hat Enterprise Linux (1 core) 27 | D2,2,7.00,100,N/A,Standard_D2 VM,Standard_D2 VM (Windows),Standard_D2 VM Low Priority,Standard_D2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 28 | D3,4,14.00,200,N/A,Standard_D3 VM,Standard_D3 VM (Windows),Standard_D3 VM Low Priority,Standard_D3 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 29 | D4,8,28.00,400,N/A,Standard_D4 VM,Standard_D4 VM (Windows),Standard_D4 VM Low Priority,Standard_D4 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 30 | D11,2,14.00,100,N/A,Standard_D11 VM,Standard_D11 VM (Windows),Standard_D11 VM Low Priority,Standard_D11 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 31 | D12,4,28.00,200,N/A,Standard_D12 VM,Standard_D12 VM (Windows),Standard_D12 VM Low Priority,Standard_D12 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 32 | D13,8,56.00,400,N/A,Standard_D13 VM,Standard_D13 VM (Windows),Standard_D13 VM Low Priority,Standard_D13 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 33 | D14,16,112.00,800,N/A,Standard_D14 VM,Standard_D14 VM (Windows),Standard_D14 VM Low Priority,Standard_D14 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 34 | D1 v2,1,3.50,50,N/A,Standard_D1_v2 VM,Standard_D1_v2 VM (Windows),Standard_D1_v2 VM Low Priority,Standard_D1_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (1 core),Red Hat Enterprise Linux (1 core) 35 | D2 v2,2,7.00,100,N/A,Standard_D2_v2 VM,Standard_D2_v2 VM (Windows),Standard_D2_v2 VM Low Priority,Standard_D2_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 36 | D3 v2,4,14.00,200,N/A,Standard_D3_v2 VM,Standard_D3_v2 VM (Windows),Standard_D3_v2 VM Low Priority,Standard_D3_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 37 | D4 v2,8,28.00,400,N/A,Standard_D4_v2 VM,Standard_D4_v2 VM (Windows),Standard_D4_v2 VM Low Priority,Standard_D4_v2 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 38 | D5 v2,16,56.00,800,N/A,Standard_D5_v2 VM,Standard_D5_v2 VM (Windows),Standard_D5_v2 VM Low Priority,Standard_D5_v2 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 39 | D11 v2,2,14.00,100,N/A,Standard_D11_v2 VM,Standard_D11_v2 VM (Windows),Standard_D11_v2 VM Low Priority,Standard_D11_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 40 | D12 v2,4,28.00,200,N/A,Standard_D12_v2 VM,Standard_D12_v2 VM (Windows),Standard_D12_v2 VM Low Priority,Standard_D12_v2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 41 | D13 v2,8,56.00,400,N/A,Standard_D13_v2 VM,Standard_D13_v2 VM (Windows),Standard_D13_v2 VM Low Priority,Standard_D13_v2 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 42 | D14 v2,16,112.00,800,N/A,Standard_D14_v2 VM,Standard_D14_v2 VM (Windows),Standard_D14_v2 VM Low Priority,Standard_D14_v2 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 43 | D15 v2,20,140.00,1000,N/A,Standard_D15_v2 VM,Standard_D15_v2 VM (Windows),Standard_D15_v2 VM Low Priority,Standard_D15_v2 VM Low Priority (Windows),MSFT R Server for Linux (20 core),SQL Server Web (20 core),SQL Server Standard (20 core),SQL Server Enterprise (20 core),BizTalk Server Standard (20 core),BizTalk Server Enterprise (20 core),Java Development Environment (20 core),Red Hat Enterprise Linux (20 core) 44 | F1,1,2.00,16,N/A,Standard_F1 VM,Standard_F1 VM (Windows),Standard_F1 VM Low Priority,Standard_F1 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (1 core),Red Hat Enterprise Linux (1 core) 45 | F2,2,4.00,32,N/A,Standard_F2 VM,Standard_F2 VM (Windows),Standard_F2 VM Low Priority,Standard_F2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 46 | F4,4,8.00,64,N/A,Standard_F4 VM,Standard_F4 VM (Windows),Standard_F4 VM Low Priority,Standard_F4 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 47 | F8,8,16.00,128,N/A,Standard_F8 VM,Standard_F8 VM (Windows),Standard_F8 VM Low Priority,Standard_F8 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 48 | F16,16,32.00,256,N/A,Standard_F16 VM,Standard_F16 VM (Windows),Standard_F16 VM Low Priority,Standard_F16 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 49 | H8,8,56.00,1000,N/A,Standard_H8 VM,Standard_H8 VM (Windows),Standard_H8 VM Low Priority,Standard_H8 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 50 | H16,16,112.00,2000,N/A,Standard_H16 VM,Standard_H16 VM (Windows),Standard_H16 VM Low Priority,Standard_H16 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 51 | H8m,8,112.00,1000,N/A,Standard_H8m VM,Standard_H8m VM (Windows),Standard_H8m VM Low Priority,Standard_H8m VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 52 | H16m,16,224.00,2000,N/A,Standard_H16m VM,Standard_H16m VM (Windows),Standard_H16m VM Low Priority,Standard_H16m VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 53 | H16mr,16,224.00,2000,N/A,Standard_H16mr VM,Standard_H16mr VM (Windows),Standard_H16mr VM Low Priority,Standard_H16mr VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 54 | H16r,16,112.00,2000,N/A,Standard_H16r VM,Standard_H16r VM (Windows),Standard_H16r VM Low Priority,Standard_H16r VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 55 | NC6,6,56.00,340,1X K80,Standard_NC6 VM,Standard_NC6 VM (Windows),Standard_NC6 VM Low Priority,Standard_NC6 VM Low Priority (Windows),MSFT R Server for Linux (6 core),SQL Server Web (6 core),SQL Server Standard (6 core),SQL Server Enterprise (6 core),BizTalk Server Standard (6 core),BizTalk Server Enterprise (6 core),Java Development Environment (6 core),Red Hat Enterprise Linux (6 core) 56 | NC12,12,112.00,680,2X K80,Standard_NC12 VM,Standard_NC12 VM (Windows),Standard_NC12 VM Low Priority,Standard_NC12 VM Low Priority (Windows),MSFT R Server for Linux (12 core),SQL Server Web (12 core),SQL Server Standard (12 core),SQL Server Enterprise (12 core),BizTalk Server Standard (12 core),BizTalk Server Enterprise (12 core),Java Development Environment (12 core),Red Hat Enterprise Linux (12 core) 57 | NC24,24,224.00,1440,4X K80,Standard_NC24 VM,Standard_NC24 VM (Windows),Standard_NC24 VM Low Priority,Standard_NC24 VM Low Priority (Windows),MSFT R Server for Linux (24 core),SQL Server Web (24 core),SQL Server Standard (24 core),SQL Server Enterprise (24 core),BizTalk Server Standard (24 core),BizTalk Server Enterprise (24 core),Java Development Environment (24 core),Red Hat Enterprise Linux (24 core) 58 | NC24r,24,224.00,1440,4X K80,Standard_NC24r VM,Standard_NC24r VM (Windows),Standard_NC24r VM Low Priority,Standard_NC24r VM Low Priority (Windows),MSFT R Server for Linux (24 core),SQL Server Web (24 core),SQL Server Standard (24 core),SQL Server Enterprise (24 core),BizTalk Server Standard (24 core),BizTalk Server Enterprise (24 core),Java Development Environment (24 core),Red Hat Enterprise Linux (24 core) 59 | NV6,6,56.00,340,1X M60,Standard_NV6 VM,Standard_NV6 VM (Windows),Standard_NV6 VM Low Priority,Standard_NV6 VM Low Priority (Windows),MSFT R Server for Linux (6 core),SQL Server Web (6 core),SQL Server Standard (6 core),SQL Server Enterprise (6 core),BizTalk Server Standard (6 core),BizTalk Server Enterprise (6 core),Java Development Environment (6 core),Red Hat Enterprise Linux (6 core) 60 | NV12,12,112.00,680,2X M60,Standard_NV12 VM,Standard_NV12 VM (Windows),Standard_NV12 VM Low Priority,Standard_NV12 VM Low Priority (Windows),MSFT R Server for Linux (12 core),SQL Server Web (12 core),SQL Server Standard (12 core),SQL Server Enterprise (12 core),BizTalk Server Standard (12 core),BizTalk Server Enterprise (12 core),Java Development Environment (12 core),Red Hat Enterprise Linux (12 core) 61 | NV24,24,224.00,1440,4X M60,Standard_NV24 VM,Standard_NV24 VM (Windows),Standard_NV24 VM Low Priority,Standard_NV24 VM Low Priority (Windows),MSFT R Server for Linux (24 core),SQL Server Web (24 core),SQL Server Standard (24 core),SQL Server Enterprise (24 core),BizTalk Server Standard (24 core),BizTalk Server Enterprise (24 core),Java Development Environment (24 core),Red Hat Enterprise Linux (24 core) 62 | L4,4,32.00,678,N/A,Standard_L4 VM,Standard_L4 VM (Windows),Standard_L4 VM Low Priority,Standard_L4 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 63 | L8,8,64.00,1388,N/A,Standard_L8 VM,Standard_L8 VM (Windows),Standard_L8 VM Low Priority,Standard_L8 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 64 | L16,16,128.00,2807,N/A,Standard_L16 VM,Standard_L16 VM (Windows),Standard_L16 VM Low Priority,Standard_L16 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 65 | L32,32,256.00,5630,N/A,Standard_L32 VM,Standard_L32 VM (Windows),Standard_L32 VM Low Priority,Standard_L32 VM Low Priority (Windows),MSFT R Server for Linux (32 core),SQL Server Web (32 core),SQL Server Standard (32 core),SQL Server Enterprise (32 core),BizTalk Server Standard (32 core),BizTalk Server Enterprise (32 core),Java Development Environment (32 core),Red Hat Enterprise Linux (32 core) 66 | G1,2,28.00,384,N/A,Standard_G1 VM,Standard_G1 VM (Windows),Standard_G1 VM Low Priority,Standard_G1 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (2 core),Red Hat Enterprise Linux (2 core) 67 | G2,4,56.00,768,N/A,Standard_G2 VM,Standard_G2 VM (Windows),Standard_G2 VM Low Priority,Standard_G2 VM Low Priority (Windows),MSFT R Server for Linux (up to 4 c),SQL Server Web (up to 4 cores),SQL Server Standard (up to 4 cores),SQL Server Enterprise (up to 4c),BizTalk Server Standard (up to 4c),BizTalk Server Enterprise (upto 4c),Java Development Environment (4 core),Red Hat Enterprise Linux (4 core) 68 | G3,8,112.00,1536,N/A,Standard_G3 VM,Standard_G3 VM (Windows),Standard_G3 VM Low Priority,Standard_G3 VM Low Priority (Windows),MSFT R Server for Linux (8 core),SQL Server Web (8 core),SQL Server Standard (8 core),SQL Server Enterprise (8 core),BizTalk Server Standard (8 core),BizTalk Server Enterprise (8 core),Java Development Environment (8 core),Red Hat Enterprise Linux (8 core) 69 | G4,16,224.00,3072,N/A,Standard_G4 VM,Standard_G4 VM (Windows),Standard_G4 VM Low Priority,Standard_G4 VM Low Priority (Windows),MSFT R Server for Linux (16 core),SQL Server Web (16 core),SQL Server Standard (16 core),SQL Server Enterprise (16 core),BizTalk Server Standard (16 core),BizTalk Server Enterprise (16 core),Java Development Environment (16 core),Red Hat Enterprise Linux (16 core) 70 | G5,32,448.00,6144,N/A,Standard_G5 VM,Standard_G5 VM (Windows),Standard_G5 VM Low Priority,Standard_G5 VM Low Priority (Windows),MSFT R Server for Linux (32 core),SQL Server Web (32 core),SQL Server Standard (32 core),SQL Server Enterprise (32 core),BizTalk Server Standard (32 core),BizTalk Server Enterprise (32 core),Java Development Environment (32 core),Red Hat Enterprise Linux (32 core) 71 | -------------------------------------------------------------------------------- /scrape.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from lxml import etree 3 | import urllib2 4 | import re 5 | import json 6 | import locale 7 | 8 | 9 | # Following advice from https://stackoverflow.com/a/1779324/216138 10 | # The locale must be installed in the system, and it must be one where ',' is 11 | # the thousans separator and '.' is the decimal fraction separator. 12 | locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 13 | 14 | 15 | class Instance(object): 16 | def __init__(self): 17 | self.vpc = None 18 | self.arch = ['x86_64'] 19 | self.ECU = 0 20 | self.base_performance = None 21 | self.burst_minutes = None 22 | self.linux_virtualization_types = [] 23 | self.ebs_only=True 24 | self.ebs_throughput = 0 25 | self.ebs_iops = 0 26 | self.ebs_max_bandwidth = 0 27 | self.ebs_optimized = False 28 | # self.hvm_only = False 29 | self.vpc_only = False 30 | self.ipv6_support = False 31 | self.trim_support = False 32 | self.ssd = False 33 | self.devices = 0 34 | self.size = 0 35 | self.nvme_ssd = False 36 | self.storage_needs_initialization = False 37 | self.includes_swap_partition = False 38 | self.placement_group_support = False 39 | self.pretty_name = '' 40 | self.vCPU = 0 41 | self.GPU = 0 42 | self.FPGA = 0 43 | self.instance_type = '' 44 | self.family = '' 45 | self.memory = 0 46 | self.pricing = {} 47 | 48 | def to_dict(self): 49 | d = dict(family=self.family, 50 | instance_type=self.instance_type, 51 | pretty_name=self.pretty_name, 52 | arch=self.arch, 53 | vCPU=self.vCPU, 54 | GPU=self.GPU, 55 | FPGA=self.FPGA, 56 | ECU=self.ECU, 57 | base_performance=self.base_performance, 58 | burst_minutes=self.burst_minutes, 59 | memory=self.memory, 60 | ebs_optimized=self.ebs_optimized, 61 | ebs_throughput=self.ebs_throughput, 62 | ebs_iops=self.ebs_iops, 63 | ebs_max_bandwidth=self.ebs_max_bandwidth, 64 | network_performance=self.network_performance, 65 | enhanced_networking=self.enhanced_networking, 66 | placement_group_support=self.placement_group_support, 67 | pricing=self.pricing, 68 | vpc=self.vpc, 69 | linux_virtualization_types=self.linux_virtualization_types, 70 | generation=self.generation, 71 | vpc_only=self.vpc_only, 72 | ipv6_support=self.ipv6_support) 73 | if self.ebs_only: 74 | d['storage'] = None 75 | else: 76 | d['storage'] = dict(ssd=self.ssd, 77 | trim_support=self.trim_support, 78 | nvme_ssd=self.nvme_ssd, 79 | storage_needs_initialization=self.storage_needs_initialization, 80 | includes_swap_partition=self.includes_swap_partition, 81 | devices=self.num_drives, 82 | size=self.drive_size) 83 | return d 84 | 85 | 86 | def totext(elt): 87 | s = etree.tostring(elt, method='text', encoding='unicode').strip() 88 | return re.sub(r'\*\d$', '', s) 89 | 90 | 91 | def parse_prev_generation_instance(tr): 92 | i = Instance() 93 | cols = tr.xpath('td') 94 | assert len(cols) == 8, "Expected 8 columns in the table, but got %d" % len(cols) 95 | i.family = totext(cols[0]) 96 | i.instance_type = totext(cols[1]) 97 | archs = totext(cols[2]) 98 | i.arch = [] 99 | if '32-bit' in archs: 100 | i.arch.append('i386') 101 | if '64-bit' in archs: 102 | i.arch.append('x86_64') 103 | assert i.arch, "No archs detected: %s" % (archs,) 104 | i.vCPU = locale.atoi(totext(cols[3])) 105 | i.memory = locale.atof(totext(cols[4])) 106 | i.ebs_optimized = totext(cols[6]).lower() == 'yes' 107 | i.network_performance = totext(cols[7]) 108 | i.enhanced_networking = False 109 | i.generation = 'previous' 110 | # print "Parsed %s..." % (i.instance_type) 111 | return i 112 | 113 | 114 | def parse_instance(tr, inst2family): 115 | i = Instance() 116 | cols = tr.xpath('td') 117 | assert len(cols) == 12, "Expected 12 columns in the table, but got %d" % len(cols) 118 | i.instance_type = totext(cols[0]) 119 | # Correct typo on AWS site (temporary fix on 2016-10-11) 120 | # https://github.com/powdahound/ec2instances.info/issues/199 121 | if i.instance_type == 'x1.16large': 122 | i.instance_type = 'x1.16xlarge' 123 | # Correct typo on AWS site (temporary fix on 2017-02-23) 124 | # https://github.com/powdahound/ec2instances.info/issues/227 125 | if i.instance_type == 'i3.4xlxarge': 126 | i.instance_type = 'i3.4xlarge' 127 | if i.instance_type == 'i3.16large': 128 | i.instance_type = 'i3.16xlarge' 129 | i.family = inst2family.get(i.instance_type, "Unknown") 130 | # Some instances support 32-bit arch 131 | # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-resize.html#resize-limitations 132 | supports_32bit = ( 133 | 't2.nano', 134 | 't2.micro', 135 | 't2.small', 136 | 't2.medium', 137 | 'c3.large', 138 | 't1.micro', 139 | 'm1.small', 140 | 'm1.medium', 141 | 'c1.medium') 142 | if i.instance_type in supports_32bit: 143 | i.arch.append('i386') 144 | i.vCPU = locale.atoi(totext(cols[1])) 145 | i.memory = locale.atof(totext(cols[2])) 146 | i.ebs_optimized = totext(cols[10]).lower() == 'yes' 147 | i.network_performance = totext(cols[4]) 148 | i.enhanced_networking = totext(cols[11]).lower() == 'yes' 149 | i.generation = 'current' 150 | # print "Parsed %s..." % (i.instance_type) 151 | return i 152 | 153 | 154 | def _rindex_family(inst2family, details): 155 | rows = details.xpath('tr')[0:] 156 | for r in rows: 157 | cols = r.xpath('th') or r.xpath('td') 158 | for i in totext(cols[1]).split('|'): 159 | i = i.strip() 160 | inst2family[i] = totext(cols[0]) 161 | 162 | def feature_support(details, types): 163 | rows = details.xpath('tr')[0:] 164 | for r in rows: 165 | cols = r.xpath('th') or r.xpath('td') 166 | if totext(cols[4]).lower() == 'yes': 167 | family = totext(cols[0]).lower()+"." 168 | for i in types: 169 | if i.instance_type.startswith(family): 170 | i.placement_group_support = True 171 | if totext(cols[7]).lower() == 'yes': 172 | family = totext(cols[0]).lower()+"." 173 | for i in types: 174 | if i.instance_type.startswith(family): 175 | i.ipv6_support = True 176 | 177 | 178 | def parse_gpus(tr, by_type): 179 | cols = tr.xpath('td') 180 | instance_type = totext(cols[0]) 181 | instance = by_type.get(instance_type, None) 182 | if instance is None: 183 | return 184 | instance.GPU = totext(cols[1]) 185 | 186 | 187 | def parse_instance_fpgas(tr, by_type): 188 | cols = tr.xpath('td') 189 | instance_type = totext(cols[0]) 190 | instance = by_type.get(instance_type, None) 191 | if instance is None: 192 | return 193 | instance.FPGA = totext(cols[1]) 194 | 195 | 196 | def scrape_instances(): 197 | inst2family = dict() 198 | tree = etree.parse(urllib2.urlopen("http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html"), 199 | etree.HTMLParser()) 200 | details = tree.xpath('//div[@class="table-contents"]//table')[0] 201 | hdrs = details.xpath('tr')[0] 202 | if totext(hdrs[0]).lower() == 'instance family' and 'current generation' in totext(hdrs[1]).lower(): 203 | _rindex_family(inst2family, details) 204 | details = tree.xpath('//div[@class="table-contents"]//table')[1] 205 | hdrs = details.xpath('tr')[0] 206 | if totext(hdrs[0]).lower() == 'instance family' and 'previous generation' in totext(hdrs[1]).lower(): 207 | _rindex_family(inst2family, details) 208 | assert len(inst2family) > 0, "Failed to find instance family info" 209 | features_details = tree.xpath('//div[@class="table-contents"]//table')[2] 210 | 211 | tree = etree.parse(urllib2.urlopen("http://aws.amazon.com/ec2/instance-types/"), etree.HTMLParser()) 212 | details = tree.xpath('//table[count(tbody/tr[1]/td)=12]')[0] 213 | rows = details.xpath('tbody/tr')[1:] 214 | assert len(rows) > 0, "Didn't find any table rows." 215 | current_gen = [parse_instance(r, inst2family) for r in rows] 216 | 217 | details = tree.xpath("//table")[8] 218 | rows = details.xpath('tbody/tr')[1:] 219 | assert len(rows) > 0, "Didn't find any p2 class GPU rows" 220 | by_type = {i.instance_type: i for i in current_gen} 221 | for r in rows: 222 | parse_gpus(r, by_type) 223 | 224 | details = tree.xpath("//table")[9] 225 | rows = details.xpath('tbody/tr')[1:] 226 | assert len(rows) > 0, "Didn't find any g2 class GPU rows" 227 | for r in rows: 228 | parse_gpus(r, by_type) 229 | 230 | details = tree.xpath("//table")[10] 231 | rows = details.xpath('tbody/tr')[1:] 232 | assert len(rows) > 0, "Didn't find any f1 FPGA rows" 233 | for r in rows: 234 | parse_instance_fpgas(r, by_type) 235 | 236 | tree = etree.parse(urllib2.urlopen("http://aws.amazon.com/ec2/previous-generation/"), etree.HTMLParser()) 237 | details = tree.xpath('//table')[7] 238 | rows = details.xpath('tbody/tr')[1:] 239 | assert len(rows) > 0, "Didn't find any table rows." 240 | prev_gen = [parse_prev_generation_instance(r) for r in rows] 241 | 242 | all_gen = prev_gen + current_gen 243 | hdrs = features_details.xpath('tr')[0] 244 | if totext(hdrs[0]).lower() == '' and 'ipv6 support' in totext(hdrs[7]).lower(): 245 | feature_support(features_details, all_gen) 246 | return all_gen 247 | 248 | 249 | def transform_size(size): 250 | if size == 'u': 251 | return 'micro' 252 | if size == 'sm': 253 | return 'small' 254 | if size == 'med': 255 | return 'medium' 256 | m = re.search('^(x+)l$', size) 257 | if m: 258 | xs = len(m.group(1)) 259 | if xs == 1: 260 | return 'xlarge' 261 | else: 262 | return str(xs) + 'xlarge' 263 | assert size == 'lg', "Unable to parse size: %s" % (size,) 264 | return 'large' 265 | 266 | 267 | def transform_region(reg): 268 | region_map = { 269 | 'eu-ireland': 'eu-west-1', 270 | 'eu-frankfurt': 'eu-central-1', 271 | 'apac-sin': 'ap-southeast-1', 272 | 'apac-syd': 'ap-southeast-2', 273 | 'apac-tokyo': 'ap-northeast-1'} 274 | if reg in region_map: 275 | return region_map[reg] 276 | m = re.search(r'^([^0-9]*)(-(\d))?$', reg) 277 | assert m, "Can't parse region: %s" % (reg,) 278 | base = m.group(1) 279 | num = m.group(3) or '1' 280 | return base + "-" + num 281 | 282 | 283 | def add_pricing(imap, data, platform, pricing_mode): 284 | if pricing_mode == 'od': 285 | add_ondemand_pricing(imap, data, platform) 286 | elif pricing_mode == 'ri': 287 | add_reserved_pricing(imap, data, platform) 288 | 289 | 290 | def add_ondemand_pricing(imap, data, platform): 291 | for region_spec in data['config']['regions']: 292 | region = transform_region(region_spec['region']) 293 | for t_spec in region_spec['instanceTypes']: 294 | typename = t_spec['type'] 295 | for i_spec in t_spec['sizes']: 296 | i_type = i_spec['size'] 297 | if i_type not in imap: 298 | print("ERROR: Got ondemand pricing data for unknown instance type: {}".format(i_type)) 299 | continue 300 | inst = imap[i_type] 301 | inst.pricing.setdefault(region, {}) 302 | # print "%s/%s" % (region, i_type) 303 | 304 | inst.pricing[region].setdefault(platform, {}) 305 | for col in i_spec['valueColumns']: 306 | inst.pricing[region][platform]['ondemand'] = col['prices']['USD'] 307 | 308 | # ECU is only available here 309 | try: 310 | inst.ECU = locale.atof(i_spec['ECU']) 311 | except: 312 | # these are likely instances with 'variable' ECU 313 | inst.ECU = i_spec['ECU'] 314 | 315 | 316 | def add_reserved_pricing(imap, data, platform): 317 | for region_spec in data['config']['regions']: 318 | region = transform_region(region_spec['region']) 319 | for t_spec in region_spec['instanceTypes']: 320 | i_type = t_spec['type'] 321 | if i_type not in imap: 322 | print("ERROR: Got reserved pricing data for unknown instance type: {}".format(i_type)) 323 | continue 324 | inst = imap[i_type] 325 | inst.pricing.setdefault(region, {}) 326 | # print "%s/%s" % (region, i_type) 327 | inst.pricing[region].setdefault(platform, {}) 328 | inst.pricing[region][platform].setdefault('reserved', {}) 329 | 330 | termPricing = {} 331 | 332 | for term in t_spec['terms']: 333 | for po in term['purchaseOptions']: 334 | for value in po['valueColumns']: 335 | if value['name'] == 'effectiveHourly': 336 | termPricing[term['term'] + '.' + po['purchaseOption']] = value['prices']['USD'] 337 | 338 | inst.pricing[region][platform]['reserved'] = termPricing 339 | 340 | def add_ebs_pricing(imap, data): 341 | for region_spec in data['config']['regions']: 342 | region = transform_region(region_spec['region']) 343 | for t_spec in region_spec['instanceTypes']: 344 | typename = t_spec['type'] 345 | for i_spec in t_spec['sizes']: 346 | i_type = i_spec['size'] 347 | if i_type not in imap: 348 | print("ERROR: Got EBS pricing data for unknown instance type: {}".format(i_type)) 349 | continue 350 | inst = imap[i_type] 351 | inst.pricing.setdefault(region, {}) 352 | # print "%s/%s" % (region, i_type) 353 | 354 | for col in i_spec['valueColumns']: 355 | inst.pricing[region]['ebs'] = col['prices']['USD'] 356 | 357 | def add_pricing_info(instances): 358 | pricing_modes = ['ri', 'od'] 359 | 360 | reserved_name_map = { 361 | 'linux': 'linux-unix-shared', 362 | 'mswin': 'windows-shared', 363 | 'mswinSQL': 'windows-with-sql-server-standard-shared', 364 | 'mswinSQLWeb': 'windows-with-sql-server-web-shared' 365 | } 366 | 367 | for i in instances: 368 | i.pricing = {} 369 | 370 | by_type = {i.instance_type: i for i in instances} 371 | 372 | for platform in ['linux', 'mswin', 'mswinSQL', 'mswinSQLWeb']: 373 | for pricing_mode in pricing_modes: 374 | # current generation 375 | if pricing_mode == 'od': 376 | pricing_url = 'https://a0.awsstatic.com/pricing/1/deprecated/ec2/%s-od.json' % (platform,) 377 | else: 378 | pricing_url = 'http://a0.awsstatic.com/pricing/1/ec2/ri-v2/%s.min.js' % (reserved_name_map[platform],) 379 | 380 | pricing = fetch_data(pricing_url) 381 | add_pricing(by_type, pricing, platform, pricing_mode) 382 | 383 | # previous generation 384 | if pricing_mode == 'od': 385 | pricing_url = 'http://a0.awsstatic.com/pricing/1/ec2/previous-generation/%s-od.min.js' % (platform,) 386 | else: 387 | pricing_url = 'http://a0.awsstatic.com/pricing/1/ec2/previous-generation/ri-v2/%s.min.js' % ( 388 | reserved_name_map[platform],) 389 | 390 | pricing = fetch_data(pricing_url) 391 | add_pricing(by_type, pricing, platform, pricing_mode) 392 | 393 | # EBS cost surcharge as per https://aws.amazon.com/ec2/pricing/on-demand/#EBS-Optimized_Instances 394 | ebs_pricing_url = 'https://a0.awsstatic.com/pricing/1/ec2/pricing-ebs-optimized-instances.min.js' 395 | pricing = fetch_data(ebs_pricing_url) 396 | add_ebs_pricing(by_type, pricing) 397 | 398 | 399 | def fetch_data(url): 400 | content = urllib2.urlopen(url).read() 401 | try: 402 | pricing = json.loads(content) 403 | except ValueError: 404 | # if the data isn't compatible JSON, try to parse as jsonP 405 | json_string = re.sub(r"(\w+):", r'"\1":', 406 | content[content.index('callback(') + 9: -2]) # convert into valid json 407 | pricing = json.loads(json_string) 408 | 409 | return pricing 410 | 411 | 412 | def add_eni_info(instances): 413 | eni_url = "http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html" 414 | tree = etree.parse(urllib2.urlopen(eni_url), etree.HTMLParser()) 415 | table = tree.xpath('//div[@class="informaltable"]//table')[0] 416 | rows = table.xpath('.//tr[./td]') 417 | by_type = {i.instance_type: i for i in instances} 418 | 419 | for r in rows: 420 | instance_type = etree.tostring(r[0], method='text').strip() 421 | max_enis = locale.atoi(etree.tostring(r[1], method='text')) 422 | ip_per_eni = locale.atoi(etree.tostring(r[2], method='text')) 423 | # Correct typo on AWS site (temporary fix on 2017-02-23) 424 | # https://github.com/powdahound/ec2instances.info/issues/227 425 | if instance_type == 'i316xlarge': 426 | instance_type = 'i3.16xlarge' 427 | if instance_type not in by_type: 428 | print "Unknown instance type: " + instance_type 429 | continue 430 | by_type[instance_type].vpc = { 431 | 'max_enis': max_enis, 432 | 'ips_per_eni': ip_per_eni} 433 | 434 | 435 | def add_ebs_info(instances): 436 | ebs_url = "http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSOptimized.html" 437 | tree = etree.parse(urllib2.urlopen(ebs_url), etree.HTMLParser()) 438 | table = tree.xpath('//div[@class="table-contents"]//table')[0] 439 | rows = table.xpath('tr') 440 | by_type = {i.instance_type: i for i in instances} 441 | 442 | for row in rows: 443 | if row.xpath('th'): 444 | continue 445 | 446 | cols = row.xpath('td') 447 | instance_type = totext(cols[0]).split(' ')[0] 448 | ebs_optimized_by_default = totext(cols[1]) == 'Yes' 449 | ebs_max_bandwidth = locale.atof(totext(cols[2])) 450 | ebs_throughput = locale.atof(totext(cols[3])) 451 | ebs_iops = locale.atof(totext(cols[4])) 452 | if instance_type not in by_type: 453 | print "Unknown instance type: " + instance_type 454 | continue 455 | by_type[instance_type].ebs_optimized_by_default = ebs_optimized_by_default 456 | by_type[instance_type].ebs_throughput = ebs_throughput 457 | by_type[instance_type].ebs_iops = ebs_iops 458 | by_type[instance_type].ebs_max_bandwidth = ebs_max_bandwidth 459 | 460 | 461 | def add_linux_ami_info(instances): 462 | """Add information about which virtualization options are supported. 463 | 464 | Note that only HVM is supported for Windows instances so that info is not 465 | given its own column. 466 | 467 | """ 468 | checkmark_char = u'\u2713' 469 | url = "http://aws.amazon.com/amazon-linux-ami/instance-type-matrix/" 470 | tree = etree.parse(urllib2.urlopen(url), etree.HTMLParser()) 471 | table = tree.xpath('//div[@class="aws-table "]/table')[0] 472 | rows = table.xpath('.//tr[./td]')[1:] # ignore header 473 | 474 | for r in rows: 475 | supported_types = [] 476 | family_id = totext(r[0]).lower() 477 | if not family_id: 478 | continue 479 | # We only check the primary EBS-backed values here since the 'storage' 480 | # column will already be able to tell users whether or not the instance 481 | # they're looking at can use EBS and/or instance-store AMIs. 482 | if totext(r[1]) == checkmark_char: 483 | supported_types.append('HVM') 484 | if totext(r[3]) == checkmark_char: 485 | supported_types.append('PV') 486 | 487 | # Apply types for this instance family to all matching instances 488 | for i in instances: 489 | i_family_id = i.instance_type.split('.')[0] 490 | if i_family_id == family_id: 491 | i.linux_virtualization_types = supported_types 492 | 493 | # http://aws.amazon.com/amazon-linux-ami/instance-type-matrix/ page is 494 | # missing info about both older (t1, m1, c1, m2) and newer exotic (cg1, 495 | # cr1, hi1, hs1, cc2) instance type generations. 496 | 497 | # Adding "manual" info about older generations 498 | # Some background info at https://github.com/powdahound/ec2instances.info/pull/161 499 | for i in instances: 500 | i_family_id = i.instance_type.split('.')[0] 501 | if i_family_id in ('cc2', 'cg1', 'hi1', 'hs1'): 502 | if not 'HVM' in i.linux_virtualization_types: 503 | i.linux_virtualization_types.append('HVM') 504 | if i_family_id in ('t1', 'm1', 'm2', 'c1', 'hi1', 'hs1'): 505 | if not 'PV' in i.linux_virtualization_types: 506 | i.linux_virtualization_types.append('PV') 507 | 508 | 509 | def add_vpconly_detail(instances): 510 | # specific instances can be lanuched in VPC only 511 | # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-vpc.html#vpc-only-instance-types 512 | vpc_only_families = ('c4', 'i3', 'm4', 'p2', 'r4', 't2', 'x1') 513 | for i in instances: 514 | for family in vpc_only_families: 515 | if i.instance_type.startswith(family): 516 | i.vpc_only = True 517 | 518 | 519 | def add_instance_storage_details(instances): 520 | """Add information about instance storage features.""" 521 | 522 | url = "http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html" 523 | tree = etree.parse(urllib2.urlopen(url), etree.HTMLParser()) 524 | table = tree.xpath('//div[@class="informaltable-contents"]/table')[0] 525 | rows = table.xpath('.//tr[./td]') 526 | 527 | checkmark_char = u'\u2714' 528 | dagger_char = u'\u2020' 529 | 530 | for r in rows: 531 | columns = r.xpath('.//td') 532 | 533 | (instance_type, 534 | storage_volumes, 535 | storage_type, 536 | needs_initialization, 537 | trim_support) = tuple(totext(i) for i in columns) 538 | 539 | if instance_type is None: 540 | continue 541 | 542 | for i in instances: 543 | if i.instance_type == instance_type: 544 | i.ebs_only = True 545 | 546 | m = re.search(r'(\d+)\s*x\s*([0-9,]+)?', storage_volumes) 547 | if m: 548 | i.ebs_only = False 549 | i.num_drives = locale.atoi(m.group(1)) 550 | i.drive_size = locale.atoi(m.group(2)) 551 | i.ssd = 'SSD' in storage_type 552 | i.nvme_ssd = 'NVMe' in storage_type 553 | i.trim_support = checkmark_char in trim_support 554 | i.storage_needs_initialization = checkmark_char in needs_initialization 555 | i.includes_swap_partition = dagger_char in storage_volumes 556 | 557 | def add_t2_credits(instances): 558 | tree = etree.parse(urllib2.urlopen("http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/t2-instances.html"), 559 | etree.HTMLParser()) 560 | table = tree.xpath('//div[@class="informaltable"]//table')[0] 561 | rows = table.xpath('.//tr[./td]') 562 | assert len(rows) > 0, "Failed to find T2 CPU credit info" 563 | 564 | by_type = {i.instance_type: i for i in instances} 565 | 566 | for r in rows: 567 | if len(r) > 1: 568 | inst = by_type[totext(r[0])] 569 | creds_per_hour = locale.atof(totext(r[2])) 570 | inst.base_performance = creds_per_hour / 60 571 | inst.burst_minutes = creds_per_hour * 24 / inst.vCPU 572 | 573 | 574 | def add_pretty_names(instances): 575 | family_names = { 576 | 'r3': 'R3 High-Memory', 577 | 'r4': 'R4 High-Memory', 578 | 'c3': 'C3 High-CPU', 579 | 'c4': 'C4 High-CPU', 580 | 'm3': 'M3 General Purpose', 581 | 'i3': 'I3 High I/O', 582 | 'cg1': 'Cluster GPU', 583 | 'cc2': 'Cluster Compute', 584 | 'cr1': 'High Memory Cluster', 585 | 'hs1': 'High Storage', 586 | 'c1' : 'C1 High-CPU', 587 | 'hi1': 'HI1. High I/O', 588 | 'm2' : 'M2 High Memory', 589 | 'm1' : 'M1 General Purpose', 590 | 'p2' : 'General Purpose GPU', 591 | 'x1' : 'X1 Extra High-Memory' 592 | } 593 | for i in instances: 594 | pieces = i.instance_type.split('.') 595 | family = pieces[0] 596 | short = pieces[1] 597 | prefix = family_names.get(family, family.upper()) 598 | extra = None 599 | if short.startswith('8x'): 600 | extra = 'Eight' 601 | elif short.startswith('4x'): 602 | extra = 'Quadruple' 603 | elif short.startswith('2x'): 604 | extra = 'Double' 605 | elif short.startswith('10x'): 606 | extra = 'Deca' 607 | elif short.startswith('x'): 608 | extra = '' 609 | bits = [prefix] 610 | if extra is not None: 611 | bits.extend([extra, 'Extra']) 612 | short = 'Large' 613 | 614 | bits.append(short.capitalize()) 615 | 616 | i.pretty_name = ' '.join([b for b in bits if b]) 617 | 618 | 619 | def scrape(data_file): 620 | """Scrape AWS to get instance data""" 621 | print "Parsing instance types..." 622 | all_instances = scrape_instances() 623 | print "Parsing pricing info..." 624 | add_pricing_info(all_instances) 625 | print "Parsing ENI info..." 626 | add_eni_info(all_instances) 627 | print "Parsing EBS info..." 628 | add_ebs_info(all_instances) 629 | print "Parsing Linux AMI info..." 630 | add_linux_ami_info(all_instances) 631 | print "Parsing VPC-only info..." 632 | add_vpconly_detail(all_instances) 633 | print "Parsing local instance storage..." 634 | add_instance_storage_details(all_instances) 635 | print "Parsing burstable instance credits..." 636 | add_t2_credits(all_instances) 637 | print "Parsing instance names..." 638 | add_pretty_names(all_instances) 639 | 640 | with open(data_file, 'w') as f: 641 | json.dump([i.to_dict() for i in all_instances], 642 | f, 643 | indent=2, 644 | sort_keys=True, 645 | separators=(',', ': ')) 646 | 647 | 648 | if __name__ == '__main__': 649 | scrape('data/AWSinstances.json') 650 | -------------------------------------------------------------------------------- /www/bootstrap/css/bootstrap-responsive.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Responsive v2.2.1 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */ 10 | 11 | .clearfix { 12 | *zoom: 1; 13 | } 14 | 15 | .clearfix:before, 16 | .clearfix:after { 17 | display: table; 18 | line-height: 0; 19 | content: ""; 20 | } 21 | 22 | .clearfix:after { 23 | clear: both; 24 | } 25 | 26 | .hide-text { 27 | font: 0/0 a; 28 | color: transparent; 29 | text-shadow: none; 30 | background-color: transparent; 31 | border: 0; 32 | } 33 | 34 | .input-block-level { 35 | display: block; 36 | width: 100%; 37 | min-height: 30px; 38 | -webkit-box-sizing: border-box; 39 | -moz-box-sizing: border-box; 40 | box-sizing: border-box; 41 | } 42 | 43 | .hidden { 44 | display: none; 45 | visibility: hidden; 46 | } 47 | 48 | .visible-phone { 49 | display: none !important; 50 | } 51 | 52 | .visible-tablet { 53 | display: none !important; 54 | } 55 | 56 | .hidden-desktop { 57 | display: none !important; 58 | } 59 | 60 | .visible-desktop { 61 | display: inherit !important; 62 | } 63 | 64 | @media (min-width: 768px) and (max-width: 979px) { 65 | .hidden-desktop { 66 | display: inherit !important; 67 | } 68 | .visible-desktop { 69 | display: none !important ; 70 | } 71 | .visible-tablet { 72 | display: inherit !important; 73 | } 74 | .hidden-tablet { 75 | display: none !important; 76 | } 77 | } 78 | 79 | @media (max-width: 767px) { 80 | .hidden-desktop { 81 | display: inherit !important; 82 | } 83 | .visible-desktop { 84 | display: none !important; 85 | } 86 | .visible-phone { 87 | display: inherit !important; 88 | } 89 | .hidden-phone { 90 | display: none !important; 91 | } 92 | } 93 | 94 | @media (min-width: 1200px) { 95 | .row { 96 | margin-left: -30px; 97 | *zoom: 1; 98 | } 99 | .row:before, 100 | .row:after { 101 | display: table; 102 | line-height: 0; 103 | content: ""; 104 | } 105 | .row:after { 106 | clear: both; 107 | } 108 | [class*="span"] { 109 | float: left; 110 | min-height: 1px; 111 | margin-left: 30px; 112 | } 113 | .container, 114 | .navbar-static-top .container, 115 | .navbar-fixed-top .container, 116 | .navbar-fixed-bottom .container { 117 | width: 1170px; 118 | } 119 | .span12 { 120 | width: 1170px; 121 | } 122 | .span11 { 123 | width: 1070px; 124 | } 125 | .span10 { 126 | width: 970px; 127 | } 128 | .span9 { 129 | width: 870px; 130 | } 131 | .span8 { 132 | width: 770px; 133 | } 134 | .span7 { 135 | width: 670px; 136 | } 137 | .span6 { 138 | width: 570px; 139 | } 140 | .span5 { 141 | width: 470px; 142 | } 143 | .span4 { 144 | width: 370px; 145 | } 146 | .span3 { 147 | width: 270px; 148 | } 149 | .span2 { 150 | width: 170px; 151 | } 152 | .span1 { 153 | width: 70px; 154 | } 155 | .offset12 { 156 | margin-left: 1230px; 157 | } 158 | .offset11 { 159 | margin-left: 1130px; 160 | } 161 | .offset10 { 162 | margin-left: 1030px; 163 | } 164 | .offset9 { 165 | margin-left: 930px; 166 | } 167 | .offset8 { 168 | margin-left: 830px; 169 | } 170 | .offset7 { 171 | margin-left: 730px; 172 | } 173 | .offset6 { 174 | margin-left: 630px; 175 | } 176 | .offset5 { 177 | margin-left: 530px; 178 | } 179 | .offset4 { 180 | margin-left: 430px; 181 | } 182 | .offset3 { 183 | margin-left: 330px; 184 | } 185 | .offset2 { 186 | margin-left: 230px; 187 | } 188 | .offset1 { 189 | margin-left: 130px; 190 | } 191 | .row-fluid { 192 | width: 100%; 193 | *zoom: 1; 194 | } 195 | .row-fluid:before, 196 | .row-fluid:after { 197 | display: table; 198 | line-height: 0; 199 | content: ""; 200 | } 201 | .row-fluid:after { 202 | clear: both; 203 | } 204 | .row-fluid [class*="span"] { 205 | display: block; 206 | float: left; 207 | width: 100%; 208 | min-height: 30px; 209 | margin-left: 2.564102564102564%; 210 | *margin-left: 2.5109110747408616%; 211 | -webkit-box-sizing: border-box; 212 | -moz-box-sizing: border-box; 213 | box-sizing: border-box; 214 | } 215 | .row-fluid [class*="span"]:first-child { 216 | margin-left: 0; 217 | } 218 | .row-fluid .controls-row [class*="span"] + [class*="span"] { 219 | margin-left: 2.564102564102564%; 220 | } 221 | .row-fluid .span12 { 222 | width: 100%; 223 | *width: 99.94680851063829%; 224 | } 225 | .row-fluid .span11 { 226 | width: 91.45299145299145%; 227 | *width: 91.39979996362975%; 228 | } 229 | .row-fluid .span10 { 230 | width: 82.90598290598291%; 231 | *width: 82.8527914166212%; 232 | } 233 | .row-fluid .span9 { 234 | width: 74.35897435897436%; 235 | *width: 74.30578286961266%; 236 | } 237 | .row-fluid .span8 { 238 | width: 65.81196581196582%; 239 | *width: 65.75877432260411%; 240 | } 241 | .row-fluid .span7 { 242 | width: 57.26495726495726%; 243 | *width: 57.21176577559556%; 244 | } 245 | .row-fluid .span6 { 246 | width: 48.717948717948715%; 247 | *width: 48.664757228587014%; 248 | } 249 | .row-fluid .span5 { 250 | width: 40.17094017094017%; 251 | *width: 40.11774868157847%; 252 | } 253 | .row-fluid .span4 { 254 | width: 31.623931623931625%; 255 | *width: 31.570740134569924%; 256 | } 257 | .row-fluid .span3 { 258 | width: 23.076923076923077%; 259 | *width: 23.023731587561375%; 260 | } 261 | .row-fluid .span2 { 262 | width: 14.52991452991453%; 263 | *width: 14.476723040552828%; 264 | } 265 | .row-fluid .span1 { 266 | width: 5.982905982905983%; 267 | *width: 5.929714493544281%; 268 | } 269 | .row-fluid .offset12 { 270 | margin-left: 105.12820512820512%; 271 | *margin-left: 105.02182214948171%; 272 | } 273 | .row-fluid .offset12:first-child { 274 | margin-left: 102.56410256410257%; 275 | *margin-left: 102.45771958537915%; 276 | } 277 | .row-fluid .offset11 { 278 | margin-left: 96.58119658119658%; 279 | *margin-left: 96.47481360247316%; 280 | } 281 | .row-fluid .offset11:first-child { 282 | margin-left: 94.01709401709402%; 283 | *margin-left: 93.91071103837061%; 284 | } 285 | .row-fluid .offset10 { 286 | margin-left: 88.03418803418803%; 287 | *margin-left: 87.92780505546462%; 288 | } 289 | .row-fluid .offset10:first-child { 290 | margin-left: 85.47008547008548%; 291 | *margin-left: 85.36370249136206%; 292 | } 293 | .row-fluid .offset9 { 294 | margin-left: 79.48717948717949%; 295 | *margin-left: 79.38079650845607%; 296 | } 297 | .row-fluid .offset9:first-child { 298 | margin-left: 76.92307692307693%; 299 | *margin-left: 76.81669394435352%; 300 | } 301 | .row-fluid .offset8 { 302 | margin-left: 70.94017094017094%; 303 | *margin-left: 70.83378796144753%; 304 | } 305 | .row-fluid .offset8:first-child { 306 | margin-left: 68.37606837606839%; 307 | *margin-left: 68.26968539734497%; 308 | } 309 | .row-fluid .offset7 { 310 | margin-left: 62.393162393162385%; 311 | *margin-left: 62.28677941443899%; 312 | } 313 | .row-fluid .offset7:first-child { 314 | margin-left: 59.82905982905982%; 315 | *margin-left: 59.72267685033642%; 316 | } 317 | .row-fluid .offset6 { 318 | margin-left: 53.84615384615384%; 319 | *margin-left: 53.739770867430444%; 320 | } 321 | .row-fluid .offset6:first-child { 322 | margin-left: 51.28205128205128%; 323 | *margin-left: 51.175668303327875%; 324 | } 325 | .row-fluid .offset5 { 326 | margin-left: 45.299145299145295%; 327 | *margin-left: 45.1927623204219%; 328 | } 329 | .row-fluid .offset5:first-child { 330 | margin-left: 42.73504273504273%; 331 | *margin-left: 42.62865975631933%; 332 | } 333 | .row-fluid .offset4 { 334 | margin-left: 36.75213675213675%; 335 | *margin-left: 36.645753773413354%; 336 | } 337 | .row-fluid .offset4:first-child { 338 | margin-left: 34.18803418803419%; 339 | *margin-left: 34.081651209310785%; 340 | } 341 | .row-fluid .offset3 { 342 | margin-left: 28.205128205128204%; 343 | *margin-left: 28.0987452264048%; 344 | } 345 | .row-fluid .offset3:first-child { 346 | margin-left: 25.641025641025642%; 347 | *margin-left: 25.53464266230224%; 348 | } 349 | .row-fluid .offset2 { 350 | margin-left: 19.65811965811966%; 351 | *margin-left: 19.551736679396257%; 352 | } 353 | .row-fluid .offset2:first-child { 354 | margin-left: 17.094017094017094%; 355 | *margin-left: 16.98763411529369%; 356 | } 357 | .row-fluid .offset1 { 358 | margin-left: 11.11111111111111%; 359 | *margin-left: 11.004728132387708%; 360 | } 361 | .row-fluid .offset1:first-child { 362 | margin-left: 8.547008547008547%; 363 | *margin-left: 8.440625568285142%; 364 | } 365 | input, 366 | textarea, 367 | .uneditable-input { 368 | margin-left: 0; 369 | } 370 | .controls-row [class*="span"] + [class*="span"] { 371 | margin-left: 30px; 372 | } 373 | input.span12, 374 | textarea.span12, 375 | .uneditable-input.span12 { 376 | width: 1156px; 377 | } 378 | input.span11, 379 | textarea.span11, 380 | .uneditable-input.span11 { 381 | width: 1056px; 382 | } 383 | input.span10, 384 | textarea.span10, 385 | .uneditable-input.span10 { 386 | width: 956px; 387 | } 388 | input.span9, 389 | textarea.span9, 390 | .uneditable-input.span9 { 391 | width: 856px; 392 | } 393 | input.span8, 394 | textarea.span8, 395 | .uneditable-input.span8 { 396 | width: 756px; 397 | } 398 | input.span7, 399 | textarea.span7, 400 | .uneditable-input.span7 { 401 | width: 656px; 402 | } 403 | input.span6, 404 | textarea.span6, 405 | .uneditable-input.span6 { 406 | width: 556px; 407 | } 408 | input.span5, 409 | textarea.span5, 410 | .uneditable-input.span5 { 411 | width: 456px; 412 | } 413 | input.span4, 414 | textarea.span4, 415 | .uneditable-input.span4 { 416 | width: 356px; 417 | } 418 | input.span3, 419 | textarea.span3, 420 | .uneditable-input.span3 { 421 | width: 256px; 422 | } 423 | input.span2, 424 | textarea.span2, 425 | .uneditable-input.span2 { 426 | width: 156px; 427 | } 428 | input.span1, 429 | textarea.span1, 430 | .uneditable-input.span1 { 431 | width: 56px; 432 | } 433 | .thumbnails { 434 | margin-left: -30px; 435 | } 436 | .thumbnails > li { 437 | margin-left: 30px; 438 | } 439 | .row-fluid .thumbnails { 440 | margin-left: 0; 441 | } 442 | } 443 | 444 | @media (min-width: 768px) and (max-width: 979px) { 445 | .row { 446 | margin-left: -20px; 447 | *zoom: 1; 448 | } 449 | .row:before, 450 | .row:after { 451 | display: table; 452 | line-height: 0; 453 | content: ""; 454 | } 455 | .row:after { 456 | clear: both; 457 | } 458 | [class*="span"] { 459 | float: left; 460 | min-height: 1px; 461 | margin-left: 20px; 462 | } 463 | .container, 464 | .navbar-static-top .container, 465 | .navbar-fixed-top .container, 466 | .navbar-fixed-bottom .container { 467 | width: 724px; 468 | } 469 | .span12 { 470 | width: 724px; 471 | } 472 | .span11 { 473 | width: 662px; 474 | } 475 | .span10 { 476 | width: 600px; 477 | } 478 | .span9 { 479 | width: 538px; 480 | } 481 | .span8 { 482 | width: 476px; 483 | } 484 | .span7 { 485 | width: 414px; 486 | } 487 | .span6 { 488 | width: 352px; 489 | } 490 | .span5 { 491 | width: 290px; 492 | } 493 | .span4 { 494 | width: 228px; 495 | } 496 | .span3 { 497 | width: 166px; 498 | } 499 | .span2 { 500 | width: 104px; 501 | } 502 | .span1 { 503 | width: 42px; 504 | } 505 | .offset12 { 506 | margin-left: 764px; 507 | } 508 | .offset11 { 509 | margin-left: 702px; 510 | } 511 | .offset10 { 512 | margin-left: 640px; 513 | } 514 | .offset9 { 515 | margin-left: 578px; 516 | } 517 | .offset8 { 518 | margin-left: 516px; 519 | } 520 | .offset7 { 521 | margin-left: 454px; 522 | } 523 | .offset6 { 524 | margin-left: 392px; 525 | } 526 | .offset5 { 527 | margin-left: 330px; 528 | } 529 | .offset4 { 530 | margin-left: 268px; 531 | } 532 | .offset3 { 533 | margin-left: 206px; 534 | } 535 | .offset2 { 536 | margin-left: 144px; 537 | } 538 | .offset1 { 539 | margin-left: 82px; 540 | } 541 | .row-fluid { 542 | width: 100%; 543 | *zoom: 1; 544 | } 545 | .row-fluid:before, 546 | .row-fluid:after { 547 | display: table; 548 | line-height: 0; 549 | content: ""; 550 | } 551 | .row-fluid:after { 552 | clear: both; 553 | } 554 | .row-fluid [class*="span"] { 555 | display: block; 556 | float: left; 557 | width: 100%; 558 | min-height: 30px; 559 | margin-left: 2.7624309392265194%; 560 | *margin-left: 2.709239449864817%; 561 | -webkit-box-sizing: border-box; 562 | -moz-box-sizing: border-box; 563 | box-sizing: border-box; 564 | } 565 | .row-fluid [class*="span"]:first-child { 566 | margin-left: 0; 567 | } 568 | .row-fluid .controls-row [class*="span"] + [class*="span"] { 569 | margin-left: 2.7624309392265194%; 570 | } 571 | .row-fluid .span12 { 572 | width: 100%; 573 | *width: 99.94680851063829%; 574 | } 575 | .row-fluid .span11 { 576 | width: 91.43646408839778%; 577 | *width: 91.38327259903608%; 578 | } 579 | .row-fluid .span10 { 580 | width: 82.87292817679558%; 581 | *width: 82.81973668743387%; 582 | } 583 | .row-fluid .span9 { 584 | width: 74.30939226519337%; 585 | *width: 74.25620077583166%; 586 | } 587 | .row-fluid .span8 { 588 | width: 65.74585635359117%; 589 | *width: 65.69266486422946%; 590 | } 591 | .row-fluid .span7 { 592 | width: 57.18232044198895%; 593 | *width: 57.12912895262725%; 594 | } 595 | .row-fluid .span6 { 596 | width: 48.61878453038674%; 597 | *width: 48.56559304102504%; 598 | } 599 | .row-fluid .span5 { 600 | width: 40.05524861878453%; 601 | *width: 40.00205712942283%; 602 | } 603 | .row-fluid .span4 { 604 | width: 31.491712707182323%; 605 | *width: 31.43852121782062%; 606 | } 607 | .row-fluid .span3 { 608 | width: 22.92817679558011%; 609 | *width: 22.87498530621841%; 610 | } 611 | .row-fluid .span2 { 612 | width: 14.3646408839779%; 613 | *width: 14.311449394616199%; 614 | } 615 | .row-fluid .span1 { 616 | width: 5.801104972375691%; 617 | *width: 5.747913483013988%; 618 | } 619 | .row-fluid .offset12 { 620 | margin-left: 105.52486187845304%; 621 | *margin-left: 105.41847889972962%; 622 | } 623 | .row-fluid .offset12:first-child { 624 | margin-left: 102.76243093922652%; 625 | *margin-left: 102.6560479605031%; 626 | } 627 | .row-fluid .offset11 { 628 | margin-left: 96.96132596685082%; 629 | *margin-left: 96.8549429881274%; 630 | } 631 | .row-fluid .offset11:first-child { 632 | margin-left: 94.1988950276243%; 633 | *margin-left: 94.09251204890089%; 634 | } 635 | .row-fluid .offset10 { 636 | margin-left: 88.39779005524862%; 637 | *margin-left: 88.2914070765252%; 638 | } 639 | .row-fluid .offset10:first-child { 640 | margin-left: 85.6353591160221%; 641 | *margin-left: 85.52897613729868%; 642 | } 643 | .row-fluid .offset9 { 644 | margin-left: 79.8342541436464%; 645 | *margin-left: 79.72787116492299%; 646 | } 647 | .row-fluid .offset9:first-child { 648 | margin-left: 77.07182320441989%; 649 | *margin-left: 76.96544022569647%; 650 | } 651 | .row-fluid .offset8 { 652 | margin-left: 71.2707182320442%; 653 | *margin-left: 71.16433525332079%; 654 | } 655 | .row-fluid .offset8:first-child { 656 | margin-left: 68.50828729281768%; 657 | *margin-left: 68.40190431409427%; 658 | } 659 | .row-fluid .offset7 { 660 | margin-left: 62.70718232044199%; 661 | *margin-left: 62.600799341718584%; 662 | } 663 | .row-fluid .offset7:first-child { 664 | margin-left: 59.94475138121547%; 665 | *margin-left: 59.838368402492065%; 666 | } 667 | .row-fluid .offset6 { 668 | margin-left: 54.14364640883978%; 669 | *margin-left: 54.037263430116376%; 670 | } 671 | .row-fluid .offset6:first-child { 672 | margin-left: 51.38121546961326%; 673 | *margin-left: 51.27483249088986%; 674 | } 675 | .row-fluid .offset5 { 676 | margin-left: 45.58011049723757%; 677 | *margin-left: 45.47372751851417%; 678 | } 679 | .row-fluid .offset5:first-child { 680 | margin-left: 42.81767955801105%; 681 | *margin-left: 42.71129657928765%; 682 | } 683 | .row-fluid .offset4 { 684 | margin-left: 37.01657458563536%; 685 | *margin-left: 36.91019160691196%; 686 | } 687 | .row-fluid .offset4:first-child { 688 | margin-left: 34.25414364640884%; 689 | *margin-left: 34.14776066768544%; 690 | } 691 | .row-fluid .offset3 { 692 | margin-left: 28.45303867403315%; 693 | *margin-left: 28.346655695309746%; 694 | } 695 | .row-fluid .offset3:first-child { 696 | margin-left: 25.69060773480663%; 697 | *margin-left: 25.584224756083227%; 698 | } 699 | .row-fluid .offset2 { 700 | margin-left: 19.88950276243094%; 701 | *margin-left: 19.783119783707537%; 702 | } 703 | .row-fluid .offset2:first-child { 704 | margin-left: 17.12707182320442%; 705 | *margin-left: 17.02068884448102%; 706 | } 707 | .row-fluid .offset1 { 708 | margin-left: 11.32596685082873%; 709 | *margin-left: 11.219583872105325%; 710 | } 711 | .row-fluid .offset1:first-child { 712 | margin-left: 8.56353591160221%; 713 | *margin-left: 8.457152932878806%; 714 | } 715 | input, 716 | textarea, 717 | .uneditable-input { 718 | margin-left: 0; 719 | } 720 | .controls-row [class*="span"] + [class*="span"] { 721 | margin-left: 20px; 722 | } 723 | input.span12, 724 | textarea.span12, 725 | .uneditable-input.span12 { 726 | width: 710px; 727 | } 728 | input.span11, 729 | textarea.span11, 730 | .uneditable-input.span11 { 731 | width: 648px; 732 | } 733 | input.span10, 734 | textarea.span10, 735 | .uneditable-input.span10 { 736 | width: 586px; 737 | } 738 | input.span9, 739 | textarea.span9, 740 | .uneditable-input.span9 { 741 | width: 524px; 742 | } 743 | input.span8, 744 | textarea.span8, 745 | .uneditable-input.span8 { 746 | width: 462px; 747 | } 748 | input.span7, 749 | textarea.span7, 750 | .uneditable-input.span7 { 751 | width: 400px; 752 | } 753 | input.span6, 754 | textarea.span6, 755 | .uneditable-input.span6 { 756 | width: 338px; 757 | } 758 | input.span5, 759 | textarea.span5, 760 | .uneditable-input.span5 { 761 | width: 276px; 762 | } 763 | input.span4, 764 | textarea.span4, 765 | .uneditable-input.span4 { 766 | width: 214px; 767 | } 768 | input.span3, 769 | textarea.span3, 770 | .uneditable-input.span3 { 771 | width: 152px; 772 | } 773 | input.span2, 774 | textarea.span2, 775 | .uneditable-input.span2 { 776 | width: 90px; 777 | } 778 | input.span1, 779 | textarea.span1, 780 | .uneditable-input.span1 { 781 | width: 28px; 782 | } 783 | } 784 | 785 | @media (max-width: 767px) { 786 | body { 787 | padding-right: 20px; 788 | padding-left: 20px; 789 | } 790 | .navbar-fixed-top, 791 | .navbar-fixed-bottom, 792 | .navbar-static-top { 793 | margin-right: -20px; 794 | margin-left: -20px; 795 | } 796 | .container-fluid { 797 | padding: 0; 798 | } 799 | .dl-horizontal dt { 800 | float: none; 801 | width: auto; 802 | clear: none; 803 | text-align: left; 804 | } 805 | .dl-horizontal dd { 806 | margin-left: 0; 807 | } 808 | .container { 809 | width: auto; 810 | } 811 | .row-fluid { 812 | width: 100%; 813 | } 814 | .row, 815 | .thumbnails { 816 | margin-left: 0; 817 | } 818 | .thumbnails > li { 819 | float: none; 820 | margin-left: 0; 821 | } 822 | [class*="span"], 823 | .uneditable-input[class*="span"], 824 | .row-fluid [class*="span"] { 825 | display: block; 826 | float: none; 827 | width: 100%; 828 | margin-left: 0; 829 | -webkit-box-sizing: border-box; 830 | -moz-box-sizing: border-box; 831 | box-sizing: border-box; 832 | } 833 | .span12, 834 | .row-fluid .span12 { 835 | width: 100%; 836 | -webkit-box-sizing: border-box; 837 | -moz-box-sizing: border-box; 838 | box-sizing: border-box; 839 | } 840 | .row-fluid [class*="offset"]:first-child { 841 | margin-left: 0; 842 | } 843 | .input-large, 844 | .input-xlarge, 845 | .input-xxlarge, 846 | input[class*="span"], 847 | select[class*="span"], 848 | textarea[class*="span"], 849 | .uneditable-input { 850 | display: block; 851 | width: 100%; 852 | min-height: 30px; 853 | -webkit-box-sizing: border-box; 854 | -moz-box-sizing: border-box; 855 | box-sizing: border-box; 856 | } 857 | .input-prepend input, 858 | .input-append input, 859 | .input-prepend input[class*="span"], 860 | .input-append input[class*="span"] { 861 | display: inline-block; 862 | width: auto; 863 | } 864 | .controls-row [class*="span"] + [class*="span"] { 865 | margin-left: 0; 866 | } 867 | .modal { 868 | position: fixed; 869 | top: 20px; 870 | right: 20px; 871 | left: 20px; 872 | width: auto; 873 | margin: 0; 874 | } 875 | .modal.fade { 876 | top: -100px; 877 | } 878 | .modal.fade.in { 879 | top: 20px; 880 | } 881 | } 882 | 883 | @media (max-width: 480px) { 884 | .nav-collapse { 885 | -webkit-transform: translate3d(0, 0, 0); 886 | } 887 | .page-header h1 small { 888 | display: block; 889 | line-height: 20px; 890 | } 891 | input[type="checkbox"], 892 | input[type="radio"] { 893 | border: 1px solid #ccc; 894 | } 895 | .form-horizontal .control-label { 896 | float: none; 897 | width: auto; 898 | padding-top: 0; 899 | text-align: left; 900 | } 901 | .form-horizontal .controls { 902 | margin-left: 0; 903 | } 904 | .form-horizontal .control-list { 905 | padding-top: 0; 906 | } 907 | .form-horizontal .form-actions { 908 | padding-right: 10px; 909 | padding-left: 10px; 910 | } 911 | .media .pull-left, 912 | .media .pull-right { 913 | display: block; 914 | float: none; 915 | margin-bottom: 10px; 916 | } 917 | .media-object { 918 | margin-right: 0; 919 | margin-left: 0; 920 | } 921 | .modal { 922 | top: 10px; 923 | right: 10px; 924 | left: 10px; 925 | } 926 | .modal-header .close { 927 | padding: 10px; 928 | margin: -10px; 929 | } 930 | .carousel-caption { 931 | position: static; 932 | } 933 | } 934 | 935 | @media (max-width: 979px) { 936 | body { 937 | padding-top: 0; 938 | } 939 | .navbar-fixed-top, 940 | .navbar-fixed-bottom { 941 | position: static; 942 | } 943 | .navbar-fixed-top { 944 | margin-bottom: 20px; 945 | } 946 | .navbar-fixed-bottom { 947 | margin-top: 20px; 948 | } 949 | .navbar-fixed-top .navbar-inner, 950 | .navbar-fixed-bottom .navbar-inner { 951 | padding: 5px; 952 | } 953 | .navbar .container { 954 | width: auto; 955 | padding: 0; 956 | } 957 | .navbar .brand { 958 | padding-right: 10px; 959 | padding-left: 10px; 960 | margin: 0 0 0 -5px; 961 | } 962 | .nav-collapse { 963 | clear: both; 964 | } 965 | .nav-collapse .nav { 966 | float: none; 967 | margin: 0 0 10px; 968 | } 969 | .nav-collapse .nav > li { 970 | float: none; 971 | } 972 | .nav-collapse .nav > li > a { 973 | margin-bottom: 2px; 974 | } 975 | .nav-collapse .nav > .divider-vertical { 976 | display: none; 977 | } 978 | .nav-collapse .nav .nav-header { 979 | color: #777777; 980 | text-shadow: none; 981 | } 982 | .nav-collapse .nav > li > a, 983 | .nav-collapse .dropdown-menu a { 984 | padding: 9px 15px; 985 | font-weight: bold; 986 | color: #777777; 987 | -webkit-border-radius: 3px; 988 | -moz-border-radius: 3px; 989 | border-radius: 3px; 990 | } 991 | .nav-collapse .btn { 992 | padding: 4px 10px 4px; 993 | font-weight: normal; 994 | -webkit-border-radius: 4px; 995 | -moz-border-radius: 4px; 996 | border-radius: 4px; 997 | } 998 | .nav-collapse .dropdown-menu li + li a { 999 | margin-bottom: 2px; 1000 | } 1001 | .nav-collapse .nav > li > a:hover, 1002 | .nav-collapse .dropdown-menu a:hover { 1003 | background-color: #f2f2f2; 1004 | } 1005 | .navbar-inverse .nav-collapse .nav > li > a, 1006 | .navbar-inverse .nav-collapse .dropdown-menu a { 1007 | color: #999999; 1008 | } 1009 | .navbar-inverse .nav-collapse .nav > li > a:hover, 1010 | .navbar-inverse .nav-collapse .dropdown-menu a:hover { 1011 | background-color: #111111; 1012 | } 1013 | .nav-collapse.in .btn-group { 1014 | padding: 0; 1015 | margin-top: 5px; 1016 | } 1017 | .nav-collapse .dropdown-menu { 1018 | position: static; 1019 | top: auto; 1020 | left: auto; 1021 | display: none; 1022 | float: none; 1023 | max-width: none; 1024 | padding: 0; 1025 | margin: 0 15px; 1026 | background-color: transparent; 1027 | border: none; 1028 | -webkit-border-radius: 0; 1029 | -moz-border-radius: 0; 1030 | border-radius: 0; 1031 | -webkit-box-shadow: none; 1032 | -moz-box-shadow: none; 1033 | box-shadow: none; 1034 | } 1035 | .nav-collapse .open > .dropdown-menu { 1036 | display: block; 1037 | } 1038 | .nav-collapse .dropdown-menu:before, 1039 | .nav-collapse .dropdown-menu:after { 1040 | display: none; 1041 | } 1042 | .nav-collapse .dropdown-menu .divider { 1043 | display: none; 1044 | } 1045 | .nav-collapse .nav > li > .dropdown-menu:before, 1046 | .nav-collapse .nav > li > .dropdown-menu:after { 1047 | display: none; 1048 | } 1049 | .nav-collapse .navbar-form, 1050 | .nav-collapse .navbar-search { 1051 | float: none; 1052 | padding: 10px 15px; 1053 | margin: 10px 0; 1054 | border-top: 1px solid #f2f2f2; 1055 | border-bottom: 1px solid #f2f2f2; 1056 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); 1057 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); 1058 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); 1059 | } 1060 | .navbar-inverse .nav-collapse .navbar-form, 1061 | .navbar-inverse .nav-collapse .navbar-search { 1062 | border-top-color: #111111; 1063 | border-bottom-color: #111111; 1064 | } 1065 | .navbar .nav-collapse .nav.pull-right { 1066 | float: none; 1067 | margin-left: 0; 1068 | } 1069 | .nav-collapse, 1070 | .nav-collapse.collapse { 1071 | height: 0; 1072 | overflow: hidden; 1073 | } 1074 | .navbar .btn-navbar { 1075 | display: block; 1076 | } 1077 | .navbar-static .navbar-inner { 1078 | padding-right: 10px; 1079 | padding-left: 10px; 1080 | } 1081 | } 1082 | 1083 | @media (min-width: 980px) { 1084 | .nav-collapse.collapse { 1085 | height: auto !important; 1086 | overflow: visible !important; 1087 | } 1088 | } 1089 | --------------------------------------------------------------------------------