[cgi-wiki-dev] Re: Wiki::Toolkit suggestions (fwd)
Justin Kao
cgi-wiki-dev@earth.li
Thu, 14 Oct 2004 15:11:14 -0700 (PDT)
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
Send mail to mime@docserver.cac.washington.edu for more info.
---679229397-1034337170-1097494421=:2421
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
Content-ID: <Pine.LNX.4.53.0410110433471.2421@euro.ugcs.caltech.edu>
Hello all,
I've been playing with ideas for Wiki::Toolkit for a while, and
occasionally inflicting them on Kake. She suggested sending this
to the list, so see below... please be kind :)
Justin
---------- Forwarded message ----------
Date: Mon, 11 Oct 2004 04:58:23 -0700 (PDT)
From: Justin Kao <justin+earth@dicatek.com>
To: Kake L Pugh <kake@earth.li>
Subject: Re: Wiki::Toolkit suggestions
On Mon, 11 Oct 2004, Kake L Pugh wrote:
> On Thu 07 Oct 2004, justin+earth@dicatek.com wrote:
> > I waved my hands and made up some stuff at:
> > http://the.earth.li/~kake/cgi-bin/wiki-toolkit/wiki.cgi?node=API%20Summary
> >
> > I'm wondering whether you have any thoughts on it, in particular the stuff
> > above the line (i.e. ::Node and ::Store) -- I feel like what I've outlined
> > may be reasonable, and I've written a flat-file store for playing with.
>
> I don't understand it, sorry. Although this may be because I'm not
> well and am incapable of thinking straight. Could you explain it a bit more?
I can try. Let me know if it still doesn't make sense, in which case it's
likely my fault. :)
In my view, Node is slightly more than just a data structure. It knows
what Store object it came from ($node->source) so it can save itself and
check whether or not it is the latest version and so on. This seems like
an important thing for nodes to do if one is mingling data from two
different data stores, for instance. After obtaining a node, it can be
fiddled with without knowing where it came from, so one could pass the
$node around and that would be enough.
As a side benefit, loading a node's content can be delayed until it is
actually asked for, at which time the node can call
$self->source->read_content. Assuming that loading the metadata will be
relatively efficient and/or necessary for performing searches in the
first place, methods like list_nodes should return arrays of nodes.
I renamed retrieve_node and write_node to open_node and save_node to
reflect the live-ness of a node object. Also, since a node needs to know
it's source, new nodes come from from $store->new_node.
metahash, meta2text, and text2meta are provided as 'official' ways to
extract a node's metadata all at once. (E.g., my flat-file store uses
meta2text and text2meta.)
Code is attached... Sorry for the lack of Pod, but on the other hand, it
should be much easier to understand than Kwiki. :)
On a slightly different topic, I've been thinking about front-end
components, and how to make them pluggable and still differentiate between
the 'layout' of a web page and the 'logic' in a cgi script. (The CGI::Wiki
plugins need explicit work from the cgi script... Kwiki plugins happen
automatically but depend on a lot of stuff working in a particular way.)
An idea I had is to have a Wiki::Toolkit::Page object embodying the web
presentation of a node just like Wiki::Toolkit::Node embodies the database
record of a node. It would be the 'view' of model-view-controller. The web
page could be broken up into Wiki::Toolkit::PageItem subclasses (one for
the node itself, one for the navigation bar, etc.) I've started writing
this, but haven't finished yet...
Justin
---679229397-1034337170-1097494421=:2421
Content-Type: APPLICATION/X-PERL; NAME="Trivial.pm"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.53.0410110433410.2421@euro.ugcs.caltech.edu>
Content-Description:
Content-Disposition: ATTACHMENT; FILENAME="Trivial.pm"
cGFja2FnZSBXaWtpOjpUb29sa2l0OjpTdG9yZTo6VHJpdmlhbDsKdXNlIGJh
c2UgV2lraTo6VG9vbGtpdDo6U3RvcmU7Cm91ciAkVkVSU0lPTiA9ICcwLjAw
XzAxJzsKdXNlIHN0cmljdDsgdXNlIHdhcm5pbmdzOyB1c2UgQ2FycDsKCiMK
IyBXQVJOSU5HOiBUaGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcG1lbnQgdXNl
IG9ubHkuIEluIHBhcnRpY3VsYXIsIGl0IGRvZXMgTk9UCiMgYm90aGVyIHdp
dGggZmlsZSBsb2NraW5nLgojCgoKdXNlIElPOjpGaWxlOwp1c2UgRmlsZTo6
R2xvYiAnOmdsb2InOwoKc3ViIF9uYW1lMmZpbGVuYW1lIHsKICBteSAoJHNl
bGYsJG5hbWUsJHZlcnNpb24pID0gQF87CiAgJHZlcnNpb24gfHw9ICdsYXRl
c3QnOwogIGNyb2FrICInJG5hbWUnIHYuICR2ZXJzaW9uIGlzIGFuIGlsbGVn
YWwgbm9kZSBuYW1lIgogICAgdW5sZXNzICRzZWxmLT52YWxpZF9uYW1lKCRu
YW1lLCR2ZXJzaW9uKTsKICAoJG5hbWUpID0gJG5hbWUgPX4gL14oW15cL10r
KSQvOwogICgkdmVyc2lvbikgPSAkdmVyc2lvbiA9fiAvXihsYXRlc3R8XGQr
KSQvOwogIHJldHVybiB3YW50YXJyYXkgCiAgICA/ICgkc2VsZi0+X3N0b3Jl
X2RpciwkbmFtZSwkdmVyc2lvbikKICAgIDogam9pbiAnLycsICgkc2VsZi0+
X3N0b3JlX2RpcigpLCIkbmFtZS4kdmVyc2lvbiIpOwp9CgpzdWIgX3N0b3Jl
X2RpciB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSAkZGlyID0gJHNlbGYt
PnJlZ2lzdHJ5LT5nZXQoJHNlbGYtPm5hbWUsJ3N0b3JlX2RpcicpOwogICRk
aXIgPX4gc3woLikvJHwkMXw7CiAgcmV0dXJuICRkaXI7Cn0KCnN1YiBub2Rl
X2V4aXN0cyB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSAkZmlsZW5hbWUg
PSAkc2VsZi0+X25hbWUyZmlsZW5hbWUoQF8pOwogIHJldHVybiAoIC1lICIk
ZmlsZW5hbWUudHh0IiApICYmICggLWUgIiRmaWxlbmFtZS5tZXRhIiApOwp9
CgpzdWIgbGF0ZXN0X3ZlcnNpb24gewogIG15ICRzZWxmID0gc2hpZnQ7CiAg
bXkgJG5hbWUgPSBzaGlmdDsKICBteSAoJHYxLCAkdjIpOwoKICAjIGNsZWFu
dXAgJG5hbWUKICAkbmFtZSA9ICggJHNlbGYtPl9uYW1lMmZpbGVuYW1lKCRu
YW1lKSApWzFdOwoKICAjIEZJWE1FIG5vdCBxdWl0ZSByaWdodDoKICBteSBA
ZmlsZXMgPSBic2RfZ2xvYiggJHNlbGYtPl9zdG9yZV9kaXIgLiAiLyRuYW1l
LlswLTldKi50eHQiICk7IAogIEBmaWxlcyA9IHNvcnQgeyAkYSA9fiAvXC4o
WzAtOV0rKVwudHh0LzsgJHYxID0gJDE7CiAgICAgICAgICAgICAgICAgICRi
ID1+IC9cLihbMC05XSspXC50eHQvOyAkdjIgPSAkMTsKICAgICAgICAgICAg
ICAgICAgJHYxIDw9PiAkdjIKICAgICAgICAgICAgICAgIH0gQGZpbGVzOwoK
ICAkZmlsZXNbLTFdID1+IC9cLihbMC05XSspXC50eHQvOwogIHJldHVybiAk
MTsKfQoKc3ViIF9vcGVuX2ZpbGVzIHsKICBteSAkc2VsZiA9IHNoaWZ0Owog
IG15IEBsaXN0ID0gbWFwIHsgJF8gPX4gLyhbXlwvXSspXC4obGF0ZXN0fFsw
LTldKylcLnR4dCQvOwogICAgICAgICAgICAgICAgICAgJHNlbGYtPm9wZW5f
bm9kZSgkMSwkMik7IH0gQF87CiAgcmV0dXJuIHdhbnRhcnJheSA/IEBsaXN0
IDogXEBsaXN0Owp9CiAgCgpzdWIgZGVsZXRlX25vZGUgewogIG15ICRzZWxm
ID0gc2hpZnQ7CiAgbXkgJG5hbWUgPSBzaGlmdDsKICBteSAkZmlsZW5hbWUg
PSAkc2VsZi0+X25hbWUyZmlsZW5hbWUoICRuYW1lICk7IAogIHJldHVybiB1
bmxpbmsgIiRmaWxlbmFtZS50eHQiICYmIHVubGluayAiJGZpbGVuYW1lLm1l
dGEiOwp9CgpzdWIgcmVhZF9tZXRhZGF0YSB7CiAgbXkgJHNlbGYgPSBzaGlm
dDsKICBteSAoJG5hbWUsJHZlcnNpb24pID0gQF87CiAgJHZlcnNpb24gfHw9
ICdsYXRlc3QnOwogIG15ICRmaWxlbmFtZSA9ICRzZWxmLT5fbmFtZTJmaWxl
bmFtZSgkbmFtZSwkdmVyc2lvbik7CgogIGNyb2FrICJDb3VsZCBub3Qgb3Bl
biAnJG5hbWUnICh2LiAkdmVyc2lvbikgYmVjYXVzZSBpdCBkb2VzIG5vdCBl
eGlzdCIKICAgIHVubGVzcyAoJHNlbGYtPm5vZGVfZXhpc3RzKCRuYW1lLCR2
ZXJzaW9uKSk7CiAgbXkgJGZoID0gSU86OkZpbGUtPm5ldyggIiRmaWxlbmFt
ZS5tZXRhIiwgJzwnICk7CiAgY3JvYWsgIkNvdWxkIG5vdCBvcGVuICckbmFt
ZScgKHYuICR2ZXJzaW9uKSBtZXRhZGF0YSBmb3IgcmVhZGluZzogJCEiIHVu
bGVzcyAkZmg7CgogIHsKICAgIGxvY2FsICQvOyAjIHVuZGVmaW5lIElOUFVU
X1JFQ09SRF9TRVBBUkFUT1IgdG8gc2x1cnAgZmlsZQogICAgcmV0dXJuICRz
ZWxmLT5kZWZhdWx0X25vZGVfY2xhc3MoKS0+dGV4dDJtZXRhKDwkZmg+KQog
IH0gIyBub3RlIHRoYXQgdGV4dDJtZXRhIHJldHVybnMgZWl0aGVyIGEgaGFz
aHJlZiBvciBhIGhhc2gsIGRlcGVuZGluZyBvbiBjb250ZXh0Cn0KCnN1YiB3
cml0ZV9tZXRhZGF0YSB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSAkbm9k
ZSA9IHNoaWZ0OwogIG15ICRuYW1lID0gJG5vZGUtPm5hbWUoKTsKICBteSAk
dmVyc2lvbiA9ICRub2RlLT52ZXJzaW9uKCk7CgogIGNyb2FrICJJIGNhbid0
IHN0b3JlIGEgbm9kZSAnJG5hbWUnIiB1bmxlc3MgKCRzZWxmLT52YWxpZF9u
YW1lKCRuYW1lLCR2ZXJzaW9uKSk7CiAgbXkgJGZpbGVuYW1lID0gJHNlbGYt
Pl9uYW1lMmZpbGVuYW1lKCRuYW1lLCRub2RlLT52ZXJzaW9uKCkpOwogIG15
ICRmaCA9IElPOjpGaWxlLT5uZXcoICIkZmlsZW5hbWUubWV0YSIsICc+JyAp
OwogIGNyb2FrICJDb3VsZCBub3Qgb3BlbiAnJG5vZGUnICh2LiAkdmVyc2lv
bikgbWV0YWRhdGEgZm9yIHdyaXRpbmc6ICQhIiB1bmxlc3MgJGZoOwogIAog
IHByaW50ICRmaCAkbm9kZS0+bWV0YTJ0ZXh0KCk7CiAgdW5kZWYgJGZoOwoK
ICByZXR1cm4gJG5vZGU7Cn0KCnN1YiByZWFkX2NvbnRlbnQgewogIG15ICRz
ZWxmID0gc2hpZnQ7CiAgbXkgKCRuYW1lLCR2ZXJzaW9uKSA9IEBfOwogICR2
ZXJzaW9uIHx8PSAnbGF0ZXN0JzsKICBteSAkZmlsZW5hbWUgPSAkc2VsZi0+
X25hbWUyZmlsZW5hbWUoJG5hbWUsJHZlcnNpb24pOwoKICBjcm9hayAiQ291
bGQgbm90IG9wZW4gJyRuYW1lJyAodi4gJHZlcnNpb24pIGJlY2F1c2UgaXQg
ZG9lcyBub3QgZXhpc3QiCiAgICB1bmxlc3MgKCRzZWxmLT5ub2RlX2V4aXN0
cygkbmFtZSwkdmVyc2lvbikpOwogIG15ICRmaCA9IElPOjpGaWxlLT5uZXco
ICIkZmlsZW5hbWUudHh0IiwgJzwnICk7CiAgY3JvYWsgIkNvdWxkIG5vdCBv
cGVuICckbmFtZScgKHYuICR2ZXJzaW9uKSBjb250ZW50IGZvciByZWFkaW5n
OiAkISIgdW5sZXNzICRmaDsKCiAgewogICAgbG9jYWwgJC87ICMgdW5kZWZp
bmUgSU5QVVRfUkVDT1JEX1NFUEFSQVRPUiB0byBzbHVycCBmaWxlCiAgICBy
ZXR1cm4gPCRmaD4KICB9Cn0KCnN1YiB3cml0ZV9jb250ZW50IHsKICBteSAk
c2VsZiA9IHNoaWZ0OwogIG15ICRub2RlID0gc2hpZnQ7CiAgbXkgJG5hbWUg
PSAkbm9kZS0+bmFtZSgpOwogIG15ICR2ZXJzaW9uID0gJG5vZGUtPnZlcnNp
b24oKTsKCiAgY3JvYWsgIkkgY2FuJ3Qgc3RvcmUgYSBub2RlICckbmFtZSci
IHVubGVzcyAoJHNlbGYtPnZhbGlkX25hbWUoJG5hbWUsJHZlcnNpb24pKTsK
ICBteSAkZmlsZW5hbWUgPSAkc2VsZi0+X25hbWUyZmlsZW5hbWUoJG5hbWUs
JG5vZGUtPnZlcnNpb24oKSk7CiAgbXkgJGZoID0gSU86OkZpbGUtPm5ldygg
IiRmaWxlbmFtZS50eHQiLCAnPicgKTsKICBjcm9hayAiQ291bGQgbm90IG9w
ZW4gJyRub2RlJyAodi4gJHZlcnNpb24pIGNvbnRlbnQgZm9yIHdyaXRpbmc6
ICQhIiB1bmxlc3MgJGZoOwogIAogIHByaW50ICRmaCAkbm9kZS0+Y29udGVu
dCgpOwogIHVuZGVmICRmaDsKCiAgcmV0dXJuICRub2RlOwp9CgpzdWIgdmFs
aWRfbmFtZSB7CiAgbXkgKCRzZWxmLCRuYW1lLCR2ZXJzaW9uKSA9IEBfOwog
IHJldHVybiAoJHZlcnNpb24gPX4gL15cZCskLyB8fCAkdmVyc2lvbiBlcSAn
bGF0ZXN0JykgJiYgJG5hbWUgJiYgISgkbmFtZSA9fiAvXC8vKTsKfQoKc3Vi
IF9saXN0X2FsbF9ub2RlcyB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSBA
ZmlsZXMgPSBic2RfZ2xvYiggJHNlbGYtPl9zdG9yZV9kaXIgLiAiLyoubGF0
ZXN0LnR4dCIgKTsKICByZXR1cm4gJHNlbGYtPl9vcGVuX2ZpbGVzKCBAZmls
ZXMgKTsKfQoKc3ViIF9saXN0X2FsbF9ub2Rlc19hbGxfdmVyc2lvbiB7CiAg
bXkgJHNlbGYgPSBzaGlmdDsKICBteSBAZmlsZXMgPSBic2RfZ2xvYiggJHNl
bGYtPl9zdG9yZV9kaXIgLiAiLyouWzAtOV0qLnR4dCIgKTsKICByZXR1cm4g
JHNlbGYtPl9vcGVuX2ZpbGVzKCBAZmlsZXMgKTsKfQoKc3ViIF9zZXRfbGF0
ZXN0IHsKICBteSAoJHNlbGYsJG5hbWUsJHZlcnNpb24pID0gQF87CiAgbXkg
JGZpbGVuYW1lID0gJHNlbGYtPl9uYW1lMmZpbGVuYW1lKCRuYW1lLCdsYXRl
c3QnKTsKICAjIGNsZWFudXAKICAoJG5hbWUsJHZlcnNpb24pID0gKCAkc2Vs
Zi0+X25hbWUyZmlsZW5hbWUoJG5hbWUsJHZlcnNpb24pIClbMSwyXTsKICB1
bmxpbmsgKCIkZmlsZW5hbWUudHh0IiwgIiRmaWxlbmFtZS5tZXRhIik7CiAg
c3ltbGluayAiJG5hbWUuJHZlcnNpb24udHh0IiwgIiRmaWxlbmFtZS50eHQi
OwogIHN5bWxpbmsgIiRuYW1lLiR2ZXJzaW9uLm1ldGEiLCAiJGZpbGVuYW1l
Lm1ldGEiOwogIHJldHVybiAkdmVyc2lvbjsKfQo=
---679229397-1034337170-1097494421=:2421
Content-Type: APPLICATION/X-PERL; NAME="Store.pm"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.53.0410110433411.2421@euro.ugcs.caltech.edu>
Content-Description:
Content-Disposition: ATTACHMENT; FILENAME="Store.pm"
cGFja2FnZSBXaWtpOjpUb29sa2l0OjpTdG9yZTsKdXNlIGJhc2UgV2lraTo6
VG9vbGtpdDo6QmFzZTsKb3VyICRWRVJTSU9OID0gJzAuMDBfMDEnOwp1c2Ug
c3RyaWN0OyB1c2Ugd2FybmluZ3M7IHVzZSBDYXJwOwoKPWhlYWQxIE1FVEhP
RFMKCj1vdmVyIDQKCj1pdGVtIEI8c3RvcmUgbWFuaXB1bGF0aW9uPgoKICBu
ZXcKCj1pdGVtIEI8bm9kZSBtYW5pcHVsYXRpb24+CgogIGdldF9ub2RlLCBu
ZXdfbm9kZSwgb3Blbl9ub2RlLCBzYXZlX25vZGUsIGRlbGV0ZV9ub2RlKgoK
PWl0ZW0gQjxub2RlIHN0b3JhZ2U+CgogIHJlYWRfbWV0YWRhdGEqLCB3cml0
ZV9tZXRhZGF0YSosIHJlYWRfY29udGVudCosIHdyaXRlX2NvbnRlbnQqCgo9
aXRlbSBCPG5vZGUgaW5mb3JtYXRpb24vbGlzdGluZ3M+CgogIG5vZGVfZXhp
c3RzKiwgbGF0ZXN0X3ZlcnNpb24qLCBsaXN0X25vZGVzCgo9aXRlbSBCPG90
aGVyPgoKICBkZWZhdWx0X25vZGVfY2xhc3MsIHZhbGlkX25hbWUKCj1pdGVt
IEI8cHJpdmF0ZT4KCiAgX2ZpbHRlcl9saXN0LCBfbGlzdF9hbGxfbm9kZXMq
LCBfbGlzdF9hbGxfbm9kZXNfYWxsX3ZlcnNpb25zKiwgX3NldF9sYXRlc3Qq
Cgo9YmFjawoKPWN1dAoKdXNlIFNjYWxhcjo6VXRpbCBxdyggYmxlc3NlZCAp
OwoKc3ViIG5ld19ub2RlIHsKICBteSAkc2VsZiA9IHNoaWZ0OwogICMgRklY
TUU6IENoYW5nZSBXaWtpOjpUb29sa2l0OjpOb2RlIHRvICRkZWZhdWx0X25v
ZGVjbGFzcyBvciBzb21lc3VjaC4KICByZXR1cm4gJHNlbGYtPmRlZmF1bHRf
bm9kZV9jbGFzcygpLT5uZXcoIHNvdXJjZSA9PiAkc2VsZiwgQF8gKTsKfQoK
c3ViIG9wZW5fbm9kZSB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKCiAgbXkgJG5h
bWUgPSBzaGlmdDsKICBteSAkdmVyc2lvbjsKICBpZiAoYmxlc3NlZCAkbmFt
ZSAmJiAkbmFtZS0+aXNhKCdXaWtpOjpUb29sa2l0OjpOb2RlJykpIHsKICAg
ICR2ZXJzaW9uID0gJG5hbWUtPm1ldGFkYXRhKCd2ZXJzaW9uJyk7CiAgICAk
bmFtZSA9ICRuYW1lLT5tZXRhZGF0YSgnbmFtZScpOwogIH0gZWxzZSB7CiAg
ICAkdmVyc2lvbiA9IHNoaWZ0OwogIH0KCiAgcmV0dXJuIHVuZGVmIHVubGVz
cyAkc2VsZi0+bm9kZV9leGlzdHMoJG5hbWUsJHZlcnNpb24pOwoKICBteSAk
bWV0YSA9ICRzZWxmLT5yZWFkX21ldGFkYXRhKCRuYW1lLCR2ZXJzaW9uKTsK
ICByZXR1cm4gJHNlbGYtPmRlZmF1bHRfbm9kZV9jbGFzcygpLT5uZXcoIG1l
dGFkYXRhID0+ICRtZXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHNvdXJjZSA9PiAkc2VsZiApOwp9CiAgCnN1YiBn
ZXRfbm9kZSB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBteSAkbm9kZSA9IHNo
aWZ0OwogIG15ICR2ZXJzaW9uID0gc2hpZnQ7CiAgcmV0dXJuICRzZWxmLT5u
b2RlX2V4aXN0cygkbm9kZSwkdmVyc2lvbikKICAgID8gJHNlbGYtPm9wZW5f
bm9kZSgkbm9kZSwkdmVyc2lvbikKICAgIDogJHNlbGYtPm5ld19ub2RlKCRu
b2RlLEBfKTsKfQogIApzdWIgc2F2ZV9ub2RlIHsKICBteSAkc2VsZiA9IHNo
aWZ0OwogIG15ICRub2RlID0gc2hpZnQ7CgogICRzZWxmLT53cml0ZV9tZXRh
ZGF0YSgkbm9kZSk7CiAgJHNlbGYtPndyaXRlX2NvbnRlbnQoJG5vZGUpOwog
ICRzZWxmLT5fc2V0X2xhdGVzdCgkbm9kZS0+bmFtZSwkbm9kZS0+dmVyc2lv
bikgaWYgJG5vZGUtPmlzX2xhdGVzdCgpOwogIHJldHVybiAkbm9kZTsKfQoK
CnN1YiBsaXN0X25vZGVzIHsKICBteSAoJHNlbGYsICVhcmdzKSA9IEBfOwog
IG15IEBsaXN0ID0gJHNlbGYtPl9saXN0X2FsbF9ub2RlcygpOwogIEBsaXN0
ID0gJHNlbGYtPl9maWx0ZXJfbGlzdCggXEBsaXN0LCAkYXJnc3ttZXRhZGF0
YX0gfHwgJGFyZ3N7ZmlsdGVyc30gKQogICAgaWYgKCRhcmdze21ldGFkYXRh
fSB8fCAkYXJnc3tmaWx0ZXJzfSk7CiAgIyBGSVhNRTogaW1wbGVtZW50IHNv
cnRpbmcKICByZXR1cm4gd2FudGFycmF5ID8gQGxpc3QgOiBcQGxpc3Q7Cn0K
ICAKc3ViIGRlZmF1bHRfbm9kZV9jbGFzcyB7CiAgbXkgJHNlbGYgPSBzaGlm
dDsKICBteSAkbm9kZV9jbGFzcyA9ICRzZWxmLT5yZWdpc3RyeS0+Z2V0KCRz
ZWxmLT5uYW1lLCdkZWZhdWx0X25vZGVfY2xhc3MnKSAKICAgIHx8ICdXaWtp
OjpUb29sa2l0OjpOb2RlJzsKICBldmFsICJyZXF1aXJlICRub2RlX2NsYXNz
IjsKICBjcm9hayAiQ291bGQgbm90IGxvYWQgJG5vZGVfY2xhc3MiIGlmICgk
QCk7CiAgcmV0dXJuICRub2RlX2NsYXNzOwp9CgpzdWIgdmFsaWRfbmFtZSB7
CiAgbXkgKCRzZWxmLCRuYW1lLCR2ZXJzaW9uKSA9IEBfOwogIHJldHVybiAo
JHZlcnNpb24gPX4gL15cZCskLyB8fCAkdmVyc2lvbiBlcSAnbGF0ZXN0Jykg
JiYgJG5hbWU7Cn0KCnN1YiBfZmlsdGVyX2xpc3QgewogIG15ICgkc2VsZiwg
JGxpc3QsICRmaWx0ZXJzKSA9IEBfOwogIG15ICgka2V5LCAkc2VhcmNoLCBA
dG1wKTsKICBteSBAbGlzdCA9IEAkbGlzdDsKICBteSBAZmlsdGVycyA9IEAk
ZmlsdGVyczsKCiAgd2hpbGUgKEBmaWx0ZXJzKSB7CiAgICAka2V5ID0gc2hp
ZnQgQGZpbHRlcnM7CiAgICAkc2VhcmNoID0gc2hpZnQgQGZpbHRlcnM7CiAg
ICBAbGlzdCA9IGdyZXAgeyAkXy0+Z3JlcF9tZXRhZGF0YSgka2V5LCRzZWFy
Y2gpIH0gQGxpc3Q7CiAgfQogIHJldHVybiB3YW50YXJyYXkgPyBAbGlzdCA6
IFxAbGlzdDsKfQo=
---679229397-1034337170-1097494421=:2421
Content-Type: APPLICATION/X-PERL; NAME="Node.pm"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.53.0410110433412.2421@euro.ugcs.caltech.edu>
Content-Description:
Content-Disposition: ATTACHMENT; FILENAME="Node.pm"
cGFja2FnZSBXaWtpOjpUb29sa2l0OjpOb2RlOwp1c2UgYmFzZSBXaWtpOjpU
b29sa2l0OjpCYXNlOwpvdXIgJFZFUlNJT04gPSAnMC4wMF8wMSc7CnVzZSBz
dHJpY3Q7IHVzZSB3YXJuaW5nczsgdXNlIENhcnA7Cgo9aGVhZDEgTUVUSE9E
UwoKPW92ZXIgNAoKPWl0ZW0gQjxub2RlIG1hbmlwdWxhdGlvbj4KCiAgbmV3
LCBpc19sYXRlc3QsIGlzX2V4YWN0bHlfbGF0ZXN0Cgo9aXRlbSBCPG5vZGUg
c3RvcmFnZT4KCiAgc291cmNlLCBleGlzdHMsIHNhdmUKCj1pdGVtIEI8bm9k
ZSBkYXRhPgoKICBjb250ZW50LCBtZXRhaGFzaCwgbWV0YWRhdGEsIG1ldGEy
dGV4dCwgdGV4dDJtZXRhLCBncmVwX21ldGFkYXRhCgo9aXRlbSBCPG1ldGFk
YXRhIGFjY2Vzc29ycz4KCiAgbmFtZSwgaWRlbnQsIHRpdGxlICsgYXMgc3Bl
Y2lmaWVkIGluIG5ldwoKPWJhY2sKCj1jdXQKCgpteSAkTUVUQV9TUExJVCA9
IHFyL1xzKixccysvOwpteSAkTUVUQV9KT0lOICA9ICcsICc7CgpzdWIgbmV3
IHsKICBteSAkY2xhc3MgPSBzaGlmdDsKICByZXR1cm4gJGNsYXNzLT5TVVBF
Ujo6bmV3KCBzb3VyY2UgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29udGVudCA9PiB1bmRlZiwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtZXRhZGF0YSA9PiB1bmRlZiwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtZXRhZGF0YV9hY2Nlc3NvcnMgPT4gW3F3KCB2ZXJz
aW9uICldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBfICk7CiAg
Cn0KCnN1YiBuYW1lIHsKICBteSAkc2VsZiA9IHNoaWZ0OwogIHJldHVybiAk
c2VsZi0+bWV0YWRhdGEoJ25hbWUnLEBfKTsKfQoKc3ViIGlkZW50IHsKICBt
eSAkc2VsZiA9IHNoaWZ0OwogIHJldHVybiAoJHNlbGYtPm5hbWUsJHNlbGYt
PnZlcnNpb24pOwp9CgpzdWIgdGl0bGUgewogIG15ICRzZWxmID0gc2hpZnQ7
CiAgcmV0dXJuICRzZWxmLT5tZXRhZGF0YSgndGl0bGUnKSAKICAgID8gJHNl
bGYtPm1ldGFkYXRhKCd0aXRsZScsQF8pCiAgICA6ICRzZWxmLT5tZXRhZGF0
YSgnbmFtZScsQF8pOwp9CiAgICAKc3ViIGlzX2xhdGVzdCB7CiAgbXkgJHNl
bGYgPSBzaGlmdDsKICByZXR1cm4gMCB1bmxlc3MgJHNlbGYtPnNvdXJjZTsK
ICByZXR1cm4gKCRzZWxmLT5zb3VyY2UtPmxhdGVzdF92ZXJzaW9uKCRzZWxm
LT5uYW1lKSA8PSAkc2VsZi0+dmVyc2lvbik7Cn0KCnN1YiBpc19leGFjdGx5
X2xhdGVzdCB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICByZXR1cm4gMCB1bmxl
c3MgJHNlbGYtPnNvdXJjZTsKICByZXR1cm4gKCRzZWxmLT5zb3VyY2UtPmxh
dGVzdF92ZXJzaW9uKCRzZWxmLT5uYW1lKSA9PSAkc2VsZi0+dmVyc2lvbik7
Cn0KCnN1YiBzb3VyY2UgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgJHNlbGYt
Pntzb3VyY2V9ID0gc2hpZnQgaWYgQF87CiAgcmV0dXJuICRzZWxmLT57c291
cmNlfTsKfQoKc3ViIGV4aXN0cyB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBy
ZXR1cm4gMCB1bmxlc3MgJHNlbGYtPnNvdXJjZTsKICByZXR1cm4gJHNlbGYt
PnNvdXJjZS0+bm9kZV9leGlzdHMoJHNlbGYtPmlkZW50KTsKfQoKc3ViIHNh
dmUgewogIG15ICRzZWxmID0gc2hpZnQ7CiAgcmV0dXJuIHVuZGVmIHVubGVz
cyAkc2VsZi0+c291cmNlOwogIHJldHVybiAkc2VsZi0+c291cmNlLT5zYXZl
X25vZGUoJHNlbGYpOwp9CgpzdWIgY29udGVudCB7CiAgbXkgJHNlbGYgPSBz
aGlmdDsKICAkc2VsZi0+e2NvbnRlbnR9ID0gc2hpZnQgaWYgQF87CiAgJHNl
bGYtPntjb250ZW50fSA9ICRzZWxmLT5zb3VyY2UtPnJlYWRfY29udGVudCgk
c2VsZi0+aWRlbnQpIAogICAgaWYgKCFkZWZpbmVkICRzZWxmLT57Y29udGVu
dH0gJiYgJHNlbGYtPmV4aXN0cyk7CiAgcmV0dXJuICRzZWxmLT57Y29udGVu
dH07Cn0KCnN1YiBtZXRhaGFzaCB7CiAgbXkgJHNlbGYgPSBzaGlmdDsKICBy
ZXR1cm4gd2FudGFycmF5ID8gJXskc2VsZi0+e21ldGFkYXRhfX0gOiBcJXsk
c2VsZi0+e21ldGFkYXRhfX07CiAgIyBGSVhNRTogSSB3YW50IHRvIHJldHVy
biBhIHJlZiB0byBhIC9jb3B5LyBvZiBtZXRhLCBkaWQgSSBkbyBpdCBjb3Jy
ZWN0bHk/Cn0KCnN1YiBtZXRhZGF0YSB7CiAgbXkgJHNlbGYgPSBzaGlmdDsK
CiAgIyBoYW5kbGUgd2hvbGUgaGFzaGVzCiAgcmV0dXJuICRzZWxmLT5tZXRh
aGFzaCB1bmxlc3MgQF87CiAgaWYgKEBfID09IDEgJiYgcmVmICRfWzBdIGVx
ICdIQVNIJykgewogICAgJXskc2VsZi0+e21ldGFkYXRhfX0gPSAleyRfWzBd
fTsKICAgIHJldHVybiAkc2VsZi0+bWV0YWhhc2g7CiAgfQoKICAjIG90aGVy
d2lzZSBoYW5kbGUgaW5kaXZpZHVhbCBlbGVtZW50cwogIG15ICRrZXkgPSBz
aGlmdDsKICAkc2VsZi0+e21ldGFkYXRhfXska2V5fSA9IGpvaW4gJE1FVEFf
Sk9JTiwgQF8gaWYgQF87CiAgcmV0dXJuIHdhbnRhcnJheSAKICAgID8gc3Bs
aXQgLyRNRVRBX1NQTElULywgJHNlbGYtPnttZXRhZGF0YX17JGtleX0KICAg
IDogJHNlbGYtPnttZXRhZGF0YX17JGtleX07Cn0KCnN1YiBncmVwX21ldGFk
YXRhIHsKICBteSAoJHNlbGYsJGtleSwkc2VhcmNoKSA9IEBfOwogIG15IEB2
YWwgPSAkc2VsZi0+bWV0YWRhdGEoJGtleSk7CiAgaWYgKCFyZWYgJHNlYXJj
aCkgewogICAgcmV0dXJuIGdyZXAgL14kc2VhcmNoJC8sIEB2YWw7CiAgfSBl
bHNpZiAocmVmICRzZWFyY2ggZXEgJ0NPREUnKSB7CiAgICByZXR1cm4gJiRz
ZWFyY2goIEB2YWwgKTsKICB9IGVsc2UgewogICAgcmV0dXJuIHVuZGVmOwog
IH0KfQoKICAgICAgICAKIyB0aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMg
YXJlIGxpZnRlZCBhbmQgbW9kaWZpZWQgZnJvbSBUZXh0OjpIZWFkZXIgdjEu
MDMKCnN1YiBtZXRhMnRleHQgewogIG15ICRpbnZvY2FudCA9IHNoaWZ0Owog
IG15IChAdGV4dCwgJW1ldGEpOwoKICBpZiAoQF8pIHsgCiAgICAlbWV0YSA9
IEBfOwogIH0gZWxzaWYgKCByZWYgJGludm9jYW50ICkgewogICAgJW1ldGEg
PSAkaW52b2NhbnQtPm1ldGFoYXNoKCk7CiAgfQogIAogIGZvcmVhY2ggbXkg
JGtleSAoa2V5cyAlbWV0YSkgewogICAgJGtleSA9IHVjZmlyc3QgbGMgJGtl
eTsKICAgICRrZXkgPX4gcy9bLV9dKFx3KS8tXHUkMS9nOwogICAgbXkgJHZh
bCA9ICRtZXRheyRrZXl9OwogICAgJHZhbCA9IGpvaW4gJE1FVEFfSk9JTiwg
QCR2YWwgaWYgcmVmICR2YWwgZXEgJ0FSUkFZJzsKICAgIHB1c2ggQHRleHQs
ICIka2V5OiAkdmFsXG4iOwogIH0KICByZXR1cm4gam9pbiAiIiwgQHRleHQ7
Cn0KICAgICAgCnN1YiB0ZXh0Mm1ldGEgewogIG15ICRpbnZvY2FudCA9IHNo
aWZ0OwogIG15IEBsaW5lcyA9IHNwbGl0IC9cbi8sIHNoaWZ0OwogIGNob21w
IEBsaW5lczsKICBteSAoJW1ldGEsICRpKTsKCiAgJGkgPSAwOwogIHdoaWxl
IChteSAkbGluZSA9ICRsaW5lc1skaV0pIHsKCiAgICAjIGpvaW4gbXVsdGlw
bGUgaW5kZW50ZWQgbGluZXMgcGVyIFJGQyA4MjIKICAgICRsaW5lIC49ICRs
aW5lc1skaV0gd2hpbGUgKGRlZmluZWQgJGxpbmVzWysrJGldICYmICRsaW5l
c1skaV0gPX4gL15ccysvKTsKCiAgICAjIHNwbGl0IHRoZSB0d28gYW5kIGNo
YW5nZSB0aGUgdGFnIHRvIGxvd2VyY2FzZQogICAgbXkgKCR0YWcsICR2YWwp
ID0gJGxpbmUgPX4gbS8oWy1cd10rKVxzKjpccyooLiopL3M7CiAgICAkdGFn
ID0gbGMgJHRhZzsKICAgICR0YWcgPX4gcy8tL18vZzsKCiAgICAjIHNvbWUg
Y2xlYW51cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAkdmFsID1+IHMvXG5c
cyovIC9nOwogICAgJHZhbCA9fiBzLyRNRVRBX1NQTElULyRNRVRBX0pPSU4v
ZzsKCiAgICAjIGVpdGhlciBzdHVmZiBpdCBpbnRvIGEgaGFzaCBvciwgaWYg
YWxyZWFkeSBleGlzdHMsIGFwcGVuZCB3aXRoIGNvbW1hIHNlcGFyYXRvcgog
ICAgJG1ldGF7JHRhZ30gPSAoZGVmaW5lZCAkbWV0YXskdGFnfSkKICAgICAg
PyAkbWV0YXskdGFnfSAuICRNRVRBX0pPSU4gLiAkdmFsCiAgICAgIDogJHZh
bDsKCiAgfQoKICBpZiAoIHJlZiAkaW52b2NhbnQgKSB7CiAgICAkaW52b2Nh
bnQtPm1ldGFkYXRhKFwlbWV0YSk7CiAgICByZXR1cm4gJGludm9jYW50Owog
IH0gZWxzZSB7CiAgICByZXR1cm4gd2FudGFycmF5ID8gJW1ldGEgOiBcJW1l
dGE7CiAgfQp9CgoKc3ViIEFVVE9MT0FEIHsKICBteSAkc2VsZiA9IHNoaWZ0
OwogIG15ICRjbGFzcyA9IHJlZiAkc2VsZjsKICBteSAkbWV0aG9kID0gb3Vy
ICRBVVRPTE9BRDsKICByZXR1cm4gaWYgJG1ldGhvZCA9fiAvOjpERVNUUk9Z
JC87CgogIGNyb2FrICJDYW4ndCBBVVRPTE9BRCAkbWV0aG9kIGZvciB5b3Ug
YXMgY2xhc3MgKHRyeSB1c2luZyBhbiBpbnN0YW5jZSkiCiAgICB1bmxlc3Mg
JGNsYXNzOwoKICAkbWV0aG9kID1+IHMvJGNsYXNzXDpcOi8vOwogIGNyb2Fr
ICIkbWV0aG9kIGlzIG5vdCBhIHZhbGlkIG1ldGhvZCIKICAgIHVubGVzcyBn
cmVwIC9eJG1ldGhvZCQvLCBAeyRzZWxmLT57bWV0YWRhdGFfYWNjZXNzb3Jz
fX07CgogIHJldHVybiAkc2VsZi0+bWV0YWRhdGEoJG1ldGhvZCxAXyk7Cn0K
---679229397-1034337170-1097494421=:2421--