<html 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=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 5 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:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        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;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:578683458;
        mso-list-template-ids:-1;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        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:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        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:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        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:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        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:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        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:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        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:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        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:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        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:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Ping. Do we have any advice on this proposal? Thanks!<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>---<br>Best Regards,<br>Ke Bai</p><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p> </o:p></span></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='border:none;padding:0in'><b>From: </b><a href="mailto:kebai613@gmail.com">Ke Bai</a><br><b>Sent: </b>Thursday, January 28, 2016 12:27 PM<br><b>To: </b><a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br><b>Subject: </b>Memory scope proposal</p></div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p> </o:p></span></p><div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:black'>Hi all,</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p> </o:p></span></p><p style='margin:0in;margin-bottom:.0001pt'><span style='font-family:"Arial",sans-serif;color:#222222'>Currently, the LLVM IR uses a binary value (SingleThread/CrossThread) to represent synchronization scope on atomic instructions. We would like to enhance the representation of memory scopes in LLVM IR to allow more values than just the current two. The intention of this email is to invite comments on our proposal. There are some discussion before and </span><span style='font-family:"Arial",sans-serif;color:black'>it can be found here:</span></p><p style='margin:0in;margin-bottom:.0001pt'><a href="https://groups.google.com/forum/#!searchin/llvm-dev/hsail/llvm-dev/46eEpS5h0E4/i3T9xw-DNVYJ"><span style='font-family:"Arial",sans-serif;color:#1155CC'>https://groups.google.com/forum/#!searchin/llvm-dev/hsail/llvm-dev/46eEpS5h0E4/i3T9xw-DNVYJ</span></a></p><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p> </o:p></span></p><p style='margin:0in;margin-bottom:.0001pt'><span style='font-family:"Arial",sans-serif'>Here is our new proposal:</span></p><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman",serif'>=================================================================<o:p></o:p></span></p></div></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>We still let the bitcode store memory scopes as <b>unsigned integers</b>, since that is the easiest way to maintain compatibility. The values 0 and 1 are special. All other values are meaningful only within that bc file. In addition, <b>a global metadata in the file will provide a map</b> from unsigned integers to string symbols which should be used to interpret all the non-standard integers. If the global metadata is empty or non-existent, then all non-zero values will be mapped to "system", which is the current behavior.</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><div style='margin-top:5.75pt;margin-bottom:.15in'><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>The proposed syntax for synchronization scope is as follows:</span><span style='font-size:12.0pt;color:#212121'><o:p></o:p></span></p></div></div><div><ul type=disc><li class=MsoNormal style='color:#212121;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>Synchronization scopes are of arbitrary width, but implemented as unsigned in the bitcode, just like address spaces.</span><span style='font-size:12.0pt'><o:p></o:p></span></li><li class=MsoNormal style='color:#212121;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>Cross-thread is default.</span><span style='font-size:12.0pt'><o:p></o:p></span></li><li class=MsoNormal style='color:#212121;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>Keyword "singlethread" is unchanged</span><span style='font-size:12.0pt'><o:p></o:p></span></li><li class=MsoNormal style='color:#212121;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>New syntax "synchscope(n)" for other target-specific scopes. </span><span style='font-size:12.0pt'><o:p></o:p></span></li><li class=MsoNormal style='color:#212121;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>There is no keyword for cross-thread, but it can be specified as "synchscope(0)".</span><span style='font-size:12.0pt'><o:p></o:p></span></li></ul></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>The proposed new integer implementation expanded synchronization scopes are as follows: </span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width=638 style='width:478.5pt'><tr><td width=154 style='width:115.5pt;border-top:solid #000001 1.0pt;border-left:solid #000001 1.0pt;border-bottom:none;border-right:none;background:black;padding:0in 0in 0in 5.4pt'><div><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:white'>Format</span></b><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=153 style='width:114.75pt;border:none;border-top:solid #000001 1.0pt;background:black;padding:0in 0in 0in 0in'><div><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:white'>Single Thread</span></b><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=156 style='width:117.0pt;border:none;border-top:solid #000001 1.0pt;background:black;padding:0in 0in 0in 0in'><div><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:white'>System (renamed)</span></b><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=117 style='width:87.75pt;border-top:solid #000001 1.0pt;border-left:none;border-bottom:none;border-right:solid #000001 1.0pt;background:black;padding:0in 5.75pt 0in 0in'><div><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:white'>Intermediate</span></b><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td></tr><tr><td width=154 style='width:115.5pt;border:solid #000001 1.0pt;padding:0in 5.75pt 0in 5.4pt'><div><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>Bitcode</span></b><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=153 style='width:114.75pt;border:solid #000001 1.0pt;padding:0in 5.75pt 0in 5.4pt'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>zero</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=156 style='width:117.0pt;border:solid #000001 1.0pt;padding:0in 5.75pt 0in 5.4pt'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>one</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=117 style='width:87.75pt;border:solid #000001 1.0pt;padding:0in 5.75pt 0in 5.4pt'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>unsigned n</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td></tr><tr><td width=154 style='width:115.5pt;border:none;border-left:solid #000001 1.0pt;padding:0in 0in 0in 5.4pt'><div><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>Assembly</span></b><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=153 style='width:114.75pt;padding:0in 0in 0in 0in'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>singlethread,<br>synchscope(~0U)</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=156 style='width:117.0pt;padding:0in 0in 0in 0in'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>empty (default),<br>synchscope(0)</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=117 style='width:87.75pt;border:none;border-right:solid #000001 1.0pt;padding:0in 5.75pt 0in 0in'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>synchscope(n-1)</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td></tr><tr><td width=154 style='width:115.5pt;border:solid #000001 1.0pt;padding:0in 5.75pt 0in 5.4pt'><div><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>In-memory</span></b><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=153 style='width:114.75pt;border:solid #000001 1.0pt;padding:0in 5.75pt 0in 5.4pt'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>~0U</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=156 style='width:117.0pt;border:solid #000001 1.0pt;padding:0in 5.75pt 0in 5.4pt'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>zero</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=117 style='width:87.75pt;border:solid #000001 1.0pt;padding:0in 5.75pt 0in 5.4pt'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>unsigned n-1</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td></tr><tr><td width=154 style='width:115.5pt;border-top:none;border-left:solid #000001 1.0pt;border-bottom:solid #000001 1.0pt;border-right:none;padding:0in 0in 0in 5.4pt'><div><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>SelectionDAG</span></b><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=153 style='width:114.75pt;border:none;border-bottom:solid #000001 1.0pt;padding:0in 0in 0in 0in'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>~0U</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=156 style='width:117.0pt;border:none;border-bottom:solid #000001 1.0pt;padding:0in 0in 0in 0in'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>zero</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td><td width=117 style='width:87.75pt;border-top:none;border-left:none;border-bottom:solid #000001 1.0pt;border-right:solid #000001 1.0pt;padding:0in 5.75pt 0in 0in'><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif'>unsigned n-1</span><span style='font-size:12.0pt;font-family:"Times New Roman",serif'><o:p></o:p></span></p></div></td></tr></table><div style='margin-top:5.75pt;margin-bottom:.15in'><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>The choice of “~0U” for singlethread makes it easy to maintain backward compatibility in the bitcode. The values 0 and 1 remain unchanged in the bitcode, and the reader simply decrements them by one to compute the correct value in the in-memory data-structure.</span><span style='font-size:12.0pt;color:#212121'><o:p></o:p></span></p></div><div style='margin-top:5.75pt;margin-bottom:.15in'><p style='mso-margin-top-alt:6.0pt;margin-right:0in;margin-bottom:11.0pt;margin-left:0in'><b><span style='font-family:"Arial",sans-serif;color:black'>Name Mapping</span></b><span style='font-family:"Calibri",sans-serif;color:#212121'><o:p></o:p></span></p><p style='mso-margin-top-alt:6.0pt;margin-right:0in;margin-bottom:11.0pt;margin-left:0in'><span style='font-family:"Arial",sans-serif;color:black'>Now we comes to name mapping from integers to strings. If a CLANG front end wants to map a language that has memory scopes (e.g. OpenCL) to LLVM IR, how does it determine what syncscopes to use? Without any rules, each target can define its own meaning for the scopes, can give them any name, and can map them to the LLVM-IR unit values in any way. In this case, I think each target have to provide a mapping function that maps a specific language’s name for a scope into that targets name for a scope that has conservatively the same semantics. Namely, the act of supporting a new language that has memory scopes requires every target to support that language to be updated accordingly.</span><span style='font-family:"Calibri",sans-serif;color:#212121'><o:p></o:p></span></p><p style='mso-margin-top-alt:6.0pt;margin-right:0in;margin-bottom:11.0pt;margin-left:0in'><span style='font-family:"Arial",sans-serif;color:black'>Therefore, in order to allow front end writers to share memory scope definitions when they match to avoid the effort of updating all targets for each language,it's better to define standard memory scope names. A target is free to implement them or not, but if a target does implement them they must have the defined relational semantics (e.g., hierarchical nesting). If a target does implement them then it will be able to support any language that uses them, including languages not yet invented. A new memory scope name can be added if the existing ones are insufficient. </span><span style='font-family:"Calibri",sans-serif;color:#212121'><o:p></o:p></span></p><p style='mso-margin-top-alt:6.0pt;margin-right:0in;margin-bottom:11.0pt;margin-left:0in'><span style='font-family:"Arial",sans-serif;color:black'>With the first try, we can define the standard scopes with what a common language that has memory scopes needs, e.g., OpenCL uses system, device, workgroup, workitem. It uses the same approach as LLVM has done for debug information. There are standard debug entities (that a common language (C) needs), and each new language uses those standard entities where there is a match, and subsequently defines only the delta.</span><span style='font-family:"Calibri",sans-serif;color:#212121'><o:p></o:p></span></p></div><div style='margin-top:5.75pt;margin-bottom:.15in'><p class=MsoNormal><b><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>A bitcode example with the proposal</span></b><span style='font-size:12.0pt;color:#212121'><o:p></o:p></span></p></div></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>define void  <at> test(i32* %addr) {</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>; forward compatibility</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>  cmpxchg i32* %addr, i32 42, i32 0 singlethread monotonic monotonic</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>; new synchscope that will be defined by each backend</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>  cmpxchg i32* %addr, i32 42, i32 0 synchscope(2) monotonic monotonic, 2</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>  cmpxchg i32* %addr, i32 42, i32 0 synchscope(3) monotonic monotonic, 3</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>  ret void</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>}</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>!synchscope = metadata !{{i32 0, !"SingleThread"}, {i32 2, !"WorkGroup"}, ...}</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Helvetica",sans-serif;color:#212121'>=================================================================</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>Thank you!</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>---</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div><div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>Best regards,</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p></div></div><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Arial",sans-serif;color:#212121'>Ke</span><span style='font-size:12.0pt;color:black'><o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>