diff options
Diffstat (limited to '.config/qutebrowser/misc')
51 files changed, 6288 insertions, 0 deletions
diff --git a/.config/qutebrowser/misc/Makefile b/.config/qutebrowser/misc/Makefile new file mode 100644 index 0000000..210480e --- /dev/null +++ b/.config/qutebrowser/misc/Makefile @@ -0,0 +1,33 @@ +PYTHON = python3 +PREFIX = /usr/local +DESTDIR = +ICONSIZES = 16 24 32 48 64 128 256 512 + +SETUPTOOLSOPTIONS = +ifdef DESTDIR +SETUPTOOLSOPTS = --root="$(DESTDIR)" +endif + +.PHONY: install + +doc/qutebrowser.1.html: + a2x -f manpage doc/qutebrowser.1.asciidoc + +install: doc/qutebrowser.1.html + $(PYTHON) setup.py install --prefix="$(PREFIX)" --optimize=1 $(SETUPTOOLSOPTS) + install -Dm644 misc/qutebrowser.appdata.xml \ + "$(DESTDIR)$(PREFIX)/share/metainfo/qutebrowser.appdata.xml" + install -Dm644 doc/qutebrowser.1 \ + "$(DESTDIR)$(PREFIX)/share/man/man1/qutebrowser.1" + install -Dm644 misc/qutebrowser.desktop \ + "$(DESTDIR)$(PREFIX)/share/applications/qutebrowser.desktop" + $(foreach i,$(ICONSIZES),install -Dm644 "icons/qutebrowser-$(i)x$(i).png" \ + "$(DESTDIR)$(PREFIX)/share/icons/hicolor/$(i)x$(i)/apps/qutebrowser.png";) + install -Dm644 icons/qutebrowser.svg \ + "$(DESTDIR)$(PREFIX)/share/icons/hicolor/scalable/apps/qutebrowser.svg" + install -Dm755 -t "$(DESTDIR)$(PREFIX)/share/qutebrowser/userscripts/" \ + $(wildcard misc/userscripts/*) + install -Dm755 -t "$(DESTDIR)$(PREFIX)/share/qutebrowser/scripts/" \ + $(filter-out scripts/__init__.py scripts/__pycache__ scripts/dev \ + scripts/testbrowser scripts/asciidoc2html.py scripts/setupcommon.py \ + scripts/link_pyqt.py,$(wildcard scripts/*)) diff --git a/.config/qutebrowser/misc/apparmor/usr.bin.qutebrowser b/.config/qutebrowser/misc/apparmor/usr.bin.qutebrowser new file mode 100644 index 0000000..b993e00 --- /dev/null +++ b/.config/qutebrowser/misc/apparmor/usr.bin.qutebrowser @@ -0,0 +1,41 @@ +# AppArmor profile for qutebrowser +# Tested on Debian jessie + +#include <tunables/global> + +profile qutebrowser /usr/{local/,}bin/qutebrowser { + + #include <abstractions/base> + #include <abstractions/nameservice> + #include <abstractions/openssl> + #include <abstractions/ssl_certs> + #include <abstractions/audio> + #include <abstractions/fonts> + #include <abstractions/kde> + #include <abstractions/user-download> + #include <abstractions/X> + + capability dac_override, + + /usr/{local/,}bin/ r, + /usr/{local/,}bin/qutebrowser rix, + /usr/bin/python3.? r, + + /usr/lib/python3/ mr, + /usr/lib/python3/** mr, + /usr/lib/python3.?/ r, + /usr/lib/python3.?/** mr, + /usr/local/lib/python3.?/** r, + + /proc/*/mounts r, + owner /tmp/** rwkl, + owner /run/user/*/ rw, + owner /run/user/*/** krw, + + @{HOME}/.config/qutebrowser/** krw, + @{HOME}/.local/share/qutebrowser/** krw, + @{HOME}/.cache/qutebrowser/** krw, + @{HOME}/.gstreamer-0.10/* r, + +} + diff --git a/.config/qutebrowser/misc/cheatsheet.svg b/.config/qutebrowser/misc/cheatsheet.svg new file mode 100644 index 0000000..bb87142 --- /dev/null +++ b/.config/qutebrowser/misc/cheatsheet.svg @@ -0,0 +1,3726 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="1092.2667" + height="682.66669" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.92.2 5c3e80d, 2017-08-06" + version="1.0" + sodipodi:docname="cheatsheet.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/home/vav/images/xmonad/xmbindings_lg.png" + inkscape:export-xdpi="112.5" + inkscape:export-ydpi="112.5"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.7536248" + inkscape:cx="430.72917" + inkscape:cy="268.64059" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="1024px" + height="640px" + showgrid="false" + inkscape:window-width="2560" + inkscape:window-height="1440" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="true" + inkscape:guide-bbox="true" + inkscape:window-maximized="0" + inkscape:snap-text-baseline="true" + inkscape:measure-start="0,0" + inkscape:measure-end="0,0"> + <inkscape:grid + id="GridFromPre046Settings" + type="xygrid" + originx="0" + originy="0" + spacingx="2.1333333" + spacingy="2.1333333" + color="#3f3fff" + empcolor="#3f3fff" + opacity="0.15" + empopacity="0.38" + empspacing="5" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <rect + ry="4.7797003" + y="163.79405" + x="10.666667" + height="64" + width="74.666664" + id="rect3328" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3330" + width="64" + height="64" + x="96" + y="163.79405" + ry="4.7797003" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3382" + width="63.461262" + height="64" + x="544.48407" + y="163.79405" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="163.79405" + x="619.1535" + height="64" + width="63.461262" + id="rect3384" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + ry="4.7797003" + y="163.79405" + x="469.8172" + height="64" + width="63.461262" + id="rect3386" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + ry="4.7797003" + y="163.79405" + x="768.48407" + height="64" + width="63.461262" + id="rect3388" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3392" + width="63.461262" + height="64" + x="693.82019" + y="163.79405" + ry="4.7797003" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="99.751244" + y="187.30594" + id="text3444"><tspan + sodipodi:role="line" + id="tspan3446" + x="99.751244" + y="187.30594" + style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">Q</tspan></text> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect2739" + width="63.461262" + height="64" + x="320.05182" + y="163.79405" + ry="4.7797003" /> + <text + id="text3448" + y="187.60356" + x="323.15463" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="187.60356" + x="323.15463" + id="tspan3450" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">R</tspan></text> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect7301" + width="63.461262" + height="64" + x="171.15358" + y="163.79405" + ry="4.7797003" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 171.24757,196.86071 c 21.0911,0 42.18218,0 63.27327,0" + id="path7305" + inkscape:connector-curvature="0" /> + <text + id="text3464" + y="187.92427" + x="175.64062" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:monospace;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="187.92427" + x="175.64062" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + id="tspan3498">W</tspan></text> + <text + id="text3468" + y="216.29616" + x="99.515625" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="216.29616" + x="99.515625" + id="tspan3470" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">q</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="175.64062" + y="220.43825" + id="text3472"><tspan + sodipodi:role="line" + id="tspan3474" + x="175.64062" + y="220.43825" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">w</tspan></text> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 96.637962,195.79405 c 21.265388,0 42.530768,0 63.796148,0" + id="path3476" + inkscape:connector-curvature="0" /> + <g + id="g7271" + transform="translate(0,16.59406)" + style="fill:#eeeeec;fill-opacity:1"> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3378" + width="63.461262" + height="64" + x="395.15076" + y="147.2" + ry="4.7797003" /> + <rect + ry="2.4296808" + y="147.2" + x="395.15076" + height="32.533333" + width="63.461262" + id="rect7269" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <path + style="font-size:18px;fill:#eeeeec;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 395.24997,179.73333 c 21.26539,0 42.53077,0 63.79615,0" + id="path3484" + inkscape:connector-curvature="0" /> + </g> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 469.91423,196.86071 c 21.08993,0 42.17982,0 63.26974,0" + id="path3486" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 544.58331,196.86071 c 21.26538,0 42.53076,0 63.79615,0" + id="path3488" + inkscape:connector-curvature="0" /> + <path + id="path3490" + d="m 619.24757,196.32738 c 21.0911,0 42.18218,0 63.27327,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + id="path3492" + d="m 693.91424,196.86071 c 21.09109,0 42.18218,0 63.27327,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + id="path3494" + d="m 768.58331,196.86071 c 21.26538,0 42.53076,0 63.79615,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <rect + ry="4.7797003" + y="163.79405" + x="245.38516" + height="64" + width="63.461262" + id="rect2735" + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <path + id="path2737" + d="m 245.47916,195.19999 c 21.09109,0 42.18217,0 63.27327,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="248.78169" + y="187.60356" + id="text3502"><tspan + sodipodi:role="line" + id="tspan3504" + x="248.78169" + y="187.60356" + style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">E</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="248.64069" + y="220.16637" + id="text3506"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3508" + x="248.64069" + y="220.16637">e</tspan></text> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 320.14582,195.19999 c 21.0911,0 42.18218,0 63.27327,0" + id="path2741" + inkscape:connector-curvature="0" /> + <text + id="text3510" + y="219.88054" + x="321.97186" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + y="219.88054" + x="321.97186" + id="tspan3512" + sodipodi:role="line">r</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="399.83853" + y="220.32741" + id="text3532"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3534" + x="399.83853" + y="220.32741">t</tspan></text> + <text + id="text3536" + y="217.93365" + x="474.22501" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="217.93365" + x="474.22501" + id="tspan3538" + sodipodi:role="line">y</tspan></text> + <text + id="text3540" + y="219.90315" + x="547.44312" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="219.90315" + x="547.44312" + id="tspan3542" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">u</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="622.33124" + y="220.32741" + id="text3544"><tspan + sodipodi:role="line" + id="tspan3546" + x="622.33124" + y="220.32741" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">i</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="698.52502" + y="219.88054" + id="text3548"><tspan + sodipodi:role="line" + id="tspan3550" + x="698.52502" + y="219.88054" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">o</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="772.01251" + y="219.88054" + id="text3552"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3554" + x="772.01251" + y="219.88054">p</tspan></text> + <text + id="text3556" + y="201.17621" + x="851.88257" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="font-size:23.46666718px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672px" + y="201.17621" + x="851.88257" + id="tspan3558" + sodipodi:role="line"> </tspan></text> + <rect + ry="4.7797003" + y="238.46074" + x="106.23158" + height="64" + width="64" + id="rect3616" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3618" + width="63.461262" + height="64" + x="181.38516" + y="238.46074" + ry="4.7797003" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3620" + width="64.538773" + height="64" + x="255.56491" + y="238.46074" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="238.46074" + x="332.05182" + height="64" + width="63.461262" + id="rect3622" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3624" + width="63.461262" + height="64" + x="405.38232" + y="238.46074" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="238.46074" + x="554.71564" + height="64" + width="63.461262" + id="rect3626" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3628" + width="63.461262" + height="64" + x="629.38507" + y="238.46074" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="238.46074" + x="779.1535" + height="64" + width="63.948242" + id="rect3634" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <text + id="text3638" + y="262.07977" + x="110.55427" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="262.07977" + x="110.55427" + id="tspan3640" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">A</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="335.79037" + y="264.53333" + id="text3642"><tspan + sodipodi:role="line" + id="tspan3644" + x="335.79037" + y="264.53333" + style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">F</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:monospace;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="185.38518" + y="261.80792" + id="text3646"><tspan + id="tspan3648" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + x="185.38518" + y="261.80792">S</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="110.07188" + y="295.08054" + id="text3650"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3652" + x="110.07188" + y="295.08054">a</tspan></text> + <text + id="text3654" + y="295.08054" + x="185.54375" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="295.08054" + x="185.54375" + id="tspan3656" + sodipodi:role="line">s</tspan></text> + <path + id="path3658" + d="m 106.86955,270.46071 c 21.26538,0 42.53076,0 63.79615,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 181.47916,270.99405 c 21.09109,0 42.18217,0 63.27327,0" + id="path3660" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:0.60877639px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 256.71172,270.08518 c 20.26767,0 40.53532,0 60.80299,0" + id="path3662" + inkscape:connector-curvature="0" /> + <path + id="path3664" + d="m 330.81249,271.52738 c 21.09109,0 42.18218,0 63.27327,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 405.48156,270.99405 c 21.26538,0 42.53076,0 63.79615,0" + id="path3666" + inkscape:connector-curvature="0" /> + <g + id="g10542" + transform="matrix(1,0,0,-1,0,653.98815)" + style="fill:#eeeeec;fill-opacity:1"> + <rect + ry="4.7797003" + y="351.5274" + x="480.04877" + height="64" + width="63.461262" + id="rect3630" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect8437" + width="63.461262" + height="33.005924" + x="480.04877" + y="351.5274" + ry="2.4649756" /> + <path + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 480.14581,384.59406 c 21.08993,0 42.17982,0 63.26974,0" + id="path3668" + inkscape:connector-curvature="0" /> + </g> + <path + id="path3670" + d="m 554.81489,271.52738 c 21.26539,0 42.53076,0 63.79615,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 629.47916,270.99405 c 21.09109,0 42.18217,0 63.27327,0" + id="path3672" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 704.14582,271.52738 c 21.0911,0 42.18218,0 63.27327,0" + id="path3674" + inkscape:connector-curvature="0" /> + <path + id="path3678" + d="m 779.24757,270.99405 c 21.0911,0 42.18218,0 63.27327,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <text + id="text3680" + y="262.07977" + x="259.86594" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="262.07977" + x="259.86594" + id="tspan3682" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;stroke-width:1.06666672">D</tspan></text> + <text + id="text3684" + y="295.7149" + x="260.63126" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="295.7149" + x="260.63126" + id="tspan3686" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">d</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="335.79037" + y="293.96075" + id="text3688"><tspan + sodipodi:role="line" + id="tspan3690" + x="335.79037" + y="293.96075" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">f</tspan></text> + <text + id="text3692" + y="293.27176" + x="409.74942" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="293.27176" + x="409.74942" + id="tspan3694" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">g</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="483.63565" + y="292.44882" + id="text3696"><tspan + sodipodi:role="line" + id="tspan3698" + x="483.63565" + y="292.44882" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">h</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="563.19849" + y="293.46237" + id="text3700"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3702" + x="563.19849" + y="293.46237">j</tspan></text> + <text + id="text3704" + y="298.28571" + x="630.01605" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + y="298.28571" + x="630.01605" + id="tspan3706" + sodipodi:role="line">k</tspan></text> + <g + id="g10537" + transform="translate(0,-112.47259)" + style="fill:#eeeeec;fill-opacity:1"> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect8447" + width="63.461262" + height="64" + x="704" + y="350.93332" + ry="4.7797003" /> + <rect + ry="2.3898501" + y="382.93332" + x="704" + height="32" + width="63.461262" + id="rect8449" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <path + id="path8451" + d="m 704.33984,383.97137 c 21.08993,0 42.17982,0 63.26974,0" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <text + id="text3708" + y="297.45032" + x="708.60419" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + y="297.45032" + x="708.60419" + id="tspan3710" + sodipodi:role="line">l</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="781.47919" + y="292.20032" + id="text3716"><tspan + sodipodi:role="line" + id="tspan3718" + x="781.47919" + y="292.20032" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">;</tspan></text> + <rect + ry="4.7797003" + y="238.46074" + x="854.2525" + height="64" + width="63.461262" + id="rect3720" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <path + id="path3724" + d="m 854.35172,271.52738 c 21.26539,0 42.53077,0 63.79615,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <rect + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3722" + width="137.60541" + height="64" + x="929.06122" + y="238.46074" + ry="4.7797003" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="858.5" + y="296.23157" + id="text3728"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3730" + x="858.5" + y="296.23157">'</tspan></text> + <text + id="text3740" + y="279.57574" + x="929.25153" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="279.57574" + x="929.25153" + id="tspan3742" + sodipodi:role="line" + style="font-size:21.33333397px;line-height:1.25;stroke-width:1.06666672">↲</tspan></text> + <rect + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3764" + width="64" + height="64" + x="116.89825" + y="313.12741" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="313.12741" + x="192.05182" + height="64" + width="63.461262" + id="rect3766" + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3770" + width="63.461262" + height="64" + x="341.38516" + y="313.12741" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="313.12741" + x="416.04898" + height="64" + width="63.461262" + id="rect3772" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + ry="4.7797003" + y="313.12741" + x="490.71542" + height="64" + width="63.461262" + id="rect3778" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3780" + width="63.948242" + height="64" + x="789.82019" + y="313.12741" + ry="4.7797003" /> + <text + id="text3796" + y="368.70032" + x="126.76303" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="368.70032" + x="126.76303" + id="tspan3798" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">z</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="199.07387" + y="367.11551" + id="text3800"><tspan + sodipodi:role="line" + id="tspan3802" + x="199.07387" + y="367.11551" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">x</tspan></text> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 117.53621,345.12738 c 21.26539,0 42.53077,0 63.79615,0" + id="path3804" + inkscape:connector-curvature="0" /> + <path + id="path3806" + d="m 192.14582,345.66071 c 21.0911,0 42.18218,0 63.27327,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <rect + ry="4.7797003" + y="313.12741" + x="266.23157" + height="64" + width="64.538773" + id="rect3768" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <path + id="path3808" + d="m 267.37839,344.75185 c 20.26767,0 40.53532,0 60.80299,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.06666672;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 341.47916,346.19405 c 21.09109,0 42.18217,0 63.27327,0" + id="path3810" + inkscape:connector-curvature="0" /> + <path + id="path3812" + d="m 416.14822,345.66071 c 21.26539,0 42.53077,0 63.79615,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 490.81248,346.19405 c 21.08993,0 42.17982,0 63.26974,0" + id="path3814" + inkscape:connector-curvature="0" /> + <g + id="g7140" + transform="translate(0,16.594076)" + style="fill:#eeeeec;fill-opacity:1"> + <rect + ry="4.7797003" + y="296.53333" + x="565.38226" + height="64" + width="63.461262" + id="rect3774" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect7131" + width="63.461262" + height="32" + x="565.38226" + y="328.53333" + ry="2.3898501" /> + <path + id="path3816" + d="m 565.48156,329.6 c 21.26538,0 42.53076,0 63.79615,0" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + id="g7162" + transform="translate(0,16.594076)" + style="fill:#babdb6;fill-opacity:1"> + <rect + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3776" + width="63.461262" + height="64" + x="640.05176" + y="296.53333" + ry="4.7797003" /> + <rect + ry="2.3898501" + y="328.53333" + x="640.05176" + height="32" + width="63.461262" + id="rect7160" + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <path + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 640.14582,329.06667 c 21.0911,0 42.18218,0 63.27327,0" + id="path3818" + inkscape:connector-curvature="0" /> + </g> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 789.91424,345.66071 c 21.09109,0 42.18218,0 63.27327,0" + id="path3822" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="271.65314" + y="368.61978" + id="text3828"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3830" + x="271.65314" + y="368.61978">c</tspan></text> + <text + id="text3832" + y="368.62741" + x="348.59036" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="368.62741" + x="348.59036" + id="tspan3834" + sodipodi:role="line">v</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="420.34647" + y="367.93842" + id="text3836"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3838" + x="420.34647" + y="367.93842">b</tspan></text> + <text + id="text3840" + y="368.05829" + x="494.32407" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + y="368.05829" + x="494.32407" + id="tspan3842" + sodipodi:role="line">n</tspan></text> + <text + id="text3844" + y="368.12903" + x="573.86517" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="368.12903" + x="573.86517" + id="tspan3846" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">m</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="643.82837" + y="367.86551" + id="text3848"><tspan + sodipodi:role="line" + id="tspan3850" + x="643.82837" + y="367.86551" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">,</tspan></text> + <g + id="g7167" + transform="translate(74.666662,16.594076)" + style="fill:#eeeeec;fill-opacity:1"> + <rect + ry="4.7797003" + y="296.53333" + x="640.05176" + height="64" + width="63.461262" + id="rect7169" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect7171" + width="63.461262" + height="32" + x="640.05176" + y="328.53333" + ry="2.3898501" /> + <path + id="path7173" + d="m 640.14582,329.06667 c 21.0911,0 42.18218,0 63.27327,0" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="718.6156" + y="367.46667" + id="text3852"><tspan + sodipodi:role="line" + id="tspan3854" + x="718.6156" + y="367.46667" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">.</tspan></text> + <text + id="text3856" + y="367.10361" + x="798.54919" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="367.10361" + x="798.54919" + id="tspan3858" + sodipodi:role="line">/</tspan></text> + <rect + ry="4.7797003" + y="89.127388" + x="85.333328" + height="64" + width="64" + id="rect3876" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3878" + width="63.461262" + height="64" + x="160.48691" + y="89.127388" + ry="4.7797003" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect10511" + width="63.461262" + height="64" + x="235.15358" + y="89.127388" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="89.127388" + x="309.82025" + height="64" + width="63.461262" + id="rect3882" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3884" + width="63.461262" + height="64" + x="384.48407" + y="89.127388" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="89.127388" + x="533.81738" + height="64" + width="63.461262" + id="rect3886" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3888" + width="63.461262" + height="64" + x="608.48688" + y="89.127388" + ry="4.7797003" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3890" + width="63.461262" + height="64" + x="459.15051" + y="89.127388" + ry="4.7797003" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3892" + width="63.461262" + height="64" + x="757.33331" + y="89.127388" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="89.127388" + x="832.48688" + height="64" + width="63.461262" + id="rect3894" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + ry="4.7797003" + y="89.127388" + x="683.1535" + height="64" + width="63.461262" + id="rect3896" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="88.721916" + y="145.3714" + id="text3910"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3912" + x="88.721916" + y="145.3714">1</tspan></text> + <text + id="text3914" + y="144.91666" + x="162.87187" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="144.91666" + x="162.87187" + id="tspan3916" + sodipodi:role="line">2</tspan></text> + <path + id="path3918" + d="m 85.971291,121.12738 c 21.265389,0 42.530769,0 63.796159,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 160.58091,121.66071 c 21.09109,0 42.18217,0 63.27327,0" + id="path3920" + inkscape:connector-curvature="0" /> + <path + id="path3924" + d="m 309.91424,122.19405 c 21.09109,0 42.18218,0 63.27327,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 384.58331,121.66071 c 21.26538,0 42.53076,0 63.79615,0" + id="path3926" + inkscape:connector-curvature="0" /> + <path + id="path3928" + d="m 459.24756,122.19405 c 21.08993,0 42.17982,0 63.26974,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.1617893px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + id="path3930" + d="m 533.91664,122.19405 c 21.26539,0 42.53076,0 63.79615,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 608.58091,121.66071 c 21.09109,0 42.18217,0 63.27327,0" + id="path3932" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 683.24757,122.19405 c 21.0911,0 42.18218,0 63.27327,0" + id="path3934" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 757.91664,122.19405 c 21.26539,0 42.53076,0 63.79615,0" + id="path3936" + inkscape:connector-curvature="0" /> + <path + id="path3938" + d="m 832.58091,121.66071 c 21.09109,0 42.18217,0 63.27327,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 235.24757,122.19405 c 21.0911,0 42.18218,0 63.27327,0" + id="path10513" + inkscape:connector-curvature="0" /> + <text + id="text3944" + y="144.91666" + x="239.48438" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="144.91666" + x="239.48438" + id="tspan3946" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">3</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="312.26355" + y="145.3714" + id="text3948"><tspan + sodipodi:role="line" + id="tspan3950" + x="312.26355" + y="145.3714" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">4</tspan></text> + <text + id="text3952" + y="144.79477" + x="386.92606" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="144.79477" + x="386.92606" + id="tspan3954" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">5</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="461.15417" + y="144.91666" + id="text3956"><tspan + sodipodi:role="line" + id="tspan3958" + x="461.15417" + y="144.91666" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">6</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="536.29688" + y="145.06665" + id="text3960"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3962" + x="536.29688" + y="145.06665">7</tspan></text> + <text + id="text3964" + y="144.79477" + x="611.03851" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="144.79477" + x="611.03851" + id="tspan3966" + sodipodi:role="line">8</tspan></text> + <text + id="text3968" + y="144.82977" + x="686.55652" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="144.82977" + x="686.55652" + id="tspan3970" + sodipodi:role="line">9</tspan></text> + <text + id="text3972" + y="144.57379" + x="760.35419" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="144.57379" + x="760.35419" + id="tspan3974" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">0</tspan></text> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3976" + width="63.461262" + height="64" + x="906.71844" + y="89.127388" + ry="4.7797003" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 906.81249,121.66071 c 21.09109,0 42.18218,0 63.27327,0" + id="path3978" + inkscape:connector-curvature="0" /> + <rect + ry="4.7797003" + y="89.127388" + x="11.153512" + height="64" + width="63.461262" + id="rect3980" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <path + id="path3982" + d="m 11.247578,121.66071 c 21.091093,0 42.182176,0 63.273269,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="840.27075" + y="143.8774" + id="text3988"><tspan + sodipodi:role="line" + id="tspan3990" + x="840.27075" + y="143.8774" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">-</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="913.50781" + y="144.89095" + id="text3992"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3994" + x="913.50781" + y="144.89095">=</tspan></text> + <rect + ry="4.7797003" + y="89.127388" + x="981.67877" + height="64" + width="95.078056" + id="rect3996" + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <text + id="text4004" + y="141.20207" + x="992.40417" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="141.20207" + x="992.40417" + id="tspan4006" + sodipodi:role="line" + style="font-size:13.86666679px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">Backspace</tspan></text> + <text + id="text4977" + y="117.46353" + x="89.259377" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="117.46353" + x="89.259377" + id="tspan4979" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">!</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="162.17561" + y="116.44883" + id="text4981"><tspan + sodipodi:role="line" + id="tspan4983" + x="162.17561" + y="116.44883" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">@</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="238.91458" + y="117.86665" + id="text4985"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan4987" + x="238.91458" + y="117.86665">#</tspan></text> + <text + id="text4989" + y="117.96072" + x="311.69211" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="117.96072" + x="311.69211" + id="tspan4991" + sodipodi:role="line">$</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="387.71487" + y="117.27174" + id="text4993"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan4995" + x="387.71487" + y="117.27174">%</tspan></text> + <text + id="text4997" + y="116.44883" + x="461.6011" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="116.44883" + x="461.6011" + id="tspan4999" + sodipodi:role="line">^</tspan></text> + <text + id="text5001" + y="117.46236" + x="536.96692" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="117.46236" + x="536.96692" + id="tspan5003" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">&</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="609.5968" + y="117.19882" + id="text5005"><tspan + sodipodi:role="line" + id="tspan5007" + x="609.5968" + y="117.19882" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">*</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="685.03265" + y="116.44881" + id="text5009"><tspan + sodipodi:role="line" + id="tspan5011" + x="685.03265" + y="116.44881" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">(</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="761.91931" + y="116.12902" + id="text5013"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan5015" + x="761.91931" + y="116.12902">)</tspan></text> + <rect + ry="3.5688117" + y="387.40637" + x="254.19489" + height="47.786243" + width="385.80511" + id="rect5017" + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <g + id="g4061" + transform="translate(0,-7.1714294)"> + <text + id="text5021" + y="422.17459" + x="261.68033" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="422.17459" + x="261.68033" + id="tspan5023" + sodipodi:role="line" + style="font-size:13.86666679px;line-height:1.25;stroke-width:1.06666672">Space</tspan></text> + </g> + <text + id="text6971" + y="339.18835" + x="125.368" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="339.18835" + x="125.368" + id="tspan6973" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">Z</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="197.67885" + y="337.60355" + id="text6975"><tspan + sodipodi:role="line" + id="tspan6977" + x="197.67885" + y="337.60355" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">X</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="271.76355" + y="339.99478" + id="text6979"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan6981" + x="271.76355" + y="339.99478">C</tspan></text> + <text + id="text6983" + y="339.11542" + x="347.19534" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="339.11542" + x="347.19534" + id="tspan6985" + sodipodi:role="line">V</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="418.95145" + y="338.42645" + id="text6987"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan6989" + x="418.95145" + y="338.42645">B</tspan></text> + <text + id="text6991" + y="338.27698" + x="494.1412" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + y="338.27698" + x="494.1412" + id="tspan6993" + sodipodi:role="line">N</tspan></text> + <text + id="text6995" + y="338.6171" + x="572.47015" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="338.6171" + x="572.47015" + id="tspan6997" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">M</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="645.10004" + y="338.35355" + id="text6999"><tspan + sodipodi:role="line" + id="tspan7001" + x="645.10004" + y="338.35355" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"><</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="723.39313" + y="336.84164" + id="text7003"><tspan + sodipodi:role="line" + id="tspan7005" + x="723.39313" + y="336.84164" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="798.75592" + y="337.85516" + id="text7007"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7009" + x="798.75592" + y="337.85516">?</tspan></text> + <text + id="text7027" + y="264.07922" + x="409.74942" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="264.07922" + x="409.74942" + id="tspan7029" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">G</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="483.63565" + y="263.25632" + id="text7031"><tspan + sodipodi:role="line" + id="tspan7033" + x="483.63565" + y="263.25632" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672">H</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="559.00153" + y="264.26987" + id="text7035"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7037" + x="559.00153" + y="264.26987">J</tspan></text> + <text + id="text7039" + y="263.13974" + x="631.41089" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + y="263.13974" + x="631.41089" + id="tspan7041" + sodipodi:role="line">K</tspan></text> + <text + id="text7043" + y="264.96075" + x="708.60419" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + y="264.96075" + x="708.60419" + id="tspan7045" + sodipodi:role="line">L</tspan></text> + <text + id="text7047" + y="263.34451" + x="781.32269" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="263.34451" + x="781.32269" + id="tspan7049" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">:</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="399.83853" + y="187.92427" + id="text7051"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7053" + x="399.83853" + y="187.92427">T</tspan></text> + <text + id="text7055" + y="187.60356" + x="474.54233" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="187.60356" + x="474.54233" + id="tspan7057" + sodipodi:role="line">Y</tspan></text> + <text + id="text7059" + y="187.3317" + x="548.19391" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="187.3317" + x="548.19391" + id="tspan7061" + sodipodi:role="line" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">U</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="621.77612" + y="187.60356" + id="text7063"><tspan + sodipodi:role="line" + id="tspan7065" + x="621.77612" + y="187.60356" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">I</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="698.92633" + y="187.3317" + id="text7067"><tspan + sodipodi:role="line" + id="tspan7069" + x="698.92633" + y="187.3317" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">O</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="771.70312" + y="187.92427" + id="text7071"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7073" + x="771.70312" + y="187.92427">P</tspan></text> + <rect + ry="4.7797003" + y="163.79405" + x="842.71564" + height="64" + width="63.461262" + id="rect7075" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect7077" + width="63.461262" + height="64" + x="917.38507" + y="163.79405" + ry="4.7797003" /> + <rect + ry="4.7797003" + y="163.79405" + x="992.05176" + height="64" + width="85.281578" + id="rect7079" + style="font-size:18px;fill:#babdb6;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <path + id="path7081" + d="m 842.81489,196.86071 c 21.26539,0 42.53076,0 63.79615,0" + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16661239px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.16182172px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 917.47916,196.32738 c 21.09109,0 42.18217,0 63.27327,0" + id="path7083" + inkscape:connector-curvature="0" /> + <path + style="font-size:18px;fill:none;stroke:#000000;stroke-width:1.34042335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 992.33815,196.86071 c 28.07395,0 56.14795,0 84.22195,0" + id="path7085" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="845.2594" + y="219.39616" + id="text7087"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7089" + x="845.2594" + y="219.39616">[</tspan></text> + <text + id="text7091" + y="219.39616" + x="919.95624" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="219.39616" + x="919.95624" + id="tspan7093" + sodipodi:role="line">]</tspan></text> + <text + id="text7095" + y="219.92429" + x="993.08435" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="219.92429" + x="993.08435" + id="tspan7097" + sodipodi:role="line">\</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="844.91248" + y="186.91489" + id="text7099"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7101" + x="844.91248" + y="186.91489">{</tspan></text> + <text + id="text7103" + y="186.91489" + x="918.51251" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="186.91489" + x="918.51251" + id="tspan7105" + sodipodi:role="line">}</tspan></text> + <text + id="text7107" + y="185.39926" + x="993.43127" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + y="185.39926" + x="993.43127" + id="tspan7109" + sodipodi:role="line">|</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot7111" + style="font-size:12.80000019px;line-height:0.01%;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"><flowRegion + id="flowRegion7113" + style="stroke-width:1.06666672"><rect + id="rect7115" + width="12.929953" + height="17.239937" + x="859.84186" + y="230.24284" + style="font-size:21.33333397px;font-family:'DejaVu Sans Mono';stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara7117" + style="font-size:21.33333397px;line-height:1.25;stroke-width:1.06666672">'"l</flowPara></flowRoot> <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="857.28125" + y="264.82532" + id="text7119"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7121" + x="857.28125" + y="264.82532">"</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="20.090919" + y="145.65862" + id="text7123"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7125" + x="20.090919" + y="145.65862">`</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="18.695885" + y="116.14663" + id="text7127"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7129" + x="18.695885" + y="116.14663">~</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="338.80719" + y="208.43478" + id="text7245"><tspan + sodipodi:role="line" + x="338.80719" + y="208.43478" + id="tspan7366" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="338.80719" + y="216.3177" + id="tspan7249" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">reload</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot7342" + style="font-size:12.80000019px;line-height:0.01%;font-family:'DejaVu Sans Mono';stroke-width:1.06666672"><flowRegion + id="flowRegion7344" + style="stroke-width:1.06666672"><rect + id="rect7346" + width="17.453804" + height="36.448208" + x="14.546197" + y="174.75179" + style="font-size:13.86666679px;font-family:'DejaVu Sans Mono';stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara7348" + style="font-size:13.86666679px;line-height:1.25;stroke-width:1.06666672">TabTa</flowPara></flowRoot> <text + id="text7358" + y="199.05951" + x="11.713984" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="199.05951" + x="11.713984" + id="tspan7360" + sodipodi:role="line" + style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">Tab</tspan></text> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect10890" + width="338.15115" + height="41.734409" + x="101.31554" + y="20.999462" + ry="3.116843" /> + <text + id="text7404" + y="49.597778" + x="106.28438" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:condensed;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="49.597778" + x="106.28438" + id="tspan7406" + sodipodi:role="line" + style="font-size:23.46666718px;line-height:1;stroke-width:1.06666672">qutebrowser default bindings</tspan></text> + <text + id="text9514" + y="279.05405" + x="578.2074" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="279.05405" + x="578.2074" + sodipodi:role="line" + id="tspan9524" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="286.93695" + x="578.2074" + sodipodi:role="line" + id="tspan4938" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan + y="294.61697" + x="578.2074" + sodipodi:role="line" + id="tspan4936" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">down</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="650.2074" + y="279.24451" + id="text9526"><tspan + sodipodi:role="line" + x="650.2074" + y="279.24451" + id="tspan9530" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="650.2074" + y="286.9245" + id="tspan4942" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan + id="tspan9532" + sodipodi:role="line" + x="650.2074" + y="294.60449" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">up</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="578.2074" + y="247.81595" + id="text10515"><tspan + sodipodi:role="line" + x="578.2074" + y="247.81595" + id="tspan10517" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="578.2074" + y="255.69887" + id="tspan10519" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">next</tspan><tspan + id="tspan10521" + sodipodi:role="line" + x="578.2074" + y="263.37888" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text> + <text + id="text10523" + y="248.00641" + x="650.2074" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10525" + y="248.00641" + x="650.2074" + sodipodi:role="line" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + id="tspan10527" + y="255.88933" + x="650.2074" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">previous</tspan><tspan + y="263.56934" + x="650.2074" + sodipodi:role="line" + id="tspan10529" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="501.71222" + y="278.67307" + id="text10547"><tspan + sodipodi:role="line" + x="501.71222" + y="278.67307" + id="tspan10560" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="501.71222" + y="286.55597" + id="tspan10574" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan + sodipodi:role="line" + x="501.71222" + y="294.23599" + id="tspan10562" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">left</tspan></text> + <text + id="text10564" + y="278.67307" + x="724.62445" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="278.67307" + x="724.62445" + sodipodi:role="line" + id="tspan10566" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + id="tspan10568" + y="286.55597" + x="724.62445" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan + id="tspan10570" + y="294.23599" + x="724.62445" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">right</tspan></text> + <text + id="text10564-6" + y="199.11761" + x="715.61145" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10570-9" + y="199.11761" + x="715.61145" + sodipodi:role="line" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="207.75761" + x="715.61145" + sodipodi:role="line" + id="tspan4975" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="215.64053" + x="715.61145" + sodipodi:role="line" + id="tspan4977" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">open <tspan + style="fill:#ff0000;stroke-width:1.06666672" + id="tspan3697">(6)</tspan></tspan></text> + <text + id="text10564-3" + y="166.45094" + x="714.94476" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10570-6" + y="166.45094" + x="714.94476" + sodipodi:role="line" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="174.33386" + x="714.94476" + sodipodi:role="line" + id="tspan4996" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">open in</tspan><tspan + y="182.01385" + x="714.94476" + sodipodi:role="line" + id="tspan4998" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">new tab<tspan + style="fill:#ff0000;stroke-width:1.06666672" + id="tspan3699" /></tspan><tspan + y="189.69386" + x="714.94476" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan3701"><tspan + style="fill:#ff0000;stroke-width:1.06666672" + id="tspan3703">(6)</tspan></tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="282.57269" + y="279.80652" + id="text10547-2"><tspan + sodipodi:role="line" + x="282.57269" + y="279.80652" + id="tspan10560-6" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="282.57269" + y="287.68942" + id="tspan10562-1" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">close</tspan><tspan + sodipodi:role="line" + x="282.57269" + y="295.36945" + id="tspan5970" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="351.18723" + y="272.2189" + id="text10547-2-1"><tspan + sodipodi:role="line" + x="351.18723" + y="272.2189" + id="tspan10560-6-1" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="351.18723" + y="280.10181" + id="tspan5062" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">hint</tspan><tspan + sodipodi:role="line" + x="351.18723" + y="287.78183" + id="tspan5066" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">(label</tspan><tspan + sodipodi:role="line" + x="351.18723" + y="295.46182" + id="tspan6140" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">links) <tspan + style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672" + id="tspan3723">(8)</tspan></tspan></text> + <text + id="text9514-6" + y="201.01891" + x="564.76721" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="201.01891" + x="564.76721" + sodipodi:role="line" + id="tspan9524-9" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="208.90182" + x="564.76721" + sodipodi:role="line" + id="tspan4936-0" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">undo</tspan><tspan + y="216.58182" + x="564.76721" + sodipodi:role="line" + id="tspan5968" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">closing</tspan><tspan + y="224.26183" + x="564.76721" + sodipodi:role="line" + id="tspan5436" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text> + <text + id="text9514-4" + y="205.01891" + x="638.90051" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="205.01891" + x="638.90051" + sodipodi:role="line" + id="tspan4936-5" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="212.90182" + x="638.90051" + sodipodi:role="line" + id="tspan5132" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">insert-</tspan><tspan + y="220.58182" + x="638.90051" + sodipodi:role="line" + id="tspan5136" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mode</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="840.11176" + y="108.99891" + id="text3988-2"><tspan + sodipodi:role="line" + id="tspan3990-4" + x="840.11176" + y="108.99891" + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">_</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="913.50781" + y="110.18444" + id="text3992-3"><tspan + style="font-size:19.20000076px;line-height:1.25;font-family:'DejaVu Sans Mono';fill:#0000ff;stroke-width:1.06666672" + sodipodi:role="line" + id="tspan3994-3" + x="913.50781" + y="110.18444">+</tspan></text> + <text + id="text9514-6-5" + y="129.16545" + x="856.87421" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="129.16545" + x="856.87421" + sodipodi:role="line" + id="tspan9524-9-4" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="137.04837" + x="856.87421" + sodipodi:role="line" + id="tspan4936-0-0" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">zoom</tspan><tspan + y="144.72836" + x="856.87421" + sodipodi:role="line" + id="tspan6188" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">out</tspan></text> + <text + id="text9514-6-1" + y="96" + x="930.13336" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="96" + x="930.13336" + sodipodi:role="line" + id="tspan9524-9-1" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="103.68" + x="930.13336" + sodipodi:role="line" + id="tspan4936-0-6" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">zoom</tspan><tspan + y="111.36" + x="930.13336" + sodipodi:role="line" + id="tspan5593" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">in</tspan></text> + <text + id="text9514-6-1-2" + y="133.00302" + x="929.7572" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="133.00302" + x="929.7572" + sodipodi:role="line" + id="tspan9524-9-1-6" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">set</tspan><tspan + y="140.68301" + x="929.7572" + sodipodi:role="line" + id="tspan5252" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">zoom</tspan><tspan + y="148.36302" + x="929.7572" + sodipodi:role="line" + id="tspan4936-0-6-8" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">level</tspan></text> + <rect + ry="4.7797003" + y="14.834106" + x="12.374795" + height="64" + width="63.461262" + id="rect3980-8" + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" /> + <text + id="text7358-4" + y="29.305208" + x="18.544792" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="29.305208" + x="18.544792" + id="tspan7360-3" + sodipodi:role="line" + style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672">Esc</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="351.18723" + y="242.80072" + id="text10547-2-1-5"><tspan + sodipodi:role="line" + x="351.18723" + y="242.80072" + id="tspan10560-6-1-1" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="351.18723" + y="250.68364" + id="tspan5062-4" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">hint</tspan><tspan + sodipodi:role="line" + x="351.18723" + y="258.36365" + id="tspan5066-3" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">(new</tspan><tspan + sodipodi:role="line" + x="351.18723" + y="266.04364" + id="tspan6144" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab)</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="501.71222" + y="251.41891" + id="text10547-23"><tspan + sodipodi:role="line" + x="501.71222" + y="251.41891" + id="tspan10560-1" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="501.71222" + y="259.30182" + id="tspan10562-12" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">back <tspan + style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672" + id="tspan3586">(7)</tspan></tspan></text> + <text + id="text10564-6-7" + y="239.34317" + x="724.62445" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10570-9-4" + y="239.34317" + x="724.62445" + sodipodi:role="line" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="247.98317" + x="724.62445" + sodipodi:role="line" + id="tspan4975-2" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="255.86609" + x="724.62445" + sodipodi:role="line" + id="tspan4977-3" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">forward</tspan><tspan + y="263.54608" + x="724.62445" + sodipodi:role="line" + id="tspan3588" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(7)</tspan></text> + <text + id="text10564-6-7-8" + y="347.8989" + x="814.39789" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10570-9-4-6" + y="347.8989" + x="814.39789" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="355.57889" + x="814.39789" + sodipodi:role="line" + id="tspan4975-2-8" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="363.25888" + x="814.39789" + sodipodi:role="line" + id="tspan4977-3-1" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">search</tspan></text> + <text + id="text10564-6-7-8-3" + y="238.93333" + x="800" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10570-9-4-6-2" + y="238.93333" + x="800" + sodipodi:role="line" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="247.57333" + x="800" + sodipodi:role="line" + id="tspan4975-2-8-1" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="255.45625" + x="800" + sodipodi:role="line" + id="tspan4977-3-1-5" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">cmd</tspan><tspan + y="263.13626" + x="800" + sodipodi:role="line" + id="tspan5435" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mode</tspan></text> + <text + id="text9514-60" + y="353.55225" + x="511.70053" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="353.55225" + x="511.70053" + sodipodi:role="line" + id="tspan9524-92" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="361.23224" + x="511.70053" + sodipodi:role="line" + id="tspan4936-8" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">search</tspan><tspan + y="368.91223" + x="511.70053" + sodipodi:role="line" + id="tspan5466" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">next</tspan></text> + <text + id="text9514-60-7" + y="319.95224" + x="511.99792" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="319.95224" + x="511.99792" + sodipodi:role="line" + id="tspan9524-92-1" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="327.63223" + x="511.99792" + sodipodi:role="line" + id="tspan4936-8-5" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">search</tspan><tspan + y="335.31223" + x="511.99792" + sodipodi:role="line" + id="tspan5466-8" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">prev</tspan></text> + <text + id="text9514-60-8" + y="355.28558" + x="588.79791" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="355.28558" + x="588.79791" + sodipodi:role="line" + id="tspan5524" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">save</tspan><tspan + y="362.96558" + x="588.79791" + sodipodi:role="line" + id="tspan5530" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">quick-</tspan><tspan + y="370.64557" + x="588.79791" + sodipodi:role="line" + id="tspan5532" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mark</tspan></text> + <text + id="text9514-8" + y="204.21892" + x="490.50494" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="204.21892" + x="490.50494" + sodipodi:role="line" + id="tspan9524-5" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="212.10184" + x="490.50494" + sodipodi:role="line" + id="tspan4938-4" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">yank/</tspan><tspan + y="219.78183" + x="490.50494" + sodipodi:role="line" + id="tspan4936-1" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">copy <tspan + style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672" + id="tspan5713">(1)</tspan></tspan></text> + <text + id="text9514-8-9" + y="206.18428" + x="788.66119" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="206.18428" + x="788.66119" + sodipodi:role="line" + id="tspan9524-5-1" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="214.0672" + x="788.66119" + sodipodi:role="line" + id="tspan6096" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">paste</tspan><tspan + y="221.74719" + x="788.66119" + sodipodi:role="line" + id="tspan5366" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(2)</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5590" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion + id="flowRegion5592" + style="font-family:sans-serif;stroke-width:1.06666672px"><rect + id="rect5594" + width="552" + height="56" + x="518.66669" + y="25.333334" + style="font-size:10.66666698px;font-family:sans-serif;stroke-width:1.13777781px" /></flowRegion><flowPara + id="flowPara5596" + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672px"> </flowPara></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5598" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5600" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5602" + width="582.66669" + height="61.333332" + x="501.33334" + y="14.933333" + style="font-size:10.66666698px;font-family:sans-serif;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5604" + style="font-size:13.86666679px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672">Website: https://www.qutebrowser.org/ </flowPara><flowPara + id="flowPara5595" + style="font-size:13.86666679px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672">IRC: #qutebrowser on Freenode</flowPara><flowPara + id="flowPara5597" + style="font-size:13.86666679px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672">Mailinglist: qutebrowser@lists.qutebrowser.org</flowPara></flowRoot> <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="425.7652" + y="241.39365" + id="text10547-23-6"><tspan + sodipodi:role="line" + x="425.7652" + y="241.39365" + id="tspan10560-1-3" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="425.7652" + y="250.03365" + id="tspan10574-1-0" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672">s<tspan + style="font-size:8.53333378px;stroke-width:1.06666672" + id="tspan5591">croll to</tspan></tspan><tspan + sodipodi:role="line" + x="425.7652" + y="257.91656" + id="tspan5633" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">bottom/</tspan><tspan + sodipodi:role="line" + x="425.7652" + y="265.59656" + id="tspan5461" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">perc.</tspan><tspan + sodipodi:role="line" + x="425.7652" + y="273.27655" + id="tspan10562-12-5" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan></text> + <text + id="text9514-60-7-7" + y="349.15512" + x="437.06458" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="349.15512" + x="437.06458" + sodipodi:role="line" + id="tspan9524-92-1-3" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="356.83511" + x="437.06458" + sodipodi:role="line" + id="tspan4936-8-5-9" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">load</tspan><tspan + y="364.51511" + x="437.06458" + sodipodi:role="line" + id="tspan5466-8-8" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">quick-</tspan><tspan + y="372.19513" + x="437.06458" + sodipodi:role="line" + id="tspan6184" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mark <tspan + style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672" + id="tspan3727">(8)</tspan></tspan></text> + <text + id="text9514-60-7-7-0" + y="315.02179" + x="436.65286" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="315.02179" + x="436.65286" + sodipodi:role="line" + id="tspan9524-92-1-3-7" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="322.70178" + x="436.65286" + sodipodi:role="line" + id="tspan4936-8-5-9-8" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">load</tspan><tspan + y="330.38177" + x="436.65286" + sodipodi:role="line" + id="tspan5466-8-8-0" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">quickm.</tspan><tspan + y="338.0618" + x="436.65286" + sodipodi:role="line" + id="tspan6186" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">(tab)</tspan><tspan + y="345.74179" + x="436.65286" + sodipodi:role="line" + id="tspan5689" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5691" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695" + width="344" + height="173.33333" + x="18.666666" + y="437.55823" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5697" + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan5705">(1)</flowSpan> copying/yanking:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5701">yy - copy/yank URL</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5703">yY - copy URL to selection</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5707">yt - copy title to clipboard</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5709">yT - copy title to selection</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5711"> </flowPara></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5691-0" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + transform="translate(0,-10)"><flowRegion + id="flowRegion5693-7" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-0" + width="344" + height="173.33333" + x="19.42783" + y="520.07886" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5697-9" + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan5705-5">(2)</flowSpan> pasting:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5701-9">pp - open URL from clipboard</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5703-8">pP - open URL from selection</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5707-0">Pp - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan6101">pp</flowSpan>, in new tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5709-3">PP - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan6103">pP</flowSpan>, in new tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5763">wp - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan6105">pp</flowSpan>, in new window</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5765">wP - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan6107">pP</flowSpan>, in new window</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5711-1"> </flowPara></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5691-0-9" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-7-0" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-0-5" + width="344" + height="173.33333" + x="201.3311" + y="437.55823" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672" + id="flowPara5701-9-6"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan5705-5-8">(3)</flowSpan> navigation:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5829">[[ - click "previous"-link on page</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5703-8-2">]] - click "next"-link on page </flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5707-0-7">{{ - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan6111">[[</flowSpan>, in new tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5709-3-1">}} - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan6109">]]</flowSpan>, in new tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5835"><Ctrl-A> - increment no. in URL</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5837"><Ctrl-X> - decrement no. in URL</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5841"> </flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5839" /><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5711-1-8" /></flowRoot> <text + id="text9514-8-9-0" + y="215.27605" + x="867.20831" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="215.27605" + x="867.20831" + sodipodi:role="line" + id="tspan4936-1-1-9" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(3)</tspan></text> + <text + id="text9514-8-9-0-3" + y="184.34271" + x="867.20831" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="184.34271" + x="867.20831" + sodipodi:role="line" + id="tspan4936-1-1-9-7" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(3)</tspan></text> + <text + id="text9514-8-9-0-2" + y="215.27605" + x="947.20831" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="215.27605" + x="947.20831" + sodipodi:role="line" + id="tspan4936-1-1-9-5" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(3)</tspan></text> + <text + id="text9514-8-9-0-6" + y="184.34271" + x="947.20831" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="184.34271" + x="947.20831" + sodipodi:role="line" + id="tspan4936-1-1-9-2" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(3)</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5691-4" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-9" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-9" + width="344" + height="173.33333" + x="199.82608" + y="546.74548" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5697-3" + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan5705-0">(4)</flowSpan> scrolling:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5701-8"><Ctrl-F> - page down</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5707-9"><Ctrl-B> - page up</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5962"><Ctrl-D> - half page down</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5711-7"><Ctrl-U> - half page up</flowPara></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5691-4-9" + style="font-style:normal;font-weight:bold;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-9-1" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-9-8" + width="344" + height="173.33333" + x="403.53775" + y="437.55823" + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672" + id="flowPara4171">in prompt mode:</flowPara><flowPara + style="font-weight:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara4175">Enter - accept prompt</flowPara><flowPara + style="font-weight:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara4177">y - answer yes to prompt</flowPara><flowPara + style="font-weight:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara4179">n - answer no to prompt</flowPara><flowPara + style="font-weight:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara6016"> </flowPara></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5691-0-9-9" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;-inkscape-font-specification:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-7-0-2" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-0-5-6" + width="344" + height="173.33333" + x="403.54816" + y="496.42233" + style="font-style:normal;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + style="font-style:normal;font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672" + id="flowPara5701-9-6-8"><flowSpan + style="font-style:normal;font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan5705-5-8-3">(6)</flowSpan> opening:</flowPara><flowPara + style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara5829-1">go - edit & open current URL</flowPara><flowPara + style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara5703-8-2-8">gO - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan6132">go</flowSpan>, in new tab</flowPara><flowPara + style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara3581">xO - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan6134">go</flowSpan>, in bg. tab</flowPara><flowPara + style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara5709-3-1-6">xo - open in background tab</flowPara><flowPara + style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara5841-1">wo - open in new window</flowPara><flowPara + style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara5839-8"> </flowPara><flowPara + style="font-style:normal;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:Sans;fill:#000000;stroke-width:1.06666672" + id="flowPara5711-1-8-7" /></flowRoot> <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="425.7652" + y="272.26849" + id="text10547-23-6-1"><tspan + sodipodi:role="line" + x="425.7652" + y="272.26849" + id="tspan10560-1-3-8" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="425.7652" + y="280.1514" + id="tspan10574-1-0-7" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">gg: <tspan + style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672" + id="tspan3812">(10)</tspan></tspan><tspan + sodipodi:role="line" + x="425.7652" + y="287.83142" + id="tspan6176" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">scroll</tspan><tspan + sodipodi:role="line" + x="425.7652" + y="295.51141" + id="tspan5633-2" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">to top</tspan><tspan + sodipodi:role="line" + x="425.7652" + y="303.19141" + id="tspan10562-12-5-9" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="26.836851" + y="44.101078" + id="text10547-2-5"><tspan + sodipodi:role="line" + x="26.836851" + y="44.101078" + id="tspan10560-6-4" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="26.836851" + y="51.983994" + id="tspan5970-5" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">normal</tspan><tspan + sodipodi:role="line" + x="26.836851" + y="59.663994" + id="tspan6219" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mode</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5691-4-9-3" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-9-1-7" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-9-8-7" + width="344" + height="173.33333" + x="404.05209" + y="582.96967" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5697-3-7-6" + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan5705-0-4-7">(7)</flowSpan> back/forward:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara5701-8-5-8"><flowSpan + style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672" + id="flowSpan5463">th</flowSpan> - back (in new tab)</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara6016-5"><flowSpan + style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672" + id="flowSpan5465">wh</flowSpan> - back (in new window)</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3628"><flowSpan + style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672" + id="flowSpan5467">tl</flowSpan> - forward (in new tab)</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3630"><flowSpan + style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672" + id="flowSpan5469">wl</flowSpan> - forward (in new window)</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3626"> </flowPara></flowRoot> <text + id="text10564-6-7-8-3-5" + y="270.24557" + x="800" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10570-9-4-6-2-6" + y="270.24557" + x="800" + sodipodi:role="line" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="278.88559" + x="800" + sodipodi:role="line" + id="tspan4975-2-8-1-6" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="286.76849" + x="800" + sodipodi:role="line" + id="tspan4977-3-1-5-7" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">ext.</tspan><tspan + y="294.44849" + x="800" + sodipodi:role="line" + id="tspan5435-7" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">hints <tspan + style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672" + id="tspan3662">(9)</tspan></tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5691-4-9-3-6" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-9-1-7-3" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-9-8-7-7" + width="344" + height="173.33333" + x="579.90106" + y="437.54779" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5697-3-7-6-8" + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672">(8)</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3626-7">prefix with w - in new window</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3725"> </flowPara></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5691-4-9-3-1" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-9-1-7-1" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-9-8-7-5" + width="344" + height="173.33333" + x="579.36774" + y="489.80301" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5697-3-7-6-1" + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan5705-0-4-7-6">(9)</flowSpan> extended hint mode:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3626-73">;b - open hint in background tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4051">;f - open hint in foreground tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3788">;h - hover over hint (mouse-over)</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3790">;i - hint images</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3792">;I - hint images in new tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara6096">;t - hint inputs</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3794">;o - put hinted URL in cmd. line</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3796">;O - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan3798">;o</flowSpan>, in new tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3800">;y - yank hinted URL to clipboard</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3802">;Y - yank hinted URL to selection</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3804">;r - rapid hinting</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3806">;R - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan3810">;r</flowSpan>, in new window</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3808">;d - download hinted URL</flowPara></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot5691-4-9-3-6-1" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-9-1-7-3-5" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-9-8-7-7-0" + width="165.23355" + height="256.78436" + x="772.63074" + y="437.55823" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5697-3-7-6-8-2" + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan3852">(10)</flowSpan> misc. commands:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3725-0">gt - switch tabs by name</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4052"><flowSpan + style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672" + id="flowSpan4054">gm/gl/gr</flowSpan> - move tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4056"> (to index/left/right)</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3858">gC - clone tab </flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3860">gf - view page source</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3915">gu - navigate up in URL</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3917">gU - like <flowSpan + style="font-style:italic;font-family:sans-serif;-inkscape-font-specification:'Sans Italic';stroke-width:1.06666672" + id="flowSpan3923">gu</flowSpan>, in new tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3921">sf - save config</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3925">ss - set setting</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3927">sl - set temp. setting</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3929">sk - bind key</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3931">Ss - show settings</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3937">wi - open web inspector</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4167">gd - download page</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4169"><flowSpan + style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672" + id="flowSpan5438">ad</flowSpan> - cancel download</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4077">co - close other tabs</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4081">cd - clear downloads</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3933"> </flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3935" /><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4079" /></flowRoot> <text + id="text9514-8-9-0-8" + y="217.88069" + x="201.04399" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="217.88069" + x="201.04399" + sodipodi:role="line" + id="tspan4936-1-1-9-59" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(10)</tspan></text> + <text + id="text9514-8-9-0-8-4" + y="257.17371" + x="208.27393" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="257.17371" + x="208.27393" + sodipodi:role="line" + id="tspan4936-1-1-9-59-8" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(10)</tspan></text> + <text + id="text9514-8-9-0-8-7" + y="291.00937" + x="208.27393" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="291.00937" + x="208.27393" + sodipodi:role="line" + id="tspan4936-1-1-9-59-5" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(10)</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5691-4-9-3-6-1-2" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-9-1-7-3-5-2" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-9-8-7-7-0-9" + width="350.20157" + height="196.89922" + x="915.77972" + y="437.55823" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + id="flowPara5697-3-7-6-8-2-0" + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan3852-6">(11)</flowSpan> modifier commands:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3933-6"><Alt-num> - select tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4128"><Ctrl-Tab> - select prev. tab</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4130"><Ctrl-V> - passthrough mode</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4132"><Ctrl-Q> - quit</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4136"><Ctrl-H> - home</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4138"><Ctrl-S> - stop loading</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4140"><Ctrl-Alt-P> - print</flowPara><flowPara + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672" + id="flowPara4142">in insert mode:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4144"><Ctrl-E> - open editor</flowPara><flowPara + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672" + id="flowPara4146">in command mode:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara4148"><Ctrl-P> - prev. history item</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3935-9"><Ctrl-N> - next history item</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara6189"><Ctrl-D> - delete current item</flowPara></flowRoot> <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3764-9" + width="64" + height="49.059277" + x="179.54729" + y="386.13333" + ry="3.6638854" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3764-9-3" + width="64" + height="49.059277" + x="51.100777" + y="386.13333" + ry="3.6638854" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3764-9-1" + width="64" + height="49.059277" + x="654.73492" + y="386.13333" + ry="3.6638854" /> + <rect + style="font-size:18px;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.06666672" + id="rect3764-9-7" + width="64" + height="49.059277" + x="779.16278" + y="386.13333" + ry="3.6638854" /> + <g + id="g4049" + transform="translate(1.4643921,-2.0969564)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="66.420761" + y="411.5079" + id="text7358-8"><tspan + style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7360-1" + x="66.420761" + y="411.5079">Ctrl</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="71.803055" + y="426.94736" + id="text9514-8-9-0-8-4-0"><tspan + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672" + id="tspan4936-1-1-9-59-8-3" + sodipodi:role="line" + x="71.803055" + y="426.94736">(11)</tspan></text> + </g> + <g + id="g4055" + transform="translate(1.7364258,-12.763623)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="198.77023" + y="422.17459" + id="text7358-8-3-8-1"><tspan + style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7360-1-7-0-2" + x="198.77023" + y="422.17459">Alt</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="199.97752" + y="437.61404" + id="text9514-8-9-0-8-4-0-8"><tspan + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672" + id="tspan4936-1-1-9-59-8-3-8" + sodipodi:role="line" + x="199.97752" + y="437.61404">(11)</tspan></text> + </g> + <g + id="g4065" + transform="translate(6.0870443,-12.763623)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="669.60724" + y="422.17459" + id="text7358-8-3-8"><tspan + style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7360-1-7-0" + x="669.60724" + y="422.17459">Alt</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="670.81451" + y="437.61404" + id="text9514-8-9-0-8-4-0-7"><tspan + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672" + id="tspan4936-1-1-9-59-8-3-82" + sodipodi:role="line" + x="670.81451" + y="437.61404">(11)</tspan></text> + </g> + <g + id="g4071" + transform="translate(1.0914714,-12.763623)"> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans Mono';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="794.85565" + y="422.17459" + id="text7358-8-3"><tspan + style="font-size:12.80000019px;line-height:1.25;font-family:'DejaVu Sans Mono';stroke-width:1.06666672" + sodipodi:role="line" + id="tspan7360-1-7" + x="794.85565" + y="422.17459">Ctrl</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="800.23798" + y="437.61404" + id="text9514-8-9-0-8-4-0-3"><tspan + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672" + id="tspan4936-1-1-9-59-8-3-4" + sodipodi:role="line" + x="800.23798" + y="437.61404">(11)</tspan></text> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="416.72626" + y="171.09129" + id="text7245-1"><tspan + sodipodi:role="line" + x="416.72626" + y="171.09129" + id="tspan7366-3" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="416.72626" + y="178.97421" + id="tspan7249-4" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">select</tspan><tspan + sodipodi:role="line" + x="416.72626" + y="186.65421" + id="tspan5293" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">tab</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="292.49472" + y="366.05417" + id="text10547-23-6-7"><tspan + sodipodi:role="line" + x="292.49472" + y="366.05417" + id="tspan4052" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">(10)</tspan></text> + <text + id="text10564-6-7-8-0" + y="314.29889" + x="814.39789" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10570-9-4-6-1" + y="314.29889" + x="814.39789" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="321.97888" + x="814.39789" + sodipodi:role="line" + id="tspan4975-2-8-7" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="329.65887" + x="814.39789" + sodipodi:role="line" + id="tspan4977-3-1-2" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">search</tspan><tspan + y="337.3389" + x="814.39789" + sodipodi:role="line" + id="tspan5364" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">backw.</tspan></text> + <text + id="text9514-8-9-9" + y="171.64418" + x="788.19946" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="171.64418" + x="788.19946" + sodipodi:role="line" + id="tspan9524-5-1-5" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="179.5271" + x="788.19946" + sodipodi:role="line" + id="tspan6096-4" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">paste</tspan><tspan + y="187.20709" + x="788.19946" + sodipodi:role="line" + id="tspan5366-3" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(2)</tspan></text> + <text + id="text9514-8-0" + y="171.09129" + x="490.50494" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="171.09129" + x="490.50494" + sodipodi:role="line" + id="tspan9524-5-8" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + y="178.97421" + x="490.50494" + sodipodi:role="line" + id="tspan4938-4-2" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">yank/</tspan><tspan + y="186.65421" + x="490.50494" + sodipodi:role="line" + id="tspan4936-1-1" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">copy <tspan + style="font-size:8.53333378px;fill:#ff0000;stroke-width:1.06666672" + id="tspan5713-7">(1)</tspan></tspan></text> + <text + id="text9514-8-9-0-8-7-7" + y="291.00937" + x="133.7375" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="291.00937" + x="133.7375" + sodipodi:role="line" + id="tspan4936-1-1-9-59-5-6" + style="font-size:8.53333378px;line-height:0.89999998;fill:#ff0000;stroke-width:1.06666672">(10)</tspan></text> + <flowRoot + xml:space="preserve" + id="flowRoot5691-4-9-3-6-6" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + transform="translate(0,10)"><flowRegion + id="flowRegion5693-9-1-7-3-8" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-9-8-7-7-6" + width="344" + height="173.33333" + x="913.12598" + y="622.15717" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara3626-7-0"><flowSpan + id="flowSpan5520" + style="font-weight:bold;font-size:10.66666698px;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#0000ff;stroke-width:1.06666672">blue keys </flowSpan><flowSpan + style="font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672" + id="flowSpan5528">can be</flowSpan></flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#0000ff;stroke-width:1.06666672" + id="flowPara3725-9">prefixed by a count</flowPara></flowRoot> <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="339.1572" + y="166.24342" + id="text7245-1-7"><tspan + sodipodi:role="line" + x="339.1572" + y="166.24342" + id="tspan7366-3-3" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="339.1572" + y="174.12634" + id="tspan5293-5" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">reload </tspan><tspan + sodipodi:role="line" + x="339.1572" + y="181.80634" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan3716">(bypass </tspan><tspan + sodipodi:role="line" + x="339.1572" + y="189.48634" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan3719">cache)</tspan></text> + <text + id="text9514-60-7-7-0-8" + y="360.58533" + x="365.25357" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="360.58533" + x="365.25357" + sodipodi:role="line" + id="tspan5689-6" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">visual</tspan><tspan + y="368.26532" + x="365.25357" + sodipodi:role="line" + id="tspan4112" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mode</tspan></text> + <text + id="text10564-5" + y="274.2934" + x="873.4303" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="274.2934" + x="873.4303" + sodipodi:role="line" + id="tspan10566-6" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + id="tspan10570-91" + y="282.1763" + x="873.4303" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">jump to</tspan><tspan + y="289.85632" + x="873.4303" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6066">scroll</tspan><tspan + y="297.53632" + x="873.4303" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6068">mark</tspan></text> + <text + id="text10564-2" + y="362.50635" + x="731.82947" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + id="tspan10568-0" + y="362.50635" + x="731.82947" + sodipodi:role="line" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672">repeat</tspan><tspan + id="tspan10570-93" + y="370.38925" + x="731.82947" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">cmd</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="183.06667" + y="97.639633" + id="text7245-1-6"><tspan + sodipodi:role="line" + x="183.06667" + y="97.639633" + id="tspan7366-3-0" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="183.06667" + y="105.52255" + id="tspan7249-4-6" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">run</tspan><tspan + sodipodi:role="line" + x="183.06667" + y="113.20255" + id="tspan5293-2" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">macro</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="117.44301" + y="203.05061" + id="text7245-1-61"><tspan + sodipodi:role="line" + x="117.44301" + y="203.05061" + id="tspan7366-3-8" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="117.44301" + y="210.93353" + id="tspan5293-9" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">record</tspan><tspan + sodipodi:role="line" + x="117.44301" + y="218.61353" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6136">macro</tspan></text> + <text + id="text10564-5-2" + y="125.17836" + x="37.344757" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="125.17836" + x="37.344757" + sodipodi:role="line" + id="tspan10566-6-0" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + id="tspan10570-91-2" + y="133.06128" + x="37.344757" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">set</tspan><tspan + y="140.74127" + x="37.344757" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6066-3">scroll</tspan><tspan + y="148.42128" + x="37.344757" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6068-7">mark</tspan></text> + <text + id="text9514-60-8-5" + y="323.89648" + x="590.26257" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="323.89648" + x="590.26257" + sodipodi:role="line" + id="tspan5524-9" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">save</tspan><tspan + y="331.57648" + x="590.26257" + sodipodi:role="line" + id="tspan5530-2" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">book-</tspan><tspan + y="339.25647" + x="590.26257" + sodipodi:role="line" + id="tspan5532-2" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">mark</tspan></text> + <text + id="text10564-5-2-8" + y="200.40416" + x="21.280243" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + xml:space="preserve"><tspan + y="200.40416" + x="21.280243" + sodipodi:role="line" + id="tspan10566-6-0-9" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + id="tspan10570-91-2-7" + y="208.28708" + x="21.280243" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">cycle</tspan><tspan + y="215.96707" + x="21.280243" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6068-7-6">completion</tspan><tspan + y="223.64708" + x="21.280243" + sodipodi:role="line" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6220">items</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:TlwgTypewriter;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672" + x="417.29486" + y="205.18887" + id="text7245-1-3"><tspan + sodipodi:role="line" + x="417.29486" + y="205.18887" + id="tspan7366-3-6" + style="font-size:9.60000038px;line-height:0.89999998;stroke-width:1.06666672"> </tspan><tspan + sodipodi:role="line" + x="417.29486" + y="213.07179" + id="tspan5293-53" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672">toggle</tspan><tspan + sodipodi:role="line" + x="417.29486" + y="220.75179" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672;fill:#ff0000" + id="tspan6091">(12)</tspan><tspan + sodipodi:role="line" + x="417.29486" + y="225.70012" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6087" /><tspan + sodipodi:role="line" + x="417.29486" + y="225.70012" + style="font-size:8.53333378px;line-height:0.89999998;stroke-width:1.06666672" + id="tspan6089" /></text> + <flowRoot + transform="translate(-1.2953814,90.2721)" + xml:space="preserve" + id="flowRoot5691-0-5" + style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion + id="flowRegion5693-7-6" + style="font-family:sans-serif;stroke-width:1.06666672"><rect + id="rect5695-0-2" + width="344" + height="173.33333" + x="19.42783" + y="520.07886" + style="font-family:sans-serif;fill:#000000;stroke-width:1.13777781" /></flowRegion><flowPara + style="font-weight:bold;font-size:10.66666698px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#000000;stroke-width:1.06666672" + id="flowPara5701-9-2"><flowSpan + style="font-weight:bold;font-family:sans-serif;-inkscape-font-specification:'Sans Bold';fill:#ff0000;stroke-width:1.06666672" + id="flowSpan5705-5-1">(12)</flowSpan> toggling settings:</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara6196">tsh - toggle scripts for the current host (temporarily)</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara6200">tSh - like <flowSpan + style="font-style:italic" + id="flowSpan6202">tsh</flowSpan>, but permanently</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara6206">tsH/tsu - like <flowSpan + style="font-style:italic" + id="flowSpan6210">tsh</flowSpan>, but including subdomains / with exact URL</flowPara><flowPara + style="font-size:10.66666698px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:1.06666672" + id="flowPara6208">tph - toggle plugins</flowPara></flowRoot> </g> +</svg> diff --git a/.config/qutebrowser/misc/qutebrowser.appdata.xml b/.config/qutebrowser/misc/qutebrowser.appdata.xml new file mode 100644 index 0000000..bdab55f --- /dev/null +++ b/.config/qutebrowser/misc/qutebrowser.appdata.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright 2017 suve <veg@svgames.pl> --> +<component type="desktop"> + <id>org.qutebrowser.qutebrowser</id> + <metadata_license>CC-BY-SA-3.0</metadata_license> + <project_license>GPL-3.0</project_license> + <name>qutebrowser</name> + <summary>A keyboard-driven web browser</summary> + <description> + <p> + qutebrowser is a keyboard-focused browser with a minimal GUI. + It was inspired by other browsers/addons like dwb and Vimperator/Pentadactyl, + and is based on Python and PyQt5. + </p> + </description> + <categories> + <category>Network</category> + <category>WebBrowser</category> + </categories> + <provides> + <binary>qutebrowser</binary> + </provides> + <launchable type="desktop-id">qutebrowser.desktop</launchable> + <screenshots> + <screenshot type="default"> + <image>https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/main.png</image> + </screenshot> + <screenshot> + <image>https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/downloads.png</image> + </screenshot> + <screenshot> + <image>https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/completion.png</image> + </screenshot> + <screenshot> + <image>https://raw.githubusercontent.com/qutebrowser/qutebrowser/master/doc/img/hints.png</image> + </screenshot> + </screenshots> + <url type="homepage">https://www.qutebrowser.org</url> + <url type="faq">https://qutebrowser.org/doc/faq.html</url> + <url type="help">https://qutebrowser.org/doc/help/</url> + <url type="bugtracker">https://github.com/qutebrowser/qutebrowser/issues/</url> + <url type="donation">https://github.com/qutebrowser/qutebrowser#donating</url> + <releases> + <release version="1.3.0" date="2018-05-04"/> + <release version="1.2.1" date="2018-03-14"/> + <release version="1.2.0" date="2018-03-09"/> + </releases> +</component> diff --git a/.config/qutebrowser/misc/qutebrowser.desktop b/.config/qutebrowser/misc/qutebrowser.desktop new file mode 100644 index 0000000..5243b0c --- /dev/null +++ b/.config/qutebrowser/misc/qutebrowser.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=qutebrowser +GenericName=Web Browser +Comment=A keyboard-driven, vim-like browser based on PyQt5 +Icon=qutebrowser +Type=Application +Categories=Network;WebBrowser; +Exec=qutebrowser %u +Terminal=false +StartupNotify=false +MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/qute; +Keywords=Browser diff --git a/.config/qutebrowser/misc/qutebrowser.nsi b/.config/qutebrowser/misc/qutebrowser.nsi new file mode 100644 index 0000000..76f459a --- /dev/null +++ b/.config/qutebrowser/misc/qutebrowser.nsi @@ -0,0 +1,80 @@ +Name "qutebrowser"
+
+Unicode true
+RequestExecutionLevel admin
+SetCompressor /solid lzma
+
+!ifdef X64
+ OutFile "..\dist\qutebrowser-${VERSION}-amd64.exe"
+ InstallDir "$ProgramFiles64\qutebrowser"
+!else
+ OutFile "..\dist\qutebrowser-${VERSION}-win32.exe"
+ InstallDir "$ProgramFiles\qutebrowser"
+!endif
+
+;Default installation folder
+
+!include "MUI2.nsh"
+;!include "MultiUser.nsh"
+
+!define MUI_ABORTWARNING
+;!define MULTIUSER_MUI
+;!define MULTIUSER_INSTALLMODE_COMMANDLINE
+!define MUI_ICON "../icons/qutebrowser.ico"
+!define MUI_UNICON "../icons/qutebrowser.ico"
+
+!insertmacro MUI_PAGE_LICENSE "..\LICENSE"
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+!insertmacro MUI_LANGUAGE "English"
+
+; depends on admin status
+;SetShellVarContext current
+
+
+Section "Install"
+
+ ; Uninstall old versions
+ ExecWait 'MsiExec.exe /quiet /qn /norestart /X{633F41F9-FE9B-42D1-9CC4-718CBD01EE11}'
+ ExecWait 'MsiExec.exe /quiet /qn /norestart /X{9331D947-AC86-4542-A755-A833429C6E69}'
+ IfFileExists "$INSTDIR\uninst.exe" 0 +2
+ ExecWait "$INSTDIR\uninst.exe /S _?=$INSTDIR"
+ CreateDirectory "$INSTDIR"
+
+ SetOutPath "$INSTDIR"
+
+ !ifdef X64
+ file /r "..\dist\qutebrowser-${VERSION}-x64\*.*"
+ !else
+ file /r "..\dist\qutebrowser-${VERSION}-x86\*.*"
+ !endif
+
+ SetShellVarContext all
+ CreateShortCut "$SMPROGRAMS\qutebrowser.lnk" "$INSTDIR\qutebrowser.exe"
+
+ ;Create uninstaller
+ WriteUninstaller "$INSTDIR\uninst.exe"
+
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "DisplayName" "qutebrowser"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "UninstallString" '"$INSTDIR\uninst.exe"'
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser" "QuietUninstallString" '"$INSTDIR\uninst.exe" /S'
+
+SectionEnd
+
+;--------------------------------
+;Uninstaller Section
+
+Section "Uninstall"
+
+ SetShellVarContext all
+ Delete "$SMPROGRAMS\qutebrowser.lnk"
+
+ RMDir /r "$INSTDIR\*.*"
+ RMDir "$INSTDIR"
+
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qutebrowser"
+
+SectionEnd
diff --git a/.config/qutebrowser/misc/qutebrowser.rcc b/.config/qutebrowser/misc/qutebrowser.rcc new file mode 100644 index 0000000..2f73b37 --- /dev/null +++ b/.config/qutebrowser/misc/qutebrowser.rcc @@ -0,0 +1,13 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>icons/qutebrowser-16x16.png</file> + <file>icons/qutebrowser-24x24.png</file> + <file>icons/qutebrowser-32x32.png</file> + <file>icons/qutebrowser-48x48.png</file> + <file>icons/qutebrowser-64x64.png</file> + <file>icons/qutebrowser-96x96.png</file> + <file>icons/qutebrowser-128x128.png</file> + <file>icons/qutebrowser-256x256.png</file> + <file>icons/qutebrowser-512x512.png</file> +</qresource> +</RCC> diff --git a/.config/qutebrowser/misc/qutebrowser.spec b/.config/qutebrowser/misc/qutebrowser.spec new file mode 100644 index 0000000..c886fb0 --- /dev/null +++ b/.config/qutebrowser/misc/qutebrowser.spec @@ -0,0 +1,76 @@ +# -*- mode: python -*- + +import sys +import os + +sys.path.insert(0, os.getcwd()) +from scripts import setupcommon + +block_cipher = None + + +def get_data_files(): + data_files = [ + ('../qutebrowser/html', 'html'), + ('../qutebrowser/img', 'img'), + ('../qutebrowser/javascript', 'javascript'), + ('../qutebrowser/html/doc', 'html/doc'), + ('../qutebrowser/git-commit-id', '.'), + ('../qutebrowser/config/configdata.yml', 'config'), + ] + + # if os.path.exists(os.path.join('qutebrowser', '3rdparty', 'pdfjs')): + # data_files.append(('../qutebrowser/3rdparty/pdfjs', '3rdparty/pdfjs')) + # else: + # print("Warning: excluding pdfjs as it's not present!") + + return data_files + + +setupcommon.write_git_file() + + +if os.name == 'nt': + icon = 'icons/qutebrowser.ico' +elif sys.platform == 'darwin': + icon = 'icons/qutebrowser.icns' +else: + icon = None + + +a = Analysis(['../qutebrowser/__main__.py'], + pathex=['misc'], + binaries=None, + datas=get_data_files(), + hiddenimports=['PyQt5.QtOpenGL', 'PyQt5._QOpenGLFunctions_2_0'], + hookspath=[], + runtime_hooks=[], + excludes=['tkinter'], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + exclude_binaries=True, + name='qutebrowser', + icon=icon, + debug=False, + strip=False, + upx=False, + console=False, + version='misc/file_version_info.txt') +coll = COLLECT(exe, + a.binaries, + a.zipfiles, + a.datas, + strip=False, + upx=False, + name='qutebrowser') + +app = BUNDLE(coll, + name='qutebrowser.app', + icon=icon, + # https://github.com/pyinstaller/pyinstaller/blob/b78bfe530cdc2904f65ce098bdf2de08c9037abb/PyInstaller/hooks/hook-PyQt5.QtWebEngineWidgets.py#L24 + bundle_identifier='org.qt-project.Qt.QtWebEngineCore') diff --git a/.config/qutebrowser/misc/requirements/README.md b/.config/qutebrowser/misc/requirements/README.md new file mode 100644 index 0000000..6ae9862 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/README.md @@ -0,0 +1,20 @@ +This directory contains various `requirements` files which are used by `tox` to +have reproducible tests with pinned versions. + +The files are generated based on unpinned requirements in `*.txt-raw` files. + +Those files can also contain some special commands: + +- Add an additional comment to a line: `#@ comment: <package> <comment here>` +- Filter a line for requirements.io: `#@ filter: <package> <filter>` +- Don't include a package in the output: `#@ ignore: <package>` (or multiple packages) +- Replace a part of a frozen package specification with another: `#@ replace <regex> <replacement>` + +Some examples: + +``` +#@ comment: mypkg blah blub +#@ filter: mypkg != 1.0.0 +#@ ignore: mypkg, otherpkg +#@ replace: foo bar +``` diff --git a/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt b/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt new file mode 100644 index 0000000..c11a3f7 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt @@ -0,0 +1,3 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +check-manifest==0.37 diff --git a/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt-raw b/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt-raw new file mode 100644 index 0000000..dcc0efe --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-check-manifest.txt-raw @@ -0,0 +1 @@ +check-manifest diff --git a/.config/qutebrowser/misc/requirements/requirements-codecov.txt b/.config/qutebrowser/misc/requirements/requirements-codecov.txt new file mode 100644 index 0000000..9fed7b3 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-codecov.txt @@ -0,0 +1,9 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +certifi==2018.4.16 +chardet==3.0.4 +codecov==2.0.15 +coverage==4.5.1 +idna==2.7 +requests==2.19.1 +urllib3==1.23 diff --git a/.config/qutebrowser/misc/requirements/requirements-codecov.txt-raw b/.config/qutebrowser/misc/requirements/requirements-codecov.txt-raw new file mode 100644 index 0000000..15f1c72 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-codecov.txt-raw @@ -0,0 +1 @@ +codecov diff --git a/.config/qutebrowser/misc/requirements/requirements-flake8.txt b/.config/qutebrowser/misc/requirements/requirements-flake8.txt new file mode 100644 index 0000000..b4f0045 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-flake8.txt @@ -0,0 +1,27 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +attrs==18.1.0 +flake8==3.5.0 +flake8-bugbear==18.2.0 +flake8-builtins==1.4.1 # rq.filter: != 1.4.0 +flake8-comprehensions==1.4.1 +flake8-copyright==0.2.0 +flake8-debugger==3.1.0 +flake8-deprecated==1.3 +flake8-docstrings==1.3.0 +flake8-future-import==0.4.5 +flake8-mock==0.3 +flake8-per-file-ignores==0.6 +flake8-polyfill==1.0.2 +flake8-string-format==0.2.3 +flake8-tidy-imports==1.1.0 +flake8-tuple==0.2.13 +mccabe==0.6.1 +pathmatch==0.2.1 +pep8-naming==0.7.0 +pycodestyle==2.3.1 # rq.filter: < 2.4.0 +pydocstyle==2.1.1 +pyflakes==2.0.0 +six==1.11.0 +snowballstemmer==1.2.1 +typing==3.6.4 diff --git a/.config/qutebrowser/misc/requirements/requirements-flake8.txt-raw b/.config/qutebrowser/misc/requirements/requirements-flake8.txt-raw new file mode 100644 index 0000000..7ccbbce --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-flake8.txt-raw @@ -0,0 +1,23 @@ +flake8 +flake8-bugbear +flake8-builtins!=1.4.0 +flake8-comprehensions +flake8-copyright +flake8-debugger +flake8-deprecated +flake8-docstrings +flake8-future-import +flake8-mock +flake8-per-file-ignores +flake8-string-format +flake8-tidy-imports +flake8-tuple +pep8-naming +pydocstyle +pyflakes + +# https://github.com/PyCQA/pycodestyle/issues/741 +#@ filter: pycodestyle < 2.4.0 + +# https://github.com/gforcada/flake8-builtins/issues/36 +#@ filter: flake8-builtins != 1.4.0 diff --git a/.config/qutebrowser/misc/requirements/requirements-pip.txt b/.config/qutebrowser/misc/requirements/requirements-pip.txt new file mode 100644 index 0000000..bf003fc --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pip.txt @@ -0,0 +1,8 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +appdirs==1.4.3 +packaging==17.1 +pyparsing==2.2.0 +setuptools==40.0.0 +six==1.11.0 +wheel==0.31.1 diff --git a/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt b/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt new file mode 100644 index 0000000..e916393 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt @@ -0,0 +1,7 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +altgraph==0.15 +future==0.16.0 +macholib==1.9 +pefile==2017.11.5 +PyInstaller==3.3.1 diff --git a/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt-raw new file mode 100644 index 0000000..c313980 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pyinstaller.txt-raw @@ -0,0 +1 @@ +PyInstaller diff --git a/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt b/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt new file mode 100644 index 0000000..2df0736 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt @@ -0,0 +1,19 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +-e git+https://github.com/PyCQA/astroid.git#egg=astroid +certifi==2018.4.16 +chardet==3.0.4 +github3.py==1.1.0 +idna==2.7 +isort==4.3.4 +lazy-object-proxy==1.3.1 +mccabe==0.6.1 +-e git+https://github.com/PyCQA/pylint.git#egg=pylint +python-dateutil==2.7.3 +./scripts/dev/pylint_checkers +requests==2.19.1 +six==1.11.0 +typed-ast==1.1.0 +uritemplate==3.0.0 +urllib3==1.23 +wrapt==1.10.11 diff --git a/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt-raw new file mode 100644 index 0000000..405b0ab --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pylint-master.txt-raw @@ -0,0 +1,11 @@ +-e git+https://github.com/PyCQA/astroid.git#egg=astroid +-e git+https://github.com/PyCQA/pylint.git#egg=pylint +./scripts/dev/pylint_checkers +requests +github3.py + +# remove @commit-id for scm installs +#@ replace: @.*# # + +# fix qute-pylint location +#@ replace: qute-pylint==.* ./scripts/dev/pylint_checkers diff --git a/.config/qutebrowser/misc/requirements/requirements-pylint.txt b/.config/qutebrowser/misc/requirements/requirements-pylint.txt new file mode 100644 index 0000000..e78dfe2 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pylint.txt @@ -0,0 +1,19 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +astroid==2.0.1 +certifi==2018.4.16 +chardet==3.0.4 +github3.py==1.1.0 +idna==2.7 +isort==4.3.4 +lazy-object-proxy==1.3.1 +mccabe==0.6.1 +pylint==2.0.1 +python-dateutil==2.7.3 +./scripts/dev/pylint_checkers +requests==2.19.1 +six==1.11.0 +typed-ast==1.1.0 +uritemplate==3.0.0 +urllib3==1.23 +wrapt==1.10.11 diff --git a/.config/qutebrowser/misc/requirements/requirements-pylint.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pylint.txt-raw new file mode 100644 index 0000000..37252ee --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pylint.txt-raw @@ -0,0 +1,7 @@ +pylint +./scripts/dev/pylint_checkers +requests +github3.py + +# fix qute-pylint location +#@ replace: qute-pylint==.* ./scripts/dev/pylint_checkers diff --git a/.config/qutebrowser/misc/requirements/requirements-pyqt.txt b/.config/qutebrowser/misc/requirements/requirements-pyqt.txt new file mode 100644 index 0000000..2878a55 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pyqt.txt @@ -0,0 +1,4 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +PyQt5==5.11.2 +PyQt5-sip==4.19.12 diff --git a/.config/qutebrowser/misc/requirements/requirements-pyqt.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pyqt.txt-raw new file mode 100644 index 0000000..37a69c4 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pyqt.txt-raw @@ -0,0 +1 @@ +PyQt5
\ No newline at end of file diff --git a/.config/qutebrowser/misc/requirements/requirements-pyroma.txt b/.config/qutebrowser/misc/requirements/requirements-pyroma.txt new file mode 100644 index 0000000..6afd097 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pyroma.txt @@ -0,0 +1,4 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +docutils==0.14 +pyroma==2.3.1 diff --git a/.config/qutebrowser/misc/requirements/requirements-pyroma.txt-raw b/.config/qutebrowser/misc/requirements/requirements-pyroma.txt-raw new file mode 100644 index 0000000..5ddfb65 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-pyroma.txt-raw @@ -0,0 +1 @@ +pyroma diff --git a/.config/qutebrowser/misc/requirements/requirements-qutebrowser.txt-raw b/.config/qutebrowser/misc/requirements/requirements-qutebrowser.txt-raw new file mode 100644 index 0000000..c66c65b --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-qutebrowser.txt-raw @@ -0,0 +1,7 @@ +Jinja2 +Pygments +pyPEG2 +PyYAML +colorama +cssutils +attrs diff --git a/.config/qutebrowser/misc/requirements/requirements-tests-git.txt b/.config/qutebrowser/misc/requirements/requirements-tests-git.txt new file mode 100644 index 0000000..ce00cd3 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-tests-git.txt @@ -0,0 +1,38 @@ +bzr+lp:beautifulsoup +git+https://github.com/cherrypy/cheroot.git +hg+https://bitbucket.org/ned/coveragepy +git+https://github.com/micheles/decorator.git +git+https://github.com/pallets/flask.git +git+https://github.com/miracle2k/python-glob2.git +git+https://github.com/HypothesisWorks/hypothesis-python.git +git+https://github.com/pallets/itsdangerous.git +git+https://bitbucket.org/zzzeek/mako.git +git+https://github.com/r1chardj0n3s/parse.git +git+https://github.com/jenisys/parse_type.git +hg+https://bitbucket.org/pytest-dev/py +git+https://github.com/pytest-dev/pytest.git@features +git+https://github.com/pytest-dev/pytest-bdd.git +git+https://github.com/pytest-dev/pytest-cov.git +git+https://github.com/pytest-dev/pytest-faulthandler.git +git+https://github.com/pytest-dev/pytest-instafail.git +git+https://github.com/pytest-dev/pytest-mock.git +git+https://github.com/pytest-dev/pytest-qt.git +git+https://github.com/pytest-dev/pytest-repeat.git +git+https://github.com/pytest-dev/pytest-rerunfailures.git +git+https://github.com/abusalimov/pytest-travis-fold.git +git+https://github.com/The-Compiler/pytest-xvfb.git +hg+https://bitbucket.org/gutworth/six +hg+https://bitbucket.org/jendrikseipp/vulture +git+https://github.com/pallets/werkzeug.git + + +## qutebrowser dependencies + +git+https://github.com/tartley/colorama.git +hg+https://bitbucket.org/cthedot/cssutils +git+https://github.com/pallets/jinja.git +git+https://github.com/pallets/markupsafe.git +hg+http://bitbucket.org/birkenfeld/pygments-main +hg+https://bitbucket.org/fdik/pypeg +git+https://github.com/python-attrs/attrs.git +git+https://github.com/yaml/pyyaml.git diff --git a/.config/qutebrowser/misc/requirements/requirements-tests.txt b/.config/qutebrowser/misc/requirements/requirements-tests.txt new file mode 100644 index 0000000..07b0378 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-tests.txt @@ -0,0 +1,42 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +atomicwrites==1.1.5 +attrs==18.1.0 +backports.functools-lru-cache==1.5 +beautifulsoup4==4.6.0 +cheroot==6.3.3 +click==6.7 +# colorama==0.3.9 +coverage==4.5.1 +EasyProcess==0.2.3 +fields==5.0.0 +Flask==1.0.2 +glob2==0.6 +hunter==2.0.2 +hypothesis==3.66.6 +itsdangerous==0.24 +# Jinja2==2.10 +Mako==1.0.7 +# MarkupSafe==1.0 +more-itertools==4.2.0 +parse==1.8.4 +parse-type==0.4.2 +pluggy==0.6.0 +py==1.5.4 +py-cpuinfo==4.0.0 +pytest==3.6.3 +pytest-bdd==2.21.0 +pytest-benchmark==3.1.1 +pytest-cov==2.5.1 +pytest-faulthandler==1.5.0 +pytest-instafail==0.4.0 +pytest-mock==1.10.0 +pytest-qt==3.0.0 +pytest-repeat==0.5.0 +pytest-rerunfailures==4.1 +pytest-travis-fold==1.3.0 +pytest-xvfb==1.1.0 +PyVirtualDisplay==0.2.1 +six==1.11.0 +vulture==0.28 +Werkzeug==0.14.1 diff --git a/.config/qutebrowser/misc/requirements/requirements-tests.txt-raw b/.config/qutebrowser/misc/requirements/requirements-tests.txt-raw new file mode 100644 index 0000000..1216899 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-tests.txt-raw @@ -0,0 +1,21 @@ +beautifulsoup4 +cheroot +coverage +Flask +hunter +hypothesis +pytest +pytest-bdd +pytest-benchmark +pytest-cov +pytest-faulthandler +pytest-instafail +pytest-mock +pytest-qt +pytest-repeat +pytest-rerunfailures +pytest-travis-fold +pytest-xvfb +vulture + +#@ ignore: Jinja2, MarkupSafe, colorama diff --git a/.config/qutebrowser/misc/requirements/requirements-tox.txt b/.config/qutebrowser/misc/requirements/requirements-tox.txt new file mode 100644 index 0000000..e8c660e --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-tox.txt @@ -0,0 +1,9 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +packaging==17.1 +pluggy==0.6.0 +py==1.5.4 +pyparsing==2.2.0 +six==1.11.0 +tox==3.1.2 +virtualenv==16.0.0 diff --git a/.config/qutebrowser/misc/requirements/requirements-tox.txt-raw b/.config/qutebrowser/misc/requirements/requirements-tox.txt-raw new file mode 100644 index 0000000..053148f --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-tox.txt-raw @@ -0,0 +1 @@ +tox diff --git a/.config/qutebrowser/misc/requirements/requirements-vulture.txt b/.config/qutebrowser/misc/requirements/requirements-vulture.txt new file mode 100644 index 0000000..c8a26e8 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-vulture.txt @@ -0,0 +1,3 @@ +# This file is automatically generated by scripts/dev/recompile_requirements.py + +vulture==0.28 diff --git a/.config/qutebrowser/misc/requirements/requirements-vulture.txt-raw b/.config/qutebrowser/misc/requirements/requirements-vulture.txt-raw new file mode 100644 index 0000000..a10f860 --- /dev/null +++ b/.config/qutebrowser/misc/requirements/requirements-vulture.txt-raw @@ -0,0 +1 @@ +vulture diff --git a/.config/qutebrowser/misc/userscripts/cast b/.config/qutebrowser/misc/userscripts/cast new file mode 100755 index 0000000..f7b64df --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/cast @@ -0,0 +1,156 @@ +#!/usr/bin/env bash +# +# Behaviour +# Userscript for qutebrowser which casts the url passed in $1 to the default +# ChromeCast device in the network using the program `castnow` +# +# Usage +# You can launch the script from qutebrowser as follows: +# spawn --userscript ${PATH_TO_FILE} {url} +# +# Then, you can control the chromecast by launching the simple command +# `castnow` in a shell which will connect to the running castnow instance. +# +# For stopping the script, issue the command `pkill -f castnow` which would +# then let the rest of the userscript execute for cleaning temporary file. +# +# Thanks +# This userscript borrows Thorsten Wißmann's javascript code from his `mpv` +# userscript. +# +# Dependencies +# - castnow, https://github.com/xat/castnow +# +# Author +# Simon Désaulniers <sim.desaulniers@gmail.com> + +if [ -z "$QUTE_FIFO" ] ; then + cat 1>&2 <<EOF +Error: $0 can not be run as a standalone script. + +It is a qutebrowser userscript. In order to use it, call it using +'spawn --userscript' as described in qute://help/userscripts.html +EOF + exit 1 +fi + +msg() { + local cmd="$1" + shift + local msg="$*" + if [ -z "$QUTE_FIFO" ] ; then + echo "$cmd: $msg" >&2 + else + echo "message-$cmd '${msg//\'/\\\'}'" >> "$QUTE_FIFO" + fi +} + +js() { +cat <<EOF + + function descendantOfTagName(child, ancestorTagName) { + // tells whether child has some (proper) ancestor + // with the tag name ancestorTagName + while (child.parentNode != null) { + child = child.parentNode; + if (typeof child.tagName === 'undefined') break; + if (child.tagName.toUpperCase() == ancestorTagName.toUpperCase()) { + return true; + } + } + return false; + } + + var App = {}; + + var all_videos = []; + all_videos.push.apply(all_videos, document.getElementsByTagName("video")); + all_videos.push.apply(all_videos, document.getElementsByTagName("object")); + all_videos.push.apply(all_videos, document.getElementsByTagName("embed")); + App.backup_videos = Array(); + App.all_replacements = Array(); + for (i = 0; i < all_videos.length; i++) { + var video = all_videos[i]; + if (descendantOfTagName(video, "object")) { + // skip tags that are contained in an object, because we hide + // the object anyway. + continue; + } + var replacement = document.createElement("div"); + replacement.innerHTML = " + <p style=\\"margin-bottom: 0.5em\\"> + The video is being cast on your ChromeCast device. + </p> + <p> + In order to restore this particular video + <a style=\\"font-weight: bold; + color: white; + background: transparent; + \\" + onClick=\\"restore_video(this, " + i + ");\\" + href=\\"javascript: restore_video(this, " + i + ")\\" + >click here</a>. + </p> + "; + replacement.style.position = "relative"; + replacement.style.zIndex = "100003000000"; + replacement.style.fontSize = "1rem"; + replacement.style.textAlign = "center"; + replacement.style.verticalAlign = "middle"; + replacement.style.height = "100%"; + replacement.style.background = "#101010"; + replacement.style.color = "white"; + replacement.style.border = "4px dashed #545454"; + replacement.style.padding = "2em"; + replacement.style.margin = "auto"; + App.all_replacements[i] = replacement; + App.backup_videos[i] = video; + video.parentNode.replaceChild(replacement, video); + } + + function restore_video(obj, index) { + obj = App.all_replacements[index]; + video = App.backup_videos[index]; + console.log(video); + obj.parentNode.replaceChild(video, obj); + } + + /** force repainting the video, thanks to: + * http://martinwolf.org/2014/06/10/force-repaint-of-an-element-with-javascript/ + */ + var siteHeader = document.getElementById('header'); + siteHeader.style.display='none'; + siteHeader.offsetHeight; // no need to store this anywhere, the reference is enough + siteHeader.style.display='block'; + +EOF +} + +printjs() { + js | sed 's,//.*$,,' | tr '\n' ' ' +} +echo "jseval -q $(printjs)" >> "$QUTE_FIFO" + +tmpdir=$(mktemp -d) +file_to_cast=${tmpdir}/qutecast +program_=$(command -v castnow) + +if [[ "${program_}" == "" ]]; then + msg error "castnow can't be found..." + exit 1 +fi + +# kill any running instance of castnow +pkill -f "${program_}" + +# start youtube download in stream mode (-o -) into temporary file +youtube-dl -qo - "$1" > "${file_to_cast}" & +ytdl_pid=$! + +msg info "Casting $1" >> "$QUTE_FIFO" +# start castnow in stream mode to cast on ChromeCast +tail -F "${file_to_cast}" | ${program_} - + +# cleanup remaining background process and file on disk +kill ${ytdl_pid} +rm -rf "${tmpdir}" diff --git a/.config/qutebrowser/misc/userscripts/dmenu_qutebrowser b/.config/qutebrowser/misc/userscripts/dmenu_qutebrowser new file mode 100755 index 0000000..82e6d2f --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/dmenu_qutebrowser @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +# Copyright 2015 Zach-Button <zachrey.button@gmail.com> +# Copyright 2015-2017 Florian Bruhin (The Compiler) <mail@qutebrowser.org> +# +# This file is part of qutebrowser. +# +# qutebrowser 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. +# +# qutebrowser 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 qutebrowser. If not, see <http://www.gnu.org/licenses/>. + +# Pipes history, quickmarks, and URL into dmenu. +# +# If run from qutebrowser as a userscript, it runs :open on the URL +# If not, it opens a new qutebrowser window at the URL +# +# Ideal for use with tabs_are_windows. Set a hotkey to launch this script, then: +# :bind o spawn --userscript dmenu_qutebrowser +# +# Use the hotkey to open in new tab/window, press 'o' to open URL in current tab/window +# You can simulate "go" by pressing "o<tab>", as the current URL is always first in the list +# +# I personally use "<Mod4>o" to launch this script. For me, my workflow is: +# Default keys Keys with this script +# O <Mod4>o +# o o +# go o<Tab> +# gO gC, then o<Tab> +# (This is unnecessarily long. I use this rarely, feel free to make this script accept parameters.) +# + +[ -z "$QUTE_URL" ] && QUTE_URL='http://google.com' + +url=$(echo "$QUTE_URL" | cat - "$QUTE_CONFIG_DIR/quickmarks" "$QUTE_DATA_DIR/history" | dmenu -l 15 -p qutebrowser) +url=$(echo "$url" | sed -E 's/[^ ]+ +//g' | grep -E "https?:" || echo "$url") + +[ -z "${url// }" ] && exit + +echo "open $url" >> "$QUTE_FIFO" || qutebrowser "$url" diff --git a/.config/qutebrowser/misc/userscripts/format_json b/.config/qutebrowser/misc/userscripts/format_json new file mode 100755 index 0000000..0d476b3 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/format_json @@ -0,0 +1,42 @@ +#!/bin/sh +set -euo pipefail +# +# Behavior: +# Userscript for qutebrowser which will take the raw JSON text of the current +# page, format it using `jq`, will add syntax highlighting using `pygments`, +# and open the syntax highlighted pretty printed html in a new tab. If the file +# is larger than 10MB then this script will only indent the json and will forego +# syntax highlighting using pygments. +# +# In order to use this script, just start it using `spawn --userscript` from +# qutebrowser. I recommend using an alias, e.g. put this in the +# [alias]-section of qutebrowser.conf: +# +# json = spawn --userscript /path/to/json_format +# +# Note that the color style defaults to monokai, but a different pygments style +# can be passed as the first parameter to the script. A full list of the pygments +# styles can be found at: https://help.farbox.com/pygments.html +# +# Bryan Gilbert, 2017 + +# do not run pygmentize on files larger than this amount of bytes +MAX_SIZE_PRETTIFY=10485760 # 10 MB +# default style to monokai if none is provided +STYLE=${1:-monokai} + +TEMP_FILE="$(mktemp)" +jq . "$QUTE_TEXT" >"$TEMP_FILE" + +# try GNU stat first and then OSX stat if the former fails +FILE_SIZE=$( + stat --printf="%s" "$TEMP_FILE" 2>/dev/null || + stat -f%z "$TEMP_FILE" 2>/dev/null +) +if [ "$FILE_SIZE" -lt "$MAX_SIZE_PRETTIFY" ]; then + pygmentize -l json -f html -O full,style="$STYLE" <"$TEMP_FILE" >"${TEMP_FILE}_" + mv -f "${TEMP_FILE}_" "$TEMP_FILE" +fi + +# send the command to qutebrowser to open the new file containing the formatted json +echo "open -t file://$TEMP_FILE" >> "$QUTE_FIFO" diff --git a/.config/qutebrowser/misc/userscripts/getbib b/.config/qutebrowser/misc/userscripts/getbib new file mode 100755 index 0000000..22af7a8 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/getbib @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +"""Qutebrowser userscript scraping the current web page for DOIs and downloading +corresponding bibtex information. + +Set the environment variable 'QUTE_BIB_FILEPATH' to indicate the path to +download to. Otherwise, bibtex information is downloaded to '/tmp' and hence +deleted at reboot. + +Installation: see qute://help/userscripts.html + +Inspired by +https://ocefpaf.github.io/python4oceanographers/blog/2014/05/19/doi2bibtex/ +""" + +import os +import sys +import shutil +import re +from collections import Counter +from urllib import parse as url_parse +from urllib import request as url_request + + +FIFO_PATH = os.getenv("QUTE_FIFO") + +def message_fifo(message, level="warning"): + """Send message to qutebrowser FIFO. The level must be one of 'info', + 'warning' (default) or 'error'.""" + with open(FIFO_PATH, "w") as fifo: + fifo.write("message-{} '{}'".format(level, message)) + + +source = os.getenv("QUTE_TEXT") +with open(source) as f: + text = f.read() + +# find DOIs on page using regex +dval = re.compile(r'(10\.(\d)+/([^(\s\>\"\<)])+)') +# https://stackoverflow.com/a/10324802/3865876, too strict +# dval = re.compile(r'\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&\'<>])\S)+)\b') +dois = dval.findall(text) +dois = Counter(e[0] for e in dois) +try: + doi = dois.most_common(1)[0][0] +except IndexError: + message_fifo("No DOIs found on page") + sys.exit() +message_fifo("Found {} DOIs on page, selecting {}".format(len(dois), doi), + level="info") + +# get bibtex data corresponding to DOI +url = "http://dx.doi.org/" + url_parse.quote(doi) +headers = dict(Accept='text/bibliography; style=bibtex') +request = url_request.Request(url, headers=headers) +response = url_request.urlopen(request) +status_code = response.getcode() +if status_code >= 400: + message_fifo("Request returned {}".format(status_code)) + sys.exit() + +# obtain content and format it +bibtex = response.read().decode("utf-8").strip() +bibtex = bibtex.replace(" ", "\n ", 1).\ + replace("}, ", "},\n ").replace("}}", "}\n}") + +# append to file +bib_filepath = os.getenv("QUTE_BIB_FILEPATH", "/tmp/qute.bib") +with open(bib_filepath, "a") as f: + f.write(bibtex + "\n\n") diff --git a/.config/qutebrowser/misc/userscripts/open_download b/.config/qutebrowser/misc/userscripts/open_download new file mode 100755 index 0000000..8dbb113 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/open_download @@ -0,0 +1,115 @@ +#!/usr/bin/env bash +# Both standalone script and qutebrowser userscript that opens a rofi menu with +# all files from the download director and opens the selected file. It works +# both as a userscript and a standalone script that is called from outside of +# qutebrowser. +# +# Suggested keybinding (for "show downloads"): +# spawn --userscript ~/.config/qutebrowser/open_download +# sd +# +# Requirements: +# - rofi (in a recent version) +# - xdg-open and xdg-mime +# - You should configure qutebrowser to download files to a single directory +# - It comes in handy if you enable downloads.remove_finished. If you want to +# see the recent downloads, just press "sd". +# +# Thorsten Wißmann, 2015 (thorsten` on freenode) +# Any feedback is welcome! + +set -e + +# open a file from the download directory using rofi +DOWNLOAD_DIR=${DOWNLOAD_DIR:-$QUTE_DOWNLOAD_DIR} +DOWNLOAD_DIR=${DOWNLOAD_DIR:-$HOME/Downloads} +# the name of the rofi command +ROFI_CMD=${ROFI_CMD:-rofi} +ROFI_ARGS=${ROFI_ARGS:-} + +msg() { + local cmd="$1" + shift + local msg="$*" + if [ -z "$QUTE_FIFO" ] ; then + echo "$cmd: $msg" >&2 + else + echo "message-$cmd '${msg//\'/\\\'}'" >> "$QUTE_FIFO" + fi +} +die() { + msg error "$*" + if [ -n "$QUTE_FIFO" ] ; then + # when run as a userscript, the above error message already informs the + # user about the failure, and no additional "userscript exited with status + # 1" is needed. + exit 0; + else + exit 1; + fi +} + +if ! [ -d "$DOWNLOAD_DIR" ] ; then + die "Download directory »$DOWNLOAD_DIR« not found!" +fi +if ! command -v "${ROFI_CMD}" > /dev/null ; then + die "Rofi command »${ROFI_CMD}« not found in PATH!" +fi + +rofi_default_args=( + -monitor -2 # place above window + -location 6 # aligned at the bottom + -width 100 # use full window width + -i + -no-custom + -format i # make rofi return the index + -l 10 + -p 'Open download:' -dmenu + ) + +crop-first-column() { + local maxlength=${1:-40} + local expression='s|^\([^\t]\{0,'"$maxlength"'\}\)[^\t]*\t|\1\t|' + sed "$expression" +} + +ls-files() { + # add the slash at the end of the download dir enforces to follow the + # symlink, if the DOWNLOAD_DIR itself is a symlink + # shellcheck disable=SC2010 + ls -Q --quoting-style escape -h -o -1 -A -t "${DOWNLOAD_DIR}/" \ + | grep '^[-]' \ + | cut -d' ' -f3- \ + | sed 's,^\(.*[^\]\) \(.*\)$,\2\t\1,' \ + | sed 's,\\\(.\),\1,g' +} + +mapfile -t entries < <(ls-files) + +# we need to manually check that there are items, because rofi doesn't show up +# if there are no items and -no-custom is passed to rofi. +if [ "${#entries[@]}" -eq 0 ] ; then + die "Download directory »${DOWNLOAD_DIR}« empty" +fi + +line=$(printf '%s\n' "${entries[@]}" \ + | crop-first-column 55 \ + | column -s $'\t' -t \ + | $ROFI_CMD "${rofi_default_args[@]}" "$ROFI_ARGS") || true +if [ -z "$line" ]; then + exit 0 +fi + +file="${entries[$line]}" +file="${file%%$'\t'*}" +path="$DOWNLOAD_DIR/$file" +filetype=$(xdg-mime query filetype "$path") +application=$(xdg-mime query default "$filetype") + +if [ -z "$application" ] ; then + die "Do not know how to open »$file« of type $filetype" +fi + +msg info "Opening »$file« (of type $filetype) with ${application%.desktop}" + +xdg-open "$path" & diff --git a/.config/qutebrowser/misc/userscripts/openfeeds b/.config/qutebrowser/misc/userscripts/openfeeds new file mode 100755 index 0000000..4a1a942 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/openfeeds @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright 2015 jnphilipp <me@jnphilipp.org> +# Copyright 2016-2017 Florian Bruhin (The Compiler) <mail@qutebrowser.org> +# +# This file is part of qutebrowser. +# +# qutebrowser 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. +# +# qutebrowser 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 qutebrowser. If not, see <http://www.gnu.org/licenses/>. + +# Opens all links to feeds defined in the head of a site +# +# Ideal for use with tabs_are_windows. Set a hotkey to launch this script, then: +# :bind gF spawn --userscript openfeeds +# +# Use the hotkey to open the feeds in new tab/window, press 'gF' to open +# + +import os +import re + +from bs4 import BeautifulSoup +from urllib.parse import urljoin + +with open(os.environ['QUTE_HTML'], 'r') as f: + soup = BeautifulSoup(f) +with open(os.environ['QUTE_FIFO'], 'w') as f: + for link in soup.find_all('link', rel='alternate', type=re.compile(r'application/((rss|rdf|atom)\+)?xml|text/xml')): + f.write('open -t %s\n' % urljoin(os.environ['QUTE_URL'], link.get('href'))) diff --git a/.config/qutebrowser/misc/userscripts/password_fill b/.config/qutebrowser/misc/userscripts/password_fill new file mode 100755 index 0000000..a61a42c --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/password_fill @@ -0,0 +1,381 @@ +#!/usr/bin/env bash +help() { + blink=$'\e[1;31m' reset=$'\e[0m' +cat <<EOF +This script can only be used as a userscript for qutebrowser +2015, Thorsten Wißmann <edu _at_ thorsten-wissmann _dot_ de> +In case of questions or suggestions, do not hesitate to send me an E-Mail or to +directly ask me via IRC (nickname thorsten\`) in #qutebrowser on freenode. + + $blink!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$reset + WARNING: the passwords are stored in qutebrowser's + debug log reachable via the url qute://log + $blink!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$reset + +Usage: run as a userscript form qutebrowser, e.g.: + spawn --userscript ~/.config/qutebrowser/password_fill + +Pass backend: (see also passwordstore.org) + This script expects pass to store the credentials of each page in an extra + file, where the filename (or filepath) contains the domain of the respective + page. The first line of the file must contain the password, the login name + must be contained in a later line beginning with "user:", "login:", or + "username:" (configurable by the user_pattern variable). + +Behavior: + It will try to find a username/password entry in the configured backend + (currently only pass) for the current website and will load that pair of + username and password to any form on the current page that has some password + entry field. If multiple entries are found, a zenity menu is offered. + + If no entry is found, then it crops subdomains from the url if at least one + entry is found in the backend. (In that case, it always shows a menu) + +Configuration: + This script loads the bash script ~/.config/qutebrowser/password_fill_rc (if + it exists), so you can change any configuration variable and overwrite any + function you like. + +EOF +} + +set -o errexit +set -o pipefail +shopt -s nocasematch # make regexp matching in bash case insensitive + +if [ -z "$QUTE_FIFO" ] ; then + help + exit +fi + +error() { + local msg="$*" + echo "message-error '${msg//\'/\\\'}'" >> "$QUTE_FIFO" +} +msg() { + local msg="$*" + echo "message-info '${msg//\'/\\\'}'" >> "$QUTE_FIFO" +} +die() { + error "$*" + exit 0 +} + +javascript_escape() { + # print the first argument in an escaped way, such that it can safely + # be used within javascripts double quotes + sed "s,[\\\\'\"],\\\\&,g" <<< "$1" +} + +# ======================================================= # +# CONFIGURATION +# ======================================================= # +# The configuration file is per default located in +# ~/.config/qutebrowser/password_fill_rc and is a bash script that is loaded +# later in the present script. So basically you can replace all of the +# following definitions and make them fit your needs. + +# The following simplifies a URL to the domain (e.g. "wiki.qutebrowser.org") +# which is later used to search the correct entries in the password backend. If +# you e.g. don't want the "www." to be removed or if you want to distinguish +# between different paths on the same domain. + +simplify_url() { + simple_url="${1##*://}" # remove protocol specification + simple_url="${simple_url%%\?*}" # remove GET parameters + simple_url="${simple_url%%/*}" # remove directory path + simple_url="${simple_url%:*}" # remove port + simple_url="${simple_url##www.}" # remove www. subdomain +} + +# no_entries_found() is called if the first query_entries() call did not find +# any matching entries. Multiple implementations are possible: +# The easiest behavior is to quit: +#no_entries_found() { +# if [ 0 -eq "${#files[@]}" ] ; then +# die "No entry found for »$simple_url«" +# fi +#} +# But you could also fill the files array with all entries from your pass db +# if the first db query did not find anything +# no_entries_found() { +# if [ 0 -eq "${#files[@]}" ] ; then +# query_entries "" +# if [ 0 -eq "${#files[@]}" ] ; then +# die "No entry found for »$simple_url«" +# fi +# fi +# } + +# Another behavior is to drop another level of subdomains until search hits +# are found: +no_entries_found() { + while [ 0 -eq "${#files[@]}" ] && [ -n "$simple_url" ]; do + shorter_simple_url=$(sed 's,^[^.]*\.,,' <<< "$simple_url") + if [ "$shorter_simple_url" = "$simple_url" ] ; then + # if no dot, then even remove the top level domain + simple_url="" + query_entries "$simple_url" + break + fi + simple_url="$shorter_simple_url" + query_entries "$simple_url" + #die "No entry found for »$simple_url«" + # enforce menu if we do "fuzzy" matching + menu_if_one_entry=1 + done + if [ 0 -eq "${#files[@]}" ] ; then + die "No entry found for »$simple_url«" + fi +} + +# Backend implementations tell, how the actual password store is accessed. +# Right now, there is only one fully functional password backend, namely for +# the program "pass". +# A password backend consists of three actions: +# - init() initializes backend-specific things and does sanity checks. +# - query_entries() is called with a simplified url and is expected to fill +# the bash array $files with the names of matching password entries. There +# are no requirements how these names should look like. +# - open_entry() is called with some specific entry of the $files array and is +# expected to write the username of that entry to the $username variable and +# the corresponding password to $password + +reset_backend() { + init() { true ; } + query_entries() { true ; } + open_entry() { true ; } +} + +# choose_entry() is expected to choose one entry from the array $files and +# write it to the variable $file. +choose_entry() { + choose_entry_zenity +} + +# The default implementation chooses a random entry from the array. So if there +# are multiple matching entries, multiple calls to this userscript will +# eventually pick the "correct" entry. I.e. if this userscript is bound to +# "zl", the user has to press "zl" until the correct username shows up in the +# login form. +choose_entry_random() { + local nr=${#files[@]} + file="${files[$((RANDOM % nr))]}" + # Warn user, that there might be other matching password entries + if [ "$nr" -gt 1 ] ; then + msg "Picked $file out of $nr entries: ${files[*]}" + fi +} + +# another implementation would be to ask the user via some menu (like rofi or +# dmenu or zenity or even qutebrowser completion in future?) which entry to +# pick +MENU_COMMAND=( head -n 1 ) +# whether to show the menu if there is only one entry in it +menu_if_one_entry=0 +choose_entry_menu() { + local nr=${#files[@]} + if [ "$nr" -eq 1 ] && ! ((menu_if_one_entry)) ; then + file="${files[0]}" + else + file=$( printf '%s\n' "${files[@]}" | "${MENU_COMMAND[@]}" ) + fi +} + +choose_entry_rofi() { + MENU_COMMAND=( rofi -p "qutebrowser> " -dmenu + -mesg $'Pick a password entry for <b>'"${QUTE_URL//&/&}"'</b>' ) + choose_entry_menu || true +} + +choose_entry_zenity() { + MENU_COMMAND=( zenity --list --title "qutebrowser password fill" + --text "Pick the password entry:" + --column "Name" ) + choose_entry_menu || true +} + +choose_entry_zenity_radio() { + zenity_helper() { + awk '{ print $0 ; print $0 }' \ + | zenity --list --radiolist \ + --title "qutebrowser password fill" \ + --text "Pick the password entry:" \ + --column " " --column "Name" + } + MENU_COMMAND=( zenity_helper ) + choose_entry_menu || true +} + +# ======================================================= +# backend: PASS + +# configuration options: +match_filename=1 # whether allowing entry match by filepath +match_line=0 # whether allowing entry match by URL-Pattern in file + # Note: match_line=1 gets very slow, even for small password stores! +match_line_pattern='^url: .*' # applied using grep -iE +user_pattern='^(user|username|login): ' + +GPG_OPTS=( "--quiet" "--yes" "--compress-algo=none" "--no-encrypt-to" ) +GPG="gpg" +export GPG_TTY="${GPG_TTY:-$(tty 2>/dev/null)}" +command -v gpg2 &>/dev/null && GPG="gpg2" +[[ -n $GPG_AGENT_INFO || $GPG == "gpg2" ]] && GPG_OPTS+=( "--batch" "--use-agent" ) + +pass_backend() { + init() { + PREFIX="${PASSWORD_STORE_DIR:-$HOME/.password-store}" + if ! [ -d "$PREFIX" ] ; then + die "Can not open password store dir »$PREFIX«" + fi + } + query_entries() { + local url="$1" + + if ((match_line)) ; then + # add entries with matching URL-tag + while read -r -d "" passfile ; do + if $GPG "${GPG_OPTS[@]}" -d "$passfile" \ + | grep --max-count=1 -iE "${match_line_pattern}${url}" > /dev/null + then + passfile="${passfile#$PREFIX}" + passfile="${passfile#/}" + files+=( "${passfile%.gpg}" ) + fi + done < <(find -L "$PREFIX" -iname '*.gpg' -print0) + fi + if ((match_filename)) ; then + # add entries with matching filepath + while read -r passfile ; do + passfile="${passfile#$PREFIX}" + passfile="${passfile#/}" + files+=( "${passfile%.gpg}" ) + done < <(find -L "$PREFIX" -iname '*.gpg' | grep "$url") + fi + } + open_entry() { + local path="$PREFIX/${1}.gpg" + password="" + local firstline=1 + while read -r line ; do + if ((firstline)) ; then + password="$line" + firstline=0 + else + if [[ $line =~ $user_pattern ]] ; then + # remove the matching prefix "user: " from the beginning of the line + username=${line#${BASH_REMATCH[0]}} + break + fi + fi + done < <($GPG "${GPG_OPTS[@]}" -d "$path" ) + } +} +# ======================================================= + +# ======================================================= +# backend: secret +secret_backend() { + init() { + return + } + query_entries() { + local domain="$1" + while read -r line ; do + if [[ "$line" == "attribute.username = "* ]] ; then + files+=("$domain ${line:21}") + fi + done < <( secret-tool search --unlock --all domain "$domain" 2>&1 ) + } + open_entry() { + local domain="${1%% *}" + username="${1#* }" + password=$(secret-tool lookup domain "$domain" username "$username") + } +} +# ======================================================= + +# load some sane default backend +reset_backend +pass_backend +# load configuration +QUTE_CONFIG_DIR=${QUTE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/qutebrowser/} +PWFILL_CONFIG=${PWFILL_CONFIG:-${QUTE_CONFIG_DIR}/password_fill_rc} +if [ -f "$PWFILL_CONFIG" ] ; then + # shellcheck source=/dev/null + source "$PWFILL_CONFIG" +fi +init + +simplify_url "$QUTE_URL" +query_entries "${simple_url}" +no_entries_found +# remove duplicates +mapfile -t files < <(printf '%s\n' "${files[@]}" | sort | uniq ) +choose_entry +if [ -z "$file" ] ; then + # choose_entry didn't want any of these entries + exit 0 +fi +open_entry "$file" +#username="$(date)" +#password="XYZ" +#msg "$username, ${#password}" + +[ -n "$username" ] || die "Username not set in entry $file" +[ -n "$password" ] || die "Password not set in entry $file" + +js() { +cat <<EOF + function isVisible(elem) { + var style = elem.ownerDocument.defaultView.getComputedStyle(elem, null); + + if (style.getPropertyValue("visibility") !== "visible" || + style.getPropertyValue("display") === "none" || + style.getPropertyValue("opacity") === "0") { + return false; + } + + return elem.offsetWidth > 0 && elem.offsetHeight > 0; + }; + function hasPasswordField(form) { + var inputs = form.getElementsByTagName("input"); + for (var j = 0; j < inputs.length; j++) { + var input = inputs[j]; + if (input.type == "password") { + return true; + } + } + return false; + }; + function loadData2Form (form) { + var inputs = form.getElementsByTagName("input"); + for (var j = 0; j < inputs.length; j++) { + var input = inputs[j]; + if (isVisible(input) && (input.type == "text" || input.type == "email")) { + input.focus(); + input.value = "$(javascript_escape "${username}")"; + input.blur(); + } + if (input.type == "password") { + input.focus(); + input.value = "$(javascript_escape "${password}")"; + input.blur(); + } + } + }; + + var forms = document.getElementsByTagName("form"); + for (i = 0; i < forms.length; i++) { + if (hasPasswordField(forms[i])) { + loadData2Form(forms[i]); + } + } +EOF +} + +printjs() { + js | sed 's,//.*$,,' | tr '\n' ' ' +} +echo "jseval -q $(printjs)" >> "$QUTE_FIFO" diff --git a/.config/qutebrowser/misc/userscripts/qute-keepass b/.config/qutebrowser/misc/userscripts/qute-keepass new file mode 100755 index 0000000..a21ebc9 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/qute-keepass @@ -0,0 +1,261 @@ +#!/usr/bin/env python3 + +# Copyright 2018 Jay Kamat <jaygkamat@gmail.com> +# +# This file is part of qutebrowser. +# +# qutebrowser 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. +# +# qutebrowser 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 qutebrowser. If not, see <http://www.gnu.org/licenses/>. + +"""This userscript allows for insertion of usernames and passwords from keepass +databases using pykeepass. Since it is a userscript, it must be run from +qutebrowser. + +A sample invocation of this script is: + +:spawn --userscript qute-keepass -p ~/KeePassFiles/MainDatabase.kdbx + +And a sample binding + +:bind --mode=insert <ctrl-i> spawn --userscript qute-keepass -p ~/KeePassFiles/MainDatabase.kdbx + +-p or --path is a required argument. + +--keyfile-path allows you to specify a keepass keyfile. If you only use a +keyfile, also add --no-password as well. Specifying --no-password without +--keyfile-path will lead to an error. + +login information is inserted using :insert-text and :fake-key <Tab>, which +means you must have a cursor in position before initiating this userscript. If +you do not do this, you will get 'element not editable' errors. + +If keepass takes a while to open the DB, you might want to consider reducing +the number of transform rounds in your database settings. + +Dependencies: pykeepass (in python3), PyQt5. Without pykeepass, you will get an +exit code of 100. + +********************!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!****************** + +WARNING: The login details are viewable as plaintext in qutebrowser's debug log +(qute://log) and could be compromised if you decide to submit a crash report! + +********************!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!****************** + +""" + +# pylint: disable=bad-builtin + +import argparse +import enum +import functools +import os +import shlex +import subprocess +import sys + +from PyQt5.QtCore import QUrl +from PyQt5.QtWidgets import QApplication, QInputDialog, QLineEdit + +try: + import pykeepass +except ImportError as e: + print("pykeepass not found: {}".format(str(e)), file=sys.stderr) + + # Since this is a common error, try to print it to the FIFO if we can. + if 'QUTE_FIFO' in os.environ: + with open(os.environ['QUTE_FIFO'], 'w') as fifo: + fifo.write('message-error "pykeepass failed to be imported."\n') + fifo.flush() + sys.exit(100) + +argument_parser = argparse.ArgumentParser( + description="Fill passwords using keepass.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__) +argument_parser.add_argument('url', nargs='?', default=os.getenv('QUTE_URL')) +argument_parser.add_argument('--path', '-p', required=True, + help='Path to the keepass db.') +argument_parser.add_argument('--keyfile-path', '-k', default=None, + help='Path to a keepass keyfile') +argument_parser.add_argument( + '--no-password', action='store_true', + help='Supply if no password is required to unlock this database. ' + 'Only allowed with --keyfile-path') +argument_parser.add_argument( + '--dmenu-invocation', '-d', default='dmenu', + help='Invocation used to execute a dmenu-provider') +argument_parser.add_argument( + '--dmenu-format', '-f', default='{title}: {username}', + help='Format string for keys to display in dmenu.' + ' Must generate a unique string.') +argument_parser.add_argument( + '--no-insert-mode', '-n', dest='insert_mode', action='store_false', + help="Don't automatically enter insert mode") +argument_parser.add_argument( + '--io-encoding', '-i', default='UTF-8', + help='Encoding used to communicate with subprocesses') +group = argument_parser.add_mutually_exclusive_group() +group.add_argument('--username-fill-only', '-e', + action='store_true', help='Only insert username') +group.add_argument('--password-fill-only', '-w', + action='store_true', help='Only insert password') + +CMD_DELAY = 50 + + +class ExitCodes(enum.IntEnum): + """Stores various exit codes groups to use.""" + SUCCESS = 0 + FAILURE = 1 + # 1 is automatically used if Python throws an exception + NO_CANDIDATES = 2 + USER_QUIT = 3 + DB_OPEN_FAIL = 4 + + INTERNAL_ERROR = 10 + + +def qute_command(command): + with open(os.environ['QUTE_FIFO'], 'w') as fifo: + fifo.write(command + '\n') + fifo.flush() + + +def stderr(to_print): + """Extra functionality to echo out errors to qb ui.""" + print(to_print, file=sys.stderr) + qute_command('message-error "{}"'.format(to_print)) + + +def dmenu(items, invocation, encoding): + """Runs dmenu with given arguments.""" + command = shlex.split(invocation) + process = subprocess.run(command, input='\n'.join(items).encode(encoding), + stdout=subprocess.PIPE) + return process.stdout.decode(encoding).strip() + + +def get_password(): + """Get a keepass db password from user.""" + _app = QApplication(sys.argv) + text, ok = QInputDialog.getText( + None, "KeePass DB Password", + "Please enter your KeePass Master Password", + QLineEdit.Password) + if not ok: + stderr('Password Prompt Rejected.') + sys.exit(ExitCodes.USER_QUIT) + return text + + +def find_candidates(args, host): + """Finds candidates that match host""" + file_path = os.path.expanduser(args.path) + + # TODO find a way to keep the db open, so we don't open (and query + # password) it every time + + pw = None + if not args.no_password: + pw = get_password() + + kf = args.keyfile_path + if kf: + kf = os.path.expanduser(kf) + + try: + kp = pykeepass.PyKeePass(file_path, password=pw, keyfile=kf) + except Exception as e: + stderr("There was an error opening the DB: {}".format(str(e))) + + return kp.find_entries(url="{}{}{}".format(".*", host, ".*"), regex=True) + + +def candidate_to_str(args, candidate): + """Turns candidate into a human readable string for dmenu""" + return args.dmenu_format.format(title=candidate.title, + url=candidate.url, + username=candidate.username, + path=candidate.path, + uuid=candidate.uuid) + + +def candidate_to_secret(candidate): + """Turns candidate into a generic (user, password) tuple""" + return (candidate.username, candidate.password) + + +def run(args): + """Runs qute-keepass""" + if not args.url: + argument_parser.print_help() + return ExitCodes.FAILURE + + url_host = QUrl(args.url).host() + + if not url_host: + stderr('{} was not parsed as a valid URL!'.format(args.url)) + return ExitCodes.INTERNAL_ERROR + + # Find candidates matching the host of the given URL + candidates = find_candidates(args, url_host) + if not candidates: + stderr('No candidates for URL {!r} found!'.format(args.url)) + return ExitCodes.NO_CANDIDATES + + # Create a map so we can get turn the resulting string from dmenu back into + # a candidate + candidates_strs = list(map(functools.partial(candidate_to_str, args), + candidates)) + candidates_map = dict(zip(candidates_strs, candidates)) + + if len(candidates) == 1: + selection = candidates.pop() + else: + selection = dmenu(candidates_strs, + args.dmenu_invocation, + args.io_encoding) + + if selection not in candidates_map: + stderr("'{}' was not a valid entry!").format(selection) + return ExitCodes.USER_QUIT + + selection = candidates_map[selection] + + username, password = candidate_to_secret(selection) + + insert_mode = ';; enter-mode insert' if args.insert_mode else '' + if args.username_fill_only: + qute_command('insert-text {}{}'.format(username, insert_mode)) + elif args.password_fill_only: + qute_command('insert-text {}{}'.format(password, insert_mode)) + else: + # Enter username and password using insert-key and fake-key <Tab> + # (which supports more passwords than fake-key only), then switch back + # into insert-mode, so the form can be directly submitted by hitting + # enter afterwards. It dosen't matter when we go into insert mode, but + # the other commands need to be be executed sequentially, so we add + # delays with later. + qute_command('insert-text {} ;;' + 'later {} fake-key <Tab> ;;' + 'later {} insert-text {}{}' + .format(username, CMD_DELAY, + CMD_DELAY * 2, password, insert_mode)) + + return ExitCodes.SUCCESS + + +if __name__ == '__main__': + arguments = argument_parser.parse_args() + sys.exit(run(arguments)) diff --git a/.config/qutebrowser/misc/userscripts/qute-lastpass b/.config/qutebrowser/misc/userscripts/qute-lastpass new file mode 100755 index 0000000..ea88cf8 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/qute-lastpass @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 + +# Copyright 2017 Chris Braun (cryzed) <cryzed@googlemail.com> +# Adapted for LastPass by Wayne Cheng (welps) <waynethecheng@gmail.com> +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published bjy +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser 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 qutebrowser. If not, see <http://www.gnu.org/licenses/>. + +""" +Insert login information using lastpass CLI and a dmenu-compatible application (e.g. dmenu, rofi -dmenu, ...). +A short demonstration can be seen here: https://i.imgur.com/zA61NrF.gifv. +""" + +USAGE = """The domain of the site has to be in the name of the LastPass entry, for example: "github.com/cryzed" or +"websites/github.com". The login information is inserted by emulating key events using qutebrowser's fake-key command in this manner: +[USERNAME]<Tab>[PASSWORD], which is compatible with almost all login forms. + +You must log into LastPass CLI using `lpass login <email>` prior to use of this script. The LastPass CLI agent only holds your master password for an hour by default. If you wish to change this, please see `man lpass`. + +To use in qutebrowser, run: `spawn --userscript qute-lastpass` +""" + +EPILOG = """Dependencies: tldextract (Python 3 module), LastPass CLI (1.3 or newer) + +WARNING: The login details are viewable as plaintext in qutebrowser's debug log (qute://log) and might be shared if +you decide to submit a crash report!""" + +import argparse +import enum +import fnmatch +import functools +import os +import re +import shlex +import subprocess +import sys +import json +import tldextract + +argument_parser = argparse.ArgumentParser( + description=__doc__, usage=USAGE, epilog=EPILOG) +argument_parser.add_argument('url', nargs='?', default=os.getenv('QUTE_URL')) +argument_parser.add_argument('--dmenu-invocation', '-d', default='rofi -dmenu', + help='Invocation used to execute a dmenu-provider') +argument_parser.add_argument('--no-insert-mode', '-n', dest='insert_mode', action='store_false', + help="Don't automatically enter insert mode") +argument_parser.add_argument('--io-encoding', '-i', default='UTF-8', + help='Encoding used to communicate with subprocesses') +argument_parser.add_argument('--merge-candidates', '-m', action='store_true', + help='Merge pass candidates for fully-qualified and registered domain name') +group = argument_parser.add_mutually_exclusive_group() +group.add_argument('--username-only', '-e', + action='store_true', help='Only insert username') +group.add_argument('--password-only', '-w', + action='store_true', help='Only insert password') + +stderr = functools.partial(print, file=sys.stderr) + +class ExitCodes(enum.IntEnum): + SUCCESS = 0 + FAILURE = 1 + # 1 is automatically used if Python throws an exception + NO_PASS_CANDIDATES = 2 + COULD_NOT_MATCH_USERNAME = 3 + COULD_NOT_MATCH_PASSWORD = 4 + +def qute_command(command): + with open(os.environ['QUTE_FIFO'], 'w') as fifo: + fifo.write(command + '\n') + fifo.flush() + +def pass_(domain, encoding): + args = ['lpass', 'show', '-x', '-j', '-G', '.*{:s}.*'.format(domain)] + process = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + err = process.stderr.decode(encoding).strip() + if err: + msg = "LastPass CLI returned for {:s} - {:s}".format(domain, err) + stderr(msg) + return '[]' + + out = process.stdout.decode(encoding).strip() + + return out + +def dmenu(items, invocation, encoding): + command = shlex.split(invocation) + process = subprocess.run(command, input='\n'.join( + items).encode(encoding), stdout=subprocess.PIPE) + return process.stdout.decode(encoding).strip() + + +def fake_key_raw(text): + for character in text: + # Escape all characters by default, space requires special handling + sequence = '" "' if character == ' ' else '\{}'.format(character) + qute_command('fake-key {}'.format(sequence)) + + +def main(arguments): + if not arguments.url: + argument_parser.print_help() + return ExitCodes.FAILURE + + extract_result = tldextract.extract(arguments.url) + + # Try to find candidates using targets in the following order: fully-qualified domain name (includes subdomains), + # the registered domain name and finally: the IPv4 address if that's what + # the URL represents + candidates = [] + for target in filter(None, [extract_result.fqdn, extract_result.registered_domain, extract_result.subdomain + extract_result.domain, extract_result.domain, extract_result.ipv4]): + target_candidates = json.loads(pass_(target, arguments.io_encoding)) + if not target_candidates: + continue + + candidates = candidates + target_candidates + if not arguments.merge_candidates: + break + else: + if not candidates: + stderr('No pass candidates for URL {!r} found!'.format( + arguments.url)) + return ExitCodes.NO_PASS_CANDIDATES + + if len(candidates) == 1: + selection = candidates.pop() + else: + choices = ["{:s} | {:s} | {:s} | {:s}".format(c["id"], c["name"], c["url"], c["username"]) for c in candidates] + choice = dmenu(choices, arguments.dmenu_invocation, arguments.io_encoding) + choiceId = choice.split("|")[0].strip() + selection = next((c for (i, c) in enumerate(candidates) if c["id"] == choiceId), None) + + # Nothing was selected, simply return + if not selection: + return ExitCodes.SUCCESS + + username = selection["username"] + password = selection["password"] + + if arguments.username_only: + fake_key_raw(username) + elif arguments.password_only: + fake_key_raw(password) + else: + # Enter username and password using fake-key and <Tab> (which seems to work almost universally), then switch + # back into insert-mode, so the form can be directly submitted by + # hitting enter afterwards + fake_key_raw(username) + qute_command('fake-key <Tab>') + fake_key_raw(password) + + if arguments.insert_mode: + qute_command('enter-mode insert') + + return ExitCodes.SUCCESS + + +if __name__ == '__main__': + arguments = argument_parser.parse_args() + sys.exit(main(arguments)) diff --git a/.config/qutebrowser/misc/userscripts/qute-pass b/.config/qutebrowser/misc/userscripts/qute-pass new file mode 100755 index 0000000..4f79e11 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/qute-pass @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 + +# Copyright 2017 Chris Braun (cryzed) <cryzed@googlemail.com> +# +# This file is part of qutebrowser. +# +# qutebrowser 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. +# +# qutebrowser 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 qutebrowser. If not, see <http://www.gnu.org/licenses/>. + +""" +Insert login information using pass and a dmenu-compatible application (e.g. dmenu, rofi -dmenu, ...). A short +demonstration can be seen here: https://i.imgur.com/KN3XuZP.gif. +""" + +USAGE = """The domain of the site has to appear as a segment in the pass path, for example: "github.com/cryzed" or +"websites/github.com". How the username and password are determined is freely configurable using the CLI arguments. The +login information is inserted by emulating key events using qutebrowser's fake-key command in this manner: +[USERNAME]<Tab>[PASSWORD], which is compatible with almost all login forms. + +Suggested bindings similar to Uzbl's `formfiller` script: + + config.bind('<z><l>', 'spawn --userscript qute-pass') + config.bind('<z><u><l>', 'spawn --userscript qute-pass --username-only') + config.bind('<z><p><l>', 'spawn --userscript qute-pass --password-only') + config.bind('<z><o><l>', 'spawn --userscript qute-pass --otp-only') +""" + +EPILOG = """Dependencies: tldextract (Python 3 module), pass, pass-otp (optional). +For issues and feedback please use: https://github.com/cryzed/qutebrowser-userscripts. + +WARNING: The login details are viewable as plaintext in qutebrowser's debug log (qute://log) and might be shared if +you decide to submit a crash report!""" + +import argparse +import enum +import fnmatch +import functools +import os +import re +import shlex +import subprocess +import sys + +import tldextract + +argument_parser = argparse.ArgumentParser(description=__doc__, usage=USAGE, epilog=EPILOG) +argument_parser.add_argument('url', nargs='?', default=os.getenv('QUTE_URL')) +argument_parser.add_argument('--password-store', '-p', default=os.path.expanduser('~/.password-store'), + help='Path to your pass password-store') +argument_parser.add_argument('--username-pattern', '-u', default=r'.*/(.+)', + help='Regular expression that matches the username') +argument_parser.add_argument('--username-target', '-U', choices=['path', 'secret'], default='path', + help='The target for the username regular expression') +argument_parser.add_argument('--password-pattern', '-P', default=r'(.*)', + help='Regular expression that matches the password') +argument_parser.add_argument('--dmenu-invocation', '-d', default='rofi -dmenu', + help='Invocation used to execute a dmenu-provider') +argument_parser.add_argument('--no-insert-mode', '-n', dest='insert_mode', action='store_false', + help="Don't automatically enter insert mode") +argument_parser.add_argument('--io-encoding', '-i', default='UTF-8', + help='Encoding used to communicate with subprocesses') +argument_parser.add_argument('--merge-candidates', '-m', action='store_true', + help='Merge pass candidates for fully-qualified and registered domain name') +group = argument_parser.add_mutually_exclusive_group() +group.add_argument('--username-only', '-e', action='store_true', help='Only insert username') +group.add_argument('--password-only', '-w', action='store_true', help='Only insert password') +group.add_argument('--otp-only', '-o', action='store_true', help='Only insert OTP code') + +stderr = functools.partial(print, file=sys.stderr) + + +class ExitCodes(enum.IntEnum): + SUCCESS = 0 + FAILURE = 1 + # 1 is automatically used if Python throws an exception + NO_PASS_CANDIDATES = 2 + COULD_NOT_MATCH_USERNAME = 3 + COULD_NOT_MATCH_PASSWORD = 4 + + +def qute_command(command): + with open(os.environ['QUTE_FIFO'], 'w') as fifo: + fifo.write(command + '\n') + fifo.flush() + + +def find_pass_candidates(domain, password_store_path): + candidates = [] + for path, directories, file_names in os.walk(password_store_path, followlinks=True): + if directories or domain not in path.split(os.path.sep): + continue + + # Strip password store path prefix to get the relative pass path + pass_path = path[len(password_store_path) + 1:] + secrets = fnmatch.filter(file_names, '*.gpg') + candidates.extend(os.path.join(pass_path, os.path.splitext(secret)[0]) for secret in secrets) + return candidates + + +def _run_pass(command, encoding): + process = subprocess.run(command, stdout=subprocess.PIPE) + return process.stdout.decode(encoding).strip() + + +def pass_(path, encoding): + return _run_pass(['pass', path], encoding) + + +def pass_otp(path, encoding): + return _run_pass(['pass', 'otp', path], encoding) + + +def dmenu(items, invocation, encoding): + command = shlex.split(invocation) + process = subprocess.run(command, input='\n'.join(items).encode(encoding), stdout=subprocess.PIPE) + return process.stdout.decode(encoding).strip() + + +def fake_key_raw(text): + for character in text: + # Escape all characters by default, space requires special handling + sequence = '" "' if character == ' ' else '\{}'.format(character) + qute_command('fake-key {}'.format(sequence)) + + +def main(arguments): + if not arguments.url: + argument_parser.print_help() + return ExitCodes.FAILURE + + extract_result = tldextract.extract(arguments.url) + + # Expand potential ~ in paths, since this script won't be called from a shell that does it for us + password_store_path = os.path.expanduser(arguments.password_store) + + # Try to find candidates using targets in the following order: fully-qualified domain name (includes subdomains), + # the registered domain name and finally: the IPv4 address if that's what the URL represents + candidates = set() + for target in filter(None, [extract_result.fqdn, extract_result.registered_domain, extract_result.ipv4]): + target_candidates = find_pass_candidates(target, password_store_path) + if not target_candidates: + continue + + candidates.update(target_candidates) + if not arguments.merge_candidates: + break + else: + if not candidates: + stderr('No pass candidates for URL {!r} found!'.format(arguments.url)) + return ExitCodes.NO_PASS_CANDIDATES + + selection = candidates.pop() if len(candidates) == 1 else dmenu(sorted(candidates), arguments.dmenu_invocation, + arguments.io_encoding) + # Nothing was selected, simply return + if not selection: + return ExitCodes.SUCCESS + + secret = pass_(selection, arguments.io_encoding) + + # Match username + target = selection if arguments.username_target == 'path' else secret + match = re.match(arguments.username_pattern, target) + if not match: + stderr('Failed to match username pattern on {}!'.format(arguments.username_target)) + return ExitCodes.COULD_NOT_MATCH_USERNAME + username = match.group(1) + + # Match password + match = re.match(arguments.password_pattern, secret) + if not match: + stderr('Failed to match password pattern on secret!') + return ExitCodes.COULD_NOT_MATCH_PASSWORD + password = match.group(1) + + if arguments.username_only: + fake_key_raw(username) + elif arguments.password_only: + fake_key_raw(password) + elif arguments.otp_only: + otp = pass_otp(selection, arguments.io_encoding) + fake_key_raw(otp) + else: + # Enter username and password using fake-key and <Tab> (which seems to work almost universally), then switch + # back into insert-mode, so the form can be directly submitted by hitting enter afterwards + fake_key_raw(username) + qute_command('fake-key <Tab>') + fake_key_raw(password) + + if arguments.insert_mode: + qute_command('enter-mode insert') + + return ExitCodes.SUCCESS + + +if __name__ == '__main__': + arguments = argument_parser.parse_args() + sys.exit(main(arguments)) diff --git a/.config/qutebrowser/misc/userscripts/qutedmenu b/.config/qutebrowser/misc/userscripts/qutedmenu new file mode 100755 index 0000000..de1b8d6 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/qutedmenu @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# Handle open -s && open -t with bemenu + +#:bind o spawn --userscript /path/to/userscripts/qutedmenu open +#:bind O spawn --userscript /path/to/userscripts/qutedmenu tab + +# If you would like to set a custom colorscheme/font use these dirs. +# https://github.com/halfwit/dotfiles/blob/master/.config/dmenu/bemenucolors +readonly confdir=${XDG_CONFIG_HOME:-$HOME/.config} + +readonly optsfile=$confdir/dmenu/bemenucolors + +create_menu() { + # Check quickmarks + while read -r url; do + printf -- '%s\n' "$url" + done < "$QUTE_CONFIG_DIR"/quickmarks + + # Next bookmarks + while read -r url _; do + printf -- '%s\n' "$url" + done < "$QUTE_CONFIG_DIR"/bookmarks/urls + + # Finally history + while read -r _ url; do + printf -- '%s\n' "$url" + done < "$QUTE_DATA_DIR"/history + } + +get_selection() { + opts+=(-p qutebrowser) + #create_menu | dmenu -l 10 "${opts[@]}" + create_menu | bemenu -l 10 "${opts[@]}" +} + +# Main +# https://github.com/halfwit/dotfiles/blob/master/.config/dmenu/font +[[ -s $confdir/dmenu/font ]] && read -r font < "$confdir"/dmenu/font + +[[ $font ]] && opts+=(-fn "$font") + +# shellcheck source=/dev/null +[[ -s $optsfile ]] && source "$optsfile" + +url=$(get_selection) +url=${url/*http/http} + +# If no selection is made, exit (escape pressed, e.g.) +[[ ! $url ]] && exit 0 + +case $1 in + open) printf '%s' "open $url" >> "$QUTE_FIFO" || qutebrowser "$url" ;; + tab) printf '%s' "open -t $url" >> "$QUTE_FIFO" || qutebrowser "$url" ;; +esac diff --git a/.config/qutebrowser/misc/userscripts/readability b/.config/qutebrowser/misc/userscripts/readability new file mode 100755 index 0000000..d0ef437 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/readability @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# +# Executes python-readability on current page and opens the summary as new tab. +# +# Depends on the python-readability package, or its fork: +# +# - https://github.com/buriy/python-readability +# - https://github.com/bookieio/breadability +# +# Usage: +# :spawn --userscript readability +# +from __future__ import absolute_import +import codecs, os + +tmpfile = os.path.join( + os.environ.get('QUTE_DATA_DIR', + os.path.expanduser('~/.local/share/qutebrowser')), + 'userscripts/readability.html') + +if not os.path.exists(os.path.dirname(tmpfile)): + os.makedirs(os.path.dirname(tmpfile)) + +with codecs.open(os.environ['QUTE_HTML'], 'r', 'utf-8') as source: + data = source.read() + + try: + from breadability.readable import Article as reader + doc = reader(data) + content = doc.readable + except ImportError: + from readability import Document + doc = Document(data) + content = doc.summary().replace('<html>', '<html><head><title>%s</title></head>' % doc.title()) + + with codecs.open(tmpfile, 'w', 'utf-8') as target: + target.write('<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />') + target.write(content) + + with open(os.environ['QUTE_FIFO'], 'w') as fifo: + fifo.write('open -t %s' % tmpfile) diff --git a/.config/qutebrowser/misc/userscripts/ripbang b/.config/qutebrowser/misc/userscripts/ripbang new file mode 100755 index 0000000..b35ff77 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/ripbang @@ -0,0 +1,34 @@ +#!/usr/bin/env python +# +# Adds DuckDuckGo bang as searchengine. +# +# Usage: +# :spawn --userscript ripbang [bang]... +# +# Example: +# :spawn --userscript ripbang amazon maps +# + +from __future__ import print_function +import os, re, requests, sys + +try: + from urllib.parse import unquote +except ImportError: + from urllib import unquote + +for argument in sys.argv[1:]: + bang = '!' + argument + r = requests.get('https://duckduckgo.com/', + params={'q': bang + ' SEARCHTEXT'}) + + searchengine = unquote(re.search("url=[^']+", r.text).group(0)) + searchengine = searchengine.replace('url=', '') + searchengine = searchengine.replace('/l/?kh=-1&uddg=', '') + searchengine = searchengine.replace('SEARCHTEXT', '{}') + + if os.getenv('QUTE_FIFO'): + with open(os.environ['QUTE_FIFO'], 'w') as fifo: + fifo.write('set searchengines %s %s' % (bang, searchengine)) + else: + print('%s %s' % (bang, searchengine)) diff --git a/.config/qutebrowser/misc/userscripts/rss b/.config/qutebrowser/misc/userscripts/rss new file mode 100755 index 0000000..f8feebe --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/rss @@ -0,0 +1,122 @@ +#!/bin/sh + +# Copyright 2016 Jan Verbeek (blyxxyz) <ring@openmailbox.org> +# +# This file is part of qutebrowser. +# +# qutebrowser 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. +# +# qutebrowser 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 qutebrowser. If not, see <http://www.gnu.org/licenses/>. + +# This script keeps track of URLs in RSS feeds and opens new ones. +# New feeds can be added with ':spawn -u /path/to/userscripts/rss add' or +# ':spawn -u /path/to/userscripts/rss <url>'. +# New items can be opened with ':spawn -u /path/to/userscripts/rss'. +# The script doesn't really parse XML, and searches for things that look like +# item links. It might open things that aren't real links, and it might miss +# real links. + +config_dir="$HOME/.qute-rss" + +add_feed () { + touch "feeds" + if grep -Fq "$1" "feeds"; then + notice "$1 is saved already." + else + printf '%s\n' "$1" >> "feeds" + fi +} + +# Show an error message and exit +fail () { + echo "message-error '$*'" > "$QUTE_FIFO" + exit 1 +} + +# Get a sorted list of item URLs from a RSS feed +get_items () { + $curl "$@" | grep "$text_only" -zo -e '<guid[^<>]*>[^<>]*</guid>' \ + -e '<link[^<>]*>[^<>]*</link>' \ + -e '<link[^<>]*href="[^"]*"' | + grep "$text_only" -o 'http[^<>"]*' | sort | uniq +} + +# Show an info message +notice () { + echo "message-info '$*'" > "$QUTE_FIFO" +} + +# Update a database of a feed and open new URLs +read_items () { + cd read_urls || return 1 + feed_file="$(echo "$1" | tr -d /)" + feed_temp_file="$(mktemp "$feed_file.tmp.XXXXXXXXXX")" + feed_new_items="$(mktemp "$feed_file.new.XXXXXXXXXX")" + get_items "$1" > "$feed_temp_file" + if [ ! -s "$feed_temp_file" ]; then + notice "No items found for $1." + rm "$feed_temp_file" "$feed_new_items" + elif [ ! -f "$feed_file" ]; then + notice "$1 is a new feed. All items will be marked as read." + mv "$feed_temp_file" "$feed_file" + rm "$feed_new_items" + else + sort -o "$feed_file" "$feed_file" + comm -2 -3 "$feed_temp_file" "$feed_file" | tee "$feed_new_items" + cat "$feed_new_items" >> "$feed_file" + sort -o "$feed_file" "$feed_file" + rm "$feed_temp_file" "$feed_new_items" + fi | while read -r item; do + echo "open -t $item" > "$QUTE_FIFO" + done +} + +if [ ! -d "$config_dir/read_urls" ]; then + notice "Creating configuration directory." + mkdir -p "$config_dir/read_urls" +fi + +cd "$config_dir" || exit 1 + +if [ $# != 0 ]; then + for arg in "$@"; do + if [ "$arg" = "add" ]; then + add_feed "$QUTE_URL" + else + add_feed "$arg" + fi + done + exit +fi + +if [ ! -f "feeds" ]; then + fail "Add feeds by running ':spawn -u rss add' or ':spawn -u rss <url>'." +fi + +if curl --version >&-; then + curl="curl -sL" +elif wget --version >&-; then + curl="wget -qO -" +else + fail "Either curl or wget is needed to run this script." +fi + +# Detect GNU grep so we can force it to treat everything as text +if < /dev/null grep --help 2>&1 | grep -q -- -a; then + text_only="-a" +fi + +while read -r feed_url; do + read_items "$feed_url" & +done < "$config_dir/feeds" + +wait diff --git a/.config/qutebrowser/misc/userscripts/taskadd b/.config/qutebrowser/misc/userscripts/taskadd new file mode 100755 index 0000000..36e1c2c --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/taskadd @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +# +# Behavior: +# Userscript for qutebrowser which adds a task to taskwarrior. +# If run as a command (:spawn --userscript taskadd), it creates a new task +# with the description equal to the current page title and annotates it with +# the current page url. Additional arguments are passed along so you can add +# mods to the task (e.g. priority, due date, tags). +# +# Example: +# :spawn --userscript taskadd due:eod pri:H +# +# To enable passing along extra args, I suggest using a mapping like: +# :bind <somekey> set-cmd-text -s :spawn --userscript taskadd +# +# If run from hint mode, it uses the selected hint text as the description +# and the selected hint url as the annotation. +# +# Ryan Roden-Corrent (rcorre), 2016 +# Any feedback is welcome! +# +# For more info on Taskwarrior, see http://taskwarrior.org/ + +# use either the current page title or the hint text as the task description +[[ $QUTE_MODE == 'hints' ]] && title=$QUTE_SELECTED_TEXT || title=$QUTE_TITLE + +# try to add the task and grab the output +if msg="$(task add "$title" "$*" 2>&1)"; then + # annotate the new task with the url, send the output back to the browser + task +LATEST annotate "$QUTE_URL" + echo "message-info '$(echo "$msg" | head -n 1)'" >> "$QUTE_FIFO" +else + echo "message-error '$(echo "$msg" | head -n 1)'" >> "$QUTE_FIFO" +fi diff --git a/.config/qutebrowser/misc/userscripts/tor_identity b/.config/qutebrowser/misc/userscripts/tor_identity new file mode 100755 index 0000000..93b6d41 --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/tor_identity @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright 2018 jnphilipp <mail@jnphilipp.org> +# +# This file is part of qutebrowser. +# +# qutebrowser 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. +# +# qutebrowser 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 qutebrowser. If not, see <http://www.gnu.org/licenses/>. + +# Change your tor identity. +# +# Set a hotkey to launch this script, then: +# :bind ti spawn --userscript tor_identity PASSWORD +# +# Use the hotkey to change your tor identity, press 'ti' to change it. +# https://stem.torproject.org/faq.html#how-do-i-request-a-new-identity-from-tor +# + +import os +import sys + +try: + from stem import Signal + from stem.control import Controller +except ImportError: + if os.getenv('QUTE_FIFO'): + with open(os.environ['QUTE_FIFO'], 'w') as f: + f.write('message-error "Failed to import stem."') + else: + print('Failed to import stem.') + + +password = sys.argv[1] +with Controller.from_port(port=9051) as controller: + controller.authenticate(password) + controller.signal(Signal.NEWNYM) + if os.getenv('QUTE_FIFO'): + with open(os.environ['QUTE_FIFO'], 'w') as f: + f.write('message-info "Tor identity changed."') + else: + print('Tor identity changed.') diff --git a/.config/qutebrowser/misc/userscripts/view_in_mpv b/.config/qutebrowser/misc/userscripts/view_in_mpv new file mode 100755 index 0000000..16603bd --- /dev/null +++ b/.config/qutebrowser/misc/userscripts/view_in_mpv @@ -0,0 +1,143 @@ +#!/usr/bin/env bash +# +# Behavior: +# Userscript for qutebrowser which views the current web page in mpv using +# sensible mpv-flags. While viewing the page in MPV, all <video>, <embed>, +# and <object> tags in the original page are temporarily removed. Clicking on +# such a removed video restores the respective video. +# +# In order to use this script, just start it using `spawn --userscript` from +# qutebrowser. I recommend using an alias, e.g. put this in the +# [alias]-section of qutebrowser.conf: +# +# mpv = spawn --userscript /path/to/view_in_mpv +# +# Background: +# Most of my machines are too slow to play youtube videos using html5, but +# they work fine in mpv (and mpv has further advantages like video scaling, +# etc). Of course, I don't want the video to be played (or even to be +# downloaded) twice — in MPV and in qwebkit. So I often close the tab after +# opening it in mpv. However, I actually want to keep the rest of the page +# (comments and video suggestions), i.e. only the videos should disappear +# when mpv is started. And that's precisely what the present script does. +# +# Thorsten Wißmann, 2015 (thorsten` on freenode) +# Any feedback is welcome! + +set -e + +if [ -z "$QUTE_FIFO" ] ; then + cat 1>&2 <<EOF +Error: $0 can not be run as a standalone script. + +It is a qutebrowser userscript. In order to use it, call it using +'spawn --userscript' as described in qute://help/userscripts.html +EOF + exit 1 +fi + +msg() { + local cmd="$1" + shift + local msg="$*" + if [ -z "$QUTE_FIFO" ] ; then + echo "$cmd: $msg" >&2 + else + echo "message-$cmd '${msg//\'/\\\'}'" >> "$QUTE_FIFO" + fi +} + +MPV_COMMAND=${MPV_COMMAND:-mpv} +# Warning: spaces in single flags are not supported +MPV_FLAGS=${MPV_FLAGS:- --force-window --no-terminal --keep-open=yes --ytdl} +IFS=" " read -r -a video_command <<< "$MPV_COMMAND $MPV_FLAGS" + +js() { +cat <<EOF + + function descendantOfTagName(child, ancestorTagName) { + // tells whether child has some (proper) ancestor + // with the tag name ancestorTagName + while (child.parentNode != null) { + child = child.parentNode; + if (typeof child.tagName === 'undefined') break; + if (child.tagName.toUpperCase() == ancestorTagName.toUpperCase()) { + return true; + } + } + return false; + } + + var App = {}; + + var all_videos = []; + all_videos.push.apply(all_videos, document.getElementsByTagName("video")); + all_videos.push.apply(all_videos, document.getElementsByTagName("object")); + all_videos.push.apply(all_videos, document.getElementsByTagName("embed")); + App.backup_videos = Array(); + App.all_replacements = Array(); + for (i = 0; i < all_videos.length; i++) { + var video = all_videos[i]; + if (descendantOfTagName(video, "object")) { + // skip tags that are contained in an object, because we hide + // the object anyway. + continue; + } + var replacement = document.createElement("div"); + replacement.innerHTML = " + <p style=\\"margin-bottom: 0.5em\\"> + Opening page with: + <span style=\\"font-family: monospace;\\">${video_command[*]}</span> + </p> + <p> + In order to restore this particular video + <a style=\\"font-weight: bold; + color: white; + background: transparent; + \\" + onClick=\\"restore_video(this, " + i + ");\\" + href=\\"javascript: restore_video(this, " + i + ")\\" + >click here</a>. + </p> + "; + replacement.style.position = "relative"; + replacement.style.zIndex = "100003000000"; + replacement.style.fontSize = "1rem"; + replacement.style.textAlign = "center"; + replacement.style.verticalAlign = "middle"; + replacement.style.height = "100%"; + replacement.style.background = "#101010"; + replacement.style.color = "white"; + replacement.style.border = "4px dashed #545454"; + replacement.style.padding = "2em"; + replacement.style.margin = "auto"; + App.all_replacements[i] = replacement; + App.backup_videos[i] = video; + video.parentNode.replaceChild(replacement, video); + } + + function restore_video(obj, index) { + obj = App.all_replacements[index]; + video = App.backup_videos[index]; + console.log(video); + obj.parentNode.replaceChild(video, obj); + } + + /** force repainting the video, thanks to: + * http://martinwolf.org/2014/06/10/force-repaint-of-an-element-with-javascript/ + */ + var siteHeader = document.getElementById('header'); + siteHeader.style.display='none'; + siteHeader.offsetHeight; // no need to store this anywhere, the reference is enough + siteHeader.style.display='block'; + +EOF +} + +printjs() { + js | sed 's,//.*$,,' | tr '\n' ' ' +} +echo "jseval -q $(printjs)" >> "$QUTE_FIFO" + +msg info "Opening $QUTE_URL with mpv" +"${video_command[@]}" "$@" "$QUTE_URL" |
