<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}
h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}
h1 {
        color: #000000;
        font-size: 28pt;
}
h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}
h3 {
        font-size: 18px;
}
h4 {
        font-size: 16px;
}
h5 {
        font-size: 14px;
}
h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}
hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
display: inherit;
}
p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}
a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}
#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}
button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}
code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}
code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}
pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}
pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}
#ws { background-color: #f8f8f8; }
.bloop_markdown table {
border-collapse: collapse;
font-family: Helvetica, arial, freesans, clean, sans-serif;
color: rgb(51, 51, 51);
font-size: 15px; line-height: 25px;
padding: 0; }
.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }
.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }
.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }
.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }
.bloop_markdown blockquote{
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777; }
blockquote > :first-child {
margin-top: 0; }
blockquote > :last-child {
margin-bottom: 0; }
code, pre, #ws, #message {
word-break: normal;
word-wrap: normal;
}
hr {
display: inherit;
}
.bloop_markdown :first-child {
-webkit-margin-before: 0;
}
code, pre, #ws, #message {
font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}
.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>I’m fine with adding features step by step. ;)</p>
<p>There is no need for an explicit type alias in your</p>
<pre><code class="swift">extension MyStruct : Constructible<String> { … }
</code></pre>
<p>Because <code>Value</code> is already constrained by <code>String</code>.</p>
<hr>
<p><strong>2.</strong> Should have it’s own thread because the problem already exists today and is not yet formally solved.</p>
<pre><code class="swift">protocol A { var test: Int { get set } }
protocol B { var test: Int { get set } }
struct C : A, B {
// fine, but maybe there might be two different `test` properties
var test: Int = 42
// vs. (if there is that what was intended by `A` and `B`)
var A.test: Int = 0
var B.test: Int = 1
}
</code></pre>
<hr>
<p>In my <code>typealias</code> examples I mixed <strong>1.</strong> and <strong>4.</strong> together.</p>
<pre><code class="swift">protocol GenericFoo<T> : Foo where Value == T { /* nothing here */ }
typealias GenericFoo<T> = Foo where Value == T
</code></pre>
<p>I see that the latter cannot produce an actual new protocol, because it’s more like a macro and cannot be used multiple times for conformances.</p>
<pre><code class="swift">struct D : GenericFoo<Int>, GenericFoo<String> {}
// vs.
struct D : Foo where Value == Int, /* cannot add the second macro for String */ {}
</code></pre>
<p>And that is probably why we need real parametrized protocols. </p>
<p>That said, I’m fine starting with <strong>1.</strong> and really looking forward to the talk about <strong>4.</strong></p>
<hr>
<p>Questions about <strong>1.</strong>: </p>
<ul>
<li>Does it affect ABI or is it needed to simplify the stdlib somehow?</li>
<li>Is it something for the current phase?</li>
</ul>
<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1481369693439978240" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">-- <br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 10. Dezember 2016 um 11:31:09, Anton Zhilin (<a href="mailto:antonyzhilin@gmail.com">antonyzhilin@gmail.com</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div><div></div><div>
<title></title>
<div dir="ltr">
<div class="markdown-here-wrapper" style="">
<p style="margin:0px 0px 1.2em!important">I have to agree with Tino
Heth, our aim is to add something basic at first. Although we’d
better make sure that we will be able to add other wanted features
in the future.</p>
<p style="margin:0px 0px 1.2em!important">How about this plan?</p>
<ol style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">Generic protocols without associated
types</li>
<li style="margin:0.5em 0px">Basic conflict resolution using “dot”
syntax</li>
<li style="margin:0.5em 0px">Generic protocols with associated
types (depends on (2))</li>
<li style="margin:0.5em 0px">Specialization of non-generic
protocols with associated types (+work on existential
notation)</li>
</ol>
<p style="margin:0px 0px 1.2em!important">Some inline reply
follows.</p>
<p style="margin:0px 0px 1.2em!important"></p>
<div class="markdown-here-exclude">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div style="word-wrap:break-word">
<div class="gmail-m_6932992864106346999gmail-m_7779821207004609716bloop_markdown">
<p>While trying to find the talk about overlapping protocol members
from different protocols I spotted your proposal: <a href="https://github.com/Anton3/swift-evolution/blob/generic-protocols/proposals/NNNN-generic-protocols.md" target="_blank">https://github.com/Anton3/swif<wbr>t-evolution/blob/generic-proto<wbr>cols/proposals/NNNN-generic-<wbr>protocols.md</a></p>
</div>
</div>
</blockquote>
</div>
<p style="margin:0px 0px 1.2em!important"></p>
<p style="margin:0px 0px 1.2em!important">This is quite an old
listing. Thanks for reminding!</p>
<p style="margin:0px 0px 1.2em!important"></p>
<div class="markdown-here-exclude">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div style="word-wrap:break-word">
<div class="gmail-m_6932992864106346999gmail-m_7779821207004609716bloop_markdown">
<p>Here is the evolution-thread: <a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160919/027122.html" target="_blank">https://lists.swift.org/piperm<wbr>ail/swift-evolution/Week-of-<wbr>Mon–20160919/027122.html</a></p>
<p>The suggestion there was to prefix everything with the
corresponding protocol when there is a collision.</p>
<pre><code class="gmail-m_6932992864106346999gmail-m_7779821207004609716swift">struct Test : Foo<Int>, Foo<String> {
init(_ value: Foo<Int>.Value) { … } // or better: init(_ value: Int)
init(_ value: Foo<String>.Value) { … } // init(_ value: String)
// assume both had the function `foo()`
func Foo<Int>.foo() { … }
func Foo<String>.foo() { … }
}</code></pre></div>
</div>
</blockquote>
</div>
<p style="margin:0px 0px 1.2em!important"></p>
<p style="margin:0px 0px 1.2em!important">That’s a working
solution. It doesn’t scale very much, if we try to apply it to
protocol inheritance (conformance) hierarchies, but we shouldn’t
care for now.</p>
<p style="margin:0px 0px 1.2em!important"></p>
<div class="markdown-here-exclude">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div style="word-wrap:break-word">
<div class="gmail-m_6932992864106346999gmail-m_7779821207004609716bloop_markdown">
<pre>Is there really a need for true generic protocols? I’m still fascinated by the idea how a generic and constrained <code>typealias</code><span style="font-family:arial,sans-serif"> could create this new ‘pseudo’ generic protocol.</span></pre></div>
</div>
</blockquote>
</div>
<p style="margin:0px 0px 1.2em!important"></p>
<p style="margin:0px 0px 1.2em!important">I agree that ideally,
existing protocols should be intact. If so, then we should consider
“the original protocol with associated types” and “explicitly
specialized protocol” as two different protocols:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" 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;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">protocol</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Constructible</span> </span>{
associatedtype <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span>
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">foo</span><span class="hljs-params">()</span>
}
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">struct</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">MyStruct</span> : <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">Constructible</span> </span>{
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">typealias</span> <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span> = <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">foo</span><span class="hljs-params">()</span> </span>{ }
}
<span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extension</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">MyStruct</span> : <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Constructible</span><<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">String</span>> </span>{ <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// or Constructible<Value: String>, or whatever</span>
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">typealias</span> <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Constructible</span><<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">String</span>>.<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span> = <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">String</span>
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">Constructible</span><span class="hljs-generics"><String></span>.<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">foo</span><span class="hljs-params">()</span> </span>{ }
}
<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">MyStruct</span>.<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span> <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Int</span>
<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">MyStruct</span>.<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Constructible</span><<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">String</span>>.<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Value</span> <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// String</span>
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">bar</span><span class="hljs-generics"><T: Constructible></span><span class="hljs-params">(t: T)</span> // <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">can</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">call</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">with</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">MyStruct</span>
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">bar</span><span class="hljs-generics"><T: Constructible<Int></span>><span class="hljs-params">(t: T)</span> // <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">can</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">NOT</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">call</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">with</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">MyStruct</span>
<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">bar</span><span class="hljs-generics"><T: Constructible<String></span>><span class="hljs-params">(t: T)</span> // <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">can</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">call</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">with</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">MyStruct</span></span>
</code></pre>
<div title="MDH:PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2Pkkg aGF2ZSB0byBhZ3JlZSB3aXRoIFRpbm8gSGV0aCwgb3VyIGFpbSBpcyB0byBhZGQgc29tZXRoaW5n IGJhc2ljIGF0IGZpcnN0LiBBbHRob3VnaCB3ZSdkIGJldHRlciBtYWtlIHN1cmUgdGhhdCB3ZSB3 aWxsIGJlIGFibGUgdG8gYWRkIG90aGVyIHdhbnRlZCBmZWF0dXJlcyBpbiB0aGUgZnV0dXJlLjxi cj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkhvdyBhYm91dCB0aGlzIHBsYW4/PC9kaXY+PGRp dj48YnI+PC9kaXY+PGRpdj4xLiBHZW5lcmljIHByb3RvY29scyB3aXRob3V0IGFzc29jaWF0ZWQg dHlwZXM8L2Rpdj48ZGl2PjIuIEJhc2ljIGNvbmZsaWN0IHJlc29sdXRpb24gdXNpbmcgImRvdCIg c3ludGF4PC9kaXY+PGRpdj4zLiBHZW5lcmljIHByb3RvY29scyB3aXRoIGFzc29jaWF0ZWQgdHlw ZXMgKGRlcGVuZHMgb24gKDIpKTwvZGl2PjxkaXY+NC4gU3BlY2lhbGl6YXRpb24gb2Ygbm9uLWdl bmVyaWMgcHJvdG9jb2xzIHdpdGggYXNzb2NpYXRlZCB0eXBlcyAoK3dvcmsgb24gZXhpc3RlbnRp YWwgbm90YXRpb24pPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5Tb21lIGlubGluZSByZXBseSBm b2xsb3dzLjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48YmxvY2txdW90ZSBj bGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46IDBweCAwcHggMHB4IDAuOGV4OyBib3Jk ZXItbGVmdDogMXB4IHNvbGlkIHJnYigyMDQsIDIwNCwgMjA0KTsgcGFkZGluZy1sZWZ0OiAxZXg7 Ij48ZGl2IHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Ij48ZGl2IGNsYXNzPSJnbWFpbC1t XzY5MzI5OTI4NjQxMDYzNDY5OTlnbWFpbC1tXzc3Nzk4MjEyMDcwMDQ2MDk3MTZibG9vcF9tYXJr ZG93biI+Cgo8cD5XaGlsZSB0cnlpbmcgdG8gZmluZCB0aGUgdGFsayBhYm91dCBvdmVybGFwcGlu ZyBwcm90b2NvbCBtZW1iZXJzIGZyb20gZGlmZmVyZW50IHByb3RvY29scyBJIHNwb3R0ZWQgeW91 ciBwcm9wb3NhbDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0FudG9uMy9zd2lmdC1ldm9s dXRpb24vYmxvYi9nZW5lcmljLXByb3RvY29scy9wcm9wb3NhbHMvTk5OTi1nZW5lcmljLXByb3Rv Y29scy5tZCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9BbnRvbjMvc3dpZjx3 YnI+dC1ldm9sdXRpb24vYmxvYi9nZW5lcmljLXByb3RvPHdicj5jb2xzL3Byb3Bvc2Fscy9OTk5O LWdlbmVyaWMtPHdicj5wcm90b2NvbHMubWQ8L2E+PC9wPjwvZGl2PjwvZGl2PjwvYmxvY2txdW90 ZT48ZGl2PlRoaXMgaXMgcXVpdGUgYW4gb2xkIGxpc3RpbmcuIFRoYW5rcyBmb3IgcmVtaW5kaW5n ITwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjogMHB4 IDBweCAwcHggMC44ZXg7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiKDIwNCwgMjA0LCAyMDQp OyBwYWRkaW5nLWxlZnQ6IDFleDsiPjxkaXYgc3R5bGU9IndvcmQtd3JhcDogYnJlYWstd29yZDsi PjxkaXYgY2xhc3M9ImdtYWlsLW1fNjkzMjk5Mjg2NDEwNjM0Njk5OWdtYWlsLW1fNzc3OTgyMTIw NzAwNDYwOTcxNmJsb29wX21hcmtkb3duIj4KCjxwPkhlcmUgaXMgdGhlIGV2b2x1dGlvbi10aHJl YWQ6IDxhIGhyZWY9Imh0dHBzOi8vbGlzdHMuc3dpZnQub3JnL3BpcGVybWFpbC9zd2lmdC1ldm9s dXRpb24vV2Vlay1vZi1Nb24tMjAxNjA5MTkvMDI3MTIyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5o dHRwczovL2xpc3RzLnN3aWZ0Lm9yZy9waXBlcm08d2JyPmFpbC9zd2lmdC1ldm9sdXRpb24vV2Vl ay1vZi08d2JyPk1vbuKAkzIwMTYwOTE5LzAyNzEyMi5odG1sPC9hPjwvcD4KCjxwPlRoZSBzdWdn ZXN0aW9uIHRoZXJlIHdhcyB0byBwcmVmaXggZXZlcnl0aGluZyB3aXRoIHRoZSBjb3JyZXNwb25k aW5nIHByb3RvY29sIHdoZW4gdGhlcmUgaXMgYSBjb2xsaXNpb24uPC9wPgoKPHByZT48Y29kZSBj bGFzcz0iZ21haWwtbV82OTMyOTkyODY0MTA2MzQ2OTk5Z21haWwtbV83Nzc5ODIxMjA3MDA0NjA5 NzE2c3dpZnQiPnN0cnVjdCBUZXN0IDogRm9vJmx0O0ludCZndDssIEZvbyZsdDtTdHJpbmcmZ3Q7 IHsKICAgIGluaXQoXyB2YWx1ZTogRm9vJmx0O0ludCZndDsuVmFsdWUpIHsg4oCmIH0gICAgLy8g b3IgYmV0dGVyOiBpbml0KF8gdmFsdWU6IEludCkKICAgIGluaXQoXyB2YWx1ZTogRm9vJmx0O1N0 cmluZyZndDsuVmFsdWUpIHsg4oCmIH0gLy8gaW5pdChfIHZhbHVlOiBTdHJpbmcpCiAgICAgCiAg ICAvLyBhc3N1bWUgYm90aCBoYWQgdGhlIGZ1bmN0aW9uIGBmb28oKWAKICAgIGZ1bmMgRm9vJmx0 O0ludCZndDsuZm9vKCkgeyDigKYgfQogICAgZnVuYyBGb28mbHQ7U3RyaW5nJmd0Oy5mb28oKSB7 IOKApiB9Cn08L2NvZGU+PC9wcmU+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxkaXY+VGhhdCdz IGEgd29ya2luZyBzb2x1dGlvbi4gSXQgZG9lc24ndCBzY2FsZSB2ZXJ5IG11Y2gsIGlmIHdlIHRy eSB0byBhcHBseSBpdCB0byBwcm90b2NvbCBpbmhlcml0YW5jZSAoY29uZm9ybWFuY2UpIGhpZXJh cmNoaWVzLCBidXQgd2Ugc2hvdWxkbid0IGNhcmUgZm9yIG5vdy48L2Rpdj48YmxvY2txdW90ZSBj bGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46IDBweCAwcHggMHB4IDAuOGV4OyBib3Jk ZXItbGVmdDogMXB4IHNvbGlkIHJnYigyMDQsIDIwNCwgMjA0KTsgcGFkZGluZy1sZWZ0OiAxZXg7 Ij48ZGl2IHN0eWxlPSJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Ij48ZGl2IGNsYXNzPSJnbWFpbC1t XzY5MzI5OTI4NjQxMDYzNDY5OTlnbWFpbC1tXzc3Nzk4MjEyMDcwMDQ2MDk3MTZibG9vcF9tYXJr ZG93biI+PHByZT5JcyB0aGVyZSByZWFsbHkgYSBuZWVkIGZvciB0cnVlIGdlbmVyaWMgcHJvdG9j b2xzPyBJ4oCZbSBzdGlsbCBmYXNjaW5hdGVkIGJ5IHRoZSBpZGVhIGhvdyBhIGdlbmVyaWMgYW5k IGNvbnN0cmFpbmVkIDxjb2RlPnR5cGVhbGlhczwvY29kZT48c3BhbiBzdHlsZT0iZm9udC1mYW1p bHk6IGFyaWFsLCBzYW5zLXNlcmlmOyI+IGNvdWxkIGNyZWF0ZSB0aGlzIG5ldyDigJhwc2V1ZG/i gJkgZ2VuZXJpYyBwcm90b2NvbC48L3NwYW4+PC9wcmU+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3Rl PjxkaXY+SSBhZ3JlZSB0aGF0IGlkZWFsbHksIGV4aXN0aW5nIHByb3RvY29scyBzaG91bGQgYmUg aW50YWN0LiBJZiBzbywgdGhlbiB3ZSBzaG91bGQgY29uc2lkZXIgInRoZSBvcmlnaW5hbCBwcm90 b2NvbCB3aXRoIGFzc29jaWF0ZWQgdHlwZXMiIGFuZCAiZXhwbGljaXRseSBzcGVjaWFsaXplZCBw cm90b2NvbCIgYXMgdHdvIGRpZmZlcmVudCBwcm90b2NvbHM6PC9kaXY+PGRpdj48YnI+PC9kaXY+ PGRpdj5gYGBzd2lmdDwvZGl2PjxkaXY+cHJvdG9jb2wgQ29uc3RydWN0aWJsZSB7PC9kaXY+PGRp dj4mbmJzcDsgJm5ic3A7IGFzc29jaWF0ZWR0eXBlIFZhbHVlPC9kaXY+PGRpdj4mbmJzcDsgJm5i c3A7IGZ1bmMgZm9vKCk8L2Rpdj48ZGl2Pn08L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PnN0cnVj dCBNeVN0cnVjdCA6IENvbnN0cnVjdGlibGUgezwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyB0eXBl YWxpYXMgVmFsdWUgPSBJbnQ8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgZnVuYyBmb28oKSB7IH08 L2Rpdj48ZGl2Pn08L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmV4dGVuc2lvbiBNeVN0cnVjdCA6 IENvbnN0cnVjdGlibGUmbHQ7U3RyaW5nJmd0OyB7ICZuYnNwOy8vIG9yIENvbnN0cnVjdGlibGUm bHQ7VmFsdWU6IFN0cmluZyZndDssIG9yIHdoYXRldmVyPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7 IHR5cGVhbGlhcyBDb25zdHJ1Y3RpYmxlJmx0O1N0cmluZyZndDsuVmFsdWUgPSBTdHJpbmc8L2Rp dj48ZGl2PiZuYnNwOyAmbmJzcDsgZnVuYyBDb25zdHJ1Y3RpYmxlJmx0O1N0cmluZyZndDsuZm9v KCkgeyB9PC9kaXY+PGRpdj59PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5NeVN0cnVjdC5WYWx1 ZSAmbmJzcDsvLyBJbnQ8L2Rpdj48ZGl2Pk15U3RydWN0LkNvbnN0cnVjdGlibGUmbHQ7U3RyaW5n Jmd0Oy5WYWx1ZSAmbmJzcDsvLyBTdHJpbmc8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmZ1bmMg YmFyJmx0O1Q6IENvbnN0cnVjdGlibGUmZ3Q7KHQ6IFQpICZuYnNwOy8vIGNhbiBjYWxsIHdpdGgg TXlTdHJ1Y3Q8L2Rpdj48ZGl2PmZ1bmMgYmFyJmx0O1Q6IENvbnN0cnVjdGlibGUmbHQ7SW50Jmd0 OyZndDsodDogVCkgJm5ic3A7Ly8gY2FuIE5PVCBjYWxsIHdpdGggTXlTdHJ1Y3Q8YnI+PC9kaXY+ ZnVuYyBiYXImbHQ7VDogQ29uc3RydWN0aWJsZSZsdDtTdHJpbmcmZ3Q7Jmd0Oyh0OiBUKSAmbmJz cDsvLyBjYW4gY2FsbCB3aXRoIE15U3RydWN0PGRpdj5gYGA8L2Rpdj48L2Rpdj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">
</div>
</div>
</div>
</div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>