diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2016-05-21 21:41:35 +0200 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2016-05-21 21:41:35 +0200 |
| commit | 555e95319513c7c8289ffe9d188ca1899e5cf70d (patch) | |
| tree | 261d25f66986f42ae7f8ac6455011191cd14c423 | |
| download | blog-555e95319513c7c8289ffe9d188ca1899e5cf70d.tar.gz blog-555e95319513c7c8289ffe9d188ca1899e5cf70d.zip | |
migrate to hugo
42 files changed, 1571 insertions, 0 deletions
diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..d8cfe95 --- /dev/null +++ b/config.toml @@ -0,0 +1,9 @@ +baseurl = "https://schneefux.xyz" +disablePathToLower = true +languageCode = "de-de" +title = "My shell is my home" +pygmentsuseclasses = true +pygmentscodefences = true +[params] + logo = "/logo.svg" +# Theme based on rakuishi/hugo-zen, MIT diff --git a/content/post/audio-output-to-input.md b/content/post/audio-output-to-input.md new file mode 100644 index 0000000..cc36313 --- /dev/null +++ b/content/post/audio-output-to-input.md @@ -0,0 +1,15 @@ +--- +categories: +- software +date: 2015-11-28 +title: Route audio output to input +--- + +To be able to visualize my laptop's sound output with a python script, I needed an extra audio input that made it possible to capture the system's audio output. + +To achieve that, I did the following on my Raspberry Pi: + + * install alsa-utils and pulseaudio + * get the pulseaudio init script [here](https://www.raspberrypi.org/forums/viewtopic.php?p=619713#p619713) + * add the users to the group "pulse-access", I got `ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect` without it even as root + * [create an ALSA monitor source](https://wiki.archlinux.org/index.php/PulseAudio/Examples#ALSA_monitor_source) diff --git a/content/post/blinkiecar.md b/content/post/blinkiecar.md new file mode 100644 index 0000000..9ee461a --- /dev/null +++ b/content/post/blinkiecar.md @@ -0,0 +1,36 @@ +--- +categories: +- embedded +date: 2015-12-21 +title: Blinkiecar - 3D printed car with turn signals +--- + +With some support from a friend with a 3D printer, I successfully built a magnetic car with working turning lights. + + + +_Right, it's a present._ + +The car was printed in two pieces, the top and the bottom part. My friend downloaded the model from somewhere, I repaired it with [netfabb](http://www.netfabb.com/) (didn't like their software due to an annoying startup dialog and paid features), cut it with [slic3r](http://slic3r.org) (this program looked better) and gave him the [repetier](http://www.repetier.com/)-converted model back. + + + +_This is how it looks on the inside._ + +Inside the car is a 3.3V coin cell battery, which is connected to two switches and orange blink LEDs on the bottom of the car. You turn the switch on either the left or the right side on and thereby make the corresponding turn light blink. + +A strong magnet from an old hard drive is glued below the car so you can stick it onto a magnetic board. + + + +_The magnet also covers the circuit a bit._ + +The blink LEDs are not in sync for some reason, but that did not matter as they still function as turning lights. + + + +_You can still try to use them as warning lights, but that's not reliable._ + + + +Next time, I should think of another solution for power - with this setup, you cannot swap the battery and the LEDs are quite dark. diff --git a/content/post/esp8266.md b/content/post/esp8266.md new file mode 100644 index 0000000..bacb235 --- /dev/null +++ b/content/post/esp8266.md @@ -0,0 +1,16 @@ +--- +categories: +- embedded +date: 2015-10-14 +title: Quick guide - Flashing an ESP8266 +--- + +Get an FTDI, the Arduino IDE, add the ESP8266 plugin to the IDE. + +Then connect TX↔RX, RX↔TX, GND↔GND, VCC↔3V and CHPD↔3V. + +To enter the flashing mode, connect GPIO0↔GND. Then briefly touch RST↔GND. + +After flashing, disconnect GPIO0 from GND. + +RX and TX can later be used as GPIOs. The blue led is on when TX is low. diff --git a/content/post/internet-is-magic.md b/content/post/internet-is-magic.md new file mode 100644 index 0000000..e33c4a2 --- /dev/null +++ b/content/post/internet-is-magic.md @@ -0,0 +1,43 @@ +--- +categories: +- embedded +date: 2015-10-29 +title: Internet is magic - Glowing ponies show your friends' online status +aliases: +- /2015/10/29/internet-is-magic.html +--- + +Friendship is magic! I like the My Little Pony series, and two of my best friends, knowing that, surprised me with self-made versions of Twilight and Fluttershy at my birthday. + + + +_Aren't they adorable?_ + +As you can see in the picture, I grabbed some diffused LEDs and illuminated my ponies. + +That was kind of unexciting after a while. Luckily, I had an [ESP8266](https://en.wikipedia.org/wiki/ESP8266) to spare. These modules are small Arduino compatible WiFi modules, so with some programming knowledge you can control GPIOs via WiFi. + +Awesome! Let's connect the ponies to the world wide web. + + + +_Not much to see here_ + +I wrote a quick-and-dirty Arduino sketch, [uploaded it]({% post_url 2015-10-14-esp8266%}) and was able to control the LEDs via netcat. You can find the sketch [here](https://git.schneefux.xyz/?p=internet-is-magic;a=blob;f=luminate.ino;hb=HEAD). + + + +_The cables in the background supply power._ + +And now comes the fun part. Both of my friends chat with me via [Telegram](https://telegram.org). Unlike WhatsApp, Telegram has an open API that allows me to easily receive their online status. + +I installed the [telegram-cli](https://github.com/vysheng/tg) client on my [Raspberry Pi](https://raspberrypi.org), a cheap and small computer, and set up an autostart script. telegram-cli runs in bot mode, a python script updates the LEDs every minute. I uploaded the script [here](https://git.schneefux.xyz/?p=internet-is-magic;a=blob;f=client.py;hb=HEAD). + +So whenever my friends are online, their corresponding pony starts to glow. + + + + +_When they light up at night, you can feel the magic._ + +If you want to build something similar to this, be sure to ask your friends whether it's okay for them that you monitor their presence all day long. diff --git a/content/post/kindle-as-screen.md b/content/post/kindle-as-screen.md new file mode 100644 index 0000000..130592c --- /dev/null +++ b/content/post/kindle-as-screen.md @@ -0,0 +1,27 @@ +--- +categories: +- software +date: 2013-10-26 +title: Use your Kindle as VNC viewer +--- + +I could mod my Kindle so I can now use it as screen for the RaspberryPi. + +This is what I did with my Kindle 4 NT: + +1. [Jailbreak](http://wiki.mobileread.com/wiki/Kindle4NTHacking#Jailbreak) +2. [Install USBNetwork](http://wiki.mobileread.com/wiki/Kindle4NTHacking#SSH) +3. [Get KindleVNC viewer](http://www.mobileread.com/forums/showthread.php?t=150434) +4. Connect your Kindle via USB to a GNU/Linux computer. ssh into it like so (the root password doesn't exist, you can type in anything): +`sudo ifconfig usb0 192.168.15.2` `ssh root@192.168.15.244` +5. Start the vnc viewer with `/mnt/us/kindlevncviewer/kvncviewer.sh 192.168.15.2:0 &` +6. Here is a script to autostart the viewer: + +``` bash +sudo ifconfig usb0 192.168.15.2 +sudo x11vnc -scale 800x600 -display :0 & +sleep 8 +sshpass -p asdf ssh root@192.168.15.244 /mnt/us/kindlevncviewer/kvncviewer.sh 192.168.15.2:0 & +``` + +Do not forget to enable USBNetworking, otherwise it won't work. You can do so with [KUAL](http://www.mobileread.com/forums/showthread.php?t=203326). diff --git a/content/post/lilypad-bootloader.md b/content/post/lilypad-bootloader.md new file mode 100644 index 0000000..8910839 --- /dev/null +++ b/content/post/lilypad-bootloader.md @@ -0,0 +1,48 @@ +--- +categories: +- embedded +date: 2016-01-02 +title: Burning an Arduino's bootloader +--- + +Some long time ago, I bought some cheap Arduino LilyPad clones from Amazon. I spent weeks trying to get them work, but was heavily frustrated. No matter what I did, avrdude refused to upload my sketch: + +``` c +avrdude: Send: 0 [30] [20] +avrdude: Send: 0 [30] [20] +avrdude: Send: 0 [30] [20] +avrdude: ser_recv(): programmer is not responding +avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00 +``` + +Somehow I found out that I was able to upload my sketch [without using the bootloader](https://www.arduino.cc/en/Hacking/Programmer) with an ISP (I used an [Arduino Uno](https://www.arduino.cc/en/Tutorial/ArduinoISP)). + +That was still not satisfying. + +Here is how I debugged: + + * Check that the FTDI is working. Connect the FTDI's RX to its TX (nothing else!) and send data over the serial console. You should receive what you sent. + * Check that the Arduino is working. In my case, an LED started to blink as soon as I connected GND to GND and VCC to 3V/5V (depending on the board). + * Check that the Arduino is receiving data. Connect GND and VCC, then connect the FTDI's TX to the pin of the Arduino that you think was RX. Now send random data to the Arduino (for example with `cat /dev/random > /dev/ttyUSB0`), the RX LED on the Arduino should blink. In my case, it didn't. It turns out that the manufacturer swapped RX and TX or that I am misreading the datasheet. + * Now try to look at the verbose output while uploading. You can also try to push the reset button. + * Verify that the Arduino itself is working, but the bootloader isn't. Attach an ISP and upload a sketch without the bootloader (see above), or just click "burn bootloader" in the IDE. + +So I knew that something was wrong with the bootloader. What next? + +I had a hard time figuring that out, but in the end it turned out to be quite simple: + +"Unlock" the bootloader's fuses. This is a protection mechanism to prevent you from changing the bootloader accidentally. On my laptop and with the LilyPad, the command was `/usr/share/arduino/hardware/tools/avr/bin/avrdude -C/usr/share/arduino/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -cstk500v1 -P/dev/ttyUSB0 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xDA:m -Ulfuse:w:0xFF:m`. I simply copied it from the Arduino IDE's verbose output after I clicked "burn bootloader". + +Find the right bootloader. I guessed. On the LilyPad's Atmel is written "MEGA328P", so I could be sure that I needed some kind of bootloader for the atmega328. In `/usr/share/arduino/hardware/arduino/avr/bootloaders`, I looked for hex files with "328" in their names: `find -iname "*atmega328*.hex"` + +``` bash +./optiboot/optiboot_atmega328.hex +./optiboot/optiboot_atmega328-Mini.hex +./bt/ATmegaBOOT_168_atmega328_bt.hex +./atmega/ATmegaBOOT_168_atmega328.hex +./atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex +``` + +I found five different bootloaders. It couldn't be the third, because usually "bt" is an abbreviation of "bluetooth" and my LilyPad did not have built-in bluetooth. It wasn't some kind of "Mini" variant, either. The Arduino IDE itself burns the "_pro_8MHz" hex file, as can be seen in its output. So I tried the optiboot bootloader. I copied the IDE's command and replaced the path with optiboot's: `/usr/share/arduino/hardware/tools/avr/bin/avrdude -C/usr/share/arduino/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -cstk500v1 -P/dev/ttyUSB0 -b19200 -Uflash:w:/usr/share/arduino/hardware/arduino/avr/bootloaders/optiboot/optiboot_atmega328.hex:i -Ulock:w:0x0F:` + +Again, I tried uploading the sketch. Bummer, "programmer is not responding" again. So optiboot obviously does not work. I tried the last bootloader - unlock the fuses, burn the bootloader, upload a sketch - aaaaaaand it worked! I was freaking out. It seems that the clone does not ship the "pro_8MHz" variant. diff --git a/content/post/music-led-visualisation.md b/content/post/music-led-visualisation.md new file mode 100644 index 0000000..4bfbb04 --- /dev/null +++ b/content/post/music-led-visualisation.md @@ -0,0 +1,25 @@ +--- +categories: +- software +date: 2016-02-13 +title: Visualize music with MPD and an LED strip +--- + +With Arduinos, 5050 RGB LED strips, Hyperion and MPD on a Raspberry Pi I created a low cost party lightning environment. + + + +_First tests show that the setup seems to work._ + +The setup consists of cheap RGB LED strips, 2 \* 5 meters, powered by two 12V 3.5A adapters and an Arduino with three TO-120 transistors each. +For strips with 30 LEDs per meter, you need 0.5A per meter. To be safe, add additional 10% to the total. So for my 10 meters, I could also have used a single adapter with at least 5.5A. +The Arduino's GPIOs are not nearly able to supply 5.5A \* 12V = 66W, so we need transistors - either darlington transistors or MOSFETs. [Adafruit](https://learn.adafruit.com/rgb-led-strips/usage) has more information and detailed explanations. After wiring, the Arduino needs to be flashed with a software that communicates with the Raspberry Pi. I adapted a sketch that implements the Adalight protocol, you can find it [here](https://git.schneefux.xyz/?p=mpd-rgb-vis;a=blob;f=adastrip.ino;hb=HEAD). + +The Raspberry Pi as server runs [Hyperion](https://github.com/tvdzwan/hyperion) which is AmbiLight-like. On the same host, MPD outputs music to speakers and a FIFO. I wrote a Hyperion plugin that processes the output of the FIFO and thus visualizes the music that is currently be played. The plugin and more installation instructions are [here](https://git.schneefux.xyz/?p=mpd-rgb-vis;a=blob;f=README.md;hb=HEAD). In my case, I started two Hyperion daemons, because I had two Arduinos connected and it is currently not possible to output the same data to two Hyperion compatible devices. + +Initially, I planned using an ESP8266 instead of the Arduino. I had not the right parts to step down 12V to 3.3V and tried to hack something together with LEDs and a 7V-3.3V-stepdown converter. +Well… that didn't work out quite well. I used Arduino Unos instead. + + + +_Do not reproduce, this fries the ESP…_ diff --git a/content/post/raspberry-pi-router.md b/content/post/raspberry-pi-router.md new file mode 100644 index 0000000..8e51d6f --- /dev/null +++ b/content/post/raspberry-pi-router.md @@ -0,0 +1,30 @@ +--- +categories: +- software +date: 2014-08-05 +title: Use your Raspberry Pi as WiFi router +--- + +Using [this guide](http://www.daveconroy.com/turn-your-raspberry-pi-into-a-wifi-hotspot-with-edimax-nano-usb-ew-7811un-rtl8188cus-chipset/) I successfully turned my Raspberry Pi with an Edimax WiFi dongle into a WiFi hotspot. +Here's how: + +- setup customized hostapd +- setup dhcp server +- configure NAT + +My network layout looked like this: + +``` c +internet - router - Pi - tablet + | + |---- PC +``` + +Now the tablet is able to connect to the PC, but not the other way round. +To fix this, add a route to the PC's IP configuration: + +``` bash +ip route add -net $PI_NETWORK netmask 255.255.255.0 gw $PI_IP +``` + +Replace `$PI_NETWORK` and `$PI_IP` with your own values. diff --git a/content/post/raspberrypi-bootstrapping.md b/content/post/raspberrypi-bootstrapping.md new file mode 100644 index 0000000..20ca0d8 --- /dev/null +++ b/content/post/raspberrypi-bootstrapping.md @@ -0,0 +1,109 @@ +--- +categories: +- embedded +date: 2016-01-30 +title: Installing Arch Linux ARM on a Raspberry Pi +--- + +My cheat sheet for deploying multiple Arch Linux machines, Raspberry Pis here. +Installs `pacserve`, `rngd` and `yaourt` in a btrfs subvolume `root`. To allow local users to poweroff, `polkit` is also installed. + +# Filesystem setup +See also the [Archlinux ARM guide](http://archlinuxarm.org/platforms/armv6/raspberry-pi). + +Change `sdx` to `sdb`/`sdc`/… +``` bash +sudo fdisk /dev/sdx +sudo mkfs.btrfs /dev/sdx2 +sudo mkfs.vfat /dev/sdx1 +mkdir -p tmp/{r,b}oot +cd tmp +sudo mount /dev/sdx2 root +sudo btrfs subvolume create root/root +sudo umount root +``` + +# Copying the files +Use `ArchLinuxARM-rpi-2-latest.tar.gz` for the Raspberry Pi 2 or 3. +``` bash +wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz +sudo mount /dev/sdx1 boot +sudo mount -o subvol=root,autodefrag,compress=lzo /dev/sdx2 root +sudo su -c "bsdtar -xpf ArchLinuxARM-rpi-latest.tar.gz -C root" && sync +sudo mv root/boot/* boot +sudo umount boot +sudo mount /dev/sdx1 root/boot +``` + +# QEMU chroot +[Optional](https://wiki.archlinux.org/index.php/Raspberry_Pi#QEMU_chroot). You can skip this and power the Pi up instead. + +``` bash +sudo cp /usr/bin/qemu-arm-static root/usr/bin +sudo arch-chroot root /bin/bash +``` + +# Configuration +``` bash +echo "root=/dev/mmcblk0p2 rootflags=subvol=root,autodefrag,compress=lzo rw rootwait console=tty1 elevator=deadline" > /boot/cmdline.txt +sed -i "s/gpu_mem=64/gpu_mem=16/" /boot/config.txt + +cat << EOF >> /boot/config.txt +start_file=start_x.elf +fixup_file=fixup_x.dat +start_x=1 +EOF + +sed -i '/\[options\]/a CacheDir = /var/cache/pacman/pkg/' /etc/pacman.conf +sed -i '/\[options\]/a CleanMethod = KeepCurrent' /etc/pacman.conf +cat << EOF >> /etc/pacman.conf +[archlinuxfr] +SigLevel = Never +Server = http://repo.archlinux.fr/arm + +[xyne-any] +Server = http://xyne.archlinux.ca/repos/xyne +EOF +``` + +# Package installation +``` bash +pacman -Syu --needed pacserve git yajl rng-tools polkit archlinuxarm-keyring archlinux-keyring base-devel +systemctl enable pacserve rngd +echo 'RNGD_OPTS="-o /dev/random -r /dev/hwrng"' > /etc/conf.d/rngd +echo "alarm ALL=(ALL) ALL" >> /etc/sudoers +pacman.conf-insert_pacserve > /tmp/pacman.conf +mv /tmp/pacman.conf /etc/pacman.conf +su alarm +cd +git clone https://aur.archlinux.org/package-query.git +cd package-query +makepkg -s +mv package-query*.tar.xz /tmp +cd .. +rm -rf package-query +exit +pacman -U /tmp/package-query*.tar.xz +pacman -S yaourt +exit +``` + +`sudo umount root/boot root` or `reboot` + +# Post installation (on the Pi) +SSH into alarm with password alarm. root password is root, but SSH login for root is by default disabled. +``` bash +sudo hostnamectl set-hostname xxx +sudo timedatectl set-timezone Yourtime/zone +sudo vi /etc/systemd/timesyncd.conf +sudo timedatectl set-ntp true +sudo pacman-key --init +passwd +sudo passwd +``` + +# Troubleshooting +Can't unmount for some reason? Use the hammer (not recommended): `sudo fuser -km mntpoint || sudo umount -l mntpoint` + +# Further information +For more, see [the Arch wiki](https://wiki.archlinux.org/index.php/Raspberry_Pi). diff --git a/content/post/transmission-stalling.md b/content/post/transmission-stalling.md new file mode 100644 index 0000000..4f4df93 --- /dev/null +++ b/content/post/transmission-stalling.md @@ -0,0 +1,10 @@ +--- +categories: +- software +date: 2016-01-02 +title: Fix transmission not downloading anything +--- + +I experienced a weird issue on my NAS where transmission suddenly stopped downloading my torrents. It showed "Downloading from 0 of 0 connected peer(s)" for hours! + +After some experimenting, I found out that in the individual torrent's properties there was the option "Maximum peers", which was apparently set to 1. Increasing it changed everything: Now that torrent had peers and even web seeds. diff --git a/content/post/weather-snowman.md b/content/post/weather-snowman.md new file mode 100644 index 0000000..a5c8ec5 --- /dev/null +++ b/content/post/weather-snowman.md @@ -0,0 +1,38 @@ +--- +categories: +- embedded +date: 2015-12-12 +title: Weather snowman - Embedded LED forecast +--- + +It's christmas time! As a kind of pre-christmas gift, I built an Internet of Things enabled snowman for one of my best friends. + +Like in [my last project]({{< ref "internet-is-magic.md" >}}), I used an ESP8266 again, some LEDs and an old acrylic snowman that I cut open. + + + +_The electronics were cheaper than the snowman._ + +Inside the snowman was a fading RGB led, a switch and batteries. Boring! + +I replaced it with the ESP8266, which had 3 LEDs attached to it (red, green, blue). Via a USB cable and a voltage converter, I powered it: + + + +_Luckily, you don't see how messy it really becomes once you put all this in that tiny snowman…_ + + + +Coding took a while. + +The ESP creates a wireless access point with a web server after powerup and asks you to enter your WiFi credentials. After first setup and whenever the module is started again, it connects to your wireless network and queries [OpenWeatherMap](http://openweathermap.org/) every hour for a 3 hour forecast. + +Depending on the forecast, the blue and red LEDs glow in different patterns. If a rainy day is to be expected, the top red LED lights up and the bottom blue LED fades in and out. A storm at night is displayed via a deep blue head and a blinking snowman's body. + +If you inspect [the source code](https://git.schneefux.xyz/?p=weather-snowman;a=tree), you'll see that there also is an Android app. The app simplifies the setup and runs a background service that makes your snowman's green LED flash on new notifications. + + + +_Gotta check my mails._ + + diff --git a/layouts/_default/list.html b/layouts/_default/list.html new file mode 100644 index 0000000..00e2181 --- /dev/null +++ b/layouts/_default/list.html @@ -0,0 +1,13 @@ +{{ partial "header.html" . }} + + <main role="main"> + <h1 class="list-title">{{ .Title }}</h1> +{{ range .Data.Pages }} + <article itemscope itemtype="http://schema.org/Blog"> + <h2 class="entry-title" itemprop="headline"><a href="{{ .RelPermalink }}">{{ .Title }}{{ if .Draft }} #Draft{{ end }}</a></h2> + <span class="entry-meta"><time itemprop="datePublished" datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "January 02, 2006" }}</time></span> + </article> +{{ end }} + </main> + +{{ partial "footer.html" . }}
\ No newline at end of file diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 0000000..6aadea7 --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,13 @@ +{{ partial "header.html" . }} + + <main role="main"> + <article itemscope itemtype="http://schema.org/BlogPosting"> + <h1 class="entry-title" itemprop="headline">{{ .Title }}</h1> + <span class="entry-meta"><time itemprop="datePublished" datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "January 02, 2006" }}</time></span> + <section itemprop="entry-text"> + {{ .Content }} + </section> + </article> + </main> + +{{ partial "footer.html" . }}
\ No newline at end of file diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..673ab35 --- /dev/null +++ b/layouts/index.html @@ -0,0 +1,12 @@ +{{ partial "header.html" . }} + + <main role="main"> +{{ range (where .Data.Pages ".Params.hidefromhome" "!=" "true") }} + <article itemscope itemtype="http://schema.org/Blog"> + <h2 class="entry-title" itemprop="headline"><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2> + <span class="entry-meta"><time itemprop="datePublished" datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "January 02, 2006" }}</time></span> + </article> +{{ end }} + </main> + +{{ partial "footer.html" . }} diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html new file mode 100644 index 0000000..87a4c15 --- /dev/null +++ b/layouts/partials/footer.html @@ -0,0 +1,10 @@ + <footer role="contentinfo"> + <div class="hr"></div> + <div class="footer-link"> + {{ with .Site.Params.email }}<a href="mailto:{{ . }}" target="_blank">Email</a>{{ end }} + {{ with .Site.Params.github }}<a href="{{ . }}" target="_blank">GitHub</a>{{ end }} + </div> + </footer> +</div> +</body> +</html> diff --git a/layouts/partials/header.html b/layouts/partials/header.html new file mode 100644 index 0000000..f8a935b --- /dev/null +++ b/layouts/partials/header.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html lang="{{ with .Site.LanguageCode }}{{ . }}{{ else }}en-US{{ end }}"> +<head> +<meta charset="utf-8"> +{{ .Hugo.Generator }} +<meta name="viewport" content="width=device-width, initial-scale=1"> +<link rel="stylesheet" href="/css/min.css"> +<link rel="alternate" href="/index.xml" type="application/rss+xml" title="{{ .Site.Title }}"> +<title>{{ $isHomePage := eq .Title .Site.Title }}{{ .Title }}{{ if eq $isHomePage false }} - {{ .Site.Title }}{{ end }}</title> +</head> +<body> + +<div class="container"> + <header role="banner"> + <div class="header-logo"> + <a href="/"><img src="{{ .Site.Params.logo }}" alt="{{ .Site.Title }}"></a> + </div> + {{ if eq $isHomePage true }}<h1 class="site-title">{{ .Site.Title }}</h1>{{ end }} + </header> diff --git a/static/css/custom.css b/static/css/custom.css new file mode 100644 index 0000000..c41a1bf --- /dev/null +++ b/static/css/custom.css @@ -0,0 +1,66 @@ +body { + font-family: "Roboto", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + background-color: #FCFCFC; +} + +h1 { font-size: 2.1rem; } +h2 { font-size: 1.9rem; } +h3 { font-size: 1.7rem; } +h4, +h5, +h6 { font-size: 1.5rem; } + +img { + max-width: 100%; + height: auto; + max-height: 40rem; + vertical-align: middle; + border: 0; +} + +header, +footer { + margin: 4rem 0; + text-align: center; +} + +main { + margin: 4rem 0; +} + +.container { + width: 90%; + max-width: 600px; +} + +.site-title { + margin-top: 2rem; +} + +.entry-title { + margin-bottom: 0; +} + +.entry-title a { + text-decoration: none; +} + +.entry-meta { + display: inline-block; + margin-bottom: 2rem; + font-size: 1.7rem; + color: #888; +} + +.footer-link { + margin: 2rem 0; +} + +.hr { + height: 1px; + margin: 2rem 0; + background: #E1E1E1; + background: -webkit-gradient(linear, left top, right top, from(white), color-stop(#E1E1E1), to(white)); + background: -webkit-linear-gradient(left, white, #E1E1E1, white); + background: linear-gradient(to right, white, #E1E1E1, white); +} diff --git a/static/css/min.css b/static/css/min.css new file mode 100644 index 0000000..2085aea --- /dev/null +++ b/static/css/min.css @@ -0,0 +1 @@ +body{font-family:"Roboto","HelveticaNeue","Helvetica Neue",Helvetica,Arial,sans-serif;background-color:#fcfcfc}h1{font-size:2.1rem}h2{font-size:1.9rem}h3{font-size:1.7rem}h4,h5,h6{font-size:1.5rem}img{max-width:100%;height:auto;max-height:40rem;vertical-align:middle;border:0}header,footer{margin:4rem 0;text-align:center}main{margin:4rem 0}.container{width:90%;max-width:600px}.site-title{margin-top:2rem}.entry-title{margin-bottom:0}.entry-title a{text-decoration:none}.entry-meta{display:inline-block;margin-bottom:2rem;font-size:1.7rem;color:#888}.footer-link{margin:2rem 0}.hr{height:1px;margin:2rem 0;background:#e1e1e1;background:-webkit-gradient(linear,left top,right top,from(white),color-stop(#e1e1e1),to(white));background:-webkit-linear-gradient(left,white,#e1e1e1,white);background:linear-gradient(to right,white,#e1e1e1,white)}/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}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}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}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}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.container{position:relative;width:100%;max-width:960px;margin:0 auto;padding:0 20px;box-sizing:border-box}.column,.columns{width:100%;float:left;box-sizing:border-box}@media(min-width:400px){.container{width:85%;padding:0}}@media(min-width:550px){.container{width:80%}.column,.columns{margin-left:4%}.column:first-child,.columns:first-child{margin-left:0}.one.column,.one.columns{width:4.66666666667%}.two.columns{width:13.3333333333%}.three.columns{width:22%}.four.columns{width:30.6666666667%}.five.columns{width:39.3333333333%}.six.columns{width:48%}.seven.columns{width:56.6666666667%}.eight.columns{width:65.3333333333%}.nine.columns{width:74%}.ten.columns{width:82.6666666667%}.eleven.columns{width:91.3333333333%}.twelve.columns{width:100%;margin-left:0}.one-third.column{width:30.6666666667%}.two-thirds.column{width:65.3333333333%}.one-half.column{width:48%}.offset-by-one.column,.offset-by-one.columns{margin-left:8.66666666667%}.offset-by-two.column,.offset-by-two.columns{margin-left:17.3333333333%}.offset-by-three.column,.offset-by-three.columns{margin-left:26%}.offset-by-four.column,.offset-by-four.columns{margin-left:34.6666666667%}.offset-by-five.column,.offset-by-five.columns{margin-left:43.3333333333%}.offset-by-six.column,.offset-by-six.columns{margin-left:52%}.offset-by-seven.column,.offset-by-seven.columns{margin-left:60.6666666667%}.offset-by-eight.column,.offset-by-eight.columns{margin-left:69.3333333333%}.offset-by-nine.column,.offset-by-nine.columns{margin-left:78%}.offset-by-ten.column,.offset-by-ten.columns{margin-left:86.6666666667%}.offset-by-eleven.column,.offset-by-eleven.columns{margin-left:95.3333333333%}.offset-by-one-third.column,.offset-by-one-third.columns{margin-left:34.6666666667%}.offset-by-two-thirds.column,.offset-by-two-thirds.columns{margin-left:69.3333333333%}.offset-by-one-half.column,.offset-by-one-half.columns{margin-left:52%}}html{font-size:62.5%}body{font-size:1.5em;line-height:1.6;font-weight:400;font-family:"Raleway","HelveticaNeue","Helvetica Neue",Helvetica,Arial,sans-serif;color:#222}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:2rem;font-weight:300}h1{font-size:4rem;line-height:1.2;letter-spacing:-.1rem}h2{font-size:3.6rem;line-height:1.25;letter-spacing:-.1rem}h3{font-size:3rem;line-height:1.3;letter-spacing:-.1rem}h4{font-size:2.4rem;line-height:1.35;letter-spacing:-.08rem}h5{font-size:1.8rem;line-height:1.5;letter-spacing:-.05rem}h6{font-size:1.5rem;line-height:1.6;letter-spacing:0}@media(min-width:550px){h1{font-size:5rem}h2{font-size:4.2rem}h3{font-size:3.6rem}h4{font-size:3rem}h5{font-size:2.4rem}h6{font-size:1.5rem}}p{margin-top:0}a{color:#1eaedb}a:hover{color:#0fa0ce}.button,button,input[type="submit"],input[type="reset"],input[type="button"]{display:inline-block;height:38px;padding:0 30px;color:#555;text-align:center;font-size:11px;font-weight:600;line-height:38px;letter-spacing:.1rem;text-transform:uppercase;text-decoration:none;white-space:nowrap;background-color:transparent;border-radius:4px;border:1px solid #bbb;cursor:pointer;box-sizing:border-box}.button:hover,button:hover,input[type="submit"]:hover,input[type="reset"]:hover,input[type="button"]:hover,.button:focus,button:focus,input[type="submit"]:focus,input[type="reset"]:focus,input[type="button"]:focus{color:#333;border-color:#888;outline:0}.button.button-primary,button.button-primary,input[type="submit"].button-primary,input[type="reset"].button-primary,input[type="button"].button-primary{color:#FFF;background-color:#33c3f0;border-color:#33c3f0}.button.button-primary:hover,button.button-primary:hover,input[type="submit"].button-primary:hover,input[type="reset"].button-primary:hover,input[type="button"].button-primary:hover,.button.button-primary:focus,button.button-primary:focus,input[type="submit"].button-primary:focus,input[type="reset"].button-primary:focus,input[type="button"].button-primary:focus{color:#FFF;background-color:#1eaedb;border-color:#1eaedb}input[type="email"],input[type="number"],input[type="search"],input[type="text"],input[type="tel"],input[type="url"],input[type="password"],textarea,select{height:38px;padding:6px 10px;background-color:#fff;border:1px solid #d1d1d1;border-radius:4px;box-shadow:none;box-sizing:border-box}input[type="email"],input[type="number"],input[type="search"],input[type="text"],input[type="tel"],input[type="url"],input[type="password"],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none}textarea{min-height:65px;padding-top:6px;padding-bottom:6px}input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="text"]:focus,input[type="tel"]:focus,input[type="url"]:focus,input[type="password"]:focus,textarea:focus,select:focus{border:1px solid #33c3f0;outline:0}label,legend{display:block;margin-bottom:.5rem;font-weight:600}fieldset{padding:0;border-width:0}input[type="checkbox"],input[type="radio"]{display:inline}label>.label-body{display:inline-block;margin-left:.5rem;font-weight:normal}ul{list-style:circle inside}ol{list-style:decimal inside}ol,ul{padding-left:0;margin-top:0}ul ul,ul ol,ol ol,ol ul{margin:1.5rem 0 1.5rem 3rem;font-size:90%}li{margin-bottom:1rem}code{padding:.2rem .5rem;margin:0 .2rem;font-size:90%;white-space:nowrap;background:#f1f1f1;border:1px solid #e1e1e1;border-radius:4px}pre>code{display:block;padding:1rem 1.5rem;white-space:pre}th,td{padding:12px 15px;text-align:left;border-bottom:1px solid #e1e1e1}th:first-child,td:first-child{padding-left:0}th:last-child,td:last-child{padding-right:0}button,.button{margin-bottom:1rem}input,textarea,select,fieldset{margin-bottom:1.5rem}pre,blockquote,dl,figure,table,p,ul,ol,form{margin-bottom:2.5rem}.u-full-width{width:100%;box-sizing:border-box}.u-max-full-width{max-width:100%;box-sizing:border-box}.u-pull-right{float:right}.u-pull-left{float:left}hr{margin-top:3rem;margin-bottom:3.5rem;border-width:0;border-top:1px solid #e1e1e1}.container:after,.row:after,.u-cf{content:"";display:table;clear:both}.highlight .hll{background-color:#ffc}.highlight{background:#f0f0f0}.highlight .c{color:#60a0b0;font-style:italic}.highlight .err{border:1px solid red}.highlight .k{color:#007020;font-weight:bold}.highlight .o{color:#666}.highlight .ch{color:#60a0b0;font-style:italic}.highlight .cm{color:#60a0b0;font-style:italic}.highlight .cp{color:#007020}.highlight .cpf{color:#60a0b0;font-style:italic}.highlight .c1{color:#60a0b0;font-style:italic}.highlight .cs{color:#60a0b0;background-color:#fff0f0}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:bold}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:#c65d09;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:purple;font-weight:bold}.highlight .gt{color:#04d}.highlight .kc{color:#007020;font-weight:bold}.highlight .kd{color:#007020;font-weight:bold}.highlight .kn{color:#007020;font-weight:bold}.highlight .kp{color:#007020}.highlight .kr{color:#007020;font-weight:bold}.highlight .kt{color:#902000}.highlight .m{color:#40a070}.highlight .s{color:#4070a0}.highlight .na{color:#4070a0}.highlight .nb{color:#007020}.highlight .nc{color:#0e84b5;font-weight:bold}.highlight .no{color:#60add5}.highlight .nd{color:#555;font-weight:bold}.highlight .ni{color:#d55537;font-weight:bold}.highlight .ne{color:#007020}.highlight .nf{color:#06287e}.highlight .nl{color:#002070;font-weight:bold}.highlight .nn{color:#0e84b5;font-weight:bold}.highlight .nt{color:#062873;font-weight:bold}.highlight .nv{color:#bb60d5}.highlight .ow{color:#007020;font-weight:bold}.highlight .w{color:#bbb}.highlight .mb{color:#40a070}.highlight .mf{color:#40a070}.highlight .mh{color:#40a070}.highlight .mi{color:#40a070}.highlight .mo{color:#40a070}.highlight .sb{color:#4070a0}.highlight .sc{color:#4070a0}.highlight .sd{color:#4070a0;font-style:italic}.highlight .s2{color:#4070a0}.highlight .se{color:#4070a0;font-weight:bold}.highlight .sh{color:#4070a0}.highlight .si{color:#70a0d0;font-style:italic}.highlight .sx{color:#c65d09}.highlight .sr{color:#235388}.highlight .s1{color:#4070a0}.highlight .ss{color:#517918}.highlight .bp{color:#007020}.highlight .vc{color:#bb60d5}.highlight .vg{color:#bb60d5}.highlight .vi{color:#bb60d5}.highlight .il{color:#40a070} diff --git a/static/css/normalize.css b/static/css/normalize.css new file mode 100644 index 0000000..81c6f31 --- /dev/null +++ b/static/css/normalize.css @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +}
\ No newline at end of file diff --git a/static/css/pygments.css b/static/css/pygments.css new file mode 100644 index 0000000..5007fb6 --- /dev/null +++ b/static/css/pygments.css @@ -0,0 +1,65 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f0f0f0; } +.highlight .c { color: #60a0b0; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #60a0b0; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #60a0b0; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #40a070 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #40a070 } /* Literal.Number.Bin */ +.highlight .mf { color: #40a070 } /* Literal.Number.Float */ +.highlight .mh { color: #40a070 } /* Literal.Number.Hex */ +.highlight .mi { color: #40a070 } /* Literal.Number.Integer */ +.highlight .mo { color: #40a070 } /* Literal.Number.Oct */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .il { color: #40a070 } /* Literal.Number.Integer.Long */ diff --git a/static/css/skeleton.css b/static/css/skeleton.css new file mode 100644 index 0000000..f28bf6c --- /dev/null +++ b/static/css/skeleton.css @@ -0,0 +1,418 @@ +/* +* Skeleton V2.0.4 +* Copyright 2014, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 12/29/2014 +*/ + + +/* Table of contents +–––––––––––––––––––––––––––––––––––––––––––––––––– +- Grid +- Base Styles +- Typography +- Links +- Buttons +- Forms +- Lists +- Code +- Tables +- Spacing +- Utilities +- Clearing +- Media Queries +*/ + + +/* Grid +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.container { + position: relative; + width: 100%; + max-width: 960px; + margin: 0 auto; + padding: 0 20px; + box-sizing: border-box; } +.column, +.columns { + width: 100%; + float: left; + box-sizing: border-box; } + +/* For devices larger than 400px */ +@media (min-width: 400px) { + .container { + width: 85%; + padding: 0; } +} + +/* For devices larger than 550px */ +@media (min-width: 550px) { + .container { + width: 80%; } + .column, + .columns { + margin-left: 4%; } + .column:first-child, + .columns:first-child { + margin-left: 0; } + + .one.column, + .one.columns { width: 4.66666666667%; } + .two.columns { width: 13.3333333333%; } + .three.columns { width: 22%; } + .four.columns { width: 30.6666666667%; } + .five.columns { width: 39.3333333333%; } + .six.columns { width: 48%; } + .seven.columns { width: 56.6666666667%; } + .eight.columns { width: 65.3333333333%; } + .nine.columns { width: 74.0%; } + .ten.columns { width: 82.6666666667%; } + .eleven.columns { width: 91.3333333333%; } + .twelve.columns { width: 100%; margin-left: 0; } + + .one-third.column { width: 30.6666666667%; } + .two-thirds.column { width: 65.3333333333%; } + + .one-half.column { width: 48%; } + + /* Offsets */ + .offset-by-one.column, + .offset-by-one.columns { margin-left: 8.66666666667%; } + .offset-by-two.column, + .offset-by-two.columns { margin-left: 17.3333333333%; } + .offset-by-three.column, + .offset-by-three.columns { margin-left: 26%; } + .offset-by-four.column, + .offset-by-four.columns { margin-left: 34.6666666667%; } + .offset-by-five.column, + .offset-by-five.columns { margin-left: 43.3333333333%; } + .offset-by-six.column, + .offset-by-six.columns { margin-left: 52%; } + .offset-by-seven.column, + .offset-by-seven.columns { margin-left: 60.6666666667%; } + .offset-by-eight.column, + .offset-by-eight.columns { margin-left: 69.3333333333%; } + .offset-by-nine.column, + .offset-by-nine.columns { margin-left: 78.0%; } + .offset-by-ten.column, + .offset-by-ten.columns { margin-left: 86.6666666667%; } + .offset-by-eleven.column, + .offset-by-eleven.columns { margin-left: 95.3333333333%; } + + .offset-by-one-third.column, + .offset-by-one-third.columns { margin-left: 34.6666666667%; } + .offset-by-two-thirds.column, + .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } + + .offset-by-one-half.column, + .offset-by-one-half.columns { margin-left: 52%; } + +} + + +/* Base Styles +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* NOTE +html is set to 62.5% so that all the REM measurements throughout Skeleton +are based on 10px sizing. So basically 1.5rem = 15px :) */ +html { + font-size: 62.5%; } +body { + font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ + line-height: 1.6; + font-weight: 400; + font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #222; } + + +/* Typography +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 2rem; + font-weight: 300; } +h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} +h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } +h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } +h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } +h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } +h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } + +/* Larger than phablet */ +@media (min-width: 550px) { + h1 { font-size: 5.0rem; } + h2 { font-size: 4.2rem; } + h3 { font-size: 3.6rem; } + h4 { font-size: 3.0rem; } + h5 { font-size: 2.4rem; } + h6 { font-size: 1.5rem; } +} + +p { + margin-top: 0; } + + +/* Links +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +a { + color: #1EAEDB; } +a:hover { + color: #0FA0CE; } + + +/* Buttons +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.button, +button, +input[type="submit"], +input[type="reset"], +input[type="button"] { + display: inline-block; + height: 38px; + padding: 0 30px; + color: #555; + text-align: center; + font-size: 11px; + font-weight: 600; + line-height: 38px; + letter-spacing: .1rem; + text-transform: uppercase; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border-radius: 4px; + border: 1px solid #bbb; + cursor: pointer; + box-sizing: border-box; } +.button:hover, +button:hover, +input[type="submit"]:hover, +input[type="reset"]:hover, +input[type="button"]:hover, +.button:focus, +button:focus, +input[type="submit"]:focus, +input[type="reset"]:focus, +input[type="button"]:focus { + color: #333; + border-color: #888; + outline: 0; } +.button.button-primary, +button.button-primary, +input[type="submit"].button-primary, +input[type="reset"].button-primary, +input[type="button"].button-primary { + color: #FFF; + background-color: #33C3F0; + border-color: #33C3F0; } +.button.button-primary:hover, +button.button-primary:hover, +input[type="submit"].button-primary:hover, +input[type="reset"].button-primary:hover, +input[type="button"].button-primary:hover, +.button.button-primary:focus, +button.button-primary:focus, +input[type="submit"].button-primary:focus, +input[type="reset"].button-primary:focus, +input[type="button"].button-primary:focus { + color: #FFF; + background-color: #1EAEDB; + border-color: #1EAEDB; } + + +/* Forms +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea, +select { + height: 38px; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + background-color: #fff; + border: 1px solid #D1D1D1; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; } +/* Removes awkward default styles on some inputs for iOS */ +input[type="email"], +input[type="number"], +input[type="search"], +input[type="text"], +input[type="tel"], +input[type="url"], +input[type="password"], +textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } +textarea { + min-height: 65px; + padding-top: 6px; + padding-bottom: 6px; } +input[type="email"]:focus, +input[type="number"]:focus, +input[type="search"]:focus, +input[type="text"]:focus, +input[type="tel"]:focus, +input[type="url"]:focus, +input[type="password"]:focus, +textarea:focus, +select:focus { + border: 1px solid #33C3F0; + outline: 0; } +label, +legend { + display: block; + margin-bottom: .5rem; + font-weight: 600; } +fieldset { + padding: 0; + border-width: 0; } +input[type="checkbox"], +input[type="radio"] { + display: inline; } +label > .label-body { + display: inline-block; + margin-left: .5rem; + font-weight: normal; } + + +/* Lists +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +ul { + list-style: circle inside; } +ol { + list-style: decimal inside; } +ol, ul { + padding-left: 0; + margin-top: 0; } +ul ul, +ul ol, +ol ol, +ol ul { + margin: 1.5rem 0 1.5rem 3rem; + font-size: 90%; } +li { + margin-bottom: 1rem; } + + +/* Code +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +code { + padding: .2rem .5rem; + margin: 0 .2rem; + font-size: 90%; + white-space: nowrap; + background: #F1F1F1; + border: 1px solid #E1E1E1; + border-radius: 4px; } +pre > code { + display: block; + padding: 1rem 1.5rem; + white-space: pre; } + + +/* Tables +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +th, +td { + padding: 12px 15px; + text-align: left; + border-bottom: 1px solid #E1E1E1; } +th:first-child, +td:first-child { + padding-left: 0; } +th:last-child, +td:last-child { + padding-right: 0; } + + +/* Spacing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +button, +.button { + margin-bottom: 1rem; } +input, +textarea, +select, +fieldset { + margin-bottom: 1.5rem; } +pre, +blockquote, +dl, +figure, +table, +p, +ul, +ol, +form { + margin-bottom: 2.5rem; } + + +/* Utilities +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +.u-full-width { + width: 100%; + box-sizing: border-box; } +.u-max-full-width { + max-width: 100%; + box-sizing: border-box; } +.u-pull-right { + float: right; } +.u-pull-left { + float: left; } + + +/* Misc +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +hr { + margin-top: 3rem; + margin-bottom: 3.5rem; + border-width: 0; + border-top: 1px solid #E1E1E1; } + + +/* Clearing +–––––––––––––––––––––––––––––––––––––––––––––––––– */ + +/* Self Clearing Goodness */ +.container:after, +.row:after, +.u-cf { + content: ""; + display: table; + clear: both; } + + +/* Media Queries +–––––––––––––––––––––––––––––––––––––––––––––––––– */ +/* +Note: The best way to structure the use of media queries is to create the queries +near the relevant code. For example, if you wanted to change the styles for buttons +on small devices, paste the mobile query code up in the buttons section and style it +there. +*/ + + +/* Larger than mobile */ +@media (min-width: 400px) {} + +/* Larger than phablet (also point when grid becomes active) */ +@media (min-width: 550px) {} + +/* Larger than tablet */ +@media (min-width: 750px) {} + +/* Larger than desktop */ +@media (min-width: 1000px) {} + +/* Larger than Desktop HD */ +@media (min-width: 1200px) {} diff --git a/static/downloads/blinkiecar/.directory b/static/downloads/blinkiecar/.directory new file mode 100644 index 0000000..288ebfd --- /dev/null +++ b/static/downloads/blinkiecar/.directory @@ -0,0 +1,4 @@ +[Dolphin] +PreviewsShown=true +Timestamp=2015,12,29,14,11,18 +Version=3 diff --git a/static/downloads/blinkiecar/blink-both.gif b/static/downloads/blinkiecar/blink-both.gif Binary files differnew file mode 100644 index 0000000..195a8df --- /dev/null +++ b/static/downloads/blinkiecar/blink-both.gif diff --git a/static/downloads/blinkiecar/blink-right.gif b/static/downloads/blinkiecar/blink-right.gif Binary files differnew file mode 100644 index 0000000..cb1b915 --- /dev/null +++ b/static/downloads/blinkiecar/blink-right.gif diff --git a/static/downloads/blinkiecar/finished-front.jpg b/static/downloads/blinkiecar/finished-front.jpg Binary files differnew file mode 100644 index 0000000..61ae638 --- /dev/null +++ b/static/downloads/blinkiecar/finished-front.jpg diff --git a/static/downloads/blinkiecar/magnet.jpg b/static/downloads/blinkiecar/magnet.jpg Binary files differnew file mode 100644 index 0000000..b1cbe31 --- /dev/null +++ b/static/downloads/blinkiecar/magnet.jpg diff --git a/static/downloads/blinkiecar/wip.jpg b/static/downloads/blinkiecar/wip.jpg Binary files differnew file mode 100644 index 0000000..b6a0485 --- /dev/null +++ b/static/downloads/blinkiecar/wip.jpg diff --git a/static/downloads/internet-is-magic/fluttershy-glow.jpg b/static/downloads/internet-is-magic/fluttershy-glow.jpg Binary files differnew file mode 100644 index 0000000..8853a8c --- /dev/null +++ b/static/downloads/internet-is-magic/fluttershy-glow.jpg diff --git a/static/downloads/internet-is-magic/inside.jpg b/static/downloads/internet-is-magic/inside.jpg Binary files differnew file mode 100644 index 0000000..01b4b19 --- /dev/null +++ b/static/downloads/internet-is-magic/inside.jpg diff --git a/static/downloads/internet-is-magic/night.jpg b/static/downloads/internet-is-magic/night.jpg Binary files differnew file mode 100644 index 0000000..f6b1e69 --- /dev/null +++ b/static/downloads/internet-is-magic/night.jpg diff --git a/static/downloads/internet-is-magic/twilight-fluttershy.jpg b/static/downloads/internet-is-magic/twilight-fluttershy.jpg Binary files differnew file mode 100644 index 0000000..c21c265 --- /dev/null +++ b/static/downloads/internet-is-magic/twilight-fluttershy.jpg diff --git a/static/downloads/internet-is-magic/twilight-glow.jpg b/static/downloads/internet-is-magic/twilight-glow.jpg Binary files differnew file mode 100644 index 0000000..f23e183 --- /dev/null +++ b/static/downloads/internet-is-magic/twilight-glow.jpg diff --git a/static/downloads/music-led/controller-failed.jpg b/static/downloads/music-led/controller-failed.jpg Binary files differnew file mode 100644 index 0000000..86701b6 --- /dev/null +++ b/static/downloads/music-led/controller-failed.jpg diff --git a/static/downloads/music-led/led-floor.jpg b/static/downloads/music-led/led-floor.jpg Binary files differnew file mode 100644 index 0000000..0d4cb70 --- /dev/null +++ b/static/downloads/music-led/led-floor.jpg diff --git a/static/downloads/weather-snowman/.directory b/static/downloads/weather-snowman/.directory new file mode 100644 index 0000000..55996e1 --- /dev/null +++ b/static/downloads/weather-snowman/.directory @@ -0,0 +1,4 @@ +[Dolphin] +PreviewsShown=true +Timestamp=2015,12,26,12,1,41 +Version=3 diff --git a/static/downloads/weather-snowman/leds-esp.jpg b/static/downloads/weather-snowman/leds-esp.jpg Binary files differnew file mode 100644 index 0000000..266dbc3 --- /dev/null +++ b/static/downloads/weather-snowman/leds-esp.jpg diff --git a/static/downloads/weather-snowman/leds.jpg b/static/downloads/weather-snowman/leds.jpg Binary files differnew file mode 100644 index 0000000..22efac5 --- /dev/null +++ b/static/downloads/weather-snowman/leds.jpg diff --git a/static/downloads/weather-snowman/snowman-blink.jpg b/static/downloads/weather-snowman/snowman-blink.jpg Binary files differnew file mode 100644 index 0000000..61c5004 --- /dev/null +++ b/static/downloads/weather-snowman/snowman-blink.jpg diff --git a/static/downloads/weather-snowman/snowman-glowblue.jpg b/static/downloads/weather-snowman/snowman-glowblue.jpg Binary files differnew file mode 100644 index 0000000..6ed703d --- /dev/null +++ b/static/downloads/weather-snowman/snowman-glowblue.jpg diff --git a/static/downloads/weather-snowman/snowman-glowbluered.jpg b/static/downloads/weather-snowman/snowman-glowbluered.jpg Binary files differnew file mode 100644 index 0000000..b2e99d8 --- /dev/null +++ b/static/downloads/weather-snowman/snowman-glowbluered.jpg diff --git a/static/logo.svg b/static/logo.svg new file mode 100644 index 0000000..28cfd3b --- /dev/null +++ b/static/logo.svg @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="Layer_1" + x="0px" + y="0px" + width="75.000809" + height="72" + viewBox="0 0 75.000809 72" + enable-background="new 0 0 128 128" + xml:space="preserve" + inkscape:version="0.91 r13725" + sodipodi:docname="logo.svg" + inkscape:export-filename="/home/timo/Downloads/fox.svg.png" + inkscape:export-xdpi="599.99353" + inkscape:export-ydpi="599.99353"><metadata + id="metadata45"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs43" /><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1870" + inkscape:window-height="1051" + id="namedview41" + showgrid="false" + inkscape:zoom="3.0069444" + inkscape:cx="16.728618" + inkscape:cy="11.262279" + inkscape:window-x="50" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /><g + id="g3" + transform="translate(-26.499596,-24)"><path + d="M 96.5,69.055 C 95.125,65.485 94,60.625 94,51.91 l -30,0 -30,0 c 0,8.715 -1.125,13.572 -2.5,17.145 -1.375,3.571 2.79,6.639 5.725,8.9 C 48.625,86.75 49.625,96 64,96 c 14.375,0 15.375,-9.25 26.775,-18.045 2.935,-2.264 7.1,-5.33 5.725,-8.9 z" + id="path9" + inkscape:connector-curvature="0" + style="fill:#e6e6e6" /><path + d="M 96.5,69.055 C 95.125,65.485 94,60.625 94,51.91 l -3,0 c 0,8.715 1.125,13.572 2.5,17.145 1.375,3.571 -2.79,6.639 -5.725,8.9 C 76.786,86.434 75.456,95.33 62.5,95.961 62.985,95.984 63.481,96 64,96 c 14.375,0 15.375,-9.25 26.775,-18.045 2.935,-2.264 7.1,-5.33 5.725,-8.9 z" + id="path11" + inkscape:connector-curvature="0" + style="fill:#cccccc" /><g + id="g13"><circle + cx="74.75" + cy="64.25" + r="5" + id="circle15" + style="fill:#f5f5f5" /><circle + cx="74.75" + cy="64.25" + r="3" + id="circle17" + style="fill:#242424" /></g><g + id="g19"><circle + cx="52.75" + cy="64.25" + r="5" + id="circle21" + style="fill:#f5f5f5" /><circle + cx="52.75" + cy="64.25" + r="3" + id="circle23" + style="fill:#242424" /></g><g + id="g25"><path + d="M 100.785,24.75 C 100.316,24.269 99.672,24 99,24 91.549,24 79.041,28.768 71.148,35.955 69.15,34.76 66.707,34 64,34 61.293,34 58.849,34.76 56.85,35.955 48.956,28.768 36.449,24 29,24 c -0.672,0 -1.316,0.269 -1.785,0.752 -0.471,0.479 -0.727,1.128 -0.715,1.797 0.119,5.908 2.859,13.047 5.273,19.352 0.809,2.104 1.587,7.136 2.227,9.011 26.5,-0.494 25,23.756 25,31.588 l 10.016,0 C 69.016,78.67 67.518,54.43 94,54.912 l 0,-3 c 0.641,-1.877 1.421,-3.911 2.229,-6.017 2.416,-6.299 5.154,-13.438 5.271,-19.346 0.012,-0.672 -0.244,-1.319 -0.715,-1.799 z" + id="path27" + inkscape:connector-curvature="0" + style="fill:#cc803d" /></g><path + d="m 70.096,36.895 c 0.354,-0.319 0.725,-0.63 1.092,-0.938 -1.916,-1.185 -4.75,-1.955 -7.188,-1.955 -0.511,0 -1.009,0.035 -1.5,0.087 2.109,0.222 5.977,1.836 7.596,2.806 z" + id="path29" + inkscape:connector-curvature="0" + style="fill:#b37035" /><path + d="M 100.785,24.75 C 100.316,24.269 99.672,24 99,24 c -0.695,0 -1.445,0.055 -2.223,0.136 0.377,0.124 0.727,0.325 1.008,0.614 0.471,0.48 0.727,1.127 0.715,1.799 -0.117,5.906 -2.855,13.047 -5.271,19.346 -0.809,2.104 -1.59,4.14 -2.229,6.017 l 0,3 C 64.518,54.43 66.016,78.67 66.016,86.5 l 3,0 C 69.016,78.67 67.518,54.43 94,54.912 l 0,-3 c 0.641,-1.877 1.421,-3.911 2.229,-6.017 2.416,-6.299 5.153,-13.438 5.271,-19.346 0.012,-0.672 -0.244,-1.319 -0.715,-1.799 z" + id="path31" + inkscape:connector-curvature="0" + style="fill:#b37035" /><path + d="M 54.804,36.895 C 55.402,36.54 56.178,36.226 56.85,35.957 48.771,28.668 36.375,24 29,24 c -0.268,0 -0.528,0.054 -0.777,0.136 7.533,0.788 19.423,6.242 26.581,12.759 z" + id="path33" + inkscape:connector-curvature="0" + style="fill:#b37035" /><path + d="m 64,94 c -2.5,-2.5 -5,-4.744 -5,-7.502 0,-2.757 2.244,-4.998 5,-4.998 2.756,0 5,2.241 5,4.998 0,2.758 -2.5,5.002 -5,7.502 z" + id="path35" + inkscape:connector-curvature="0" + style="fill:#242424" /><path + d="m 96.5,29 c -2.5,0 -15,2.5 -17.5,7.5 2.5,2.5 12.5,10 12.5,10 2.5,-5 5,-15 5,-17.5 z" + id="path37" + inkscape:connector-curvature="0" + style="fill:#b36624" /><path + d="m 31.5,29 c 2.5,0 15,2.5 17.5,7.5 -2.5,2.5 -12.5,10 -12.5,10 -2.5,-5 -5,-15 -5,-17.5 z" + id="path39" + inkscape:connector-curvature="0" + style="fill:#b36624" /></g></svg>
\ No newline at end of file |
