Re: strengths and weaknesses of Gnutella

Michael Rogers <[email protected]> Fri, 09 Apr 2010 15:27:53 +0100
Newsgroups gmane.network.gnutella.devel
Message-ID <[email protected]>
--SZ2jvc7kNGo9HV9Nh34pb9cBiB9OxKWJ1sHuyPD
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Arne Babenhauserheide wrote:
> - Weakness: No easy (and low overhead) way to do specialized searches (like
> regexp or metadata - like “show me articles written by Richard M.
> Stallman”).

This is something I miss when using Gnutella. Not so much metadata,
since the quality of most people's metadata seems to be pretty bad, but
slightly more expressive searches, such as "foo OR bar", "foo THEN bar",
or even "(foo THEN (bar OR baz)) AND NOT bam". Could we add something
like that to the protocol in a backwards-compatible way?

Imagine that we put the boolean expression in the GGEP block, for those
peers that understand it. Peers that understand boolean expressions will
use the expression to route the query; peers that don't will use the
query string. How should we create the query string from the boolean
expression, such that the query reaches any peer that might be able to
answer it (including old peers that don't understand boolean
expressions), and can pass through old ultrapeers that don't understand
boolean expressions, while keeping the search as efficient as possible?

AND is easy: the query string for "foo AND bar" is "foo bar".

Similarly, "foo THEN bar" -> "foo bar", which will collect some false
positives from old peers ("bar foo"), but no false negatives.

Terms with NOT can just be omitted from the query string, again
producing false positives but no false negatives: "foo NOT bar" ->
"foo". Remember that new peers will look at the expression and won't
bother sending responses that contain bar, so the false positives will
only come from old peers.

OR is the tricky one. If the boolean expression falls into two or more
disjoint parts, such as "(foo AND bar) OR (baz AND bam)", then we need
to create two separate queries, one for "foo AND bar" and another for
"baz AND bam". But what do we do, for example, with "(foo OR bar) AND
(baz OR bam)"? As far as I can tell, the general solution is to
transform the expression into disjunctive normal form, then create a
separate query for each term of the disjunction - in this case, four
queries: "foo AND baz", "foo AND bam", "bar AND baz", "bar AND bam".

Does this sound like something that might be worth pursuing? The syntax
wouldn't have to look like it does above, of course - in Googlish
syntax, AND is implicit, quotes mean THEN, a minus sign means NOT...
maybe we shouldn't bother with OR at all, since things would be much
simpler without it.

Cheers,
Michael

--SZ2jvc7kNGo9HV9Nh34pb9cBiB9OxKWJ1sHuyPD
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/htm=
l4/strict.dtd">
<html>
<head>
</head>







<body style=3D"background-color: #fff;">
<span style=3D"display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id=3D"ygrp-mlmsg" style=3D"position:relative;">
  <div id=3D"ygrp-msg" style=3D"z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id=3D"ygrp-text" >
=20=20=20=20=20=20
=20=20=20=20=20=20
      <p>Arne Babenhauserheide wrote:<br>
&gt; - Weakness: No easy (and low overhead) way to do specialized searches =
(like<br>
&gt; regexp or metadata - like =E2=80=9Cshow me articles written by Richard=
 M.<br>
&gt; Stallman=E2=80=9D).<br>
<br>
This is something I miss when using Gnutella. Not so much metadata,<br>
since the quality of most people's metadata seems to be pretty bad, but<br>
slightly more expressive searches, such as &quot;foo OR bar&quot;, &quot;fo=
o THEN bar&quot;,<br>
or even &quot;(foo THEN (bar OR baz)) AND NOT bam&quot;. Could we add somet=
hing<br>
like that to the protocol in a backwards-compatibl<wbr>e way?<br>
<br>
Imagine that we put the boolean expression in the GGEP block, for those<br>
peers that understand it. Peers that understand boolean expressions will<br=
>
use the expression to route the query; peers that don't will use the<br>
query string. How should we create the query string from the boolean<br>
expression, such that the query reaches any peer that might be able to<br>
answer it (including old peers that don't understand boolean<br>
expressions)<wbr>, and can pass through old ultrapeers that don't understan=
d<br>
boolean expressions, while keeping the search as efficient as possible?<br>
<br>
AND is easy: the query string for &quot;foo AND bar&quot; is &quot;foo bar&=
quot;.<br>
<br>
Similarly, &quot;foo THEN bar&quot; -&gt; &quot;foo bar&quot;, which will c=
ollect some false<br>
positives from old peers (&quot;bar foo&quot;), but no false negatives.<br>
<br>
Terms with NOT can just be omitted from the query string, again<br>
producing false positives but no false negatives: &quot;foo NOT bar&quot; -=
&gt;<br>
&quot;foo&quot;. Remember that new peers will look at the expression and wo=
n't<br>
bother sending responses that contain bar, so the false positives will<br>
only come from old peers.<br>
<br>
OR is the tricky one. If the boolean expression falls into two or more<br>
disjoint parts, such as &quot;(foo AND bar) OR (baz AND bam)&quot;, then we=
 need<br>
to create two separate queries, one for &quot;foo AND bar&quot; and another=
 for<br>
&quot;baz AND bam&quot;. But what do we do, for example, with &quot;(foo OR=
 bar) AND<br>
(baz OR bam)&quot;? As far as I can tell, the general solution is to<br>
transform the expression into disjunctive normal form, then create a<br>
separate query for each term of the disjunction - in this case, four<br>
queries: &quot;foo AND baz&quot;, &quot;foo AND bam&quot;, &quot;bar AND ba=
z&quot;, &quot;bar AND bam&quot;.<br>
<br>
Does this sound like something that might be worth pursuing? The syntax<br>
wouldn't have to look like it does above, of course - in Googlish<br>
syntax, AND is implicit, quotes mean THEN, a minus sign means NOT...<br>
maybe we shouldn't bother with OR at all, since things would be much<br>
simpler without it.<br>
<br>
Cheers,<br>
Michael<br>
</p>

    </div>
=20=20=20=20=20

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style=3D"color: #fff; height: 0;">__._,_.___</div>

=20=20=20=20=20=20=20=20
=20=20
=20=20=20
    <div id=3D"ygrp-actbar" style=3D"clear: both; margin-bottom: 10px; whit=
e-space: nowrap; color: #666; padding-top: 15px;">
      <div>
        <a href=3D"mailto:[email protected]?subject=3DRe: [the_gdf] stre=
ngths and weaknesses of Gnutella" style=3D"margin-right: 0; padding-right: =
0;">
	  Reply to <span style=3D"font-weight: 700;">sender</span></a> |
        <a href=3D"mailto:[email protected]?subject=3DRe: [the_gdf] s=
trengths and weaknesses of Gnutella">
	  Reply to <span style=3D"font-weight: 700;">group</span></a> |
        	  <a href=3D"http://groups.yahoo.com/group/the_gdf/post;_ylc=3DX3o=
DMTJxZmRza2RrBF9TAzk3MzU5NzE0BGdycElkAzI2ODQyNTMEZ3Jwc3BJZAMxNzA1MDE2MDYxBG=
1zZ0lkAzIzNzA4BHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTI3MDgyMzMxMA--?act=3Dreply&=
messageNum=3D23708">Reply <span style=3D"font-weight: 700;">via web post</s=
pan></a> |
            	<a href=3D"http://groups.yahoo.com/group/the_gdf/post;_ylc=3DX=
3oDMTJlc3AwZGllBF9TAzk3MzU5NzE0BGdycElkAzI2ODQyNTMEZ3Jwc3BJZAMxNzA1MDE2MDYx=
BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTI3MDgyMzMxMA--" style=3D"font-weight: 700=
;">Start a New Topic</a>
      </div>

                <a href=3D"http://groups.yahoo.com/group/the_gdf/message/23=
663;_ylc=3DX3oDMTM2cGhsNDhwBF9TAzk3MzU5NzE0BGdycElkAzI2ODQyNTMEZ3Jwc3BJZAMx=
NzA1MDE2MDYxBG1zZ0lkAzIzNzA4BHNlYwNmdHIEc2xrA3Z0cGMEc3RpbWUDMTI3MDgyMzMxMAR=
0cGNJZAMyMzY2Mw--">Messages in this topic</a>
          (<span style=3D"font-weight: 700;">25</span>)
          </div>=20
<!------- Start Nav Bar ------>

<!-- |**|begin egp html banner|**| -->
<div id=3D"ygrp-vital" style=3D"background-color: #e0ecee; font-family: Ver=
dana; font-size: 10px; margin-bottom: 10px; padding: 10px;">
      <span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-tran=
sform: uppercase; ">Recent Activity:</span>

    <ul style=3D"list-style-type: none; margin: 0; padding: 0; display: inl=
ine;">
            <li style=3D"border-right: 1px solid #000; font-weight: 700; di=
splay: inline; padding: 0 5px; margin-left: 0;">
      <span class=3D"cat"><a href=3D"http://groups.yahoo.com/group/the_gdf/=
members;_ylc=3DX3oDMTJmNjVxbTdnBF9TAzk3MzU5NzE0BGdycElkAzI2ODQyNTMEZ3Jwc3BJ=
ZAMxNzA1MDE2MDYxBHNlYwN2dGwEc2xrA3ZtYnJzBHN0aW1lAzEyNzA4MjMzMTA-?o=3D6" sty=
le=3D"text-decoration: none;">New Members</a></span>
      <span class=3D"ct" style=3D"color: #ff7900;">1</span>
    </li>
                                              </ul>
=20=20=20=20
  <div style=3D"clear: both; padding-top: 2px; color: #1e66ae;">
    <a href=3D"http://groups.yahoo.com/group/the_gdf;_ylc=3DX3oDMTJlN3FicmV=
qBF9TAzk3MzU5NzE0BGdycElkAzI2ODQyNTMEZ3Jwc3BJZAMxNzA1MDE2MDYxBHNlYwN2dGwEc2=
xrA3ZnaHAEc3RpbWUDMTI3MDgyMzMxMA--" style=3D"text-decoration: none;">Visit =
Your Group</a>
  </div>
</div>

              <div id=3D"ygrp-mkp" style=3D"border: 1px solid #d8d8d8; clea=
r: both; float: left; font-family: Arial; margin: 5px 0 10px 0; padding: 0 =
10px;">
      <div id=3D"hd" style=3D"color: #628c2a; font-size: 85%; font-weight: =
700; line-height: 122%; margin: 10px 0;">MARKETPLACE</div>
      <div id=3D"ads" style=3D"margin-bottom: 10px;">
                  <div class=3D"ad" style=3D"color: #628C2A; font-family: A=
rial; font-weight: 700; padding: 0 0;">
            <p><a href=3D"http://us.ard.yahoo.com/SIG=3D15o3ak73t/M=3D49306=
4.13983314.13965207.13298430/D=3Dgroups/S=3D1705016061:MKP1/Y=3DYAHOO/EXP=
=3D1270830511/L=3D2bcb0a46-43e4-11df-bac1-7310457ab8a3/B=3DW_FcD9j8fcM-/J=
=3D1270823311080645/K=3Drp7YI1d5meFHKi4AASP2Pg/A=3D6046497/R=3D0/SIG=3D11jl=
s91tg/*http://advision.webevents.yahoo.com/domorefordogs">Do More for Dogs =
Group. Connect with other dog owners who do more.</a></p> <script language=
=3Djavascript>
if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object();
window.yzq_d['W_FcD9j8fcM-']=3D'&U=3D13cibn2c8%2fN%3dW_FcD9j8fcM-%2fC%3d493=
064.13983314.13965207.13298430%2fD%3dMKP1%2fB%3d6046497%2fV%3d1';
</script><noscript><img width=3D1 height=3D1 alt=3D"" src=3D"http://us.bc.y=
ahoo.com/b?P=3D2bcb0a46-43e4-11df-bac1-7310457ab8a3&T=3D1d99hvf5p%2fX%3d127=
0823311%2fE%3d1705016061%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO=
%2fF%3d1405375367%2fH%3dY29udGVudD0iR3JvdXBzO1dlYnNpdGVfU2VydmljZXM7UG9sbHM=
7QnJpZWZjYXNlO0ZsaWNrcjtHZW9jaXRpZXM7UGhvdG9zO1lhaG9vX1RlY2g7TWVtYmVyX0Rpcm=
VjdG9yeTtQb2RjYXN0czsiIGRpc2FibGVzaHVmZmxpbmc9IjEiIHNlcnZlSWQ9IjJiY2IwYTQ2L=
TQzZTQtMTFkZi1iYWMxLTczMTA0NTdhYjhhMyIgc2l0ZUlkPSIyNzk2MDUxIiB0U3RtcD0iMTI3=
MDgyMzMxMTA3MzY4NiIg%2fQ%3d-1%2fS%3d1%2fJ%3d25228962&U=3D13cibn2c8%2fN%3dW_=
FcD9j8fcM-%2fC%3d493064.13983314.13965207.13298430%2fD%3dMKP1%2fB%3d6046497=
%2fV%3d1"></noscript>          </div>
                          <div class=3D"ad" style=3D"color: #628C2A; font-f=
amily: Arial; font-weight: 700; padding: 0 0;">
                          <hr style=3D"border: 1px solid #d8d8d8;">
                        <p><a href=3D"http://us.ard.yahoo.com/SIG=3D15o98se=
9a/M=3D493064.13814537.13965224.10835568/D=3Dgroups/S=3D1705016061:MKP1/Y=
=3DYAHOO/EXP=3D1270830511/L=3D2bcb0a46-43e4-11df-bac1-7310457ab8a3/B=3DXPFc=
D9j8fcM-/J=3D1270823311080645/K=3Drp7YI1d5meFHKi4AASP2Pg/A=3D6042764/R=3D0/=
SIG=3D11jbo19n3/*http://advision.webevents.yahoo.com/momconnection">Welcome=
 to Mom Connection! Share stories, news and more with moms like you.</a></p=
><script language=3Djavascript>
if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object();
window.yzq_d['XPFcD9j8fcM-']=3D'&U=3D13cbn4a8m%2fN%3dXPFcD9j8fcM-%2fC%3d493=
064.13814537.13965224.10835568%2fD%3dMKP1%2fB%3d6042764%2fV%3d1';
</script><noscript><img width=3D1 height=3D1 alt=3D"" src=3D"http://us.bc.y=
ahoo.com/b?P=3D2bcb0a46-43e4-11df-bac1-7310457ab8a3&T=3D1d9dpog5b%2fX%3d127=
0823311%2fE%3d1705016061%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO=
%2fF%3d2948163806%2fH%3dY29udGVudD0iR3JvdXBzO1dlYnNpdGVfU2VydmljZXM7UG9sbHM=
7QnJpZWZjYXNlO0ZsaWNrcjtHZW9jaXRpZXM7UGhvdG9zO1lhaG9vX1RlY2g7TWVtYmVyX0Rpcm=
VjdG9yeTtQb2RjYXN0czsiIGRpc2FibGVzaHVmZmxpbmc9IjEiIHNlcnZlSWQ9IjJiY2IwYTQ2L=
TQzZTQtMTFkZi1iYWMxLTczMTA0NTdhYjhhMyIgc2l0ZUlkPSIyNzk2MDUxIiB0U3RtcD0iMTI3=
MDgyMzMxMTA3MzY4NiIg%2fQ%3d-1%2fS%3d1%2fJ%3d25228962&U=3D13cbn4a8m%2fN%3dXP=
FcD9j8fcM-%2fC%3d493064.13814537.13965224.10835568%2fD%3dMKP1%2fB%3d6042764=
%2fV%3d1"></noscript>          </div>
                          <div class=3D"ad" style=3D"color: #628C2A; font-f=
amily: Arial; font-weight: 700; padding: 0 0;">
                          <hr style=3D"border: 1px solid #d8d8d8;">
                        <p><a href=3D"http://us.ard.yahoo.com/SIG=3D15ocg1o=
1q/M=3D493064.14012770.13963757.13298430/D=3Dgroups/S=3D1705016061:MKP1/Y=
=3DYAHOO/EXP=3D1270830511/L=3D2bcb0a46-43e4-11df-bac1-7310457ab8a3/B=3DXfFc=
D9j8fcM-/J=3D1270823311080645/K=3Drp7YI1d5meFHKi4AASP2Pg/A=3D6015306/R=3D0/=
SIG=3D11vlkvigg/*http://advision.webevents.yahoo.com/hobbiesandactivitieszo=
ne/">Hobbies & Activities Zone: Find others who share your passions! Explor=
e new interests.</a></p><script language=3Djavascript>
if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object();
window.yzq_d['XfFcD9j8fcM-']=3D'&U=3D13coa0epj%2fN%3dXfFcD9j8fcM-%2fC%3d493=
064.14012770.13963757.13298430%2fD%3dMKP1%2fB%3d6015306%2fV%3d1';
</script><noscript><img width=3D1 height=3D1 alt=3D"" src=3D"http://us.bc.y=
ahoo.com/b?P=3D2bcb0a46-43e4-11df-bac1-7310457ab8a3&T=3D1d9ilcfjc%2fX%3d127=
0823311%2fE%3d1705016061%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO=
%2fF%3d4195723302%2fH%3dY29udGVudD0iR3JvdXBzO1dlYnNpdGVfU2VydmljZXM7UG9sbHM=
7QnJpZWZjYXNlO0ZsaWNrcjtHZW9jaXRpZXM7UGhvdG9zO1lhaG9vX1RlY2g7TWVtYmVyX0Rpcm=
VjdG9yeTtQb2RjYXN0czsiIGRpc2FibGVzaHVmZmxpbmc9IjEiIHNlcnZlSWQ9IjJiY2IwYTQ2L=
TQzZTQtMTFkZi1iYWMxLTczMTA0NTdhYjhhMyIgc2l0ZUlkPSIyNzk2MDUxIiB0U3RtcD0iMTI3=
MDgyMzMxMTA3MzY4NiIg%2fQ%3d-1%2fS%3d1%2fJ%3d25228962&U=3D13coa0epj%2fN%3dXf=
FcD9j8fcM-%2fC%3d493064.14012770.13963757.13298430%2fD%3dMKP1%2fB%3d6015306=
%2fV%3d1"></noscript>          </div>
              </div>
    </div>
=20=20
<div id=3D"ft" style=3D"font-family: Arial; font-size: 11px; margin-top: 5p=
x; padding: 0 2px 0 0; clear: both;">
  <a href=3D"http://groups.yahoo.com/;_ylc=3DX3oDMTJkbDc5dGdjBF9TAzk3MzU5Nz=
E0BGdycElkAzI2ODQyNTMEZ3Jwc3BJZAMxNzA1MDE2MDYxBHNlYwNmdHIEc2xrA2dmcARzdGltZ=
QMxMjcwODIzMzEw" style=3D"float: left;"><img src=3D"http://l.yimg.com/a/i/u=
s/yg/logo/us.gif" height=3D"15" width=3D"137" alt=3D"Yahoo! Groups" style=
=3D"border: 0;"/></a>
  <div style=3D"color: #747575; float: right;">Switch to: <a href=3D"mailto=
:[email protected]?subject=3DChange Delivery Format: Trad=
itional" style=3D"text-decoration: none;">Text-Only</a>, <a href=3D"mailto:=
[email protected]?subject=3DEmail Delivery: Digest" class=3D"m=
argin-rt" style=3D"text-decoration: none;">Daily Digest</a> &bull; <a href=
=3D"mailto:[email protected]?subject=3DUnsubscribe" style=
=3D"text-decoration: none;">Unsubscribe</a> &bull; <a href=3D"http://docs.y=
ahoo.com/info/terms/" style=3D"text-decoration: none;">Terms of Use</a></di=
v>
</div>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id=3D"ygrp-sponsor" style=3D"width:160px; float:right; clear:none; m=
argin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id=3D"ygrp-reco">
     </div>
<!-- End Recommendations -->



  </div>   <!-- |**|end egp html banner|**| -->

  <div style=3D"clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src=3D"http://geo.yahoo.com/serv?s=3D97359714/grpId=3D2684253/grpspI=
d=3D1705016061/msgId=3D23708/stime=3D1270823310/nc1=3D5191954/nc2=3D5733770=
/nc3=3D5741391" width=3D"1" height=3D"1"> <br>

<div style=3D"color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type=3D"text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  a {
    color: #1e66ae;
  }

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
=20=20
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.fi=
le-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div=
.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }

  #ygrp-mlmsg a {
    color: #1E66AE;
  }

  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  }=20

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important;=20
  }=20
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--SZ2jvc7kNGo9HV9Nh34pb9cBiB9OxKWJ1sHuyPD--