<?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>90269</bug_id>
          
          <creation_ts>2012-06-29 04:08:59 -0700</creation_ts>
          <short_desc>[GTK] Add a new and reusable enchant-based spellchecker in WebCore</short_desc>
          <delta_ts>2012-08-03 01:04:14 -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>WebKitGTK</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>Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>92655</dependson>
    
    <dependson>92656</dependson>
    
    <dependson>92773</dependson>
          <blocked>90268</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Mario Sanchez Prada">mario</reporter>
          <assigned_to name="Mario Sanchez Prada">mario</assigned_to>
          <cc>cgarcia</cc>
    
    <cc>mrobinson</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>660351</commentid>
    <comment_count>0</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-29 04:08:59 -0700</bug_when>
    <thetext>The idea is to have a class in WebCore that we can use both for WebKit and WebKit2, which would take care of dealing with libenchant to implement a spellchecker using that library.

This new class would allow simplifying code in Source/WebKit/gtk/webkit/webkitspellcheckerenchant.cpp and would ease the implementation of the new spell checker API for WebKit2GTK (see bug 90268)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>660403</commentid>
    <comment_count>1</comment_count>
      <attachid>150155</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-29 05:35:51 -0700</bug_when>
    <thetext>Created attachment 150155
Patch proposal

Attaching proposal of new TextCheckerEnchant class under WebCore/platform/text/gtk</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>660540</commentid>
    <comment_count>2</comment_count>
      <attachid>150155</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2012-06-29 09:01:47 -0700</bug_when>
    <thetext>Comment on attachment 150155
Patch proposal

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

Looks good, though I think we should make the interface more closely match WebCore style.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:57
&gt; +void TextCheckerEnchant::ignoreWord(const char* word)
&gt; +{
&gt; +    for (Vector&lt;EnchantDict*&gt;::const_iterator iter = m_enchantDicts.begin(); iter != m_enchantDicts.end(); ++iter)
&gt; +        enchant_dict_add_to_session(*iter, word, -1);
&gt; +}
&gt; +
&gt; +void TextCheckerEnchant::learnWord(const char* word)
&gt; +{

These should probably take Strings, which encapsulate encoding information better.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:62
&gt; +void TextCheckerEnchant::checkSpellingOfString(const char* string, int* misspellingLocation, int* misspellingLength)

It think it makes sense to rename this to be more precise. checkSpellingOfString could be getLocationAndLengthOfFirstMisspellilng. This aligns with the WebKit style of using the word &quot;get&quot; for functions and methods that have output arguments.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:86
&gt; +            while (attrs.get()[end].is_word_end &lt; 1)
&gt; +                end++;

You&apos;re missing the fix that I recently made to the WebKit1 enchant code to handle contractions.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:114
&gt; +char** TextCheckerEnchant::getGuessesForWord(const char* word)

Since this is a WebCore interface, a Vector&lt;String&gt; makes more sense here.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:125
&gt; +        if (numberOfSuggestions &gt; 0) {

This looks like it should be an early continue.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:127
&gt; +            if (numberOfSuggestions &gt; 10)
&gt; +                numberOfSuggestions = 10;

10 should probably be a constant like:
static const int maximumNumberOfSuggestions = 10;

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:141
&gt; +void TextCheckerEnchant::updateSpellCheckingLanguages(const char* languages)

It makes sense for this to take a String instead of a const char*.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:146
&gt; +        char** langs = g_strsplit(languages, &quot;,&quot;, -1);

You could use String.split here and avoid having to free the list of languages.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:179
&gt; +#endif /* ENABLE(SPELLCHECK) */

Nit: You should use a C++ comment here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>660812</commentid>
    <comment_count>3</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-06-29 15:06:06 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 150155 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=150155&amp;action=review
&gt; 
&gt; Looks good, though I think we should make the interface more closely match WebCore style.

Thanks for the quick review, Martin. As you can guess the patch is mostly about moving code down to WebCore, but I agree with the points you made and will work on that after coming from holidays.

Actually I shouldn&apos;t be checking mail now already... just couldn&apos;t help it :-)

Thanks,
Mario</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>672352</commentid>
    <comment_count>4</comment_count>
      <attachid>150155</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-07-18 07:23:42 -0700</bug_when>
    <thetext>Comment on attachment 150155
Patch proposal

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

Now working on this. See some comments in the meanwhile...

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:57
&gt;&gt; +{
&gt; 
&gt; These should probably take Strings, which encapsulate encoding information better.

Makes sense. I&apos;ll change that.

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:62
&gt;&gt; +void TextCheckerEnchant::checkSpellingOfString(const char* string, int* misspellingLocation, int* misspellingLength)
&gt; 
&gt; It think it makes sense to rename this to be more precise. checkSpellingOfString could be getLocationAndLengthOfFirstMisspellilng. This aligns with the WebKit style of using the word &quot;get&quot; for functions and methods that have output arguments.

Even if I agree with you in that something like that could be a better name as a general thought, I don&apos;t think we should do it in this case since it would be confusing, as checkSpellingOfString() is the expected name according to what is defined in WebCore/platform/text/TextCheckerClient.h:

  class TextCheckerClient {
  public:
      virtual ~TextCheckerClient() {}

      [...]
      virtual void learnWord(const String&amp;) = 0;
      virtual void checkSpellingOfString(const UChar*, int length, int* misspellingLocation, int* misspellingLength) = 0;
      virtual String getAutoCorrectSuggestionForMisspelledWord(const String&amp; misspelledWord) = 0;
      [...]
};

So, I think we should leave this name as is, to reflect that its related to that.

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:86
&gt;&gt; +                end++;
&gt; 
&gt; You&apos;re missing the fix that I recently made to the WebKit1 enchant code to handle contractions.

I guess you mean SVN r121360. I&apos;ll fix that in an upcoming patch.

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:114
&gt;&gt; +char** TextCheckerEnchant::getGuessesForWord(const char* word)
&gt; 
&gt; Since this is a WebCore interface, a Vector&lt;String&gt; makes more sense here.

Makes sense. I&apos;ll change that.

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:125
&gt;&gt; +        if (numberOfSuggestions &gt; 0) {
&gt; 
&gt; This looks like it should be an early continue.

Ok.

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:127
&gt;&gt; +                numberOfSuggestions = 10;
&gt; 
&gt; 10 should probably be a constant like:
&gt; static const int maximumNumberOfSuggestions = 10;

Just moved code from WebKit1, but I agree with this change too. I&apos;ll fix it.

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:141
&gt;&gt; +void TextCheckerEnchant::updateSpellCheckingLanguages(const char* languages)
&gt; 
&gt; It makes sense for this to take a String instead of a const char*.

Ok.

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:146
&gt;&gt; +        char** langs = g_strsplit(languages, &quot;,&quot;, -1);
&gt; 
&gt; You could use String.split here and avoid having to free the list of languages.

Ok.

&gt;&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:179
&gt;&gt; +#endif /* ENABLE(SPELLCHECK) */
&gt; 
&gt; Nit: You should use a C++ comment here.

Ok.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>672474</commentid>
    <comment_count>5</comment_count>
      <attachid>153034</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-07-18 10:12:14 -0700</bug_when>
    <thetext>Created attachment 153034
Patch proposal

New patch addressing issues pointed out by Martin</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>674607</commentid>
    <comment_count>6</comment_count>
      <attachid>153515</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-07-20 08:47:41 -0700</bug_when>
    <thetext>Created attachment 153515
Patch proposal

I found today an issue in the previous patch in TextCheckerEnchant::~TextCheckerEnchant(), so this new patch basically fixes that.

Thus, this is the one to be reviewed. Sorry for the noise.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>681393</commentid>
    <comment_count>7</comment_count>
      <attachid>153515</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2012-07-28 04:49:56 -0700</bug_when>
    <thetext>Comment on attachment 153515
Patch proposal

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

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:30
&gt; +static const size_t maximumNumberOfSuggestions = 10;

Since this is only used in one place, feel free to simply move this to right above where you use it.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:34
&gt; +    Vector&lt;CString&gt;* dicts = static_cast&lt;Vector&lt;CString&gt;*&gt;(data);

dicts -&gt; dictionaries

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.h:35
&gt; +class TextCheckerEnchant : public RefCounted&lt;TextCheckerEnchant&gt; {
&gt; +public:
&gt; +    static PassRefPtr&lt;TextCheckerEnchant&gt; create() { return adoptRef(new TextCheckerEnchant); }

This shouldn&apos;t be shared so there&apos;s no reason to make it RefCounted.

&gt; Source/WebKit/gtk/webkit/webkitspellcheckerenchant.cpp:42
&gt; +    RefPtr&lt;TextCheckerEnchant&gt; textCheckerEnchant;

This can just be TextCheckerEnchant textCheckerEnchant.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>681451</commentid>
    <comment_count>8</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-07-28 11:28:47 -0700</bug_when>
    <thetext>Committed r123966: &lt;http://trac.webkit.org/changeset/123966&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>682118</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-07-30 10:06:25 -0700</bug_when>
    <thetext>Re-opened since this is blocked by 92655</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>682946</commentid>
    <comment_count>10</comment_count>
      <attachid>155504</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-07-31 05:30:04 -0700</bug_when>
    <thetext>Created attachment 155504
Patch proposal

There was an issue using the new TextCheckerEnchant class from WebKitSpellCheckerEnchant, where we should use String::fromUTF8() instead of plainly using the String (const char*) constructor.

This new patch fixes that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>682955</commentid>
    <comment_count>11</comment_count>
      <attachid>153515</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-07-31 05:44:12 -0700</bug_when>
    <thetext>Comment on attachment 153515
Patch proposal

Cleared Martin Robinson&apos;s review+ from obsolete attachment 153515 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>683102</commentid>
    <comment_count>12</comment_count>
      <attachid>155504</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2012-07-31 08:25:46 -0700</bug_when>
    <thetext>Comment on attachment 155504
Patch proposal

Okay. Let&apos;s give it a shot. Sorry that I didn&apos;t see this issue in my previous reviews.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>683133</commentid>
    <comment_count>13</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-07-31 08:51:52 -0700</bug_when>
    <thetext>Committed r124207: &lt;http://trac.webkit.org/changeset/124207&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>683271</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-07-31 11:08:30 -0700</bug_when>
    <thetext>Re-opened since this is blocked by 92773</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>685320</commentid>
    <comment_count>15</comment_count>
      <attachid>156071</attachid>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-08-02 06:52:44 -0700</bug_when>
    <thetext>Created attachment 156071
Patch proposal

Strike 3.

So it seems the problem happened due to wrong usage of CString::length(). I was assuming it was returning the actual number of utf8 characters and it was actually returning the number of elements in CString&apos;s internal vector holding the data:

    size_t length = string.utf8().length();

...and this was causing trouble when special characters were present in the layout test (as it was the case for those failing tests)

The right version of this code (in TextEnchantChecker::checkSpellingOfString()) would be like this:

    size_t length = string.length();

This new patch fixed that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>685550</commentid>
    <comment_count>16</comment_count>
      <attachid>156071</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2012-08-02 10:33:46 -0700</bug_when>
    <thetext>Comment on attachment 156071
Patch proposal

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

Looks good, but I have one tiny suggestion before landing.

&gt; Source/WebCore/platform/text/gtk/TextCheckerEnchant.cpp:165
&gt; +            GOwnPtr&lt;gchar&gt; currentLanguage(g_strdup(iter-&gt;utf8().data()));

This can just be:

CString currentLanguage = iter-&gt;utf8();

and you could avoid one memory allocation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>686356</commentid>
    <comment_count>17</comment_count>
    <who name="Mario Sanchez Prada">mario</who>
    <bug_when>2012-08-03 01:04:14 -0700</bug_when>
    <thetext>Committed r124578: &lt;http://trac.webkit.org/changeset/124578&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>150155</attachid>
            <date>2012-06-29 05:35:51 -0700</date>
            <delta_ts>2012-07-18 10:12:02 -0700</delta_ts>
            <desc>Patch proposal</desc>
            <filename>0001-2012-06-29-Mario-Sanchez-Prada-msanchez-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>24871</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSAxNTY5NzYwZTM5NDBiYzliZjBjNDY2YmZlMGFiOTVmOTg2ZWY5MTI0IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBGcmksIDI5IEp1biAyMDEyIDEzOjE3OjQ4ICswMjAwClN1YmplY3Q6IFtQQVRD
SCAxLzJdIDIwMTItMDYtMjkgIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgoKICAgICAgICBbR1RLXSBBZGQgYSBuZXcgYW5kIHJldXNhYmxlIGVuY2hhbnQtYmFzZWQg
c3BlbGxjaGVja2VyIGluIFdlYkNvcmUKICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9OTAyNjkKCiAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CgogICAgICAgIE1vdmUgZW5jaGFudCBzcGVjaWZpYyBjb2RlIGRvd24gdG8gV2ViQ29yZSwgaW50
byBhIG5ldyBjbGFzcwogICAgICAgIFRleHRDaGVja2VyRW5jaGFudCwgdGhhdCB3ZSBjYW4gdXNl
IGZyb20gV0sxIGFuZCBXSzIuCgogICAgICAgICogR05VbWFrZWZpbGUuYW06IEFkZCBmbGFncyB0
byBoYW5kbGUgdGhlIFNQRUxMQ0hFQ0sgZmVhdHVyZS4KICAgICAgICAqIEdOVW1ha2VmaWxlLmxp
c3QuYW06IEFkZGVkIG5ldyBmaWxlcy4KICAgICAgICAqIHBsYXRmb3JtL3RleHQvZ3RrL1RleHRD
aGVja2VyRW5jaGFudC5jcHA6IEFkZGVkLgogICAgICAgIChnZXRBdmFpbGFibGVEaWN0aW9uYXJp
ZXNDYWxsYmFjayk6CiAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6VGV4dENoZWNrZXJFbmNo
YW50KToKICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50Ojp+VGV4dENoZWNrZXJFbmNoYW50KToK
ICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50OjppZ25vcmVXb3JkKToKICAgICAgICAoVGV4dENo
ZWNrZXJFbmNoYW50OjpsZWFybldvcmQpOgogICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OmNo
ZWNrU3BlbGxpbmdPZlN0cmluZyk6CiAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6Z2V0R3Vl
c3Nlc0ZvcldvcmQpOgogICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OnVwZGF0ZVNwZWxsQ2hl
Y2tpbmdMYW5ndWFnZXMpOgogICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OmZyZWVFbmNoYW50
QnJva2VyRGljdHMpOgogICAgICAgICogcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNo
YW50Lmg6IEFkZGVkLgogICAgICAgIChXZWJDb3JlKToKICAgICAgICAoVGV4dENoZWNrZXJFbmNo
YW50KToKICAgICAgICAoV2ViQ29yZTo6VGV4dENoZWNrZXJFbmNoYW50OjpjcmVhdGUpOgoKMjAx
Mi0wNi0yOSAgTWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+CgogICAg
ICAgIFtHVEtdIEFkZCBhIG5ldyBhbmQgcmV1c2FibGUgZW5jaGFudC1iYXNlZCBzcGVsbGNoZWNr
ZXIgaW4gV2ViQ29yZQogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD05MDI2OQoKICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCiAgICAgICAg
UmVtb3ZlIGVuY2hhbnQgc3BlY2lmaWMgY29kZSBmcm9tIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hh
bnQgYW5kCiAgICAgICAgaW1wbGVtZW50IGl0IHJlbHlpbmcgaW4gdGhlIG5ldyBUZXh0Q2hlY2tl
ckVuY2hhbnQgY2xhc3MgaW4gV2ViQ29yZS4KCiAgICAgICAgKiB3ZWJraXQvd2Via2l0c3BlbGxj
aGVja2VyZW5jaGFudC5jcHA6CiAgICAgICAgKF9XZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50UHJp
dmF0ZSk6CiAgICAgICAgKHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfZmluYWxpemUpOgog
ICAgICAgICh3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2NsYXNzX2luaXQpOgogICAgICAg
ICh3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2luaXQpOgogICAgICAgIChjaGVja1NwZWxs
aW5nT2ZTdHJpbmcpOgogICAgICAgIChnZXRHdWVzc2VzRm9yV29yZCk6CiAgICAgICAgKHVwZGF0
ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMpOgogICAgICAgIChsZWFybldvcmQpOgogICAgICAgIChp
Z25vcmVXb3JkKToKLS0tCiBTb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cgICAgICAgICAgICAgICAg
ICAgICAgICAgICB8ICAgMjcgKysrCiBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSAgICAg
ICAgICAgICAgICAgICAgICB8ICAgMTEgKy0KIFNvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxp
c3QuYW0gICAgICAgICAgICAgICAgIHwgICAgOCArCiAuLi4vcGxhdGZvcm0vdGV4dC9ndGsvVGV4
dENoZWNrZXJFbmNoYW50LmNwcCAgICAgICB8ICAxODAgKysrKysrKysrKysrKysrKysrKysKIC4u
Li9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5oIHwgICA1NiAr
KysrKysKIFNvdXJjZS9XZWJLaXQvZ3RrL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAgICAg
IHwgICAyMSArKysKIC4uLi9ndGsvd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3Bw
ICAgICAgIHwgIDE2NCArKy0tLS0tLS0tLS0tLS0tLS0KIDcgZmlsZXMgY2hhbmdlZCwgMzEzIGlu
c2VydGlvbnMoKyksIDE1NCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3BwCiBjcmVhdGUg
bW9kZSAxMDA2NDQgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJF
bmNoYW50LmgKCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2Uv
V2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggM2ZiMzRiYi4uODQwYjJhOSAxMDA3NTUKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAt
MSwzICsxLDMwIEBACisyMDEyLTA2LTI5ICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpA
aWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBBZGQgYSBuZXcgYW5kIHJldXNhYmxlIGVuY2hh
bnQtYmFzZWQgc3BlbGxjaGVja2VyIGluIFdlYkNvcmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkwMjY5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgTW92ZSBlbmNoYW50IHNwZWNpZmljIGNvZGUgZG93biB0
byBXZWJDb3JlLCBpbnRvIGEgbmV3IGNsYXNzCisgICAgICAgIFRleHRDaGVja2VyRW5jaGFudCwg
dGhhdCB3ZSBjYW4gdXNlIGZyb20gV0sxIGFuZCBXSzIuCisKKyAgICAgICAgKiBHTlVtYWtlZmls
ZS5hbTogQWRkIGZsYWdzIHRvIGhhbmRsZSB0aGUgU1BFTExDSEVDSyBmZWF0dXJlLgorICAgICAg
ICAqIEdOVW1ha2VmaWxlLmxpc3QuYW06IEFkZGVkIG5ldyBmaWxlcy4KKyAgICAgICAgKiBwbGF0
Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKGdl
dEF2YWlsYWJsZURpY3Rpb25hcmllc0NhbGxiYWNrKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5j
aGFudDo6VGV4dENoZWNrZXJFbmNoYW50KToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6
flRleHRDaGVja2VyRW5jaGFudCk6CisgICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6Omlnbm9y
ZVdvcmQpOgorICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50OjpsZWFybldvcmQpOgorICAgICAg
ICAoVGV4dENoZWNrZXJFbmNoYW50OjpjaGVja1NwZWxsaW5nT2ZTdHJpbmcpOgorICAgICAgICAo
VGV4dENoZWNrZXJFbmNoYW50OjpnZXRHdWVzc2VzRm9yV29yZCk6CisgICAgICAgIChUZXh0Q2hl
Y2tlckVuY2hhbnQ6OnVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMpOgorICAgICAgICAoVGV4
dENoZWNrZXJFbmNoYW50OjpmcmVlRW5jaGFudEJyb2tlckRpY3RzKToKKyAgICAgICAgKiBwbGF0
Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuaDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudCk6CisgICAgICAgIChXZWJDb3JlOjpU
ZXh0Q2hlY2tlckVuY2hhbnQ6OmNyZWF0ZSk6CisKIDIwMTItMDYtMjcgIEtlbnRhcm8gSGFyYSAg
PGhhcmFrZW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJlbmFtZSBFbGVtZW50OjpyYXJlRGF0
YSgpIHRvIEVsZW1lbnQ6OmVsZW1lbnRSYXJlRGF0YSgpLCBhbmQgRWxlbWVudDo6ZW5zdXJlUmFy
ZURhdGEoKSB0byBFbGVtZW50OjplbnN1cmVFbGVtZW50UmFyZURhdGEoKQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0gYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmls
ZS5hbQppbmRleCBlYWUwYTcxLi43ODIyOTdmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9H
TlVtYWtlZmlsZS5hbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQpAQCAtMTE1
LDcgKzExNSw4IEBAIHdlYmNvcmVndGtfY3BwZmxhZ3MgKz0gXAogCS1JJChzcmNkaXIpL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lciBcCiAJLUkkKHNyY2RpcikvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3RrIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ndGsgXAotCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvc291cAorCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvc291cCBcCisJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9n
dGsKIAogIyAtLS0KICMgRmVhdHVyZXMgZW5hYmxlZCBieSBkZWZhdWx0IGF0IGNvbXBpbGF0aW9u
IHRpbWUKQEAgLTcyNSw2ICs3MjYsMTQgQEAgRkVBVFVSRV9ERUZJTkVTICs9IEVOQUJMRV9MSU5L
X1BSRUZFVENIPTEKIHdlYmNvcmVfY3BwZmxhZ3MgKz0gLURFTkFCTEVfTElOS19QUkVGRVRDSD0x
CiBlbmRpZiAgIyBFTkQgRU5BQkxFX0xJTktfUFJFRkVUQ0gKIAorIyAtLS0KKyMgU3BlbGwgY2hl
Y2sgc3VwcG9ydAorIyAtLS0KK2lmIEVOQUJMRV9TUEVMTENIRUNLCitGRUFUVVJFX0RFRklORVMg
Kz0gRU5BQkxFX1NQRUxMQ0hFQ0s9MQord2ViY29yZV9jcHBmbGFncyArPSAtREVOQUJMRV9TUEVM
TENIRUNLPTEKK2VuZGlmICAjIEVORCBFTkFCTEVfU1BFTExDSEVDSworCiBEZXJpdmVkU291cmNl
cy9XZWJDb3JlL0NTU1Byb3BlcnR5TmFtZXMuY3BwOiBEZXJpdmVkU291cmNlcy9XZWJDb3JlL0NT
U1Byb3BlcnR5TmFtZXMuaAogRGVyaXZlZFNvdXJjZXMvV2ViQ29yZS9DU1NQcm9wZXJ0eU5hbWVz
Lmg6ICQoV0VCQ09SRV9DU1NfUFJPUEVSVFlfTkFNRVMpICQoV2ViQ29yZSkvY3NzL21ha2Vwcm9w
LnBsCiAJJChBTV9WX0dFTikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxl
Lmxpc3QuYW0gYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCmluZGV4IDM1ZWMy
ZWMuLmI0NTBmN2IgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3Qu
YW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQpAQCAtNjE5NiwzICs2
MTk2LDExIEBAIGRvbV9iaW5kaW5nX2lkbHMgKz0gXAogCiBlbmRpZiAgIyBFTkQgRU5BQkxFX1FV
T1RBCiAKKyMgLS0tLQorIyBTcGVsbCBjaGVjayBzdXBwb3J0CisjIC0tLS0KK2lmIEVOQUJMRV9T
UEVMTENIRUNLCit3ZWJjb3JlX3NvdXJjZXMgKz0gXAorCVNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5oIFwKKwlTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3BwCitlbmRpZiAjIEVORCBFTkFCTEVfU1BF
TExDSEVDSwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4
dENoZWNrZXJFbmNoYW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1Rl
eHRDaGVja2VyRW5jaGFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
ODQwODcyMwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQv
Z3RrL1RleHRDaGVja2VyRW5jaGFudC5jcHAKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiAgQ29w
eXJpZ2h0IChDKSAyMDEyIElnYWxpYSBTLkwuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwg
d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVGV4dENoZWNrZXJFbmNoYW50Lmgi
CisKKyNpZiBFTkFCTEUoU1BFTExDSEVDSykKKworI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+Cisj
aW5jbHVkZSA8d3RmL2dvYmplY3QvR093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJp
bmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK3N0YXRpYyB2b2lkIGdldEF2YWls
YWJsZURpY3Rpb25hcmllc0NhbGxiYWNrKGNvbnN0IGNoYXIqIGNvbnN0IGxhbmd1YWdlVGFnLCBj
b25zdCBjaGFyKiBjb25zdCwgY29uc3QgY2hhciogY29uc3QsIGNvbnN0IGNoYXIqIGNvbnN0LCB2
b2lkKiBkYXRhKQoreworICAgIFZlY3RvcjxDU3RyaW5nPiogZGljdHMgPSBzdGF0aWNfY2FzdDxW
ZWN0b3I8Q1N0cmluZz4qPihkYXRhKTsKKyAgICBkaWN0cy0+YXBwZW5kKGxhbmd1YWdlVGFnKTsK
K30KKworVGV4dENoZWNrZXJFbmNoYW50OjpUZXh0Q2hlY2tlckVuY2hhbnQoKQorICAgIDogbV9i
cm9rZXIoZW5jaGFudF9icm9rZXJfaW5pdCgpKQorICAgICwgbV9lbmNoYW50RGljdHMoMCkKK3sK
K30KKworVGV4dENoZWNrZXJFbmNoYW50Ojp+VGV4dENoZWNrZXJFbmNoYW50KCkKK3sKKyAgICBp
ZiAobV9icm9rZXIpCisgICAgICAgIGVuY2hhbnRfYnJva2VyX2ZyZWUobV9icm9rZXIpOworCisg
ICAgZnJlZUVuY2hhbnRCcm9rZXJEaWN0cygpOworfQorCit2b2lkIFRleHRDaGVja2VyRW5jaGFu
dDo6aWdub3JlV29yZChjb25zdCBjaGFyKiB3b3JkKQoreworICAgIGZvciAoVmVjdG9yPEVuY2hh
bnREaWN0Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBtX2VuY2hhbnREaWN0cy5iZWdpbigpOyBp
dGVyICE9IG1fZW5jaGFudERpY3RzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGVuY2hhbnRfZGlj
dF9hZGRfdG9fc2Vzc2lvbigqaXRlciwgd29yZCwgLTEpOworfQorCit2b2lkIFRleHRDaGVja2Vy
RW5jaGFudDo6bGVhcm5Xb3JkKGNvbnN0IGNoYXIqIHdvcmQpCit7CisgICAgZm9yIChWZWN0b3I8
RW5jaGFudERpY3QqPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG1fZW5jaGFudERpY3RzLmJlZ2lu
KCk7IGl0ZXIgIT0gbV9lbmNoYW50RGljdHMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgZW5jaGFu
dF9kaWN0X2FkZF90b19wZXJzb25hbCgqaXRlciwgd29yZCwgLTEpOworfQorCit2b2lkIFRleHRD
aGVja2VyRW5jaGFudDo6Y2hlY2tTcGVsbGluZ09mU3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZywg
aW50KiBtaXNzcGVsbGluZ0xvY2F0aW9uLCBpbnQqIG1pc3NwZWxsaW5nTGVuZ3RoKQoreworICAg
IGlmIChtX2VuY2hhbnREaWN0cy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKyAgICBWZWN0
b3I8RW5jaGFudERpY3QqPjo6Y29uc3RfaXRlcmF0b3IgZGljdEl0ZXIgPSBtX2VuY2hhbnREaWN0
cy5iZWdpbigpOworCisgICAgc2l6ZV90IGxlbmd0aCA9IGdfdXRmOF9zdHJsZW4oc3RyaW5nLCAt
MSk7CisKKyAgICBQYW5nb0xhbmd1YWdlKiBsYW5ndWFnZShwYW5nb19sYW5ndWFnZV9nZXRfZGVm
YXVsdCgpKTsKKyAgICBHT3duUHRyPFBhbmdvTG9nQXR0cj4gYXR0cnMoZ19uZXcoUGFuZ29Mb2dB
dHRyLCBsZW5ndGggKyAxKSk7CisKKyAgICAvLyBwYW5nb19nZXRfbG9nX2F0dHJzIHVzZXMgYW4g
YWRpdGlvbmFsIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCisgICAgcGFuZ29fZ2V0
X2xvZ19hdHRycyhzdHJpbmcsIC0xLCAtMSwgbGFuZ3VhZ2UsIGF0dHJzLmdldCgpLCBsZW5ndGgg
KyAxKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoICsgMTsgaSsrKSB7Cisg
ICAgICAgIC8vIFdlIGdvIHRocm91Z2ggZWFjaCBjaGFyYWN0ZXIgdW50aWwgd2UgZmluZCBhbiBp
c193b3JkX3N0YXJ0LAorICAgICAgICAvLyB0aGVuIHdlIGdldCBpbnRvIGFuIGlubmVyIGxvb3Ag
dG8gZmluZCB0aGUgaXNfd29yZF9lbmQgY29ycmVzcG9uZGluZworICAgICAgICAvLyB0byBpdC4K
KyAgICAgICAgaWYgKGF0dHJzLmdldCgpW2ldLmlzX3dvcmRfc3RhcnQpIHsKKyAgICAgICAgICAg
IGludCBzdGFydCA9IGk7CisgICAgICAgICAgICBpbnQgZW5kID0gaTsKKyAgICAgICAgICAgIGlu
dCB3b3JkTGVuZ3RoOworCisgICAgICAgICAgICB3aGlsZSAoYXR0cnMuZ2V0KClbZW5kXS5pc193
b3JkX2VuZCA8IDEpCisgICAgICAgICAgICAgICAgZW5kKys7CisKKyAgICAgICAgICAgIHdvcmRM
ZW5ndGggPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgaXRlcmF0b3IgdG8g
YmUgYXQgdGhlIGN1cnJlbnQgd29yZCBlbmQsIHNvIHdlIGRvbid0CisgICAgICAgICAgICAvLyBj
aGVjayBjaGFyYWN0ZXJzIHR3aWNlLgorICAgICAgICAgICAgaSA9IGVuZDsKKworICAgICAgICAg
ICAgZ2NoYXIqIGNzdGFydCA9IGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIHN0YXJ0
KTsKKyAgICAgICAgICAgIGdpbnQgYnl0ZXMgPSBzdGF0aWNfY2FzdDxnaW50PihnX3V0Zjhfb2Zm
c2V0X3RvX3BvaW50ZXIoc3RyaW5nLCBlbmQpIC0gY3N0YXJ0KTsKKyAgICAgICAgICAgIEdPd25Q
dHI8Z2NoYXI+IHdvcmQoZ19uZXcwKGdjaGFyLCBieXRlcyArIDEpKTsKKworICAgICAgICAgICAg
Z191dGY4X3N0cm5jcHkod29yZC5nZXQoKSwgY3N0YXJ0LCB3b3JkTGVuZ3RoKTsKKworICAgICAg
ICAgICAgZm9yICg7IGRpY3RJdGVyICE9IG1fZW5jaGFudERpY3RzLmVuZCgpOyArK2RpY3RJdGVy
KSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY2hhbnRfZGljdF9jaGVjaygqZGljdEl0ZXIsIHdv
cmQuZ2V0KCksIHdvcmRMZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgICptaXNzcGVsbGlu
Z0xvY2F0aW9uID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICptaXNzcGVsbGluZ0xlbmd0
aCA9IHdvcmRMZW5ndGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAg
ICAgICAgLy8gU3RvcCBjaGVja2luZywgdGhpcyB3b3JkIGlzIG9rIGluIGF0IGxlYXN0IG9uZSBk
aWN0LgorICAgICAgICAgICAgICAgICAgICAqbWlzc3BlbGxpbmdMb2NhdGlvbiA9IC0xOworICAg
ICAgICAgICAgICAgICAgICAqbWlzc3BlbGxpbmdMZW5ndGggPSAwOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9Cit9CisKK2NoYXIqKiBUZXh0Q2hlY2tlckVuY2hhbnQ6OmdldEd1ZXNzZXNGb3JXb3Jk
KGNvbnN0IGNoYXIqIHdvcmQpCit7CisgICAgaWYgKG1fZW5jaGFudERpY3RzLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjaGFyKiogZ3Vlc3NlcyA9IDA7CisgICAgZm9yIChW
ZWN0b3I8RW5jaGFudERpY3QqPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG1fZW5jaGFudERpY3Rz
LmJlZ2luKCk7IGl0ZXIgIT0gbV9lbmNoYW50RGljdHMuZW5kKCk7ICsraXRlcikgeworICAgICAg
ICBzaXplX3QgbnVtYmVyT2ZTdWdnZXN0aW9uczsKKyAgICAgICAgc2l6ZV90IGk7CisKKyAgICAg
ICAgZ2NoYXIqKiBzdWdnZXN0aW9ucyA9IGVuY2hhbnRfZGljdF9zdWdnZXN0KCppdGVyLCB3b3Jk
LCAtMSwgJm51bWJlck9mU3VnZ2VzdGlvbnMpOworICAgICAgICBpZiAobnVtYmVyT2ZTdWdnZXN0
aW9ucyA+IDApIHsKKyAgICAgICAgICAgIGlmIChudW1iZXJPZlN1Z2dlc3Rpb25zID4gMTApCisg
ICAgICAgICAgICAgICAgbnVtYmVyT2ZTdWdnZXN0aW9ucyA9IDEwOworCisgICAgICAgICAgICBn
dWVzc2VzID0gc3RhdGljX2Nhc3Q8Y2hhcioqPihnX21hbGxvYzAoKG51bWJlck9mU3VnZ2VzdGlv
bnMgKyAxKSAqIHNpemVvZihjaGFyKikpKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBu
dW1iZXJPZlN1Z2dlc3Rpb25zICYmIGkgPCAxMDsgaSsrKQorICAgICAgICAgICAgICAgIGd1ZXNz
ZXNbaV0gPSBnX3N0cmR1cChzdWdnZXN0aW9uc1tpXSk7CisgICAgICAgICAgICBndWVzc2VzW2ld
ID0gMDsKKworICAgICAgICAgICAgZW5jaGFudF9kaWN0X2ZyZWVfc3VnZ2VzdGlvbnMoKml0ZXIs
IHN1Z2dlc3Rpb25zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBndWVzc2VzOwor
fQorCit2b2lkIFRleHRDaGVja2VyRW5jaGFudDo6dXBkYXRlU3BlbGxDaGVja2luZ0xhbmd1YWdl
cyhjb25zdCBjaGFyKiBsYW5ndWFnZXMpCit7CisgICAgVmVjdG9yPEVuY2hhbnREaWN0Kj4gc3Bl
bGxEaWN0aW9uYXJpZXM7CisKKyAgICBpZiAobGFuZ3VhZ2VzKSB7CisgICAgICAgIGNoYXIqKiBs
YW5ncyA9IGdfc3Ryc3BsaXQobGFuZ3VhZ2VzLCAiLCIsIC0xKTsKKyAgICAgICAgZm9yIChpbnQg
aSA9IDA7IGxhbmdzW2ldOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbmNoYW50X2Jyb2tlcl9k
aWN0X2V4aXN0cyhtX2Jyb2tlciwgbGFuZ3NbaV0pKSB7CisgICAgICAgICAgICAgICAgRW5jaGFu
dERpY3QqIGRpY3QgPSBlbmNoYW50X2Jyb2tlcl9yZXF1ZXN0X2RpY3QobV9icm9rZXIsIGxhbmdz
W2ldKTsKKyAgICAgICAgICAgICAgICBzcGVsbERpY3Rpb25hcmllcy5hcHBlbmQoZGljdCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ19zdHJmcmVldihsYW5ncyk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhciogbGFuZ3VhZ2UgPSBwYW5nb19sYW5ndWFnZV90
b19zdHJpbmcocGFuZ29fbGFuZ3VhZ2VfZ2V0X2RlZmF1bHQoKSk7CisgICAgICAgIGlmIChlbmNo
YW50X2Jyb2tlcl9kaWN0X2V4aXN0cyhtX2Jyb2tlciwgbGFuZ3VhZ2UpKSB7CisgICAgICAgICAg
ICBFbmNoYW50RGljdCogZGljdCA9IGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfZGljdChtX2Jyb2tl
ciwgbGFuZ3VhZ2UpOworICAgICAgICAgICAgc3BlbGxEaWN0aW9uYXJpZXMuYXBwZW5kKGRpY3Qp
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm8gZGljdGlvbmFyaWVzIHNlbGVj
dGVkLCB3ZSBnZXQgb25lIGZyb20gdGhlIGxpc3QuCisgICAgICAgICAgICBWZWN0b3I8Q1N0cmlu
Zz4gYWxsRGljdGlvbmFyaWVzOworICAgICAgICAgICAgZW5jaGFudF9icm9rZXJfbGlzdF9kaWN0
cyhtX2Jyb2tlciwgZ2V0QXZhaWxhYmxlRGljdGlvbmFyaWVzQ2FsbGJhY2ssICZhbGxEaWN0aW9u
YXJpZXMpOworICAgICAgICAgICAgaWYgKCFhbGxEaWN0aW9uYXJpZXMuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBlbmNoYW50X2Jyb2tlcl9yZXF1ZXN0
X2RpY3QobV9icm9rZXIsIGFsbERpY3Rpb25hcmllc1swXS5kYXRhKCkpOworICAgICAgICAgICAg
ICAgIHNwZWxsRGljdGlvbmFyaWVzLmFwcGVuZChkaWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKyAgICBmcmVlRW5jaGFudEJyb2tlckRpY3RzKCk7CisgICAgbV9lbmNoYW50
RGljdHMgPSBzcGVsbERpY3Rpb25hcmllczsKK30KKwordm9pZCBUZXh0Q2hlY2tlckVuY2hhbnQ6
OmZyZWVFbmNoYW50QnJva2VyRGljdHMoKQoreworICAgIGZvciAoVmVjdG9yPEVuY2hhbnREaWN0
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBtX2VuY2hhbnREaWN0cy5iZWdpbigpOyBpdGVyICE9
IG1fZW5jaGFudERpY3RzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGVuY2hhbnRfYnJva2VyX2Zy
ZWVfZGljdChtX2Jyb2tlciwgKml0ZXIpOworfQorCisjZW5kaWYgLyogRU5BQkxFKFNQRUxMQ0hF
Q0spICovCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1Rl
eHRDaGVja2VyRW5jaGFudC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4
dENoZWNrZXJFbmNoYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcz
ZWIzYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3Rr
L1RleHRDaGVja2VyRW5jaGFudC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTIgSWdhbGlhIFMuTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBUZXh0Q2hlY2tlckVuY2hhbnRfaAorI2RlZmlu
ZSBUZXh0Q2hlY2tlckVuY2hhbnRfaAorCisjaWYgRU5BQkxFKFNQRUxMQ0hFQ0spCisKKyNpbmNs
dWRlIDxlbmNoYW50Lmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3
dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYv
dGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBUZXh0Q2hl
Y2tlckVuY2hhbnQgOiBwdWJsaWMgUmVmQ291bnRlZDxUZXh0Q2hlY2tlckVuY2hhbnQ+IHsKK3B1
YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxUZXh0Q2hlY2tlckVuY2hhbnQ+IGNyZWF0ZSgp
IHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBUZXh0Q2hlY2tlckVuY2hhbnQpOyB9CisgICAgflRleHRD
aGVja2VyRW5jaGFudCgpOworCisgICAgdm9pZCBpZ25vcmVXb3JkKGNvbnN0IGNoYXIqKTsKKyAg
ICB2b2lkIGxlYXJuV29yZChjb25zdCBjaGFyKik7CisgICAgdm9pZCBjaGVja1NwZWxsaW5nT2ZT
dHJpbmcoY29uc3QgY2hhciosIGludCogbWlzc3BlbGxpbmdMb2NhdGlvbiwgaW50KiBtaXNzcGVs
bGluZ0xlbmd0aCk7CisgICAgY2hhcioqIGdldEd1ZXNzZXNGb3JXb3JkKGNvbnN0IGNoYXIqKTsK
KyAgICB2b2lkIHVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMoY29uc3QgY2hhciogbGFuZ3Vh
Z2VzKTsKKworcHJpdmF0ZToKKyAgICBUZXh0Q2hlY2tlckVuY2hhbnQoKTsKKyAgICB2b2lkIGZy
ZWVFbmNoYW50QnJva2VyRGljdHMoKTsKKworICAgIEVuY2hhbnRCcm9rZXIqIG1fYnJva2VyOwor
ICAgIFZlY3RvcjxFbmNoYW50RGljdCo+IG1fZW5jaGFudERpY3RzOworfTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLyogRU5BQkxFKFNQRUxMQ0hFQ0spICovCisKKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ndGsvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktp
dC9ndGsvQ2hhbmdlTG9nCmluZGV4IDgwMzU3MjMuLjliZGU0NzIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvZ3RrL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cK
QEAgLTEsMyArMSwyNCBAQAorMjAxMi0wNi0yOSAgTWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5j
aGV6QGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS10gQWRkIGEgbmV3IGFuZCByZXVzYWJsZSBl
bmNoYW50LWJhc2VkIHNwZWxsY2hlY2tlciBpbiBXZWJDb3JlCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05MDI2OQorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFJlbW92ZSBlbmNoYW50IHNwZWNpZmljIGNvZGUg
ZnJvbSBXZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50IGFuZAorICAgICAgICBpbXBsZW1lbnQgaXQg
cmVseWluZyBpbiB0aGUgbmV3IFRleHRDaGVja2VyRW5jaGFudCBjbGFzcyBpbiBXZWJDb3JlLgor
CisgICAgICAgICogd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3BwOgorICAgICAg
ICAoX1dlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKToKKyAgICAgICAgKHdlYmtpdF9z
cGVsbF9jaGVja2VyX2VuY2hhbnRfZmluYWxpemUpOgorICAgICAgICAod2Via2l0X3NwZWxsX2No
ZWNrZXJfZW5jaGFudF9jbGFzc19pbml0KToKKyAgICAgICAgKHdlYmtpdF9zcGVsbF9jaGVja2Vy
X2VuY2hhbnRfaW5pdCk6CisgICAgICAgIChjaGVja1NwZWxsaW5nT2ZTdHJpbmcpOgorICAgICAg
ICAoZ2V0R3Vlc3Nlc0ZvcldvcmQpOgorICAgICAgICAodXBkYXRlU3BlbGxDaGVja2luZ0xhbmd1
YWdlcyk6CisgICAgICAgIChsZWFybldvcmQpOgorICAgICAgICAoaWdub3JlV29yZCk6CisKIDIw
MTItMDYtMjcgIFphbiBEb2JlcnNlayAgPHphbmRvYmVyc2VrQGdtYWlsLmNvbT4KIAogICAgICAg
ICBbR3RrXSBBZGQgc3VwcG9ydCBmb3IgdGhlIEdhbWVwYWQgQVBJCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0c3BlbGxjaGVja2VyZW5jaGFudC5jcHAgYi9Tb3Vy
Y2UvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0c3BlbGxjaGVja2VyZW5jaGFudC5jcHAKaW5kZXgg
ZjUxYTEyZi4uMWZhMzRiNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9ndGsvd2Via2l0L3dl
YmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvZ3RrL3dlYmtp
dC93ZWJraXRzcGVsbGNoZWNrZXJlbmNoYW50LmNwcApAQCAtMjEsMTIgKzIxLDE0IEBACiAKICNp
ZiBFTkFCTEUoU1BFTExDSEVDSykKIAorI2luY2x1ZGUgIlRleHRDaGVja2VyRW5jaGFudC5oIgog
I2luY2x1ZGUgIndlYmtpdHNwZWxsY2hlY2tlci5oIgotI2luY2x1ZGUgPGVuY2hhbnQuaD4KICNp
bmNsdWRlIDxndGsvZ3RrLmg+CiAjaW5jbHVkZSA8d3RmL2dvYmplY3QvR093blB0ci5oPgogI2lu
Y2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisK
IC8qKgogICogU0VDVElPTjp3ZWJraXRzcGVsbGNoZWNrZXJlbmNoYW50CiAgKiBAc2hvcnRfZGVz
Y3JpcHRpb246IHRoZSBkZWZhdWx0IHNwZWxsIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIGZvciBX
ZWJLaXRHVEsrLgpAQCAtMzUsMTAgKzM3LDkgQEAKICAqIFdlYktpdEdUSysuIEl0IHVzZXMgdGhl
IEVuY2hhbnQgZGljdGlvbmFyaWVzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIHRvCiAgKiBjb3Jy
ZWN0IHNwZWxsaW5nLgogICovCi1zdGF0aWMgRW5jaGFudEJyb2tlciogYnJva2VyID0gMDsKIAog
c3RydWN0IF9XZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSB7Ci0gICAgR1NMaXN0KiBl
bmNoYW50RGljdHM7CisgICAgUmVmUHRyPFRleHRDaGVja2VyRW5jaGFudD4gdGV4dENoZWNrZXJF
bmNoYW50OwogfTsKIAogc3RhdGljIHZvaWQgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9z
cGVsbF9jaGVja2VyX2ludGVyZmFjZV9pbml0KFdlYktpdFNwZWxsQ2hlY2tlckludGVyZmFjZSog
aW50ZXJmYWNlKTsKQEAgLTQ3LDM1ICs0OCwxNiBAQCBHX0RFRklORV9UWVBFX1dJVEhfQ09ERShX
ZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50LCB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50LAog
ICAgICAgICAgICAgICAgICAgICAgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFKFdFQktJVF9UWVBF
X1NQRUxMX0NIRUNLRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9zcGVsbF9jaGVja2VyX2ludGVyZmFj
ZV9pbml0KSkKIAotc3RhdGljIHZvaWQgY3JlYXRlRW5jaGFudEJyb2tlcklmTmVlZGVkKCkKLXsK
LSAgICBpZiAoIWJyb2tlcikKLSAgICAgICAgYnJva2VyID0gZW5jaGFudF9icm9rZXJfaW5pdCgp
OwotfQotCi1zdGF0aWMgdm9pZCBmcmVlU3BlbGxDaGVja2luZ0xhbmd1YWdlKGdwb2ludGVyIGRh
dGEsIGdwb2ludGVyKQotewotICAgIGNyZWF0ZUVuY2hhbnRCcm9rZXJJZk5lZWRlZCgpOwotCi0g
ICAgZW5jaGFudF9icm9rZXJfZnJlZV9kaWN0KGJyb2tlciwgc3RhdGljX2Nhc3Q8RW5jaGFudERp
Y3QqPihkYXRhKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hh
bnRfZmluYWxpemUoR09iamVjdCogb2JqZWN0KQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVu
Y2hhbnRQcml2YXRlKiBwcml2ID0gV0VCS0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChvYmplY3Qp
LT5wcml2OwotCi0gICAgZ19zbGlzdF9mb3JlYWNoKHByaXYtPmVuY2hhbnREaWN0cywgZnJlZVNw
ZWxsQ2hlY2tpbmdMYW5ndWFnZSwgMCk7Ci0gICAgZ19zbGlzdF9mcmVlKHByaXYtPmVuY2hhbnRE
aWN0cyk7Ci0KLSAgICBXRUJLSVRfU1BFTExfQ0hFQ0tFUl9FTkNIQU5UKG9iamVjdCktPnByaXYt
Pn5XZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSgpOworICAgIHByaXYtPn5XZWJLaXRT
cGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSgpOwogfQogCiBzdGF0aWMgdm9pZCB3ZWJraXRfc3Bl
bGxfY2hlY2tlcl9lbmNoYW50X2NsYXNzX2luaXQoV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudENs
YXNzKiBrbGFzcykKIHsKICAgICBHT2JqZWN0Q2xhc3MqIG9iamVjdENsYXNzID0gR19PQkpFQ1Rf
Q0xBU1Moa2xhc3MpOwotCiAgICAgb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gd2Via2l0X3NwZWxs
X2NoZWNrZXJfZW5jaGFudF9maW5hbGl6ZTsKLQogICAgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0
ZShrbGFzcywgc2l6ZW9mKFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKSk7CiB9CiAK
QEAgLTg1LDEzNyArNjcsMjUgQEAgc3RhdGljIHZvaWQgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5j
aGFudF9pbml0KFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnQqIGNoZWNrZXIKICAgICBjaGVja2Vy
LT5wcml2ID0gcHJpdjsKICAgICBuZXcgKHByaXYpIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQ
cml2YXRlKCk7CiAKLSAgICBwcml2LT5lbmNoYW50RGljdHMgPSAwOworICAgIHByaXYtPnRleHRD
aGVja2VyRW5jaGFudCA9IFRleHRDaGVja2VyRW5jaGFudDo6Y3JlYXRlKCk7CiB9CiAKIHN0YXRp
YyB2b2lkIGNoZWNrU3BlbGxpbmdPZlN0cmluZyhXZWJLaXRTcGVsbENoZWNrZXIqIGNoZWNrZXIs
IGNvbnN0IGNoYXIqIHN0cmluZywgaW50KiBtaXNzcGVsbGluZ0xvY2F0aW9uLCBpbnQqIG1pc3Nw
ZWxsaW5nTGVuZ3RoKQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKiBw
cml2ID0gV0VCS0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChjaGVja2VyKS0+cHJpdjsKLQotICAg
IEdTTGlzdCogZGljdHMgPSBwcml2LT5lbmNoYW50RGljdHM7Ci0gICAgaWYgKCFkaWN0cykKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgaW50IGxlbmd0aCA9IGdfdXRmOF9zdHJsZW4oc3RyaW5nLCAt
MSk7Ci0KLSAgICBQYW5nb0xhbmd1YWdlKiBsYW5ndWFnZShwYW5nb19sYW5ndWFnZV9nZXRfZGVm
YXVsdCgpKTsKLSAgICBHT3duUHRyPFBhbmdvTG9nQXR0cj4gYXR0cnMoZ19uZXcoUGFuZ29Mb2dB
dHRyLCBsZW5ndGggKyAxKSk7Ci0KLSAgICAvLyBwYW5nb19nZXRfbG9nX2F0dHJzIHVzZXMgYW4g
YWRpdGlvbmFsIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCi0gICAgcGFuZ29fZ2V0
X2xvZ19hdHRycyhzdHJpbmcsIC0xLCAtMSwgbGFuZ3VhZ2UsIGF0dHJzLmdldCgpLCBsZW5ndGgg
KyAxKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoICsgMTsgaSsrKSB7Ci0gICAg
ICAgIC8vIFdlIGdvIHRocm91Z2ggZWFjaCBjaGFyYWN0ZXIgdW50aWwgd2UgZmluZCBhbiBpc193
b3JkX3N0YXJ0LAotICAgICAgICAvLyB0aGVuIHdlIGdldCBpbnRvIGFuIGlubmVyIGxvb3AgdG8g
ZmluZCB0aGUgaXNfd29yZF9lbmQgY29ycmVzcG9uZGluZwotICAgICAgICAvLyB0byBpdC4KLSAg
ICAgICAgaWYgKGF0dHJzLmdldCgpW2ldLmlzX3dvcmRfc3RhcnQpIHsKLSAgICAgICAgICAgIGlu
dCBzdGFydCA9IGk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gaTsKLSAgICAgICAgICAgIGludCB3
b3JkTGVuZ3RoOwotCi0gICAgICAgICAgICB3aGlsZSAoYXR0cnMuZ2V0KClbZW5kXS5pc193b3Jk
X2VuZCA8IDEpCi0gICAgICAgICAgICAgICAgZW5kKys7Ci0KLSAgICAgICAgICAgIHdvcmRMZW5n
dGggPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIC8vIFNldCB0aGUgaXRlcmF0b3IgdG8gYmUg
YXQgdGhlIGN1cnJlbnQgd29yZCBlbmQsIHNvIHdlIGRvbid0Ci0gICAgICAgICAgICAvLyBjaGVj
ayBjaGFyYWN0ZXJzIHR3aWNlLgotICAgICAgICAgICAgaSA9IGVuZDsKLQotICAgICAgICAgICAg
Z2NoYXIqIGNzdGFydCA9IGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIHN0YXJ0KTsK
LSAgICAgICAgICAgIGdpbnQgYnl0ZXMgPSBzdGF0aWNfY2FzdDxnaW50PihnX3V0Zjhfb2Zmc2V0
X3RvX3BvaW50ZXIoc3RyaW5nLCBlbmQpIC0gY3N0YXJ0KTsKLSAgICAgICAgICAgIEdPd25QdHI8
Z2NoYXI+IHdvcmQoZ19uZXcwKGdjaGFyLCBieXRlcyArIDEpKTsKLQotICAgICAgICAgICAgZ191
dGY4X3N0cm5jcHkod29yZC5nZXQoKSwgY3N0YXJ0LCB3b3JkTGVuZ3RoKTsKLQotICAgICAgICAg
ICAgZm9yICg7IGRpY3RzOyBkaWN0cyA9IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAg
RW5jaGFudERpY3QqIGRpY3QgPSBzdGF0aWNfY2FzdDxFbmNoYW50RGljdCo+KGRpY3RzLT5kYXRh
KTsKLSAgICAgICAgICAgICAgICBpZiAoZW5jaGFudF9kaWN0X2NoZWNrKGRpY3QsIHdvcmQuZ2V0
KCksIHdvcmRMZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICptaXNzcGVsbGluZ0xvY2F0
aW9uID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICptaXNzcGVsbGluZ0xlbmd0aCA9IHdv
cmRMZW5ndGg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAg
Ly8gU3RvcCBjaGVja2luZywgdGhpcyB3b3JkIGlzIG9rIGluIGF0IGxlYXN0IG9uZSBkaWN0Lgot
ICAgICAgICAgICAgICAgICAgICAqbWlzc3BlbGxpbmdMb2NhdGlvbiA9IC0xOwotICAgICAgICAg
ICAgICAgICAgICAqbWlzc3BlbGxpbmdMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9
CisgICAgcHJpdi0+dGV4dENoZWNrZXJFbmNoYW50LT5jaGVja1NwZWxsaW5nT2ZTdHJpbmcoc3Ry
aW5nLCBtaXNzcGVsbGluZ0xvY2F0aW9uLCBtaXNzcGVsbGluZ0xlbmd0aCk7CiB9CiAKIHN0YXRp
YyBjaGFyKiogZ2V0R3Vlc3Nlc0ZvcldvcmQoV2ViS2l0U3BlbGxDaGVja2VyKiBjaGVja2VyLCBj
b25zdCBjaGFyKiB3b3JkLCBjb25zdCBjaGFyKiBjb250ZXh0KQogewogICAgIFdlYktpdFNwZWxs
Q2hlY2tlckVuY2hhbnRQcml2YXRlKiBwcml2ID0gV0VCS0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFO
VChjaGVja2VyKS0+cHJpdjsKLQotICAgIEdTTGlzdCogZGljdHMgPSBwcml2LT5lbmNoYW50RGlj
dHM7Ci0gICAgY2hhcioqIGd1ZXNzZXMgPSAwOwotCi0gICAgZm9yICg7IGRpY3RzOyBkaWN0cyA9
IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgIHNpemVfdCBudW1iZXJPZlN1Z2dlc3Rpb25zOwotICAg
ICAgICBzaXplX3QgaTsKLQotICAgICAgICBFbmNoYW50RGljdCogZGljdCA9IHN0YXRpY19jYXN0
PEVuY2hhbnREaWN0Kj4oZGljdHMtPmRhdGEpOwotICAgICAgICBnY2hhcioqIHN1Z2dlc3Rpb25z
ID0gZW5jaGFudF9kaWN0X3N1Z2dlc3QoZGljdCwgd29yZCwgLTEsICZudW1iZXJPZlN1Z2dlc3Rp
b25zKTsKLQotICAgICAgICBpZiAobnVtYmVyT2ZTdWdnZXN0aW9ucyA+IDApIHsKLSAgICAgICAg
ICAgIGlmIChudW1iZXJPZlN1Z2dlc3Rpb25zID4gMTApCi0gICAgICAgICAgICAgICAgbnVtYmVy
T2ZTdWdnZXN0aW9ucyA9IDEwOwotCi0gICAgICAgICAgICBndWVzc2VzID0gc3RhdGljX2Nhc3Q8
Y2hhcioqPihnX21hbGxvYzAoKG51bWJlck9mU3VnZ2VzdGlvbnMgKyAxKSAqIHNpemVvZihjaGFy
KikpKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJPZlN1Z2dlc3Rpb25zICYm
IGkgPCAxMDsgaSsrKQotICAgICAgICAgICAgICAgIGd1ZXNzZXNbaV0gPSBnX3N0cmR1cChzdWdn
ZXN0aW9uc1tpXSk7Ci0KLSAgICAgICAgICAgIGd1ZXNzZXNbaV0gPSAwOwotCi0gICAgICAgICAg
ICBlbmNoYW50X2RpY3RfZnJlZV9zdWdnZXN0aW9ucyhkaWN0LCBzdWdnZXN0aW9ucyk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZ3Vlc3NlczsKLX0KLQotc3RhdGljIHZvaWQgZ2V0
QXZhaWxhYmxlRGljdGlvbmFyaWVzQ2FsbGJhY2soY29uc3QgY2hhciogY29uc3QgbGFuZ3VhZ2VU
YWcsIGNvbnN0IGNoYXIqIGNvbnN0LCBjb25zdCBjaGFyKiBjb25zdCwgY29uc3QgY2hhciogY29u
c3QsIHZvaWQqIGRhdGEpCi17Ci0gICAgVmVjdG9yPENTdHJpbmc+KiBkaWN0cyA9IHN0YXRpY19j
YXN0PFZlY3RvcjxDU3RyaW5nPio+KGRhdGEpOwotCi0gICAgZGljdHMtPmFwcGVuZChsYW5ndWFn
ZVRhZyk7CisgICAgcmV0dXJuIHByaXYtPnRleHRDaGVja2VyRW5jaGFudC0+Z2V0R3Vlc3Nlc0Zv
cldvcmQod29yZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFn
ZXMoV2ViS2l0U3BlbGxDaGVja2VyKiBjaGVja2VyLCBjb25zdCBjaGFyKiBsYW5ndWFnZXMpCiB7
Ci0gICAgR1NMaXN0KiBzcGVsbERpY3Rpb25hcmllcyA9IDA7Ci0KICAgICBXZWJLaXRTcGVsbENo
ZWNrZXJFbmNoYW50UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VOQ0hBTlQo
Y2hlY2tlciktPnByaXY7Ci0KLSAgICBjcmVhdGVFbmNoYW50QnJva2VySWZOZWVkZWQoKTsKLQot
ICAgIGlmIChsYW5ndWFnZXMpIHsKLSAgICAgICAgY2hhcioqIGxhbmdzID0gZ19zdHJzcGxpdChs
YW5ndWFnZXMsICIsIiwgLTEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgbGFuZ3NbaV07IGkr
KykgewotICAgICAgICAgICAgaWYgKGVuY2hhbnRfYnJva2VyX2RpY3RfZXhpc3RzKGJyb2tlciwg
bGFuZ3NbaV0pKSB7Ci0gICAgICAgICAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBlbmNoYW50
X2Jyb2tlcl9yZXF1ZXN0X2RpY3QoYnJva2VyLCBsYW5nc1tpXSk7Ci0gICAgICAgICAgICAgICAg
c3BlbGxEaWN0aW9uYXJpZXMgPSBnX3NsaXN0X2FwcGVuZChzcGVsbERpY3Rpb25hcmllcywgZGlj
dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ19zdHJmcmVldihsYW5ncyk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgY2hhciogbGFuZ3VhZ2UgPSBwYW5nb19sYW5n
dWFnZV90b19zdHJpbmcoZ3RrX2dldF9kZWZhdWx0X2xhbmd1YWdlKCkpOwotICAgICAgICBpZiAo
ZW5jaGFudF9icm9rZXJfZGljdF9leGlzdHMoYnJva2VyLCBsYW5ndWFnZSkpIHsKLSAgICAgICAg
ICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0KGJyb2tl
ciwgbGFuZ3VhZ2UpOwotICAgICAgICAgICAgc3BlbGxEaWN0aW9uYXJpZXMgPSBnX3NsaXN0X2Fw
cGVuZChzcGVsbERpY3Rpb25hcmllcywgZGljdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAvLyBObyBkaWN0aW9uYXJpZXMgc2VsZWN0ZWQsIHdlIGdldCBvbmUgZnJvbSB0aGUgbGlz
dC4KLSAgICAgICAgICAgIFZlY3RvcjxDU3RyaW5nPiBhbGxEaWN0aW9uYXJpZXM7Ci0gICAgICAg
ICAgICBlbmNoYW50X2Jyb2tlcl9saXN0X2RpY3RzKGJyb2tlciwgZ2V0QXZhaWxhYmxlRGljdGlv
bmFyaWVzQ2FsbGJhY2ssICZhbGxEaWN0aW9uYXJpZXMpOwotICAgICAgICAgICAgaWYgKCFhbGxE
aWN0aW9uYXJpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgRW5jaGFudERpY3QqIGRp
Y3QgPSBlbmNoYW50X2Jyb2tlcl9yZXF1ZXN0X2RpY3QoYnJva2VyLCBhbGxEaWN0aW9uYXJpZXNb
MF0uZGF0YSgpKTsKLSAgICAgICAgICAgICAgICBzcGVsbERpY3Rpb25hcmllcyA9IGdfc2xpc3Rf
YXBwZW5kKHNwZWxsRGljdGlvbmFyaWVzLCBkaWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLSAgICBnX3NsaXN0X2ZvcmVhY2gocHJpdi0+ZW5jaGFudERpY3RzLCBmcmVlU3Bl
bGxDaGVja2luZ0xhbmd1YWdlLCAwKTsKLSAgICBnX3NsaXN0X2ZyZWUocHJpdi0+ZW5jaGFudERp
Y3RzKTsKLSAgICBwcml2LT5lbmNoYW50RGljdHMgPSBzcGVsbERpY3Rpb25hcmllczsKKyAgICBw
cml2LT50ZXh0Q2hlY2tlckVuY2hhbnQtPnVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMobGFu
Z3VhZ2VzKTsKIH0KIAogc3RhdGljIGNoYXIqIGdldEF1dG9jb3JyZWN0U3VnZ2VzdGlvbnNGb3JN
aXNzcGVsbGVkV29yZChXZWJLaXRTcGVsbENoZWNrZXIqIGNoZWNrZXIsIGNvbnN0IGNoYXIqIHdv
cmQpCkBAIC0yMjYsMjUgKzk2LDEzIEBAIHN0YXRpYyBjaGFyKiBnZXRBdXRvY29ycmVjdFN1Z2dl
c3Rpb25zRm9yTWlzc3BlbGxlZFdvcmQoV2ViS2l0U3BlbGxDaGVja2VyKiBjaGVjCiBzdGF0aWMg
dm9pZCBsZWFybldvcmQoV2ViS2l0U3BlbGxDaGVja2VyKiBjaGVja2VyLCBjb25zdCBjaGFyKiB3
b3JkKQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKiBwcml2ID0gV0VC
S0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChjaGVja2VyKS0+cHJpdjsKLSAgICBHU0xpc3QqIGRp
Y3RzID0gcHJpdi0+ZW5jaGFudERpY3RzOwotCi0gICAgZm9yICg7IGRpY3RzOyBkaWN0cyA9IGRp
Y3RzLT5uZXh0KSB7Ci0gICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gc3RhdGljX2Nhc3Q8RW5j
aGFudERpY3QqPihkaWN0cy0+ZGF0YSk7Ci0KLSAgICAgICAgZW5jaGFudF9kaWN0X2FkZF90b19w
ZXJzb25hbChkaWN0LCB3b3JkLCAtMSk7Ci0gICAgfQorICAgIHByaXYtPnRleHRDaGVja2VyRW5j
aGFudC0+bGVhcm5Xb3JkKHdvcmQpOwogfQogCiBzdGF0aWMgdm9pZCBpZ25vcmVXb3JkKFdlYktp
dFNwZWxsQ2hlY2tlciogY2hlY2tlciwgY29uc3QgY2hhciogd29yZCkKIHsKICAgICBXZWJLaXRT
cGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VO
Q0hBTlQoY2hlY2tlciktPnByaXY7Ci0gICAgR1NMaXN0KiBkaWN0cyA9IHByaXYtPmVuY2hhbnRE
aWN0czsKLQotICAgIGZvciAoOyBkaWN0czsgZGljdHMgPSBkaWN0cy0+bmV4dCkgewotICAgICAg
ICBFbmNoYW50RGljdCogZGljdCA9IHN0YXRpY19jYXN0PEVuY2hhbnREaWN0Kj4oZGljdHMtPmRh
dGEpOwotCi0gICAgICAgIGVuY2hhbnRfZGljdF9hZGRfdG9fc2Vzc2lvbihkaWN0LCB3b3JkLCAt
MSk7Ci0gICAgfQorICAgIHByaXYtPnRleHRDaGVja2VyRW5jaGFudC0+aWdub3JlV29yZCh3b3Jk
KTsKIH0KIAogc3RhdGljIHZvaWQgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9zcGVsbF9j
aGVja2VyX2ludGVyZmFjZV9pbml0KFdlYktpdFNwZWxsQ2hlY2tlckludGVyZmFjZSogaW50ZXJm
YWNlKQotLSAKMS43LjEwLjIKCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>153034</attachid>
            <date>2012-07-18 10:12:14 -0700</date>
            <delta_ts>2012-07-20 08:47:41 -0700</delta_ts>
            <desc>Patch proposal</desc>
            <filename>bug-90269-20120718191213.patch</filename>
            <type>text/plain</type>
            <size>24457</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTIyOTY3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZTFlOWM5OGQ5OGNkZGJi
MjM5MDAwMTk2NGMyNDRlZDM3NWM1MjZkYi4uYTRjZjVmNDBjZDJlNmVjNjUxYmJmOTJhNGMwMWI1
YmI3YzQ1ZDNjYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDMwIEBACisyMDEyLTA3LTE4ICBNYXJp
byBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBB
ZGQgYSBuZXcgYW5kIHJldXNhYmxlIGVuY2hhbnQtYmFzZWQgc3BlbGxjaGVja2VyIGluIFdlYkNv
cmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkwMjY5
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTW92ZSBl
bmNoYW50IHNwZWNpZmljIGNvZGUgZG93biB0byBXZWJDb3JlLCBpbnRvIGEgbmV3IGNsYXNzCisg
ICAgICAgIFRleHRDaGVja2VyRW5jaGFudCwgdGhhdCB3ZSBjYW4gdXNlIGZyb20gV0sxIGFuZCBX
SzIuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogQWRkIGZsYWdzIHRvIGhhbmRsZSB0aGUg
U1BFTExDSEVDSyBmZWF0dXJlLgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3QuYW06IEFkZGVk
IG5ldyBmaWxlcy4KKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hh
bnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKGdldEF2YWlsYWJsZURpY3Rpb25hcmllc0NhbGxiYWNr
KToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6VGV4dENoZWNrZXJFbmNoYW50KToKKyAg
ICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6flRleHRDaGVja2VyRW5jaGFudCk6CisgICAgICAg
IChUZXh0Q2hlY2tlckVuY2hhbnQ6Omlnbm9yZVdvcmQpOgorICAgICAgICAoVGV4dENoZWNrZXJF
bmNoYW50OjpsZWFybldvcmQpOgorICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50OjpjaGVja1Nw
ZWxsaW5nT2ZTdHJpbmcpOgorICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50OjpnZXRHdWVzc2Vz
Rm9yV29yZCk6CisgICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OnVwZGF0ZVNwZWxsQ2hlY2tp
bmdMYW5ndWFnZXMpOgorICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50OjpmcmVlRW5jaGFudEJy
b2tlckRpY3RzKToKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hh
bnQuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5j
aGFudCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0Q2hlY2tlckVuY2hhbnQ6OmNyZWF0ZSk6CisK
IDIwMTItMDctMTggIFNlcmdleSBSb2d1bGVua28gIDxyb2d1bGVua29AZ29vZ2xlLmNvbT4KIAog
ICAgICAgICBXZWIgSW5zcGVjdG9yOiBhZGRpbmcgcGF1c2UgaWNvbiBmb3IgSmF2YVNjcmlwdCBk
ZWJ1Z2dpbmcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvZ3RrL0NoYW5nZUxvZyBiL1NvdXJj
ZS9XZWJLaXQvZ3RrL0NoYW5nZUxvZwppbmRleCBiZTU0ODVkNTY1ZDc2YzZlMzg5NmU2NWQ3YjE0
ZjI0ZjA0YjIxMDdjLi44NTg3ZWE2NWY4N2ZiYzRiNzE5ZTkzNTI3NWQ0MDY2OTNiYmUzZWU3IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktp
dC9ndGsvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjQgQEAKKzIwMTItMDctMTggIE1hcmlvIFNhbmNo
ZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdIEFkZCBhIG5l
dyBhbmQgcmV1c2FibGUgZW5jaGFudC1iYXNlZCBzcGVsbGNoZWNrZXIgaW4gV2ViQ29yZQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTAyNjkKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBSZW1vdmUgZW5jaGFu
dCBzcGVjaWZpYyBjb2RlIGZyb20gV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudCBhbmQKKyAgICAg
ICAgaW1wbGVtZW50IGl0IHJlbHlpbmcgaW4gdGhlIG5ldyBUZXh0Q2hlY2tlckVuY2hhbnQgY2xh
c3MgaW4gV2ViQ29yZS4KKworICAgICAgICAqIHdlYmtpdC93ZWJraXRzcGVsbGNoZWNrZXJlbmNo
YW50LmNwcDoKKyAgICAgICAgKF9XZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSk6Cisg
ICAgICAgICh3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2ZpbmFsaXplKToKKyAgICAgICAg
KHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfY2xhc3NfaW5pdCk6CisgICAgICAgICh3ZWJr
aXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2luaXQpOgorICAgICAgICAoY2hlY2tTcGVsbGluZ09m
U3RyaW5nKToKKyAgICAgICAgKGdldEd1ZXNzZXNGb3JXb3JkKToKKyAgICAgICAgKHVwZGF0ZVNw
ZWxsQ2hlY2tpbmdMYW5ndWFnZXMpOgorICAgICAgICAobGVhcm5Xb3JkKToKKyAgICAgICAgKGln
bm9yZVdvcmQpOgorCiAyMDEyLTA3LTE3ICBWaXZlayBHYWxhdGFnZSAgPHZpdmVrZ2FsYXRhZ2VA
Z21haWwuY29tPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IHJlZmFjdG9yIEluc3BlY3RvckNv
bnRyb2xsZXI6OmNvbm5lY3RGcm9udGVuZCgpIHRvIGFjY2VwdCBJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSBiL1NvdXJj
ZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmluZGV4IGFhMTAyYzhjMTU3ZTkzZmI0ZWYxMzE0MzAw
OTA2N2VmOGJiNjViM2IuLjNmMWRhZDNkNzAxMjMwYmMxNDhlMmI1OGZjNjJlZGFhZDM4MDJhMzgg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC0xMTYsNyArMTE2LDggQEAgd2ViY29yZWd0a19jcHBm
bGFncyArPSBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3N0cmVhbWVyIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9ndGsgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0ayBcCi0JLUkk
KHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwCisJLUkkKHNyY2Rp
cikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwIFwKKwktSSQoc3JjZGlyKS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0awogCiAjIC0tLQogIyBGZWF0dXJlcyBlbmFi
bGVkIGJ5IGRlZmF1bHQgYXQgY29tcGlsYXRpb24gdGltZQpAQCAtNzM1LDYgKzczNiwxNCBAQCBG
RUFUVVJFX0RFRklORVMgKz0gRU5BQkxFX0xJTktfUFJFRkVUQ0g9MQogd2ViY29yZV9jcHBmbGFn
cyArPSAtREVOQUJMRV9MSU5LX1BSRUZFVENIPTEKIGVuZGlmICAjIEVORCBFTkFCTEVfTElOS19Q
UkVGRVRDSAogCisjIC0tLQorIyBTcGVsbCBjaGVjayBzdXBwb3J0CisjIC0tLQoraWYgRU5BQkxF
X1NQRUxMQ0hFQ0sKK0ZFQVRVUkVfREVGSU5FUyArPSBFTkFCTEVfU1BFTExDSEVDSz0xCit3ZWJj
b3JlX2NwcGZsYWdzICs9IC1ERU5BQkxFX1NQRUxMQ0hFQ0s9MQorZW5kaWYgICMgRU5EIEVOQUJM
RV9TUEVMTENIRUNLCisKIERlcml2ZWRTb3VyY2VzL1dlYkNvcmUvQ1NTUHJvcGVydHlOYW1lcy5j
cHA6IERlcml2ZWRTb3VyY2VzL1dlYkNvcmUvQ1NTUHJvcGVydHlOYW1lcy5oCiBEZXJpdmVkU291
cmNlcy9XZWJDb3JlL0NTU1Byb3BlcnR5TmFtZXMuaDogJChXRUJDT1JFX0NTU19QUk9QRVJUWV9O
QU1FUykgJChXZWJDb3JlKS9jc3MvbWFrZXByb3AucGwKIAkkKEFNX1ZfR0VOKQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbSBiL1NvdXJjZS9XZWJDb3JlL0dO
VW1ha2VmaWxlLmxpc3QuYW0KaW5kZXggM2ViOTQzOTkxZDdlZjM3YzJjMDk0YWEzNzI4MDAwNzcz
MmY5OTA0OC4uNGIzNzFlMjE2YzRhMmU2YjU2M2VkNmMxNjE2MmE1ZTg2NjM5NDdjMiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCkBAIC02MjY2LDMgKzYyNjYsMTEgQEAgZG9tX2JpbmRp
bmdfaWRscyArPSBcCiAKIGVuZGlmICAjIEVORCBFTkFCTEVfUVVPVEEKIAorIyAtLS0tCisjIFNw
ZWxsIGNoZWNrIHN1cHBvcnQKKyMgLS0tLQoraWYgRU5BQkxFX1NQRUxMQ0hFQ0sKK3dlYmNvcmVf
c291cmNlcyArPSBcCisJU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNr
ZXJFbmNoYW50LmggXAorCVNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVj
a2VyRW5jaGFudC5jcHAKK2VuZGlmICMgRU5EIEVOQUJMRV9TUEVMTENIRUNLCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNoYW50LmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi45NDQ4MzM2Y2ZmZWQ1Yjg5MzM2MTNlMWY2Njc0MWVhMzZiZTFjMTkwCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENo
ZWNrZXJFbmNoYW50LmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMp
IDIwMTIgSWdhbGlhIFMuTC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGlj
CisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUZXh0Q2hlY2tlckVuY2hhbnQuaCIKKworI2lmIEVO
QUJMRShTUEVMTENIRUNLKQorCisjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNpbmNsdWRlIDx3
dGYvZ29iamVjdC9HT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCit1
c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBtYXhpbXVtTnVt
YmVyT2ZTdWdnZXN0aW9ucyA9IDEwOworCitzdGF0aWMgdm9pZCBnZXRBdmFpbGFibGVEaWN0aW9u
YXJpZXNDYWxsYmFjayhjb25zdCBjaGFyKiBjb25zdCBsYW5ndWFnZVRhZywgY29uc3QgY2hhciog
Y29uc3QsIGNvbnN0IGNoYXIqIGNvbnN0LCBjb25zdCBjaGFyKiBjb25zdCwgdm9pZCogZGF0YSkK
K3sKKyAgICBWZWN0b3I8Q1N0cmluZz4qIGRpY3RzID0gc3RhdGljX2Nhc3Q8VmVjdG9yPENTdHJp
bmc+Kj4oZGF0YSk7CisgICAgZGljdHMtPmFwcGVuZChsYW5ndWFnZVRhZyk7Cit9CisKK3N0YXRp
YyBib29sIHdvcmRFbmRJc0FDb250cmFjdGlvbkFwb3N0cm9waGUoY29uc3QgY2hhciogc3RyaW5n
LCBsb25nIG9mZnNldCkKK3sKKyAgICBpZiAoZ191dGY4X2dldF9jaGFyKGdfdXRmOF9vZmZzZXRf
dG9fcG9pbnRlcihzdHJpbmcsIG9mZnNldCkpICE9IGdfdXRmOF9nZXRfY2hhcigiJyIpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGNoYXJhY3Rl
ciBpbiB0aGUgc3RyaW5nLCBpdCBjYW5ub3QgYmUgdGhlIGFwb3N0cm9waGUgcGFydCBvZiBhIGNv
bnRyYWN0aW9uLgorICAgIGlmIChvZmZzZXQgPT0gZ191dGY4X3N0cmxlbihzdHJpbmcsIC0xKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGdfdW5pY2hhcl9pc2FscGhhKGdf
dXRmOF9nZXRfY2hhcihnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoc3RyaW5nLCBvZmZzZXQgKyAx
KSkpOworfQorCitUZXh0Q2hlY2tlckVuY2hhbnQ6OlRleHRDaGVja2VyRW5jaGFudCgpCisgICAg
OiBtX2Jyb2tlcihlbmNoYW50X2Jyb2tlcl9pbml0KCkpCisgICAgLCBtX2VuY2hhbnREaWN0cygw
KQoreworfQorCitUZXh0Q2hlY2tlckVuY2hhbnQ6On5UZXh0Q2hlY2tlckVuY2hhbnQoKQorewor
ICAgIGlmIChtX2Jyb2tlcikKKyAgICAgICAgZW5jaGFudF9icm9rZXJfZnJlZShtX2Jyb2tlcik7
CisKKyAgICBmcmVlRW5jaGFudEJyb2tlckRpY3RzKCk7Cit9CisKK3ZvaWQgVGV4dENoZWNrZXJF
bmNoYW50OjppZ25vcmVXb3JkKGNvbnN0IFN0cmluZyYgd29yZCkKK3sKKyAgICBmb3IgKFZlY3Rv
cjxFbmNoYW50RGljdCo+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gbV9lbmNoYW50RGljdHMuYmVn
aW4oKTsgaXRlciAhPSBtX2VuY2hhbnREaWN0cy5lbmQoKTsgKytpdGVyKQorICAgICAgICBlbmNo
YW50X2RpY3RfYWRkX3RvX3Nlc3Npb24oKml0ZXIsIHdvcmQudXRmOCgpLmRhdGEoKSwgLTEpOwor
fQorCit2b2lkIFRleHRDaGVja2VyRW5jaGFudDo6bGVhcm5Xb3JkKGNvbnN0IFN0cmluZyYgd29y
ZCkKK3sKKyAgICBmb3IgKFZlY3RvcjxFbmNoYW50RGljdCo+Ojpjb25zdF9pdGVyYXRvciBpdGVy
ID0gbV9lbmNoYW50RGljdHMuYmVnaW4oKTsgaXRlciAhPSBtX2VuY2hhbnREaWN0cy5lbmQoKTsg
KytpdGVyKQorICAgICAgICBlbmNoYW50X2RpY3RfYWRkX3RvX3BlcnNvbmFsKCppdGVyLCB3b3Jk
LnV0ZjgoKS5kYXRhKCksIC0xKTsKK30KKwordm9pZCBUZXh0Q2hlY2tlckVuY2hhbnQ6OmNoZWNr
U3BlbGxpbmdPZlN0cmluZyhjb25zdCBTdHJpbmcmIHN0cmluZywgaW50JiBtaXNzcGVsbGluZ0xv
Y2F0aW9uLCBpbnQmIG1pc3NwZWxsaW5nTGVuZ3RoKQoreworICAgIGlmIChtX2VuY2hhbnREaWN0
cy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKyAgICBWZWN0b3I8RW5jaGFudERpY3QqPjo6
Y29uc3RfaXRlcmF0b3IgZGljdEl0ZXIgPSBtX2VuY2hhbnREaWN0cy5iZWdpbigpOworCisgICAg
R093blB0cjxnY2hhcj4gY1N0cmluZyhnX3N0cmR1cChzdHJpbmcudXRmOCgpLmRhdGEoKSkpOwor
ICAgIHNpemVfdCBsZW5ndGggPSBzdHJpbmcudXRmOCgpLmxlbmd0aCgpOworCisgICAgUGFuZ29M
YW5ndWFnZSogbGFuZ3VhZ2UocGFuZ29fbGFuZ3VhZ2VfZ2V0X2RlZmF1bHQoKSk7CisgICAgR093
blB0cjxQYW5nb0xvZ0F0dHI+IGF0dHJzKGdfbmV3KFBhbmdvTG9nQXR0ciwgbGVuZ3RoICsgMSkp
OworCisgICAgLy8gcGFuZ29fZ2V0X2xvZ19hdHRycyB1c2VzIGFuIGFkaXRpb25hbCBwb3NpdGlv
biBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgorICAgIHBhbmdvX2dldF9sb2dfYXR0cnMoY1N0cmlu
Zy5nZXQoKSwgLTEsIC0xLCBsYW5ndWFnZSwgYXR0cnMuZ2V0KCksIGxlbmd0aCArIDEpOworCisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGggKyAxOyBpKyspIHsKKyAgICAgICAgLy8g
V2UgZ28gdGhyb3VnaCBlYWNoIGNoYXJhY3RlciB1bnRpbCB3ZSBmaW5kIGFuIGlzX3dvcmRfc3Rh
cnQsCisgICAgICAgIC8vIHRoZW4gd2UgZ2V0IGludG8gYW4gaW5uZXIgbG9vcCB0byBmaW5kIHRo
ZSBpc193b3JkX2VuZCBjb3JyZXNwb25kaW5nCisgICAgICAgIC8vIHRvIGl0LgorICAgICAgICBp
ZiAoYXR0cnMuZ2V0KClbaV0uaXNfd29yZF9zdGFydCkgeworICAgICAgICAgICAgaW50IHN0YXJ0
ID0gaTsKKyAgICAgICAgICAgIGludCBlbmQgPSBpOworICAgICAgICAgICAgaW50IHdvcmRMZW5n
dGg7CisKKyAgICAgICAgICAgIHdoaWxlIChhdHRycy5nZXQoKVtlbmRdLmlzX3dvcmRfZW5kIDwg
MSAgfHwgd29yZEVuZElzQUNvbnRyYWN0aW9uQXBvc3Ryb3BoZShjU3RyaW5nLmdldCgpLCBlbmQp
KQorICAgICAgICAgICAgICAgIGVuZCsrOworCisgICAgICAgICAgICB3b3JkTGVuZ3RoID0gZW5k
IC0gc3RhcnQ7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGl0ZXJhdG9yIHRvIGJlIGF0IHRoZSBj
dXJyZW50IHdvcmQgZW5kLCBzbyB3ZSBkb24ndAorICAgICAgICAgICAgLy8gY2hlY2sgY2hhcmFj
dGVycyB0d2ljZS4KKyAgICAgICAgICAgIGkgPSBlbmQ7CisKKyAgICAgICAgICAgIGdjaGFyKiBj
c3RhcnQgPSBnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoY1N0cmluZy5nZXQoKSwgc3RhcnQpOwor
ICAgICAgICAgICAgZ2ludCBieXRlcyA9IHN0YXRpY19jYXN0PGdpbnQ+KGdfdXRmOF9vZmZzZXRf
dG9fcG9pbnRlcihjU3RyaW5nLmdldCgpLCBlbmQpIC0gY3N0YXJ0KTsKKyAgICAgICAgICAgIEdP
d25QdHI8Z2NoYXI+IHdvcmQoZ19uZXcwKGdjaGFyLCBieXRlcyArIDEpKTsKKworICAgICAgICAg
ICAgZ191dGY4X3N0cm5jcHkod29yZC5nZXQoKSwgY3N0YXJ0LCB3b3JkTGVuZ3RoKTsKKworICAg
ICAgICAgICAgZm9yICg7IGRpY3RJdGVyICE9IG1fZW5jaGFudERpY3RzLmVuZCgpOyArK2RpY3RJ
dGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY2hhbnRfZGljdF9jaGVjaygqZGljdEl0ZXIs
IHdvcmQuZ2V0KCksIHdvcmRMZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pc3NwZWxs
aW5nTG9jYXRpb24gPSBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbWlzc3BlbGxpbmdMZW5n
dGggPSB3b3JkTGVuZ3RoOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgICAgIC8vIFN0b3AgY2hlY2tpbmcsIHRoaXMgd29yZCBpcyBvayBpbiBhdCBsZWFzdCBvbmUg
ZGljdC4KKyAgICAgICAgICAgICAgICAgICAgbWlzc3BlbGxpbmdMb2NhdGlvbiA9IC0xOworICAg
ICAgICAgICAgICAgICAgICBtaXNzcGVsbGluZ0xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KK30KKworVmVjdG9yPFN0cmluZz4gVGV4dENoZWNrZXJFbmNoYW50OjpnZXRHdWVzc2Vz
Rm9yV29yZChjb25zdCBTdHJpbmcmIHdvcmQpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZ3Vlc3Nl
czsKKyAgICBpZiAobV9lbmNoYW50RGljdHMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZ3Vl
c3NlczsKKworICAgIGZvciAoVmVjdG9yPEVuY2hhbnREaWN0Kj46OmNvbnN0X2l0ZXJhdG9yIGl0
ZXIgPSBtX2VuY2hhbnREaWN0cy5iZWdpbigpOyBpdGVyICE9IG1fZW5jaGFudERpY3RzLmVuZCgp
OyArK2l0ZXIpIHsKKyAgICAgICAgc2l6ZV90IG51bWJlck9mU3VnZ2VzdGlvbnM7CisgICAgICAg
IHNpemVfdCBpOworCisgICAgICAgIGdjaGFyKiogc3VnZ2VzdGlvbnMgPSBlbmNoYW50X2RpY3Rf
c3VnZ2VzdCgqaXRlciwgd29yZC51dGY4KCkuZGF0YSgpLCAtMSwgJm51bWJlck9mU3VnZ2VzdGlv
bnMpOworICAgICAgICBpZiAobnVtYmVyT2ZTdWdnZXN0aW9ucyA8PSAwKQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgaWYgKG51bWJlck9mU3VnZ2VzdGlvbnMgPiBtYXhpbXVtTnVt
YmVyT2ZTdWdnZXN0aW9ucykKKyAgICAgICAgICAgIG51bWJlck9mU3VnZ2VzdGlvbnMgPSBtYXhp
bXVtTnVtYmVyT2ZTdWdnZXN0aW9uczsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVy
T2ZTdWdnZXN0aW9uczsgaSsrKQorICAgICAgICAgICAgZ3Vlc3Nlcy5hcHBlbmQoU3RyaW5nKHN1
Z2dlc3Rpb25zW2ldKSk7CisKKyAgICAgICAgZW5jaGFudF9kaWN0X2ZyZWVfc3VnZ2VzdGlvbnMo
Kml0ZXIsIHN1Z2dlc3Rpb25zKTsKKyAgICB9CisKKyAgICByZXR1cm4gZ3Vlc3NlczsKK30KKwor
dm9pZCBUZXh0Q2hlY2tlckVuY2hhbnQ6OnVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMoY29u
c3QgU3RyaW5nJiBsYW5ndWFnZXMpCit7CisgICAgVmVjdG9yPEVuY2hhbnREaWN0Kj4gc3BlbGxE
aWN0aW9uYXJpZXM7CisKKyAgICBpZiAoIWxhbmd1YWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAg
VmVjdG9yPFN0cmluZz4gbGFuZ3VhZ2VzVmVjdG9yOworICAgICAgICBsYW5ndWFnZXMuc3BsaXQo
c3RhdGljX2Nhc3Q8VUNoYXI+KCcsJyksIGxhbmd1YWdlc1ZlY3Rvcik7CisgICAgICAgIGZvciAo
VmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBsYW5ndWFnZXNWZWN0b3IuYmVn
aW4oKTsgaXRlciAhPSBsYW5ndWFnZXNWZWN0b3IuZW5kKCk7ICsraXRlcikgeworICAgICAgICAg
ICAgR093blB0cjxnY2hhcj4gY3VycmVudExhbmd1YWdlKGdfc3RyZHVwKGl0ZXItPnV0ZjgoKS5k
YXRhKCkpKTsKKyAgICAgICAgICAgIGlmIChlbmNoYW50X2Jyb2tlcl9kaWN0X2V4aXN0cyhtX2Jy
b2tlciwgY3VycmVudExhbmd1YWdlLmdldCgpKSkgeworICAgICAgICAgICAgICAgIEVuY2hhbnRE
aWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0KG1fYnJva2VyLCBjdXJyZW50
TGFuZ3VhZ2UuZ2V0KCkpOworICAgICAgICAgICAgICAgIHNwZWxsRGljdGlvbmFyaWVzLmFwcGVu
ZChkaWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAg
IGNvbnN0IGNoYXIqIGxhbmd1YWdlID0gcGFuZ29fbGFuZ3VhZ2VfdG9fc3RyaW5nKHBhbmdvX2xh
bmd1YWdlX2dldF9kZWZhdWx0KCkpOworICAgICAgICBpZiAoZW5jaGFudF9icm9rZXJfZGljdF9l
eGlzdHMobV9icm9rZXIsIGxhbmd1YWdlKSkgeworICAgICAgICAgICAgRW5jaGFudERpY3QqIGRp
Y3QgPSBlbmNoYW50X2Jyb2tlcl9yZXF1ZXN0X2RpY3QobV9icm9rZXIsIGxhbmd1YWdlKTsKKyAg
ICAgICAgICAgIHNwZWxsRGljdGlvbmFyaWVzLmFwcGVuZChkaWN0KTsKKyAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgIC8vIE5vIGRpY3Rpb25hcmllcyBzZWxlY3RlZCwgd2UgZ2V0IG9uZSBm
cm9tIHRoZSBsaXN0LgorICAgICAgICAgICAgVmVjdG9yPENTdHJpbmc+IGFsbERpY3Rpb25hcmll
czsKKyAgICAgICAgICAgIGVuY2hhbnRfYnJva2VyX2xpc3RfZGljdHMobV9icm9rZXIsIGdldEF2
YWlsYWJsZURpY3Rpb25hcmllc0NhbGxiYWNrLCAmYWxsRGljdGlvbmFyaWVzKTsKKyAgICAgICAg
ICAgIGlmICghYWxsRGljdGlvbmFyaWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEVu
Y2hhbnREaWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0KG1fYnJva2VyLCBh
bGxEaWN0aW9uYXJpZXNbMF0uZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBzcGVsbERpY3Rpb25h
cmllcy5hcHBlbmQoZGljdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAg
ZnJlZUVuY2hhbnRCcm9rZXJEaWN0cygpOworICAgIG1fZW5jaGFudERpY3RzID0gc3BlbGxEaWN0
aW9uYXJpZXM7Cit9CisKK3ZvaWQgVGV4dENoZWNrZXJFbmNoYW50OjpmcmVlRW5jaGFudEJyb2tl
ckRpY3RzKCkKK3sKKyAgICBmb3IgKFZlY3RvcjxFbmNoYW50RGljdCo+Ojpjb25zdF9pdGVyYXRv
ciBpdGVyID0gbV9lbmNoYW50RGljdHMuYmVnaW4oKTsgaXRlciAhPSBtX2VuY2hhbnREaWN0cy5l
bmQoKTsgKytpdGVyKQorICAgICAgICBlbmNoYW50X2Jyb2tlcl9mcmVlX2RpY3QobV9icm9rZXIs
ICppdGVyKTsKK30KKworI2VuZGlmIC8vIEVOQUJMRShTUEVMTENIRUNLKQorCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuaCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmExMjQzNGU4Nzg2MmFiYjgzNjA2YTI4NDlhNjE2MjM4NmEzZDZhNDMKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tl
ckVuY2hhbnQuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEln
YWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpZm5kZWYgVGV4dENoZWNrZXJFbmNoYW50X2gKKyNkZWZpbmUgVGV4dENoZWNr
ZXJFbmNoYW50X2gKKworI2lmIEVOQUJMRShTUEVMTENIRUNLKQorCisjaW5jbHVkZSA8ZW5jaGFu
dC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50
ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3Ry
aW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgVGV4dENoZWNrZXJFbmNoYW50
IDogcHVibGljIFJlZkNvdW50ZWQ8VGV4dENoZWNrZXJFbmNoYW50PiB7CitwdWJsaWM6CisgICAg
c3RhdGljIFBhc3NSZWZQdHI8VGV4dENoZWNrZXJFbmNoYW50PiBjcmVhdGUoKSB7IHJldHVybiBh
ZG9wdFJlZihuZXcgVGV4dENoZWNrZXJFbmNoYW50KTsgfQorICAgIH5UZXh0Q2hlY2tlckVuY2hh
bnQoKTsKKworICAgIHZvaWQgaWdub3JlV29yZChjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGxl
YXJuV29yZChjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGNoZWNrU3BlbGxpbmdPZlN0cmluZyhj
b25zdCBTdHJpbmcmLCBpbnQmIG1pc3NwZWxsaW5nTG9jYXRpb24sIGludCYgbWlzc3BlbGxpbmdM
ZW5ndGgpOworICAgIFZlY3RvcjxTdHJpbmc+IGdldEd1ZXNzZXNGb3JXb3JkKGNvbnN0IFN0cmlu
ZyYpOworICAgIHZvaWQgdXBkYXRlU3BlbGxDaGVja2luZ0xhbmd1YWdlcyhjb25zdCBTdHJpbmcm
IGxhbmd1YWdlcyk7CisKK3ByaXZhdGU6CisgICAgVGV4dENoZWNrZXJFbmNoYW50KCk7CisgICAg
dm9pZCBmcmVlRW5jaGFudEJyb2tlckRpY3RzKCk7CisKKyAgICBFbmNoYW50QnJva2VyKiBtX2Jy
b2tlcjsKKyAgICBWZWN0b3I8RW5jaGFudERpY3QqPiBtX2VuY2hhbnREaWN0czsKK307CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShTUEVMTENIRUNLKQorCisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRzcGVsbGNo
ZWNrZXJlbmNoYW50LmNwcCBiL1NvdXJjZS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRzcGVsbGNo
ZWNrZXJlbmNoYW50LmNwcAppbmRleCAwZWI0OTg2ZDFkOWJjMDk2ZDQzOWJhNWU5ZGExYmE2NGQ0
OGE4MGJmLi43OTk3Njk3MzUyMjE2ZDQ2Mzk5N2ZjY2VjYjAzODVmNzc3MjYzYmQ1IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0c3BlbGxjaGVja2VyZW5jaGFudC5j
cHAKKysrIGIvU291cmNlL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hh
bnQuY3BwCkBAIC0yMSwxMiArMjEsMTQgQEAKIAogI2lmIEVOQUJMRShTUEVMTENIRUNLKQogCisj
aW5jbHVkZSAiVGV4dENoZWNrZXJFbmNoYW50LmgiCiAjaW5jbHVkZSAid2Via2l0c3BlbGxjaGVj
a2VyLmgiCi0jaW5jbHVkZSA8ZW5jaGFudC5oPgogI2luY2x1ZGUgPGd0ay9ndGsuaD4KICNpbmNs
dWRlIDx3dGYvZ29iamVjdC9HT3duUHRyLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5o
PgogCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKwogLyoqCiAgKiBTRUNUSU9OOndlYmtpdHNw
ZWxsY2hlY2tlcmVuY2hhbnQKICAqIEBzaG9ydF9kZXNjcmlwdGlvbjogdGhlIGRlZmF1bHQgc3Bl
bGwgY2hlY2tpbmcgaW1wbGVtZW50YXRpb24gZm9yIFdlYktpdEdUSysuCkBAIC0zNSwxMCArMzcs
OSBAQAogICogV2ViS2l0R1RLKy4gSXQgdXNlcyB0aGUgRW5jaGFudCBkaWN0aW9uYXJpZXMgaW5z
dGFsbGVkIG9uIHRoZSBzeXN0ZW0gdG8KICAqIGNvcnJlY3Qgc3BlbGxpbmcuCiAgKi8KLXN0YXRp
YyBFbmNoYW50QnJva2VyKiBicm9rZXIgPSAwOwogCiBzdHJ1Y3QgX1dlYktpdFNwZWxsQ2hlY2tl
ckVuY2hhbnRQcml2YXRlIHsKLSAgICBHU0xpc3QqIGVuY2hhbnREaWN0czsKKyAgICBSZWZQdHI8
VGV4dENoZWNrZXJFbmNoYW50PiB0ZXh0Q2hlY2tlckVuY2hhbnQ7CiB9OwogCiBzdGF0aWMgdm9p
ZCB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X3NwZWxsX2NoZWNrZXJfaW50ZXJmYWNlX2lu
aXQoV2ViS2l0U3BlbGxDaGVja2VySW50ZXJmYWNlKiBpbnRlcmZhY2UpOwpAQCAtNDcsMzUgKzQ4
LDE2IEBAIEdfREVGSU5FX1RZUEVfV0lUSF9DT0RFKFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnQs
IHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBH
X0lNUExFTUVOVF9JTlRFUkZBQ0UoV0VCS0lUX1RZUEVfU1BFTExfQ0hFQ0tFUiwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJraXRfc3BlbGxfY2hlY2tl
cl9lbmNoYW50X3NwZWxsX2NoZWNrZXJfaW50ZXJmYWNlX2luaXQpKQogCi1zdGF0aWMgdm9pZCBj
cmVhdGVFbmNoYW50QnJva2VySWZOZWVkZWQoKQotewotICAgIGlmICghYnJva2VyKQotICAgICAg
ICBicm9rZXIgPSBlbmNoYW50X2Jyb2tlcl9pbml0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVT
cGVsbENoZWNraW5nTGFuZ3VhZ2UoZ3BvaW50ZXIgZGF0YSwgZ3BvaW50ZXIpCi17Ci0gICAgY3Jl
YXRlRW5jaGFudEJyb2tlcklmTmVlZGVkKCk7Ci0KLSAgICBlbmNoYW50X2Jyb2tlcl9mcmVlX2Rp
Y3QoYnJva2VyLCBzdGF0aWNfY2FzdDxFbmNoYW50RGljdCo+KGRhdGEpKTsKLX0KLQogc3RhdGlj
IHZvaWQgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9maW5hbGl6ZShHT2JqZWN0KiBvYmpl
Y3QpCiB7CiAgICAgV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUqIHByaXYgPSBXRUJL
SVRfU1BFTExfQ0hFQ0tFUl9FTkNIQU5UKG9iamVjdCktPnByaXY7Ci0KLSAgICBnX3NsaXN0X2Zv
cmVhY2gocHJpdi0+ZW5jaGFudERpY3RzLCBmcmVlU3BlbGxDaGVja2luZ0xhbmd1YWdlLCAwKTsK
LSAgICBnX3NsaXN0X2ZyZWUocHJpdi0+ZW5jaGFudERpY3RzKTsKLQotICAgIFdFQktJVF9TUEVM
TF9DSEVDS0VSX0VOQ0hBTlQob2JqZWN0KS0+cHJpdi0+fldlYktpdFNwZWxsQ2hlY2tlckVuY2hh
bnRQcml2YXRlKCk7CisgICAgcHJpdi0+fldlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRl
KCk7CiB9CiAKIHN0YXRpYyB2b2lkIHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfY2xhc3Nf
aW5pdChXZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50Q2xhc3MqIGtsYXNzKQogewogICAgIEdPYmpl
Y3RDbGFzcyogb2JqZWN0Q2xhc3MgPSBHX09CSkVDVF9DTEFTUyhrbGFzcyk7Ci0KICAgICBvYmpl
Y3RDbGFzcy0+ZmluYWxpemUgPSB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2ZpbmFsaXpl
OwotCiAgICAgZ190eXBlX2NsYXNzX2FkZF9wcml2YXRlKGtsYXNzLCBzaXplb2YoV2ViS2l0U3Bl
bGxDaGVja2VyRW5jaGFudFByaXZhdGUpKTsKIH0KIApAQCAtODUsMTQ5ICs2NywzOCBAQCBzdGF0
aWMgdm9pZCB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2luaXQoV2ViS2l0U3BlbGxDaGVj
a2VyRW5jaGFudCogY2hlY2tlcgogICAgIGNoZWNrZXItPnByaXYgPSBwcml2OwogICAgIG5ldyAo
cHJpdikgV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUoKTsKIAotICAgIHByaXYtPmVu
Y2hhbnREaWN0cyA9IDA7Ci19Ci0KLXN0YXRpYyBib29sIHdvcmRFbmRJc0FDb250cmFjdGlvbkFw
b3N0cm9waGUoY29uc3QgY2hhciogc3RyaW5nLCBsb25nIG9mZnNldCkKLXsKLSAgICBpZiAoZ191
dGY4X2dldF9jaGFyKGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIG9mZnNldCkpICE9
IGdfdXRmOF9nZXRfY2hhcigiJyIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBJ
ZiB0aGlzIGlzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLCBpdCBjYW5ub3QgYmUg
dGhlIGFwb3N0cm9waGUgcGFydCBvZiBhIGNvbnRyYWN0aW9uLgotICAgIGlmIChvZmZzZXQgPT0g
Z191dGY4X3N0cmxlbihzdHJpbmcsIC0xKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
cmV0dXJuIGdfdW5pY2hhcl9pc2FscGhhKGdfdXRmOF9nZXRfY2hhcihnX3V0Zjhfb2Zmc2V0X3Rv
X3BvaW50ZXIoc3RyaW5nLCBvZmZzZXQgKyAxKSkpOworICAgIHByaXYtPnRleHRDaGVja2VyRW5j
aGFudCA9IFRleHRDaGVja2VyRW5jaGFudDo6Y3JlYXRlKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNo
ZWNrU3BlbGxpbmdPZlN0cmluZyhXZWJLaXRTcGVsbENoZWNrZXIqIGNoZWNrZXIsIGNvbnN0IGNo
YXIqIHN0cmluZywgaW50KiBtaXNzcGVsbGluZ0xvY2F0aW9uLCBpbnQqIG1pc3NwZWxsaW5nTGVu
Z3RoKQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKiBwcml2ID0gV0VC
S0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChjaGVja2VyKS0+cHJpdjsKLQotICAgIEdTTGlzdCog
ZGljdHMgPSBwcml2LT5lbmNoYW50RGljdHM7Ci0gICAgaWYgKCFkaWN0cykKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgaW50IGxlbmd0aCA9IGdfdXRmOF9zdHJsZW4oc3RyaW5nLCAtMSk7Ci0KLSAg
ICBQYW5nb0xhbmd1YWdlKiBsYW5ndWFnZShwYW5nb19sYW5ndWFnZV9nZXRfZGVmYXVsdCgpKTsK
LSAgICBHT3duUHRyPFBhbmdvTG9nQXR0cj4gYXR0cnMoZ19uZXcoUGFuZ29Mb2dBdHRyLCBsZW5n
dGggKyAxKSk7Ci0KLSAgICAvLyBwYW5nb19nZXRfbG9nX2F0dHJzIHVzZXMgYW4gYWRpdGlvbmFs
IHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCi0gICAgcGFuZ29fZ2V0X2xvZ19hdHRy
cyhzdHJpbmcsIC0xLCAtMSwgbGFuZ3VhZ2UsIGF0dHJzLmdldCgpLCBsZW5ndGggKyAxKTsKLQot
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoICsgMTsgaSsrKSB7Ci0gICAgICAgIC8vIFdl
IGdvIHRocm91Z2ggZWFjaCBjaGFyYWN0ZXIgdW50aWwgd2UgZmluZCBhbiBpc193b3JkX3N0YXJ0
LAotICAgICAgICAvLyB0aGVuIHdlIGdldCBpbnRvIGFuIGlubmVyIGxvb3AgdG8gZmluZCB0aGUg
aXNfd29yZF9lbmQgY29ycmVzcG9uZGluZwotICAgICAgICAvLyB0byBpdC4KLSAgICAgICAgaWYg
KGF0dHJzLmdldCgpW2ldLmlzX3dvcmRfc3RhcnQpIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9
IGk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gaTsKLSAgICAgICAgICAgIGludCB3b3JkTGVuZ3Ro
OwotCi0gICAgICAgICAgICB3aGlsZSAoYXR0cnMuZ2V0KClbZW5kXS5pc193b3JkX2VuZCA8IDEg
fHwgd29yZEVuZElzQUNvbnRyYWN0aW9uQXBvc3Ryb3BoZShzdHJpbmcsIGVuZCkpCi0gICAgICAg
ICAgICAgICAgZW5kKys7Ci0KLSAgICAgICAgICAgIHdvcmRMZW5ndGggPSBlbmQgLSBzdGFydDsK
LSAgICAgICAgICAgIC8vIFNldCB0aGUgaXRlcmF0b3IgdG8gYmUgYXQgdGhlIGN1cnJlbnQgd29y
ZCBlbmQsIHNvIHdlIGRvbid0Ci0gICAgICAgICAgICAvLyBjaGVjayBjaGFyYWN0ZXJzIHR3aWNl
LgotICAgICAgICAgICAgaSA9IGVuZDsKLQotICAgICAgICAgICAgZ2NoYXIqIGNzdGFydCA9IGdf
dXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIHN0YXJ0KTsKLSAgICAgICAgICAgIGdpbnQg
Ynl0ZXMgPSBzdGF0aWNfY2FzdDxnaW50PihnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoc3RyaW5n
LCBlbmQpIC0gY3N0YXJ0KTsKLSAgICAgICAgICAgIEdPd25QdHI8Z2NoYXI+IHdvcmQoZ19uZXcw
KGdjaGFyLCBieXRlcyArIDEpKTsKLQotICAgICAgICAgICAgZ191dGY4X3N0cm5jcHkod29yZC5n
ZXQoKSwgY3N0YXJ0LCB3b3JkTGVuZ3RoKTsKLQotICAgICAgICAgICAgZm9yICg7IGRpY3RzOyBk
aWN0cyA9IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgRW5jaGFudERpY3QqIGRpY3Qg
PSBzdGF0aWNfY2FzdDxFbmNoYW50RGljdCo+KGRpY3RzLT5kYXRhKTsKLSAgICAgICAgICAgICAg
ICBpZiAoZW5jaGFudF9kaWN0X2NoZWNrKGRpY3QsIHdvcmQuZ2V0KCksIHdvcmRMZW5ndGgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgICptaXNzcGVsbGluZ0xvY2F0aW9uID0gc3RhcnQ7Ci0gICAg
ICAgICAgICAgICAgICAgICptaXNzcGVsbGluZ0xlbmd0aCA9IHdvcmRMZW5ndGg7Ci0gICAgICAg
ICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBjaGVja2luZywg
dGhpcyB3b3JkIGlzIG9rIGluIGF0IGxlYXN0IG9uZSBkaWN0LgotICAgICAgICAgICAgICAgICAg
ICAqbWlzc3BlbGxpbmdMb2NhdGlvbiA9IC0xOwotICAgICAgICAgICAgICAgICAgICAqbWlzc3Bl
bGxpbmdMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHJpdi0+dGV4dENo
ZWNrZXJFbmNoYW50LT5jaGVja1NwZWxsaW5nT2ZTdHJpbmcoU3RyaW5nKHN0cmluZyksICptaXNz
cGVsbGluZ0xvY2F0aW9uLCAqbWlzc3BlbGxpbmdMZW5ndGgpOwogfQogCiBzdGF0aWMgY2hhcioq
IGdldEd1ZXNzZXNGb3JXb3JkKFdlYktpdFNwZWxsQ2hlY2tlciogY2hlY2tlciwgY29uc3QgY2hh
ciogd29yZCwgY29uc3QgY2hhciogY29udGV4dCkKIHsKICAgICBXZWJLaXRTcGVsbENoZWNrZXJF
bmNoYW50UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VOQ0hBTlQoY2hlY2tl
ciktPnByaXY7CiAKLSAgICBHU0xpc3QqIGRpY3RzID0gcHJpdi0+ZW5jaGFudERpY3RzOwotICAg
IGNoYXIqKiBndWVzc2VzID0gMDsKKyAgICBWZWN0b3I8U3RyaW5nPiBndWVzc2VzID0gcHJpdi0+
dGV4dENoZWNrZXJFbmNoYW50LT5nZXRHdWVzc2VzRm9yV29yZChTdHJpbmcod29yZCkpOwogCi0g
ICAgZm9yICg7IGRpY3RzOyBkaWN0cyA9IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgIHNpemVfdCBu
dW1iZXJPZlN1Z2dlc3Rpb25zOwotICAgICAgICBzaXplX3QgaTsKKyAgICBpZiAoZ3Vlc3Nlcy5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIEVuY2hhbnREaWN0KiBkaWN0
ID0gc3RhdGljX2Nhc3Q8RW5jaGFudERpY3QqPihkaWN0cy0+ZGF0YSk7Ci0gICAgICAgIGdjaGFy
Kiogc3VnZ2VzdGlvbnMgPSBlbmNoYW50X2RpY3Rfc3VnZ2VzdChkaWN0LCB3b3JkLCAtMSwgJm51
bWJlck9mU3VnZ2VzdGlvbnMpOworICAgIGludCBpID0gMDsKKyAgICBpbnQgbnVtYmVyT2ZHdWVz
c2VzID0gZ3Vlc3Nlcy5zaXplKCk7CisgICAgY2hhcioqIGd1ZXNzZXNBcnJheSA9IHN0YXRpY19j
YXN0PGNoYXIqKj4oZ19tYWxsb2MwKChudW1iZXJPZkd1ZXNzZXMgKyAxKSAqIHNpemVvZihjaGFy
KikpKTsKKyAgICBmb3IgKFZlY3RvcjxTdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZ3Vl
c3Nlcy5iZWdpbigpOyBpdGVyICE9IGd1ZXNzZXMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgZ3Vl
c3Nlc0FycmF5W2krK10gPSBnX3N0cmR1cChpdGVyLT51dGY4KCkuZGF0YSgpKTsKKyAgICBndWVz
c2VzQXJyYXlbaV0gPSAwOwogCi0gICAgICAgIGlmIChudW1iZXJPZlN1Z2dlc3Rpb25zID4gMCkg
ewotICAgICAgICAgICAgaWYgKG51bWJlck9mU3VnZ2VzdGlvbnMgPiAxMCkKLSAgICAgICAgICAg
ICAgICBudW1iZXJPZlN1Z2dlc3Rpb25zID0gMTA7Ci0KLSAgICAgICAgICAgIGd1ZXNzZXMgPSBz
dGF0aWNfY2FzdDxjaGFyKio+KGdfbWFsbG9jMCgobnVtYmVyT2ZTdWdnZXN0aW9ucyArIDEpICog
c2l6ZW9mKGNoYXIqKSkpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mU3Vn
Z2VzdGlvbnMgJiYgaSA8IDEwOyBpKyspCi0gICAgICAgICAgICAgICAgZ3Vlc3Nlc1tpXSA9IGdf
c3RyZHVwKHN1Z2dlc3Rpb25zW2ldKTsKLQotICAgICAgICAgICAgZ3Vlc3Nlc1tpXSA9IDA7Ci0K
LSAgICAgICAgICAgIGVuY2hhbnRfZGljdF9mcmVlX3N1Z2dlc3Rpb25zKGRpY3QsIHN1Z2dlc3Rp
b25zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBndWVzc2VzOwotfQotCi1zdGF0
aWMgdm9pZCBnZXRBdmFpbGFibGVEaWN0aW9uYXJpZXNDYWxsYmFjayhjb25zdCBjaGFyKiBjb25z
dCBsYW5ndWFnZVRhZywgY29uc3QgY2hhciogY29uc3QsIGNvbnN0IGNoYXIqIGNvbnN0LCBjb25z
dCBjaGFyKiBjb25zdCwgdm9pZCogZGF0YSkKLXsKLSAgICBWZWN0b3I8Q1N0cmluZz4qIGRpY3Rz
ID0gc3RhdGljX2Nhc3Q8VmVjdG9yPENTdHJpbmc+Kj4oZGF0YSk7Ci0KLSAgICBkaWN0cy0+YXBw
ZW5kKGxhbmd1YWdlVGFnKTsKKyAgICByZXR1cm4gZ3Vlc3Nlc0FycmF5OwogfQogCiBzdGF0aWMg
dm9pZCB1cGRhdGVTcGVsbENoZWNraW5nTGFuZ3VhZ2VzKFdlYktpdFNwZWxsQ2hlY2tlciogY2hl
Y2tlciwgY29uc3QgY2hhciogbGFuZ3VhZ2VzKQogewotICAgIEdTTGlzdCogc3BlbGxEaWN0aW9u
YXJpZXMgPSAwOwotCiAgICAgV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUqIHByaXYg
PSBXRUJLSVRfU1BFTExfQ0hFQ0tFUl9FTkNIQU5UKGNoZWNrZXIpLT5wcml2OwotCi0gICAgY3Jl
YXRlRW5jaGFudEJyb2tlcklmTmVlZGVkKCk7Ci0KLSAgICBpZiAobGFuZ3VhZ2VzKSB7Ci0gICAg
ICAgIGNoYXIqKiBsYW5ncyA9IGdfc3Ryc3BsaXQobGFuZ3VhZ2VzLCAiLCIsIC0xKTsKLSAgICAg
ICAgZm9yIChpbnQgaSA9IDA7IGxhbmdzW2ldOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChlbmNo
YW50X2Jyb2tlcl9kaWN0X2V4aXN0cyhicm9rZXIsIGxhbmdzW2ldKSkgewotICAgICAgICAgICAg
ICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0KGJyb2tl
ciwgbGFuZ3NbaV0pOwotICAgICAgICAgICAgICAgIHNwZWxsRGljdGlvbmFyaWVzID0gZ19zbGlz
dF9hcHBlbmQoc3BlbGxEaWN0aW9uYXJpZXMsIGRpY3QpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgICAgIGdfc3RyZnJlZXYobGFuZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNv
bnN0IGNoYXIqIGxhbmd1YWdlID0gcGFuZ29fbGFuZ3VhZ2VfdG9fc3RyaW5nKGd0a19nZXRfZGVm
YXVsdF9sYW5ndWFnZSgpKTsKLSAgICAgICAgaWYgKGVuY2hhbnRfYnJva2VyX2RpY3RfZXhpc3Rz
KGJyb2tlciwgbGFuZ3VhZ2UpKSB7Ci0gICAgICAgICAgICBFbmNoYW50RGljdCogZGljdCA9IGVu
Y2hhbnRfYnJva2VyX3JlcXVlc3RfZGljdChicm9rZXIsIGxhbmd1YWdlKTsKLSAgICAgICAgICAg
IHNwZWxsRGljdGlvbmFyaWVzID0gZ19zbGlzdF9hcHBlbmQoc3BlbGxEaWN0aW9uYXJpZXMsIGRp
Y3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTm8gZGljdGlvbmFyaWVzIHNl
bGVjdGVkLCB3ZSBnZXQgb25lIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICBWZWN0b3I8Q1N0
cmluZz4gYWxsRGljdGlvbmFyaWVzOwotICAgICAgICAgICAgZW5jaGFudF9icm9rZXJfbGlzdF9k
aWN0cyhicm9rZXIsIGdldEF2YWlsYWJsZURpY3Rpb25hcmllc0NhbGxiYWNrLCAmYWxsRGljdGlv
bmFyaWVzKTsKLSAgICAgICAgICAgIGlmICghYWxsRGljdGlvbmFyaWVzLmlzRW1wdHkoKSkgewot
ICAgICAgICAgICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVz
dF9kaWN0KGJyb2tlciwgYWxsRGljdGlvbmFyaWVzWzBdLmRhdGEoKSk7Ci0gICAgICAgICAgICAg
ICAgc3BlbGxEaWN0aW9uYXJpZXMgPSBnX3NsaXN0X2FwcGVuZChzcGVsbERpY3Rpb25hcmllcywg
ZGljdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZ19zbGlzdF9mb3Jl
YWNoKHByaXYtPmVuY2hhbnREaWN0cywgZnJlZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZSwgMCk7Ci0g
ICAgZ19zbGlzdF9mcmVlKHByaXYtPmVuY2hhbnREaWN0cyk7Ci0gICAgcHJpdi0+ZW5jaGFudERp
Y3RzID0gc3BlbGxEaWN0aW9uYXJpZXM7CisgICAgcHJpdi0+dGV4dENoZWNrZXJFbmNoYW50LT51
cGRhdGVTcGVsbENoZWNraW5nTGFuZ3VhZ2VzKFN0cmluZyhsYW5ndWFnZXMpKTsKIH0KIAogc3Rh
dGljIGNoYXIqIGdldEF1dG9jb3JyZWN0U3VnZ2VzdGlvbnNGb3JNaXNzcGVsbGVkV29yZChXZWJL
aXRTcGVsbENoZWNrZXIqIGNoZWNrZXIsIGNvbnN0IGNoYXIqIHdvcmQpCkBAIC0yMzgsMjUgKzEw
OSwxMyBAQCBzdGF0aWMgY2hhciogZ2V0QXV0b2NvcnJlY3RTdWdnZXN0aW9uc0Zvck1pc3NwZWxs
ZWRXb3JkKFdlYktpdFNwZWxsQ2hlY2tlciogY2hlYwogc3RhdGljIHZvaWQgbGVhcm5Xb3JkKFdl
YktpdFNwZWxsQ2hlY2tlciogY2hlY2tlciwgY29uc3QgY2hhciogd29yZCkKIHsKICAgICBXZWJL
aXRTcGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VS
X0VOQ0hBTlQoY2hlY2tlciktPnByaXY7Ci0gICAgR1NMaXN0KiBkaWN0cyA9IHByaXYtPmVuY2hh
bnREaWN0czsKLQotICAgIGZvciAoOyBkaWN0czsgZGljdHMgPSBkaWN0cy0+bmV4dCkgewotICAg
ICAgICBFbmNoYW50RGljdCogZGljdCA9IHN0YXRpY19jYXN0PEVuY2hhbnREaWN0Kj4oZGljdHMt
PmRhdGEpOwotCi0gICAgICAgIGVuY2hhbnRfZGljdF9hZGRfdG9fcGVyc29uYWwoZGljdCwgd29y
ZCwgLTEpOwotICAgIH0KKyAgICBwcml2LT50ZXh0Q2hlY2tlckVuY2hhbnQtPmxlYXJuV29yZChT
dHJpbmcod29yZCkpOwogfQogCiBzdGF0aWMgdm9pZCBpZ25vcmVXb3JkKFdlYktpdFNwZWxsQ2hl
Y2tlciogY2hlY2tlciwgY29uc3QgY2hhciogd29yZCkKIHsKICAgICBXZWJLaXRTcGVsbENoZWNr
ZXJFbmNoYW50UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VOQ0hBTlQoY2hl
Y2tlciktPnByaXY7Ci0gICAgR1NMaXN0KiBkaWN0cyA9IHByaXYtPmVuY2hhbnREaWN0czsKLQot
ICAgIGZvciAoOyBkaWN0czsgZGljdHMgPSBkaWN0cy0+bmV4dCkgewotICAgICAgICBFbmNoYW50
RGljdCogZGljdCA9IHN0YXRpY19jYXN0PEVuY2hhbnREaWN0Kj4oZGljdHMtPmRhdGEpOwotCi0g
ICAgICAgIGVuY2hhbnRfZGljdF9hZGRfdG9fc2Vzc2lvbihkaWN0LCB3b3JkLCAtMSk7Ci0gICAg
fQorICAgIHByaXYtPnRleHRDaGVja2VyRW5jaGFudC0+aWdub3JlV29yZChTdHJpbmcod29yZCkp
OwogfQogCiBzdGF0aWMgdm9pZCB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X3NwZWxsX2No
ZWNrZXJfaW50ZXJmYWNlX2luaXQoV2ViS2l0U3BlbGxDaGVja2VySW50ZXJmYWNlKiBpbnRlcmZh
Y2UpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>153515</attachid>
            <date>2012-07-20 08:47:41 -0700</date>
            <delta_ts>2012-07-31 05:44:12 -0700</delta_ts>
            <desc>Patch proposal</desc>
            <filename>0001-2012-07-18-Mario-Sanchez-Prada-msanchez-igalia.com.patch</filename>
            <type>text/plain</type>
            <size>26783</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSA1NTk1MWM5ZGZiNzM0ODZkYzk0NmZkNDRiNzc4NWZmODY3NmQ3ZWRjIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBXZWQsIDE4IEp1bCAyMDEyIDEzOjE2OjE4ICswMjAwClN1YmplY3Q6IFtQQVRD
SCAxLzJdIDIwMTItMDctMTggIE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgoKICAgICAgICBbR1RLXSBBZGQgYSBuZXcgYW5kIHJldXNhYmxlIGVuY2hhbnQtYmFzZWQg
c3BlbGxjaGVja2VyIGluIFdlYkNvcmUKICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9OTAyNjkKCiAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CgogICAgICAgIE1vdmUgZW5jaGFudCBzcGVjaWZpYyBjb2RlIGRvd24gdG8gV2ViQ29yZSwgaW50
byBhIG5ldyBjbGFzcwogICAgICAgIFRleHRDaGVja2VyRW5jaGFudCwgdGhhdCB3ZSBjYW4gdXNl
IGZyb20gV0sxIGFuZCBXSzIuCgogICAgICAgICogR05VbWFrZWZpbGUuYW06IEFkZCBmbGFncyB0
byBoYW5kbGUgdGhlIFNQRUxMQ0hFQ0sgZmVhdHVyZS4KICAgICAgICAqIEdOVW1ha2VmaWxlLmxp
c3QuYW06IEFkZGVkIG5ldyBmaWxlcy4KICAgICAgICAqIHBsYXRmb3JtL3RleHQvZ3RrL1RleHRD
aGVja2VyRW5jaGFudC5jcHA6IEFkZGVkLgogICAgICAgIChnZXRBdmFpbGFibGVEaWN0aW9uYXJp
ZXNDYWxsYmFjayk6CiAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6VGV4dENoZWNrZXJFbmNo
YW50KToKICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50Ojp+VGV4dENoZWNrZXJFbmNoYW50KToK
ICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50OjppZ25vcmVXb3JkKToKICAgICAgICAoVGV4dENo
ZWNrZXJFbmNoYW50OjpsZWFybldvcmQpOgogICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OmNo
ZWNrU3BlbGxpbmdPZlN0cmluZyk6CiAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6Z2V0R3Vl
c3Nlc0ZvcldvcmQpOgogICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OnVwZGF0ZVNwZWxsQ2hl
Y2tpbmdMYW5ndWFnZXMpOgogICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OmZyZWVFbmNoYW50
QnJva2VyRGljdHMpOgogICAgICAgICogcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNo
YW50Lmg6IEFkZGVkLgogICAgICAgIChXZWJDb3JlKToKICAgICAgICAoVGV4dENoZWNrZXJFbmNo
YW50KToKICAgICAgICAoV2ViQ29yZTo6VGV4dENoZWNrZXJFbmNoYW50OjpjcmVhdGUpOgoKMjAx
Mi0wNy0xOCAgTWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+CgogICAg
ICAgIFtHVEtdIEFkZCBhIG5ldyBhbmQgcmV1c2FibGUgZW5jaGFudC1iYXNlZCBzcGVsbGNoZWNr
ZXIgaW4gV2ViQ29yZQogICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD05MDI2OQoKICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCiAgICAgICAg
UmVtb3ZlIGVuY2hhbnQgc3BlY2lmaWMgY29kZSBmcm9tIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hh
bnQgYW5kCiAgICAgICAgaW1wbGVtZW50IGl0IHJlbHlpbmcgaW4gdGhlIG5ldyBUZXh0Q2hlY2tl
ckVuY2hhbnQgY2xhc3MgaW4gV2ViQ29yZS4KCiAgICAgICAgKiB3ZWJraXQvd2Via2l0c3BlbGxj
aGVja2VyZW5jaGFudC5jcHA6CiAgICAgICAgKF9XZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50UHJp
dmF0ZSk6CiAgICAgICAgKHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfZmluYWxpemUpOgog
ICAgICAgICh3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2NsYXNzX2luaXQpOgogICAgICAg
ICh3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2luaXQpOgogICAgICAgIChjaGVja1NwZWxs
aW5nT2ZTdHJpbmcpOgogICAgICAgIChnZXRHdWVzc2VzRm9yV29yZCk6CiAgICAgICAgKHVwZGF0
ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMpOgogICAgICAgIChsZWFybldvcmQpOgogICAgICAgIChp
Z25vcmVXb3JkKToKLS0tCiBTb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cgICAgICAgICAgICAgICAg
ICAgICAgICAgICB8ICAgMjcgKysrCiBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSAgICAg
ICAgICAgICAgICAgICAgICB8ICAgMTEgKy0KIFNvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxp
c3QuYW0gICAgICAgICAgICAgICAgIHwgICAgOCArCiAuLi4vcGxhdGZvcm0vdGV4dC9ndGsvVGV4
dENoZWNrZXJFbmNoYW50LmNwcCAgICAgICB8ICAxOTYgKysrKysrKysrKysrKysrKysrKysKIC4u
Li9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5oIHwgICA1NiAr
KysrKysKIFNvdXJjZS9XZWJLaXQvZ3RrL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAgICAg
IHwgICAyMSArKysKIC4uLi9ndGsvd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3Bw
ICAgICAgIHwgIDE4MSArKy0tLS0tLS0tLS0tLS0tLS0KIDcgZmlsZXMgY2hhbmdlZCwgMzM4IGlu
c2VydGlvbnMoKyksIDE2MiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3BwCiBjcmVhdGUg
bW9kZSAxMDA2NDQgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJF
bmNoYW50LmgKCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cgYi9Tb3VyY2Uv
V2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOWEzNWRkYS4uM2RjYTY3NSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAt
MSwzICsxLDMwIEBACisyMDEyLTA3LTE4ICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNoZXpA
aWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBBZGQgYSBuZXcgYW5kIHJldXNhYmxlIGVuY2hh
bnQtYmFzZWQgc3BlbGxjaGVja2VyIGluIFdlYkNvcmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkwMjY5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgTW92ZSBlbmNoYW50IHNwZWNpZmljIGNvZGUgZG93biB0
byBXZWJDb3JlLCBpbnRvIGEgbmV3IGNsYXNzCisgICAgICAgIFRleHRDaGVja2VyRW5jaGFudCwg
dGhhdCB3ZSBjYW4gdXNlIGZyb20gV0sxIGFuZCBXSzIuCisKKyAgICAgICAgKiBHTlVtYWtlZmls
ZS5hbTogQWRkIGZsYWdzIHRvIGhhbmRsZSB0aGUgU1BFTExDSEVDSyBmZWF0dXJlLgorICAgICAg
ICAqIEdOVW1ha2VmaWxlLmxpc3QuYW06IEFkZGVkIG5ldyBmaWxlcy4KKyAgICAgICAgKiBwbGF0
Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKGdl
dEF2YWlsYWJsZURpY3Rpb25hcmllc0NhbGxiYWNrKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5j
aGFudDo6VGV4dENoZWNrZXJFbmNoYW50KToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6
flRleHRDaGVja2VyRW5jaGFudCk6CisgICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6Omlnbm9y
ZVdvcmQpOgorICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50OjpsZWFybldvcmQpOgorICAgICAg
ICAoVGV4dENoZWNrZXJFbmNoYW50OjpjaGVja1NwZWxsaW5nT2ZTdHJpbmcpOgorICAgICAgICAo
VGV4dENoZWNrZXJFbmNoYW50OjpnZXRHdWVzc2VzRm9yV29yZCk6CisgICAgICAgIChUZXh0Q2hl
Y2tlckVuY2hhbnQ6OnVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMpOgorICAgICAgICAoVGV4
dENoZWNrZXJFbmNoYW50OjpmcmVlRW5jaGFudEJyb2tlckRpY3RzKToKKyAgICAgICAgKiBwbGF0
Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuaDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudCk6CisgICAgICAgIChXZWJDb3JlOjpU
ZXh0Q2hlY2tlckVuY2hhbnQ6OmNyZWF0ZSk6CisKIDIwMTItMDctMTcgIEtpbnVrbyBZYXN1ZGEg
IDxraW51a29AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIElmIHZhbHVlIGZvciByZXNwb25zZVR5
cGUgZGVmaW5lZCBhcyB0eXBlIHRoYXQgbm90IHN1cHBvcnRlZCwgaXQgc2hvdWxkIG5vdCB0aHJv
dyBhbiBleGNlcHRpb24gaW4gWEhSIDIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmFtIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KaW5kZXggYWExMDJjOC4u
M2YxZGFkMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KKysrIGIv
U291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KQEAgLTExNiw3ICsxMTYsOCBAQCB3ZWJjb3Jl
Z3RrX2NwcGZsYWdzICs9IFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9nc3RyZWFtZXIgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2d0ayBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Rr
IFwKLQktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAKKwkt
SSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAgXAorCS1JJChz
cmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrCiAKICMgLS0tCiAjIEZlYXR1
cmVzIGVuYWJsZWQgYnkgZGVmYXVsdCBhdCBjb21waWxhdGlvbiB0aW1lCkBAIC03MzUsNiArNzM2
LDE0IEBAIEZFQVRVUkVfREVGSU5FUyArPSBFTkFCTEVfTElOS19QUkVGRVRDSD0xCiB3ZWJjb3Jl
X2NwcGZsYWdzICs9IC1ERU5BQkxFX0xJTktfUFJFRkVUQ0g9MQogZW5kaWYgICMgRU5EIEVOQUJM
RV9MSU5LX1BSRUZFVENICiAKKyMgLS0tCisjIFNwZWxsIGNoZWNrIHN1cHBvcnQKKyMgLS0tCitp
ZiBFTkFCTEVfU1BFTExDSEVDSworRkVBVFVSRV9ERUZJTkVTICs9IEVOQUJMRV9TUEVMTENIRUNL
PTEKK3dlYmNvcmVfY3BwZmxhZ3MgKz0gLURFTkFCTEVfU1BFTExDSEVDSz0xCitlbmRpZiAgIyBF
TkQgRU5BQkxFX1NQRUxMQ0hFQ0sKKwogRGVyaXZlZFNvdXJjZXMvV2ViQ29yZS9DU1NQcm9wZXJ0
eU5hbWVzLmNwcDogRGVyaXZlZFNvdXJjZXMvV2ViQ29yZS9DU1NQcm9wZXJ0eU5hbWVzLmgKIERl
cml2ZWRTb3VyY2VzL1dlYkNvcmUvQ1NTUHJvcGVydHlOYW1lcy5oOiAkKFdFQkNPUkVfQ1NTX1BS
T1BFUlRZX05BTUVTKSAkKFdlYkNvcmUpL2Nzcy9tYWtlcHJvcC5wbAogCSQoQU1fVl9HRU4pCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtIGIvU291cmNlL1dl
YkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQppbmRleCA3NDkxMDQzLi43MWJjMmZiIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCisrKyBiL1NvdXJjZS9XZWJD
b3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KQEAgLTYyNjgsMyArNjI2OCwxMSBAQCBkb21fYmluZGlu
Z19pZGxzICs9IFwKIAogZW5kaWYgICMgRU5EIEVOQUJMRV9RVU9UQQogCisjIC0tLS0KKyMgU3Bl
bGwgY2hlY2sgc3VwcG9ydAorIyAtLS0tCitpZiBFTkFCTEVfU1BFTExDSEVDSword2ViY29yZV9z
b3VyY2VzICs9IFwKKwlTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tl
ckVuY2hhbnQuaCBcCisJU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNr
ZXJFbmNoYW50LmNwcAorZW5kaWYgIyBFTkQgRU5BQkxFX1NQRUxMQ0hFQ0sKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMTBhZjIKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hh
bnQuY3BwCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMiBJZ2Fs
aWEgUy5MLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlRleHRDaGVja2VyRW5jaGFudC5oIgorCisjaWYgRU5BQkxFKFNQRUxM
Q0hFQ0spCisKKyNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgorI2luY2x1ZGUgPHd0Zi9nb2JqZWN0
L0dPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK3VzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IG1heGltdW1OdW1iZXJPZlN1Z2dl
c3Rpb25zID0gMTA7CisKK3N0YXRpYyB2b2lkIGdldEF2YWlsYWJsZURpY3Rpb25hcmllc0NhbGxi
YWNrKGNvbnN0IGNoYXIqIGNvbnN0IGxhbmd1YWdlVGFnLCBjb25zdCBjaGFyKiBjb25zdCwgY29u
c3QgY2hhciogY29uc3QsIGNvbnN0IGNoYXIqIGNvbnN0LCB2b2lkKiBkYXRhKQoreworICAgIFZl
Y3RvcjxDU3RyaW5nPiogZGljdHMgPSBzdGF0aWNfY2FzdDxWZWN0b3I8Q1N0cmluZz4qPihkYXRh
KTsKKyAgICBkaWN0cy0+YXBwZW5kKGxhbmd1YWdlVGFnKTsKK30KKworc3RhdGljIGJvb2wgd29y
ZEVuZElzQUNvbnRyYWN0aW9uQXBvc3Ryb3BoZShjb25zdCBjaGFyKiBzdHJpbmcsIGxvbmcgb2Zm
c2V0KQoreworICAgIGlmIChnX3V0ZjhfZ2V0X2NoYXIoZ191dGY4X29mZnNldF90b19wb2ludGVy
KHN0cmluZywgb2Zmc2V0KSkgIT0gZ191dGY4X2dldF9jaGFyKCInIikpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBz
dHJpbmcsIGl0IGNhbm5vdCBiZSB0aGUgYXBvc3Ryb3BoZSBwYXJ0IG9mIGEgY29udHJhY3Rpb24u
CisgICAgaWYgKG9mZnNldCA9PSBnX3V0Zjhfc3RybGVuKHN0cmluZywgLTEpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZ191bmljaGFyX2lzYWxwaGEoZ191dGY4X2dldF9j
aGFyKGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIG9mZnNldCArIDEpKSk7Cit9CisK
K1RleHRDaGVja2VyRW5jaGFudDo6VGV4dENoZWNrZXJFbmNoYW50KCkKKyAgICA6IG1fYnJva2Vy
KGVuY2hhbnRfYnJva2VyX2luaXQoKSkKKyAgICAsIG1fZW5jaGFudERpY3RzKDApCit7Cit9CisK
K1RleHRDaGVja2VyRW5jaGFudDo6flRleHRDaGVja2VyRW5jaGFudCgpCit7CisgICAgaWYgKCFt
X2Jyb2tlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgZnJlZUVuY2hhbnRCcm9rZXJEaWN0cygp
OworICAgIGVuY2hhbnRfYnJva2VyX2ZyZWUobV9icm9rZXIpOworfQorCit2b2lkIFRleHRDaGVj
a2VyRW5jaGFudDo6aWdub3JlV29yZChjb25zdCBTdHJpbmcmIHdvcmQpCit7CisgICAgZm9yIChW
ZWN0b3I8RW5jaGFudERpY3QqPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG1fZW5jaGFudERpY3Rz
LmJlZ2luKCk7IGl0ZXIgIT0gbV9lbmNoYW50RGljdHMuZW5kKCk7ICsraXRlcikKKyAgICAgICAg
ZW5jaGFudF9kaWN0X2FkZF90b19zZXNzaW9uKCppdGVyLCB3b3JkLnV0ZjgoKS5kYXRhKCksIC0x
KTsKK30KKwordm9pZCBUZXh0Q2hlY2tlckVuY2hhbnQ6OmxlYXJuV29yZChjb25zdCBTdHJpbmcm
IHdvcmQpCit7CisgICAgZm9yIChWZWN0b3I8RW5jaGFudERpY3QqPjo6Y29uc3RfaXRlcmF0b3Ig
aXRlciA9IG1fZW5jaGFudERpY3RzLmJlZ2luKCk7IGl0ZXIgIT0gbV9lbmNoYW50RGljdHMuZW5k
KCk7ICsraXRlcikKKyAgICAgICAgZW5jaGFudF9kaWN0X2FkZF90b19wZXJzb25hbCgqaXRlciwg
d29yZC51dGY4KCkuZGF0YSgpLCAtMSk7Cit9CisKK3ZvaWQgVGV4dENoZWNrZXJFbmNoYW50Ojpj
aGVja1NwZWxsaW5nT2ZTdHJpbmcoY29uc3QgU3RyaW5nJiBzdHJpbmcsIGludCYgbWlzc3BlbGxp
bmdMb2NhdGlvbiwgaW50JiBtaXNzcGVsbGluZ0xlbmd0aCkKK3sKKyAgICBpZiAobV9lbmNoYW50
RGljdHMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgVmVjdG9yPEVuY2hhbnREaWN0
Kj46OmNvbnN0X2l0ZXJhdG9yIGRpY3RJdGVyID0gbV9lbmNoYW50RGljdHMuYmVnaW4oKTsKKwor
ICAgIEdPd25QdHI8Z2NoYXI+IGNTdHJpbmcoZ19zdHJkdXAoc3RyaW5nLnV0ZjgoKS5kYXRhKCkp
KTsKKyAgICBzaXplX3QgbGVuZ3RoID0gc3RyaW5nLnV0ZjgoKS5sZW5ndGgoKTsKKworICAgIFBh
bmdvTGFuZ3VhZ2UqIGxhbmd1YWdlKHBhbmdvX2xhbmd1YWdlX2dldF9kZWZhdWx0KCkpOworICAg
IEdPd25QdHI8UGFuZ29Mb2dBdHRyPiBhdHRycyhnX25ldyhQYW5nb0xvZ0F0dHIsIGxlbmd0aCAr
IDEpKTsKKworICAgIC8vIHBhbmdvX2dldF9sb2dfYXR0cnMgdXNlcyBhbiBhZGl0aW9uYWwgcG9z
aXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KKyAgICBwYW5nb19nZXRfbG9nX2F0dHJzKGNT
dHJpbmcuZ2V0KCksIC0xLCAtMSwgbGFuZ3VhZ2UsIGF0dHJzLmdldCgpLCBsZW5ndGggKyAxKTsK
KworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoICsgMTsgaSsrKSB7CisgICAgICAg
IC8vIFdlIGdvIHRocm91Z2ggZWFjaCBjaGFyYWN0ZXIgdW50aWwgd2UgZmluZCBhbiBpc193b3Jk
X3N0YXJ0LAorICAgICAgICAvLyB0aGVuIHdlIGdldCBpbnRvIGFuIGlubmVyIGxvb3AgdG8gZmlu
ZCB0aGUgaXNfd29yZF9lbmQgY29ycmVzcG9uZGluZworICAgICAgICAvLyB0byBpdC4KKyAgICAg
ICAgaWYgKGF0dHJzLmdldCgpW2ldLmlzX3dvcmRfc3RhcnQpIHsKKyAgICAgICAgICAgIGludCBz
dGFydCA9IGk7CisgICAgICAgICAgICBpbnQgZW5kID0gaTsKKyAgICAgICAgICAgIGludCB3b3Jk
TGVuZ3RoOworCisgICAgICAgICAgICB3aGlsZSAoYXR0cnMuZ2V0KClbZW5kXS5pc193b3JkX2Vu
ZCA8IDEgIHx8IHdvcmRFbmRJc0FDb250cmFjdGlvbkFwb3N0cm9waGUoY1N0cmluZy5nZXQoKSwg
ZW5kKSkKKyAgICAgICAgICAgICAgICBlbmQrKzsKKworICAgICAgICAgICAgd29yZExlbmd0aCA9
IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgLy8gU2V0IHRoZSBpdGVyYXRvciB0byBiZSBhdCB0
aGUgY3VycmVudCB3b3JkIGVuZCwgc28gd2UgZG9uJ3QKKyAgICAgICAgICAgIC8vIGNoZWNrIGNo
YXJhY3RlcnMgdHdpY2UuCisgICAgICAgICAgICBpID0gZW5kOworCisgICAgICAgICAgICBnY2hh
ciogY3N0YXJ0ID0gZ191dGY4X29mZnNldF90b19wb2ludGVyKGNTdHJpbmcuZ2V0KCksIHN0YXJ0
KTsKKyAgICAgICAgICAgIGdpbnQgYnl0ZXMgPSBzdGF0aWNfY2FzdDxnaW50PihnX3V0Zjhfb2Zm
c2V0X3RvX3BvaW50ZXIoY1N0cmluZy5nZXQoKSwgZW5kKSAtIGNzdGFydCk7CisgICAgICAgICAg
ICBHT3duUHRyPGdjaGFyPiB3b3JkKGdfbmV3MChnY2hhciwgYnl0ZXMgKyAxKSk7CisKKyAgICAg
ICAgICAgIGdfdXRmOF9zdHJuY3B5KHdvcmQuZ2V0KCksIGNzdGFydCwgd29yZExlbmd0aCk7CisK
KyAgICAgICAgICAgIGZvciAoOyBkaWN0SXRlciAhPSBtX2VuY2hhbnREaWN0cy5lbmQoKTsgKytk
aWN0SXRlcikgeworICAgICAgICAgICAgICAgIGlmIChlbmNoYW50X2RpY3RfY2hlY2soKmRpY3RJ
dGVyLCB3b3JkLmdldCgpLCB3b3JkTGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgICBtaXNz
cGVsbGluZ0xvY2F0aW9uID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIG1pc3NwZWxsaW5n
TGVuZ3RoID0gd29yZExlbmd0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgICAgICAvLyBTdG9wIGNoZWNraW5nLCB0aGlzIHdvcmQgaXMgb2sgaW4gYXQgbGVhc3Qg
b25lIGRpY3QuCisgICAgICAgICAgICAgICAgICAgIG1pc3NwZWxsaW5nTG9jYXRpb24gPSAtMTsK
KyAgICAgICAgICAgICAgICAgICAgbWlzc3BlbGxpbmdMZW5ndGggPSAwOworICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9Cit9CisKK1ZlY3RvcjxTdHJpbmc+IFRleHRDaGVja2VyRW5jaGFudDo6Z2V0R3Vl
c3Nlc0ZvcldvcmQoY29uc3QgU3RyaW5nJiB3b3JkKQoreworICAgIFZlY3RvcjxTdHJpbmc+IGd1
ZXNzZXM7CisgICAgaWYgKG1fZW5jaGFudERpY3RzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IGd1ZXNzZXM7CisKKyAgICBmb3IgKFZlY3RvcjxFbmNoYW50RGljdCo+Ojpjb25zdF9pdGVyYXRv
ciBpdGVyID0gbV9lbmNoYW50RGljdHMuYmVnaW4oKTsgaXRlciAhPSBtX2VuY2hhbnREaWN0cy5l
bmQoKTsgKytpdGVyKSB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZlN1Z2dlc3Rpb25zOworICAg
ICAgICBzaXplX3QgaTsKKworICAgICAgICBnY2hhcioqIHN1Z2dlc3Rpb25zID0gZW5jaGFudF9k
aWN0X3N1Z2dlc3QoKml0ZXIsIHdvcmQudXRmOCgpLmRhdGEoKSwgLTEsICZudW1iZXJPZlN1Z2dl
c3Rpb25zKTsKKyAgICAgICAgaWYgKG51bWJlck9mU3VnZ2VzdGlvbnMgPD0gMCkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChudW1iZXJPZlN1Z2dlc3Rpb25zID4gbWF4aW11
bU51bWJlck9mU3VnZ2VzdGlvbnMpCisgICAgICAgICAgICBudW1iZXJPZlN1Z2dlc3Rpb25zID0g
bWF4aW11bU51bWJlck9mU3VnZ2VzdGlvbnM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51
bWJlck9mU3VnZ2VzdGlvbnM7IGkrKykKKyAgICAgICAgICAgIGd1ZXNzZXMuYXBwZW5kKFN0cmlu
ZyhzdWdnZXN0aW9uc1tpXSkpOworCisgICAgICAgIGVuY2hhbnRfZGljdF9mcmVlX3N1Z2dlc3Rp
b25zKCppdGVyLCBzdWdnZXN0aW9ucyk7CisgICAgfQorCisgICAgcmV0dXJuIGd1ZXNzZXM7Cit9
CisKK3ZvaWQgVGV4dENoZWNrZXJFbmNoYW50Ojp1cGRhdGVTcGVsbENoZWNraW5nTGFuZ3VhZ2Vz
KGNvbnN0IFN0cmluZyYgbGFuZ3VhZ2VzKQoreworICAgIFZlY3RvcjxFbmNoYW50RGljdCo+IHNw
ZWxsRGljdGlvbmFyaWVzOworCisgICAgaWYgKCFsYW5ndWFnZXMuaXNFbXB0eSgpKSB7CisgICAg
ICAgIFZlY3RvcjxTdHJpbmc+IGxhbmd1YWdlc1ZlY3RvcjsKKyAgICAgICAgbGFuZ3VhZ2VzLnNw
bGl0KHN0YXRpY19jYXN0PFVDaGFyPignLCcpLCBsYW5ndWFnZXNWZWN0b3IpOworICAgICAgICBm
b3IgKFZlY3RvcjxTdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gbGFuZ3VhZ2VzVmVjdG9y
LmJlZ2luKCk7IGl0ZXIgIT0gbGFuZ3VhZ2VzVmVjdG9yLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAg
ICAgICAgIEdPd25QdHI8Z2NoYXI+IGN1cnJlbnRMYW5ndWFnZShnX3N0cmR1cChpdGVyLT51dGY4
KCkuZGF0YSgpKSk7CisgICAgICAgICAgICBpZiAoZW5jaGFudF9icm9rZXJfZGljdF9leGlzdHMo
bV9icm9rZXIsIGN1cnJlbnRMYW5ndWFnZS5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICBFbmNo
YW50RGljdCogZGljdCA9IGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfZGljdChtX2Jyb2tlciwgY3Vy
cmVudExhbmd1YWdlLmdldCgpKTsKKyAgICAgICAgICAgICAgICBzcGVsbERpY3Rpb25hcmllcy5h
cHBlbmQoZGljdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAg
ICAgICBjb25zdCBjaGFyKiBsYW5ndWFnZSA9IHBhbmdvX2xhbmd1YWdlX3RvX3N0cmluZyhwYW5n
b19sYW5ndWFnZV9nZXRfZGVmYXVsdCgpKTsKKyAgICAgICAgaWYgKGVuY2hhbnRfYnJva2VyX2Rp
Y3RfZXhpc3RzKG1fYnJva2VyLCBsYW5ndWFnZSkpIHsKKyAgICAgICAgICAgIEVuY2hhbnREaWN0
KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0KG1fYnJva2VyLCBsYW5ndWFnZSk7
CisgICAgICAgICAgICBzcGVsbERpY3Rpb25hcmllcy5hcHBlbmQoZGljdCk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAvLyBObyBkaWN0aW9uYXJpZXMgc2VsZWN0ZWQsIHdlIGdldCBv
bmUgZnJvbSB0aGUgbGlzdC4KKyAgICAgICAgICAgIFZlY3RvcjxDU3RyaW5nPiBhbGxEaWN0aW9u
YXJpZXM7CisgICAgICAgICAgICBlbmNoYW50X2Jyb2tlcl9saXN0X2RpY3RzKG1fYnJva2VyLCBn
ZXRBdmFpbGFibGVEaWN0aW9uYXJpZXNDYWxsYmFjaywgJmFsbERpY3Rpb25hcmllcyk7CisgICAg
ICAgICAgICBpZiAoIWFsbERpY3Rpb25hcmllcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAg
ICBFbmNoYW50RGljdCogZGljdCA9IGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfZGljdChtX2Jyb2tl
ciwgYWxsRGljdGlvbmFyaWVzWzBdLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgc3BlbGxEaWN0
aW9uYXJpZXMuYXBwZW5kKGRpY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
ICAgIGZyZWVFbmNoYW50QnJva2VyRGljdHMoKTsKKyAgICBtX2VuY2hhbnREaWN0cyA9IHNwZWxs
RGljdGlvbmFyaWVzOworfQorCit2b2lkIFRleHRDaGVja2VyRW5jaGFudDo6ZnJlZUVuY2hhbnRC
cm9rZXJEaWN0cygpCit7CisgICAgZm9yIChWZWN0b3I8RW5jaGFudERpY3QqPjo6Y29uc3RfaXRl
cmF0b3IgaXRlciA9IG1fZW5jaGFudERpY3RzLmJlZ2luKCk7IGl0ZXIgIT0gbV9lbmNoYW50RGlj
dHMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgZW5jaGFudF9icm9rZXJfZnJlZV9kaWN0KG1fYnJv
a2VyLCAqaXRlcik7Cit9CisKKyNlbmRpZiAvLyBFTkFCTEUoU1BFTExDSEVDSykKKwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNoYW50
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTI0MzRlCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNo
YW50LmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBJZ2FsaWEg
Uy5MLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAq
LworCisjaWZuZGVmIFRleHRDaGVja2VyRW5jaGFudF9oCisjZGVmaW5lIFRleHRDaGVja2VyRW5j
aGFudF9oCisKKyNpZiBFTkFCTEUoU1BFTExDSEVDSykKKworI2luY2x1ZGUgPGVuY2hhbnQuaD4K
KyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+
CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFRleHRDaGVja2VyRW5jaGFudCA6IHB1
YmxpYyBSZWZDb3VudGVkPFRleHRDaGVja2VyRW5jaGFudD4geworcHVibGljOgorICAgIHN0YXRp
YyBQYXNzUmVmUHRyPFRleHRDaGVja2VyRW5jaGFudD4gY3JlYXRlKCkgeyByZXR1cm4gYWRvcHRS
ZWYobmV3IFRleHRDaGVja2VyRW5jaGFudCk7IH0KKyAgICB+VGV4dENoZWNrZXJFbmNoYW50KCk7
CisKKyAgICB2b2lkIGlnbm9yZVdvcmQoY29uc3QgU3RyaW5nJik7CisgICAgdm9pZCBsZWFybldv
cmQoY29uc3QgU3RyaW5nJik7CisgICAgdm9pZCBjaGVja1NwZWxsaW5nT2ZTdHJpbmcoY29uc3Qg
U3RyaW5nJiwgaW50JiBtaXNzcGVsbGluZ0xvY2F0aW9uLCBpbnQmIG1pc3NwZWxsaW5nTGVuZ3Ro
KTsKKyAgICBWZWN0b3I8U3RyaW5nPiBnZXRHdWVzc2VzRm9yV29yZChjb25zdCBTdHJpbmcmKTsK
KyAgICB2b2lkIHVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMoY29uc3QgU3RyaW5nJiBsYW5n
dWFnZXMpOworCitwcml2YXRlOgorICAgIFRleHRDaGVja2VyRW5jaGFudCgpOworICAgIHZvaWQg
ZnJlZUVuY2hhbnRCcm9rZXJEaWN0cygpOworCisgICAgRW5jaGFudEJyb2tlciogbV9icm9rZXI7
CisgICAgVmVjdG9yPEVuY2hhbnREaWN0Kj4gbV9lbmNoYW50RGljdHM7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoU1BFTExDSEVDSykKKworI2VuZGlm
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0
L2d0ay9DaGFuZ2VMb2cKaW5kZXggYmU1NDg1ZC4uODU4N2VhNiAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYktpdC9ndGsvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvZ3RrL0NoYW5nZUxvZwpA
QCAtMSwzICsxLDI0IEBACisyMDEyLTA3LTE4ICBNYXJpbyBTYW5jaGV6IFByYWRhICA8bXNhbmNo
ZXpAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBBZGQgYSBuZXcgYW5kIHJldXNhYmxlIGVu
Y2hhbnQtYmFzZWQgc3BlbGxjaGVja2VyIGluIFdlYkNvcmUKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkwMjY5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVtb3ZlIGVuY2hhbnQgc3BlY2lmaWMgY29kZSBm
cm9tIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnQgYW5kCisgICAgICAgIGltcGxlbWVudCBpdCBy
ZWx5aW5nIGluIHRoZSBuZXcgVGV4dENoZWNrZXJFbmNoYW50IGNsYXNzIGluIFdlYkNvcmUuCisK
KyAgICAgICAgKiB3ZWJraXQvd2Via2l0c3BlbGxjaGVja2VyZW5jaGFudC5jcHA6CisgICAgICAg
IChfV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUpOgorICAgICAgICAod2Via2l0X3Nw
ZWxsX2NoZWNrZXJfZW5jaGFudF9maW5hbGl6ZSk6CisgICAgICAgICh3ZWJraXRfc3BlbGxfY2hl
Y2tlcl9lbmNoYW50X2NsYXNzX2luaXQpOgorICAgICAgICAod2Via2l0X3NwZWxsX2NoZWNrZXJf
ZW5jaGFudF9pbml0KToKKyAgICAgICAgKGNoZWNrU3BlbGxpbmdPZlN0cmluZyk6CisgICAgICAg
IChnZXRHdWVzc2VzRm9yV29yZCk6CisgICAgICAgICh1cGRhdGVTcGVsbENoZWNraW5nTGFuZ3Vh
Z2VzKToKKyAgICAgICAgKGxlYXJuV29yZCk6CisgICAgICAgIChpZ25vcmVXb3JkKToKKwogMjAx
Mi0wNy0xNyAgVml2ZWsgR2FsYXRhZ2UgIDx2aXZla2dhbGF0YWdlQGdtYWlsLmNvbT4KIAogICAg
ICAgICBXZWIgSW5zcGVjdG9yOiByZWZhY3RvciBJbnNwZWN0b3JDb250cm9sbGVyOjpjb25uZWN0
RnJvbnRlbmQoKSB0byBhY2NlcHQgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3Bw
IGIvU291cmNlL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3Bw
CmluZGV4IDBlYjQ5ODYuLjc5OTc2OTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvZ3RrL3dl
YmtpdC93ZWJraXRzcGVsbGNoZWNrZXJlbmNoYW50LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2d0
ay93ZWJraXQvd2Via2l0c3BlbGxjaGVja2VyZW5jaGFudC5jcHAKQEAgLTIxLDEyICsyMSwxNCBA
QAogCiAjaWYgRU5BQkxFKFNQRUxMQ0hFQ0spCiAKKyNpbmNsdWRlICJUZXh0Q2hlY2tlckVuY2hh
bnQuaCIKICNpbmNsdWRlICJ3ZWJraXRzcGVsbGNoZWNrZXIuaCIKLSNpbmNsdWRlIDxlbmNoYW50
Lmg+CiAjaW5jbHVkZSA8Z3RrL2d0ay5oPgogI2luY2x1ZGUgPHd0Zi9nb2JqZWN0L0dPd25QdHIu
aD4KICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKK3VzaW5nIG5hbWVzcGFjZSBXZWJD
b3JlOworCiAvKioKICAqIFNFQ1RJT046d2Via2l0c3BlbGxjaGVja2VyZW5jaGFudAogICogQHNo
b3J0X2Rlc2NyaXB0aW9uOiB0aGUgZGVmYXVsdCBzcGVsbCBjaGVja2luZyBpbXBsZW1lbnRhdGlv
biBmb3IgV2ViS2l0R1RLKy4KQEAgLTM1LDEwICszNyw5IEBACiAgKiBXZWJLaXRHVEsrLiBJdCB1
c2VzIHRoZSBFbmNoYW50IGRpY3Rpb25hcmllcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSB0bwog
ICogY29ycmVjdCBzcGVsbGluZy4KICAqLwotc3RhdGljIEVuY2hhbnRCcm9rZXIqIGJyb2tlciA9
IDA7CiAKIHN0cnVjdCBfV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUgewotICAgIEdT
TGlzdCogZW5jaGFudERpY3RzOworICAgIFJlZlB0cjxUZXh0Q2hlY2tlckVuY2hhbnQ+IHRleHRD
aGVja2VyRW5jaGFudDsKIH07CiAKIHN0YXRpYyB2b2lkIHdlYmtpdF9zcGVsbF9jaGVja2VyX2Vu
Y2hhbnRfc3BlbGxfY2hlY2tlcl9pbnRlcmZhY2VfaW5pdChXZWJLaXRTcGVsbENoZWNrZXJJbnRl
cmZhY2UqIGludGVyZmFjZSk7CkBAIC00NywzNSArNDgsMTYgQEAgR19ERUZJTkVfVFlQRV9XSVRI
X0NPREUoV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudCwgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5j
aGFudCwKICAgICAgICAgICAgICAgICAgICAgICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRShXRUJL
SVRfVFlQRV9TUEVMTF9DSEVDS0VSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfc3BlbGxfY2hlY2tlcl9p
bnRlcmZhY2VfaW5pdCkpCiAKLXN0YXRpYyB2b2lkIGNyZWF0ZUVuY2hhbnRCcm9rZXJJZk5lZWRl
ZCgpCi17Ci0gICAgaWYgKCFicm9rZXIpCi0gICAgICAgIGJyb2tlciA9IGVuY2hhbnRfYnJva2Vy
X2luaXQoKTsKLX0KLQotc3RhdGljIHZvaWQgZnJlZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZShncG9p
bnRlciBkYXRhLCBncG9pbnRlcikKLXsKLSAgICBjcmVhdGVFbmNoYW50QnJva2VySWZOZWVkZWQo
KTsKLQotICAgIGVuY2hhbnRfYnJva2VyX2ZyZWVfZGljdChicm9rZXIsIHN0YXRpY19jYXN0PEVu
Y2hhbnREaWN0Kj4oZGF0YSkpOwotfQotCiBzdGF0aWMgdm9pZCB3ZWJraXRfc3BlbGxfY2hlY2tl
cl9lbmNoYW50X2ZpbmFsaXplKEdPYmplY3QqIG9iamVjdCkKIHsKICAgICBXZWJLaXRTcGVsbENo
ZWNrZXJFbmNoYW50UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VOQ0hBTlQo
b2JqZWN0KS0+cHJpdjsKLQotICAgIGdfc2xpc3RfZm9yZWFjaChwcml2LT5lbmNoYW50RGljdHMs
IGZyZWVTcGVsbENoZWNraW5nTGFuZ3VhZ2UsIDApOwotICAgIGdfc2xpc3RfZnJlZShwcml2LT5l
bmNoYW50RGljdHMpOwotCi0gICAgV0VCS0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChvYmplY3Qp
LT5wcml2LT5+V2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUoKTsKKyAgICBwcml2LT5+
V2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUoKTsKIH0KIAogc3RhdGljIHZvaWQgd2Vi
a2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9jbGFzc19pbml0KFdlYktpdFNwZWxsQ2hlY2tlckVu
Y2hhbnRDbGFzcyoga2xhc3MpCiB7CiAgICAgR09iamVjdENsYXNzKiBvYmplY3RDbGFzcyA9IEdf
T0JKRUNUX0NMQVNTKGtsYXNzKTsKLQogICAgIG9iamVjdENsYXNzLT5maW5hbGl6ZSA9IHdlYmtp
dF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfZmluYWxpemU7Ci0KICAgICBnX3R5cGVfY2xhc3NfYWRk
X3ByaXZhdGUoa2xhc3MsIHNpemVvZihXZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSkp
OwogfQogCkBAIC04NSwxNDkgKzY3LDM4IEBAIHN0YXRpYyB2b2lkIHdlYmtpdF9zcGVsbF9jaGVj
a2VyX2VuY2hhbnRfaW5pdChXZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50KiBjaGVja2VyCiAgICAg
Y2hlY2tlci0+cHJpdiA9IHByaXY7CiAgICAgbmV3IChwcml2KSBXZWJLaXRTcGVsbENoZWNrZXJF
bmNoYW50UHJpdmF0ZSgpOwogCi0gICAgcHJpdi0+ZW5jaGFudERpY3RzID0gMDsKLX0KLQotc3Rh
dGljIGJvb2wgd29yZEVuZElzQUNvbnRyYWN0aW9uQXBvc3Ryb3BoZShjb25zdCBjaGFyKiBzdHJp
bmcsIGxvbmcgb2Zmc2V0KQotewotICAgIGlmIChnX3V0ZjhfZ2V0X2NoYXIoZ191dGY4X29mZnNl
dF90b19wb2ludGVyKHN0cmluZywgb2Zmc2V0KSkgIT0gZ191dGY4X2dldF9jaGFyKCInIikpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgY2hhcmFj
dGVyIGluIHRoZSBzdHJpbmcsIGl0IGNhbm5vdCBiZSB0aGUgYXBvc3Ryb3BoZSBwYXJ0IG9mIGEg
Y29udHJhY3Rpb24uCi0gICAgaWYgKG9mZnNldCA9PSBnX3V0Zjhfc3RybGVuKHN0cmluZywgLTEp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gZ191bmljaGFyX2lzYWxwaGEo
Z191dGY4X2dldF9jaGFyKGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIG9mZnNldCAr
IDEpKSk7CisgICAgcHJpdi0+dGV4dENoZWNrZXJFbmNoYW50ID0gVGV4dENoZWNrZXJFbmNoYW50
OjpjcmVhdGUoKTsKIH0KIAogc3RhdGljIHZvaWQgY2hlY2tTcGVsbGluZ09mU3RyaW5nKFdlYktp
dFNwZWxsQ2hlY2tlciogY2hlY2tlciwgY29uc3QgY2hhciogc3RyaW5nLCBpbnQqIG1pc3NwZWxs
aW5nTG9jYXRpb24sIGludCogbWlzc3BlbGxpbmdMZW5ndGgpCiB7CiAgICAgV2ViS2l0U3BlbGxD
aGVja2VyRW5jaGFudFByaXZhdGUqIHByaXYgPSBXRUJLSVRfU1BFTExfQ0hFQ0tFUl9FTkNIQU5U
KGNoZWNrZXIpLT5wcml2OwotCi0gICAgR1NMaXN0KiBkaWN0cyA9IHByaXYtPmVuY2hhbnREaWN0
czsKLSAgICBpZiAoIWRpY3RzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpbnQgbGVuZ3RoID0g
Z191dGY4X3N0cmxlbihzdHJpbmcsIC0xKTsKLQotICAgIFBhbmdvTGFuZ3VhZ2UqIGxhbmd1YWdl
KHBhbmdvX2xhbmd1YWdlX2dldF9kZWZhdWx0KCkpOwotICAgIEdPd25QdHI8UGFuZ29Mb2dBdHRy
PiBhdHRycyhnX25ldyhQYW5nb0xvZ0F0dHIsIGxlbmd0aCArIDEpKTsKLQotICAgIC8vIHBhbmdv
X2dldF9sb2dfYXR0cnMgdXNlcyBhbiBhZGl0aW9uYWwgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0
aGUgdGV4dC4KLSAgICBwYW5nb19nZXRfbG9nX2F0dHJzKHN0cmluZywgLTEsIC0xLCBsYW5ndWFn
ZSwgYXR0cnMuZ2V0KCksIGxlbmd0aCArIDEpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBs
ZW5ndGggKyAxOyBpKyspIHsKLSAgICAgICAgLy8gV2UgZ28gdGhyb3VnaCBlYWNoIGNoYXJhY3Rl
ciB1bnRpbCB3ZSBmaW5kIGFuIGlzX3dvcmRfc3RhcnQsCi0gICAgICAgIC8vIHRoZW4gd2UgZ2V0
IGludG8gYW4gaW5uZXIgbG9vcCB0byBmaW5kIHRoZSBpc193b3JkX2VuZCBjb3JyZXNwb25kaW5n
Ci0gICAgICAgIC8vIHRvIGl0LgotICAgICAgICBpZiAoYXR0cnMuZ2V0KClbaV0uaXNfd29yZF9z
dGFydCkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gaTsKLSAgICAgICAgICAgIGludCBlbmQg
PSBpOwotICAgICAgICAgICAgaW50IHdvcmRMZW5ndGg7Ci0KLSAgICAgICAgICAgIHdoaWxlIChh
dHRycy5nZXQoKVtlbmRdLmlzX3dvcmRfZW5kIDwgMSB8fCB3b3JkRW5kSXNBQ29udHJhY3Rpb25B
cG9zdHJvcGhlKHN0cmluZywgZW5kKSkKLSAgICAgICAgICAgICAgICBlbmQrKzsKLQotICAgICAg
ICAgICAgd29yZExlbmd0aCA9IGVuZCAtIHN0YXJ0OwotICAgICAgICAgICAgLy8gU2V0IHRoZSBp
dGVyYXRvciB0byBiZSBhdCB0aGUgY3VycmVudCB3b3JkIGVuZCwgc28gd2UgZG9uJ3QKLSAgICAg
ICAgICAgIC8vIGNoZWNrIGNoYXJhY3RlcnMgdHdpY2UuCi0gICAgICAgICAgICBpID0gZW5kOwot
Ci0gICAgICAgICAgICBnY2hhciogY3N0YXJ0ID0gZ191dGY4X29mZnNldF90b19wb2ludGVyKHN0
cmluZywgc3RhcnQpOwotICAgICAgICAgICAgZ2ludCBieXRlcyA9IHN0YXRpY19jYXN0PGdpbnQ+
KGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIGVuZCkgLSBjc3RhcnQpOwotICAgICAg
ICAgICAgR093blB0cjxnY2hhcj4gd29yZChnX25ldzAoZ2NoYXIsIGJ5dGVzICsgMSkpOwotCi0g
ICAgICAgICAgICBnX3V0Zjhfc3RybmNweSh3b3JkLmdldCgpLCBjc3RhcnQsIHdvcmRMZW5ndGgp
OwotCi0gICAgICAgICAgICBmb3IgKDsgZGljdHM7IGRpY3RzID0gZGljdHMtPm5leHQpIHsKLSAg
ICAgICAgICAgICAgICBFbmNoYW50RGljdCogZGljdCA9IHN0YXRpY19jYXN0PEVuY2hhbnREaWN0
Kj4oZGljdHMtPmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChlbmNoYW50X2RpY3RfY2hlY2so
ZGljdCwgd29yZC5nZXQoKSwgd29yZExlbmd0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKm1p
c3NwZWxsaW5nTG9jYXRpb24gPSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgKm1pc3NwZWxs
aW5nTGVuZ3RoID0gd29yZExlbmd0aDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICAvLyBTdG9wIGNoZWNraW5nLCB0aGlzIHdvcmQgaXMgb2sgaW4gYXQgbGVh
c3Qgb25lIGRpY3QuCi0gICAgICAgICAgICAgICAgICAgICptaXNzcGVsbGluZ0xvY2F0aW9uID0g
LTE7Ci0gICAgICAgICAgICAgICAgICAgICptaXNzcGVsbGluZ0xlbmd0aCA9IDA7Ci0gICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KKyAgICBwcml2LT50ZXh0Q2hlY2tlckVuY2hhbnQtPmNoZWNrU3BlbGxp
bmdPZlN0cmluZyhTdHJpbmcoc3RyaW5nKSwgKm1pc3NwZWxsaW5nTG9jYXRpb24sICptaXNzcGVs
bGluZ0xlbmd0aCk7CiB9CiAKIHN0YXRpYyBjaGFyKiogZ2V0R3Vlc3Nlc0ZvcldvcmQoV2ViS2l0
U3BlbGxDaGVja2VyKiBjaGVja2VyLCBjb25zdCBjaGFyKiB3b3JkLCBjb25zdCBjaGFyKiBjb250
ZXh0KQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKiBwcml2ID0gV0VC
S0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChjaGVja2VyKS0+cHJpdjsKIAotICAgIEdTTGlzdCog
ZGljdHMgPSBwcml2LT5lbmNoYW50RGljdHM7Ci0gICAgY2hhcioqIGd1ZXNzZXMgPSAwOworICAg
IFZlY3RvcjxTdHJpbmc+IGd1ZXNzZXMgPSBwcml2LT50ZXh0Q2hlY2tlckVuY2hhbnQtPmdldEd1
ZXNzZXNGb3JXb3JkKFN0cmluZyh3b3JkKSk7CiAKLSAgICBmb3IgKDsgZGljdHM7IGRpY3RzID0g
ZGljdHMtPm5leHQpIHsKLSAgICAgICAgc2l6ZV90IG51bWJlck9mU3VnZ2VzdGlvbnM7Ci0gICAg
ICAgIHNpemVfdCBpOworICAgIGlmIChndWVzc2VzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IDA7CiAKLSAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBzdGF0aWNfY2FzdDxFbmNoYW50RGlj
dCo+KGRpY3RzLT5kYXRhKTsKLSAgICAgICAgZ2NoYXIqKiBzdWdnZXN0aW9ucyA9IGVuY2hhbnRf
ZGljdF9zdWdnZXN0KGRpY3QsIHdvcmQsIC0xLCAmbnVtYmVyT2ZTdWdnZXN0aW9ucyk7CisgICAg
aW50IGkgPSAwOworICAgIGludCBudW1iZXJPZkd1ZXNzZXMgPSBndWVzc2VzLnNpemUoKTsKKyAg
ICBjaGFyKiogZ3Vlc3Nlc0FycmF5ID0gc3RhdGljX2Nhc3Q8Y2hhcioqPihnX21hbGxvYzAoKG51
bWJlck9mR3Vlc3NlcyArIDEpICogc2l6ZW9mKGNoYXIqKSkpOworICAgIGZvciAoVmVjdG9yPFN0
cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBndWVzc2VzLmJlZ2luKCk7IGl0ZXIgIT0gZ3Vl
c3Nlcy5lbmQoKTsgKytpdGVyKQorICAgICAgICBndWVzc2VzQXJyYXlbaSsrXSA9IGdfc3RyZHVw
KGl0ZXItPnV0ZjgoKS5kYXRhKCkpOworICAgIGd1ZXNzZXNBcnJheVtpXSA9IDA7CiAKLSAgICAg
ICAgaWYgKG51bWJlck9mU3VnZ2VzdGlvbnMgPiAwKSB7Ci0gICAgICAgICAgICBpZiAobnVtYmVy
T2ZTdWdnZXN0aW9ucyA+IDEwKQotICAgICAgICAgICAgICAgIG51bWJlck9mU3VnZ2VzdGlvbnMg
PSAxMDsKLQotICAgICAgICAgICAgZ3Vlc3NlcyA9IHN0YXRpY19jYXN0PGNoYXIqKj4oZ19tYWxs
b2MwKChudW1iZXJPZlN1Z2dlc3Rpb25zICsgMSkgKiBzaXplb2YoY2hhciopKSk7Ci0gICAgICAg
ICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyT2ZTdWdnZXN0aW9ucyAmJiBpIDwgMTA7IGkrKykK
LSAgICAgICAgICAgICAgICBndWVzc2VzW2ldID0gZ19zdHJkdXAoc3VnZ2VzdGlvbnNbaV0pOwot
Ci0gICAgICAgICAgICBndWVzc2VzW2ldID0gMDsKLQotICAgICAgICAgICAgZW5jaGFudF9kaWN0
X2ZyZWVfc3VnZ2VzdGlvbnMoZGljdCwgc3VnZ2VzdGlvbnMpOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGd1ZXNzZXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldEF2YWlsYWJsZURpY3Rp
b25hcmllc0NhbGxiYWNrKGNvbnN0IGNoYXIqIGNvbnN0IGxhbmd1YWdlVGFnLCBjb25zdCBjaGFy
KiBjb25zdCwgY29uc3QgY2hhciogY29uc3QsIGNvbnN0IGNoYXIqIGNvbnN0LCB2b2lkKiBkYXRh
KQotewotICAgIFZlY3RvcjxDU3RyaW5nPiogZGljdHMgPSBzdGF0aWNfY2FzdDxWZWN0b3I8Q1N0
cmluZz4qPihkYXRhKTsKLQotICAgIGRpY3RzLT5hcHBlbmQobGFuZ3VhZ2VUYWcpOworICAgIHJl
dHVybiBndWVzc2VzQXJyYXk7CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZVNwZWxsQ2hlY2tpbmdM
YW5ndWFnZXMoV2ViS2l0U3BlbGxDaGVja2VyKiBjaGVja2VyLCBjb25zdCBjaGFyKiBsYW5ndWFn
ZXMpCiB7Ci0gICAgR1NMaXN0KiBzcGVsbERpY3Rpb25hcmllcyA9IDA7Ci0KICAgICBXZWJLaXRT
cGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VO
Q0hBTlQoY2hlY2tlciktPnByaXY7Ci0KLSAgICBjcmVhdGVFbmNoYW50QnJva2VySWZOZWVkZWQo
KTsKLQotICAgIGlmIChsYW5ndWFnZXMpIHsKLSAgICAgICAgY2hhcioqIGxhbmdzID0gZ19zdHJz
cGxpdChsYW5ndWFnZXMsICIsIiwgLTEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgbGFuZ3Nb
aV07IGkrKykgewotICAgICAgICAgICAgaWYgKGVuY2hhbnRfYnJva2VyX2RpY3RfZXhpc3RzKGJy
b2tlciwgbGFuZ3NbaV0pKSB7Ci0gICAgICAgICAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBl
bmNoYW50X2Jyb2tlcl9yZXF1ZXN0X2RpY3QoYnJva2VyLCBsYW5nc1tpXSk7Ci0gICAgICAgICAg
ICAgICAgc3BlbGxEaWN0aW9uYXJpZXMgPSBnX3NsaXN0X2FwcGVuZChzcGVsbERpY3Rpb25hcmll
cywgZGljdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ19zdHJmcmVldihs
YW5ncyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgY2hhciogbGFuZ3VhZ2UgPSBwYW5n
b19sYW5ndWFnZV90b19zdHJpbmcoZ3RrX2dldF9kZWZhdWx0X2xhbmd1YWdlKCkpOwotICAgICAg
ICBpZiAoZW5jaGFudF9icm9rZXJfZGljdF9leGlzdHMoYnJva2VyLCBsYW5ndWFnZSkpIHsKLSAg
ICAgICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0
KGJyb2tlciwgbGFuZ3VhZ2UpOwotICAgICAgICAgICAgc3BlbGxEaWN0aW9uYXJpZXMgPSBnX3Ns
aXN0X2FwcGVuZChzcGVsbERpY3Rpb25hcmllcywgZGljdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAvLyBObyBkaWN0aW9uYXJpZXMgc2VsZWN0ZWQsIHdlIGdldCBvbmUgZnJvbSB0
aGUgbGlzdC4KLSAgICAgICAgICAgIFZlY3RvcjxDU3RyaW5nPiBhbGxEaWN0aW9uYXJpZXM7Ci0g
ICAgICAgICAgICBlbmNoYW50X2Jyb2tlcl9saXN0X2RpY3RzKGJyb2tlciwgZ2V0QXZhaWxhYmxl
RGljdGlvbmFyaWVzQ2FsbGJhY2ssICZhbGxEaWN0aW9uYXJpZXMpOwotICAgICAgICAgICAgaWYg
KCFhbGxEaWN0aW9uYXJpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgRW5jaGFudERp
Y3QqIGRpY3QgPSBlbmNoYW50X2Jyb2tlcl9yZXF1ZXN0X2RpY3QoYnJva2VyLCBhbGxEaWN0aW9u
YXJpZXNbMF0uZGF0YSgpKTsKLSAgICAgICAgICAgICAgICBzcGVsbERpY3Rpb25hcmllcyA9IGdf
c2xpc3RfYXBwZW5kKHNwZWxsRGljdGlvbmFyaWVzLCBkaWN0KTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KLSAgICBnX3NsaXN0X2ZvcmVhY2gocHJpdi0+ZW5jaGFudERpY3RzLCBm
cmVlU3BlbGxDaGVja2luZ0xhbmd1YWdlLCAwKTsKLSAgICBnX3NsaXN0X2ZyZWUocHJpdi0+ZW5j
aGFudERpY3RzKTsKLSAgICBwcml2LT5lbmNoYW50RGljdHMgPSBzcGVsbERpY3Rpb25hcmllczsK
KyAgICBwcml2LT50ZXh0Q2hlY2tlckVuY2hhbnQtPnVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFn
ZXMoU3RyaW5nKGxhbmd1YWdlcykpOwogfQogCiBzdGF0aWMgY2hhciogZ2V0QXV0b2NvcnJlY3RT
dWdnZXN0aW9uc0Zvck1pc3NwZWxsZWRXb3JkKFdlYktpdFNwZWxsQ2hlY2tlciogY2hlY2tlciwg
Y29uc3QgY2hhciogd29yZCkKQEAgLTIzOCwyNSArMTA5LDEzIEBAIHN0YXRpYyBjaGFyKiBnZXRB
dXRvY29ycmVjdFN1Z2dlc3Rpb25zRm9yTWlzc3BlbGxlZFdvcmQoV2ViS2l0U3BlbGxDaGVja2Vy
KiBjaGVjCiBzdGF0aWMgdm9pZCBsZWFybldvcmQoV2ViS2l0U3BlbGxDaGVja2VyKiBjaGVja2Vy
LCBjb25zdCBjaGFyKiB3b3JkKQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2
YXRlKiBwcml2ID0gV0VCS0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChjaGVja2VyKS0+cHJpdjsK
LSAgICBHU0xpc3QqIGRpY3RzID0gcHJpdi0+ZW5jaGFudERpY3RzOwotCi0gICAgZm9yICg7IGRp
Y3RzOyBkaWN0cyA9IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0g
c3RhdGljX2Nhc3Q8RW5jaGFudERpY3QqPihkaWN0cy0+ZGF0YSk7Ci0KLSAgICAgICAgZW5jaGFu
dF9kaWN0X2FkZF90b19wZXJzb25hbChkaWN0LCB3b3JkLCAtMSk7Ci0gICAgfQorICAgIHByaXYt
PnRleHRDaGVja2VyRW5jaGFudC0+bGVhcm5Xb3JkKFN0cmluZyh3b3JkKSk7CiB9CiAKIHN0YXRp
YyB2b2lkIGlnbm9yZVdvcmQoV2ViS2l0U3BlbGxDaGVja2VyKiBjaGVja2VyLCBjb25zdCBjaGFy
KiB3b3JkKQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKiBwcml2ID0g
V0VCS0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChjaGVja2VyKS0+cHJpdjsKLSAgICBHU0xpc3Qq
IGRpY3RzID0gcHJpdi0+ZW5jaGFudERpY3RzOwotCi0gICAgZm9yICg7IGRpY3RzOyBkaWN0cyA9
IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gc3RhdGljX2Nhc3Q8
RW5jaGFudERpY3QqPihkaWN0cy0+ZGF0YSk7Ci0KLSAgICAgICAgZW5jaGFudF9kaWN0X2FkZF90
b19zZXNzaW9uKGRpY3QsIHdvcmQsIC0xKTsKLSAgICB9CisgICAgcHJpdi0+dGV4dENoZWNrZXJF
bmNoYW50LT5pZ25vcmVXb3JkKFN0cmluZyh3b3JkKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHdlYmtp
dF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfc3BlbGxfY2hlY2tlcl9pbnRlcmZhY2VfaW5pdChXZWJL
aXRTcGVsbENoZWNrZXJJbnRlcmZhY2UqIGludGVyZmFjZSkKLS0gCjEuNy4xMC40Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>155504</attachid>
            <date>2012-07-31 05:30:04 -0700</date>
            <delta_ts>2012-08-02 06:52:44 -0700</delta_ts>
            <desc>Patch proposal</desc>
            <filename>0001-GTK-Add-a-new-and-reusable-enchant-based-spellchecke.patch</filename>
            <type>text/plain</type>
            <size>25275</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSBhYTBhYjg4MTc2YmY5ZjZhODc4NTNlZGQzMWFiNGNmMzNhZTE0ZDgxIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiAibWFyaW9Ad2Via2l0Lm9yZyIKIDxtYXJpb0B3ZWJraXQub3Jn
QDI2OGY0NWNjLWNkMDktMDQxMC1hYjNjLWQ1MjY5MWI0ZGJmYz4KRGF0ZTogU2F0LCAyOCBKdWwg
MjAxMiAxODoyODoyNiArMDAwMApTdWJqZWN0OiBbUEFUQ0ggMS8yXSBbR1RLXSBBZGQgYSBuZXcg
YW5kIHJldXNhYmxlIGVuY2hhbnQtYmFzZWQgc3BlbGxjaGVja2VyCiBpbiBXZWJDb3JlCiBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTAyNjkKCi0tLQogU291cmNlL1dl
YkNvcmUvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDI3ICsrKwogU291
cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0gICAgICAgICAgICAgICAgICAgICAgfCAgIDExICst
CiBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtICAgICAgICAgICAgICAgICB8ICAg
MTAgKwogLi4uL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5jcHAgICAgICAg
fCAgMTk2ICsrKysrKysrKysrKysrKysrKysrCiAuLi4vV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0
ay9UZXh0Q2hlY2tlckVuY2hhbnQuaCB8ICAgNTggKysrKysrCiBTb3VyY2UvV2ViS2l0L2d0ay9D
aGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMjEgKysrCiAuLi4vZ3RrL3dlYmtp
dC93ZWJraXRzcGVsbGNoZWNrZXJlbmNoYW50LmNwcCAgICAgICB8ICAxODIgKysrLS0tLS0tLS0t
LS0tLS0tCiA3IGZpbGVzIGNoYW5nZWQsIDM0MyBpbnNlcnRpb25zKCspLCAxNjIgZGVsZXRpb25z
KC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsv
VGV4dENoZWNrZXJFbmNoYW50LmNwcAogY3JlYXRlIG1vZGUgMTAwNjQ0IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5oCgpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDBj
ZTIxOGIuLjk1MWEzZjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZworKysg
Yi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMCBAQAorMjAxMi0wNy0zMSAg
TWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dU
S10gQWRkIGEgbmV3IGFuZCByZXVzYWJsZSBlbmNoYW50LWJhc2VkIHNwZWxsY2hlY2tlciBpbiBX
ZWJDb3JlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05
MDI2OQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE1v
dmUgZW5jaGFudCBzcGVjaWZpYyBjb2RlIGRvd24gdG8gV2ViQ29yZSwgaW50byBhIG5ldyBjbGFz
cworICAgICAgICBUZXh0Q2hlY2tlckVuY2hhbnQsIHRoYXQgd2UgY2FuIHVzZSBmcm9tIFdLMSBh
bmQgV0syLgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06IEFkZCBmbGFncyB0byBoYW5kbGUg
dGhlIFNQRUxMQ0hFQ0sgZmVhdHVyZS4KKyAgICAgICAgKiBHTlVtYWtlZmlsZS5saXN0LmFtOiBB
ZGRlZCBuZXcgZmlsZXMuCisgICAgICAgICogcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJF
bmNoYW50LmNwcDogQWRkZWQuCisgICAgICAgIChnZXRBdmFpbGFibGVEaWN0aW9uYXJpZXNDYWxs
YmFjayk6CisgICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OlRleHRDaGVja2VyRW5jaGFudCk6
CisgICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6On5UZXh0Q2hlY2tlckVuY2hhbnQpOgorICAg
ICAgICAoVGV4dENoZWNrZXJFbmNoYW50OjppZ25vcmVXb3JkKToKKyAgICAgICAgKFRleHRDaGVj
a2VyRW5jaGFudDo6bGVhcm5Xb3JkKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6Y2hl
Y2tTcGVsbGluZ09mU3RyaW5nKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6Z2V0R3Vl
c3Nlc0ZvcldvcmQpOgorICAgICAgICAoVGV4dENoZWNrZXJFbmNoYW50Ojp1cGRhdGVTcGVsbENo
ZWNraW5nTGFuZ3VhZ2VzKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudDo6ZnJlZUVuY2hh
bnRCcm9rZXJEaWN0aW9uYXJpZXMpOgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvZ3RrL1RleHRD
aGVja2VyRW5jaGFudC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoVGV4
dENoZWNrZXJFbmNoYW50KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRDaGVja2VyRW5jaGFudDo6
Y3JlYXRlKToKKwogMjAxMi0wNy0zMSAgUmF1bCBIdWRlYSAgPHJodWRlYUBhZG9iZS5jb20+CiAK
ICAgICAgICAgSW5zcGVjdG9yIGNyYXNoZXMgd2hlbiB0cnlpbmcgdG8gaW5zcGVjdCBhIHBhZ2Ug
d2l0aCBDU1MgcmVnaW9uIHN0eWxpbmcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmFtIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KaW5kZXggYmExMGFmMS4u
MGMyNzhiNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KKysrIGIv
U291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KQEAgLTExNyw3ICsxMTcsOCBAQCB3ZWJjb3Jl
Z3RrX2NwcGZsYWdzICs9IFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9nc3RyZWFtZXIgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2d0ayBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Rr
IFwKLQktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAKKwkt
SSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAgXAorCS1JJChz
cmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrCiAKICMgLS0tCiAjIEZlYXR1
cmVzIGVuYWJsZWQgYnkgZGVmYXVsdCBhdCBjb21waWxhdGlvbiB0aW1lCkBAIC03NDgsNiArNzQ5
LDE0IEBAIEZFQVRVUkVfREVGSU5FUyArPSBFTkFCTEVfTElOS19QUkVGRVRDSD0xCiB3ZWJjb3Jl
X2NwcGZsYWdzICs9IC1ERU5BQkxFX0xJTktfUFJFRkVUQ0g9MQogZW5kaWYgICMgRU5EIEVOQUJM
RV9MSU5LX1BSRUZFVENICiAKKyMgLS0tCisjIFNwZWxsIGNoZWNrIHN1cHBvcnQKKyMgLS0tCitp
ZiBFTkFCTEVfU1BFTExDSEVDSworRkVBVFVSRV9ERUZJTkVTICs9IEVOQUJMRV9TUEVMTENIRUNL
PTEKK3dlYmNvcmVfY3BwZmxhZ3MgKz0gLURFTkFCTEVfU1BFTExDSEVDSz0xCitlbmRpZiAgIyBF
TkQgRU5BQkxFX1NQRUxMQ0hFQ0sKKwogRGVyaXZlZFNvdXJjZXMvV2ViQ29yZS9DU1NQcm9wZXJ0
eU5hbWVzLmNwcDogRGVyaXZlZFNvdXJjZXMvV2ViQ29yZS9DU1NQcm9wZXJ0eU5hbWVzLmgKIERl
cml2ZWRTb3VyY2VzL1dlYkNvcmUvQ1NTUHJvcGVydHlOYW1lcy5oOiAkKFdFQkNPUkVfQ1NTX1BS
T1BFUlRZX05BTUVTKSAkKFdlYkNvcmUpL2Nzcy9tYWtlcHJvcC5wbAogCSQoQU1fVl9HRU4pCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtIGIvU291cmNlL1dl
YkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQppbmRleCBmNDhkN2Q3Li45M2Y1MTdmIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCisrKyBiL1NvdXJjZS9XZWJD
b3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KQEAgLTYyOTIsMyArNjI5MiwxMyBAQCBkb21fYmluZGlu
Z19pZGxzICs9IFwKIAkkKFdlYkNvcmUpL01vZHVsZXMvcXVvdGEvU3RvcmFnZUluZm9Vc2FnZUNh
bGxiYWNrLmlkbAogCiBlbmRpZiAgIyBFTkQgRU5BQkxFX1FVT1RBCisKKyMgLS0tLQorIyBTcGVs
bCBjaGVjayBzdXBwb3J0CisjIC0tLS0KK2lmIEVOQUJMRV9TUEVMTENIRUNLCit3ZWJjb3JlX3Nv
dXJjZXMgKz0gXAorCVNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2Vy
RW5jaGFudC5oIFwKKwlTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tl
ckVuY2hhbnQuY3BwCitlbmRpZiAjIEVORCBFTkFCTEVfU1BFTExDSEVDSworCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNoYW50LmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQ5OWMwCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNo
YW50LmNwcApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgSWdh
bGlhIFMuTC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGlj
ZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBT
b2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJUZXh0Q2hlY2tlckVuY2hhbnQuaCIKKworI2lmIEVOQUJMRShTUEVM
TENIRUNLKQorCisjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4KKyNpbmNsdWRlIDx3dGYvZ29iamVj
dC9HT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCit1c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBtYXhpbXVtTnVtYmVyT2ZTdWdn
ZXN0aW9ucyA9IDEwOworCitzdGF0aWMgdm9pZCBnZXRBdmFpbGFibGVEaWN0aW9uYXJpZXNDYWxs
YmFjayhjb25zdCBjaGFyKiBjb25zdCBsYW5ndWFnZVRhZywgY29uc3QgY2hhciogY29uc3QsIGNv
bnN0IGNoYXIqIGNvbnN0LCBjb25zdCBjaGFyKiBjb25zdCwgdm9pZCogZGF0YSkKK3sKKyAgICBW
ZWN0b3I8Q1N0cmluZz4qIGRpY3Rpb25hcmllcyA9IHN0YXRpY19jYXN0PFZlY3RvcjxDU3RyaW5n
Pio+KGRhdGEpOworICAgIGRpY3Rpb25hcmllcy0+YXBwZW5kKGxhbmd1YWdlVGFnKTsKK30KKwor
c3RhdGljIGJvb2wgd29yZEVuZElzQUNvbnRyYWN0aW9uQXBvc3Ryb3BoZShjb25zdCBjaGFyKiBz
dHJpbmcsIGxvbmcgb2Zmc2V0KQoreworICAgIGlmIChnX3V0ZjhfZ2V0X2NoYXIoZ191dGY4X29m
ZnNldF90b19wb2ludGVyKHN0cmluZywgb2Zmc2V0KSkgIT0gZ191dGY4X2dldF9jaGFyKCInIikp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgY2hh
cmFjdGVyIGluIHRoZSBzdHJpbmcsIGl0IGNhbm5vdCBiZSB0aGUgYXBvc3Ryb3BoZSBwYXJ0IG9m
IGEgY29udHJhY3Rpb24uCisgICAgaWYgKG9mZnNldCA9PSBnX3V0Zjhfc3RybGVuKHN0cmluZywg
LTEpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZ191bmljaGFyX2lzYWxw
aGEoZ191dGY4X2dldF9jaGFyKGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIG9mZnNl
dCArIDEpKSk7Cit9CisKK1RleHRDaGVja2VyRW5jaGFudDo6VGV4dENoZWNrZXJFbmNoYW50KCkK
KyAgICA6IG1fYnJva2VyKGVuY2hhbnRfYnJva2VyX2luaXQoKSkKKyAgICAsIG1fZW5jaGFudERp
Y3Rpb25hcmllcygwKQoreworfQorCitUZXh0Q2hlY2tlckVuY2hhbnQ6On5UZXh0Q2hlY2tlckVu
Y2hhbnQoKQoreworICAgIGlmICghbV9icm9rZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGZy
ZWVFbmNoYW50QnJva2VyRGljdGlvbmFyaWVzKCk7CisgICAgZW5jaGFudF9icm9rZXJfZnJlZSht
X2Jyb2tlcik7Cit9CisKK3ZvaWQgVGV4dENoZWNrZXJFbmNoYW50OjppZ25vcmVXb3JkKGNvbnN0
IFN0cmluZyYgd29yZCkKK3sKKyAgICBmb3IgKFZlY3RvcjxFbmNoYW50RGljdCo+Ojpjb25zdF9p
dGVyYXRvciBpdGVyID0gbV9lbmNoYW50RGljdGlvbmFyaWVzLmJlZ2luKCk7IGl0ZXIgIT0gbV9l
bmNoYW50RGljdGlvbmFyaWVzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGVuY2hhbnRfZGljdF9h
ZGRfdG9fc2Vzc2lvbigqaXRlciwgd29yZC51dGY4KCkuZGF0YSgpLCAtMSk7Cit9CisKK3ZvaWQg
VGV4dENoZWNrZXJFbmNoYW50OjpsZWFybldvcmQoY29uc3QgU3RyaW5nJiB3b3JkKQoreworICAg
IGZvciAoVmVjdG9yPEVuY2hhbnREaWN0Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBtX2VuY2hh
bnREaWN0aW9uYXJpZXMuYmVnaW4oKTsgaXRlciAhPSBtX2VuY2hhbnREaWN0aW9uYXJpZXMuZW5k
KCk7ICsraXRlcikKKyAgICAgICAgZW5jaGFudF9kaWN0X2FkZF90b19wZXJzb25hbCgqaXRlciwg
d29yZC51dGY4KCkuZGF0YSgpLCAtMSk7Cit9CisKK3ZvaWQgVGV4dENoZWNrZXJFbmNoYW50Ojpj
aGVja1NwZWxsaW5nT2ZTdHJpbmcoY29uc3QgU3RyaW5nJiBzdHJpbmcsIGludCYgbWlzc3BlbGxp
bmdMb2NhdGlvbiwgaW50JiBtaXNzcGVsbGluZ0xlbmd0aCkKK3sKKyAgICBpZiAobV9lbmNoYW50
RGljdGlvbmFyaWVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworICAgIFZlY3RvcjxFbmNo
YW50RGljdCo+Ojpjb25zdF9pdGVyYXRvciBkaWN0SXRlciA9IG1fZW5jaGFudERpY3Rpb25hcmll
cy5iZWdpbigpOworCisgICAgR093blB0cjxnY2hhcj4gY1N0cmluZyhnX3N0cmR1cChzdHJpbmcu
dXRmOCgpLmRhdGEoKSkpOworICAgIHNpemVfdCBsZW5ndGggPSBzdHJpbmcudXRmOCgpLmxlbmd0
aCgpOworCisgICAgUGFuZ29MYW5ndWFnZSogbGFuZ3VhZ2UocGFuZ29fbGFuZ3VhZ2VfZ2V0X2Rl
ZmF1bHQoKSk7CisgICAgR093blB0cjxQYW5nb0xvZ0F0dHI+IGF0dHJzKGdfbmV3KFBhbmdvTG9n
QXR0ciwgbGVuZ3RoICsgMSkpOworCisgICAgLy8gcGFuZ29fZ2V0X2xvZ19hdHRycyB1c2VzIGFu
IGFkaXRpb25hbCBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgorICAgIHBhbmdvX2dl
dF9sb2dfYXR0cnMoY1N0cmluZy5nZXQoKSwgLTEsIC0xLCBsYW5ndWFnZSwgYXR0cnMuZ2V0KCks
IGxlbmd0aCArIDEpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGggKyAxOyBp
KyspIHsKKyAgICAgICAgLy8gV2UgZ28gdGhyb3VnaCBlYWNoIGNoYXJhY3RlciB1bnRpbCB3ZSBm
aW5kIGFuIGlzX3dvcmRfc3RhcnQsCisgICAgICAgIC8vIHRoZW4gd2UgZ2V0IGludG8gYW4gaW5u
ZXIgbG9vcCB0byBmaW5kIHRoZSBpc193b3JkX2VuZCBjb3JyZXNwb25kaW5nCisgICAgICAgIC8v
IHRvIGl0LgorICAgICAgICBpZiAoYXR0cnMuZ2V0KClbaV0uaXNfd29yZF9zdGFydCkgeworICAg
ICAgICAgICAgaW50IHN0YXJ0ID0gaTsKKyAgICAgICAgICAgIGludCBlbmQgPSBpOworICAgICAg
ICAgICAgaW50IHdvcmRMZW5ndGg7CisKKyAgICAgICAgICAgIHdoaWxlIChhdHRycy5nZXQoKVtl
bmRdLmlzX3dvcmRfZW5kIDwgMSAgfHwgd29yZEVuZElzQUNvbnRyYWN0aW9uQXBvc3Ryb3BoZShj
U3RyaW5nLmdldCgpLCBlbmQpKQorICAgICAgICAgICAgICAgIGVuZCsrOworCisgICAgICAgICAg
ICB3b3JkTGVuZ3RoID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGl0ZXJh
dG9yIHRvIGJlIGF0IHRoZSBjdXJyZW50IHdvcmQgZW5kLCBzbyB3ZSBkb24ndAorICAgICAgICAg
ICAgLy8gY2hlY2sgY2hhcmFjdGVycyB0d2ljZS4KKyAgICAgICAgICAgIGkgPSBlbmQ7CisKKyAg
ICAgICAgICAgIGdjaGFyKiBjc3RhcnQgPSBnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoY1N0cmlu
Zy5nZXQoKSwgc3RhcnQpOworICAgICAgICAgICAgZ2ludCBieXRlcyA9IHN0YXRpY19jYXN0PGdp
bnQ+KGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihjU3RyaW5nLmdldCgpLCBlbmQpIC0gY3N0YXJ0
KTsKKyAgICAgICAgICAgIEdPd25QdHI8Z2NoYXI+IHdvcmQoZ19uZXcwKGdjaGFyLCBieXRlcyAr
IDEpKTsKKworICAgICAgICAgICAgZ191dGY4X3N0cm5jcHkod29yZC5nZXQoKSwgY3N0YXJ0LCB3
b3JkTGVuZ3RoKTsKKworICAgICAgICAgICAgZm9yICg7IGRpY3RJdGVyICE9IG1fZW5jaGFudERp
Y3Rpb25hcmllcy5lbmQoKTsgKytkaWN0SXRlcikgeworICAgICAgICAgICAgICAgIGlmIChlbmNo
YW50X2RpY3RfY2hlY2soKmRpY3RJdGVyLCB3b3JkLmdldCgpLCB3b3JkTGVuZ3RoKSkgeworICAg
ICAgICAgICAgICAgICAgICBtaXNzcGVsbGluZ0xvY2F0aW9uID0gc3RhcnQ7CisgICAgICAgICAg
ICAgICAgICAgIG1pc3NwZWxsaW5nTGVuZ3RoID0gd29yZExlbmd0aDsKKyAgICAgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGNoZWNraW5nLCB0aGlzIHdv
cmQgaXMgb2sgaW4gYXQgbGVhc3Qgb25lIGRpY3QuCisgICAgICAgICAgICAgICAgICAgIG1pc3Nw
ZWxsaW5nTG9jYXRpb24gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgbWlzc3BlbGxpbmdMZW5n
dGggPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1ZlY3RvcjxTdHJpbmc+IFRleHRD
aGVja2VyRW5jaGFudDo6Z2V0R3Vlc3Nlc0ZvcldvcmQoY29uc3QgU3RyaW5nJiB3b3JkKQorewor
ICAgIFZlY3RvcjxTdHJpbmc+IGd1ZXNzZXM7CisgICAgaWYgKG1fZW5jaGFudERpY3Rpb25hcmll
cy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBndWVzc2VzOworCisgICAgZm9yIChWZWN0b3I8
RW5jaGFudERpY3QqPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG1fZW5jaGFudERpY3Rpb25hcmll
cy5iZWdpbigpOyBpdGVyICE9IG1fZW5jaGFudERpY3Rpb25hcmllcy5lbmQoKTsgKytpdGVyKSB7
CisgICAgICAgIHNpemVfdCBudW1iZXJPZlN1Z2dlc3Rpb25zOworICAgICAgICBzaXplX3QgaTsK
KworICAgICAgICBnY2hhcioqIHN1Z2dlc3Rpb25zID0gZW5jaGFudF9kaWN0X3N1Z2dlc3QoKml0
ZXIsIHdvcmQudXRmOCgpLmRhdGEoKSwgLTEsICZudW1iZXJPZlN1Z2dlc3Rpb25zKTsKKyAgICAg
ICAgaWYgKG51bWJlck9mU3VnZ2VzdGlvbnMgPD0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgIGlmIChudW1iZXJPZlN1Z2dlc3Rpb25zID4gbWF4aW11bU51bWJlck9mU3VnZ2Vz
dGlvbnMpCisgICAgICAgICAgICBudW1iZXJPZlN1Z2dlc3Rpb25zID0gbWF4aW11bU51bWJlck9m
U3VnZ2VzdGlvbnM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mU3VnZ2VzdGlv
bnM7IGkrKykKKyAgICAgICAgICAgIGd1ZXNzZXMuYXBwZW5kKFN0cmluZyhzdWdnZXN0aW9uc1tp
XSkpOworCisgICAgICAgIGVuY2hhbnRfZGljdF9mcmVlX3N1Z2dlc3Rpb25zKCppdGVyLCBzdWdn
ZXN0aW9ucyk7CisgICAgfQorCisgICAgcmV0dXJuIGd1ZXNzZXM7Cit9CisKK3ZvaWQgVGV4dENo
ZWNrZXJFbmNoYW50Ojp1cGRhdGVTcGVsbENoZWNraW5nTGFuZ3VhZ2VzKGNvbnN0IFN0cmluZyYg
bGFuZ3VhZ2VzKQoreworICAgIFZlY3RvcjxFbmNoYW50RGljdCo+IHNwZWxsRGljdGlvbmFyaWVz
OworCisgICAgaWYgKCFsYW5ndWFnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIFZlY3RvcjxTdHJp
bmc+IGxhbmd1YWdlc1ZlY3RvcjsKKyAgICAgICAgbGFuZ3VhZ2VzLnNwbGl0KHN0YXRpY19jYXN0
PFVDaGFyPignLCcpLCBsYW5ndWFnZXNWZWN0b3IpOworICAgICAgICBmb3IgKFZlY3RvcjxTdHJp
bmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gbGFuZ3VhZ2VzVmVjdG9yLmJlZ2luKCk7IGl0ZXIg
IT0gbGFuZ3VhZ2VzVmVjdG9yLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgICAgIEdPd25QdHI8
Z2NoYXI+IGN1cnJlbnRMYW5ndWFnZShnX3N0cmR1cChpdGVyLT51dGY4KCkuZGF0YSgpKSk7Cisg
ICAgICAgICAgICBpZiAoZW5jaGFudF9icm9rZXJfZGljdF9leGlzdHMobV9icm9rZXIsIGN1cnJl
bnRMYW5ndWFnZS5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICBFbmNoYW50RGljdCogZGljdCA9
IGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfZGljdChtX2Jyb2tlciwgY3VycmVudExhbmd1YWdlLmdl
dCgpKTsKKyAgICAgICAgICAgICAgICBzcGVsbERpY3Rpb25hcmllcy5hcHBlbmQoZGljdCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBjaGFy
KiBsYW5ndWFnZSA9IHBhbmdvX2xhbmd1YWdlX3RvX3N0cmluZyhwYW5nb19sYW5ndWFnZV9nZXRf
ZGVmYXVsdCgpKTsKKyAgICAgICAgaWYgKGVuY2hhbnRfYnJva2VyX2RpY3RfZXhpc3RzKG1fYnJv
a2VyLCBsYW5ndWFnZSkpIHsKKyAgICAgICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gZW5jaGFu
dF9icm9rZXJfcmVxdWVzdF9kaWN0KG1fYnJva2VyLCBsYW5ndWFnZSk7CisgICAgICAgICAgICBz
cGVsbERpY3Rpb25hcmllcy5hcHBlbmQoZGljdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICAvLyBObyBkaWN0aW9uYXJpZXMgc2VsZWN0ZWQsIHdlIGdldCBvbmUgZnJvbSB0aGUgbGlz
dC4KKyAgICAgICAgICAgIFZlY3RvcjxDU3RyaW5nPiBhbGxEaWN0aW9uYXJpZXM7CisgICAgICAg
ICAgICBlbmNoYW50X2Jyb2tlcl9saXN0X2RpY3RzKG1fYnJva2VyLCBnZXRBdmFpbGFibGVEaWN0
aW9uYXJpZXNDYWxsYmFjaywgJmFsbERpY3Rpb25hcmllcyk7CisgICAgICAgICAgICBpZiAoIWFs
bERpY3Rpb25hcmllcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBFbmNoYW50RGljdCog
ZGljdCA9IGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfZGljdChtX2Jyb2tlciwgYWxsRGljdGlvbmFy
aWVzWzBdLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgc3BlbGxEaWN0aW9uYXJpZXMuYXBwZW5k
KGRpY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZyZWVFbmNoYW50
QnJva2VyRGljdGlvbmFyaWVzKCk7CisgICAgbV9lbmNoYW50RGljdGlvbmFyaWVzID0gc3BlbGxE
aWN0aW9uYXJpZXM7Cit9CisKK3ZvaWQgVGV4dENoZWNrZXJFbmNoYW50OjpmcmVlRW5jaGFudEJy
b2tlckRpY3Rpb25hcmllcygpCit7CisgICAgZm9yIChWZWN0b3I8RW5jaGFudERpY3QqPjo6Y29u
c3RfaXRlcmF0b3IgaXRlciA9IG1fZW5jaGFudERpY3Rpb25hcmllcy5iZWdpbigpOyBpdGVyICE9
IG1fZW5jaGFudERpY3Rpb25hcmllcy5lbmQoKTsgKytpdGVyKQorICAgICAgICBlbmNoYW50X2Jy
b2tlcl9mcmVlX2RpY3QobV9icm9rZXIsICppdGVyKTsKK30KKworI2VuZGlmIC8vIEVOQUJMRShT
UEVMTENIRUNLKQorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0
ay9UZXh0Q2hlY2tlckVuY2hhbnQuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3Rr
L1RleHRDaGVja2VyRW5jaGFudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjczOTc1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0
L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEyIElnYWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgVGV4dENoZWNrZXJFbmNoYW50X2gKKyNk
ZWZpbmUgVGV4dENoZWNrZXJFbmNoYW50X2gKKworI2lmIEVOQUJMRShTUEVMTENIRUNLKQorCisj
aW5jbHVkZSA8ZW5jaGFudC5oPgorI2luY2x1ZGUgPHd0Zi9GYXN0QWxsb2NCYXNlLmg+CisjaW5j
bHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
VGV4dENoZWNrZXJFbmNoYW50IHsKKyAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKKworcHVi
bGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPFRleHRDaGVja2VyRW5jaGFudD4gY3JlYXRlKCkg
eyByZXR1cm4gYWRvcHRQdHIobmV3IFRleHRDaGVja2VyRW5jaGFudCk7IH0KKyAgICB2aXJ0dWFs
IH5UZXh0Q2hlY2tlckVuY2hhbnQoKTsKKworICAgIHZvaWQgaWdub3JlV29yZChjb25zdCBTdHJp
bmcmKTsKKyAgICB2b2lkIGxlYXJuV29yZChjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGNoZWNr
U3BlbGxpbmdPZlN0cmluZyhjb25zdCBTdHJpbmcmLCBpbnQmIG1pc3NwZWxsaW5nTG9jYXRpb24s
IGludCYgbWlzc3BlbGxpbmdMZW5ndGgpOworICAgIFZlY3RvcjxTdHJpbmc+IGdldEd1ZXNzZXNG
b3JXb3JkKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgdXBkYXRlU3BlbGxDaGVja2luZ0xhbmd1
YWdlcyhjb25zdCBTdHJpbmcmIGxhbmd1YWdlcyk7CisKK3ByaXZhdGU6CisgICAgVGV4dENoZWNr
ZXJFbmNoYW50KCk7CisgICAgdm9pZCBmcmVlRW5jaGFudEJyb2tlckRpY3Rpb25hcmllcygpOwor
CisgICAgRW5jaGFudEJyb2tlciogbV9icm9rZXI7CisgICAgVmVjdG9yPEVuY2hhbnREaWN0Kj4g
bV9lbmNoYW50RGljdGlvbmFyaWVzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gRU5BQkxFKFNQRUxMQ0hFQ0spCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9ndGsvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9ndGsvQ2hhbmdlTG9nCmluZGV4
IDhmZjYxYTguLmNhZjMxZjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvZ3RrL0NoYW5nZUxv
ZworKysgYi9Tb3VyY2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNCBAQAorMjAx
Mi0wNy0zMSAgTWFyaW8gU2FuY2hleiBQcmFkYSAgPG1zYW5jaGV6QGlnYWxpYS5jb20+CisKKyAg
ICAgICAgW0dUS10gQWRkIGEgbmV3IGFuZCByZXVzYWJsZSBlbmNoYW50LWJhc2VkIHNwZWxsY2hl
Y2tlciBpbiBXZWJDb3JlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD05MDI2OQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFJlbW92ZSBlbmNoYW50IHNwZWNpZmljIGNvZGUgZnJvbSBXZWJLaXRTcGVsbENoZWNr
ZXJFbmNoYW50IGFuZAorICAgICAgICBpbXBsZW1lbnQgaXQgcmVseWluZyBpbiB0aGUgbmV3IFRl
eHRDaGVja2VyRW5jaGFudCBjbGFzcyBpbiBXZWJDb3JlLgorCisgICAgICAgICogd2Via2l0L3dl
YmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3BwOgorICAgICAgICAoX1dlYktpdFNwZWxsQ2hlY2tl
ckVuY2hhbnRQcml2YXRlKToKKyAgICAgICAgKHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRf
ZmluYWxpemUpOgorICAgICAgICAod2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9jbGFzc19p
bml0KToKKyAgICAgICAgKHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfaW5pdCk6CisgICAg
ICAgIChjaGVja1NwZWxsaW5nT2ZTdHJpbmcpOgorICAgICAgICAoZ2V0R3Vlc3Nlc0ZvcldvcmQp
OgorICAgICAgICAodXBkYXRlU3BlbGxDaGVja2luZ0xhbmd1YWdlcyk6CisgICAgICAgIChsZWFy
bldvcmQpOgorICAgICAgICAoaWdub3JlV29yZCk6CisKIDIwMTItMDctMzAgIE1hcnRpbiBSb2Jp
bnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgogCiAgICAgICAgIFtHVEtdIE5ldyBsaW5lcyBh
dXRvbWF0aWNhbGx5IGFuZCByZXBlYXRlZGx5IGFkZGVkIHRvIGxpc3QgaXRlbXMgaW4gRXRoZXJw
YWQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRzcGVsbGNoZWNr
ZXJlbmNoYW50LmNwcCBiL1NvdXJjZS9XZWJLaXQvZ3RrL3dlYmtpdC93ZWJraXRzcGVsbGNoZWNr
ZXJlbmNoYW50LmNwcAppbmRleCAwZWI0OTg2Li4wN2QzNGQxIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L2d0ay93ZWJraXQvd2Via2l0c3BlbGxjaGVja2VyZW5jaGFudC5jcHAKKysrIGIvU291
cmNlL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3BwCkBAIC0y
MSwxMiArMjEsMTUgQEAKIAogI2lmIEVOQUJMRShTUEVMTENIRUNLKQogCisjaW5jbHVkZSAiVGV4
dENoZWNrZXJFbmNoYW50LmgiCiAjaW5jbHVkZSAid2Via2l0c3BlbGxjaGVja2VyLmgiCi0jaW5j
bHVkZSA8ZW5jaGFudC5oPgogI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDx3dGYvT3du
UHRyLmg+CiAjaW5jbHVkZSA8d3RmL2dvYmplY3QvR093blB0ci5oPgogI2luY2x1ZGUgPHd0Zi90
ZXh0L0NTdHJpbmcuaD4KIAordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKIC8qKgogICogU0VD
VElPTjp3ZWJraXRzcGVsbGNoZWNrZXJlbmNoYW50CiAgKiBAc2hvcnRfZGVzY3JpcHRpb246IHRo
ZSBkZWZhdWx0IHNwZWxsIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIGZvciBXZWJLaXRHVEsrLgpA
QCAtMzUsMTAgKzM4LDkgQEAKICAqIFdlYktpdEdUSysuIEl0IHVzZXMgdGhlIEVuY2hhbnQgZGlj
dGlvbmFyaWVzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIHRvCiAgKiBjb3JyZWN0IHNwZWxsaW5n
LgogICovCi1zdGF0aWMgRW5jaGFudEJyb2tlciogYnJva2VyID0gMDsKIAogc3RydWN0IF9XZWJL
aXRTcGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSB7Ci0gICAgR1NMaXN0KiBlbmNoYW50RGljdHM7
CisgICAgT3duUHRyPFRleHRDaGVja2VyRW5jaGFudD4gdGV4dENoZWNrZXJFbmNoYW50OwogfTsK
IAogc3RhdGljIHZvaWQgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9zcGVsbF9jaGVja2Vy
X2ludGVyZmFjZV9pbml0KFdlYktpdFNwZWxsQ2hlY2tlckludGVyZmFjZSogaW50ZXJmYWNlKTsK
QEAgLTQ3LDM1ICs0OSwxNiBAQCBHX0RFRklORV9UWVBFX1dJVEhfQ09ERShXZWJLaXRTcGVsbENo
ZWNrZXJFbmNoYW50LCB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50LAogICAgICAgICAgICAg
ICAgICAgICAgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFKFdFQktJVF9UWVBFX1NQRUxMX0NIRUNL
RVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Via2l0
X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9zcGVsbF9jaGVja2VyX2ludGVyZmFjZV9pbml0KSkKIAot
c3RhdGljIHZvaWQgY3JlYXRlRW5jaGFudEJyb2tlcklmTmVlZGVkKCkKLXsKLSAgICBpZiAoIWJy
b2tlcikKLSAgICAgICAgYnJva2VyID0gZW5jaGFudF9icm9rZXJfaW5pdCgpOwotfQotCi1zdGF0
aWMgdm9pZCBmcmVlU3BlbGxDaGVja2luZ0xhbmd1YWdlKGdwb2ludGVyIGRhdGEsIGdwb2ludGVy
KQotewotICAgIGNyZWF0ZUVuY2hhbnRCcm9rZXJJZk5lZWRlZCgpOwotCi0gICAgZW5jaGFudF9i
cm9rZXJfZnJlZV9kaWN0KGJyb2tlciwgc3RhdGljX2Nhc3Q8RW5jaGFudERpY3QqPihkYXRhKSk7
Ci19Ci0KIHN0YXRpYyB2b2lkIHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfZmluYWxpemUo
R09iamVjdCogb2JqZWN0KQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRl
KiBwcml2ID0gV0VCS0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChvYmplY3QpLT5wcml2OwotCi0g
ICAgZ19zbGlzdF9mb3JlYWNoKHByaXYtPmVuY2hhbnREaWN0cywgZnJlZVNwZWxsQ2hlY2tpbmdM
YW5ndWFnZSwgMCk7Ci0gICAgZ19zbGlzdF9mcmVlKHByaXYtPmVuY2hhbnREaWN0cyk7Ci0KLSAg
ICBXRUJLSVRfU1BFTExfQ0hFQ0tFUl9FTkNIQU5UKG9iamVjdCktPnByaXYtPn5XZWJLaXRTcGVs
bENoZWNrZXJFbmNoYW50UHJpdmF0ZSgpOworICAgIHByaXYtPn5XZWJLaXRTcGVsbENoZWNrZXJF
bmNoYW50UHJpdmF0ZSgpOwogfQogCiBzdGF0aWMgdm9pZCB3ZWJraXRfc3BlbGxfY2hlY2tlcl9l
bmNoYW50X2NsYXNzX2luaXQoV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudENsYXNzKiBrbGFzcykK
IHsKICAgICBHT2JqZWN0Q2xhc3MqIG9iamVjdENsYXNzID0gR19PQkpFQ1RfQ0xBU1Moa2xhc3Mp
OwotCiAgICAgb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5j
aGFudF9maW5hbGl6ZTsKLQogICAgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0ZShrbGFzcywgc2l6
ZW9mKFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKSk7CiB9CiAKQEAgLTg1LDE0OSAr
NjgsMzggQEAgc3RhdGljIHZvaWQgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9pbml0KFdl
YktpdFNwZWxsQ2hlY2tlckVuY2hhbnQqIGNoZWNrZXIKICAgICBjaGVja2VyLT5wcml2ID0gcHJp
djsKICAgICBuZXcgKHByaXYpIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKCk7CiAK
LSAgICBwcml2LT5lbmNoYW50RGljdHMgPSAwOwotfQotCi1zdGF0aWMgYm9vbCB3b3JkRW5kSXNB
Q29udHJhY3Rpb25BcG9zdHJvcGhlKGNvbnN0IGNoYXIqIHN0cmluZywgbG9uZyBvZmZzZXQpCi17
Ci0gICAgaWYgKGdfdXRmOF9nZXRfY2hhcihnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoc3RyaW5n
LCBvZmZzZXQpKSAhPSBnX3V0ZjhfZ2V0X2NoYXIoIiciKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZywg
aXQgY2Fubm90IGJlIHRoZSBhcG9zdHJvcGhlIHBhcnQgb2YgYSBjb250cmFjdGlvbi4KLSAgICBp
ZiAob2Zmc2V0ID09IGdfdXRmOF9zdHJsZW4oc3RyaW5nLCAtMSkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIHJldHVybiBnX3VuaWNoYXJfaXNhbHBoYShnX3V0ZjhfZ2V0X2NoYXIoZ191
dGY4X29mZnNldF90b19wb2ludGVyKHN0cmluZywgb2Zmc2V0ICsgMSkpKTsKKyAgICBwcml2LT50
ZXh0Q2hlY2tlckVuY2hhbnQgPSBUZXh0Q2hlY2tlckVuY2hhbnQ6OmNyZWF0ZSgpOwogfQogCiBz
dGF0aWMgdm9pZCBjaGVja1NwZWxsaW5nT2ZTdHJpbmcoV2ViS2l0U3BlbGxDaGVja2VyKiBjaGVj
a2VyLCBjb25zdCBjaGFyKiBzdHJpbmcsIGludCogbWlzc3BlbGxpbmdMb2NhdGlvbiwgaW50KiBt
aXNzcGVsbGluZ0xlbmd0aCkKIHsKICAgICBXZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50UHJpdmF0
ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VOQ0hBTlQoY2hlY2tlciktPnByaXY7Ci0K
LSAgICBHU0xpc3QqIGRpY3RzID0gcHJpdi0+ZW5jaGFudERpY3RzOwotICAgIGlmICghZGljdHMp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGludCBsZW5ndGggPSBnX3V0Zjhfc3RybGVuKHN0cmlu
ZywgLTEpOwotCi0gICAgUGFuZ29MYW5ndWFnZSogbGFuZ3VhZ2UocGFuZ29fbGFuZ3VhZ2VfZ2V0
X2RlZmF1bHQoKSk7Ci0gICAgR093blB0cjxQYW5nb0xvZ0F0dHI+IGF0dHJzKGdfbmV3KFBhbmdv
TG9nQXR0ciwgbGVuZ3RoICsgMSkpOwotCi0gICAgLy8gcGFuZ29fZ2V0X2xvZ19hdHRycyB1c2Vz
IGFuIGFkaXRpb25hbCBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgotICAgIHBhbmdv
X2dldF9sb2dfYXR0cnMoc3RyaW5nLCAtMSwgLTEsIGxhbmd1YWdlLCBhdHRycy5nZXQoKSwgbGVu
Z3RoICsgMSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aCArIDE7IGkrKykgewot
ICAgICAgICAvLyBXZSBnbyB0aHJvdWdoIGVhY2ggY2hhcmFjdGVyIHVudGlsIHdlIGZpbmQgYW4g
aXNfd29yZF9zdGFydCwKLSAgICAgICAgLy8gdGhlbiB3ZSBnZXQgaW50byBhbiBpbm5lciBsb29w
IHRvIGZpbmQgdGhlIGlzX3dvcmRfZW5kIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgLy8gdG8gaXQu
Ci0gICAgICAgIGlmIChhdHRycy5nZXQoKVtpXS5pc193b3JkX3N0YXJ0KSB7Ci0gICAgICAgICAg
ICBpbnQgc3RhcnQgPSBpOwotICAgICAgICAgICAgaW50IGVuZCA9IGk7Ci0gICAgICAgICAgICBp
bnQgd29yZExlbmd0aDsKLQotICAgICAgICAgICAgd2hpbGUgKGF0dHJzLmdldCgpW2VuZF0uaXNf
d29yZF9lbmQgPCAxIHx8IHdvcmRFbmRJc0FDb250cmFjdGlvbkFwb3N0cm9waGUoc3RyaW5nLCBl
bmQpKQotICAgICAgICAgICAgICAgIGVuZCsrOwotCi0gICAgICAgICAgICB3b3JkTGVuZ3RoID0g
ZW5kIC0gc3RhcnQ7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIGl0ZXJhdG9yIHRvIGJlIGF0IHRo
ZSBjdXJyZW50IHdvcmQgZW5kLCBzbyB3ZSBkb24ndAotICAgICAgICAgICAgLy8gY2hlY2sgY2hh
cmFjdGVycyB0d2ljZS4KLSAgICAgICAgICAgIGkgPSBlbmQ7Ci0KLSAgICAgICAgICAgIGdjaGFy
KiBjc3RhcnQgPSBnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoc3RyaW5nLCBzdGFydCk7Ci0gICAg
ICAgICAgICBnaW50IGJ5dGVzID0gc3RhdGljX2Nhc3Q8Z2ludD4oZ191dGY4X29mZnNldF90b19w
b2ludGVyKHN0cmluZywgZW5kKSAtIGNzdGFydCk7Ci0gICAgICAgICAgICBHT3duUHRyPGdjaGFy
PiB3b3JkKGdfbmV3MChnY2hhciwgYnl0ZXMgKyAxKSk7Ci0KLSAgICAgICAgICAgIGdfdXRmOF9z
dHJuY3B5KHdvcmQuZ2V0KCksIGNzdGFydCwgd29yZExlbmd0aCk7Ci0KLSAgICAgICAgICAgIGZv
ciAoOyBkaWN0czsgZGljdHMgPSBkaWN0cy0+bmV4dCkgewotICAgICAgICAgICAgICAgIEVuY2hh
bnREaWN0KiBkaWN0ID0gc3RhdGljX2Nhc3Q8RW5jaGFudERpY3QqPihkaWN0cy0+ZGF0YSk7Ci0g
ICAgICAgICAgICAgICAgaWYgKGVuY2hhbnRfZGljdF9jaGVjayhkaWN0LCB3b3JkLmdldCgpLCB3
b3JkTGVuZ3RoKSkgewotICAgICAgICAgICAgICAgICAgICAqbWlzc3BlbGxpbmdMb2NhdGlvbiA9
IHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAqbWlzc3BlbGxpbmdMZW5ndGggPSB3b3JkTGVu
Z3RoOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN0
b3AgY2hlY2tpbmcsIHRoaXMgd29yZCBpcyBvayBpbiBhdCBsZWFzdCBvbmUgZGljdC4KLSAgICAg
ICAgICAgICAgICAgICAgKm1pc3NwZWxsaW5nTG9jYXRpb24gPSAtMTsKLSAgICAgICAgICAgICAg
ICAgICAgKm1pc3NwZWxsaW5nTGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorICAg
IHByaXYtPnRleHRDaGVja2VyRW5jaGFudC0+Y2hlY2tTcGVsbGluZ09mU3RyaW5nKFN0cmluZzo6
ZnJvbVVURjgoc3RyaW5nKSwgKm1pc3NwZWxsaW5nTG9jYXRpb24sICptaXNzcGVsbGluZ0xlbmd0
aCk7CiB9CiAKIHN0YXRpYyBjaGFyKiogZ2V0R3Vlc3Nlc0ZvcldvcmQoV2ViS2l0U3BlbGxDaGVj
a2VyKiBjaGVja2VyLCBjb25zdCBjaGFyKiB3b3JkLCBjb25zdCBjaGFyKiBjb250ZXh0KQogewog
ICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKiBwcml2ID0gV0VCS0lUX1NQRUxM
X0NIRUNLRVJfRU5DSEFOVChjaGVja2VyKS0+cHJpdjsKIAotICAgIEdTTGlzdCogZGljdHMgPSBw
cml2LT5lbmNoYW50RGljdHM7Ci0gICAgY2hhcioqIGd1ZXNzZXMgPSAwOworICAgIFZlY3RvcjxT
dHJpbmc+IGd1ZXNzZXMgPSBwcml2LT50ZXh0Q2hlY2tlckVuY2hhbnQtPmdldEd1ZXNzZXNGb3JX
b3JkKFN0cmluZzo6ZnJvbVVURjgod29yZCkpOwogCi0gICAgZm9yICg7IGRpY3RzOyBkaWN0cyA9
IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgIHNpemVfdCBudW1iZXJPZlN1Z2dlc3Rpb25zOwotICAg
ICAgICBzaXplX3QgaTsKKyAgICBpZiAoZ3Vlc3Nlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVy
biAwOwogCi0gICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gc3RhdGljX2Nhc3Q8RW5jaGFudERp
Y3QqPihkaWN0cy0+ZGF0YSk7Ci0gICAgICAgIGdjaGFyKiogc3VnZ2VzdGlvbnMgPSBlbmNoYW50
X2RpY3Rfc3VnZ2VzdChkaWN0LCB3b3JkLCAtMSwgJm51bWJlck9mU3VnZ2VzdGlvbnMpOworICAg
IGludCBpID0gMDsKKyAgICBpbnQgbnVtYmVyT2ZHdWVzc2VzID0gZ3Vlc3Nlcy5zaXplKCk7Cisg
ICAgY2hhcioqIGd1ZXNzZXNBcnJheSA9IHN0YXRpY19jYXN0PGNoYXIqKj4oZ19tYWxsb2MwKChu
dW1iZXJPZkd1ZXNzZXMgKyAxKSAqIHNpemVvZihjaGFyKikpKTsKKyAgICBmb3IgKFZlY3RvcjxT
dHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZ3Vlc3Nlcy5iZWdpbigpOyBpdGVyICE9IGd1
ZXNzZXMuZW5kKCk7ICsraXRlcikKKyAgICAgICAgZ3Vlc3Nlc0FycmF5W2krK10gPSBnX3N0cmR1
cChpdGVyLT51dGY4KCkuZGF0YSgpKTsKKyAgICBndWVzc2VzQXJyYXlbaV0gPSAwOwogCi0gICAg
ICAgIGlmIChudW1iZXJPZlN1Z2dlc3Rpb25zID4gMCkgewotICAgICAgICAgICAgaWYgKG51bWJl
ck9mU3VnZ2VzdGlvbnMgPiAxMCkKLSAgICAgICAgICAgICAgICBudW1iZXJPZlN1Z2dlc3Rpb25z
ID0gMTA7Ci0KLSAgICAgICAgICAgIGd1ZXNzZXMgPSBzdGF0aWNfY2FzdDxjaGFyKio+KGdfbWFs
bG9jMCgobnVtYmVyT2ZTdWdnZXN0aW9ucyArIDEpICogc2l6ZW9mKGNoYXIqKSkpOwotICAgICAg
ICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mU3VnZ2VzdGlvbnMgJiYgaSA8IDEwOyBpKysp
Ci0gICAgICAgICAgICAgICAgZ3Vlc3Nlc1tpXSA9IGdfc3RyZHVwKHN1Z2dlc3Rpb25zW2ldKTsK
LQotICAgICAgICAgICAgZ3Vlc3Nlc1tpXSA9IDA7Ci0KLSAgICAgICAgICAgIGVuY2hhbnRfZGlj
dF9mcmVlX3N1Z2dlc3Rpb25zKGRpY3QsIHN1Z2dlc3Rpb25zKTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIHJldHVybiBndWVzc2VzOwotfQotCi1zdGF0aWMgdm9pZCBnZXRBdmFpbGFibGVEaWN0
aW9uYXJpZXNDYWxsYmFjayhjb25zdCBjaGFyKiBjb25zdCBsYW5ndWFnZVRhZywgY29uc3QgY2hh
ciogY29uc3QsIGNvbnN0IGNoYXIqIGNvbnN0LCBjb25zdCBjaGFyKiBjb25zdCwgdm9pZCogZGF0
YSkKLXsKLSAgICBWZWN0b3I8Q1N0cmluZz4qIGRpY3RzID0gc3RhdGljX2Nhc3Q8VmVjdG9yPENT
dHJpbmc+Kj4oZGF0YSk7Ci0KLSAgICBkaWN0cy0+YXBwZW5kKGxhbmd1YWdlVGFnKTsKKyAgICBy
ZXR1cm4gZ3Vlc3Nlc0FycmF5OwogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVTcGVsbENoZWNraW5n
TGFuZ3VhZ2VzKFdlYktpdFNwZWxsQ2hlY2tlciogY2hlY2tlciwgY29uc3QgY2hhciogbGFuZ3Vh
Z2VzKQogewotICAgIEdTTGlzdCogc3BlbGxEaWN0aW9uYXJpZXMgPSAwOwotCiAgICAgV2ViS2l0
U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUqIHByaXYgPSBXRUJLSVRfU1BFTExfQ0hFQ0tFUl9F
TkNIQU5UKGNoZWNrZXIpLT5wcml2OwotCi0gICAgY3JlYXRlRW5jaGFudEJyb2tlcklmTmVlZGVk
KCk7Ci0KLSAgICBpZiAobGFuZ3VhZ2VzKSB7Ci0gICAgICAgIGNoYXIqKiBsYW5ncyA9IGdfc3Ry
c3BsaXQobGFuZ3VhZ2VzLCAiLCIsIC0xKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGxhbmdz
W2ldOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChlbmNoYW50X2Jyb2tlcl9kaWN0X2V4aXN0cyhi
cm9rZXIsIGxhbmdzW2ldKSkgewotICAgICAgICAgICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0g
ZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0KGJyb2tlciwgbGFuZ3NbaV0pOwotICAgICAgICAg
ICAgICAgIHNwZWxsRGljdGlvbmFyaWVzID0gZ19zbGlzdF9hcHBlbmQoc3BlbGxEaWN0aW9uYXJp
ZXMsIGRpY3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdfc3RyZnJlZXYo
bGFuZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGxhbmd1YWdlID0gcGFu
Z29fbGFuZ3VhZ2VfdG9fc3RyaW5nKGd0a19nZXRfZGVmYXVsdF9sYW5ndWFnZSgpKTsKLSAgICAg
ICAgaWYgKGVuY2hhbnRfYnJva2VyX2RpY3RfZXhpc3RzKGJyb2tlciwgbGFuZ3VhZ2UpKSB7Ci0g
ICAgICAgICAgICBFbmNoYW50RGljdCogZGljdCA9IGVuY2hhbnRfYnJva2VyX3JlcXVlc3RfZGlj
dChicm9rZXIsIGxhbmd1YWdlKTsKLSAgICAgICAgICAgIHNwZWxsRGljdGlvbmFyaWVzID0gZ19z
bGlzdF9hcHBlbmQoc3BlbGxEaWN0aW9uYXJpZXMsIGRpY3QpOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgLy8gTm8gZGljdGlvbmFyaWVzIHNlbGVjdGVkLCB3ZSBnZXQgb25lIGZyb20g
dGhlIGxpc3QuCi0gICAgICAgICAgICBWZWN0b3I8Q1N0cmluZz4gYWxsRGljdGlvbmFyaWVzOwot
ICAgICAgICAgICAgZW5jaGFudF9icm9rZXJfbGlzdF9kaWN0cyhicm9rZXIsIGdldEF2YWlsYWJs
ZURpY3Rpb25hcmllc0NhbGxiYWNrLCAmYWxsRGljdGlvbmFyaWVzKTsKLSAgICAgICAgICAgIGlm
ICghYWxsRGljdGlvbmFyaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIEVuY2hhbnRE
aWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0KGJyb2tlciwgYWxsRGljdGlv
bmFyaWVzWzBdLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgc3BlbGxEaWN0aW9uYXJpZXMgPSBn
X3NsaXN0X2FwcGVuZChzcGVsbERpY3Rpb25hcmllcywgZGljdCk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgZ19zbGlzdF9mb3JlYWNoKHByaXYtPmVuY2hhbnREaWN0cywg
ZnJlZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZSwgMCk7Ci0gICAgZ19zbGlzdF9mcmVlKHByaXYtPmVu
Y2hhbnREaWN0cyk7Ci0gICAgcHJpdi0+ZW5jaGFudERpY3RzID0gc3BlbGxEaWN0aW9uYXJpZXM7
CisgICAgcHJpdi0+dGV4dENoZWNrZXJFbmNoYW50LT51cGRhdGVTcGVsbENoZWNraW5nTGFuZ3Vh
Z2VzKFN0cmluZzo6ZnJvbVVURjgobGFuZ3VhZ2VzKSk7CiB9CiAKIHN0YXRpYyBjaGFyKiBnZXRB
dXRvY29ycmVjdFN1Z2dlc3Rpb25zRm9yTWlzc3BlbGxlZFdvcmQoV2ViS2l0U3BlbGxDaGVja2Vy
KiBjaGVja2VyLCBjb25zdCBjaGFyKiB3b3JkKQpAQCAtMjM4LDI1ICsxMTAsMTMgQEAgc3RhdGlj
IGNoYXIqIGdldEF1dG9jb3JyZWN0U3VnZ2VzdGlvbnNGb3JNaXNzcGVsbGVkV29yZChXZWJLaXRT
cGVsbENoZWNrZXIqIGNoZWMKIHN0YXRpYyB2b2lkIGxlYXJuV29yZChXZWJLaXRTcGVsbENoZWNr
ZXIqIGNoZWNrZXIsIGNvbnN0IGNoYXIqIHdvcmQpCiB7CiAgICAgV2ViS2l0U3BlbGxDaGVja2Vy
RW5jaGFudFByaXZhdGUqIHByaXYgPSBXRUJLSVRfU1BFTExfQ0hFQ0tFUl9FTkNIQU5UKGNoZWNr
ZXIpLT5wcml2OwotICAgIEdTTGlzdCogZGljdHMgPSBwcml2LT5lbmNoYW50RGljdHM7Ci0KLSAg
ICBmb3IgKDsgZGljdHM7IGRpY3RzID0gZGljdHMtPm5leHQpIHsKLSAgICAgICAgRW5jaGFudERp
Y3QqIGRpY3QgPSBzdGF0aWNfY2FzdDxFbmNoYW50RGljdCo+KGRpY3RzLT5kYXRhKTsKLQotICAg
ICAgICBlbmNoYW50X2RpY3RfYWRkX3RvX3BlcnNvbmFsKGRpY3QsIHdvcmQsIC0xKTsKLSAgICB9
CisgICAgcHJpdi0+dGV4dENoZWNrZXJFbmNoYW50LT5sZWFybldvcmQoU3RyaW5nOjpmcm9tVVRG
OCh3b3JkKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGlnbm9yZVdvcmQoV2ViS2l0U3BlbGxDaGVja2Vy
KiBjaGVja2VyLCBjb25zdCBjaGFyKiB3b3JkKQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVu
Y2hhbnRQcml2YXRlKiBwcml2ID0gV0VCS0lUX1NQRUxMX0NIRUNLRVJfRU5DSEFOVChjaGVja2Vy
KS0+cHJpdjsKLSAgICBHU0xpc3QqIGRpY3RzID0gcHJpdi0+ZW5jaGFudERpY3RzOwotCi0gICAg
Zm9yICg7IGRpY3RzOyBkaWN0cyA9IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgIEVuY2hhbnREaWN0
KiBkaWN0ID0gc3RhdGljX2Nhc3Q8RW5jaGFudERpY3QqPihkaWN0cy0+ZGF0YSk7Ci0KLSAgICAg
ICAgZW5jaGFudF9kaWN0X2FkZF90b19zZXNzaW9uKGRpY3QsIHdvcmQsIC0xKTsKLSAgICB9Cisg
ICAgcHJpdi0+dGV4dENoZWNrZXJFbmNoYW50LT5pZ25vcmVXb3JkKFN0cmluZzo6ZnJvbVVURjgo
d29yZCkpOwogfQogCiBzdGF0aWMgdm9pZCB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X3Nw
ZWxsX2NoZWNrZXJfaW50ZXJmYWNlX2luaXQoV2ViS2l0U3BlbGxDaGVja2VySW50ZXJmYWNlKiBp
bnRlcmZhY2UpCi0tIAoxLjcuMTAuNAoK
</data>
<flag name="review"
          id="164960"
          type_id="1"
          status="+"
          setter="mrobinson"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>156071</attachid>
            <date>2012-08-02 06:52:44 -0700</date>
            <delta_ts>2012-08-02 10:33:45 -0700</delta_ts>
            <desc>Patch proposal</desc>
            <filename>0001-GTK-Add-a-new-and-reusable-enchant-based-spellchecke.patch</filename>
            <type>text/plain</type>
            <size>26513</size>
            <attacher name="Mario Sanchez Prada">mario</attacher>
            
              <data encoding="base64">RnJvbSA4NGQ3ODgxNmY1NmFiODIwZTM0ODVkOTJmNDk0Yjk0MjAxMjU5YmJhIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXJpbyBTYW5jaGV6IFByYWRhIDxtc2FuY2hlekBpZ2FsaWEu
Y29tPgpEYXRlOiBUdWUsIDMxIEp1bCAyMDEyIDE3OjQ4OjExICswMjAwClN1YmplY3Q6IFtQQVRD
SF0gW0dUS10gQWRkIGEgbmV3IGFuZCByZXVzYWJsZSBlbmNoYW50LWJhc2VkIHNwZWxsY2hlY2tl
ciBpbgogV2ViQ29yZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTAy
NjkKClJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgoKU291cmNlL1dlYkNvcmU6CgpNb3ZlIGVu
Y2hhbnQgc3BlY2lmaWMgY29kZSBkb3duIHRvIFdlYkNvcmUsIGludG8gYSBuZXcgY2xhc3MKVGV4
dENoZWNrZXJFbmNoYW50LCB0aGF0IHdlIGNhbiB1c2UgZnJvbSBXSzEgYW5kIFdLMi4KCiogR05V
bWFrZWZpbGUuYW06IEFkZCBmbGFncyB0byBoYW5kbGUgdGhlIFNQRUxMQ0hFQ0sgZmVhdHVyZS4K
KiBHTlVtYWtlZmlsZS5saXN0LmFtOiBBZGRlZCBuZXcgZmlsZXMuCiogcGxhdGZvcm0vdGV4dC9n
dGsvVGV4dENoZWNrZXJFbmNoYW50LmNwcDogQWRkZWQuCihnZXRBdmFpbGFibGVEaWN0aW9uYXJp
ZXNDYWxsYmFjayk6CihUZXh0Q2hlY2tlckVuY2hhbnQ6OlRleHRDaGVja2VyRW5jaGFudCk6CihU
ZXh0Q2hlY2tlckVuY2hhbnQ6On5UZXh0Q2hlY2tlckVuY2hhbnQpOgooVGV4dENoZWNrZXJFbmNo
YW50OjppZ25vcmVXb3JkKToKKFRleHRDaGVja2VyRW5jaGFudDo6bGVhcm5Xb3JkKToKKFRleHRD
aGVja2VyRW5jaGFudDo6Y2hlY2tTcGVsbGluZ09mU3RyaW5nKToKKFRleHRDaGVja2VyRW5jaGFu
dDo6Z2V0R3Vlc3Nlc0ZvcldvcmQpOgooVGV4dENoZWNrZXJFbmNoYW50Ojp1cGRhdGVTcGVsbENo
ZWNraW5nTGFuZ3VhZ2VzKToKKFRleHRDaGVja2VyRW5jaGFudDo6ZnJlZUVuY2hhbnRCcm9rZXJE
aWN0aW9uYXJpZXMpOgoqIHBsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5oOiBB
ZGRlZC4KKFdlYkNvcmUpOgooVGV4dENoZWNrZXJFbmNoYW50KToKKFdlYkNvcmU6OlRleHRDaGVj
a2VyRW5jaGFudDo6Y3JlYXRlKToKClNvdXJjZS9XZWJLaXQvZ3RrOgoKUmVtb3ZlIGVuY2hhbnQg
c3BlY2lmaWMgY29kZSBmcm9tIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnQgYW5kCmltcGxlbWVu
dCBpdCByZWx5aW5nIGluIHRoZSBuZXcgVGV4dENoZWNrZXJFbmNoYW50IGNsYXNzIGluIFdlYkNv
cmUuCgoqIHdlYmtpdC93ZWJraXRzcGVsbGNoZWNrZXJlbmNoYW50LmNwcDoKKF9XZWJLaXRTcGVs
bENoZWNrZXJFbmNoYW50UHJpdmF0ZSk6Cih3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2Zp
bmFsaXplKToKKHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfY2xhc3NfaW5pdCk6Cih3ZWJr
aXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2luaXQpOgooY2hlY2tTcGVsbGluZ09mU3RyaW5nKToK
KGdldEd1ZXNzZXNGb3JXb3JkKToKKHVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMpOgoobGVh
cm5Xb3JkKToKKGlnbm9yZVdvcmQpOgotLS0KIFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHwgICAyNyArKysKIFNvdXJjZS9XZWJDb3JlL0dOVW1ha2Vm
aWxlLmFtICAgICAgICAgICAgICAgICAgICAgIHwgICAxMSArLQogU291cmNlL1dlYkNvcmUvR05V
bWFrZWZpbGUubGlzdC5hbSAgICAgICAgICAgICAgICAgfCAgIDEwICsKIC4uLi9wbGF0Zm9ybS90
ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuY3BwICAgICAgIHwgIDE5NyArKysrKysrKysrKysr
KysrKysrKwogLi4uL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNoYW50
LmggfCAgIDU4ICsrKysrKwogU291cmNlL1dlYktpdC9ndGsvQ2hhbmdlTG9nICAgICAgICAgICAg
ICAgICAgICAgICAgfCAgIDIxICsrKwogLi4uL2d0ay93ZWJraXQvd2Via2l0c3BlbGxjaGVja2Vy
ZW5jaGFudC5jcHAgICAgICAgfCAgMTgyICsrKy0tLS0tLS0tLS0tLS0tLQogNyBmaWxlcyBjaGFu
Z2VkLCAzNDQgaW5zZXJ0aW9ucygrKSwgMTYyIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAw
NjQ0IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5j
cHAKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9U
ZXh0Q2hlY2tlckVuY2hhbnQuaAoKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxv
ZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA1ZTYyYjc1Li5jNDBjODNiIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMzAgQEAKKzIwMTItMDgtMDIgIE1hcmlvIFNhbmNoZXogUHJhZGEg
IDxtc2FuY2hlekBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdIEFkZCBhIG5ldyBhbmQgcmV1
c2FibGUgZW5jaGFudC1iYXNlZCBzcGVsbGNoZWNrZXIgaW4gV2ViQ29yZQorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTAyNjkKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3ZlIGVuY2hhbnQgc3BlY2lmaWMg
Y29kZSBkb3duIHRvIFdlYkNvcmUsIGludG8gYSBuZXcgY2xhc3MKKyAgICAgICAgVGV4dENoZWNr
ZXJFbmNoYW50LCB0aGF0IHdlIGNhbiB1c2UgZnJvbSBXSzEgYW5kIFdLMi4KKworICAgICAgICAq
IEdOVW1ha2VmaWxlLmFtOiBBZGQgZmxhZ3MgdG8gaGFuZGxlIHRoZSBTUEVMTENIRUNLIGZlYXR1
cmUuCisgICAgICAgICogR05VbWFrZWZpbGUubGlzdC5hbTogQWRkZWQgbmV3IGZpbGVzLgorICAg
ICAgICAqIHBsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5jcHA6IEFkZGVkLgor
ICAgICAgICAoZ2V0QXZhaWxhYmxlRGljdGlvbmFyaWVzQ2FsbGJhY2spOgorICAgICAgICAoVGV4
dENoZWNrZXJFbmNoYW50OjpUZXh0Q2hlY2tlckVuY2hhbnQpOgorICAgICAgICAoVGV4dENoZWNr
ZXJFbmNoYW50Ojp+VGV4dENoZWNrZXJFbmNoYW50KToKKyAgICAgICAgKFRleHRDaGVja2VyRW5j
aGFudDo6aWdub3JlV29yZCk6CisgICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OmxlYXJuV29y
ZCk6CisgICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OmNoZWNrU3BlbGxpbmdPZlN0cmluZyk6
CisgICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OmdldEd1ZXNzZXNGb3JXb3JkKToKKyAgICAg
ICAgKFRleHRDaGVja2VyRW5jaGFudDo6dXBkYXRlU3BlbGxDaGVja2luZ0xhbmd1YWdlcyk6Cisg
ICAgICAgIChUZXh0Q2hlY2tlckVuY2hhbnQ6OmZyZWVFbmNoYW50QnJva2VyRGljdGlvbmFyaWVz
KToKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVuY2hhbnQuaDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFRleHRDaGVja2VyRW5jaGFudCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0Q2hlY2tlckVuY2hhbnQ6OmNyZWF0ZSk6CisKIDIwMTItMDct
MzEgIEpvZSBNYXNvbiAgPGptYXNvbkByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBT
dXBwb3J0IE5lZ290aWF0ZSBhdXRoCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtl
ZmlsZS5hbSBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmluZGV4IGJhMTBhZjEuLjBj
Mjc4YjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC0xMTcsNyArMTE3LDggQEAgd2ViY29yZWd0
a19jcHBmbGFncyArPSBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3N0cmVhbWVyIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9ndGsgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2d0ayBc
Ci0JLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwCisJLUkk
KHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwIFwKKwktSSQoc3Jj
ZGlyKS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0awogCiAjIC0tLQogIyBGZWF0dXJl
cyBlbmFibGVkIGJ5IGRlZmF1bHQgYXQgY29tcGlsYXRpb24gdGltZQpAQCAtNzQ4LDYgKzc0OSwx
NCBAQCBGRUFUVVJFX0RFRklORVMgKz0gRU5BQkxFX0xJTktfUFJFRkVUQ0g9MQogd2ViY29yZV9j
cHBmbGFncyArPSAtREVOQUJMRV9MSU5LX1BSRUZFVENIPTEKIGVuZGlmICAjIEVORCBFTkFCTEVf
TElOS19QUkVGRVRDSAogCisjIC0tLQorIyBTcGVsbCBjaGVjayBzdXBwb3J0CisjIC0tLQoraWYg
RU5BQkxFX1NQRUxMQ0hFQ0sKK0ZFQVRVUkVfREVGSU5FUyArPSBFTkFCTEVfU1BFTExDSEVDSz0x
Cit3ZWJjb3JlX2NwcGZsYWdzICs9IC1ERU5BQkxFX1NQRUxMQ0hFQ0s9MQorZW5kaWYgICMgRU5E
IEVOQUJMRV9TUEVMTENIRUNLCisKIERlcml2ZWRTb3VyY2VzL1dlYkNvcmUvQ1NTUHJvcGVydHlO
YW1lcy5jcHA6IERlcml2ZWRTb3VyY2VzL1dlYkNvcmUvQ1NTUHJvcGVydHlOYW1lcy5oCiBEZXJp
dmVkU291cmNlcy9XZWJDb3JlL0NTU1Byb3BlcnR5TmFtZXMuaDogJChXRUJDT1JFX0NTU19QUk9Q
RVJUWV9OQU1FUykgJChXZWJDb3JlKS9jc3MvbWFrZXByb3AucGwKIAkkKEFNX1ZfR0VOKQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbSBiL1NvdXJjZS9XZWJD
b3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KaW5kZXggNTU2NzlhMy4uZTljMWFjZCAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9HTlVtYWtlZmlsZS5saXN0LmFtCkBAIC02Mjk5LDMgKzYyOTksMTMgQEAgZG9tX2JpbmRpbmdf
aWRscyArPSBcCiAJJChXZWJDb3JlKS9Nb2R1bGVzL3F1b3RhL1N0b3JhZ2VJbmZvVXNhZ2VDYWxs
YmFjay5pZGwKIAogZW5kaWYgICMgRU5EIEVOQUJMRV9RVU9UQQorCisjIC0tLS0KKyMgU3BlbGwg
Y2hlY2sgc3VwcG9ydAorIyAtLS0tCitpZiBFTkFCTEVfU1BFTExDSEVDSword2ViY29yZV9zb3Vy
Y2VzICs9IFwKKwlTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0Q2hlY2tlckVu
Y2hhbnQuaCBcCisJU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJF
bmNoYW50LmNwcAorZW5kaWYgIyBFTkQgRU5BQkxFX1NQRUxMQ0hFQ0sKKwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNoYW50LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFudC5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzZGFjZAotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5jaGFu
dC5jcHAKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIElnYWxp
YSBTLkwuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vu
c2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29m
dHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiVGV4dENoZWNrZXJFbmNoYW50LmgiCisKKyNpZiBFTkFCTEUoU1BFTExD
SEVDSykKKworI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+CisjaW5jbHVkZSA8d3RmL2dvYmplY3Qv
R093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKwordXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgbWF4aW11bU51bWJlck9mU3VnZ2Vz
dGlvbnMgPSAxMDsKKworc3RhdGljIHZvaWQgZ2V0QXZhaWxhYmxlRGljdGlvbmFyaWVzQ2FsbGJh
Y2soY29uc3QgY2hhciogY29uc3QgbGFuZ3VhZ2VUYWcsIGNvbnN0IGNoYXIqIGNvbnN0LCBjb25z
dCBjaGFyKiBjb25zdCwgY29uc3QgY2hhciogY29uc3QsIHZvaWQqIGRhdGEpCit7CisgICAgVmVj
dG9yPENTdHJpbmc+KiBkaWN0aW9uYXJpZXMgPSBzdGF0aWNfY2FzdDxWZWN0b3I8Q1N0cmluZz4q
PihkYXRhKTsKKyAgICBkaWN0aW9uYXJpZXMtPmFwcGVuZChsYW5ndWFnZVRhZyk7Cit9CisKK3N0
YXRpYyBib29sIHdvcmRFbmRJc0FDb250cmFjdGlvbkFwb3N0cm9waGUoY29uc3QgY2hhciogc3Ry
aW5nLCBsb25nIG9mZnNldCkKK3sKKyAgICBpZiAoZ191dGY4X2dldF9jaGFyKGdfdXRmOF9vZmZz
ZXRfdG9fcG9pbnRlcihzdHJpbmcsIG9mZnNldCkpICE9IGdfdXRmOF9nZXRfY2hhcigiJyIpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGNoYXJh
Y3RlciBpbiB0aGUgc3RyaW5nLCBpdCBjYW5ub3QgYmUgdGhlIGFwb3N0cm9waGUgcGFydCBvZiBh
IGNvbnRyYWN0aW9uLgorICAgIGlmIChvZmZzZXQgPT0gZ191dGY4X3N0cmxlbihzdHJpbmcsIC0x
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGdfdW5pY2hhcl9pc2FscGhh
KGdfdXRmOF9nZXRfY2hhcihnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoc3RyaW5nLCBvZmZzZXQg
KyAxKSkpOworfQorCitUZXh0Q2hlY2tlckVuY2hhbnQ6OlRleHRDaGVja2VyRW5jaGFudCgpCisg
ICAgOiBtX2Jyb2tlcihlbmNoYW50X2Jyb2tlcl9pbml0KCkpCisgICAgLCBtX2VuY2hhbnREaWN0
aW9uYXJpZXMoMCkKK3sKK30KKworVGV4dENoZWNrZXJFbmNoYW50Ojp+VGV4dENoZWNrZXJFbmNo
YW50KCkKK3sKKyAgICBpZiAoIW1fYnJva2VyKQorICAgICAgICByZXR1cm47CisKKyAgICBmcmVl
RW5jaGFudEJyb2tlckRpY3Rpb25hcmllcygpOworICAgIGVuY2hhbnRfYnJva2VyX2ZyZWUobV9i
cm9rZXIpOworfQorCit2b2lkIFRleHRDaGVja2VyRW5jaGFudDo6aWdub3JlV29yZChjb25zdCBT
dHJpbmcmIHdvcmQpCit7CisgICAgZm9yIChWZWN0b3I8RW5jaGFudERpY3QqPjo6Y29uc3RfaXRl
cmF0b3IgaXRlciA9IG1fZW5jaGFudERpY3Rpb25hcmllcy5iZWdpbigpOyBpdGVyICE9IG1fZW5j
aGFudERpY3Rpb25hcmllcy5lbmQoKTsgKytpdGVyKQorICAgICAgICBlbmNoYW50X2RpY3RfYWRk
X3RvX3Nlc3Npb24oKml0ZXIsIHdvcmQudXRmOCgpLmRhdGEoKSwgLTEpOworfQorCit2b2lkIFRl
eHRDaGVja2VyRW5jaGFudDo6bGVhcm5Xb3JkKGNvbnN0IFN0cmluZyYgd29yZCkKK3sKKyAgICBm
b3IgKFZlY3RvcjxFbmNoYW50RGljdCo+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gbV9lbmNoYW50
RGljdGlvbmFyaWVzLmJlZ2luKCk7IGl0ZXIgIT0gbV9lbmNoYW50RGljdGlvbmFyaWVzLmVuZCgp
OyArK2l0ZXIpCisgICAgICAgIGVuY2hhbnRfZGljdF9hZGRfdG9fcGVyc29uYWwoKml0ZXIsIHdv
cmQudXRmOCgpLmRhdGEoKSwgLTEpOworfQorCit2b2lkIFRleHRDaGVja2VyRW5jaGFudDo6Y2hl
Y2tTcGVsbGluZ09mU3RyaW5nKGNvbnN0IFN0cmluZyYgc3RyaW5nLCBpbnQmIG1pc3NwZWxsaW5n
TG9jYXRpb24sIGludCYgbWlzc3BlbGxpbmdMZW5ndGgpCit7CisgICAgaWYgKG1fZW5jaGFudERp
Y3Rpb25hcmllcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKyAgICBWZWN0b3I8RW5jaGFu
dERpY3QqPjo6Y29uc3RfaXRlcmF0b3IgZGljdEl0ZXIgPSBtX2VuY2hhbnREaWN0aW9uYXJpZXMu
YmVnaW4oKTsKKworICAgIFBhbmdvTGFuZ3VhZ2UqIGxhbmd1YWdlKHBhbmdvX2xhbmd1YWdlX2dl
dF9kZWZhdWx0KCkpOworICAgIHNpemVfdCBudW1iZXJPZkNoYXJhY3RlcnMgPSBzdHJpbmcubGVu
Z3RoKCk7CisgICAgR093blB0cjxQYW5nb0xvZ0F0dHI+IGF0dHJzKGdfbmV3KFBhbmdvTG9nQXR0
ciwgbnVtYmVyT2ZDaGFyYWN0ZXJzICsgMSkpOworCisgICAgQ1N0cmluZyB1dGY4U3RyaW5nID0g
c3RyaW5nLnV0ZjgoKTsKKyAgICBjb25zdCBjaGFyKiBjU3RyaW5nID0gdXRmOFN0cmluZy5kYXRh
KCk7CisKKyAgICAvLyBwYW5nb19nZXRfbG9nX2F0dHJzIHVzZXMgYW4gYWRpdGlvbmFsIHBvc2l0
aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCisgICAgcGFuZ29fZ2V0X2xvZ19hdHRycyhjU3Ry
aW5nLCAtMSwgLTEsIGxhbmd1YWdlLCBhdHRycy5nZXQoKSwgbnVtYmVyT2ZDaGFyYWN0ZXJzICsg
MSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWJlck9mQ2hhcmFjdGVycyArIDE7
IGkrKykgeworICAgICAgICAvLyBXZSBnbyB0aHJvdWdoIGVhY2ggY2hhcmFjdGVyIHVudGlsIHdl
IGZpbmQgYW4gaXNfd29yZF9zdGFydCwKKyAgICAgICAgLy8gdGhlbiB3ZSBnZXQgaW50byBhbiBp
bm5lciBsb29wIHRvIGZpbmQgdGhlIGlzX3dvcmRfZW5kIGNvcnJlc3BvbmRpbmcKKyAgICAgICAg
Ly8gdG8gaXQuCisgICAgICAgIGlmIChhdHRycy5nZXQoKVtpXS5pc193b3JkX3N0YXJ0KSB7Cisg
ICAgICAgICAgICBpbnQgc3RhcnQgPSBpOworICAgICAgICAgICAgaW50IGVuZCA9IGk7CisgICAg
ICAgICAgICBpbnQgd29yZExlbmd0aDsKKworICAgICAgICAgICAgd2hpbGUgKGF0dHJzLmdldCgp
W2VuZF0uaXNfd29yZF9lbmQgPCAxICB8fCB3b3JkRW5kSXNBQ29udHJhY3Rpb25BcG9zdHJvcGhl
KGNTdHJpbmcsIGVuZCkpCisgICAgICAgICAgICAgICAgZW5kKys7CisKKyAgICAgICAgICAgIHdv
cmRMZW5ndGggPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgaXRlcmF0b3Ig
dG8gYmUgYXQgdGhlIGN1cnJlbnQgd29yZCBlbmQsIHNvIHdlIGRvbid0CisgICAgICAgICAgICAv
LyBjaGVjayBjaGFyYWN0ZXJzIHR3aWNlLgorICAgICAgICAgICAgaSA9IGVuZDsKKworICAgICAg
ICAgICAgZ2NoYXIqIGNzdGFydCA9IGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihjU3RyaW5nLCBz
dGFydCk7CisgICAgICAgICAgICBnaW50IGJ5dGVzID0gc3RhdGljX2Nhc3Q8Z2ludD4oZ191dGY4
X29mZnNldF90b19wb2ludGVyKGNTdHJpbmcsIGVuZCkgLSBjc3RhcnQpOworICAgICAgICAgICAg
R093blB0cjxnY2hhcj4gd29yZChnX25ldzAoZ2NoYXIsIGJ5dGVzICsgMSkpOworCisgICAgICAg
ICAgICBnX3V0Zjhfc3RybmNweSh3b3JkLmdldCgpLCBjc3RhcnQsIHdvcmRMZW5ndGgpOworCisg
ICAgICAgICAgICBmb3IgKDsgZGljdEl0ZXIgIT0gbV9lbmNoYW50RGljdGlvbmFyaWVzLmVuZCgp
OyArK2RpY3RJdGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY2hhbnRfZGljdF9jaGVjaygq
ZGljdEl0ZXIsIHdvcmQuZ2V0KCksIHdvcmRMZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAg
IG1pc3NwZWxsaW5nTG9jYXRpb24gPSBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbWlzc3Bl
bGxpbmdMZW5ndGggPSB3b3JkTGVuZ3RoOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIC8vIFN0b3AgY2hlY2tpbmcsIHRoaXMgd29yZCBpcyBvayBpbiBhdCBs
ZWFzdCBvbmUgZGljdC4KKyAgICAgICAgICAgICAgICAgICAgbWlzc3BlbGxpbmdMb2NhdGlvbiA9
IC0xOworICAgICAgICAgICAgICAgICAgICBtaXNzcGVsbGluZ0xlbmd0aCA9IDA7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KK30KKworVmVjdG9yPFN0cmluZz4gVGV4dENoZWNrZXJFbmNoYW50Ojpn
ZXRHdWVzc2VzRm9yV29yZChjb25zdCBTdHJpbmcmIHdvcmQpCit7CisgICAgVmVjdG9yPFN0cmlu
Zz4gZ3Vlc3NlczsKKyAgICBpZiAobV9lbmNoYW50RGljdGlvbmFyaWVzLmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIGd1ZXNzZXM7CisKKyAgICBmb3IgKFZlY3RvcjxFbmNoYW50RGljdCo+Ojpj
b25zdF9pdGVyYXRvciBpdGVyID0gbV9lbmNoYW50RGljdGlvbmFyaWVzLmJlZ2luKCk7IGl0ZXIg
IT0gbV9lbmNoYW50RGljdGlvbmFyaWVzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgc2l6ZV90
IG51bWJlck9mU3VnZ2VzdGlvbnM7CisgICAgICAgIHNpemVfdCBpOworCisgICAgICAgIGdjaGFy
Kiogc3VnZ2VzdGlvbnMgPSBlbmNoYW50X2RpY3Rfc3VnZ2VzdCgqaXRlciwgd29yZC51dGY4KCku
ZGF0YSgpLCAtMSwgJm51bWJlck9mU3VnZ2VzdGlvbnMpOworICAgICAgICBpZiAobnVtYmVyT2ZT
dWdnZXN0aW9ucyA8PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG51
bWJlck9mU3VnZ2VzdGlvbnMgPiBtYXhpbXVtTnVtYmVyT2ZTdWdnZXN0aW9ucykKKyAgICAgICAg
ICAgIG51bWJlck9mU3VnZ2VzdGlvbnMgPSBtYXhpbXVtTnVtYmVyT2ZTdWdnZXN0aW9uczsKKwor
ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyT2ZTdWdnZXN0aW9uczsgaSsrKQorICAgICAg
ICAgICAgZ3Vlc3Nlcy5hcHBlbmQoU3RyaW5nKHN1Z2dlc3Rpb25zW2ldKSk7CisKKyAgICAgICAg
ZW5jaGFudF9kaWN0X2ZyZWVfc3VnZ2VzdGlvbnMoKml0ZXIsIHN1Z2dlc3Rpb25zKTsKKyAgICB9
CisKKyAgICByZXR1cm4gZ3Vlc3NlczsKK30KKwordm9pZCBUZXh0Q2hlY2tlckVuY2hhbnQ6OnVw
ZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMoY29uc3QgU3RyaW5nJiBsYW5ndWFnZXMpCit7Cisg
ICAgVmVjdG9yPEVuY2hhbnREaWN0Kj4gc3BlbGxEaWN0aW9uYXJpZXM7CisKKyAgICBpZiAoIWxh
bmd1YWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gbGFuZ3VhZ2VzVmVj
dG9yOworICAgICAgICBsYW5ndWFnZXMuc3BsaXQoc3RhdGljX2Nhc3Q8VUNoYXI+KCcsJyksIGxh
bmd1YWdlc1ZlY3Rvcik7CisgICAgICAgIGZvciAoVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJh
dG9yIGl0ZXIgPSBsYW5ndWFnZXNWZWN0b3IuYmVnaW4oKTsgaXRlciAhPSBsYW5ndWFnZXNWZWN0
b3IuZW5kKCk7ICsraXRlcikgeworICAgICAgICAgICAgR093blB0cjxnY2hhcj4gY3VycmVudExh
bmd1YWdlKGdfc3RyZHVwKGl0ZXItPnV0ZjgoKS5kYXRhKCkpKTsKKyAgICAgICAgICAgIGlmIChl
bmNoYW50X2Jyb2tlcl9kaWN0X2V4aXN0cyhtX2Jyb2tlciwgY3VycmVudExhbmd1YWdlLmdldCgp
KSkgeworICAgICAgICAgICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJf
cmVxdWVzdF9kaWN0KG1fYnJva2VyLCBjdXJyZW50TGFuZ3VhZ2UuZ2V0KCkpOworICAgICAgICAg
ICAgICAgIHNwZWxsRGljdGlvbmFyaWVzLmFwcGVuZChkaWN0KTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGxhbmd1YWdlID0gcGFu
Z29fbGFuZ3VhZ2VfdG9fc3RyaW5nKHBhbmdvX2xhbmd1YWdlX2dldF9kZWZhdWx0KCkpOworICAg
ICAgICBpZiAoZW5jaGFudF9icm9rZXJfZGljdF9leGlzdHMobV9icm9rZXIsIGxhbmd1YWdlKSkg
eworICAgICAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBlbmNoYW50X2Jyb2tlcl9yZXF1ZXN0
X2RpY3QobV9icm9rZXIsIGxhbmd1YWdlKTsKKyAgICAgICAgICAgIHNwZWxsRGljdGlvbmFyaWVz
LmFwcGVuZChkaWN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIGRpY3Rp
b25hcmllcyBzZWxlY3RlZCwgd2UgZ2V0IG9uZSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgICAg
VmVjdG9yPENTdHJpbmc+IGFsbERpY3Rpb25hcmllczsKKyAgICAgICAgICAgIGVuY2hhbnRfYnJv
a2VyX2xpc3RfZGljdHMobV9icm9rZXIsIGdldEF2YWlsYWJsZURpY3Rpb25hcmllc0NhbGxiYWNr
LCAmYWxsRGljdGlvbmFyaWVzKTsKKyAgICAgICAgICAgIGlmICghYWxsRGljdGlvbmFyaWVzLmlz
RW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEVuY2hhbnREaWN0KiBkaWN0ID0gZW5jaGFudF9i
cm9rZXJfcmVxdWVzdF9kaWN0KG1fYnJva2VyLCBhbGxEaWN0aW9uYXJpZXNbMF0uZGF0YSgpKTsK
KyAgICAgICAgICAgICAgICBzcGVsbERpY3Rpb25hcmllcy5hcHBlbmQoZGljdCk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZnJlZUVuY2hhbnRCcm9rZXJEaWN0aW9uYXJp
ZXMoKTsKKyAgICBtX2VuY2hhbnREaWN0aW9uYXJpZXMgPSBzcGVsbERpY3Rpb25hcmllczsKK30K
Kwordm9pZCBUZXh0Q2hlY2tlckVuY2hhbnQ6OmZyZWVFbmNoYW50QnJva2VyRGljdGlvbmFyaWVz
KCkKK3sKKyAgICBmb3IgKFZlY3RvcjxFbmNoYW50RGljdCo+Ojpjb25zdF9pdGVyYXRvciBpdGVy
ID0gbV9lbmNoYW50RGljdGlvbmFyaWVzLmJlZ2luKCk7IGl0ZXIgIT0gbV9lbmNoYW50RGljdGlv
bmFyaWVzLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGVuY2hhbnRfYnJva2VyX2ZyZWVfZGljdCht
X2Jyb2tlciwgKml0ZXIpOworfQorCisjZW5kaWYgLy8gRU5BQkxFKFNQRUxMQ0hFQ0spCisKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2VyRW5j
aGFudC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dENoZWNrZXJFbmNo
YW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5NzU1ZQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRDaGVja2Vy
RW5jaGFudC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSWdh
bGlhIFMuTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKi8KKworI2lmbmRlZiBUZXh0Q2hlY2tlckVuY2hhbnRfaAorI2RlZmluZSBUZXh0Q2hlY2tl
ckVuY2hhbnRfaAorCisjaWYgRU5BQkxFKFNQRUxMQ0hFQ0spCisKKyNpbmNsdWRlIDxlbmNoYW50
Lmg+CisjaW5jbHVkZSA8d3RmL0Zhc3RBbGxvY0Jhc2UuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093
blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZT
dHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBUZXh0Q2hlY2tlckVuY2hh
bnQgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworCitwdWJsaWM6CisgICAgc3RhdGlj
IFBhc3NPd25QdHI8VGV4dENoZWNrZXJFbmNoYW50PiBjcmVhdGUoKSB7IHJldHVybiBhZG9wdFB0
cihuZXcgVGV4dENoZWNrZXJFbmNoYW50KTsgfQorICAgIHZpcnR1YWwgflRleHRDaGVja2VyRW5j
aGFudCgpOworCisgICAgdm9pZCBpZ25vcmVXb3JkKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQg
bGVhcm5Xb3JkKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgY2hlY2tTcGVsbGluZ09mU3RyaW5n
KGNvbnN0IFN0cmluZyYsIGludCYgbWlzc3BlbGxpbmdMb2NhdGlvbiwgaW50JiBtaXNzcGVsbGlu
Z0xlbmd0aCk7CisgICAgVmVjdG9yPFN0cmluZz4gZ2V0R3Vlc3Nlc0ZvcldvcmQoY29uc3QgU3Ry
aW5nJik7CisgICAgdm9pZCB1cGRhdGVTcGVsbENoZWNraW5nTGFuZ3VhZ2VzKGNvbnN0IFN0cmlu
ZyYgbGFuZ3VhZ2VzKTsKKworcHJpdmF0ZToKKyAgICBUZXh0Q2hlY2tlckVuY2hhbnQoKTsKKyAg
ICB2b2lkIGZyZWVFbmNoYW50QnJva2VyRGljdGlvbmFyaWVzKCk7CisKKyAgICBFbmNoYW50QnJv
a2VyKiBtX2Jyb2tlcjsKKyAgICBWZWN0b3I8RW5jaGFudERpY3QqPiBtX2VuY2hhbnREaWN0aW9u
YXJpZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUo
U1BFTExDSEVDSykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2d0ay9DaGFu
Z2VMb2cgYi9Tb3VyY2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKaW5kZXggOGZmNjFhOC4uMmRiZTJi
MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9ndGsvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9X
ZWJLaXQvZ3RrL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBACisyMDEyLTA4LTAyICBNYXJpbyBT
YW5jaGV6IFByYWRhICA8bXNhbmNoZXpAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBBZGQg
YSBuZXcgYW5kIHJldXNhYmxlIGVuY2hhbnQtYmFzZWQgc3BlbGxjaGVja2VyIGluIFdlYkNvcmUK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkwMjY5CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVtb3ZlIGVu
Y2hhbnQgc3BlY2lmaWMgY29kZSBmcm9tIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnQgYW5kCisg
ICAgICAgIGltcGxlbWVudCBpdCByZWx5aW5nIGluIHRoZSBuZXcgVGV4dENoZWNrZXJFbmNoYW50
IGNsYXNzIGluIFdlYkNvcmUuCisKKyAgICAgICAgKiB3ZWJraXQvd2Via2l0c3BlbGxjaGVja2Vy
ZW5jaGFudC5jcHA6CisgICAgICAgIChfV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUp
OgorICAgICAgICAod2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9maW5hbGl6ZSk6CisgICAg
ICAgICh3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2NsYXNzX2luaXQpOgorICAgICAgICAo
d2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9pbml0KToKKyAgICAgICAgKGNoZWNrU3BlbGxp
bmdPZlN0cmluZyk6CisgICAgICAgIChnZXRHdWVzc2VzRm9yV29yZCk6CisgICAgICAgICh1cGRh
dGVTcGVsbENoZWNraW5nTGFuZ3VhZ2VzKToKKyAgICAgICAgKGxlYXJuV29yZCk6CisgICAgICAg
IChpZ25vcmVXb3JkKToKKwogMjAxMi0wNy0zMCAgTWFydGluIFJvYmluc29uICA8bXJvYmluc29u
QGlnYWxpYS5jb20+CiAKICAgICAgICAgW0dUS10gTmV3IGxpbmVzIGF1dG9tYXRpY2FsbHkgYW5k
IHJlcGVhdGVkbHkgYWRkZWQgdG8gbGlzdCBpdGVtcyBpbiBFdGhlcnBhZApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3BwIGIv
U291cmNlL1dlYktpdC9ndGsvd2Via2l0L3dlYmtpdHNwZWxsY2hlY2tlcmVuY2hhbnQuY3BwCmlu
ZGV4IDBlYjQ5ODYuLjA3ZDM0ZDEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvZ3RrL3dlYmtp
dC93ZWJraXRzcGVsbGNoZWNrZXJlbmNoYW50LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2d0ay93
ZWJraXQvd2Via2l0c3BlbGxjaGVja2VyZW5jaGFudC5jcHAKQEAgLTIxLDEyICsyMSwxNSBAQAog
CiAjaWYgRU5BQkxFKFNQRUxMQ0hFQ0spCiAKKyNpbmNsdWRlICJUZXh0Q2hlY2tlckVuY2hhbnQu
aCIKICNpbmNsdWRlICJ3ZWJraXRzcGVsbGNoZWNrZXIuaCIKLSNpbmNsdWRlIDxlbmNoYW50Lmg+
CiAjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KICNpbmNsdWRl
IDx3dGYvZ29iamVjdC9HT3duUHRyLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgog
Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKwogLyoqCiAgKiBTRUNUSU9OOndlYmtpdHNwZWxs
Y2hlY2tlcmVuY2hhbnQKICAqIEBzaG9ydF9kZXNjcmlwdGlvbjogdGhlIGRlZmF1bHQgc3BlbGwg
Y2hlY2tpbmcgaW1wbGVtZW50YXRpb24gZm9yIFdlYktpdEdUSysuCkBAIC0zNSwxMCArMzgsOSBA
QAogICogV2ViS2l0R1RLKy4gSXQgdXNlcyB0aGUgRW5jaGFudCBkaWN0aW9uYXJpZXMgaW5zdGFs
bGVkIG9uIHRoZSBzeXN0ZW0gdG8KICAqIGNvcnJlY3Qgc3BlbGxpbmcuCiAgKi8KLXN0YXRpYyBF
bmNoYW50QnJva2VyKiBicm9rZXIgPSAwOwogCiBzdHJ1Y3QgX1dlYktpdFNwZWxsQ2hlY2tlckVu
Y2hhbnRQcml2YXRlIHsKLSAgICBHU0xpc3QqIGVuY2hhbnREaWN0czsKKyAgICBPd25QdHI8VGV4
dENoZWNrZXJFbmNoYW50PiB0ZXh0Q2hlY2tlckVuY2hhbnQ7CiB9OwogCiBzdGF0aWMgdm9pZCB3
ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X3NwZWxsX2NoZWNrZXJfaW50ZXJmYWNlX2luaXQo
V2ViS2l0U3BlbGxDaGVja2VySW50ZXJmYWNlKiBpbnRlcmZhY2UpOwpAQCAtNDcsMzUgKzQ5LDE2
IEBAIEdfREVGSU5FX1RZUEVfV0lUSF9DT0RFKFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnQsIHdl
YmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBHX0lN
UExFTUVOVF9JTlRFUkZBQ0UoV0VCS0lUX1RZUEVfU1BFTExfQ0hFQ0tFUiwKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJraXRfc3BlbGxfY2hlY2tlcl9l
bmNoYW50X3NwZWxsX2NoZWNrZXJfaW50ZXJmYWNlX2luaXQpKQogCi1zdGF0aWMgdm9pZCBjcmVh
dGVFbmNoYW50QnJva2VySWZOZWVkZWQoKQotewotICAgIGlmICghYnJva2VyKQotICAgICAgICBi
cm9rZXIgPSBlbmNoYW50X2Jyb2tlcl9pbml0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVTcGVs
bENoZWNraW5nTGFuZ3VhZ2UoZ3BvaW50ZXIgZGF0YSwgZ3BvaW50ZXIpCi17Ci0gICAgY3JlYXRl
RW5jaGFudEJyb2tlcklmTmVlZGVkKCk7Ci0KLSAgICBlbmNoYW50X2Jyb2tlcl9mcmVlX2RpY3Qo
YnJva2VyLCBzdGF0aWNfY2FzdDxFbmNoYW50RGljdCo+KGRhdGEpKTsKLX0KLQogc3RhdGljIHZv
aWQgd2Via2l0X3NwZWxsX2NoZWNrZXJfZW5jaGFudF9maW5hbGl6ZShHT2JqZWN0KiBvYmplY3Qp
CiB7CiAgICAgV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUqIHByaXYgPSBXRUJLSVRf
U1BFTExfQ0hFQ0tFUl9FTkNIQU5UKG9iamVjdCktPnByaXY7Ci0KLSAgICBnX3NsaXN0X2ZvcmVh
Y2gocHJpdi0+ZW5jaGFudERpY3RzLCBmcmVlU3BlbGxDaGVja2luZ0xhbmd1YWdlLCAwKTsKLSAg
ICBnX3NsaXN0X2ZyZWUocHJpdi0+ZW5jaGFudERpY3RzKTsKLQotICAgIFdFQktJVF9TUEVMTF9D
SEVDS0VSX0VOQ0hBTlQob2JqZWN0KS0+cHJpdi0+fldlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQ
cml2YXRlKCk7CisgICAgcHJpdi0+fldlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKCk7
CiB9CiAKIHN0YXRpYyB2b2lkIHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfY2xhc3NfaW5p
dChXZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50Q2xhc3MqIGtsYXNzKQogewogICAgIEdPYmplY3RD
bGFzcyogb2JqZWN0Q2xhc3MgPSBHX09CSkVDVF9DTEFTUyhrbGFzcyk7Ci0KICAgICBvYmplY3RD
bGFzcy0+ZmluYWxpemUgPSB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2ZpbmFsaXplOwot
CiAgICAgZ190eXBlX2NsYXNzX2FkZF9wcml2YXRlKGtsYXNzLCBzaXplb2YoV2ViS2l0U3BlbGxD
aGVja2VyRW5jaGFudFByaXZhdGUpKTsKIH0KIApAQCAtODUsMTQ5ICs2OCwzOCBAQCBzdGF0aWMg
dm9pZCB3ZWJraXRfc3BlbGxfY2hlY2tlcl9lbmNoYW50X2luaXQoV2ViS2l0U3BlbGxDaGVja2Vy
RW5jaGFudCogY2hlY2tlcgogICAgIGNoZWNrZXItPnByaXYgPSBwcml2OwogICAgIG5ldyAocHJp
dikgV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUoKTsKIAotICAgIHByaXYtPmVuY2hh
bnREaWN0cyA9IDA7Ci19Ci0KLXN0YXRpYyBib29sIHdvcmRFbmRJc0FDb250cmFjdGlvbkFwb3N0
cm9waGUoY29uc3QgY2hhciogc3RyaW5nLCBsb25nIG9mZnNldCkKLXsKLSAgICBpZiAoZ191dGY4
X2dldF9jaGFyKGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIG9mZnNldCkpICE9IGdf
dXRmOF9nZXRfY2hhcigiJyIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBJZiB0
aGlzIGlzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLCBpdCBjYW5ub3QgYmUgdGhl
IGFwb3N0cm9waGUgcGFydCBvZiBhIGNvbnRyYWN0aW9uLgotICAgIGlmIChvZmZzZXQgPT0gZ191
dGY4X3N0cmxlbihzdHJpbmcsIC0xKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0
dXJuIGdfdW5pY2hhcl9pc2FscGhhKGdfdXRmOF9nZXRfY2hhcihnX3V0Zjhfb2Zmc2V0X3RvX3Bv
aW50ZXIoc3RyaW5nLCBvZmZzZXQgKyAxKSkpOworICAgIHByaXYtPnRleHRDaGVja2VyRW5jaGFu
dCA9IFRleHRDaGVja2VyRW5jaGFudDo6Y3JlYXRlKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNoZWNr
U3BlbGxpbmdPZlN0cmluZyhXZWJLaXRTcGVsbENoZWNrZXIqIGNoZWNrZXIsIGNvbnN0IGNoYXIq
IHN0cmluZywgaW50KiBtaXNzcGVsbGluZ0xvY2F0aW9uLCBpbnQqIG1pc3NwZWxsaW5nTGVuZ3Ro
KQogewogICAgIFdlYktpdFNwZWxsQ2hlY2tlckVuY2hhbnRQcml2YXRlKiBwcml2ID0gV0VCS0lU
X1NQRUxMX0NIRUNLRVJfRU5DSEFOVChjaGVja2VyKS0+cHJpdjsKLQotICAgIEdTTGlzdCogZGlj
dHMgPSBwcml2LT5lbmNoYW50RGljdHM7Ci0gICAgaWYgKCFkaWN0cykKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaW50IGxlbmd0aCA9IGdfdXRmOF9zdHJsZW4oc3RyaW5nLCAtMSk7Ci0KLSAgICBQ
YW5nb0xhbmd1YWdlKiBsYW5ndWFnZShwYW5nb19sYW5ndWFnZV9nZXRfZGVmYXVsdCgpKTsKLSAg
ICBHT3duUHRyPFBhbmdvTG9nQXR0cj4gYXR0cnMoZ19uZXcoUGFuZ29Mb2dBdHRyLCBsZW5ndGgg
KyAxKSk7Ci0KLSAgICAvLyBwYW5nb19nZXRfbG9nX2F0dHJzIHVzZXMgYW4gYWRpdGlvbmFsIHBv
c2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCi0gICAgcGFuZ29fZ2V0X2xvZ19hdHRycyhz
dHJpbmcsIC0xLCAtMSwgbGFuZ3VhZ2UsIGF0dHJzLmdldCgpLCBsZW5ndGggKyAxKTsKLQotICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoICsgMTsgaSsrKSB7Ci0gICAgICAgIC8vIFdlIGdv
IHRocm91Z2ggZWFjaCBjaGFyYWN0ZXIgdW50aWwgd2UgZmluZCBhbiBpc193b3JkX3N0YXJ0LAot
ICAgICAgICAvLyB0aGVuIHdlIGdldCBpbnRvIGFuIGlubmVyIGxvb3AgdG8gZmluZCB0aGUgaXNf
d29yZF9lbmQgY29ycmVzcG9uZGluZwotICAgICAgICAvLyB0byBpdC4KLSAgICAgICAgaWYgKGF0
dHJzLmdldCgpW2ldLmlzX3dvcmRfc3RhcnQpIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IGk7
Ci0gICAgICAgICAgICBpbnQgZW5kID0gaTsKLSAgICAgICAgICAgIGludCB3b3JkTGVuZ3RoOwot
Ci0gICAgICAgICAgICB3aGlsZSAoYXR0cnMuZ2V0KClbZW5kXS5pc193b3JkX2VuZCA8IDEgfHwg
d29yZEVuZElzQUNvbnRyYWN0aW9uQXBvc3Ryb3BoZShzdHJpbmcsIGVuZCkpCi0gICAgICAgICAg
ICAgICAgZW5kKys7Ci0KLSAgICAgICAgICAgIHdvcmRMZW5ndGggPSBlbmQgLSBzdGFydDsKLSAg
ICAgICAgICAgIC8vIFNldCB0aGUgaXRlcmF0b3IgdG8gYmUgYXQgdGhlIGN1cnJlbnQgd29yZCBl
bmQsIHNvIHdlIGRvbid0Ci0gICAgICAgICAgICAvLyBjaGVjayBjaGFyYWN0ZXJzIHR3aWNlLgot
ICAgICAgICAgICAgaSA9IGVuZDsKLQotICAgICAgICAgICAgZ2NoYXIqIGNzdGFydCA9IGdfdXRm
OF9vZmZzZXRfdG9fcG9pbnRlcihzdHJpbmcsIHN0YXJ0KTsKLSAgICAgICAgICAgIGdpbnQgYnl0
ZXMgPSBzdGF0aWNfY2FzdDxnaW50PihnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoc3RyaW5nLCBl
bmQpIC0gY3N0YXJ0KTsKLSAgICAgICAgICAgIEdPd25QdHI8Z2NoYXI+IHdvcmQoZ19uZXcwKGdj
aGFyLCBieXRlcyArIDEpKTsKLQotICAgICAgICAgICAgZ191dGY4X3N0cm5jcHkod29yZC5nZXQo
KSwgY3N0YXJ0LCB3b3JkTGVuZ3RoKTsKLQotICAgICAgICAgICAgZm9yICg7IGRpY3RzOyBkaWN0
cyA9IGRpY3RzLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBz
dGF0aWNfY2FzdDxFbmNoYW50RGljdCo+KGRpY3RzLT5kYXRhKTsKLSAgICAgICAgICAgICAgICBp
ZiAoZW5jaGFudF9kaWN0X2NoZWNrKGRpY3QsIHdvcmQuZ2V0KCksIHdvcmRMZW5ndGgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICptaXNzcGVsbGluZ0xvY2F0aW9uID0gc3RhcnQ7Ci0gICAgICAg
ICAgICAgICAgICAgICptaXNzcGVsbGluZ0xlbmd0aCA9IHdvcmRMZW5ndGg7Ci0gICAgICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBjaGVja2luZywgdGhp
cyB3b3JkIGlzIG9rIGluIGF0IGxlYXN0IG9uZSBkaWN0LgotICAgICAgICAgICAgICAgICAgICAq
bWlzc3BlbGxpbmdMb2NhdGlvbiA9IC0xOwotICAgICAgICAgICAgICAgICAgICAqbWlzc3BlbGxp
bmdMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHJpdi0+dGV4dENoZWNr
ZXJFbmNoYW50LT5jaGVja1NwZWxsaW5nT2ZTdHJpbmcoU3RyaW5nOjpmcm9tVVRGOChzdHJpbmcp
LCAqbWlzc3BlbGxpbmdMb2NhdGlvbiwgKm1pc3NwZWxsaW5nTGVuZ3RoKTsKIH0KIAogc3RhdGlj
IGNoYXIqKiBnZXRHdWVzc2VzRm9yV29yZChXZWJLaXRTcGVsbENoZWNrZXIqIGNoZWNrZXIsIGNv
bnN0IGNoYXIqIHdvcmQsIGNvbnN0IGNoYXIqIGNvbnRleHQpCiB7CiAgICAgV2ViS2l0U3BlbGxD
aGVja2VyRW5jaGFudFByaXZhdGUqIHByaXYgPSBXRUJLSVRfU1BFTExfQ0hFQ0tFUl9FTkNIQU5U
KGNoZWNrZXIpLT5wcml2OwogCi0gICAgR1NMaXN0KiBkaWN0cyA9IHByaXYtPmVuY2hhbnREaWN0
czsKLSAgICBjaGFyKiogZ3Vlc3NlcyA9IDA7CisgICAgVmVjdG9yPFN0cmluZz4gZ3Vlc3NlcyA9
IHByaXYtPnRleHRDaGVja2VyRW5jaGFudC0+Z2V0R3Vlc3Nlc0ZvcldvcmQoU3RyaW5nOjpmcm9t
VVRGOCh3b3JkKSk7CiAKLSAgICBmb3IgKDsgZGljdHM7IGRpY3RzID0gZGljdHMtPm5leHQpIHsK
LSAgICAgICAgc2l6ZV90IG51bWJlck9mU3VnZ2VzdGlvbnM7Ci0gICAgICAgIHNpemVfdCBpOwor
ICAgIGlmIChndWVzc2VzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAg
RW5jaGFudERpY3QqIGRpY3QgPSBzdGF0aWNfY2FzdDxFbmNoYW50RGljdCo+KGRpY3RzLT5kYXRh
KTsKLSAgICAgICAgZ2NoYXIqKiBzdWdnZXN0aW9ucyA9IGVuY2hhbnRfZGljdF9zdWdnZXN0KGRp
Y3QsIHdvcmQsIC0xLCAmbnVtYmVyT2ZTdWdnZXN0aW9ucyk7CisgICAgaW50IGkgPSAwOworICAg
IGludCBudW1iZXJPZkd1ZXNzZXMgPSBndWVzc2VzLnNpemUoKTsKKyAgICBjaGFyKiogZ3Vlc3Nl
c0FycmF5ID0gc3RhdGljX2Nhc3Q8Y2hhcioqPihnX21hbGxvYzAoKG51bWJlck9mR3Vlc3NlcyAr
IDEpICogc2l6ZW9mKGNoYXIqKSkpOworICAgIGZvciAoVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0
ZXJhdG9yIGl0ZXIgPSBndWVzc2VzLmJlZ2luKCk7IGl0ZXIgIT0gZ3Vlc3Nlcy5lbmQoKTsgKytp
dGVyKQorICAgICAgICBndWVzc2VzQXJyYXlbaSsrXSA9IGdfc3RyZHVwKGl0ZXItPnV0ZjgoKS5k
YXRhKCkpOworICAgIGd1ZXNzZXNBcnJheVtpXSA9IDA7CiAKLSAgICAgICAgaWYgKG51bWJlck9m
U3VnZ2VzdGlvbnMgPiAwKSB7Ci0gICAgICAgICAgICBpZiAobnVtYmVyT2ZTdWdnZXN0aW9ucyA+
IDEwKQotICAgICAgICAgICAgICAgIG51bWJlck9mU3VnZ2VzdGlvbnMgPSAxMDsKLQotICAgICAg
ICAgICAgZ3Vlc3NlcyA9IHN0YXRpY19jYXN0PGNoYXIqKj4oZ19tYWxsb2MwKChudW1iZXJPZlN1
Z2dlc3Rpb25zICsgMSkgKiBzaXplb2YoY2hhciopKSk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAw
OyBpIDwgbnVtYmVyT2ZTdWdnZXN0aW9ucyAmJiBpIDwgMTA7IGkrKykKLSAgICAgICAgICAgICAg
ICBndWVzc2VzW2ldID0gZ19zdHJkdXAoc3VnZ2VzdGlvbnNbaV0pOwotCi0gICAgICAgICAgICBn
dWVzc2VzW2ldID0gMDsKLQotICAgICAgICAgICAgZW5jaGFudF9kaWN0X2ZyZWVfc3VnZ2VzdGlv
bnMoZGljdCwgc3VnZ2VzdGlvbnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGd1
ZXNzZXM7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldEF2YWlsYWJsZURpY3Rpb25hcmllc0NhbGxiYWNr
KGNvbnN0IGNoYXIqIGNvbnN0IGxhbmd1YWdlVGFnLCBjb25zdCBjaGFyKiBjb25zdCwgY29uc3Qg
Y2hhciogY29uc3QsIGNvbnN0IGNoYXIqIGNvbnN0LCB2b2lkKiBkYXRhKQotewotICAgIFZlY3Rv
cjxDU3RyaW5nPiogZGljdHMgPSBzdGF0aWNfY2FzdDxWZWN0b3I8Q1N0cmluZz4qPihkYXRhKTsK
LQotICAgIGRpY3RzLT5hcHBlbmQobGFuZ3VhZ2VUYWcpOworICAgIHJldHVybiBndWVzc2VzQXJy
YXk7CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMoV2ViS2l0
U3BlbGxDaGVja2VyKiBjaGVja2VyLCBjb25zdCBjaGFyKiBsYW5ndWFnZXMpCiB7Ci0gICAgR1NM
aXN0KiBzcGVsbERpY3Rpb25hcmllcyA9IDA7Ci0KICAgICBXZWJLaXRTcGVsbENoZWNrZXJFbmNo
YW50UHJpdmF0ZSogcHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VOQ0hBTlQoY2hlY2tlcikt
PnByaXY7Ci0KLSAgICBjcmVhdGVFbmNoYW50QnJva2VySWZOZWVkZWQoKTsKLQotICAgIGlmIChs
YW5ndWFnZXMpIHsKLSAgICAgICAgY2hhcioqIGxhbmdzID0gZ19zdHJzcGxpdChsYW5ndWFnZXMs
ICIsIiwgLTEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgbGFuZ3NbaV07IGkrKykgewotICAg
ICAgICAgICAgaWYgKGVuY2hhbnRfYnJva2VyX2RpY3RfZXhpc3RzKGJyb2tlciwgbGFuZ3NbaV0p
KSB7Ci0gICAgICAgICAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBlbmNoYW50X2Jyb2tlcl9y
ZXF1ZXN0X2RpY3QoYnJva2VyLCBsYW5nc1tpXSk7Ci0gICAgICAgICAgICAgICAgc3BlbGxEaWN0
aW9uYXJpZXMgPSBnX3NsaXN0X2FwcGVuZChzcGVsbERpY3Rpb25hcmllcywgZGljdCk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ19zdHJmcmVldihsYW5ncyk7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgY29uc3QgY2hhciogbGFuZ3VhZ2UgPSBwYW5nb19sYW5ndWFnZV90b19z
dHJpbmcoZ3RrX2dldF9kZWZhdWx0X2xhbmd1YWdlKCkpOwotICAgICAgICBpZiAoZW5jaGFudF9i
cm9rZXJfZGljdF9leGlzdHMoYnJva2VyLCBsYW5ndWFnZSkpIHsKLSAgICAgICAgICAgIEVuY2hh
bnREaWN0KiBkaWN0ID0gZW5jaGFudF9icm9rZXJfcmVxdWVzdF9kaWN0KGJyb2tlciwgbGFuZ3Vh
Z2UpOwotICAgICAgICAgICAgc3BlbGxEaWN0aW9uYXJpZXMgPSBnX3NsaXN0X2FwcGVuZChzcGVs
bERpY3Rpb25hcmllcywgZGljdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBO
byBkaWN0aW9uYXJpZXMgc2VsZWN0ZWQsIHdlIGdldCBvbmUgZnJvbSB0aGUgbGlzdC4KLSAgICAg
ICAgICAgIFZlY3RvcjxDU3RyaW5nPiBhbGxEaWN0aW9uYXJpZXM7Ci0gICAgICAgICAgICBlbmNo
YW50X2Jyb2tlcl9saXN0X2RpY3RzKGJyb2tlciwgZ2V0QXZhaWxhYmxlRGljdGlvbmFyaWVzQ2Fs
bGJhY2ssICZhbGxEaWN0aW9uYXJpZXMpOwotICAgICAgICAgICAgaWYgKCFhbGxEaWN0aW9uYXJp
ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBlbmNo
YW50X2Jyb2tlcl9yZXF1ZXN0X2RpY3QoYnJva2VyLCBhbGxEaWN0aW9uYXJpZXNbMF0uZGF0YSgp
KTsKLSAgICAgICAgICAgICAgICBzcGVsbERpY3Rpb25hcmllcyA9IGdfc2xpc3RfYXBwZW5kKHNw
ZWxsRGljdGlvbmFyaWVzLCBkaWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0K
LSAgICBnX3NsaXN0X2ZvcmVhY2gocHJpdi0+ZW5jaGFudERpY3RzLCBmcmVlU3BlbGxDaGVja2lu
Z0xhbmd1YWdlLCAwKTsKLSAgICBnX3NsaXN0X2ZyZWUocHJpdi0+ZW5jaGFudERpY3RzKTsKLSAg
ICBwcml2LT5lbmNoYW50RGljdHMgPSBzcGVsbERpY3Rpb25hcmllczsKKyAgICBwcml2LT50ZXh0
Q2hlY2tlckVuY2hhbnQtPnVwZGF0ZVNwZWxsQ2hlY2tpbmdMYW5ndWFnZXMoU3RyaW5nOjpmcm9t
VVRGOChsYW5ndWFnZXMpKTsKIH0KIAogc3RhdGljIGNoYXIqIGdldEF1dG9jb3JyZWN0U3VnZ2Vz
dGlvbnNGb3JNaXNzcGVsbGVkV29yZChXZWJLaXRTcGVsbENoZWNrZXIqIGNoZWNrZXIsIGNvbnN0
IGNoYXIqIHdvcmQpCkBAIC0yMzgsMjUgKzExMCwxMyBAQCBzdGF0aWMgY2hhciogZ2V0QXV0b2Nv
cnJlY3RTdWdnZXN0aW9uc0Zvck1pc3NwZWxsZWRXb3JkKFdlYktpdFNwZWxsQ2hlY2tlciogY2hl
Ywogc3RhdGljIHZvaWQgbGVhcm5Xb3JkKFdlYktpdFNwZWxsQ2hlY2tlciogY2hlY2tlciwgY29u
c3QgY2hhciogd29yZCkKIHsKICAgICBXZWJLaXRTcGVsbENoZWNrZXJFbmNoYW50UHJpdmF0ZSog
cHJpdiA9IFdFQktJVF9TUEVMTF9DSEVDS0VSX0VOQ0hBTlQoY2hlY2tlciktPnByaXY7Ci0gICAg
R1NMaXN0KiBkaWN0cyA9IHByaXYtPmVuY2hhbnREaWN0czsKLQotICAgIGZvciAoOyBkaWN0czsg
ZGljdHMgPSBkaWN0cy0+bmV4dCkgewotICAgICAgICBFbmNoYW50RGljdCogZGljdCA9IHN0YXRp
Y19jYXN0PEVuY2hhbnREaWN0Kj4oZGljdHMtPmRhdGEpOwotCi0gICAgICAgIGVuY2hhbnRfZGlj
dF9hZGRfdG9fcGVyc29uYWwoZGljdCwgd29yZCwgLTEpOwotICAgIH0KKyAgICBwcml2LT50ZXh0
Q2hlY2tlckVuY2hhbnQtPmxlYXJuV29yZChTdHJpbmc6OmZyb21VVEY4KHdvcmQpKTsKIH0KIAog
c3RhdGljIHZvaWQgaWdub3JlV29yZChXZWJLaXRTcGVsbENoZWNrZXIqIGNoZWNrZXIsIGNvbnN0
IGNoYXIqIHdvcmQpCiB7CiAgICAgV2ViS2l0U3BlbGxDaGVja2VyRW5jaGFudFByaXZhdGUqIHBy
aXYgPSBXRUJLSVRfU1BFTExfQ0hFQ0tFUl9FTkNIQU5UKGNoZWNrZXIpLT5wcml2OwotICAgIEdT
TGlzdCogZGljdHMgPSBwcml2LT5lbmNoYW50RGljdHM7Ci0KLSAgICBmb3IgKDsgZGljdHM7IGRp
Y3RzID0gZGljdHMtPm5leHQpIHsKLSAgICAgICAgRW5jaGFudERpY3QqIGRpY3QgPSBzdGF0aWNf
Y2FzdDxFbmNoYW50RGljdCo+KGRpY3RzLT5kYXRhKTsKLQotICAgICAgICBlbmNoYW50X2RpY3Rf
YWRkX3RvX3Nlc3Npb24oZGljdCwgd29yZCwgLTEpOwotICAgIH0KKyAgICBwcml2LT50ZXh0Q2hl
Y2tlckVuY2hhbnQtPmlnbm9yZVdvcmQoU3RyaW5nOjpmcm9tVVRGOCh3b3JkKSk7CiB9CiAKIHN0
YXRpYyB2b2lkIHdlYmtpdF9zcGVsbF9jaGVja2VyX2VuY2hhbnRfc3BlbGxfY2hlY2tlcl9pbnRl
cmZhY2VfaW5pdChXZWJLaXRTcGVsbENoZWNrZXJJbnRlcmZhY2UqIGludGVyZmFjZSkKLS0gCjEu
Ny4xMC40Cgo=
</data>
<flag name="review"
          id="165678"
          type_id="1"
          status="+"
          setter="mrobinson"
    />
    <flag name="commit-queue"
          id="165736"
          type_id="3"
          status="-"
          setter="mrobinson"
    />
          </attachment>
      

    </bug>

</bugzilla>