<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>130622</bug_id>
          
          <creation_ts>2014-03-21 15:57:24 -0700</creation_ts>
          <short_desc>[iOS WebKit2] Dictation support</short_desc>
          <delta_ts>2014-03-24 16:52:44 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Enrica Casucci">enrica</reporter>
          <assigned_to name="Enrica Casucci">enrica</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>993354</commentid>
    <comment_count>0</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-21 15:57:24 -0700</bug_when>
    <thetext>Tracks the work required to support dictation in WK2 on iOS.

&lt;rdar://problem/15337316&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>993359</commentid>
    <comment_count>1</comment_count>
      <attachid>227504</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-21 16:02:52 -0700</bug_when>
    <thetext>Created attachment 227504
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>993926</commentid>
    <comment_count>2</comment_count>
      <attachid>227504</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2014-03-24 12:37:52 -0700</bug_when>
    <thetext>Comment on attachment 227504
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=227504&amp;action=review

&gt; Source/WebKit2/ChangeLog:9
&gt; +        Adding support for dictation on iOS. There are two main types of interaction

interaction(s)?

&gt; Source/WebKit2/UIProcess/AutoCorrectionCallback.h:141
&gt; +        ASSERT(m_callback);
&gt; +
&gt; +        m_callback(false, returnValue1, returnValue2, returnValue3);
&gt; +

I think you can remove the blank line. This code is clear without paragraphs.

&gt; Source/WebKit2/UIProcess/AutoCorrectionCallback.h:142
&gt; +        m_callback = 0;

= nullptr;

&gt; Source/WebKit2/UIProcess/AutoCorrectionCallback.h:151
&gt; +        m_callback = 0;

= nullptr;

&gt; Source/WebKit2/UIProcess/AutoCorrectionCallback.h:162
&gt; +    };

Indent issue here.

&gt; Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h:106
&gt; +    UIWKDictationContextHandler _dictationHandler;

I don&apos;t understand why is this an attribute of the view interaction. Shouldn&apos;t it be just local to requestDictationContext:?

If it needs to be here, shouldn&apos;t it uses RetainPtr?

&gt; Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm:1270
&gt; +- (void)requestDictationContext:(void (^)(NSString *selected, NSString *prefix, NSString *postfix))completionHandler

Not sure if prefix/suffix is the best description for the variables here.

&gt; Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm:1273
&gt; +    _page-&gt;requestDictationContext(DictationContextCallback::create([self](bool /*error*/, const String&amp; selectedText, const String&amp; beforeText, const String&amp; afterText) {

Shouldn&apos;t you capture the dictationHandler instead of self?

&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:1215
&gt; +    if (startPosition != startOfEditableContent(startPosition)) {
&gt; +        VisiblePosition currentPosition = startPosition;
&gt; +        VisiblePosition lastPosition = startPosition;
&gt; +        for (unsigned i = 0; i &lt; dictationContextWordCount; ++i) {
&gt; +            currentPosition = startOfWord(positionOfNextBoundaryOfGranularity(lastPosition, WordGranularity, DirectionBackward));
&gt; +            if (currentPosition.isNull())
&gt; +                break;
&gt; +            lastPosition = currentPosition;
&gt; +        }
&gt; +        if (lastPosition.isNotNull() &amp;&amp; lastPosition != startPosition)
&gt; +            contextBefore = plainText(Range::create(*frame.document(), lastPosition, startPosition).get());
&gt; +    }

Could you make this into a function taking the direction and wordCount as argument? The before and after cases look very similar.

&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:1234
&gt; +void WebPage::replaceDictatedText(const String&amp; oldText, const String&amp; newText)

If find this a little confusing. The name does not really match with the code.

oldText is unused, only its length is used here. The code does not seem related to dictation, just with the selection.

Shouldn&apos;t this be: replaceCharactersBeforeSelection(unsigned positionCount, const String&amp; replacementText)?

&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:1236
&gt; +    RefPtr&lt;Range&gt; range;

This should be moved bellow where the range is used.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>993941</commentid>
    <comment_count>3</comment_count>
      <attachid>227504</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-24 13:27:43 -0700</bug_when>
    <thetext>Comment on attachment 227504
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=227504&amp;action=review

&gt;&gt; Source/WebKit2/UIProcess/AutoCorrectionCallback.h:151
&gt;&gt; +        m_callback = 0;
&gt; 
&gt; = nullptr;

Just copy pasted from other class that uses 0. I&apos;ll change it.

&gt;&gt; Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h:106
&gt;&gt; +    UIWKDictationContextHandler _dictationHandler;
&gt; 
&gt; I don&apos;t understand why is this an attribute of the view interaction. Shouldn&apos;t it be just local to requestDictationContext:?
&gt; 
&gt; If it needs to be here, shouldn&apos;t it uses RetainPtr?

It doesn&apos;t need to be here.

&gt;&gt; Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm:1273
&gt;&gt; +    _page-&gt;requestDictationContext(DictationContextCallback::create([self](bool /*error*/, const String&amp; selectedText, const String&amp; beforeText, const String&amp; afterText) {
&gt; 
&gt; Shouldn&apos;t you capture the dictationHandler instead of self?

Self refers to the callback, not the handler.

&gt;&gt; Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm:1234
&gt;&gt; +void WebPage::replaceDictatedText(const String&amp; oldText, const String&amp; newText)
&gt; 
&gt; If find this a little confusing. The name does not really match with the code.
&gt; 
&gt; oldText is unused, only its length is used here. The code does not seem related to dictation, just with the selection.
&gt; 
&gt; Shouldn&apos;t this be: replaceCharactersBeforeSelection(unsigned positionCount, const String&amp; replacementText)?

Actually it should also check that the text matches. I want to leave the name that mentions dictation because in the future this code will be used to animate the dictated text.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>993956</commentid>
    <comment_count>4</comment_count>
      <attachid>227690</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-24 13:52:02 -0700</bug_when>
    <thetext>Created attachment 227690
Patch2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>994028</commentid>
    <comment_count>5</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2014-03-24 16:52:44 -0700</bug_when>
    <thetext>Committed revision 166208.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>227504</attachid>
            <date>2014-03-21 16:02:52 -0700</date>
            <delta_ts>2014-03-24 13:52:02 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>dictation-webkit.txt</filename>
            <type>text/plain</type>
            <size>16668</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NjEwNCkKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQwIEBACisyMDE0LTAzLTIxICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgW2lPUyBXZWJLaXQyXSBEaWN0
YXRpb24gc3VwcG9ydC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTEzMDYyMgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTUzMzczMTY+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkaW5nIHN1cHBvcnQg
Zm9yIGRpY3RhdGlvbiBvbiBpT1MuIFRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiBpbnRlcmFj
dGlvbgorICAgICAgICB3aXRoIHRoZSBkaWN0YXRpb24gc3lzdGVtOgorICAgICAgICAtIGluaXRp
YWwgcmVxdWVzdCBmb3IgY29udGV4dCwgd2hpY2ggY29uc2lzdHMgaW4gcmV0cmlldmluZyB0aGUg
c2VsZWN0ZWQgdGV4dAorICAgICAgICBhbmQgNSB3b3JkcyBiZWZvcmUgdGhlIHNlbGVjdGlvbiBh
bmQgNSB3b3JkcyBhZnRlciwgaWYgYXZhaWxhYmxlLgorICAgICAgICAtIGluc2VydGlvbiBvZiBy
ZWNvZ25pemVkIGNodW5rcyBvZiB0ZXh0LCBwcm92aWRpbmcgdGhlIHRleHQKKyAgICAgICAgdG8g
cmVwbGFjZS4KKyAgICAKKyAgICAgICAgKiBVSVByb2Nlc3MvQXV0b0NvcnJlY3Rpb25DYWxsYmFj
ay5oOgorICAgICAgICAoV2ViS2l0OjpEaWN0YXRpb25Db250ZXh0Q2FsbGJhY2s6OmNyZWF0ZSk6
CisgICAgICAgIChXZWJLaXQ6OkRpY3RhdGlvbkNvbnRleHRDYWxsYmFjazo6fkRpY3RhdGlvbkNv
bnRleHRDYWxsYmFjayk6CisgICAgICAgIChXZWJLaXQ6OkRpY3RhdGlvbkNvbnRleHRDYWxsYmFj
azo6cGVyZm9ybUNhbGxiYWNrV2l0aFJldHVyblZhbHVlKToKKyAgICAgICAgKFdlYktpdDo6RGlj
dGF0aW9uQ29udGV4dENhbGxiYWNrOjppbnZhbGlkYXRlKToKKyAgICAgICAgKFdlYktpdDo6RGlj
dGF0aW9uQ29udGV4dENhbGxiYWNrOjpEaWN0YXRpb25Db250ZXh0Q2FsbGJhY2spOgorICAgICAg
ICAqIFVJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaDoKKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFn
ZVByb3h5Lm1lc3NhZ2VzLmluOgorICAgICAgICAqIFVJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmll
d0ludGVyYWN0aW9uLmg6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3SW50
ZXJhY3Rpb24ubW06CisgICAgICAgICgtW1dLQ29udGVudFZpZXcgcmVwbGFjZURpY3RhdGVkVGV4
dDp3aXRoVGV4dDpdKToKKyAgICAgICAgKC1bV0tDb250ZW50VmlldyByZXF1ZXN0RGljdGF0aW9u
Q29udGV4dDpdKToKKyAgICAgICAgKiBVSVByb2Nlc3MvaW9zL1dlYlBhZ2VQcm94eUlPUy5tbToK
KyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpkaWN0YXRpb25Db250ZXh0Q2FsbGJhY2sp
OgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OnJlcGxhY2VEaWN0YXRlZFRleHQpOgor
ICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OnJlcXVlc3REaWN0YXRpb25Db250ZXh0KToK
KyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oOgorICAgICAgICAqIFdlYlBy
b2Nlc3MvV2ViUGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluOgorICAgICAgICAqIFdlYlByb2Nlc3Mv
V2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZTo6cmVx
dWVzdERpY3RhdGlvbkNvbnRleHQpOgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlOjpyZXBsYWNl
RGljdGF0ZWRUZXh0KToKKwogMjAxNC0wMy0yMSAgU2FtIFdlaW5pZyAgPHNhbUB3ZWJraXQub3Jn
PgogCiAgICAgICAgIFtXZWJLaXQyXSBJbXBsZW1lbnQgTmV0d29ya2luZ0NvbnRleHQ6OnNvdXJj
ZUFwcGxpY2F0aW9uQXVkaXREYXRhKCkgZm9yIFdlYktpdDIKSW5kZXg6IFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BdXRvQ29ycmVjdGlvbkNhbGxiYWNrLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0F1dG9Db3JyZWN0aW9uQ2FsbGJhY2suaAkocmV2aXNpb24gMTY2
MDk0KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0F1dG9Db3JyZWN0aW9uQ2FsbGJhY2su
aAkod29ya2luZyBjb3B5KQpAQCAtMTE5LDYgKzExOSw0OCBAQCBwcml2YXRlOgogICAgIENhbGxi
YWNrRnVuY3Rpb24gbV9jYWxsYmFjazsKIH07CiAKK2NsYXNzIERpY3RhdGlvbkNvbnRleHRDYWxs
YmFjayA6IHB1YmxpYyBDYWxsYmFja0Jhc2UgeworcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpm
dW5jdGlvbjx2b2lkIChib29sLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBjb25zdCBT
dHJpbmcmKT4gQ2FsbGJhY2tGdW5jdGlvbjsKKworICAgIHN0YXRpYyBQYXNzUmVmUHRyPERpY3Rh
dGlvbkNvbnRleHRDYWxsYmFjaz4gY3JlYXRlKENhbGxiYWNrRnVuY3Rpb24gY2FsbGJhY2spCisg
ICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IERpY3RhdGlvbkNvbnRleHRDYWxsYmFj
ayhjYWxsYmFjaykpOworICAgIH0KKworICAgIHZpcnR1YWwgfkRpY3RhdGlvbkNvbnRleHRDYWxs
YmFjaygpCisgICAgeworICAgICAgICBBU1NFUlQoIW1fY2FsbGJhY2spOworICAgIH0KKworICAg
IHZvaWQgcGVyZm9ybUNhbGxiYWNrV2l0aFJldHVyblZhbHVlKGNvbnN0IFN0cmluZyYgcmV0dXJu
VmFsdWUxLCBjb25zdCBTdHJpbmcmIHJldHVyblZhbHVlMiwgY29uc3QgU3RyaW5nJiByZXR1cm5W
YWx1ZTMpCisgICAgeworICAgICAgICBBU1NFUlQobV9jYWxsYmFjayk7CisKKyAgICAgICAgbV9j
YWxsYmFjayhmYWxzZSwgcmV0dXJuVmFsdWUxLCByZXR1cm5WYWx1ZTIsIHJldHVyblZhbHVlMyk7
CisKKyAgICAgICAgbV9jYWxsYmFjayA9IDA7CisgICAgfQorCisgICAgdm9pZCBpbnZhbGlkYXRl
KCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxiYWNrKTsKKworICAgICAgICBtX2NhbGxi
YWNrKHRydWUsIFN0cmluZygpLCBTdHJpbmcoKSwgU3RyaW5nKCkpOworCisgICAgICAgIG1fY2Fs
bGJhY2sgPSAwOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgRGljdGF0aW9uQ29udGV4dENh
bGxiYWNrKENhbGxiYWNrRnVuY3Rpb24gY2FsbGJhY2spCisgICAgICAgIDogbV9jYWxsYmFjayhj
YWxsYmFjaykKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxiYWNrKTsKKyAgICB9CisgICAg
CisgICAgQ2FsbGJhY2tGdW5jdGlvbiBtX2NhbGxiYWNrOworICAgIH07CisKIH0gLy8gbmFtZXNw
YWNlIFdlYktpdAogCiAjZW5kaWYgLy8gQXV0b0NvcnJlY3Rpb25DYWxsYmFja19oCkluZGV4OiBT
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oCShyZXZpc2lvbiAxNjYwOTQpCisr
KyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJKHdvcmtpbmcgY29weSkK
QEAgLTU4Niw2ICs1ODYsOCBAQCBwdWJsaWM6CiAgICAgYm9vbCBhcHBseUF1dG9jb3JyZWN0aW9u
KGNvbnN0IFN0cmluZyYgY29ycmVjdGlvbiwgY29uc3QgU3RyaW5nJiBvcmlnaW5hbFRleHQpOwog
ICAgIHZvaWQgcmVxdWVzdEF1dG9jb3JyZWN0aW9uQ29udGV4dChQYXNzUmVmUHRyPEF1dG9jb3Jy
ZWN0aW9uQ29udGV4dENhbGxiYWNrPik7CiAgICAgdm9pZCBnZXRBdXRvY29ycmVjdGlvbkNvbnRl
eHQoU3RyaW5nJiBjb250ZXh0QmVmb3JlLCBTdHJpbmcmIG1hcmtlZFRleHQsIFN0cmluZyYgc2Vs
ZWN0ZWRUZXh0LCBTdHJpbmcmIGNvbnRleHRBZnRlciwgdWludDY0X3QmIGxvY2F0aW9uLCB1aW50
NjRfdCYgbGVuZ3RoKTsKKyAgICB2b2lkIHJlcXVlc3REaWN0YXRpb25Db250ZXh0KFBhc3NSZWZQ
dHI8RGljdGF0aW9uQ29udGV4dENhbGxiYWNrPik7CisgICAgdm9pZCByZXBsYWNlRGljdGF0ZWRU
ZXh0KGNvbnN0IFN0cmluZyYgb2xkVGV4dCwgY29uc3QgU3RyaW5nJiBuZXdUZXh0KTsKICAgICB2
b2lkIGRpZFJlY2VpdmVQb3NpdGlvbkluZm9ybWF0aW9uKGNvbnN0IEludGVyYWN0aW9uSW5mb3Jt
YXRpb25BdFBvc2l0aW9uJik7CiAgICAgdm9pZCBnZXRQb3NpdGlvbkluZm9ybWF0aW9uKGNvbnN0
IFdlYkNvcmU6OkludFBvaW50JiwgSW50ZXJhY3Rpb25JbmZvcm1hdGlvbkF0UG9zaXRpb24mKTsK
ICAgICB2b2lkIHJlcXVlc3RQb3NpdGlvbkluZm9ybWF0aW9uKGNvbnN0IFdlYkNvcmU6OkludFBv
aW50Jik7CkBAIC0xMjgwLDYgKzEyODIsNyBAQCBwcml2YXRlOgogICAgIHZvaWQgdG91Y2hlc0Nh
bGxiYWNrKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgdWludDMyX3QsIHVpbnQ2NF90KTsKICAg
ICB2b2lkIGF1dG9jb3JyZWN0aW9uRGF0YUNhbGxiYWNrKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpG
bG9hdFJlY3Q+JiwgY29uc3QgU3RyaW5nJiwgZmxvYXQsIHVpbnQ2NF90LCB1aW50NjRfdCk7CiAg
ICAgdm9pZCBhdXRvY29ycmVjdGlvbkNvbnRleHRDYWxsYmFjayhjb25zdCBTdHJpbmcmLCBjb25z
dCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1aW50NjRfdCwgdWludDY0
X3QsIHVpbnQ2NF90KTsKKyAgICB2b2lkIGRpY3RhdGlvbkNvbnRleHRDYWxsYmFjayhjb25zdCBT
dHJpbmcmLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1aW50NjRfdCk7CiAgICAgdm9p
ZCBpbnRlcnByZXRLZXlFdmVudChjb25zdCBFZGl0b3JTdGF0ZSYsIGJvb2wgaXNDaGFyRXZlbnQs
IGJvb2wmIGhhbmRsZWQpOwogI2VuZGlmCiAjaWYgUExBVEZPUk0oR1RLKQpAQCAtMTQyMyw2ICsx
NDI2LDcgQEAgcHJpdmF0ZToKICAgICBIYXNoTWFwPHVpbnQ2NF90LCBSZWZQdHI8VG91Y2hlc0Nh
bGxiYWNrPj4gbV90b3VjaGVzQ2FsbGJhY2tzOwogICAgIEhhc2hNYXA8dWludDY0X3QsIFJlZlB0
cjxBdXRvY29ycmVjdGlvbkRhdGFDYWxsYmFjaz4+IG1fYXV0b2NvcnJlY3Rpb25DYWxsYmFja3M7
CiAgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPEF1dG9jb3JyZWN0aW9uQ29udGV4dENhbGxi
YWNrPj4gbV9hdXRvY29ycmVjdGlvbkNvbnRleHRDYWxsYmFja3M7CisgICAgSGFzaE1hcDx1aW50
NjRfdCwgUmVmUHRyPERpY3RhdGlvbkNvbnRleHRDYWxsYmFjaz4+IG1fZGljdGF0aW9uQ29udGV4
dENhbGxiYWNrczsKICNlbmRpZgogI2lmIFBMQVRGT1JNKEdUSykKICAgICBIYXNoTWFwPHVpbnQ2
NF90LCBSZWZQdHI8UHJpbnRGaW5pc2hlZENhbGxiYWNrPj4gbV9wcmludEZpbmlzaGVkQ2FsbGJh
Y2tzOwpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdl
cy5pbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5
Lm1lc3NhZ2VzLmluCShyZXZpc2lvbiAxNjYwOTQpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluCSh3b3JraW5nIGNvcHkpCkBAIC0xNjIsNiArMTYy
LDcgQEAgbWVzc2FnZXMgLT4gV2ViUGFnZVByb3h5IHsKICAgICBUb3VjaGVzQ2FsbGJhY2soV2Vi
Q29yZTo6SW50UG9pbnQgcG9pbnQsIHVpbnQzMl90IHRvdWNoZXMsIHVpbnQ2NF90IGNhbGxiYWNr
SUQpCiAgICAgQXV0b2NvcnJlY3Rpb25EYXRhQ2FsbGJhY2soVmVjdG9yPFdlYkNvcmU6OkZsb2F0
UmVjdD4gdGV4dFJlY3RzLCBTdHJpbmcgZm9udE5hbWUsIGRvdWJsZSBmb250U2l6ZSwgdWludDY0
X3QgdHJhaXRzLCB1aW50NjRfdCBjYWxsYmFja0lEKQogICAgIEF1dG9jb3JyZWN0aW9uQ29udGV4
dENhbGxiYWNrKFN0cmluZyBiZWZvcmVUZXh0LCBTdHJpbmcgbWFya2VkVGV4dCwgU3RyaW5nIHNl
bGVjdGVkVGV4dCwgU3RyaW5nIGFmdGVyVGV4dCwgdWludDY0X3QgbG9jYXRpb24sIHVpbnQ2NF90
IGxlbmd0aCwgdWludDY0X3QgY2FsbGJhY2tJRCkKKyAgICBEaWN0YXRpb25Db250ZXh0Q2FsbGJh
Y2soU3RyaW5nIHNlbGVjdGVkVGV4dCwgU3RyaW5nIGJlZm9yZVRleHQsIFN0cmluZyBhZnRlclRl
eHQsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgSW50ZXJwcmV0S2V5RXZlbnQoV2ViS2l0OjpF
ZGl0b3JTdGF0ZSBzdGF0ZSwgYm9vbCBpc0NoYXJFdmVudCkgLT4gKGJvb2wgaGFuZGxlZCkKICAg
ICBEaWRSZWNlaXZlUG9zaXRpb25JbmZvcm1hdGlvbihXZWJLaXQ6OkludGVyYWN0aW9uSW5mb3Jt
YXRpb25BdFBvc2l0aW9uIGluZm9ybWF0aW9uKQogICAgIFNhdmVJbWFnZVRvTGlicmFyeShXZWJL
aXQ6OlNoYXJlZE1lbW9yeTo6SGFuZGxlIGhhbmRsZSwgdWludDY0X3Qgc2l6ZSkKSW5kZXg6IFNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlld0ludGVyYWN0aW9uLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3SW50
ZXJhY3Rpb24uaAkocmV2aXNpb24gMTY2MDk0KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L2lvcy9XS0NvbnRlbnRWaWV3SW50ZXJhY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAtNjAsNiAr
NjAsNyBAQCBjbGFzcyBXZWJQYWdlUHJveHk7CiAKIHR5cGVkZWYgdm9pZCAoXlVJV0tBdXRvY29y
cmVjdGlvbkNvbXBsZXRpb25IYW5kbGVyKShVSVdLQXV0b2NvcnJlY3Rpb25SZWN0cyAqcmVjdHNG
b3JJbnB1dCk7CiB0eXBlZGVmIHZvaWQgKF5VSVdLQXV0b2NvcnJlY3Rpb25Db250ZXh0SGFuZGxl
cikoVUlXS0F1dG9jb3JyZWN0aW9uQ29udGV4dCAqYXV0b2NvcnJlY3Rpb25Db250ZXh0KTsKK3R5
cGVkZWYgdm9pZCAoXlVJV0tEaWN0YXRpb25Db250ZXh0SGFuZGxlcikoTlNTdHJpbmcgKnNlbGVj
dGVkVGV4dCwgTlNTdHJpbmcgKmJlZm9yZVRleHQsIE5TU3RyaW5nICphZnRlclRleHQpOwogCiBu
YW1lc3BhY2UgV2ViS2l0IHsKIHN0cnVjdCBXS0F1dG9Db3JyZWN0aW9uRGF0YSB7CkBAIC0xMDIs
NiArMTAzLDcgQEAgc3RydWN0IFdLQXV0b0NvcnJlY3Rpb25EYXRhIHsKICAgICB1aW50NjRfdCBf
bGF0ZXN0VGFwSGlnaGxpZ2h0SUQ7CiAKICAgICBXZWJLaXQ6OldLQXV0b0NvcnJlY3Rpb25EYXRh
IF9hdXRvY29ycmVjdGlvbkRhdGE7CisgICAgVUlXS0RpY3RhdGlvbkNvbnRleHRIYW5kbGVyIF9k
aWN0YXRpb25IYW5kbGVyOwogICAgIFdlYktpdDo6SW50ZXJhY3Rpb25JbmZvcm1hdGlvbkF0UG9z
aXRpb24gX3Bvc2l0aW9uSW5mb3JtYXRpb247CiAgICAgV2ViS2l0OjpBc3Npc3RlZE5vZGVJbmZv
cm1hdGlvbiBfYXNzaXN0ZWROb2RlSW5mb3JtYXRpb247CiAgICAgUmV0YWluUHRyPE5TT2JqZWN0
PFdLRm9ybVBlcmlwaGVyYWw+PiBfaW5wdXRQZXJpcGhlcmFsOwpJbmRleDogU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3SW50ZXJhY3Rpb24ubW0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3SW50ZXJhY3Rpb24u
bW0JKHJldmlzaW9uIDE2NjA5NCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvV0tD
b250ZW50Vmlld0ludGVyYWN0aW9uLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xMjYyLDYgKzEyNjIs
MjEgQEAgLSAoQ0dSZWN0KXRleHRMYXN0UmVjdAogICAgIHJldHVybiAoX3BhZ2UtPmVkaXRvclN0
YXRlKCkuaGFzQ29tcG9zaXRpb24pID8gX3BhZ2UtPmVkaXRvclN0YXRlKCkubGFzdE1hcmtlZFJl
Y3QgOiBfYXV0b2NvcnJlY3Rpb25EYXRhLnRleHRMYXN0UmVjdDsKIH0KIAorLSAodm9pZClyZXBs
YWNlRGljdGF0ZWRUZXh0OihOU1N0cmluZyopb2xkVGV4dCB3aXRoVGV4dDooTlNTdHJpbmcgKilu
ZXdUZXh0Cit7CisgICAgX3BhZ2UtPnJlcGxhY2VEaWN0YXRlZFRleHQob2xkVGV4dCwgbmV3VGV4
dCk7Cit9CisKKy0gKHZvaWQpcmVxdWVzdERpY3RhdGlvbkNvbnRleHQ6KHZvaWQgKF4pKE5TU3Ry
aW5nICpzZWxlY3RlZCwgTlNTdHJpbmcgKnByZWZpeCwgTlNTdHJpbmcgKnBvc3RmaXgpKWNvbXBs
ZXRpb25IYW5kbGVyCit7CisgICAgX2RpY3RhdGlvbkhhbmRsZXIgPSBbY29tcGxldGlvbkhhbmRs
ZXIgY29weV07CisgICAgX3BhZ2UtPnJlcXVlc3REaWN0YXRpb25Db250ZXh0KERpY3RhdGlvbkNv
bnRleHRDYWxsYmFjazo6Y3JlYXRlKFtzZWxmXShib29sIC8qZXJyb3IqLywgY29uc3QgU3RyaW5n
JiBzZWxlY3RlZFRleHQsIGNvbnN0IFN0cmluZyYgYmVmb3JlVGV4dCwgY29uc3QgU3RyaW5nJiBh
ZnRlclRleHQpIHsKKyAgICAgICAgX2RpY3RhdGlvbkhhbmRsZXIoc2VsZWN0ZWRUZXh0LCBiZWZv
cmVUZXh0LCBhZnRlclRleHQpOworICAgICAgICBbX2RpY3RhdGlvbkhhbmRsZXIgcmVsZWFzZV07
CisgICAgICAgIF9kaWN0YXRpb25IYW5kbGVyID0gbmlsOworICAgIH0pKTsKK30KKwogLy8gVGhl
IGNvbXBsZXRpb24gaGFuZGxlciBzaG91bGQgcGFzcyB0aGUgcmVjdCBvZiB0aGUgY29ycmVjdGlv
biB0ZXh0IGFmdGVyIHJlcGxhY2luZyB0aGUgaW5wdXQgdGV4dCwgb3IgbmlsIGlmIHRoZSByZXBs
YWNlbWVudCBjb3VsZCBub3QgYmUgcGVyZm9ybWVkLgogLSAodm9pZClhcHBseUF1dG9jb3JyZWN0
aW9uOihOU1N0cmluZyAqKWNvcnJlY3Rpb24gdG9TdHJpbmc6KE5TU3RyaW5nICopaW5wdXQgd2l0
aENvbXBsZXRpb25IYW5kbGVyOih2b2lkICheKShVSVdLQXV0b2NvcnJlY3Rpb25SZWN0cyAqcmVj
dHNGb3JDb3JyZWN0aW9uKSljb21wbGV0aW9uSGFuZGxlcgogewpJbmRleDogU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL2lvcy9XZWJQYWdlUHJveHlJT1MubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL2lvcy9XZWJQYWdlUHJveHlJT1MubW0JKHJldmlzaW9uIDE2NjA5
NCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvV2ViUGFnZVByb3h5SU9TLm1tCSh3
b3JraW5nIGNvcHkpCkBAIC0xNjAsNiArMTYwLDE3IEBAIHZvaWQgV2ViUGFnZVByb3h5OjphdXRv
Y29ycmVjdGlvbkRhdGFDYWwKICAgICBjYWxsYmFjay0+cGVyZm9ybUNhbGxiYWNrV2l0aFJldHVy
blZhbHVlKHJlY3RzLCBmb250TmFtZSwgZm9udFNpemUsIGZvbnRUcmFpdHMpOwogfQogCit2b2lk
IFdlYlBhZ2VQcm94eTo6ZGljdGF0aW9uQ29udGV4dENhbGxiYWNrKGNvbnN0IFN0cmluZyYgc2Vs
ZWN0ZWRUZXh0LCBjb25zdCBTdHJpbmcmIGJlZm9yZVRleHQsIGNvbnN0IFN0cmluZyYgYWZ0ZXJU
ZXh0LCB1aW50NjRfdCBjYWxsYmFja0lEKQoreworICAgIFJlZlB0cjxEaWN0YXRpb25Db250ZXh0
Q2FsbGJhY2s+IGNhbGxiYWNrID0gbV9kaWN0YXRpb25Db250ZXh0Q2FsbGJhY2tzLnRha2UoY2Fs
bGJhY2tJRCk7CisgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhbGxiYWNrLT5wZXJmb3JtQ2Fs
bGJhY2tXaXRoUmV0dXJuVmFsdWUoc2VsZWN0ZWRUZXh0LCBiZWZvcmVUZXh0LCBhZnRlclRleHQp
OworfQorCiB2b2lkIFdlYlBhZ2VQcm94eTo6YXV0b2NvcnJlY3Rpb25Db250ZXh0Q2FsbGJhY2so
Y29uc3QgU3RyaW5nJiBiZWZvcmVUZXh0LCBjb25zdCBTdHJpbmcmIG1hcmtlZFRleHQsIGNvbnN0
IFN0cmluZyYgc2VsZWN0ZWRUZXh0LCBjb25zdCBTdHJpbmcmIGFmdGVyVGV4dCwgdWludDY0X3Qg
bG9jYXRpb24sIHVpbnQ2NF90IGxlbmd0aCwgdWludDY0X3QgY2FsbGJhY2tJRCkKIHsKICAgICBS
ZWZQdHI8QXV0b2NvcnJlY3Rpb25Db250ZXh0Q2FsbGJhY2s+IGNhbGxiYWNrID0gbV9hdXRvY29y
cmVjdGlvbkNvbnRleHRDYWxsYmFja3MudGFrZShjYWxsYmFja0lEKTsKQEAgLTIxNiw3ICsyMjcs
MTIgQEAgdm9pZCBXZWJQYWdlUHJveHk6OnVwZGF0ZVNlbGVjdGlvbldpdGhUbwogICAgIG1fdG91
Y2hlc0NhbGxiYWNrcy5zZXQoY2FsbGJhY2tJRCwgY2FsbGJhY2spOwogICAgIG1fcHJvY2Vzcy0+
c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6VXBkYXRlU2VsZWN0aW9uV2l0aFRvdWNoZXMocG9pbnQs
IHRvdWNoZXMsIGJhc2VJc1N0YXJ0LCBjYWxsYmFja0lEKSwgbV9wYWdlSUQpOwogfQotCisgICAg
Cit2b2lkIFdlYlBhZ2VQcm94eTo6cmVwbGFjZURpY3RhdGVkVGV4dChjb25zdCBTdHJpbmcmIG9s
ZFRleHQsIGNvbnN0IFN0cmluZyYgbmV3VGV4dCkKK3sKKyAgICBtX3Byb2Nlc3MtPnNlbmQoTWVz
c2FnZXM6OldlYlBhZ2U6OlJlcGxhY2VEaWN0YXRlZFRleHQob2xkVGV4dCwgbmV3VGV4dCksIG1f
cGFnZUlEKTsKK30KKyAgICAKIHZvaWQgV2ViUGFnZVByb3h5OjpyZXF1ZXN0QXV0b2NvcnJlY3Rp
b25EYXRhKGNvbnN0IFN0cmluZyYgdGV4dEZvckF1dG9jb3JyZWN0aW9uLCBQYXNzUmVmUHRyPEF1
dG9jb3JyZWN0aW9uRGF0YUNhbGxiYWNrPiBjYWxsYmFjaykKIHsKICAgICBpZiAoIWlzVmFsaWQo
KSkgewpAQCAtMjQ4LDYgKzI2NCwxOCBAQCBib29sIFdlYlBhZ2VQcm94eTo6YXBwbHlBdXRvY29y
cmVjdGlvbihjCiAgICAgcmV0dXJuIGF1dG9jb3JyZWN0aW9uQXBwbGllZDsKIH0KIAordm9pZCBX
ZWJQYWdlUHJveHk6OnJlcXVlc3REaWN0YXRpb25Db250ZXh0KFBhc3NSZWZQdHI8RGljdGF0aW9u
Q29udGV4dENhbGxiYWNrPiBjYWxsYmFjaykKK3sKKyAgICBpZiAoIWlzVmFsaWQoKSkgeworICAg
ICAgICBjYWxsYmFjay0+aW52YWxpZGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgdWludDY0X3QgY2FsbGJhY2tJRCA9IGNhbGxiYWNrLT5jYWxsYmFja0lEKCk7CisgICAgbV9k
aWN0YXRpb25Db250ZXh0Q2FsbGJhY2tzLnNldChjYWxsYmFja0lELCBjYWxsYmFjayk7CisgICAg
bV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpSZXF1ZXN0RGljdGF0aW9uQ29udGV4
dChjYWxsYmFja0lEKSwgbV9wYWdlSUQpOworfQorCiB2b2lkIFdlYlBhZ2VQcm94eTo6cmVxdWVz
dEF1dG9jb3JyZWN0aW9uQ29udGV4dChQYXNzUmVmUHRyPEF1dG9jb3JyZWN0aW9uQ29udGV4dENh
bGxiYWNrPiBjYWxsYmFjaykKIHsKICAgICBpZiAoIWlzVmFsaWQoKSkgewpJbmRleDogU291cmNl
L1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oCShyZXZpc2lvbiAxNjYwOTQp
CisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oCSh3b3JraW5n
IGNvcHkpCkBAIC00NTIsNiArNDUyLDggQEAgcHVibGljOgogICAgIHZvaWQgZXh0ZW5kU2VsZWN0
aW9uKHVpbnQzMl90IGdyYW51bGFyaXR5KTsKICAgICB2b2lkIGVsZW1lbnREaWRGb2N1cyhXZWJD
b3JlOjpOb2RlKik7CiAgICAgdm9pZCBlbGVtZW50RGlkQmx1cihXZWJDb3JlOjpOb2RlKik7Cisg
ICAgdm9pZCByZXF1ZXN0RGljdGF0aW9uQ29udGV4dCh1aW50NjRfdCBjYWxsYmFja0lEKTsKKyAg
ICB2b2lkIHJlcGxhY2VEaWN0YXRlZFRleHQoY29uc3QgU3RyaW5nJiBvbGRUZXh0LCBjb25zdCBT
dHJpbmcmIG5ld1RleHQpOwogICAgIHZvaWQgcmVxdWVzdEF1dG9jb3JyZWN0aW9uRGF0YShjb25z
dCBTdHJpbmcmIHRleHRGb3JBdXRvY29ycmVjdGlvbiwgdWludDY0X3QgY2FsbGJhY2tJRCk7CiAg
ICAgdm9pZCBhcHBseUF1dG9jb3JyZWN0aW9uKGNvbnN0IFN0cmluZyYgY29ycmVjdGlvbiwgY29u
c3QgU3RyaW5nJiBvcmlnaW5hbFRleHQsIHVpbnQ2NF90IGNhbGxiYWNrSUQpOwogICAgIHZvaWQg
c3luY0FwcGx5QXV0b2NvcnJlY3Rpb24oY29uc3QgU3RyaW5nJiBjb3JyZWN0aW9uLCBjb25zdCBT
dHJpbmcmIG9yaWdpbmFsVGV4dCwgYm9vbCYgY29ycmVjdGlvbkFwcGxpZWQpOwpJbmRleDogU291
cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2Fn
ZXMuaW4JKHJldmlzaW9uIDE2NjA5NCkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2Vi
UGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluCSh3b3JraW5nIGNvcHkpCkBAIC01Myw2ICs1Myw4IEBA
IG1lc3NhZ2VzIC0+IFdlYlBhZ2UgTGVnYWN5UmVjZWl2ZXIgewogICAgIFVwZGF0ZUJsb2NrU2Vs
ZWN0aW9uV2l0aFRvdWNoKFdlYkNvcmU6OkludFBvaW50IHBvaW50LCB1aW50MzJfdCB0b3VjaCwg
dWludDMyX3QgaGFuZGxlUG9zaXRpb24pCiAgICAgU2VsZWN0V2l0aFR3b1RvdWNoZXMoV2ViQ29y
ZTo6SW50UG9pbnQgZnJvbSwgV2ViQ29yZTo6SW50UG9pbnQgdG8sIHVpbnQzMl90IGdlc3R1cmVU
eXBlLCB1aW50MzJfdCBnZXN0dXJlU3RhdGUsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgRXh0
ZW5kU2VsZWN0aW9uKHVpbnQzMl90IGdyYW51bGFyaXR5KQorICAgIFJlcXVlc3REaWN0YXRpb25D
b250ZXh0KHVpbnQ2NF90IGNhbGxiYWNrSUQpCisgICAgUmVwbGFjZURpY3RhdGVkVGV4dChTdHJp
bmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQpCiAgICAgUmVxdWVzdEF1dG9jb3JyZWN0aW9uRGF0
YShTdHJpbmcgdGV4dEZvckF1dG9jb3JyZWN0aW9uLCB1aW50NjRfdCBjYWxsYmFja0lEKQogICAg
IEFwcGx5QXV0b2NvcnJlY3Rpb24oU3RyaW5nIGNvcnJlY3Rpb24sIFN0cmluZyBvcmlnaW5hbFRl
eHQsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgU3luY0FwcGx5QXV0b2NvcnJlY3Rpb24oU3Ry
aW5nIGNvcnJlY3Rpb24sIFN0cmluZyBvcmlnaW5hbFRleHQpIC0+IChib29sIGF1dG9jb3JyZWN0
aW9uQXBwbGllZCkKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9pb3Mv
V2ViUGFnZUlPUy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dl
YlBhZ2UvaW9zL1dlYlBhZ2VJT1MubW0JKHJldmlzaW9uIDE2NjA5NCkKKysrIFNvdXJjZS9XZWJL
aXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFnZUlPUy5tbQkod29ya2luZyBjb3B5KQpA
QCAtMTE4OSw2ICsxMTg5LDcwIEBAIHZvaWQgV2ViUGFnZTo6Y29udmVydFNlbGVjdGlvblJlY3Rz
VG9Sb28KICAgICB9CiB9CiAKK3ZvaWQgV2ViUGFnZTo6cmVxdWVzdERpY3RhdGlvbkNvbnRleHQo
dWludDY0X3QgY2FsbGJhY2tJRCkKK3sKKyAgICBGcmFtZSYgZnJhbWUgPSBtX3BhZ2UtPmZvY3Vz
Q29udHJvbGxlcigpLmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIFZpc2libGVQb3NpdGlvbiBz
dGFydFBvc2l0aW9uID0gZnJhbWUuc2VsZWN0aW9uKCkuc2VsZWN0aW9uKCkuc3RhcnQoKTsKKyAg
ICBWaXNpYmxlUG9zaXRpb24gZW5kUG9zaXRpb24gPSBmcmFtZS5zZWxlY3Rpb24oKS5zZWxlY3Rp
b24oKS5lbmQoKTsKKyAgICBjb25zdCB1bnNpZ25lZCBkaWN0YXRpb25Db250ZXh0V29yZENvdW50
ID0gNTsKKworICAgIFN0cmluZyBzZWxlY3RlZFRleHQ7CisgICAgaWYgKGZyYW1lLnNlbGVjdGlv
bigpLmlzUmFuZ2UoKSkKKyAgICAgICAgc2VsZWN0ZWRUZXh0ID0gcGxhaW5UZXh0KGZyYW1lLnNl
bGVjdGlvbigpLnNlbGVjdGlvbigpLnRvTm9ybWFsaXplZFJhbmdlKCkuZ2V0KCkpOworCisgICAg
U3RyaW5nIGNvbnRleHRCZWZvcmU7CisgICAgaWYgKHN0YXJ0UG9zaXRpb24gIT0gc3RhcnRPZkVk
aXRhYmxlQ29udGVudChzdGFydFBvc2l0aW9uKSkgeworICAgICAgICBWaXNpYmxlUG9zaXRpb24g
Y3VycmVudFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbjsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9u
IGxhc3RQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBkaWN0YXRpb25Db250ZXh0V29yZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGN1
cnJlbnRQb3NpdGlvbiA9IHN0YXJ0T2ZXb3JkKHBvc2l0aW9uT2ZOZXh0Qm91bmRhcnlPZkdyYW51
bGFyaXR5KGxhc3RQb3NpdGlvbiwgV29yZEdyYW51bGFyaXR5LCBEaXJlY3Rpb25CYWNrd2FyZCkp
OworICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbi5pc051bGwoKSkKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGxhc3RQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjsK
KyAgICAgICAgfQorICAgICAgICBpZiAobGFzdFBvc2l0aW9uLmlzTm90TnVsbCgpICYmIGxhc3RQ
b3NpdGlvbiAhPSBzdGFydFBvc2l0aW9uKQorICAgICAgICAgICAgY29udGV4dEJlZm9yZSA9IHBs
YWluVGV4dChSYW5nZTo6Y3JlYXRlKCpmcmFtZS5kb2N1bWVudCgpLCBsYXN0UG9zaXRpb24sIHN0
YXJ0UG9zaXRpb24pLmdldCgpKTsKKyAgICB9CisKKyAgICBTdHJpbmcgY29udGV4dEFmdGVyOwor
ICAgIGlmIChlbmRQb3NpdGlvbiAhPSBlbmRPZkVkaXRhYmxlQ29udGVudChlbmRQb3NpdGlvbikp
IHsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGN1cnJlbnRQb3NpdGlvbiA9IGVuZFBvc2l0aW9u
OworICAgICAgICBWaXNpYmxlUG9zaXRpb24gbGFzdFBvc2l0aW9uID0gZW5kUG9zaXRpb247Cisg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkaWN0YXRpb25Db250ZXh0V29yZENvdW50
OyArK2kpIHsKKyAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGVuZE9mV29yZChwb3NpdGlv
bk9mTmV4dEJvdW5kYXJ5T2ZHcmFudWxhcml0eShsYXN0UG9zaXRpb24sIFdvcmRHcmFudWxhcml0
eSwgRGlyZWN0aW9uRm9yd2FyZCkpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbi5p
c051bGwoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGxhc3RQb3NpdGlv
biA9IGN1cnJlbnRQb3NpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdFBvc2l0aW9u
LmlzTm90TnVsbCgpICYmIGxhc3RQb3NpdGlvbiAhPSBzdGFydFBvc2l0aW9uKQorICAgICAgICAg
ICAgY29udGV4dEFmdGVyID0gcGxhaW5UZXh0KFJhbmdlOjpjcmVhdGUoKmZyYW1lLmRvY3VtZW50
KCksIGVuZFBvc2l0aW9uLCBsYXN0UG9zaXRpb24pLmdldCgpKTsKKyAgICB9CisKKyAgICBzZW5k
KE1lc3NhZ2VzOjpXZWJQYWdlUHJveHk6OkRpY3RhdGlvbkNvbnRleHRDYWxsYmFjayhzZWxlY3Rl
ZFRleHQsIGNvbnRleHRCZWZvcmUsIGNvbnRleHRBZnRlciwgY2FsbGJhY2tJRCkpOworfQorCit2
b2lkIFdlYlBhZ2U6OnJlcGxhY2VEaWN0YXRlZFRleHQoY29uc3QgU3RyaW5nJiBvbGRUZXh0LCBj
b25zdCBTdHJpbmcmIG5ld1RleHQpCit7CisgICAgUmVmUHRyPFJhbmdlPiByYW5nZTsKKyAgICBG
cmFtZSYgZnJhbWUgPSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLmZvY3VzZWRPck1haW5GcmFt
ZSgpOworICAgIGlmIChmcmFtZS5zZWxlY3Rpb24oKS5pc05vbmUoKSkKKyAgICAgICAgcmV0dXJu
OworICAgIAorICAgIGlmIChmcmFtZS5zZWxlY3Rpb24oKS5pc1JhbmdlKCkpIHsKKyAgICAgICAg
ZnJhbWUuZWRpdG9yKCkuZGVsZXRlU2VsZWN0aW9uV2l0aFNtYXJ0RGVsZXRlKGZhbHNlKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb24gPSBmcmFt
ZS5zZWxlY3Rpb24oKS5zZWxlY3Rpb24oKS5zdGFydCgpOworICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgb2xkVGV4dC5sZW5ndGgoKTsgKytpKQorICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9u
LnByZXZpb3VzKCk7CisgICAgaWYgKHBvc2l0aW9uLmlzTnVsbCgpKQorICAgICAgICBwb3NpdGlv
biA9IHN0YXJ0T2ZEb2N1bWVudChzdGF0aWNfY2FzdDxOb2RlKj4oZnJhbWUuZG9jdW1lbnQoKS0+
ZG9jdW1lbnRFbGVtZW50KCkpKTsKKyAgICByYW5nZSA9IFJhbmdlOjpjcmVhdGUoKmZyYW1lLmRv
Y3VtZW50KCksIHBvc2l0aW9uLCBmcmFtZS5zZWxlY3Rpb24oKS5zZWxlY3Rpb24oKS5zdGFydCgp
KTsKKworICAgIGZyYW1lLnNlbGVjdGlvbigpLnNldFNlbGVjdGVkUmFuZ2UocmFuZ2UuZ2V0KCks
IFVQU1RSRUFNLCB0cnVlKTsKKyAgICBmcmFtZS5lZGl0b3IoKS5pbnNlcnRUZXh0KG5ld1RleHQs
IDApOworfQorCiB2b2lkIFdlYlBhZ2U6OnJlcXVlc3RBdXRvY29ycmVjdGlvbkRhdGEoY29uc3Qg
U3RyaW5nJiB0ZXh0Rm9yQXV0b2NvcnJlY3Rpb24sIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiB7CiAg
ICAgUmVmUHRyPFJhbmdlPiByYW5nZTsK
</data>
<flag name="review"
          id="251754"
          type_id="1"
          status="-"
          setter="benjamin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>227690</attachid>
            <date>2014-03-24 13:52:02 -0700</date>
            <delta_ts>2014-03-24 15:28:13 -0700</delta_ts>
            <desc>Patch2</desc>
            <filename>dictation-webkit.txt</filename>
            <type>text/plain</type>
            <size>16302</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NjE4NykKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQwIEBACisyMDE0LTAzLTI0ICBFbnJpY2Eg
Q2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgW2lPUyBXZWJLaXQyXSBEaWN0
YXRpb24gc3VwcG9ydC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTEzMDYyMgorICAgICAgICA8cmRhcjovL3Byb2JsZW0vMTUzMzczMTY+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkaW5nIHN1cHBvcnQg
Zm9yIGRpY3RhdGlvbiBvbiBpT1MuIFRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiBpbnRlcmFj
dGlvbnMKKyAgICAgICAgd2l0aCB0aGUgZGljdGF0aW9uIHN5c3RlbToKKyAgICAgICAgLSBpbml0
aWFsIHJlcXVlc3QgZm9yIGNvbnRleHQsIHdoaWNoIGNvbnNpc3RzIGluIHJldHJpZXZpbmcgdGhl
IHNlbGVjdGVkIHRleHQKKyAgICAgICAgYW5kIDUgd29yZHMgYmVmb3JlIHRoZSBzZWxlY3Rpb24g
YW5kIDUgd29yZHMgYWZ0ZXIsIGlmIGF2YWlsYWJsZS4KKyAgICAgICAgLSBpbnNlcnRpb24gb2Yg
cmVjb2duaXplZCBjaHVua3Mgb2YgdGV4dCwgcHJvdmlkaW5nIHRoZSB0ZXh0CisgICAgICAgIHRv
IHJlcGxhY2UuCisgICAgCisgICAgICAgICogVUlQcm9jZXNzL0F1dG9Db3JyZWN0aW9uQ2FsbGJh
Y2suaDoKKyAgICAgICAgKFdlYktpdDo6RGljdGF0aW9uQ29udGV4dENhbGxiYWNrOjpjcmVhdGUp
OgorICAgICAgICAoV2ViS2l0OjpEaWN0YXRpb25Db250ZXh0Q2FsbGJhY2s6On5EaWN0YXRpb25D
b250ZXh0Q2FsbGJhY2spOgorICAgICAgICAoV2ViS2l0OjpEaWN0YXRpb25Db250ZXh0Q2FsbGJh
Y2s6OnBlcmZvcm1DYWxsYmFja1dpdGhSZXR1cm5WYWx1ZSk6CisgICAgICAgIChXZWJLaXQ6OkRp
Y3RhdGlvbkNvbnRleHRDYWxsYmFjazo6aW52YWxpZGF0ZSk6CisgICAgICAgIChXZWJLaXQ6OkRp
Y3RhdGlvbkNvbnRleHRDYWxsYmFjazo6RGljdGF0aW9uQ29udGV4dENhbGxiYWNrKToKKyAgICAg
ICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5Lmg6CisgICAgICAgICogVUlQcm9jZXNzL1dlYlBh
Z2VQcm94eS5tZXNzYWdlcy5pbjoKKyAgICAgICAgKiBVSVByb2Nlc3MvaW9zL1dLQ29udGVudFZp
ZXdJbnRlcmFjdGlvbi5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlld0lu
dGVyYWN0aW9uLm1tOgorICAgICAgICAoLVtXS0NvbnRlbnRWaWV3IHJlcGxhY2VEaWN0YXRlZFRl
eHQ6d2l0aFRleHQ6XSk6CisgICAgICAgICgtW1dLQ29udGVudFZpZXcgcmVxdWVzdERpY3RhdGlv
bkNvbnRleHQ6XSk6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9XZWJQYWdlUHJveHlJT1MubW06
CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6ZGljdGF0aW9uQ29udGV4dENhbGxiYWNr
KToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpyZXBsYWNlRGljdGF0ZWRUZXh0KToK
KyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpyZXF1ZXN0RGljdGF0aW9uQ29udGV4dCk6
CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuaDoKKyAgICAgICAgKiBXZWJQ
cm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbjoKKyAgICAgICAgKiBXZWJQcm9jZXNz
L1dlYlBhZ2UvaW9zL1dlYlBhZ2VJT1MubW06CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2U6OnJl
cXVlc3REaWN0YXRpb25Db250ZXh0KToKKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZTo6cmVwbGFj
ZURpY3RhdGVkVGV4dCk6CisKIDIwMTQtMDMtMjQgIERlYW4gSmFja3NvbiAgPGRpbm9AYXBwbGUu
Y29tPgogCiAgICAgICAgIFJlbW92ZSBXZWJHTCBhc3NldCBlbnRpdGxlbWVudApJbmRleDogU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0F1dG9Db3JyZWN0aW9uQ2FsbGJhY2suaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQXV0b0NvcnJlY3Rpb25DYWxsYmFjay5oCShy
ZXZpc2lvbiAxNjYxODcpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQXV0b0NvcnJlY3Rp
b25DYWxsYmFjay5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTksNiArMTE5LDQ2IEBAIHByaXZhdGU6
CiAgICAgQ2FsbGJhY2tGdW5jdGlvbiBtX2NhbGxiYWNrOwogfTsKIAorY2xhc3MgRGljdGF0aW9u
Q29udGV4dENhbGxiYWNrIDogcHVibGljIENhbGxiYWNrQmFzZSB7CitwdWJsaWM6CisgICAgdHlw
ZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGJvb2wsIGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmlu
ZyYsIGNvbnN0IFN0cmluZyYpPiBDYWxsYmFja0Z1bmN0aW9uOworCisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8RGljdGF0aW9uQ29udGV4dENhbGxiYWNrPiBjcmVhdGUoQ2FsbGJhY2tGdW5jdGlvbiBj
YWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgRGljdGF0aW9uQ29u
dGV4dENhbGxiYWNrKGNhbGxiYWNrKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+RGljdGF0aW9u
Q29udGV4dENhbGxiYWNrKCkKKyAgICB7CisgICAgICAgIEFTU0VSVCghbV9jYWxsYmFjayk7Cisg
ICAgfQorCisgICAgdm9pZCBwZXJmb3JtQ2FsbGJhY2tXaXRoUmV0dXJuVmFsdWUoY29uc3QgU3Ry
aW5nJiByZXR1cm5WYWx1ZTEsIGNvbnN0IFN0cmluZyYgcmV0dXJuVmFsdWUyLCBjb25zdCBTdHJp
bmcmIHJldHVyblZhbHVlMykKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxiYWNrKTsKKwor
ICAgICAgICBtX2NhbGxiYWNrKGZhbHNlLCByZXR1cm5WYWx1ZTEsIHJldHVyblZhbHVlMiwgcmV0
dXJuVmFsdWUzKTsKKyAgICAgICAgbV9jYWxsYmFjayA9IG51bGxwdHI7CisgICAgfQorCisgICAg
dm9pZCBpbnZhbGlkYXRlKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxiYWNrKTsKKwor
ICAgICAgICBtX2NhbGxiYWNrKHRydWUsIFN0cmluZygpLCBTdHJpbmcoKSwgU3RyaW5nKCkpOwor
ICAgICAgICBtX2NhbGxiYWNrID0gbnVsbHB0cjsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAg
IERpY3RhdGlvbkNvbnRleHRDYWxsYmFjayhDYWxsYmFja0Z1bmN0aW9uIGNhbGxiYWNrKQorICAg
ICAgICA6IG1fY2FsbGJhY2soY2FsbGJhY2spCisgICAgeworICAgICAgICBBU1NFUlQobV9jYWxs
YmFjayk7CisgICAgfQorICAgIAorICAgIENhbGxiYWNrRnVuY3Rpb24gbV9jYWxsYmFjazsKK307
CisKIH0gLy8gbmFtZXNwYWNlIFdlYktpdAogCiAjZW5kaWYgLy8gQXV0b0NvcnJlY3Rpb25DYWxs
YmFja19oCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oCShyZXZp
c2lvbiAxNjYxODcpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTU4Niw2ICs1ODYsOCBAQCBwdWJsaWM6CiAgICAgYm9vbCBhcHBs
eUF1dG9jb3JyZWN0aW9uKGNvbnN0IFN0cmluZyYgY29ycmVjdGlvbiwgY29uc3QgU3RyaW5nJiBv
cmlnaW5hbFRleHQpOwogICAgIHZvaWQgcmVxdWVzdEF1dG9jb3JyZWN0aW9uQ29udGV4dChQYXNz
UmVmUHRyPEF1dG9jb3JyZWN0aW9uQ29udGV4dENhbGxiYWNrPik7CiAgICAgdm9pZCBnZXRBdXRv
Y29ycmVjdGlvbkNvbnRleHQoU3RyaW5nJiBjb250ZXh0QmVmb3JlLCBTdHJpbmcmIG1hcmtlZFRl
eHQsIFN0cmluZyYgc2VsZWN0ZWRUZXh0LCBTdHJpbmcmIGNvbnRleHRBZnRlciwgdWludDY0X3Qm
IGxvY2F0aW9uLCB1aW50NjRfdCYgbGVuZ3RoKTsKKyAgICB2b2lkIHJlcXVlc3REaWN0YXRpb25D
b250ZXh0KFBhc3NSZWZQdHI8RGljdGF0aW9uQ29udGV4dENhbGxiYWNrPik7CisgICAgdm9pZCBy
ZXBsYWNlRGljdGF0ZWRUZXh0KGNvbnN0IFN0cmluZyYgb2xkVGV4dCwgY29uc3QgU3RyaW5nJiBu
ZXdUZXh0KTsKICAgICB2b2lkIGRpZFJlY2VpdmVQb3NpdGlvbkluZm9ybWF0aW9uKGNvbnN0IElu
dGVyYWN0aW9uSW5mb3JtYXRpb25BdFBvc2l0aW9uJik7CiAgICAgdm9pZCBnZXRQb3NpdGlvbklu
Zm9ybWF0aW9uKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgSW50ZXJhY3Rpb25JbmZvcm1hdGlv
bkF0UG9zaXRpb24mKTsKICAgICB2b2lkIHJlcXVlc3RQb3NpdGlvbkluZm9ybWF0aW9uKGNvbnN0
IFdlYkNvcmU6OkludFBvaW50Jik7CkBAIC0xMjgwLDYgKzEyODIsNyBAQCBwcml2YXRlOgogICAg
IHZvaWQgdG91Y2hlc0NhbGxiYWNrKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgdWludDMyX3Qs
IHVpbnQ2NF90KTsKICAgICB2b2lkIGF1dG9jb3JyZWN0aW9uRGF0YUNhbGxiYWNrKGNvbnN0IFZl
Y3RvcjxXZWJDb3JlOjpGbG9hdFJlY3Q+JiwgY29uc3QgU3RyaW5nJiwgZmxvYXQsIHVpbnQ2NF90
LCB1aW50NjRfdCk7CiAgICAgdm9pZCBhdXRvY29ycmVjdGlvbkNvbnRleHRDYWxsYmFjayhjb25z
dCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1
aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90KTsKKyAgICB2b2lkIGRpY3RhdGlvbkNvbnRleHRD
YWxsYmFjayhjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmLCB1aW50
NjRfdCk7CiAgICAgdm9pZCBpbnRlcnByZXRLZXlFdmVudChjb25zdCBFZGl0b3JTdGF0ZSYsIGJv
b2wgaXNDaGFyRXZlbnQsIGJvb2wmIGhhbmRsZWQpOwogI2VuZGlmCiAjaWYgUExBVEZPUk0oR1RL
KQpAQCAtMTQyMyw2ICsxNDI2LDcgQEAgcHJpdmF0ZToKICAgICBIYXNoTWFwPHVpbnQ2NF90LCBS
ZWZQdHI8VG91Y2hlc0NhbGxiYWNrPj4gbV90b3VjaGVzQ2FsbGJhY2tzOwogICAgIEhhc2hNYXA8
dWludDY0X3QsIFJlZlB0cjxBdXRvY29ycmVjdGlvbkRhdGFDYWxsYmFjaz4+IG1fYXV0b2NvcnJl
Y3Rpb25DYWxsYmFja3M7CiAgICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPEF1dG9jb3JyZWN0
aW9uQ29udGV4dENhbGxiYWNrPj4gbV9hdXRvY29ycmVjdGlvbkNvbnRleHRDYWxsYmFja3M7Cisg
ICAgSGFzaE1hcDx1aW50NjRfdCwgUmVmUHRyPERpY3RhdGlvbkNvbnRleHRDYWxsYmFjaz4+IG1f
ZGljdGF0aW9uQ29udGV4dENhbGxiYWNrczsKICNlbmRpZgogI2lmIFBMQVRGT1JNKEdUSykKICAg
ICBIYXNoTWFwPHVpbnQ2NF90LCBSZWZQdHI8UHJpbnRGaW5pc2hlZENhbGxiYWNrPj4gbV9wcmlu
dEZpbmlzaGVkQ2FsbGJhY2tzOwpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBh
Z2VQcm94eS5tZXNzYWdlcy5pbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluCShyZXZpc2lvbiAxNjYxODcpCisrKyBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluCSh3b3JraW5nIGNvcHkp
CkBAIC0xNjIsNiArMTYyLDcgQEAgbWVzc2FnZXMgLT4gV2ViUGFnZVByb3h5IHsKICAgICBUb3Vj
aGVzQ2FsbGJhY2soV2ViQ29yZTo6SW50UG9pbnQgcG9pbnQsIHVpbnQzMl90IHRvdWNoZXMsIHVp
bnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgQXV0b2NvcnJlY3Rpb25EYXRhQ2FsbGJhY2soVmVjdG9y
PFdlYkNvcmU6OkZsb2F0UmVjdD4gdGV4dFJlY3RzLCBTdHJpbmcgZm9udE5hbWUsIGRvdWJsZSBm
b250U2l6ZSwgdWludDY0X3QgdHJhaXRzLCB1aW50NjRfdCBjYWxsYmFja0lEKQogICAgIEF1dG9j
b3JyZWN0aW9uQ29udGV4dENhbGxiYWNrKFN0cmluZyBiZWZvcmVUZXh0LCBTdHJpbmcgbWFya2Vk
VGV4dCwgU3RyaW5nIHNlbGVjdGVkVGV4dCwgU3RyaW5nIGFmdGVyVGV4dCwgdWludDY0X3QgbG9j
YXRpb24sIHVpbnQ2NF90IGxlbmd0aCwgdWludDY0X3QgY2FsbGJhY2tJRCkKKyAgICBEaWN0YXRp
b25Db250ZXh0Q2FsbGJhY2soU3RyaW5nIHNlbGVjdGVkVGV4dCwgU3RyaW5nIGJlZm9yZVRleHQs
IFN0cmluZyBhZnRlclRleHQsIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgSW50ZXJwcmV0S2V5
RXZlbnQoV2ViS2l0OjpFZGl0b3JTdGF0ZSBzdGF0ZSwgYm9vbCBpc0NoYXJFdmVudCkgLT4gKGJv
b2wgaGFuZGxlZCkKICAgICBEaWRSZWNlaXZlUG9zaXRpb25JbmZvcm1hdGlvbihXZWJLaXQ6Oklu
dGVyYWN0aW9uSW5mb3JtYXRpb25BdFBvc2l0aW9uIGluZm9ybWF0aW9uKQogICAgIFNhdmVJbWFn
ZVRvTGlicmFyeShXZWJLaXQ6OlNoYXJlZE1lbW9yeTo6SGFuZGxlIGhhbmRsZSwgdWludDY0X3Qg
c2l6ZSkKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvV0tDb250ZW50Vmlld0lu
dGVyYWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL2lvcy9X
S0NvbnRlbnRWaWV3SW50ZXJhY3Rpb24uaAkocmV2aXNpb24gMTY2MTg3KQorKysgU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3SW50ZXJhY3Rpb24uaAkod29ya2luZyBj
b3B5KQpAQCAtNjAsNiArNjAsNyBAQCBjbGFzcyBXZWJQYWdlUHJveHk7CiAKIHR5cGVkZWYgdm9p
ZCAoXlVJV0tBdXRvY29ycmVjdGlvbkNvbXBsZXRpb25IYW5kbGVyKShVSVdLQXV0b2NvcnJlY3Rp
b25SZWN0cyAqcmVjdHNGb3JJbnB1dCk7CiB0eXBlZGVmIHZvaWQgKF5VSVdLQXV0b2NvcnJlY3Rp
b25Db250ZXh0SGFuZGxlcikoVUlXS0F1dG9jb3JyZWN0aW9uQ29udGV4dCAqYXV0b2NvcnJlY3Rp
b25Db250ZXh0KTsKK3R5cGVkZWYgdm9pZCAoXlVJV0tEaWN0YXRpb25Db250ZXh0SGFuZGxlciko
TlNTdHJpbmcgKnNlbGVjdGVkVGV4dCwgTlNTdHJpbmcgKmJlZm9yZVRleHQsIE5TU3RyaW5nICph
ZnRlclRleHQpOwogCiBuYW1lc3BhY2UgV2ViS2l0IHsKIHN0cnVjdCBXS0F1dG9Db3JyZWN0aW9u
RGF0YSB7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL1dLQ29udGVudFZpZXdJ
bnRlcmFjdGlvbi5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9z
L1dLQ29udGVudFZpZXdJbnRlcmFjdGlvbi5tbQkocmV2aXNpb24gMTY2MTg3KQorKysgU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL2lvcy9XS0NvbnRlbnRWaWV3SW50ZXJhY3Rpb24ubW0JKHdvcmtp
bmcgY29weSkKQEAgLTEyNjIsNiArMTI2MiwyMSBAQCAtIChDR1JlY3QpdGV4dExhc3RSZWN0CiAg
ICAgcmV0dXJuIChfcGFnZS0+ZWRpdG9yU3RhdGUoKS5oYXNDb21wb3NpdGlvbikgPyBfcGFnZS0+
ZWRpdG9yU3RhdGUoKS5sYXN0TWFya2VkUmVjdCA6IF9hdXRvY29ycmVjdGlvbkRhdGEudGV4dExh
c3RSZWN0OwogfQogCistICh2b2lkKXJlcGxhY2VEaWN0YXRlZFRleHQ6KE5TU3RyaW5nKilvbGRU
ZXh0IHdpdGhUZXh0OihOU1N0cmluZyAqKW5ld1RleHQKK3sKKyAgICBfcGFnZS0+cmVwbGFjZURp
Y3RhdGVkVGV4dChvbGRUZXh0LCBuZXdUZXh0KTsKK30KKworLSAodm9pZClyZXF1ZXN0RGljdGF0
aW9uQ29udGV4dDoodm9pZCAoXikoTlNTdHJpbmcgKnNlbGVjdGVkVGV4dCwgTlNTdHJpbmcgKmJl
Zm9yZVRleHQsIE5TU3RyaW5nICphZnRlclRleHQpKWNvbXBsZXRpb25IYW5kbGVyCit7CisgICAg
VUlXS0RpY3RhdGlvbkNvbnRleHRIYW5kbGVyIGRpY3RhdGlvbkhhbmRsZXIgPSBbY29tcGxldGlv
bkhhbmRsZXIgY29weV07CisKKyAgICBfcGFnZS0+cmVxdWVzdERpY3RhdGlvbkNvbnRleHQoRGlj
dGF0aW9uQ29udGV4dENhbGxiYWNrOjpjcmVhdGUoW2RpY3RhdGlvbkhhbmRsZXJdKGJvb2wgLypl
cnJvciovLCBjb25zdCBTdHJpbmcmIHNlbGVjdGVkVGV4dCwgY29uc3QgU3RyaW5nJiBiZWZvcmVU
ZXh0LCBjb25zdCBTdHJpbmcmIGFmdGVyVGV4dCkgeworICAgICAgICBkaWN0YXRpb25IYW5kbGVy
KHNlbGVjdGVkVGV4dCwgYmVmb3JlVGV4dCwgYWZ0ZXJUZXh0KTsKKyAgICAgICAgW2RpY3RhdGlv
bkhhbmRsZXIgcmVsZWFzZV07CisgICAgfSkpOworfQorCiAvLyBUaGUgY29tcGxldGlvbiBoYW5k
bGVyIHNob3VsZCBwYXNzIHRoZSByZWN0IG9mIHRoZSBjb3JyZWN0aW9uIHRleHQgYWZ0ZXIgcmVw
bGFjaW5nIHRoZSBpbnB1dCB0ZXh0LCBvciBuaWwgaWYgdGhlIHJlcGxhY2VtZW50IGNvdWxkIG5v
dCBiZSBwZXJmb3JtZWQuCiAtICh2b2lkKWFwcGx5QXV0b2NvcnJlY3Rpb246KE5TU3RyaW5nICop
Y29ycmVjdGlvbiB0b1N0cmluZzooTlNTdHJpbmcgKilpbnB1dCB3aXRoQ29tcGxldGlvbkhhbmRs
ZXI6KHZvaWQgKF4pKFVJV0tBdXRvY29ycmVjdGlvblJlY3RzICpyZWN0c0ZvckNvcnJlY3Rpb24p
KWNvbXBsZXRpb25IYW5kbGVyCiB7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9z
L1dlYlBhZ2VQcm94eUlPUy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvaW9zL1dlYlBhZ2VQcm94eUlPUy5tbQkocmV2aXNpb24gMTY2MTg3KQorKysgU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL2lvcy9XZWJQYWdlUHJveHlJT1MubW0JKHdvcmtpbmcgY29weSkKQEAg
LTE2MCw2ICsxNjAsMTcgQEAgdm9pZCBXZWJQYWdlUHJveHk6OmF1dG9jb3JyZWN0aW9uRGF0YUNh
bAogICAgIGNhbGxiYWNrLT5wZXJmb3JtQ2FsbGJhY2tXaXRoUmV0dXJuVmFsdWUocmVjdHMsIGZv
bnROYW1lLCBmb250U2l6ZSwgZm9udFRyYWl0cyk7CiB9CiAKK3ZvaWQgV2ViUGFnZVByb3h5Ojpk
aWN0YXRpb25Db250ZXh0Q2FsbGJhY2soY29uc3QgU3RyaW5nJiBzZWxlY3RlZFRleHQsIGNvbnN0
IFN0cmluZyYgYmVmb3JlVGV4dCwgY29uc3QgU3RyaW5nJiBhZnRlclRleHQsIHVpbnQ2NF90IGNh
bGxiYWNrSUQpCit7CisgICAgUmVmUHRyPERpY3RhdGlvbkNvbnRleHRDYWxsYmFjaz4gY2FsbGJh
Y2sgPSBtX2RpY3RhdGlvbkNvbnRleHRDYWxsYmFja3MudGFrZShjYWxsYmFja0lEKTsKKyAgICBp
ZiAoIWNhbGxiYWNrKSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgY2FsbGJhY2stPnBlcmZvcm1DYWxsYmFja1dpdGhSZXR1cm5W
YWx1ZShzZWxlY3RlZFRleHQsIGJlZm9yZVRleHQsIGFmdGVyVGV4dCk7Cit9CisKIHZvaWQgV2Vi
UGFnZVByb3h5OjphdXRvY29ycmVjdGlvbkNvbnRleHRDYWxsYmFjayhjb25zdCBTdHJpbmcmIGJl
Zm9yZVRleHQsIGNvbnN0IFN0cmluZyYgbWFya2VkVGV4dCwgY29uc3QgU3RyaW5nJiBzZWxlY3Rl
ZFRleHQsIGNvbnN0IFN0cmluZyYgYWZ0ZXJUZXh0LCB1aW50NjRfdCBsb2NhdGlvbiwgdWludDY0
X3QgbGVuZ3RoLCB1aW50NjRfdCBjYWxsYmFja0lEKQogewogICAgIFJlZlB0cjxBdXRvY29ycmVj
dGlvbkNvbnRleHRDYWxsYmFjaz4gY2FsbGJhY2sgPSBtX2F1dG9jb3JyZWN0aW9uQ29udGV4dENh
bGxiYWNrcy50YWtlKGNhbGxiYWNrSUQpOwpAQCAtMjE2LDcgKzIyNywxMiBAQCB2b2lkIFdlYlBh
Z2VQcm94eTo6dXBkYXRlU2VsZWN0aW9uV2l0aFRvCiAgICAgbV90b3VjaGVzQ2FsbGJhY2tzLnNl
dChjYWxsYmFja0lELCBjYWxsYmFjayk7CiAgICAgbV9wcm9jZXNzLT5zZW5kKE1lc3NhZ2VzOjpX
ZWJQYWdlOjpVcGRhdGVTZWxlY3Rpb25XaXRoVG91Y2hlcyhwb2ludCwgdG91Y2hlcywgYmFzZUlz
U3RhcnQsIGNhbGxiYWNrSUQpLCBtX3BhZ2VJRCk7CiB9Ci0KKyAgICAKK3ZvaWQgV2ViUGFnZVBy
b3h5OjpyZXBsYWNlRGljdGF0ZWRUZXh0KGNvbnN0IFN0cmluZyYgb2xkVGV4dCwgY29uc3QgU3Ry
aW5nJiBuZXdUZXh0KQoreworICAgIG1fcHJvY2Vzcy0+c2VuZChNZXNzYWdlczo6V2ViUGFnZTo6
UmVwbGFjZURpY3RhdGVkVGV4dChvbGRUZXh0LCBuZXdUZXh0KSwgbV9wYWdlSUQpOworfQorICAg
IAogdm9pZCBXZWJQYWdlUHJveHk6OnJlcXVlc3RBdXRvY29ycmVjdGlvbkRhdGEoY29uc3QgU3Ry
aW5nJiB0ZXh0Rm9yQXV0b2NvcnJlY3Rpb24sIFBhc3NSZWZQdHI8QXV0b2NvcnJlY3Rpb25EYXRh
Q2FsbGJhY2s+IGNhbGxiYWNrKQogewogICAgIGlmICghaXNWYWxpZCgpKSB7CkBAIC0yNDgsNiAr
MjY0LDE4IEBAIGJvb2wgV2ViUGFnZVByb3h5OjphcHBseUF1dG9jb3JyZWN0aW9uKGMKICAgICBy
ZXR1cm4gYXV0b2NvcnJlY3Rpb25BcHBsaWVkOwogfQogCit2b2lkIFdlYlBhZ2VQcm94eTo6cmVx
dWVzdERpY3RhdGlvbkNvbnRleHQoUGFzc1JlZlB0cjxEaWN0YXRpb25Db250ZXh0Q2FsbGJhY2s+
IGNhbGxiYWNrKQoreworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgIGNhbGxiYWNrLT5p
bnZhbGlkYXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBjYWxs
YmFja0lEID0gY2FsbGJhY2stPmNhbGxiYWNrSUQoKTsKKyAgICBtX2RpY3RhdGlvbkNvbnRleHRD
YWxsYmFja3Muc2V0KGNhbGxiYWNrSUQsIGNhbGxiYWNrKTsKKyAgICBtX3Byb2Nlc3MtPnNlbmQo
TWVzc2FnZXM6OldlYlBhZ2U6OlJlcXVlc3REaWN0YXRpb25Db250ZXh0KGNhbGxiYWNrSUQpLCBt
X3BhZ2VJRCk7Cit9CisKIHZvaWQgV2ViUGFnZVByb3h5OjpyZXF1ZXN0QXV0b2NvcnJlY3Rpb25D
b250ZXh0KFBhc3NSZWZQdHI8QXV0b2NvcnJlY3Rpb25Db250ZXh0Q2FsbGJhY2s+IGNhbGxiYWNr
KQogewogICAgIGlmICghaXNWYWxpZCgpKSB7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9j
ZXNzL1dlYlBhZ2UvV2ViUGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlBy
b2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmgJKHJldmlzaW9uIDE2NjE4NykKKysrIFNvdXJjZS9XZWJL
aXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ1Miw2
ICs0NTIsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBleHRlbmRTZWxlY3Rpb24odWludDMyX3QgZ3Jh
bnVsYXJpdHkpOwogICAgIHZvaWQgZWxlbWVudERpZEZvY3VzKFdlYkNvcmU6Ok5vZGUqKTsKICAg
ICB2b2lkIGVsZW1lbnREaWRCbHVyKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICB2b2lkIHJlcXVlc3RE
aWN0YXRpb25Db250ZXh0KHVpbnQ2NF90IGNhbGxiYWNrSUQpOworICAgIHZvaWQgcmVwbGFjZURp
Y3RhdGVkVGV4dChjb25zdCBTdHJpbmcmIG9sZFRleHQsIGNvbnN0IFN0cmluZyYgbmV3VGV4dCk7
CiAgICAgdm9pZCByZXF1ZXN0QXV0b2NvcnJlY3Rpb25EYXRhKGNvbnN0IFN0cmluZyYgdGV4dEZv
ckF1dG9jb3JyZWN0aW9uLCB1aW50NjRfdCBjYWxsYmFja0lEKTsKICAgICB2b2lkIGFwcGx5QXV0
b2NvcnJlY3Rpb24oY29uc3QgU3RyaW5nJiBjb3JyZWN0aW9uLCBjb25zdCBTdHJpbmcmIG9yaWdp
bmFsVGV4dCwgdWludDY0X3QgY2FsbGJhY2tJRCk7CiAgICAgdm9pZCBzeW5jQXBwbHlBdXRvY29y
cmVjdGlvbihjb25zdCBTdHJpbmcmIGNvcnJlY3Rpb24sIGNvbnN0IFN0cmluZyYgb3JpZ2luYWxU
ZXh0LCBib29sJiBjb3JyZWN0aW9uQXBwbGllZCk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQ
cm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbgo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbgkocmV2aXNpb24g
MTY2MTg3KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVz
c2FnZXMuaW4JKHdvcmtpbmcgY29weSkKQEAgLTUzLDYgKzUzLDggQEAgbWVzc2FnZXMgLT4gV2Vi
UGFnZSBMZWdhY3lSZWNlaXZlciB7CiAgICAgVXBkYXRlQmxvY2tTZWxlY3Rpb25XaXRoVG91Y2go
V2ViQ29yZTo6SW50UG9pbnQgcG9pbnQsIHVpbnQzMl90IHRvdWNoLCB1aW50MzJfdCBoYW5kbGVQ
b3NpdGlvbikKICAgICBTZWxlY3RXaXRoVHdvVG91Y2hlcyhXZWJDb3JlOjpJbnRQb2ludCBmcm9t
LCBXZWJDb3JlOjpJbnRQb2ludCB0bywgdWludDMyX3QgZ2VzdHVyZVR5cGUsIHVpbnQzMl90IGdl
c3R1cmVTdGF0ZSwgdWludDY0X3QgY2FsbGJhY2tJRCkKICAgICBFeHRlbmRTZWxlY3Rpb24odWlu
dDMyX3QgZ3JhbnVsYXJpdHkpCisgICAgUmVxdWVzdERpY3RhdGlvbkNvbnRleHQodWludDY0X3Qg
Y2FsbGJhY2tJRCkKKyAgICBSZXBsYWNlRGljdGF0ZWRUZXh0KFN0cmluZyBvbGRUZXh0LCBTdHJp
bmcgbmV3VGV4dCkKICAgICBSZXF1ZXN0QXV0b2NvcnJlY3Rpb25EYXRhKFN0cmluZyB0ZXh0Rm9y
QXV0b2NvcnJlY3Rpb24sIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiAgICAgQXBwbHlBdXRvY29ycmVj
dGlvbihTdHJpbmcgY29ycmVjdGlvbiwgU3RyaW5nIG9yaWdpbmFsVGV4dCwgdWludDY0X3QgY2Fs
bGJhY2tJRCkKICAgICBTeW5jQXBwbHlBdXRvY29ycmVjdGlvbihTdHJpbmcgY29ycmVjdGlvbiwg
U3RyaW5nIG9yaWdpbmFsVGV4dCkgLT4gKGJvb2wgYXV0b2NvcnJlY3Rpb25BcHBsaWVkKQpJbmRl
eDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9pb3MvV2ViUGFn
ZUlPUy5tbQkocmV2aXNpb24gMTY2MTg3KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9X
ZWJQYWdlL2lvcy9XZWJQYWdlSU9TLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xMTg5LDYgKzExODks
NzIgQEAgdm9pZCBXZWJQYWdlOjpjb252ZXJ0U2VsZWN0aW9uUmVjdHNUb1JvbwogICAgIH0KIH0K
IAordm9pZCBXZWJQYWdlOjpyZXF1ZXN0RGljdGF0aW9uQ29udGV4dCh1aW50NjRfdCBjYWxsYmFj
a0lEKQoreworICAgIEZyYW1lJiBmcmFtZSA9IG1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCkuZm9j
dXNlZE9yTWFpbkZyYW1lKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0UG9zaXRpb24gPSBm
cmFtZS5zZWxlY3Rpb24oKS5zZWxlY3Rpb24oKS5zdGFydCgpOworICAgIFZpc2libGVQb3NpdGlv
biBlbmRQb3NpdGlvbiA9IGZyYW1lLnNlbGVjdGlvbigpLnNlbGVjdGlvbigpLmVuZCgpOworICAg
IGNvbnN0IHVuc2lnbmVkIGRpY3RhdGlvbkNvbnRleHRXb3JkQ291bnQgPSA1OworCisgICAgU3Ry
aW5nIHNlbGVjdGVkVGV4dDsKKyAgICBpZiAoZnJhbWUuc2VsZWN0aW9uKCkuaXNSYW5nZSgpKQor
ICAgICAgICBzZWxlY3RlZFRleHQgPSBwbGFpblRleHQoZnJhbWUuc2VsZWN0aW9uKCkuc2VsZWN0
aW9uKCkudG9Ob3JtYWxpemVkUmFuZ2UoKS5nZXQoKSk7CisKKyAgICBTdHJpbmcgY29udGV4dEJl
Zm9yZTsKKyAgICBpZiAoc3RhcnRQb3NpdGlvbiAhPSBzdGFydE9mRWRpdGFibGVDb250ZW50KHN0
YXJ0UG9zaXRpb24pKSB7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBjdXJyZW50UG9zaXRpb24g
PSBzdGFydFBvc2l0aW9uOworICAgICAgICBWaXNpYmxlUG9zaXRpb24gbGFzdFBvc2l0aW9uID0g
c3RhcnRQb3NpdGlvbjsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRpY3RhdGlv
bkNvbnRleHRXb3JkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uID0g
c3RhcnRPZldvcmQocG9zaXRpb25PZk5leHRCb3VuZGFyeU9mR3JhbnVsYXJpdHkobGFzdFBvc2l0
aW9uLCBXb3JkR3JhbnVsYXJpdHksIERpcmVjdGlvbkJhY2t3YXJkKSk7CisgICAgICAgICAgICBp
ZiAoY3VycmVudFBvc2l0aW9uLmlzTnVsbCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgbGFzdFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uOworICAgICAgICB9CisgICAg
ICAgIGlmIChsYXN0UG9zaXRpb24uaXNOb3ROdWxsKCkgJiYgbGFzdFBvc2l0aW9uICE9IHN0YXJ0
UG9zaXRpb24pCisgICAgICAgICAgICBjb250ZXh0QmVmb3JlID0gcGxhaW5UZXh0KFJhbmdlOjpj
cmVhdGUoKmZyYW1lLmRvY3VtZW50KCksIGxhc3RQb3NpdGlvbiwgc3RhcnRQb3NpdGlvbikuZ2V0
KCkpOworICAgIH0KKworICAgIFN0cmluZyBjb250ZXh0QWZ0ZXI7CisgICAgaWYgKGVuZFBvc2l0
aW9uICE9IGVuZE9mRWRpdGFibGVDb250ZW50KGVuZFBvc2l0aW9uKSkgeworICAgICAgICBWaXNp
YmxlUG9zaXRpb24gY3VycmVudFBvc2l0aW9uID0gZW5kUG9zaXRpb247CisgICAgICAgIFZpc2li
bGVQb3NpdGlvbiBsYXN0UG9zaXRpb24gPSBlbmRQb3NpdGlvbjsKKyAgICAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IGRpY3RhdGlvbkNvbnRleHRXb3JkQ291bnQ7ICsraSkgeworICAgICAg
ICAgICAgY3VycmVudFBvc2l0aW9uID0gZW5kT2ZXb3JkKHBvc2l0aW9uT2ZOZXh0Qm91bmRhcnlP
ZkdyYW51bGFyaXR5KGxhc3RQb3NpdGlvbiwgV29yZEdyYW51bGFyaXR5LCBEaXJlY3Rpb25Gb3J3
YXJkKSk7CisgICAgICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uLmlzTnVsbCgpKQorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbGFzdFBvc2l0aW9uID0gY3VycmVudFBvc2l0
aW9uOworICAgICAgICB9CisgICAgICAgIGlmIChsYXN0UG9zaXRpb24uaXNOb3ROdWxsKCkgJiYg
bGFzdFBvc2l0aW9uICE9IGVuZFBvc2l0aW9uKQorICAgICAgICAgICAgY29udGV4dEFmdGVyID0g
cGxhaW5UZXh0KFJhbmdlOjpjcmVhdGUoKmZyYW1lLmRvY3VtZW50KCksIGVuZFBvc2l0aW9uLCBs
YXN0UG9zaXRpb24pLmdldCgpKTsKKyAgICB9CisKKyAgICBzZW5kKE1lc3NhZ2VzOjpXZWJQYWdl
UHJveHk6OkRpY3RhdGlvbkNvbnRleHRDYWxsYmFjayhzZWxlY3RlZFRleHQsIGNvbnRleHRCZWZv
cmUsIGNvbnRleHRBZnRlciwgY2FsbGJhY2tJRCkpOworfQorCit2b2lkIFdlYlBhZ2U6OnJlcGxh
Y2VEaWN0YXRlZFRleHQoY29uc3QgU3RyaW5nJiBvbGRUZXh0LCBjb25zdCBTdHJpbmcmIG5ld1Rl
eHQpCit7CisgICAgRnJhbWUmIGZyYW1lID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS5mb2N1
c2VkT3JNYWluRnJhbWUoKTsKKyAgICBpZiAoZnJhbWUuc2VsZWN0aW9uKCkuaXNOb25lKCkpCisg
ICAgICAgIHJldHVybjsKKyAgICAKKyAgICBpZiAoZnJhbWUuc2VsZWN0aW9uKCkuaXNSYW5nZSgp
KSB7CisgICAgICAgIGZyYW1lLmVkaXRvcigpLmRlbGV0ZVNlbGVjdGlvbldpdGhTbWFydERlbGV0
ZShmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVmlzaWJsZVBvc2l0aW9uIHBv
c2l0aW9uID0gZnJhbWUuc2VsZWN0aW9uKCkuc2VsZWN0aW9uKCkuc3RhcnQoKTsKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG9sZFRleHQubGVuZ3RoKCk7ICsraSkKKyAgICAgICAgcG9zaXRp
b24gPSBwb3NpdGlvbi5wcmV2aW91cygpOworICAgIGlmIChwb3NpdGlvbi5pc051bGwoKSkKKyAg
ICAgICAgcG9zaXRpb24gPSBzdGFydE9mRG9jdW1lbnQoc3RhdGljX2Nhc3Q8Tm9kZSo+KGZyYW1l
LmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKSk7CisgICAgUmVmUHRyPFJhbmdlPiByYW5n
ZSA9IFJhbmdlOjpjcmVhdGUoKmZyYW1lLmRvY3VtZW50KCksIHBvc2l0aW9uLCBmcmFtZS5zZWxl
Y3Rpb24oKS5zZWxlY3Rpb24oKS5zdGFydCgpKTsKKworICAgIGlmIChwbGFpblRleHQocmFuZ2Uu
Z2V0KCkpICE9IG9sZFRleHQpCisgICAgICAgIHJldHVybjsKKworICAgIGZyYW1lLnNlbGVjdGlv
bigpLnNldFNlbGVjdGVkUmFuZ2UocmFuZ2UuZ2V0KCksIFVQU1RSRUFNLCB0cnVlKTsKKyAgICBm
cmFtZS5lZGl0b3IoKS5pbnNlcnRUZXh0KG5ld1RleHQsIDApOworfQorCiB2b2lkIFdlYlBhZ2U6
OnJlcXVlc3RBdXRvY29ycmVjdGlvbkRhdGEoY29uc3QgU3RyaW5nJiB0ZXh0Rm9yQXV0b2NvcnJl
Y3Rpb24sIHVpbnQ2NF90IGNhbGxiYWNrSUQpCiB7CiAgICAgUmVmUHRyPFJhbmdlPiByYW5nZTsK
</data>
<flag name="review"
          id="251935"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>