Added fixup-gv.sh and Makefile rules to generate annotated goroutines in graphviz output.

Signed-off-by: Russ Magee <rmagee@gmail.com>
This commit is contained in:
Russ Magee 2018-11-25 18:43:53 -08:00
parent 2da0d8b198
commit fc05a9a4a3
11 changed files with 172 additions and 1640 deletions

9
fixup-gv.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
inFile="${1/.go/}"
visFile="${inFile}-vis.gv"
#grep -o "\.[a-zA-Z_]*\$[0-9]*" "$inFile"-vis.gv | sort | uniq
grep -o "#gv:.*" "$inFile.go" | cut -f2 -d: | \
while read -r expr; do sed -i ${expr} "${visFile}"; done

View File

@ -14,43 +14,43 @@ digraph gocallvis {
edge [minlen="2"]
subgraph "cluster_focus" {
bgcolor="#e6ecfa";
label="main";
labelloc="t";
labelloc="t";
labeljust="c";
fontsize="18";
bgcolor="#e6ecfa";
label="main";
"blitter.com/go/hkexsh/hkexpasswd.main" [ fillcolor="lightblue" label="main" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexpasswd.main" [ label="main" penwidth="0.5" fillcolor="lightblue" ]
subgraph "cluster_blitter.com/go/hkexsh" {
style="filled";
fontsize="16";
fillcolor="lightyellow";
label="[hkexsh]";
penwidth="0.8";
fontsize="16";
fontname="bold";
rank="sink";
URL="/?f=blitter.com/go/hkexsh";
tooltip="package: blitter.com/go/hkexsh";
penwidth="0.8";
style="filled";
rank="sink";
label="[hkexsh]";
URL="/?f=blitter.com/go/hkexsh";
"blitter.com/go/hkexsh.ReadPassword" [ fillcolor="moccasin" label="ReadPassword" penwidth="1.5" ]
}
subgraph "cluster_github.com/jameskeane/bcrypt" {
fontname="bold";
fillcolor="lightyellow";
fontname="bold";
rank="sink";
tooltip="package: github.com/jameskeane/bcrypt";
fontsize="16";
style="filled";
label="[bcrypt]";
URL="/?f=github.com/jameskeane/bcrypt";
penwidth="0.8";
fontsize="16";
style="filled";
fillcolor="lightyellow";
tooltip="package: github.com/jameskeane/bcrypt";
"github.com/jameskeane/bcrypt.Salt" [ fillcolor="moccasin" label="Salt" penwidth="1.5" ]
"github.com/jameskeane/bcrypt.Hash" [ penwidth="1.5" fillcolor="moccasin" label="Hash" ]
"github.com/jameskeane/bcrypt.Match" [ penwidth="1.5" fillcolor="moccasin" label="Match" ]
"github.com/jameskeane/bcrypt.Match" [ fillcolor="moccasin" label="Match" penwidth="1.5" ]
}

View File

@ -10,6 +10,5 @@ clean:
$(RM) $(EXE) $(EXE).exe
vis:
go-callvis -skipbrowser -svg -png -output hkexsh-vis -ignore $(EXTPKGS) -group pkg,type .
go-callvis -skipbrowser -output hkexsh-vis -ignore $(EXTPKGS) -group pkg,type .
../fixup-gv.sh hkexsh.go && cat hkexsh-vis.gv | dot -Tpng -ohkexsh-vis.gv.png

View File

@ -20,13 +20,13 @@ labelloc="t";
labeljust="c";
fontsize="18";
"blitter.com/go/hkexsh/hkexsh.rejectUserMsg" [ penwidth="0.5" fillcolor="lightblue" label="rejectUserMsg" ]
"blitter.com/go/hkexsh/hkexsh.reqTunnel" [ label="reqTunnel" penwidth="0.5" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexsh.main" [ fillcolor="lightblue" label="main" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs" [ label="parseNonSwitchArgs" penwidth="0.5" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexsh.main$1" [ style="dotted,filled" fillcolor="lightblue" label="deferRestore" ]
"blitter.com/go/hkexsh/hkexsh.main" [ label="main" penwidth="0.5" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs" [ fillcolor="lightblue" label="parseNonSwitchArgs" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexsh.main$1" [ fillcolor="lightblue" label="deferRestore" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexsh.sendSessionParams" [ fillcolor="lightblue" label="sendSessionParams" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexsh.rejectUserMsg" [ penwidth="0.5" fillcolor="lightblue" label="rejectUserMsg" ]
"blitter.com/go/hkexsh/hkexsh.main$2" [ label="deferCloseChaff" style="dotted,filled" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexsh.reqTunnel" [ penwidth="0.5" fillcolor="lightblue" label="reqTunnel" ]
"blitter.com/go/hkexsh/hkexsh.launchTuns" [ fillcolor="lightblue" label="launchTuns" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexsh.doShellMode$1" [ fillcolor="lightblue" label="shellRemoteToStdin" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexsh.doShellMode" [ fillcolor="lightblue" label="doShellMode" penwidth="0.5" ]
@ -35,107 +35,107 @@ fontsize="18";
"blitter.com/go/hkexsh/hkexsh.handleTermResizes" [ fillcolor="lightblue" label="handleTermResizes" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexsh.doShellMode$2" [ label="shellStdinToRemote" style="dotted,filled" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexsh.doShellMode$2$1" [ fillcolor="lightblue" label="doShellMode$2$1" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexsh.doCopyMode" [ label="doCopyMode" penwidth="0.5" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexsh.usageShell" [ label="usageShell" penwidth="0.5" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexsh.doCopyMode" [ penwidth="0.5" fillcolor="lightblue" label="doCopyMode" ]
"blitter.com/go/hkexsh/hkexsh.usageShell" [ fillcolor="lightblue" label="usageShell" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexsh.usageCp" [ fillcolor="lightblue" label="usageCp" penwidth="0.5" ]
subgraph "cluster_blitter.com/go/hkexsh" {
style="filled";
fontsize="16";
style="filled";
fillcolor="lightyellow";
fontname="bold";
penwidth="0.8";
fontsize="16";
URL="/?f=blitter.com/go/hkexsh";
tooltip="package: blitter.com/go/hkexsh";
rank="sink";
label="[hkexsh]";
URL="/?f=blitter.com/go/hkexsh";
tooltip="package: blitter.com/go/hkexsh";
"blitter.com/go/hkexsh.MakeRaw" [ fillcolor="moccasin" label="MakeRaw" penwidth="1.5" ]
"blitter.com/go/hkexsh.Restore" [ penwidth="1.5" fillcolor="moccasin" label="Restore" ]
"blitter.com/go/hkexsh.Restore" [ label="Restore" penwidth="1.5" fillcolor="moccasin" ]
"blitter.com/go/hkexsh.ReadPassword" [ fillcolor="moccasin" label="ReadPassword" penwidth="1.5" ]
"blitter.com/go/hkexsh.NewSession" [ fillcolor="moccasin" label="NewSession" penwidth="1.5" ]
subgraph "cluster_*blitter.com/go/hkexsh.Session" {
penwidth="0.5";
label="(*Session)";
tooltip="type: *blitter.com/go/hkexsh.Session";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
label="(*Session)";
tooltip="type: *blitter.com/go/hkexsh.Session";
"(*blitter.com/go/hkexsh.Session).SetStatus" [ fillcolor="moccasin" label="SetStatus" penwidth="1.5" ]
}
subgraph "cluster_blitter.com/go/hkexsh.Session" {
fontsize="15";
tooltip="type: blitter.com/go/hkexsh.Session";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
label="(Session)";
tooltip="type: blitter.com/go/hkexsh.Session";
penwidth="0.5";
"(blitter.com/go/hkexsh.Session).Op" [ fillcolor="moccasin" label="Op" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).Who" [ fillcolor="moccasin" label="Who" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).ConnHost" [ fillcolor="moccasin" label="ConnHost" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).TermType" [ penwidth="1.5" fillcolor="moccasin" label="TermType" ]
"(blitter.com/go/hkexsh.Session).TermType" [ label="TermType" penwidth="1.5" fillcolor="moccasin" ]
"(blitter.com/go/hkexsh.Session).Cmd" [ fillcolor="moccasin" label="Cmd" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).AuthCookie" [ fillcolor="moccasin" label="AuthCookie" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).Status" [ penwidth="1.5" fillcolor="moccasin" label="Status" ]
"(blitter.com/go/hkexsh.Session).Status" [ fillcolor="moccasin" label="Status" penwidth="1.5" ]
}
}
subgraph "cluster_blitter.com/go/hkexsh/hkexnet" {
fontname="bold";
URL="/?f=blitter.com/go/hkexsh/hkexnet";
fillcolor="lightyellow";
fontsize="16";
style="filled";
rank="sink";
label="[hkexnet]";
URL="/?f=blitter.com/go/hkexsh/hkexnet";
tooltip="package: blitter.com/go/hkexsh/hkexnet";
penwidth="0.8";
fontsize="16";
fontname="bold";
label="[hkexnet]";
style="filled";
fillcolor="lightyellow";
rank="sink";
"blitter.com/go/hkexsh/hkexnet.Init" [ penwidth="1.5" fillcolor="moccasin" label="Init" ]
"blitter.com/go/hkexsh/hkexnet.Init" [ fillcolor="moccasin" label="Init" penwidth="1.5" ]
"blitter.com/go/hkexsh/hkexnet.Dial" [ fillcolor="moccasin" label="Dial" penwidth="1.5" ]
subgraph "cluster_*blitter.com/go/hkexsh/hkexnet.Conn" {
fontsize="15";
fontcolor="#222222";
labelloc="b";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
label="(*Conn)";
tooltip="type: *blitter.com/go/hkexsh/hkexnet.Conn";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
"(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ label="WritePacket" penwidth="1.5" fillcolor="moccasin" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).Close" [ fillcolor="moccasin" label="Close" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ fillcolor="moccasin" label="SetupChaff" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).Close" [ penwidth="1.5" fillcolor="moccasin" label="Close" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ penwidth="1.5" fillcolor="moccasin" label="SetupChaff" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ fillcolor="moccasin" label="EnableChaff" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ label="DisableChaff" penwidth="1.5" fillcolor="moccasin" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ label="ShutdownChaff" penwidth="1.5" fillcolor="moccasin" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ fillcolor="moccasin" label="DisableChaff" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ fillcolor="moccasin" label="ShutdownChaff" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ fillcolor="moccasin" label="WritePacket" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus" [ fillcolor="moccasin" label="SetStatus" penwidth="1.5" ]
}
subgraph "cluster_blitter.com/go/hkexsh/hkexnet.Conn" {
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
style="rounded,filled";
fillcolor="wheat2";
label="(Conn)";
tooltip="type: blitter.com/go/hkexsh/hkexnet.Conn";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
"(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ fillcolor="moccasin" label="Write" penwidth="1.5" ]
"(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ penwidth="1.5" fillcolor="moccasin" label="Write" ]
"(blitter.com/go/hkexsh/hkexnet.Conn).Read" [ fillcolor="moccasin" label="Read" penwidth="1.5" ]
"(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus" [ fillcolor="moccasin" label="GetStatus" penwidth="1.5" ]
@ -144,56 +144,53 @@ tooltip="type: blitter.com/go/hkexsh/hkexnet.Conn";
}
subgraph "cluster_blitter.com/go/hkexsh/logger" {
fontsize="16";
URL="/?f=blitter.com/go/hkexsh/logger";
fontsize="16";
style="filled";
fillcolor="lightyellow";
fontname="bold";
tooltip="package: blitter.com/go/hkexsh/logger";
penwidth="0.8";
rank="sink";
label="[logger]";
URL="/?f=blitter.com/go/hkexsh/logger";
fillcolor="lightyellow";
tooltip="package: blitter.com/go/hkexsh/logger";
"blitter.com/go/hkexsh/logger.LogDebug" [ fillcolor="moccasin" label="LogDebug" penwidth="1.5" ]
"blitter.com/go/hkexsh/logger.New" [ fillcolor="moccasin" label="New" penwidth="1.5" ]
"blitter.com/go/hkexsh/logger.LogDebug" [ fillcolor="moccasin" label="LogDebug" penwidth="1.5" ]
}
subgraph "cluster_blitter.com/go/hkexsh/spinsult" {
label="[spinsult]";
fillcolor="lightyellow";
rank="sink";
fontsize="16";
style="filled";
label="[spinsult]";
URL="/?f=blitter.com/go/hkexsh/spinsult";
tooltip="package: blitter.com/go/hkexsh/spinsult";
penwidth="0.8";
fontsize="16";
fontname="bold";
URL="/?f=blitter.com/go/hkexsh/spinsult";
style="filled";
fillcolor="lightyellow";
rank="sink";
"blitter.com/go/hkexsh/spinsult.GetSentence" [ fillcolor="moccasin" label="GetSentence" penwidth="1.5" ]
}
subgraph "cluster_github.com/mattn/go-isatty" {
URL="/?f=github.com/mattn/go-isatty";
tooltip="package: github.com/mattn/go-isatty";
fontsize="16";
fillcolor="lightyellow";
fontname="bold";
rank="sink";
label="[isatty]";
URL="/?f=github.com/mattn/go-isatty";
tooltip="package: github.com/mattn/go-isatty";
penwidth="0.8";
fontsize="16";
style="filled";
fillcolor="lightyellow";
rank="sink";
"github.com/mattn/go-isatty.IsTerminal" [ label="IsTerminal" penwidth="1.5" fillcolor="moccasin" ]
"github.com/mattn/go-isatty.IsTerminal" [ fillcolor="moccasin" label="IsTerminal" penwidth="1.5" ]
}
}
"blitter.com/go/hkexsh/hkexsh.rejectUserMsg" -> "blitter.com/go/hkexsh/spinsult.GetSentence" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.reqTunnel" -> "blitter.com/go/hkexsh/logger.LogDebug" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.reqTunnel" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs" [ ]
"blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/logger.New" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexnet.Init" [ color="saddlebrown" ]
@ -211,10 +208,11 @@ fillcolor="lightyellow";
"blitter.com/go/hkexsh/hkexsh.sendSessionParams" -> "(blitter.com/go/hkexsh.Session).TermType" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.sendSessionParams" -> "(blitter.com/go/hkexsh.Session).Cmd" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.sendSessionParams" -> "(blitter.com/go/hkexsh.Session).AuthCookie" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.sendSessionParams" -> "(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ style="dashed" color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.sendSessionParams" -> "(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ color="saddlebrown" style="dashed" ]
"blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.sendSessionParams" [ ]
"blitter.com/go/hkexsh/hkexsh.main" -> "(blitter.com/go/hkexsh/hkexnet.Conn).Read" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh.Session).SetStatus" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.rejectUserMsg" -> "blitter.com/go/hkexsh/spinsult.GetSentence" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.rejectUserMsg" [ ]
"blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ color="saddlebrown" ]
@ -222,6 +220,8 @@ fillcolor="lightyellow";
"blitter.com/go/hkexsh/hkexsh.main" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.main$2" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.main$2" [ arrowhead="normalnoneodot" ]
"blitter.com/go/hkexsh/hkexsh.reqTunnel" -> "blitter.com/go/hkexsh/logger.LogDebug" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.reqTunnel" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexsh.launchTuns" -> "blitter.com/go/hkexsh/hkexsh.reqTunnel" [ ]
"blitter.com/go/hkexsh/hkexsh.main" -> "blitter.com/go/hkexsh/hkexsh.launchTuns" [ ]
"blitter.com/go/hkexsh/hkexsh.doShellMode$1" -> "blitter.com/go/hkexsh.Restore" [ color="saddlebrown" ]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 581 KiB

After

Width:  |  Height:  |  Size: 592 KiB

View File

@ -1,719 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: gocallvis Pages: 1 -->
<svg width="967pt" height="1938pt"
viewBox="0.00 0.00 966.52 1938.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(0 1938)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-1938 966.5204,-1938 966.5204,0 0,0"/>
<text text-anchor="middle" x="102" y="-7.8" font-family="Arial" font-size="14.00" fill="#000000">blitter.com/go/hkexsh/hkexsh</text>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-31 8,-1930 958.5204,-1930 958.5204,-31 8,-31"/>
<text text-anchor="middle" x="483.2602" y="-1911.6" font-family="Arial" font-size="18.00" fill="#000000">main</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_blitter.com/go/hkexsh</title>
<g id="a_clust2"><a xlink:href="/?f=blitter.com/go/hkexsh" xlink:title="package: blitter.com/go/hkexsh">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="647.8627,-39 647.8627,-828 787.067,-828 787.067,-39 647.8627,-39"/>
<text text-anchor="middle" x="717.4649" y="-811.2" font-family="bold" font-size="16.00" fill="#000000">[hkexsh]</text>
</a>
</g>
</g>
<g id="clust3" class="cluster">
<title>cluster_*blitter.com/go/hkexsh.Session</title>
<g id="a_clust3"><a xlink:href="/?f=blitter.com/go/hkexsh" xlink:title="type: *blitter.com/go/hkexsh.Session">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M679.1134,-213C679.1134,-213 755.8163,-213 755.8163,-213 761.8163,-213 767.8163,-219 767.8163,-225 767.8163,-225 767.8163,-278 767.8163,-278 767.8163,-284 761.8163,-290 755.8163,-290 755.8163,-290 679.1134,-290 679.1134,-290 673.1134,-290 667.1134,-284 667.1134,-278 667.1134,-278 667.1134,-225 667.1134,-225 667.1134,-219 673.1134,-213 679.1134,-213"/>
<text text-anchor="middle" x="717.4649" y="-222" font-family="bold" font-size="15.00" fill="#222222">(*Session)</text>
</a>
</g>
</g>
<g id="clust4" class="cluster">
<title>cluster_blitter.com/go/hkexsh.Session</title>
<g id="a_clust4"><a xlink:href="/?f=blitter.com/go/hkexsh" xlink:title="type: blitter.com/go/hkexsh.Session">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M671.9632,-298C671.9632,-298 762.9666,-298 762.9666,-298 768.9666,-298 774.9666,-304 774.9666,-310 774.9666,-310 774.9666,-729 774.9666,-729 774.9666,-735 768.9666,-741 762.9666,-741 762.9666,-741 671.9632,-741 671.9632,-741 665.9632,-741 659.9632,-735 659.9632,-729 659.9632,-729 659.9632,-310 659.9632,-310 659.9632,-304 665.9632,-298 671.9632,-298"/>
<text text-anchor="middle" x="717.4649" y="-307" font-family="bold" font-size="15.00" fill="#222222">(Session)</text>
</a>
</g>
</g>
<g id="clust5" class="cluster">
<title>cluster_blitter.com/go/hkexsh/hkexnet</title>
<g id="a_clust5"><a xlink:href="/?f=blitter.com/go/hkexsh/hkexnet" xlink:title="package: blitter.com/go/hkexsh/hkexnet">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="637.1126,-941 637.1126,-1747 797.8171,-1747 797.8171,-941 637.1126,-941"/>
<text text-anchor="middle" x="717.4649" y="-1730.2" font-family="bold" font-size="16.00" fill="#000000">[hkexnet]</text>
</a>
</g>
</g>
<g id="clust6" class="cluster">
<title>cluster_*blitter.com/go/hkexsh/hkexnet.Conn</title>
<g id="a_clust6"><a xlink:href="/?f=blitter.com/go/hkexsh/hkexnet" xlink:title="type: *blitter.com/go/hkexsh/hkexnet.Conn">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M657.1126,-1270C657.1126,-1270 777.8171,-1270 777.8171,-1270 783.8171,-1270 789.8171,-1276 789.8171,-1282 789.8171,-1282 789.8171,-1701 789.8171,-1701 789.8171,-1707 783.8171,-1713 777.8171,-1713 777.8171,-1713 657.1126,-1713 657.1126,-1713 651.1126,-1713 645.1126,-1707 645.1126,-1701 645.1126,-1701 645.1126,-1282 645.1126,-1282 645.1126,-1276 651.1126,-1270 657.1126,-1270"/>
<text text-anchor="middle" x="717.4649" y="-1279" font-family="bold" font-size="15.00" fill="#222222">(*Conn)</text>
</a>
</g>
</g>
<g id="clust7" class="cluster">
<title>cluster_blitter.com/go/hkexsh/hkexnet.Conn</title>
<g id="a_clust7"><a xlink:href="/?f=blitter.com/go/hkexsh/hkexnet" xlink:title="type: blitter.com/go/hkexsh/hkexnet.Conn">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M678.0134,-949C678.0134,-949 756.9164,-949 756.9164,-949 762.9164,-949 768.9164,-955 768.9164,-961 768.9164,-961 768.9164,-1136 768.9164,-1136 768.9164,-1142 762.9164,-1148 756.9164,-1148 756.9164,-1148 678.0134,-1148 678.0134,-1148 672.0134,-1148 666.0134,-1142 666.0134,-1136 666.0134,-1136 666.0134,-961 666.0134,-961 666.0134,-955 672.0134,-949 678.0134,-949"/>
<text text-anchor="middle" x="717.4649" y="-958" font-family="bold" font-size="15.00" fill="#222222">(Conn)</text>
</a>
</g>
</g>
<g id="clust8" class="cluster">
<title>cluster_blitter.com/go/hkexsh/logger</title>
<g id="a_clust8"><a xlink:href="/?f=blitter.com/go/hkexsh/logger" xlink:title="package: blitter.com/go/hkexsh/logger">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="664.3633,-1755 664.3633,-1894 770.5664,-1894 770.5664,-1755 664.3633,-1755"/>
<text text-anchor="middle" x="717.4649" y="-1877.2" font-family="bold" font-size="16.00" fill="#000000">[logger]</text>
</a>
</g>
</g>
<g id="clust9" class="cluster">
<title>cluster_blitter.com/go/hkexsh/spinsult</title>
<g id="a_clust9"><a xlink:href="/?f=blitter.com/go/hkexsh/spinsult" xlink:title="package: blitter.com/go/hkexsh/spinsult">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="407.1069,-263 407.1069,-341 534.2108,-341 534.2108,-263 407.1069,-263"/>
<text text-anchor="middle" x="470.6588" y="-324.2" font-family="bold" font-size="16.00" fill="#000000">[spinsult]</text>
</a>
</g>
</g>
<g id="clust10" class="cluster">
<title>cluster_github.com/mattn/go&#45;isatty</title>
<g id="a_clust10"><a xlink:href="/?f=github.com/mattn/go-isatty" xlink:title="package: github.com/mattn/go&#45;isatty">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="175.7014,-1758 175.7014,-1836 281.9045,-1836 281.9045,-1758 175.7014,-1758"/>
<text text-anchor="middle" x="228.803" y="-1819.2" font-family="bold" font-size="16.00" fill="#000000">[isatty]</text>
</a>
</g>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.rejectUserMsg -->
<g id="node1" class="node">
<title>blitter.com/go/hkexsh/hkexsh.rejectUserMsg</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="228.803" cy="-289" rx="61.1043" ry="18"/>
<text text-anchor="middle" x="228.803" y="-285.3" font-family="Verdana" font-size="14.00" fill="#000000">rejectUserMsg</text>
</g>
<!-- blitter.com/go/hkexsh/spinsult.GetSentence -->
<g id="node45" class="node">
<title>blitter.com/go/hkexsh/spinsult.GetSentence</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="470.6588" cy="-289" rx="55.6039" ry="18"/>
<text text-anchor="middle" x="470.6588" y="-285.3" font-family="Verdana" font-size="14.00" fill="#000000">GetSentence</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.rejectUserMsg&#45;&gt;blitter.com/go/hkexsh/spinsult.GetSentence -->
<g id="edge1" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.rejectUserMsg&#45;&gt;blitter.com/go/hkexsh/spinsult.GetSentence</title>
<path fill="none" stroke="#8b4513" d="M290.1461,-289C325.0462,-289 368.7737,-289 404.4495,-289"/>
<polygon fill="#8b4513" stroke="#8b4513" points="404.7629,-292.5001 414.7628,-289 404.7628,-285.5001 404.7629,-292.5001"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.reqTunnel -->
<g id="node2" class="node">
<title>blitter.com/go/hkexsh/hkexsh.reqTunnel</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="470.6588" cy="-1686" rx="43.4031" ry="18"/>
<text text-anchor="middle" x="470.6588" y="-1682.3" font-family="Verdana" font-size="14.00" fill="#000000">reqTunnel</text>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket -->
<g id="node33" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1687" rx="50.7037" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1683.3" font-family="Verdana" font-size="14.00" fill="#000000">WritePacket</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.reqTunnel&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket -->
<g id="edge3" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.reqTunnel&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket</title>
<path fill="none" stroke="#8b4513" d="M514.2147,-1686.1765C553.7571,-1686.3367 612.4683,-1686.5746 656.6364,-1686.7535"/>
<polygon fill="#8b4513" stroke="#8b4513" points="656.663,-1690.2536 666.6771,-1686.7942 656.6914,-1683.2536 656.663,-1690.2536"/>
</g>
<!-- blitter.com/go/hkexsh/logger.LogDebug -->
<g id="node43" class="node">
<title>blitter.com/go/hkexsh/logger.LogDebug</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1781" rx="45.2034" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1777.3" font-family="Verdana" font-size="14.00" fill="#000000">LogDebug</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.reqTunnel&#45;&gt;blitter.com/go/hkexsh/logger.LogDebug -->
<g id="edge2" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.reqTunnel&#45;&gt;blitter.com/go/hkexsh/logger.LogDebug</title>
<path fill="none" stroke="#8b4513" d="M502.6714,-1698.3222C546.8135,-1715.3133 626.4496,-1745.9666 675.3687,-1764.7964"/>
<polygon fill="#8b4513" stroke="#8b4513" points="674.1335,-1768.0713 684.7233,-1768.3972 676.6481,-1761.5385 674.1335,-1768.0713"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main -->
<g id="node3" class="node">
<title>blitter.com/go/hkexsh/hkexsh.main</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="43" cy="-1038" rx="27" ry="18"/>
<text text-anchor="middle" x="43" y="-1034.3" font-family="Verdana" font-size="14.00" fill="#000000">main</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.rejectUserMsg -->
<g id="edge25" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.rejectUserMsg</title>
<path fill="none" stroke="#000000" d="M43.6422,-1019.9843C47.106,-927.4019 64.948,-504.7076 106,-381 115.9869,-350.9052 118.4671,-340.089 143,-320 151.1722,-313.3081 160.9092,-307.9991 170.8413,-303.8065"/>
<polygon fill="#000000" stroke="#000000" points="172.3131,-306.99 180.3788,-300.1202 169.7894,-300.4607 172.3131,-306.99"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs -->
<g id="node4" class="node">
<title>blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="228.803" cy="-350" rx="85.6064" ry="18"/>
<text text-anchor="middle" x="228.803" y="-346.3" font-family="Verdana" font-size="14.00" fill="#000000">parseNonSwitchArgs</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs -->
<g id="edge4" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.parseNonSwitchArgs</title>
<path fill="none" stroke="#000000" d="M43.5674,-1019.8091C46.8493,-919.5715 64.7107,-437.302 106,-387 115.5271,-375.3933 128.5566,-367.334 142.5822,-361.7587"/>
<polygon fill="#000000" stroke="#000000" points="144.1577,-364.9141 152.4205,-358.2826 141.8257,-358.314 144.1577,-364.9141"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main$1 -->
<g id="node5" class="node">
<title>blitter.com/go/hkexsh/hkexsh.main$1</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="228.803" cy="-944" rx="34.8031" ry="18"/>
<text text-anchor="middle" x="228.803" y="-940.3" font-family="Verdana" font-size="14.00" fill="#000000">main$1</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.main$1 -->
<g id="edge12" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.main$1</title>
<path fill="none" stroke="#000000" d="M61.4659,-1024.6576C81.021,-1010.9441 113.1327,-989.5916 143,-975 152.526,-970.3461 162.9367,-966.0065 173.1181,-962.135"/>
<polygon fill="#000000" stroke="#000000" points="190.5022,-959.7136 198.7681,-953.0861 188.1733,-953.1124 190.5022,-959.7136"/>
<polyline fill="none" stroke="#000000" points="189.3378,-956.413 184.6226,-958.0765 "/>
<polygon fill="none" stroke="#000000" points="173.3061,-962.0688 177.6336,-956.3005 184.6226,-958.0765 180.2951,-963.8448 173.3061,-962.0688"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.sendSessionParams -->
<g id="node6" class="node">
<title>blitter.com/go/hkexsh/hkexsh.sendSessionParams</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="470.6588" cy="-664" rx="83.1058" ry="18"/>
<text text-anchor="middle" x="470.6588" y="-660.3" font-family="Verdana" font-size="14.00" fill="#000000">sendSessionParams</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.sendSessionParams -->
<g id="edge22" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.sendSessionParams</title>
<path fill="none" stroke="#000000" d="M51.5875,-1020.5848C66.2062,-992.9589 98.7038,-939.6038 143,-914 209.8445,-875.363 250.6933,-930.3149 314.606,-887 327.7617,-878.0841 378.4451,-776.9864 387.606,-764 406.357,-737.4185 430.3223,-709.068 447.6856,-689.3675"/>
<polygon fill="#000000" stroke="#000000" points="450.4322,-691.5456 454.4555,-681.7444 445.1982,-686.8974 450.4322,-691.5456"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main$2 -->
<g id="node7" class="node">
<title>blitter.com/go/hkexsh/hkexsh.main$2</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="228.803" cy="-1599" rx="34.8031" ry="18"/>
<text text-anchor="middle" x="228.803" y="-1595.3" font-family="Verdana" font-size="14.00" fill="#000000">main$2</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.main$2 -->
<g id="edge31" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.main$2</title>
<path fill="none" stroke="#000000" d="M43.2249,-1056.093C44.5159,-1134.9593 52.9544,-1448.2981 106,-1528 122.6425,-1553.0056 151.303,-1570.3007 176.7518,-1581.5562"/>
<polygon fill="#000000" stroke="#000000" points="187.757,-1589.6686 198.3435,-1590.0887 190.3297,-1583.1584 187.757,-1589.6686"/>
<polyline fill="none" stroke="#000000" points="189.0434,-1586.4135 184.3933,-1584.5759 "/>
<ellipse fill="none" stroke="#000000" cx="180.6732" cy="-1583.1058" rx="4" ry="4"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.launchTuns -->
<g id="node8" class="node">
<title>blitter.com/go/hkexsh/hkexsh.launchTuns</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="228.803" cy="-1677" rx="48.3036" ry="18"/>
<text text-anchor="middle" x="228.803" y="-1673.3" font-family="Verdana" font-size="14.00" fill="#000000">launchTuns</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.launchTuns -->
<g id="edge33" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.launchTuns</title>
<path fill="none" stroke="#000000" d="M43.7058,-1056.3531C46.5761,-1122.1593 59.5357,-1352.0727 106,-1535 117.1551,-1578.917 113.1041,-1595.9505 143,-1630 154.2291,-1642.7892 169.8134,-1652.7673 184.623,-1660.1756"/>
<polygon fill="#000000" stroke="#000000" points="183.1609,-1663.3557 193.6982,-1664.4583 186.1484,-1657.0252 183.1609,-1663.3557"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode -->
<g id="node10" class="node">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="228.803" cy="-1005" rx="55.0038" ry="18"/>
<text text-anchor="middle" x="228.803" y="-1001.3" font-family="Verdana" font-size="14.00" fill="#000000">doShellMode</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.doShellMode -->
<g id="edge46" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.doShellMode</title>
<path fill="none" stroke="#000000" d="M69.227,-1033.3419C95.3355,-1028.7048 136.2931,-1021.4304 170.1762,-1015.4126"/>
<polygon fill="#000000" stroke="#000000" points="171.2064,-1018.7844 180.4402,-1013.5896 169.9822,-1011.8923 171.2064,-1018.7844"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doCopyMode -->
<g id="node16" class="node">
<title>blitter.com/go/hkexsh/hkexsh.doCopyMode</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="470.6588" cy="-1066" rx="56.2041" ry="18"/>
<text text-anchor="middle" x="470.6588" y="-1062.3" font-family="Verdana" font-size="14.00" fill="#000000">doCopyMode</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.doCopyMode -->
<g id="edge53" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.doCopyMode</title>
<path fill="none" stroke="#000000" d="M70.0764,-1039.7728C136.6865,-1044.1339 310.0162,-1055.4823 405.3898,-1061.7267"/>
<polygon fill="#000000" stroke="#000000" points="405.2885,-1065.2274 415.4958,-1062.3883 405.7459,-1058.2424 405.2885,-1065.2274"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.usageShell -->
<g id="node17" class="node">
<title>blitter.com/go/hkexsh/hkexsh.usageShell</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="228.803" cy="-795" rx="47.7038" ry="18"/>
<text text-anchor="middle" x="228.803" y="-791.3" font-family="Verdana" font-size="14.00" fill="#000000">usageShell</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.usageShell -->
<g id="edge55" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.usageShell</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M46.1006,-1020.0243C54.1598,-978.959 79.7141,-877.8221 143,-826 152.9596,-817.8445 165.2435,-811.7428 177.372,-807.2129"/>
<polygon fill="#000000" stroke="#000000" points="178.6925,-810.4602 187.0181,-803.9077 176.4235,-803.8382 178.6925,-810.4602"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.usageCp -->
<g id="node18" class="node">
<title>blitter.com/go/hkexsh/hkexsh.usageCp</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="228.803" cy="-856" rx="39.1028" ry="18"/>
<text text-anchor="middle" x="228.803" y="-852.3" font-family="Verdana" font-size="14.00" fill="#000000">usageCp</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.usageCp -->
<g id="edge56" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexsh.usageCp</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M45.8114,-1020.0004C51.5377,-989.4144 67.4382,-927.2869 106,-893 126.4021,-874.8596 155.4301,-865.6084 180.1416,-860.8926"/>
<polygon fill="#000000" stroke="#000000" points="180.8109,-864.329 190.0761,-859.1903 179.6286,-857.4296 180.8109,-864.329"/>
</g>
<!-- blitter.com/go/hkexsh.MakeRaw -->
<g id="node19" class="node">
<title>blitter.com/go/hkexsh.MakeRaw</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-65" rx="42.2035" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-61.3" font-family="Verdana" font-size="14.00" fill="#000000">MakeRaw</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh.MakeRaw -->
<g id="edge10" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh.MakeRaw</title>
<path fill="none" stroke="#8b4513" d="M43.7961,-1019.8634C47.0381,-952.74 61.2778,-712.363 106,-520 117.2995,-471.3976 105.8828,-447.3496 143,-414 172.1269,-387.8296 189.6461,-394 228.803,-394 228.803,-394 228.803,-394 470.6588,-394 513.0719,-394 527.3929,-380.2594 553.7117,-347 625.8043,-255.896 546.4781,-180.0229 626.7117,-96 637.3621,-84.8466 652.1861,-77.7059 666.7693,-73.1344"/>
<polygon fill="#8b4513" stroke="#8b4513" points="668.0707,-76.4057 676.7727,-70.3621 666.2011,-69.66 668.0707,-76.4057"/>
</g>
<!-- blitter.com/go/hkexsh.Restore -->
<g id="node20" class="node">
<title>blitter.com/go/hkexsh.Restore</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-776" rx="34.8031" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-772.3" font-family="Verdana" font-size="14.00" fill="#000000">Restore</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh.Restore -->
<g id="edge54" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh.Restore</title>
<path fill="none" stroke="#8b4513" d="M47.065,-1019.948C59.911,-964.548 101.2572,-798.6711 143,-765 173.0744,-740.741 190.164,-751 228.803,-751 228.803,-751 228.803,-751 470.6588,-751 542.4294,-751 625.3447,-761.5938 674.4822,-768.9891"/>
<polygon fill="#8b4513" stroke="#8b4513" points="674.0242,-772.4597 684.4387,-770.5136 675.0837,-765.5403 674.0242,-772.4597"/>
</g>
<!-- blitter.com/go/hkexsh.ReadPassword -->
<g id="node21" class="node">
<title>blitter.com/go/hkexsh.ReadPassword</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-126" rx="61.7044" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-122.3" font-family="Verdana" font-size="14.00" fill="#000000">ReadPassword</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh.ReadPassword -->
<g id="edge13" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh.ReadPassword</title>
<path fill="none" stroke="#8b4513" d="M43.4605,-1019.6231C45.5164,-952.6995 56.1034,-716.1291 106,-529 116.9311,-488.0048 110.574,-468.3615 143,-441 172.9263,-415.7477 189.6461,-421 228.803,-421 228.803,-421 228.803,-421 470.6588,-421 524.751,-421 552.82,-439.6029 590.7117,-401 667.4997,-322.7708 556.5928,-241.2587 626.7117,-157 633.7242,-148.5735 643.133,-142.4308 653.2416,-137.9547"/>
<polygon fill="#8b4513" stroke="#8b4513" points="654.6166,-141.1755 662.673,-134.2947 652.0841,-134.6496 654.6166,-141.1755"/>
</g>
<!-- blitter.com/go/hkexsh.NewSession -->
<g id="node22" class="node">
<title>blitter.com/go/hkexsh.NewSession</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-187" rx="52.0048" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-183.3" font-family="Verdana" font-size="14.00" fill="#000000">NewSession</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh.NewSession -->
<g id="edge14" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh.NewSession</title>
<path fill="none" stroke="#8b4513" d="M43.4487,-1019.9447C46.0243,-931.8608 61.8225,-548.272 143,-469 171.0889,-441.5705 189.5428,-448 228.803,-448 228.803,-448 228.803,-448 470.6588,-448 524.751,-448 552.5039,-466.2901 590.7117,-428 660.3854,-358.1763 559.6234,-281.3114 626.7117,-209 634.4724,-200.6351 644.8256,-195.2068 655.7592,-191.7327"/>
<polygon fill="#8b4513" stroke="#8b4513" points="656.6979,-195.1049 665.4663,-189.1581 654.9032,-188.3388 656.6979,-195.1049"/>
</g>
<!-- (*blitter.com/go/hkexsh.Session).SetStatus -->
<g id="node23" class="node">
<title>(*blitter.com/go/hkexsh.Session).SetStatus</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-264" rx="42.2035" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-260.3" font-family="Verdana" font-size="14.00" fill="#000000">SetStatus</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh.Session).SetStatus -->
<g id="edge24" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh.Session).SetStatus</title>
<path fill="none" stroke="#8b4513" d="M44.4709,-1020.0182C51.4192,-938.7014 83.1431,-605.7422 143,-523 168.6115,-487.5964 185.1067,-475 228.803,-475 228.803,-475 228.803,-475 470.6588,-475 524.751,-475 551.4759,-492.2359 590.7117,-455 644.5257,-403.929 576.4427,-346.564 626.7117,-292 636.9692,-280.8662 651.5422,-274.117 666.0159,-270.0395"/>
<polygon fill="#8b4513" stroke="#8b4513" points="667.0749,-273.3841 675.9661,-267.6224 665.4224,-266.5819 667.0749,-273.3841"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).Status -->
<g id="node30" class="node">
<title>(blitter.com/go/hkexsh.Session).Status</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-532" rx="29.9034" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-528.3" font-family="Verdana" font-size="14.00" fill="#000000">Status</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(blitter.com/go/hkexsh.Session).Status -->
<g id="edge47" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(blitter.com/go/hkexsh.Session).Status</title>
<path fill="none" stroke="#8b4513" d="M45.5024,-1019.8844C58.5213,-929.2115 122.0318,-529 228.803,-529 228.803,-529 228.803,-529 470.6588,-529 543.5167,-529 628.4639,-530.3233 677.3039,-531.2122"/>
<polygon fill="#8b4513" stroke="#8b4513" points="677.3895,-534.7143 687.4526,-531.4001 677.5192,-527.7155 677.3895,-534.7143"/>
</g>
<!-- blitter.com/go/hkexsh/hkexnet.Init -->
<g id="node31" class="node">
<title>blitter.com/go/hkexsh/hkexnet.Init</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1183" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1179.3" font-family="Verdana" font-size="14.00" fill="#000000">Init</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexnet.Init -->
<g id="edge6" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexnet.Init</title>
<path fill="none" stroke="#8b4513" d="M69.0266,-1043.5953C173.3536,-1066.0241 561.4304,-1149.4549 681.6963,-1175.3103"/>
<polygon fill="#8b4513" stroke="#8b4513" points="681.0036,-1178.7413 691.5159,-1177.4213 682.4749,-1171.8976 681.0036,-1178.7413"/>
</g>
<!-- blitter.com/go/hkexsh/hkexnet.Dial -->
<g id="node32" class="node">
<title>blitter.com/go/hkexsh/hkexnet.Dial</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1244" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1240.3" font-family="Verdana" font-size="14.00" fill="#000000">Dial</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexnet.Dial -->
<g id="edge7" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/hkexnet.Dial</title>
<path fill="none" stroke="#8b4513" d="M53.7436,-1054.8469C79.1965,-1092.4612 147.1984,-1180 228.803,-1180 228.803,-1180 228.803,-1180 470.6588,-1180 524.751,-1180 538.5503,-1185.677 590.7117,-1200 607.2663,-1204.5457 610.5564,-1208.1929 626.7117,-1214 645.2485,-1220.6632 666.107,-1227.5972 683.1488,-1233.1183"/>
<polygon fill="#8b4513" stroke="#8b4513" points="682.1037,-1236.4587 692.6952,-1236.1931 684.2498,-1229.7958 682.1037,-1236.4587"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).Close -->
<g id="node34" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).Close</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1382" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1378.3" font-family="Verdana" font-size="14.00" fill="#000000">Close</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).Close -->
<g id="edge8" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).Close</title>
<path fill="none" stroke="#8b4513" d="M51.3773,-1055.1347C73.7215,-1098.0994 139.1947,-1207 228.803,-1207 228.803,-1207 228.803,-1207 470.6588,-1207 565.3344,-1207 545.2161,-1303.8137 626.7117,-1352 638.5966,-1359.0272 652.3425,-1364.6556 665.4844,-1369.0521"/>
<polygon fill="#8b4513" stroke="#8b4513" points="680.9916,-1377.1738 691.5701,-1376.586 682.9339,-1370.4486 680.9916,-1377.1738"/>
<polyline fill="none" stroke="#8b4513" points="681.9627,-1373.8112 677.1591,-1372.4238 "/>
<polygon fill="none" stroke="#8b4513" points="665.6303,-1369.0941 672.5046,-1366.916 677.1591,-1372.4238 670.2848,-1374.6019 665.6303,-1369.0941"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff -->
<g id="node35" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1443" rx="47.7038" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1439.3" font-family="Verdana" font-size="14.00" fill="#000000">SetupChaff</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff -->
<g id="edge26" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff</title>
<path fill="none" stroke="#8b4513" d="M45.1957,-1055.9871C54.2261,-1121.0021 94.6044,-1340 228.803,-1340 228.803,-1340 228.803,-1340 470.6588,-1340 528.4583,-1340 539.4861,-1363.2285 590.7117,-1390 607.5389,-1398.7942 609.5651,-1404.846 626.7117,-1413 639.8562,-1419.2508 654.6469,-1424.7399 668.4128,-1429.2556"/>
<polygon fill="#8b4513" stroke="#8b4513" points="667.6269,-1432.6782 678.2173,-1432.3686 669.7454,-1426.0064 667.6269,-1432.6782"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff -->
<g id="node36" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1504" rx="52.0048" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1500.3" font-family="Verdana" font-size="14.00" fill="#000000">EnableChaff</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff -->
<g id="edge27" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff</title>
<path fill="none" stroke="#8b4513" d="M43.7723,-1056.2964C47.9234,-1129.4536 73.7069,-1397 228.803,-1397 228.803,-1397 228.803,-1397 470.6588,-1397 524.8258,-1397 545.5914,-1388.0297 590.7117,-1418 615.3582,-1434.371 603.3257,-1455.874 626.7117,-1474 636.9575,-1481.9413 649.4007,-1487.8295 661.7463,-1492.1781"/>
<polygon fill="#8b4513" stroke="#8b4513" points="660.9909,-1495.6118 671.5824,-1495.3454 663.1365,-1488.9487 660.9909,-1495.6118"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff -->
<g id="node37" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1565" rx="54.4038" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1561.3" font-family="Verdana" font-size="14.00" fill="#000000">DisableChaff</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff -->
<g id="edge28" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff</title>
<path fill="none" stroke="#8b4513" d="M45.1622,-1056.077C51.0151,-1101.7235 69.258,-1224.8464 106,-1321 118.0035,-1352.4131 118.1298,-1364.3651 143,-1387 173.8449,-1415.0727 187.0958,-1425 228.803,-1425 228.803,-1425 228.803,-1425 470.6588,-1425 555.5146,-1425 550.9279,-1496.8252 626.7117,-1535 633.7976,-1538.5694 641.4024,-1541.852 649.085,-1544.8303"/>
<polygon fill="#8b4513" stroke="#8b4513" points="664.2691,-1553.7936 674.8638,-1553.7593 666.5601,-1547.1792 664.2691,-1553.7936"/>
<polyline fill="none" stroke="#8b4513" points="665.4146,-1550.4864 660.69,-1548.8499 "/>
<polygon fill="none" stroke="#8b4513" points="649.3509,-1544.9224 656.3296,-1543.1065 660.69,-1548.8499 653.7113,-1550.6659 649.3509,-1544.9224"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff -->
<g id="node38" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1626" rx="64.2048" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1622.3" font-family="Verdana" font-size="14.00" fill="#000000">ShutdownChaff</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff -->
<g id="edge29" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff</title>
<path fill="none" stroke="#8b4513" d="M44.2941,-1056.1714C49.0396,-1112.9025 69.2678,-1290.2632 143,-1413 174.5693,-1465.5512 167.4984,-1521 228.803,-1521 228.803,-1521 228.803,-1521 470.6588,-1521 547.61,-1521 555.3541,-1567.1976 626.7117,-1596 633.545,-1598.7581 640.7383,-1601.4621 647.9611,-1604.0476"/>
<polygon fill="#8b4513" stroke="#8b4513" points="663.0665,-1612.8761 673.6609,-1612.779 665.3183,-1606.2482 663.0665,-1612.8761"/>
<polyline fill="none" stroke="#8b4513" points="664.1924,-1609.5621 659.4582,-1607.9537 "/>
<polygon fill="none" stroke="#8b4513" points="648.096,-1604.0934 655.0639,-1602.2362 659.4582,-1607.9537 652.4903,-1609.8109 648.096,-1604.0934"/>
</g>
<!-- (blitter.com/go/hkexsh/hkexnet.Conn).Read -->
<g id="node41" class="node">
<title>(blitter.com/go/hkexsh/hkexnet.Conn).Read</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1122" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1118.3" font-family="Verdana" font-size="14.00" fill="#000000">Read</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).Read -->
<g id="edge23" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).Read</title>
<path fill="none" stroke="#8b4513" d="M54.4397,-1054.5522C65.7281,-1069.5043 84.3967,-1090.8255 106,-1102 155.1165,-1127.4059 173.5048,-1122 228.803,-1122 228.803,-1122 228.803,-1122 470.6588,-1122 544.9521,-1122 631.8248,-1122 680.157,-1122"/>
<polygon fill="#8b4513" stroke="#8b4513" points="680.4397,-1125.5001 690.4396,-1122 680.4396,-1118.5001 680.4397,-1125.5001"/>
</g>
<!-- blitter.com/go/hkexsh/logger.New -->
<g id="node44" class="node">
<title>blitter.com/go/hkexsh/logger.New</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1842" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1838.3" font-family="Verdana" font-size="14.00" fill="#000000">New</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/logger.New -->
<g id="edge5" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;blitter.com/go/hkexsh/logger.New</title>
<path fill="none" stroke="#8b4513" d="M43.1565,-1056.0276C44.356,-1152.4578 54.6826,-1606.7353 143,-1708 169.7517,-1738.6736 188.1026,-1740 228.803,-1740 228.803,-1740 228.803,-1740 470.6588,-1740 547.0419,-1740 555.6582,-1783.9683 626.7117,-1812 645.0353,-1819.2289 665.8783,-1826.204 682.9648,-1831.6065"/>
<polygon fill="#8b4513" stroke="#8b4513" points="681.9548,-1834.9577 692.5435,-1834.5957 684.0402,-1828.2756 681.9548,-1834.9577"/>
</g>
<!-- github.com/mattn/go&#45;isatty.IsTerminal -->
<g id="node46" class="node">
<title>github.com/mattn/go&#45;isatty.IsTerminal</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="228.803" cy="-1784" rx="45.2034" ry="18"/>
<text text-anchor="middle" x="228.803" y="-1780.3" font-family="Verdana" font-size="14.00" fill="#000000">IsTerminal</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main&#45;&gt;github.com/mattn/go&#45;isatty.IsTerminal -->
<g id="edge9" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main&#45;&gt;github.com/mattn/go&#45;isatty.IsTerminal</title>
<path fill="none" stroke="#8b4513" d="M43.4898,-1055.9989C46.4863,-1160.8083 63.6376,-1689.7608 106,-1747 121.5424,-1768.0005 148.6349,-1777.5231 173.4249,-1781.6776"/>
<polygon fill="#8b4513" stroke="#8b4513" points="173.1121,-1785.1682 183.5041,-1783.1051 174.0937,-1778.2373 173.1121,-1785.1682"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main$1&#45;&gt;blitter.com/go/hkexsh.Restore -->
<g id="edge11" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main$1&#45;&gt;blitter.com/go/hkexsh.Restore</title>
<path fill="none" stroke="#8b4513" d="M259.8553,-935.6059C277.3563,-929.7245 298.807,-920.4745 314.606,-907 360.6677,-867.7151 335.2756,-822.4388 387.606,-792 434.7995,-764.5491 594.3349,-769.0868 672.9413,-773.2104"/>
<polygon fill="#8b4513" stroke="#8b4513" points="672.8463,-776.7103 683.0221,-773.7604 673.2277,-769.7207 672.8463,-776.7103"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).Op -->
<g id="node24" class="node">
<title>(blitter.com/go/hkexsh.Session).Op</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-349" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-345.3" font-family="Verdana" font-size="14.00" fill="#000000">Op</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).Op -->
<g id="edge15" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).Op</title>
<path fill="none" stroke="#8b4513" d="M484.8671,-645.7871C509.1422,-614.0088 559.0426,-545.727 590.7117,-482 612.106,-438.9489 592.5465,-413.8208 626.7117,-380 641.1881,-365.6696 662.5552,-357.9561 680.9205,-353.8081"/>
<polygon fill="#8b4513" stroke="#8b4513" points="681.6276,-357.2361 690.7519,-351.851 680.2609,-350.3708 681.6276,-357.2361"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).Who -->
<g id="node25" class="node">
<title>(blitter.com/go/hkexsh.Session).Who</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-654" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-650.3" font-family="Verdana" font-size="14.00" fill="#000000">Who</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).Who -->
<g id="edge16" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).Who</title>
<path fill="none" stroke="#8b4513" d="M552.4989,-660.684C595.5481,-658.9398 646.238,-656.8859 679.9548,-655.5198"/>
<polygon fill="#8b4513" stroke="#8b4513" points="680.4241,-659.0038 690.2742,-655.1017 680.1407,-652.0095 680.4241,-659.0038"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).ConnHost -->
<g id="node26" class="node">
<title>(blitter.com/go/hkexsh.Session).ConnHost</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-410" rx="42.8032" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-406.3" font-family="Verdana" font-size="14.00" fill="#000000">ConnHost</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).ConnHost -->
<g id="edge17" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).ConnHost</title>
<path fill="none" stroke="#8b4513" d="M486.14,-646.1452C510.1063,-618.056 556.9439,-561.341 590.7117,-509 609.2502,-480.2649 600.7014,-463.2001 626.7117,-441 638.3389,-431.0761 653.2991,-424.2831 667.7062,-419.6517"/>
<polygon fill="#8b4513" stroke="#8b4513" points="668.9262,-422.9417 677.5441,-416.7788 666.9639,-416.2224 668.9262,-422.9417"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).TermType -->
<g id="node27" class="node">
<title>(blitter.com/go/hkexsh.Session).TermType</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-471" rx="42.8032" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-467.3" font-family="Verdana" font-size="14.00" fill="#000000">TermType</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).TermType -->
<g id="edge18" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).TermType</title>
<path fill="none" stroke="#8b4513" d="M509.1732,-648.0225C535.1981,-635.5414 568.6999,-615.9557 590.7117,-590 618.0432,-557.7716 595.9607,-530.9836 626.7117,-502 637.8358,-491.5153 652.6538,-484.5637 667.0854,-479.9597"/>
<polygon fill="#8b4513" stroke="#8b4513" points="668.3133,-483.2488 676.9645,-477.1327 666.3875,-476.519 668.3133,-483.2488"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).Cmd -->
<g id="node28" class="node">
<title>(blitter.com/go/hkexsh.Session).Cmd</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-715" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-711.3" font-family="Verdana" font-size="14.00" fill="#000000">Cmd</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).Cmd -->
<g id="edge19" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).Cmd</title>
<path fill="none" stroke="#8b4513" d="M531.0344,-676.476C578.195,-686.2213 642.1435,-699.4356 681.5613,-707.5809"/>
<polygon fill="#8b4513" stroke="#8b4513" points="681.0101,-711.0409 691.5115,-709.637 682.4267,-704.1857 681.0101,-711.0409"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).AuthCookie -->
<g id="node29" class="node">
<title>(blitter.com/go/hkexsh.Session).AuthCookie</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-593" rx="49.5034" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-589.3" font-family="Verdana" font-size="14.00" fill="#000000">AuthCookie</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).AuthCookie -->
<g id="edge20" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh.Session).AuthCookie</title>
<path fill="none" stroke="#8b4513" d="M520.9012,-649.5465C564.1818,-637.0958 626.2536,-619.2392 669.0072,-606.9401"/>
<polygon fill="#8b4513" stroke="#8b4513" points="669.9857,-610.3006 678.6283,-604.1723 668.0504,-603.5734 669.9857,-610.3006"/>
</g>
<!-- (blitter.com/go/hkexsh/hkexnet.Conn).Write -->
<g id="node40" class="node">
<title>(blitter.com/go/hkexsh/hkexnet.Conn).Write</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1000" rx="27" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-996.3" font-family="Verdana" font-size="14.00" fill="#000000">Write</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).Write -->
<g id="edge21" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.sendSessionParams&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).Write</title>
<path fill="none" stroke="#8b4513" stroke-dasharray="5,2" d="M483.9763,-681.9512C501.4903,-706.0945 532.5194,-750.7697 553.7117,-792 594.3088,-870.9829 559.7901,-919.6227 626.7117,-978 641.3159,-990.7395 662.0692,-996.3785 680.0447,-998.7705"/>
<polygon fill="#8b4513" stroke="#8b4513" points="679.931,-1002.2775 690.2399,-999.8327 680.6565,-995.3152 679.931,-1002.2775"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket -->
<g id="edge30" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket</title>
<path fill="none" stroke="#8b4513" d="M262.0382,-1604.679C320.8802,-1614.7672 447.229,-1636.5815 553.7117,-1656 590.0561,-1662.6279 630.8814,-1670.3559 662.6769,-1676.4378"/>
<polygon fill="#8b4513" stroke="#8b4513" points="662.1858,-1679.9073 672.6657,-1678.3512 663.5027,-1673.0323 662.1858,-1679.9073"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.launchTuns&#45;&gt;blitter.com/go/hkexsh/hkexsh.reqTunnel -->
<g id="edge32" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.launchTuns&#45;&gt;blitter.com/go/hkexsh/hkexsh.reqTunnel</title>
<path fill="none" stroke="#000000" d="M277.1648,-1678.7997C317.6623,-1680.3067 375.3898,-1682.4548 417.2418,-1684.0122"/>
<polygon fill="#000000" stroke="#000000" points="417.1286,-1687.5103 427.2519,-1684.3847 417.389,-1680.5152 417.1286,-1687.5103"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$1 -->
<g id="node9" class="node">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$1</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="470.6588" cy="-822" rx="64.8047" ry="18"/>
<text text-anchor="middle" x="470.6588" y="-818.3" font-family="Verdana" font-size="14.00" fill="#000000">doShellMode$1</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$1&#45;&gt;blitter.com/go/hkexsh.Restore -->
<g id="edge34" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$1&#45;&gt;blitter.com/go/hkexsh.Restore</title>
<path fill="none" stroke="#8b4513" d="M524.8215,-811.9051C569.8206,-803.5181 632.9814,-791.7461 674.5424,-783.9999"/>
<polygon fill="#8b4513" stroke="#8b4513" points="675.4298,-787.3949 684.6192,-782.1218 674.1472,-780.5134 675.4298,-787.3949"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$1&#45;&gt;(*blitter.com/go/hkexsh.Session).SetStatus -->
<g id="edge36" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$1&#45;&gt;(*blitter.com/go/hkexsh.Session).SetStatus</title>
<path fill="none" stroke="#8b4513" d="M485.5409,-804.3642C504.4733,-780.9511 536.7439,-737.5839 553.7117,-695 557.9228,-684.4315 619.1644,-300.5126 626.7117,-292 636.7548,-280.6724 651.2672,-273.8685 665.7514,-269.8004"/>
<polygon fill="#8b4513" stroke="#8b4513" points="666.8169,-273.1439 675.7191,-267.3992 665.1775,-266.3386 666.8169,-273.1439"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$1&#45;&gt;(blitter.com/go/hkexsh.Session).Status -->
<g id="edge37" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$1&#45;&gt;(blitter.com/go/hkexsh.Session).Status</title>
<path fill="none" stroke="#8b4513" d="M482.9124,-804.1804C499.5033,-779.8508 529.787,-734.7176 553.7117,-695 588.3038,-637.5734 575.324,-606.0549 626.7117,-563 641.3275,-550.7543 661.0286,-543.261 678.3401,-538.7188"/>
<polygon fill="#8b4513" stroke="#8b4513" points="679.2825,-542.0924 688.2002,-536.3718 677.6615,-535.2826 679.2825,-542.0924"/>
</g>
<!-- (blitter.com/go/hkexsh/hkexnet.Conn).GetStatus -->
<g id="node42" class="node">
<title>(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1061" rx="43.4031" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1057.3" font-family="Verdana" font-size="14.00" fill="#000000">GetStatus</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$1&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus -->
<g id="edge35" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$1&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus</title>
<path fill="none" stroke="#8b4513" d="M489.363,-839.5198C507.0433,-856.5892 533.7604,-883.7371 553.7117,-910 591.7048,-960.0122 577.6233,-991.8207 626.7117,-1031 638.4088,-1040.3359 653.1278,-1046.8171 667.2877,-1051.2964"/>
<polygon fill="#8b4513" stroke="#8b4513" points="666.3789,-1054.677 676.9574,-1054.0881 668.3206,-1047.9516 666.3789,-1054.677"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode&#45;&gt;blitter.com/go/hkexsh/hkexsh.doShellMode$1 -->
<g id="edge38" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode&#45;&gt;blitter.com/go/hkexsh/hkexsh.doShellMode$1</title>
<path fill="none" stroke="#000000" d="M272.3777,-993.8612C286.4549,-989.2124 301.738,-982.9949 314.606,-975 342.0104,-957.9735 401.8739,-896.0467 438.9757,-856.3902"/>
<polygon fill="#000000" stroke="#000000" points="450.4303,-849.2005 454.6713,-839.4915 445.3014,-844.4367 450.4303,-849.2005"/>
<polyline fill="none" stroke="#000000" points="447.8658,-846.8186 444.4631,-850.4821 "/>
<ellipse fill="none" stroke="#000000" cx="441.741" cy="-853.413" rx="4" ry="4"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.handleTermResizes -->
<g id="node13" class="node">
<title>blitter.com/go/hkexsh/hkexsh.handleTermResizes</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="470.6588" cy="-1002" rx="80.7059" ry="18"/>
<text text-anchor="middle" x="470.6588" y="-998.3" font-family="Verdana" font-size="14.00" fill="#000000">handleTermResizes</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode&#45;&gt;blitter.com/go/hkexsh/hkexsh.handleTermResizes -->
<g id="edge42" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode&#45;&gt;blitter.com/go/hkexsh/hkexsh.handleTermResizes</title>
<path fill="none" stroke="#000000" d="M283.9864,-1004.3155C312.1661,-1003.966 347.1889,-1003.5315 379.2601,-1003.1337"/>
<polygon fill="#000000" stroke="#000000" points="379.601,-1006.6299 389.5567,-1003.006 379.5141,-999.6304 379.601,-1006.6299"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$2 -->
<g id="node14" class="node">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$2</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="470.6588" cy="-940" rx="64.8047" ry="18"/>
<text text-anchor="middle" x="470.6588" y="-936.3" font-family="Verdana" font-size="14.00" fill="#000000">doShellMode$2</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode&#45;&gt;blitter.com/go/hkexsh/hkexsh.doShellMode$2 -->
<g id="edge45" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode&#45;&gt;blitter.com/go/hkexsh/hkexsh.doShellMode$2</title>
<path fill="none" stroke="#000000" d="M271.4852,-993.5289C307.4442,-983.8648 359.5796,-969.8531 401.4908,-958.5893"/>
<polygon fill="#000000" stroke="#000000" points="415.1131,-958.5524 423.862,-952.5769 413.2963,-951.7923 415.1131,-958.5524"/>
<polyline fill="none" stroke="#000000" points="414.2047,-955.1724 409.376,-956.4701 "/>
<ellipse fill="none" stroke="#000000" cx="405.5131" cy="-957.5083" rx="4" ry="4"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.handleTermResizes$1 -->
<g id="node11" class="node">
<title>blitter.com/go/hkexsh/hkexsh.handleTermResizes$1</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="717.4649" cy="-915" rx="90.507" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-911.3" font-family="Verdana" font-size="14.00" fill="#000000">handleTermResizes$1</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.GetSize -->
<g id="node12" class="node">
<title>blitter.com/go/hkexsh/hkexsh.GetSize</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width="1.5" cx="915.8692" cy="-915" rx="34.8031" ry="18"/>
<text text-anchor="middle" x="915.8692" y="-911.3" font-family="Verdana" font-size="14.00" fill="#000000">GetSize</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.handleTermResizes$1&#45;&gt;blitter.com/go/hkexsh/hkexsh.GetSize -->
<g id="edge39" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.handleTermResizes$1&#45;&gt;blitter.com/go/hkexsh/hkexsh.GetSize</title>
<path fill="none" stroke="#000000" d="M808.2478,-915C830.0141,-915 852.3249,-915 870.9481,-915"/>
<polygon fill="#000000" stroke="#000000" points="871.1707,-918.5001 881.1707,-915 871.1706,-911.5001 871.1707,-918.5001"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.handleTermResizes$1&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket -->
<g id="edge40" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.handleTermResizes$1&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket</title>
<path fill="none" stroke="#8b4513" d="M644.5277,-925.8547C629.6036,-931.9067 616.1819,-941.2176 608.7117,-955.5 590.9712,-989.4185 590.9712,-1610.5815 608.7117,-1644.5 618.5215,-1663.2555 638.4208,-1673.7817 658.5474,-1679.6713"/>
<polygon fill="#8b4513" stroke="#8b4513" points="657.8461,-1683.1048 668.4027,-1682.2058 659.5897,-1676.3254 657.8461,-1683.1048"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.handleTermResizes&#45;&gt;blitter.com/go/hkexsh/hkexsh.handleTermResizes$1 -->
<g id="edge41" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.handleTermResizes&#45;&gt;blitter.com/go/hkexsh/hkexsh.handleTermResizes$1</title>
<path fill="none" stroke="#000000" d="M512.5116,-986.462C525.7036,-981.5419 540.3248,-976.0656 553.7117,-971 586.2119,-958.7019 593.8687,-954.3509 626.7117,-943 632.5728,-940.9743 638.6705,-938.9395 644.8088,-936.942"/>
<polygon fill="#000000" stroke="#000000" points="658.3904,-936.3107 666.8663,-929.954 656.2762,-929.6376 658.3904,-936.3107"/>
<polyline fill="none" stroke="#000000" points="657.3333,-932.9742 652.5668,-934.4843 "/>
<ellipse fill="none" stroke="#000000" cx="648.7536" cy="-935.6923" rx="4" ry="4"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$2$1 -->
<g id="node15" class="node">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$2$1</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="717.4649" cy="-854" rx="74.6057" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-850.3" font-family="Verdana" font-size="14.00" fill="#000000">doShellMode$2$1</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$2&#45;&gt;blitter.com/go/hkexsh/hkexsh.doShellMode$2$1 -->
<g id="edge43" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$2&#45;&gt;blitter.com/go/hkexsh/hkexsh.doShellMode$2$1</title>
<path fill="none" stroke="#000000" d="M510.7129,-925.7631C542.2137,-914.5955 587.2253,-898.702 626.7117,-885 638.875,-880.7793 651.9707,-876.2799 664.3256,-872.0553"/>
<polygon fill="#000000" stroke="#000000" points="665.711,-875.2807 674.0433,-868.7367 663.4487,-868.6563 665.711,-875.2807"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doShellMode$2&#45;&gt;blitter.com/go/hkexsh.Restore -->
<g id="edge44" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doShellMode$2&#45;&gt;blitter.com/go/hkexsh.Restore</title>
<path fill="none" stroke="#8b4513" d="M487.6443,-922.5074C521.1345,-888.3715 595.1672,-814.7468 626.7117,-798 641.1596,-790.3297 658.3165,-785.2881 673.8025,-781.9947"/>
<polygon fill="#8b4513" stroke="#8b4513" points="674.5439,-785.4162 683.6925,-780.0728 673.2085,-778.5447 674.5439,-785.4162"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(blitter.com/go/hkexsh.Session).Cmd -->
<g id="edge48" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(blitter.com/go/hkexsh.Session).Cmd</title>
<path fill="none" stroke="#8b4513" d="M517.6912,-1055.9676C530.9647,-1051.0454 544.3297,-1043.7578 553.7117,-1033 642.7701,-930.8819 530.7108,-832.6207 626.7117,-737 640.6996,-723.0676 661.9155,-717.412 680.3177,-715.3115"/>
<polygon fill="#8b4513" stroke="#8b4513" points="680.7943,-718.784 690.4688,-714.4649 680.2125,-711.8082 680.7943,-718.784"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket -->
<g id="edge49" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket</title>
<path fill="none" stroke="#8b4513" d="M473.1175,-1084.2477C485.5738,-1174.1845 544.3659,-1569.4624 626.7117,-1657 635.7722,-1666.6317 647.9855,-1673.174 660.5109,-1677.6169"/>
<polygon fill="#8b4513" stroke="#8b4513" points="659.5139,-1680.9722 670.103,-1680.6216 661.6065,-1674.2923 659.5139,-1680.9722"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus -->
<g id="node39" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="717.4649" cy="-1321" rx="42.2035" ry="18"/>
<text text-anchor="middle" x="717.4649" y="-1317.3" font-family="Verdana" font-size="14.00" fill="#000000">SetStatus</text>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus -->
<g id="edge51" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus</title>
<path fill="none" stroke="#8b4513" d="M490.2274,-1083.2625C516.313,-1107.1886 562.4638,-1152.8393 590.7117,-1200 614.7694,-1240.165 591.8213,-1267.7805 626.7117,-1299 637.3086,-1308.482 651.2975,-1314.049 665.1101,-1317.2708"/>
<polygon fill="#8b4513" stroke="#8b4513" points="664.5993,-1320.7372 675.0856,-1319.2247 665.9449,-1313.8677 664.5993,-1320.7372"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).Read -->
<g id="edge50" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).Read</title>
<path fill="none" stroke="#8b4513" d="M520.7829,-1074.2533C542.3797,-1078.0498 567.8701,-1082.8524 590.7117,-1088 621.9674,-1095.0437 657.1322,-1104.6084 682.48,-1111.7991"/>
<polygon fill="#8b4513" stroke="#8b4513" points="681.7853,-1115.2406 692.3621,-1114.6232 683.7088,-1108.51 681.7853,-1115.2406"/>
</g>
<!-- blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus -->
<g id="edge52" class="edge">
<title>blitter.com/go/hkexsh/hkexsh.doCopyMode&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).GetStatus</title>
<path fill="none" stroke="#8b4513" d="M526.3652,-1063.1764C546.3388,-1062.292 569.0292,-1061.4341 589.7117,-1061 614.037,-1060.4894 640.9733,-1060.4164 663.8162,-1060.4997"/>
<polygon fill="#8b4513" stroke="#8b4513" points="663.983,-1064.0005 673.9995,-1060.548 664.0163,-1057.0005 663.983,-1064.0005"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 56 KiB

View File

@ -10,5 +10,6 @@ clean:
$(RM) $(EXE) $(EXE).exe
vis:
go-callvis -skipbrowser -png -svg -output hkexshd-vis -ignore $(EXTPKGS) -group pkg,type .
go-callvis -skipbrowser -output hkexshd-vis -ignore $(EXTPKGS) -group pkg,type .
../fixup-gv.sh hkexshd.go && cat hkexshd-vis.gv | dot -Tpng -ohkexshd-vis.gv.png

View File

@ -20,85 +20,86 @@ labelloc="t";
labeljust="c";
fontsize="18";
"blitter.com/go/hkexsh/hkexshd.main$1" [ label="main$1" style="dotted,filled" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexshd.main$1" [ fillcolor="lightblue" label="main$1" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.main" [ fillcolor="lightblue" label="main" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexshd.main$2" [ style="dotted,filled" fillcolor="lightblue" label="main$2" ]
"blitter.com/go/hkexsh/hkexshd.GenAuthToken" [ label="GenAuthToken" penwidth="1.5" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexshd.main$2" [ fillcolor="lightblue" label="main$2" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.GenAuthToken" [ fillcolor="lightblue" label="GenAuthToken" penwidth="1.5" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" [ fillcolor="lightblue" label="runShellAs" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$1" [ style="dotted,filled" fillcolor="lightblue" label="runShellAs$1" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$2" [ fillcolor="lightblue" label="runShellAs$2" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$3" [ fillcolor="lightblue" label="runShellAs$3" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$4" [ label="runShellAs$4" style="dotted,filled" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexshd.main$2$1" [ fillcolor="lightblue" label="main$2$1" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs" [ fillcolor="lightblue" label="runClientToServerCopyAs" penwidth="0.5" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$1" [ fillcolor="lightblue" label="deferPtmxClose" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$2" [ fillcolor="lightblue" label="termResizeWatcher" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$3" [ fillcolor="lightblue" label="stdinToPtyWorker" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$4" [ fillcolor="lightblue" label="deferChaffShutdown" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$5" [ fillcolor="lightblue" label="runShellAs$5" style="dotted,filled" ]
"blitter.com/go/hkexsh/hkexshd.main$2$1" [ label="main$2$1" style="dotted,filled" fillcolor="lightblue" ]
"blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs" [ penwidth="0.5" fillcolor="lightblue" label="runClientToServerCopyAs" ]
"blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs" [ fillcolor="lightblue" label="runServerToClientCopyAs" penwidth="0.5" ]
subgraph "cluster_blitter.com/go/goutmp" {
penwidth="0.8";
style="filled";
fillcolor="lightyellow";
label="[goutmp]";
URL="/?f=blitter.com/go/goutmp";
tooltip="package: blitter.com/go/goutmp";
penwidth="0.8";
fontsize="16";
style="filled";
fontname="bold";
rank="sink";
label="[goutmp]";
tooltip="package: blitter.com/go/goutmp";
"blitter.com/go/goutmp.GetHost" [ fillcolor="moccasin" label="GetHost" penwidth="1.5" ]
"blitter.com/go/goutmp.Put_utmp" [ fillcolor="moccasin" label="Put_utmp" penwidth="1.5" ]
"blitter.com/go/goutmp.Unput_utmp" [ fillcolor="moccasin" label="Unput_utmp" penwidth="1.5" ]
"blitter.com/go/goutmp.Put_utmp" [ penwidth="1.5" fillcolor="moccasin" label="Put_utmp" ]
"blitter.com/go/goutmp.Unput_utmp" [ label="Unput_utmp" penwidth="1.5" fillcolor="moccasin" ]
"blitter.com/go/goutmp.Put_lastlog_entry" [ fillcolor="moccasin" label="Put_lastlog_entry" penwidth="1.5" ]
}
subgraph "cluster_blitter.com/go/hkexsh" {
style="filled";
fontname="bold";
label="[hkexsh]";
fontsize="16";
fillcolor="lightyellow";
rank="sink";
URL="/?f=blitter.com/go/hkexsh";
label="[hkexsh]";
tooltip="package: blitter.com/go/hkexsh";
penwidth="0.8";
fontsize="16";
URL="/?f=blitter.com/go/hkexsh";
fontname="bold";
rank="sink";
"blitter.com/go/hkexsh.AuthUserByToken" [ fillcolor="moccasin" label="AuthUserByToken" penwidth="1.5" ]
"blitter.com/go/hkexsh.AuthUserByPasswd" [ fillcolor="moccasin" label="AuthUserByPasswd" penwidth="1.5" ]
subgraph "cluster_*blitter.com/go/hkexsh.Session" {
fontsize="15";
fontcolor="#222222";
labelloc="b";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
label="(*Session)";
tooltip="type: *blitter.com/go/hkexsh.Session";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
"(*blitter.com/go/hkexsh.Session).SetOp" [ fillcolor="moccasin" label="SetOp" penwidth="1.5" ]
"(*blitter.com/go/hkexsh.Session).SetOp" [ label="SetOp" penwidth="1.5" fillcolor="moccasin" ]
"(*blitter.com/go/hkexsh.Session).SetWho" [ fillcolor="moccasin" label="SetWho" penwidth="1.5" ]
"(*blitter.com/go/hkexsh.Session).SetConnHost" [ fillcolor="moccasin" label="SetConnHost" penwidth="1.5" ]
"(*blitter.com/go/hkexsh.Session).SetTermType" [ fillcolor="moccasin" label="SetTermType" penwidth="1.5" ]
"(*blitter.com/go/hkexsh.Session).SetCmd" [ penwidth="1.5" fillcolor="moccasin" label="SetCmd" ]
"(*blitter.com/go/hkexsh.Session).SetAuthCookie" [ fillcolor="moccasin" label="SetAuthCookie" penwidth="1.5" ]
"(*blitter.com/go/hkexsh.Session).ClearAuthCookie" [ fillcolor="moccasin" label="ClearAuthCookie" penwidth="1.5" ]
"(*blitter.com/go/hkexsh.Session).ClearAuthCookie" [ label="ClearAuthCookie" penwidth="1.5" fillcolor="moccasin" ]
}
subgraph "cluster_blitter.com/go/hkexsh.Session" {
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
label="(Session)";
label="(Session)";
tooltip="type: blitter.com/go/hkexsh.Session";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
"(blitter.com/go/hkexsh.Session).Op" [ fillcolor="moccasin" label="Op" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).Op" [ penwidth="1.5" fillcolor="moccasin" label="Op" ]
"(blitter.com/go/hkexsh.Session).Who" [ fillcolor="moccasin" label="Who" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).ConnHost" [ label="ConnHost" penwidth="1.5" fillcolor="moccasin" ]
"(blitter.com/go/hkexsh.Session).Cmd" [ label="Cmd" penwidth="1.5" fillcolor="moccasin" ]
"(blitter.com/go/hkexsh.Session).ConnHost" [ fillcolor="moccasin" label="ConnHost" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).Cmd" [ fillcolor="moccasin" label="Cmd" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).AuthCookie" [ fillcolor="moccasin" label="AuthCookie" penwidth="1.5" ]
"(blitter.com/go/hkexsh.Session).TermType" [ fillcolor="moccasin" label="TermType" penwidth="1.5" ]
@ -107,34 +108,34 @@ fontsize="15";
}
subgraph "cluster_blitter.com/go/hkexsh/hkexnet" {
fillcolor="lightyellow";
tooltip="package: blitter.com/go/hkexsh/hkexnet";
fontname="bold";
tooltip="package: blitter.com/go/hkexsh/hkexnet";
rank="sink";
label="[hkexnet]";
fillcolor="lightyellow";
URL="/?f=blitter.com/go/hkexsh/hkexnet";
penwidth="0.8";
fontsize="16";
style="filled";
rank="sink";
label="[hkexnet]";
"blitter.com/go/hkexsh/hkexnet.Init" [ fillcolor="moccasin" label="Init" penwidth="1.5" ]
"blitter.com/go/hkexsh/hkexnet.Init" [ label="Init" penwidth="1.5" fillcolor="moccasin" ]
"blitter.com/go/hkexsh/hkexnet.Listen" [ fillcolor="moccasin" label="Listen" penwidth="1.5" ]
subgraph "cluster_*blitter.com/go/hkexsh/hkexnet.Conn" {
fillcolor="wheat2";
style="rounded,filled";
fillcolor="wheat2";
label="(*Conn)";
tooltip="type: *blitter.com/go/hkexsh/hkexnet.Conn";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
"(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ label="SetupChaff" penwidth="1.5" fillcolor="moccasin" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff" [ fillcolor="moccasin" label="SetupChaff" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).Close" [ fillcolor="moccasin" label="Close" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).RemoteAddr" [ fillcolor="moccasin" label="RemoteAddr" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).RemoteAddr" [ label="RemoteAddr" penwidth="1.5" fillcolor="moccasin" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ fillcolor="moccasin" label="EnableChaff" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ penwidth="1.5" fillcolor="moccasin" label="DisableChaff" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ fillcolor="moccasin" label="DisableChaff" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ fillcolor="moccasin" label="ShutdownChaff" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus" [ fillcolor="moccasin" label="SetStatus" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket" [ fillcolor="moccasin" label="WritePacket" penwidth="1.5" ]
@ -142,42 +143,42 @@ style="rounded,filled";
}
subgraph "cluster_*blitter.com/go/hkexsh/hkexnet.HKExListener" {
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
label="(*HKExListener)";
label="(*HKExListener)";
tooltip="type: *blitter.com/go/hkexsh/hkexnet.HKExListener";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
"(*blitter.com/go/hkexsh/hkexnet.HKExListener).Accept" [ fillcolor="moccasin" label="Accept" penwidth="1.5" ]
"(*blitter.com/go/hkexsh/hkexnet.HKExListener).Accept" [ label="Accept" penwidth="1.5" fillcolor="moccasin" ]
}
subgraph "cluster_blitter.com/go/hkexsh/hkexnet.Conn" {
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
fillcolor="wheat2";
fillcolor="wheat2";
label="(Conn)";
tooltip="type: blitter.com/go/hkexsh/hkexnet.Conn";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
"(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ penwidth="1.5" fillcolor="moccasin" label="Write" ]
"(blitter.com/go/hkexsh/hkexnet.Conn).Write" [ fillcolor="moccasin" label="Write" penwidth="1.5" ]
}
subgraph "cluster_blitter.com/go/hkexsh/hkexnet.HKExListener" {
fillcolor="wheat2";
style="rounded,filled";
fillcolor="wheat2";
label="(HKExListener)";
tooltip="type: blitter.com/go/hkexsh/hkexnet.HKExListener";
penwidth="0.5";
fontsize="15";
fontcolor="#222222";
labelloc="b";
style="rounded,filled";
"(blitter.com/go/hkexsh/hkexnet.HKExListener).Close" [ fillcolor="moccasin" label="Close" penwidth="1.5" ]
@ -186,15 +187,15 @@ style="rounded,filled";
}
subgraph "cluster_blitter.com/go/hkexsh/logger" {
fillcolor="lightyellow";
label="[logger]";
penwidth="0.8";
penwidth="0.8";
fontsize="16";
style="filled";
rank="sink";
label="[logger]";
URL="/?f=blitter.com/go/hkexsh/logger";
tooltip="package: blitter.com/go/hkexsh/logger";
fontsize="16";
fillcolor="lightyellow";
fontname="bold";
tooltip="package: blitter.com/go/hkexsh/logger";
"blitter.com/go/hkexsh/logger.LogNotice" [ fillcolor="moccasin" label="LogNotice" penwidth="1.5" ]
"blitter.com/go/hkexsh/logger.New" [ fillcolor="moccasin" label="New" penwidth="1.5" ]
@ -204,14 +205,14 @@ fontname="bold";
subgraph "cluster_github.com/kr/pty" {
fillcolor="lightyellow";
fontname="bold";
rank="sink";
label="[pty]";
URL="/?f=github.com/kr/pty";
tooltip="package: github.com/kr/pty";
penwidth="0.8";
fontsize="16";
style="filled";
tooltip="package: github.com/kr/pty";
fontname="bold";
label="[pty]";
URL="/?f=github.com/kr/pty";
"github.com/kr/pty.Start" [ fillcolor="moccasin" label="Start" penwidth="1.5" ]
"github.com/kr/pty.Setsize" [ fillcolor="moccasin" label="Setsize" penwidth="1.5" ]
@ -255,9 +256,10 @@ tooltip="package: github.com/kr/pty";
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$2" [ arrowhead="normalnoneodot" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$3" [ arrowhead="normalnoneodot" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ color="saddlebrown" arrowhead="normalnoneodiamond" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ arrowhead="normalnoneodiamond" color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$4" [ arrowhead="normalnoneodot" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$4" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs$4" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$4" [ arrowhead="normalnoneodiamond" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "blitter.com/go/hkexsh/hkexshd.runShellAs$5" [ arrowhead="normalnoneodot" ]
"blitter.com/go/hkexsh/hkexshd.runShellAs" -> "(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus" [ color="saddlebrown" ]
"blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/hkexshd.runShellAs" [ ]
"blitter.com/go/hkexsh/hkexshd.main$2" -> "blitter.com/go/hkexsh/logger.LogErr" [ color="saddlebrown" ]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 KiB

After

Width:  |  Height:  |  Size: 579 KiB

View File

@ -1,767 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: gocallvis Pages: 1 -->
<svg width="915pt" height="1911pt"
viewBox="0.00 0.00 915.32 1911.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(0 1911)">
<title>gocallvis</title>
<polygon fill="#d3d3d3" stroke="transparent" points="0,0 0,-1911 915.3169,-1911 915.3169,0 0,0"/>
<text text-anchor="middle" x="106" y="-7.8" font-family="Arial" font-size="14.00" fill="#000000">blitter.com/go/hkexsh/hkexshd</text>
<g id="clust1" class="cluster">
<title>cluster_focus</title>
<polygon fill="#e6ecfa" stroke="#000000" stroke-width=".5" points="8,-31 8,-1903 907.3169,-1903 907.3169,-31 8,-31"/>
<text text-anchor="middle" x="457.6585" y="-1884.6" font-family="Arial" font-size="18.00" fill="#000000">main</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_blitter.com/go/goutmp</title>
<g id="a_clust2"><a xlink:href="/?f=blitter.com/go/goutmp" xlink:title="package: blitter.com/go/goutmp">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="579.2096,-429 579.2096,-690 739.3146,-690 739.3146,-429 579.2096,-429"/>
<text text-anchor="middle" x="659.2621" y="-673.2" font-family="bold" font-size="16.00" fill="#000000">[goutmp]</text>
</a>
</g>
</g>
<g id="clust3" class="cluster">
<title>cluster_blitter.com/go/hkexsh</title>
<g id="a_clust3"><a xlink:href="/?f=blitter.com/go/hkexsh" xlink:title="package: blitter.com/go/hkexsh">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="301.5032,-39 301.5032,-1028 477.0088,-1028 477.0088,-39 301.5032,-39"/>
<text text-anchor="middle" x="389.256" y="-1011.2" font-family="bold" font-size="16.00" fill="#000000">[hkexsh]</text>
</a>
</g>
</g>
<g id="clust4" class="cluster">
<title>cluster_*blitter.com/go/hkexsh.Session</title>
<g id="a_clust4"><a xlink:href="/?f=blitter.com/go/hkexsh" xlink:title="type: *blitter.com/go/hkexsh.Session">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M322.8536,-47C322.8536,-47 455.6585,-47 455.6585,-47 461.6585,-47 467.6585,-53 467.6585,-59 467.6585,-59 467.6585,-478 467.6585,-478 467.6585,-484 461.6585,-490 455.6585,-490 455.6585,-490 322.8536,-490 322.8536,-490 316.8536,-490 310.8536,-484 310.8536,-478 310.8536,-478 310.8536,-59 310.8536,-59 310.8536,-53 316.8536,-47 322.8536,-47"/>
<text text-anchor="middle" x="389.256" y="-56" font-family="bold" font-size="15.00" fill="#222222">(*Session)</text>
</a>
</g>
</g>
<g id="clust5" class="cluster">
<title>cluster_blitter.com/go/hkexsh.Session</title>
<g id="a_clust5"><a xlink:href="/?f=blitter.com/go/hkexsh" xlink:title="type: blitter.com/go/hkexsh.Session">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M343.7543,-498C343.7543,-498 434.7577,-498 434.7577,-498 440.7577,-498 446.7577,-504 446.7577,-510 446.7577,-510 446.7577,-868 446.7577,-868 446.7577,-874 440.7577,-880 434.7577,-880 434.7577,-880 343.7543,-880 343.7543,-880 337.7543,-880 331.7543,-874 331.7543,-868 331.7543,-868 331.7543,-510 331.7543,-510 331.7543,-504 337.7543,-498 343.7543,-498"/>
<text text-anchor="middle" x="389.256" y="-507" font-family="bold" font-size="15.00" fill="#222222">(Session)</text>
</a>
</g>
</g>
<g id="clust6" class="cluster">
<title>cluster_blitter.com/go/hkexsh/hkexnet</title>
<g id="a_clust6"><a xlink:href="/?f=blitter.com/go/hkexsh/hkexnet" xlink:title="package: blitter.com/go/hkexsh/hkexnet">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="573.911,-698 573.911,-1613 744.6132,-1613 744.6132,-698 573.911,-698"/>
<text text-anchor="middle" x="659.2621" y="-1596.2" font-family="bold" font-size="16.00" fill="#000000">[hkexnet]</text>
</a>
</g>
</g>
<g id="clust7" class="cluster">
<title>cluster_*blitter.com/go/hkexsh/hkexnet.Conn</title>
<g id="a_clust7"><a xlink:href="/?f=blitter.com/go/hkexsh/hkexnet" xlink:title="type: *blitter.com/go/hkexsh/hkexnet.Conn">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M598.9099,-791C598.9099,-791 719.6144,-791 719.6144,-791 725.6144,-791 731.6144,-797 731.6144,-803 731.6144,-803 731.6144,-1283 731.6144,-1283 731.6144,-1289 725.6144,-1295 719.6144,-1295 719.6144,-1295 598.9099,-1295 598.9099,-1295 592.9099,-1295 586.9099,-1289 586.9099,-1283 586.9099,-1283 586.9099,-803 586.9099,-803 586.9099,-797 592.9099,-791 598.9099,-791"/>
<text text-anchor="middle" x="659.2621" y="-800" font-family="bold" font-size="15.00" fill="#222222">(*Conn)</text>
</a>
</g>
</g>
<g id="clust8" class="cluster">
<title>cluster_*blitter.com/go/hkexsh/hkexnet.HKExListener</title>
<g id="a_clust8"><a xlink:href="/?f=blitter.com/go/hkexsh/hkexnet" xlink:title="type: *blitter.com/go/hkexsh/hkexnet.HKExListener">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M593.911,-1417C593.911,-1417 724.6132,-1417 724.6132,-1417 730.6132,-1417 736.6132,-1423 736.6132,-1429 736.6132,-1429 736.6132,-1482 736.6132,-1482 736.6132,-1488 730.6132,-1494 724.6132,-1494 724.6132,-1494 593.911,-1494 593.911,-1494 587.911,-1494 581.911,-1488 581.911,-1482 581.911,-1482 581.911,-1429 581.911,-1429 581.911,-1423 587.911,-1417 593.911,-1417"/>
<text text-anchor="middle" x="659.2621" y="-1426" font-family="bold" font-size="15.00" fill="#222222">(*HKExListener)</text>
</a>
</g>
</g>
<g id="clust9" class="cluster">
<title>cluster_blitter.com/go/hkexsh/hkexnet.Conn</title>
<g id="a_clust9"><a xlink:href="/?f=blitter.com/go/hkexsh/hkexnet" xlink:title="type: blitter.com/go/hkexsh/hkexnet.Conn">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M634.2621,-706C634.2621,-706 684.2621,-706 684.2621,-706 690.2621,-706 696.2621,-712 696.2621,-718 696.2621,-718 696.2621,-771 696.2621,-771 696.2621,-777 690.2621,-783 684.2621,-783 684.2621,-783 634.2621,-783 634.2621,-783 628.2621,-783 622.2621,-777 622.2621,-771 622.2621,-771 622.2621,-718 622.2621,-718 622.2621,-712 628.2621,-706 634.2621,-706"/>
<text text-anchor="middle" x="659.2621" y="-715" font-family="bold" font-size="15.00" fill="#222222">(Conn)</text>
</a>
</g>
</g>
<g id="clust10" class="cluster">
<title>cluster_blitter.com/go/hkexsh/hkexnet.HKExListener</title>
<g id="a_clust10"><a xlink:href="/?f=blitter.com/go/hkexsh/hkexnet" xlink:title="type: blitter.com/go/hkexsh/hkexnet.HKExListener">
<path fill="#eed8ae" stroke="#000000" stroke-width=".5" d="M597.2621,-1502C597.2621,-1502 721.2621,-1502 721.2621,-1502 727.2621,-1502 733.2621,-1508 733.2621,-1514 733.2621,-1514 733.2621,-1567 733.2621,-1567 733.2621,-1573 727.2621,-1579 721.2621,-1579 721.2621,-1579 597.2621,-1579 597.2621,-1579 591.2621,-1579 585.2621,-1573 585.2621,-1567 585.2621,-1567 585.2621,-1514 585.2621,-1514 585.2621,-1508 591.2621,-1502 597.2621,-1502"/>
<text text-anchor="middle" x="659.2621" y="-1511" font-family="bold" font-size="15.00" fill="#222222">(HKExListener)</text>
</a>
</g>
</g>
<g id="clust11" class="cluster">
<title>cluster_blitter.com/go/hkexsh/logger</title>
<g id="a_clust11"><a xlink:href="/?f=blitter.com/go/hkexsh/logger" xlink:title="package: blitter.com/go/hkexsh/logger">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="337.2545,-1488 337.2545,-1688 441.2575,-1688 441.2575,-1488 337.2545,-1488"/>
<text text-anchor="middle" x="389.256" y="-1671.2" font-family="bold" font-size="16.00" fill="#000000">[logger]</text>
</a>
</g>
</g>
<g id="clust12" class="cluster">
<title>cluster_github.com/kr/pty</title>
<g id="a_clust12"><a xlink:href="/?f=github.com/kr/pty" xlink:title="package: github.com/kr/pty">
<polygon fill="#ffffe0" stroke="#000000" stroke-width=".8" points="817.3146,-1701 817.3146,-1840 899.3169,-1840 899.3169,-1701 817.3146,-1701"/>
<text text-anchor="middle" x="858.3158" y="-1823.2" font-family="bold" font-size="16.00" fill="#000000">[pty]</text>
</a>
</g>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$1 -->
<g id="node1" class="node">
<title>blitter.com/go/hkexsh/hkexshd.main$1</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="177.6512" cy="-1609" rx="34.8031" ry="18"/>
<text text-anchor="middle" x="177.6512" y="-1605.3" font-family="Verdana" font-size="14.00" fill="#000000">main$1</text>
</g>
<!-- blitter.com/go/hkexsh/logger.LogNotice -->
<g id="node45" class="node">
<title>blitter.com/go/hkexsh/logger.LogNotice</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-1575" rx="44.0031" ry="18"/>
<text text-anchor="middle" x="389.256" y="-1571.3" font-family="Verdana" font-size="14.00" fill="#000000">LogNotice</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$1&#45;&gt;blitter.com/go/hkexsh/logger.LogNotice -->
<g id="edge1" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$1&#45;&gt;blitter.com/go/hkexsh/logger.LogNotice</title>
<path fill="none" stroke="#8b4513" d="M211.1806,-1603.6126C245.3789,-1598.1177 298.8742,-1589.5223 338.3119,-1583.1855"/>
<polygon fill="#8b4513" stroke="#8b4513" points="338.9512,-1586.6278 348.2693,-1581.5856 337.8407,-1579.7164 338.9512,-1586.6278"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main -->
<g id="node2" class="node">
<title>blitter.com/go/hkexsh/hkexshd.main</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="43" cy="-1771" rx="27" ry="18"/>
<text text-anchor="middle" x="43" y="-1767.3" font-family="Verdana" font-size="14.00" fill="#000000">main</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/hkexshd.main$1 -->
<g id="edge4" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/hkexshd.main$1</title>
<path fill="none" stroke="#000000" d="M52.8763,-1753.9068C64.4769,-1734.4349 84.8393,-1702.0721 106,-1677 116.8157,-1664.185 129.8225,-1651.2389 141.7686,-1640.1315"/>
<polygon fill="#000000" stroke="#000000" points="154.0999,-1633.7598 159.2006,-1624.4736 149.4223,-1628.5521 154.0999,-1633.7598"/>
<polyline fill="none" stroke="#000000" points="151.7611,-1631.156 148.0414,-1634.4972 "/>
<ellipse fill="none" stroke="#000000" cx="145.0656" cy="-1637.1701" rx="4" ry="4"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2 -->
<g id="node3" class="node">
<title>blitter.com/go/hkexsh/hkexshd.main$2</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="177.6512" cy="-1037" rx="34.8031" ry="18"/>
<text text-anchor="middle" x="177.6512" y="-1033.3" font-family="Verdana" font-size="14.00" fill="#000000">main$2</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/hkexshd.main$2 -->
<g id="edge56" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/hkexshd.main$2</title>
<path fill="none" stroke="#000000" d="M46.3285,-1752.8561C63.7736,-1657.7607 144.8194,-1215.9701 170.0993,-1078.1661"/>
<polygon fill="#000000" stroke="#000000" points="175.9567,-1065.6342 174.3185,-1055.1668 169.0716,-1064.3711 175.9567,-1065.6342"/>
<polyline fill="none" stroke="#000000" points="172.5141,-1065.0026 171.6119,-1069.9206 "/>
<ellipse fill="none" stroke="#000000" cx="170.8902" cy="-1073.8549" rx="4" ry="4"/>
</g>
<!-- blitter.com/go/hkexsh/hkexnet.Init -->
<g id="node32" class="node">
<title>blitter.com/go/hkexsh/hkexnet.Init</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1330" rx="27" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1326.3" font-family="Verdana" font-size="14.00" fill="#000000">Init</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/hkexnet.Init -->
<g id="edge3" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/hkexnet.Init</title>
<path fill="none" stroke="#8b4513" d="M69.4979,-1766.9224C96.6002,-1763.1099 139.9567,-1758 177.6512,-1758 177.6512,-1758 177.6512,-1758 389.256,-1758 435.8175,-1758 458.1558,-1775.6464 493.2096,-1745 624.5029,-1630.2148 461.5874,-1494.4053 573.911,-1361 586.0489,-1346.584 605.4613,-1338.8718 622.708,-1334.746"/>
<polygon fill="#8b4513" stroke="#8b4513" points="623.4597,-1338.1647 632.541,-1332.7077 622.0387,-1331.3104 623.4597,-1338.1647"/>
</g>
<!-- blitter.com/go/hkexsh/hkexnet.Listen -->
<g id="node33" class="node">
<title>blitter.com/go/hkexsh/hkexnet.Listen</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1391" rx="28.102" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1387.3" font-family="Verdana" font-size="14.00" fill="#000000">Listen</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/hkexnet.Listen -->
<g id="edge5" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/hkexnet.Listen</title>
<path fill="none" stroke="#8b4513" d="M69.2336,-1775.3529C96.3093,-1779.4627 139.8114,-1785 177.6512,-1785 177.6512,-1785 177.6512,-1785 389.256,-1785 452.5295,-1785 485.8601,-1810.1294 530.2096,-1765 640.7061,-1652.5605 469.8407,-1531.4123 573.911,-1413 585.5392,-1399.7694 603.9667,-1393.9889 620.7279,-1391.6338"/>
<polygon fill="#8b4513" stroke="#8b4513" points="621.2908,-1395.0941 630.8731,-1390.5741 620.5635,-1388.132 621.2908,-1395.0941"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff -->
<g id="node34" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1269" rx="47.7038" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1265.3" font-family="Verdana" font-size="14.00" fill="#000000">SetupChaff</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff -->
<g id="edge8" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetupChaff</title>
<path fill="none" stroke="#8b4513" d="M64.7751,-1781.9872C90.8997,-1794.1319 136.3533,-1812 177.6512,-1812 177.6512,-1812 177.6512,-1812 389.256,-1812 444.2224,-1812 460.9006,-1789.4683 493.2096,-1745 531.0393,-1692.9333 517.5287,-1668.0969 530.2096,-1605 544.0908,-1535.9307 527.0135,-1343.5725 573.911,-1291 581.2421,-1282.7818 591.1968,-1277.4457 601.7205,-1274.0206"/>
<polygon fill="#8b4513" stroke="#8b4513" points="602.7439,-1277.3697 611.4862,-1271.3845 600.9196,-1270.6116 602.7439,-1277.3697"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.HKExListener).Accept -->
<g id="node42" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.HKExListener).Accept</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1468" rx="31.2029" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1464.3" font-family="Verdana" font-size="14.00" fill="#000000">Accept</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.HKExListener).Accept -->
<g id="edge7" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.HKExListener).Accept</title>
<path fill="none" stroke="#8b4513" d="M58.6979,-1785.6812C70.8006,-1796.2908 88.3952,-1810.2417 106,-1819 135.6014,-1833.7265 144.5889,-1839 177.6512,-1839 177.6512,-1839 177.6512,-1839 389.256,-1839 452.5295,-1839 485.6134,-1863.8856 530.2096,-1819 632.3118,-1716.2353 481.238,-1607.3425 573.911,-1496 584.7137,-1483.0211 601.6477,-1476.0123 617.5937,-1472.2452"/>
<polygon fill="#8b4513" stroke="#8b4513" points="618.7286,-1475.5883 627.8554,-1470.2076 617.3652,-1468.7223 618.7286,-1475.5883"/>
</g>
<!-- (blitter.com/go/hkexsh/hkexnet.HKExListener).Close -->
<g id="node44" class="node">
<title>(blitter.com/go/hkexsh/hkexnet.HKExListener).Close</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1553" rx="27" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1549.3" font-family="Verdana" font-size="14.00" fill="#000000">Close</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main&#45;&gt;(blitter.com/go/hkexsh/hkexnet.HKExListener).Close -->
<g id="edge6" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main&#45;&gt;(blitter.com/go/hkexsh/hkexnet.HKExListener).Close</title>
<path fill="none" stroke="#8b4513" d="M52.8764,-1787.8767C63.763,-1805.0121 82.8395,-1831.0839 106,-1846 133.7964,-1863.9018 144.5889,-1866 177.6512,-1866 177.6512,-1866 177.6512,-1866 389.256,-1866 452.5295,-1866 485.0469,-1890.3156 530.2096,-1846 617.2898,-1760.5532 491.7192,-1665.1588 573.911,-1575 582.0875,-1566.031 593.39,-1560.5078 605.0967,-1557.1562"/>
<polygon fill="#8b4513" stroke="#8b4513" points="622.5802,-1557.7794 631.8655,-1552.6771 621.425,-1550.8754 622.5802,-1557.7794"/>
<polyline fill="none" stroke="#8b4513" points="622.0026,-1554.3274 617.0712,-1555.1526 "/>
<polygon fill="none" stroke="#8b4513" points="605.2357,-1557.133 610.4933,-1552.1976 617.0712,-1555.1526 611.8136,-1560.0879 605.2357,-1557.133"/>
</g>
<!-- blitter.com/go/hkexsh/logger.New -->
<g id="node46" class="node">
<title>blitter.com/go/hkexsh/logger.New</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-1636" rx="27" ry="18"/>
<text text-anchor="middle" x="389.256" y="-1632.3" font-family="Verdana" font-size="14.00" fill="#000000">New</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/logger.New -->
<g id="edge2" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main&#45;&gt;blitter.com/go/hkexsh/logger.New</title>
<path fill="none" stroke="#8b4513" d="M63.7242,-1759.3479C104.7846,-1736.716 199.8966,-1686.5364 285.3024,-1658 307.2044,-1650.682 332.5427,-1645.2604 352.7199,-1641.6304"/>
<polygon fill="#8b4513" stroke="#8b4513" points="353.4981,-1645.0479 362.7553,-1639.8949 352.3051,-1638.1503 353.4981,-1645.0479"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.GenAuthToken -->
<g id="node4" class="node">
<title>blitter.com/go/hkexsh/hkexshd.GenAuthToken</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-1223" rx="61.7044" ry="18"/>
<text text-anchor="middle" x="389.256" y="-1219.3" font-family="Verdana" font-size="14.00" fill="#000000">GenAuthToken</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.GenAuthToken -->
<g id="edge28" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.GenAuthToken</title>
<path fill="none" stroke="#000000" d="M181.0777,-1055.1781C187.9925,-1086.7063 206.6531,-1151.4594 248.3024,-1186 268.1573,-1202.4661 294.5537,-1211.6852 319.1322,-1216.818"/>
<polygon fill="#000000" stroke="#000000" points="318.6898,-1220.2963 329.1659,-1218.7152 319.9903,-1213.4182 318.6898,-1220.2963"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs -->
<g id="node5" class="node">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="389.256" cy="-1714" rx="46.4041" ry="18"/>
<text text-anchor="middle" x="389.256" y="-1710.3" font-family="Verdana" font-size="14.00" fill="#000000">runShellAs</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs -->
<g id="edge40" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs</title>
<path fill="none" stroke="#000000" d="M177.9373,-1055.0992C179.8322,-1150.8784 193.5457,-1597.7776 285.3024,-1692 297.7286,-1704.7601 315.5684,-1711.0246 332.9707,-1713.878"/>
<polygon fill="#000000" stroke="#000000" points="332.7566,-1717.3793 343.1222,-1715.1873 333.652,-1710.4368 332.7566,-1717.3793"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2$1 -->
<g id="node10" class="node">
<title>blitter.com/go/hkexsh/hkexshd.main$2$1</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="389.256" cy="-1108" rx="44.6032" ry="18"/>
<text text-anchor="middle" x="389.256" y="-1104.3" font-family="Verdana" font-size="14.00" fill="#000000">main$2$1</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.main$2$1 -->
<g id="edge45" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.main$2$1</title>
<path fill="none" stroke="#000000" d="M201.6742,-1049.9813C215.1152,-1056.8797 232.334,-1065.1237 248.3024,-1071 272.2796,-1079.8235 299.2736,-1087.4433 323.1732,-1093.4359"/>
<polygon fill="#000000" stroke="#000000" points="338.9028,-1100.7837 349.4418,-1099.698 340.526,-1093.9745 338.9028,-1100.7837"/>
<polyline fill="none" stroke="#000000" points="339.7144,-1097.3791 334.8507,-1096.2196 "/>
<polygon fill="none" stroke="#000000" points="323.1778,-1093.4369 329.9418,-1090.9373 334.8507,-1096.2196 328.0867,-1098.7192 323.1778,-1093.4369"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs -->
<g id="node11" class="node">
<title>blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="389.256" cy="-1311" rx="103.9072" ry="18"/>
<text text-anchor="middle" x="389.256" y="-1307.3" font-family="Verdana" font-size="14.00" fill="#000000">runClientToServerCopyAs</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs -->
<g id="edge50" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs</title>
<path fill="none" stroke="#000000" d="M180.7232,-1055.2357C189.4997,-1105.2402 216.1343,-1242.8767 248.3024,-1274 259.8968,-1285.2178 274.4604,-1293.1428 289.7947,-1298.7194"/>
<polygon fill="#000000" stroke="#000000" points="288.8293,-1302.0864 299.4224,-1301.8966 291.023,-1295.439 288.8293,-1302.0864"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs -->
<g id="node12" class="node">
<title>blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-width=".5" cx="389.256" cy="-1372" rx="103.9072" ry="18"/>
<text text-anchor="middle" x="389.256" y="-1368.3" font-family="Verdana" font-size="14.00" fill="#000000">runServerToClientCopyAs</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs -->
<g id="edge55" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs</title>
<path fill="none" stroke="#000000" d="M181.3619,-1055.1407C194.0176,-1115.1203 237.3668,-1305.3117 285.3024,-1342 292.1844,-1347.2672 299.9622,-1351.6103 308.0894,-1355.1913"/>
<polygon fill="#000000" stroke="#000000" points="306.8004,-1358.4453 317.3846,-1358.9191 309.406,-1351.9483 306.8004,-1358.4453"/>
</g>
<!-- blitter.com/go/goutmp.GetHost -->
<g id="node13" class="node">
<title>blitter.com/go/goutmp.GetHost</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-638" rx="36.1036" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-634.3" font-family="Verdana" font-size="14.00" fill="#000000">GetHost</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/goutmp.GetHost -->
<g id="edge27" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/goutmp.GetHost</title>
<path fill="none" stroke="#8b4513" d="M189.0984,-1054.0953C206.5198,-1078.3861 242.2514,-1121.8436 285.3024,-1139 328.2215,-1156.1039 452.9504,-1161.6668 493.2096,-1139 520.8399,-1123.4436 519.9298,-1107.9959 530.2096,-1078 585.0377,-918.0152 488.5862,-846.0168 573.911,-700 585.2419,-680.6094 605.3011,-665.5696 623.127,-655.1615"/>
<polygon fill="#8b4513" stroke="#8b4513" points="625.1357,-658.0499 632.1871,-650.1425 621.7436,-651.9267 625.1357,-658.0499"/>
</g>
<!-- blitter.com/go/goutmp.Put_utmp -->
<g id="node14" class="node">
<title>blitter.com/go/goutmp.Put_utmp</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-455" rx="41.6038" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-451.3" font-family="Verdana" font-size="14.00" fill="#000000">Put_utmp</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/goutmp.Put_utmp -->
<g id="edge43" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/goutmp.Put_utmp</title>
<path fill="none" stroke="#8b4513" d="M212.2227,-1038.9206C289.7826,-1042.8827 472.5095,-1050.1535 493.2096,-1032 677.6381,-870.2604 418.7954,-676.0334 573.911,-486 582.8955,-474.9931 596.1324,-467.894 609.514,-463.3155"/>
<polygon fill="#8b4513" stroke="#8b4513" points="610.6493,-466.6291 619.2248,-460.4072 608.641,-459.9234 610.6493,-466.6291"/>
</g>
<!-- blitter.com/go/goutmp.Put_lastlog_entry -->
<g id="node16" class="node">
<title>blitter.com/go/goutmp.Put_lastlog_entry</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-516" rx="72.105" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-512.3" font-family="Verdana" font-size="14.00" fill="#000000">Put_lastlog_entry</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/goutmp.Put_lastlog_entry -->
<g id="edge46" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/goutmp.Put_lastlog_entry</title>
<path fill="none" stroke="#8b4513" d="M210.5458,-1043.1217C289.0676,-1056.9051 484.3307,-1086.0218 530.2096,-1044 611.9684,-969.1148 506.3683,-634.922 573.911,-547 578.8406,-540.583 585.2246,-535.493 592.2816,-531.4559"/>
<polygon fill="#8b4513" stroke="#8b4513" points="594.1105,-534.4561 601.5215,-526.8846 591.0064,-528.1819 594.1105,-534.4561"/>
</g>
<!-- blitter.com/go/hkexsh.AuthUserByToken -->
<g id="node17" class="node">
<title>blitter.com/go/hkexsh.AuthUserByToken</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-915" rx="73.9057" ry="18"/>
<text text-anchor="middle" x="389.256" y="-911.3" font-family="Verdana" font-size="14.00" fill="#000000">AuthUserByToken</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh.AuthUserByToken -->
<g id="edge21" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh.AuthUserByToken</title>
<path fill="none" stroke="#8b4513" d="M192.8575,-1020.5047C212.4099,-1000.22 248.2784,-966.0245 285.3024,-946 297.3659,-939.4754 310.9783,-934.1543 324.282,-929.88"/>
<polygon fill="#8b4513" stroke="#8b4513" points="325.3441,-933.2153 333.8881,-926.9503 323.3021,-926.5198 325.3441,-933.2153"/>
</g>
<!-- blitter.com/go/hkexsh.AuthUserByPasswd -->
<g id="node18" class="node">
<title>blitter.com/go/hkexsh.AuthUserByPasswd</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-976" rx="79.5063" ry="18"/>
<text text-anchor="middle" x="389.256" y="-972.3" font-family="Verdana" font-size="14.00" fill="#000000">AuthUserByPasswd</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh.AuthUserByPasswd -->
<g id="edge23" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh.AuthUserByPasswd</title>
<path fill="none" stroke="#8b4513" d="M205.1846,-1025.8243C226.7311,-1017.3729 257.5863,-1005.9118 285.3024,-998 295.7599,-995.0148 306.9138,-992.2378 317.8887,-989.7314"/>
<polygon fill="#8b4513" stroke="#8b4513" points="318.8902,-993.0943 327.8924,-987.5075 317.3711,-986.2611 318.8902,-993.0943"/>
</g>
<!-- (*blitter.com/go/hkexsh.Session).SetOp -->
<g id="node19" class="node">
<title>(*blitter.com/go/hkexsh.Session).SetOp</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-98" rx="28.7023" ry="18"/>
<text text-anchor="middle" x="389.256" y="-94.3" font-family="Verdana" font-size="14.00" fill="#000000">SetOp</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetOp -->
<g id="edge10" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetOp</title>
<path fill="none" stroke="#8b4513" d="M178.58,-1018.8019C184.9733,-896.6257 224.0368,-198.5237 285.3024,-129 301.5333,-110.5814 328.1883,-102.8824 350.443,-99.7619"/>
<polygon fill="#8b4513" stroke="#8b4513" points="351.0881,-103.2111 360.6266,-98.5995 350.2941,-96.2563 351.0881,-103.2111"/>
</g>
<!-- (*blitter.com/go/hkexsh.Session).SetWho -->
<g id="node20" class="node">
<title>(*blitter.com/go/hkexsh.Session).SetWho</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-159" rx="35.4036" ry="18"/>
<text text-anchor="middle" x="389.256" y="-155.3" font-family="Verdana" font-size="14.00" fill="#000000">SetWho</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetWho -->
<g id="edge11" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetWho</title>
<path fill="none" stroke="#8b4513" d="M178.8456,-1018.9704C184.1793,-940.6728 207.3699,-622.4709 248.3024,-364 260.6689,-285.9107 231.6856,-248.1043 285.3024,-190 300.339,-173.7049 323.532,-165.8412 344.1987,-162.1004"/>
<polygon fill="#8b4513" stroke="#8b4513" points="344.7438,-165.5578 354.0945,-160.5763 343.6782,-158.6394 344.7438,-165.5578"/>
</g>
<!-- (*blitter.com/go/hkexsh.Session).SetConnHost -->
<g id="node21" class="node">
<title>(*blitter.com/go/hkexsh.Session).SetConnHost</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-220" rx="55.6039" ry="18"/>
<text text-anchor="middle" x="389.256" y="-216.3" font-family="Verdana" font-size="14.00" fill="#000000">SetConnHost</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetConnHost -->
<g id="edge12" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetConnHost</title>
<path fill="none" stroke="#8b4513" d="M178.9075,-1018.7545C186.8145,-906.2411 231.1171,-309.5813 285.3024,-251 295.9499,-239.4887 310.6678,-232.186 325.6821,-227.5721"/>
<polygon fill="#8b4513" stroke="#8b4513" points="326.8075,-230.8937 335.5516,-224.9111 324.9852,-224.135 326.8075,-230.8937"/>
</g>
<!-- (*blitter.com/go/hkexsh.Session).SetTermType -->
<g id="node22" class="node">
<title>(*blitter.com/go/hkexsh.Session).SetTermType</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-281" rx="55.6039" ry="18"/>
<text text-anchor="middle" x="389.256" y="-277.3" font-family="Verdana" font-size="14.00" fill="#000000">SetTermType</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetTermType -->
<g id="edge13" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetTermType</title>
<path fill="none" stroke="#8b4513" d="M179.1336,-1018.8065C188.0197,-911.6775 235.5214,-365.9474 285.3024,-312 295.9363,-300.4761 310.6495,-293.169 325.6635,-288.5549"/>
<polygon fill="#8b4513" stroke="#8b4513" points="326.789,-291.8765 335.5334,-285.8943 324.9671,-285.1177 326.789,-291.8765"/>
</g>
<!-- (*blitter.com/go/hkexsh.Session).SetCmd -->
<g id="node23" class="node">
<title>(*blitter.com/go/hkexsh.Session).SetCmd</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-342" rx="35.5042" ry="18"/>
<text text-anchor="middle" x="389.256" y="-338.3" font-family="Verdana" font-size="14.00" fill="#000000">SetCmd</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetCmd -->
<g id="edge14" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetCmd</title>
<path fill="none" stroke="#8b4513" d="M179.4085,-1018.7073C189.3531,-916.8185 239.7454,-422.1337 285.3024,-373 300.1999,-356.9329 323.0272,-349.067 343.4997,-345.2664"/>
<polygon fill="#8b4513" stroke="#8b4513" points="344.2929,-348.6846 353.6249,-343.6683 343.2015,-341.7702 344.2929,-348.6846"/>
</g>
<!-- (*blitter.com/go/hkexsh.Session).SetAuthCookie -->
<g id="node24" class="node">
<title>(*blitter.com/go/hkexsh.Session).SetAuthCookie</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-403" rx="62.905" ry="18"/>
<text text-anchor="middle" x="389.256" y="-399.3" font-family="Verdana" font-size="14.00" fill="#000000">SetAuthCookie</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetAuthCookie -->
<g id="edge15" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).SetAuthCookie</title>
<path fill="none" stroke="#8b4513" d="M179.7094,-1018.841C190.7308,-922.9579 243.8168,-478.2857 285.3024,-434 294.8341,-423.8249 307.5464,-416.9423 320.8026,-412.2989"/>
<polygon fill="#8b4513" stroke="#8b4513" points="321.9924,-415.5946 330.5135,-409.2984 319.9259,-408.9065 321.9924,-415.5946"/>
</g>
<!-- (*blitter.com/go/hkexsh.Session).ClearAuthCookie -->
<g id="node25" class="node">
<title>(*blitter.com/go/hkexsh.Session).ClearAuthCookie</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-464" rx="70.305" ry="18"/>
<text text-anchor="middle" x="389.256" y="-460.3" font-family="Verdana" font-size="14.00" fill="#000000">ClearAuthCookie</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).ClearAuthCookie -->
<g id="edge22" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh.Session).ClearAuthCookie</title>
<path fill="none" stroke="#8b4513" d="M180.0446,-1018.8077C192.0848,-928.4809 246.9636,-530.9778 285.3024,-492 293.2601,-483.9097 303.2904,-478.0819 313.9626,-473.8986"/>
<polygon fill="#8b4513" stroke="#8b4513" points="315.1515,-477.191 323.4705,-470.6301 312.8758,-470.5712 315.1515,-477.191"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).Op -->
<g id="node26" class="node">
<title>(blitter.com/go/hkexsh.Session).Op</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-854" rx="27" ry="18"/>
<text text-anchor="middle" x="389.256" y="-850.3" font-family="Verdana" font-size="14.00" fill="#000000">Op</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).Op -->
<g id="edge16" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).Op</title>
<path fill="none" stroke="#8b4513" d="M184.2368,-1019.1561C197.6648,-985.4109 231.5599,-912.3734 285.3024,-876 304.7754,-862.8205 330.6283,-857.3113 351.6804,-855.1015"/>
<polygon fill="#8b4513" stroke="#8b4513" points="352.2142,-858.5691 361.8855,-854.243 351.6273,-851.5937 352.2142,-858.5691"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).Who -->
<g id="node27" class="node">
<title>(blitter.com/go/hkexsh.Session).Who</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-549" rx="27" ry="18"/>
<text text-anchor="middle" x="389.256" y="-545.3" font-family="Verdana" font-size="14.00" fill="#000000">Who</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).Who -->
<g id="edge17" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).Who</title>
<path fill="none" stroke="#8b4513" d="M179.3897,-1018.8497C187.1226,-941.9242 220.8841,-643.8239 285.3024,-580 302.9729,-562.4925 330.0818,-554.7987 352.1858,-551.4523"/>
<polygon fill="#8b4513" stroke="#8b4513" points="352.7771,-554.9053 362.2538,-550.1679 351.8912,-547.9616 352.7771,-554.9053"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).ConnHost -->
<g id="node28" class="node">
<title>(blitter.com/go/hkexsh.Session).ConnHost</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-610" rx="42.8032" ry="18"/>
<text text-anchor="middle" x="389.256" y="-606.3" font-family="Verdana" font-size="14.00" fill="#000000">ConnHost</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).ConnHost -->
<g id="edge18" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).ConnHost</title>
<path fill="none" stroke="#8b4513" d="M180.1244,-1018.9697C190.0858,-948.9128 229.4322,-695.9573 285.3024,-641 299.1869,-627.3424 318.8174,-619.6604 337.2859,-615.3548"/>
<polygon fill="#8b4513" stroke="#8b4513" points="337.9971,-618.7819 347.0909,-613.3455 336.5918,-611.9244 337.9971,-618.7819"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).Cmd -->
<g id="node29" class="node">
<title>(blitter.com/go/hkexsh.Session).Cmd</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-671" rx="27" ry="18"/>
<text text-anchor="middle" x="389.256" y="-667.3" font-family="Verdana" font-size="14.00" fill="#000000">Cmd</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).Cmd -->
<g id="edge19" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).Cmd</title>
<path fill="none" stroke="#8b4513" d="M181.0926,-1018.7534C193.3745,-955.5038 236.9079,-747.0663 285.3024,-702 303.3874,-685.1587 330.2445,-677.4376 352.1295,-673.9118"/>
<polygon fill="#8b4513" stroke="#8b4513" points="352.6726,-677.3701 362.0987,-672.5327 351.7134,-670.4361 352.6726,-677.3701"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).AuthCookie -->
<g id="node30" class="node">
<title>(blitter.com/go/hkexsh.Session).AuthCookie</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-732" rx="49.5034" ry="18"/>
<text text-anchor="middle" x="389.256" y="-728.3" font-family="Verdana" font-size="14.00" fill="#000000">AuthCookie</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).AuthCookie -->
<g id="edge20" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).AuthCookie</title>
<path fill="none" stroke="#8b4513" d="M179.37,-1018.949C184.9875,-970.2021 207.2105,-834.7537 285.3024,-763 297.9925,-751.3399 314.8927,-744.0547 331.3719,-739.5067"/>
<polygon fill="#8b4513" stroke="#8b4513" points="332.6581,-742.795 341.5366,-737.0139 330.9908,-735.9965 332.6581,-742.795"/>
</g>
<!-- (blitter.com/go/hkexsh.Session).TermType -->
<g id="node31" class="node">
<title>(blitter.com/go/hkexsh.Session).TermType</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-793" rx="42.8032" ry="18"/>
<text text-anchor="middle" x="389.256" y="-789.3" font-family="Verdana" font-size="14.00" fill="#000000">TermType</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).TermType -->
<g id="edge29" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh.Session).TermType</title>
<path fill="none" stroke="#8b4513" d="M181.6496,-1018.8204C191.6332,-977.7594 221.5671,-877.2842 285.3024,-824 300.0536,-811.6676 319.5724,-804.2413 337.71,-799.7693"/>
<polygon fill="#8b4513" stroke="#8b4513" points="338.5994,-803.1571 347.6053,-797.5764 337.0849,-796.323 338.5994,-803.1571"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).Close -->
<g id="node35" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).Close</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1086" rx="27" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1082.3" font-family="Verdana" font-size="14.00" fill="#000000">Close</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).Close -->
<g id="edge9" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).Close</title>
<path fill="none" stroke="#8b4513" d="M180.0567,-1055.0739C189.4965,-1122.9165 226.409,-1360.6739 285.3024,-1403 360.3373,-1456.9269 405.3587,-1431.6457 493.2096,-1403 512.564,-1396.6891 519.5037,-1393.3148 530.2096,-1376 591.6026,-1276.7089 499.1732,-1206.6776 573.911,-1117 582.2551,-1106.988 594.1111,-1100.2095 606.3406,-1095.6203"/>
<polygon fill="#8b4513" stroke="#8b4513" points="623.7258,-1094.6179 632.4902,-1088.6651 621.9265,-1087.8531 623.7258,-1094.6179"/>
<polyline fill="none" stroke="#8b4513" points="622.8262,-1091.2355 617.9942,-1092.5207 "/>
<polygon fill="none" stroke="#8b4513" points="606.3974,-1095.6052 611.1676,-1090.1974 617.9942,-1092.5207 613.2239,-1097.9286 606.3974,-1095.6052"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).RemoteAddr -->
<g id="node36" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).RemoteAddr</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1147" rx="53.8039" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1143.3" font-family="Verdana" font-size="14.00" fill="#000000">RemoteAddr</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).RemoteAddr -->
<g id="edge26" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).RemoteAddr</title>
<path fill="none" stroke="#8b4513" d="M179.4791,-1055.0196C187.1289,-1126.1167 219.2883,-1385.2246 285.3024,-1425 364.4491,-1472.6881 409.0002,-1463.041 493.2096,-1425 581.4918,-1385.1192 552.6158,-1202.466 573.911,-1178 581.2808,-1169.5329 591.1537,-1163.3777 601.5673,-1158.9033"/>
<polygon fill="#8b4513" stroke="#8b4513" points="603.1121,-1162.061 611.2264,-1155.2486 600.6349,-1155.514 603.1121,-1162.061"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus -->
<g id="node40" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1208" rx="42.2035" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1204.3" font-family="Verdana" font-size="14.00" fill="#000000">SetStatus</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus -->
<g id="edge42" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus</title>
<path fill="none" stroke="#8b4513" d="M179.1492,-1055.1318C185.7132,-1129.1834 214.8161,-1406.7081 285.3024,-1448 365.0321,-1494.7068 410.695,-1489.5895 493.2096,-1448 559.3462,-1414.6655 568.4824,-1244.8822 573.911,-1239 583.2832,-1228.8448 596.2439,-1222.0095 609.2369,-1217.4112"/>
<polygon fill="#8b4513" stroke="#8b4513" points="610.625,-1220.6441 619.1202,-1214.313 608.5311,-1213.9646 610.625,-1220.6441"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket -->
<g id="node41" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-842" rx="50.7037" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-838.3" font-family="Verdana" font-size="14.00" fill="#000000">WritePacket</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket -->
<g id="edge51" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).WritePacket</title>
<path fill="none" stroke="#8b4513" d="M182.0146,-1055.1854C189.857,-1083.3228 209.2857,-1136.5079 248.3024,-1159 302.5761,-1190.2873 482.6842,-1199.815 530.2096,-1159 627.7596,-1075.2236 492.3571,-972.4155 573.911,-873 581.4882,-863.7633 592.0585,-857.2787 603.1859,-852.7261"/>
<polygon fill="#8b4513" stroke="#8b4513" points="604.384,-856.0148 612.6106,-849.3384 602.0161,-849.4275 604.384,-856.0148"/>
</g>
<!-- (blitter.com/go/hkexsh/hkexnet.Conn).Write -->
<g id="node43" class="node">
<title>(blitter.com/go/hkexsh/hkexnet.Conn).Write</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-757" rx="27" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-753.3" font-family="Verdana" font-size="14.00" fill="#000000">Write</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).Write -->
<g id="edge24" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;(blitter.com/go/hkexsh/hkexnet.Conn).Write</title>
<path fill="none" stroke="#8b4513" d="M179.9184,-1055.013C186.5727,-1099.1039 210.5452,-1211.9102 285.3024,-1254 325.5616,-1276.6668 455.0699,-1280.0759 493.2096,-1254 580.5101,-1194.3132 506.9983,-866.8937 573.911,-785 585.7062,-770.564 605.096,-763.5046 622.4159,-760.0805"/>
<polygon fill="#8b4513" stroke="#8b4513" points="623.0013,-763.5313 632.3014,-758.4562 621.8662,-756.6239 623.0013,-763.5313"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/logger.LogNotice -->
<g id="edge25" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/logger.LogNotice</title>
<path fill="none" stroke="#8b4513" d="M178.0255,-1055.0853C179.8178,-1116.9405 190.0874,-1325.0097 248.3024,-1484 259.2048,-1513.7753 260.1225,-1525.7282 285.3024,-1545 300.0785,-1556.3091 318.9842,-1563.358 336.6113,-1567.7503"/>
<polygon fill="#8b4513" stroke="#8b4513" points="336.277,-1571.2625 346.8012,-1570.0416 337.8127,-1564.433 336.277,-1571.2625"/>
</g>
<!-- blitter.com/go/hkexsh/logger.LogErr -->
<g id="node47" class="node">
<title>blitter.com/go/hkexsh/logger.LogErr</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="389.256" cy="-1514" rx="30.6034" ry="18"/>
<text text-anchor="middle" x="389.256" y="-1510.3" font-family="Verdana" font-size="14.00" fill="#000000">LogErr</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/logger.LogErr -->
<g id="edge41" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2&#45;&gt;blitter.com/go/hkexsh/logger.LogErr</title>
<path fill="none" stroke="#8b4513" d="M178.2468,-1055.1674C181.0255,-1129.5353 194.9309,-1409.968 248.3024,-1477 271.7656,-1506.4686 315.6139,-1514.1751 348.1994,-1515.465"/>
<polygon fill="#8b4513" stroke="#8b4513" points="348.272,-1518.9672 358.3433,-1515.6778 348.4189,-1511.9688 348.272,-1518.9672"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs$1 -->
<g id="node6" class="node">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs$1</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="659.2621" cy="-1639" rx="56.2041" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1635.3" font-family="Verdana" font-size="14.00" fill="#000000">runShellAs$1</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs$1 -->
<g id="edge31" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs$1</title>
<path fill="none" stroke="#000000" d="M433.9095,-1709.0793C452.8265,-1705.8592 474.7221,-1700.5864 493.2096,-1692 511.5934,-1683.4618 510.7471,-1672.3665 529.2096,-1664 544.4621,-1657.0882 561.5624,-1652.0857 578.2246,-1648.4656"/>
<polygon fill="#000000" stroke="#000000" points="595.787,-1648.8635 605.0097,-1643.6489 594.5481,-1641.974 595.787,-1648.8635"/>
<polyline fill="none" stroke="#000000" points="595.1675,-1645.4188 590.2465,-1646.3037 "/>
<polygon fill="none" stroke="#000000" points="578.4359,-1648.4276 583.6332,-1643.4288 590.2465,-1646.3037 585.0492,-1651.3025 578.4359,-1648.4276"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs$2 -->
<g id="node7" class="node">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs$2</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="659.2621" cy="-1700" rx="56.2041" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1696.3" font-family="Verdana" font-size="14.00" fill="#000000">runShellAs$2</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs$2 -->
<g id="edge33" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs$2</title>
<path fill="none" stroke="#000000" d="M432.9593,-1708.1507C451.9134,-1704.755 474.0972,-1699.6017 493.2096,-1692 510.6332,-1685.07 511.1594,-1675.0787 529.2096,-1670 542.4534,-1666.2736 571.3943,-1672.4595 598.6198,-1680.1636"/>
<polygon fill="#000000" stroke="#000000" points="610.1191,-1687.2782 620.7035,-1686.8077 612.1359,-1680.575 610.1191,-1687.2782"/>
<polyline fill="none" stroke="#000000" points="611.1275,-1683.9266 606.3395,-1682.4861 "/>
<ellipse fill="none" stroke="#000000" cx="602.5091" cy="-1681.3337" rx="4" ry="4"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs$3 -->
<g id="node8" class="node">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs$3</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="659.2621" cy="-1761" rx="56.2041" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1757.3" font-family="Verdana" font-size="14.00" fill="#000000">runShellAs$3</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs$3 -->
<g id="edge34" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs$3</title>
<path fill="none" stroke="#000000" d="M429.6657,-1705.1871C464.5887,-1698.2908 512.1998,-1690.8192 530.2096,-1697 553.4859,-1704.9881 552.31,-1719.2107 573.911,-1731 580.5977,-1734.6494 587.8142,-1737.9928 595.1198,-1741.0151"/>
<polygon fill="#000000" stroke="#000000" points="606.2702,-1748.8976 616.863,-1749.104 608.7109,-1742.3369 606.2702,-1748.8976"/>
<polyline fill="none" stroke="#000000" points="607.4905,-1745.6173 602.8043,-1743.8739 "/>
<ellipse fill="none" stroke="#000000" cx="599.0553" cy="-1742.4792" rx="4" ry="4"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs$4 -->
<g id="node9" class="node">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs$4</title>
<ellipse fill="#add8e6" stroke="#000000" stroke-dasharray="1,5" cx="659.2621" cy="-1822" rx="56.2041" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1818.3" font-family="Verdana" font-size="14.00" fill="#000000">runShellAs$4</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs$4 -->
<g id="edge38" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;blitter.com/go/hkexsh/hkexshd.runShellAs$4</title>
<path fill="none" stroke="#000000" d="M432.6093,-1707.434C462.124,-1705.1652 500.9833,-1706.6707 530.2096,-1724 561.1112,-1742.3227 545.7252,-1769.7248 573.911,-1792 579.1675,-1796.1542 585.042,-1799.7569 591.1825,-1802.8766"/>
<polygon fill="#000000" stroke="#000000" points="601.9949,-1811.135 612.5735,-1811.7219 604.6698,-1804.6663 601.9949,-1811.135"/>
<polyline fill="none" stroke="#000000" points="603.3324,-1807.9006 598.7118,-1805.99 "/>
<ellipse fill="none" stroke="#000000" cx="595.0154" cy="-1804.4615" rx="4" ry="4"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff -->
<g id="node37" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-903" rx="52.0048" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-899.3" font-family="Verdana" font-size="14.00" fill="#000000">EnableChaff</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff -->
<g id="edge35" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff</title>
<path fill="none" stroke="#8b4513" d="M435.3925,-1715.7345C455.9895,-1713.9445 478.8115,-1707.9549 493.2096,-1692 549.954,-1629.1202 521.6982,-1000.6903 573.911,-934 581.0518,-924.8792 591.1247,-918.4403 601.8583,-913.8952"/>
<polygon fill="#8b4513" stroke="#8b4513" points="603.2365,-917.1174 611.4038,-910.3687 600.8106,-910.5511 603.2365,-917.1174"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff -->
<g id="node38" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-964" rx="54.4038" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-960.3" font-family="Verdana" font-size="14.00" fill="#000000">DisableChaff</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff -->
<g id="edge36" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff</title>
<path fill="none" stroke="#8b4513" d="M435.5043,-1715.0141C455.7468,-1713.0028 478.2443,-1707.0362 493.2096,-1692 550.5173,-1634.421 518.5519,-1593.3965 530.2096,-1513 546.7871,-1398.6756 503.6981,-1086.7334 573.911,-995 577.2168,-990.681 581.1817,-986.9631 585.568,-983.7627"/>
<polygon fill="#8b4513" stroke="#8b4513" points="602.5082,-979.2659 609.9111,-971.6865 599.3974,-972.9952 602.5082,-979.2659"/>
<polyline fill="none" stroke="#8b4513" points="600.9528,-976.1306 596.4737,-978.3526 "/>
<polygon fill="none" stroke="#8b4513" points="585.7238,-983.6855 589.3211,-977.4357 596.4737,-978.3526 592.8764,-984.6023 585.7238,-983.6855"/>
</g>
<!-- (*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff -->
<g id="node39" class="node">
<title>(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-1025" rx="64.2048" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-1021.3" font-family="Verdana" font-size="14.00" fill="#000000">ShutdownChaff</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff -->
<g id="edge37" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff</title>
<path fill="none" stroke="#8b4513" d="M435.4891,-1714.7038C455.6053,-1712.6084 478.0045,-1706.6611 493.2096,-1692 542.0181,-1644.9376 518.9294,-1610.8573 530.2096,-1544 548.3236,-1436.639 507.5125,-1142.2887 573.911,-1056 576.0742,-1053.1888 578.5165,-1050.6323 581.172,-1048.3075"/>
<polygon fill="#8b4513" stroke="#8b4513" points="597.7378,-1042.6982 604.6129,-1034.637 594.2113,-1036.6514 597.7378,-1042.6982"/>
<polyline fill="none" stroke="#8b4513" points="595.9745,-1039.6748 591.6554,-1042.1937 "/>
<polygon fill="none" stroke="#8b4513" points="581.2894,-1048.2391 584.4572,-1041.7611 591.6554,-1042.1937 588.4875,-1048.6717 581.2894,-1048.2391"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus -->
<g id="edge39" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).SetStatus</title>
<path fill="none" stroke="#8b4513" d="M435.6409,-1714.2471C455.546,-1712.0237 477.7331,-1706.1018 493.2096,-1692 568.7915,-1623.1322 509.9142,-1318.7483 573.911,-1239 582.7242,-1228.0176 595.7778,-1220.9251 609.0398,-1216.345"/>
<polygon fill="#8b4513" stroke="#8b4513" points="610.1151,-1219.6764 618.6758,-1213.4343 608.0909,-1212.9755 610.1151,-1219.6764"/>
</g>
<!-- github.com/kr/pty.Start -->
<g id="node48" class="node">
<title>github.com/kr/pty.Start</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="858.3158" cy="-1788" rx="27" ry="18"/>
<text text-anchor="middle" x="858.3158" y="-1784.3" font-family="Verdana" font-size="14.00" fill="#000000">Start</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;github.com/kr/pty.Start -->
<g id="edge30" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs&#45;&gt;github.com/kr/pty.Start</title>
<path fill="none" stroke="#8b4513" d="M404.4084,-1731.1387C433.5094,-1762.599 500.8446,-1828.573 573.911,-1853 645.8642,-1877.0548 671.2889,-1872.4794 744.6132,-1853 777.3999,-1844.2899 810.5898,-1823.655 832.5769,-1807.9531"/>
<polygon fill="#8b4513" stroke="#8b4513" points="834.7094,-1810.7297 840.7135,-1802.0003 830.5762,-1805.0802 834.7094,-1810.7297"/>
</g>
<!-- github.com/kr/pty.Setsize -->
<g id="node49" class="node">
<title>github.com/kr/pty.Setsize</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="858.3158" cy="-1727" rx="33.0023" ry="18"/>
<text text-anchor="middle" x="858.3158" y="-1723.3" font-family="Verdana" font-size="14.00" fill="#000000">Setsize</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runShellAs$2&#45;&gt;github.com/kr/pty.Setsize -->
<g id="edge32" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runShellAs$2&#45;&gt;github.com/kr/pty.Setsize</title>
<path fill="none" stroke="#8b4513" d="M711.0415,-1707.0234C743.7454,-1711.4595 785.4636,-1717.1182 816.1435,-1721.2797"/>
<polygon fill="#8b4513" stroke="#8b4513" points="815.7161,-1724.7537 826.0958,-1722.6296 816.657,-1717.8172 815.7161,-1724.7537"/>
</g>
<!-- blitter.com/go/goutmp.Unput_utmp -->
<g id="node15" class="node">
<title>blitter.com/go/goutmp.Unput_utmp</title>
<ellipse fill="#ffe4b5" stroke="#000000" stroke-width="1.5" cx="659.2621" cy="-577" rx="52.6044" ry="18"/>
<text text-anchor="middle" x="659.2621" y="-573.3" font-family="Verdana" font-size="14.00" fill="#000000">Unput_utmp</text>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.main$2$1&#45;&gt;blitter.com/go/goutmp.Unput_utmp -->
<g id="edge44" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.main$2$1&#45;&gt;blitter.com/go/goutmp.Unput_utmp</title>
<path fill="none" stroke="#8b4513" d="M434.0456,-1108.8347C465.8405,-1106.8307 506.871,-1098.4792 530.2096,-1071 597.1105,-992.2301 510.6901,-689.753 573.911,-608 580.9226,-598.9332 590.8355,-592.5159 601.4364,-587.9747"/>
<polygon fill="#8b4513" stroke="#8b4513" points="602.7321,-591.2269 610.8737,-584.4473 600.2812,-584.67 602.7321,-591.2269"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff -->
<g id="edge47" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff</title>
<path fill="none" stroke="#8b4513" d="M449.3017,-1296.2586C480.4126,-1285.0045 515.0081,-1265.8301 530.2096,-1234 588.2773,-1112.4139 488.8178,-1038.4709 573.911,-934 581.2265,-925.0187 591.3737,-918.6392 602.1246,-914.1079"/>
<polygon fill="#8b4513" stroke="#8b4513" points="603.5032,-917.3299 611.6718,-910.5827 601.0785,-910.7633 603.5032,-917.3299"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff -->
<g id="edge48" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff</title>
<path fill="none" stroke="#8b4513" d="M467.6093,-1299.0005C490.8973,-1291.688 514.3873,-1279.9237 530.2096,-1261 607.059,-1169.0874 497.4074,-1087.2005 573.911,-995 577.3841,-990.8143 581.4712,-987.1938 585.9437,-984.0622"/>
<polygon fill="#8b4513" stroke="#8b4513" points="603.0018,-979.649 610.4603,-972.1243 599.9373,-973.3554 603.0018,-979.649"/>
<polyline fill="none" stroke="#8b4513" points="601.4695,-976.5022 596.9741,-978.6911 "/>
<polygon fill="none" stroke="#8b4513" points="586.1852,-983.9446 589.8285,-977.7216 596.9741,-978.6911 593.3308,-984.9142 586.1852,-983.9446"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff -->
<g id="edge49" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runClientToServerCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff</title>
<path fill="none" stroke="#8b4513" d="M492.956,-1309.1428C506.8314,-1304.832 519.8285,-1298.1304 530.2096,-1288 605.3034,-1214.7193 505.9727,-1135.9595 573.911,-1056 576.3657,-1053.111 579.1123,-1050.4912 582.0743,-1048.1156"/>
<polygon fill="#8b4513" stroke="#8b4513" points="598.6781,-1042.9186 605.7294,-1035.0111 595.2859,-1036.7954 598.6781,-1042.9186"/>
<polyline fill="none" stroke="#8b4513" points="596.982,-1039.857 592.6083,-1042.28 "/>
<polygon fill="none" stroke="#8b4513" points="582.1114,-1048.0951 585.4215,-1041.6886 592.6083,-1042.28 589.2982,-1048.6865 582.1114,-1048.0951"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff -->
<g id="edge52" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).EnableChaff</title>
<path fill="none" stroke="#8b4513" d="M464.523,-1359.5784C475.0435,-1355.3197 485.0342,-1349.6208 493.2096,-1342 628.422,-1215.9609 457.4075,-1077.5102 573.911,-934 581.2118,-925.0068 591.3529,-918.6223 602.1023,-914.0898"/>
<polygon fill="#8b4513" stroke="#8b4513" points="603.4809,-917.3118 611.6493,-910.5644 601.056,-910.7452 603.4809,-917.3118"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff -->
<g id="edge53" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).DisableChaff</title>
<path fill="none" stroke="#8b4513" d="M489.187,-1366.8168C504.7028,-1361.802 519.2058,-1353.9744 530.2096,-1342 635.3864,-1227.5465 476.9171,-1116.4657 573.911,-995 577.3049,-990.7499 581.3341,-987.0823 585.7658,-983.9174"/>
<polygon fill="#8b4513" stroke="#8b4513" points="602.7684,-979.4636 610.2003,-971.9126 599.6816,-973.1809 602.7684,-979.4636"/>
<polyline fill="none" stroke="#8b4513" points="601.225,-976.3222 596.7374,-978.527 "/>
<polygon fill="none" stroke="#8b4513" points="585.967,-983.8186 589.5884,-977.5827 596.7374,-978.527 593.1161,-984.7629 585.967,-983.8186"/>
</g>
<!-- blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff -->
<g id="edge54" class="edge">
<title>blitter.com/go/hkexsh/hkexshd.runServerToClientCopyAs&#45;&gt;(*blitter.com/go/hkexsh/hkexnet.Conn).ShutdownChaff</title>
<path fill="none" stroke="#8b4513" d="M447.7449,-1386.882C475.9141,-1390.3933 508.2574,-1388.5144 530.2096,-1369 635.1879,-1275.6796 485.5288,-1165.1683 573.911,-1056 576.143,-1053.2431 578.642,-1050.7314 581.3437,-1048.443"/>
<polygon fill="#8b4513" stroke="#8b4513" points="598.0233,-1042.9193 604.9597,-1034.9107 594.543,-1036.8457 598.0233,-1042.9193"/>
<polyline fill="none" stroke="#8b4513" points="596.2831,-1039.8825 591.9449,-1042.3684 "/>
<polygon fill="none" stroke="#8b4513" points="581.5331,-1048.3345 584.7503,-1041.8808 591.9449,-1042.3684 588.7277,-1048.822 581.5331,-1048.3345"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 61 KiB

View File

@ -267,14 +267,15 @@ func runShellAs(who, ttype string, cmd string, interactive bool, conn *hkexnet.C
return err, hkexnet.CSEPtyExecFail
}
// Make sure to close the pty at the end.
// #gv:s/label=\"runShellAs\$1\"/label=\"deferPtmxClose\"/
defer func() { _ = ptmx.Close() }() // Best effort.
log.Printf("[%s]\n", cmd)
if err != nil {
log.Printf("Command finished with error: %v", err)
} else {
// Watch for term resizes
// #gv:s/label=\"runShellAs\$2\"/label=\"termResizeWatcher\"/
go func() {
for sz := range conn.WinCh {
log.Printf("[Setting term size to: %v %v]\n", sz.Rows, sz.Cols)
@ -284,6 +285,7 @@ func runShellAs(who, ttype string, cmd string, interactive bool, conn *hkexnet.C
}()
// Copy stdin to the pty.. (bgnd goroutine)
// #gv:s/label=\"runShellAs\$3\"/label=\"stdinToPtyWorker\"/
go func() {
_, e := io.Copy(ptmx, conn)
if e != nil {
@ -296,8 +298,12 @@ func runShellAs(who, ttype string, cmd string, interactive bool, conn *hkexnet.C
if chaffing {
conn.EnableChaff()
}
defer conn.DisableChaff()
defer conn.ShutdownChaff()
// #gv:s/label=\"runShellAs\$4\"/label=\"deferChaffShutdown\"/
defer func() {
conn.DisableChaff()
conn.ShutdownChaff()
}()
// ..and the pty to stdout.
// This may take some time exceeding that of the
@ -306,6 +312,7 @@ func runShellAs(who, ttype string, cmd string, interactive bool, conn *hkexnet.C
// to ensure all stdout data gets to the client before
// connection is closed.
wg.Add(1)
// #gv:s/label=\"runShellAs\$2\"/label=\"ptyToStdoutWorker\"/
go func() {
defer wg.Done()
_, e := io.Copy(conn, ptmx)