<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">Le 14 janv. 2017 à 18:45, Anton Zhilin &lt;<a href="mailto:antonyzhilin@gmail.com" class="">antonyzhilin@gmail.com</a>&gt; a écrit :</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important" class="">I’m not sure, but I think that in this case the specific type of these values is determined at runtime.<br class="">Then a safe approach would be separate <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" class="">string: String?</code>, <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" class="">bool: Bool?</code>, <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" class="">int: Int?</code> computed properties, as it’s done in JSON parsers.</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px" class=""><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;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important" class="">if let bookCount = row.value(named: "bookCount").int {
    ...
}
if let bookCount = row["bookCount"].int {
    ...
}
let bookCount = <a href="http://row.int/" class="">row.int</a>("bookCount")!   // crash if database is corrupt
</code></pre><p style="margin:0px 0px 1.2em!important" class="">Additionally, this is an overall bad example of generics. Fields of database tables can only map to a limited set of static types in Swift, which are supported by database adapter</p></div></div></div></blockquote><div>Thanks for the compliment! I disagree, of course.</div><div><br class=""></div><div>App developers may need to fetch basic database data types, obviously, but also RawRepresentable types based on those types, dates, date components, uuids, serialized JSON, and generally speaking a large and extensible set of serializable types.</div><div><br class=""></div><div>This is, I believe, a very good usage of return type genericity, as well as an excellent opportunity for the open/closed principle (<a href="https://en.wikipedia.org/wiki/Open/closed_principle" class="">https://en.wikipedia.org/wiki/Open/closed_principle</a>).</div><div><br class=""></div><div>Gwendal</div><br class=""><blockquote type="cite" class=""><div dir="ltr" class=""><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important" class="">2017-01-14 16:50 GMT+03:00 Gwendal Roué via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt;:</p><div class="markdown-here-exclude"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class="">As the developer of a Swift database library, I'd like to offer a better API than the following:</div><div class=""><div class=""><br class=""></div><div class=""><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,132,0)" class=""><span style="font-variant-ligatures:no-common-ligatures" class=""><span style="color:rgb(186,45,162)" class="">&nbsp; &nbsp;</span><span style="color:rgb(186,45,162)" class="">&nbsp;</span>// Current state of affairs</span></div></div><div class=""><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class=""><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="">&nbsp; &nbsp; let</span><span style="font-variant-ligatures:no-common-ligatures" class=""> name: </span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="">String</span><span style="font-variant-ligatures:no-common-ligatures" class=""> = row.</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="">value</span><span style="font-variant-ligatures:no-common-ligatures" class="">(named: </span><span style="font-variant-ligatures:no-common-ligatures;color:#d12f1b" class="">"name"</span><span style="font-variant-ligatures:no-common-ligatures" class="">)</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class=""><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)" class="">&nbsp; &nbsp; let</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;bookCount:&nbsp;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)" class="">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;= row.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(49,89,93)" class="">value</span><span style="font-variant-ligatures:no-common-ligatures" class="">(named:&nbsp;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(209,47,27)" class="">"bookCount"</span><span style="font-variant-ligatures:no-common-ligatures" class="">)</span></div></div><div class=""><span style="font-variant-ligatures:no-common-ligatures" class=""><div class=""><span style="font-variant-ligatures:no-common-ligatures" class=""><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class=""><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)" class="">&nbsp; &nbsp; let</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;hasBooks:&nbsp;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)" class="">Bool</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;= row.</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(49,89,93)" class="">value</span><span style="font-variant-ligatures:no-common-ligatures" class="">(named:&nbsp;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(209,47,27)" class="">"bookCount"</span><span style="font-variant-ligatures:no-common-ligatures" class="">)</span></div><div class=""><span style="font-variant-ligatures:no-common-ligatures" class=""><br class=""></span></div></span></div></span></div><div class="">Instead, I wish I could offer GRDB.swift would let its users write:</div></div><div class=""><br class=""></div><div class=""><div class=""><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(0,132,0)" class=""><span style="font-variant-ligatures:no-common-ligatures" class=""><span style="color:rgb(186,45,162)" class="">&nbsp; &nbsp;</span><span style="color:rgb(186,45,162)" class="">&nbsp;</span>// With improved subscripts</span></div></div><div class=""><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class=""><div class=""><div style="margin:0px;line-height:normal" class=""><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)" class="">&nbsp; &nbsp; let</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;name:&nbsp;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)" class="">String</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;= row</span><span style="font-variant-ligatures:no-common-ligatures" class="">[</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(209,47,27)" class="">"name"</span>]</div><div style="margin:0px;line-height:normal" class=""><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)" class="">&nbsp; &nbsp; let</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;bookCount:&nbsp;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)" class="">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;= row</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(209,47,27)" class=""><span style="" class="">[</span>"bookCount"</span><span style="font-variant-ligatures:no-common-ligatures" class="">]</span></div></div><div class=""><span style="font-variant-ligatures:no-common-ligatures" class=""><div class=""><span style="font-variant-ligatures:no-common-ligatures" class=""><div style="margin:0px;line-height:normal" class=""><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)" class="">&nbsp; &nbsp; let</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;hasBooks:&nbsp;</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)" class="">Bool</span><span style="font-variant-ligatures:no-common-ligatures" class="">&nbsp;= row</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(209,47,27)" class=""><span style="" class="">[</span>"bookCount"</span><span style="font-variant-ligatures:no-common-ligatures" class="">]</span></div><div class=""><br class=""></div><div class=""><div style="font-family:Helvetica;font-size:12px" class="">And this requires genericity on return type.</div><div style="font-family:Helvetica;font-size:12px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px" class="">Gwendal</div><div style="font-family:Helvetica;font-size:12px" class=""><br class=""></div><div style="font-family:Helvetica;font-size:12px" class=""><div class=""></div></div></div></span></div></span></div></div></div></div></div><br class="">______________________________<wbr class="">_________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/<wbr class="">mailman/listinfo/swift-<wbr class="">evolution</a><br class="">
<br class=""></blockquote><div class=""><br class="webkit-block-placeholder"></div></div><div style="margin: 0px 0px 1.2em !important;" class=""><br class="webkit-block-placeholder"></div>
<div title="MDH:SSdtIG5vdCBzdXJlLCBidXQgSSB0aGluayB0aGF0IGluIHRoaXMgY2FzZSB0aGUgc3BlY2lmaWMg
dHlwZSBvZiB0aGVzZSB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBhdCBydW50aW1lLjxkaXY+VGhlbiBh
IHNhZmUgYXBwcm9hY2ggd291bGQgYmUgc2VwYXJhdGUgYHN0cmluZzogU3RyaW5nP2AsIGBib29s
OiBCb29sP2AsIGBpbnQ6IEludD9gIGNvbXB1dGVkIHByb3BlcnRpZXMsIGFzIGl0J3MgZG9uZSBp
biBKU09OIHBhcnNlcnMuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5gYGA8L2Rpdj48ZGl2Pmlm
IGxldCBib29rQ291bnQgPSByb3cudmFsdWUobmFtZWQ6ICJib29rQ291bnQiKS5pbnQgezwvZGl2
PjxkaXY+Jm5ic3A7ICZuYnNwOyAuLi48L2Rpdj48ZGl2Pn08L2Rpdj48ZGl2PmlmIGxldCBib29r
Q291bnQgPSByb3dbImJvb2tDb3VudCJdLmludCB7PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IC4u
LjwvZGl2PjxkaXY+fTwvZGl2PjxkaXY+bGV0IGJvb2tDb3VudCA9IHJvdy5pbnQoImJvb2tDb3Vu
dCIpISAmbmJzcDsgLy8gY3Jhc2ggaWYgZGF0YWJhc2UgaXMgY29ycnVwdDwvZGl2PjxkaXY+YGBg
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5BZGRpdGlvbmFsbHksIHRoaXMgaXMgYW4gb3ZlcmFs
bCBiYWQgZXhhbXBsZSBvZiBnZW5lcmljcy4gRmllbGRzIG9mIGRhdGFiYXNlIHRhYmxlcyBjYW4g
b25seSBtYXAgdG8gYSBsaW1pdGVkIHNldCBvZiBzdGF0aWMgdHlwZXMgaW4gU3dpZnQsIHdoaWNo
IGFyZSBzdXBwb3J0ZWQgYnkgZGF0YWJhc2UgYWRhcHRlci48YnI+PGRpdiBjbGFzcz0iZ21haWxf
ZXh0cmEiPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+MjAxNy0wMS0xNCAxNjo1MCBHTVQr
MDM6MDAgR3dlbmRhbCBSb3XDqSB2aWEgc3dpZnQtZXZvbHV0aW9uIDxzcGFuIGRpcj0ibHRyIj4m
bHQ7PGEgaHJlZj0ibWFpbHRvOnN3aWZ0LWV2b2x1dGlvbkBzd2lmdC5vcmciIHRhcmdldD0iX2Js
YW5rIj5zd2lmdC1ldm9sdXRpb25Ac3dpZnQub3JnPC9hPiZndDs8L3NwYW4+OjxibG9ja3F1b3Rl
IGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0
OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPjxkaXYgc3R5bGU9IndvcmQtd3JhcDpi
cmVhay13b3JkIj5UaGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgeW91ciB2aXNpb24gb2Ygc3Vic2Ny
aXB0LiBJZiBpbnRlcmVzdGluZywgaXQgaXMgYWxzbyBsaW1pdGluZyBmb3Igbm8gcmVhbCBwdXJw
b3NlLjxkaXY+PGJyPjwvZGl2PjxkaXY+QXMgdGhlIGRldmVsb3BlciBvZiBhIFN3aWZ0IGRhdGFi
YXNlIGxpYnJhcnksIEknZCBsaWtlIHRvIG9mZmVyIGEgYmV0dGVyIEFQSSB0aGFuIHRoZSBmb2xs
b3dpbmc6PGRpdj48YnI+PC9kaXY+PGRpdj48ZGl2IHN0eWxlPSJtYXJnaW46MHB4O2ZvbnQtc2l6
ZToxMXB4O2xpbmUtaGVpZ2h0Om5vcm1hbDtmb250LWZhbWlseTpNZW5sbztjb2xvcjpyZ2IoMCwx
MzIsMCkiPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdh
dHVyZXMiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoMTg2LDQ1LDE2MikiPiZuYnNwOyAmbmJzcDs8
L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOnJnYigxODYsNDUsMTYyKSI+Jm5ic3A7PC9zcGFuPi8v
IEN1cnJlbnQgc3RhdGUgb2YgYWZmYWlyczwvc3Bhbj48L2Rpdj48L2Rpdj48ZGl2PjxkaXYgc3R5
bGU9Im1hcmdpbjowcHg7Zm9udC1zaXplOjExcHg7bGluZS1oZWlnaHQ6bm9ybWFsO2ZvbnQtZmFt
aWx5Ok1lbmxvIj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24t
bGlnYXR1cmVzO2NvbG9yOiNiYTJkYTIiPiZuYnNwOyAmbmJzcDsgbGV0PC9zcGFuPjxzcGFuIHN0
eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXMiPiBuYW1lOiA8
L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm8tY29tbW9uLWxpZ2F0
dXJlcztjb2xvcjojNzAzZGFhIj5TdHJpbmc8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFu
dC1saWdhdHVyZXM6bm8tY29tbW9uLWxpZ2F0dXJlcyI+ID0gcm93Ljwvc3Bhbj48c3BhbiBzdHls
ZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzO2NvbG9yOiMzMTU5
NWQiPnZhbHVlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNv
bW1vbi1saWdhdHVyZXMiPihuYW1lZDogPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQt
bGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXM7Y29sb3I6I2QxMmYxYiI+Im5hbWUiPC9zcGFu
PjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXMi
Pik8L3NwYW4+PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luOjBweDtmb250LXNpemU6MTFweDtsaW5l
LWhlaWdodDpub3JtYWw7Zm9udC1mYW1pbHk6TWVubG8iPjxzcGFuIHN0eWxlPSJmb250LXZhcmlh
bnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXM7Y29sb3I6cmdiKDE4Niw0NSwxNjIpIj4m
bmJzcDsgJm5ic3A7IGxldDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJl
czpuby1jb21tb24tbGlnYXR1cmVzIj4mbmJzcDtib29rQ291bnQ6Jm5ic3A7PC9zcGFuPjxzcGFu
IHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXM7Y29sb3I6
cmdiKDExMiw2MSwxNzApIj5JbnQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdh
dHVyZXM6bm8tY29tbW9uLWxpZ2F0dXJlcyI+Jm5ic3A7PSByb3cuPC9zcGFuPjxzcGFuIHN0eWxl
PSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXM7Y29sb3I6cmdiKDQ5
LDg5LDkzKSI+dmFsdWU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdhdHVyZXM6
bm8tY29tbW9uLWxpZ2F0dXJlcyI+KG5hbWVkOiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9u
dC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzO2NvbG9yOnJnYigyMDksNDcs
MjcpIj4iYm9va0NvdW50Ijwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJl
czpuby1jb21tb24tbGlnYXR1cmVzIj4pPC9zcGFuPjwvZGl2PjwvZGl2PjxkaXY+PHNwYW4gc3R5
bGU9ImZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm8tY29tbW9uLWxpZ2F0dXJlcyI+PGRpdj48c3Bh
biBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzIj48ZGl2
IHN0eWxlPSJtYXJnaW46MHB4O2ZvbnQtc2l6ZToxMXB4O2xpbmUtaGVpZ2h0Om5vcm1hbDtmb250
LWZhbWlseTpNZW5sbyI+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm8tY29t
bW9uLWxpZ2F0dXJlcztjb2xvcjpyZ2IoMTg2LDQ1LDE2MikiPiZuYnNwOyAmbmJzcDsgbGV0PC9z
cGFuPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVy
ZXMiPiZuYnNwO2hhc0Jvb2tzOiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50
LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzO2NvbG9yOnJnYigxMTIsNjEsMTcwKSI+Qm9v
bDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGln
YXR1cmVzIj4mbmJzcDs9IHJvdy48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdh
dHVyZXM6bm8tY29tbW9uLWxpZ2F0dXJlcztjb2xvcjpyZ2IoNDksODksOTMpIj52YWx1ZTwvc3Bh
bj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVz
Ij4obmFtZWQ6Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVz
Om5vLWNvbW1vbi1saWdhdHVyZXM7Y29sb3I6cmdiKDIwOSw0NywyNykiPiJib29rQ291bnQiPC9z
cGFuPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVy
ZXMiPik8L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJl
czpuby1jb21tb24tbGlnYXR1cmVzIj48YnI+PC9zcGFuPjwvZGl2Pjwvc3Bhbj48L2Rpdj48L3Nw
YW4+PC9kaXY+PGRpdj5JbnN0ZWFkLCBJIHdpc2ggSSBjb3VsZCBvZmZlciBHUkRCLnN3aWZ0IHdv
dWxkIGxldCBpdHMgdXNlcnMgd3JpdGU6PC9kaXY+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48
ZGl2PjxkaXYgc3R5bGU9Im1hcmdpbjowcHg7Zm9udC1zaXplOjExcHg7bGluZS1oZWlnaHQ6bm9y
bWFsO2ZvbnQtZmFtaWx5Ok1lbmxvO2NvbG9yOnJnYigwLDEzMiwwKSI+PHNwYW4gc3R5bGU9ImZv
bnQtdmFyaWFudC1saWdhdHVyZXM6bm8tY29tbW9uLWxpZ2F0dXJlcyI+PHNwYW4gc3R5bGU9ImNv
bG9yOnJnYigxODYsNDUsMTYyKSI+Jm5ic3A7ICZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29s
b3I6cmdiKDE4Niw0NSwxNjIpIj4mbmJzcDs8L3NwYW4+Ly8gV2l0aCBpbXByb3ZlZCBzdWJzY3Jp
cHRzPC9zcGFuPjwvZGl2PjwvZGl2PjxkaXY+PGRpdiBzdHlsZT0ibWFyZ2luOjBweDtmb250LXNp
emU6MTFweDtsaW5lLWhlaWdodDpub3JtYWw7Zm9udC1mYW1pbHk6TWVubG8iPjxkaXY+PGRpdiBz
dHlsZT0ibWFyZ2luOjBweDtsaW5lLWhlaWdodDpub3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXZh
cmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXM7Y29sb3I6cmdiKDE4Niw0NSwxNjIp
Ij4mbmJzcDsgJm5ic3A7IGxldDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0
dXJlczpuby1jb21tb24tbGlnYXR1cmVzIj4mbmJzcDtuYW1lOiZuYnNwOzwvc3Bhbj48c3BhbiBz
dHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzO2NvbG9yOnJn
YigxMTIsNjEsMTcwKSI+U3RyaW5nPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGln
YXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXMiPiZuYnNwOz0gcm93PC9zcGFuPjxzcGFuIHN0eWxl
PSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVyZXMiPls8L3NwYW4+PHNw
YW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm8tY29tbW9uLWxpZ2F0dXJlcztjb2xv
cjpyZ2IoMjA5LDQ3LDI3KSI+Im5hbWUiPC9zcGFuPl08L2Rpdj48ZGl2IHN0eWxlPSJtYXJnaW46
MHB4O2xpbmUtaGVpZ2h0Om5vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdhdHVy
ZXM6bm8tY29tbW9uLWxpZ2F0dXJlcztjb2xvcjpyZ2IoMTg2LDQ1LDE2MikiPiZuYnNwOyAmbmJz
cDsgbGV0PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1v
bi1saWdhdHVyZXMiPiZuYnNwO2Jvb2tDb3VudDombmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZv
bnQtdmFyaWFudC1saWdhdHVyZXM6bm8tY29tbW9uLWxpZ2F0dXJlcztjb2xvcjpyZ2IoMTEyLDYx
LDE3MCkiPkludDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1j
b21tb24tbGlnYXR1cmVzIj4mbmJzcDs9IHJvdzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJp
YW50LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzO2NvbG9yOnJnYigyMDksNDcsMjcpIj48
c3BhbiBzdHlsZT0iY29sb3I6cmdiKDAsMCwwKSI+Wzwvc3Bhbj4iYm9va0NvdW50Ijwvc3Bhbj48
c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzIj5d
PC9zcGFuPjwvZGl2PjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdhdHVy
ZXM6bm8tY29tbW9uLWxpZ2F0dXJlcyI+PGRpdj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxp
Z2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzIj48ZGl2IHN0eWxlPSJtYXJnaW46MHB4O2xpbmUt
aGVpZ2h0Om5vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm8tY29t
bW9uLWxpZ2F0dXJlcztjb2xvcjpyZ2IoMTg2LDQ1LDE2MikiPiZuYnNwOyAmbmJzcDsgbGV0PC9z
cGFuPjxzcGFuIHN0eWxlPSJmb250LXZhcmlhbnQtbGlnYXR1cmVzOm5vLWNvbW1vbi1saWdhdHVy
ZXMiPiZuYnNwO2hhc0Jvb2tzOiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50
LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzO2NvbG9yOnJnYigxMTIsNjEsMTcwKSI+Qm9v
bDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGln
YXR1cmVzIj4mbmJzcDs9IHJvdzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC12YXJpYW50LWxpZ2F0
dXJlczpuby1jb21tb24tbGlnYXR1cmVzO2NvbG9yOnJnYigyMDksNDcsMjcpIj48c3BhbiBzdHls
ZT0iY29sb3I6cmdiKDAsMCwwKSI+Wzwvc3Bhbj4iYm9va0NvdW50Ijwvc3Bhbj48c3BhbiBzdHls
ZT0iZm9udC12YXJpYW50LWxpZ2F0dXJlczpuby1jb21tb24tbGlnYXR1cmVzIj5dPC9zcGFuPjwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6SGVsdmV0aWNh
O2ZvbnQtc2l6ZToxMnB4Ij5BbmQgdGhpcyByZXF1aXJlcyBnZW5lcmljaXR5IG9uIHJldHVybiB0
eXBlLjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OkhlbHZldGljYTtmb250LXNpemU6MTJw
eCI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OkhlbHZldGljYTtmb250LXNpemU6
MTJweCI+R3dlbmRhbDwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OkhlbHZldGljYTtmb250
LXNpemU6MTJweCI+PGJyPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OkhlbHZldGljYTtm
b250LXNpemU6MTJweCI+PGRpdj48L2Rpdj48L2Rpdj48L2Rpdj48L3NwYW4+PC9kaXY+PC9zcGFu
PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pjxicj5fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX188d2JyPl9fX19fX19fX19fX19fX19fPGJyPgpzd2lmdC1ldm9sdXRpb24gbWFpbGlu
ZyBsaXN0PGJyPgo8YSBocmVmPSJtYWlsdG86c3dpZnQtZXZvbHV0aW9uQHN3aWZ0Lm9yZyI+c3dp
ZnQtZXZvbHV0aW9uQHN3aWZ0Lm9yZzwvYT48YnI+CjxhIGhyZWY9Imh0dHBzOi8vbGlzdHMuc3dp
ZnQub3JnL21haWxtYW4vbGlzdGluZm8vc3dpZnQtZXZvbHV0aW9uIiBkYXRhLXNhZmVyZWRpcmVj
dHVybD0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS91cmw/aGw9cnUmYW1wO3E9aHR0cHM6Ly9saXN0
cy5zd2lmdC5vcmcvbWFpbG1hbi9saXN0aW5mby9zd2lmdC1ldm9sdXRpb24mYW1wO3NvdXJjZT1n
bWFpbCZhbXA7dXN0PTE0ODQ1MDA2MzE5NjcwMDAmYW1wO3VzZz1BRlFqQ05FRmpFOXY5RWQtSmY1
X0lxbGx1UERQcXA4QlVnIiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5odHRwczov
L2xpc3RzLnN3aWZ0Lm9yZy88d2JyPm1haWxtYW4vbGlzdGluZm8vc3dpZnQtPHdicj5ldm9sdXRp
b248L2E+PGJyPgo8YnI+PC9ibG9ja3F1b3RlPjwvZGl2Pjxicj48L2Rpdj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0" class="">​</div></div></div>
</blockquote></div><br class=""></body></html>