Re: 2nd gen Io

Steve Dekorte <[email protected]> Fri, 14 Mar 2014 20:32:31 -0700
Newsgroups gmane.comp.lang.io
Message-ID <[email protected]>
--E-5JEZmcvyExTQ8lkDhXMGbSzJkdyrU5RN9LBFU
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable


Right the domain object is the top of the ownership hierarchy of the object=
s beneath it, owns the only execution context that ever directly interacts =
with those objects. Any message to an object in its domain is routed throug=
h the domain object and put on its actor message queue for execution. Even =
though the domain object itself is not the target, it will verify the autho=
rity of the message and dispatch it to the appropriate target in its own ex=
ecution context.

> On Mar 13, 2014, at 9:33 AM, [email protected] wrote:
>=20
>=20
>=20
> Sorry for the following dumb question :)
>=20
> "Any object can become a domain ..."
>=20
> In IO2, if I understand correctly, we have objects that represent executi=
on
> threads, these objects are called domains, and they "run" other objects (=
those
> that belong to them)?
>=20
>=20
>=20
>=20
>=20
>=20
>=20
>=20
> Selon Steve Dekorte <[email protected]>:
>=20
>>=20
>> I=C2=92d like to make the things that tend to be re-implemented in typic=
al
>> projects part of the language - security, persistence, concurrency,
>> distribution and user interaction. All of these could be seen as mapping
>> problems and their solution as adding explicit mapping boundaries.
>>=20
>> The first idea (which was probably already done in Smalltalk in 1980s) i=
s to
>> add a pointer to each object in the system to it=C2=92s =C2=93owner=C2=
=94 and have object
>> ownership domains where the domain leader is an actor/process whose exec=
ution
>> thread is used for processing all messages sent to objects within it=C2=
=92s
>> domain. Any object can become a domain of the objects below it in the
>> ownership graph. Domain boundaries are used to solve the problems of sec=
urity
>> (tracking and verifying authority to invoke behaviors), concurrency (avo=
id
>> unexpected state changes, closely associate execution with the state it =
will
>> be working on), distribution and persistence (boundaries determine the s=
tate
>> which needs to be persisted or moved).
>>=20
>> Part of the persistence component is to support the indexing and lazy lo=
ading
>> of individual objects and standard representations that can be externall=
y
>> manipulated and returned and merged with an optimistic locking mechanism=
.
>>=20
>> The user interaction part involves extending slots to have metadata and =
a
>> standard set of properties which are used for the interface mapping.
>>=20
>> This would be a big project but hopefully there will be time in the futu=
re to
>> take a stab at it.
>>=20
>> Sorry for the delay in responding,
>> Steve
>>=20
>>> On Feb 24, 2014, at 6:06 AM, [email protected] wrote:
>>> Come on Steve, there are Io fans who wanna hear about it! Let us chat.
>>>=20
>>> Selon Steve Dekorte <[email protected]>:
>>>>=20
>>>>> On Feb 19, 2014, at 1:28 AM, [email protected] wrote:
>>>>> Hi all,
>>>>>=20
>>>>> When there's no matching slot, the "forward" slot is activated.
>>>>>=20
>>>>> I have this idea about a "before" slot:
>>>>>=20
>>>>> If "before" doesn't exist, everything works as usual.
>>>>>=20
>>>>> If "before" exists, it is always activated (and it receives the messa=
ge)
>>>> before
>>>>> the slot lookup. Then, it produces a message (possibly the same) whic=
h
>> will
>>>> be
>>>>> treated as usual.
>>>>>=20
>>>>> This could be used to test whether the sender as the "right" to acces=
s a
>>>>> particular slot, for example.
>>>>=20
>>>> Hi Julien,
>>>>=20
>>>> I like the idea. On my list for a 2nd gen Io is some form of support f=
or
>>>> rights on all objects.
>>>>=20
>>>>> Is there already a way to do this at user level?
>>>>=20
>>>> You can get the same effect using a proxy to forward message to the re=
al
>>>> object.
>>>> Io uses proxies for futures and supports turning all references of one
>> object
>>>> to another.
>>>>=20
>>>>> Also, would anybody have a little constructive criticism about Io?
>>>>=20
>>>> Always welcome! :)
>>>>=20
>>>> Steve
>>=20
>>=20
>>=20
>>=20
>>=20
>> ------------------------------------
>>=20
>> Yahoo Groups Links
>=20
>=20
>=20
>=20
> ------------------------------------
>=20
> Yahoo Groups Links
>=20
>=20
>=20
>=20


--E-5JEZmcvyExTQ8lkDhXMGbSzJkdyrU5RN9LBFU
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>






=20
<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><br>
Right the domain object is the top of the ownership hierarchy of the object=
s beneath it, owns the only execution context that ever directly interacts =
with those objects. Any message to an object in its domain is routed throug=
h the domain object and put on its actor message queue for execution. Even =
though the domain object itself is not the target, it will verify the autho=
rity of the message and dispatch it to the appropriate target in its own ex=
ecution context.<br>
<br>
&gt; On Mar 13, 2014, at 9:33 AM, [email protected] wrote:<br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; Sorry for the following dumb question :)<br>
&gt; <br>
&gt; &quot;Any object can become a domain ...&quot;<br>
&gt; <br>
&gt; In IO2, if I understand correctly, we have objects that represent exec=
ution<br>
&gt; threads, these objects are called domains, and they &quot;run&quot; ot=
her objects (those<br>
&gt; that belong to them)?<br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; Selon Steve Dekorte &lt;[email protected]&gt;:<br>
&gt; <br>
&gt;&gt; <br>
&gt;&gt; I=C2=92d like to make the things that tend to be re-implemented in=
 typical<br>
&gt;&gt; projects part of the language - security, persistence, concurrency=
,<br>
&gt;&gt; distribution and user interaction. All of these could be seen as m=
apping<br>
&gt;&gt; problems and their solution as adding explicit mapping boundaries.=
<br>
&gt;&gt; <br>
&gt;&gt; The first idea (which was probably already done in Smalltalk in 19=
80s) is to<br>
&gt;&gt; add a pointer to each object in the system to it=C2=92s =C2=93owne=
r=C2=94 and have object<br>
&gt;&gt; ownership domains where the domain leader is an actor/process whos=
e execution<br>
&gt;&gt; thread is used for processing all messages sent to objects within =
it=C2=92s<br>
&gt;&gt; domain. Any object can become a domain of the objects below it in =
the<br>
&gt;&gt; ownership graph. Domain boundaries are used to solve the problems =
of security<br>
&gt;&gt; (tracking and verifying authority to invoke behaviors), concurrenc=
y (avoid<br>
&gt;&gt; unexpected state changes, closely associate execution with the sta=
te it will<br>
&gt;&gt; be working on), distribution and persistence (boundaries determine=
 the state<br>
&gt;&gt; which needs to be persisted or moved).<br>
&gt;&gt; <br>
&gt;&gt; Part of the persistence component is to support the indexing and l=
azy loading<br>
&gt;&gt; of individual objects and standard representations that can be ext=
ernally<br>
&gt;&gt; manipulated and returned and merged with an optimistic locking mec=
hanism.<br>
&gt;&gt; <br>
&gt;&gt; The user interaction part involves extending slots to have metadat=
a and a<br>
&gt;&gt; standard set of properties which are used for the interface mappin=
g.<br>
&gt;&gt; <br>
&gt;&gt; This would be a big project but hopefully there will be time in th=
e future to<br>
&gt;&gt; take a stab at it.<br>
&gt;&gt; <br>
&gt;&gt; Sorry for the delay in responding,<br>
&gt;&gt; Steve<br>
&gt;&gt; <br>
&gt;&gt;&gt; On Feb 24, 2014, at 6:06 AM, [email protected] wrote:<br>
&gt;&gt;&gt; Come on Steve, there are Io fans who wanna hear about it! Let =
us chat.<br>
&gt;&gt;&gt; <br>
&gt;&gt;&gt; Selon Steve Dekorte &lt;[email protected]&gt;:<br>
&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt;&gt; On Feb 19, 2014, at 1:28 AM, [email protected] wro=
te:<br>
&gt;&gt;&gt;&gt;&gt; Hi all,<br>
&gt;&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt;&gt; When there&#39;s no matching slot, the &quot;forward&q=
uot; slot is activated.<br>
&gt;&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt;&gt; I have this idea about a &quot;before&quot; slot:<br>
&gt;&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt;&gt; If &quot;before&quot; doesn&#39;t exist, everything wo=
rks as usual.<br>
&gt;&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt;&gt; If &quot;before&quot; exists, it is always activated (=
and it receives the message)<br>
&gt;&gt;&gt;&gt; before<br>
&gt;&gt;&gt;&gt;&gt; the slot lookup. Then, it produces a message (possibly=
 the same) which<br>
&gt;&gt; will<br>
&gt;&gt;&gt;&gt; be<br>
&gt;&gt;&gt;&gt;&gt; treated as usual.<br>
&gt;&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt;&gt; This could be used to test whether the sender as the &=
quot;right&quot; to access a<br>
&gt;&gt;&gt;&gt;&gt; particular slot, for example.<br>
&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt; Hi Julien,<br>
&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt; I like the idea. On my list for a 2nd gen Io is some form =
of support for<br>
&gt;&gt;&gt;&gt; rights on all objects.<br>
&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt;&gt; Is there already a way to do this at user level?<br>
&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt; You can get the same effect using a proxy to forward messa=
ge to the real<br>
&gt;&gt;&gt;&gt; object.<br>
&gt;&gt;&gt;&gt; Io uses proxies for futures and supports turning all refer=
ences of one<br>
&gt;&gt; object<br>
&gt;&gt;&gt;&gt; to another.<br>
&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt;&gt; Also, would anybody have a little constructive critici=
sm about Io?<br>
&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt; Always welcome! :)<br>
&gt;&gt;&gt;&gt; <br>
&gt;&gt;&gt;&gt; Steve<br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; <br>
&gt;&gt; ------------------------------------<br>
&gt;&gt; <br>
&gt;&gt; Yahoo Groups Links<br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; ------------------------------------<br>
&gt; <br>
&gt; Yahoo Groups Links<br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt; <br>
<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=20=20=20
    <div style=3D"clear:both"> </div>

    <table cellspacing=3D4px style=3D"margin-top: 20px; margin-bottom: 10px=
;">
      <tbody>
        <tr>
          <td style=3D"font-size: 12px; font-family: arial; font-weight: bo=
ld; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1=
px solid #EAEAEA "  >
                          <a style=3D"text-decoration: none; color: #2D50FD=
" href=3D"https://groups.yahoo.com/group/iolanguage/post;_ylc=3DX3oDMTJxNHR=
pY3F0BF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAz=
EzMzYxBHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTM5NDg1NDUyNA--?act=3Dreply&messageN=
um=3D13361">Reply via web post</a>
                      </td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; "=
 >
            <a href=3D"mailto:[email protected]?subject=3DRe%3A%20%5BIo%5D%=
202nd%20gen%20Io" style=3D"text-decoration: none; color: #2D50FD;">
              Reply to sender            </a>=20
          </td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; "=
>
            <a href=3D"mailto:[email protected]?subject=3DRe%3A%20=
%5BIo%5D%202nd%20gen%20Io" style=3D"text-decoration: none; color: #2D50FD">
              Reply to group            </a>=20
          </td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; "=
 >
            <a href=3D"https://groups.yahoo.com/group/iolanguage/post;_ylc=
=3DX3oDMTJlMW9rc2Q4BF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2=
NzY0BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTM5NDg1NDUyNA--" style=3D"text-decorat=
ion: none; color: #2D50FD">Start a New Topic</a>
          </td>
          <td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px; color: #2D50FD; background-color: #F2F2F2; border: 1px solid #EAEAEA=
; " >
                            <a href=3D"https://groups.yahoo.com/group/iolan=
guage/message/13345;_ylc=3DX3oDMTM2NmUycGljBF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0=
NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAzEzMzYxBHNlYwNmdHIEc2xrA3Z0cGMEc3RpbWU=
DMTM5NDg1NDUyNAR0cGNJZAMxMzM0NQ--" style=3D"text-decoration: none; color: #=
2D50FD;">Messages in this topic</a>
                (13)
                      </td>
        </tr>
      </tbody>
    </table>

=20=20=20=20=20=20=20=20
<!------- Start Nav Bar ------>
<!-- |**|begin egp html banner|**| -->
<!-- |**|end egp html banner|**| -->




=20

<!-- |**|begin egp html banner|**| -->
<div id=3D"ygrp-vital" style=3D"background-color: #f2f2f2; font-family: Ver=
dana; font-size: 10px; margin-bottom: 10px; padding: 10px;">

    <span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-transf=
orm: uppercase; "><a href=3D"https://groups.yahoo.com/group/iolanguage;_ylc=
=3DX3oDMTJlMGExZzdyBF9TAzk3MzU5NzE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2=
NzY0BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTM5NDg1NDUyNA--" style=3D"text-decorat=
ion: none;">Visit Your Group</a></span>

     <ul style=3D"list-style-type: none; margin: 0; padding: 0; display: in=
line;">
                                                    </ul>
  </div>


<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"https://groups.yahoo.com/;_ylc=3DX3oDMTJkYWZiZTNyBF9TAzk3MzU5N=
zE0BGdycElkAzY2Nzc0NzYEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA2dmcARzdGlt=
ZQMxMzk0ODU0NTI0" style=3D"float: left;"><img src=3D"http://l.yimg.com/ru/s=
tatic/images/yg/img/email/new_logo/logo-groups-137x15.png" height=3D"15" wi=
dth=3D"137" alt=3D"Yahoo! Groups" style=3D"border: 0;"/></a>
  <div style=3D"color: #747575; float: right;"> &bull; <a href=3D"https://i=
nfo.yahoo.com/privacy/us/yahoo/groups/details.html" style=3D"text-decoratio=
n: none;">Privacy</a> &bull; <a href=3D"mailto:iolanguage-unsubscribe@yahoo=
groups.com?subject=3DUnsubscribe" style=3D"text-decoration: none;">Unsubscr=
ibe</a> &bull; <a href=3D"https://info.yahoo.com/legal/us/yahoo/utos/terms/=
" style=3D"text-decoration: none;">Terms of Use</a> </div>
</div>

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

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

=20
  <!-- 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=3D6677476/grpspI=
d=3D1705006764/msgId=3D13361/stime=3D1394854524" 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 p {
  margin: 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;
}

  #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-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 -->


--E-5JEZmcvyExTQ8lkDhXMGbSzJkdyrU5RN9LBFU--