<div dir="ltr"><div dir="ltr">Oh, also my complete pipeline is here: <a href="https://github.com/chrisdone/prana/blob/0cbb7b4b96bbfdb4f0d6a60e08f4b1f53abdfb15/prana-ghc/src/Prana/Ghc.hs#L106-L154">https://github.com/chrisdone/prana/blob/0cbb7b4b96bbfdb4f0d6a60e08f4b1f53abdfb15/prana-ghc/src/Prana/Ghc.hs#L106-L154</a></div><div><br></div><div>Parse/typecheck/desugar, tidy, prep, core-to-stg (ripped from HscMain) and then I try to resolve all names in the AST and that leads me to this.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, 30 Mar 2019 at 14:05, Christopher Done <<a href="mailto:chrisdone@gmail.com">chrisdone@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail-m_-7398085090843150294markdown-here-wrapper"><p style="margin:0px 0px 1.2em">Hi all,</p>
<p style="margin:0px 0px 1.2em">Could you offer some insight into newtypes at the STG level? Here’s the<br>context:</p>
<ol style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px"><p style="margin:0.5em 0px">I’m working on this interpreter for STG<br>(<a href="https://github.com/chrisdone/prana" target="_blank">https://github.com/chrisdone/prana</a>) and I’m trying to generate a<br>pristine AST where all names in it are resolved to something known to<br>me.</p>
</li>
<li style="margin:0.5em 0px"><p style="margin:0.5em 0px">I’ve compiled ghc-prim and integer-gmp without issue, and I’m<br>compiling base and there remains one last frontier which is newtypes.</p>
</li>
</ol>
<p style="margin:0px 0px 1.2em">These are the culprits pointed out if I compile base:</p>
<pre style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block">chris@precision:~/Work/chrisdone/prana/ghc-8.4/libraries/base-4.11.1.0$ PRANA_INDEX=../prana.idx stack build --exec './Setup build --ghc-options=-O0' --file-watch
Preprocessing library for base-4.11.1.0..
Building library for base-4.11.1.0..
[1 of 244] Compiling GHC.Base
[2 of 244] Compiling <a href="http://GHC.IO" target="_blank">GHC.IO</a>
[3 of 244] Compiling GHC.Real
[4 of 244] Compiling Data.Semigroup.Internal
... [snip] ...
[242 of 244] Compiling Data.Functor.Compose
[243 of 244] Compiling Data.Fixed
[244 of 244] Compiling Data.Complex

Errors in Data.Foldable:
  Variable name not found: base:Data.Semigroup.Internal.All
  Variable name not found: base:Data.Semigroup.Internal.Any

Errors in Foreign.Marshal.Pool:
  Variable name not found: base:Foreign.Marshal.Pool.Pool

Errors in GHC.ExecutionStack.Internal:
  Variable name not found: base:GHC.ExecutionStack.Internal.StackTrace

Errors in Data.Bifoldable:
  Variable name not found: base:Data.Semigroup.Internal.All
  Variable name not found: base:Data.Semigroup.Internal.Any

Errors in System.Timeout:
  Variable name not found: base:System.Timeout.Timeout

Errors in Data.Data:
  Variable name not found: base:Foreign.Ptr.WordPtr
  Variable name not found: base:Foreign.Ptr.IntPtr
  Variable name not found: base:Data.Semigroup.Internal.Any
  Variable name not found: base:Data.Semigroup.Internal.All
</code></pre><p style="margin:0px 0px 1.2em">I looked these up, and they all appear to be <em>uses</em> of a<br>newtype.</p>
<p style="margin:0px 0px 1.2em">For example, in the Timeout function:</p>
<p style="margin:0px 0px 1.2em"><a href="http://hackage.haskell.org/package/base-4.12.0.0/docs/src/System.Timeout.html#timeout" target="_blank">http://hackage.haskell.org/package/base-4.12.0.0/docs/src/System.Timeout.html#timeout</a></p>
<p style="margin:0px 0px 1.2em">I printed out the full [StgTopBinding] list and got:</p>
<pre style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="gmail-m_-7398085090843150294hljs gmail-m_-7398085090843150294language-haskell" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248);display:block"><span class="gmail-m_-7398085090843150294hljs-title" style="color:rgb(153,0,0);font-weight:bold">let</span> {
  sat_s27NC [<span class="gmail-m_-7398085090843150294hljs-type" style="color:rgb(68,85,136);font-weight:bold">Occ</span>=<span class="gmail-m_-7398085090843150294hljs-type" style="color:rgb(68,85,136);font-weight:bold">Once</span>] :: <span class="gmail-m_-7398085090843150294hljs-type" style="color:rgb(68,85,136);font-weight:bold">IO</span> <span class="gmail-m_-7398085090843150294hljs-type" style="color:rgb(68,85,136);font-weight:bold">Timeout</span>
  [<span class="gmail-m_-7398085090843150294hljs-type" style="color:rgb(68,85,136);font-weight:bold">LclId</span>] =
      [] \u [] fmap $fFunctorIO <span class="gmail-m_-7398085090843150294hljs-type" style="color:rgb(68,85,136);font-weight:bold">Timeout</span> newUnique;
} <span class="gmail-m_-7398085090843150294hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">in</span>  >>= $fMonadIO sat_s27NC sat_s27NT;
</code></pre>
<p style="margin:0px 0px 1.2em">Oddly (or not?), they’re used as values, not constructors. This error<br>comes from this part of my code:</p>
<pre style="font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;background-color:rgb(248,248,248);white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block">StgSyn.StgApp occ arguments ->
  AppExpr <$> lookupSomeVarId occ <*> traverse fromStgGenArg arguments
</code></pre><p style="margin:0px 0px 1.2em">If it was used as a constructor, it’d appear in this position, where<br>looking up the ID would produce a “Data constructor name not found”<br>error:</p>
<p style="margin:0px 0px 1.2em">StgSyn.StgConApp dataCon arguments types -><br>  ConAppExpr <$> lookupDataConId dataCon <<em>> traverse fromStgGenArg arguments <</em>><br>  pure (map (const Type) types)</p>
<p style="margin:0px 0px 1.2em">My understanding of newtypes at this stage is hazy. It seems like:</p>
<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px"><p style="margin:0.5em 0px">They ought to be erased and replaced with coercions by now.  If<br>they’re not replaced, it’s because they’re in a not-quite-id position<br>like <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">fmap Timeout ...</code>. (Arguably these could be fixed in base with a<br>Data.Coerce.coerce?)</p>
</li>
<li style="margin:0.5em 0px"><p style="margin:0.5em 0px">However, the CoreTidy/PrepPgm processing modules<br>don’t seem to have removed or replaced these, or introduced a binding<br>that would do something.</p>
</li>
</ul>
<p style="margin:0px 0px 1.2em">At this stage what would you recommend? At this point type-checking is<br>done, and I only care about interpreting the code. So I suppose they<br>could be <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">id</code> for all it matters to the interpreter?</p>
<p style="margin:0px 0px 1.2em">I imagine they aren’t actually supposed to allocate something here. And<br>I’m certain that any pattern matching on a newtype is also erased away<br>by this point.</p><p style="margin:0px 0px 1.2em">Cheers!</p><p style="margin:0px 0px 1.2em">Chris</p>
<div title="MDH:PGRpdiBkaXI9Imx0ciI+PGRpdj5IaSBhbGwsPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5Db3Vs
ZCB5b3Ugb2ZmZXIgc29tZSBpbnNpZ2h0IGludG8gbmV3dHlwZXMgYXQgdGhlIFNURyBsZXZlbD8g
SGVyZSdzIHRoZTwvZGl2PjxkaXY+Y29udGV4dDo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjEu
IEknbSB3b3JraW5nIG9uIHRoaXMgaW50ZXJwcmV0ZXIgZm9yIFNURzwvZGl2PjxkaXY+KGh0dHBz
Oi8vZ2l0aHViLmNvbS9jaHJpc2RvbmUvcHJhbmEpIGFuZCBJJ20gdHJ5aW5nIHRvIGdlbmVyYXRl
IGE8L2Rpdj48ZGl2PnByaXN0aW5lIEFTVCB3aGVyZSBhbGwgbmFtZXMgaW4gaXQgYXJlIHJlc29s
dmVkIHRvIHNvbWV0aGluZyBrbm93biB0bzwvZGl2PjxkaXY+bWUuPC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj4yLiBJJ3ZlIGNvbXBpbGVkIGdoYy1wcmltIGFuZCBpbnRlZ2VyLWdtcCB3aXRob3V0
IGlzc3VlLCBhbmQgSSdtPC9kaXY+PGRpdj5jb21waWxpbmcgYmFzZSBhbmQgdGhlcmUgcmVtYWlu
cyBvbmUgbGFzdCBmcm9udGllciB3aGljaCBpcyBuZXd0eXBlcy48L2Rpdj48ZGl2Pjxicj48L2Rp
dj48ZGl2PlRoZXNlIGFyZSB0aGUgY3VscHJpdHMgcG9pbnRlZCBvdXQgaWYgSSBjb21waWxlIGJh
c2U6PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5gYGA8L2Rpdj48ZGl2PmNocmlzQHByZWNpc2lv
bjp+L1dvcmsvY2hyaXNkb25lL3ByYW5hL2doYy04LjQvbGlicmFyaWVzL2Jhc2UtNC4xMS4xLjAk
IFBSQU5BX0lOREVYPS4uL3ByYW5hLmlkeCBzdGFjayBidWlsZCAtLWV4ZWMgJy4vU2V0dXAgYnVp
bGQgLS1naGMtb3B0aW9ucz0tTzAnIC0tZmlsZS13YXRjaDwvZGl2PjxkaXY+UHJlcHJvY2Vzc2lu
ZyBsaWJyYXJ5IGZvciBiYXNlLTQuMTEuMS4wLi48L2Rpdj48ZGl2PkJ1aWxkaW5nIGxpYnJhcnkg
Zm9yIGJhc2UtNC4xMS4xLjAuLjwvZGl2PjxkaXY+WzEgb2YgMjQ0XSBDb21waWxpbmcgR0hDLkJh
c2U8L2Rpdj48ZGl2PlsyIG9mIDI0NF0gQ29tcGlsaW5nIEdIQy5JTzwvZGl2PjxkaXY+WzMgb2Yg
MjQ0XSBDb21waWxpbmcgR0hDLlJlYWw8L2Rpdj48ZGl2Pls0IG9mIDI0NF0gQ29tcGlsaW5nIERh
dGEuU2VtaWdyb3VwLkludGVybmFsPC9kaXY+PGRpdj4uLi4gW3NuaXBdIC4uLjwvZGl2PjxkaXY+
WzI0MiBvZiAyNDRdIENvbXBpbGluZyBEYXRhLkZ1bmN0b3IuQ29tcG9zZTwvZGl2PjxkaXY+WzI0
MyBvZiAyNDRdIENvbXBpbGluZyBEYXRhLkZpeGVkPC9kaXY+PGRpdj5bMjQ0IG9mIDI0NF0gQ29t
cGlsaW5nIERhdGEuQ29tcGxleDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+RXJyb3JzIGluIERh
dGEuRm9sZGFibGU6PC9kaXY+PGRpdj4mbmJzcDsgVmFyaWFibGUgbmFtZSBub3QgZm91bmQ6IGJh
c2U6RGF0YS5TZW1pZ3JvdXAuSW50ZXJuYWwuQWxsPC9kaXY+PGRpdj4mbmJzcDsgVmFyaWFibGUg
bmFtZSBub3QgZm91bmQ6IGJhc2U6RGF0YS5TZW1pZ3JvdXAuSW50ZXJuYWwuQW55PC9kaXY+PGRp
dj48YnI+PC9kaXY+PGRpdj5FcnJvcnMgaW4gRm9yZWlnbi5NYXJzaGFsLlBvb2w6PC9kaXY+PGRp
dj4mbmJzcDsgVmFyaWFibGUgbmFtZSBub3QgZm91bmQ6IGJhc2U6Rm9yZWlnbi5NYXJzaGFsLlBv
b2wuUG9vbDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+RXJyb3JzIGluIEdIQy5FeGVjdXRpb25T
dGFjay5JbnRlcm5hbDo8L2Rpdj48ZGl2PiZuYnNwOyBWYXJpYWJsZSBuYW1lIG5vdCBmb3VuZDog
YmFzZTpHSEMuRXhlY3V0aW9uU3RhY2suSW50ZXJuYWwuU3RhY2tUcmFjZTwvZGl2PjxkaXY+PGJy
PjwvZGl2PjxkaXY+RXJyb3JzIGluIERhdGEuQmlmb2xkYWJsZTo8L2Rpdj48ZGl2PiZuYnNwOyBW
YXJpYWJsZSBuYW1lIG5vdCBmb3VuZDogYmFzZTpEYXRhLlNlbWlncm91cC5JbnRlcm5hbC5BbGw8
L2Rpdj48ZGl2PiZuYnNwOyBWYXJpYWJsZSBuYW1lIG5vdCBmb3VuZDogYmFzZTpEYXRhLlNlbWln
cm91cC5JbnRlcm5hbC5Bbnk8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkVycm9ycyBpbiBTeXN0
ZW0uVGltZW91dDo8L2Rpdj48ZGl2PiZuYnNwOyBWYXJpYWJsZSBuYW1lIG5vdCBmb3VuZDogYmFz
ZTpTeXN0ZW0uVGltZW91dC5UaW1lb3V0PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5FcnJvcnMg
aW4gRGF0YS5EYXRhOjwvZGl2PjxkaXY+Jm5ic3A7IFZhcmlhYmxlIG5hbWUgbm90IGZvdW5kOiBi
YXNlOkZvcmVpZ24uUHRyLldvcmRQdHI8L2Rpdj48ZGl2PiZuYnNwOyBWYXJpYWJsZSBuYW1lIG5v
dCBmb3VuZDogYmFzZTpGb3JlaWduLlB0ci5JbnRQdHI8L2Rpdj48ZGl2PiZuYnNwOyBWYXJpYWJs
ZSBuYW1lIG5vdCBmb3VuZDogYmFzZTpEYXRhLlNlbWlncm91cC5JbnRlcm5hbC5Bbnk8L2Rpdj48
ZGl2PiZuYnNwOyBWYXJpYWJsZSBuYW1lIG5vdCBmb3VuZDogYmFzZTpEYXRhLlNlbWlncm91cC5J
bnRlcm5hbC5BbGw8L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSBsb29r
ZWQgdGhlc2UgdXAsIGFuZCB0aGV5IGFsbCBhcHBlYXIgdG8gYmUgX3VzZXNfIG9mIGE8L2Rpdj48
ZGl2Pm5ld3R5cGUuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5Gb3IgZXhhbXBsZSwgaW4gdGhl
IFRpbWVvdXQgZnVuY3Rpb246PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5odHRwOi8vaGFja2Fn
ZS5oYXNrZWxsLm9yZy9wYWNrYWdlL2Jhc2UtNC4xMi4wLjAvZG9jcy9zcmMvU3lzdGVtLlRpbWVv
dXQuaHRtbCN0aW1lb3V0PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JIHByaW50ZWQgb3V0IHRo
ZSBmdWxsIFtTdGdUb3BCaW5kaW5nXSBsaXN0IGFuZCBnb3Q6PC9kaXY+PGRpdj48YnI+PC9kaXY+
PGRpdj5gYGBoYXNrZWxsPC9kaXY+PGRpdj5sZXQgezwvZGl2PjxkaXY+Jm5ic3A7IHNhdF9zMjdO
QyBbT2NjPU9uY2VdIDo6IElPIFRpbWVvdXQ8L2Rpdj48ZGl2PiZuYnNwOyBbTGNsSWRdID08L2Rp
dj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7IFtdIFx1IFtdIGZtYXAgJGZGdW5jdG9ySU8gVGlt
ZW91dCBuZXdVbmlxdWU7PC9kaXY+PGRpdj59IGluJm5ic3A7ICZndDsmZ3Q7PSAkZk1vbmFkSU8g
c2F0X3MyN05DIHNhdF9zMjdOVDs8L2Rpdj48ZGl2PmBgYDwvZGl2PjxkaXY+PGJyPjwvZGl2Pjxk
aXY+T2RkbHkgKG9yIG5vdD8pLCB0aGV5J3JlIHVzZWQgYXMgdmFsdWVzLCBub3QgY29uc3RydWN0
b3JzLiBUaGlzIGVycm9yPC9kaXY+PGRpdj5jb21lcyBmcm9tIHRoaXMgcGFydCBvZiBteSBjb2Rl
OjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj5TdGdTeW4uU3RnQXBwIG9j
YyBhcmd1bWVudHMgLSZndDs8L2Rpdj48ZGl2PiZuYnNwOyBBcHBFeHByICZsdDskJmd0OyBsb29r
dXBTb21lVmFySWQgb2NjICZsdDsqJmd0OyB0cmF2ZXJzZSBmcm9tU3RnR2VuQXJnIGFyZ3VtZW50
czwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JZiBpdCB3YXMgdXNlZCBh
cyBhIGNvbnN0cnVjdG9yLCBpdCdkIGFwcGVhciBpbiB0aGlzIHBvc2l0aW9uLCB3aGVyZTwvZGl2
PjxkaXY+bG9va2luZyB1cCB0aGUgSUQgd291bGQgcHJvZHVjZSBhICJEYXRhIGNvbnN0cnVjdG9y
IG5hbWUgbm90IGZvdW5kIjwvZGl2PjxkaXY+ZXJyb3I6PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp
dj5TdGdTeW4uU3RnQ29uQXBwIGRhdGFDb24gYXJndW1lbnRzIHR5cGVzIC0mZ3Q7PC9kaXY+PGRp
dj4mbmJzcDsgQ29uQXBwRXhwciAmbHQ7JCZndDsgbG9va3VwRGF0YUNvbklkIGRhdGFDb24gJmx0
OyomZ3Q7IHRyYXZlcnNlIGZyb21TdGdHZW5BcmcgYXJndW1lbnRzICZsdDsqJmd0OzwvZGl2Pjxk
aXY+Jm5ic3A7IHB1cmUgKG1hcCAoY29uc3QgVHlwZSkgdHlwZXMpPC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj5NeSB1bmRlcnN0YW5kaW5nIG9mIG5ld3R5cGVzIGF0IHRoaXMgc3RhZ2UgaXMgaGF6
eS4gSXQgc2VlbXMgbGlrZTo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiogVGhleSBvdWdodCB0
byBiZSBlcmFzZWQgYW5kIHJlcGxhY2VkIHdpdGggY29lcmNpb25zIGJ5IG5vdy4mbmJzcDsgSWY8
L2Rpdj48ZGl2PiZuYnNwOyB0aGV5J3JlIG5vdCByZXBsYWNlZCwgaXQncyBiZWNhdXNlIHRoZXkn
cmUgaW4gYSBub3QtcXVpdGUtaWQgcG9zaXRpb248L2Rpdj48ZGl2PiZuYnNwOyBsaWtlIGBmbWFw
IFRpbWVvdXQgLi4uYC4gKEFyZ3VhYmx5IHRoZXNlIGNvdWxkIGJlIGZpeGVkIGluIGJhc2Ugd2l0
aCBhPC9kaXY+PGRpdj4mbmJzcDsgRGF0YS5Db2VyY2UuY29lcmNlPyk8L2Rpdj48ZGl2Pjxicj48
L2Rpdj48ZGl2PiogSG93ZXZlciwgdGhlIENvcmVUaWR5L1ByZXBQZ20gcHJvY2Vzc2luZyBtb2R1
bGVzPC9kaXY+PGRpdj4mbmJzcDsgZG9uJ3Qgc2VlbSB0byBoYXZlIHJlbW92ZWQgb3IgcmVwbGFj
ZWQgdGhlc2UsIG9yIGludHJvZHVjZWQgYSBiaW5kaW5nPC9kaXY+PGRpdj4mbmJzcDsgdGhhdCB3
b3VsZCBkbyBzb21ldGhpbmcuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5BdCB0aGlzIHN0YWdl
IHdoYXQgd291bGQgeW91IHJlY29tbWVuZD8gQXQgdGhpcyBwb2ludCB0eXBlLWNoZWNraW5nIGlz
PC9kaXY+PGRpdj5kb25lLCBhbmQgSSBvbmx5IGNhcmUgYWJvdXQgaW50ZXJwcmV0aW5nIHRoZSBj
b2RlLiBTbyBJIHN1cHBvc2UgdGhleTwvZGl2PjxkaXY+Y291bGQgYmUgYGlkYCBmb3IgYWxsIGl0
IG1hdHRlcnMgdG8gdGhlIGludGVycHJldGVyPzwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSBp
bWFnaW5lIHRoZXkgYXJlbid0IGFjdHVhbGx5IHN1cHBvc2VkIHRvIGFsbG9jYXRlIHNvbWV0aGlu
ZyBoZXJlLiBBbmQ8L2Rpdj48ZGl2PkknbSBjZXJ0YWluIHRoYXQgYW55IHBhdHRlcm4gbWF0Y2hp
bmcgb24gYSBuZXd0eXBlIGlzIGFsc28gZXJhc2VkIGF3YXk8L2Rpdj48ZGl2PmJ5IHRoaXMgcG9p
bnQuPC9kaXY+PGRpdj48YnI+PC9kaXY+PC9kaXY+" style="height:0px;width:0px;max-height:0px;max-width:0px;overflow:hidden;font-size:0em;padding:0px;margin:0px"></div></div></div>
</blockquote></div>