<?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>60255</bug_id>
          
          <creation_ts>2011-05-05 00:40:26 -0700</creation_ts>
          <short_desc>Refactor TextRun creation</short_desc>
          <delta_ts>2011-05-18 00:20:13 -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>Layout and Rendering</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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>59085</blocked>
    
    <blocked>60254</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikolas Zimmermann">zimmermann</reporter>
          <assigned_to name="Nikolas Zimmermann">zimmermann</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>gustavo.noronha</cc>
    
    <cc>gustavo</cc>
    
    <cc>leviw</cc>
    
    <cc>mitz</cc>
    
    <cc>rniwa</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-ews</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>398593</commentid>
    <comment_count>0</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-05 00:40:26 -0700</bug_when>
    <thetext>TextRun has an ugly constructor, that takes 8 (!) arguments.
As first step I&apos;m creating a TextRunFactory.h in rendering/ with helper functions to create TextRuns.
As a next step we can remove the TextRun catch-it-all constructor, and replace it with explicit setters/getters.
TextRunFactory will also play a central role in fixing bug 60524.

This whole work blocks bug 59085, my attempt to integrate SVG Fonts within the GlyphPage concept.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398596</commentid>
    <comment_count>1</comment_count>
      <attachid>92385</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-05 01:02:24 -0700</bug_when>
    <thetext>Created attachment 92385
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398602</commentid>
    <comment_count>2</comment_count>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-05-05 01:13:16 -0700</bug_when>
    <thetext>Attachment 92385 did not build on qt:
Build output: http://queues.webkit.org/results/8551816</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398605</commentid>
    <comment_count>3</comment_count>
      <attachid>92386</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-05 01:17:24 -0700</bug_when>
    <thetext>Created attachment 92386
Patch v2

Missing include in SVGTextMetrics, not sure why it builds here..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398607</commentid>
    <comment_count>4</comment_count>
      <attachid>92385</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-05-05 01:19:18 -0700</bug_when>
    <thetext>Comment on attachment 92385
Patch

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

Just some comments. LGTM in general. Waiting for your new patch to give r=me.

&gt; Source/WebCore/rendering/InlineTextBox.cpp:1241
&gt; +    RenderStyle* styleToUse = text-&gt;style(m_firstLine);

Can you assert this please?

&gt; Source/WebCore/rendering/RenderFileUploadControl.cpp:277
&gt; +        float charWidth = style()-&gt;font().width(createTextRunAllowingTrailingExpansion(String(&amp;ch, 1), style()));

This function calls style() multiple times, can you move this to a local var please? (and assert it)

&gt; Source/WebCore/rendering/TextRunFactory.cpp:55
&gt; +    ASSERT(style);

you&apos;re asserting it in createTextRunForInlineTextBox(box, style, textRenderer-&gt;characters() + box-&gt;start(), box-&gt;len(), charactersWithHyphen); no need to do it twice, whats your opinion?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398615</commentid>
    <comment_count>5</comment_count>
      <attachid>92386</attachid>
    <who name="">mitz</who>
    <bug_when>2011-05-05 01:33:32 -0700</bug_when>
    <thetext>Comment on attachment 92386
Patch v2

This patch makes the code bigger (by about 100 lines, if I counted correctly) and more complicated; and turns several private members into public ones for no good reason. It appears that whatever benefit there is in this change, it can be achieved by adding or modifying TextRun constructors and factoring code into protected member functions in [SVG]InlineTextBox. Finally, the prefix “create” is conventionally used for functions that transfer ownership of a heap-allocated object, which is not the case here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398619</commentid>
    <comment_count>6</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-05 01:40:48 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 92386 [details])
&gt; This patch makes the code bigger (by about 100 lines, if I counted correctly) and more complicated; and turns several private members into public ones for no good reason.
More complicated? Are you joking? :-)
The current TextRun creation is very fragile, when it comes to directionalOverride/direction handling, hence the several FIXMEs above the callsites that use TextRun (should this always be LTR?).

&gt; It appears that whatever benefit there is in this change, it can be achieved by adding or modifying TextRun constructors and factoring code into protected member functions in [SVG]InlineTextBox. Finally, the prefix “create” is conventionally used for functions that transfer ownership of a heap-allocated object, which is not the case here.
Ok, I could use &quot;constructTextRun&quot;, as it was done in SVGInlineTextBox before.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398620</commentid>
    <comment_count>7</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-05 01:46:52 -0700</bug_when>
    <thetext>Examples:
TextRun textRun(string, length, false, 0, 0, TextRun::AllowTrailingExpansion, style()-&gt;direction(), style()-&gt;unicodeBidi() == Override);

TextRun(str.characters(), str.length(), false, 0, 0, TextRun::AllowTrailingExpansion, LTR, style-&gt;visuallyOrdered()), IntPoint(m_x + tx, m_y + ty + style-&gt;fontMetrics().ascent()

TextRun textRun(characters, length, textRenderer()-&gt;allowTabs(), textPos(), m_expansion, expansionBehavior(), direction(), m_dirOverride || styleToUse-&gt;visuallyOrdered());

I&apos;m especially concerned regarding the direction, and the direction override handling, which is completly inconsistent atm. It&apos;s still inconsistent with this patch, as I didn&apos;t add &quot;RespectDirection | RespectDirectionOverride&quot; flags everywhere, but for sure this is easier now, than before.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398624</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-05-05 01:56:01 -0700</bug_when>
    <thetext>Attachment 92385 did not build on chromium:
Build output: http://queues.webkit.org/results/8554830</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398626</commentid>
    <comment_count>9</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-05 01:58:55 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 92386 [details])
&gt; This patch makes the code bigger (by about 100 lines, if I counted correctly) and more complicated; and turns several private members into public ones for no good reason. It appears that whatever benefit there is in this change, it can be achieved by adding or modifying TextRun constructors and factoring code into protected member functions in [SVG]InlineTextBox. Finally, the prefix “create” is conventionally used for functions that transfer ownership of a heap-allocated object, which is not the case here.

Another note: I can&apos;t pass a RenderStyle* object to TextRun, which would extract the direction / directionalOverride settings, as that would be a layering violation. But still I&apos;d like a central place which does that, instead of relying on the fact, that each call site of TextRun knows how to find out the direction, and/or wheter it&apos;s overriden (InlineBoxes need to check m_dirOverride || style-&gt;visuallyOrdered(), other places only need the style-&gt;visuallyOrdered() checks, etc.)

This patch was meant as starting point for more refactorizations, that I have in mind, all preparing for the master patch at bug https://bugs.webkit.org/show_bug.cgi?id=59085.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398643</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-05-05 03:11:13 -0700</bug_when>
    <thetext>Attachment 92385 did not pass chromium-ews:
Output: http://queues.webkit.org/results/8551840</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398713</commentid>
    <comment_count>11</comment_count>
    <who name="Collabora GTK+ EWS bot">gustavo.noronha</who>
    <bug_when>2011-05-05 07:40:23 -0700</bug_when>
    <thetext>Attachment 92385 did not build on gtk:
Build output: http://queues.webkit.org/results/8554913</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>399004</commentid>
    <comment_count>12</comment_count>
    <who name="">mitz</who>
    <bug_when>2011-05-05 14:07:18 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Examples:
&gt; TextRun textRun(string, length, false, 0, 0, TextRun::AllowTrailingExpansion, style()-&gt;direction(), style()-&gt;unicodeBidi() == Override);
&gt; 
&gt; TextRun(str.characters(), str.length(), false, 0, 0, TextRun::AllowTrailingExpansion, LTR, style-&gt;visuallyOrdered()), IntPoint(m_x + tx, m_y + ty + style-&gt;fontMetrics().ascent()
&gt; 
&gt; TextRun textRun(characters, length, textRenderer()-&gt;allowTabs(), textPos(), m_expansion, expansionBehavior(), direction(), m_dirOverride || styleToUse-&gt;visuallyOrdered());
&gt; 
&gt; I&apos;m especially concerned regarding the direction, and the direction override handling, which is completly inconsistent atm. It&apos;s still inconsistent with this patch, as I didn&apos;t add &quot;RespectDirection | RespectDirectionOverride&quot; flags everywhere, but for sure this is easier now, than before.

You’ve identified some real problems with the code and it’s good that you want to solve them. I rejected your proposed solution because it adds code and complexity and makes internal notions public. I suggested an alternative way of addressing the same problems, which is more in line with how we deal with such issues in the rendering code, and does not have the downsides I just pointed out.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>401117</commentid>
    <comment_count>13</comment_count>
      <attachid>92935</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-10 03:22:35 -0700</bug_when>
    <thetext>Created attachment 92935
Patch v3

Less intrusive approach, w/o adding a TextRunFactory. I hope this is better now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>402583</commentid>
    <comment_count>14</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-05-11 20:16:16 -0700</bug_when>
    <thetext>I&apos;m sure Levi and Ryosuke will have opinions here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>404354</commentid>
    <comment_count>15</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-16 01:23:52 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #7)
&gt; &gt; Examples:
&gt; &gt; TextRun textRun(string, length, false, 0, 0, TextRun::AllowTrailingExpansion, style()-&gt;direction(), style()-&gt;unicodeBidi() == Override);
&gt; &gt; 
&gt; &gt; TextRun(str.characters(), str.length(), false, 0, 0, TextRun::AllowTrailingExpansion, LTR, style-&gt;visuallyOrdered()), IntPoint(m_x + tx, m_y + ty + style-&gt;fontMetrics().ascent()
&gt; &gt; 
&gt; &gt; TextRun textRun(characters, length, textRenderer()-&gt;allowTabs(), textPos(), m_expansion, expansionBehavior(), direction(), m_dirOverride || styleToUse-&gt;visuallyOrdered());
&gt; &gt; 
&gt; &gt; I&apos;m especially concerned regarding the direction, and the direction override handling, which is completly inconsistent atm. It&apos;s still inconsistent with this patch, as I didn&apos;t add &quot;RespectDirection | RespectDirectionOverride&quot; flags everywhere, but for sure this is easier now, than before.
&gt; 
&gt; You’ve identified some real problems with the code and it’s good that you want to solve them. I rejected your proposed solution because it adds code and complexity and makes internal notions public. I suggested an alternative way of addressing the same problems, which is more in line with how we deal with such issues in the rendering code, and does not have the downsides I just pointed out.

Dan, it&apos;s been 10+ days since your last reaction. You&apos;re ignoring private mails as well. Shall I find another reviewer?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>404572</commentid>
    <comment_count>16</comment_count>
      <attachid>92935</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2011-05-16 10:25:50 -0700</bug_when>
    <thetext>Comment on attachment 92935
Patch v3

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

I&apos;m not against a Ctor with 8 arguments, and I think that it makes sense, if the object really needs all 8 arguments to interact in a sane way instead of calling 8 setters afterwards (just as an example). But your general concept looks sane, even if we may have different opinions about the ctor. Please remove the comments about the Ctor with 8 arguments. This can be addressed in a later patch. Instead concentrate your descriptions about the other benefits. Layering violation, and the fact that you centralized some logic. r=me with comments.

&gt; Source/WebCore/ChangeLog:9
&gt; +        The long-term goal is to remove the ugly eight parameters catch-it-all TextRun constructor, and

Please remove this sentence or make it as proposal, not as future plan.

&gt; Source/WebCore/rendering/RenderBlock.cpp:6338
&gt; +    // FIXME: Remove TextRuns all-in-one-constructor and use explicit setters here.

Wouldn&apos;t add a fixme here.

&gt; Source/WebCore/rendering/RenderTextControl.cpp:545
&gt; +    return style()-&gt;font().width(constructTextRunAllowTrailingExpansion(String(&amp;ch, 1), style()));

Why do you create a String here? Can&apos;t you use the constructTextRunAllowTrailingExpansion with UChar* and length?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>404599</commentid>
    <comment_count>17</comment_count>
      <attachid>92935</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-05-16 10:57:50 -0700</bug_when>
    <thetext>Comment on attachment 92935
Patch v3

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

Despite mitz being AWOL, this is definitely code that I would want hyatt or mitz to chime in on.  I understand what you&apos;re doing is very just moving stuff into create functions.  But I odn&apos;t really understand the &quot;allowTrailingExpansion&quot; flag, or why that justifies being a separate constructor?

&gt; Source/WebCore/rendering/InlineTextBox.cpp:1292
&gt; +    return constructTextRun(style, textRenderer-&gt;characters() + start(), len(), charactersWithHyphen);

What about direction() here?

&gt; Source/WebCore/rendering/RenderFileUploadControl.cpp:280
&gt; +        float charWidth = style-&gt;font().width(constructTextRunAllowTrailingExpansion(String(&amp;ch, 1), style));

It seems like single-char text runs used for char measuring are a special case and should be treated that way. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>404600</commentid>
    <comment_count>18</comment_count>
      <attachid>92935</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-05-16 11:02:56 -0700</bug_when>
    <thetext>Comment on attachment 92935
Patch v3

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

&gt; Source/WebCore/rendering/EllipsisBox.cpp:57
&gt; +    context-&gt;drawText(style-&gt;font(), RenderBlock::constructTextRunAllowTrailingExpansion(m_str, style), IntPoint(m_x + tx, m_y + ty + style-&gt;fontMetrics().ascent()));

Why don&apos;t we just split off a separte constructor instead of making a construct function?  I guess the construct function allows us to easily use members of the RenderBlock?  I don&apos;t see this function using any though...

&gt; Source/WebCore/rendering/InlineTextBox.cpp:1076
&gt; +    TextRun run = constructTextRun(style);

This function on the other hand, does make a lot of sense.  This allows us to share repeated calls to textRenderer(), textPos(), expansionBehavior(), etc. and so having a helper function for text run consturction on InlineBox sounds like a good idea.

&gt; Source/WebCore/rendering/RenderBlock.cpp:6339
&gt; +    return TextRun(characters, length, false, 0, 0, TextRun::AllowTrailingExpansion, textDirection, directionalOverride);

This feels like a separtae TextRun constructor, since you always pass false, 0, 0 here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>405547</commentid>
    <comment_count>19</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-18 00:16:51 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; (From update of attachment 92935 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=92935&amp;action=review
&gt; 
&gt; Despite mitz being AWOL, this is definitely code that I would want hyatt or mitz to chime in on.  I understand what you&apos;re doing is very just moving stuff into create functions.  But I odn&apos;t really understand the &quot;allowTrailingExpansion&quot; flag, or why that justifies being a separate constructor?
I guess you meant a seperate function?

&gt; 
&gt; &gt; Source/WebCore/rendering/InlineTextBox.cpp:1292
&gt; &gt; +    return constructTextRun(style, textRenderer-&gt;characters() + start(), len(), charactersWithHyphen);
&gt; 
&gt; What about direction() here?
This is handled by constructTextRun, that&apos;s being called?

&gt; 
&gt; &gt; Source/WebCore/rendering/RenderFileUploadControl.cpp:280
&gt; &gt; +        float charWidth = style-&gt;font().width(constructTextRunAllowTrailingExpansion(String(&amp;ch, 1), style));
&gt; 
&gt; It seems like single-char text runs used for char measuring are a special case and should be treated that way. :)
We can for sure do more refactoring here, and I plan to do that!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>405548</commentid>
    <comment_count>20</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-18 00:18:00 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (From update of attachment 92935 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=92935&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/rendering/EllipsisBox.cpp:57
&gt; &gt; +    context-&gt;drawText(style-&gt;font(), RenderBlock::constructTextRunAllowTrailingExpansion(m_str, style), IntPoint(m_x + tx, m_y + ty + style-&gt;fontMetrics().ascent()));
&gt; 
&gt; Why don&apos;t we just split off a separte constructor instead of making a construct function?  I guess the construct function allows us to easily use members of the RenderBlock?  I don&apos;t see this function using any though...
The introduction of these functions has a differnet purpose. I want to kill the RenderObject layering violation in TextRun, this is just the preparation patch. I think the next patch will make it much clearer.

&gt; 
&gt; &gt; Source/WebCore/rendering/InlineTextBox.cpp:1076
&gt; &gt; +    TextRun run = constructTextRun(style);
&gt; 
&gt; This function on the other hand, does make a lot of sense.  This allows us to share repeated calls to textRenderer(), textPos(), expansionBehavior(), etc. and so having a helper function for text run consturction on InlineBox sounds like a good idea.
&gt; 
&gt; &gt; Source/WebCore/rendering/RenderBlock.cpp:6339
&gt; &gt; +    return TextRun(characters, length, false, 0, 0, TextRun::AllowTrailingExpansion, textDirection, directionalOverride);
&gt; 
&gt; This feels like a separtae TextRun constructor, since you always pass false, 0, 0 here.
Definately, I delayed this for a further patch...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>405549</commentid>
    <comment_count>21</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2011-05-18 00:20:13 -0700</bug_when>
    <thetext>Landed in r86739.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92385</attachid>
            <date>2011-05-05 01:02:24 -0700</date>
            <delta_ts>2011-05-10 03:22:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>TextRun.diff</filename>
            <type>text/plain</type>
            <size>46972</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg1ODQwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTEtMDUtMDUgIE5pa29sYXMg
WmltbWVybWFubiAgPG56aW1tZXJtYW5uQHJpbS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVmYWN0b3IgVGV4dFJ1biBjcmVhdGlvbgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjAyNTUKKworICAg
ICAgICBJbnRyb2R1Y2UgcmVuZGVyaW5nL1RleHRSdW5GYWN0b3J5LmgsIHdoaWNoIHByb3ZpZGVz
IHNldmVyYWwgZnJlZSBmdW5jdGlvbnMgdGhhdCBlYXNlCisgICAgICAgIGluIGNyZWF0aW5nIFRl
eHRSdW5zLCBmb3IgSW5saW5lVGV4dEJveC9TVkdJbmxpbmVUZXh0Qm94LCBhbmQgdmFyaW91cyBv
dGhlciBwbGFjZXMgaW4gcmVuZGVyaW5nLgorICAgICAgICBUaGUgbG9uZy10ZXJtIGdvYWwgaXMg
dG8gcmVtb3ZlIHRoZSB1Z2x5IGVpZ2h0IHBhcmFtZXRlcnMgY2F0Y2gtaXQtYWxsIFRleHRSdW4g
Y29uc3RydWN0b3IsIGFuZAorICAgICAgICByZXBsYWNlIGl0IHdpdGggZXhwbGljaXQgc2V0dGVy
cy9nZXR0ZXJzLiBUbyBhdm9pZCBleHBhbmRpbmcgZG96ZW5zIG9mIGNhbGxzaXRlcywgd2hlbiBy
ZW1vdmluZworICAgICAgICB0aGUgY2F0Y2gtaXQtYWxsIGNvbnN0cnVjdG9yLCBUZXh0UnVuRmFj
dG9yeSBpcyBpbnRyb2R1Y2RlZCwgd2hpY2ggaGlkZXMgdGhlIGRldGFpbHMgb2YgY3JlYXRpbmcK
KyAgICAgICAgYSBUZXh0UnVuLgorCisgICAgICAgIEZ1cnRoZXJtb3JlIGl0IHdpbGwgYmUgdXNl
ZCB0byByZW1vdmUgdGhlIHBsYXRmb3JtIGxheWVyaW5nIHZpb2xhdGlvbiwgdGhhdCBUZXh0UnVu
IHN0b3JlcworICAgICAgICBSZW5kZXJPYmplY3QgcG9pbnRlcnMgZm9yIHRoZSBzYWtlIG9mIFNW
RyBGb250cyBzdXBwb3J0LCBzZWUgYnVnIDYwMjU0LgorCisgICAgICAgIE5vIGNoYW5nZSBpbiBm
dW5jdGlvbmFsaXksIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIENNYWtlTGlzdHMudHh0Ogor
ICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3QuYW06CisgICAgICAgICogV2ViQ29yZS5neXBpOgor
ICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAg
ICAgICAgKiByZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWxs
aXBzaXNCb3g6OnBhaW50KToKKyAgICAgICAgKFdlYkNvcmU6OkVsbGlwc2lzQm94OjpzZWxlY3Rp
b25SZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsbGlwc2lzQm94OjpwYWludFNlbGVjdGlvbik6
CisgICAgICAgICogcmVuZGVyaW5nL0lubGluZUJveC5oOgorICAgICAgICAoV2ViQ29yZTo6SW5s
aW5lQm94OjpkaXJPdmVycmlkZSk6CisgICAgICAgICogcmVuZGVyaW5nL0lubGluZVRleHRCb3gu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6c2VsZWN0aW9uUmVjdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94OjpwYWludCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbmxpbmVUZXh0Qm94OjpwYWludFNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpJbmxp
bmVUZXh0Qm94OjpwYWludENvbXBvc2l0aW9uQmFja2dyb3VuZCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbmxpbmVUZXh0Qm94OjpwYWludFNwZWxsaW5nT3JHcmFtbWFyTWFya2VyKToKKyAgICAgICAg
KFdlYkNvcmU6OklubGluZVRleHRCb3g6OnBhaW50VGV4dE1hdGNoTWFya2VyKToKKyAgICAgICAg
KFdlYkNvcmU6OklubGluZVRleHRCb3g6OmNvbXB1dGVSZWN0Rm9yUmVwbGFjZW1lbnRNYXJrZXIp
OgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9yUG9zaXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6cG9zaXRpb25Gb3JPZmZzZXQpOgorICAg
ICAgICAqIHJlbmRlcmluZy9JbmxpbmVUZXh0Qm94Lmg6CisgICAgICAgIChXZWJDb3JlOjpJbmxp
bmVUZXh0Qm94OjpleHBhbnNpb25CZWhhdmlvcik6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRl
ckVtYmVkZGVkT2JqZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckVtYmVkZGVkT2Jq
ZWN0OjpnZXRSZXBsYWNlbWVudFRleHRHZW9tZXRyeSk6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlckZpbGVVcGxvYWRDb250cm9sLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZpbGVV
cGxvYWRDb250cm9sOjpwYWludE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJGaWxl
VXBsb2FkQ29udHJvbDo6Y29tcHV0ZVByZWZlcnJlZExvZ2ljYWxXaWR0aHMpOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJJbWFnZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJJbWFn
ZTo6c2V0SW1hZ2VTaXplRm9yQWx0VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJJbWFn
ZTo6cGFpbnRSZXBsYWNlZCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxpc3RCb3guY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6dXBkYXRlRnJvbUVsZW1lbnQpOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUZXh0OjphbGxvd1RhYnMpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJv
bC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6Z2V0QXZnQ2hhcldp
ZHRoKToKKyAgICAgICAgKiByZW5kZXJpbmcvVGV4dFJ1bkZhY3RvcnkuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OmNyZWF0ZVRleHRSdW5BbGxvd2luZ1RyYWlsaW5nRXhwYW5zaW9uKToK
KyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZVRleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KToKKyAgICAg
ICAgKFdlYkNvcmU6OmFkanVzdENoYXJhY3RlcnNBbmRMZW5ndGhGb3JIeXBoZW4pOgorICAgICAg
ICAoV2ViQ29yZTo6Y3JlYXRlVGV4dFJ1bkZvclJlbmRlclNWR0lubGluZVRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6Y3JlYXRlVGV4dFJ1bkZvclNWR0lubGluZVRleHRCb3gpOgorICAgICAgICAq
IHJlbmRlcmluZy9UZXh0UnVuRmFjdG9yeS5oOiBBZGRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcv
c3ZnL1JlbmRlclNWR0lubGluZVRleHQuaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR0lu
bGluZVRleHQ6OmFsbG93VGFicyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdJbmxpbmVU
ZXh0Ojp0ZXh0UG9zKToKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRCb3gu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9yUG9zaXRp
b25JbkZyYWdtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6OnNlbGVj
dGlvblJlY3RGb3JUZXh0RnJhZ21lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4
dEJveDo6cGFpbnRUZXh0KToKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRC
b3guaDoKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR1RleHRNZXRyaWNzLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlNWR1RleHRNZXRyaWNzOjptZWFzdXJlQ2hhcmFjdGVyUmFuZ2UpOgorCiAy
MDExLTA1LTA1ICBZb3VuZyBIYW4gTGVlICA8am95YnJvQGNvbXBhbnkxMDAubmV0PgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IENzYWJhIE9zenRyb2dvbsOhYy4KSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMu
dHh0CShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CSh3
b3JraW5nIGNvcHkpCkBAIC0xMjcyLDYgKzEyNzIsNyBAQCBTRVQoV2ViQ29yZV9TT1VSQ0VTCiAg
ICAgcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCiAgICAgcmVuZGVyaW5nL1Njcm9sbEJlaGF2
aW9yLmNwcAogICAgIHJlbmRlcmluZy9TaGFkb3dFbGVtZW50LmNwcAorICAgIHJlbmRlcmluZy9U
ZXh0UnVuRmFjdG9yeS5jcHAKICAgICByZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuY3BwCiAgICAg
cmVuZGVyaW5nL2JyZWFrX2xpbmVzLmNwcAogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9HTlVtYWtl
ZmlsZS5saXN0LmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxp
c3QuYW0JKHJldmlzaW9uIDg1ODM1KQorKysgU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlz
dC5hbQkod29ya2luZyBjb3B5KQpAQCAtMzA3MCw2ICszMDcwLDggQEAgd2ViY29yZV9zb3VyY2Vz
ICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1RleHRRdWVyeS5jcHAgXAog
CVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHVGV4dFF1ZXJ5LmggXAogCVNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9UYWJsZUxheW91dC5oIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvVGV4dFJ1bkZhY3RvcnkuY3BwIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dFJ1
bkZhY3RvcnkuaCBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1RyYWlsaW5nRmxvYXRzUm9v
dElubGluZUJveC5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUu
Y3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuaCBcCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNv
cmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtNTI5Niw2ICs1Mjk2LDggQEAKICAgICAgICAgICAg
ICdyZW5kZXJpbmcvU2hhZG93RWxlbWVudC5jcHAnLAogICAgICAgICAgICAgJ3JlbmRlcmluZy9T
aGFkb3dFbGVtZW50LmgnLAogICAgICAgICAgICAgJ3JlbmRlcmluZy9UYWJsZUxheW91dC5oJywK
KyAgICAgICAgICAgICdyZW5kZXJpbmcvVGV4dFJ1bkZhY3RvcnkuY3BwJywKKyAgICAgICAgICAg
ICdyZW5kZXJpbmcvVGV4dFJ1bkZhY3RvcnkuaCcsCiAgICAgICAgICAgICAncmVuZGVyaW5nL1Ry
YWlsaW5nRmxvYXRzUm9vdElubGluZUJveC5oJywKICAgICAgICAgICAgICdyZW5kZXJpbmcvVHJh
bnNmb3JtU3RhdGUuY3BwJywKICAgICAgICAgICAgICdyZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUu
aCcsCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gODU4MzUpCisrKyBTb3VyY2UvV2ViQ29y
ZS9XZWJDb3JlLnBybwkod29ya2luZyBjb3B5KQpAQCAtMTE1MCw2ICsxMTUwLDcgQEAgU09VUkNF
UyArPSBcCiAgICAgcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwIFwKICAgICByZW5kZXJpbmcv
U2Nyb2xsQmVoYXZpb3IuY3BwIFwKICAgICByZW5kZXJpbmcvU2hhZG93RWxlbWVudC5jcHAgXAor
ICAgIHJlbmRlcmluZy9UZXh0UnVuRmFjdG9yeS5jcHAgXAogICAgIHJlbmRlcmluZy9UcmFuc2Zv
cm1TdGF0ZS5jcHAgXAogICAgIHJlbmRlcmluZy9zdHlsZS9Db250ZW50RGF0YS5jcHAgXAogICAg
IHJlbmRlcmluZy9zdHlsZS9Db3VudGVyRGlyZWN0aXZlcy5jcHAgXApAQCAtMjI0MCw2ICsyMjQx
LDcgQEAgSEVBREVSUyArPSBcCiAgICAgcmVuZGVyaW5nL3N2Zy9TVkdUZXh0TGF5b3V0RW5naW5l
U3BhY2luZy5oIFwKICAgICByZW5kZXJpbmcvc3ZnL1NWR1RleHRNZXRyaWNzLmggXAogICAgIHJl
bmRlcmluZy9zdmcvU1ZHVGV4dFF1ZXJ5LmggXAorICAgIHJlbmRlcmluZy9UZXh0UnVuRmFjdG9y
eS5oIFwKICAgICByZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuaCBcCiAgICAgc3ZnL2FuaW1hdGlv
bi9TTUlMVGltZUNvbnRhaW5lci5oIFwKICAgICBzdmcvYW5pbWF0aW9uL1NNSUxUaW1lLmggXApJ
bmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJl
dmlzaW9uIDg1ODM1KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52
Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTM4NzA4LDYgKzM4NzA4LDE0IEBACiAJCQkJPgogCQkJ
PC9GaWxlPgogCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHJlbmRlcmluZ1xUZXh0UnVu
RmFjdG9yeS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHJlbmRlcmluZ1xUZXh0UnVuRmFjdG9yeS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJ
CTxGaWxlCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcVHJhaWxpbmdGbG9hdHNSb290
SW5saW5lQm94LmgiCiAJCQkJPgogCQkJPC9GaWxlPgpJbmRleDogU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gODU4MzUpCisr
KyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtp
bmcgY29weSkKQEAgLTk5LDYgKzk5LDggQEAKIAkJMDg1QTE1OTMxMjg5QThERDAwMjcxMEUzIC8q
IFNWR0FuaW1hdGVkVHJhbnNmb3JtTGlzdFByb3BlcnR5VGVhck9mZi5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg1QTE1OTIxMjg5QThERDAwMjcxMEUz
IC8qIFNWR0FuaW1hdGVkVHJhbnNmb3JtTGlzdFByb3BlcnR5VGVhck9mZi5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTA4NUI5MkJBMEVGREU3M0Qw
MEU2MTIzQyAvKiBGb3JtRGF0YUJ1aWxkZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMDg1QjkyQjgwRUZERTczRDAwRTYxMjNDIC8qIEZvcm1EYXRh
QnVpbGRlci5jcHAgKi87IH07CiAJCTA4NUI5MkJCMEVGREU3M0QwMEU2MTIzQyAvKiBGb3JtRGF0
YUJ1aWxkZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDA4NUI5MkI5MEVGREU3M0QwMEU2MTIzQyAvKiBGb3JtRGF0YUJ1aWxkZXIuaCAqLzsgc2V0dGlu
Z3MgPSB7QVRUUklCVVRFUyA9ICgpOyB9OyB9OworCQkwODYxQTE5RDEzNjJBQUNBMDAyRTQyMzUg
LyogVGV4dFJ1bkZhY3RvcnkuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMDg2MUExOUIxMzYyQUFDQTAwMkU0MjM1IC8qIFRleHRSdW5GYWN0b3J5LmNw
cCAqLzsgfTsKKwkJMDg2MUExOUUxMzYyQUFDQTAwMkU0MjM1IC8qIFRleHRSdW5GYWN0b3J5Lmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODYxQTE5QzEz
NjJBQUNBMDAyRTQyMzUgLyogVGV4dFJ1bkZhY3RvcnkuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwODY0MUQ0NzEyMTQyRjdEMDA4REU5RjYgLyog
UmVuZGVySW1hZ2VSZXNvdXJjZVN0eWxlSW1hZ2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg2NDFENDUxMjE0MkY3RDAwOERFOUY2IC8qIFJlbmRl
ckltYWdlUmVzb3VyY2VTdHlsZUltYWdlLmNwcCAqLzsgfTsKIAkJMDg2NDFENDgxMjE0MkY3RDAw
OERFOUY2IC8qIFJlbmRlckltYWdlUmVzb3VyY2VTdHlsZUltYWdlLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODY0MUQ0NjEyMTQyRjdEMDA4REU5RjYg
LyogUmVuZGVySW1hZ2VSZXNvdXJjZVN0eWxlSW1hZ2UuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwODZCQkQwRjEzNjAzOUMyMDA4QjE1RDggLyog
R2x5cGguaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4
NkJCRDBFMTM2MDM5QzIwMDhCMTVEOCAvKiBHbHlwaC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC02NDU4LDYgKzY0NjAsOCBAQAogCQkwODVBMTU5
MjEyODlBOEREMDAyNzEwRTMgLyogU1ZHQW5pbWF0ZWRUcmFuc2Zvcm1MaXN0UHJvcGVydHlUZWFy
T2ZmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNWR0FuaW1hdGVkVHJhbnNm
b3JtTGlzdFByb3BlcnR5VGVhck9mZi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkw
ODVCOTJCODBFRkRFNzNEMDBFNjEyM0MgLyogRm9ybURhdGFCdWlsZGVyLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZvcm1EYXRhQnVpbGRlci5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4NUI5MkI5MEVGREU3M0QwMEU2MTIzQyAvKiBGb3JtRGF0
YUJ1aWxkZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRm9ybURhdGFCdWls
ZGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTA4NjFBMTlCMTM2MkFBQ0EwMDJF
NDIzNSAvKiBUZXh0UnVuRmFjdG9yeS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBUZXh0UnVuRmFjdG9yeS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CTA4NjFBMTlDMTM2MkFBQ0EwMDJFNDIzNSAvKiBUZXh0UnVuRmFjdG9yeS5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBUZXh0UnVuRmFjdG9yeS5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkwODY0MUQ0NTEyMTQyRjdEMDA4REU5RjYgLyogUmVuZGVySW1hZ2VSZXNv
dXJjZVN0eWxlSW1hZ2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
UmVuZGVySW1hZ2VSZXNvdXJjZVN0eWxlSW1hZ2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQkwODY0MUQ0NjEyMTQyRjdEMDA4REU5RjYgLyogUmVuZGVySW1hZ2VSZXNvdXJjZVN0
eWxlSW1hZ2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVySW1hZ2VS
ZXNvdXJjZVN0eWxlSW1hZ2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDg2QkJE
MEUxMzYwMzlDMjAwOEIxNUQ4IC8qIEdseXBoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IEdseXBoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xOTA3Myw2ICsx
OTA3Nyw4IEBACiAJCQkJQTdGMzM4QTExMUMwRUZDQTAwQTMyMEE3IC8qIFNoYWRvd0VsZW1lbnQu
Y3BwICovLAogCQkJCUE3RjMzOEEyMTFDMEVGQ0EwMEEzMjBBNyAvKiBTaGFkb3dFbGVtZW50Lmgg
Ki8sCiAJCQkJQThDRkYwNEMwQTE1NEYwOTAwMEE0MjM0IC8qIFRhYmxlTGF5b3V0LmggKi8sCisJ
CQkJMDg2MUExOUIxMzYyQUFDQTAwMkU0MjM1IC8qIFRleHRSdW5GYWN0b3J5LmNwcCAqLywKKwkJ
CQkwODYxQTE5QzEzNjJBQUNBMDAyRTQyMzUgLyogVGV4dFJ1bkZhY3RvcnkuaCAqLywKIAkJCQkz
N0ZDOTZEQTExMDRFRDcxMDAzRTFGQUQgLyogVHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94Lmgg
Ki8sCiAJCQkJMEY1MDBBQjAwRjU0REIzMTAwRUVGOTI4IC8qIFRyYW5zZm9ybVN0YXRlLmNwcCAq
LywKIAkJCQkwRjUwMEFBRTBGNTREQjFCMDBFRUY5MjggLyogVHJhbnNmb3JtU3RhdGUuaCAqLywK
QEAgLTIyNTQ3LDYgKzIyNTUzLDcgQEAKIAkJCQk5MzBGQzY4QTEwNzJCOTI4MDA0NTI5M0UgLyog
VGV4dFJlbmRlcmluZ01vZGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OEY2MDgyNDVFNTkw
MDFFOUFCQyAvKiBUZXh0UmVzb3VyY2VEZWNvZGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQlBODI0
QjQ2NTBFMkVGMkVBMDA4MUE3QjcgLyogVGV4dFJ1bi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDg2
MUExOUUxMzYyQUFDQTAwMkU0MjM1IC8qIFRleHRSdW5GYWN0b3J5LmggaW4gSGVhZGVycyAqLywK
IAkJCQlCMkMzREE0QjBEMDA2QzFEMDBFRjZGMjYgLyogVGV4dFN0cmVhbS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJNDk4NzcwRjExMjQyQzUzNTAwMjIyNkJBIC8qIFRleHR1cmUuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTk3QkM4NEE1MTIzNzBEQzgwMDBDNjE2MSAvKiBUZXh0Vmlld1NvdXJjZVBhcnNl
ci5oIGluIEhlYWRlcnMgKi8sCkBAIC0yNTI0NSw2ICsyNTI1Miw3IEBACiAJCQkJRjU1QjNERDkx
MjUxRjEyRDAwM0VGMjY5IC8qIFRleHRJbnB1dFR5cGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
OTMzMDlFMUIwOTlFNjQ5MjAwNTZFNTgxIC8qIFRleHRJdGVyYXRvci5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQk5M0YxOUE5RDA4MjQ1RTU5MDAxRTlBQkMgLyogVGV4dFJlc291cmNlRGVjb2Rlci5j
cHAgaW4gU291cmNlcyAqLywKKwkJCQkwODYxQTE5RDEzNjJBQUNBMDAyRTQyMzUgLyogVGV4dFJ1
bkZhY3RvcnkuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQjJDM0RBNEEwRDAwNkMxRDAwRUY2RjI2
IC8qIFRleHRTdHJlYW0uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNDk4NzcwRjAxMjQyQzUzNTAw
MjIyNkJBIC8qIFRleHR1cmUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTdCQzg0QTQxMjM3MERD
ODAwMEM2MTYxIC8qIFRleHRWaWV3U291cmNlUGFyc2VyLmNwcCBpbiBTb3VyY2VzICovLApJbmRl
eDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCShyZXZpc2lvbiA4NTgz
NSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5j
bHVkZSAiUGFpbnRJbmZvLmgiCiAjaW5jbHVkZSAiUm9vdElubGluZUJveC5oIgotI2luY2x1ZGUg
IlRleHRSdW4uaCIKKyNpbmNsdWRlICJUZXh0UnVuRmFjdG9yeS5oIgogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKQEAgLTUyLDkgKzUyLDggQEAgdm9pZCBFbGxpcHNpc0JveDo6cGFpbnQoUGFpbnRJ
bmZvJiBwYWludAogICAgICAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKGZvcmVncm91bmQs
IHN0eWxlLT5jb2xvclNwYWNlKCkpOwogICAgIH0KIAotICAgIGNvbnN0IFN0cmluZyYgc3RyID0g
bV9zdHI7Ci0gICAgLy8gRklYTUU6IFdoeSBpcyB0aGlzIGFsd2FzeSBMVFI/Ci0gICAgY29udGV4
dC0+ZHJhd1RleHQoc3R5bGUtPmZvbnQoKSwgVGV4dFJ1bihzdHIuY2hhcmFjdGVycygpLCBzdHIu
bGVuZ3RoKCksIGZhbHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uLCBM
VFIsIHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSksIEludFBvaW50KG1feCArIHR4LCBtX3kgKyB0
eSArIHN0eWxlLT5mb250TWV0cmljcygpLmFzY2VudCgpKSk7CisgICAgLy8gRklYTUU6IFdoeSBp
cyB0aGlzIGFsd2F5cyBMVFI/CisgICAgY29udGV4dC0+ZHJhd1RleHQoc3R5bGUtPmZvbnQoKSwg
Y3JlYXRlVGV4dFJ1bkFsbG93aW5nVHJhaWxpbmdFeHBhbnNpb24obV9zdHIsIHN0eWxlKSwgSW50
UG9pbnQobV94ICsgdHgsIG1feSArIHR5ICsgc3R5bGUtPmZvbnRNZXRyaWNzKCkuYXNjZW50KCkp
KTsKIAogICAgIC8vIFJlc3RvcmUgdGhlIHJlZ3VsYXIgZmlsbCBjb2xvci4KICAgICBpZiAodGV4
dENvbG9yICE9IGNvbnRleHQtPmZpbGxDb2xvcigpKQpAQCAtNzYsOCArNzUsNyBAQCBJbnRSZWN0
IEVsbGlwc2lzQm94OjpzZWxlY3Rpb25SZWN0KGludCB0CiAgICAgUmVuZGVyU3R5bGUqIHN0eWxl
ID0gbV9yZW5kZXJlci0+c3R5bGUobV9maXJzdExpbmUpOwogICAgIGNvbnN0IEZvbnQmIGYgPSBz
dHlsZS0+Zm9udCgpOwogICAgIC8vIEZJWE1FOiBXaHkgaXMgdGhpcyBhbHdheXMgTFRSPwotICAg
IHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KGYuc2VsZWN0aW9uUmVjdEZvclRleHQoVGV4dFJ1biht
X3N0ci5jaGFyYWN0ZXJzKCksIG1fc3RyLmxlbmd0aCgpLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6
QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgTFRSLCBzdHlsZS0+dmlzdWFsbHlPcmRlcmVkKCkpLAot
ICAgICAgICAgICAgSW50UG9pbnQobV94ICsgdHgsIG1feSArIHR5ICsgcm9vdCgpLT5zZWxlY3Rp
b25Ub3AoKSksIHJvb3QoKS0+c2VsZWN0aW9uSGVpZ2h0KCkpKTsKKyAgICByZXR1cm4gZW5jbG9z
aW5nSW50UmVjdChmLnNlbGVjdGlvblJlY3RGb3JUZXh0KGNyZWF0ZVRleHRSdW5BbGxvd2luZ1Ry
YWlsaW5nRXhwYW5zaW9uKG1fc3RyLCBzdHlsZSksIEludFBvaW50KG1feCArIHR4LCBtX3kgKyB0
eSArIHJvb3QoKS0+c2VsZWN0aW9uVG9wKCkpLCByb290KCktPnNlbGVjdGlvbkhlaWdodCgpKSk7
CiB9CiAKIHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgaW50IHR4LCBpbnQgdHksIFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgRm9udCYg
Zm9udCkKQEAgLTk3LDggKzk1LDcgQEAgdm9pZCBFbGxpcHNpc0JveDo6cGFpbnRTZWxlY3Rpb24o
R3JhcGhpYwogICAgIGludCBoID0gcm9vdCgpLT5zZWxlY3Rpb25IZWlnaHQoKTsKICAgICBjb250
ZXh0LT5jbGlwKEludFJlY3QobV94ICsgdHgsIHkgKyB0eSwgbV9sb2dpY2FsV2lkdGgsIGgpKTsK
ICAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgYWx3YXlzIExUUj8KLSAgICBjb250ZXh0LT5kcmF3
SGlnaGxpZ2h0Rm9yVGV4dChmb250LCBUZXh0UnVuKG1fc3RyLmNoYXJhY3RlcnMoKSwgbV9zdHIu
bGVuZ3RoKCksIGZhbHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uLCBM
VFIsIHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSksCi0gICAgICAgIEludFBvaW50KG1feCArIHR4
LCBtX3kgKyB0eSArIHkpLCBoLCBjLCBzdHlsZS0+Y29sb3JTcGFjZSgpKTsKKyAgICBjb250ZXh0
LT5kcmF3SGlnaGxpZ2h0Rm9yVGV4dChmb250LCBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGlu
Z0V4cGFuc2lvbihtX3N0ciwgc3R5bGUpLCBJbnRQb2ludChtX3ggKyB0eCwgbV95ICsgdHkgKyB5
KSwgaCwgYywgc3R5bGUtPmNvbG9yU3BhY2UoKSk7CiB9CiAKIGJvb2wgRWxsaXBzaXNCb3g6Om5v
ZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiBy
ZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIGludCBsaW5lVG9wLCBpbnQgbGlu
ZUJvdHRvbSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3guaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmgJKHJldmlzaW9u
IDg1ODM1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zMTgsNiArMzE4LDcgQEAgcHVibGljOgogICAgIHZvaWQgZmxpcEZvcldyaXRp
bmdNb2RlKEludFJlY3QmKTsKICAgICBJbnRQb2ludCBmbGlwRm9yV3JpdGluZ01vZGUoY29uc3Qg
SW50UG9pbnQmKTsKIAorICAgIGJvb2wgZGlyT3ZlcnJpZGUoKSBjb25zdCB7IHJldHVybiBtX2Rp
ck92ZXJyaWRlOyB9CiAgICAgYm9vbCBrbm93blRvSGF2ZU5vT3ZlcmZsb3coKSBjb25zdCB7IHJl
dHVybiBtX2tub3duVG9IYXZlTm9PdmVyZmxvdzsgfQogICAgIHZvaWQgY2xlYXJLbm93blRvSGF2
ZU5vT3ZlcmZsb3coKTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRl
eHRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVU
ZXh0Qm94LmNwcAkocmV2aXNpb24gODU4MzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
SW5saW5lVGV4dEJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNs
dWRlICJSZW5kZXJSdWJ5VGV4dC5oIgogI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCiAjaW5jbHVk
ZSAiVGV4dC5oIgorI2luY2x1ZGUgIlRleHRSdW5GYWN0b3J5LmgiCiAjaW5jbHVkZSAiYnJlYWtf
bGluZXMuaCIKICNpbmNsdWRlIDx3dGYvQWx3YXlzSW5saW5lLmg+CiAKQEAgLTE1OSwxOCArMTYw
LDYgQEAgUmVuZGVyT2JqZWN0OjpTZWxlY3Rpb25TdGF0ZSBJbmxpbmVUZXh0QgogICAgIHJldHVy
biBzdGF0ZTsKIH0KIAotdHlwZWRlZiBWZWN0b3I8VUNoYXIsIDI1Nj4gQnVmZmVyRm9yQXBwZW5k
aW5nSHlwaGVuOwotCi1zdGF0aWMgdm9pZCBhZGp1c3RDaGFyYWN0ZXJzQW5kTGVuZ3RoRm9ySHlw
aGVuKEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiYgY2hhcmFjdGVyc1dpdGhIeXBoZW4sIFJlbmRl
clN0eWxlKiBzdHlsZSwgY29uc3QgVUNoYXIqJiBjaGFyYWN0ZXJzLCBpbnQmIGxlbmd0aCkKLXsK
LSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGh5cGhlblN0cmluZyA9IHN0eWxlLT5oeXBoZW5TdHJp
bmcoKTsKLSAgICBjaGFyYWN0ZXJzV2l0aEh5cGhlbi5yZXNlcnZlQ2FwYWNpdHkobGVuZ3RoICsg
aHlwaGVuU3RyaW5nLmxlbmd0aCgpKTsKLSAgICBjaGFyYWN0ZXJzV2l0aEh5cGhlbi5hcHBlbmQo
Y2hhcmFjdGVycywgbGVuZ3RoKTsKLSAgICBjaGFyYWN0ZXJzV2l0aEh5cGhlbi5hcHBlbmQoaHlw
aGVuU3RyaW5nLmNoYXJhY3RlcnMoKSwgaHlwaGVuU3RyaW5nLmxlbmd0aCgpKTsKLSAgICBjaGFy
YWN0ZXJzID0gY2hhcmFjdGVyc1dpdGhIeXBoZW4uZGF0YSgpOwotICAgIGxlbmd0aCArPSBoeXBo
ZW5TdHJpbmcubGVuZ3RoKCk7Ci19Ci0KIEludFJlY3QgSW5saW5lVGV4dEJveDo6c2VsZWN0aW9u
UmVjdChpbnQgdHgsIGludCB0eSwgaW50IHN0YXJ0UG9zLCBpbnQgZW5kUG9zKQogewogICAgIGlu
dCBzUG9zID0gbWF4KHN0YXJ0UG9zIC0gbV9zdGFydCwgMCk7CkBAIC0xODUsMTYgKzE3NCwxMyBA
QCBJbnRSZWN0IElubGluZVRleHRCb3g6OnNlbGVjdGlvblJlY3QoaW50CiAgICAgUmVuZGVyU3R5
bGUqIHN0eWxlVG9Vc2UgPSB0ZXh0T2JqLT5zdHlsZShtX2ZpcnN0TGluZSk7CiAgICAgY29uc3Qg
Rm9udCYgZiA9IHN0eWxlVG9Vc2UtPmZvbnQoKTsKIAotICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0
ZXJzID0gdGV4dE9iai0+dGV4dCgpLT5jaGFyYWN0ZXJzKCkgKyBtX3N0YXJ0OwotICAgIGludCBs
ZW4gPSBtX2xlbjsKICAgICBCdWZmZXJGb3JBcHBlbmRpbmdIeXBoZW4gY2hhcmFjdGVyc1dpdGhI
eXBoZW47Ci0gICAgaWYgKGVQb3MgPT0gbGVuICYmIGhhc0h5cGhlbigpKSB7Ci0gICAgICAgIGFk
anVzdENoYXJhY3RlcnNBbmRMZW5ndGhGb3JIeXBoZW4oY2hhcmFjdGVyc1dpdGhIeXBoZW4sIHN0
eWxlVG9Vc2UsIGNoYXJhY3RlcnMsIGxlbik7Ci0gICAgICAgIGVQb3MgPSBsZW47Ci0gICAgfQor
ICAgIGJvb2wgcmVzcGVjdEh5cGhlbiA9IGVQb3MgPT0gbV9sZW4gJiYgaGFzSHlwaGVuKCk7Cisg
ICAgVGV4dFJ1biB0ZXh0UnVuID0gY3JlYXRlVGV4dFJ1bkZvcklubGluZVRleHRCb3godGhpcywg
c3R5bGVUb1VzZSwgcmVzcGVjdEh5cGhlbiA/ICZjaGFyYWN0ZXJzV2l0aEh5cGhlbiA6IDApOwor
ICAgIGlmIChyZXNwZWN0SHlwaGVuKQorICAgICAgICBlbmRQb3MgPSB0ZXh0UnVuLmxlbmd0aCgp
OwogCi0gICAgSW50UmVjdCByID0gZW5jbG9zaW5nSW50UmVjdChmLnNlbGVjdGlvblJlY3RGb3JU
ZXh0KFRleHRSdW4oY2hhcmFjdGVycywgbGVuLCB0ZXh0T2JqLT5hbGxvd1RhYnMoKSwgdGV4dFBv
cygpLCBtX2V4cGFuc2lvbiwgZXhwYW5zaW9uQmVoYXZpb3IoKSwgZGlyZWN0aW9uKCksIG1fZGly
T3ZlcnJpZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBGbG9hdFBvaW50KGxvZ2ljYWxMZWZ0KCksIHNlbFRvcCksIHNlbEhlaWdodCwg
c1BvcywgZVBvcykpOworICAgIEludFJlY3QgciA9IGVuY2xvc2luZ0ludFJlY3QoZi5zZWxlY3Rp
b25SZWN0Rm9yVGV4dCh0ZXh0UnVuLCBGbG9hdFBvaW50KGxvZ2ljYWxMZWZ0KCksIHNlbFRvcCks
IHNlbEhlaWdodCwgc1BvcywgZVBvcykpOwogCiAgICAgaW50IGxvZ2ljYWxXaWR0aCA9IHIud2lk
dGgoKTsKICAgICBpZiAoci54KCkgPiBsb2dpY2FsUmlnaHQoKSkKQEAgLTY0NywxMCArNjMzLDkg
QEAgdm9pZCBJbmxpbmVUZXh0Qm94OjpwYWludChQYWludEluZm8mIHBhaQogICAgICAgICBjb21i
aW5lZFRleHQtPmNoYXJhY3RlcnNUb1JlbmRlcihtX3N0YXJ0LCBjaGFyYWN0ZXJzLCBsZW5ndGgp
OwogCiAgICAgQnVmZmVyRm9yQXBwZW5kaW5nSHlwaGVuIGNoYXJhY3RlcnNXaXRoSHlwaGVuOwor
ICAgIFRleHRSdW4gdGV4dFJ1biA9IGNyZWF0ZVRleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KHRoaXMs
IHN0eWxlVG9Vc2UsIGNoYXJhY3RlcnMsIGxlbmd0aCwgaGFzSHlwaGVuKCkgPyAmY2hhcmFjdGVy
c1dpdGhIeXBoZW4gOiAwKTsKICAgICBpZiAoaGFzSHlwaGVuKCkpCi0gICAgICAgIGFkanVzdENo
YXJhY3RlcnNBbmRMZW5ndGhGb3JIeXBoZW4oY2hhcmFjdGVyc1dpdGhIeXBoZW4sIHN0eWxlVG9V
c2UsIGNoYXJhY3RlcnMsIGxlbmd0aCk7Ci0KLSAgICBUZXh0UnVuIHRleHRSdW4oY2hhcmFjdGVy
cywgbGVuZ3RoLCB0ZXh0UmVuZGVyZXIoKS0+YWxsb3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBh
bnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCksIGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8
IHN0eWxlVG9Vc2UtPnZpc3VhbGx5T3JkZXJlZCgpKTsKKyAgICAgICAgbGVuZ3RoID0gdGV4dFJ1
bi5sZW5ndGgoKTsKIAogICAgIGludCBzUG9zID0gMDsKICAgICBpbnQgZVBvcyA9IDA7CkBAIC04
MTIsMTAgKzc5NywxMCBAQCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBo
CiAgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMgPSB0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpLT5j
aGFyYWN0ZXJzKCkgKyBtX3N0YXJ0OwogCiAgICAgQnVmZmVyRm9yQXBwZW5kaW5nSHlwaGVuIGNo
YXJhY3RlcnNXaXRoSHlwaGVuOwotICAgIGlmIChlUG9zID09IGxlbmd0aCAmJiBoYXNIeXBoZW4o
KSkgewotICAgICAgICBhZGp1c3RDaGFyYWN0ZXJzQW5kTGVuZ3RoRm9ySHlwaGVuKGNoYXJhY3Rl
cnNXaXRoSHlwaGVuLCBzdHlsZSwgY2hhcmFjdGVycywgbGVuZ3RoKTsKLSAgICAgICAgZVBvcyA9
IGxlbmd0aDsKLSAgICB9CisgICAgYm9vbCByZXNwZWN0SHlwaGVuID0gZVBvcyA9PSBsZW5ndGgg
JiYgaGFzSHlwaGVuKCk7CisgICAgVGV4dFJ1biB0ZXh0UnVuID0gY3JlYXRlVGV4dFJ1bkZvcklu
bGluZVRleHRCb3godGhpcywgc3R5bGUsIGNoYXJhY3RlcnMsIGxlbmd0aCwgcmVzcGVjdEh5cGhl
biA/ICZjaGFyYWN0ZXJzV2l0aEh5cGhlbiA6IDApOworICAgIGlmIChyZXNwZWN0SHlwaGVuKQor
ICAgICAgICBlUG9zID0gdGV4dFJ1bi5sZW5ndGgoKTsKIAogICAgIGludCBkZWx0YVkgPSByZW5k
ZXJlcigpLT5zdHlsZSgpLT5pc0ZsaXBwZWRMaW5lc1dyaXRpbmdNb2RlKCkgPyBzZWxlY3Rpb25C
b3R0b20oKSAtIGxvZ2ljYWxCb3R0b20oKSA6IGxvZ2ljYWxUb3AoKSAtIHNlbGVjdGlvblRvcCgp
OwogICAgIGludCBzZWxIZWlnaHQgPSBzZWxlY3Rpb25IZWlnaHQoKTsKQEAgLTgyNyw5ICs4MTIs
NyBAQCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBoCiAgICAgY2xpcFJl
Y3Quc2V0V2lkdGgobWF4WCAtIGNsaXBSZWN0LngoKSk7CiAgICAgY29udGV4dC0+Y2xpcChjbGlw
UmVjdCk7CiAKLSAgICBjb250ZXh0LT5kcmF3SGlnaGxpZ2h0Rm9yVGV4dChmb250LCBUZXh0UnVu
KGNoYXJhY3RlcnMsIGxlbmd0aCwgdGV4dFJlbmRlcmVyKCktPmFsbG93VGFicygpLCB0ZXh0UG9z
KCksIG1fZXhwYW5zaW9uLCBleHBhbnNpb25CZWhhdmlvcigpLCAKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkaXJlY3Rpb24oKSwgbV9kaXJPdmVycmlkZSB8fCBzdHlsZS0+dmlz
dWFsbHlPcmRlcmVkKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2Fs
T3JpZ2luLCBzZWxIZWlnaHQsIGMsIHN0eWxlLT5jb2xvclNwYWNlKCksIHNQb3MsIGVQb3MpOwor
ICAgIGNvbnRleHQtPmRyYXdIaWdobGlnaHRGb3JUZXh0KGZvbnQsIHRleHRSdW4sIGxvY2FsT3Jp
Z2luLCBzZWxIZWlnaHQsIGMsIHN0eWxlLT5jb2xvclNwYWNlKCksIHNQb3MsIGVQb3MpOwogfQog
CiB2b2lkIElubGluZVRleHRCb3g6OnBhaW50Q29tcG9zaXRpb25CYWNrZ3JvdW5kKEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgRmxvYXRQb2ludCYgYm94T3JpZ2luLCBSZW5kZXJTdHls
ZSogc3R5bGUsIGNvbnN0IEZvbnQmIGZvbnQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcykKQEAg
LTg1MCw5ICs4MzMsNyBAQCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50Q29tcG9zaXRpb25CYWNr
CiAgICAgaW50IGRlbHRhWSA9IHJlbmRlcmVyKCktPnN0eWxlKCktPmlzRmxpcHBlZExpbmVzV3Jp
dGluZ01vZGUoKSA/IHNlbGVjdGlvbkJvdHRvbSgpIC0gbG9naWNhbEJvdHRvbSgpIDogbG9naWNh
bFRvcCgpIC0gc2VsZWN0aW9uVG9wKCk7CiAgICAgaW50IHNlbEhlaWdodCA9IHNlbGVjdGlvbkhl
aWdodCgpOwogICAgIEZsb2F0UG9pbnQgbG9jYWxPcmlnaW4oYm94T3JpZ2luLngoKSwgYm94T3Jp
Z2luLnkoKSAtIGRlbHRhWSk7Ci0gICAgY29udGV4dC0+ZHJhd0hpZ2hsaWdodEZvclRleHQoZm9u
dCwgVGV4dFJ1bih0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpLT5jaGFyYWN0ZXJzKCkgKyBtX3N0YXJ0
LCBtX2xlbiwgdGV4dFJlbmRlcmVyKCktPmFsbG93VGFicygpLCB0ZXh0UG9zKCksIG1fZXhwYW5z
aW9uLCBleHBhbnNpb25CZWhhdmlvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQo
KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxPcmlnaW4sIHNlbEhl
aWdodCwgYywgc3R5bGUtPmNvbG9yU3BhY2UoKSwgc1BvcywgZVBvcyk7CisgICAgY29udGV4dC0+
ZHJhd0hpZ2hsaWdodEZvclRleHQoZm9udCwgY3JlYXRlVGV4dFJ1bkZvcklubGluZVRleHRCb3go
dGhpcywgc3R5bGUpLCBsb2NhbE9yaWdpbiwgc2VsSGVpZ2h0LCBjLCBzdHlsZS0+Y29sb3JTcGFj
ZSgpLCBzUG9zLCBlUG9zKTsKIH0KIAogI2lmIFBMQVRGT1JNKE1BQykKQEAgLTEwMTAsOCArOTkx
LDggQEAgdm9pZCBJbmxpbmVUZXh0Qm94OjpwYWludFNwZWxsaW5nT3JHcmFtbQogICAgICAgICBp
bnQgZGVsdGFZID0gcmVuZGVyZXIoKS0+c3R5bGUoKS0+aXNGbGlwcGVkTGluZXNXcml0aW5nTW9k
ZSgpID8gc2VsZWN0aW9uQm90dG9tKCkgLSBsb2dpY2FsQm90dG9tKCkgOiBsb2dpY2FsVG9wKCkg
LSBzZWxlY3Rpb25Ub3AoKTsKICAgICAgICAgaW50IHNlbEhlaWdodCA9IHNlbGVjdGlvbkhlaWdo
dCgpOwogICAgICAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoYm94T3JpZ2luLngoKSwgYm94T3Jp
Z2luLnkoKSAtIGRlbHRhWSk7Ci0gICAgICAgIFRleHRSdW4gcnVuKHRleHRSZW5kZXJlcigpLT50
ZXh0KCktPmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLCB0ZXh0UmVuZGVyZXIoKS0+YWxs
b3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCksIGRp
cmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSk7Ci0g
ICAgICAgIAorICAgICAgICBUZXh0UnVuIHJ1biA9IGNyZWF0ZVRleHRSdW5Gb3JJbmxpbmVUZXh0
Qm94KHRoaXMsIHN0eWxlKTsKKwogICAgICAgICAvLyBGSVhNRTogQ29udmVydCB0aGUgZG9jdW1l
bnQgbWFya2VycyB0byBmbG9hdCByZWN0cy4KICAgICAgICAgSW50UmVjdCBtYXJrZXJSZWN0ID0g
ZW5jbG9zaW5nSW50UmVjdChmb250LnNlbGVjdGlvblJlY3RGb3JUZXh0KHJ1biwgc3RhcnRQb2lu
dCwgc2VsSGVpZ2h0LCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpOwogICAgICAgICBzdGFy
dCA9IG1hcmtlclJlY3QueCgpIC0gc3RhcnRQb2ludC54KCk7CkBAIC0xMDU1LDggKzEwMzYsOCBA
QCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50VGV4dE1hdGNoTWFya2VyCiAKICAgICBpbnQgc1Bv
cyA9IG1heChtYXJrZXIuc3RhcnRPZmZzZXQgLSBtX3N0YXJ0LCAodW5zaWduZWQpMCk7CiAgICAg
aW50IGVQb3MgPSBtaW4obWFya2VyLmVuZE9mZnNldCAtIG1fc3RhcnQsICh1bnNpZ25lZCltX2xl
bik7ICAgIAotICAgIFRleHRSdW4gcnVuKHRleHRSZW5kZXJlcigpLT50ZXh0KCktPmNoYXJhY3Rl
cnMoKSArIG1fc3RhcnQsIG1fbGVuLCB0ZXh0UmVuZGVyZXIoKS0+YWxsb3dUYWJzKCksIHRleHRQ
b3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCksIGRpcmVjdGlvbigpLCBtX2Rp
ck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSk7Ci0gICAgCisgICAgVGV4dFJ1
biBydW4gPSBjcmVhdGVUZXh0UnVuRm9ySW5saW5lVGV4dEJveCh0aGlzLCBzdHlsZSk7CisKICAg
ICAvLyBBbHdheXMgY29tcHV0ZSBhbmQgc3RvcmUgdGhlIHJlY3QgYXNzb2NpYXRlZCB3aXRoIHRo
aXMgbWFya2VyLiBUaGUgY29tcHV0ZWQgcmVjdCBpcyBpbiBhYnNvbHV0ZSBjb29yZGluYXRlcy4K
ICAgICBJbnRSZWN0IG1hcmtlclJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGZvbnQuc2VsZWN0aW9u
UmVjdEZvclRleHQocnVuLCBJbnRQb2ludChtX3gsIHNlbGVjdGlvblRvcCgpKSwgc2VsSGVpZ2h0
LCBzUG9zLCBlUG9zKSk7CiAgICAgbWFya2VyUmVjdCA9IHJlbmRlcmVyKCktPmxvY2FsVG9BYnNv
bHV0ZVF1YWQoRmxvYXRSZWN0KG1hcmtlclJlY3QpKS5lbmNsb3NpbmdCb3VuZGluZ0JveCgpOwpA
QCAtMTA4Miw3ICsxMDYzLDcgQEAgdm9pZCBJbmxpbmVUZXh0Qm94Ojpjb21wdXRlUmVjdEZvclJl
cGxhYwogICAgIAogICAgIGludCBzUG9zID0gbWF4KG1hcmtlci5zdGFydE9mZnNldCAtIG1fc3Rh
cnQsICh1bnNpZ25lZCkwKTsKICAgICBpbnQgZVBvcyA9IG1pbihtYXJrZXIuZW5kT2Zmc2V0IC0g
bV9zdGFydCwgKHVuc2lnbmVkKW1fbGVuKTsgICAgCi0gICAgVGV4dFJ1biBydW4odGV4dFJlbmRl
cmVyKCktPnRleHQoKS0+Y2hhcmFjdGVycygpICsgbV9zdGFydCwgbV9sZW4sIHRleHRSZW5kZXJl
cigpLT5hbGxvd1RhYnMoKSwgdGV4dFBvcygpLCBtX2V4cGFuc2lvbiwgZXhwYW5zaW9uQmVoYXZp
b3IoKSwgZGlyZWN0aW9uKCksIG1fZGlyT3ZlcnJpZGUgfHwgc3R5bGUtPnZpc3VhbGx5T3JkZXJl
ZCgpKTsKKyAgICBUZXh0UnVuIHJ1biA9IGNyZWF0ZVRleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KHRo
aXMsIHN0eWxlKTsKICAgICBJbnRQb2ludCBzdGFydFBvaW50ID0gSW50UG9pbnQobV94LCB5KTsK
ICAgICAKICAgICAvLyBDb21wdXRlIGFuZCBzdG9yZSB0aGUgcmVjdCBhc3NvY2lhdGVkIHdpdGgg
dGhpcyBtYXJrZXIuCkBAIC0xMjQyLDkgKzEyMjMsNyBAQCBpbnQgSW5saW5lVGV4dEJveDo6b2Zm
c2V0Rm9yUG9zaXRpb24oZmxvCiAgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVyVGV4dChy
ZW5kZXJlcigpKTsKICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0LT5zdHlsZShtX2ZpcnN0
TGluZSk7CiAgICAgY29uc3QgRm9udCogZiA9ICZzdHlsZS0+Zm9udCgpOwotICAgIGludCBvZmZz
ZXQgPSBmLT5vZmZzZXRGb3JQb3NpdGlvbihUZXh0UnVuKHRleHRSZW5kZXJlcigpLT50ZXh0KCkt
PmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLAotICAgICAgICB0ZXh0UmVuZGVyZXIoKS0+
YWxsb3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCks
IGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSks
Ci0gICAgICAgIGxpbmVPZmZzZXQgLSBsb2dpY2FsTGVmdCgpLCBpbmNsdWRlUGFydGlhbEdseXBo
cyk7CisgICAgaW50IG9mZnNldCA9IGYtPm9mZnNldEZvclBvc2l0aW9uKGNyZWF0ZVRleHRSdW5G
b3JJbmxpbmVUZXh0Qm94KHRoaXMsIHN0eWxlKSwgbGluZU9mZnNldCAtIGxvZ2ljYWxMZWZ0KCks
IGluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsKICAgICBpZiAoYmxvY2tJc0luT3Bwb3NpdGVEaXJlY3Rp
b24gJiYgKCFvZmZzZXQgfHwgb2Zmc2V0ID09IG1fbGVuKSkKICAgICAgICAgcmV0dXJuICFvZmZz
ZXQgPyBtX2xlbiA6IDA7CiAgICAgcmV0dXJuIG9mZnNldDsKQEAgLTEyNTksMTIgKzEyMzgsMTIg
QEAgZmxvYXQgSW5saW5lVGV4dEJveDo6cG9zaXRpb25Gb3JPZmZzZXQoaQogICAgICAgICByZXR1
cm4gbG9naWNhbExlZnQoKTsKIAogICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQo
cmVuZGVyZXIoKSk7Ci0gICAgY29uc3QgRm9udCYgZiA9IHRleHQtPnN0eWxlKG1fZmlyc3RMaW5l
KS0+Zm9udCgpOworICAgIFJlbmRlclN0eWxlKiBzdHlsZVRvVXNlID0gdGV4dC0+c3R5bGUobV9m
aXJzdExpbmUpOworICAgIGNvbnN0IEZvbnQmIGYgPSBzdHlsZVRvVXNlLT5mb250KCk7CiAgICAg
aW50IGZyb20gPSAhaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gb2Zmc2V0IC0gbV9zdGFydCA6
IDA7CiAgICAgaW50IHRvID0gIWlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG1fbGVuIDogb2Zm
c2V0IC0gbV9zdGFydDsKICAgICAvLyBGSVhNRTogRG8gd2UgbmVlZCB0byBhZGQgcmlnaHRCZWFy
aW5nIGhlcmU/Ci0gICAgcmV0dXJuIGYuc2VsZWN0aW9uUmVjdEZvclRleHQoVGV4dFJ1bih0ZXh0
LT50ZXh0KCktPmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLCB0ZXh0UmVuZGVyZXIoKS0+
YWxsb3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCks
IGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBJbnRQb2ludChsb2dpY2FsTGVmdCgpLCAwKSwgMCwgZnJvbSwgdG8pLm1heFgoKTsK
KyAgICByZXR1cm4gZi5zZWxlY3Rpb25SZWN0Rm9yVGV4dChjcmVhdGVUZXh0UnVuRm9ySW5saW5l
VGV4dEJveCh0aGlzLCBzdHlsZVRvVXNlKSwgSW50UG9pbnQobG9naWNhbExlZnQoKSwgMCksIDAs
IGZyb20sIHRvKS5tYXhYKCk7CiB9CiAKIGJvb2wgSW5saW5lVGV4dEJveDo6Y29udGFpbnNDYXJl
dE9mZnNldChpbnQgb2Zmc2V0KSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L0lubGluZVRleHRCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
SW5saW5lVGV4dEJveC5oCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9JbmxpbmVUZXh0Qm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTEzOSw4ICsxMzksNiBAQCBw
dWJsaWM6CiBwcml2YXRlOgogICAgIHZpcnR1YWwgdW5zaWduZWQgY2FyZXRNYXhSZW5kZXJlZE9m
ZnNldCgpIGNvbnN0OwogCi0gICAgZmxvYXQgdGV4dFBvcygpIGNvbnN0OyAvLyByZXR1cm5zIHRo
ZSB4IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBsZWZ0IHN0YXJ0IG9mIHRoZSB0ZXh0IGxpbmUu
Ci0KIHB1YmxpYzoKICAgICB2aXJ0dWFsIGludCBvZmZzZXRGb3JQb3NpdGlvbihmbG9hdCB4LCBi
b29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzID0gdHJ1ZSkgY29uc3Q7CiAgICAgdmlydHVhbCBmbG9h
dCBwb3NpdGlvbkZvck9mZnNldChpbnQgb2Zmc2V0KSBjb25zdDsKQEAgLTE1MCw2ICsxNDgsMTMg
QEAgcHVibGljOgogICAgIC8vIE5lZWRzIHRvIGJlIHB1YmxpYywgc28gdGhlIHN0YXRpYyBwYWlu
dFRleHRXaXRoU2hhZG93cygpIGZ1bmN0aW9uIGNhbiB1c2UgaXQuCiAgICAgc3RhdGljIEZsb2F0
U2l6ZSBhcHBseVNoYWRvd1RvR3JhcGhpY3NDb250ZXh0KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0
IFNoYWRvd0RhdGEqLCBjb25zdCBGbG9hdFJlY3QmIHRleHRSZWN0LCBib29sIHN0cm9rZWQsIGJv
b2wgb3BhcXVlLCBib29sIGhvcml6b250YWwpOwogCisgICAgdmlydHVhbCBmbG9hdCB0ZXh0UG9z
KCkgY29uc3Q7IC8vIHJldHVybnMgdGhlIHggcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGxlZnQg
c3RhcnQgb2YgdGhlIHRleHQgbGluZS4KKyAgICBUZXh0UnVuOjpFeHBhbnNpb25CZWhhdmlvciBl
eHBhbnNpb25CZWhhdmlvcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKGNhbkhhdmVM
ZWFkaW5nRXhwYW5zaW9uKCkgPyBUZXh0UnVuOjpBbGxvd0xlYWRpbmdFeHBhbnNpb24gOiBUZXh0
UnVuOjpGb3JiaWRMZWFkaW5nRXhwYW5zaW9uKQorICAgICAgICAgICAgfCAobV9leHBhbnNpb24g
JiYgbmV4dExlYWZDaGlsZCgpID8gVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiA6IFRl
eHRSdW46OkZvcmJpZFRyYWlsaW5nRXhwYW5zaW9uKTsKKyAgICB9CisKIHByaXZhdGU6CiAgICAg
SW5saW5lVGV4dEJveCogbV9wcmV2VGV4dEJveDsgLy8gVGhlIHByZXZpb3VzIGJveCB0aGF0IGFs
c28gdXNlcyBvdXIgUmVuZGVyT2JqZWN0CiAgICAgSW5saW5lVGV4dEJveCogbV9uZXh0VGV4dEJv
eDsgLy8gVGhlIG5leHQgYm94IHRoYXQgYWxzbyB1c2VzIG91ciBSZW5kZXJPYmplY3QKQEAgLTE3
NCwxMiArMTc5LDYgQEAgcHJpdmF0ZToKICAgICB2b2lkIHBhaW50U3BlbGxpbmdPckdyYW1tYXJN
YXJrZXIoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRQb2ludCYgYm94T3JpZ2luLCBjb25z
dCBEb2N1bWVudE1hcmtlciYsIFJlbmRlclN0eWxlKiwgY29uc3QgRm9udCYsIGJvb2wgZ3JhbW1h
cik7CiAgICAgdm9pZCBwYWludFRleHRNYXRjaE1hcmtlcihHcmFwaGljc0NvbnRleHQqLCBjb25z
dCBGbG9hdFBvaW50JiBib3hPcmlnaW4sIGNvbnN0IERvY3VtZW50TWFya2VyJiwgUmVuZGVyU3R5
bGUqLCBjb25zdCBGb250Jik7CiAgICAgdm9pZCBjb21wdXRlUmVjdEZvclJlcGxhY2VtZW50TWFy
a2VyKGNvbnN0IERvY3VtZW50TWFya2VyJiwgUmVuZGVyU3R5bGUqLCBjb25zdCBGb250Jik7Ci0K
LSAgICBUZXh0UnVuOjpFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcigpIGNvbnN0
Ci0gICAgewotICAgICAgICByZXR1cm4gKGNhbkhhdmVMZWFkaW5nRXhwYW5zaW9uKCkgPyBUZXh0
UnVuOjpBbGxvd0xlYWRpbmdFeHBhbnNpb24gOiBUZXh0UnVuOjpGb3JiaWRMZWFkaW5nRXhwYW5z
aW9uKQotICAgICAgICAgICAgfCAobV9leHBhbnNpb24gJiYgbmV4dExlYWZDaGlsZCgpID8gVGV4
dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiA6IFRleHRSdW46OkZvcmJpZFRyYWlsaW5nRXhw
YW5zaW9uKTsKLSAgICB9CiB9OwogCiBpbmxpbmUgUmVuZGVyVGV4dCogSW5saW5lVGV4dEJveDo6
dGV4dFJlbmRlcmVyKCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJFbWJlZGRlZE9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckVtYmVkZGVkT2JqZWN0LmNwcAkocmV2aXNpb24gODU4MzUpCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRW1iZWRkZWRPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xOTcsNyArMTk3LDcgQEAgYm9vbCBSZW5kZXJFbWJlZGRlZE9iamVjdDo6Z2V0UmVwbGFj
ZW1lbgogICAgIGZvbnQgPSBGb250KGZvbnREZXNjcmlwdGlvbiwgMCwgMCk7CiAgICAgZm9udC51
cGRhdGUoMCk7CiAgICAgCi0gICAgcnVuID0gVGV4dFJ1bihtX3JlcGxhY2VtZW50VGV4dC5jaGFy
YWN0ZXJzKCksIG1fcmVwbGFjZW1lbnRUZXh0Lmxlbmd0aCgpKTsKKyAgICBydW4gPSBUZXh0UnVu
KG1fcmVwbGFjZW1lbnRUZXh0KTsKICAgICB0ZXh0V2lkdGggPSBmb250LndpZHRoKHJ1bik7CiAg
ICAgCiAgICAgcmVwbGFjZW1lbnRUZXh0UmVjdC5zZXRTaXplKEZsb2F0U2l6ZSh0ZXh0V2lkdGgg
KyByZXBsYWNlbWVudFRleHRSb3VuZGVkUmVjdExlZnRSaWdodFRleHRNYXJnaW4gKiAyLCByZXBs
YWNlbWVudFRleHRSb3VuZGVkUmVjdEhlaWdodCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckZpbGVVcGxvYWRDb250cm9sLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRmlsZVVwbG9hZENvbnRyb2wuY3BwCShyZXZpc2lvbiA4
NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJGaWxlVXBsb2FkQ29udHJv
bC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJSZW5kZXJU
ZXh0LmgiCiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKICNpbmNsdWRlICJSZW5kZXJWaWV3Lmgi
Ci0jaW5jbHVkZSAiVGV4dFJ1bi5oIgorI2luY2x1ZGUgIlRleHRSdW5GYWN0b3J5LmgiCiAjaW5j
bHVkZSA8bWF0aC5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtMjIxLDEwICsyMjEsOCBA
QCB2b2lkIFJlbmRlckZpbGVVcGxvYWRDb250cm9sOjpwYWludE9iamVjCiAKICAgICBpZiAocGFp
bnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5kKSB7CiAgICAgICAgIGNvbnN0IFN0
cmluZyYgZGlzcGxheWVkRmlsZW5hbWUgPSBmaWxlVGV4dFZhbHVlKCk7Ci0gICAgICAgIHVuc2ln
bmVkIGxlbmd0aCA9IGRpc3BsYXllZEZpbGVuYW1lLmxlbmd0aCgpOwotICAgICAgICBjb25zdCBV
Q2hhciogc3RyaW5nID0gZGlzcGxheWVkRmlsZW5hbWUuY2hhcmFjdGVycygpOwotICAgICAgICBU
ZXh0UnVuIHRleHRSdW4oc3RyaW5nLCBsZW5ndGgsIGZhbHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxv
d1RyYWlsaW5nRXhwYW5zaW9uLCBzdHlsZSgpLT5kaXJlY3Rpb24oKSwgc3R5bGUoKS0+dW5pY29k
ZUJpZGkoKSA9PSBPdmVycmlkZSk7Ci0gICAgICAgIAorICAgICAgICBUZXh0UnVuIHRleHRSdW4g
PSBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGluZ0V4cGFuc2lvbihkaXNwbGF5ZWRGaWxlbmFt
ZSwgc3R5bGUoKSwgUmVzcGVjdERpcmVjdGlvbiB8IFJlc3BlY3REaXJlY3Rpb25PdmVycmlkZSk7
CisKICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXJlIHRoZSBmaWxlbmFtZSBzaG91bGQgYmUgcGxh
Y2VkCiAgICAgICAgIGludCBjb250ZW50TGVmdCA9IHR4ICsgYm9yZGVyTGVmdCgpICsgcGFkZGlu
Z0xlZnQoKTsKICAgICAgICAgaW50IGJ1dHRvbkFuZEljb25XaWR0aCA9IG1fYnV0dG9uLT5yZW5k
ZXJCb3goKS0+d2lkdGgoKSArIGFmdGVyQnV0dG9uU3BhY2luZwpAQCAtMjc2LDcgKzI3NCw3IEBA
IHZvaWQgUmVuZGVyRmlsZVVwbG9hZENvbnRyb2w6OmNvbXB1dGVQcmUKICAgICAgICAgLy8gRmln
dXJlIG91dCBob3cgYmlnIHRoZSBmaWxlbmFtZSBzcGFjZSBuZWVkcyB0byBiZSBmb3IgYSBnaXZl
biBudW1iZXIgb2YgY2hhcmFjdGVycwogICAgICAgICAvLyAodXNpbmcgIjAiIGFzIHRoZSBub21p
bmFsIGNoYXJhY3RlcikuCiAgICAgICAgIGNvbnN0IFVDaGFyIGNoID0gJzAnOwotICAgICAgICBm
bG9hdCBjaGFyV2lkdGggPSBzdHlsZSgpLT5mb250KCkud2lkdGgoVGV4dFJ1bigmY2gsIDEsIGZh
bHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uKSk7CisgICAgICAgIGZs
b2F0IGNoYXJXaWR0aCA9IHN0eWxlKCktPmZvbnQoKS53aWR0aChjcmVhdGVUZXh0UnVuQWxsb3dp
bmdUcmFpbGluZ0V4cGFuc2lvbihTdHJpbmcoJmNoLCAxKSwgc3R5bGUoKSkpOwogICAgICAgICBt
X21heFByZWZlcnJlZExvZ2ljYWxXaWR0aCA9IChpbnQpY2VpbGYoY2hhcldpZHRoICogZGVmYXVs
dFdpZHRoTnVtQ2hhcnMpOwogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckltYWdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVySW1hZ2UuY3BwCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJJbWFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwNCw3ICsxMDQsNyBAQCBi
b29sIFJlbmRlckltYWdlOjpzZXRJbWFnZVNpemVGb3JBbHRUZXh0CiAgICAgLy8gd2UgaGF2ZSBh
biBhbHQgYW5kIHRoZSB1c2VyIG1lYW50IGl0IChpdHMgbm90IGEgdGV4dCB3ZSBpbnZlbnRlZCkK
ICAgICBpZiAoIW1fYWx0VGV4dC5pc0VtcHR5KCkpIHsKICAgICAgICAgY29uc3QgRm9udCYgZm9u
dCA9IHN0eWxlKCktPmZvbnQoKTsKLSAgICAgICAgSW50U2l6ZSB0ZXh0U2l6ZShtaW4oZm9udC53
aWR0aChUZXh0UnVuKG1fYWx0VGV4dC5jaGFyYWN0ZXJzKCksIG1fYWx0VGV4dC5sZW5ndGgoKSkp
LCBtYXhBbHRUZXh0V2lkdGgpLCBtaW4oZm9udC5mb250TWV0cmljcygpLmhlaWdodCgpLCBtYXhB
bHRUZXh0SGVpZ2h0KSk7CisgICAgICAgIEludFNpemUgdGV4dFNpemUobWluKGZvbnQud2lkdGgo
VGV4dFJ1bihtX2FsdFRleHQpKSwgbWF4QWx0VGV4dFdpZHRoKSwgbWluKGZvbnQuZm9udE1ldHJp
Y3MoKS5oZWlnaHQoKSwgbWF4QWx0VGV4dEhlaWdodCkpOwogICAgICAgICBpbWFnZVNpemUgPSBp
bWFnZVNpemUuZXhwYW5kZWRUbyh0ZXh0U2l6ZSk7CiAgICAgfQogCkBAIC0yODYsNyArMjg2LDcg
QEAgdm9pZCBSZW5kZXJJbWFnZTo6cGFpbnRSZXBsYWNlZChQYWludEluZgogCiAgICAgICAgICAg
ICAgICAgLy8gT25seSBkcmF3IHRoZSBhbHQgdGV4dCBpZiBpdCdsbCBmaXQgd2l0aGluIHRoZSBj
b250ZW50IGJveCwKICAgICAgICAgICAgICAgICAvLyBhbmQgb25seSBpZiBpdCBmaXRzIGFib3Zl
IHRoZSBlcnJvciBpbWFnZS4KLSAgICAgICAgICAgICAgICBUZXh0UnVuIHRleHRSdW4odGV4dC5j
aGFyYWN0ZXJzKCksIHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIFRleHRSdW4gdGV4
dFJ1bih0ZXh0KTsKICAgICAgICAgICAgICAgICBpbnQgdGV4dFdpZHRoID0gZm9udC53aWR0aCh0
ZXh0UnVuKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3JQaWN0dXJlRHJhd24pIHsKICAgICAg
ICAgICAgICAgICAgICAgaWYgKHVzYWJsZVdpZHRoID49IHRleHRXaWR0aCAmJiBmb250TWV0cmlj
cy5oZWlnaHQoKSA8PSBpbWFnZVkpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyTGlzdEJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckxpc3RCb3guY3BwCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJMaXN0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQsNyArNTQsNyBAQAog
I2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCiAjaW5jbHVkZSAiU2VsZWN0RWxlbWVudC5oIgog
I2luY2x1ZGUgIlNlbGVjdGlvbkNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJUZXh0UnVuLmgiCisj
aW5jbHVkZSAiVGV4dFJ1bkZhY3RvcnkuaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAKIHVzaW5nIG5h
bWVzcGFjZSBzdGQ7CkBAIC0xMTgsNyArMTE4LDcgQEAgdm9pZCBSZW5kZXJMaXN0Qm94Ojp1cGRh
dGVGcm9tRWxlbWVudCgpCiAKICAgICAgICAgICAgIGlmICghdGV4dC5pc0VtcHR5KCkpIHsKICAg
ICAgICAgICAgICAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgYWx3YXlzIExUUj8gQ2FuJ3QgdGV4
dCBkaXJlY3Rpb24gYWZmZWN0IHRoZSB3aWR0aD8KLSAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0
V2lkdGggPSBpdGVtRm9udC53aWR0aChUZXh0UnVuKHRleHQuaW1wbCgpLCBmYWxzZSwgMCwgMCwg
VGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgTFRSKSk7CisgICAgICAgICAgICAgICAg
ZmxvYXQgdGV4dFdpZHRoID0gaXRlbUZvbnQud2lkdGgoY3JlYXRlVGV4dFJ1bkFsbG93aW5nVHJh
aWxpbmdFeHBhbnNpb24odGV4dCwgc3R5bGUoKSkpOwogICAgICAgICAgICAgICAgIHdpZHRoID0g
bWF4KHdpZHRoLCB0ZXh0V2lkdGgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4dC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0LmgJKHJldmlzaW9uIDg1ODM1KQorKysgU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMTE5
LDcgKzExOSw3IEBAIHB1YmxpYzoKIAogICAgIElubGluZVRleHRCb3gqIGZpbmROZXh0SW5saW5l
VGV4dEJveChpbnQgb2Zmc2V0LCBpbnQmIHBvcykgY29uc3Q7CiAKLSAgICBib29sIGFsbG93VGFi
cygpIGNvbnN0IHsgcmV0dXJuICFzdHlsZSgpLT5jb2xsYXBzZVdoaXRlU3BhY2UoKTsgfQorICAg
IHZpcnR1YWwgYm9vbCBhbGxvd1RhYnMoKSBjb25zdCB7IHJldHVybiAhc3R5bGUoKS0+Y29sbGFw
c2VXaGl0ZVNwYWNlKCk7IH0KIAogICAgIHZvaWQgY2hlY2tDb25zaXN0ZW5jeSgpIGNvbnN0Owog
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5j
cHAJKHJldmlzaW9uIDg1ODM1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRl
eHRDb250cm9sLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUg
IlRleHQuaCIKICNpbmNsdWRlICJUZXh0Q29udHJvbElubmVyRWxlbWVudHMuaCIKICNpbmNsdWRl
ICJUZXh0SXRlcmF0b3IuaCIKLSNpbmNsdWRlICJUZXh0UnVuLmgiCisjaW5jbHVkZSAiVGV4dFJ1
bkZhY3RvcnkuaCIKICNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgogCiB1
c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtNTQyLDcgKzU0Miw3IEBAIGZsb2F0IFJlbmRlclRleHRD
b250cm9sOjpnZXRBdmdDaGFyV2lkdGgKICAgICAgICAgcmV0dXJuIHJvdW5kZihzdHlsZSgpLT5m
b250KCkucHJpbWFyeUZvbnQoKS0+YXZnQ2hhcldpZHRoKCkpOwogCiAgICAgY29uc3QgVUNoYXIg
Y2ggPSAnMCc7Ci0gICAgcmV0dXJuIHN0eWxlKCktPmZvbnQoKS53aWR0aChUZXh0UnVuKCZjaCwg
MSwgZmFsc2UsIDAsIDAsIFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24pKTsKKyAgICBy
ZXR1cm4gc3R5bGUoKS0+Zm9udCgpLndpZHRoKGNyZWF0ZVRleHRSdW5BbGxvd2luZ1RyYWlsaW5n
RXhwYW5zaW9uKFN0cmluZygmY2gsIDEpLCBzdHlsZSgpKSk7CiB9CiAKIGZsb2F0IFJlbmRlclRl
eHRDb250cm9sOjpzY2FsZUVtVG9Vbml0cyhpbnQgeCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9UZXh0UnVuRmFjdG9yeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1RleHRSdW5GYWN0b3J5LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0UnVuRmFjdG9yeS5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGlt
aXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlRleHRSdW5GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJJbmxpbmVUZXh0Qm94Lmgi
CisjaW5jbHVkZSAiUmVuZGVyU1ZHSW5saW5lVGV4dC5oIgorI2luY2x1ZGUgIlNWR0lubGluZVRl
eHRCb3guaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitUZXh0UnVuIGNyZWF0ZVRleHRSdW5B
bGxvd2luZ1RyYWlsaW5nRXhwYW5zaW9uKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVu
Z3RoLCBSZW5kZXJTdHlsZSogc3R5bGUsIFRleHRSdW5GbGFncyBmbGFncykKK3sKKyAgICBBU1NF
UlQoc3R5bGUpOworCisgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gTFRSOworICAg
IGJvb2wgZGlyZWN0aW9uYWxPdmVycmlkZSA9IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKTsKKyAg
ICBpZiAoZmxhZ3MgIT0gRGVmYXVsdFRleHRSdW5GbGFncykgeworICAgICAgICBpZiAoZmxhZ3Mg
JiBSZXNwZWN0RGlyZWN0aW9uKQorICAgICAgICAgICAgdGV4dERpcmVjdGlvbiA9IHN0eWxlLT5k
aXJlY3Rpb24oKTsKKyAgICAgICAgaWYgKGZsYWdzICYgUmVzcGVjdERpcmVjdGlvbk92ZXJyaWRl
KQorICAgICAgICAgICAgZGlyZWN0aW9uYWxPdmVycmlkZSB8PSBzdHlsZS0+dW5pY29kZUJpZGko
KSA9PSBPdmVycmlkZTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogUmVtb3ZlIFRleHRSdW5zIGFs
bC1pbi1vbmUtY29uc3RydWN0b3IgYW5kIHVzZSBleHBsaWNpdCBzZXR0ZXJzIGhlcmUuCisgICAg
cmV0dXJuIFRleHRSdW4oY2hhcmFjdGVycywgbGVuZ3RoLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6
QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgdGV4dERpcmVjdGlvbiwgZGlyZWN0aW9uYWxPdmVycmlk
ZSk7Cit9CisKK1RleHRSdW4gY3JlYXRlVGV4dFJ1bkFsbG93aW5nVHJhaWxpbmdFeHBhbnNpb24o
Y29uc3QgU3RyaW5nJiBzdHJpbmcsIFJlbmRlclN0eWxlKiBzdHlsZSwgVGV4dFJ1bkZsYWdzIGZs
YWdzKQoreworICAgIHJldHVybiBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGluZ0V4cGFuc2lv
bihzdHJpbmcuY2hhcmFjdGVycygpLCBzdHJpbmcubGVuZ3RoKCksIHN0eWxlLCBmbGFncyk7Cit9
CisKK1RleHRSdW4gY3JlYXRlVGV4dFJ1bkZvcklubGluZVRleHRCb3goY29uc3QgSW5saW5lVGV4
dEJveCogYm94LCBSZW5kZXJTdHlsZSogc3R5bGUsIEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiog
Y2hhcmFjdGVyc1dpdGhIeXBoZW4pCit7CisgICAgQVNTRVJUKGJveCk7CisgICAgQVNTRVJUKHN0
eWxlKTsKKworICAgIFJlbmRlclRleHQqIHRleHRSZW5kZXJlciA9IGJveC0+dGV4dFJlbmRlcmVy
KCk7CisgICAgQVNTRVJUKHRleHRSZW5kZXJlcik7CisgICAgQVNTRVJUKHRleHRSZW5kZXJlci0+
Y2hhcmFjdGVycygpKTsKKworICAgIHJldHVybiBjcmVhdGVUZXh0UnVuRm9ySW5saW5lVGV4dEJv
eChib3gsIHN0eWxlLCB0ZXh0UmVuZGVyZXItPmNoYXJhY3RlcnMoKSArIGJveC0+c3RhcnQoKSwg
Ym94LT5sZW4oKSwgY2hhcmFjdGVyc1dpdGhIeXBoZW4pOworfQorCitzdGF0aWMgdm9pZCBhZGp1
c3RDaGFyYWN0ZXJzQW5kTGVuZ3RoRm9ySHlwaGVuKEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiYg
Y2hhcmFjdGVyc1dpdGhIeXBoZW4sIFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgVUNoYXIqJiBj
aGFyYWN0ZXJzLCBpbnQmIGxlbmd0aCkKK3sKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIGh5cGhl
blN0cmluZyA9IHN0eWxlLT5oeXBoZW5TdHJpbmcoKTsKKyAgICBjaGFyYWN0ZXJzV2l0aEh5cGhl
bi5yZXNlcnZlQ2FwYWNpdHkobGVuZ3RoICsgaHlwaGVuU3RyaW5nLmxlbmd0aCgpKTsKKyAgICBj
aGFyYWN0ZXJzV2l0aEh5cGhlbi5hcHBlbmQoY2hhcmFjdGVycywgbGVuZ3RoKTsKKyAgICBjaGFy
YWN0ZXJzV2l0aEh5cGhlbi5hcHBlbmQoaHlwaGVuU3RyaW5nLmNoYXJhY3RlcnMoKSwgaHlwaGVu
U3RyaW5nLmxlbmd0aCgpKTsKKyAgICBjaGFyYWN0ZXJzID0gY2hhcmFjdGVyc1dpdGhIeXBoZW4u
ZGF0YSgpOworICAgIGxlbmd0aCArPSBoeXBoZW5TdHJpbmcubGVuZ3RoKCk7Cit9CisKK1RleHRS
dW4gY3JlYXRlVGV4dFJ1bkZvcklubGluZVRleHRCb3goY29uc3QgSW5saW5lVGV4dEJveCogYm94
LCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3Ro
LCBCdWZmZXJGb3JBcHBlbmRpbmdIeXBoZW4qIGNoYXJhY3RlcnNXaXRoSHlwaGVuKQoreworICAg
IEFTU0VSVChib3gpOworICAgIEFTU0VSVChzdHlsZSk7CisKKyAgICBSZW5kZXJUZXh0KiB0ZXh0
UmVuZGVyZXIgPSBib3gtPnRleHRSZW5kZXJlcigpOworICAgIEFTU0VSVCh0ZXh0UmVuZGVyZXIp
OworCisgICAgaWYgKGNoYXJhY3RlcnNXaXRoSHlwaGVuKQorICAgICAgICBhZGp1c3RDaGFyYWN0
ZXJzQW5kTGVuZ3RoRm9ySHlwaGVuKCpjaGFyYWN0ZXJzV2l0aEh5cGhlbiwgc3R5bGUsIGNoYXJh
Y3RlcnMsIGxlbmd0aCk7CisKKyAgICAvLyBGSVhNRTogUmVtb3ZlIFRleHRSdW5zIGFsbC1pbi1v
bmUtY29uc3RydWN0b3IgYW5kIHVzZSBleHBsaWNpdCBzZXR0ZXJzIGhlcmUuCisgICAgcmV0dXJu
IFRleHRSdW4oY2hhcmFjdGVycywgbGVuZ3RoLCB0ZXh0UmVuZGVyZXItPmFsbG93VGFicygpLCBi
b3gtPnRleHRQb3MoKSwgYm94LT5leHBhbnNpb24oKSwgYm94LT5leHBhbnNpb25CZWhhdmlvcigp
LCBib3gtPmRpcmVjdGlvbigpLCBib3gtPmRpck92ZXJyaWRlKCkgfHwgc3R5bGUtPnZpc3VhbGx5
T3JkZXJlZCgpKTsKK30KKworVGV4dFJ1biBjcmVhdGVUZXh0UnVuRm9yUmVuZGVyU1ZHSW5saW5l
VGV4dChSZW5kZXJTVkdJbmxpbmVUZXh0KiB0ZXh0UmVuZGVyZXIsIGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzLCBpbnQgbGVuZ3RoKQoreworICAgIEFTU0VSVCh0ZXh0UmVuZGVyZXIpOworCisgICAg
UmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dFJlbmRlcmVyLT5zdHlsZSgpOworICAgIEFTU0VSVChz
dHlsZSk7CisKKyAgICBUZXh0UnVuIHJ1biA9IGNyZWF0ZVRleHRSdW5BbGxvd2luZ1RyYWlsaW5n
RXhwYW5zaW9uKGNoYXJhY3RlcnMsIGxlbmd0aCwgc3R5bGUsIFJlc3BlY3REaXJlY3Rpb24gfCBS
ZXNwZWN0RGlyZWN0aW9uT3ZlcnJpZGUpOworCisgICAgLy8gRklYTUU6IFVzZSB0aGlzIHBsYWNl
IHRvIGF2b2lkIHRoZSBsYXllcmluZyB2aW9sYXRpb24sIHRoYXQgcGxhdGZvcm0vZ3JhcGhpY3Mv
VGV4dFJ1bi5oIHN0b3JlcyBSZW5kZXJPYmplY3QgcG9pbnRlcnMuCisjaWYgRU5BQkxFKFNWR19G
T05UUykKKyAgICBydW4uc2V0UmVmZXJlbmNpbmdSZW5kZXJPYmplY3QodGV4dFJlbmRlcmVyKTsK
KyNlbmRpZgorCisgICAgLy8gV2UgaGFuZGxlIGxldHRlciAmIHdvcmQgc3BhY2luZyBvdXJzZWx2
ZXMuCisgICAgcnVuLmRpc2FibGVTcGFjaW5nKCk7CisgICAgcmV0dXJuIHJ1bjsKK30KKworVGV4
dFJ1biBjcmVhdGVUZXh0UnVuRm9yU1ZHSW5saW5lVGV4dEJveChjb25zdCBTVkdJbmxpbmVUZXh0
Qm94KiBib3gsIFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgU1ZHVGV4dEZyYWdtZW50JiBmcmFn
bWVudCkKK3sKKyAgICBBU1NFUlQoYm94KTsKKyAgICBBU1NFUlQoc3R5bGUpOworCisgICAgUmVu
ZGVyU1ZHSW5saW5lVGV4dCogdGV4dFJlbmRlcmVyID0gdG9SZW5kZXJTVkdJbmxpbmVUZXh0KGJv
eC0+dGV4dFJlbmRlcmVyKCkpOworICAgIEFTU0VSVCh0ZXh0UmVuZGVyZXIpOworICAgIEFTU0VS
VCh0ZXh0UmVuZGVyZXItPmNoYXJhY3RlcnMoKSk7CisKKyAgICBUZXh0UnVuIHJ1biA9IGNyZWF0
ZVRleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KGJveCwgc3R5bGUsIHRleHRSZW5kZXJlci0+Y2hhcmFj
dGVycygpICsgZnJhZ21lbnQuY2hhcmFjdGVyT2Zmc2V0LCBmcmFnbWVudC5sZW5ndGgpOworCisg
ICAgLy8gRklYTUU6IFVzZSB0aGlzIHBsYWNlIHRvIGF2b2lkIHRoZSBsYXllcmluZyB2aW9sYXRp
b24sIHRoYXQgcGxhdGZvcm0vZ3JhcGhpY3MvVGV4dFJ1bi5oIHN0b3JlcyBSZW5kZXJPYmplY3Qg
cG9pbnRlcnMuCisjaWYgRU5BQkxFKFNWR19GT05UUykKKyAgICBydW4uc2V0UmVmZXJlbmNpbmdS
ZW5kZXJPYmplY3QodGV4dFJlbmRlcmVyKTsKKyNlbmRpZgorCisgICAgLy8gV2UgaGFuZGxlIGxl
dHRlciAmIHdvcmQgc3BhY2luZyBvdXJzZWx2ZXMuCisgICAgcnVuLmRpc2FibGVTcGFjaW5nKCk7
CisgICAgcmV0dXJuIHJ1bjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1RleHRSdW5GYWN0b3J5LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1RleHRSdW5GYWN0b3J5LmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dFJ1bkZhY3RvcnkuaAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQgMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgVGV4dFJ1bkZhY3Rv
cnlfaAorI2RlZmluZSBUZXh0UnVuRmFjdG9yeV9oCisKKyNpbmNsdWRlICJUZXh0UnVuLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRWxsaXBzaXNCb3g7CitjbGFzcyBJbmxpbmVU
ZXh0Qm94OworY2xhc3MgUmVuZGVyU3R5bGU7CisKK2VudW0gVGV4dFJ1bkZsYWcgeworICAgIERl
ZmF1bHRUZXh0UnVuRmxhZ3MgPSAwLAorICAgIFJlc3BlY3REaXJlY3Rpb24gPSAxIDw8IDAsCisg
ICAgUmVzcGVjdERpcmVjdGlvbk92ZXJyaWRlID0gMSA8PCAxCit9OworCit0eXBlZGVmIHVuc2ln
bmVkIFRleHRSdW5GbGFnczsKK3R5cGVkZWYgVmVjdG9yPFVDaGFyLCAyNTY+IEJ1ZmZlckZvckFw
cGVuZGluZ0h5cGhlbjsKKworVGV4dFJ1biBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGluZ0V4
cGFuc2lvbihjb25zdCBTdHJpbmcmLCBSZW5kZXJTdHlsZSosIFRleHRSdW5GbGFncyA9IERlZmF1
bHRUZXh0UnVuRmxhZ3MpOworVGV4dFJ1biBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGluZ0V4
cGFuc2lvbihjb25zdCBVQ2hhciosIGludCBsZW5ndGgsIFJlbmRlclN0eWxlKiwgVGV4dFJ1bkZs
YWdzID0gRGVmYXVsdFRleHRSdW5GbGFncyk7CisKK1RleHRSdW4gY3JlYXRlVGV4dFJ1bkZvcklu
bGluZVRleHRCb3goY29uc3QgSW5saW5lVGV4dEJveCosIFJlbmRlclN0eWxlKiwgQnVmZmVyRm9y
QXBwZW5kaW5nSHlwaGVuKiBjaGFyYWN0ZXJzV2l0aEh5cGhlbiA9IDApOworVGV4dFJ1biBjcmVh
dGVUZXh0UnVuRm9ySW5saW5lVGV4dEJveChjb25zdCBJbmxpbmVUZXh0Qm94KiwgUmVuZGVyU3R5
bGUqLCBjb25zdCBVQ2hhciosIGludCBsZW5ndGgsIEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiog
Y2hhcmFjdGVyc1dpdGhIeXBoZW4gPSAwKTsKKworI2lmIEVOQUJMRShTVkcpCitjbGFzcyBSZW5k
ZXJTVkdJbmxpbmVUZXh0OworY2xhc3MgU1ZHSW5saW5lVGV4dEJveDsKK2NsYXNzIFNWR1RleHRG
cmFnbWVudDsKK1RleHRSdW4gY3JlYXRlVGV4dFJ1bkZvclNWR0lubGluZVRleHRCb3goY29uc3Qg
U1ZHSW5saW5lVGV4dEJveCosIFJlbmRlclN0eWxlKiwgY29uc3QgU1ZHVGV4dEZyYWdtZW50Jik7
CitUZXh0UnVuIGNyZWF0ZVRleHRSdW5Gb3JSZW5kZXJTVkdJbmxpbmVUZXh0KFJlbmRlclNWR0lu
bGluZVRleHQqLCBjb25zdCBVQ2hhciosIGludCBsZW5ndGgpOworI2VuZGlmCisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFRleHRSdW5GYWN0b3J5X2gKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHSW5saW5lVGV4dC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHSW5saW5lVGV4dC5oCShy
ZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZH
SW5saW5lVGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC01Nyw2ICs1Nyw4IEBAIHByaXZhdGU6CiAK
ICAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNMYXllcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9
CiAgICAgdmlydHVhbCBib29sIGlzU1ZHSW5saW5lVGV4dCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KKyAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUYWJzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
KyAgICB2aXJ0dWFsIGZsb2F0IHRleHRQb3MoKSBjb25zdCB7IHJldHVybiAwOyB9CiAKICAgICB2
aXJ0dWFsIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvclBvaW50KGNvbnN0IEludFBvaW50Jik7
CiAgICAgdmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJl
dE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJveC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9TVkdJbmxpbmVUZXh0Qm94LmNwcAkocmV2aXNp
b24gODU4MzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRC
b3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVy
U1ZHUmVzb3VyY2VTb2xpZENvbG9yLmgiCiAjaW5jbHVkZSAiU1ZHSW1hZ2VCdWZmZXJUb29scy5o
IgogI2luY2x1ZGUgIlNWR1Jvb3RJbmxpbmVCb3guaCIKLSNpbmNsdWRlICJUZXh0UnVuLmgiCisj
aW5jbHVkZSAiVGV4dFJ1bkZhY3RvcnkuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApAQCAt
NjYsNyArNjYsNyBAQCBpbnQgU1ZHSW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9yUG9zaXRpb25JCiAg
ICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dFJlbmRlcmVyLT5zdHlsZSgpOwogICAgIEFTU0VS
VChzdHlsZSk7CiAKLSAgICBUZXh0UnVuIHRleHRSdW4oY29uc3RydWN0VGV4dFJ1bihzdHlsZSwg
ZnJhZ21lbnQpKTsKKyAgICBUZXh0UnVuIHRleHRSdW4gPSBjcmVhdGVUZXh0UnVuRm9yU1ZHSW5s
aW5lVGV4dEJveCh0aGlzLCBzdHlsZSwgZnJhZ21lbnQpOwogCiAgICAgLy8gRXZlbnR1YWxseSBo
YW5kbGUgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nQW5kR2x5cGhzIi4KICAgICAvLyBGSVhNRTogSGFu
ZGxlIHZlcnRpY2FsIHRleHQuCkBAIC0xMDQsNyArMTA0LDcgQEAgRmxvYXRSZWN0IFNWR0lubGlu
ZVRleHRCb3g6OnNlbGVjdGlvblJlYwogCiAgICAgdGV4dE9yaWdpbi5tb3ZlKDAsIC1zY2FsZWRG
b250TWV0cmljcy5mbG9hdEFzY2VudCgpKTsKIAotICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25SZWN0
ID0gc2NhbGVkRm9udC5zZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdHJ1Y3RUZXh0UnVuKHN0eWxl
LCBmcmFnbWVudCksIHRleHRPcmlnaW4sIGZyYWdtZW50LmhlaWdodCAqIHNjYWxpbmdGYWN0b3Is
IHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKKyAgICBGbG9hdFJlY3Qgc2VsZWN0aW9uUmVj
dCA9IHNjYWxlZEZvbnQuc2VsZWN0aW9uUmVjdEZvclRleHQoY3JlYXRlVGV4dFJ1bkZvclNWR0lu
bGluZVRleHRCb3godGhpcywgc3R5bGUsIGZyYWdtZW50KSwgdGV4dE9yaWdpbiwgZnJhZ21lbnQu
aGVpZ2h0ICogc2NhbGluZ0ZhY3Rvciwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pOwogICAg
IGlmIChzY2FsaW5nRmFjdG9yID09IDEpCiAgICAgICAgIHJldHVybiBzZWxlY3Rpb25SZWN0Owog
CkBAIC0zOTgsMzIgKzM5OCw2IEBAIHZvaWQgU1ZHSW5saW5lVGV4dEJveDo6cmVzdG9yZUdyYXBo
aWNzQ28KICNlbmRpZgogfQogCi1UZXh0UnVuIFNWR0lubGluZVRleHRCb3g6OmNvbnN0cnVjdFRl
eHRSdW4oUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBTVkdUZXh0RnJhZ21lbnQmIGZyYWdtZW50
KSBjb25zdAotewotICAgIEFTU0VSVChzdHlsZSk7Ci0gICAgQVNTRVJUKHRleHRSZW5kZXJlcigp
KTsKLQotICAgIFJlbmRlclRleHQqIHRleHQgPSB0ZXh0UmVuZGVyZXIoKTsKLSAgICBBU1NFUlQo
dGV4dCk7Ci0KLSAgICBUZXh0UnVuIHJ1bih0ZXh0LT5jaGFyYWN0ZXJzKCkgKyBmcmFnbWVudC5j
aGFyYWN0ZXJPZmZzZXQKLSAgICAgICAgICAgICAgICAsIGZyYWdtZW50Lmxlbmd0aAotICAgICAg
ICAgICAgICAgICwgZmFsc2UgLyogYWxsb3dUYWJzICovCi0gICAgICAgICAgICAgICAgLCAwIC8q
IHhQb3MsIG9ubHkgcmVsZXZhbnQgd2l0aCBhbGxvd1RhYnM9dHJ1ZSAqLwotICAgICAgICAgICAg
ICAgICwgMCAvKiBwYWRkaW5nLCBvbmx5IHJlbGV2YW50IGZvciBqdXN0aWZpZWQgdGV4dCwgbm90
IHJlbGV2YW50IGZvciBTVkcgKi8KLSAgICAgICAgICAgICAgICAsIFRleHRSdW46OkFsbG93VHJh
aWxpbmdFeHBhbnNpb24KLSAgICAgICAgICAgICAgICAsIGRpcmVjdGlvbigpCi0gICAgICAgICAg
ICAgICAgLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSAvKiBkaXJl
Y3Rpb25hbE92ZXJyaWRlICovKTsKLQotI2lmIEVOQUJMRShTVkdfRk9OVFMpCi0gICAgcnVuLnNl
dFJlZmVyZW5jaW5nUmVuZGVyT2JqZWN0KHRleHQpOwotI2VuZGlmCi0KLSAgICAvLyBXZSBoYW5k
bGUgbGV0dGVyICYgd29yZCBzcGFjaW5nIG91cnNlbHZlcy4KLSAgICBydW4uZGlzYWJsZVNwYWNp
bmcoKTsKLSAgICByZXR1cm4gcnVuOwotfQotCiBib29sIFNWR0lubGluZVRleHRCb3g6Om1hcFN0
YXJ0RW5kUG9zaXRpb25zSW50b0ZyYWdtZW50Q29vcmRpbmF0ZXMoY29uc3QgU1ZHVGV4dEZyYWdt
ZW50JiBmcmFnbWVudCwgaW50JiBzdGFydFBvc2l0aW9uLCBpbnQmIGVuZFBvc2l0aW9uKSBjb25z
dAogewogICAgIGlmIChzdGFydFBvc2l0aW9uID49IGVuZFBvc2l0aW9uKQpAQCAtNjU5LDcgKzYz
Myw3IEBAIHZvaWQgU1ZHSW5saW5lVGV4dEJveDo6cGFpbnRUZXh0KEdyYXBoaWMKICAgICB9CiAK
ICAgICAvLyBGYXN0IHBhdGggaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBqdXN0IGRyYXcgdGhl
IHdob2xlIGNodW5rIHBhcnQgdXNpbmcgdGhlIHJlZ3VsYXIgc3R5bGUKLSAgICBUZXh0UnVuIHRl
eHRSdW4oY29uc3RydWN0VGV4dFJ1bihzdHlsZSwgZnJhZ21lbnQpKTsKKyAgICBUZXh0UnVuIHRl
eHRSdW4gPSBjcmVhdGVUZXh0UnVuRm9yU1ZHSW5saW5lVGV4dEJveCh0aGlzLCBzdHlsZSwgZnJh
Z21lbnQpOwogICAgIGlmICghaGFzU2VsZWN0aW9uIHx8IHN0YXJ0UG9zaXRpb24gPj0gZW5kUG9z
aXRpb24pIHsKICAgICAgICAgcGFpbnRUZXh0V2l0aFNoYWRvd3MoY29udGV4dCwgc3R5bGUsIHRl
eHRSdW4sIGZyYWdtZW50LCAwLCBmcmFnbWVudC5sZW5ndGgpOwogICAgICAgICByZXR1cm47CkBA
IC02NzMsNyArNjQ3LDcgQEAgdm9pZCBTVkdJbmxpbmVUZXh0Qm94OjpwYWludFRleHQoR3JhcGhp
YwogICAgIGlmIChzdHlsZSAhPSBzZWxlY3Rpb25TdHlsZSkKICAgICAgICAgU1ZHUmVzb3VyY2Vz
Q2FjaGU6OmNsaWVudFN0eWxlQ2hhbmdlZChwYXJlbnQoKS0+cmVuZGVyZXIoKSwgU3R5bGVEaWZm
ZXJlbmNlUmVwYWludCwgc2VsZWN0aW9uU3R5bGUpOwogCi0gICAgVGV4dFJ1biBzZWxlY3Rpb25U
ZXh0UnVuKGNvbnN0cnVjdFRleHRSdW4oc2VsZWN0aW9uU3R5bGUsIGZyYWdtZW50KSk7CisgICAg
VGV4dFJ1biBzZWxlY3Rpb25UZXh0UnVuID0gY3JlYXRlVGV4dFJ1bkZvclNWR0lubGluZVRleHRC
b3godGhpcywgc2VsZWN0aW9uU3R5bGUsIGZyYWdtZW50KTsKICAgICBwYWludFRleHRXaXRoU2hh
ZG93cyhjb250ZXh0LCBzZWxlY3Rpb25TdHlsZSwgdGV4dFJ1biwgZnJhZ21lbnQsIHN0YXJ0UG9z
aXRpb24sIGVuZFBvc2l0aW9uKTsKIAogICAgIGlmIChzdHlsZSAhPSBzZWxlY3Rpb25TdHlsZSkK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJveC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJv
eC5oCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZH
SW5saW5lVGV4dEJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC02NCw4ICs2NCw2IEBAIHB1YmxpYzoK
ICAgICBGbG9hdFJlY3Qgc2VsZWN0aW9uUmVjdEZvclRleHRGcmFnbWVudChjb25zdCBTVkdUZXh0
RnJhZ21lbnQmLCBpbnQgZnJhZ21lbnRTdGFydFBvc2l0aW9uLCBpbnQgZnJhZ21lbnRFbmRQb3Np
dGlvbiwgUmVuZGVyU3R5bGUqKTsKIAogcHJpdmF0ZToKLSAgICBUZXh0UnVuIGNvbnN0cnVjdFRl
eHRSdW4oUmVuZGVyU3R5bGUqLCBjb25zdCBTVkdUZXh0RnJhZ21lbnQmKSBjb25zdDsKLQogICAg
IGJvb2wgYWNxdWlyZVBhaW50aW5nUmVzb3VyY2UoR3JhcGhpY3NDb250ZXh0KiYsIGZsb2F0IHNj
YWxpbmdGYWN0b3IsIFJlbmRlck9iamVjdCosIFJlbmRlclN0eWxlKik7CiAgICAgdm9pZCByZWxl
YXNlUGFpbnRpbmdSZXNvdXJjZShHcmFwaGljc0NvbnRleHQqJiwgY29uc3QgUGF0aCopOwogCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1RleHRNZXRyaWNzLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1RleHRNZXRyaWNzLmNw
cAkocmV2aXNpb24gODU4MzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1Rl
eHRNZXRyaWNzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzIsMzMgKzcyLDEwIEBAIFNWR1RleHRN
ZXRyaWNzIFNWR1RleHRNZXRyaWNzOjplbXB0eU1ldHIKICAgICByZXR1cm4gc19lbXB0eU1ldHJp
Y3M7CiB9CiAKLXN0YXRpYyBUZXh0UnVuIGNvbnN0cnVjdFRleHRSdW4oUmVuZGVyU1ZHSW5saW5l
VGV4dCogdGV4dCwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIHBvc2l0aW9uLCB1
bnNpZ25lZCBsZW5ndGgpCi17Ci0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dC0+c3R5bGUo
KTsKLSAgICBBU1NFUlQoc3R5bGUpOwotCi0gICAgVGV4dFJ1biBydW4oY2hhcmFjdGVycyArIHBv
c2l0aW9uCi0gICAgICAgICAgICAgICAgLCBsZW5ndGgKLSAgICAgICAgICAgICAgICAsIGZhbHNl
IC8qIGFsbG93VGFicyAqLwotICAgICAgICAgICAgICAgICwgMCAvKiB4UG9zLCBvbmx5IHJlbGV2
YW50IHdpdGggYWxsb3dUYWJzPXRydWUgKi8KLSAgICAgICAgICAgICAgICAsIDAgLyogcGFkZGlu
Zywgb25seSByZWxldmFudCBmb3IganVzdGlmaWVkIHRleHQsIG5vdCByZWxldmFudCBmb3IgU1ZH
ICovCi0gICAgICAgICAgICAgICAgLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uCi0g
ICAgICAgICAgICAgICAgLCBzdHlsZS0+ZGlyZWN0aW9uKCkKLSAgICAgICAgICAgICAgICAsIHN0
eWxlLT51bmljb2RlQmlkaSgpID09IE92ZXJyaWRlIC8qIGRpcmVjdGlvbmFsT3ZlcnJpZGUgKi8p
OwotCi0jaWYgRU5BQkxFKFNWR19GT05UUykKLSAgICBydW4uc2V0UmVmZXJlbmNpbmdSZW5kZXJP
YmplY3QodGV4dCk7Ci0jZW5kaWYKLQotICAgIC8vIFdlIGhhbmRsZSBsZXR0ZXIgJiB3b3JkIHNw
YWNpbmcgb3Vyc2VsdmVzLgotICAgIHJ1bi5kaXNhYmxlU3BhY2luZygpOwotICAgIHJldHVybiBy
dW47Ci19Ci0KIFNWR1RleHRNZXRyaWNzIFNWR1RleHRNZXRyaWNzOjptZWFzdXJlQ2hhcmFjdGVy
UmFuZ2UoUmVuZGVyU1ZHSW5saW5lVGV4dCogdGV4dCwgdW5zaWduZWQgcG9zaXRpb24sIHVuc2ln
bmVkIGxlbmd0aCkKIHsKICAgICBBU1NFUlQodGV4dCk7Ci0gICAgVGV4dFJ1biBydW4oY29uc3Ry
dWN0VGV4dFJ1bih0ZXh0LCB0ZXh0LT5jaGFyYWN0ZXJzKCksIHBvc2l0aW9uLCBsZW5ndGgpKTsK
KyAgICBUZXh0UnVuIHJ1biA9IGNyZWF0ZVRleHRSdW5Gb3JSZW5kZXJTVkdJbmxpbmVUZXh0KHRl
eHQsIHRleHQtPmNoYXJhY3RlcnMoKSArIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgIHJldHVybiBT
VkdUZXh0TWV0cmljcyh0ZXh0LCBydW4sIHBvc2l0aW9uLCB0ZXh0LT50ZXh0TGVuZ3RoKCkpOwog
fQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92386</attachid>
            <date>2011-05-05 01:17:24 -0700</date>
            <delta_ts>2011-05-10 03:22:35 -0700</delta_ts>
            <desc>Patch v2</desc>
            <filename>TextRun-v2.diff</filename>
            <type>text/plain</type>
            <size>47131</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg1ODQwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTEtMDUtMDUgIE5pa29sYXMg
WmltbWVybWFubiAgPG56aW1tZXJtYW5uQHJpbS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVmYWN0b3IgVGV4dFJ1biBjcmVhdGlvbgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjAyNTUKKworICAg
ICAgICBJbnRyb2R1Y2UgcmVuZGVyaW5nL1RleHRSdW5GYWN0b3J5LmgsIHdoaWNoIHByb3ZpZGVz
IHNldmVyYWwgZnJlZSBmdW5jdGlvbnMgdGhhdCBlYXNlCisgICAgICAgIGluIGNyZWF0aW5nIFRl
eHRSdW5zLCBmb3IgSW5saW5lVGV4dEJveC9TVkdJbmxpbmVUZXh0Qm94LCBhbmQgdmFyaW91cyBv
dGhlciBwbGFjZXMgaW4gcmVuZGVyaW5nLgorICAgICAgICBUaGUgbG9uZy10ZXJtIGdvYWwgaXMg
dG8gcmVtb3ZlIHRoZSB1Z2x5IGVpZ2h0IHBhcmFtZXRlcnMgY2F0Y2gtaXQtYWxsIFRleHRSdW4g
Y29uc3RydWN0b3IsIGFuZAorICAgICAgICByZXBsYWNlIGl0IHdpdGggZXhwbGljaXQgc2V0dGVy
cy9nZXR0ZXJzLiBUbyBhdm9pZCBleHBhbmRpbmcgZG96ZW5zIG9mIGNhbGxzaXRlcywgd2hlbiBy
ZW1vdmluZworICAgICAgICB0aGUgY2F0Y2gtaXQtYWxsIGNvbnN0cnVjdG9yLCBUZXh0UnVuRmFj
dG9yeSBpcyBpbnRyb2R1Y2RlZCwgd2hpY2ggaGlkZXMgdGhlIGRldGFpbHMgb2YgY3JlYXRpbmcK
KyAgICAgICAgYSBUZXh0UnVuLgorCisgICAgICAgIEZ1cnRoZXJtb3JlIGl0IHdpbGwgYmUgdXNl
ZCB0byByZW1vdmUgdGhlIHBsYXRmb3JtIGxheWVyaW5nIHZpb2xhdGlvbiwgdGhhdCBUZXh0UnVu
IHN0b3JlcworICAgICAgICBSZW5kZXJPYmplY3QgcG9pbnRlcnMgZm9yIHRoZSBzYWtlIG9mIFNW
RyBGb250cyBzdXBwb3J0LCBzZWUgYnVnIDYwMjU0LgorCisgICAgICAgIE5vIGNoYW5nZSBpbiBm
dW5jdGlvbmFsaXksIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIENNYWtlTGlzdHMudHh0Ogor
ICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3QuYW06CisgICAgICAgICogV2ViQ29yZS5neXBpOgor
ICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAg
ICAgICAgKiByZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6RWxs
aXBzaXNCb3g6OnBhaW50KToKKyAgICAgICAgKFdlYkNvcmU6OkVsbGlwc2lzQm94OjpzZWxlY3Rp
b25SZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsbGlwc2lzQm94OjpwYWludFNlbGVjdGlvbik6
CisgICAgICAgICogcmVuZGVyaW5nL0lubGluZUJveC5oOgorICAgICAgICAoV2ViQ29yZTo6SW5s
aW5lQm94OjpkaXJPdmVycmlkZSk6CisgICAgICAgICogcmVuZGVyaW5nL0lubGluZVRleHRCb3gu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6c2VsZWN0aW9uUmVjdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94OjpwYWludCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbmxpbmVUZXh0Qm94OjpwYWludFNlbGVjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpJbmxp
bmVUZXh0Qm94OjpwYWludENvbXBvc2l0aW9uQmFja2dyb3VuZCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbmxpbmVUZXh0Qm94OjpwYWludFNwZWxsaW5nT3JHcmFtbWFyTWFya2VyKToKKyAgICAgICAg
KFdlYkNvcmU6OklubGluZVRleHRCb3g6OnBhaW50VGV4dE1hdGNoTWFya2VyKToKKyAgICAgICAg
KFdlYkNvcmU6OklubGluZVRleHRCb3g6OmNvbXB1dGVSZWN0Rm9yUmVwbGFjZW1lbnRNYXJrZXIp
OgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9yUG9zaXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6cG9zaXRpb25Gb3JPZmZzZXQpOgorICAg
ICAgICAqIHJlbmRlcmluZy9JbmxpbmVUZXh0Qm94Lmg6CisgICAgICAgIChXZWJDb3JlOjpJbmxp
bmVUZXh0Qm94OjpleHBhbnNpb25CZWhhdmlvcik6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRl
ckVtYmVkZGVkT2JqZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckVtYmVkZGVkT2Jq
ZWN0OjpnZXRSZXBsYWNlbWVudFRleHRHZW9tZXRyeSk6CisgICAgICAgICogcmVuZGVyaW5nL1Jl
bmRlckZpbGVVcGxvYWRDb250cm9sLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckZpbGVV
cGxvYWRDb250cm9sOjpwYWludE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJGaWxl
VXBsb2FkQ29udHJvbDo6Y29tcHV0ZVByZWZlcnJlZExvZ2ljYWxXaWR0aHMpOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJJbWFnZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJJbWFn
ZTo6c2V0SW1hZ2VTaXplRm9yQWx0VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJJbWFn
ZTo6cGFpbnRSZXBsYWNlZCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckxpc3RCb3guY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyTGlzdEJveDo6dXBkYXRlRnJvbUVsZW1lbnQpOgor
ICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Lmg6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUZXh0OjphbGxvd1RhYnMpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJv
bC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6Z2V0QXZnQ2hhcldp
ZHRoKToKKyAgICAgICAgKiByZW5kZXJpbmcvVGV4dFJ1bkZhY3RvcnkuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OmNyZWF0ZVRleHRSdW5BbGxvd2luZ1RyYWlsaW5nRXhwYW5zaW9uKToK
KyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZVRleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KToKKyAgICAg
ICAgKFdlYkNvcmU6OmFkanVzdENoYXJhY3RlcnNBbmRMZW5ndGhGb3JIeXBoZW4pOgorICAgICAg
ICAoV2ViQ29yZTo6Y3JlYXRlVGV4dFJ1bkZvclJlbmRlclNWR0lubGluZVRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6Y3JlYXRlVGV4dFJ1bkZvclNWR0lubGluZVRleHRCb3gpOgorICAgICAgICAq
IHJlbmRlcmluZy9UZXh0UnVuRmFjdG9yeS5oOiBBZGRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcv
c3ZnL1JlbmRlclNWR0lubGluZVRleHQuaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR0lu
bGluZVRleHQ6OmFsbG93VGFicyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdJbmxpbmVU
ZXh0Ojp0ZXh0UG9zKToKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRCb3gu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9yUG9zaXRp
b25JbkZyYWdtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlNWR0lubGluZVRleHRCb3g6OnNlbGVj
dGlvblJlY3RGb3JUZXh0RnJhZ21lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHSW5saW5lVGV4
dEJveDo6cGFpbnRUZXh0KToKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRC
b3guaDoKKyAgICAgICAgKiByZW5kZXJpbmcvc3ZnL1NWR1RleHRNZXRyaWNzLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlNWR1RleHRNZXRyaWNzOjptZWFzdXJlQ2hhcmFjdGVyUmFuZ2UpOgorCiAy
MDExLTA1LTA1ICBZb3VuZyBIYW4gTGVlICA8am95YnJvQGNvbXBhbnkxMDAubmV0PgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IENzYWJhIE9zenRyb2dvbsOhYy4KSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMu
dHh0CShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CSh3
b3JraW5nIGNvcHkpCkBAIC0xMjcyLDYgKzEyNzIsNyBAQCBTRVQoV2ViQ29yZV9TT1VSQ0VTCiAg
ICAgcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwCiAgICAgcmVuZGVyaW5nL1Njcm9sbEJlaGF2
aW9yLmNwcAogICAgIHJlbmRlcmluZy9TaGFkb3dFbGVtZW50LmNwcAorICAgIHJlbmRlcmluZy9U
ZXh0UnVuRmFjdG9yeS5jcHAKICAgICByZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuY3BwCiAgICAg
cmVuZGVyaW5nL2JyZWFrX2xpbmVzLmNwcAogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9HTlVtYWtl
ZmlsZS5saXN0LmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxp
c3QuYW0JKHJldmlzaW9uIDg1ODM1KQorKysgU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlz
dC5hbQkod29ya2luZyBjb3B5KQpAQCAtMzA3MCw2ICszMDcwLDggQEAgd2ViY29yZV9zb3VyY2Vz
ICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1RleHRRdWVyeS5jcHAgXAog
CVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHVGV4dFF1ZXJ5LmggXAogCVNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9UYWJsZUxheW91dC5oIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvVGV4dFJ1bkZhY3RvcnkuY3BwIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dFJ1
bkZhY3RvcnkuaCBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1RyYWlsaW5nRmxvYXRzUm9v
dElubGluZUJveC5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUu
Y3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuaCBcCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNv
cmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtNTI5Niw2ICs1Mjk2LDggQEAKICAgICAgICAgICAg
ICdyZW5kZXJpbmcvU2hhZG93RWxlbWVudC5jcHAnLAogICAgICAgICAgICAgJ3JlbmRlcmluZy9T
aGFkb3dFbGVtZW50LmgnLAogICAgICAgICAgICAgJ3JlbmRlcmluZy9UYWJsZUxheW91dC5oJywK
KyAgICAgICAgICAgICdyZW5kZXJpbmcvVGV4dFJ1bkZhY3RvcnkuY3BwJywKKyAgICAgICAgICAg
ICdyZW5kZXJpbmcvVGV4dFJ1bkZhY3RvcnkuaCcsCiAgICAgICAgICAgICAncmVuZGVyaW5nL1Ry
YWlsaW5nRmxvYXRzUm9vdElubGluZUJveC5oJywKICAgICAgICAgICAgICdyZW5kZXJpbmcvVHJh
bnNmb3JtU3RhdGUuY3BwJywKICAgICAgICAgICAgICdyZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUu
aCcsCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gODU4MzUpCisrKyBTb3VyY2UvV2ViQ29y
ZS9XZWJDb3JlLnBybwkod29ya2luZyBjb3B5KQpAQCAtMTE1MCw2ICsxMTUwLDcgQEAgU09VUkNF
UyArPSBcCiAgICAgcmVuZGVyaW5nL1Jvb3RJbmxpbmVCb3guY3BwIFwKICAgICByZW5kZXJpbmcv
U2Nyb2xsQmVoYXZpb3IuY3BwIFwKICAgICByZW5kZXJpbmcvU2hhZG93RWxlbWVudC5jcHAgXAor
ICAgIHJlbmRlcmluZy9UZXh0UnVuRmFjdG9yeS5jcHAgXAogICAgIHJlbmRlcmluZy9UcmFuc2Zv
cm1TdGF0ZS5jcHAgXAogICAgIHJlbmRlcmluZy9zdHlsZS9Db250ZW50RGF0YS5jcHAgXAogICAg
IHJlbmRlcmluZy9zdHlsZS9Db3VudGVyRGlyZWN0aXZlcy5jcHAgXApAQCAtMjI0MCw2ICsyMjQx
LDcgQEAgSEVBREVSUyArPSBcCiAgICAgcmVuZGVyaW5nL3N2Zy9TVkdUZXh0TGF5b3V0RW5naW5l
U3BhY2luZy5oIFwKICAgICByZW5kZXJpbmcvc3ZnL1NWR1RleHRNZXRyaWNzLmggXAogICAgIHJl
bmRlcmluZy9zdmcvU1ZHVGV4dFF1ZXJ5LmggXAorICAgIHJlbmRlcmluZy9UZXh0UnVuRmFjdG9y
eS5oIFwKICAgICByZW5kZXJpbmcvVHJhbnNmb3JtU3RhdGUuaCBcCiAgICAgc3ZnL2FuaW1hdGlv
bi9TTUlMVGltZUNvbnRhaW5lci5oIFwKICAgICBzdmcvYW5pbWF0aW9uL1NNSUxUaW1lLmggXApJ
bmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJl
dmlzaW9uIDg1ODM1KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52
Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTM4NzA4LDYgKzM4NzA4LDE0IEBACiAJCQkJPgogCQkJ
PC9GaWxlPgogCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHJlbmRlcmluZ1xUZXh0UnVu
RmFjdG9yeS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHJlbmRlcmluZ1xUZXh0UnVuRmFjdG9yeS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJ
CTxGaWxlCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcVHJhaWxpbmdGbG9hdHNSb290
SW5saW5lQm94LmgiCiAJCQkJPgogCQkJPC9GaWxlPgpJbmRleDogU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gODU4MzUpCisr
KyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtp
bmcgY29weSkKQEAgLTk5LDYgKzk5LDggQEAKIAkJMDg1QTE1OTMxMjg5QThERDAwMjcxMEUzIC8q
IFNWR0FuaW1hdGVkVHJhbnNmb3JtTGlzdFByb3BlcnR5VGVhck9mZi5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg1QTE1OTIxMjg5QThERDAwMjcxMEUz
IC8qIFNWR0FuaW1hdGVkVHJhbnNmb3JtTGlzdFByb3BlcnR5VGVhck9mZi5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTA4NUI5MkJBMEVGREU3M0Qw
MEU2MTIzQyAvKiBGb3JtRGF0YUJ1aWxkZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMDg1QjkyQjgwRUZERTczRDAwRTYxMjNDIC8qIEZvcm1EYXRh
QnVpbGRlci5jcHAgKi87IH07CiAJCTA4NUI5MkJCMEVGREU3M0QwMEU2MTIzQyAvKiBGb3JtRGF0
YUJ1aWxkZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDA4NUI5MkI5MEVGREU3M0QwMEU2MTIzQyAvKiBGb3JtRGF0YUJ1aWxkZXIuaCAqLzsgc2V0dGlu
Z3MgPSB7QVRUUklCVVRFUyA9ICgpOyB9OyB9OworCQkwODYxQTE5RDEzNjJBQUNBMDAyRTQyMzUg
LyogVGV4dFJ1bkZhY3RvcnkuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMDg2MUExOUIxMzYyQUFDQTAwMkU0MjM1IC8qIFRleHRSdW5GYWN0b3J5LmNw
cCAqLzsgfTsKKwkJMDg2MUExOUUxMzYyQUFDQTAwMkU0MjM1IC8qIFRleHRSdW5GYWN0b3J5Lmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODYxQTE5QzEz
NjJBQUNBMDAyRTQyMzUgLyogVGV4dFJ1bkZhY3RvcnkuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwODY0MUQ0NzEyMTQyRjdEMDA4REU5RjYgLyog
UmVuZGVySW1hZ2VSZXNvdXJjZVN0eWxlSW1hZ2UuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMDg2NDFENDUxMjE0MkY3RDAwOERFOUY2IC8qIFJlbmRl
ckltYWdlUmVzb3VyY2VTdHlsZUltYWdlLmNwcCAqLzsgfTsKIAkJMDg2NDFENDgxMjE0MkY3RDAw
OERFOUY2IC8qIFJlbmRlckltYWdlUmVzb3VyY2VTdHlsZUltYWdlLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODY0MUQ0NjEyMTQyRjdEMDA4REU5RjYg
LyogUmVuZGVySW1hZ2VSZXNvdXJjZVN0eWxlSW1hZ2UuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwODZCQkQwRjEzNjAzOUMyMDA4QjE1RDggLyog
R2x5cGguaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4
NkJCRDBFMTM2MDM5QzIwMDhCMTVEOCAvKiBHbHlwaC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CkBAIC02NDU4LDYgKzY0NjAsOCBAQAogCQkwODVBMTU5
MjEyODlBOEREMDAyNzEwRTMgLyogU1ZHQW5pbWF0ZWRUcmFuc2Zvcm1MaXN0UHJvcGVydHlUZWFy
T2ZmLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNWR0FuaW1hdGVkVHJhbnNm
b3JtTGlzdFByb3BlcnR5VGVhck9mZi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkw
ODVCOTJCODBFRkRFNzNEMDBFNjEyM0MgLyogRm9ybURhdGFCdWlsZGVyLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZvcm1EYXRhQnVpbGRlci5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTA4NUI5MkI5MEVGREU3M0QwMEU2MTIzQyAvKiBGb3JtRGF0
YUJ1aWxkZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRm9ybURhdGFCdWls
ZGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTA4NjFBMTlCMTM2MkFBQ0EwMDJF
NDIzNSAvKiBUZXh0UnVuRmFjdG9yeS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBUZXh0UnVuRmFjdG9yeS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CTA4NjFBMTlDMTM2MkFBQ0EwMDJFNDIzNSAvKiBUZXh0UnVuRmFjdG9yeS5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBUZXh0UnVuRmFjdG9yeS5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQkwODY0MUQ0NTEyMTQyRjdEMDA4REU5RjYgLyogUmVuZGVySW1hZ2VSZXNv
dXJjZVN0eWxlSW1hZ2UuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
UmVuZGVySW1hZ2VSZXNvdXJjZVN0eWxlSW1hZ2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQkwODY0MUQ0NjEyMTQyRjdEMDA4REU5RjYgLyogUmVuZGVySW1hZ2VSZXNvdXJjZVN0
eWxlSW1hZ2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVySW1hZ2VS
ZXNvdXJjZVN0eWxlSW1hZ2UuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDg2QkJE
MEUxMzYwMzlDMjAwOEIxNUQ4IC8qIEdseXBoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IEdseXBoLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xOTA3Myw2ICsx
OTA3Nyw4IEBACiAJCQkJQTdGMzM4QTExMUMwRUZDQTAwQTMyMEE3IC8qIFNoYWRvd0VsZW1lbnQu
Y3BwICovLAogCQkJCUE3RjMzOEEyMTFDMEVGQ0EwMEEzMjBBNyAvKiBTaGFkb3dFbGVtZW50Lmgg
Ki8sCiAJCQkJQThDRkYwNEMwQTE1NEYwOTAwMEE0MjM0IC8qIFRhYmxlTGF5b3V0LmggKi8sCisJ
CQkJMDg2MUExOUIxMzYyQUFDQTAwMkU0MjM1IC8qIFRleHRSdW5GYWN0b3J5LmNwcCAqLywKKwkJ
CQkwODYxQTE5QzEzNjJBQUNBMDAyRTQyMzUgLyogVGV4dFJ1bkZhY3RvcnkuaCAqLywKIAkJCQkz
N0ZDOTZEQTExMDRFRDcxMDAzRTFGQUQgLyogVHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94Lmgg
Ki8sCiAJCQkJMEY1MDBBQjAwRjU0REIzMTAwRUVGOTI4IC8qIFRyYW5zZm9ybVN0YXRlLmNwcCAq
LywKIAkJCQkwRjUwMEFBRTBGNTREQjFCMDBFRUY5MjggLyogVHJhbnNmb3JtU3RhdGUuaCAqLywK
QEAgLTIyNTQ3LDYgKzIyNTUzLDcgQEAKIAkJCQk5MzBGQzY4QTEwNzJCOTI4MDA0NTI5M0UgLyog
VGV4dFJlbmRlcmluZ01vZGUuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OEY2MDgyNDVFNTkw
MDFFOUFCQyAvKiBUZXh0UmVzb3VyY2VEZWNvZGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQlBODI0
QjQ2NTBFMkVGMkVBMDA4MUE3QjcgLyogVGV4dFJ1bi5oIGluIEhlYWRlcnMgKi8sCisJCQkJMDg2
MUExOUUxMzYyQUFDQTAwMkU0MjM1IC8qIFRleHRSdW5GYWN0b3J5LmggaW4gSGVhZGVycyAqLywK
IAkJCQlCMkMzREE0QjBEMDA2QzFEMDBFRjZGMjYgLyogVGV4dFN0cmVhbS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJNDk4NzcwRjExMjQyQzUzNTAwMjIyNkJBIC8qIFRleHR1cmUuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTk3QkM4NEE1MTIzNzBEQzgwMDBDNjE2MSAvKiBUZXh0Vmlld1NvdXJjZVBhcnNl
ci5oIGluIEhlYWRlcnMgKi8sCkBAIC0yNTI0NSw2ICsyNTI1Miw3IEBACiAJCQkJRjU1QjNERDkx
MjUxRjEyRDAwM0VGMjY5IC8qIFRleHRJbnB1dFR5cGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
OTMzMDlFMUIwOTlFNjQ5MjAwNTZFNTgxIC8qIFRleHRJdGVyYXRvci5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQk5M0YxOUE5RDA4MjQ1RTU5MDAxRTlBQkMgLyogVGV4dFJlc291cmNlRGVjb2Rlci5j
cHAgaW4gU291cmNlcyAqLywKKwkJCQkwODYxQTE5RDEzNjJBQUNBMDAyRTQyMzUgLyogVGV4dFJ1
bkZhY3RvcnkuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQjJDM0RBNEEwRDAwNkMxRDAwRUY2RjI2
IC8qIFRleHRTdHJlYW0uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNDk4NzcwRjAxMjQyQzUzNTAw
MjIyNkJBIC8qIFRleHR1cmUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTdCQzg0QTQxMjM3MERD
ODAwMEM2MTYxIC8qIFRleHRWaWV3U291cmNlUGFyc2VyLmNwcCBpbiBTb3VyY2VzICovLApJbmRl
eDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCShyZXZpc2lvbiA4NTgz
NSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5j
bHVkZSAiUGFpbnRJbmZvLmgiCiAjaW5jbHVkZSAiUm9vdElubGluZUJveC5oIgotI2luY2x1ZGUg
IlRleHRSdW4uaCIKKyNpbmNsdWRlICJUZXh0UnVuRmFjdG9yeS5oIgogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKQEAgLTUyLDkgKzUyLDggQEAgdm9pZCBFbGxpcHNpc0JveDo6cGFpbnQoUGFpbnRJ
bmZvJiBwYWludAogICAgICAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKGZvcmVncm91bmQs
IHN0eWxlLT5jb2xvclNwYWNlKCkpOwogICAgIH0KIAotICAgIGNvbnN0IFN0cmluZyYgc3RyID0g
bV9zdHI7Ci0gICAgLy8gRklYTUU6IFdoeSBpcyB0aGlzIGFsd2FzeSBMVFI/Ci0gICAgY29udGV4
dC0+ZHJhd1RleHQoc3R5bGUtPmZvbnQoKSwgVGV4dFJ1bihzdHIuY2hhcmFjdGVycygpLCBzdHIu
bGVuZ3RoKCksIGZhbHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uLCBM
VFIsIHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSksIEludFBvaW50KG1feCArIHR4LCBtX3kgKyB0
eSArIHN0eWxlLT5mb250TWV0cmljcygpLmFzY2VudCgpKSk7CisgICAgLy8gRklYTUU6IFdoeSBp
cyB0aGlzIGFsd2F5cyBMVFI/CisgICAgY29udGV4dC0+ZHJhd1RleHQoc3R5bGUtPmZvbnQoKSwg
Y3JlYXRlVGV4dFJ1bkFsbG93aW5nVHJhaWxpbmdFeHBhbnNpb24obV9zdHIsIHN0eWxlKSwgSW50
UG9pbnQobV94ICsgdHgsIG1feSArIHR5ICsgc3R5bGUtPmZvbnRNZXRyaWNzKCkuYXNjZW50KCkp
KTsKIAogICAgIC8vIFJlc3RvcmUgdGhlIHJlZ3VsYXIgZmlsbCBjb2xvci4KICAgICBpZiAodGV4
dENvbG9yICE9IGNvbnRleHQtPmZpbGxDb2xvcigpKQpAQCAtNzYsOCArNzUsNyBAQCBJbnRSZWN0
IEVsbGlwc2lzQm94OjpzZWxlY3Rpb25SZWN0KGludCB0CiAgICAgUmVuZGVyU3R5bGUqIHN0eWxl
ID0gbV9yZW5kZXJlci0+c3R5bGUobV9maXJzdExpbmUpOwogICAgIGNvbnN0IEZvbnQmIGYgPSBz
dHlsZS0+Zm9udCgpOwogICAgIC8vIEZJWE1FOiBXaHkgaXMgdGhpcyBhbHdheXMgTFRSPwotICAg
IHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KGYuc2VsZWN0aW9uUmVjdEZvclRleHQoVGV4dFJ1biht
X3N0ci5jaGFyYWN0ZXJzKCksIG1fc3RyLmxlbmd0aCgpLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6
QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgTFRSLCBzdHlsZS0+dmlzdWFsbHlPcmRlcmVkKCkpLAot
ICAgICAgICAgICAgSW50UG9pbnQobV94ICsgdHgsIG1feSArIHR5ICsgcm9vdCgpLT5zZWxlY3Rp
b25Ub3AoKSksIHJvb3QoKS0+c2VsZWN0aW9uSGVpZ2h0KCkpKTsKKyAgICByZXR1cm4gZW5jbG9z
aW5nSW50UmVjdChmLnNlbGVjdGlvblJlY3RGb3JUZXh0KGNyZWF0ZVRleHRSdW5BbGxvd2luZ1Ry
YWlsaW5nRXhwYW5zaW9uKG1fc3RyLCBzdHlsZSksIEludFBvaW50KG1feCArIHR4LCBtX3kgKyB0
eSArIHJvb3QoKS0+c2VsZWN0aW9uVG9wKCkpLCByb290KCktPnNlbGVjdGlvbkhlaWdodCgpKSk7
CiB9CiAKIHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgaW50IHR4LCBpbnQgdHksIFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgRm9udCYg
Zm9udCkKQEAgLTk3LDggKzk1LDcgQEAgdm9pZCBFbGxpcHNpc0JveDo6cGFpbnRTZWxlY3Rpb24o
R3JhcGhpYwogICAgIGludCBoID0gcm9vdCgpLT5zZWxlY3Rpb25IZWlnaHQoKTsKICAgICBjb250
ZXh0LT5jbGlwKEludFJlY3QobV94ICsgdHgsIHkgKyB0eSwgbV9sb2dpY2FsV2lkdGgsIGgpKTsK
ICAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgYWx3YXlzIExUUj8KLSAgICBjb250ZXh0LT5kcmF3
SGlnaGxpZ2h0Rm9yVGV4dChmb250LCBUZXh0UnVuKG1fc3RyLmNoYXJhY3RlcnMoKSwgbV9zdHIu
bGVuZ3RoKCksIGZhbHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uLCBM
VFIsIHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSksCi0gICAgICAgIEludFBvaW50KG1feCArIHR4
LCBtX3kgKyB0eSArIHkpLCBoLCBjLCBzdHlsZS0+Y29sb3JTcGFjZSgpKTsKKyAgICBjb250ZXh0
LT5kcmF3SGlnaGxpZ2h0Rm9yVGV4dChmb250LCBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGlu
Z0V4cGFuc2lvbihtX3N0ciwgc3R5bGUpLCBJbnRQb2ludChtX3ggKyB0eCwgbV95ICsgdHkgKyB5
KSwgaCwgYywgc3R5bGUtPmNvbG9yU3BhY2UoKSk7CiB9CiAKIGJvb2wgRWxsaXBzaXNCb3g6Om5v
ZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiBy
ZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIGludCBsaW5lVG9wLCBpbnQgbGlu
ZUJvdHRvbSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVCb3guaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lQm94LmgJKHJldmlzaW9u
IDg1ODM1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZUJveC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0zMTgsNiArMzE4LDcgQEAgcHVibGljOgogICAgIHZvaWQgZmxpcEZvcldyaXRp
bmdNb2RlKEludFJlY3QmKTsKICAgICBJbnRQb2ludCBmbGlwRm9yV3JpdGluZ01vZGUoY29uc3Qg
SW50UG9pbnQmKTsKIAorICAgIGJvb2wgZGlyT3ZlcnJpZGUoKSBjb25zdCB7IHJldHVybiBtX2Rp
ck92ZXJyaWRlOyB9CiAgICAgYm9vbCBrbm93blRvSGF2ZU5vT3ZlcmZsb3coKSBjb25zdCB7IHJl
dHVybiBtX2tub3duVG9IYXZlTm9PdmVyZmxvdzsgfQogICAgIHZvaWQgY2xlYXJLbm93blRvSGF2
ZU5vT3ZlcmZsb3coKTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRl
eHRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVU
ZXh0Qm94LmNwcAkocmV2aXNpb24gODU4MzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
SW5saW5lVGV4dEJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNs
dWRlICJSZW5kZXJSdWJ5VGV4dC5oIgogI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCiAjaW5jbHVk
ZSAiVGV4dC5oIgorI2luY2x1ZGUgIlRleHRSdW5GYWN0b3J5LmgiCiAjaW5jbHVkZSAiYnJlYWtf
bGluZXMuaCIKICNpbmNsdWRlIDx3dGYvQWx3YXlzSW5saW5lLmg+CiAKQEAgLTE1OSwxOCArMTYw
LDYgQEAgUmVuZGVyT2JqZWN0OjpTZWxlY3Rpb25TdGF0ZSBJbmxpbmVUZXh0QgogICAgIHJldHVy
biBzdGF0ZTsKIH0KIAotdHlwZWRlZiBWZWN0b3I8VUNoYXIsIDI1Nj4gQnVmZmVyRm9yQXBwZW5k
aW5nSHlwaGVuOwotCi1zdGF0aWMgdm9pZCBhZGp1c3RDaGFyYWN0ZXJzQW5kTGVuZ3RoRm9ySHlw
aGVuKEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiYgY2hhcmFjdGVyc1dpdGhIeXBoZW4sIFJlbmRl
clN0eWxlKiBzdHlsZSwgY29uc3QgVUNoYXIqJiBjaGFyYWN0ZXJzLCBpbnQmIGxlbmd0aCkKLXsK
LSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGh5cGhlblN0cmluZyA9IHN0eWxlLT5oeXBoZW5TdHJp
bmcoKTsKLSAgICBjaGFyYWN0ZXJzV2l0aEh5cGhlbi5yZXNlcnZlQ2FwYWNpdHkobGVuZ3RoICsg
aHlwaGVuU3RyaW5nLmxlbmd0aCgpKTsKLSAgICBjaGFyYWN0ZXJzV2l0aEh5cGhlbi5hcHBlbmQo
Y2hhcmFjdGVycywgbGVuZ3RoKTsKLSAgICBjaGFyYWN0ZXJzV2l0aEh5cGhlbi5hcHBlbmQoaHlw
aGVuU3RyaW5nLmNoYXJhY3RlcnMoKSwgaHlwaGVuU3RyaW5nLmxlbmd0aCgpKTsKLSAgICBjaGFy
YWN0ZXJzID0gY2hhcmFjdGVyc1dpdGhIeXBoZW4uZGF0YSgpOwotICAgIGxlbmd0aCArPSBoeXBo
ZW5TdHJpbmcubGVuZ3RoKCk7Ci19Ci0KIEludFJlY3QgSW5saW5lVGV4dEJveDo6c2VsZWN0aW9u
UmVjdChpbnQgdHgsIGludCB0eSwgaW50IHN0YXJ0UG9zLCBpbnQgZW5kUG9zKQogewogICAgIGlu
dCBzUG9zID0gbWF4KHN0YXJ0UG9zIC0gbV9zdGFydCwgMCk7CkBAIC0xODUsMTYgKzE3NCwxMyBA
QCBJbnRSZWN0IElubGluZVRleHRCb3g6OnNlbGVjdGlvblJlY3QoaW50CiAgICAgUmVuZGVyU3R5
bGUqIHN0eWxlVG9Vc2UgPSB0ZXh0T2JqLT5zdHlsZShtX2ZpcnN0TGluZSk7CiAgICAgY29uc3Qg
Rm9udCYgZiA9IHN0eWxlVG9Vc2UtPmZvbnQoKTsKIAotICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0
ZXJzID0gdGV4dE9iai0+dGV4dCgpLT5jaGFyYWN0ZXJzKCkgKyBtX3N0YXJ0OwotICAgIGludCBs
ZW4gPSBtX2xlbjsKICAgICBCdWZmZXJGb3JBcHBlbmRpbmdIeXBoZW4gY2hhcmFjdGVyc1dpdGhI
eXBoZW47Ci0gICAgaWYgKGVQb3MgPT0gbGVuICYmIGhhc0h5cGhlbigpKSB7Ci0gICAgICAgIGFk
anVzdENoYXJhY3RlcnNBbmRMZW5ndGhGb3JIeXBoZW4oY2hhcmFjdGVyc1dpdGhIeXBoZW4sIHN0
eWxlVG9Vc2UsIGNoYXJhY3RlcnMsIGxlbik7Ci0gICAgICAgIGVQb3MgPSBsZW47Ci0gICAgfQor
ICAgIGJvb2wgcmVzcGVjdEh5cGhlbiA9IGVQb3MgPT0gbV9sZW4gJiYgaGFzSHlwaGVuKCk7Cisg
ICAgVGV4dFJ1biB0ZXh0UnVuID0gY3JlYXRlVGV4dFJ1bkZvcklubGluZVRleHRCb3godGhpcywg
c3R5bGVUb1VzZSwgcmVzcGVjdEh5cGhlbiA/ICZjaGFyYWN0ZXJzV2l0aEh5cGhlbiA6IDApOwor
ICAgIGlmIChyZXNwZWN0SHlwaGVuKQorICAgICAgICBlbmRQb3MgPSB0ZXh0UnVuLmxlbmd0aCgp
OwogCi0gICAgSW50UmVjdCByID0gZW5jbG9zaW5nSW50UmVjdChmLnNlbGVjdGlvblJlY3RGb3JU
ZXh0KFRleHRSdW4oY2hhcmFjdGVycywgbGVuLCB0ZXh0T2JqLT5hbGxvd1RhYnMoKSwgdGV4dFBv
cygpLCBtX2V4cGFuc2lvbiwgZXhwYW5zaW9uQmVoYXZpb3IoKSwgZGlyZWN0aW9uKCksIG1fZGly
T3ZlcnJpZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBGbG9hdFBvaW50KGxvZ2ljYWxMZWZ0KCksIHNlbFRvcCksIHNlbEhlaWdodCwg
c1BvcywgZVBvcykpOworICAgIEludFJlY3QgciA9IGVuY2xvc2luZ0ludFJlY3QoZi5zZWxlY3Rp
b25SZWN0Rm9yVGV4dCh0ZXh0UnVuLCBGbG9hdFBvaW50KGxvZ2ljYWxMZWZ0KCksIHNlbFRvcCks
IHNlbEhlaWdodCwgc1BvcywgZVBvcykpOwogCiAgICAgaW50IGxvZ2ljYWxXaWR0aCA9IHIud2lk
dGgoKTsKICAgICBpZiAoci54KCkgPiBsb2dpY2FsUmlnaHQoKSkKQEAgLTY0NywxMCArNjMzLDkg
QEAgdm9pZCBJbmxpbmVUZXh0Qm94OjpwYWludChQYWludEluZm8mIHBhaQogICAgICAgICBjb21i
aW5lZFRleHQtPmNoYXJhY3RlcnNUb1JlbmRlcihtX3N0YXJ0LCBjaGFyYWN0ZXJzLCBsZW5ndGgp
OwogCiAgICAgQnVmZmVyRm9yQXBwZW5kaW5nSHlwaGVuIGNoYXJhY3RlcnNXaXRoSHlwaGVuOwor
ICAgIFRleHRSdW4gdGV4dFJ1biA9IGNyZWF0ZVRleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KHRoaXMs
IHN0eWxlVG9Vc2UsIGNoYXJhY3RlcnMsIGxlbmd0aCwgaGFzSHlwaGVuKCkgPyAmY2hhcmFjdGVy
c1dpdGhIeXBoZW4gOiAwKTsKICAgICBpZiAoaGFzSHlwaGVuKCkpCi0gICAgICAgIGFkanVzdENo
YXJhY3RlcnNBbmRMZW5ndGhGb3JIeXBoZW4oY2hhcmFjdGVyc1dpdGhIeXBoZW4sIHN0eWxlVG9V
c2UsIGNoYXJhY3RlcnMsIGxlbmd0aCk7Ci0KLSAgICBUZXh0UnVuIHRleHRSdW4oY2hhcmFjdGVy
cywgbGVuZ3RoLCB0ZXh0UmVuZGVyZXIoKS0+YWxsb3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBh
bnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCksIGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8
IHN0eWxlVG9Vc2UtPnZpc3VhbGx5T3JkZXJlZCgpKTsKKyAgICAgICAgbGVuZ3RoID0gdGV4dFJ1
bi5sZW5ndGgoKTsKIAogICAgIGludCBzUG9zID0gMDsKICAgICBpbnQgZVBvcyA9IDA7CkBAIC04
MTIsMTAgKzc5NywxMCBAQCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBo
CiAgICAgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMgPSB0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpLT5j
aGFyYWN0ZXJzKCkgKyBtX3N0YXJ0OwogCiAgICAgQnVmZmVyRm9yQXBwZW5kaW5nSHlwaGVuIGNo
YXJhY3RlcnNXaXRoSHlwaGVuOwotICAgIGlmIChlUG9zID09IGxlbmd0aCAmJiBoYXNIeXBoZW4o
KSkgewotICAgICAgICBhZGp1c3RDaGFyYWN0ZXJzQW5kTGVuZ3RoRm9ySHlwaGVuKGNoYXJhY3Rl
cnNXaXRoSHlwaGVuLCBzdHlsZSwgY2hhcmFjdGVycywgbGVuZ3RoKTsKLSAgICAgICAgZVBvcyA9
IGxlbmd0aDsKLSAgICB9CisgICAgYm9vbCByZXNwZWN0SHlwaGVuID0gZVBvcyA9PSBsZW5ndGgg
JiYgaGFzSHlwaGVuKCk7CisgICAgVGV4dFJ1biB0ZXh0UnVuID0gY3JlYXRlVGV4dFJ1bkZvcklu
bGluZVRleHRCb3godGhpcywgc3R5bGUsIGNoYXJhY3RlcnMsIGxlbmd0aCwgcmVzcGVjdEh5cGhl
biA/ICZjaGFyYWN0ZXJzV2l0aEh5cGhlbiA6IDApOworICAgIGlmIChyZXNwZWN0SHlwaGVuKQor
ICAgICAgICBlUG9zID0gdGV4dFJ1bi5sZW5ndGgoKTsKIAogICAgIGludCBkZWx0YVkgPSByZW5k
ZXJlcigpLT5zdHlsZSgpLT5pc0ZsaXBwZWRMaW5lc1dyaXRpbmdNb2RlKCkgPyBzZWxlY3Rpb25C
b3R0b20oKSAtIGxvZ2ljYWxCb3R0b20oKSA6IGxvZ2ljYWxUb3AoKSAtIHNlbGVjdGlvblRvcCgp
OwogICAgIGludCBzZWxIZWlnaHQgPSBzZWxlY3Rpb25IZWlnaHQoKTsKQEAgLTgyNyw5ICs4MTIs
NyBAQCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBoCiAgICAgY2xpcFJl
Y3Quc2V0V2lkdGgobWF4WCAtIGNsaXBSZWN0LngoKSk7CiAgICAgY29udGV4dC0+Y2xpcChjbGlw
UmVjdCk7CiAKLSAgICBjb250ZXh0LT5kcmF3SGlnaGxpZ2h0Rm9yVGV4dChmb250LCBUZXh0UnVu
KGNoYXJhY3RlcnMsIGxlbmd0aCwgdGV4dFJlbmRlcmVyKCktPmFsbG93VGFicygpLCB0ZXh0UG9z
KCksIG1fZXhwYW5zaW9uLCBleHBhbnNpb25CZWhhdmlvcigpLCAKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkaXJlY3Rpb24oKSwgbV9kaXJPdmVycmlkZSB8fCBzdHlsZS0+dmlz
dWFsbHlPcmRlcmVkKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2Fs
T3JpZ2luLCBzZWxIZWlnaHQsIGMsIHN0eWxlLT5jb2xvclNwYWNlKCksIHNQb3MsIGVQb3MpOwor
ICAgIGNvbnRleHQtPmRyYXdIaWdobGlnaHRGb3JUZXh0KGZvbnQsIHRleHRSdW4sIGxvY2FsT3Jp
Z2luLCBzZWxIZWlnaHQsIGMsIHN0eWxlLT5jb2xvclNwYWNlKCksIHNQb3MsIGVQb3MpOwogfQog
CiB2b2lkIElubGluZVRleHRCb3g6OnBhaW50Q29tcG9zaXRpb25CYWNrZ3JvdW5kKEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgRmxvYXRQb2ludCYgYm94T3JpZ2luLCBSZW5kZXJTdHls
ZSogc3R5bGUsIGNvbnN0IEZvbnQmIGZvbnQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcykKQEAg
LTg1MCw5ICs4MzMsNyBAQCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50Q29tcG9zaXRpb25CYWNr
CiAgICAgaW50IGRlbHRhWSA9IHJlbmRlcmVyKCktPnN0eWxlKCktPmlzRmxpcHBlZExpbmVzV3Jp
dGluZ01vZGUoKSA/IHNlbGVjdGlvbkJvdHRvbSgpIC0gbG9naWNhbEJvdHRvbSgpIDogbG9naWNh
bFRvcCgpIC0gc2VsZWN0aW9uVG9wKCk7CiAgICAgaW50IHNlbEhlaWdodCA9IHNlbGVjdGlvbkhl
aWdodCgpOwogICAgIEZsb2F0UG9pbnQgbG9jYWxPcmlnaW4oYm94T3JpZ2luLngoKSwgYm94T3Jp
Z2luLnkoKSAtIGRlbHRhWSk7Ci0gICAgY29udGV4dC0+ZHJhd0hpZ2hsaWdodEZvclRleHQoZm9u
dCwgVGV4dFJ1bih0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpLT5jaGFyYWN0ZXJzKCkgKyBtX3N0YXJ0
LCBtX2xlbiwgdGV4dFJlbmRlcmVyKCktPmFsbG93VGFicygpLCB0ZXh0UG9zKCksIG1fZXhwYW5z
aW9uLCBleHBhbnNpb25CZWhhdmlvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQo
KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxPcmlnaW4sIHNlbEhl
aWdodCwgYywgc3R5bGUtPmNvbG9yU3BhY2UoKSwgc1BvcywgZVBvcyk7CisgICAgY29udGV4dC0+
ZHJhd0hpZ2hsaWdodEZvclRleHQoZm9udCwgY3JlYXRlVGV4dFJ1bkZvcklubGluZVRleHRCb3go
dGhpcywgc3R5bGUpLCBsb2NhbE9yaWdpbiwgc2VsSGVpZ2h0LCBjLCBzdHlsZS0+Y29sb3JTcGFj
ZSgpLCBzUG9zLCBlUG9zKTsKIH0KIAogI2lmIFBMQVRGT1JNKE1BQykKQEAgLTEwMTAsOCArOTkx
LDggQEAgdm9pZCBJbmxpbmVUZXh0Qm94OjpwYWludFNwZWxsaW5nT3JHcmFtbQogICAgICAgICBp
bnQgZGVsdGFZID0gcmVuZGVyZXIoKS0+c3R5bGUoKS0+aXNGbGlwcGVkTGluZXNXcml0aW5nTW9k
ZSgpID8gc2VsZWN0aW9uQm90dG9tKCkgLSBsb2dpY2FsQm90dG9tKCkgOiBsb2dpY2FsVG9wKCkg
LSBzZWxlY3Rpb25Ub3AoKTsKICAgICAgICAgaW50IHNlbEhlaWdodCA9IHNlbGVjdGlvbkhlaWdo
dCgpOwogICAgICAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoYm94T3JpZ2luLngoKSwgYm94T3Jp
Z2luLnkoKSAtIGRlbHRhWSk7Ci0gICAgICAgIFRleHRSdW4gcnVuKHRleHRSZW5kZXJlcigpLT50
ZXh0KCktPmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLCB0ZXh0UmVuZGVyZXIoKS0+YWxs
b3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCksIGRp
cmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSk7Ci0g
ICAgICAgIAorICAgICAgICBUZXh0UnVuIHJ1biA9IGNyZWF0ZVRleHRSdW5Gb3JJbmxpbmVUZXh0
Qm94KHRoaXMsIHN0eWxlKTsKKwogICAgICAgICAvLyBGSVhNRTogQ29udmVydCB0aGUgZG9jdW1l
bnQgbWFya2VycyB0byBmbG9hdCByZWN0cy4KICAgICAgICAgSW50UmVjdCBtYXJrZXJSZWN0ID0g
ZW5jbG9zaW5nSW50UmVjdChmb250LnNlbGVjdGlvblJlY3RGb3JUZXh0KHJ1biwgc3RhcnRQb2lu
dCwgc2VsSGVpZ2h0LCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbikpOwogICAgICAgICBzdGFy
dCA9IG1hcmtlclJlY3QueCgpIC0gc3RhcnRQb2ludC54KCk7CkBAIC0xMDU1LDggKzEwMzYsOCBA
QCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50VGV4dE1hdGNoTWFya2VyCiAKICAgICBpbnQgc1Bv
cyA9IG1heChtYXJrZXIuc3RhcnRPZmZzZXQgLSBtX3N0YXJ0LCAodW5zaWduZWQpMCk7CiAgICAg
aW50IGVQb3MgPSBtaW4obWFya2VyLmVuZE9mZnNldCAtIG1fc3RhcnQsICh1bnNpZ25lZCltX2xl
bik7ICAgIAotICAgIFRleHRSdW4gcnVuKHRleHRSZW5kZXJlcigpLT50ZXh0KCktPmNoYXJhY3Rl
cnMoKSArIG1fc3RhcnQsIG1fbGVuLCB0ZXh0UmVuZGVyZXIoKS0+YWxsb3dUYWJzKCksIHRleHRQ
b3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCksIGRpcmVjdGlvbigpLCBtX2Rp
ck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSk7Ci0gICAgCisgICAgVGV4dFJ1
biBydW4gPSBjcmVhdGVUZXh0UnVuRm9ySW5saW5lVGV4dEJveCh0aGlzLCBzdHlsZSk7CisKICAg
ICAvLyBBbHdheXMgY29tcHV0ZSBhbmQgc3RvcmUgdGhlIHJlY3QgYXNzb2NpYXRlZCB3aXRoIHRo
aXMgbWFya2VyLiBUaGUgY29tcHV0ZWQgcmVjdCBpcyBpbiBhYnNvbHV0ZSBjb29yZGluYXRlcy4K
ICAgICBJbnRSZWN0IG1hcmtlclJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGZvbnQuc2VsZWN0aW9u
UmVjdEZvclRleHQocnVuLCBJbnRQb2ludChtX3gsIHNlbGVjdGlvblRvcCgpKSwgc2VsSGVpZ2h0
LCBzUG9zLCBlUG9zKSk7CiAgICAgbWFya2VyUmVjdCA9IHJlbmRlcmVyKCktPmxvY2FsVG9BYnNv
bHV0ZVF1YWQoRmxvYXRSZWN0KG1hcmtlclJlY3QpKS5lbmNsb3NpbmdCb3VuZGluZ0JveCgpOwpA
QCAtMTA4Miw3ICsxMDYzLDcgQEAgdm9pZCBJbmxpbmVUZXh0Qm94Ojpjb21wdXRlUmVjdEZvclJl
cGxhYwogICAgIAogICAgIGludCBzUG9zID0gbWF4KG1hcmtlci5zdGFydE9mZnNldCAtIG1fc3Rh
cnQsICh1bnNpZ25lZCkwKTsKICAgICBpbnQgZVBvcyA9IG1pbihtYXJrZXIuZW5kT2Zmc2V0IC0g
bV9zdGFydCwgKHVuc2lnbmVkKW1fbGVuKTsgICAgCi0gICAgVGV4dFJ1biBydW4odGV4dFJlbmRl
cmVyKCktPnRleHQoKS0+Y2hhcmFjdGVycygpICsgbV9zdGFydCwgbV9sZW4sIHRleHRSZW5kZXJl
cigpLT5hbGxvd1RhYnMoKSwgdGV4dFBvcygpLCBtX2V4cGFuc2lvbiwgZXhwYW5zaW9uQmVoYXZp
b3IoKSwgZGlyZWN0aW9uKCksIG1fZGlyT3ZlcnJpZGUgfHwgc3R5bGUtPnZpc3VhbGx5T3JkZXJl
ZCgpKTsKKyAgICBUZXh0UnVuIHJ1biA9IGNyZWF0ZVRleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KHRo
aXMsIHN0eWxlKTsKICAgICBJbnRQb2ludCBzdGFydFBvaW50ID0gSW50UG9pbnQobV94LCB5KTsK
ICAgICAKICAgICAvLyBDb21wdXRlIGFuZCBzdG9yZSB0aGUgcmVjdCBhc3NvY2lhdGVkIHdpdGgg
dGhpcyBtYXJrZXIuCkBAIC0xMjQyLDkgKzEyMjMsNyBAQCBpbnQgSW5saW5lVGV4dEJveDo6b2Zm
c2V0Rm9yUG9zaXRpb24oZmxvCiAgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVyVGV4dChy
ZW5kZXJlcigpKTsKICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0LT5zdHlsZShtX2ZpcnN0
TGluZSk7CiAgICAgY29uc3QgRm9udCogZiA9ICZzdHlsZS0+Zm9udCgpOwotICAgIGludCBvZmZz
ZXQgPSBmLT5vZmZzZXRGb3JQb3NpdGlvbihUZXh0UnVuKHRleHRSZW5kZXJlcigpLT50ZXh0KCkt
PmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLAotICAgICAgICB0ZXh0UmVuZGVyZXIoKS0+
YWxsb3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCks
IGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSks
Ci0gICAgICAgIGxpbmVPZmZzZXQgLSBsb2dpY2FsTGVmdCgpLCBpbmNsdWRlUGFydGlhbEdseXBo
cyk7CisgICAgaW50IG9mZnNldCA9IGYtPm9mZnNldEZvclBvc2l0aW9uKGNyZWF0ZVRleHRSdW5G
b3JJbmxpbmVUZXh0Qm94KHRoaXMsIHN0eWxlKSwgbGluZU9mZnNldCAtIGxvZ2ljYWxMZWZ0KCks
IGluY2x1ZGVQYXJ0aWFsR2x5cGhzKTsKICAgICBpZiAoYmxvY2tJc0luT3Bwb3NpdGVEaXJlY3Rp
b24gJiYgKCFvZmZzZXQgfHwgb2Zmc2V0ID09IG1fbGVuKSkKICAgICAgICAgcmV0dXJuICFvZmZz
ZXQgPyBtX2xlbiA6IDA7CiAgICAgcmV0dXJuIG9mZnNldDsKQEAgLTEyNTksMTIgKzEyMzgsMTIg
QEAgZmxvYXQgSW5saW5lVGV4dEJveDo6cG9zaXRpb25Gb3JPZmZzZXQoaQogICAgICAgICByZXR1
cm4gbG9naWNhbExlZnQoKTsKIAogICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQo
cmVuZGVyZXIoKSk7Ci0gICAgY29uc3QgRm9udCYgZiA9IHRleHQtPnN0eWxlKG1fZmlyc3RMaW5l
KS0+Zm9udCgpOworICAgIFJlbmRlclN0eWxlKiBzdHlsZVRvVXNlID0gdGV4dC0+c3R5bGUobV9m
aXJzdExpbmUpOworICAgIGNvbnN0IEZvbnQmIGYgPSBzdHlsZVRvVXNlLT5mb250KCk7CiAgICAg
aW50IGZyb20gPSAhaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gb2Zmc2V0IC0gbV9zdGFydCA6
IDA7CiAgICAgaW50IHRvID0gIWlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG1fbGVuIDogb2Zm
c2V0IC0gbV9zdGFydDsKICAgICAvLyBGSVhNRTogRG8gd2UgbmVlZCB0byBhZGQgcmlnaHRCZWFy
aW5nIGhlcmU/Ci0gICAgcmV0dXJuIGYuc2VsZWN0aW9uUmVjdEZvclRleHQoVGV4dFJ1bih0ZXh0
LT50ZXh0KCktPmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLCB0ZXh0UmVuZGVyZXIoKS0+
YWxsb3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCks
IGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBJbnRQb2ludChsb2dpY2FsTGVmdCgpLCAwKSwgMCwgZnJvbSwgdG8pLm1heFgoKTsK
KyAgICByZXR1cm4gZi5zZWxlY3Rpb25SZWN0Rm9yVGV4dChjcmVhdGVUZXh0UnVuRm9ySW5saW5l
VGV4dEJveCh0aGlzLCBzdHlsZVRvVXNlKSwgSW50UG9pbnQobG9naWNhbExlZnQoKSwgMCksIDAs
IGZyb20sIHRvKS5tYXhYKCk7CiB9CiAKIGJvb2wgSW5saW5lVGV4dEJveDo6Y29udGFpbnNDYXJl
dE9mZnNldChpbnQgb2Zmc2V0KSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L0lubGluZVRleHRCb3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
SW5saW5lVGV4dEJveC5oCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9JbmxpbmVUZXh0Qm94LmgJKHdvcmtpbmcgY29weSkKQEAgLTEzOSw4ICsxMzksNiBAQCBw
dWJsaWM6CiBwcml2YXRlOgogICAgIHZpcnR1YWwgdW5zaWduZWQgY2FyZXRNYXhSZW5kZXJlZE9m
ZnNldCgpIGNvbnN0OwogCi0gICAgZmxvYXQgdGV4dFBvcygpIGNvbnN0OyAvLyByZXR1cm5zIHRo
ZSB4IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBsZWZ0IHN0YXJ0IG9mIHRoZSB0ZXh0IGxpbmUu
Ci0KIHB1YmxpYzoKICAgICB2aXJ0dWFsIGludCBvZmZzZXRGb3JQb3NpdGlvbihmbG9hdCB4LCBi
b29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzID0gdHJ1ZSkgY29uc3Q7CiAgICAgdmlydHVhbCBmbG9h
dCBwb3NpdGlvbkZvck9mZnNldChpbnQgb2Zmc2V0KSBjb25zdDsKQEAgLTE1MCw2ICsxNDgsMTMg
QEAgcHVibGljOgogICAgIC8vIE5lZWRzIHRvIGJlIHB1YmxpYywgc28gdGhlIHN0YXRpYyBwYWlu
dFRleHRXaXRoU2hhZG93cygpIGZ1bmN0aW9uIGNhbiB1c2UgaXQuCiAgICAgc3RhdGljIEZsb2F0
U2l6ZSBhcHBseVNoYWRvd1RvR3JhcGhpY3NDb250ZXh0KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0
IFNoYWRvd0RhdGEqLCBjb25zdCBGbG9hdFJlY3QmIHRleHRSZWN0LCBib29sIHN0cm9rZWQsIGJv
b2wgb3BhcXVlLCBib29sIGhvcml6b250YWwpOwogCisgICAgdmlydHVhbCBmbG9hdCB0ZXh0UG9z
KCkgY29uc3Q7IC8vIHJldHVybnMgdGhlIHggcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGxlZnQg
c3RhcnQgb2YgdGhlIHRleHQgbGluZS4KKyAgICBUZXh0UnVuOjpFeHBhbnNpb25CZWhhdmlvciBl
eHBhbnNpb25CZWhhdmlvcigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKGNhbkhhdmVM
ZWFkaW5nRXhwYW5zaW9uKCkgPyBUZXh0UnVuOjpBbGxvd0xlYWRpbmdFeHBhbnNpb24gOiBUZXh0
UnVuOjpGb3JiaWRMZWFkaW5nRXhwYW5zaW9uKQorICAgICAgICAgICAgfCAobV9leHBhbnNpb24g
JiYgbmV4dExlYWZDaGlsZCgpID8gVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiA6IFRl
eHRSdW46OkZvcmJpZFRyYWlsaW5nRXhwYW5zaW9uKTsKKyAgICB9CisKIHByaXZhdGU6CiAgICAg
SW5saW5lVGV4dEJveCogbV9wcmV2VGV4dEJveDsgLy8gVGhlIHByZXZpb3VzIGJveCB0aGF0IGFs
c28gdXNlcyBvdXIgUmVuZGVyT2JqZWN0CiAgICAgSW5saW5lVGV4dEJveCogbV9uZXh0VGV4dEJv
eDsgLy8gVGhlIG5leHQgYm94IHRoYXQgYWxzbyB1c2VzIG91ciBSZW5kZXJPYmplY3QKQEAgLTE3
NCwxMiArMTc5LDYgQEAgcHJpdmF0ZToKICAgICB2b2lkIHBhaW50U3BlbGxpbmdPckdyYW1tYXJN
YXJrZXIoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRQb2ludCYgYm94T3JpZ2luLCBjb25z
dCBEb2N1bWVudE1hcmtlciYsIFJlbmRlclN0eWxlKiwgY29uc3QgRm9udCYsIGJvb2wgZ3JhbW1h
cik7CiAgICAgdm9pZCBwYWludFRleHRNYXRjaE1hcmtlcihHcmFwaGljc0NvbnRleHQqLCBjb25z
dCBGbG9hdFBvaW50JiBib3hPcmlnaW4sIGNvbnN0IERvY3VtZW50TWFya2VyJiwgUmVuZGVyU3R5
bGUqLCBjb25zdCBGb250Jik7CiAgICAgdm9pZCBjb21wdXRlUmVjdEZvclJlcGxhY2VtZW50TWFy
a2VyKGNvbnN0IERvY3VtZW50TWFya2VyJiwgUmVuZGVyU3R5bGUqLCBjb25zdCBGb250Jik7Ci0K
LSAgICBUZXh0UnVuOjpFeHBhbnNpb25CZWhhdmlvciBleHBhbnNpb25CZWhhdmlvcigpIGNvbnN0
Ci0gICAgewotICAgICAgICByZXR1cm4gKGNhbkhhdmVMZWFkaW5nRXhwYW5zaW9uKCkgPyBUZXh0
UnVuOjpBbGxvd0xlYWRpbmdFeHBhbnNpb24gOiBUZXh0UnVuOjpGb3JiaWRMZWFkaW5nRXhwYW5z
aW9uKQotICAgICAgICAgICAgfCAobV9leHBhbnNpb24gJiYgbmV4dExlYWZDaGlsZCgpID8gVGV4
dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiA6IFRleHRSdW46OkZvcmJpZFRyYWlsaW5nRXhw
YW5zaW9uKTsKLSAgICB9CiB9OwogCiBpbmxpbmUgUmVuZGVyVGV4dCogSW5saW5lVGV4dEJveDo6
dGV4dFJlbmRlcmVyKCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5k
ZXJFbWJlZGRlZE9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckVtYmVkZGVkT2JqZWN0LmNwcAkocmV2aXNpb24gODU4MzUpCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRW1iZWRkZWRPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xOTcsNyArMTk3LDcgQEAgYm9vbCBSZW5kZXJFbWJlZGRlZE9iamVjdDo6Z2V0UmVwbGFj
ZW1lbgogICAgIGZvbnQgPSBGb250KGZvbnREZXNjcmlwdGlvbiwgMCwgMCk7CiAgICAgZm9udC51
cGRhdGUoMCk7CiAgICAgCi0gICAgcnVuID0gVGV4dFJ1bihtX3JlcGxhY2VtZW50VGV4dC5jaGFy
YWN0ZXJzKCksIG1fcmVwbGFjZW1lbnRUZXh0Lmxlbmd0aCgpKTsKKyAgICBydW4gPSBUZXh0UnVu
KG1fcmVwbGFjZW1lbnRUZXh0KTsKICAgICB0ZXh0V2lkdGggPSBmb250LndpZHRoKHJ1bik7CiAg
ICAgCiAgICAgcmVwbGFjZW1lbnRUZXh0UmVjdC5zZXRTaXplKEZsb2F0U2l6ZSh0ZXh0V2lkdGgg
KyByZXBsYWNlbWVudFRleHRSb3VuZGVkUmVjdExlZnRSaWdodFRleHRNYXJnaW4gKiAyLCByZXBs
YWNlbWVudFRleHRSb3VuZGVkUmVjdEhlaWdodCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckZpbGVVcGxvYWRDb250cm9sLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRmlsZVVwbG9hZENvbnRyb2wuY3BwCShyZXZpc2lvbiA4
NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJGaWxlVXBsb2FkQ29udHJv
bC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJSZW5kZXJU
ZXh0LmgiCiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKICNpbmNsdWRlICJSZW5kZXJWaWV3Lmgi
Ci0jaW5jbHVkZSAiVGV4dFJ1bi5oIgorI2luY2x1ZGUgIlRleHRSdW5GYWN0b3J5LmgiCiAjaW5j
bHVkZSA8bWF0aC5oPgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtMjIxLDEwICsyMjEsOCBA
QCB2b2lkIFJlbmRlckZpbGVVcGxvYWRDb250cm9sOjpwYWludE9iamVjCiAKICAgICBpZiAocGFp
bnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5kKSB7CiAgICAgICAgIGNvbnN0IFN0
cmluZyYgZGlzcGxheWVkRmlsZW5hbWUgPSBmaWxlVGV4dFZhbHVlKCk7Ci0gICAgICAgIHVuc2ln
bmVkIGxlbmd0aCA9IGRpc3BsYXllZEZpbGVuYW1lLmxlbmd0aCgpOwotICAgICAgICBjb25zdCBV
Q2hhciogc3RyaW5nID0gZGlzcGxheWVkRmlsZW5hbWUuY2hhcmFjdGVycygpOwotICAgICAgICBU
ZXh0UnVuIHRleHRSdW4oc3RyaW5nLCBsZW5ndGgsIGZhbHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxv
d1RyYWlsaW5nRXhwYW5zaW9uLCBzdHlsZSgpLT5kaXJlY3Rpb24oKSwgc3R5bGUoKS0+dW5pY29k
ZUJpZGkoKSA9PSBPdmVycmlkZSk7Ci0gICAgICAgIAorICAgICAgICBUZXh0UnVuIHRleHRSdW4g
PSBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGluZ0V4cGFuc2lvbihkaXNwbGF5ZWRGaWxlbmFt
ZSwgc3R5bGUoKSwgUmVzcGVjdERpcmVjdGlvbiB8IFJlc3BlY3REaXJlY3Rpb25PdmVycmlkZSk7
CisKICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXJlIHRoZSBmaWxlbmFtZSBzaG91bGQgYmUgcGxh
Y2VkCiAgICAgICAgIGludCBjb250ZW50TGVmdCA9IHR4ICsgYm9yZGVyTGVmdCgpICsgcGFkZGlu
Z0xlZnQoKTsKICAgICAgICAgaW50IGJ1dHRvbkFuZEljb25XaWR0aCA9IG1fYnV0dG9uLT5yZW5k
ZXJCb3goKS0+d2lkdGgoKSArIGFmdGVyQnV0dG9uU3BhY2luZwpAQCAtMjc2LDcgKzI3NCw3IEBA
IHZvaWQgUmVuZGVyRmlsZVVwbG9hZENvbnRyb2w6OmNvbXB1dGVQcmUKICAgICAgICAgLy8gRmln
dXJlIG91dCBob3cgYmlnIHRoZSBmaWxlbmFtZSBzcGFjZSBuZWVkcyB0byBiZSBmb3IgYSBnaXZl
biBudW1iZXIgb2YgY2hhcmFjdGVycwogICAgICAgICAvLyAodXNpbmcgIjAiIGFzIHRoZSBub21p
bmFsIGNoYXJhY3RlcikuCiAgICAgICAgIGNvbnN0IFVDaGFyIGNoID0gJzAnOwotICAgICAgICBm
bG9hdCBjaGFyV2lkdGggPSBzdHlsZSgpLT5mb250KCkud2lkdGgoVGV4dFJ1bigmY2gsIDEsIGZh
bHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uKSk7CisgICAgICAgIGZs
b2F0IGNoYXJXaWR0aCA9IHN0eWxlKCktPmZvbnQoKS53aWR0aChjcmVhdGVUZXh0UnVuQWxsb3dp
bmdUcmFpbGluZ0V4cGFuc2lvbihTdHJpbmcoJmNoLCAxKSwgc3R5bGUoKSkpOwogICAgICAgICBt
X21heFByZWZlcnJlZExvZ2ljYWxXaWR0aCA9IChpbnQpY2VpbGYoY2hhcldpZHRoICogZGVmYXVs
dFdpZHRoTnVtQ2hhcnMpOwogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckltYWdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVySW1hZ2UuY3BwCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJJbWFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwNCw3ICsxMDQsNyBAQCBi
b29sIFJlbmRlckltYWdlOjpzZXRJbWFnZVNpemVGb3JBbHRUZXh0CiAgICAgLy8gd2UgaGF2ZSBh
biBhbHQgYW5kIHRoZSB1c2VyIG1lYW50IGl0IChpdHMgbm90IGEgdGV4dCB3ZSBpbnZlbnRlZCkK
ICAgICBpZiAoIW1fYWx0VGV4dC5pc0VtcHR5KCkpIHsKICAgICAgICAgY29uc3QgRm9udCYgZm9u
dCA9IHN0eWxlKCktPmZvbnQoKTsKLSAgICAgICAgSW50U2l6ZSB0ZXh0U2l6ZShtaW4oZm9udC53
aWR0aChUZXh0UnVuKG1fYWx0VGV4dC5jaGFyYWN0ZXJzKCksIG1fYWx0VGV4dC5sZW5ndGgoKSkp
LCBtYXhBbHRUZXh0V2lkdGgpLCBtaW4oZm9udC5mb250TWV0cmljcygpLmhlaWdodCgpLCBtYXhB
bHRUZXh0SGVpZ2h0KSk7CisgICAgICAgIEludFNpemUgdGV4dFNpemUobWluKGZvbnQud2lkdGgo
VGV4dFJ1bihtX2FsdFRleHQpKSwgbWF4QWx0VGV4dFdpZHRoKSwgbWluKGZvbnQuZm9udE1ldHJp
Y3MoKS5oZWlnaHQoKSwgbWF4QWx0VGV4dEhlaWdodCkpOwogICAgICAgICBpbWFnZVNpemUgPSBp
bWFnZVNpemUuZXhwYW5kZWRUbyh0ZXh0U2l6ZSk7CiAgICAgfQogCkBAIC0yODYsNyArMjg2LDcg
QEAgdm9pZCBSZW5kZXJJbWFnZTo6cGFpbnRSZXBsYWNlZChQYWludEluZgogCiAgICAgICAgICAg
ICAgICAgLy8gT25seSBkcmF3IHRoZSBhbHQgdGV4dCBpZiBpdCdsbCBmaXQgd2l0aGluIHRoZSBj
b250ZW50IGJveCwKICAgICAgICAgICAgICAgICAvLyBhbmQgb25seSBpZiBpdCBmaXRzIGFib3Zl
IHRoZSBlcnJvciBpbWFnZS4KLSAgICAgICAgICAgICAgICBUZXh0UnVuIHRleHRSdW4odGV4dC5j
aGFyYWN0ZXJzKCksIHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIFRleHRSdW4gdGV4
dFJ1bih0ZXh0KTsKICAgICAgICAgICAgICAgICBpbnQgdGV4dFdpZHRoID0gZm9udC53aWR0aCh0
ZXh0UnVuKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3JQaWN0dXJlRHJhd24pIHsKICAgICAg
ICAgICAgICAgICAgICAgaWYgKHVzYWJsZVdpZHRoID49IHRleHRXaWR0aCAmJiBmb250TWV0cmlj
cy5oZWlnaHQoKSA8PSBpbWFnZVkpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyTGlzdEJveC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckxpc3RCb3guY3BwCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJMaXN0Qm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQsNyArNTQsNyBAQAog
I2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCiAjaW5jbHVkZSAiU2VsZWN0RWxlbWVudC5oIgog
I2luY2x1ZGUgIlNlbGVjdGlvbkNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJUZXh0UnVuLmgiCisj
aW5jbHVkZSAiVGV4dFJ1bkZhY3RvcnkuaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAKIHVzaW5nIG5h
bWVzcGFjZSBzdGQ7CkBAIC0xMTgsNyArMTE4LDcgQEAgdm9pZCBSZW5kZXJMaXN0Qm94Ojp1cGRh
dGVGcm9tRWxlbWVudCgpCiAKICAgICAgICAgICAgIGlmICghdGV4dC5pc0VtcHR5KCkpIHsKICAg
ICAgICAgICAgICAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgYWx3YXlzIExUUj8gQ2FuJ3QgdGV4
dCBkaXJlY3Rpb24gYWZmZWN0IHRoZSB3aWR0aD8KLSAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0
V2lkdGggPSBpdGVtRm9udC53aWR0aChUZXh0UnVuKHRleHQuaW1wbCgpLCBmYWxzZSwgMCwgMCwg
VGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgTFRSKSk7CisgICAgICAgICAgICAgICAg
ZmxvYXQgdGV4dFdpZHRoID0gaXRlbUZvbnQud2lkdGgoY3JlYXRlVGV4dFJ1bkFsbG93aW5nVHJh
aWxpbmdFeHBhbnNpb24odGV4dCwgc3R5bGUoKSkpOwogICAgICAgICAgICAgICAgIHdpZHRoID0g
bWF4KHdpZHRoLCB0ZXh0V2lkdGgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4dC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0LmgJKHJldmlzaW9uIDg1ODM1KQorKysgU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHQuaAkod29ya2luZyBjb3B5KQpAQCAtMTE5
LDcgKzExOSw3IEBAIHB1YmxpYzoKIAogICAgIElubGluZVRleHRCb3gqIGZpbmROZXh0SW5saW5l
VGV4dEJveChpbnQgb2Zmc2V0LCBpbnQmIHBvcykgY29uc3Q7CiAKLSAgICBib29sIGFsbG93VGFi
cygpIGNvbnN0IHsgcmV0dXJuICFzdHlsZSgpLT5jb2xsYXBzZVdoaXRlU3BhY2UoKTsgfQorICAg
IHZpcnR1YWwgYm9vbCBhbGxvd1RhYnMoKSBjb25zdCB7IHJldHVybiAhc3R5bGUoKS0+Y29sbGFw
c2VXaGl0ZVNwYWNlKCk7IH0KIAogICAgIHZvaWQgY2hlY2tDb25zaXN0ZW5jeSgpIGNvbnN0Owog
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5j
cHAJKHJldmlzaW9uIDg1ODM1KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRl
eHRDb250cm9sLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUg
IlRleHQuaCIKICNpbmNsdWRlICJUZXh0Q29udHJvbElubmVyRWxlbWVudHMuaCIKICNpbmNsdWRl
ICJUZXh0SXRlcmF0b3IuaCIKLSNpbmNsdWRlICJUZXh0UnVuLmgiCisjaW5jbHVkZSAiVGV4dFJ1
bkZhY3RvcnkuaCIKICNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgogCiB1
c2luZyBuYW1lc3BhY2Ugc3RkOwpAQCAtNTQyLDcgKzU0Miw3IEBAIGZsb2F0IFJlbmRlclRleHRD
b250cm9sOjpnZXRBdmdDaGFyV2lkdGgKICAgICAgICAgcmV0dXJuIHJvdW5kZihzdHlsZSgpLT5m
b250KCkucHJpbWFyeUZvbnQoKS0+YXZnQ2hhcldpZHRoKCkpOwogCiAgICAgY29uc3QgVUNoYXIg
Y2ggPSAnMCc7Ci0gICAgcmV0dXJuIHN0eWxlKCktPmZvbnQoKS53aWR0aChUZXh0UnVuKCZjaCwg
MSwgZmFsc2UsIDAsIDAsIFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24pKTsKKyAgICBy
ZXR1cm4gc3R5bGUoKS0+Zm9udCgpLndpZHRoKGNyZWF0ZVRleHRSdW5BbGxvd2luZ1RyYWlsaW5n
RXhwYW5zaW9uKFN0cmluZygmY2gsIDEpLCBzdHlsZSgpKSk7CiB9CiAKIGZsb2F0IFJlbmRlclRl
eHRDb250cm9sOjpzY2FsZUVtVG9Vbml0cyhpbnQgeCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9UZXh0UnVuRmFjdG9yeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1RleHRSdW5GYWN0b3J5LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0UnVuRmFjdG9yeS5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGlt
aXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlRleHRSdW5GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJJbmxpbmVUZXh0Qm94Lmgi
CisjaW5jbHVkZSAiUmVuZGVyU1ZHSW5saW5lVGV4dC5oIgorI2luY2x1ZGUgIlNWR0lubGluZVRl
eHRCb3guaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitUZXh0UnVuIGNyZWF0ZVRleHRSdW5B
bGxvd2luZ1RyYWlsaW5nRXhwYW5zaW9uKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVu
Z3RoLCBSZW5kZXJTdHlsZSogc3R5bGUsIFRleHRSdW5GbGFncyBmbGFncykKK3sKKyAgICBBU1NF
UlQoc3R5bGUpOworCisgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gTFRSOworICAg
IGJvb2wgZGlyZWN0aW9uYWxPdmVycmlkZSA9IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKTsKKyAg
ICBpZiAoZmxhZ3MgIT0gRGVmYXVsdFRleHRSdW5GbGFncykgeworICAgICAgICBpZiAoZmxhZ3Mg
JiBSZXNwZWN0RGlyZWN0aW9uKQorICAgICAgICAgICAgdGV4dERpcmVjdGlvbiA9IHN0eWxlLT5k
aXJlY3Rpb24oKTsKKyAgICAgICAgaWYgKGZsYWdzICYgUmVzcGVjdERpcmVjdGlvbk92ZXJyaWRl
KQorICAgICAgICAgICAgZGlyZWN0aW9uYWxPdmVycmlkZSB8PSBzdHlsZS0+dW5pY29kZUJpZGko
KSA9PSBPdmVycmlkZTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogUmVtb3ZlIFRleHRSdW5zIGFs
bC1pbi1vbmUtY29uc3RydWN0b3IgYW5kIHVzZSBleHBsaWNpdCBzZXR0ZXJzIGhlcmUuCisgICAg
cmV0dXJuIFRleHRSdW4oY2hhcmFjdGVycywgbGVuZ3RoLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6
QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgdGV4dERpcmVjdGlvbiwgZGlyZWN0aW9uYWxPdmVycmlk
ZSk7Cit9CisKK1RleHRSdW4gY3JlYXRlVGV4dFJ1bkFsbG93aW5nVHJhaWxpbmdFeHBhbnNpb24o
Y29uc3QgU3RyaW5nJiBzdHJpbmcsIFJlbmRlclN0eWxlKiBzdHlsZSwgVGV4dFJ1bkZsYWdzIGZs
YWdzKQoreworICAgIHJldHVybiBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGluZ0V4cGFuc2lv
bihzdHJpbmcuY2hhcmFjdGVycygpLCBzdHJpbmcubGVuZ3RoKCksIHN0eWxlLCBmbGFncyk7Cit9
CisKK1RleHRSdW4gY3JlYXRlVGV4dFJ1bkZvcklubGluZVRleHRCb3goY29uc3QgSW5saW5lVGV4
dEJveCogYm94LCBSZW5kZXJTdHlsZSogc3R5bGUsIEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiog
Y2hhcmFjdGVyc1dpdGhIeXBoZW4pCit7CisgICAgQVNTRVJUKGJveCk7CisgICAgQVNTRVJUKHN0
eWxlKTsKKworICAgIFJlbmRlclRleHQqIHRleHRSZW5kZXJlciA9IGJveC0+dGV4dFJlbmRlcmVy
KCk7CisgICAgQVNTRVJUKHRleHRSZW5kZXJlcik7CisgICAgQVNTRVJUKHRleHRSZW5kZXJlci0+
Y2hhcmFjdGVycygpKTsKKworICAgIHJldHVybiBjcmVhdGVUZXh0UnVuRm9ySW5saW5lVGV4dEJv
eChib3gsIHN0eWxlLCB0ZXh0UmVuZGVyZXItPmNoYXJhY3RlcnMoKSArIGJveC0+c3RhcnQoKSwg
Ym94LT5sZW4oKSwgY2hhcmFjdGVyc1dpdGhIeXBoZW4pOworfQorCitzdGF0aWMgdm9pZCBhZGp1
c3RDaGFyYWN0ZXJzQW5kTGVuZ3RoRm9ySHlwaGVuKEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiYg
Y2hhcmFjdGVyc1dpdGhIeXBoZW4sIFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgVUNoYXIqJiBj
aGFyYWN0ZXJzLCBpbnQmIGxlbmd0aCkKK3sKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIGh5cGhl
blN0cmluZyA9IHN0eWxlLT5oeXBoZW5TdHJpbmcoKTsKKyAgICBjaGFyYWN0ZXJzV2l0aEh5cGhl
bi5yZXNlcnZlQ2FwYWNpdHkobGVuZ3RoICsgaHlwaGVuU3RyaW5nLmxlbmd0aCgpKTsKKyAgICBj
aGFyYWN0ZXJzV2l0aEh5cGhlbi5hcHBlbmQoY2hhcmFjdGVycywgbGVuZ3RoKTsKKyAgICBjaGFy
YWN0ZXJzV2l0aEh5cGhlbi5hcHBlbmQoaHlwaGVuU3RyaW5nLmNoYXJhY3RlcnMoKSwgaHlwaGVu
U3RyaW5nLmxlbmd0aCgpKTsKKyAgICBjaGFyYWN0ZXJzID0gY2hhcmFjdGVyc1dpdGhIeXBoZW4u
ZGF0YSgpOworICAgIGxlbmd0aCArPSBoeXBoZW5TdHJpbmcubGVuZ3RoKCk7Cit9CisKK1RleHRS
dW4gY3JlYXRlVGV4dFJ1bkZvcklubGluZVRleHRCb3goY29uc3QgSW5saW5lVGV4dEJveCogYm94
LCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3Ro
LCBCdWZmZXJGb3JBcHBlbmRpbmdIeXBoZW4qIGNoYXJhY3RlcnNXaXRoSHlwaGVuKQoreworICAg
IEFTU0VSVChib3gpOworICAgIEFTU0VSVChzdHlsZSk7CisKKyAgICBSZW5kZXJUZXh0KiB0ZXh0
UmVuZGVyZXIgPSBib3gtPnRleHRSZW5kZXJlcigpOworICAgIEFTU0VSVCh0ZXh0UmVuZGVyZXIp
OworCisgICAgaWYgKGNoYXJhY3RlcnNXaXRoSHlwaGVuKQorICAgICAgICBhZGp1c3RDaGFyYWN0
ZXJzQW5kTGVuZ3RoRm9ySHlwaGVuKCpjaGFyYWN0ZXJzV2l0aEh5cGhlbiwgc3R5bGUsIGNoYXJh
Y3RlcnMsIGxlbmd0aCk7CisKKyAgICAvLyBGSVhNRTogUmVtb3ZlIFRleHRSdW5zIGFsbC1pbi1v
bmUtY29uc3RydWN0b3IgYW5kIHVzZSBleHBsaWNpdCBzZXR0ZXJzIGhlcmUuCisgICAgcmV0dXJu
IFRleHRSdW4oY2hhcmFjdGVycywgbGVuZ3RoLCB0ZXh0UmVuZGVyZXItPmFsbG93VGFicygpLCBi
b3gtPnRleHRQb3MoKSwgYm94LT5leHBhbnNpb24oKSwgYm94LT5leHBhbnNpb25CZWhhdmlvcigp
LCBib3gtPmRpcmVjdGlvbigpLCBib3gtPmRpck92ZXJyaWRlKCkgfHwgc3R5bGUtPnZpc3VhbGx5
T3JkZXJlZCgpKTsKK30KKworVGV4dFJ1biBjcmVhdGVUZXh0UnVuRm9yUmVuZGVyU1ZHSW5saW5l
VGV4dChSZW5kZXJTVkdJbmxpbmVUZXh0KiB0ZXh0UmVuZGVyZXIsIGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzLCBpbnQgbGVuZ3RoKQoreworICAgIEFTU0VSVCh0ZXh0UmVuZGVyZXIpOworCisgICAg
UmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dFJlbmRlcmVyLT5zdHlsZSgpOworICAgIEFTU0VSVChz
dHlsZSk7CisKKyAgICBUZXh0UnVuIHJ1biA9IGNyZWF0ZVRleHRSdW5BbGxvd2luZ1RyYWlsaW5n
RXhwYW5zaW9uKGNoYXJhY3RlcnMsIGxlbmd0aCwgc3R5bGUsIFJlc3BlY3REaXJlY3Rpb24gfCBS
ZXNwZWN0RGlyZWN0aW9uT3ZlcnJpZGUpOworCisgICAgLy8gRklYTUU6IFVzZSB0aGlzIHBsYWNl
IHRvIGF2b2lkIHRoZSBsYXllcmluZyB2aW9sYXRpb24sIHRoYXQgcGxhdGZvcm0vZ3JhcGhpY3Mv
VGV4dFJ1bi5oIHN0b3JlcyBSZW5kZXJPYmplY3QgcG9pbnRlcnMuCisjaWYgRU5BQkxFKFNWR19G
T05UUykKKyAgICBydW4uc2V0UmVmZXJlbmNpbmdSZW5kZXJPYmplY3QodGV4dFJlbmRlcmVyKTsK
KyNlbmRpZgorCisgICAgLy8gV2UgaGFuZGxlIGxldHRlciAmIHdvcmQgc3BhY2luZyBvdXJzZWx2
ZXMuCisgICAgcnVuLmRpc2FibGVTcGFjaW5nKCk7CisgICAgcmV0dXJuIHJ1bjsKK30KKworVGV4
dFJ1biBjcmVhdGVUZXh0UnVuRm9yU1ZHSW5saW5lVGV4dEJveChjb25zdCBTVkdJbmxpbmVUZXh0
Qm94KiBib3gsIFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgU1ZHVGV4dEZyYWdtZW50JiBmcmFn
bWVudCkKK3sKKyAgICBBU1NFUlQoYm94KTsKKyAgICBBU1NFUlQoc3R5bGUpOworCisgICAgUmVu
ZGVyU1ZHSW5saW5lVGV4dCogdGV4dFJlbmRlcmVyID0gdG9SZW5kZXJTVkdJbmxpbmVUZXh0KGJv
eC0+dGV4dFJlbmRlcmVyKCkpOworICAgIEFTU0VSVCh0ZXh0UmVuZGVyZXIpOworICAgIEFTU0VS
VCh0ZXh0UmVuZGVyZXItPmNoYXJhY3RlcnMoKSk7CisKKyAgICBUZXh0UnVuIHJ1biA9IGNyZWF0
ZVRleHRSdW5Gb3JJbmxpbmVUZXh0Qm94KGJveCwgc3R5bGUsIHRleHRSZW5kZXJlci0+Y2hhcmFj
dGVycygpICsgZnJhZ21lbnQuY2hhcmFjdGVyT2Zmc2V0LCBmcmFnbWVudC5sZW5ndGgpOworCisg
ICAgLy8gRklYTUU6IFVzZSB0aGlzIHBsYWNlIHRvIGF2b2lkIHRoZSBsYXllcmluZyB2aW9sYXRp
b24sIHRoYXQgcGxhdGZvcm0vZ3JhcGhpY3MvVGV4dFJ1bi5oIHN0b3JlcyBSZW5kZXJPYmplY3Qg
cG9pbnRlcnMuCisjaWYgRU5BQkxFKFNWR19GT05UUykKKyAgICBydW4uc2V0UmVmZXJlbmNpbmdS
ZW5kZXJPYmplY3QodGV4dFJlbmRlcmVyKTsKKyNlbmRpZgorCisgICAgLy8gV2UgaGFuZGxlIGxl
dHRlciAmIHdvcmQgc3BhY2luZyBvdXJzZWx2ZXMuCisgICAgcnVuLmRpc2FibGVTcGFjaW5nKCk7
CisgICAgcmV0dXJuIHJ1bjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1RleHRSdW5GYWN0b3J5LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1RleHRSdW5GYWN0b3J5LmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dFJ1bkZhY3RvcnkuaAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQgMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgVGV4dFJ1bkZhY3Rv
cnlfaAorI2RlZmluZSBUZXh0UnVuRmFjdG9yeV9oCisKKyNpbmNsdWRlICJUZXh0UnVuLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRWxsaXBzaXNCb3g7CitjbGFzcyBJbmxpbmVU
ZXh0Qm94OworY2xhc3MgUmVuZGVyU3R5bGU7CisKK2VudW0gVGV4dFJ1bkZsYWcgeworICAgIERl
ZmF1bHRUZXh0UnVuRmxhZ3MgPSAwLAorICAgIFJlc3BlY3REaXJlY3Rpb24gPSAxIDw8IDAsCisg
ICAgUmVzcGVjdERpcmVjdGlvbk92ZXJyaWRlID0gMSA8PCAxCit9OworCit0eXBlZGVmIHVuc2ln
bmVkIFRleHRSdW5GbGFnczsKK3R5cGVkZWYgVmVjdG9yPFVDaGFyLCAyNTY+IEJ1ZmZlckZvckFw
cGVuZGluZ0h5cGhlbjsKKworVGV4dFJ1biBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGluZ0V4
cGFuc2lvbihjb25zdCBTdHJpbmcmLCBSZW5kZXJTdHlsZSosIFRleHRSdW5GbGFncyA9IERlZmF1
bHRUZXh0UnVuRmxhZ3MpOworVGV4dFJ1biBjcmVhdGVUZXh0UnVuQWxsb3dpbmdUcmFpbGluZ0V4
cGFuc2lvbihjb25zdCBVQ2hhciosIGludCBsZW5ndGgsIFJlbmRlclN0eWxlKiwgVGV4dFJ1bkZs
YWdzID0gRGVmYXVsdFRleHRSdW5GbGFncyk7CisKK1RleHRSdW4gY3JlYXRlVGV4dFJ1bkZvcklu
bGluZVRleHRCb3goY29uc3QgSW5saW5lVGV4dEJveCosIFJlbmRlclN0eWxlKiwgQnVmZmVyRm9y
QXBwZW5kaW5nSHlwaGVuKiBjaGFyYWN0ZXJzV2l0aEh5cGhlbiA9IDApOworVGV4dFJ1biBjcmVh
dGVUZXh0UnVuRm9ySW5saW5lVGV4dEJveChjb25zdCBJbmxpbmVUZXh0Qm94KiwgUmVuZGVyU3R5
bGUqLCBjb25zdCBVQ2hhciosIGludCBsZW5ndGgsIEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiog
Y2hhcmFjdGVyc1dpdGhIeXBoZW4gPSAwKTsKKworI2lmIEVOQUJMRShTVkcpCitjbGFzcyBSZW5k
ZXJTVkdJbmxpbmVUZXh0OworY2xhc3MgU1ZHSW5saW5lVGV4dEJveDsKK2NsYXNzIFNWR1RleHRG
cmFnbWVudDsKK1RleHRSdW4gY3JlYXRlVGV4dFJ1bkZvclNWR0lubGluZVRleHRCb3goY29uc3Qg
U1ZHSW5saW5lVGV4dEJveCosIFJlbmRlclN0eWxlKiwgY29uc3QgU1ZHVGV4dEZyYWdtZW50Jik7
CitUZXh0UnVuIGNyZWF0ZVRleHRSdW5Gb3JSZW5kZXJTVkdJbmxpbmVUZXh0KFJlbmRlclNWR0lu
bGluZVRleHQqLCBjb25zdCBVQ2hhciosIGludCBsZW5ndGgpOworI2VuZGlmCisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFRleHRSdW5GYWN0b3J5X2gKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHSW5saW5lVGV4dC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZHSW5saW5lVGV4dC5oCShy
ZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvUmVuZGVyU1ZH
SW5saW5lVGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC01Nyw2ICs1Nyw4IEBAIHByaXZhdGU6CiAK
ICAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNMYXllcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9
CiAgICAgdmlydHVhbCBib29sIGlzU1ZHSW5saW5lVGV4dCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KKyAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUYWJzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0K
KyAgICB2aXJ0dWFsIGZsb2F0IHRleHRQb3MoKSBjb25zdCB7IHJldHVybiAwOyB9CiAKICAgICB2
aXJ0dWFsIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvclBvaW50KGNvbnN0IEludFBvaW50Jik7
CiAgICAgdmlydHVhbCBJbnRSZWN0IGxvY2FsQ2FyZXRSZWN0KElubGluZUJveCosIGludCBjYXJl
dE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUgPSAwKTsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJveC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N2Zy9TVkdJbmxpbmVUZXh0Qm94LmNwcAkocmV2aXNp
b24gODU4MzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR0lubGluZVRleHRC
b3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVy
U1ZHUmVzb3VyY2VTb2xpZENvbG9yLmgiCiAjaW5jbHVkZSAiU1ZHSW1hZ2VCdWZmZXJUb29scy5o
IgogI2luY2x1ZGUgIlNWR1Jvb3RJbmxpbmVCb3guaCIKLSNpbmNsdWRlICJUZXh0UnVuLmgiCisj
aW5jbHVkZSAiVGV4dFJ1bkZhY3RvcnkuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApAQCAt
NjYsNyArNjYsNyBAQCBpbnQgU1ZHSW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9yUG9zaXRpb25JCiAg
ICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dFJlbmRlcmVyLT5zdHlsZSgpOwogICAgIEFTU0VS
VChzdHlsZSk7CiAKLSAgICBUZXh0UnVuIHRleHRSdW4oY29uc3RydWN0VGV4dFJ1bihzdHlsZSwg
ZnJhZ21lbnQpKTsKKyAgICBUZXh0UnVuIHRleHRSdW4gPSBjcmVhdGVUZXh0UnVuRm9yU1ZHSW5s
aW5lVGV4dEJveCh0aGlzLCBzdHlsZSwgZnJhZ21lbnQpOwogCiAgICAgLy8gRXZlbnR1YWxseSBo
YW5kbGUgbGVuZ3RoQWRqdXN0PSJzcGFjaW5nQW5kR2x5cGhzIi4KICAgICAvLyBGSVhNRTogSGFu
ZGxlIHZlcnRpY2FsIHRleHQuCkBAIC0xMDQsNyArMTA0LDcgQEAgRmxvYXRSZWN0IFNWR0lubGlu
ZVRleHRCb3g6OnNlbGVjdGlvblJlYwogCiAgICAgdGV4dE9yaWdpbi5tb3ZlKDAsIC1zY2FsZWRG
b250TWV0cmljcy5mbG9hdEFzY2VudCgpKTsKIAotICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25SZWN0
ID0gc2NhbGVkRm9udC5zZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdHJ1Y3RUZXh0UnVuKHN0eWxl
LCBmcmFnbWVudCksIHRleHRPcmlnaW4sIGZyYWdtZW50LmhlaWdodCAqIHNjYWxpbmdGYWN0b3Is
IHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKKyAgICBGbG9hdFJlY3Qgc2VsZWN0aW9uUmVj
dCA9IHNjYWxlZEZvbnQuc2VsZWN0aW9uUmVjdEZvclRleHQoY3JlYXRlVGV4dFJ1bkZvclNWR0lu
bGluZVRleHRCb3godGhpcywgc3R5bGUsIGZyYWdtZW50KSwgdGV4dE9yaWdpbiwgZnJhZ21lbnQu
aGVpZ2h0ICogc2NhbGluZ0ZhY3Rvciwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pOwogICAg
IGlmIChzY2FsaW5nRmFjdG9yID09IDEpCiAgICAgICAgIHJldHVybiBzZWxlY3Rpb25SZWN0Owog
CkBAIC0zOTgsMzIgKzM5OCw2IEBAIHZvaWQgU1ZHSW5saW5lVGV4dEJveDo6cmVzdG9yZUdyYXBo
aWNzQ28KICNlbmRpZgogfQogCi1UZXh0UnVuIFNWR0lubGluZVRleHRCb3g6OmNvbnN0cnVjdFRl
eHRSdW4oUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBTVkdUZXh0RnJhZ21lbnQmIGZyYWdtZW50
KSBjb25zdAotewotICAgIEFTU0VSVChzdHlsZSk7Ci0gICAgQVNTRVJUKHRleHRSZW5kZXJlcigp
KTsKLQotICAgIFJlbmRlclRleHQqIHRleHQgPSB0ZXh0UmVuZGVyZXIoKTsKLSAgICBBU1NFUlQo
dGV4dCk7Ci0KLSAgICBUZXh0UnVuIHJ1bih0ZXh0LT5jaGFyYWN0ZXJzKCkgKyBmcmFnbWVudC5j
aGFyYWN0ZXJPZmZzZXQKLSAgICAgICAgICAgICAgICAsIGZyYWdtZW50Lmxlbmd0aAotICAgICAg
ICAgICAgICAgICwgZmFsc2UgLyogYWxsb3dUYWJzICovCi0gICAgICAgICAgICAgICAgLCAwIC8q
IHhQb3MsIG9ubHkgcmVsZXZhbnQgd2l0aCBhbGxvd1RhYnM9dHJ1ZSAqLwotICAgICAgICAgICAg
ICAgICwgMCAvKiBwYWRkaW5nLCBvbmx5IHJlbGV2YW50IGZvciBqdXN0aWZpZWQgdGV4dCwgbm90
IHJlbGV2YW50IGZvciBTVkcgKi8KLSAgICAgICAgICAgICAgICAsIFRleHRSdW46OkFsbG93VHJh
aWxpbmdFeHBhbnNpb24KLSAgICAgICAgICAgICAgICAsIGRpcmVjdGlvbigpCi0gICAgICAgICAg
ICAgICAgLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSAvKiBkaXJl
Y3Rpb25hbE92ZXJyaWRlICovKTsKLQotI2lmIEVOQUJMRShTVkdfRk9OVFMpCi0gICAgcnVuLnNl
dFJlZmVyZW5jaW5nUmVuZGVyT2JqZWN0KHRleHQpOwotI2VuZGlmCi0KLSAgICAvLyBXZSBoYW5k
bGUgbGV0dGVyICYgd29yZCBzcGFjaW5nIG91cnNlbHZlcy4KLSAgICBydW4uZGlzYWJsZVNwYWNp
bmcoKTsKLSAgICByZXR1cm4gcnVuOwotfQotCiBib29sIFNWR0lubGluZVRleHRCb3g6Om1hcFN0
YXJ0RW5kUG9zaXRpb25zSW50b0ZyYWdtZW50Q29vcmRpbmF0ZXMoY29uc3QgU1ZHVGV4dEZyYWdt
ZW50JiBmcmFnbWVudCwgaW50JiBzdGFydFBvc2l0aW9uLCBpbnQmIGVuZFBvc2l0aW9uKSBjb25z
dAogewogICAgIGlmIChzdGFydFBvc2l0aW9uID49IGVuZFBvc2l0aW9uKQpAQCAtNjU5LDcgKzYz
Myw3IEBAIHZvaWQgU1ZHSW5saW5lVGV4dEJveDo6cGFpbnRUZXh0KEdyYXBoaWMKICAgICB9CiAK
ICAgICAvLyBGYXN0IHBhdGggaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBqdXN0IGRyYXcgdGhl
IHdob2xlIGNodW5rIHBhcnQgdXNpbmcgdGhlIHJlZ3VsYXIgc3R5bGUKLSAgICBUZXh0UnVuIHRl
eHRSdW4oY29uc3RydWN0VGV4dFJ1bihzdHlsZSwgZnJhZ21lbnQpKTsKKyAgICBUZXh0UnVuIHRl
eHRSdW4gPSBjcmVhdGVUZXh0UnVuRm9yU1ZHSW5saW5lVGV4dEJveCh0aGlzLCBzdHlsZSwgZnJh
Z21lbnQpOwogICAgIGlmICghaGFzU2VsZWN0aW9uIHx8IHN0YXJ0UG9zaXRpb24gPj0gZW5kUG9z
aXRpb24pIHsKICAgICAgICAgcGFpbnRUZXh0V2l0aFNoYWRvd3MoY29udGV4dCwgc3R5bGUsIHRl
eHRSdW4sIGZyYWdtZW50LCAwLCBmcmFnbWVudC5sZW5ndGgpOwogICAgICAgICByZXR1cm47CkBA
IC02NzMsNyArNjQ3LDcgQEAgdm9pZCBTVkdJbmxpbmVUZXh0Qm94OjpwYWludFRleHQoR3JhcGhp
YwogICAgIGlmIChzdHlsZSAhPSBzZWxlY3Rpb25TdHlsZSkKICAgICAgICAgU1ZHUmVzb3VyY2Vz
Q2FjaGU6OmNsaWVudFN0eWxlQ2hhbmdlZChwYXJlbnQoKS0+cmVuZGVyZXIoKSwgU3R5bGVEaWZm
ZXJlbmNlUmVwYWludCwgc2VsZWN0aW9uU3R5bGUpOwogCi0gICAgVGV4dFJ1biBzZWxlY3Rpb25U
ZXh0UnVuKGNvbnN0cnVjdFRleHRSdW4oc2VsZWN0aW9uU3R5bGUsIGZyYWdtZW50KSk7CisgICAg
VGV4dFJ1biBzZWxlY3Rpb25UZXh0UnVuID0gY3JlYXRlVGV4dFJ1bkZvclNWR0lubGluZVRleHRC
b3godGhpcywgc2VsZWN0aW9uU3R5bGUsIGZyYWdtZW50KTsKICAgICBwYWludFRleHRXaXRoU2hh
ZG93cyhjb250ZXh0LCBzZWxlY3Rpb25TdHlsZSwgdGV4dFJ1biwgZnJhZ21lbnQsIHN0YXJ0UG9z
aXRpb24sIGVuZFBvc2l0aW9uKTsKIAogICAgIGlmIChzdHlsZSAhPSBzZWxlY3Rpb25TdHlsZSkK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJveC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZHSW5saW5lVGV4dEJv
eC5oCShyZXZpc2lvbiA4NTgzNSkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdmcvU1ZH
SW5saW5lVGV4dEJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC02NCw4ICs2NCw2IEBAIHB1YmxpYzoK
ICAgICBGbG9hdFJlY3Qgc2VsZWN0aW9uUmVjdEZvclRleHRGcmFnbWVudChjb25zdCBTVkdUZXh0
RnJhZ21lbnQmLCBpbnQgZnJhZ21lbnRTdGFydFBvc2l0aW9uLCBpbnQgZnJhZ21lbnRFbmRQb3Np
dGlvbiwgUmVuZGVyU3R5bGUqKTsKIAogcHJpdmF0ZToKLSAgICBUZXh0UnVuIGNvbnN0cnVjdFRl
eHRSdW4oUmVuZGVyU3R5bGUqLCBjb25zdCBTVkdUZXh0RnJhZ21lbnQmKSBjb25zdDsKLQogICAg
IGJvb2wgYWNxdWlyZVBhaW50aW5nUmVzb3VyY2UoR3JhcGhpY3NDb250ZXh0KiYsIGZsb2F0IHNj
YWxpbmdGYWN0b3IsIFJlbmRlck9iamVjdCosIFJlbmRlclN0eWxlKik7CiAgICAgdm9pZCByZWxl
YXNlUGFpbnRpbmdSZXNvdXJjZShHcmFwaGljc0NvbnRleHQqJiwgY29uc3QgUGF0aCopOwogCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1RleHRNZXRyaWNzLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1RleHRNZXRyaWNzLmNw
cAkocmV2aXNpb24gODU4MzUpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3ZnL1NWR1Rl
eHRNZXRyaWNzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUg
IlNWR1RleHRNZXRyaWNzLmgiCiAKICNpbmNsdWRlICJSZW5kZXJTVkdJbmxpbmVUZXh0LmgiCi0j
aW5jbHVkZSAiVGV4dFJ1bi5oIgorI2luY2x1ZGUgIlRleHRSdW5GYWN0b3J5LmgiCiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIApAQCAtNzIsMzMgKzcyLDEwIEBAIFNWR1RleHRNZXRyaWNzIFNWR1Rl
eHRNZXRyaWNzOjplbXB0eU1ldHIKICAgICByZXR1cm4gc19lbXB0eU1ldHJpY3M7CiB9CiAKLXN0
YXRpYyBUZXh0UnVuIGNvbnN0cnVjdFRleHRSdW4oUmVuZGVyU1ZHSW5saW5lVGV4dCogdGV4dCwg
Y29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIHBvc2l0aW9uLCB1bnNpZ25lZCBsZW5n
dGgpCi17Ci0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKLSAgICBBU1NF
UlQoc3R5bGUpOwotCi0gICAgVGV4dFJ1biBydW4oY2hhcmFjdGVycyArIHBvc2l0aW9uCi0gICAg
ICAgICAgICAgICAgLCBsZW5ndGgKLSAgICAgICAgICAgICAgICAsIGZhbHNlIC8qIGFsbG93VGFi
cyAqLwotICAgICAgICAgICAgICAgICwgMCAvKiB4UG9zLCBvbmx5IHJlbGV2YW50IHdpdGggYWxs
b3dUYWJzPXRydWUgKi8KLSAgICAgICAgICAgICAgICAsIDAgLyogcGFkZGluZywgb25seSByZWxl
dmFudCBmb3IganVzdGlmaWVkIHRleHQsIG5vdCByZWxldmFudCBmb3IgU1ZHICovCi0gICAgICAg
ICAgICAgICAgLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uCi0gICAgICAgICAgICAg
ICAgLCBzdHlsZS0+ZGlyZWN0aW9uKCkKLSAgICAgICAgICAgICAgICAsIHN0eWxlLT51bmljb2Rl
QmlkaSgpID09IE92ZXJyaWRlIC8qIGRpcmVjdGlvbmFsT3ZlcnJpZGUgKi8pOwotCi0jaWYgRU5B
QkxFKFNWR19GT05UUykKLSAgICBydW4uc2V0UmVmZXJlbmNpbmdSZW5kZXJPYmplY3QodGV4dCk7
Ci0jZW5kaWYKLQotICAgIC8vIFdlIGhhbmRsZSBsZXR0ZXIgJiB3b3JkIHNwYWNpbmcgb3Vyc2Vs
dmVzLgotICAgIHJ1bi5kaXNhYmxlU3BhY2luZygpOwotICAgIHJldHVybiBydW47Ci19Ci0KIFNW
R1RleHRNZXRyaWNzIFNWR1RleHRNZXRyaWNzOjptZWFzdXJlQ2hhcmFjdGVyUmFuZ2UoUmVuZGVy
U1ZHSW5saW5lVGV4dCogdGV4dCwgdW5zaWduZWQgcG9zaXRpb24sIHVuc2lnbmVkIGxlbmd0aCkK
IHsKICAgICBBU1NFUlQodGV4dCk7Ci0gICAgVGV4dFJ1biBydW4oY29uc3RydWN0VGV4dFJ1bih0
ZXh0LCB0ZXh0LT5jaGFyYWN0ZXJzKCksIHBvc2l0aW9uLCBsZW5ndGgpKTsKKyAgICBUZXh0UnVu
IHJ1biA9IGNyZWF0ZVRleHRSdW5Gb3JSZW5kZXJTVkdJbmxpbmVUZXh0KHRleHQsIHRleHQtPmNo
YXJhY3RlcnMoKSArIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgIHJldHVybiBTVkdUZXh0TWV0cmlj
cyh0ZXh0LCBydW4sIHBvc2l0aW9uLCB0ZXh0LT50ZXh0TGVuZ3RoKCkpOwogfQogCg==
</data>
<flag name="review"
          id="85353"
          type_id="1"
          status="-"
          setter="mitz"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92935</attachid>
            <date>2011-05-10 03:22:35 -0700</date>
            <delta_ts>2011-05-16 11:02:56 -0700</delta_ts>
            <desc>Patch v3</desc>
            <filename>TextRun-v3.diff</filename>
            <type>text/plain</type>
            <size>26499</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg2MTM5KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTMgQEAKKzIwMTEtMDUtMTAgIE5pa29sYXMg
WmltbWVybWFubiAgPG56aW1tZXJtYW5uQHJpbS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUmVmYWN0b3IgVGV4dFJ1biBjcmVhdGlvbgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjAyNTUKKworICAg
ICAgICBBZGQgY29uc3RydWN0VGV4dFJ1bigpIG1ldGhvZHMgdG8gUmVuZGVyQmxvY2svSW5saW5l
VGV4dEJveCBhbmQgdXNlIGl0IGluIHZhcmlvdXMgcGxhY2VzIGluIHJlbmRlcmluZy8uCisgICAg
ICAgIFRoZSBsb25nLXRlcm0gZ29hbCBpcyB0byByZW1vdmUgdGhlIHVnbHkgZWlnaHQgcGFyYW1l
dGVycyBjYXRjaC1pdC1hbGwgVGV4dFJ1biBjb25zdHJ1Y3RvciwgYW5kCisgICAgICAgIHJlcGxh
Y2UgaXQgd2l0aCBleHBsaWNpdCBzZXR0ZXJzL2dldHRlcnMuIFRvIGF2b2lkIGV4cGFuZGluZyBk
b3plbnMgb2YgY2FsbHNpdGVzLCB3aGVuIHJlbW92aW5nCisgICAgICAgIHRoZSBjYXRjaC1pdC1h
bGwgY29uc3RydWN0b3IsIHRoZXNlIGhlbHBlciBmdW5jdGlvbnMgYXJlIGludHJvZHVjZWQsIHdo
aWNoIGhpZGUgdGhlIGRldGFpbHMgb2YKKyAgICAgICAgY3JlYXRpbmcgYSBUZXh0UnVuLgorCisg
ICAgICAgIEZ1cnRoZXJtb3JlIGl0IHdpbGwgYmUgdXNlZCB0byByZW1vdmUgdGhlIHBsYXRmb3Jt
IGxheWVyaW5nIHZpb2xhdGlvbiwgdGhhdCBUZXh0UnVuIHN0b3JlcworICAgICAgICBSZW5kZXJP
YmplY3QgcG9pbnRlcnMgZm9yIHRoZSBzYWtlIG9mIFNWRyBGb250cyBzdXBwb3J0LCBzZWUgYnVn
IDYwMjU0LgorCisgICAgICAgIE5vIGNoYW5nZSBpbiBmdW5jdGlvbmFsaXksIG5vIG5ldyB0ZXN0
cy4KKworICAgICAgICAqIHJlbmRlcmluZy9FbGxpcHNpc0JveC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpFbGxpcHNpc0JveDo6cGFpbnQpOgorICAgICAgICAoV2ViQ29yZTo6RWxsaXBzaXNCb3g6
OnNlbGVjdGlvblJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6RWxsaXBzaXNCb3g6OnBhaW50U2Vs
ZWN0aW9uKToKKyAgICAgICAgKiByZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpJbmxpbmVUZXh0Qm94OjpzZWxlY3Rpb25SZWN0KToKKyAgICAgICAgKFdlYkNv
cmU6OklubGluZVRleHRCb3g6OnBhaW50KToKKyAgICAgICAgKFdlYkNvcmU6OklubGluZVRleHRC
b3g6OnBhaW50U2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklubGluZVRleHRCb3g6OnBh
aW50Q29tcG9zaXRpb25CYWNrZ3JvdW5kKToKKyAgICAgICAgKFdlYkNvcmU6OklubGluZVRleHRC
b3g6OnBhaW50U3BlbGxpbmdPckdyYW1tYXJNYXJrZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW5s
aW5lVGV4dEJveDo6cGFpbnRUZXh0TWF0Y2hNYXJrZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW5s
aW5lVGV4dEJveDo6Y29tcHV0ZVJlY3RGb3JSZXBsYWNlbWVudE1hcmtlcik6CisgICAgICAgIChX
ZWJDb3JlOjpJbmxpbmVUZXh0Qm94OjpvZmZzZXRGb3JQb3NpdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpJbmxpbmVUZXh0Qm94Ojpwb3NpdGlvbkZvck9mZnNldCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbmxpbmVUZXh0Qm94Ojpjb25zdHJ1Y3RUZXh0UnVuKToKKyAgICAgICAgKiByZW5kZXJpbmcv
SW5saW5lVGV4dEJveC5oOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bkFsbG93VHJhaWxp
bmdFeHBhbnNpb24pOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9jay5oOgorICAgICAg
ICAqIHJlbmRlcmluZy9SZW5kZXJFbWJlZGRlZE9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJFbWJlZGRlZE9iamVjdDo6Z2V0UmVwbGFjZW1lbnRUZXh0R2VvbWV0cnkpOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJGaWxlVXBsb2FkQ29udHJvbC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJGaWxlVXBsb2FkQ29udHJvbDo6cGFpbnRPYmplY3QpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyRmlsZVVwbG9hZENvbnRyb2w6OmNvbXB1dGVQcmVmZXJyZWRMb2dpY2Fs
V2lkdGhzKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVySW1hZ2UuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVySW1hZ2U6OnNldEltYWdlU2l6ZUZvckFsdFRleHQpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVySW1hZ2U6OnBhaW50UmVwbGFjZWQpOgorICAgICAgICAqIHJlbmRlcmlu
Zy9SZW5kZXJMaXN0Qm94LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxpc3RCb3g6OnVw
ZGF0ZUZyb21FbGVtZW50KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OmdldEF2Z0NoYXJXaWR0
aCk6CisKIDIwMTEtMDUtMTAgIFRvbnkgR2VudGlsY29yZSAgPHRvbnlnQGNocm9taXVtLm9yZz4K
IAogICAgICAgICBCdWlsZCBmaXg6IGluY2x1ZGUgRXhjZXB0aW9uQ29kZQpJbmRleDogU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0VsbGlwc2lzQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvRWxsaXBzaXNCb3guY3BwCShyZXZpc2lvbiA4NjEzMSkKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9FbGxpcHNpc0JveC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJI
aXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiUGFpbnRJbmZvLmgiCisjaW5jbHVkZSAiUmVuZGVy
QmxvY2suaCIKICNpbmNsdWRlICJSb290SW5saW5lQm94LmgiCiAjaW5jbHVkZSAiVGV4dFJ1bi5o
IgogCkBAIC01Miw5ICs1Myw4IEBAIHZvaWQgRWxsaXBzaXNCb3g6OnBhaW50KFBhaW50SW5mbyYg
cGFpbnQKICAgICAgICAgICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihmb3JlZ3JvdW5kLCBzdHls
ZS0+Y29sb3JTcGFjZSgpKTsKICAgICB9CiAKLSAgICBjb25zdCBTdHJpbmcmIHN0ciA9IG1fc3Ry
OwotICAgIC8vIEZJWE1FOiBXaHkgaXMgdGhpcyBhbHdhc3kgTFRSPwotICAgIGNvbnRleHQtPmRy
YXdUZXh0KHN0eWxlLT5mb250KCksIFRleHRSdW4oc3RyLmNoYXJhY3RlcnMoKSwgc3RyLmxlbmd0
aCgpLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgTFRSLCBz
dHlsZS0+dmlzdWFsbHlPcmRlcmVkKCkpLCBJbnRQb2ludChtX3ggKyB0eCwgbV95ICsgdHkgKyBz
dHlsZS0+Zm9udE1ldHJpY3MoKS5hc2NlbnQoKSkpOworICAgIC8vIEZJWE1FOiBXaHkgaXMgdGhp
cyBhbHdheXMgTFRSPyBGaXggYnkgcGFzc2luZyBjb3JyZWN0IHRleHQgcnVuIGZsYWdzIGJlbG93
LgorICAgIGNvbnRleHQtPmRyYXdUZXh0KHN0eWxlLT5mb250KCksIFJlbmRlckJsb2NrOjpjb25z
dHJ1Y3RUZXh0UnVuQWxsb3dUcmFpbGluZ0V4cGFuc2lvbihtX3N0ciwgc3R5bGUpLCBJbnRQb2lu
dChtX3ggKyB0eCwgbV95ICsgdHkgKyBzdHlsZS0+Zm9udE1ldHJpY3MoKS5hc2NlbnQoKSkpOwog
CiAgICAgLy8gUmVzdG9yZSB0aGUgcmVndWxhciBmaWxsIGNvbG9yLgogICAgIGlmICh0ZXh0Q29s
b3IgIT0gY29udGV4dC0+ZmlsbENvbG9yKCkpCkBAIC03NSw5ICs3NSw4IEBAIEludFJlY3QgRWxs
aXBzaXNCb3g6OnNlbGVjdGlvblJlY3QoaW50IHQKIHsKICAgICBSZW5kZXJTdHlsZSogc3R5bGUg
PSBtX3JlbmRlcmVyLT5zdHlsZShtX2ZpcnN0TGluZSk7CiAgICAgY29uc3QgRm9udCYgZiA9IHN0
eWxlLT5mb250KCk7Ci0gICAgLy8gRklYTUU6IFdoeSBpcyB0aGlzIGFsd2F5cyBMVFI/Ci0gICAg
cmV0dXJuIGVuY2xvc2luZ0ludFJlY3QoZi5zZWxlY3Rpb25SZWN0Rm9yVGV4dChUZXh0UnVuKG1f
c3RyLmNoYXJhY3RlcnMoKSwgbV9zdHIubGVuZ3RoKCksIGZhbHNlLCAwLCAwLCBUZXh0UnVuOjpB
bGxvd1RyYWlsaW5nRXhwYW5zaW9uLCBMVFIsIHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSksCi0g
ICAgICAgICAgICBJbnRQb2ludChtX3ggKyB0eCwgbV95ICsgdHkgKyByb290KCktPnNlbGVjdGlv
blRvcCgpKSwgcm9vdCgpLT5zZWxlY3Rpb25IZWlnaHQoKSkpOworICAgIC8vIEZJWE1FOiBXaHkg
aXMgdGhpcyBhbHdheXMgTFRSPyBGaXggYnkgcGFzc2luZyBjb3JyZWN0IHRleHQgcnVuIGZsYWdz
IGJlbG93LgorICAgIHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KGYuc2VsZWN0aW9uUmVjdEZvclRl
eHQoUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW5BbGxvd1RyYWlsaW5nRXhwYW5zaW9uKG1f
c3RyLCBzdHlsZSksIEludFBvaW50KG1feCArIHR4LCBtX3kgKyB0eSArIHJvb3QoKS0+c2VsZWN0
aW9uVG9wKCkpLCByb290KCktPnNlbGVjdGlvbkhlaWdodCgpKSk7CiB9CiAKIHZvaWQgRWxsaXBz
aXNCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgaW50IHR4LCBp
bnQgdHksIFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgRm9udCYgZm9udCkKQEAgLTk2LDkgKzk1
LDggQEAgdm9pZCBFbGxpcHNpc0JveDo6cGFpbnRTZWxlY3Rpb24oR3JhcGhpYwogICAgIGludCB5
ID0gcm9vdCgpLT5zZWxlY3Rpb25Ub3AoKTsKICAgICBpbnQgaCA9IHJvb3QoKS0+c2VsZWN0aW9u
SGVpZ2h0KCk7CiAgICAgY29udGV4dC0+Y2xpcChJbnRSZWN0KG1feCArIHR4LCB5ICsgdHksIG1f
bG9naWNhbFdpZHRoLCBoKSk7Ci0gICAgLy8gRklYTUU6IFdoeSBpcyB0aGlzIGFsd2F5cyBMVFI/
Ci0gICAgY29udGV4dC0+ZHJhd0hpZ2hsaWdodEZvclRleHQoZm9udCwgVGV4dFJ1bihtX3N0ci5j
aGFyYWN0ZXJzKCksIG1fc3RyLmxlbmd0aCgpLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6QWxsb3dU
cmFpbGluZ0V4cGFuc2lvbiwgTFRSLCBzdHlsZS0+dmlzdWFsbHlPcmRlcmVkKCkpLAotICAgICAg
ICBJbnRQb2ludChtX3ggKyB0eCwgbV95ICsgdHkgKyB5KSwgaCwgYywgc3R5bGUtPmNvbG9yU3Bh
Y2UoKSk7CisgICAgLy8gRklYTUU6IFdoeSBpcyB0aGlzIGFsd2F5cyBMVFI/IEZpeCBieSBwYXNz
aW5nIGNvcnJlY3QgdGV4dCBydW4gZmxhZ3MgYmVsb3cuCisgICAgY29udGV4dC0+ZHJhd0hpZ2hs
aWdodEZvclRleHQoZm9udCwgUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW5BbGxvd1RyYWls
aW5nRXhwYW5zaW9uKG1fc3RyLCBzdHlsZSksIEludFBvaW50KG1feCArIHR4LCBtX3kgKyB0eSAr
IHkpLCBoLCBjLCBzdHlsZS0+Y29sb3JTcGFjZSgpKTsKIH0KIAogYm9vbCBFbGxpcHNpc0JveDo6
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQm
IHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgaW50IGxpbmVUb3AsIGludCBs
aW5lQm90dG9tKQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0lubGluZVRleHRCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94
LmNwcAkocmV2aXNpb24gODYxMzEpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5l
VGV4dEJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJS
ZW5kZXJSdWJ5VGV4dC5oIgogI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCiAjaW5jbHVkZSAiVGV4
dC5oIgorI2luY2x1ZGUgIlRleHRSdW4uaCIKICNpbmNsdWRlICJicmVha19saW5lcy5oIgogI2lu
Y2x1ZGUgPHd0Zi9BbHdheXNJbmxpbmUuaD4KIApAQCAtMTU5LDggKzE2MCw2IEBAIFJlbmRlck9i
amVjdDo6U2VsZWN0aW9uU3RhdGUgSW5saW5lVGV4dEIKICAgICByZXR1cm4gc3RhdGU7CiB9CiAK
LXR5cGVkZWYgVmVjdG9yPFVDaGFyLCAyNTY+IEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbjsKLQog
c3RhdGljIHZvaWQgYWRqdXN0Q2hhcmFjdGVyc0FuZExlbmd0aEZvckh5cGhlbihCdWZmZXJGb3JB
cHBlbmRpbmdIeXBoZW4mIGNoYXJhY3RlcnNXaXRoSHlwaGVuLCBSZW5kZXJTdHlsZSogc3R5bGUs
IGNvbnN0IFVDaGFyKiYgY2hhcmFjdGVycywgaW50JiBsZW5ndGgpCiB7CiAgICAgY29uc3QgQXRv
bWljU3RyaW5nJiBoeXBoZW5TdHJpbmcgPSBzdHlsZS0+aHlwaGVuU3RyaW5nKCk7CkBAIC0xODUs
MTYgKzE4NCwxMyBAQCBJbnRSZWN0IElubGluZVRleHRCb3g6OnNlbGVjdGlvblJlY3QoaW50CiAg
ICAgUmVuZGVyU3R5bGUqIHN0eWxlVG9Vc2UgPSB0ZXh0T2JqLT5zdHlsZShtX2ZpcnN0TGluZSk7
CiAgICAgY29uc3QgRm9udCYgZiA9IHN0eWxlVG9Vc2UtPmZvbnQoKTsKIAotICAgIGNvbnN0IFVD
aGFyKiBjaGFyYWN0ZXJzID0gdGV4dE9iai0+dGV4dCgpLT5jaGFyYWN0ZXJzKCkgKyBtX3N0YXJ0
OwotICAgIGludCBsZW4gPSBtX2xlbjsKICAgICBCdWZmZXJGb3JBcHBlbmRpbmdIeXBoZW4gY2hh
cmFjdGVyc1dpdGhIeXBoZW47Ci0gICAgaWYgKGVQb3MgPT0gbGVuICYmIGhhc0h5cGhlbigpKSB7
Ci0gICAgICAgIGFkanVzdENoYXJhY3RlcnNBbmRMZW5ndGhGb3JIeXBoZW4oY2hhcmFjdGVyc1dp
dGhIeXBoZW4sIHN0eWxlVG9Vc2UsIGNoYXJhY3RlcnMsIGxlbik7Ci0gICAgICAgIGVQb3MgPSBs
ZW47Ci0gICAgfQorICAgIGJvb2wgcmVzcGVjdEh5cGhlbiA9IGVQb3MgPT0gbV9sZW4gJiYgaGFz
SHlwaGVuKCk7CisgICAgVGV4dFJ1biB0ZXh0UnVuID0gY29uc3RydWN0VGV4dFJ1bihzdHlsZVRv
VXNlLCByZXNwZWN0SHlwaGVuID8gJmNoYXJhY3RlcnNXaXRoSHlwaGVuIDogMCk7CisgICAgaWYg
KHJlc3BlY3RIeXBoZW4pCisgICAgICAgIGVuZFBvcyA9IHRleHRSdW4ubGVuZ3RoKCk7CiAKLSAg
ICBJbnRSZWN0IHIgPSBlbmNsb3NpbmdJbnRSZWN0KGYuc2VsZWN0aW9uUmVjdEZvclRleHQoVGV4
dFJ1bihjaGFyYWN0ZXJzLCBsZW4sIHRleHRPYmotPmFsbG93VGFicygpLCB0ZXh0UG9zKCksIG1f
ZXhwYW5zaW9uLCBleHBhbnNpb25CZWhhdmlvcigpLCBkaXJlY3Rpb24oKSwgbV9kaXJPdmVycmlk
ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEZsb2F0UG9pbnQobG9naWNhbExlZnQoKSwgc2VsVG9wKSwgc2VsSGVpZ2h0LCBzUG9zLCBl
UG9zKSk7CisgICAgSW50UmVjdCByID0gZW5jbG9zaW5nSW50UmVjdChmLnNlbGVjdGlvblJlY3RG
b3JUZXh0KHRleHRSdW4sIEZsb2F0UG9pbnQobG9naWNhbExlZnQoKSwgc2VsVG9wKSwgc2VsSGVp
Z2h0LCBzUG9zLCBlUG9zKSk7CiAKICAgICBpbnQgbG9naWNhbFdpZHRoID0gci53aWR0aCgpOwog
ICAgIGlmIChyLngoKSA+IGxvZ2ljYWxSaWdodCgpKQpAQCAtNjQ3LDEwICs2NDMsOSBAQCB2b2lk
IElubGluZVRleHRCb3g6OnBhaW50KFBhaW50SW5mbyYgcGFpCiAgICAgICAgIGNvbWJpbmVkVGV4
dC0+Y2hhcmFjdGVyc1RvUmVuZGVyKG1fc3RhcnQsIGNoYXJhY3RlcnMsIGxlbmd0aCk7CiAKICAg
ICBCdWZmZXJGb3JBcHBlbmRpbmdIeXBoZW4gY2hhcmFjdGVyc1dpdGhIeXBoZW47CisgICAgVGV4
dFJ1biB0ZXh0UnVuID0gY29uc3RydWN0VGV4dFJ1bihzdHlsZVRvVXNlLCBjaGFyYWN0ZXJzLCBs
ZW5ndGgsIGhhc0h5cGhlbigpID8gJmNoYXJhY3RlcnNXaXRoSHlwaGVuIDogMCk7CiAgICAgaWYg
KGhhc0h5cGhlbigpKQotICAgICAgICBhZGp1c3RDaGFyYWN0ZXJzQW5kTGVuZ3RoRm9ySHlwaGVu
KGNoYXJhY3RlcnNXaXRoSHlwaGVuLCBzdHlsZVRvVXNlLCBjaGFyYWN0ZXJzLCBsZW5ndGgpOwot
Ci0gICAgVGV4dFJ1biB0ZXh0UnVuKGNoYXJhY3RlcnMsIGxlbmd0aCwgdGV4dFJlbmRlcmVyKCkt
PmFsbG93VGFicygpLCB0ZXh0UG9zKCksIG1fZXhwYW5zaW9uLCBleHBhbnNpb25CZWhhdmlvcigp
LCBkaXJlY3Rpb24oKSwgbV9kaXJPdmVycmlkZSB8fCBzdHlsZVRvVXNlLT52aXN1YWxseU9yZGVy
ZWQoKSk7CisgICAgICAgIGxlbmd0aCA9IHRleHRSdW4ubGVuZ3RoKCk7CiAKICAgICBpbnQgc1Bv
cyA9IDA7CiAgICAgaW50IGVQb3MgPSAwOwpAQCAtODEyLDEwICs4MDcsMTAgQEAgdm9pZCBJbmxp
bmVUZXh0Qm94OjpwYWludFNlbGVjdGlvbihHcmFwaAogICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0
ZXJzID0gdGV4dFJlbmRlcmVyKCktPnRleHQoKS0+Y2hhcmFjdGVycygpICsgbV9zdGFydDsKIAog
ICAgIEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiBjaGFyYWN0ZXJzV2l0aEh5cGhlbjsKLSAgICBp
ZiAoZVBvcyA9PSBsZW5ndGggJiYgaGFzSHlwaGVuKCkpIHsKLSAgICAgICAgYWRqdXN0Q2hhcmFj
dGVyc0FuZExlbmd0aEZvckh5cGhlbihjaGFyYWN0ZXJzV2l0aEh5cGhlbiwgc3R5bGUsIGNoYXJh
Y3RlcnMsIGxlbmd0aCk7Ci0gICAgICAgIGVQb3MgPSBsZW5ndGg7Ci0gICAgfQorICAgIGJvb2wg
cmVzcGVjdEh5cGhlbiA9IGVQb3MgPT0gbGVuZ3RoICYmIGhhc0h5cGhlbigpOworICAgIFRleHRS
dW4gdGV4dFJ1biA9IGNvbnN0cnVjdFRleHRSdW4oc3R5bGUsIGNoYXJhY3RlcnMsIGxlbmd0aCwg
cmVzcGVjdEh5cGhlbiA/ICZjaGFyYWN0ZXJzV2l0aEh5cGhlbiA6IDApOworICAgIGlmIChyZXNw
ZWN0SHlwaGVuKQorICAgICAgICBlUG9zID0gdGV4dFJ1bi5sZW5ndGgoKTsKIAogICAgIGludCBk
ZWx0YVkgPSByZW5kZXJlcigpLT5zdHlsZSgpLT5pc0ZsaXBwZWRMaW5lc1dyaXRpbmdNb2RlKCkg
PyBzZWxlY3Rpb25Cb3R0b20oKSAtIGxvZ2ljYWxCb3R0b20oKSA6IGxvZ2ljYWxUb3AoKSAtIHNl
bGVjdGlvblRvcCgpOwogICAgIGludCBzZWxIZWlnaHQgPSBzZWxlY3Rpb25IZWlnaHQoKTsKQEAg
LTgyNyw5ICs4MjIsNyBAQCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50U2VsZWN0aW9uKEdyYXBo
CiAgICAgY2xpcFJlY3Quc2V0V2lkdGgobWF4WCAtIGNsaXBSZWN0LngoKSk7CiAgICAgY29udGV4
dC0+Y2xpcChjbGlwUmVjdCk7CiAKLSAgICBjb250ZXh0LT5kcmF3SGlnaGxpZ2h0Rm9yVGV4dChm
b250LCBUZXh0UnVuKGNoYXJhY3RlcnMsIGxlbmd0aCwgdGV4dFJlbmRlcmVyKCktPmFsbG93VGFi
cygpLCB0ZXh0UG9zKCksIG1fZXhwYW5zaW9uLCBleHBhbnNpb25CZWhhdmlvcigpLCAKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24oKSwgbV9kaXJPdmVycmlkZSB8
fCBzdHlsZS0+dmlzdWFsbHlPcmRlcmVkKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGxvY2FsT3JpZ2luLCBzZWxIZWlnaHQsIGMsIHN0eWxlLT5jb2xvclNwYWNlKCksIHNQ
b3MsIGVQb3MpOworICAgIGNvbnRleHQtPmRyYXdIaWdobGlnaHRGb3JUZXh0KGZvbnQsIHRleHRS
dW4sIGxvY2FsT3JpZ2luLCBzZWxIZWlnaHQsIGMsIHN0eWxlLT5jb2xvclNwYWNlKCksIHNQb3Ms
IGVQb3MpOwogfQogCiB2b2lkIElubGluZVRleHRCb3g6OnBhaW50Q29tcG9zaXRpb25CYWNrZ3Jv
dW5kKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgRmxvYXRQb2ludCYgYm94T3JpZ2lu
LCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IEZvbnQmIGZvbnQsIGludCBzdGFydFBvcywgaW50
IGVuZFBvcykKQEAgLTg1MCw5ICs4NDMsNyBAQCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50Q29t
cG9zaXRpb25CYWNrCiAgICAgaW50IGRlbHRhWSA9IHJlbmRlcmVyKCktPnN0eWxlKCktPmlzRmxp
cHBlZExpbmVzV3JpdGluZ01vZGUoKSA/IHNlbGVjdGlvbkJvdHRvbSgpIC0gbG9naWNhbEJvdHRv
bSgpIDogbG9naWNhbFRvcCgpIC0gc2VsZWN0aW9uVG9wKCk7CiAgICAgaW50IHNlbEhlaWdodCA9
IHNlbGVjdGlvbkhlaWdodCgpOwogICAgIEZsb2F0UG9pbnQgbG9jYWxPcmlnaW4oYm94T3JpZ2lu
LngoKSwgYm94T3JpZ2luLnkoKSAtIGRlbHRhWSk7Ci0gICAgY29udGV4dC0+ZHJhd0hpZ2hsaWdo
dEZvclRleHQoZm9udCwgVGV4dFJ1bih0ZXh0UmVuZGVyZXIoKS0+dGV4dCgpLT5jaGFyYWN0ZXJz
KCkgKyBtX3N0YXJ0LCBtX2xlbiwgdGV4dFJlbmRlcmVyKCktPmFsbG93VGFicygpLCB0ZXh0UG9z
KCksIG1fZXhwYW5zaW9uLCBleHBhbnNpb25CZWhhdmlvcigpLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1
YWxseU9yZGVyZWQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxP
cmlnaW4sIHNlbEhlaWdodCwgYywgc3R5bGUtPmNvbG9yU3BhY2UoKSwgc1BvcywgZVBvcyk7Cisg
ICAgY29udGV4dC0+ZHJhd0hpZ2hsaWdodEZvclRleHQoZm9udCwgY29uc3RydWN0VGV4dFJ1bihz
dHlsZSksIGxvY2FsT3JpZ2luLCBzZWxIZWlnaHQsIGMsIHN0eWxlLT5jb2xvclNwYWNlKCksIHNQ
b3MsIGVQb3MpOwogfQogCiAjaWYgUExBVEZPUk0oTUFDKQpAQCAtMTAxMCw4ICsxMDAxLDggQEAg
dm9pZCBJbmxpbmVUZXh0Qm94OjpwYWludFNwZWxsaW5nT3JHcmFtbQogICAgICAgICBpbnQgZGVs
dGFZID0gcmVuZGVyZXIoKS0+c3R5bGUoKS0+aXNGbGlwcGVkTGluZXNXcml0aW5nTW9kZSgpID8g
c2VsZWN0aW9uQm90dG9tKCkgLSBsb2dpY2FsQm90dG9tKCkgOiBsb2dpY2FsVG9wKCkgLSBzZWxl
Y3Rpb25Ub3AoKTsKICAgICAgICAgaW50IHNlbEhlaWdodCA9IHNlbGVjdGlvbkhlaWdodCgpOwog
ICAgICAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoYm94T3JpZ2luLngoKSwgYm94T3JpZ2luLnko
KSAtIGRlbHRhWSk7Ci0gICAgICAgIFRleHRSdW4gcnVuKHRleHRSZW5kZXJlcigpLT50ZXh0KCkt
PmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLCB0ZXh0UmVuZGVyZXIoKS0+YWxsb3dUYWJz
KCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCksIGRpcmVjdGlv
bigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSk7Ci0gICAgICAg
IAorICAgICAgICBUZXh0UnVuIHJ1biA9IGNvbnN0cnVjdFRleHRSdW4oc3R5bGUpOworCiAgICAg
ICAgIC8vIEZJWE1FOiBDb252ZXJ0IHRoZSBkb2N1bWVudCBtYXJrZXJzIHRvIGZsb2F0IHJlY3Rz
LgogICAgICAgICBJbnRSZWN0IG1hcmtlclJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGZvbnQuc2Vs
ZWN0aW9uUmVjdEZvclRleHQocnVuLCBzdGFydFBvaW50LCBzZWxIZWlnaHQsIHN0YXJ0UG9zaXRp
b24sIGVuZFBvc2l0aW9uKSk7CiAgICAgICAgIHN0YXJ0ID0gbWFya2VyUmVjdC54KCkgLSBzdGFy
dFBvaW50LngoKTsKQEAgLTEwNTUsOCArMTA0Niw4IEBAIHZvaWQgSW5saW5lVGV4dEJveDo6cGFp
bnRUZXh0TWF0Y2hNYXJrZXIKIAogICAgIGludCBzUG9zID0gbWF4KG1hcmtlci5zdGFydE9mZnNl
dCAtIG1fc3RhcnQsICh1bnNpZ25lZCkwKTsKICAgICBpbnQgZVBvcyA9IG1pbihtYXJrZXIuZW5k
T2Zmc2V0IC0gbV9zdGFydCwgKHVuc2lnbmVkKW1fbGVuKTsgICAgCi0gICAgVGV4dFJ1biBydW4o
dGV4dFJlbmRlcmVyKCktPnRleHQoKS0+Y2hhcmFjdGVycygpICsgbV9zdGFydCwgbV9sZW4sIHRl
eHRSZW5kZXJlcigpLT5hbGxvd1RhYnMoKSwgdGV4dFBvcygpLCBtX2V4cGFuc2lvbiwgZXhwYW5z
aW9uQmVoYXZpb3IoKSwgZGlyZWN0aW9uKCksIG1fZGlyT3ZlcnJpZGUgfHwgc3R5bGUtPnZpc3Vh
bGx5T3JkZXJlZCgpKTsKLSAgICAKKyAgICBUZXh0UnVuIHJ1biA9IGNvbnN0cnVjdFRleHRSdW4o
c3R5bGUpOworCiAgICAgLy8gQWx3YXlzIGNvbXB1dGUgYW5kIHN0b3JlIHRoZSByZWN0IGFzc29j
aWF0ZWQgd2l0aCB0aGlzIG1hcmtlci4gVGhlIGNvbXB1dGVkIHJlY3QgaXMgaW4gYWJzb2x1dGUg
Y29vcmRpbmF0ZXMuCiAgICAgSW50UmVjdCBtYXJrZXJSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChm
b250LnNlbGVjdGlvblJlY3RGb3JUZXh0KHJ1biwgSW50UG9pbnQobV94LCBzZWxlY3Rpb25Ub3Ao
KSksIHNlbEhlaWdodCwgc1BvcywgZVBvcykpOwogICAgIG1hcmtlclJlY3QgPSByZW5kZXJlcigp
LT5sb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0UmVjdChtYXJrZXJSZWN0KSkuZW5jbG9zaW5nQm91
bmRpbmdCb3goKTsKQEAgLTEwODIsNyArMTA3Myw3IEBAIHZvaWQgSW5saW5lVGV4dEJveDo6Y29t
cHV0ZVJlY3RGb3JSZXBsYWMKICAgICAKICAgICBpbnQgc1BvcyA9IG1heChtYXJrZXIuc3RhcnRP
ZmZzZXQgLSBtX3N0YXJ0LCAodW5zaWduZWQpMCk7CiAgICAgaW50IGVQb3MgPSBtaW4obWFya2Vy
LmVuZE9mZnNldCAtIG1fc3RhcnQsICh1bnNpZ25lZCltX2xlbik7ICAgIAotICAgIFRleHRSdW4g
cnVuKHRleHRSZW5kZXJlcigpLT50ZXh0KCktPmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVu
LCB0ZXh0UmVuZGVyZXIoKS0+YWxsb3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4
cGFuc2lvbkJlaGF2aW9yKCksIGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52
aXN1YWxseU9yZGVyZWQoKSk7CisgICAgVGV4dFJ1biBydW4gPSBjb25zdHJ1Y3RUZXh0UnVuKHN0
eWxlKTsKICAgICBJbnRQb2ludCBzdGFydFBvaW50ID0gSW50UG9pbnQobV94LCB5KTsKICAgICAK
ICAgICAvLyBDb21wdXRlIGFuZCBzdG9yZSB0aGUgcmVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBt
YXJrZXIuCkBAIC0xMjQyLDkgKzEyMzMsNyBAQCBpbnQgSW5saW5lVGV4dEJveDo6b2Zmc2V0Rm9y
UG9zaXRpb24oZmxvCiAgICAgUmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVyVGV4dChyZW5kZXJl
cigpKTsKICAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0ZXh0LT5zdHlsZShtX2ZpcnN0TGluZSk7
CiAgICAgY29uc3QgRm9udCogZiA9ICZzdHlsZS0+Zm9udCgpOwotICAgIGludCBvZmZzZXQgPSBm
LT5vZmZzZXRGb3JQb3NpdGlvbihUZXh0UnVuKHRleHRSZW5kZXJlcigpLT50ZXh0KCktPmNoYXJh
Y3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLAotICAgICAgICB0ZXh0UmVuZGVyZXIoKS0+YWxsb3dU
YWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCksIGRpcmVj
dGlvbigpLCBtX2Rpck92ZXJyaWRlIHx8IHN0eWxlLT52aXN1YWxseU9yZGVyZWQoKSksCi0gICAg
ICAgIGxpbmVPZmZzZXQgLSBsb2dpY2FsTGVmdCgpLCBpbmNsdWRlUGFydGlhbEdseXBocyk7Cisg
ICAgaW50IG9mZnNldCA9IGYtPm9mZnNldEZvclBvc2l0aW9uKGNvbnN0cnVjdFRleHRSdW4oc3R5
bGUpLCBsaW5lT2Zmc2V0IC0gbG9naWNhbExlZnQoKSwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOwog
ICAgIGlmIChibG9ja0lzSW5PcHBvc2l0ZURpcmVjdGlvbiAmJiAoIW9mZnNldCB8fCBvZmZzZXQg
PT0gbV9sZW4pKQogICAgICAgICByZXR1cm4gIW9mZnNldCA/IG1fbGVuIDogMDsKICAgICByZXR1
cm4gb2Zmc2V0OwpAQCAtMTI1OSwxMiArMTI0OCwxMyBAQCBmbG9hdCBJbmxpbmVUZXh0Qm94Ojpw
b3NpdGlvbkZvck9mZnNldChpCiAgICAgICAgIHJldHVybiBsb2dpY2FsTGVmdCgpOwogCiAgICAg
UmVuZGVyVGV4dCogdGV4dCA9IHRvUmVuZGVyVGV4dChyZW5kZXJlcigpKTsKLSAgICBjb25zdCBG
b250JiBmID0gdGV4dC0+c3R5bGUobV9maXJzdExpbmUpLT5mb250KCk7CisgICAgUmVuZGVyU3R5
bGUqIHN0eWxlVG9Vc2UgPSB0ZXh0LT5zdHlsZShtX2ZpcnN0TGluZSk7CisgICAgQVNTRVJUKHN0
eWxlVG9Vc2UpOworICAgIGNvbnN0IEZvbnQmIGYgPSBzdHlsZVRvVXNlLT5mb250KCk7CiAgICAg
aW50IGZyb20gPSAhaXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gb2Zmc2V0IC0gbV9zdGFydCA6
IDA7CiAgICAgaW50IHRvID0gIWlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IG1fbGVuIDogb2Zm
c2V0IC0gbV9zdGFydDsKICAgICAvLyBGSVhNRTogRG8gd2UgbmVlZCB0byBhZGQgcmlnaHRCZWFy
aW5nIGhlcmU/Ci0gICAgcmV0dXJuIGYuc2VsZWN0aW9uUmVjdEZvclRleHQoVGV4dFJ1bih0ZXh0
LT50ZXh0KCktPmNoYXJhY3RlcnMoKSArIG1fc3RhcnQsIG1fbGVuLCB0ZXh0UmVuZGVyZXIoKS0+
YWxsb3dUYWJzKCksIHRleHRQb3MoKSwgbV9leHBhbnNpb24sIGV4cGFuc2lvbkJlaGF2aW9yKCks
IGRpcmVjdGlvbigpLCBtX2Rpck92ZXJyaWRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBJbnRQb2ludChsb2dpY2FsTGVmdCgpLCAwKSwgMCwgZnJvbSwgdG8pLm1heFgoKTsK
KyAgICByZXR1cm4gZi5zZWxlY3Rpb25SZWN0Rm9yVGV4dChjb25zdHJ1Y3RUZXh0UnVuKHN0eWxl
VG9Vc2UpLCBJbnRQb2ludChsb2dpY2FsTGVmdCgpLCAwKSwgMCwgZnJvbSwgdG8pLm1heFgoKTsK
IH0KIAogYm9vbCBJbmxpbmVUZXh0Qm94Ojpjb250YWluc0NhcmV0T2Zmc2V0KGludCBvZmZzZXQp
IGNvbnN0CkBAIC0xMjkxLDYgKzEyODEsMzEgQEAgYm9vbCBJbmxpbmVUZXh0Qm94Ojpjb250YWlu
c0NhcmV0T2Zmc2V0KAogICAgIHJldHVybiB0cnVlOwogfQogCitUZXh0UnVuIElubGluZVRleHRC
b3g6OmNvbnN0cnVjdFRleHRSdW4oUmVuZGVyU3R5bGUqIHN0eWxlLCBCdWZmZXJGb3JBcHBlbmRp
bmdIeXBoZW4qIGNoYXJhY3RlcnNXaXRoSHlwaGVuKSBjb25zdAoreworICAgIEFTU0VSVChzdHls
ZSk7CisKKyAgICBSZW5kZXJUZXh0KiB0ZXh0UmVuZGVyZXIgPSB0aGlzLT50ZXh0UmVuZGVyZXIo
KTsKKyAgICBBU1NFUlQodGV4dFJlbmRlcmVyKTsKKyAgICBBU1NFUlQodGV4dFJlbmRlcmVyLT5j
aGFyYWN0ZXJzKCkpOworCisgICAgcmV0dXJuIGNvbnN0cnVjdFRleHRSdW4oc3R5bGUsIHRleHRS
ZW5kZXJlci0+Y2hhcmFjdGVycygpICsgc3RhcnQoKSwgbGVuKCksIGNoYXJhY3RlcnNXaXRoSHlw
aGVuKTsKK30KKworVGV4dFJ1biBJbmxpbmVUZXh0Qm94Ojpjb25zdHJ1Y3RUZXh0UnVuKFJlbmRl
clN0eWxlKiBzdHlsZSwgY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgsIEJ1ZmZl
ckZvckFwcGVuZGluZ0h5cGhlbiogY2hhcmFjdGVyc1dpdGhIeXBoZW4pIGNvbnN0Cit7CisgICAg
QVNTRVJUKHN0eWxlKTsKKworICAgIFJlbmRlclRleHQqIHRleHRSZW5kZXJlciA9IHRoaXMtPnRl
eHRSZW5kZXJlcigpOworICAgIEFTU0VSVCh0ZXh0UmVuZGVyZXIpOworCisgICAgaWYgKGNoYXJh
Y3RlcnNXaXRoSHlwaGVuKQorICAgICAgICBhZGp1c3RDaGFyYWN0ZXJzQW5kTGVuZ3RoRm9ySHlw
aGVuKCpjaGFyYWN0ZXJzV2l0aEh5cGhlbiwgc3R5bGUsIGNoYXJhY3RlcnMsIGxlbmd0aCk7CisK
KyAgICAvLyBGSVhNRTogUmVtb3ZlIFRleHRSdW5zIGFsbC1pbi1vbmUtY29uc3RydWN0b3IgYW5k
IHVzZSBleHBsaWNpdCBzZXR0ZXJzIGhlcmUuCisgICAgcmV0dXJuIFRleHRSdW4oY2hhcmFjdGVy
cywgbGVuZ3RoLCB0ZXh0UmVuZGVyZXItPmFsbG93VGFicygpLCB0ZXh0UG9zKCksIGV4cGFuc2lv
bigpLCBleHBhbnNpb25CZWhhdmlvcigpLCBkaXJlY3Rpb24oKSwgbV9kaXJPdmVycmlkZSB8fCBz
dHlsZS0+dmlzdWFsbHlPcmRlcmVkKCkpOworfQorCiAjaWZuZGVmIE5ERUJVRwogCiBjb25zdCBj
aGFyKiBJbmxpbmVUZXh0Qm94Ojpib3hOYW1lKCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL0lubGluZVRleHRCb3guaAkocmV2aXNpb24gODYxMzEpCisrKyBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICsz
NCw3IEBAIHN0cnVjdCBEb2N1bWVudE1hcmtlcjsKIAogY29uc3QgdW5zaWduZWQgc2hvcnQgY05v
VHJ1bmNhdGlvbiA9IFVTSFJUX01BWDsKIGNvbnN0IHVuc2lnbmVkIHNob3J0IGNGdWxsVHJ1bmNh
dGlvbiA9IFVTSFJUX01BWCAtIDE7Cit0eXBlZGVmIFZlY3RvcjxVQ2hhciwgMjU2PiBCdWZmZXJG
b3JBcHBlbmRpbmdIeXBoZW47CiAKIC8vIEhlbHBlciBmdW5jdGlvbnMgc2hhcmVkIGJ5IElubGlu
ZVRleHRCb3ggLyBTVkdSb290SW5saW5lQm94CiB2b2lkIHVwZGF0ZUdyYXBoaWNzQ29udGV4dChH
cmFwaGljc0NvbnRleHQqLCBjb25zdCBDb2xvciYgZmlsbENvbG9yLCBjb25zdCBDb2xvciYgc3Ry
b2tlQ29sb3IsIGZsb2F0IHN0cm9rZVRoaWNrbmVzcywgQ29sb3JTcGFjZSk7CkBAIC05OCw2ICs5
OSw5IEBAIHByaXZhdGU6CiAgICAgaW50IHNlbGVjdGlvbkJvdHRvbSgpOwogICAgIGludCBzZWxl
Y3Rpb25IZWlnaHQoKTsKIAorICAgIFRleHRSdW4gY29uc3RydWN0VGV4dFJ1bihSZW5kZXJTdHls
ZSosIEJ1ZmZlckZvckFwcGVuZGluZ0h5cGhlbiogPSAwKSBjb25zdDsKKyAgICBUZXh0UnVuIGNv
bnN0cnVjdFRleHRSdW4oUmVuZGVyU3R5bGUqLCBjb25zdCBVQ2hhciosIGludCBsZW5ndGgsIEJ1
ZmZlckZvckFwcGVuZGluZ0h5cGhlbiogPSAwKSBjb25zdDsKKwogcHVibGljOgogICAgIHZpcnR1
YWwgSW50UmVjdCBjYWxjdWxhdGVCb3VuZGFyaWVzKCkgY29uc3QgeyByZXR1cm4gSW50UmVjdCh4
KCksIHkoKSwgd2lkdGgoKSwgaGVpZ2h0KCkpOyB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkocmV2aXNpb24gODYxMzEpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MzIyLDYgKzYz
MjIsMjcgQEAgaW5saW5lIHZvaWQgUmVuZGVyQmxvY2s6OkZsb2F0aW5nT2JqZWN0cwogICAgICAg
ICBtX3JpZ2h0T2JqZWN0c0NvdW50LS07CiB9CiAKK1RleHRSdW4gUmVuZGVyQmxvY2s6OmNvbnN0
cnVjdFRleHRSdW5BbGxvd1RyYWlsaW5nRXhwYW5zaW9uKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJz
LCBpbnQgbGVuZ3RoLCBSZW5kZXJTdHlsZSogc3R5bGUsIFRleHRSdW5GbGFncyBmbGFncykKK3sK
KyAgICBBU1NFUlQoc3R5bGUpOworCisgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0g
TFRSOworICAgIGJvb2wgZGlyZWN0aW9uYWxPdmVycmlkZSA9IHN0eWxlLT52aXN1YWxseU9yZGVy
ZWQoKTsKKyAgICBpZiAoZmxhZ3MgIT0gRGVmYXVsdFRleHRSdW5GbGFncykgeworICAgICAgICBp
ZiAoZmxhZ3MgJiBSZXNwZWN0RGlyZWN0aW9uKQorICAgICAgICAgICAgdGV4dERpcmVjdGlvbiA9
IHN0eWxlLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgaWYgKGZsYWdzICYgUmVzcGVjdERpcmVjdGlv
bk92ZXJyaWRlKQorICAgICAgICAgICAgZGlyZWN0aW9uYWxPdmVycmlkZSB8PSBzdHlsZS0+dW5p
Y29kZUJpZGkoKSA9PSBPdmVycmlkZTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogUmVtb3ZlIFRl
eHRSdW5zIGFsbC1pbi1vbmUtY29uc3RydWN0b3IgYW5kIHVzZSBleHBsaWNpdCBzZXR0ZXJzIGhl
cmUuCisgICAgcmV0dXJuIFRleHRSdW4oY2hhcmFjdGVycywgbGVuZ3RoLCBmYWxzZSwgMCwgMCwg
VGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgdGV4dERpcmVjdGlvbiwgZGlyZWN0aW9u
YWxPdmVycmlkZSk7Cit9CisKK1RleHRSdW4gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW5B
bGxvd1RyYWlsaW5nRXhwYW5zaW9uKGNvbnN0IFN0cmluZyYgc3RyaW5nLCBSZW5kZXJTdHlsZSog
c3R5bGUsIFRleHRSdW5GbGFncyBmbGFncykKK3sKKyAgICByZXR1cm4gY29uc3RydWN0VGV4dFJ1
bkFsbG93VHJhaWxpbmdFeHBhbnNpb24oc3RyaW5nLmNoYXJhY3RlcnMoKSwgc3RyaW5nLmxlbmd0
aCgpLCBzdHlsZSwgZmxhZ3MpOworfQogCiAjaWZuZGVmIE5ERUJVRwogCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkocmV2aXNpb24gODYxMzEpCisrKyBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtNTQsNiAr
NTQsMTQgQEAgdHlwZWRlZiBNaWRwb2ludFN0YXRlPElubGluZUl0ZXJhdG9yPiBMaQogCiBlbnVt
IENhcmV0VHlwZSB7IEN1cnNvckNhcmV0LCBEcmFnQ2FyZXQgfTsKIAorZW51bSBUZXh0UnVuRmxh
ZyB7CisgICAgRGVmYXVsdFRleHRSdW5GbGFncyA9IDAsCisgICAgUmVzcGVjdERpcmVjdGlvbiA9
IDEgPDwgMCwKKyAgICBSZXNwZWN0RGlyZWN0aW9uT3ZlcnJpZGUgPSAxIDw8IDEKK307CisKK3R5
cGVkZWYgdW5zaWduZWQgVGV4dFJ1bkZsYWdzOworCiBjbGFzcyBSZW5kZXJCbG9jayA6IHB1Ymxp
YyBSZW5kZXJCb3ggewogcHVibGljOgogICAgIFJlbmRlckJsb2NrKE5vZGUqKTsKQEAgLTE2MCw2
ICsxNjgsOSBAQCBwdWJsaWM6CiAgICAgCiAgICAgc3RhdGljIHZvaWQgYXBwZW5kUnVuc0Zvck9i
amVjdChCaWRpUnVuTGlzdDxCaWRpUnVuPiYsIGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2Jq
ZWN0KiwgSW5saW5lQmlkaVJlc29sdmVyJik7CiAKKyAgICBzdGF0aWMgVGV4dFJ1biBjb25zdHJ1
Y3RUZXh0UnVuQWxsb3dUcmFpbGluZ0V4cGFuc2lvbihjb25zdCBTdHJpbmcmLCBSZW5kZXJTdHls
ZSosIFRleHRSdW5GbGFncyA9IERlZmF1bHRUZXh0UnVuRmxhZ3MpOworICAgIHN0YXRpYyBUZXh0
UnVuIGNvbnN0cnVjdFRleHRSdW5BbGxvd1RyYWlsaW5nRXhwYW5zaW9uKGNvbnN0IFVDaGFyKiwg
aW50IGxlbmd0aCwgUmVuZGVyU3R5bGUqLCBUZXh0UnVuRmxhZ3MgPSBEZWZhdWx0VGV4dFJ1bkZs
YWdzKTsKKwogICAgIENvbHVtbkluZm8qIGNvbHVtbkluZm8oKSBjb25zdDsKICAgICBpbnQgY29s
dW1uR2FwKCkgY29uc3Q7CiAgICAgCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyRW1iZWRkZWRPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJFbWJlZGRlZE9iamVjdC5jcHAJKHJldmlzaW9uIDg2MTMxKQorKysgU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckVtYmVkZGVkT2JqZWN0LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTk3LDcgKzE5Nyw3IEBAIGJvb2wgUmVuZGVyRW1iZWRkZWRPYmplY3Q6OmdldFJlcGxh
Y2VtZW4KICAgICBmb250ID0gRm9udChmb250RGVzY3JpcHRpb24sIDAsIDApOwogICAgIGZvbnQu
dXBkYXRlKDApOwogICAgIAotICAgIHJ1biA9IFRleHRSdW4obV9yZXBsYWNlbWVudFRleHQuY2hh
cmFjdGVycygpLCBtX3JlcGxhY2VtZW50VGV4dC5sZW5ndGgoKSk7CisgICAgcnVuID0gVGV4dFJ1
bihtX3JlcGxhY2VtZW50VGV4dCk7CiAgICAgdGV4dFdpZHRoID0gZm9udC53aWR0aChydW4pOwog
ICAgIAogICAgIHJlcGxhY2VtZW50VGV4dFJlY3Quc2V0U2l6ZShGbG9hdFNpemUodGV4dFdpZHRo
ICsgcmVwbGFjZW1lbnRUZXh0Um91bmRlZFJlY3RMZWZ0UmlnaHRUZXh0TWFyZ2luICogMiwgcmVw
bGFjZW1lbnRUZXh0Um91bmRlZFJlY3RIZWlnaHQpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJGaWxlVXBsb2FkQ29udHJvbC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckZpbGVVcGxvYWRDb250cm9sLmNwcAkocmV2aXNpb24g
ODYxMzEpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRmlsZVVwbG9hZENvbnRy
b2wuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjEsMTAgKzIyMSw4IEBAIHZvaWQgUmVuZGVyRmls
ZVVwbG9hZENvbnRyb2w6OnBhaW50T2JqZWMKIAogICAgIGlmIChwYWludEluZm8ucGhhc2UgPT0g
UGFpbnRQaGFzZUZvcmVncm91bmQpIHsKICAgICAgICAgY29uc3QgU3RyaW5nJiBkaXNwbGF5ZWRG
aWxlbmFtZSA9IGZpbGVUZXh0VmFsdWUoKTsKLSAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gZGlz
cGxheWVkRmlsZW5hbWUubGVuZ3RoKCk7Ci0gICAgICAgIGNvbnN0IFVDaGFyKiBzdHJpbmcgPSBk
aXNwbGF5ZWRGaWxlbmFtZS5jaGFyYWN0ZXJzKCk7Ci0gICAgICAgIFRleHRSdW4gdGV4dFJ1bihz
dHJpbmcsIGxlbmd0aCwgZmFsc2UsIDAsIDAsIFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNp
b24sIHN0eWxlKCktPmRpcmVjdGlvbigpLCBzdHlsZSgpLT51bmljb2RlQmlkaSgpID09IE92ZXJy
aWRlKTsKLSAgICAgICAgCisgICAgICAgIFRleHRSdW4gdGV4dFJ1biA9IGNvbnN0cnVjdFRleHRS
dW5BbGxvd1RyYWlsaW5nRXhwYW5zaW9uKGRpc3BsYXllZEZpbGVuYW1lLCBzdHlsZSgpLCBSZXNw
ZWN0RGlyZWN0aW9uIHwgUmVzcGVjdERpcmVjdGlvbk92ZXJyaWRlKTsKKwogICAgICAgICAvLyBE
ZXRlcm1pbmUgd2hlcmUgdGhlIGZpbGVuYW1lIHNob3VsZCBiZSBwbGFjZWQKICAgICAgICAgaW50
IGNvbnRlbnRMZWZ0ID0gdHggKyBib3JkZXJMZWZ0KCkgKyBwYWRkaW5nTGVmdCgpOwogICAgICAg
ICBpbnQgYnV0dG9uQW5kSWNvbldpZHRoID0gbV9idXR0b24tPnJlbmRlckJveCgpLT53aWR0aCgp
ICsgYWZ0ZXJCdXR0b25TcGFjaW5nCkBAIC0yNzAsMjcgKzI2OCwzMCBAQCB2b2lkIFJlbmRlckZp
bGVVcGxvYWRDb250cm9sOjpjb21wdXRlUHJlCiAgICAgbV9taW5QcmVmZXJyZWRMb2dpY2FsV2lk
dGggPSAwOwogICAgIG1fbWF4UHJlZmVycmVkTG9naWNhbFdpZHRoID0gMDsKIAotICAgIGlmIChz
dHlsZSgpLT53aWR0aCgpLmlzRml4ZWQoKSAmJiBzdHlsZSgpLT53aWR0aCgpLnZhbHVlKCkgPiAw
KQotICAgICAgICBtX21pblByZWZlcnJlZExvZ2ljYWxXaWR0aCA9IG1fbWF4UHJlZmVycmVkTG9n
aWNhbFdpZHRoID0gY29tcHV0ZUNvbnRlbnRCb3hMb2dpY2FsV2lkdGgoc3R5bGUoKS0+d2lkdGgo
KS52YWx1ZSgpKTsKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSB0aGlzLT5zdHlsZSgpOworICAg
IEFTU0VSVChzdHlsZSk7CisKKyAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNGaXhlZCgpICYmIHN0
eWxlLT53aWR0aCgpLnZhbHVlKCkgPiAwKQorICAgICAgICBtX21pblByZWZlcnJlZExvZ2ljYWxX
aWR0aCA9IG1fbWF4UHJlZmVycmVkTG9naWNhbFdpZHRoID0gY29tcHV0ZUNvbnRlbnRCb3hMb2dp
Y2FsV2lkdGgoc3R5bGUtPndpZHRoKCkudmFsdWUoKSk7CiAgICAgZWxzZSB7CiAgICAgICAgIC8v
IEZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgZmlsZW5hbWUgc3BhY2UgbmVlZHMgdG8gYmUgZm9yIGEg
Z2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMKICAgICAgICAgLy8gKHVzaW5nICIwIiBhcyB0aGUg
bm9taW5hbCBjaGFyYWN0ZXIpLgogICAgICAgICBjb25zdCBVQ2hhciBjaCA9ICcwJzsKLSAgICAg
ICAgZmxvYXQgY2hhcldpZHRoID0gc3R5bGUoKS0+Zm9udCgpLndpZHRoKFRleHRSdW4oJmNoLCAx
LCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbikpOworICAgICAg
ICBmbG9hdCBjaGFyV2lkdGggPSBzdHlsZS0+Zm9udCgpLndpZHRoKGNvbnN0cnVjdFRleHRSdW5B
bGxvd1RyYWlsaW5nRXhwYW5zaW9uKFN0cmluZygmY2gsIDEpLCBzdHlsZSkpOwogICAgICAgICBt
X21heFByZWZlcnJlZExvZ2ljYWxXaWR0aCA9IChpbnQpY2VpbGYoY2hhcldpZHRoICogZGVmYXVs
dFdpZHRoTnVtQ2hhcnMpOwogICAgIH0KIAotICAgIGlmIChzdHlsZSgpLT5taW5XaWR0aCgpLmlz
Rml4ZWQoKSAmJiBzdHlsZSgpLT5taW5XaWR0aCgpLnZhbHVlKCkgPiAwKSB7Ci0gICAgICAgIG1f
bWF4UHJlZmVycmVkTG9naWNhbFdpZHRoID0gbWF4KG1fbWF4UHJlZmVycmVkTG9naWNhbFdpZHRo
LCBjb21wdXRlQ29udGVudEJveExvZ2ljYWxXaWR0aChzdHlsZSgpLT5taW5XaWR0aCgpLnZhbHVl
KCkpKTsKLSAgICAgICAgbV9taW5QcmVmZXJyZWRMb2dpY2FsV2lkdGggPSBtYXgobV9taW5QcmVm
ZXJyZWRMb2dpY2FsV2lkdGgsIGNvbXB1dGVDb250ZW50Qm94TG9naWNhbFdpZHRoKHN0eWxlKCkt
Pm1pbldpZHRoKCkudmFsdWUoKSkpOwotICAgIH0gZWxzZSBpZiAoc3R5bGUoKS0+d2lkdGgoKS5p
c1BlcmNlbnQoKSB8fCAoc3R5bGUoKS0+d2lkdGgoKS5pc0F1dG8oKSAmJiBzdHlsZSgpLT5oZWln
aHQoKS5pc1BlcmNlbnQoKSkpCisgICAgaWYgKHN0eWxlLT5taW5XaWR0aCgpLmlzRml4ZWQoKSAm
JiBzdHlsZS0+bWluV2lkdGgoKS52YWx1ZSgpID4gMCkgeworICAgICAgICBtX21heFByZWZlcnJl
ZExvZ2ljYWxXaWR0aCA9IG1heChtX21heFByZWZlcnJlZExvZ2ljYWxXaWR0aCwgY29tcHV0ZUNv
bnRlbnRCb3hMb2dpY2FsV2lkdGgoc3R5bGUtPm1pbldpZHRoKCkudmFsdWUoKSkpOworICAgICAg
ICBtX21pblByZWZlcnJlZExvZ2ljYWxXaWR0aCA9IG1heChtX21pblByZWZlcnJlZExvZ2ljYWxX
aWR0aCwgY29tcHV0ZUNvbnRlbnRCb3hMb2dpY2FsV2lkdGgoc3R5bGUtPm1pbldpZHRoKCkudmFs
dWUoKSkpOworICAgIH0gZWxzZSBpZiAoc3R5bGUtPndpZHRoKCkuaXNQZXJjZW50KCkgfHwgKHN0
eWxlLT53aWR0aCgpLmlzQXV0bygpICYmIHN0eWxlLT5oZWlnaHQoKS5pc1BlcmNlbnQoKSkpCiAg
ICAgICAgIG1fbWluUHJlZmVycmVkTG9naWNhbFdpZHRoID0gMDsKICAgICBlbHNlCiAgICAgICAg
IG1fbWluUHJlZmVycmVkTG9naWNhbFdpZHRoID0gbV9tYXhQcmVmZXJyZWRMb2dpY2FsV2lkdGg7
CiAKLSAgICBpZiAoc3R5bGUoKS0+bWF4V2lkdGgoKS5pc0ZpeGVkKCkgJiYgc3R5bGUoKS0+bWF4
V2lkdGgoKS52YWx1ZSgpICE9IHVuZGVmaW5lZExlbmd0aCkgewotICAgICAgICBtX21heFByZWZl
cnJlZExvZ2ljYWxXaWR0aCA9IG1pbihtX21heFByZWZlcnJlZExvZ2ljYWxXaWR0aCwgY29tcHV0
ZUNvbnRlbnRCb3hMb2dpY2FsV2lkdGgoc3R5bGUoKS0+bWF4V2lkdGgoKS52YWx1ZSgpKSk7Ci0g
ICAgICAgIG1fbWluUHJlZmVycmVkTG9naWNhbFdpZHRoID0gbWluKG1fbWluUHJlZmVycmVkTG9n
aWNhbFdpZHRoLCBjb21wdXRlQ29udGVudEJveExvZ2ljYWxXaWR0aChzdHlsZSgpLT5tYXhXaWR0
aCgpLnZhbHVlKCkpKTsKKyAgICBpZiAoc3R5bGUtPm1heFdpZHRoKCkuaXNGaXhlZCgpICYmIHN0
eWxlLT5tYXhXaWR0aCgpLnZhbHVlKCkgIT0gdW5kZWZpbmVkTGVuZ3RoKSB7CisgICAgICAgIG1f
bWF4UHJlZmVycmVkTG9naWNhbFdpZHRoID0gbWluKG1fbWF4UHJlZmVycmVkTG9naWNhbFdpZHRo
LCBjb21wdXRlQ29udGVudEJveExvZ2ljYWxXaWR0aChzdHlsZS0+bWF4V2lkdGgoKS52YWx1ZSgp
KSk7CisgICAgICAgIG1fbWluUHJlZmVycmVkTG9naWNhbFdpZHRoID0gbWluKG1fbWluUHJlZmVy
cmVkTG9naWNhbFdpZHRoLCBjb21wdXRlQ29udGVudEJveExvZ2ljYWxXaWR0aChzdHlsZS0+bWF4
V2lkdGgoKS52YWx1ZSgpKSk7CiAgICAgfQogCiAgICAgaW50IHRvQWRkID0gYm9yZGVyQW5kUGFk
ZGluZ1dpZHRoKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVySW1hZ2Uu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJJbWFnZS5j
cHAJKHJldmlzaW9uIDg2MTMxKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlcklt
YWdlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTA0LDcgKzEwNCw3IEBAIGJvb2wgUmVuZGVySW1h
Z2U6OnNldEltYWdlU2l6ZUZvckFsdFRleHQKICAgICAvLyB3ZSBoYXZlIGFuIGFsdCBhbmQgdGhl
IHVzZXIgbWVhbnQgaXQgKGl0cyBub3QgYSB0ZXh0IHdlIGludmVudGVkKQogICAgIGlmICghbV9h
bHRUZXh0LmlzRW1wdHkoKSkgewogICAgICAgICBjb25zdCBGb250JiBmb250ID0gc3R5bGUoKS0+
Zm9udCgpOwotICAgICAgICBJbnRTaXplIHRleHRTaXplKG1pbihmb250LndpZHRoKFRleHRSdW4o
bV9hbHRUZXh0LmNoYXJhY3RlcnMoKSwgbV9hbHRUZXh0Lmxlbmd0aCgpKSksIG1heEFsdFRleHRX
aWR0aCksIG1pbihmb250LmZvbnRNZXRyaWNzKCkuaGVpZ2h0KCksIG1heEFsdFRleHRIZWlnaHQp
KTsKKyAgICAgICAgSW50U2l6ZSB0ZXh0U2l6ZShtaW4oZm9udC53aWR0aChUZXh0UnVuKG1fYWx0
VGV4dCkpLCBtYXhBbHRUZXh0V2lkdGgpLCBtaW4oZm9udC5mb250TWV0cmljcygpLmhlaWdodCgp
LCBtYXhBbHRUZXh0SGVpZ2h0KSk7CiAgICAgICAgIGltYWdlU2l6ZSA9IGltYWdlU2l6ZS5leHBh
bmRlZFRvKHRleHRTaXplKTsKICAgICB9CiAKQEAgLTI4Niw3ICsyODYsNyBAQCB2b2lkIFJlbmRl
ckltYWdlOjpwYWludFJlcGxhY2VkKFBhaW50SW5mCiAKICAgICAgICAgICAgICAgICAvLyBPbmx5
IGRyYXcgdGhlIGFsdCB0ZXh0IGlmIGl0J2xsIGZpdCB3aXRoaW4gdGhlIGNvbnRlbnQgYm94LAog
ICAgICAgICAgICAgICAgIC8vIGFuZCBvbmx5IGlmIGl0IGZpdHMgYWJvdmUgdGhlIGVycm9yIGlt
YWdlLgotICAgICAgICAgICAgICAgIFRleHRSdW4gdGV4dFJ1bih0ZXh0LmNoYXJhY3RlcnMoKSwg
dGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgVGV4dFJ1biB0ZXh0UnVuKHRleHQpOwog
ICAgICAgICAgICAgICAgIGludCB0ZXh0V2lkdGggPSBmb250LndpZHRoKHRleHRSdW4pOwogICAg
ICAgICAgICAgICAgIGlmIChlcnJvclBpY3R1cmVEcmF3bikgewogICAgICAgICAgICAgICAgICAg
ICBpZiAodXNhYmxlV2lkdGggPj0gdGV4dFdpZHRoICYmIGZvbnRNZXRyaWNzLmhlaWdodCgpIDw9
IGltYWdlWSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMaXN0Qm94LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGlzdEJveC5j
cHAJKHJldmlzaW9uIDg2MTMxKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxp
c3RCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTgsNyArMTE4LDcgQEAgdm9pZCBSZW5kZXJM
aXN0Qm94Ojp1cGRhdGVGcm9tRWxlbWVudCgpCiAKICAgICAgICAgICAgIGlmICghdGV4dC5pc0Vt
cHR5KCkpIHsKICAgICAgICAgICAgICAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgYWx3YXlzIExU
Uj8gQ2FuJ3QgdGV4dCBkaXJlY3Rpb24gYWZmZWN0IHRoZSB3aWR0aD8KLSAgICAgICAgICAgICAg
ICBmbG9hdCB0ZXh0V2lkdGggPSBpdGVtRm9udC53aWR0aChUZXh0UnVuKHRleHQuaW1wbCgpLCBm
YWxzZSwgMCwgMCwgVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgTFRSKSk7CisgICAg
ICAgICAgICAgICAgZmxvYXQgdGV4dFdpZHRoID0gaXRlbUZvbnQud2lkdGgoY29uc3RydWN0VGV4
dFJ1bkFsbG93VHJhaWxpbmdFeHBhbnNpb24odGV4dCwgc3R5bGUoKSkpOwogICAgICAgICAgICAg
ICAgIHdpZHRoID0gbWF4KHdpZHRoLCB0ZXh0V2lkdGgpOwogICAgICAgICAgICAgfQogICAgICAg
ICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJv
bC5jcHAJKHJldmlzaW9uIDg2MTMxKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
clRleHRDb250cm9sLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQyLDcgKzU0Miw3IEBAIGZsb2F0
IFJlbmRlclRleHRDb250cm9sOjpnZXRBdmdDaGFyV2lkdGgKICAgICAgICAgcmV0dXJuIHJvdW5k
ZihzdHlsZSgpLT5mb250KCkucHJpbWFyeUZvbnQoKS0+YXZnQ2hhcldpZHRoKCkpOwogCiAgICAg
Y29uc3QgVUNoYXIgY2ggPSAnMCc7Ci0gICAgcmV0dXJuIHN0eWxlKCktPmZvbnQoKS53aWR0aChU
ZXh0UnVuKCZjaCwgMSwgZmFsc2UsIDAsIDAsIFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNp
b24pKTsKKyAgICByZXR1cm4gc3R5bGUoKS0+Zm9udCgpLndpZHRoKGNvbnN0cnVjdFRleHRSdW5B
bGxvd1RyYWlsaW5nRXhwYW5zaW9uKFN0cmluZygmY2gsIDEpLCBzdHlsZSgpKSk7CiB9CiAKIGZs
b2F0IFJlbmRlclRleHRDb250cm9sOjpzY2FsZUVtVG9Vbml0cyhpbnQgeCkgY29uc3QK
</data>
<flag name="review"
          id="85988"
          type_id="1"
          status="+"
          setter="krit"
    />
    <flag name="commit-queue"
          id="86874"
          type_id="3"
          status="-"
          setter="krit"
    />
          </attachment>
      

    </bug>

</bugzilla>