[Qa-jenkins-scm] [Git][qa/jenkins.debian.net][master] 6 commits: reproducible OpenWrt: pass 1 of drop all OpenWrt stuff, then rename all LEDE stuff to Openwrt

Holger Levsen gitlab at salsa.debian.org
Thu Oct 4 15:08:20 BST 2018


Holger Levsen pushed to branch master at Debian QA / jenkins.debian.net


Commits:
300e8fe4 by Holger Levsen at 2018-10-04T12:44:57Z
reproducible OpenWrt: pass 1 of drop all OpenWrt stuff, then rename all LEDE stuff to Openwrt

Signed-off-by: Holger Levsen <holger at layer-acht.org>

- - - - -
a41ea551 by Holger Levsen at 2018-10-04T12:48:36Z
reproducible OpenWrt: pass 2 of drop all OpenWrt stuff, then rename all LEDE stuff to Openwrt

Signed-off-by: Holger Levsen <holger at layer-acht.org>

- - - - -
f1aa3b37 by Holger Levsen at 2018-10-04T12:49:02Z
reproducible OpenWrt: pass 3 of drop all OpenWrt stuff, then rename all LEDE stuff to Openwrt

Signed-off-by: Holger Levsen <holger at layer-acht.org>

- - - - -
e63ae263 by Holger Levsen at 2018-10-04T12:51:30Z
reproducible OpenWrt: pass 4 of drop all OpenWrt stuff, then rename all LEDE stuff to Openwrt

Signed-off-by: Holger Levsen <holger at layer-acht.org>

- - - - -
725ce40c by Holger Levsen at 2018-10-04T13:22:27Z
reproducible OpenWrt: pass 5 of drop all OpenWrt stuff, then rename all LEDE stuff to Openwrt

Signed-off-by: Holger Levsen <holger at layer-acht.org>

- - - - -
0d8ad724 by Holger Levsen at 2018-10-04T14:07:02Z
reproducible OpenWrt: pass 6 of drop all OpenWrt stuff, then rename all LEDE stuff to Openwrt

Signed-off-by: Holger Levsen <holger at layer-acht.org>

- - - - -


19 changed files:

- README
- THANKS.head
- TODO
- bin/jenkins_node_wrapper.sh
- bin/reproducible_common.sh
- bin/reproducible_html_nodes_info.sh
- − bin/reproducible_lede.sh
- − bin/reproducible_lede_common.sh
- bin/reproducible_openwrt.sh
- hosts/jenkins/etc/apache2/reproduciblemap.conf
- job-cfg/reproducible.yaml
- mustache-templates/reproducible/project_links.mustache
- update_jdn.sh
- − userContent/reproducible/lede/asciidoctor.css
- − userContent/reproducible/lede/coderay.css
- − userContent/reproducible/lede/font-awesome.css
- − userContent/reproducible/lede/foundation.css
- − userContent/reproducible/lede/lede.css
- − userContent/reproducible/lede/lede.html


Changes:

=====================================
README
=====================================
@@ -199,7 +199,7 @@ usage: reproducible_setup_notify.py [-h] [-o] [-p PACKAGES [PACKAGES ...]]
 
 * Job configuration is at the usual location for 'jenkins.debian.net': there's a 'job-cfg/reproducible.yaml' defining all the jobs and lots of scripts in 'bin/reproducible_*.(sh|py)', plus a few config files like for 'sudo' or 'apache2'.
 
-* Finally, there are also jobs testing the link:http://www.coreboot.org/[coreboot], link:https://lede-project.org/[LEDE], link:https://openwrt.org/[OpenWrt], link:http://www.netbsd.org/[NetBSD] and https://www.freebsd.org/[FreeBSD] projects. The results of the tests can be seen respectively at https://tests.reproducible-builds.org/coreboot/, https://tests.reproducible-builds.org/openwrt/, https://tests.reproducible-builds.org/netbsd/ and https://tests.reproducible-builds.org/freebsd/.
+* Finally, there are also jobs testing the link:http://www.coreboot.org/[coreboot], link:https://openwrt.org/[OpenWrt], link:http://www.netbsd.org/[NetBSD] and https://www.freebsd.org/[FreeBSD] projects. The results of the tests can be seen respectively at https://tests.reproducible-builds.org/coreboot/, https://tests.reproducible-builds.org/openwrt/, https://tests.reproducible-builds.org/netbsd/ and https://tests.reproducible-builds.org/freebsd/.
 
 === torbrowser-launcher jobs
 


=====================================
THANKS.head
=====================================
@@ -7,8 +7,8 @@
  ** 15 cores and 48 GB memory for profitbricks-build1-amd64.debian.net used for building amd64 Debian packages for tests.reproducible-builds.org (t.r-b.o)
  ** 10 cores and 36 GB memory for profitbricks-build2-i386.debian.net used for building i386
 Debian packages for t.r-b.o
- ** 12 cores and 24 GB memory for profitbricks-build3-amd64.debian.net used for building OpenWrt, LEDE, coreboot, Fedora, Archlinux and NetBSD for t.r-b.o
- ** 11 cores and 24 GB memory for profitbricks-build4-amd64.debian.net used for building OpenWrt, LEDE, coreboot, Fedora, Archlinux and NetBSD for t.r-b.o, running in the future
+ ** 12 cores and 24 GB memory for profitbricks-build3-amd64.debian.net used for building OpenWrt, coreboot, Fedora, Archlinux and NetBSD for t.r-b.o
+ ** 11 cores and 24 GB memory for profitbricks-build4-amd64.debian.net used for building OpenWrt, coreboot, Fedora, Archlinux and NetBSD for t.r-b.o, running in the future
  ** 16 cores and 48 GB memory for profitbricks-build5-amd64.debian.net used for building amd64 Debian packages for t.r-b.o, running in the future
  ** 9 cores and 36 GB memory for profitbricks-build6-i386.debian.net used for building i386 Debian packages for t.r-b.o, running in the future
  ** 15 cores and 48 GB memory for profitbricks-build11-amd64.debian.net used for building amd64 Debian packages for tests.reproducible-builds.org (t.r-b.o)


=====================================
TODO
=====================================
@@ -216,23 +216,19 @@ See link:https://jenkins.debian.net/userContent/about.html["about jenkins.debian
 * explain status in plain english
 * use disorderfs for 2nd build
 
-==== reproducible LEDE 
 
+==== reproducible OpenWrt
+
+* add credit for logo/artwork
+* explain status in plain english
 * build path variation
 * use disorderfs for 2nd build
+* incorporate popular third-party ("external feeds") packages?
 * html: build variations are wrong
 * html: git commit output includes garbage
 * html: css: add some space on the left side
 * html: css: make it more look like https://lede-project.org/
 
-==== reproducible OpenWrt
-
-* add credit for logo/artwork
-* build path variation
-* incorporate popular third-party ("external feeds") packages?
-* explain status in plain english
-* use disorderfs for 2nd build
-
 ==== reproducible NetBSD
 
 * explain status in plain english


=====================================
bin/jenkins_node_wrapper.sh
=====================================
@@ -92,7 +92,7 @@ elif [[ "$*" =~ ^rsync\ --server\ --sender\ .*\ \.\ /var/lib/jenkins/jobs/.*/wor
 elif [[ "$*" =~ ^rsync\ --server\ .*\ \.\ /srv/d-i/isos/ ]] ; then
 	exec rsync --server "$3" . "$5" ; croak "Exec failed";
 elif [[ "$*" =~ ^rsync\ --server\ .*\ \.\ /srv/workspace/chroots/.* ]] ; then
-	# LEDE is using this to share files between master node1 node2.
+	# OpenWrt is using this to share files between master node1 node2.
 	exec rsync --server "$3" . "$5" ; croak "Exec failed";
 elif [[ "$*" =~ ^rsync\ --server\ .*\ \.\ /srv/reproducible-results/.* ]] ; then
 	# allow to push files to /srv/reproducible-results/
@@ -125,8 +125,6 @@ elif [[ "$*" =~ ^reproducible_coreboot ]] ; then
 	exec /srv/jenkins/bin/reproducible_coreboot.sh ; croak "Exec failed";
 elif [[ "$*" =~ ^reproducible_openwrt ]] ; then
 	shift ; exec /srv/jenkins/bin/reproducible_openwrt.sh $@ ; croak "Exec failed";
-elif [[ "$*" =~ ^reproducible_lede ]] ; then
-	shift ; exec /srv/jenkins/bin/reproducible_lede.sh $@ ; croak "Exec failed";
 elif [[ "$*" =~ ^reproducible_netbsd ]] ; then
 	exec /srv/jenkins/bin/reproducible_netbsd.sh ; croak "Exec failed";
 elif [[ "$*" =~ ^reproducible_freebsd ]] ; then


=====================================
bin/reproducible_common.sh
=====================================
@@ -319,8 +319,7 @@ write_page_header() {
 		write_page "   <li><a href=\"/openwrt/\">OpenWrt</a></li>, "
 		write_page "   <li><a href=\"/netbsd/\">NetBSD</a></li>, "
 		write_page "   <li><a href=\"/freebsd/\">FreeBSD</a></li>, "
-		write_page "   <li><a href=\"/archlinux/\">Arch Linux</a></li> "
-		write_page "   and <li><a href=\"/lede/\">LEDE</a></li>, "
+		write_page "   and <li><a href=\"/archlinux/\">Arch Linux</a></li> "
 		write_page "   though not as thoroughly as Debian (yet?) - and testing of "
 		write_page "   <li><a href=\"/rpms/fedora-23.html\">Fedora</a></li> "
 		write_page "   has just begun, and there are plans to test "
@@ -343,13 +342,9 @@ write_page_intro() {
 		write_page "        <p><em>Reproducible Coreboot</em> is an effort to apply this to coreboot. Thus each coreboot.rom is build twice (without payloads), with a few variations added and then those two ROMs are compared using <a href=\"https://tracker.debian.org/diffoscope\">diffoscope</a>. Please note that the toolchain is not varied at all as the rebuild happens on exactly the same system. More variations are expected to be seen in the wild.</p>"
 		local PROJECTNAME="$1"
 		local PROJECTURL="https://review.coreboot.org/p/coreboot.git"
-	elif [ "$1" = "OpenWrt" ] || [ "$1" = "LEDE" ]; then
+	elif [ "$1" = "OpenWrt" ] ; then
 		local PROJECTNAME="$1"
-		if [ "$PROJECTNAME" = "OpenWrt" ] ; then
-			local PROJECTURL="https://github.com/openwrt/openwrt.git"
-		else
-			local PROJECTURL="https://git.lede-project.org/?p=source.git;a=summary"
-		fi
+		local PROJECTURL="https://github.com/openwrt/openwrt.git"
 		write_page "        <p><em>Reproducible $PROJECTNAME</em> is an effort to apply this to $PROJECTNAME. Thus each $PROJECTNAME target is build twice, with a few variations added and then the resulting images and packages from the two builds are compared using <a href=\"https://tracker.debian.org/diffoscope\">diffoscope</a>. $PROJECTNAME generates many different types of raw <code>.bin</code> files, and diffoscope does not know how to parse these. Thus the resulting diffoscope output is not nearly as clear as it could be - hopefully this limitation will be overcome eventually, but in the meanwhile the input components (uImage kernel file, rootfs.tar.gz, and/or rootfs squashfs) can be inspected. Also please note that the toolchain is not varied at all as the rebuild happens on exactly the same system. More variations are expected to be seen in the wild.</p>"
 	elif [ "$1" = "NetBSD" ] ; then
 		write_page "        <p><em>Reproducible NetBSD</em> is an effort to apply this to NetBSD. Thus each NetBSD target is build twice, with a few variations added and then the resulting files from the two builds are compared using <a href=\"https://tracker.debian.org/diffoscope\">diffoscope</a>. Please note that the toolchain is not varied at all as the rebuild happens on exactly the same system. More variations are expected to be seen in the wild.</p>"
@@ -444,7 +439,7 @@ write_variation_table() {
 		write_page "</td><td>i-capture-the-hostname</td></tr>"
 		write_page "<tr><td>domainname</td><td>$(hostname -d)</td><td>i-capture-the-domainname</td></tr>"
 	else
-		if [ "$1" = "LEDE" ] || [ "$1" != "Arch Linux" ] || [ "$1" != "OpenWrt" ] ; then
+		if [ "$1" != "Arch Linux" ] || [ "$1" != "OpenWrt" ] ; then
 			write_page "<tr><td>hostname</td><td> profitbricks-build3-amd64 or profitbricks-build4-amd64</td><td>the other one</td></tr>"
 		else
 			write_page "<tr><td>hostname</td><td colspan=\"2\"> is not yet varied between rebuilds of $1.</td></tr>"


=====================================
bin/reproducible_html_nodes_info.sh
=====================================
@@ -223,7 +223,7 @@ build_job_health_page() {
 	FILTER[4]="(json|le_scheduler|meta|le_nodes|rsync|notes)"
 	FILTER[5]="archlinux"
 	FILTER[6]="coreboot"
-	FILTER[7]="(openwrt|lede)"
+	FILTER[7]="(openwrt)"
 	FILTER[8]="(le_netbsd|le_freebsd)"
 	FILTER[9]="fdroid"
 	FILTER[10]="fedora"


=====================================
bin/reproducible_lede.sh deleted
=====================================
@@ -1,258 +0,0 @@
-#!/bin/bash
-
-# Copyright 2014-2017 Holger Levsen <holger at layer-acht.org>
-#         © 2015 Reiner Herrmann <reiner at reiner-h.de>
-#           2016-2018 Alexander Couzens <lynxis at fe80.eu>
-# released under the GPLv=2
-
-OPENWRT_GIT_REPO=https://git.openwrt.org/openwrt/staging/lynxis.git
-OPENWRT_GIT_BRANCH=master
-DEBUG=false
-LEDE_CONFIG=
-LEDE_TARGET=
-
-. /srv/jenkins/bin/common-functions.sh
-common_init "$@"
-
-# common code defining db access
-. /srv/jenkins/bin/reproducible_common.sh
-# common code defining functions for OpenWrt/LEDE
-. /srv/jenkins/bin/reproducible_lede_common.sh
-set -e
-
-echo "$0 got called with '$*'"
-# this script is called from positions
-# * it's called from the reproducible_wrapper when running on the master
-# * it's called from reproducible_opewnrt_common when doing remote builds
-case $1 in
-	node)
-		shift
-		case $1 in
-			openwrt_build |\
-			openwrt_download |\
-			openwrt_get_banner |\
-			node_create_tmpdirs |\
-			node_debug |\
-			node_save_logs |\
-			node_cleanup_tmpdirs) ;; # this is the allowed list
-			*)
-				echo "Unsupported remote node function $*"
-				exit 1
-				;;
-		esac
-		"$@"
-		trap - INT TERM EXIT
-		exit 0
-	;;
-	master)
-		# master code following
-		LEDE_TARGET=$2
-		LEDE_CONFIG=$3
-	;;
-	*)
-		echo "Unsupported mode $1. Arguments are $*"
-		exit 1
-	;;
-esac
-
-#
-# main
-#
-DATE=$(date -u +'%Y-%m-%d')
-START=$(date +'%s')
-TMPBUILDDIR=$(mktemp --tmpdir=/srv/workspace/chroots/ -d -t "rbuild-lede-build-${DATE}-XXXXXXXX")  # used to build on tmpfs
-RESULTSDIR=$(mktemp --tmpdir=/srv/reproducible-results -d -t rbuild-lede-results-XXXXXXXX)  # accessable in schroots, used to compare results
-BANNER_HTML=$(mktemp "--tmpdir=$RESULTSDIR")
-trap master_cleanup_tmpdirs INT TERM EXIT
-
-cd "$TMPBUILDDIR"
-
-create_results_dirs lede
-
-build_two_times lede "$LEDE_TARGET" "$LEDE_CONFIG"
-
-# for now we only build one architecture until it's at most reproducible
-#build_two_times x86_64 "CONFIG_TARGET_x86=y\nCONFIG_TARGET_x86_64=y\n"
-#build_two_times ramips_rt288x_RTN15 "CONFIG_TARGET_ramips=y\nCONFIG_TARGET_ramips_rt288x=y\nCONFIG_TARGET_ramips_rt288x_RTN15=y\n"
-
-#
-# create html about toolchain used
-#
-echo "============================================================================="
-echo "$(date -u) - Creating Documentation HTML"
-echo "============================================================================="
-
-# created & copied by build_two_times()
-TOOLCHAIN_HTML=$RESULTSDIR/toolchain.html
-
-# clean up builddir to save space on tmpfs
-rm -rf "$TMPBUILDDIR/lede"
-
-# run diffoscope on the results
-# (this needs refactoring rather badly)
-TIMEOUT="30m"
-DIFFOSCOPE="$(schroot --directory /tmp -c "chroot:jenkins-reproducible-${DBDSUITE}-diffoscope" diffoscope -- --version 2>&1)"
-echo "============================================================================="
-echo "$(date -u) - Running $DIFFOSCOPE on LEDE images and packages."
-echo "============================================================================="
-DBD_HTML=$(mktemp "--tmpdir=$RESULTSDIR")
-DBD_GOOD_PKGS_HTML=$(mktemp "--tmpdir=$RESULTSDIR")
-DBD_BAD_PKGS_HTML=$(mktemp "--tmpdir=$RESULTSDIR")
-# run diffoscope on the images
-GOOD_IMAGES=0
-ALL_IMAGES=0
-SIZE=""
-cd "$RESULTSDIR/b1/targets"
-tree .
-
-# call_diffoscope requires TMPDIR
-TMPDIR=$RESULTSDIR
-
-# iterate over all images (merge b1 and b2 images into one list)
-# call diffoscope on the images
-for target in * ; do
-	cd "$target"
-	for subtarget in * ; do
-		cd "$subtarget"
-
-		# search images in both paths to find non-existing ones
-		IMGS1=$(find -- * -type f -name "*.bin" -o -name "*.squashfs" | sort -u )
-		pushd "$RESULTSDIR/b2/targets/$target/$subtarget"
-		IMGS2=$(find -- * -type f -name "*.bin" -o -name "*.squashfs" | sort -u )
-		popd
-
-		echo "       <table><tr><th>Images for <code>$target/$subtarget</code></th></tr>" >> "$DBD_HTML"
-		for image in $(printf "%s\n%s" "$IMGS1" "$IMGS2" | sort -u ) ; do
-			let ALL_IMAGES+=1
-			if [ ! -f "$RESULTSDIR/b1/targets/$target/$subtarget/$image" ] || [ ! -f "$RESULTSDIR/b2/targets/$target/$subtarget/$image" ] ; then
-				echo "         <tr><td><img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> $image (${SIZE}) failed to build.</td></tr>" >> "$DBD_HTML"
-				rm -f "$BASE/lede/dbd/targets/$target/$subtarget/$image.html" # cleanup from previous (unreproducible) tests - if needed
-				continue
-			fi
-
-			if [ "$(sha256sum "$RESULTSDIR/b1/targets/$target/$subtarget/$image" "$RESULTSDIR/b2/targets/$target/$subtarget/$image" \
-				| cut -f 1 -d ' ' | uniq -c  | wc -l)" != "1" ] ; then
-				call_diffoscope "targets/$target/$subtarget" "$image"
-			else
-				echo "$(date -u) - targets/$target/$subtarget/$image is reproducible, yip!"
-			fi
-			get_filesize "$image"
-			if [ -f "$RESULTSDIR/targets/$target/$subtarget/$image.html" ] ; then
-				mkdir -p "$BASE/lede/dbd/targets/$target/$subtarget"
-				mv "$RESULTSDIR/targets/$target/$subtarget/$image.html" "$BASE/lede/dbd/targets/$target/$subtarget/$image.html"
-				echo "         <tr><td><a href=\"dbd/targets/$target/$subtarget/$image.html\"><img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> $image</a> (${SIZE}) is unreproducible.</td></tr>" >> "$DBD_HTML"
-			else
-				SHASUM=$(sha256sum "$image" |cut -d " " -f1)
-				echo "         <tr><td><img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> $image ($SHASUM, $SIZE) is reproducible.</td></tr>" >> "$DBD_HTML"
-				let GOOD_IMAGES+=1
-				rm -f "$BASE/lede/dbd/targets/$target/$subtarget/$image.html" # cleanup from previous (unreproducible) tests - if needed
-			fi
-		done
-		cd ..
-		echo "       </table>" >> "$DBD_HTML"
-	done
-	cd ..
-done
-GOOD_PERCENT_IMAGES=$(echo "scale=1 ; ($GOOD_IMAGES*100/$ALL_IMAGES)" | bc | grep -qs . || echo 0.00)
-# run diffoscope on the packages
-GOOD_PACKAGES=0
-ALL_PACKAGES=0
-cd "$RESULTSDIR/b1"
-for i in * ; do
-	cd "$i"
-
-	# search packages in both paths to find non-existing ones
-	PKGS1=$(find -- * -type f -name "*.ipk" | sort -u )
-	pushd "$RESULTSDIR/b2/$i"
-	PKGS2=$(find -- * -type f -name "*.ipk" | sort -u )
-	popd
-
-	for j in $(printf "%s\n%s" "$PKGS1" "$PKGS2" | sort -u ) ; do
-		let ALL_PACKAGES+=1
-		if [ ! -f "$RESULTSDIR/b1/$i/$j" ] || [ ! -f "$RESULTSDIR/b2/$i/$j" ] ; then
-			echo "         <tr><td><img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> $j (${SIZE}) failed to build.</td></tr>" >> "$DBD_BAD_PKGS_HTML"
-			rm -f "$BASE/lede/dbd/$i/$j.html" # cleanup from previous (unreproducible) tests - if needed
-			continue
-		fi
-
-		if [ "$(sha256sum "$RESULTSDIR/b1/$i/$j" "$RESULTSDIR/b2/$i/$j" | cut -f 1 -d ' ' | uniq -c  | wc -l)" != "1" ] ; then
-			call_diffoscope "$i" "$j"
-		else
-			echo "$(date -u) - $i/$j is reproducible, yip!"
-		fi
-		get_filesize "$j"
-		if [ -f "$RESULTSDIR/$i/$j.html" ] ; then
-			mkdir -p "$BASE/lede/dbd/$i/$(dirname "$j")"
-			mv "$RESULTSDIR/$i/$j.html" "$BASE/lede/dbd/$i/$j.html"
-			echo "         <tr><td><a href=\"dbd/$i/$j.html\"><img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> $j</a> ($SIZE) is unreproducible.</td></tr>" >> "$DBD_BAD_PKGS_HTML"
-		else
-			SHASUM=$(sha256sum "$j" |cut -d " " -f1)
-			echo "         <tr><td><img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> $j ($SHASUM, $SIZE) is reproducible.</td></tr>" >> "$DBD_GOOD_PKGS_HTML"
-			let GOOD_PACKAGES+=1
-			rm -f "$BASE/lede/dbd/$i/$j.html" # cleanup from previous (unreproducible) tests - if needed
-		fi
-	done
-	cd ..
-done
-echo "       <table><tr><th>Unreproducible and otherwise broken packages</th></tr>" >> "$DBD_HTML"
-cat "$DBD_BAD_PKGS_HTML" >> "$DBD_HTML"
-echo "       </table>" >> "$DBD_HTML"
-echo "       <table><tr><th>Reproducible packages</th></tr>" >> "$DBD_HTML"
-cat "$DBD_GOOD_PKGS_HTML" >> "$DBD_HTML"
-echo "       </table>" >> "$DBD_HTML"
-GOOD_PERCENT_PACKAGES=$(echo "scale=1 ; ($GOOD_PACKAGES*100/$ALL_PACKAGES)" | bc | grep -qs . || echo 0.00)
-# are we there yet?
-if [ "$GOOD_PERCENT_IMAGES" = "100.0" ] || [ "$GOOD_PERCENT_PACKAGES" = "100.0" ]; then
-	MAGIC_SIGN="!"
-else
-	MAGIC_SIGN="?"
-fi
-
-#
-#  finally create the webpage
-#
-cd "$RESULTSDIR" ; mkdir lede
-PAGE=lede/lede_$LEDE_TARGET.html
-cat > "$PAGE" <<- EOF
-<!DOCTYPE html>
-<html lang="en-US">
-  <head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width">
-    <title>Reproducible LEDE ?</title>
-    <link rel="stylesheet" href="foundation.css"/>
-    <link rel="stylesheet" href="font-awesome.css"/>
-    <link rel="stylesheet" href="coderay.css"/>
-    <link rel="stylesheet" href="asciidoctor.css"/>
-    <link rel="stylesheet" href="lede.css"/>
-  </head>
-  <body>
-    <div id="content">
-        <pre>
-EOF
-cat "$BANNER_HTML" >> "$PAGE"
-write_page "       </pre>"
-write_page "     </div><div id=\"main-content\">"
-write_page "       <h1>LEDE - <em>reproducible</em> wireless freedom$MAGIC_SIGN</h1>"
-write_page_intro LEDE
-write_page "       <p>$GOOD_IMAGES ($GOOD_PERCENT_IMAGES%) out of $ALL_IMAGES built images and $GOOD_PACKAGES ($GOOD_PERCENT_PACKAGES%) out of $ALL_PACKAGES built packages were reproducible in our test setup."
-write_page "        These tests were last run on $DATE for version ${OPENWRT_VERSION} using ${DIFFOSCOPE}.</p>"
-write_variation_table LEDE
-cat "$DBD_HTML" >> "$PAGE"
-cat "$TOOLCHAIN_HTML" >> "$PAGE"
-write_page "    </div>"
-write_page_footer LEDE
-publish_page
-rm -f "$DBD_HTML" "$DBD_GOOD_PKGS_HTML" "$DBD_BAD_PKGS_HTML" "$TOOLCHAIN_HTML" "$BANNER_HTML"
-
-# the end
-calculate_build_duration
-print_out_duration
-for CHANNEL in reproducible-builds lede-dev ; do
-	irc_message $CHANNEL "$REPRODUCIBLE_URL/$PAGE has been updated. ($GOOD_PERCENT_IMAGES% images and $GOOD_PERCENT_PACKAGES% packages reproducible in our current test framework.)"
-done
-echo "============================================================================="
-
-# remove everything, we don't need it anymore...
-master_cleanup_tmpdirs success
-trap - INT TERM EXIT


=====================================
bin/reproducible_lede_common.sh deleted
=====================================
@@ -1,447 +0,0 @@
-#!/bin/bash
-
-# Copyright 2014-2017 Holger Levsen <holger at layer-acht.org>
-#         © 2015 Reiner Herrmann <reiner at reiner-h.de>
-#           2016-2017 Alexander Couzens <lynxis at fe80.eu>
-# released under the GPLv=2
-
-# configuration
-GENERIC_NODE1=profitbricks-build3-amd64.debian.net
-GENERIC_NODE2=profitbricks-build4-amd64.debian.net
-
-# run on jenkins master
-node_debug() {
-	ls -al "$1" || true
-	ls -al "$1/" || true
-	ls -al "$1/download" || true
-}
-
-# only called direct on a remote build node
-node_cleanup_tmpdirs() {
-	export TMPBUILDDIR=$1
-	cd
-	# (very simple) check we are deleting the right stuff
-	if [ "${TMPBUILDDIR:0:23}" != "/srv/workspace/chroots/" ] || [ ${#TMPBUILDDIR} -le 23 ] ; then
-		echo "Something very strange with \$TMPBUILDDIR=$TMPBUILDDIR exiting instead of doing cleanup."
-		exit 1
-	fi
-	rm -rf "$TMPBUILDDIR"
-}
-
-node_create_tmpdirs() {
-	export TMPBUILDDIR=$1
-	# (very simple) check what we are creating
-	if [ "${TMPBUILDDIR:0:23}" != "/srv/workspace/chroots/" ] || [ ${#TMPBUILDDIR} -le 23 ] ; then
-		echo "Something very strange with \$TMPBUILDDIR=$TMPBUILDDIR exiting instead of doing create."
-		exit 1
-	fi
-	mkdir -p "$TMPBUILDDIR/download"
-}
-
-# called as trap handler and also to cleanup after a success build
-master_cleanup_tmpdirs() {
-	# we will save the logs in case we got called as trap handler
-	# in a success build the logs are saved on a different function
-	if [ "$1" != "success" ] ; then
-		# job failed
-		ssh "$GENERIC_NODE1" "reproducible_$TYPE" node node_save_logs "$TMPBUILDDIR" || true
-		ssh "$GENERIC_NODE2" "reproducible_$TYPE" node node_save_logs "$TMPBUILDDIR" || true
-		# save failure logs
-		mkdir -p "$WORKSPACE/results/"
-		rsync -av "$GENERIC_NODE1:$RESULTSDIR/build_logs.tar.xz" "$WORKSPACE/results/build_logs_b1.tar.xz" || true
-		rsync -av "$GENERIC_NODE2:$RESULTSDIR/build_logs.tar.xz" "$WORKSPACE/results/build_logs_b2.tar.xz" || true
-	fi
-
-	ssh "$GENERIC_NODE1" "reproducible_$TYPE" node node_cleanup_tmpdirs "$TMPBUILDDIR" || true
-	ssh "$GENERIC_NODE2" "reproducible_$TYPE" node node_cleanup_tmpdirs "$TMPBUILDDIR" || true
-
-	cd
-	# (very simple) check we are deleting the right stuff
-	if [ "${RESULTSDIR:0:26}" != "/srv/reproducible-results/" ] || [ ${#RESULTSDIR} -le 26 ] || \
-	   [ "${TMPBUILDDIR:0:23}" != "/srv/workspace/chroots/" ] || [ ${#TMPBUILDDIR} -le 23 ] ; then
-		echo "Something very strange with \$RESULTSDIR=$RESULTSDIR or \$TMPBUILDDIR=$TMPBUILDDIR, exiting instead of doing cleanup."
-		exit 1
-	fi
-	rm -rf "$RESULTSDIR"
-	rm -rf "$TMPBUILDDIR"
-	if [ -f "$BANNER_HTML" ] ; then
-		rm -f "$BANNER_HTML"
-	fi
-}
-
-create_results_dirs() {
-	local project=$1
-	mkdir -p "$BASE/$project/dbd"
-}
-
-node_document_environment() {
-	local tmpdir=$1
-	local toolchain_html=$tmpdir/toolchain.html
-
-	cd "$tmpdir/build/source"
-	cat /dev/null > "$toolchain_html"
-	echo "     <table><tr><th>git commit built</th></tr><tr><td><code>" >> "$toolchain_html"
-	git log -1 >> "$toolchain_html"
-	echo "     </code></td></tr></table>" >> "$toolchain_html"
-
-	echo "<table><tr><th>Target toolchains built</th></tr>" >> "$toolchain_html"
-	for i in $(ls -1d staging_dir/toolchain*|cut -d "-" -f2-|xargs echo) ; do
-		echo " <tr><td><code>$i</code></td></tr>" >> "$toolchain_html"
-	done
-	echo "</table>" >> "$toolchain_html"
-	echo "<table><tr><th>Contents of <code>build_dir/host/</code></th></tr>" >> "$toolchain_html"
-	for i in $(ls -1 build_dir/host/) ; do
-		echo " <tr><td>$i</td></tr>" >> "$toolchain_html"
-	done
-	echo "</table>" >> "$toolchain_html"
-	echo "<table><tr><th>Downloaded software</th></tr>" >> "$toolchain_html"
-	for i in $(ls -1 dl/) ; do
-		echo " <tr><td>$i</td></tr>" >> "$toolchain_html"
-	done
-	echo "</table>" >> "$toolchain_html"
-	echo "<table><tr><th>Debian $(cat /etc/debian_version) package on $(dpkg --print-architecture)</th><th>installed version</th></tr>" >> "$toolchain_html"
-	for i in gcc binutils bzip2 flex python perl make findutils grep diffutils unzip gawk util-linux zlib1g-dev libc6-dev git subversion ; do
-		echo " <tr><td>$i</td><td>" >> "$toolchain_html"
-		dpkg -s $i|grep '^Version'|cut -d " " -f2 >> "$toolchain_html"
-		echo " </td></tr>" >> "$toolchain_html"
-	done
-	echo "</table>" >> "$toolchain_html"
-	cd -
-}
-
-# node_save_logs can be called over ssh OR called within openwrt_build
-# it's always only run on a remote host.
-node_save_logs() {
-	local tmpdir=$1
-
-	if [ "${tmpdir:0:23}" != "/srv/workspace/chroots/" ] || [ ${#tmpdir} -le 23 ] ; then
-		echo "Something very strange with \$TMPDIR=$tmpdir exiting instead of doing node_save_logs."
-		exit 1
-	fi
-
-	if [ ! -d "$tmpdir/build/source/logs" ] ; then
-		# we create an empty tar.xz instead of failing
-		touch "$tmpdir/build_logs.tar.xz"
-	else
-		tar cJf "$tmpdir/build_logs.tar.xz" -C "$tmpdir/build/source" ./logs
-	fi
-
-	node_document_environment "$tmpdir"
-}
-
-# RUN - is b1 or b2. b1 for first run, b2 for second
-# save the images and packages under $TMPDIR/$RUN
-# run on the master
-save_lede_results() {
-	RUN=$1
-
-	# first save all images and target specific packages
-	pushd bin/targets
-	for target in * ; do
-		pushd "$target" || continue
-		for subtarget in * ; do
-			pushd "$subtarget" || continue
-
-			# save firmware images
-			mkdir -p "$TMPDIR/$RUN/targets/$target/$subtarget/"
-			for image in $(find * -name "*.bin" -o -name "*.squashfs") ; do
-				cp -p "$image" "$TMPDIR/$RUN/targets/$target/$subtarget/"
-			done
-
-			# save subtarget specific packages
-			if [ -d packages ] ; then
-				pushd packages
-				for package in $(find * -name "*.ipk") ; do
-					mkdir -p $TMPDIR/$RUN/packages/$target/$subtarget/$(dirname $package) || ( echo $TMPDIR/$RUN/packages/$target/$subtarget/$(dirname $package) ; continue )
-					cp -p $package $TMPDIR/$RUN/packages/$target/$subtarget/$(dirname $package)/
-				done
-				popd
-			fi
-			popd
-		done
-		popd
-	done
-	popd
-
-	# save all generic packages
-	# arch is like mips_34kc_dsp
-	pushd bin/packages/
-	for arch in * ; do
-		pushd "$arch" || continue
-		for feed in * ; do
-			pushd "$feed" || continue
-			for package in $(find * -name "*.ipk") ; do
-				mkdir -p "$TMPDIR/$RUN/packages/$arch/$feed/$(dirname "$package")"
-				cp -p "$package" "$TMPDIR/$RUN/packages/$arch/$feed/$(dirname "$package")/"
-			done
-			popd
-		done
-		popd
-	done
-	popd
-}
-
-# RUN - is b1 or b2. b1 for first run, b2 for second
-# save the images and packages under $TMPDIR/$RUN
-save_openwrt_results() {
-	RUN=$1
-	cd bin
-	for i in * ; do
-		cd "$i"
-		# save images
-		mkdir -p "$TMPDIR/$RUN/$i"
-		for j in $(find * -name "*.bin" -o -name "*.squashfs") ; do
-			cp -p "$j" "$TMPDIR/$RUN/$i/"
-		done
-		# save packages
-		cd packages
-		for j in $(find * -name "*.ipk") ; do
-			mkdir -p "$TMPDIR/$RUN/$i/$(dirname "$j")"
-			cp -p "$j" "$TMPDIR/$RUN/$i/$(dirname "$j")/"
-		done
-		cd ../..
-	done
-	cd ..
-}
-
-# apply variations change the environment for
-# the subsequent run
-# RUN - b1 or b2. b1 for first run, b2 for the second
-openwrt_apply_variations() {
-	RUN=$1
-
-	if [ "$RUN" = "b1" ] ; then
-		export TZ="/usr/share/zoneinfo/Etc/GMT+12"
-		export MAKE=make
-	else
-		export TZ="/usr/share/zoneinfo/Etc/GMT-14"
-		export LANG="fr_CH.UTF-8"
-		export LC_ALL="fr_CH.UTF-8"
-		export PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path"
-		export CAPTURE_ENVIRONMENT="I capture the environment"
-		# needs to fix openwrt/lede ;)
-		# umask 0002
-
-		# use allmost all cores for second build
-		export NEW_NUM_CPU=$(echo "$NUM_CPU-1" | bc)
-		export MAKE=make
-	fi
-}
-
-
-openwrt_config() {
-	CONFIG=$1
-
-	printf "$CONFIG\n" | grep '^[^ ]' > .config
-	printf "CONFIG_ALL=y\n" >> .config
-	printf "CONFIG_AUTOREMOVE=y\n" >> .config
-	printf "CONFIG_BUILDBOT=y\n" >> .config
-	printf "CONFIG_CLEAN_IPKG=y\n" >> .config
-	printf "CONFIG_TARGET_ROOTFS_TARGZ=y\n" >> .config
-	printf 'CONFIG_KERNEL_BUILD_USER="lede"\n' >> .config
-	printf 'CONFIG_KERNEL_BUILD_DOMAIN="buildhost"\n' >> .config
-	make defconfig
-}
-
-openwrt_build_toolchain() {
-	echo "============================================================================="
-	echo "$(date -u) - Building the toolchain."
-	echo "============================================================================="
-
-	OPTIONS="-j $NUM_CPU IGNORE_ERRORS=ym BUILD_LOG=1"
-
-	ionice -c 3 make $OPTIONS tools/install
-	ionice -c 3 make $OPTIONS toolchain/install
-}
-
-# TYPE - openwrt or lede
-# RUN - b1 or b2. b1 means first run, b2 second
-# TARGET - a target including subtarget. E.g. ar71xx_generic
-openwrt_compile() {
-	local TYPE=$1
-	local RUN=$2
-	local TARGET=$3
-
-	OPTIONS="-j $NUM_CPU IGNORE_ERRORS=ym BUILD_LOG=1"
-
-	# make $RUN more human readable
-	[ "$RUN" = "b1" ] && RUN="first"
-	[ "$RUN" = "b2" ] && RUN="second"
-
-	echo "============================================================================="
-	echo "$(date -u) - Building $TYPE ${OPENWRT_VERSION} ($TARGET) - $RUN build run."
-	echo "============================================================================="
-	ionice -c 3 $MAKE $OPTIONS
-}
-
-openwrt_create_signing_keys() {
-	echo "============================================================================="
-	cat <<- EOF
-# LEDE signs the release with a signing key, but generate the signing key if not
-# present. To have a reproducible release we need to take care of signing keys.
-
-# LEDE will also put the key-build.pub into the resulting image (pkg: base-files)!
-# At the end of the build it will use the key-build to sign the Packages repo list.
-# Use a workaround this problem:
-
-# key-build.pub contains the pubkey of LEDE buildbot
-# key-build     contains our build key
-
-# Meaning only signed files will be different but not the images.
-# Packages.sig is unreproducible.
-
-# here is our random signing key
-# chosen by fair dice roll.
-# guaranteed to be random.
-
-# private key
-EOF
-	echo -e 'untrusted comment: Local build key\nRWRCSwAAAAB12EzgExgKPrR4LMduadFAw1Z8teYQAbg/EgKaN9SUNrgteVb81/bjFcvfnKF7jS1WU8cDdT2VjWE4Cp4cxoxJNrZoBnlXI+ISUeHMbUaFmOzzBR7B9u/LhX3KAmLsrPc=' | tee key-build
-	echo "\n# public key"
-	echo -e 'untrusted comment: Local build key\nRWQ/EgKaN9SUNja2aAZ5VyPiElHhzG1GhZjs8wUewfbvy4V9ygJi7Kz3' | tee key-build.pub
-
-	echo "# override the pubkey with 'LEDE usign key for unattended build jobs' to have the same base-files pkg and images"
-	echo -e 'untrusted comment: LEDE usign key for unattended build jobs\nRWS1BD5w+adc3j2Hqg9+b66CvLR7NlHbsj7wjNVj0XGt/othDgIAOJS+' | tee key-build.pub
-	echo "============================================================================="
-}
-
-# called by openwrt_two_times
-# ssh $GENERIC_NODE1 reproducible_$TYPE node openwrt_download $TYPE $TARGET $CONFIG $TMPDIR
-openwrt_download() {
-	local TARGET=$1
-	local CONFIG=$2
-	local TMPBUILDDIR=$3
-	local tries=5
-
-	cd "$TMPBUILDDIR/download"
-
-	# checkout the repo
-	echo "================================================================================"
-	echo "$(date -u) - Cloning git repository from $OPENWRT_GIT_REPO $OPENWRT_GIT_BRANCH. "
-	echo "================================================================================"
-	git clone -b "$OPENWRT_GIT_BRANCH" "$OPENWRT_GIT_REPO" source
-	cd source
-
-	echo "================================================================================"
-	echo "$(date -u) - received git version $(git log -1 --pretty=oneline)"
-	echo "================================================================================"
-
-	# otherwise LEDE will generate new release keys every build
-	openwrt_create_signing_keys
-
-	# update feeds
-	./scripts/feeds update
-	./scripts/feeds install -a
-
-	# configure openwrt because otherwise it wont download everything
-	openwrt_config "$CONFIG"
-	while ! make tools/tar/compile download -j "$NUM_CPU" IGNORE_ERRORS=ym BUILD_LOG=1 ; do
-		tries=$((tries - 1))
-		if [ $tries -eq 0 ] ; then
-			echo "================================================================================"
-			echo "$(date -u) - Failed to download sources"
-			echo "================================================================================"
-			exit 1
-		fi
-	done
-}
-
-openwrt_get_banner() {
-	local TMPDIR=$1
-	local TYPE=$2
-	cd "$TMPDIR/build/source"
-	echo "===bannerbegin==="
-	find staging_dir/ -name banner | grep etc/banner|head -1| xargs cat /dev/null
-	echo "===bannerend==="
-}
-
-# openwrt_build is run on a remote host
-# TYPE - openwrt or lede
-# RUN - b1 or b2. b1 means first run, b2 second
-# TARGET - a target including subtarget. E.g. ar71xx_generic
-# CONFIG - a simple basic .config as string. Use \n to seperate lines
-# TMPPATH - is a unique path generated with mktmp
-# lede has a different output directory than openwrt
-openwrt_build() {
-	local TYPE=$1
-	local RUN=$2
-	local TARGET=$3
-	local CONFIG=$4
-	export TMPDIR=$5
-	export TMPBUILDDIR=$TMPDIR/build/
-
-	mv "$TMPDIR/download" "$TMPBUILDDIR"
-
-	# openwrt/lede is checkouted under /download
-	cd "$TMPBUILDDIR/source"
-
-	# set tz, date, core, ..
-	openwrt_apply_variations "$RUN"
-
-	openwrt_build_toolchain
-	# build images and packages
-	openwrt_compile "$TYPE" "$RUN" "$TARGET"
-
-	# save the results
-	[ "$TYPE" = "lede" ] && save_lede_results "$RUN"
-	[ "$TYPE" = "openwrt" ] && save_openwrt_results "$RUN"
-
-	# copy logs
-	node_save_logs "$TMPDIR"
-}
-
-# build openwrt/lede on two different hosts
-# TARGET a target including subtarget. E.g. ar71xx_generic
-# CONFIG - a simple basic .config as string. Use \n to seperate lines
-# TYPE - openwrt or lede
-# lede has a different output directory than openwrt
-build_two_times() {
-	TYPE=$1
-	TARGET=$2
-	CONFIG=$3
-
-	# create openwrt
-	ssh "$GENERIC_NODE1" "reproducible_$TYPE" node node_create_tmpdirs "$TMPBUILDDIR"
-	ssh "$GENERIC_NODE2" "reproducible_$TYPE" node node_create_tmpdirs "$TMPBUILDDIR"
-	mkdir -p "$TMPBUILDDIR/download/"
-
-	# create results directory saved by jenkins as artifacts
-	mkdir -p "$WORKSPACE/results/"
-
-	# download and prepare openwrt on node b1
-	ssh "$GENERIC_NODE1" "reproducible_$TYPE" node openwrt_download "$TARGET" "$CONFIG" "$TMPBUILDDIR"
-
-	echo "== master"
-	ls -la "$TMPBUILDDIR/download/" || true
-	echo "== node1"
-	ssh "$GENERIC_NODE1" "reproducible_$TYPE" node node_debug "$TMPBUILDDIR"
-	echo "== node2"
-	ssh "$GENERIC_NODE2" "reproducible_$TYPE" node node_debug "$TMPBUILDDIR"
-
-	rsync -a "$GENERIC_NODE1:$TMPBUILDDIR/download/" "$TMPBUILDDIR/download/"
-	rsync -a "$TMPBUILDDIR/download/" "$GENERIC_NODE2:$TMPBUILDDIR/download/"
-
-	## first run
-	RUN=b1
-	ssh "$GENERIC_NODE1" "reproducible_$TYPE" node openwrt_build "$TYPE" "$RUN" "$TARGET" "$CONFIG" "$TMPBUILDDIR"
-	ssh "$GENERIC_NODE1" "reproducible_$TYPE" node openwrt_get_banner "$TMPBUILDDIR" "$TYPE" > "$BANNER_HTML"
-	# cut away everything before begin and after the end…
-	# (thats noise generated by the way we run this via reproducible_common.sh)
-	cat "$BANNER_HTML" | sed '/===bannerend===/,$d' | tac | sed '/===bannerbegin===/,$d' | tac > "$BANNER_HTML.out"
-    mv "$BANNER_HTML".out "$BANNER_HTML"
-
-	# rsync back logs and images
-	rsync -av "$GENERIC_NODE1:$TMPBUILDDIR/$RUN/" "$RESULTSDIR/$RUN/"
-	rsync -av "$GENERIC_NODE1:$TMPBUILDDIR/build_logs.tar.xz" "$WORKSPACE/results/build_logs_b1.tar.xz"
-	rsync -av "$GENERIC_NODE1:$TMPBUILDDIR/toolchain.html" "$RESULTSDIR/toolchain.html"
-	ssh "$GENERIC_NODE1" "reproducible_$TYPE" node node_cleanup_tmpdirs "$TMPBUILDDIR"
-
-	## second run
-	RUN=b2
-	ssh "$GENERIC_NODE2" "reproducible_$TYPE" node openwrt_build "$TYPE" "$RUN" "$TARGET" "$CONFIG" "$TMPBUILDDIR"
-
-	# rsync back logs and images
-	rsync -av "$GENERIC_NODE2:$TMPBUILDDIR/$RUN/" "$RESULTSDIR/$RUN/"
-	rsync -av "$GENERIC_NODE2:$TMPBUILDDIR/build_logs.tar.xz" "$WORKSPACE/results/build_logs_b2.tar.xz"
-	ssh "$GENERIC_NODE2" "reproducible_$TYPE" node node_cleanup_tmpdirs "$TMPBUILDDIR"
-}


=====================================
bin/reproducible_openwrt.sh
=====================================
@@ -1,23 +1,428 @@
 #!/bin/bash
 
-# Copyright 2014-2016 Holger Levsen <holger at layer-acht.org>
+# Copyright 2014-2018 Holger Levsen <holger at layer-acht.org>
 #         © 2015 Reiner Herrmann <reiner at reiner-h.de>
-#           2016 Alexander Couzens <lynxis at fe80.eu>
+#           2016-2018 Alexander Couzens <lynxis at fe80.eu>
 # released under the GPLv=2
 
-OPENWRT_GIT_REPO=https://github.com/openwrt/openwrt.git
+# configuration
+GENERIC_NODE1=profitbricks-build3-amd64.debian.net
+GENERIC_NODE2=profitbricks-build4-amd64.debian.net
+OPENWRT_GIT_REPO=https://git.openwrt.org/openwrt/staging/lynxis.git
 OPENWRT_GIT_BRANCH=master
-DEBUG=true
+DEBUG=false
+OPENWRT_CONFIG=
+OPENWRT_TARGET=
+
 . /srv/jenkins/bin/common-functions.sh
 common_init "$@"
 
 # common code defining db access
 . /srv/jenkins/bin/reproducible_common.sh
-# common code defining functions for OpenWrt/LEDE
-. /srv/jenkins/bin/reproducible_lede_common.sh
 set -e
 
-echo "$0 got called with '$@'"
+# run on jenkins master
+node_debug() {
+	ls -al "$1" || true
+	ls -al "$1/" || true
+	ls -al "$1/download" || true
+}
+
+# only called direct on a remote build node
+node_cleanup_tmpdirs() {
+	export TMPBUILDDIR=$1
+	cd
+	# (very simple) check we are deleting the right stuff
+	if [ "${TMPBUILDDIR:0:23}" != "/srv/workspace/chroots/" ] || [ ${#TMPBUILDDIR} -le 23 ] ; then
+		echo "Something very strange with \$TMPBUILDDIR=$TMPBUILDDIR exiting instead of doing cleanup."
+		exit 1
+	fi
+	rm -rf "$TMPBUILDDIR"
+}
+
+node_create_tmpdirs() {
+	export TMPBUILDDIR=$1
+	# (very simple) check what we are creating
+	if [ "${TMPBUILDDIR:0:23}" != "/srv/workspace/chroots/" ] || [ ${#TMPBUILDDIR} -le 23 ] ; then
+		echo "Something very strange with \$TMPBUILDDIR=$TMPBUILDDIR exiting instead of doing create."
+		exit 1
+	fi
+	mkdir -p "$TMPBUILDDIR/download"
+}
+
+# called as trap handler and also to cleanup after a success build
+master_cleanup_tmpdirs() {
+	# we will save the logs in case we got called as trap handler
+	# in a success build the logs are saved on a different function
+	if [ "$1" != "success" ] ; then
+		# job failed
+		ssh "$GENERIC_NODE1" "reproducible_openwrt" node node_save_logs "$TMPBUILDDIR" || true
+		ssh "$GENERIC_NODE2" "reproducible_openwrt" node node_save_logs "$TMPBUILDDIR" || true
+		# save failure logs
+		mkdir -p "$WORKSPACE/results/"
+		rsync -av "$GENERIC_NODE1:$RESULTSDIR/build_logs.tar.xz" "$WORKSPACE/results/build_logs_b1.tar.xz" || true
+		rsync -av "$GENERIC_NODE2:$RESULTSDIR/build_logs.tar.xz" "$WORKSPACE/results/build_logs_b2.tar.xz" || true
+	fi
+
+	ssh "$GENERIC_NODE1" "reproducible_openwrt" node node_cleanup_tmpdirs "$TMPBUILDDIR" || true
+	ssh "$GENERIC_NODE2" "reproducible_openwrt" node node_cleanup_tmpdirs "$TMPBUILDDIR" || true
+
+	cd
+	# (very simple) check we are deleting the right stuff
+	if [ "${RESULTSDIR:0:26}" != "/srv/reproducible-results/" ] || [ ${#RESULTSDIR} -le 26 ] || \
+	   [ "${TMPBUILDDIR:0:23}" != "/srv/workspace/chroots/" ] || [ ${#TMPBUILDDIR} -le 23 ] ; then
+		echo "Something very strange with \$RESULTSDIR=$RESULTSDIR or \$TMPBUILDDIR=$TMPBUILDDIR, exiting instead of doing cleanup."
+		exit 1
+	fi
+	rm -rf "$RESULTSDIR"
+	rm -rf "$TMPBUILDDIR"
+	if [ -f "$BANNER_HTML" ] ; then
+		rm -f "$BANNER_HTML"
+	fi
+}
+
+node_document_environment() {
+	local tmpdir=$1
+	local toolchain_html=$tmpdir/toolchain.html
+
+	cd "$tmpdir/build/source"
+	cat /dev/null > "$toolchain_html"
+	echo "     <table><tr><th>git commit built</th></tr><tr><td><code>" >> "$toolchain_html"
+	git log -1 >> "$toolchain_html"
+	echo "     </code></td></tr></table>" >> "$toolchain_html"
+
+	echo "<table><tr><th>Target toolchains built</th></tr>" >> "$toolchain_html"
+	for i in $(ls -1d staging_dir/toolchain*|cut -d "-" -f2-|xargs echo) ; do
+		echo " <tr><td><code>$i</code></td></tr>" >> "$toolchain_html"
+	done
+	echo "</table>" >> "$toolchain_html"
+	echo "<table><tr><th>Contents of <code>build_dir/host/</code></th></tr>" >> "$toolchain_html"
+	for i in $(ls -1 build_dir/host/) ; do
+		echo " <tr><td>$i</td></tr>" >> "$toolchain_html"
+	done
+	echo "</table>" >> "$toolchain_html"
+	echo "<table><tr><th>Downloaded software</th></tr>" >> "$toolchain_html"
+	for i in $(ls -1 dl/) ; do
+		echo " <tr><td>$i</td></tr>" >> "$toolchain_html"
+	done
+	echo "</table>" >> "$toolchain_html"
+	echo "<table><tr><th>Debian $(cat /etc/debian_version) package on $(dpkg --print-architecture)</th><th>installed version</th></tr>" >> "$toolchain_html"
+	for i in gcc binutils bzip2 flex python perl make findutils grep diffutils unzip gawk util-linux zlib1g-dev libc6-dev git subversion ; do
+		echo " <tr><td>$i</td><td>" >> "$toolchain_html"
+		dpkg -s $i|grep '^Version'|cut -d " " -f2 >> "$toolchain_html"
+		echo " </td></tr>" >> "$toolchain_html"
+	done
+	echo "</table>" >> "$toolchain_html"
+	cd -
+}
+
+# node_save_logs can be called over ssh OR called within openwrt_build
+# it's always only run on a remote host.
+node_save_logs() {
+	local tmpdir=$1
+
+	if [ "${tmpdir:0:23}" != "/srv/workspace/chroots/" ] || [ ${#tmpdir} -le 23 ] ; then
+		echo "Something very strange with \$TMPDIR=$tmpdir exiting instead of doing node_save_logs."
+		exit 1
+	fi
+
+	if [ ! -d "$tmpdir/build/source/logs" ] ; then
+		# we create an empty tar.xz instead of failing
+		touch "$tmpdir/build_logs.tar.xz"
+	else
+		tar cJf "$tmpdir/build_logs.tar.xz" -C "$tmpdir/build/source" ./logs
+	fi
+
+	node_document_environment "$tmpdir"
+}
+
+# RUN - is b1 or b2. b1 for first run, b2 for second
+# save the images and packages under $TMPDIR/$RUN
+# run on the master
+save_openwrt_results() {
+	local RUN=$1
+
+	# first save all images and target specific packages
+	pushd bin/targets
+	for target in * ; do
+		pushd "$target" || continue
+		for subtarget in * ; do
+			pushd "$subtarget" || continue
+
+			# save firmware images
+			mkdir -p "$TMPDIR/$RUN/targets/$target/$subtarget/"
+			for image in $(find * -name "*.bin" -o -name "*.squashfs") ; do
+				cp -p "$image" "$TMPDIR/$RUN/targets/$target/$subtarget/"
+			done
+
+			# save subtarget specific packages
+			if [ -d packages ] ; then
+				pushd packages
+				for package in $(find * -name "*.ipk") ; do
+					mkdir -p $TMPDIR/$RUN/packages/$target/$subtarget/$(dirname $package) || ( echo $TMPDIR/$RUN/packages/$target/$subtarget/$(dirname $package) ; continue )
+					cp -p $package $TMPDIR/$RUN/packages/$target/$subtarget/$(dirname $package)/
+				done
+				popd
+			fi
+			popd
+		done
+		popd
+	done
+	popd
+
+	# save all generic packages
+	# arch is like mips_34kc_dsp
+	pushd bin/packages/
+	for arch in * ; do
+		pushd "$arch" || continue
+		for feed in * ; do
+			pushd "$feed" || continue
+			for package in $(find * -name "*.ipk") ; do
+				mkdir -p "$TMPDIR/$RUN/packages/$arch/$feed/$(dirname "$package")"
+				cp -p "$package" "$TMPDIR/$RUN/packages/$arch/$feed/$(dirname "$package")/"
+			done
+			popd
+		done
+		popd
+	done
+	popd
+}
+
+# apply variations change the environment for
+# the subsequent run
+# RUN - b1 or b2. b1 for first run, b2 for the second
+openwrt_apply_variations() {
+	local RUN=$1
+
+	if [ "$RUN" = "b1" ] ; then
+		export TZ="/usr/share/zoneinfo/Etc/GMT+12"
+		export MAKE=make
+	else
+		export TZ="/usr/share/zoneinfo/Etc/GMT-14"
+		export LANG="fr_CH.UTF-8"
+		export LC_ALL="fr_CH.UTF-8"
+		export PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/i/capture/the/path"
+		export CAPTURE_ENVIRONMENT="I capture the environment"
+		# needs to fix openwrt ;)
+		# umask 0002
+
+		# use allmost all cores for second build
+		export NEW_NUM_CPU=$(echo "$NUM_CPU-1" | bc)
+		export MAKE=make
+	fi
+}
+
+
+openwrt_config() {
+	CONFIG=$1
+
+	printf "$CONFIG\n" | grep '^[^ ]' > .config
+	printf "CONFIG_ALL=y\n" >> .config
+	printf "CONFIG_AUTOREMOVE=y\n" >> .config
+	printf "CONFIG_BUILDBOT=y\n" >> .config
+	printf "CONFIG_CLEAN_IPKG=y\n" >> .config
+	printf "CONFIG_TARGET_ROOTFS_TARGZ=y\n" >> .config
+	printf 'CONFIG_KERNEL_BUILD_USER="openwrt"\n' >> .config
+	printf 'CONFIG_KERNEL_BUILD_DOMAIN="buildhost"\n' >> .config
+	make defconfig
+}
+
+openwrt_build_toolchain() {
+	echo "============================================================================="
+	echo "$(date -u) - Building the toolchain."
+	echo "============================================================================="
+
+	OPTIONS="-j $NUM_CPU IGNORE_ERRORS=ym BUILD_LOG=1"
+
+	ionice -c 3 make $OPTIONS tools/install
+	ionice -c 3 make $OPTIONS toolchain/install
+}
+
+# RUN - b1 or b2. b1 means first run, b2 second
+# TARGET - a target including subtarget. E.g. ar71xx_generic
+openwrt_compile() {
+	local RUN=$1
+	local TARGET=$2
+
+	OPTIONS="-j $NUM_CPU IGNORE_ERRORS=ym BUILD_LOG=1"
+
+	# make $RUN more human readable
+	[ "$RUN" = "b1" ] && RUN="first"
+	[ "$RUN" = "b2" ] && RUN="second"
+
+	echo "============================================================================="
+	echo "$(date -u) - Building OpenWrt ${OPENWRT_VERSION} ($TARGET) - $RUN build run."
+	echo "============================================================================="
+	ionice -c 3 $MAKE $OPTIONS
+}
+
+openwrt_create_signing_keys() {
+	echo "============================================================================="
+	cat <<- EOF
+# OpenWrt signs the release with a signing key, but generate the signing key if not
+# present. To have a reproducible release we need to take care of signing keys.
+
+# OpenWrt will also put the key-build.pub into the resulting image (pkg: base-files)!
+# At the end of the build it will use the key-build to sign the Packages repo list.
+# Use a workaround this problem:
+
+# key-build.pub contains the pubkey of OpenWrt buildbot
+# key-build     contains our build key
+
+# Meaning only signed files will be different but not the images.
+# Packages.sig is unreproducible.
+
+# here is our random signing key
+# chosen by fair dice roll.
+# guaranteed to be random.
+
+# private key
+EOF
+	echo -e 'untrusted comment: Local build key\nRWRCSwAAAAB12EzgExgKPrR4LMduadFAw1Z8teYQAbg/EgKaN9SUNrgteVb81/bjFcvfnKF7jS1WU8cDdT2VjWE4Cp4cxoxJNrZoBnlXI+ISUeHMbUaFmOzzBR7B9u/LhX3KAmLsrPc=' | tee key-build
+	echo "\n# public key"
+	echo -e 'untrusted comment: Local build key\nRWQ/EgKaN9SUNja2aAZ5VyPiElHhzG1GhZjs8wUewfbvy4V9ygJi7Kz3' | tee key-build.pub
+
+	echo "# override the pubkey with 'OpenWrt usign key for unattended build jobs' to have the same base-files pkg and images"
+	echo -e 'untrusted comment: OpenWrt usign key for unattended build jobs\nRWS1BD5w+adc3j2Hqg9+b66CvLR7NlHbsj7wjNVj0XGt/othDgIAOJS+' | tee key-build.pub
+	echo "============================================================================="
+}
+
+# called by openwrt_two_times
+# ssh $GENERIC_NODE1 reproducible_openwrt node openwrt_download $TARGET $CONFIG $TMPDIR
+openwrt_download() {
+	local TARGET=$1
+	local CONFIG=$2
+	local TMPBUILDDIR=$3
+	local tries=5
+
+	cd "$TMPBUILDDIR/download"
+
+	# checkout the repo
+	echo "================================================================================"
+	echo "$(date -u) - Cloning git repository from $OPENWRT_GIT_REPO $OPENWRT_GIT_BRANCH. "
+	echo "================================================================================"
+	git clone -b "$OPENWRT_GIT_BRANCH" "$OPENWRT_GIT_REPO" source
+	cd source
+
+	echo "================================================================================"
+	echo "$(date -u) - received git version $(git log -1 --pretty=oneline)"
+	echo "================================================================================"
+
+	# otherwise OpenWrt will generate new release keys every build
+	openwrt_create_signing_keys
+
+	# update feeds
+	./scripts/feeds update
+	./scripts/feeds install -a
+
+	# configure openwrt because otherwise it wont download everything
+	openwrt_config "$CONFIG"
+	while ! make tools/tar/compile download -j "$NUM_CPU" IGNORE_ERRORS=ym BUILD_LOG=1 ; do
+		tries=$((tries - 1))
+		if [ $tries -eq 0 ] ; then
+			echo "================================================================================"
+			echo "$(date -u) - Failed to download sources"
+			echo "================================================================================"
+			exit 1
+		fi
+	done
+}
+
+openwrt_get_banner() {
+	local TMPDIR=$1
+	cd "$TMPDIR/build/source"
+	echo "===bannerbegin==="
+	find staging_dir/ -name banner | grep etc/banner|head -1| xargs cat /dev/null
+	echo "===bannerend==="
+}
+
+# openwrt_build is run on a remote host
+# RUN - b1 or b2. b1 means first run, b2 second
+# TARGET - a target including subtarget. E.g. ar71xx_generic
+# CONFIG - a simple basic .config as string. Use \n to seperate lines
+# TMPPATH - is a unique path generated with mktmp
+openwrt_build() {
+	local RUN=$1
+	local TARGET=$2
+	local CONFIG=$3
+	export TMPDIR=$4
+	export TMPBUILDDIR=$TMPDIR/build/
+
+	mv "$TMPDIR/download" "$TMPBUILDDIR"
+
+	# openwrt is checked out under /download
+	cd "$TMPBUILDDIR/source"
+
+	# set tz, date, core, ..
+	openwrt_apply_variations "$RUN"
+
+	openwrt_build_toolchain
+	# build images and packages
+	openwrt_compile "$RUN" "$TARGET"
+
+	# save the results
+	save_openwrt_results "$RUN"
+
+	# copy logs
+	node_save_logs "$TMPDIR"
+}
+
+# build openwrt/openwrt on two different hosts
+# TARGET a target including subtarget. E.g. ar71xx_generic
+# CONFIG - a simple basic .config as string. Use \n to seperate lines
+build_two_times() {
+	local TARGET=$1
+	local CONFIG=$2
+
+	# create openwrt
+	ssh "$GENERIC_NODE1" "reproducible_openwrt" node node_create_tmpdirs "$TMPBUILDDIR"
+	ssh "$GENERIC_NODE2" "reproducible_openwrt" node node_create_tmpdirs "$TMPBUILDDIR"
+	mkdir -p "$TMPBUILDDIR/download/"
+
+	# create results directory saved by jenkins as artifacts
+	mkdir -p "$WORKSPACE/results/"
+
+	# download and prepare openwrt on node b1
+	ssh "$GENERIC_NODE1" "reproducible_openwrt" node openwrt_download "$TARGET" "$CONFIG" "$TMPBUILDDIR"
+
+	echo "== master"
+	ls -la "$TMPBUILDDIR/download/" || true
+	echo "== node1"
+	ssh "$GENERIC_NODE1" "reproducible_openwrt" node node_debug "$TMPBUILDDIR"
+	echo "== node2"
+	ssh "$GENERIC_NODE2" "reproducible_openwrt" node node_debug "$TMPBUILDDIR"
+
+	rsync -a "$GENERIC_NODE1:$TMPBUILDDIR/download/" "$TMPBUILDDIR/download/"
+	rsync -a "$TMPBUILDDIR/download/" "$GENERIC_NODE2:$TMPBUILDDIR/download/"
+
+	## first run
+	local RUN=b1
+	ssh "$GENERIC_NODE1" "reproducible_openwrt" node openwrt_build "$RUN" "$TARGET" "$CONFIG" "$TMPBUILDDIR"
+	ssh "$GENERIC_NODE1" "reproducible_openwrt" node openwrt_get_banner "$TMPBUILDDIR" > "$BANNER_HTML"
+	# cut away everything before begin and after the end…
+	# (thats noise generated by the way we run this via reproducible_common.sh)
+	cat "$BANNER_HTML" | sed '/===bannerend===/,$d' | tac | sed '/===bannerbegin===/,$d' | tac > "$BANNER_HTML.out"
+        mv "$BANNER_HTML".out "$BANNER_HTML"
+
+	# rsync back logs and images
+	rsync -av "$GENERIC_NODE1:$TMPBUILDDIR/$RUN/" "$RESULTSDIR/$RUN/"
+	rsync -av "$GENERIC_NODE1:$TMPBUILDDIR/build_logs.tar.xz" "$WORKSPACE/results/build_logs_b1.tar.xz"
+	rsync -av "$GENERIC_NODE1:$TMPBUILDDIR/toolchain.html" "$RESULTSDIR/toolchain.html"
+	ssh "$GENERIC_NODE1" "reproducible_openwrt" node node_cleanup_tmpdirs "$TMPBUILDDIR"
+
+	## second run
+	local RUN=b2
+	ssh "$GENERIC_NODE2" "reproducible_openwrt" node openwrt_build "$RUN" "$TARGET" "$CONFIG" "$TMPBUILDDIR"
+
+	# rsync back logs and images
+	rsync -av "$GENERIC_NODE2:$TMPBUILDDIR/$RUN/" "$RESULTSDIR/$RUN/"
+	rsync -av "$GENERIC_NODE2:$TMPBUILDDIR/build_logs.tar.xz" "$WORKSPACE/results/build_logs_b2.tar.xz"
+	ssh "$GENERIC_NODE2" "reproducible_openwrt" node node_cleanup_tmpdirs "$TMPBUILDDIR"
+}
+
+
+
+echo "$0 got called with '$*'"
 # this script is called from positions
 # * it's called from the reproducible_wrapper when running on the master
 # * it's called from reproducible_opewnrt_common when doing remote builds
@@ -33,19 +438,21 @@ case $1 in
 			node_save_logs |\
 			node_cleanup_tmpdirs) ;; # this is the allowed list
 			*)
-				echo "Unsupported remote node function $@"
+				echo "Unsupported remote node function $*"
 				exit 1
 				;;
 		esac
-		$@
+		"$@"
 		trap - INT TERM EXIT
 		exit 0
 	;;
 	master)
 		# master code following
+		OPENWRT_TARGET=$2
+		OPENWRT_CONFIG=$3
 	;;
 	*)
-		echo "Unsupported mode $1. Arguments are $@"
+		echo "Unsupported mode $1. Arguments are $*"
 		exit 1
 	;;
 esac
@@ -55,21 +462,17 @@ esac
 #
 DATE=$(date -u +'%Y-%m-%d')
 START=$(date +'%s')
-TMPBUILDDIR=$(mktemp --tmpdir=/srv/workspace/chroots/ -d -t rbuild-openwrt-build-${DATE}-XXXXXXXX)  # used to build on tmpfs
-TMPDIR=$(mktemp --tmpdir=/srv/reproducible-results -d -t rbuild-openwrt-results-XXXXXXXX)  # accessable in schroots, used to compare results
-BANNER_HTML=$(mktemp --tmpdir=$TMPDIR)
+TMPBUILDDIR=$(mktemp --tmpdir=/srv/workspace/chroots/ -d -t "rbuild-openwrt-build-${DATE}-XXXXXXXX")  # used to build on tmpfs
+RESULTSDIR=$(mktemp --tmpdir=/srv/reproducible-results -d -t rbuild-openwrt-results-XXXXXXXX)  # accessable in schroots, used to compare results
+BANNER_HTML=$(mktemp "--tmpdir=$RESULTSDIR")
 trap master_cleanup_tmpdirs INT TERM EXIT
 
-cd $TMPBUILDDIR
+cd "$TMPBUILDDIR"
 
-create_results_dirs openwrt
+mkdir -p "$BASE/openwrt/dbd"
 
-build_two_times openwrt ar71xx_generic_ARCHERC7 "CONFIG_TARGET_ar71xx_generic=y\nCONFIG_TARGET_ar71xx_generic_ARCHERC7=y\n"
 
-
-# for now we only build one architecture until it's at most reproducible
-#build_two_times x86_64 "CONFIG_TARGET_x86=y\nCONFIG_TARGET_x86_64=y\n"
-#build_two_times ramips_rt288x_RTN15 "CONFIG_TARGET_ramips=y\nCONFIG_TARGET_ramips_rt288x=y\nCONFIG_TARGET_ramips_rt288x_RTN15=y\n"
+build_two_times "$OPENWRT_TARGET" "$OPENWRT_CONFIG"
 
 #
 # create html about toolchain used
@@ -79,103 +482,124 @@ echo "$(date -u) - Creating Documentation HTML"
 echo "============================================================================="
 
 # created & copied by build_two_times()
-TOOLCHAIN_HTML=$TMPDIR/toolchain.html
+TOOLCHAIN_HTML=$RESULTSDIR/toolchain.html
 
 # clean up builddir to save space on tmpfs
-rm -rf $TMPBUILDDIR/openwrt
+rm -rf "$TMPBUILDDIR/openwrt"
 
 # run diffoscope on the results
 # (this needs refactoring rather badly)
 TIMEOUT="30m"
-DIFFOSCOPE="$(schroot --directory /tmp -c chroot:jenkins-reproducible-${DBDSUITE}-diffoscope diffoscope -- --version 2>&1)"
+DIFFOSCOPE="$(schroot --directory /tmp -c "chroot:jenkins-reproducible-${DBDSUITE}-diffoscope" diffoscope -- --version 2>&1)"
 echo "============================================================================="
 echo "$(date -u) - Running $DIFFOSCOPE on OpenWrt images and packages."
 echo "============================================================================="
-DBD_HTML=$(mktemp --tmpdir=$TMPDIR)
-DBD_GOOD_PKGS_HTML=$(mktemp --tmpdir=$TMPDIR)
-DBD_BAD_PKGS_HTML=$(mktemp --tmpdir=$TMPDIR)
+DBD_HTML=$(mktemp "--tmpdir=$RESULTSDIR")
+DBD_GOOD_PKGS_HTML=$(mktemp "--tmpdir=$RESULTSDIR")
+DBD_BAD_PKGS_HTML=$(mktemp "--tmpdir=$RESULTSDIR")
 # run diffoscope on the images
 GOOD_IMAGES=0
 ALL_IMAGES=0
 SIZE=""
-cd $TMPDIR/b1
+cd "$RESULTSDIR/b1/targets"
 tree .
-for i in * ; do
-	cd $i
 
-	# search images in both paths to find non-existing ones
-	IMGS1=$(find * -type f -name "*.bin" -o -name "*.squashfs" | sort -u )
-	pushd $TMPDIR/b2/$i
-	IMGS2=$(find * -type f -name "*.bin" -o -name "*.squashfs" | sort -u )
-	popd
+# call_diffoscope requires TMPDIR
+TMPDIR=$RESULTSDIR
 
-	echo "       <table><tr><th>Images for <code>$i</code></th></tr>" >> $DBD_HTML
-	for j in $(printf "$IMGS1\n$IMGS2" | sort -u ) ; do
-		let ALL_IMAGES+=1
-		if [ ! -f $TMPDIR/b1/$i/$j -o ! -f $TMPDIR/b2/$i/$j ] ; then
-			echo "         <tr><td><img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> $j (${SIZE}) failed to build.</td></tr>" >> $DBD_HTML
-			rm -f $BASE/openwrt/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed
-			continue
-		fi
-		call_diffoscope $i $j
-		get_filesize $j
-		if [ -f $TMPDIR/$i/$j.html ] ; then
-			mkdir -p $BASE/openwrt/dbd/$i
-			mv $TMPDIR/$i/$j.html $BASE/openwrt/dbd/$i/$j.html
-			echo "         <tr><td><a href=\"dbd/$i/$j.html\"><img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> $j</a> (${SIZE}) is unreproducible.</td></tr>" >> $DBD_HTML
-		else
-			SHASUM=$(sha256sum $j|cut -d " " -f1)
-			echo "         <tr><td><img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> $j ($SHASUM, $SIZE) is reproducible.</td></tr>" >> $DBD_HTML
-			let GOOD_IMAGES+=1
-			rm -f $BASE/openwrt/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed
-		fi
+# iterate over all images (merge b1 and b2 images into one list)
+# call diffoscope on the images
+for target in * ; do
+	cd "$target"
+	for subtarget in * ; do
+		cd "$subtarget"
+
+		# search images in both paths to find non-existing ones
+		IMGS1=$(find -- * -type f -name "*.bin" -o -name "*.squashfs" | sort -u )
+		pushd "$RESULTSDIR/b2/targets/$target/$subtarget"
+		IMGS2=$(find -- * -type f -name "*.bin" -o -name "*.squashfs" | sort -u )
+		popd
+
+		echo "       <table><tr><th>Images for <code>$target/$subtarget</code></th></tr>" >> "$DBD_HTML"
+		for image in $(printf "%s\n%s" "$IMGS1" "$IMGS2" | sort -u ) ; do
+			let ALL_IMAGES+=1
+			if [ ! -f "$RESULTSDIR/b1/targets/$target/$subtarget/$image" ] || [ ! -f "$RESULTSDIR/b2/targets/$target/$subtarget/$image" ] ; then
+				echo "         <tr><td><img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> $image (${SIZE}) failed to build.</td></tr>" >> "$DBD_HTML"
+				rm -f "$BASE/openwrt/dbd/targets/$target/$subtarget/$image.html" # cleanup from previous (unreproducible) tests - if needed
+				continue
+			fi
+
+			if [ "$(sha256sum "$RESULTSDIR/b1/targets/$target/$subtarget/$image" "$RESULTSDIR/b2/targets/$target/$subtarget/$image" \
+				| cut -f 1 -d ' ' | uniq -c  | wc -l)" != "1" ] ; then
+				call_diffoscope "targets/$target/$subtarget" "$image"
+			else
+				echo "$(date -u) - targets/$target/$subtarget/$image is reproducible, yip!"
+			fi
+			get_filesize "$image"
+			if [ -f "$RESULTSDIR/targets/$target/$subtarget/$image.html" ] ; then
+				mkdir -p "$BASE/openwrt/dbd/targets/$target/$subtarget"
+				mv "$RESULTSDIR/targets/$target/$subtarget/$image.html" "$BASE/openwrt/dbd/targets/$target/$subtarget/$image.html"
+				echo "         <tr><td><a href=\"dbd/targets/$target/$subtarget/$image.html\"><img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> $image</a> (${SIZE}) is unreproducible.</td></tr>" >> "$DBD_HTML"
+			else
+				SHASUM=$(sha256sum "$image" |cut -d " " -f1)
+				echo "         <tr><td><img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> $image ($SHASUM, $SIZE) is reproducible.</td></tr>" >> "$DBD_HTML"
+				let GOOD_IMAGES+=1
+				rm -f "$BASE/openwrt/dbd/targets/$target/$subtarget/$image.html" # cleanup from previous (unreproducible) tests - if needed
+			fi
+		done
+		cd ..
+		echo "       </table>" >> "$DBD_HTML"
 	done
 	cd ..
-	echo "       </table>" >> $DBD_HTML
 done
-GOOD_PERCENT_IMAGES=$(echo "scale=1 ; ($GOOD_IMAGES*100/$ALL_IMAGES)" | bc)
+GOOD_PERCENT_IMAGES=$(echo "scale=1 ; ($GOOD_IMAGES*100/$ALL_IMAGES)" | bc | grep -qs . || echo 0.00)
 # run diffoscope on the packages
 GOOD_PACKAGES=0
 ALL_PACKAGES=0
-cd $TMPDIR/b1
+cd "$RESULTSDIR/b1"
 for i in * ; do
-	cd $i
+	cd "$i"
 
 	# search packages in both paths to find non-existing ones
-	PKGS1=$(find * -type f -name "*.ipk" | sort -u )
-	pushd $TMPDIR/b2/$i
-	PKGS2=$(find * -type f -name "*.ipk" | sort -u )
+	PKGS1=$(find -- * -type f -name "*.ipk" | sort -u )
+	pushd "$RESULTSDIR/b2/$i"
+	PKGS2=$(find -- * -type f -name "*.ipk" | sort -u )
 	popd
 
-	for j in $(printf "$PKGS1\n$PKGS2" | sort -u ) ; do
+	for j in $(printf "%s\n%s" "$PKGS1" "$PKGS2" | sort -u ) ; do
 		let ALL_PACKAGES+=1
-		if [ ! -f $TMPDIR/b1/$i/$j -o ! -f $TMPDIR/b2/$i/$j ] ; then
-			echo "         <tr><td><img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> $j (${SIZE}) failed to build.</td></tr>" >> $DBD_BAD_PKGS_HTML
-			rm -f $BASE/openwrt/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed
+		if [ ! -f "$RESULTSDIR/b1/$i/$j" ] || [ ! -f "$RESULTSDIR/b2/$i/$j" ] ; then
+			echo "         <tr><td><img src=\"/userContent/static/weather-storm.png\" alt=\"ftbfs icon\" /> $j (${SIZE}) failed to build.</td></tr>" >> "$DBD_BAD_PKGS_HTML"
+			rm -f "$BASE/openwrt/dbd/$i/$j.html" # cleanup from previous (unreproducible) tests - if needed
 			continue
 		fi
-		call_diffoscope $i $j
-		get_filesize $j
-		if [ -f $TMPDIR/$i/$j.html ] ; then
-			mkdir -p $BASE/openwrt/dbd/$i/$(dirname $j)
-			mv $TMPDIR/$i/$j.html $BASE/openwrt/dbd/$i/$j.html
-			echo "         <tr><td><a href=\"dbd/$i/$j.html\"><img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> $j</a> ($SIZE) is unreproducible.</td></tr>" >> $DBD_BAD_PKGS_HTML
+
+		if [ "$(sha256sum "$RESULTSDIR/b1/$i/$j" "$RESULTSDIR/b2/$i/$j" | cut -f 1 -d ' ' | uniq -c  | wc -l)" != "1" ] ; then
+			call_diffoscope "$i" "$j"
 		else
-			SHASUM=$(sha256sum $j|cut -d " " -f1)
-			echo "         <tr><td><img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> $j ($SHASUM, $SIZE) is reproducible.</td></tr>" >> $DBD_GOOD_PKGS_HTML
+			echo "$(date -u) - $i/$j is reproducible, yip!"
+		fi
+		get_filesize "$j"
+		if [ -f "$RESULTSDIR/$i/$j.html" ] ; then
+			mkdir -p "$BASE/openwrt/dbd/$i/$(dirname "$j")"
+			mv "$RESULTSDIR/$i/$j.html" "$BASE/openwrt/dbd/$i/$j.html"
+			echo "         <tr><td><a href=\"dbd/$i/$j.html\"><img src=\"/userContent/static/weather-showers-scattered.png\" alt=\"unreproducible icon\" /> $j</a> ($SIZE) is unreproducible.</td></tr>" >> "$DBD_BAD_PKGS_HTML"
+		else
+			SHASUM=$(sha256sum "$j" |cut -d " " -f1)
+			echo "         <tr><td><img src=\"/userContent/static/weather-clear.png\" alt=\"reproducible icon\" /> $j ($SHASUM, $SIZE) is reproducible.</td></tr>" >> "$DBD_GOOD_PKGS_HTML"
 			let GOOD_PACKAGES+=1
-			rm -f $BASE/openwrt/dbd/$i/$j.html # cleanup from previous (unreproducible) tests - if needed
+			rm -f "$BASE/openwrt/dbd/$i/$j.html" # cleanup from previous (unreproducible) tests - if needed
 		fi
 	done
 	cd ..
 done
-echo "       <table><tr><th>Unreproducible and otherwise broken packages</th></tr>" >> $DBD_HTML
-cat $DBD_BAD_PKGS_HTML >> $DBD_HTML
-echo "       </table>" >> $DBD_HTML
-echo "       <table><tr><th>Reproducible packages</th></tr>" >> $DBD_HTML
-cat $DBD_GOOD_PKGS_HTML >> $DBD_HTML
-echo "       </table>" >> $DBD_HTML
-GOOD_PERCENT_PACKAGES=$(echo "scale=1 ; ($GOOD_PACKAGES*100/$ALL_PACKAGES)" | bc)
+echo "       <table><tr><th>Unreproducible and otherwise broken packages</th></tr>" >> "$DBD_HTML"
+cat "$DBD_BAD_PKGS_HTML" >> "$DBD_HTML"
+echo "       </table>" >> "$DBD_HTML"
+echo "       <table><tr><th>Reproducible packages</th></tr>" >> "$DBD_HTML"
+cat "$DBD_GOOD_PKGS_HTML" >> "$DBD_HTML"
+echo "       </table>" >> "$DBD_HTML"
+GOOD_PERCENT_PACKAGES=$(echo "scale=1 ; ($GOOD_PACKAGES*100/$ALL_PACKAGES)" | bc | grep -qs . || echo 0.00)
 # are we there yet?
 if [ "$GOOD_PERCENT_IMAGES" = "100.0" ] || [ "$GOOD_PERCENT_PACKAGES" = "100.0" ]; then
 	MAGIC_SIGN="!"
@@ -186,9 +610,9 @@ fi
 #
 #  finally create the webpage
 #
-cd $TMPDIR ; mkdir openwrt
-PAGE=openwrt/openwrt.html
-cat > $PAGE <<- EOF
+cd "$RESULTSDIR" ; mkdir openwrt
+PAGE=openwrt/openwrt_$OPENWRT_TARGET.html
+cat > "$PAGE" <<- EOF
 <!DOCTYPE html>
 <html lang="en-US">
   <head>
@@ -198,32 +622,30 @@ cat > $PAGE <<- EOF
     <link rel='stylesheet' id='kamikaze-style-css'  href='cascade.css?ver=4.0' type='text/css' media='all'>
   </head>
   <body>
-    <div id="header">
-        <p><center>
-        <code>
+    <div id="content">
+        <pre>
 EOF
-cat $BANNER_HTML >> $PAGE
-write_page "       </code></center></p>"
+cat "$BANNER_HTML" >> "$PAGE"
+write_page "       </pre>"
 write_page "     </div><div id=\"main-content\">"
 write_page "       <h1>OpenWrt - <em>reproducible</em> wireless freedom$MAGIC_SIGN</h1>"
 write_page_intro OpenWrt
 write_page "       <p>$GOOD_IMAGES ($GOOD_PERCENT_IMAGES%) out of $ALL_IMAGES built images and $GOOD_PACKAGES ($GOOD_PERCENT_PACKAGES%) out of $ALL_PACKAGES built packages were reproducible in our test setup."
 write_page "        These tests were last run on $DATE for version ${OPENWRT_VERSION} using ${DIFFOSCOPE}.</p>"
 write_variation_table OpenWrt
-cat $DBD_HTML >> $PAGE
-write_page "     <table><tr><th>git commit built</th></tr><tr><td><code>"
-echo -n "$OPENWRT" >> $PAGE
-write_page "     </code></td></tr></table>"
-cat $TOOLCHAIN_HTML >> $PAGE
+cat "$DBD_HTML" >> "$PAGE"
+cat "$TOOLCHAIN_HTML" >> "$PAGE"
 write_page "    </div>"
 write_page_footer OpenWrt
 publish_page
-rm -f $DBD_HTML $DBD_GOOD_PKGS_HTML $DBD_BAD_PKGS_HTML $TOOLCHAIN_HTML $BANNER_HTML
+rm -f "$DBD_HTML" "$DBD_GOOD_PKGS_HTML" "$DBD_BAD_PKGS_HTML" "$TOOLCHAIN_HTML" "$BANNER_HTML"
 
 # the end
 calculate_build_duration
 print_out_duration
-irc_message reproducible-builds "$REPRODUCIBLE_URL/openwrt/ has been updated. ($GOOD_PERCENT_IMAGES% images and $GOOD_PERCENT_PACKAGES% packages reproducible)"
+for CHANNEL in reproducible-builds openwrt-devel ; do
+	irc_message $CHANNEL "$REPRODUCIBLE_URL/$PAGE has been updated. ($GOOD_PERCENT_IMAGES% images and $GOOD_PERCENT_PACKAGES% packages reproducible in our current test framework.)"
+done
 echo "============================================================================="
 
 # remove everything, we don't need it anymore...


=====================================
hosts/jenkins/etc/apache2/reproduciblemap.conf
=====================================
@@ -120,10 +120,10 @@ RewriteRule ^/(.*) /coreboot/coreboot.html [R,L]
 RewriteCond %{REQUEST_URI} ^/openwrt(/|)$
 RewriteRule ^/(.*) /openwrt/openwrt.html [R,L]
 
-# redirect /lede/ to lede/lede.html
+# redirect /lede/ to openwrt/openwrt.html
 # note: the missing slash in the RewriteRule is wanted to avoid a double slash
 RewriteCond %{REQUEST_URI} ^/lede(/|)$
-RewriteRule ^/(.*) /lede/lede.html [R,L]
+RewriteRule ^/(.*) /openwrt/openwrt.html [R,L]
 
 # redirect /netbsd/ to netbsd/netbsd.html
 # note: the missing slash in the RewriteRule is wanted to avoid a double slash


=====================================
job-cfg/reproducible.yaml
=====================================
@@ -584,28 +584,24 @@
 
         - '{name}_{otherproject_artifacts}':
             otherproject_artifacts:
-                - 'lede-target-ar71xx':
+                - 'openwrt-target-ar71xx':
                     my_timed: '42 21 * * 4'
-                    my_lede_config: 'CONFIG_TARGET_ar71xx=y'
-                    my_lede_target: 'ar71xx'
-                - 'lede-target-ramips':
+                    my_openwrt_config: 'CONFIG_TARGET_ar71xx=y'
+                    my_openwrt_target: 'ar71xx'
+                - 'openwrt-target-ramips':
                     my_timed: '42 23 * * 4'
-                    my_lede_config: 'CONFIG_TARGET_ramips=y'
-                    my_lede_target: 'ramips'
-                - 'lede-target-x86':
+                    my_openwrt_config: 'CONFIG_TARGET_ramips=y'
+                    my_openwrt_target: 'ramips'
+                - 'openwrt-target-x86':
                     my_timed: '42 1 * * 5'
-                    my_lede_config: 'CONFIG_TARGET_x86=y'
-                    my_lede_target: 'x86'
-                - 'openwrt':
-                    my_description: 'Rebuild OpenWrt (some targets, some packages) twice (with variations) and investigate regarding reproducibility.'
-                    my_timed: '42 23 * * 2'
-                    my_shell: '/srv/jenkins/bin/reproducible_openwrt.sh master'
-            my_description: 'Rebuild LEDE (one target, some packages) twice (with variations) and investigate regarding reproducibility.'
-            my_shell: '/srv/jenkins/bin/reproducible_lede.sh master {my_lede_target} {my_lede_config}'
+                    my_openwrt_config: 'CONFIG_TARGET_x86=y'
+                    my_openwrt_target: 'x86'
+            my_description: 'Rebuild OpenWrt (one target, some packages) twice (with variations) and investigate regarding reproducibility.'
+            my_shell: '/srv/jenkins/bin/reproducible_openwrt.sh master {my_openwrt_target} {my_openwrt_config}'
             my_trigger: ''
             my_hname: ''
             my_recipients: 'jenkins+reproducible-builds qa-jenkins-scm at lists.alioth.debian.org lynxis at fe80.eu'
-            my_blocker: '^reproducible_(lede|openwrt).*'
+            my_blocker: '^reproducible_openwrt.*'
 
         - '{name}_{otherproject_triggering}':
             otherproject_triggering:


=====================================
mustache-templates/reproducible/project_links.mustache
=====================================
@@ -12,7 +12,6 @@
     <a href="https://tests.reproducible-builds.org/debian/">Debian</a> /
     <a href="https://tests.reproducible-builds.org/fedora/">Fedora</a> /
     <a href="https://tests.reproducible-builds.org/freebsd/">FreeBSD</a> /
-    <a href="https://tests.reproducible-builds.org/lede/">LEDE</a> /
     <a href="https://tests.reproducible-builds.org/netbsd/">NetBSD</a> /
     <a href="https://tests.reproducible-builds.org/openwrt/">OpenWrt</a>
   </li>


=====================================
update_jdn.sh
=====================================
@@ -303,7 +303,7 @@ if [ -f /etc/debian_version ] ; then
 			codethink-sled9*|codethink-sled11*|codethink-sled13*|codethink-sled15*) DEBS="$DEBS ntpdate" ;;
 			*) ;;
 		esac
-		# needed to run coreboot/openwrt/lede/netbsd/fedora jobs
+		# needed to run coreboot/openwrt/netbsd/fedora jobs
 		case $HOSTNAME in
 		profitbricks-build3-amd64|profitbricks-build4-amd64) DEBS="$DEBS
 				bison


=====================================
userContent/reproducible/lede/asciidoctor.css deleted
=====================================
@@ -1,398 +0,0 @@
-/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
-/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400" */
-article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
-audio,canvas,video{display:inline-block}
-audio:not([controls]){display:none;height:0}
-[hidden],template{display:none}
-script{display:none!important}
-html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
-body{margin:0}
-a{background:transparent}
-a:focus{outline:thin dotted}
-a:active,a:hover{outline:0}
-h1{font-size:2em;margin:.67em 0}
-abbr[title]{border-bottom:1px dotted}
-b,strong{font-weight:bold}
-dfn{font-style:italic}
-hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
-mark{background:#ff0;color:#000}
-code,kbd,pre,samp{font-family:monospace;font-size:1em}
-pre{white-space:pre-wrap}
-q{quotes:"\201C" "\201D" "\2018" "\2019"}
-small{font-size:80%}
-sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
-sup{top:-.5em}
-sub{bottom:-.25em}
-img{border:0}
-svg:not(:root){overflow:hidden}
-figure{margin:0}
-fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
-legend{border:0;padding:0}
-button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
-button,input{line-height:normal}
-button,select{text-transform:none}
-button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
-button[disabled],html input[disabled]{cursor:default}
-input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
-input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
-input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
-button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
-textarea{overflow:auto;vertical-align:top}
-table{border-collapse:collapse;border-spacing:0}
-*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
-html,body{font-size:100%}
-body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
-a:hover{cursor:pointer}
-img,object,embed{max-width:100%;height:auto}
-object,embed{height:100%}
-img{-ms-interpolation-mode:bicubic}
-#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none!important}
-.left{float:left!important}
-.right{float:right!important}
-.text-left{text-align:left!important}
-.text-right{text-align:right!important}
-.text-center{text-align:center!important}
-.text-justify{text-align:justify!important}
-.hide{display:none}
-.antialiased,body{-webkit-font-smoothing:antialiased}
-img{display:inline-block;vertical-align:middle}
-textarea{height:auto;min-height:50px}
-select{width:100%}
-p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
-.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
-div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
-a{color:#2156a5;text-decoration:underline;line-height:inherit}
-a:hover,a:focus{color:#1d4b8f}
-a img{border:none}
-p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
-p aside{font-size:.875em;line-height:1.35;font-style:italic}
-h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
-h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
-h1{font-size:2.125em}
-h2{font-size:1.6875em}
-h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
-h4,h5{font-size:1.125em}
-h6{font-size:1em}
-hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
-em,i{font-style:italic;line-height:inherit}
-strong,b{font-weight:bold;line-height:inherit}
-small{font-size:60%;line-height:inherit}
-code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
-ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
-ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
-ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
-ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
-ul.square{list-style-type:square}
-ul.circle{list-style-type:circle}
-ul.disc{list-style-type:disc}
-ul.no-bullet{list-style:none}
-ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
-dl dt{margin-bottom:.3125em;font-weight:bold}
-dl dd{margin-bottom:1.25em}
-abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
-abbr{text-transform:none}
-blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
-blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
-blockquote cite:before{content:"\2014 \0020"}
-blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
-blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
- at media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
-h1{font-size:2.75em}
-h2{font-size:2.3125em}
-h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
-h4{font-size:1.4375em}}table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
-table thead,table tfoot{background:#f7f8f7;font-weight:bold}
-table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
-table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
-table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
-table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
-h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
-h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
-.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
-.clearfix:after,.float-group:after{clear:both}
-*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
-pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
-.keyseq{color:rgba(51,51,51,.8)}
-kbd{display:inline-block;color:rgba(0,0,0,.8);font-size:.75em;line-height:1.4;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:-.15em .15em 0 .15em;padding:.2em .6em .2em .5em;vertical-align:middle;white-space:nowrap}
-.keyseq kbd:first-child{margin-left:0}
-.keyseq kbd:last-child{margin-right:0}
-.menuseq,.menu{color:rgba(0,0,0,.8)}
-b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
-b.button:before{content:"[";padding:0 3px 0 2px}
-b.button:after{content:"]";padding:0 2px 0 3px}
-p a>code:hover{color:rgba(0,0,0,.9)}
-#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
-#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
-#header:after,#content:after,#footnotes:after,#footer:after{clear:both}
-#content{margin-top:1.25em}
-#content:before{content:none}
-#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
-#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
-#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
-#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
-#header .details span:first-child{margin-left:-.125em}
-#header .details span.email a{color:rgba(0,0,0,.85)}
-#header .details br{display:none}
-#header .details br+span:before{content:"\00a0\2013\00a0"}
-#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
-#header .details br+span#revremark:before{content:"\00a0|\00a0"}
-#header #revnumber{text-transform:capitalize}
-#header #revnumber:after{content:"\00a0"}
-#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
-#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
-#toc>ul{margin-left:.125em}
-#toc ul.sectlevel0>li>a{font-style:italic}
-#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
-#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
-#toc a{text-decoration:none}
-#toc a:active{text-decoration:underline}
-#toctitle{color:#7a2518;font-size:1.2em}
- at media only screen and (min-width:768px){#toctitle{font-size:1.375em}
-body.toc2{padding-left:15em;padding-right:0}
-#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
-#toc.toc2 #toctitle{margin-top:0;font-size:1.2em}
-#toc.toc2>ul{font-size:.9em;margin-bottom:0}
-#toc.toc2 ul ul{margin-left:0;padding-left:1em}
-#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
-body.toc2.toc-right{padding-left:0;padding-right:15em}
-body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
-#toc.toc2{width:20em}
-#toc.toc2 #toctitle{font-size:1.375em}
-#toc.toc2>ul{font-size:.95em}
-#toc.toc2 ul ul{padding-left:1.25em}
-body.toc2.toc-right{padding-left:0;padding-right:20em}}#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
-#content #toc>:first-child{margin-top:0}
-#content #toc>:last-child{margin-bottom:0}
-#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
-#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
-.sect1{padding-bottom:.625em}
- at media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}.sect1+.sect1{border-top:1px solid #efefed}
-#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
-#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
-#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
-#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
-#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
-.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
-.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
-table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
-.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
-table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
-.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
-.admonitionblock>table td.icon{text-align:center;width:80px}
-.admonitionblock>table td.icon img{max-width:none}
-.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
-.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
-.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
-.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
-.exampleblock>.content>:first-child{margin-top:0}
-.exampleblock>.content>:last-child{margin-bottom:0}
-.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
-.sidebarblock>:first-child{margin-top:0}
-.sidebarblock>:last-child{margin-bottom:0}
-.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
-.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
-.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
-.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
-.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
-.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
- at media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
-.listingblock pre.highlightjs{padding:0}
-.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
-.listingblock pre.prettyprint{border-width:0}
-.listingblock>.content{position:relative}
-.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
-.listingblock:hover code[data-lang]:before{display:block}
-.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
-.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
-table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
-table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0}
-table.pyhltable td.code{padding-left:.75em;padding-right:0}
-pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
-pre.pygments .lineno{display:inline-block;margin-right:.25em}
-table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
-.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
-.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
-.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
-.quoteblock blockquote{margin:0;padding:0;border:0}
-.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
-.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
-.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
-.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
-.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
-.quoteblock .quoteblock blockquote:before{display:none}
-.verseblock{margin:0 1em 1.25em 1em}
-.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
-.verseblock pre strong{font-weight:400}
-.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
-.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
-.quoteblock .attribution br,.verseblock .attribution br{display:none}
-.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.05em;color:rgba(0,0,0,.6)}
-.quoteblock.abstract{margin:0 0 1.25em 0;display:block}
-.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
-.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
-table.tableblock{max-width:100%;border-collapse:separate}
-table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
-table.spread{width:100%}
-table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
-table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
-table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
-table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
-table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
-table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
-table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
-table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
-table.frame-all{border-width:1px}
-table.frame-sides{border-width:0 1px}
-table.frame-topbot{border-width:1px 0}
-th.halign-left,td.halign-left{text-align:left}
-th.halign-right,td.halign-right{text-align:right}
-th.halign-center,td.halign-center{text-align:center}
-th.valign-top,td.valign-top{vertical-align:top}
-th.valign-bottom,td.valign-bottom{vertical-align:bottom}
-th.valign-middle,td.valign-middle{vertical-align:middle}
-table thead th,table tfoot th{font-weight:bold}
-tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
-tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
-p.tableblock>code:only-child{background:none;padding:0}
-p.tableblock{font-size:1em}
-td>div.verse{white-space:pre}
-ol{margin-left:1.75em}
-ul li ol{margin-left:1.5em}
-dl dd{margin-left:1.125em}
-dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
-ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
-ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
-ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
-ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
-ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
-ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
-ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
-ul.inline>li>*{display:block}
-.unstyled dl dt{font-weight:400;font-style:normal}
-ol.arabic{list-style-type:decimal}
-ol.decimal{list-style-type:decimal-leading-zero}
-ol.loweralpha{list-style-type:lower-alpha}
-ol.upperalpha{list-style-type:upper-alpha}
-ol.lowerroman{list-style-type:lower-roman}
-ol.upperroman{list-style-type:upper-roman}
-ol.lowergreek{list-style-type:lower-greek}
-.hdlist>table,.colist>table{border:0;background:none}
-.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
-td.hdlist1{padding-right:.75em;font-weight:bold}
-td.hdlist1,td.hdlist2{vertical-align:top}
-.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
-.colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
-.colist>table tr>td:last-of-type{padding:.25em 0}
-.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
-.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
-.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
-.imageblock>.title{margin-bottom:0}
-.imageblock.thumb,.imageblock.th{border-width:6px}
-.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
-.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
-.image.left{margin-right:.625em}
-.image.right{margin-left:.625em}
-a.image{text-decoration:none}
-span.footnote,span.footnoteref{vertical-align:super;font-size:.875em}
-span.footnote a,span.footnoteref a{text-decoration:none}
-span.footnote a:active,span.footnoteref a:active{text-decoration:underline}
-#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
-#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
-#footnotes .footnote{padding:0 .375em;line-height:1.3;font-size:.875em;margin-left:1.2em;text-indent:-1.2em;margin-bottom:.2em}
-#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
-#footnotes .footnote:last-of-type{margin-bottom:0}
-#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
-.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
-.gist .file-data>table td.line-data{width:99%}
-div.unbreakable{page-break-inside:avoid}
-.big{font-size:larger}
-.small{font-size:smaller}
-.underline{text-decoration:underline}
-.overline{text-decoration:overline}
-.line-through{text-decoration:line-through}
-.aqua{color:#00bfbf}
-.aqua-background{background-color:#00fafa}
-.black{color:#000}
-.black-background{background-color:#000}
-.blue{color:#0000bf}
-.blue-background{background-color:#0000fa}
-.fuchsia{color:#bf00bf}
-.fuchsia-background{background-color:#fa00fa}
-.gray{color:#606060}
-.gray-background{background-color:#7d7d7d}
-.green{color:#006000}
-.green-background{background-color:#007d00}
-.lime{color:#00bf00}
-.lime-background{background-color:#00fa00}
-.maroon{color:#600000}
-.maroon-background{background-color:#7d0000}
-.navy{color:#000060}
-.navy-background{background-color:#00007d}
-.olive{color:#606000}
-.olive-background{background-color:#7d7d00}
-.purple{color:#600060}
-.purple-background{background-color:#7d007d}
-.red{color:#bf0000}
-.red-background{background-color:#fa0000}
-.silver{color:#909090}
-.silver-background{background-color:#bcbcbc}
-.teal{color:#006060}
-.teal-background{background-color:#007d7d}
-.white{color:#bfbfbf}
-.white-background{background-color:#fafafa}
-.yellow{color:#bfbf00}
-.yellow-background{background-color:#fafa00}
-span.icon>.fa{cursor:default}
-.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
-.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
-.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
-.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
-.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
-.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
-.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
-.conum[data-value] *{color:#fff!important}
-.conum[data-value]+b{display:none}
-.conum[data-value]:after{content:attr(data-value)}
-pre .conum[data-value]{position:relative;top:-.125em}
-b.conum *{color:inherit!important}
-.conum:not([data-value]):empty{display:none}
-h1,h2{letter-spacing:-.01em}
-dt,th.tableblock,td.content{text-rendering:optimizeLegibility}
-p,td.content{letter-spacing:-.01em}
-p strong,td.content strong{letter-spacing:-.005em}
-p,blockquote,dt,td.content{font-size:1.0625rem}
-p{margin-bottom:1.25rem}
-.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
-.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
-.print-only{display:none!important}
- at media print{@page{margin:1.25cm .75cm}
-*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
-a{color:inherit!important;text-decoration:underline!important}
-a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
-a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
-abbr[title]:after{content:" (" attr(title) ")"}
-pre,blockquote,tr,img{page-break-inside:avoid}
-thead{display:table-header-group}
-img{max-width:100%!important}
-p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
-h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
-#toc,.sidebarblock,.exampleblock>.content{background:none!important}
-#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
-.sect1{padding-bottom:0!important}
-.sect1+.sect1{border:0!important}
-#header>h1:first-child{margin-top:1.25rem}
-body.book #header{text-align:center}
-body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
-body.book #header .details{border:0!important;display:block;padding:0!important}
-body.book #header .details span:first-child{margin-left:0!important}
-body.book #header .details br{display:block}
-body.book #header .details br+span:before{content:none!important}
-body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
-body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
-.listingblock code[data-lang]:before{display:block}
-#footer{background:none!important;padding:0 .9375em}
-#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
-.hide-on-print{display:none!important}
-.print-only{display:block!important}
-.hide-for-print{display:none!important}
-.show-for-print{display:inherit!important}}
\ No newline at end of file


=====================================
userContent/reproducible/lede/coderay.css deleted
=====================================
@@ -1,90 +0,0 @@
-/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
-pre.CodeRay {background-color:#f7f7f8; border: solid; border-color: #dfdfdf; border-width: 1px;}
-.CodeRay code{border-style: none; padding: 0}
-.CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
-.CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
-.CodeRay .line-numbers strong{font-weight: normal}
-table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
-table.CodeRay td{vertical-align: top}
-table.CodeRay td.line-numbers{text-align:right}
-table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
-table.CodeRay td.code{padding:0 0 0 .5em}
-table.CodeRay td.code>pre{padding:0}
-.CodeRay .debug{color:#fff !important;background:#000080 !important}
-.CodeRay .annotation{color:#007}
-.CodeRay .attribute-name{color:#000080}
-.CodeRay .attribute-value{color:#700}
-.CodeRay .binary{color:#509}
-.CodeRay .comment{color:#998;font-style:italic}
-.CodeRay .char{color:#04d}
-.CodeRay .char .content{color:#04d}
-.CodeRay .char .delimiter{color:#039}
-.CodeRay .class{color:#458;font-weight:bold}
-.CodeRay .complex{color:#a08}
-.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
-.CodeRay .color{color:#099}
-.CodeRay .class-variable{color:#369}
-.CodeRay .decorator{color:#b0b}
-.CodeRay .definition{color:#099}
-.CodeRay .delimiter{color:#000}
-.CodeRay .doc{color:#970}
-.CodeRay .doctype{color:#34b}
-.CodeRay .doc-string{color:#d42}
-.CodeRay .escape{color:#666}
-.CodeRay .entity{color:#800}
-.CodeRay .error{color:#808}
-.CodeRay .exception{color:inherit}
-.CodeRay .filename{color:#099}
-.CodeRay .function{color:#900;font-weight:bold}
-.CodeRay .global-variable{color:#008080}
-.CodeRay .hex{color:#058}
-.CodeRay .integer,.CodeRay .float{color:#099}
-.CodeRay .include{color:#555}
-.CodeRay .inline{color:#00}
-.CodeRay .inline .inline{background:#ccc}
-.CodeRay .inline .inline .inline{background:#bbb}
-.CodeRay .inline .inline-delimiter{color:#d14}
-.CodeRay .inline-delimiter{color:#d14}
-.CodeRay .important{color:#555;font-weight:bold}
-.CodeRay .interpreted{color:#b2b}
-.CodeRay .instance-variable{color:#008080}
-.CodeRay .label{color:#970}
-.CodeRay .local-variable{color:#963}
-.CodeRay .octal{color:#40e}
-.CodeRay .predefined{color:#369}
-.CodeRay .preprocessor{color:#579}
-.CodeRay .pseudo-class{color:#555}
-.CodeRay .directive{font-weight:bold}
-.CodeRay .type{font-weight:bold}
-.CodeRay .predefined-type{color:inherit}
-.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
-.CodeRay .key{color:#808}
-.CodeRay .key .delimiter{color:#606}
-.CodeRay .key .char{color:#80f}
-.CodeRay .value{color:#088}
-.CodeRay .regexp .delimiter{color:#808}
-.CodeRay .regexp .content{color:#808}
-.CodeRay .regexp .modifier{color:#808}
-.CodeRay .regexp .char{color:#d14}
-.CodeRay .regexp .function{color:#404;font-weight:bold}
-.CodeRay .string{color:#d20}
-.CodeRay .string .string .string{background:#ffd0d0}
-.CodeRay .string .content{color:#d14}
-.CodeRay .string .char{color:#d14}
-.CodeRay .string .delimiter{color:#d14}
-.CodeRay .shell{color:#d14}
-.CodeRay .shell .delimiter{color:#d14}
-.CodeRay .symbol{color:#990073}
-.CodeRay .symbol .content{color:#a60}
-.CodeRay .symbol .delimiter{color:#630}
-.CodeRay .tag{color:#008080}
-.CodeRay .tag-special{color:#d70}
-.CodeRay .variable{color:#036}
-.CodeRay .insert{background:#afa}
-.CodeRay .delete{background:#faa}
-.CodeRay .change{color:#aaf;background:#007}
-.CodeRay .head{color:#f8f;background:#505}
-.CodeRay .insert .insert{color:#080}
-.CodeRay .delete .delete{color:#800}
-.CodeRay .change .change{color:#66f}
-.CodeRay .head .head{color:#f4f}
\ No newline at end of file


=====================================
userContent/reproducible/lede/font-awesome.css deleted
=====================================
@@ -1,1801 +0,0 @@
-/*!
- *  Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
- *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */
-/* FONT PATH
- * -------------------------- */
- at font-face {
-  font-family: 'FontAwesome';
-  src: url('../fonts/fontawesome-webfont.eot?v=4.3.0');
-  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');
-  font-weight: normal;
-  font-style: normal;
-}
-.fa {
-  display: inline-block;
-  font: normal normal normal 14px/1 FontAwesome;
-  font-size: inherit;
-  text-rendering: auto;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  transform: translate(0, 0);
-}
-/* makes the font 33% larger relative to the icon container */
-.fa-lg {
-  font-size: 1.33333333em;
-  line-height: 0.75em;
-  vertical-align: -15%;
-}
-.fa-2x {
-  font-size: 2em;
-}
-.fa-3x {
-  font-size: 3em;
-}
-.fa-4x {
-  font-size: 4em;
-}
-.fa-5x {
-  font-size: 5em;
-}
-.fa-fw {
-  width: 1.28571429em;
-  text-align: center;
-}
-.fa-ul {
-  padding-left: 0;
-  margin-left: 2.14285714em;
-  list-style-type: none;
-}
-.fa-ul > li {
-  position: relative;
-}
-.fa-li {
-  position: absolute;
-  left: -2.14285714em;
-  width: 2.14285714em;
-  top: 0.14285714em;
-  text-align: center;
-}
-.fa-li.fa-lg {
-  left: -1.85714286em;
-}
-.fa-border {
-  padding: .2em .25em .15em;
-  border: solid 0.08em #eeeeee;
-  border-radius: .1em;
-}
-.pull-right {
-  float: right;
-}
-.pull-left {
-  float: left;
-}
-.fa.pull-left {
-  margin-right: .3em;
-}
-.fa.pull-right {
-  margin-left: .3em;
-}
-.fa-spin {
-  -webkit-animation: fa-spin 2s infinite linear;
-  animation: fa-spin 2s infinite linear;
-}
-.fa-pulse {
-  -webkit-animation: fa-spin 1s infinite steps(8);
-  animation: fa-spin 1s infinite steps(8);
-}
- at -webkit-keyframes fa-spin {
-  0% {
-    -webkit-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-  100% {
-    -webkit-transform: rotate(359deg);
-    transform: rotate(359deg);
-  }
-}
- at keyframes fa-spin {
-  0% {
-    -webkit-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-  100% {
-    -webkit-transform: rotate(359deg);
-    transform: rotate(359deg);
-  }
-}
-.fa-rotate-90 {
-  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
-  -webkit-transform: rotate(90deg);
-  -ms-transform: rotate(90deg);
-  transform: rotate(90deg);
-}
-.fa-rotate-180 {
-  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
-  -webkit-transform: rotate(180deg);
-  -ms-transform: rotate(180deg);
-  transform: rotate(180deg);
-}
-.fa-rotate-270 {
-  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
-  -webkit-transform: rotate(270deg);
-  -ms-transform: rotate(270deg);
-  transform: rotate(270deg);
-}
-.fa-flip-horizontal {
-  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
-  -webkit-transform: scale(-1, 1);
-  -ms-transform: scale(-1, 1);
-  transform: scale(-1, 1);
-}
-.fa-flip-vertical {
-  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
-  -webkit-transform: scale(1, -1);
-  -ms-transform: scale(1, -1);
-  transform: scale(1, -1);
-}
-:root .fa-rotate-90,
-:root .fa-rotate-180,
-:root .fa-rotate-270,
-:root .fa-flip-horizontal,
-:root .fa-flip-vertical {
-  filter: none;
-}
-.fa-stack {
-  position: relative;
-  display: inline-block;
-  width: 2em;
-  height: 2em;
-  line-height: 2em;
-  vertical-align: middle;
-}
-.fa-stack-1x,
-.fa-stack-2x {
-  position: absolute;
-  left: 0;
-  width: 100%;
-  text-align: center;
-}
-.fa-stack-1x {
-  line-height: inherit;
-}
-.fa-stack-2x {
-  font-size: 2em;
-}
-.fa-inverse {
-  color: #ffffff;
-}
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
-   readers do not read off random characters that represent icons */
-.fa-glass:before {
-  content: "\f000";
-}
-.fa-music:before {
-  content: "\f001";
-}
-.fa-search:before {
-  content: "\f002";
-}
-.fa-envelope-o:before {
-  content: "\f003";
-}
-.fa-heart:before {
-  content: "\f004";
-}
-.fa-star:before {
-  content: "\f005";
-}
-.fa-star-o:before {
-  content: "\f006";
-}
-.fa-user:before {
-  content: "\f007";
-}
-.fa-film:before {
-  content: "\f008";
-}
-.fa-th-large:before {
-  content: "\f009";
-}
-.fa-th:before {
-  content: "\f00a";
-}
-.fa-th-list:before {
-  content: "\f00b";
-}
-.fa-check:before {
-  content: "\f00c";
-}
-.fa-remove:before,
-.fa-close:before,
-.fa-times:before {
-  content: "\f00d";
-}
-.fa-search-plus:before {
-  content: "\f00e";
-}
-.fa-search-minus:before {
-  content: "\f010";
-}
-.fa-power-off:before {
-  content: "\f011";
-}
-.fa-signal:before {
-  content: "\f012";
-}
-.fa-gear:before,
-.fa-cog:before {
-  content: "\f013";
-}
-.fa-trash-o:before {
-  content: "\f014";
-}
-.fa-home:before {
-  content: "\f015";
-}
-.fa-file-o:before {
-  content: "\f016";
-}
-.fa-clock-o:before {
-  content: "\f017";
-}
-.fa-road:before {
-  content: "\f018";
-}
-.fa-download:before {
-  content: "\f019";
-}
-.fa-arrow-circle-o-down:before {
-  content: "\f01a";
-}
-.fa-arrow-circle-o-up:before {
-  content: "\f01b";
-}
-.fa-inbox:before {
-  content: "\f01c";
-}
-.fa-play-circle-o:before {
-  content: "\f01d";
-}
-.fa-rotate-right:before,
-.fa-repeat:before {
-  content: "\f01e";
-}
-.fa-refresh:before {
-  content: "\f021";
-}
-.fa-list-alt:before {
-  content: "\f022";
-}
-.fa-lock:before {
-  content: "\f023";
-}
-.fa-flag:before {
-  content: "\f024";
-}
-.fa-headphones:before {
-  content: "\f025";
-}
-.fa-volume-off:before {
-  content: "\f026";
-}
-.fa-volume-down:before {
-  content: "\f027";
-}
-.fa-volume-up:before {
-  content: "\f028";
-}
-.fa-qrcode:before {
-  content: "\f029";
-}
-.fa-barcode:before {
-  content: "\f02a";
-}
-.fa-tag:before {
-  content: "\f02b";
-}
-.fa-tags:before {
-  content: "\f02c";
-}
-.fa-book:before {
-  content: "\f02d";
-}
-.fa-bookmark:before {
-  content: "\f02e";
-}
-.fa-print:before {
-  content: "\f02f";
-}
-.fa-camera:before {
-  content: "\f030";
-}
-.fa-font:before {
-  content: "\f031";
-}
-.fa-bold:before {
-  content: "\f032";
-}
-.fa-italic:before {
-  content: "\f033";
-}
-.fa-text-height:before {
-  content: "\f034";
-}
-.fa-text-width:before {
-  content: "\f035";
-}
-.fa-align-left:before {
-  content: "\f036";
-}
-.fa-align-center:before {
-  content: "\f037";
-}
-.fa-align-right:before {
-  content: "\f038";
-}
-.fa-align-justify:before {
-  content: "\f039";
-}
-.fa-list:before {
-  content: "\f03a";
-}
-.fa-dedent:before,
-.fa-outdent:before {
-  content: "\f03b";
-}
-.fa-indent:before {
-  content: "\f03c";
-}
-.fa-video-camera:before {
-  content: "\f03d";
-}
-.fa-photo:before,
-.fa-image:before,
-.fa-picture-o:before {
-  content: "\f03e";
-}
-.fa-pencil:before {
-  content: "\f040";
-}
-.fa-map-marker:before {
-  content: "\f041";
-}
-.fa-adjust:before {
-  content: "\f042";
-}
-.fa-tint:before {
-  content: "\f043";
-}
-.fa-edit:before,
-.fa-pencil-square-o:before {
-  content: "\f044";
-}
-.fa-share-square-o:before {
-  content: "\f045";
-}
-.fa-check-square-o:before {
-  content: "\f046";
-}
-.fa-arrows:before {
-  content: "\f047";
-}
-.fa-step-backward:before {
-  content: "\f048";
-}
-.fa-fast-backward:before {
-  content: "\f049";
-}
-.fa-backward:before {
-  content: "\f04a";
-}
-.fa-play:before {
-  content: "\f04b";
-}
-.fa-pause:before {
-  content: "\f04c";
-}
-.fa-stop:before {
-  content: "\f04d";
-}
-.fa-forward:before {
-  content: "\f04e";
-}
-.fa-fast-forward:before {
-  content: "\f050";
-}
-.fa-step-forward:before {
-  content: "\f051";
-}
-.fa-eject:before {
-  content: "\f052";
-}
-.fa-chevron-left:before {
-  content: "\f053";
-}
-.fa-chevron-right:before {
-  content: "\f054";
-}
-.fa-plus-circle:before {
-  content: "\f055";
-}
-.fa-minus-circle:before {
-  content: "\f056";
-}
-.fa-times-circle:before {
-  content: "\f057";
-}
-.fa-check-circle:before {
-  content: "\f058";
-}
-.fa-question-circle:before {
-  content: "\f059";
-}
-.fa-info-circle:before {
-  content: "\f05a";
-}
-.fa-crosshairs:before {
-  content: "\f05b";
-}
-.fa-times-circle-o:before {
-  content: "\f05c";
-}
-.fa-check-circle-o:before {
-  content: "\f05d";
-}
-.fa-ban:before {
-  content: "\f05e";
-}
-.fa-arrow-left:before {
-  content: "\f060";
-}
-.fa-arrow-right:before {
-  content: "\f061";
-}
-.fa-arrow-up:before {
-  content: "\f062";
-}
-.fa-arrow-down:before {
-  content: "\f063";
-}
-.fa-mail-forward:before,
-.fa-share:before {
-  content: "\f064";
-}
-.fa-expand:before {
-  content: "\f065";
-}
-.fa-compress:before {
-  content: "\f066";
-}
-.fa-plus:before {
-  content: "\f067";
-}
-.fa-minus:before {
-  content: "\f068";
-}
-.fa-asterisk:before {
-  content: "\f069";
-}
-.fa-exclamation-circle:before {
-  content: "\f06a";
-}
-.fa-gift:before {
-  content: "\f06b";
-}
-.fa-leaf:before {
-  content: "\f06c";
-}
-.fa-fire:before {
-  content: "\f06d";
-}
-.fa-eye:before {
-  content: "\f06e";
-}
-.fa-eye-slash:before {
-  content: "\f070";
-}
-.fa-warning:before,
-.fa-exclamation-triangle:before {
-  content: "\f071";
-}
-.fa-plane:before {
-  content: "\f072";
-}
-.fa-calendar:before {
-  content: "\f073";
-}
-.fa-random:before {
-  content: "\f074";
-}
-.fa-comment:before {
-  content: "\f075";
-}
-.fa-magnet:before {
-  content: "\f076";
-}
-.fa-chevron-up:before {
-  content: "\f077";
-}
-.fa-chevron-down:before {
-  content: "\f078";
-}
-.fa-retweet:before {
-  content: "\f079";
-}
-.fa-shopping-cart:before {
-  content: "\f07a";
-}
-.fa-folder:before {
-  content: "\f07b";
-}
-.fa-folder-open:before {
-  content: "\f07c";
-}
-.fa-arrows-v:before {
-  content: "\f07d";
-}
-.fa-arrows-h:before {
-  content: "\f07e";
-}
-.fa-bar-chart-o:before,
-.fa-bar-chart:before {
-  content: "\f080";
-}
-.fa-twitter-square:before {
-  content: "\f081";
-}
-.fa-facebook-square:before {
-  content: "\f082";
-}
-.fa-camera-retro:before {
-  content: "\f083";
-}
-.fa-key:before {
-  content: "\f084";
-}
-.fa-gears:before,
-.fa-cogs:before {
-  content: "\f085";
-}
-.fa-comments:before {
-  content: "\f086";
-}
-.fa-thumbs-o-up:before {
-  content: "\f087";
-}
-.fa-thumbs-o-down:before {
-  content: "\f088";
-}
-.fa-star-half:before {
-  content: "\f089";
-}
-.fa-heart-o:before {
-  content: "\f08a";
-}
-.fa-sign-out:before {
-  content: "\f08b";
-}
-.fa-linkedin-square:before {
-  content: "\f08c";
-}
-.fa-thumb-tack:before {
-  content: "\f08d";
-}
-.fa-external-link:before {
-  content: "\f08e";
-}
-.fa-sign-in:before {
-  content: "\f090";
-}
-.fa-trophy:before {
-  content: "\f091";
-}
-.fa-github-square:before {
-  content: "\f092";
-}
-.fa-upload:before {
-  content: "\f093";
-}
-.fa-lemon-o:before {
-  content: "\f094";
-}
-.fa-phone:before {
-  content: "\f095";
-}
-.fa-square-o:before {
-  content: "\f096";
-}
-.fa-bookmark-o:before {
-  content: "\f097";
-}
-.fa-phone-square:before {
-  content: "\f098";
-}
-.fa-twitter:before {
-  content: "\f099";
-}
-.fa-facebook-f:before,
-.fa-facebook:before {
-  content: "\f09a";
-}
-.fa-github:before {
-  content: "\f09b";
-}
-.fa-unlock:before {
-  content: "\f09c";
-}
-.fa-credit-card:before {
-  content: "\f09d";
-}
-.fa-rss:before {
-  content: "\f09e";
-}
-.fa-hdd-o:before {
-  content: "\f0a0";
-}
-.fa-bullhorn:before {
-  content: "\f0a1";
-}
-.fa-bell:before {
-  content: "\f0f3";
-}
-.fa-certificate:before {
-  content: "\f0a3";
-}
-.fa-hand-o-right:before {
-  content: "\f0a4";
-}
-.fa-hand-o-left:before {
-  content: "\f0a5";
-}
-.fa-hand-o-up:before {
-  content: "\f0a6";
-}
-.fa-hand-o-down:before {
-  content: "\f0a7";
-}
-.fa-arrow-circle-left:before {
-  content: "\f0a8";
-}
-.fa-arrow-circle-right:before {
-  content: "\f0a9";
-}
-.fa-arrow-circle-up:before {
-  content: "\f0aa";
-}
-.fa-arrow-circle-down:before {
-  content: "\f0ab";
-}
-.fa-globe:before {
-  content: "\f0ac";
-}
-.fa-wrench:before {
-  content: "\f0ad";
-}
-.fa-tasks:before {
-  content: "\f0ae";
-}
-.fa-filter:before {
-  content: "\f0b0";
-}
-.fa-briefcase:before {
-  content: "\f0b1";
-}
-.fa-arrows-alt:before {
-  content: "\f0b2";
-}
-.fa-group:before,
-.fa-users:before {
-  content: "\f0c0";
-}
-.fa-chain:before,
-.fa-link:before {
-  content: "\f0c1";
-}
-.fa-cloud:before {
-  content: "\f0c2";
-}
-.fa-flask:before {
-  content: "\f0c3";
-}
-.fa-cut:before,
-.fa-scissors:before {
-  content: "\f0c4";
-}
-.fa-copy:before,
-.fa-files-o:before {
-  content: "\f0c5";
-}
-.fa-paperclip:before {
-  content: "\f0c6";
-}
-.fa-save:before,
-.fa-floppy-o:before {
-  content: "\f0c7";
-}
-.fa-square:before {
-  content: "\f0c8";
-}
-.fa-navicon:before,
-.fa-reorder:before,
-.fa-bars:before {
-  content: "\f0c9";
-}
-.fa-list-ul:before {
-  content: "\f0ca";
-}
-.fa-list-ol:before {
-  content: "\f0cb";
-}
-.fa-strikethrough:before {
-  content: "\f0cc";
-}
-.fa-underline:before {
-  content: "\f0cd";
-}
-.fa-table:before {
-  content: "\f0ce";
-}
-.fa-magic:before {
-  content: "\f0d0";
-}
-.fa-truck:before {
-  content: "\f0d1";
-}
-.fa-pinterest:before {
-  content: "\f0d2";
-}
-.fa-pinterest-square:before {
-  content: "\f0d3";
-}
-.fa-google-plus-square:before {
-  content: "\f0d4";
-}
-.fa-google-plus:before {
-  content: "\f0d5";
-}
-.fa-money:before {
-  content: "\f0d6";
-}
-.fa-caret-down:before {
-  content: "\f0d7";
-}
-.fa-caret-up:before {
-  content: "\f0d8";
-}
-.fa-caret-left:before {
-  content: "\f0d9";
-}
-.fa-caret-right:before {
-  content: "\f0da";
-}
-.fa-columns:before {
-  content: "\f0db";
-}
-.fa-unsorted:before,
-.fa-sort:before {
-  content: "\f0dc";
-}
-.fa-sort-down:before,
-.fa-sort-desc:before {
-  content: "\f0dd";
-}
-.fa-sort-up:before,
-.fa-sort-asc:before {
-  content: "\f0de";
-}
-.fa-envelope:before {
-  content: "\f0e0";
-}
-.fa-linkedin:before {
-  content: "\f0e1";
-}
-.fa-rotate-left:before,
-.fa-undo:before {
-  content: "\f0e2";
-}
-.fa-legal:before,
-.fa-gavel:before {
-  content: "\f0e3";
-}
-.fa-dashboard:before,
-.fa-tachometer:before {
-  content: "\f0e4";
-}
-.fa-comment-o:before {
-  content: "\f0e5";
-}
-.fa-comments-o:before {
-  content: "\f0e6";
-}
-.fa-flash:before,
-.fa-bolt:before {
-  content: "\f0e7";
-}
-.fa-sitemap:before {
-  content: "\f0e8";
-}
-.fa-umbrella:before {
-  content: "\f0e9";
-}
-.fa-paste:before,
-.fa-clipboard:before {
-  content: "\f0ea";
-}
-.fa-lightbulb-o:before {
-  content: "\f0eb";
-}
-.fa-exchange:before {
-  content: "\f0ec";
-}
-.fa-cloud-download:before {
-  content: "\f0ed";
-}
-.fa-cloud-upload:before {
-  content: "\f0ee";
-}
-.fa-user-md:before {
-  content: "\f0f0";
-}
-.fa-stethoscope:before {
-  content: "\f0f1";
-}
-.fa-suitcase:before {
-  content: "\f0f2";
-}
-.fa-bell-o:before {
-  content: "\f0a2";
-}
-.fa-coffee:before {
-  content: "\f0f4";
-}
-.fa-cutlery:before {
-  content: "\f0f5";
-}
-.fa-file-text-o:before {
-  content: "\f0f6";
-}
-.fa-building-o:before {
-  content: "\f0f7";
-}
-.fa-hospital-o:before {
-  content: "\f0f8";
-}
-.fa-ambulance:before {
-  content: "\f0f9";
-}
-.fa-medkit:before {
-  content: "\f0fa";
-}
-.fa-fighter-jet:before {
-  content: "\f0fb";
-}
-.fa-beer:before {
-  content: "\f0fc";
-}
-.fa-h-square:before {
-  content: "\f0fd";
-}
-.fa-plus-square:before {
-  content: "\f0fe";
-}
-.fa-angle-double-left:before {
-  content: "\f100";
-}
-.fa-angle-double-right:before {
-  content: "\f101";
-}
-.fa-angle-double-up:before {
-  content: "\f102";
-}
-.fa-angle-double-down:before {
-  content: "\f103";
-}
-.fa-angle-left:before {
-  content: "\f104";
-}
-.fa-angle-right:before {
-  content: "\f105";
-}
-.fa-angle-up:before {
-  content: "\f106";
-}
-.fa-angle-down:before {
-  content: "\f107";
-}
-.fa-desktop:before {
-  content: "\f108";
-}
-.fa-laptop:before {
-  content: "\f109";
-}
-.fa-tablet:before {
-  content: "\f10a";
-}
-.fa-mobile-phone:before,
-.fa-mobile:before {
-  content: "\f10b";
-}
-.fa-circle-o:before {
-  content: "\f10c";
-}
-.fa-quote-left:before {
-  content: "\f10d";
-}
-.fa-quote-right:before {
-  content: "\f10e";
-}
-.fa-spinner:before {
-  content: "\f110";
-}
-.fa-circle:before {
-  content: "\f111";
-}
-.fa-mail-reply:before,
-.fa-reply:before {
-  content: "\f112";
-}
-.fa-github-alt:before {
-  content: "\f113";
-}
-.fa-folder-o:before {
-  content: "\f114";
-}
-.fa-folder-open-o:before {
-  content: "\f115";
-}
-.fa-smile-o:before {
-  content: "\f118";
-}
-.fa-frown-o:before {
-  content: "\f119";
-}
-.fa-meh-o:before {
-  content: "\f11a";
-}
-.fa-gamepad:before {
-  content: "\f11b";
-}
-.fa-keyboard-o:before {
-  content: "\f11c";
-}
-.fa-flag-o:before {
-  content: "\f11d";
-}
-.fa-flag-checkered:before {
-  content: "\f11e";
-}
-.fa-terminal:before {
-  content: "\f120";
-}
-.fa-code:before {
-  content: "\f121";
-}
-.fa-mail-reply-all:before,
-.fa-reply-all:before {
-  content: "\f122";
-}
-.fa-star-half-empty:before,
-.fa-star-half-full:before,
-.fa-star-half-o:before {
-  content: "\f123";
-}
-.fa-location-arrow:before {
-  content: "\f124";
-}
-.fa-crop:before {
-  content: "\f125";
-}
-.fa-code-fork:before {
-  content: "\f126";
-}
-.fa-unlink:before,
-.fa-chain-broken:before {
-  content: "\f127";
-}
-.fa-question:before {
-  content: "\f128";
-}
-.fa-info:before {
-  content: "\f129";
-}
-.fa-exclamation:before {
-  content: "\f12a";
-}
-.fa-superscript:before {
-  content: "\f12b";
-}
-.fa-subscript:before {
-  content: "\f12c";
-}
-.fa-eraser:before {
-  content: "\f12d";
-}
-.fa-puzzle-piece:before {
-  content: "\f12e";
-}
-.fa-microphone:before {
-  content: "\f130";
-}
-.fa-microphone-slash:before {
-  content: "\f131";
-}
-.fa-shield:before {
-  content: "\f132";
-}
-.fa-calendar-o:before {
-  content: "\f133";
-}
-.fa-fire-extinguisher:before {
-  content: "\f134";
-}
-.fa-rocket:before {
-  content: "\f135";
-}
-.fa-maxcdn:before {
-  content: "\f136";
-}
-.fa-chevron-circle-left:before {
-  content: "\f137";
-}
-.fa-chevron-circle-right:before {
-  content: "\f138";
-}
-.fa-chevron-circle-up:before {
-  content: "\f139";
-}
-.fa-chevron-circle-down:before {
-  content: "\f13a";
-}
-.fa-html5:before {
-  content: "\f13b";
-}
-.fa-css3:before {
-  content: "\f13c";
-}
-.fa-anchor:before {
-  content: "\f13d";
-}
-.fa-unlock-alt:before {
-  content: "\f13e";
-}
-.fa-bullseye:before {
-  content: "\f140";
-}
-.fa-ellipsis-h:before {
-  content: "\f141";
-}
-.fa-ellipsis-v:before {
-  content: "\f142";
-}
-.fa-rss-square:before {
-  content: "\f143";
-}
-.fa-play-circle:before {
-  content: "\f144";
-}
-.fa-ticket:before {
-  content: "\f145";
-}
-.fa-minus-square:before {
-  content: "\f146";
-}
-.fa-minus-square-o:before {
-  content: "\f147";
-}
-.fa-level-up:before {
-  content: "\f148";
-}
-.fa-level-down:before {
-  content: "\f149";
-}
-.fa-check-square:before {
-  content: "\f14a";
-}
-.fa-pencil-square:before {
-  content: "\f14b";
-}
-.fa-external-link-square:before {
-  content: "\f14c";
-}
-.fa-share-square:before {
-  content: "\f14d";
-}
-.fa-compass:before {
-  content: "\f14e";
-}
-.fa-toggle-down:before,
-.fa-caret-square-o-down:before {
-  content: "\f150";
-}
-.fa-toggle-up:before,
-.fa-caret-square-o-up:before {
-  content: "\f151";
-}
-.fa-toggle-right:before,
-.fa-caret-square-o-right:before {
-  content: "\f152";
-}
-.fa-euro:before,
-.fa-eur:before {
-  content: "\f153";
-}
-.fa-gbp:before {
-  content: "\f154";
-}
-.fa-dollar:before,
-.fa-usd:before {
-  content: "\f155";
-}
-.fa-rupee:before,
-.fa-inr:before {
-  content: "\f156";
-}
-.fa-cny:before,
-.fa-rmb:before,
-.fa-yen:before,
-.fa-jpy:before {
-  content: "\f157";
-}
-.fa-ruble:before,
-.fa-rouble:before,
-.fa-rub:before {
-  content: "\f158";
-}
-.fa-won:before,
-.fa-krw:before {
-  content: "\f159";
-}
-.fa-bitcoin:before,
-.fa-btc:before {
-  content: "\f15a";
-}
-.fa-file:before {
-  content: "\f15b";
-}
-.fa-file-text:before {
-  content: "\f15c";
-}
-.fa-sort-alpha-asc:before {
-  content: "\f15d";
-}
-.fa-sort-alpha-desc:before {
-  content: "\f15e";
-}
-.fa-sort-amount-asc:before {
-  content: "\f160";
-}
-.fa-sort-amount-desc:before {
-  content: "\f161";
-}
-.fa-sort-numeric-asc:before {
-  content: "\f162";
-}
-.fa-sort-numeric-desc:before {
-  content: "\f163";
-}
-.fa-thumbs-up:before {
-  content: "\f164";
-}
-.fa-thumbs-down:before {
-  content: "\f165";
-}
-.fa-youtube-square:before {
-  content: "\f166";
-}
-.fa-youtube:before {
-  content: "\f167";
-}
-.fa-xing:before {
-  content: "\f168";
-}
-.fa-xing-square:before {
-  content: "\f169";
-}
-.fa-youtube-play:before {
-  content: "\f16a";
-}
-.fa-dropbox:before {
-  content: "\f16b";
-}
-.fa-stack-overflow:before {
-  content: "\f16c";
-}
-.fa-instagram:before {
-  content: "\f16d";
-}
-.fa-flickr:before {
-  content: "\f16e";
-}
-.fa-adn:before {
-  content: "\f170";
-}
-.fa-bitbucket:before {
-  content: "\f171";
-}
-.fa-bitbucket-square:before {
-  content: "\f172";
-}
-.fa-tumblr:before {
-  content: "\f173";
-}
-.fa-tumblr-square:before {
-  content: "\f174";
-}
-.fa-long-arrow-down:before {
-  content: "\f175";
-}
-.fa-long-arrow-up:before {
-  content: "\f176";
-}
-.fa-long-arrow-left:before {
-  content: "\f177";
-}
-.fa-long-arrow-right:before {
-  content: "\f178";
-}
-.fa-apple:before {
-  content: "\f179";
-}
-.fa-windows:before {
-  content: "\f17a";
-}
-.fa-android:before {
-  content: "\f17b";
-}
-.fa-linux:before {
-  content: "\f17c";
-}
-.fa-dribbble:before {
-  content: "\f17d";
-}
-.fa-skype:before {
-  content: "\f17e";
-}
-.fa-foursquare:before {
-  content: "\f180";
-}
-.fa-trello:before {
-  content: "\f181";
-}
-.fa-female:before {
-  content: "\f182";
-}
-.fa-male:before {
-  content: "\f183";
-}
-.fa-gittip:before,
-.fa-gratipay:before {
-  content: "\f184";
-}
-.fa-sun-o:before {
-  content: "\f185";
-}
-.fa-moon-o:before {
-  content: "\f186";
-}
-.fa-archive:before {
-  content: "\f187";
-}
-.fa-bug:before {
-  content: "\f188";
-}
-.fa-vk:before {
-  content: "\f189";
-}
-.fa-weibo:before {
-  content: "\f18a";
-}
-.fa-renren:before {
-  content: "\f18b";
-}
-.fa-pagelines:before {
-  content: "\f18c";
-}
-.fa-stack-exchange:before {
-  content: "\f18d";
-}
-.fa-arrow-circle-o-right:before {
-  content: "\f18e";
-}
-.fa-arrow-circle-o-left:before {
-  content: "\f190";
-}
-.fa-toggle-left:before,
-.fa-caret-square-o-left:before {
-  content: "\f191";
-}
-.fa-dot-circle-o:before {
-  content: "\f192";
-}
-.fa-wheelchair:before {
-  content: "\f193";
-}
-.fa-vimeo-square:before {
-  content: "\f194";
-}
-.fa-turkish-lira:before,
-.fa-try:before {
-  content: "\f195";
-}
-.fa-plus-square-o:before {
-  content: "\f196";
-}
-.fa-space-shuttle:before {
-  content: "\f197";
-}
-.fa-slack:before {
-  content: "\f198";
-}
-.fa-envelope-square:before {
-  content: "\f199";
-}
-.fa-wordpress:before {
-  content: "\f19a";
-}
-.fa-openid:before {
-  content: "\f19b";
-}
-.fa-institution:before,
-.fa-bank:before,
-.fa-university:before {
-  content: "\f19c";
-}
-.fa-mortar-board:before,
-.fa-graduation-cap:before {
-  content: "\f19d";
-}
-.fa-yahoo:before {
-  content: "\f19e";
-}
-.fa-google:before {
-  content: "\f1a0";
-}
-.fa-reddit:before {
-  content: "\f1a1";
-}
-.fa-reddit-square:before {
-  content: "\f1a2";
-}
-.fa-stumbleupon-circle:before {
-  content: "\f1a3";
-}
-.fa-stumbleupon:before {
-  content: "\f1a4";
-}
-.fa-delicious:before {
-  content: "\f1a5";
-}
-.fa-digg:before {
-  content: "\f1a6";
-}
-.fa-pied-piper:before {
-  content: "\f1a7";
-}
-.fa-pied-piper-alt:before {
-  content: "\f1a8";
-}
-.fa-drupal:before {
-  content: "\f1a9";
-}
-.fa-joomla:before {
-  content: "\f1aa";
-}
-.fa-language:before {
-  content: "\f1ab";
-}
-.fa-fax:before {
-  content: "\f1ac";
-}
-.fa-building:before {
-  content: "\f1ad";
-}
-.fa-child:before {
-  content: "\f1ae";
-}
-.fa-paw:before {
-  content: "\f1b0";
-}
-.fa-spoon:before {
-  content: "\f1b1";
-}
-.fa-cube:before {
-  content: "\f1b2";
-}
-.fa-cubes:before {
-  content: "\f1b3";
-}
-.fa-behance:before {
-  content: "\f1b4";
-}
-.fa-behance-square:before {
-  content: "\f1b5";
-}
-.fa-steam:before {
-  content: "\f1b6";
-}
-.fa-steam-square:before {
-  content: "\f1b7";
-}
-.fa-recycle:before {
-  content: "\f1b8";
-}
-.fa-automobile:before,
-.fa-car:before {
-  content: "\f1b9";
-}
-.fa-cab:before,
-.fa-taxi:before {
-  content: "\f1ba";
-}
-.fa-tree:before {
-  content: "\f1bb";
-}
-.fa-spotify:before {
-  content: "\f1bc";
-}
-.fa-deviantart:before {
-  content: "\f1bd";
-}
-.fa-soundcloud:before {
-  content: "\f1be";
-}
-.fa-database:before {
-  content: "\f1c0";
-}
-.fa-file-pdf-o:before {
-  content: "\f1c1";
-}
-.fa-file-word-o:before {
-  content: "\f1c2";
-}
-.fa-file-excel-o:before {
-  content: "\f1c3";
-}
-.fa-file-powerpoint-o:before {
-  content: "\f1c4";
-}
-.fa-file-photo-o:before,
-.fa-file-picture-o:before,
-.fa-file-image-o:before {
-  content: "\f1c5";
-}
-.fa-file-zip-o:before,
-.fa-file-archive-o:before {
-  content: "\f1c6";
-}
-.fa-file-sound-o:before,
-.fa-file-audio-o:before {
-  content: "\f1c7";
-}
-.fa-file-movie-o:before,
-.fa-file-video-o:before {
-  content: "\f1c8";
-}
-.fa-file-code-o:before {
-  content: "\f1c9";
-}
-.fa-vine:before {
-  content: "\f1ca";
-}
-.fa-codepen:before {
-  content: "\f1cb";
-}
-.fa-jsfiddle:before {
-  content: "\f1cc";
-}
-.fa-life-bouy:before,
-.fa-life-buoy:before,
-.fa-life-saver:before,
-.fa-support:before,
-.fa-life-ring:before {
-  content: "\f1cd";
-}
-.fa-circle-o-notch:before {
-  content: "\f1ce";
-}
-.fa-ra:before,
-.fa-rebel:before {
-  content: "\f1d0";
-}
-.fa-ge:before,
-.fa-empire:before {
-  content: "\f1d1";
-}
-.fa-git-square:before {
-  content: "\f1d2";
-}
-.fa-git:before {
-  content: "\f1d3";
-}
-.fa-hacker-news:before {
-  content: "\f1d4";
-}
-.fa-tencent-weibo:before {
-  content: "\f1d5";
-}
-.fa-qq:before {
-  content: "\f1d6";
-}
-.fa-wechat:before,
-.fa-weixin:before {
-  content: "\f1d7";
-}
-.fa-send:before,
-.fa-paper-plane:before {
-  content: "\f1d8";
-}
-.fa-send-o:before,
-.fa-paper-plane-o:before {
-  content: "\f1d9";
-}
-.fa-history:before {
-  content: "\f1da";
-}
-.fa-genderless:before,
-.fa-circle-thin:before {
-  content: "\f1db";
-}
-.fa-header:before {
-  content: "\f1dc";
-}
-.fa-paragraph:before {
-  content: "\f1dd";
-}
-.fa-sliders:before {
-  content: "\f1de";
-}
-.fa-share-alt:before {
-  content: "\f1e0";
-}
-.fa-share-alt-square:before {
-  content: "\f1e1";
-}
-.fa-bomb:before {
-  content: "\f1e2";
-}
-.fa-soccer-ball-o:before,
-.fa-futbol-o:before {
-  content: "\f1e3";
-}
-.fa-tty:before {
-  content: "\f1e4";
-}
-.fa-binoculars:before {
-  content: "\f1e5";
-}
-.fa-plug:before {
-  content: "\f1e6";
-}
-.fa-slideshare:before {
-  content: "\f1e7";
-}
-.fa-twitch:before {
-  content: "\f1e8";
-}
-.fa-yelp:before {
-  content: "\f1e9";
-}
-.fa-newspaper-o:before {
-  content: "\f1ea";
-}
-.fa-wifi:before {
-  content: "\f1eb";
-}
-.fa-calculator:before {
-  content: "\f1ec";
-}
-.fa-paypal:before {
-  content: "\f1ed";
-}
-.fa-google-wallet:before {
-  content: "\f1ee";
-}
-.fa-cc-visa:before {
-  content: "\f1f0";
-}
-.fa-cc-mastercard:before {
-  content: "\f1f1";
-}
-.fa-cc-discover:before {
-  content: "\f1f2";
-}
-.fa-cc-amex:before {
-  content: "\f1f3";
-}
-.fa-cc-paypal:before {
-  content: "\f1f4";
-}
-.fa-cc-stripe:before {
-  content: "\f1f5";
-}
-.fa-bell-slash:before {
-  content: "\f1f6";
-}
-.fa-bell-slash-o:before {
-  content: "\f1f7";
-}
-.fa-trash:before {
-  content: "\f1f8";
-}
-.fa-copyright:before {
-  content: "\f1f9";
-}
-.fa-at:before {
-  content: "\f1fa";
-}
-.fa-eyedropper:before {
-  content: "\f1fb";
-}
-.fa-paint-brush:before {
-  content: "\f1fc";
-}
-.fa-birthday-cake:before {
-  content: "\f1fd";
-}
-.fa-area-chart:before {
-  content: "\f1fe";
-}
-.fa-pie-chart:before {
-  content: "\f200";
-}
-.fa-line-chart:before {
-  content: "\f201";
-}
-.fa-lastfm:before {
-  content: "\f202";
-}
-.fa-lastfm-square:before {
-  content: "\f203";
-}
-.fa-toggle-off:before {
-  content: "\f204";
-}
-.fa-toggle-on:before {
-  content: "\f205";
-}
-.fa-bicycle:before {
-  content: "\f206";
-}
-.fa-bus:before {
-  content: "\f207";
-}
-.fa-ioxhost:before {
-  content: "\f208";
-}
-.fa-angellist:before {
-  content: "\f209";
-}
-.fa-cc:before {
-  content: "\f20a";
-}
-.fa-shekel:before,
-.fa-sheqel:before,
-.fa-ils:before {
-  content: "\f20b";
-}
-.fa-meanpath:before {
-  content: "\f20c";
-}
-.fa-buysellads:before {
-  content: "\f20d";
-}
-.fa-connectdevelop:before {
-  content: "\f20e";
-}
-.fa-dashcube:before {
-  content: "\f210";
-}
-.fa-forumbee:before {
-  content: "\f211";
-}
-.fa-leanpub:before {
-  content: "\f212";
-}
-.fa-sellsy:before {
-  content: "\f213";
-}
-.fa-shirtsinbulk:before {
-  content: "\f214";
-}
-.fa-simplybuilt:before {
-  content: "\f215";
-}
-.fa-skyatlas:before {
-  content: "\f216";
-}
-.fa-cart-plus:before {
-  content: "\f217";
-}
-.fa-cart-arrow-down:before {
-  content: "\f218";
-}
-.fa-diamond:before {
-  content: "\f219";
-}
-.fa-ship:before {
-  content: "\f21a";
-}
-.fa-user-secret:before {
-  content: "\f21b";
-}
-.fa-motorcycle:before {
-  content: "\f21c";
-}
-.fa-street-view:before {
-  content: "\f21d";
-}
-.fa-heartbeat:before {
-  content: "\f21e";
-}
-.fa-venus:before {
-  content: "\f221";
-}
-.fa-mars:before {
-  content: "\f222";
-}
-.fa-mercury:before {
-  content: "\f223";
-}
-.fa-transgender:before {
-  content: "\f224";
-}
-.fa-transgender-alt:before {
-  content: "\f225";
-}
-.fa-venus-double:before {
-  content: "\f226";
-}
-.fa-mars-double:before {
-  content: "\f227";
-}
-.fa-venus-mars:before {
-  content: "\f228";
-}
-.fa-mars-stroke:before {
-  content: "\f229";
-}
-.fa-mars-stroke-v:before {
-  content: "\f22a";
-}
-.fa-mars-stroke-h:before {
-  content: "\f22b";
-}
-.fa-neuter:before {
-  content: "\f22c";
-}
-.fa-facebook-official:before {
-  content: "\f230";
-}
-.fa-pinterest-p:before {
-  content: "\f231";
-}
-.fa-whatsapp:before {
-  content: "\f232";
-}
-.fa-server:before {
-  content: "\f233";
-}
-.fa-user-plus:before {
-  content: "\f234";
-}
-.fa-user-times:before {
-  content: "\f235";
-}
-.fa-hotel:before,
-.fa-bed:before {
-  content: "\f236";
-}
-.fa-viacoin:before {
-  content: "\f237";
-}
-.fa-train:before {
-  content: "\f238";
-}
-.fa-subway:before {
-  content: "\f239";
-}
-.fa-medium:before {
-  content: "\f23a";
-}


=====================================
userContent/reproducible/lede/foundation.css deleted
=====================================
The diff for this file was not included because it is too large.

=====================================
userContent/reproducible/lede/lede.css deleted
=====================================
@@ -1,27 +0,0 @@
-a {
-    text-decoration: none;
-}
-
-p {
-    line-height: 1.8;
-}
-
-.top-bar .toggle-topbar span,
-.fa-ul a {
-    font-family:"Open Sans","DejaVu Sans",sans-serif;
-}
-
-.top-bar-section {
-    max-width: 100rem !important;
-}
-
- at media only screen and (min-width: 40.063em) {
-    .top-bar {
-        height: auto;
-        min-height: 2.8125rem;
-    }
-}
-
-.top-bar .top-bar-title {
-    padding-left: 10px;
-}


=====================================
userContent/reproducible/lede/lede.html deleted
=====================================
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html lang="en-US">
-  <head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width">
-    <title>Reproducible LEDE ?</title>
-    <link rel="stylesheet" href="foundation.css"/>
-    <link rel="stylesheet" href="font-awesome.css"/>
-    <link rel="stylesheet" href="coderay.css"/>
-    <link rel="stylesheet" href="asciidoctor.css"/>
-    <link rel="stylesheet" href="lede.css"/>
-  </head>
-  <body>
-    <div id="content">
-        <pre>
-       </pre>
-     </div><div id="main-content">
-       <h1>LEDE - <em>reproducible</em> wireless freedom!</h1>
-     </div>
-     <p>
-     <ul>
-	     <li><a href="lede_ar71xx.html">ar71xx</a></li>
-	     <li><a href="lede_ramips.html">ramips</a></li>
-	     <li><a href="lede_x86.html">x86</a></li>
-     </ul>
-     </p>
-</div>
-</body></html>



View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/compare/25a129920abd2e7f4ba33a4d3f4c42ea4e888c68...0d8ad7247f1226eb284f48e098c156509ec305f2

-- 
View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/compare/25a129920abd2e7f4ba33a4d3f4c42ea4e888c68...0d8ad7247f1226eb284f48e098c156509ec305f2
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/qa-jenkins-scm/attachments/20181004/0b0d7cc8/attachment-0001.html>


More information about the Qa-jenkins-scm mailing list