<?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>79867</bug_id>
          
          <creation_ts>2012-02-28 21:47:01 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream GraphicsLayerBlackBerry.{h, cpp}</short_desc>
          <delta_ts>2012-03-08 01:46:20 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</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>73119</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Robin Cao">robin.webkit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>arvid2.nilsson</cc>
    
    <cc>charles.wei</cc>
    
    <cc>leo.yang</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>567360</commentid>
    <comment_count>0</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-02-28 21:47:01 -0800</bug_when>
    <thetext>This is the BlackBerry implementation of GraphicsLayer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567494</commentid>
    <comment_count>1</comment_count>
      <attachid>129411</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-02-29 01:18:40 -0800</bug_when>
    <thetext>Created attachment 129411
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>567616</commentid>
    <comment_count>2</comment_count>
      <attachid>129411</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-29 07:33:36 -0800</bug_when>
    <thetext>Comment on attachment 129411
patch

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

Looks good but can be cleaned up a bit more.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:53
&gt; +#include &quot;NotImplemented.h&quot;

Not used?

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:58
&gt; +#include &lt;wtf/text/CString.h&gt;

Check for all includes if they are needed please.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:71
&gt; +    layer.setBorderColor(static_cast&lt;RGBA32&gt;(0));

Better use transparant from Color.h

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:81
&gt; +    layer.setBackgroundColor(static_cast&lt;RGBA32&gt;(0));

Ditto.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:278
&gt; +void GraphicsLayerBlackBerry::setHasFixedContainer(bool b)

b is not a good param name here.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:287
&gt; +void GraphicsLayerBlackBerry::setHasFixedAncestorInDOMTree(bool b)

Ditto.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:400
&gt; +    // This is what GraphicsLayerCA checks for

Lacks period.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:404
&gt; +    // We only support these two kinds of properties ATM

Ditto.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:406
&gt; +     &amp;&amp; values.property() != AnimatedPropertyOpacity)

Can be put on one line.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:433
&gt; +    while (animation = removeAnimationByName(animationName, m_runningAnimations)) {

Can be combined.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.h:37
&gt; +#include &quot;GraphicsContext.h&quot;

Needed?

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.h:39
&gt; +#include &quot;LayerAnimation.h&quot;

Needed?

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.h:98
&gt; +    virtual void removeAnimation(const String&amp; /*animationName*/);

Why comment the param names?

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.h:172
&gt; +    ContentsLayerPurpose m_contentsLayerPurpose;

You should be able to compress this a bit by giving it 2 bits :
ContentsLayerPurpose m_contentsLayerPurpose : 2;
But make sure our compiler really decreases the object size, just try with sizeof before and after.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568420</commentid>
    <comment_count>3</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-01 00:12:12 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 129411 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=129411&amp;action=review
&gt; 
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.h:172
&gt; &gt; +    ContentsLayerPurpose m_contentsLayerPurpose;
&gt; 
&gt; You should be able to compress this a bit by giving it 2 bits :
&gt; ContentsLayerPurpose m_contentsLayerPurpose : 2;
&gt; But make sure our compiler really decreases the object size, just try with sizeof before and after.

I tried the bit-field, but sizeof(GraphicsLayerBlackBerry) gives the same result. I prefer not to change it.

All the other comments will be addressed in a revised patch. Thank you very much!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>568431</commentid>
    <comment_count>4</comment_count>
      <attachid>129652</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-01 00:19:58 -0800</bug_when>
    <thetext>Created attachment 129652
patch v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>570958</commentid>
    <comment_count>5</comment_count>
      <attachid>129652</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-05 12:41:37 -0800</bug_when>
    <thetext>Comment on attachment 129652
patch v2

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

Looks good, can be cleaned up some more.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:54
&gt; +#include &quot;PlatformString.h&quot;

Is PlatformString.h include really needed?

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:56
&gt; +using namespace std;

Might not be needed if you use clampTo.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:332
&gt; +    float clampedOpacity = max(min(opacity, 1.0f), 0.0f);

better use clampTo from MathExtras.h to make clear what you are doing here.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:356
&gt; +        m_layer-&gt;setNeedsDisplayInRect(rect);

You could look at putting some the one/two liners in the header, but only if you do not need to add another include....

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:567
&gt; +}

Above two functions look very similar, can we share code?

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:836
&gt; +    m_contentsLayer-&gt;setPosition(FloatPoint(m_contentsRect.x(), m_contentsRect.y()));

better use m_contentsLayer-&gt;setPosition(m_contentsRect.location());

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:853
&gt; +        m_contentsLayer-&gt;setAnchorPoint(FloatPoint(0, 0));

FloatPoint::zero</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>572732</commentid>
    <comment_count>6</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-07 02:49:35 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 129652 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=129652&amp;action=review
&gt; 
&gt; Looks good, can be cleaned up some more.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:54
&gt; &gt; +#include &quot;PlatformString.h&quot;
&gt; 
&gt; Is PlatformString.h include really needed?
&gt; 

Good catch, this is already indirectly included in GraphicsLayer.h, so can be removed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:56
&gt; &gt; +using namespace std;
&gt; 
&gt; Might not be needed if you use clampTo.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:332
&gt; &gt; +    float clampedOpacity = max(min(opacity, 1.0f), 0.0f);
&gt; 
&gt; better use clampTo from MathExtras.h to make clear what you are doing here.
&gt; 

Fixed, clampTo is much more readable here.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:356
&gt; &gt; +        m_layer-&gt;setNeedsDisplayInRect(rect);
&gt; 
&gt; You could look at putting some the one/two liners in the header, but only if you do not need to add another include....
&gt; 

Moving these two liner to header file will require one more include in the header. So I prefer not to move them.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:567
&gt; &gt; +}
&gt; 
&gt; Above two functions look very similar, can we share code?
&gt; 

The two functions look very similar, but they have some subtle differences, which make it hard to share code here. We can refactor the code later.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:836
&gt; &gt; +    m_contentsLayer-&gt;setPosition(FloatPoint(m_contentsRect.x(), m_contentsRect.y()));
&gt; 
&gt; better use m_contentsLayer-&gt;setPosition(m_contentsRect.location());
&gt; 

I made the following changes:
-    m_contentsLayer-&gt;setPosition(FloatPoint(m_contentsRect.x(), m_contentsRect.y()));
-    m_contentsLayer-&gt;setBounds(IntSize(m_contentsRect.width(), m_contentsRect.height()));
+    m_contentsLayer-&gt;setPosition(m_contentsRect.location());
+    m_contentsLayer-&gt;setBounds(m_contentsRect.size());


&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:853
&gt; &gt; +        m_contentsLayer-&gt;setAnchorPoint(FloatPoint(0, 0));
&gt; 
&gt; FloatPoint::zero

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>572738</commentid>
    <comment_count>7</comment_count>
      <attachid>130582</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-07 02:57:08 -0800</bug_when>
    <thetext>Created attachment 130582
patch v3</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573051</commentid>
    <comment_count>8</comment_count>
      <attachid>130582</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-03-07 11:30:12 -0800</bug_when>
    <thetext>Comment on attachment 130582
patch v3

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

Almost there, have a look especially at the release issue. Maybe you can get Leo to cq+ for you once fixed.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:146
&gt; +    if (GraphicsLayer::replaceChild(oldChild, newChild)) {

I think early return may look better here.

&gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:384
&gt; +            return layerAnimation.release();

I dont think you want to release here? Note that removeAnimationByIdAndProperty doesnt do it either.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573662</commentid>
    <comment_count>9</comment_count>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-07 23:51:23 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 130582 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=130582&amp;action=review
&gt; 
&gt; Almost there, have a look especially at the release issue. Maybe you can get Leo to cq+ for you once fixed.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:146
&gt; &gt; +    if (GraphicsLayer::replaceChild(oldChild, newChild)) {
&gt; 
&gt; I think early return may look better here.
&gt; 
Fixed.

&gt; &gt; Source/WebCore/platform/graphics/blackberry/GraphicsLayerBlackBerry.cpp:384
&gt; &gt; +            return layerAnimation.release();
&gt; 
&gt; I dont think you want to release here? Note that removeAnimationByIdAndProperty doesn&apos;t do it either.

&quot;return layerAnimation.release();&quot; is equivalent to &quot;return layerAnimation;&quot; in functionality. But for readability and consistency it makes sense to use &quot;return layerAnimation;&quot; in both functions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573670</commentid>
    <comment_count>10</comment_count>
      <attachid>130783</attachid>
    <who name="Robin Cao">robin.webkit</who>
    <bug_when>2012-03-08 00:02:40 -0800</bug_when>
    <thetext>Created attachment 130783
patch-for-landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573715</commentid>
    <comment_count>11</comment_count>
      <attachid>130783</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-08 01:46:14 -0800</bug_when>
    <thetext>Comment on attachment 130783
patch-for-landing

Clearing flags on attachment: 130783

Committed r110156: &lt;http://trac.webkit.org/changeset/110156&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>573716</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-03-08 01:46:20 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129411</attachid>
            <date>2012-02-29 01:18:40 -0800</date>
            <delta_ts>2012-03-01 00:19:46 -0800</delta_ts>
            <desc>patch</desc>
            <filename>bug-79867-20120229171837.patch</filename>
            <type>text/plain</type>
            <size>42122</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5MjAyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYTRmMWIxNTZiNjQyZDc5
NDViNjc0OWM0NDJlOTg3YWVmMjdlYmIyZS4uNmEwYTg5MDc5YTRlN2FkZGE0Mjg0MjcxNTRjZWE3
MTliMDZiNDcyMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk3IEBACisyMDEyLTAyLTI5ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBHcmFwaGljc0xheWVyQmxhY2tCZXJyeS57aCwgY3BwfQorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk4NjcKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBu
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAg
ICAgICAgKFdlYkNvcmU6OnNldExheWVyQm9yZGVyQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
Y2xlYXJCb3JkZXJDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpzZXRMYXllckJhY2tncm91bmRD
b2xvcik6CisgICAgICAgIChXZWJDb3JlOjpjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnkpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6On5HcmFwaGljc0xheWVyQmxh
Y2tCZXJyeSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0
TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q2hp
bGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFkZENo
aWxkKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGls
ZEF0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFk
ZENoaWxkQmVsb3cpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6
OmFkZENoaWxkQWJvdmUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnJlcGxhY2VDaGlsZCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6cmVtb3ZlRnJvbVBhcmVudCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6c2V0UG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6OnNldEFuY2hvclBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5OjpzZXRUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckJsYWNrQmVycnk6OnNldENoaWxkcmVuVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRQcmVzZXJ2ZXMzRCk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TWFza3NUb0JvdW5kcyk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0RHJhd3NDb250ZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c1Zpc2li
bGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE1hc2tM
YXllcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0UmVw
bGljYXRlZEJ5TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnNldEZpeGVkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJs
YWNrQmVycnk6OnNldEhhc0ZpeGVkQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRCYWNrZ3JvdW5kQ29sb3Ip
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmNsZWFyQmFja2dy
b3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXRDb250ZW50c09wYXF1ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRPcGFjaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c05lZWRzRGlzcGxheSk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TmVlZHNEaXNwbGF5KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXROZWVkc0Rpc3BsYXlJblJlY3Qp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRz
UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpyZW1vdmVBbmltYXRpb25CeUlkQW5kUHJvcGVydHkp
OgorICAgICAgICAoV2ViQ29yZTo6cmVtb3ZlQW5pbWF0aW9uQnlOYW1lKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRBbmltYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBhdXNlQW5pbWF0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZW1vdmVBbmltYXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnN1c3BlbmRBbmltYXRp
b25zKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZXN1bWVB
bmltYXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXRDb250ZW50c1RvSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnVwZGF0ZUNvbnRlbnRzSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9DYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9NZWRpYSk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6aG9zdExheWVyRm9yU3VibGF5ZXJzKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpsYXllckZvclN1cGVy
bGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBsYXRm
b3JtTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNl
dERlYnVnQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXREZWJ1Z0JvcmRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xh
eWVyQmxhY2tCZXJyeTo6dXBkYXRlU3VibGF5ZXJMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclBvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclNpemUpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUFuY2hvclBvaW50KToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVUcmFuc2Zv
cm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUNo
aWxkcmVuVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5Ojp1cGRhdGVNYXNrc1RvQm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5Ojp1cGRhdGVDb250ZW50c09wYXF1ZSk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclByZXNlcnZl
czNEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVM
YXllcklzRHJhd2FibGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnVwZGF0ZUZpeGVkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6OnVwZGF0ZUhhc0ZpeGVkQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVl
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXll
ckJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6dXBkYXRlQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNWaWRlbyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNSZWN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXR1cENvbnRlbnRzTGF5ZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZU9wYWNpdHlPbkxheWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpjb250ZW50c1Zp
c2libGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NM
YXllckJsYWNrQmVycnkuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5Ojpub3RpZnlTeW5jUmVxdWlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6Om5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnByaW1hcnlMYXllcik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6Y29udGVudHNMYXllcik6CisKIDIwMTIt
MDItMjggIEFya28gU2FoYSAgPGFya29AbW90b3JvbGEuY29tPgogCiAgICAgICAgIE1pY3JvZGF0
YTogSW1wbGVtZW50IEhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbiBjb2xsZWN0aW9uLm5hbWVkSXRl
bSgpLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2ti
ZXJyeS9HcmFwaGljc0xheWVyQmxhY2tCZXJyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi45Y2JhNzM0MDhjNDc1MDY5MWE2N2IyYzZhY2Y2ZDU3ZTExMmJlYWFjCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9HcmFw
aGljc0xheWVyQmxhY2tCZXJyeS5jcHAKQEAgLTAsMCArMSw4OTUgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworCisvKiogRklYTUUKKyAqIFRoaXMgZmlsZSBib3Jyb3dzIGNvZGUgaGVhdmlseSBm
cm9tIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0xheWVyQ0FDRi5jcHAKKyAqIChhbmQg
aGVuY2UgaXQgaW5jbHVkZXMgYm90aCBjb3B5cmlnaHRzKQorICogSWRlYWxseSB0aGUgY29tbW9u
IGNvZGUgKG1vc3RseSB0aGUgY29kZSB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBsYXllciBoaWVy
YXJjaHkpCisgKiBzaG91bGQgYmUga2VwdCBzZXBhcmF0ZSBhbmQgc2hhcmVkIGJldHdlZW4gcGxh
dGZvcm1zLiBJdCB3b3VsZCBiZSBhIHdlbGwgd29ydGh3aGlsZQorICogZWZmb3J0IG9uY2UgdGhl
IFdpbmRvd3MgaW1wbGVtZW50YXRpb24gKGJpbmFyaWVzIGFuZCBoZWFkZXJzKSBvZiBDb3JlQW5p
bWF0aW9uIGlzCisgKiBjaGVja2VkIGluIHRvIHRoZSBXZWJLaXQgcmVwb3NpdG9yeS4gVW50aWwg
dGhlbiBvbmx5IEFwcGxlIGNhbiBtYWtlIHRoaXMgaGFwcGVuLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUg
IkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJGbG9hdENvbnZlcnNpb24u
aCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUg
IkxheWVyV2ViS2l0VGhyZWFkLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNs
dWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNsdWRl
IDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvU3RyaW5nRXh0cmFzLmg+CisjaW5j
bHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyB2b2lkIHNldExheWVyQm9yZGVyQ29sb3IoTGF5ZXJX
ZWJLaXRUaHJlYWQmIGxheWVyLCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgbGF5ZXIuc2V0
Qm9yZGVyQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVhckJvcmRlckNvbG9yKExh
eWVyV2ViS2l0VGhyZWFkJiBsYXllcikKK3sKKyAgICBsYXllci5zZXRCb3JkZXJDb2xvcihzdGF0
aWNfY2FzdDxSR0JBMzI+KDApKTsKK30KKworc3RhdGljIHZvaWQgc2V0TGF5ZXJCYWNrZ3JvdW5k
Q29sb3IoTGF5ZXJXZWJLaXRUaHJlYWQmIGxheWVyLCBjb25zdCBDb2xvciYgY29sb3IpCit7Cisg
ICAgbGF5ZXIuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKK30KKworc3RhdGljIHZvaWQgY2xl
YXJMYXllckJhY2tncm91bmRDb2xvcihMYXllcldlYktpdFRocmVhZCYgbGF5ZXIpCit7CisgICAg
bGF5ZXIuc2V0QmFja2dyb3VuZENvbG9yKHN0YXRpY19jYXN0PFJHQkEzMj4oMCkpOworfQorCitQ
YXNzT3duUHRyPEdyYXBoaWNzTGF5ZXI+IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZShHcmFwaGljc0xh
eWVyQ2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBHcmFwaGljc0xh
eWVyQmxhY2tCZXJyeShjbGllbnQpKTsKK30KKworR3JhcGhpY3NMYXllckJsYWNrQmVycnk6Okdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5KEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkKKyAgICA6
IEdyYXBoaWNzTGF5ZXIoY2xpZW50KQorICAgICwgbV9zdXNwZW5kVGltZSgwKQorICAgICwgbV9j
b250ZW50c0xheWVyUHVycG9zZShOb0NvbnRlbnRzTGF5ZXIpCisgICAgLCBtX2NvbnRlbnRzTGF5
ZXJIYXNCYWNrZ3JvdW5kQ29sb3IoZmFsc2UpCit7CisgICAgbV9sYXllciA9IExheWVyV2ViS2l0
VGhyZWFkOjpjcmVhdGUoTGF5ZXJEYXRhOjpMYXllciwgdGhpcyk7CisKKyAgICB1cGRhdGVEZWJ1
Z0luZGljYXRvcnMoKTsKK30KKworR3JhcGhpY3NMYXllckJsYWNrQmVycnk6On5HcmFwaGljc0xh
eWVyQmxhY2tCZXJyeSgpCit7CisgICAgaWYgKG1fbGF5ZXIpCisgICAgICAgIG1fbGF5ZXItPnNl
dE93bmVyKDApOworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIG1fY29udGVudHNM
YXllci0+c2V0T3duZXIoMCk7CisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpCisgICAgICAgIG1f
dHJhbnNmb3JtTGF5ZXItPnNldE93bmVyKDApOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpzZXROYW1lKGNvbnN0IFN0cmluZyYgaW5OYW1lKQoreworICAgIFN0cmluZyBuYW1l
ID0gU3RyaW5nOjpmb3JtYXQoIkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5KCVwKSBHcmFwaGljc0xh
eWVyKCVwKSAiLCBtX2xheWVyLmdldCgpLCB0aGlzKSArIGluTmFtZTsKKyAgICBHcmFwaGljc0xh
eWVyOjpzZXROYW1lKG5hbWUpOworfQorCitib29sIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+JiBjaGlsZHJlbikKK3sKKyAg
ICBib29sIGNoaWxkcmVuQ2hhbmdlZCA9IEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuKGNoaWxk
cmVuKTsKKyAgICAvLyBGSVhNRTogR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW4gY2FsbHMgYWRk
Q2hpbGQoKSBmb3IgZWFjaCBzdWJsYXllciwgd2hpY2gKKyAgICAvLyB3aWxsIGVuZCB1cCBjYWxs
aW5nIHVwZGF0ZVN1YmxheWVyTGlzdCgpIE4gdGltZXMuCisgICAgaWYgKGNoaWxkcmVuQ2hhbmdl
ZCkKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisKKyAgICByZXR1cm4gY2hpbGRyZW5D
aGFuZ2VkOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGlsZChHcmFw
aGljc0xheWVyKiBjaGlsZExheWVyKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkKGNo
aWxkTGF5ZXIpOworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjphZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciogY2hpbGRMYXll
ciwgaW50IGluZGV4KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChjaGls
ZExheWVyLCBpbmRleCk7CisgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllckJsYWNrQmVycnk6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogY2hpbGRM
YXllciwgR3JhcGhpY3NMYXllciogc2libGluZykKK3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRD
aGlsZEJlbG93KGNoaWxkTGF5ZXIsIHNpYmxpbmcpOworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgp
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGlsZEFib3ZlKEdyYXBo
aWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIgKnNpYmxpbmcpCit7CisgICAgR3Jh
cGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShjaGlsZExheWVyLCBzaWJsaW5nKTsKKyAgICB1cGRh
dGVTdWJsYXllckxpc3QoKTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6cmVw
bGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGls
ZCkKK3sKKyAgICBpZiAoR3JhcGhpY3NMYXllcjo6cmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuZXdD
aGlsZCkpIHsKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJs
YWNrQmVycnk6OnJlbW92ZUZyb21QYXJlbnQoKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnJlbW92
ZUZyb21QYXJlbnQoKTsKKyAgICBsYXllckZvclN1cGVybGF5ZXIoKS0+cmVtb3ZlRnJvbVN1cGVy
bGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0UG9zaXRpb24o
Y29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9zaXRp
b24ocG9pbnQpOworICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyQmxhY2tCZXJyeTo6c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiBwb2lu
dCkKK3sKKyAgICBpZiAocG9pbnQgPT0gbV9hbmNob3JQb2ludCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0QW5jaG9yUG9pbnQocG9pbnQpOworICAgIHVwZGF0ZUFu
Y2hvclBvaW50KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldFNpemUo
Y29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGlmIChzaXplID09IG1fc2l6ZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0U2l6ZShzaXplKTsKKyAgICB1cGRh
dGVMYXllclNpemUoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0VHJh
bnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0pCit7CisgICAgaWYg
KHRyYW5zZm9ybSA9PSBtX3RyYW5zZm9ybSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgdXBkYXRlVHJhbnNmb3JtKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENoaWxkcmVuVHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKHRyYW5z
Zm9ybSA9PSBtX2NoaWxkcmVuVHJhbnNmb3JtKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFw
aGljc0xheWVyOjpzZXRDaGlsZHJlblRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIHVwZGF0ZUNo
aWxkcmVuVHJhbnNmb3JtKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNl
dFByZXNlcnZlczNEKGJvb2wgcHJlc2VydmVzM0QpCit7CisgICAgaWYgKHByZXNlcnZlczNEID09
IG1fcHJlc2VydmVzM0QpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dFByZXNlcnZlczNEKHByZXNlcnZlczNEKTsKKyAgICB1cGRhdGVMYXllclByZXNlcnZlczNEKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE1hc2tzVG9Cb3VuZHMoYm9v
bCBtYXNrc1RvQm91bmRzKQoreworICAgIGlmIChtYXNrc1RvQm91bmRzID09IG1fbWFza3NUb0Jv
dW5kcykKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0TWFza3NUb0Jv
dW5kcyhtYXNrc1RvQm91bmRzKTsKKyAgICB1cGRhdGVNYXNrc1RvQm91bmRzKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldERyYXdzQ29udGVudChib29sIGRyYXdzQ29u
dGVudCkKK3sKKyAgICAvLyBOb3RlIGNhcmVmdWxseSB0aGlzIGVhcmx5LWV4aXQgaXMgb25seSBj
b3JyZWN0IGJlY2F1c2Ugd2UgYWxzbyBwcm9wZXJseSBpbml0aWFsaXplCisgICAgLy8gTGF5ZXJX
ZWJLaXRUaHJlYWQ6OmlzRHJhd2FibGUoKSB3aGVuZXZlciBtX2NvbnRlbnRzTGF5ZXIgaXMgc2V0
IHRvIGEgbmV3IGxheWVyIGluIHNldHVwQ29udGVudHNMYXllcigpLgorICAgIGlmIChkcmF3c0Nv
bnRlbnQgPT0gbV9kcmF3c0NvbnRlbnQpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNz
TGF5ZXI6OnNldERyYXdzQ29udGVudChkcmF3c0NvbnRlbnQpOworICAgIHVwZGF0ZUxheWVySXNE
cmF3YWJsZSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50
c1Zpc2libGUoYm9vbCBjb250ZW50c1Zpc2libGUpCit7CisgICAgLy8gTm90ZSBjYXJlZnVsbHkg
dGhpcyBlYXJseS1leGl0IGlzIG9ubHkgY29ycmVjdCBiZWNhdXNlIHdlIGFsc28gcHJvcGVybHkg
aW5pdGlhbGl6ZQorICAgIC8vIExheWVyV2ViS2l0VGhyZWFkOjppc0RyYXdhYmxlKCkgd2hlbmV2
ZXIgbV9jb250ZW50c0xheWVyIGlzIHNldCB0byBhIG5ldyBsYXllciBpbiBzZXR1cENvbnRlbnRz
TGF5ZXIoKS4KKyAgICBpZiAoY29udGVudHNWaXNpYmxlID09IG1fY29udGVudHNWaXNpYmxlKQor
ICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c1Zpc2libGUo
Y29udGVudHNWaXNpYmxlKTsKKyAgICB1cGRhdGVMYXllcklzRHJhd2FibGUoKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TWFza0xheWVyKEdyYXBoaWNzTGF5ZXIqIG1h
c2tMYXllcikKK3sKKyAgICBpZiAobWFza0xheWVyID09IG1fbWFza0xheWVyKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNrTGF5ZXIobWFza0xheWVyKTsKKwor
ICAgIExheWVyV2ViS2l0VGhyZWFkKiBtYXNrTGF5ZXJXZWJLaXQgPSBtX21hc2tMYXllciA/IG1f
bWFza0xheWVyLT5wbGF0Zm9ybUxheWVyKCkgOiAwOworICAgIGlmIChtYXNrTGF5ZXJXZWJLaXQp
CisgICAgICAgIG1hc2tMYXllcldlYktpdC0+c2V0SXNNYXNrKHRydWUpOworICAgIG1fbGF5ZXIt
PnNldE1hc2tMYXllcihtYXNrTGF5ZXJXZWJLaXQpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXRSZXBsaWNhdGVkQnlMYXllcihHcmFwaGljc0xheWVyKiBsYXllcikKK3sK
KyAgICBHcmFwaGljc0xheWVyQmxhY2tCZXJyeSogbGF5ZXJXZWJLaXQgPSBzdGF0aWNfY2FzdDxH
cmFwaGljc0xheWVyQmxhY2tCZXJyeSo+KGxheWVyKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRS
ZXBsaWNhdGVkQnlMYXllcihsYXllcik7CisgICAgTGF5ZXJXZWJLaXRUaHJlYWQqIHJlcGxpY2FM
YXllciA9IGxheWVyV2ViS2l0ID8gbGF5ZXJXZWJLaXQtPnByaW1hcnlMYXllcigpIDogMDsKKyAg
ICBwcmltYXJ5TGF5ZXIoKS0+c2V0UmVwbGljYUxheWVyKHJlcGxpY2FMYXllcik7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEZpeGVkUG9zaXRpb24oYm9vbCBmaXhlZCkK
K3sKKyAgICBpZiAoZml4ZWQgPT0gbV9maXhlZFBvc2l0aW9uKQorICAgICAgICByZXR1cm47CisK
KyAgICBHcmFwaGljc0xheWVyOjpzZXRGaXhlZFBvc2l0aW9uKGZpeGVkKTsKKyAgICB1cGRhdGVG
aXhlZFBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEhh
c0ZpeGVkQ29udGFpbmVyKGJvb2wgYikKK3sKKyAgICBpZiAoYiA9PSBtX2hhc0ZpeGVkQ29udGFp
bmVyKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRIYXNGaXhlZENv
bnRhaW5lcihiKTsKKyAgICB1cGRhdGVIYXNGaXhlZENvbnRhaW5lcigpOworfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKGJvb2wg
YikKK3sKKyAgICBpZiAoYiA9PSBtX2hhc0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUpCisgICAgICAg
IHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEhhc0ZpeGVkQW5jZXN0b3JJbkRPTVRy
ZWUoYik7CisgICAgdXBkYXRlSGFzRml4ZWRBbmNlc3RvckluRE9NVHJlZSgpOworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3Im
IGNvbG9yKQoreworICAgIGlmIChtX2JhY2tncm91bmRDb2xvclNldCAmJiBtX2JhY2tncm91bmRD
b2xvciA9PSBjb2xvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0
QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKKworICAgIG1fY29udGVudHNMYXllckhhc0JhY2tncm91
bmRDb2xvciA9IHRydWU7CisgICAgdXBkYXRlTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKQorewor
ICAgIGlmICghbV9iYWNrZ3JvdW5kQ29sb3JTZXQpCisgICAgICAgIHJldHVybjsKKworICAgIEdy
YXBoaWNzTGF5ZXI6OmNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisgICAgY2xlYXJMYXllckJhY2tn
cm91bmRDb2xvcigqbV9jb250ZW50c0xheWVyKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxh
Y2tCZXJyeTo6c2V0Q29udGVudHNPcGFxdWUoYm9vbCBvcGFxdWUpCit7CisgICAgaWYgKG1fY29u
dGVudHNPcGFxdWUgPT0gb3BhcXVlKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xh
eWVyOjpzZXRDb250ZW50c09wYXF1ZShvcGFxdWUpOworICAgIHVwZGF0ZUNvbnRlbnRzT3BhcXVl
KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEJhY2tmYWNlVmlzaWJp
bGl0eShib29sIHZpc2libGUpCit7CisgICAgaWYgKG1fYmFja2ZhY2VWaXNpYmlsaXR5ID09IHZp
c2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tmYWNl
VmlzaWJpbGl0eSh2aXNpYmxlKTsKKyAgICB1cGRhdGVCYWNrZmFjZVZpc2liaWxpdHkoKTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5
KQoreworICAgIGZsb2F0IGNsYW1wZWRPcGFjaXR5ID0gbWF4KG1pbihvcGFjaXR5LCAxLjBmKSwg
MC4wZik7CisKKyAgICBpZiAobV9vcGFjaXR5ID09IGNsYW1wZWRPcGFjaXR5KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGNsYW1wZWRPcGFjaXR5KTsK
KyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0T3BhY2l0eShvcGFjaXR5KTsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q29udGVudHNOZWVkc0Rpc3BsYXkoKQoreworICAgIGlm
IChtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0TmVlZHNEaXNw
bGF5KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE5lZWRzRGlzcGxh
eSgpCit7CisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBtX2xheWVyLT5zZXROZWVk
c0Rpc3BsYXkoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TmVlZHNE
aXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoZHJhd3NDb250
ZW50KCkpCisgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheUluUmVjdChyZWN0KTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q29udGVudHNSZWN0KGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHJlY3QgPT0gbV9jb250ZW50c1JlY3QpCisgICAgICAg
IHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzUmVjdChyZWN0KTsKKyAg
ICB1cGRhdGVDb250ZW50c1JlY3QoKTsKK30KKworc3RhdGljIFBhc3NSZWZQdHI8TGF5ZXJBbmlt
YXRpb24+IHJlbW92ZUFuaW1hdGlvbkJ5SWRBbmRQcm9wZXJ0eShpbnQgaWQsIEFuaW1hdGVkUHJv
cGVydHlJRCBwcm9wZXJ0eSwgVmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPiYgbGlzdCkK
K3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgaWYgKGxpc3RbaV0tPmlkKCkgPT0gaWQgJiYgbGlzdFtpXS0+cHJvcGVydHkoKSA9PSBwcm9w
ZXJ0eSkgeworICAgICAgICAgICAgUmVmUHRyPExheWVyQW5pbWF0aW9uPiBsYXllckFuaW1hdGlv
biA9IGxpc3RbaV07CisgICAgICAgICAgICBsaXN0LnJlbW92ZShpKTsKKyAgICAgICAgICAgIHJl
dHVybiBsYXllckFuaW1hdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBQYXNz
UmVmUHRyPExheWVyQW5pbWF0aW9uPigpOworfQorCitzdGF0aWMgUGFzc1JlZlB0cjxMYXllckFu
aW1hdGlvbj4gcmVtb3ZlQW5pbWF0aW9uQnlOYW1lKGNvbnN0IFN0cmluZyYgYW5pbWF0aW9uTmFt
ZSwgVmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPiYgbGlzdCkKK3sKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGxpc3RbaV0t
Pm5hbWUoKSA9PSBhbmltYXRpb25OYW1lKSB7CisgICAgICAgICAgICBSZWZQdHI8TGF5ZXJBbmlt
YXRpb24+IGxheWVyQW5pbWF0aW9uID0gbGlzdFtpXTsKKyAgICAgICAgICAgIGxpc3QucmVtb3Zl
KGkpOworICAgICAgICAgICAgcmV0dXJuIGxheWVyQW5pbWF0aW9uLnJlbGVhc2UoKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiBQYXNzUmVmUHRyPExheWVyQW5pbWF0aW9uPigpOwor
fQorCitib29sIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRBbmltYXRpb24oY29uc3QgS2V5
ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5p
bWF0aW9uKiBhbmltYXRpb24sIGNvbnN0IFN0cmluZyYgYW5pbWF0aW9uTmFtZSwgZG91YmxlIHRp
bWVPZmZzZXQpCit7CisgICAgLy8gVGhpcyBpcyB3aGF0IEdyYXBoaWNzTGF5ZXJDQSBjaGVja3Mg
Zm9yCisgICAgaWYgKCFhbmltYXRpb24gfHwgYW5pbWF0aW9uLT5pc0VtcHR5T3JaZXJvRHVyYXRp
b24oKSB8fCB2YWx1ZXMuc2l6ZSgpIDwgMikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gV2Ugb25seSBzdXBwb3J0IHRoZXNlIHR3byBraW5kcyBvZiBwcm9wZXJ0aWVzIEFUTQorICAg
IGlmICh2YWx1ZXMucHJvcGVydHkoKSAhPSBBbmltYXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3Jt
CisgICAgICYmIHZhbHVlcy5wcm9wZXJ0eSgpICE9IEFuaW1hdGVkUHJvcGVydHlPcGFjaXR5KQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZW1vdmUgYW55IHJ1bm5pbmcgYW5pbWF0
aW9uIGZvciB0aGUgc2FtZSBwcm9wZXJ0eS4KKyAgICAvLyBGSVhNRTogTWF5YmUgdGhpcyBpcyBz
dXBlcnN0aXRpb24sIEkgZ290IHRoZSBpZGVhIGZyb20gR3JhcGhpY3NMYXllclF0CisgICAgLy8g
V2ViQ29yZSBtaWdodCBiZSBhZGRpbmcgYW4gYW5pbWF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSwg
YnV0IGZvciBhIGRpZmZlcmVudCBwcm9wZXJ0eQorICAgIHJlbW92ZUFuaW1hdGlvbkJ5SWRBbmRQ
cm9wZXJ0eShMYXllckFuaW1hdGlvbjo6aWRGcm9tQW5pbWF0aW9uKGFuaW1hdGlvbiksIHZhbHVl
cy5wcm9wZXJ0eSgpLCBtX3J1bm5pbmdBbmltYXRpb25zKTsKKyAgICByZW1vdmVBbmltYXRpb25C
eUlkQW5kUHJvcGVydHkoTGF5ZXJBbmltYXRpb246OmlkRnJvbUFuaW1hdGlvbihhbmltYXRpb24p
LCB2YWx1ZXMucHJvcGVydHkoKSwgbV9zdXNwZW5kZWRBbmltYXRpb25zKTsKKworICAgIFJlZlB0
cjxMYXllckFuaW1hdGlvbj4gbGF5ZXJBbmltYXRpb24gPSBMYXllckFuaW1hdGlvbjo6Y3JlYXRl
KHZhbHVlcywgYm94U2l6ZSwgYW5pbWF0aW9uLCBhbmltYXRpb25OYW1lLCB0aW1lT2Zmc2V0KTsK
KworI2lmIERFQlVHX0xBWUVSX0FOSU1BVElPTgorICAgIGZwcmludGYoc3RkZXJyLCAiTGF5ZXJB
bmltYXRpb24gMHglMDh4OiBBZGRpbmcgYW5pbWF0aW9uICVzIGZvciBwcm9wZXJ0eSAlZFxuIiwg
bGF5ZXJBbmltYXRpb24uZ2V0KCksIGFuaW1hdGlvbk5hbWUubGF0aW4xKCkuZGF0YSgpLCB2YWx1
ZXMucHJvcGVydHkoKSk7CisjZW5kaWYKKworICAgIG1fcnVubmluZ0FuaW1hdGlvbnMuYXBwZW5k
KGxheWVyQW5pbWF0aW9uKTsKKworICAgIHVwZGF0ZUFuaW1hdGlvbnMoKTsKKworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpwYXVzZUFuaW1hdGlv
bihjb25zdCBTdHJpbmcmIGFuaW1hdGlvbk5hbWUsIGRvdWJsZSB0aW1lT2Zmc2V0KQoreworICAg
IC8vIFdlYkNvcmUgbWlnaHQgaGF2ZSBhZGRlZCBzZXZlcmFsIGFuaW1hdGlvbnMgd2l0aCB0aGUg
c2FtZSBuYW1lLCBidXQgZm9yIGRpZmZlcmVudCBwcm9wZXJ0aWVzCisKKyAgICBSZWZQdHI8TGF5
ZXJBbmltYXRpb24+IGFuaW1hdGlvbjsKKyAgICB3aGlsZSAoYW5pbWF0aW9uID0gcmVtb3ZlQW5p
bWF0aW9uQnlOYW1lKGFuaW1hdGlvbk5hbWUsIG1fcnVubmluZ0FuaW1hdGlvbnMpKSB7CisjaWYg
REVCVUdfTEFZRVJfQU5JTUFUSU9OCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTGF5ZXJBbmlt
YXRpb24gMHglMDh4OiBQYXVzaW5nIGFuaW1hdGlvbiAlc1xuIiwgYW5pbWF0aW9uLmdldCgpLCBh
bmltYXRpb24tPm5hbWUoKS5sYXRpbjEoKS5kYXRhKCkpOworI2VuZGlmCisKKyAgICAgICAgLy8g
TGF5ZXJBbmltYXRpb24gaXMgcmVhZG9ubHkuIENyZWF0ZSBhIG5ldyBhbmltYXRpb24gd2l0aCB0
aGUgc2FtZSBkYXRhIGV4Y2VwdCBmb3IgdGltZU9mZnNldC4KKyAgICAgICAgLy8gV2ViQ29yZSB3
aWxsIGFkanVzdCB0aGUgdGltZU9mZnNldCBmb3IgcGF1c2VkIGFuaW1hdGlvbnMgc28gaXQgY2Fu
IGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQorICAgICAgICAvLyBwcm9ncmVzcyBmb3IgdGhlIHBh
dXNlZCBhbmltYXRpb24gd2l0aG91dCBrbm93aW5nIHRoZSBleGFjdCB0aW1lc3RhbXAgd2hlbiB0
aGUgYW5pbWF0aW9uIHdhcworICAgICAgICAvLyBwYXVzZWQuCisgICAgICAgIC8vIElmIGFuIGFu
aW1hdGlvbiB3YXMgc3RhcnRlZCB3aXRoIGEgdGltZU9mZnNldCBkdF9vcmlnIGFuZCBwYXVzZWQg
ZHRfcGF1c2Ugc2Vjb25kcyBsYXRlciwgdGhlCisgICAgICAgIC8vIGNsb25lZCBhbmltYXRpb24g
d2lsbCBoYXZlIGEgdGltZU9mZnNldCBvZiBkdF9wYXVzZSArIGR0X29yaWcuCisgICAgICAgIGFu
aW1hdGlvbiA9IGFuaW1hdGlvbi0+Y2xvbmUodGltZU9mZnNldCk7CisgICAgICAgIG1fc3VzcGVu
ZGVkQW5pbWF0aW9ucy5hcHBlbmQoYW5pbWF0aW9uKTsKKworI2lmIERFQlVHX0xBWUVSX0FOSU1B
VElPTgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkxheWVyQW5pbWF0aW9uIDB4JTA4eDogUGF1
c2VkIGFuaW1hdGlvbiAlc1xuIiwgYW5pbWF0aW9uLmdldCgpLCBhbmltYXRpb24tPm5hbWUoKS5s
YXRpbjEoKS5kYXRhKCkpOworI2VuZGlmCisgICAgfTsKKworICAgIHVwZGF0ZUFuaW1hdGlvbnMo
KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6cmVtb3ZlQW5pbWF0aW9uKGNv
bnN0IFN0cmluZyYgYW5pbWF0aW9uTmFtZSkKK3sKKyAgICAvLyBXZWJDb3JlIG1pZ2h0IGhhdmUg
YWRkZWQgc2V2ZXJhbCBhbmltYXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSwgYnV0IGZvciBkaWZm
ZXJlbnQgcHJvcGVydGllcworCisjaWYgREVCVUdfTEFZRVJfQU5JTUFUSU9OCisgICAgZnByaW50
ZihzdGRlcnIsICJMYXllckFuaW1hdGlvbjogUmVtb3ZpbmcgYW5pbWF0aW9uICVzXG4iLCBhbmlt
YXRpb25OYW1lLmxhdGluMSgpLmRhdGEoKSk7CisjZW5kaWYKKworICAgIHdoaWxlIChyZW1vdmVB
bmltYXRpb25CeU5hbWUoYW5pbWF0aW9uTmFtZSwgbV9ydW5uaW5nQW5pbWF0aW9ucykpIHsgfQor
ICAgIHdoaWxlIChyZW1vdmVBbmltYXRpb25CeU5hbWUoYW5pbWF0aW9uTmFtZSwgbV9zdXNwZW5k
ZWRBbmltYXRpb25zKSkgeyB9CisKKyAgICB1cGRhdGVBbmltYXRpb25zKCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnN1c3BlbmRBbmltYXRpb25zKGRvdWJsZSB0aW1lKQor
eworI2lmIERFQlVHX0xBWUVSX0FOSU1BVElPTgorICAgIGZwcmludGYoc3RkZXJyLCAiTGF5ZXJB
bmltYXRpb246IFN1c3BlbmRpbmcgYW5pbWF0aW9uc1xuIik7CisjZW5kaWYKKyAgICBtX3N1c3Bl
bmRUaW1lID0gdGltZTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6cmVzdW1l
QW5pbWF0aW9ucygpCit7CisjaWYgREVCVUdfTEFZRVJfQU5JTUFUSU9OCisgICAgZnByaW50Zihz
dGRlcnIsICJMYXllckFuaW1hdGlvbjogUmVzdW1pbmcgYW5pbWF0aW9uc1xuIik7CisjZW5kaWYK
KyAgICBtX3N1c3BlbmRUaW1lID0gMDsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJy
eTo6c2V0Q29udGVudHNUb0ltYWdlKEltYWdlKiBpbWFnZSkKK3sKKyAgICBib29sIGNoaWxkcmVu
Q2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChpbWFnZSkgeworICAgICAgICBtX2NvbnRlbnRzTGF5
ZXJQdXJwb3NlID0gQ29udGVudHNMYXllckZvckltYWdlOworICAgICAgICBpZiAoIW1fY29udGVu
dHNMYXllcikKKyAgICAgICAgICAgIGNoaWxkcmVuQ2hhbmdlZCA9IHRydWU7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgbV9jb250ZW50c0xheWVyUHVycG9zZSA9IE5vQ29udGVudHNMYXllcjsKKyAg
ICAgICAgaWYgKG1fY29udGVudHNMYXllcikKKyAgICAgICAgICAgIGNoaWxkcmVuQ2hhbmdlZCA9
IHRydWU7CisgICAgfQorCisgICAgdXBkYXRlQ29udGVudHNJbWFnZShpbWFnZSk7CisKKyAgICBp
ZiAoY2hpbGRyZW5DaGFuZ2VkKQorICAgICAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNJbWFnZShJbWFnZSog
aW1hZ2UpCit7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIGlmICghbV9jb250ZW50c0xheWVy
LmdldCgpKSB7CisgICAgICAgICAgICBSZWZQdHI8TGF5ZXJXZWJLaXRUaHJlYWQ+IGltYWdlTGF5
ZXIgPSBMYXllcldlYktpdFRocmVhZDo6Y3JlYXRlKExheWVyRGF0YTo6TGF5ZXIsIHRoaXMpOwor
CisgICAgICAgICAgICBzZXR1cENvbnRlbnRzTGF5ZXIoaW1hZ2VMYXllci5nZXQoKSk7CisgICAg
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSBpbWFnZUxheWVyOworICAgICAgICAgICAgLy8gbV9j
b250ZW50c0xheWVyIHdpbGwgYmUgcGFyZW50ZWQgYnkgdXBkYXRlU3VibGF5ZXJMaXN0LgorICAg
ICAgICB9CisgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0Q29udGVudHMoaW1hZ2UpOworCisg
ICAgICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5v
IGltYWdlLiBtX2NvbnRlbnRzTGF5ZXIgd2lsbCBiZSByZW1vdmVkIHZpYSB1cGRhdGVTdWJsYXll
ckxpc3QuCisgICAgICAgIG1fY29udGVudHNMYXllciA9IDA7CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c1RvQ2FudmFzKFBsYXRmb3JtTGF5ZXIq
IHBsYXRmb3JtTGF5ZXIpCit7CisgICAgYm9vbCBjaGlsZHJlbkNoYW5nZWQgPSBmYWxzZTsKKyAg
ICBpZiAocGxhdGZvcm1MYXllcikgeworICAgICAgICBwbGF0Zm9ybUxheWVyLT5zZXRPd25lcih0
aGlzKTsKKyAgICAgICAgaWYgKG1fY29udGVudHNMYXllci5nZXQoKSAhPSBwbGF0Zm9ybUxheWVy
KSB7CisgICAgICAgICAgICBzZXR1cENvbnRlbnRzTGF5ZXIocGxhdGZvcm1MYXllcik7CisgICAg
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSBwbGF0Zm9ybUxheWVyOworICAgICAgICAgICAgbV9j
b250ZW50c0xheWVyUHVycG9zZSA9IENvbnRlbnRzTGF5ZXJGb3JDYW52YXM7CisgICAgICAgICAg
ICBjaGlsZHJlbkNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1fY29udGVudHNM
YXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisgICAgICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgICAg
IGNoaWxkcmVuQ2hhbmdlZCA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIFRoZSBvbGQgY29udGVu
dHMgbGF5ZXIgd2lsbCBiZSByZW1vdmVkIHZpYSB1cGRhdGVTdWJsYXllckxpc3QuCisgICAgICAg
ICAgICBtX2NvbnRlbnRzTGF5ZXIgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNo
aWxkcmVuQ2hhbmdlZCkKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9NZWRpYShQbGF0Zm9ybUxheWVy
KiBsYXllcikKK3sKKyAgICBib29sIGNoaWxkcmVuQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChs
YXllcikgeworICAgICAgICBpZiAoIW1fY29udGVudHNMYXllci5nZXQoKSB8fCBtX2NvbnRlbnRz
TGF5ZXJQdXJwb3NlICE9IENvbnRlbnRzTGF5ZXJGb3JWaWRlbykgeworICAgICAgICAgICAgc2V0
dXBDb250ZW50c0xheWVyKGxheWVyKTsKKyAgICAgICAgICAgIG1fY29udGVudHNMYXllciA9IGxh
eWVyOworICAgICAgICAgICAgbV9jb250ZW50c0xheWVyUHVycG9zZSA9IENvbnRlbnRzTGF5ZXJG
b3JWaWRlbzsKKyAgICAgICAgICAgIGNoaWxkcmVuQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0K
KyAgICAgICAgbGF5ZXItPnNldE93bmVyKHRoaXMpOworICAgICAgICBsYXllci0+c2V0TmVlZHNE
aXNwbGF5KCk7CisgICAgICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgICAgIGNoaWxkcmVuQ2hhbmdl
ZCA9IHRydWU7CisgIAorICAgICAgICAgICAgLy8gVGhlIG9sZCBjb250ZW50cyBsYXllciB3aWxs
IGJlIHJlbW92ZWQgdmlhIHVwZGF0ZVN1YmxheWVyTGlzdC4KKyAgICAgICAgICAgIG1fY29udGVu
dHNMYXllciA9IDA7CisgICAgICAgIH0KKyAgICB9CisgIAorICAgIGlmIChjaGlsZHJlbkNoYW5n
ZWQpCisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCitQbGF0Zm9ybUxheWVyKiBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6aG9zdExheWVyRm9yU3VibGF5ZXJzKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV90cmFuc2Zvcm1MYXllciA/IG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBt
X2xheWVyLmdldCgpOworfQorCitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyQmxhY2tCZXJy
eTo6bGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1M
YXllciA/IG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOworfQorCitQbGF0
Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6cGxhdGZvcm1MYXllcigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIHByaW1hcnlMYXllcigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYgY29sb3IpCit7
CisgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgc2V0TGF5ZXJCYWNrZ3JvdW5kQ29s
b3IoKm1fbGF5ZXIsIGNvbG9yKTsKKyAgICBlbHNlCisgICAgICAgIGNsZWFyTGF5ZXJCYWNrZ3Jv
dW5kQ29sb3IoKm1fbGF5ZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGJvcmRlcldpZHRoKQorewor
ICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcigq
bV9sYXllciwgY29sb3IpOworICAgICAgICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aChib3JkZXJX
aWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xlYXJCb3JkZXJDb2xvcigqbV9sYXllcik7
CisgICAgICAgIG1fbGF5ZXItPnNldEJvcmRlcldpZHRoKDApOworICAgIH0KK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlU3VibGF5ZXJMaXN0KCkKK3sKKyAgICBWZWN0
b3I8UmVmUHRyPExheWVyV2ViS2l0VGhyZWFkPiA+IG5ld1N1YmxheWVyczsKKworICAgIGlmICht
X3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIC8vIEFkZCB0aGUgcHJpbWFyeSBsYXllciBmaXJz
dC4gRXZlbiBpZiB3ZSBoYXZlIG5lZ2F0aXZlIHotb3JkZXIgY2hpbGRyZW4sIHRoZSBwcmltYXJ5
IGxheWVyIGFsd2F5cyBjb21lcyBiZWhpbmQuCisgICAgICAgIG5ld1N1YmxheWVycy5hcHBlbmQo
bV9sYXllci5nZXQoKSk7CisgICAgfSBlbHNlIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAg
ICAgLy8gRklYTUU6IGFkZCB0aGUgY29udGVudHMgbGF5ZXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIg
d2l0aCBuZWdhdGl2ZSB6LW9yZGVyIGNoaWxkcmVuLgorICAgICAgICAvLyBUaGlzIGRvZXMgbm90
IGNhdXNlIHZpc2libGUgcmVuZGVyaW5nIGlzc3VlcyBiZWNhdXNlIGN1cnJlbnRseSBjb250ZW50
cyBsYXllcnMgYXJlIG9ubHkgdXNlZAorICAgICAgICAvLyBmb3IgcmVwbGFjZWQgZWxlbWVudHMg
dGhhdCBkb24ndCBoYXZlIGNoaWxkcmVuLgorICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKG1f
Y29udGVudHNMYXllci5nZXQoKSk7CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPEdyYXBoaWNz
TGF5ZXIqPiYgY2hpbGRMYXllcnMgPSBjaGlsZHJlbigpOworICAgIHNpemVfdCBudW1DaGlsZHJl
biA9IGNoaWxkTGF5ZXJzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNo
aWxkcmVuOyArK2kpIHsKKyAgICAgICAgR3JhcGhpY3NMYXllckJsYWNrQmVycnkqIGN1ckNoaWxk
ID0gc3RhdGljX2Nhc3Q8R3JhcGhpY3NMYXllckJsYWNrQmVycnkqPihjaGlsZExheWVyc1tpXSk7
CisKKyAgICAgICAgTGF5ZXJXZWJLaXRUaHJlYWQqIGNoaWxkTGF5ZXIgPSBjdXJDaGlsZC0+bGF5
ZXJGb3JTdXBlcmxheWVyKCk7CisgICAgICAgIG5ld1N1YmxheWVycy5hcHBlbmQoY2hpbGRMYXll
cik7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdTdWJsYXllcnMuc2l6
ZSgpOyArK2kpCisgICAgICAgIG5ld1N1YmxheWVyc1tpXS0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIo
KTsKKworICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIG1fdHJhbnNmb3JtTGF5
ZXItPnNldFN1YmxheWVycyhuZXdTdWJsYXllcnMpOworCisgICAgICAgIGlmIChtX2NvbnRlbnRz
TGF5ZXIpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSB0cmFuc2Zvcm0gbGF5ZXIsIHRo
ZW4gdGhlIGNvbnRlbnRzIGxheWVyIGlzIHBhcmVudGVkIGluIHRoZQorICAgICAgICAgICAgLy8g
cHJpbWFyeSBsYXllciAod2hpY2ggaXMgaXRzZWxmIGEgY2hpbGQgb2YgdGhlIHRyYW5zZm9ybSBs
YXllcikuCisgICAgICAgICAgICBtX2xheWVyLT5yZW1vdmVBbGxTdWJsYXllcnMoKTsKKyAgICAg
ICAgICAgIG1fbGF5ZXItPmFkZFN1YmxheWVyKG1fY29udGVudHNMYXllcik7CisgICAgICAgIH0K
KyAgICB9IGVsc2UKKyAgICAgICAgbV9sYXllci0+c2V0U3VibGF5ZXJzKG5ld1N1YmxheWVycyk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUxheWVyUG9zaXRpb24o
KQoreworICAgIC8vIFBvc2l0aW9uIGlzIG9mZnNldCBvbiB0aGUgbGF5ZXIgYnkgdGhlIGxheWVy
IGFuY2hvciBwb2ludC4KKyAgICBGbG9hdFBvaW50IGxheWVyUG9zaXRpb24obV9wb3NpdGlvbi54
KCkgKyBtX2FuY2hvclBvaW50LngoKSAqIG1fc2l6ZS53aWR0aCgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3Bvc2l0aW9uLnkoKSArIG1fYW5jaG9yUG9pbnQueSgpICogbV9zaXpl
LmhlaWdodCgpKTsKKworICAgIHByaW1hcnlMYXllcigpLT5zZXRQb3NpdGlvbihsYXllclBvc2l0
aW9uKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlTGF5ZXJTaXpl
KCkKK3sKKyAgICBJbnRTaXplIGxheWVyU2l6ZShtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdo
dCgpKTsKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikgeworICAgICAgICBtX3RyYW5zZm9ybUxh
eWVyLT5zZXRCb3VuZHMobGF5ZXJTaXplKTsKKyAgICAgICAgLy8gVGhlIGFuY2hvciBvZiB0aGUg
Y29udGVudHMgbGF5ZXIgaXMgYWx3YXlzIGF0IDAuNSwgMC41LCBzbyB0aGUgcG9zaXRpb24gaXMg
Y2VudGVyLXJlbGF0aXZlLgorICAgICAgICBGbG9hdFBvaW50IGNlbnRlclBvaW50KG1fc2l6ZS53
aWR0aCgpIC8gMiwgbV9zaXplLmhlaWdodCgpIC8gMik7CisgICAgICAgIG1fbGF5ZXItPnNldFBv
c2l0aW9uKGNlbnRlclBvaW50KTsKKyAgICB9CisKKyAgICBtX2xheWVyLT5zZXRCb3VuZHMobGF5
ZXJTaXplKTsKKworICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCByZXNpemUgbV9jb250ZW50c0xh
eWVyLiBJdCdzIHVwIHRoZSBjYWxsZXIgdG8gZG8gdGhhdC4KKworICAgIC8vIElmIHdlJ3ZlIGNo
YW5nZWQgdGhlIGJvdW5kcywgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24KKyAg
ICAvLyBvZiB0aGUgbGF5ZXIsIHRha2luZyBhbmNob3IgcG9pbnQgaW50byBhY2NvdW50LgorICAg
IHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJy
eTo6dXBkYXRlQW5jaG9yUG9pbnQoKQoreworICAgIHByaW1hcnlMYXllcigpLT5zZXRBbmNob3JQ
b2ludChGbG9hdFBvaW50KG1fYW5jaG9yUG9pbnQueCgpLCBtX2FuY2hvclBvaW50LnkoKSkpOwor
ICAgIHByaW1hcnlMYXllcigpLT5zZXRBbmNob3JQb2ludFoobV9hbmNob3JQb2ludC56KCkpOwor
ICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6dXBkYXRlVHJhbnNmb3JtKCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0VHJhbnNm
b3JtKG1fdHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBk
YXRlQ2hpbGRyZW5UcmFuc2Zvcm0oKQoreworICAgIHByaW1hcnlMYXllcigpLT5zZXRTdWJsYXll
clRyYW5zZm9ybShtX2NoaWxkcmVuVHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6dXBkYXRlTWFza3NUb0JvdW5kcygpCit7CisgICAgbV9sYXllci0+c2V0TWFz
a3NUb0JvdW5kcyhtX21hc2tzVG9Cb3VuZHMpOworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygp
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVDb250ZW50c09wYXF1
ZSgpCit7CisgICAgbV9sYXllci0+c2V0T3BhcXVlKG1fY29udGVudHNPcGFxdWUpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVCYWNrZmFjZVZpc2liaWxpdHkoKQor
eworICAgIG1fbGF5ZXItPnNldERvdWJsZVNpZGVkKG1fYmFja2ZhY2VWaXNpYmlsaXR5KTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgp
Cit7CisgICAgaWYgKG1fcHJlc2VydmVzM0QgJiYgIW1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAg
ICAgLy8gQ3JlYXRlIHRoZSB0cmFuc2Zvcm0gbGF5ZXIuCisgICAgICAgIG1fdHJhbnNmb3JtTGF5
ZXIgPSBMYXllcldlYktpdFRocmVhZDo6Y3JlYXRlKExheWVyRGF0YTo6VHJhbnNmb3JtTGF5ZXIs
IHRoaXMpOworCisgICAgICAgIC8vIENvcHkgdGhlIHBvc2l0aW9uIGZyb20gdGhpcyBsYXllci4K
KyAgICAgICAgdXBkYXRlTGF5ZXJQb3NpdGlvbigpOworICAgICAgICB1cGRhdGVMYXllclNpemUo
KTsKKyAgICAgICAgdXBkYXRlQW5jaG9yUG9pbnQoKTsKKyAgICAgICAgdXBkYXRlVHJhbnNmb3Jt
KCk7CisgICAgICAgIHVwZGF0ZUNoaWxkcmVuVHJhbnNmb3JtKCk7CisgICAgICAgIHVwZGF0ZUFu
aW1hdGlvbnMoKTsKKworICAgICAgICBtX2xheWVyLT5zZXRQb3NpdGlvbihGbG9hdFBvaW50KG1f
c2l6ZS53aWR0aCgpIC8gMi4wZiwgbV9zaXplLmhlaWdodCgpIC8gMi4wZikpOworCisgICAgICAg
IG1fbGF5ZXItPnNldEFuY2hvclBvaW50KEZsb2F0UG9pbnQoMC41ZiwgMC41ZikpOworICAgICAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBpZGVudGl0eTsKKyAgICAgICAgbV9sYXllci0+c2V0VHJh
bnNmb3JtKGlkZW50aXR5KTsKKyAgICAgICAgCisgICAgICAgIC8vIFNldCB0aGUgb2xkIGxheWVy
IHRvIG9wYWNpdHkgb2YgMS4gRnVydGhlciBkb3duIHdlIHdpbGwgc2V0IHRoZSBvcGFjaXR5IG9u
IHRoZSB0cmFuc2Zvcm0gbGF5ZXIuCisgICAgICAgIG1fbGF5ZXItPnNldE9wYWNpdHkoMSk7CisK
KyAgICAgICAgLy8gTW92ZSB0aGlzIGxheWVyIHRvIGJlIGEgY2hpbGQgb2YgdGhlIHRyYW5zZm9y
bSBsYXllci4KKyAgICAgICAgaWYgKG1fbGF5ZXItPnN1cGVybGF5ZXIoKSkKKyAgICAgICAgICAg
IG1fbGF5ZXItPnN1cGVybGF5ZXIoKS0+cmVwbGFjZVN1YmxheWVyKG1fbGF5ZXIuZ2V0KCksIG1f
dHJhbnNmb3JtTGF5ZXIuZ2V0KCkpOworICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5hZGRTdWJs
YXllcihtX2xheWVyLmdldCgpKTsKKworICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5zZXRQcmVz
ZXJ2ZXMzRCh0cnVlKTsKKyAgICAgICAgbV9sYXllci0+c2V0UHJlc2VydmVzM0QodHJ1ZSk7CisK
KyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisgICAgfSBlbHNlIGlmICghbV9wcmVzZXJ2
ZXMzRCAmJiBtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIC8vIFJlbGFjZSB0aGUgdHJhbnNm
b3JtTGF5ZXIgaW4gdGhlIHBhcmVudCB3aXRoIHRoaXMgbGF5ZXIuCisgICAgICAgIG1fbGF5ZXIt
PnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgICAgIGlmIChtX3RyYW5zZm9ybUxheWVyLT5z
dXBlcmxheWVyKCkpCisgICAgICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5zdXBlcmxheWVyKCkt
PnJlcGxhY2VTdWJsYXllcihtX3RyYW5zZm9ybUxheWVyLmdldCgpLCBtX2xheWVyLmdldCgpKTsK
KworICAgICAgICAvLyBSZWxlYXNlIHRoZSB0cmFuc2Zvcm0gbGF5ZXIuCisgICAgICAgIG1fdHJh
bnNmb3JtTGF5ZXIgPSAwOworCisgICAgICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKKyAgICAg
ICAgdXBkYXRlTGF5ZXJTaXplKCk7CisgICAgICAgIHVwZGF0ZUFuY2hvclBvaW50KCk7CisgICAg
ICAgIHVwZGF0ZVRyYW5zZm9ybSgpOworICAgICAgICB1cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgp
OworICAgICAgICB1cGRhdGVBbmltYXRpb25zKCk7CisKKyAgICAgICAgbV9sYXllci0+c2V0UHJl
c2VydmVzM0QoZmFsc2UpOworCisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgIH0K
KworICAgIHVwZGF0ZU9wYWNpdHlPbkxheWVyKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJs
YWNrQmVycnk6OnVwZGF0ZUxheWVySXNEcmF3YWJsZSgpCit7CisgICAgLy8gRm9yIHRoZSByZXN0
IG9mIHRoZSBhY2NlbGVyYXRlZCBjb21wb3NpdG9yIGNvZGUsIHRoZXJlIGlzIG5vIHJlYXNvbiB0
byBtYWtlIGEKKyAgICAvLyBkaXN0aW5jdGlvbiBiZXR3ZWVuIGRyYXdzQ29udGVudCBhbmQgY29u
dGVudHNWaXNpYmxlLiBTbywgZm9yIG1fbGF5ZXIsIHRoZXNlIHR3bworICAgIC8vIGZsYWdzIGFy
ZSBjb21iaW5lZCBoZXJlLiBtX2NvbnRlbnRzTGF5ZXIgc2hvdWxkbid0IHJlY2VpdmUgdGhlIGRy
YXdzQ29udGVudCBmbGFnCisgICAgLy8gc28gaXQgaXMgb25seSBnaXZlbiBjb250ZW50c1Zpc2li
bGUuCisgICAgbV9sYXllci0+c2V0RHJhd2FibGUobV9kcmF3c0NvbnRlbnQgJiYgbV9jb250ZW50
c1Zpc2libGUpOworCisgICAgaWYgKG1fY29udGVudHNMYXllcikKKyAgICAgICAgbV9jb250ZW50
c0xheWVyLT5zZXREcmF3YWJsZShtX2NvbnRlbnRzVmlzaWJsZSk7CisKKyAgICBpZiAobV9kcmF3
c0NvbnRlbnQpCisgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworCisgICAgdXBk
YXRlRGVidWdJbmRpY2F0b3JzKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6
OnVwZGF0ZUZpeGVkUG9zaXRpb24oKQoreworICAgIG1fbGF5ZXItPnNldEZpeGVkUG9zaXRpb24o
bV9maXhlZFBvc2l0aW9uKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBk
YXRlSGFzRml4ZWRDb250YWluZXIoKQoreworICAgIG1fbGF5ZXItPnNldEhhc0ZpeGVkQ29udGFp
bmVyKG1faGFzRml4ZWRDb250YWluZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5Ojp1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKCkKK3sKKyAgICBtX2xheWVyLT5z
ZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKG1faGFzRml4ZWRBbmNlc3RvckluRE9NVHJlZSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUxheWVyQmFja2dyb3Vu
ZENvbG9yKCkKK3sKKyAgICBpZiAoIW1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gV2UgbmV2ZXIgY3JlYXRlIHRoZSBjb250ZW50cyBsYXllciBqdXN0IGZvciBiYWNr
Z3JvdW5kIGNvbG9yIHlldC4KKyAgICBpZiAobV9iYWNrZ3JvdW5kQ29sb3JTZXQpCisgICAgICAg
IHNldExheWVyQmFja2dyb3VuZENvbG9yKCptX2NvbnRlbnRzTGF5ZXIsIG1fYmFja2dyb3VuZENv
bG9yKTsKKyAgICBlbHNlCisgICAgICAgIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKm1fY29u
dGVudHNMYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUFu
aW1hdGlvbnMoKQoreworICAgIC8vIFdoZW4gdGhlcmUgaXMgYSB0cmFuc2Zvcm0gbGF5ZXIsIHRo
ZSB0cmFuc2Zvcm0gbXVzdCBiZSBzZXQgb24gdGhhdCBsYXllcgorICAgIC8vIGluc3RlYWQgb2Yg
dGhlIGNvbnRlbnQgbGF5ZXIuIE9wYWNpdHkgY2FuIGJlIHNldCBvbiB0aGUgdHJhbnNmb3JtIGxh
eWVyIG9yIHRoZQorICAgIC8vIGxheWVyIHdpdGggZXF1YWwgb3V0Y29tZSwgYnV0IGN1cnJlbnRs
eSBpdCBpcyBhbHNvIHNldCBvbiB0aGUgdHJhbnNmb3JtCisgICAgLy8gbGF5ZXIuIFNpbmNlIHdl
IG9ubHkgYWNjZWxlcmF0ZSBhbmltYXRpb25zIG9mIHRoZXNlIHR3byBwcm9wZXJ0aWVzLCBpdAor
ICAgIC8vIGlzIHNhZmUgdG8gbW92ZSBhbGwgYWNjZWxlcmF0ZWQgYW5pbWF0aW9ucyB0byB0aGUg
dHJhbnNmb3JtIGxheWVyLCBhbmQKKyAgICAvLyByZW1vdmUgdGhlbSBmcm9tIHRoZSBsYXllciBw
cm9wZXIuCisgICAgLy8gU28gdGhlIGZvbGxvd2luZyBjb2RlLCB3aGlsZSBpdCBsb29rcyBzdHJh
bmdlLCBpcyBjb3JyZWN0OgorICAgIC8vIHdlIHRyYW5zZmVyIGFsbCBhbmltYXRpb25zIHRvIHRo
ZSB0cmFuc2Zvcm0gbGF5ZXIgaWYgaXQgZXhpc3RzLgorICAgIC8vIEZJWE1FOiBJZiBvdGhlciBw
cm9wZXJ0aWVzIGJlY29tZSBhbmltYXRlZCwgaXQgbWF5IG5vdCBiZSBlcXVpdmFsZW50IHRvCisg
ICAgLy8gbW92ZSB0aGVtIHRvIHRoZSB0cmFuc2Zvcm0gbGF5ZXIuIFRoZW4gdGhpcyBjb2RlIG5l
ZWRzIHRvIGJlIHJldmlzaXRlZAorICAgIC8vIHRvIG9ubHkgbW92ZSB0aGUgdHJhbnNmb3JtIGFu
aW1hdGlvbnMgdG8gdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0
UnVubmluZ0FuaW1hdGlvbnMobV9ydW5uaW5nQW5pbWF0aW9ucyk7CisgICAgcHJpbWFyeUxheWVy
KCktPnNldFN1c3BlbmRlZEFuaW1hdGlvbnMobV9zdXNwZW5kZWRBbmltYXRpb25zKTsKKworICAg
IC8vIFdlIG5lZWQgdG8gbW92ZSB0aGUgYW5pbWF0aW9ucyB0byB0aGUgdHJhbnNmb3JtIGxheWVy
IGlmIHRoZXJlIGlzIG9uZS4KKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikgeworICAgICAgICBt
X2xheWVyLT5zZXRSdW5uaW5nQW5pbWF0aW9ucyhWZWN0b3I8UmVmUHRyPExheWVyQW5pbWF0aW9u
PiA+KCkpOworICAgICAgICBtX2xheWVyLT5zZXRTdXNwZW5kZWRBbmltYXRpb25zKFZlY3RvcjxS
ZWZQdHI8TGF5ZXJBbmltYXRpb24+ID4oKSk7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5Ojp1cGRhdGVDb250ZW50c1ZpZGVvKCkKK3sKKyAgICAvLyBGSVhNRTogSW1w
bGVtZW50Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUNvbnRlbnRz
UmVjdCgpCit7CisgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fY29udGVudHNMYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludChtX2NvbnRlbnRzUmVj
dC54KCksIG1fY29udGVudHNSZWN0LnkoKSkpOworICAgIG1fY29udGVudHNMYXllci0+c2V0Qm91
bmRzKEludFNpemUobV9jb250ZW50c1JlY3Qud2lkdGgoKSwgbV9jb250ZW50c1JlY3QuaGVpZ2h0
KCkpKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0dXBDb250ZW50c0xh
eWVyKExheWVyV2ViS2l0VGhyZWFkKiBjb250ZW50c0xheWVyKQoreworICAgIGlmIChjb250ZW50
c0xheWVyID09IG1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1f
Y29udGVudHNMYXllcikgeworICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7CisgICAgICAgIG1fY29udGVudHNMYXllciA9IDA7CisgICAgfQorCisgICAgaWYg
KGNvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgbV9jb250ZW50c0xheWVyID0gY29udGVudHNMYXll
cjsKKworICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEFuY2hvclBvaW50KEZsb2F0UG9pbnQo
MCwgMCkpOworCisgICAgICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byB1cGRhdGUgc2V0RHJhd2Fi
bGUgYXMgc29vbiBhcyB3ZSByZWNlaXZlIHRoZSBuZXcgY29udGVudHNMYXllciwgZm9yCisgICAg
ICAgIC8vIHRoZSBjb3JyZWN0bmVzcyBvZiBlYXJseSBleGl0IGNvbmRpdGlvbnMgaW4gc2V0RHJh
d3NDb250ZW50KCkgYW5kIHNldENvbnRlbnRzVmlzaWJsZSgpLgorICAgICAgICBtX2NvbnRlbnRz
TGF5ZXItPnNldERyYXdhYmxlKG1fY29udGVudHNWaXNpYmxlKTsKKworICAgICAgICAvLyBJbnNl
cnQgdGhlIGNvbnRlbnQgbGF5ZXIgZmlyc3QuIFZpZGVvIGVsZW1lbnRzIHJlcXVpcmUgdGhpcywg
YmVjYXVzZSB0aGV5IGhhdmUKKyAgICAgICAgLy8gc2hhZG93IGNvbnRlbnQgdGhhdCBtdXN0IGRp
c3BsYXkgaW4gZnJvbnQgb2YgdGhlIHZpZGVvLgorICAgICAgICBtX2xheWVyLT5pbnNlcnRTdWJs
YXllcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCksIDApOworCisgICAgICAgIHVwZGF0ZUNvbnRlbnRz
UmVjdCgpOworCisgICAgICAgIGlmIChzaG93RGVidWdCb3JkZXJzKCkpIHsKKyAgICAgICAgICAg
IHNldExheWVyQm9yZGVyQ29sb3IoKm1fY29udGVudHNMYXllciwgQ29sb3IoMCwgMCwgMTI4LCAx
ODApKTsKKyAgICAgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0Qm9yZGVyV2lkdGgoMSk7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7Cit9CisKKy8vIFRo
aXMgZnVuY3Rpb24gc2ltcGx5IG1pbWljcyB0aGUgb3BlcmF0aW9uIG9mIEdyYXBoaWNzTGF5ZXJD
QQordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlT3BhY2l0eU9uTGF5ZXIoKQor
eworICAgIHByaW1hcnlMYXllcigpLT5zZXRPcGFjaXR5KG1fb3BhY2l0eSk7Cit9CisKK2Jvb2wg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmNvbnRlbnRzVmlzaWJsZShjb25zdCBJbnRSZWN0JiBj
b250ZW50UmVjdCkgY29uc3QKK3sKKyAgICBpZiAoIW1fY2xpZW50KQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICByZXR1cm4gbV9jbGllbnQtPmNvbnRlbnRzVmlzaWJsZSh0aGlzLCBjb250
ZW50UmVjdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NMYXllckJsYWNrQmVycnkuaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NMYXllckJsYWNr
QmVycnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi4zMjA2MjNiZTkwYmQwMDdlNjEzODdiMWUwYmQ2MTg5YzY5MTk2
Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
YmxhY2tiZXJyeS9HcmFwaGljc0xheWVyQmxhY2tCZXJyeS5oCkBAIC0wLDAgKzEsMTgwIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBM
aW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBHcmFwaGljc0xheWVyQmxhY2tCZXJyeV9o
CisjZGVmaW5lIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5X2gKKworI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IkdyYXBoaWNzTGF5ZXIuaCIKKyNpbmNsdWRlICJMYXllckFuaW1hdGlvbi5oIgorCisjaW5jbHVk
ZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExheWVyV2Vi
S2l0VGhyZWFkOworCitjbGFzcyBHcmFwaGljc0xheWVyQmxhY2tCZXJyeSA6IHB1YmxpYyBHcmFw
aGljc0xheWVyIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0xheWVyQmxhY2tCZXJyeShHcmFwaGlj
c0xheWVyQ2xpZW50Kik7CisgICAgdmlydHVhbCB+R3JhcGhpY3NMYXllckJsYWNrQmVycnkoKTsK
KworICAgIHZpcnR1YWwgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYpOworCisgICAgdmlydHVh
bCBib29sIHNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mKTsKKyAgICB2
aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciopOworICAgIHZpcnR1YWwgdm9pZCBh
ZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBpbmRleCk7CisgICAgdmlydHVhbCB2
b2lkIGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciosIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcp
OworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIqLCBHcmFwaGlj
c0xheWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNz
TGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCk7CisKKyAgICB2aXJ0dWFs
IHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOworCisgICAgdmlydHVhbCB2b2lkIHNldFBvc2l0aW9u
KGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QW5jaG9yUG9pbnQoY29u
c3QgRmxvYXRQb2ludDNEJik7CisgICAgdmlydHVhbCB2b2lkIHNldFNpemUoY29uc3QgRmxvYXRT
aXplJik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29u
c3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVzZXJ2
ZXMzRChib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFza3NUb0JvdW5kcyhib29sKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0RHJhd3NDb250ZW50KGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBz
ZXRDb250ZW50c1Zpc2libGUoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tMYXllcihH
cmFwaGljc0xheWVyKik7CisgICAgdmlydHVhbCB2b2lkIHNldFJlcGxpY2F0ZWRCeUxheWVyKEdy
YXBoaWNzTGF5ZXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Rml4ZWRQb3NpdGlvbihib29sKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0SGFzRml4ZWRDb250YWluZXIoYm9vbCk7CisgICAgdmlydHVh
bCB2b2lkIHNldEhhc0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUoYm9vbCk7CisKKyAgICB2aXJ0dWFs
IHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2b2lk
IGNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNP
cGFxdWUoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tmYWNlVmlzaWJpbGl0eShib29s
KTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRPcGFjaXR5KGZsb2F0KTsKKworICAgIHZpcnR1YWwg
dm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5
SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRz
TmVlZHNEaXNwbGF5KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNSZWN0KGNvbnN0
IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgYm9vbCBhZGRBbmltYXRpb24oY29uc3QgS2V5ZnJh
bWVWYWx1ZUxpc3QmLCBjb25zdCBJbnRTaXplJiAvKmJveFNpemUqLywgY29uc3QgQW5pbWF0aW9u
KiwgY29uc3QgU3RyaW5nJiAvKmFuaW1hdGlvbk5hbWUqLywgZG91YmxlIC8qdGltZU9mZnNldCov
KTsKKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2VBbmltYXRpb24oY29uc3QgU3RyaW5nJiAvKmFuaW1h
dGlvbk5hbWUqLywgZG91YmxlIC8qdGltZU9mZnNldCovKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVt
b3ZlQW5pbWF0aW9uKGNvbnN0IFN0cmluZyYgLyphbmltYXRpb25OYW1lKi8pOworCisgICAgdmly
dHVhbCB2b2lkIHN1c3BlbmRBbmltYXRpb25zKGRvdWJsZSB0aW1lKTsKKyAgICB2aXJ0dWFsIHZv
aWQgcmVzdW1lQW5pbWF0aW9ucygpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9J
bWFnZShJbWFnZSopOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvTWVkaWEoUGxhdGZv
cm1MYXllciopOworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvQ2FudmFzKFBsYXRmb3Jt
TGF5ZXIqKTsKKworICAgIHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNv
bnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENv
bG9yJik7CisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiwgZmxv
YXQgYm9yZGVyV2lkdGgpOworCisgICAgdm9pZCBub3RpZnlTeW5jUmVxdWlyZWQoKQorICAgIHsK
KyAgICAgICAgaWYgKG1fY2xpZW50KQorICAgICAgICAgICAgbV9jbGllbnQtPm5vdGlmeVN5bmNS
ZXF1aXJlZCh0aGlzKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQo
ZG91YmxlIHRpbWUpCisgICAgeworICAgICAgICBpZiAobV9jbGllbnQpCisgICAgICAgICAgICBt
X2NsaWVudC0+bm90aWZ5QW5pbWF0aW9uU3RhcnRlZCh0aGlzLCB0aW1lKTsKKyAgICB9CisKKyAg
ICBib29sIGNvbnRlbnRzVmlzaWJsZShjb25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCkgY29uc3Q7
CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVPcGFjaXR5T25MYXllcigpOworCisgICAgTGF5
ZXJXZWJLaXRUaHJlYWQqIHByaW1hcnlMYXllcigpIGNvbnN0ICB7IHJldHVybiBtX3RyYW5zZm9y
bUxheWVyLmdldCgpID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7IH0K
KyAgICBMYXllcldlYktpdFRocmVhZCogaG9zdExheWVyRm9yU3VibGF5ZXJzKCkgY29uc3Q7Cisg
ICAgTGF5ZXJXZWJLaXRUaHJlYWQqIGxheWVyRm9yU3VwZXJsYXllcigpIGNvbnN0OworCisgICAg
dm9pZCB1cGRhdGVTdWJsYXllckxpc3QoKTsKKyAgICB2b2lkIHVwZGF0ZUxheWVyUG9zaXRpb24o
KTsKKyAgICB2b2lkIHVwZGF0ZUxheWVyU2l6ZSgpOworICAgIHZvaWQgdXBkYXRlQW5jaG9yUG9p
bnQoKTsKKyAgICB2b2lkIHVwZGF0ZVRyYW5zZm9ybSgpOworICAgIHZvaWQgdXBkYXRlQ2hpbGRy
ZW5UcmFuc2Zvcm0oKTsKKyAgICB2b2lkIHVwZGF0ZU1hc2tzVG9Cb3VuZHMoKTsKKyAgICB2b2lk
IHVwZGF0ZUNvbnRlbnRzT3BhcXVlKCk7CisgICAgdm9pZCB1cGRhdGVCYWNrZmFjZVZpc2liaWxp
dHkoKTsKKyAgICB2b2lkIHVwZGF0ZUxheWVyUHJlc2VydmVzM0QoKTsKKyAgICB2b2lkIHVwZGF0
ZUxheWVySXNEcmF3YWJsZSgpOworICAgIHZvaWQgdXBkYXRlRml4ZWRQb3NpdGlvbigpOworICAg
IHZvaWQgdXBkYXRlSGFzRml4ZWRDb250YWluZXIoKTsKKyAgICB2b2lkIHVwZGF0ZUhhc0ZpeGVk
QW5jZXN0b3JJbkRPTVRyZWUoKTsKKyAgICB2b2lkIHVwZGF0ZUxheWVyQmFja2dyb3VuZENvbG9y
KCk7CisgICAgdm9pZCB1cGRhdGVBbmltYXRpb25zKCk7CisKKyAgICB2b2lkIHVwZGF0ZUNvbnRl
bnRzSW1hZ2UoSW1hZ2UqKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzVmlkZW8oKTsKKyAgICB2
b2lkIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworCisgICAgdm9pZCBzZXR1cENvbnRlbnRzTGF5ZXIo
TGF5ZXJXZWJLaXRUaHJlYWQqKTsKKyAgICBMYXllcldlYktpdFRocmVhZCogY29udGVudHNMYXll
cigpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudHNMYXllci5nZXQoKTsgfQorCisgICAgUmVmUHRy
PExheWVyV2ViS2l0VGhyZWFkPiBtX2xheWVyOworICAgIFJlZlB0cjxMYXllcldlYktpdFRocmVh
ZD4gbV90cmFuc2Zvcm1MYXllcjsKKyAgICBSZWZQdHI8TGF5ZXJXZWJLaXRUaHJlYWQ+IG1fY29u
dGVudHNMYXllcjsKKworICAgIFZlY3RvcjxSZWZQdHI8TGF5ZXJBbmltYXRpb24+ID4gbV9ydW5u
aW5nQW5pbWF0aW9uczsKKyAgICBWZWN0b3I8UmVmUHRyPExheWVyQW5pbWF0aW9uPiA+IG1fc3Vz
cGVuZGVkQW5pbWF0aW9uczsKKyAgICBkb3VibGUgbV9zdXNwZW5kVGltZTsKKworICAgIGVudW0g
Q29udGVudHNMYXllclB1cnBvc2UgeworICAgICAgICBOb0NvbnRlbnRzTGF5ZXIgPSAwLAorICAg
ICAgICBDb250ZW50c0xheWVyRm9ySW1hZ2UsCisgICAgICAgIENvbnRlbnRzTGF5ZXJGb3JWaWRl
bywKKyAgICAgICAgQ29udGVudHNMYXllckZvckNhbnZhcywKKyAgICB9OworCisgICAgQ29udGVu
dHNMYXllclB1cnBvc2UgbV9jb250ZW50c0xheWVyUHVycG9zZTsKKyAgICBib29sIG1fY29udGVu
dHNMYXllckhhc0JhY2tncm91bmRDb2xvciA6IDE7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129652</attachid>
            <date>2012-03-01 00:19:58 -0800</date>
            <delta_ts>2012-03-07 02:56:51 -0800</delta_ts>
            <desc>patch v2</desc>
            <filename>bug-79867-20120301161952.patch</filename>
            <type>text/plain</type>
            <size>42045</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5MzAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNmJjMWIzZmZmMjZjZTY2
ZjM1YTA0YzgyNThiZThlMzZjMWQyYWM3OS4uZWQ3NDQwMTJjZjllYjdmYmFmZGMyZTBmYWExMzVh
ZGM3Y2RjY2VlNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk3IEBACisyMDEyLTAzLTAxICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBHcmFwaGljc0xheWVyQmxhY2tCZXJyeS57aCwgY3BwfQorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk4NjcKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBu
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAg
ICAgICAgKFdlYkNvcmU6OnNldExheWVyQm9yZGVyQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
Y2xlYXJCb3JkZXJDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpzZXRMYXllckJhY2tncm91bmRD
b2xvcik6CisgICAgICAgIChXZWJDb3JlOjpjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnkpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6On5HcmFwaGljc0xheWVyQmxh
Y2tCZXJyeSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0
TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q2hp
bGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFkZENo
aWxkKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGls
ZEF0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFk
ZENoaWxkQmVsb3cpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6
OmFkZENoaWxkQWJvdmUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnJlcGxhY2VDaGlsZCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6cmVtb3ZlRnJvbVBhcmVudCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6c2V0UG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6OnNldEFuY2hvclBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5OjpzZXRUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckJsYWNrQmVycnk6OnNldENoaWxkcmVuVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRQcmVzZXJ2ZXMzRCk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TWFza3NUb0JvdW5kcyk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0RHJhd3NDb250ZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c1Zpc2li
bGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE1hc2tM
YXllcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0UmVw
bGljYXRlZEJ5TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnNldEZpeGVkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJs
YWNrQmVycnk6OnNldEhhc0ZpeGVkQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRCYWNrZ3JvdW5kQ29sb3Ip
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmNsZWFyQmFja2dy
b3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXRDb250ZW50c09wYXF1ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRPcGFjaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c05lZWRzRGlzcGxheSk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TmVlZHNEaXNwbGF5KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXROZWVkc0Rpc3BsYXlJblJlY3Qp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRz
UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpyZW1vdmVBbmltYXRpb25CeUlkQW5kUHJvcGVydHkp
OgorICAgICAgICAoV2ViQ29yZTo6cmVtb3ZlQW5pbWF0aW9uQnlOYW1lKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRBbmltYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBhdXNlQW5pbWF0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZW1vdmVBbmltYXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnN1c3BlbmRBbmltYXRp
b25zKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZXN1bWVB
bmltYXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXRDb250ZW50c1RvSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnVwZGF0ZUNvbnRlbnRzSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9DYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9NZWRpYSk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6aG9zdExheWVyRm9yU3VibGF5ZXJzKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpsYXllckZvclN1cGVy
bGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBsYXRm
b3JtTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNl
dERlYnVnQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXREZWJ1Z0JvcmRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xh
eWVyQmxhY2tCZXJyeTo6dXBkYXRlU3VibGF5ZXJMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclBvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclNpemUpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUFuY2hvclBvaW50KToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVUcmFuc2Zv
cm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUNo
aWxkcmVuVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5Ojp1cGRhdGVNYXNrc1RvQm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5Ojp1cGRhdGVDb250ZW50c09wYXF1ZSk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclByZXNlcnZl
czNEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVM
YXllcklzRHJhd2FibGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnVwZGF0ZUZpeGVkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6OnVwZGF0ZUhhc0ZpeGVkQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVl
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXll
ckJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6dXBkYXRlQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNWaWRlbyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNSZWN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXR1cENvbnRlbnRzTGF5ZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZU9wYWNpdHlPbkxheWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpjb250ZW50c1Zp
c2libGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NM
YXllckJsYWNrQmVycnkuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5Ojpub3RpZnlTeW5jUmVxdWlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6Om5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnByaW1hcnlMYXllcik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6Y29udGVudHNMYXllcik6CisKIDIwMTIt
MDItMjkgIEphc29uIExpdSAgPGphc29uLmxpdUB0b3JjaG1vYmlsZS5jb20uY24+CiAKICAgICAg
ICAgW0JsYWNrQmVycnldTWFrZSBhYm91dDpjYWNoZSBmZWF0dXJlIGF2YWlsYWJsZSBpbiByZWxl
YXNlIHZlcnNpb24uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9ibGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NMYXllckJsYWNrQmVycnkuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmIxODg5MjQxNTI1MmNlNjMxY2VkMGIyOWFiMzY1NWRlYmIyNGRlMmQKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2Jl
cnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDg4OSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisKKy8qKiBGSVhNRQorICogVGhpcyBmaWxlIGJvcnJvd3MgY29kZSBo
ZWF2aWx5IGZyb20gcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzTGF5ZXJDQUNGLmNwcAor
ICogKGFuZCBoZW5jZSBpdCBpbmNsdWRlcyBib3RoIGNvcHlyaWdodHMpCisgKiBJZGVhbGx5IHRo
ZSBjb21tb24gY29kZSAobW9zdGx5IHRoZSBjb2RlIHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIGxh
eWVyIGhpZXJhcmNoeSkKKyAqIHNob3VsZCBiZSBrZXB0IHNlcGFyYXRlIGFuZCBzaGFyZWQgYmV0
d2VlbiBwbGF0Zm9ybXMuIEl0IHdvdWxkIGJlIGEgd2VsbCB3b3J0aHdoaWxlCisgKiBlZmZvcnQg
b25jZSB0aGUgV2luZG93cyBpbXBsZW1lbnRhdGlvbiAoYmluYXJpZXMgYW5kIGhlYWRlcnMpIG9m
IENvcmVBbmltYXRpb24gaXMKKyAqIGNoZWNrZWQgaW4gdG8gdGhlIFdlYktpdCByZXBvc2l0b3J5
LiBVbnRpbCB0aGVuIG9ubHkgQXBwbGUgY2FuIG1ha2UgdGhpcyBoYXBwZW4uCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisj
aW5jbHVkZSAiR3JhcGhpY3NMYXllckJsYWNrQmVycnkuaCIKKworI2luY2x1ZGUgIkZsb2F0Q29u
dmVyc2lvbi5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisj
aW5jbHVkZSAiTGF5ZXJBbmltYXRpb24uaCIKKyNpbmNsdWRlICJMYXllcldlYktpdFRocmVhZC5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgc2V0TGF5ZXJCb3JkZXJDb2xvcihM
YXllcldlYktpdFRocmVhZCYgbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBsYXll
ci5zZXRCb3JkZXJDb2xvcihjb2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyQm9yZGVyQ29s
b3IoTGF5ZXJXZWJLaXRUaHJlYWQmIGxheWVyKQoreworICAgIGxheWVyLnNldEJvcmRlckNvbG9y
KENvbG9yOjp0cmFuc3BhcmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldExheWVyQmFja2dyb3Vu
ZENvbG9yKExheWVyV2ViS2l0VGhyZWFkJiBsYXllciwgY29uc3QgQ29sb3ImIGNvbG9yKQorewor
ICAgIGxheWVyLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNs
ZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoTGF5ZXJXZWJLaXRUaHJlYWQmIGxheWVyKQoreworICAg
IGxheWVyLnNldEJhY2tncm91bmRDb2xvcihDb2xvcjo6dHJhbnNwYXJlbnQpOworfQorCitQYXNz
T3duUHRyPEdyYXBoaWNzTGF5ZXI+IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZShHcmFwaGljc0xheWVy
Q2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBHcmFwaGljc0xheWVy
QmxhY2tCZXJyeShjbGllbnQpKTsKK30KKworR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OkdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5KEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkKKyAgICA6IEdy
YXBoaWNzTGF5ZXIoY2xpZW50KQorICAgICwgbV9zdXNwZW5kVGltZSgwKQorICAgICwgbV9jb250
ZW50c0xheWVyUHVycG9zZShOb0NvbnRlbnRzTGF5ZXIpCisgICAgLCBtX2NvbnRlbnRzTGF5ZXJI
YXNCYWNrZ3JvdW5kQ29sb3IoZmFsc2UpCit7CisgICAgbV9sYXllciA9IExheWVyV2ViS2l0VGhy
ZWFkOjpjcmVhdGUoTGF5ZXJEYXRhOjpMYXllciwgdGhpcyk7CisKKyAgICB1cGRhdGVEZWJ1Z0lu
ZGljYXRvcnMoKTsKK30KKworR3JhcGhpY3NMYXllckJsYWNrQmVycnk6On5HcmFwaGljc0xheWVy
QmxhY2tCZXJyeSgpCit7CisgICAgaWYgKG1fbGF5ZXIpCisgICAgICAgIG1fbGF5ZXItPnNldE93
bmVyKDApOworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIG1fY29udGVudHNMYXll
ci0+c2V0T3duZXIoMCk7CisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpCisgICAgICAgIG1fdHJh
bnNmb3JtTGF5ZXItPnNldE93bmVyKDApOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5OjpzZXROYW1lKGNvbnN0IFN0cmluZyYgaW5OYW1lKQoreworICAgIFN0cmluZyBuYW1lID0g
U3RyaW5nOjpmb3JtYXQoIkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5KCVwKSBHcmFwaGljc0xheWVy
KCVwKSAiLCBtX2xheWVyLmdldCgpLCB0aGlzKSArIGluTmFtZTsKKyAgICBHcmFwaGljc0xheWVy
OjpzZXROYW1lKG5hbWUpOworfQorCitib29sIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRD
aGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+JiBjaGlsZHJlbikKK3sKKyAgICBi
b29sIGNoaWxkcmVuQ2hhbmdlZCA9IEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuKGNoaWxkcmVu
KTsKKyAgICAvLyBGSVhNRTogR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW4gY2FsbHMgYWRkQ2hp
bGQoKSBmb3IgZWFjaCBzdWJsYXllciwgd2hpY2gKKyAgICAvLyB3aWxsIGVuZCB1cCBjYWxsaW5n
IHVwZGF0ZVN1YmxheWVyTGlzdCgpIE4gdGltZXMuCisgICAgaWYgKGNoaWxkcmVuQ2hhbmdlZCkK
KyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisKKyAgICByZXR1cm4gY2hpbGRyZW5DaGFu
Z2VkOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGlsZChHcmFwaGlj
c0xheWVyKiBjaGlsZExheWVyKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkKGNoaWxk
TGF5ZXIpOworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5OjphZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwg
aW50IGluZGV4KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChjaGlsZExh
eWVyLCBpbmRleCk7CisgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6OmFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogY2hpbGRMYXll
ciwgR3JhcGhpY3NMYXllciogc2libGluZykKK3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGls
ZEJlbG93KGNoaWxkTGF5ZXIsIHNpYmxpbmcpOworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOwor
fQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGlsZEFib3ZlKEdyYXBoaWNz
TGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIgKnNpYmxpbmcpCit7CisgICAgR3JhcGhp
Y3NMYXllcjo6YWRkQ2hpbGRBYm92ZShjaGlsZExheWVyLCBzaWJsaW5nKTsKKyAgICB1cGRhdGVT
dWJsYXllckxpc3QoKTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6cmVwbGFj
ZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCkK
K3sKKyAgICBpZiAoR3JhcGhpY3NMYXllcjo6cmVwbGFjZUNoaWxkKG9sZENoaWxkLCBuZXdDaGls
ZCkpIHsKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnJlbW92ZUZyb21QYXJlbnQoKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnJlbW92ZUZy
b21QYXJlbnQoKTsKKyAgICBsYXllckZvclN1cGVybGF5ZXIoKS0+cmVtb3ZlRnJvbVN1cGVybGF5
ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0UG9zaXRpb24oY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9zaXRpb24o
cG9pbnQpOworICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xh
eWVyQmxhY2tCZXJyeTo6c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiBwb2ludCkK
K3sKKyAgICBpZiAocG9pbnQgPT0gbV9hbmNob3JQb2ludCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgR3JhcGhpY3NMYXllcjo6c2V0QW5jaG9yUG9pbnQocG9pbnQpOworICAgIHVwZGF0ZUFuY2hv
clBvaW50KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldFNpemUoY29u
c3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGlmIChzaXplID09IG1fc2l6ZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0U2l6ZShzaXplKTsKKyAgICB1cGRhdGVM
YXllclNpemUoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0VHJhbnNm
b3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKHRy
YW5zZm9ybSA9PSBtX3RyYW5zZm9ybSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NM
YXllcjo6c2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgdXBkYXRlVHJhbnNmb3JtKCk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENoaWxkcmVuVHJhbnNmb3JtKGNv
bnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKHRyYW5zZm9y
bSA9PSBtX2NoaWxkcmVuVHJhbnNmb3JtKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRDaGlsZHJlblRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIHVwZGF0ZUNoaWxk
cmVuVHJhbnNmb3JtKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldFBy
ZXNlcnZlczNEKGJvb2wgcHJlc2VydmVzM0QpCit7CisgICAgaWYgKHByZXNlcnZlczNEID09IG1f
cHJlc2VydmVzM0QpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFBy
ZXNlcnZlczNEKHByZXNlcnZlczNEKTsKKyAgICB1cGRhdGVMYXllclByZXNlcnZlczNEKCk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCBt
YXNrc1RvQm91bmRzKQoreworICAgIGlmIChtYXNrc1RvQm91bmRzID09IG1fbWFza3NUb0JvdW5k
cykKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0TWFza3NUb0JvdW5k
cyhtYXNrc1RvQm91bmRzKTsKKyAgICB1cGRhdGVNYXNrc1RvQm91bmRzKCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldERyYXdzQ29udGVudChib29sIGRyYXdzQ29udGVu
dCkKK3sKKyAgICAvLyBOb3RlIGNhcmVmdWxseSB0aGlzIGVhcmx5LWV4aXQgaXMgb25seSBjb3Jy
ZWN0IGJlY2F1c2Ugd2UgYWxzbyBwcm9wZXJseSBpbml0aWFsaXplCisgICAgLy8gTGF5ZXJXZWJL
aXRUaHJlYWQ6OmlzRHJhd2FibGUoKSB3aGVuZXZlciBtX2NvbnRlbnRzTGF5ZXIgaXMgc2V0IHRv
IGEgbmV3IGxheWVyIGluIHNldHVwQ29udGVudHNMYXllcigpLgorICAgIGlmIChkcmF3c0NvbnRl
bnQgPT0gbV9kcmF3c0NvbnRlbnQpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5
ZXI6OnNldERyYXdzQ29udGVudChkcmF3c0NvbnRlbnQpOworICAgIHVwZGF0ZUxheWVySXNEcmF3
YWJsZSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c1Zp
c2libGUoYm9vbCBjb250ZW50c1Zpc2libGUpCit7CisgICAgLy8gTm90ZSBjYXJlZnVsbHkgdGhp
cyBlYXJseS1leGl0IGlzIG9ubHkgY29ycmVjdCBiZWNhdXNlIHdlIGFsc28gcHJvcGVybHkgaW5p
dGlhbGl6ZQorICAgIC8vIExheWVyV2ViS2l0VGhyZWFkOjppc0RyYXdhYmxlKCkgd2hlbmV2ZXIg
bV9jb250ZW50c0xheWVyIGlzIHNldCB0byBhIG5ldyBsYXllciBpbiBzZXR1cENvbnRlbnRzTGF5
ZXIoKS4KKyAgICBpZiAoY29udGVudHNWaXNpYmxlID09IG1fY29udGVudHNWaXNpYmxlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c1Zpc2libGUoY29u
dGVudHNWaXNpYmxlKTsKKyAgICB1cGRhdGVMYXllcklzRHJhd2FibGUoKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TWFza0xheWVyKEdyYXBoaWNzTGF5ZXIqIG1hc2tM
YXllcikKK3sKKyAgICBpZiAobWFza0xheWVyID09IG1fbWFza0xheWVyKQorICAgICAgICByZXR1
cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRNYXNrTGF5ZXIobWFza0xheWVyKTsKKworICAg
IExheWVyV2ViS2l0VGhyZWFkKiBtYXNrTGF5ZXJXZWJLaXQgPSBtX21hc2tMYXllciA/IG1fbWFz
a0xheWVyLT5wbGF0Zm9ybUxheWVyKCkgOiAwOworICAgIGlmIChtYXNrTGF5ZXJXZWJLaXQpCisg
ICAgICAgIG1hc2tMYXllcldlYktpdC0+c2V0SXNNYXNrKHRydWUpOworICAgIG1fbGF5ZXItPnNl
dE1hc2tMYXllcihtYXNrTGF5ZXJXZWJLaXQpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpzZXRSZXBsaWNhdGVkQnlMYXllcihHcmFwaGljc0xheWVyKiBsYXllcikKK3sKKyAg
ICBHcmFwaGljc0xheWVyQmxhY2tCZXJyeSogbGF5ZXJXZWJLaXQgPSBzdGF0aWNfY2FzdDxHcmFw
aGljc0xheWVyQmxhY2tCZXJyeSo+KGxheWVyKTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXRSZXBs
aWNhdGVkQnlMYXllcihsYXllcik7CisgICAgTGF5ZXJXZWJLaXRUaHJlYWQqIHJlcGxpY2FMYXll
ciA9IGxheWVyV2ViS2l0ID8gbGF5ZXJXZWJLaXQtPnByaW1hcnlMYXllcigpIDogMDsKKyAgICBw
cmltYXJ5TGF5ZXIoKS0+c2V0UmVwbGljYUxheWVyKHJlcGxpY2FMYXllcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEZpeGVkUG9zaXRpb24oYm9vbCBmaXhlZCkKK3sK
KyAgICBpZiAoZml4ZWQgPT0gbV9maXhlZFBvc2l0aW9uKQorICAgICAgICByZXR1cm47CisKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRGaXhlZFBvc2l0aW9uKGZpeGVkKTsKKyAgICB1cGRhdGVGaXhl
ZFBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEhhc0Zp
eGVkQ29udGFpbmVyKGJvb2wgaGFzRml4ZWRDb250YWluZXIpCit7CisgICAgaWYgKGhhc0ZpeGVk
Q29udGFpbmVyID09IG1faGFzRml4ZWRDb250YWluZXIpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldEhhc0ZpeGVkQ29udGFpbmVyKGhhc0ZpeGVkQ29udGFpbmVyKTsK
KyAgICB1cGRhdGVIYXNGaXhlZENvbnRhaW5lcigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKGJvb2wgaGFzRml4ZWRBbmNl
c3RvckluRE9NVHJlZSkKK3sKKyAgICBpZiAoaGFzRml4ZWRBbmNlc3RvckluRE9NVHJlZSA9PSBt
X2hhc0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBo
aWNzTGF5ZXI6OnNldEhhc0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUoaGFzRml4ZWRBbmNlc3Rvcklu
RE9NVHJlZSk7CisgICAgdXBkYXRlSGFzRml4ZWRBbmNlc3RvckluRE9NVHJlZSgpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29s
b3ImIGNvbG9yKQoreworICAgIGlmIChtX2JhY2tncm91bmRDb2xvclNldCAmJiBtX2JhY2tncm91
bmRDb2xvciA9PSBjb2xvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6
c2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKKworICAgIG1fY29udGVudHNMYXllckhhc0JhY2tn
cm91bmRDb2xvciA9IHRydWU7CisgICAgdXBkYXRlTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKQor
eworICAgIGlmICghbV9iYWNrZ3JvdW5kQ29sb3JTZXQpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzTGF5ZXI6OmNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisgICAgY2xlYXJMYXllckJh
Y2tncm91bmRDb2xvcigqbV9jb250ZW50c0xheWVyKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6c2V0Q29udGVudHNPcGFxdWUoYm9vbCBvcGFxdWUpCit7CisgICAgaWYgKG1f
Y29udGVudHNPcGFxdWUgPT0gb3BhcXVlKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRDb250ZW50c09wYXF1ZShvcGFxdWUpOworICAgIHVwZGF0ZUNvbnRlbnRzT3Bh
cXVlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEJhY2tmYWNlVmlz
aWJpbGl0eShib29sIHZpc2libGUpCit7CisgICAgaWYgKG1fYmFja2ZhY2VWaXNpYmlsaXR5ID09
IHZpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tm
YWNlVmlzaWJpbGl0eSh2aXNpYmxlKTsKKyAgICB1cGRhdGVCYWNrZmFjZVZpc2liaWxpdHkoKTsK
K30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0T3BhY2l0eShmbG9hdCBvcGFj
aXR5KQoreworICAgIGZsb2F0IGNsYW1wZWRPcGFjaXR5ID0gbWF4KG1pbihvcGFjaXR5LCAxLjBm
KSwgMC4wZik7CisKKyAgICBpZiAobV9vcGFjaXR5ID09IGNsYW1wZWRPcGFjaXR5KQorICAgICAg
ICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGNsYW1wZWRPcGFjaXR5
KTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0T3BhY2l0eShvcGFjaXR5KTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q29udGVudHNOZWVkc0Rpc3BsYXkoKQoreworICAg
IGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0TmVlZHNE
aXNwbGF5KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE5lZWRzRGlz
cGxheSgpCit7CisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBtX2xheWVyLT5zZXRO
ZWVkc0Rpc3BsYXkoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TmVl
ZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoZHJhd3ND
b250ZW50KCkpCisgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheUluUmVjdChyZWN0KTsK
K30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q29udGVudHNSZWN0KGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHJlY3QgPT0gbV9jb250ZW50c1JlY3QpCisgICAg
ICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzUmVjdChyZWN0KTsK
KyAgICB1cGRhdGVDb250ZW50c1JlY3QoKTsKK30KKworc3RhdGljIFBhc3NSZWZQdHI8TGF5ZXJB
bmltYXRpb24+IHJlbW92ZUFuaW1hdGlvbkJ5SWRBbmRQcm9wZXJ0eShpbnQgaWQsIEFuaW1hdGVk
UHJvcGVydHlJRCBwcm9wZXJ0eSwgVmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPiYgbGlz
dCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgaWYgKGxpc3RbaV0tPmlkKCkgPT0gaWQgJiYgbGlzdFtpXS0+cHJvcGVydHkoKSA9PSBw
cm9wZXJ0eSkgeworICAgICAgICAgICAgUmVmUHRyPExheWVyQW5pbWF0aW9uPiBsYXllckFuaW1h
dGlvbiA9IGxpc3RbaV07CisgICAgICAgICAgICBsaXN0LnJlbW92ZShpKTsKKyAgICAgICAgICAg
IHJldHVybiBsYXllckFuaW1hdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBQ
YXNzUmVmUHRyPExheWVyQW5pbWF0aW9uPigpOworfQorCitzdGF0aWMgUGFzc1JlZlB0cjxMYXll
ckFuaW1hdGlvbj4gcmVtb3ZlQW5pbWF0aW9uQnlOYW1lKGNvbnN0IFN0cmluZyYgYW5pbWF0aW9u
TmFtZSwgVmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPiYgbGlzdCkKK3sKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGxpc3Rb
aV0tPm5hbWUoKSA9PSBhbmltYXRpb25OYW1lKSB7CisgICAgICAgICAgICBSZWZQdHI8TGF5ZXJB
bmltYXRpb24+IGxheWVyQW5pbWF0aW9uID0gbGlzdFtpXTsKKyAgICAgICAgICAgIGxpc3QucmVt
b3ZlKGkpOworICAgICAgICAgICAgcmV0dXJuIGxheWVyQW5pbWF0aW9uLnJlbGVhc2UoKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBQYXNzUmVmUHRyPExheWVyQW5pbWF0aW9uPigp
OworfQorCitib29sIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRBbmltYXRpb24oY29uc3Qg
S2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3Qg
QW5pbWF0aW9uKiBhbmltYXRpb24sIGNvbnN0IFN0cmluZyYgYW5pbWF0aW9uTmFtZSwgZG91Ymxl
IHRpbWVPZmZzZXQpCit7CisgICAgLy8gVGhpcyBpcyB3aGF0IEdyYXBoaWNzTGF5ZXJDQSBjaGVj
a3MgZm9yLgorICAgIGlmICghYW5pbWF0aW9uIHx8IGFuaW1hdGlvbi0+aXNFbXB0eU9yWmVyb0R1
cmF0aW9uKCkgfHwgdmFsdWVzLnNpemUoKSA8IDIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIFdlIG9ubHkgc3VwcG9ydCB0aGVzZSB0d28ga2luZHMgb2YgcHJvcGVydGllcyBBVE0u
CisgICAgaWYgKHZhbHVlcy5wcm9wZXJ0eSgpICE9IEFuaW1hdGVkUHJvcGVydHlXZWJraXRUcmFu
c2Zvcm0gJiYgdmFsdWVzLnByb3BlcnR5KCkgIT0gQW5pbWF0ZWRQcm9wZXJ0eU9wYWNpdHkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFJlbW92ZSBhbnkgcnVubmluZyBhbmltYXRp
b24gZm9yIHRoZSBzYW1lIHByb3BlcnR5LgorICAgIC8vIEZJWE1FOiBNYXliZSB0aGlzIGlzIHN1
cGVyc3RpdGlvbiwgSSBnb3QgdGhlIGlkZWEgZnJvbSBHcmFwaGljc0xheWVyUXQKKyAgICAvLyBX
ZWJDb3JlIG1pZ2h0IGJlIGFkZGluZyBhbiBhbmltYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lLCBi
dXQgZm9yIGEgZGlmZmVyZW50IHByb3BlcnR5CisgICAgcmVtb3ZlQW5pbWF0aW9uQnlJZEFuZFBy
b3BlcnR5KExheWVyQW5pbWF0aW9uOjppZEZyb21BbmltYXRpb24oYW5pbWF0aW9uKSwgdmFsdWVz
LnByb3BlcnR5KCksIG1fcnVubmluZ0FuaW1hdGlvbnMpOworICAgIHJlbW92ZUFuaW1hdGlvbkJ5
SWRBbmRQcm9wZXJ0eShMYXllckFuaW1hdGlvbjo6aWRGcm9tQW5pbWF0aW9uKGFuaW1hdGlvbiks
IHZhbHVlcy5wcm9wZXJ0eSgpLCBtX3N1c3BlbmRlZEFuaW1hdGlvbnMpOworCisgICAgUmVmUHRy
PExheWVyQW5pbWF0aW9uPiBsYXllckFuaW1hdGlvbiA9IExheWVyQW5pbWF0aW9uOjpjcmVhdGUo
dmFsdWVzLCBib3hTaXplLCBhbmltYXRpb24sIGFuaW1hdGlvbk5hbWUsIHRpbWVPZmZzZXQpOwor
CisjaWYgREVCVUdfTEFZRVJfQU5JTUFUSU9OCisgICAgZnByaW50ZihzdGRlcnIsICJMYXllckFu
aW1hdGlvbiAweCUwOHg6IEFkZGluZyBhbmltYXRpb24gJXMgZm9yIHByb3BlcnR5ICVkXG4iLCBs
YXllckFuaW1hdGlvbi5nZXQoKSwgYW5pbWF0aW9uTmFtZS5sYXRpbjEoKS5kYXRhKCksIHZhbHVl
cy5wcm9wZXJ0eSgpKTsKKyNlbmRpZgorCisgICAgbV9ydW5uaW5nQW5pbWF0aW9ucy5hcHBlbmQo
bGF5ZXJBbmltYXRpb24pOworCisgICAgdXBkYXRlQW5pbWF0aW9ucygpOworCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBhdXNlQW5pbWF0aW9u
KGNvbnN0IFN0cmluZyYgYW5pbWF0aW9uTmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpCit7CisgICAg
Ly8gV2ViQ29yZSBtaWdodCBoYXZlIGFkZGVkIHNldmVyYWwgYW5pbWF0aW9ucyB3aXRoIHRoZSBz
YW1lIG5hbWUsIGJ1dCBmb3IgZGlmZmVyZW50IHByb3BlcnRpZXMKKworICAgIHdoaWxlIChSZWZQ
dHI8TGF5ZXJBbmltYXRpb24+IGFuaW1hdGlvbiA9IHJlbW92ZUFuaW1hdGlvbkJ5TmFtZShhbmlt
YXRpb25OYW1lLCBtX3J1bm5pbmdBbmltYXRpb25zKSkgeworI2lmIERFQlVHX0xBWUVSX0FOSU1B
VElPTgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkxheWVyQW5pbWF0aW9uIDB4JTA4eDogUGF1
c2luZyBhbmltYXRpb24gJXNcbiIsIGFuaW1hdGlvbi5nZXQoKSwgYW5pbWF0aW9uLT5uYW1lKCku
bGF0aW4xKCkuZGF0YSgpKTsKKyNlbmRpZgorCisgICAgICAgIC8vIExheWVyQW5pbWF0aW9uIGlz
IHJlYWRvbmx5LiBDcmVhdGUgYSBuZXcgYW5pbWF0aW9uIHdpdGggdGhlIHNhbWUgZGF0YSBleGNl
cHQgZm9yIHRpbWVPZmZzZXQuCisgICAgICAgIC8vIFdlYkNvcmUgd2lsbCBhZGp1c3QgdGhlIHRp
bWVPZmZzZXQgZm9yIHBhdXNlZCBhbmltYXRpb25zIHNvIGl0IGNhbiBiZSB1c2VkIHRvIGNhbGN1
bGF0ZSB0aGUKKyAgICAgICAgLy8gcHJvZ3Jlc3MgZm9yIHRoZSBwYXVzZWQgYW5pbWF0aW9uIHdp
dGhvdXQga25vd2luZyB0aGUgZXhhY3QgdGltZXN0YW1wIHdoZW4gdGhlIGFuaW1hdGlvbiB3YXMK
KyAgICAgICAgLy8gcGF1c2VkLgorICAgICAgICAvLyBJZiBhbiBhbmltYXRpb24gd2FzIHN0YXJ0
ZWQgd2l0aCBhIHRpbWVPZmZzZXQgZHRfb3JpZyBhbmQgcGF1c2VkIGR0X3BhdXNlIHNlY29uZHMg
bGF0ZXIsIHRoZQorICAgICAgICAvLyBjbG9uZWQgYW5pbWF0aW9uIHdpbGwgaGF2ZSBhIHRpbWVP
ZmZzZXQgb2YgZHRfcGF1c2UgKyBkdF9vcmlnLgorICAgICAgICBhbmltYXRpb24gPSBhbmltYXRp
b24tPmNsb25lKHRpbWVPZmZzZXQpOworICAgICAgICBtX3N1c3BlbmRlZEFuaW1hdGlvbnMuYXBw
ZW5kKGFuaW1hdGlvbik7CisKKyNpZiBERUJVR19MQVlFUl9BTklNQVRJT04KKyAgICAgICAgZnBy
aW50ZihzdGRlcnIsICJMYXllckFuaW1hdGlvbiAweCUwOHg6IFBhdXNlZCBhbmltYXRpb24gJXNc
biIsIGFuaW1hdGlvbi5nZXQoKSwgYW5pbWF0aW9uLT5uYW1lKCkubGF0aW4xKCkuZGF0YSgpKTsK
KyNlbmRpZgorICAgIH07CisKKyAgICB1cGRhdGVBbmltYXRpb25zKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllckJsYWNrQmVycnk6OnJlbW92ZUFuaW1hdGlvbihjb25zdCBTdHJpbmcmIGFuaW1h
dGlvbk5hbWUpCit7CisgICAgLy8gV2ViQ29yZSBtaWdodCBoYXZlIGFkZGVkIHNldmVyYWwgYW5p
bWF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUsIGJ1dCBmb3IgZGlmZmVyZW50IHByb3BlcnRpZXMK
KworI2lmIERFQlVHX0xBWUVSX0FOSU1BVElPTgorICAgIGZwcmludGYoc3RkZXJyLCAiTGF5ZXJB
bmltYXRpb246IFJlbW92aW5nIGFuaW1hdGlvbiAlc1xuIiwgYW5pbWF0aW9uTmFtZS5sYXRpbjEo
KS5kYXRhKCkpOworI2VuZGlmCisKKyAgICB3aGlsZSAocmVtb3ZlQW5pbWF0aW9uQnlOYW1lKGFu
aW1hdGlvbk5hbWUsIG1fcnVubmluZ0FuaW1hdGlvbnMpKSB7IH0KKyAgICB3aGlsZSAocmVtb3Zl
QW5pbWF0aW9uQnlOYW1lKGFuaW1hdGlvbk5hbWUsIG1fc3VzcGVuZGVkQW5pbWF0aW9ucykpIHsg
fQorCisgICAgdXBkYXRlQW5pbWF0aW9ucygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpzdXNwZW5kQW5pbWF0aW9ucyhkb3VibGUgdGltZSkKK3sKKyNpZiBERUJVR19MQVlF
Ul9BTklNQVRJT04KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxheWVyQW5pbWF0aW9uOiBTdXNwZW5k
aW5nIGFuaW1hdGlvbnNcbiIpOworI2VuZGlmCisgICAgbV9zdXNwZW5kVGltZSA9IHRpbWU7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnJlc3VtZUFuaW1hdGlvbnMoKQorewor
I2lmIERFQlVHX0xBWUVSX0FOSU1BVElPTgorICAgIGZwcmludGYoc3RkZXJyLCAiTGF5ZXJBbmlt
YXRpb246IFJlc3VtaW5nIGFuaW1hdGlvbnNcbiIpOworI2VuZGlmCisgICAgbV9zdXNwZW5kVGlt
ZSA9IDA7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9J
bWFnZShJbWFnZSogaW1hZ2UpCit7CisgICAgYm9vbCBjaGlsZHJlbkNoYW5nZWQgPSBmYWxzZTsK
KyAgICBpZiAoaW1hZ2UpIHsKKyAgICAgICAgbV9jb250ZW50c0xheWVyUHVycG9zZSA9IENvbnRl
bnRzTGF5ZXJGb3JJbWFnZTsKKyAgICAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAg
ICAgICBjaGlsZHJlbkNoYW5nZWQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fY29u
dGVudHNMYXllclB1cnBvc2UgPSBOb0NvbnRlbnRzTGF5ZXI7CisgICAgICAgIGlmIChtX2NvbnRl
bnRzTGF5ZXIpCisgICAgICAgICAgICBjaGlsZHJlbkNoYW5nZWQgPSB0cnVlOworICAgIH0KKwor
ICAgIHVwZGF0ZUNvbnRlbnRzSW1hZ2UoaW1hZ2UpOworCisgICAgaWYgKGNoaWxkcmVuQ2hhbmdl
ZCkKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6OnVwZGF0ZUNvbnRlbnRzSW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAgIGlm
IChpbWFnZSkgeworICAgICAgICBpZiAoIW1fY29udGVudHNMYXllci5nZXQoKSkgeworICAgICAg
ICAgICAgUmVmUHRyPExheWVyV2ViS2l0VGhyZWFkPiBpbWFnZUxheWVyID0gTGF5ZXJXZWJLaXRU
aHJlYWQ6OmNyZWF0ZShMYXllckRhdGE6OkxheWVyLCB0aGlzKTsKKworICAgICAgICAgICAgc2V0
dXBDb250ZW50c0xheWVyKGltYWdlTGF5ZXIuZ2V0KCkpOworICAgICAgICAgICAgbV9jb250ZW50
c0xheWVyID0gaW1hZ2VMYXllcjsKKyAgICAgICAgICAgIC8vIG1fY29udGVudHNMYXllciB3aWxs
IGJlIHBhcmVudGVkIGJ5IHVwZGF0ZVN1YmxheWVyTGlzdC4KKyAgICAgICAgfQorICAgICAgICBt
X2NvbnRlbnRzTGF5ZXItPnNldENvbnRlbnRzKGltYWdlKTsKKworICAgICAgICB1cGRhdGVDb250
ZW50c1JlY3QoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBObyBpbWFnZS4gbV9jb250ZW50
c0xheWVyIHdpbGwgYmUgcmVtb3ZlZCB2aWEgdXBkYXRlU3VibGF5ZXJMaXN0LgorICAgICAgICBt
X2NvbnRlbnRzTGF5ZXIgPSAwOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6c2V0Q29udGVudHNUb0NhbnZhcyhQbGF0Zm9ybUxheWVyKiBwbGF0Zm9ybUxheWVyKQor
eworICAgIGJvb2wgY2hpbGRyZW5DaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKHBsYXRmb3JtTGF5
ZXIpIHsKKyAgICAgICAgcGxhdGZvcm1MYXllci0+c2V0T3duZXIodGhpcyk7CisgICAgICAgIGlm
IChtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgIT0gcGxhdGZvcm1MYXllcikgeworICAgICAgICAgICAg
c2V0dXBDb250ZW50c0xheWVyKHBsYXRmb3JtTGF5ZXIpOworICAgICAgICAgICAgbV9jb250ZW50
c0xheWVyID0gcGxhdGZvcm1MYXllcjsKKyAgICAgICAgICAgIG1fY29udGVudHNMYXllclB1cnBv
c2UgPSBDb250ZW50c0xheWVyRm9yQ2FudmFzOworICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2Vk
ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldE5lZWRzRGlz
cGxheSgpOworICAgICAgICB1cGRhdGVDb250ZW50c1JlY3QoKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgICAgICBjaGlsZHJlbkNoYW5nZWQg
PSB0cnVlOworCisgICAgICAgICAgICAvLyBUaGUgb2xkIGNvbnRlbnRzIGxheWVyIHdpbGwgYmUg
cmVtb3ZlZCB2aWEgdXBkYXRlU3VibGF5ZXJMaXN0LgorICAgICAgICAgICAgbV9jb250ZW50c0xh
eWVyID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjaGlsZHJlbkNoYW5nZWQpCisg
ICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpzZXRDb250ZW50c1RvTWVkaWEoUGxhdGZvcm1MYXllciogbGF5ZXIpCit7CisgICAg
Ym9vbCBjaGlsZHJlbkNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAobGF5ZXIpIHsKKyAgICAgICAg
aWYgKCFtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgfHwgbV9jb250ZW50c0xheWVyUHVycG9zZSAhPSBD
b250ZW50c0xheWVyRm9yVmlkZW8pIHsKKyAgICAgICAgICAgIHNldHVwQ29udGVudHNMYXllcihs
YXllcik7CisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSBsYXllcjsKKyAgICAgICAgICAg
IG1fY29udGVudHNMYXllclB1cnBvc2UgPSBDb250ZW50c0xheWVyRm9yVmlkZW87CisgICAgICAg
ICAgICBjaGlsZHJlbkNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGxheWVyLT5z
ZXRPd25lcih0aGlzKTsKKyAgICAgICAgbGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworICAgICAg
ICB1cGRhdGVDb250ZW50c1JlY3QoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9jb250
ZW50c0xheWVyKSB7CisgICAgICAgICAgICBjaGlsZHJlbkNoYW5nZWQgPSB0cnVlOworICAKKyAg
ICAgICAgICAgIC8vIFRoZSBvbGQgY29udGVudHMgbGF5ZXIgd2lsbCBiZSByZW1vdmVkIHZpYSB1
cGRhdGVTdWJsYXllckxpc3QuCisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSAwOworICAg
ICAgICB9CisgICAgfQorICAKKyAgICBpZiAoY2hpbGRyZW5DaGFuZ2VkKQorICAgICAgICB1cGRh
dGVTdWJsYXllckxpc3QoKTsKK30KKworUGxhdGZvcm1MYXllciogR3JhcGhpY3NMYXllckJsYWNr
QmVycnk6Omhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdHJh
bnNmb3JtTGF5ZXIgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDogbV9sYXllci5nZXQoKTsKK30K
KworUGxhdGZvcm1MYXllciogR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmxheWVyRm9yU3VwZXJs
YXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdHJhbnNmb3JtTGF5ZXIgPyBtX3RyYW5zZm9y
bUxheWVyLmdldCgpIDogbV9sYXllci5nZXQoKTsKK30KKworUGxhdGZvcm1MYXllciogR3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6OnBsYXRmb3JtTGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBw
cmltYXJ5TGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0RGVi
dWdCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChjb2xvci5p
c1ZhbGlkKCkpCisgICAgICAgIHNldExheWVyQmFja2dyb3VuZENvbG9yKCptX2xheWVyLCBjb2xv
cik7CisgICAgZWxzZQorICAgICAgICBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKCptX2xheWVy
KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0RGVidWdCb3JkZXIoY29u
c3QgQ29sb3ImIGNvbG9yLCBmbG9hdCBib3JkZXJXaWR0aCkKK3sKKyAgICBpZiAoY29sb3IuaXNW
YWxpZCgpKSB7CisgICAgICAgIHNldExheWVyQm9yZGVyQ29sb3IoKm1fbGF5ZXIsIGNvbG9yKTsK
KyAgICAgICAgbV9sYXllci0+c2V0Qm9yZGVyV2lkdGgoYm9yZGVyV2lkdGgpOworICAgIH0gZWxz
ZSB7CisgICAgICAgIGNsZWFyQm9yZGVyQ29sb3IoKm1fbGF5ZXIpOworICAgICAgICBtX2xheWVy
LT5zZXRCb3JkZXJXaWR0aCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnVwZGF0ZVN1YmxheWVyTGlzdCgpCit7CisgICAgVmVjdG9yPFJlZlB0cjxMYXllcldl
YktpdFRocmVhZD4gPiBuZXdTdWJsYXllcnM7CisKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikg
eworICAgICAgICAvLyBBZGQgdGhlIHByaW1hcnkgbGF5ZXIgZmlyc3QuIEV2ZW4gaWYgd2UgaGF2
ZSBuZWdhdGl2ZSB6LW9yZGVyIGNoaWxkcmVuLCB0aGUgcHJpbWFyeSBsYXllciBhbHdheXMgY29t
ZXMgYmVoaW5kLgorICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKG1fbGF5ZXIuZ2V0KCkpOwor
ICAgIH0gZWxzZSBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIC8vIEZJWE1FOiBhZGQg
dGhlIGNvbnRlbnRzIGxheWVyIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggbmVnYXRpdmUgei1v
cmRlciBjaGlsZHJlbi4KKyAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjYXVzZSB2aXNpYmxlIHJl
bmRlcmluZyBpc3N1ZXMgYmVjYXVzZSBjdXJyZW50bHkgY29udGVudHMgbGF5ZXJzIGFyZSBvbmx5
IHVzZWQKKyAgICAgICAgLy8gZm9yIHJlcGxhY2VkIGVsZW1lbnRzIHRoYXQgZG9uJ3QgaGF2ZSBj
aGlsZHJlbi4KKyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZChtX2NvbnRlbnRzTGF5ZXIuZ2V0
KCkpOworICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mIGNoaWxkTGF5
ZXJzID0gY2hpbGRyZW4oKTsKKyAgICBzaXplX3QgbnVtQ2hpbGRyZW4gPSBjaGlsZExheWVycy5z
aXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgKytpKSB7Cisg
ICAgICAgIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5KiBjdXJDaGlsZCA9IHN0YXRpY19jYXN0PEdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5Kj4oY2hpbGRMYXllcnNbaV0pOworCisgICAgICAgIExheWVy
V2ViS2l0VGhyZWFkKiBjaGlsZExheWVyID0gY3VyQ2hpbGQtPmxheWVyRm9yU3VwZXJsYXllcigp
OworICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKGNoaWxkTGF5ZXIpOworICAgIH0KKworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U3VibGF5ZXJzLnNpemUoKTsgKytpKQorICAgICAg
ICBuZXdTdWJsYXllcnNbaV0tPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICBpZiAobV90
cmFuc2Zvcm1MYXllcikgeworICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5zZXRTdWJsYXllcnMo
bmV3U3VibGF5ZXJzKTsKKworICAgICAgICBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAg
ICAgICAvLyBJZiB3ZSBoYXZlIGEgdHJhbnNmb3JtIGxheWVyLCB0aGVuIHRoZSBjb250ZW50cyBs
YXllciBpcyBwYXJlbnRlZCBpbiB0aGUKKyAgICAgICAgICAgIC8vIHByaW1hcnkgbGF5ZXIgKHdo
aWNoIGlzIGl0c2VsZiBhIGNoaWxkIG9mIHRoZSB0cmFuc2Zvcm0gbGF5ZXIpLgorICAgICAgICAg
ICAgbV9sYXllci0+cmVtb3ZlQWxsU3VibGF5ZXJzKCk7CisgICAgICAgICAgICBtX2xheWVyLT5h
ZGRTdWJsYXllcihtX2NvbnRlbnRzTGF5ZXIpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAg
ICAgIG1fbGF5ZXItPnNldFN1YmxheWVycyhuZXdTdWJsYXllcnMpOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclBvc2l0aW9uKCkKK3sKKyAgICAvLyBQb3Np
dGlvbiBpcyBvZmZzZXQgb24gdGhlIGxheWVyIGJ5IHRoZSBsYXllciBhbmNob3IgcG9pbnQuCisg
ICAgRmxvYXRQb2ludCBsYXllclBvc2l0aW9uKG1fcG9zaXRpb24ueCgpICsgbV9hbmNob3JQb2lu
dC54KCkgKiBtX3NpemUud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9w
b3NpdGlvbi55KCkgKyBtX2FuY2hvclBvaW50LnkoKSAqIG1fc2l6ZS5oZWlnaHQoKSk7CisKKyAg
ICBwcmltYXJ5TGF5ZXIoKS0+c2V0UG9zaXRpb24obGF5ZXJQb3NpdGlvbik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUxheWVyU2l6ZSgpCit7CisgICAgSW50U2l6
ZSBsYXllclNpemUobV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWlnaHQoKSk7CisgICAgaWYgKG1f
dHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0Qm91bmRzKGxh
eWVyU2l6ZSk7CisgICAgICAgIC8vIFRoZSBhbmNob3Igb2YgdGhlIGNvbnRlbnRzIGxheWVyIGlz
IGFsd2F5cyBhdCAwLjUsIDAuNSwgc28gdGhlIHBvc2l0aW9uIGlzIGNlbnRlci1yZWxhdGl2ZS4K
KyAgICAgICAgRmxvYXRQb2ludCBjZW50ZXJQb2ludChtX3NpemUud2lkdGgoKSAvIDIsIG1fc2l6
ZS5oZWlnaHQoKSAvIDIpOworICAgICAgICBtX2xheWVyLT5zZXRQb3NpdGlvbihjZW50ZXJQb2lu
dCk7CisgICAgfQorCisgICAgbV9sYXllci0+c2V0Qm91bmRzKGxheWVyU2l6ZSk7CisKKyAgICAv
LyBOb3RlIHRoYXQgd2UgZG9uJ3QgcmVzaXplIG1fY29udGVudHNMYXllci4gSXQncyB1cCB0aGUg
Y2FsbGVyIHRvIGRvIHRoYXQuCisKKyAgICAvLyBJZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBib3VuZHMs
IHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uCisgICAgLy8gb2YgdGhlIGxheWVy
LCB0YWtpbmcgYW5jaG9yIHBvaW50IGludG8gYWNjb3VudC4KKyAgICB1cGRhdGVMYXllclBvc2l0
aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUFuY2hvclBv
aW50KCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5jaG9yUG9pbnQoRmxvYXRQb2ludCht
X2FuY2hvclBvaW50LngoKSwgbV9hbmNob3JQb2ludC55KCkpKTsKKyAgICBwcmltYXJ5TGF5ZXIo
KS0+c2V0QW5jaG9yUG9pbnRaKG1fYW5jaG9yUG9pbnQueigpKTsKKyAgICB1cGRhdGVMYXllclBv
c2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZVRyYW5z
Zm9ybSgpCit7CisgICAgcHJpbWFyeUxheWVyKCktPnNldFRyYW5zZm9ybShtX3RyYW5zZm9ybSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUNoaWxkcmVuVHJhbnNm
b3JtKCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0U3VibGF5ZXJUcmFuc2Zvcm0obV9jaGls
ZHJlblRyYW5zZm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0
ZU1hc2tzVG9Cb3VuZHMoKQoreworICAgIG1fbGF5ZXItPnNldE1hc2tzVG9Cb3VuZHMobV9tYXNr
c1RvQm91bmRzKTsKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNPcGFxdWUoKQoreworICAgIG1fbGF5
ZXItPnNldE9wYXF1ZShtX2NvbnRlbnRzT3BhcXVlKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6dXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KCkKK3sKKyAgICBtX2xheWVyLT5z
ZXREb3VibGVTaWRlZChtX2JhY2tmYWNlVmlzaWJpbGl0eSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllckJsYWNrQmVycnk6OnVwZGF0ZUxheWVyUHJlc2VydmVzM0QoKQoreworICAgIGlmIChtX3By
ZXNlcnZlczNEICYmICFtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIC8vIENyZWF0ZSB0aGUg
dHJhbnNmb3JtIGxheWVyLgorICAgICAgICBtX3RyYW5zZm9ybUxheWVyID0gTGF5ZXJXZWJLaXRU
aHJlYWQ6OmNyZWF0ZShMYXllckRhdGE6OlRyYW5zZm9ybUxheWVyLCB0aGlzKTsKKworICAgICAg
ICAvLyBDb3B5IHRoZSBwb3NpdGlvbiBmcm9tIHRoaXMgbGF5ZXIuCisgICAgICAgIHVwZGF0ZUxh
eWVyUG9zaXRpb24oKTsKKyAgICAgICAgdXBkYXRlTGF5ZXJTaXplKCk7CisgICAgICAgIHVwZGF0
ZUFuY2hvclBvaW50KCk7CisgICAgICAgIHVwZGF0ZVRyYW5zZm9ybSgpOworICAgICAgICB1cGRh
dGVDaGlsZHJlblRyYW5zZm9ybSgpOworICAgICAgICB1cGRhdGVBbmltYXRpb25zKCk7CisKKyAg
ICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludChtX3NpemUud2lkdGgoKSAvIDIu
MGYsIG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpKTsKKworICAgICAgICBtX2xheWVyLT5zZXRBbmNo
b3JQb2ludChGbG9hdFBvaW50KDAuNWYsIDAuNWYpKTsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggaWRlbnRpdHk7CisgICAgICAgIG1fbGF5ZXItPnNldFRyYW5zZm9ybShpZGVudGl0eSk7
CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdGhlIG9sZCBsYXllciB0byBvcGFjaXR5IG9mIDEu
IEZ1cnRoZXIgZG93biB3ZSB3aWxsIHNldCB0aGUgb3BhY2l0eSBvbiB0aGUgdHJhbnNmb3JtIGxh
eWVyLgorICAgICAgICBtX2xheWVyLT5zZXRPcGFjaXR5KDEpOworCisgICAgICAgIC8vIE1vdmUg
dGhpcyBsYXllciB0byBiZSBhIGNoaWxkIG9mIHRoZSB0cmFuc2Zvcm0gbGF5ZXIuCisgICAgICAg
IGlmIChtX2xheWVyLT5zdXBlcmxheWVyKCkpCisgICAgICAgICAgICBtX2xheWVyLT5zdXBlcmxh
eWVyKCktPnJlcGxhY2VTdWJsYXllcihtX2xheWVyLmdldCgpLCBtX3RyYW5zZm9ybUxheWVyLmdl
dCgpKTsKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+YWRkU3VibGF5ZXIobV9sYXllci5nZXQo
KSk7CisKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0UHJlc2VydmVzM0QodHJ1ZSk7Cisg
ICAgICAgIG1fbGF5ZXItPnNldFByZXNlcnZlczNEKHRydWUpOworCisgICAgICAgIHVwZGF0ZVN1
YmxheWVyTGlzdCgpOworICAgIH0gZWxzZSBpZiAoIW1fcHJlc2VydmVzM0QgJiYgbV90cmFuc2Zv
cm1MYXllcikgeworICAgICAgICAvLyBSZWxhY2UgdGhlIHRyYW5zZm9ybUxheWVyIGluIHRoZSBw
YXJlbnQgd2l0aCB0aGlzIGxheWVyLgorICAgICAgICBtX2xheWVyLT5yZW1vdmVGcm9tU3VwZXJs
YXllcigpOworICAgICAgICBpZiAobV90cmFuc2Zvcm1MYXllci0+c3VwZXJsYXllcigpKQorICAg
ICAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c3VwZXJsYXllcigpLT5yZXBsYWNlU3VibGF5ZXIo
bV90cmFuc2Zvcm1MYXllci5nZXQoKSwgbV9sYXllci5nZXQoKSk7CisKKyAgICAgICAgLy8gUmVs
ZWFzZSB0aGUgdHJhbnNmb3JtIGxheWVyLgorICAgICAgICBtX3RyYW5zZm9ybUxheWVyID0gMDsK
KworICAgICAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7CisgICAgICAgIHVwZGF0ZUxheWVyU2l6
ZSgpOworICAgICAgICB1cGRhdGVBbmNob3JQb2ludCgpOworICAgICAgICB1cGRhdGVUcmFuc2Zv
cm0oKTsKKyAgICAgICAgdXBkYXRlQ2hpbGRyZW5UcmFuc2Zvcm0oKTsKKyAgICAgICAgdXBkYXRl
QW5pbWF0aW9ucygpOworCisgICAgICAgIG1fbGF5ZXItPnNldFByZXNlcnZlczNEKGZhbHNlKTsK
KworICAgICAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKKyAgICB9CisKKyAgICB1cGRhdGVPcGFj
aXR5T25MYXllcigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVM
YXllcklzRHJhd2FibGUoKQoreworICAgIC8vIEZvciB0aGUgcmVzdCBvZiB0aGUgYWNjZWxlcmF0
ZWQgY29tcG9zaXRvciBjb2RlLCB0aGVyZSBpcyBubyByZWFzb24gdG8gbWFrZSBhCisgICAgLy8g
ZGlzdGluY3Rpb24gYmV0d2VlbiBkcmF3c0NvbnRlbnQgYW5kIGNvbnRlbnRzVmlzaWJsZS4gU28s
IGZvciBtX2xheWVyLCB0aGVzZSB0d28KKyAgICAvLyBmbGFncyBhcmUgY29tYmluZWQgaGVyZS4g
bV9jb250ZW50c0xheWVyIHNob3VsZG4ndCByZWNlaXZlIHRoZSBkcmF3c0NvbnRlbnQgZmxhZwor
ICAgIC8vIHNvIGl0IGlzIG9ubHkgZ2l2ZW4gY29udGVudHNWaXNpYmxlLgorICAgIG1fbGF5ZXIt
PnNldERyYXdhYmxlKG1fZHJhd3NDb250ZW50ICYmIG1fY29udGVudHNWaXNpYmxlKTsKKworICAg
IGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0RHJhd2Fi
bGUobV9jb250ZW50c1Zpc2libGUpOworCisgICAgaWYgKG1fZHJhd3NDb250ZW50KQorICAgICAg
ICBtX2xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9y
cygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVGaXhlZFBvc2l0
aW9uKCkKK3sKKyAgICBtX2xheWVyLT5zZXRGaXhlZFBvc2l0aW9uKG1fZml4ZWRQb3NpdGlvbik7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUhhc0ZpeGVkQ29udGFp
bmVyKCkKK3sKKyAgICBtX2xheWVyLT5zZXRIYXNGaXhlZENvbnRhaW5lcihtX2hhc0ZpeGVkQ29u
dGFpbmVyKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlSGFzRml4
ZWRBbmNlc3RvckluRE9NVHJlZSgpCit7CisgICAgbV9sYXllci0+c2V0SGFzRml4ZWRBbmNlc3Rv
ckluRE9NVHJlZShtX2hhc0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUpOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllckJhY2tncm91bmRDb2xvcigpCit7CisgICAg
aWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG5ldmVy
IGNyZWF0ZSB0aGUgY29udGVudHMgbGF5ZXIganVzdCBmb3IgYmFja2dyb3VuZCBjb2xvciB5ZXQu
CisgICAgaWYgKG1fYmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICBzZXRMYXllckJhY2tncm91
bmRDb2xvcigqbV9jb250ZW50c0xheWVyLCBtX2JhY2tncm91bmRDb2xvcik7CisgICAgZWxzZQor
ICAgICAgICBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKCptX2NvbnRlbnRzTGF5ZXIpOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVBbmltYXRpb25zKCkKK3sKKyAg
ICAvLyBXaGVuIHRoZXJlIGlzIGEgdHJhbnNmb3JtIGxheWVyLCB0aGUgdHJhbnNmb3JtIG11c3Qg
YmUgc2V0IG9uIHRoYXQgbGF5ZXIKKyAgICAvLyBpbnN0ZWFkIG9mIHRoZSBjb250ZW50IGxheWVy
LiBPcGFjaXR5IGNhbiBiZSBzZXQgb24gdGhlIHRyYW5zZm9ybSBsYXllciBvciB0aGUKKyAgICAv
LyBsYXllciB3aXRoIGVxdWFsIG91dGNvbWUsIGJ1dCBjdXJyZW50bHkgaXQgaXMgYWxzbyBzZXQg
b24gdGhlIHRyYW5zZm9ybQorICAgIC8vIGxheWVyLiBTaW5jZSB3ZSBvbmx5IGFjY2VsZXJhdGUg
YW5pbWF0aW9ucyBvZiB0aGVzZSB0d28gcHJvcGVydGllcywgaXQKKyAgICAvLyBpcyBzYWZlIHRv
IG1vdmUgYWxsIGFjY2VsZXJhdGVkIGFuaW1hdGlvbnMgdG8gdGhlIHRyYW5zZm9ybSBsYXllciwg
YW5kCisgICAgLy8gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbGF5ZXIgcHJvcGVyLgorICAgIC8vIFNv
IHRoZSBmb2xsb3dpbmcgY29kZSwgd2hpbGUgaXQgbG9va3Mgc3RyYW5nZSwgaXMgY29ycmVjdDoK
KyAgICAvLyB3ZSB0cmFuc2ZlciBhbGwgYW5pbWF0aW9ucyB0byB0aGUgdHJhbnNmb3JtIGxheWVy
IGlmIGl0IGV4aXN0cy4KKyAgICAvLyBGSVhNRTogSWYgb3RoZXIgcHJvcGVydGllcyBiZWNvbWUg
YW5pbWF0ZWQsIGl0IG1heSBub3QgYmUgZXF1aXZhbGVudCB0bworICAgIC8vIG1vdmUgdGhlbSB0
byB0aGUgdHJhbnNmb3JtIGxheWVyLiBUaGVuIHRoaXMgY29kZSBuZWVkcyB0byBiZSByZXZpc2l0
ZWQKKyAgICAvLyB0byBvbmx5IG1vdmUgdGhlIHRyYW5zZm9ybSBhbmltYXRpb25zIHRvIHRoZSB0
cmFuc2Zvcm0gbGF5ZXIuCisgICAgcHJpbWFyeUxheWVyKCktPnNldFJ1bm5pbmdBbmltYXRpb25z
KG1fcnVubmluZ0FuaW1hdGlvbnMpOworICAgIHByaW1hcnlMYXllcigpLT5zZXRTdXNwZW5kZWRB
bmltYXRpb25zKG1fc3VzcGVuZGVkQW5pbWF0aW9ucyk7CisKKyAgICAvLyBXZSBuZWVkIHRvIG1v
dmUgdGhlIGFuaW1hdGlvbnMgdG8gdGhlIHRyYW5zZm9ybSBsYXllciBpZiB0aGVyZSBpcyBvbmUu
CisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgbV9sYXllci0+c2V0UnVubmlu
Z0FuaW1hdGlvbnMoVmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPigpKTsKKyAgICAgICAg
bV9sYXllci0+c2V0U3VzcGVuZGVkQW5pbWF0aW9ucyhWZWN0b3I8UmVmUHRyPExheWVyQW5pbWF0
aW9uPiA+KCkpOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBk
YXRlQ29udGVudHNWaWRlbygpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudAorfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVDb250ZW50c1JlY3QoKQoreworICAgIGlm
ICghbV9jb250ZW50c0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2NvbnRlbnRzTGF5
ZXItPnNldFBvc2l0aW9uKEZsb2F0UG9pbnQobV9jb250ZW50c1JlY3QueCgpLCBtX2NvbnRlbnRz
UmVjdC55KCkpKTsKKyAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvdW5kcyhJbnRTaXplKG1fY29u
dGVudHNSZWN0LndpZHRoKCksIG1fY29udGVudHNSZWN0LmhlaWdodCgpKSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldHVwQ29udGVudHNMYXllcihMYXllcldlYktpdFRo
cmVhZCogY29udGVudHNMYXllcikKK3sKKyAgICBpZiAoY29udGVudHNMYXllciA9PSBtX2NvbnRl
bnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsK
KyAgICAgICAgbV9jb250ZW50c0xheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworICAgICAg
ICBtX2NvbnRlbnRzTGF5ZXIgPSAwOworICAgIH0KKworICAgIGlmIChjb250ZW50c0xheWVyKSB7
CisgICAgICAgIG1fY29udGVudHNMYXllciA9IGNvbnRlbnRzTGF5ZXI7CisKKyAgICAgICAgbV9j
b250ZW50c0xheWVyLT5zZXRBbmNob3JQb2ludChGbG9hdFBvaW50KDAsIDApKTsKKworICAgICAg
ICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gdXBkYXRlIHNldERyYXdhYmxlIGFzIHNvb24gYXMgd2Ug
cmVjZWl2ZSB0aGUgbmV3IGNvbnRlbnRzTGF5ZXIsIGZvcgorICAgICAgICAvLyB0aGUgY29ycmVj
dG5lc3Mgb2YgZWFybHkgZXhpdCBjb25kaXRpb25zIGluIHNldERyYXdzQ29udGVudCgpIGFuZCBz
ZXRDb250ZW50c1Zpc2libGUoKS4KKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXREcmF3YWJs
ZShtX2NvbnRlbnRzVmlzaWJsZSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHRoZSBjb250ZW50IGxh
eWVyIGZpcnN0LiBWaWRlbyBlbGVtZW50cyByZXF1aXJlIHRoaXMsIGJlY2F1c2UgdGhleSBoYXZl
CisgICAgICAgIC8vIHNoYWRvdyBjb250ZW50IHRoYXQgbXVzdCBkaXNwbGF5IGluIGZyb250IG9m
IHRoZSB2aWRlby4KKyAgICAgICAgbV9sYXllci0+aW5zZXJ0U3VibGF5ZXIobV9jb250ZW50c0xh
eWVyLmdldCgpLCAwKTsKKworICAgICAgICB1cGRhdGVDb250ZW50c1JlY3QoKTsKKworICAgICAg
ICBpZiAoc2hvd0RlYnVnQm9yZGVycygpKSB7CisgICAgICAgICAgICBzZXRMYXllckJvcmRlckNv
bG9yKCptX2NvbnRlbnRzTGF5ZXIsIENvbG9yKDAsIDAsIDEyOCwgMTgwKSk7CisgICAgICAgICAg
ICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvcmRlcldpZHRoKDEpOworICAgICAgICB9CisgICAgfQor
ICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHNpbXBs
eSBtaW1pY3MgdGhlIG9wZXJhdGlvbiBvZiBHcmFwaGljc0xheWVyQ0EKK3ZvaWQgR3JhcGhpY3NM
YXllckJsYWNrQmVycnk6OnVwZGF0ZU9wYWNpdHlPbkxheWVyKCkKK3sKKyAgICBwcmltYXJ5TGF5
ZXIoKS0+c2V0T3BhY2l0eShtX29wYWNpdHkpOworfQorCitib29sIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5Ojpjb250ZW50c1Zpc2libGUoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QpIGNvbnN0
Cit7CisgICAgaWYgKCFtX2NsaWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0
dXJuIG1fY2xpZW50LT5jb250ZW50c1Zpc2libGUodGhpcywgY29udGVudFJlY3QpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFj
a2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uZWY3Y2RkYWViM2RiNDVmYTI2NTBkNzczNTg4ODBlY2VjYzk5Yjc0MwotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhp
Y3NMYXllckJsYWNrQmVycnkuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0Ogor
ICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisg
KiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg
Q09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdI
VAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpZm5kZWYgR3JhcGhpY3NMYXllckJsYWNrQmVycnlfaAorI2RlZmluZSBHcmFwaGlj
c0xheWVyQmxhY2tCZXJyeV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisK
KyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCisKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJBbmltYXRpb247CitjbGFzcyBMYXll
cldlYktpdFRocmVhZDsKKworY2xhc3MgR3JhcGhpY3NMYXllckJsYWNrQmVycnkgOiBwdWJsaWMg
R3JhcGhpY3NMYXllciB7CitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllckJsYWNrQmVycnkoR3Jh
cGhpY3NMYXllckNsaWVudCopOworICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5
KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmKTsKKworICAgIHZp
cnR1YWwgYm9vbCBzZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+Jik7Cisg
ICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqKTsKKyAgICB2aXJ0dWFsIHZv
aWQgYWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIqLCBpbnQgaW5kZXgpOworICAgIHZpcnR1
YWwgdm9pZCBhZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqLCBHcmFwaGljc0xheWVyKiBzaWJs
aW5nKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVyKiwgR3Jh
cGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVhbCBib29sIHJlcGxhY2VDaGlsZChHcmFw
aGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpOworCisgICAgdmly
dHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRQb3Np
dGlvbihjb25zdCBGbG9hdFBvaW50Jik7CisgICAgdmlydHVhbCB2b2lkIHNldEFuY2hvclBvaW50
KGNvbnN0IEZsb2F0UG9pbnQzRCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXplKGNvbnN0IEZs
b2F0U2l6ZSYpOworCisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldENoaWxkcmVuVHJhbnNmb3Jt
KGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJl
c2VydmVzM0QoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCk7
CisgICAgdmlydHVhbCB2b2lkIHNldERyYXdzQ29udGVudChib29sKTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0Q29udGVudHNWaXNpYmxlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXNrTGF5
ZXIoR3JhcGhpY3NMYXllciopOworICAgIHZpcnR1YWwgdm9pZCBzZXRSZXBsaWNhdGVkQnlMYXll
cihHcmFwaGljc0xheWVyKik7CisgICAgdmlydHVhbCB2b2lkIHNldEZpeGVkUG9zaXRpb24oYm9v
bCk7CisgICAgdmlydHVhbCB2b2lkIHNldEhhc0ZpeGVkQ29udGFpbmVyKGJvb2wpOworICAgIHZp
cnR1YWwgdm9pZCBzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKGJvb2wpOworCisgICAgdmly
dHVhbCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1YWwg
dm9pZCBjbGVhckJhY2tncm91bmRDb2xvcigpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRl
bnRzT3BhcXVlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZmFjZVZpc2liaWxpdHko
Ym9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T3BhY2l0eShmbG9hdCk7CisKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlz
cGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250
ZW50c05lZWRzRGlzcGxheSgpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVjdChj
b25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIGJvb2wgYWRkQW5pbWF0aW9uKGNvbnN0IEtl
eWZyYW1lVmFsdWVMaXN0JiwgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0aW9u
KiwgY29uc3QgU3RyaW5nJiBhbmltYXRpb25OYW1lLCBkb3VibGUgdGltZU9mZnNldCk7CisgICAg
dmlydHVhbCB2b2lkIHBhdXNlQW5pbWF0aW9uKGNvbnN0IFN0cmluZyYgYW5pbWF0aW9uTmFtZSwg
ZG91YmxlIHRpbWVPZmZzZXQpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVBbmltYXRpb24oY29u
c3QgU3RyaW5nJiBhbmltYXRpb25OYW1lKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdXNwZW5kQW5p
bWF0aW9ucyhkb3VibGUgdGltZSk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZUFuaW1hdGlvbnMo
KTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb01lZGlhKFBsYXRmb3JtTGF5ZXIqKTsKKyAgICB2aXJ0
dWFsIHZvaWQgc2V0Q29udGVudHNUb0NhbnZhcyhQbGF0Zm9ybUxheWVyKik7CisKKyAgICB2aXJ0
dWFsIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwg
dm9pZCBzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1YWwg
dm9pZCBzZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYsIGZsb2F0IGJvcmRlcldpZHRoKTsKKwor
ICAgIHZvaWQgbm90aWZ5U3luY1JlcXVpcmVkKCkKKyAgICB7CisgICAgICAgIGlmIChtX2NsaWVu
dCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5ub3RpZnlTeW5jUmVxdWlyZWQodGhpcyk7CisgICAg
fQorCisgICAgdm9pZCBub3RpZnlBbmltYXRpb25TdGFydGVkKGRvdWJsZSB0aW1lKQorICAgIHsK
KyAgICAgICAgaWYgKG1fY2xpZW50KQorICAgICAgICAgICAgbV9jbGllbnQtPm5vdGlmeUFuaW1h
dGlvblN0YXJ0ZWQodGhpcywgdGltZSk7CisgICAgfQorCisgICAgYm9vbCBjb250ZW50c1Zpc2li
bGUoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZv
aWQgdXBkYXRlT3BhY2l0eU9uTGF5ZXIoKTsKKworICAgIExheWVyV2ViS2l0VGhyZWFkKiBwcmlt
YXJ5TGF5ZXIoKSBjb25zdCAgeyByZXR1cm4gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA/IG1fdHJh
bnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOyB9CisgICAgTGF5ZXJXZWJLaXRUaHJl
YWQqIGhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0OworICAgIExheWVyV2ViS2l0VGhyZWFk
KiBsYXllckZvclN1cGVybGF5ZXIoKSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRlU3VibGF5ZXJM
aXN0KCk7CisgICAgdm9pZCB1cGRhdGVMYXllclBvc2l0aW9uKCk7CisgICAgdm9pZCB1cGRhdGVM
YXllclNpemUoKTsKKyAgICB2b2lkIHVwZGF0ZUFuY2hvclBvaW50KCk7CisgICAgdm9pZCB1cGRh
dGVUcmFuc2Zvcm0oKTsKKyAgICB2b2lkIHVwZGF0ZUNoaWxkcmVuVHJhbnNmb3JtKCk7CisgICAg
dm9pZCB1cGRhdGVNYXNrc1RvQm91bmRzKCk7CisgICAgdm9pZCB1cGRhdGVDb250ZW50c09wYXF1
ZSgpOworICAgIHZvaWQgdXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KCk7CisgICAgdm9pZCB1cGRh
dGVMYXllclByZXNlcnZlczNEKCk7CisgICAgdm9pZCB1cGRhdGVMYXllcklzRHJhd2FibGUoKTsK
KyAgICB2b2lkIHVwZGF0ZUZpeGVkUG9zaXRpb24oKTsKKyAgICB2b2lkIHVwZGF0ZUhhc0ZpeGVk
Q29udGFpbmVyKCk7CisgICAgdm9pZCB1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKCk7
CisgICAgdm9pZCB1cGRhdGVMYXllckJhY2tncm91bmRDb2xvcigpOworICAgIHZvaWQgdXBkYXRl
QW5pbWF0aW9ucygpOworCisgICAgdm9pZCB1cGRhdGVDb250ZW50c0ltYWdlKEltYWdlKik7Cisg
ICAgdm9pZCB1cGRhdGVDb250ZW50c1ZpZGVvKCk7CisgICAgdm9pZCB1cGRhdGVDb250ZW50c1Jl
Y3QoKTsKKworICAgIHZvaWQgc2V0dXBDb250ZW50c0xheWVyKExheWVyV2ViS2l0VGhyZWFkKik7
CisgICAgTGF5ZXJXZWJLaXRUaHJlYWQqIGNvbnRlbnRzTGF5ZXIoKSBjb25zdCB7IHJldHVybiBt
X2NvbnRlbnRzTGF5ZXIuZ2V0KCk7IH0KKworICAgIFJlZlB0cjxMYXllcldlYktpdFRocmVhZD4g
bV9sYXllcjsKKyAgICBSZWZQdHI8TGF5ZXJXZWJLaXRUaHJlYWQ+IG1fdHJhbnNmb3JtTGF5ZXI7
CisgICAgUmVmUHRyPExheWVyV2ViS2l0VGhyZWFkPiBtX2NvbnRlbnRzTGF5ZXI7CisKKyAgICBW
ZWN0b3I8UmVmUHRyPExheWVyQW5pbWF0aW9uPiA+IG1fcnVubmluZ0FuaW1hdGlvbnM7CisgICAg
VmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPiBtX3N1c3BlbmRlZEFuaW1hdGlvbnM7Cisg
ICAgZG91YmxlIG1fc3VzcGVuZFRpbWU7CisKKyAgICBlbnVtIENvbnRlbnRzTGF5ZXJQdXJwb3Nl
IHsKKyAgICAgICAgTm9Db250ZW50c0xheWVyID0gMCwKKyAgICAgICAgQ29udGVudHNMYXllckZv
ckltYWdlLAorICAgICAgICBDb250ZW50c0xheWVyRm9yVmlkZW8sCisgICAgICAgIENvbnRlbnRz
TGF5ZXJGb3JDYW52YXMsCisgICAgfTsKKworICAgIENvbnRlbnRzTGF5ZXJQdXJwb3NlIG1fY29u
dGVudHNMYXllclB1cnBvc2U7CisgICAgYm9vbCBtX2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5k
Q29sb3IgOiAxOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130582</attachid>
            <date>2012-03-07 02:57:08 -0800</date>
            <delta_ts>2012-03-08 00:02:23 -0800</delta_ts>
            <desc>patch v3</desc>
            <filename>bug-79867-20120307185705.patch</filename>
            <type>text/plain</type>
            <size>41940</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEwMDM5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMWI5ZjEwZTUzMTMwNjQ1
NDdkMmUwNTY5YTg3MmI4NjU0OGI5YjRkMS4uOTI4OTc0OTU1OTM3NjJkZDE3MThjZDFhZDZmMjMz
NzdiN2RjODZlOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk3IEBACisyMDEyLTAzLTA3ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBHcmFwaGljc0xheWVyQmxhY2tCZXJyeS57aCwgY3BwfQorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk4NjcKKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBu
byBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAg
ICAgICAgKFdlYkNvcmU6OnNldExheWVyQm9yZGVyQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
Y2xlYXJCb3JkZXJDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpzZXRMYXllckJhY2tncm91bmRD
b2xvcik6CisgICAgICAgIChXZWJDb3JlOjpjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnkpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6On5HcmFwaGljc0xheWVyQmxh
Y2tCZXJyeSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0
TmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q2hp
bGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFkZENo
aWxkKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGls
ZEF0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFk
ZENoaWxkQmVsb3cpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6
OmFkZENoaWxkQWJvdmUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnJlcGxhY2VDaGlsZCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6cmVtb3ZlRnJvbVBhcmVudCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6c2V0UG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6OnNldEFuY2hvclBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5OjpzZXRUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckJsYWNrQmVycnk6OnNldENoaWxkcmVuVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRQcmVzZXJ2ZXMzRCk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TWFza3NUb0JvdW5kcyk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0RHJhd3NDb250ZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c1Zpc2li
bGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE1hc2tM
YXllcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0UmVw
bGljYXRlZEJ5TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnNldEZpeGVkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJs
YWNrQmVycnk6OnNldEhhc0ZpeGVkQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRCYWNrZ3JvdW5kQ29sb3Ip
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmNsZWFyQmFja2dy
b3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXRDb250ZW50c09wYXF1ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRPcGFjaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c05lZWRzRGlzcGxheSk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TmVlZHNEaXNwbGF5KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXROZWVkc0Rpc3BsYXlJblJlY3Qp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRz
UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpyZW1vdmVBbmltYXRpb25CeUlkQW5kUHJvcGVydHkp
OgorICAgICAgICAoV2ViQ29yZTo6cmVtb3ZlQW5pbWF0aW9uQnlOYW1lKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRBbmltYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBhdXNlQW5pbWF0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZW1vdmVBbmltYXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnN1c3BlbmRBbmltYXRp
b25zKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZXN1bWVB
bmltYXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXRDb250ZW50c1RvSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnVwZGF0ZUNvbnRlbnRzSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9DYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9NZWRpYSk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6aG9zdExheWVyRm9yU3VibGF5ZXJzKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpsYXllckZvclN1cGVy
bGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBsYXRm
b3JtTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNl
dERlYnVnQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXREZWJ1Z0JvcmRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xh
eWVyQmxhY2tCZXJyeTo6dXBkYXRlU3VibGF5ZXJMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclBvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclNpemUpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUFuY2hvclBvaW50KToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVUcmFuc2Zv
cm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUNo
aWxkcmVuVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5Ojp1cGRhdGVNYXNrc1RvQm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5Ojp1cGRhdGVDb250ZW50c09wYXF1ZSk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclByZXNlcnZl
czNEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVM
YXllcklzRHJhd2FibGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnVwZGF0ZUZpeGVkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6OnVwZGF0ZUhhc0ZpeGVkQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVl
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXll
ckJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6dXBkYXRlQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNWaWRlbyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNSZWN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXR1cENvbnRlbnRzTGF5ZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZU9wYWNpdHlPbkxheWVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpjb250ZW50c1Zp
c2libGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NM
YXllckJsYWNrQmVycnkuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5Ojpub3RpZnlTeW5jUmVxdWlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6Om5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnByaW1hcnlMYXllcik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6Y29udGVudHNMYXllcik6CisKIDIwMTIt
MDMtMDcgIEtlbmljaGkgSXNoaWJhc2hpICA8YmFzaGlAY2hyb21pdW0ub3JnPgogCiAgICAgICAg
IFtXZWJTb2NrZXRdIFNob3VsZCByYWlzZSBTWU5UQVhfRVJSIHdoZW4gbWVzc2FnZSBjb250YWlu
cyB1bnBhaXJlZCBzdXJyb2dhdGVzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NMYXllckJsYWNr
QmVycnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjk2ODM4NDVkYTRjOTIyNWE5MjVmZTY1N2U5YzVjMDljMTBi
NTJlNWUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9ibGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDg4NiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
ICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKy8qKiBGSVhNRQorICogVGhpcyBmaWxlIGJvcnJv
d3MgY29kZSBoZWF2aWx5IGZyb20gcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYXBoaWNzTGF5ZXJD
QUNGLmNwcAorICogKGFuZCBoZW5jZSBpdCBpbmNsdWRlcyBib3RoIGNvcHlyaWdodHMpCisgKiBJ
ZGVhbGx5IHRoZSBjb21tb24gY29kZSAobW9zdGx5IHRoZSBjb2RlIHRoYXQga2VlcHMgdHJhY2sg
b2YgdGhlIGxheWVyIGhpZXJhcmNoeSkKKyAqIHNob3VsZCBiZSBrZXB0IHNlcGFyYXRlIGFuZCBz
aGFyZWQgYmV0d2VlbiBwbGF0Zm9ybXMuIEl0IHdvdWxkIGJlIGEgd2VsbCB3b3J0aHdoaWxlCisg
KiBlZmZvcnQgb25jZSB0aGUgV2luZG93cyBpbXBsZW1lbnRhdGlvbiAoYmluYXJpZXMgYW5kIGhl
YWRlcnMpIG9mIENvcmVBbmltYXRpb24gaXMKKyAqIGNoZWNrZWQgaW4gdG8gdGhlIFdlYktpdCBy
ZXBvc2l0b3J5LiBVbnRpbCB0aGVuIG9ubHkgQXBwbGUgY2FuIG1ha2UgdGhpcyBoYXBwZW4uCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllckJsYWNrQmVycnkuaCIKKworI2luY2x1ZGUg
IkZsb2F0Q29udmVyc2lvbi5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIklt
YWdlLmgiCisjaW5jbHVkZSAiTGF5ZXJBbmltYXRpb24uaCIKKyNpbmNsdWRlICJMYXllcldlYktp
dFRocmVhZC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyB2b2lkIHNldExheWVy
Qm9yZGVyQ29sb3IoTGF5ZXJXZWJLaXRUaHJlYWQmIGxheWVyLCBjb25zdCBDb2xvciYgY29sb3Ip
Cit7CisgICAgbGF5ZXIuc2V0Qm9yZGVyQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9pZCBj
bGVhckJvcmRlckNvbG9yKExheWVyV2ViS2l0VGhyZWFkJiBsYXllcikKK3sKKyAgICBsYXllci5z
ZXRCb3JkZXJDb2xvcihDb2xvcjo6dHJhbnNwYXJlbnQpOworfQorCitzdGF0aWMgdm9pZCBzZXRM
YXllckJhY2tncm91bmRDb2xvcihMYXllcldlYktpdFRocmVhZCYgbGF5ZXIsIGNvbnN0IENvbG9y
JiBjb2xvcikKK3sKKyAgICBsYXllci5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOworfQorCitz
dGF0aWMgdm9pZCBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKExheWVyV2ViS2l0VGhyZWFkJiBs
YXllcikKK3sKKyAgICBsYXllci5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3I6OnRyYW5zcGFyZW50
KTsKK30KKworUGFzc093blB0cjxHcmFwaGljc0xheWVyPiBHcmFwaGljc0xheWVyOjpjcmVhdGUo
R3JhcGhpY3NMYXllckNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBhZG9wdFB0cihuZXcg
R3JhcGhpY3NMYXllckJsYWNrQmVycnkoY2xpZW50KSk7Cit9CisKK0dyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGll
bnQpCisgICAgOiBHcmFwaGljc0xheWVyKGNsaWVudCkKKyAgICAsIG1fc3VzcGVuZFRpbWUoMCkK
KyAgICAsIG1fY29udGVudHNMYXllclB1cnBvc2UoTm9Db250ZW50c0xheWVyKQorICAgICwgbV9j
b250ZW50c0xheWVySGFzQmFja2dyb3VuZENvbG9yKGZhbHNlKQoreworICAgIG1fbGF5ZXIgPSBM
YXllcldlYktpdFRocmVhZDo6Y3JlYXRlKExheWVyRGF0YTo6TGF5ZXIsIHRoaXMpOworCisgICAg
dXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7Cit9CisKK0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp+
R3JhcGhpY3NMYXllckJsYWNrQmVycnkoKQoreworICAgIGlmIChtX2xheWVyKQorICAgICAgICBt
X2xheWVyLT5zZXRPd25lcigwKTsKKyAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICBt
X2NvbnRlbnRzTGF5ZXItPnNldE93bmVyKDApOworICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKQor
ICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5zZXRPd25lcigwKTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyQmxhY2tCZXJyeTo6c2V0TmFtZShjb25zdCBTdHJpbmcmIGluTmFtZSkKK3sKKyAgICBT
dHJpbmcgbmFtZSA9IFN0cmluZzo6Zm9ybWF0KCJHcmFwaGljc0xheWVyQmxhY2tCZXJyeSglcCkg
R3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhpcykgKyBpbk5hbWU7CisgICAg
R3JhcGhpY3NMYXllcjo6c2V0TmFtZShuYW1lKTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyQmxh
Y2tCZXJyeTo6c2V0Q2hpbGRyZW4oY29uc3QgVmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiYgY2hpbGRy
ZW4pCit7CisgICAgYm9vbCBjaGlsZHJlbkNoYW5nZWQgPSBHcmFwaGljc0xheWVyOjpzZXRDaGls
ZHJlbihjaGlsZHJlbik7CisgICAgLy8gRklYTUU6IEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVu
IGNhbGxzIGFkZENoaWxkKCkgZm9yIGVhY2ggc3VibGF5ZXIsIHdoaWNoCisgICAgLy8gd2lsbCBl
bmQgdXAgY2FsbGluZyB1cGRhdGVTdWJsYXllckxpc3QoKSBOIHRpbWVzLgorICAgIGlmIChjaGls
ZHJlbkNoYW5nZWQpCisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworCisgICAgcmV0dXJu
IGNoaWxkcmVuQ2hhbmdlZDsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6YWRk
Q2hpbGQoR3JhcGhpY3NMYXllciogY2hpbGRMYXllcikKK3sKKyAgICBHcmFwaGljc0xheWVyOjph
ZGRDaGlsZChjaGlsZExheWVyKTsKKyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6YWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIq
IGNoaWxkTGF5ZXIsIGludCBpbmRleCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEF0
SW5kZXgoY2hpbGRMYXllciwgaW5kZXgpOworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5
ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7CisgICAgR3JhcGhpY3NM
YXllcjo6YWRkQ2hpbGRCZWxvdyhjaGlsZExheWVyLCBzaWJsaW5nKTsKKyAgICB1cGRhdGVTdWJs
YXllckxpc3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6YWRkQ2hpbGRB
Ym92ZShHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVyICpzaWJsaW5nKQor
eworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQWJvdmUoY2hpbGRMYXllciwgc2libGluZyk7
CisgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK2Jvb2wgR3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnJlcGxhY2VDaGlsZChHcmFwaGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXll
ciogbmV3Q2hpbGQpCit7CisgICAgaWYgKEdyYXBoaWNzTGF5ZXI6OnJlcGxhY2VDaGlsZChvbGRD
aGlsZCwgbmV3Q2hpbGQpKSB7CisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5OjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBHcmFwaGljc0xh
eWVyOjpyZW1vdmVGcm9tUGFyZW50KCk7CisgICAgbGF5ZXJGb3JTdXBlcmxheWVyKCktPnJlbW92
ZUZyb21TdXBlcmxheWVyKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNl
dFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldFBvc2l0aW9uKHBvaW50KTsKKyAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9p
bnQzRCYgcG9pbnQpCit7CisgICAgaWYgKHBvaW50ID09IG1fYW5jaG9yUG9pbnQpCisgICAgICAg
IHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEFuY2hvclBvaW50KHBvaW50KTsKKyAg
ICB1cGRhdGVBbmNob3JQb2ludCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5
OjpzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA9PSBtX3Np
emUpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFNpemUoc2l6ZSk7
CisgICAgdXBkYXRlTGF5ZXJTaXplKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKQor
eworICAgIGlmICh0cmFuc2Zvcm0gPT0gbV90cmFuc2Zvcm0pCisgICAgICAgIHJldHVybjsKKwor
ICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIHVwZGF0ZVRy
YW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDaGlsZHJl
blRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKQoreworICAg
IGlmICh0cmFuc2Zvcm0gPT0gbV9jaGlsZHJlblRyYW5zZm9ybSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW5UcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAg
ICB1cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpzZXRQcmVzZXJ2ZXMzRChib29sIHByZXNlcnZlczNEKQoreworICAgIGlmIChwcmVz
ZXJ2ZXMzRCA9PSBtX3ByZXNlcnZlczNEKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRQcmVzZXJ2ZXMzRChwcmVzZXJ2ZXMzRCk7CisgICAgdXBkYXRlTGF5ZXJQcmVz
ZXJ2ZXMzRCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRNYXNrc1Rv
Qm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykKK3sKKyAgICBpZiAobWFza3NUb0JvdW5kcyA9PSBt
X21hc2tzVG9Cb3VuZHMpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5kcyk7CisgICAgdXBkYXRlTWFza3NUb0JvdW5kcygp
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXREcmF3c0NvbnRlbnQoYm9v
bCBkcmF3c0NvbnRlbnQpCit7CisgICAgLy8gTm90ZSBjYXJlZnVsbHkgdGhpcyBlYXJseS1leGl0
IGlzIG9ubHkgY29ycmVjdCBiZWNhdXNlIHdlIGFsc28gcHJvcGVybHkgaW5pdGlhbGl6ZQorICAg
IC8vIExheWVyV2ViS2l0VGhyZWFkOjppc0RyYXdhYmxlKCkgd2hlbmV2ZXIgbV9jb250ZW50c0xh
eWVyIGlzIHNldCB0byBhIG5ldyBsYXllciBpbiBzZXR1cENvbnRlbnRzTGF5ZXIoKS4KKyAgICBp
ZiAoZHJhd3NDb250ZW50ID09IG1fZHJhd3NDb250ZW50KQorICAgICAgICByZXR1cm47CisKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXREcmF3c0NvbnRlbnQoZHJhd3NDb250ZW50KTsKKyAgICB1cGRh
dGVMYXllcklzRHJhd2FibGUoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6
c2V0Q29udGVudHNWaXNpYmxlKGJvb2wgY29udGVudHNWaXNpYmxlKQoreworICAgIC8vIE5vdGUg
Y2FyZWZ1bGx5IHRoaXMgZWFybHktZXhpdCBpcyBvbmx5IGNvcnJlY3QgYmVjYXVzZSB3ZSBhbHNv
IHByb3Blcmx5IGluaXRpYWxpemUKKyAgICAvLyBMYXllcldlYktpdFRocmVhZDo6aXNEcmF3YWJs
ZSgpIHdoZW5ldmVyIG1fY29udGVudHNMYXllciBpcyBzZXQgdG8gYSBuZXcgbGF5ZXIgaW4gc2V0
dXBDb250ZW50c0xheWVyKCkuCisgICAgaWYgKGNvbnRlbnRzVmlzaWJsZSA9PSBtX2NvbnRlbnRz
VmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVu
dHNWaXNpYmxlKGNvbnRlbnRzVmlzaWJsZSk7CisgICAgdXBkYXRlTGF5ZXJJc0RyYXdhYmxlKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE1hc2tMYXllcihHcmFwaGlj
c0xheWVyKiBtYXNrTGF5ZXIpCit7CisgICAgaWYgKG1hc2tMYXllciA9PSBtX21hc2tMYXllcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0TWFza0xheWVyKG1hc2tM
YXllcik7CisKKyAgICBMYXllcldlYktpdFRocmVhZCogbWFza0xheWVyV2ViS2l0ID0gbV9tYXNr
TGF5ZXIgPyBtX21hc2tMYXllci0+cGxhdGZvcm1MYXllcigpIDogMDsKKyAgICBpZiAobWFza0xh
eWVyV2ViS2l0KQorICAgICAgICBtYXNrTGF5ZXJXZWJLaXQtPnNldElzTWFzayh0cnVlKTsKKyAg
ICBtX2xheWVyLT5zZXRNYXNrTGF5ZXIobWFza0xheWVyV2ViS2l0KTsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyQmxhY2tCZXJyeTo6c2V0UmVwbGljYXRlZEJ5TGF5ZXIoR3JhcGhpY3NMYXllciog
bGF5ZXIpCit7CisgICAgR3JhcGhpY3NMYXllckJsYWNrQmVycnkqIGxheWVyV2ViS2l0ID0gc3Rh
dGljX2Nhc3Q8R3JhcGhpY3NMYXllckJsYWNrQmVycnkqPihsYXllcik7CisgICAgR3JhcGhpY3NM
YXllcjo6c2V0UmVwbGljYXRlZEJ5TGF5ZXIobGF5ZXIpOworICAgIExheWVyV2ViS2l0VGhyZWFk
KiByZXBsaWNhTGF5ZXIgPSBsYXllcldlYktpdCA/IGxheWVyV2ViS2l0LT5wcmltYXJ5TGF5ZXIo
KSA6IDA7CisgICAgcHJpbWFyeUxheWVyKCktPnNldFJlcGxpY2FMYXllcihyZXBsaWNhTGF5ZXIp
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRGaXhlZFBvc2l0aW9uKGJv
b2wgZml4ZWQpCit7CisgICAgaWYgKGZpeGVkID09IG1fZml4ZWRQb3NpdGlvbikKKyAgICAgICAg
cmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Rml4ZWRQb3NpdGlvbihmaXhlZCk7Cisg
ICAgdXBkYXRlRml4ZWRQb3NpdGlvbigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5OjpzZXRIYXNGaXhlZENvbnRhaW5lcihib29sIGhhc0ZpeGVkQ29udGFpbmVyKQoreworICAg
IGlmIChoYXNGaXhlZENvbnRhaW5lciA9PSBtX2hhc0ZpeGVkQ29udGFpbmVyKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRIYXNGaXhlZENvbnRhaW5lcihoYXNGaXhl
ZENvbnRhaW5lcik7CisgICAgdXBkYXRlSGFzRml4ZWRDb250YWluZXIoKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0SGFzRml4ZWRBbmNlc3RvckluRE9NVHJlZShib29s
IGhhc0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUpCit7CisgICAgaWYgKGhhc0ZpeGVkQW5jZXN0b3JJ
bkRPTVRyZWUgPT0gbV9oYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKQorICAgICAgICByZXR1cm47
CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKGhhc0Zp
eGVkQW5jZXN0b3JJbkRPTVRyZWUpOworICAgIHVwZGF0ZUhhc0ZpeGVkQW5jZXN0b3JJbkRPTVRy
ZWUoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0QmFja2dyb3VuZENv
bG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAobV9iYWNrZ3JvdW5kQ29sb3JTZXQg
JiYgbV9iYWNrZ3JvdW5kQ29sb3IgPT0gY29sb3IpCisgICAgICAgIHJldHVybjsKKworICAgIEdy
YXBoaWNzTGF5ZXI6OnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7CisKKyAgICBtX2NvbnRlbnRz
TGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IgPSB0cnVlOworICAgIHVwZGF0ZUxheWVyQmFja2dyb3Vu
ZENvbG9yKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmNsZWFyQmFja2dy
b3VuZENvbG9yKCkKK3sKKyAgICBpZiAoIW1fYmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpjbGVhckJhY2tncm91bmRDb2xvcigpOworICAg
IGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKm1fY29udGVudHNMYXllcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzT3BhcXVlKGJvb2wgb3BhcXVlKQor
eworICAgIGlmIChtX2NvbnRlbnRzT3BhcXVlID09IG9wYXF1ZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNPcGFxdWUob3BhcXVlKTsKKyAgICB1cGRh
dGVDb250ZW50c09wYXF1ZSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpz
ZXRCYWNrZmFjZVZpc2liaWxpdHkoYm9vbCB2aXNpYmxlKQoreworICAgIGlmIChtX2JhY2tmYWNl
VmlzaWJpbGl0eSA9PSB2aXNpYmxlKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xh
eWVyOjpzZXRCYWNrZmFjZVZpc2liaWxpdHkodmlzaWJsZSk7CisgICAgdXBkYXRlQmFja2ZhY2VW
aXNpYmlsaXR5KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE9wYWNp
dHkoZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBmbG9hdCBjbGFtcGVkT3BhY2l0eSA9IGNsYW1wVG8o
b3BhY2l0eSwgMC4wZiwgMS4wZik7CisKKyAgICBpZiAobV9vcGFjaXR5ID09IGNsYW1wZWRPcGFj
aXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGNs
YW1wZWRPcGFjaXR5KTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0T3BhY2l0eShvcGFjaXR5KTsK
K30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q29udGVudHNOZWVkc0Rpc3Bs
YXkoKQoreworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIG1fY29udGVudHNMYXll
ci0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6
OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBt
X2xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAg
ICBpZiAoZHJhd3NDb250ZW50KCkpCisgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheUlu
UmVjdChyZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q29udGVu
dHNSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHJlY3QgPT0gbV9jb250ZW50
c1JlY3QpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRz
UmVjdChyZWN0KTsKKyAgICB1cGRhdGVDb250ZW50c1JlY3QoKTsKK30KKworc3RhdGljIFBhc3NS
ZWZQdHI8TGF5ZXJBbmltYXRpb24+IHJlbW92ZUFuaW1hdGlvbkJ5SWRBbmRQcm9wZXJ0eShpbnQg
aWQsIEFuaW1hdGVkUHJvcGVydHlJRCBwcm9wZXJ0eSwgVmVjdG9yPFJlZlB0cjxMYXllckFuaW1h
dGlvbj4gPiYgbGlzdCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgaWYgKGxpc3RbaV0tPmlkKCkgPT0gaWQgJiYgbGlzdFtpXS0+cHJv
cGVydHkoKSA9PSBwcm9wZXJ0eSkgeworICAgICAgICAgICAgUmVmUHRyPExheWVyQW5pbWF0aW9u
PiBsYXllckFuaW1hdGlvbiA9IGxpc3RbaV07CisgICAgICAgICAgICBsaXN0LnJlbW92ZShpKTsK
KyAgICAgICAgICAgIHJldHVybiBsYXllckFuaW1hdGlvbjsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIHJldHVybiBQYXNzUmVmUHRyPExheWVyQW5pbWF0aW9uPigpOworfQorCitzdGF0aWMgUGFz
c1JlZlB0cjxMYXllckFuaW1hdGlvbj4gcmVtb3ZlQW5pbWF0aW9uQnlOYW1lKGNvbnN0IFN0cmlu
ZyYgYW5pbWF0aW9uTmFtZSwgVmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPiYgbGlzdCkK
K3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgaWYgKGxpc3RbaV0tPm5hbWUoKSA9PSBhbmltYXRpb25OYW1lKSB7CisgICAgICAgICAgICBS
ZWZQdHI8TGF5ZXJBbmltYXRpb24+IGxheWVyQW5pbWF0aW9uID0gbGlzdFtpXTsKKyAgICAgICAg
ICAgIGxpc3QucmVtb3ZlKGkpOworICAgICAgICAgICAgcmV0dXJuIGxheWVyQW5pbWF0aW9uLnJl
bGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBQYXNzUmVmUHRyPExheWVy
QW5pbWF0aW9uPigpOworfQorCitib29sIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRBbmlt
YXRpb24oY29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94
U2l6ZSwgY29uc3QgQW5pbWF0aW9uKiBhbmltYXRpb24sIGNvbnN0IFN0cmluZyYgYW5pbWF0aW9u
TmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpCit7CisgICAgLy8gVGhpcyBpcyB3aGF0IEdyYXBoaWNz
TGF5ZXJDQSBjaGVja3MgZm9yLgorICAgIGlmICghYW5pbWF0aW9uIHx8IGFuaW1hdGlvbi0+aXNF
bXB0eU9yWmVyb0R1cmF0aW9uKCkgfHwgdmFsdWVzLnNpemUoKSA8IDIpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIC8vIFdlIG9ubHkgc3VwcG9ydCB0aGVzZSB0d28ga2luZHMgb2YgcHJv
cGVydGllcyBhdCB0aGUgbW9tZW50LgorICAgIGlmICh2YWx1ZXMucHJvcGVydHkoKSAhPSBBbmlt
YXRlZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtICYmIHZhbHVlcy5wcm9wZXJ0eSgpICE9IEFuaW1h
dGVkUHJvcGVydHlPcGFjaXR5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZW1v
dmUgYW55IHJ1bm5pbmcgYW5pbWF0aW9uIGZvciB0aGUgc2FtZSBwcm9wZXJ0eS4KKyAgICAvLyBG
SVhNRTogTWF5YmUgdGhpcyBpcyBzdXBlcnN0aXRpb24sIEkgZ290IHRoZSBpZGVhIGZyb20gR3Jh
cGhpY3NMYXllclF0CisgICAgLy8gV2ViQ29yZSBtaWdodCBiZSBhZGRpbmcgYW4gYW5pbWF0aW9u
IHdpdGggdGhlIHNhbWUgbmFtZSwgYnV0IGZvciBhIGRpZmZlcmVudCBwcm9wZXJ0eQorICAgIHJl
bW92ZUFuaW1hdGlvbkJ5SWRBbmRQcm9wZXJ0eShMYXllckFuaW1hdGlvbjo6aWRGcm9tQW5pbWF0
aW9uKGFuaW1hdGlvbiksIHZhbHVlcy5wcm9wZXJ0eSgpLCBtX3J1bm5pbmdBbmltYXRpb25zKTsK
KyAgICByZW1vdmVBbmltYXRpb25CeUlkQW5kUHJvcGVydHkoTGF5ZXJBbmltYXRpb246OmlkRnJv
bUFuaW1hdGlvbihhbmltYXRpb24pLCB2YWx1ZXMucHJvcGVydHkoKSwgbV9zdXNwZW5kZWRBbmlt
YXRpb25zKTsKKworICAgIFJlZlB0cjxMYXllckFuaW1hdGlvbj4gbGF5ZXJBbmltYXRpb24gPSBM
YXllckFuaW1hdGlvbjo6Y3JlYXRlKHZhbHVlcywgYm94U2l6ZSwgYW5pbWF0aW9uLCBhbmltYXRp
b25OYW1lLCB0aW1lT2Zmc2V0KTsKKworI2lmIERFQlVHX0xBWUVSX0FOSU1BVElPTgorICAgIGZw
cmludGYoc3RkZXJyLCAiTGF5ZXJBbmltYXRpb24gMHglMDh4OiBBZGRpbmcgYW5pbWF0aW9uICVz
IGZvciBwcm9wZXJ0eSAlZFxuIiwgbGF5ZXJBbmltYXRpb24uZ2V0KCksIGFuaW1hdGlvbk5hbWUu
bGF0aW4xKCkuZGF0YSgpLCB2YWx1ZXMucHJvcGVydHkoKSk7CisjZW5kaWYKKworICAgIG1fcnVu
bmluZ0FuaW1hdGlvbnMuYXBwZW5kKGxheWVyQW5pbWF0aW9uKTsKKworICAgIHVwZGF0ZUFuaW1h
dGlvbnMoKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpwYXVzZUFuaW1hdGlvbihjb25zdCBTdHJpbmcmIGFuaW1hdGlvbk5hbWUsIGRvdWJs
ZSB0aW1lT2Zmc2V0KQoreworICAgIC8vIFdlYkNvcmUgbWlnaHQgaGF2ZSBhZGRlZCBzZXZlcmFs
IGFuaW1hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgZm9yIGRpZmZlcmVudCBwcm9wZXJ0
aWVzCisKKyAgICB3aGlsZSAoUmVmUHRyPExheWVyQW5pbWF0aW9uPiBhbmltYXRpb24gPSByZW1v
dmVBbmltYXRpb25CeU5hbWUoYW5pbWF0aW9uTmFtZSwgbV9ydW5uaW5nQW5pbWF0aW9ucykpIHsK
KyNpZiBERUJVR19MQVlFUl9BTklNQVRJT04KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJMYXll
ckFuaW1hdGlvbiAweCUwOHg6IFBhdXNpbmcgYW5pbWF0aW9uICVzXG4iLCBhbmltYXRpb24uZ2V0
KCksIGFuaW1hdGlvbi0+bmFtZSgpLmxhdGluMSgpLmRhdGEoKSk7CisjZW5kaWYKKworICAgICAg
ICAvLyBMYXllckFuaW1hdGlvbiBpcyByZWFkb25seS4gQ3JlYXRlIGEgbmV3IGFuaW1hdGlvbiB3
aXRoIHRoZSBzYW1lIGRhdGEgZXhjZXB0IGZvciB0aW1lT2Zmc2V0LgorICAgICAgICAvLyBXZWJD
b3JlIHdpbGwgYWRqdXN0IHRoZSB0aW1lT2Zmc2V0IGZvciBwYXVzZWQgYW5pbWF0aW9ucyBzbyBp
dCBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisgICAgICAgIC8vIHByb2dyZXNzIGZvciB0
aGUgcGF1c2VkIGFuaW1hdGlvbiB3aXRob3V0IGtub3dpbmcgdGhlIGV4YWN0IHRpbWVzdGFtcCB3
aGVuIHRoZSBhbmltYXRpb24gd2FzCisgICAgICAgIC8vIHBhdXNlZC4KKyAgICAgICAgLy8gSWYg
YW4gYW5pbWF0aW9uIHdhcyBzdGFydGVkIHdpdGggYSB0aW1lT2Zmc2V0IGR0X29yaWcgYW5kIHBh
dXNlZCBkdF9wYXVzZSBzZWNvbmRzIGxhdGVyLCB0aGUKKyAgICAgICAgLy8gY2xvbmVkIGFuaW1h
dGlvbiB3aWxsIGhhdmUgYSB0aW1lT2Zmc2V0IG9mIGR0X3BhdXNlICsgZHRfb3JpZy4KKyAgICAg
ICAgYW5pbWF0aW9uID0gYW5pbWF0aW9uLT5jbG9uZSh0aW1lT2Zmc2V0KTsKKyAgICAgICAgbV9z
dXNwZW5kZWRBbmltYXRpb25zLmFwcGVuZChhbmltYXRpb24pOworCisjaWYgREVCVUdfTEFZRVJf
QU5JTUFUSU9OCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTGF5ZXJBbmltYXRpb24gMHglMDh4
OiBQYXVzZWQgYW5pbWF0aW9uICVzXG4iLCBhbmltYXRpb24uZ2V0KCksIGFuaW1hdGlvbi0+bmFt
ZSgpLmxhdGluMSgpLmRhdGEoKSk7CisjZW5kaWYKKyAgICB9OworCisgICAgdXBkYXRlQW5pbWF0
aW9ucygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZW1vdmVBbmltYXRp
b24oY29uc3QgU3RyaW5nJiBhbmltYXRpb25OYW1lKQoreworICAgIC8vIFdlYkNvcmUgbWlnaHQg
aGF2ZSBhZGRlZCBzZXZlcmFsIGFuaW1hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgZm9y
IGRpZmZlcmVudCBwcm9wZXJ0aWVzCisKKyNpZiBERUJVR19MQVlFUl9BTklNQVRJT04KKyAgICBm
cHJpbnRmKHN0ZGVyciwgIkxheWVyQW5pbWF0aW9uOiBSZW1vdmluZyBhbmltYXRpb24gJXNcbiIs
IGFuaW1hdGlvbk5hbWUubGF0aW4xKCkuZGF0YSgpKTsKKyNlbmRpZgorCisgICAgd2hpbGUgKHJl
bW92ZUFuaW1hdGlvbkJ5TmFtZShhbmltYXRpb25OYW1lLCBtX3J1bm5pbmdBbmltYXRpb25zKSkg
eyB9CisgICAgd2hpbGUgKHJlbW92ZUFuaW1hdGlvbkJ5TmFtZShhbmltYXRpb25OYW1lLCBtX3N1
c3BlbmRlZEFuaW1hdGlvbnMpKSB7IH0KKworICAgIHVwZGF0ZUFuaW1hdGlvbnMoKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c3VzcGVuZEFuaW1hdGlvbnMoZG91YmxlIHRp
bWUpCit7CisjaWYgREVCVUdfTEFZRVJfQU5JTUFUSU9OCisgICAgZnByaW50ZihzdGRlcnIsICJM
YXllckFuaW1hdGlvbjogU3VzcGVuZGluZyBhbmltYXRpb25zXG4iKTsKKyNlbmRpZgorICAgIG1f
c3VzcGVuZFRpbWUgPSB0aW1lOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpy
ZXN1bWVBbmltYXRpb25zKCkKK3sKKyNpZiBERUJVR19MQVlFUl9BTklNQVRJT04KKyAgICBmcHJp
bnRmKHN0ZGVyciwgIkxheWVyQW5pbWF0aW9uOiBSZXN1bWluZyBhbmltYXRpb25zXG4iKTsKKyNl
bmRpZgorICAgIG1fc3VzcGVuZFRpbWUgPSAwOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAgIGJvb2wgY2hp
bGRyZW5DaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIG1fY29udGVu
dHNMYXllclB1cnBvc2UgPSBDb250ZW50c0xheWVyRm9ySW1hZ2U7CisgICAgICAgIGlmICghbV9j
b250ZW50c0xheWVyKQorICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2VkID0gdHJ1ZTsKKyAgICB9
IGVsc2UgeworICAgICAgICBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlID0gTm9Db250ZW50c0xheWVy
OworICAgICAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICAgICAgY2hpbGRyZW5DaGFu
Z2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1cGRhdGVDb250ZW50c0ltYWdlKGltYWdlKTsKKwor
ICAgIGlmIChjaGlsZHJlbkNoYW5nZWQpCisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOwor
fQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVDb250ZW50c0ltYWdlKElt
YWdlKiBpbWFnZSkKK3sKKyAgICBpZiAoaW1hZ2UpIHsKKyAgICAgICAgaWYgKCFtX2NvbnRlbnRz
TGF5ZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIFJlZlB0cjxMYXllcldlYktpdFRocmVhZD4gaW1h
Z2VMYXllciA9IExheWVyV2ViS2l0VGhyZWFkOjpjcmVhdGUoTGF5ZXJEYXRhOjpMYXllciwgdGhp
cyk7CisKKyAgICAgICAgICAgIHNldHVwQ29udGVudHNMYXllcihpbWFnZUxheWVyLmdldCgpKTsK
KyAgICAgICAgICAgIG1fY29udGVudHNMYXllciA9IGltYWdlTGF5ZXI7CisgICAgICAgICAgICAv
LyBtX2NvbnRlbnRzTGF5ZXIgd2lsbCBiZSBwYXJlbnRlZCBieSB1cGRhdGVTdWJsYXllckxpc3Qu
CisgICAgICAgIH0KKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRDb250ZW50cyhpbWFnZSk7
CisKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
Ly8gTm8gaW1hZ2UuIG1fY29udGVudHNMYXllciB3aWxsIGJlIHJlbW92ZWQgdmlhIHVwZGF0ZVN1
YmxheWVyTGlzdC4KKyAgICAgICAgbV9jb250ZW50c0xheWVyID0gMDsKKyAgICB9Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9DYW52YXMoUGxhdGZvcm1M
YXllciogcGxhdGZvcm1MYXllcikKK3sKKyAgICBib29sIGNoaWxkcmVuQ2hhbmdlZCA9IGZhbHNl
OworICAgIGlmIChwbGF0Zm9ybUxheWVyKSB7CisgICAgICAgIHBsYXRmb3JtTGF5ZXItPnNldE93
bmVyKHRoaXMpOworICAgICAgICBpZiAobV9jb250ZW50c0xheWVyLmdldCgpICE9IHBsYXRmb3Jt
TGF5ZXIpIHsKKyAgICAgICAgICAgIHNldHVwQ29udGVudHNMYXllcihwbGF0Zm9ybUxheWVyKTsK
KyAgICAgICAgICAgIG1fY29udGVudHNMYXllciA9IHBsYXRmb3JtTGF5ZXI7CisgICAgICAgICAg
ICBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlID0gQ29udGVudHNMYXllckZvckNhbnZhczsKKyAgICAg
ICAgICAgIGNoaWxkcmVuQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbV9jb250
ZW50c0xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0
KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAg
ICAgICAgY2hpbGRyZW5DaGFuZ2VkID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gVGhlIG9sZCBj
b250ZW50cyBsYXllciB3aWxsIGJlIHJlbW92ZWQgdmlhIHVwZGF0ZVN1YmxheWVyTGlzdC4KKyAg
ICAgICAgICAgIG1fY29udGVudHNMYXllciA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBp
ZiAoY2hpbGRyZW5DaGFuZ2VkKQorICAgICAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q29udGVudHNUb01lZGlhKFBsYXRmb3Jt
TGF5ZXIqIGxheWVyKQoreworICAgIGJvb2wgY2hpbGRyZW5DaGFuZ2VkID0gZmFsc2U7CisgICAg
aWYgKGxheWVyKSB7CisgICAgICAgIGlmICghbV9jb250ZW50c0xheWVyLmdldCgpIHx8IG1fY29u
dGVudHNMYXllclB1cnBvc2UgIT0gQ29udGVudHNMYXllckZvclZpZGVvKSB7CisgICAgICAgICAg
ICBzZXR1cENvbnRlbnRzTGF5ZXIobGF5ZXIpOworICAgICAgICAgICAgbV9jb250ZW50c0xheWVy
ID0gbGF5ZXI7CisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlID0gQ29udGVudHNM
YXllckZvclZpZGVvOworICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2VkID0gdHJ1ZTsKKyAgICAg
ICAgfQorICAgICAgICBsYXllci0+c2V0T3duZXIodGhpcyk7CisgICAgICAgIGxheWVyLT5zZXRO
ZWVkc0Rpc3BsYXkoKTsKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAgICAgY2hpbGRyZW5D
aGFuZ2VkID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gVGhlIG9sZCBjb250ZW50cyBsYXllciB3
aWxsIGJlIHJlbW92ZWQgdmlhIHVwZGF0ZVN1YmxheWVyTGlzdC4KKyAgICAgICAgICAgIG1fY29u
dGVudHNMYXllciA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2hpbGRyZW5DaGFu
Z2VkKQorICAgICAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKworUGxhdGZvcm1MYXllciog
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6Omhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fdHJhbnNmb3JtTGF5ZXIgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDog
bV9sYXllci5nZXQoKTsKK30KKworUGxhdGZvcm1MYXllciogR3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OmxheWVyRm9yU3VwZXJsYXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdHJhbnNmb3Jt
TGF5ZXIgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDogbV9sYXllci5nZXQoKTsKK30KKworUGxh
dGZvcm1MYXllciogR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBsYXRmb3JtTGF5ZXIoKSBjb25z
dAoreworICAgIHJldHVybiBwcmltYXJ5TGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6c2V0RGVidWdCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQor
eworICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIHNldExheWVyQmFja2dyb3VuZENv
bG9yKCptX2xheWVyLCBjb2xvcik7CisgICAgZWxzZQorICAgICAgICBjbGVhckxheWVyQmFja2dy
b3VuZENvbG9yKCptX2xheWVyKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6
c2V0RGVidWdCb3JkZXIoY29uc3QgQ29sb3ImIGNvbG9yLCBmbG9hdCBib3JkZXJXaWR0aCkKK3sK
KyAgICBpZiAoY29sb3IuaXNWYWxpZCgpKSB7CisgICAgICAgIHNldExheWVyQm9yZGVyQ29sb3Io
Km1fbGF5ZXIsIGNvbG9yKTsKKyAgICAgICAgbV9sYXllci0+c2V0Qm9yZGVyV2lkdGgoYm9yZGVy
V2lkdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNsZWFyQm9yZGVyQ29sb3IoKm1fbGF5ZXIp
OworICAgICAgICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aCgwKTsKKyAgICB9Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZVN1YmxheWVyTGlzdCgpCit7CisgICAgVmVj
dG9yPFJlZlB0cjxMYXllcldlYktpdFRocmVhZD4gPiBuZXdTdWJsYXllcnM7CisKKyAgICBpZiAo
bV90cmFuc2Zvcm1MYXllcikgeworICAgICAgICAvLyBBZGQgdGhlIHByaW1hcnkgbGF5ZXIgZmly
c3QuIEV2ZW4gaWYgd2UgaGF2ZSBuZWdhdGl2ZSB6LW9yZGVyIGNoaWxkcmVuLCB0aGUgcHJpbWFy
eSBsYXllciBhbHdheXMgY29tZXMgYmVoaW5kLgorICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5k
KG1fbGF5ZXIuZ2V0KCkpOworICAgIH0gZWxzZSBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAg
ICAgIC8vIEZJWE1FOiBhZGQgdGhlIGNvbnRlbnRzIGxheWVyIGluIHRoZSBjb3JyZWN0IG9yZGVy
IHdpdGggbmVnYXRpdmUgei1vcmRlciBjaGlsZHJlbi4KKyAgICAgICAgLy8gVGhpcyBkb2VzIG5v
dCBjYXVzZSB2aXNpYmxlIHJlbmRlcmluZyBpc3N1ZXMgYmVjYXVzZSBjdXJyZW50bHkgY29udGVu
dHMgbGF5ZXJzIGFyZSBvbmx5IHVzZWQKKyAgICAgICAgLy8gZm9yIHJlcGxhY2VkIGVsZW1lbnRz
IHRoYXQgZG9uJ3QgaGF2ZSBjaGlsZHJlbi4KKyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZCht
X2NvbnRlbnRzTGF5ZXIuZ2V0KCkpOworICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxHcmFwaGlj
c0xheWVyKj4mIGNoaWxkTGF5ZXJzID0gY2hpbGRyZW4oKTsKKyAgICBzaXplX3QgbnVtQ2hpbGRy
ZW4gPSBjaGlsZExheWVycy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1D
aGlsZHJlbjsgKytpKSB7CisgICAgICAgIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5KiBjdXJDaGls
ZCA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Kj4oY2hpbGRMYXllcnNbaV0p
OworCisgICAgICAgIExheWVyV2ViS2l0VGhyZWFkKiBjaGlsZExheWVyID0gY3VyQ2hpbGQtPmxh
eWVyRm9yU3VwZXJsYXllcigpOworICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKGNoaWxkTGF5
ZXIpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U3VibGF5ZXJzLnNp
emUoKTsgKytpKQorICAgICAgICBuZXdTdWJsYXllcnNbaV0tPnJlbW92ZUZyb21TdXBlcmxheWVy
KCk7CisKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikgeworICAgICAgICBtX3RyYW5zZm9ybUxh
eWVyLT5zZXRTdWJsYXllcnMobmV3U3VibGF5ZXJzKTsKKworICAgICAgICBpZiAobV9jb250ZW50
c0xheWVyKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdHJhbnNmb3JtIGxheWVyLCB0
aGVuIHRoZSBjb250ZW50cyBsYXllciBpcyBwYXJlbnRlZCBpbiB0aGUKKyAgICAgICAgICAgIC8v
IHByaW1hcnkgbGF5ZXIgKHdoaWNoIGlzIGl0c2VsZiBhIGNoaWxkIG9mIHRoZSB0cmFuc2Zvcm0g
bGF5ZXIpLgorICAgICAgICAgICAgbV9sYXllci0+cmVtb3ZlQWxsU3VibGF5ZXJzKCk7CisgICAg
ICAgICAgICBtX2xheWVyLT5hZGRTdWJsYXllcihtX2NvbnRlbnRzTGF5ZXIpOworICAgICAgICB9
CisgICAgfSBlbHNlCisgICAgICAgIG1fbGF5ZXItPnNldFN1YmxheWVycyhuZXdTdWJsYXllcnMp
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclBvc2l0aW9u
KCkKK3sKKyAgICAvLyBQb3NpdGlvbiBpcyBvZmZzZXQgb24gdGhlIGxheWVyIGJ5IHRoZSBsYXll
ciBhbmNob3IgcG9pbnQuCisgICAgRmxvYXRQb2ludCBsYXllclBvc2l0aW9uKG1fcG9zaXRpb24u
eCgpICsgbV9hbmNob3JQb2ludC54KCkgKiBtX3NpemUud2lkdGgoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbV9wb3NpdGlvbi55KCkgKyBtX2FuY2hvclBvaW50LnkoKSAqIG1fc2l6
ZS5oZWlnaHQoKSk7CisKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0UG9zaXRpb24obGF5ZXJQb3Np
dGlvbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUxheWVyU2l6
ZSgpCit7CisgICAgSW50U2l6ZSBsYXllclNpemUobV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWln
aHQoKSk7CisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgbV90cmFuc2Zvcm1M
YXllci0+c2V0Qm91bmRzKGxheWVyU2l6ZSk7CisgICAgICAgIC8vIFRoZSBhbmNob3Igb2YgdGhl
IGNvbnRlbnRzIGxheWVyIGlzIGFsd2F5cyBhdCAwLjUsIDAuNSwgc28gdGhlIHBvc2l0aW9uIGlz
IGNlbnRlci1yZWxhdGl2ZS4KKyAgICAgICAgRmxvYXRQb2ludCBjZW50ZXJQb2ludChtX3NpemUu
d2lkdGgoKSAvIDIsIG1fc2l6ZS5oZWlnaHQoKSAvIDIpOworICAgICAgICBtX2xheWVyLT5zZXRQ
b3NpdGlvbihjZW50ZXJQb2ludCk7CisgICAgfQorCisgICAgbV9sYXllci0+c2V0Qm91bmRzKGxh
eWVyU2l6ZSk7CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgcmVzaXplIG1fY29udGVudHNM
YXllci4gSXQncyB1cCB0aGUgY2FsbGVyIHRvIGRvIHRoYXQuCisKKyAgICAvLyBJZiB3ZSd2ZSBj
aGFuZ2VkIHRoZSBib3VuZHMsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uCisg
ICAgLy8gb2YgdGhlIGxheWVyLCB0YWtpbmcgYW5jaG9yIHBvaW50IGludG8gYWNjb3VudC4KKyAg
ICB1cGRhdGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnVwZGF0ZUFuY2hvclBvaW50KCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5jaG9y
UG9pbnQoRmxvYXRQb2ludChtX2FuY2hvclBvaW50LngoKSwgbV9hbmNob3JQb2ludC55KCkpKTsK
KyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5jaG9yUG9pbnRaKG1fYW5jaG9yUG9pbnQueigpKTsK
KyAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnVwZGF0ZVRyYW5zZm9ybSgpCit7CisgICAgcHJpbWFyeUxheWVyKCktPnNldFRyYW5z
Zm9ybShtX3RyYW5zZm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVw
ZGF0ZUNoaWxkcmVuVHJhbnNmb3JtKCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0U3VibGF5
ZXJUcmFuc2Zvcm0obV9jaGlsZHJlblRyYW5zZm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6OnVwZGF0ZU1hc2tzVG9Cb3VuZHMoKQoreworICAgIG1fbGF5ZXItPnNldE1h
c2tzVG9Cb3VuZHMobV9tYXNrc1RvQm91bmRzKTsKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMo
KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNPcGFx
dWUoKQoreworICAgIG1fbGF5ZXItPnNldE9wYXF1ZShtX2NvbnRlbnRzT3BhcXVlKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KCkK
K3sKKyAgICBtX2xheWVyLT5zZXREb3VibGVTaWRlZChtX2JhY2tmYWNlVmlzaWJpbGl0eSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUxheWVyUHJlc2VydmVzM0Qo
KQoreworICAgIGlmIChtX3ByZXNlcnZlczNEICYmICFtX3RyYW5zZm9ybUxheWVyKSB7CisgICAg
ICAgIC8vIENyZWF0ZSB0aGUgdHJhbnNmb3JtIGxheWVyLgorICAgICAgICBtX3RyYW5zZm9ybUxh
eWVyID0gTGF5ZXJXZWJLaXRUaHJlYWQ6OmNyZWF0ZShMYXllckRhdGE6OlRyYW5zZm9ybUxheWVy
LCB0aGlzKTsKKworICAgICAgICAvLyBDb3B5IHRoZSBwb3NpdGlvbiBmcm9tIHRoaXMgbGF5ZXIu
CisgICAgICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKKyAgICAgICAgdXBkYXRlTGF5ZXJTaXpl
KCk7CisgICAgICAgIHVwZGF0ZUFuY2hvclBvaW50KCk7CisgICAgICAgIHVwZGF0ZVRyYW5zZm9y
bSgpOworICAgICAgICB1cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgpOworICAgICAgICB1cGRhdGVB
bmltYXRpb25zKCk7CisKKyAgICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludCht
X3NpemUud2lkdGgoKSAvIDIuMGYsIG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpKTsKKworICAgICAg
ICBtX2xheWVyLT5zZXRBbmNob3JQb2ludChGbG9hdFBvaW50KDAuNWYsIDAuNWYpKTsKKyAgICAg
ICAgVHJhbnNmb3JtYXRpb25NYXRyaXggaWRlbnRpdHk7CisgICAgICAgIG1fbGF5ZXItPnNldFRy
YW5zZm9ybShpZGVudGl0eSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBvbGQgbGF5ZXIgdG8gb3Bh
Y2l0eSBvZiAxLiBGdXJ0aGVyIGRvd24gd2Ugd2lsbCBzZXQgdGhlIG9wYWNpdHkgb24gdGhlIHRy
YW5zZm9ybSBsYXllci4KKyAgICAgICAgbV9sYXllci0+c2V0T3BhY2l0eSgxKTsKKworICAgICAg
ICAvLyBNb3ZlIHRoaXMgbGF5ZXIgdG8gYmUgYSBjaGlsZCBvZiB0aGUgdHJhbnNmb3JtIGxheWVy
LgorICAgICAgICBpZiAobV9sYXllci0+c3VwZXJsYXllcigpKQorICAgICAgICAgICAgbV9sYXll
ci0+c3VwZXJsYXllcigpLT5yZXBsYWNlU3VibGF5ZXIobV9sYXllci5nZXQoKSwgbV90cmFuc2Zv
cm1MYXllci5nZXQoKSk7CisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPmFkZFN1YmxheWVyKG1f
bGF5ZXIuZ2V0KCkpOworCisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldFByZXNlcnZlczNE
KHRydWUpOworICAgICAgICBtX2xheWVyLT5zZXRQcmVzZXJ2ZXMzRCh0cnVlKTsKKworICAgICAg
ICB1cGRhdGVTdWJsYXllckxpc3QoKTsKKyAgICB9IGVsc2UgaWYgKCFtX3ByZXNlcnZlczNEICYm
IG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgLy8gUmVsYWNlIHRoZSB0cmFuc2Zvcm1MYXll
ciBpbiB0aGUgcGFyZW50IHdpdGggdGhpcyBsYXllci4KKyAgICAgICAgbV9sYXllci0+cmVtb3Zl
RnJvbVN1cGVybGF5ZXIoKTsKKyAgICAgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXItPnN1cGVybGF5
ZXIoKSkKKyAgICAgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnN1cGVybGF5ZXIoKS0+cmVwbGFj
ZVN1YmxheWVyKG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCksIG1fbGF5ZXIuZ2V0KCkpOworCisgICAg
ICAgIC8vIFJlbGVhc2UgdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICAgICAgbV90cmFuc2Zvcm1M
YXllciA9IDA7CisKKyAgICAgICAgdXBkYXRlTGF5ZXJQb3NpdGlvbigpOworICAgICAgICB1cGRh
dGVMYXllclNpemUoKTsKKyAgICAgICAgdXBkYXRlQW5jaG9yUG9pbnQoKTsKKyAgICAgICAgdXBk
YXRlVHJhbnNmb3JtKCk7CisgICAgICAgIHVwZGF0ZUNoaWxkcmVuVHJhbnNmb3JtKCk7CisgICAg
ICAgIHVwZGF0ZUFuaW1hdGlvbnMoKTsKKworICAgICAgICBtX2xheWVyLT5zZXRQcmVzZXJ2ZXMz
RChmYWxzZSk7CisKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisgICAgfQorCisgICAg
dXBkYXRlT3BhY2l0eU9uTGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJy
eTo6dXBkYXRlTGF5ZXJJc0RyYXdhYmxlKCkKK3sKKyAgICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhl
IGFjY2VsZXJhdGVkIGNvbXBvc2l0b3IgY29kZSwgdGhlcmUgaXMgbm8gcmVhc29uIHRvIG1ha2Ug
YQorICAgIC8vIGRpc3RpbmN0aW9uIGJldHdlZW4gZHJhd3NDb250ZW50IGFuZCBjb250ZW50c1Zp
c2libGUuIFNvLCBmb3IgbV9sYXllciwgdGhlc2UgdHdvCisgICAgLy8gZmxhZ3MgYXJlIGNvbWJp
bmVkIGhlcmUuIG1fY29udGVudHNMYXllciBzaG91bGRuJ3QgcmVjZWl2ZSB0aGUgZHJhd3NDb250
ZW50IGZsYWcKKyAgICAvLyBzbyBpdCBpcyBvbmx5IGdpdmVuIGNvbnRlbnRzVmlzaWJsZS4KKyAg
ICBtX2xheWVyLT5zZXREcmF3YWJsZShtX2RyYXdzQ29udGVudCAmJiBtX2NvbnRlbnRzVmlzaWJs
ZSk7CisKKyAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICBtX2NvbnRlbnRzTGF5ZXIt
PnNldERyYXdhYmxlKG1fY29udGVudHNWaXNpYmxlKTsKKworICAgIGlmIChtX2RyYXdzQ29udGVu
dCkKKyAgICAgICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisKKyAgICB1cGRhdGVEZWJ1
Z0luZGljYXRvcnMoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRl
Rml4ZWRQb3NpdGlvbigpCit7CisgICAgbV9sYXllci0+c2V0Rml4ZWRQb3NpdGlvbihtX2ZpeGVk
UG9zaXRpb24pOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVIYXNG
aXhlZENvbnRhaW5lcigpCit7CisgICAgbV9sYXllci0+c2V0SGFzRml4ZWRDb250YWluZXIobV9o
YXNGaXhlZENvbnRhaW5lcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVw
ZGF0ZUhhc0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUoKQoreworICAgIG1fbGF5ZXItPnNldEhhc0Zp
eGVkQW5jZXN0b3JJbkRPTVRyZWUobV9oYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlTGF5ZXJCYWNrZ3JvdW5kQ29sb3Io
KQoreworICAgIGlmICghbV9jb250ZW50c0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBXZSBuZXZlciBjcmVhdGUgdGhlIGNvbnRlbnRzIGxheWVyIGp1c3QgZm9yIGJhY2tncm91bmQg
Y29sb3IgeWV0LgorICAgIGlmIChtX2JhY2tncm91bmRDb2xvclNldCkKKyAgICAgICAgc2V0TGF5
ZXJCYWNrZ3JvdW5kQ29sb3IoKm1fY29udGVudHNMYXllciwgbV9iYWNrZ3JvdW5kQ29sb3IpOwor
ICAgIGVsc2UKKyAgICAgICAgY2xlYXJMYXllckJhY2tncm91bmRDb2xvcigqbV9jb250ZW50c0xh
eWVyKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQW5pbWF0aW9u
cygpCit7CisgICAgLy8gV2hlbiB0aGVyZSBpcyBhIHRyYW5zZm9ybSBsYXllciwgdGhlIHRyYW5z
Zm9ybSBtdXN0IGJlIHNldCBvbiB0aGF0IGxheWVyCisgICAgLy8gaW5zdGVhZCBvZiB0aGUgY29u
dGVudCBsYXllci4gT3BhY2l0eSBjYW4gYmUgc2V0IG9uIHRoZSB0cmFuc2Zvcm0gbGF5ZXIgb3Ig
dGhlCisgICAgLy8gbGF5ZXIgd2l0aCBlcXVhbCBvdXRjb21lLCBidXQgY3VycmVudGx5IGl0IGlz
IGFsc28gc2V0IG9uIHRoZSB0cmFuc2Zvcm0KKyAgICAvLyBsYXllci4gU2luY2Ugd2Ugb25seSBh
Y2NlbGVyYXRlIGFuaW1hdGlvbnMgb2YgdGhlc2UgdHdvIHByb3BlcnRpZXMsIGl0CisgICAgLy8g
aXMgc2FmZSB0byBtb3ZlIGFsbCBhY2NlbGVyYXRlZCBhbmltYXRpb25zIHRvIHRoZSB0cmFuc2Zv
cm0gbGF5ZXIsIGFuZAorICAgIC8vIHJlbW92ZSB0aGVtIGZyb20gdGhlIGxheWVyIHByb3Blci4K
KyAgICAvLyBTbyB0aGUgZm9sbG93aW5nIGNvZGUsIHdoaWxlIGl0IGxvb2tzIHN0cmFuZ2UsIGlz
IGNvcnJlY3Q6CisgICAgLy8gd2UgdHJhbnNmZXIgYWxsIGFuaW1hdGlvbnMgdG8gdGhlIHRyYW5z
Zm9ybSBsYXllciBpZiBpdCBleGlzdHMuCisgICAgLy8gRklYTUU6IElmIG90aGVyIHByb3BlcnRp
ZXMgYmVjb21lIGFuaW1hdGVkLCBpdCBtYXkgbm90IGJlIGVxdWl2YWxlbnQgdG8KKyAgICAvLyBt
b3ZlIHRoZW0gdG8gdGhlIHRyYW5zZm9ybSBsYXllci4gVGhlbiB0aGlzIGNvZGUgbmVlZHMgdG8g
YmUgcmV2aXNpdGVkCisgICAgLy8gdG8gb25seSBtb3ZlIHRoZSB0cmFuc2Zvcm0gYW5pbWF0aW9u
cyB0byB0aGUgdHJhbnNmb3JtIGxheWVyLgorICAgIHByaW1hcnlMYXllcigpLT5zZXRSdW5uaW5n
QW5pbWF0aW9ucyhtX3J1bm5pbmdBbmltYXRpb25zKTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0
U3VzcGVuZGVkQW5pbWF0aW9ucyhtX3N1c3BlbmRlZEFuaW1hdGlvbnMpOworCisgICAgLy8gV2Ug
bmVlZCB0byBtb3ZlIHRoZSBhbmltYXRpb25zIHRvIHRoZSB0cmFuc2Zvcm0gbGF5ZXIgaWYgdGhl
cmUgaXMgb25lLgorICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIG1fbGF5ZXIt
PnNldFJ1bm5pbmdBbmltYXRpb25zKFZlY3RvcjxSZWZQdHI8TGF5ZXJBbmltYXRpb24+ID4oKSk7
CisgICAgICAgIG1fbGF5ZXItPnNldFN1c3BlbmRlZEFuaW1hdGlvbnMoVmVjdG9yPFJlZlB0cjxM
YXllckFuaW1hdGlvbj4gPigpKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnVwZGF0ZUNvbnRlbnRzVmlkZW8oKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQK
K30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNSZWN0KCkK
K3sKKyAgICBpZiAoIW1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9j
b250ZW50c0xheWVyLT5zZXRQb3NpdGlvbihtX2NvbnRlbnRzUmVjdC5sb2NhdGlvbigpKTsKKyAg
ICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvdW5kcyhtX2NvbnRlbnRzUmVjdC5zaXplKCkpOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXR1cENvbnRlbnRzTGF5ZXIoTGF5ZXJX
ZWJLaXRUaHJlYWQqIGNvbnRlbnRzTGF5ZXIpCit7CisgICAgaWYgKGNvbnRlbnRzTGF5ZXIgPT0g
bV9jb250ZW50c0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9jb250ZW50c0xh
eWVyKSB7CisgICAgICAgIG1fY29udGVudHNMYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsK
KyAgICAgICAgbV9jb250ZW50c0xheWVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoY29udGVudHNM
YXllcikgeworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSBjb250ZW50c0xheWVyOworCisgICAg
ICAgIG1fY29udGVudHNMYXllci0+c2V0QW5jaG9yUG9pbnQoRmxvYXRQb2ludDo6emVybygpKTsK
KworICAgICAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gdXBkYXRlIHNldERyYXdhYmxlIGFzIHNv
b24gYXMgd2UgcmVjZWl2ZSB0aGUgbmV3IGNvbnRlbnRzTGF5ZXIsIGZvcgorICAgICAgICAvLyB0
aGUgY29ycmVjdG5lc3Mgb2YgZWFybHkgZXhpdCBjb25kaXRpb25zIGluIHNldERyYXdzQ29udGVu
dCgpIGFuZCBzZXRDb250ZW50c1Zpc2libGUoKS4KKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5z
ZXREcmF3YWJsZShtX2NvbnRlbnRzVmlzaWJsZSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHRoZSBj
b250ZW50IGxheWVyIGZpcnN0LiBWaWRlbyBlbGVtZW50cyByZXF1aXJlIHRoaXMsIGJlY2F1c2Ug
dGhleSBoYXZlCisgICAgICAgIC8vIHNoYWRvdyBjb250ZW50IHRoYXQgbXVzdCBkaXNwbGF5IGlu
IGZyb250IG9mIHRoZSB2aWRlby4KKyAgICAgICAgbV9sYXllci0+aW5zZXJ0U3VibGF5ZXIobV9j
b250ZW50c0xheWVyLmdldCgpLCAwKTsKKworICAgICAgICB1cGRhdGVDb250ZW50c1JlY3QoKTsK
KworICAgICAgICBpZiAoc2hvd0RlYnVnQm9yZGVycygpKSB7CisgICAgICAgICAgICBzZXRMYXll
ckJvcmRlckNvbG9yKCptX2NvbnRlbnRzTGF5ZXIsIENvbG9yKDAsIDAsIDEyOCwgMTgwKSk7Cisg
ICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvcmRlcldpZHRoKDEpOworICAgICAgICB9
CisgICAgfQorICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCisvLyBUaGlzIGZ1bmN0
aW9uIHNpbXBseSBtaW1pY3MgdGhlIG9wZXJhdGlvbiBvZiBHcmFwaGljc0xheWVyQ0EKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZU9wYWNpdHlPbkxheWVyKCkKK3sKKyAgICBw
cmltYXJ5TGF5ZXIoKS0+c2V0T3BhY2l0eShtX29wYWNpdHkpOworfQorCitib29sIEdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5Ojpjb250ZW50c1Zpc2libGUoY29uc3QgSW50UmVjdCYgY29udGVudFJl
Y3QpIGNvbnN0Cit7CisgICAgaWYgKCFtX2NsaWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgcmV0dXJuIG1fY2xpZW50LT5jb250ZW50c1Zpc2libGUodGhpcywgY29udGVudFJlY3Qp
OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ibGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmggYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uZWY3Y2RkYWViM2RiNDVmYTI2NTBkNzczNTg4ODBlY2VjYzk5Yjc0MwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVy
cnkvR3JhcGhpY3NMYXllckJsYWNrQmVycnkuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
ICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
KyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgR3JhcGhpY3NMYXllckJsYWNrQmVycnlfaAorI2RlZmlu
ZSBHcmFwaGljc0xheWVyQmxhY2tCZXJyeV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCisKKyNpbmNsdWRlIDx3dGYvVmVj
dG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJBbmltYXRpb247Citj
bGFzcyBMYXllcldlYktpdFRocmVhZDsKKworY2xhc3MgR3JhcGhpY3NMYXllckJsYWNrQmVycnkg
OiBwdWJsaWMgR3JhcGhpY3NMYXllciB7CitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllckJsYWNr
QmVycnkoR3JhcGhpY3NMYXllckNsaWVudCopOworICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmKTsK
KworICAgIHZpcnR1YWwgYm9vbCBzZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXll
cio+Jik7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqKTsKKyAgICB2
aXJ0dWFsIHZvaWQgYWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIqLCBpbnQgaW5kZXgpOwor
ICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqLCBHcmFwaGljc0xh
eWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xh
eWVyKiwgR3JhcGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVhbCBib29sIHJlcGxhY2VD
aGlsZChHcmFwaGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpOwor
CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIHZpcnR1YWwgdm9p
ZCBzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50Jik7CisgICAgdmlydHVhbCB2b2lkIHNldEFu
Y2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXpl
KGNvbnN0IEZsb2F0U2l6ZSYpOworCisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5zZm9ybShjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldENoaWxkcmVu
VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0UHJlc2VydmVzM0QoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tzVG9Cb3Vu
ZHMoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldERyYXdzQ29udGVudChib29sKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNWaXNpYmxlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBz
ZXRNYXNrTGF5ZXIoR3JhcGhpY3NMYXllciopOworICAgIHZpcnR1YWwgdm9pZCBzZXRSZXBsaWNh
dGVkQnlMYXllcihHcmFwaGljc0xheWVyKik7CisgICAgdmlydHVhbCB2b2lkIHNldEZpeGVkUG9z
aXRpb24oYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldEhhc0ZpeGVkQ29udGFpbmVyKGJvb2wp
OworICAgIHZpcnR1YWwgdm9pZCBzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKGJvb2wpOwor
CisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAg
IHZpcnR1YWwgdm9pZCBjbGVhckJhY2tncm91bmRDb2xvcigpOworCisgICAgdmlydHVhbCB2b2lk
IHNldENvbnRlbnRzT3BhcXVlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZmFjZVZp
c2liaWxpdHkoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T3BhY2l0eShmbG9hdCk7CisK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgdmlydHVhbCB2b2lkIHNl
dE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9p
ZCBzZXRDb250ZW50c05lZWRzRGlzcGxheSgpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRl
bnRzUmVjdChjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIGJvb2wgYWRkQW5pbWF0aW9u
KGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiwgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3Qg
QW5pbWF0aW9uKiwgY29uc3QgU3RyaW5nJiBhbmltYXRpb25OYW1lLCBkb3VibGUgdGltZU9mZnNl
dCk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlQW5pbWF0aW9uKGNvbnN0IFN0cmluZyYgYW5pbWF0
aW9uTmFtZSwgZG91YmxlIHRpbWVPZmZzZXQpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVBbmlt
YXRpb24oY29uc3QgU3RyaW5nJiBhbmltYXRpb25OYW1lKTsKKworICAgIHZpcnR1YWwgdm9pZCBz
dXNwZW5kQW5pbWF0aW9ucyhkb3VibGUgdGltZSk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZUFu
aW1hdGlvbnMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2Uq
KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb01lZGlhKFBsYXRmb3JtTGF5ZXIqKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0NhbnZhcyhQbGF0Zm9ybUxheWVyKik7CisK
KyAgICB2aXJ0dWFsIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKworICAg
IHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAg
IHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYsIGZsb2F0IGJvcmRlcldp
ZHRoKTsKKworICAgIHZvaWQgbm90aWZ5U3luY1JlcXVpcmVkKCkKKyAgICB7CisgICAgICAgIGlm
IChtX2NsaWVudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5ub3RpZnlTeW5jUmVxdWlyZWQodGhp
cyk7CisgICAgfQorCisgICAgdm9pZCBub3RpZnlBbmltYXRpb25TdGFydGVkKGRvdWJsZSB0aW1l
KQorICAgIHsKKyAgICAgICAgaWYgKG1fY2xpZW50KQorICAgICAgICAgICAgbV9jbGllbnQtPm5v
dGlmeUFuaW1hdGlvblN0YXJ0ZWQodGhpcywgdGltZSk7CisgICAgfQorCisgICAgYm9vbCBjb250
ZW50c1Zpc2libGUoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QpIGNvbnN0OworCitwcml2YXRl
OgorICAgIHZvaWQgdXBkYXRlT3BhY2l0eU9uTGF5ZXIoKTsKKworICAgIExheWVyV2ViS2l0VGhy
ZWFkKiBwcmltYXJ5TGF5ZXIoKSBjb25zdCAgeyByZXR1cm4gbV90cmFuc2Zvcm1MYXllci5nZXQo
KSA/IG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOyB9CisgICAgTGF5ZXJX
ZWJLaXRUaHJlYWQqIGhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0OworICAgIExheWVyV2Vi
S2l0VGhyZWFkKiBsYXllckZvclN1cGVybGF5ZXIoKSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRl
U3VibGF5ZXJMaXN0KCk7CisgICAgdm9pZCB1cGRhdGVMYXllclBvc2l0aW9uKCk7CisgICAgdm9p
ZCB1cGRhdGVMYXllclNpemUoKTsKKyAgICB2b2lkIHVwZGF0ZUFuY2hvclBvaW50KCk7CisgICAg
dm9pZCB1cGRhdGVUcmFuc2Zvcm0oKTsKKyAgICB2b2lkIHVwZGF0ZUNoaWxkcmVuVHJhbnNmb3Jt
KCk7CisgICAgdm9pZCB1cGRhdGVNYXNrc1RvQm91bmRzKCk7CisgICAgdm9pZCB1cGRhdGVDb250
ZW50c09wYXF1ZSgpOworICAgIHZvaWQgdXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KCk7CisgICAg
dm9pZCB1cGRhdGVMYXllclByZXNlcnZlczNEKCk7CisgICAgdm9pZCB1cGRhdGVMYXllcklzRHJh
d2FibGUoKTsKKyAgICB2b2lkIHVwZGF0ZUZpeGVkUG9zaXRpb24oKTsKKyAgICB2b2lkIHVwZGF0
ZUhhc0ZpeGVkQ29udGFpbmVyKCk7CisgICAgdm9pZCB1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5E
T01UcmVlKCk7CisgICAgdm9pZCB1cGRhdGVMYXllckJhY2tncm91bmRDb2xvcigpOworICAgIHZv
aWQgdXBkYXRlQW5pbWF0aW9ucygpOworCisgICAgdm9pZCB1cGRhdGVDb250ZW50c0ltYWdlKElt
YWdlKik7CisgICAgdm9pZCB1cGRhdGVDb250ZW50c1ZpZGVvKCk7CisgICAgdm9pZCB1cGRhdGVD
b250ZW50c1JlY3QoKTsKKworICAgIHZvaWQgc2V0dXBDb250ZW50c0xheWVyKExheWVyV2ViS2l0
VGhyZWFkKik7CisgICAgTGF5ZXJXZWJLaXRUaHJlYWQqIGNvbnRlbnRzTGF5ZXIoKSBjb25zdCB7
IHJldHVybiBtX2NvbnRlbnRzTGF5ZXIuZ2V0KCk7IH0KKworICAgIFJlZlB0cjxMYXllcldlYktp
dFRocmVhZD4gbV9sYXllcjsKKyAgICBSZWZQdHI8TGF5ZXJXZWJLaXRUaHJlYWQ+IG1fdHJhbnNm
b3JtTGF5ZXI7CisgICAgUmVmUHRyPExheWVyV2ViS2l0VGhyZWFkPiBtX2NvbnRlbnRzTGF5ZXI7
CisKKyAgICBWZWN0b3I8UmVmUHRyPExheWVyQW5pbWF0aW9uPiA+IG1fcnVubmluZ0FuaW1hdGlv
bnM7CisgICAgVmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPiBtX3N1c3BlbmRlZEFuaW1h
dGlvbnM7CisgICAgZG91YmxlIG1fc3VzcGVuZFRpbWU7CisKKyAgICBlbnVtIENvbnRlbnRzTGF5
ZXJQdXJwb3NlIHsKKyAgICAgICAgTm9Db250ZW50c0xheWVyID0gMCwKKyAgICAgICAgQ29udGVu
dHNMYXllckZvckltYWdlLAorICAgICAgICBDb250ZW50c0xheWVyRm9yVmlkZW8sCisgICAgICAg
IENvbnRlbnRzTGF5ZXJGb3JDYW52YXMsCisgICAgfTsKKworICAgIENvbnRlbnRzTGF5ZXJQdXJw
b3NlIG1fY29udGVudHNMYXllclB1cnBvc2U7CisgICAgYm9vbCBtX2NvbnRlbnRzTGF5ZXJIYXNC
YWNrZ3JvdW5kQ29sb3IgOiAxOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5k
aWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>130783</attachid>
            <date>2012-03-08 00:02:40 -0800</date>
            <delta_ts>2012-03-08 01:46:14 -0800</delta_ts>
            <desc>patch-for-landing</desc>
            <filename>bug-79867-20120308160240.patch</filename>
            <type>text/plain</type>
            <size>41934</size>
            <attacher name="Robin Cao">robin.webkit</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTEwMTQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2IwYjAwOTYxMjJjMTY3
OThjMTAwYzg5OTZiNTI0MDNmZjVhYjFhMC4uMjFiOWZkMzRiOGU4MDM4MWUxMTc3Y2FhZTUwODhh
NWRjM2QzMDdjMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDk3IEBACisyMDEyLTAzLTA3ICBSb2Jp
biBDYW8gIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIFtCbGFja0Jl
cnJ5XSBVcHN0cmVhbSBHcmFwaGljc0xheWVyQmxhY2tCZXJyeS57aCwgY3BwfQorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzk4NjcKKworICAgICAgICBS
ZXZpZXdlZCBieSBSb2IgQnVpcy4KKworICAgICAgICBJbml0aWFsIHVwc3RyZWFtLCBubyBuZXcg
dGVzdHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAg
KFdlYkNvcmU6OnNldExheWVyQm9yZGVyQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6Y2xlYXJC
b3JkZXJDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpzZXRMYXllckJhY2tncm91bmRDb2xvcik6
CisgICAgICAgIChXZWJDb3JlOjpjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0xheWVyQmxhY2tCZXJyeTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnkpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6On5HcmFwaGljc0xheWVyQmxhY2tCZXJy
eSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TmFtZSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q2hpbGRyZW4p
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFkZENoaWxkKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGlsZEF0SW5k
ZXgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFkZENoaWxk
QmVsb3cpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFkZENo
aWxkQWJvdmUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnJl
cGxhY2VDaGlsZCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6
cmVtb3ZlRnJvbVBhcmVudCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6c2V0UG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnNldEFuY2hvclBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXRTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpzZXRUcmFuc2Zvcm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJs
YWNrQmVycnk6OnNldENoaWxkcmVuVHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRQcmVzZXJ2ZXMzRCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TWFza3NUb0JvdW5kcyk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0RHJhd3NDb250ZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c1Zpc2libGUpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldE1hc2tMYXllcik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0UmVwbGljYXRl
ZEJ5TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNl
dEZpeGVkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnNldEhhc0ZpeGVkQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJCbGFja0JlcnJ5OjpzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRCYWNrZ3JvdW5kQ29sb3IpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmNsZWFyQmFja2dyb3VuZENv
bG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250
ZW50c09wYXF1ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6
c2V0QmFja2ZhY2VWaXNpYmlsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXRPcGFjaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjpzZXRDb250ZW50c05lZWRzRGlzcGxheSk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TmVlZHNEaXNwbGF5KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXROZWVkc0Rpc3BsYXlJblJlY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzUmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpyZW1vdmVBbmltYXRpb25CeUlkQW5kUHJvcGVydHkpOgorICAg
ICAgICAoV2ViQ29yZTo6cmVtb3ZlQW5pbWF0aW9uQnlOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRBbmltYXRpb24pOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBhdXNlQW5pbWF0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZW1vdmVBbmltYXRpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnN1c3BlbmRBbmltYXRpb25zKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZXN1bWVBbmltYXRp
b25zKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250
ZW50c1RvSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6
OnVwZGF0ZUNvbnRlbnRzSW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJs
YWNrQmVycnk6OnNldENvbnRlbnRzVG9DYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9NZWRpYSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6aG9zdExheWVyRm9yU3VibGF5ZXJzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpsYXllckZvclN1cGVybGF5ZXIp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBsYXRmb3JtTGF5
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldERlYnVn
QmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5OjpzZXREZWJ1Z0JvcmRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxh
Y2tCZXJyeTo6dXBkYXRlU3VibGF5ZXJMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclNpemUpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUFuY2hvclBvaW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVUcmFuc2Zvcm0pOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUNoaWxkcmVu
VHJhbnNmb3JtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1
cGRhdGVNYXNrc1RvQm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5Ojp1cGRhdGVDb250ZW50c09wYXF1ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclByZXNlcnZlczNEKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllcklz
RHJhd2FibGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVw
ZGF0ZUZpeGVkUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnVwZGF0ZUhhc0ZpeGVkQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllckJhY2tn
cm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6
dXBkYXRlQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6dXBkYXRlQ29udGVudHNWaWRlbyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xh
eWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXR1cENvbnRlbnRzTGF5ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZU9wYWNpdHlPbkxheWVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojpjb250ZW50c1Zpc2libGUp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NMYXllckJs
YWNrQmVycnkuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEdyYXBoaWNz
TGF5ZXJCbGFja0JlcnJ5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5Ojpub3RpZnlTeW5jUmVxdWlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6Om5vdGlmeUFuaW1hdGlvblN0YXJ0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnByaW1hcnlMYXllcik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6Y29udGVudHNMYXllcik6CisKIDIwMTItMDMtMDcg
IEFtaSBGaXNjaG1hbiAgPGZpc2NobWFuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBbQ2hyb21p
dW1dIEFsbG93IENDTGF5ZXJUcmVlSG9zdDo6Y29udGV4dCgpIHRvIGJlIGNhbGxlZCBldmVuIHdp
dGggdGhlIHRocmVhZGVkIGNvbXBvc2l0b3IgZW5hYmxlZC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NMYXllckJsYWNrQmVy
cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9HcmFw
aGljc0xheWVyQmxhY2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTM1MjU3YTAzZmU4ODkxODk0MDRi
Yzg0YjU4OTE4NGM4ZDUwZTU2ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3JhcGhpY3NMYXllckJsYWNrQmVycnkuY3BwCkBA
IC0wLDAgKzEsODg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworLyoqIEZJWE1FCisgKiBU
aGlzIGZpbGUgYm9ycm93cyBjb2RlIGhlYXZpbHkgZnJvbSBwbGF0Zm9ybS9ncmFwaGljcy93aW4v
R3JhcGhpY3NMYXllckNBQ0YuY3BwCisgKiAoYW5kIGhlbmNlIGl0IGluY2x1ZGVzIGJvdGggY29w
eXJpZ2h0cykKKyAqIElkZWFsbHkgdGhlIGNvbW1vbiBjb2RlIChtb3N0bHkgdGhlIGNvZGUgdGhh
dCBrZWVwcyB0cmFjayBvZiB0aGUgbGF5ZXIgaGllcmFyY2h5KQorICogc2hvdWxkIGJlIGtlcHQg
c2VwYXJhdGUgYW5kIHNoYXJlZCBiZXR3ZWVuIHBsYXRmb3Jtcy4gSXQgd291bGQgYmUgYSB3ZWxs
IHdvcnRod2hpbGUKKyAqIGVmZm9ydCBvbmNlIHRoZSBXaW5kb3dzIGltcGxlbWVudGF0aW9uIChi
aW5hcmllcyBhbmQgaGVhZGVycykgb2YgQ29yZUFuaW1hdGlvbiBpcworICogY2hlY2tlZCBpbiB0
byB0aGUgV2ViS2l0IHJlcG9zaXRvcnkuIFVudGlsIHRoZW4gb25seSBBcHBsZSBjYW4gbWFrZSB0
aGlzIGhhcHBlbi4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyQmxhY2tCZXJyeS5o
IgorCisjaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0Lmgi
CisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJMYXllckFuaW1hdGlvbi5oIgorI2luY2x1
ZGUgIkxheWVyV2ViS2l0VGhyZWFkLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGlj
IHZvaWQgc2V0TGF5ZXJCb3JkZXJDb2xvcihMYXllcldlYktpdFRocmVhZCYgbGF5ZXIsIGNvbnN0
IENvbG9yJiBjb2xvcikKK3sKKyAgICBsYXllci5zZXRCb3JkZXJDb2xvcihjb2xvcik7Cit9CisK
K3N0YXRpYyB2b2lkIGNsZWFyQm9yZGVyQ29sb3IoTGF5ZXJXZWJLaXRUaHJlYWQmIGxheWVyKQor
eworICAgIGxheWVyLnNldEJvcmRlckNvbG9yKENvbG9yOjp0cmFuc3BhcmVudCk7Cit9CisKK3N0
YXRpYyB2b2lkIHNldExheWVyQmFja2dyb3VuZENvbG9yKExheWVyV2ViS2l0VGhyZWFkJiBsYXll
ciwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGxheWVyLnNldEJhY2tncm91bmRDb2xvcihj
b2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoTGF5ZXJX
ZWJLaXRUaHJlYWQmIGxheWVyKQoreworICAgIGxheWVyLnNldEJhY2tncm91bmRDb2xvcihDb2xv
cjo6dHJhbnNwYXJlbnQpOworfQorCitQYXNzT3duUHRyPEdyYXBoaWNzTGF5ZXI+IEdyYXBoaWNz
TGF5ZXI6OmNyZWF0ZShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0dXJu
IGFkb3B0UHRyKG5ldyBHcmFwaGljc0xheWVyQmxhY2tCZXJyeShjbGllbnQpKTsKK30KKworR3Jh
cGhpY3NMYXllckJsYWNrQmVycnk6OkdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5KEdyYXBoaWNzTGF5
ZXJDbGllbnQqIGNsaWVudCkKKyAgICA6IEdyYXBoaWNzTGF5ZXIoY2xpZW50KQorICAgICwgbV9z
dXNwZW5kVGltZSgwKQorICAgICwgbV9jb250ZW50c0xheWVyUHVycG9zZShOb0NvbnRlbnRzTGF5
ZXIpCisgICAgLCBtX2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IoZmFsc2UpCit7Cisg
ICAgbV9sYXllciA9IExheWVyV2ViS2l0VGhyZWFkOjpjcmVhdGUoTGF5ZXJEYXRhOjpMYXllciwg
dGhpcyk7CisKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKK30KKworR3JhcGhpY3NMYXll
ckJsYWNrQmVycnk6On5HcmFwaGljc0xheWVyQmxhY2tCZXJyeSgpCit7CisgICAgaWYgKG1fbGF5
ZXIpCisgICAgICAgIG1fbGF5ZXItPnNldE93bmVyKDApOworICAgIGlmIChtX2NvbnRlbnRzTGF5
ZXIpCisgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0T3duZXIoMCk7CisgICAgaWYgKG1fdHJh
bnNmb3JtTGF5ZXIpCisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldE93bmVyKDApOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXROYW1lKGNvbnN0IFN0cmluZyYgaW5O
YW1lKQoreworICAgIFN0cmluZyBuYW1lID0gU3RyaW5nOjpmb3JtYXQoIkdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5KCVwKSBHcmFwaGljc0xheWVyKCVwKSAiLCBtX2xheWVyLmdldCgpLCB0aGlzKSAr
IGluTmFtZTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXROYW1lKG5hbWUpOworfQorCitib29sIEdy
YXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NM
YXllcio+JiBjaGlsZHJlbikKK3sKKyAgICBib29sIGNoaWxkcmVuQ2hhbmdlZCA9IEdyYXBoaWNz
TGF5ZXI6OnNldENoaWxkcmVuKGNoaWxkcmVuKTsKKyAgICAvLyBGSVhNRTogR3JhcGhpY3NMYXll
cjo6c2V0Q2hpbGRyZW4gY2FsbHMgYWRkQ2hpbGQoKSBmb3IgZWFjaCBzdWJsYXllciwgd2hpY2gK
KyAgICAvLyB3aWxsIGVuZCB1cCBjYWxsaW5nIHVwZGF0ZVN1YmxheWVyTGlzdCgpIE4gdGltZXMu
CisgICAgaWYgKGNoaWxkcmVuQ2hhbmdlZCkKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7
CisKKyAgICByZXR1cm4gY2hpbGRyZW5DaGFuZ2VkOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5OjphZGRDaGlsZChHcmFwaGljc0xheWVyKiBjaGlsZExheWVyKQoreworICAgIEdy
YXBoaWNzTGF5ZXI6OmFkZENoaWxkKGNoaWxkTGF5ZXIpOworICAgIHVwZGF0ZVN1YmxheWVyTGlz
dCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRDaGlsZEF0SW5kZXgo
R3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgaW50IGluZGV4KQoreworICAgIEdyYXBoaWNzTGF5
ZXI6OmFkZENoaWxkQXRJbmRleChjaGlsZExheWVyLCBpbmRleCk7CisgICAgdXBkYXRlU3VibGF5
ZXJMaXN0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OmFkZENoaWxkQmVs
b3coR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgR3JhcGhpY3NMYXllciogc2libGluZykKK3sK
KyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEJlbG93KGNoaWxkTGF5ZXIsIHNpYmxpbmcpOwor
ICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5OjphZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5
ZXIgKnNpYmxpbmcpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShjaGlsZExh
eWVyLCBzaWJsaW5nKTsKKyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKworYm9vbCBHcmFw
aGljc0xheWVyQmxhY2tCZXJyeTo6cmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxk
LCBHcmFwaGljc0xheWVyKiBuZXdDaGlsZCkKK3sKKyAgICBpZiAoIUdyYXBoaWNzTGF5ZXI6OnJl
cGxhY2VDaGlsZChvbGRDaGlsZCwgbmV3Q2hpbGQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6cmVtb3ZlRnJvbVBhcmVudCgpCit7CisgICAgR3JhcGhp
Y3NMYXllcjo6cmVtb3ZlRnJvbVBhcmVudCgpOworICAgIGxheWVyRm9yU3VwZXJsYXllcigpLT5y
ZW1vdmVGcm9tU3VwZXJsYXllcigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5
OjpzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBHcmFwaGljc0xh
eWVyOjpzZXRQb3NpdGlvbihwb2ludCk7CisgICAgdXBkYXRlTGF5ZXJQb3NpdGlvbigpOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRBbmNob3JQb2ludChjb25zdCBGbG9h
dFBvaW50M0QmIHBvaW50KQoreworICAgIGlmIChwb2ludCA9PSBtX2FuY2hvclBvaW50KQorICAg
ICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRBbmNob3JQb2ludChwb2ludCk7
CisgICAgdXBkYXRlQW5jaG9yUG9pbnQoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6c2V0U2l6ZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgaWYgKHNpemUgPT0g
bV9zaXplKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRTaXplKHNp
emUpOworICAgIHVwZGF0ZUxheWVyU2l6ZSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFj
a0JlcnJ5OjpzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9y
bSkKK3sKKyAgICBpZiAodHJhbnNmb3JtID09IG1fdHJhbnNmb3JtKQorICAgICAgICByZXR1cm47
CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICB1cGRh
dGVUcmFuc2Zvcm0oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q2hp
bGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSkKK3sK
KyAgICBpZiAodHJhbnNmb3JtID09IG1fY2hpbGRyZW5UcmFuc2Zvcm0pCisgICAgICAgIHJldHVy
bjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuVHJhbnNmb3JtKHRyYW5zZm9ybSk7
CisgICAgdXBkYXRlQ2hpbGRyZW5UcmFuc2Zvcm0oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
QmxhY2tCZXJyeTo6c2V0UHJlc2VydmVzM0QoYm9vbCBwcmVzZXJ2ZXMzRCkKK3sKKyAgICBpZiAo
cHJlc2VydmVzM0QgPT0gbV9wcmVzZXJ2ZXMzRCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3Jh
cGhpY3NMYXllcjo6c2V0UHJlc2VydmVzM0QocHJlc2VydmVzM0QpOworICAgIHVwZGF0ZUxheWVy
UHJlc2VydmVzM0QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0TWFz
a3NUb0JvdW5kcyhib29sIG1hc2tzVG9Cb3VuZHMpCit7CisgICAgaWYgKG1hc2tzVG9Cb3VuZHMg
PT0gbV9tYXNrc1RvQm91bmRzKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVy
OjpzZXRNYXNrc1RvQm91bmRzKG1hc2tzVG9Cb3VuZHMpOworICAgIHVwZGF0ZU1hc2tzVG9Cb3Vu
ZHMoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0RHJhd3NDb250ZW50
KGJvb2wgZHJhd3NDb250ZW50KQoreworICAgIC8vIE5vdGUgY2FyZWZ1bGx5IHRoaXMgZWFybHkt
ZXhpdCBpcyBvbmx5IGNvcnJlY3QgYmVjYXVzZSB3ZSBhbHNvIHByb3Blcmx5IGluaXRpYWxpemUK
KyAgICAvLyBMYXllcldlYktpdFRocmVhZDo6aXNEcmF3YWJsZSgpIHdoZW5ldmVyIG1fY29udGVu
dHNMYXllciBpcyBzZXQgdG8gYSBuZXcgbGF5ZXIgaW4gc2V0dXBDb250ZW50c0xheWVyKCkuCisg
ICAgaWYgKGRyYXdzQ29udGVudCA9PSBtX2RyYXdzQ29udGVudCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0RHJhd3NDb250ZW50KGRyYXdzQ29udGVudCk7CisgICAg
dXBkYXRlTGF5ZXJJc0RyYXdhYmxlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVy
cnk6OnNldENvbnRlbnRzVmlzaWJsZShib29sIGNvbnRlbnRzVmlzaWJsZSkKK3sKKyAgICAvLyBO
b3RlIGNhcmVmdWxseSB0aGlzIGVhcmx5LWV4aXQgaXMgb25seSBjb3JyZWN0IGJlY2F1c2Ugd2Ug
YWxzbyBwcm9wZXJseSBpbml0aWFsaXplCisgICAgLy8gTGF5ZXJXZWJLaXRUaHJlYWQ6OmlzRHJh
d2FibGUoKSB3aGVuZXZlciBtX2NvbnRlbnRzTGF5ZXIgaXMgc2V0IHRvIGEgbmV3IGxheWVyIGlu
IHNldHVwQ29udGVudHNMYXllcigpLgorICAgIGlmIChjb250ZW50c1Zpc2libGUgPT0gbV9jb250
ZW50c1Zpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENv
bnRlbnRzVmlzaWJsZShjb250ZW50c1Zpc2libGUpOworICAgIHVwZGF0ZUxheWVySXNEcmF3YWJs
ZSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRNYXNrTGF5ZXIoR3Jh
cGhpY3NMYXllciogbWFza0xheWVyKQoreworICAgIGlmIChtYXNrTGF5ZXIgPT0gbV9tYXNrTGF5
ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE1hc2tMYXllciht
YXNrTGF5ZXIpOworCisgICAgTGF5ZXJXZWJLaXRUaHJlYWQqIG1hc2tMYXllcldlYktpdCA9IG1f
bWFza0xheWVyID8gbV9tYXNrTGF5ZXItPnBsYXRmb3JtTGF5ZXIoKSA6IDA7CisgICAgaWYgKG1h
c2tMYXllcldlYktpdCkKKyAgICAgICAgbWFza0xheWVyV2ViS2l0LT5zZXRJc01hc2sodHJ1ZSk7
CisgICAgbV9sYXllci0+c2V0TWFza0xheWVyKG1hc2tMYXllcldlYktpdCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldFJlcGxpY2F0ZWRCeUxheWVyKEdyYXBoaWNzTGF5
ZXIqIGxheWVyKQoreworICAgIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5KiBsYXllcldlYktpdCA9
IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Kj4obGF5ZXIpOworICAgIEdyYXBo
aWNzTGF5ZXI6OnNldFJlcGxpY2F0ZWRCeUxheWVyKGxheWVyKTsKKyAgICBMYXllcldlYktpdFRo
cmVhZCogcmVwbGljYUxheWVyID0gbGF5ZXJXZWJLaXQgPyBsYXllcldlYktpdC0+cHJpbWFyeUxh
eWVyKCkgOiAwOworICAgIHByaW1hcnlMYXllcigpLT5zZXRSZXBsaWNhTGF5ZXIocmVwbGljYUxh
eWVyKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Rml4ZWRQb3NpdGlv
bihib29sIGZpeGVkKQoreworICAgIGlmIChmaXhlZCA9PSBtX2ZpeGVkUG9zaXRpb24pCisgICAg
ICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEZpeGVkUG9zaXRpb24oZml4ZWQp
OworICAgIHVwZGF0ZUZpeGVkUG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxh
Y2tCZXJyeTo6c2V0SGFzRml4ZWRDb250YWluZXIoYm9vbCBoYXNGaXhlZENvbnRhaW5lcikKK3sK
KyAgICBpZiAoaGFzRml4ZWRDb250YWluZXIgPT0gbV9oYXNGaXhlZENvbnRhaW5lcikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0SGFzRml4ZWRDb250YWluZXIoaGFz
Rml4ZWRDb250YWluZXIpOworICAgIHVwZGF0ZUhhc0ZpeGVkQ29udGFpbmVyKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEhhc0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUo
Ym9vbCBoYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKQoreworICAgIGlmIChoYXNGaXhlZEFuY2Vz
dG9ySW5ET01UcmVlID09IG1faGFzRml4ZWRBbmNlc3RvckluRE9NVHJlZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0SGFzRml4ZWRBbmNlc3RvckluRE9NVHJlZSho
YXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKTsKKyAgICB1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5E
T01UcmVlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldEJhY2tncm91
bmRDb2xvcihjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKG1fYmFja2dyb3VuZENvbG9y
U2V0ICYmIG1fYmFja2dyb3VuZENvbG9yID09IGNvbG9yKQorICAgICAgICByZXR1cm47CisKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOworCisgICAgbV9jb250
ZW50c0xheWVySGFzQmFja2dyb3VuZENvbG9yID0gdHJ1ZTsKKyAgICB1cGRhdGVMYXllckJhY2tn
cm91bmRDb2xvcigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpjbGVhckJh
Y2tncm91bmRDb2xvcigpCit7CisgICAgaWYgKCFtX2JhY2tncm91bmRDb2xvclNldCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKTsK
KyAgICBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKCptX2NvbnRlbnRzTGF5ZXIpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRDb250ZW50c09wYXF1ZShib29sIG9wYXF1
ZSkKK3sKKyAgICBpZiAobV9jb250ZW50c09wYXF1ZSA9PSBvcGFxdWUpCisgICAgICAgIHJldHVy
bjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzT3BhcXVlKG9wYXF1ZSk7CisgICAg
dXBkYXRlQ29udGVudHNPcGFxdWUoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJy
eTo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAobV9iYWNr
ZmFjZVZpc2liaWxpdHkgPT0gdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0QmFja2ZhY2VWaXNpYmlsaXR5KHZpc2libGUpOworICAgIHVwZGF0ZUJhY2tm
YWNlVmlzaWJpbGl0eSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXRP
cGFjaXR5KGZsb2F0IG9wYWNpdHkpCit7CisgICAgZmxvYXQgY2xhbXBlZE9wYWNpdHkgPSBjbGFt
cFRvKG9wYWNpdHksIDAuMGYsIDEuMGYpOworCisgICAgaWYgKG1fb3BhY2l0eSA9PSBjbGFtcGVk
T3BhY2l0eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0T3BhY2l0
eShjbGFtcGVkT3BhY2l0eSk7CisgICAgcHJpbWFyeUxheWVyKCktPnNldE9wYWNpdHkob3BhY2l0
eSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzTmVlZHNE
aXNwbGF5KCkKK3sKKyAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICBtX2NvbnRlbnRz
TGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5OjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIGlmIChkcmF3c0NvbnRlbnQoKSkKKyAgICAg
ICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJs
YWNrQmVycnk6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBtX2xheWVyLT5zZXROZWVkc0Rpc3Bs
YXlJblJlY3QocmVjdCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnNldENv
bnRlbnRzUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChyZWN0ID09IG1fY29u
dGVudHNSZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250
ZW50c1JlY3QocmVjdCk7CisgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7Cit9CisKK3N0YXRpYyBQ
YXNzUmVmUHRyPExheWVyQW5pbWF0aW9uPiByZW1vdmVBbmltYXRpb25CeUlkQW5kUHJvcGVydHko
aW50IGlkLCBBbmltYXRlZFByb3BlcnR5SUQgcHJvcGVydHksIFZlY3RvcjxSZWZQdHI8TGF5ZXJB
bmltYXRpb24+ID4mIGxpc3QpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNp
emUoKTsgKytpKSB7CisgICAgICAgIGlmIChsaXN0W2ldLT5pZCgpID09IGlkICYmIGxpc3RbaV0t
PnByb3BlcnR5KCkgPT0gcHJvcGVydHkpIHsKKyAgICAgICAgICAgIFJlZlB0cjxMYXllckFuaW1h
dGlvbj4gbGF5ZXJBbmltYXRpb24gPSBsaXN0W2ldOworICAgICAgICAgICAgbGlzdC5yZW1vdmUo
aSk7CisgICAgICAgICAgICByZXR1cm4gbGF5ZXJBbmltYXRpb247CisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gUGFzc1JlZlB0cjxMYXllckFuaW1hdGlvbj4oKTsKK30KKworc3RhdGlj
IFBhc3NSZWZQdHI8TGF5ZXJBbmltYXRpb24+IHJlbW92ZUFuaW1hdGlvbkJ5TmFtZShjb25zdCBT
dHJpbmcmIGFuaW1hdGlvbk5hbWUsIFZlY3RvcjxSZWZQdHI8TGF5ZXJBbmltYXRpb24+ID4mIGxp
c3QpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7Cisg
ICAgICAgIGlmIChsaXN0W2ldLT5uYW1lKCkgPT0gYW5pbWF0aW9uTmFtZSkgeworICAgICAgICAg
ICAgUmVmUHRyPExheWVyQW5pbWF0aW9uPiBsYXllckFuaW1hdGlvbiA9IGxpc3RbaV07CisgICAg
ICAgICAgICBsaXN0LnJlbW92ZShpKTsKKyAgICAgICAgICAgIHJldHVybiBsYXllckFuaW1hdGlv
bjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBQYXNzUmVmUHRyPExheWVyQW5pbWF0
aW9uPigpOworfQorCitib29sIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjphZGRBbmltYXRpb24o
Y29uc3QgS2V5ZnJhbWVWYWx1ZUxpc3QmIHZhbHVlcywgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwg
Y29uc3QgQW5pbWF0aW9uKiBhbmltYXRpb24sIGNvbnN0IFN0cmluZyYgYW5pbWF0aW9uTmFtZSwg
ZG91YmxlIHRpbWVPZmZzZXQpCit7CisgICAgLy8gVGhpcyBpcyB3aGF0IEdyYXBoaWNzTGF5ZXJD
QSBjaGVja3MgZm9yLgorICAgIGlmICghYW5pbWF0aW9uIHx8IGFuaW1hdGlvbi0+aXNFbXB0eU9y
WmVyb0R1cmF0aW9uKCkgfHwgdmFsdWVzLnNpemUoKSA8IDIpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIC8vIFdlIG9ubHkgc3VwcG9ydCB0aGVzZSB0d28ga2luZHMgb2YgcHJvcGVydGll
cyBhdCB0aGUgbW9tZW50LgorICAgIGlmICh2YWx1ZXMucHJvcGVydHkoKSAhPSBBbmltYXRlZFBy
b3BlcnR5V2Via2l0VHJhbnNmb3JtICYmIHZhbHVlcy5wcm9wZXJ0eSgpICE9IEFuaW1hdGVkUHJv
cGVydHlPcGFjaXR5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZW1vdmUgYW55
IHJ1bm5pbmcgYW5pbWF0aW9uIGZvciB0aGUgc2FtZSBwcm9wZXJ0eS4KKyAgICAvLyBGSVhNRTog
TWF5YmUgdGhpcyBpcyBzdXBlcnN0aXRpb24sIEkgZ290IHRoZSBpZGVhIGZyb20gR3JhcGhpY3NM
YXllclF0CisgICAgLy8gV2ViQ29yZSBtaWdodCBiZSBhZGRpbmcgYW4gYW5pbWF0aW9uIHdpdGgg
dGhlIHNhbWUgbmFtZSwgYnV0IGZvciBhIGRpZmZlcmVudCBwcm9wZXJ0eQorICAgIHJlbW92ZUFu
aW1hdGlvbkJ5SWRBbmRQcm9wZXJ0eShMYXllckFuaW1hdGlvbjo6aWRGcm9tQW5pbWF0aW9uKGFu
aW1hdGlvbiksIHZhbHVlcy5wcm9wZXJ0eSgpLCBtX3J1bm5pbmdBbmltYXRpb25zKTsKKyAgICBy
ZW1vdmVBbmltYXRpb25CeUlkQW5kUHJvcGVydHkoTGF5ZXJBbmltYXRpb246OmlkRnJvbUFuaW1h
dGlvbihhbmltYXRpb24pLCB2YWx1ZXMucHJvcGVydHkoKSwgbV9zdXNwZW5kZWRBbmltYXRpb25z
KTsKKworICAgIFJlZlB0cjxMYXllckFuaW1hdGlvbj4gbGF5ZXJBbmltYXRpb24gPSBMYXllckFu
aW1hdGlvbjo6Y3JlYXRlKHZhbHVlcywgYm94U2l6ZSwgYW5pbWF0aW9uLCBhbmltYXRpb25OYW1l
LCB0aW1lT2Zmc2V0KTsKKworI2lmIERFQlVHX0xBWUVSX0FOSU1BVElPTgorICAgIGZwcmludGYo
c3RkZXJyLCAiTGF5ZXJBbmltYXRpb24gMHglMDh4OiBBZGRpbmcgYW5pbWF0aW9uICVzIGZvciBw
cm9wZXJ0eSAlZFxuIiwgbGF5ZXJBbmltYXRpb24uZ2V0KCksIGFuaW1hdGlvbk5hbWUubGF0aW4x
KCkuZGF0YSgpLCB2YWx1ZXMucHJvcGVydHkoKSk7CisjZW5kaWYKKworICAgIG1fcnVubmluZ0Fu
aW1hdGlvbnMuYXBwZW5kKGxheWVyQW5pbWF0aW9uKTsKKworICAgIHVwZGF0ZUFuaW1hdGlvbnMo
KTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5
OjpwYXVzZUFuaW1hdGlvbihjb25zdCBTdHJpbmcmIGFuaW1hdGlvbk5hbWUsIGRvdWJsZSB0aW1l
T2Zmc2V0KQoreworICAgIC8vIFdlYkNvcmUgbWlnaHQgaGF2ZSBhZGRlZCBzZXZlcmFsIGFuaW1h
dGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgZm9yIGRpZmZlcmVudCBwcm9wZXJ0aWVzCisK
KyAgICB3aGlsZSAoUmVmUHRyPExheWVyQW5pbWF0aW9uPiBhbmltYXRpb24gPSByZW1vdmVBbmlt
YXRpb25CeU5hbWUoYW5pbWF0aW9uTmFtZSwgbV9ydW5uaW5nQW5pbWF0aW9ucykpIHsKKyNpZiBE
RUJVR19MQVlFUl9BTklNQVRJT04KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJMYXllckFuaW1h
dGlvbiAweCUwOHg6IFBhdXNpbmcgYW5pbWF0aW9uICVzXG4iLCBhbmltYXRpb24uZ2V0KCksIGFu
aW1hdGlvbi0+bmFtZSgpLmxhdGluMSgpLmRhdGEoKSk7CisjZW5kaWYKKworICAgICAgICAvLyBM
YXllckFuaW1hdGlvbiBpcyByZWFkb25seS4gQ3JlYXRlIGEgbmV3IGFuaW1hdGlvbiB3aXRoIHRo
ZSBzYW1lIGRhdGEgZXhjZXB0IGZvciB0aW1lT2Zmc2V0LgorICAgICAgICAvLyBXZWJDb3JlIHdp
bGwgYWRqdXN0IHRoZSB0aW1lT2Zmc2V0IGZvciBwYXVzZWQgYW5pbWF0aW9ucyBzbyBpdCBjYW4g
YmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisgICAgICAgIC8vIHByb2dyZXNzIGZvciB0aGUgcGF1
c2VkIGFuaW1hdGlvbiB3aXRob3V0IGtub3dpbmcgdGhlIGV4YWN0IHRpbWVzdGFtcCB3aGVuIHRo
ZSBhbmltYXRpb24gd2FzCisgICAgICAgIC8vIHBhdXNlZC4KKyAgICAgICAgLy8gSWYgYW4gYW5p
bWF0aW9uIHdhcyBzdGFydGVkIHdpdGggYSB0aW1lT2Zmc2V0IGR0X29yaWcgYW5kIHBhdXNlZCBk
dF9wYXVzZSBzZWNvbmRzIGxhdGVyLCB0aGUKKyAgICAgICAgLy8gY2xvbmVkIGFuaW1hdGlvbiB3
aWxsIGhhdmUgYSB0aW1lT2Zmc2V0IG9mIGR0X3BhdXNlICsgZHRfb3JpZy4KKyAgICAgICAgYW5p
bWF0aW9uID0gYW5pbWF0aW9uLT5jbG9uZSh0aW1lT2Zmc2V0KTsKKyAgICAgICAgbV9zdXNwZW5k
ZWRBbmltYXRpb25zLmFwcGVuZChhbmltYXRpb24pOworCisjaWYgREVCVUdfTEFZRVJfQU5JTUFU
SU9OCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTGF5ZXJBbmltYXRpb24gMHglMDh4OiBQYXVz
ZWQgYW5pbWF0aW9uICVzXG4iLCBhbmltYXRpb24uZ2V0KCksIGFuaW1hdGlvbi0+bmFtZSgpLmxh
dGluMSgpLmRhdGEoKSk7CisjZW5kaWYKKyAgICB9OworCisgICAgdXBkYXRlQW5pbWF0aW9ucygp
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZW1vdmVBbmltYXRpb24oY29u
c3QgU3RyaW5nJiBhbmltYXRpb25OYW1lKQoreworICAgIC8vIFdlYkNvcmUgbWlnaHQgaGF2ZSBh
ZGRlZCBzZXZlcmFsIGFuaW1hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCBidXQgZm9yIGRpZmZl
cmVudCBwcm9wZXJ0aWVzCisKKyNpZiBERUJVR19MQVlFUl9BTklNQVRJT04KKyAgICBmcHJpbnRm
KHN0ZGVyciwgIkxheWVyQW5pbWF0aW9uOiBSZW1vdmluZyBhbmltYXRpb24gJXNcbiIsIGFuaW1h
dGlvbk5hbWUubGF0aW4xKCkuZGF0YSgpKTsKKyNlbmRpZgorCisgICAgd2hpbGUgKHJlbW92ZUFu
aW1hdGlvbkJ5TmFtZShhbmltYXRpb25OYW1lLCBtX3J1bm5pbmdBbmltYXRpb25zKSkgeyB9Cisg
ICAgd2hpbGUgKHJlbW92ZUFuaW1hdGlvbkJ5TmFtZShhbmltYXRpb25OYW1lLCBtX3N1c3BlbmRl
ZEFuaW1hdGlvbnMpKSB7IH0KKworICAgIHVwZGF0ZUFuaW1hdGlvbnMoKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c3VzcGVuZEFuaW1hdGlvbnMoZG91YmxlIHRpbWUpCit7
CisjaWYgREVCVUdfTEFZRVJfQU5JTUFUSU9OCisgICAgZnByaW50ZihzdGRlcnIsICJMYXllckFu
aW1hdGlvbjogU3VzcGVuZGluZyBhbmltYXRpb25zXG4iKTsKKyNlbmRpZgorICAgIG1fc3VzcGVu
ZFRpbWUgPSB0aW1lOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpyZXN1bWVB
bmltYXRpb25zKCkKK3sKKyNpZiBERUJVR19MQVlFUl9BTklNQVRJT04KKyAgICBmcHJpbnRmKHN0
ZGVyciwgIkxheWVyQW5pbWF0aW9uOiBSZXN1bWluZyBhbmltYXRpb25zXG4iKTsKKyNlbmRpZgor
ICAgIG1fc3VzcGVuZFRpbWUgPSAwOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5
OjpzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAgIGJvb2wgY2hpbGRyZW5D
aGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIG1fY29udGVudHNMYXll
clB1cnBvc2UgPSBDb250ZW50c0xheWVyRm9ySW1hZ2U7CisgICAgICAgIGlmICghbV9jb250ZW50
c0xheWVyKQorICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2VkID0gdHJ1ZTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlID0gTm9Db250ZW50c0xheWVyOworICAg
ICAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2VkID0g
dHJ1ZTsKKyAgICB9CisKKyAgICB1cGRhdGVDb250ZW50c0ltYWdlKGltYWdlKTsKKworICAgIGlm
IChjaGlsZHJlbkNoYW5nZWQpCisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVDb250ZW50c0ltYWdlKEltYWdlKiBp
bWFnZSkKK3sKKyAgICBpZiAoaW1hZ2UpIHsKKyAgICAgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIu
Z2V0KCkpIHsKKyAgICAgICAgICAgIFJlZlB0cjxMYXllcldlYktpdFRocmVhZD4gaW1hZ2VMYXll
ciA9IExheWVyV2ViS2l0VGhyZWFkOjpjcmVhdGUoTGF5ZXJEYXRhOjpMYXllciwgdGhpcyk7CisK
KyAgICAgICAgICAgIHNldHVwQ29udGVudHNMYXllcihpbWFnZUxheWVyLmdldCgpKTsKKyAgICAg
ICAgICAgIG1fY29udGVudHNMYXllciA9IGltYWdlTGF5ZXI7CisgICAgICAgICAgICAvLyBtX2Nv
bnRlbnRzTGF5ZXIgd2lsbCBiZSBwYXJlbnRlZCBieSB1cGRhdGVTdWJsYXllckxpc3QuCisgICAg
ICAgIH0KKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRDb250ZW50cyhpbWFnZSk7CisKKyAg
ICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm8g
aW1hZ2UuIG1fY29udGVudHNMYXllciB3aWxsIGJlIHJlbW92ZWQgdmlhIHVwZGF0ZVN1YmxheWVy
TGlzdC4KKyAgICAgICAgbV9jb250ZW50c0xheWVyID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllckJsYWNrQmVycnk6OnNldENvbnRlbnRzVG9DYW52YXMoUGxhdGZvcm1MYXllciog
cGxhdGZvcm1MYXllcikKK3sKKyAgICBib29sIGNoaWxkcmVuQ2hhbmdlZCA9IGZhbHNlOworICAg
IGlmIChwbGF0Zm9ybUxheWVyKSB7CisgICAgICAgIHBsYXRmb3JtTGF5ZXItPnNldE93bmVyKHRo
aXMpOworICAgICAgICBpZiAobV9jb250ZW50c0xheWVyLmdldCgpICE9IHBsYXRmb3JtTGF5ZXIp
IHsKKyAgICAgICAgICAgIHNldHVwQ29udGVudHNMYXllcihwbGF0Zm9ybUxheWVyKTsKKyAgICAg
ICAgICAgIG1fY29udGVudHNMYXllciA9IHBsYXRmb3JtTGF5ZXI7CisgICAgICAgICAgICBtX2Nv
bnRlbnRzTGF5ZXJQdXJwb3NlID0gQ29udGVudHNMYXllckZvckNhbnZhczsKKyAgICAgICAgICAg
IGNoaWxkcmVuQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbV9jb250ZW50c0xh
eWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAgICAg
Y2hpbGRyZW5DaGFuZ2VkID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gVGhlIG9sZCBjb250ZW50
cyBsYXllciB3aWxsIGJlIHJlbW92ZWQgdmlhIHVwZGF0ZVN1YmxheWVyTGlzdC4KKyAgICAgICAg
ICAgIG1fY29udGVudHNMYXllciA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2hp
bGRyZW5DaGFuZ2VkKQorICAgICAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0Q29udGVudHNUb01lZGlhKFBsYXRmb3JtTGF5ZXIq
IGxheWVyKQoreworICAgIGJvb2wgY2hpbGRyZW5DaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGxh
eWVyKSB7CisgICAgICAgIGlmICghbV9jb250ZW50c0xheWVyLmdldCgpIHx8IG1fY29udGVudHNM
YXllclB1cnBvc2UgIT0gQ29udGVudHNMYXllckZvclZpZGVvKSB7CisgICAgICAgICAgICBzZXR1
cENvbnRlbnRzTGF5ZXIobGF5ZXIpOworICAgICAgICAgICAgbV9jb250ZW50c0xheWVyID0gbGF5
ZXI7CisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlID0gQ29udGVudHNMYXllckZv
clZpZGVvOworICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQor
ICAgICAgICBsYXllci0+c2V0T3duZXIodGhpcyk7CisgICAgICAgIGxheWVyLT5zZXROZWVkc0Rp
c3BsYXkoKTsKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAgICAgY2hpbGRyZW5DaGFuZ2Vk
ID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gVGhlIG9sZCBjb250ZW50cyBsYXllciB3aWxsIGJl
IHJlbW92ZWQgdmlhIHVwZGF0ZVN1YmxheWVyTGlzdC4KKyAgICAgICAgICAgIG1fY29udGVudHNM
YXllciA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2hpbGRyZW5DaGFuZ2VkKQor
ICAgICAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKworUGxhdGZvcm1MYXllciogR3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6Omhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fdHJhbnNmb3JtTGF5ZXIgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDogbV9sYXll
ci5nZXQoKTsKK30KKworUGxhdGZvcm1MYXllciogR3JhcGhpY3NMYXllckJsYWNrQmVycnk6Omxh
eWVyRm9yU3VwZXJsYXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdHJhbnNmb3JtTGF5ZXIg
PyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDogbV9sYXllci5nZXQoKTsKK30KKworUGxhdGZvcm1M
YXllciogR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnBsYXRmb3JtTGF5ZXIoKSBjb25zdAorewor
ICAgIHJldHVybiBwcmltYXJ5TGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tC
ZXJyeTo6c2V0RGVidWdCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAg
IGlmIChjb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIHNldExheWVyQmFja2dyb3VuZENvbG9yKCpt
X2xheWVyLCBjb2xvcik7CisgICAgZWxzZQorICAgICAgICBjbGVhckxheWVyQmFja2dyb3VuZENv
bG9yKCptX2xheWVyKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6c2V0RGVi
dWdCb3JkZXIoY29uc3QgQ29sb3ImIGNvbG9yLCBmbG9hdCBib3JkZXJXaWR0aCkKK3sKKyAgICBp
ZiAoY29sb3IuaXNWYWxpZCgpKSB7CisgICAgICAgIHNldExheWVyQm9yZGVyQ29sb3IoKm1fbGF5
ZXIsIGNvbG9yKTsKKyAgICAgICAgbV9sYXllci0+c2V0Qm9yZGVyV2lkdGgoYm9yZGVyV2lkdGgp
OworICAgIH0gZWxzZSB7CisgICAgICAgIGNsZWFyQm9yZGVyQ29sb3IoKm1fbGF5ZXIpOworICAg
ICAgICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZVN1YmxheWVyTGlzdCgpCit7CisgICAgVmVjdG9yPFJl
ZlB0cjxMYXllcldlYktpdFRocmVhZD4gPiBuZXdTdWJsYXllcnM7CisKKyAgICBpZiAobV90cmFu
c2Zvcm1MYXllcikgeworICAgICAgICAvLyBBZGQgdGhlIHByaW1hcnkgbGF5ZXIgZmlyc3QuIEV2
ZW4gaWYgd2UgaGF2ZSBuZWdhdGl2ZSB6LW9yZGVyIGNoaWxkcmVuLCB0aGUgcHJpbWFyeSBsYXll
ciBhbHdheXMgY29tZXMgYmVoaW5kLgorICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKG1fbGF5
ZXIuZ2V0KCkpOworICAgIH0gZWxzZSBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIC8v
IEZJWE1FOiBhZGQgdGhlIGNvbnRlbnRzIGxheWVyIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGgg
bmVnYXRpdmUgei1vcmRlciBjaGlsZHJlbi4KKyAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjYXVz
ZSB2aXNpYmxlIHJlbmRlcmluZyBpc3N1ZXMgYmVjYXVzZSBjdXJyZW50bHkgY29udGVudHMgbGF5
ZXJzIGFyZSBvbmx5IHVzZWQKKyAgICAgICAgLy8gZm9yIHJlcGxhY2VkIGVsZW1lbnRzIHRoYXQg
ZG9uJ3QgaGF2ZSBjaGlsZHJlbi4KKyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZChtX2NvbnRl
bnRzTGF5ZXIuZ2V0KCkpOworICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVy
Kj4mIGNoaWxkTGF5ZXJzID0gY2hpbGRyZW4oKTsKKyAgICBzaXplX3QgbnVtQ2hpbGRyZW4gPSBj
aGlsZExheWVycy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1DaGlsZHJl
bjsgKytpKSB7CisgICAgICAgIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5KiBjdXJDaGlsZCA9IHN0
YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Kj4oY2hpbGRMYXllcnNbaV0pOworCisg
ICAgICAgIExheWVyV2ViS2l0VGhyZWFkKiBjaGlsZExheWVyID0gY3VyQ2hpbGQtPmxheWVyRm9y
U3VwZXJsYXllcigpOworICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKGNoaWxkTGF5ZXIpOwor
ICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U3VibGF5ZXJzLnNpemUoKTsg
KytpKQorICAgICAgICBuZXdTdWJsYXllcnNbaV0tPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisK
KyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikgeworICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5z
ZXRTdWJsYXllcnMobmV3U3VibGF5ZXJzKTsKKworICAgICAgICBpZiAobV9jb250ZW50c0xheWVy
KSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdHJhbnNmb3JtIGxheWVyLCB0aGVuIHRo
ZSBjb250ZW50cyBsYXllciBpcyBwYXJlbnRlZCBpbiB0aGUKKyAgICAgICAgICAgIC8vIHByaW1h
cnkgbGF5ZXIgKHdoaWNoIGlzIGl0c2VsZiBhIGNoaWxkIG9mIHRoZSB0cmFuc2Zvcm0gbGF5ZXIp
LgorICAgICAgICAgICAgbV9sYXllci0+cmVtb3ZlQWxsU3VibGF5ZXJzKCk7CisgICAgICAgICAg
ICBtX2xheWVyLT5hZGRTdWJsYXllcihtX2NvbnRlbnRzTGF5ZXIpOworICAgICAgICB9CisgICAg
fSBlbHNlCisgICAgICAgIG1fbGF5ZXItPnNldFN1YmxheWVycyhuZXdTdWJsYXllcnMpOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVMYXllclBvc2l0aW9uKCkKK3sK
KyAgICAvLyBQb3NpdGlvbiBpcyBvZmZzZXQgb24gdGhlIGxheWVyIGJ5IHRoZSBsYXllciBhbmNo
b3IgcG9pbnQuCisgICAgRmxvYXRQb2ludCBsYXllclBvc2l0aW9uKG1fcG9zaXRpb24ueCgpICsg
bV9hbmNob3JQb2ludC54KCkgKiBtX3NpemUud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbV9wb3NpdGlvbi55KCkgKyBtX2FuY2hvclBvaW50LnkoKSAqIG1fc2l6ZS5oZWln
aHQoKSk7CisKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0UG9zaXRpb24obGF5ZXJQb3NpdGlvbik7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUxheWVyU2l6ZSgpCit7
CisgICAgSW50U2l6ZSBsYXllclNpemUobV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWlnaHQoKSk7
CisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+
c2V0Qm91bmRzKGxheWVyU2l6ZSk7CisgICAgICAgIC8vIFRoZSBhbmNob3Igb2YgdGhlIGNvbnRl
bnRzIGxheWVyIGlzIGFsd2F5cyBhdCAwLjUsIDAuNSwgc28gdGhlIHBvc2l0aW9uIGlzIGNlbnRl
ci1yZWxhdGl2ZS4KKyAgICAgICAgRmxvYXRQb2ludCBjZW50ZXJQb2ludChtX3NpemUud2lkdGgo
KSAvIDIsIG1fc2l6ZS5oZWlnaHQoKSAvIDIpOworICAgICAgICBtX2xheWVyLT5zZXRQb3NpdGlv
bihjZW50ZXJQb2ludCk7CisgICAgfQorCisgICAgbV9sYXllci0+c2V0Qm91bmRzKGxheWVyU2l6
ZSk7CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgcmVzaXplIG1fY29udGVudHNMYXllci4g
SXQncyB1cCB0aGUgY2FsbGVyIHRvIGRvIHRoYXQuCisKKyAgICAvLyBJZiB3ZSd2ZSBjaGFuZ2Vk
IHRoZSBib3VuZHMsIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uCisgICAgLy8g
b2YgdGhlIGxheWVyLCB0YWtpbmcgYW5jaG9yIHBvaW50IGludG8gYWNjb3VudC4KKyAgICB1cGRh
dGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVw
ZGF0ZUFuY2hvclBvaW50KCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5jaG9yUG9pbnQo
RmxvYXRQb2ludChtX2FuY2hvclBvaW50LngoKSwgbV9hbmNob3JQb2ludC55KCkpKTsKKyAgICBw
cmltYXJ5TGF5ZXIoKS0+c2V0QW5jaG9yUG9pbnRaKG1fYW5jaG9yUG9pbnQueigpKTsKKyAgICB1
cGRhdGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6
OnVwZGF0ZVRyYW5zZm9ybSgpCit7CisgICAgcHJpbWFyeUxheWVyKCktPnNldFRyYW5zZm9ybSht
X3RyYW5zZm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUNo
aWxkcmVuVHJhbnNmb3JtKCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0U3VibGF5ZXJUcmFu
c2Zvcm0obV9jaGlsZHJlblRyYW5zZm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNr
QmVycnk6OnVwZGF0ZU1hc2tzVG9Cb3VuZHMoKQoreworICAgIG1fbGF5ZXItPnNldE1hc2tzVG9C
b3VuZHMobV9tYXNrc1RvQm91bmRzKTsKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNPcGFxdWUoKQor
eworICAgIG1fbGF5ZXItPnNldE9wYXF1ZShtX2NvbnRlbnRzT3BhcXVlKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KCkKK3sKKyAg
ICBtX2xheWVyLT5zZXREb3VibGVTaWRlZChtX2JhY2tmYWNlVmlzaWJpbGl0eSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUxheWVyUHJlc2VydmVzM0QoKQorewor
ICAgIGlmIChtX3ByZXNlcnZlczNEICYmICFtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIC8v
IENyZWF0ZSB0aGUgdHJhbnNmb3JtIGxheWVyLgorICAgICAgICBtX3RyYW5zZm9ybUxheWVyID0g
TGF5ZXJXZWJLaXRUaHJlYWQ6OmNyZWF0ZShMYXllckRhdGE6OlRyYW5zZm9ybUxheWVyLCB0aGlz
KTsKKworICAgICAgICAvLyBDb3B5IHRoZSBwb3NpdGlvbiBmcm9tIHRoaXMgbGF5ZXIuCisgICAg
ICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKKyAgICAgICAgdXBkYXRlTGF5ZXJTaXplKCk7Cisg
ICAgICAgIHVwZGF0ZUFuY2hvclBvaW50KCk7CisgICAgICAgIHVwZGF0ZVRyYW5zZm9ybSgpOwor
ICAgICAgICB1cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgpOworICAgICAgICB1cGRhdGVBbmltYXRp
b25zKCk7CisKKyAgICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24oRmxvYXRQb2ludChtX3NpemUu
d2lkdGgoKSAvIDIuMGYsIG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpKTsKKworICAgICAgICBtX2xh
eWVyLT5zZXRBbmNob3JQb2ludChGbG9hdFBvaW50KDAuNWYsIDAuNWYpKTsKKyAgICAgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggaWRlbnRpdHk7CisgICAgICAgIG1fbGF5ZXItPnNldFRyYW5zZm9y
bShpZGVudGl0eSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBvbGQgbGF5ZXIgdG8gb3BhY2l0eSBv
ZiAxLiBGdXJ0aGVyIGRvd24gd2Ugd2lsbCBzZXQgdGhlIG9wYWNpdHkgb24gdGhlIHRyYW5zZm9y
bSBsYXllci4KKyAgICAgICAgbV9sYXllci0+c2V0T3BhY2l0eSgxKTsKKworICAgICAgICAvLyBN
b3ZlIHRoaXMgbGF5ZXIgdG8gYmUgYSBjaGlsZCBvZiB0aGUgdHJhbnNmb3JtIGxheWVyLgorICAg
ICAgICBpZiAobV9sYXllci0+c3VwZXJsYXllcigpKQorICAgICAgICAgICAgbV9sYXllci0+c3Vw
ZXJsYXllcigpLT5yZXBsYWNlU3VibGF5ZXIobV9sYXllci5nZXQoKSwgbV90cmFuc2Zvcm1MYXll
ci5nZXQoKSk7CisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPmFkZFN1YmxheWVyKG1fbGF5ZXIu
Z2V0KCkpOworCisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldFByZXNlcnZlczNEKHRydWUp
OworICAgICAgICBtX2xheWVyLT5zZXRQcmVzZXJ2ZXMzRCh0cnVlKTsKKworICAgICAgICB1cGRh
dGVTdWJsYXllckxpc3QoKTsKKyAgICB9IGVsc2UgaWYgKCFtX3ByZXNlcnZlczNEICYmIG1fdHJh
bnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgLy8gUmVsYWNlIHRoZSB0cmFuc2Zvcm1MYXllciBpbiB0
aGUgcGFyZW50IHdpdGggdGhpcyBsYXllci4KKyAgICAgICAgbV9sYXllci0+cmVtb3ZlRnJvbVN1
cGVybGF5ZXIoKTsKKyAgICAgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXItPnN1cGVybGF5ZXIoKSkK
KyAgICAgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnN1cGVybGF5ZXIoKS0+cmVwbGFjZVN1Ymxh
eWVyKG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCksIG1fbGF5ZXIuZ2V0KCkpOworCisgICAgICAgIC8v
IFJlbGVhc2UgdGhlIHRyYW5zZm9ybSBsYXllci4KKyAgICAgICAgbV90cmFuc2Zvcm1MYXllciA9
IDA7CisKKyAgICAgICAgdXBkYXRlTGF5ZXJQb3NpdGlvbigpOworICAgICAgICB1cGRhdGVMYXll
clNpemUoKTsKKyAgICAgICAgdXBkYXRlQW5jaG9yUG9pbnQoKTsKKyAgICAgICAgdXBkYXRlVHJh
bnNmb3JtKCk7CisgICAgICAgIHVwZGF0ZUNoaWxkcmVuVHJhbnNmb3JtKCk7CisgICAgICAgIHVw
ZGF0ZUFuaW1hdGlvbnMoKTsKKworICAgICAgICBtX2xheWVyLT5zZXRQcmVzZXJ2ZXMzRChmYWxz
ZSk7CisKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisgICAgfQorCisgICAgdXBkYXRl
T3BhY2l0eU9uTGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBk
YXRlTGF5ZXJJc0RyYXdhYmxlKCkKK3sKKyAgICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhlIGFjY2Vs
ZXJhdGVkIGNvbXBvc2l0b3IgY29kZSwgdGhlcmUgaXMgbm8gcmVhc29uIHRvIG1ha2UgYQorICAg
IC8vIGRpc3RpbmN0aW9uIGJldHdlZW4gZHJhd3NDb250ZW50IGFuZCBjb250ZW50c1Zpc2libGUu
IFNvLCBmb3IgbV9sYXllciwgdGhlc2UgdHdvCisgICAgLy8gZmxhZ3MgYXJlIGNvbWJpbmVkIGhl
cmUuIG1fY29udGVudHNMYXllciBzaG91bGRuJ3QgcmVjZWl2ZSB0aGUgZHJhd3NDb250ZW50IGZs
YWcKKyAgICAvLyBzbyBpdCBpcyBvbmx5IGdpdmVuIGNvbnRlbnRzVmlzaWJsZS4KKyAgICBtX2xh
eWVyLT5zZXREcmF3YWJsZShtX2RyYXdzQ29udGVudCAmJiBtX2NvbnRlbnRzVmlzaWJsZSk7CisK
KyAgICBpZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldERy
YXdhYmxlKG1fY29udGVudHNWaXNpYmxlKTsKKworICAgIGlmIChtX2RyYXdzQ29udGVudCkKKyAg
ICAgICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisKKyAgICB1cGRhdGVEZWJ1Z0luZGlj
YXRvcnMoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlRml4ZWRQ
b3NpdGlvbigpCit7CisgICAgbV9sYXllci0+c2V0Rml4ZWRQb3NpdGlvbihtX2ZpeGVkUG9zaXRp
b24pOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5Ojp1cGRhdGVIYXNGaXhlZENv
bnRhaW5lcigpCit7CisgICAgbV9sYXllci0+c2V0SGFzRml4ZWRDb250YWluZXIobV9oYXNGaXhl
ZENvbnRhaW5lcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZUhh
c0ZpeGVkQW5jZXN0b3JJbkRPTVRyZWUoKQoreworICAgIG1fbGF5ZXItPnNldEhhc0ZpeGVkQW5j
ZXN0b3JJbkRPTVRyZWUobV9oYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKQorewor
ICAgIGlmICghbV9jb250ZW50c0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXZSBu
ZXZlciBjcmVhdGUgdGhlIGNvbnRlbnRzIGxheWVyIGp1c3QgZm9yIGJhY2tncm91bmQgY29sb3Ig
eWV0LgorICAgIGlmIChtX2JhY2tncm91bmRDb2xvclNldCkKKyAgICAgICAgc2V0TGF5ZXJCYWNr
Z3JvdW5kQ29sb3IoKm1fY29udGVudHNMYXllciwgbV9iYWNrZ3JvdW5kQ29sb3IpOworICAgIGVs
c2UKKyAgICAgICAgY2xlYXJMYXllckJhY2tncm91bmRDb2xvcigqbV9jb250ZW50c0xheWVyKTsK
K30KKwordm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQW5pbWF0aW9ucygpCit7
CisgICAgLy8gV2hlbiB0aGVyZSBpcyBhIHRyYW5zZm9ybSBsYXllciwgdGhlIHRyYW5zZm9ybSBt
dXN0IGJlIHNldCBvbiB0aGF0IGxheWVyCisgICAgLy8gaW5zdGVhZCBvZiB0aGUgY29udGVudCBs
YXllci4gT3BhY2l0eSBjYW4gYmUgc2V0IG9uIHRoZSB0cmFuc2Zvcm0gbGF5ZXIgb3IgdGhlCisg
ICAgLy8gbGF5ZXIgd2l0aCBlcXVhbCBvdXRjb21lLCBidXQgY3VycmVudGx5IGl0IGlzIGFsc28g
c2V0IG9uIHRoZSB0cmFuc2Zvcm0KKyAgICAvLyBsYXllci4gU2luY2Ugd2Ugb25seSBhY2NlbGVy
YXRlIGFuaW1hdGlvbnMgb2YgdGhlc2UgdHdvIHByb3BlcnRpZXMsIGl0CisgICAgLy8gaXMgc2Fm
ZSB0byBtb3ZlIGFsbCBhY2NlbGVyYXRlZCBhbmltYXRpb25zIHRvIHRoZSB0cmFuc2Zvcm0gbGF5
ZXIsIGFuZAorICAgIC8vIHJlbW92ZSB0aGVtIGZyb20gdGhlIGxheWVyIHByb3Blci4KKyAgICAv
LyBTbyB0aGUgZm9sbG93aW5nIGNvZGUsIHdoaWxlIGl0IGxvb2tzIHN0cmFuZ2UsIGlzIGNvcnJl
Y3Q6CisgICAgLy8gd2UgdHJhbnNmZXIgYWxsIGFuaW1hdGlvbnMgdG8gdGhlIHRyYW5zZm9ybSBs
YXllciBpZiBpdCBleGlzdHMuCisgICAgLy8gRklYTUU6IElmIG90aGVyIHByb3BlcnRpZXMgYmVj
b21lIGFuaW1hdGVkLCBpdCBtYXkgbm90IGJlIGVxdWl2YWxlbnQgdG8KKyAgICAvLyBtb3ZlIHRo
ZW0gdG8gdGhlIHRyYW5zZm9ybSBsYXllci4gVGhlbiB0aGlzIGNvZGUgbmVlZHMgdG8gYmUgcmV2
aXNpdGVkCisgICAgLy8gdG8gb25seSBtb3ZlIHRoZSB0cmFuc2Zvcm0gYW5pbWF0aW9ucyB0byB0
aGUgdHJhbnNmb3JtIGxheWVyLgorICAgIHByaW1hcnlMYXllcigpLT5zZXRSdW5uaW5nQW5pbWF0
aW9ucyhtX3J1bm5pbmdBbmltYXRpb25zKTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0U3VzcGVu
ZGVkQW5pbWF0aW9ucyhtX3N1c3BlbmRlZEFuaW1hdGlvbnMpOworCisgICAgLy8gV2UgbmVlZCB0
byBtb3ZlIHRoZSBhbmltYXRpb25zIHRvIHRoZSB0cmFuc2Zvcm0gbGF5ZXIgaWYgdGhlcmUgaXMg
b25lLgorICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIG1fbGF5ZXItPnNldFJ1
bm5pbmdBbmltYXRpb25zKFZlY3RvcjxSZWZQdHI8TGF5ZXJBbmltYXRpb24+ID4oKSk7CisgICAg
ICAgIG1fbGF5ZXItPnNldFN1c3BlbmRlZEFuaW1hdGlvbnMoVmVjdG9yPFJlZlB0cjxMYXllckFu
aW1hdGlvbj4gPigpKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllckJsYWNrQmVycnk6
OnVwZGF0ZUNvbnRlbnRzVmlkZW8oKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyQmxhY2tCZXJyeTo6dXBkYXRlQ29udGVudHNSZWN0KCkKK3sKKyAg
ICBpZiAoIW1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jb250ZW50
c0xheWVyLT5zZXRQb3NpdGlvbihtX2NvbnRlbnRzUmVjdC5sb2NhdGlvbigpKTsKKyAgICBtX2Nv
bnRlbnRzTGF5ZXItPnNldEJvdW5kcyhtX2NvbnRlbnRzUmVjdC5zaXplKCkpOworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5OjpzZXR1cENvbnRlbnRzTGF5ZXIoTGF5ZXJXZWJLaXRU
aHJlYWQqIGNvbnRlbnRzTGF5ZXIpCit7CisgICAgaWYgKGNvbnRlbnRzTGF5ZXIgPT0gbV9jb250
ZW50c0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9jb250ZW50c0xheWVyKSB7
CisgICAgICAgIG1fY29udGVudHNMYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKyAgICAg
ICAgbV9jb250ZW50c0xheWVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoY29udGVudHNMYXllcikg
eworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSBjb250ZW50c0xheWVyOworCisgICAgICAgIG1f
Y29udGVudHNMYXllci0+c2V0QW5jaG9yUG9pbnQoRmxvYXRQb2ludDo6emVybygpKTsKKworICAg
ICAgICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gdXBkYXRlIHNldERyYXdhYmxlIGFzIHNvb24gYXMg
d2UgcmVjZWl2ZSB0aGUgbmV3IGNvbnRlbnRzTGF5ZXIsIGZvcgorICAgICAgICAvLyB0aGUgY29y
cmVjdG5lc3Mgb2YgZWFybHkgZXhpdCBjb25kaXRpb25zIGluIHNldERyYXdzQ29udGVudCgpIGFu
ZCBzZXRDb250ZW50c1Zpc2libGUoKS4KKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXREcmF3
YWJsZShtX2NvbnRlbnRzVmlzaWJsZSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHRoZSBjb250ZW50
IGxheWVyIGZpcnN0LiBWaWRlbyBlbGVtZW50cyByZXF1aXJlIHRoaXMsIGJlY2F1c2UgdGhleSBo
YXZlCisgICAgICAgIC8vIHNoYWRvdyBjb250ZW50IHRoYXQgbXVzdCBkaXNwbGF5IGluIGZyb250
IG9mIHRoZSB2aWRlby4KKyAgICAgICAgbV9sYXllci0+aW5zZXJ0U3VibGF5ZXIobV9jb250ZW50
c0xheWVyLmdldCgpLCAwKTsKKworICAgICAgICB1cGRhdGVDb250ZW50c1JlY3QoKTsKKworICAg
ICAgICBpZiAoc2hvd0RlYnVnQm9yZGVycygpKSB7CisgICAgICAgICAgICBzZXRMYXllckJvcmRl
ckNvbG9yKCptX2NvbnRlbnRzTGF5ZXIsIENvbG9yKDAsIDAsIDEyOCwgMTgwKSk7CisgICAgICAg
ICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvcmRlcldpZHRoKDEpOworICAgICAgICB9CisgICAg
fQorICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHNp
bXBseSBtaW1pY3MgdGhlIG9wZXJhdGlvbiBvZiBHcmFwaGljc0xheWVyQ0EKK3ZvaWQgR3JhcGhp
Y3NMYXllckJsYWNrQmVycnk6OnVwZGF0ZU9wYWNpdHlPbkxheWVyKCkKK3sKKyAgICBwcmltYXJ5
TGF5ZXIoKS0+c2V0T3BhY2l0eShtX29wYWNpdHkpOworfQorCitib29sIEdyYXBoaWNzTGF5ZXJC
bGFja0JlcnJ5Ojpjb250ZW50c1Zpc2libGUoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QpIGNv
bnN0Cit7CisgICAgaWYgKCFtX2NsaWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
cmV0dXJuIG1fY2xpZW50LT5jb250ZW50c1Zpc2libGUodGhpcywgY29udGVudFJlY3QpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9i
bGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYXBoaWNzTGF5ZXJCbGFja0JlcnJ5LmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZWY3Y2RkYWViM2RiNDVmYTI2NTBkNzczNTg4ODBlY2VjYzk5Yjc0MwotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR3Jh
cGhpY3NMYXllckJsYWNrQmVycnkuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0
OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpZm5kZWYgR3JhcGhpY3NMYXllckJsYWNrQmVycnlfaAorI2RlZmluZSBHcmFw
aGljc0xheWVyQmxhY2tCZXJyeV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCisKKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJBbmltYXRpb247CitjbGFzcyBM
YXllcldlYktpdFRocmVhZDsKKworY2xhc3MgR3JhcGhpY3NMYXllckJsYWNrQmVycnkgOiBwdWJs
aWMgR3JhcGhpY3NMYXllciB7CitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllckJsYWNrQmVycnko
R3JhcGhpY3NMYXllckNsaWVudCopOworICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJCbGFja0Jl
cnJ5KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmKTsKKworICAg
IHZpcnR1YWwgYm9vbCBzZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+Jik7
CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKEdyYXBoaWNzTGF5ZXIqKTsKKyAgICB2aXJ0dWFs
IHZvaWQgYWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIqLCBpbnQgaW5kZXgpOworICAgIHZp
cnR1YWwgdm9pZCBhZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqLCBHcmFwaGljc0xheWVyKiBz
aWJsaW5nKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVyKiwg
R3JhcGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVhbCBib29sIHJlcGxhY2VDaGlsZChH
cmFwaGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpOworCisgICAg
dmlydHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRQ
b3NpdGlvbihjb25zdCBGbG9hdFBvaW50Jik7CisgICAgdmlydHVhbCB2b2lkIHNldEFuY2hvclBv
aW50KGNvbnN0IEZsb2F0UG9pbnQzRCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXplKGNvbnN0
IEZsb2F0U2l6ZSYpOworCisgICAgdmlydHVhbCB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldENoaWxkcmVuVHJhbnNm
b3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0
UHJlc2VydmVzM0QoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9v
bCk7CisgICAgdmlydHVhbCB2b2lkIHNldERyYXdzQ29udGVudChib29sKTsKKyAgICB2aXJ0dWFs
IHZvaWQgc2V0Q29udGVudHNWaXNpYmxlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXNr
TGF5ZXIoR3JhcGhpY3NMYXllciopOworICAgIHZpcnR1YWwgdm9pZCBzZXRSZXBsaWNhdGVkQnlM
YXllcihHcmFwaGljc0xheWVyKik7CisgICAgdmlydHVhbCB2b2lkIHNldEZpeGVkUG9zaXRpb24o
Ym9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldEhhc0ZpeGVkQ29udGFpbmVyKGJvb2wpOworICAg
IHZpcnR1YWwgdm9pZCBzZXRIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVlKGJvb2wpOworCisgICAg
dmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1
YWwgdm9pZCBjbGVhckJhY2tncm91bmRDb2xvcigpOworCisgICAgdmlydHVhbCB2b2lkIHNldENv
bnRlbnRzT3BhcXVlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZmFjZVZpc2liaWxp
dHkoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T3BhY2l0eShmbG9hdCk7CisKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRz
RGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRD
b250ZW50c05lZWRzRGlzcGxheSgpOworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVj
dChjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIGJvb2wgYWRkQW5pbWF0aW9uKGNvbnN0
IEtleWZyYW1lVmFsdWVMaXN0JiwgY29uc3QgSW50U2l6ZSYgYm94U2l6ZSwgY29uc3QgQW5pbWF0
aW9uKiwgY29uc3QgU3RyaW5nJiBhbmltYXRpb25OYW1lLCBkb3VibGUgdGltZU9mZnNldCk7Cisg
ICAgdmlydHVhbCB2b2lkIHBhdXNlQW5pbWF0aW9uKGNvbnN0IFN0cmluZyYgYW5pbWF0aW9uTmFt
ZSwgZG91YmxlIHRpbWVPZmZzZXQpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVBbmltYXRpb24o
Y29uc3QgU3RyaW5nJiBhbmltYXRpb25OYW1lKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdXNwZW5k
QW5pbWF0aW9ucyhkb3VibGUgdGltZSk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZUFuaW1hdGlv
bnMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb01lZGlhKFBsYXRmb3JtTGF5ZXIqKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0NhbnZhcyhQbGF0Zm9ybUxheWVyKik7CisKKyAgICB2
aXJ0dWFsIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1
YWwgdm9pZCBzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1
YWwgdm9pZCBzZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYsIGZsb2F0IGJvcmRlcldpZHRoKTsK
KworICAgIHZvaWQgbm90aWZ5U3luY1JlcXVpcmVkKCkKKyAgICB7CisgICAgICAgIGlmIChtX2Ns
aWVudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5ub3RpZnlTeW5jUmVxdWlyZWQodGhpcyk7Cisg
ICAgfQorCisgICAgdm9pZCBub3RpZnlBbmltYXRpb25TdGFydGVkKGRvdWJsZSB0aW1lKQorICAg
IHsKKyAgICAgICAgaWYgKG1fY2xpZW50KQorICAgICAgICAgICAgbV9jbGllbnQtPm5vdGlmeUFu
aW1hdGlvblN0YXJ0ZWQodGhpcywgdGltZSk7CisgICAgfQorCisgICAgYm9vbCBjb250ZW50c1Zp
c2libGUoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QpIGNvbnN0OworCitwcml2YXRlOgorICAg
IHZvaWQgdXBkYXRlT3BhY2l0eU9uTGF5ZXIoKTsKKworICAgIExheWVyV2ViS2l0VGhyZWFkKiBw
cmltYXJ5TGF5ZXIoKSBjb25zdCAgeyByZXR1cm4gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA/IG1f
dHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOyB9CisgICAgTGF5ZXJXZWJLaXRU
aHJlYWQqIGhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0OworICAgIExheWVyV2ViS2l0VGhy
ZWFkKiBsYXllckZvclN1cGVybGF5ZXIoKSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRlU3VibGF5
ZXJMaXN0KCk7CisgICAgdm9pZCB1cGRhdGVMYXllclBvc2l0aW9uKCk7CisgICAgdm9pZCB1cGRh
dGVMYXllclNpemUoKTsKKyAgICB2b2lkIHVwZGF0ZUFuY2hvclBvaW50KCk7CisgICAgdm9pZCB1
cGRhdGVUcmFuc2Zvcm0oKTsKKyAgICB2b2lkIHVwZGF0ZUNoaWxkcmVuVHJhbnNmb3JtKCk7Cisg
ICAgdm9pZCB1cGRhdGVNYXNrc1RvQm91bmRzKCk7CisgICAgdm9pZCB1cGRhdGVDb250ZW50c09w
YXF1ZSgpOworICAgIHZvaWQgdXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KCk7CisgICAgdm9pZCB1
cGRhdGVMYXllclByZXNlcnZlczNEKCk7CisgICAgdm9pZCB1cGRhdGVMYXllcklzRHJhd2FibGUo
KTsKKyAgICB2b2lkIHVwZGF0ZUZpeGVkUG9zaXRpb24oKTsKKyAgICB2b2lkIHVwZGF0ZUhhc0Zp
eGVkQ29udGFpbmVyKCk7CisgICAgdm9pZCB1cGRhdGVIYXNGaXhlZEFuY2VzdG9ySW5ET01UcmVl
KCk7CisgICAgdm9pZCB1cGRhdGVMYXllckJhY2tncm91bmRDb2xvcigpOworICAgIHZvaWQgdXBk
YXRlQW5pbWF0aW9ucygpOworCisgICAgdm9pZCB1cGRhdGVDb250ZW50c0ltYWdlKEltYWdlKik7
CisgICAgdm9pZCB1cGRhdGVDb250ZW50c1ZpZGVvKCk7CisgICAgdm9pZCB1cGRhdGVDb250ZW50
c1JlY3QoKTsKKworICAgIHZvaWQgc2V0dXBDb250ZW50c0xheWVyKExheWVyV2ViS2l0VGhyZWFk
Kik7CisgICAgTGF5ZXJXZWJLaXRUaHJlYWQqIGNvbnRlbnRzTGF5ZXIoKSBjb25zdCB7IHJldHVy
biBtX2NvbnRlbnRzTGF5ZXIuZ2V0KCk7IH0KKworICAgIFJlZlB0cjxMYXllcldlYktpdFRocmVh
ZD4gbV9sYXllcjsKKyAgICBSZWZQdHI8TGF5ZXJXZWJLaXRUaHJlYWQ+IG1fdHJhbnNmb3JtTGF5
ZXI7CisgICAgUmVmUHRyPExheWVyV2ViS2l0VGhyZWFkPiBtX2NvbnRlbnRzTGF5ZXI7CisKKyAg
ICBWZWN0b3I8UmVmUHRyPExheWVyQW5pbWF0aW9uPiA+IG1fcnVubmluZ0FuaW1hdGlvbnM7Cisg
ICAgVmVjdG9yPFJlZlB0cjxMYXllckFuaW1hdGlvbj4gPiBtX3N1c3BlbmRlZEFuaW1hdGlvbnM7
CisgICAgZG91YmxlIG1fc3VzcGVuZFRpbWU7CisKKyAgICBlbnVtIENvbnRlbnRzTGF5ZXJQdXJw
b3NlIHsKKyAgICAgICAgTm9Db250ZW50c0xheWVyID0gMCwKKyAgICAgICAgQ29udGVudHNMYXll
ckZvckltYWdlLAorICAgICAgICBDb250ZW50c0xheWVyRm9yVmlkZW8sCisgICAgICAgIENvbnRl
bnRzTGF5ZXJGb3JDYW52YXMsCisgICAgfTsKKworICAgIENvbnRlbnRzTGF5ZXJQdXJwb3NlIG1f
Y29udGVudHNMYXllclB1cnBvc2U7CisgICAgYm9vbCBtX2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3Jv
dW5kQ29sb3IgOiAxOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYK
</data>

          </attachment>
      

    </bug>

</bugzilla>