dot

packages and services management
Log | Files | Refs | README

commit f9f43bb80bc3cc1ccce440612c991c6b3793e0bd
parent fb7315b04885e34623a1640e82b6a7a4889fe797
Author: Josuah Demangeon <mail@josuah.net>
Date:   Thu,  2 Nov 2017 21:50:10 +0100

single dotfile repo

Diffstat:
Abin/80 | 14++++++++++++++
Abin/README | 11+++++++++++
Abin/adagio | 238+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/blih | 284+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/calendar-import | 43+++++++++++++++++++++++++++++++++++++++++++
Abin/calendar-show | 46++++++++++++++++++++++++++++++++++++++++++++++
Abin/calendar-update | 5+++++
Abin/cl | 3+++
Abin/color | 6++++++
Abin/dns-used-tld | 42++++++++++++++++++++++++++++++++++++++++++
Abin/doc-rfc | 6++++++
Abin/dropbox | 1537+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/edit | 3+++
Abin/epih | 10++++++++++
Abin/extract | 20++++++++++++++++++++
Abin/fmt | 2++
Abin/fun-dna | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/fun-dump | 17+++++++++++++++++
Abin/fun-fullwidth | 11+++++++++++
Abin/fun-mirror | 2++
Abin/fun-piano | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/fun-psyche | 421+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/fun-reverse | 20++++++++++++++++++++
Abin/fun-saber | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/fun-troll | 21+++++++++++++++++++++
Abin/git-all | 13+++++++++++++
Abin/git-count | 6++++++
Abin/git-index | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/git-index.1 | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/git-repos | 17+++++++++++++++++
Abin/git-status | 48++++++++++++++++++++++++++++++++++++++++++++++++
Abin/git-sync | 7+++++++
Abin/http-ip | 2++
Abin/http-ix | 2++
Abin/http-w1r3 | 3+++
Abin/http-wttr | 3+++
Abin/ii-client | 11+++++++++++
Abin/io | 27+++++++++++++++++++++++++++
Abin/io-cache | 32++++++++++++++++++++++++++++++++
Abin/io-mail | 11+++++++++++
Abin/io-netstat | 3+++
Abin/io-ps | 6++++++
Abin/io-src | 9+++++++++
Abin/ipconv | 33+++++++++++++++++++++++++++++++++
Abin/l | 14++++++++++++++
Abin/lines | 3+++
Abin/mblaze-filter | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/monitor | 13+++++++++++++
Abin/monitor-plot | 47+++++++++++++++++++++++++++++++++++++++++++++++
Abin/monitor-step | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/package | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/play | 3+++
Abin/plot | 42++++++++++++++++++++++++++++++++++++++++++
Abin/printree | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/qemu-start | 6++++++
Abin/s | 3+++
Abin/sane-name | 14++++++++++++++
Abin/screen-brightness | 2++
Abin/screen-cast | 8++++++++
Abin/screen-rotate | 16++++++++++++++++
Abin/store | 21+++++++++++++++++++++
Abin/term-inv | 2++
Abin/term-name | 3+++
Abin/tty-theme | 373+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/tty-video | 8++++++++
Abin/txt | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/wifi | 14++++++++++++++
Abin/www | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/www.1 | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abin/xdg-open | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acron/git | 1+
Acron/monitor | 1+
Adot/asoundrc | 10++++++++++
Adot/bashrc | 22++++++++++++++++++++++
Adot/emacs.d/init.el | 284+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adot/emacs.d/lisp/std.el | 21+++++++++++++++++++++
Adot/emacs.d/lisp/std_comment.el | 184+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adot/exrc | 3+++
Adot/gitconfig | 10++++++++++
Adot/gitignore | 1+
Adot/mblaze/profile | 2++
Adot/mbsyncrc | 19+++++++++++++++++++
Adot/mg | 2++
Adot/mpoprc | 14++++++++++++++
Adot/msmtprc | 12++++++++++++
Adot/profile | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adot/ssh/config | 27+++++++++++++++++++++++++++
Adot/vim/vimrc | 26++++++++++++++++++++++++++
Adot/xinitrc | 24++++++++++++++++++++++++
Afonts/ter-v12n.psf | 0
Afonts/ter-v14b.psf | 0
Afonts/ter-v14n.psf | 0
Afonts/ter-v16b.psf | 0
Afonts/ter-v16n.psf | 0
Afonts/ter-v18b.psf | 0
Afonts/ter-v18n.psf | 0
Afonts/ter-v20b.psf | 0
Afonts/ter-v20n.psf | 0
Afonts/ter-v22b.psf | 0
Afonts/ter-v22n.psf | 0
Afonts/ter-v24b.psf | 0
Afonts/ter-v24n.psf | 0
Afonts/ter-v28b.psf | 0
Afonts/ter-v28n.psf | 0
Afonts/ter-v32b.psf | 0
Afonts/ter-v32n.psf | 0
Ainetd/popa3d | 1+
Ainetd/u9fs | 1+
Ainstall | 35+++++++++++++++++++++++++++++++++++
Aio/9p | 2++
Aio/cal | 7+++++++
Aio/gopher | 13+++++++++++++
Aio/http | 22++++++++++++++++++++++
Aio/irc | 7+++++++
Aio/sftp | 2++
Aio/ssh | 7+++++++
Aman/ascii.7 | 46++++++++++++++++++++++++++++++++++++++++++++++
R9pfs/build -> package/9pfs/build | 0
R9pfs/git -> package/9pfs/git | 0
Rabduco/config.mk -> package/abduco/config.mk | 0
Rabduco/tar -> package/abduco/tar | 0
Rbtpd/tar -> package/btpd/tar | 0
Rbusybox/build -> package/busybox/build | 0
Rbusybox/kconfig.default -> package/busybox/kconfig.default | 0
Rbusybox/patch.sh -> package/busybox/patch.sh | 0
Rbusybox/tar -> package/busybox/tar | 0
Rcgo/build -> package/cgo/build | 0
Rcgo/tar -> package/cgo/tar | 0
Rcurl/tar -> package/curl/tar | 0
Rdmenu/build -> package/dmenu/build | 0
Rdmenu/tar -> package/dmenu/tar | 0
Rdvtm/config.h -> package/dvtm/config.h | 0
Rdvtm/git -> package/dvtm/git | 0
Rdwm/config.h -> package/dwm/config.h | 0
Rdwm/config.mk -> package/dwm/config.mk | 0
Rdwm/tar -> package/dwm/tar | 0
Re2fsprogs/build -> package/e2fsprogs/build | 0
Re2fsprogs/patch.sh -> package/e2fsprogs/patch.sh | 0
Re2fsprogs/tar -> package/e2fsprogs/tar | 0
Red/build -> package/ed/build | 0
Red/git -> package/ed/git | 0
Renchive/build -> package/enchive/build | 0
Renchive/tar -> package/enchive/tar | 0
Rentr/build -> package/entr/build | 0
Rentr/tar -> package/entr/tar | 0
Rex-vi/build -> package/ex-vi/build | 0
Rex-vi/tar -> package/ex-vi/tar | 0
Rffmpeg/tar -> package/ffmpeg/tar | 0
Rfreebsd/git -> package/freebsd/git | 0
Rfw-b43/build -> package/fw-b43/build | 0
Rfw-b43/tar -> package/fw-b43/tar | 0
Rgeomyidae/tar -> package/geomyidae/tar | 0
Rgit/build -> package/git/build | 0
Rgit/tar -> package/git/tar | 0
Rii/git -> package/ii/git | 0
Rii/tar -> package/ii/tar | 0
Riomenu/git -> package/iomenu/git | 0
Rired/tar -> package/ired/tar | 0
Rjq/tar -> package/jq/tar | 0
Rless/tar -> package/less/tar | 0
Rlibbearssl/build -> package/libbearssl/build | 0
Rlibbearssl/tar -> package/libbearssl/tar | 0
Rlibcurses/git -> package/libcurses/git | 0
Rlibixp/tar -> package/libixp/tar | 0
Rliblzma/tar -> package/liblzma/tar | 0
Rlibmusl/build -> package/libmusl/build | 0
Rlibmusl/tar -> package/libmusl/tar | 0
Rlibopus/build -> package/libopus/build | 0
Rlibopus/tar -> package/libopus/tar | 0
Rlibowfat/tar -> package/libowfat/tar | 0
Rlibressl/tar -> package/libressl/tar | 0
Rlibsodium/tar -> package/libsodium/tar | 0
Rlibtool/tar -> package/libtool/tar | 0
Rlibtox/build -> package/libtox/build | 0
Rlibtox/tar -> package/libtox/tar | 0
Rlibvpx/build -> package/libvpx/build | 0
Rlibvpx/tar -> package/libvpx/tar | 0
Rlibz/tar -> package/libz/tar | 0
Rlinux/build -> package/linux/build | 0
Rlinux/crusoe-nopl-emu.patch -> package/linux/crusoe-nopl-emu.patch | 0
Rlinux/kconfig.sabotage -> package/linux/kconfig.sabotage | 0
Rlinux/patch.sh -> package/linux/patch.sh | 0
Rlinux/tar -> package/linux/tar | 0
Rlr/git -> package/lr/git | 0
Rm4/tar -> package/m4/tar | 0
Rman-freebsd/tar -> package/man-freebsd/tar | 0
Rman-linux/tar -> package/man-linux/tar | 0
Rman-openbsd/tar -> package/man-openbsd/tar | 0
Rman-plan9/tar -> package/man-plan9/tar | 0
Rman-posix/build -> package/man-posix/build | 0
Rman-posix/tar -> package/man-posix/tar | 0
Rmandoc/build -> package/mandoc/build | 0
Rmandoc/tar -> package/mandoc/tar | 0
Rmblaze/build -> package/mblaze/build | 0
Rmblaze/tar -> package/mblaze/tar | 0
Rmbsync/build -> package/mbsync/build | 0
Rmbsync/tar -> package/mbsync/tar | 0
Rmg/tar -> package/mg/tar | 0
Rmpop/build -> package/mpop/build | 0
Rmpop/tar -> package/mpop/tar | 0
Rmsmtp/build -> package/msmtp/build | 0
Rmsmtp/tar -> package/msmtp/tar | 0
Rmupdf/build -> package/mupdf/build | 0
Rmupdf/tar -> package/mupdf/tar | 0
Rnafe/build -> package/nafe/build | 0
Rnafe/tar -> package/nafe/tar | 0
Rngircd/build -> package/ngircd/build | 0
Rngircd/tar -> package/ngircd/tar | 0
Ropenbsd/git -> package/openbsd/git | 0
Ropenssh/build -> package/openssh/build | 0
Ropenssh/build.nero -> package/openssh/build.nero | 0
Ropenssh/openssh-sys_param.patch -> package/openssh/openssh-sys_param.patch | 0
Ropenssh/tar -> package/openssh/tar | 0
Ropentracker/build -> package/opentracker/build | 0
Ropentracker/git -> package/opentracker/git | 0
Rpopa3d/tar -> package/popa3d/tar | 0
Rquark/config.h -> package/quark/config.h | 0
Rquark/configure -> package/quark/configure | 0
Rquark/git -> package/quark/git | 0
Rratox/config.mk -> package/ratox/config.mk | 0
Rratox/git -> package/ratox/git | 0
Rratox/tar -> package/ratox/tar | 0
Rreflex/build -> package/reflex/build | 0
Rreflex/tar -> package/reflex/tar | 0
Rretawq/build -> package/retawq/build | 0
Rretawq/tar -> package/retawq/tar | 0
Rrsync/build -> package/rsync/build | 0
Rrsync/rsync-fix-proto.h-tstamp-target.patch -> package/rsync/rsync-fix-proto.h-tstamp-target.patch | 0
Rrsync/tar -> package/rsync/tar | 0
Rrunit/build -> package/runit/build | 0
Rrunit/tar -> package/runit/tar | 0
Rrwc/build -> package/rwc/build | 0
Rrwc/git -> package/rwc/git | 0
Rsacc/git -> package/sacc/git | 0
Rsam/build -> package/sam/build | 0
Rsam/git -> package/sam/git | 0
Rsbase/git -> package/sbase/git | 0
Rscc/git -> package/scc/git | 0
Rscron/git -> package/scron/git | 0
Rscron/tar -> package/scron/tar | 0
Rsent/tar -> package/sent/tar | 0
Rslock/git -> package/slock/git | 0
Rslstatus/config.h -> package/slstatus/config.h | 0
Rslstatus/git -> package/slstatus/git | 0
Rst/build -> package/st/build | 0
Rst/config.mk -> package/st/config.mk | 0
Rst/st-scrollback-0.7.diff -> package/st/st-scrollback-0.7.diff | 0
Rst/tar -> package/st/tar | 0
Rstunnel/build -> package/stunnel/build | 0
Rstunnel/tar -> package/stunnel/tar | 0
Rsyslinux/build -> package/syslinux/build | 0
Rsyslinux/patch.sh -> package/syslinux/patch.sh | 0
Rsyslinux/tar -> package/syslinux/tar | 0
Rtcpdump/tar -> package/tcpdump/tar | 0
Rtonic-init/build.sh -> package/tonic-init/build.sh | 0
Rtonic-init/init.c -> package/tonic-init/init.c | 0
Rtonic-init/linuxrc -> package/tonic-init/linuxrc | 0
Rtonic-init/rc.init -> package/tonic-init/rc.init | 0
Rtonic-init/rc.shutdown -> package/tonic-init/rc.shutdown | 0
Runbound/tar -> package/unbound/tar | 0
Rxe/git -> package/xe/git | 0
Ryacc/tar -> package/yacc/tar | 0
Ryasm/tar -> package/yasm/tar | 0
Aservices/u9fs | 1+
Asv/.gitignore | 1+
Asv/bot/run | 2++
Asv/git/run | 2++
Asv/ii/irc.cyberia.is/run | 8++++++++
Asv/ii/irc.epita.rezosup.org/run | 8++++++++
Asv/ii/irc.freenode.net/run | 8++++++++
Asv/ii/irc.nixers.net/run | 8++++++++
Asv/ii/irc.oftc.net/run | 9+++++++++
Asv/monitor/run | 2++
Asv/ngircd/conf | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asv/ngircd/motd | 10++++++++++
Asv/ngircd/run | 2++
Asv/opentracker/run | 2++
Asv/quark/run | 2++
Asv/ratox/run | 4++++
Asv/scron/run | 2++
280 files changed, 5800 insertions(+), 0 deletions(-)

diff --git a/bin/80 b/bin/80 @@ -0,0 +1,14 @@ +#!/bin/sh +awk ' + +BEGIN { ARGC = 1 } + +{ + sub(" *\\" ARGV[2] "*$", " ", $0) + line = $0 + for (i = 80 - length($0); i > 0; i--) + line = line ARGV[2] + print line +} + +' - "${1:--}" diff --git a/bin/README b/bin/README @@ -0,0 +1,11 @@ +#!/bin/sh +bin - shell scripts +-------------------------------------------------------------------------------- + +Collection of wrappers and other POSIX sh scripts. + +--- 1 -- system programs ------------------------------------------------------- + +[package] A package manager that download program from an url in ~/pkg/tar +or ~/pkg/git into ~/src/<package>, then compile it in ~/opt/<package>, to +finally symlink it in ~/usr. diff --git a/bin/adagio b/bin/adagio @@ -0,0 +1,238 @@ +#!/bin/sh +# Albinoni, Adagio fog G minor adapted to 'beep' + + +# notes frequencies + +C0=16 Cd0=17 Db0=17 D0=18 Dd0=19 Eb0=19 E0=21 F0=22 Fd0=23 +Gb0=23 G0=25 Gd0=26 Ab0=26 A0=28 Ad0=29 Bb0=29 B0=31 +C1=33 Cd1=35 Db1=35 D1=37 Dd1=39 Eb1=39 E1=41 F1=44 Fd1=46 +Gb1=46 G1=49 Gd1=52 Ab1=52 A1=55 Ad1=58 Bb1=58 B1=62 +C2=65 Cd2=69 Db2=69 D2=73 Dd2=78 Eb2=78 E2=82 F2=87 Fd2=93 +Gb2=93 G2=98 Gd2=104 Ab2=104 A2=110 Ad2=117 Bb2=117 B2=123 +C3=131 Cd3=139 Db3=139 D3=147 Dd3=156 Eb3=156 E3=165 F3=175 Fd3=185 +Gb3=185 G3=196 Gd3=208 Ab3=208 A3=220 Ad3=233 Bb3=233 B3=247 +C4=262 Cd4=277 Db4=277 D4=294 Dd4=311 Eb4=311 E4=330 F4=349 Fd4=370 +Gb4=370 G4=392 Gd4=415 Ab4=415 A4=440 Ad4=466 Bb4=466 B4=494 +C5=523 Cd5=554 Db5=554 D5=587 Dd5=622 Eb5=622 E5=659 F5=698 Fd5=740 +Gb5=740 G5=784 Gd5=831 Ab5=831 A5=880 Ad5=932 Bb5=932 B5=988 +C6=1047 Cd6=1109 Db6=1109 D6=1175 Dd6=1245 Eb6=1245 E6=1319 F6=1397 Fd6=1480 +Gb6=1480 G6=1568 Gd6=1661 Ab6=1661 A6=1760 Ad6=1865 Bb6=1865 B6=1976 +C7=2093 Cd7=2217 Db7=2217 D7=2349 Dd7=2489 Eb7=2489 E7=2637 F7=2794 Fd7=2960 +Gb7=2960 G7=3136 Gd7=3322 Ab7=3322 A7=3520 Ad7=3729 Bb7=3729 B7=3951 +C8=4186 Cd8=4435 Db8=4435 D8=4699 Dd8=4978 Eb8=4978 E8=5274 F8=5588 Fd8=5920 +Gb8=5920 G8=6272 Gd8=6645 Ab8=6645 A8=7040 Ad8=7459 Bb8=7459 B8=7902 + + +# music score + +# with $n the note from above, and $d the duration in millisecond. +# Use '1' for silent note. + +# 4:3 in the original score, but here, full mesure is 12. 6 mesure per line. +# In addition, some "interpretation" are added, as in a performance. + +# | | | | | | +n="$n $G3 $G3 $A3 $Ad3 $G3 " +d="$d 36 2 2 26 6 " +# | | | | | | +n="$n $G3 $A3 $Ad3 $C4 " +d="$d 36 2 2 56 " +# | | | | | | +n="$n $G3 $A3 $Ad3 $A3 $Ad3 " +d="$d 6 6 2 2 38 " +# | | | | | | +n="$n $G3 $A3 $G3 $A3 $G3 $Fd3 $G3 " +d="$d 6 2 2 12 4 4 36 " +# | | | | | | + +# | | | | | | +n="$n $D4 $C4 $Ad3 $A3 $G3 $G3 $Fd3 " +d="$d 12 8 4 8 4 24 12 " +# | | | | | | +n="$n $Dd4 $D4 $C4 $Ad3 $A3 $A3 $G3 " +d="$d 12 8 4 8 4 24 12 " +# | | | | | | +n="$n $G4 $F4 $G4 $Dd4 $F4 $D4 $Dd4 " +d="$d 12 6 6 4 4 4 36 " +# | | | | | | +n="$n $F4 $Dd4 $F4 $D4 $Dd4 $C4 $D4 " +d="$d 12 6 6 4 4 4 36 " +# | | | | | | +n="$n $Dd4 $D4 $Dd4 $C4 $D4 $Ad4 $C4 " +d="$d 12 6 6 4 4 4 36 " +# | | | | | | +n="$n $D4 $Dd4 1 $D4 1 " +d="$d 30 6 12 24 12 " +# | | | | | | + +# | | | | | | +n="$n $G4 $A4 $Ad4 $A4 $G4 $Fd4 $G4 1 $F4 " +d="$d 6 6 7 5 5 6 6 12 24 " +# | | | | | | +n="$n $F4 $G4 $Gd4 1 $G4 $F4 $Dd4 $C4 $Dd4 $G4 $D4 $Ad3" +d="$d 1 1 4 4 1 2 18 5 8 4 24 5 " +# | | | | | | +n="$n $D4 $G4 $C4 $C4 $D4 $Dd4 1 $D4 $C4 $Ad3 " +d="$d 8 4 24 1 1 4 4 1 2 24 " +# | | | | | | +n="$n $Ad3 $C4 $D4 1 $C4 $Ad3 $A3 $A3 $Ad3 $C4 1 $Ad3 $A3 $G3 " +d="$d 1 1 4 4 1 2 24 1 1 4 4 1 3 24 " +# | | | | | | + +# +n="$n 1 $G3 $Gd3 $G3 $Fd3 $G3 $F3 $Dd3 $D3 $Dd3 $F3 $Dd3 $D3 $Dd3 $D3 $C3 $B3 $C3 $D3 1" +d="$d 4 8 7 6 5 4 3 3 3 3 4 4 3 4 5 6 7 8 16 4" +# +n="$n 1 $G3 $Gd3 $G3 $Fd3 $G3 $F3 $Dd3 $D3 $Dd3 $F3 $Dd3 $D3 $Dd3 $D3 $D3 $C3 $B3 $C3 1" +d="$d 4 8 7 6 5 4 3 3 3 3 4 4 3 4 5 6 7 8 16 4" +# +n="$n 1 $G3 $C4 $Dd4 $G4 $C5 $Dd5 $C5 $G4 $Dd4 $G4 $C5 $Dd5 $G5 $C6 $G5 $Dd5 $C5 $Dd5 $G5 $C6 $Dd6 $C6 $G5 $Dd5 $C5 $Dd5 $G5 $C6 $Dd6 1" +d="$d 4 7 6 5 4 3 3 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 3 4 5 6 7 9 12 7" +# +n="$n 1 $G4 $Gd4 $G4 $Fd4 $G4 $F4 $Dd4 $D4 $Dd4 $F4 $Dd4 $D4 $Dd4 $D4 $C4 $B3 $C4 $D4 1" +d="$d 4 8 7 6 5 4 3 3 3 3 4 4 3 4 5 6 7 8 16 4" +# +n="$n 1 $G4 $Gd4 $G4 $Fd4 $G4 $F4 $Dd4 $D4 $Dd4 $F4 $Dd4 $D4 $Dd4 $D4 $D4 $C4 $B3 $C4 1" +d="$d 4 8 7 6 5 4 3 3 3 3 4 4 3 4 5 6 7 8 16 4" +# +n="$n 1 $G3 $C4 $Dd4 $G4 $C5 $Dd5 $C5 $G4 $Dd4 $G4 $C5 $Dd5 $G5 $C6 $G5 $Dd5 $C5 $Dd5 $G5 $C6 $Dd6 $C6 $G5 $Dd5 $C5 $Dd5 $G5 $C6 $Dd6 1" +d="$d 4 8 7 6 5 4 3 3 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 3 4 5 6 7 10 9 7" +# | | | | | | | +n="$n $C4 $D4 $Dd4 $Dd4 $D4 $F4 $Dd4 $Dd4 $D4 $D4 $C4 $B3 $C4 $B3 $C4 $D4 $C4 $C4 1" +d="$d 6 6 4 5 4 4 4 4 4 4 5 6 6 2 2 16 4 24 12" +# | | | | | | | + +# | | | | | | +n="$n $C4 $C4 $D4 $Dd4 $C4 " +d="$d 36 2 2 26 6 " +# | | | | | | +n="$n $C4 $D4 $Dd4 $F4 " +d="$d 36 2 2 56 " +# | | | | | | +n="$n $C4 $D4 $Dd4 $D4 $Dd4 " +d="$d 6 6 2 2 38 " +# | | | | | | +n="$n $C4 $D4 $C4 $D4 $C4 $B3 $C4 " +d="$d 6 2 2 12 4 4 36 " +# | | | | | | + +# | | | | | | +n="$n $G4 $F4 $Dd4 $D4 $C4 $C4 $B3 " +d="$d 12 8 4 8 4 24 12 " +# | | | | | | +n="$n $Gd4 $G4 $F4 $Dd4 $D4 $D4 $C4 " +d="$d 12 8 4 8 4 24 12 " +# | | | | | | +n="$n $C6 $Ad4 $C6 $Gd4 $Ad4 $G4 $Gd4 " +d="$d 12 6 6 4 4 4 36 " +# | | | | | | +n="$n $Ad4 $Gd4 $Ad4 $G4 $Gd4 $F4 $G4 " +d="$d 12 6 6 4 4 4 36 " +# | | | | | | + +# | | | | | | +n="$n $F4 $A3 $Ad3 $C4 $Ad3 $F4 $D4 $Ad3 " +d="$d 20 4 10 2 20 4 10 2 " +# | | | | | | +n="$n $Ad3 $A3 $Ad3 $C4 $Ad3 " +d="$d 20 4 10 2 32 " +# | | | | | | +n="$n $Ad4 $A4 $G4 $F4 $Dd4 $D4 $C4 $Ad3 $G3 $G4 " +d="$d 20 3 3 3 3 3 3 6 12 12 " +# | | | | | | +n="$n $Dd4 $C4 $Ad3 $Gd3 $F4 $D4 $Ad3 $Gd3 $Gd3 $G3 " +d="$d 4 4 20 16 12 4 4 4 12 12 " +# | | | | | | +n="$n 1 $Dd4 $Ad3 $G3 $F3 $G3 $Gd3 1 " +d="$d 8 4 11 3 24 11 5 22 " +# | | | | | | +n="$n $G3 1 $G3" +d="$d 36 30 6 " +# | | | | | | +n="$n $Fd4 $G4 $Gd4 1 $Gd4 $Ad4 $C5 1 $Ad4 $Gd4 $G4 1 $G4" +d="$d 6 6 12 12 2 2 4 8 2 3 21 1 6" +# | | | | | | +n="$n $Fd4 $G4 $Gd4 1 $Gd4 $Ad4 $C5 1 $Ad4 $Gd4 $G4 1" +d="$d 6 6 12 12 2 2 4 8 2 3 21 6" +# | | | | | | + +# | | | | | | +n="$n $C5 $D5 $Dd5 $D5 $C5 $B4 $C5 1 $Ad4 " +d="$d 6 6 7 5 5 6 6 13 24 " +# | | | | | | +n="$n $Ad4 $C5 $Cd5 1 $C5 $Ad4 $Gd4 $F4 $Gd4 $C5 $G4 $Dd4" +d="$d 1 1 4 4 1 2 18 6 8 4 24 6 " +# | | | | | | +n="$n $G4 $C5 $F4 $F4 $G4 $Gd4 1 $G4 $F4 $Dd4 " +d="$d 8 4 24 1 1 4 4 1 2 24 " +# | | | | | | +n="$n $Dd4 $F4 $G4 1 $F4 $Dd4 $D4 $D4 $Dd4 $F4 1 $Dd4 $D4 $C4 " +d="$d 1 1 4 4 1 2 24 1 1 4 4 1 3 24 " +# | | | | | | + +# This passage has 5 mesure per hypermeasure, hence the sum should be near 48. +# +n="$n $C5 $D5 $Dd5 " +d="$d 1 1 46 " +# | | | | | | +n="$n $C5 $D5 $Dd5 " +d="$d 1 1 46 " +# | | | | | | +n="$n $C5 $D5 $Dd5 1 $Dd5 $D5 $D5 " +d="$d 1 1 10 8 4 12 24 " +# | | | | | | | +n="$n $F5 1 $F5 $Dd5 $D5 $C5 " +d="$d 12 8 4 1 11 24 " +# | | | | | | | +n="$n $G5 1 $G5 $G5 $F5 " +d="$d 12 8 4 12 24 " +# | | | | | | | +n="$n $Dd5 1 $Dd5 $Dd5 $Cd5 " +d="$d 12 8 4 12 24 " +# | | | | | | | +n="$n $D5 " +d="$d 36 " +# | | | | | | | +n="$n $A5 1 $A5 $A5 $G5 " +d="$d 12 8 4 12 24 " +# | | | | | | | +n="$n $F5 1 $F5 $F5 $Dd5 " +d="$d 12 8 4 12 24 " +# | | | | | | | +n="$n $Ad4 1 $Ad4 $Ad4 $Ad4 " +d="$d 12 8 4 32 4 " +# | | | | | | | +n="$n $A4 $Ad4 $C5 " +d="$d 2 2 44 " +# | | | | | | | +n="$n $Ad4 $A4 $Ad4 " +d="$d 2 2 44 " +# | | | | | | +n="$n $A4 $G4 $A4 " +d="$d 2 2 38 " +# | | | | | | +n="$n $G4 $Fd4 $G4 " +d="$d 5 6 44 " +# | | | | | | + +# +n="$n $G4 $Ad4 $D5 $G5 $Ad5 $G5 $D5 $Ad4 $D5 $G5 $Ad5 $G5 $Ad5 $D6 $G6 " +d="$d 8 7 6 5 4 4 4 4 5 6 7 7 8 10 24 " +# + + +main() +{ + printf '%s' "$d" | sed -re 's/^ *//' -e 's/ *$//' -e 's/ +/\n/g' | + for note in $n + do + read duration + kill -9 "$pid" + speaker-test -t sine -f $note & pid="$!" + sleep "$(busybox dc "$duration" 10 / f)" + done +} + + +main "$@" diff --git a/bin/blih b/bin/blih @@ -0,0 +1,284 @@ +#!/usr/bin/env python3.6 + +import os +import sys +import getopt +import hmac +import hashlib +import urllib.request +import urllib.parse +import json +import getpass + +version = 1.7 + +class blih: + def __init__(self, baseurl='https://blih.epitech.eu/', user=None, token=None, verbose=False, user_agent='blih-' + str(version)): + self._baseurl = baseurl + if token: + self._token = token + else: + self.token_calc() + if user == None: + self._user = getpass.getuser() + else: + self._user = user + self._verbose = verbose + self._useragent = user_agent + + def token_get(self): + return self._token + + def token_set(self, token): + self._token = token + + token = property(token_get, token_set) + + def token_calc(self): + self._token = bytes(hashlib.sha512(bytes(getpass.getpass(), 'utf8')).hexdigest(), 'utf8') + + def sign_data(self, data=None): + signature = hmac.new(self._token, msg=bytes(self._user, 'utf8'), digestmod=hashlib.sha512) + if data: + signature.update(bytes(json.dumps(data, sort_keys=True, indent=4, separators=(',', ': ')), 'utf8')) + + signed_data = {'user' : self._user, 'signature' : signature.hexdigest()} + if data != None: + signed_data['data'] = data + + return signed_data + + def request(self, resource, method='GET', content_type='application/json', data=None, url=None): + signed_data = self.sign_data(data) + + if url: + req = urllib.request.Request(url=url, method=method, data=bytes(json.dumps(signed_data), 'utf8')) + else: + req = urllib.request.Request(url=self._baseurl + resource, method=method, data=bytes(json.dumps(signed_data), 'utf8')) + req.add_header('Content-Type', content_type) + req.add_header('User-Agent', self._useragent) + + try: + f = urllib.request.urlopen(req) + except urllib.error.HTTPError as e: + print ('HTTP Error ' + str(e.code)) + data = json.loads(e.read().decode('utf8')) + print ("Error message : '" + data['error'] + "'") + sys.exit(1) + + if f.status == 200: + try: + data = json.loads(f.read().decode('utf8')) + except: + print ("Can't decode data, aborting") + sys.exit(1) + return (f.status, f.reason, f.info(), data) + + print ('Unknown error') + sys.exit(1) + + def repo_create(self, name, type='git', description=None): + data = {'name' : name, 'type' : type} + if description: + data['description'] = description + status, reason, headers, data = self.request('/repositories', method='POST', data=data) + print (data['message']) + + def repo_list(self): + status, reason, headers, data = self.request('/repositories', method='GET') + for i in data['repositories']: + print (i) + + def repo_delete(self, name): + status, reason, headers, data = self.request('/repository/' + name, method='DELETE') + print (data['message']) + + def repo_info(self, name): + status, reason, headers, data = self.request('/repository/' + name, method='GET') + print (data['message']) + + def repo_setacl(self, name, acluser, acl): + data = {'user' : acluser, 'acl' : acl} + status, reason, headers, data = self.request('/repository/' + name + '/acls', method='POST', data=data) + print (data['message']) + + def repo_getacl(self, name): + status, reason, headers, data = self.request('/repository/' + name + '/acls', method='GET') + for i in data.keys(): + print (i + ':' + data[i]) + + def sshkey_upload(self, keyfile): + try: + f = open(keyfile, 'r') + except (PermissionError, FileNotFoundError): + print ("Can't open file : " + keyfile) + return + key = urllib.parse.quote(f.read().strip('\n')) + f.close() + data = {'sshkey' : key} + status, reason, headers, data = self.request('/sshkeys', method='POST', data=data) + print (data['message']) + + def sshkey_delete(self, sshkey): + status, reason, headers, data = self.request('/sshkey/' + sshkey, method='DELETE') + print (data['message']) + + def sshkey_list(self): + status, reason, headers, data = self.request('/sshkeys', method='GET') + for i in data.keys(): + print (data[i] + ' ' + i) + + def whoami(self): + status, reason, headers, data = self.request('/whoami', method='GET') + print (data['message']) + +def usage_repository(): + print ('Usage: ' + sys.argv[0] + ' [options] repository command ...') + print () + print ('Commands :') + print ('\tcreate repo\t\t\t-- Create a repository named "repo"') + print ('\tinfo repo\t\t\t-- Get the repository metadata') + print ('\tgetacl repo\t\t\t-- Get the acls set for the repository') + print ('\tlist\t\t\t\t-- List the repositories created') + print ('\tsetacl repo user [acl]\t\t-- Set (or remove) an acl for "user" on "repo"') + print ('\t\t\t\t\tACL format:') + print ('\t\t\t\t\tr for read') + print ('\t\t\t\t\tw for write') + print ('\t\t\t\t\ta for admin') + sys.exit(1) + +def repository(args, baseurl, user, token, verbose, user_agent): + if len(args) == 0: + usage_repository() + if args[0] == 'create': + if len(args) != 2: + usage_repository() + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.repo_create(args[1]) + elif args[0] == 'list': + if len(args) != 1: + usage_repository() + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.repo_list() + elif args[0] == 'info': + if len(args) != 2: + usage_repository() + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.repo_info(args[1]) + elif args[0] == 'delete': + if len(args) != 2: + usage_repository() + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.repo_delete(args[1]) + elif args[0] == 'setacl': + if len(args) != 4 and len(args) != 3: + usage_repository() + if len(args) == 3: + acl = '' + else: + acl = args[3] + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.repo_setacl(args[1], args[2], acl) + elif args[0] == 'getacl': + if len(args) != 2: + usage_repository() + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.repo_getacl(args[1]) + else: + usage_repository() + +def usage_sshkey(): + print ('Usage: ' + sys.argv[0] + ' [options] sshkey command ...') + print () + print ('Commands :') + print ('\tupload [file]\t\t\t-- Upload a new ssh-key') + print ('\tlist\t\t\t\t-- List the ssh-keys') + print ('\tdelete <sshkey>\t\t\t-- Delete the sshkey with comment <sshkey>') + sys.exit(1) + +def sshkey(args, baseurl, user, token, verbose, user_agent): + if len(args) == 0: + usage_sshkey() + if args[0] == 'list': + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.sshkey_list() + elif args[0] == 'upload': + key = None + if len(args) == 1: + key = os.getenv('HOME') + '/.ssh/id_rsa.pub' + elif len(args) == 2: + key = args[1] + else: + usage_sshkey() + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.sshkey_upload(key) + elif args[0] == 'delete': + if len(args) != 2: + usage_sshkey() + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.sshkey_delete(args[1]) + else: + usage_sshkey() + +def whoami(args, baseurl, user, token, verbose, user_agent): + handle = blih(baseurl=baseurl, user=user, token=token, verbose=verbose, user_agent=user_agent) + handle.whoami() + +def usage(): + print ('Usage: ' + sys.argv[0] + ' [options] command ...') + print () + print ('Global Options :') + print ('\t-u user | --user=user\t\t-- Run as user') + print ('\t-v | --verbose\t\t\t-- Verbose') + print ('\t-b url | --baseurl=url\t\t-- Base URL for BLIH') + print ('\t-t | --token\t\t\t-- Specify token in the cmdline') + print () + print ('Commands :') + print ('\trepository\t\t\t-- Repository management') + print ('\tsshkey\t\t\t\t-- SSH-KEYS management') + print ('\twhoami\t\t\t\t-- Print who you are') + sys.exit(1) + +if __name__ == "__main__": + try: + opts, args = getopt.getopt(sys.argv[1:], 'hvu:b:t:VU:', ['help', 'verbose', 'user=', 'baseurl=', 'token=', 'version', 'useragent=']) + except getopt.GetoptError as e: + print (e) + usage() + + verbose = False + user = None + baseurl = 'https://blih.epitech.eu/' + token = None + user_agent = 'blih-' + str(version) + + for o, a in opts: + if o in ('-h', '--help'): + usage() + elif o in ('-v', '--verbose'): + verbose = True + elif o in ('-u', '--user'): + user = a + elif o in ('-b', '--baseurl'): + baseurl = a + elif o in ('-t', '--token'): + token = bytes(a, 'utf8') + elif o in ('-V', '--version'): + print ('blih version ' + str(version)) + sys.exit(0) + elif o in ('-U', '--useragent'): + user_agent = a + else: + usage() + + if len(args) == 0: + usage() + + if args[0] == 'repository': + repository(args[1:], baseurl, user, token, verbose, user_agent) + elif args[0] == 'sshkey': + sshkey(args[1:], baseurl, user, token, verbose, user_agent) + elif args[0] == 'whoami': + whoami(args[1:], baseurl, user, token, verbose, user_agent) + else: + usage() diff --git a/bin/calendar-import b/bin/calendar-import @@ -0,0 +1,43 @@ +#!/bin/sh +# store an ical one line per event + +exec awk ' + +BEGIN { + FS = ":"; +} + + +{ + gsub("\015", ""); + gsub("\t", " "); +} + + +/BEGIN:VEVENT/,/END:VEVENT/ { + if (substr($0, 1, 1) != " ") { + type = $1; + vevent[type] = substr($0, \ + index($0, ":") + 1, length($0) - length($1)); + } else { + vevent[type] = vevent[type] substr($0, 2, length($0) - 1); + } +} + + +/END:VEVENT/ { + gsub(/\\n/, " ", vevent["DESCRIPTION"]); + gsub(/\\/, "", vevent["DESCRIPTION"]); + gsub(/\\/, "", vevent["LOCATION"]); + gsub(/\\/, "", vevent["SUMMARY"]); + + printf("%04d/%02d/%02d %02d:%02d %s %s %s\n", + substr(vevent["DTSTART"], 1, 4), + substr(vevent["DTSTART"], 5, 2), + substr(vevent["DTSTART"], 7, 2), + substr(vevent["DTSTART"], 10, 2), + substr(vevent["DTSTART"], 12, 2), + vevent["SUMMARY"], + vevent["LOCATION"], + vevent["DESCRIPTION"]); +}' "$@" | sort -u diff --git a/bin/calendar-show b/bin/calendar-show @@ -0,0 +1,46 @@ +#!/bin/sh + +awk ' +function +bissextile(year) +{ + return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0); +} + +function +days_in_month(month, year) +{ + if (month == 2) { + return 28 + is_bissextile(year); + } else if (month < 8) { + return 30 + (month % 2 == 1); + } else { + return 30 + (month % 2 == 0); + } +} + +function +to_seconds(year, month, day, hour, minute, second) +{ + for (month--; month > 0; month--) + day += days_in_month(month, year); + + for (year--; year >= 1970; year--) + day += 365 + is_bissextile(year); + + return (second + 60 * (minute + 60 * (hour + (24 * (day - 1))))); +}' + +function +to_date(seconds) +{ + year = 1970 + + b = bissextile(year) + while (seconds > 3600 * 24 * (365 + b)) { + seconds -= 3600 * 24 * (364 + is_bissextile(year)) + b = bissextile(++year) + } + + return year "/" month "/" day " " hour ":" minute ":" second +} diff --git a/bin/calendar-update b/bin/calendar-update @@ -0,0 +1,5 @@ +#!/bin/sh + +URL='http://planning.univ-rennes1.fr/jsp/custom/modules/plannings/cal.jsp?data=8241fc3873200214d3ba247351a161f5bd72d825015315fe5d6496b849150f14ec7f554d6ed7ba1bbad7b9bdf5b7bdb27fbb53e06bf966cea3b3f4c7cc4cd75b8af069ff1fd12df97e86aed5fc16ce3b8edd3cda7b61e593' + +wget -qO- "$URL" | calendar-import > "$HOME/var/cal/university" diff --git a/bin/cl b/bin/cl @@ -0,0 +1,3 @@ +#!/bin/sh + +printf '\033[H\033[2J' diff --git a/bin/color b/bin/color @@ -0,0 +1,6 @@ +#!/bin/sh +[ "$DISPLAY" ] || exit + +xsetroot -solid "#$( + od -A n -h /dev/urandom | tr -cd 0-9a-f | dd bs=1 count=6 2> /dev/null +)" diff --git a/bin/dns-used-tld b/bin/dns-used-tld @@ -0,0 +1,42 @@ +#!/bin/sh +# list all used TLD for a given SLD + +: ${1:?Usage: ${0##*/} segond-level-domain} + + +# get the list of the domains + +[ -f /tmp/tlds-alpha-by-domain.txt ] || +wget -O- http://data.iana.org/TLD/tlds-alpha-by-domain.txt 2> /dev/null | +sed 1d > /tmp/tlds-alpha-by-domain.txt + + +# remove the false positive by checking a long random domain name +# though, we cannot check for these domains now + +if [ ! -f /tmp/tlds-false-positive.txt ] +then + touch /tmp/tlds-false-positive.txt + $0 "$( + tr -cd 0-9a-z < /dev/urandom | dd bs=32 count=1 2> /dev/null + )" > /tmp/tlds-false-positive.txt +fi + + +# check every domain, up to 5 at once + +i=0 +while read tld +do + i=$((i + 1)) + dig -t NS "$1.$tld" | awk '/^[^;]/ && $3 == "IN" { + gsub("[^.]", "", $1) + if (length($1) <= 1) exit 0 + exit 1 + }' || echo "$tld" & + [ "$i" = 5 ] && wait +done << EOF +$(grep -vFf /tmp/tlds-false-positive.txt /tmp/tlds-alpha-by-domain.txt) +EOF + +wait diff --git a/bin/doc-rfc b/bin/doc-rfc @@ -0,0 +1,6 @@ +#!/bin/sh +# download and print an RFC from ietf.org + +wget -q -O- http://www.ietf.org/rfc/rfc"$1".txt | +awk -v RS='\n*[^\n]*\n\f\n[^\n]*\n*' '{ print $0 }' | +$MANPAGER diff --git a/bin/dropbox b/bin/dropbox @@ -0,0 +1,1537 @@ +#!/usr/local/bin/python2.7 +# +# Copyright (c) Dropbox, Inc. +# +# dropbox +# Dropbox frontend script +# This file is part of nautilus-dropbox 2015.10.28. +# +# nautilus-dropbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# nautilus-dropbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with nautilus-dropbox. If not, see <http://www.gnu.org/licenses/>. +# +from __future__ import with_statement + +import errno +import locale +import optparse +import os +import platform +import shutil +import socket +import StringIO +import subprocess +import sys +import tarfile +import tempfile +import threading +import thread +import time +import traceback +import urllib2 + +try: + import gpgme +except ImportError: + gpgme = None + +from contextlib import closing, contextmanager +from posixpath import curdir, sep, pardir, join, abspath, commonprefix + +INFO = u"Dropbox is the easiest way to share and store your files online. Want to learn more? Head to" +LINK = u"https://www.dropbox.com/" +WARNING = u"In order to use Dropbox, you must download the proprietary daemon." +GPG_WARNING = u"Note: python-gpgme is not installed, we will not be able to verify binary signatures." +ERROR_CONNECTING = u"Trouble connecting to Dropbox servers. Maybe your internet connection is down, or you need to set your http_proxy environment variable." +ERROR_SIGNATURE = u"Downloaded binary does not match Dropbox signature, aborting install." + +DOWNLOAD_LOCATION_FMT = "https://www.dropbox.com/download?plat=%s" +SIGNATURE_LOCATION_FMT = "https://www.dropbox.com/download?plat=%s&signature=1" + +DOWNLOADING = u"Downloading Dropbox... %d%%" +UNPACKING = u"Unpacking Dropbox... %d%%" + +PARENT_DIR = os.path.expanduser("~") +DROPBOXD_PATH = "%s/.dropbox-dist/dropboxd" % PARENT_DIR +DESKTOP_FILE = u"/usr/share/applications/dropbox.desktop" + +enc = locale.getpreferredencoding() + +# Available from https://linux.dropbox.com/fedora/rpm-public-key.asc +DROPBOX_PUBLIC_KEY = """ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.0 + +mQENBEt0ibEBCACv4hZRPqwtpU6z8+BB5YZU1a3yjEvg2W68+a6hEwxtCa2U++4dzQ+7EqaU +q5ybQnwtbDdpFpsOi9x31J+PCpufPUfIG694/0rlEpmzl2GWzY8NqfdBFGGm/SPSSwvKbeNc +FMRLu5neo7W9kwvfMbGjHmvUbzBUVpCVKD0OEEf1q/Ii0Qcekx9CMoLvWq7ZwNHEbNnij7ec +nvwNlE2MxNsOSJj+hwZGK+tM19kuYGSKw4b5mR8IyThlgiSLIfpSBh1n2KX+TDdk9GR+57TY +vlRu6nTPu98P05IlrrCP+KF0hYZYOaMvQs9Rmc09tc/eoQlN0kkaBWw9Rv/dvLVc0aUXABEB +AAG0MURyb3Bib3ggQXV0b21hdGljIFNpZ25pbmcgS2V5IDxsaW51eEBkcm9wYm94LmNvbT6J +ATYEEwECACAFAkt0ibECGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRD8kYszUESRLi/z +B/wMscEa15rS+0mIpsORknD7kawKwyda+LHdtZc0hD/73QGFINR2P23UTol/R4nyAFEuYNsF +0C4IAD6y4pL49eZ72IktPrr4H27Q9eXhNZfJhD7BvQMBx75L0F5gSQwuC7GdYNlwSlCD0AAh +Qbi70VBwzeIgITBkMQcJIhLvllYo/AKD7Gv9huy4RLaIoSeofp+2Q0zUHNPl/7zymOqu+5Ox +e1ltuJT/kd/8hU+N5WNxJTSaOK0sF1/wWFM6rWd6XQUP03VyNosAevX5tBo++iD1WY2/lFVU +JkvAvge2WFk3c6tAwZT/tKxspFy4M/tNbDKeyvr685XKJw9ei6GcOGHD +=5rWG +-----END PGP PUBLIC KEY BLOCK----- +""" + +# Futures + +def methodcaller(name, *args, **kwargs): + def caller(obj): + return getattr(obj, name)(*args, **kwargs) + return caller + +def relpath(path, start=curdir): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + if type(start) is unicode: + start_list = unicode_abspath(start).split(sep) + else: + start_list = abspath(start).split(sep) + + if type(path) is unicode: + path_list = unicode_abspath(path).split(sep) + else: + path_list = abspath(path).split(sep) + + # Work out how much of the filepath is shared by start and path. + i = len(commonprefix([start_list, path_list])) + + rel_list = [pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return curdir + return join(*rel_list) + +# End Futures + + +def console_print(st=u"", f=sys.stdout, linebreak=True): + global enc + assert type(st) is unicode + f.write(st.encode(enc)) + if linebreak: f.write(os.linesep) + +def console_flush(f=sys.stdout): + f.flush() + +def yes_no_question(question): + while True: + console_print(question, linebreak=False) + console_print(u" [y/n] ", linebreak=False) + console_flush() + text = raw_input() + if text.lower().startswith("y"): + return True + elif text.lower().startswith("n"): + return False + else: + console_print(u"Sorry, I didn't understand that. Please type yes or no.") + +def plat(): + if sys.platform.lower().startswith('linux'): + arch = platform.machine() + if (arch[0] == 'i' and + arch[1].isdigit() and + arch[2:4] == '86'): + plat = "x86" + elif arch == 'x86_64': + plat = arch + else: + FatalVisibleError("Platform not supported") + return "lnx.%s" % plat + else: + FatalVisibleError("Platform not supported") + +def is_dropbox_running(): + pidfile = os.path.expanduser("~/.dropbox/dropbox.pid") + + try: + with open(pidfile, "r") as f: + pid = int(f.read()) + with open("/proc/%d/cmdline" % pid, "r") as f: + cmdline = f.read().lower() + except: + cmdline = "" + + return "dropbox" in cmdline + +def unicode_abspath(path): + global enc + assert type(path) is unicode + # shouldn't pass unicode to this craphead, it appends with os.getcwd() which is always a str + return os.path.abspath(path.encode(sys.getfilesystemencoding())).decode(sys.getfilesystemencoding()) + +@contextmanager +def gpgme_context(keys): + gpg_conf_contents = '' + _gpghome = tempfile.mkdtemp(prefix='tmp.gpghome') + + try: + os.environ['GNUPGHOME'] = _gpghome + fp = open(os.path.join(_gpghome, 'gpg.conf'), 'wb') + fp.write(gpg_conf_contents) + fp.close() + ctx = gpgme.Context() + + loaded = [] + for key_file in keys: + result = ctx.import_(key_file) + key = ctx.get_key(result.imports[0][0]) + loaded.append(key) + + ctx.signers = loaded + + yield ctx + finally: + del os.environ['GNUPGHOME'] + shutil.rmtree(_gpghome, ignore_errors=True) + +class SignatureVerifyError(Exception): + pass + +def verify_signature(key_file, sig_file, plain_file): + with gpgme_context([key_file]) as ctx: + sigs = ctx.verify(sig_file, plain_file, None) + return sigs[0].status == None + +def download_file_chunk(url, buf): + opener = urllib2.build_opener() + opener.addheaders = [('User-Agent', "DropboxLinuxDownloader/2015.10.28")] + sock = opener.open(url) + + size = int(sock.info()['content-length']) + bufsize = max(size / 200, 4096) + progress = 0 + + with closing(sock) as f: + yield (0, True) + while True: + try: + chunk = f.read(bufsize) + progress += len(chunk) + buf.write(chunk) + yield (float(progress)/size, True) + if progress == size: + break + except OSError, e: + if hasattr(e, 'errno') and e.errno == errno.EAGAIN: + # nothing left to read + yield (float(progress)/size, False) + else: + raise + +class DownloadState(object): + def __init__(self): + self.local_file = StringIO.StringIO() + + def copy_data(self): + return download_file_chunk(DOWNLOAD_LOCATION_FMT % plat(), self.local_file) + + def unpack(self): + # download signature + signature = StringIO.StringIO() + for _ in download_file_chunk(SIGNATURE_LOCATION_FMT % plat(), signature): + pass + signature.seek(0) + self.local_file.seek(0) + + if gpgme: + if not verify_signature(StringIO.StringIO(DROPBOX_PUBLIC_KEY), signature, self.local_file): + raise SignatureVerifyError() + + self.local_file.seek(0) + archive = tarfile.open(fileobj=self.local_file, mode='r:gz') + total_members = len(archive.getmembers()) + for i, member in enumerate(archive.getmembers()): + archive.extract(member, PARENT_DIR) + yield member.name, i, total_members + archive.close() + + def cancel(self): + if not self.local_file.closed: + self.local_file.close() + +def load_serialized_images(): + global box_logo_pixbuf, window_icon + import gtk + box_logo_pixbuf = gtk.gdk.pixbuf_new_from_data('\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9ef\x00\\\x9ej\x00\\\x9e\x04\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eZ\x00[\x9er\x00\\\x9e\x14\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e8\x00Y\x9c\xc2\x00X\x9b\xff\x00X\x9b\xff\x00[\x9d\xaa\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x02\x00\\\x9e\x8e\x00Y\x9b\xff\x00Y\x9b\xff\x00Y\x9b\xd5\x00\\\x9eM\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x12\x00[\x9d\x8b\x00U\x99\xfa\x0fe\xa5\xff]\xa2\xd3\xffM\x95\xc9\xff\x00X\x9b\xff\x00Y\x9c\xc9\x00\\\x9e\x1e\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0f\x00[\x9d\xb1\x00V\x99\xff4\x85\xc1\xffZ\xa3\xda\xff\x17m\xab\xff\x00V\x99\xff\x00Z\x9d\xa2\x00\\\x9e \x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\\\x00W\x9a\xde\x00Y\x9c\xff:\x87\xbf\xff\x83\xbf\xeb\xff\x98\xce\xf6\xff\x9b\xd0\xf6\xffa\xa3\xd3\xff\x05]\x9e\xff\x00X\x9b\xda\x00\\\x9e/\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00Z\x9c\xc5\x01Y\x9b\xff?\x90\xca\xff|\xc1\xf4\xff\x82\xc4\xf6\xff}\xbf\xf0\xffD\x90\xc8\xff\x05]\x9e\xff\x00V\x9a\xed\x00\\\x9es\x00\\\x9e\x07\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e4\x00Z\x9c\xba\x00V\x99\xff\x1dq\xae\xffd\xaa\xdd\xff\x8e\xc9\xf5\xff\x8e\xc7\xf3\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\xa1\xd2\xf6\xffw\xb3\xde\xff\x0fd\xa3\xff\x00V\x9a\xed\x00\\\x9eL\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e4\x00X\x9b\xdd\x05^\x9f\xffM\x9d\xd6\xffy\xc1\xf6\xffw\xbe\xf2\xffz\xbe\xf1\xff\x80\xc1\xf2\xff\x89\xc8\xf6\xffq\xb3\xe3\xff*z\xb5\xff\x00W\x9a\xff\x00X\x9b\xcd\x00\\\x9eG\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0e\x00[\x9d\x86\x00V\x99\xfa\x0cc\xa4\xffK\x96\xce\xff\x81\xc2\xf2\xff\x89\xc7\xf5\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\xa4\xd3\xf6\xff\x85\xbb\xe4\xff\x18k\xa8\xff\x00U\x99\xfc\x00\\\x9en\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eS\x00W\x9a\xf1\x0bb\xa3\xffT\xa3\xdd\xffv\xc0\xf7\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x8a\xc7\xf4\xff\x8f\xc9\xf4\xff`\xa3\xd5\xff\x15i\xa8\xff\x00U\x98\xff\x00[\x9d\x9c\x00\\\x9e\x1a\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eU\x00X\x9b\xd9\x00Z\x9c\xff1\x83\xbf\xffp\xb6\xea\xff\x84\xc5\xf6\xff\x80\xc2\xf2\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\xa6\xd3\xf5\xff\x96\xc7\xeb\xff*y\xb2\xff\x00T\x98\xff\x00\\\x9e\x90\x00\\\x9e\x02\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eu\x00V\x99\xfe\x14k\xac\xff\\\xac\xe6\xffr\xbd\xf6\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8b\xc5\xf1\xff\x95\xcc\xf6\xff\x8c\xc5\xee\xffH\x90\xc5\xff\x04]\x9e\xff\x00V\x9a\xe7\x00\\\x9ej\x00\\\x9e\x03\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e.\x00Z\x9c\xb3\x00V\x99\xff\x17m\xad\xffV\xa3\xdc\xff{\xc2\xf6\xff|\xbf\xf3\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa6\xd3\xf4\xff\xa4\xd1\xf1\xff@\x88\xbd\xff\x00U\x99\xff\x00[\x9d\xb0\x00\\\x9e\x0c\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x02\x00[\x9d\x97\x00V\x98\xff\x1fv\xb6\xffa\xb1\xed\xffl\xbb\xf4\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x93\xcb\xf2\xff\x9e\xd1\xf6\xff|\xb7\xe1\xff(w\xb2\xff\x00U\x99\xff\x00Y\x9c\xc6\x00\\\x9e?\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00[\x9e\x86\x00V\x99\xf6\ta\xa2\xff=\x8f\xcc\xffm\xb9\xf1\xffu\xbf\xf5\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa8\xd3\xf3\xff\xae\xd8\xf4\xffX\x99\xc9\xff\x00X\x9b\xff\x00Y\x9c\xc2\x00\\\x9e\x1b\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\r\x00[\x9d\xab\x00W\x99\xff,\x82\xc1\xffe\xb5\xf2\xffh\xb7\xf3\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x9f\xd1\xf5\xff\xa0\xcf\xf3\xffe\xa3\xd1\xff\x12f\xa5\xff\x00U\x98\xff\x00[\x9d\x9b\x00\\\x9e\x16\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eN\x00Y\x9b\xd3\x00Y\x9c\xff\'}\xbc\xff]\xad\xe8\xffp\xbe\xf6\xffn\xba\xf2\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa9\xd4\xf2\xff\xb5\xdb\xf6\xffq\xaa\xd4\xff\x04[\x9e\xff\x00X\x9b\xdc\x00\\\x9e>\x00\\\x9e0\x00Z\x9c\xc9\x00Z\x9b\xff8\x8d\xcd\xffe\xb7\xf5\xffc\xb4\xf2\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9d\xce\xf2\xff\xa9\xd5\xf6\xff\x99\xc9\xec\xffI\x8e\xc1\xff\x03[\x9d\xff\x00V\x9a\xe1\x00\\\x9ea\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e(\x00[\x9d\xab\x00V\x98\xff\x13j\xab\xffK\x9e\xdc\xffi\xb9\xf6\xffj\xb8\xf3\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xb9\xdc\xf6\xff\x80\xb5\xda\xff\rb\xa2\xff\x00W\x9a\xff\x00Y\x9b\xfe\x04]\x9f\xff>\x94\xd4\xffd\xb6\xf6\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa6\xd2\xf3\xff\xb0\xd9\xf6\xff\x87\xbb\xe0\xff\'u\xaf\xff\x00T\x98\xff\x00Y\x9c\xbd\x00\\\x9e7\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9e~\x00W\x99\xf2\x05^\x9f\xff3\x89\xc9\xff^\xb1\xf0\xffe\xb7\xf5\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xad\xd4\xf1\xff\xbb\xdd\xf6\xff\x96\xc3\xe4\xff\x18i\xa7\xff\x01]\xa2\xffH\x9e\xde\xffa\xb6\xf6\xff^\xb1\xf1\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xb0\xd8\xf5\xff\xad\xd5\xf1\xfff\xa2\xce\xff\rb\xa2\xff\x00U\x99\xfb\x00\\\x9e\x92\x00\\\x9e\x11\x00\\\x9e\x9b\x02\\\x9e\xff\x1ct\xb5\xffM\xa3\xe3\xffb\xb7\xf6\xff`\xb3\xf2\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xad\xd4\xf1\xff\xae\xd5\xf1\xff\xb7\xdb\xf4\xff\xaa\xcf\xe8\xffm\xb3\xe6\xffX\xb2\xf4\xffX\xae\xf1\xff^\xb1\xf1\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xae\xd5\xf2\xff\xba\xdd\xf7\xff\x9b\xc7\xe6\xff<\x83\xb8\xff\x06^\x9f\xff\x00[\x9d\xb6\x00Z\x9c\xdd\x0cd\xa6\xffR\xa9\xe9\xffb\xb7\xf8\xff\\\xb1\xf1\xff_\xb2\xf1\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xaa\xd2\xf0\xff\xb2\xd7\xf1\xff\xce\xe5\xf6\xff\xe9\xf5\xfd\xff\xd0\xeb\xfe\xff\xa1\xd2\xf7\xffg\xb6\xf2\xffW\xad\xf0\xff_\xb2\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xae\xd4\xf1\xff\xbf\xe0\xf7\xff\xac\xd2\xee\xff\x1eo\xaa\xff\x00X\x9b\xeb\x00\\\x9eR\x00Y\x9b\xf6\x0ce\xa6\xffH\x9e\xde\xffb\xb6\xf6\xff_\xb2\xf1\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa5\xd2\xf1\xff\xa8\xd2\xf0\xff\xbe\xdd\xf4\xff\xdd\xee\xfa\xff\xe9\xf3\xfc\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xce\xe8\xfb\xff\xc3\xe2\xfa\xff\x89\xc6\xf5\xff]\xb1\xf1\xff]\xb1\xf0\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xba\xdd\xf6\xff\x93\xc1\xe3\xff\x1fo\xaa\xff\x00W\x9b\xff\x00\\\x9eo\x00\\\x9e\x00\x00\\\x9e;\x00Y\x9b\xdf\x03\\\x9e\xff;\x90\xd0\xffd\xb6\xf5\xffb\xb4\xf2\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa0\xcf\xf1\xff\xa1\xcf\xf0\xff\xae\xd6\xf2\xff\xcf\xe6\xf8\xff\xe4\xf2\xfb\xff\xe5\xf2\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xcb\xe7\xfb\xff\xd1\xe9\xfb\xff\xb3\xda\xf9\xffx\xbe\xf3\xff^\xb1\xf0\xfff\xb6\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaa\xd4\xf2\xff\xb7\xdb\xf6\xffx\xaf\xd6\xff\x0b`\xa1\xff\x00V\x9a\xed\x00\\\x9eR\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00Z\x9c\xbe\x00X\x99\xff-\x83\xc2\xffe\xb6\xf3\xfff\xb6\xf3\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9b\xcc\xf0\xff\xa1\xcf\xf1\xff\xbf\xde\xf6\xff\xdc\xee\xfa\xff\xe3\xf1\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xd2\xe8\xfb\xff\xd0\xe9\xfb\xff\xa2\xd2\xf7\xffm\xb9\xf1\xffe\xb5\xf0\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa9\xd4\xf2\xff\xb1\xd9\xf5\xff[\x9b\xc9\xff\x00X\x9b\xff\x00Y\x9c\xd3\x00\\\x9e-\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x06\x00[\x9d\x96\x00V\x99\xff"x\xb8\xffa\xb1\xee\xffk\xba\xf4\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x96\xca\xf1\xff\x97\xca\xf0\xff\xac\xd5\xf3\xff\xd0\xe7\xf9\xff\xe0\xef\xfb\xff\xdf\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xd0\xea\xfb\xff\xd8\xec\xfb\xff\xc8\xe5\xfa\xff\x8f\xc9\xf4\xffi\xb7\xf0\xffo\xb9\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa8\xd4\xf4\xff\xa6\xd2\xf1\xffE\x8c\xbf\xff\x00U\x99\xff\x00Z\x9d\xaf\x00\\\x9e\x12\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9en\x00V\x98\xfe\x14k\xac\xffY\xaa\xe5\xffp\xbd\xf6\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x8e\xc7\xf0\xff\x9a\xcc\xf1\xff\xbd\xde\xf7\xff\xd8\xec\xfb\xff\xdc\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd6\xec\xfb\xff\xda\xed\xfb\xff\xb6\xdc\xf8\xff\x80\xc1\xf2\xffo\xb9\xf0\xffy\xbd\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa7\xd4\xf5\xff\x95\xc7\xea\xff+y\xb2\xff\x00T\x98\xff\x00[\x9e\x88\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eQ\x00W\x9a\xee\x08a\xa2\xffL\x9d\xd8\xfft\xbf\xf6\xffq\xbb\xf2\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x88\xc4\xf1\xff\x8d\xc6\xf0\xff\xaa\xd5\xf4\xff\xcd\xe7\xfa\xff\xd8\xed\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xdd\xef\xfc\xff\xd7\xeb\xfb\xff\xa6\xd4\xf5\xff{\xbe\xf1\xffy\xbd\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\xa6\xd4\xf6\xff~\xb6\xdf\xff\x15h\xa7\xff\x00U\x99\xf9\x00\\\x9ek\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e-\x00Y\x9c\xd2\x01Y\x9c\xff<\x8e\xca\xffu\xbe\xf4\xffv\xbe\xf2\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x82\xc1\xf1\xff\x83\xc1\xf0\xff\x97\xcb\xf3\xff\xbe\xe0\xf8\xff\xd4\xeb\xfb\xff\xd5\xeb\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xdc\xee\xfb\xff\xe3\xf0\xfc\xff\xcd\xe7\xf9\xff\x98\xcc\xf3\xff|\xbf\xf0\xff\x82\xc2\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x96\xcb\xf2\xff\xa1\xd2\xf5\xffc\xa3\xd2\xff\x06]\x9f\xff\x00W\x9b\xe5\x00\\\x9eC\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x12\x00[\x9d\xaf\x00V\x98\xff.\x81\xbe\xffv\xbd\xf2\xff|\xc0\xf4\xff|\xbf\xf1\xff{\xbf\xf0\xff\x83\xc2\xf1\xff\xaa\xd5\xf6\xff\xcc\xe6\xfb\xff\xd1\xea\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xe2\xf1\xfb\xff\xe3\xf2\xfb\xff\xbe\xdf\xf7\xff\x8b\xc6\xf1\xff\x84\xc2\xf0\xff\x8c\xc5\xf1\xff\x94\xcb\xf3\xff\x9b\xcf\xf4\xffK\x92\xc6\xff\x00W\x9a\xff\x00Y\x9c\xc7\x00\\\x9e#\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x8c\x00V\x98\xfd u\xb3\xffn\xb4\xe8\xff~\xc0\xf3\xff\x94\xca\xf4\xff\xbe\xe0\xf9\xff\xcf\xe8\xfb\xff\xcd\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe1\xf0\xfb\xff\xe8\xf3\xfb\xff\xdb\xed\xfa\xff\xac\xd5\xf4\xff\x8f\xc7\xf2\xff\x89\xc3\xed\xff6\x83\xbb\xff\x00U\x99\xff\x00[\x9d\xa9\x00\\\x9e\n\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x07\x00\\\x9e\xf1\x00Q\x95\xff\x18p\xb0\xff\x98\xcd\xf5\xff\xd4\xeb\xfd\xff\xce\xe8\xfb\xff\xcb\xe6\xfb\xff\xcc\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe6\xf3\xfb\xff\xf2\xf8\xfd\xff\xc9\xe5\xf9\xff1\x81\xba\xff\x00O\x94\xff\x00\\\x9e\xff\x00\\\x9e\'\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e}\x00V\x99\xfc\x1ap\xae\xffc\xad\xe4\xffM\xa8\xef\xff\x83\xc2\xf3\xff\xc6\xe4\xfb\xff\xd1\xe9\xfc\xff\xcc\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe7\xf4\xfc\xff\xe7\xf3\xfb\xff\xb6\xd8\xf4\xff{\xbc\xee\xff\x7f\xbd\xe9\xff/}\xb7\xff\x00U\x99\xff\x00[\x9d\x9d\x00\\\x9e\x06\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00[\x9d\xa2\x00U\x98\xff\'{\xb9\xffs\xbb\xef\xff{\xc0\xf4\xff@\xa1\xed\xff3\x99\xeb\xffW\xac\xee\xff\xa7\xd4\xf7\xff\xd3\xe9\xfc\xff\xd1\xeb\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xe0\xf0\xfb\xff\xea\xf5\xfc\xff\xcc\xe5\xf8\xff~\xbe\xee\xffX\xaa\xe9\xffc\xb0\xe9\xff\x92\xca\xf3\xff\x9a\xcd\xf3\xffC\x8d\xc2\xff\x00U\x99\xff\x00Z\x9c\xbd\x00\\\x9e\x1c\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e%\x00Z\x9c\xc9\x00X\x9b\xff6\x8a\xc6\xffs\xbd\xf3\xffw\xbe\xf3\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xff>\x9f\xeb\xffE\xa2\xeb\xff}\xbf\xf1\xff\xc3\xe3\xfa\xff\xd8\xed\xfc\xff\xd4\xeb\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xdb\xed\xfb\xff\xe4\xf1\xfc\xff\xda\xed\xfb\xff\x97\xca\xf2\xffV\xa9\xea\xffS\xa7\xe9\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x97\xcc\xf2\xff\xa1\xd1\xf5\xff\\\x9e\xcf\xff\x03[\x9d\xff\x00X\x9b\xdf\x00\\\x9e<\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eH\x00X\x9a\xe8\x06_\xa0\xffH\x99\xd5\xffs\xbf\xf6\xffq\xbb\xf2\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffH\xa4\xec\xffG\xa4\xeb\xff\\\xad\xed\xff\x9e\xcf\xf5\xff\xd4\xea\xfb\xff\xda\xee\xfc\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xdd\xef\xfc\xff\xe1\xf0\xfc\xff\xac\xd5\xf5\xff\\\xad\xec\xffB\xa0\xe9\xffQ\xa7\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x9a\xcc\xf1\xff\xa6\xd4\xf6\xffy\xb2\xdd\xff\x11f\xa5\xff\x00V\x99\xf6\x00\\\x9ed\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ef\x00V\x99\xfc\x11h\xa9\xffV\xa7\xe2\xffp\xbd\xf6\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffR\xa9\xec\xffS\xa9\xeb\xffx\xbb\xef\xff\xba\xdd\xf7\xff\xdd\xef\xfc\xff\xdc\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd5\xeb\xfb\xff\xdf\xf0\xfc\xff\xc1\xe1\xf9\xffk\xb5\xef\xff8\x9b\xe9\xff@\xa0\xe9\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa8\xd5\xf5\xff\x91\xc4\xe8\xff\'u\xb0\xff\x00T\x98\xff\x00\\\x9e\x83\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x04\x00[\x9d\x90\x00W\x98\xff\x1fv\xb6\xff_\xaf\xec\xffk\xba\xf5\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xff\\\xad\xeb\xffc\xb1\xeb\xff\x99\xcc\xf2\xff\xd4\xe9\xfa\xff\xe2\xf0\xfc\xff\xdf\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd9\xed\xfc\xff\xd4\xea\xfb\xff\x87\xc4\xf3\xff6\x9b\xea\xff/\x98\xe9\xff>\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa9\xd4\xf4\xff\xa5\xd1\xf0\xffB\x89\xbd\xff\x00U\x99\xff\x00[\x9d\xab\x00\\\x9e\x10\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x19\x00Z\x9d\xb9\x00W\x99\xff*\x81\xc0\xffc\xb5\xf2\xfff\xb6\xf3\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xffe\xb2\xec\xfff\xb2\xeb\xff}\xbd\xed\xff\xb8\xda\xf5\xff\xe1\xf0\xfb\xff\xe4\xf2\xfc\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe3\xf2\xfb\xff\xc8\xe6\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xd2\xe8\xfb\xff\xd8\xee\xfc\xff\xa5\xd2\xf7\xffG\xa2\xed\xff!\x90\xe9\xff0\x98\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa9\xd4\xf2\xff\xb0\xd9\xf5\xffX\x99\xc8\xff\x00W\x9b\xff\x00Y\x9c\xd1\x00\\\x9e,\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e9\x00Y\x9b\xdc\x03\\\x9d\xff9\x8f\xce\xffd\xb6\xf5\xffb\xb4\xf2\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffp\xb7\xeb\xfft\xb7\xeb\xff\x97\xc9\xf0\xff\xcf\xe7\xf8\xff\xe7\xf4\xfc\xff\xe4\xf2\xfb\xff\xe3\xf0\xfb\xff\xe9\xf4\xfb\xff\xd6\xec\xfc\xff\xc5\xe3\xfb\xff\xca\xe6\xfb\xff\xd7\xec\xfc\xff\xbb\xdd\xf9\xff]\xaf\xf0\xff\x1b\x8d\xe9\xff\x1f\x8e\xe9\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaa\xd4\xf2\xff\xb7\xdb\xf6\xffv\xae\xd6\xff\n`\xa0\xff\x00W\x9a\xed\x00\\\x9eQ\x00\\\x9e\x00\x00\\\x9eP\x00Y\x9b\xf5\x0cd\xa6\xffF\x9c\xdc\xffb\xb6\xf6\xff_\xb2\xf1\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xffy\xba\xeb\xff\x83\xbf\xec\xff\xb0\xd6\xf2\xff\xe1\xf0\xfa\xff\xf5\xfa\xfe\xff\xfe\xff\xff\xff\xff\xff\xff\xff\xf1\xf8\xfe\xff\xd2\xe9\xfb\xffz\xbd\xf4\xff \x90\xeb\xff\x10\x87\xe9\xff \x8e\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xba\xdd\xf6\xff\x93\xc1\xe3\xff\x1eo\xaa\xff\x00X\x9b\xff\x00\\\x9ep\x00Z\x9c\xd6\x0bc\xa4\xffQ\xa7\xe7\xffb\xb8\xf9\xff\\\xb1\xf1\xff_\xb2\xf1\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xff~\xbd\xec\xff\x82\xbe\xec\xff\x84\xbf\xeb\xff\xa1\xce\xef\xff\xdf\xee\xf9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xce\xe7\xfb\xffJ\xa5\xee\xff\x08\x83\xe9\xff\x12\x89\xea\xff\x1b\x8d\xea\xff!\x8f\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xae\xd5\xf1\xff\xbf\xe0\xf7\xff\xab\xd2\xed\xff\x1en\xaa\xff\x00X\x9b\xeb\x00[\x9d\x90\x02\\\x9e\xff\x1bs\xb4\xffM\xa2\xe2\xffb\xb7\xf6\xff`\xb3\xf2\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xff\x7f\xbd\xec\xff\x89\xc1\xed\xff\x92\xc6\xed\xff\x93\xc7\xed\xff\x95\xc7\xec\xff\xc0\xde\xf3\xff\x7f\xbf\xf4\xff\x0f\x87\xe9\xff\r\x87\xe9\xff\x1c\x8e\xea\xff\x1d\x8e\xea\xff\x1d\x8e\xea\xff \x8f\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xad\xd5\xf2\xff\xba\xdd\xf6\xff\x9b\xc7\xe7\xff=\x84\xb9\xff\x05]\x9f\xff\x00[\x9d\xb1\x00\\\x9e\x03\x00\\\x9ey\x00X\x9a\xf3\x05^\x9f\xff6\x8c\xcc\xff`\xb3\xf2\xffe\xb7\xf5\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffr\xb8\xec\xff|\xbb\xec\xff\x87\xc1\xed\xff\x8e\xc4\xed\xff\x92\xc6\xed\xff\x94\xc7\xed\xff\x9d\xcb\xed\xff\xb7\xd9\xf3\xffP\xaa\xf0\xff\x18\x8c\xea\xff\x13\x89\xea\xff\x1b\x8e\xea\xff \x90\xea\xff$\x92\xea\xff$\x91\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaf\xd7\xf4\xff\xb1\xd8\xf4\xffn\xa8\xd2\xff\x0ec\xa2\xff\x00U\x99\xfd\x00\\\x9e\x91\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e)\x00Z\x9c\xb2\x00V\x99\xff\x18o\xb0\xffR\xa4\xe2\xffj\xb9\xf6\xffg\xb7\xf2\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xffe\xb2\xec\xffm\xb5\xec\xffz\xbb\xed\xff\x84\xc0\xed\xff\x89\xc2\xed\xff\x8d\xc4\xed\xff\x8f\xc4\xec\xff\x9c\xcc\xee\xff\xc5\xe1\xf5\xff\xca\xe4\xf7\xffi\xb7\xf2\xffS\xac\xf0\xff(\x94\xeb\xff\x16\x8b\xea\xff \x90\xea\xff$\x92\xea\xff*\x95\xea\xff,\x96\xea\xff-\x97\xea\xff2\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa5\xd1\xf2\xff\xb1\xd9\xf6\xff\x94\xc4\xe7\xff2}\xb5\xff\x00U\x99\xff\x00Y\x9c\xc6\x00\\\x9e;\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e[\x00X\x9a\xe1\x04]\x9e\xff3\x87\xc5\xffd\xb4\xef\xffo\xbd\xf5\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xffZ\xad\xec\xff`\xaf\xec\xffj\xb5\xec\xffx\xba\xed\xff\x80\xbe\xed\xff\x83\xc0\xed\xff\x89\xc2\xed\xff\x8a\xc2\xec\xff\x9b\xcb\xef\xff\xc4\xe0\xf6\xff\xd0\xe7\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xff[\xb0\xf1\xff^\xb1\xf1\xff2\x9a\xec\xff\x1b\x8d\xea\xff#\x92\xea\xff)\x95\xea\xff/\x98\xea\xff4\x9a\xea\xff6\x9b\xea\xff9\x9c\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa6\xd3\xf5\xff\xa4\xd1\xf2\xff^\x9e\xcc\xff\x0b`\xa1\xff\x00V\x99\xef\x00\\\x9er\x00\\\x9e\x04\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x17\x00[\x9d\xa0\x00V\x98\xff\x12i\xaa\xffM\x9e\xd9\xffr\xbe\xf5\xffs\xbc\xf3\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffT\xa9\xec\xff\\\xad\xec\xffi\xb4\xed\xffs\xba\xed\xffy\xbb\xed\xff\x7f\xbe\xed\xff\x83\xc0\xed\xff\x85\xc0\xec\xff\x9e\xcd\xf0\xff\xc3\xe1\xf7\xff\xcb\xe4\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xffa\xb3\xf1\xfff\xb5\xf1\xffA\xa2\xed\xff \x90\xea\xff(\x94\xea\xff.\x98\xea\xff4\x9a\xea\xff;\x9d\xea\xff?\x9f\xea\xffA\xa0\xea\xffE\xa2\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x9c\xce\xf3\xff\xa5\xd4\xf6\xff~\xb6\xdf\xff%t\xaf\xff\x00U\x99\xff\x00Z\x9c\xb6\x00\\\x9e&\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eI\x00X\x9b\xd3\x00X\x9b\xff)}\xbb\xffg\xb2\xea\xff|\xc2\xf6\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffH\xa4\xec\xffO\xa7\xec\xff[\xae\xec\xffh\xb3\xed\xffn\xb7\xed\xffs\xba\xed\xffy\xbb\xed\xff~\xbd\xed\xff\x80\xbf\xec\xff\xa1\xcf\xf1\xff\xc3\xe1\xf7\xff\xc6\xe3\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffe\xb5\xf1\xffm\xb9\xf1\xffQ\xaa\xee\xff)\x94\xea\xff,\x97\xea\xff4\x9a\xea\xff:\x9d\xea\xffA\xa0\xea\xffG\xa3\xea\xffJ\xa5\xea\xffM\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x9d\xd0\xf6\xff\x93\xc7\xed\xffF\x8d\xc2\xff\x02Z\x9d\xff\x00W\x9a\xe4\x00\\\x9e`\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\n\x00\\\x9e\x81\x00V\x99\xf6\x0cc\xa4\xffM\x9a\xd3\xffz\xbf\xf3\xffD\xa3\xee\xff;\x9e\xec\xffB\xa2\xec\xffM\xa6\xec\xff[\xae\xed\xffd\xb2\xed\xffh\xb4\xed\xffm\xb6\xed\xffs\xba\xed\xffw\xba\xed\xff~\xbd\xed\xff\xa5\xd2\xf3\xff\xc1\xe0\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffs\xbb\xf1\xffa\xb2\xef\xff3\x9a\xeb\xff0\x98\xea\xff:\x9d\xea\xffA\xa0\xea\xffG\xa3\xea\xffM\xa6\xea\xffR\xa8\xea\xffV\xa9\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xeb\xff\x94\xcc\xf5\xffn\xad\xda\xff\x18k\xa9\xff\x00T\x98\xff\x00[\x9d\x9b\x00\\\x9e\x18\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e/\x00Y\x9c\xbd\x00W\x99\xff%z\xb7\xffB\xa0\xea\xff;\x9e\xec\xffK\xa6\xed\xffY\xad\xed\xff_\xaf\xed\xffc\xb2\xed\xffh\xb4\xed\xffm\xb6\xed\xffp\xb8\xec\xff}\xbd\xee\xff\xa8\xd4\xf4\xff\xbe\xdf\xf8\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xffx\xbe\xf1\xffq\xb9\xf0\xff@\xa0\xeb\xff5\x9b\xea\xffA\xa0\xea\xffG\xa3\xea\xffM\xa6\xea\xffS\xa9\xea\xffZ\xab\xea\xff]\xae\xea\xff]\xac\xea\xffk\xb3\xeb\xff:\x87\xbf\xff\x00X\x9a\xff\x00X\x9b\xd1\x00\\\x9eD\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x03\x00[\x9d\xb6\x00[\x9e\xffi\xb2\xe8\xffq\xbc\xf4\xffT\xaa\xed\xffV\xaa\xed\xff^\xaf\xed\xffc\xb2\xed\xffh\xb4\xed\xffj\xb5\xec\xffz\xbd\xee\xff\xa9\xd5\xf5\xff\xb9\xdd\xf8\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff~\xbf\xf1\xff|\xbe\xf0\xffM\xa6\xeb\xff;\x9d\xea\xffG\xa3\xea\xffM\xa6\xea\xffS\xa9\xea\xffW\xaa\xea\xff]\xae\xea\xff\x84\xc1\xee\xff\x9c\xc9\xea\xff\ta\xa1\xff\x00Y\x9b\xcd\x00\\\x9e\x0e\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00[\x9d\x8c\x04_\xa1\xff~\xbc\xea\xff\x9c\xd2\xfa\xff\x8a\xc7\xf5\xffg\xb4\xef\xffY\xad\xec\xffa\xb1\xed\xffd\xb2\xec\xff|\xbe\xef\xff\xa9\xd4\xf6\xff\xb3\xda\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x83\xc2\xf1\xff\x88\xc4\xf1\xff^\xae\xed\xffB\xa0\xea\xffK\xa5\xea\xffN\xa6\xea\xffd\xb0\xeb\xff\x97\xca\xef\xff\xb7\xda\xf3\xff\xa9\xd0\xeb\xff\x0ef\xa4\xff\x00Z\x9c\xa7\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00[\x9d\x92\x04_\xa1\xff\x82\xbf\xee\xff\x98\xd0\xfb\xff\x99\xce\xf7\xff\x9a\xce\xf7\xff\x81\xc1\xf2\xffd\xb2\xed\xff~\xbf\xf0\xff\xa8\xd5\xf7\xff\xae\xd8\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x89\xc5\xf1\xff\x91\xc9\xf1\xffo\xb7\xed\xffN\xa6\xea\xffu\xb9\xed\xff\xa3\xd0\xf0\xff\xaf\xd6\xf1\xff\xb5\xda\xf4\xff\xaf\xd5\xef\xff\x0ef\xa4\xff\x00Z\x9c\xaa\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9em\x01[\x9d\xffT\x9c\xd1\xff\x98\xd0\xfb\xff\x9b\xd1\xfa\xff\x99\xce\xf7\xff\x9f\xd2\xf7\xff\x9a\xcf\xf6\xff\xa4\xd4\xf7\xff\xa9\xd6\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x96\xcb\xf1\xff\x93\xc8\xf0\xff\xa3\xd0\xf1\xff\xa7\xd3\xf1\xff\xb3\xd9\xf5\xff\xae\xd4\xf0\xffZ\x98\xc7\xff\x03\\\x9d\xff\x00[\x9d{\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x16\x00[\x9d\xcd\x00W\x99\xff*z\xb6\xff\x85\xc0\xec\xff\xa3\xd6\xfd\xff\x9d\xd1\xf8\xff\xa0\xd3\xf7\xff\xa4\xd4\xf7\xff\xa8\xd5\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x94\xca\xf1\xff\x9c\xcd\xf1\xff\xa3\xd1\xf2\xff\xb1\xd9\xf6\xff\x87\xba\xdf\xff!p\xac\xff\x00T\x99\xff\x00[\x9e\xb9\x00\\\x9e\x13\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00\\\x9e\x81\x00V\x99\xf5\na\xa2\xff\\\x9f\xd2\xff\xa0\xd3\xf9\xff\xa6\xd7\xfb\xff\xa4\xd4\xf7\xff\xa8\xd5\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x94\xca\xf1\xff\xa3\xd2\xf5\xff\x9e\xcd\xf0\xffQ\x95\xc6\xff\x03[\x9d\xff\x00W\x9a\xe9\x00\\\x9ei\x00\\\x9e\x01\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e.\x00Z\x9c\xb6\x00U\x99\xff(x\xb3\xff\x81\xbc\xe6\xff\xae\xdb\xfc\xff\xab\xd7\xf9\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x92\xca\xf3\xff\x9c\xd0\xf5\xffr\xae\xda\xff\x1dn\xab\xff\x00U\x99\xff\x00[\x9d\x9f\x00\\\x9e\x1d\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ed\x00V\x99\xe9\x03[\x9e\xffL\x92\xc6\xff\xa1\xd0\xf3\xff\xb6\xde\xfc\xff\xb2\xda\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x82\xc2\xf2\xff\x90\xca\xf6\xff\x82\xbe\xe9\xff8\x84\xbc\xff\x00X\x9b\xff\x00W\x9b\xd9\x00\\\x9eO\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00[\x9d\x9f\x00T\x98\xff\x18j\xa8\xfft\xaf\xd9\xff\xb8\xde\xfa\xff\xbb\xdf\xfa\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff\x80\xc2\xf4\xff\x85\xc4\xf3\xffR\x9a\xcf\xff\rc\xa3\xff\x00U\x99\xf9\x00[\x9e\x88\x00\\\x9e\x0f\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eG\x00X\x9b\xd0\x00V\x9a\xff=\x85\xbb\xff\xa3\xce\xee\xff\xc6\xe5\xfd\xff\xbf\xdf\xf8\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffo\xba\xf2\xff|\xc2\xf6\xffj\xb0\xe4\xff%w\xb4\xff\x00U\x99\xff\x00Z\x9c\xbc\x00\\\x9e3\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9e{\x00T\x99\xf5\rb\xa2\xffk\xa5\xd0\xff\xbe\xdf\xf7\xff\xcb\xe6\xfb\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffn\xbc\xf5\xffm\xb8\xf0\xff=\x8d\xc8\xff\x06^\x9f\xff\x00W\x99\xe9\x00\\\x9ed\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e0\x00Y\x9c\xbc\x00T\x98\xff*v\xb0\xff\x95\xc2\xe2\xff\xd0\xea\xfc\xff\xcd\xe6\xf9\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xffa\xb4\xf3\xffj\xb9\xf5\xffN\x9f\xda\xff\x15k\xab\xff\x00V\x98\xff\x00Z\x9d\xa7\x00\\\x9e \x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ec\x00V\x9a\xe4\x01Y\x9c\xffS\x93\xc2\xff\xbf\xdd\xf2\xff\xd9\xee\xfc\xff\xc9\xe3\xf7\xffe\xb5\xf2\xff^\xb4\xf6\xffZ\xad\xeb\xff(}\xbc\xff\x00Y\x9b\xff\x00X\x9b\xd7\x00\\\x9eO\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x18\x00[\x9d\x9a\x00S\x98\xff\x1cl\xa8\xff\x8d\xb9\xda\xff\xd1\xe9\xfb\xffk\xba\xf5\xff;\x92\xd3\xff\x0cd\xa5\xff\x00V\x99\xf7\x00[\x9d\x85\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eA\x00X\x9b\xd2\x00V\x9a\xff?\x87\xbb\xff&z\xb8\xff\x00W\x99\xff\x00Y\x9c\xc3\x00\\\x9e1\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00\\\x9e\x81\x00V\x9a\xf0\x00X\x9a\xf2\x00\\\x9eu\x00\\\x9e\x03\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0f\x00[\x9et\x00\\\x9ex\x00\\\x9e\x0b\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00', gtk.gdk.COLORSPACE_RGB, True, 8, 64, 64, 256) + window_icon = gtk.gdk.pixbuf_new_from_data('\x00\\\x9e\x00\x00\\\x9e\x00\x00^\xa0\x00\x00V\x99\x00\x00L\x91g\x00N\x93q\x00X\x9c\x00\x00^\x9f\x00\x00]\x9f\x00\x00Y\x9c\x00\x00P\x94o\x00M\x92i\x00V\x99\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00^\xa0\x00\x00T\x97\x00\x00F\x8c_1\x81\xba\xff+|\xb6\xff\x00F\x8e?\x00\\\x9e\x00\x00\\\x9e\x00\x00J\x8e;$y\xb6\xff-\x7f\xbc\xff\x00E\x8cb\x00R\x97\x00\x00^\xa0\x00\x00\\\x9e\x00\x00[\x9d\x00\x00I\x8c*\x05X\x9b\xc0P\x9b\xd5\xff\xa7\xdd\xff\xff\xbb\xe5\xff\xff@\x86\xbb\xff\x00>\x89D\x00D\x89B\'{\xbb\xff\x89\xcf\xff\xff\xa2\xdb\xff\xffg\xa6\xd5\xff\x07Y\x9b\xc3\x00C\x8c,\x00[\x9d\x00\x05\\\x9e\x971\x84\xc5\xffk\xbb\xf6\xff\x8e\xd0\xff\xff\x86\xc3\xf0\xff\xa2\xd2\xf5\xff\xc4\xe7\xff\xffP\x90\xc0\xff\x15u\xbf\xfff\xbf\xff\xffx\xc1\xf6\xff\x80\xc0\xf0\xff\xb0\xdf\xff\xff\xa9\xd7\xf6\xff\\\x97\xc5\xff\x0b]\x9e\x98\x08[\x9e\xdcX\xb0\xf0\xff\x84\xd0\xff\xffx\xbc\xf0\xff\x83\xc2\xf0\xff\x88\xc3\xee\xff\xb1\xd7\xf3\xff\xf9\xff\xff\xff\xca\xec\xff\xffm\xba\xf3\xffX\xae\xee\xff{\xbe\xf0\xff\x91\xc7\xf0\xff\xd2\xf2\xff\xff\xa6\xd4\xf0\xff\x11]\x9e\xde\x00T\x96\x00\x00N\x91\x9eD\x98\xd5\xff\x84\xc9\xfc\xff\x85\xc3\xf1\xff\xb7\xdb\xf6\xff\xe9\xf4\xfc\xff\xe9\xf5\xfd\xff\xdb\xee\xfd\xff\xdf\xef\xfc\xff\xa8\xd5\xf6\xff|\xbf\xf1\xff\xa3\xd6\xfc\xffl\xaa\xd6\xff\x00J\x91\xa1\x00Q\x96\x00\x00^\xa0\x00\x00T\x97\x00\x008\x7f\x9eC\x94\xd1\xff\xde\xf6\xff\xff\xf5\xfc\xff\xff\xe0\xef\xfb\xff\xe0\xf0\xfb\xff\xc8\xe5\xfb\xff\xcf\xe7\xfb\xff\xff\xff\xff\xff\xfe\xff\xff\xffV\x9d\xd2\xff\x002\x80\xa2\x00Q\x96\x00\x00_\xa0\x00\x00W\x99\x00\x00I\x8cq9\x89\xc3\xf1Y\xb0\xf2\xffR\xaa\xef\xff\xbc\xde\xf7\xff\xf9\xfc\xfe\xff\xe3\xf2\xfb\xff\xd3\xea\xfc\xff\xf5\xfb\xff\xff\xb7\xdb\xf7\xffd\xb1\xed\xff\x86\xc3\xf2\xffR\x93\xc4\xf3\x00D\x8du\x00T\x99\x00\x06Z\x9d\xb3I\xa0\xe0\xff\x8a\xd2\xff\xffe\xb5\xf2\xff/\x97\xe8\xffK\xa4\xe9\xff\x9c\xcd\xf0\xff\xf6\xf9\xfc\xff\xd6\xec\xfc\xffX\xab\xf0\xff\x15\x8a\xe6\xff9\x9b\xe6\xff\x8c\xc6\xf1\xff\xd1\xf0\xff\xff\x8b\xbe\xe1\xff\x0e\\\x9d\xb6\x07]\x9f\xc1D\x98\xd9\xff\x85\xcd\xff\xffm\xbc\xf9\xff;\x9d\xe9\xff^\xae\xec\xffl\xb3\xe8\xff\xb7\xd9\xf2\xffC\xa2\xef\xff\x00s\xe5\xff3\x99\xea\xffL\xa3\xe7\xff\x96\xce\xf9\xff\xc7\xeb\xff\xff\x81\xb3\xd9\xff\x10_\x9f\xc4\x00X\x9a\x00\x00H\x8bU\x1eq\xad\xeeR\xa8\xe8\xffA\xa4\xf1\xff`\xae\xea\xff\xa9\xd3\xf2\xff\xc8\xe4\xf8\xffh\xb7\xf2\xff@\xa2\xed\xff,\x95\xe8\xffQ\xaa\xef\xff|\xba\xe9\xff*u\xae\xf1\x00A\x8bX\x00V\x9a\x00\x00\\\x9e\x00\x00]\x9f\x00\x00>\x84\x0c"v\xb3\xff\x9b\xdb\xff\xff\x97\xcf\xf8\xff\xce\xe6\xf8\xff\xc5\xe1\xf7\xffe\xb5\xf1\xfft\xbc\xf0\xffu\xbe\xf5\xff\xa9\xde\xff\xff0{\xb0\xff\x00:\x85\x0f\x00]\x9f\x00\x00]\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00Y\x9c\x00\x02S\x97zH\x89\xbf\xff\xb8\xe3\xfd\xff\xe8\xfb\xff\xff\xc2\xdf\xf7\xff`\xb3\xf1\xff\x82\xcb\xff\xff\xa1\xd3\xf7\xffJ\x88\xb8\xff\x00S\x96r\x00Z\x9d\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00]\x9f\x00\x00[\x9d\x00\x00C\x8b*\x08W\x9b\xc5\x8c\xb9\xda\xff\xea\xfd\xff\xff\x80\xcb\xff\xffG\x97\xd4\xff\x03W\x99\xbc\x00E\x8d"\x00[\x9e\x00\x00]\x9f\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00_\xa0\x00\x00Q\x96\x00\x00C\x8di>\x88\xbd\xff,\x7f\xbb\xff\x00G\x8c`\x00T\x98\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00_\xa0\x00\x00R\x98\x00\x00I\x92r\x00P\x92n\x00V\x99\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00', gtk.gdk.COLORSPACE_RGB, True, 8, 16, 16, 64) + +GUI_AVAILABLE = os.environ.get("DISPLAY", '') + +if GUI_AVAILABLE: + def download(): + import pygtk + pygtk.require("2.0") + import gtk + import gobject + import pango + import webbrowser + + gtk.gdk.threads_init() + + load_serialized_images() + + global FatalVisibleError + def FatalVisibleError(s): + error = gtk.MessageDialog(parent = None, + flags = gtk.DIALOG_MODAL, + type = gtk.MESSAGE_ERROR, + buttons = gtk.BUTTONS_OK, + message_format = s) + error.set_title("Error") + error.run() + gtk.main_quit() + sys.exit(-1) + + class GeneratorTask(object): + def __init__(self, generator, loop_callback, on_done=None, on_exception=None): + self.generator = generator + self.loop_callback = loop_callback + self.on_done = on_done + self.on_exception = on_exception + + def _run(self, *args, **kwargs): + self._stopped = False + try: + for ret in self.generator(*args, **kwargs): + if ret is None: + ret = () + if not isinstance(ret, tuple): + ret = (ret,) + gobject.idle_add(self.loop_callback, *ret) + + if self._stopped: + thread.exit() + except Exception, ex: + print ex + if self.on_exception is not None: + gobject.idle_add(self.on_exception, ex) + else: + if self.on_done is not None: + gobject.idle_add(self.on_done) + + def start(self, *args, **kwargs): + t = threading.Thread(target=self._run, args=args, kwargs=kwargs) + t.setDaemon(True) + t.start() + + def stop(self): + self._stopped = True + + class DownloadDialog(gtk.Dialog): + def handle_delete_event(self, wid, ev, data=None): + self.handle_cancel(wid) + + def handle_dont_show_toggle(self, button, data=None): + reroll_autostart(not button.get_active()) + + def handle_cancel(self, button): + if self.task: + self.task.stop() + if self.download: + self.download.cancel() + gtk.main_quit() + self.user_cancelled = True + + def handle_ok(self, button): + # begin download + self.ok.hide() + self.download = DownloadState() + + self.label.hide() + if self.dont_show_again_align is not None: + self.dont_show_again_align.hide() + self.progress.show() + + def download_progress(progress, status): + if not status: + self.task.stop() + self.update_progress(DOWNLOADING, progress) + + def finished(): + self.update_progress(DOWNLOADING, 1.0) + self.unpack_dropbox() + + def error(ex): + FatalVisibleError(ERROR_CONNECTING) + + self.update_progress(DOWNLOADING, 0) + self.task = GeneratorTask(self.download.copy_data, + download_progress, + finished, error).start() + + def update_progress(self, text, fraction): + self.progress.set_text(text % int(fraction*100)) + self.progress.set_fraction(fraction) + + def unpack_dropbox(self): + def unpack_progress(name, i, total): + self.update_progress(UNPACKING, float(i)/total) + + def finished(): + self.update_progress(UNPACKING, 1.0) + gtk.main_quit() + + def error(ex): + if isinstance(ex, SignatureVerifyError): + FatalVisibleError(ERROR_SIGNATURE) + else: + FatalVisibleError(ERROR_CONNECTING) + + self.task = GeneratorTask(self.download.unpack, + unpack_progress, + finished, error).start() + + def mouse_down(self, widget, event): + if self.hovering: + self.clicked_link = True + + def mouse_up(self, widget, event): + if self.clicked_link: + webbrowser.open(LINK) + self.clicked_link = False + + def label_motion(self, widget, event): + offx, offy = self.label.get_layout_offsets() + layout = self.label.get_layout() + index = layout.xy_to_index(int((offx+event.x)*pango.SCALE), + int((offy+event.y)*pango.SCALE))[0] + link_index = layout.get_text().find(LINK) + if index >= link_index and index < link_index+len(LINK): + self.hovering = True + self.label_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) + else: + self.hovering = False + self.label_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.ARROW)) + + + def __init__(self): + super(DownloadDialog, self).__init__(parent = None, + title = "Dropbox Installation") + + self.download = None + self.hovering = False + self.clicked_link = False + self.user_cancelled = False + self.task = None + + self.ok = ok = gtk.Button(stock=gtk.STOCK_OK) + ok.connect('clicked', self.handle_ok) + self.action_area.add(ok) + ok.show() + + cancel = gtk.Button(stock=gtk.STOCK_CANCEL) + cancel.connect('clicked', self.handle_cancel) + self.action_area.add(cancel) + cancel.show() + + self.connect('delete_event', self.handle_delete_event) + + self.box_logo = gtk.image_new_from_pixbuf(box_logo_pixbuf) + self.box_logo.show() + + self.set_icon(window_icon) + + self.progress = gtk.ProgressBar() + self.progress.set_property('width-request', 300) + + self.label = gtk.Label() + GPG_WARNING_MSG = (u"\n\n" + GPG_WARNING) if not gpgme else u"" + self.label.set_markup('%s <span foreground="#000099" underline="single" weight="bold">%s</span>\n\n%s%s' % (INFO, LINK, WARNING, GPG_WARNING_MSG)) + self.label.set_line_wrap(True) + self.label.set_property('width-request', 300) + self.label.show() + + self.label_box = gtk.EventBox() + self.label_box.add(self.label) + self.label_box.connect("button-release-event", self.mouse_up) + self.label_box.connect("button-press-event", self.mouse_down) + self.label_box.connect("motion-notify-event", self.label_motion) + + self.label_box.show() + def on_realize(widget): + self.label_box.add_events(gtk.gdk.POINTER_MOTION_MASK) + self.label_box.connect("realize", on_realize) + + self.hbox = gtk.HBox(spacing=10) + self.hbox.set_property('border-width',10) + self.hbox.pack_start(self.box_logo, False, False) + self.hbox.pack_start(self.label_box, False, False) + self.hbox.pack_start(self.progress, False, False) + self.hbox.show() + + self.vbox.add(self.hbox) + + self.dont_show_again_align = None + + try: + if can_reroll_autostart(): + dont_show_again = gtk.CheckButton("_Don't show this again") + dont_show_again.connect('toggled', self.handle_dont_show_toggle) + dont_show_again.show() + + self.dont_show_again_align = gtk.Alignment(xalign=1.0, yalign=0.0, xscale=0.0, yscale=0.0) + self.dont_show_again_align.add(dont_show_again) + self.dont_show_again_align.show() + + hbox = gtk.HBox() + hbox.set_property('border-width', 10) + hbox.pack_start(self.dont_show_again_align, True, True) + hbox.show() + + self.vbox.add(hbox) + + self.set_resizable(False) + except: + traceback.print_exc() + + self.ok.grab_focus() + + dialog = DownloadDialog() + dialog.show() + gtk.main() + if dialog.user_cancelled: + raise Exception("user cancelled download!!!") +else: + def download(): + global FatalVisibleError + def FatalVisibleError(s): + console_print(u"\nError: %s" % s, f=sys.stderr) + sys.exit(-1) + + + ESC = "\x1b" + save = ESC+"7" + unsave = ESC+"8" + clear = ESC+"[2J" + erase_to_start = ESC+"[1K" + write = sys.stdout.write + flush = sys.stdout.flush + + last_progress = [None, None] + def setprogress(text, frac): + if last_progress == [text, frac]: + return + if sys.stdout.isatty(): + write(erase_to_start) + write(unsave) + console_print(text % int(100*frac), linebreak=not sys.stdout.isatty()) + if sys.stdout.isatty(): + flush() + last_progress[0], last_progress[1] = text, frac + + console_print() + if sys.stdout.isatty(): + write(save) + flush() + console_print(u"%s %s\n" % (INFO, LINK)) + GPG_WARNING_MSG = (u"\n%s" % GPG_WARNING) if not gpgme else u"" + + if not yes_no_question("%s%s" % (WARNING, GPG_WARNING_MSG)): + return + + download = DownloadState() + + try: + for progress, status in download.copy_data(): + if not status: + break + setprogress(DOWNLOADING, progress) + except Exception: + FatalVisibleError(ERROR_CONNECTING) + else: + setprogress(DOWNLOADING, 1.0) + console_print() + write(save) + + try: + for name, i, total in download.unpack(): + setprogress(UNPACKING, float(i)/total) + except SignatureVerifyError: + FatalVisibleError(ERROR_SIGNATURE) + except Exception: + FatalVisibleError(ERROR_CONNECTING) + else: + setprogress(UNPACKING, 1.0) + + console_print() + +class CommandTicker(threading.Thread): + def __init__(self): + threading.Thread.__init__(self) + self.stop_event = threading.Event() + + def stop(self): + self.stop_event.set() + + def run(self): + ticks = ['[. ]', '[.. ]', '[...]', '[ ..]', '[ .]', '[ ]'] + i = 0 + first = True + while True: + self.stop_event.wait(0.25) + if self.stop_event.isSet(): break + if i == len(ticks): + first = False + i = 0 + if not first: + sys.stderr.write("\r%s\r" % ticks[i]) + sys.stderr.flush() + i += 1 + sys.stderr.flush() + + +class DropboxCommand(object): + class CouldntConnectError(Exception): pass + class BadConnectionError(Exception): pass + class EOFError(Exception): pass + class CommandError(Exception): pass + + def __init__(self, timeout=5): + self.s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.s.settimeout(timeout) + try: + self.s.connect(os.path.expanduser(u'~/.dropbox/command_socket')) + except socket.error, e: + raise DropboxCommand.CouldntConnectError() + self.f = self.s.makefile("r+", 4096) + + def close(self): + self.f.close() + self.s.close() + + def __readline(self): + try: + toret = self.f.readline().decode('utf8').rstrip(u"\n") + except socket.error, e: + raise DropboxCommand.BadConnectionError() + if toret == '': + raise DropboxCommand.EOFError() + else: + return toret + + # atttribute doesn't exist, i know what you want + def send_command(self, name, args): + self.f.write(name.encode('utf8')) + self.f.write(u"\n".encode('utf8')) + self.f.writelines((u"\t".join([k] + (list(v) + if hasattr(v, '__iter__') else + [v])) + u"\n").encode('utf8') + for k,v in args.iteritems()) + self.f.write(u"done\n".encode('utf8')) + + self.f.flush() + + # Start a ticker + ticker_thread = CommandTicker() + ticker_thread.start() + + # This is the potentially long-running call. + try: + ok = self.__readline() == u"ok" + except KeyboardInterrupt: + raise DropboxCommand.BadConnectionError("Keyboard interruption detected") + finally: + # Tell the ticker to stop. + ticker_thread.stop() + ticker_thread.join() + + if ok: + toret = {} + for i in range(21): + if i == 20: + raise Exception(u"close this connection!") + + line = self.__readline() + if line == u"done": + break + + argval = line.split(u"\t") + toret[argval[0]] = argval[1:] + + return toret + else: + problems = [] + for i in range(21): + if i == 20: + raise Exception(u"close this connection!") + + line = self.__readline() + if line == u"done": + break + + problems.append(line) + + raise DropboxCommand.CommandError(u"\n".join(problems)) + + # this is the hotness, auto marshalling + def __getattr__(self, name): + try: + return super(DropboxCommand, self).__getattr__(name) + except: + def __spec_command(**kw): + return self.send_command(unicode(name), kw) + self.__setattr__(name, __spec_command) + return __spec_command + +commands = {} +aliases = {} + +def command(meth): + global commands, aliases + assert meth.__doc__, "All commands need properly formatted docstrings (even %r!!)" % meth + if hasattr(meth, 'im_func'): # bound method, if we ever have one + meth = meth.im_func + commands[meth.func_name] = meth + meth_aliases = [unicode(alias) for alias in aliases.iterkeys() if aliases[alias].func_name == meth.func_name] + if meth_aliases: + meth.__doc__ += u"\nAliases: %s" % ",".join(meth_aliases) + return meth + +def alias(name): + def decorator(meth): + global commands, aliases + assert name not in commands, "This alias is the name of a command." + aliases[name] = meth + return meth + return decorator + +def requires_dropbox_running(meth): + def newmeth(*n, **kw): + if is_dropbox_running(): + return meth(*n, **kw) + else: + console_print(u"Dropbox isn't running!") + newmeth.func_name = meth.func_name + newmeth.__doc__ = meth.__doc__ + return newmeth + +def start_dropbox(): + db_path = os.path.expanduser(u"~/.dropbox-dist/dropboxd").encode(sys.getfilesystemencoding()) + if os.access(db_path, os.X_OK): + f = open("/dev/null", "w") + # we don't reap the child because we're gonna die anyway, let init do it + a = subprocess.Popen([db_path], preexec_fn=os.setsid, cwd=os.path.expanduser("~"), + stderr=sys.stderr, stdout=f, close_fds=True) + + # in seconds + interval = 0.5 + wait_for = 60 + for i in xrange(int(wait_for / interval)): + if is_dropbox_running(): + return True + # back off from connect for a while + time.sleep(interval) + + return False + else: + return False + +# Extracted and modified from os.cmd.Cmd +def columnize(list, display_list=None, display_width=None): + if not list: + console_print(u"<empty>") + return + + non_unicode = [i for i in range(len(list)) if not (isinstance(list[i], unicode))] + if non_unicode: + raise TypeError, ("list[i] not a string for i in %s" % + ", ".join(map(unicode, non_unicode))) + + if not display_width: + d = os.popen('stty size', 'r').read().split() + if d: + display_width = int(d[1]) + else: + for item in list: + console_print(item) + return + + if not display_list: + display_list = list + + size = len(list) + if size == 1: + console_print(display_list[0]) + return + + for nrows in range(1, len(list)): + ncols = (size+nrows-1) // nrows + colwidths = [] + totwidth = -2 + for col in range(ncols): + colwidth = 0 + for row in range(nrows): + i = row + nrows*col + if i >= size: + break + x = list[i] + colwidth = max(colwidth, len(x)) + colwidths.append(colwidth) + totwidth += colwidth + 2 + if totwidth > display_width: + break + if totwidth <= display_width: + break + else: + nrows = len(list) + ncols = 1 + colwidths = [0] + lines = [] + for row in range(nrows): + texts = [] + display_texts = [] + for col in range(ncols): + i = row + nrows*col + if i >= size: + x = "" + y = "" + else: + x = list[i] + y = display_list[i] + texts.append(x) + display_texts.append(y) + while texts and not texts[-1]: + del texts[-1] + original_texts = texts[:] + for col in range(len(texts)): + texts[col] = texts[col].ljust(colwidths[col]) + texts[col] = texts[col].replace(original_texts[col], display_texts[col]) + line = u" ".join(texts) + lines.append(line) + for line in lines: + console_print(line) + +@command +@requires_dropbox_running +@alias('stat') +def filestatus(args): + u"""get current sync status of one or more files +dropbox filestatus [-l] [-a] [FILE]... + +Prints the current status of each FILE. + +options: + -l --list prints out information in a format similar to ls. works best when your console supports color :) + -a --all do not ignore entries starting with . +""" + global enc + + oparser = optparse.OptionParser() + oparser.add_option("-l", "--list", action="store_true", dest="list") + oparser.add_option("-a", "--all", action="store_true", dest="all") + (options, args) = oparser.parse_args(args) + + try: + with closing(DropboxCommand()) as dc: + if options.list: + # Listing. + + # Separate directories from files. + if len(args) == 0: + dirs, nondirs = [u"."], [] + else: + dirs, nondirs = [], [] + + for a in args: + try: + (dirs if os.path.isdir(a) else nondirs).append(a.decode(enc)) + except UnicodeDecodeError: + continue + + if len(dirs) == 0 and len(nondirs) == 0: + #TODO: why? + sys.exit(1) + + dirs.sort(key=methodcaller('lower')) + nondirs.sort(key=methodcaller('lower')) + + # Gets a string representation for a path. + def path_to_string(file_path): + if not os.path.exists(file_path): + path = u"%s (File doesn't exist!)" % os.path.basename(file_path) + return (path, path) + try: + status = dc.icon_overlay_file_status(path=file_path).get(u'status', [None])[0] + except DropboxCommand.CommandError, e: + path = u"%s (%s)" % (os.path.basename(file_path), e) + return (path, path) + + env_term = os.environ.get('TERM','') + supports_color = (sys.stderr.isatty() and ( + env_term.startswith('vt') or + env_term.startswith('linux') or + 'xterm' in env_term or + 'color' in env_term + ) + ) + + # TODO: Test when you don't support color. + if not supports_color: + path = os.path.basename(file_path) + return (path, path) + + if status == u"up to date": + init, cleanup = "\x1b[32;1m", "\x1b[0m" + elif status == u"syncing": + init, cleanup = "\x1b[36;1m", "\x1b[0m" + elif status == u"unsyncable": + init, cleanup = "\x1b[41;1m", "\x1b[0m" + elif status == u"selsync": + init, cleanup = "\x1b[37;1m", "\x1b[0m" + else: + init, cleanup = '', '' + + path = os.path.basename(file_path) + return (path, u"%s%s%s" % (init, path, cleanup)) + + # Prints a directory. + def print_directory(name): + clean_paths = [] + formatted_paths = [] + for subname in sorted(os.listdir(name), key=methodcaller('lower')): + if type(subname) != unicode: + continue + + if not options.all and subname[0] == u'.': + continue + + try: + clean, formatted = path_to_string(unicode_abspath(os.path.join(name, subname))) + clean_paths.append(clean) + formatted_paths.append(formatted) + except (UnicodeEncodeError, UnicodeDecodeError), e: + continue + + columnize(clean_paths, formatted_paths) + + try: + if len(dirs) == 1 and len(nondirs) == 0: + print_directory(dirs[0]) + else: + nondir_formatted_paths = [] + nondir_clean_paths = [] + for name in nondirs: + try: + clean, formatted = path_to_string(unicode_abspath(name)) + nondir_clean_paths.append(clean) + nondir_formatted_paths.append(formatted) + except (UnicodeEncodeError, UnicodeDecodeError), e: + continue + + if nondir_clean_paths: + columnize(nondir_clean_paths, nondir_formatted_paths) + + if len(nondirs) == 0: + console_print(dirs[0] + u":") + print_directory(dirs[0]) + dirs = dirs[1:] + + for name in dirs: + console_print() + console_print(name + u":") + print_directory(name) + + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + else: + if len(args) == 0: + args = [name for name in sorted(os.listdir(u"."), key=methodcaller('lower')) if type(name) == unicode] + if len(args) == 0: + # Bail early if there's nothing to list to avoid crashing on indent below + console_print(u"<empty>") + return + indent = max(len(st)+1 for st in args) + for file in args: + + try: + if type(file) is not unicode: + file = file.decode(enc) + fp = unicode_abspath(file) + except (UnicodeEncodeError, UnicodeDecodeError), e: + continue + if not os.path.exists(fp): + console_print(u"%-*s %s" % \ + (indent, file+':', "File doesn't exist")) + continue + + try: + status = dc.icon_overlay_file_status(path=fp).get(u'status', [u'unknown'])[0] + console_print(u"%-*s %s" % (indent, file+':', status)) + except DropboxCommand.CommandError, e: + console_print(u"%-*s %s" % (indent, file+':', e)) + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + +@command +@requires_dropbox_running +def ls(args): + u"""list directory contents with current sync status +dropbox ls [FILE]... + +This is an alias for filestatus -l +""" + return filestatus(["-l"] + args) + +@command +@requires_dropbox_running +def puburl(args): + u"""get public url of a file in your dropbox's public folder +dropbox puburl FILE + +Prints out a public url for FILE (which must be in your public folder). +""" + if len(args) != 1: + console_print(puburl.__doc__,linebreak=False) + return + + try: + with closing(DropboxCommand()) as dc: + try: + console_print(dc.get_public_link(path=unicode_abspath(args[0].decode(sys.getfilesystemencoding()))).get(u'link', [u'No Link'])[0]) + except DropboxCommand.CommandError, e: + console_print(u"Couldn't get public url: " + str(e)) + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + +@command +@requires_dropbox_running +def sharelink(args): + u"""get a shared link for a file in your dropbox +dropbox sharelink FILE + +Prints out a shared link for FILE. +""" + if len(args) != 1: + console_print(sharelink.__doc__, linebreak=False) + return + + try: + with closing(DropboxCommand()) as dc: + try: + path = unicode_abspath(args[0].decode(sys.getfilesystemencoding())) + link = dc.get_shared_link(path=path).get('link', [u'No link'])[0] + console_print(link) + except DropboxCommand.CommandError, e: + console_print(u"Couldn't get shared link: " + str(e)) + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + +@command +@requires_dropbox_running +def proxy(args): + u"""set proxy settings for Dropbox +dropbox proxy MODE [TYPE] [HOST] [PORT] [USERNAME] [PASSWORD] + +Set proxy settings for Dropbox. + +MODE - one of "none", "auto", "manual" +TYPE - one of "http", "socks4", "socks5" (only valid with "manual" mode) +HOST - proxy hostname (only valid with "manual" mode) +PORT - proxy port (only valid with "manual" mode) +USERNAME - (optional) proxy username (only valid with "manual" mode) +PASSWORD - (optional) proxy password (only valid with "manual" mode) +""" + mode = None + type_ = None + if len(args) >= 1: + mode = args[0].decode(sys.getfilesystemencoding()).lower() + if len(args) >= 2: + type_ = args[1].decode(sys.getfilesystemencoding()).lower() + + if (len(args) == 0 or + mode not in [u'none', u'auto', u'manual'] or + (mode == 'manual' and len(args) not in (4, 6)) or + (mode != 'manual' and len(args) != 1) or + (mode == 'manual' and type_ not in [u'http', u'socks4', u'socks5'])): + # Print help + console_print(proxy.__doc__, linebreak=False) + return + + ARGS = ['mode', 'type', 'host', 'port', 'username', 'password'] + + # Load the args into a dictionary + kwargs = dict(zip(ARGS, [a.decode(sys.getfilesystemencoding()) for a in args])) + + # Re-set these two because they were coerced to lower case + kwargs['mode'] = mode + if type_: + kwargs['type'] = type_ + + try: + with closing(DropboxCommand()) as dc: + try: + dc.set_proxy_settings(**kwargs) + console_print(u'set') + except DropboxCommand.CommandError, e: + console_print(u"Couldn't set proxy: " + str(e)) + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + +@command +@requires_dropbox_running +def throttle(args): + u"""set bandwidth limits for Dropbox +dropbox throttle DOWNLOAD UPLOAD + +Set bandwidth limits for file sync. + +DOWNLOAD - either "unlimited" or a manual limit in KB/s +UPLOAD - one of "unlimited", "auto", or a manual limit in KB/s +""" + if len(args) != 2: + console_print(throttle.__doc__, linebreak=False) + return + + downlimit = args[0].decode(sys.getfilesystemencoding()).lower() + uplimit = args[1].decode(sys.getfilesystemencoding()).lower() + + download_limit = None + download_mode = None + if downlimit == u'unlimited': + download_mode = downlimit + else: + try: + download_limit = int(downlimit) + download_mode = u'manual' + except ValueError: + console_print(throttle.__doc__, linebreak=False) + return + + upload_limit = None + upload_mode = None + if uplimit in [u'unlimited', u'auto']: + upload_mode = uplimit + else: + try: + upload_limit = int(uplimit) + upload_mode = u'manual' + except ValueError: + console_print(throttle.__doc__, linebreak=False) + return + + kwargs = { + u'download_mode': download_mode, + u'upload_mode': upload_mode, + } + if download_limit: + kwargs[u'download_limit'] = unicode(download_limit) + if upload_limit: + kwargs[u'upload_limit'] = unicode(upload_limit) + + try: + with closing(DropboxCommand()) as dc: + try: + dc.set_bandwidth_limits(**kwargs) + console_print(u'set') + except DropboxCommand.CommandError, e: + console_print(u"Couldn't set bandwidth limits: " + str(e)) + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + +@command +@requires_dropbox_running +def status(args): + u"""get current status of the dropboxd +dropbox status + +Prints out the current status of the Dropbox daemon. +""" + if len(args) != 0: + console_print(status.__doc__,linebreak=False) + return + + try: + with closing(DropboxCommand()) as dc: + try: + lines = dc.get_dropbox_status()[u'status'] + if len(lines) == 0: + console_print(u'Idle') + else: + for line in lines: + console_print(line) + except KeyError: + console_print(u"Couldn't get status: daemon isn't responding") + except DropboxCommand.CommandError, e: + console_print(u"Couldn't get status: " + str(e)) + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + +@command +def running(argv): + u"""return whether dropbox is running +dropbox running + +Returns 1 if running 0 if not running. +""" + return int(is_dropbox_running()) + +@command +@requires_dropbox_running +def stop(args): + u"""stop dropboxd +dropbox stop + +Stops the dropbox daemon. +""" + try: + with closing(DropboxCommand()) as dc: + try: + dc.tray_action_hard_exit() + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + +#returns true if link is necessary +def grab_link_url_if_necessary(): + try: + with closing(DropboxCommand()) as dc: + try: + link_url = dc.needs_link().get(u"link_url", None) + if link_url is not None: + console_print(u"To link this computer to a dropbox account, visit the following url:\n%s" % link_url[0]) + return True + else: + return False + except DropboxCommand.CommandError, e: + pass + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + +@command +@requires_dropbox_running +def lansync(argv): + u"""enables or disables LAN sync +dropbox lansync [y/n] + +options: + y dropbox will use LAN sync (default) + n dropbox will not use LAN sync +""" + if len(argv) != 1: + console_print(lansync.__doc__, linebreak=False) + return + + s = argv[0].lower() + if s.startswith('y') or s.startswith('-y'): + should_lansync = True + elif s.startswith('n') or s.startswith('-n'): + should_lansync = False + else: + should_lansync = None + + if should_lansync is None: + console_print(lansync.__doc__,linebreak=False) + else: + with closing(DropboxCommand()) as dc: + dc.set_lan_sync(lansync='enabled' if should_lansync else 'disabled') + + +@command +@requires_dropbox_running +def exclude(args): + u"""ignores/excludes a directory from syncing +dropbox exclude [list] +dropbox exclude add [DIRECTORY] [DIRECTORY] ... +dropbox exclude remove [DIRECTORY] [DIRECTORY] ... + +"list" prints a list of directories currently excluded from syncing. +"add" adds one or more directories to the exclusion list, then resynchronizes Dropbox. +"remove" removes one or more directories from the exclusion list, then resynchronizes Dropbox. +With no arguments, executes "list". +Any specified path must be within Dropbox. +""" + if len(args) == 0: + try: + with closing(DropboxCommand()) as dc: + try: + lines = [relpath(path) for path in dc.get_ignore_set()[u'ignore_set']] + lines.sort() + if len(lines) == 0: + console_print(u'No directories are being ignored.') + else: + console_print(u'Excluded: ') + for line in lines: + console_print(unicode(line)) + except KeyError: + console_print(u"Couldn't get ignore set: daemon isn't responding") + except DropboxCommand.CommandError, e: + if e.args[0].startswith(u"No command exists by that name"): + console_print(u"This version of the client does not support this command.") + else: + console_print(u"Couldn't get ignore set: " + str(e)) + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding!") + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + elif len(args) == 1 and args[0] == u"list": + exclude([]) + elif len(args) >= 2: + sub_command = args[0] + paths = args[1:] + absolute_paths = [unicode_abspath(path.decode(sys.getfilesystemencoding())) for path in paths] + if sub_command == u"add": + try: + with closing(DropboxCommand(timeout=None)) as dc: + try: + result = dc.ignore_set_add(paths=absolute_paths) + if result[u"ignored"]: + console_print(u"Excluded: ") + lines = [relpath(path) for path in result[u"ignored"]] + for line in lines: + console_print(unicode(line)) + except KeyError: + console_print(u"Couldn't add ignore path: daemon isn't responding") + except DropboxCommand.CommandError, e: + if e.args[0].startswith(u"No command exists by that name"): + console_print(u"This version of the client does not support this command.") + else: + console_print(u"Couldn't get ignore set: " + str(e)) + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding! [%s]" % e) + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + elif sub_command == u"remove": + try: + with closing(DropboxCommand(timeout=None)) as dc: + try: + result = dc.ignore_set_remove(paths=absolute_paths) + if result[u"removed"]: + console_print(u"No longer excluded: ") + lines = [relpath(path) for path in result[u"removed"]] + for line in lines: + console_print(unicode(line)) + except KeyError: + console_print(u"Couldn't remove ignore path: daemon isn't responding") + except DropboxCommand.CommandError, e: + if e.args[0].startswith(u"No command exists by that name"): + console_print(u"This version of the client does not support this command.") + else: + console_print(u"Couldn't get ignore set: " + str(e)) + except DropboxCommand.BadConnectionError, e: + console_print(u"Dropbox isn't responding! [%s]" % e) + except DropboxCommand.EOFError: + console_print(u"Dropbox daemon stopped.") + except DropboxCommand.CouldntConnectError, e: + console_print(u"Dropbox isn't running!") + else: + console_print(exclude.__doc__, linebreak=False) + return + else: + console_print(exclude.__doc__, linebreak=False) + return + +@command +def start(argv): + u"""start dropboxd +dropbox start [-i] + +Starts the dropbox daemon, dropboxd. If dropboxd is already running, this will do nothing. + +options: + -i --install auto install dropboxd if not available on the system +""" + + should_install = "-i" in argv or "--install" in argv + + # first check if dropbox is already running + if is_dropbox_running(): + if not grab_link_url_if_necessary(): + console_print(u"Dropbox is already running!") + return + + console_print(u"Starting Dropbox...", linebreak=False) + console_flush() + if not start_dropbox(): + if not should_install: + console_print() + console_print(u"The Dropbox daemon is not installed!") + console_print(u"Run \"dropbox start -i\" to install the daemon") + return + + # install dropbox!!! + try: + download() + except: + traceback.print_exc() + else: + if GUI_AVAILABLE: + start_dropbox() + console_print(u"Done!") + else: + if start_dropbox(): + if not grab_link_url_if_necessary(): + console_print(u"Done!") + else: + if not grab_link_url_if_necessary(): + console_print(u"Done!") + + +def can_reroll_autostart(): + return u".config" in os.listdir(os.path.expanduser(u'~')) + +def reroll_autostart(should_autostart): + home_dir = os.path.expanduser(u'~') + contents = os.listdir(home_dir) + + # UBUNTU + if u".config" in contents: + autostart_dir = os.path.join(home_dir, u".config", u"autostart") + autostart_link = os.path.join(autostart_dir, u"dropbox.desktop") + if should_autostart: + if os.path.exists(DESKTOP_FILE): + if not os.path.exists(autostart_dir): + os.makedirs(autostart_dir) + shutil.copyfile(DESKTOP_FILE, autostart_link) + elif os.path.exists(autostart_link): + os.remove(autostart_link) + + + +@command +def autostart(argv): + u"""automatically start dropbox at login +dropbox autostart [y/n] + +options: + n dropbox will not start automatically at login + y dropbox will start automatically at login (default) + +Note: May only work on current Ubuntu distributions. +""" + if len(argv) != 1: + console_print(''.join(autostart.__doc__.split('\n', 1)[1:]).decode('ascii')) + return + + s = argv[0].lower() + if s.startswith('y') or s.startswith('-y'): + should_autostart = True + elif s.startswith('n') or s.startswith('-n'): + should_autostart = False + else: + should_autostart = None + + if should_autostart is None: + console_print(autostart.__doc__,linebreak=False) + else: + reroll_autostart(should_autostart) + +@command +def help(argv): + u"""provide help +dropbox help [COMMAND] + +With no arguments, print a list of commands and a short description of each. With a command, print descriptive help on how to use the command. +""" + if not argv: + return usage(argv) + for command in commands: + if command == argv[0]: + console_print(commands[command].__doc__.split('\n', 1)[1].decode('ascii')) + return + for alias in aliases: + if alias == argv[0]: + console_print(aliases[alias].__doc__.split('\n', 1)[1].decode('ascii')) + return + console_print(u"unknown command '%s'" % argv[0], f=sys.stderr) + +def usage(argv): + console_print(u"Dropbox command-line interface\n") + console_print(u"commands:\n") + console_print(u"Note: use dropbox help <command> to view usage for a specific command.\n") + out = [] + for command in commands: + out.append((command, commands[command].__doc__.splitlines()[0])) + spacing = max(len(o[0])+3 for o in out) + for o in out: + console_print(" %-*s%s" % (spacing, o[0], o[1])) + console_print() + +def main(argv): + global commands + + # now we need to find out if one of the commands are in the + # argv list, and if so split the list at the point to + # separate the argv list at that point + cut = None + for i in range(len(argv)): + if argv[i] in commands or argv[i] in aliases: + cut = i + break + + if cut == None: + usage(argv) + os._exit(0) + return + + # lol no options for now + globaloptionparser = optparse.OptionParser() + globaloptionparser.parse_args(argv[0:i]) + + # now dispatch and run + result = None + if argv[i] in commands: + result = commands[argv[i]](argv[i+1:]) + elif argv[i] in aliases: + result = aliases[argv[i]](argv[i+1:]) + + # flush, in case output is rerouted to a file. + console_flush() + + # done + return result + +if __name__ == "__main__": + ret = main(sys.argv) + if ret is not None: + sys.exit(ret) diff --git a/bin/edit b/bin/edit @@ -0,0 +1,3 @@ +#!/bin/sh + +exec vim "$@" diff --git a/bin/epih b/bin/epih @@ -0,0 +1,10 @@ +#!/bin/sh + +cat <<EOF +/* +** EPITECH PROJECT, 2017 +** $1 +** File description +** ${2:- 1} +*/ +EOF diff --git a/bin/extract b/bin/extract @@ -0,0 +1,20 @@ +#!/bin/sh +# extract an archive file given its extension + +for file in "$@" +do + case "$file" in + ( *.tar.gz | *.tgz ) tar -xzf "$file" ;; + ( *.tar.bz2 | *.tbz2 ) tar -xjf "$file" ;; + ( *.tar ) tar -xf "$file" ;; + ( *.bz2 ) bunzip2 "$file" ;; + ( *.gz ) gunzip "$file" ;; + ( *.rar ) unrar x "$file" ;; + ( *.zip ) unzip "$file" ;; + ( *.Z ) uncompress "$file" ;; + ( *.7z ) 7z x "$file" ;; + ( *.xz ) xz -d "$file" ;; + ( *.deb ) ar vx "$file" ;; + ( * ) exit 1 ;; + esac +done diff --git a/bin/fmt b/bin/fmt @@ -0,0 +1,2 @@ +#!/bin/sh +tr '\n' ' ' | fold -w 80 -s | sed 's/ *$//' diff --git a/bin/fun-dna b/bin/fun-dna @@ -0,0 +1,106 @@ +#!/bin/sh +# prints nucleotides with full structure, sequentially + +# Usage: dna [ATCG]... + + +R='' B='' +f1=''; f2=''; f3=''; f4=''; f5=''; f6=''; f7='' + +A="\ + ${f1}O${R} ${f1}O${R} *---* + \\\\ / / \\ + ${f3}P${R} ${f4}N${R}. ${f4}N${R}H2 ${f6}|||||||${R} ${f1}O${R} * * + / \\ // \`. / \\\\ / \`. ,'| + ${f1}O${R}- ${f1}O${R} * *---* *---${f4}N${R} \`${f1}O${R}' * + / \\ // \\\\ / \\ / + * ,${f1}O${R}. ${f4}N${R}---* ${f4}N${R} ${f6}||||||||${R} H${f4}N${R} * ${f1}O${R} ${f1}O${R}- + |,' \`. / \\ / \\ // \\ / + * * ${f4}N${R}===* *---* ${f3}P${R} + \\ / // \\ / \\\\ + *---* Adenine ${f1}O${R} * ${f1}O${R} ${f1}O${R} + | | +" + +G="\ + ${f1}O${R} ${f1}O${R} *---* + \\\\ / / \\ + ${f3}P${R} ${f4}N${R}. ${f1}O${R} ${f6}|||||||${R} H2${f4}N${R} * * + / \\ // \`. // \\ / \`. ,'| + ${f1}O${R}- ${f1}O${R} * *---* *---${f4}N${R} \`${f1}O${R}' * + / \\ // \\ / \\ / + * ,${f1}O${R}. ${f4}N${R}---* ${f4}N${R}H ${f6}||||||||${R} ${f4}N${R} * ${f1}O${R} ${f1}O${R}- + |,' \`. / \\ / \\\\ // \\ / + * * ${f4}N${R}===* *---* ${f3}P${R} + \\ / \\ // / \\\\ + *---* Guanine ${f4}N${R}H2 ${f6}|||||||${R} ${f1}O${R} ${f1}O${R} ${f1}O${R} + | | +" + +C="\ + ${f1}O${R} ${f1}O${R} ${f1}O${R} ${f6}|||||||${R} H2${f4}N${R} *---* + \\\\ / // \\ / \\ + ${f3}P${R} *---* *===${f4}N${R} * * + / \\ // \\\\ / \\ / \`. ,'| + ${f1}O${R}- ${f1}O${R} * ${f4}N${R} ${f6}||||||||${R} H${f4}N${R} *---${f4}N${R} \`${f1}O${R}' * + / \\ / \\ // \\ / + * ,${f1}O${R}. ${f4}N${R}---* *---* * ${f1}O${R} ${f1}O${R}- + |,' \`. / \\ // \`. // \\ / + * * ${f4}N${R}H2 ${f6}|||||||${R} ${f1}O${R} \`${f4}N${R} ${f3}P${R} + \\ / / \\\\ + *---* Cytosine ${f1}O${R} ${f1}O${R} + | | +" + +T="\ + ${f1}O${R} ${f1}O${R} * ${f1}O${R} *---* + \\\\ / \\ // / \\ + ${f3}P${R} *---* *===${f4}N${R} * * + / \\ // \\ / \\ / \`. ,'| + ${f1}O${R}- ${f1}O${R} * ${f4}N${R}H ${f6}||||||||${R} ${f4}N${R} *---${f4}N${R} \`${f1}O${R}' * + / \\ / \\\\ // \\ / + * ,${f1}O${R}. ${f4}N${R}---* *---* * ${f1}O${R} ${f1}O${R}- + |,' \`. / \\\\ / \`. // \\ / + * * ${f1}O${R} ${f6}|||||||${R} H2${f4}N${R} \`${f4}N${R} ${f3}P${R} + \\ / / \\\\ + *---* Thymine ${f1}O${R} ${f1}O${R} + | | +" + + +nucleotide() +{ + case "$1" in + ( A* ) printf %s "$A" ;; ( T* ) printf %s "$T" ;; + ( C* ) printf %s "$C" ;; ( G* ) printf %s "$G" ;; + esac +} + + +random() +{ + while date +%s | md5sum | tr -cd '0-9a-f\n' | + tr 0-9a-f ATCGATCGATCGATCG | fold -w 1 + do + sleep 4 + done | while read -r n + do + nucleotide "$n" + sleep 1 + done +} + + +main() +{ + [ -z "$1" ] && random + + while [ "$1" ] + do + nucleotide "$1" + set -- "${1#?}" + done +} + + +main "$@" diff --git a/bin/fun-dump b/bin/fun-dump @@ -0,0 +1,17 @@ +#!/bin/sh +hexdump -C /dev/urandom | awk ' + + /eb/ { + printf("\033[1;32m"); + } + + /da/ { + printf("\033[1;7m"); + } + + { + gsub(/31/, "\033[1;31m##\033[m"); + gsub(/41/, "\033[1;7;31m**\033[m"); + printf("%s\033[m\n", $0); + } +' diff --git a/bin/fun-fullwidth b/bin/fun-fullwidth @@ -0,0 +1,11 @@ +#!/bin/sh +# Fullwidth letters + +printf '%s\n' "$*" | +sed ' + y/!"#$%&'\''()*+,-.\/0123456789:;<=>?/!"#$%&'()*+,-./0123456789:;<=>?/ + y/@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_/@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_/ + y/`abcdefghijklmnopqrstuvwxyz{|}~/`abcdefghijklmnopqrstuvwxyz{|}~/ + s/ / /g +' + diff --git a/bin/fun-mirror b/bin/fun-mirror @@ -0,0 +1,2 @@ +#!/bin/sh +sed 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ɒdɔbɘᎸǫʜiꞁʞ|mᴎoqpɿꙅƚuvwxʏƹAᙠƆᗡƎꟻᎮHIႱ⋊⅃MͶOꟼỌЯꙄTUVWXYƸ/' | rev diff --git a/bin/fun-piano b/bin/fun-piano @@ -0,0 +1,124 @@ +#!/bin/sh +# console piano using speaker-test + +SPEAKER_TEST='speaker-test -t sine' + +# _________________________________________________________________________ +# | | | | | | | | | | | | | | | | | | | | | | | | | +# | |Db| |Eb| | |Gb| |Ab| |Bb| | |Db| |Eb| | |Gb| |Ab| |Bb| | +# | |C#| |D#| | |F#| |G#| |A#| | |C#| |D#| | |F#| |G#| |A#| | +# | |__| |__| | |__| |__| |__| | |__| |__| | |__| |__| |__| | +# | | | | | | | | | | | | | | | +# | C | D | E | F | G | A | B | C | D | E | F | G | A | B | +# |____|____|____|____|_____|____|____|____|____|____|____|_____|____|____| + +# ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ______ +# |Esc |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10 |F11 |F12 |Del | +# |____|____|____|____|____|____|____|____|____|____|____|____|____|______| +# | | |C#Eb|D#Eb| |F#Gb|G#Ab|A#Bb| |C#Db|D#Ab| |F#Gb|Bkspc | +# |____|____|____|____|____|____|____|____|____|____|____|____|____|______| +# |Tab |C |D |E |F |G |A |B |C |D |E |F |G | | +# |_____|____|____|____|____|____|____|____|____|____|____|____|____| <-' | +# |Caps | |C#Eb|D#Eb| |F#Gb|G#Ab|A#Bb| |C#Db|D#Eb| | | | +# |______|____|____|____|____|____|____|____|____|____|____|____|____|____| +# |Shift |C |D |E |F |G |A |B |C |D |E |Shift | +# |_______|____|____|____|____|____|____|____|____|____|____|_____________| +# |Ctrl |Super |Alt |Space |Alt Gr|Opt |Ctrl | +# |______|______|______|_______________________________|______|_____|_____| + +# qwerty +# ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ______ +# |Esc |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10 |F11 |F12 |Del | +# |____|____|____|____|____|____|____|____|____|____|____|____|____|______| +# |` ~ |1 ! |2 @ |3 # |4 $ |5 % |6 ^ |7 & |8 * |9 ( |0 ) |- _ |= + |Bkspc | +# |____|____|____|____|____|____|____|____|____|____|____|____|____|______| +# |Tab |Q |W |E |R |T |Y |U |I |O |P |[ { |] } | | +# |_____|____|____|____|____|____|____|____|____|____|____|____|____| <-' | +# |Caps |A |S |D |F |G |H |J |K |L |; : |' " |\ | | | +# |______|____|____|____|____|____|____|____|____|____|____|____|____|____| +# |Shift |Z |X |C |V |B |N |M |, < |. > |/ ? |Shift | +# |_______|____|____|____|____|____|____|____|____|____|____|_____________| +# |Ctrl |Super |Alt |Space |Alt Gr|Opt |Ctrl | +# |______|______|______|_______________________________|______|_____|_____| + +# dvorak +# ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ______ +# |Esc |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10 |F11 |F12 |Del | +# |____|____|____|____|____|____|____|____|____|____|____|____|____|______| +# |` ~ |1 ! |2 @ |3 # |4 $ |5 % |6 ^ |7 & |8 * |9 ( |0 ) |[ { |] } |Bkspc | +# |____|____|____|____|____|____|____|____|____|____|____|____|____|______| +# |Tab |' " |, < |. > |P |Y |F |G |C |R |L |/ ? |= + | | +# |_____|____|____|____|____|____|____|____|____|____|____|____|____| <-' | +# |Caps |A |O |E |U |I |D |H |T |N |S |- _ |\ | | | +# |______|____|____|____|____|____|____|____|____|____|____|____|____|____| +# |Shift |; : |Q |J |K |X |B |M |W |V |Z |Shift | +# |_______|____|____|____|____|____|____|____|____|____|____|_____________| +# |Ctrl |Super |Alt |Space |Alt Gr|Opt |Ctrl | +# |______|______|______|_______________________________|______|_____|_____| + +awk -v SPEAKER_TEST="$SPEAKER_TEST" ' + +BEGIN { + qwerty = "zsxdcvgbhnjm,l.;/" "q2w3er5t6y7ui9o0p[=]"; + QWERTY = "ZSXDCVGBHNJM<L>:/" "Q@W#ER%T^Y&UI(O)P{+}"; + qwerty = qwerty QWERTY; + + dvorak = ";oqejkixdbhmwnvsz" "'\''2,3.p5y6f7gc9r0l/]="; + DVORAK = ":OQEJKIXDBHMWNVSZ" "\"@<#>P%Y^F&GC(R)L?}+"; + dvorak = dvorak DVORAK; + + layout = qwerty; + + # notes frequencies + + C0 = 16 " "; Cd0 = 17 " "; D0 = 18 " "; Dd0 = 19 " "; + E0 = 21 " "; F0 = 22 " "; Fd0 = 23 " "; G0 = 25 " "; + Gd0 = 26 " "; A0 = 28 " "; Ad0 = 29 " "; B0 = 31 " "; + C1 = 33 " "; Cd1 = 35 " "; D1 = 37 " "; Dd1 = 39 " "; + E1 = 41 " "; F1 = 44 " "; Fd1 = 46 " "; G1 = 49 " "; + Gd1 = 52 " "; A1 = 55 " "; Ad1 = 58 " "; B1 = 62 " "; + C2 = 65 " "; Cd2 = 69 " "; D2 = 73 " "; Dd2 = 78 " "; + E2 = 82 " "; F2 = 87 " "; Fd2 = 93 " "; G2 = 98 " "; + Gd2 = 104 " "; A2 = 110 " "; Ad2 = 117 " "; B2 = 123 " "; + C3 = 131 " "; Cd3 = 139 " "; D3 = 147 " "; Dd3 = 156 " "; + E3 = 165 " "; F3 = 175 " "; Fd3 = 185 " "; G3 = 196 " "; + Gd3 = 208 " "; A3 = 220 " "; Ad3 = 233 " "; B3 = 247 " "; + C4 = 262 " "; Cd4 = 277 " "; D4 = 294 " "; Dd4 = 311 " "; + E4 = 330 " "; F4 = 349 " "; Fd4 = 370 " "; G4 = 392 " "; + Gd4 = 415 " "; A4 = 440 " "; Ad4 = 466 " "; B4 = 494 " "; + C5 = 523 " "; Cd5 = 554 " "; D5 = 587 " "; Dd5 = 622 " "; + E5 = 659 " "; F5 = 698 " "; Fd5 = 740 " "; G5 = 784 " "; + Gd5 = 831 " "; A5 = 880 " "; Ad5 = 932 " "; B5 = 988 " "; + C6 = 1047 " "; Cd6 = 1109 " "; D6 = 1175 " "; Dd6 = 1245 " "; + E6 = 1319 " "; F6 = 1397 " "; Fd6 = 1480 " "; G6 = 1568 " "; + Gd6 = 1661 " "; A6 = 1760 " "; Ad6 = 1865 " "; B6 = 1976 " "; + C7 = 2093 " "; Cd7 = 2217 " "; D7 = 2349 " "; Dd7 = 2489 " "; + E7 = 2637 " "; F7 = 2794 " "; Fd7 = 2960 " "; G7 = 3136 " "; + Gd7 = 3322 " "; A7 = 3520 " "; Ad7 = 3729 " "; B7 = 3951 " "; + C8 = 4186 " "; Cd8 = 4435 " "; D8 = 4699 " "; Dd8 = 4978 " "; + E8 = 5274 " "; F8 = 5588 " "; Fd8 = 5920 " "; G8 = 6272 " "; + Gd8 = 6645 " "; A8 = 7040 " "; Ad8 = 7459 " "; B8 = 7902 " "; + + row1 = C3 Cd3 D3 Dd3 E3 F3 Fd3 G3 Gd3 A3 Ad3 B3 C4 Cd4 D4 Dd4 E4; + row2 = C4 Cd4 D4 Dd4 E4 F4 Fd4 G4 Gd4 A4 Ad4 B4 C5 Cd5 D5 Dd5 E5 F5 Fd5 G5; + + split(row1 row2, frequencies, " "); + + system("stty raw -echo"); + + while (1) { + cmd = "dd bs=1 count=1 2>/dev/null" + cmd | getline key + close(cmd); + + if (key == "\003") + break + + if (note = frequencies[index(layout, key)]) + system(SPEAKER_TEST " -f " note " 1>&2 > /dev/null &" \ + "(sleep 0.5 && kill -9 $!) &"); + } + + system("stty -raw echo"); +} +' diff --git a/bin/fun-psyche b/bin/fun-psyche @@ -0,0 +1,421 @@ +#!/bin/sh +pause() +{ + dd if=/dev/zero of=/dev/null bs=1 count=327680 2> /dev/null +} + +set -- ` + printf '%s\n' "$*" | fold -w 1 | sed 's/[ ]/_/; /^$/ s/^/_/' + seq 10 | sed 's/.*/_/' +` + +b=`printf '\033[31;1m'` +e=`printf '\033[0m'` +r=`printf '\033[7m'` + +printf '\033[2J' + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ || || || || || || || || || || || + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / _/ / / / / / + ::=;| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__//|||||||\\\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _||||'$b'|||'$e'||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ || || || || || || || || || || || + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / _/ / / / / / + ::=;| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__//||'$b'|||||'$e'\\\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\'$b'\\o|||'$e'|//______/ \ \_____/ .__\_____:__ + ___/ _||'$b'||||||||'$e'|||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ || || || || || || || || || || || + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / _/ / / / / / + ::=;| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__//|'$b'||||||\\'$e'\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||"'$b'""""'$e' |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ '$b'/// '$e'/_____,(_X_) ____ \___ + __/ __ '$b'\\\\\o||||//'$e'______/ \ \_____/ .__\_____:__ + ___/ _'$b'|||||||||||||'$e'_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ || || || || || || || || || || || + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / _/ / / / / / + ::=;| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__'$b'//|||||||\\\\\\'$e'_____ \_________/ / (_)___/ _/ _/ + |\__/ '$b'||""""" |||'$e'\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ '$b' _'$e' ___ ___,--._________ + _/ __'$b'__\ ||/ /// /_____'$e',(_X_) ____ \___ + __/ '$b'__ \\\\\'$e'o'$b'||||//______/'$e' \ \_____/ .__\_____:__ + ___/ _'$b'|||||'$e'|||||'$b'|||'$e'_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ || || || || || || || || || || || + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / _/ / / / / / + ::=;| _____________ |:=._\\______/ / / __/ / / / / + '$b'_'$e'/ |_______________| \\________/ / / ___/ / / / + '$b'(_)__//||'$e'|||||'$b'\\\\\\_____'$e' \_________/ / (_)___/ _/ _/ + |\__/ '$b'||""""" |||\\____'$e' \___________/ _______/ / + | '$b'|'$e'-|TTTT|'$b'//" \___ \'$e'______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + '$b'_____'$e' _ '$b'___'$e' ___,--._________ + '$b'_/ __'$e'__'$b'\'$e' ||/ '$b'/// /'$e'_____'$b','$e'(_X_) ____ \___ + '$b'__/'$e' __ \'$b'\'$e'\\\o||||//___'$b'___/'$e' \ \_____/ .__\_____:__ + '$b'___/'$e' _||'$b'|'$e'||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + '$b'::'$e'=:| ___ |:=:__ || || || || || || || || || || || + '$b'::'$e'=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + '$b'::'$e'=:| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + '$b'::'$e'=:| ___ |:=._\ \___/ / / _/ / / / / / + '$b'::'$e'=;| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + '$b'(_)__/'$e'/|||||||\\\\\\'$b'_____'$e' \_________/ / (_)___/ _/ _/ + '$b'|\__/'$e' ||'$b'"""""'$e' '$b'|||\\____ \_'$e'__________/ _______/ / + | '$b'|-'$e'|TTTT|'$b'//" \___ \_______'$e'_______/ ________/ + (_) '$b'`-'$e'|____|'$b'/'$e'_______'$b'\___'$e'_____________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + '$b'_'$e'/ ____\ ||/ /// /_____,(_'$b'X'$e'_) ____ \___ + '$b'_'$e'_/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + '$b'_'$e'__/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + :'$b':='$e':| ___ |:=:__ || || || || || || || || || || || + :'$b':='$e':| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + :'$b':='$e':| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + :'$b':='$e':| ___ |:=._\ \___/ / / _/ / / / / / + :'$b':='$e';| _____________ |:=._\\______/ / / __/ / / / / + '$b' _/'$e' |_______________| \\________/ / / ___/ / / / + '$b'(_)'$e'__//|||||||\\\\\\_____ \_________/ / (_)___/ _/ _/ + '$b'|'$e'\__/ ||""""" |||\\____ '$b'\_____'$e'______/ _______/ / + '$b'|'$e' |-|'$b'TTTT'$e'|//" '$b'\___ \______________'$e'/ ________/ + '$b'(_)'$e' `-|____|/_______'$b'\________________/'$e' +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::'$b'=:'$e'| ___ |:=:__ || || || || || || || || || || || + ::'$b'=:'$e'| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::'$b'=:'$e'| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::'$b'=:'$e'| ___ |:=._\ \___/ / / _/ / / / / / + ::'$b'=;'$e'| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__//|||||||\\\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \____'$b'_______/'$e' _______/ / + | |-|'$b'TTTT'$e'|//" \___ \________'$b'______/ ________/'$e' + (_) `-|____|/_______\_____'$b'___________/'$e' +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_'$b'X'$e'_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::='$b':'$e'| ___ |:=:__ || || || || || || || || || || || + ::='$b':'$e'| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::='$b':'$e'| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::='$b':'$e'| ___ |:=._\ \___/ / / _/ / / / / / + ::='$b';'$e'| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / '$b'/'$e' ___/ / / '$b'/'$e' + (_)__//|||||||\\\\\\_____ \_________/ '$b'/'$e' (_)___/ '$b'_/ _/'$e' + |\__/ ||""""" |||\\____ \___________'$b'/'$e' '$b'_______/ /'$e' + | |-|'$b'TTTT'$e'|//" \___ \______________/ '$b'________/'$e' + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___'$b',--._________'$e' + _/ ____\ ||/ /// /_____,(_X_) ____ '$b'\___'$e' + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |'$b':'$e'=:__ || || || || || || || || || || || + ::=:| |'$b':'$e'=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |'$b':'$e'=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::=:| ___ |'$b':'$e'=._\ \___/ / / _/ / / / '$b'/ /'$e' + ::=;| _____________ |'$b':'$e'=._\\______/ / / '$b'__/'$e' / / '$b'/ /'$e' + _/ |_______________| \\________/ / '$b'/'$e' ___/ / '$b'/ /'$e' + (_)__//|||||||\\\\\\_____ \_________/ '$b'/'$e' (_)___/ '$b'_/ _/'$e' + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|'$b'TTTT'$e'|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ '$b'\___'$e' + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____'$b':'$e'__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |'$b':='$e':__ || || || || || || || || || || || + ::=:| |'$b':='$e':__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |'$b':='$e'._ \\_/--/--/--/--/--'$b'/'$e'--/--/--'$b'/'$e'--'$b'/'$e'--" + ::=:| ___ |'$b':='$e'._\ \___/ / / _/ '$b'/'$e' / / '$b'/ /'$e' + ::=;| _____________ |'$b':='$e'._\\______/ / / '$b'__/'$e' / / / / + _/ |_______________| \\________/ / / '$b'__'$e'_/ / / / + (_)__//|||||||\\\\\\_____ \_________/ / '$b'(_)'$e'___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:'$b'=:'$e'__ || || || || || ||'$r$6$e'|| || ||'$r$9$e'||'$r${10}$e'|| + ::=:| |:'$b'=:'$e'__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:'$b'=.'$e'_ \\_/--/--/--/--/--'$b'/'$e'--/--/--'$b'/'$e'--'$b'/'$e'--" + ::=:| ___ |:'$b'=.'$e'_\ \___/ / / _/ / '$b'/'$e' / / / + ::=;| _____________ |:'$b'=.'$e'_\\______/ / / __/ '$b'/'$e' / / / + _/ |_______________| \\________/ / / '$b'___/ /'$e' / / + (_)__//|||||||\\\\\\_____ \_________/ / (_)'$b'___/'$e' _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:'$b'__'$e' || || || || || ||'$r$6$e'|| || ||'$r$9$e'||'$r${10}$e'|| + ::=:| |:=:'$b'__'$e'\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=.'$b'_ '$e'\\_/--/--/--/--/--/--'$b'/'$e'--'$b'/'$e'--/--/--" + ::=:| ___ |:=.'$b'_\'$e' \___/ / / _/ / '$b'/ /'$e' / / + ::=;| _____________ |:=.'$b'_\'$e'\______/ / / __/ / / / / + _/ |_______________| '$b'\\'$e'________/ / / ___/ / / / + (_)__//|||||||\\\\\\_____ '$b'\__'$e'_______/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:_'$b'_'$e' || || || || || ||'$r$6$e'||'$r$7$e'||'$r$8$e'||'$r$9$e'||'$r${10}$e'|| + ::=:| |:=:_'$b'_\'$e' |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._'$b' \\_/'$e'--'$b'/'$e'--/--/--/--/--'$b'/'$e'--'$b'/'$e'--/--/--" + ::=:| ___ |:=._'$b'\ \___/'$e' / / _/ / / / / / + ::=;| _____________ |:=._'$b'\\____'$e'__/ / / __/ / / / / + _/ |_______________| \'$b'\____'$e'____/ / / ___/ / / / + (_)__//|||||||\\\\\\_____ '$b'\______'$e'___/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ ||'$r$1$e'||'$r$2$e'|| || || ||'$r$6$e'||'$r$7$e'||'$r$8$e'||'$r$9$e'||'$r${10}$e'|| + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_'$b'/'$e'--'$b'/'$e'--/--/--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ '$b'/'$e' / _/ / / / / / + ::=;| _____________ |:=._\\___'$b'___/'$e' / / __/ / / / / + _/ |_______________| \\____'$b'____/ /'$e' / ___/ / / / + (_)__//|||||||\\\\\\_____ \_'$b'________/'$e' / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ ||'$r$1$e'||'$r$2$e'|| || || ||'$r$6$e'||'$r$7$e'||'$r$8$e'||'$r$9$e'||'$r${10}$e'|| + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--'$b'/'$e'--'$b'/'$e'--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ '$b'/ / _/'$e' / / / / / + ::=;| _____________ |:=._\\______'$b'/ / /'$e' __/ / / / / + _/ |_______________| \\________/ '$b'/'$e' / ___/ / / / + (_)__//|||||||\\\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ ||'$r$1$e'||'$r$2$e'||'$r$3$e'||'$r$4$e'|| ||'$r$6$e'||'$r$7$e'||'$r$8$e'||'$r$9$e'||'$r${10}$e'|| + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--'$b'/'$e'--'$b'/'$e'--'$b'/'$e'--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / '$b'_/'$e' / / / / / + ::=;| _____________ |:=._\\______/ / /'$e' __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__//|||||||\\\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ ||'$r$1$e'||'$r$2$e'||'$r$3$e'||'$r$4$e'||'$r$5$e'||'$r$6$e'||'$r$7$e'||'$r$8$e'||'$r$9$e'||'$r${10}$e'|| + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--/--/--/--'$b'/'$e'--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / _/ / / / / / + ::=;| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__//|||||||\\\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +pause + +printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ ||'$r$1$e'||'$r$2$e'||'$r$3$e'||'$r$4$e'||'$r$5$e'||'$r$6$e'||'$r$7$e'||'$r$8$e'||'$r$9$e'||'$r${10}$e'|| + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / _/ / / / / / + ::=;| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__//|||||||\\\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' + +[ "$#" -gt 10 ] && sleep 1 + +while [ "$#" -gt 10 ] +do + shift + + pause + + printf '\033[H%s' ' + _____ _ ___ ___,--._________ + _/ ____\ ||/ /// /_____,(_X_) ____ \___ + __/ __ \\\\\o||||//______/ \ \_____/ .__\_____:__ + ___/ _|||||||||||||_ \________|___________|_________ + | _____________ | C22 |.-..-..-..-..-..-..-..-..-..-.| + ::=:| ___ |:=:__ ||'$r$1$e'||'$r$2$e'||'$r$3$e'||'$r$4$e'||'$r$5$e'||'$r$6$e'||'$r$7$e'||'$r$8$e'||'$r$9$e'||'$r${10}$e'|| + ::=:| |:=:__\ |:=::=::=::=::=::=::=::=::=::=:| + ::=:| P S Y C H E |:=._ \\_/--/--/--/--/--/--/--/--/--/--" + ::=:| ___ |:=._\ \___/ / / _/ / / / / / + ::=;| _____________ |:=._\\______/ / / __/ / / / / + _/ |_______________| \\________/ / / ___/ / / / + (_)__//|||||||\\\\\\_____ \_________/ / (_)___/ _/ _/ + |\__/ ||""""" |||\\____ \___________/ _______/ / + | |-|TTTT|//" \___ \______________/ ________/ + (_) `-|____|/_______\________________/ +' +done diff --git a/bin/fun-reverse b/bin/fun-reverse @@ -0,0 +1,20 @@ +#!/bin/sh +# print a text with every line upside down + +while IFS='' read -r line +do + printf '%s\n' "$line" | rev | sed ' + + # lowercase + y/abcdefghijklmnopqrstuvwxyz/ɐqɔpǝɟƃɥᴉɾʞjɯuodbɹsʇnʌʍxʎz/ + + # uppercase + y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/∀BƆDƎℲפHIſK˥WNOԀQRS┴∩ΛMX⅄Z/ + + # digits + y/0123456789/0ƖᄅƐㄣϛ9ㄥ86/ + + # special characters + y/&_/⅋‾/ + ' +done diff --git a/bin/fun-saber b/bin/fun-saber @@ -0,0 +1,172 @@ +#!/bin/sh +# Author: L. S., a long time ago + +# Thank you to jansen.price@gmail.com for the original idea. + + +help() +{ + printf 'Usage: %s COLOR WIDTH + +COLOR + ' "${0##*/}" + + for i in `seq 7` + do + printf '\033[3%sm%s\033[0m ' "$i" "$i" + done + + printf ' + +WIDTH + Integer from 0 to 100 + +CONTROLS + Enter to start + + Ctrl + C to stop +' + exit 1 +} + + +# +# This clears the screen, print the handle set cursor position at the middle of +# the blade and saves it +# +print_handle() +{ + local h1='._________,_' + local h2='\033[47;30;1mIIIIIIIIIII\033[0mH' + local h3='""""""""\033[31m'"$1"'\033[0m""^' + local width=12 + + # reset the screen: handle is first thing we draw + printf '\033[2J\033[10;30H' + + for line in "$h1" "$h2" "$h3" + do + printf "$line\033[0m\v\033[%sD" "$width" + done + + printf '\033[%sC\033[2A\033[s' "$width" +} + + +print_blade() +{ + local color="$1" length="$2" + + for i in `seq "$length"` + do + sleep 0.003 + printf '\033[1;4%s;3%sm_\033[m' "$color" "$color" + done + + # Put cursor at the beginning of the blade + printf '\033[%sD' "$i" +} + + +wait_button() +{ + printf ' ' + read -r unused + printf '\033[u' + + # reset the previous state + print_handle '-' +} + + +blink_blade() +{ + local color="$1" length="$2" + local top top_char='.' + local bot bot_char="'" + local end1="'" end2='.' + + # set color + printf '\033[3%sm' "$color" + + # save cursor location + printf '\033[s' + + # generate the blinks from the blink chars + for i in `seq $((length / 2))` + do + top="$top_char $top" + bot="$bot_char $bot" + done + + # Blink the blade + while true + do + printf '\033[%sC%s\033[u' "$length" "$end1" + printf '\033[A\033[K%s%s\033[u' '' "$top" + printf '\033[B\033[K%s%s\033[u' '' "$bot" + + printf '\033[%sC%s\033[u' "$length" "$end2" + printf '\033[A\033[K%s%s\033[u' ' ' "$top" + printf '\033[B\033[K%s%s\033[u' ' ' "$bot" + + done +} + + +close_saber() +{ + local length="$1" + + # ensure we are at the right position + printf '\033[u' + + for i in `seq $((length + 3)) -1 1` + do + printf '\033[%sC\033[A' "$i" + for j in 1 2 3 + do + printf ' \v\033[D' + done + printf '\033[u' + + sleep 0.001 + done + + printf ' \033[0m' + + print_handle '=' + + printf '\n\n\n\033[?25h' + exit 0 +} + + +main() +{ + local color="${1:-1}" length="${2:-50}" + + case "$1" in + [1-7] | '' ) : ;; + * ) help ;; + esac + + case "$2" in + [0-9] | [0-9][0-9] | 1[0-9][0-9] | '' ) : ;; + * ) help ;; + esac + + # close the saber while script stops + trap 'close_saber "$length" 4' INT + + { + printf '\n\n\n\033[?25l' + print_handle '=' + wait_button 4 + print_blade "$color" "$length" + blink_blade "$color" "$length" + } 2>/dev/null +} + + +main "$@" diff --git a/bin/fun-troll b/bin/fun-troll @@ -0,0 +1,21 @@ +#!/bin/sh +#!/bin/sh + + +size=`stty size` + +hexdump -o /dev/random | tr -dc '0-9' | fold -w 4 | +sed -r 's/^(..)(..)/\1 \2/' | while read row col +do + printf '\033[%s;%sH' "$row" "$col" + + printf '\033[10C\v%s' ',--------.' + printf '\033[11D\v%s' '/ ,===-=== `.' + printf '\033[14D\v%s' '//__(*= (*-.\\' + printf '\033[16D\v%s' '(((,__` ,c-).~~))' + printf '\033[16D\v%s' '\ \ `------'\''||' + printf '\033[14D\v%s' '\ `-.______, |' + printf '\033[18D\v%s' ' `-._ ------ |' + printf '\033[9D\v%s' '`-.____/' + +done diff --git a/bin/git-all b/bin/git-all @@ -0,0 +1,13 @@ +#!/bin/sh +command="$1" +shift + +find "$HOME" -name .git | while IFS='' read repo +do + printf '%-40s ' "${repo%/.git}" + ( + cd "${repo%/.git}" || exit + git-status + [ "$command" ] && "$command" "$@" + ) +done diff --git a/bin/git-count b/bin/git-count @@ -0,0 +1,6 @@ +#!/bin/sh +echo "$(( + $(git diff | grep ^+ | wc -l) - + $(git diff | grep ^- | wc -l) +))" + diff --git a/bin/git-index b/bin/git-index @@ -0,0 +1,109 @@ +#!/bin/sh +NAME="${1##*/}" +HEADER='<!doctype html><html> +<head> +<meta charset="utf-8"/> +<style> pre { float: left; margin: 4em 0 4em 4em; } </style> +</head> +<body> +<pre> +<h1><a href="..">&lt;</a> '"$NAME"'</h1> + +' + +FOOTER=' +</pre> +</body> +</html>' + +export LC_COLLATE=C + +mkdir -p "$NAME/commit" "$NAME/file" +cd "$NAME" || exit 1 + +# --- ./index.html --------------------------------------------------------------- + +{ + printf '%s\n' "$HEADER" + + git -C "$1" ls-tree -r --name-only master | sort | awk '{ + gsub("&", "\&amp;"); gsub("<", "\&lt;") + do { print } while (sub("/[^/]*$", "")) + }' | sort -u | awk '{ + count = split($0, line, "/") + for (i = 1; i <= count; i++) { + lines[NR"]["0] = $0 + lines[NR"]["i] = "| " + prev[i] = line[i] + } + lines[NR"]["i - 1] = "|-- " + prev[i] = "" + } END { + for (i = 1; !stop; i++) { + stop = tail = 1 + for (l = NR - 1; l > 0; l--) { + if (lines[l"]["i] == "| " && tail) { + lines[l"]["i] = " " + stop = 0 + + } else if (lines[l"]["i] == "|-- " && tail) { + lines[l"]["i] = "`-- " + tail = stop = 0 + + } else if (!lines[l"]["i]) { + tail = 1 + } + } + } + + for (l = 1; l < NR; l++) { + for (i = 1; lines[l"]["i]; i++) + printf "%s", lines[l"]["i] + printf "<a href=\"file/%s\">", lines[l"]["0] + sub(".*/|^", "", lines[l"]["0]) + printf "%s</a>\n", lines[l"]["0] + } + }' + + printf '</pre><pre>' + + git -C "$1" log --graph --date=short --format='%H %cd %cn <%ce>%n%s%n' | + sed -r ' + s|&|\&amp;|g + s|<|\&lt;|g + s|([0-9a-f]{8})([0-9a-f]{32})|<a href="commit/\1\2.html">\1</a>| + ' + + printf %s "$FOOTER" + +} > index.html + +# --- ./file/ ------------------------------------------------------------------ + +git -C "$1" ls-tree -r --name-only master | while IFS='' read -r file +do + [ "$1/$file" -ot "file/$file" ] && continue + echo "file $file" + mkdir -p "file/$(dirname "$file")" + git -C "$1" show master:"$file" > "file/$file" +done + +# --- ./commit/ ------------------------------------------------------------------- + +for commit in $(git -C "$1" log --format='%H') +do + [ -f "commit/$commit.html" ] && continue + echo "commit $commit" + echo "$HEADER" > "commit/$commit.html" + git -C "$1" show -U3 "$commit" | sed ' + s|&|\&amp;|g + s|<|\&lt;|g + s|^[A-Z][a-z]*:|<b>&</b>| + /^commit/ s|.*|<b>&</b>| + /^diff/ s|.*|<b>&</b>| + /^+/ s|.*|<span style="color: green;">&</span>| + /^-/ s|.*|<span style="color: red ;">&</span>| + /^@/ s|.*|<span style="color: blue ;">&</span>| + ' >> "commit/$commit.html" + echo "$FOOTER" >> "commit/$commit.html" +done diff --git a/bin/git-index.1 b/bin/git-index.1 @@ -0,0 +1,76 @@ +.Dd mar 23, 2017 +.Dt GIT-INDEX +.Os +. +. +.Sh NAME +. +.Nm git-index +.Nd generate static website with the git command +. +. +.Sh SYNOPSIS +. +.Nm +.Ar repository +.Op Ar description +. +. +.Sh DESCRIPTION +. +The +.Nm +script creates a static website presenting the files and commits of a git +repository. The build is incremential so that it can be triggered at every +commit without large overhead. +. +.Pp +. +It only requires +.Xr 1 git +command to produce the output, and the various. +. +.Pp +. +The first argument is treated as a path to a repository. +. +. +.Sh FILES +. +.Bl -tag -width indent +. +.It Pa ./style.css Ns , Pa ./favicon.png +These ressources will be used in the html +.Li <head> +element. +. +. +.It Pa ./repository/index.html +An +.Pa index.html +file will be created in the repository directory, containing a list of +the files and the commits. +. +.It Pa ./repository/commit/4279dbc3735e1e38bf33120c9234640d99fee650.html +One html page per commit is created. +. +.It Pa ./repository/file/path/to/the/file +The file content of the +. +.El +. +. +.Sh EXAMPLES +. +A script generating an index of multiple repositories might look like this: +.Bd -literal -offset indent +printf '<!doctype html>\\n<html>\\n<body>\\n<ul>\\n' > ./index.html + +printf '<li><a href="">%s</a></li>\n' git/repo1 repo1 >> index.html +git-index /path/to/repo1 + +printf '<li><a href="">%s</a></li>\n' git/repo2 repo2 >> index.html +git-index /path/to/repo2 + +printf '</ul>\\n</body>\\n</html>\\n' >> index.html +.Ed diff --git a/bin/git-repos b/bin/git-repos @@ -0,0 +1,17 @@ +git clone http://github.com/josuah/etc "$HOME/etc" +git clone http://github.com/josuah/pkg "$HOME/pkg" +git clone http://github.com/josuah/bin "$HOME/bin" + +mkdir -p "$HOME/var/git" +cd "$HOME/var/git" + +git clone --mirror http://github.com/josuah/alphabet +git clone --mirror http://github.com/josuah/bin +git clone --mirror http://github.com/josuah/cgr +git clone --mirror http://github.com/josuah/etc +git clone --mirror http://github.com/josuah/fungus-pathogen +git clone --mirror http://github.com/josuah/http +git clone --mirror http://github.com/josuah/iode +git clone --mirror http://github.com/josuah/iomenu +git clone --mirror http://github.com/josuah/notes +git clone --mirror http://github.com/josuah/pkg diff --git a/bin/git-status b/bin/git-status @@ -0,0 +1,48 @@ +#!/bin/sh +git rev-parse 2> /dev/null || exit 1 + +git status --porcelain -b | awk ' + +/^## / { + branch = $0; + sub(/^## /, "", branch); + sub(/\.\.\..*/, "", branch); + + if ($0 ~ /ahead /) { + ahead = $0; + sub(/.*ahead /, "", ahead); + sub(/\].*|, .*/, "", ahead); + } + + if ($0 ~ /behind /) { + behind = $0; + sub(/.*behind /, "", behind); + sub(/\].*|, .*/, "", behind); + } + + next; +} + +/^\?\? / { untracked++; next; } +/^U. / { conflicts++; next; } +/^.U / { conflicts++; next; } +/^DD / { conflicts++; next; } +/^AA / { conflicts++; next; } +/^.M / { changed++; } +/^.D / { changed++; } +/^[^ ]. / { staged++; } + +END { + printf(" %s", branch); + + if (untracked) printf(" ?%d", untracked); + if (conflicts) printf(" x%d", conflicts); + if (changed ) printf(" +%d", changed); + if (staged ) printf(" #%d", staged); + if (behind ) printf(" v%d", behind); + if (ahead ) printf(" ^%d", ahead); +}' + +[ -d "$(git rev-parse --git-dir)/rebase-merge" ] && printf ' rebase' + +printf '\n' diff --git a/bin/git-sync b/bin/git-sync @@ -0,0 +1,7 @@ +#!/bin/sh +find "$HOME/srv/git" -mindepth 1 -maxdepth 1 -type d | +while IFS='' read -r repo +do + git -C "$repo" fetch origin master:master + git -C "$repo" push --all +done diff --git a/bin/http-ip b/bin/http-ip @@ -0,0 +1,2 @@ +#!/bin/sh +curl icanhazip.com diff --git a/bin/http-ix b/bin/http-ix @@ -0,0 +1,2 @@ +#!/bin/sh +curl -F f:1=@- ix.io diff --git a/bin/http-w1r3 b/bin/http-w1r3 @@ -0,0 +1,3 @@ +#!/bin/sh + +curl -F upload=@- w1r3.net diff --git a/bin/http-wttr b/bin/http-wttr @@ -0,0 +1,3 @@ +#!/bin/sh + +curl wttr.in diff --git a/bin/ii-client b/bin/ii-client @@ -0,0 +1,11 @@ +#!/bin/sh +# Simple tiny ii client + +[ -d "$1" ] || exit 1 + +tail -n 80 -f "$1/out" | ii-filter & + +while IFS='' read -r line +do + printf '%s\n' "$line" > "$1/in" +done diff --git a/bin/io b/bin/io @@ -0,0 +1,27 @@ +#!/bin/sh +# attach to an abduco session with iomenu and manage the names + +export LC_COLLATE=C + +touch "$ABDUCO_SOCKET_DIR/abduco/names" "$HOME/var/cache/io" + +abduco | awk -F '\t' 'NR > 1 { print $3 " " }' | +xe grep -F "$ABDUCO_SOCKET_DIR/abduco/names" -e | +sort -u -o "$ABDUCO_SOCKET_DIR/abduco/names" + +[ $# = 0 ] && IFS=' ' set -- $({ + cut -d ' ' -f 3- "$ABDUCO_SOCKET_DIR/abduco/names" + cat "$HOME/var/cache/io" "$HOME/etc/io"/* +} | iomenu -p io -#) + +for path in "$@"; do true; done +[ -e "$path" ] && path=$(cd "$(dirname "$path")" && pwd)/$(basename "$path") +hash=$(printf %s "$path" | cksum | cut -d ' ' -f 1) + +[ "$*" ] || exit 1 +[ $# = 1 ] && set -- xdg-open "$1" + +printf '\033];%s\007' "$path" +printf '%s %s\n' "$hash" "$path" >> "$ABDUCO_SOCKET_DIR/abduco/names" +[ "$SSH_TTY" ] && e='^\' || e='^Z' +[ "$ABDUCO" != "$hash" ] && ABDUCO=$hash exec abduco -e "$e" -A "$hash" "$@" diff --git a/bin/io-cache b/bin/io-cache @@ -0,0 +1,32 @@ +#!/bin/sh +# build a list of files preceded by '#command to open them' + +mkdir -p "$HOME/var/cache" +exec 1> "$HOME/var/cache/io" + +echo '#rlwrap ii-client' +find "$HOME/var/irc" -maxdepth 1 -mindepth 1 -type d | sort + +echo '#io-mail' +find "$HOME/var/mail" -maxdepth 1 -mindepth 1 -type d | sort | +xe -N1 -s 'printf "%-50s %4s\\n" "$1" "$(mlist -s "$1" | wc -l)"' + +echo '#io-src' +find "$HOME/src" "$HOME/git" -maxdepth 1 -mindepth 1 -type d | sort + +echo '#play' +find "$HOME/lib/video" "$HOME/lib/music" | sort + +echo '#mandoc -a' +IFS=: +find $MANPATH -name '*.[0-9]' -o -name '*.[0-9]p' -o -name '*.[0-9].gz' | sort +unset IFS + +echo '#qemu-start' +find "$HOME/var/qemu" -type f | sort + +echo '#mupdf' +find "$HOME/tmp" "$HOME/lib" -type f -name '*.pdf' | sort + +echo "#$EDITOR" +find "$HOME" -name .git -prune -o -type f | sort diff --git a/bin/io-mail b/bin/io-mail @@ -0,0 +1,11 @@ +#!/bin/sh +# list mail from all inboxes using mblaze + +# sort messages +mdirs "$1" | mlist | mthread | msort -r -d | mseq -S | + +# prompt for a mail with iomenu +mscan -f '%6n %u %D %20f %t%2i%120S' | iomenu -p mail | + +# open it +sed -r 's/^ *([0-9]*) .*/\1/'| xargs mless diff --git a/bin/io-netstat b/bin/io-netstat @@ -0,0 +1,3 @@ +#!/bin/sh + +netstat -nat | sed 's/^[AP]/#&/' | iomenu -# diff --git a/bin/io-ps b/bin/io-ps @@ -0,0 +1,6 @@ +#!/bin/sh + +ps -ax | +sed '1 s/^/#/' | +iomenu -p ps -# | +sed -r 's/[^ ]* *([0-9]*).*/\1/' diff --git a/bin/io-src b/bin/io-src @@ -0,0 +1,9 @@ +#!/bin/sh +# interactively search a string in all code of a directory + +io "$( + find "$1" -type f ! -path '*/.git/*' | sort | xargs -n 1 awk ' + FNR == 1 { printf("# %s\n", FILENAME); } + { printf("%7s\t%s\n", FNR, $0); } + ' | iomenu -# -p search | sed -e 's/^# //' -e 's/ .*//' +)" diff --git a/bin/ipconv b/bin/ipconv @@ -0,0 +1,33 @@ +#!/bin/sh + +if [ -z "$1" ] || [ $# -ne 1 ] +then + exit 1 + +elif [ -z "$(printf %s "$1" | tr -d 0-9)" ] +then + int=$1 ip= + + while [ "$int" -gt 0 ] + do + byte=$((int & 255)) + int=$((int / 256)) + [ -z "$ip" ] && ip="$byte" || ip="$byte.$ip" + done + + printf '%s\n' "$ip" + +elif [ -z "$(printf %s "$1" | tr -d 0-9.)" ] +then + ip=$1 int=0 IFS=. + + for byte in $ip + do + int=$((int * 256 + byte)) + done + + printf '%s\n' "$int" + +else + exit 1 +fi diff --git a/bin/l b/bin/l @@ -0,0 +1,14 @@ +#!/bin/sh + +[ -f "$1" ] && [ $# == 1 ] && exec io "$1" + +test='( ( name == ".git" || path ~~ "*var/mail/*" ) && prune || print )' + +if [ "$1" = -r ] +then + shift 1 +else + test="depth == 1 && $test" +fi + +lr -o tfd -GGf '%M%x %n %S %TF %TR %p%F %l\n' -t "$test" "$@" diff --git a/bin/lines b/bin/lines @@ -0,0 +1,3 @@ +#!/bin/sh + +lr -t 'name ~~ "*.[ch]"' "$@" | xe -N0 wc -l diff --git a/bin/mblaze-filter b/bin/mblaze-filter @@ -0,0 +1,60 @@ +#!/bin/sh +# filter mails using mblaze + +minc "$MAIL" | mscan | $PAGER + +while read -r dir test +do + mkdir -p "${MAIL%/*}/$dir/cur" + mkdir -p "${MAIL%/*}/$dir/new" + mkdir -p "${MAIL%/*}/$dir/tmp" + printf '%-25s ' "$dir" + mlist "$MAIL" | mpick -t "$test" | xe mv {} "${MAIL%/*}/$dir/new" +done << 'EOF' +amazon.com "From" ~~~ "*@amazon.*" +amnesty.org "From" ~~~ "*amnesty.*" +bandcamp.com "From" ~~~ "*Cryo Chamber*" +bandcamp.com "Reply-To" ~~~ "*bandcamp.com*" +breizh-entropy.org "List-Id" ~~~ "*breizh-entropy.org*" +coinbase.com "From" ~~~ "*coinbase.com*" +crous-rennes.fr "From" ~~~ "*crous-rennes.fr*" +dropbox.com "From" ~~~ "*dropbox.*" +ebay.com "From" ~~~ "*ebay.*" +epitech.eu "From" ~~~ "*bde.epitech.rennes@gmail.com*" +epitech.eu "From" ~~~ "*epitech.eu*" +free.fr "From" ~~~ "*@free-mobile.fr*" +freebsd.org "From" ~~~ "*freebsd.org*" +fsf.org "From" ~~~ "*fsf.org*" +gandi.net "From" ~~~ "*gandi.net*" +github.com "From" ~~~ "*github.com*" +gobolinux.org "Subject" ~~~ "*\[gobolinux\]*" +google.com "From" ~~~ "*google.com*" +keybase.io "From" ~~~ "*keybase.io*" +lobste.rs "From" ~~~ "*@lobste.rs*" +nixers.net "From" ~~~ "*@nixers.net*" +openbsd.org/tech "To" ~~~ "tech@openbsd.org" +paypal.com "From" ~~~ "*paypal.*" +reddit.com "From" ~~~ "*@reddit.*" +repo.or.cz "Subject" ~~~ "*\[repo.or.cz\]*" +researchgate.net "From" ~~~ "*@researchgate.*" +researchgate.net "From" ~~~ "*@researchgatemail.*" +stackexchange.com "From" ~~~ "*@stackexchange.com*" +suckless.org "Cc" ~~~ "*@suckless.org*" +suckless.org "From" ~~~ "*@suckless.org*" +suckless.org "To" ~~~ "*@suckless.org*" +transports "From" ~~~ "*@captaintrain.com*" +transports "From" ~~~ "*BlaBlaCar*" +transports "From" ~~~ "*flixbus*" +transports "From" ~~~ "*keolis.com*" +transports "From" ~~~ "*megabus*" +transports "From" ~~~ "*ouibus*" +transports "From" ~~~ "*ouigo*" +transports "From" ~~~ "*sncf.com*" +univ-rennes1.fr "List-Id" ~~~ "*foad.univ-rennes1.fr*" +univ-rennes1.fr "Received" ~~~ "*vmsympa1.univ-rennes1.fr*" +univ-rennes1.fr "Return-Path" ~~~ "*listes.univ-rennes1.fr*" +univ-rennes1.fr "To" ~~~ "*listes.etudiant.univ-rennes1.fr*" +wordpress.com "From" ~~~ "*wordpress.com*" +yammer.com "From" ~~~ "*yammer.com*" +youtube.com "From" ~~~ "*youtube.com*" +EOF diff --git a/bin/monitor b/bin/monitor @@ -0,0 +1,13 @@ +#!/bin/sh +# script monitoring performances and recording data to $HOME/var/stat + +STEP="${1:-900}" + +mkdir -p "$HOME/var/stat" + +while true +do + monitor-step "$STEP" >> "$HOME/var/stat/data" + printf '\033[2J\033[H' + tail -n 100 "$HOME/var/stat/data" | monitor-plot "$STEP" +done diff --git a/bin/monitor-plot b/bin/monitor-plot @@ -0,0 +1,47 @@ +#!/bin/sh +# read the data from stdin and fills missing entries with "?" + +awk -v STEP="${1:?argument missing} step}" ' + +BEGIN { + fields[2] = "time" + fields[3] = "mem" + fields[4] = "cpu" + fields[5] = "load" + fields[6] = "diskio" + fields[7] = "storage" +} + +{ + nfields = split($0, line, " ") + + for (i = 1; i <= nfields; i++) + data[i"]["NR] = line[i] +} + +END { + # find the alignment of the data timestamps (phase) + for (i = 1; i <= NR; i++) + start += data[2"]["i] % STEP + start = int(start / NR + STEP / 2) + start += data[2"]["1] - data[2"]["1] % STEP + + for (i = 3; i <= nfields; i++) { + offset = start + printf "%s", fields[i] + for (j = 1; j <= NR; j++) { + while (data[2"]["j] > offset) { + printf " ?" + offset += STEP + } + offset += STEP + printf " %s", data[i"]["j] + } + print "" + } +}' | while read field line +do + printf '\n[ %s ] \n\n' "$field" + printf %s "$line" | plot -h 20 + printf '\n' +done diff --git a/bin/monitor-step b/bin/monitor-step @@ -0,0 +1,54 @@ +#!/bin/sh +# ressources monitoring script + +# It will produce one line with the following values, separated with a space: +# +# 1. hostname 5. load average (1 minute) +# 2. unix time 6. disk I/O +# 3. free memory 7. total free storage +# 4. cpu usage + +case "$(uname)" in +(Linux ) mem=free cpu=id bi=bi bo=bo ;; +(*BSD ) mem=fre cpu=id bi='' bo='' ;; +(Solaris) mem=free cpu=id bi='' bo='' ;; +(SunOS ) mem=free cpu=id bi='' bo='' ;; +esac + +vmstat "${1:-15}" 2 | +awk -v mem="$mem" -v cpu="$cpu" -v bi="$bi" -v bo="$bo" ' + +BEGIN { + "date +%s" | getline time + "hostname" | getline host + "uptime" | getline load + + sub(/.* /, "", load) + + while ("df" | getline) + if ($1 ~ "^/dev/" || $1 == "zroot") stor += $4 +} + +NR == 2 { + split($0, keys) + + for (key in keys) { + if (keys[key] ~ /[0-9]$/) + disks[i++] = keys[key] + } +} + +NR >= 4 { + for (i = 1 + split($0, values); i > 0; i--) + table[keys[i]] = values[i] + + mem = table[mem] + cpu = 100 - table[cpu] + load = load + diskio = table[bi] + table[bo] + + for (disk in disks) + diskio += table[disks[disk]] + + print host " " time " " mem " " cpu " " load " " diskio " " stor +}' diff --git a/bin/package b/bin/package @@ -0,0 +1,80 @@ +#!/bin/sh + +: ${2:?Usage: ${0##*/} <command> <package>} + +SYSROOT=$HOME/usr +PKG=$HOME/etc/package/$2 +SRC=$HOME/src/$2 +OPT=$HOME/opt/$2 + +case "$1" in + +(tar) + [ -d "$SRC" ] && exit 0 + + IFS='' read -r url < "$PKG/tar" + + curl -L "$url" | case "$url" in + ( *.tar.gz | *.tgz ) gzip -d - ;; + ( *.tar.bz2 | *.tbz ) bzip2 -d - ;; + ( *.tar.xz | *.txz ) xz -d - ;; + esac > "$SRC.tar" && tar -xf "$SRC.tar" || exit 1 + + mv "$(tar -tf "$SRC.tar" | sed -e 's|/.*||' -e 'q')" "$SRC" + rm -f "$SRC.tar" + ;; + +(git) + [ -d "$SRC" ] && exit 0 + + IFS='' read -r url < "$PKG/git" + git clone "$url" "$SRC" || exit 1 + ;; + +(get) + if [ -f "$PKG/tar" ] + then "$0" tar "$2" && exit 0 + elif [ -f "$PKG/git" ] + then "$0" git "$2" && exit 0 + else exit 1 + fi + ;; + +(build) + [ -d "$SRC" ] || "$0" get "$2" || exit 1 + + mkdir -p "$OPT" + + export CFLAGS="-I'$SYSROOT/include'" + export LDFLAGS="-L'$SYSROOT/lib'" + export PREFIX="$OPT" + + cd "$SRC" || exit 1 + + if [ -f "$PKG/build" ] + then + sh "$PKG/build" || exit 1 + else + [ -f "$PKG/config.mk" ] && cp "$PKG/config.mk" "$SRC" + [ -f "$PKG/config.h" ] && cp "$PKG/config.h" "$SRC" + [ -f "$SRC/configure" ] && "$SRC/configure" --prefix="$PREFIX" + cd "$SRC" && make && make PREFIX="$PREFIX" install || exit 1 + fi + ;; + +(add) + [ -d "$OPT" ] && exit 0 || "$0" build "$2" || { rm -r "$OPT"; exit 1; } + + (cd "$OPT" && find . -type d -exec mkdir -p "$SYSROOT/{}" ';') + (cd "$OPT" && find . ! -type d -exec ln -sf "$OPT/{}" "$SYSROOT/{}" ';') + ;; + +(del) + rm -rf "$OPT" "$SRC" + find -L "$SYSROOT" -type l -exec rm {} + + ;; + +(*) + exit 1 + ;; +esac diff --git a/bin/play b/bin/play @@ -0,0 +1,3 @@ +#!/bin/sh + +exec find "$1" -type f -exec mplayer {} + diff --git a/bin/plot b/bin/plot @@ -0,0 +1,42 @@ +#!/bin/sh + +awk ' + +BEGIN { + if (ARGC != 3 || ARGV[1] != "-h") { + print "usage: plot -h [height]"; + exit(1); + } + height = ARGV[2] + ARGV[2] % 2; + ARGC = 0; +} + +{ + x_max = split($0, dots); + for (x = 1; x <= x_max; x++) { + if (skip[x] = (dots[x] == "?")) + dots[x] = 0; + if (y_max < dots[x]) + y_max = dots[x]; + } + y_step = y_max / height; + if (y_step <= 0) + y_step = 1; + float = y_step < 1; + margin = length(y_max) > 15 ? length(y_max) : 15; + for (y = height * y_step * 2; y >= 0; y -= y_step * 2) { + if (num = !num) { + if (float) printf("%" margin ".2f _|", y); + else printf("%" margin "d _|", y); + } else printf("%" margin "s |", ""); + for (x = 1; x <= x_max; x++) + printf("%s", (dots[x] > y + y_step ? ":" : \ + dots[x] > y ? "." : " ")); + print(""); + } + printf("%" margin "s0 +", ""); + for (x = 1; x <= x_max; x++) + printf("%s", skip[x] ? "x" : "-"); + print("+ " x_max); +} +' "$@" diff --git a/bin/printree b/bin/printree @@ -0,0 +1,59 @@ +#!/bin/sh + +LC_COLLATE=C + +awk '{ do { print } while (sub("/[^/]*$", "")) }' | sort -u | +awk -v LINE='│ ' -v NODE='├── ' -v TAIL='└── ' -v VOID=' ' -v HTML="$1" ' +BEGIN { + if (HTML) + print "<pre>" +} + +{ + count = split($0, line, "/") + if (HTML) { + gsub("&", "\\&amp;"); + gsub("<", "\\&gt;"); + } + lines[NR"]["0] = $0 + for (i = 1; i <= count; i++) + lines[NR"]["i] = LINE + + lines[NR"]["i - 1] = NODE +} + +END { + for (i = 1; !stop; i++) { + stop = tail = 1 + + for (l = NR; l > 0; l--) { + if (lines[l"]["i] == LINE && tail) { + lines[l"]["i] = VOID + stop = 0 + + } else if (lines[l"]["i] == NODE && tail) { + lines[l"]["i] = TAIL + tail = stop = 0 + + } else if (!lines[l"]["i]) { + tail = 1 + } + } + } + + for (l = 1; l <= NR; l++) { + for (i = 1; lines[l"]["i]; i++) + printf "%s", lines[l"]["i] + + name = lines[l"]["0] + sub(".*/", "", lines[l"]["0]) + + if (HTML) + print "<a href=\"" name "\">" lines[l"]["0] "</a>" + else + print lines[l"]["0] + } + + if (HTML) + print "</pre>" +}' diff --git a/bin/qemu-start b/bin/qemu-start @@ -0,0 +1,6 @@ +#!/bin/sh + +exec doas qemu-system-x86_64 -m 4G -display curses \ + -device e1000,netdev=net0 \ + -netdev user,id=net0,hostfwd=tcp::5555-:22 \ + "$1" diff --git a/bin/s b/bin/s @@ -0,0 +1,3 @@ +#!/bin/sh + +git status -s --branch diff --git a/bin/sane-name b/bin/sane-name @@ -0,0 +1,14 @@ +#!/bin/sh +# only keep '[:alnum:]', ',' and '.' and convert everyting else to '-' + +find . -depth | while IFS='' read -r path +do + dir=$(dirname "$path") + old=$(basename "$path") + new=$( + printf %s "$old" | tr -c '[:alnum:],.' '-' | + sed -r -e 's/-+/-/g' -e 's/([0-9]+)\.*-/\1-/' + ) + + [ "$dir/$old" = "$dir/$new" ] || mv -- "$dir/$old" "$dir/$new" +done diff --git a/bin/screen-brightness b/bin/screen-brightness @@ -0,0 +1,2 @@ +#!/bin/sh +printf '%s\n' "$1" | sudo tee -a /sys/class/backlight/*/brightness diff --git a/bin/screen-cast b/bin/screen-cast @@ -0,0 +1,8 @@ +#!/bin/sh +# record screen content to a video using ffmpeg + +ffmpeg -framerate 25 -f x11grab -i :0.0 -video_size "$( + sed 's/,.*//' /sys/class/graphics/fb0/virtual_size +)x$( + sed 's/.*,//' /sys/class/graphics/fb0/virtual_size +)" "$HOME/${1:-screencast}.mp4" diff --git a/bin/screen-rotate b/bin/screen-rotate @@ -0,0 +1,16 @@ +#!/bin/sh +# rotate the screen in TTY or GUI + +if [ "$DISPLAY" ] +then + xrandr --output "$( + xrandr -q | grep -w connected | cut -d ' ' -f 1 + )" --rotate "$1" +else + case "$1" in + ( u | up ) printf 0 ;; + ( r | right ) printf 1 ;; + ( d | down ) printf 2 ;; + ( l | left ) printf 3 ;; + esac | sudo tee /sys/class/graphics/fbcon/rotate_all > /dev/null +fi diff --git a/bin/store b/bin/store @@ -0,0 +1,21 @@ +#!/bin/sh +# store a file into $HOME/lib/http + +domain=$(printf %s "$1" | sed -r 's|(://)?([^/]+).*|\2|') +filename=$(printf %s "$1" | sed -r 's|.*/||') + +mkdir -p "$HOME/lib/http/$domain" +cd "$HOME/lib/http/$domain" || exit 1 + +case $1 in +(*vimeo.com/*|*youtube.com/*) + youtube-dl "$1" + ;; +(*://*) + curl -L "$1" > "$filename" + ;; +(*) + printf 'uri not handled\n' 1>&2 + exit 1 + ;; +esac diff --git a/bin/term-inv b/bin/term-inv @@ -0,0 +1,2 @@ +#!/bin/sh +[ $# = 0 ] && printf '\033[?5%s' h || printf '\033[?5%s' l diff --git a/bin/term-name b/bin/term-name @@ -0,0 +1,3 @@ +#!/bin/sh + +printf '\033]0;%s\007' "$*" diff --git a/bin/tty-theme b/bin/tty-theme @@ -0,0 +1,373 @@ +#!/bin/sh +# set the theme for the tty from a simple file format + + +# normal bold +# 0 8 black +# 1 9 red +# 2 A green +# 3 B orange +# 4 C blue +# 5 D magenta +# 6 E cyan +# 7 F white + +THEMES=' + +lolidaisuki + +0 1d1d1d +1 b52839 +2 246734 +3 fa9043 +4 4a5cdb +5 99267b +6 15c9c9 +7 dcdcbb +8 333333 +9 fa564b +A 06a535 +B ffaf2b +C 9ca4eb +D ed4db3 +E 62f2f2 +F bc9977 + + +alien + +0 000910 +1 ccccbb +2 aaddbb +3 aaddaa +4 aacccc +5 bbbbcc +6 aaddcc +7 cceedd +8 aaccbb +9 ddddcc +A bbeecc +B cceebb +C bbdddd +D ccccdd +E bbeedd +F fff0f8 + + +coal + +0 000000 +1 ee3333 +2 88ff44 +3 ffcc55 +4 77aaaa +5 85678f +6 55ee99 +7 eeddbb +8 555555 +9 ff6666 +A aaff66 +B ffff99 +C aaddff +D b294bb +E 99ffbb +F ffffff + + +drakula + +0 282a36 +1 cc4343 +2 42c763 +3 ffb86c +4 6272a4 +5 bd93f9 +6 6fb9c9 +7 e6e6d5 +8 888db4 +9 ff5555 +A 50fa7b +B f1fa8c +C 8196d6 +D ff79c6 +E 8be9fd +F ffffff + + +exo + +0 350600 +1 e62828 +2 77b23e +3 d6722e +4 689db3 +5 936599 +6 30c87e +7 acf88d +8 9b6963 +9 ff5454 +A a0d669 +B ff9e5d +C 94dfff +D 9b78ce +E 77ffbd +F ffffff + + +ghost + +0 000000 +1 91265C +2 439a64 +3 ccdd66 +4 55aaaa +5 516583 +6 4a8f86 +7 99bbbb +8 334444 +9 E71E5B +A 72f4a0 +B f5ff8B +C 99bbff +D 676cb0 +E 00ffff +F ffffff + + +gotham + +0 0a0f14 +1 c33027 +2 26a98b +3 edb54c +4 195465 +5 4e5165 +6 33859d +7 98d1ce +8 406068 +9 d26939 +A 30dbb3 +B ffd280 +C 268099 +D 888ba5 +E 599caa +F d3ebe9 + + +gruvbox + +0 282828 +1 cc241d +2 98971a +3 d79921 +4 458588 +5 b16286 +6 689d6a +7 d5c4a1 +8 928374 +9 fb4934 +A b8bb26 +B fabd2f +C 83a598 +D d2869b +E 8ec07c +F ffffff + + +matrix + +0 000000 +1 883300 +2 00aa55 +3 55aa33 +4 339977 +5 668877 +6 119977 +7 99ffaa +8 338844 +9 aa7733 +A 00ff88 +B 88ee66 +C 33dd88 +D 77bb99 +E 66ddbb +F ffffff + + +monokai + +0 48483e +1 dc2566 +2 8fc029 +3 d4c96e +4 55bcce +5 9358fe +6 56b7a5 +7 acada1 +8 76715e +9 fa2772 +A a7e22e +B e7db75 +C 66d9ee +D ae82ff +E 66efd5 +F dfe1d3 + + +pink + +0 090a0f +1 f44444 +2 28684f +3 c8907e +4 422d52 +5 710130 +6 2a7e86 +7 bbbbbb +8 3e4053 +9 f44444 +A 43c291 +B f49a7e +C 542a52 +D 9e0f37 +E 688e95 +F ffffff + + +solarized-dark + +0 002b36 +1 dc322f +2 859900 +3 b58900 +4 268bd2 +5 6c71c4 +6 2aa198 +7 93a1a1 +8 657b83 +9 dc322f +A 859900 +B b58900 +C 268bd2 +D 6c71c4 +E 2aa198 +F fdf6e3 + + +solarized-light + +0 ffddbb +1 d0154b +2 779900 +3 ffa700 +4 096daf +5 dd6699 +6 00aa88 +7 000000 +8 bb9988 +9 d0154b +A 779900 +B ffa700 +C 096daf +D 897f74 +E 00aa88 +F 222222 + + +zenburn + +0 191d1b +1 9C6363 +2 60b48a +3 dfaf8f +4 506070 +5 dc8cc3 +6 8cd0d3 +7 dcdccc +8 709080 +9 dca3a3 +A bfebbf +B f0dfaf +C 94bff3 +D ec93d3 +E 93e0e3 +F ffffff + + +datahill + +0 080011 +1 cc1122 +2 22cc66 +3 edb54c +4 195465 +5 4e5165 +6 33a08d +7 aaccbb +8 407060 +9 ff6644 +A 44ff99 +B ffdd88 +C 337799 +D 888ba5 +E 66ffee +F eeffff +' + + +# 1: chosen theme number + +theme() +{ + show=0 i=0 + + printf '\033[H\033[J' + + while read -r color hex + do + if [ "$hex" ] + then + printf '\033]P%s%s' "$color" "$hex" + show=1 + elif [ "$color" ] + then + name="$color" + elif [ "$show" -eq 1 ] + then + i=$((i + 1)) + + printf '\033[K%3s %-20s' "$i" "$name" + for c in 0 1 2 3 4 5 6 7 + do + printf ' \033[3%sm___\033[1m___\033[m' "$c" + done + printf '\n\033[K\n' + + show=0 + fi + + [ "$1" ] && [ "$i" -ge "$1" ] && return 0 + done << EOF +$THEMES +EOF +} + + +main() +{ + if [ -z "$1" ] + then + theme + printf '\033]P0000000\033]P7aaaaaa\033[J\n Theme number: ' + read -r number + else + number="$1" + fi + + + theme "$number" + printf '\033[J' +} + + +main "$@" diff --git a/bin/tty-video b/bin/tty-video @@ -0,0 +1,8 @@ +#!/bin/sh +# play a video in current TTY using mplayer + +mplayer -vm -vo fbdev2 "$1" -vf scale -zoom -x "$( + sed 's/,.*//' /sys/class/graphics/fb0/virtual_size +)" -y "$( + sed 's/.*,//' /sys/class/graphics/fb0/virtual_size +)" diff --git a/bin/txt b/bin/txt @@ -0,0 +1,94 @@ +#!/bin/sh +awk -F '\0' ' + +# title + +FNR == 1 { + print + for (i = 0; i < 80; i++) + printf "-" + print "" + + if (getline && $0 ~ "^-+$" || $0 ~ "^[ \t]*$") + next +} + +# litterals + +/^\t/ { + print "" + do { + print + } while (getline && $0 ~ "^\t") + next +} + +# blanks + +/^[\t ]*$/ { + next +} + +# heading + +sub("^---", "", $0) { + d = 0 + + # parse + while (sub("[0-9#]+\\.", "", $0)) d++ + if (sub("[0-9#]+", "", $0)) d++ + for (; d < depth; depth--) + levels[depth] = 0 + depth = d + sub("^[-. ]*", "", $0) + sub(" *-* *$", "", $0) + + # print + row = "--- " + for (d = 1; d < depth; d++) + row = row levels[d] "." + row = row "" ++levels[d] " -- " $0 " " + for (i = length(row); i < 80; i++) + row = row "-" + + print "\n" row + next +} + +# links + +/^[0-9#]+: / { + print "" + do { + print + } while (getline && $0 ~ "^[0-9]+: ") + next +} + +# paragraph + +{ + do { + block = block " " $0 + } while (getline && $0 !~ "^[ \t]*$") + + sub("^[\t ]*", "", block) + gsub("[\t ]+", " ", block) + gsub("\\. ", ". ", block) + gsub("\\? ", "? ", block) + gsub("\\! ", "! ", block) + + width = 80 - margin[block] + + print "" + while (length(block) > 0) { + row = substr(block, 1, width) + if (length(row) >= width) + sub(" [^ ]*$", "", row) + + block = substr(block, length(row) + 1) + sub(" *", "", block) + + print row + } +}' "$@" diff --git a/bin/wifi b/bin/wifi @@ -0,0 +1,14 @@ +#!/bin/sh + +case $(uname) in +(Linux) + sudo wpa_supplicant -Dnl80211,wext -i "$( + ip addr | awk '/[0-9]+: wl/ { sub(":$", "", $2); print $2; exit }' + )" -c "$HOME/etc/wpa_supplicant.conf" + ;; +(*BSD) + doas wpa_supplicant -i "$( + ifconfig | awk '/^iw/ { sub(":.*", ""); print; exit }' + )" -c "$HOME/etc/wpa_supplicant.conf" + ;; +esac diff --git a/bin/www b/bin/www @@ -0,0 +1,62 @@ +#!/bin/sh +# fast static website generator using POSIX sh, cat, printf, find, and sed + + +LAYOUT=$(cat layout.html) || exit 1 + + +#1 directory processed +#2 content of the layout to parse + +parse() +{ + printf %s "${2%%{{*}" + + [ "${2##*{{*}" ] && return 0 + + set -- "$1" "${2#*{{}" + + case "${2%%\}\}*}" in + (*content*) [ -f "$1/index" ] && cat "$1/index" ;; + (*title* ) printf %s "${1##*/}" ;; + (*root* ) root "$1" ;; + (*nav* ) nav "$1" ;; + (*list* ) list "$1" ;; + esac + + parse "$1" "${2#*\}\}}" +} + + +root() +{ + printf %s/ "$1" | sed 's|[^/]||g; s|.|../|g; s|/$||; s|^$|.|' +} + + +nav() +{ + find -L . -mindepth 1 -maxdepth 1 -type d ! -name '.*' | sort | + sed 's|..||' | while IFS='' read -r path + do printf ' <a href="%s">%s</a>' "$(root "$1")/$path" "$path" + done +} + + +list() +{ + [ "$1" != . ] && find -L "$1" -mindepth 1 -maxdepth 1 ! -name 'index*' | + sort | sed 's|.*/||' | while IFS='' read -r path + do + printf -- '<li><a href="%s">%s%s</a></li>\n' "$path" "$path" "$( + [ -f "$path/index" ] && sed 's|^| - | q' "$path/index" + )" + done +} + + +for dir in "$@" +do parse "$dir" "$LAYOUT" > "$dir/index.html" +done + +parse . "$LAYOUT" > index.html diff --git a/bin/www.1 b/bin/www.1 @@ -0,0 +1,96 @@ +.Dd $Mdocdate: November 11 2016$ +.Dt WWW-TREE 1 +.Os +.Sh NAME +. +.Nm www-tree +.Nd simple, recursive static website generator +. +.Sh SYNOPSIS +. +.Li cd +.Pa path +.Li && www +. +.Sh DESCRIPTION +. +.Pp +The only thing this script does is building one index.html for each directory, +including +.Pa DIR +itself. +.Pp +Each index.html has the content of a +.Pa layout.html +file in the top +.Pa path +directory, after being parsed. +. +.Sh FILES +. +Some files are treated particularly. +. +.Bl -tag +.It dir/layout.html +File containing the index.html pages layout. +. +.It dir/*/README +The "README" files content can be displayed on the pages if the layout +contains a +.Li {{ content }} +keyword. +. +.It dir/.* +All +.Sy directories +starting with a +.Sq Li "." +will be ignored. +.El +.Pp +All other directories are ignored and let unchanged. +. +.Sh LAYOUT FORMAT +. +Within a layout.html, some templating permit to insert dynamic content into +the index files, by using the following keywords. +. +.Bl -tag +.It {{ content }} +Content of the README file in the current directory, if any. +. +.It {{ list }} +List of links to subpages for the current directory (including dotfiles). +. +.It {{ nav }} +List of top level directories, for use as a <nav> element. +. +.It {{ root }} +Relative path to the root of the website, for relative links. +. +.It {{ title }} +Page title, given by the path, with "/" replaced by " > ". +.El +. +.Sh ENVIRONMENT +. +.Bl -tag +.It PWD +Source directory from which generate the website. It is also where the website +will be generated. +.El +. +.Sh SEE ALSO +. +.Pa http://marmaro.de +the website that gave me the idea. +.Pp +.Xr werc 1 +.Xr swerc 1 +. +.Sh AUTHORS +. +.Nm www +is made by +.An Josuah Demangeon Aq mail@josuah.net +.Md $$ diff --git a/bin/xdg-open b/bin/xdg-open @@ -0,0 +1,65 @@ +#!/bin/sh +# override the xdg-open utility + +case $(tty) in +(/dev/pts/*|/dev/tty*) + ;; +(*) + exec st -e "$0" "$1" + ;; +esac + +printf '\033]0;%s\007' "$*" + +case $1 in +(*.[0-9]|*.[0-9]p|*.[0-9].gz) + exec mandoc -a "$1" + ;; +($HOME/var/log/*) + exec $PAGER "$1" + ;; +(http://*|https://*) + for b in chromium chromium-browser chrome firefox x-www-browser + do command -v "$b" && break + done + exec "$b" "$1" + ;; +(gopher://*) + exec sacc "$1" + ;; +(ssh://*) + address=${1#ssh://} + case $address in + (*:*) + exec ssh -p "${address#*:}" "${address%:*}" + ;; + (*) + exec ssh "$address" + ;; + esac + ;; +(sftp://*) + exec sftp ${1#sftp://} + ;; +(9p://*) + address=${1#9p://} + dir=$HOME/var/9p/$address + mkdir -p "$dir" + doas 9pfs "$address" "$dir" + ;; +(mailto:*) + mcom "${1#mailto:}" + ;; +(*.pdf) + exec mupdf "$1" + ;; +(*.jpg|*.jpeg|*.png) + exec feh -. "$1" + ;; +(*.gif|*.webm|*.mp4|*.flac) + exec mplayer "$1" + ;; +(*) + exec $EDITOR "$1" + ;; +esac diff --git a/cron/git b/cron/git @@ -0,0 +1 @@ +* * * * * git-sync diff --git a/cron/monitor b/cron/monitor @@ -0,0 +1 @@ +*/15 * * * * monitor-step diff --git a/dot/asoundrc b/dot/asoundrc @@ -0,0 +1,10 @@ +pcm.!default { + type hw + card 1 + device 0 +} + +ctl.!default { + type hw + card 1 +} diff --git a/dot/bashrc b/dot/bashrc @@ -0,0 +1,22 @@ +# --- prompt ------------------------------------------------------------------- + +PS1='$( + [ $? = 0 ] || printf "\033[31;1mx\n\033[m" +)\[$( + printf "\033];%s %s%s\007" "$(uname -n)" "$PWD" "$(git-status)" +)\]--- ' +PS2=' -- ' + +# --- alias -------------------------------------------------------------------- + +alias cl='printf "\033[H\033[2J"' +alias blih="blih -u $BLIH" +alias p='p=$(io-ps)' +alias lines='find . -type f -name "*.[ch]" -exec wc -l {} +' + +# --- functions ---------------------------------------------------------------- + +day() +{ + cd "$HOME/git/CPool_Day$(printf %02d "$1")_2017" +} diff --git a/dot/emacs.d/init.el b/dot/emacs.d/init.el @@ -0,0 +1,284 @@ +(setq + user-full-name "Josuah Demangeon" + user-mail-address "mail@josuah.net" + + custom-file (expand-file-name "emacs-custom.el" temporary-file-directory)) + +(add-to-list 'load-path "~/.emacs.d/lisp") + +; --- appearance --------------------------------------------------------------- + +(when (fboundp 'menu-bar-mode) (menu-bar-mode -1)) +(when (fboundp 'fringe-mode) (fringe-mode 0)) +(when (fboundp 'tool-bar-mode) (tool-bar-mode -1)) +(when (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) + +(set-frame-font "mono:size=15") +(add-to-list 'default-frame-alist + '(font . "mono:size=15")) + +; --- packages ----------------------------------------------------------------- + +(require 'package) + +(setq package-list '(ivy swiper counsel)) + +(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) + +(package-initialize) + +(unless package-archive-contents (package-refresh-contents)) + +(dolist (package '(ivy swiper counsel)) + (unless (package-installed-p package) (package-install package))) + +; --- core settings ------------------------------------------------------------ + +(setq + echo-keystrokes 0.1 + + inhibit-startup-message t + initial-scratch-message nil + + tab-always-indent 'complete) + +(defalias 'display-startup-echo-area-message + (lambda () (message "Emacs loaded in %s" (emacs-init-time)))) +(defalias 'yes-or-no-p 'y-or-n-p) + +(column-number-mode) + +(require 'files) +(setq + backup-directory-alist ;Backup and autosaves + `((".*" . ,(expand-file-name "tmp" user-emacs-directory))) + auto-save-file-name-transforms + `((".*" ,(expand-file-name "tmp" user-emacs-directory)))) + +(require 'hideshow) +(add-hook 'prog-mode-hook 'hs-minor-mode) + +(provide 'reveal) +(global-reveal-mode) + +(require 'which-func) +(add-hook 'prog-mode-hook 'which-function-mode) +(add-hook 'text-mode-hook 'which-function-mode) + +(require 'prog-mode) +(setq prettify-symbols-unprettify-at-point 'right-edge) +(prettify-symbols-mode) + +(require 'paren) +(setq show-paren-when-point-inside-paren t + show-paren-when-point-in-periphery t + show-paren-style 'mixed) + +(show-paren-mode 1) + +(require 'misc) +(global-set-key (kbd "M-z") 'zap-up-to-char) + +(require 'eldoc) +(add-hook 'prog-mode-hook 'eldoc-mode) + +(require 'doc-view) +(setq doc-view-resolution 100) + +; --- ibuffer ------------------------------------------------------------------ + +(require 'ibuffer) +(require 'ibuf-ext) + +(setq + ibuffer-saved-filter-groups + '(("default" + ("Gnus" + (or (mode . message-mode) + (mode . mail-mode) + (mode . gnus-group-mode) + (mode . gnus-summary-mode) + (mode . gnus-article-mode) + (mode . gnus-edit-form-mode) + (name . "^\\.newsrc-dribble"))) + ("Irc" (mode . rcirc-mode)) + ("Web" (mode . eww-mode)) + ("Shell" + (or (name . "^\\*Shell Command Output\\*$") + (name . "^\\*Async Shell Command\\*$") + (name . "^\\*Whois\\*$") + (mode . eshell-mode) + (mode . shell-mode))) + ("Emacs" + (or (name . "^\\*scratch\\*$") + (name . "^\\*backtrace\\*$") + (name . "^\\*Dired log\\*$") + (mode . messages-buffer-mode) + (mode . completion-list-mode) + (mode . Info-mode) + (mode . help-mode) + (mode . compilation-mode) + (mode . package-menu-mode) + (mode . occur-mode) + (mode . Custom-mode))) + ("VC" + (or (name . "^\\*vc\\*$") + (mode . diff-mode) + (mode . vc-dir-mode))) + ("Dired" (mode . dired-mode)) + ("Elisp" (mode . emacs-lisp-mode)) + ("Org" (mode . org-mode)) + ("Documents" (filename . ".pdf\\|.ps\\|.odt\\|.ods")) + ("Other Files" (filename . ""))))) + +(add-hook + 'ibuffer-mode-hook + (lambda () (ibuffer-switch-to-saved-filter-groups "default"))) + +(defalias 'list-buffers 'ibuffer) + +; --- eshell ------------------------------------------------------------------- + +(require 'eshell) +(require 'em-prompt) +(require 'em-term) +(require 'em-cmpl) +(require 'em-smart) +(require 'em-banner) + +(setq + eshell-where-to-jump 'begin + eshell-review-quick-commands nil + eshell-smart-space-goes-to-end t + pcomplete-cycle-completions nil + eshell-prompt-function 'my-eshell-prompt-function + eshell-prompt-regexp "^> ") + +(defmacro with-face (string &rest properties) + "Set face for STRING without defining it, according to PROPERTIES." + `(propertize ,string 'face (list ,@properties))) + +(defun my-eshell-prompt-function () + "Function generating the eshell prompt." + (concat + "\n" + (with-face (concat " " (abbreviate-file-name (eshell/pwd)) " ") + :inverse-video t) + (with-face (format-time-string " %H:%M " (current-time)) + :inherit 'hl-line) + + (with-face (or (ignore-errors + (format "%s %s" + (vc-responsible-backend default-directory) + (vc-state default-directory))) + "") + :inherit 'hl-line) + (with-face "\n" + :inherit 'hl-line) + "> ")) + +(add-to-list 'eshell-visual-commands "alsamixer") +(add-to-list 'eshell-visual-commands "cfdisk") + +(add-hook 'eshell-mode-hook 'eshell-smart-initialize) + +; --- org ---------------------------------------------------------------------- + +(require 'org) +(require 'ox-publish) + +(setq + org-descriptive-links nil + org-startup-folded nil) + +(org-babel-do-load-languages + 'org-babel-load-languages + '((emacs-lisp . t) (python . t) (R . t))) + +; --- gnus --------------------------------------------------------------------- + +(require 'nnimap) +(require 'gnus-mlspl) +(require 'nnir) + +(setq + ;; E-mails + + gnus-select-method + '(nnimap + "gmail" + + (nnimap-stream ssl) ;Reading + (nnimap-address "imap.gmail.com") + (nnimap-inbox "INBOX") + + (smtpmail-smtp-server "smtp.gmail.com") ;Sending + (smtpmail-smtp-service 587) + (send-mail-function smtpmail-send-it) + + (nnir-search-engine imap) ;Searching + + (nnimap-split-methods nnmail-split-fancy) ;Splitting + (nnimap-unsplittable-articles nil) + + (nnmail-split-fancy + (& (| (: nnmail-split-fancy-with-parent) + (: gnus-group-split-fancy)) + (from "josuah\\.demangeon@gmail\\.com" "mail.sent"))) + + (gnus-group-split-default-catch-all-group "INBOX") + + (gnus-parameters ;Group parameters + ((".*\\[Gmail\\].*" + (subscribed . t)) + ("mail\\..*" + (display . all) + (subscribed . t)) + ("mail\\.me" + (to-list . "josuah.demangeon@gmail.com")) + ("mail\\.sfbi" + (to-list . "bioinfo@sfbi.fr")) + ("mail\\.fsf" + (to-list . "info@fsf.org")) + ("mail\\.univ-rennes1" + (split-regexp . ".*univ-rennes1\\.fr")) + ("mail\\.github" + (to-list . "notifications@github\\.com") + (split-regexp . ".*github\\.com")) + ("mail\\.expenses" + (split-regexp . "@amazon.*") + (split-regexp . "@.*sfr\\.fr")) + ("list\\..*" + (display . all))))) + + message-subscribed-address-functions + '(gnus-find-subscribed-addresses) + + gnus-ignored-from-addresses nil ;Hide no group or email adress + gnus-ignored-newsgroups "" + + mm-attachment-override-types '("image/.*") ;Display images inline + + gnus-use-full-window nil ;So not change window config + + ;; NTP + + gnus-secondary-select-methods '((nntp "news.gmane.org") + (nntp "news.gnus.org"))) + +(add-hook 'gnus-group-mode-hook 'gnus-topic-mode) + +; --- ivy ---------------------------------------------------------------------- + +(require 'ivy) +(require 'swiper) +(require 'counsel) +(ivy-mode) +(counsel-mode) + +(global-set-key (kbd "C-s") 'swiper) +(global-set-key (kbd "M-x") 'counsel-M-x) + +; ------------------------------------------------------------------------------ + +(provide 'init) diff --git a/dot/emacs.d/lisp/std.el b/dot/emacs.d/lisp/std.el @@ -0,0 +1,21 @@ +;; +;; EPITECH PROJECT, 2017 +;; emacs configuration +;; File description: +;; global emacs configuration to help students +;; + +(set-variable 'c-argdecl-indent 0) + +(normal-erase-is-backspace-mode 0) + +; Define keyboard shortcuts +(global-set-key "" 'backward-delete-char) +(global-set-key "" 'compile) +(global-set-key "" 'goto-line) + +; Adjust indentation settings +(setq c-default-style "linux" + c-basic-offset 8 + tab-width 8 + indent-tabs-mode t) diff --git a/dot/emacs.d/lisp/std_comment.el b/dot/emacs.d/lisp/std_comment.el @@ -0,0 +1,184 @@ +;; +;; EPITECH PROJECT, 2017 +;; emacs configuration +;; File description: +;; standard epitech header configuration +;; + +(global-set-key "" 'std-file-header) + +(setq header-epitech "EPITECH PROJECT, " + header-description "File description:") + +(setq std-c-alist '( (cs . "/*") (cc . "** ") (ce . "*/") ) + std-css-alist '( (cs . "/*") (cc . "** ") (ce . "*/") ) + std-cpp-alist '( (cs . "//") (cc . "// ") (ce . "//") ) + std-pov-alist '( (cs . "//") (cc . "// ") (ce . "//") ) + std-java-alist '( (cs . "//") (cc . "// ") (ce . "//") ) + std-latex-alist '( (cs . "%%") (cc . "%% ") (ce . "%%") ) + std-lisp-alist '( (cs . ";;") (cc . ";; ") (ce . ";;") ) + std-xdefault-alist '( (cs . "!!") (cc . "!! ") (ce . "!!") ) + std-pascal-alist '( (cs . "{ ") (cc . " ") (ce . "}" ) ) + std-makefile-alist '( (cs . "##") (cc . "## ") (ce . "##") ) + std-text-alist '( (cs . "##") (cc . "## ") (ce . "##") ) + std-fundamental-alist '( (cs . " ") (cc . " ") (ce . " ") ) + std-html-alist '( (cs . "<!--") (cc . " -- ") (ce . "-->")) + std-php-alist '( (cs . "#!/usr/local/bin/php\n<?php") (cc . "// ")(ce . "//")) + std-nroff-alist '( (cs . "\\\"") (cc . "\\\" ") (ce . "\\\"")) + std-sscript-alist '( (cs . "#!/bin/sh") (cc . "## ") (ce . "##")) + std-perl-alist '( (cs . "#!/usr/local/bin/perl -w") (cc . "## ")(ce . "##")) + std-cperl-alist '( (cs . "#!/usr/local/bin/perl -w") (cc . "## ")(ce . "##")) + ) + + +(setq std-modes-alist '(("C" . std-c-alist) + ("C/l" . std-c-alist) + ("CSS" . std-c-alist) + ("PoV" . std-pov-alist) + ("C++" . std-cpp-alist) + ("C++/l" . std-cpp-alist) + ("Lisp" . std-lisp-alist) + ("Lisp Interaction" . std-lisp-alist) + ("Emacs-Lisp" . std-lisp-alist) + ("Fundamental" . std-fundamental-alist) + ("Shell-script" . std-sscript-alist) + ("Makefile" . std-makefile-alist) + ("BSDmakefile" . std-makefile-alist) + ("GNUmakefile" . std-makefile-alist) + ("Perl" . std-cperl-alist) + ("CPerl" . std-cperl-alist) + ("xdefault" . std-xdefault-alist) + ("java" . std-java-alist) + ("latex" . std-latex-alist) + ("Pascal" . stdp-ascal-alist) + ("Text" . std-text-alist) + ("HTML" . std-html-alist) + ("PHP" . std-php-alist) + ("Nroff" . std-nroff-alist) + ("TeX" . std-latex-alist) + ("LaTeX" . std-latex-alist)) + ) + +(defun std-get (a) + (interactive) + (cdr (assoc a (eval (cdr (assoc mode-name std-modes-alist))))) + ) + +(defun std-file-header () + "Puts a standard header at the beginning of the file.\n(According to mode)" + (interactive) + (goto-char (point-min)) + (let ((projname "toto")(projdescription "tiuti")) + (setq projname (read-from-minibuffer + (format "Type project name (RETURN to quit) : "))) + (setq projdescription (read-from-minibuffer + (format "Type short file description (RETURN to quit) : "))) + + (insert-string (std-get 'cs)) + (newline) + (insert-string (concat (std-get 'cc) + header-epitech + (format-time-string "%Y"))) + (newline) + (insert-string (concat (std-get 'cc) + projname)) + (newline) + (insert-string (concat (std-get 'cc) + header-description)) + (newline) + (insert-string (concat (std-get 'cc) + projdescription)) + (newline) + (insert-string (std-get 'ce)) + (newline) + (newline))) + +(defun insert-std-vertical-comments () + "Inserts vertical comments (according to mode)." + (interactive) + (beginning-of-line) + (insert-string (std-get 'cs)) + (newline) + (let ((ok t)(comment "")) + (while ok + (setq comment (read-from-minibuffer + (format "Type comment (RETURN to quit) : "))) + (if (= 0 (length comment)) + (setq ok nil) + (progn + (insert-string (concat (std-get 'cc) comment)) + (newline))))) + (insert-string (std-get 'ce)) + (newline)) + +(defun std-toggle-comment () + "Toggles line comment on or off (according to mode)." + (interactive) + (save-excursion + (let (beg end) + (beginning-of-line) + (setq beg (point)) + (end-of-line) + (setq end (point)) + (save-restriction + (if (not (equal beg end)) + (progn + (narrow-to-region beg end) + (goto-char beg) + (if (search-forward (std-get 'cs) end t) + (progn + (beginning-of-line) + (replace-string (std-get 'cs) "") + (replace-string (std-get 'ce) "")) + (progn + (beginning-of-line) + (insert-string (std-get 'cs)) + (end-of-line) + (insert-string (std-get 'ce))))))))) + ;; (indent-according-to-mode) + (indent-for-tab-command) + (next-line 1)) + +;;; Added by Eole Wednesday May 29 2002, 1:33:55 +;;; Extended bindings for this package and for commenting code + +(global-set-key "h" 'update-std-header) +(global-set-key "" 'std-file-header) + +;;;; Generating local keymaps for exotics modes. + +;;; In CPerl mode, C-c C-h is used to do some help. +;;; so it is C-c C-h h +;;; For working, it requires info pages about perl +(add-hook 'cperl-mode-hook + '(lambda () + (define-key cperl-mode-map "" + 'comment-region) + (define-key cperl-mode-map "h" + 'std-file-header))) + +;; for perl-mode +(add-hook 'perl-mode-hook + '(lambda () + (define-key perl-mode-map "" + 'comment-region))) + +;; for all kind of lisp code +(add-hook 'emacs-lisp-mode-hook + '(lambda () + (define-key emacs-lisp-mode-map "" + 'comment-region))) + +(add-hook 'lisp-mode-hook + '(lambda () + (define-key lisp-mode-map "" + 'comment-region))) + + + +;; for La(TeX)-mode +(add-hook 'tex-mode-hook + '(lambda () + (define-key tex-mode-map "" + 'comment-region))) + diff --git a/dot/exrc b/dot/exrc @@ -0,0 +1,3 @@ +set number + +map g 1G diff --git a/dot/gitconfig b/dot/gitconfig @@ -0,0 +1,10 @@ +[user] + email = mail@josuah.net + name = Josuah Demangeon + +[alias] + graph = log --graph --date=short --color=never --decorate --tags \ + --branches --remotes --format='%h %cd %cn <%ce>%d%n%s%n' + +[core] + editor = ex diff --git a/dot/gitignore b/dot/gitignore @@ -0,0 +1 @@ +*/supervise diff --git a/dot/mblaze/profile b/dot/mblaze/profile @@ -0,0 +1,2 @@ +Sendmail: msmtp +Local-Mailbox: mail@josuah.net diff --git a/dot/mbsyncrc b/dot/mbsyncrc @@ -0,0 +1,19 @@ +IMAPAccount mail@josuah.net +Host mail.gandi.net +User mail@josuah.net +PassCmd "printf '\\npass: ' 1>&2; stty -echo; sed q | tr -d '\\n'; stty sane" + +IMAPStore gandi-remote +Account mail@josuah.net + +MaildirStore gandi-local +Path ~/var/mail/ +Inbox ~/var/mail/INBOX + +Channel mail@josuah.net +Master :gandi-remote: +Slave :gandi-local: +Patterns * +Create Both +Expunge Both +SyncState * diff --git a/dot/mg b/dot/mg @@ -0,0 +1,2 @@ +backup-to-home-directory +column-number-mode diff --git a/dot/mpoprc b/dot/mpoprc @@ -0,0 +1,14 @@ +defaults +tls on +tls_certcheck off +tls_starttls off +uidls_file ~/var/run/mpop/%U + +account mail@josuah.net +host mail.gandi.net +user mail@josuah.net +auth user +delivery maildir ~/var/mail/INBOX +keep on + +account default : mail@josuah.net diff --git a/dot/msmtprc b/dot/msmtprc @@ -0,0 +1,12 @@ +defaults + +account mail@josuah.net +host mail.gandi.net +from mail@josuah.net +user mail@josuah.net +auth on +tls on +tls_certcheck off +logfile ~/var/log/msmtp + +account default : mail@josuah.net diff --git a/dot/profile b/dot/profile @@ -0,0 +1,56 @@ +# --- standard ----------------------------------------------------------------- + +export NAME="Josuah Demangeon" +export TZ="Europe/Paris" +export NICK="josuah" +export EMAIL="mail@josuah.net" +export EDITOR="edit" +export VISUAL="$EDITOR" +export PAGER="less" +export MANPAGER="$PAGER" + +# --- paths -------------------------------------------------------------------- + +export ENV="$HOME/.bashrc" +export MAIL="$HOME/var/mail/INBOX" +export PATH="$HOME/etc/bin:$HOME/usr/bin:$PATH" +export MANPATH="/usr/share/man:/usr/local/man" +export MANPATH="$HOME/usr/share/man:$MANPATH" +export PYTHONPATH="$HOME/usr/lib/python2.7/site-packages" +export GOPATH="$HOME/usr/lib/go" +export C_INCLUDE_PATH="$HOME/usr/include" +export LIBRARY_PATH="$HOME/usr/lib:/usr/local/lib/inotify" +export LD_LIBRARY_PATH="$HOME/usr/lib:/usr/local/lib/inotify" + +export XDG_DATA_DIRS="$HOME/usr/share" +export XDG_DATA_HOME="$HOME/usr/share" +export XDG_CONFIG_DIRS="$HOME/usr/etc" +export XDG_CONFIG_HOME="$HOME/usr/etc" + +export XDG_CACHE_HOME="$HOME/var/cache" +export XDG_RUNTIME_DIR="$HOME/var/run" + +export XDG_DOCUMENTS_DIR="$HOME/lib/document" +export XDG_PICTURES_DIR="$HOME/lib/image" +export XDG_VIDEOS_DIR="$HOME/lib/video" +export XDG_MUSIC_DIR="$HOME/lib/music" + +export XDG_DESKTOP_DIR="$HOME/tmp" +export XDG_DOWNLOAD_DIR="$HOME/tmp" +export XDG_PUBLICSHARE_DIR="$HOME/tmp" +export XDG_TEMPLATES_DIR="$HOME/tmp" + +# --- programs ----------------------------------------------------------------- + +export ABDUCO_SOCKET_DIR="$HOME/var/run" + +export LESS="-IRS" +export LESSCHARSET="utf-8" + +export BLIH="josuah.demangeon@epitech.eu" + +export SSH_AUTH_SOCK="$HOME/var/run/ssh-agent" + +# --- startup ------------------------------------------------------------------ + +[ "$SSH_TTY" ] || ssh-agent -a "$HOME/var/run/ssh-agent" diff --git a/dot/ssh/config b/dot/ssh/config @@ -0,0 +1,27 @@ +host git.nixers.net + IdentityFile /mnt/key/git.nixers.net.key + AddKeysToAgent yes + +host repo.or.cz + IdentityFile /mnt/key/repo.or.cz.key + AddKeysToAgent yes + +host github.com + IdentityFile /mnt/key/github.com.key + AddKeysToAgent yes + +host git.epitech.eu + IdentityFile /mnt/key/epitech.eu.key + AddKeysToAgent yes + +host 192.168.0.11 + IdentityFile /mnt/key/store.josuah.net.key + AddKeysToAgent yes + +host store.josuah.net + IdentityFile /mnt/key/store.josuah.net.key + AddKeysToAgent yes + +host josuah.net + IdentityFile /mnt/key/josuah.net.key + AddKeysToAgent yes diff --git a/dot/vim/vimrc b/dot/vim/vimrc @@ -0,0 +1,26 @@ +syntax off + +set encoding=utf8 +set list listchars=tab:\|\ ,trail:%,extends:>,precedes:<,nbsp:_ +set ruler rulerformat=%15(%4l:%v%=%P%) +set scrolloff=3 +set colorcolumn=81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 +set incsearch +set noswapfile +set viminfo+=n~/.vim/viminfo +set titlestring="" + +highlight statusline ctermbg=none ctermfg=7 cterm=bold +highlight statuslinenc ctermbg=none ctermfg=none cterm=bold +highlight colorcolumn ctermbg=none ctermfg=1 cterm=none +highlight search ctermbg=3 ctermfg=0 cterm=none +highlight visual ctermbg=7 ctermfg=0 cterm=none +highlight modemsg ctermbg=none ctermfg=7 cterm=bold +highlight linenr ctermbg=none ctermfg=238 cterm=none +highlight nontext ctermbg=none ctermfg=238 cterm=none +highlight specialkey ctermbg=none ctermfg=238 cterm=none + +nmap coh :set hlsearch!<cr>:set hlsearch?<cr> +nmap col :set list !<cr>:set list ?<cr> +nmap cop :set paste !<cr>:set paste ?<cr> +nmap con :set number !<cr>:set number ?<cr> diff --git a/dot/xinitrc b/dot/xinitrc @@ -0,0 +1,24 @@ +setxkbmap us -option compose:ralt +xsetroot -solid '#000000' +xset +fp "$HOME/etc/fonts" + +while sleep 10 +do + xsetroot -name "$( + case $(uname) in + (Linux) + cat /sys/class/power_supply/BAT1/capacity + ;; + (*BSD) + bat=hw.sensors.acpibat1.watthour + prev="$(sysctl "${bat}3" | sed 's/.*=//' | tr -cd 0-9)" + curr="$(sysctl "${bat}4" | sed 's/.*=//' | tr -cd 0-9)" + expr "$prev" '*' 100 / "$curr" + ;; + esac + )% $( + date +'%Y/%m/%d %H:%M' + )" +done & + +exec dwm diff --git a/fonts/ter-v12n.psf b/fonts/ter-v12n.psf Binary files differ. diff --git a/fonts/ter-v14b.psf b/fonts/ter-v14b.psf Binary files differ. diff --git a/fonts/ter-v14n.psf b/fonts/ter-v14n.psf Binary files differ. diff --git a/fonts/ter-v16b.psf b/fonts/ter-v16b.psf Binary files differ. diff --git a/fonts/ter-v16n.psf b/fonts/ter-v16n.psf Binary files differ. diff --git a/fonts/ter-v18b.psf b/fonts/ter-v18b.psf Binary files differ. diff --git a/fonts/ter-v18n.psf b/fonts/ter-v18n.psf Binary files differ. diff --git a/fonts/ter-v20b.psf b/fonts/ter-v20b.psf Binary files differ. diff --git a/fonts/ter-v20n.psf b/fonts/ter-v20n.psf Binary files differ. diff --git a/fonts/ter-v22b.psf b/fonts/ter-v22b.psf Binary files differ. diff --git a/fonts/ter-v22n.psf b/fonts/ter-v22n.psf Binary files differ. diff --git a/fonts/ter-v24b.psf b/fonts/ter-v24b.psf Binary files differ. diff --git a/fonts/ter-v24n.psf b/fonts/ter-v24n.psf Binary files differ. diff --git a/fonts/ter-v28b.psf b/fonts/ter-v28b.psf Binary files differ. diff --git a/fonts/ter-v28n.psf b/fonts/ter-v28n.psf Binary files differ. diff --git a/fonts/ter-v32b.psf b/fonts/ter-v32b.psf Binary files differ. diff --git a/fonts/ter-v32n.psf b/fonts/ter-v32n.psf Binary files differ. diff --git a/inetd/popa3d b/inetd/popa3d @@ -0,0 +1 @@ +pop3 stream tcp nowait root /usr/local/libexec/popa3d popa3d diff --git a/inetd/u9fs b/inetd/u9fs @@ -0,0 +1 @@ +9fs stream tcp nowait root /usr/etc/u9fs u9fs diff --git a/install b/install @@ -0,0 +1,35 @@ +#!/bin/sh + +ETC=$(cd "${0%/*}" && pwd) + +cd "$ETC/dot" || exit 1 +find * -type d -exec mkdir -p "$HOME/.{}" ';' +find * -type f -exec ln -fs "$ETC/dot/{}" "$HOME/.{}" ';' +find -L "$HOME" -type l -exec rm {} + + +mkdir -p "$HOME/git" +mkdir -p "$HOME/lib/document" +mkdir -p "$HOME/lib/image" +mkdir -p "$HOME/lib/music" +mkdir -p "$HOME/lib/video" +mkdir -p "$HOME/opt" +mkdir -p "$HOME/src" +mkdir -p "$HOME/tmp" +mkdir -p "$HOME/usr/etc" +mkdir -p "$HOME/var/cache" +mkdir -p "$HOME/var/git" +mkdir -p "$HOME/var/irc" +mkdir -p "$HOME/var/log" +mkdir -p "$HOME/var/mail/INBOX/cur" +mkdir -p "$HOME/var/mail/INBOX/new" +mkdir -p "$HOME/var/mail/INBOX/tmp" +mkdir -p "$HOME/var/qemu" +mkdir -p "$HOME/var/run" +mkdir -p "$HOME/var/torrent" +mkdir -p "$HOME/var/tox" + +cat "$ETC/cron"/* > "$HOME/usr/etc/cron" +cat "$ETC/inetd"/* > "$HOME/usr/etc/inetd" +cat "$ETC/services"/* > "$HOME/usr/etc/inetd" + +fc-cache "$ETC/fonts" diff --git a/io/9p b/io/9p @@ -0,0 +1,2 @@ +#xdg-open +9p://9p.io diff --git a/io/cal b/io/cal @@ -0,0 +1,7 @@ +#cat +2017/09/25 11:00 - [amphi] Accueil Epitech +2017/09/25 15:00 - [amphi] Présentation année +2017/09/26 15:45 - Convocation administrative +2017/09/27 14:55 - Don du sang EFS +2017/09/29 09:00 - Installation PC +2017/10/23 00:00 - RDV CNI diff --git a/io/gopher b/io/gopher @@ -0,0 +1,13 @@ +#sacc +gopher://bitreich.org +gopher://gopherproject.org +gopher://port70.net +gopher://r-36.net +gopher://tx.god.jp +gopher://z3bra.org +gopher://gopherpedia.com +gopher://tx.god.jp/1/yt +gopher://me0w.net/7/searx.dcgi +gopher://jgw.mdns.org/7/.bin-cgi/gophermap.dcgi +gopher://gopher.raumzeitlabor.org/1 +gopher://gopher.leveck.us/1/cgi-bin/pg diff --git a/io/http b/io/http @@ -0,0 +1,22 @@ +#xdg-open +http://cyberia.systems +http://josuah.net +http://lobste.rs +http://n-gate.com +http://nixers.net +http://reddit.com +http://suckless.org +http://2f30.org +http://nixers.net +http://lobste.rs +http://gnu.moe +http://nullprogram.com/ +#independent services +http://fuwafuwa.moe +http://mixtape.moe +http://thecontext.net +http://lainzine.neocities.org/txt-releases/lainzine-3.txt +http://www.tldp.org/guides.html +https://www.destroyallsoftware.com/compendium/network-protocols/ +https://gxamjbnu7uknahng.onion.rip/wiki/index.php/Infornography:_The_Tao_of_Memetic_(Meta)Engineering +http://calomel.org diff --git a/io/irc b/io/irc @@ -0,0 +1,7 @@ +#xdg-open +irc://irc.cyberia.is:6697 +irc://irc.freenode.net:6697 +irc://irc.lainchan.org:6697 +irc://irc.oftc.net:6697 +irc://irc.scalix.gandi.net:6667 +irc://unix.chat:6697 diff --git a/io/sftp b/io/sftp @@ -0,0 +1,2 @@ +#xdg-open +sftp://lainon@archive.sh diff --git a/io/ssh b/io/ssh @@ -0,0 +1,7 @@ +#xdg-open +ssh://josuah@josuah.net +ssh://josuah@store.josuah.net +ssh://josuah@cyberia.systems +ssh://josuahdemangeon@grex.org +ssh://josuah@0.0.0.0:5555 +ssh://root@0.0.0.0:5555 diff --git a/man/ascii.7 b/man/ascii.7 @@ -0,0 +1,46 @@ +.Dd $Mdocdate: Oct 10 2017 $ +.Dt ASCII 7 +.Os +.Sh NAME +.Nm ascii +.Nd four-column representation of the ASCII set +. +.Sh DESCRIPTION +. +.Bd -literal -offset left +.Bf Em +Oct Dec Hex Oct Dec Hex Oct Dec Hex Oct Dec Hex +.Ef +000 000 00 nul 040 032 20 spc 100 064 40 @ 140 096 60 ` +001 001 01 soh 041 033 21 ! 101 065 41 A 141 097 61 a +002 002 02 stx 042 034 22 " 102 066 42 B 142 098 62 b +003 003 03 etx 043 034 23 # 103 067 43 C 143 099 63 c +004 004 04 eot 044 036 24 $ 104 068 44 D 144 100 64 d +005 005 05 enq 045 037 25 % 105 069 45 E 145 101 65 e +006 006 06 ack 046 038 20 & 106 070 46 F 146 102 66 f +007 007 07 bel 047 039 20 ' 107 071 47 G 147 103 67 g +010 008 08 bs 050 040 28 ( 110 072 48 H 150 104 68 h +011 009 09 ht 051 041 29 ) 111 073 49 I 151 105 69 i +012 010 0a lf 052 042 2a * 112 074 4a J 152 106 6a j +013 011 0b vt 053 043 2b + 113 075 4b K 153 107 6b k +014 012 0c ff 054 044 2c , 114 076 4c L 154 108 6c l +015 013 0d cr 055 045 2d - 115 073 4d M 155 109 6d m +016 014 0e so 056 046 2e . 116 073 4e N 156 110 6e n +017 015 0f si 057 047 2f / 117 073 4f O 157 111 6f o +020 016 10 dle 060 048 30 0 120 073 50 P 160 112 70 p +021 017 11 dc1 061 049 31 1 121 077 51 Q 161 113 71 q +022 018 12 dc2 062 050 32 2 122 078 52 R 162 114 72 r +023 019 13 dc3 063 051 33 3 123 079 53 S 163 115 73 s +024 020 14 dc4 044 052 34 4 124 080 54 T 164 116 74 t +025 021 15 nak 045 053 35 5 125 081 55 U 165 117 75 u +026 022 16 syn 056 054 36 6 126 082 56 V 166 118 76 v +027 023 17 etb 057 055 37 7 127 083 57 W 167 119 77 w +030 024 18 can 060 055 38 8 130 084 58 X 170 120 78 x +031 025 19 em 061 056 39 9 131 085 59 Y 171 121 79 y +032 026 1a sub 062 057 3a : 132 086 5a Z 172 122 7a z +033 027 1b esc 063 058 3b ; 133 087 5b [ 173 123 7b { +034 028 1c fs 064 059 3c < 134 088 5c \\ 174 124 7c | +035 029 1d gs 065 060 3d = 135 089 5d ] 175 125 7d } +036 030 1e rs 066 061 3e > 136 090 5e ^ 176 126 7e ~ +037 031 1f us 067 062 3f ? 137 091 5f _ 177 127 7f del +.Ed diff --git a/9pfs/build b/package/9pfs/build diff --git a/9pfs/git b/package/9pfs/git diff --git a/abduco/config.mk b/package/abduco/config.mk diff --git a/abduco/tar b/package/abduco/tar diff --git a/btpd/tar b/package/btpd/tar diff --git a/busybox/build b/package/busybox/build diff --git a/busybox/kconfig.default b/package/busybox/kconfig.default diff --git a/busybox/patch.sh b/package/busybox/patch.sh diff --git a/busybox/tar b/package/busybox/tar diff --git a/cgo/build b/package/cgo/build diff --git a/cgo/tar b/package/cgo/tar diff --git a/curl/tar b/package/curl/tar diff --git a/dmenu/build b/package/dmenu/build diff --git a/dmenu/tar b/package/dmenu/tar diff --git a/dvtm/config.h b/package/dvtm/config.h diff --git a/dvtm/git b/package/dvtm/git diff --git a/dwm/config.h b/package/dwm/config.h diff --git a/dwm/config.mk b/package/dwm/config.mk diff --git a/dwm/tar b/package/dwm/tar diff --git a/e2fsprogs/build b/package/e2fsprogs/build diff --git a/e2fsprogs/patch.sh b/package/e2fsprogs/patch.sh diff --git a/e2fsprogs/tar b/package/e2fsprogs/tar diff --git a/ed/build b/package/ed/build diff --git a/ed/git b/package/ed/git diff --git a/enchive/build b/package/enchive/build diff --git a/enchive/tar b/package/enchive/tar diff --git a/entr/build b/package/entr/build diff --git a/entr/tar b/package/entr/tar diff --git a/ex-vi/build b/package/ex-vi/build diff --git a/ex-vi/tar b/package/ex-vi/tar diff --git a/ffmpeg/tar b/package/ffmpeg/tar diff --git a/freebsd/git b/package/freebsd/git diff --git a/fw-b43/build b/package/fw-b43/build diff --git a/fw-b43/tar b/package/fw-b43/tar diff --git a/geomyidae/tar b/package/geomyidae/tar diff --git a/git/build b/package/git/build diff --git a/git/tar b/package/git/tar diff --git a/ii/git b/package/ii/git diff --git a/ii/tar b/package/ii/tar diff --git a/iomenu/git b/package/iomenu/git diff --git a/ired/tar b/package/ired/tar diff --git a/jq/tar b/package/jq/tar diff --git a/less/tar b/package/less/tar diff --git a/libbearssl/build b/package/libbearssl/build diff --git a/libbearssl/tar b/package/libbearssl/tar diff --git a/libcurses/git b/package/libcurses/git diff --git a/libixp/tar b/package/libixp/tar diff --git a/liblzma/tar b/package/liblzma/tar diff --git a/libmusl/build b/package/libmusl/build diff --git a/libmusl/tar b/package/libmusl/tar diff --git a/libopus/build b/package/libopus/build diff --git a/libopus/tar b/package/libopus/tar diff --git a/libowfat/tar b/package/libowfat/tar diff --git a/libressl/tar b/package/libressl/tar diff --git a/libsodium/tar b/package/libsodium/tar diff --git a/libtool/tar b/package/libtool/tar diff --git a/libtox/build b/package/libtox/build diff --git a/libtox/tar b/package/libtox/tar diff --git a/libvpx/build b/package/libvpx/build diff --git a/libvpx/tar b/package/libvpx/tar diff --git a/libz/tar b/package/libz/tar diff --git a/linux/build b/package/linux/build diff --git a/linux/crusoe-nopl-emu.patch b/package/linux/crusoe-nopl-emu.patch diff --git a/linux/kconfig.sabotage b/package/linux/kconfig.sabotage diff --git a/linux/patch.sh b/package/linux/patch.sh diff --git a/linux/tar b/package/linux/tar diff --git a/lr/git b/package/lr/git diff --git a/m4/tar b/package/m4/tar diff --git a/man-freebsd/tar b/package/man-freebsd/tar diff --git a/man-linux/tar b/package/man-linux/tar diff --git a/man-openbsd/tar b/package/man-openbsd/tar diff --git a/man-plan9/tar b/package/man-plan9/tar diff --git a/man-posix/build b/package/man-posix/build diff --git a/man-posix/tar b/package/man-posix/tar diff --git a/mandoc/build b/package/mandoc/build diff --git a/mandoc/tar b/package/mandoc/tar diff --git a/mblaze/build b/package/mblaze/build diff --git a/mblaze/tar b/package/mblaze/tar diff --git a/mbsync/build b/package/mbsync/build diff --git a/mbsync/tar b/package/mbsync/tar diff --git a/mg/tar b/package/mg/tar diff --git a/mpop/build b/package/mpop/build diff --git a/mpop/tar b/package/mpop/tar diff --git a/msmtp/build b/package/msmtp/build diff --git a/msmtp/tar b/package/msmtp/tar diff --git a/mupdf/build b/package/mupdf/build diff --git a/mupdf/tar b/package/mupdf/tar diff --git a/nafe/build b/package/nafe/build diff --git a/nafe/tar b/package/nafe/tar diff --git a/ngircd/build b/package/ngircd/build diff --git a/ngircd/tar b/package/ngircd/tar diff --git a/openbsd/git b/package/openbsd/git diff --git a/openssh/build b/package/openssh/build diff --git a/openssh/build.nero b/package/openssh/build.nero diff --git a/openssh/openssh-sys_param.patch b/package/openssh/openssh-sys_param.patch diff --git a/openssh/tar b/package/openssh/tar diff --git a/opentracker/build b/package/opentracker/build diff --git a/opentracker/git b/package/opentracker/git diff --git a/popa3d/tar b/package/popa3d/tar diff --git a/quark/config.h b/package/quark/config.h diff --git a/quark/configure b/package/quark/configure diff --git a/quark/git b/package/quark/git diff --git a/ratox/config.mk b/package/ratox/config.mk diff --git a/ratox/git b/package/ratox/git diff --git a/ratox/tar b/package/ratox/tar diff --git a/reflex/build b/package/reflex/build diff --git a/reflex/tar b/package/reflex/tar diff --git a/retawq/build b/package/retawq/build diff --git a/retawq/tar b/package/retawq/tar diff --git a/rsync/build b/package/rsync/build diff --git a/rsync/rsync-fix-proto.h-tstamp-target.patch b/package/rsync/rsync-fix-proto.h-tstamp-target.patch diff --git a/rsync/tar b/package/rsync/tar diff --git a/runit/build b/package/runit/build diff --git a/runit/tar b/package/runit/tar diff --git a/rwc/build b/package/rwc/build diff --git a/rwc/git b/package/rwc/git diff --git a/sacc/git b/package/sacc/git diff --git a/sam/build b/package/sam/build diff --git a/sam/git b/package/sam/git diff --git a/sbase/git b/package/sbase/git diff --git a/scc/git b/package/scc/git diff --git a/scron/git b/package/scron/git diff --git a/scron/tar b/package/scron/tar diff --git a/sent/tar b/package/sent/tar diff --git a/slock/git b/package/slock/git diff --git a/slstatus/config.h b/package/slstatus/config.h diff --git a/slstatus/git b/package/slstatus/git diff --git a/st/build b/package/st/build diff --git a/st/config.mk b/package/st/config.mk diff --git a/st/st-scrollback-0.7.diff b/package/st/st-scrollback-0.7.diff diff --git a/st/tar b/package/st/tar diff --git a/stunnel/build b/package/stunnel/build diff --git a/stunnel/tar b/package/stunnel/tar diff --git a/syslinux/build b/package/syslinux/build diff --git a/syslinux/patch.sh b/package/syslinux/patch.sh diff --git a/syslinux/tar b/package/syslinux/tar diff --git a/tcpdump/tar b/package/tcpdump/tar diff --git a/tonic-init/build.sh b/package/tonic-init/build.sh diff --git a/tonic-init/init.c b/package/tonic-init/init.c diff --git a/tonic-init/linuxrc b/package/tonic-init/linuxrc diff --git a/tonic-init/rc.init b/package/tonic-init/rc.init diff --git a/tonic-init/rc.shutdown b/package/tonic-init/rc.shutdown diff --git a/unbound/tar b/package/unbound/tar diff --git a/xe/git b/package/xe/git diff --git a/yacc/tar b/package/yacc/tar diff --git a/yasm/tar b/package/yasm/tar diff --git a/services/u9fs b/services/u9fs @@ -0,0 +1 @@ +9fs 564/tcp 9fs # Plan 9 fs diff --git a/sv/.gitignore b/sv/.gitignore @@ -0,0 +1 @@ +**/supervise diff --git a/sv/bot/run b/sv/bot/run @@ -0,0 +1,2 @@ +#!/bin/sh +bot -d diff --git a/sv/git/run b/sv/git/run @@ -0,0 +1,2 @@ +#!/bin/sh +git daemon --base-path="$HOME/var/git" --export-all diff --git a/sv/ii/irc.cyberia.is/run b/sv/ii/irc.cyberia.is/run @@ -0,0 +1,8 @@ +#!/bin/sh +ii -s irc.cyberia.is \ + -i "$HOME/var/irc" \ + -p "${2:-6667}" \ + -n "$NICK" \ + -k PASS \ + -f "$NAME" \ + > "$HOME/var/irc/irc.cyberia.is/log" & diff --git a/sv/ii/irc.epita.rezosup.org/run b/sv/ii/irc.epita.rezosup.org/run @@ -0,0 +1,8 @@ +#!/bin/sh +ii -s irc.epita.rezosup.org \ + -i "$HOME/var/irc" \ + -p "${2:-6667}" \ + -n "$NICK" \ + -k PASS \ + -f "$NAME" \ + > "$HOME/var/irc/irc.epita.rezosup.org/log" diff --git a/sv/ii/irc.freenode.net/run b/sv/ii/irc.freenode.net/run @@ -0,0 +1,8 @@ +#!/bin/sh +exec ii \ + -s irc.freenode.net \ + -i "$HOME/var/irc" \ + -p 6667 \ + -n "$NICK" \ + -k PASS \ + -f "$NAME" diff --git a/sv/ii/irc.nixers.net/run b/sv/ii/irc.nixers.net/run @@ -0,0 +1,8 @@ +#!/bin/sh +ii -s irc.nixers.net \ + -i "$HOME/var/irc" \ + -p 6667 \ + -n "$NICK" \ + -k PASS \ + -f "$NAME" \ + > "$HOME/var/irc/irc.nixers.net/log" & diff --git a/sv/ii/irc.oftc.net/run b/sv/ii/irc.oftc.net/run @@ -0,0 +1,9 @@ +#!/bin/sh +ii \ + -s "$1" \ + -i "$HOME/var/irc" \ + -p "${2:-6667}" \ + -n "$NICK" \ + -k PASS \ + -f "$NAME" \ + > "$HOME/var/irc/$1/log" & diff --git a/sv/monitor/run b/sv/monitor/run @@ -0,0 +1,2 @@ +#!/bin/sh +monitor "$1" diff --git a/sv/ngircd/conf b/sv/ngircd/conf @@ -0,0 +1,123 @@ +[Global] + Name = irc.josuah.net + + ;AdminInfo1 = Description + ;AdminInfo2 = Location + ;AdminEMail = mail@josuah.net + + ;HelpFile = ~/.config/ngircd/Commands.txt + + Info = Personnal IRC server for learning + + ;Listen = 0.0.0.0 + + # setup on ~/etc/ngircd.d/motd + MotdFile = motd + ;MotdPhrase = "Welcome to cyberia.systems" + + Network = cyberia.systems + + ;Password = none + + ;PidFile = /var/run/ngircd/ngircd.pid + + Ports = 6667 + + ;ServerGID = 65534 + ;ServerUID = 65534 + +[Limits] + ;ConnectRetry = 60 + ;IdleTimeout = 0 + + ;MaxConnections = 0 + ;MaxConnectionsIP = 5 + ;MaxJoins = 10 + MaxNickLength = 14 + ;MaxListSize = 100 + + ;PingTimeout = 120 + ;PongTimeout = 20 + +[Options] + AllowedChannelTypes = # + AllowRemoteOper = no + + ;ChrootDir = /var/empty + + ;CloakHost = cloaked.host + ;CloakHostModeX = cloaked.user + ;CloakHostSalt = abcdefghijklmnopqrstuvwxyz + ;CloakUserToNick = yes + + ;ConnectIPv4 = yes + ;ConnectIPv6 = yes + + DefaultUserModes = i + + ;DNS = yes + + ;Ident = yes + + ;IncludeDir = ~/etc/ngircd.d + + MorePrivacy = yes + + ;NoticeBeforeRegistration = no + + ;OperCanUseMode = no + ;OperChanPAutoOp = yes + ;OperServerMode = no + + ;PAM = yes + ;PAMIsOptional = no + ;PAMServiceName = ngircd + + ;RequireAuthPing = no + + ScrubCTCP = yes + + ;SyslogFacility = local1 + + ;WebircPassword = xyz + +;[SSL] + ;CertFile = /home/pi/programs/ngircd/etc/ssl/server-cert.pem + + ;CipherList = HIGH:!aNULL:@STRENGTH:!SSLv3 + + ;DHFile = /home/pi/programs/ngircd/etc/ssl/dhparams.pem + + ;KeyFile = /home/pi/programs/ngircd/etc/ssl/server-key.pem + ;KeyFilePassword = secret + + ;Ports = 6697, 9999 + +[Server] + ;Name = irc2.example.net + ;Host = connect-to-host.example.net + ;Bind = 10.0.0.1 + ;Port = 6667 + + ;MyPassword = MySecret + ;PeerPassword = PeerSecret + + ;Group = 123 + + ;Passive = no + + ;SSLConnect = yes + + ;ServiceMask = *Serv,Global + +[Channel] + ;Name = #TheName + + ;Topic = a great topic + + ;Modes = tnk + + ;Key = Secret + ;KeyFile = /home/pi/programs/ngircd/etc/#chan.key + + ;MaxUsers = 23 diff --git a/sv/ngircd/motd b/sv/ngircd/motd @@ -0,0 +1,10 @@ + __________________ _ + / _______________/ / / irc://cyberia.systems:6667 + / / __ __ / /_ ____ ____ /\ ____ + / / / / / / / __ \ / __ \ /\/___/ /\ ,-'_ / + \ \______\ \ / /__\ \/ /_\ __/_/ /____ / /_/ /_/ /___ + \_________\ \/ /____\__/___\__\__\/_____/_/__\_____\__ \ + \ / ___ ___ _____ ___ ___ \ \ + ________/ / /__ /__/ /__ / /__ /\/\ /__ / / + \________/ ___/ ___/ ___/ / /__ / / / ___/ / / + \/ diff --git a/sv/ngircd/run b/sv/ngircd/run @@ -0,0 +1,2 @@ +#!/bin/sh +ngircd -f "$HOME/etc/ngircd/conf" -n diff --git a/sv/opentracker/run b/sv/opentracker/run @@ -0,0 +1,2 @@ +#!/bin/sh +opentracker -d "$SYSROOT/var/torrent" diff --git a/sv/quark/run b/sv/quark/run @@ -0,0 +1,2 @@ +#!/bin/sh +quark -h 0.0.0.0 -d "$HOME/srv/http" -V diff --git a/sv/ratox/run b/sv/ratox/run @@ -0,0 +1,4 @@ +#!/bin/sh + +cd "$HOME/var/ratox" +exec ratox diff --git a/sv/scron/run b/sv/scron/run @@ -0,0 +1,2 @@ +#!/bin/sh +crond -n -f "$SYSROOT/etc/crontab"