HTRACE-227. Remove dependency to non-public API of hadoop-common from htrace-hbase (iwasakims)
Project: http://git-wip-us.apache.org/repos/asf/incubator-htrace/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-htrace/commit/18b92a7a Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/18b92a7a Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/18b92a7a Branch: refs/heads/master Commit: 18b92a7a57aa0b60f812609df1f04c9dbe38a106 Parents: 82a6418 Author: Masatake Iwasaki <[email protected]> Authored: Fri Aug 21 13:32:46 2015 +0900 Committer: Masatake Iwasaki <[email protected]> Committed: Fri Aug 21 13:32:46 2015 +0900 ---------------------------------------------------------------------- htrace-hbase/pom.xml | 29 +++++-- .../apache/htrace/impl/HBaseSpanReceiver.java | 2 +- .../htrace/viewer/HBaseSpanViewerServer.java | 89 ++++++++------------ .../viewer/HBaseSpanViewerSpansServlet.java | 19 ++--- .../viewer/HBaseSpanViewerTracesServlet.java | 9 +- .../main/webapps/htrace/bootstrap-theme.min.css | 10 +++ .../src/main/webapps/htrace/bootstrap.min.css | 9 ++ htrace-hbase/src/main/webapps/htrace/d3.min.js | 5 ++ htrace-hbase/src/main/webapps/htrace/spans.html | 6 +- htrace-hbase/src/main/webapps/htrace/spans.js | 2 +- .../src/main/webapps/htrace/traces.html | 6 +- .../main/webapps/static/bootstrap-theme.min.css | 10 --- .../src/main/webapps/static/bootstrap.min.css | 9 -- htrace-hbase/src/main/webapps/static/d3.min.js | 5 -- 14 files changed, 100 insertions(+), 110 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/18b92a7a/htrace-hbase/pom.xml ---------------------------------------------------------------------- diff --git a/htrace-hbase/pom.xml b/htrace-hbase/pom.xml index 2230b32..20075e9 100644 --- a/htrace-hbase/pom.xml +++ b/htrace-hbase/pom.xml @@ -32,10 +32,7 @@ language governing permissions and limitations under the License. --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <hbase.version>0.99.2</hbase.version> - <!-- <hbase.version>0.99.0-SNAPSHOT</hbase.version> --> - <hadoop.version>2.4.0</hadoop.version> - <!-- <hadoop.version>3.0.0-SNAPSHOT</hadoop.version> --> - <protobuf.version>2.5.0</protobuf.version> + <jetty.version>9.2.13.v20150730</jetty.version> </properties> <build> @@ -49,7 +46,6 @@ language governing permissions and limitations under the License. --> </resources> <plugins> <plugin> - <!--Make it so assembly:single does nothing in here--> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> @@ -84,6 +80,14 @@ language governing permissions and limitations under the License. --> <pattern>com.google.protobuf</pattern> <shadedPattern>org.apache.htrace.com.google.protobuf</shadedPattern> </relocation> + <relocation> + <pattern>org.eclipse.jetty</pattern> + <shadedPattern>org.apache.htrace.org.eclipse.jetty</shadedPattern> + </relocation> + <relocation> + <pattern>javax.servlet</pattern> + <shadedPattern>org.apache.htrace.javax.servlet</shadedPattern> + </relocation> </relocations> </configuration> <goals> @@ -124,7 +128,17 @@ language governing permissions and limitations under the License. --> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> - <version>${protobuf.version}</version> + <version>2.5.0</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-server</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlet</artifactId> + <version>${jetty.version}</version> </dependency> <!-- Global deps. --> <dependency> @@ -141,6 +155,7 @@ language governing permissions and limitations under the License. --> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>${hbase.version}</version> + <scope>provided</scope> <exclusions> <exclusion> <groupId>org.apache.htrace</groupId> @@ -169,7 +184,7 @@ language governing permissions and limitations under the License. --> <plugin> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-maven-plugins</artifactId> - <version>${hadoop.version}</version> + <version>2.7.1</version> <configuration> <protocVersion>${protobuf.version}</protocVersion> <protocCommand>${protoc.path}</protocCommand> http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/18b92a7a/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java ---------------------------------------------------------------------- diff --git a/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java b/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java index b0720f3..1f54f18 100644 --- a/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java +++ b/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java @@ -364,6 +364,7 @@ public class HBaseSpanReceiver implements SpanReceiver { long traceid = parent.getSpan().getSpanId().getHigh(); TraceScope child1 = Trace.startSpan("HBaseSpanReceiver.main.child.1"); Thread.sleep(10); + child1.close(); TraceScope child2 = Trace.startSpan("HBaseSpanReceiver.main.child.2", parent.getSpan()); Thread.sleep(10); TraceScope gchild = Trace.startSpan("HBaseSpanReceiver.main.grandchild"); @@ -374,7 +375,6 @@ public class HBaseSpanReceiver implements SpanReceiver { Thread.sleep(10); child2.close(); Thread.sleep(10); - child1.close(); parent.close(); receiver.close(); System.out.println("trace id: " + traceid); http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/18b92a7a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java ---------------------------------------------------------------------- diff --git a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java index da90008..1ae7165 100644 --- a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java +++ b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerServer.java @@ -22,87 +22,66 @@ import java.net.InetSocketAddress; import java.net.URI; import java.util.ArrayList; import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.http.HttpServer2; -import org.apache.hadoop.net.NetUtils; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; import org.apache.hadoop.hbase.HBaseConfiguration; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; + public class HBaseSpanViewerServer implements Tool { private static final Log LOG = LogFactory.getLog(HBaseSpanViewerServer.class); public static final String HTRACE_VIEWER_HTTP_ADDRESS_KEY = "htrace.viewer.http.address"; public static final String HTRACE_VIEWER_HTTP_ADDRESS_DEFAULT = "0.0.0.0:16900"; - public static final String HTRACE_CONF_ATTR = "htrace.conf"; - public static final String HTRACE_APPDIR = "webapps"; - public static final String NAME = "htrace"; - private Configuration conf; - private HttpServer2 httpServer; - private InetSocketAddress httpAddress; + private Server server; + @Override public void setConf(Configuration conf) { this.conf = conf; } + @Override public Configuration getConf() { return this.conf; } - void start() throws IOException { - httpAddress = NetUtils.createSocketAddr( - conf.get(HTRACE_VIEWER_HTTP_ADDRESS_KEY, HTRACE_VIEWER_HTTP_ADDRESS_DEFAULT)); - conf.set(HTRACE_VIEWER_HTTP_ADDRESS_KEY, NetUtils.getHostPortString(httpAddress)); - HttpServer2.Builder builder = new HttpServer2.Builder(); - builder.setName(NAME).setConf(conf); - if (httpAddress.getPort() == 0) { - builder.setFindPort(true); + public void stop() throws Exception { + if (server != null) { + server.stop(); } - URI uri = URI.create("http://" + NetUtils.getHostPortString(httpAddress)); - builder.addEndpoint(uri); - LOG.info("Starting Web-server for " + NAME + " at: " + uri); - httpServer = builder.build(); - httpServer.setAttribute(HTRACE_CONF_ATTR, conf); - httpServer.addServlet("gettraces", - HBaseSpanViewerTracesServlet.PREFIX, - HBaseSpanViewerTracesServlet.class); - httpServer.addServlet("getspans", - HBaseSpanViewerSpansServlet.PREFIX + "/*", - HBaseSpanViewerSpansServlet.class); - - // for webapps/htrace bundled in jar. - String rb = httpServer.getClass() - .getClassLoader() - .getResource("webapps/" + NAME) - .toString(); - httpServer.getWebAppContext().setResourceBase(rb); - - httpServer.start(); - httpAddress = httpServer.getConnectorAddress(0); } - void join() throws Exception { - if (httpServer != null) { - httpServer.join(); - } - } - - void stop() throws Exception { - if (httpServer != null) { - httpServer.stop(); - } - } + public int run(String[] args) throws Exception { + URI uri = new URI("http://" + conf.get(HTRACE_VIEWER_HTTP_ADDRESS_KEY, + HTRACE_VIEWER_HTTP_ADDRESS_DEFAULT)); + InetSocketAddress addr = new InetSocketAddress(uri.getHost(), uri.getPort()); + server = new Server(addr); + ServletContextHandler root = + new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); + server.setHandler(root); - InetSocketAddress getHttpAddress() { - return httpAddress; - } + String resourceBase = server.getClass() + .getClassLoader() + .getResource("webapps/htrace") + .toExternalForm(); + root.setResourceBase(resourceBase); + root.setWelcomeFiles(new String[]{"index.html"}); + root.addServlet(new ServletHolder(new DefaultServlet()), + "/"); + root.addServlet(new ServletHolder(new HBaseSpanViewerTracesServlet(conf)), + "/gettraces"); + root.addServlet(new ServletHolder(new HBaseSpanViewerSpansServlet(conf)), + "/getspans/*"); - public int run(String[] args) throws Exception { - start(); - join(); - stop(); + server.start(); + server.join(); return 0; } http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/18b92a7a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java ---------------------------------------------------------------------- diff --git a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java index 8f3f50f..3983fde 100644 --- a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java +++ b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerSpansServlet.java @@ -29,8 +29,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.util.ServletUtil; import org.apache.htrace.protobuf.generated.SpanProtos; public class HBaseSpanViewerSpansServlet extends HttpServlet { @@ -43,22 +41,24 @@ public class HBaseSpanViewerSpansServlet extends HttpServlet { return null; } }; + private Configuration conf; + + public HBaseSpanViewerSpansServlet(Configuration conf) { + this.conf = conf; + } @Override @SuppressWarnings("unchecked") public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - final String path = - validatePath(ServletUtil.getDecodedPath(request, PREFIX)); - if (path == null) { + final String path = request.getRequestURI().substring(PREFIX.length()); + if (path == null || path.length() == 0) { response.setContentType("text/plain"); response.getWriter().print("Invalid input"); return; } HBaseSpanViewer viewer = tlviewer.get(); if (viewer == null) { - final Configuration conf = (Configuration) getServletContext() - .getAttribute(HBaseSpanViewerServer.HTRACE_CONF_ATTR); viewer = new HBaseSpanViewer(conf); tlviewer.set(viewer); } @@ -89,9 +89,4 @@ public class HBaseSpanViewerSpansServlet extends HttpServlet { viewer.close(); } } - - public static String validatePath(String p) { - return p == null || p.length() == 0? - null: new Path(p).toUri().getPath(); - } } http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/18b92a7a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java ---------------------------------------------------------------------- diff --git a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java index b0370c4..37ed43c 100644 --- a/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java +++ b/htrace-hbase/src/main/java/org/apache/htrace/viewer/HBaseSpanViewerTracesServlet.java @@ -29,8 +29,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.util.ServletUtil; import org.apache.htrace.protobuf.generated.SpanProtos; public class HBaseSpanViewerTracesServlet extends HttpServlet { @@ -43,6 +41,11 @@ public class HBaseSpanViewerTracesServlet extends HttpServlet { return null; } }; + private Configuration conf; + + public HBaseSpanViewerTracesServlet(Configuration conf) { + this.conf = conf; + } @Override @SuppressWarnings("unchecked") @@ -50,8 +53,6 @@ public class HBaseSpanViewerTracesServlet extends HttpServlet { throws ServletException, IOException { HBaseSpanViewer viewer = tlviewer.get(); if (viewer == null) { - final Configuration conf = (Configuration) getServletContext() - .getAttribute(HBaseSpanViewerServer.HTRACE_CONF_ATTR); viewer = new HBaseSpanViewer(conf); tlviewer.set(viewer); } http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/18b92a7a/htrace-hbase/src/main/webapps/htrace/bootstrap-theme.min.css ---------------------------------------------------------------------- diff --git a/htrace-hbase/src/main/webapps/htrace/bootstrap-theme.min.css b/htrace-hbase/src/main/webapps/htrace/bootstrap-theme.min.css new file mode 100755 index 0000000..c31428b --- /dev/null +++ b/htrace-hbase/src/main/webapps/htrace/bootstrap-theme.min.css @@ -0,0 +1,10 @@ +/*! + * Bootstrap v3.0.0 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */ +.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,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,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,0%,#e6e6e6,100%);background-image:-moz-linear-gradient(top,#fff 0,#e6e6e6 100%);background-image:linear-gradient(to bottom,#fff 0,#e6e6e6 100%);background-repeat:repeat-x;border-co lor:#e0e0e0;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0)}.btn-default:active,.btn-default.active{background-color:#e6e6e6;border-color:#e0e0e0}.btn-primary{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;border-color:#2d6ca2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.btn-primary:active,.btn-primary.active{background-color:#3071a9;border-color:#2d6ca2}.btn-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb 85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;border-color:#419641;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.btn-success:active,.btn-success.active{background-color:#449d44;border-color:#419641}.btn-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;border-color:#eb9316;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.btn-warning:active,.btn-warning.active{background-color:#ec971f;border-color:#eb9316}.btn-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-i mage:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;border-color:#c12e2a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.btn-danger:active,.btn-danger.active{background-color:#c9302c;border-color:#c12e2a}.btn-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;border-color:#2aabd2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.btn-info:active,.btn-info.active{background-color:#31b0d5;border-color:#2aabd2}.thumbnail,.img- thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#fff,0%,#f8f8f8,100%);background-image:-moz-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repe at-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar .navbar-nav>.active>a{background-color:#f8f8f8}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-gradient(linear,left 0,left 100%,from(#3c3c3c),to(#222));background-image:-webkit-linear-gradient(top,#3c3c3c,0%,#222,100%);background-image:-moz-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0)}.navbar-inverse .navbar-nav>.active>a{background-color:#222}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow :0 -1px 0 rgba(0,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,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#c8e5bc));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#c8e5bc,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#b9def0));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#b9def0,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#b9 def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#f8efc0));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#f8efc0,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#e7c3c3));background-image:-webkit-linear-gradient(top,#f2dede,0%,#e7c3c3,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-gradient(linear,left 0,left 100%,from(#ebebeb),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#ebebeb,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient (startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{backg round-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.li st-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3278b3));background-image:-webkit-linear-gradient(top,#428bca,0%,#3278b3,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f5f5f5),to(#e8e8e8));background-image:-webkit-linear-gradient(top,#f5f5f5,0%,#e8e8e8,100%);background-image:-moz-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x ;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#d0e9c6));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#d0e9c6,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8 ',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#c4e3f3));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#c4e3f3,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#faf2cc));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#faf2cc,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{backgro und-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#ebcccc));background-image:-webkit-linear-gradient(top,#f2dede,0%,#ebcccc,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-gradient(linear,left 0,left 100%,from(#e8e8e8),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#e8e8e8,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0 ,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file
