<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
code
        {mso-style-priority:99;
        font-family:"Courier New";}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle22
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1157378535;
        mso-list-template-ids:1424918674;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:72.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:"Courier New";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:108.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:144.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:180.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:216.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:252.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:288.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:324.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Friends<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Random number generation lies far outside my expertise, but I know it to be an area where it’s easy to mess up, either in performance or in generating genuinely random numbers.  So I’m delighted
 that Dominic and his colleagues have been working so hard on this.   We all owe them a debt of thanks.  Good RNGs are at the beating heart of many other algorithms, but are rather un-loved as an object of study in their own right.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">So thank you Dominic, @curiousleo @lehins  -- and indeed Guy Steele and colleagues, on whose work this is based.  We don’t often get perf boosts of 1000x!<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">I hope that that, after suitable scrutiny and refinement if necessary, this ends up being accepted.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Simon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Libraries <libraries-bounces@haskell.org>
<b>On Behalf Of </b>dominic@steinitz.org<br>
<b>Sent:</b> 26 May 2020 11:00<br>
<b>To:</b> libraries <libraries@haskell.org><br>
<b>Cc:</b> Alexey Kuleshevich <alexey@kuleshevi.ch><br>
<b>Subject:</b> Improving Random<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Hello Libraries,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">You may recall that following the blog
<a href="https://alexey.kuleshevi.ch/blog/2019/12/21/random-benchmarks/">post</a> by @lehins, a group of us (@curiousleo, @lehins and me) invited participation in
<a href="https://mail.haskell.org/pipermail/libraries/2020-February/030261.html">
February</a> to take this work and apply it to improving the current <code><span style="font-size:10.0pt">random</span></code> library.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Our proximate goals were to fix
<a href="https://github.com/haskell/random/issues/25">#25</a> (filed in 2015) and
<a href="https://github.com/haskell/random/issues/51">#51</a> (filed in 2018). After a lot of discussion and experimentation, we have a proposal that addresses both these issues and also:
<a href="https://github.com/haskell/random/issues/26">#26</a>, <a href="https://github.com/haskell/random/issues/44">
#44</a>, <a href="https://github.com/haskell/random/issues/53">#53</a>, <a href="https://github.com/haskell/random/issues/55">
#55</a>, <a href="https://github.com/haskell/random/issues/58">#58</a> and <a href="https://github.com/haskell/random/issues/59">
#59</a>.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">For backwards compatibility, the proposal retains the old style classes and enhances them. Thus in 1.1 we have<o:p></o:p></p>
<pre><code>class RandomGen g where<o:p></o:p></code></pre>
<pre><code>    next :: g -> (Int, g)<o:p></o:p></code></pre>
<pre><code>    genRange :: g -> (Int, Int)<o:p></o:p></code></pre>
<pre><code>    split :: g -> (g, g)<o:p></o:p></code></pre>
<pre><code>    {-# MINIMAL next, split #-}<o:p></o:p></code></pre>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">and in 1.2 we have<o:p></o:p></p>
<pre><code>class RandomGen g where<o:p></o:p></code></pre>
<pre><code>    next :: g -> (Int, g)<o:p></o:p></code></pre>
<pre><code>    genWord8 :: g -> (Word8, g)<o:p></o:p></code></pre>
<pre><code>    genWord16 :: g -> (Word16, g)<o:p></o:p></code></pre>
<pre><code>    genWord32 :: g -> (Word32, g)<o:p></o:p></code></pre>
<pre><code>    genWord64 :: g -> (Word64, g)<o:p></o:p></code></pre>
<pre><code>    genWord32R :: Word32 -> g -> (Word32, g)<o:p></o:p></code></pre>
<pre><code>    genWord64R :: Word64 -> g -> (Word64, g)<o:p></o:p></code></pre>
<pre><code>    genShortByteString :: Int<o:p></o:p></code></pre>
<pre><code>        -> g -> (Data.ByteString.Short.Internal.ShortByteString, g)<o:p></o:p></code></pre>
<pre><code>    genRange :: g -> (Int, Int)<o:p></o:p></code></pre>
<pre><code>    split :: g -> (g, g)<o:p></o:p></code></pre>
<pre><code>    {-# MINIMAL split, (genWord32 | genWord64 | next, genRange) #-}<o:p></o:p></code></pre>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">and
<code><span style="font-size:10.0pt">next</span></code> and <code><span style="font-size:10.0pt">genRange</span></code> are deprecated. This interface is what allows the significantly faster performance as no longer is everything forced to go via
<code><span style="font-size:10.0pt">Integer</span></code>.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Several new interfaces are introduced and it is recommended that new applications use these and, where feasible, existing applications migrate to using them.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">The major API addition in this PR is the definition of a new class
<code><span style="font-size:10.0pt">MonadRandom</span></code>:<o:p></o:p></p>
<pre><code>-- | 'MonadRandom' is an interface to monadic pseudo-random number generators.<o:p></o:p></code></pre>
<pre><code>class Monad m => MonadRandom g s m | g m -> s where<o:p></o:p></code></pre>
<pre><code>{-# MINIMAL freezeGen,thawGen,(uniformWord32|uniformWord64) #-}<o:p></o:p></code></pre>
<pre><code><o:p> </o:p></code></pre>
<pre><code>    type Frozen g = (f :: Type) | f -> g<o:p></o:p></code></pre>
<pre><code>    freezeGen :: g s -> m (Frozen g)<o:p></o:p></code></pre>
<pre><code>    thawGen :: Frozen g -> m (g s)<o:p></o:p></code></pre>
<pre><code><o:p> </o:p></code></pre>
<pre><code>    uniformWord32 :: g s -> m Word32 -- default implementation in terms of uniformWord64<o:p></o:p></code></pre>
<pre><code>    uniformWord64 :: g s -> m Word64 -- default implementation in terms of uniformWord32<o:p></o:p></code></pre>
<pre><code>    -- plus methods for other word sizes and for byte strings<o:p></o:p></code></pre>
<pre><code>    -- all have default implementations so the MINIMAL pragma holds<o:p></o:p></code></pre>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Conceptually, in
<code><span style="font-size:10.0pt">MonadRandom g s m</span></code>, <code><span style="font-size:10.0pt">g s</span></code> is the type of the generator,
<code><span style="font-size:10.0pt">s</span></code> is the state type, and <code>
<span style="font-size:10.0pt">m</span></code> the underlying monad. Via the functional dependency
<code><span style="font-size:10.0pt">g m -> s</span></code>, the state type is determined by the generator and monad.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><code><span style="font-size:10.0pt">Frozen</span></code> is the type of the generator's state "at rest". It is defined as an injective type family via
<code><span style="font-size:10.0pt">f -> g</span></code>, so there is no ambiguity as to which
<code><span style="font-size:10.0pt">g</span></code> any <code><span style="font-size:10.0pt">Frozen g</span></code> belongs to.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">This definition is generic enough to accommodate, for example, the
<code><span style="font-size:10.0pt">Gen</span></code> type from <code><span style="font-size:10.0pt">mwc-random</span></code>, which itself abstracts over the underlying primitive monad and state token. This is the full instance declaration (provided here
 as an example - this instance is not part of <code><span style="font-size:10.0pt">random</span></code> as
<code><span style="font-size:10.0pt">random</span></code> does not depend on <code>
<span style="font-size:10.0pt">mwc-random</span></code>):<o:p></o:p></p>
<pre><code>instance (s ~ PrimState m, PrimMonad m) => MonadRandom MWC.Gen s m where<o:p></o:p></code></pre>
<pre><code>    type Frozen MWC.Gen = MWC.Seed<o:p></o:p></code></pre>
<pre><code>    freezeGen = MWC.save<o:p></o:p></code></pre>
<pre><code>    thawGen = MWC.restore<o:p></o:p></code></pre>
<pre><code><o:p> </o:p></code></pre>
<pre><code>    uniformWord8 = MWC.uniform<o:p></o:p></code></pre>
<pre><code>    uniformWord16 = MWC.uniform<o:p></o:p></code></pre>
<pre><code>    uniformWord32 = MWC.uniform<o:p></o:p></code></pre>
<pre><code>    uniformWord64 = MWC.uniform<o:p></o:p></code></pre>
<pre><code>    uniformShortByteString n g = unsafeSTToPrim (genShortByteStringST n (MWC.uniform g))<o:p></o:p></code></pre>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Pure random number generators can also be made instances of this class providing a uniform interface to both pure and stateful random number generators. An instance for the standard
 number generator <code><span style="font-size:10.0pt">StdGen</span></code> is provided.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">The
<code><span style="font-size:10.0pt">Random</span></code> typeclass has conceptually been split into
<code><span style="font-size:10.0pt">Uniform</span></code> and <code><span style="font-size:10.0pt">UniformRange</span></code>. The
<code><span style="font-size:10.0pt">Random</span></code> typeclass is still included for backwards compatibility.
<code><span style="font-size:10.0pt">Uniform</span></code> is for types where it is possible to sample from the type's entire domain;
<code><span style="font-size:10.0pt">UniformRange</span></code> is for types where one can sample from a specified range:<o:p></o:p></p>
<pre><code>class Uniform a where<o:p></o:p></code></pre>
<pre><code>    uniformM :: MonadRandom g s m => g s -> m a<o:p></o:p></code></pre>
<pre><code><o:p> </o:p></code></pre>
<pre><code>class UniformRange a where<o:p></o:p></code></pre>
<pre><code>    uniformRM :: MonadRandom g s m => (a, a) -> g s -> m a<o:p></o:p></code></pre>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">The proposal is a breaking change but the changes are not very intrusive and we have PRs ready for the affected downstream libraries:<o:p></o:p></p>
<ul type="disc">
<li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
requires <code><span style="font-size:10.0pt">base</span></code> >= 4.10 (GHC-8.2)<o:p></o:p></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<code><span style="font-size:10.0pt">StdGen</span></code> is no longer an instance of
<code><span style="font-size:10.0pt">Read</span></code><o:p></o:p></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<code><span style="font-size:10.0pt">randomIO</span></code> and <code><span style="font-size:10.0pt">randomRIO</span></code> were extracted from the
<code><span style="font-size:10.0pt">Random</span></code> class into separate functions<o:p></o:p></li></ul>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">In addition, there may be import clashes with new functions, e.g.
<code><span style="font-size:10.0pt">uniform</span></code> and <code><span style="font-size:10.0pt">uniformR</span></code>.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Further explanatory details may be found
<a href="https://github.com/idontgetoutmuch/random/blob/v1.2-release-notes/RELEASE-NOTES-v1.2.md#api-changes">
here</a> and the PR for the proposed new version is <a href="https://github.com/haskell/random/pull/61">
here</a>.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Here are some benchmarks run on a 3.1 GHz Intel Core i7. The full benchmarks can be run using e.g.
<code><span style="font-size:10.0pt">stack bench</span></code>. The benchmarks are measured in milliseconds per 100,000 generations. In some cases, the performance is over x1000(!) times better; the minimum performance increase for the types listed below is
 more than x35.<o:p></o:p></p>
<pre><code>| Name                    | Mean (1.1) | Mean (1.2) | Improvement|<o:p></o:p></code></pre>
<pre><code>| ----------------------- | ---------- | ---------- | ---------- |<o:p></o:p></code></pre>
<pre><code>| pure/random/Float       |         30 |       0.03 |        1038|<o:p></o:p></code></pre>
<pre><code>| pure/random/Double      |         52 |       0.03 |        1672|<o:p></o:p></code></pre>
<pre><code>| pure/random/Integer     |         43 |       0.33 |         131|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Word8      |         14 |       0.03 |         422|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Word16     |         13 |       0.03 |         375|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Word32     |         21 |       0.03 |         594|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Word64     |         42 |       0.03 |        1283|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Word       |         44 |       0.03 |        1491|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Int8       |         15 |       0.03 |         511|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Int16      |         15 |       0.03 |         507|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Int32      |         22 |       0.03 |         749|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Int64      |         44 |       0.03 |        1405|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Int        |         43 |       0.03 |        1512|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Char       |         17 |       0.49 |          35|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/Bool       |         18 |       0.03 |         618|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CChar      |         14 |       0.03 |         485|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CSChar     |         14 |       0.03 |         455|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CUChar     |         13 |       0.03 |         448|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CShort     |         14 |       0.03 |         473|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CUShort    |         13 |       0.03 |         457|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CInt       |         21 |       0.03 |         737|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CUInt      |         21 |       0.03 |         742|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CLong      |         43 |       0.03 |        1544|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CULong     |         42 |       0.03 |        1460|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CPtrdiff   |         43 |       0.03 |        1494|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CSize      |         43 |       0.03 |        1475|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CWchar     |         22 |       0.03 |         785|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CSigAtomic |         21 |       0.03 |         749|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CLLong     |         43 |       0.03 |        1554|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CULLong    |         42 |       0.03 |        1505|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CIntPtr    |         43 |       0.03 |        1476|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CUIntPtr   |         42 |       0.03 |        1463|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CIntMax    |         43 |       0.03 |        1535|<o:p></o:p></code></pre>
<pre><code>| pure/uniform/CUIntMax   |         42 |       0.03 |        1493|<o:p></o:p></code></pre>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif;color:black">Dominic Steinitz<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif;color:black"><a href="mailto:dominic@steinitz.org">dominic@steinitz.org</a><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif;color:black"><a href="http://idontgetoutmuch.org">http://idontgetoutmuch.org</a><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif;color:black">Twitter: @idontgetoutmuch<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif;color:black"><o:p> </o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>