代码拉取完成,页面将自动刷新
From: <Saved by Blink>
Snapshot-Content-Location: http://www.unixwiz.net/techtips/termios-vmin-vtime.html
Subject: Understanding UNIX termios VMIN and VTIME
Date: Tue, 3 Dec 2024 00:59:29 -0000
MIME-Version: 1.0
Content-Type: multipart/related;
type="text/html";
boundary="----MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----"
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: text/html
Content-ID: <frame-65CC7617CC378F1608C369229B121426@mhtml.blink>
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.unixwiz.net/techtips/termios-vmin-vtime.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.=
w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv=3D"Content-Type" co=
ntent=3D"text/html; charset=3DUTF-8"><link rel=3D"stylesheet" type=3D"text/=
css" href=3D"cid:css-0951ae5b-4635-41f1-b553-5795031055de@mhtml.blink" />
<link rel=3D"stylesheet" type=3D"text/css" href=3D"http://www.unixwiz.net/u=
nixwiz.css">
<link rel=3D"shortcut icon" href=3D"http://www.unixwiz.net/favicon.ico">
<link rel=3D"alternate" type=3D"application/rss+xml" title=3D"RSS 2.0" href=
=3D"http://unixwiz.net/techtips/techtips.rss">
<meta name=3D"version" content=3D"$Id: //websites/unixwiz/unixwiz.net/webro=
ot/techtips/termios-vmin-vtime.web#10 $">
<!-- RSS description =3D for much higher efficiency than mere one-at-a-time=
reads. -->
<!-- RSS pubDate =3D 2004/05/13 -->
<!-- Host: amz.unixwiz.net -->
<title>Understanding UNIX termios VMIN and VTIME</title>
</head>
<body>
<div id=3D"warning">
<h2>Does this site look plain?</h2>
<p>This site uses advanced css techniques</p>
</div>
<div id=3D"logo">
<a href=3D"http://www.unixwiz.net/">
<img src=3D"http://www.unixwiz.net/images/unixwiz-logo-140x80.gif" alt=3D=
"[Steve Friedl Logo]">
</a>
</div>
<div id=3D"pageheader">
<h1> Steve Friedl's Unixwiz.net Tech Tips </h1>
<h2> Understanding UNIX termios VMIN and VTIME </h2>
</div>
<div id=3D"navmenu">
<ul>
<li><a href=3D"http://www.unixwiz.net/"> Home </a> </li>
<li><a href=3D"http://www.unixwiz.net/contact"> Contact </a> </li>
<li><a href=3D"http://www.unixwiz.net/about/"> About </a> </li>
<li><a href=3D"http://www.unixwiz.net/techtips/"> TechTips </a> </li>
<li><a href=3D"http://www.unixwiz.net/tools/"> Tools&Source </a> </li>
<li><a href=3D"http://www.unixwiz.net/evo/"> Evo Payroll </a> </li>
<li><a href=3D"http://www.unixwiz.net/cmdletters/"> CmdLetters </a> </li>
<li><a href=3D"http://www.unixwiz.net/research/"> Research </a> </li>
<li><a href=3D"http://www.unixwiz.net/3b2.html"> AT&T 3B2 </a> </li>
<li><a href=3D"http://www.unixwiz.net/advisories.html"> Advisories </a> </l=
i>
<li><a href=3D"http://www.unixwiz.net/news.html"> News/Pubs </a> </li>
<li><a href=3D"http://www.unixwiz.net/literacy.html"> Literacy </a> </li>
<li><a href=3D"http://www.unixwiz.net/voting/"> Calif.Voting </a> </li>
<li><a href=3D"http://www.unixwiz.net/personal/"> Personal </a> </li>
<li><a href=3D"http://blog.unixwiz.net/"> Tech Blog </a> </li>
<li><a href=3D"http://evoblog.unixwiz.net/"> Evo Blog </a> </li>
</ul>
</div>
<div id=3D"pagecontent">
<p>
The POSIX "termios" structures are at the center of serial-port I/O
control, and there are <i>many</i> knobs and switches to turn here. The
<b>stty</b> program is actually a command-line wrapper around the <b>termio=
s</b>
struct, and it should be apparent that this whole arena is filled with
arcana, obscura, historical artifacts, and even nostalgia.
</p>
<p>
A single Tech Tip can't possible cover them all, but it can at least
touch on one area of common confusion: the use of <b>VMIN</b> and <b>VTIME<=
/b>.
These are macros used as indexes into the <b>termios.c_cc[]</b>
array, which under normal circumstances holds the list of special
<i>control characters</i> (backspace, erase, line kill, interrupt, etc.)
for the current session.
</p>
<p>
But when the <b>ICANON</b> bit is turned off, a "raw mode" is selected whic=
h
changes the interpretation of these values. These are used to guide the
line-driver code in its decision on allowing the <b>read()</b> system call =
to
return. We'll try to explain them in some detail.
</p>
<p class=3D"topnote">
NOTE: This is <b>not</b> a tutorial on <b>termios</b> programming as a
whole. This is a very large subject, and the only way to present a Tech
Tip on a subject is to presume that the reader understands the subject
in general.
</p>
<p>
An excellent resource is the dated but still timely book
<a href=3D"http://www.oreilly.com/catalog/posix/index.html">POSIX
Programmer's Guide</a> by Donald Lewine (O'Reilly & Associates). This
covers terminal I/O quite well, along with other important POSIX topics (pr=
ocess
control, signals, etc.). Highly recommended.
</p>
<h1>Who cares about timing?</h1>
<p>
Unlike reading from a file, where data are either "present" or
"not present", there are also <i>timing issues</i> involved in reading from
a tty channel. Many programs won't care about this at all, but there
are some important cases where this is vital to correct operation.
</p>
<dl class=3D"defnlist">
<dt>Function-key processing
</dt>
<dd>On a regular keyboard, most keys send just one byte each, but
almost all keyboards have special keys that send a <i>sequence of character=
s</i>
at a time. Examples (from an ANSI keyboard)
</dd>
<dd>
<ul>
<li><b><tt>ESC [ A</tt></b> up arrow </li=
>
<li><b><tt>ESC [ 5 ~</tt></b> page up </li>
<li><b><tt>ESC [ 18 ~</tt></b> F7 </li>
</ul>
</dd>
<dd>
and so on.
</dd>
<dd>
From a strictly "string recognition" point of view, it's easy
enough to translate "<b>ESC [ A</b>" into "up arrow" inside a program,
but how does it tell the difference between "user typed up-arrow"
and "user typed the ESCAPE key"? The difference is <i>timing</i>.
If the ESCAPE is <i>immediately</i> followed by the rest of the
expected sequence, then it's a function key: otherwise it's just
a plain ESCAPE.
</dd>
<dt>
Efficient highspeed input
</dt>
<dd>When a communications program (such as fax software) is reading
from a modem, the data stream is arriving at a relatively high rate.
Doing single-character-at-a-time input would be extremely inefficient,
given that each <b>read()</b> involves a system call and an operating
system context switch.
We'd instead like to read in larger chunk if it's available for us, but
still know how to recognize timeouts (which usually indicate error
conditions).
</dd>
<dt>
Capturing occasional, low-volume data
</dt>
<dd>When writing software that monitored a temperature sensor via
a serial line, we expected to receive a short (10-20 bytes)
message every second. This message arrived as a single burst, and
once the first character of the message was received, we <i>knew</i>
that the others were right behind it and would be completely received
in about 100 milliseconds.
</dd>
<dd>
The message format did not have strong delimiters, so if we used
a na=C3=AFve read of so many bytes, we'd run the risk of reading
an entire message but blocking until a few more bytes <i>of the next messag=
e</i>
were read to fill our request. This could lead to getting "out of sync"
with the sensor.
</dd>
<dd>
By setting <b>VMIN</b>/<b>VTIME</b> properly, we were able to insure that
that we could efficiently capture all the data sent in one burst without
risk of inter-message overlap.
</dd>
</dl>
<p>
We'll note that some of these timeout issues can be partly addressed
by the use of signals and alarms, but this is really a substandard
solution: signals and I/O are hard to get right (especially in a
portable manner), and we very strongly prefer using the features of
the line-discipline code as they were intended. Signals suck.
</p>
<h1>When does <u>read()</u> return?</h1>
<p>
The <b>termios</b> settings are actually handled in the kernel, and
the ones we're interested in are in the <i>line discipline</i> code.
This sits above the "device driver", and this is consistent with our
applying termios to both serial and network I/O (which obviously
use different underlying hardware).
</p>
<p>
All of the <b>VMIN</b> and <b>VTIME</b> areas involve one question:
</p>
<blockquote>
<i>When does the line driver allow <b>read()</b> to return?</i>
</blockquote>
<p>
With a "regular file", the operating system returns from the
<b>read()</b> system call when either the user buffer is full, or
when the end of file has been reached - this decision is easy
and automatic.
</p>
<p>
But when the driver is reading from a terminal line, the "Are we done?"
question can be asked over and over for each character that arrives.
This question is resolved by setting <b>VMIN</b>/<b>VTIME</b>.
</p>
<p>
Using our temperature-sensor example, we'll list the requirements
that inform our design:
</p>
<ul>
<li>
We normally read up to 20 bytes as a "message"
</li>
<li>
Individual messages have their bytes all sent together
</li>
<li>
No background processing required; while waiting for input,
we're happy to block indefinitely waiting for something to happen
</li>
</ul>
<p>
The last requirement means that we have no <i>overall</i> timeout, but
we do have an <i>intercharacter</i> timeout. This is the key functionality
provided by the line driver. Let's be specific.
</p>
<p>
When waiting for input, the driver returns when:
</p>
<dl class=3D"defnlist">
<dt> <b>VTIME</b> tenths of a second elapses <i>between</i> bytes</dt>
<dd>
An internal timer is started when a character arrives, and it counts
up in tenths of a second units. It's reset whenever new data arrives, so
rapidly-arriving data never gives the intercharacter timer a chance to
count very high.
</dd>
<dd>
It's only after the <i>last</i> character of a burst =E2=80=94 when the lin=
e is
quiet =E2=80=94 that the timer really gets counting. When it reaches <b>VTI=
ME</b>
tenths, the user's request has been satisfied and the <b>read()</b> returns=
.
</dd>
<dd>
This provides exactly the behavior we want when dealing with bursty data:
collect data while it's arriving rapidly, but when it calms down,
give us what you got.
</dd>
<dt><b>VMIN</b> characters have been received, with no more data available<=
/dt>
<dd>
At first this appears duplicative to the <b>nbytes</b> parameter to the
<b>read()</b> system call, but it's not quite the same thing.
</dd>
<dd>
The serial driver maintains an input queue of data received but not
transferred to the user =E2=80=94 clearly data can arrive even when we're n=
ot
asking for it =E2=80=94 and this is always first copied to the user's buffe=
r
on a <b>read()</b> without having to wait for anything.
</dd>
<dd>
But if we do end up blocking for I/O (because the kernel's input
queue is empty), then <b>VMIN</b> kicks in: When that many bytes
have been received, the <b>read()</b> request returns that data. In
this respect we can think of the <b>nbytes</b> parameter as being the amoun=
t of
data we <i>hope</i> to get, but we'll settle for <b>VMIN</b>.
</dd>
<dt>The user's requested number of bytes has been satisfied</dt>
<dd>
This rule trumps all the others: there is no circumstance where the
system will provide <i>more</i> data than was actually asked for by the
user. If the user asks for (say) ten bytes in the <b>read()</b>
system call, and that much data is already waiting in the kernel's
input queue, then it's returned to the caller immediately and without
having <b>VMIN</b> and <b>VTIME</b> participate in any way.
</dd>
</dl>
<p>
These are certainly confusing to one who is new to <b>termios</b>, but
it's not really poorly defined Instead, they solve problems that are
not obvious to the newcomer. It's only when one is actually dealing
with terminal I/O and running into issues of either performance or
timing that one really must dig in.
</p>
<h1>VMIN and VTIME defined</h1>
<p>
<b>VMIN</b> is a character count ranging from 0 to 255 characters, and
<b>VTIME</b> is time measured in 0.1 second intervals, (0 to 25.5 seconds).
The value of "zero" is special to both of these parameters, and this sugges=
ts
four combinations that we'll discuss below. In every case, the question
is when a <b>read()</b> system call is satisfied, and this is our prototype=
call:
</p>
<pre class=3D"codeblock">int n =3D read(fd, buffer, nbytes);
</pre>
<p>
Keep in mind that the tty driver maintains an input queue of bytes
already read from the serial line and not passed to the user, so not
every <b>read()</b> call waits for actual I/O - the read may very well be
satisfied directly from the input queue.
</p>
<dl class=3D"defnlist">
<dt>VMIN =3D 0 and VTIME =3D 0</dt>
<dd>
This is a completely non-blocking read - the call is satisfied immediately
directly from the driver's input queue. If data are available, it's
transferred to the caller's buffer up to nbytes and returned. Otherwise
zero is immediately returned to indicate "no data". We'll note that this
is "polling" of the serial port, and it's almost always a bad idea. If
done repeatedly, it can consume enormous amounts of processor time and
is highly inefficient. Don't use this mode unless you really, really
know what you're doing.
</dd>
<dt> VMIN =3D 0 and VTIME > 0 </dt>
<dd>
This is a pure timed read. If data are available in the input queue,
it's transferred to the caller's buffer up to a maximum of nbytes, and
returned immediately to the caller. Otherwise the driver blocks until data
arrives, or when VTIME tenths expire from the start of the call. If the
timer expires without data, zero is returned. A single byte is sufficient
to satisfy this read call, but if more is available in the input queue,
it's returned to the caller. Note that this is an <i>overall</i> timer,
not an <i>intercharacter</i> one.
</dd>
<dt>VMIN > 0 and VTIME > 0</dt>
<dd>
A <b>read()</b> is satisfied when either VMIN characters have been transfer=
red to
the caller's buffer, or when VTIME tenths expire between characters. Since
this timer is not started until the first character arrives, this call
can block indefinitely if the serial line is idle. This is the most
common mode of operation, and we consider VTIME to be an <i>intercharacter<=
/i>
timeout, not an <i>overall</i> one. This call should never return zero byte=
s
read.
</dd>
<dt> VMIN > 0 and VTIME =3D 0 </dt>
<dd>
This is a counted read that is satisfied only when at least VMIN
characters have been transferred to the caller's buffer - there is no
timing component involved. This read can be satisfied from the driver's
input queue (where the call could return immediately), or by waiting for
new data to arrive: in this respect the call could block indefinitely. We
believe that it's undefined behavior if nbytes is less then VMIN.
</dd>
</dl>
<div id=3D"navmore">
<a href=3D"http://www.unixwiz.net/techtips/index.html"> More Tech Tips </=
a>
</div>
</div>
<div id=3D"pagefooter">
<span class=3D"bottomright"> </span>
<div class=3D"pagefootercontent">
<a href=3D"http://www.unixwiz.net/"> Home </a>
<span class=3D"divbrick"> </span>=20
<a href=3D"http://www.unixwiz.net/contact.html">Stephen J. Friedl</a>
<span class=3D"divbrick"> </span>
Software Consultant
<span class=3D"divbrick"> </span>
Orange County, CA USA
<span class=3D"divbrick"> </span>
<img src=3D"http://www.unixwiz.net/images/steve-email.gif" alt=3D"[Stev=
e's Email]">
<span class=3D"divbrick"> </span>
<a href=3D"http://unixwiz.net/techtips/techtips.rss">
<img src=3D"http://www.unixwiz.net/images/feed-icon-14x14.png" alt=3D"[=
RSS Feed available]" width=3D"14" height=3D"14" border=3D"0">
</a>
</div>
</div>
</body></html>
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: text/css
Content-Transfer-Encoding: quoted-printable
Content-Location: cid:css-0951ae5b-4635-41f1-b553-5795031055de@mhtml.blink
@charset "utf-8";
=0A
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: text/css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.unixwiz.net/unixwiz.css
@charset "utf-8";
#warning { display: none; }
.right { float: right; padding: 4px 0px 4px 4px; }
.left { float: left; padding: 4px 4px 4px 0px; }
.centered { display: block; text-align: center; padding: 4px; margin: 0px; =
}
.cleared { clear: both; }
table { border-collapse: collapse; }
html { position: absolute; background: rgb(251, 251, 242); width: 100%; }
body { font-family: Verdana, Tahoma, Trebuchet, "Trebuchet MS", Arial, Gene=
va, Helvetica, sans-serif; position: relative; background: url("images/page=
frame-right.gif") right top repeat-y rgb(255, 255, 255); top: 0px; left: 0p=
x; right: 0px; padding: 0px; margin: 0px; border: 0px; width: 100%; }
#rsslogo { float: left; }
#logo img { position: absolute; top: 5px; left: 5px; width: 140px; height: =
80px; padding: 0px; margin: 0px; border: 0px; z-index: 1; }
#pageheader { width: auto; right: 40px; left: 0px; position: relative; back=
ground: url("images/pageframe-left-160.gif") left top repeat-y; margin: 0px=
; padding: 0px 23px 18px 165px; line-height: 1.4em; }
#pageheader p { margin: 0px; border: 0px; padding: 0px 0px 1em; }
#pageheader h1 { padding: 12px 0.5em 0px 0px; margin: 0px; text-align: righ=
t; font-size: 150%; font-weight: normal; }
#pageheader h2 { margin: 0px; padding: 0.5em 0.5em 0.5em 0px; font-size: 12=
5%; text-align: right; border-bottom: 3px solid rgb(255, 0, 0); }
#navmenu { font-size: 75%; position: absolute; top: 90px; left: 2px; width:=
165px; z-index: 2; padding: 0px; margin: 0px; border: 0px; }
#navmenu ul { list-style: none; padding: 0px; margin: 0px 33px 0px 5px; bor=
der: 0px; }
#navmenu li { margin: 0px; padding: 0px; width: 100%; }
#navmenu a { background: url("images/menublock.gif") left center no-repeat;=
display: block; color: rgb(0, 0, 51); text-decoration: none; padding: 3px =
3px 3px 12px; margin: 0px 3px 0px 8px; width: 100%; }
#navmenu a:hover { background: url("images/menuback.gif") right top repeat-=
y rgb(255, 0, 0); font-weight: bold; color: rgb(255, 255, 255); border-left=
: 2px solid rgb(0, 0, 0); border-top: 1px solid rgb(0, 0, 0); border-bottom=
: 1px solid rgb(0, 0, 0); margin-left: 6px; padding: 2px 3px 2px 12px; }
#postnav center { font-weight: bold; }
#postnav { margin: 1em 2em 1em 1em; background: pink; padding: 4px; border:=
1px dashed black; }
#pagecontent { width: auto; right: 40px; left: 0px; position: relative; bac=
kground: url("images/pageframe-left-160.gif") left top repeat-y; margin: 0p=
x; padding: 1px 33px 1px 170px; }
#pagecontent a { text-decoration: none; border-bottom: 1px dotted rgb(204, =
119, 119); }
#pagecontent a:visited { text-decoration: none; border-bottom: 1px dotted r=
gb(221, 119, 119); }
#pagecontent a:hover { text-decoration: none; border-bottom: 1px solid rgb(=
0, 68, 153); }
#pagecontent p { margin: 0px; border: 0px; padding: 0px 0px 0.5em; }
#pagecontent hr { text-decoration: none; color: rgb(255, 0, 0); height: 0px=
; border-bottom: 2px solid rgb(255, 0, 0); }
#pagecontent blockquote { padding: 6px; width: 80%; text-align: left; displ=
ay: block; margin-top: 4pt; }
#pagecontent blockquote hr { text-decoration: none; color: rgb(153, 102, 10=
2); height: 0px; border-bottom: 1px solid rgb(153, 102, 102); }
#pagecontent pre, #pagecontent tt { font-family: "Lucida Console", "Courier=
New", Courier, Aria, monospace; }
#pagecontent h1 { font-size: 120%; font-weight: normal; padding-left: 8px; =
margin-top: 16pt; border-top: 2px solid red; border-left: 2px solid red; }
#pagecontent h2 { font-size: 110%; padding-left: 8px; border-left: 8px soli=
d red; margin-top: 8pt; margin-bottom: 6pt; }
#pagecontent .blocklabel { background: url("images/mglass.gif") left center=
no-repeat; margin-left: 3em; text-indent: 14px; font-size: 90%; border-wid=
th: 2px; line-height: 1.4em; margin-bottom: -0.75em; }
#pagecontent .codeblock { border-top: 2px solid black; border-left: 2px sol=
id black; border-bottom: 2px solid black; margin-left: 3em; padding: 0.5em;=
background: rgb(255, 238, 238); width: 80%; font-size: 90%; }
#pagecontent .email { border-top-style: solid; border-bottom-style: solid; =
border-color: rgb(136, 136, 136); margin-left: 3em; padding: 0.5em; backgro=
und: rgb(255, 238, 238); width: 80%; font-size: 90%; }
#toc { background: rgb(255, 232, 232); border: 2px solid black; margin-righ=
t: 1em; float: left; font-size: 80%; width: 30%; padding-top: 4px; padding-=
right: 4px; padding-bottom: 8px; }
#toc center { font-weight: bold; }
#pagecontent div.toc { background: rgb(255, 232, 232); border: 2px solid bl=
ack; margin-right: 8px; float: left; font-size: 80%; width: 30%; padding-to=
p: 4px; padding-right: 4px; padding-bottom: 4px; }
#pagecontent div.toc center { font-weight: bold; }
#pagecontent .imageright { float: right; }
#pagecontent .redbrick { height: 14px; width: 6px; }
#pagecontent .cmdopt dt { font-family: "Lucida Console", "Courier New", Cou=
rier, Arial, monospace; font-weight: bold; font-size: 100%; margin-left: 1e=
m; text-indent: 0.5em; margin-top: 12pt; border-top: 1px solid red; border-=
left: 1px solid red; border-right-color: red; border-bottom-color: red; bor=
der-right-width: 1px; border-bottom-width: 1px; background: rgb(255, 221, 2=
21); width: 33%; }
#pagecontent .cmdopt dd { margin-top: 6pt; }
#pagecontent li { margin-top: 0.5em; }
#pagecontent .nospace li { margin-top: 0px; }
#pagecontent .redbrick img { height: 14px; width: 6px; }
#pagecontent .reddot img { height: 6px; width: 6px; }
#pagecontent .smiley img { height: 15px; width: 15px; }
#pagecontent .required img { height: 16px; width: 29px; }
#pagecontent .obsolete, #pagecontent .warning, #pagecontent .wip, #pagecont=
ent .topnote { border: 2px dashed black; margin-left: 5em; margin-bottom: 1=
em; width: 75%; background: rgb(250, 175, 190); padding: 8px; font-size: 10=
0%; }
#pagecontent dl.defnlist { margin-left: 0.5em; }
#pagecontent .defnlist dt { font-weight: bold; border-left: 5px dotted red;=
padding-left: 8px; margin-top: 6pt; }
#pagecontent .defnlist dd { margin-left: 2em; margin-top: 6pt; }
#pagecontent table.standard { margin-left: 2em; border: 1px solid black; ma=
rgin-top: 1em; margin-bottom: 1em; }
#pagecontent .standard th, #pagecontent .standard td { border: 1px solid bl=
ack; padding: 6px; }
#pagecontent .standard td { vertical-align: top; }
#pagecontent .standard th { background: rgb(250, 175, 190); }
#pagecontent .standard caption { font-weight: bold; margin-bottom: 0.5em; }
#pagecontent img.leftImage { margin-left: 2em; }
#pagecontent img.floatRight, #pagecontent img.floatRightTop { float: right;=
border: 0px; margin: 1em 0px 1em 1em; }
#pagecontent img.floatRightTop { margin-top: 0px; }
#pagecontent img.floatLeft { float: left; margin: 4px 0px; }
#pagecontent img.floatFarLeft { float: left; margin: 4px 2em 4px 2px; }
#navmore { margin-top: 2em; margin-bottom: 1em; }
#navmore a { display: inline; background: rgb(250, 175, 190); padding: 0.5e=
m 1em; border: 1px dashed black; }
#logogroup img { margin: 36px; }
#pagefooter { margin: 0px; padding: 0px; border: 0px; background: url("imag=
es/pageframe-b-left-160.gif") left top no-repeat rgb(251, 251, 242); }
#pagefooter .bottomright { position: relative; font-size: 1px; color: rgb(2=
51, 251, 242); background: url("images/pageframe-b-right.gif") right top no=
-repeat; float: right; height: 17px; width: 56px; margin: 0px; padding: 0px=
; border: 0px; }
#pagefooter .pagefootercontent { padding-top: 18px; padding-bottom: 38px; p=
adding-left: 197px; margin: 0px; font-size: 0.75em; color: rgb(166, 133, 12=
6); text-align: center; }
#pagefooter .pagefootercontent img { vertical-align: middle; }
#pagefooter .pagefootercontent a { color: rgb(136, 153, 187); text-decorati=
on: none; }
#pagefooter .pagefootercontent a:hover { color: rgb(166, 133, 126); text-de=
coration: underline; }
#pagefooter .divbrick { border-left: 0.5em solid red; margin-left: 0.25em; =
}
#pagecontent .funicon { vertical-align: middle; }
#pagecontent .mirror { font-size: 50%; background: pink; padding-left: 2px;=
padding-right: 2px; border: 1px solid black; }
#pagecontent div.quote { margin-top: 0.25em; margin-left: 0.5in; font-size:=
75%; width: 75%; }
#pagecontent div.qbody { margin-left: 0.5in; margin-top: 2px; padding: 2px =
1em; border-top: 2px solid red; border-bottom: 2px solid red; margin-bottom=
: 0.5em; width: 75%; background: rgb(255, 238, 238); }
#pagecontent div.qbody li { margin-top: 0px; }
#pagecontent div.qbody ul, #pagecontent div.qbody ol { margin-bottom: 2px; =
margin-top: 2px; }
#pagecontent .sidebar, #pagecontent .smallsidebar { background: rgb(255, 23=
2, 232); float: right; font-size: 90%; border: 2px solid black; padding: 4p=
x; margin: 4px; width: 25%; }
#pagecontent .sidebar { width: 30%; }
#pagecontent .smallsidebar center, #pagecontent .sidebar center { font-weig=
ht: bold; font-size: 110%; }
#pagecontent .sidebar a { font-size: 90%; }
@media print {
html { background: none; }
body { background: none; font-size: 10pt; }
#pageheader { background: none; }
#pagecontent { background: none; }
#pagefooter { background: none; }
#pagefooter .bottomright { display: none; }
#navmenu { display: none; }
#navmore { display: none; }
#logo { padding-right: 2em; }
#pageheader { border: none; }
#pageheader h1, #pageheader h2 { padding-right: 0px; margin-right: 0px; }
#pageheader h2 { border-bottom: none; }
#pagecontent { right: 0px; border-top: 2px solid black; border-bottom: 2p=
x solid black; padding: 1em 0px 0px; }
#pagefooter .menublock { border-left-color: black; }
#pagefooter { border-top: none; }
#pagefooter .pagefootercontent { color: black; padding-left: 0px; text-al=
ign: left; font-size: 100%; }
#pagefooter .pagefootercontent a, #pagecontent a { color: black; border-b=
ottom: 1px dotted black; }
#pagecontent h1 { border-color: black; }
}
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/pageframe-right.gif
R0lGODlhGACmALMAAPv78v///+jo4Le3sfDw6NTUzMfHwPX17KamoPn58N/f1wAAAAAAAAAAAAAA
AAAAACH5BAAAAAAALAAAAAAYAKYAAAT/MMiAhilKkJOA/yAwURamcWE6Vle2dSm4li4af3N7wrc4
saZXz5ML2nrFGu+W3A19EqDy2RQOq0fmj+a8bnVW5Ne4jGHLqvHUG+WGtW1w1qzuiuNkav1Nx6/v
JHJoIWd6fnZwgXlsin+JUoh9jZFph3yVk5eEe3OYkJoynIOhlp2bpaM4ooaZpqStqUSrjJ+uqqis
tbFQsLlutrK4tL+7hcOCvsjHi4C6ycyPxM+Oks7L1J7S15Snvdugt97N2uPK5dDV5NHm6+jZ7Onw
7+7d1ufY9erx9K/27fj99M0DGM7fPoLBxP3jFlBePocN+RUU+FBiQoMDGU6EuNEiL4wVfxF+pBhR
pLF7Gi+S7GhyFkpwKjnG9HhyIcyRMnHSdGkTmM6Wwl76rHkw5U+jRDPeTBoSKc+iS58qHSq1adSg
PYtVLekUK1SqXqdqDWsVrMKvY8+KndZVbdm0ILledSvXbFyWbe/OBEoX71y9R/+u3Jt3cGC7hpnW
hZt4q1+fEQAAOw==
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/pageframe-left-160.gif
R0lGODlhoACgAIcAAKamoLe3scfHwNTUzN/f1+jo4PDw6PX17Pn58Pv78v///wAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAACgAKAA
AAj/ABMIHEiwoMGDCBMqXMiwocOHEBkiOGCgAIEBAgIAUMAxosePIEOKHIlwYsWLGTd2JMmypcuX
EU1axKiRowKYOHPqbCkTZc2VO4MKHVqS4syUNokqXRq0J02VN5lKnUrSKVKgVLNqbWj1Z9StYMMW
7ApVrFmxZJOeXZs1LVa2cIm6/Rq3blOjPsva3atzLt+/MP0CHlwV71O1hBN/FKy48UPGjiMrhCy5
8ljDV+la3pyAMufKnj9HDi26MenSiU+jHqx69d/WrvfCjl13Nm24tm+vza3bLO/eYX8D3yp8eFvM
Xo0DLq5cKvPmS59Dl4tc7/S40q/fPXn4rXbf1RF//z+bfTzO8uZfok/PM7x39se5Z4aP1r1m+lTX
4w+pf/9i+/5p1V+AEA1IoEMGHigRgAoylWCDCT0I4UESTniZfMlZOFSFGgrEYYcfahiihSNOWCKE
JzaYooIrHtgigS8GGKN/M+5XI3430pcjfDuy12N6P5oX5HhDflekdkdel+R0S0LXZHNPKhelcVMO
VyVwV/aWpW5b3tYlbV/GFqZrY65WJmpnlpamaGt+1iZnb24Wp2VzgsZghzvVKZmeo92JZ058Ohao
aX7+GVihhro0qGKLpoZooiw1SpikrD0K6UiULmfppfxtyul/GFr3aWGhijeqSJm+5umpj63KKleu
vmW6UKp80SpbrLJGiGuuFO7K64VHZfhrTL4O62Gxxtpql7K1ITsss9g5+yu0uEnLK7VsYbubtblq
Sx63snoLXqnvGTsZuK+KWx+595l7LrvutgpvvLDOS++s6LKqbnD5nrovWHMFBAA7
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/menublock.gif
R0lGODlhBgAKAIAAAP8AAAAAACH5BAAAAAAALAAAAAAGAAoAAAIOjB+gYMu5WoRKVvocOgUAOw==
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/menuback.gif
R0lGODlhFQAWALMAAP8AAPQAAOMAANcAALoAAKkAAP0AAPkAAMoAAOwAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAAAAAAALAAAAAAVABYAAARJEMhJpTkhiYFIqSBwZVv3hdSocR6aYqvpTmrZziJsn3PN
8i6fDCe89XQ/XI6UJCKHRyY0+DRSpVZUEaitckNbZdiJ/YLG0ZgnAgA7
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/pageframe-b-left-160.gif
R0lGODlhwwcRAIcAAP////v78vn58PX17Ojo4PDw6N/f19TUzMfHwLe3saamoPr68fb27ff37vHx
6eLi2vPz6vj47+np4evr49ra0sXFvt7e1r6+t+7u5uXl3dfXz/T069zc1ezs5Li4sczMxMvLw6ur
pc7OxtbWzq+vqcLCu9LSysrKw7Ozre3t5fLy6erq4uPj29DQyO/v59XVzebm3ry8tc3NxeDg2NjY
0Kmpo8jIwbm5sqenoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAADDBxEA
AAj/AAMIHEiwoMGDCBMqXMiwocOHEBkuYOBAwgwNJ2KEAMCxo8ePIEOKHEmypMmTKFOqXMmypcuX
MGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWIWLNq3cq1K8KJDlY8
oPHhAgmraNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/OL0KHky4MFawEx5QEFECBeDHkCNLnky5
suXLmDNr3sy5s+fPoI0aHk269OAFDVR0yMDBRAUPoWPLnk27tu3buHPr3s27t+/fSE0LH05cIWoI
GGBYGAHiAvDn0KNLn069uvXr2LNr3161uPfvwlFv/3AhQXGLCtzTq1/Pvr379/Djy59PnyT4+/gF
L4gwwMGEDBZoIEN9BBZo4IEIJqjgggw26GB+EEYI0QICMICcBCxw8IIMFVzgAQokhFADDgqUaOKJ
KKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRW
aeWVWGap5ZZcdumllRKGKeZBFDawgQMpEPAABxq0AEIFJVwQww0eJGDnnXjmqeeefPbp55+ABiro
oIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6qun
jv8p65gL7GdhAR0QwIIFFIxggggfnGADAsQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx2
6+234IYr7rjklmvuueimq+667Lbr7rvwxivvvPTWa++9+Oar77789mvvrABHWKsADQwAQQEpSJDB
AxZwQAENGrxwwMQUV2zxxRhnrPHGHHfs8ccghyzyyCSXbPLJKKes8sost+zyyzDHLPPMNNds8804
56zzzjz37PPPQAct9NBEF2300UgnrfTSTBcd8NP41RpBwRA4gMEEEsCw8AMzGOD112CHLfbYZJdt
9tlop6322my37fbbcMct99x012333XjnrffefPf/7fffgAcu+OCEF2744YgnrvjijDfu+OOQRy75
5JRXbvnlkUOtuXcDT83ABlW7gEEHE6wgAQGop6766qy37vrrsMcu++y012777bjnrvvuvPfu++/A
By/88MQXb/zxyCev/PLMN+/889BHL/301Fdv/fXYZ6/99tx37/334Ie//ebkD1crhZ4PALoKDrRf
wPvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjM
oAY3yMEOevCDIAyhCEdIwhKa8IQoFGH5Vlia81FIAFNrQAMYQEMGDOCGOMyhDnfIwx768IdADKIQ
wodIxCIa8YhITKISl8jEJjrxiVCMohSnSMUqWvGKWMyiFrfIxS568YtgDKMYx0jGMprxjGhMoxrX
yMY2uvGNcEwjC+c4Ghfa8XwCyKMe98jHPvrxj4AMpCAHSchCGvKQiEykIhfJyEY68pGQjKQkJ0nJ
SlrykpjMpCY3yclOevKToAylKEdJylKa8pSoTKUqV8nKVrrylbCMpSxXScda2vKWuMylLnfJy176
8pfADKYwh0nMYhrzmMhMpjKXycxmeiUgADs=
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/pageframe-b-right.gif
R0lGODlhOAARANUAAP////v78vr68fn58PX17Ojo4PDw6N/f18fHwNTUzLe3saamoPb27ff37vHx
6fPz6uLi2unp4fj4797e1uvr4/T068XFvtra0tfXz+7u5uXl3b6+t9zc1ezs5Li4sdbWzs3NxcvL
w8zMxOPj29DQyODg2O/v59jY0NXVzby8te3t5erq4tLSyubm3srKw7OzrcLCu/Ly6a+vqc7Oxqur
pampo6enobm5ssjIwQAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAA4ABEAAAb/QIBw
SCwaj0hayoUpRRwMQWBKrQaQ2CxWthGdICuo1GrVms8v2OwCoYjJ5bMc6bGwOJpOrDGGT+eARRsh
HxMtGQ98flSBjQAWJGwRJhWKi1eOgCAYExpuBBJ9fgukpaanqKg2NTQyLx4bFiAoHCMRiAwDonAK
vb6/wMHBHjcpGzAWISQYHBAFKg6VupcBCNbX2Nna2zguIjMsHxcTIwUdBg8MobtkCe7v8PHy8ygY
JxccExAaESroBA10sbNyoKDBgwgTKjxQAsK+FhEoZHDwAOA6agEKaNzIsaPHjwUirKDQIYMJihUY
NJAgEKOBlzBjypxJ04CDmzEeVCCgkqWAKJ8YAxAYSrSo0aNIGShV2WDlAIFAgz6dSrWq1atQf2rd
GrSr169dgwAAOw==
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/unixwiz-logo-140x80.gif
R0lGODlhjABQAIcAAAAAAA8AAA8PDx8AABcXFh8fHh8fHy8AAD8AAC4tLC4uLC8vLS8vLzAwLjEx
Lzk5Nzo6OD8+PD8/P18AAH8AAEFBPkJCP0VFQkdGREhHRUhIRUpJR09OS09PTFJRTlZVU1ZWU1dX
VFlZVlpaVl1cWV5dWl5eWl9fW2BfXGBgXWRjYGVkYWloZGtqZmxrZ2xsaG5taW5tanFwbHJxbXd2
cnl4dHp5dXt6dnx7d318eH59eH59eX9+eX9/f78AAIB/e/8AAISDf46MiI6NiJKQi5KRi52blp6c
l56dl6GgmqKgm62spa2sprGvqbSzrbW0rri2r7i2sLi3sLi3sbq4srq5sru5sru5s7y6tLy7tL27
tb28tb68tb68tr+/v8LAucLBusrIwc3LxNTSytTSy9TTy9XUzNfVztvZ0dzb093c1N7c1OHf1+Lg
2OXj2+Xk3Ofl3efl3ujm3ujm3+nn3+ro4Ovp4ezq4uzr4u3r4u3r4/Du5vDv5vPx6fTy6vTz6vXz
6vXz6/b06/b07Pf17Pj27fj27vn37vn37/r47/r48Pv58Pz68f378v38+P79+f///wAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAACMAFAA
AAj/ABsJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mix40UtWapMiUKypEmPKFOqBMCypUuX
LhzCWNAyggkmKnPqbARgAIWfQINOANChycIjAl623LGzaUcACIBInUrVB4AHQsAkFNPy5hYmJpIy
dUoWI1SqaIFYdfDjSqNDjAxGYDnE4I66BI+YiCCmrN+FjM6mnWq1AQ8qcuAaZFnA4VwAW/5KPhg4
6mCphQ8njktwC8sIjllGnkxaYOXLmAEYRqy4c0uGESIkBbAgNt+CRx4XMIE7Ns6DTGL3JWiiwOcj
pE+jzsyaM8HZoBUqbTlaIM2XAoYL/IxwbuOBR6bz/97IqLz58+jLC77MfLPdlgu0291hHICJHfgJ
PjaxZYsJlgIQdB1CLI3ViGcAFHDEFkfUZ6BFaYQ0kkkURgHIIIgsst5g7bVW0H9dKfRYdeDRRdAQ
BQ6EIgB4EQQDSwQZ991AxgWIUQ7TTXfGGngQsmFaHTpX0A4uCfCgfqIZRNOMAzFGkJMFJcXBQEyw
hBxBRAJw5UCPRMQIDgBMENSYFAwAABJNlLHHj2gFudV1LC1w0IiL2ScXjANxwJJ8VWo5EIgGIQhD
QV1CxMgNAPiAGhAIACBDVnWwWZVqmnmIEFItZVcQnXl9ht+n9CUpUJ+D5gmAjQI5COoOIEbHpZeI
Kv+KWqMptBWHpIRR2lxDL0I5EKcDZZmjqAIlhSpPAJS63bDcEVToQ4cmumijBBSgwAO4praaew2F
ZyWSkA3JmG3kCkccS7+tWFBN5dqmrEDPOhStrJc1+pJl7OnKbUMgTvkrsQKtOB5DXAHgr3FyPodn
Q/E2NO+0AHgBycTZqqWvpQsh6GojwApUcMIN1XfgtwTpCcBvDDXM0MOzRjwxJBW76RCC/grUcaoL
M7SiXqca5O3ACxWa3tDmxQqxxBTjy+HFQi4EYosck4xlnA/FyRLQA822pUKPMCJhhRS+McghNkjb
MtIwKw0k0wVtUcCRjXh7bCNZgixgnCQ2gnLJLsn/R+VSBYmxdyOPaMhsS0qscQcNZtfrctKLyjwQ
ggBEAAN+cPrdyGwCRLAAiXAWENt1ecfdEpO4uWRbUhs34kghPZEZVKM0NEHGDI0P1ijaMbNNkBiz
KVWA5gcGH66L02lq0GxQB1rfS1g7EkjFFADwgRBfvEiv7o+nHbnvbe/AgW07DG4QE/htTRD6+DFB
vMf9NSTGEPgNUbrrflAPwAZtvZB7Wrt7We+2hbHSoMQR+VMbWqqXARw4gQX/Q0sAIbcc8BkwJQjU
30u2B0AAMEACIBxgpZp2wY5kUIFUqZ4BQGiACFLFXi5BYa4ISMISbuSEi6peDybWAxdOpVEgCMEI
/0ggwl3Z8IAJzCEAdgiJHnJQggAIwQliUIMi7uuIHMEhanTIQx9KpVEjiEERlmDFAmLxIOnDTX4K
osXLcLGJXmQUAEhQAyaYoYw1PKNrKrcpgOFPf0x0IsRKoAMpuCF2svvJUGi4LGY9RGMogSS48tbG
wbxRkC0rgWYO1xJGIsuRM2tWRyT5r+MNpJJpuWQcG6VJxDwhCTT4wAY0QMta1lIEQeACHVpDnf74
0pePFCVHSGkzP6JygUvs4hNfCIBWyqEPamiCEH7Ag2pa05pBMEIY9JAIzrxGj3ts3c2OmUIArFAC
LVzmD5upGUHcoQxgwAIV5knPeVqhC2Fowx8W4f/NnIGTmFEzpUDIOZXqbXCQmjFEIfhghznI4aEQ
hSgd9PCHbjbJnwfJQ3+0c4QdVGejCemoRxnCvisBdJxJ3CIAKiDEBKySnc1RBCIOQdOa2vQQieCn
c76pEEhiCgBjAahAQHS69zHheQU6qTFT6kYAWOAEMIDAS50JF6INbV0YDdRxXBJUYVpnXPVRXqfG
dZ3riHOp+rtADIjggamOkCI8TQiCCiAAAVxpOADtVYtW1LrNmchUXkWp/jBQgyWowK1GlMhSVjXS
yWXqIAC92of2dC6gvoePk2QjUy0JgAzoAAotAMABEEDa0po2ADC9IkSY9SDKEY+YK8qbtx40G8j/
BhatMpRK9TRwGBdwkiVUzSND2FWurQlVIMR8jFYN5ljMtu22Av1jboGw28OwYQxHkEEKSsDd7np3
BbncpXAXEleEHHdkzv3ksFy1onc196zRJahuAcBbKrQBDdKk5jX3m81tWnQi5bVtesP5pMO5Kktw
Qy98KbnZVNL3MG6gAxniWc8K3zOf+xyvdLL63AG/t8CQ+eUvtYNgAS9Ys/qrLxz8sIeGRvTFcpho
RTW8YQAw5LzEJB1DsuRe5EKXwSlOaCJmetMi57Q8FQnwcvvq4/Tq9cZUW3If49tgZNZ3M1ZNz0WU
3GEmK/h3vqrxQcw6ZSBPt7qJ1QmXCWzigpjM/24IMVnNGiEGOJ2YIPKl7oPTnJM1f7jNBbmOAGDg
yyFwYM4FS9DlTJalO58yfz5JJAUadWUzosTPTfbycR+jlNZ56yUL+jGKf1tpGmvENgSLTY89pupL
cYBzliudGMJyKg5ERgytdpG58AwIJcRylrYMNgrCC85iJ8QRg1hDfvfLX20a+9kKoXCF6XlhaFv7
2tjOtra3ze3JrFEg345buHdgXMZujX1UGrf66NcZcw+JsfdTSBoF0lE1rurd7m5ugavzmFJ5ZmPC
qskef2Ocgf0bq1N7ycYox1WIUO5fJOI0dZrb6T3uu5Q2Onid7jcX0HhrXa1L0EH8iFxfgsh8Pf8F
XNQiblnytrzDFy+miTSO1fshCNd2elLImUzyKHk4Y49dOZISjNUEIyjmUdNTY2iO9D4OCORxi0Bk
ft7zP/UsIv9OCnLmwnKiF9joOSPWXPoUap5HdyCJxhpPAjSXQVH97M31ulwr96LGcB1JEQAVgV5u
8YvyGzL/kfrb4+1XPyHcSYNPCMImcnDR3L2ULtk72G3sd4gXDEVmj7ewUNcImnhGTzxRO7I0T1mJ
HFxP4xPoXOS+rMkj/e7eSfxBkjIEsfRxBwKoEpESXHWWrLohB5+r6vku+YMUrMBIikyfZC+uxrxo
bh2f0qmIvyyOi3whHddqdODU9eFSH2fj0dOJxh5fn9b1hy5b8JvtkfWgx2w9RZ1BkP3k4y3Rucsg
K2LRc6PzaZbzB5gj9310Zjxw9nh8lXCqU1mAxTeUtyIPEnDCBIFehV7RRXOzwXIvcT/wZ153oTli
QCIgFX8jFn/yET/xNzmlI2Lp1zYq+D7qMzna8YF5I4O/ZF6E1204mIM6uIM82IM4GBAAOw==
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/steve-email.gif
R0lGODlhnAAQAPcAAAAAAP//////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////yH5BAEAAAEALAAAAACcABAA
AAj+AAMIHEiwoMGDCBMqXMiwocOHECM2BABAokWKGCtaNEhx48GOHh+CnKgxJMOSA1F6HGkyAMuW
CV8qlAmToMqUNXPqXEgzo0afJX2mRDlSKE6BRn+q7MgUo02lBZvafIpUKVCOFTNG1VqVq0uiVbcO
DTv2a9mgUJGapeqU7Nq3IIvKdSt2K9qycG/2JLo0K9+3YdPCBWz2Zdy/LA8L3vuxL+HDWA3/pboW
Mlu3RR/7rSvZsdS5dbGKlUx3aFvAQNtaTs0Uc1DNsDV73gwar2i2rEs/taz7rOCornGSJi17NO27
tm+PpdmbcuKbu5Fz9K0WNvHnxbtSJkx2OHTdk4lBu8Z+1vTXyedj136ONvx33t3dNz59vj197leP
nnQq1fnvvKFVllp8oeXX1Xc7TZTgggw2mKCBDkYo4YQUVhhhQAAAOw==
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6----
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://www.unixwiz.net/images/feed-icon-14x14.png
iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABGdBTUEAAK/INwWK6QAAABl0RVh0
U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJDSURBVHjajJJNSBRhGMd/887MzrQxRSLb
FuYhoUhEKsMo8paHUKFLdBDrUIdunvq4RdClOq8Hb0FBSAVCUhFR1CGD/MrIJYqs1kLUXd382N35
6plZFOrUO/MMz/vO83+e93n+f+1zF+kQBoOQNLBJg0CTj7z/rvWjGbEOIwKp9O7WkhtQc/wMWrlI
kP8Kc1lMS8eyFHpkpo5SgWCCVO7Z5JARhuz1Qg29fh87u6/9VWL1/SPc4Qy6n8c0FehiXin6dcCQ
aylDMhqGz8ydS2hKkmxNkWxowWnuBLHK6G2C8X6UJkBlxUmNqLYyNbzF74QLDrgFgh9LLE0NsPKx
jW1Hz2EdPIubsOFdH2HgbwAlC4S19dT13o+3pS+vcSfvUcq9YnbwA6muW9hNpym/FWBxfh0CZkKG
kPBZeJFhcWQAu6EN52QGZ/8prEKW+cdXq0039UiLXhUYzdjebOJQQI30UXp6mZn+Dtam32Afu0iy
rgUvN0r+ZQbr8HncSpUVJfwRhBWC0hyGV8CxXBL5SWYf9sYBidYLIG2V87/ifVjTWAX6AlxeK2C0
X8e58hOr/Qa2XJ3iLMWxB1h72tHs7bgryzHAN2o2gJorTrLxRHVazd0o4TXiyV2Yjs90uzauGvvp
pmqcLjwmbZ3V7BO2HOrBnbgrQRqWUgTZ5+Snx4WeKfzCCrmb3axODKNH+vvUyWjqyK4DiKQ0eXSp
FsgVvLJQWpH+xSpr4otg/HI0TR/t97cxTUS+QxIMRTLi/9ZYJPI/AgwAoc3W7ZrqR2IAAAAASUVO
RK5CYII=
------MultipartBoundary--qke6F06zAM2mEmXqPS2aBI4ejdapDj0NAa6p55Gqg6------
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。