From 41c17713f230f0c43aa28f820b681d60529d7eb3 Mon Sep 17 00:00:00 2001 From: Babak Farrokhi Date: Sat, 6 Aug 2016 17:57:29 +0430 Subject: [PATCH] Create gh-pages branch via GitHub --- images/arrow-down.png | Bin 0 -> 216 bytes images/octocat-small.png | Bin 0 -> 357 bytes index.html | 203 +++++++++++++++++ javascripts/scale.fix.js | 20 ++ params.json | 6 + stylesheets/github-light.css | 124 ++++++++++ stylesheets/styles.css | 423 +++++++++++++++++++++++++++++++++++ 7 files changed, 776 insertions(+) create mode 100644 images/arrow-down.png create mode 100644 images/octocat-small.png create mode 100644 index.html create mode 100644 javascripts/scale.fix.js create mode 100644 params.json create mode 100644 stylesheets/github-light.css create mode 100644 stylesheets/styles.css diff --git a/images/arrow-down.png b/images/arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5c55c6a8c9edfaa47379862d770304c36c3ac7ff GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eW!3HFke0{SLNX_?jaSYLzn4I9i%II*Xp^aIh zpz+6!8``B?P5)0c^x#?E7OdXC_y6D5zw1+Ygru)Ji1RWzykR(WyifLD&pJjGw#n?P zLqkH=Y}vm3H~*pZ^K<_6Lqu1mGH{74&_2}6eISp?=$Y`s3cD`%ef7U|_uU`DGt*!YlC@Am|DD>an&JK*_ z<>mi__UCKux;y>4Pqor7j|)IU*M9Gw z-IGbu2m_ZdUGO1GBT$h55cdP|c_4ld#Or}LA6*>)0_L))J+G2e00000NkvXXu0mjf DP-vTT literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..1631f84 --- /dev/null +++ b/index.html @@ -0,0 +1,203 @@ + + + + + + Dnsdiag by farrokhi + + + + + + + + +
+
+

Dnsdiag

+

DNS Diagnostics and Performance Measurement Tools

+ + + +

This project is maintained by farrokhi

+ + +
+
+

Build Status PyPI PyPI PyPI GitHub stars

+ +

+DNS Diagnostics and Performance Measurement Tools

+ +

Ever been wondering if your ISP is hijacking your DNS traffic? Ever observed any +misbehavior with your DNS responses? Ever been redirected to wrong address and +suspected something is wrong with your DNS? Here we have a set of tools to +perform basic audits on your DNS requests and responses to make sure your DNS is +working as you expect.

+ +

You can measure the response time of any given DNS server for arbitrary requests +using dnsping. Just like traditional ping utility, it gives you similar +functionality for DNS requests.

+ +

You can also trace the path your DNS request takes to destination to make sure +it is not being redirected or hijacked. This can be done by comparing different +DNS queries being sent to the same DNS server using dnstraceroute and observe +if there is any difference between the path.

+ +

dnseval evaluates multiple DNS resolvers and helps you choose the best DNS +server for your network. While it is highly recommended to use your own DNS +resolver and never trust any third-party DNS server, but in case you need to +choose the best DNS forwarder for your network, dnseval lets you compare +different DNS servers from performance (latency) and reliability (loss) point +of view.

+ +

+prerequisites

+ +

This script requires python3 as well as latest +dnspython and +cymruwhois. Please note that +"dnstraceroute" requires a modified version of dnspython module. All required +third-party modules are included as GIT submodules. You just need to run git +submodule update --init and project directory to pull the required code.

+ +

+installation

+ +

There are several ways that you can use this toolset. However using the sourcecode is always recommended.

+ +

+From Source Code

+ +
    +
  1. You can checkout this git repo and its submodules
  2. +
+ +
git clone https://github.com/farrokhi/dnsdiag.git
+cd dnsdiag
+git submodule update --init
+
+ +
    +
  1. You can alternatively install the package using pip:
  2. +
+ +
pip3 install --process-dependency-links dnsdiag
+
+ +

+From Binary

+ +

From time to time, binary version will be released for Windows, Mac OS X and Linux platforms. You can grab the latest release from releases page.

+ +

+dnsping

+ +

dnsping pings a DNS resolver by sending an arbitrary DNS query for given number +of times:

+ +
% ./dnsping.py -c 3 -t AAAA -s 8.8.8.8 dnsdiag.org
+dnsping.py DNS: 8.8.8.8:53, hostname: dnsdiag.org, rdatatype: AAAA
+4 bytes from 8.8.8.8: seq=0   time=123.509 ms
+4 bytes from 8.8.8.8: seq=1   time=115.726 ms
+4 bytes from 8.8.8.8: seq=2   time=117.351 ms
+
+--- 8.8.8.8 dnsping statistics ---
+3 requests transmitted, 3 responses received,   0% lost
+min=115.726 ms, avg=118.862 ms, max=123.509 ms, stddev=4.105 ms
+
+ +

This script calculates minimum, maximum and average response time as well as +jitter (stddev)

+ +

+dnstraceroute

+ +

dnstraceroute is a traceroute utility to figure out the path that your DNS +request is passing through to get to its destination. You may want to compare +it to your actual network traceroute and make sure your DNS traffic is not +routed to any unwanted path.

+ +
% ./dnstraceroute.py --expert -C -t A -s 8.8.4.4 facebook.com
+dnstraceroute.py DNS: 8.8.4.4:53, hostname: facebook.com, rdatatype: A
+1   192.168.0.1 (192.168.0.1) 1 ms
+2   192.168.28.177 (192.168.28.177) 4 ms
+3   192.168.0.1 (192.168.0.1) 693 ms
+4   172.19.4.17 (172.19.4.17) 3 ms
+5   google-public-dns-b.google.com (8.8.4.4) 8 ms
+
+=== Expert Hints ===
+ [*] public DNS server is next to a private IP address (possible hijacking)
+
+ +

Using --expert will instruct dnstraceroute to print expert hints (such as warnings of possible DNS traffic hijacking).

+ +

+dnseval

+ +

dnseval is a bulk ping utility that sends an arbitrary DNS query to a give list +of DNS servers. This script is meant for comparing response time of multiple +DNS servers at once:

+ +
% ./dnseval.py -t AAAA -f public-v4.txt -c10 fg.weberdns.de
+server           avg(ms)     min(ms)     max(ms)     stddev(ms)  lost(%)    flags
+------------------------------------------------------------------------------------------------
+8.8.8.8          94.556      90.488      112.209     6.322       %0         QR -- -- RD RA AD --
+8.8.4.4          92.599      90.265      94.338      1.086       %0         QR -- -- RD RA AD --
+ns.ripe.net      92.754      91.632      93.980      0.900       %0         QR -- -- RD RA AD --
+4.2.2.1          92.703      91.869      93.298      0.482       %0         QR -- -- RD RA AD --
+4.2.2.2          93.195      91.667      94.919      1.065       %0         QR -- -- RD RA AD --
+4.2.2.3          93.118      92.076      94.835      0.835       %0         QR -- -- RD RA AD --
+4.2.2.4          94.308      92.175      103.318     3.261       %0         QR -- -- RD RA AD --
+4.2.2.5          92.650      91.643      94.460      1.002       %0         QR -- -- RD RA AD --
+209.244.0.3      92.810      89.961      94.807      1.266       %0         QR -- -- RD RA AD --
+209.244.0.4      93.127      91.962      95.970      1.227       %0         QR -- -- RD RA AD --
+195.46.39.39     92.770      90.777      93.656      0.914       %0         QR -- -- RD RA AD --
+195.46.39.40     92.903      91.280      94.914      1.147       %0         QR -- -- RD RA AD --
+
+ +

+Author

+ +

Babak Farrokhi

+ + + +

+License

+ +

dnsdiag is released under a 2 clause BSD license.

+ +

+Credits

+ + +
+ +
+ + + + diff --git a/javascripts/scale.fix.js b/javascripts/scale.fix.js new file mode 100644 index 0000000..08716c0 --- /dev/null +++ b/javascripts/scale.fix.js @@ -0,0 +1,20 @@ +fixScale = function(doc) { + + var addEvent = 'addEventListener', + type = 'gesturestart', + qsa = 'querySelectorAll', + scales = [1, 1], + meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : []; + + function fix() { + meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1]; + doc.removeEventListener(type, fix, true); + } + + if ((meta = meta[meta.length - 1]) && addEvent in doc) { + fix(); + scales = [.25, 1.6]; + doc[addEvent](type, fix, true); + } + +}; \ No newline at end of file diff --git a/params.json b/params.json new file mode 100644 index 0000000..731aa4c --- /dev/null +++ b/params.json @@ -0,0 +1,6 @@ +{ + "name": "Dnsdiag", + "tagline": "DNS Diagnostics and Performance Measurement Tools", + "body": "[![Build Status](https://travis-ci.org/farrokhi/dnsdiag.svg)](https://travis-ci.org/farrokhi/dnsdiag) [![PyPI](https://img.shields.io/pypi/v/dnsdiag.svg?maxAge=8600)](https://pypi.python.org/pypi/dnsdiag/) [![PyPI](https://img.shields.io/pypi/l/dnsdiag.svg?maxAge=8600)]() [![PyPI](https://img.shields.io/pypi/pyversions/dnsdiag.svg?maxAge=8600)]() [![GitHub stars](https://img.shields.io/github/stars/farrokhi/dnsdiag.svg?style=social&label=Star&maxAge=8600)](https://github.com/farrokhi/dnsdiag/stargazers)\r\n\r\nDNS Diagnostics and Performance Measurement Tools\r\n==================================================\r\n\r\nEver been wondering if your ISP is [hijacking your DNS traffic](https://decentralize.today/is-your-isp-hijacking-your-dns-traffic-f3eb7ccb0ee7#.fevks5wyc)? Ever observed any\r\nmisbehavior with your DNS responses? Ever been redirected to wrong address and\r\nsuspected something is wrong with your DNS? Here we have a [set of tools](http://github.com/farrokhi/dnsdiag) to\r\nperform basic audits on your DNS requests and responses to make sure your DNS is\r\nworking as you expect.\r\n\r\nYou can measure the response time of any given DNS server for arbitrary requests\r\nusing `dnsping`. Just like traditional ping utility, it gives you similar\r\nfunctionality for DNS requests.\r\n\r\nYou can also trace the path your DNS request takes to destination to make sure\r\nit is not being redirected or hijacked. This can be done by comparing different\r\nDNS queries being sent to the same DNS server using `dnstraceroute` and observe\r\nif there is any difference between the path.\r\n\r\n`dnseval` evaluates multiple DNS resolvers and helps you choose the best DNS\r\nserver for your network. While it is highly recommended to use your own DNS\r\nresolver and never trust any third-party DNS server, but in case you need to\r\nchoose the best DNS forwarder for your network, `dnseval` lets you compare\r\ndifferent DNS servers from performance (latency) and reliability (loss) point\r\nof view.\r\n\r\n# prerequisites\r\nThis script requires python3 as well as latest\r\n[dnspython](http://www.dnspython.org/) and\r\n[cymruwhois](https://pythonhosted.org/cymruwhois/). Please note that\r\n\"dnstraceroute\" requires a modified version of dnspython module. All required\r\nthird-party modules are included as GIT submodules. You just need to run `git\r\nsubmodule update --init` and project directory to pull the required code.\r\n\r\n# installation\r\n\r\nThere are several ways that you can use this toolset. However using the sourcecode is always recommended.\r\n\r\n## From Source Code\r\n\r\n1. You can checkout this git repo and its submodules\r\n\r\n```\r\ngit clone https://github.com/farrokhi/dnsdiag.git\r\ncd dnsdiag\r\ngit submodule update --init\r\n```\r\n\r\n2. You can alternatively install the package using pip:\r\n\r\n```\r\npip3 install --process-dependency-links dnsdiag\r\n```\r\n\r\n## From Binary\r\n\r\nFrom time to time, binary version will be released for Windows, Mac OS X and Linux platforms. You can grab the latest release from [releases page](https://github.com/farrokhi/dnsdiag/releases).\r\n\r\n# dnsping\r\ndnsping pings a DNS resolver by sending an arbitrary DNS query for given number\r\nof times:\r\n```\r\n% ./dnsping.py -c 3 -t AAAA -s 8.8.8.8 dnsdiag.org\r\ndnsping.py DNS: 8.8.8.8:53, hostname: dnsdiag.org, rdatatype: AAAA\r\n4 bytes from 8.8.8.8: seq=0 time=123.509 ms\r\n4 bytes from 8.8.8.8: seq=1 time=115.726 ms\r\n4 bytes from 8.8.8.8: seq=2 time=117.351 ms\r\n\r\n--- 8.8.8.8 dnsping statistics ---\r\n3 requests transmitted, 3 responses received, 0% lost\r\nmin=115.726 ms, avg=118.862 ms, max=123.509 ms, stddev=4.105 ms\r\n```\r\nThis script calculates minimum, maximum and average response time as well as\r\njitter (stddev)\r\n\r\n# dnstraceroute\r\ndnstraceroute is a traceroute utility to figure out the path that your DNS\r\nrequest is passing through to get to its destination. You may want to compare\r\nit to your actual network traceroute and make sure your DNS traffic is not\r\nrouted to any unwanted path.\r\n\r\n```\r\n% ./dnstraceroute.py --expert -C -t A -s 8.8.4.4 facebook.com\r\ndnstraceroute.py DNS: 8.8.4.4:53, hostname: facebook.com, rdatatype: A\r\n1\t192.168.0.1 (192.168.0.1) 1 ms\r\n2\t192.168.28.177 (192.168.28.177) 4 ms\r\n3\t192.168.0.1 (192.168.0.1) 693 ms\r\n4\t172.19.4.17 (172.19.4.17) 3 ms\r\n5\tgoogle-public-dns-b.google.com (8.8.4.4) 8 ms\r\n\r\n=== Expert Hints ===\r\n [*] public DNS server is next to a private IP address (possible hijacking)\r\n```\r\n\r\nUsing `--expert` will instruct dnstraceroute to print expert hints (such as warnings of possible DNS traffic hijacking).\r\n\r\n# dnseval\r\ndnseval is a bulk ping utility that sends an arbitrary DNS query to a give list\r\nof DNS servers. This script is meant for comparing response time of multiple\r\nDNS servers at once:\r\n```\r\n% ./dnseval.py -t AAAA -f public-v4.txt -c10 fg.weberdns.de\r\nserver avg(ms) min(ms) max(ms) stddev(ms) lost(%) flags\r\n------------------------------------------------------------------------------------------------\r\n8.8.8.8 94.556 90.488 112.209 6.322 %0 QR -- -- RD RA AD --\r\n8.8.4.4 92.599 90.265 94.338 1.086 %0 QR -- -- RD RA AD --\r\nns.ripe.net 92.754 91.632 93.980 0.900 %0 QR -- -- RD RA AD --\r\n4.2.2.1 92.703 91.869 93.298 0.482 %0 QR -- -- RD RA AD --\r\n4.2.2.2 93.195 91.667 94.919 1.065 %0 QR -- -- RD RA AD --\r\n4.2.2.3 93.118 92.076 94.835 0.835 %0 QR -- -- RD RA AD --\r\n4.2.2.4 94.308 92.175 103.318 3.261 %0 QR -- -- RD RA AD --\r\n4.2.2.5 92.650 91.643 94.460 1.002 %0 QR -- -- RD RA AD --\r\n209.244.0.3 92.810 89.961 94.807 1.266 %0 QR -- -- RD RA AD --\r\n209.244.0.4 93.127 91.962 95.970 1.227 %0 QR -- -- RD RA AD --\r\n195.46.39.39 92.770 90.777 93.656 0.914 %0 QR -- -- RD RA AD --\r\n195.46.39.40 92.903 91.280 94.914 1.147 %0 QR -- -- RD RA AD --\r\n```\r\n\r\n### Author\r\n\r\nBabak Farrokhi \r\n\r\n- twitter: [@farrokhi](https://twitter.com/farrokhi)\r\n- github: [/farrokhi](https://github.com/farrokhi/)\r\n- website: [farrokhi.net](https://farrokhi.net/)\r\n\r\n\r\n### License\r\n\r\ndnsdiag is released under a 2 clause BSD license.\r\n\r\n### Credits\r\n\r\n- [@rthalley](https://github.com/rthalley) for invaluable [dnspython](https://github.com/rthalley/dnspython) library\r\n- [@JustinAzoff](https://github.com/JustinAzoff) for [python-cymruwhois](https://github.com/JustinAzoff/python-cymruwhois) library\r\n- [@bortzmeyer](https://github.com/bortzmeyer) for his feedback and patches\r\n", + "note": "Don't delete this file! It's used internally to help with page regeneration." +} \ No newline at end of file diff --git a/stylesheets/github-light.css b/stylesheets/github-light.css new file mode 100644 index 0000000..0c6b24d --- /dev/null +++ b/stylesheets/github-light.css @@ -0,0 +1,124 @@ +/* +The MIT License (MIT) + +Copyright (c) 2016 GitHub, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +.pl-c /* comment */ { + color: #969896; +} + +.pl-c1 /* constant, variable.other.constant, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header */, +.pl-s .pl-v /* string variable */ { + color: #0086b3; +} + +.pl-e /* entity */, +.pl-en /* entity.name */ { + color: #795da3; +} + +.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */, +.pl-s .pl-s1 /* string source */ { + color: #333; +} + +.pl-ent /* entity.name.tag */ { + color: #63a35c; +} + +.pl-k /* keyword, storage, storage.type */ { + color: #a71d5d; +} + +.pl-s /* string */, +.pl-pds /* punctuation.definition.string, string.regexp.character-class */, +.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */, +.pl-sr /* string.regexp */, +.pl-sr .pl-cce /* string.regexp constant.character.escape */, +.pl-sr .pl-sre /* string.regexp source.ruby.embedded */, +.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ { + color: #183691; +} + +.pl-v /* variable */ { + color: #ed6a43; +} + +.pl-id /* invalid.deprecated */ { + color: #b52a1d; +} + +.pl-ii /* invalid.illegal */ { + color: #f8f8f8; + background-color: #b52a1d; +} + +.pl-sr .pl-cce /* string.regexp constant.character.escape */ { + font-weight: bold; + color: #63a35c; +} + +.pl-ml /* markup.list */ { + color: #693a17; +} + +.pl-mh /* markup.heading */, +.pl-mh .pl-en /* markup.heading entity.name */, +.pl-ms /* meta.separator */ { + font-weight: bold; + color: #1d3e81; +} + +.pl-mq /* markup.quote */ { + color: #008080; +} + +.pl-mi /* markup.italic */ { + font-style: italic; + color: #333; +} + +.pl-mb /* markup.bold */ { + font-weight: bold; + color: #333; +} + +.pl-md /* markup.deleted, meta.diff.header.from-file */ { + color: #bd2c00; + background-color: #ffecec; +} + +.pl-mi1 /* markup.inserted, meta.diff.header.to-file */ { + color: #55a532; + background-color: #eaffea; +} + +.pl-mdr /* meta.diff.range */ { + font-weight: bold; + color: #795da3; +} + +.pl-mo /* meta.output */ { + color: #1d3e81; +} + diff --git a/stylesheets/styles.css b/stylesheets/styles.css new file mode 100644 index 0000000..647f08d --- /dev/null +++ b/stylesheets/styles.css @@ -0,0 +1,423 @@ +@import url(https://fonts.googleapis.com/css?family=Arvo:400,700,400italic); + +/* MeyerWeb Reset */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + + +/* Base text styles */ + +body { + padding:10px 50px 0 0; + font-family:"Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + color: #232323; + background-color: #FBFAF7; + margin: 0; + line-height: 1.8em; + -webkit-font-smoothing: antialiased; + +} + +h1, h2, h3, h4, h5, h6 { + color:#232323; + margin:36px 0 10px; +} + +p, ul, ol, table, dl { + margin:0 0 22px; +} + +h1, h2, h3 { + font-family: Arvo, Monaco, serif; + line-height:1.3; + font-weight: normal; +} + +h1,h2, h3 { + display: block; + border-bottom: 1px solid #ccc; + padding-bottom: 5px; +} + +h1 { + font-size: 30px; +} + +h2 { + font-size: 24px; +} + +h3 { + font-size: 18px; +} + +h4, h5, h6 { + font-family: Arvo, Monaco, serif; + font-weight: 700; +} + +a { + color:#C30000; + font-weight:200; + text-decoration:none; +} + +a:hover { + text-decoration: underline; +} + +a small { + font-size: 12px; +} + +em { + font-style: italic; +} + +strong { + font-weight:700; +} + +ul { + list-style-position: inside; + list-style: disc; + padding-left: 25px; +} + +ol { + list-style-position: inside; + list-style: decimal; + padding-left: 25px; +} + +blockquote { + margin: 0; + padding: 0 0 0 20px; + font-style: italic; +} + +dl, dt, dd, dl p { + font-color: #444; +} + +dl dt { + font-weight: bold; +} + +dl dd { + padding-left: 20px; + font-style: italic; +} + +dl p { + padding-left: 20px; + font-style: italic; +} + +hr { + border:0; + background:#ccc; + height:1px; + margin:0 0 24px; +} + +/* Images */ + +img { + position: relative; + margin: 0 auto; + max-width: 650px; + padding: 5px; + margin: 10px 0 32px 0; + border: 1px solid #ccc; +} + +p img { + display: inline; + margin: 0; + padding: 0; + vertical-align: middle; + text-align: center; + border: none; +} + +/* Code blocks */ + +code, pre { + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + color:#000; + font-size:14px; +} + +pre { + padding: 4px 12px; + background: #FDFEFB; + border-radius:4px; + border:1px solid #D7D8C8; + overflow: auto; + overflow-y: hidden; + margin-bottom: 32px; +} + + +/* Tables */ + +table { + width:100%; +} + +table { + border: 1px solid #ccc; + margin-bottom: 32px; + text-align: left; + } + +th { + font-family: 'Arvo', Helvetica, Arial, sans-serif; + font-size: 18px; + font-weight: normal; + padding: 10px; + background: #232323; + color: #FDFEFB; + } + +td { + padding: 10px; + background: #ccc; + } + + +/* Wrapper */ +.wrapper { + width:960px; +} + + +/* Header */ + +header { + background-color: #171717; + color: #FDFDFB; + width:170px; + float:left; + position:fixed; + border: 1px solid #000; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + padding: 34px 25px 22px 50px; + margin: 30px 25px 0 0; + -webkit-font-smoothing: antialiased; +} + +p.header { + font-size: 16px; +} + +h1.header { + font-family: Arvo, sans-serif; + font-size: 30px; + font-weight: 300; + line-height: 1.3em; + border-bottom: none; + margin-top: 0; +} + + +h1.header, a.header, a.name, header a{ + color: #fff; +} + +a.header { + text-decoration: underline; +} + +a.name { + white-space: nowrap; +} + +header ul { + list-style:none; + padding:0; +} + +header li { + list-style-type: none; + width:132px; + height:15px; + margin-bottom: 12px; + line-height: 1em; + padding: 6px 6px 6px 7px; + + background: #AF0011; + background: -moz-linear-gradient(top, #AF0011 0%, #820011 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #AF0011 0%,#820011 100%); + background: -o-linear-gradient(top, #AF0011 0%,#820011 100%); + background: -ms-linear-gradient(top, #AF0011 0%,#820011 100%); + background: linear-gradient(top, #AF0011 0%,#820011 100%); + + border-radius:4px; + border:1px solid #0D0D0D; + + -webkit-box-shadow: inset 0px 1px 1px 0 rgba(233,2,38, 1); + box-shadow: inset 0px 1px 1px 0 rgba(233,2,38, 1); + +} + +header li:hover { + background: #C3001D; + background: -moz-linear-gradient(top, #C3001D 0%, #950119 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd)); + background: -webkit-linear-gradient(top, #C3001D 0%,#950119 100%); + background: -o-linear-gradient(top, #C3001D 0%,#950119 100%); + background: -ms-linear-gradient(top, #C3001D 0%,#950119 100%); + background: linear-gradient(top, #C3001D 0%,#950119 100%); +} + +a.buttons { + -webkit-font-smoothing: antialiased; + background: url(../images/arrow-down.png) no-repeat; + font-weight: normal; + text-shadow: rgba(0, 0, 0, 0.4) 0 -1px 0; + padding: 2px 2px 2px 22px; + height: 30px; +} + +a.github { + background: url(../images/octocat-small.png) no-repeat 1px; +} + +a.buttons:hover { + color: #fff; + text-decoration: none; +} + + +/* Section - for main page content */ + +section { + width:650px; + float:right; + padding-bottom:50px; +} + + +/* Footer */ + +footer { + width:170px; + float:left; + position:fixed; + bottom:10px; + padding-left: 50px; +} + +@media print, screen and (max-width: 960px) { + + div.wrapper { + width:auto; + margin:0; + } + + header, section, footer { + float:none; + position:static; + width:auto; + } + + footer { + border-top: 1px solid #ccc; + margin:0 84px 0 50px; + padding:0; + } + + header { + padding-right:320px; + } + + section { + padding:20px 84px 20px 50px; + margin:0 0 20px; + } + + header a small { + display:inline; + } + + header ul { + position:absolute; + right:130px; + top:84px; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap:break-word; + } + + header { + padding:10px 20px 0; + margin-right: 0; + } + + section { + padding:10px 0 10px 20px; + margin:0 0 30px; + } + + footer { + margin: 0 0 0 30px; + } + + header ul, header p.view { + position:static; + } +} + +@media print, screen and (max-width: 480px) { + + header ul li.download { + display:none; + } + + footer { + margin: 0 0 0 20px; + } + + footer a{ + display:block; + } + +} + +@media print { + body { + padding:0.4in; + font-size:12pt; + color:#444; + } +} \ No newline at end of file