From 31919d075567a2c6227222c0249653d1d2ed3a84 Mon Sep 17 00:00:00 2001 From: coderfengyun Date: Fri, 21 Mar 2014 09:59:49 +0800 Subject: [PATCH] add Bench4Q-Recorder --- .../Bench4QTestCase/frame1.html | 8 + .../Bench4QTestCase/frameTestCase.html | 16 + .../Bench4QTestCase/images/1.jpg | Bin 0 -> 20731 bytes .../Bench4QTestCase/images/2.jpg | Bin 0 -> 16636 bytes .../Bench4QTestCase/images/3.jpg | Bin 0 -> 19901 bytes .../Bench4QTestCase/images/4.jpg | Bin 0 -> 22149 bytes .../Bench4QTestCase/images/5.jpg | Bin 0 -> 22836 bytes .../Bench4QTestCase/images/6.jpg | Bin 0 -> 22767 bytes .../Bench4QTestCase/script/agentTable.js | 94 + .../Bench4QTestCase/script/base.js | 143 + .../style/bootstrap-cerulean.css | 4453 +++++++++++++++ .../style/bootstrap-classic.css | 4983 +++++++++++++++++ .../Bench4QTestCase/testcase.html | 17 + .../RecordScriptTestCase/baidu.html | 17 + .../gzip/gzipBaiduIRBlankBody.html | 16 + .../gzip/gzipBaiduIRNotHtmlResponse.html | 16 + .../gzip/gzipBaiduIRNullResponseBody.html | 14 + .../gzip/gzipBaiduIRRequest.txt | 15 + .../gzip/gzipBaiduIRResponse.txt | Bin 0 -> 5512 bytes .../gzip/gzipBaiduIRResponseBody.txt | Bin 0 -> 5023 bytes .../gzipBaiduRequestHeader.txt | 10 + .../gzipBaiduResponse.txt | Bin 0 -> 13313 bytes .../gzipBaiduResponseBody.txt | Bin 0 -> 12852 bytes .../gzipChunkedGoogleResponse.txt | Bin 0 -> 22107 bytes .../gzipChunkedGoogleResponseBody.txt | Bin 0 -> 21807 bytes .../responsBodyAfterDeal.txt | 0 .../scriptBriefResultModel.xml | 16 + .../RecordScriptTestCase/simpleResponse.txt | 26 + Bench4Q-Recorder/pom.xml | 25 + .../org/bench4q/recorder/ScriptCapturer.java | 91 + .../bench4q/recorder/httpcapture/Action.java | 147 + .../httpcapture/Bench4qTestScriptAdapter.java | 218 + .../bench4q/recorder/httpcapture/Config.java | 271 + .../recorder/httpcapture/HeaderValue.java | 73 + .../recorder/httpcapture/HttpCapture.java | 128 + .../httpcapture/HttpRequestHeader.java | 290 + .../recorder/httpcapture/HttpTestCase.java | 238 + .../recorder/httpcapture/IScriptAdapter.java | 33 + .../bench4q/recorder/httpcapture/Param.java | 40 + .../recorder/httpcapture/ProxyServer.java | 87 + .../recorder/httpcapture/RequestHandler.java | 212 + .../bench4q/recorder/httpcapture/Test.java | 112 + .../bench4q/recorder/httpcapture/Utils.java | 114 + .../generator/AbstractCodeGenerator.java | 555 ++ .../generator/Bench4qCodeGenerator.java | 367 ++ .../httpcapture/generator/ChildrenUrl.java | 29 + .../httpcapture/generator/ContentDecoder.java | 44 + .../generator/GeneratorFactory.java | 79 + .../httpcapture/generator/GzipDecoder.java | 26 + .../generator/HtmlDocumentParser.java | 54 + .../generator/IScriptGenerator.java | 23 + .../httpcapture/generator/ResponseHeader.java | 74 + .../httpcapture/generator/ResponseParser.java | 165 + .../bench4q/recorder/ContentDecoderTest.java | 40 + .../TestBench4qTestScriptAdapter.java | 45 + .../bench4q/recorder/TestDomGenerator.java | 68 + .../recorder/TestHttpRequestHeader.java | 79 + .../bench4q/recorder/TestParentRequest.java | 199 + .../org/bench4q/recorder/TestRecordBase.java | 49 + .../bench4q/recorder/TestResponseParser.java | 49 + .../recorder/Test_Bench4QCodeGenerator.java | 195 + .../bench4q/recorder/Test_ParamParser.java | 58 + .../java/org/bench4q/recorder/testcase.html | 17 + 63 files changed, 14138 insertions(+) create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/frame1.html create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/frameTestCase.html create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/1.jpg create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/2.jpg create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/3.jpg create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/4.jpg create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/5.jpg create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/6.jpg create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/script/agentTable.js create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/script/base.js create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/style/bootstrap-cerulean.css create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/style/bootstrap-classic.css create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/testcase.html create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/baidu.html create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRBlankBody.html create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRNotHtmlResponse.html create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRNullResponseBody.html create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRRequest.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRResponse.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRResponseBody.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduRequestHeader.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduResponse.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduResponseBody.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzipChunkedGoogleResponse.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/gzipChunkedGoogleResponseBody.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/responsBodyAfterDeal.txt create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/scriptBriefResultModel.xml create mode 100644 Bench4Q-Recorder/RecordScriptTestCase/simpleResponse.txt create mode 100644 Bench4Q-Recorder/pom.xml create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/ScriptCapturer.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Action.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Bench4qTestScriptAdapter.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Config.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HeaderValue.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpCapture.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpRequestHeader.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpTestCase.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/IScriptAdapter.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Param.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/ProxyServer.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/RequestHandler.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Test.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Utils.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/AbstractCodeGenerator.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/Bench4qCodeGenerator.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ChildrenUrl.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ContentDecoder.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/GeneratorFactory.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/GzipDecoder.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/HtmlDocumentParser.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/IScriptGenerator.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseHeader.java create mode 100644 Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseParser.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/ContentDecoderTest.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestBench4qTestScriptAdapter.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestDomGenerator.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestHttpRequestHeader.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestParentRequest.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestRecordBase.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestResponseParser.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/Test_Bench4QCodeGenerator.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/Test_ParamParser.java create mode 100644 Bench4Q-Recorder/src/test/java/org/bench4q/recorder/testcase.html diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/frame1.html b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/frame1.html new file mode 100644 index 00000000..a513d1fa --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/frame1.html @@ -0,0 +1,8 @@ + + +frame1 + + + No this picture + + \ No newline at end of file diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/frameTestCase.html b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/frameTestCase.html new file mode 100644 index 00000000..64bf46f7 --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/frameTestCase.html @@ -0,0 +1,16 @@ + + +Bench4Q Test Case + + + + + + + No this one + No this one + No this one + + + + \ No newline at end of file diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/1.jpg b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9723ecbad64babd6c2213b563ca66743fbf9ad88 GIT binary patch literal 20731 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 z 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 Db{~w9 literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/3.jpg b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ddaaee29f554d1775ea236e4c63ffed6794311d GIT binary patch literal 19901 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 J-&yF{{{d{HDx&}Z literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/4.jpg b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c599a8fcb85a448585d80e75670b447818c82bcf GIT binary patch literal 22149 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 I_5W`I0Nzg-<^TWy literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/6.jpg b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/images/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2c09c35ed4274d0716cc5ec1fd2f6a1752e286f GIT binary patch literal 22767 zcmeIZ1ymhR)-T$)y9c)rAb4;OK@J3WcXzkofdm2vI7kS=-Q6Jx1c%^~U;zT*AOV60 zNw`g9=0Eezo%g-B?z-!~_h$FmUBBA3Yu7I6>h3z#*B`D|0DMI`h#Y``fB-ar2XMX0 z|3lW#-Ua|55H&adr81rc-nE zwf4}obM>N==Huh$rh{k#*S`p?*iWl}LSAkjUJ-5~5pDrG9)1x%L6Lhx06mZ%{>$%h z(2>mFI0nQlPk;F*1y+vxH%1060tslqO~}p5$BmTmt3EJLANe;f0x?43FC7H1j);lB z?6=*>VVFNXdJAGi*f06eP2S(~Nf4v_md}G24fe|i6tFyu-xwdnn7?&CfjW<1U|F~T zunpoU5Tk?s?%gQm{PvTFn;RkL@BM`M8+T#@0Mc)qfB}}9^Q#X|2><{$@0V|P!M?!z zjqiaNKkx5-M)nsB$OXUbi-9&#|02K1b2FA`K&Ap2 z6Xbu@YyV32vusd56J$D&O@D`A0NkYgi9aO*fK5<91(t*aaDyoi!R|x?kDFet08hvu zW&m*mh*1H=pPqaJF&cuu2XTStC5aa*W0f02b z+n`MzP^SQFb)w&8q2hqHZmfVmTo6-$auEJxs^1ul0@NVB=}=s-muddk1dFEy<+7lh z6O=Q6cpStnAZ7%0z`+3Mftgr9IoP>?8Hn$ImT&BMfT!_4cEC8tUohuy{cuo+3&h}H z0Fpt>1LB(*pb5l$p#Du;y#;YPh`_1>lOVn!UsN`XQ)(QaCIfv7v!7nvwEYbsgO?@3 zPu*W}aAbit5dc&vaQ+FozAiC;O0czcl`|1waTMAl=A8&5&PM?UxdGegFsn zIlz6ehj04+UlRf#0VbG(dN+g!T>K3Geu5~=i~QG_gicXSR{p1woV|y$uepacosPAK zr@gBS9SDgk!J%bUvlg_yzk3ds3?k^O-;Y41S}1E;Y+GPFMc3~y}y zH4YA)pMBg9hJW~v{fNKV_>%^z{Uor6pLBDT{db7}M(L*GLCym0UjD`QKj(k&+jusp zbM?~RR6kip^h zH#!Fq8pxkO-Uj&$WMnX%0Aw1F+5e&oCjB2zmXhGLCIbMXvfwy^fb)Z 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 Owzq*xWJAdH-2VUo;n{Ei literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/script/agentTable.js b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/script/agentTable.js new file mode 100644 index 00000000..8ebdd8ca --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/script/agentTable.js @@ -0,0 +1,94 @@ +var table= $('#agents'); +$('.datatable').dataTable({ + "sDom": "<'row-fluid'<'span6'l><'span6'f>>t<'row-fluid'<'span12 center'p>>", + "sPaginationType": "bootstrap", + "oLanguage": { + "sLengthMenu": "_MENU_ records per page" + } +} ); + + +$('.btn-setting').click(function(e){ +e.preventDefault(); +$("#agentParam").modal('show'); +}); +$(document).ready(function() { + loadAgents(table); + +}); +function cancel(){ + $("#agentParam").modal('hide'); +} +function loadAgents() { + table.dataTable().fnClearTable(); + $.post("loadAgents", {}, function(data) { + if (data!=null) { + for (var i = 0; i'+ + '

'+ + ''+ + '' + ); + var els = $('a', nPaging); + $(els[0]).bind( 'click.DT', { action: "previous" }, fnClickHandler ); + $(els[1]).bind( 'click.DT', { action: "next" }, fnClickHandler ); + }, + + "fnUpdate": function ( oSettings, fnDraw ) { + var iListLength = 5; + var oPaging = oSettings.oInstance.fnPagingInfo(); + var an = oSettings.aanFeatures.p; + var i, j, sClass, iStart, iEnd, iHalf=Math.floor(iListLength/2); + + if ( oPaging.iTotalPages < iListLength) { + iStart = 1; + iEnd = oPaging.iTotalPages; + } + else if ( oPaging.iPage <= iHalf ) { + iStart = 1; + iEnd = iListLength; + } else if ( oPaging.iPage >= (oPaging.iTotalPages-iHalf) ) { + iStart = oPaging.iTotalPages - iListLength + 1; + iEnd = oPaging.iTotalPages; + } else { + iStart = oPaging.iPage - iHalf + 1; + iEnd = iStart + iListLength - 1; + } + + for ( i=0, iLen=an.length ; i'+j+'') + .insertBefore( $('li:last', an[i])[0] ) + .bind('click', function (e) { + e.preventDefault(); + oSettings._iDisplayStart = (parseInt($('a', this).text(),10)-1) * oPaging.iLength; + fnDraw( oSettings ); + } ); + } + + // add / remove disabled classes from the static elements + if ( oPaging.iPage === 0 ) { + $('li:first', an[i]).addClass('disabled'); + } else { + $('li:first', an[i]).removeClass('disabled'); + } + + if ( oPaging.iPage === oPaging.iTotalPages-1 || oPaging.iTotalPages === 0 ) { + $('li:last', an[i]).addClass('disabled'); + } else { + $('li:last', an[i]).removeClass('disabled'); + } + } + } + } +}); +function loadProperties(){ + jQuery.i18n.properties({// 加载资浏览器语言对应的资源文件 + name:'i18n', // 资源文件名称 + path:'i18n/', // 资源文件路径 + mode:'map', // 用 Map 的方式使用资源文件中的值 + } ); + } diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/style/bootstrap-cerulean.css b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/style/bootstrap-cerulean.css new file mode 100644 index 00000000..281ed9fa --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/style/bootstrap-cerulean.css @@ -0,0 +1,4453 @@ +@import url(http://fonts.googleapis.com/css?family=Karla|Ubuntu); +/*! + * Bootstrap v2.0.4 + * + * Copyright 2012 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 @twitter by @mdo and @fat. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, +a:active { + outline: 0; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} +#map_canvas img { + max-width: none; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, +input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +.clearfix { + *zoom: 1; +} +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} +body { + margin: 0; + font-family: "Ubuntu", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #555555; + background-color: #ffffff; + text-shadow:0 -1px 1px rgba(0, 0, 0, 0.2) +} +a { + color: #369bd7; + text-decoration: none; +} +a:hover { + color: #2071a1; + text-decoration: underline; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, +.row:after { + display: table; + content: ""; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + margin-left: 20px; +} +.container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.span12 { + width: 940px; +} +.span11 { + width: 860px; +} +.span10 { + width: 780px; +} +.span9 { + width: 700px; +} +.span8 { + width: 620px; +} +.span7 { + width: 540px; +} +.span6 { + width: 460px; +} +.span5 { + width: 380px; +} +.span4 { + width: 300px; +} +.span3 { + width: 220px; +} +.span2 { + width: 140px; +} +.span1 { + width: 60px; +} +.offset12 { + margin-left: 980px; +} +.offset11 { + margin-left: 900px; +} +.offset10 { + margin-left: 820px; +} +.offset9 { + margin-left: 740px; +} +.offset8 { + margin-left: 660px; +} +.offset7 { + margin-left: 580px; +} +.offset6 { + margin-left: 500px; +} +.offset5 { + margin-left: 420px; +} +.offset4 { + margin-left: 340px; +} +.offset3 { + margin-left: 260px; +} +.offset2 { + margin-left: 180px; +} +.offset1 { + margin-left: 100px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; +} +.row-fluid:after { + clear: both; +} +.row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.127659574%; + *margin-left: 2.0744680846382977%; +} +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .span12 { + width: 99.99999998999999%; + *width: 99.94680850063828%; +} +.row-fluid .span11 { + width: 91.489361693%; + *width: 91.4361702036383%; +} +.row-fluid .span10 { + width: 82.97872339599999%; + *width: 82.92553190663828%; +} +.row-fluid .span9 { + width: 74.468085099%; + *width: 74.4148936096383%; +} +.row-fluid .span8 { + width: 65.95744680199999%; + *width: 65.90425531263828%; +} +.row-fluid .span7 { + width: 57.446808505%; + *width: 57.3936170156383%; +} +.row-fluid .span6 { + width: 48.93617020799999%; + *width: 48.88297871863829%; +} +.row-fluid .span5 { + width: 40.425531911%; + *width: 40.3723404216383%; +} +.row-fluid .span4 { + width: 31.914893614%; + *width: 31.8617021246383%; +} +.row-fluid .span3 { + width: 23.404255317%; + *width: 23.3510638276383%; +} +.row-fluid .span2 { + width: 14.89361702%; + *width: 14.8404255306383%; +} +.row-fluid .span1 { + width: 6.382978723%; + *width: 6.329787233638298%; +} +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} +.container:before, +.container:after { + display: table; + content: ""; +} +.container:after { + clear: both; +} +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 9px; +} +p small { + font-size: 11px; + color: #999999; +} +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-family: 'Karla', sans-serif; + font-weight: bold; + color: #317eac; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} +h1 { + font-size: 30px; + line-height: 36px; +} +h1 small { + font-size: 18px; +} +h2 { + font-size: 24px; + line-height: 36px; +} +h2 small { + font-size: 18px; +} +h3 { + font-size: 18px; + line-height: 27px; +} +h3 small { + font-size: 14px; +} +h4, +h5, +h6 { + line-height: 18px; +} +h4 { + font-size: 14px; +} +h4 small { + font-size: 12px; +} +h5 { + font-size: 12px; +} +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #f5f5f5; +} +.page-header h1 { + line-height: 1; +} +ul, +ol { + padding: 0; + margin: 0 0 9px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +ul { + list-style: disc; +} +ol { + list-style: decimal; +} +li { + line-height: 18px; +} +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} +dl { + margin-bottom: 18px; +} +dt, +dd { + line-height: 18px; +} +dt { + font-weight: bold; + line-height: 17px; +} +dd { + margin-left: 9px; +} +.dl-horizontal dt { + float: left; + width: 120px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dl-horizontal dd { + margin-left: 130px; +} +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #f5f5f5; + border-bottom: 1px solid #ffffff; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +.muted { + color: #999999; +} +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #f5f5f5; +} +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #f5f5f5; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 18px; + font-style: normal; + line-height: 18px; +} +small { + font-size: 100%; +} +cite { + font-style: normal; +} +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12.025px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 18px; +} +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +form { + margin: 0 0 18px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +legend small { + font-size: 13.5px; + color: #999999; +} +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +label { + display: block; + margin-bottom: 5px; +} +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; +} +input, +textarea { + width: 210px; +} +textarea { + height: auto; +} +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); +} +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + cursor: pointer; +} +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} +.uneditable-textarea { + width: auto; + height: auto; +} +select, +input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} +select { + width: 220px; + border: 1px solid #bbb; +} +select[multiple], +select[size] { + height: auto; +} +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} +input, +textarea, +.uneditable-input { + margin-left: 0; +} +input.span12, textarea.span12, .uneditable-input.span12 { + width: 930px; +} +input.span11, textarea.span11, .uneditable-input.span11 { + width: 850px; +} +input.span10, textarea.span10, .uneditable-input.span10 { + width: 770px; +} +input.span9, textarea.span9, .uneditable-input.span9 { + width: 690px; +} +input.span8, textarea.span8, .uneditable-input.span8 { + width: 610px; +} +input.span7, textarea.span7, .uneditable-input.span7 { + width: 530px; +} +input.span6, textarea.span6, .uneditable-input.span6 { + width: 450px; +} +input.span5, textarea.span5, .uneditable-input.span5 { + width: 370px; +} +input.span4, textarea.span4, .uneditable-input.span4 { + width: 290px; +} +input.span3, textarea.span3, .uneditable-input.span3 { + width: 210px; +} +input.span2, textarea.span2, .uneditable-input.span2 { + width: 130px; +} +input.span1, textarea.span1, .uneditable-input.span1 { + width: 50px; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #f5f5f5; + border-color: #ddd; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #1c628b; +} +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #1c628b; + border-color: #1c628b; +} +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #134461; + -webkit-box-shadow: 0 0 6px #369bd7; + -moz-box-shadow: 0 0 6px #369bd7; + box-shadow: 0 0 6px #369bd7; +} +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #1c628b; + background-color: #8bc5e8; + border-color: #1c628b; +} +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #bd4247; +} +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #bd4247; + border-color: #bd4247; +} +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #983538; + -webkit-box-shadow: 0 0 6px #d88e90; + -moz-box-shadow: 0 0 6px #d88e90; + box-shadow: 0 0 6px #d88e90; +} +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #bd4247; + background-color: #eddbe3; + border-color: #bd4247; +} +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #669533; +} +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #669533; + border-color: #669533; +} +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #4c6f26; + -webkit-box-shadow: 0 0 6px #99ca63; + -moz-box-shadow: 0 0 6px #99ca63; + box-shadow: 0 0 6px #99ca63; +} +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #669533; + background-color: #ccddbb; + border-color: #669533; +} +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} +.form-actions:before, +.form-actions:after { + display: table; + content: ""; +} +.form-actions:after { + clear: both; +} +.uneditable-input { + overflow: hidden; + white-space: nowrap; + cursor: not-allowed; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} +:-moz-placeholder { + color: #999999; +} +:-ms-input-placeholder { + color: #999999; +} +::-webkit-input-placeholder { + color: #999999; +} +.help-block, +.help-inline { + color: #555555; +} +.help-block { + display: block; + margin-bottom: 9px; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + vertical-align: middle; + padding-left: 5px; +} +.input-prepend, +.input-append { + margin-bottom: 5px; +} +.input-prepend input, +.input-append input, +.input-prepend select, +.input-append select, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: middle; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-prepend input:focus, +.input-append input:focus, +.input-prepend select:focus, +.input-append select:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + z-index: 2; +} +.input-prepend .uneditable-input, +.input-append .uneditable-input { + border-left-color: #ccc; +} +.input-prepend .add-on, +.input-append .add-on { + display: inline-block; + width: auto; + height: 18px; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #f5f5f5; + border: 1px solid #ccc; +} +.input-prepend .add-on, +.input-append .add-on, +.input-prepend .btn, +.input-append .btn { + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-prepend .active, +.input-append .active { + background-color: #bede9c; + border-color: #73a839; +} +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append .uneditable-input { + border-right-color: #ccc; + border-left-color: #eee; +} +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 0; +} +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} +.form-search label, +.form-inline label { + display: inline-block; +} +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} +.control-group { + margin-bottom: 9px; +} +legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} +.form-horizontal .controls:first-child { + *padding-left: 160px; +} +.form-horizontal .help-block { + margin-top: 9px; + margin-bottom: 0; +} +.form-horizontal .form-actions { + padding-left: 160px; +} +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 18px; +} +.table th, +.table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table th { + font-weight: bold; +} +.table thead th { + vertical-align: bottom; +} +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #dddddd; +} +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapsed; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} +.table tbody tr:hover td, +.table tbody tr:hover th { + background-color: #f5f5f5; +} +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} +[class^="icon-"]:last-child, +[class*=" icon-"]:last-child { + *margin-left: 0; +} +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} +.icon-glass { + background-position: 0 0; +} +.icon-music { + background-position: -24px 0; +} +.icon-search { + background-position: -48px 0; +} +.icon-envelope { + background-position: -72px 0; +} +.icon-heart { + background-position: -96px 0; +} +.icon-star { + background-position: -120px 0; +} +.icon-star-empty { + background-position: -144px 0; +} +.icon-user { + background-position: -168px 0; +} +.icon-film { + background-position: -192px 0; +} +.icon-th-large { + background-position: -216px 0; +} +.icon-th { + background-position: -240px 0; +} +.icon-th-list { + background-position: -264px 0; +} +.icon-ok { + background-position: -288px 0; +} +.icon-remove { + background-position: -312px 0; +} +.icon-zoom-in { + background-position: -336px 0; +} +.icon-zoom-out { + background-position: -360px 0; +} +.icon-off { + background-position: -384px 0; +} +.icon-signal { + background-position: -408px 0; +} +.icon-cog { + background-position: -432px 0; +} +.icon-trash { + background-position: -456px 0; +} +.icon-home { + background-position: 0 -24px; +} +.icon-file { + background-position: -24px -24px; +} +.icon-time { + background-position: -48px -24px; +} +.icon-road { + background-position: -72px -24px; +} +.icon-download-alt { + background-position: -96px -24px; +} +.icon-download { + background-position: -120px -24px; +} +.icon-upload { + background-position: -144px -24px; +} +.icon-inbox { + background-position: -168px -24px; +} +.icon-play-circle { + background-position: -192px -24px; +} +.icon-repeat { + background-position: -216px -24px; +} +.icon-refresh { + background-position: -240px -24px; +} +.icon-list-alt { + background-position: -264px -24px; +} +.icon-lock { + background-position: -287px -24px; +} +.icon-flag { + background-position: -312px -24px; +} +.icon-headphones { + background-position: -336px -24px; +} +.icon-volume-off { + background-position: -360px -24px; +} +.icon-volume-down { + background-position: -384px -24px; +} +.icon-volume-up { + background-position: -408px -24px; +} +.icon-qrcode { + background-position: -432px -24px; +} +.icon-barcode { + background-position: -456px -24px; +} +.icon-tag { + background-position: 0 -48px; +} +.icon-tags { + background-position: -25px -48px; +} +.icon-book { + background-position: -48px -48px; +} +.icon-bookmark { + background-position: -72px -48px; +} +.icon-print { + background-position: -96px -48px; +} +.icon-camera { + background-position: -120px -48px; +} +.icon-font { + background-position: -144px -48px; +} +.icon-bold { + background-position: -167px -48px; +} +.icon-italic { + background-position: -192px -48px; +} +.icon-text-height { + background-position: -216px -48px; +} +.icon-text-width { + background-position: -240px -48px; +} +.icon-align-left { + background-position: -264px -48px; +} +.icon-align-center { + background-position: -288px -48px; +} +.icon-align-right { + background-position: -312px -48px; +} +.icon-align-justify { + background-position: -336px -48px; +} +.icon-list { + background-position: -360px -48px; +} +.icon-indent-left { + background-position: -384px -48px; +} +.icon-indent-right { + background-position: -408px -48px; +} +.icon-facetime-video { + background-position: -432px -48px; +} +.icon-picture { + background-position: -456px -48px; +} +.icon-pencil { + background-position: 0 -72px; +} +.icon-map-marker { + background-position: -24px -72px; +} +.icon-adjust { + background-position: -48px -72px; +} +.icon-tint { + background-position: -72px -72px; +} +.icon-edit { + background-position: -96px -72px; +} +.icon-share { + background-position: -120px -72px; +} +.icon-check { + background-position: -144px -72px; +} +.icon-move { + background-position: -168px -72px; +} +.icon-step-backward { + background-position: -192px -72px; +} +.icon-fast-backward { + background-position: -216px -72px; +} +.icon-backward { + background-position: -240px -72px; +} +.icon-play { + background-position: -264px -72px; +} +.icon-pause { + background-position: -288px -72px; +} +.icon-stop { + background-position: -312px -72px; +} +.icon-forward { + background-position: -336px -72px; +} +.icon-fast-forward { + background-position: -360px -72px; +} +.icon-step-forward { + background-position: -384px -72px; +} +.icon-eject { + background-position: -408px -72px; +} +.icon-chevron-left { + background-position: -432px -72px; +} +.icon-chevron-right { + background-position: -456px -72px; +} +.icon-plus-sign { + background-position: 0 -96px; +} +.icon-minus-sign { + background-position: -24px -96px; +} +.icon-remove-sign { + background-position: -48px -96px; +} +.icon-ok-sign { + background-position: -72px -96px; +} +.icon-question-sign { + background-position: -96px -96px; +} +.icon-info-sign { + background-position: -120px -96px; +} +.icon-screenshot { + background-position: -144px -96px; +} +.icon-remove-circle { + background-position: -168px -96px; +} +.icon-ok-circle { + background-position: -192px -96px; +} +.icon-ban-circle { + background-position: -216px -96px; +} +.icon-arrow-left { + background-position: -240px -96px; +} +.icon-arrow-right { + background-position: -264px -96px; +} +.icon-arrow-up { + background-position: -289px -96px; +} +.icon-arrow-down { + background-position: -312px -96px; +} +.icon-share-alt { + background-position: -336px -96px; +} +.icon-resize-full { + background-position: -360px -96px; +} +.icon-resize-small { + background-position: -384px -96px; +} +.icon-plus { + background-position: -408px -96px; +} +.icon-minus { + background-position: -433px -96px; +} +.icon-asterisk { + background-position: -456px -96px; +} +.icon-exclamation-sign { + background-position: 0 -120px; +} +.icon-gift { + background-position: -24px -120px; +} +.icon-leaf { + background-position: -48px -120px; +} +.icon-fire { + background-position: -72px -120px; +} +.icon-eye-open { + background-position: -96px -120px; +} +.icon-eye-close { + background-position: -120px -120px; +} +.icon-warning-sign { + background-position: -144px -120px; +} +.icon-plane { + background-position: -168px -120px; +} +.icon-calendar { + background-position: -192px -120px; +} +.icon-random { + background-position: -216px -120px; +} +.icon-comment { + background-position: -240px -120px; +} +.icon-magnet { + background-position: -264px -120px; +} +.icon-chevron-up { + background-position: -288px -120px; +} +.icon-chevron-down { + background-position: -313px -119px; +} +.icon-retweet { + background-position: -336px -120px; +} +.icon-shopping-cart { + background-position: -360px -120px; +} +.icon-folder-close { + background-position: -384px -120px; +} +.icon-folder-open { + background-position: -408px -120px; +} +.icon-resize-vertical { + background-position: -432px -119px; +} +.icon-resize-horizontal { + background-position: -456px -118px; +} +.icon-hdd { + background-position: 0 -144px; +} +.icon-bullhorn { + background-position: -24px -144px; +} +.icon-bell { + background-position: -48px -144px; +} +.icon-certificate { + background-position: -72px -144px; +} +.icon-thumbs-up { + background-position: -96px -144px; +} +.icon-thumbs-down { + background-position: -120px -144px; +} +.icon-hand-right { + background-position: -144px -144px; +} +.icon-hand-left { + background-position: -168px -144px; +} +.icon-hand-up { + background-position: -192px -144px; +} +.icon-hand-down { + background-position: -216px -144px; +} +.icon-circle-arrow-right { + background-position: -240px -144px; +} +.icon-circle-arrow-left { + background-position: -264px -144px; +} +.icon-circle-arrow-up { + background-position: -288px -144px; +} +.icon-circle-arrow-down { + background-position: -312px -144px; +} +.icon-globe { + background-position: -336px -144px; +} +.icon-wrench { + background-position: -360px -144px; +} +.icon-tasks { + background-position: -384px -144px; +} +.icon-filter { + background-position: -408px -144px; +} +.icon-briefcase { + background-position: -432px -144px; +} +.icon-fullscreen { + background-position: -456px -144px; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + opacity: 0.3; + filter: alpha(opacity=30); +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown:hover .caret, +.open .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #333333; + white-space: nowrap; +} +.dropdown-menu li > a:hover, +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #369bd7; +} +.open { + *z-index: 1000; +} +.open > .dropdown-menu { + display: block; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: "\2191"; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} +.collapse.in { + height: auto; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.btn { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding: 4px 10px 4px; + margin-bottom: 0; + font-size: 13px; + line-height: 18px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e6e6e6; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border: 1px solid #cccccc; + *border: 0; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; + *background-color: #d9d9d9; +} +.btn:active, +.btn.active { + background-color: #cccccc \9; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-large [class^="icon-"] { + margin-top: 1px; +} +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} +.btn-small [class^="icon-"] { + margin-top: -1px; +} +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} +.btn { + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} +.btn-primary { + background-color: #368bd7; + background-image: -moz-linear-gradient(top, #369bd7, #3673d7); + background-image: -ms-linear-gradient(top, #369bd7, #3673d7); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#369bd7), to(#3673d7)); + background-image: -webkit-linear-gradient(top, #369bd7, #3673d7); + background-image: -o-linear-gradient(top, #369bd7, #3673d7); + background-image: linear-gradient(top, #369bd7, #3673d7); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#369bd7', endColorstr='#3673d7', GradientType=0); + border-color: #3673d7 #3673d7 #2050a1; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #3673d7; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #3673d7; + *background-color: #2866cb; +} +.btn-primary:active, +.btn-primary.active { + background-color: #245bb6 \9; +} +.btn-warning { + background-color: #dd5600; + background-image: -moz-linear-gradient(top, #dd5600, #dd5600); + background-image: -ms-linear-gradient(top, #dd5600, #dd5600); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#dd5600), to(#dd5600)); + background-image: -webkit-linear-gradient(top, #dd5600, #dd5600); + background-image: -o-linear-gradient(top, #dd5600, #dd5600); + background-image: linear-gradient(top, #dd5600, #dd5600); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd5600', endColorstr='#dd5600', GradientType=0); + border-color: #dd5600 #dd5600 #913800; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #dd5600; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #dd5600; + *background-color: #c44c00; +} +.btn-warning:active, +.btn-warning.active { + background-color: #aa4200 \9; +} +.btn-danger { + background-color: #c32627; + background-image: -moz-linear-gradient(top, #c71c22, #bd362f); + background-image: -ms-linear-gradient(top, #c71c22, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#c71c22), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #c71c22, #bd362f); + background-image: -o-linear-gradient(top, #c71c22, #bd362f); + background-image: linear-gradient(top, #c71c22, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c71c22', endColorstr='#bd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #bd362f; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; + *background-color: #a9302a; +} +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + background-color: #65a643; + background-image: -moz-linear-gradient(top, #73a839, #51a351); + background-image: -ms-linear-gradient(top, #73a839, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#73a839), to(#51a351)); + background-image: -webkit-linear-gradient(top, #73a839, #51a351); + background-image: -o-linear-gradient(top, #73a839, #51a351); + background-image: linear-gradient(top, #73a839, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#73a839', endColorstr='#51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #51a351; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; + *background-color: #499249; +} +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} +.btn-info { + background-color: #6d76b3; + background-image: -moz-linear-gradient(top, #9760b3, #2f96b4); + background-image: -ms-linear-gradient(top, #9760b3, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#9760b3), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #9760b3, #2f96b4); + background-image: -o-linear-gradient(top, #9760b3, #2f96b4); + background-image: linear-gradient(top, #9760b3, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9760b3', endColorstr='#2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #2f96b4; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; + *background-color: #2a85a0; +} +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} +.btn-inverse { + background-color: #a27a28; + background-image: -moz-linear-gradient(top, #f7b42c, #222222); + background-image: -ms-linear-gradient(top, #f7b42c, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f7b42c), to(#222222)); + background-image: -webkit-linear-gradient(top, #f7b42c, #222222); + background-image: -o-linear-gradient(top, #f7b42c, #222222); + background-image: linear-gradient(top, #f7b42c, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b42c', endColorstr='#222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #222222; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #222222; + *background-color: #151515; +} +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} +button.btn, +input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} +.btn-group { + position: relative; + *zoom: 1; + *margin-left: .3em; +} +.btn-group:before, +.btn-group:after { + display: table; + content: ""; +} +.btn-group:after { + clear: both; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group > .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + *padding-top: 4px; + *padding-bottom: 4px; +} +.btn-group > .btn-mini.dropdown-toggle { + padding-left: 5px; + padding-right: 5px; +} +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} +.btn-group > .btn-large.dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #3673d7; +} +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #dd5600; +} +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} +.btn .caret { + margin-top: 7px; + margin-left: 0; +} +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.btn-mini .caret { + margin-top: 5px; +} +.btn-small .caret { + margin-top: 6px; +} +.btn-large .caret { + margin-top: 6px; + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +.dropup .btn-large .caret { + border-bottom: 5px solid #000000; + border-top: 0; +} +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #8bc5e8; + border: 1px solid #7ed0e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + color: #1c628b; +} +.alert-heading { + color: inherit; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} +.alert-success { + background-color: #ccddbb; + border-color: #c6d4aa; + color: #669533; +} +.alert-danger, +.alert-error { + background-color: #eddbe3; + border-color: #e8d1df; + color: #bd4247; +} +.alert-info { + background-color: #edebe1; + border-color: #e0d9cb; + color: #817b58; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +.nav { + margin-left: 0; + margin-bottom: 18px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.nav > .pull-right { + float: right; +} +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} +.nav li + .nav-header { + margin-top: 9px; +} +.nav-list { + padding-left: 15px; + padding-right: 15px; + margin-bottom: 0; +} +.nav-list > li > a, +.nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #369bd7; +} +.nav-list [class^="icon-"] { + margin-right: 2px; +} +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.nav-tabs, +.nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} +.nav-tabs:after, +.nav-pills:after { + clear: both; +} +.nav-tabs > li, +.nav-pills > li { + float: left; +} +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 18px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #f5f5f5 #f5f5f5 #dddddd; +} +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #369bd7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.nav-tabs.nav-stacked > li > a:hover { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.nav-tabs .dropdown-toggle .caret, +.nav-pills .dropdown-toggle .caret { + border-top-color: #369bd7; + border-bottom-color: #369bd7; + margin-top: 6px; +} +.nav-tabs .dropdown-toggle:hover .caret, +.nav-pills .dropdown-toggle:hover .caret { + border-top-color: #2071a1; + border-bottom-color: #2071a1; +} +.nav-tabs .active .dropdown-toggle .caret, +.nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, +.tabbable:after { + display: table; + content: ""; +} +.tabbable:after { + clear: both; +} +.tab-content { + overflow: auto; +} +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-below > .nav-tabs > li > a:hover { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-left > .nav-tabs > li > a:hover { + border-color: #f5f5f5 #dddddd #f5f5f5 #f5f5f5; +} +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-right > .nav-tabs > li > a:hover { + border-color: #f5f5f5 #f5f5f5 #f5f5f5 #dddddd; +} +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.navbar { + *position: relative; + *z-index: 2; + overflow: visible; + margin-bottom: 18px; +} +.navbar-inner { + min-height: 40px; + padding-left: 20px; + padding-right: 20px; + background-color: #50a8dc; + background-image: -moz-linear-gradient(top, #61b0df, #369bd7); + background-image: -ms-linear-gradient(top, #61b0df, #369bd7); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#61b0df), to(#369bd7)); + background-image: -webkit-linear-gradient(top, #61b0df, #369bd7); + background-image: -o-linear-gradient(top, #61b0df, #369bd7); + background-image: linear-gradient(top, #61b0df, #369bd7); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#61b0df', endColorstr='#369bd7', GradientType=0); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); + -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); + box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); +} +.navbar .container { + width: auto; +} +.nav-collapse.collapse { + height: auto; +} +.navbar { + color: #f5f5f5; +} +.navbar .brand:hover { + text-decoration: none; +} +.navbar .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #f5f5f5; +} +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; +} +.navbar .navbar-link { + color: #f5f5f5; +} +.navbar .navbar-link:hover { + color: #ffffff; +} +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn { + margin: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input, +.navbar-form select { + display: inline-block; + margin-bottom: 0; +} +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + background-color: #a0d0ec; + border: 1px solid #288ecb; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} +.navbar-search .search-query:-moz-placeholder { + color: #ffffff; +} +.navbar-search .search-query:-ms-input-placeholder { + color: #ffffff; +} +.navbar-search .search-query::-webkit-input-placeholder { + color: #ffffff; +} +.navbar-search .search-query:focus, +.navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.navbar-fixed-top { + top: 0; +} +.navbar-fixed-bottom { + bottom: 0; +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; +} +.navbar .nav > li { + display: block; + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 9px 10px 11px; + line-height: 19px; + color: #f5f5f5; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + border-right: 1px solid #3887B3; + border-left: 1px solid #3887B3; +} +.navbar .btn { + display: inline-block; + padding: 4px 10px 4px; + margin: 5px 5px 6px; + line-height: 18px; +} +.navbar .btn-group { + margin: 0; + padding: 5px 5px 6px; +} +.navbar .nav > li > a:hover { + background-color: transparent; + color: #ffffff; + text-decoration: none; +} +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: rgba(0, 0, 0, 0.2); +} +.navbar .divider-vertical { + height: 40px; + width: 1px; + margin: 0 9px; + overflow: hidden; + background-color: #369bd7; + border-right: 1px solid #61b0df; +} +.navbar .nav.pull-right { + margin-left: 10px; + margin-right: 0; +} +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + background-color: #50a8dc; + background-image: -moz-linear-gradient(top, #61b0df, #369bd7); + background-image: -ms-linear-gradient(top, #61b0df, #369bd7); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#61b0df), to(#369bd7)); + background-image: -webkit-linear-gradient(top, #61b0df, #369bd7); + background-image: -o-linear-gradient(top, #61b0df, #369bd7); + background-image: linear-gradient(top, #61b0df, #369bd7); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#61b0df', endColorstr='#369bd7', GradientType=0); + border-color: #369bd7 #369bd7 #2071a1; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #369bd7; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); +} +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + background-color: #369bd7; + *background-color: #288ecb; +} +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #2480b6 \9; +} +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.navbar .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar-fixed-bottom .dropdown-menu:before { + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + border-bottom: 0; + bottom: -7px; + top: auto; +} +.navbar-fixed-bottom .dropdown-menu:after { + border-top: 6px solid #ffffff; + border-bottom: 0; + bottom: -6px; + top: auto; +} +.navbar .nav li.dropdown .dropdown-toggle .caret, +.navbar .nav li.dropdown.open .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar .nav li.dropdown.active .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: transparent; +} +.navbar .nav li.dropdown.active > .dropdown-toggle:hover { + color: #ffffff; +} +.navbar .pull-right .dropdown-menu, +.navbar .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar .pull-right .dropdown-menu:before, +.navbar .dropdown-menu.pull-right:before { + left: auto; + right: 12px; +} +.navbar .pull-right .dropdown-menu:after, +.navbar .dropdown-menu.pull-right:after { + left: auto; + right: 13px; +} +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + list-style: none; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} +.breadcrumb li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} +.breadcrumb .active a { + color: #333333; +} +.pagination { + height: 36px; + margin: 18px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination li { + display: inline; +} +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} +.pagination a:hover, +.pagination .active a { + background-color: #f5f5f5; +} +.pagination .active a { + color: #999999; + cursor: default; +} +.pagination .disabled span, +.pagination .disabled a, +.pagination .disabled a:hover { + color: #999999; + background-color: transparent; + cursor: default; +} +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pager { + margin-left: 0; + margin-bottom: 18px; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, +.pager:after { + display: table; + content: ""; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next a { + float: right; +} +.pager .previous a { + float: left; +} +.pager .disabled a, +.pager .disabled a:hover { + color: #999999; + background-color: #fff; + cursor: default; +} +.modal-open .dropdown-menu { + z-index: 2050; +} +.modal-open .dropdown.open { + *z-index: 2050; +} +.modal-open .popover { + z-index: 2060; +} +.modal-open .tooltip { + z-index: 2070; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + overflow: auto; + width: 560px; + margin: -250px 0 0 -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.modal.fade { + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -ms-transition: opacity .3s linear, top .3s ease-out; + -o-transition: opacity .3s linear, top .3s ease-out; + transition: opacity .3s linear, top .3s ease-out; + top: -25%; +} +.modal.fade.in { + top: 50%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-body { + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +.modal-form { + margin-bottom: 0; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; + *zoom: 1; +} +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.tooltip { + position: absolute; + z-index: 1020; + display: block; + visibility: visible; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -2px; +} +.tooltip.right { + margin-left: 2px; +} +.tooltip.bottom { + margin-top: 2px; +} +.tooltip.left { + margin-left: -2px; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 5px solid #000000; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} +.popover.top { + margin-top: -5px; +} +.popover.right { + margin-left: 5px; +} +.popover.bottom { + margin-top: 5px; +} +.popover.left { + margin-left: -5px; +} +.popover.top .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000000; +} +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 5px solid #000000; +} +.popover.bottom .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; +} +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} +.popover-inner { + padding: 3px; + width: 280px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} +.popover-title { + padding: 9px 15px; + line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; +} +.popover-content { + padding: 14px; + background-color: #ffffff; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; +} +.thumbnails:after { + clear: both; +} +.row-fluid .thumbnails { + margin-left: 0; +} +.thumbnails > li { + float: left; + margin-bottom: 18px; + margin-left: 20px; +} +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} +a.thumbnail:hover { + border-color: #369bd7; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; +} +.label, +.badge { + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; +} +.label { + padding: 1px 4px 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label-important, +.badge-important { + background-color: #bd4247; +} +.label-important[href], +.badge-important[href] { + background-color: #983538; +} +.label-warning, +.badge-warning { + background-color: #dd5600; +} +.label-warning[href], +.badge-warning[href] { + background-color: #aa4200; +} +.label-success, +.badge-success { + background-color: #669533; +} +.label-success[href], +.badge-success[href] { + background-color: #4c6f26; +} +.label-info, +.badge-info { + background-color: #817b58; +} +.label-info[href], +.badge-info[href] { + background-color: #625e43; +} +.label-inverse, +.badge-inverse { + background-color: #333333; +} +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 18px; + margin-bottom: 18px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 18px; + color: #ffffff; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); +} +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); +} +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); +} +.progress-warning .bar { + background-color: #f16e1a; + background-image: -moz-linear-gradient(top, #ff7d2b, #dd5600); + background-image: -ms-linear-gradient(top, #ff7d2b, #dd5600); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ff7d2b), to(#dd5600)); + background-image: -webkit-linear-gradient(top, #ff7d2b, #dd5600); + background-image: -o-linear-gradient(top, #ff7d2b, #dd5600); + background-image: linear-gradient(top, #ff7d2b, #dd5600); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff7d2b', endColorstr='#dd5600', GradientType=0); +} +.progress-warning.progress-striped .bar { + background-color: #ff7d2b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); +} +.accordion { + margin-bottom: 18px; +} +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} +.accordion-toggle { + cursor: pointer; +} +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} +.carousel .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel .item > img { + display: block; + line-height: 1; +} +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} +.carousel .active { + left: 0; +} +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel .next { + left: 100%; +} +.carousel .prev { + left: -100%; +} +.carousel .next.left, +.carousel .prev.right { + left: 0; +} +.carousel .active.left { + left: -100%; +} +.carousel .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.carousel-control.right { + left: auto; + right: 15px; +} +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #f5f5f5; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + color: inherit; + letter-spacing: -1px; +} +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; + color: inherit; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} +.navbar,.top-block { + font-family: 'Karla', sans-serif; +} +.navbar .navbar-inner { + background-color: #3f9fd9; +} +.navbar-inner{ + background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(0,0,0,0.15) 50%, rgba(30,30,30,0) 100%); +background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0)), color-stop(50%,rgba(0,0,0,0.15)), color-stop(100%,rgba(30,30,30,0))); +background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(0,0,0,0.15) 50%,rgba(30,30,30,0) 100%); +background: -o-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(0,0,0,0.15) 50%,rgba(30,30,30,0) 100%); +background: -ms-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(0,0,0,0.15) 50%,rgba(30,30,30,0) 100%); +background: linear-gradient(to bottom, rgba(255,255,255,0) 0%,rgba(0,0,0,0.15) 50%,rgba(30,30,30,0) 100%); +filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#001e1e1e',GradientType=0 ); +} +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.active.open > .dropdown-toggle { + background-color: rgba(0, 0, 0, 0.2); +} +.navbar .search-query { + border: 1px solid #2480b6; +} +.navbar .nav-collapse.in > .nav > li .dropdown-menu a { + color: #ffffff; +} +.navbar .nav-collapse.in > .nav > li .dropdown-menu a:hover { + color: #ffffff; +} +.navbar .nav-collapse.in .nav li > a { + color: #ffffff; +} +.navbar .nav-collapse.in .nav li > a:hover { + background-color: #2B7CAC; +} +.navbar .btn-navbar:hover { + background-color: #cccccc; +} +div.subnav { + font-family: 'Karla', sans-serif; +} +.btn { + background-color: #ffffff; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(5%, #ffffff), to(#ffffff)); + background-image: -webkit-linear-gradient(#ffffff, #ffffff 5%, #ffffff); + background-image: -moz-linear-gradient(top, #ffffff, #ffffff 5%, #ffffff); + background-image: -ms-linear-gradient(#ffffff, #ffffff 5%, #ffffff); + background-image: -o-linear-gradient(#ffffff, #ffffff 5%, #ffffff); + background-image: linear-gradient(#ffffff, #ffffff 5%, #ffffff); + background-repeat: no-repeat; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ffffff', GradientType=0); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.btn:hover { + background-position: 0 0; +} +.btn-primary { + background-color: #43a1da; + background-image: -moz-linear-gradient(top, #4ba6db, #369bd7); + background-image: -ms-linear-gradient(top, #4ba6db, #369bd7); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#4ba6db), to(#369bd7)); + background-image: -webkit-linear-gradient(top, #4ba6db, #369bd7); + background-image: -o-linear-gradient(top, #4ba6db, #369bd7); + background-image: linear-gradient(top, #4ba6db, #369bd7); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4ba6db', endColorstr='#369bd7', GradientType=0); + border-color: #369bd7 #369bd7 #2071a1; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #369bd7; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #369bd7; + *background-color: #288ecb; +} +.btn-primary:active, +.btn-primary.active { + background-color: #2480b6 \9; +} +.btn-info { + background-color: #9e6ab8; + background-image: -moz-linear-gradient(top, #a271bb, #9760b3); + background-image: -ms-linear-gradient(top, #a271bb, #9760b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#a271bb), to(#9760b3)); + background-image: -webkit-linear-gradient(top, #a271bb, #9760b3); + background-image: -o-linear-gradient(top, #a271bb, #9760b3); + background-image: linear-gradient(top, #a271bb, #9760b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#a271bb', endColorstr='#9760b3', GradientType=0); + border-color: #9760b3 #9760b3 #6f4086; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #9760b3; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #9760b3; + *background-color: #8b51a9; +} +.btn-info:active, +.btn-info.active { + background-color: #7d4898 \9; +} +.btn-success { + background-color: #7bb33d; + background-image: -moz-linear-gradient(top, #80bb3f, #73a839); + background-image: -ms-linear-gradient(top, #80bb3f, #73a839); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#80bb3f), to(#73a839)); + background-image: -webkit-linear-gradient(top, #80bb3f, #73a839); + background-image: -o-linear-gradient(top, #80bb3f, #73a839); + background-image: linear-gradient(top, #80bb3f, #73a839); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80bb3f', endColorstr='#73a839', GradientType=0); + border-color: #73a839 #73a839 #4c6f26; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #73a839; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #73a839; + *background-color: #669533; +} +.btn-success:active, +.btn-success.active { + background-color: #59822c \9; +} +.btn-warning { + background-color: #ec5c00; + background-image: -moz-linear-gradient(top, #f76000, #dd5600); + background-image: -ms-linear-gradient(top, #f76000, #dd5600); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f76000), to(#dd5600)); + background-image: -webkit-linear-gradient(top, #f76000, #dd5600); + background-image: -o-linear-gradient(top, #f76000, #dd5600); + background-image: linear-gradient(top, #f76000, #dd5600); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f76000', endColorstr='#dd5600', GradientType=0); + border-color: #dd5600 #dd5600 #913800; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #dd5600; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #dd5600; + *background-color: #c44c00; +} +.btn-warning:active, +.btn-warning.active { + background-color: #aa4200 \9; +} +.btn-danger { + background-color: #d41e24; + background-image: -moz-linear-gradient(top, #dd1f26, #c71c22); + background-image: -ms-linear-gradient(top, #dd1f26, #c71c22); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#dd1f26), to(#c71c22)); + background-image: -webkit-linear-gradient(top, #dd1f26, #c71c22); + background-image: -o-linear-gradient(top, #dd1f26, #c71c22); + background-image: linear-gradient(top, #dd1f26, #c71c22); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd1f26', endColorstr='#c71c22', GradientType=0); + border-color: #c71c22 #c71c22 #841317; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #c71c22; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #c71c22; + *background-color: #b1191e; +} +.btn-danger:active, +.btn-danger.active { + background-color: #9a161a \9; +} +.btn-inverse { + background-color: #f8b93b; + background-image: -moz-linear-gradient(top, #f8bd45, #f7b42c); + background-image: -ms-linear-gradient(top, #f8bd45, #f7b42c); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f8bd45), to(#f7b42c)); + background-image: -webkit-linear-gradient(top, #f8bd45, #f7b42c); + background-image: -o-linear-gradient(top, #f8bd45, #f7b42c); + background-image: linear-gradient(top, #f8bd45, #f7b42c); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8bd45', endColorstr='#f7b42c', GradientType=0); + border-color: #f7b42c #f7b42c #cf8d08; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #f7b42c; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #f7b42c; + *background-color: #f6ab13; +} +.btn-inverse:active, +.btn-inverse.active { + background-color: #e79e09 \9; +} +i[class^="icon-"] { + opacity: 0.8; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/style/bootstrap-classic.css b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/style/bootstrap-classic.css new file mode 100644 index 00000000..bb40c85f --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/style/bootstrap-classic.css @@ -0,0 +1,4983 @@ +/*! + * Bootstrap v2.0.4 + * + * Copyright 2012 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 @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + margin-left: 20px; +} + +.container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.127659574%; + *margin-left: 2.0744680846382977%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .span12 { + width: 99.99999998999999%; + *width: 99.94680850063828%; +} + +.row-fluid .span11 { + width: 91.489361693%; + *width: 91.4361702036383%; +} + +.row-fluid .span10 { + width: 82.97872339599999%; + *width: 82.92553190663828%; +} + +.row-fluid .span9 { + width: 74.468085099%; + *width: 74.4148936096383%; +} + +.row-fluid .span8 { + width: 65.95744680199999%; + *width: 65.90425531263828%; +} + +.row-fluid .span7 { + width: 57.446808505%; + *width: 57.3936170156383%; +} + +.row-fluid .span6 { + width: 48.93617020799999%; + *width: 48.88297871863829%; +} + +.row-fluid .span5 { + width: 40.425531911%; + *width: 40.3723404216383%; +} + +.row-fluid .span4 { + width: 31.914893614%; + *width: 31.8617021246383%; +} + +.row-fluid .span3 { + width: 23.404255317%; + *width: 23.3510638276383%; +} + +.row-fluid .span2 { + width: 14.89361702%; + *width: 14.8404255306383%; +} + +.row-fluid .span1 { + width: 6.382978723%; + *width: 6.329787233638298%; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 9px; +} + +p small { + font-size: 11px; + color: #999999; +} + +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-family: inherit; + font-weight: bold; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} + +h1 { + font-size: 30px; + line-height: 36px; +} + +h1 small { + font-size: 18px; +} + +h2 { + font-size: 24px; + line-height: 36px; +} + +h2 small { + font-size: 18px; +} + +h3 { + font-size: 18px; + line-height: 27px; +} + +h3 small { + font-size: 14px; +} + +h4, +h5, +h6 { + line-height: 18px; +} + +h4 { + font-size: 14px; +} + +h4 small { + font-size: 12px; +} + +h5 { + font-size: 12px; +} + +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} + +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} + +.page-header h1 { + line-height: 1; +} + +ul, +ol { + padding: 0; + margin: 0 0 9px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li { + line-height: 18px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +dl { + margin-bottom: 18px; +} + +dt, +dd { + line-height: 18px; +} + +dt { + font-weight: bold; + line-height: 17px; +} + +dd { + margin-left: 9px; +} + +.dl-horizontal dt { + float: left; + width: 120px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 130px; +} + +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +.muted { + color: #999999; +} + +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} + +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 18px; + font-style: normal; + line-height: 18px; +} + +small { + font-size: 100%; +} + +cite { + font-style: normal; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12.025px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 18px; +} + +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 18px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 13.5px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; +} + +input, +textarea { + width: 210px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + cursor: pointer; +} + +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +select, +input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} + +select { + width: 220px; + border: 1px solid #bbb; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 930px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 850px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 770px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 690px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 610px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 530px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 450px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 370px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 290px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 210px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 130px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 50px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; + border-color: #ddd; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} + +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; + border-color: #b94a48; +} + +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; + border-color: #468847; +} + +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; + cursor: not-allowed; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +:-moz-placeholder { + color: #999999; +} + +:-ms-input-placeholder { + color: #999999; +} + +::-webkit-input-placeholder { + color: #999999; +} + +.help-block, +.help-inline { + color: #555555; +} + +.help-block { + display: block; + margin-bottom: 9px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-prepend, +.input-append { + margin-bottom: 5px; +} + +.input-prepend input, +.input-append input, +.input-prepend select, +.input-append select, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: middle; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend input:focus, +.input-append input:focus, +.input-prepend select:focus, +.input-append select:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + z-index: 2; +} + +.input-prepend .uneditable-input, +.input-append .uneditable-input { + border-left-color: #ccc; +} + +.input-prepend .add-on, +.input-append .add-on { + display: inline-block; + width: auto; + height: 18px; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-prepend .add-on, +.input-append .add-on, +.input-prepend .btn, +.input-append .btn { + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend .active, +.input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append .uneditable-input { + border-right-color: #ccc; + border-left-color: #eee; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 9px; +} + +legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 160px; +} + +.form-horizontal .help-block { + margin-top: 9px; + margin-bottom: 0; +} + +.form-horizontal .form-actions { + padding-left: 160px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 18px; +} + +.table th, +.table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapsed; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + +.table tbody tr:hover td, +.table tbody tr:hover th { + background-color: #f5f5f5; +} + +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} + +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} + +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} + +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} + +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} + +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} + +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} + +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} + +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} + +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} + +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} + +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} + +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} + +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} + +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} + +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} + +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} + +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} + +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} + +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} + +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} + +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} + +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} + +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +[class^="icon-"]:last-child, +[class*=" icon-"]:last-child { + *margin-left: 0; +} + +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + opacity: 0.3; + filter: alpha(opacity=30); +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown:hover .caret, +.open .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: "\2191"; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 10px 4px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 13px; + line-height: 18px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-large [class^="icon-"] { + margin-top: 1px; +} + +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} + +.btn-small [class^="icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} + +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + background-color: #0074cc; + *background-color: #0055cc; + background-image: -ms-linear-gradient(top, #0088cc, #0055cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); + background-image: -o-linear-gradient(top, #0088cc, #0055cc); + background-image: -moz-linear-gradient(top, #0088cc, #0055cc); + background-image: linear-gradient(top, #0088cc, #0055cc); + background-repeat: repeat-x; + border-color: #0055cc #0055cc #003580; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0055cc; + *background-color: #004ab3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #004099 \9; +} + +.btn-warning { + background-color: #faa732; + *background-color: #f89406; + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + background-color: #da4f49; + *background-color: #bd362f; + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + background-color: #5bb75b; + *background-color: #51a351; + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + background-color: #414141; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #555555, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); + background-image: -webkit-linear-gradient(top, #555555, #222222); + background-image: -o-linear-gradient(top, #555555, #222222); + background-image: -moz-linear-gradient(top, #555555, #222222); + background-image: linear-gradient(top, #555555, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-group { + position: relative; + *margin-left: .3em; + *zoom: 1; +} + +.btn-group:before, +.btn-group:after { + display: table; + content: ""; +} + +.btn-group:after { + clear: both; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} + +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group > .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .dropdown-toggle { + *padding-top: 4px; + padding-right: 8px; + *padding-bottom: 4px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini.dropdown-toggle { + padding-right: 5px; + padding-left: 5px; +} + +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large.dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0055cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 7px; + margin-left: 0; +} + +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-mini .caret { + margin-top: 5px; +} + +.btn-small .caret { + margin-top: 6px; +} + +.btn-large .caret { + margin-top: 6px; + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-top: 0; + border-bottom: 5px solid #000000; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + color: #c09853; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert-heading { + color: inherit; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 18px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > .pull-right { + float: right; +} + +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 18px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.nav-tabs .dropdown-toggle .caret, +.nav-pills .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav-tabs .dropdown-toggle:hover .caret, +.nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +.nav-tabs .active .dropdown-toggle .caret, +.nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 18px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; +} + +.navbar { + color: #999999; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar .brand { + display: block; + float: left; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #999999; +} + +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; +} + +.navbar .navbar-link { + color: #999999; +} + +.navbar .navbar-link:hover { + color: #ffffff; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn { + margin: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + background-color: #626262; + border: 1px solid #151515; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:focus, +.navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; +} + +.navbar .nav > li { + display: block; + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 9px 10px 11px; + line-height: 19px; + color: #999999; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar .btn { + display: inline-block; + padding: 4px 10px 4px; + margin: 5px 5px 6px; + line-height: 18px; +} + +.navbar .btn-group { + padding: 5px 5px 6px; + margin: 0; +} + +.navbar .nav > li > a:hover { + color: #ffffff; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; +} + +.navbar .divider-vertical { + width: 1px; + height: 40px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} + +.navbar .nav.pull-right { + margin-right: 0; + margin-left: 10px; +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + background-color: #2c2c2c; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-image: -moz-linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #080808 \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown .dropdown-toggle .caret, +.navbar .nav li.dropdown.open .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar .nav li.dropdown.active .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: transparent; +} + +.navbar .nav li.dropdown.active > .dropdown-toggle:hover { + color: #ffffff; +} + +.navbar .pull-right .dropdown-menu, +.navbar .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right .dropdown-menu:before, +.navbar .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right .dropdown-menu:after, +.navbar .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + list-style: none; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.breadcrumb li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} + +.breadcrumb .active a { + color: #333333; +} + +.pagination { + height: 36px; + margin: 18px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination li { + display: inline; +} + +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} + +.pagination a:hover, +.pagination .active a { + background-color: #f5f5f5; +} + +.pagination .active a { + color: #999999; + cursor: default; +} + +.pagination .disabled span, +.pagination .disabled a, +.pagination .disabled a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pager { + margin-bottom: 18px; + margin-left: 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next a { + float: right; +} + +.pager .previous a { + float: left; +} + +.pager .disabled a, +.pager .disabled a:hover { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-open .dropdown-menu { + z-index: 2050; +} + +.modal-open .dropdown.open { + *z-index: 2050; +} + +.modal-open .popover { + z-index: 2060; +} + +.modal-open .tooltip { + z-index: 2070; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + width: 560px; + margin: -250px 0 0 -280px; + overflow: auto; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -ms-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 50%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-body { + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.tooltip { + position: absolute; + z-index: 1020; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -2px; +} + +.tooltip.right { + margin-left: 2px; +} + +.tooltip.bottom { + margin-top: 2px; +} + +.tooltip.left { + margin-left: -2px; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} + +.popover.top { + margin-top: -5px; +} + +.popover.right { + margin-left: 5px; +} + +.popover.bottom { + margin-top: 5px; +} + +.popover.left { + margin-left: -5px; +} + +.popover.top .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.popover.bottom .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover-inner { + width: 280px; + padding: 3px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} + +.popover-title { + padding: 9px 15px; + line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; +} + +.popover-content { + padding: 14px; + background-color: #ffffff; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 18px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; +} + +.label, +.badge { + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + padding: 1px 4px 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 18px; + margin-bottom: 18px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + width: 0; + height: 18px; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .bar { + background-color: #149bdf; + 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); + 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); + background-image: -moz-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); + background-image: -ms-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); + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); +} + +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} + +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); +} + +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); +} + +.progress-warning .bar { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); +} + +.progress-warning.progress-striped .bar { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + 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); + background-image: -moz-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); + background-image: -ms-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); + 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); + 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); +} + +.accordion { + margin-bottom: 18px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel .item > img { + display: block; + line-height: 1; +} + +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} + +.carousel .active { + left: 0; +} + +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel .next { + left: 100%; +} + +.carousel .prev { + left: -100%; +} + +.carousel .next.left, +.carousel .prev.right { + left: 0; +} + +.carousel .active.left { + left: -100%; +} + +.carousel .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; + color: inherit; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} diff --git a/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/testcase.html b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/testcase.html new file mode 100644 index 00000000..62334744 --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/Bench4QTestCase/testcase.html @@ -0,0 +1,17 @@ + + + Bench4Q Test Case + + + + + + No this one + No this one + No this one + + + + + + diff --git a/Bench4Q-Recorder/RecordScriptTestCase/baidu.html b/Bench4Q-Recorder/RecordScriptTestCase/baidu.html new file mode 100644 index 00000000..373ced8a --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/baidu.html @@ -0,0 +1,17 @@ + + + Bench4Q Test Case + + + + + + No this one + No this one + No this one + + + + + + \ No newline at end of file diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRNotHtmlResponse.html b/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRNotHtmlResponse.html new file mode 100644 index 00000000..47d8fc0d --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRNotHtmlResponse.html @@ -0,0 +1,16 @@ +HTTP/1.1 200 OK +Content-Type: text/plain; charset=utf-8 +Server: Microsoft-IIS/7.0 +CachedXSLT: true +X-AspNet-Version: 2.0.50727 +X-Powered-By: ASP.NET +Vary: Accept-Encoding +Cache-Control: private, max-age=31 +Date: Tue, 10 Dec 2013 08:40:29 GMT +Content-Length: 6 +Connection: keep-alive +Set-Cookie: agentscape-tag-devtype=desktop; Path=/ +Set-Cookie: agentscape-proc=noop; Path=/ +x-agentscape-info: c=1.0-r9869; v=3; fp=f844b0e65e9b5458; ts=1333395837 + +adnddm \ No newline at end of file diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRNullResponseBody.html b/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRNullResponseBody.html new file mode 100644 index 00000000..34fc26d7 --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRNullResponseBody.html @@ -0,0 +1,14 @@ +HTTP/1.1 200 OK +Content-Type: text/html; charset=utf-8 +Server: Microsoft-IIS/7.0 +CachedXSLT: true +X-AspNet-Version: 2.0.50727 +X-Powered-By: ASP.NET +Vary: Accept-Encoding +Cache-Control: private, max-age=31 +Date: Tue, 10 Dec 2013 08:40:29 GMT +Content-Length: 0 +Connection: keep-alive +Set-Cookie: agentscape-tag-devtype=desktop; Path=/ +Set-Cookie: agentscape-proc=noop; Path=/ +x-agentscape-info: c=1.0-r9869; v=3; fp=f844b0e65e9b5458; ts=1333395837 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRRequest.txt b/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRRequest.txt new file mode 100644 index 00000000..3b2fea2d --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRRequest.txt @@ -0,0 +1,15 @@ +GET /phoenix.zhtml?c=188488&p=irol-homeprofile HTTP/1.1 +Host: ir.baidu.com +Connection: keep-alive +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 +User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 +Referer: http://www.baidu.com/ +Accept-Encoding: gzip,deflate,sdch +IF-MODIFIED-SINCE: Mon, 22 Mar 2010 14:14:40 GMT; old-content-length=200 +AUTHORIZATION: bearer +Accept-Language: zh-CN,zh;q=0.8 +Content-Type: multipart +Content-Length: 100 +Pragma: No-Cache +Cookie: BAIDUID=993724E1CAB01EE3D0C0AFAA99796E6A:FG=1; H_PS_PSSID=4381_1463_4212_4264_4451 + diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRResponse.txt b/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRResponse.txt new file mode 100644 index 0000000000000000000000000000000000000000..0f78a4ba04c0489ea80490401de06bd2366917b2 GIT binary patch literal 5512 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 ZDiY)LRCBpQq2catH|x~{Kokw_zW`3TWa9t; literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRResponseBody.txt b/Bench4Q-Recorder/RecordScriptTestCase/gzip/gzipBaiduIRResponseBody.txt new file mode 100644 index 0000000000000000000000000000000000000000..3ea009e54b6e19d8e008da7eeb45f493c0632b05 GIT binary patch literal 5023 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 literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduRequestHeader.txt b/Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduRequestHeader.txt new file mode 100644 index 00000000..91e99ea6 --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduRequestHeader.txt @@ -0,0 +1,10 @@ +GET / HTTP/1.1 +Host: www.baidu.com +Connection: keep-alive +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 +User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 +DNT: 1 +Accept-Encoding: gzip,deflate,sdch +Accept-Language: en,zh-CN;q=0.8,zh;q=0.6 +Cookie: BAIDUID=1D43A956BCED0A81B8340058134CD2F6:FG=1; BDUSS=EJMRWZ2eklMaERoQ344em5RZ2EyTVh0UjRDcWpiRmhnMjRlLTZnR3NZajBOS0JTQVFBQUFBJCQAAAAAAAAAAAEAAAA2JuwxZmVuZ3l1bjIwMTIzOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPSneFL0p3hSN; Hm_lvt_9f14aaa038bbba8b12ec2a4a3e51d254=1384429678; H_PS_PSSID=3784_4199_1432_4421_4414_4211_4264_4450_4503; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0 + diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduResponse.txt b/Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduResponse.txt new file mode 100644 index 0000000000000000000000000000000000000000..ab5dd0ff389879f9a237ecf8323adde6c00adde5 GIT binary patch literal 13313 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 Xj=+$;_DvR)Pm#Z*D^9mv5D@ literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduResponseBody.txt b/Bench4Q-Recorder/RecordScriptTestCase/gzipBaiduResponseBody.txt new file mode 100644 index 0000000000000000000000000000000000000000..219f979aaa4dd833fb65ed6db936289eec8f9768 GIT binary patch literal 12852 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 literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzipChunkedGoogleResponse.txt b/Bench4Q-Recorder/RecordScriptTestCase/gzipChunkedGoogleResponse.txt new file mode 100644 index 0000000000000000000000000000000000000000..990624570110b9f26ac910ad54089e9ca1dc9fdd GIT binary patch literal 22107 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

sX)z73=*--dyNs85kO6M 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 W4GIGQS4x)5NDcu24GJ&~3JnU!qu=cS literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/gzipChunkedGoogleResponseBody.txt b/Bench4Q-Recorder/RecordScriptTestCase/gzipChunkedGoogleResponseBody.txt new file mode 100644 index 0000000000000000000000000000000000000000..e66ba9ffa2a9d9ff424730b0d6ab00bc517cb89b GIT binary patch literal 21807 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

sX)z7 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 literal 0 HcmV?d00001 diff --git a/Bench4Q-Recorder/RecordScriptTestCase/responsBodyAfterDeal.txt b/Bench4Q-Recorder/RecordScriptTestCase/responsBodyAfterDeal.txt new file mode 100644 index 00000000..e69de29b diff --git a/Bench4Q-Recorder/RecordScriptTestCase/scriptBriefResultModel.xml b/Bench4Q-Recorder/RecordScriptTestCase/scriptBriefResultModel.xml new file mode 100644 index 00000000..b0a4679a --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/scriptBriefResultModel.xml @@ -0,0 +1,16 @@ + + + 0 + 0 + 0 + 1203 + 0 + 28205 + 1774 + 559 + 3172 + 22154 + 5245392 + + 40 + \ No newline at end of file diff --git a/Bench4Q-Recorder/RecordScriptTestCase/simpleResponse.txt b/Bench4Q-Recorder/RecordScriptTestCase/simpleResponse.txt new file mode 100644 index 00000000..67501f04 --- /dev/null +++ b/Bench4Q-Recorder/RecordScriptTestCase/simpleResponse.txt @@ -0,0 +1,26 @@ +HTTP/1.1 200 OK +Server: Apache-Coyote/1.1 +Accept-Ranges: bytes +ETag: W/"532-1386125334307" +Last-Modified: Wed, 04 Dec 2013 02:48:54 GMT +Content-Type: text/html +Content-Length: 532 +Date: Mon, 09 Dec 2013 07:03:15 GMT + + + + Bench4Q Test Case + + + + + + No this one + No this one + No this one + + + + + + diff --git a/Bench4Q-Recorder/pom.xml b/Bench4Q-Recorder/pom.xml new file mode 100644 index 00000000..6373c9b9 --- /dev/null +++ b/Bench4Q-Recorder/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + org.bench4q + integration + 1.0 Beta + + bench4q-recorder + bench4q-recorder + http://maven.apache.org + + UTF-8 + + + + + org.jsoup + jsoup + 1.7.3 + + + diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/ScriptCapturer.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/ScriptCapturer.java new file mode 100644 index 00000000..d45544c8 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/ScriptCapturer.java @@ -0,0 +1,91 @@ +package org.bench4q.recorder; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JTextArea; + +import org.bench4q.recorder.httpcapture.HttpCapture; +import org.bench4q.recorder.httpcapture.Utils.UserException; +import org.springframework.stereotype.Component; + +@Component +public class ScriptCapturer { + private String ipHttpCaptureServerAdress; + private static final String HTTPCATUREGENERATOR_STRING = "org.bench4q.master.scriptrecord.httpcapture.generator.Bench4qCodeGenerator"; + private Map httpCaptureMap; + + public String getIpHttpCaptureServerAdress() { + return ipHttpCaptureServerAdress; + } + + public void setIpHttpCaptureServerAdress(String ipHttpCaptureServerAdress) { + this.ipHttpCaptureServerAdress = ipHttpCaptureServerAdress; + } + + public Map getHttpCaptureMap() { + return httpCaptureMap; + } + + public void setHttpCaptureMap(Map httpCaptureMap) { + this.httpCaptureMap = httpCaptureMap; + } + + public ScriptCapturer() { + this.setIpHttpCaptureServerAdress(this.getLocalHostIp()); + this.setHttpCaptureMap(new HashMap()); + } + + private String getLocalHostIp() { + InetAddress addr; + try { + addr = InetAddress.getLocalHost(); + return addr.getHostAddress().toString(); + } catch (UnknownHostException e) { + e.printStackTrace(); + return null; + } + + } + + public void startRecord(int port, String fileDir, String fileName) { + try { + HttpCapture httpCapture = buildACapture(port, fileDir, fileName); + httpCapture.startProxyServer(); + httpCapture.startRecording(); + } catch (IOException e1) { + System.out.println("Error When start recording!"); + e1.printStackTrace(); + } catch (UserException e1) { + System.out.println("Error When start recording!"); + e1.printStackTrace(); + } + } + + private HttpCapture buildACapture(int port, String filePath, String fileName) { + HttpCapture httpCapture = new HttpCapture(filePath, fileName, port, + HTTPCATUREGENERATOR_STRING, new JTextArea()); + this.getHttpCaptureMap().put(new Integer(port), httpCapture); + return httpCapture; + } + + public void stopCurrentRecord(int port) { + try { + HttpCapture httpCapture = this.getHttpCaptureMap().get( + new Integer(port)); + if (httpCapture == null) { + return; + } + assert (httpCapture.isRecording()); + httpCapture.stopRecording(); + httpCapture.shutProxyServer(); + this.getHttpCaptureMap().remove(new Integer(port)); + } catch (Exception e1) { + System.out.println("Error When stop recording!"); + e1.printStackTrace(); + } + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Action.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Action.java new file mode 100644 index 00000000..7d3d95d9 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Action.java @@ -0,0 +1,147 @@ +package org.bench4q.recorder.httpcapture; + +import java.util.Vector; + +public class Action { + private String url; + private String method; + private String expected_result; + private int delayTime; + private int expected_size; + private int timeout; + private Vector headers; + private Vector queryStringParams; + private Vector bodyParams; + private String multiPartData; + + public Action() { + this.headers = new Vector(); + this.queryStringParams = new Vector(); + this.bodyParams = new Vector(); + this.expected_result = ""; + this.multiPartData = ""; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUrl() { + return this.url; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getMethod() { + return this.method; + } + + public void setExpectedResult(String str) { + this.expected_result = str; + } + + public String getExpectedResult() { + return this.expected_result; + } + + public void setDelayTime(int seconds) { + this.delayTime = seconds; + } + + public int getDelayTime() { + return this.delayTime; + } + + public void setExpectedSize(int bytes) { + this.expected_size = bytes; + } + + public int getExpectedSize() { + return this.expected_size; + } + + public void setTimeout(int seconds) { + this.timeout = seconds; + } + + public int getTimeout() { + return this.timeout; + } + + public int getHeaderCount() { + return this.headers.size(); + } + + public HeaderValue[] getHeaders() { + HeaderValue[] list = new HeaderValue[this.headers.size()]; + this.headers.copyInto(list); + return list; + } + + public void addHeader(HeaderValue p) { + this.headers.addElement(p); + } + + public void removeHeader(HeaderValue p) { + this.headers.removeElement(p); + } + + public int getParamsCount() { + return getParams().length; + } + + public int getQueryStringParamCount() { + return this.queryStringParams.size(); + } + + public int getBodyParamCount() { + return this.bodyParams.size(); + } + + public Param[] getQueryStringParams() { + Param[] list = new Param[this.queryStringParams.size()]; + this.queryStringParams.copyInto(list); + return list; + } + + public Param[] getBodyParams() { + Param[] list = new Param[this.bodyParams.size()]; + this.bodyParams.copyInto(list); + return list; + } + + public Param[] getParams() { + @SuppressWarnings("unchecked") + Vector v = (Vector) this.queryStringParams.clone(); + v.addAll(this.bodyParams); + Param[] list = new Param[v.size()]; + v.copyInto(list); + return list; + } + + public void addQueryStringParam(Param p) { + this.queryStringParams.addElement(p); + } + + public void addBodyParam(Param p) { + this.bodyParams.addElement(p); + } + + public void removeQueryStringParam(Param p) { + this.queryStringParams.removeElement(p); + } + + public void removeBodyParam(Param p) { + this.bodyParams.removeElement(p); + } + + public void setMultiPartData(String multiPartData) { + this.multiPartData = multiPartData; + } + + public String getMultiPartData() { + return this.multiPartData; + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Bench4qTestScriptAdapter.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Bench4qTestScriptAdapter.java new file mode 100644 index 00000000..ddfdd460 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Bench4qTestScriptAdapter.java @@ -0,0 +1,218 @@ +package org.bench4q.recorder.httpcapture; + +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; + +import org.apache.log4j.Logger; +import org.bench4q.recorder.httpcapture.generator.ChildrenUrl; +import org.bench4q.share.helper.MarshalHelper; +import org.bench4q.share.helper.RunScenarioModelHelper; +import org.bench4q.share.models.agent.ParameterModel; +import org.bench4q.share.models.agent.RunScenarioModel; +import org.bench4q.share.models.agent.scriptrecord.BatchModel; +import org.bench4q.share.models.agent.scriptrecord.BehaviorModel; +import org.bench4q.share.models.agent.scriptrecord.PageModel; +import org.bench4q.share.models.agent.scriptrecord.UsePluginModel; + +public class Bench4qTestScriptAdapter implements IScriptAdapter { + private int pageCount; + private RunScenarioModel runScenarioModel; + private List childrenUrls = new ArrayList(); + private static Logger logger = Logger + .getLogger(Bench4qTestScriptAdapter.class); + + public RunScenarioModel getRunScenarioModel() { + return runScenarioModel; + } + + private void setRunScenarioModel(RunScenarioModel runScenarioModel) { + this.runScenarioModel = runScenarioModel; + } + + public List getChildrenUrls() { + return childrenUrls; + } + + private void setChildrenUrls(List childrenUrls) { + this.childrenUrls = childrenUrls; + } + + private int getPageCount() { + return pageCount; + } + + private void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public Bench4qTestScriptAdapter(RunScenarioModel runScenarioModel) { + this.runScenarioModel = runScenarioModel; + this.setChildrenUrls(new ArrayList()); + this.setPageCount(0); + initWithOnePage(); + } + + private void initWithOnePage() { + addPage(); + } + + public void appendUsePluginsToScenario(List usePluginModels) { + this.runScenarioModel.setUsePlugins(usePluginModels); + } + + public void addPage() { + this.setPageCount(this.getPageCount() + 1); + this.getRunScenarioModel().getPages().add(new PageModel()); + assert (pageCountEqualWithPageSizeInScenario()); + } + + public void insertUserBehaviorsToScenario(BehaviorModel model) { + List batches = this.getCurrentPage().getBatches(); + int parentBatchId = -1; + assert (batches != null); + parentBatchId = getUrlParentBatch(model); + if (isIndependent(parentBatchId)) { + BatchModel batch = createBatchBehaviorWithProperBatchId(); + batch.getBehaviors().add(model); + batches.add(batch); + return; + } + guardChildBatchExist(batches, parentBatchId); + batches.get(batches.get(parentBatchId).getChildId()).getBehaviors() + .add(model); + } + + private void guardChildBatchExist(List batches, + int parentBatchId) { + if (isChildBatchAbsent(batches, parentBatchId)) { + BatchModel batchBehavior = createBatchBehaviorWithProperBatchId(); + batchBehavior.setParentId(parentBatchId); + batches.add(batchBehavior); + batches.get(parentBatchId).setChildId(batches.size() - 1); + } + } + + private PageModel getCurrentPage() { + if (!pageCountEqualWithPageSizeInScenario()) { + logger.error("The page count is not equal with the size of scenario pages, and the page count is" + + this.getPageCount() + + " , and pageSize is " + + this.getRunScenarioModel().getPages().size()); + return new PageModel(); + } + return this.getRunScenarioModel().getPages() + .get(this.getPageCount() - 1); + } + + private boolean pageCountEqualWithPageSizeInScenario() { + return this.getPageCount() == this.getRunScenarioModel().getPages() + .size(); + } + + private BatchModel createBatchBehaviorWithProperBatchId() { + BatchModel batchBehavior = new BatchModel(); + batchBehavior.setId(RunScenarioModelHelper.getBatches( + this.runScenarioModel).size()); + batchBehavior.setParentId(-1); + batchBehavior.setChildId(-1); + List behaviors = new ArrayList(); + batchBehavior.setBehaviors(behaviors); + return batchBehavior; + } + + private boolean isChildBatchAbsent(List batches, + int parentBatchId) { + if (parentBatchId >= batches.size()) { + return false; + } + return batches.get(parentBatchId).getChildId() < 0; + } + + private boolean isIndependent(int parentBatchId) { + return parentBatchId < 0; + } + + public boolean isInChildrenUrl(String url) { + for (ChildrenUrl childrenUrl : this.getChildrenUrls()) { + if (childrenUrl.getUrl().equals(url)) { + return true; + } + } + return false; + } + + private int getUrlParentBatch(BehaviorModel model) { + int parentBatchId = -1; + for (ParameterModel parameter : model.getParameters()) { + if (!parameter.getKey().equals("url")) { + continue; + } + parentBatchId = getParentBatchIdWithChildUrl(parameter.getValue()); + } + return parentBatchId; + } + + private int getParentBatchIdWithChildUrl(String url) { + for (ChildrenUrl childrenUrl : this.getChildrenUrls()) { + if (childrenUrl.getUrl().equals(url)) { + return childrenUrl.getParentBatchId(); + } + } + return -1; + } + + public int getParentBatchIdWithParentUrl(String url) { + List batchesInScenario = RunScenarioModelHelper + .getBatches(this.getRunScenarioModel()); + for (int batchId = 0; batchId < batchesInScenario.size(); batchId++) { + BatchModel batch = batchesInScenario.get(batchId); + for (BehaviorModel behavior : batch.getBehaviors()) { + for (ParameterModel parameter : behavior.getParameters()) { + if (parameter.getKey().equals("url") + && parameter.getValue().equals(url)) { + return batchId; + } + } + } + } + return -1; + } + + public void resetChildrenUrls() { + this.getChildrenUrls().clear(); + } + + public String getText() { + StringWriter stringWriter = new StringWriter(); + try { + Marshaller marshaller = JAXBContext.newInstance( + this.runScenarioModel.getClass()).createMarshaller(); + marshaller.marshal(this.runScenarioModel, stringWriter); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + } catch (JAXBException e) { + e.printStackTrace(); + } + + return stringWriter.toString(); + } + + public void setText(String text) { + if (text == null || text.isEmpty()) { + // this.setRunScenarioModel(new RunScenarioModelNew()); + return; + } + try { + this.setRunScenarioModel((RunScenarioModel) MarshalHelper + .unmarshal(RunScenarioModel.class, text)); + } catch (JAXBException e) { + logger.error(e, e); + this.setRunScenarioModel(new RunScenarioModel()); + } + } + +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Config.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Config.java new file mode 100644 index 00000000..6c426e6f --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Config.java @@ -0,0 +1,271 @@ +package org.bench4q.recorder.httpcapture; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Layout; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; + +public class Config { + private static Config config = null; + private static final Log log = LogFactory.getLog(Config.class); + private static Properties props; + private String pythonPath; + private int port = 8090; + private boolean debug; + private boolean quiet; + private String exist; + private String replace; + private List includeList; + private List excludeList; + private List includePatterns = new ArrayList(); + private List excludePatterns = new ArrayList(); + private String scriptArg; + private ProxySettings proxySettings; + private static String defDriverPkgName = "com.bitmechanic.maxq"; + private static String defValidatorPkgName = "com.bitmechanic.maxq"; + + static { + Layout layout = new PatternLayout("%d [%t] %-5p %c - %m%n"); + Logger.getRootLogger().addAppender( + new ConsoleAppender(layout, "System.err")); + } + + public static Config getConfig() { + if (config == null) + initConfig(); + return config; + } + + public static void initConfig() { + config = new Config(); + String maxqDir = System.getProperty("maxq.dir"); + String pathSep = System.getProperty("file.separator"); + // "\\src\\main\\resources\\org\\bench4q\\master\\config\\httpCaptureConfig\\maxq.properties"; + String propertiesFileName = System.getProperty("user.dir") + "src" + + pathSep + "main" + pathSep + "resources" + pathSep + "org" + + pathSep + "bench4q" + pathSep + "master" + pathSep + "config" + + pathSep + "httpCaptureConfig" + pathSep + "maxq.properties"; + + InputStream propertiesStream = Config.class.getClassLoader() + .getResourceAsStream(propertiesFileName); + props = new Properties(); + if (propertiesStream != null) { + try { + props.load(propertiesStream); + log.debug("Generator: " + + props.getProperty("generator.classnames")); + } catch (IOException e) { + throw new ExceptionInInitializerError(e); + } + + } + + config.addPythonPath(maxqDir + pathSep + "jython"); + + String path = config.getProperty("python.path"); + if (path != null) { + config.addPythonPath(path); + } + + String portStr = props.getProperty("local.proxy.port"); + if (portStr != null) + config.port = Integer.parseInt(portStr); + } + + public void completeInit() throws Utils.UserException { + Level level = this.quiet ? Level.WARN : this.debug ? Level.ALL + : Level.INFO; + Logger.getRootLogger().setLevel(level); + + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "warn"); + + Properties ppref = new Properties(); + if (getPythonPath() != null) + ppref.put("python.path", getPythonPath()); + // PythonInterpreter.initialize(System.getProperties(), ppref, + // new String[0]); + + String host = getProperty("remote.proxy.host"); + Integer port = getPropertyInt("remote.proxy.port"); + if ((host == null ? 1 : 0) != (port == null ? 1 : 0)) + throw new Utils.UserException( + "Not using proxy server. You must set both remote.proxy.host and remote.proxy.port."); + if ((host != null) && (port != null)) { + this.proxySettings = new ProxySettings(); + this.proxySettings.host = host; + this.proxySettings.port = port.intValue(); + log.info("Proxying requests via " + this.proxySettings.host + ":" + + Integer.toString(this.proxySettings.port)); + } + } + + public String getProperty(String prop) { + return (String) props.get(prop); + } + + public String getProperty(String prop, String def) { + String val = getProperty(prop); + return (val == null) || (val.equals("")) ? def : val; + } + + public void setProperty(String property, String value) { + props.setProperty(property, value); + } + + public Integer getPropertyInt(String prop) throws Utils.UserException { + String s = getProperty(prop); + if (s == null) + return null; + try { + return new Integer(s); + } catch (NumberFormatException e) { + } + throw new Utils.UserException(prop + " property must be an integer"); + } + + public void addPythonPath(String path) { + if (this.pythonPath == null) + this.pythonPath = path; + else + this.pythonPath = (this.pythonPath + + System.getProperty("path.separator") + path); + } + + public String getPythonPath() { + return this.pythonPath; + } + + public void setPort(int pt) { + this.port = pt; + } + + public int getPort() { + return this.port; + } + + public void setDebug(boolean d) { + this.debug = d; + } + + public boolean isDebug() { + return this.debug; + } + + public void setQuiet(boolean q) { + this.quiet = q; + } + + public boolean isQuiet() { + return this.quiet; + } + + public void setExist(String e) { + this.exist = e; + } + + public String getExist() { + return this.exist; + } + + public void setReplace(String e) { + this.replace = e; + } + + public String getReplace() { + return this.replace; + } + + public void setIncludePatterns(String[] pats) { + this.includeList = Arrays.asList(pats); + createPatterns(this.includeList, this.includePatterns); + } + + public void setExcludePatterns(String[] pats) { + this.excludeList = Arrays.asList(pats); + createPatterns(this.excludeList, this.excludePatterns); + } + + public List getIncludePatterns() { + return this.includePatterns; + } + + public List getExcludePatterns() { + return this.excludePatterns; + } + + public void setScriptArg(String arg) { + this.scriptArg = arg; + } + + public String getScriptArg() { + return this.scriptArg; + } + + public static String getDriverPkgName() { + return System.getProperty("maxq.driverpkgname", defDriverPkgName); + } + + public static String getValidatorPkgName() { + return System.getProperty("maxq.validatorpkgname", defValidatorPkgName); + } + + public static Log getTestLogger() { + return LogFactory.getLog("com.bitmechanic.maxq.testrun"); + } + + public ProxySettings getProxySettings() { + return this.proxySettings; + } + + public void setProxySettings(ProxySettings proxySettings) { + this.proxySettings = proxySettings; + } + + private void createPatterns(List list, + List excludePatterns2) { + Iterator iter = list.iterator(); + excludePatterns2.clear(); + while (iter.hasNext()) + try { + Pattern p = Pattern.compile(iter.next().toString()); + excludePatterns2.add(p); + } catch (PatternSyntaxException e) { + log.error(e); + } + } + + public static class ProxySettings { + String host; + int port; + + public String getHost() { + return this.host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return this.port; + } + + public void setPort(int port) { + this.port = port; + } + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HeaderValue.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HeaderValue.java new file mode 100644 index 00000000..01560601 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HeaderValue.java @@ -0,0 +1,73 @@ +package org.bench4q.recorder.httpcapture; + +public class HeaderValue { + public static final String GENERAL_CACHE_CONTROL = "Cache-Control"; + public static final String GENERAL_CONNECTION = "Connection"; + public static final String GENERAL_DATE = "Date"; + public static final String GENERAL_PRAGMA = "Pragma"; + public static final String GENERAL_TRAILER = "Trailer"; + public static final String GENERAL_TRANSFER_ENC = "Transfer-Encoding"; + public static final String GENERAL_UPGRADE = "Upgrade"; + public static final String GENERAL_VIA = "Via"; + public static final String GENERAL_WARNING = "Warning"; + public static final String REQUEST_ACCEPT = "Accept"; + public static final String REQUEST_ACCEPT_CHARSET = "Accept-Charset"; + public static final String REQUEST_ACCEPT_ENCODING = "Accept-Encoding"; + public static final String REQUEST_ACCEPT_LANGUAGE = "Accept-Language"; + public static final String REQUEST_AUTHORIZATION = "Authorization"; + public static final String REQUEST_EXPECT = "Expect"; + public static final String REQUEST_FROM = "From"; + public static final String REQUEST_HOST = "Host"; + public static final String REQUEST_IF_MATCH = "If-Match"; + public static final String REQUEST_IF_MODIFIED_SINCE = "If-Modified-Since"; + public static final String REQUEST_IF_NONE_MATCH = "If-None-Match"; + public static final String REQUEST_IF_RANGE = "If-Range"; + public static final String REQUEST_IF_UNMODIFIED_SINCE = "If-Unmodified-Since"; + public static final String REQUEST_MAX_FORWARDS = "Max-Forwards"; + public static final String REQUEST_PROXY_AUTHORIZATION = "Proxy-Authorization"; + public static final String REQUEST_RANGE = "Range"; + public static final String REQUEST_REFERER = "Referer"; + public static final String REQUEST_TE = "TE"; + public static final String REQUEST_USER_AGENT = "User-Agent"; + public static final String RESPONSE_AGE = "Age"; + public static final String RESPONSE_ETAG = "ETag"; + public static final String RESPONSE_LOCATION = "Location"; + public static final String RESPONSE_PROXY_AUTHENTICATE = "Proxy-Authenticate"; + public static final String RESPONSE_RETRY_AFTER = "Retry-After"; + public static final String RESPONSE_SERVER = "Server"; + public static final String RESPONSE_VARY = "Vary"; + public static final String RESPONSE_WWW_AUTHENTICATE = "WWW-Authenticate"; + public static final String ENTITY_ALLOW = "Allow"; + public static final String ENTITY_CONTENT_ENCODING = "Content-Encoding"; + public static final String ENTITY_CONTENT_LANGUAGE = "Content-Language"; + public static final String ENTITY_CONTENT_LENGHT = "Content-Length"; + public static final String ENTITY_CONTENT_LOCATION = "Content-Location"; + public static final String ENTITY_CONTENT_MD5 = "Content-MD5"; + public static final String ENTITY_CONTENT_RANGE = "Content-Range"; + public static final String ENTITY_CONTENT_TYPE = "Content-Type"; + public static final String ENTITY_EXPIRES = "Expires"; + public static final String ENTITY_LAST_MODIFIED = "Last-Modified"; + private String header; + private String value; + + public HeaderValue(String header, String value) { + this.header = header; + this.value = value; + } + + public String getHeader() { + return this.header; + } + + public void setHeader(String header) { + this.header = header; + } + + public String getValue() { + return this.value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpCapture.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpCapture.java new file mode 100644 index 00000000..2ac6da2e --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpCapture.java @@ -0,0 +1,128 @@ +package org.bench4q.recorder.httpcapture; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.swing.JTextArea; + +import org.apache.log4j.Logger; +import org.bench4q.share.models.agent.RunScenarioModel; + +public class HttpCapture { + private int localport; + private Config config; + private Test currentTest; + private ProxyServer proxy; + private File resultFile; + private ExecutorService executorService; + private String scriptContent; + private static Logger logger = Logger.getLogger(HttpCapture.class); + + public int getLocalport() { + return localport; + } + + public void setLocalport(int localport) { + this.localport = localport; + } + + public Config getConfig() { + return config; + } + + public void setConfig(Config config) { + this.config = config; + } + + public Test getCurrentTest() { + return currentTest; + } + + public void setCurrentTest(Test currentTest) { + this.currentTest = currentTest; + } + + public ProxyServer getProxy() { + return proxy; + } + + public void setProxy(ProxyServer proxy) { + this.proxy = proxy; + } + + public File getResultFile() { + return resultFile; + } + + public void setResultFile(File resultFile) { + this.resultFile = resultFile; + } + + public String getScriptContent() { + return scriptContent; + } + + private void setScriptContent(String scriptContent) { + this.scriptContent = scriptContent; + } + + public boolean isRecording() { + return this.getCurrentTest().isRecording(); + } + + public HttpCapture(String dirPath, String fileName, int localport, + String generator, JTextArea textArea) { + this.localport = localport; + System.out.println(dirPath + System.getProperty("file.separator") + + fileName + ".xml"); + + File file = new File(dirPath); + if (!file.exists()) { + file.mkdirs(); + } + + this.resultFile = new File(dirPath + + System.getProperty("file.separator") + fileName + ".xml"); + this.config = Config.getConfig(); + try { + this.config.completeInit(); + this.proxy = new ProxyServer(this.localport); + } catch (Exception e) { + e.printStackTrace(); + } + this.currentTest = new Test(this.proxy, new Bench4qTestScriptAdapter( + new RunScenarioModel()), generator); + } + + public void startProxyServer() throws IOException, Utils.UserException { + logger.info("enter startProxyServer!"); + this.executorService = Executors.newCachedThreadPool(); + this.executorService.execute(this.proxy); + } + + public void startRecording() throws IOException, Utils.UserException { + this.currentTest.startRecording(); + this.resultFile.createNewFile(); + this.currentTest.setTestFile(this.resultFile); + } + + public void stopRecording() throws IOException, Utils.UserException { + this.currentTest.stopRecording(); + this.currentTest.save(); + } + + public void shutProxyServer() throws IOException, Utils.UserException { + if (this.proxy.getServerSocket() != null) { + this.proxy.getServerSocket().close(); + } + this.executorService.shutdownNow(); + this.currentTest.close(); + this.retrieveScriptContent(); + } + + private void retrieveScriptContent() { + this.setScriptContent(this.currentTest.getScriptContent()); + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpRequestHeader.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpRequestHeader.java new file mode 100644 index 00000000..2c405b84 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpRequestHeader.java @@ -0,0 +1,290 @@ +package org.bench4q.recorder.httpcapture; + +import org.apache.log4j.Logger; + +import java.io.IOException; +import java.io.InputStream; +import java.util.StringTokenizer; + +/** + * Parses and stores a http server request. Originally posted to comp.lang.java + * in 1996. + * + * @author Sherman Janes + */ +public class HttpRequestHeader { + private static final Logger log = Logger.getLogger(HttpRequestHeader.class); + + /** + * Http Request method. Such as get or post. + */ + public String method = new String(); + + /** + * The requested url. The universal resource locator that hopefully uniquely + * describes the object or service the client is requesting. + */ + public String url = new String(); + + /** + * Version of http being used. Such as HTTP/1.0 + */ + public String version = new String(); + /** + * to support http 1.1 + */ + public String host = new String(); + /** + * The client's browser's name. + */ + public String userAgent = new String(); + + /** + * The requesting documents that contained the url link. + */ + public String referer = new String(); + + /** + * A internet address date of the remote copy. + */ + public String ifModifiedSince = new String(); + + /** + * A list of mime types the client can accept. + */ + public String accept = new String(); + public String acceptLanguage = new String(); + // public String acceptEncoding = new String(); + /** + * The clients authorization. Don't belive it. + */ + public String authorization = new String(); + /** + * The type of content following the request header. Normally there is no + * content and this is blank, however the post method usually does have a + * content and a content length. + */ + public String contentType = new String(); + /** + * The length of the content following the header. Usually blank. + */ + public int contentLength = -1; + /** + * The content length of a remote copy of the requested object. + */ + public int oldContentLength = -1; + /** + * Anything in the header that was unrecognized by this class. + */ + public String unrecognized = new String(); + /** + * Indicates that no cached versions of the requested object are to be sent. + * Usually used to tell proxy not to send a cached copy. This may also + * effect servers that are front end for data bases. + */ + public boolean pragmaNoCache = false; + + final static String CR = "\r\n"; + + /** + * That from which we read. + */ + private InputStream input; + + /** + * Parses a http header from a stream. + * + * @param in + * The stream to parse. + */ + public HttpRequestHeader(InputStream in) throws IOException { + input = in; + /* + * Read by lines + */ + StringTokenizer tz = new StringTokenizer(readLine()); + /* + * HTTP COMMAND LINE < > + */ + method = getToken(tz).toUpperCase(); + url = getToken(tz); + version = getToken(tz); + + while (true) { + String line = readLine(); + log.trace(line); + tz = new StringTokenizer(line); + String Token = getToken(tz); + // look for termination of HTTP command + if (0 == Token.length()) + break; + if (Token.equalsIgnoreCase("Host:")) { + // line = + host = getRemainder(tz); + } else if (Token.equalsIgnoreCase("USER-AGENT:")) { + // line => + userAgent = getRemainder(tz); + } else if (Token.equalsIgnoreCase("ACCEPT:")) { + // line=/

+ // examp: Accept image/jpeg + accept += getRemainder(tz); + } else if (Token + .equalsIgnoreCase(HeaderValue.REQUEST_ACCEPT_LANGUAGE + ":")) { + acceptLanguage += getRemainder(tz); + } else if (Token.equalsIgnoreCase("REFERER:")) { + // line => + referer = getRemainder(tz); + } else if (Token.equalsIgnoreCase("PRAGMA:")) { + // Pragma: + Token = getToken(tz); + if (Token.equalsIgnoreCase("NO-CACHE")) + pragmaNoCache = true; + else + unrecognized += "Pragma:" + Token + " " + getRemainder(tz) + + "\n"; + } else if (Token.equalsIgnoreCase("AUTHORIZATION:")) { + // Authenticate: Basic UUENCODED + authorization = getRemainder(tz); + + } else if (Token.equalsIgnoreCase("IF-MODIFIED-SINCE:")) { + // line = + // *** Conditional GET replaces HEAD method *** + String str = getRemainder(tz); + int index = str.indexOf(";"); + if (index == -1) { + ifModifiedSince = str; + } else { + ifModifiedSince = str.substring(0, index); + + index = str.indexOf("="); + if (index != -1) { + str = str.substring(index + 1); + oldContentLength = Integer.parseInt(str); + } + } + } else if (Token.equalsIgnoreCase("CONTENT-LENGTH:")) { + Token = getToken(tz); + contentLength = Integer.parseInt(Token); + } else if (Token.equalsIgnoreCase("CONTENT-TYPE:")) { + contentType = getRemainder(tz); + } else { + unrecognized += Token + " " + getRemainder(tz) + CR; + } + } + } + + /** + * We would like to use BufferedReader.readLine(), but it may read past the + * header while filling its buffer. Anything it over-read would thus be + * missed from the body. (Reading the body cannot be via a Reader- derived + * class because we do not want to do any character set conversion at this + * stage. It might be binary data!) + */ + String readLine() throws IOException { + int c; + StringBuffer sb = new StringBuffer(); + while ((c = input.read()) != '\n') { + if (c == -1) + throw new IOException("unterminated line in request header"); + sb.append((char) c); + } + return sb.toString(); + } + + /* + * Rebuilds the header in a string + * + * @return The header in a string. + */ + public String toString(boolean sendUnknowen) { + String Request; + + if (0 == method.length()) + method = "GET"; + + Request = method + " " + url + " " + version + CR; + + if (0 < host.length()) { + Request += "Host:" + host + CR; + } + if (0 < userAgent.length()) + Request += "User-Agent:" + userAgent + CR; + + if (0 < referer.length()) + Request += "Referer:" + referer + CR; + + if (pragmaNoCache) + Request += "Pragma: no-cache" + CR; + + if (0 < ifModifiedSince.length()) + Request += "If-Modified-Since: " + ifModifiedSince + CR; + + // ACCEPT TYPES // + if (0 < accept.length()) + Request += "Accept: " + accept + CR; + else + Request += "Accept: */" + "* \r\n"; + if (0 < acceptLanguage.length()) { + Request += HeaderValue.REQUEST_ACCEPT_LANGUAGE + ": " + + acceptLanguage + CR; + } + if (0 < contentType.length()) + Request += "Content-Type: " + contentType + CR; + + if (0 < contentLength) + Request += "Content-Length: " + contentLength + CR; + + if (0 != authorization.length()) + Request += "Authorization: " + authorization + CR; + + if (sendUnknowen) { + if (0 != unrecognized.length()) + Request += unrecognized; + } + + Request += CR; + + return Request; + } + + /** + * (Re)builds the header in a string. + * + * @return The header in a string. + */ + public String toString() { + return toString(true); + } + + /** + * Returns the next token in a string + * + * @param tk + * String that is partially tokenized. + * @return The remainder + */ + String getToken(StringTokenizer tk) { + String str = ""; + if (tk.hasMoreTokens()) + str = tk.nextToken(); + return str; + } + + /** + * Returns the remainder of a tokenized string + * + * @param tk + * String that is partially tokenized. + * @return The remainder + */ + String getRemainder(StringTokenizer tk) { + String str = ""; + if (tk.hasMoreTokens()) + str = tk.nextToken(); + while (tk.hasMoreTokens()) { + str += " " + tk.nextToken(); + } + return str; + } + +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpTestCase.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpTestCase.java new file mode 100644 index 00000000..afed24bb --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/HttpTestCase.java @@ -0,0 +1,238 @@ +package org.bench4q.recorder.httpcapture; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import javax.swing.JOptionPane; + +import org.apache.commons.httpclient.HostConfiguration; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.URIException; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; + +public class HttpTestCase { + private Config config = Config.getConfig(); + protected HttpMethod method = null; + protected HttpClient client = new HttpClient(); + protected String data; + private boolean followRedirects = false; + private String charset; + + public void setCharset(String cs) { + this.charset = cs; + } + + public HttpTestCase(String name) { + Config.ProxySettings proxy = this.config.getProxySettings(); + if (proxy != null) { + HostConfiguration hc = this.client.getHostConfiguration(); + hc.setProxy(proxy.host, proxy.port); + } + } + + public void Run() throws Throwable { + } + + public HttpMethod getMethod() { + return this.method; + } + + private void cleanupMethod() { + if (this.method != null) { + this.method.releaseConnection(); + this.method = null; + } + } + + public void get(String url) throws IOException { + get(url, null); + } + + public void get(String url, Object[] args) throws IOException { + cleanupMethod(); + + this.method = new GetMethod(url); + + if (args != null) { + this.method.setQueryString(paramsToNV(args)); + } + + this.method.setFollowRedirects(this.followRedirects); + this.client.executeMethod(this.method); + } + + public void post(String url) throws IOException { + post(url, null); + } + + public void post(String url, Object[] args) throws IOException { + cleanupMethod(); + PostMethod post = new PostMethod(url); + + if (this.charset != null) { + post.setRequestHeader("Content-Type", + "application/x-www-form-urlencoded; charset=" + + this.charset); + } + + if (args != null) { + post.setRequestBody(paramsToNV(args)); + } + + this.method = post; + this.method.setFollowRedirects(this.followRedirects); + this.client.executeMethod(this.method); + } + + public void postMultiPart(String url, String data, int contLen) + throws IOException { + postMultiPart(url, data, contLen, null); + } + + public void postMultiPart(String url, String data, int contLen, + Object[] args) throws IOException { + cleanupMethod(); + + PostMethod multipartPostMethod = new PostMethod(url); + + multipartPostMethod.addParameter("data", data); + if (args != null) { + multipartPostMethod.setQueryString(paramsToNV(args)); + } + + this.method = multipartPostMethod; + this.method.setFollowRedirects(this.followRedirects); + this.client.executeMethod(this.method); + } + + public NameValuePair[] paramsToNV(Object[] params) { + NameValuePair[] res = new NameValuePair[params.length]; + for (int i = 0; i < params.length; ++i) { + Object param = params[i]; + // if (param instanceof PyTuple) { + // PyTuple pyParam = (PyTuple) param; + // res[i] = new NameValuePair(pyParam.__getitem__(0).toString(), + // pyParam.__getitem__(1).toString()); + // } else + if (param instanceof NameValuePair) { + res[i] = ((NameValuePair) param); + } + } + return res; + } + + public String urlDecode(String s) { + return staticUrlDecode(s); + } + + public static String staticUrlDecode(String s) { + String sUrl = ""; + ByteArrayOutputStream out = new ByteArrayOutputStream(s.length()); + for (int count = 0; count < s.length(); ++count) + if (s.charAt(count) == '%') { + ++count; + if (count < s.length()) { + int a = Character.digit(s.charAt(count++), 16); + a <<= 4; + int b = Character.digit(s.charAt(count), 16); + + if ((a + b == 39) || (a + b == 132)) + out.write(92); + out.write(a + b); + } else { + out.write(37); + } + } else if (s.charAt(count) == '+') { + out.write(32); + } else { + sUrl += s.charAt(count); + out.write(s.charAt(count)); + } + System.out.println(sUrl); + return out.toString(); + } + + protected void responseOK() throws URIException { + } + + protected boolean responseContainsURI(String uri) throws URIException { + return ((this.method != null) && (this.method.getURI().getPath() + .indexOf(uri) != -1)); + } + + protected boolean responseContains(String text) { + try { + if ((this.method == null) + || (this.method.getResponseBody() == null)) + return false; + + this.data = this.method.getResponseBodyAsString(); + } catch (IOException e) { + e.printStackTrace(); + } + + return (this.data.indexOf(text) != -1); + } + + protected void printResponse() { + try { + System.err.println(new String(this.method.getResponseBody())); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public String getResponse() throws IOException { + return this.method.getResponseBodyAsString(); + } + + public byte[] getResponseAsBytes() throws IOException { + return this.method.getResponseBody(); + } + + public int getResponseCode() { + return getMethod().getStatusCode(); + } + + // public PyDictionary getResponseHeader() { + // PyDictionary dict = new PyDictionary(); + // Header[] headers = this.method.getResponseHeaders(); + // + // for (int i = 0; i < headers.length; ++i) + // dict.__setitem__(new PyString(headers[i].getName()), new PyString( + // headers[i].getValue())); + // return dict; + // } + + public String getScriptArg() { + return this.config.getScriptArg(); + } + + public boolean userConfirm(String msg) { + int rc = JOptionPane.showConfirmDialog(null, msg, "HttpCapture", 2); + return (rc == 0); + } + + public String userInput(String msg) { + return JOptionPane.showInputDialog(null, msg, "HttpCapture", 3); + } + + public String getStrutsToken() throws IOException { + String responseString = new String( + this.method.getResponseBodyAsString()); + + String strutsToken = null; + + int tokenIDIndex = responseString.toLowerCase().indexOf( + "org.apache.struts.taglib.html.TOKEN".toLowerCase()); + int nextValue = responseString.toLowerCase().indexOf( + "value=\"".toLowerCase(), tokenIDIndex); + + strutsToken = responseString.substring(nextValue + "value=\"".length(), + nextValue + "value=\"".length() + 32); + return strutsToken; + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/IScriptAdapter.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/IScriptAdapter.java new file mode 100644 index 00000000..e3fa45d5 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/IScriptAdapter.java @@ -0,0 +1,33 @@ +package org.bench4q.recorder.httpcapture; + +import java.util.List; + +import org.bench4q.recorder.httpcapture.generator.ChildrenUrl; +import org.bench4q.share.models.agent.RunScenarioModel; +import org.bench4q.share.models.agent.scriptrecord.BehaviorModel; +import org.bench4q.share.models.agent.scriptrecord.UsePluginModel; + +public interface IScriptAdapter { + + public abstract RunScenarioModel getRunScenarioModel(); + + public abstract void addPage(); + + public abstract void appendUsePluginsToScenario( + List usePluginModels); + + public abstract void insertUserBehaviorsToScenario(BehaviorModel model); + + public abstract String getText(); + + public abstract void setText(String paramString); + + // TODO:move this function to more fit place + public abstract List getChildrenUrls(); + + public abstract int getParentBatchIdWithParentUrl(String url); + + public abstract boolean isInChildrenUrl(String url); + + public abstract void resetChildrenUrls(); +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Param.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Param.java new file mode 100644 index 00000000..7f83b034 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Param.java @@ -0,0 +1,40 @@ +package org.bench4q.recorder.httpcapture; + +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +public class Param { + public String name; + public String value; + + public static Param createParam(String name, String value) { + Param param = new Param(); + param.name = name; + param.value = value; + return param; + } + + public static class ParamParser { + public static List parse(String paramString) { + List paramStrings = getNVField(paramString); + List params = new ArrayList(); + for (String paramSource : paramStrings) { + int index = paramSource.indexOf("="); + params.add(createParam(paramSource.substring(0, index).trim(), + paramSource.substring(index + 1))); + } + return params; + } + + static public List getNVField(String value) { + StringTokenizer st = new StringTokenizer(value, ";", false); + List result = new ArrayList(); + while (st.hasMoreTokens()) { + String token = st.nextToken(); + result.add(token.trim()); + } + return result; + } + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/ProxyServer.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/ProxyServer.java new file mode 100644 index 00000000..5cda178b --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/ProxyServer.java @@ -0,0 +1,87 @@ +package org.bench4q.recorder.httpcapture; + +import java.io.IOException; +import java.net.ServerSocket; +import java.util.Enumeration; +import java.util.Vector; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class ProxyServer implements Runnable { + private Vector listeners; + private ServerSocket srvSock; + private int count; + private static final Log log = LogFactory.getLog(ProxyServer.class); + + public ProxyServer() throws IOException { + this(0); + } + + public ProxyServer(int port) throws IOException { + this.srvSock = new ServerSocket(port); + this.listeners = new Vector(); + } + + public void addObserver(Observer proxy) { + this.listeners.addElement(proxy); + } + + public void removeObserver(Observer proxy) { + this.listeners.removeElement(proxy); + } + + public void processRequest(HttpRequestHeader header, byte[] requestBody) + throws Exception { + for (Enumeration e = this.listeners.elements(); e + .hasMoreElements();) { + Observer pl = (Observer) e.nextElement(); + pl.processRequest(header, requestBody); + } + } + + public void processResponse(HttpRequestHeader header, byte[] requestBody, + byte[] response) throws Exception { + for (Enumeration e = this.listeners.elements(); e + .hasMoreElements();) { + Observer pl = (Observer) e.nextElement(); + pl.processResponse(header, requestBody, response); + } + } + + public void run() { + if (this.getServerSocket().isClosed()) { + return; + } + try { + while (true) { + RequestHandler handler = new RequestHandler(this, this + .getServerSocket().accept()); + log.trace("New connection. Creating new RequestHandler thread."); + Thread t = new Thread(handler, "Bench4QRequestHandler #" + + this.getLocalPort() + "#" + this.count); + t.start(); + this.count += 1; + } + } catch (Exception e) { + return; + } + } + + int getLocalPort() { + return this.srvSock.getLocalPort(); + } + + public ServerSocket getServerSocket() { + return this.srvSock; + } + + public static abstract interface Observer { + public abstract void processRequest( + HttpRequestHeader paramHttpRequestHeader, + byte[] paramArrayOfByte) throws Exception; + + public abstract void processResponse( + HttpRequestHeader paramHttpRequestHeader, byte[] requestBody, + byte[] paramArrayOfByte) throws Exception; + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/RequestHandler.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/RequestHandler.java new file mode 100644 index 00000000..f40758ae --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/RequestHandler.java @@ -0,0 +1,212 @@ +package org.bench4q.recorder.httpcapture; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ConnectException; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.SocketException; +import java.net.URL; + +import org.apache.log4j.Logger; + +public class RequestHandler implements Runnable { + private static final Logger log = Logger.getLogger(RequestHandler.class); + private Config config = Config.getConfig(); + private InputStream clientIn; + private InputStream serverIn; + private OutputStream clientOut; + private OutputStream serverOut; + private HttpRequestHeader header; + private ProxyServer proxyServer; + private Socket clientSocket; + private Socket serverSocket; + private ByteArrayOutputStream buffer; + private static Object mutex = new Object(); + + public RequestHandler(ProxyServer proxyServer, Socket s) { + assert (s != null); + this.clientSocket = s; + this.buffer = new ByteArrayOutputStream(); + this.proxyServer = proxyServer; + } + + private void initClientServerConnections(Socket s) throws Throwable { + this.clientIn = new BufferedInputStream(s.getInputStream()); + this.clientOut = s.getOutputStream(); + try { + this.header = new HttpRequestHeader(this.clientIn); + } catch (IOException e) { + log.error("truncated request from browser: " + this.header.url, e); + System.out.println(this.header.url); + throw new Utils.SilentException(); + } + if (!this.header.url.startsWith("http")) + throw new Utils.UserException( + "Bench4Q only supports the HTTP protocol."); + URL url = new URL(this.header.url); + + Config.ProxySettings proxy = this.config.getProxySettings(); + int port; + String host; + if (proxy != null) { + host = proxy.host; + port = proxy.port; + } else { + host = url.getHost(); + port = url.getPort(); + } + + if (port < 1) + port = 80; + try { + this.serverSocket = new Socket(InetAddress.getByName(host), port); + } catch (ConnectException e) { + String msg = "Cannot connect to "; + if (proxy != null) + msg = msg + "proxy server "; + msg = msg + host; + if (port != 80) + msg = msg + " on port " + Integer.toString(port); + throw new Utils.UserException(msg + "."); + } + try { + this.serverIn = this.serverSocket.getInputStream(); + this.serverOut = this.serverSocket.getOutputStream(); + } catch (Throwable e) { + this.serverSocket.close(); + this.serverSocket = null; + throw e; + } + } + + private String stripProxyInfoFromRequestHeader() + throws MalformedURLException { + String res = ""; + String origUrl = this.header.url; + URL url = new URL(origUrl); + this.header.url = url.getFile(); + res = this.header.toString(); + this.header.url = origUrl; + return res; + } + + public void run() { + try { + try { + int rs = this.clientSocket.getReceiveBufferSize(); + int ss = this.clientSocket.getSendBufferSize(); + int BUF_SIZE = rs < ss ? ss : rs; + + byte[] buf = new byte[BUF_SIZE]; + + initClientServerConnections(this.clientSocket); + String headerStr; + if (this.config.getProxySettings() == null) + headerStr = stripProxyInfoFromRequestHeader(); + else + headerStr = this.header.toString(); + log.trace("read request header"); + + byte[] bytes = headerStr.getBytes(); + this.serverOut.write(bytes, 0, bytes.length); + + log.trace("wrote request header"); + byte[] requestBody; + if (this.header.contentLength > 0) { + this.buffer.reset(); + int len = 0; + int num = 0; + while (num < this.header.contentLength) { + try { + len = readRequestBody(buf); + } catch (SocketException e) { + log.info("truncated request from browser: " + + e.getMessage()); + throw new Utils.SilentException(); + } + if (len == 0 || len == -1) { + System.out.println("Read " + num + + "byte from requestBody"); + break; + } + log.trace("read " + Integer.toString(len) + " bytes"); + this.serverOut.write(buf, 0, len); + this.buffer.write(buf, 0, len); + log.trace("wrote " + Integer.toString(len) + " bytes"); + num += len; + } + requestBody = this.buffer.toByteArray(); + log.trace("transferred rest of request body"); + } else { + requestBody = new byte[0]; + log.trace("no request body"); + } + + this.clientSocket.shutdownInput(); + + this.serverSocket.shutdownOutput(); + + synchronized (mutex) { + this.proxyServer.processRequest(this.header, requestBody); + log.trace("processed request"); + + this.buffer.reset(); + int len; + while ((len = this.serverIn.read(buf, 0, buf.length)) >= 0) { + log.trace("read " + Integer.toString(len)); + try { + this.clientOut.write(buf, 0, len); + } catch (SocketException e) { + log.info("browser stopped listening: " + + e.getMessage() + this.buffer.toString()); + throw new Utils.SilentException(); + } + this.buffer.write(buf, 0, len); + } + log.trace("transferred response len:" + len); + + this.proxyServer.processResponse(this.header, requestBody, + this.buffer.toByteArray()); + log.trace("processed response"); + } + + } catch (Exception e) { + log.error(e, e); + } finally { + if (this.serverSocket != null) { + this.serverSocket.close(); + log.trace("closed server socket"); + } + + this.clientSocket.close(); + log.trace("closed client socket"); + } + if (this.serverSocket != null) { + this.serverSocket.close(); + log.trace("closed server socket"); + } + + this.clientSocket.close(); + log.trace("closed client socket"); + } catch (Throwable localThrowable) { + log.error(localThrowable, localThrowable); + } + } + + private int readRequestBody(byte[] buf) throws IOException { + int alreadyReadLength = 0; + int ch = -1; + while (alreadyReadLength < this.header.contentLength) { + if ((ch = this.clientIn.read()) != -1) { + buf[alreadyReadLength] = (byte) ch; + } + alreadyReadLength++; + } + return alreadyReadLength; + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Test.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Test.java new file mode 100644 index 00000000..d0ec874c --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Test.java @@ -0,0 +1,112 @@ +package org.bench4q.recorder.httpcapture; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +import org.bench4q.recorder.httpcapture.generator.GeneratorFactory; +import org.bench4q.recorder.httpcapture.generator.IScriptGenerator; + +public class Test { + private IScriptGenerator generator; + private IScriptAdapter scriptAdapter; + private boolean isRecording; + private File testFile; + ProxyServer proxyServer; + + public Test(ProxyServer proxy, IScriptAdapter adapter, String generatorClass) { + this.proxyServer = proxy; + adapter.setText(""); + this.generator = GeneratorFactory.newGenerator(generatorClass, adapter); + this.generator.doNew(); + this.scriptAdapter = adapter; + } + + public Test(ProxyServer proxy, IScriptAdapter adapter, File file) + throws IOException, Utils.UserException { + this.proxyServer = proxy; + this.testFile = file; + + StringBuffer buffer = new StringBuffer(); + BufferedReader r = new BufferedReader(new FileReader(this.testFile)); + String line = r.readLine(); + while (line != null) { + buffer.append(line); + buffer.append(IScriptGenerator.EOL); + line = r.readLine(); + } + r.close(); + String script = buffer.toString(); + + String generatorClass = null; + String[] classes = GeneratorFactory.getClasses(); + + for (int i = 0; i < classes.length; i++) { + if (script.indexOf(classes[i]) != -1) { + generatorClass = classes[i]; + break; + } + } + if (generatorClass == null) { + throw new Utils.UserException( + "Your file does not appear to have been generated by MaxQ.\n\n(MaxQ expects to find the class name of the generator somewhere in the script.\nPerhaps you have mistakenly deleted it?)"); + } + + adapter.setText(script); + this.generator = GeneratorFactory.newGenerator(generatorClass, adapter); + this.generator.doLoad(); + this.generator.parseTestName(); + } + + public File getTestFile() { + return this.testFile; + } + + public void setTestFile(File file) { + this.testFile = file; + } + + public boolean isRecording() { + return this.isRecording; + } + + public void stopRecording() { + this.proxyServer.removeObserver(this.generator); + assert (this.isRecording); + this.generator.doStopRecording(); + this.isRecording = false; + } + + public void startRecording() { + assert (!this.isRecording); + this.proxyServer.addObserver(this.generator); + this.isRecording = true; + this.generator.doStartRecording(); + } + + public boolean save() throws IOException { + return this.generator.doSave( + stripFileName(this.testFile.getAbsolutePath()), + this.testFile.getName()); + } + + private String stripFileName(String absolutePath) { + int index = absolutePath.lastIndexOf(System + .getProperty("file.separator")); + if (index == -1) { + return absolutePath; + } + return absolutePath.substring(0, index); + } + + public void close() { + if (this.isRecording) + this.proxyServer.removeObserver(this.generator); + this.generator.close(); + } + + public String getScriptContent() { + return this.scriptAdapter.getText(); + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Utils.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Utils.java new file mode 100644 index 00000000..9929235f --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/Utils.java @@ -0,0 +1,114 @@ +package org.bench4q.recorder.httpcapture; + +import java.io.File; +import java.io.FileWriter; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + +public class Utils { + public static final String SPACE = " "; + private static final Logger log = Logger.getLogger(Utils.class); + + public static File saveHTML(String htmlFileName, String str, String dir_str) { + if (str == null) { + log.error("Argument is null: EditorPane.saveHTML()"); + return null; + } + File dir, htmlFile; + if (dir_str == null) { + dir = new File("Tempfiles"); + } else { + dir = new File(dir_str); + } + dir.mkdir(); + try { + htmlFile = new File(dir, htmlFileName); + if (htmlFile.exists()) { + htmlFile.delete(); + log.warn("deleting duplicated file: " + htmlFileName); + } + htmlFile.createNewFile(); + PrintWriter writer = new PrintWriter(new FileWriter(htmlFile)); + writer.print(str); + writer.close(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + return htmlFile; + } + + public static String[] splitString(String str, String delim) { + StringTokenizer st = new StringTokenizer(str, delim); + String[] res = new String[st.countTokens()]; + int i = 0; + while (st.hasMoreTokens()) { + res[i] = st.nextToken(); + i++; + } + return res; + } + + public static String replace(String str, String search, String replace) { + int pos = str.indexOf(search); + if (pos == -1) + return str; + StringBuffer buff = new StringBuffer(str.length() + 32); + int start = 0; + while ((pos != -1) && (start < str.length())) { + buff.append(str.substring(start, pos)); + buff.append(replace); + + start = pos + search.length(); + if (start < str.length()) + pos = str.indexOf(search, start); + } + if (start < str.length()) + buff.append(str.substring(start)); + + return buff.toString(); + } + + public static List getParams(String query) { + List paramList = new ArrayList(); + if (query != null) { + query = query.trim(); + log.debug(" parsing: " + query); + String[] items = splitString(query, "&"); + for (int i = 0; i < items.length; i++) { + int pos = items[i].indexOf("="); + if (pos != -1) { + Param p = new Param(); + paramList.add(p); + p.name = items[i].substring(0, pos); + if (pos < items[i].length() - 1) + p.value = items[i].substring(pos + 1); + else + p.value = ""; + } + } + } + return paramList; + } + + public static class SilentException extends Exception { + private static final long serialVersionUID = 3172942039967787899L; + + public SilentException() { + super(); + } + } + + public static class UserException extends Exception { + private static final long serialVersionUID = -7337004995296463936L; + + public UserException(String s) { + super(); + } + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/AbstractCodeGenerator.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/AbstractCodeGenerator.java new file mode 100644 index 00000000..d4136687 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/AbstractCodeGenerator.java @@ -0,0 +1,555 @@ +package org.bench4q.recorder.httpcapture.generator; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Vector; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.bench4q.recorder.httpcapture.ProxyServer; +import org.bench4q.recorder.httpcapture.Action; +import org.bench4q.recorder.httpcapture.Config; +import org.bench4q.recorder.httpcapture.HeaderValue; +import org.bench4q.recorder.httpcapture.HttpRequestHeader; +import org.bench4q.recorder.httpcapture.HttpTestCase; +import org.bench4q.recorder.httpcapture.IScriptAdapter; +import org.bench4q.recorder.httpcapture.Param; +import org.bench4q.recorder.httpcapture.Utils; +import org.bench4q.recorder.httpcapture.Utils.UserException; +import org.bench4q.share.models.agent.RunScenarioModel; +import org.bench4q.share.models.agent.scriptrecord.BehaviorModel; + +public abstract class AbstractCodeGenerator implements IScriptGenerator, + ProxyServer.Observer, Runnable { + private Config config = Config.getConfig(); + private static final Log log; + private static String cpRspTo; + private static boolean cpRspToStdout; + private static boolean cpRspToFile; + private static final String[] MIME_DEFAULTS; + static HashMap mimeTypes; + protected static final String END_STATEMENT; + protected static String jtidyConfigFile; + protected long assertNumber = 0L; + protected boolean headersExist = false; + private IScriptAdapter scriptAdapter; + private String testName; + private boolean ignoreNextResponse; + private Pattern[] namePatterns; + private LinkedList outstandingInserts; + private Thread insertThread; + private String charset; + private long timeElapsedSinceLastestRequest; + private Date latestRequestDate; + private int requestCount; + private boolean firstHtmlResponse; + + static final boolean $assertionsDisabled = !(AbstractCodeGenerator.class + .desiredAssertionStatus()); + + private static boolean isCpRspToStdout() { + return cpRspToStdout; + } + + private static boolean isCpRspToFile() { + return cpRspToFile; + } + + protected int getRequestCount() { + return requestCount; + } + + private boolean isFirstHtmlResponse() { + return firstHtmlResponse; + } + + private void setFirstHtmlResponse(boolean firstHtmlResponse) { + this.firstHtmlResponse = firstHtmlResponse; + } + + public AbstractCodeGenerator(IScriptAdapter adapter, String[] nameRegExps) { + this.reset(); + this.scriptAdapter = adapter; + this.namePatterns = new Pattern[nameRegExps.length]; + for (int i = 0; i < nameRegExps.length; ++i) + this.namePatterns[i] = Pattern.compile(nameRegExps[i], 8); + + this.testName = this.config.getProperty("test.default_testname", + "Bench4QTest"); + this.insertThread = new Thread(this); + this.insertThread.start(); + } + + private void reset() { + this.latestRequestDate = new Date(); + this.assertNumber = 0; + this.requestCount = 0; + this.latestRequestDate = new Date(); + this.timeElapsedSinceLastestRequest = 0L; + this.setFirstHtmlResponse(true); + } + + public IScriptAdapter getScriptAdapter() { + return this.scriptAdapter; + } + + private void setTestName(String testName) { + this.testName = testName; + } + + private void setTestPath(String testPath) { + } + + public long getTimeElapsedSinceLastestRequest() { + return this.timeElapsedSinceLastestRequest; + } + + public boolean isFirstRequest() { + return this.requestCount == 0; + } + + public String parseTestName() { + return this.testName; + } + + public boolean doSave(String path, String fileName) { + String name = fileName; + int dotPos = fileName.indexOf("."); + RunScenarioModel runScenarioModel = this.scriptAdapter + .getRunScenarioModel(); + FileWriter fileWriter; + + if (dotPos > -1) + name = fileName.substring(0, dotPos); + setTestName(name); + setTestPath(path); + + if (runScenarioModel == null) { + } + + try { + fileWriter = new FileWriter(new File(path + + System.getProperty("file.separator") + fileName)); + Marshaller marshaller = JAXBContext.newInstance( + runScenarioModel.getClass()).createMarshaller(); + marshaller.marshal(runScenarioModel, fileWriter); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + + return true; + } catch (JAXBException e) { + e.printStackTrace(); + return false; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + } + + public void doLoad() { + setTestName(parseTestName()); + } + + public void close() { + this.insertThread.interrupt(); + } + + public void processRequest(HttpRequestHeader header, byte[] requestBody) + throws Exception { + // doParseRequest(header, requestBody); + } + + private void doParseRequest(HttpRequestHeader header, byte[] requestBody) + throws UserException, UnsupportedEncodingException { + Param[] params; + int i; + String name; + String value; + Date d = new Date(); + this.timeElapsedSinceLastestRequest = (d.getTime() - this.latestRequestDate + .getTime()); + this.latestRequestDate = d; + + if ((header.method.toLowerCase().equals("get")) + && (urlIgnored(header.url))) { + log.debug("Ignoring GET request: \"" + header.url + "\""); + this.ignoreNextResponse = true; + return; + } + + boolean isMultiPartRequest = header.contentType + .startsWith("multipart/form-data"); + boolean isFormRequest = header.contentType + .startsWith("application/x-www-form-urlencoded"); + Action action = new Action(); + + String newCharset = null; + newCharset = doForCharset(header.contentType); + + doHeaders(createHeaders(header)); + + String url = header.url; + log.debug(" recording url: " + url); + + String method = header.method.toLowerCase(); + if (method.equals("get")) { + method = "Get"; + } else if (method.equals("post")) { + method = "Post"; + } + int pos = url.indexOf("?"); + if ((pos != -1) && (url.length() > pos + 1)) { + setQueryStringParams(action, url.substring(pos + 1)); + action.setUrl(url.substring(0, pos)); + } else { + action.setUrl(url); + } + if (requestBody.length > 0) { + if (isMultiPartRequest) { + setMultiPartData(action, header, requestBody); + } else if (!isFormRequest) { + if (newCharset != null) + doSetData(new String(requestBody, newCharset)); + else + doSetData(new String(requestBody)); + } else if (newCharset != null) { + setBodyParams(action, new String(requestBody, newCharset)); + } else { + setBodyParams(action, new String(requestBody)); + } + + } + + if (action.getParamsCount() > 0) { + params = action.getParams(); + for (i = 0; i < params.length; ++i) { + name = params[i].name; + value = params[i].value; + if ((name.indexOf("+") != -1) || (name.indexOf("%") != -1)) + params[i].name = HttpTestCase.staticUrlDecode(name); + if ((value.indexOf("+") != -1) || (value.indexOf("%") != -1)) + params[i].value = HttpTestCase.staticUrlDecode(value); + } + doParameterList(params); + } + + if (action.getQueryStringParamCount() > 0) { + params = action.getQueryStringParams(); + + for (i = 0; i < params.length; ++i) { + name = params[i].name; + value = params[i].value; + if ((name.indexOf("+") != -1) || (name.indexOf("%") != -1)) + params[i].name = HttpTestCase.staticUrlDecode(name); + if ((value.indexOf("+") != -1) || (value.indexOf("%") != -1)) + params[i].value = HttpTestCase.staticUrlDecode(value); + } + doQueryStringParameterList(params); + } + + if (action.getBodyParamCount() > 0) { + params = action.getBodyParams(); + + for (i = 0; i < params.length; ++i) { + name = params[i].name; + value = params[i].value; + if ((name.indexOf("+") != -1) || (name.indexOf("%") != -1)) + params[i].name = HttpTestCase.staticUrlDecode(name); + if ((value.indexOf("+") != -1) || (value.indexOf("%") != -1)) + params[i].value = HttpTestCase.staticUrlDecode(value); + } + doBodyParameterList(params); + } + + String url_str = header.url; + if (requestBody.length > 0) { + url_str = url_str + '?' + new String(requestBody); + } + + if (!(isMultiPartRequest)) { + doTestUrlMessage(HttpTestCase.staticUrlDecode(url_str).trim()); + } + + String data_str = ""; + String cont_len_str = ""; + + if (isMultiPartRequest) { + method = method + "MultiPart"; + data_str = ", data"; + cont_len_str = ", " + header.contentLength; + doSetData(action.getMultiPartData()); + } + doCallUrl(action, method, data_str, cont_len_str); + this.requestCount++; + } + + private String doForCharset(String contentType) throws UserException { + Matcher charsetParser = Pattern.compile("charset=([a-z0-9_\\-]+)", 2) + .matcher(contentType); + String newCharset = ""; + if (charsetParser.matches()) { + newCharset = charsetParser.group(); + if (!(newCharset.equals(this.charset))) { + doSetCharset(newCharset); + } else if (this.charset != null) { + doSetCharset(this.charset); + } + + } + return newCharset; + } + + private HeaderValue[] createHeaders(HttpRequestHeader header) { + Vector v = new Vector(); + if (header.contentType.length() > 0) + v.add(new HeaderValue("Content-Type", header.contentType)); + if (header.accept.length() > 0) + v.add(new HeaderValue("Accept", header.accept)); + if (header.referer.length() > 0) + v.add(new HeaderValue("Referer", header.referer)); + if (header.pragmaNoCache) + v.add(new HeaderValue("Cache-Control", "no-cache")); + HeaderValue[] hv = new HeaderValue[v.size()]; + return ((HeaderValue[]) (HeaderValue[]) v.toArray(hv)); + } + + public void processResponse(HttpRequestHeader header, byte[] requestBody, + byte[] response) throws Exception { + if (this.ignoreNextResponse) { + log.debug("Ignoring response"); + this.ignoreNextResponse = false; + return; + } + ResponseParser responseParser = new ResponseParser(response); + ResponseHeader responseHeader = responseParser.getResponseHeader(); + doAssertResponse(responseHeader.getRespCode()); + if (responseHeader.isValidResponseHeader()) { + if (responseHeader.isGoodRequest() + && responseHeader.isHtmlContentType() + && hasHtmlTag(responseParser)) { + dealWithHtmlResponse(header, responseParser); + doParseRequest(header, requestBody); + System.out.println("enter doParseHtml"); + doParseHtmlContent(responseParser.getResponseBody(), header.url); + setStruts(new String(response).toLowerCase().indexOf( + "org.apache.struts.taglib.html.token") > 0); + doEndTransaction(); + return; + } + setStruts(new String(response).toLowerCase().indexOf( + "org.apache.struts.taglib.html.token") > 0); + doEndTransaction(); + } else { + log.debug("Ignoring response because content type is not known: " + + responseHeader.getRespCode()); + } + doParseRequest(header, requestBody); + } + + private boolean hasHtmlTag(ResponseParser responseParser) { + return responseParser.getResponseBody() == null ? false + : responseParser.getResponseBody().contains("(); + try { + while (!(Thread.interrupted())) { + synchronized (this.outstandingInserts) { + this.outstandingInserts.wait(); + while (this.outstandingInserts.size() > 0) { + BehaviorModel behaviorModel = this.outstandingInserts + .removeFirst(); + this.getScriptAdapter().insertUserBehaviorsToScenario( + behaviorModel); + } + } + } + } catch (InterruptedException e) { + log.trace("Thread dead"); + } + } + + public abstract void doAssertResponse(String paramString) + throws Utils.UserException; + + public abstract void doCallUrl(Action action, String paramString2, + String paramString3, String paramString4) + throws Utils.UserException; + + public abstract void doEndTransaction() throws Utils.UserException; + + public abstract void setStruts(boolean paramBoolean); + + public abstract void doSetCharset(String paramString) + throws Utils.UserException; + + public abstract void doParameterList(Param[] paramArrayOfParam) + throws Utils.UserException; + + public abstract void doQueryStringParameterList(Param[] paramArrayOfParam) + throws Utils.UserException; + + public abstract void doBodyParameterList(Param[] paramArrayOfParam) + throws Utils.UserException; + + public abstract void doResponseForFile() throws Utils.UserException; + + public abstract void doResponseForStdOut(String paramString) + throws Utils.UserException; + + public abstract void doSetData(String paramString) + throws Utils.UserException; + + public abstract void doTestUrlMessage(String paramString) + throws Utils.UserException; + + public abstract void doTidyCode(String paramString) + throws Utils.UserException; + + public abstract void doParseHtmlContent(String responseBody, String rootUrl); + + public abstract void doHeaders(HeaderValue[] paramArrayOfHeaderValue); + + protected void insert(BehaviorModel behaviorModel) + throws Utils.UserException { + synchronized (this.outstandingInserts) { + this.outstandingInserts.add(behaviorModel); + this.outstandingInserts.notifyAll(); + } + } + + private void setMultiPartData(Action action, HttpRequestHeader header, + byte[] strarray) { + String str = new String(strarray); + int begin = header.contentType.indexOf("boundary="); + int end = header.contentType.indexOf("; ", begin); + if (end == -1) + end = header.contentType.length(); + String boundary = header.contentType.substring(begin + 9, end); + + String[] parts = str.split("--" + boundary); + if ((!($assertionsDisabled)) && (!(parts[0].equals("")))) + throw new AssertionError(); + + Pattern re = Pattern + .compile( + "\r\nContent-Disposition: form-data; name=\"([^\"]+)\"[^\r\n]*\r\n\r\n(.*)\r\n", + 32); + for (int i = 1; i < parts.length - 1; ++i) { + Matcher m = re.matcher(parts[i]); + boolean ok = m.matches(); + if ((!($assertionsDisabled)) && (!(ok))) + throw new AssertionError(); + Param p = new Param(); + p.name = m.group(1); + p.value = m.group(2); + action.addBodyParam(p); + } + + if ((!($assertionsDisabled)) + && (!(parts[(parts.length - 1)].equals("--\r\n")))) + throw new AssertionError(); + } + + private void setQueryStringParams(Action action, String str) { + List params = Utils.getParams(str); + Iterator iter = params.iterator(); + while (iter.hasNext()) + action.addQueryStringParam((Param) iter.next()); + } + + private void setBodyParams(Action action, String str) { + List params = Utils.getParams(str); + Iterator iter = params.iterator(); + while (iter.hasNext()) + action.addBodyParam((Param) iter.next()); + } + + private boolean urlIgnored(String str) { + boolean ignore = false; + + List incPats = this.config.getIncludePatterns(); + List excPats = this.config.getExcludePatterns(); + if ((!(ignore)) && (incPats.size() != 0)) { + log.debug("urlIgnored: checking for include matches"); + ignore = this.checkMatch(incPats.iterator(), str, false, true); + } + if ((!(ignore)) && (excPats.size() != 0)) { + log.debug("urlIgnored: checking for exclude matches"); + ignore = this.checkMatch(excPats.iterator(), str, true, ignore); + } + return ignore; + } + + private boolean checkMatch(Iterator iter, String str, boolean res, + boolean def) { + while (iter.hasNext()) { + Matcher m = ((Pattern) iter.next()).matcher(str); + log.debug("checkMatch: for \"" + str + "\" with pattern: \"" + + m.pattern().pattern() + "\""); + if (m.find()) { + log.debug("checkMatch: Found match, returning: " + res); + return res; + } + } + log.debug("checkMatch: Didn't find match, returning: " + def); + return def; + } + + static { + log = LogFactory.getLog(AbstractCodeGenerator.class); + + cpRspTo = System.getProperty("http.cpRspTo"); + + cpRspToFile = false; + MIME_DEFAULTS = new String[] { "text/plain", "text/html", + "text/comma-separated-values" }; + + END_STATEMENT = ";" + EOL; + + jtidyConfigFile = System.getProperty("jtidy.config"); + + if (cpRspTo != null) + if (cpRspTo.toLowerCase().compareTo("stdout") == 0) + cpRspToStdout = true; + else if (cpRspTo.toLowerCase().compareTo("file") == 0) + cpRspToFile = true; + + mimeTypes = new HashMap(); + for (int i = 0; i < MIME_DEFAULTS.length; ++i) + mimeTypes.put(MIME_DEFAULTS[i], MIME_DEFAULTS[i]); + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/Bench4qCodeGenerator.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/Bench4qCodeGenerator.java new file mode 100644 index 00000000..0d995b01 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/Bench4qCodeGenerator.java @@ -0,0 +1,367 @@ +package org.bench4q.recorder.httpcapture.generator; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.Logger; +import org.bench4q.recorder.httpcapture.Action; +import org.bench4q.recorder.httpcapture.Config; +import org.bench4q.recorder.httpcapture.HeaderValue; +import org.bench4q.recorder.httpcapture.IScriptAdapter; +import org.bench4q.recorder.httpcapture.Param; +import org.bench4q.recorder.httpcapture.Utils; +import org.bench4q.share.models.agent.ParameterModel; +import org.bench4q.share.models.agent.scriptrecord.BehaviorModel; +import org.bench4q.share.models.agent.scriptrecord.UsePluginModel; + +public class Bench4qCodeGenerator extends AbstractCodeGenerator { + static final String TIMER_PROP = "generator.isac.timer"; + static final String NULL_TIMER = "null"; + static final String CONSTANT_TIMER = "ConstantTimer"; + static final String RANDOM_TIMER = "Random"; + static final String DEFAULT_TIMER = "ConstantTimer"; + static final String RANDOM_TIMER_DIST_PROP = "generator.isac.timer.random.dist"; + static final String RANDOM_TIMER_DIST_UNIFORM = "uniform"; + static final String RANDOM_TIMER_DIST_GAUSSIAN = "gaussian"; + static final String RANDOM_TIMER_DIST_POISSON = "poisson"; + static final String RANDOM_TIMER_DIST_NEGEXPO = "negexpo"; + static final String RANDOM_TIMER_DIST_DEFAULT = "uniform"; + static final String RANDOM_TIMER_MIN_PROP = "generator.isac.timer.random.min"; + static final String RANDOM_TIMER_DELTA_PROP = "generator.isac.timer.random.delta"; + static final String RANDOM_TIMER_UNIT_PROP = "generator.isac.timer.random.unit"; + static final String RANDOM_TIMER_DEVIATION_PROP = "generator.isac.timer.random.deviation"; + static final String[][] escapes = { { "\\", "\\\\" }, { ";", "\\;" }, + { "&", "&" }, { "\"", """ }, { "<", "<" }, + { ">", ">" } }; + private String queryStringParameters = ""; + private String bodyParameters = ""; + private String body = ""; + private String headers = ""; + private String timer; + private String randomDist; + private int delta = 0; + private int deviation = 0; + private int unit = 1; + private static Logger logger = Logger.getLogger(Bench4qCodeGenerator.class); + + private static String escapeXmlString(String str) { + for (int i = 0; i < escapes.length; ++i) + str = str.replace(escapes[i][0], escapes[i][1]); + + return str; + } + + private static String encodedParameterList(Param[] params) { + String result = ""; + for (int i = 0; i < params.length; ++i) { + if (i > 0) + result = result + ";"; + + result = result + escapeXmlString(params[i].name) + "=" + + escapeXmlString(params[i].value); + } + return result; + } + + public Bench4qCodeGenerator(IScriptAdapter adapter) { + super(adapter, new String[0]); + } + + public static String getGeneratorDescription() { + return "Bench4Q Scenario"; + } + + public void doNew() { + List usePlugins = new ArrayList(); + UsePluginModel usePlugin1 = new UsePluginModel(); + UsePluginModel usePlugin2 = new UsePluginModel(); + + usePlugin1.setParameters(new ArrayList()); + usePlugin1.setId("http"); + usePlugin1.setName("Http"); + + usePlugin2.setId("timer"); + usePlugin2.setParameters(new ArrayList()); + + Config conf = Config.getConfig(); + this.timer = conf.getProperty("generator.isac.timer", "ConstantTimer"); + + if (this.timer.equals("ConstantTimer")) { + usePlugin2.setName("ConstantTimer"); + } else if (this.timer.equals("Random")) { + usePlugin2.setName("Random"); + this.randomDist = Config.getConfig().getProperty( + "generator.isac.timer.random.dist", "uniform"); + try { + if (this.randomDist.equals("uniform")) { + this.delta = conf.getPropertyInt( + "generator.isac.timer.random.delta").intValue(); + } else if (this.randomDist.equals("gaussian")) { + this.delta = conf.getPropertyInt( + "generator.isac.timer.random.delta").intValue(); + this.deviation = conf.getPropertyInt( + "generator.isac.timer.random.deviation").intValue(); + } else if (this.randomDist.equals("poisson")) { + this.unit = conf.getPropertyInt( + "generator.isac.timer.random.unit").intValue(); + } else if (!(this.randomDist.equals("negexpo"))) { + + } else { + this.delta = conf.getPropertyInt( + "generator.isac.timer.random.delta").intValue(); + } + + } catch (Utils.UserException ex) { + ex.printStackTrace(System.err); + System.err + .println("Warning: incorrect property settings for Isac random timer distribution " + + this.randomDist); + } + } + + usePlugins.add(usePlugin1); + usePlugins.add(usePlugin2); + + appendUserPluginsToScenario(usePlugins); + } + + public String[] getValidFileExtensions() { + return new String[] { ".xis" }; + } + + public void doParameterList(Param[] params) throws Utils.UserException { + } + + public void doQueryStringParameterList(Param[] params) + throws Utils.UserException { + this.queryStringParameters = encodedParameterList(params); + } + + public void doBodyParameterList(Param[] params) throws Utils.UserException { + this.bodyParameters = encodedParameterList(params); + } + + public void doTestUrlMessage(String url) { + } + + public void doSetData(String data) { + if (data == null) { + return; + } + body = data; + } + + public void doCallUrl(Action action, String method, String data, + String contentLength) throws Utils.UserException { + if (!isFirstRequest()) + doInsertDelay(getTimeElapsedSinceLastestRequest()); + BehaviorModel userBehavior = createHttpBehavior(this.getRequestCount(), + action.getUrl(), method); + insertBehavior(userBehavior); + + this.queryStringParameters = ""; + this.bodyParameters = ""; + } + + public BehaviorModel createHttpBehavior(int behaviorId, String url, + String method) { + List params = new ArrayList(); + params.add(ParameterModel.createParameter("url", url)); + params.add(ParameterModel.createParameter("queryParams", + this.queryStringParameters)); + params.add(ParameterModel.createParameter("headers", this.headers)); + if (method.equalsIgnoreCase("post")) { + if (body.length() > 0) { + params.add(ParameterModel.createParameter("bodyContent", + this.body)); + } else { + params.add(ParameterModel.createParameter("bodyparameters", + this.bodyParameters)); + } + } + this.queryStringParameters = ""; + this.bodyParameters = ""; + this.headers = ""; + this.body = ""; + return BehaviorModel.UserBehaviorBuilder(behaviorId, method, "http", + params); + } + + public void doAssertResponse(String respCode) { + // TODO:Here I can tell if there are some incorrect request when + // record the script + } + + public void doTidyCode(String url) { + } + + @Override + public void doParseHtmlContent(String responseBody, String rootUrl) { + int htmlStart = responseBody.indexOf(""); + if (htmlStart == -1 || htmlEnd == -1) { + return; + } + parseDocument(rootUrl, responseBody, htmlStart, htmlEnd); + } + + private void parseDocument(String rootUrl, String responseContent, + int htmlStart, int htmlEnd) { + // TODO:reset the childrenUrls in scirptAdapter + String htmlContent = responseContent.substring(htmlStart, htmlEnd + 6); + saveToFile(htmlContent); + HtmlDocumentParser documentParser = new HtmlDocumentParser(htmlContent, + rootUrl); + List childrenUrls = documentParser + .buildParentChildrenRelationship(this.getScriptAdapter() + .getParentBatchIdWithParentUrl(rootUrl)); + this.getScriptAdapter().getChildrenUrls().addAll(childrenUrls); + } + + private void saveToFile(String htmlContent) { + // TODO: For Test + try { + File storeFile = new File("RecordScriptTestCase/baidu.html"); + FileUtils.writeStringToFile(storeFile, htmlContent); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void doResponseForStdOut(String url) { + } + + public void doResponseForFile() { + } + + public void doEndTransaction() throws Utils.UserException { + } + + public void doStartRecording() { + } + + public void doStopRecording() { + } + + public void doClose() { + } + + public void setStruts(boolean struts) { + } + + public void doHeaders(HeaderValue[] headers) { + StringBuilder headersSB = new StringBuilder(); + for (int i = 0; i < headers.length; ++i) { + headersSB.append("header="); + headersSB.append(headers[i].getHeader()); + headersSB.append("|value="); + headersSB.append(headers[i].getValue()); + headersSB.append("|;"); + } + this.headers = headersSB.toString(); + } + + private void appendUserPluginsToScenario(List usePlugins) { + this.getScriptAdapter().appendUsePluginsToScenario(usePlugins); + } + + private void insertBehavior(BehaviorModel behaviorModel) + throws Utils.UserException { + insert(behaviorModel); + } + + private void doInsertDelay(long delay) throws Utils.UserException { + BehaviorModel timerBehavior = createTimerBehavior(delay); + try { + insertBehavior(timerBehavior); + } catch (Exception e) { + e.printStackTrace(); + logger.error("exception occured when doInsertDelay" + e.toString()); + } + + } + + private BehaviorModel createTimerBehavior(long delay) { + List parameterModels = new ArrayList(); + ParameterModel parameterModel = new ParameterModel(); + parameterModel.setKey("time"); + parameterModel.setValue(String.valueOf(delay)); + parameterModels.add(parameterModel); + return BehaviorModel.TimerBehaviorBuilder(0, "Sleep", "timer", + parameterModels); + } + + @SuppressWarnings("unused") + private StringBuilder createTimer(long delay) { + StringBuilder timerStr = new StringBuilder(); + + if (this.timer.equals("Random")) { + int min = (int) (delay - this.delta); + if (min < 0) + min = 0; + + if (this.randomDist.equals("uniform")) { + timerStr.append("\t\t\t" + + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t" + EOL); + } else if (this.randomDist.equals("gaussian")) { + timerStr.append("\t\t\t" + + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t" + EOL); + } else if (this.randomDist.equals("poisson")) { + timerStr.append("\t\t\t" + + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t" + EOL); + } else if (this.randomDist.equals("negexpo")) { + timerStr.append("\t\t\t" + + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t" + EOL); + } + timerStr.append("\t\t\t" + + EOL); + } else if (this.timer.equals("ConstantTimer")) { + timerStr.append("\t\t\t" + + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t\t" + EOL); + timerStr.append("\t\t\t\t" + EOL); + timerStr.append("\t\t\t" + EOL); + } + return timerStr; + } + + public void doSetCharset(String cs) throws Utils.UserException { + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ChildrenUrl.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ChildrenUrl.java new file mode 100644 index 00000000..3d003c22 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ChildrenUrl.java @@ -0,0 +1,29 @@ +package org.bench4q.recorder.httpcapture.generator; + +public class ChildrenUrl { + private String url; + private int parentBatchId; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public int getParentBatchId() { + return parentBatchId; + } + + public void setParentBatchId(int parentBatchId) { + this.parentBatchId = parentBatchId; + } + + public static ChildrenUrl createChilldUrl(String url, int parentBatchId) { + ChildrenUrl ret = new ChildrenUrl(); + ret.setParentBatchId(parentBatchId); + ret.setUrl(url); + return ret; + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ContentDecoder.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ContentDecoder.java new file mode 100644 index 00000000..029b6050 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ContentDecoder.java @@ -0,0 +1,44 @@ +package org.bench4q.recorder.httpcapture.generator; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +import org.apache.log4j.Logger; + +public class ContentDecoder { + protected Logger logger = Logger.getLogger(ContentDecoder.class); + + protected ContentDecoder() { + } + + public static ContentDecoder createDecoder(String encodeType) { + if (encodeType == null) { + return new ContentDecoder(); + } + + if (encodeType.equalsIgnoreCase("gzip")) { + return new GzipDecoder(); + } else { + return new ContentDecoder(); + } + } + + public byte[] decodeContent(InputStream inputStream) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int len; + while ((len = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, len); + } + System.out.println(outputStream.toString()); + System.out.println("ouputStream's size is" + outputStream.size()); + return outputStream.toByteArray(); + } catch (Exception e) { + logger.error(e, e); + return null; + } + + } + +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/GeneratorFactory.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/GeneratorFactory.java new file mode 100644 index 00000000..5c4247a1 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/GeneratorFactory.java @@ -0,0 +1,79 @@ +package org.bench4q.recorder.httpcapture.generator; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.bench4q.recorder.httpcapture.Config; +import org.bench4q.recorder.httpcapture.IScriptAdapter; +import org.bench4q.recorder.httpcapture.Utils; + +public class GeneratorFactory { + private static Config config = Config.getConfig(); + public static final String GENERATOR_CLASSNAMES_PROPERTY = "generator.classnames"; + public static final String JYTHON_CLASSNAME = "com.bitmechanic.maxq.generator.JythonCodeGenerator"; + + public static String[] getClasses() { + String names = config.getProperty("generator.classnames", + "com.bitmechanic.maxq.generator.JythonCodeGenerator"); + return Utils.splitString(names, ":"); + } + + public static String getClassDescription(String className) + throws ClassNotFoundException, IllegalAccessException, + InvocationTargetException { + Method getGenDesc; + Class gen = Class.forName(className); + try { + getGenDesc = gen.getMethod("getGeneratorDescription", gen); + } catch (NoSuchMethodException e) { + return className; + } + + return (String) getGenDesc.invoke((Object) null, (Object) null); + } + + public static IScriptGenerator newGenerator(String className, + IScriptAdapter adapter) { + Class clazz = null; + try { + clazz = GeneratorFactory.class.getClassLoader() + .loadClass(className); + } catch (ClassNotFoundException e) { + throw new IllegalStateException( + "Invalid test script class specified . Class not found:" + + className); + } + + if (IScriptGenerator.class.isAssignableFrom(clazz)) { + try { + Class[] generatorConstructorParameterClasses = { IScriptAdapter.class }; + Object[] generatorConstructorParameters = { adapter }; + Constructor constructor = clazz + .getDeclaredConstructor(generatorConstructorParameterClasses); + return (IScriptGenerator) constructor + .newInstance(generatorConstructorParameters); + } catch (NoSuchMethodException e) { + throw new IllegalStateException( + "Invalid test script class specified. Must have a constructor that takes in properties: " + + className); + } catch (InstantiationException e) { + throw new IllegalStateException( + "Invalid test script class specified. Could not construct: " + + className); + } catch (InvocationTargetException e) { + e.printStackTrace(); + throw new IllegalStateException( + "Invalid test script class specified. Exception thrown in constructor: " + + className); + } catch (IllegalAccessException e) { + throw new IllegalStateException( + "Invalid test script class specified. IllegalAccessException: " + + className); + } + } + throw new IllegalStateException( + "Invalid test script class specified. Does not implement IScriptGenerator: " + + className); + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/GzipDecoder.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/GzipDecoder.java new file mode 100644 index 00000000..f1742bc9 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/GzipDecoder.java @@ -0,0 +1,26 @@ +package org.bench4q.recorder.httpcapture.generator; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.GZIPInputStream; + +public class GzipDecoder extends ContentDecoder { + + public byte[] decodeContent(InputStream inputStream) { + try { + GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + byte[] buf = new byte[1024]; + int len; + while ((len = gzipInputStream.read(buf)) > 0) { + outputStream.write(buf, 0, len); + } + return outputStream.toByteArray(); + } catch (IOException e) { + logger.error("decodeContent", e); + return null; + } + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/HtmlDocumentParser.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/HtmlDocumentParser.java new file mode 100644 index 00000000..501f95a1 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/HtmlDocumentParser.java @@ -0,0 +1,54 @@ +package org.bench4q.recorder.httpcapture.generator; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +public class HtmlDocumentParser { + private Document document; + private static Logger logger = Logger.getLogger(HtmlDocumentParser.class); + + private Document getDocument() { + return document; + } + + private void setDocument(Document document) { + this.document = document; + } + + public HtmlDocumentParser(String htmlContent, String baseUrl) { + this.setDocument(Jsoup.parse(htmlContent, baseUrl)); + } + + public void beginParse() { + + } + + public List buildParentChildrenRelationship(int parentBatchId) { + List result = new ArrayList(); + if (parentBatchId == -1) { + return result; + } + + Elements allChildrenLinks = new Elements(); + allChildrenLinks.addAll(this.getDocument().select("[src]")); + allChildrenLinks.addAll(this.getDocument().select("link[href]")); + + logger.info("Following url shuold in children urls: \n"); + for (Element element : allChildrenLinks) { + String childAbsoluteUrl = element.absUrl("src"); + if (childAbsoluteUrl.isEmpty()) { + childAbsoluteUrl = element.absUrl("href"); + } + logger.info(childAbsoluteUrl); + result.add(ChildrenUrl.createChilldUrl(childAbsoluteUrl, + parentBatchId)); + } + return result; + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/IScriptGenerator.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/IScriptGenerator.java new file mode 100644 index 00000000..ad188813 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/IScriptGenerator.java @@ -0,0 +1,23 @@ +package org.bench4q.recorder.httpcapture.generator; + +import org.bench4q.recorder.httpcapture.ProxyServer; + +public interface IScriptGenerator extends ProxyServer.Observer { + public static final String EOL = System.getProperty("line.separator"); + + public abstract String[] getValidFileExtensions(); + + public abstract String parseTestName(); + + public abstract void doStartRecording(); + + public abstract void doStopRecording(); + + public abstract void doNew(); + + public abstract boolean doSave(String paramString1, String paramString2); + + public abstract void doLoad(); + + public abstract void close(); +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseHeader.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseHeader.java new file mode 100644 index 00000000..f38fdebc --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseHeader.java @@ -0,0 +1,74 @@ +package org.bench4q.recorder.httpcapture.generator; + +import java.util.HashMap; + +public class ResponseHeader { + public static HashMap MIME_TYPE = new HashMap() { + private static final long serialVersionUID = 1L; + + { + put("text/plain", "text/plain"); + put("text/html", "text/html"); + put("text/comma-separated-values", "text/comma-separated-values"); + } + }; + private String respCode; + private String contentType; + private String charset; + private String contentEncoding; + private int contentLength; + + public String getRespCode() { + return respCode; + } + + public void setRespCode(String respCode) { + this.respCode = respCode; + } + + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + public String getCharset() { + return charset; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + public String getContentEncoding() { + return contentEncoding; + } + + public void setContentEncoding(String contentEncoding) { + this.contentEncoding = contentEncoding; + } + + public int getContentLength() { + return contentLength; + } + + public void setContentLength(int contentLength) { + this.contentLength = contentLength; + } + + boolean isValidResponseHeader() { + return (getContentType() != null) + && (MIME_TYPE.containsKey(getContentType())) + && (getRespCode() != null); + } + + boolean isHtmlContentType() { + return getContentType().toLowerCase().contains("text/html"); + } + + boolean isGoodRequest() { + return this.getRespCode().startsWith("200"); + } +} diff --git a/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseParser.java b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseParser.java new file mode 100644 index 00000000..5fe7c758 --- /dev/null +++ b/Bench4Q-Recorder/src/main/java/org/bench4q/recorder/httpcapture/generator/ResponseParser.java @@ -0,0 +1,165 @@ +package org.bench4q.recorder.httpcapture.generator; + +import java.io.ByteArrayInputStream; +import java.nio.charset.Charset; +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + +public class ResponseParser { + private Logger logger = Logger.getLogger(ResponseParser.class); + private byte[] response; + private ResponseHeader responseHeader; + private String responseBody; + + private byte[] getResponse() { + return response; + } + + private void setResponse(byte[] response) { + this.response = response; + } + + public ResponseHeader getResponseHeader() { + return responseHeader; + } + + private void setResponseHeader(ResponseHeader responseHeader) { + this.responseHeader = responseHeader; + } + + public String getResponseBody() { + return responseBody; + } + + private void setResponseBody(String responseBody) { + this.responseBody = responseBody; + } + + public ResponseParser(byte[] response) { + this.setResponse(response); + this.setResponseHeader(parseResponseHeader()); + if (this.getResponseHeader().isValidResponseHeader() + && this.getResponseHeader().isHtmlContentType()) { + this.parseResponseBody(); + } + } + + private ResponseHeader parseResponseHeader() { + ResponseHeader result = new ResponseHeader(); + result.setCharset(parseCharset()); + result.setContentEncoding(parseContentEncoding()); + result.setContentLength(Integer.parseInt(parseContentLength())); + result.setContentType(parseContentType()); + result.setRespCode(parseResponseCode()); + return result; + } + + private String preprocess(String respString) { + return respString.toLowerCase(); + } + + private String parseContentLength() { + String respStr = preprocess(new String(this.getResponse())); + int pos = respStr.indexOf("content-length:"); + if (pos > -1) { + pos += 15; + int end = respStr.indexOf("\r\n", pos); + return respStr.substring(pos, end).trim(); + } + return "-1"; + } + + private String parseContentEncoding() { + String respStr = preprocess(new String(this.getResponse())); + int pos = respStr.indexOf("content-encoding:"); + if (pos > -1) { + pos += 18; + int end = respStr.indexOf("\r\n", pos); + return respStr.substring(pos, end); + } + return null; + } + + private String parseCharset() { + String response = preprocess(new String(this.getResponse())); + String ret = null; + int pos = response.indexOf("content-type:"); + if (pos > -1) { + pos += 14; + int end = response.indexOf("\r\n", pos); + int middle = response.indexOf(";", pos); + if (middle > -1 && middle < end) { + ret = response.substring(middle + 1, end); + } + } + if (ret != null) { + int begin = ret.indexOf("charset="); + ret = ret.substring(begin + 8); + } + return ret; + } + + private String parseContentType() { + String response = preprocess(new String(this.getResponse())); + String contentType = null; + int pos = response.indexOf("content-type:"); + if (pos > -1) { + pos += 14; + int end = response.indexOf("\r\n", pos); + int end2 = response.indexOf(";", pos); + if ((end2 > -1) && (end2 < end)) + end = end2; + if (end > -1) + contentType = response.substring(pos, end).trim(); + + logger.debug(" Content-Type: " + contentType); + } else { + logger.debug(" No content-type header! First few lines:"); + StringTokenizer st = new StringTokenizer(response, "\n"); + int i = 0; + while ((st.hasMoreTokens()) && (i < 5)) { + logger.debug(st.nextToken()); + ++i; + } + } + return contentType; + } + + private String parseResponseCode() { + String response = preprocess(new String(this.getResponse())); + String respCode = null; + int pos = response.indexOf(" "); + if (pos != -1) { + int end = response.indexOf(" ", pos + 1); + int end2 = response.indexOf("\n", pos + 1); + if ((end2 != -1) && (end2 < end)) + end = end2; + if (end != -1) + respCode = response.substring(pos + 1, end).trim(); + } + logger.debug("HTTP response code: " + respCode); + return respCode; + } + + private void parseResponseBody() { + ContentDecoder contentDecoder = ContentDecoder.createDecoder(this + .getResponseHeader().getContentEncoding()); + byte[] contentBodyAfterDecoded = contentDecoder + .decodeContent(new ByteArrayInputStream(this.getResponse(), + this.getResponse().length + - this.getResponseHeader().getContentLength(), + this.getResponseHeader().getContentLength())); + if (contentBodyAfterDecoded == null) { + return; + } + Charset charset = null; + try { + charset = Charset.forName(this.getResponseHeader().getCharset()); + } catch (Exception e) { + charset = Charset.forName("utf-8"); + logger.error(e, e); + } + this.setResponseBody(new String(contentBodyAfterDecoded, charset)); + } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/ContentDecoderTest.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/ContentDecoderTest.java new file mode 100644 index 00000000..58c6fcbb --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/ContentDecoderTest.java @@ -0,0 +1,40 @@ +package org.bench4q.recorder; + +import static org.junit.Assert.*; + +import org.bench4q.recorder.httpcapture.generator.ContentDecoder; +import org.bench4q.recorder.httpcapture.generator.GzipDecoder; +import org.junit.Test; + +public class ContentDecoderTest { + + @Test + public void testWithNullEncoding() { + ContentDecoder contentDecoder = ContentDecoder.createDecoder(null); + assertTrue(contentDecoder instanceof ContentDecoder); + } + + @Test + public void testWithLowerCaseEncoding() { + ContentDecoder contentDecoder = ContentDecoder.createDecoder("gzip"); + assertTrue(contentDecoder instanceof GzipDecoder); + } + + @Test + public void testWithUpperCaseEncoding() { + ContentDecoder contentDecoder = ContentDecoder.createDecoder("GZIP"); + assertTrue(contentDecoder instanceof GzipDecoder); + } + + @Test + public void testWithMixCaseEncoding() { + ContentDecoder contentDecoder = ContentDecoder.createDecoder("Gzip"); + assertTrue(contentDecoder instanceof GzipDecoder); + } + + @Test + public void testWithNotSupportedEncoding() { + ContentDecoder contentDecoder = ContentDecoder.createDecoder("deflate"); + assertTrue(contentDecoder instanceof ContentDecoder); + } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestBench4qTestScriptAdapter.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestBench4qTestScriptAdapter.java new file mode 100644 index 00000000..de9fc850 --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestBench4qTestScriptAdapter.java @@ -0,0 +1,45 @@ +package org.bench4q.recorder; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.List; + +import org.bench4q.recorder.httpcapture.Bench4qTestScriptAdapter; +import org.bench4q.share.helper.RunScenarioModelHelper; +import org.bench4q.share.models.agent.ParameterModel; +import org.bench4q.share.models.agent.RunScenarioModel; +import org.junit.Test; + +public class TestBench4qTestScriptAdapter { + private Bench4qTestScriptAdapter bench4qTestScriptAdapter; + + private Bench4qTestScriptAdapter getBench4qTestScriptAdapter() { + return bench4qTestScriptAdapter; + } + + private void setBench4qTestScriptAdapter( + Bench4qTestScriptAdapter bench4qTestScriptAdapter) { + this.bench4qTestScriptAdapter = bench4qTestScriptAdapter; + } + + public TestBench4qTestScriptAdapter() { + this.setBench4qTestScriptAdapter(new Bench4qTestScriptAdapter( + new RunScenarioModel())); + } + + @Test + public void testInsertUserBehaviorsToScenario() { + List params = new ArrayList(); + params.add(RunScenarioModelHelper.createParameterModel("url", + "www.baidu.com")); + this.getBench4qTestScriptAdapter().insertUserBehaviorsToScenario( + RunScenarioModelHelper.createUserBehaviorModel(0, "http", + "get", params)); + assertEquals( + 1, + RunScenarioModelHelper.getBatches( + this.getBench4qTestScriptAdapter() + .getRunScenarioModel()).size()); + } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestDomGenerator.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestDomGenerator.java new file mode 100644 index 00000000..70162690 --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestDomGenerator.java @@ -0,0 +1,68 @@ +package org.bench4q.recorder; + +import static org.junit.Assert.*; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import org.apache.commons.io.FileUtils; +import org.bench4q.recorder.httpcapture.generator.ChildrenUrl; +import org.junit.Test; + +public class TestDomGenerator extends TestRecordBase { + private URL url = this.getClass().getResource("testcase.html"); + + public TestDomGenerator() { + init(); + } + + @Test + public void testDomParser() throws IOException { + this.getCodeGenerator() + .getScriptAdapter() + .insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + this.getCodeGenerator().doParseHtmlContent( + FileUtils.readFileToString(new File(url.getPath())), parentUrl); + assertTrue(this.getCodeGenerator().getScriptAdapter().getChildrenUrls() + .size() == 8); + for (ChildrenUrl childrenUrl : this.getCodeGenerator() + .getScriptAdapter().getChildrenUrls()) { + assertTrue(childrenUrl.getParentBatchId() == 0); + } + } + + @Test + public void testDomParserWithinAdapter() throws IOException { + this.getAdpater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl)); + this.getAdpater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + this.getCodeGenerator().doParseHtmlContent( + FileUtils.readFileToString(new File(this.url.getPath())), + parentUrl); + System.out.println(this.getCodeGenerator().getScriptAdapter() + .getChildrenUrls().size()); + assertTrue(this.getCodeGenerator().getScriptAdapter().getChildrenUrls() + .size() == 8); + + for (ChildrenUrl childrenUrl : this.getAdpater().getChildrenUrls()) { + assertTrue(childrenUrl.getParentBatchId() == 1); + } + } + + @Test + public void testDomParserWithIncorrectParentUrl() throws IOException { + this.getAdpater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + this.getAdpater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl)); + this.getCodeGenerator().doParseHtmlContent( + FileUtils.readFileToString(new File(this.url.getPath())), + parentUrl + "error"); + assertTrue(this.getCodeGenerator().getScriptAdapter().getChildrenUrls() + .size() == 0); + } + +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestHttpRequestHeader.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestHttpRequestHeader.java new file mode 100644 index 00000000..a242a600 --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestHttpRequestHeader.java @@ -0,0 +1,79 @@ +package org.bench4q.recorder; + +import static org.junit.Assert.*; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URL; + +import org.apache.commons.httpclient.HttpException; +import org.bench4q.recorder.httpcapture.HttpRequestHeader; +import org.junit.Test; + +public class TestHttpRequestHeader { + private static final String PATHNAME = Test_Bench4QCodeGenerator.dealWithSerie + + "Request.txt"; + private HttpRequestHeader requestHeader; + + private HttpRequestHeader getRequestHeader() { + return requestHeader; + } + + private void setRequestHeader(HttpRequestHeader requestHeader) { + this.requestHeader = requestHeader; + } + + public TestHttpRequestHeader() throws FileNotFoundException, IOException, + HttpException { + this.setRequestHeader(new HttpRequestHeader(new FileInputStream( + new File(PATHNAME)))); + } + + @Test + public void testHeaders() { + assertEquals("GET", this.getRequestHeader().method.toUpperCase()); + assertEquals("HTTP://WWW.BAIDU.COM/", + this.getRequestHeader().referer.toUpperCase()); + assertEquals( + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + this.getRequestHeader().accept.toLowerCase().trim()); + assertEquals("/phoenix.zhtml?c=188488&p=irol-homeprofile", + this.getRequestHeader().url.toLowerCase().trim()); + assertEquals("HTTP/1.1", this.getRequestHeader().version.toUpperCase() + .trim()); + assertEquals( + "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36", + this.getRequestHeader().userAgent.trim()); + assertEquals("bearer", this.getRequestHeader().authorization.trim()); + assertEquals("multipart", this.getRequestHeader().contentType.trim()); + assertEquals(100, this.getRequestHeader().contentLength); + assertEquals(true, this.getRequestHeader().pragmaNoCache); + assertEquals("zh-CN,zh;q=0.8", this.getRequestHeader().acceptLanguage); + // assertEquals("Mon, 22 Mar 2010 14:14:40 GMT; old-content-length=200", + // this.getRequestHeader().ifModifiedSince.trim()); + + } + + @Test + public void testStripProxyInfoFromRequestHeader() throws Exception { + HttpRequestHeader header = new HttpRequestHeader(new FileInputStream( + new File(PATHNAME))); + String res = ""; + String origUrl = "http://ir.baidu.com/phoenix.zhtml?c=188488&p=irol-homeprofile"; + + URL url = new URL(origUrl); + header.url = url.getFile(); + res = header.toString(); + header.url = origUrl; + System.out.println(res); + } + + // @Test + // public void testToStringWithLib() throws IOException { + // assertEquals(FileUtils.readFileToString(new File(PATHNAME)) + // .toLowerCase(), this.getRequestHeader().toStringWithLib() + // .toLowerCase()); + // } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestParentRequest.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestParentRequest.java new file mode 100644 index 00000000..c5d9fefb --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestParentRequest.java @@ -0,0 +1,199 @@ +package org.bench4q.recorder; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.bench4q.recorder.httpcapture.Bench4qTestScriptAdapter; +import org.bench4q.recorder.httpcapture.IScriptAdapter; +import org.bench4q.recorder.httpcapture.generator.ChildrenUrl; +import org.bench4q.share.helper.RunScenarioModelHelper; +import org.bench4q.share.models.agent.RunScenarioModel; +import org.bench4q.share.models.agent.scriptrecord.BatchModel; +import org.junit.Test; + +public class TestParentRequest extends TestRecordBase { + private IScriptAdapter adapater; + private static String parentUrl = "www.apache.com"; + private static String childUrl = "www.yahoo.com"; + private static String independentUrl = "www.baidu.com"; + private static String independentUrl2 = "www.eclipse.org"; + private static String childUrl2 = "www.tomcat.com"; + + private IScriptAdapter getAdapater() { + return adapater; + } + + private void setAdapater(IScriptAdapter adapater) { + this.adapater = adapater; + } + + public TestParentRequest() { + this.setAdapater(new Bench4qTestScriptAdapter(new RunScenarioModel())); + } + + @Test + public void testAddOneBehaviorWihoutChildrenUrl() { + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + assertNotNull(this.getAdapater().getRunScenarioModel()); + List batches = RunScenarioModelHelper.getBatches(this + .getAdapater().getRunScenarioModel()); + assertNotNull(batches); + assertNotNull(batches.get(0)); + assertTrue(batches.get(0).getId() == 0); + + } + + @Test + public void testAddTwoBehaviorWithOutChildrenUrl() { + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + this.getAdapater().getChildrenUrls() + .add(createChildrenUrl(childUrl, 0)); + + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl2)); + RunScenarioModel runScenarioModel = this.getAdapater() + .getRunScenarioModel(); + assertNotNull(runScenarioModel); + List batches = RunScenarioModelHelper + .getBatches(runScenarioModel); + assertNotNull(batches); + assertTrue(batches.size() == 3); + assertTrue(batches.get(1).getBehaviors().size() == 1); + assertTrue(batches.get(2).getBehaviors().size() == 1); + assertTrue(batches.get(1).getBehaviors().get(0).getParameters().get(0) + .getValue().equals(independentUrl)); + assertTrue(batches.get(2).getBehaviors().get(0).getParameters().get(0) + .getValue().equals(independentUrl2)); + } + + // private UserBehaviorModel createUserBehavior(String url) { + // UserBehaviorModel model = new UserBehaviorModel(); + // model.setId(1); + // model.setName("Get"); + // model.setUse("http"); + // List params = new ArrayList(); + // ParameterModel param = new ParameterModel(); + // param.setKey("url"); + // param.setValue(url); + // params.add(param); + // model.setParameters(params); + // return model; + // } + + @Test + public void testAddBehaviorWithInChildrenUrl() { + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + this.getAdapater().getChildrenUrls() + .add(createChildrenUrl(childUrl, 0)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(childUrl)); + RunScenarioModel runScenarioModel = this.getAdapater() + .getRunScenarioModel(); + assertNotNull(runScenarioModel); + List batches = RunScenarioModelHelper + .getBatches(runScenarioModel); + assertNotNull(batches); + assertNotNull(batches.get(0)); + assertNotNull(batches.get(1)); + assertTrue(batches.get(1).getId() == 1); + assertEquals(batches.get(0).getChildId(), batches.get(1).getId()); + assertEquals(batches.get(1).getParentId(), batches.get(0).getId()); + } + + private ChildrenUrl createChildrenUrl(String url, int parentBatchId) { + ChildrenUrl childrenUrl = new ChildrenUrl(); + childrenUrl.setParentBatchId(parentBatchId); + childrenUrl.setUrl(url); + return childrenUrl; + } + + @Test + public void testAddBehaviorsIncludeInAndOut() { + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + + this.getAdapater().getChildrenUrls() + .add(createChildrenUrl(childUrl, 0)); + + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(childUrl)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl)); + List batches = RunScenarioModelHelper.getBatches(this + .getAdapater().getRunScenarioModel()); + assertTrue(batches.get(1).getBehaviors().size() == 1); + assertTrue(batches.get(2).getBehaviors().size() == 1); + assertTrue(batches.get(1).getBehaviors().get(0).getParameters().get(0) + .getValue().equals(childUrl)); + assertTrue(batches.get(2).getBehaviors().get(0).getParameters().get(0) + .getValue().equals(independentUrl)); + assertEquals(batches.get(0).getChildId(), batches.get(1).getId()); + assertEquals(batches.get(1).getParentId(), batches.get(0).getId()); + } + + @Test + public void addTwoBehaviorsInChildrenUrl() { + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + this.getAdapater().getChildrenUrls() + .add(createChildrenUrl(childUrl, 0)); + this.getAdapater().getChildrenUrls() + .add(createChildrenUrl(childUrl2, 0)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(childUrl)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(childUrl2)); + List batches = RunScenarioModelHelper.getBatches(this + .getAdapater().getRunScenarioModel()); + System.out.println(batches.size()); + assertTrue(batches.size() == 2); + assertTrue(batches.get(0).getBehaviors().get(0).getParameters().get(0) + .getValue().equals(parentUrl)); + assertTrue(batches.get(1).getBehaviors().get(0).getParameters().get(0) + .getValue().equals(childUrl)); + assertTrue(batches.get(1).getBehaviors().get(1).getParameters().get(0) + .getValue().equals(childUrl2)); + } + + @Test + public void addTwoInTwoOut() { + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + this.getAdapater().getChildrenUrls() + .add(createChildrenUrl(childUrl, 0)); + this.getAdapater().getChildrenUrls() + .add(createChildrenUrl(childUrl2, 0)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(childUrl)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(childUrl2)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl2)); + assertTrue(RunScenarioModelHelper.getBatches( + this.getAdapater().getRunScenarioModel()).size() == 4); + } + + @Test + public void testGetParentUrl() { + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(parentUrl)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl)); + this.getAdapater().insertUserBehaviorsToScenario( + createUserBehaviorModel(independentUrl2)); + + assertTrue(this.getAdapater().getParentBatchIdWithParentUrl(parentUrl) == 0); + assertTrue(this.getAdapater().getParentBatchIdWithParentUrl( + independentUrl) == 1); + assertTrue(this.getAdapater().getParentBatchIdWithParentUrl( + independentUrl2) == 2); + } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestRecordBase.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestRecordBase.java new file mode 100644 index 00000000..a9b265b7 --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestRecordBase.java @@ -0,0 +1,49 @@ +package org.bench4q.recorder; + +import java.util.ArrayList; +import java.util.List; + +import org.bench4q.recorder.httpcapture.Bench4qTestScriptAdapter; +import org.bench4q.recorder.httpcapture.IScriptAdapter; +import org.bench4q.recorder.httpcapture.generator.Bench4qCodeGenerator; +import org.bench4q.share.models.agent.ParameterModel; +import org.bench4q.share.models.agent.RunScenarioModel; +import org.bench4q.share.models.agent.scriptrecord.BehaviorModel; + +public abstract class TestRecordBase { + private IScriptAdapter adapter; + private Bench4qCodeGenerator codeGenerator; + protected static String parentUrl = "http://localhost:8080/Bench4QTestCase/testcase.html"; + protected static String independentUrl = "www.baidu.com"; + protected static String childrenUrl1 = "http://localhost:8080/Bench4QTestCase/script/agenttable.js"; + + protected IScriptAdapter getAdpater() { + return adapter; + } + + private void setAdpater(IScriptAdapter adapter) { + this.adapter = adapter; + } + + protected Bench4qCodeGenerator getCodeGenerator() { + return codeGenerator; + } + + private void setCodeGenerator(Bench4qCodeGenerator codeGenerator) { + this.codeGenerator = codeGenerator; + } + + protected void init() { + this.setAdpater(new Bench4qTestScriptAdapter(new RunScenarioModel())); + this.setCodeGenerator(new Bench4qCodeGenerator(this.getAdpater())); + } + + protected BehaviorModel createUserBehaviorModel(String url) { + List params = new ArrayList(); + ParameterModel param = new ParameterModel(); + param.setKey("url"); + param.setValue(url); + params.add(param); + return BehaviorModel.UserBehaviorBuilder(1, "Get", "http", params); + } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestResponseParser.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestResponseParser.java new file mode 100644 index 00000000..a066ba9d --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/TestResponseParser.java @@ -0,0 +1,49 @@ +package org.bench4q.recorder; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import org.apache.commons.io.FileUtils; +import org.bench4q.recorder.httpcapture.generator.ResponseHeader; +import org.bench4q.recorder.httpcapture.generator.ResponseParser; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class TestResponseParser { + private ResponseParser responseParser; + private static String FILE_SEPARATOR = System.getProperty("file.separator"); + + private ResponseParser getResponseParser() { + return responseParser; + } + + private void setResponseParser(ResponseParser responseParser) { + this.responseParser = responseParser; + } + + public TestResponseParser() throws IOException { + byte[] response = FileUtils.readFileToByteArray(new File( + "RecordScriptTestCase" + FILE_SEPARATOR + + "gzipBaiduResponse.txt")); + this.setResponseParser(new ResponseParser(response)); + } + + @Test + public void testParseResponseHeader() throws Exception { + ResponseHeader parseResponseHeader = this.getResponseParser() + .getResponseHeader(); + assertEquals(parseResponseHeader.getContentLength(), 12852); + assertEquals(parseResponseHeader.getCharset(), "utf-8"); + assertEquals(parseResponseHeader.getContentEncoding(), "gzip"); + assertEquals(parseResponseHeader.getContentType(), "text/html"); + assertEquals(parseResponseHeader.getRespCode(), "200"); + } + + @Test + public void testParseResponseBody() throws UnsupportedEncodingException { + String responseBody = this.getResponseParser().getResponseBody(); + assertTrue(responseBody.indexOf("我的") > -1); + } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/Test_Bench4QCodeGenerator.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/Test_Bench4QCodeGenerator.java new file mode 100644 index 00000000..bc408e35 --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/Test_Bench4QCodeGenerator.java @@ -0,0 +1,195 @@ +package org.bench4q.recorder; + +import static org.junit.Assert.*; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.zip.GZIPInputStream; + +import org.apache.commons.io.FileUtils; +import org.bench4q.recorder.httpcapture.Bench4qTestScriptAdapter; +import org.bench4q.recorder.httpcapture.HeaderValue; +import org.bench4q.recorder.httpcapture.HttpRequestHeader; +import org.bench4q.recorder.httpcapture.Param; +import org.bench4q.recorder.httpcapture.Utils.UserException; +import org.bench4q.recorder.httpcapture.generator.Bench4qCodeGenerator; +import org.bench4q.recorder.httpcapture.generator.ContentDecoder; +import org.bench4q.recorder.httpcapture.generator.IScriptGenerator; +import org.bench4q.recorder.httpcapture.generator.ResponseParser; +import org.bench4q.share.models.agent.RunScenarioModel; +import org.bench4q.share.models.agent.scriptrecord.BehaviorModel; +import org.junit.Test; + +public class Test_Bench4QCodeGenerator extends TestRecordBase { + private Bench4qTestScriptAdapter scriptAdapter = new Bench4qTestScriptAdapter( + new RunScenarioModel()); + private Bench4qCodeGenerator codeGenerator = new Bench4qCodeGenerator( + this.scriptAdapter); + public static String dealWithSerie = "RecordScriptTestCase/gzip/gzipBaiduIR"; + + @Test + public void testProcessResponseWithHtmlContentTypeWithNullResponseBody() + throws FileNotFoundException, IOException, Exception { + IScriptGenerator scriptGenerator = this.codeGenerator; + scriptGenerator.processResponse( + makeAHeader("www.makeup.com"), + new byte[0], + FileUtils.readFileToByteArray(new File(dealWithSerie + + "NullResponseBody.html"))); + assertEquals(0, this.scriptAdapter.getChildrenUrls().size()); + } + + @Test + public void testProcessResponseOnceWithHtmlResponseButHaveNoBody() + throws Exception, IOException, FileNotFoundException { + IScriptGenerator scriptGenerator = this.codeGenerator; + scriptGenerator.processResponse( + makeAHeader("www.makeup.com"), + new byte[0], + FileUtils.readFileToByteArray(new File(dealWithSerie + + "BlankBody.html"))); + assertEquals(0, this.scriptAdapter.getChildrenUrls().size()); + } + + @Test + public void testProcessResponseWithOneHtmlResponseHaveBody() + throws Exception { + HttpRequestHeader header = makeAHeader("ir.baidu.com"); + IScriptGenerator scriptGenerator = this.codeGenerator; + scriptGenerator.processResponse( + header, + new byte[0], + FileUtils.readFileToByteArray(new File(dealWithSerie + + "Response.txt"))); + assertEquals(11, this.scriptAdapter.getChildrenUrls().size()); + } + + private HttpRequestHeader makeAHeader(String url) throws IOException, + FileNotFoundException { + HttpRequestHeader header = new HttpRequestHeader(new FileInputStream( + new File(dealWithSerie + "Request.txt"))); + header.url = url; + return header; + } + + @Test + public void testProcessResponseTwiceWithTwoHtmlResponseButTheSecondHaveNoBody() + throws Exception { + testProcessResponseWithOneHtmlResponseHaveBody(); + testProcessResponseOnceWithHtmlResponseButHaveNoBody(); + assertEquals(0, this.scriptAdapter.getChildrenUrls().size()); + } + + @Test + public void testProcessResponseTwiceWithTwoHtmlResponseOneHtmlSecondNot() + throws Exception { + testProcessResponseWithOneHtmlResponseHaveBody(); + testProcessResponseWithNotHtmlResponse(); + assertEquals(11, this.scriptAdapter.getChildrenUrls().size()); + } + + @Test + public void testProcessResponseWithTwoHtmlResponseFirstNoBodySecondHave() + throws FileNotFoundException, IOException, Exception { + testProcessResponseOnceWithHtmlResponseButHaveNoBody(); + testProcessResponseWithOneHtmlResponseHaveBody(); + } + + private void testProcessResponseWithNotHtmlResponse() throws Exception, + IOException, FileNotFoundException { + IScriptGenerator scriptGenerator = this.codeGenerator; + scriptGenerator.processResponse( + makeAHeader("www.makeup2.com"), + new byte[0], + FileUtils.readFileToByteArray(new File(dealWithSerie + + "NotHtmlResponse.html"))); + } + + @Test + public void testParseContentLength() throws IOException { + int contentLength = new ResponseParser( + FileUtils.readFileToByteArray(new File(dealWithSerie + + "Response.txt"))).getResponseHeader() + .getContentLength(); + assertTrue(contentLength == 5023); + } + + @Test + public void testGetContentBody() throws IOException { + String contentFromFile = FileUtils.readFileToString(new File( + dealWithSerie + "ResponseBody.txt"), "ISO-8859-1"); + byte[] contentBody1 = contentFromFile.getBytes("ISO-8859-1"); + String responseString = new String(contentBody1, + Charset.forName("ISO-8859-1")); + System.out.println("testGetContentBody total length:" + + responseString.getBytes("ISO-8859-1").length); + System.out.println("testGetContentBody :" + contentBody1.length); + GZIPInputStream inputStream = new GZIPInputStream( + new ByteArrayInputStream(contentBody1)); + assertEquals(responseString.getBytes("ISO-8859-1").length, + contentBody1.length); + assertTrue(inputStream != null); + } + + @Test + public void testUncompressGzipContent() throws IOException { + ContentDecoder contentDecoder = ContentDecoder.createDecoder("gzip"); + FileInputStream inputStream = new FileInputStream(new File( + dealWithSerie + "ResponseBody.txt")); + String contentString = new String( + contentDecoder.decodeContent(inputStream), + Charset.forName("utf-8")); + System.out.println(contentString); + assertTrue(contentString.indexOf(" -1); + } + + @Test + public void testFileInputStreamAndFileUtils() throws IOException { + byte[] responseBodyBytes = FileUtils.readFileToString( + new File(dealWithSerie + "ResponseBody.txt"), "UTF-8") + .getBytes("UTF-8"); + int length1 = responseBodyBytes.length; + String responseBodyString = new String(responseBodyBytes, "UTF-8"); + int length2 = responseBodyString.getBytes("UTF-8").length; + assertEquals(length1, length2); + System.out.println(length1); + } + + @Test + public void testCreateGetBehavior() throws UserException { + this.codeGenerator.doQueryStringParameterList(new Param[] { Param + .createParam("a", "b") }); + this.codeGenerator.doHeaders(new HeaderValue[] { new HeaderValue( + "token", "Bearer") }); + this.codeGenerator.doBodyParameterList(new Param[] { Param.createParam( + "a", "b") }); + BehaviorModel behaviorModel = this.codeGenerator.createHttpBehavior(1, + "http://www.baidu.com", "Get"); + assertEquals("a=b", behaviorModel.getParameters().get(1).getValue()); + assertEquals("header=token|value=Bearer|;", behaviorModel + .getParameters().get(2).getValue()); + assertEquals(3, behaviorModel.getParameters().size()); + } + + public void testCreatePostBehavior() throws UserException { + this.codeGenerator.doQueryStringParameterList(new Param[] { Param + .createParam("a", "b") }); + this.codeGenerator.doHeaders(new HeaderValue[] { new HeaderValue( + "token", "Bearer") }); + this.codeGenerator.doBodyParameterList(new Param[] { Param.createParam( + "a", "b") }); + this.codeGenerator.doSetData("ava"); + BehaviorModel behaviorModel = this.codeGenerator.createHttpBehavior(1, + "http://www.baidu.com", "Post"); + assertEquals("a=b", behaviorModel.getParameters().get(1).getValue()); + assertEquals("header=token|value=Bearer|;", behaviorModel + .getParameters().get(2).getValue()); + assertEquals(5, behaviorModel.getParameters().size()); + assertEquals("ava", behaviorModel.getParameters().get(3).getValue()); + assertEquals("a=b", behaviorModel.getParameters().get(4).getValue()); + } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/Test_ParamParser.java b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/Test_ParamParser.java new file mode 100644 index 00000000..9e0d1621 --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/Test_ParamParser.java @@ -0,0 +1,58 @@ +package org.bench4q.recorder; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.List; + +import org.bench4q.recorder.httpcapture.Param; +import org.junit.Test; + +public class Test_ParamParser { + private String testcase = " _nacc=yeah ;_nvid=525d29a534e918cbf04ea7159706a93d;_nvtm=0;_nvsf=0;_nvfi=1;_nlag=zh-cn;_nlmf=1389570024;_nres=1440x900;_nscd=32-bit;_nstm=0;"; + + private List expectedNFField = new ArrayList() { + private static final long serialVersionUID = 1L; + { + add("_nacc=yeah"); + add("_nvid=525d29a534e918cbf04ea7159706a93d"); + add("_nvtm=0"); + add("_nvsf=0"); + add("_nvfi=1"); + add("_nlag=zh-cn"); + add("_nlmf=1389570024"); + add("_nres=1440x900"); + add("_nscd=32-bit"); + add("_nstm=0"); + } + }; + + private List expectedParams = new ArrayList() { + private static final long serialVersionUID = 1L; + { + add(Param.createParam("_nacc", "yeah")); + add(Param.createParam("_nvid", "525d29a534e918cbf04ea7159706a93d")); + add(Param.createParam("_nvtm", "0")); + } + }; + + @Test + public void testParseParam() { + List result = Param.ParamParser.getNVField(testcase); + assertEquals(10, result.size()); + for (int i = 0; i < result.size(); i++) { + assertEquals(result.get(i), expectedNFField.get(i)); + System.out.println(result.get(i)); + } + } + + @Test + public void testParse() { + List result = Param.ParamParser.parse(testcase); + assertEquals(10, result.size()); + for (int i = 0; i < 3; i++) { + assertEquals(result.get(i).name, expectedParams.get(i).name); + assertEquals(result.get(i).value, expectedParams.get(i).value); + } + } +} diff --git a/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/testcase.html b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/testcase.html new file mode 100644 index 00000000..62334744 --- /dev/null +++ b/Bench4Q-Recorder/src/test/java/org/bench4q/recorder/testcase.html @@ -0,0 +1,17 @@ + + + Bench4Q Test Case + + + + + + No this one + No this one + No this one + + + + + +