Making of, launch party

This commit is contained in:
Madison Scott-Clary
2020-04-29 23:21:52 -07:00
parent da7c70cb68
commit 65e0560a49
132 changed files with 6824 additions and 0 deletions

21
making-of/LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Madison Scott-Clary
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

59
making-of/Makefile Normal file
View File

@ -0,0 +1,59 @@
.PHONY: help
help: ## This help.
@# This is ugly as hell and I hate awk
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
.PHONY: final
final: reset toc ## full document of the book for final print
@echo
@echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
@echo "!Ensure that the index page breaks are okay!"
@echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
.PHONY: single
single: reset plain ## full document run once, ensuring everything's reset
.PHONY: proof
proof: engage-letter engage-frame engage-draft toc reset ## full proof document of the book with frames and watermark
.PHONY: draft
draft: engage-draft toc reset ## draft document of thebook with watermark
.PHONY: plain
plain: ## full document of the book with no proofing marks
xelatex book.tex
.PHONY: toc
toc: plain ## full book with ToC re-rendering in case of page changes
makeindex book
xelatex book.tex
.PHONY: ebook
ebook: ## render ePub file from LaTeX
pandoc Ebook.tex -o ../ebooks/book.epub -t epub3 --wrap=none
.PHONY: frame
engage-frame: ## turn on frame marking
cp includes/_frame.tex includes/frame.tex
.PHONY: engage-letter
engage-letter: ## force letter paper
echo '\input{includes/_geometry-letter.tex}' > includes/geometry.tex
.PHONY: draft
engage-draft: ## turn on draft watermark
cp includes/_draft.tex includes/draft.tex
.PHONY: reset
reset: ## reset frame marking, draft watermark, and letter paper
echo '%' > includes/draft.tex
echo '%' > includes/frame.tex
echo '\input{includes/_geometry-trade.tex}' > includes/geometry.tex
.PHONY: content
content: ## build the markdown content into LaTeX
for in in src/content/*.md; do \
out=`echo $$in | sed -e 's/\.md/.tex/' | sed -e 's/.*\///'`; \
echo "$$in => $$out"; \
pandoc -f markdown -t latex -o content/$$out $$in --wrap=none --top-level-division=chapter; \
done

57
making-of/README.md Normal file
View File

@ -0,0 +1,57 @@
# LaTeX Book Template
A template for generating a book in LaTeX.
## Requirements
* [`pandoc`][pandoc]
* `xelatex` (included in TeXLive)
* `make`
## Getting started
This repository is a template for generating a trade paperback book. It creates a PDF that one can send to a printer for final production. As an additional feature, it generates a (very basic) EPub3 file to get you started on an ebook version.
To get going with this, copy the files in this repository to where you wish to work, modify the `includes/variables.tex` file to populate the title, author, and other information, add your content, and then run it using the following commands.
## Running
There are several `make` targets available to you, depending on what you want to be generated:
* `make plain` runs `xelatex` once
* `make toc` runs `xelatex` twice. This is needed to regenerate table of contents and references with page numbers.
* `make draft` generates a watermarked file for proofreading
* `make proof` generates a full proofing file with frame and crop marks, a draft watermark, and on letter paper for margins
* `make final` generates a final draft --- this is equivalent to `make toc`, except that it resets all draft stuff that may be left behind.
* `make ebook` generates an EPub3 file. This will be exceedingly plain and not include any graphics, so you'll need to use something like [Calibre][calibre] to generate a final product, but this will get you started.
Additionally, there are a few targets which probably won't be used directly, but may be helpful:
* The `engage-letter` target outputs to letter-size paper from the default trade paperback size. This only controls the paper size, not the layout size, though, so you will get a trade page centered in a letter page.
* The `reset` target resets all switchable options (draft, letter paper, framing/crop marks) to production values.
## Adding content
First things first, modify the `includes/variables.tex` file to contain the proper title, author, and additional information.
You may add content directly in the content directory as `*.tex` files, or you may write in Markdown in the `src/content` directory. If you wish to do this, each file in that directory will be transpiled from Markdown into LaTeX using [pandoc][pandoc]. To generate these files, run `make content`.
You may add assets such as images in the `assets` directory to be included in your content. Note that file paths such as those used in `\includegraphics` should be relative to `book.tex` (that is, don't write `\includegraphics{../assets/stuff.png}`, but instead `\includegraphics{assets/stuff.png}`).
Once you have your content in your files modify `book.tex` to include each file in `content` with `\input{}` commands. The file in this repository includes example includes, and you'll probably want to remove those.
You'll likely want to edit `includes/copyright.tex` to match your needs.
## Customization
The output of this template is deliberately bland, and is intended to be customaized.
* Customize final page and layout size in `includes/_geometry-trade.tex`. This includes sensible defaults for margins and such already.
* Customize fonts in `includes/font.tex`
* Add hyphenation rules to `includes/hyphenation.tex`
* Customize page layout (header, footer, etc) in `includes/pagelayout.tex`
* Set a custom section divider in `includes/secdiv.tex`. This redefines the `\rule` command to be something more appealing. This is optional, though, and the `\input{includes/secdiv}` command in `book.tex` can be removed to restore defaults.
* Customize your title and pretitle pages in `includes/title.tex` and `includes/pretitle.tex`
[pandoc]: https://pandoc.org
[calibre]: https://calibre-ebook.com/

0
making-of/assets/.keep Normal file
View File

BIN
making-of/assets/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

24
making-of/assets/3.svg Normal file
View File

@ -0,0 +1,24 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="350"
height="350">
<style>
* {
fill: none;
stroke: black;
stroke-width: 5px;
}
</style>
<rect x="0" y="0" width="350" height="350" />
<path d="
M 100 50
q -30 75 50 250
L 50 50
l 0 250
q 100 -250 250 -250
s -150 0 -150 125
s 175 125 175 0
s -125 -75 -125 0
s 125 5 125 0
l -275 0" />
</svg>

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

149
making-of/assets/isbn.eps Normal file
View File

@ -0,0 +1,149 @@
%!PS-Adobe-2.0 EPSF-1.2
%%Creator: bookland 1.4
%%Title: ISBN 9781948743150
%%BoundingBox: 215 335 376 432
%%EndComments
% Command line: bookland -o /usr/share/nginx/www/converter/ISBN/downloads/f86f9eac90cc461487ff880f6aee71c151c67c02/isbn.eps 9781948743150 53500
% This is free software and comes with NO WARRANTY WHATSOVER. This file
% contains portions of bookland, a free program licensed under the GNU
% General Public License. The GPL notwithstanding, you may use and
% redistribute this output file without restriction.
/W { moduleWidth mul 0 rmoveto } def
/B { dup moduleWidth mul 2 div 0 rmoveto
dup moduleWidth mul barWidthReduction sub setlinewidth
0 moduleHeight rlineto 0 moduleHeight neg rmoveto
currentpoint stroke moveto
moduleWidth mul 2 div 0 rmoveto } def
/L { dup moduleWidth mul 2 div 0 rmoveto
dup moduleWidth mul barWidthReduction sub setlinewidth
0 -5 rmoveto 0 5 rlineto
0 moduleHeight rlineto 0 moduleHeight neg rmoveto
currentpoint stroke moveto
moduleWidth mul 2 div 0 rmoveto } def
% function fitstring:
% usage: width string font fitstring
% scale font to fit string to desired width
% leave string on stack
/fitstring { dup findfont 1 scalefont setfont % w s f
3 1 roll % f w s
dup stringwidth pop % f w s sw
3 2 roll exch div % f s x
3 2 roll findfont exch
scalefont setfont } def
% get bounding box of string.
% usage: string stringbb -> llx lly urx ury
/stringbb {gsave false charpath flattenpath pathbbox grestore} def
% String height and width:
/stringhw {stringbb exch % llx lly ury urx
4 1 roll % urx llx lly ury
sub neg % urx llx h
3 1 roll % h urx llx
sub % h w
} def
/dx { [ 0 1 2 0 1 2 0 1 2 ] } def
/dy { [ 0 0 0 1 1 1 2 2 2 ] } def
% Set dx and dy to shift to anchor point:
/dxdy { dup dx exch % anchor dx anchor
get % anchor idx
dy % anchor idx dy
3 2 roll % idx dy anchor
get % idx idy
} def
% Usage: string anchor anchorstring
/anchorstring { dxdy % string idx idy
3 2 roll % idx idy string
dup % idx idy string string
4 1 roll % string idx idy string
stringhw % string idx idy h w
4 1 roll % string w idx idy h
mul -2 div % string w idx ry
3 1 roll % string ry w idx
mul -2 div % string ry rx
exch
rmoveto show } def
225.5 347.5 translate 0 0 moveto
0 0 0 1 setcmykcolor
%
% Text string
%
gsave 65.52 -1 translate 0 0 moveto
36.6912 (781948) /OCRB fitstring
(743150) 7 anchorstring
grestore
%
% Text string
%
gsave 22.464 -1 translate 0 0 moveto
36.6912 (781948) /OCRB fitstring
(781948) 7 anchorstring
grestore
%
% Text string
%
gsave -2 -1 translate 0 0 moveto
36.6912 (781948) /OCRB fitstring
(9) 8 anchorstring
grestore
%
% Product Code Bars
%
gsave
0 0 translate 0 0 moveto
/moduleHeight { 72 } def
/moduleWidth { 0.936 } def
/barWidthReduction { 0 } def
1 L 1 W 1 L 1 W 3 B 1 W 2 B 3 W 1 B 2 W 1 B 1 W 2 B 2 W 2 B 3 W 1 B 1 W 2 B 2 W 3 B 1 W 1 B 1 W 2 B 1 W 3 B 1 W 1 L 1 W 1 L 1 W 1 B 3 W 1 B 2 W 1 B 1 W 3 B 2 W 1 B 4 W 1 B 1 W 2 B 2 W 2 B 1 W 1 B 2 W 3 B 1 W 3 B 2 W 1 B 1 W 1 L 1 W 1 L
grestore
%
% Text string
%
gsave 88.92 0 translate 0 0 moveto
36.6912 (781948) /OCRB fitstring
( ) 0 anchorstring
grestore
%
% Text string
%
gsave 44.46 74 translate 0 0 moveto
/OCRB findfont 9 scalefont setfont
(ISBN 9781948743150) 1 anchorstring
grestore
%
% Product Code Bars
%
gsave
98 0 translate 0 0 moveto
/moduleHeight { 61.344 } def
/moduleWidth { 0.936 } def
/barWidthReduction { 0 } def
1 B 1 W 2 B 1 W 2 B 3 W 1 B 1 W 1 B 1 W 1 B 4 W 1 B 1 W 1 B 1 W 2 B 3 W 1 B 1 W 1 B 1 W 1 B 2 W 3 B 1 W 1 B 3 W 2 B 1 W 1 B
grestore
%
% Text string
%
gsave 119.996 63.344 translate 0 0 moveto
32.994 (53500) /OCRB fitstring
(53500) 1 anchorstring
grestore
%
% Text string
%
gsave 142.992 63.344 translate 0 0 moveto
32.994 (53500) /OCRB fitstring
(>) 0 anchorstring
grestore
stroke
% showpage OK in EPS
showpage
% Good luck!

BIN
making-of/assets/isbn.pdf Normal file

Binary file not shown.

BIN
making-of/assets/isbn.zip Normal file

Binary file not shown.

BIN
making-of/assets/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="400" viewport="0 0 800 400" style="font-family: 'Gentium Book Basic', serif;">
<circle cx="225" cy="200" r="198" style="stroke-width: 2px; stroke: #222; fill: none;" />
<circle cx="575" cy="200" r="198" style="stroke-width: 2px; stroke: #222; fill: none;" />
<text x="225" y="200" text-anchor="middle" vertical-baseline="center">Healthy</text>
<text x="575" y="200" text-anchor="middle" vertical-baseline="center">Mechanically sound</text>
</svg>

After

Width:  |  Height:  |  Size: 545 B

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,60 @@
"use strict";var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a},notReady:function(a){this.toString=function(){return"NOT READY: "+this.message};this.message=a}}};
sjcl.cipher.aes=function(a){this.s[0][0][0]||this.O();var b,c,d,e,f=this.s[0][4],g=this.s[1];b=a.length;var h=1;if(4!==b&&6!==b&&8!==b)throw new sjcl.exception.invalid("invalid aes key size");this.b=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(0===a%b||8===b&&4===a%b)c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255],0===a%b&&(c=c<<8^c>>>24^h<<24,h=h<<1^283*(h>>7));d[a]=d[a-b]^c}for(b=0;a;b++,a--)c=d[b&3?a:a-4],e[b]=4>=a||4>b?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^g[3][f[c&
255]]};
sjcl.cipher.aes.prototype={encrypt:function(a){return t(this,a,0)},decrypt:function(a){return t(this,a,1)},s:[[[],[],[],[],[]],[[],[],[],[],[]]],O:function(){var a=this.s[0],b=this.s[1],c=a[4],d=b[4],e,f,g,h=[],k=[],l,n,m,p;for(e=0;0x100>e;e++)k[(h[e]=e<<1^283*(e>>7))^e]=e;for(f=g=0;!c[f];f^=l||1,g=k[g]||1)for(m=g^g<<1^g<<2^g<<3^g<<4,m=m>>8^m&255^99,c[f]=m,d[m]=f,n=h[e=h[l=h[f]]],p=0x1010101*n^0x10001*e^0x101*l^0x1010100*f,n=0x101*h[m]^0x1010100*m,e=0;4>e;e++)a[e][f]=n=n<<24^n>>>8,b[e][m]=p=p<<24^p>>>8;for(e=
0;5>e;e++)a[e]=a[e].slice(0),b[e]=b[e].slice(0)}};
function t(a,b,c){if(4!==b.length)throw new sjcl.exception.invalid("invalid aes block size");var d=a.b[c],e=b[0]^d[0],f=b[c?3:1]^d[1],g=b[2]^d[2];b=b[c?1:3]^d[3];var h,k,l,n=d.length/4-2,m,p=4,r=[0,0,0,0];h=a.s[c];a=h[0];var q=h[1],v=h[2],w=h[3],x=h[4];for(m=0;m<n;m++)h=a[e>>>24]^q[f>>16&255]^v[g>>8&255]^w[b&255]^d[p],k=a[f>>>24]^q[g>>16&255]^v[b>>8&255]^w[e&255]^d[p+1],l=a[g>>>24]^q[b>>16&255]^v[e>>8&255]^w[f&255]^d[p+2],b=a[b>>>24]^q[e>>16&255]^v[f>>8&255]^w[g&255]^d[p+3],p+=4,e=h,f=k,g=l;for(m=
0;4>m;m++)r[c?3&-m:m]=x[e>>>24]<<24^x[f>>16&255]<<16^x[g>>8&255]<<8^x[b&255]^d[p++],h=e,e=f,f=g,g=b,b=h;return r}
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.$(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.$(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0===
b?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b=b&31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0===
c},$:function(a,b,c,d){var e;e=0;for(void 0===d&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},i:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]},byteswapM:function(a){var b,c;for(b=0;b<a.length;++b)c=a[b],a[b]=c>>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}};
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++)0===(d&3)&&(e=a[d/4]),b+=String.fromCharCode(e>>>24),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++)d=d<<8|a.charCodeAt(c),3===(c&3)&&(b.push(d),d=0);c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a=a+"00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,4*d)}};
sjcl.codec.base32={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",X:"0123456789ABCDEFGHIJKLMNOPQRSTUV",BITS:32,BASE:5,REMAINING:27,fromBits:function(a,b,c){var d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f="",g=0,h=sjcl.codec.base32.B,k=0,l=sjcl.bitArray.bitLength(a);c&&(h=sjcl.codec.base32.X);for(c=0;f.length*d<l;)f+=h.charAt((k^a[c]>>>g)>>>e),g<d?(k=a[c]<<d-g,g+=e,c++):(k<<=d,g-=d);for(;f.length&7&&!b;)f+="=";return f},toBits:function(a,b){a=a.replace(/\s|=/g,"").toUpperCase();var c=sjcl.codec.base32.BITS,
d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f=[],g,h=0,k=sjcl.codec.base32.B,l=0,n,m="base32";b&&(k=sjcl.codec.base32.X,m="base32hex");for(g=0;g<a.length;g++){n=k.indexOf(a.charAt(g));if(0>n){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}throw new sjcl.exception.invalid("this isn't "+m+"!");}h>e?(h-=e,f.push(l^n>>>h),l=n<<c-h):(h+=d,l^=n<<c-h)}h&56&&f.push(sjcl.bitArray.partial(h&56,l,1));return f}};
sjcl.codec.base32hex={fromBits:function(a,b){return sjcl.codec.base32.fromBits(a,b,1)},toBits:function(a){return sjcl.codec.base32.toBits(a,1)}};
sjcl.codec.base64={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b,c){var d="",e=0,f=sjcl.codec.base64.B,g=0,h=sjcl.bitArray.bitLength(a);c&&(f=f.substr(0,62)+"-_");for(c=0;6*d.length<h;)d+=f.charAt((g^a[c]>>>e)>>>26),6>e?(g=a[c]<<6-e,e+=26,c++):(g<<=6,e-=6);for(;d.length&3&&!b;)d+="=";return d},toBits:function(a,b){a=a.replace(/\s|=/g,"");var c=[],d,e=0,f=sjcl.codec.base64.B,g=0,h;b&&(f=f.substr(0,62)+"-_");for(d=0;d<a.length;d++){h=f.indexOf(a.charAt(d));
if(0>h)throw new sjcl.exception.invalid("this isn't base64!");26<e?(e-=26,c.push(g^h>>>e),g=h<<32-e):(e+=6,g^=h<<32-e)}e&56&&c.push(sjcl.bitArray.partial(e&56,g,1));return c}};sjcl.codec.base64url={fromBits:function(a){return sjcl.codec.base64.fromBits(a,1,1)},toBits:function(a){return sjcl.codec.base64.toBits(a,1)}};sjcl.hash.sha256=function(a){this.b[0]||this.O();a?(this.F=a.F.slice(0),this.A=a.A.slice(0),this.l=a.l):this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.F=this.Y.slice(0);this.A=[];this.l=0;return this},update:function(a){"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));var b,c=this.A=sjcl.bitArray.concat(this.A,a);b=this.l;a=this.l=b+sjcl.bitArray.bitLength(a);if(0x1fffffffffffff<a)throw new sjcl.exception.invalid("Cannot hash more than 2^53 - 1 bits");if("undefined"!==typeof Uint32Array){var d=new Uint32Array(c),e=0;for(b=512+b-(512+b&0x1ff);b<=a;b+=512)u(this,d.subarray(16*e,
16*(e+1))),e+=1;c.splice(0,16*e)}else for(b=512+b-(512+b&0x1ff);b<=a;b+=512)u(this,c.splice(0,16));return this},finalize:function(){var a,b=this.A,c=this.F,b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.l/0x100000000));for(b.push(this.l|0);b.length;)u(this,b.splice(0,16));this.reset();return c},Y:[],b:[],O:function(){function a(a){return 0x100000000*(a-Math.floor(a))|0}for(var b=0,c=2,d,e;64>b;c++){e=!0;for(d=2;d*d<=c;d++)if(0===c%d){e=
!1;break}e&&(8>b&&(this.Y[b]=a(Math.pow(c,.5))),this.b[b]=a(Math.pow(c,1/3)),b++)}}};
function u(a,b){var c,d,e,f=a.F,g=a.b,h=f[0],k=f[1],l=f[2],n=f[3],m=f[4],p=f[5],r=f[6],q=f[7];for(c=0;64>c;c++)16>c?d=b[c]:(d=b[c+1&15],e=b[c+14&15],d=b[c&15]=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+b[c&15]+b[c+9&15]|0),d=d+q+(m>>>6^m>>>11^m>>>25^m<<26^m<<21^m<<7)+(r^m&(p^r))+g[c],q=r,r=p,p=m,m=n+d|0,n=l,l=k,k=h,h=d+(k&l^n&(k^l))+(k>>>2^k>>>13^k>>>22^k<<30^k<<19^k<<10)|0;f[0]=f[0]+h|0;f[1]=f[1]+k|0;f[2]=f[2]+l|0;f[3]=f[3]+n|0;f[4]=f[4]+m|0;f[5]=f[5]+p|0;f[6]=f[6]+r|0;f[7]=
f[7]+q|0}
sjcl.mode.ccm={name:"ccm",G:[],listenProgress:function(a){sjcl.mode.ccm.G.push(a)},unListenProgress:function(a){a=sjcl.mode.ccm.G.indexOf(a);-1<a&&sjcl.mode.ccm.G.splice(a,1)},fa:function(a){var b=sjcl.mode.ccm.G.slice(),c;for(c=0;c<b.length;c+=1)b[c](a)},encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,k=h.bitLength(c)/8,l=h.bitLength(g)/8;e=e||64;d=d||[];if(7>k)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;4>f&&l>>>8*f;f++);f<15-k&&(f=15-k);c=h.clamp(c,
8*(15-f));b=sjcl.mode.ccm.V(a,b,c,d,e,f);g=sjcl.mode.ccm.C(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),k=f.clamp(b,h-e),l=f.bitSlice(b,h-e),h=(h-e)/8;if(7>g)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;4>b&&h>>>8*b;b++);b<15-g&&(b=15-g);c=f.clamp(c,8*(15-b));k=sjcl.mode.ccm.C(a,k,c,l,e,b);a=sjcl.mode.ccm.V(a,k.data,c,d,e,b);if(!f.equal(k.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match");
return k.data},na:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,k=h.i;d=[h.partial(8,(b.length?64:0)|d-2<<2|f-1)];d=h.concat(d,c);d[3]|=e;d=a.encrypt(d);if(b.length)for(c=h.bitLength(b)/8,65279>=c?g=[h.partial(16,c)]:0xffffffff>=c&&(g=h.concat([h.partial(16,65534)],[c])),g=h.concat(g,b),b=0;b<g.length;b+=4)d=a.encrypt(k(d,g.slice(b,b+4).concat([0,0,0])));return d},V:function(a,b,c,d,e,f){var g=sjcl.bitArray,h=g.i;e/=8;if(e%2||4>e||16<e)throw new sjcl.exception.invalid("ccm: invalid tag length");
if(0xffffffff<d.length||0xffffffff<b.length)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");c=sjcl.mode.ccm.na(a,d,c,e,g.bitLength(b)/8,f);for(d=0;d<b.length;d+=4)c=a.encrypt(h(c,b.slice(d,d+4).concat([0,0,0])));return g.clamp(c,8*e)},C:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.i;var k=b.length,l=h.bitLength(b),n=k/50,m=n;c=h.concat([h.partial(8,f-1)],c).concat([0,0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!k)return{tag:d,data:[]};for(g=0;g<k;g+=4)g>n&&(sjcl.mode.ccm.fa(g/
k),n+=m),c[3]++,e=a.encrypt(c),b[g]^=e[0],b[g+1]^=e[1],b[g+2]^=e[2],b[g+3]^=e[3];return{tag:d,data:h.clamp(b,l)}}};
sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.S,k=sjcl.bitArray,l=k.i,n=[0,0,0,0];c=h(a.encrypt(c));var m,p=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4)m=b.slice(g,g+4),n=l(n,m),p=p.concat(l(c,a.encrypt(l(c,m)))),c=h(c);m=b.slice(g);b=k.bitLength(m);g=a.encrypt(l(c,[0,0,0,b]));m=k.clamp(l(m.concat([0,0,0]),g),b);n=l(n,l(m.concat([0,0,0]),g));n=a.encrypt(l(n,l(c,h(c))));
d.length&&(n=l(n,f?d:sjcl.mode.ocb2.pmac(a,d)));return p.concat(k.concat(m,k.clamp(n,e)))},decrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var g=sjcl.mode.ocb2.S,h=sjcl.bitArray,k=h.i,l=[0,0,0,0],n=g(a.encrypt(c)),m,p,r=sjcl.bitArray.bitLength(b)-e,q=[];d=d||[];for(c=0;c+4<r/32;c+=4)m=k(n,a.decrypt(k(n,b.slice(c,c+4)))),l=k(l,m),q=q.concat(m),n=g(n);p=r-32*c;m=a.encrypt(k(n,[0,0,0,p]));m=k(m,h.clamp(b.slice(c),p).concat([0,
0,0]));l=k(l,m);l=a.encrypt(k(l,k(n,g(n))));d.length&&(l=k(l,f?d:sjcl.mode.ocb2.pmac(a,d)));if(!h.equal(h.clamp(l,e),h.bitSlice(b,r)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return q.concat(h.clamp(m,p))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.S,e=sjcl.bitArray,f=e.i,g=[0,0,0,0],h=a.encrypt([0,0,0,0]),h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4)h=d(h),g=f(g,a.encrypt(f(h,b.slice(c,c+4))));c=b.slice(c);128>e.bitLength(c)&&(h=f(h,d(h)),c=e.concat(c,[-2147483648,0,0,0]));g=f(g,c);
return a.encrypt(f(d(f(h,d(h))),g))},S:function(a){return[a[0]<<1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^135*(a[0]>>>31)]}};
sjcl.mode.gcm={name:"gcm",encrypt:function(a,b,c,d,e){var f=b.slice(0);b=sjcl.bitArray;d=d||[];a=sjcl.mode.gcm.C(!0,a,f,d,c,e||128);return b.concat(a.data,a.tag)},decrypt:function(a,b,c,d,e){var f=b.slice(0),g=sjcl.bitArray,h=g.bitLength(f);e=e||128;d=d||[];e<=h?(b=g.bitSlice(f,h-e),f=g.bitSlice(f,0,h-e)):(b=f,f=[]);a=sjcl.mode.gcm.C(!1,a,f,d,c,e);if(!g.equal(a.tag,b))throw new sjcl.exception.corrupt("gcm: tag doesn't match");return a.data},ka:function(a,b){var c,d,e,f,g,h=sjcl.bitArray.i;e=[0,0,
0,0];f=b.slice(0);for(c=0;128>c;c++){(d=0!==(a[Math.floor(c/32)]&1<<31-c%32))&&(e=h(e,f));g=0!==(f[3]&1);for(d=3;0<d;d--)f[d]=f[d]>>>1|(f[d-1]&1)<<31;f[0]>>>=1;g&&(f[0]^=-0x1f000000)}return e},j:function(a,b,c){var d,e=c.length;b=b.slice(0);for(d=0;d<e;d+=4)b[0]^=0xffffffff&c[d],b[1]^=0xffffffff&c[d+1],b[2]^=0xffffffff&c[d+2],b[3]^=0xffffffff&c[d+3],b=sjcl.mode.gcm.ka(b,a);return b},C:function(a,b,c,d,e,f){var g,h,k,l,n,m,p,r,q=sjcl.bitArray;m=c.length;p=q.bitLength(c);r=q.bitLength(d);h=q.bitLength(e);
g=b.encrypt([0,0,0,0]);96===h?(e=e.slice(0),e=q.concat(e,[1])):(e=sjcl.mode.gcm.j(g,[0,0,0,0],e),e=sjcl.mode.gcm.j(g,e,[0,0,Math.floor(h/0x100000000),h&0xffffffff]));h=sjcl.mode.gcm.j(g,[0,0,0,0],d);n=e.slice(0);d=h.slice(0);a||(d=sjcl.mode.gcm.j(g,h,c));for(l=0;l<m;l+=4)n[3]++,k=b.encrypt(n),c[l]^=k[0],c[l+1]^=k[1],c[l+2]^=k[2],c[l+3]^=k[3];c=q.clamp(c,p);a&&(d=sjcl.mode.gcm.j(g,h,c));a=[Math.floor(r/0x100000000),r&0xffffffff,Math.floor(p/0x100000000),p&0xffffffff];d=sjcl.mode.gcm.j(g,d,a);k=b.encrypt(e);
d[0]^=k[0];d[1]^=k[1];d[2]^=k[2];d[3]^=k[3];return{tag:q.bitSlice(d,0,f),data:c}}};sjcl.misc.hmac=function(a,b){this.W=b=b||sjcl.hash.sha256;var c=[[],[]],d,e=b.prototype.blockSize/32;this.w=[new b,new b];a.length>e&&(a=b.hash(a));for(d=0;d<e;d++)c[0][d]=a[d]^909522486,c[1][d]=a[d]^1549556828;this.w[0].update(c[0]);this.w[1].update(c[1]);this.R=new b(this.w[0])};
sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a){if(this.aa)throw new sjcl.exception.invalid("encrypt on already updated hmac called!");this.update(a);return this.digest(a)};sjcl.misc.hmac.prototype.reset=function(){this.R=new this.W(this.w[0]);this.aa=!1};sjcl.misc.hmac.prototype.update=function(a){this.aa=!0;this.R.update(a)};sjcl.misc.hmac.prototype.digest=function(){var a=this.R.finalize(),a=(new this.W(this.w[1])).update(a).finalize();this.reset();return a};
sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E4;if(0>d||0>c)throw new sjcl.exception.invalid("invalid params to pbkdf2");"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,k,l=[],n=sjcl.bitArray;for(k=1;32*l.length<(d||1);k++){e=f=a.encrypt(n.concat(b,[k]));for(g=1;g<c;g++)for(f=a.encrypt(f),h=0;h<f.length;h++)e[h]^=f[h];l=l.concat(e)}d&&(l=n.clamp(l,d));return l};
sjcl.prng=function(a){this.c=[new sjcl.hash.sha256];this.m=[0];this.P=0;this.H={};this.N=0;this.U={};this.Z=this.f=this.o=this.ha=0;this.b=[0,0,0,0,0,0,0,0];this.h=[0,0,0,0];this.L=void 0;this.M=a;this.D=!1;this.K={progress:{},seeded:{}};this.u=this.ga=0;this.I=1;this.J=2;this.ca=0x10000;this.T=[0,48,64,96,128,192,0x100,384,512,768,1024];this.da=3E4;this.ba=80};
sjcl.prng.prototype={randomWords:function(a,b){var c=[],d;d=this.isReady(b);var e;if(d===this.u)throw new sjcl.exception.notReady("generator isn't seeded");if(d&this.J){d=!(d&this.I);e=[];var f=0,g;this.Z=e[0]=(new Date).valueOf()+this.da;for(g=0;16>g;g++)e.push(0x100000000*Math.random()|0);for(g=0;g<this.c.length&&(e=e.concat(this.c[g].finalize()),f+=this.m[g],this.m[g]=0,d||!(this.P&1<<g));g++);this.P>=1<<this.c.length&&(this.c.push(new sjcl.hash.sha256),this.m.push(0));this.f-=f;f>this.o&&(this.o=
f);this.P++;this.b=sjcl.hash.sha256.hash(this.b.concat(e));this.L=new sjcl.cipher.aes(this.b);for(d=0;4>d&&(this.h[d]=this.h[d]+1|0,!this.h[d]);d++);}for(d=0;d<a;d+=4)0===(d+1)%this.ca&&y(this),e=z(this),c.push(e[0],e[1],e[2],e[3]);y(this);return c.slice(0,a)},setDefaultParanoia:function(a,b){if(0===a&&"Setting paranoia=0 will ruin your security; use it only for testing"!==b)throw new sjcl.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing");this.M=a},addEntropy:function(a,
b,c){c=c||"user";var d,e,f=(new Date).valueOf(),g=this.H[c],h=this.isReady(),k=0;d=this.U[c];void 0===d&&(d=this.U[c]=this.ha++);void 0===g&&(g=this.H[c]=0);this.H[c]=(this.H[c]+1)%this.c.length;switch(typeof a){case "number":void 0===b&&(b=1);this.c[g].update([d,this.N++,1,b,f,1,a|0]);break;case "object":c=Object.prototype.toString.call(a);if("[object Uint32Array]"===c){e=[];for(c=0;c<a.length;c++)e.push(a[c]);a=e}else for("[object Array]"!==c&&(k=1),c=0;c<a.length&&!k;c++)"number"!==typeof a[c]&&
(k=1);if(!k){if(void 0===b)for(c=b=0;c<a.length;c++)for(e=a[c];0<e;)b++,e=e>>>1;this.c[g].update([d,this.N++,2,b,f,a.length].concat(a))}break;case "string":void 0===b&&(b=a.length);this.c[g].update([d,this.N++,3,b,f,a.length]);this.c[g].update(a);break;default:k=1}if(k)throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string");this.m[g]+=b;this.f+=b;h===this.u&&(this.isReady()!==this.u&&A("seeded",Math.max(this.o,this.f)),A("progress",this.getProgress()))},
isReady:function(a){a=this.T[void 0!==a?a:this.M];return this.o&&this.o>=a?this.m[0]>this.ba&&(new Date).valueOf()>this.Z?this.J|this.I:this.I:this.f>=a?this.J|this.u:this.u},getProgress:function(a){a=this.T[a?a:this.M];return this.o>=a?1:this.f>a?1:this.f/a},startCollectors:function(){if(!this.D){this.a={loadTimeCollector:B(this,this.ma),mouseCollector:B(this,this.oa),keyboardCollector:B(this,this.la),accelerometerCollector:B(this,this.ea),touchCollector:B(this,this.qa)};if(window.addEventListener)window.addEventListener("load",
this.a.loadTimeCollector,!1),window.addEventListener("mousemove",this.a.mouseCollector,!1),window.addEventListener("keypress",this.a.keyboardCollector,!1),window.addEventListener("devicemotion",this.a.accelerometerCollector,!1),window.addEventListener("touchmove",this.a.touchCollector,!1);else if(document.attachEvent)document.attachEvent("onload",this.a.loadTimeCollector),document.attachEvent("onmousemove",this.a.mouseCollector),document.attachEvent("keypress",this.a.keyboardCollector);else throw new sjcl.exception.bug("can't attach event");
this.D=!0}},stopCollectors:function(){this.D&&(window.removeEventListener?(window.removeEventListener("load",this.a.loadTimeCollector,!1),window.removeEventListener("mousemove",this.a.mouseCollector,!1),window.removeEventListener("keypress",this.a.keyboardCollector,!1),window.removeEventListener("devicemotion",this.a.accelerometerCollector,!1),window.removeEventListener("touchmove",this.a.touchCollector,!1)):document.detachEvent&&(document.detachEvent("onload",this.a.loadTimeCollector),document.detachEvent("onmousemove",
this.a.mouseCollector),document.detachEvent("keypress",this.a.keyboardCollector)),this.D=!1)},addEventListener:function(a,b){this.K[a][this.ga++]=b},removeEventListener:function(a,b){var c,d,e=this.K[a],f=[];for(d in e)e.hasOwnProperty(d)&&e[d]===b&&f.push(d);for(c=0;c<f.length;c++)d=f[c],delete e[d]},la:function(){C(this,1)},oa:function(a){var b,c;try{b=a.x||a.clientX||a.offsetX||0,c=a.y||a.clientY||a.offsetY||0}catch(d){c=b=0}0!=b&&0!=c&&this.addEntropy([b,c],2,"mouse");C(this,0)},qa:function(a){a=
a.touches[0]||a.changedTouches[0];this.addEntropy([a.pageX||a.clientX,a.pageY||a.clientY],1,"touch");C(this,0)},ma:function(){C(this,2)},ea:function(a){a=a.accelerationIncludingGravity.x||a.accelerationIncludingGravity.y||a.accelerationIncludingGravity.z;if(window.orientation){var b=window.orientation;"number"===typeof b&&this.addEntropy(b,1,"accelerometer")}a&&this.addEntropy(a,2,"accelerometer");C(this,0)}};
function A(a,b){var c,d=sjcl.random.K[a],e=[];for(c in d)d.hasOwnProperty(c)&&e.push(d[c]);for(c=0;c<e.length;c++)e[c](b)}function C(a,b){"undefined"!==typeof window&&window.performance&&"function"===typeof window.performance.now?a.addEntropy(window.performance.now(),b,"loadtime"):a.addEntropy((new Date).valueOf(),b,"loadtime")}function y(a){a.b=z(a).concat(z(a));a.L=new sjcl.cipher.aes(a.b)}function z(a){for(var b=0;4>b&&(a.h[b]=a.h[b]+1|0,!a.h[b]);b++);return a.L.encrypt(a.h)}
function B(a,b){return function(){b.apply(a,arguments)}}sjcl.random=new sjcl.prng(6);
a:try{var D,E,F,G;if(G="undefined"!==typeof module&&module.exports){var H;try{H=require("crypto")}catch(a){H=null}G=E=H}if(G&&E.randomBytes)D=E.randomBytes(128),D=new Uint32Array((new Uint8Array(D)).buffer),sjcl.random.addEntropy(D,1024,"crypto['randomBytes']");else if("undefined"!==typeof window&&"undefined"!==typeof Uint32Array){F=new Uint32Array(32);if(window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(F);else if(window.msCrypto&&window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(F);
else break a;sjcl.random.addEntropy(F,1024,"crypto['getRandomValues']")}}catch(a){"undefined"!==typeof window&&window.console&&(console.log("There was an error collecting entropy from the browser:"),console.log(a))}
sjcl.json={defaults:{v:1,iter:1E4,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},ja:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.g({iv:sjcl.random.randomWords(4,0)},e.defaults),g;e.g(f,c);c=f.adata;"string"===typeof f.salt&&(f.salt=sjcl.codec.base64.toBits(f.salt));"string"===typeof f.iv&&(f.iv=sjcl.codec.base64.toBits(f.iv));if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||"string"===typeof a&&100>=f.iter||64!==f.ts&&96!==f.ts&&128!==f.ts||128!==f.ks&&192!==f.ks&&0x100!==f.ks||2>f.iv.length||
4<f.iv.length)throw new sjcl.exception.invalid("json encrypt: invalid parameters");"string"===typeof a?(g=sjcl.misc.cachedPbkdf2(a,f),a=g.key.slice(0,f.ks/32),f.salt=g.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.publicKey&&(g=a.kem(),f.kemtag=g.tag,a=g.key.slice(0,f.ks/32));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));"string"===typeof c&&(f.adata=c=sjcl.codec.utf8String.toBits(c));g=new sjcl.cipher[f.cipher](a);e.g(d,f);d.key=a;f.ct="ccm"===f.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&
b instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.encrypt(g,b,f.iv,c,f.ts):sjcl.mode[f.mode].encrypt(g,b,f.iv,c,f.ts);return f},encrypt:function(a,b,c,d){var e=sjcl.json,f=e.ja.apply(e,arguments);return e.encode(f)},ia:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.g(e.g(e.g({},e.defaults),b),c,!0);var f,g;f=b.adata;"string"===typeof b.salt&&(b.salt=sjcl.codec.base64.toBits(b.salt));"string"===typeof b.iv&&(b.iv=sjcl.codec.base64.toBits(b.iv));if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||"string"===
typeof a&&100>=b.iter||64!==b.ts&&96!==b.ts&&128!==b.ts||128!==b.ks&&192!==b.ks&&0x100!==b.ks||!b.iv||2>b.iv.length||4<b.iv.length)throw new sjcl.exception.invalid("json decrypt: invalid parameters");"string"===typeof a?(g=sjcl.misc.cachedPbkdf2(a,b),a=g.key.slice(0,b.ks/32),b.salt=g.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.secretKey&&(a=a.unkem(sjcl.codec.base64.toBits(b.kemtag)).slice(0,b.ks/32));"string"===typeof f&&(f=sjcl.codec.utf8String.toBits(f));g=new sjcl.cipher[b.cipher](a);f="ccm"===
b.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&b.ct instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.decrypt(g,b.ct,b.iv,b.tag,f,b.ts):sjcl.mode[b.mode].decrypt(g,b.ct,b.iv,f,b.ts);e.g(d,b);d.key=a;return 1===c.raw?f:sjcl.codec.utf8String.fromBits(f)},decrypt:function(a,b,c,d){var e=sjcl.json;return e.ia(a,e.decode(b),c,d)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+'"'+
b+'":';d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],0)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");
null!=d[3]?b[d[2]]=parseInt(d[3],10):null!=d[4]?b[d[2]]=d[2].match(/^(ct|adata|salt|iv)$/)?sjcl.codec.base64.toBits(d[4]):unescape(d[4]):null!=d[5]&&(b[d[2]]="true"===d[5])}return b},g:function(a,b,c){void 0===a&&(a={});if(void 0===b)return a;for(var d in b)if(b.hasOwnProperty(d)){if(c&&void 0!==a[d]&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},sa:function(a,b){var c={},d;for(d in a)a.hasOwnProperty(d)&&a[d]!==b[d]&&(c[d]=a[d]);return c},ra:function(a,
b){var c={},d;for(d=0;d<b.length;d++)void 0!==a[b[d]]&&(c[b[d]]=a[b[d]]);return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.pa={};sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.pa,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=void 0===b.salt?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};
"undefined"!==typeof module&&module.exports&&(module.exports=sjcl);"function"===typeof define&&define([],function(){return sjcl});

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 757 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 KiB

View File

@ -0,0 +1,478 @@
digraph Map {
node[shape="box"]
label=""
// The following must appear before the ally group in order to position them
// on the left side.
node[group="aside",style="",fontcolor="#111111"]
"Aside 1" [href="/aside/1"]
"Aside 2" [href="/aside/2"]
"Aside 3" [href="/aside/3"]
"Dreams 1" [href="/aside/dreams/1"]
"Dreams 2" [href="/aside/dreams/2"]
/* "Dreams 3" [href="/aside/dreams/3"] */
node[group="dad",style="filled",fillcolor="#cccccc",fontcolor="#222222"]
"Dad 1" [href="/dad/1"]
"Dad 2" [href="/dad/2"]
"Dad 3" [href="/dad/3"]
"Dad 4" [href="/dad/4"]
"Dad 5" [href="/dad/5"]
"Dad 6" [href="/dad/6"]
"Dad 7" [href="/dad/7"]
"Dad 8" [href="/dad/8"]
"Dad 9" [href="/dad/9"]
"Dad 10" [href="/dad/10"]
"Dad 11" [href="/dad/11"]
"Dad 1" -> "Dad 2" -> "Dad 3" -> "Dad 4" -> "Dad 5" ->
"Dad 6" -> "Dad 7" -> "Dad 8" -> "Dad 9" -> "Dad 10" ->
"Dad 11"
node[group="pnm",style="filled",fillcolor="#2f082a",fontcolor="#ccccdd"]
"Poet and Mystic 1" [href="/poet-and-mystic"]
"Poet and Mystic 2" [href="/poet-and-mystic/2"]
"Poet and Mystic 3" [href="/poet-and-mystic/3"]
"Poet and Mystic 4" [href="/poet-and-mystic/4"]
"Poet and Mystic 5" [href="/poet-and-mystic/5"]
"Poet and Mystic 6" [href="/poet-and-mystic/6"]
"Poet and Mystic 7" [href="/poet-and-mystic/7"]
"Poet and Mystic 8" [href="/poet-and-mystic/8"]
"Poet and Mystic 9" [href="/poet-and-mystic/9"]
"Poet and Mystic 10" [href="/poet-and-mystic/10"]
"Poet and Mystic 11" [href="/poet-and-mystic/11"]
"Poet and Mystic 12" [href="/poet-and-mystic/12"]
"Poet and Mystic 13" [href="/poet-and-mystic/13"]
"Poet and Mystic 1" -> "Poet and Mystic 2" -> "Poet and Mystic 3" ->
"Poet and Mystic 4" -> "Poet and Mystic 5" -> "Poet and Mystic 6" ->
"Poet and Mystic 7" -> "Poet and Mystic 8" -> "Poet and Mystic 9" ->
"Poet and Mystic 10" -> "Poet and Mystic 11" -> "Poet and Mystic 12" ->
"Poet and Mystic 13"
node[group="ane",style="",fontcolor="#111111"]
"Agony and Ecstasy" [href="/poet-and-mystic/agony-and-ecstasy"]
"Audio" [href="/poet-and-mystic/agony-and-ecstasy/audio"]
"Video" [href="/poet-and-mystic/agony-and-ecstasy/video"]
"Text" [href="/poet-and-mystic/agony-and-ecstasy/text"]
"Agony and Ecstasy" -> "Audio"
"Agony and Ecstasy" -> "Video"
"Agony and Ecstasy" -> "Text"
node[group="overflowing",style="filled",fillcolor="#aaaaaa",fontcolor="#000000"]
"Overflowing" [href="/poet-and-mystic/overflowing"]
node[group="with",style="filled",fillcolor="#666666",fontcolor="#cccccc"]
"With" [href="/poet-and-mystic/overflowing/with"]
node[group="words",style="filled",fillcolor="#000000",fontcolor="#777777"]
"Words 1" [href="/poet-and-mystic/overflowing/with/words"]
"Words 2" [href="/poet-and-mystic/overflowing/with/words/2"]
"Words 3" [href="/poet-and-mystic/overflowing/with/words/3"]
"Words 4" [href="/poet-and-mystic/overflowing/with/words/4"]
"Words 5" [href="/poet-and-mystic/overflowing/with/words/5"]
"Words 6" [href="/poet-and-mystic/overflowing/with/words/6"]
"Words 7" [href="/poet-and-mystic/overflowing/with/words/7"]
"Words 8" [href="/poet-and-mystic/overflowing/with/words/8"]
"Words 1" -> "Words 2" -> "Words 3" -> "Words 4" -> "Words 5" ->
"Words 6" -> "Words 7" -> "Words 8"
node[group="from-within",style="filled",fillcolor="#333a18",fontcolor="#ccddcc"]
"From within 1" [href="/from-within/"]
"From within 2" [href="/from-within/2"]
"From within 3" [href="/from-within/3",fillcolor="#283a26"]
"From within 4" [href="/from-within/4",fillcolor="#082a16",fontcolor="#bbccbb"]
"From within 5" [href="/from-within/5",fillcolor="#082010",fontcolor="#aabbaa"]
"From within 6" [href="/from-within/i-guess..",fillcolor="#001a06",fontcolor="#aabbaa"]
"From within 1" -> "From within 2" -> "From within 3" -> "From within 4" ->
"From within 5" -> "From within 6"
node[group="jay",style="filled",fillcolor="#eeddff",fontcolor="#222288"]
"Jay 1" [href="/jay/"]
"Jay 2" [href="/jay/2"]
"Jay 3" [href="/jay/3"]
"Jay 4" [href="/jay/4"]
"Jay 5" [href="/jay/5"]
"Jay 6" [href="/jay/6"]
"Jay 1" -> "Jay 2" -> "Jay 3" -> "Jay 4" -> "Jay 5" -> "Jay 6"
node[group="liminal",style="",fontcolor="#111111"]
"Liminal 1" [href="/liminal"]
"Liminal 2" [href="/liminal/2"]
"Liminal 3" [href="/liminal/3"]
"Liminal 4" [href="/liminal/4"]
"Liminal 5" [href="/liminal/5"]
"Liminal 6" [href="/liminal/6"]
"Liminal 7" [href="/liminal/7"]
"Liminal 8" [href="/liminal/8"]
"Liminal 1" -> "Liminal 2" -> "Liminal 3" -> "Liminal 4" ->
"Liminal 5" -> "Liminal 6" -> "Liminal 7" -> "Liminal 8"
node[group="poly",style="",fontcolor="#111111"]
"Poly 1" [href="/poly"]
"Poly 2" [href="/poly/2"]
"Poly 3" [href="/poly/3"]
"Poly 4" [href="/poly/4"]
"Poly 5" [href="/poly/5"]
"Poly 6" [href="/poly/6"]
"Poly 1" -> "Poly 2" -> "Poly 3" -> "Poly 4" -> "Poly 5" -> "Poly 6"
node[group="rape",style="filled",fillcolor="#330000",fontcolor="#dccccc"]
"Rape 1" [href="/sex/rape"]
"Rape 2" [href="/sex/rape/2"]
"Rape 3" [href="/sex/rape/3"]
"Rape 4" [href="/sex/rape/4"]
"Rape 1" -> "Rape 2" -> "Rape 3" -> "Rape 4"
node[group="sex",style="filled",fillcolor="#eeeef8",fontcolor="#111111"]
"Sex 1" [href="/sex"]
"Sex 2" [href="/sex/2"]
"Sex 3" [href="/sex/3"]
"Sex 4" [href="/sex/4"]
"Sex 5" [href="/sex/5"]
"Sex 6" [href="/sex/6"]
"Sex 7" [href="/sex/7"]
"Sex 8" [href="/sex/8"]
"Sex 9" [href="/sex/9"]
"Sex 10" [href="/sex/10"]
"Sex 1" -> "Sex 2" -> "Sex 3" -> "Sex 4" -> "Sex 5" -> "Sex 6" -> "Sex 7" ->
"Sex 8" -> "Sex 9" -> "Sex 10"
node[group="kink",style="filled",fillcolor="#17111a",fontcolor="#ffffff"]
"Kink 1" [href="/sex/kink"]
"Kink 2" [href="/sex/kink/2"]
"Kink 3" [href="/sex/kink/3"]
"Kink 4" [href="/sex/kink/4"]
"Kink 1" -> "Kink 2" -> "Kink 3" -> "Kink 4"
node[group="aside",style="",fontcolor="#111111"]
"Dreams 3" [href="/aside/dreams/3"]
node[group="software",style="filled",fillcolor="#eaf5ff",fontcolor="#05264c"]
"Software 1" [href="https://github.com/makyo/ally/pull/4/commits/c7d73fc7a727d34728b353a2c428b0da71788bf0"]
"Software 2" [href="https://github.com/makyo/ally/pull/4/commits/04b7300615386bccbb331caebcf396077f6fc9ea"]
"Software 3" [href="https://github.com/makyo/ally/pull/4/commits/d73e63f3fdc0bce89f06334959ade28888a2f7b2"]
"Software 4" [href="https://github.com/makyo/ally/pull/4/commits/90acc199cd80944f6c5eb6834a2fa67783db4d7d"]
"Software 5" [href="https://github.com/makyo/ally/pull/4/commits/49f83b2148f70151c43f8ef77a061e7252d9b1d4"]
"Software 6" [href="https://github.com/makyo/ally/pull/4/commits/ab8302ca2f6ca00c0a5bdfebcb4b2f2291ec9833"]
"Software 1" -> "Software 2" -> "Software 3" -> "Software 4" ->
"Software 5" -> "Software 6"
node[group="burnout",style="",fontcolor="#111111"]
"Burnout 1" [href="/burnout"]
"Burnout 2" [href="/burnout/2"]
"Burnout 3" [href="/burnout/3"]
"Burnout 4" [href="/burnout/4"]
"Burnout 1" -> "Burnout 2" -> "Burnout 3" -> "Burnout 4"
// This is the central axis
node[group="ally",style="",fontcolor="#111111"] // `core` folder
"ally 1" [href="/"]
"ally 2" [href="/2"]
"ally 3" [href="/3"]
"ally 4" [href="/4"]
"ally 5" [href="/5"]
"ally 6" [href="/6"]
"ally 7" [href="/7"]
"ally 8" [href="/8"]
"ally 9" [href="/9"]
"ally 10" [href="/10"]
"ally 11" [href="/11"]
"ally 12" [href="/12"]
"ally 13" [href="/13"]
"ally 14" [href="/14"]
"ally 15" [href="/15"]
"ally 16" [href="/16"]
"ally 17" [href="/17"]
"ally 18" [href="/18"]
"ally 19" [href="/19"]
"ally 20" [href="/20"]
"ally 21" [href="/21"]
"ally 22" [href="/22"]
"ally 23" [href="/23"]
"ally 24" [href="/24"]
"ally 25" [href="/25"]
"ally 26" [href="/26"]
"ally 27" [href="/27"]
"ally 28" [href="/28"]
"ally 29" [href="/29"]
"To be continued..." [shape="none"]
"ally 1" -> "ally 2" -> "ally 3" -> "ally 4" -> "ally 5" ->
"ally 6" -> "ally 7" -> "ally 8" -> "ally 9" -> "ally 10" ->
"ally 11" -> "ally 12" -> "ally 13" -> "ally 14" -> "ally 15" ->
"ally 16" -> "ally 17" -> "ally 18" -> "ally 19" -> "ally 20" ->
"ally 21" -> "ally 22" -> "ally 23" -> "ally 24" -> "ally 25" ->
"ally 26" -> "ally 27" -> "ally 28" -> "ally 29" -> "To be continued..."
node[group="birds",style="",fontcolor="#111111"]
"Birds 1" [href="/birds"]
"Birds 2" [href="/birds/2"]
"Birds 3" [href="/birds/3"]
"Birds 4" [href="/birds/4"]
"Birds 5" [href="/birds/5"]
"Birds 1" -> "Birds 2" -> "Birds 3" -> "Birds 4" -> "Birds 5"
// Must come before Furry to position it to the left.
node[group="koan",style="filled",fillcolor="#1f183a",fontcolor="#ccccdd"]
"Koan 1" [href="/koan/"]
"Koan 2" [href="/koan/2"]
"Koan 3" [href="/koan/3"]
"Koan 4" [href="/koan/4"]
"Koan 5" [href="/koan/5"]
"Koan 6" [href="/koan/6"]
"Koan 1" -> "Koan 2" -> "Koan 3" -> "Koan 4" -> "Koan 5" -> "Koan 6"
node[group="fursona",style="",fontcolor="#111111"]
"Fursoñas 1" [href="/furry/fursona/"]
"Fursoñas 2" [href="/furry/fursona/2"]
"Fursoñas 3" [href="/furry/fursona/3"]
"Fursoñas 4" [href="/furry/fursona/4"]
"Fursoñas 5" [href="/furry/fursona/5"]
"Fursoñas 6" [href="/furry/fursona/6"]
"Fursoñas 7" [href="/furry/fursona/7"]
"Fursoñas 8" [href="/furry/fursona/8"]
"Fursoñas 1" -> "Fursoñas 2" -> "Fursoñas 3" -> "Fursoñas 4" ->
"Fursoñas 5" -> "Fursoñas 6" -> "Fursoñas 7" -> "Fursoñas 8"
node[group="furry",style="",fontcolor="#111111"]
"Furry 1" [href="/furry"]
"Furry 2" [href="/furry/2"]
"Furry 3" [href="/furry/3"]
"Furry 4" [href="/furry/4"]
"Furry 5" [href="/furry/5"]
"Furry 6" [href="/furry/6"]
"Furry 7" [href="/furry/7"]
"Furry 1" -> "Furry 2" -> "Furry 3" -> "Furry 4" -> "Furry 5" ->
"Furry 6" -> "Furry 7"
node[group="margaras"]
"Margaras 1" [href="/furry/margaras"]
"Margaras 2" [href="/furry/margaras/2"]
"Margaras 3" [href="/furry/margaras/3"]
"Margaras 4" [href="/furry/margaras/4"]
"Margaras 5" [href="/furry/margaras/5"]
"Margaras 6" [href="/furry/margaras/6"]
"Margaras 1" -> "Margaras 2" -> "Margaras 3" -> "Margaras 4" ->
"Margaras 5" -> "Margaras 6"
node[group="younes"]
"Younes 1" [href="/furry/younes"]
"Younes 2" [href="/furry/younes/2"]
"Younes 3" [href="/furry/younes/3"]
"Younes 1" -> "Younes 2" -> "Younes 3"
node[group="mania",style="filled",fillcolor="#000000",fontcolor="#dddddd"]
"Manic notes 1" [href="/mania/"]
"Manic notes 2" [href="/mania/2"]
"Manic notes 3" [href="/mania/3"]
"Manic notes 4" [href="/mania/4"]
"Manic notes 5" [href="/mania/5"]
"Manic notes 1" -> "Manic notes 2" -> "Manic notes 3" -> "Manic notes 4" ->
"Manic notes 5"
node[group="mp",style="",fontcolor="#111111"]
"Manifesto Project 1" [href="/manifesto-project"]
"Manifesto Project 2" [href="/manifesto-project/2"]
"Manifesto Project 3" [href="/manifesto-project/3"]
"Manifesto Project 4" [href="/manifesto-project/4"]
"Manifesto Project 5" [href="/manifesto-project/5"]
"Manifesto Project 6" [href="/manifesto-project/6"]
"Manifesto Project 7" [href="/manifesto-project/7"]
"Manifesto Project 8" [href="/manifesto-project/8"]
"Manifesto Project 9" [href="/manifesto-project/9"]
"Manifesto Project 10" [href="/manifesto-project/10"]
"Manifesto Project 11" [href="/manifesto-project/11"]
"Manifesto Project 12" [href="/manifesto-project/12"]
"Manifesto Project 13" [href="/manifesto-project/13"]
"Manifesto Project 14" [href="/manifesto-project/14"]
"Manifesto Project 1" -> "Manifesto Project 2" -> "Manifesto Project 3" ->
"Manifesto Project 4" -> "Manifesto Project 5" -> "Manifesto Project 6" ->
"Manifesto Project 7" -> "Manifesto Project 8" -> "Manifesto Project 9" ->
"Manifesto Project 10" -> "Manifesto Project 11" ->
"Manifesto Project 12" -> "Manifesto Project 13" ->
"Manifesto Project 14"
node[group="gender",style="",fontcolor="#111111"]
"Gender 1" [href="/gender"]
"Gender 2" [href="/gender/2"]
"Gender 3" [href="/gender/3"]
"Gender 4" [href="/gender/4"]
"Gender 5" [href="/gender/5"]
"Gender 6" [href="/gender/6"]
"Gender 7" [href="/gender/7"]
"Gender 8" [href="/gender/8"]
"Gender 9" [href="/gender/9"]
"Gender 1" -> "Gender 2" -> "Gender 3" -> "Gender 4" -> "Gender 5" ->
"Gender 6" -> "Gender 7" -> "Gender 8" -> "Gender 9"
node[group="surgery"]
"Surgery 1" [href="/gender/surgery"]
"Surgery 2" [href="/gender/surgery/2"]
"Surgery 3" [href="/gender/surgery/3"]
"Surgery 4" [href="/gender/surgery/4"]
"Surgery 5" [href="/gender/surgery/5"]
"Surgery 6" [href="/gender/surgery/6"]
"Surgery 7" [href="/gender/surgery/7"]
"Surgery 8" [href="/gender/surgery/8"]
"Surgery 9" [href="/gender/surgery/9"]
"Surgery 10" [href="/gender/surgery/10"]
"Surgery 1" -> "Surgery 2" -> "Surgery 3" -> "Surgery 4" ->
"Surgery 5" -> "Surgery 6" -> "Surgery 7" -> "Surgery 8" ->
"Surgery 9" -> "Surgery 10"
node[group="sh",style="filled",fillcolor="#222228",fontcolor="#dddddd"]
"Self-harm 1" [href="/self-harm"]
"Self-harm 2" [href="/self-harm/2"]
"Self-harm 3" [href="/self-harm/3"]
"Self-harm 1" -> "Self-harm 2" -> "Self-harm 3"
node[group="suicide",style="filled",fillcolor="#222222",fontcolor="#aaaaaa"]
"Suicide 1" [href="/self-harm/suicide"]
"Suicide 2" [href="/self-harm/suicide/2"]
"Suicide 3" [href="/self-harm/suicide/3"]
"Suicide 4" [href="/self-harm/suicide/4"]
"Suicide 5" [href="/self-harm/suicide/5"]
"Suicide 6" [href="/self-harm/suicide/6"]
"Suicide 7" [href="/self-harm/suicide/7"]
"Suicide 8" [href="/self-harm/suicide/8"]
"Suicide 9" [href="/self-harm/suicide/9"]
"Suicide 10" [href="/self-harm/suicide/10"]
"Suicide 11" [href="/self-harm/suicide/11"]
"Suicide 12" [href="/self-harm/suicide/12"]
"Suicide 13" [href="/self-harm/suicide/13"]
"Suicide 1" -> "Suicide 2" -> "Suicide 3" ->
"Suicide 4" -> "Suicide 5" -> "Suicide 6" -> "Suicide 7" ->
"Suicide 8" -> "Suicide 9" -> "Suicide 10" -> "Suicide 11" ->
"Suicide 12" -> "Suicide 13"
node[group="writing",style="",fontcolor="#111111"]
"Writing 1" [href="/writing"]
"Writing 2" [href="/writing/2"]
"Writing 3" [href="/writing/3"]
"Writing 4" [href="/writing/4"]
"Writing 5" [href="/writing/5"]
"Writing 6" [href="/writing/6"]
"Writing 7" [href="/writing/7"]
"Writing 1" -> "Writing 2" -> "Writing 3" -> "Writing 4" -> "Writing 5" ->
"Writing 6" -> "Writing 7"
node[group="music",style="",fontcolor="#111111"]
"Music 1" [href="/writing/music"]
"Music 2" [href="/writing/music/2"]
"Music 3" [href="/writing/music/3"]
"Music 4" [href="/writing/music/4"]
"Music 5" [href="/writing/music/5"]
"Music 1" -> "Music 2" -> "Music 3" -> "Music 4" -> "Music 5"
node[group="movement",style="filled",fillcolor="#e6e6fa",fontcolor="#220000"]
"Movement 1" [href="/movement"]
"Movement 2" [href="/movement/2"]
"Movement 3" [href="/movement/3"]
"Movement 4" [href="/movement/4"]
"Movement 5" [href="/movement/5"]
"Movement 6" [href="/movement/6"]
"Movement 7" [href="/movement/7"]
"Movement 8" [href="/movement/8"]
"Movement 9" [href="/movement/9"]
"Movement 1" -> "Movement 2" -> "Movement 3" -> "Movement 4" ->
"Movement 5" -> "Movement 6" -> "Movement 7" -> "Movement 8" ->
"Movement 9"
/**
Connections
Connections should only lead from one quest to another the first time that
link appears. No need to link to a quest a second time.
Wasn't the point of this to be intentionally confusing?
Yeah, but it was grating on me. All of those lines crossing, all those curves, side-quests pushed way down the page because I linked to them too many times.
*/
// Asides
"ally 14" -> "Aside 1"
"Liminal 4" -> "Aside 2"
"Poet and Mystic 7" -> "Aside 3"
// Birds
/* none */
// ally
"ally 8" -> "Manic notes 1"
"ally 9" -> "Birds 1"
"ally 10" -> "Poly 1"
"ally 11" -> "From within 1"
"ally 13" -> "Furry 1"
"ally 15" -> "Liminal 1"
"ally 16" -> "Poet and Mystic 1"
"ally 17" -> "Writing 1"
"ally 18" -> "Software 1"
"ally 23" -> "Movement 1"
"ally 29" -> "Burnout 1"
// Dad
"Dad 11" -> "ally 16"
// From within
"From within 6" -> "ally 12"
// Furry
// Fursona
/* none */
// Margaras
/* none */
// Younes
"Younes 3" -> "Self-harm 1"
"Furry 1" -> "Koan 1"
"Furry 2" -> "Fursoñas 1"
"Furry 6" -> "Margaras 1"
"Furry 7" -> "Younes 1"
// Jay
"Jay 3" -> "Dreams 1"
// Koan
/* none */
// Liminal
"Liminal 8" -> "Dad 1"
// Manic notes
"Manic notes 4" -> "Manifesto Project 1"
// Manifesto Project
/* none */
// Poet and Mystic
/*"Poet and Mystic 1" -> "Manifesto Project 1"*/
"Poet and Mystic 13" -> "Agony and Ecstasy"
"Poet and Mystic 8" -> "Dreams 2"
"Poet and Mystic 11" -> "Overflowing" -> "With" -> "Words 1"
// Poly
"Poly 1" -> "Jay 1"
"Poly 6" -> "Sex 1"
// Self-harm
/*"Self-harm 1" -> "Margaras 1"*/
"Self-harm 3" -> "Suicide 1"
"Self-harm 3" -> "Gender 1"
// Gender
"Gender 6" -> "Surgery 1"
// Sex
"Sex 4" -> "Kink 1"
"Sex 8" -> "Rape 1"
"Sex 8" -> "Dreams 3"
// Writing
/*"Writing 2" -> "Koans 1"
"Writing 2" -> "Birds 1"
"Writing 2" -> "Margaras 1"
"Writing 2" -> "Dad 1"
"Writing 2" -> "Fursoñas 1"
"Writing 2" -> "Poet and Mystic 1"*/
"Writing 7" -> "Music 1"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

View File

@ -0,0 +1,248 @@
<?xml version="1.0" standalone="yes"?>
<svg width="505" height="555" viewbox="0 0 505 555" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<style>
@import url('https://fonts.googleapis.com/css?family=Nunito');
.bbbingo-card rect.background {
fill: #223;
stroke-width: 0px;
}
.bbbingo-card text {
font-family: "Nunito", sans-serif;
fill: #dcd;
}
.bbbingo-card text.title {
font-size: 45px;
font-style: italic;
}
.bbbingo-card tspan.paler {
fill: #656;
}
.bbbingo-card tspan.pale {
fill: #989;
}
.bbbingo-card rect {
fill: none;
stroke: #bab;
stroke-width: 5px;
}
.bbbingo-card rect.selected {
fill: #445;
stroke: #fef;
}
.bbbingo-card path {
fill: #656;
opacity: 0.5;
}
.bbbingo-card text.freespace {
font-size: 10pt;
opacity: 0.5;
}
.bbbingo-card .text g text {
font-size: 12px;
}
.bbbingo-card a, a:visited, a:active, a:hover {
fill: #dcd;
text-decoration: underline;
}
.bbbingo-card rect.target {
fill: transparent;
stroke: none;
}
.bbbingo-card circle.play_marker {
display: none;
}
.bbbingo-card circle.marked {
display: block;
fill: #f8b;
opacity: 0.4;
}
</style>
<g class="bbbingo-card" transform="translate(2.5, 2.25)">
<rect class="background" x="-2.5" y="-2.5" width="507.5" height="557.5" />
<text class="title" x="0" y="0" dominant-baseline="hanging">
<tspan class="paler">b</tspan>
<tspan class="pale">b</tspan>
b
i
n
g
o
</text>
<text class="name" x="500" y="0" dominant-baseline="hanging" text-anchor="end"><a xlink:href="/preparations-squadrons-voices-spans" target="_blank">Kink Bingo (Maddy)</a> (2)</text>
<text class="author" x="500" y="20px" dominant-baseline="hanging" text-anchor="end">by <a xlink:href="/~makyo">makyo</a></text>
<g transform="translate(0, 50)">
<rect x="0" y="0" width="100" height="100" class="slot_0" />
<rect x="100" y="0" width="100" height="100" class="slot_1" />
<rect x="200" y="0" width="100" height="100" class="slot_2" />
<rect x="300" y="0" width="100" height="100" class="slot_3" />
<rect x="400" y="0" width="100" height="100" class="slot_4" />
<rect x="0" y="100" width="100" height="100" class="slot_5" />
<rect x="100" y="100" width="100" height="100" class="slot_6" />
<rect x="200" y="100" width="100" height="100" class="slot_7" />
<rect x="300" y="100" width="100" height="100" class="slot_8" />
<rect x="400" y="100" width="100" height="100" class="slot_9" />
<rect x="0" y="200" width="100" height="100" class="slot_10" />
<rect x="100" y="200" width="100" height="100" class="slot_11" />
<rect x="200" y="200" width="100" height="100" class="slot_12" />
<rect x="300" y="200" width="100" height="100" class="slot_13" />
<rect x="400" y="200" width="100" height="100" class="slot_14" />
<rect x="0" y="300" width="100" height="100" class="slot_15" />
<rect x="100" y="300" width="100" height="100" class="slot_16" />
<rect x="200" y="300" width="100" height="100" class="slot_17" />
<rect x="300" y="300" width="100" height="100" class="slot_18" />
<rect x="400" y="300" width="100" height="100" class="slot_19" />
<rect x="0" y="400" width="100" height="100" class="slot_20" />
<rect x="100" y="400" width="100" height="100" class="slot_21" />
<rect x="200" y="400" width="100" height="100" class="slot_22" />
<rect x="300" y="400" width="100" height="100" class="slot_23" />
<rect x="400" y="400" width="100" height="100" class="slot_24" />
<path d="M 202.5 242.5 l 40 -40 l -40 0 z" />
<text class="freespace" transform="rotate(-45) translate(-12.5, 310)">Free</text>
<g class="text">
<g transform="translate(0, 0)">
<text x="50" y="53" text-anchor="middle">Degradation</text>
<circle cx="50" cy="50" r="35" class="play_marker play_0" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="0" />
</g>
<g transform="translate(100, 0)">
<text x="50" y="53" text-anchor="middle">Scent marking</text>
<circle cx="50" cy="50" r="35" class="play_marker play_1" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="1" />
</g>
<g transform="translate(200, 0)">
<text x="50" y="53" text-anchor="middle">Breeding</text>
<circle cx="50" cy="50" r="35" class="play_marker play_2" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="2" />
</g>
<g transform="translate(300, 0)">
<text x="50" y="53" text-anchor="middle">Non-consensual</text>
<circle cx="50" cy="50" r="35" class="play_marker play_3" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="3" />
</g>
<g transform="translate(400, 0)">
<text x="50" y="45" text-anchor="middle">Risk of</text><text x="50" y="60" text-anchor="middle">pregnancy</text>
<circle cx="50" cy="50" r="35" class="play_marker play_4" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="4" />
</g>
<g transform="translate(0, 100)">
<text x="50" y="53" text-anchor="middle">Scruff biting</text>
<circle cx="50" cy="50" r="35" class="play_marker play_5" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="5" />
</g>
<g transform="translate(100, 100)">
<text x="50" y="45" text-anchor="middle">Leash or collar</text><text x="50" y="60" text-anchor="middle">pulling</text>
<circle cx="50" cy="50" r="35" class="play_marker play_6" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="6" />
</g>
<g transform="translate(200, 100)">
<text x="50" y="53" text-anchor="middle">Teasing</text>
<circle cx="50" cy="50" r="35" class="play_marker play_7" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="7" />
</g>
<g transform="translate(300, 100)">
<text x="50" y="38" text-anchor="middle">Exhibitionism</text><text x="50" y="53" text-anchor="middle">(primarily</text><text x="50" y="68" text-anchor="middle">public sex)</text>
<circle cx="50" cy="50" r="35" class="play_marker play_8" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="8" />
</g>
<g transform="translate(400, 100)">
<text x="50" y="30" text-anchor="middle">Identity</text><text x="50" y="45" text-anchor="middle">(gender,</text><text x="50" y="60" text-anchor="middle">species, etc)</text><text x="50" y="75" text-anchor="middle">denial</text>
<circle cx="50" cy="50" r="35" class="play_marker play_9" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="9" />
</g>
<g transform="translate(0, 200)">
<text x="50" y="53" text-anchor="middle">Heat/estrus</text>
<circle cx="50" cy="50" r="35" class="play_marker play_10" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="10" />
</g>
<g transform="translate(100, 200)">
<text x="50" y="53" text-anchor="middle">Breath control</text>
<circle cx="50" cy="50" r="35" class="play_marker play_11" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="11" />
</g>
<g transform="translate(200, 200)">
<text x="50" y="53" text-anchor="middle">Humiliation</text>
<circle cx="50" cy="50" r="35" class="play_marker play_12" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="12" />
</g>
<g transform="translate(300, 200)">
<text x="50" y="53" text-anchor="middle">Knotting/tying</text>
<circle cx="50" cy="50" r="35" class="play_marker play_13" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="13" />
</g>
<g transform="translate(400, 200)">
<text x="50" y="30" text-anchor="middle">Ear play</text><text x="50" y="45" text-anchor="middle">(teasing,</text><text x="50" y="60" text-anchor="middle">pulling,</text><text x="50" y="75" text-anchor="middle">biting, etc)</text>
<circle cx="50" cy="50" r="35" class="play_marker play_14" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="14" />
</g>
<g transform="translate(0, 300)">
<text x="50" y="38" text-anchor="middle">Discipline</text><text x="50" y="53" text-anchor="middle">or</text><text x="50" y="68" text-anchor="middle">reinforcement</text>
<circle cx="50" cy="50" r="35" class="play_marker play_15" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="15" />
</g>
<g transform="translate(100, 300)">
<text x="50" y="23" text-anchor="middle">Weakened mental</text><text x="50" y="38" text-anchor="middle">state (hypno,</text><text x="50" y="53" text-anchor="middle">drugs, estrus,</text><text x="50" y="68" text-anchor="middle">exhaustion,</text><text x="50" y="83" text-anchor="middle">etc)</text>
<circle cx="50" cy="50" r="35" class="play_marker play_16" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="16" />
</g>
<g transform="translate(200, 300)">
<text x="50" y="53" text-anchor="middle">Master/pet</text>
<circle cx="50" cy="50" r="35" class="play_marker play_17" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="17" />
</g>
<g transform="translate(300, 300)">
<text x="50" y="45" text-anchor="middle">Humiliating</text><text x="50" y="60" text-anchor="middle">instructions</text>
<circle cx="50" cy="50" r="35" class="play_marker play_18" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="18" />
</g>
<g transform="translate(400, 300)">
<text x="50" y="45" text-anchor="middle">Speech</text><text x="50" y="60" text-anchor="middle">restrictions</text>
<circle cx="50" cy="50" r="35" class="play_marker play_19" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="19" />
</g>
<g transform="translate(0, 400)">
<text x="50" y="38" text-anchor="middle">Pain/blood</text><text x="50" y="53" text-anchor="middle">(accidental</text><text x="50" y="68" text-anchor="middle">or intentional)</text>
<circle cx="50" cy="50" r="35" class="play_marker play_20" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="20" />
</g>
<g transform="translate(100, 400)">
<text x="50" y="45" text-anchor="middle">Orgasm or</text><text x="50" y="60" text-anchor="middle">pleasure denial</text>
<circle cx="50" cy="50" r="35" class="play_marker play_21" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="21" />
</g>
<g transform="translate(200, 400)">
<text x="50" y="15" text-anchor="middle">Clothes</text><text x="50" y="30" text-anchor="middle">(bulges, cum</text><text x="50" y="45" text-anchor="middle">stains on</text><text x="50" y="60" text-anchor="middle">clothes,</text><text x="50" y="75" text-anchor="middle">clothed sex,</text><text x="50" y="90" text-anchor="middle">etc)</text>
<circle cx="50" cy="50" r="35" class="play_marker play_22" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="22" />
</g>
<g transform="translate(300, 400)">
<text x="50" y="23" text-anchor="middle">Post-sex</text><text x="50" y="38" text-anchor="middle">degradation</text><text x="50" y="53" text-anchor="middle">(public</text><text x="50" y="68" text-anchor="middle">parading,</text><text x="50" y="83" text-anchor="middle">etc)</text>
<circle cx="50" cy="50" r="35" class="play_marker play_23" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="23" />
</g>
<g transform="translate(400, 400)">
<text x="50" y="53" text-anchor="middle">Coercion</text>
<circle cx="50" cy="50" r="35" class="play_marker play_24" />
<rect x="0" y="0" width="100" height="100" class="target" data-slot="24" />
</g>
</g>
<path d="M 202.5 242.5 l 40 -40 l -40 0 z" />
<text class="freespace" transform="rotate(-45) translate(-12.5, 310)">Free</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

0
making-of/book.idx Normal file
View File

BIN
making-of/book.pdf Normal file

Binary file not shown.

78
making-of/book.tex Normal file
View File

@ -0,0 +1,78 @@
\documentclass[11pt]{memoir}
\def\watermarkloaded{0}
\input{includes/variables}
\input{includes/draft}
\input{includes/frame}
\input{includes/packages}
\input{includes/geometry}
\input{includes/toc}
\input{includes/font}
\input{includes/pagelayout}
\input{includes/title}
\input{includes/secdiv}
\input{includes/hyphenation}
\begin{document}
\frontmatter
\input{includes/pretitle}
\pagestyle{plain}
\doublespacing
\null
\vfill
\begin{flushright}
{\fontspec{Merriweather Sans}[Scale=1.5,Color=444444FF]\Huge ally}
\vfill
{\fontspec{Merriweather Sans}[Scale=1.5,Color=555555FF]\normalsize from start to finish}
\vfill
{\Huge Madison Scott-Clary}
\end{flushright}
% \vfill
\thispagestyle{empty}
\newpage
\input{includes/copyright}
% \tableofcontents*
\newpage
\null
\thispagestyle{empty}
\cleardoublepage
\onehalfspacing
% \input{content/preface}
\null
\vfill
\begin{center}
{\allyFont ally} began in the form of an interactive website.
The project continues at {\allyFont https://ally.id}
\end{center}
\vfill
\mainmatter
\pagestyle{ourbook}
\columnratio{0.618}
\setlength\columnsep{20pt}
\twosided
\input{content/001}
\input{content/002}
\input{content/003}
\input{content/004}
%%%%%
\backmatter
\pagestyle{empty}
\end{document}

0
making-of/content/.keep Normal file
View File

111
making-of/content/001.tex Normal file
View File

@ -0,0 +1,111 @@
\begin{paracol}{2}
\begin{leftcolumn}
\noindent How does one start a project?
\begin{ally}
With a bang, or with a whimper?
\end{ally}
Very funny.
In all seriousness, though. How? Does one come up with an idea and just\ldots{}what, go? Just start going and when you get to the end, stop? Can everything be, as NaNoWriMo would have it, pantsed? Run by the seat of your pants such that everything is done without planning, and thus nothing is unsurprising to the author?
Or does one plan meticulously? Does one craft an outline of such startling beauty that to finish the project itself feels almost a betrayal?
\begin{ally}
Which are you guilty of?
\end{ally}
\end{leftcolumn}
\begin{rightcolumn*}
\includegraphics[width=2in]{assets/project-list.png}
\end{rightcolumn*}
\begin{leftcolumn}
Both, of course. I have my fair share of projects I planned so thoroughly that they fell through, just as I have my fair share of projects that I tried worked and worked and worked on and kept adding and adding and adding, and by the end they were so wandery as to be incomprehensible. They didn't hold together, and the story had gone so far off the rails that it was unfixable without a total rewrite.
\begin{ally}
And which type was I?
\end{ally}
Don't preempt me. All of the projects that I've actually succeeded at have been somewhere in the middle. It's important to plan, as I've learned from all those countless unfinished projects, but there is also a fine balance of planning required, lest you plan your work out of existence.
\emph{Qoheleth}, the book that follows \emph{ally}, has, as a major theme, the difference between honing and forging. To hone is to take an idea and work it to an ever sharper point, whereas to forge is to take an idea, work until its good enough, and forge onwards.
Neither is bad, of course. There is no value judgement in this distinction. Neither, also, is there any sense of permanence to the label. \emph{ally} was a project borne of forging: I was always trying to do something new with the typography, the wordchoice, the colors and textures of each of the sidequests, and so on. \emph{Restless Town} was a project borne of honing, though. My goal with those stories was to try and somehow come to the finest possible point of the lives involved and the tropes and identities that drive them. I wanted to take aspects of myself --- my gender, my mental health, my sexuality, my polyamory --- and hone each into a story worth reading.
But, as with outlining versus pantsing, one can go too far in either direction.
\begin{ally}
And still, you will never not giggle when you write `pantsing'.
\end{ally}
Correct.
All that to say that, as Herbert would hvae it, beginnings are such delicate times. To start a project is to kill a portion of yourself, because, whether or not you succeed in finishing the project, whether or not you are trying to hone something to a cruel point or to forge into new territory, you will never start that project again. You will never again be the you who started that project.
\newpage
\begin{ally}
And so why am I here?
\end{ally}
May I throw your words back at you?
\begin{ally}
By all means.
\end{ally}
\emph{``Can an ally disinhabit a mind so easily?''}
\begin{ally}
A question I remember you being decidedly uncomfortable with.
\end{ally}
Yes.
\begin{ally}
But why am I here \textbf{now}? Why when we are talking about how this project was made?
\end{ally}
Do you not deserve to be here for such a conversation? I trust that you will have little to say of much of the mechanics, but much to say about the process of research.
\begin{ally}
I do not doubt you. And yet you began this as a list of neat \LaTeX\ things you learned along the way. How often does one write a \LaTeX\ cookbook with one's imaginary friend?
\end{ally}
I don't know. Probably not often. There is precedent, though, for overused literary devices in technical writing. \texttt{Coy}\footnote{\href{https://metacpan.org/pod/Coy}{Coy module on CPAN}}, anyone?
\begin{verse}
Error messages\\
strewn across my terminal.\\
A vein starts to throb.
Their reproof adds the\\
injury of insult to\\
the shame of failure.
When a program dies\\
what you need is a moment\\
of serenity.
\end{verse}
Or perhaps you enjoy foxes as I do:
\noindent\includegraphics[width=4.2in]{assets/the.foxes-3.png}
\begin{center}
\footnotesize
From \href{https://poignant.guide}{\emph{Why's Poignant Guide to Ruby}} by \textbf{Why The Lucky Stiff}, licensed under a CreativeCommons Attribution-ShareAlike license.
\end{center}
There are all sorts of instances of folks writing technical things in a decidedly non-technical fashion.
\begin{ally}
If you say so. What, then, are you going to talk about in this technical guide?
\end{ally}
Thanks for writing my segue for me.
\begin{labeling}{\textbf{The ally book}}
\item[\textbf{ally.id}] How the interactive side of ally is built, including some fun examples.
\emph{Page \pageref{site}}
\item[\textbf{The ally book}] How the book itself was built.
\emph{Page \pageref{book}}
\item[\textbf{Gotchas}] Some problems I ran into along the way.
\emph{Page \pageref{gotchas}}
\end{labeling}
\end{leftcolumn}
\end{paracol}

Some files were not shown because too many files have changed in this diff Show More