You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@chukwa.apache.org by ey...@apache.org on 2015/05/26 02:12:54 UTC
[19/19] chukwa git commit: CHUKWA-746. Redesigned Chukwa dashboard.
(Eric Yang)
CHUKWA-746. Redesigned Chukwa dashboard. (Eric Yang)
Project: http://git-wip-us.apache.org/repos/asf/chukwa/repo
Commit: http://git-wip-us.apache.org/repos/asf/chukwa/commit/dfe84a2c
Tree: http://git-wip-us.apache.org/repos/asf/chukwa/tree/dfe84a2c
Diff: http://git-wip-us.apache.org/repos/asf/chukwa/diff/dfe84a2c
Branch: refs/heads/master
Commit: dfe84a2c3721521a1007d33e8f7daa15ea99aef2
Parents: 0f9b5cf
Author: Eric Yang <ey...@apache.org>
Authored: Mon May 25 17:12:10 2015 -0700
Committer: Eric Yang <ey...@apache.org>
Committed: Mon May 25 17:12:10 2015 -0700
----------------------------------------------------------------------
CHANGES.txt | 2 +
NOTICE.txt | 18 +
conf/shiro.ini | 46 +
pom.xml | 33 +-
.../adaptor/sigar/SigarRunner.java | 14 +-
.../datacollection/writer/hbase/Reporter.java | 4 +-
.../chukwa/datastore/ChukwaHBaseStore.java | 91 +-
.../apache/hadoop/chukwa/hicc/TimeHandler.java | 2 +
.../hadoop/chukwa/hicc/bean/BarOptions.java | 31 +
.../hadoop/chukwa/hicc/bean/Dashboard.java | 31 +
.../chukwa/hicc/bean/SessionAttribute.java | 36 +
.../apache/hadoop/chukwa/hicc/bean/Widget.java | 52 +-
.../chukwa/hicc/rest/DashboardController.java | 72 +
.../chukwa/hicc/rest/HeatmapController.java | 3 +-
.../chukwa/hicc/rest/SessionController.java | 71 +
.../chukwa/hicc/rest/WidgetController.java | 1 -
.../apache/hadoop/chukwa/util/HBaseUtil.java | 14 +-
src/main/web/hicc/WEB-INF/jetty.xml | 4 +-
src/main/web/hicc/WEB-INF/vm/chart.vm | 9 +-
src/main/web/hicc/WEB-INF/web.xml | 24 +-
src/main/web/hicc/css/bootstrap-theme.css.map | 1 +
src/main/web/hicc/css/bootstrap-theme.min.css | 5 +
src/main/web/hicc/css/bootstrap.min.css | 5 +
src/main/web/hicc/css/iframe.css | 3 +-
src/main/web/hicc/css/images/bg.jpg | Bin 0 -> 206819 bytes
src/main/web/hicc/css/login.css | 88 +
.../hicc/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes
.../hicc/fonts/glyphicons-halflings-regular.svg | 288 ++
.../hicc/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes
.../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes
.../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes
src/main/web/hicc/graph-explorer.html | 328 --
src/main/web/hicc/home/css/component.css | 620 +++
src/main/web/hicc/home/css/jquery.gridster.css | 350 ++
.../web/hicc/home/css/jquery.gridster.min.css | 2 +
src/main/web/hicc/home/css/normalize.css | 18 +
.../home/fonts/codropsicons/codropsicons.eot | Bin 0 -> 2244 bytes
.../home/fonts/codropsicons/codropsicons.svg | 24 +
.../home/fonts/codropsicons/codropsicons.ttf | Bin 0 -> 2060 bytes
.../home/fonts/codropsicons/codropsicons.woff | Bin 0 -> 2072 bytes
.../hicc/home/fonts/codropsicons/license.txt | 6 +
.../web/hicc/home/fonts/ecoicons/Read Me.txt | 3 +
.../hicc/home/fonts/ecoicons/ecoicons.dev.svg | 70 +
.../web/hicc/home/fonts/ecoicons/ecoicons.eot | Bin 0 -> 3576 bytes
.../web/hicc/home/fonts/ecoicons/ecoicons.svg | 70 +
.../web/hicc/home/fonts/ecoicons/ecoicons.ttf | Bin 0 -> 3408 bytes
.../web/hicc/home/fonts/ecoicons/ecoicons.woff | Bin 0 -> 4132 bytes
.../web/hicc/home/fonts/ecoicons/license.txt | 2 +
src/main/web/hicc/home/graph-explorer.html | 346 ++
src/main/web/hicc/home/help/index.html | 58 +
src/main/web/hicc/home/index.html | 290 ++
src/main/web/hicc/home/js/classie.js | 80 +
src/main/web/hicc/home/js/gnmenu.js | 94 +
src/main/web/hicc/home/js/jquery.gridster.js | 4051 +++++++++++++++++
.../web/hicc/home/js/jquery.gridster.min.js | 2 +
.../hicc/home/js/jquery.gridster.with-extras.js | 4163 ++++++++++++++++++
.../home/js/jquery.gridster.with-extras.min.js | 2 +
src/main/web/hicc/home/js/jquery.js | 4 +
src/main/web/hicc/home/js/modernizr.custom.js | 4 +
src/main/web/hicc/home/js/typeahead.bundle.js | 1783 ++++++++
src/main/web/hicc/home/settings/index.html | 57 +
src/main/web/hicc/index.html | 20 +
src/main/web/hicc/index.jsp | 256 --
src/main/web/hicc/iphone.jsp | 177 -
src/main/web/hicc/js/bootstrap.min.js | 7 +
src/main/web/hicc/js/flot.extend.js | 13 +-
src/main/web/hicc/js/jquery.flot.pack.js | 35 +-
src/main/web/hicc/js/jquery.js | 4 +
src/main/web/hicc/js/js-cookie.js | 137 +
src/main/web/hicc/jsp/heatmap.jsp | 20 +-
src/main/web/hicc/login.jsp | 52 +
71 files changed, 13268 insertions(+), 828 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index f8b4890..40f85a2 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,8 @@ Trunk (unreleased changes)
NEW FEATURES
+ CHUKWA-746. Redesigned Chukwa dashboard. (Eric Yang)
+
CHUKWA-736. SSL support for chukwa. (Shreyas Subramanya)
CHUKWA-737. Heartbeat adaptor to push status to remote http server (Shreyas Subramanya)
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/NOTICE.txt
----------------------------------------------------------------------
diff --git a/NOTICE.txt b/NOTICE.txt
index 519aada..09ea5f1 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -69,3 +69,21 @@ Copyright (c) 2009 - 2014 Jonathan Hedley (jonathan@hedley.net)
This product includes esapi
Copyright (c) 2015 OWASP Project, https://www.owasp.org
+
+This product includes js-cookie.js
+Copyright (c) 2006, 2015 Klaus Hartl, https://github.com/js-cookie/js-cookie
+
+This product includes Bootstrap
+Copyright (c) 2011-2015 Twitter, Inc.
+
+This product includes typeahead.js
+Copyright (c) 2011-2015 Twitter, Inc.
+
+This product includes gridster.js
+Copyright (c) 2014 ducksboard, http://gridster.net/
+
+This product includes Modernizr
+Copyright (c) 2009-2015 modernizr.com
+
+This product includes bonzo
+Copyright (c) 2012 Dustin Diaz, https://github.com/ded/bonzo
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/conf/shiro.ini
----------------------------------------------------------------------
diff --git a/conf/shiro.ini b/conf/shiro.ini
new file mode 100644
index 0000000..a584f7e
--- /dev/null
+++ b/conf/shiro.ini
@@ -0,0 +1,46 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# INI configuration is very powerful and flexible, while still remaining succinct.
+# Please http://shiro.apache.org/configuration.html and
+# http://shiro.apache.org/web.html for more.
+
+[main]
+shiro.loginUrl = /login.jsp
+
+[users]
+# format: username = password, role1, role2, ..., roleN
+admin = admin,admin
+guest = guest,guest
+
+[roles]
+# format: roleName = permission1, permission2, ..., permissionN
+admin = *
+
+[urls]
+# The /login.jsp is not restricted to authenticated users (otherwise no one could log in!), but
+# the 'authc' filter must still be specified for it so it can process that url's
+# login submissions. It is 'smart' enough to allow those requests through as specified by the
+# shiro.loginUrl above.
+/login.jsp = authc
+/logout = logout
+/index.html = authc
+/home/css/** = anon
+/home/js/** = anon
+/home/** = authc
+/v1/** = authc
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 1c8d26c..49cad82 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,7 @@
<package.log.dir>/var/log/chukwa</package.log.dir>
<package.pid.dir>/var/run/chukwa</package.pid.dir>
<package.release>1</package.release>
- <package.version>0.6.0</package.version>
+ <package.version>0.7.0</package.version>
<final.name>${project.artifactId}-${package.version}</final.name>
<TODO_ALERT_EMAIL>user@example.com</TODO_ALERT_EMAIL>
<TODO_CLUSTER_NAME>chukwa</TODO_CLUSTER_NAME>
@@ -58,7 +58,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.chukwa</groupId>
- <version>0.6.0</version>
+ <version>0.7.0-SNAPSHOT</version>
<artifactId>chukwa</artifactId>
<packaging>jar</packaging>
@@ -329,6 +329,16 @@
<artifactId>jsp-api-2.1</artifactId>
<version>6.1.14</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.shiro</groupId>
+ <artifactId>shiro-core</artifactId>
+ <version>1.2.3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.shiro</groupId>
+ <artifactId>shiro-web</artifactId>
+ <version>1.2.3</version>
+ </dependency>
</dependencies>
<developers>
@@ -811,7 +821,8 @@
<exclude>contrib/solr/logs/conf/lang/stopwords_pt.txt</exclude>
<exclude>contrib/solr/logs/conf/lang/stopwords_ru.txt</exclude>
<exclude>contrib/solr/logs/conf/lang/stopwords_sv.txt</exclude>
- <exclude>src/main/web/hicc/js/jquery-*</exclude>
+ <exclude>src/main/web/hicc/js/jquery*</exclude>
+ <exclude>src/main/web/hicc/home/js/jquery.js</exclude>
<exclude>src/main/web/hicc/css/iui.css</exclude>
<exclude>src/main/web/hicc/js/behaviour.js</exclude>
<exclude>src/main/web/hicc/js/heatmap.js</exclude>
@@ -844,6 +855,20 @@
<exclude>src/main/web/hicc/js/workspace/prototype.js</exclude>
<exclude>src/main/web/hicc/js/jquery.flot.pack.js</exclude>
<exclude>src/main/web/hicc/js/gsv.js</exclude>
+ <exclude>src/main/web/hicc/js/bootstrap.min.js</exclude>
+ <exclude>src/main/web/hicc/js/js-cookie.js</exclude>
+ <exclude>src/main/web/hicc/css/bootstrap-theme.css.map</exclude>
+ <exclude>src/main/web/hicc/css/bootstrap-theme.min.css</exclude>
+ <exclude>src/main/web/hicc/css/bootstrap.min.css</exclude>
+ <exclude>src/main/web/hicc/fonts/glyphicons-halflings-regular.svg</exclude>
+ <exclude>src/main/web/hicc/home/js/jquery.gridster.min.js</exclude>
+ <exclude>src/main/web/hicc/home/js/jquery.gridster.with-extras.min.js</exclude>
+ <exclude>src/main/web/hicc/home/css/jquery.gridster.css</exclude>
+ <exclude>src/main/web/hicc/home/css/jquery.gridster.min.css</exclude>
+ <exclude>src/main/web/hicc/home/js/typeahead.bundle.js</exclude>
+ <exclude>src/main/web/hicc/home/js/classie.js</exclude>
+ <exclude>src/main/web/hicc/home/js/gnmenu.js</exclude>
+ <exclude>src/main/web/hicc/home/js/modernizr.custom.js</exclude>
<!-- Creative Commons licensed files -->
<exclude>src/main/web/hicc/js/autoHeight.js</exclude>
@@ -852,6 +877,8 @@
<exclude>src/main/web/hicc/js/base64.js</exclude>
<exclude>src/main/web/hicc/js/canvas2image.js</exclude>
<exclude>src/main/web/hicc/js/json.js</exclude>
+ <exclude>src/main/web/hicc/home/fonts/codropsicons/*</exclude>
+ <exclude>src/main/web/hicc/home/fonts/ecoicons/*</exclude>
</excludes>
</configuration>
</plugin>
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/sigar/SigarRunner.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/sigar/SigarRunner.java b/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/sigar/SigarRunner.java
index cd420d0..d23675e 100644
--- a/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/sigar/SigarRunner.java
+++ b/src/main/java/org/apache/hadoop/chukwa/datacollection/adaptor/sigar/SigarRunner.java
@@ -80,13 +80,13 @@ public class SigarRunner extends TimerTask {
for (int i = 0; i < cpuinfo.length; i++) {
JSONObject cpuMap = new JSONObject();
cpuMap.putAll(cpuinfo[i].toMap());
- cpuMap.put("combined", cpuPerc[i].getCombined());
- cpuMap.put("user", cpuPerc[i].getUser());
- cpuMap.put("sys", cpuPerc[i].getSys());
- cpuMap.put("idle", cpuPerc[i].getIdle());
- cpuMap.put("wait", cpuPerc[i].getWait());
- cpuMap.put("nice", cpuPerc[i].getNice());
- cpuMap.put("irq", cpuPerc[i].getIrq());
+ cpuMap.put("combined", cpuPerc[i].getCombined() * 100);
+ cpuMap.put("user", cpuPerc[i].getUser() * 100);
+ cpuMap.put("sys", cpuPerc[i].getSys() * 100);
+ cpuMap.put("idle", cpuPerc[i].getIdle() * 100);
+ cpuMap.put("wait", cpuPerc[i].getWait() * 100);
+ cpuMap.put("nice", cpuPerc[i].getNice() * 100);
+ cpuMap.put("irq", cpuPerc[i].getIrq() * 100);
cpuList.add(cpuMap);
}
sigar.getCpuPerc();
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/datacollection/writer/hbase/Reporter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/datacollection/writer/hbase/Reporter.java b/src/main/java/org/apache/hadoop/chukwa/datacollection/writer/hbase/Reporter.java
index 8b1674d..e6e1f1b 100644
--- a/src/main/java/org/apache/hadoop/chukwa/datacollection/writer/hbase/Reporter.java
+++ b/src/main/java/org/apache/hadoop/chukwa/datacollection/writer/hbase/Reporter.java
@@ -86,8 +86,8 @@ public class Reporter {
}
private byte[] getHash(String key) {
- byte[] hash = new byte[3];
- System.arraycopy(md5.digest(key.getBytes()), 0, hash, 0, 3);
+ byte[] hash = new byte[5];
+ System.arraycopy(md5.digest(key.getBytes()), 0, hash, 0, 5);
return hash;
}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/datastore/ChukwaHBaseStore.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/datastore/ChukwaHBaseStore.java b/src/main/java/org/apache/hadoop/chukwa/datastore/ChukwaHBaseStore.java
index 476bd79..66553c4 100644
--- a/src/main/java/org/apache/hadoop/chukwa/datastore/ChukwaHBaseStore.java
+++ b/src/main/java/org/apache/hadoop/chukwa/datastore/ChukwaHBaseStore.java
@@ -34,6 +34,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.TimeUnit;
import org.apache.hadoop.chukwa.hicc.bean.Chart;
+import org.apache.hadoop.chukwa.hicc.bean.Dashboard;
import org.apache.hadoop.chukwa.hicc.bean.HeatMapPoint;
import org.apache.hadoop.chukwa.hicc.bean.Heatmap;
import org.apache.hadoop.chukwa.hicc.bean.LineOptions;
@@ -73,6 +74,7 @@ public class ChukwaHBaseStore {
static byte[] CHART_FAMILY = "c".getBytes();
static byte[] COMMON_FAMILY = "c".getBytes();
static byte[] WIDGET_TYPE = "widget_meta".getBytes();
+ static byte[] DASHBOARD_TYPE = "dashboard_meta".getBytes();
private static final String CHUKWA = "chukwa";
private static final String CHUKWA_META = "chukwa_meta";
private static long MILLISECONDS_IN_DAY = 86400000L;
@@ -253,8 +255,8 @@ public class ChukwaHBaseStore {
}
public static Heatmap getHeatmap(String metricGroup, String metric,
- long startTime, long endTime, double max, double scale, int height) {
- final long MINUTE = TimeUnit.MINUTES.toMillis(1);
+ long startTime, long endTime, double max, double scale, int width, int height) {
+ final long SECONDS = TimeUnit.SECONDS.toMillis(1);
Heatmap heatmap = new Heatmap();
Set<String> sources = getSourceNames(metricGroup);
Set<String> metrics = getMetricNames(metricGroup);
@@ -283,8 +285,9 @@ public class ChukwaHBaseStore {
}
currentDay = currentDay + (i * MILLISECONDS_IN_DAY);
}
+ long timeRange = (endTime - startTime);
Result[] rs = table.get(series);
- int index = 0;
+ int index = 1;
// Series display in y axis
int y = 0;
HashMap<String, Integer> keyMap = new HashMap<String, Integer>();
@@ -295,7 +298,10 @@ public class ChukwaHBaseStore {
String source = new String(dest);
long time = cell.getTimestamp();
// Time display in x axis
- int x = (int) ((time - startTime) / MINUTE);
+ long delta = time - startTime;
+ double f = (double) delta / timeRange;
+ f = (double) f * width;
+ int x = (int) Math.round(f);
if (keyMap.containsKey(source)) {
y = keyMap.get(source);
} else {
@@ -320,7 +326,7 @@ public class ChukwaHBaseStore {
point.put(point.x, point.y * radius, round);
}
heatmap.putRadius(radius);
- heatmap.putSeries(index);
+ heatmap.putSeries(index -1);
} catch (IOException e) {
closeHBase();
LOG.error(ExceptionUtil.getStackTrace(e));
@@ -716,7 +722,21 @@ public class ChukwaHBaseStore {
// Populate default widgets
Widget widget = new Widget();
widget.setTitle("System Load Average");
- widget.setUrl(new URI("/hicc/v1/chart/draw/1"));
+ widget.setSrc(new URI("/hicc/v1/chart/draw/1"));
+ widget.setCol(1);
+ widget.setRow(1);
+ widget.setSize_x(7);
+ widget.setSize_y(1);
+ createWidget(widget);
+
+ // CPU heatmap
+ widget = new Widget();
+ widget.setTitle("CPU Heatmap");
+ widget.setSrc(new URI("/hicc/jsp/heatmap.jsp"));
+ widget.setCol(1);
+ widget.setRow(1);
+ widget.setSize_x(4);
+ widget.setSize_y(2);
createWidget(widget);
// Populate example chart widgets
@@ -735,8 +755,67 @@ public class ChukwaHBaseStore {
chart.SetSeries(series);
createChart(chart);
+
+ Dashboard dashboard = new Dashboard();
+ dashboard.add(widget);
+ updateDashboard("default", "", dashboard);
} catch (Throwable ex) {
LOG.error(ExceptionUtil.getStackTrace(ex));
}
}
+
+ public static synchronized Dashboard getDashboard(String id, String user) {
+ Dashboard dash = null;
+ String key = new StringBuilder().append(id).
+ append("|").append(user).toString();
+ try {
+ getHBaseConnection();
+ Table table = connection.getTable(TableName.valueOf(CHUKWA_META));
+ Get dashboard = new Get(DASHBOARD_TYPE);
+ dashboard.addColumn(COMMON_FAMILY, key.getBytes());
+ Result rs = table.get(dashboard);
+ byte[] buffer = rs.getValue(COMMON_FAMILY, key.getBytes());
+ if(buffer == null) {
+ // If user dashboard is not found, use default dashboard.
+ key = new StringBuilder().append(id).append("|").toString();
+ dashboard = new Get(DASHBOARD_TYPE);
+ dashboard.addColumn(COMMON_FAMILY, key.getBytes());
+ rs = table.get(dashboard);
+ buffer = rs.getValue(COMMON_FAMILY, key.getBytes());
+ }
+ Gson gson = new Gson();
+ dash = gson.fromJson(new String(buffer), Dashboard.class);
+ table.close();
+ } catch (Exception e) {
+ closeHBase();
+ LOG.error(ExceptionUtil.getStackTrace(e));
+ LOG.error("Error retrieving dashboard, id: " +
+ id + " user:" + user);
+ }
+ return dash;
+ }
+
+ public static boolean updateDashboard(String id, String user, Dashboard dash) {
+ boolean result = false;
+ String key = new StringBuilder().append(id).
+ append("|").append(user).toString();
+ try {
+ getHBaseConnection();
+ Table table = connection.getTable(TableName.valueOf(CHUKWA_META));
+ Put put = new Put(DASHBOARD_TYPE);
+ Gson gson = new Gson();
+ String buffer = gson.toJson(dash);
+ put.add(COMMON_FAMILY, key.getBytes(), buffer.getBytes());
+ table.put(put);
+ table.close();
+ result = true;
+ } catch (Exception e) {
+ closeHBase();
+ LOG.error(ExceptionUtil.getStackTrace(e));
+ LOG.error("Error in updating dashboard, id: " +
+ id + " user:" + user);
+ }
+ return result;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/TimeHandler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/TimeHandler.java b/src/main/java/org/apache/hadoop/chukwa/hicc/TimeHandler.java
index b692c3d..7844b65 100644
--- a/src/main/java/org/apache/hadoop/chukwa/hicc/TimeHandler.java
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/TimeHandler.java
@@ -118,6 +118,8 @@ public class TimeHandler {
start = end - (7 * 24 * 60 * 60 * 1000);
} else if (period.equals("last30d")) {
start = end - (30L * 24 * 60 * 60 * 1000);
+ } else if (period.equals("lastyear")) {
+ start = end - (365L * 24 * 60 * 60 * 1000);
} else if (period.startsWith("custom;")) {
// default value is between 2 days ago and now
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/bean/BarOptions.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/bean/BarOptions.java b/src/main/java/org/apache/hadoop/chukwa/hicc/bean/BarOptions.java
index e69de29..12c6b12 100644
--- a/src/main/java/org/apache/hadoop/chukwa/hicc/bean/BarOptions.java
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/bean/BarOptions.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.chukwa.hicc.bean;
+
+
+public class BarOptions extends SeriesOptions {
+ public boolean zero;
+ public boolean stepByStep = true;
+ public int barWidth = 4;
+ public String align;
+ public boolean horizontal;
+
+ public BarOptions() {
+ fill = true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Dashboard.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Dashboard.java b/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Dashboard.java
new file mode 100644
index 0000000..eb12674
--- /dev/null
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Dashboard.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.chukwa.hicc.bean;
+
+import java.util.ArrayList;
+
+public class Dashboard {
+ ArrayList<Widget> grid = null;
+
+ public void add(Widget widget) {
+ if(grid==null) {
+ grid = new ArrayList<Widget>();
+ }
+ grid.add(widget);
+ }
+}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/bean/SessionAttribute.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/bean/SessionAttribute.java b/src/main/java/org/apache/hadoop/chukwa/hicc/bean/SessionAttribute.java
new file mode 100644
index 0000000..b9f9d88
--- /dev/null
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/bean/SessionAttribute.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.chukwa.hicc.bean;
+
+public class SessionAttribute {
+ public String key;
+ public String value;
+
+ public SessionAttribute(String id, String value) {
+ this.key = id;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return this.key;
+ }
+
+ public String getValue() {
+ return this.value;
+ }
+}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Widget.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Widget.java b/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Widget.java
index 987f525..61dc0b5 100644
--- a/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Widget.java
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/bean/Widget.java
@@ -26,12 +26,52 @@ import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Widget {
@XmlElement
+ public int col;
+ @XmlElement
+ public int row;
+ @XmlElement
+ public int size_x;
+ @XmlElement
+ public int size_y;
+ @XmlElement
public String title;
@XmlElement
- public URI url;
+ public URI src;
@XmlElement
public String[] tokens;
+ public int getCol() {
+ return col;
+ }
+
+ public void setCol(int col) {
+ this.col = col;
+ }
+
+ public int getRow() {
+ return row;
+ }
+
+ public void setRow(int row) {
+ this.row = row;
+ }
+
+ public int getSize_x() {
+ return size_x;
+ }
+
+ public void setSize_x(int size_x) {
+ this.size_x = size_x;
+ }
+
+ public int getSize_y() {
+ return size_y;
+ }
+
+ public void setSize_y(int size_y) {
+ this.size_y = size_y;
+ }
+
public String getTitle() {
return title;
}
@@ -40,12 +80,12 @@ public class Widget {
this.title = title;
}
- public URI getUrl() {
- return url;
+ public URI getSrc() {
+ return src;
}
- public void setUrl(URI url) {
- this.url = url;
+ public void setSrc(URI src) {
+ this.src = src;
}
public String[] getTokens() {
@@ -58,6 +98,6 @@ public class Widget {
public void tokenize() {
String[] tokens = title.split(" ");
- this.tokens = tokens;
+ this.tokens = tokens;
}
}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/rest/DashboardController.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/rest/DashboardController.java b/src/main/java/org/apache/hadoop/chukwa/hicc/rest/DashboardController.java
new file mode 100644
index 0000000..987e405
--- /dev/null
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/rest/DashboardController.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.chukwa.hicc.rest;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.hadoop.chukwa.datastore.ChukwaHBaseStore;
+import org.apache.hadoop.chukwa.hicc.bean.Dashboard;
+import org.apache.log4j.Logger;
+
+import com.google.gson.Gson;
+
+@Path("dashboard")
+public class DashboardController {
+ static Logger LOG = Logger.getLogger(DashboardController.class);
+
+ @Context
+ private ServletContext context;
+
+ @GET
+ @Path("load/{id}")
+ public String load(@Context HttpServletRequest request, @PathParam("id") String id) {
+ Gson gson = new Gson();
+ Dashboard dash = ChukwaHBaseStore.getDashboard(id, request.getRemoteUser());
+ String json = gson.toJson(dash);
+ return json;
+ }
+
+ @PUT
+ @Path("save/{id}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Response save(@Context HttpServletRequest request, @PathParam("id") String id, String buffer) {
+ Gson gson = new Gson();
+ Dashboard dash = gson.fromJson(buffer, Dashboard.class);
+ boolean result = ChukwaHBaseStore.updateDashboard(id, request.getRemoteUser(), dash);
+ if(!result) {
+ return Response.status(Status.BAD_REQUEST).build();
+ }
+ return Response.ok().build();
+ }
+
+ @GET
+ @Path("whoami")
+ public String whoami(@Context HttpServletRequest request) {
+ return request.getRemoteUser();
+ }
+}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/rest/HeatmapController.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/rest/HeatmapController.java b/src/main/java/org/apache/hadoop/chukwa/hicc/rest/HeatmapController.java
index 4c7d5c5..621f318 100644
--- a/src/main/java/org/apache/hadoop/chukwa/hicc/rest/HeatmapController.java
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/rest/HeatmapController.java
@@ -48,6 +48,7 @@ public class HeatmapController {
@QueryParam("end") String end,
@QueryParam("max") @DefaultValue("1.0") double max,
@QueryParam("scale") @DefaultValue("100") double scale,
+ @QueryParam("width") @DefaultValue("700") int width,
@QueryParam("height") @DefaultValue("400") int height) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Heatmap heatmap = null;
@@ -66,7 +67,7 @@ public class HeatmapController {
endTime = time.getEndTime();
}
heatmap = ChukwaHBaseStore.getHeatmap(metricGroup, metric, startTime,
- endTime, max, scale, height);
+ endTime, max, scale, width, height);
} catch (Throwable e) {
log.error(ExceptionUtil.getStackTrace(e));
}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/rest/SessionController.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/rest/SessionController.java b/src/main/java/org/apache/hadoop/chukwa/hicc/rest/SessionController.java
new file mode 100644
index 0000000..ceed0df
--- /dev/null
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/rest/SessionController.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.chukwa.hicc.rest;
+
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.log4j.Logger;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+@Path("session")
+public class SessionController {
+ static Logger LOG = Logger.getLogger(SessionController.class);
+
+ /**
+ * Utility to get session attributes
+ * @param id
+ * @return session attribute
+ */
+ @GET
+ @Path("key/{id}")
+ @Produces(MediaType.APPLICATION_JSON)
+ public String draw(@Context HttpServletRequest request, @PathParam("id") String id) {
+ String value = (String) request.getSession().getAttribute(id);
+ Map<String, String> map = new HashMap<String, String>();
+ map.put(id, value);
+ Gson gson = new Gson();
+ String json = gson.toJson(map);
+ return json;
+ }
+
+ @PUT
+ @Path("save")
+ public Response save(@Context HttpServletRequest request, String buffer) {
+ Gson gson = new Gson();
+ Type stringStringMap = new TypeToken<Map<String, String>>(){}.getType();
+ Map<String,String> map = gson.fromJson(buffer, stringStringMap);
+ for(String key : map.keySet()) {
+ request.getSession().setAttribute(key, map.get(key));
+ }
+ return Response.ok().build();
+ }
+}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/hicc/rest/WidgetController.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/hicc/rest/WidgetController.java b/src/main/java/org/apache/hadoop/chukwa/hicc/rest/WidgetController.java
index 1df8efb..64afc19 100644
--- a/src/main/java/org/apache/hadoop/chukwa/hicc/rest/WidgetController.java
+++ b/src/main/java/org/apache/hadoop/chukwa/hicc/rest/WidgetController.java
@@ -20,7 +20,6 @@ package org.apache.hadoop.chukwa.hicc.rest;
import java.util.List;
import javax.annotation.PostConstruct;
-import javax.inject.Scope;
import javax.inject.Singleton;
import javax.servlet.ServletContext;
import javax.ws.rs.Consumes;
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/java/org/apache/hadoop/chukwa/util/HBaseUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/chukwa/util/HBaseUtil.java b/src/main/java/org/apache/hadoop/chukwa/util/HBaseUtil.java
index b0ae38e..c655e24 100644
--- a/src/main/java/org/apache/hadoop/chukwa/util/HBaseUtil.java
+++ b/src/main/java/org/apache/hadoop/chukwa/util/HBaseUtil.java
@@ -53,9 +53,9 @@ public class HBaseUtil {
c.setTimeInMillis(time);
byte[] day = Integer.toString(c.get(Calendar.DAY_OF_YEAR)).getBytes();
byte[] pk = getHash(primaryKey);
- byte[] key = new byte[8];
+ byte[] key = new byte[12];
System.arraycopy(day, 0, key, 0, day.length);
- System.arraycopy(pk, 0, key, 2, 3);
+ System.arraycopy(pk, 0, key, 2, 5);
return key;
}
@@ -64,16 +64,16 @@ public class HBaseUtil {
byte[] day = Integer.toString(c.get(Calendar.DAY_OF_YEAR)).getBytes();
byte[] pk = getHash(primaryKey);
byte[] src = getHash(source);
- byte[] key = new byte[8];
+ byte[] key = new byte[12];
System.arraycopy(day, 0, key, 0, day.length);
- System.arraycopy(pk, 0, key, 2, 3);
- System.arraycopy(src, 0, key, 5, 3);
+ System.arraycopy(pk, 0, key, 2, 5);
+ System.arraycopy(src, 0, key, 7, 5);
return key;
}
private static byte[] getHash(String key) {
- byte[] hash = new byte[3];
- System.arraycopy(md5.digest(key.getBytes()), 0, hash, 0, 3);
+ byte[] hash = new byte[5];
+ System.arraycopy(md5.digest(key.getBytes()), 0, hash, 0, 5);
return hash;
}
}
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/web/hicc/WEB-INF/jetty.xml
----------------------------------------------------------------------
diff --git a/src/main/web/hicc/WEB-INF/jetty.xml b/src/main/web/hicc/WEB-INF/jetty.xml
index 91fdee5..f0b473d 100644
--- a/src/main/web/hicc/WEB-INF/jetty.xml
+++ b/src/main/web/hicc/WEB-INF/jetty.xml
@@ -97,7 +97,7 @@
</Set>
-->
- <Set name="UserRealms">
+ <!-- <Set name="UserRealms">
<Array type="org.mortbay.jetty.security.UserRealm">
<Item>
<New class="org.mortbay.jetty.security.HashUserRealm">
@@ -107,7 +107,7 @@
</New>
</Item>
</Array>
- </Set>
+ </Set> -->
<!-- =========================================================== -->
<!-- Set handler Collection Structure -->
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/web/hicc/WEB-INF/vm/chart.vm
----------------------------------------------------------------------
diff --git a/src/main/web/hicc/WEB-INF/vm/chart.vm b/src/main/web/hicc/WEB-INF/vm/chart.vm
index 90cb1d7..67d671c 100644
--- a/src/main/web/hicc/WEB-INF/vm/chart.vm
+++ b/src/main/web/hicc/WEB-INF/vm/chart.vm
@@ -18,9 +18,9 @@
<!DOCTYPE html>
<html lang="en">
<head>
- <link href="/hicc/css/default.css" rel="stylesheet" type="text/css">
- <link href="/hicc/css/iframe.css" rel="stylesheet" type="text/css">
- <link href="/hicc/css/flexigrid/flexigrid.css" rel="stylesheet" type="text/css">
+ <link type="text/css" rel="stylesheet" href="/hicc/css/default.css" />
+ <link type="text/css" rel="stylesheet" href="/hicc/css/iframe.css" />
+ <link type="text/css" rel="stylesheet" href="/hicc/css/flexigrid/flexigrid.css" />
</head>
<body>
<div id="placeholderTitle"><center>$chart.getTitle()</center></div>
@@ -33,12 +33,13 @@
<div class="legendHolder">
<div class="center" id="statisLegend"></div>
</div>
- <script type="text/javascript" src="/hicc/js/jquery-1.2.6.min.js"></script>
+ <script type="text/javascript" src="/hicc/js/jquery.js"></script>
<script type="text/javascript" src="/hicc/js/jquery.flot.pack.js"></script>
<script type="text/javascript" src="/hicc/js/flexigrid.pack.js"></script>
<script type="text/javascript" src="/hicc/js/excanvas.pack.js"></script>
<script type="text/javascript" src="/hicc/js/base64.js"></script>
<script type="text/javascript" src="/hicc/js/canvas2image.js"></script>
+ <script type="text/javascript" src="/hicc/js/js-cookie.js"></script>
<script type="text/javascript" src="/hicc/js/flot.extend.js"></script>
<script type="text/javascript">
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/web/hicc/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/src/main/web/hicc/WEB-INF/web.xml b/src/main/web/hicc/WEB-INF/web.xml
index 2437f08..36e9691 100644
--- a/src/main/web/hicc/WEB-INF/web.xml
+++ b/src/main/web/hicc/WEB-INF/web.xml
@@ -22,9 +22,25 @@
version="2.5">
<description>
- Workspace
+ Hadoop Infrastructure Care Center
</description>
- <display-name>Workspace</display-name>
+ <display-name>hicc</display-name>
+
+ <listener>
+ <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
+ </listener>
+ <filter>
+ <filter-name>ShiroFilter</filter-name>
+ <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>ShiroFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
<servlet>
<servlet-name>Workspace</servlet-name>
@@ -58,7 +74,7 @@
<url-pattern>/v1/*</url-pattern>
</servlet-mapping>
- <security-role>
+<!-- <security-role>
<role-name>user</role-name>
</security-role>
@@ -75,6 +91,6 @@
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
- </security-constraint>
+ </security-constraint> -->
</web-app>
http://git-wip-us.apache.org/repos/asf/chukwa/blob/dfe84a2c/src/main/web/hicc/css/bootstrap-theme.css.map
----------------------------------------------------------------------
diff --git a/src/main/web/hicc/css/bootstrap-theme.css.map b/src/main/web/hicc/css/bootstrap-theme.css.map
new file mode 100644
index 0000000..5a12d63
--- /dev/null
+++ b/src/main/web/hicc/css/bootstrap-theme.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAcA;;;;;;EAME,0CAAA;ECgDA,6FAAA;EACQ,qFAAA;EC5DT;AFgBC;;;;;;;;;;;;EC2CA,0DAAA;EACQ,kDAAA;EC7CT;AFVD;;;;;;EAiBI,mBAAA;EECH;AFiCC;;EAEE,wBAAA;EE/BH;AFoCD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EAgC2C,2BAAA;EAA2B,oBAAA;EEzBvE;AFLC;;EAEE,2BAAA;EACA,8BAAA;EEOH;AFJC;;EAEE,2BAAA;EACA,uBAAA;EEMH;AFHC;;;EAGE,2BAAA;EACA,wBAAA;EEKH;AFUD;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEgCD;AF9BC;;EAEE,2BAAA;EACA,8BAAA;EEgCH;AF7BC;;EAEE,2BAAA;EACA,uBAAA;EE+BH;AF5BC;;;EAGE,2BAAA;EACA,wBAAA;EE8BH;AFdD;EGrDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEyDD;AFvDC;;EAEE,2BAAA;EACA,8BAAA;EEyDH;AFtDC;;EAEE,2BAAA;EACA,uBAAA;EEwDH;AFrDC;;;EAGE,2BAAA;EACA,wBAAA;EEuDH;AFtCD;EGtDI,0EAAA;EAC
A,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEkFD;AFhFC;;EAEE,2BAAA;EACA,8BAAA;EEkFH;AF/EC;;EAEE,2BAAA;EACA,uBAAA;EEiFH;AF9EC;;;EAGE,2BAAA;EACA,wBAAA;EEgFH;AF9DD;EGvDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE2GD;AFzGC;;EAEE,2BAAA;EACA,8BAAA;EE2GH;AFxGC;;EAEE,2BAAA;EACA,uBAAA;EE0GH;AFvGC;;;EAGE,2BAAA;EACA,wBAAA;EEyGH;AFtFD;EGxDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEoID;AFlIC;;EAEE,2BAAA;EACA,8BAAA;EEoIH;AFjIC;;EAEE,2BAAA;EACA,uBAAA;EEmIH;AFhIC;;;EAGE,2BAAA;EACA,wBAAA;EEkIH;AFxGD;;EChBE,oDAAA;EACQ,4CAAA;EC4HT;AFnGD;;EGzEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHwEF,2BAAA;EEyGD;AFvGD;;;EG9EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8EF,2BAAA;EE6GD;AFpGD;EG3FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ6GA,oBAAA;EC/CA,6FAAA;EACQ,qFAAA;EC0JT;AF/GD;;EG3FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAA
A,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;ECoKT;AF5GD;;EAEE,gDAAA;EE8GD;AF1GD;EG9GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EF+OD;AFlHD;;EG9GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;EC0LT;AF5HD;;EAYI,2CAAA;EEoHH;AF/GD;;;EAGE,kBAAA;EEiHD;AF5FD;EAfI;;;IAGE,aAAA;IG3IF,0EAAA;IACA,qEAAA;IACA,+FAAA;IAAA,wEAAA;IACA,6BAAA;IACA,wHAAA;ID0PD;EACF;AFxGD;EACE,+CAAA;ECzGA,4FAAA;EACQ,oFAAA;ECoNT;AFhGD;EGpKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EE4GD;AFvGD;EGrKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EEoHD;AF9GD;EGtKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EE4HD;AFrHD;EGvKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4JF,uBAAA;EEoID;AFrHD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuSH;AFlHD;EGzLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8SH;AF
xHD;EG1LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqTH;AF9HD;EG3LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4TH;AFpID;EG5LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmUH;AF1ID;EG7LI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0UH;AF7ID;EGhKI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDgTH;AFzID;EACE,oBAAA;EC5JA,oDAAA;EACQ,4CAAA;ECwST;AF1ID;;;EAGE,+BAAA;EGjNE,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+MF,uBAAA;EEgJD;AFrJD;;;EAQI,mBAAA;EEkJH;AFxID;ECjLE,mDAAA;EACQ,2CAAA;EC4TT;AFlID;EG1OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED+WH;AFxID;EG3OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDsXH;AF9ID;EG5OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED6XH;AFpJD;EG7OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDoYH;AF1JD;EG9OI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2YH;AFhKD;EG/OI,0EAAA;EACA,qEAAA;EAC
A,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkZH;AFhKD;EGtPI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHoPF,uBAAA;ECzMA,2FAAA;EACQ,mFAAA;ECgXT","file":"bootstrap-theme.css","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\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 .badge {\n text-shadow: none;\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; see https://github.com/twbs/bootstrap/issues/10620\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 &[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// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\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// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gr
adient > .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 > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-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; see https://github.com/twbs/bootstrap/issues/10257\n\n .navbar
-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-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// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\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 @sh
adow: 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// 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-grou
p-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\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-head
ing-bg); }\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 // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\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); // I
E9 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(@degr
ees);\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.tra
nsition(@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",".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, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .
badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default:disabled,\n.btn-default[disabled] {\n background-color: #e0e0
e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary:disabled,\n.btn-primary[disabled] {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-lin
ear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success:disabled,\n.btn-success[disabled] {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Mi
crosoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info:disabled,\n.btn-info[disabled] {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-rep
eat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning:disabled,\n.btn-warning[disabled] {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.bt
n-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger:disabled,\n.btn-danger[disabled] {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top,
#337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 2
55, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;
\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media
(max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear
-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;
\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n back
ground-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bott
om, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)
;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 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 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n
background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n
.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%
, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Micro
soft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// 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-col
or: #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-ima
ge: -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 5
0%, @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"]}
\ No newline at end of file