pwmc: set the error source from dot commands.
[libpwmd.git] / doc / tutorial.html
blob15cc2983f3ba5f7cdabc72c1c86d9ee0813d3e6e
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
2 <HTML
3 ><HEAD
4 ><TITLE
5 >Libpwmd Tutorial</TITLE
6 ><META
7 NAME="GENERATOR"
8 CONTENT="Modular DocBook HTML Stylesheet Version 1.79"></HEAD
9 ><BODY
10 CLASS="ARTICLE"
11 ><DIV
12 CLASS="ARTICLE"
13 ><DIV
14 CLASS="TITLEPAGE"
15 ><H1
16 CLASS="TITLE"
17 ><A
18 NAME="AEN2"
19 >Libpwmd Tutorial</A
20 ></H1
21 ><H3
22 CLASS="AUTHOR"
23 ><A
24 NAME="AEN5"
25 ></A
26 ></H3
27 ><HR></DIV
28 ><DIV
29 CLASS="SECT1"
30 ><H2
31 CLASS="SECT1"
32 ><A
33 NAME="AEN9"
34 >Introduction</A
35 ></H2
36 ><P
37 >This is a tutorial showing the basic usage of libpwmd<A
38 NAME="AEN12"
39 HREF="#FTN.AEN12"
40 ><SPAN
41 CLASS="footnote"
42 >[2]</SPAN
43 ></A
44 >. Libpwmd<SPAN
45 CLASS="emphasis"
46 ><I
47 CLASS="EMPHASIS"
48 > </I
49 ></SPAN
50 >is a library making it easy to access pwmd<A
51 NAME="AEN15"
52 HREF="#FTN.AEN15"
53 ><SPAN
54 CLASS="footnote"
55 >[3]</SPAN
56 ></A
57 > or <SPAN
58 CLASS="emphasis"
59 ><I
60 CLASS="EMPHASIS"
61 >Password Manager Daemon</I
62 ></SPAN
63 >.</P
64 ></DIV
65 ><DIV
66 CLASS="SECT1"
67 ><HR><H2
68 CLASS="SECT1"
69 ><A
70 NAME="AEN18"
71 >What is PWMD?</A
72 ></H2
73 ><P
74 ><SPAN
75 CLASS="emphasis"
76 ><I
77 CLASS="EMPHASIS"
78 >Password Manager Daemon</I
79 ></SPAN
80 > is a universal data server. It began as a way to keep track of my passwords for accounts like email and websites but can be used to store anything you want.</P
81 ><P
82 >There are other password management tools but pwmd has a couple of distinguishing features:</P
83 ><P
84 ></P
85 ><UL
86 ><LI
87 ><P
88 >It does not depend on a desktop environment but has the ability for applications to connect to it like a desktop solution provides.</P
89 ></LI
90 ><LI
91 ><P
92 >Some portion of a stored data can be shared with another portion in the same data file. This feature behaves a lot like a symbolic link on a file system, XML entities, or HTML targets if you're familiar with those, but implemented in a different way.</P
93 ></LI
94 ></UL
95 ></DIV
96 ><DIV
97 CLASS="SECT1"
98 ><HR><H2
99 CLASS="SECT1"
101 NAME="AEN28"
102 >Element paths</A
103 ></H2
105 >The document is saved as an XML file and is manipulated by commands sent from a client. Commands that access data take what is called an <SPAN
106 CLASS="emphasis"
108 CLASS="EMPHASIS"
109 >element path</I
110 ></SPAN
111 > as an argument. An element path is a character string containing XML element names representing branches of an element tree. The branches are separated with a TAB (ASCII 0x09) character. Why a TAB? So other characters can be used in the element name. If for example a '/' were used as the separator, then a URL (i.e., http://sf.net/) could not be used as an element name.</P
113 >For the rest of this tutorial, when you see &lt;TAB&gt;, replace it with a real TAB character. For example, the element path "a&lt;TAB&gt;child&lt;TAB&gt;last" has the following element tree:</P
114 ><TABLE
115 BORDER="0"
116 BGCOLOR="#E0E0E0"
117 WIDTH="100%"
118 ><TR
119 ><TD
120 ><PRE
121 CLASS="SCREEN"
122 >&#60;a&#62;
123 &#60;child&#62;
124 &#60;last&#62;
125 Content or XML CDATA of the "last" element.
126 &#60;/last&#62;
127 &#60;/child&#62;
128 &#60;/a&#62;</PRE
129 ></TD
130 ></TR
131 ></TABLE
133 >I should say that the XML structure that pwmd uses is a little more complicated. It really looks like the following internally, but we will use the above format in this tutorial for simplicity:</P
134 ><TABLE
135 BORDER="0"
136 BGCOLOR="#E0E0E0"
137 WIDTH="100%"
138 ><TR
139 ><TD
140 ><PRE
141 CLASS="SCREEN"
142 >&#60;element _name="a"&#62;
143 &#60;element _name="child"&#62;
144 &#60;element _name="last"&#62;Content or CDATA of the "last" element.
145 &#60;/element&#62;
146 &#60;/element&#62;
147 &#60;/element&#62;</PRE
148 ></TD
149 ></TR
150 ></TABLE
152 >Every element created has an element named <SPAN
153 CLASS="emphasis"
155 CLASS="EMPHASIS"
156 >element</I
157 ></SPAN
158 > with an attribute <SPAN
159 CLASS="emphasis"
161 CLASS="EMPHASIS"
162 >_name</I
163 ></SPAN
164 > associated with it. The value of the <SPAN
165 CLASS="emphasis"
167 CLASS="EMPHASIS"
168 >_name</I
169 ></SPAN
170 > attribute is what an element in an element path refers to. It is done this way so that a wider range of characters can be used in an element name while maintaining valid XML. In fact, the only restriction of an element name is that it not contain whitespace characters and not begin with an exclamation point (ASCII 0x21 or !). See <SPAN
171 CLASS="emphasis"
173 CLASS="EMPHASIS"
175 HREF="#SEC.LINKING-ELEMENTS-1"
176 >the Section called <I
177 >Linking elements</I
178 ></A
179 > </I
180 ></SPAN
181 >for an exception.</P
183 >There is one other difference from your normal XML document in that only the first match of an element is considered for the current element tree depth. When an element of the current depth of an element tree is found, the next element in the element path is searched for beginning at the child node of the found element. From the example above:</P
184 ><TABLE
185 BORDER="0"
186 BGCOLOR="#E0E0E0"
187 WIDTH="100%"
188 ><TR
189 ><TD
190 ><PRE
191 CLASS="SCREEN"
192 >&#60;a&#62;
193 &#60;child&#62;
194 &#60;last&#62;Content or XML CDATA of the "last" element.
195 &#60;/last&#62;
196 &#60;/child&#62;
197 &#60;child&#62;This element will never be reached.
198 &#60;/child&#62;
199 &#60;/a&#62;</PRE
200 ></TD
201 ></TR
202 ></TABLE
204 >The second "child" element is never reached, although an element of a different name may be accessed.</P
205 ></DIV
206 ><DIV
207 CLASS="SECT1"
208 ><HR><H2
209 CLASS="SECT1"
211 NAME="AEN45"
212 >Clients</A
213 ></H2
215 >You will need a client to send commands to the pwmd server. If you are making your own application or need a simple client to connect to the server then <SPAN
216 CLASS="emphasis"
218 CLASS="EMPHASIS"
219 >libpwmd</I
220 ></SPAN
221 > may be used. It has few dependencies and - as mentioned - includes a client named <SPAN
222 CLASS="emphasis"
224 CLASS="EMPHASIS"
225 >pwmc</I
226 ></SPAN
227 >. The rest of this tutorial will use pwmc. It is command-line based and there are not any fancy graphics, but it is good for understanding how commands are processed.</P
229 >If you want a more user friendly client that looks like a file manager and has a point and click interface, try pwmdEdit<A
230 NAME="AEN51"
231 HREF="#FTN.AEN51"
232 ><SPAN
233 CLASS="footnote"
234 >[4]</SPAN
235 ></A
236 > which uses the Qt4 toolkit.</P
237 ></DIV
238 ><DIV
239 CLASS="SECT1"
240 ><HR><H2
241 CLASS="SECT1"
243 NAME="AEN53"
244 >Connecting</A
245 ></H2
247 >We are using the <SPAN
248 CLASS="emphasis"
250 CLASS="EMPHASIS"
251 >pwmc</I
252 ></SPAN
253 > client included in libpwmd. pwmc has two modes that commands are read from: interactive and stdin. The interactive mode uses the readline library and has command history while reading from standard input (stdin) makes shell scripting and automation easy. For the examples, we will be connecting to the default local unix domain socket that pwmd waits for connections on. Remote connections are possible over an SSH channel but that is not covered here. Read the pwmc(1) manual page for how to do that.</P
255 >The example filename we will use is "datafile". It is initially a non-existent file but it will be created once we have saved to it. Now let us connect to the server in interactive mode and open the data file:</P
256 ><TABLE
257 BORDER="0"
258 BGCOLOR="#E0E0E0"
259 WIDTH="100%"
260 ><TR
261 ><TD
262 ><PRE
263 CLASS="SCREEN"
264 >$ pwmc --interactive datafile
265 Connected.
266 pwm&#62;</PRE
267 ></TD
268 ></TR
269 ></TABLE
271 >The "pwm&gt;" prompt is a readline prompt that has command history and can do filename completion. It also is annoying because, as mentioned, elements in element paths are TAB delimited, but command completion in readline uses the TAB character, too. To insert a real TAB character in interactive mode rather than do readline completion, you will need to first press CTRL-V and then press TAB.</P
272 ></DIV
273 ><DIV
274 CLASS="SECT1"
275 ><HR><H2
276 CLASS="SECT1"
278 NAME="AEN60"
279 >Commands</A
280 ></H2
282 >To store some data in an element path, you will need to know what element path to create. It is up to you how you want your data organized. If for example you will be storing account information it may be a good idea to categorize what the account is for: email, instant messaging, blogging, etc.</P
284 >In the following example we will setup mail server element paths which can be used for other applications requiring a mail server configuration. First, lets create the hostname element path:</P
285 ><TABLE
286 BORDER="0"
287 BGCOLOR="#E0E0E0"
288 WIDTH="100%"
289 ><TR
290 ><TD
291 ><PRE
292 CLASS="SCREEN"
293 >pwm&#62; STORE</PRE
294 ></TD
295 ></TR
296 ></TABLE
298 >The STORE command is a pwmd protocol command. This command and some other commands use what is called a <SPAN
299 CLASS="emphasis"
301 CLASS="EMPHASIS"
302 >server inquire</I
303 ></SPAN
304 > to retrieve data from the client, while other commands may retrieve required data only from the command arguments. The server inquire will wait for the client to finish sending its data before completing the command. When responding to a server inquire in pwmc, pwmc will show a message telling you that it is waiting for data to be sent. Enter the element path and its content, then press &lt;CTRL-D&gt; twice to finish sending the data and let pwmd complete the command:</P
305 ><TABLE
306 BORDER="0"
307 BGCOLOR="#E0E0E0"
308 WIDTH="100%"
309 ><TR
310 ><TD
311 ><PRE
312 CLASS="SCREEN"
313 >pwm&#62; STORE
314 email&#60;TAB&#62;isp&#60;TAB&#62;IMAP&#60;TAB&#62;hostname&#60;TAB&#62;imap.server.com&#60;CTRL-D&#62;&#60;CTRL-D&#62;</PRE
315 ></TD
316 ></TR
317 ></TABLE
319 >Remember that you should replace &lt;TAB&gt; in the examples with a real TAB character. I should mention that when sending data via a server inquire there is no need to press CTRL-V to insert the TAB character. That is only needed from the readline command prompt and when not doing a server inquire.</P
321 >After pressing the first CTRL-D, the line that was entered is sent to pwmd and the inquire continues. To terminate the inquire and finish sending data for the command, press CTRL-D a second time.</P
323 >If you were to have pressed RETURN before any CTRL-D then the inquired line would have been sent in full including a newline character. Since in this example a newline character in a hostname is not a valid hostname, this is not what we want.</P
325 >We have just created an element path whose XML structure looks like the following:</P
326 ><TABLE
327 BORDER="0"
328 BGCOLOR="#E0E0E0"
329 WIDTH="100%"
330 ><TR
331 ><TD
332 ><PRE
333 CLASS="SCREEN"
334 >&#60;email&#62;
335 &#60;isp&#62;
336 &#60;IMAP&#62;
337 &#60;hostname&#62;imap.server.com&#60;/hostname&#62;
338 &#60;/IMAP&#62;
339 &#60;/isp&#62;
340 &#60;/email&#62;</PRE
341 ></TD
342 ></TR
343 ></TABLE
345 >When an application needs to retrieve the content for the element path we have just created, it will send the GET command (libpwmd does this part) to the pwmd server. You can retrieve the content of an element path by using the GET command in pwmc, too:</P
346 ><TABLE
347 BORDER="0"
348 BGCOLOR="#E0E0E0"
349 WIDTH="100%"
350 ><TR
351 ><TD
352 ><PRE
353 CLASS="SCREEN"
354 >pwm&#62; GET email&#60;TAB&#62;isp&#60;TAB&#62;IMAP&#60;TAB&#62;hostname
355 XFER 0 15
356 XFER 15 15
357 imap.server.com</PRE
358 ></TD
359 ></TR
360 ></TABLE
362 >Remember that in interactive mode and when not doing a server inquire, you will need to press CTRL-V before pressing TAB.</P
364 >The XFER lines are status messages. They show the current and total length of the data transfered in bytes. The last line is the value of the element path we just created.</P
366 >Let us create the rest of the needed elements:</P
367 ><TABLE
368 BORDER="0"
369 BGCOLOR="#E0E0E0"
370 WIDTH="100%"
371 ><TR
372 ><TD
373 ><PRE
374 CLASS="SCREEN"
375 >pwm&#62; STORE email&#60;TAB&#62;isp&#60;TAB&#62;IMAP&#60;TAB&#62;port&#60;TAB&#62;993&#60;CTRL-D&#62;&#60;CTRL-D&#62;
376 pwm&#62; STORE
377 email&#60;TAB&#62;isp&#60;TAB&#62;IMAP&#60;TAB&#62;ssl&#60;TAB&#62;1&#60;CTRL-D&#62;&#60;CTRL-D&#62;
378 pwm&#62; STORE
379 email&#60;TAB&#62;isp&#60;TAB&#62;username&#60;TAB&#62;myusername&#60;CTRL-D&#62;&#60;CTRL-D&#62;
380 pwm&#62; STORE
381 email&#60;TAB&#62;isp&#60;TAB&#62;password&#60;TAB&#62;mypassword&#60;CTRL-D&#62;&#60;CTRL-D&#62;</PRE
382 ></TD
383 ></TR
384 ></TABLE
386 >Now the element structure for the root "email" element looks like this:</P
387 ><TABLE
388 BORDER="0"
389 BGCOLOR="#E0E0E0"
390 WIDTH="100%"
391 ><TR
392 ><TD
393 ><PRE
394 CLASS="SCREEN"
395 >&#60;email&#62;
396 &#60;isp&#62;
397 &#60;IMAP&#62;
398 &#60;hostname&#62;imap.server.com&#60;/hostname&#62;
399 &#60;port&#62;993&#60;/port&#62;
400 &#60;ssl&#62;1&#60;/ssl&#62;
401 &#60;/IMAP&#62;
402 &#60;username&#62;myusername&#60;/username&#62;
403 &#60;password&#62;mypassword&#60;/password&#62;
404 &#60;/isp&#62;
405 &#60;/email&#62;</PRE
406 ></TD
407 ></TR
408 ></TABLE
410 >If you wanted to change your password (after changing it on the mail server, of course) just do as you did when initially creating the password element path. The new content will overwrite the existing content:</P
411 ><TABLE
412 BORDER="0"
413 BGCOLOR="#E0E0E0"
414 WIDTH="100%"
415 ><TR
416 ><TD
417 ><PRE
418 CLASS="SCREEN"
419 >pwm&#62; STORE
420 email&#60;TAB&#62;isp&#60;TAB&#62;password&#60;TAB&#62;newpassword&#60;CTRL-D&#62;&#60;CTRL-D&#62;</PRE
421 ></TD
422 ></TR
423 ></TABLE
425 >An application using libpwmd that needs to know mail server information now has all the information it needs. The only thing left to do now is to save the changes:</P
426 ><TABLE
427 BORDER="0"
428 BGCOLOR="#E0E0E0"
429 WIDTH="100%"
430 ><TR
431 ><TD
432 ><PRE
433 CLASS="SCREEN"
434 >pwm&#62; &#60;CTRL-D&#62;</PRE
435 ></TD
436 ></TR
437 ></TABLE
439 >After pressing &lt;CTRL-D&gt; a prompt will be shown asking what to do. Press &ldquo;s&rdquo; to save what we have created.</P
441 >Since this is a new file, you will be prompted for a passphrase to use for encryption. Once done, the data file is encrypted and written to disk and the passphrase is cached in pwmd so you do not need to enter it the next time your data file is opened or saved. There are a few pwmd configuration parameters that affect how this operates. See the pwmd documentation for details.</P
443 >Various applications using libpwmd may have different element path requirements. Refer to the documentation of each application that supports pwmd for the required elements.</P
444 ></DIV
445 ><DIV
446 CLASS="SECT1"
447 ><HR><H2
448 CLASS="SECT1"
450 NAME="SEC.LINKING-ELEMENTS-1"
451 >Linking elements</A
452 ></H2
454 >One distinguishing feature of pwmd is the ability to share data of an element path with another. For example, if your ISP lets you host a blog on their server and you use a blogging client that supports pwmd to edit your posts, you can share authentication information with the email example above when the account details are the same. When element linking is used, this avoids the need to change the content for both the blogging and email password elements.</P
456 >This is done by setting a special &ldquo;target&rdquo; attribute for an element. It behaves similarly to the HTML &ldquo;target&rdquo; attribute or XML entities or a symbolic link on a filesystem. </P
458 >Let's create an example blogging element path:</P
459 ><TABLE
460 BORDER="0"
461 BGCOLOR="#E0E0E0"
462 WIDTH="100%"
463 ><TR
464 ><TD
465 ><PRE
466 CLASS="SCREEN"
467 >pwm&#62; STORE
468 blog&#60;TAB&#62;isp&#60;TAB&#62;hostname&#60;TAB&#62;blog.myisp.com&#60;CTRL-D&#62;&#60;CTRL-D&#62;
470 pwm&#62; ATTR SET target blog&#60;TAB&#62;isp&#60;TAB&#62;username email&#60;TAB&#62;isp&#60;TAB&#62;username
471 pwm&#62; ATTR SET target blog&#60;TAB&#62;isp&#60;TAB&#62;password email&#60;TAB&#62;isp&#60;TAB&#62;password</PRE
472 ></TD
473 ></TR
474 ></TABLE
476 >Now each access of the "blog/isp/username" and "blog/isp/password" element paths, which were created if they did not already exist, will point to "email/isp/username" and "email/isp/password" respectively. To get the value or content of an element that contains a "target" attribute without following any &ldquo;target&rdquo; attribute, prefix the element with a '!' when specifying it in an element path. For example:</P
477 ><TABLE
478 BORDER="0"
479 BGCOLOR="#E0E0E0"
480 WIDTH="100%"
481 ><TR
482 ><TD
483 ><PRE
484 CLASS="SCREEN"
485 >pwm&#62; GET blog&#60;TAB&#62;isp&#60;TAB&#62;!password
486 ERR 536870938: No value</PRE
487 ></TD
488 ></TR
489 ></TABLE
491 >An error is returned because we have not assigned a value to the literal element. A literal element is an element that either contains no "target" attribute or ignores it by prefixing the element with the mentioned literal element character '!'. Let us try storing an example password to the literal element to show usage:</P
492 ><TABLE
493 BORDER="0"
494 BGCOLOR="#E0E0E0"
495 WIDTH="100%"
496 ><TR
497 ><TD
498 ><PRE
499 CLASS="SCREEN"
500 >pwmd&#62; STORE
501 blog&#60;TAB&#62;isp&#60;TAB&#62;!password&#60;TAB&#62;newpassword&#60;CTRL-D&#62;&#60;CTRL-D&#62;</PRE
502 ></TD
503 ></TR
504 ></TABLE
506 >Now when we redo the previous GET command:</P
507 ><TABLE
508 BORDER="0"
509 BGCOLOR="#E0E0E0"
510 WIDTH="100%"
511 ><TR
512 ><TD
513 ><PRE
514 CLASS="SCREEN"
515 >pwm&#62; GET blog&#60;TAB&#62;isp&#60;TAB&#62;!password
516 XFER 0 11
517 XFER 11 11
518 newpassword</PRE
519 ></TD
520 ></TR
521 ></TABLE
523 >This is the value of the literal password element of the element path. To follow the element path stored in the "target" attribute, omit the '!' in the password element. This will return the &ldquo;email/isp/password&rdquo; element content:</P
524 ><TABLE
525 BORDER="0"
526 BGCOLOR="#E0E0E0"
527 WIDTH="100%"
528 ><TR
529 ><TD
530 ><PRE
531 CLASS="SCREEN"
532 >pwm&#62; GET blog&#60;TAB&#62;isp&#60;TAB&#62;password
533 XFER 0 10
534 XFER 10 10
535 mypassword</PRE
536 ></TD
537 ></TR
538 ></TABLE
540 >A "target" attribute may also refer to another element with a "target" attribute. Every "target" attribute will be followed until there are no others to resolve. To get the real element path and resolve all "target" attributes, use the REALPATH command:</P
541 ><TABLE
542 BORDER="0"
543 BGCOLOR="#E0E0E0"
544 WIDTH="100%"
545 ><TR
546 ><TD
547 ><PRE
548 CLASS="SCREEN"
549 >pwm&#62; REALPATH blog&#60;TAB&#62;isp&#60;TAB&#62;password
550 XFER 0 30
551 XFER 30 30
552 !email&#60;TAB&#62;!isp&#60;TAB&#62;!password</PRE
553 ></TD
554 ></TR
555 ></TABLE
557 >As you can see each element is prefixed with the literal '!' character meaning that no "target" attribute exists in any element of the resulting element path.</P
559 >Using the LIST command is useful to show the element structure of a document. The XFER status messages have been omitted:</P
560 ><TABLE
561 BORDER="0"
562 BGCOLOR="#E0E0E0"
563 WIDTH="100%"
564 ><TR
565 ><TD
566 ><PRE
567 CLASS="SCREEN"
568 >pwm&#62; LIST
569 !email
570 !blog
571 pwm&#62; LIST !email
572 !email
573 !email&#60;TAB&#62;!isp
574 !email&#60;TAB&#62;!isp&#60;TAB&#62;!username
575 !email&#60;TAB&#62;!isp&#60;TAB&#62;!password
576 !email&#60;TAB&#62;!isp&#60;TAB&#62;!IMAP&#60;TAB&#62;!hostname
577 !email&#60;TAB&#62;!isp&#60;TAB&#62;!IMAP&#60;TAB&#62;!port
578 !email&#60;TAB&#62;!isp&#60;TAB&#62;!IMAP&#60;TAB&#62;!ssl
579 pwm&#62; LIST !blog
580 !blog
581 !blog&#60;TAB&#62;!isp
582 !blog&#60;TAB&#62;!isp&#60;TAB&#62;!username
583 !blog&#60;TAB&#62;!isp&#60;TAB&#62;username
584 !blog&#60;TAB&#62;!isp&#60;TAB&#62;!password
585 !blog&#60;TAB&#62;!isp&#60;TAB&#62;password</PRE
586 ></TD
587 ></TR
588 ></TABLE
590 >Notice that there are two username and password elements in the &ldquo;blog&rdquo; element path: each with and without the literal element character prefix. This shows that both the username and password elements contain a "target" attribute.</P
592 >For the final example, we will remove the &ldquo;target&rdquo; attribute of the blogging password element:</P
593 ><TABLE
594 BORDER="0"
595 BGCOLOR="#E0E0E0"
596 WIDTH="100%"
597 ><TR
598 ><TD
599 ><PRE
600 CLASS="SCREEN"
601 >pwm&#62; ATTR DELETE target blog&#60;TAB&#62;isp&#60;TAB&#62;!password</PRE
602 ></TD
603 ></TR
604 ></TABLE
606 >If we were to have omitted the '!' from the password element then pwmd would try to remove the "target" attribute from the "email/isp/password" element path. That would return an error because no &ldquo;target&rdquo; attribute had been set for that element.</P
608 >Note that the "blog" and "isp" elements have no literal element character prepended to them in the example. It is not needed because they have no &ldquo;target&rdquo; attribute themselves.</P
610 >Using &ldquo;target&rdquo; attributes can be confusing. The best way to get the hang of linking elements is to experiment and use the LIST and DUMP commands to show the document structure. Remember to use the literal element prefix '!' when you do not want to follow any "target" attributes.</P
611 ></DIV
612 ></DIV
613 ><H3
614 CLASS="FOOTNOTES"
615 >Notes</H3
616 ><TABLE
617 BORDER="0"
618 CLASS="FOOTNOTES"
619 WIDTH="100%"
620 ><TR
621 ><TD
622 ALIGN="LEFT"
623 VALIGN="TOP"
624 WIDTH="5%"
626 NAME="FTN.AEN6"
627 HREF="#AEN6"
628 ><SPAN
629 CLASS="footnote"
630 >[1]</SPAN
631 ></A
632 ></TD
633 ><TD
634 ALIGN="LEFT"
635 VALIGN="TOP"
636 WIDTH="95%"
637 ><FONT
638 COLOR="RED"
639 >bjk@luxsci.net</FONT
640 ></TD
641 ></TR
642 ><TR
643 ><TD
644 ALIGN="LEFT"
645 VALIGN="TOP"
646 WIDTH="5%"
648 NAME="FTN.AEN12"
649 HREF="#AEN12"
650 ><SPAN
651 CLASS="footnote"
652 >[2]</SPAN
653 ></A
654 ></TD
655 ><TD
656 ALIGN="LEFT"
657 VALIGN="TOP"
658 WIDTH="95%"
659 ><FONT
660 COLOR="RED"
661 >http://libpwmd.sourceforge.net/</FONT
662 ></TD
663 ></TR
664 ><TR
665 ><TD
666 ALIGN="LEFT"
667 VALIGN="TOP"
668 WIDTH="5%"
670 NAME="FTN.AEN15"
671 HREF="#AEN15"
672 ><SPAN
673 CLASS="footnote"
674 >[3]</SPAN
675 ></A
676 ></TD
677 ><TD
678 ALIGN="LEFT"
679 VALIGN="TOP"
680 WIDTH="95%"
681 ><FONT
682 COLOR="RED"
683 >http://pwmd.sourceforge.net/</FONT
684 ></TD
685 ></TR
686 ><TR
687 ><TD
688 ALIGN="LEFT"
689 VALIGN="TOP"
690 WIDTH="5%"
692 NAME="FTN.AEN51"
693 HREF="#AEN51"
694 ><SPAN
695 CLASS="footnote"
696 >[4]</SPAN
697 ></A
698 ></TD
699 ><TD
700 ALIGN="LEFT"
701 VALIGN="TOP"
702 WIDTH="95%"
703 ><FONT
704 COLOR="RED"
705 >http://qpwmc.sourceforge.net/</FONT
706 ></TD
707 ></TR
708 ></TABLE
709 ></BODY
710 ></HTML