<?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>35557</bug_id>
          
          <creation_ts>2010-03-01 17:21:49 -0800</creation_ts>
          <short_desc>[chromium] Implement composited graphics layers with Skia</short_desc>
          <delta_ts>2010-03-22 12:34:10 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Vangelis Kokkevis">vangelis</reporter>
          <assigned_to name="Vangelis Kokkevis">vangelis</assigned_to>
          <cc>brettw</cc>
    
    <cc>cjerdonek</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>hamaji</cc>
    
    <cc>levin</cc>
    
    <cc>pinkerton</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>194885</commentid>
    <comment_count>0</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-01 17:21:49 -0800</bug_when>
    <thetext>Provide a software implementation of the ACCELERATED_COMPOSITING layer rendering path in WebKit via Skia. While it is unlikely that this path will be enabled for anything other than testing (or a fallback in case of missing h/w support), it will serve as a stepping stone towards a cross-platform GPU-based compositor for Chromium.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194932</commentid>
    <comment_count>1</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-03-01 21:29:19 -0800</bug_when>
    <thetext>What is the plan for Chromium Mac s/w fallback (where we do not use Skia presently)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195064</commentid>
    <comment_count>2</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-02 09:02:49 -0800</bug_when>
    <thetext>We should be able to do something similar using CG, assuming we thing it&apos;s worth the effort.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195253</commentid>
    <comment_count>3</comment_count>
      <attachid>49851</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-02 14:47:09 -0800</bug_when>
    <thetext>Created attachment 49851
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195292</commentid>
    <comment_count>4</comment_count>
      <attachid>49861</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-02 16:04:18 -0800</bug_when>
    <thetext>Created attachment 49861
Proposed patch with style issues fixed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195294</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-02 16:08:49 -0800</bug_when>
    <thetext>Attachment 49861 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/platform/graphics/skia/LayerSkia.h:76:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:79:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:82:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:94:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:97:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:100:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:103:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:109:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:123:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:126:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:129:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:133:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:154:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.cpp:259:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 14 in 16 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195670</commentid>
    <comment_count>6</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-03 11:05:05 -0800</bug_when>
    <thetext>A quick comment on the remaining issues caught by the webkit style checker:

The &quot;More than one command on the same line&quot; warning comes from inlined methods defined in the header file like this one:

class LayerSkia {
  ...
    void setHidden(bool hidden) { m_hidden = hidden; setNeedsCommit(); }
  ...
};


I could split them into one command per line but that would bloat the header file length:

class LayerSkia {
    ...
    void setHidden(bool hidden)
    {
        m_hidden = hidden;
        setNeedsCommit();
    }
    ...
}


The &quot;One line control clauses should not use braces&quot; comes from a for() loop with an empty body:

for( ... ) {} 

Which could be replaced by:

for( ... );

although I do find this more confusing and error prone.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195888</commentid>
    <comment_count>7</comment_count>
    <who name="Shinichiro Hamaji">hamaji</who>
    <bug_when>2010-03-03 22:03:38 -0800</bug_when>
    <thetext>&gt; The &quot;One line control clauses should not use braces&quot; comes from a for() loop
&gt; with an empty body:
&gt; 
&gt; for( ... ) {} 

Yeah, this is actually a false alarm. I filed a bug and submitted a patch: Bug 35717</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>195904</commentid>
    <comment_count>8</comment_count>
      <attachid>49861</attachid>
    <who name="Shinichiro Hamaji">hamaji</who>
    <bug_when>2010-03-03 23:10:43 -0800</bug_when>
    <thetext>Comment on attachment 49861
Proposed patch with style issues fixed

I think I cannot be the main reviewer of this change, but I&apos;d like to give some nitpicks. It&apos;s OK to ignore some of them, but you may want to consider some others.

&gt; +/** TODO(Vangelis)

I&apos;m not sure, but I think this is WebKit-styled code and we should use FIXME instead of TODO.

&gt; +namespace WebCore {
&gt; +
&gt; +

An unnecessary blank line?

&gt; +    posPoint.set(m_position.x() + m_anchorPoint.x() * m_size.width(), m_position.y() + m_anchorPoint.y() * m_size.height());

Looks weird. Maybe we should remove &quot;posPoint.fY = &quot; ?

&gt; +    // if we&apos;ve changed the bounds, we need to recalculate the position
&gt; +    // of the layer, taking anchor point into account.

s/if/If/ ?

&gt; +    rect.set(0,
&gt; +             0,
&gt; +             m_contentsRect.width(),
&gt; +             m_contentsRect.height());

Should be in a single line? I know the original code has the same issue though...

&gt; +        if (defaultContentsOrientation() == CompositingCoordinatesBottomUp) {
&gt; +            SkPoint anchorPoint;
&gt; +            anchorPoint.set(0.0f, 1.0f);
&gt; +            m_contentsLayer-&gt;setAnchorPoint(anchorPoint);

It seems the corresponding code in GraphicsLayerCACF is flipping Y-coordinate. Don&apos;t we need this operation?

&gt; +    for (size_t ii = 0; ii &lt; sublayers.size(); ii++)
&gt; +        drawLayerInCanvasRecursive(canvas, sublayers[ii].get(), opacity);

Are there any reason we prefer &quot;size_t ii&quot; to &quot;size_t i&quot; ?

&gt; +    SkMatrix transform = layer-&gt;transform();

It seems SkMatrix isn&apos;t the tiniest object. I guess it&apos;s better to use const reference here and elsewhere, but I&apos;m not sure.

&gt; +    SkPaint opacityPaint;
&gt; +    opacity = opacity * layer-&gt;opacity();

opacity *= layer-&gt;opacity() ?

&gt; +#include &quot;LayerSkia.h&quot;
&gt; +#include &lt;wtf/Noncopyable.h&gt;
&gt; +
&gt; +#include &lt;wtf/PassOwnPtr.h&gt;
&gt; +#include &lt;wtf/Vector.h&gt;

An unnecessary blank line between wtf headers.

&gt; Index: WebCore/platform/graphics/skia/LayerSkia.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/skia/LayerSkia.cpp	(revision 0)
&gt; +++ WebCore/platform/graphics/skia/LayerSkia.cpp	(revision 0)
&gt; @@ -0,0 +1,296 @@
&gt; +/*
&gt; + * Copyright (c) 2010, Google Inc. All rights reserved.
... snipped ...
&gt; + */
&gt; +
&gt; +
&gt; +#include &quot;config.h&quot;

An unnecessary blank line before config.h .

&gt; +using namespace std;
&gt; +
&gt; +

An unnecessary blank line.

&gt; +    delete m_graphicsContext;
&gt; +    delete m_skiaContext;
&gt; +    delete m_canvas;

Cannot we use OwnPtr ?

&gt; +LayerSkia* LayerSkia::ancestorOrSelfWithSuperlayer(LayerSkia* superlayer) const
&gt; +{
&gt; +    LayerSkia* layer = const_cast&lt;LayerSkia*&gt;(this);

The use of const_cast is exceptional. I think it&apos;s better to add a comment which describes why we need this. I&apos;m not sure, cannot we remove this const_cast easily in this case?

&gt; +void LayerSkia::setBackingStoreRect(const SkIRect&amp; rect)
&gt; +{
&gt; +    if (m_backingStoreRect == rect)
&gt; +        return;
&gt; +
&gt; +    updateGraphicsContext(rect);
&gt; +}
&gt; +
&gt; +

An unnecessary blank line.

&gt; +void LayerSkia::setFrame(const SkRect&amp; rect)
&gt; +{
&gt; +    m_frame = rect;
&gt; +    setNeedsCommit();
&gt; +}
&gt; +
&gt; +

Ditto.

&gt; +LayerSkia* LayerSkia::rootLayer() const
&gt; +{
&gt; +    LayerSkia* layer = const_cast&lt;LayerSkia*&gt;(this);

const_cast again.

&gt; +void LayerSkia::setNeedsDisplay()
&gt; +{
&gt; +    // TODO(vangelis): implement
&gt; +}
&gt; +
&gt; +

An unnecessary blank line.

&gt; +    WebFrameImpl* webframe = mainFrameImpl();
&gt; +    if (webframe) {
&gt; +        FrameView* view = webframe-&gt;frameView();
&gt; +        if (view) {

I think WebKit tends to like the following idiom:

    if (WebFrameImpl* webframe = mainFrameImpl()) {

&gt; +            LayerSkia* rootLayer = m_layerRenderer-&gt;rootLayer();
&gt; +            if (rootLayer) {

Ditto.

&gt; +    WebFrameImpl* webframe = mainFrameImpl();
&gt; +    if (webframe) {
&gt; +        FrameView* view = webframe-&gt;frameView();
&gt; +        if (view) {

Ditto.

&gt; +    bool isAcceleratedCompositing() { return m_isAcceleratedCompositing; }

I think this can be a const method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196248</commentid>
    <comment_count>9</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-04 15:35:45 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 49861 [details])
&gt; I think I cannot be the main reviewer of this change, but I&apos;d like to give some
&gt; nitpicks. It&apos;s OK to ignore some of them, but you may want to consider some
&gt; others.

Thanks for the review!

&gt; 
&gt; &gt; +/** TODO(Vangelis)
&gt; 
&gt; I&apos;m not sure, but I think this is WebKit-styled code and we should use FIXME
&gt; instead of TODO.
&gt; 
Changed all the TODO&apos;s to FIXME&apos;s
Done.
&gt; &gt; +namespace WebCore {
&gt; &gt; +
&gt; &gt; +
&gt; 
&gt; An unnecessary blank line?

Done.

&gt; 
&gt; &gt; +    posPoint.set(m_position.x() + m_anchorPoint.x() * m_size.width(), m_position.y() + m_anchorPoint.y() * m_size.height());
&gt; 
&gt; Looks weird. Maybe we should remove &quot;posPoint.fY = &quot; ?
&gt; 

Done.

&gt; &gt; +    // if we&apos;ve changed the bounds, we need to recalculate the position
&gt; &gt; +    // of the layer, taking anchor point into account.
&gt; 
&gt; s/if/If/ ?
&gt; 

Done.

&gt; &gt; +    rect.set(0,
&gt; &gt; +             0,
&gt; &gt; +             m_contentsRect.width(),
&gt; &gt; +             m_contentsRect.height());
&gt; 
&gt; Should be in a single line? I know the original code has the same issue
&gt; though...
&gt; 

Done.

&gt; &gt; +        if (defaultContentsOrientation() == CompositingCoordinatesBottomUp) {
&gt; &gt; +            SkPoint anchorPoint;
&gt; &gt; +            anchorPoint.set(0.0f, 1.0f);
&gt; &gt; +            m_contentsLayer-&gt;setAnchorPoint(anchorPoint);
&gt; 
&gt; It seems the corresponding code in GraphicsLayerCACF is flipping Y-coordinate.
&gt; Don&apos;t we need this operation?
&gt; 

Done.

&gt; &gt; +    for (size_t ii = 0; ii &lt; sublayers.size(); ii++)
&gt; &gt; +        drawLayerInCanvasRecursive(canvas, sublayers[ii].get(), opacity);
&gt; 
&gt; Are there any reason we prefer &quot;size_t ii&quot; to &quot;size_t i&quot; ?
&gt; 

Done.

&gt; &gt; +    SkMatrix transform = layer-&gt;transform();
&gt; 
&gt; It seems SkMatrix isn&apos;t the tiniest object. I guess it&apos;s better to use const
&gt; reference here and elsewhere, but I&apos;m not sure.
&gt; 

Done.

&gt; &gt; +    SkPaint opacityPaint;
&gt; &gt; +    opacity = opacity * layer-&gt;opacity();
&gt; 
&gt; opacity *= layer-&gt;opacity() ?
&gt; 

Done.

&gt; &gt; +#include &quot;LayerSkia.h&quot;
&gt; &gt; +#include &lt;wtf/Noncopyable.h&gt;
&gt; &gt; +
&gt; &gt; +#include &lt;wtf/PassOwnPtr.h&gt;
&gt; &gt; +#include &lt;wtf/Vector.h&gt;
&gt; 
&gt; An unnecessary blank line between wtf headers.
&gt; 

Done.

&gt; &gt; Index: WebCore/platform/graphics/skia/LayerSkia.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/platform/graphics/skia/LayerSkia.cpp	(revision 0)
&gt; &gt; +++ WebCore/platform/graphics/skia/LayerSkia.cpp	(revision 0)
&gt; &gt; @@ -0,0 +1,296 @@
&gt; &gt; +/*
&gt; &gt; + * Copyright (c) 2010, Google Inc. All rights reserved.
&gt; ... snipped ...
&gt; &gt; + */
&gt; &gt; +
&gt; &gt; +
&gt; &gt; +#include &quot;config.h&quot;
&gt; 
&gt; An unnecessary blank line before config.h .
&gt; 

Done.

&gt; &gt; +using namespace std;
&gt; &gt; +
&gt; &gt; +
&gt; 
&gt; An unnecessary blank line.

Done.

&gt; 
&gt; &gt; +    delete m_graphicsContext;
&gt; &gt; +    delete m_skiaContext;
&gt; &gt; +    delete m_canvas;
&gt; 
&gt; Cannot we use OwnPtr ?
&gt; 
Good suggestion.  It cleaned up the code quite a bit!
Done.

&gt; &gt; +LayerSkia* LayerSkia::ancestorOrSelfWithSuperlayer(LayerSkia* superlayer) const
&gt; &gt; +{
&gt; &gt; +    LayerSkia* layer = const_cast&lt;LayerSkia*&gt;(this);
&gt; 
&gt; The use of const_cast is exceptional. I think it&apos;s better to add a comment
&gt; which describes why we need this. I&apos;m not sure, cannot we remove this
&gt; const_cast easily in this case?
&gt; 
Removed the method altogether as it wasn&apos;t being used.
Done.

&gt; &gt; +void LayerSkia::setBackingStoreRect(const SkIRect&amp; rect)
&gt; &gt; +{
&gt; &gt; +    if (m_backingStoreRect == rect)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    updateGraphicsContext(rect);
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +
&gt; 
&gt; An unnecessary blank line.
&gt; 

Done.

&gt; &gt; +void LayerSkia::setFrame(const SkRect&amp; rect)
&gt; &gt; +{
&gt; &gt; +    m_frame = rect;
&gt; &gt; +    setNeedsCommit();
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +
&gt; 
&gt; Ditto.
&gt; 

Done.

&gt; &gt; +LayerSkia* LayerSkia::rootLayer() const
&gt; &gt; +{
&gt; &gt; +    LayerSkia* layer = const_cast&lt;LayerSkia*&gt;(this);
&gt; 
&gt; const_cast again.
&gt; 
Method now returns a const LayerSkia* and there&apos;s no need for casting the const away.
Done.

&gt; &gt; +void LayerSkia::setNeedsDisplay()
&gt; &gt; +{
&gt; &gt; +    // TODO(vangelis): implement
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +
&gt; 
&gt; An unnecessary blank line.
&gt; 

Done.

&gt; &gt; +    WebFrameImpl* webframe = mainFrameImpl();
&gt; &gt; +    if (webframe) {
&gt; &gt; +        FrameView* view = webframe-&gt;frameView();
&gt; &gt; +        if (view) {
&gt; 
&gt; I think WebKit tends to like the following idiom:
&gt; 
&gt;     if (WebFrameImpl* webframe = mainFrameImpl()) {
&gt; 

Done.

&gt; &gt; +            LayerSkia* rootLayer = m_layerRenderer-&gt;rootLayer();
&gt; &gt; +            if (rootLayer) {
&gt; 
&gt; Ditto.
&gt; 

Done.

&gt; &gt; +    WebFrameImpl* webframe = mainFrameImpl();
&gt; &gt; +    if (webframe) {
&gt; &gt; +        FrameView* view = webframe-&gt;frameView();
&gt; &gt; +        if (view) {
&gt; 
&gt; Ditto.
&gt; 

Done.

&gt; &gt; +    bool isAcceleratedCompositing() { return m_isAcceleratedCompositing; }
&gt; 
&gt; I think this can be a const method.


Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196249</commentid>
    <comment_count>10</comment_count>
      <attachid>50059</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-04 15:37:03 -0800</bug_when>
    <thetext>Created attachment 50059
Fixed previous patch per reviewer&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196251</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-04 15:42:19 -0800</bug_when>
    <thetext>Attachment 50059 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/platform/graphics/skia/LayerSkia.h:75:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:78:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:81:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:93:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:96:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:99:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:102:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:108:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:122:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:125:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:128:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:132:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:153:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.cpp:236:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 14 in 16 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198198</commentid>
    <comment_count>12</comment_count>
      <attachid>50059</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-03-10 10:30:22 -0800</bug_when>
    <thetext>Comment on attachment 50059
Fixed previous patch per reviewer&apos;s comments

In general this looks pretty good. I guess this is one of your initial patches because a lot of my comments are style related (though some have a little more substance).

If you stick to addressing the comments (everywhere that they apply -- sometimes I only noted the first instance of an issue) and not adding new functionality the next review round should go pretty fast.

Also, if you don&apos;t understnad any of my comment or are unsure how to apply them in the future, please let me know.

Thanks!

&gt; Index: WebCore/ChangeLog
&gt; +2010-03-02  Vangelis Kokkevis  &lt;vangelis@chromium.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Implement s/w composited graphics layers in Chromium using the Skia library
s/w -&gt; software
Please add a period at the end.

&gt; +        https://bugs.webkit.org/show_bug.cgi?id=35557
&gt; +        This is an initial step in the implementation. Layer compositing is functioning
&gt; +        but not optimized in any way. Subesquent check-ins will be necessary to finetune
&gt; +        it.
&gt; +
&gt; +        No new tests. (OOPS!)

Either add layout tests or explain why they aren&apos;t necessary at this point.

For example, if no new functionality is exposed to web pages/js, then no new tests are possible. (which would result in adding something like this to the ChangeLog &quot;No new exposed functionality so no new tests.&quot;)

&gt; +
&gt; +        * WebCore.gypi:
&gt; +          Added new source files to the chromium build
&gt; +        * platform/graphics/GraphicsLayer.h:
&gt; +          Added necessary typedef&apos;s and forward declarations for CHROMIUM
s/CHROMIUM/Chromium./

&gt; +          Declaration and implementation of the Skia-based s/w compositor.
s/w -&gt; software


&gt; Index: WebCore/platform/graphics/skia/GraphicsLayerSkia.cpp
&gt; +/*
&gt; + * Copyright (c) 2010, Google Inc. All rights reserved.

Ideally a capital C and no comma after the year. (The same comment for all copyright headers.)

&gt; + * Copyright (C) 2009 Apple Inc. All rights reserved.

You kept the Apply copyright line but changed the license text. If you&apos;re copying that other code (which I can see is the case), it seems most appropriate to keep the original license text from the other file.

&gt; +/** FIXME(vangelis)

s/FIXME(vangelis)/TODO/

&gt; + * This file borrows code heavily from platform/graphics/win/GraphicsLayerCACF.cpp
&gt; + * (and hence it includes both copyrights)
&gt; + * Ideally the common code (e.g. the code that keeps track of the layer hierarchy
&gt; + * should be kept separate and shared between platforms.

Why not do this? (If you don&apos;t do it, it will likely not happen.) Of course, it may not make sense for various reasons as well, but this comment implies that it does make sense.

&gt; +using namespace std;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +static void setLayerBorderColor(LayerSkia* layer, const Color&amp; color)

Since layer cannot be 0, why not make this take a &quot;LayerSkia&amp;&quot;? (Ditto for the other functions below.)


&gt; +static void clearBorderColor(LayerSkia* layer)
&gt; +{
&gt; +    layer-&gt;setBorderColor(Color(0, 0, 0, 0));
&gt; +}

&gt; +static void clearLayerBackgroundColor(LayerSkia* layer)
&gt; +{
&gt; +    layer-&gt;setBackgroundColor(0);

For some reason the asymmetry of this (when I compare it to the clearBorderColor method) bothers me. Is it possible to make clearBorderColor just do &quot;layer-&gt;setBorderColor(0);&quot;

&gt; +GraphicsLayerSkia::~GraphicsLayerSkia()
&gt; +{
&gt; +    // clean up the Skia layer
&quot;// Clean up Skia layer.&quot;

Add a capital letter and a period.

&gt; +void GraphicsLayerSkia::setTransform(const TransformationMatrix&amp; t)

Use transform instead of &quot;t&quot;. (Avoid abbreviations in WK code.)

&gt; +void GraphicsLayerSkia::setChildrenTransform(const TransformationMatrix&amp; t)

Use childrenTransform instead of &quot;t&quot;. (Avoid abbreviations in WK code.)

&gt; +
&gt; +void GraphicsLayerSkia::setContentsToImage(Image* image)
&gt; +{
&gt; +    // FIXME(vangelis): Implement

s/FIXME(vangelis)/TODO/ everywhere

&gt; +GraphicsLayer::CompositingCoordinatesOrientation GraphicsLayerSkia::defaultContentsOrientation() const
&gt; +{
&gt; +    return CompositingCoordinatesTopDown;
&gt; +}

What is the point of this method since it always returns the same value (and isn&apos;t virtual). Other code that branches based on the return value will only go down on path.

&gt; +void GraphicsLayerSkia::updateSublayerList()
&gt; +{
...
&gt; +        newSublayers.append(m_layer.get());
&gt; +    } else if (m_contentsLayer) {
&gt; +        // FIXME: add the contents layer in the correct order with negative z-order children.

s/FIXME/TODO/


&gt; +void GraphicsLayerSkia::updateLayerPosition()
&gt; +{
&gt; +    // Position is offset on the layer by the layer anchor point.
&gt; +    SkPoint posPoint;

Why not just call this layerPosition (instead of using an abbreviation &quot;pos&quot; which is discouraged in WK code)?

&gt; +    posPoint.set(m_position.x() + m_anchorPoint.x() * m_size.width(),
&gt; +                 m_position.y() + m_anchorPoint.y() * m_size.height());
&gt; +
&gt; +    primaryLayer()-&gt;setPosition(posPoint);
&gt; +}




&gt; Index: WebCore/platform/graphics/skia/GraphicsLayerSkia.h
&gt; +/*
&gt; + * Copyright (c) 2010, Google Inc. All rights reserved.
&gt; + * Copyright (C) 2009 Apple Inc. All rights reserved.

Same comments as before.

&gt; +#include &quot;GraphicsContext.h&quot;
                               ^^^^ odd character here.

&gt; +#include &quot;GraphicsLayer.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +class LayerSkia;
&gt; +
&gt; +class GraphicsLayerSkia : public GraphicsLayer {
&gt; +public:
&gt; +
No blank line here.

&gt; +    GraphicsLayerSkia(GraphicsLayerClient*);
&gt; +    virtual ~GraphicsLayerSkia();
&gt; +
&gt; +    virtual void setName(const String&amp; inName);

It doesn&apos;t look like &quot;inName&quot; adds any information. I&apos;d suggest removing the param name here.

&gt; +
&gt; +    // for hosting this GraphicsLayer in a native layer hierarchy
&gt; +    virtual NativeLayer nativeLayer() const;
&gt; +
&gt; +    virtual bool setChildren(const Vector&lt;GraphicsLayer*&gt;&amp;);
&gt; +    virtual void addChild(GraphicsLayer *layer);

layer adds no information. Please remove it.

Also the * is in the wrong place. It should be next to the type instead of the declared item.

These comments apply in other several places too in this header file.


&gt; +#endif // GraphicsLayerSkia_h_

This doesn&apos;t match the define above (and you don&apos;t even need to do this comment anyway).

&gt; Index: WebCore/platform/graphics/skia/LayerRendererSkia.cpp
&gt; +/*
&gt; + * Copyright (c) 2010, Google Inc. All rights reserved.

Same comment as before (and all other copyright headers).

&gt; Index: WebCore/platform/graphics/skia/LayerRendererSkia.h

&gt; +namespace WebCore {
&gt; +
&gt; +class LayerRendererSkia : public Noncopyable {
&gt; +public:
&gt; +    static PassOwnPtr&lt;LayerRendererSkia&gt; create();
&gt; +
&gt; +    LayerRendererSkia();
&gt; +    ~LayerRendererSkia();
&gt; +
&gt; +    void drawLayersInCanvas(skia::PlatformCanvas* canvas, SkRect clipRect);

No need for &quot;canvas&quot; param name here.

&gt; +    void setRootLayer(LayerSkia* layer) { m_rootLayer = layer; }

LayerSkia* should be a PassRefPtr&lt;LayerSkia&gt;

&gt; +    void setScrollFrame(SkIRect&amp; scrollFrame) { m_scrollFrame = scrollFrame; }
&gt; +
&gt; +private:
&gt; +    void drawLayerInCanvasRecursive(skia::PlatformCanvas* canvas, LayerSkia* layer, float opacity);

No need for &quot;canvas&quot; or &quot;layer&quot;.

&gt; +    void updateLayerContentsRecursive(LayerSkia* layer);

No need for &quot;layer&quot;.

&gt; +#endif // WKCACFLayer_h

I don&apos;t think this comment is correct.

&gt; Index: WebCore/platform/graphics/skia/LayerSkia.cpp


&gt; +void LayerSkia::updateGraphicsContext(const SkIRect&amp; rect)
&gt; +{
&gt; +    // Create new canvas and context. OwnPtr takes care of freeing up
&gt; +    // the old ones.
&gt; +    m_canvas = new skia::PlatformCanvas(rect.width(), rect.height(), false);
&gt; +    m_skiaContext = new PlatformContextSkia(m_canvas.get());
&gt; +
&gt; +    // This is needed to get text to show up correctly.  Without it,

One space after &quot;.&quot; in comments.

&gt; +    // Backing store a layer could be different than then layer&apos;s bounds.

I don&apos;t understand this sentence.


&gt; +void LayerSkia::setNeedsCommit()
&gt; +{
&gt; +    // Call notifySyncRequired(), which in this implementation plumbs through to
&gt; +    // call setRootLayerNeedsDisplay() on the WebView, which causes the CACFRenderer

Does your implementation use CACFRenderer? Also this comment seems a bit redundant with the code.
It sounds like it could be simplified to be &quot;Make CACFRenderer render a frame.&quot;

&gt; +void LayerSkia::replaceSublayer(LayerSkia* reference, PassRefPtr&lt;LayerSkia&gt; newLayer)
&gt; +{
&gt; +    ASSERT_ARG(reference, reference);
&gt; +    ASSERT_ARG(reference, reference-&gt;superlayer() == this);
&gt; +
&gt; +    if (reference == newLayer)
&gt; +        return;
&gt; +
&gt; +    if (!newLayer) {
&gt; +        removeSublayer(reference);
&gt; +        return;
&gt; +    }
&gt; +
&gt; +    newLayer-&gt;removeFromSuperlayer();
&gt; +
&gt; +    int referenceIndex = indexOfSublayer(reference);
&gt; +    ASSERT(referenceIndex != -1);
&gt; +    if (referenceIndex == -1)
&gt; +        return;

Why assert and check in an if. Either if it possible or it shouldn&apos;t happen ever. Which one?
Also, why doesn&apos;t this insert the newLayer just because the reference wasn&apos;t a sublayer?

&gt; +
&gt; +    reference-&gt;removeFromSuperlayer();

Why call &quot;reference-&gt;removeFromSuperlayer();&quot; here but &quot;removeSublayer(reference);&quot; above? (They look pretty equivalent anyway. If you change these to be the same, I think the code can be condensed slightly by having only one call to this function.)

&gt; +    insertSublayer(newLayer, referenceIndex);

&gt; +}
&gt; +
&gt; +void LayerSkia::removeFromSuperlayer()
&gt; +{
&gt; +    LayerSkia* superlayer = this-&gt;superlayer();
&gt; +    if (!superlayer)
&gt; +        return;
&gt; +
&gt; +    superlayer-&gt;removeSublayer(this);
&gt; +    superlayer-&gt;setNeedsCommit();

Why does this call setNeedsCommit on the superlayer? It seems like removeSublayer should do this if it is needed (just like LayerSkia::removeSublayer does below).

&gt; +void LayerSkia::setBounds(const SkIRect&amp; rect)
&gt; +{
&gt; +    if (rect == m_bounds)
&gt; +        return;
&gt; +
&gt; +    m_bounds = rect;
&gt; +
&gt; +    // Re-create the canvas and associated contexts.
&gt; +    updateGraphicsContext(m_bounds);
&gt; +
&gt; +    setNeedsCommit();
&gt; +}
&gt; +
&gt; +void LayerSkia::setFrame(const SkRect&amp; rect)
&gt; +{

Why doesn&apos;t this check to see if the frame is already rect and just return like what happens in so many of these other methods?

&gt; +    m_frame = rect;
&gt; +    setNeedsCommit();
&gt; +}
&gt; +


&gt; Index: WebCore/platform/graphics/skia/LayerSkia.h
&gt; +    // Returns the index of the passed layer in this layer&apos;s sublayers list
&gt; +    // or -1 if not found
Add a period. Also the fact that it returns the index of the passed in layer is indicated
by the name. The comment at most needs to mention the -1. something like
&quot;If the sublayer isn&apos;t found, returns -1.&quot;
&gt; +    int indexOfSublayer(const LayerSkia*);
&gt; +
&gt; +    // This should only be called from removeFromSuperlayer.

In general these comments can go out of date so no need to put them in there. Better to put in comments about when it should be called (if any comment is needed).

&gt; +    void removeSublayer(LayerSkia*);
&gt; +
&gt; +    // Re-created the canvas and graphics context.  This method

One space after periods in comments.


&gt; +    Vector&lt;RefPtr&lt;LayerSkia&gt; &gt; m_sublayers;
&gt; +    LayerSkia* m_superlayer;
&gt; +
&gt; +    bool m_needsDisplayOnBoundsChange;
&gt; +    GraphicsLayerSkia* m_owner;
&gt; +
&gt; +    OwnPtr&lt;skia::PlatformCanvas&gt; m_canvas;
&gt; +    OwnPtr&lt;PlatformContextSkia&gt; m_skiaContext;
&gt; +    OwnPtr&lt;GraphicsContext&gt; m_graphicsContext;
&gt; +    Color m_borderColor;
&gt; +    float m_borderWidth;
&gt; +
&gt; +    LayerType m_layerType;
&gt; +
&gt; +    SkIRect m_bounds;
&gt; +    SkIRect m_backingStoreRect;
&gt; +    SkPoint m_position;
&gt; +    SkPoint m_anchorPoint;
&gt; +    float m_anchorPointZ;
&gt; +    Color m_backgroundColor;
&gt; +    bool m_clearsContext;
&gt; +    bool m_doubleSided;
&gt; +    uint32_t m_edgeAntialiasingMask;
&gt; +    SkRect m_frame;
&gt; +    bool m_hidden;
&gt; +    bool m_masksToBounds;
&gt; +    ContentsGravityType m_contentsGravity;
&gt; +    float m_opacity;
&gt; +    bool m_opaque;
&gt; +    float m_zPosition;
&gt; +    bool m_geometryFlipped;
&gt; +    String m_name;
&gt; +
&gt; +    SkMatrix m_transform;
&gt; +    SkMatrix m_sublayerTransform;

Have you considered arranging these variables to minimize padding in the structure?

&gt; +#endif // WKCACFLayer_h
Incorrect comment.

&gt; Index: WebKit/chromium/ChangeLog

&gt; Index: WebKit/chromium/src/ChromeClientImpl.h

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    // Pass 0 as the GraphicsLayer to detatch the root layer.
&gt; +    virtual void attachRootGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*);

It would be nice to put a blank line here (since ou have little comments for each method, the 
blank lines will allow flks to find the next function quicker).

&gt; +    // Sets a flag to specify that the next time content is drawn to the window,
&gt; +    // the changes appear on the screen in synchrony with updates to GraphicsLayers.
&gt; +    virtual void setNeedsOneShotDrawingSynchronization() { }
&gt; +    // Sets a flag to specify that the view needs to be updated, so we need
&gt; +    // to do an eager layout before the drawing.
&gt; +    virtual void scheduleCompositingLayerSync();
&gt; +#endif

&gt; Index: WebKit/chromium/src/WebViewImpl.cpp

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +#include &quot;webkit/glue/webkit_glue.h&quot;

I&apos;m pretty sure you shouldn&apos;t be using glue in this file. Does any other file in WebKit/chromium/src use it?

&gt; +#if WEBKIT_USING_SKIA
&gt; +#include &quot;skia/LayerSkia.h&quot;
&gt; +#endif
&gt; +#endif

See comments in WebKit/chromium/src/WebViewImpl.h.


&gt;  void WebViewImpl::paint(WebCanvas* canvas, const WebRect&amp; rect)
&gt;  {
&gt; +        // Composite everything into the canvas that&apos;s passed to us.
&gt; +        SkIRect canvasIRect;
&gt; +        canvasIRect.set(rect.x, rect.y, rect.x+rect.width, rect.y+rect.height);

Put spaces around +

&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +void WebViewImpl::setRootGraphicsLayer(WebCore::PlatformLayer* layer)
&gt; +{
&gt; +    setAcceleratedCompositing(layer ? true : false);

What about this:
    setAcceleratedCompositing(layer);
?

&gt; +    if (m_layerRenderer)
&gt; +        m_layerRenderer-&gt;setRootLayer(layer);
&gt; +}
&gt; +

&gt; +void WebViewImpl::updateRootLayerContents(const WebRect&amp; rect)
&gt; +{
&gt; +    if (!isAcceleratedCompositing())
&gt; +        return;
&gt; +
&gt; +    if (WebFrameImpl* webframe = mainFrameImpl()) {
Please consider a fail fast approach.

WebFrameImpl* webframe = mainFrameImpl();
if (!webframe)
    return;
etc.

&gt; +        if (FrameView* view = webframe-&gt;frameView()) {
&gt; +            WebRect viewRect = view-&gt;frameRect();
&gt; +
&gt; +            SkIRect scrollFrame;
&gt; +            scrollFrame.set(view-&gt;scrollX(), view-&gt;scrollY(), view-&gt;layoutWidth()+view-&gt;scrollX(), view-&gt;layoutHeight()+view-&gt;scrollY());

Put in spaces around +

&gt; +            m_layerRenderer-&gt;setScrollFrame(scrollFrame);
&gt; +            if (LayerSkia* rootLayer = m_layerRenderer-&gt;rootLayer()) {
&gt; +                SkIRect rootLayerBounds;
&gt; +                IntRect visibleRect = view-&gt;visibleContentRect(true);
&gt; +
&gt; +                // Set the backing store size used by the root layer to be the size of the visible
&gt; +                // area.  Note that the root layer bounds could be larger than the backing store size

Single space after . in comments.
Also, there should be a comma after size.

&gt; +                // but there&apos;s no reason to waste memory by allocating backing store larger than the
&gt; +                // visible portion.
&gt; +                rootLayerBounds.set(0, 0, visibleRect.width(), visibleRect.height());
&gt; +                rootLayer-&gt;setBackingStoreRect(rootLayerBounds);
&gt; +                GraphicsContext* rootLayerContext = rootLayer-&gt;graphicsContext();
&gt; +                rootLayerContext-&gt;save();
&gt; +
&gt; +                webframe-&gt;paintWithContext(*(rootLayer-&gt;graphicsContext()), rect);
&gt; +                rootLayerContext-&gt;restore();
&gt; +            }
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +void WebViewImpl::setRootLayerNeedsDisplay()
&gt; +{
&gt; +    // FIXME(vangelis): For now we&apos;re posting a repaint event for the entire page
&gt; +    //                 which is an overkill.

I wouldn&apos;t suggest trying to align this wrapping part of the comment, but it looks like it is attempted but doesn&apos;t align. You could simply not even do a line break here. (WK doesn&apos;t have an 80 column rule.)


&gt; Index: WebKit/chromium/src/WebViewImpl.h
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +#if WEBKIT_USING_SKIA

These if&apos;s should be in the header, so you should be able to just #include the header with the rest of them.

Also &quot;#if WEBKIT_USING_SKIA&quot; seems odd. It seems like it should be &quot;#if USE(SKIA)&quot;

&gt; +#include &quot;skia/LayerRendererSkia.h&quot;

WebKit code doesn&apos;t put path names in the #includes in general, so the &quot;skia/&quot; looks incorrect. Do you need to add some include paths?


&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    void setRootLayerNeedsDisplay();
&gt; +    void setRootGraphicsLayer(WebCore::PlatformLayer* layer);

No need for &quot;layer&quot; here.


&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    void setAcceleratedCompositing(bool);
&gt; +    bool isAcceleratedCompositing() const { return m_isAcceleratedCompositing; }
&gt; +    void updateRootLayerContents(const WebRect&amp; rect);

No need for &quot;rect&quot; here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198253</commentid>
    <comment_count>13</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-03-10 11:59:23 -0800</bug_when>
    <thetext>I made a mistake in my comments (when I said to use TODO). Use FIXME instead of TODO.

However, as I tried to mention, there should not be a name/email with the comment, so &quot;// FIXME(vangelis):&quot; should never appear in the patch. (The commit log will show who added the comment.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199958</commentid>
    <comment_count>14</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-15 19:21:54 -0700</bug_when>
    <thetext>Thanks very much for the review, David!  I think I&apos;ve addressed all your comments.

(In reply to comment #12)
&gt; (From update of attachment 50059 [details])
&gt; In general this looks pretty good. I guess this is one of your initial patches
&gt; because a lot of my comments are style related (though some have a little more
&gt; substance).
&gt; 
&gt; If you stick to addressing the comments (everywhere that they apply --
&gt; sometimes I only noted the first instance of an issue) and not adding new
&gt; functionality the next review round should go pretty fast.
&gt; 
&gt; Also, if you don&apos;t understnad any of my comment or are unsure how to apply them
&gt; in the future, please let me know.
&gt; 
&gt; Thanks!
&gt; 
&gt; &gt; Index: WebCore/ChangeLog
&gt; &gt; +2010-03-02  Vangelis Kokkevis  &lt;vangelis@chromium.org&gt;
&gt; &gt; +
&gt; &gt; +        Reviewed by NOBODY (OOPS!).
&gt; &gt; +
&gt; &gt; +        Implement s/w composited graphics layers in Chromium using the Skia library
&gt; s/w -&gt; software
&gt; Please add a period at the end.

Done

&gt; 
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=35557
&gt; &gt; +        This is an initial step in the implementation. Layer compositing is functioning
&gt; &gt; +        but not optimized in any way. Subesquent check-ins will be necessary to finetune
&gt; &gt; +        it.
&gt; &gt; +
&gt; &gt; +        No new tests. (OOPS!)
&gt; 
&gt; Either add layout tests or explain why they aren&apos;t necessary at this point.
&gt; 
&gt; For example, if no new functionality is exposed to web pages/js, then no new
&gt; tests are possible. (which would result in adding something like this to the
&gt; ChangeLog &quot;No new exposed functionality so no new tests.&quot;)
&gt; 

Done

&gt; &gt; +
&gt; &gt; +        * WebCore.gypi:
&gt; &gt; +          Added new source files to the chromium build
&gt; &gt; +        * platform/graphics/GraphicsLayer.h:
&gt; &gt; +          Added necessary typedef&apos;s and forward declarations for CHROMIUM
&gt; s/CHROMIUM/Chromium./
&gt; 

Done

&gt; &gt; +          Declaration and implementation of the Skia-based s/w compositor.
&gt; s/w -&gt; software
&gt; 
&gt; 

Done.

&gt; &gt; Index: WebCore/platform/graphics/skia/GraphicsLayerSkia.cpp
&gt; &gt; +/*
&gt; &gt; + * Copyright (c) 2010, Google Inc. All rights reserved.
&gt; 
&gt; Ideally a capital C and no comma after the year. (The same comment for all
&gt; copyright headers.)

Done.

&gt; 
&gt; &gt; + * Copyright (C) 2009 Apple Inc. All rights reserved.
&gt; 
&gt; You kept the Apply copyright line but changed the license text. If you&apos;re
&gt; copying that other code (which I can see is the case), it seems most
&gt; appropriate to keep the original license text from the other file.
&gt; 
&gt; &gt; +/** FIXME(vangelis)
&gt; 
&gt; s/FIXME(vangelis)/TODO/

Replaced all FIXME(vangelis) with FIXME.
Done.

&gt; 
&gt; &gt; + * This file borrows code heavily from platform/graphics/win/GraphicsLayerCACF.cpp
&gt; &gt; + * (and hence it includes both copyrights)
&gt; &gt; + * Ideally the common code (e.g. the code that keeps track of the layer hierarchy
&gt; &gt; + * should be kept separate and shared between platforms.
&gt; 
&gt; Why not do this? (If you don&apos;t do it, it will likely not happen.) Of course, it
&gt; may not make sense for various reasons as well, but this comment implies that
&gt; it does make sense.

I have no way of building Apple&apos;s code as they haven&apos;t yet checked in the binaries/headers for their windows implementation of Core Animation. I adjusted the comment accordingly.

&gt; 
&gt; &gt; +using namespace std;
&gt; &gt; +
&gt; &gt; +namespace WebCore {
&gt; &gt; +
&gt; &gt; +static void setLayerBorderColor(LayerSkia* layer, const Color&amp; color)
&gt; 
&gt; Since layer cannot be 0, why not make this take a &quot;LayerSkia&amp;&quot;? (Ditto for the
&gt; other functions below.)

Done.

&gt; 
&gt; 
&gt; &gt; +static void clearBorderColor(LayerSkia* layer)
&gt; &gt; +{
&gt; &gt; +    layer-&gt;setBorderColor(Color(0, 0, 0, 0));
&gt; &gt; +}
&gt; 
&gt; &gt; +static void clearLayerBackgroundColor(LayerSkia* layer)
&gt; &gt; +{
&gt; &gt; +    layer-&gt;setBackgroundColor(0);
&gt; 
&gt; For some reason the asymmetry of this (when I compare it to the
&gt; clearBorderColor method) bothers me. Is it possible to make clearBorderColor
&gt; just do &quot;layer-&gt;setBorderColor(0);&quot;

Done.

&gt; 
&gt; &gt; +GraphicsLayerSkia::~GraphicsLayerSkia()
&gt; &gt; +{
&gt; &gt; +    // clean up the Skia layer
&gt; &quot;// Clean up Skia layer.&quot;
&gt; 
&gt; Add a capital letter and a period.

Done.

&gt; 
&gt; &gt; +void GraphicsLayerSkia::setTransform(const TransformationMatrix&amp; t)
&gt; 
&gt; Use transform instead of &quot;t&quot;. (Avoid abbreviations in WK code.)

Done.

&gt; 
&gt; &gt; +void GraphicsLayerSkia::setChildrenTransform(const TransformationMatrix&amp; t)
&gt; 
&gt; Use childrenTransform instead of &quot;t&quot;. (Avoid abbreviations in WK code.)

Done.

&gt; 
&gt; &gt; +
&gt; &gt; +void GraphicsLayerSkia::setContentsToImage(Image* image)
&gt; &gt; +{
&gt; &gt; +    // FIXME(vangelis): Implement
&gt; 
&gt; s/FIXME(vangelis)/TODO/ everywhere

FIXME(vangelis) -&gt; FIXME
Done.

&gt; 
&gt; &gt; +GraphicsLayer::CompositingCoordinatesOrientation GraphicsLayerSkia::defaultContentsOrientation() const
&gt; &gt; +{
&gt; &gt; +    return CompositingCoordinatesTopDown;
&gt; &gt; +}
&gt; 
&gt; What is the point of this method since it always returns the same value (and
&gt; isn&apos;t virtual). Other code that branches based on the return value will only go
&gt; down on path.

I guess it could be overwritten by a derived class but since that&apos;s not expected I removed it altogether.
Done.

&gt; 
&gt; &gt; +void GraphicsLayerSkia::updateSublayerList()
&gt; &gt; +{
&gt; ...
&gt; &gt; +        newSublayers.append(m_layer.get());
&gt; &gt; +    } else if (m_contentsLayer) {
&gt; &gt; +        // FIXME: add the contents layer in the correct order with negative z-order children.
&gt; 
&gt; s/FIXME/TODO/
&gt; 
&gt; 
&gt; &gt; +void GraphicsLayerSkia::updateLayerPosition()
&gt; &gt; +{
&gt; &gt; +    // Position is offset on the layer by the layer anchor point.
&gt; &gt; +    SkPoint posPoint;
&gt; 
&gt; Why not just call this layerPosition (instead of using an abbreviation &quot;pos&quot;
&gt; which is discouraged in WK code)?

Done.

&gt; 
&gt; &gt; +    posPoint.set(m_position.x() + m_anchorPoint.x() * m_size.width(),
&gt; &gt; +                 m_position.y() + m_anchorPoint.y() * m_size.height());
&gt; &gt; +
&gt; &gt; +    primaryLayer()-&gt;setPosition(posPoint);
&gt; &gt; +}
&gt; 
&gt; 
&gt; 
&gt; 
&gt; &gt; Index: WebCore/platform/graphics/skia/GraphicsLayerSkia.h
&gt; &gt; +/*
&gt; &gt; + * Copyright (c) 2010, Google Inc. All rights reserved.
&gt; &gt; + * Copyright (C) 2009 Apple Inc. All rights reserved.
&gt; 
&gt; Same comments as before.
&gt; 
&gt; &gt; +#include &quot;GraphicsContext.h&quot;
&gt;                                ^^^^ odd character here.

Done.

&gt; 
&gt; &gt; +#include &quot;GraphicsLayer.h&quot;
&gt; &gt; +
&gt; &gt; +namespace WebCore {
&gt; &gt; +
&gt; &gt; +class LayerSkia;
&gt; &gt; +
&gt; &gt; +class GraphicsLayerSkia : public GraphicsLayer {
&gt; &gt; +public:
&gt; &gt; +
&gt; No blank line here.

Done.

&gt; 
&gt; &gt; +    GraphicsLayerSkia(GraphicsLayerClient*);
&gt; &gt; +    virtual ~GraphicsLayerSkia();
&gt; &gt; +
&gt; &gt; +    virtual void setName(const String&amp; inName);
&gt; 
&gt; It doesn&apos;t look like &quot;inName&quot; adds any information. I&apos;d suggest removing the
&gt; param name here.
&gt; 

Done.

&gt; &gt; +
&gt; &gt; +    // for hosting this GraphicsLayer in a native layer hierarchy
&gt; &gt; +    virtual NativeLayer nativeLayer() const;
&gt; &gt; +
&gt; &gt; +    virtual bool setChildren(const Vector&lt;GraphicsLayer*&gt;&amp;);
&gt; &gt; +    virtual void addChild(GraphicsLayer *layer);
&gt; 
&gt; layer adds no information. Please remove it.
&gt; 
&gt; Also the * is in the wrong place. It should be next to the type instead of the
&gt; declared item.
&gt; 
&gt; These comments apply in other several places too in this header file.
&gt; 

Done.

&gt; 
&gt; &gt; +#endif // GraphicsLayerSkia_h_
&gt; 
&gt; This doesn&apos;t match the define above (and you don&apos;t even need to do this comment
&gt; anyway).
&gt; 

Done.

&gt; &gt; Index: WebCore/platform/graphics/skia/LayerRendererSkia.cpp
&gt; &gt; +/*
&gt; &gt; + * Copyright (c) 2010, Google Inc. All rights reserved.
&gt; 
&gt; Same comment as before (and all other copyright headers).

Done.

&gt; 
&gt; &gt; Index: WebCore/platform/graphics/skia/LayerRendererSkia.h
&gt; 
&gt; &gt; +namespace WebCore {
&gt; &gt; +
&gt; &gt; +class LayerRendererSkia : public Noncopyable {
&gt; &gt; +public:
&gt; &gt; +    static PassOwnPtr&lt;LayerRendererSkia&gt; create();
&gt; &gt; +
&gt; &gt; +    LayerRendererSkia();
&gt; &gt; +    ~LayerRendererSkia();
&gt; &gt; +
&gt; &gt; +    void drawLayersInCanvas(skia::PlatformCanvas* canvas, SkRect clipRect);
&gt; 
&gt; No need for &quot;canvas&quot; param name here.
&gt; 

Done.

&gt; &gt; +    void setRootLayer(LayerSkia* layer) { m_rootLayer = layer; }
&gt; 
&gt; LayerSkia* should be a PassRefPtr&lt;LayerSkia&gt;
&gt; 

Done.

&gt; &gt; +    void setScrollFrame(SkIRect&amp; scrollFrame) { m_scrollFrame = scrollFrame; }
&gt; &gt; +
&gt; &gt; +private:
&gt; &gt; +    void drawLayerInCanvasRecursive(skia::PlatformCanvas* canvas, LayerSkia* layer, float opacity);
&gt; 
&gt; No need for &quot;canvas&quot; or &quot;layer&quot;.
&gt; 

Done.

&gt; &gt; +    void updateLayerContentsRecursive(LayerSkia* layer);
&gt; 
&gt; No need for &quot;layer&quot;.
&gt; 
&gt; &gt; +#endif // WKCACFLayer_h
&gt; 
&gt; I don&apos;t think this comment is correct.
&gt; 

Done.

&gt; &gt; Index: WebCore/platform/graphics/skia/LayerSkia.cpp
&gt; 
&gt; 
&gt; &gt; +void LayerSkia::updateGraphicsContext(const SkIRect&amp; rect)
&gt; &gt; +{
&gt; &gt; +    // Create new canvas and context. OwnPtr takes care of freeing up
&gt; &gt; +    // the old ones.
&gt; &gt; +    m_canvas = new skia::PlatformCanvas(rect.width(), rect.height(), false);
&gt; &gt; +    m_skiaContext = new PlatformContextSkia(m_canvas.get());
&gt; &gt; +
&gt; &gt; +    // This is needed to get text to show up correctly.  Without it,
&gt; 
&gt; One space after &quot;.&quot; in comments.

Done.

&gt; 
&gt; &gt; +    // Backing store a layer could be different than then layer&apos;s bounds.
&gt; 
&gt; I don&apos;t understand this sentence.
&gt; 

Me neither :)  Fixed.
Done.

&gt; 
&gt; &gt; +void LayerSkia::setNeedsCommit()
&gt; &gt; +{
&gt; &gt; +    // Call notifySyncRequired(), which in this implementation plumbs through to
&gt; &gt; +    // call setRootLayerNeedsDisplay() on the WebView, which causes the CACFRenderer
&gt; 
&gt; Does your implementation use CACFRenderer? Also this comment seems a bit
&gt; redundant with the code.
&gt; It sounds like it could be simplified to be &quot;Make CACFRenderer render a frame.&quot;

The comment actually explains the sequence of events that result in a frame
getting rendered so it&apos;s kind of useful. But you are right about the CACFRenderer bit which I changed it over to say LayerRendererSkia.

Done.

&gt; 
&gt; &gt; +void LayerSkia::replaceSublayer(LayerSkia* reference, PassRefPtr&lt;LayerSkia&gt; newLayer)
&gt; &gt; +{
&gt; &gt; +    ASSERT_ARG(reference, reference);
&gt; &gt; +    ASSERT_ARG(reference, reference-&gt;superlayer() == this);
&gt; &gt; +
&gt; &gt; +    if (reference == newLayer)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    if (!newLayer) {
&gt; &gt; +        removeSublayer(reference);
&gt; &gt; +        return;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    newLayer-&gt;removeFromSuperlayer();
&gt; &gt; +
&gt; &gt; +    int referenceIndex = indexOfSublayer(reference);
&gt; &gt; +    ASSERT(referenceIndex != -1);
&gt; &gt; +    if (referenceIndex == -1)
&gt; &gt; +        return;
&gt; 
&gt; Why assert and check in an if. Either if it possible or it shouldn&apos;t happen
&gt; ever. Which one?
&gt; Also, why doesn&apos;t this insert the newLayer just because the reference wasn&apos;t a
&gt; sublayer?
&gt; 
&gt; &gt; +
&gt; &gt; +    reference-&gt;removeFromSuperlayer();
&gt; 
&gt; Why call &quot;reference-&gt;removeFromSuperlayer();&quot; here but
&gt; &quot;removeSublayer(reference);&quot; above? (They look pretty equivalent anyway. If you
&gt; change these to be the same, I think the code can be condensed slightly by
&gt; having only one call to this function.)
&gt; 
&gt; &gt; +    insertSublayer(newLayer, referenceIndex);
&gt; 
&gt; &gt; +}

Actually this entire method wasn&apos;t getting used at all so I removed it... It was one of the ones that moved over from Apple&apos;s port.  Sorry you had to waste time on it.


&gt; &gt; +
&gt; &gt; +void LayerSkia::removeFromSuperlayer()
&gt; &gt; +{
&gt; &gt; +    LayerSkia* superlayer = this-&gt;superlayer();
&gt; &gt; +    if (!superlayer)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    superlayer-&gt;removeSublayer(this);
&gt; &gt; +    superlayer-&gt;setNeedsCommit();
&gt; 
&gt; Why does this call setNeedsCommit on the superlayer? It seems like
&gt; removeSublayer should do this if it is needed (just like
&gt; LayerSkia::removeSublayer does below).

You are right. 
Done.

&gt; 
&gt; &gt; +void LayerSkia::setBounds(const SkIRect&amp; rect)
&gt; &gt; +{
&gt; &gt; +    if (rect == m_bounds)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    m_bounds = rect;
&gt; &gt; +
&gt; &gt; +    // Re-create the canvas and associated contexts.
&gt; &gt; +    updateGraphicsContext(m_bounds);
&gt; &gt; +
&gt; &gt; +    setNeedsCommit();
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +void LayerSkia::setFrame(const SkRect&amp; rect)
&gt; &gt; +{
&gt; 
&gt; Why doesn&apos;t this check to see if the frame is already rect and just return like
&gt; what happens in so many of these other methods?
&gt; 

Good point!
Done.

&gt; &gt; +    m_frame = rect;
&gt; &gt; +    setNeedsCommit();
&gt; &gt; +}
&gt; &gt; +
&gt; 
&gt; 
&gt; &gt; Index: WebCore/platform/graphics/skia/LayerSkia.h
&gt; &gt; +    // Returns the index of the passed layer in this layer&apos;s sublayers list
&gt; &gt; +    // or -1 if not found
&gt; Add a period. Also the fact that it returns the index of the passed in layer is
&gt; indicated
&gt; by the name. The comment at most needs to mention the -1. something like
&gt; &quot;If the sublayer isn&apos;t found, returns -1.&quot;
&gt; &gt; +    int indexOfSublayer(const LayerSkia*);
&gt; &gt; +
&gt; &gt; +    // This should only be called from removeFromSuperlayer.
&gt; 
&gt; In general these comments can go out of date so no need to put them in there.
&gt; Better to put in comments about when it should be called (if any comment is
&gt; needed).
&gt; 

Done.

&gt; &gt; +    void removeSublayer(LayerSkia*);
&gt; &gt; +
&gt; &gt; +    // Re-created the canvas and graphics context.  This method
&gt; 
&gt; One space after periods in comments.
&gt; 

Done.

&gt; 
&gt; &gt; +    Vector&lt;RefPtr&lt;LayerSkia&gt; &gt; m_sublayers;
&gt; &gt; +    LayerSkia* m_superlayer;
&gt; &gt; +
&gt; &gt; +    bool m_needsDisplayOnBoundsChange;
&gt; &gt; +    GraphicsLayerSkia* m_owner;
&gt; &gt; +
&gt; &gt; +    OwnPtr&lt;skia::PlatformCanvas&gt; m_canvas;
&gt; &gt; +    OwnPtr&lt;PlatformContextSkia&gt; m_skiaContext;
&gt; &gt; +    OwnPtr&lt;GraphicsContext&gt; m_graphicsContext;
&gt; &gt; +    Color m_borderColor;
&gt; &gt; +    float m_borderWidth;
&gt; &gt; +
&gt; &gt; +    LayerType m_layerType;
&gt; &gt; +
&gt; &gt; +    SkIRect m_bounds;
&gt; &gt; +    SkIRect m_backingStoreRect;
&gt; &gt; +    SkPoint m_position;
&gt; &gt; +    SkPoint m_anchorPoint;
&gt; &gt; +    float m_anchorPointZ;
&gt; &gt; +    Color m_backgroundColor;
&gt; &gt; +    bool m_clearsContext;
&gt; &gt; +    bool m_doubleSided;
&gt; &gt; +    uint32_t m_edgeAntialiasingMask;
&gt; &gt; +    SkRect m_frame;
&gt; &gt; +    bool m_hidden;
&gt; &gt; +    bool m_masksToBounds;
&gt; &gt; +    ContentsGravityType m_contentsGravity;
&gt; &gt; +    float m_opacity;
&gt; &gt; +    bool m_opaque;
&gt; &gt; +    float m_zPosition;
&gt; &gt; +    bool m_geometryFlipped;
&gt; &gt; +    String m_name;
&gt; &gt; +
&gt; &gt; +    SkMatrix m_transform;
&gt; &gt; +    SkMatrix m_sublayerTransform;
&gt; 
&gt; Have you considered arranging these variables to minimize padding in the
&gt; structure?

Re-arranged them a bit to separate multi-byte entities from smaller ones.
Done.

&gt; 
&gt; &gt; +#endif // WKCACFLayer_h
&gt; Incorrect comment.
&gt; 

Done.

&gt; &gt; Index: WebKit/chromium/ChangeLog
&gt; 
&gt; &gt; Index: WebKit/chromium/src/ChromeClientImpl.h
&gt; 
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +    // Pass 0 as the GraphicsLayer to detatch the root layer.
&gt; &gt; +    virtual void attachRootGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*);
&gt; 
&gt; It would be nice to put a blank line here (since ou have little comments for
&gt; each method, the 
&gt; blank lines will allow flks to find the next function quicker).

Done.

&gt; 
&gt; &gt; +    // Sets a flag to specify that the next time content is drawn to the window,
&gt; &gt; +    // the changes appear on the screen in synchrony with updates to GraphicsLayers.
&gt; &gt; +    virtual void setNeedsOneShotDrawingSynchronization() { }
&gt; &gt; +    // Sets a flag to specify that the view needs to be updated, so we need
&gt; &gt; +    // to do an eager layout before the drawing.
&gt; &gt; +    virtual void scheduleCompositingLayerSync();
&gt; &gt; +#endif
&gt; 
&gt; &gt; Index: WebKit/chromium/src/WebViewImpl.cpp
&gt; 
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +#include &quot;webkit/glue/webkit_glue.h&quot;
&gt; 
&gt; I&apos;m pretty sure you shouldn&apos;t be using glue in this file. Does any other file
&gt; in WebKit/chromium/src use it?

Turns out that these includes aren&apos;t really needed in the .cpp file anyway so I removed them.
Done.

&gt; 
&gt; &gt; +#if WEBKIT_USING_SKIA
&gt; &gt; +#include &quot;skia/LayerSkia.h&quot;
&gt; &gt; +#endif
&gt; &gt; +#endif
&gt; 
&gt; See comments in WebKit/chromium/src/WebViewImpl.h.
&gt; 
&gt; 
&gt; &gt;  void WebViewImpl::paint(WebCanvas* canvas, const WebRect&amp; rect)
&gt; &gt;  {
&gt; &gt; +        // Composite everything into the canvas that&apos;s passed to us.
&gt; &gt; +        SkIRect canvasIRect;
&gt; &gt; +        canvasIRect.set(rect.x, rect.y, rect.x+rect.width, rect.y+rect.height);
&gt; 
&gt; Put spaces around +
&gt; 
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +void WebViewImpl::setRootGraphicsLayer(WebCore::PlatformLayer* layer)
&gt; &gt; +{
&gt; &gt; +    setAcceleratedCompositing(layer ? true : false);
&gt; 
&gt; What about this:
&gt;     setAcceleratedCompositing(layer);
&gt; ?

Maybe personal preference but I&apos;d rather pass a bool when a bool is expected.  Does it look too strange to you? 

&gt; 
&gt; &gt; +    if (m_layerRenderer)
&gt; &gt; +        m_layerRenderer-&gt;setRootLayer(layer);
&gt; &gt; +}
&gt; &gt; +
&gt; 
&gt; &gt; +void WebViewImpl::updateRootLayerContents(const WebRect&amp; rect)
&gt; &gt; +{
&gt; &gt; +    if (!isAcceleratedCompositing())
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    if (WebFrameImpl* webframe = mainFrameImpl()) {
&gt; Please consider a fail fast approach.
&gt; 
&gt; WebFrameImpl* webframe = mainFrameImpl();
&gt; if (!webframe)
&gt;     return;
&gt; etc.
&gt; 
Done.

&gt; &gt; +        if (FrameView* view = webframe-&gt;frameView()) {
&gt; &gt; +            WebRect viewRect = view-&gt;frameRect();
&gt; &gt; +
&gt; &gt; +            SkIRect scrollFrame;
&gt; &gt; +            scrollFrame.set(view-&gt;scrollX(), view-&gt;scrollY(), view-&gt;layoutWidth()+view-&gt;scrollX(), view-&gt;layoutHeight()+view-&gt;scrollY());
&gt; 
&gt; Put in spaces around +
&gt; 

Done.

&gt; &gt; +            m_layerRenderer-&gt;setScrollFrame(scrollFrame);
&gt; &gt; +            if (LayerSkia* rootLayer = m_layerRenderer-&gt;rootLayer()) {
&gt; &gt; +                SkIRect rootLayerBounds;
&gt; &gt; +                IntRect visibleRect = view-&gt;visibleContentRect(true);
&gt; &gt; +
&gt; &gt; +                // Set the backing store size used by the root layer to be the size of the visible
&gt; &gt; +                // area.  Note that the root layer bounds could be larger than the backing store size
&gt; 
&gt; Single space after . in comments.
&gt; Also, there should be a comma after size.

Done.
&gt; 
&gt; &gt; +                // but there&apos;s no reason to waste memory by allocating backing store larger than the
&gt; &gt; +                // visible portion.
&gt; &gt; +                rootLayerBounds.set(0, 0, visibleRect.width(), visibleRect.height());
&gt; &gt; +                rootLayer-&gt;setBackingStoreRect(rootLayerBounds);
&gt; &gt; +                GraphicsContext* rootLayerContext = rootLayer-&gt;graphicsContext();
&gt; &gt; +                rootLayerContext-&gt;save();
&gt; &gt; +
&gt; &gt; +                webframe-&gt;paintWithContext(*(rootLayer-&gt;graphicsContext()), rect);
&gt; &gt; +                rootLayerContext-&gt;restore();
&gt; &gt; +            }
&gt; &gt; +        }
&gt; &gt; +    }
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +void WebViewImpl::setRootLayerNeedsDisplay()
&gt; &gt; +{
&gt; &gt; +    // FIXME(vangelis): For now we&apos;re posting a repaint event for the entire page
&gt; &gt; +    //                 which is an overkill.
&gt; 
&gt; I wouldn&apos;t suggest trying to align this wrapping part of the comment, but it
&gt; looks like it is attempted but doesn&apos;t align. You could simply not even do a
&gt; line break here. (WK doesn&apos;t have an 80 column rule.)
&gt; 
Done.
&gt; 
&gt; &gt; Index: WebKit/chromium/src/WebViewImpl.h
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +#if WEBKIT_USING_SKIA
&gt; 
&gt; These if&apos;s should be in the header, so you should be able to just #include the
&gt; header with the rest of them.

I removed the unnecessary includes from the .cpp file
Done.

&gt; 
&gt; Also &quot;#if WEBKIT_USING_SKIA&quot; seems odd. It seems like it should be &quot;#if
&gt; USE(SKIA)&quot;

It seems to be used as such in a whole bunch of files.  I don&apos;t believe there&apos;s a macro for it. 

&gt; 
&gt; &gt; +#include &quot;skia/LayerRendererSkia.h&quot;
&gt; 
&gt; WebKit code doesn&apos;t put path names in the #includes in general, so the &quot;skia/&quot;
&gt; looks incorrect. Do you need to add some include paths?

Removed &quot;skia/&quot;.
Done

&gt; 
&gt; 
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +    void setRootLayerNeedsDisplay();
&gt; &gt; +    void setRootGraphicsLayer(WebCore::PlatformLayer* layer);
&gt; 
&gt; No need for &quot;layer&quot; here.
&gt; 

Done.

&gt; 
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +    void setAcceleratedCompositing(bool);
&gt; &gt; +    bool isAcceleratedCompositing() const { return m_isAcceleratedCompositing; }
&gt; &gt; +    void updateRootLayerContents(const WebRect&amp; rect);
&gt; 
&gt; No need for &quot;rect&quot; here.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199962</commentid>
    <comment_count>15</comment_count>
      <attachid>50753</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-15 19:27:23 -0700</bug_when>
    <thetext>Created attachment 50753
Patch addressing review comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200292</commentid>
    <comment_count>16</comment_count>
      <attachid>50753</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-03-16 10:51:29 -0700</bug_when>
    <thetext>Comment on attachment 50753
Patch addressing review comments

Adding the r? which I believe was left off by mistake.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200293</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-16 10:52:26 -0700</bug_when>
    <thetext>Attachment 50753 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/platform/graphics/skia/LayerSkia.h:74:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:77:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:80:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:83:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:86:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:92:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:95:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:98:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:101:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:107:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:121:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:124:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:127:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:131:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:152:  More than one command on the same line  [whitespace/newline] [4]
Total errors found: 15 in 16 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200542</commentid>
    <comment_count>18</comment_count>
      <attachid>50753</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-03-16 17:56:35 -0700</bug_when>
    <thetext>Comment on attachment 50753
Patch addressing review comments

Just a few more comments mostly nits. Almost done....


&gt; Index: WebCore/ChangeLog

&gt; +        but not optimized in any way. Subesquent check-ins will be necessary to finetune
s/finetune/fine tune/


&gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; .r56022
This shouldn&apos;t be here.


&gt; Index: WebCore/platform/graphics/skia/GraphicsLayerSkia.cpp
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + * Copyright (C) 2009 Apple Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions are
&gt; + * met:
&gt; + *
&gt; + *     * Redistributions of source code must retain the above copyright
&gt; + * notice, this list of conditions and the following disclaimer.
&gt; + *     * Redistributions in binary form must reproduce the above
&gt; + * copyright notice, this list of conditions and the following disclaimer
&gt; + * in the documentation and/or other materials provided with the
&gt; + * distribution.
&gt; + *     * Neither the name of Google Inc. nor the names of its
&gt; + * contributors may be used to endorse or promote products derived from
&gt; + * this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&gt; + * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
&gt; + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt; + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
&gt; + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&gt; + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
&gt; + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
&gt; + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
&gt; + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
&gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */

I don&apos;t think this license text is the text from GraphicsLayerCACF.cpp,
since you borrowed code heavily from that file, it seems that you should retain the original license.


&gt; +/** FIXME
&gt; + * This file borrows code heavily from platform/graphics/win/GraphicsLayerCACF.cpp
&gt; + * (and hence it includes both copyrights)
&gt; + * Ideally the common code (e.g. the code that keeps track of the layer hierarchy)
&gt; + * should be kept separate and shared between platforms. It would be a well worthwhile
&gt; + * effort once the Windows implementation (binaries and headers) of CoreAnimation is
&gt; + * checked in to the WebKit repository. Until then only Apple can make this happen.

Hmmm... I don&apos;t see what this comment accomplishes. Thus, I wonder why it is here.

Also, I really don&apos;t understand the comment. Right now, you have a bunch of code in here that is basically
the same as that in GraphicsLayerCACF.cpp (which is checked in), so why can&apos;t the code be consolidated by you?


&gt; Index: WebCore/platform/graphics/skia/GraphicsLayerSkia.h
&gt; +// FIXME: File heavily borrows from GraphicsLayerCACF.h.  See comment
&gt; +// at the top of GraphicsLayerSkia.cpp.

I don&apos;t think this comment is necessary. (If someone really wants to understand this code,
they&apos;ll likely look back at its history and see the other files checked in at the same time
and can find the comment in that other file.)

&gt; +    virtual void addChildAbove(GraphicsLayer* layer, GraphicsLayer *sibling);

&quot;layer&quot; as a parameter name adds no information, so please remove it.
&quot;GraphicsLayer *sibling&quot; the * is in the wrong place.

See the next two methods as well (for &quot;layer&quot; and * placement).

&gt; +    virtual void addChildBelow(GraphicsLayer* layer, GraphicsLayer *sibling);
&gt; +    virtual bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer *newChild);


&gt; +    virtual void setPosition(const FloatPoint&amp; inPoint);
&gt; +    virtual void setAnchorPoint(const FloatPoint3D&amp; inPoint);
&gt; +    virtual void setSize(const FloatSize&amp; inSize);

I don&apos;t think any of these parameter names are adding information &quot;inPoint&quot;, &quot;inSize&quot; so they should be removed.

&gt; +    virtual void setOpacity(float opacity);

No need for the parameter name &quot;opacity&quot; asi ti adds no information. Since the function name is &quot;setOpacity&quot; and the method only takes one parameter, the param must be the opacity.

&gt; Index: WebCore/platform/graphics/skia/LayerRendererSkia.cpp

&gt; +void LayerRendererSkia::drawLayerInCanvasRecursive(skia::PlatformCanvas* canvas, LayerSkia* layer, float opacity)
&gt; +{
...
&gt; +    // The position we get is for the center of the layer but
&gt; +    // drawBitmap starts at the upper-left corner and therefore
&gt; +    // we need to adjust our transform.

There should be commas before &quot;but&quot; and &quot;and&quot;.



&gt; Index: WebCore/platform/graphics/skia/LayerRendererSkia.h

&gt; +
&gt; +private:
&gt; +    void drawLayerInCanvasRecursive(skia::PlatformCanvas*, LayerSkia*, float opacity);
&gt; +    void updateLayerContentsRecursive(LayerSkia* layer);

Remove param name &quot;layer&quot;.


&gt; Index: WebCore/platform/graphics/skia/LayerSkia.cpp

&gt; +    // The backing store a layer does not have to be the same size as the layer&apos;s bounds.

I can&apos;t parse this sentence.

&gt; +void LayerSkia::updateContents()
&gt; +{
&gt; +    RenderLayerBacking* backing = static_cast&lt;RenderLayerBacking*&gt;(m_owner-&gt;client());
&gt; +
&gt; +    if (backing &amp;&amp; !backing-&gt;paintingGoesToWindow())
&gt; +        m_owner-&gt;paintGraphicsLayerContents(*m_graphicsContext, IntRect(0, 0, m_bounds.width(), m_bounds.height()));
&gt; +
&gt; +    // Paint the debug border.
&gt; +    // FIXME: Add a flag to check if debug borders are used.
&gt; +    m_graphicsContext-&gt;setStrokeColor(m_borderColor, DeviceColorSpace);
&gt; +    m_graphicsContext-&gt;setStrokeThickness(m_borderWidth);
&gt; +    m_graphicsContext-&gt;drawLine(IntPoint(0, 0), IntPoint(m_bounds.width(), 0));
&gt; +    m_graphicsContext-&gt;drawLine(IntPoint(0, 0), IntPoint(0, m_bounds.height()));
&gt; +    m_graphicsContext-&gt;drawLine(IntPoint(m_bounds.width(), 0), IntPoint(m_bounds.width(), m_bounds.height()));
&gt; +    m_graphicsContext-&gt;drawLine(IntPoint(0, m_bounds.height()), IntPoint(m_bounds.width(), m_bounds.height()));
&gt; +}
&gt; +
&gt; +

extra blank line here.

&gt; +void LayerSkia::setNeedsDisplay()
&gt; +{
&gt; +    // FIXME: implement
&gt; +}
&gt; +
&gt; +

Extra blank line here.

&gt; +}
&gt; +
&gt; +#endif // USE(ACCELERATED_COMPOSITING)

&gt; Index: WebCore/platform/graphics/skia/LayerSkia.h
&gt; +    void addSublayer(PassRefPtr&lt;LayerSkia&gt; sublayer);

No need to say &quot;sublayer&quot; here since it is obvious based on the method name.

&gt; +    SkMatrix sublayerTransform() const { return m_sublayerTransform; }

Why isn&apos;t the return value &quot;const SkMatrix&amp;&quot;?

&gt; +    void setBackingStoreRect(const SkIRect&amp; rect);

No need for the param name &quot;rect&quot; here.

&gt; +    void updateGraphicsContext(const SkIRect&amp; rect);

No need for the param name &quot;rect&quot; here.

&gt; Index: WebKit/chromium/ChangeLog
&gt; +        * src/WebViewImpl.cpp:
&gt; +        (WebKit::WebViewImpl::WebViewImpl):
&gt; +        (WebKit::WebViewImpl::paint):
&gt; +        Modified method to handle the accelerated compositing path. Now, when doing accelerated compositing,
&gt; +        paint() results to repainting the contents of the root layer and then doing a composite operation.

s/to/in/

&gt; Index: WebKit/chromium/src/WebViewImpl.cpp
&gt; +
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    if (!isAcceleratedCompositing()) {
&gt; +#endif
&gt; +        WebFrameImpl* webframe = mainFrameImpl();
&gt; +        if (webframe)
&gt; +            webframe-&gt;paint(canvas, rect);
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +    } else {
&gt; +        // Draw the contents of the root layer

Please add a period.


&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +void WebViewImpl::setRootGraphicsLayer(WebCore::PlatformLayer* layer)
&gt; +{
&gt; +    setAcceleratedCompositing(layer ? true : false);

Everytime I see this, I think of 
  bool b = value;
  func(b ? true : false);

Of course, it isn&apos;t in the same league as some code that I&apos;ve seen that does if (b == true) (where b is a bool already).
I understand why you like it though so you can leave it as is.


&gt; +void WebViewImpl::updateRootLayerContents(const WebRect&amp; rect)
&gt; +{
...
&gt; +        // Set the backing store size used by the root layer to be the size of the visible
&gt; +        // area. Note that the root layer bounds could be larger than the backing store size

There should be a comma after size.


&gt; Index: WebKit/chromium/src/WebViewImpl.h
&gt; @@ -43,9 +43,16 @@
&gt;  #include &quot;ContextMenuClientImpl.h&quot;
&gt;  #include &quot;DragClientImpl.h&quot;
&gt;  #include &quot;EditorClientImpl.h&quot;
&gt; +#include &quot;GraphicsLayer.h&quot;
&gt;  #include &quot;InspectorClientImpl.h&quot;
&gt;  #include &quot;NotificationPresenterImpl.h&quot;
&gt;  
&gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; +#if WEBKIT_USING_SKIA

Typically headers have the if&apos;s inside of them, so you should be able to just #include the header and have no if&apos;s.

&gt; +#include &quot;LayerRendererSkia.h&quot;
&gt; +#endif
&gt; +#endif</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200562</commentid>
    <comment_count>19</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-16 18:50:59 -0700</bug_when>
    <thetext>(In reply to comment #18)
&gt; (From update of attachment 50753 [details])
&gt; Just a few more comments mostly nits. Almost done....
&gt; 
&gt; 
&gt; &gt; Index: WebCore/ChangeLog
&gt; 
&gt; &gt; +        but not optimized in any way. Subesquent check-ins will be necessary to finetune
&gt; s/finetune/fine tune/
&gt; 
Done.
&gt; 
&gt; &gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; .r56022
&gt; This shouldn&apos;t be here.
&gt; 
Done.
&gt; 
&gt; &gt; Index: WebCore/platform/graphics/skia/GraphicsLayerSkia.cpp
&gt; &gt; +/*
&gt; &gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; &gt; + * Copyright (C) 2009 Apple Inc. All rights reserved.
&gt; &gt; + *
&gt; &gt; + * Redistribution and use in source and binary forms, with or without
&gt; &gt; + * modification, are permitted provided that the following conditions are
&gt; &gt; + * met:
&gt; &gt; + *
&gt; &gt; + *     * Redistributions of source code must retain the above copyright
&gt; &gt; + * notice, this list of conditions and the following disclaimer.
&gt; &gt; + *     * Redistributions in binary form must reproduce the above
&gt; &gt; + * copyright notice, this list of conditions and the following disclaimer
&gt; &gt; + * in the documentation and/or other materials provided with the
&gt; &gt; + * distribution.
&gt; &gt; + *     * Neither the name of Google Inc. nor the names of its
&gt; &gt; + * contributors may be used to endorse or promote products derived from
&gt; &gt; + * this software without specific prior written permission.
&gt; &gt; + *
&gt; &gt; + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&gt; &gt; + * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
&gt; &gt; + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt; &gt; + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
&gt; &gt; + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&gt; &gt; + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
&gt; &gt; + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
&gt; &gt; + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
&gt; &gt; + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; &gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
&gt; &gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; &gt; + */
&gt; 
&gt; I don&apos;t think this license text is the text from GraphicsLayerCACF.cpp,
&gt; since you borrowed code heavily from that file, it seems that you should retain
&gt; the original license.

Actually our license file is a strict superset of Apple&apos;s (Apple&apos;s doesn&apos;t have the third item) so I&apos;m thinking it works better in this case.

&gt; 
&gt; 
&gt; &gt; +/** FIXME
&gt; &gt; + * This file borrows code heavily from platform/graphics/win/GraphicsLayerCACF.cpp
&gt; &gt; + * (and hence it includes both copyrights)
&gt; &gt; + * Ideally the common code (e.g. the code that keeps track of the layer hierarchy)
&gt; &gt; + * should be kept separate and shared between platforms. It would be a well worthwhile
&gt; &gt; + * effort once the Windows implementation (binaries and headers) of CoreAnimation is
&gt; &gt; + * checked in to the WebKit repository. Until then only Apple can make this happen.
&gt; 
&gt; Hmmm... I don&apos;t see what this comment accomplishes. Thus, I wonder why it is
&gt; here.
&gt; 
&gt; Also, I really don&apos;t understand the comment. Right now, you have a bunch of
&gt; code in here that is basically
&gt; the same as that in GraphicsLayerCACF.cpp (which is checked in), so why can&apos;t
&gt; the code be consolidated by you?
&gt; 

The issue is the following: GraphicsLayerCACF.cpp requires headers (and libaries) that haven&apos;t been checked in to the public WebKit tree so it&apos;s impossible for me to build it. If I were to refactor code to minimize duplication I would have no way of testing the CACF side.

&gt; 
&gt; &gt; Index: WebCore/platform/graphics/skia/GraphicsLayerSkia.h
&gt; &gt; +// FIXME: File heavily borrows from GraphicsLayerCACF.h.  See comment
&gt; &gt; +// at the top of GraphicsLayerSkia.cpp.
&gt; 
&gt; I don&apos;t think this comment is necessary. (If someone really wants to understand
&gt; this code,
&gt; they&apos;ll likely look back at its history and see the other files checked in at
&gt; the same time
&gt; and can find the comment in that other file.)
&gt; 

Removed the comment.  Also removed the Apple (C) since the file doesn&apos;t really contain any source code.

&gt; &gt; +    virtual void addChildAbove(GraphicsLayer* layer, GraphicsLayer *sibling);
&gt; 
&gt; &quot;layer&quot; as a parameter name adds no information, so please remove it.
&gt; &quot;GraphicsLayer *sibling&quot; the * is in the wrong place.
&gt; 
&gt; See the next two methods as well (for &quot;layer&quot; and * placement).
&gt; 
&gt; &gt; +    virtual void addChildBelow(GraphicsLayer* layer, GraphicsLayer *sibling);
&gt; &gt; +    virtual bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer *newChild);
&gt; 

Done.

&gt; 
&gt; &gt; +    virtual void setPosition(const FloatPoint&amp; inPoint);
&gt; &gt; +    virtual void setAnchorPoint(const FloatPoint3D&amp; inPoint);
&gt; &gt; +    virtual void setSize(const FloatSize&amp; inSize);
&gt; 
&gt; I don&apos;t think any of these parameter names are adding information &quot;inPoint&quot;,
&gt; &quot;inSize&quot; so they should be removed.
&gt; 

Done.

&gt; &gt; +    virtual void setOpacity(float opacity);
&gt; 
&gt; No need for the parameter name &quot;opacity&quot; asi ti adds no information. Since the
&gt; function name is &quot;setOpacity&quot; and the method only takes one parameter, the
&gt; param must be the opacity.
&gt; 

Done.

&gt; &gt; Index: WebCore/platform/graphics/skia/LayerRendererSkia.cpp
&gt; 
&gt; &gt; +void LayerRendererSkia::drawLayerInCanvasRecursive(skia::PlatformCanvas* canvas, LayerSkia* layer, float opacity)
&gt; &gt; +{
&gt; ...
&gt; &gt; +    // The position we get is for the center of the layer but
&gt; &gt; +    // drawBitmap starts at the upper-left corner and therefore
&gt; &gt; +    // we need to adjust our transform.
&gt; 
&gt; There should be commas before &quot;but&quot; and &quot;and&quot;.

Done.

&gt; 
&gt; 
&gt; 
&gt; &gt; Index: WebCore/platform/graphics/skia/LayerRendererSkia.h
&gt; 
&gt; &gt; +
&gt; &gt; +private:
&gt; &gt; +    void drawLayerInCanvasRecursive(skia::PlatformCanvas*, LayerSkia*, float opacity);
&gt; &gt; +    void updateLayerContentsRecursive(LayerSkia* layer);
&gt; 
&gt; Remove param name &quot;layer&quot;.
&gt; 

Done.

&gt; 
&gt; &gt; Index: WebCore/platform/graphics/skia/LayerSkia.cpp
&gt; 
&gt; &gt; +    // The backing store a layer does not have to be the same size as the layer&apos;s bounds.
&gt; 
&gt; I can&apos;t parse this sentence.

Any better now? 

&gt; 
&gt; &gt; +void LayerSkia::updateContents()
&gt; &gt; +{
&gt; &gt; +    RenderLayerBacking* backing = static_cast&lt;RenderLayerBacking*&gt;(m_owner-&gt;client());
&gt; &gt; +
&gt; &gt; +    if (backing &amp;&amp; !backing-&gt;paintingGoesToWindow())
&gt; &gt; +        m_owner-&gt;paintGraphicsLayerContents(*m_graphicsContext, IntRect(0, 0, m_bounds.width(), m_bounds.height()));
&gt; &gt; +
&gt; &gt; +    // Paint the debug border.
&gt; &gt; +    // FIXME: Add a flag to check if debug borders are used.
&gt; &gt; +    m_graphicsContext-&gt;setStrokeColor(m_borderColor, DeviceColorSpace);
&gt; &gt; +    m_graphicsContext-&gt;setStrokeThickness(m_borderWidth);
&gt; &gt; +    m_graphicsContext-&gt;drawLine(IntPoint(0, 0), IntPoint(m_bounds.width(), 0));
&gt; &gt; +    m_graphicsContext-&gt;drawLine(IntPoint(0, 0), IntPoint(0, m_bounds.height()));
&gt; &gt; +    m_graphicsContext-&gt;drawLine(IntPoint(m_bounds.width(), 0), IntPoint(m_bounds.width(), m_bounds.height()));
&gt; &gt; +    m_graphicsContext-&gt;drawLine(IntPoint(0, m_bounds.height()), IntPoint(m_bounds.width(), m_bounds.height()));
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +
&gt; 
&gt; extra blank line here.
&gt; 
&gt; &gt; +void LayerSkia::setNeedsDisplay()
&gt; &gt; +{
&gt; &gt; +    // FIXME: implement
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +
&gt; 
&gt; Extra blank line here.
&gt; 
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +#endif // USE(ACCELERATED_COMPOSITING)
&gt; 
&gt; &gt; Index: WebCore/platform/graphics/skia/LayerSkia.h
&gt; &gt; +    void addSublayer(PassRefPtr&lt;LayerSkia&gt; sublayer);
&gt; 
&gt; No need to say &quot;sublayer&quot; here since it is obvious based on the method name.

Done.

&gt; 
&gt; &gt; +    SkMatrix sublayerTransform() const { return m_sublayerTransform; }
&gt; 
&gt; Why isn&apos;t the return value &quot;const SkMatrix&amp;&quot;?

Done.

&gt; 
&gt; &gt; +    void setBackingStoreRect(const SkIRect&amp; rect);
&gt; 
&gt; No need for the param name &quot;rect&quot; here.

Done.

&gt; 
&gt; &gt; +    void updateGraphicsContext(const SkIRect&amp; rect);
&gt; 
&gt; No need for the param name &quot;rect&quot; here.

Done.

&gt; 
&gt; &gt; Index: WebKit/chromium/ChangeLog
&gt; &gt; +        * src/WebViewImpl.cpp:
&gt; &gt; +        (WebKit::WebViewImpl::WebViewImpl):
&gt; &gt; +        (WebKit::WebViewImpl::paint):
&gt; &gt; +        Modified method to handle the accelerated compositing path. Now, when doing accelerated compositing,
&gt; &gt; +        paint() results to repainting the contents of the root layer and then doing a composite operation.
&gt; 
&gt; s/to/in/

Done.

&gt; 
&gt; &gt; Index: WebKit/chromium/src/WebViewImpl.cpp
&gt; &gt; +
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +    if (!isAcceleratedCompositing()) {
&gt; &gt; +#endif
&gt; &gt; +        WebFrameImpl* webframe = mainFrameImpl();
&gt; &gt; +        if (webframe)
&gt; &gt; +            webframe-&gt;paint(canvas, rect);
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +    } else {
&gt; &gt; +        // Draw the contents of the root layer
&gt; 
&gt; Please add a period.

Done.

&gt; 
&gt; 
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +void WebViewImpl::setRootGraphicsLayer(WebCore::PlatformLayer* layer)
&gt; &gt; +{
&gt; &gt; +    setAcceleratedCompositing(layer ? true : false);
&gt; 
&gt; Everytime I see this, I think of 
&gt;   bool b = value;
&gt;   func(b ? true : false);
&gt; 
&gt; Of course, it isn&apos;t in the same league as some code that I&apos;ve seen that does if
&gt; (b == true) (where b is a bool already).
&gt; I understand why you like it though so you can leave it as is.
&gt; 
&gt; 
&gt; &gt; +void WebViewImpl::updateRootLayerContents(const WebRect&amp; rect)
&gt; &gt; +{
&gt; ...
&gt; &gt; +        // Set the backing store size used by the root layer to be the size of the visible
&gt; &gt; +        // area. Note that the root layer bounds could be larger than the backing store size
&gt; 
&gt; There should be a comma after size.
&gt; 
Done.

&gt; 
&gt; &gt; Index: WebKit/chromium/src/WebViewImpl.h
&gt; &gt; @@ -43,9 +43,16 @@
&gt; &gt;  #include &quot;ContextMenuClientImpl.h&quot;
&gt; &gt;  #include &quot;DragClientImpl.h&quot;
&gt; &gt;  #include &quot;EditorClientImpl.h&quot;
&gt; &gt; +#include &quot;GraphicsLayer.h&quot;
&gt; &gt;  #include &quot;InspectorClientImpl.h&quot;
&gt; &gt;  #include &quot;NotificationPresenterImpl.h&quot;
&gt; &gt;  
&gt; &gt; +#if USE(ACCELERATED_COMPOSITING)
&gt; &gt; +#if WEBKIT_USING_SKIA
&gt; 
&gt; Typically headers have the if&apos;s inside of them, so you should be able to just
&gt; #include the header and have no if&apos;s.

Unfortunately there&apos;s a decision to make here depending on whether we&apos;re using Skia (Win/Linux) or Cg (Mac) and whether we do software compositing or hardware. Over time this will turn into something like:

#if SOFTWARE_COMPOSITING
#if WEBKIT_USING_SKIA
#include &quot;LayerRendererSkia.h&quot;
#elif WEBKIT_USING_CG
#include &quot;LayerRendererCg.h&quot;
#else  // SOFTWARE_COMPOSITING
#include &quot;LayerRendererGL.h&quot;
#endif

so, while the inner #if isn&apos;t necessary for now, it will very soon. In any case, I&apos;m fine with removing it now and putting it back in when it&apos;s necessary.

Done.

&gt; 
&gt; &gt; +#include &quot;LayerRendererSkia.h&quot;
&gt; &gt; +#endif
&gt; &gt; +#endif</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200565</commentid>
    <comment_count>20</comment_count>
      <attachid>50866</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-16 18:55:02 -0700</bug_when>
    <thetext>Created attachment 50866
Patch addressing more recent review comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200568</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-16 19:01:24 -0700</bug_when>
    <thetext>Attachment 50866 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/platform/graphics/skia/LayerSkia.h:74:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:77:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:80:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:83:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:86:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:92:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:95:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:98:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:101:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:107:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:121:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:124:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:127:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:131:  More than one command on the same line  [whitespace/newline] [4]
WebCore/platform/graphics/skia/LayerSkia.h:152:  More than one command on the same line  [whitespace/newline] [4]
Total errors found: 15 in 16 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201177</commentid>
    <comment_count>22</comment_count>
      <attachid>50866</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-03-17 21:29:50 -0700</bug_when>
    <thetext>Comment on attachment 50866
Patch addressing more recent review comments

Rejecting patch 50866 from commit-queue.

Failed to run &quot;[&apos;WebKitTools/Scripts/run-webkit-tests&apos;, &apos;--no-launch-safari&apos;, &apos;--exit-after-n-failures=1&apos;, &apos;--quiet&apos;]&quot; exit_code: 1
Running build-dumprendertree
Compiling Java tests
make: Nothing to be done for `default&apos;.
Running tests from /Users/eseidel/Projects/CommitQueue/LayoutTests
Testing 12495 test cases.
fast/loader/api-test-new-window-data-load-base-url.html -&gt; failed

Exiting early after 1 failures. 7692 tests run.
128.80s total testing time

7691 test cases (99%) succeeded
1 test case (&lt;1%) had incorrect layout
3 test cases (&lt;1%) had stderr output

Full output: http://webkit-commit-queue.appspot.com/results/984004</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201196</commentid>
    <comment_count>23</comment_count>
      <attachid>50866</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-03-17 22:56:53 -0700</bug_when>
    <thetext>Comment on attachment 50866
Patch addressing more recent review comments

Lets try that again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201262</commentid>
    <comment_count>24</comment_count>
      <attachid>50866</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-03-18 06:13:56 -0700</bug_when>
    <thetext>Comment on attachment 50866
Patch addressing more recent review comments

Rejecting patch 50866 from commit-queue.

Failed to parse ChangeLog: /Users/eseidel/Projects/CommitQueue/WebKit/chromium/ChangeLog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201386</commentid>
    <comment_count>25</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-18 10:54:11 -0700</bug_when>
    <thetext>Hmm... I was in the ChangeLog parsing code last night.  I may have caused this regression.  I&apos;ll investigate.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201442</commentid>
    <comment_count>26</comment_count>
      <attachid>50866</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-18 11:41:38 -0700</bug_when>
    <thetext>Comment on attachment 50866
Patch addressing more recent review comments

Nope.  I didn&apos;t break anything.  Could the diff be malformed?

OR maybe svn-apply isn&apos;t handling it correctly.  Once it&apos;s applied the date line reads:
10-03-15  Vangelis Kokkevis  &lt;vangelis@chromium.org&gt;

which is definitely wrong (notice the missing 20 in 2010).

Dont&apos; diffs normally have a space between + and the actual content?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201444</commentid>
    <comment_count>27</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-18 11:41:56 -0700</bug_when>
    <thetext>If you believe this to be an svn-apply bug, please file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201452</commentid>
    <comment_count>28</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-03-18 11:56:27 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; If you believe this to be an svn-apply bug, please file.

The patch itself seems to be missing the 20, so it looks like it&apos;s applying correctly:

+
+#endif
Index: WebKit/chromium/ChangeLog
===================================================================
--- WebKit/chromium/ChangeLog	(revision 56022)
+++ WebKit/chromium/ChangeLog	(working copy)
@@ -1,3 +1,41 @@
+10-03-15  Vangelis Kokkevis  &lt;vangelis@chromium.org&gt;
+
+        Reviewed by NOBODY (OOPS!).
+
+        Adding support for the ACCELERATED_COMPOSITING render path to Chromium.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201455</commentid>
    <comment_count>29</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-18 12:02:37 -0700</bug_when>
    <thetext>Ah, I was looking at the wrong ChangeLog entry in the patch!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201462</commentid>
    <comment_count>30</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-18 12:24:46 -0700</bug_when>
    <thetext>I think my mistake was that I tried to merge the changelog manually as other check-ins took place while my CL was out for review.  Any suggestions on how to fix it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201466</commentid>
    <comment_count>31</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-18 12:31:10 -0700</bug_when>
    <thetext>resolve-ChangeLogs will take care of merging changelogs for you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201492</commentid>
    <comment_count>32</comment_count>
      <attachid>51078</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-18 12:57:55 -0700</bug_when>
    <thetext>Created attachment 51078
Fixed changelog entries so that the patch can be applied correctly (hopefully)

Is it enough to set commit-queue to &apos;+&apos; to get it back there?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201494</commentid>
    <comment_count>33</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-03-18 12:59:03 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; resolve-ChangeLogs will take care of merging changelogs for you.

Aha, thanks for the tip!
I just re-created the changelog files and uploaded a new CL. Not sure what else needs to happen to get it landed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201543</commentid>
    <comment_count>34</comment_count>
      <attachid>51078</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-03-18 13:56:20 -0700</bug_when>
    <thetext>Comment on attachment 51078
Fixed changelog entries so that the patch can be applied correctly (hopefully)

You can&apos;t land something with OOPS in it, but if there&apos;s a reviewer, the bot will fill in their name (in this case, me).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201545</commentid>
    <comment_count>35</comment_count>
      <attachid>51078</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-03-18 13:57:15 -0700</bug_when>
    <thetext>Comment on attachment 51078
Fixed changelog entries so that the patch can be applied correctly (hopefully)

Rejecting patch 51078 from commit-queue.

vangelis@chromium.org does not have committer permissions according to http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/committers.py.

- If you do not have committer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.

- If you have committer rights please correct the error in WebKitTools/Scripts/webkitpy/committers.py by adding yourself to the file (no review needed).  Due to bug 30084 the commit-queue will require a restart after your change.  Please contact eseidel@chromium.org to request a commit-queue restart.  After restart the commit-queue will correctly respect your committer rights.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201547</commentid>
    <comment_count>36</comment_count>
      <attachid>51078</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-03-18 14:02:06 -0700</bug_when>
    <thetext>Comment on attachment 51078
Fixed changelog entries so that the patch can be applied correctly (hopefully)

You also need to be a committer to commit code.  :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201706</commentid>
    <comment_count>37</comment_count>
      <attachid>51078</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-03-18 22:46:23 -0700</bug_when>
    <thetext>Comment on attachment 51078
Fixed changelog entries so that the patch can be applied correctly (hopefully)

Clearing flags on attachment: 51078

Committed r56212: &lt;http://trac.webkit.org/changeset/56212&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>201707</commentid>
    <comment_count>38</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-03-18 22:46:31 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202685</commentid>
    <comment_count>39</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-22 12:30:31 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; (From update of attachment 50866 [details])
&gt; Rejecting patch 50866 from commit-queue.
&gt; 
&gt; Failed to run &quot;[&apos;WebKitTools/Scripts/run-webkit-tests&apos;, &apos;--no-launch-safari&apos;,
&gt; &apos;--exit-after-n-failures=1&apos;, &apos;--quiet&apos;]&quot; exit_code: 1
&gt; Running build-dumprendertree
&gt; Compiling Java tests
&gt; make: Nothing to be done for `default&apos;.
&gt; Running tests from /Users/eseidel/Projects/CommitQueue/LayoutTests
&gt; Testing 12495 test cases.
&gt; fast/loader/api-test-new-window-data-load-base-url.html -&gt; failed

This was bug 35594.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202695</commentid>
    <comment_count>40</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-22 12:34:10 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; (From update of attachment 50866 [details])
&gt; Rejecting patch 50866 from commit-queue.
&gt; 
&gt; Failed to run &quot;[&apos;WebKitTools/Scripts/run-webkit-tests&apos;, &apos;--no-launch-safari&apos;,
&gt; &apos;--exit-after-n-failures=1&apos;, &apos;--quiet&apos;]&quot; exit_code: 1
&gt; Running build-dumprendertree
&gt; Compiling Java tests
&gt; make: Nothing to be done for `default&apos;.
&gt; Running tests from /Users/eseidel/Projects/CommitQueue/LayoutTests
&gt; Testing 12495 test cases.
&gt; fast/loader/api-test-new-window-data-load-base-url.html -&gt; failed

This was bug 35594.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49851</attachid>
            <date>2010-03-02 14:47:09 -0800</date>
            <delta_ts>2010-03-02 16:04:51 -0800</delta_ts>
            <desc>Proposed patch</desc>
            <filename>skiaCompositor.txt</filename>
            <type>text/plain</type>
            <size>65741</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMTAtMDMtMDIgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudCBzL3cgY29tcG9zaXRlZCBncmFwaGljcyBsYXllcnMgaW4gQ2hyb21p
dW0gdXNpbmcgdGhlIFNraWEgbGlicmFyeQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAgICAgVGhpcyBpcyBhbiBpbml0aWFsIHN0ZXAg
aW4gdGhlIGltcGxlbWVudGF0aW9uLiBMYXllciBjb21wb3NpdGluZyBpcyBmdW5jdGlvbmluZwor
ICAgICAgICBidXQgbm90IG9wdGltaXplZCBpbiBhbnkgd2F5LiBTdWJlc3F1ZW50IGNoZWNrLWlu
cyB3aWxsIGJlIG5lY2Vzc2FyeSB0byBmaW5ldHVuZQorICAgICAgICBpdC4KKworICAgICAgICBO
byBuZXcgdGVzdHMuIChPT1BTISkKKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAg
ICBBZGRlZCBuZXcgc291cmNlIGZpbGVzIHRvIHRoZSBjaHJvbWl1bSBidWlsZAorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaDoKKyAgICAgICAgICBBZGRlZCBuZWNl
c3NhcnkgdHlwZWRlZidzIGFuZCBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgQ0hST01JVU0KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmNwcDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5o
OiBBZGRlZC4KKyAgICAgICAgICBEZWNsYXJhdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhl
IHBsYXRmb3JtLXNwZWNpZmljIEdyYXBoaWNzTGF5ZXIgY2xhc3MuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuaDogQWRkZWQuCisgICAg
ICAgICAgRGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTa2lhLWJhc2VkIHMv
dyBjb21wb3NpdG9yLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lh
LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEu
aDogQWRkZWQuCisgICAgICAgICAgRGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIGEg
Y29tcG9zaXRhYmxlIGxheWVyIHRoYXQgdXNlcyBhIFNraWEgY2FudmFzCisgICAgICAgICAgZm9y
IGJhY2tpbmcgc3RvcmUuCisKIDIwMTAtMDMtMDIgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJDb3Jl
L1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNp
b24gNTU0MjgpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtMjE0
OSwxMCArMjE0OSwxNiBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0M0RTa2lhLmNwcCcsCisgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5jcHAnLAorICAgICAg
ICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuaCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwJywKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAnLAogICAgICAg
ICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW50UG9pbnRTa2lhLmNwcCcsCiAgICAgICAg
ICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbnRSZWN0U2tpYS5jcHAnLAorICAgICAgICAg
ICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuY3BwJywKKyAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmgnLAorICAg
ICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcCcsCisgICAgICAg
ICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaCcsCiAgICAgICAgICAgICAn
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJbWFnZVNraWEuY3BwJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL05hdGl2ZUltYWdlU2tpYS5oJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdGhTa2lhLmNwcCcsCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkocmV2aXNpb24gNTU0MjgpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAt
NjMsNiArNjMsMTIgQEAgdHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKIGNsYXNzIFFHcmFwaGlj
c0l0ZW07CiB0eXBlZGVmIFFHcmFwaGljc0l0ZW0gUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgUUdy
YXBoaWNzSXRlbSogTmF0aXZlTGF5ZXI7CisjZWxpZiBQTEFURk9STShDSFJPTUlVTSkKK25hbWVz
cGFjZSBXZWJDb3JlIHsKK2NsYXNzIExheWVyU2tpYTsKK3R5cGVkZWYgTGF5ZXJTa2lhIFBsYXRm
b3JtTGF5ZXI7Cit0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOworfQogI2Vsc2UKIHR5cGVkZWYg
dm9pZCogUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tp
YS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
cGhpY3NMYXllclNraWEuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU4NiBAQAorLyoKKyAq
IENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisvKiogVE9E
TyhWYW5nZWxpcykKKyAqIFRoaXMgZmlsZSBib3Jyb3dzIGNvZGUgaGVhdmlseSBmcm9tIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0xheWVyQ0FDRi5jcHAKKyAqIChhbmQgaGVuY2UgaXQg
aW5jbHVkZXMgYm90aCBjb3B5cmlnaHRzKQorICogSWRlYWxseSB0aGUgY29tbW9uIGNvZGUgKGUu
Zy4gdGhlIGNvZGUgdGhhdCBrZWVwcyB0cmFjayBvZiB0aGUgbGF5ZXIgaGllcmFyY2h5CisgKiBz
aG91bGQgYmUga2VwdCBzZXBhcmF0ZSBhbmQgc2hhcmVkIGJldHdlZW4gcGxhdGZvcm1zLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKworI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJTa2lhLmgiCisKKyNpbmNsdWRlICJDU3RyaW5n
LmgiCisjaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0Lmgi
CisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1
ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNsdWRlICJMYXllclNraWEuaCIKKyNpbmNsdWRlIDx3dGYv
Q3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvU3RyaW5nRXh0cmFzLmg+CisKK3VzaW5nIG5h
bWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworCitzdGF0aWMgdm9pZCBzZXRM
YXllckJvcmRlckNvbG9yKExheWVyU2tpYSogbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sK
KyAgICBsYXllci0+c2V0Qm9yZGVyQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVh
ckJvcmRlckNvbG9yKExheWVyU2tpYSogbGF5ZXIpCit7CisgICAgbGF5ZXItPnNldEJvcmRlckNv
bG9yKENvbG9yKDAsIDAsIDAsIDApKTsKK30KKworc3RhdGljIHZvaWQgc2V0TGF5ZXJCYWNrZ3Jv
dW5kQ29sb3IoTGF5ZXJTa2lhKiBsYXllciwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGxh
eWVyLT5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVhckxh
eWVyQmFja2dyb3VuZENvbG9yKExheWVyU2tpYSogbGF5ZXIpCit7CisgICAgbGF5ZXItPnNldEJh
Y2tncm91bmRDb2xvcigwKTsKK30KKworR3JhcGhpY3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGlu
YXRlc09yaWVudGF0aW9uIEdyYXBoaWNzTGF5ZXI6OmNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmll
bnRhdGlvbigpCit7CisgICAgcmV0dXJuIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNCb3R0b21VcDsK
K30KKworUGFzc093blB0cjxHcmFwaGljc0xheWVyPiBHcmFwaGljc0xheWVyOjpjcmVhdGUoR3Jh
cGhpY3NMYXllckNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcgR3JhcGhpY3NMYXll
clNraWEoY2xpZW50KTsKK30KKworR3JhcGhpY3NMYXllclNraWE6OkdyYXBoaWNzTGF5ZXJTa2lh
KEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkKKyAgICA6IEdyYXBoaWNzTGF5ZXIoY2xpZW50
KQorICAgICwgbV9jb250ZW50c0xheWVyUHVycG9zZShOb0NvbnRlbnRzTGF5ZXIpCisgICAgLCBt
X2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IoZmFsc2UpCit7CisgICAgbV9sYXllciA9
IExheWVyU2tpYTo6Y3JlYXRlKExheWVyU2tpYTo6TGF5ZXIsIHRoaXMpOworCisgICAgdXBkYXRl
RGVidWdJbmRpY2F0b3JzKCk7Cit9CisKK0dyYXBoaWNzTGF5ZXJTa2lhOjp+R3JhcGhpY3NMYXll
clNraWEoKQoreworICAgIC8vIGNsZWFuIHVwIHRoZSBTa2lhIGxheWVyCisgICAgaWYgKG1fbGF5
ZXIpCisgICAgICAgIG1fbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICBpZiAo
bV90cmFuc2Zvcm1MYXllcikKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+cmVtb3ZlRnJvbVN1
cGVybGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0TmFtZShjb25zdCBT
dHJpbmcmIGluTmFtZSkKK3sKKyAgICBTdHJpbmcgbmFtZSA9IFN0cmluZzo6Zm9ybWF0KCJHcmFw
aGljc0xheWVyU2tpYSglcCkgR3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhp
cykgKyBpbk5hbWU7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0TmFtZShuYW1lKTsKK30KKworTmF0
aXZlTGF5ZXIgR3JhcGhpY3NMYXllclNraWE6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9sYXllci5nZXQoKTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q2hp
bGRyZW4oY29uc3QgVmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiYgY2hpbGRyZW4pCit7CisgICAgYm9v
bCBjaGlsZHJlbkNoYW5nZWQgPSBHcmFwaGljc0xheWVyOjpzZXRDaGlsZHJlbihjaGlsZHJlbik7
CisgICAgLy8gRklYTUU6IEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuIGNhbGxzIGFkZENoaWxk
KCkgZm9yIGVhY2ggc3VibGF5ZXIsIHdoaWNoCisgICAgLy8gd2lsbCBlbmQgdXAgY2FsbGluZyB1
cGRhdGVTdWJsYXllckxpc3QoKSBOIHRpbWVzLgorICAgIGlmIChjaGlsZHJlbkNoYW5nZWQpCisg
ICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworCisgICAgcmV0dXJuIGNoaWxkcmVuQ2hhbmdl
ZDsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6YWRkQ2hpbGQoR3JhcGhpY3NMYXllciog
Y2hpbGRMYXllcikKK3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZChjaGlsZExheWVyKTsK
KyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6
YWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIGludCBpbmRleCkKK3sK
KyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEF0SW5kZXgoY2hpbGRMYXllciwgaW5kZXgpOwor
ICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjph
ZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNp
YmxpbmcpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRCZWxvdyhjaGlsZExheWVyLCBz
aWJsaW5nKTsKKyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xh
eWVyU2tpYTo6YWRkQ2hpbGRBYm92ZShHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGlj
c0xheWVyICpzaWJsaW5nKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQWJvdmUoY2hp
bGRMYXllciwgc2libGluZyk7CisgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK2Jvb2wg
R3JhcGhpY3NMYXllclNraWE6OnJlcGxhY2VDaGlsZChHcmFwaGljc0xheWVyKiBvbGRDaGlsZCwg
R3JhcGhpY3NMYXllciogbmV3Q2hpbGQpCit7CisgICAgaWYgKEdyYXBoaWNzTGF5ZXI6OnJlcGxh
Y2VDaGlsZChvbGRDaGlsZCwgbmV3Q2hpbGQpKSB7CisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlz
dCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBHcmFw
aGljc0xheWVyOjpyZW1vdmVGcm9tUGFyZW50KCk7CisgICAgbGF5ZXJGb3JTdXBlcmxheWVyKCkt
PnJlbW92ZUZyb21TdXBlcmxheWVyKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNl
dFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldFBvc2l0aW9uKHBvaW50KTsKKyAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclNraWE6OnNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYg
cG9pbnQpCit7CisgICAgaWYgKHBvaW50ID09IG1fYW5jaG9yUG9pbnQpCisgICAgICAgIHJldHVy
bjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEFuY2hvclBvaW50KHBvaW50KTsKKyAgICB1cGRh
dGVBbmNob3JQb2ludCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRTaXplKGNv
bnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA9PSBtX3NpemUpCisgICAgICAg
IHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFNpemUoc2l6ZSk7CisgICAgdXBkYXRl
TGF5ZXJTaXplKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFRyYW5zZm9ybShj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBpZiAodCA9PSBtX3RyYW5zZm9y
bSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0VHJhbnNmb3JtKHQp
OworICAgIHVwZGF0ZVRyYW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpz
ZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAg
ICBpZiAodCA9PSBtX2NoaWxkcmVuVHJhbnNmb3JtKQorICAgICAgICByZXR1cm47CisKKyAgICBH
cmFwaGljc0xheWVyOjpzZXRDaGlsZHJlblRyYW5zZm9ybSh0KTsKKyAgICB1cGRhdGVDaGlsZHJl
blRyYW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRQcmVzZXJ2ZXMz
RChib29sIHByZXNlcnZlczNEKQoreworICAgIGlmIChwcmVzZXJ2ZXMzRCA9PSBtX3ByZXNlcnZl
czNEKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRQcmVzZXJ2ZXMz
RChwcmVzZXJ2ZXMzRCk7CisgICAgdXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgpOworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRNYXNrc1RvQm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykK
K3sKKyAgICBpZiAobWFza3NUb0JvdW5kcyA9PSBtX21hc2tzVG9Cb3VuZHMpCisgICAgICAgIHJl
dHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5k
cyk7CisgICAgdXBkYXRlTWFza3NUb0JvdW5kcygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJT
a2lhOjpzZXREcmF3c0NvbnRlbnQoYm9vbCBkcmF3c0NvbnRlbnQpCit7CisgICAgaWYgKGRyYXdz
Q29udGVudCA9PSBtX2RyYXdzQ29udGVudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0RHJhd3NDb250ZW50KGRyYXdzQ29udGVudCk7CisgICAgdXBkYXRlTGF5ZXJE
cmF3c0NvbnRlbnQoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0QmFja2dyb3Vu
ZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAobV9iYWNrZ3JvdW5kQ29sb3JT
ZXQgJiYgbV9iYWNrZ3JvdW5kQ29sb3IgPT0gY29sb3IpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7CisKKyAgICBtX2NvbnRl
bnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IgPSB0cnVlOworICAgIHVwZGF0ZUxheWVyQmFja2dy
b3VuZENvbG9yKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OmNsZWFyQmFja2dyb3Vu
ZENvbG9yKCkKK3sKKyAgICBpZiAoIW1fYmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICByZXR1
cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpjbGVhckJhY2tncm91bmRDb2xvcigpOworICAgIGNs
ZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IobV9jb250ZW50c0xheWVyLmdldCgpKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q29udGVudHNPcGFxdWUoYm9vbCBvcGFxdWUpCit7Cisg
ICAgaWYgKG1fY29udGVudHNPcGFxdWUgPT0gb3BhcXVlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c09wYXF1ZShvcGFxdWUpOworICAgIHVwZGF0ZUNv
bnRlbnRzT3BhcXVlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldEJhY2tmYWNl
VmlzaWJpbGl0eShib29sIHZpc2libGUpCit7CisgICAgaWYgKG1fYmFja2ZhY2VWaXNpYmlsaXR5
ID09IHZpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJh
Y2tmYWNlVmlzaWJpbGl0eSh2aXNpYmxlKTsKKyAgICB1cGRhdGVCYWNrZmFjZVZpc2liaWxpdHko
KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5
KQoreworICAgIGZsb2F0IGNsYW1wZWRPcGFjaXR5ID0gbWF4KG1pbihvcGFjaXR5LCAxLjBmKSwg
MC4wZik7CisKKyAgICBpZiAobV9vcGFjaXR5ID09IGNsYW1wZWRPcGFjaXR5KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGNsYW1wZWRPcGFjaXR5KTsK
KyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0T3BhY2l0eShvcGFjaXR5KTsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICBpZiAoZHJhd3NDb250ZW50
KCkpCisgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJTa2lhOjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
KQoreworICAgIGlmIChkcmF3c0NvbnRlbnQoKSkKKyAgICAgICAgbV9sYXllci0+c2V0TmVlZHNE
aXNwbGF5KHJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRDb250ZW50c1Jl
Y3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocmVjdCA9PSBtX2NvbnRlbnRzUmVj
dCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNSZWN0
KHJlY3QpOworICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjpzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAgIC8vIFRPRE8o
dmFuZ2VsaXMpOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q29u
dGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqIHZpZGVvTGF5ZXIpCit7CisgICAgLy8gVE9ETyh2
YW5nZWxpcyk6IEltcGxlbWVudAorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRHZW9t
ZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBvcmllbnRh
dGlvbikKK3sKKyAgICBpZiAob3JpZW50YXRpb24gPT0gbV9nZW9tZXRyeU9yaWVudGF0aW9uKQor
ICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRHZW9tZXRyeU9yaWVudGF0
aW9uKG9yaWVudGF0aW9uKTsKKyAgICB1cGRhdGVHZW9tZXRyeU9yaWVudGF0aW9uKCk7Cit9CisK
K1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJTa2lhOjpob3N0TGF5ZXJGb3JTdWJsYXllcnMo
KSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5zZm9ybUxheWVyID8gbV90cmFuc2Zvcm1MYXll
ci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5
ZXJTa2lhOjpsYXllckZvclN1cGVybGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5z
Zm9ybUxheWVyID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7Cit9CisK
K1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJTa2lhOjpwbGF0Zm9ybUxheWVyKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gcHJpbWFyeUxheWVyKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNr
aWE6OnNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBp
ZiAoY29sb3IuaXNWYWxpZCgpKQorICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xvcihtX2xh
eWVyLmdldCgpLCBjb2xvcik7CisgICAgZWxzZQorICAgICAgICBjbGVhckxheWVyQmFja2dyb3Vu
ZENvbG9yKG1fbGF5ZXIuZ2V0KCkpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRE
ZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGJvcmRlcldpZHRoKQoreworICAg
IGlmIChjb2xvci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcihtX2xh
eWVyLmdldCgpLCBjb2xvcik7CisgICAgICAgIG1fbGF5ZXItPnNldEJvcmRlcldpZHRoKGJvcmRl
cldpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjbGVhckJvcmRlckNvbG9yKG1fbGF5ZXIu
Z2V0KCkpOworICAgICAgICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aCgwKTsKKyAgICB9Cit9CisK
K0dyYXBoaWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBHcmFwaGlj
c0xheWVyU2tpYTo6ZGVmYXVsdENvbnRlbnRzT3JpZW50YXRpb24oKSBjb25zdAoreworICAgIHJl
dHVybiBDb21wb3NpdGluZ0Nvb3JkaW5hdGVzVG9wRG93bjsKK30KKwordm9pZCBHcmFwaGljc0xh
eWVyU2tpYTo6dXBkYXRlU3VibGF5ZXJMaXN0KCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPExheWVy
U2tpYT4gPiBuZXdTdWJsYXllcnM7CisKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikgeworICAg
ICAgICAvLyBBZGQgdGhlIHByaW1hcnkgbGF5ZXIgZmlyc3QuIEV2ZW4gaWYgd2UgaGF2ZSBuZWdh
dGl2ZSB6LW9yZGVyIGNoaWxkcmVuLCB0aGUgcHJpbWFyeSBsYXllciBhbHdheXMgY29tZXMgYmVo
aW5kLgorICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKG1fbGF5ZXIuZ2V0KCkpOworICAgIH0g
ZWxzZSBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIC8vIEZJWE1FOiBhZGQgdGhlIGNv
bnRlbnRzIGxheWVyIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggbmVnYXRpdmUgei1vcmRlciBj
aGlsZHJlbi4KKyAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjYXVzZSB2aXNpYmxlIHJlbmRlcmlu
ZyBpc3N1ZXMgYmVjYXVzZSBjdXJyZW50bHkgY29udGVudHMgbGF5ZXJzIGFyZSBvbmx5IHVzZWQK
KyAgICAgICAgLy8gZm9yIHJlcGxhY2VkIGVsZW1lbnRzIHRoYXQgZG9uJ3QgaGF2ZSBjaGlsZHJl
bi4KKyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZChtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkpOwor
ICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mIGNoaWxkTGF5ZXJzID0g
Y2hpbGRyZW4oKTsKKyAgICBzaXplX3QgbnVtQ2hpbGRyZW4gPSBjaGlsZExheWVycy5zaXplKCk7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgKytpKSB7CisgICAgICAg
IEdyYXBoaWNzTGF5ZXJTa2lhKiBjdXJDaGlsZCA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJT
a2lhKj4oY2hpbGRMYXllcnNbaV0pOworCisgICAgICAgIExheWVyU2tpYSogY2hpbGRMYXllciA9
IGN1ckNoaWxkLT5sYXllckZvclN1cGVybGF5ZXIoKTsKKyAgICAgICAgbmV3U3VibGF5ZXJzLmFw
cGVuZChjaGlsZExheWVyKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5l
d1N1YmxheWVycy5zaXplKCk7ICsraSkKKyAgICAgICAgbmV3U3VibGF5ZXJzW2ldLT5yZW1vdmVG
cm9tU3VwZXJsYXllcigpOworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAg
bV90cmFuc2Zvcm1MYXllci0+c2V0U3VibGF5ZXJzKG5ld1N1YmxheWVycyk7CisKKyAgICAgICAg
aWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRyYW5z
Zm9ybSBsYXllciwgdGhlbiB0aGUgY29udGVudHMgbGF5ZXIgaXMgcGFyZW50ZWQgaW4gdGhlCisg
ICAgICAgICAgICAvLyBwcmltYXJ5IGxheWVyICh3aGljaCBpcyBpdHNlbGYgYSBjaGlsZCBvZiB0
aGUgdHJhbnNmb3JtIGxheWVyKS4KKyAgICAgICAgICAgIG1fbGF5ZXItPnJlbW92ZUFsbFN1Ymxh
eWVycygpOworICAgICAgICAgICAgbV9sYXllci0+YWRkU3VibGF5ZXIobV9jb250ZW50c0xheWVy
KTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBtX2xheWVyLT5zZXRTdWJsYXllcnMo
bmV3U3VibGF5ZXJzKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTGF5ZXJQ
b3NpdGlvbigpCit7CisgICAgLy8gUG9zaXRpb24gaXMgb2Zmc2V0IG9uIHRoZSBsYXllciBieSB0
aGUgbGF5ZXIgYW5jaG9yIHBvaW50LgorICAgIFNrUG9pbnQgcG9zUG9pbnQ7CisgICAgcG9zUG9p
bnQuc2V0KG1fcG9zaXRpb24ueCgpICsgbV9hbmNob3JQb2ludC54KCkgKiBtX3NpemUud2lkdGgo
KSwKKyAgICAgICAgICAgICAgICAgcG9zUG9pbnQuZlkgPSBtX3Bvc2l0aW9uLnkoKSArIG1fYW5j
aG9yUG9pbnQueSgpICogbV9zaXplLmhlaWdodCgpKTsKKworICAgIHByaW1hcnlMYXllcigpLT5z
ZXRQb3NpdGlvbihwb3NQb2ludCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0
ZUxheWVyU2l6ZSgpCit7CisgICAgU2tJUmVjdCByZWN0OworICAgIHJlY3Quc2V0KDAsIDAsIG1f
c2l6ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkpOworICAgIGlmIChtX3RyYW5zZm9ybUxheWVy
KSB7CisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKKyAgICAgICAg
Ly8gVGhlIGFuY2hvciBvZiB0aGUgY29udGVudHMgbGF5ZXIgaXMgYWx3YXlzIGF0IDAuNSwgMC41
LCBzbyB0aGUgcG9zaXRpb24gaXMgY2VudGVyLXJlbGF0aXZlLgorICAgICAgICBTa1BvaW50IGNl
bnRlclBvaW50OworICAgICAgICBjZW50ZXJQb2ludC5zZXQobV9zaXplLndpZHRoKCkgLyAyLjBm
LCBtX3NpemUuaGVpZ2h0KCkgLyAyLjBmKTsKKyAgICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24o
Y2VudGVyUG9pbnQpOworICAgIH0KKworICAgIG1fbGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKKwor
ICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCByZXNpemUgbV9jb250ZW50c0xheWVyLiBJdCdzIHVw
IHRoZSBjYWxsZXIgdG8gZG8gdGhhdC4KKworICAgIC8vIGlmIHdlJ3ZlIGNoYW5nZWQgdGhlIGJv
dW5kcywgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24KKyAgICAvLyBvZiB0aGUg
bGF5ZXIsIHRha2luZyBhbmNob3IgcG9pbnQgaW50byBhY2NvdW50LgorICAgIHVwZGF0ZUxheWVy
UG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQW5jaG9yUG9p
bnQoKQoreworICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQ7CisgICAgYW5jaG9yUG9pbnQuc2V0KG1f
YW5jaG9yUG9pbnQueCgpLCBtX2FuY2hvclBvaW50LnkoKSk7CisgICAgcHJpbWFyeUxheWVyKCkt
PnNldEFuY2hvclBvaW50KGFuY2hvclBvaW50KTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5j
aG9yUG9pbnRaKG1fYW5jaG9yUG9pbnQueigpKTsKKyAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZVRyYW5zZm9ybSgpCit7CisgICAg
cHJpbWFyeUxheWVyKCktPnNldFRyYW5zZm9ybShtX3RyYW5zZm9ybS50b0FmZmluZVRyYW5zZm9y
bSgpKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ2hpbGRyZW5UcmFuc2Zv
cm0oKQoreworICAgIHByaW1hcnlMYXllcigpLT5zZXRTdWJsYXllclRyYW5zZm9ybShtX2NoaWxk
cmVuVHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTWFza3NU
b0JvdW5kcygpCit7CisgICAgbV9sYXllci0+c2V0TWFza3NUb0JvdW5kcyhtX21hc2tzVG9Cb3Vu
ZHMpOworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjp1cGRhdGVDb250ZW50c09wYXF1ZSgpCit7CisgICAgbV9sYXllci0+c2V0T3BhcXVl
KG1fY29udGVudHNPcGFxdWUpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVC
YWNrZmFjZVZpc2liaWxpdHkoKQoreworICAgIG1fbGF5ZXItPnNldERvdWJsZVNpZGVkKG1fYmFj
a2ZhY2VWaXNpYmlsaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTGF5
ZXJQcmVzZXJ2ZXMzRCgpCit7CisgICAgLy8gVE9ETyh2YW5nZWxpcyk6IGltcGxlbWVudAorfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVMYXllckRyYXdzQ29udGVudCgpCit7Cisg
ICAgaWYgKG1fZHJhd3NDb250ZW50KQorICAgICAgICBtX2xheWVyLT5zZXROZWVkc0Rpc3BsYXko
KTsKKworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjp1cGRhdGVMYXllckJhY2tncm91bmRDb2xvcigpCit7CisgICAgaWYgKCFtX2NvbnRl
bnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG5ldmVyIGNyZWF0ZSB0aGUg
Y29udGVudHMgbGF5ZXIganVzdCBmb3IgYmFja2dyb3VuZCBjb2xvciB5ZXQuCisgICAgaWYgKG1f
YmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xvcihtX2Nv
bnRlbnRzTGF5ZXIuZ2V0KCksIG1fYmFja2dyb3VuZENvbG9yKTsKKyAgICBlbHNlCisgICAgICAg
IGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IobV9jb250ZW50c0xheWVyLmdldCgpKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ29udGVudHNJbWFnZSgpCit7CisgICAgLy8g
VE9ETyh2YW5nZWxpcyk6IEltcGxlbWVudAorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1
cGRhdGVDb250ZW50c1ZpZGVvKCkKK3sKKyAgICAvLyBUT0RPKHZhbmdlbGlzKTogSW1wbGVtZW50
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUNvbnRlbnRzUmVjdCgpCit7Cisg
ICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUG9pbnQg
cG9pbnQ7CisgICAgcG9pbnQuc2V0KG1fY29udGVudHNSZWN0LngoKSwgbV9jb250ZW50c1JlY3Qu
eSgpKTsKKyAgICBTa0lSZWN0IHJlY3Q7CisgICAgcmVjdC5zZXQoMCwKKyAgICAgICAgICAgICAw
LAorICAgICAgICAgICAgIG1fY29udGVudHNSZWN0LndpZHRoKCksCisgICAgICAgICAgICAgbV9j
b250ZW50c1JlY3QuaGVpZ2h0KCkpOworCisgICAgbV9jb250ZW50c0xheWVyLT5zZXRQb3NpdGlv
bihwb2ludCk7CisgICAgbV9jb250ZW50c0xheWVyLT5zZXRCb3VuZHMocmVjdCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUdlb21ldHJ5T3JpZW50YXRpb24oKQoreworICAg
IHN3aXRjaCAoZ2VvbWV0cnlPcmllbnRhdGlvbigpKSB7CisgICAgICAgIGNhc2UgQ29tcG9zaXRp
bmdDb29yZGluYXRlc1RvcERvd246CisgICAgICAgICAgICBtX2xheWVyLT5zZXRHZW9tZXRyeUZs
aXBwZWQoZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDb21wb3Np
dGluZ0Nvb3JkaW5hdGVzQm90dG9tVXA6CisgICAgICAgICAgICBtX2xheWVyLT5zZXRHZW9tZXRy
eUZsaXBwZWQodHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gR2VvbWV0
cnkgb3JpZW50YXRpb24gaXMgbWFwcGVkIG9udG8gY2hpbGRyZW4gdHJhbnNmb3JtIGluIG9sZGVy
IFF1YXJ0ekNvcmVzLAorICAgIC8vIHNvIGlzIGhhbmRsZWQgdmlhIHNldEdlb21ldHJ5T3JpZW50
YXRpb24oKS4KK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0dXBDb250ZW50c0xheWVy
KExheWVyU2tpYSogY29udGVudHNMYXllcikKK3sKKyAgICBpZiAoY29udGVudHNMYXllciA9PSBt
X2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2NvbnRlbnRzTGF5
ZXIpIHsKKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwor
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSAwOworICAgIH0KKworICAgIGlmIChjb250ZW50c0xh
eWVyKSB7CisgICAgICAgIG1fY29udGVudHNMYXllciA9IGNvbnRlbnRzTGF5ZXI7CisKKyAgICAg
ICAgaWYgKGRlZmF1bHRDb250ZW50c09yaWVudGF0aW9uKCkgPT0gQ29tcG9zaXRpbmdDb29yZGlu
YXRlc0JvdHRvbVVwKSB7CisgICAgICAgICAgICBTa1BvaW50IGFuY2hvclBvaW50OworICAgICAg
ICAgICAgYW5jaG9yUG9pbnQuc2V0KDAuMGYsIDEuMGYpOworICAgICAgICAgICAgbV9jb250ZW50
c0xheWVyLT5zZXRBbmNob3JQb2ludChhbmNob3JQb2ludCk7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICBTa1BvaW50IGFuY2hvclBvaW50OworICAgICAgICAgICAgYW5jaG9yUG9pbnQu
c2V0KDAuMGYsIDAuMGYpOworICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRBbmNob3JQ
b2ludChhbmNob3JQb2ludCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnNlcnQgdGhlIGNv
bnRlbnQgbGF5ZXIgZmlyc3QuIFZpZGVvIGVsZW1lbnRzIHJlcXVpcmUgdGhpcywgYmVjYXVzZSB0
aGV5IGhhdmUKKyAgICAgICAgLy8gc2hhZG93IGNvbnRlbnQgdGhhdCBtdXN0IGRpc3BsYXkgaW4g
ZnJvbnQgb2YgdGhlIHZpZGVvLgorICAgICAgICBtX2xheWVyLT5pbnNlcnRTdWJsYXllcihtX2Nv
bnRlbnRzTGF5ZXIuZ2V0KCksIDApOworCisgICAgICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOwor
CisgICAgICAgIGlmIChzaG93RGVidWdCb3JkZXJzKCkpIHsKKyAgICAgICAgICAgIHNldExheWVy
Qm9yZGVyQ29sb3IobV9jb250ZW50c0xheWVyLmdldCgpLCBDb2xvcigwLCAwLCAxMjgsIDE4MCkp
OworICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRCb3JkZXJXaWR0aCgxLjBmKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKK30KKworLy8gVGhp
cyBmdW5jdGlvbiBzaW1wbHkgbWltaWNzIHRoZSBvcGVyYXRpb24gb2YgR3JhcGhpY3NMYXllckNB
Cit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVPcGFjaXR5T25MYXllcigpCit7CisgICAg
cHJpbWFyeUxheWVyKCktPnNldE9wYWNpdHkobV9vcGFjaXR5KTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJT
a2lhLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
cGhpY3NMYXllclNraWEuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR3Jh
cGhpY3NMYXllclNraWFfaF8KKyNkZWZpbmUgR3JhcGhpY3NMYXllclNraWFfaF8KKworLy8gVE9E
Tyh2YW5nZWxpcyk6IEZpbGUgaGVhdmlseSBib3Jyb3dzIGZyb20gR3JhcGhpY3NMYXllckNBQ0Yu
aC4gIFNlZSBjb21tZW50CisvLyBhdCB0aGUgdG9wIG9mIEdyYXBoaWNzTGF5ZXJTa2lhLmNwcC4K
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIkdyYXBoaWNz
TGF5ZXIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjbGFzcyBMYXllclNraWE7CisKK2NsYXNzIEdyYXBoaWNzTGF5ZXJTa2lhIDogcHVi
bGljIEdyYXBoaWNzTGF5ZXIgeworcHVibGljOgorCisgICAgR3JhcGhpY3NMYXllclNraWEoR3Jh
cGhpY3NMYXllckNsaWVudCopOworICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJTa2lhKCk7CisK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIGluTmFtZSk7CisKKyAgICAv
LyBmb3IgaG9zdGluZyB0aGlzIEdyYXBoaWNzTGF5ZXIgaW4gYSBuYXRpdmUgbGF5ZXIgaGllcmFy
Y2h5CisgICAgdmlydHVhbCBOYXRpdmVMYXllciBuYXRpdmVMYXllcigpIGNvbnN0OworCisgICAg
dmlydHVhbCBib29sIHNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mKTsK
KyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciAqbGF5ZXIpOworICAgIHZp
cnR1YWwgdm9pZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciAqbGF5ZXIsIGludCBpbmRl
eCk7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciAqbGF5ZXIs
IEdyYXBoaWNzTGF5ZXIgKnNpYmxpbmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJlbG93
KEdyYXBoaWNzTGF5ZXIgKmxheWVyLCBHcmFwaGljc0xheWVyICpzaWJsaW5nKTsKKyAgICB2aXJ0
dWFsIGJvb2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIgKm9sZENoaWxkLCBHcmFwaGljc0xh
eWVyICpuZXdDaGlsZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOwor
CisgICAgdmlydHVhbCB2b2lkIHNldFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIGluUG9pbnQp
OworICAgIHZpcnR1YWwgdm9pZCBzZXRBbmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmIGlu
UG9pbnQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYgaW5TaXpl
KTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldFByZXNlcnZlczNE
KGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wpOworICAgIHZp
cnR1YWwgdm9pZCBzZXREcmF3c0NvbnRlbnQoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0
QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyQmFj
a2dyb3VuZENvbG9yKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcGFxdWUoYm9v
bCk7CisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tmYWNlVmlzaWJpbGl0eShib29sKTsKKworICAg
IHZpcnR1YWwgdm9pZCBzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHkpOworCisgICAgdmlydHVhbCB2
b2lkIHNldE5lZWRzRGlzcGxheSgpOworICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXlJ
blJlY3QoY29uc3QgRmxvYXRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNS
ZWN0KGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1h
Z2UoSW1hZ2UqKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3Jt
TGF5ZXIqKTsKKworICAgIHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNv
bnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENv
bG9yJik7CisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiwgZmxv
YXQgYm9yZGVyV2lkdGgpOworCisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5T3JpZW50YXRp
b24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uKTsKKworICAgIHZvaWQgbm90aWZ5
U3luY1JlcXVpcmVkKCkgeyBpZiAobV9jbGllbnQpIG1fY2xpZW50LT5ub3RpZnlTeW5jUmVxdWly
ZWQodGhpcyk7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZU9wYWNpdHlPbkxheWVyKCk7
CisKKyAgICBMYXllclNraWEqIHByaW1hcnlMYXllcigpIGNvbnN0ICB7IHJldHVybiBtX3RyYW5z
Zm9ybUxheWVyLmdldCgpID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7
IH0KKyAgICBMYXllclNraWEqIGhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0OworICAgIExh
eWVyU2tpYSogbGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3Q7CisKKyAgICBDb21wb3NpdGluZ0Nv
b3JkaW5hdGVzT3JpZW50YXRpb24gZGVmYXVsdENvbnRlbnRzT3JpZW50YXRpb24oKSBjb25zdDsK
KyAgICB2b2lkIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJQb3Np
dGlvbigpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJTaXplKCk7CisgICAgdm9pZCB1cGRhdGVBbmNo
b3JQb2ludCgpOworICAgIHZvaWQgdXBkYXRlVHJhbnNmb3JtKCk7CisgICAgdm9pZCB1cGRhdGVD
aGlsZHJlblRyYW5zZm9ybSgpOworICAgIHZvaWQgdXBkYXRlTWFza3NUb0JvdW5kcygpOworICAg
IHZvaWQgdXBkYXRlQ29udGVudHNPcGFxdWUoKTsKKyAgICB2b2lkIHVwZGF0ZUJhY2tmYWNlVmlz
aWJpbGl0eSgpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgpOworICAgIHZvaWQg
dXBkYXRlTGF5ZXJEcmF3c0NvbnRlbnQoKTsKKyAgICB2b2lkIHVwZGF0ZUxheWVyQmFja2dyb3Vu
ZENvbG9yKCk7CisKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzSW1hZ2UoKTsKKyAgICB2b2lkIHVw
ZGF0ZUNvbnRlbnRzVmlkZW8oKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworICAg
IHZvaWQgdXBkYXRlR2VvbWV0cnlPcmllbnRhdGlvbigpOworCisgICAgdm9pZCBzZXR1cENvbnRl
bnRzTGF5ZXIoTGF5ZXJTa2lhKik7CisgICAgTGF5ZXJTa2lhKiBjb250ZW50c0xheWVyKCkgY29u
c3QgeyByZXR1cm4gbV9jb250ZW50c0xheWVyLmdldCgpOyB9CisKKyAgICBSZWZQdHI8TGF5ZXJT
a2lhPiBtX2xheWVyOworICAgIFJlZlB0cjxMYXllclNraWE+IG1fdHJhbnNmb3JtTGF5ZXI7Cisg
ICAgUmVmUHRyPExheWVyU2tpYT4gbV9jb250ZW50c0xheWVyOworCisgICAgZW51bSBDb250ZW50
c0xheWVyUHVycG9zZSB7CisgICAgICAgIE5vQ29udGVudHNMYXllciA9IDAsCisgICAgICAgIENv
bnRlbnRzTGF5ZXJGb3JJbWFnZSwKKyAgICAgICAgQ29udGVudHNMYXllckZvclZpZGVvCisgICAg
fTsKKworICAgIENvbnRlbnRzTGF5ZXJQdXJwb3NlIG1fY29udGVudHNMYXllclB1cnBvc2U7Cisg
ICAgYm9vbCBtX2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IgOiAxOworfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorCisjZW5kaWYgLy8gR3JhcGhpY3NMYXllclNraWFfaF8KClByb3BlcnR5IGNoYW5nZXMg
b246IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5oCl9f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBMRgoKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVy
U2tpYS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0
IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
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
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUgIkxheWVy
UmVuZGVyZXJTa2lhLmgiCisjaW5jbHVkZSAiTGF5ZXJTa2lhLmgiCisjaW5jbHVkZSAiUGxhdGZv
cm1Db250ZXh0U2tpYS5oIgorCisjaW5jbHVkZSAic2tpYS9leHQvcGxhdGZvcm1fY2FudmFzLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc093blB0cjxMYXllclJlbmRlcmVyU2tpYT4g
TGF5ZXJSZW5kZXJlclNraWE6OmNyZWF0ZSgpCit7CisgICAgcmV0dXJuIG5ldyBMYXllclJlbmRl
cmVyU2tpYSgpOworfQorCitMYXllclJlbmRlcmVyU2tpYTo6TGF5ZXJSZW5kZXJlclNraWEoKQor
ICAgIDogbV9yb290TGF5ZXIoMCkKKyAgICAsIG1fbmVlZHNEaXNwbGF5KGZhbHNlKQoreworfQor
CitMYXllclJlbmRlcmVyU2tpYTo6fkxheWVyUmVuZGVyZXJTa2lhKCkKK3sKK30KKwordm9pZCBM
YXllclJlbmRlcmVyU2tpYTo6ZHJhd0xheWVyc0luQ2FudmFzKHNraWE6OlBsYXRmb3JtQ2FudmFz
KiBjYW52YXMsIFNrUmVjdCBjbGlwUmVjdCkKK3sKKyAgICBpZiAoIW1fcm9vdExheWVyKQorICAg
ICAgICByZXR1cm47CisKKyAgICBjYW52YXMtPnNhdmUoKTsKKyAgICBjYW52YXMtPmNsaXBSZWN0
KGNsaXBSZWN0KTsKKworICAgIC8vIEZpcnN0IGNvbXBvc2l0ZSB0aGUgcm9vdCBsYXllciBpbnRv
IHRoZSBjYW52YXMuCisgICAgY2FudmFzLT5kcmF3Qml0bWFwKG1fcm9vdExheWVyLT5wbGF0Zm9y
bUNhbnZhcygpLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgTlVMTCk7
CisKKyAgICAvLyBBY2NvdW50IGZvciB0aGUgc2Nyb2xsIG9mZnNldCBiZWZvcmUgY29tcG9zaXRp
bmcgdGhlIHJlbWFpbmluZyBsYXllcnMuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByb290IGxheWVy
J3MgcGFpbnRpbmcgdGFrZXMgaW50byBhY2NvdW50IHRoZSBzY3JvbGwgb2Zmc2V0IGFscmVhZHku
CisgICAgY2FudmFzLT50cmFuc2xhdGUoLW1fc2Nyb2xsRnJhbWUuZkxlZnQsIC1tX3Njcm9sbEZy
YW1lLmZUb3ApOworCisgICAgZmxvYXQgb3BhY2l0eSA9IDEuMGY7CisgICAgY29uc3QgVmVjdG9y
PFJlZlB0cjxMYXllclNraWE+PiYgc3VibGF5ZXJzID0gbV9yb290TGF5ZXItPmdldFN1YmxheWVy
cygpOworICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpaSsr
KSB7CisgICAgICAgIGRyYXdMYXllckluQ2FudmFzUmVjdXJzaXZlKGNhbnZhcywgc3VibGF5ZXJz
W2lpXS5nZXQoKSwgb3BhY2l0eSk7CisgICAgfQorCisgICAgY2FudmFzLT5yZXN0b3JlKCk7CisK
KyAgICBtX25lZWRzRGlzcGxheSA9IGZhbHNlOworfQorCit2b2lkIExheWVyUmVuZGVyZXJTa2lh
Ojp1cGRhdGVMYXllckNvbnRlbnRzKCkKK3sKKyAgICBpZiAobV9yb290TGF5ZXIpIHsKKyAgICAg
ICAgdXBkYXRlTGF5ZXJDb250ZW50c1JlY3Vyc2l2ZShtX3Jvb3RMYXllci5nZXQoKSk7CisgICAg
fQorfQorCit2b2lkIExheWVyUmVuZGVyZXJTa2lhOjpkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2
ZShza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzLCBMYXllclNraWEqIGxheWVyLCBmbG9hdCBv
cGFjaXR5KQoreworICAgIC8vIEd1YXJhbnRlZXMgdGhhdCB0aGUgY2FudmFzIGlzIHJlc3RvcmVk
IHRvIGEga25vd24gc3RhdGUgb24gZGVzdHJ1Y3Rpb24uCisgICAgU2tBdXRvQ2FudmFzUmVzdG9y
ZSBhdXRvUmVzdG9yZUNhbnZhcyhjYW52YXMsIHRydWUpOworCisgICAgU2tQb2ludCBwb3NpdGlv
biA9IGxheWVyLT5wb3NpdGlvbigpOworICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQgPSBsYXllci0+
YW5jaG9yUG9pbnQoKTsKKyAgICBTa01hdHJpeCB0cmFuc2Zvcm0gPSBsYXllci0+dHJhbnNmb3Jt
KCk7CisgICAgU2tJUmVjdCBib3VuZHMgPSBsYXllci0+Ym91bmRzKCk7CisKKyAgICBjYW52YXMt
PnRyYW5zbGF0ZShwb3NpdGlvbi5mWCwgcG9zaXRpb24uZlkpOworCisgICAgU2tTY2FsYXIgdHgg
PSBTa1NjYWxhck11bChhbmNob3JQb2ludC5mWCwgYm91bmRzLndpZHRoKCkpOworICAgIFNrU2Nh
bGFyIHR5ID0gU2tTY2FsYXJNdWwoYW5jaG9yUG9pbnQuZlksIGJvdW5kcy5oZWlnaHQoKSk7Cisg
ICAgY2FudmFzLT50cmFuc2xhdGUodHgsIHR5KTsKKyAgICBjYW52YXMtPmNvbmNhdCh0cmFuc2Zv
cm0pOworICAgIGNhbnZhcy0+dHJhbnNsYXRlKC10eCwgLXR5KTsKKworICAgIC8vIFRoZSBwb3Np
dGlvbiB3ZSBnZXQgaXMgZm9yIHRoZSBjZW50ZXIgb2YgdGhlIGxheWVyIGJ1dAorICAgIC8vIGRy
YXdCaXRtYXAgc3RhcnRzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBhbmQgdGhlcmVmb3JlCisg
ICAgLy8gd2UgbmVlZCB0byBhZGp1c3Qgb3VyIHRyYW5zZm9ybS4KKyAgICBjYW52YXMtPnRyYW5z
bGF0ZSgtMC41ZiAqIGJvdW5kcy53aWR0aCgpLCAtMC41ZiAqIGJvdW5kcy5oZWlnaHQoKSk7CisK
KyAgICBTa1BhaW50IG9wYWNpdHlQYWludDsKKyAgICBvcGFjaXR5ID0gb3BhY2l0eSAqIGxheWVy
LT5vcGFjaXR5KCk7CisgICAgb3BhY2l0eVBhaW50LnNldEFscGhhKG9wYWNpdHkgKiAyNTUpOwor
CisgICAgY2FudmFzLT5kcmF3Qml0bWFwKGxheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZp
Y2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgJm9wYWNpdHlQYWludCk7CisKKyAgICBj
b25zdCBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4+JiBzdWJsYXllcnMgPSBsYXllci0+Z2V0U3Vi
bGF5ZXJzKCk7CisgICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IHN1YmxheWVycy5zaXplKCk7
IGlpKyspIHsKKyAgICAgICAgZHJhd0xheWVySW5DYW52YXNSZWN1cnNpdmUoY2FudmFzLCBzdWJs
YXllcnNbaWldLmdldCgpLCBvcGFjaXR5KTsKKyAgICB9Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJl
clNraWE6OnVwZGF0ZUxheWVyQ29udGVudHNSZWN1cnNpdmUoTGF5ZXJTa2lhKiBsYXllcikKK3sK
KyAgICBsYXllci0+dXBkYXRlQ29udGVudHMoKTsKKworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8
TGF5ZXJTa2lhPj4mIHN1YmxheWVycyA9IGxheWVyLT5nZXRTdWJsYXllcnMoKTsKKyAgICBmb3Ig
KHNpemVfdCBpaSA9IDA7IGlpIDwgc3VibGF5ZXJzLnNpemUoKTsgaWkrKykgeworICAgICAgICB1
cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKHN1YmxheWVyc1tpaV0uZ2V0KCkpOworICAgIH0K
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmNwcApfX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9s
LXN0eWxlCiAgICsgTEYKCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5
ZXJSZW5kZXJlclNraWEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3NraWEvTGF5ZXJSZW5kZXJlclNraWEuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmln
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
LgorICovCisKKworI2lmbmRlZiBMYXllclJlbmRlcmVyU2tpYV9oCisjZGVmaW5lIExheWVyUmVu
ZGVyZXJTa2lhX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1
ZGUgIkxheWVyU2tpYS5oIgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCisjaW5jbHVk
ZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFj
ZSBza2lhIHsKK2NsYXNzIFBsYXRmb3JtQ2FudmFzOworfQorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIExheWVyUmVuZGVyZXJTa2lhIDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1Ymxp
YzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxMYXllclJlbmRlcmVyU2tpYT4gY3JlYXRlKCk7CisK
KyAgICBMYXllclJlbmRlcmVyU2tpYSgpOworICAgIH5MYXllclJlbmRlcmVyU2tpYSgpOworCisg
ICAgdm9pZCBkcmF3TGF5ZXJzSW5DYW52YXMoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcywg
U2tSZWN0IGNsaXBSZWN0KTsKKworICAgIHZvaWQgdXBkYXRlTGF5ZXJDb250ZW50cygpOworCisg
ICAgdm9pZCBzZXRSb290TGF5ZXIoTGF5ZXJTa2lhKiBsYXllcikgeyBtX3Jvb3RMYXllciA9IGxh
eWVyOyB9CisgICAgTGF5ZXJTa2lhKiByb290TGF5ZXIoKSB7IHJldHVybiBtX3Jvb3RMYXllci5n
ZXQoKTsgfQorCisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSB7IG1fbmVlZHNEaXNwbGF5ID0g
dHJ1ZTsgfQorCisgICAgdm9pZCBzZXRTY3JvbGxGcmFtZShTa0lSZWN0JiBzY3JvbGxGcmFtZSkg
eyBtX3Njcm9sbEZyYW1lID0gc2Nyb2xsRnJhbWU7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGRy
YXdMYXllckluQ2FudmFzUmVjdXJzaXZlKHNraWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMsIExh
eWVyU2tpYSogbGF5ZXIsIGZsb2F0IG9wYWNpdHkpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJDb250
ZW50c1JlY3Vyc2l2ZShMYXllclNraWEqIGxheWVyKTsKKworICAgIFJlZlB0cjxMYXllclNraWE+
IG1fcm9vdExheWVyOworCisgICAgYm9vbCBtX25lZWRzRGlzcGxheTsKKyAgICBTa0lSZWN0IG1f
c2Nyb2xsRnJhbWU7Cit9OworCit9CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisKKyNlbmRpZiAvLyBXS0NBQ0ZMYXllcl9oCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuaApfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgTEYKCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDI5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKworI2luY2x1ZGUgIkxheWVyU2tpYS5oIgorI2luY2x1ZGUgIlBsYXRmb3Jt
Q29udGV4dFNraWEuaCIKKyNpbmNsdWRlICJSZW5kZXJMYXllckJhY2tpbmcuaCIKKworI2luY2x1
ZGUgInNraWEvZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworUGFzc1JlZlB0cjxMYXllclNraWE+IExheWVyU2tp
YTo6Y3JlYXRlKExheWVyVHlwZSB0eXBlLCBHcmFwaGljc0xheWVyU2tpYSogb3duZXIpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBMYXllclNraWEodHlwZSwgb3duZXIpKTsKK30KKworTGF5
ZXJTa2lhOjpMYXllclNraWEoTGF5ZXJUeXBlIHR5cGUsIEdyYXBoaWNzTGF5ZXJTa2lhKiBvd25l
cikKKyAgICA6IG1fbmVlZHNEaXNwbGF5T25Cb3VuZHNDaGFuZ2UoZmFsc2UpCisgICAgLCBtX293
bmVyKG93bmVyKQorICAgICwgbV9sYXllclR5cGUodHlwZSkKKyAgICAsIG1fc3VwZXJsYXllcigw
KQorICAgICwgbV9ib3JkZXJXaWR0aCgwKQorICAgICwgbV9ib3JkZXJDb2xvcigwLCAwLCAwLCAw
KQorICAgICwgbV9iYWNrZ3JvdW5kQ29sb3IoMCwgMCwgMCwgMCkKKyAgICAsIG1fYW5jaG9yUG9p
bnRaKDApCisgICAgLCBtX2NsZWFyc0NvbnRleHQoZmFsc2UpCisgICAgLCBtX2RvdWJsZVNpZGVk
KGZhbHNlKQorICAgICwgbV9lZGdlQW50aWFsaWFzaW5nTWFzaygwKQorICAgICwgbV9oaWRkZW4o
ZmFsc2UpCisgICAgLCBtX21hc2tzVG9Cb3VuZHMoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRzR3Jh
dml0eShCb3R0b20pCisgICAgLCBtX29wYWNpdHkoMS4wKQorICAgICwgbV9vcGFxdWUodHJ1ZSkK
KyAgICAsIG1felBvc2l0aW9uKDAuMCkKKyAgICAsIG1fY2FudmFzKDApCisgICAgLCBtX3NraWFD
b250ZXh0KDApCisgICAgLCBtX2dyYXBoaWNzQ29udGV4dCgwKQorICAgICwgbV9nZW9tZXRyeUZs
aXBwZWQoZmFsc2UpCit7CisgICAgbV9ib3VuZHMuc2V0RW1wdHkoKTsKKyAgICBtX2JhY2tpbmdT
dG9yZVJlY3Quc2V0RW1wdHkoKTsKKyAgICBtX2ZyYW1lLnNldEVtcHR5KCk7CisgICAgbV9wb3Np
dGlvbi5zZXQoMCwgMCk7CisgICAgbV9hbmNob3JQb2ludC5zZXQoMCwgMCk7CisgICAgbV90cmFu
c2Zvcm0ucmVzZXQoKTsKKyAgICBtX3N1YmxheWVyVHJhbnNmb3JtLnJlc2V0KCk7CisKKyAgICB1
cGRhdGVHcmFwaGljc0NvbnRleHQobV9iYWNraW5nU3RvcmVSZWN0KTsKK30KKworTGF5ZXJTa2lh
Ojp+TGF5ZXJTa2lhKCkKK3sKKyAgICAvLyBPdXIgc3VwZXJsYXllciBzaG91bGQgYmUgaG9sZGlu
ZyBhIHJlZmVyZW5jZSB0byB1cywgc28gdGhlcmUgc2hvdWxkIGJlIG5vIHdheSBmb3IgdXMgdG8g
YmUgZGVzdHJveWVkIHdoaWxlIHdlIHN0aWxsIGhhdmUgYSBzdXBlcmxheWVyLgorICAgIEFTU0VS
VCghc3VwZXJsYXllcigpKTsKKworICAgIGRlbGV0ZSBtX2dyYXBoaWNzQ29udGV4dDsKKyAgICBk
ZWxldGUgbV9za2lhQ29udGV4dDsKKyAgICBkZWxldGUgbV9jYW52YXM7Cit9CisKK3ZvaWQgTGF5
ZXJTa2lhOjp1cGRhdGVHcmFwaGljc0NvbnRleHQoY29uc3QgU2tJUmVjdCYgcmVjdCkKK3sKKyAg
ICBpZiAobV9ncmFwaGljc0NvbnRleHQpCisgICAgICAgIGRlbGV0ZSBtX2dyYXBoaWNzQ29udGV4
dDsKKyAgICBpZiAobV9za2lhQ29udGV4dCkKKyAgICAgICAgZGVsZXRlIG1fc2tpYUNvbnRleHQ7
CisgICAgaWYgKG1fY2FudmFzKQorICAgICAgICBkZWxldGUgbV9jYW52YXM7CisKKyAgICBtX2Nh
bnZhcyA9IG5ldyBza2lhOjpQbGF0Zm9ybUNhbnZhcyhyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0
KCksIGZhbHNlKTsKKyAgICBtX3NraWFDb250ZXh0ID0gbmV3IFBsYXRmb3JtQ29udGV4dFNraWEo
bV9jYW52YXMpOworCisgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IHRleHQgdG8gc2hvdyB1
cCBjb3JyZWN0bHkuICBXaXRob3V0IGl0LAorICAgIC8vIEdESSByZW5kZXJzIHdpdGggemVybyBh
bHBoYSBhbmQgdGhlIHRleHQgYmVjb21lcyBpbnZpc2libGUuCisgICAgLy8gVW5mb3J0dW5hdGVs
eSwgc2V0dGluZyB0aGlzIHRvIHRydWUgZGlzYWJsZXMgY2xlYXJ0eXBlLgorICAgIG1fc2tpYUNv
bnRleHQtPnNldERyYXdpbmdUb0ltYWdlQnVmZmVyKHRydWUpOworCisgICAgbV9ncmFwaGljc0Nv
bnRleHQgPSBuZXcgR3JhcGhpY3NDb250ZXh0KHJlaW50ZXJwcmV0X2Nhc3Q8UGxhdGZvcm1HcmFw
aGljc0NvbnRleHQqPihtX3NraWFDb250ZXh0KSk7CisKKyAgICAvLyBCYWNraW5nIHN0b3JlIGEg
bGF5ZXIgY291bGQgYmUgZGlmZmVyZW50IHRoYW4gdGhlbiBsYXllcidzIGJvdW5kcy4KKyAgICAv
LyBUaGlzIGlzIG1vc3RseSB0cnVlIGZvciB0aGUgcm9vdCBsYXllciB0aGF0J3Mgc2l6ZWQgYmFz
ZWQgb24gdGhlIHZpZXcKKyAgICAvLyBzaXplIHJhdGhlciB0aGFuIHRoZSBhY3R1YWwgbGF5ZXIg
c2l6ZS4KKyAgICBtX2JhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworfQorCit2b2lkIExheWVyU2tp
YTo6dXBkYXRlQ29udGVudHMoKQoreworICAgIFJlbmRlckxheWVyQmFja2luZyogYmFja2luZyA9
IHN0YXRpY19jYXN0PFJlbmRlckxheWVyQmFja2luZyo+KG1fb3duZXItPmNsaWVudCgpKTsKKwor
ICAgIGlmIChiYWNraW5nICYmICFiYWNraW5nLT5wYWludGluZ0dvZXNUb1dpbmRvdygpKSB7Cisg
ICAgICAgIG1fb3duZXItPnBhaW50R3JhcGhpY3NMYXllckNvbnRlbnRzKCptX2dyYXBoaWNzQ29u
dGV4dCwgSW50UmVjdCgwLCAwLCBtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkp
OworICAgIH0KKworICAgIC8vIFBhaW50IHRoZSBkZWJ1ZyBib3JkZXIuCisgICAgLy8gVE9ETyh2
YW5nZWxpcyk6IEFkZCBhIGZsYWcgdG8gY2hlY2sgaWYgZGVidWcgYm9yZGVycyBhcmUgdXNlZC4K
KyAgICBtX2dyYXBoaWNzQ29udGV4dC0+c2V0U3Ryb2tlQ29sb3IobV9ib3JkZXJDb2xvciwgRGV2
aWNlQ29sb3JTcGFjZSk7CisgICAgbV9ncmFwaGljc0NvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVz
cyhtX2JvcmRlcldpZHRoKTsKKyAgICBtX2dyYXBoaWNzQ29udGV4dC0+ZHJhd0xpbmUoSW50UG9p
bnQoMCwgMCksIEludFBvaW50KG1fYm91bmRzLndpZHRoKCksIDApKTsKKyAgICBtX2dyYXBoaWNz
Q29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwgMCksIEludFBvaW50KDAsIG1fYm91bmRzLmhl
aWdodCgpKSk7CisgICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KG1fYm91
bmRzLndpZHRoKCksIDApLCBJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWln
aHQoKSkpOworICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5kcmF3TGluZShJbnRQb2ludCgwLCBtX2Jv
dW5kcy5oZWlnaHQoKSksIEludFBvaW50KG1fYm91bmRzLndpZHRoKCksIG1fYm91bmRzLmhlaWdo
dCgpKSk7Cit9CisKKwordm9pZCBMYXllclNraWE6OnNldE5lZWRzQ29tbWl0KCkKK3sKKyAgICAv
LyBDYWxsIG5vdGlmeVN5bmNSZXF1aXJlZCgpLCB3aGljaCBpbiB0aGlzIGltcGxlbWVudGF0aW9u
IHBsdW1icyB0aHJvdWdoIHRvCisgICAgLy8gY2FsbCBzZXRSb290TGF5ZXJOZWVkc0Rpc3BsYXko
KSBvbiB0aGUgV2ViVmlldywgd2hpY2ggY2F1c2VzIHRoZSBDQUNGUmVuZGVyZXIKKyAgICAvLyB0
byByZW5kZXIgYSBmcmFtZS4KKyAgICBpZiAobV9vd25lcikKKyAgICAgICAgbV9vd25lci0+bm90
aWZ5U3luY1JlcXVpcmVkKCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjphZGRTdWJsYXllcihQYXNz
UmVmUHRyPExheWVyU2tpYT4gc3VibGF5ZXIpCit7CisgICAgaW5zZXJ0U3VibGF5ZXIoc3VibGF5
ZXIsIG51bVN1YmxheWVycygpKTsKK30KKwordm9pZCBMYXllclNraWE6Omluc2VydFN1YmxheWVy
KFBhc3NSZWZQdHI8TGF5ZXJTa2lhPiBzdWJsYXllciwgc2l6ZV90IGluZGV4KQoreworICAgIGlu
ZGV4ID0gbWluKGluZGV4LCBtX3N1YmxheWVycy5zaXplKCkpOworICAgIG1fc3VibGF5ZXJzLmlu
c2VydChpbmRleCwgc3VibGF5ZXIpOworICAgIHN1YmxheWVyLT5zZXRTdXBlcmxheWVyKHRoaXMp
OworICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpyZXBsYWNlU3Vi
bGF5ZXIoTGF5ZXJTa2lhKiByZWZlcmVuY2UsIFBhc3NSZWZQdHI8TGF5ZXJTa2lhPiBuZXdMYXll
cikKK3sKKyAgICBBU1NFUlRfQVJHKHJlZmVyZW5jZSwgcmVmZXJlbmNlKTsKKyAgICBBU1NFUlRf
QVJHKHJlZmVyZW5jZSwgcmVmZXJlbmNlLT5zdXBlcmxheWVyKCkgPT0gdGhpcyk7CisKKyAgICBp
ZiAocmVmZXJlbmNlID09IG5ld0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW5l
d0xheWVyKSB7CisgICAgICAgIHJlbW92ZVN1YmxheWVyKHJlZmVyZW5jZSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBuZXdMYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKwor
ICAgIGludCByZWZlcmVuY2VJbmRleCA9IGluZGV4T2ZTdWJsYXllcihyZWZlcmVuY2UpOworICAg
IEFTU0VSVChyZWZlcmVuY2VJbmRleCAhPSAtMSk7CisgICAgaWYgKHJlZmVyZW5jZUluZGV4ID09
IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICByZWZlcmVuY2UtPnJlbW92ZUZyb21TdXBlcmxh
eWVyKCk7CisgICAgaW5zZXJ0U3VibGF5ZXIobmV3TGF5ZXIsIHJlZmVyZW5jZUluZGV4KTsKK30K
Kwordm9pZCBMYXllclNraWE6OnJlbW92ZUZyb21TdXBlcmxheWVyKCkKK3sKKyAgICBMYXllclNr
aWEqIHN1cGVybGF5ZXIgPSB0aGlzLT5zdXBlcmxheWVyKCk7CisgICAgaWYgKCFzdXBlcmxheWVy
KQorICAgICAgICByZXR1cm47CisKKyAgICBzdXBlcmxheWVyLT5yZW1vdmVTdWJsYXllcih0aGlz
KTsKKyAgICBzdXBlcmxheWVyLT5zZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExheWVyU2tp
YTo6cmVtb3ZlU3VibGF5ZXIoTGF5ZXJTa2lhKiBzdWJsYXllcikKK3sKKyAgICBpbnQgZm91bmRJ
bmRleCA9IGluZGV4T2ZTdWJsYXllcihzdWJsYXllcik7CisgICAgaWYgKGZvdW5kSW5kZXggPT0g
LTEpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc3VibGF5ZXJzLnJlbW92ZShmb3VuZEluZGV4
KTsKKyAgICBzdWJsYXllci0+c2V0U3VwZXJsYXllcigwKTsKKyAgICBzZXROZWVkc0NvbW1pdCgp
OworfQorCitpbnQgTGF5ZXJTa2lhOjppbmRleE9mU3VibGF5ZXIoY29uc3QgTGF5ZXJTa2lhKiBy
ZWZlcmVuY2UpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N1YmxheWVycy5zaXpl
KCk7IGkrKykgeworICAgICAgICBpZiAobV9zdWJsYXllcnNbaV0gPT0gcmVmZXJlbmNlKQorICAg
ICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworTGF5ZXJTa2lh
KiBMYXllclNraWE6OmFuY2VzdG9yT3JTZWxmV2l0aFN1cGVybGF5ZXIoTGF5ZXJTa2lhKiBzdXBl
cmxheWVyKSBjb25zdAoreworICAgIExheWVyU2tpYSogbGF5ZXIgPSBjb25zdF9jYXN0PExheWVy
U2tpYSo+KHRoaXMpOworICAgIGZvciAoTGF5ZXJTa2lhKiBhbmNlc3RvciA9IHRoaXMtPnN1cGVy
bGF5ZXIoKTsgYW5jZXN0b3I7IGxheWVyID0gYW5jZXN0b3IsIGFuY2VzdG9yID0gYW5jZXN0b3It
PnN1cGVybGF5ZXIoKSkgeworICAgICAgICBpZiAoYW5jZXN0b3IgPT0gc3VwZXJsYXllcikKKyAg
ICAgICAgICAgIHJldHVybiBsYXllcjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQg
TGF5ZXJTa2lhOjpzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IFNrSVJlY3QmIHJlY3QpCit7Cisg
ICAgaWYgKG1fYmFja2luZ1N0b3JlUmVjdCA9PSByZWN0KQorICAgICAgICByZXR1cm47CisKKyAg
ICB1cGRhdGVHcmFwaGljc0NvbnRleHQocmVjdCk7Cit9CisKKwordm9pZCBMYXllclNraWE6OnNl
dEJvdW5kcyhjb25zdCBTa0lSZWN0JiByZWN0KQoreworICAgIGlmIChyZWN0ID09IG1fYm91bmRz
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX2JvdW5kcyA9IHJlY3Q7CisKKyAgICAvLyBSZS1j
cmVhdGUgdGhlIGNhbnZhcyBhbmQgYXNzb2NpYXRlZCBjb250ZXh0cy4KKyAgICB1cGRhdGVHcmFw
aGljc0NvbnRleHQobV9ib3VuZHMpOworCisgICAgc2V0TmVlZHNDb21taXQoKTsKK30KKwordm9p
ZCBMYXllclNraWE6OnNldEZyYW1lKGNvbnN0IFNrUmVjdCYgcmVjdCkKK3sKKyAgICBtX2ZyYW1l
ID0gcmVjdDsKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCisKK0xheWVyU2tpYSogTGF5ZXJT
a2lhOjpyb290TGF5ZXIoKSBjb25zdAoreworICAgIExheWVyU2tpYSogbGF5ZXIgPSBjb25zdF9j
YXN0PExheWVyU2tpYSo+KHRoaXMpOworICAgIGZvciAoTGF5ZXJTa2lhKiBzdXBlcmxheWVyID0g
bGF5ZXItPnN1cGVybGF5ZXIoKTsgc3VwZXJsYXllcjsgbGF5ZXIgPSBzdXBlcmxheWVyLCBzdXBl
cmxheWVyID0gc3VwZXJsYXllci0+c3VwZXJsYXllcigpKSB7IH0KKyAgICByZXR1cm4gbGF5ZXI7
Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpyZW1vdmVBbGxTdWJsYXllcnMoKQoreworICAgIG1fc3Vi
bGF5ZXJzLmNsZWFyKCk7CisgICAgc2V0TmVlZHNDb21taXQoKTsKK30KKwordm9pZCBMYXllclNr
aWE6OnNldFN1YmxheWVycyhjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiYgc3VibGF5
ZXJzKQoreworICAgIG1fc3VibGF5ZXJzID0gc3VibGF5ZXJzOworfQorCit2b2lkIExheWVyU2tp
YTo6c2V0U3VwZXJsYXllcihMYXllclNraWEqIHN1cGVybGF5ZXIpCit7CisgICAgbV9zdXBlcmxh
eWVyID0gc3VwZXJsYXllcjsKK30KKworTGF5ZXJTa2lhKiBMYXllclNraWE6OnN1cGVybGF5ZXIo
KSBjb25zdAoreworICAgIHJldHVybiBtX3N1cGVybGF5ZXI7Cit9CisKK3ZvaWQgTGF5ZXJTa2lh
OjpzZXROZWVkc0Rpc3BsYXkoY29uc3QgU2tSZWN0JiBkaXJ0eVJlY3QpCit7CisgICAgLy8gVE9E
Tyh2YW5nZWxpcyk6IGltcGxlbWVudAorICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9CisKK3ZvaWQg
TGF5ZXJTa2lhOjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIC8vIFRPRE8odmFuZ2VsaXMpOiBp
bXBsZW1lbnQKK30KKworCit9CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEv
TGF5ZXJTa2lhLmNwcApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgTEYKCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5oCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5oCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
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
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgTGF5ZXJTa2lhX2gKKyNkZWZpbmUg
TGF5ZXJTa2lhX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1
ZGUgIlN0cmluZ0hhc2guaCIKKworI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisKKyNpbmNs
dWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJTa2lhLmgiCisj
aW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJp
eC5oIgorCisjaW5jbHVkZSAiU2tQb2ludC5oIgorI2luY2x1ZGUgIlNrQ29sb3IuaCIKKworbmFt
ZXNwYWNlIHNraWEgeworY2xhc3MgUGxhdGZvcm1DYW52YXM7Cit9CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgTGF5ZXJTa2lhIDogcHVibGljIFJlZkNvdW50ZWQ8TGF5ZXJTa2lhPiB7
CitwdWJsaWM6CisgICAgZW51bSBMYXllclR5cGUgeyBMYXllciwgVHJhbnNmb3JtTGF5ZXIgfTsK
KyAgICBlbnVtIEZpbHRlclR5cGUgeyBMaW5lYXIsIE5lYXJlc3QsIFRyaWxpbmVhciwgTGFuY3pv
cyB9OworICAgIGVudW0gQ29udGVudHNHcmF2aXR5VHlwZSB7IENlbnRlciwgVG9wLCBCb3R0b20s
IExlZnQsIFJpZ2h0LCBUb3BMZWZ0LCBUb3BSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBCb3R0b21MZWZ0LCBCb3R0b21SaWdodCwgUmVzaXplLCBSZXNpemVBc3BlY3QsIFJl
c2l6ZUFzcGVjdEZpbGwgfTsKKworICAgIHN0YXRpYyBQYXNzUmVmUHRyPExheWVyU2tpYT4gY3Jl
YXRlKExheWVyVHlwZSwgR3JhcGhpY3NMYXllclNraWEqIG93bmVyID0gMCk7CisKKyAgICB+TGF5
ZXJTa2lhKCk7CisKKyAgICB2b2lkIGRpc3BsYXkoUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqKTsK
KworICAgIHZvaWQgYWRkU3VibGF5ZXIoUGFzc1JlZlB0cjxMYXllclNraWE+IHN1YmxheWVyKTsK
KyAgICB2b2lkIGluc2VydFN1YmxheWVyKFBhc3NSZWZQdHI8TGF5ZXJTa2lhPiwgc2l6ZV90IGlu
ZGV4KTsKKyAgICB2b2lkIHJlcGxhY2VTdWJsYXllcihMYXllclNraWEqIHJlZmVyZW5jZSwgUGFz
c1JlZlB0cjxMYXllclNraWE+KTsKKyAgICB2b2lkIHJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisK
KyAgICBMYXllclNraWEqIGFuY2VzdG9yT3JTZWxmV2l0aFN1cGVybGF5ZXIoTGF5ZXJTa2lhKikg
Y29uc3Q7CisKKyAgICB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IFNrUG9pbnQmIGFuY2hvclBv
aW50KSB7IG1fYW5jaG9yUG9pbnQgPSBhbmNob3JQb2ludDsgc2V0TmVlZHNDb21taXQoKTsgfQor
ICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2FuY2hvclBvaW50OyB9
CisKKyAgICB2b2lkIHNldEFuY2hvclBvaW50WihmbG9hdCBhbmNob3JQb2ludFopIHsgbV9hbmNo
b3JQb2ludFogPSBhbmNob3JQb2ludFo7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBmbG9hdCBh
bmNob3JQb2ludFooKSBjb25zdCB7IHJldHVybiBtX2FuY2hvclBvaW50WjsgfQorCisgICAgdm9p
ZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsgbV9iYWNrZ3JvdW5kQ29sb3IgPSBj
b2xvcjsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIENvbG9yIGJhY2tncm91bmRDb2xvcigpIGNv
bnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9yOyB9CisKKyAgICB2b2lkIHNldEJvcmRlckNv
bG9yKGNvbnN0IENvbG9yJiBjb2xvcikgeyBtX2JvcmRlckNvbG9yID0gY29sb3I7IH0KKyAgICBD
b2xvciBib3JkZXJDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYm9yZGVyQ29sb3I7IH0KKworICAg
IHZvaWQgc2V0Qm9yZGVyV2lkdGgoZmxvYXQgd2lkdGgpIHsgbV9ib3JkZXJXaWR0aCA9IHdpZHRo
OyB9CisgICAgU2tTY2FsYXIgYm9yZGVyV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2JvcmRlcldp
ZHRoOyB9CisKKyAgICB2b2lkIHNldEJvdW5kcyhjb25zdCBTa0lSZWN0Jik7CisgICAgU2tJUmVj
dCBib3VuZHMoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kczsgfQorCisgICAgdm9pZCBzZXRDbGVh
cnNDb250ZXh0KGJvb2wgY2xlYXJzKSB7IG1fY2xlYXJzQ29udGV4dCA9IGNsZWFyczsgc2V0TmVl
ZHNDb21taXQoKTsgfQorICAgIGJvb2wgY2xlYXJzQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1f
Y2xlYXJzQ29udGV4dDsgfQorCisgICAgdm9pZCBzZXRDb250ZW50c0dyYXZpdHkoQ29udGVudHNH
cmF2aXR5VHlwZSBncmF2aXR5VHlwZSkgeyBtX2NvbnRlbnRzR3Jhdml0eSA9IGdyYXZpdHlUeXBl
OyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgQ29udGVudHNHcmF2aXR5VHlwZSBjb250ZW50c0dy
YXZpdHkoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRzR3Jhdml0eTsgfQorCisgICAgdm9pZCBz
ZXREb3VibGVTaWRlZChib29sIGRvdWJsZVNpZGVkKSB7IG1fZG91YmxlU2lkZWQgPSBkb3VibGVT
aWRlZDsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgZG91YmxlU2lkZWQoKSBjb25zdCB7
IHJldHVybiBtX2RvdWJsZVNpZGVkOyB9CisKKyAgICB2b2lkIHNldEVkZ2VBbnRpYWxpYXNpbmdN
YXNrKHVpbnQzMl90IG1hc2spIHsgbV9lZGdlQW50aWFsaWFzaW5nTWFzayA9IG1hc2s7IHNldE5l
ZWRzQ29tbWl0KCk7IH0KKyAgICB1aW50MzJfdCBlZGdlQW50aWFsaWFzaW5nTWFzaygpIGNvbnN0
IHsgcmV0dXJuIG1fZWRnZUFudGlhbGlhc2luZ01hc2s7IH0KKworICAgIHZvaWQgc2V0RnJhbWUo
Y29uc3QgU2tSZWN0Jik7CisgICAgU2tSZWN0IGZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9mcmFt
ZTsgfQorCisgICAgdm9pZCBzZXRIaWRkZW4oYm9vbCBoaWRkZW4pIHsgbV9oaWRkZW4gPSBoaWRk
ZW47IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBib29sIGlzSGlkZGVuKCkgY29uc3QgeyByZXR1
cm4gbV9oaWRkZW47IH0KKworICAgIHZvaWQgc2V0TWFza3NUb0JvdW5kcyhib29sIG1hc2tzVG9C
b3VuZHMpIHsgbV9tYXNrc1RvQm91bmRzID0gbWFza3NUb0JvdW5kczsgfQorICAgIGJvb2wgbWFz
a3NUb0JvdW5kcygpIGNvbnN0IHsgcmV0dXJuIG1fbWFza3NUb0JvdW5kczsgfQorCisgICAgdm9p
ZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkgeyBtX25hbWUgPSBuYW1lOyB9CisgICAgU3Ry
aW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKworICAgIHZvaWQgc2V0TmVlZHNE
aXNwbGF5KGNvbnN0IFNrUmVjdCYgZGlydHlSZWN0KTsKKyAgICB2b2lkIHNldE5lZWRzRGlzcGxh
eSgpOworCisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXlPbkJvdW5kc0NoYW5nZShib29sIG5lZWRz
RGlzcGxheSkgeyBtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdlID0gbmVlZHNEaXNwbGF5OyB9
CisKKyAgICB2b2lkIHNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkgeyBtX29wYWNpdHkgPSBvcGFj
aXR5OyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgZmxvYXQgb3BhY2l0eSgpIGNvbnN0IHsgcmV0
dXJuIG1fb3BhY2l0eTsgfQorCisgICAgdm9pZCBzZXRPcGFxdWUoYm9vbCBvcGFxdWUpIHsgbV9v
cGFxdWUgPSBvcGFxdWU7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBib29sIG9wYXF1ZSgpIGNv
bnN0IHsgcmV0dXJuIG1fb3BhcXVlOyB9CisKKyAgICB2b2lkIHNldFBvc2l0aW9uKGNvbnN0IFNr
UG9pbnQmIHBvc2l0aW9uKSB7CisgICAgICAgIG1fcG9zaXRpb24gPSBwb3NpdGlvbjsgIHNldE5l
ZWRzQ29tbWl0KCk7IH0KKworICAgIFNrUG9pbnQgcG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBt
X3Bvc2l0aW9uOyB9CisKKyAgICB2b2lkIHNldFpQb3NpdGlvbihmbG9hdCB6UG9zaXRpb24pIHsg
bV96UG9zaXRpb24gPSB6UG9zaXRpb247IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBTa1NjYWxh
ciB6UG9zaXRpb24oKSBjb25zdCB7ICByZXR1cm4gbV96UG9zaXRpb247IH0KKworICAgIExheWVy
U2tpYSogcm9vdExheWVyKCkgY29uc3Q7CisKKyAgICB2b2lkIHJlbW92ZUFsbFN1YmxheWVycygp
OworCisgICAgdm9pZCBzZXRTdWJsYXllcnMoY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllclNraWE+
ID4mKTsKKworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lhPj4mIGdldFN1YmxheWVy
cygpIGNvbnN0IHsgcmV0dXJuIG1fc3VibGF5ZXJzOyB9CisKKyAgICB2b2lkIHNldFN1YmxheWVy
VHJhbnNmb3JtKGNvbnN0IFNrTWF0cml4JiB0cmFuc2Zvcm0pIHsgbV9zdWJsYXllclRyYW5zZm9y
bSA9IHRyYW5zZm9ybTsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIFNrTWF0cml4IHN1YmxheWVy
VHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gbV9zdWJsYXllclRyYW5zZm9ybTsgfQorCisgICAg
dm9pZCBzZXRTdXBlcmxheWVyKExheWVyU2tpYSogc3VwZXJsYXllcik7CisgICAgTGF5ZXJTa2lh
KiBzdXBlcmxheWVyKCkgY29uc3Q7CisKKworICAgIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IFNr
TWF0cml4JiB0cmFuc2Zvcm0pIHsgbV90cmFuc2Zvcm0gPSB0cmFuc2Zvcm07IHNldE5lZWRzQ29t
bWl0KCk7IH0KKyAgICBTa01hdHJpeCB0cmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX3RyYW5z
Zm9ybTsgfQorCisgICAgdm9pZCBzZXRHZW9tZXRyeUZsaXBwZWQoYm9vbCBmbGlwcGVkKSB7IG1f
Z2VvbWV0cnlGbGlwcGVkID0gZmxpcHBlZDsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wg
Z2VvbWV0cnlGbGlwcGVkKCkgY29uc3QgeyByZXR1cm4gbV9nZW9tZXRyeUZsaXBwZWQ7IH0KKwor
ICAgIHZvaWQgdXBkYXRlQ29udGVudHMoKTsKKworICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBw
bGF0Zm9ybUNhbnZhcygpIHsgcmV0dXJuIG1fY2FudmFzOyB9CisgICAgR3JhcGhpY3NDb250ZXh0
KiBncmFwaGljc0NvbnRleHQoKSB7IHJldHVybiBtX2dyYXBoaWNzQ29udGV4dDsgfQorCisgICAg
dm9pZCBzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IFNrSVJlY3QmIHJlY3QpOworCitwcml2YXRl
OgorICAgIExheWVyU2tpYShMYXllclR5cGUsIEdyYXBoaWNzTGF5ZXJTa2lhKiBvd25lcik7CisK
KyAgICB2b2lkIHNldE5lZWRzQ29tbWl0KCk7CisKKyAgICB2b2lkIHBhaW50TWUoKTsKKworICAg
IHNpemVfdCBudW1TdWJsYXllcnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc3Vi
bGF5ZXJzLnNpemUoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUg
cGFzc2VkIGxheWVyIGluIHRoaXMgbGF5ZXIncyBzdWJsYXllcnMgbGlzdAorICAgIC8vIG9yIC0x
IGlmIG5vdCBmb3VuZAorICAgIGludCBpbmRleE9mU3VibGF5ZXIoY29uc3QgTGF5ZXJTa2lhKik7
CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHJlbW92ZUZyb21TdXBl
cmxheWVyLgorICAgIHZvaWQgcmVtb3ZlU3VibGF5ZXIoTGF5ZXJTa2lhKik7CisKKyAgICAvLyBS
ZS1jcmVhdGVkIHRoZSBjYW52YXMgYW5kIGdyYXBoaWNzIGNvbnRleHQuICBUaGlzIG1ldGhvZAor
ICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGxheWVyIGlzIHJlc2l6ZWQuCisg
ICAgdm9pZCB1cGRhdGVHcmFwaGljc0NvbnRleHQoY29uc3QgU2tJUmVjdCYgcmVjdCk7CisKKyAg
ICBWZWN0b3I8IFJlZlB0cjxMYXllclNraWE+ID4gbV9zdWJsYXllcnM7CisgICAgTGF5ZXJTa2lh
KiBtX3N1cGVybGF5ZXI7CisKKyAgICBib29sIG1fbmVlZHNEaXNwbGF5T25Cb3VuZHNDaGFuZ2U7
CisgICAgR3JhcGhpY3NMYXllclNraWEqIG1fb3duZXI7CisKKyAgICBza2lhOjpQbGF0Zm9ybUNh
bnZhcyogbV9jYW52YXM7CisgICAgUGxhdGZvcm1Db250ZXh0U2tpYSogbV9za2lhQ29udGV4dDsK
KyAgICBHcmFwaGljc0NvbnRleHQqIG1fZ3JhcGhpY3NDb250ZXh0OworICAgIENvbG9yIG1fYm9y
ZGVyQ29sb3I7CisgICAgZmxvYXQgbV9ib3JkZXJXaWR0aDsKKworICAgIExheWVyVHlwZSBtX2xh
eWVyVHlwZTsKKworICAgIFNrSVJlY3QgbV9ib3VuZHM7CisgICAgU2tJUmVjdCBtX2JhY2tpbmdT
dG9yZVJlY3Q7CisgICAgU2tQb2ludCBtX3Bvc2l0aW9uOworICAgIFNrUG9pbnQgbV9hbmNob3JQ
b2ludDsKKyAgICBmbG9hdCBtX2FuY2hvclBvaW50WjsKKyAgICBDb2xvciBtX2JhY2tncm91bmRD
b2xvcjsKKyAgICBib29sIG1fY2xlYXJzQ29udGV4dDsKKyAgICBib29sIG1fZG91YmxlU2lkZWQ7
CisgICAgdWludDMyX3QgbV9lZGdlQW50aWFsaWFzaW5nTWFzazsKKyAgICBTa1JlY3QgbV9mcmFt
ZTsKKyAgICBib29sIG1faGlkZGVuOworICAgIGJvb2wgbV9tYXNrc1RvQm91bmRzOworICAgIENv
bnRlbnRzR3Jhdml0eVR5cGUgbV9jb250ZW50c0dyYXZpdHk7CisgICAgZmxvYXQgbV9vcGFjaXR5
OworICAgIGJvb2wgbV9vcGFxdWU7CisgICAgZmxvYXQgbV96UG9zaXRpb247CisgICAgYm9vbCBt
X2dlb21ldHJ5RmxpcHBlZDsKKyAgICBTdHJpbmcgbV9uYW1lOworCisgICAgU2tNYXRyaXggbV90
cmFuc2Zvcm07CisgICAgU2tNYXRyaXggbV9zdWJsYXllclRyYW5zZm9ybTsKK307CisKK30KKwor
I2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmIC8vIFdLQ0FD
RkxheWVyX2gKClByb3BlcnR5IGNoYW5nZXMgb246IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9MYXllclNraWEuaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgTEYK
CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9j
aHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU1NDI4KQorKysgV2ViS2l0L2Nocm9taXVtL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQxIEBACisyMDEwLTAzLTAyICBWYW5n
ZWxpcyBLb2trZXZpcyAgPHZhbmdlbGlzQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGRpbmcgc3VwcG9ydCBmb3IgdGhlIEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HIHJlbmRlciBwYXRoIHRvIENocm9taXVtLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAgICAgQ3Vy
cmVudGx5IGNvbXBvc2l0aW5nIG9mIGxheWVycyBpcyBwZXJmb3JtZWQgdmlhIHMvdyBjb21wb3Np
dG9yIHdoaWNoIHJlbGllcyBvbiBTa2lhLiBUaGlzIGlzIGFuIGluaXRpYWwgY2hlY2staW4KKyAg
ICAgICAgYW5kIGl0J3Mgb25seSBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzLiBDb21waWxpbmcgdGhl
IGNvZGUgcmVxdWlyZXMgc2V0aW5nICJ1c2VfYWNjZWxlcmF0ZWRfY29tcG9zaXRpbmc9MSIKKyAg
ICAgICAgdG8gR1lQX0RFRklORVMuIFRoZSB1cGRhdGUgb2YgbGF5ZXIgY29udGVudHMgYW5kIGNv
bXBvc2l0aW5nIGlzIGZhaXJseSBpbmVmZmljaWVudCBidXQgdGhpcyB3aWxsIGJlIGZpeGVkIGlu
CisgICAgICAgIHN1YnNlcXVlbnQgY2hlY2staW5zLgorCisgICAgICAgICogc3JjL0Nocm9tZUNs
aWVudEltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpDaHJvbWVDbGllbnRJbXBsOjphdHRhY2hS
b290R3JhcGhpY3NMYXllcik6CisgICAgICAgIChXZWJLaXQ6OkNocm9tZUNsaWVudEltcGw6OnNj
aGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMpOgorICAgICAgICAqIHNyYy9DaHJvbWVDbGllbnRJ
bXBsLmg6CisgICAgICAgIChXZWJLaXQ6OkNocm9tZUNsaWVudEltcGw6OnNldE5lZWRzT25lU2hv
dERyYXdpbmdTeW5jaHJvbml6YXRpb24pOgorICAgICAgICAgQWRkZWQgbWV0aG9kcyByZXF1aXJl
ZCBieSB0aGUgUmVuZGVyTGF5ZXJDb21wb3NpdG9yCisKKyAgICAgICAgKiBzcmMvV2ViRnJhbWVJ
bXBsLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViRnJhbWVJbXBsOjpwYWludFdpdGhDb250ZXh0
KToKKyAgICAgICAgKFdlYktpdDo6V2ViRnJhbWVJbXBsOjpwYWludCk6CisgICAgICAgICogc3Jj
L1dlYkZyYW1lSW1wbC5oOgorICAgICAgICBTcGxpdCBXZWJGcmFtZUltcGw6OnBhaW50KCkgaW50
byB0d28gbWV0aG9kcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGNhbGwgdGhlIHBhaW50CisgICAg
ICAgIHJvdXRpbmUgd2l0aCBhbiBleGlzdGluZyBHcmFwaGljc0NvbnRleHQsIHdoaWNoIGlzIG5l
Y2Vzc2FyeSBmb3IgcGFpbnRpbmcgdGhlIHJvb3QgbGF5ZXIgaW50bworICAgICAgICBpdHMgb3du
IGJhY2tpbmcgc3VyZmFjZS4KKworICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAg
ICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpwYWludCk6CisgICAgICAgIE1vZGlmaWVkIG1ldGhvZCB0byBoYW5kbGUg
dGhlIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIHBhdGguIE5vdywgd2hlbiBkb2luZyBhY2NlbGVy
YXRlZCBjb21wb3NpdGluZywKKyAgICAgICAgcGFpbnQoKSByZXN1bHRzIHRvIHJlcGFpbnRpbmcg
dGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGxheWVyIGFuZCB0aGVuIGRvaW5nIGEgY29tcG9zaXRl
IG9wZXJhdGlvbi4KKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNldFJvb3RHcmFwaGlj
c0xheWVyKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNldEFjY2VsZXJhdGVkQ29t
cG9zaXRpbmcpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6dXBkYXRlUm9vdExheWVy
Q29udGVudHMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6c2V0Um9vdExheWVyTmVl
ZHNEaXNwbGF5KToKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuaDoKKyAgICAgICAgKFdlYktp
dDo6V2ViVmlld0ltcGw6OmlzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyk6CisKIDIwMTAtMDMtMDIg
IENocmlzIEZsZWl6YWNoICA8Y2ZsZWl6YWNoQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBCZXRoIERha2luLgpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJ
bXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudElt
cGwuY3BwCShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xp
ZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlICJH
ZW9sb2NhdGlvblNlcnZpY2UuaCIKICNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2VD
aHJvbWl1bS5oIgogI2luY2x1ZGUgIkdlb2xvY2F0aW9uU2VydmljZUNocm9taXVtLmgiCisjaW5j
bHVkZSAiR3JhcGhpY3NMYXllci5oIgogI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKICNpbmNs
dWRlICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAiTm9kZS5oIgpAQCAtNjg5LDQgKzY5MCwxNiBAQCB2
b2lkIENocm9tZUNsaWVudEltcGw6OnJlcXVlc3RHZW9sb2NhdGlvCiAgICAgbV93ZWJWaWV3LT5j
bGllbnQoKS0+Z2V0R2VvbG9jYXRpb25TZXJ2aWNlKCktPnJlcXVlc3RQZXJtaXNzaW9uRm9yRnJh
bWUoZ2VvbG9jYXRpb25TZXJ2aWNlLT5nZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2UoKS0+Z2V0QnJp
ZGdlSWQoKSwgZnJhbWUtPmRvY3VtZW50KCktPnVybCgpKTsKIH0KIAorI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKK3ZvaWQgQ2hyb21lQ2xpZW50SW1wbDo6YXR0YWNoUm9vdEdyYXBo
aWNzTGF5ZXIoRnJhbWUqIGZyYW1lLCBHcmFwaGljc0xheWVyKiBncmFwaGljc0xheWVyKQorewor
ICAgIG1fd2ViVmlldy0+c2V0Um9vdEdyYXBoaWNzTGF5ZXIoZ3JhcGhpY3NMYXllciA/IGdyYXBo
aWNzTGF5ZXItPnBsYXRmb3JtTGF5ZXIoKSA6IDApOworfQorCit2b2lkIENocm9tZUNsaWVudElt
cGw6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMoKQoreworICAgIG1fd2ViVmlldy0+c2V0
Um9vdExheWVyTmVlZHNEaXNwbGF5KCk7Cit9CisjZW5kaWYKKwogfSAvLyBuYW1lc3BhY2UgV2Vi
S2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwuaAkocmV2aXNpb24g
NTU0MjgpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMTI5LDYgKzEyOSwxNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGZv
cm1TdGF0ZURpZENoYW5nZShjb25zdCBXZWJDb3JlOjpOb2RlKik7CiAgICAgdmlydHVhbCBQYXNz
T3duUHRyPFdlYkNvcmU6OkhUTUxQYXJzZXJRdWlya3M+IGNyZWF0ZUhUTUxQYXJzZXJRdWlya3Mo
KSB7IHJldHVybiAwOyB9CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAg
Ly8gUGFzcyAwIGFzIHRoZSBHcmFwaGljc0xheWVyIHRvIGRldGF0Y2ggdGhlIHJvb3QgbGF5ZXIu
CisgICAgdmlydHVhbCB2b2lkIGF0dGFjaFJvb3RHcmFwaGljc0xheWVyKFdlYkNvcmU6OkZyYW1l
KiwgV2ViQ29yZTo6R3JhcGhpY3NMYXllciopOworICAgIC8vIFNldHMgYSBmbGFnIHRvIHNwZWNp
ZnkgdGhhdCB0aGUgbmV4dCB0aW1lIGNvbnRlbnQgaXMgZHJhd24gdG8gdGhlIHdpbmRvdywKKyAg
ICAvLyB0aGUgY2hhbmdlcyBhcHBlYXIgb24gdGhlIHNjcmVlbiBpbiBzeW5jaHJvbnkgd2l0aCB1
cGRhdGVzIHRvIEdyYXBoaWNzTGF5ZXJzLgorICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc09uZVNo
b3REcmF3aW5nU3luY2hyb25pemF0aW9uKCkgeyB9CisgICAgLy8gU2V0cyBhIGZsYWcgdG8gc3Bl
Y2lmeSB0aGF0IHRoZSB2aWV3IG5lZWRzIHRvIGJlIHVwZGF0ZWQsIHNvIHdlIG5lZWQKKyAgICAv
LyB0byBkbyBhbiBlYWdlciBsYXlvdXQgYmVmb3JlIHRoZSBkcmF3aW5nLgorICAgIHZpcnR1YWwg
dm9pZCBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKCk7CisjZW5kaWYKICAgICAvLyBDaHJv
bWVDbGllbnRDaHJvbWl1bSBtZXRob2RzOgogICAgIHZpcnR1YWwgdm9pZCBwb3B1cE9wZW5lZChX
ZWJDb3JlOjpQb3B1cENvbnRhaW5lciogcG9wdXBDb250YWluZXIsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGJvdW5kcywKSW5kZXg6IFdlYktp
dC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hy
b21pdW0vc3JjL1dlYkZyYW1lSW1wbC5jcHAJKHJldmlzaW9uIDU1NDI4KQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJGcmFtZUltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNjQzLDExICsx
NjQzLDIzIEBAIHZvaWQgV2ViRnJhbWVJbXBsOjpsYXlvdXQoKQogICAgICAgICB2aWV3LT5sYXlv
dXRJZk5lZWRlZFJlY3Vyc2l2ZSgpOwogfQogCit2b2lkIFdlYkZyYW1lSW1wbDo6cGFpbnRXaXRo
Q29udGV4dChHcmFwaGljc0NvbnRleHQmIGdjLCBjb25zdCBXZWJSZWN0JiByZWN0KQoreworICAg
IEludFJlY3QgZGlydHlSZWN0KHJlY3QpOworICAgIGdjLnNhdmUoKTsKKyAgICBpZiAobV9mcmFt
ZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZVZpZXcoKSkgeworICAgICAgICBnYy5jbGlwKGRpcnR5UmVj
dCk7CisgICAgICAgIGZyYW1lVmlldygpLT5wYWludCgmZ2MsIGRpcnR5UmVjdCk7CisgICAgICAg
IG1fZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5kcmF3Tm9kZUhpZ2hsaWdo
dChnYyk7CisgICAgfSBlbHNlCisgICAgICAgIGdjLmZpbGxSZWN0KGRpcnR5UmVjdCwgQ29sb3I6
OndoaXRlLCBEZXZpY2VDb2xvclNwYWNlKTsKKyAgICBnYy5yZXN0b3JlKCk7Cit9CisKIHZvaWQg
V2ViRnJhbWVJbXBsOjpwYWludChXZWJDYW52YXMqIGNhbnZhcywgY29uc3QgV2ViUmVjdCYgcmVj
dCkKIHsKICAgICBpZiAocmVjdC5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsKLSAgICBJbnRS
ZWN0IGRpcnR5UmVjdChyZWN0KTsKICNpZiBXRUJLSVRfVVNJTkdfQ0cKICAgICBHcmFwaGljc0Nv
bnRleHQgZ2MoY2FudmFzKTsKICAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxD
b250ZXh0KCZnYyk7CkBAIC0xNjU5LDE0ICsxNjcxLDcgQEAgdm9pZCBXZWJGcmFtZUltcGw6OnBh
aW50KFdlYkNhbnZhcyogY2FudgogI2Vsc2UKICAgICBub3RJbXBsZW1lbnRlZCgpOwogI2VuZGlm
Ci0gICAgZ2Muc2F2ZSgpOwotICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpICYmIGZyYW1lVmll
dygpKSB7Ci0gICAgICAgIGdjLmNsaXAoZGlydHlSZWN0KTsKLSAgICAgICAgZnJhbWVWaWV3KCkt
PnBhaW50KCZnYywgZGlydHlSZWN0KTsKLSAgICAgICAgbV9mcmFtZS0+cGFnZSgpLT5pbnNwZWN0
b3JDb250cm9sbGVyKCktPmRyYXdOb2RlSGlnaGxpZ2h0KGdjKTsKLSAgICB9IGVsc2UKLSAgICAg
ICAgZ2MuZmlsbFJlY3QoZGlydHlSZWN0LCBDb2xvcjo6d2hpdGUsIERldmljZUNvbG9yU3BhY2Up
OwotICAgIGdjLnJlc3RvcmUoKTsKKyAgICBwYWludFdpdGhDb250ZXh0KGdjLCByZWN0KTsKIH0K
IAogdm9pZCBXZWJGcmFtZUltcGw6OmNyZWF0ZUZyYW1lVmlldygpCkluZGV4OiBXZWJLaXQvY2hy
b21pdW0vc3JjL1dlYkZyYW1lSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvV2ViRnJhbWVJbXBsLmgJKHJldmlzaW9uIDU1NDI4KQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJGcmFtZUltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1
ZGUgIldlYkFuaW1hdGlvbkNvbnRyb2xsZXJJbXBsLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
K2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKIGNsYXNzIEhpc3RvcnlJdGVtOwogY2xhc3MgS1VSTDsK
IGNsYXNzIE5vZGU7CkBAIC0xODAsNiArMTgxLDcgQEAgcHVibGljOgogCiAgICAgdm9pZCBsYXlv
dXQoKTsKICAgICB2b2lkIHBhaW50KFdlYkNhbnZhcyosIGNvbnN0IFdlYlJlY3QmKTsKKyAgICB2
b2lkIHBhaW50V2l0aENvbnRleHQoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0JiwgY29uc3QgV2Vi
UmVjdCYpOwogICAgIHZvaWQgY3JlYXRlRnJhbWVWaWV3KCk7CiAKICAgICBzdGF0aWMgV2ViRnJh
bWVJbXBsKiBmcm9tRnJhbWUoV2ViQ29yZTo6RnJhbWUqIGZyYW1lKTsKSW5kZXg6IFdlYktpdC9j
aHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1
bS9zcmMvV2ViVmlld0ltcGwuY3BwCShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYktpdC9jaHJvbWl1
bS9zcmMvV2ViVmlld0ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTAsNiArMTEwLDEzIEBA
CiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKICNlbmRpZgogCisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorI2luY2x1ZGUgIndlYmtpdC9nbHVlL3dlYmtpdF9nbHVlLmgiCisjaWYg
V0VCS0lUX1VTSU5HX1NLSUEKKyNpbmNsdWRlICJza2lhL0xheWVyU2tpYS5oIgorI2VuZGlmCisj
ZW5kaWYKKwogLy8gR2V0IHJpZCBvZiBXVEYncyBwb3cgZGVmaW5lIHNvIHdlIGNhbiB1c2Ugc3Rk
Ojpwb3cuCiAjdW5kZWYgcG93CiAjaW5jbHVkZSA8Y21hdGg+IC8vIGZvciBzdGQ6OnBvdwpAQCAt
MjQ1LDYgKzI1MiwxMCBAQCBXZWJWaWV3SW1wbDo6V2ViVmlld0ltcGwoV2ViVmlld0NsaWVudCog
CiAgICAgLCBtX3N1Z2dlc3Rpb25zUG9wdXAoMCkKICAgICAsIG1faXNUcmFuc3BhcmVudChmYWxz
ZSkKICAgICAsIG1fdGFic1RvTGlua3MoZmFsc2UpCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgICwgbV9sYXllclJlbmRlcmVyKDApCisgICAgLCBtX2lzQWNjZWxlcmF0ZWRD
b21wb3NpdGluZyhmYWxzZSkKKyNlbmRpZgogewogICAgIC8vIFdlYktpdC93aW4vV2ViVmlldy5j
cHAgZG9lcyB0aGUgc2FtZSB0aGluZywgZXhjZXB0IHRoZXkgY2FsbCB0aGUKICAgICAvLyBLSlMg
c3BlY2lmaWMgd3JhcHBlciBhcm91bmQgdGhpcyBtZXRob2QuIFdlIG5lZWQgdG8gaGF2ZSB0aHJl
YWRpbmcKQEAgLTg3Myw5ICs4ODQsMzAgQEAgdm9pZCBXZWJWaWV3SW1wbDo6bGF5b3V0KCkKIAog
dm9pZCBXZWJWaWV3SW1wbDo6cGFpbnQoV2ViQ2FudmFzKiBjYW52YXMsIGNvbnN0IFdlYlJlY3Qm
IHJlY3QpCiB7Ci0gICAgV2ViRnJhbWVJbXBsKiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKTsK
LSAgICBpZiAod2ViZnJhbWUpCi0gICAgICAgIHdlYmZyYW1lLT5wYWludChjYW52YXMsIHJlY3Qp
OworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmICghaXNBY2NlbGVy
YXRlZENvbXBvc2l0aW5nKCkpIHsKKyNlbmRpZgorICAgICAgICBXZWJGcmFtZUltcGwqIHdlYmZy
YW1lID0gbWFpbkZyYW1lSW1wbCgpOworICAgICAgICBpZiAod2ViZnJhbWUpCisgICAgICAgICAg
ICB3ZWJmcmFtZS0+cGFpbnQoY2FudmFzLCByZWN0KTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRHJhdyB0aGUgY29udGVudHMgb2Yg
dGhlIHJvb3QgbGF5ZXIKKyAgICAgICAgdXBkYXRlUm9vdExheWVyQ29udGVudHMocmVjdCk7CisK
KyAgICAgICAgLy8gVE9ETyh2YW5nZWxpcyk6IExheWVycyBzaG91bGQgbm90IGJlIGZvcmNlZCB0
byByZWRyYXcgdGhlaXIgY29udGVudHMKKyAgICAgICAgLy8gaGVyZSBidXQgc2hvdWxkIHVwZGF0
ZSBhcyBuZWVkZWQuCisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+dXBkYXRlTGF5ZXJDb250ZW50
cygpOworCisgICAgICAgIC8vIENvbXBvc2l0ZSBldmVyeXRoaW5nIGludG8gdGhlIGNhbnZhcyB0
aGF0J3MgcGFzc2VkIHRvIHVzLgorICAgICAgICBTa0lSZWN0IGNhbnZhc0lSZWN0OworICAgICAg
ICBjYW52YXNJUmVjdC5zZXQocmVjdC54LCByZWN0LnksIHJlY3QueCtyZWN0LndpZHRoLCByZWN0
LnkrcmVjdC5oZWlnaHQpOworICAgICAgICBTa1JlY3QgY2FudmFzUmVjdDsKKyAgICAgICAgY2Fu
dmFzUmVjdC5zZXQoY2FudmFzSVJlY3QpOworICAgICAgICBtX2xheWVyUmVuZGVyZXItPmRyYXdM
YXllcnNJbkNhbnZhcyhzdGF0aWNfY2FzdDxza2lhOjpQbGF0Zm9ybUNhbnZhcyo+KGNhbnZhcyks
IGNhbnZhc1JlY3QpOworICAgIH0KKyNlbmRpZgogfQogCiAvLyBGSVhNRTogbV9jdXJyZW50SW5w
dXRFdmVudCBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIENocm9tZUNsaWVudDo6c2hvdygpIGNhbgpA
QCAtMTkxNiw0ICsxOTQ4LDgyIEBAIGJvb2wgV2ViVmlld0ltcGw6OnRhYnNUb0xpbmtzKCkgY29u
c3QKICAgICByZXR1cm4gbV90YWJzVG9MaW5rczsKIH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKK3ZvaWQgV2ViVmlld0ltcGw6OnNldFJvb3RHcmFwaGljc0xheWVyKFdlYkNv
cmU6OlBsYXRmb3JtTGF5ZXIqIGxheWVyKQoreworICAgIHNldEFjY2VsZXJhdGVkQ29tcG9zaXRp
bmcobGF5ZXIgPyB0cnVlIDogZmFsc2UpOworICAgIGlmIChtX2xheWVyUmVuZGVyZXIpCisgICAg
ICAgIG1fbGF5ZXJSZW5kZXJlci0+c2V0Um9vdExheWVyKGxheWVyKTsKK30KKwordm9pZCBXZWJW
aWV3SW1wbDo6c2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhib29sIGFjY2VsZXJhdGVkKQorewor
ICAgIGlmIChtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyA9PSBhY2NlbGVyYXRlZCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKGFjY2VsZXJhdGVkKSB7CisgICAgICAgIG1fbGF5ZXJSZW5k
ZXJlciA9IExheWVyUmVuZGVyZXJTa2lhOjpjcmVhdGUoKTsKKyAgICAgICAgaWYgKG1fbGF5ZXJS
ZW5kZXJlcikgeworICAgICAgICAgICAgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcgPSB0cnVl
OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9sYXllclJlbmRlcmVyID0gMDsK
KyAgICAgICAgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcgPSBmYWxzZTsKKyAgICB9Cit9CisK
K3ZvaWQgV2ViVmlld0ltcGw6OnVwZGF0ZVJvb3RMYXllckNvbnRlbnRzKGNvbnN0IFdlYlJlY3Qm
IHJlY3QpCit7CisgICAgaWYgKCFpc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgV2ViRnJhbWVJbXBsKiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKTsK
KyAgICBpZiAod2ViZnJhbWUpIHsKKyAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gd2ViZnJhbWUt
PmZyYW1lVmlldygpOworICAgICAgICBpZiAodmlldykgeworICAgICAgICAgICAgV2ViUmVjdCB2
aWV3UmVjdCA9IHZpZXctPmZyYW1lUmVjdCgpOworCisgICAgICAgICAgICBTa0lSZWN0IHNjcm9s
bEZyYW1lOworICAgICAgICAgICAgc2Nyb2xsRnJhbWUuc2V0KHZpZXctPnNjcm9sbFgoKSwgdmll
dy0+c2Nyb2xsWSgpLCB2aWV3LT5sYXlvdXRXaWR0aCgpK3ZpZXctPnNjcm9sbFgoKSwgdmlldy0+
bGF5b3V0SGVpZ2h0KCkrdmlldy0+c2Nyb2xsWSgpKTsKKyAgICAgICAgICAgIG1fbGF5ZXJSZW5k
ZXJlci0+c2V0U2Nyb2xsRnJhbWUoc2Nyb2xsRnJhbWUpOworICAgICAgICAgICAgTGF5ZXJTa2lh
KiByb290TGF5ZXIgPSBtX2xheWVyUmVuZGVyZXItPnJvb3RMYXllcigpOworICAgICAgICAgICAg
aWYgKHJvb3RMYXllcikgeworICAgICAgICAgICAgICAgIFNrSVJlY3Qgcm9vdExheWVyQm91bmRz
OworICAgICAgICAgICAgICAgIEludFJlY3QgdmlzaWJsZVJlY3QgPSB2aWV3LT52aXNpYmxlQ29u
dGVudFJlY3QodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGJhY2tpbmcgc3Rv
cmUgc2l6ZSB1c2VkIGJ5IHRoZSByb290IGxheWVyIHRvIGJlIHRoZSBzaXplIG9mIHRoZSB2aXNp
YmxlCisgICAgICAgICAgICAgICAgLy8gYXJlYS4gIE5vdGUgdGhhdCB0aGUgcm9vdCBsYXllciBi
b3VuZHMgY291bGQgYmUgbGFyZ2VyIHRoYW4gdGhlIGJhY2tpbmcgc3RvcmUgc2l6ZQorICAgICAg
ICAgICAgICAgIC8vIGJ1dCB0aGVyZSdzIG5vIHJlYXNvbiB0byB3YXN0ZSBtZW1vcnkgYnkgYWxs
b2NhdGluZyBiYWNraW5nIHN0b3JlIGxhcmdlciB0aGFuIHRoZQorICAgICAgICAgICAgICAgIC8v
IHZpc2libGUgcG9ydGlvbi4KKyAgICAgICAgICAgICAgICByb290TGF5ZXJCb3VuZHMuc2V0KDAs
IDAsIHZpc2libGVSZWN0LndpZHRoKCksIHZpc2libGVSZWN0LmhlaWdodCgpKTsKKyAgICAgICAg
ICAgICAgICByb290TGF5ZXItPnNldEJhY2tpbmdTdG9yZVJlY3Qocm9vdExheWVyQm91bmRzKTsK
KyAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRleHQqIHJvb3RMYXllckNvbnRleHQgPSByb290
TGF5ZXItPmdyYXBoaWNzQ29udGV4dCgpOworICAgICAgICAgICAgICAgIHJvb3RMYXllckNvbnRl
eHQtPnNhdmUoKTsKKworICAgICAgICAgICAgICAgIHdlYmZyYW1lLT5wYWludFdpdGhDb250ZXh0
KCoocm9vdExheWVyLT5ncmFwaGljc0NvbnRleHQoKSksIHJlY3QpOworICAgICAgICAgICAgICAg
IHJvb3RMYXllckNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBXZWJWaWV3SW1wbDo6c2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCkK
K3sKKyAgICAvLyBUT0RPKHZhbmdlbGlzKTogRm9yIG5vdyB3ZSdyZSBwb3N0aW5nIGEgcmVwYWlu
dCBldmVudCBmb3IgdGhlIGVudGlyZSBwYWdlCisgICAgLy8gICAgICAgICAgICAgICAgIHdoaWNo
IGlzIGFuIG92ZXJraWxsLgorICAgIFdlYkZyYW1lSW1wbCogd2ViZnJhbWUgPSBtYWluRnJhbWVJ
bXBsKCk7CisgICAgaWYgKHdlYmZyYW1lKSB7CisgICAgICAgIEZyYW1lVmlldyogdmlldyA9IHdl
YmZyYW1lLT5mcmFtZVZpZXcoKTsKKyAgICAgICAgaWYgKHZpZXcpIHsKKyAgICAgICAgICAgIElu
dFJlY3QgdmlzaWJsZVJlY3QgPSB2aWV3LT52aXNpYmxlQ29udGVudFJlY3QodHJ1ZSk7CisgICAg
ICAgICAgICBtX2NsaWVudC0+ZGlkSW52YWxpZGF0ZVJlY3QodmlzaWJsZVJlY3QpOworICAgICAg
ICB9CisgICAgfQorCisgICAgaWYgKG1fbGF5ZXJSZW5kZXJlcikKKyAgICAgICAgbV9sYXllclJl
bmRlcmVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKK30KKworI2VuZGlmCisKIH0gLy8gbmFtZXNwYWNl
IFdlYktpdApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAkocmV2aXNpb24gNTU0Mjgp
CisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAg
LTQzLDkgKzQzLDE2IEBACiAjaW5jbHVkZSAiQ29udGV4dE1lbnVDbGllbnRJbXBsLmgiCiAjaW5j
bHVkZSAiRHJhZ0NsaWVudEltcGwuaCIKICNpbmNsdWRlICJFZGl0b3JDbGllbnRJbXBsLmgiCisj
aW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgogI2luY2x1ZGUgIkluc3BlY3RvckNsaWVudEltcGwu
aCIKICNpbmNsdWRlICJOb3RpZmljYXRpb25QcmVzZW50ZXJJbXBsLmgiCiAKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisjaWYgV0VCS0lUX1VTSU5HX1NLSUEKKyNpbmNsdWRlICJz
a2lhL0xheWVyUmVuZGVyZXJTa2lhLmgiCisjZW5kaWYKKyNlbmRpZgorCiAjaW5jbHVkZSA8d3Rm
L093blB0ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAKQEAgLTI5Niw2ICszMDMs
MTEgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gbV9jdXJyZW50SW5wdXRFdmVudDsKICAgICB9
CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgdm9pZCBzZXRSb290TGF5
ZXJOZWVkc0Rpc3BsYXkoKTsKKyAgICB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKFdlYkNvcmU6
OlBsYXRmb3JtTGF5ZXIqIGxheWVyKTsKKyNlbmRpZgorCiBwcml2YXRlOgogICAgIGZyaWVuZCBj
bGFzcyBXZWJWaWV3OyAgLy8gU28gV2ViVmlldzo6Q3JlYXRlIGNhbiBjYWxsIG91ciBjb25zdHJ1
Y3RvcgogICAgIGZyaWVuZCBjbGFzcyBXVEY6OlJlZkNvdW50ZWQ8V2ViVmlld0ltcGw+OwpAQCAt
MzIxLDYgKzMzMywxMiBAQCBwcml2YXRlOgogICAgIC8vIHRoZSBIaXRUZXN0UmVzdWx0IGZvciBp
dC4KICAgICBXZWJDb3JlOjpIaXRUZXN0UmVzdWx0IGhpdFRlc3RSZXN1bHRGb3JXaW5kb3dQb3Mo
Y29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKTsKIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICB2b2lkIHNldEFjY2VsZXJhdGVkQ29tcG9zaXRpbmcoYm9vbCk7CisgICAgYm9v
bCBpc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSB7IHJldHVybiBtX2lzQWNjZWxlcmF0ZWRDb21w
b3NpdGluZzsgfQorICAgIHZvaWQgdXBkYXRlUm9vdExheWVyQ29udGVudHMoY29uc3QgV2ViUmVj
dCYgcmVjdCk7CisjZW5kaWYKKwogICAgIFdlYlZpZXdDbGllbnQqIG1fY2xpZW50OwogCiAgICAg
QmFja0ZvcndhcmRMaXN0Q2xpZW50SW1wbCBtX2JhY2tGb3J3YXJkTGlzdENsaWVudEltcGw7CkBA
IC00NDYsOSArNDY0LDE0IEBAIHByaXZhdGU6CiAgICAgTm90aWZpY2F0aW9uUHJlc2VudGVySW1w
bCBtX25vdGlmaWNhdGlvblByZXNlbnRlcjsKICNlbmRpZgogCisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorICAgIE93blB0cjxXZWJDb3JlOjpMYXllclJlbmRlcmVyU2tpYT4gbV9s
YXllclJlbmRlcmVyOworICAgIGJvb2wgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmc7CisjZW5k
aWYKKwogICAgIHN0YXRpYyBjb25zdCBXZWJJbnB1dEV2ZW50KiBtX2N1cnJlbnRJbnB1dEV2ZW50
OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CiAKLSNlbmRpZgorI2VuZGlmClwgTm8gbmV3
bGluZSBhdCBlbmQgb2YgZmlsZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49861</attachid>
            <date>2010-03-02 16:04:18 -0800</date>
            <delta_ts>2010-03-04 15:37:03 -0800</delta_ts>
            <desc>Proposed patch with style issues fixed</desc>
            <filename>skiaCompositor_2.txt</filename>
            <type>text/plain</type>
            <size>64764</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMTAtMDMtMDIgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudCBzL3cgY29tcG9zaXRlZCBncmFwaGljcyBsYXllcnMgaW4gQ2hyb21p
dW0gdXNpbmcgdGhlIFNraWEgbGlicmFyeQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAgICAgVGhpcyBpcyBhbiBpbml0aWFsIHN0ZXAg
aW4gdGhlIGltcGxlbWVudGF0aW9uLiBMYXllciBjb21wb3NpdGluZyBpcyBmdW5jdGlvbmluZwor
ICAgICAgICBidXQgbm90IG9wdGltaXplZCBpbiBhbnkgd2F5LiBTdWJlc3F1ZW50IGNoZWNrLWlu
cyB3aWxsIGJlIG5lY2Vzc2FyeSB0byBmaW5ldHVuZQorICAgICAgICBpdC4KKworICAgICAgICBO
byBuZXcgdGVzdHMuIChPT1BTISkKKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAg
ICBBZGRlZCBuZXcgc291cmNlIGZpbGVzIHRvIHRoZSBjaHJvbWl1bSBidWlsZAorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaDoKKyAgICAgICAgICBBZGRlZCBuZWNl
c3NhcnkgdHlwZWRlZidzIGFuZCBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgQ0hST01JVU0KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmNwcDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5o
OiBBZGRlZC4KKyAgICAgICAgICBEZWNsYXJhdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhl
IHBsYXRmb3JtLXNwZWNpZmljIEdyYXBoaWNzTGF5ZXIgY2xhc3MuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuaDogQWRkZWQuCisgICAg
ICAgICAgRGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTa2lhLWJhc2VkIHMv
dyBjb21wb3NpdG9yLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lh
LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEu
aDogQWRkZWQuCisgICAgICAgICAgRGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIGEg
Y29tcG9zaXRhYmxlIGxheWVyIHRoYXQgdXNlcyBhIFNraWEgY2FudmFzCisgICAgICAgICAgZm9y
IGJhY2tpbmcgc3RvcmUuCisKIDIwMTAtMDMtMDIgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJDb3Jl
L1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNp
b24gNTU0MjgpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtMjE0
OSwxMCArMjE0OSwxNiBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0M0RTa2lhLmNwcCcsCisgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5jcHAnLAorICAgICAg
ICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuaCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwJywKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAnLAogICAgICAg
ICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW50UG9pbnRTa2lhLmNwcCcsCiAgICAgICAg
ICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbnRSZWN0U2tpYS5jcHAnLAorICAgICAgICAg
ICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuY3BwJywKKyAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmgnLAorICAg
ICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcCcsCisgICAgICAg
ICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaCcsCiAgICAgICAgICAgICAn
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJbWFnZVNraWEuY3BwJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL05hdGl2ZUltYWdlU2tpYS5oJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdGhTa2lhLmNwcCcsCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkocmV2aXNpb24gNTU0MjgpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAt
NjMsNiArNjMsMTIgQEAgdHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKIGNsYXNzIFFHcmFwaGlj
c0l0ZW07CiB0eXBlZGVmIFFHcmFwaGljc0l0ZW0gUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgUUdy
YXBoaWNzSXRlbSogTmF0aXZlTGF5ZXI7CisjZWxpZiBQTEFURk9STShDSFJPTUlVTSkKK25hbWVz
cGFjZSBXZWJDb3JlIHsKK2NsYXNzIExheWVyU2tpYTsKK3R5cGVkZWYgTGF5ZXJTa2lhIFBsYXRm
b3JtTGF5ZXI7Cit0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOworfQogI2Vsc2UKIHR5cGVkZWYg
dm9pZCogUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tp
YS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
cGhpY3NMYXllclNraWEuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU4NiBAQAorLyoKKyAq
IENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisvKiogVE9E
TyhWYW5nZWxpcykKKyAqIFRoaXMgZmlsZSBib3Jyb3dzIGNvZGUgaGVhdmlseSBmcm9tIHBsYXRm
b3JtL2dyYXBoaWNzL3dpbi9HcmFwaGljc0xheWVyQ0FDRi5jcHAKKyAqIChhbmQgaGVuY2UgaXQg
aW5jbHVkZXMgYm90aCBjb3B5cmlnaHRzKQorICogSWRlYWxseSB0aGUgY29tbW9uIGNvZGUgKGUu
Zy4gdGhlIGNvZGUgdGhhdCBrZWVwcyB0cmFjayBvZiB0aGUgbGF5ZXIgaGllcmFyY2h5CisgKiBz
aG91bGQgYmUga2VwdCBzZXBhcmF0ZSBhbmQgc2hhcmVkIGJldHdlZW4gcGxhdGZvcm1zLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKworI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJTa2lhLmgiCisKKyNpbmNsdWRlICJDU3RyaW5n
LmgiCisjaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0Lmgi
CisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJMYXllclNraWEuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNsdWRlIDx3dGYv
Q3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvU3RyaW5nRXh0cmFzLmg+CisKK3VzaW5nIG5h
bWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworCitzdGF0aWMgdm9pZCBzZXRM
YXllckJvcmRlckNvbG9yKExheWVyU2tpYSogbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sK
KyAgICBsYXllci0+c2V0Qm9yZGVyQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVh
ckJvcmRlckNvbG9yKExheWVyU2tpYSogbGF5ZXIpCit7CisgICAgbGF5ZXItPnNldEJvcmRlckNv
bG9yKENvbG9yKDAsIDAsIDAsIDApKTsKK30KKworc3RhdGljIHZvaWQgc2V0TGF5ZXJCYWNrZ3Jv
dW5kQ29sb3IoTGF5ZXJTa2lhKiBsYXllciwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGxh
eWVyLT5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVhckxh
eWVyQmFja2dyb3VuZENvbG9yKExheWVyU2tpYSogbGF5ZXIpCit7CisgICAgbGF5ZXItPnNldEJh
Y2tncm91bmRDb2xvcigwKTsKK30KKworR3JhcGhpY3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGlu
YXRlc09yaWVudGF0aW9uIEdyYXBoaWNzTGF5ZXI6OmNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmll
bnRhdGlvbigpCit7CisgICAgcmV0dXJuIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNCb3R0b21VcDsK
K30KKworUGFzc093blB0cjxHcmFwaGljc0xheWVyPiBHcmFwaGljc0xheWVyOjpjcmVhdGUoR3Jh
cGhpY3NMYXllckNsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBuZXcgR3JhcGhpY3NMYXll
clNraWEoY2xpZW50KTsKK30KKworR3JhcGhpY3NMYXllclNraWE6OkdyYXBoaWNzTGF5ZXJTa2lh
KEdyYXBoaWNzTGF5ZXJDbGllbnQqIGNsaWVudCkKKyAgICA6IEdyYXBoaWNzTGF5ZXIoY2xpZW50
KQorICAgICwgbV9jb250ZW50c0xheWVyUHVycG9zZShOb0NvbnRlbnRzTGF5ZXIpCisgICAgLCBt
X2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IoZmFsc2UpCit7CisgICAgbV9sYXllciA9
IExheWVyU2tpYTo6Y3JlYXRlKExheWVyU2tpYTo6TGF5ZXIsIHRoaXMpOworCisgICAgdXBkYXRl
RGVidWdJbmRpY2F0b3JzKCk7Cit9CisKK0dyYXBoaWNzTGF5ZXJTa2lhOjp+R3JhcGhpY3NMYXll
clNraWEoKQoreworICAgIC8vIGNsZWFuIHVwIHRoZSBTa2lhIGxheWVyCisgICAgaWYgKG1fbGF5
ZXIpCisgICAgICAgIG1fbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICBpZiAo
bV90cmFuc2Zvcm1MYXllcikKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+cmVtb3ZlRnJvbVN1
cGVybGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0TmFtZShjb25zdCBT
dHJpbmcmIGluTmFtZSkKK3sKKyAgICBTdHJpbmcgbmFtZSA9IFN0cmluZzo6Zm9ybWF0KCJHcmFw
aGljc0xheWVyU2tpYSglcCkgR3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhp
cykgKyBpbk5hbWU7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0TmFtZShuYW1lKTsKK30KKworTmF0
aXZlTGF5ZXIgR3JhcGhpY3NMYXllclNraWE6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9sYXllci5nZXQoKTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q2hp
bGRyZW4oY29uc3QgVmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiYgY2hpbGRyZW4pCit7CisgICAgYm9v
bCBjaGlsZHJlbkNoYW5nZWQgPSBHcmFwaGljc0xheWVyOjpzZXRDaGlsZHJlbihjaGlsZHJlbik7
CisgICAgLy8gRklYTUU6IEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuIGNhbGxzIGFkZENoaWxk
KCkgZm9yIGVhY2ggc3VibGF5ZXIsIHdoaWNoCisgICAgLy8gd2lsbCBlbmQgdXAgY2FsbGluZyB1
cGRhdGVTdWJsYXllckxpc3QoKSBOIHRpbWVzLgorICAgIGlmIChjaGlsZHJlbkNoYW5nZWQpCisg
ICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworCisgICAgcmV0dXJuIGNoaWxkcmVuQ2hhbmdl
ZDsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6YWRkQ2hpbGQoR3JhcGhpY3NMYXllciog
Y2hpbGRMYXllcikKK3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZChjaGlsZExheWVyKTsK
KyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6
YWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIGludCBpbmRleCkKK3sK
KyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEF0SW5kZXgoY2hpbGRMYXllciwgaW5kZXgpOwor
ICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjph
ZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNp
YmxpbmcpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRCZWxvdyhjaGlsZExheWVyLCBz
aWJsaW5nKTsKKyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xh
eWVyU2tpYTo6YWRkQ2hpbGRBYm92ZShHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGlj
c0xheWVyICpzaWJsaW5nKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQWJvdmUoY2hp
bGRMYXllciwgc2libGluZyk7CisgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK2Jvb2wg
R3JhcGhpY3NMYXllclNraWE6OnJlcGxhY2VDaGlsZChHcmFwaGljc0xheWVyKiBvbGRDaGlsZCwg
R3JhcGhpY3NMYXllciogbmV3Q2hpbGQpCit7CisgICAgaWYgKEdyYXBoaWNzTGF5ZXI6OnJlcGxh
Y2VDaGlsZChvbGRDaGlsZCwgbmV3Q2hpbGQpKSB7CisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlz
dCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBHcmFw
aGljc0xheWVyOjpyZW1vdmVGcm9tUGFyZW50KCk7CisgICAgbGF5ZXJGb3JTdXBlcmxheWVyKCkt
PnJlbW92ZUZyb21TdXBlcmxheWVyKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNl
dFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldFBvc2l0aW9uKHBvaW50KTsKKyAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclNraWE6OnNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYg
cG9pbnQpCit7CisgICAgaWYgKHBvaW50ID09IG1fYW5jaG9yUG9pbnQpCisgICAgICAgIHJldHVy
bjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEFuY2hvclBvaW50KHBvaW50KTsKKyAgICB1cGRh
dGVBbmNob3JQb2ludCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRTaXplKGNv
bnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA9PSBtX3NpemUpCisgICAgICAg
IHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFNpemUoc2l6ZSk7CisgICAgdXBkYXRl
TGF5ZXJTaXplKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFRyYW5zZm9ybShj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBpZiAodCA9PSBtX3RyYW5zZm9y
bSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0VHJhbnNmb3JtKHQp
OworICAgIHVwZGF0ZVRyYW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpz
ZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAg
ICBpZiAodCA9PSBtX2NoaWxkcmVuVHJhbnNmb3JtKQorICAgICAgICByZXR1cm47CisKKyAgICBH
cmFwaGljc0xheWVyOjpzZXRDaGlsZHJlblRyYW5zZm9ybSh0KTsKKyAgICB1cGRhdGVDaGlsZHJl
blRyYW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRQcmVzZXJ2ZXMz
RChib29sIHByZXNlcnZlczNEKQoreworICAgIGlmIChwcmVzZXJ2ZXMzRCA9PSBtX3ByZXNlcnZl
czNEKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRQcmVzZXJ2ZXMz
RChwcmVzZXJ2ZXMzRCk7CisgICAgdXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgpOworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRNYXNrc1RvQm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykK
K3sKKyAgICBpZiAobWFza3NUb0JvdW5kcyA9PSBtX21hc2tzVG9Cb3VuZHMpCisgICAgICAgIHJl
dHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5k
cyk7CisgICAgdXBkYXRlTWFza3NUb0JvdW5kcygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJT
a2lhOjpzZXREcmF3c0NvbnRlbnQoYm9vbCBkcmF3c0NvbnRlbnQpCit7CisgICAgaWYgKGRyYXdz
Q29udGVudCA9PSBtX2RyYXdzQ29udGVudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhp
Y3NMYXllcjo6c2V0RHJhd3NDb250ZW50KGRyYXdzQ29udGVudCk7CisgICAgdXBkYXRlTGF5ZXJE
cmF3c0NvbnRlbnQoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0QmFja2dyb3Vu
ZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAobV9iYWNrZ3JvdW5kQ29sb3JT
ZXQgJiYgbV9iYWNrZ3JvdW5kQ29sb3IgPT0gY29sb3IpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7CisKKyAgICBtX2NvbnRl
bnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IgPSB0cnVlOworICAgIHVwZGF0ZUxheWVyQmFja2dy
b3VuZENvbG9yKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OmNsZWFyQmFja2dyb3Vu
ZENvbG9yKCkKK3sKKyAgICBpZiAoIW1fYmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICByZXR1
cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpjbGVhckJhY2tncm91bmRDb2xvcigpOworICAgIGNs
ZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IobV9jb250ZW50c0xheWVyLmdldCgpKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q29udGVudHNPcGFxdWUoYm9vbCBvcGFxdWUpCit7Cisg
ICAgaWYgKG1fY29udGVudHNPcGFxdWUgPT0gb3BhcXVlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c09wYXF1ZShvcGFxdWUpOworICAgIHVwZGF0ZUNv
bnRlbnRzT3BhcXVlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldEJhY2tmYWNl
VmlzaWJpbGl0eShib29sIHZpc2libGUpCit7CisgICAgaWYgKG1fYmFja2ZhY2VWaXNpYmlsaXR5
ID09IHZpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJh
Y2tmYWNlVmlzaWJpbGl0eSh2aXNpYmxlKTsKKyAgICB1cGRhdGVCYWNrZmFjZVZpc2liaWxpdHko
KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5
KQoreworICAgIGZsb2F0IGNsYW1wZWRPcGFjaXR5ID0gbWF4KG1pbihvcGFjaXR5LCAxLjBmKSwg
MC4wZik7CisKKyAgICBpZiAobV9vcGFjaXR5ID09IGNsYW1wZWRPcGFjaXR5KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRPcGFjaXR5KGNsYW1wZWRPcGFjaXR5KTsK
KyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0T3BhY2l0eShvcGFjaXR5KTsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICBpZiAoZHJhd3NDb250ZW50
KCkpCisgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJTa2lhOjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
KQoreworICAgIGlmIChkcmF3c0NvbnRlbnQoKSkKKyAgICAgICAgbV9sYXllci0+c2V0TmVlZHNE
aXNwbGF5KHJlY3QpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRDb250ZW50c1Jl
Y3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocmVjdCA9PSBtX2NvbnRlbnRzUmVj
dCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNSZWN0
KHJlY3QpOworICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjpzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAgIC8vIFRPRE8o
dmFuZ2VsaXMpOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q29u
dGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqIHZpZGVvTGF5ZXIpCit7CisgICAgLy8gVE9ETyh2
YW5nZWxpcyk6IEltcGxlbWVudAorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRHZW9t
ZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBvcmllbnRh
dGlvbikKK3sKKyAgICBpZiAob3JpZW50YXRpb24gPT0gbV9nZW9tZXRyeU9yaWVudGF0aW9uKQor
ICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRHZW9tZXRyeU9yaWVudGF0
aW9uKG9yaWVudGF0aW9uKTsKKyAgICB1cGRhdGVHZW9tZXRyeU9yaWVudGF0aW9uKCk7Cit9CisK
K1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJTa2lhOjpob3N0TGF5ZXJGb3JTdWJsYXllcnMo
KSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5zZm9ybUxheWVyID8gbV90cmFuc2Zvcm1MYXll
ci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5
ZXJTa2lhOjpsYXllckZvclN1cGVybGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5z
Zm9ybUxheWVyID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7Cit9CisK
K1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJTa2lhOjpwbGF0Zm9ybUxheWVyKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gcHJpbWFyeUxheWVyKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNr
aWE6OnNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBp
ZiAoY29sb3IuaXNWYWxpZCgpKQorICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xvcihtX2xh
eWVyLmdldCgpLCBjb2xvcik7CisgICAgZWxzZQorICAgICAgICBjbGVhckxheWVyQmFja2dyb3Vu
ZENvbG9yKG1fbGF5ZXIuZ2V0KCkpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRE
ZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGJvcmRlcldpZHRoKQoreworICAg
IGlmIChjb2xvci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcihtX2xh
eWVyLmdldCgpLCBjb2xvcik7CisgICAgICAgIG1fbGF5ZXItPnNldEJvcmRlcldpZHRoKGJvcmRl
cldpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjbGVhckJvcmRlckNvbG9yKG1fbGF5ZXIu
Z2V0KCkpOworICAgICAgICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aCgwKTsKKyAgICB9Cit9CisK
K0dyYXBoaWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbiBHcmFwaGlj
c0xheWVyU2tpYTo6ZGVmYXVsdENvbnRlbnRzT3JpZW50YXRpb24oKSBjb25zdAoreworICAgIHJl
dHVybiBDb21wb3NpdGluZ0Nvb3JkaW5hdGVzVG9wRG93bjsKK30KKwordm9pZCBHcmFwaGljc0xh
eWVyU2tpYTo6dXBkYXRlU3VibGF5ZXJMaXN0KCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPExheWVy
U2tpYT4gPiBuZXdTdWJsYXllcnM7CisKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikgeworICAg
ICAgICAvLyBBZGQgdGhlIHByaW1hcnkgbGF5ZXIgZmlyc3QuIEV2ZW4gaWYgd2UgaGF2ZSBuZWdh
dGl2ZSB6LW9yZGVyIGNoaWxkcmVuLCB0aGUgcHJpbWFyeSBsYXllciBhbHdheXMgY29tZXMgYmVo
aW5kLgorICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKG1fbGF5ZXIuZ2V0KCkpOworICAgIH0g
ZWxzZSBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIC8vIEZJWE1FOiBhZGQgdGhlIGNv
bnRlbnRzIGxheWVyIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggbmVnYXRpdmUgei1vcmRlciBj
aGlsZHJlbi4KKyAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjYXVzZSB2aXNpYmxlIHJlbmRlcmlu
ZyBpc3N1ZXMgYmVjYXVzZSBjdXJyZW50bHkgY29udGVudHMgbGF5ZXJzIGFyZSBvbmx5IHVzZWQK
KyAgICAgICAgLy8gZm9yIHJlcGxhY2VkIGVsZW1lbnRzIHRoYXQgZG9uJ3QgaGF2ZSBjaGlsZHJl
bi4KKyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZChtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkpOwor
ICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mIGNoaWxkTGF5ZXJzID0g
Y2hpbGRyZW4oKTsKKyAgICBzaXplX3QgbnVtQ2hpbGRyZW4gPSBjaGlsZExheWVycy5zaXplKCk7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgKytpKSB7CisgICAgICAg
IEdyYXBoaWNzTGF5ZXJTa2lhKiBjdXJDaGlsZCA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJT
a2lhKj4oY2hpbGRMYXllcnNbaV0pOworCisgICAgICAgIExheWVyU2tpYSogY2hpbGRMYXllciA9
IGN1ckNoaWxkLT5sYXllckZvclN1cGVybGF5ZXIoKTsKKyAgICAgICAgbmV3U3VibGF5ZXJzLmFw
cGVuZChjaGlsZExheWVyKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5l
d1N1YmxheWVycy5zaXplKCk7ICsraSkKKyAgICAgICAgbmV3U3VibGF5ZXJzW2ldLT5yZW1vdmVG
cm9tU3VwZXJsYXllcigpOworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAg
bV90cmFuc2Zvcm1MYXllci0+c2V0U3VibGF5ZXJzKG5ld1N1YmxheWVycyk7CisKKyAgICAgICAg
aWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRyYW5z
Zm9ybSBsYXllciwgdGhlbiB0aGUgY29udGVudHMgbGF5ZXIgaXMgcGFyZW50ZWQgaW4gdGhlCisg
ICAgICAgICAgICAvLyBwcmltYXJ5IGxheWVyICh3aGljaCBpcyBpdHNlbGYgYSBjaGlsZCBvZiB0
aGUgdHJhbnNmb3JtIGxheWVyKS4KKyAgICAgICAgICAgIG1fbGF5ZXItPnJlbW92ZUFsbFN1Ymxh
eWVycygpOworICAgICAgICAgICAgbV9sYXllci0+YWRkU3VibGF5ZXIobV9jb250ZW50c0xheWVy
KTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBtX2xheWVyLT5zZXRTdWJsYXllcnMo
bmV3U3VibGF5ZXJzKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTGF5ZXJQ
b3NpdGlvbigpCit7CisgICAgLy8gUG9zaXRpb24gaXMgb2Zmc2V0IG9uIHRoZSBsYXllciBieSB0
aGUgbGF5ZXIgYW5jaG9yIHBvaW50LgorICAgIFNrUG9pbnQgcG9zUG9pbnQ7CisgICAgcG9zUG9p
bnQuc2V0KG1fcG9zaXRpb24ueCgpICsgbV9hbmNob3JQb2ludC54KCkgKiBtX3NpemUud2lkdGgo
KSwKKyAgICAgICAgICAgICAgICAgcG9zUG9pbnQuZlkgPSBtX3Bvc2l0aW9uLnkoKSArIG1fYW5j
aG9yUG9pbnQueSgpICogbV9zaXplLmhlaWdodCgpKTsKKworICAgIHByaW1hcnlMYXllcigpLT5z
ZXRQb3NpdGlvbihwb3NQb2ludCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0
ZUxheWVyU2l6ZSgpCit7CisgICAgU2tJUmVjdCByZWN0OworICAgIHJlY3Quc2V0KDAsIDAsIG1f
c2l6ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkpOworICAgIGlmIChtX3RyYW5zZm9ybUxheWVy
KSB7CisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKKyAgICAgICAg
Ly8gVGhlIGFuY2hvciBvZiB0aGUgY29udGVudHMgbGF5ZXIgaXMgYWx3YXlzIGF0IDAuNSwgMC41
LCBzbyB0aGUgcG9zaXRpb24gaXMgY2VudGVyLXJlbGF0aXZlLgorICAgICAgICBTa1BvaW50IGNl
bnRlclBvaW50OworICAgICAgICBjZW50ZXJQb2ludC5zZXQobV9zaXplLndpZHRoKCkgLyAyLjBm
LCBtX3NpemUuaGVpZ2h0KCkgLyAyLjBmKTsKKyAgICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24o
Y2VudGVyUG9pbnQpOworICAgIH0KKworICAgIG1fbGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKKwor
ICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCByZXNpemUgbV9jb250ZW50c0xheWVyLiBJdCdzIHVw
IHRoZSBjYWxsZXIgdG8gZG8gdGhhdC4KKworICAgIC8vIGlmIHdlJ3ZlIGNoYW5nZWQgdGhlIGJv
dW5kcywgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24KKyAgICAvLyBvZiB0aGUg
bGF5ZXIsIHRha2luZyBhbmNob3IgcG9pbnQgaW50byBhY2NvdW50LgorICAgIHVwZGF0ZUxheWVy
UG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQW5jaG9yUG9p
bnQoKQoreworICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQ7CisgICAgYW5jaG9yUG9pbnQuc2V0KG1f
YW5jaG9yUG9pbnQueCgpLCBtX2FuY2hvclBvaW50LnkoKSk7CisgICAgcHJpbWFyeUxheWVyKCkt
PnNldEFuY2hvclBvaW50KGFuY2hvclBvaW50KTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5j
aG9yUG9pbnRaKG1fYW5jaG9yUG9pbnQueigpKTsKKyAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZVRyYW5zZm9ybSgpCit7CisgICAg
cHJpbWFyeUxheWVyKCktPnNldFRyYW5zZm9ybShtX3RyYW5zZm9ybS50b0FmZmluZVRyYW5zZm9y
bSgpKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ2hpbGRyZW5UcmFuc2Zv
cm0oKQoreworICAgIHByaW1hcnlMYXllcigpLT5zZXRTdWJsYXllclRyYW5zZm9ybShtX2NoaWxk
cmVuVHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTWFza3NU
b0JvdW5kcygpCit7CisgICAgbV9sYXllci0+c2V0TWFza3NUb0JvdW5kcyhtX21hc2tzVG9Cb3Vu
ZHMpOworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjp1cGRhdGVDb250ZW50c09wYXF1ZSgpCit7CisgICAgbV9sYXllci0+c2V0T3BhcXVl
KG1fY29udGVudHNPcGFxdWUpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVC
YWNrZmFjZVZpc2liaWxpdHkoKQoreworICAgIG1fbGF5ZXItPnNldERvdWJsZVNpZGVkKG1fYmFj
a2ZhY2VWaXNpYmlsaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTGF5
ZXJQcmVzZXJ2ZXMzRCgpCit7CisgICAgLy8gVE9ETyh2YW5nZWxpcyk6IGltcGxlbWVudAorfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVMYXllckRyYXdzQ29udGVudCgpCit7Cisg
ICAgaWYgKG1fZHJhd3NDb250ZW50KQorICAgICAgICBtX2xheWVyLT5zZXROZWVkc0Rpc3BsYXko
KTsKKworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjp1cGRhdGVMYXllckJhY2tncm91bmRDb2xvcigpCit7CisgICAgaWYgKCFtX2NvbnRl
bnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG5ldmVyIGNyZWF0ZSB0aGUg
Y29udGVudHMgbGF5ZXIganVzdCBmb3IgYmFja2dyb3VuZCBjb2xvciB5ZXQuCisgICAgaWYgKG1f
YmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xvcihtX2Nv
bnRlbnRzTGF5ZXIuZ2V0KCksIG1fYmFja2dyb3VuZENvbG9yKTsKKyAgICBlbHNlCisgICAgICAg
IGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IobV9jb250ZW50c0xheWVyLmdldCgpKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ29udGVudHNJbWFnZSgpCit7CisgICAgLy8g
VE9ETyh2YW5nZWxpcyk6IEltcGxlbWVudAorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1
cGRhdGVDb250ZW50c1ZpZGVvKCkKK3sKKyAgICAvLyBUT0RPKHZhbmdlbGlzKTogSW1wbGVtZW50
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUNvbnRlbnRzUmVjdCgpCit7Cisg
ICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUG9pbnQg
cG9pbnQ7CisgICAgcG9pbnQuc2V0KG1fY29udGVudHNSZWN0LngoKSwgbV9jb250ZW50c1JlY3Qu
eSgpKTsKKyAgICBTa0lSZWN0IHJlY3Q7CisgICAgcmVjdC5zZXQoMCwKKyAgICAgICAgICAgICAw
LAorICAgICAgICAgICAgIG1fY29udGVudHNSZWN0LndpZHRoKCksCisgICAgICAgICAgICAgbV9j
b250ZW50c1JlY3QuaGVpZ2h0KCkpOworCisgICAgbV9jb250ZW50c0xheWVyLT5zZXRQb3NpdGlv
bihwb2ludCk7CisgICAgbV9jb250ZW50c0xheWVyLT5zZXRCb3VuZHMocmVjdCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUdlb21ldHJ5T3JpZW50YXRpb24oKQoreworICAg
IHN3aXRjaCAoZ2VvbWV0cnlPcmllbnRhdGlvbigpKSB7CisgICAgY2FzZSBDb21wb3NpdGluZ0Nv
b3JkaW5hdGVzVG9wRG93bjoKKyAgICAgICAgbV9sYXllci0+c2V0R2VvbWV0cnlGbGlwcGVkKGZh
bHNlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNC
b3R0b21VcDoKKyAgICAgICAgbV9sYXllci0+c2V0R2VvbWV0cnlGbGlwcGVkKHRydWUpOworICAg
ICAgICBicmVhazsKKyAgICB9CisgICAgLy8gR2VvbWV0cnkgb3JpZW50YXRpb24gaXMgbWFwcGVk
IG9udG8gY2hpbGRyZW4gdHJhbnNmb3JtIGluIG9sZGVyIFF1YXJ0ekNvcmVzLAorICAgIC8vIHNv
IGlzIGhhbmRsZWQgdmlhIHNldEdlb21ldHJ5T3JpZW50YXRpb24oKS4KK30KKwordm9pZCBHcmFw
aGljc0xheWVyU2tpYTo6c2V0dXBDb250ZW50c0xheWVyKExheWVyU2tpYSogY29udGVudHNMYXll
cikKK3sKKyAgICBpZiAoY29udGVudHNMYXllciA9PSBtX2NvbnRlbnRzTGF5ZXIpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgbV9jb250ZW50
c0xheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIg
PSAwOworICAgIH0KKworICAgIGlmIChjb250ZW50c0xheWVyKSB7CisgICAgICAgIG1fY29udGVu
dHNMYXllciA9IGNvbnRlbnRzTGF5ZXI7CisKKyAgICAgICAgaWYgKGRlZmF1bHRDb250ZW50c09y
aWVudGF0aW9uKCkgPT0gQ29tcG9zaXRpbmdDb29yZGluYXRlc0JvdHRvbVVwKSB7CisgICAgICAg
ICAgICBTa1BvaW50IGFuY2hvclBvaW50OworICAgICAgICAgICAgYW5jaG9yUG9pbnQuc2V0KDAu
MGYsIDEuMGYpOworICAgICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRBbmNob3JQb2ludChh
bmNob3JQb2ludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTa1BvaW50IGFuY2hv
clBvaW50OworICAgICAgICAgICAgYW5jaG9yUG9pbnQuc2V0KDAuMGYsIDAuMGYpOworICAgICAg
ICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRBbmNob3JQb2ludChhbmNob3JQb2ludCk7CisgICAg
ICAgIH0KKworICAgICAgICAvLyBJbnNlcnQgdGhlIGNvbnRlbnQgbGF5ZXIgZmlyc3QuIFZpZGVv
IGVsZW1lbnRzIHJlcXVpcmUgdGhpcywgYmVjYXVzZSB0aGV5IGhhdmUKKyAgICAgICAgLy8gc2hh
ZG93IGNvbnRlbnQgdGhhdCBtdXN0IGRpc3BsYXkgaW4gZnJvbnQgb2YgdGhlIHZpZGVvLgorICAg
ICAgICBtX2xheWVyLT5pbnNlcnRTdWJsYXllcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCksIDApOwor
CisgICAgICAgIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworCisgICAgICAgIGlmIChzaG93RGVidWdC
b3JkZXJzKCkpIHsKKyAgICAgICAgICAgIHNldExheWVyQm9yZGVyQ29sb3IobV9jb250ZW50c0xh
eWVyLmdldCgpLCBDb2xvcigwLCAwLCAxMjgsIDE4MCkpOworICAgICAgICAgICAgbV9jb250ZW50
c0xheWVyLT5zZXRCb3JkZXJXaWR0aCgxLjBmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1cGRh
dGVEZWJ1Z0luZGljYXRvcnMoKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBzaW1wbHkgbWltaWNz
IHRoZSBvcGVyYXRpb24gb2YgR3JhcGhpY3NMYXllckNBCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lh
Ojp1cGRhdGVPcGFjaXR5T25MYXllcigpCit7CisgICAgcHJpbWFyeUxheWVyKCktPnNldE9wYWNp
dHkobV9vcGFjaXR5KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmgJKHJldmlzaW9uIDApCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR3JhcGhpY3NMYXllclNraWFfaAorI2RlZmlu
ZSBHcmFwaGljc0xheWVyU2tpYV9oCisKKy8vIFRPRE8odmFuZ2VsaXMpOiBGaWxlIGhlYXZpbHkg
Ym9ycm93cyBmcm9tIEdyYXBoaWNzTGF5ZXJDQUNGLmguICBTZWUgY29tbWVudAorLy8gYXQgdGhl
IHRvcCBvZiBHcmFwaGljc0xheWVyU2tpYS5jcHAuCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFw
aGljc0xheWVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJTa2lhOwor
CitjbGFzcyBHcmFwaGljc0xheWVyU2tpYSA6IHB1YmxpYyBHcmFwaGljc0xheWVyIHsKK3B1Ymxp
YzoKKworICAgIEdyYXBoaWNzTGF5ZXJTa2lhKEdyYXBoaWNzTGF5ZXJDbGllbnQqKTsKKyAgICB2
aXJ0dWFsIH5HcmFwaGljc0xheWVyU2tpYSgpOworCisgICAgdmlydHVhbCB2b2lkIHNldE5hbWUo
Y29uc3QgU3RyaW5nJiBpbk5hbWUpOworCisgICAgLy8gZm9yIGhvc3RpbmcgdGhpcyBHcmFwaGlj
c0xheWVyIGluIGEgbmF0aXZlIGxheWVyIGhpZXJhcmNoeQorICAgIHZpcnR1YWwgTmF0aXZlTGF5
ZXIgbmF0aXZlTGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRDaGlsZHJlbihj
b25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+Jik7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxk
KEdyYXBoaWNzTGF5ZXIgKmxheWVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRBdEluZGV4
KEdyYXBoaWNzTGF5ZXIgKmxheWVyLCBpbnQgaW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBhZGRD
aGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIgKmxheWVyLCBHcmFwaGljc0xheWVyICpzaWJsaW5nKTsK
KyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVyICpsYXllciwgR3Jh
cGhpY3NMYXllciAqc2libGluZyk7CisgICAgdmlydHVhbCBib29sIHJlcGxhY2VDaGlsZChHcmFw
aGljc0xheWVyICpvbGRDaGlsZCwgR3JhcGhpY3NMYXllciAqbmV3Q2hpbGQpOworCisgICAgdmly
dHVhbCB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRQb3Np
dGlvbihjb25zdCBGbG9hdFBvaW50JiBpblBvaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QW5j
aG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiBpblBvaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0U2l6ZShjb25zdCBGbG9hdFNpemUmIGluU2l6ZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0
VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0Q2hpbGRyZW5UcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKwor
ICAgIHZpcnR1YWwgdm9pZCBzZXRQcmVzZXJ2ZXMzRChib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0TWFza3NUb0JvdW5kcyhib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RHJhd3NDb250ZW50
KGJvb2wpOworCisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xv
ciYpOworICAgIHZpcnR1YWwgdm9pZCBjbGVhckJhY2tncm91bmRDb2xvcigpOworCisgICAgdmly
dHVhbCB2b2lkIHNldENvbnRlbnRzT3BhcXVlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRC
YWNrZmFjZVZpc2liaWxpdHkoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T3BhY2l0eShm
bG9hdCBvcGFjaXR5KTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYpOwor
CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVjdChjb25zdCBJbnRSZWN0Jik7CisKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0ltYWdlKEltYWdlKik7CisgICAgdmlydHVhbCB2
b2lkIHNldENvbnRlbnRzVG9WaWRlbyhQbGF0Zm9ybUxheWVyKik7CisKKyAgICB2aXJ0dWFsIFBs
YXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBz
ZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1YWwgdm9pZCBz
ZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYsIGZsb2F0IGJvcmRlcldpZHRoKTsKKworICAgIHZp
cnR1YWwgdm9pZCBzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNP
cmllbnRhdGlvbik7CisKKyAgICB2b2lkIG5vdGlmeVN5bmNSZXF1aXJlZCgpCisgICAgeworICAg
ICAgICBpZiAobV9jbGllbnQpCisgICAgICAgICAgICBtX2NsaWVudC0+bm90aWZ5U3luY1JlcXVp
cmVkKHRoaXMpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZU9wYWNpdHlPbkxh
eWVyKCk7CisKKyAgICBMYXllclNraWEqIHByaW1hcnlMYXllcigpIGNvbnN0ICB7IHJldHVybiBt
X3RyYW5zZm9ybUxheWVyLmdldCgpID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIu
Z2V0KCk7IH0KKyAgICBMYXllclNraWEqIGhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0Owor
ICAgIExheWVyU2tpYSogbGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3Q7CisKKyAgICBDb21wb3Np
dGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gZGVmYXVsdENvbnRlbnRzT3JpZW50YXRpb24oKSBj
b25zdDsKKyAgICB2b2lkIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgIHZvaWQgdXBkYXRlTGF5
ZXJQb3NpdGlvbigpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJTaXplKCk7CisgICAgdm9pZCB1cGRh
dGVBbmNob3JQb2ludCgpOworICAgIHZvaWQgdXBkYXRlVHJhbnNmb3JtKCk7CisgICAgdm9pZCB1
cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgpOworICAgIHZvaWQgdXBkYXRlTWFza3NUb0JvdW5kcygp
OworICAgIHZvaWQgdXBkYXRlQ29udGVudHNPcGFxdWUoKTsKKyAgICB2b2lkIHVwZGF0ZUJhY2tm
YWNlVmlzaWJpbGl0eSgpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgpOworICAg
IHZvaWQgdXBkYXRlTGF5ZXJEcmF3c0NvbnRlbnQoKTsKKyAgICB2b2lkIHVwZGF0ZUxheWVyQmFj
a2dyb3VuZENvbG9yKCk7CisKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzSW1hZ2UoKTsKKyAgICB2
b2lkIHVwZGF0ZUNvbnRlbnRzVmlkZW8oKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzUmVjdCgp
OworICAgIHZvaWQgdXBkYXRlR2VvbWV0cnlPcmllbnRhdGlvbigpOworCisgICAgdm9pZCBzZXR1
cENvbnRlbnRzTGF5ZXIoTGF5ZXJTa2lhKik7CisgICAgTGF5ZXJTa2lhKiBjb250ZW50c0xheWVy
KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50c0xheWVyLmdldCgpOyB9CisKKyAgICBSZWZQdHI8
TGF5ZXJTa2lhPiBtX2xheWVyOworICAgIFJlZlB0cjxMYXllclNraWE+IG1fdHJhbnNmb3JtTGF5
ZXI7CisgICAgUmVmUHRyPExheWVyU2tpYT4gbV9jb250ZW50c0xheWVyOworCisgICAgZW51bSBD
b250ZW50c0xheWVyUHVycG9zZSB7CisgICAgICAgIE5vQ29udGVudHNMYXllciA9IDAsCisgICAg
ICAgIENvbnRlbnRzTGF5ZXJGb3JJbWFnZSwKKyAgICAgICAgQ29udGVudHNMYXllckZvclZpZGVv
CisgICAgfTsKKworICAgIENvbnRlbnRzTGF5ZXJQdXJwb3NlIG1fY29udGVudHNMYXllclB1cnBv
c2U7CisgICAgYm9vbCBtX2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IgOiAxOworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorCisjZW5kaWYgLy8gR3JhcGhpY3NMYXllclNraWFfaF8KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJl
bmRlcmVyU2tpYS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29w
eXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUg
IkxheWVyUmVuZGVyZXJTa2lhLmgiCisKKyNpbmNsdWRlICJMYXllclNraWEuaCIKKyNpbmNsdWRl
ICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCisjaW5jbHVkZSAic2tpYS9leHQvcGxhdGZvcm1fY2Fu
dmFzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc093blB0cjxMYXllclJlbmRlcmVy
U2tpYT4gTGF5ZXJSZW5kZXJlclNraWE6OmNyZWF0ZSgpCit7CisgICAgcmV0dXJuIG5ldyBMYXll
clJlbmRlcmVyU2tpYSgpOworfQorCitMYXllclJlbmRlcmVyU2tpYTo6TGF5ZXJSZW5kZXJlclNr
aWEoKQorICAgIDogbV9yb290TGF5ZXIoMCkKKyAgICAsIG1fbmVlZHNEaXNwbGF5KGZhbHNlKQor
eworfQorCitMYXllclJlbmRlcmVyU2tpYTo6fkxheWVyUmVuZGVyZXJTa2lhKCkKK3sKK30KKwor
dm9pZCBMYXllclJlbmRlcmVyU2tpYTo6ZHJhd0xheWVyc0luQ2FudmFzKHNraWE6OlBsYXRmb3Jt
Q2FudmFzKiBjYW52YXMsIFNrUmVjdCBjbGlwUmVjdCkKK3sKKyAgICBpZiAoIW1fcm9vdExheWVy
KQorICAgICAgICByZXR1cm47CisKKyAgICBjYW52YXMtPnNhdmUoKTsKKyAgICBjYW52YXMtPmNs
aXBSZWN0KGNsaXBSZWN0KTsKKworICAgIC8vIEZpcnN0IGNvbXBvc2l0ZSB0aGUgcm9vdCBsYXll
ciBpbnRvIHRoZSBjYW52YXMuCisgICAgY2FudmFzLT5kcmF3Qml0bWFwKG1fcm9vdExheWVyLT5w
bGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwg
MCk7CisKKyAgICAvLyBBY2NvdW50IGZvciB0aGUgc2Nyb2xsIG9mZnNldCBiZWZvcmUgY29tcG9z
aXRpbmcgdGhlIHJlbWFpbmluZyBsYXllcnMuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByb290IGxh
eWVyJ3MgcGFpbnRpbmcgdGFrZXMgaW50byBhY2NvdW50IHRoZSBzY3JvbGwgb2Zmc2V0IGFscmVh
ZHkuCisgICAgY2FudmFzLT50cmFuc2xhdGUoLW1fc2Nyb2xsRnJhbWUuZkxlZnQsIC1tX3Njcm9s
bEZyYW1lLmZUb3ApOworCisgICAgZmxvYXQgb3BhY2l0eSA9IDEuMGY7CisgICAgY29uc3QgVmVj
dG9yPFJlZlB0cjxMYXllclNraWE+ID4mIHN1YmxheWVycyA9IG1fcm9vdExheWVyLT5nZXRTdWJs
YXllcnMoKTsKKyAgICBmb3IgKHNpemVfdCBpaSA9IDA7IGlpIDwgc3VibGF5ZXJzLnNpemUoKTsg
aWkrKykKKyAgICAgICAgZHJhd0xheWVySW5DYW52YXNSZWN1cnNpdmUoY2FudmFzLCBzdWJsYXll
cnNbaWldLmdldCgpLCBvcGFjaXR5KTsKKworICAgIGNhbnZhcy0+cmVzdG9yZSgpOworCisgICAg
bV9uZWVkc0Rpc3BsYXkgPSBmYWxzZTsKK30KKwordm9pZCBMYXllclJlbmRlcmVyU2tpYTo6dXBk
YXRlTGF5ZXJDb250ZW50cygpCit7CisgICAgaWYgKG1fcm9vdExheWVyKQorICAgICAgICB1cGRh
dGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKG1fcm9vdExheWVyLmdldCgpKTsKK30KKwordm9pZCBM
YXllclJlbmRlcmVyU2tpYTo6ZHJhd0xheWVySW5DYW52YXNSZWN1cnNpdmUoc2tpYTo6UGxhdGZv
cm1DYW52YXMqIGNhbnZhcywgTGF5ZXJTa2lhKiBsYXllciwgZmxvYXQgb3BhY2l0eSkKK3sKKyAg
ICAvLyBHdWFyYW50ZWVzIHRoYXQgdGhlIGNhbnZhcyBpcyByZXN0b3JlZCB0byBhIGtub3duIHN0
YXRlIG9uIGRlc3RydWN0aW9uLgorICAgIFNrQXV0b0NhbnZhc1Jlc3RvcmUgYXV0b1Jlc3RvcmVD
YW52YXMoY2FudmFzLCB0cnVlKTsKKworICAgIFNrUG9pbnQgcG9zaXRpb24gPSBsYXllci0+cG9z
aXRpb24oKTsKKyAgICBTa1BvaW50IGFuY2hvclBvaW50ID0gbGF5ZXItPmFuY2hvclBvaW50KCk7
CisgICAgU2tNYXRyaXggdHJhbnNmb3JtID0gbGF5ZXItPnRyYW5zZm9ybSgpOworICAgIFNrSVJl
Y3QgYm91bmRzID0gbGF5ZXItPmJvdW5kcygpOworCisgICAgY2FudmFzLT50cmFuc2xhdGUocG9z
aXRpb24uZlgsIHBvc2l0aW9uLmZZKTsKKworICAgIFNrU2NhbGFyIHR4ID0gU2tTY2FsYXJNdWwo
YW5jaG9yUG9pbnQuZlgsIGJvdW5kcy53aWR0aCgpKTsKKyAgICBTa1NjYWxhciB0eSA9IFNrU2Nh
bGFyTXVsKGFuY2hvclBvaW50LmZZLCBib3VuZHMuaGVpZ2h0KCkpOworICAgIGNhbnZhcy0+dHJh
bnNsYXRlKHR4LCB0eSk7CisgICAgY2FudmFzLT5jb25jYXQodHJhbnNmb3JtKTsKKyAgICBjYW52
YXMtPnRyYW5zbGF0ZSgtdHgsIC10eSk7CisKKyAgICAvLyBUaGUgcG9zaXRpb24gd2UgZ2V0IGlz
IGZvciB0aGUgY2VudGVyIG9mIHRoZSBsYXllciBidXQKKyAgICAvLyBkcmF3Qml0bWFwIHN0YXJ0
cyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgYW5kIHRoZXJlZm9yZQorICAgIC8vIHdlIG5lZWQg
dG8gYWRqdXN0IG91ciB0cmFuc2Zvcm0uCisgICAgY2FudmFzLT50cmFuc2xhdGUoLTAuNWYgKiBi
b3VuZHMud2lkdGgoKSwgLTAuNWYgKiBib3VuZHMuaGVpZ2h0KCkpOworCisgICAgU2tQYWludCBv
cGFjaXR5UGFpbnQ7CisgICAgb3BhY2l0eSA9IG9wYWNpdHkgKiBsYXllci0+b3BhY2l0eSgpOwor
ICAgIG9wYWNpdHlQYWludC5zZXRBbHBoYShvcGFjaXR5ICogMjU1KTsKKworICAgIGNhbnZhcy0+
ZHJhd0JpdG1hcChsYXllci0+cGxhdGZvcm1DYW52YXMoKS0+Z2V0RGV2aWNlKCktPmFjY2Vzc0Jp
dG1hcChmYWxzZSksIDAsIDAsICZvcGFjaXR5UGFpbnQpOworCisgICAgY29uc3QgVmVjdG9yPFJl
ZlB0cjxMYXllclNraWE+ID4mIHN1YmxheWVycyA9IGxheWVyLT5nZXRTdWJsYXllcnMoKTsKKyAg
ICBmb3IgKHNpemVfdCBpaSA9IDA7IGlpIDwgc3VibGF5ZXJzLnNpemUoKTsgaWkrKykKKyAgICAg
ICAgZHJhd0xheWVySW5DYW52YXNSZWN1cnNpdmUoY2FudmFzLCBzdWJsYXllcnNbaWldLmdldCgp
LCBvcGFjaXR5KTsKK30KKwordm9pZCBMYXllclJlbmRlcmVyU2tpYTo6dXBkYXRlTGF5ZXJDb250
ZW50c1JlY3Vyc2l2ZShMYXllclNraWEqIGxheWVyKQoreworICAgIGxheWVyLT51cGRhdGVDb250
ZW50cygpOworCisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllclNraWE+ID4mIHN1YmxheWVy
cyA9IGxheWVyLT5nZXRTdWJsYXllcnMoKTsKKyAgICBmb3IgKHNpemVfdCBpaSA9IDA7IGlpIDwg
c3VibGF5ZXJzLnNpemUoKTsgaWkrKykKKyAgICAgICAgdXBkYXRlTGF5ZXJDb250ZW50c1JlY3Vy
c2l2ZShzdWJsYXllcnNbaWldLmdldCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmgJKHJldmlz
aW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNr
aWEuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykg
MjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgTGF5ZXJSZW5kZXJl
clNraWFfaAorI2RlZmluZSBMYXllclJlbmRlcmVyU2tpYV9oCisKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJMYXllclNraWEuaCIKKyNpbmNsdWRlIDx3dGYv
Tm9uY29weWFibGUuaD4KKworI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ugc2tpYSB7CitjbGFzcyBQbGF0Zm9ybUNhbnZhczsK
K30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBMYXllclJlbmRlcmVyU2tpYSA6IHB1
YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25QdHI8TGF5ZXJS
ZW5kZXJlclNraWE+IGNyZWF0ZSgpOworCisgICAgTGF5ZXJSZW5kZXJlclNraWEoKTsKKyAgICB+
TGF5ZXJSZW5kZXJlclNraWEoKTsKKworICAgIHZvaWQgZHJhd0xheWVyc0luQ2FudmFzKHNraWE6
OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMsIFNrUmVjdCBjbGlwUmVjdCk7CisKKyAgICB2b2lkIHVw
ZGF0ZUxheWVyQ29udGVudHMoKTsKKworICAgIHZvaWQgc2V0Um9vdExheWVyKExheWVyU2tpYSog
bGF5ZXIpIHsgbV9yb290TGF5ZXIgPSBsYXllcjsgfQorICAgIExheWVyU2tpYSogcm9vdExheWVy
KCkgeyByZXR1cm4gbV9yb290TGF5ZXIuZ2V0KCk7IH0KKworICAgIHZvaWQgc2V0TmVlZHNEaXNw
bGF5KCkgeyBtX25lZWRzRGlzcGxheSA9IHRydWU7IH0KKworICAgIHZvaWQgc2V0U2Nyb2xsRnJh
bWUoU2tJUmVjdCYgc2Nyb2xsRnJhbWUpIHsgbV9zY3JvbGxGcmFtZSA9IHNjcm9sbEZyYW1lOyB9
CisKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2ZShza2lhOjpQ
bGF0Zm9ybUNhbnZhcyogY2FudmFzLCBMYXllclNraWEqIGxheWVyLCBmbG9hdCBvcGFjaXR5KTsK
KyAgICB2b2lkIHVwZGF0ZUxheWVyQ29udGVudHNSZWN1cnNpdmUoTGF5ZXJTa2lhKiBsYXllcik7
CisKKyAgICBSZWZQdHI8TGF5ZXJTa2lhPiBtX3Jvb3RMYXllcjsKKworICAgIGJvb2wgbV9uZWVk
c0Rpc3BsYXk7CisgICAgU2tJUmVjdCBtX3Njcm9sbEZyYW1lOworfTsKKworfQorCisjZW5kaWYg
Ly8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gV0tDQUNGTGF5ZXJf
aApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5jcHAJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lh
LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMp
IDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAq
ICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBp
dHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJMYXllclNr
aWEuaCIKKworI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNpbmNsdWRlICJSZW5k
ZXJMYXllckJhY2tpbmcuaCIKKyNpbmNsdWRlICJza2lhL2V4dC9wbGF0Zm9ybV9jYW52YXMuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKK1Bhc3NS
ZWZQdHI8TGF5ZXJTa2lhPiBMYXllclNraWE6OmNyZWF0ZShMYXllclR5cGUgdHlwZSwgR3JhcGhp
Y3NMYXllclNraWEqIG93bmVyKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgTGF5ZXJTa2lh
KHR5cGUsIG93bmVyKSk7Cit9CisKK0xheWVyU2tpYTo6TGF5ZXJTa2lhKExheWVyVHlwZSB0eXBl
LCBHcmFwaGljc0xheWVyU2tpYSogb3duZXIpCisgICAgOiBtX25lZWRzRGlzcGxheU9uQm91bmRz
Q2hhbmdlKGZhbHNlKQorICAgICwgbV9vd25lcihvd25lcikKKyAgICAsIG1fbGF5ZXJUeXBlKHR5
cGUpCisgICAgLCBtX3N1cGVybGF5ZXIoMCkKKyAgICAsIG1fYm9yZGVyV2lkdGgoMCkKKyAgICAs
IG1fYm9yZGVyQ29sb3IoMCwgMCwgMCwgMCkKKyAgICAsIG1fYmFja2dyb3VuZENvbG9yKDAsIDAs
IDAsIDApCisgICAgLCBtX2FuY2hvclBvaW50WigwKQorICAgICwgbV9jbGVhcnNDb250ZXh0KGZh
bHNlKQorICAgICwgbV9kb3VibGVTaWRlZChmYWxzZSkKKyAgICAsIG1fZWRnZUFudGlhbGlhc2lu
Z01hc2soMCkKKyAgICAsIG1faGlkZGVuKGZhbHNlKQorICAgICwgbV9tYXNrc1RvQm91bmRzKGZh
bHNlKQorICAgICwgbV9jb250ZW50c0dyYXZpdHkoQm90dG9tKQorICAgICwgbV9vcGFjaXR5KDEu
MCkKKyAgICAsIG1fb3BhcXVlKHRydWUpCisgICAgLCBtX3pQb3NpdGlvbigwLjApCisgICAgLCBt
X2NhbnZhcygwKQorICAgICwgbV9za2lhQ29udGV4dCgwKQorICAgICwgbV9ncmFwaGljc0NvbnRl
eHQoMCkKKyAgICAsIG1fZ2VvbWV0cnlGbGlwcGVkKGZhbHNlKQoreworICAgIG1fYm91bmRzLnNl
dEVtcHR5KCk7CisgICAgbV9iYWNraW5nU3RvcmVSZWN0LnNldEVtcHR5KCk7CisgICAgbV9mcmFt
ZS5zZXRFbXB0eSgpOworICAgIG1fcG9zaXRpb24uc2V0KDAsIDApOworICAgIG1fYW5jaG9yUG9p
bnQuc2V0KDAsIDApOworICAgIG1fdHJhbnNmb3JtLnJlc2V0KCk7CisgICAgbV9zdWJsYXllclRy
YW5zZm9ybS5yZXNldCgpOworCisgICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KG1fYmFja2luZ1N0
b3JlUmVjdCk7Cit9CisKK0xheWVyU2tpYTo6fkxheWVyU2tpYSgpCit7CisgICAgLy8gT3VyIHN1
cGVybGF5ZXIgc2hvdWxkIGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gdXMsIHNvIHRoZXJlIHNo
b3VsZCBiZSBubyB3YXkgZm9yIHVzIHRvIGJlIGRlc3Ryb3llZCB3aGlsZSB3ZSBzdGlsbCBoYXZl
IGEgc3VwZXJsYXllci4KKyAgICBBU1NFUlQoIXN1cGVybGF5ZXIoKSk7CisKKyAgICBkZWxldGUg
bV9ncmFwaGljc0NvbnRleHQ7CisgICAgZGVsZXRlIG1fc2tpYUNvbnRleHQ7CisgICAgZGVsZXRl
IG1fY2FudmFzOworfQorCit2b2lkIExheWVyU2tpYTo6dXBkYXRlR3JhcGhpY3NDb250ZXh0KGNv
bnN0IFNrSVJlY3QmIHJlY3QpCit7CisgICAgaWYgKG1fZ3JhcGhpY3NDb250ZXh0KQorICAgICAg
ICBkZWxldGUgbV9ncmFwaGljc0NvbnRleHQ7CisgICAgaWYgKG1fc2tpYUNvbnRleHQpCisgICAg
ICAgIGRlbGV0ZSBtX3NraWFDb250ZXh0OworICAgIGlmIChtX2NhbnZhcykKKyAgICAgICAgZGVs
ZXRlIG1fY2FudmFzOworCisgICAgbV9jYW52YXMgPSBuZXcgc2tpYTo6UGxhdGZvcm1DYW52YXMo
cmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpLCBmYWxzZSk7CisgICAgbV9za2lhQ29udGV4dCA9
IG5ldyBQbGF0Zm9ybUNvbnRleHRTa2lhKG1fY2FudmFzKTsKKworICAgIC8vIFRoaXMgaXMgbmVl
ZGVkIHRvIGdldCB0ZXh0IHRvIHNob3cgdXAgY29ycmVjdGx5LiAgV2l0aG91dCBpdCwKKyAgICAv
LyBHREkgcmVuZGVycyB3aXRoIHplcm8gYWxwaGEgYW5kIHRoZSB0ZXh0IGJlY29tZXMgaW52aXNp
YmxlLgorICAgIC8vIFVuZm9ydHVuYXRlbHksIHNldHRpbmcgdGhpcyB0byB0cnVlIGRpc2FibGVz
IGNsZWFydHlwZS4KKyAgICBtX3NraWFDb250ZXh0LT5zZXREcmF3aW5nVG9JbWFnZUJ1ZmZlcih0
cnVlKTsKKworICAgIG1fZ3JhcGhpY3NDb250ZXh0ID0gbmV3IEdyYXBoaWNzQ29udGV4dChyZWlu
dGVycHJldF9jYXN0PFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0Kj4obV9za2lhQ29udGV4dCkpOwor
CisgICAgLy8gQmFja2luZyBzdG9yZSBhIGxheWVyIGNvdWxkIGJlIGRpZmZlcmVudCB0aGFuIHRo
ZW4gbGF5ZXIncyBib3VuZHMuCisgICAgLy8gVGhpcyBpcyBtb3N0bHkgdHJ1ZSBmb3IgdGhlIHJv
b3QgbGF5ZXIgdGhhdCdzIHNpemVkIGJhc2VkIG9uIHRoZSB2aWV3CisgICAgLy8gc2l6ZSByYXRo
ZXIgdGhhbiB0aGUgYWN0dWFsIGxheWVyIHNpemUuCisgICAgbV9iYWNraW5nU3RvcmVSZWN0ID0g
cmVjdDsKK30KKwordm9pZCBMYXllclNraWE6OnVwZGF0ZUNvbnRlbnRzKCkKK3sKKyAgICBSZW5k
ZXJMYXllckJhY2tpbmcqIGJhY2tpbmcgPSBzdGF0aWNfY2FzdDxSZW5kZXJMYXllckJhY2tpbmcq
PihtX293bmVyLT5jbGllbnQoKSk7CisKKyAgICBpZiAoYmFja2luZyAmJiAhYmFja2luZy0+cGFp
bnRpbmdHb2VzVG9XaW5kb3coKSkKKyAgICAgICAgbV9vd25lci0+cGFpbnRHcmFwaGljc0xheWVy
Q29udGVudHMoKm1fZ3JhcGhpY3NDb250ZXh0LCBJbnRSZWN0KDAsIDAsIG1fYm91bmRzLndpZHRo
KCksIG1fYm91bmRzLmhlaWdodCgpKSk7CisKKyAgICAvLyBQYWludCB0aGUgZGVidWcgYm9yZGVy
LgorICAgIC8vIFRPRE8odmFuZ2VsaXMpOiBBZGQgYSBmbGFnIHRvIGNoZWNrIGlmIGRlYnVnIGJv
cmRlcnMgYXJlIHVzZWQuCisgICAgbV9ncmFwaGljc0NvbnRleHQtPnNldFN0cm9rZUNvbG9yKG1f
Ym9yZGVyQ29sb3IsIERldmljZUNvbG9yU3BhY2UpOworICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5z
ZXRTdHJva2VUaGlja25lc3MobV9ib3JkZXJXaWR0aCk7CisgICAgbV9ncmFwaGljc0NvbnRleHQt
PmRyYXdMaW5lKEludFBvaW50KDAsIDApLCBJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCAwKSk7
CisgICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KDAsIDApLCBJbnRQb2lu
dCgwLCBtX2JvdW5kcy5oZWlnaHQoKSkpOworICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5kcmF3TGlu
ZShJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCAwKSwgSW50UG9pbnQobV9ib3VuZHMud2lkdGgo
KSwgbV9ib3VuZHMuaGVpZ2h0KCkpKTsKKyAgICBtX2dyYXBoaWNzQ29udGV4dC0+ZHJhd0xpbmUo
SW50UG9pbnQoMCwgbV9ib3VuZHMuaGVpZ2h0KCkpLCBJbnRQb2ludChtX2JvdW5kcy53aWR0aCgp
LCBtX2JvdW5kcy5oZWlnaHQoKSkpOworfQorCisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXROZWVkc0Nv
bW1pdCgpCit7CisgICAgLy8gQ2FsbCBub3RpZnlTeW5jUmVxdWlyZWQoKSwgd2hpY2ggaW4gdGhp
cyBpbXBsZW1lbnRhdGlvbiBwbHVtYnMgdGhyb3VnaCB0bworICAgIC8vIGNhbGwgc2V0Um9vdExh
eWVyTmVlZHNEaXNwbGF5KCkgb24gdGhlIFdlYlZpZXcsIHdoaWNoIGNhdXNlcyB0aGUgQ0FDRlJl
bmRlcmVyCisgICAgLy8gdG8gcmVuZGVyIGEgZnJhbWUuCisgICAgaWYgKG1fb3duZXIpCisgICAg
ICAgIG1fb3duZXItPm5vdGlmeVN5bmNSZXF1aXJlZCgpOworfQorCit2b2lkIExheWVyU2tpYTo6
YWRkU3VibGF5ZXIoUGFzc1JlZlB0cjxMYXllclNraWE+IHN1YmxheWVyKQoreworICAgIGluc2Vy
dFN1YmxheWVyKHN1YmxheWVyLCBudW1TdWJsYXllcnMoKSk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lh
OjppbnNlcnRTdWJsYXllcihQYXNzUmVmUHRyPExheWVyU2tpYT4gc3VibGF5ZXIsIHNpemVfdCBp
bmRleCkKK3sKKyAgICBpbmRleCA9IG1pbihpbmRleCwgbV9zdWJsYXllcnMuc2l6ZSgpKTsKKyAg
ICBtX3N1YmxheWVycy5pbnNlcnQoaW5kZXgsIHN1YmxheWVyKTsKKyAgICBzdWJsYXllci0+c2V0
U3VwZXJsYXllcih0aGlzKTsKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExheWVy
U2tpYTo6cmVwbGFjZVN1YmxheWVyKExheWVyU2tpYSogcmVmZXJlbmNlLCBQYXNzUmVmUHRyPExh
eWVyU2tpYT4gbmV3TGF5ZXIpCit7CisgICAgQVNTRVJUX0FSRyhyZWZlcmVuY2UsIHJlZmVyZW5j
ZSk7CisgICAgQVNTRVJUX0FSRyhyZWZlcmVuY2UsIHJlZmVyZW5jZS0+c3VwZXJsYXllcigpID09
IHRoaXMpOworCisgICAgaWYgKHJlZmVyZW5jZSA9PSBuZXdMYXllcikKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKCFuZXdMYXllcikgeworICAgICAgICByZW1vdmVTdWJsYXllcihyZWZlcmVu
Y2UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmV3TGF5ZXItPnJlbW92ZUZyb21T
dXBlcmxheWVyKCk7CisKKyAgICBpbnQgcmVmZXJlbmNlSW5kZXggPSBpbmRleE9mU3VibGF5ZXIo
cmVmZXJlbmNlKTsKKyAgICBBU1NFUlQocmVmZXJlbmNlSW5kZXggIT0gLTEpOworICAgIGlmIChy
ZWZlcmVuY2VJbmRleCA9PSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcmVmZXJlbmNlLT5y
ZW1vdmVGcm9tU3VwZXJsYXllcigpOworICAgIGluc2VydFN1YmxheWVyKG5ld0xheWVyLCByZWZl
cmVuY2VJbmRleCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpyZW1vdmVGcm9tU3VwZXJsYXllcigp
Cit7CisgICAgTGF5ZXJTa2lhKiBzdXBlcmxheWVyID0gdGhpcy0+c3VwZXJsYXllcigpOworICAg
IGlmICghc3VwZXJsYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgc3VwZXJsYXllci0+cmVt
b3ZlU3VibGF5ZXIodGhpcyk7CisgICAgc3VwZXJsYXllci0+c2V0TmVlZHNDb21taXQoKTsKK30K
Kwordm9pZCBMYXllclNraWE6OnJlbW92ZVN1YmxheWVyKExheWVyU2tpYSogc3VibGF5ZXIpCit7
CisgICAgaW50IGZvdW5kSW5kZXggPSBpbmRleE9mU3VibGF5ZXIoc3VibGF5ZXIpOworICAgIGlm
IChmb3VuZEluZGV4ID09IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3N1YmxheWVycy5y
ZW1vdmUoZm91bmRJbmRleCk7CisgICAgc3VibGF5ZXItPnNldFN1cGVybGF5ZXIoMCk7CisgICAg
c2V0TmVlZHNDb21taXQoKTsKK30KKworaW50IExheWVyU2tpYTo6aW5kZXhPZlN1YmxheWVyKGNv
bnN0IExheWVyU2tpYSogcmVmZXJlbmNlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bV9zdWJsYXllcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1fc3VibGF5ZXJzW2ldID09
IHJlZmVyZW5jZSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gLTE7
Cit9CisKK0xheWVyU2tpYSogTGF5ZXJTa2lhOjphbmNlc3Rvck9yU2VsZldpdGhTdXBlcmxheWVy
KExheWVyU2tpYSogc3VwZXJsYXllcikgY29uc3QKK3sKKyAgICBMYXllclNraWEqIGxheWVyID0g
Y29uc3RfY2FzdDxMYXllclNraWEqPih0aGlzKTsKKyAgICBmb3IgKExheWVyU2tpYSogYW5jZXN0
b3IgPSB0aGlzLT5zdXBlcmxheWVyKCk7IGFuY2VzdG9yOyBsYXllciA9IGFuY2VzdG9yLCBhbmNl
c3RvciA9IGFuY2VzdG9yLT5zdXBlcmxheWVyKCkpIHsKKyAgICAgICAgaWYgKGFuY2VzdG9yID09
IHN1cGVybGF5ZXIpCisgICAgICAgICAgICByZXR1cm4gbGF5ZXI7CisgICAgfQorICAgIHJldHVy
biAwOworfQorCit2b2lkIExheWVyU2tpYTo6c2V0QmFja2luZ1N0b3JlUmVjdChjb25zdCBTa0lS
ZWN0JiByZWN0KQoreworICAgIGlmIChtX2JhY2tpbmdTdG9yZVJlY3QgPT0gcmVjdCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KHJlY3QpOworfQorCisKK3Zv
aWQgTGF5ZXJTa2lhOjpzZXRCb3VuZHMoY29uc3QgU2tJUmVjdCYgcmVjdCkKK3sKKyAgICBpZiAo
cmVjdCA9PSBtX2JvdW5kcykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9ib3VuZHMgPSByZWN0
OworCisgICAgLy8gUmUtY3JlYXRlIHRoZSBjYW52YXMgYW5kIGFzc29jaWF0ZWQgY29udGV4dHMu
CisgICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KG1fYm91bmRzKTsKKworICAgIHNldE5lZWRzQ29t
bWl0KCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXRGcmFtZShjb25zdCBTa1JlY3QmIHJlY3Qp
Cit7CisgICAgbV9mcmFtZSA9IHJlY3Q7CisgICAgc2V0TmVlZHNDb21taXQoKTsKK30KKworCitM
YXllclNraWEqIExheWVyU2tpYTo6cm9vdExheWVyKCkgY29uc3QKK3sKKyAgICBMYXllclNraWEq
IGxheWVyID0gY29uc3RfY2FzdDxMYXllclNraWEqPih0aGlzKTsKKyAgICBmb3IgKExheWVyU2tp
YSogc3VwZXJsYXllciA9IGxheWVyLT5zdXBlcmxheWVyKCk7IHN1cGVybGF5ZXI7IGxheWVyID0g
c3VwZXJsYXllciwgc3VwZXJsYXllciA9IHN1cGVybGF5ZXItPnN1cGVybGF5ZXIoKSkgeyB9Cisg
ICAgcmV0dXJuIGxheWVyOworfQorCit2b2lkIExheWVyU2tpYTo6cmVtb3ZlQWxsU3VibGF5ZXJz
KCkKK3sKKyAgICBtX3N1YmxheWVycy5jbGVhcigpOworICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9
CisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXRTdWJsYXllcnMoY29uc3QgVmVjdG9yPFJlZlB0cjxMYXll
clNraWE+ID4mIHN1YmxheWVycykKK3sKKyAgICBtX3N1YmxheWVycyA9IHN1YmxheWVyczsKK30K
Kwordm9pZCBMYXllclNraWE6OnNldFN1cGVybGF5ZXIoTGF5ZXJTa2lhKiBzdXBlcmxheWVyKQor
eworICAgIG1fc3VwZXJsYXllciA9IHN1cGVybGF5ZXI7Cit9CisKK0xheWVyU2tpYSogTGF5ZXJT
a2lhOjpzdXBlcmxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdXBlcmxheWVyOworfQor
Cit2b2lkIExheWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0IFNrUmVjdCYgZGlydHlSZWN0
KQoreworICAgIC8vIFRPRE8odmFuZ2VsaXMpOiBpbXBsZW1lbnQKKyAgICBzZXROZWVkc0NvbW1p
dCgpOworfQorCit2b2lkIExheWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICAvLyBU
T0RPKHZhbmdlbGlzKTogaW1wbGVtZW50Cit9CisKKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L0xheWVyU2tpYS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tp
YS9MYXllclNraWEuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9MYXllclNraWEuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaWZuZGVm
IExheWVyU2tpYV9oCisjZGVmaW5lIExheWVyU2tpYV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
IkdyYXBoaWNzTGF5ZXJTa2lhLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNs
dWRlICJTa0NvbG9yLmgiCisjaW5jbHVkZSAiU2tQb2ludC5oIgorI2luY2x1ZGUgIlN0cmluZ0hh
c2guaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9Q
YXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CisKKworbmFtZXNwYWNlIHNraWEgeworY2xhc3MgUGxhdGZvcm1DYW52YXM7Cit9
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJTa2lhIDogcHVibGljIFJlZkNv
dW50ZWQ8TGF5ZXJTa2lhPiB7CitwdWJsaWM6CisgICAgZW51bSBMYXllclR5cGUgeyBMYXllciwg
VHJhbnNmb3JtTGF5ZXIgfTsKKyAgICBlbnVtIEZpbHRlclR5cGUgeyBMaW5lYXIsIE5lYXJlc3Qs
IFRyaWxpbmVhciwgTGFuY3pvcyB9OworICAgIGVudW0gQ29udGVudHNHcmF2aXR5VHlwZSB7IENl
bnRlciwgVG9wLCBCb3R0b20sIExlZnQsIFJpZ2h0LCBUb3BMZWZ0LCBUb3BSaWdodCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBCb3R0b21MZWZ0LCBCb3R0b21SaWdodCwgUmVzaXpl
LCBSZXNpemVBc3BlY3QsIFJlc2l6ZUFzcGVjdEZpbGwgfTsKKworICAgIHN0YXRpYyBQYXNzUmVm
UHRyPExheWVyU2tpYT4gY3JlYXRlKExheWVyVHlwZSwgR3JhcGhpY3NMYXllclNraWEqIG93bmVy
ID0gMCk7CisKKyAgICB+TGF5ZXJTa2lhKCk7CisKKyAgICB2b2lkIGRpc3BsYXkoUGxhdGZvcm1H
cmFwaGljc0NvbnRleHQqKTsKKworICAgIHZvaWQgYWRkU3VibGF5ZXIoUGFzc1JlZlB0cjxMYXll
clNraWE+IHN1YmxheWVyKTsKKyAgICB2b2lkIGluc2VydFN1YmxheWVyKFBhc3NSZWZQdHI8TGF5
ZXJTa2lhPiwgc2l6ZV90IGluZGV4KTsKKyAgICB2b2lkIHJlcGxhY2VTdWJsYXllcihMYXllclNr
aWEqIHJlZmVyZW5jZSwgUGFzc1JlZlB0cjxMYXllclNraWE+KTsKKyAgICB2b2lkIHJlbW92ZUZy
b21TdXBlcmxheWVyKCk7CisKKyAgICBMYXllclNraWEqIGFuY2VzdG9yT3JTZWxmV2l0aFN1cGVy
bGF5ZXIoTGF5ZXJTa2lhKikgY29uc3Q7CisKKyAgICB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0
IFNrUG9pbnQmIGFuY2hvclBvaW50KSB7IG1fYW5jaG9yUG9pbnQgPSBhbmNob3JQb2ludDsgc2V0
TmVlZHNDb21taXQoKTsgfQorICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQoKSBjb25zdCB7IHJldHVy
biBtX2FuY2hvclBvaW50OyB9CisKKyAgICB2b2lkIHNldEFuY2hvclBvaW50WihmbG9hdCBhbmNo
b3JQb2ludFopIHsgbV9hbmNob3JQb2ludFogPSBhbmNob3JQb2ludFo7IHNldE5lZWRzQ29tbWl0
KCk7IH0KKyAgICBmbG9hdCBhbmNob3JQb2ludFooKSBjb25zdCB7IHJldHVybiBtX2FuY2hvclBv
aW50WjsgfQorCisgICAgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsgbV9i
YWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIENvbG9yIGJh
Y2tncm91bmRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9yOyB9CisKKyAg
ICB2b2lkIHNldEJvcmRlckNvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikgeyBtX2JvcmRlckNvbG9y
ID0gY29sb3I7IH0KKyAgICBDb2xvciBib3JkZXJDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYm9y
ZGVyQ29sb3I7IH0KKworICAgIHZvaWQgc2V0Qm9yZGVyV2lkdGgoZmxvYXQgd2lkdGgpIHsgbV9i
b3JkZXJXaWR0aCA9IHdpZHRoOyB9CisgICAgU2tTY2FsYXIgYm9yZGVyV2lkdGgoKSBjb25zdCB7
IHJldHVybiBtX2JvcmRlcldpZHRoOyB9CisKKyAgICB2b2lkIHNldEJvdW5kcyhjb25zdCBTa0lS
ZWN0Jik7CisgICAgU2tJUmVjdCBib3VuZHMoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kczsgfQor
CisgICAgdm9pZCBzZXRDbGVhcnNDb250ZXh0KGJvb2wgY2xlYXJzKSB7IG1fY2xlYXJzQ29udGV4
dCA9IGNsZWFyczsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgY2xlYXJzQ29udGV4dCgp
IGNvbnN0IHsgcmV0dXJuIG1fY2xlYXJzQ29udGV4dDsgfQorCisgICAgdm9pZCBzZXRDb250ZW50
c0dyYXZpdHkoQ29udGVudHNHcmF2aXR5VHlwZSBncmF2aXR5VHlwZSkgeyBtX2NvbnRlbnRzR3Jh
dml0eSA9IGdyYXZpdHlUeXBlOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgQ29udGVudHNHcmF2
aXR5VHlwZSBjb250ZW50c0dyYXZpdHkoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRzR3Jhdml0
eTsgfQorCisgICAgdm9pZCBzZXREb3VibGVTaWRlZChib29sIGRvdWJsZVNpZGVkKSB7IG1fZG91
YmxlU2lkZWQgPSBkb3VibGVTaWRlZDsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgZG91
YmxlU2lkZWQoKSBjb25zdCB7IHJldHVybiBtX2RvdWJsZVNpZGVkOyB9CisKKyAgICB2b2lkIHNl
dEVkZ2VBbnRpYWxpYXNpbmdNYXNrKHVpbnQzMl90IG1hc2spIHsgbV9lZGdlQW50aWFsaWFzaW5n
TWFzayA9IG1hc2s7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICB1aW50MzJfdCBlZGdlQW50aWFs
aWFzaW5nTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1fZWRnZUFudGlhbGlhc2luZ01hc2s7IH0KKwor
ICAgIHZvaWQgc2V0RnJhbWUoY29uc3QgU2tSZWN0Jik7CisgICAgU2tSZWN0IGZyYW1lKCkgY29u
c3QgeyByZXR1cm4gbV9mcmFtZTsgfQorCisgICAgdm9pZCBzZXRIaWRkZW4oYm9vbCBoaWRkZW4p
IHsgbV9oaWRkZW4gPSBoaWRkZW47IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBib29sIGlzSGlk
ZGVuKCkgY29uc3QgeyByZXR1cm4gbV9oaWRkZW47IH0KKworICAgIHZvaWQgc2V0TWFza3NUb0Jv
dW5kcyhib29sIG1hc2tzVG9Cb3VuZHMpIHsgbV9tYXNrc1RvQm91bmRzID0gbWFza3NUb0JvdW5k
czsgfQorICAgIGJvb2wgbWFza3NUb0JvdW5kcygpIGNvbnN0IHsgcmV0dXJuIG1fbWFza3NUb0Jv
dW5kczsgfQorCisgICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkgeyBtX25hbWUg
PSBuYW1lOyB9CisgICAgU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKwor
ICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5KGNvbnN0IFNrUmVjdCYgZGlydHlSZWN0KTsKKyAgICB2
b2lkIHNldE5lZWRzRGlzcGxheSgpOworCisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXlPbkJvdW5k
c0NoYW5nZShib29sIG5lZWRzRGlzcGxheSkgeyBtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdl
ID0gbmVlZHNEaXNwbGF5OyB9CisKKyAgICB2b2lkIHNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkg
eyBtX29wYWNpdHkgPSBvcGFjaXR5OyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgZmxvYXQgb3Bh
Y2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1fb3BhY2l0eTsgfQorCisgICAgdm9pZCBzZXRPcGFxdWUo
Ym9vbCBvcGFxdWUpIHsgbV9vcGFxdWUgPSBvcGFxdWU7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAg
ICBib29sIG9wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3BhcXVlOyB9CisKKyAgICB2b2lkIHNl
dFBvc2l0aW9uKGNvbnN0IFNrUG9pbnQmIHBvc2l0aW9uKSB7IG1fcG9zaXRpb24gPSBwb3NpdGlv
bjsgIHNldE5lZWRzQ29tbWl0KCk7IH0KKworICAgIFNrUG9pbnQgcG9zaXRpb24oKSBjb25zdCB7
IHJldHVybiBtX3Bvc2l0aW9uOyB9CisKKyAgICB2b2lkIHNldFpQb3NpdGlvbihmbG9hdCB6UG9z
aXRpb24pIHsgbV96UG9zaXRpb24gPSB6UG9zaXRpb247IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAg
ICBTa1NjYWxhciB6UG9zaXRpb24oKSBjb25zdCB7ICByZXR1cm4gbV96UG9zaXRpb247IH0KKwor
ICAgIExheWVyU2tpYSogcm9vdExheWVyKCkgY29uc3Q7CisKKyAgICB2b2lkIHJlbW92ZUFsbFN1
YmxheWVycygpOworCisgICAgdm9pZCBzZXRTdWJsYXllcnMoY29uc3QgVmVjdG9yPFJlZlB0cjxM
YXllclNraWE+ID4mKTsKKworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lhPiA+JiBn
ZXRTdWJsYXllcnMoKSBjb25zdCB7IHJldHVybiBtX3N1YmxheWVyczsgfQorCisgICAgdm9pZCBz
ZXRTdWJsYXllclRyYW5zZm9ybShjb25zdCBTa01hdHJpeCYgdHJhbnNmb3JtKSB7IG1fc3VibGF5
ZXJUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBTa01hdHJp
eCBzdWJsYXllclRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fc3VibGF5ZXJUcmFuc2Zvcm07
IH0KKworICAgIHZvaWQgc2V0U3VwZXJsYXllcihMYXllclNraWEqIHN1cGVybGF5ZXIpOworICAg
IExheWVyU2tpYSogc3VwZXJsYXllcigpIGNvbnN0OworCisKKyAgICB2b2lkIHNldFRyYW5zZm9y
bShjb25zdCBTa01hdHJpeCYgdHJhbnNmb3JtKSB7IG1fdHJhbnNmb3JtID0gdHJhbnNmb3JtOyBz
ZXROZWVkc0NvbW1pdCgpOyB9CisgICAgU2tNYXRyaXggdHJhbnNmb3JtKCkgY29uc3QgeyByZXR1
cm4gbV90cmFuc2Zvcm07IH0KKworICAgIHZvaWQgc2V0R2VvbWV0cnlGbGlwcGVkKGJvb2wgZmxp
cHBlZCkgeyBtX2dlb21ldHJ5RmxpcHBlZCA9IGZsaXBwZWQ7IHNldE5lZWRzQ29tbWl0KCk7IH0K
KyAgICBib29sIGdlb21ldHJ5RmxpcHBlZCgpIGNvbnN0IHsgcmV0dXJuIG1fZ2VvbWV0cnlGbGlw
cGVkOyB9CisKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzKCk7CisKKyAgICBza2lhOjpQbGF0Zm9y
bUNhbnZhcyogcGxhdGZvcm1DYW52YXMoKSB7IHJldHVybiBtX2NhbnZhczsgfQorICAgIEdyYXBo
aWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0KCkgeyByZXR1cm4gbV9ncmFwaGljc0NvbnRleHQ7
IH0KKworICAgIHZvaWQgc2V0QmFja2luZ1N0b3JlUmVjdChjb25zdCBTa0lSZWN0JiByZWN0KTsK
KworcHJpdmF0ZToKKyAgICBMYXllclNraWEoTGF5ZXJUeXBlLCBHcmFwaGljc0xheWVyU2tpYSog
b3duZXIpOworCisgICAgdm9pZCBzZXROZWVkc0NvbW1pdCgpOworCisgICAgdm9pZCBwYWludE1l
KCk7CisKKyAgICBzaXplX3QgbnVtU3VibGF5ZXJzKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiBtX3N1YmxheWVycy5zaXplKCk7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgaW5k
ZXggb2YgdGhlIHBhc3NlZCBsYXllciBpbiB0aGlzIGxheWVyJ3Mgc3VibGF5ZXJzIGxpc3QKKyAg
ICAvLyBvciAtMSBpZiBub3QgZm91bmQKKyAgICBpbnQgaW5kZXhPZlN1YmxheWVyKGNvbnN0IExh
eWVyU2tpYSopOworCisgICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSByZW1v
dmVGcm9tU3VwZXJsYXllci4KKyAgICB2b2lkIHJlbW92ZVN1YmxheWVyKExheWVyU2tpYSopOwor
CisgICAgLy8gUmUtY3JlYXRlZCB0aGUgY2FudmFzIGFuZCBncmFwaGljcyBjb250ZXh0LiAgVGhp
cyBtZXRob2QKKyAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBsYXllciBpcyBy
ZXNpemVkLgorICAgIHZvaWQgdXBkYXRlR3JhcGhpY3NDb250ZXh0KGNvbnN0IFNrSVJlY3QmIHJl
Y3QpOworCisgICAgVmVjdG9yPFJlZlB0cjxMYXllclNraWE+ID4gbV9zdWJsYXllcnM7CisgICAg
TGF5ZXJTa2lhKiBtX3N1cGVybGF5ZXI7CisKKyAgICBib29sIG1fbmVlZHNEaXNwbGF5T25Cb3Vu
ZHNDaGFuZ2U7CisgICAgR3JhcGhpY3NMYXllclNraWEqIG1fb3duZXI7CisKKyAgICBza2lhOjpQ
bGF0Zm9ybUNhbnZhcyogbV9jYW52YXM7CisgICAgUGxhdGZvcm1Db250ZXh0U2tpYSogbV9za2lh
Q29udGV4dDsKKyAgICBHcmFwaGljc0NvbnRleHQqIG1fZ3JhcGhpY3NDb250ZXh0OworICAgIENv
bG9yIG1fYm9yZGVyQ29sb3I7CisgICAgZmxvYXQgbV9ib3JkZXJXaWR0aDsKKworICAgIExheWVy
VHlwZSBtX2xheWVyVHlwZTsKKworICAgIFNrSVJlY3QgbV9ib3VuZHM7CisgICAgU2tJUmVjdCBt
X2JhY2tpbmdTdG9yZVJlY3Q7CisgICAgU2tQb2ludCBtX3Bvc2l0aW9uOworICAgIFNrUG9pbnQg
bV9hbmNob3JQb2ludDsKKyAgICBmbG9hdCBtX2FuY2hvclBvaW50WjsKKyAgICBDb2xvciBtX2Jh
Y2tncm91bmRDb2xvcjsKKyAgICBib29sIG1fY2xlYXJzQ29udGV4dDsKKyAgICBib29sIG1fZG91
YmxlU2lkZWQ7CisgICAgdWludDMyX3QgbV9lZGdlQW50aWFsaWFzaW5nTWFzazsKKyAgICBTa1Jl
Y3QgbV9mcmFtZTsKKyAgICBib29sIG1faGlkZGVuOworICAgIGJvb2wgbV9tYXNrc1RvQm91bmRz
OworICAgIENvbnRlbnRzR3Jhdml0eVR5cGUgbV9jb250ZW50c0dyYXZpdHk7CisgICAgZmxvYXQg
bV9vcGFjaXR5OworICAgIGJvb2wgbV9vcGFxdWU7CisgICAgZmxvYXQgbV96UG9zaXRpb247Cisg
ICAgYm9vbCBtX2dlb21ldHJ5RmxpcHBlZDsKKyAgICBTdHJpbmcgbV9uYW1lOworCisgICAgU2tN
YXRyaXggbV90cmFuc2Zvcm07CisgICAgU2tNYXRyaXggbV9zdWJsYXllclRyYW5zZm9ybTsKK307
CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlm
IC8vIFdLQ0FDRkxheWVyX2gKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTU0MjgpCisrKyBX
ZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDEgQEAK
KzIwMTAtMDMtMDIgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNAY2hyb21pdW0ub3JnPgor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZGluZyBz
dXBwb3J0IGZvciB0aGUgQUNDRUxFUkFURURfQ09NUE9TSVRJTkcgcmVuZGVyIHBhdGggdG8gQ2hy
b21pdW0uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0z
NTU1NworICAgICAgICBDdXJyZW50bHkgY29tcG9zaXRpbmcgb2YgbGF5ZXJzIGlzIHBlcmZvcm1l
ZCB2aWEgcy93IGNvbXBvc2l0b3Igd2hpY2ggcmVsaWVzIG9uIFNraWEuIFRoaXMgaXMgYW4gaW5p
dGlhbCBjaGVjay1pbgorICAgICAgICBhbmQgaXQncyBvbmx5IGJlZW4gdGVzdGVkIG9uIFdpbmRv
d3MuIENvbXBpbGluZyB0aGUgY29kZSByZXF1aXJlcyBzZXRpbmcgInVzZV9hY2NlbGVyYXRlZF9j
b21wb3NpdGluZz0xIgorICAgICAgICB0byBHWVBfREVGSU5FUy4gVGhlIHVwZGF0ZSBvZiBsYXll
ciBjb250ZW50cyBhbmQgY29tcG9zaXRpbmcgaXMgZmFpcmx5IGluZWZmaWNpZW50IGJ1dCB0aGlz
IHdpbGwgYmUgZml4ZWQgaW4KKyAgICAgICAgc3Vic2VxdWVudCBjaGVjay1pbnMuCisKKyAgICAg
ICAgKiBzcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6OkNocm9tZUNs
aWVudEltcGw6OmF0dGFjaFJvb3RHcmFwaGljc0xheWVyKToKKyAgICAgICAgKFdlYktpdDo6Q2hy
b21lQ2xpZW50SW1wbDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYyk6CisgICAgICAgICog
c3JjL0Nocm9tZUNsaWVudEltcGwuaDoKKyAgICAgICAgKFdlYktpdDo6Q2hyb21lQ2xpZW50SW1w
bDo6c2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbik6CisgICAgICAgICBBZGRl
ZCBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBSZW5kZXJMYXllckNvbXBvc2l0b3IKKworICAgICAg
ICAqIHNyYy9XZWJGcmFtZUltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJGcmFtZUltcGw6
OnBhaW50V2l0aENvbnRleHQpOgorICAgICAgICAoV2ViS2l0OjpXZWJGcmFtZUltcGw6OnBhaW50
KToKKyAgICAgICAgKiBzcmMvV2ViRnJhbWVJbXBsLmg6CisgICAgICAgIFNwbGl0IFdlYkZyYW1l
SW1wbDo6cGFpbnQoKSBpbnRvIHR3byBtZXRob2RzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gY2Fs
bCB0aGUgcGFpbnQKKyAgICAgICAgcm91dGluZSB3aXRoIGFuIGV4aXN0aW5nIEdyYXBoaWNzQ29u
dGV4dCwgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciBwYWludGluZyB0aGUgcm9vdCBsYXllciBpbnRv
CisgICAgICAgIGl0cyBvd24gYmFja2luZyBzdXJmYWNlLgorCisgICAgICAgICogc3JjL1dlYlZp
ZXdJbXBsLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OldlYlZpZXdJbXBsKToK
KyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnBhaW50KToKKyAgICAgICAgTW9kaWZpZWQg
bWV0aG9kIHRvIGhhbmRsZSB0aGUgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcgcGF0aC4gTm93LCB3
aGVuIGRvaW5nIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nLAorICAgICAgICBwYWludCgpIHJlc3Vs
dHMgdG8gcmVwYWludGluZyB0aGUgY29udGVudHMgb2YgdGhlIHJvb3QgbGF5ZXIgYW5kIHRoZW4g
ZG9pbmcgYSBjb21wb3NpdGUgb3BlcmF0aW9uLgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1w
bDo6c2V0Um9vdEdyYXBoaWNzTGF5ZXIpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6
c2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
Ojp1cGRhdGVSb290TGF5ZXJDb250ZW50cyk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBs
OjpzZXRSb290TGF5ZXJOZWVkc0Rpc3BsYXkpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5o
OgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6aXNBY2NlbGVyYXRlZENvbXBvc2l0aW5n
KToKKwogMjAxMC0wMy0wMiAgQ2hyaXMgRmxlaXphY2ggIDxjZmxlaXphY2hAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IEJldGggRGFraW4uCkluZGV4OiBXZWJLaXQvY2hyb21pdW0v
c3JjL0Nocm9tZUNsaWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvQ2hyb21lQ2xpZW50SW1wbC5jcHAJKHJldmlzaW9uIDU1NDI4KQorKysgV2ViS2l0L2Nocm9t
aXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDcsNiArNDcs
NyBAQAogI2luY2x1ZGUgIkdlb2xvY2F0aW9uU2VydmljZS5oIgogI2luY2x1ZGUgIkdlb2xvY2F0
aW9uU2VydmljZUJyaWRnZUNocm9taXVtLmgiCiAjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNl
Q2hyb21pdW0uaCIKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCiAjaW5jbHVkZSAiSGl0VGVz
dFJlc3VsdC5oIgogI2luY2x1ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJOb2RlLmgiCkBAIC02
ODksNCArNjkwLDE2IEBAIHZvaWQgQ2hyb21lQ2xpZW50SW1wbDo6cmVxdWVzdEdlb2xvY2F0aW8K
ICAgICBtX3dlYlZpZXctPmNsaWVudCgpLT5nZXRHZW9sb2NhdGlvblNlcnZpY2UoKS0+cmVxdWVz
dFBlcm1pc3Npb25Gb3JGcmFtZShnZW9sb2NhdGlvblNlcnZpY2UtPmdlb2xvY2F0aW9uU2Vydmlj
ZUJyaWRnZSgpLT5nZXRCcmlkZ2VJZCgpLCBmcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCkpOwogfQog
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQordm9pZCBDaHJvbWVDbGllbnRJbXBs
OjphdHRhY2hSb290R3JhcGhpY3NMYXllcihGcmFtZSogZnJhbWUsIEdyYXBoaWNzTGF5ZXIqIGdy
YXBoaWNzTGF5ZXIpCit7CisgICAgbV93ZWJWaWV3LT5zZXRSb290R3JhcGhpY3NMYXllcihncmFw
aGljc0xheWVyID8gZ3JhcGhpY3NMYXllci0+cGxhdGZvcm1MYXllcigpIDogMCk7Cit9CisKK3Zv
aWQgQ2hyb21lQ2xpZW50SW1wbDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYygpCit7Cisg
ICAgbV93ZWJWaWV3LT5zZXRSb290TGF5ZXJOZWVkc0Rpc3BsYXkoKTsKK30KKyNlbmRpZgorCiB9
IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xp
ZW50SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xpZW50
SW1wbC5oCShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xp
ZW50SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjksNiArMTI5LDE2IEBAIHB1YmxpYzoKICAg
ICB2aXJ0dWFsIHZvaWQgZm9ybVN0YXRlRGlkQ2hhbmdlKGNvbnN0IFdlYkNvcmU6Ok5vZGUqKTsK
ICAgICB2aXJ0dWFsIFBhc3NPd25QdHI8V2ViQ29yZTo6SFRNTFBhcnNlclF1aXJrcz4gY3JlYXRl
SFRNTFBhcnNlclF1aXJrcygpIHsgcmV0dXJuIDA7IH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICAvLyBQYXNzIDAgYXMgdGhlIEdyYXBoaWNzTGF5ZXIgdG8gZGV0YXRj
aCB0aGUgcm9vdCBsYXllci4KKyAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoUm9vdEdyYXBoaWNzTGF5
ZXIoV2ViQ29yZTo6RnJhbWUqLCBXZWJDb3JlOjpHcmFwaGljc0xheWVyKik7CisgICAgLy8gU2V0
cyBhIGZsYWcgdG8gc3BlY2lmeSB0aGF0IHRoZSBuZXh0IHRpbWUgY29udGVudCBpcyBkcmF3biB0
byB0aGUgd2luZG93LAorICAgIC8vIHRoZSBjaGFuZ2VzIGFwcGVhciBvbiB0aGUgc2NyZWVuIGlu
IHN5bmNocm9ueSB3aXRoIHVwZGF0ZXMgdG8gR3JhcGhpY3NMYXllcnMuCisgICAgdmlydHVhbCB2
b2lkIHNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKSB7IH0KKyAgICAvLyBT
ZXRzIGEgZmxhZyB0byBzcGVjaWZ5IHRoYXQgdGhlIHZpZXcgbmVlZHMgdG8gYmUgdXBkYXRlZCwg
c28gd2UgbmVlZAorICAgIC8vIHRvIGRvIGFuIGVhZ2VyIGxheW91dCBiZWZvcmUgdGhlIGRyYXdp
bmcuCisgICAgdmlydHVhbCB2b2lkIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMoKTsKKyNl
bmRpZgogICAgIC8vIENocm9tZUNsaWVudENocm9taXVtIG1ldGhvZHM6CiAgICAgdmlydHVhbCB2
b2lkIHBvcHVwT3BlbmVkKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyKiBwb3B1cENvbnRhaW5lciwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgYm91
bmRzLApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJGcmFtZUltcGwuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBsLmNwcAkocmV2aXNpb24gNTU0
MjgpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZyYW1lSW1wbC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTE2NDMsMTEgKzE2NDMsMjMgQEAgdm9pZCBXZWJGcmFtZUltcGw6OmxheW91dCgpCiAg
ICAgICAgIHZpZXctPmxheW91dElmTmVlZGVkUmVjdXJzaXZlKCk7CiB9CiAKK3ZvaWQgV2ViRnJh
bWVJbXBsOjpwYWludFdpdGhDb250ZXh0KEdyYXBoaWNzQ29udGV4dCYgZ2MsIGNvbnN0IFdlYlJl
Y3QmIHJlY3QpCit7CisgICAgSW50UmVjdCBkaXJ0eVJlY3QocmVjdCk7CisgICAgZ2Muc2F2ZSgp
OworICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpICYmIGZyYW1lVmlldygpKSB7CisgICAgICAg
IGdjLmNsaXAoZGlydHlSZWN0KTsKKyAgICAgICAgZnJhbWVWaWV3KCktPnBhaW50KCZnYywgZGly
dHlSZWN0KTsKKyAgICAgICAgbV9mcmFtZS0+cGFnZSgpLT5pbnNwZWN0b3JDb250cm9sbGVyKCkt
PmRyYXdOb2RlSGlnaGxpZ2h0KGdjKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZ2MuZmlsbFJlY3Qo
ZGlydHlSZWN0LCBDb2xvcjo6d2hpdGUsIERldmljZUNvbG9yU3BhY2UpOworICAgIGdjLnJlc3Rv
cmUoKTsKK30KKwogdm9pZCBXZWJGcmFtZUltcGw6OnBhaW50KFdlYkNhbnZhcyogY2FudmFzLCBj
b25zdCBXZWJSZWN0JiByZWN0KQogewogICAgIGlmIChyZWN0LmlzRW1wdHkoKSkKICAgICAgICAg
cmV0dXJuOwotICAgIEludFJlY3QgZGlydHlSZWN0KHJlY3QpOwogI2lmIFdFQktJVF9VU0lOR19D
RwogICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjYW52YXMpOwogICAgIExvY2FsQ3VycmVudEdyYXBo
aWNzQ29udGV4dCBsb2NhbENvbnRleHQoJmdjKTsKQEAgLTE2NTksMTQgKzE2NzEsNyBAQCB2b2lk
IFdlYkZyYW1lSW1wbDo6cGFpbnQoV2ViQ2FudmFzKiBjYW52CiAjZWxzZQogICAgIG5vdEltcGxl
bWVudGVkKCk7CiAjZW5kaWYKLSAgICBnYy5zYXZlKCk7Ci0gICAgaWYgKG1fZnJhbWUtPmRvY3Vt
ZW50KCkgJiYgZnJhbWVWaWV3KCkpIHsKLSAgICAgICAgZ2MuY2xpcChkaXJ0eVJlY3QpOwotICAg
ICAgICBmcmFtZVZpZXcoKS0+cGFpbnQoJmdjLCBkaXJ0eVJlY3QpOwotICAgICAgICBtX2ZyYW1l
LT5wYWdlKCktPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZHJhd05vZGVIaWdobGlnaHQoZ2MpOwot
ICAgIH0gZWxzZQotICAgICAgICBnYy5maWxsUmVjdChkaXJ0eVJlY3QsIENvbG9yOjp3aGl0ZSwg
RGV2aWNlQ29sb3JTcGFjZSk7Ci0gICAgZ2MucmVzdG9yZSgpOworICAgIHBhaW50V2l0aENvbnRl
eHQoZ2MsIHJlY3QpOwogfQogCiB2b2lkIFdlYkZyYW1lSW1wbDo6Y3JlYXRlRnJhbWVWaWV3KCkK
SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBsLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJGcmFtZUltcGwuaAkocmV2aXNpb24gNTU0MjgpCisrKyBX
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZyYW1lSW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC00Miw2
ICs0Miw3IEBACiAjaW5jbHVkZSAiV2ViQW5pbWF0aW9uQ29udHJvbGxlckltcGwuaCIKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgR3JhcGhpY3NDb250ZXh0OwogY2xhc3MgSGlzdG9yeUl0
ZW07CiBjbGFzcyBLVVJMOwogY2xhc3MgTm9kZTsKQEAgLTE4MCw2ICsxODEsNyBAQCBwdWJsaWM6
CiAKICAgICB2b2lkIGxheW91dCgpOwogICAgIHZvaWQgcGFpbnQoV2ViQ2FudmFzKiwgY29uc3Qg
V2ViUmVjdCYpOworICAgIHZvaWQgcGFpbnRXaXRoQ29udGV4dChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQmLCBjb25zdCBXZWJSZWN0Jik7CiAgICAgdm9pZCBjcmVhdGVGcmFtZVZpZXcoKTsKIAog
ICAgIHN0YXRpYyBXZWJGcmFtZUltcGwqIGZyb21GcmFtZShXZWJDb3JlOjpGcmFtZSogZnJhbWUp
OwpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAJKHJldmlzaW9uIDU1NDI4KQor
KysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTExMCw2ICsxMTAsMTMgQEAKICNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgogI2VuZGlmCiAKKyNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisjaW5jbHVkZSAid2Via2l0L2dsdWUvd2Vi
a2l0X2dsdWUuaCIKKyNpZiBXRUJLSVRfVVNJTkdfU0tJQQorI2luY2x1ZGUgInNraWEvTGF5ZXJT
a2lhLmgiCisjZW5kaWYKKyNlbmRpZgorCiAvLyBHZXQgcmlkIG9mIFdURidzIHBvdyBkZWZpbmUg
c28gd2UgY2FuIHVzZSBzdGQ6OnBvdy4KICN1bmRlZiBwb3cKICNpbmNsdWRlIDxjbWF0aD4gLy8g
Zm9yIHN0ZDo6cG93CkBAIC0yNDUsNiArMjUyLDEwIEBAIFdlYlZpZXdJbXBsOjpXZWJWaWV3SW1w
bChXZWJWaWV3Q2xpZW50KiAKICAgICAsIG1fc3VnZ2VzdGlvbnNQb3B1cCgwKQogICAgICwgbV9p
c1RyYW5zcGFyZW50KGZhbHNlKQogICAgICwgbV90YWJzVG9MaW5rcyhmYWxzZSkKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLCBtX2xheWVyUmVuZGVyZXIoMCkKKyAgICAs
IG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKGZhbHNlKQorI2VuZGlmCiB7CiAgICAgLy8gV2Vi
S2l0L3dpbi9XZWJWaWV3LmNwcCBkb2VzIHRoZSBzYW1lIHRoaW5nLCBleGNlcHQgdGhleSBjYWxs
IHRoZQogICAgIC8vIEtKUyBzcGVjaWZpYyB3cmFwcGVyIGFyb3VuZCB0aGlzIG1ldGhvZC4gV2Ug
bmVlZCB0byBoYXZlIHRocmVhZGluZwpAQCAtODczLDkgKzg4NCwzMCBAQCB2b2lkIFdlYlZpZXdJ
bXBsOjpsYXlvdXQoKQogCiB2b2lkIFdlYlZpZXdJbXBsOjpwYWludChXZWJDYW52YXMqIGNhbnZh
cywgY29uc3QgV2ViUmVjdCYgcmVjdCkKIHsKLSAgICBXZWJGcmFtZUltcGwqIHdlYmZyYW1lID0g
bWFpbkZyYW1lSW1wbCgpOwotICAgIGlmICh3ZWJmcmFtZSkKLSAgICAgICAgd2ViZnJhbWUtPnBh
aW50KGNhbnZhcywgcmVjdCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisg
ICAgaWYgKCFpc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSkgeworI2VuZGlmCisgICAgICAgIFdl
YkZyYW1lSW1wbCogd2ViZnJhbWUgPSBtYWluRnJhbWVJbXBsKCk7CisgICAgICAgIGlmICh3ZWJm
cmFtZSkKKyAgICAgICAgICAgIHdlYmZyYW1lLT5wYWludChjYW52YXMsIHJlY3QpOworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBEcmF3
IHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBsYXllcgorICAgICAgICB1cGRhdGVSb290TGF5ZXJD
b250ZW50cyhyZWN0KTsKKworICAgICAgICAvLyBUT0RPKHZhbmdlbGlzKTogTGF5ZXJzIHNob3Vs
ZCBub3QgYmUgZm9yY2VkIHRvIHJlZHJhdyB0aGVpciBjb250ZW50cworICAgICAgICAvLyBoZXJl
IGJ1dCBzaG91bGQgdXBkYXRlIGFzIG5lZWRlZC4KKyAgICAgICAgbV9sYXllclJlbmRlcmVyLT51
cGRhdGVMYXllckNvbnRlbnRzKCk7CisKKyAgICAgICAgLy8gQ29tcG9zaXRlIGV2ZXJ5dGhpbmcg
aW50byB0aGUgY2FudmFzIHRoYXQncyBwYXNzZWQgdG8gdXMuCisgICAgICAgIFNrSVJlY3QgY2Fu
dmFzSVJlY3Q7CisgICAgICAgIGNhbnZhc0lSZWN0LnNldChyZWN0LngsIHJlY3QueSwgcmVjdC54
K3JlY3Qud2lkdGgsIHJlY3QueStyZWN0LmhlaWdodCk7CisgICAgICAgIFNrUmVjdCBjYW52YXNS
ZWN0OworICAgICAgICBjYW52YXNSZWN0LnNldChjYW52YXNJUmVjdCk7CisgICAgICAgIG1fbGF5
ZXJSZW5kZXJlci0+ZHJhd0xheWVyc0luQ2FudmFzKHN0YXRpY19jYXN0PHNraWE6OlBsYXRmb3Jt
Q2FudmFzKj4oY2FudmFzKSwgY2FudmFzUmVjdCk7CisgICAgfQorI2VuZGlmCiB9CiAKIC8vIEZJ
WE1FOiBtX2N1cnJlbnRJbnB1dEV2ZW50IHNob3VsZCBiZSByZW1vdmVkIG9uY2UgQ2hyb21lQ2xp
ZW50OjpzaG93KCkgY2FuCkBAIC0xOTE2LDQgKzE5NDgsODEgQEAgYm9vbCBXZWJWaWV3SW1wbDo6
dGFic1RvTGlua3MoKSBjb25zdAogICAgIHJldHVybiBtX3RhYnNUb0xpbmtzOwogfQogCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQordm9pZCBXZWJWaWV3SW1wbDo6c2V0Um9vdEdy
YXBoaWNzTGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1MYXllciogbGF5ZXIpCit7CisgICAgc2V0QWNj
ZWxlcmF0ZWRDb21wb3NpdGluZyhsYXllciA/IHRydWUgOiBmYWxzZSk7CisgICAgaWYgKG1fbGF5
ZXJSZW5kZXJlcikKKyAgICAgICAgbV9sYXllclJlbmRlcmVyLT5zZXRSb290TGF5ZXIobGF5ZXIp
OworfQorCit2b2lkIFdlYlZpZXdJbXBsOjpzZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nKGJvb2wg
YWNjZWxlcmF0ZWQpCit7CisgICAgaWYgKG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nID09IGFj
Y2VsZXJhdGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoYWNjZWxlcmF0ZWQpIHsKKyAg
ICAgICAgbV9sYXllclJlbmRlcmVyID0gTGF5ZXJSZW5kZXJlclNraWE6OmNyZWF0ZSgpOworICAg
ICAgICBpZiAobV9sYXllclJlbmRlcmVyKQorICAgICAgICAgICAgbV9pc0FjY2VsZXJhdGVkQ29t
cG9zaXRpbmcgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fbGF5ZXJSZW5kZXJlciA9
IDA7CisgICAgICAgIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nID0gZmFsc2U7CisgICAgfQor
fQorCit2b2lkIFdlYlZpZXdJbXBsOjp1cGRhdGVSb290TGF5ZXJDb250ZW50cyhjb25zdCBXZWJS
ZWN0JiByZWN0KQoreworICAgIGlmICghaXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIFdlYkZyYW1lSW1wbCogd2ViZnJhbWUgPSBtYWluRnJhbWVJbXBs
KCk7CisgICAgaWYgKHdlYmZyYW1lKSB7CisgICAgICAgIEZyYW1lVmlldyogdmlldyA9IHdlYmZy
YW1lLT5mcmFtZVZpZXcoKTsKKyAgICAgICAgaWYgKHZpZXcpIHsKKyAgICAgICAgICAgIFdlYlJl
Y3Qgdmlld1JlY3QgPSB2aWV3LT5mcmFtZVJlY3QoKTsKKworICAgICAgICAgICAgU2tJUmVjdCBz
Y3JvbGxGcmFtZTsKKyAgICAgICAgICAgIHNjcm9sbEZyYW1lLnNldCh2aWV3LT5zY3JvbGxYKCks
IHZpZXctPnNjcm9sbFkoKSwgdmlldy0+bGF5b3V0V2lkdGgoKSt2aWV3LT5zY3JvbGxYKCksIHZp
ZXctPmxheW91dEhlaWdodCgpK3ZpZXctPnNjcm9sbFkoKSk7CisgICAgICAgICAgICBtX2xheWVy
UmVuZGVyZXItPnNldFNjcm9sbEZyYW1lKHNjcm9sbEZyYW1lKTsKKyAgICAgICAgICAgIExheWVy
U2tpYSogcm9vdExheWVyID0gbV9sYXllclJlbmRlcmVyLT5yb290TGF5ZXIoKTsKKyAgICAgICAg
ICAgIGlmIChyb290TGF5ZXIpIHsKKyAgICAgICAgICAgICAgICBTa0lSZWN0IHJvb3RMYXllckJv
dW5kczsKKyAgICAgICAgICAgICAgICBJbnRSZWN0IHZpc2libGVSZWN0ID0gdmlldy0+dmlzaWJs
ZUNvbnRlbnRSZWN0KHRydWUpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBiYWNraW5n
IHN0b3JlIHNpemUgdXNlZCBieSB0aGUgcm9vdCBsYXllciB0byBiZSB0aGUgc2l6ZSBvZiB0aGUg
dmlzaWJsZQorICAgICAgICAgICAgICAgIC8vIGFyZWEuICBOb3RlIHRoYXQgdGhlIHJvb3QgbGF5
ZXIgYm91bmRzIGNvdWxkIGJlIGxhcmdlciB0aGFuIHRoZSBiYWNraW5nIHN0b3JlIHNpemUKKyAg
ICAgICAgICAgICAgICAvLyBidXQgdGhlcmUncyBubyByZWFzb24gdG8gd2FzdGUgbWVtb3J5IGJ5
IGFsbG9jYXRpbmcgYmFja2luZyBzdG9yZSBsYXJnZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAg
ICAvLyB2aXNpYmxlIHBvcnRpb24uCisgICAgICAgICAgICAgICAgcm9vdExheWVyQm91bmRzLnNl
dCgwLCAwLCB2aXNpYmxlUmVjdC53aWR0aCgpLCB2aXNpYmxlUmVjdC5oZWlnaHQoKSk7CisgICAg
ICAgICAgICAgICAgcm9vdExheWVyLT5zZXRCYWNraW5nU3RvcmVSZWN0KHJvb3RMYXllckJvdW5k
cyk7CisgICAgICAgICAgICAgICAgR3JhcGhpY3NDb250ZXh0KiByb290TGF5ZXJDb250ZXh0ID0g
cm9vdExheWVyLT5ncmFwaGljc0NvbnRleHQoKTsKKyAgICAgICAgICAgICAgICByb290TGF5ZXJD
b250ZXh0LT5zYXZlKCk7CisKKyAgICAgICAgICAgICAgICB3ZWJmcmFtZS0+cGFpbnRXaXRoQ29u
dGV4dCgqKHJvb3RMYXllci0+Z3JhcGhpY3NDb250ZXh0KCkpLCByZWN0KTsKKyAgICAgICAgICAg
ICAgICByb290TGF5ZXJDb250ZXh0LT5yZXN0b3JlKCk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlzcGxh
eSgpCit7CisgICAgLy8gVE9ETyh2YW5nZWxpcyk6IEZvciBub3cgd2UncmUgcG9zdGluZyBhIHJl
cGFpbnQgZXZlbnQgZm9yIHRoZSBlbnRpcmUgcGFnZQorICAgIC8vICAgICAgICAgICAgICAgICB3
aGljaCBpcyBhbiBvdmVya2lsbC4KKyAgICBXZWJGcmFtZUltcGwqIHdlYmZyYW1lID0gbWFpbkZy
YW1lSW1wbCgpOworICAgIGlmICh3ZWJmcmFtZSkgeworICAgICAgICBGcmFtZVZpZXcqIHZpZXcg
PSB3ZWJmcmFtZS0+ZnJhbWVWaWV3KCk7CisgICAgICAgIGlmICh2aWV3KSB7CisgICAgICAgICAg
ICBJbnRSZWN0IHZpc2libGVSZWN0ID0gdmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KHRydWUpOwor
ICAgICAgICAgICAgbV9jbGllbnQtPmRpZEludmFsaWRhdGVSZWN0KHZpc2libGVSZWN0KTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIGlmIChtX2xheWVyUmVuZGVyZXIpCisgICAgICAgIG1fbGF5
ZXJSZW5kZXJlci0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9CisKKyNlbmRpZgorCiB9IC8vIG5hbWVz
cGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmgJKHJldmlzaW9uIDU1
NDI4KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCSh3b3JraW5nIGNvcHkp
CkBAIC00Myw5ICs0MywxNiBAQAogI2luY2x1ZGUgIkNvbnRleHRNZW51Q2xpZW50SW1wbC5oIgog
I2luY2x1ZGUgIkRyYWdDbGllbnRJbXBsLmgiCiAjaW5jbHVkZSAiRWRpdG9yQ2xpZW50SW1wbC5o
IgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXIuaCIKICNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRJ
bXBsLmgiCiAjaW5jbHVkZSAiTm90aWZpY2F0aW9uUHJlc2VudGVySW1wbC5oIgogCisjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2lmIFdFQktJVF9VU0lOR19TS0lBCisjaW5jbHVk
ZSAic2tpYS9MYXllclJlbmRlcmVyU2tpYS5oIgorI2VuZGlmCisjZW5kaWYKKwogI2luY2x1ZGUg
PHd0Zi9Pd25QdHIuaD4KICNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgogCkBAIC0yOTYsNiAr
MzAzLDExIEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIG1fY3VycmVudElucHV0RXZlbnQ7CiAg
ICAgfQogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHZvaWQgc2V0Um9v
dExheWVyTmVlZHNEaXNwbGF5KCk7CisgICAgdm9pZCBzZXRSb290R3JhcGhpY3NMYXllcihXZWJD
b3JlOjpQbGF0Zm9ybUxheWVyKiBsYXllcik7CisjZW5kaWYKKwogcHJpdmF0ZToKICAgICBmcmll
bmQgY2xhc3MgV2ViVmlldzsgIC8vIFNvIFdlYlZpZXc6OkNyZWF0ZSBjYW4gY2FsbCBvdXIgY29u
c3RydWN0b3IKICAgICBmcmllbmQgY2xhc3MgV1RGOjpSZWZDb3VudGVkPFdlYlZpZXdJbXBsPjsK
QEAgLTMyMSw2ICszMzMsMTIgQEAgcHJpdmF0ZToKICAgICAvLyB0aGUgSGl0VGVzdFJlc3VsdCBm
b3IgaXQuCiAgICAgV2ViQ29yZTo6SGl0VGVzdFJlc3VsdCBoaXRUZXN0UmVzdWx0Rm9yV2luZG93
UG9zKGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCisgICAgdm9pZCBzZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nKGJvb2wpOworICAg
IGJvb2wgaXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkgeyByZXR1cm4gbV9pc0FjY2VsZXJhdGVk
Q29tcG9zaXRpbmc7IH0KKyAgICB2b2lkIHVwZGF0ZVJvb3RMYXllckNvbnRlbnRzKGNvbnN0IFdl
YlJlY3QmIHJlY3QpOworI2VuZGlmCisKICAgICBXZWJWaWV3Q2xpZW50KiBtX2NsaWVudDsKIAog
ICAgIEJhY2tGb3J3YXJkTGlzdENsaWVudEltcGwgbV9iYWNrRm9yd2FyZExpc3RDbGllbnRJbXBs
OwpAQCAtNDQ2LDYgKzQ2NCwxMSBAQCBwcml2YXRlOgogICAgIE5vdGlmaWNhdGlvblByZXNlbnRl
ckltcGwgbV9ub3RpZmljYXRpb25QcmVzZW50ZXI7CiAjZW5kaWYKIAorI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKyAgICBPd25QdHI8V2ViQ29yZTo6TGF5ZXJSZW5kZXJlclNraWE+
IG1fbGF5ZXJSZW5kZXJlcjsKKyAgICBib29sIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nOwor
I2VuZGlmCisKICAgICBzdGF0aWMgY29uc3QgV2ViSW5wdXRFdmVudCogbV9jdXJyZW50SW5wdXRF
dmVudDsKIH07CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50059</attachid>
            <date>2010-03-04 15:37:03 -0800</date>
            <delta_ts>2010-03-15 19:27:23 -0700</delta_ts>
            <desc>Fixed previous patch per reviewer&apos;s comments</desc>
            <filename>skiaCompositor_3.txt</filename>
            <type>text/plain</type>
            <size>64264</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMTAtMDMtMDIgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudCBzL3cgY29tcG9zaXRlZCBncmFwaGljcyBsYXllcnMgaW4gQ2hyb21p
dW0gdXNpbmcgdGhlIFNraWEgbGlicmFyeQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAgICAgVGhpcyBpcyBhbiBpbml0aWFsIHN0ZXAg
aW4gdGhlIGltcGxlbWVudGF0aW9uLiBMYXllciBjb21wb3NpdGluZyBpcyBmdW5jdGlvbmluZwor
ICAgICAgICBidXQgbm90IG9wdGltaXplZCBpbiBhbnkgd2F5LiBTdWJlc3F1ZW50IGNoZWNrLWlu
cyB3aWxsIGJlIG5lY2Vzc2FyeSB0byBmaW5ldHVuZQorICAgICAgICBpdC4KKworICAgICAgICBO
byBuZXcgdGVzdHMuIChPT1BTISkKKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAg
ICBBZGRlZCBuZXcgc291cmNlIGZpbGVzIHRvIHRoZSBjaHJvbWl1bSBidWlsZAorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaDoKKyAgICAgICAgICBBZGRlZCBuZWNl
c3NhcnkgdHlwZWRlZidzIGFuZCBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgQ0hST01JVU0KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmNwcDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5o
OiBBZGRlZC4KKyAgICAgICAgICBEZWNsYXJhdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhl
IHBsYXRmb3JtLXNwZWNpZmljIEdyYXBoaWNzTGF5ZXIgY2xhc3MuCisgICAgICAgICogcGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuaDogQWRkZWQuCisgICAg
ICAgICAgRGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTa2lhLWJhc2VkIHMv
dyBjb21wb3NpdG9yLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lh
LmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEu
aDogQWRkZWQuCisgICAgICAgICAgRGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIGEg
Y29tcG9zaXRhYmxlIGxheWVyIHRoYXQgdXNlcyBhIFNraWEgY2FudmFzCisgICAgICAgICAgZm9y
IGJhY2tpbmcgc3RvcmUuCisKIDIwMTAtMDMtMDIgIEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBw
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJDb3Jl
L1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNp
b24gNTU0MjgpCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtMjE0
OSwxMCArMjE0OSwxNiBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
cGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0M0RTa2lhLmNwcCcsCisgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5jcHAnLAorICAgICAg
ICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuaCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwJywKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAnLAogICAgICAg
ICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW50UG9pbnRTa2lhLmNwcCcsCiAgICAgICAg
ICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbnRSZWN0U2tpYS5jcHAnLAorICAgICAgICAg
ICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuY3BwJywKKyAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmgnLAorICAg
ICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcCcsCisgICAgICAg
ICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaCcsCiAgICAgICAgICAgICAn
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJbWFnZVNraWEuY3BwJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL05hdGl2ZUltYWdlU2tpYS5oJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdGhTa2lhLmNwcCcsCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkocmV2aXNpb24gNTU0MjgpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAt
NjMsNiArNjMsMTIgQEAgdHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKIGNsYXNzIFFHcmFwaGlj
c0l0ZW07CiB0eXBlZGVmIFFHcmFwaGljc0l0ZW0gUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgUUdy
YXBoaWNzSXRlbSogTmF0aXZlTGF5ZXI7CisjZWxpZiBQTEFURk9STShDSFJPTUlVTSkKK25hbWVz
cGFjZSBXZWJDb3JlIHsKK2NsYXNzIExheWVyU2tpYTsKK3R5cGVkZWYgTGF5ZXJTa2lhIFBsYXRm
b3JtTGF5ZXI7Cit0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOworfQogI2Vsc2UKIHR5cGVkZWYg
dm9pZCogUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tp
YS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
cGhpY3NMYXllclNraWEuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU4NiBAQAorLyoKKyAq
IENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisvKiogRklY
TUUodmFuZ2VsaXMpCisgKiBUaGlzIGZpbGUgYm9ycm93cyBjb2RlIGhlYXZpbHkgZnJvbSBwbGF0
Zm9ybS9ncmFwaGljcy93aW4vR3JhcGhpY3NMYXllckNBQ0YuY3BwCisgKiAoYW5kIGhlbmNlIGl0
IGluY2x1ZGVzIGJvdGggY29weXJpZ2h0cykKKyAqIElkZWFsbHkgdGhlIGNvbW1vbiBjb2RlIChl
LmcuIHRoZSBjb2RlIHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIGxheWVyIGhpZXJhcmNoeQorICog
c2hvdWxkIGJlIGtlcHQgc2VwYXJhdGUgYW5kIHNoYXJlZCBiZXR3ZWVuIHBsYXRmb3Jtcy4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyU2tpYS5oIgorCisjaW5jbHVkZSAiQ1N0cmlu
Zy5oIgorI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5o
IgorI2luY2x1ZGUgIkltYWdlLmgiCisjaW5jbHVkZSAiTGF5ZXJTa2lhLmgiCisjaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTeXN0ZW1UaW1lLmgiCisjaW5jbHVkZSA8d3Rm
L0N1cnJlbnRUaW1lLmg+CisjaW5jbHVkZSA8d3RmL1N0cmluZ0V4dHJhcy5oPgorCit1c2luZyBu
YW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyB2b2lkIHNldExh
eWVyQm9yZGVyQ29sb3IoTGF5ZXJTa2lhKiBsYXllciwgY29uc3QgQ29sb3ImIGNvbG9yKQorewor
ICAgIGxheWVyLT5zZXRCb3JkZXJDb2xvcihjb2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFy
Qm9yZGVyQ29sb3IoTGF5ZXJTa2lhKiBsYXllcikKK3sKKyAgICBsYXllci0+c2V0Qm9yZGVyQ29s
b3IoQ29sb3IoMCwgMCwgMCwgMCkpOworfQorCitzdGF0aWMgdm9pZCBzZXRMYXllckJhY2tncm91
bmRDb2xvcihMYXllclNraWEqIGxheWVyLCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgbGF5
ZXItPnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyTGF5
ZXJCYWNrZ3JvdW5kQ29sb3IoTGF5ZXJTa2lhKiBsYXllcikKK3sKKyAgICBsYXllci0+c2V0QmFj
a2dyb3VuZENvbG9yKDApOworfQorCitHcmFwaGljc0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5h
dGVzT3JpZW50YXRpb24gR3JhcGhpY3NMYXllcjo6Y29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVu
dGF0aW9uKCkKK3sKKyAgICByZXR1cm4gQ29tcG9zaXRpbmdDb29yZGluYXRlc0JvdHRvbVVwOwor
fQorCitQYXNzT3duUHRyPEdyYXBoaWNzTGF5ZXI+IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZShHcmFw
aGljc0xheWVyQ2xpZW50KiBjbGllbnQpCit7CisgICAgcmV0dXJuIG5ldyBHcmFwaGljc0xheWVy
U2tpYShjbGllbnQpOworfQorCitHcmFwaGljc0xheWVyU2tpYTo6R3JhcGhpY3NMYXllclNraWEo
R3JhcGhpY3NMYXllckNsaWVudCogY2xpZW50KQorICAgIDogR3JhcGhpY3NMYXllcihjbGllbnQp
CisgICAgLCBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlKE5vQ29udGVudHNMYXllcikKKyAgICAsIG1f
Y29udGVudHNMYXllckhhc0JhY2tncm91bmRDb2xvcihmYWxzZSkKK3sKKyAgICBtX2xheWVyID0g
TGF5ZXJTa2lhOjpjcmVhdGUoTGF5ZXJTa2lhOjpMYXllciwgdGhpcyk7CisKKyAgICB1cGRhdGVE
ZWJ1Z0luZGljYXRvcnMoKTsKK30KKworR3JhcGhpY3NMYXllclNraWE6On5HcmFwaGljc0xheWVy
U2tpYSgpCit7CisgICAgLy8gY2xlYW4gdXAgdGhlIFNraWEgbGF5ZXIKKyAgICBpZiAobV9sYXll
cikKKyAgICAgICAgbV9sYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKworICAgIGlmICht
X3RyYW5zZm9ybUxheWVyKQorICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5yZW1vdmVGcm9tU3Vw
ZXJsYXllcigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXROYW1lKGNvbnN0IFN0
cmluZyYgaW5OYW1lKQoreworICAgIFN0cmluZyBuYW1lID0gU3RyaW5nOjpmb3JtYXQoIkdyYXBo
aWNzTGF5ZXJTa2lhKCVwKSBHcmFwaGljc0xheWVyKCVwKSAiLCBtX2xheWVyLmdldCgpLCB0aGlz
KSArIGluTmFtZTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXROYW1lKG5hbWUpOworfQorCitOYXRp
dmVMYXllciBHcmFwaGljc0xheWVyU2tpYTo6bmF0aXZlTGF5ZXIoKSBjb25zdAoreworICAgIHJl
dHVybiBtX2xheWVyLmdldCgpOworfQorCitib29sIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRDaGls
ZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+JiBjaGlsZHJlbikKK3sKKyAgICBib29s
IGNoaWxkcmVuQ2hhbmdlZCA9IEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuKGNoaWxkcmVuKTsK
KyAgICAvLyBGSVhNRTogR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW4gY2FsbHMgYWRkQ2hpbGQo
KSBmb3IgZWFjaCBzdWJsYXllciwgd2hpY2gKKyAgICAvLyB3aWxsIGVuZCB1cCBjYWxsaW5nIHVw
ZGF0ZVN1YmxheWVyTGlzdCgpIE4gdGltZXMuCisgICAgaWYgKGNoaWxkcmVuQ2hhbmdlZCkKKyAg
ICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisKKyAgICByZXR1cm4gY2hpbGRyZW5DaGFuZ2Vk
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjphZGRDaGlsZChHcmFwaGljc0xheWVyKiBj
aGlsZExheWVyKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkKGNoaWxkTGF5ZXIpOwor
ICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjph
ZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgaW50IGluZGV4KQorewor
ICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChjaGlsZExheWVyLCBpbmRleCk7Cisg
ICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OmFk
ZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgR3JhcGhpY3NMYXllciogc2li
bGluZykKK3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEJlbG93KGNoaWxkTGF5ZXIsIHNp
YmxpbmcpOworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjphZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNz
TGF5ZXIgKnNpYmxpbmcpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShjaGls
ZExheWVyLCBzaWJsaW5nKTsKKyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKworYm9vbCBH
cmFwaGljc0xheWVyU2tpYTo6cmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBH
cmFwaGljc0xheWVyKiBuZXdDaGlsZCkKK3sKKyAgICBpZiAoR3JhcGhpY3NMYXllcjo6cmVwbGFj
ZUNoaWxkKG9sZENoaWxkLCBuZXdDaGlsZCkpIHsKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0
KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnJlbW92ZUZyb21QYXJlbnQoKQoreworICAgIEdyYXBo
aWNzTGF5ZXI6OnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICBsYXllckZvclN1cGVybGF5ZXIoKS0+
cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0
UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgR3JhcGhpY3NMYXllcjo6
c2V0UG9zaXRpb24ocG9pbnQpOworICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiBw
b2ludCkKK3sKKyAgICBpZiAocG9pbnQgPT0gbV9hbmNob3JQb2ludCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0QW5jaG9yUG9pbnQocG9pbnQpOworICAgIHVwZGF0
ZUFuY2hvclBvaW50KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFNpemUoY29u
c3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGlmIChzaXplID09IG1fc2l6ZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0U2l6ZShzaXplKTsKKyAgICB1cGRhdGVM
YXllclNpemUoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0VHJhbnNmb3JtKGNv
bnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGlmICh0ID09IG1fdHJhbnNmb3Jt
KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRUcmFuc2Zvcm0odCk7
CisgICAgdXBkYXRlVHJhbnNmb3JtKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNl
dENoaWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAg
IGlmICh0ID09IG1fY2hpbGRyZW5UcmFuc2Zvcm0pCisgICAgICAgIHJldHVybjsKKworICAgIEdy
YXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuVHJhbnNmb3JtKHQpOworICAgIHVwZGF0ZUNoaWxkcmVu
VHJhbnNmb3JtKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFByZXNlcnZlczNE
KGJvb2wgcHJlc2VydmVzM0QpCit7CisgICAgaWYgKHByZXNlcnZlczNEID09IG1fcHJlc2VydmVz
M0QpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFByZXNlcnZlczNE
KHByZXNlcnZlczNEKTsKKyAgICB1cGRhdGVMYXllclByZXNlcnZlczNEKCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllclNraWE6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCBtYXNrc1RvQm91bmRzKQor
eworICAgIGlmIChtYXNrc1RvQm91bmRzID09IG1fbWFza3NUb0JvdW5kcykKKyAgICAgICAgcmV0
dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0TWFza3NUb0JvdW5kcyhtYXNrc1RvQm91bmRz
KTsKKyAgICB1cGRhdGVNYXNrc1RvQm91bmRzKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNr
aWE6OnNldERyYXdzQ29udGVudChib29sIGRyYXdzQ29udGVudCkKK3sKKyAgICBpZiAoZHJhd3ND
b250ZW50ID09IG1fZHJhd3NDb250ZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXREcmF3c0NvbnRlbnQoZHJhd3NDb250ZW50KTsKKyAgICB1cGRhdGVMYXllckRy
YXdzQ29udGVudCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRCYWNrZ3JvdW5k
Q29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChtX2JhY2tncm91bmRDb2xvclNl
dCAmJiBtX2JhY2tncm91bmRDb2xvciA9PSBjb2xvcikKKyAgICAgICAgcmV0dXJuOworCisgICAg
R3JhcGhpY3NMYXllcjo6c2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKKworICAgIG1fY29udGVu
dHNMYXllckhhc0JhY2tncm91bmRDb2xvciA9IHRydWU7CisgICAgdXBkYXRlTGF5ZXJCYWNrZ3Jv
dW5kQ29sb3IoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6Y2xlYXJCYWNrZ3JvdW5k
Q29sb3IoKQoreworICAgIGlmICghbV9iYWNrZ3JvdW5kQ29sb3JTZXQpCisgICAgICAgIHJldHVy
bjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OmNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisgICAgY2xl
YXJMYXllckJhY2tncm91bmRDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkpOworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRDb250ZW50c09wYXF1ZShib29sIG9wYXF1ZSkKK3sKKyAg
ICBpZiAobV9jb250ZW50c09wYXF1ZSA9PSBvcGFxdWUpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzT3BhcXVlKG9wYXF1ZSk7CisgICAgdXBkYXRlQ29u
dGVudHNPcGFxdWUoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0QmFja2ZhY2VW
aXNpYmlsaXR5KGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAobV9iYWNrZmFjZVZpc2liaWxpdHkg
PT0gdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0QmFj
a2ZhY2VWaXNpYmlsaXR5KHZpc2libGUpOworICAgIHVwZGF0ZUJhY2tmYWNlVmlzaWJpbGl0eSgp
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHkp
Cit7CisgICAgZmxvYXQgY2xhbXBlZE9wYWNpdHkgPSBtYXgobWluKG9wYWNpdHksIDEuMGYpLCAw
LjBmKTsKKworICAgIGlmIChtX29wYWNpdHkgPT0gY2xhbXBlZE9wYWNpdHkpCisgICAgICAgIHJl
dHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE9wYWNpdHkoY2xhbXBlZE9wYWNpdHkpOwor
ICAgIHByaW1hcnlMYXllcigpLT5zZXRPcGFjaXR5KG9wYWNpdHkpOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJTa2lhOjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIGlmIChkcmF3c0NvbnRlbnQo
KSkKKyAgICAgICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllclNraWE6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3Qp
Cit7CisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBtX2xheWVyLT5zZXROZWVkc0Rp
c3BsYXkocmVjdCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldENvbnRlbnRzUmVj
dChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChyZWN0ID09IG1fY29udGVudHNSZWN0
KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDb250ZW50c1JlY3Qo
cmVjdCk7CisgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXll
clNraWE6OnNldENvbnRlbnRzVG9JbWFnZShJbWFnZSogaW1hZ2UpCit7CisgICAgLy8gRklYTUUo
dmFuZ2VsaXMpOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q29u
dGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqIHZpZGVvTGF5ZXIpCit7CisgICAgLy8gRklYTUUo
dmFuZ2VsaXMpOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0R2Vv
bWV0cnlPcmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gb3JpZW50
YXRpb24pCit7CisgICAgaWYgKG9yaWVudGF0aW9uID09IG1fZ2VvbWV0cnlPcmllbnRhdGlvbikK
KyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0R2VvbWV0cnlPcmllbnRh
dGlvbihvcmllbnRhdGlvbik7CisgICAgdXBkYXRlR2VvbWV0cnlPcmllbnRhdGlvbigpOworfQor
CitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyU2tpYTo6aG9zdExheWVyRm9yU3VibGF5ZXJz
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1MYXllciA/IG1fdHJhbnNmb3JtTGF5
ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOworfQorCitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xh
eWVyU2tpYTo6bGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFu
c2Zvcm1MYXllciA/IG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOworfQor
CitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyU2tpYTo6cGxhdGZvcm1MYXllcigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIHByaW1hcnlMYXllcigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJT
a2lhOjpzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAg
aWYgKGNvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgc2V0TGF5ZXJCYWNrZ3JvdW5kQ29sb3IobV9s
YXllci5nZXQoKSwgY29sb3IpOworICAgIGVsc2UKKyAgICAgICAgY2xlYXJMYXllckJhY2tncm91
bmRDb2xvcihtX2xheWVyLmdldCgpKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0
RGVidWdCb3JkZXIoY29uc3QgQ29sb3ImIGNvbG9yLCBmbG9hdCBib3JkZXJXaWR0aCkKK3sKKyAg
ICBpZiAoY29sb3IuaXNWYWxpZCgpKSB7CisgICAgICAgIHNldExheWVyQm9yZGVyQ29sb3IobV9s
YXllci5nZXQoKSwgY29sb3IpOworICAgICAgICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aChib3Jk
ZXJXaWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xlYXJCb3JkZXJDb2xvcihtX2xheWVy
LmdldCgpKTsKKyAgICAgICAgbV9sYXllci0+c2V0Qm9yZGVyV2lkdGgoMCk7CisgICAgfQorfQor
CitHcmFwaGljc0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gR3JhcGhp
Y3NMYXllclNraWE6OmRlZmF1bHRDb250ZW50c09yaWVudGF0aW9uKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gQ29tcG9zaXRpbmdDb29yZGluYXRlc1RvcERvd247Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllclNraWE6OnVwZGF0ZVN1YmxheWVyTGlzdCgpCit7CisgICAgVmVjdG9yPFJlZlB0cjxMYXll
clNraWE+ID4gbmV3U3VibGF5ZXJzOworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAg
ICAgICAgLy8gQWRkIHRoZSBwcmltYXJ5IGxheWVyIGZpcnN0LiBFdmVuIGlmIHdlIGhhdmUgbmVn
YXRpdmUgei1vcmRlciBjaGlsZHJlbiwgdGhlIHByaW1hcnkgbGF5ZXIgYWx3YXlzIGNvbWVzIGJl
aGluZC4KKyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZChtX2xheWVyLmdldCgpKTsKKyAgICB9
IGVsc2UgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAvLyBGSVhNRTogYWRkIHRoZSBj
b250ZW50cyBsYXllciBpbiB0aGUgY29ycmVjdCBvcmRlciB3aXRoIG5lZ2F0aXZlIHotb3JkZXIg
Y2hpbGRyZW4uCisgICAgICAgIC8vIFRoaXMgZG9lcyBub3QgY2F1c2UgdmlzaWJsZSByZW5kZXJp
bmcgaXNzdWVzIGJlY2F1c2UgY3VycmVudGx5IGNvbnRlbnRzIGxheWVycyBhcmUgb25seSB1c2Vk
CisgICAgICAgIC8vIGZvciByZXBsYWNlZCBlbGVtZW50cyB0aGF0IGRvbid0IGhhdmUgY2hpbGRy
ZW4uCisgICAgICAgIG5ld1N1YmxheWVycy5hcHBlbmQobV9jb250ZW50c0xheWVyLmdldCgpKTsK
KyAgICB9CisKKyAgICBjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+JiBjaGlsZExheWVycyA9
IGNoaWxkcmVuKCk7CisgICAgc2l6ZV90IG51bUNoaWxkcmVuID0gY2hpbGRMYXllcnMuc2l6ZSgp
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47ICsraSkgeworICAgICAg
ICBHcmFwaGljc0xheWVyU2tpYSogY3VyQ2hpbGQgPSBzdGF0aWNfY2FzdDxHcmFwaGljc0xheWVy
U2tpYSo+KGNoaWxkTGF5ZXJzW2ldKTsKKworICAgICAgICBMYXllclNraWEqIGNoaWxkTGF5ZXIg
PSBjdXJDaGlsZC0+bGF5ZXJGb3JTdXBlcmxheWVyKCk7CisgICAgICAgIG5ld1N1YmxheWVycy5h
cHBlbmQoY2hpbGRMYXllcik7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBu
ZXdTdWJsYXllcnMuc2l6ZSgpOyArK2kpCisgICAgICAgIG5ld1N1YmxheWVyc1tpXS0+cmVtb3Zl
RnJvbVN1cGVybGF5ZXIoKTsKKworICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAg
IG1fdHJhbnNmb3JtTGF5ZXItPnNldFN1YmxheWVycyhuZXdTdWJsYXllcnMpOworCisgICAgICAg
IGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSB0cmFu
c2Zvcm0gbGF5ZXIsIHRoZW4gdGhlIGNvbnRlbnRzIGxheWVyIGlzIHBhcmVudGVkIGluIHRoZQor
ICAgICAgICAgICAgLy8gcHJpbWFyeSBsYXllciAod2hpY2ggaXMgaXRzZWxmIGEgY2hpbGQgb2Yg
dGhlIHRyYW5zZm9ybSBsYXllcikuCisgICAgICAgICAgICBtX2xheWVyLT5yZW1vdmVBbGxTdWJs
YXllcnMoKTsKKyAgICAgICAgICAgIG1fbGF5ZXItPmFkZFN1YmxheWVyKG1fY29udGVudHNMYXll
cik7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgbV9sYXllci0+c2V0U3VibGF5ZXJz
KG5ld1N1YmxheWVycyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUxheWVy
UG9zaXRpb24oKQoreworICAgIC8vIFBvc2l0aW9uIGlzIG9mZnNldCBvbiB0aGUgbGF5ZXIgYnkg
dGhlIGxheWVyIGFuY2hvciBwb2ludC4KKyAgICBTa1BvaW50IHBvc1BvaW50OworICAgIHBvc1Bv
aW50LnNldChtX3Bvc2l0aW9uLngoKSArIG1fYW5jaG9yUG9pbnQueCgpICogbV9zaXplLndpZHRo
KCksCisgICAgICAgICAgICAgICAgIG1fcG9zaXRpb24ueSgpICsgbV9hbmNob3JQb2ludC55KCkg
KiBtX3NpemUuaGVpZ2h0KCkpOworCisgICAgcHJpbWFyeUxheWVyKCktPnNldFBvc2l0aW9uKHBv
c1BvaW50KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTGF5ZXJTaXplKCkK
K3sKKyAgICBTa0lSZWN0IHJlY3Q7CisgICAgcmVjdC5zZXQoMCwgMCwgbV9zaXplLndpZHRoKCks
IG1fc2l6ZS5oZWlnaHQoKSk7CisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAg
bV90cmFuc2Zvcm1MYXllci0+c2V0Qm91bmRzKHJlY3QpOworICAgICAgICAvLyBUaGUgYW5jaG9y
IG9mIHRoZSBjb250ZW50cyBsYXllciBpcyBhbHdheXMgYXQgMC41LCAwLjUsIHNvIHRoZSBwb3Np
dGlvbiBpcyBjZW50ZXItcmVsYXRpdmUuCisgICAgICAgIFNrUG9pbnQgY2VudGVyUG9pbnQ7Cisg
ICAgICAgIGNlbnRlclBvaW50LnNldChtX3NpemUud2lkdGgoKSAvIDIuMGYsIG1fc2l6ZS5oZWln
aHQoKSAvIDIuMGYpOworICAgICAgICBtX2xheWVyLT5zZXRQb3NpdGlvbihjZW50ZXJQb2ludCk7
CisgICAgfQorCisgICAgbV9sYXllci0+c2V0Qm91bmRzKHJlY3QpOworCisgICAgLy8gTm90ZSB0
aGF0IHdlIGRvbid0IHJlc2l6ZSBtX2NvbnRlbnRzTGF5ZXIuIEl0J3MgdXAgdGhlIGNhbGxlciB0
byBkbyB0aGF0LgorCisgICAgLy8gSWYgd2UndmUgY2hhbmdlZCB0aGUgYm91bmRzLCB3ZSBuZWVk
IHRvIHJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbgorICAgIC8vIG9mIHRoZSBsYXllciwgdGFraW5n
IGFuY2hvciBwb2ludCBpbnRvIGFjY291bnQuCisgICAgdXBkYXRlTGF5ZXJQb3NpdGlvbigpOwor
fQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVBbmNob3JQb2ludCgpCit7CisgICAg
U2tQb2ludCBhbmNob3JQb2ludDsKKyAgICBhbmNob3JQb2ludC5zZXQobV9hbmNob3JQb2ludC54
KCksIG1fYW5jaG9yUG9pbnQueSgpKTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5jaG9yUG9p
bnQoYW5jaG9yUG9pbnQpOworICAgIHByaW1hcnlMYXllcigpLT5zZXRBbmNob3JQb2ludFoobV9h
bmNob3JQb2ludC56KCkpOworICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyU2tpYTo6dXBkYXRlVHJhbnNmb3JtKCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIo
KS0+c2V0VHJhbnNmb3JtKG1fdHJhbnNmb3JtLnRvQWZmaW5lVHJhbnNmb3JtKCkpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgpCit7CisgICAg
cHJpbWFyeUxheWVyKCktPnNldFN1YmxheWVyVHJhbnNmb3JtKG1fY2hpbGRyZW5UcmFuc2Zvcm0p
OworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVNYXNrc1RvQm91bmRzKCkKK3sK
KyAgICBtX2xheWVyLT5zZXRNYXNrc1RvQm91bmRzKG1fbWFza3NUb0JvdW5kcyk7CisgICAgdXBk
YXRlRGVidWdJbmRpY2F0b3JzKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0
ZUNvbnRlbnRzT3BhcXVlKCkKK3sKKyAgICBtX2xheWVyLT5zZXRPcGFxdWUobV9jb250ZW50c09w
YXF1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUJhY2tmYWNlVmlzaWJp
bGl0eSgpCit7CisgICAgbV9sYXllci0+c2V0RG91YmxlU2lkZWQobV9iYWNrZmFjZVZpc2liaWxp
dHkpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVMYXllclByZXNlcnZlczNE
KCkKK3sKKyAgICAvLyBGSVhNRSh2YW5nZWxpcyk6IGltcGxlbWVudAorfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJTa2lhOjp1cGRhdGVMYXllckRyYXdzQ29udGVudCgpCit7CisgICAgaWYgKG1fZHJh
d3NDb250ZW50KQorICAgICAgICBtX2xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKworICAgIHVw
ZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRh
dGVMYXllckJhY2tncm91bmRDb2xvcigpCit7CisgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG5ldmVyIGNyZWF0ZSB0aGUgY29udGVudHMgbGF5
ZXIganVzdCBmb3IgYmFja2dyb3VuZCBjb2xvciB5ZXQuCisgICAgaWYgKG1fYmFja2dyb3VuZENv
bG9yU2V0KQorICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xvcihtX2NvbnRlbnRzTGF5ZXIu
Z2V0KCksIG1fYmFja2dyb3VuZENvbG9yKTsKKyAgICBlbHNlCisgICAgICAgIGNsZWFyTGF5ZXJC
YWNrZ3JvdW5kQ29sb3IobV9jb250ZW50c0xheWVyLmdldCgpKTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyU2tpYTo6dXBkYXRlQ29udGVudHNJbWFnZSgpCit7CisgICAgLy8gRklYTUUodmFuZ2Vs
aXMpOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ29udGVu
dHNWaWRlbygpCit7CisgICAgLy8gRklYTUUodmFuZ2VsaXMpOiBJbXBsZW1lbnQKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ29udGVudHNSZWN0KCkKK3sKKyAgICBpZiAoIW1f
Y29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tQb2ludCBwb2ludDsKKyAg
ICBwb2ludC5zZXQobV9jb250ZW50c1JlY3QueCgpLCBtX2NvbnRlbnRzUmVjdC55KCkpOworICAg
IFNrSVJlY3QgcmVjdDsKKyAgICByZWN0LnNldCgwLCAwLCBtX2NvbnRlbnRzUmVjdC53aWR0aCgp
LCBtX2NvbnRlbnRzUmVjdC5oZWlnaHQoKSk7CisKKyAgICBtX2NvbnRlbnRzTGF5ZXItPnNldFBv
c2l0aW9uKHBvaW50KTsKKyAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlR2VvbWV0cnlPcmllbnRhdGlvbigpCit7
CisgICAgc3dpdGNoIChnZW9tZXRyeU9yaWVudGF0aW9uKCkpIHsKKyAgICBjYXNlIENvbXBvc2l0
aW5nQ29vcmRpbmF0ZXNUb3BEb3duOgorICAgICAgICBtX2xheWVyLT5zZXRHZW9tZXRyeUZsaXBw
ZWQoZmFsc2UpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ29tcG9zaXRpbmdDb29yZGlu
YXRlc0JvdHRvbVVwOgorICAgICAgICBtX2xheWVyLT5zZXRHZW9tZXRyeUZsaXBwZWQodHJ1ZSk7
CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBHZW9tZXRyeSBvcmllbnRhdGlvbiBpcyBt
YXBwZWQgb250byBjaGlsZHJlbiB0cmFuc2Zvcm0gaW4gb2xkZXIgUXVhcnR6Q29yZXMsCisgICAg
Ly8gc28gaXMgaGFuZGxlZCB2aWEgc2V0R2VvbWV0cnlPcmllbnRhdGlvbigpLgorfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXR1cENvbnRlbnRzTGF5ZXIoTGF5ZXJTa2lhKiBjb250ZW50
c0xheWVyKQoreworICAgIGlmIChjb250ZW50c0xheWVyID09IG1fY29udGVudHNMYXllcikKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICBtX2Nv
bnRlbnRzTGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgICAgIG1fY29udGVudHNM
YXllciA9IDA7CisgICAgfQorCisgICAgaWYgKGNvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgbV9j
b250ZW50c0xheWVyID0gY29udGVudHNMYXllcjsKKworICAgICAgICBpZiAoZGVmYXVsdENvbnRl
bnRzT3JpZW50YXRpb24oKSA9PSBDb21wb3NpdGluZ0Nvb3JkaW5hdGVzQm90dG9tVXApIHsKKyAg
ICAgICAgICAgIFNrTWF0cml4IGZsaXBwZXI7CisgICAgICAgICAgICBmbGlwcGVyLnJlc2V0KCk7
CisgICAgICAgICAgICBmbGlwcGVyLnNldFNjYWxlWSgtMSk7CisgICAgICAgICAgICBtX2NvbnRl
bnRzTGF5ZXItPnNldFRyYW5zZm9ybShmbGlwcGVyKTsKKyAgICAgICAgICAgIFNrUG9pbnQgYW5j
aG9yUG9pbnQ7CisgICAgICAgICAgICBhbmNob3JQb2ludC5zZXQoMC4wZiwgMS4wZik7CisgICAg
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEFuY2hvclBvaW50KGFuY2hvclBvaW50KTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQ7CisgICAgICAg
ICAgICBhbmNob3JQb2ludC5zZXQoMC4wZiwgMC4wZik7CisgICAgICAgICAgICBtX2NvbnRlbnRz
TGF5ZXItPnNldEFuY2hvclBvaW50KGFuY2hvclBvaW50KTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIEluc2VydCB0aGUgY29udGVudCBsYXllciBmaXJzdC4gVmlkZW8gZWxlbWVudHMgcmVxdWly
ZSB0aGlzLCBiZWNhdXNlIHRoZXkgaGF2ZQorICAgICAgICAvLyBzaGFkb3cgY29udGVudCB0aGF0
IG11c3QgZGlzcGxheSBpbiBmcm9udCBvZiB0aGUgdmlkZW8uCisgICAgICAgIG1fbGF5ZXItPmlu
c2VydFN1YmxheWVyKG1fY29udGVudHNMYXllci5nZXQoKSwgMCk7CisKKyAgICAgICAgdXBkYXRl
Q29udGVudHNSZWN0KCk7CisKKyAgICAgICAgaWYgKHNob3dEZWJ1Z0JvcmRlcnMoKSkgeworICAg
ICAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcihtX2NvbnRlbnRzTGF5ZXIuZ2V0KCksIENvbG9y
KDAsIDAsIDEyOCwgMTgwKSk7CisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvcmRl
cldpZHRoKDEuMGYpOworICAgICAgICB9CisgICAgfQorICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9y
cygpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHNpbXBseSBtaW1pY3MgdGhlIG9wZXJhdGlvbiBv
ZiBHcmFwaGljc0xheWVyQ0EKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZU9wYWNpdHlP
bkxheWVyKCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0T3BhY2l0eShtX29wYWNpdHkpOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhp
Y3NMYXllclNraWEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvR3JhcGhpY3NMYXllclNraWEuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBHcmFwaGljc0xheWVyU2tpYV9oCisjZGVmaW5lIEdyYXBoaWNzTGF5ZXJT
a2lhX2gKKworLy8gRklYTUUodmFuZ2VsaXMpOiBGaWxlIGhlYXZpbHkgYm9ycm93cyBmcm9tIEdy
YXBoaWNzTGF5ZXJDQUNGLmguICBTZWUgY29tbWVudAorLy8gYXQgdGhlIHRvcCBvZiBHcmFwaGlj
c0xheWVyU2tpYS5jcHAuCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJTa2lhOworCitjbGFzcyBHcmFwaGlj
c0xheWVyU2tpYSA6IHB1YmxpYyBHcmFwaGljc0xheWVyIHsKK3B1YmxpYzoKKworICAgIEdyYXBo
aWNzTGF5ZXJTa2lhKEdyYXBoaWNzTGF5ZXJDbGllbnQqKTsKKyAgICB2aXJ0dWFsIH5HcmFwaGlj
c0xheWVyU2tpYSgpOworCisgICAgdmlydHVhbCB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiBp
bk5hbWUpOworCisgICAgLy8gZm9yIGhvc3RpbmcgdGhpcyBHcmFwaGljc0xheWVyIGluIGEgbmF0
aXZlIGxheWVyIGhpZXJhcmNoeQorICAgIHZpcnR1YWwgTmF0aXZlTGF5ZXIgbmF0aXZlTGF5ZXIo
KSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRDaGlsZHJlbihjb25zdCBWZWN0b3I8R3Jh
cGhpY3NMYXllcio+Jik7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKEdyYXBoaWNzTGF5ZXIg
KmxheWVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIg
KmxheWVyLCBpbnQgaW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEFib3ZlKEdyYXBo
aWNzTGF5ZXIgKmxheWVyLCBHcmFwaGljc0xheWVyICpzaWJsaW5nKTsKKyAgICB2aXJ0dWFsIHZv
aWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVyICpsYXllciwgR3JhcGhpY3NMYXllciAqc2li
bGluZyk7CisgICAgdmlydHVhbCBib29sIHJlcGxhY2VDaGlsZChHcmFwaGljc0xheWVyICpvbGRD
aGlsZCwgR3JhcGhpY3NMYXllciAqbmV3Q2hpbGQpOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92
ZUZyb21QYXJlbnQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRQb3NpdGlvbihjb25zdCBGbG9h
dFBvaW50JiBpblBvaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QW5jaG9yUG9pbnQoY29uc3Qg
RmxvYXRQb2ludDNEJiBpblBvaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZShjb25zdCBG
bG9hdFNpemUmIGluU2l6ZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0
IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hpbGRyZW5U
cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKworICAgIHZpcnR1YWwgdm9p
ZCBzZXRQcmVzZXJ2ZXMzRChib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TWFza3NUb0JvdW5k
cyhib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RHJhd3NDb250ZW50KGJvb2wpOworCisgICAg
dmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1
YWwgdm9pZCBjbGVhckJhY2tncm91bmRDb2xvcigpOworCisgICAgdmlydHVhbCB2b2lkIHNldENv
bnRlbnRzT3BhcXVlKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZmFjZVZpc2liaWxp
dHkoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5KTsK
KworICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYpOworCisgICAgdmlydHVhbCB2
b2lkIHNldENvbnRlbnRzUmVjdChjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0Q29udGVudHNUb0ltYWdlKEltYWdlKik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRz
VG9WaWRlbyhQbGF0Zm9ybUxheWVyKik7CisKKyAgICB2aXJ0dWFsIFBsYXRmb3JtTGF5ZXIqIHBs
YXRmb3JtTGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JhY2tncm91
bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1YWwgdm9pZCBzZXREZWJ1Z0JvcmRlcihj
b25zdCBDb2xvciYsIGZsb2F0IGJvcmRlcldpZHRoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRH
ZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmllbnRhdGlvbik7CisK
KyAgICB2b2lkIG5vdGlmeVN5bmNSZXF1aXJlZCgpCisgICAgeworICAgICAgICBpZiAobV9jbGll
bnQpCisgICAgICAgICAgICBtX2NsaWVudC0+bm90aWZ5U3luY1JlcXVpcmVkKHRoaXMpOworICAg
IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZU9wYWNpdHlPbkxheWVyKCk7CisKKyAgICBM
YXllclNraWEqIHByaW1hcnlMYXllcigpIGNvbnN0ICB7IHJldHVybiBtX3RyYW5zZm9ybUxheWVy
LmdldCgpID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7IH0KKyAgICBM
YXllclNraWEqIGhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0OworICAgIExheWVyU2tpYSog
bGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3Q7CisKKyAgICBDb21wb3NpdGluZ0Nvb3JkaW5hdGVz
T3JpZW50YXRpb24gZGVmYXVsdENvbnRlbnRzT3JpZW50YXRpb24oKSBjb25zdDsKKyAgICB2b2lk
IHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJQb3NpdGlvbigpOwor
ICAgIHZvaWQgdXBkYXRlTGF5ZXJTaXplKCk7CisgICAgdm9pZCB1cGRhdGVBbmNob3JQb2ludCgp
OworICAgIHZvaWQgdXBkYXRlVHJhbnNmb3JtKCk7CisgICAgdm9pZCB1cGRhdGVDaGlsZHJlblRy
YW5zZm9ybSgpOworICAgIHZvaWQgdXBkYXRlTWFza3NUb0JvdW5kcygpOworICAgIHZvaWQgdXBk
YXRlQ29udGVudHNPcGFxdWUoKTsKKyAgICB2b2lkIHVwZGF0ZUJhY2tmYWNlVmlzaWJpbGl0eSgp
OworICAgIHZvaWQgdXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgpOworICAgIHZvaWQgdXBkYXRlTGF5
ZXJEcmF3c0NvbnRlbnQoKTsKKyAgICB2b2lkIHVwZGF0ZUxheWVyQmFja2dyb3VuZENvbG9yKCk7
CisKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzSW1hZ2UoKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRl
bnRzVmlkZW8oKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworICAgIHZvaWQgdXBk
YXRlR2VvbWV0cnlPcmllbnRhdGlvbigpOworCisgICAgdm9pZCBzZXR1cENvbnRlbnRzTGF5ZXIo
TGF5ZXJTa2lhKik7CisgICAgTGF5ZXJTa2lhKiBjb250ZW50c0xheWVyKCkgY29uc3QgeyByZXR1
cm4gbV9jb250ZW50c0xheWVyLmdldCgpOyB9CisKKyAgICBSZWZQdHI8TGF5ZXJTa2lhPiBtX2xh
eWVyOworICAgIFJlZlB0cjxMYXllclNraWE+IG1fdHJhbnNmb3JtTGF5ZXI7CisgICAgUmVmUHRy
PExheWVyU2tpYT4gbV9jb250ZW50c0xheWVyOworCisgICAgZW51bSBDb250ZW50c0xheWVyUHVy
cG9zZSB7CisgICAgICAgIE5vQ29udGVudHNMYXllciA9IDAsCisgICAgICAgIENvbnRlbnRzTGF5
ZXJGb3JJbWFnZSwKKyAgICAgICAgQ29udGVudHNMYXllckZvclZpZGVvCisgICAgfTsKKworICAg
IENvbnRlbnRzTGF5ZXJQdXJwb3NlIG1fY29udGVudHNMYXllclB1cnBvc2U7CisgICAgYm9vbCBt
X2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IgOiAxOworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisj
ZW5kaWYgLy8gR3JhcGhpY3NMYXllclNraWFfaF8KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmNwcAkocmV2aXNpb24gMCkK
KysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5jcHAJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEw
LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAg
KiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisg
KiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUgIkxheWVyUmVuZGVyZXJT
a2lhLmgiCisKKyNpbmNsdWRlICJMYXllclNraWEuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRl
eHRTa2lhLmgiCisjaW5jbHVkZSAic2tpYS9leHQvcGxhdGZvcm1fY2FudmFzLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworUGFzc093blB0cjxMYXllclJlbmRlcmVyU2tpYT4gTGF5ZXJSZW5k
ZXJlclNraWE6OmNyZWF0ZSgpCit7CisgICAgcmV0dXJuIG5ldyBMYXllclJlbmRlcmVyU2tpYSgp
OworfQorCitMYXllclJlbmRlcmVyU2tpYTo6TGF5ZXJSZW5kZXJlclNraWEoKQorICAgIDogbV9y
b290TGF5ZXIoMCkKKyAgICAsIG1fbmVlZHNEaXNwbGF5KGZhbHNlKQoreworfQorCitMYXllclJl
bmRlcmVyU2tpYTo6fkxheWVyUmVuZGVyZXJTa2lhKCkKK3sKK30KKwordm9pZCBMYXllclJlbmRl
cmVyU2tpYTo6ZHJhd0xheWVyc0luQ2FudmFzKHNraWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMs
IFNrUmVjdCBjbGlwUmVjdCkKK3sKKyAgICBpZiAoIW1fcm9vdExheWVyKQorICAgICAgICByZXR1
cm47CisKKyAgICBjYW52YXMtPnNhdmUoKTsKKyAgICBjYW52YXMtPmNsaXBSZWN0KGNsaXBSZWN0
KTsKKworICAgIC8vIEZpcnN0IGNvbXBvc2l0ZSB0aGUgcm9vdCBsYXllciBpbnRvIHRoZSBjYW52
YXMuCisgICAgY2FudmFzLT5kcmF3Qml0bWFwKG1fcm9vdExheWVyLT5wbGF0Zm9ybUNhbnZhcygp
LT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgMCk7CisKKyAgICAvLyBB
Y2NvdW50IGZvciB0aGUgc2Nyb2xsIG9mZnNldCBiZWZvcmUgY29tcG9zaXRpbmcgdGhlIHJlbWFp
bmluZyBsYXllcnMuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByb290IGxheWVyJ3MgcGFpbnRpbmcg
dGFrZXMgaW50byBhY2NvdW50IHRoZSBzY3JvbGwgb2Zmc2V0IGFscmVhZHkuCisgICAgY2FudmFz
LT50cmFuc2xhdGUoLW1fc2Nyb2xsRnJhbWUuZkxlZnQsIC1tX3Njcm9sbEZyYW1lLmZUb3ApOwor
CisgICAgZmxvYXQgb3BhY2l0eSA9IDEuMGY7CisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXll
clNraWE+ID4mIHN1YmxheWVycyA9IG1fcm9vdExheWVyLT5nZXRTdWJsYXllcnMoKTsKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7IGkrKykKKyAgICAgICAgZHJh
d0xheWVySW5DYW52YXNSZWN1cnNpdmUoY2FudmFzLCBzdWJsYXllcnNbaV0uZ2V0KCksIG9wYWNp
dHkpOworCisgICAgY2FudmFzLT5yZXN0b3JlKCk7CisKKyAgICBtX25lZWRzRGlzcGxheSA9IGZh
bHNlOworfQorCit2b2lkIExheWVyUmVuZGVyZXJTa2lhOjp1cGRhdGVMYXllckNvbnRlbnRzKCkK
K3sKKyAgICBpZiAobV9yb290TGF5ZXIpCisgICAgICAgIHVwZGF0ZUxheWVyQ29udGVudHNSZWN1
cnNpdmUobV9yb290TGF5ZXIuZ2V0KCkpOworfQorCit2b2lkIExheWVyUmVuZGVyZXJTa2lhOjpk
cmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2ZShza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzLCBM
YXllclNraWEqIGxheWVyLCBmbG9hdCBvcGFjaXR5KQoreworICAgIC8vIEd1YXJhbnRlZXMgdGhh
dCB0aGUgY2FudmFzIGlzIHJlc3RvcmVkIHRvIGEga25vd24gc3RhdGUgb24gZGVzdHJ1Y3Rpb24u
CisgICAgU2tBdXRvQ2FudmFzUmVzdG9yZSBhdXRvUmVzdG9yZUNhbnZhcyhjYW52YXMsIHRydWUp
OworCisgICAgU2tQb2ludCBwb3NpdGlvbiA9IGxheWVyLT5wb3NpdGlvbigpOworICAgIFNrUG9p
bnQgYW5jaG9yUG9pbnQgPSBsYXllci0+YW5jaG9yUG9pbnQoKTsKKyAgICBTa01hdHJpeCB0cmFu
c2Zvcm0gPSBsYXllci0+dHJhbnNmb3JtKCk7CisgICAgU2tJUmVjdCBib3VuZHMgPSBsYXllci0+
Ym91bmRzKCk7CisKKyAgICBjYW52YXMtPnRyYW5zbGF0ZShwb3NpdGlvbi5mWCwgcG9zaXRpb24u
ZlkpOworCisgICAgU2tTY2FsYXIgdHggPSBTa1NjYWxhck11bChhbmNob3JQb2ludC5mWCwgYm91
bmRzLndpZHRoKCkpOworICAgIFNrU2NhbGFyIHR5ID0gU2tTY2FsYXJNdWwoYW5jaG9yUG9pbnQu
ZlksIGJvdW5kcy5oZWlnaHQoKSk7CisgICAgY2FudmFzLT50cmFuc2xhdGUodHgsIHR5KTsKKyAg
ICBjYW52YXMtPmNvbmNhdCh0cmFuc2Zvcm0pOworICAgIGNhbnZhcy0+dHJhbnNsYXRlKC10eCwg
LXR5KTsKKworICAgIC8vIFRoZSBwb3NpdGlvbiB3ZSBnZXQgaXMgZm9yIHRoZSBjZW50ZXIgb2Yg
dGhlIGxheWVyIGJ1dAorICAgIC8vIGRyYXdCaXRtYXAgc3RhcnRzIGF0IHRoZSB1cHBlci1sZWZ0
IGNvcm5lciBhbmQgdGhlcmVmb3JlCisgICAgLy8gd2UgbmVlZCB0byBhZGp1c3Qgb3VyIHRyYW5z
Zm9ybS4KKyAgICBjYW52YXMtPnRyYW5zbGF0ZSgtMC41ZiAqIGJvdW5kcy53aWR0aCgpLCAtMC41
ZiAqIGJvdW5kcy5oZWlnaHQoKSk7CisKKyAgICBTa1BhaW50IG9wYWNpdHlQYWludDsKKyAgICBv
cGFjaXR5ICo9IGxheWVyLT5vcGFjaXR5KCk7CisgICAgb3BhY2l0eVBhaW50LnNldEFscGhhKG9w
YWNpdHkgKiAyNTUpOworCisgICAgY2FudmFzLT5kcmF3Qml0bWFwKGxheWVyLT5wbGF0Zm9ybUNh
bnZhcygpLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgJm9wYWNpdHlQ
YWludCk7CisKKyAgICBjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiYgc3VibGF5ZXJz
ID0gbGF5ZXItPmdldFN1YmxheWVycygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vi
bGF5ZXJzLnNpemUoKTsgaSsrKQorICAgICAgICBkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2ZShj
YW52YXMsIHN1YmxheWVyc1tpXS5nZXQoKSwgb3BhY2l0eSk7Cit9CisKK3ZvaWQgTGF5ZXJSZW5k
ZXJlclNraWE6OnVwZGF0ZUxheWVyQ29udGVudHNSZWN1cnNpdmUoTGF5ZXJTa2lhKiBsYXllcikK
K3sKKyAgICBsYXllci0+dXBkYXRlQ29udGVudHMoKTsKKworICAgIGNvbnN0IFZlY3RvcjxSZWZQ
dHI8TGF5ZXJTa2lhPiA+JiBzdWJsYXllcnMgPSBsYXllci0+Z2V0U3VibGF5ZXJzKCk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCisgICAgICAgIHVw
ZGF0ZUxheWVyQ29udGVudHNSZWN1cnNpdmUoc3VibGF5ZXJzW2ldLmdldCgpKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJT
a2lhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVy
UmVuZGVyZXJTa2lhLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3NraWEvTGF5ZXJSZW5kZXJlclNraWEuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MCBAQAor
LyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisK
KyNpZm5kZWYgTGF5ZXJSZW5kZXJlclNraWFfaAorI2RlZmluZSBMYXllclJlbmRlcmVyU2tpYV9o
CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJMYXllclNr
aWEuaCIKKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093
blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIHNraWEgeworY2xh
c3MgUGxhdGZvcm1DYW52YXM7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5
ZXJSZW5kZXJlclNraWEgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgorICAgIHN0YXRp
YyBQYXNzT3duUHRyPExheWVyUmVuZGVyZXJTa2lhPiBjcmVhdGUoKTsKKworICAgIExheWVyUmVu
ZGVyZXJTa2lhKCk7CisgICAgfkxheWVyUmVuZGVyZXJTa2lhKCk7CisKKyAgICB2b2lkIGRyYXdM
YXllcnNJbkNhbnZhcyhza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzLCBTa1JlY3QgY2xpcFJl
Y3QpOworCisgICAgdm9pZCB1cGRhdGVMYXllckNvbnRlbnRzKCk7CisKKyAgICB2b2lkIHNldFJv
b3RMYXllcihMYXllclNraWEqIGxheWVyKSB7IG1fcm9vdExheWVyID0gbGF5ZXI7IH0KKyAgICBM
YXllclNraWEqIHJvb3RMYXllcigpIHsgcmV0dXJuIG1fcm9vdExheWVyLmdldCgpOyB9CisKKyAg
ICB2b2lkIHNldE5lZWRzRGlzcGxheSgpIHsgbV9uZWVkc0Rpc3BsYXkgPSB0cnVlOyB9CisKKyAg
ICB2b2lkIHNldFNjcm9sbEZyYW1lKFNrSVJlY3QmIHNjcm9sbEZyYW1lKSB7IG1fc2Nyb2xsRnJh
bWUgPSBzY3JvbGxGcmFtZTsgfQorCitwcml2YXRlOgorICAgIHZvaWQgZHJhd0xheWVySW5DYW52
YXNSZWN1cnNpdmUoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcywgTGF5ZXJTa2lhKiBsYXll
ciwgZmxvYXQgb3BhY2l0eSk7CisgICAgdm9pZCB1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZl
KExheWVyU2tpYSogbGF5ZXIpOworCisgICAgUmVmUHRyPExheWVyU2tpYT4gbV9yb290TGF5ZXI7
CisKKyAgICBib29sIG1fbmVlZHNEaXNwbGF5OworICAgIFNrSVJlY3QgbV9zY3JvbGxGcmFtZTsK
K307CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2Vu
ZGlmIC8vIFdLQ0FDRkxheWVyX2gKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tp
YS9MYXllclNraWEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9MYXllclNraWEuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL0xheWVyU2tpYS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjczIEBACisv
KgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
I2luY2x1ZGUgIkxheWVyU2tpYS5oIgorCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5o
IgorI2luY2x1ZGUgIlJlbmRlckxheWVyQmFja2luZy5oIgorI2luY2x1ZGUgInNraWEvZXh0L3Bs
YXRmb3JtX2NhbnZhcy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFj
ZSBzdGQ7CisKK1Bhc3NSZWZQdHI8TGF5ZXJTa2lhPiBMYXllclNraWE6OmNyZWF0ZShMYXllclR5
cGUgdHlwZSwgR3JhcGhpY3NMYXllclNraWEqIG93bmVyKQoreworICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgTGF5ZXJTa2lhKHR5cGUsIG93bmVyKSk7Cit9CisKK0xheWVyU2tpYTo6TGF5ZXJTa2lh
KExheWVyVHlwZSB0eXBlLCBHcmFwaGljc0xheWVyU2tpYSogb3duZXIpCisgICAgOiBtX25lZWRz
RGlzcGxheU9uQm91bmRzQ2hhbmdlKGZhbHNlKQorICAgICwgbV9vd25lcihvd25lcikKKyAgICAs
IG1fbGF5ZXJUeXBlKHR5cGUpCisgICAgLCBtX3N1cGVybGF5ZXIoMCkKKyAgICAsIG1fYm9yZGVy
V2lkdGgoMCkKKyAgICAsIG1fYm9yZGVyQ29sb3IoMCwgMCwgMCwgMCkKKyAgICAsIG1fYmFja2dy
b3VuZENvbG9yKDAsIDAsIDAsIDApCisgICAgLCBtX2FuY2hvclBvaW50WigwKQorICAgICwgbV9j
bGVhcnNDb250ZXh0KGZhbHNlKQorICAgICwgbV9kb3VibGVTaWRlZChmYWxzZSkKKyAgICAsIG1f
ZWRnZUFudGlhbGlhc2luZ01hc2soMCkKKyAgICAsIG1faGlkZGVuKGZhbHNlKQorICAgICwgbV9t
YXNrc1RvQm91bmRzKGZhbHNlKQorICAgICwgbV9jb250ZW50c0dyYXZpdHkoQm90dG9tKQorICAg
ICwgbV9vcGFjaXR5KDEuMCkKKyAgICAsIG1fb3BhcXVlKHRydWUpCisgICAgLCBtX3pQb3NpdGlv
bigwLjApCisgICAgLCBtX2NhbnZhcygwKQorICAgICwgbV9za2lhQ29udGV4dCgwKQorICAgICwg
bV9ncmFwaGljc0NvbnRleHQoMCkKKyAgICAsIG1fZ2VvbWV0cnlGbGlwcGVkKGZhbHNlKQorewor
ICAgIG1fYm91bmRzLnNldEVtcHR5KCk7CisgICAgbV9iYWNraW5nU3RvcmVSZWN0LnNldEVtcHR5
KCk7CisgICAgbV9mcmFtZS5zZXRFbXB0eSgpOworICAgIG1fcG9zaXRpb24uc2V0KDAsIDApOwor
ICAgIG1fYW5jaG9yUG9pbnQuc2V0KDAsIDApOworICAgIG1fdHJhbnNmb3JtLnJlc2V0KCk7Cisg
ICAgbV9zdWJsYXllclRyYW5zZm9ybS5yZXNldCgpOworCisgICAgdXBkYXRlR3JhcGhpY3NDb250
ZXh0KG1fYmFja2luZ1N0b3JlUmVjdCk7Cit9CisKK0xheWVyU2tpYTo6fkxheWVyU2tpYSgpCit7
CisgICAgLy8gT3VyIHN1cGVybGF5ZXIgc2hvdWxkIGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8g
dXMsIHNvIHRoZXJlIHNob3VsZCBiZSBubyB3YXkgZm9yIHVzIHRvIGJlIGRlc3Ryb3llZCB3aGls
ZSB3ZSBzdGlsbCBoYXZlIGEgc3VwZXJsYXllci4KKyAgICBBU1NFUlQoIXN1cGVybGF5ZXIoKSk7
Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjp1cGRhdGVHcmFwaGljc0NvbnRleHQoY29uc3QgU2tJUmVj
dCYgcmVjdCkKK3sKKyAgICAvLyBDcmVhdGUgbmV3IGNhbnZhcyBhbmQgY29udGV4dC4gT3duUHRy
IHRha2VzIGNhcmUgb2YgZnJlZWluZyB1cAorICAgIC8vIHRoZSBvbGQgb25lcy4KKyAgICBtX2Nh
bnZhcyA9IG5ldyBza2lhOjpQbGF0Zm9ybUNhbnZhcyhyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0
KCksIGZhbHNlKTsKKyAgICBtX3NraWFDb250ZXh0ID0gbmV3IFBsYXRmb3JtQ29udGV4dFNraWEo
bV9jYW52YXMuZ2V0KCkpOworCisgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IHRleHQgdG8g
c2hvdyB1cCBjb3JyZWN0bHkuICBXaXRob3V0IGl0LAorICAgIC8vIEdESSByZW5kZXJzIHdpdGgg
emVybyBhbHBoYSBhbmQgdGhlIHRleHQgYmVjb21lcyBpbnZpc2libGUuCisgICAgLy8gVW5mb3J0
dW5hdGVseSwgc2V0dGluZyB0aGlzIHRvIHRydWUgZGlzYWJsZXMgY2xlYXJ0eXBlLgorICAgIG1f
c2tpYUNvbnRleHQtPnNldERyYXdpbmdUb0ltYWdlQnVmZmVyKHRydWUpOworCisgICAgbV9ncmFw
aGljc0NvbnRleHQgPSBuZXcgR3JhcGhpY3NDb250ZXh0KHJlaW50ZXJwcmV0X2Nhc3Q8UGxhdGZv
cm1HcmFwaGljc0NvbnRleHQqPihtX3NraWFDb250ZXh0LmdldCgpKSk7CisKKyAgICAvLyBCYWNr
aW5nIHN0b3JlIGEgbGF5ZXIgY291bGQgYmUgZGlmZmVyZW50IHRoYW4gdGhlbiBsYXllcidzIGJv
dW5kcy4KKyAgICAvLyBUaGlzIGlzIG1vc3RseSB0cnVlIGZvciB0aGUgcm9vdCBsYXllciB0aGF0
J3Mgc2l6ZWQgYmFzZWQgb24gdGhlIHZpZXcKKyAgICAvLyBzaXplIHJhdGhlciB0aGFuIHRoZSBh
Y3R1YWwgbGF5ZXIgc2l6ZS4KKyAgICBtX2JhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworfQorCit2
b2lkIExheWVyU2tpYTo6dXBkYXRlQ29udGVudHMoKQoreworICAgIFJlbmRlckxheWVyQmFja2lu
ZyogYmFja2luZyA9IHN0YXRpY19jYXN0PFJlbmRlckxheWVyQmFja2luZyo+KG1fb3duZXItPmNs
aWVudCgpKTsKKworICAgIGlmIChiYWNraW5nICYmICFiYWNraW5nLT5wYWludGluZ0dvZXNUb1dp
bmRvdygpKQorICAgICAgICBtX293bmVyLT5wYWludEdyYXBoaWNzTGF5ZXJDb250ZW50cygqbV9n
cmFwaGljc0NvbnRleHQsIEludFJlY3QoMCwgMCwgbV9ib3VuZHMud2lkdGgoKSwgbV9ib3VuZHMu
aGVpZ2h0KCkpKTsKKworICAgIC8vIFBhaW50IHRoZSBkZWJ1ZyBib3JkZXIuCisgICAgLy8gRklY
TUUodmFuZ2VsaXMpOiBBZGQgYSBmbGFnIHRvIGNoZWNrIGlmIGRlYnVnIGJvcmRlcnMgYXJlIHVz
ZWQuCisgICAgbV9ncmFwaGljc0NvbnRleHQtPnNldFN0cm9rZUNvbG9yKG1fYm9yZGVyQ29sb3Is
IERldmljZUNvbG9yU3BhY2UpOworICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VUaGlj
a25lc3MobV9ib3JkZXJXaWR0aCk7CisgICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKElu
dFBvaW50KDAsIDApLCBJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCAwKSk7CisgICAgbV9ncmFw
aGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KDAsIDApLCBJbnRQb2ludCgwLCBtX2JvdW5k
cy5oZWlnaHQoKSkpOworICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5kcmF3TGluZShJbnRQb2ludCht
X2JvdW5kcy53aWR0aCgpLCAwKSwgSW50UG9pbnQobV9ib3VuZHMud2lkdGgoKSwgbV9ib3VuZHMu
aGVpZ2h0KCkpKTsKKyAgICBtX2dyYXBoaWNzQ29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwg
bV9ib3VuZHMuaGVpZ2h0KCkpLCBJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5o
ZWlnaHQoKSkpOworfQorCisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXROZWVkc0NvbW1pdCgpCit7Cisg
ICAgLy8gQ2FsbCBub3RpZnlTeW5jUmVxdWlyZWQoKSwgd2hpY2ggaW4gdGhpcyBpbXBsZW1lbnRh
dGlvbiBwbHVtYnMgdGhyb3VnaCB0bworICAgIC8vIGNhbGwgc2V0Um9vdExheWVyTmVlZHNEaXNw
bGF5KCkgb24gdGhlIFdlYlZpZXcsIHdoaWNoIGNhdXNlcyB0aGUgQ0FDRlJlbmRlcmVyCisgICAg
Ly8gdG8gcmVuZGVyIGEgZnJhbWUuCisgICAgaWYgKG1fb3duZXIpCisgICAgICAgIG1fb3duZXIt
Pm5vdGlmeVN5bmNSZXF1aXJlZCgpOworfQorCit2b2lkIExheWVyU2tpYTo6YWRkU3VibGF5ZXIo
UGFzc1JlZlB0cjxMYXllclNraWE+IHN1YmxheWVyKQoreworICAgIGluc2VydFN1YmxheWVyKHN1
YmxheWVyLCBudW1TdWJsYXllcnMoKSk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjppbnNlcnRTdWJs
YXllcihQYXNzUmVmUHRyPExheWVyU2tpYT4gc3VibGF5ZXIsIHNpemVfdCBpbmRleCkKK3sKKyAg
ICBpbmRleCA9IG1pbihpbmRleCwgbV9zdWJsYXllcnMuc2l6ZSgpKTsKKyAgICBtX3N1YmxheWVy
cy5pbnNlcnQoaW5kZXgsIHN1YmxheWVyKTsKKyAgICBzdWJsYXllci0+c2V0U3VwZXJsYXllcih0
aGlzKTsKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExheWVyU2tpYTo6cmVwbGFj
ZVN1YmxheWVyKExheWVyU2tpYSogcmVmZXJlbmNlLCBQYXNzUmVmUHRyPExheWVyU2tpYT4gbmV3
TGF5ZXIpCit7CisgICAgQVNTRVJUX0FSRyhyZWZlcmVuY2UsIHJlZmVyZW5jZSk7CisgICAgQVNT
RVJUX0FSRyhyZWZlcmVuY2UsIHJlZmVyZW5jZS0+c3VwZXJsYXllcigpID09IHRoaXMpOworCisg
ICAgaWYgKHJlZmVyZW5jZSA9PSBuZXdMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KCFuZXdMYXllcikgeworICAgICAgICByZW1vdmVTdWJsYXllcihyZWZlcmVuY2UpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgbmV3TGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7
CisKKyAgICBpbnQgcmVmZXJlbmNlSW5kZXggPSBpbmRleE9mU3VibGF5ZXIocmVmZXJlbmNlKTsK
KyAgICBBU1NFUlQocmVmZXJlbmNlSW5kZXggIT0gLTEpOworICAgIGlmIChyZWZlcmVuY2VJbmRl
eCA9PSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcmVmZXJlbmNlLT5yZW1vdmVGcm9tU3Vw
ZXJsYXllcigpOworICAgIGluc2VydFN1YmxheWVyKG5ld0xheWVyLCByZWZlcmVuY2VJbmRleCk7
Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpyZW1vdmVGcm9tU3VwZXJsYXllcigpCit7CisgICAgTGF5
ZXJTa2lhKiBzdXBlcmxheWVyID0gdGhpcy0+c3VwZXJsYXllcigpOworICAgIGlmICghc3VwZXJs
YXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgc3VwZXJsYXllci0+cmVtb3ZlU3VibGF5ZXIo
dGhpcyk7CisgICAgc3VwZXJsYXllci0+c2V0TmVlZHNDb21taXQoKTsKK30KKwordm9pZCBMYXll
clNraWE6OnJlbW92ZVN1YmxheWVyKExheWVyU2tpYSogc3VibGF5ZXIpCit7CisgICAgaW50IGZv
dW5kSW5kZXggPSBpbmRleE9mU3VibGF5ZXIoc3VibGF5ZXIpOworICAgIGlmIChmb3VuZEluZGV4
ID09IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3N1YmxheWVycy5yZW1vdmUoZm91bmRJ
bmRleCk7CisgICAgc3VibGF5ZXItPnNldFN1cGVybGF5ZXIoMCk7CisgICAgc2V0TmVlZHNDb21t
aXQoKTsKK30KKworaW50IExheWVyU2tpYTo6aW5kZXhPZlN1YmxheWVyKGNvbnN0IExheWVyU2tp
YSogcmVmZXJlbmNlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9zdWJsYXllcnMu
c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1fc3VibGF5ZXJzW2ldID09IHJlZmVyZW5jZSkK
KyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQg
TGF5ZXJTa2lhOjpzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IFNrSVJlY3QmIHJlY3QpCit7Cisg
ICAgaWYgKG1fYmFja2luZ1N0b3JlUmVjdCA9PSByZWN0KQorICAgICAgICByZXR1cm47CisKKyAg
ICB1cGRhdGVHcmFwaGljc0NvbnRleHQocmVjdCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXRC
b3VuZHMoY29uc3QgU2tJUmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocmVjdCA9PSBtX2JvdW5kcykK
KyAgICAgICAgcmV0dXJuOworCisgICAgbV9ib3VuZHMgPSByZWN0OworCisgICAgLy8gUmUtY3Jl
YXRlIHRoZSBjYW52YXMgYW5kIGFzc29jaWF0ZWQgY29udGV4dHMuCisgICAgdXBkYXRlR3JhcGhp
Y3NDb250ZXh0KG1fYm91bmRzKTsKKworICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9CisKK3ZvaWQg
TGF5ZXJTa2lhOjpzZXRGcmFtZShjb25zdCBTa1JlY3QmIHJlY3QpCit7CisgICAgbV9mcmFtZSA9
IHJlY3Q7CisgICAgc2V0TmVlZHNDb21taXQoKTsKK30KKworY29uc3QgTGF5ZXJTa2lhKiBMYXll
clNraWE6OnJvb3RMYXllcigpIGNvbnN0Cit7CisgICAgY29uc3QgTGF5ZXJTa2lhKiBsYXllciA9
IHRoaXM7CisgICAgZm9yIChMYXllclNraWEqIHN1cGVybGF5ZXIgPSBsYXllci0+c3VwZXJsYXll
cigpOyBzdXBlcmxheWVyOyBsYXllciA9IHN1cGVybGF5ZXIsIHN1cGVybGF5ZXIgPSBzdXBlcmxh
eWVyLT5zdXBlcmxheWVyKCkpIHsgfQorICAgIHJldHVybiBsYXllcjsKK30KKwordm9pZCBMYXll
clNraWE6OnJlbW92ZUFsbFN1YmxheWVycygpCit7CisgICAgbV9zdWJsYXllcnMuY2xlYXIoKTsK
KyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExheWVyU2tpYTo6c2V0U3VibGF5ZXJz
KGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lhPiA+JiBzdWJsYXllcnMpCit7CisgICAgbV9z
dWJsYXllcnMgPSBzdWJsYXllcnM7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXRTdXBlcmxheWVy
KExheWVyU2tpYSogc3VwZXJsYXllcikKK3sKKyAgICBtX3N1cGVybGF5ZXIgPSBzdXBlcmxheWVy
OworfQorCitMYXllclNraWEqIExheWVyU2tpYTo6c3VwZXJsYXllcigpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fc3VwZXJsYXllcjsKK30KKwordm9pZCBMYXllclNraWE6OnNldE5lZWRzRGlzcGxh
eShjb25zdCBTa1JlY3QmIGRpcnR5UmVjdCkKK3sKKyAgICAvLyBGSVhNRSh2YW5nZWxpcyk6IGlt
cGxlbWVudAorICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXRO
ZWVkc0Rpc3BsYXkoKQoreworICAgIC8vIEZJWE1FKHZhbmdlbGlzKTogaW1wbGVtZW50Cit9CisK
KworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworCisjaWZuZGVmIExheWVyU2tpYV9oCisjZGVmaW5lIExheWVyU2tp
YV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKworI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJTa2lhLmgiCisjaW5jbHVk
ZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTa0NvbG9yLmgiCisjaW5jbHVkZSAiU2tQ
b2ludC5oIgorI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlv
bk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1Jl
ZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgorCisKK25hbWVzcGFjZSBza2lhIHsKK2NsYXNzIFBsYXRmb3JtQ2FudmFzOworfQorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExheWVyU2tpYSA6IHB1YmxpYyBSZWZDb3VudGVk
PExheWVyU2tpYT4geworcHVibGljOgorICAgIGVudW0gTGF5ZXJUeXBlIHsgTGF5ZXIsIFRyYW5z
Zm9ybUxheWVyIH07CisgICAgZW51bSBGaWx0ZXJUeXBlIHsgTGluZWFyLCBOZWFyZXN0LCBUcmls
aW5lYXIsIExhbmN6b3MgfTsKKyAgICBlbnVtIENvbnRlbnRzR3Jhdml0eVR5cGUgeyBDZW50ZXIs
IFRvcCwgQm90dG9tLCBMZWZ0LCBSaWdodCwgVG9wTGVmdCwgVG9wUmlnaHQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgQm90dG9tTGVmdCwgQm90dG9tUmlnaHQsIFJlc2l6ZSwgUmVz
aXplQXNwZWN0LCBSZXNpemVBc3BlY3RGaWxsIH07CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxM
YXllclNraWE+IGNyZWF0ZShMYXllclR5cGUsIEdyYXBoaWNzTGF5ZXJTa2lhKiBvd25lciA9IDAp
OworCisgICAgfkxheWVyU2tpYSgpOworCisgICAgdm9pZCBkaXNwbGF5KFBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0Kik7CisKKyAgICB2b2lkIGFkZFN1YmxheWVyKFBhc3NSZWZQdHI8TGF5ZXJTa2lh
PiBzdWJsYXllcik7CisgICAgdm9pZCBpbnNlcnRTdWJsYXllcihQYXNzUmVmUHRyPExheWVyU2tp
YT4sIHNpemVfdCBpbmRleCk7CisgICAgdm9pZCByZXBsYWNlU3VibGF5ZXIoTGF5ZXJTa2lhKiBy
ZWZlcmVuY2UsIFBhc3NSZWZQdHI8TGF5ZXJTa2lhPik7CisgICAgdm9pZCByZW1vdmVGcm9tU3Vw
ZXJsYXllcigpOworCisgICAgdm9pZCBzZXRBbmNob3JQb2ludChjb25zdCBTa1BvaW50JiBhbmNo
b3JQb2ludCkgeyBtX2FuY2hvclBvaW50ID0gYW5jaG9yUG9pbnQ7IHNldE5lZWRzQ29tbWl0KCk7
IH0KKyAgICBTa1BvaW50IGFuY2hvclBvaW50KCkgY29uc3QgeyByZXR1cm4gbV9hbmNob3JQb2lu
dDsgfQorCisgICAgdm9pZCBzZXRBbmNob3JQb2ludFooZmxvYXQgYW5jaG9yUG9pbnRaKSB7IG1f
YW5jaG9yUG9pbnRaID0gYW5jaG9yUG9pbnRaOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgZmxv
YXQgYW5jaG9yUG9pbnRaKCkgY29uc3QgeyByZXR1cm4gbV9hbmNob3JQb2ludFo7IH0KKworICAg
IHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7IG1fYmFja2dyb3VuZENvbG9y
ID0gY29sb3I7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3Io
KSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmRDb2xvcjsgfQorCisgICAgdm9pZCBzZXRCb3Jk
ZXJDb2xvcihjb25zdCBDb2xvciYgY29sb3IpIHsgbV9ib3JkZXJDb2xvciA9IGNvbG9yOyB9Cisg
ICAgQ29sb3IgYm9yZGVyQ29sb3IoKSBjb25zdCB7IHJldHVybiBtX2JvcmRlckNvbG9yOyB9CisK
KyAgICB2b2lkIHNldEJvcmRlcldpZHRoKGZsb2F0IHdpZHRoKSB7IG1fYm9yZGVyV2lkdGggPSB3
aWR0aDsgfQorICAgIFNrU2NhbGFyIGJvcmRlcldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9ib3Jk
ZXJXaWR0aDsgfQorCisgICAgdm9pZCBzZXRCb3VuZHMoY29uc3QgU2tJUmVjdCYpOworICAgIFNr
SVJlY3QgYm91bmRzKCkgY29uc3QgeyByZXR1cm4gbV9ib3VuZHM7IH0KKworICAgIHZvaWQgc2V0
Q2xlYXJzQ29udGV4dChib29sIGNsZWFycykgeyBtX2NsZWFyc0NvbnRleHQgPSBjbGVhcnM7IHNl
dE5lZWRzQ29tbWl0KCk7IH0KKyAgICBib29sIGNsZWFyc0NvbnRleHQoKSBjb25zdCB7IHJldHVy
biBtX2NsZWFyc0NvbnRleHQ7IH0KKworICAgIHZvaWQgc2V0Q29udGVudHNHcmF2aXR5KENvbnRl
bnRzR3Jhdml0eVR5cGUgZ3Jhdml0eVR5cGUpIHsgbV9jb250ZW50c0dyYXZpdHkgPSBncmF2aXR5
VHlwZTsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIENvbnRlbnRzR3Jhdml0eVR5cGUgY29udGVu
dHNHcmF2aXR5KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50c0dyYXZpdHk7IH0KKworICAgIHZv
aWQgc2V0RG91YmxlU2lkZWQoYm9vbCBkb3VibGVTaWRlZCkgeyBtX2RvdWJsZVNpZGVkID0gZG91
YmxlU2lkZWQ7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBib29sIGRvdWJsZVNpZGVkKCkgY29u
c3QgeyByZXR1cm4gbV9kb3VibGVTaWRlZDsgfQorCisgICAgdm9pZCBzZXRFZGdlQW50aWFsaWFz
aW5nTWFzayh1aW50MzJfdCBtYXNrKSB7IG1fZWRnZUFudGlhbGlhc2luZ01hc2sgPSBtYXNrOyBz
ZXROZWVkc0NvbW1pdCgpOyB9CisgICAgdWludDMyX3QgZWRnZUFudGlhbGlhc2luZ01hc2soKSBj
b25zdCB7IHJldHVybiBtX2VkZ2VBbnRpYWxpYXNpbmdNYXNrOyB9CisKKyAgICB2b2lkIHNldEZy
YW1lKGNvbnN0IFNrUmVjdCYpOworICAgIFNrUmVjdCBmcmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1f
ZnJhbWU7IH0KKworICAgIHZvaWQgc2V0SGlkZGVuKGJvb2wgaGlkZGVuKSB7IG1faGlkZGVuID0g
aGlkZGVuOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgYm9vbCBpc0hpZGRlbigpIGNvbnN0IHsg
cmV0dXJuIG1faGlkZGVuOyB9CisKKyAgICB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCBtYXNr
c1RvQm91bmRzKSB7IG1fbWFza3NUb0JvdW5kcyA9IG1hc2tzVG9Cb3VuZHM7IH0KKyAgICBib29s
IG1hc2tzVG9Cb3VuZHMoKSBjb25zdCB7IHJldHVybiBtX21hc2tzVG9Cb3VuZHM7IH0KKworICAg
IHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIG5hbWUpIHsgbV9uYW1lID0gbmFtZTsgfQorICAg
IFN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CisKKyAgICB2b2lkIHNldE5l
ZWRzRGlzcGxheShjb25zdCBTa1JlY3QmIGRpcnR5UmVjdCk7CisgICAgdm9pZCBzZXROZWVkc0Rp
c3BsYXkoKTsKKworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5T25Cb3VuZHNDaGFuZ2UoYm9vbCBu
ZWVkc0Rpc3BsYXkpIHsgbV9uZWVkc0Rpc3BsYXlPbkJvdW5kc0NoYW5nZSA9IG5lZWRzRGlzcGxh
eTsgfQorCisgICAgdm9pZCBzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHkpIHsgbV9vcGFjaXR5ID0g
b3BhY2l0eTsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGZsb2F0IG9wYWNpdHkoKSBjb25zdCB7
IHJldHVybiBtX29wYWNpdHk7IH0KKworICAgIHZvaWQgc2V0T3BhcXVlKGJvb2wgb3BhcXVlKSB7
IG1fb3BhcXVlID0gb3BhcXVlOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgYm9vbCBvcGFxdWUo
KSBjb25zdCB7IHJldHVybiBtX29wYXF1ZTsgfQorCisgICAgdm9pZCBzZXRQb3NpdGlvbihjb25z
dCBTa1BvaW50JiBwb3NpdGlvbikgeyBtX3Bvc2l0aW9uID0gcG9zaXRpb247ICBzZXROZWVkc0Nv
bW1pdCgpOyB9CisKKyAgICBTa1BvaW50IHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3Np
dGlvbjsgfQorCisgICAgdm9pZCBzZXRaUG9zaXRpb24oZmxvYXQgelBvc2l0aW9uKSB7IG1felBv
c2l0aW9uID0gelBvc2l0aW9uOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgU2tTY2FsYXIgelBv
c2l0aW9uKCkgY29uc3QgeyAgcmV0dXJuIG1felBvc2l0aW9uOyB9CisKKyAgICBjb25zdCBMYXll
clNraWEqIHJvb3RMYXllcigpIGNvbnN0OworCisgICAgdm9pZCByZW1vdmVBbGxTdWJsYXllcnMo
KTsKKworICAgIHZvaWQgc2V0U3VibGF5ZXJzKGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lh
PiA+Jik7CisKKyAgICBjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiYgZ2V0U3VibGF5
ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9zdWJsYXllcnM7IH0KKworICAgIHZvaWQgc2V0U3VibGF5
ZXJUcmFuc2Zvcm0oY29uc3QgU2tNYXRyaXgmIHRyYW5zZm9ybSkgeyBtX3N1YmxheWVyVHJhbnNm
b3JtID0gdHJhbnNmb3JtOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgU2tNYXRyaXggc3VibGF5
ZXJUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX3N1YmxheWVyVHJhbnNmb3JtOyB9CisKKyAg
ICB2b2lkIHNldFN1cGVybGF5ZXIoTGF5ZXJTa2lhKiBzdXBlcmxheWVyKTsKKyAgICBMYXllclNr
aWEqIHN1cGVybGF5ZXIoKSBjb25zdDsKKworCisgICAgdm9pZCBzZXRUcmFuc2Zvcm0oY29uc3Qg
U2tNYXRyaXgmIHRyYW5zZm9ybSkgeyBtX3RyYW5zZm9ybSA9IHRyYW5zZm9ybTsgc2V0TmVlZHND
b21taXQoKTsgfQorICAgIGNvbnN0IFNrTWF0cml4JiB0cmFuc2Zvcm0oKSBjb25zdCB7IHJldHVy
biBtX3RyYW5zZm9ybTsgfQorCisgICAgdm9pZCBzZXRHZW9tZXRyeUZsaXBwZWQoYm9vbCBmbGlw
cGVkKSB7IG1fZ2VvbWV0cnlGbGlwcGVkID0gZmxpcHBlZDsgc2V0TmVlZHNDb21taXQoKTsgfQor
ICAgIGJvb2wgZ2VvbWV0cnlGbGlwcGVkKCkgY29uc3QgeyByZXR1cm4gbV9nZW9tZXRyeUZsaXBw
ZWQ7IH0KKworICAgIHZvaWQgdXBkYXRlQ29udGVudHMoKTsKKworICAgIHNraWE6OlBsYXRmb3Jt
Q2FudmFzKiBwbGF0Zm9ybUNhbnZhcygpIHsgcmV0dXJuIG1fY2FudmFzLmdldCgpOyB9CisgICAg
R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQoKSB7IHJldHVybiBtX2dyYXBoaWNzQ29u
dGV4dC5nZXQoKTsgfQorCisgICAgdm9pZCBzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IFNrSVJl
Y3QmIHJlY3QpOworCitwcml2YXRlOgorICAgIExheWVyU2tpYShMYXllclR5cGUsIEdyYXBoaWNz
TGF5ZXJTa2lhKiBvd25lcik7CisKKyAgICB2b2lkIHNldE5lZWRzQ29tbWl0KCk7CisKKyAgICB2
b2lkIHBhaW50TWUoKTsKKworICAgIHNpemVfdCBudW1TdWJsYXllcnMoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIG1fc3VibGF5ZXJzLnNpemUoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1
cm5zIHRoZSBpbmRleCBvZiB0aGUgcGFzc2VkIGxheWVyIGluIHRoaXMgbGF5ZXIncyBzdWJsYXll
cnMgbGlzdAorICAgIC8vIG9yIC0xIGlmIG5vdCBmb3VuZAorICAgIGludCBpbmRleE9mU3VibGF5
ZXIoY29uc3QgTGF5ZXJTa2lhKik7CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxl
ZCBmcm9tIHJlbW92ZUZyb21TdXBlcmxheWVyLgorICAgIHZvaWQgcmVtb3ZlU3VibGF5ZXIoTGF5
ZXJTa2lhKik7CisKKyAgICAvLyBSZS1jcmVhdGVkIHRoZSBjYW52YXMgYW5kIGdyYXBoaWNzIGNv
bnRleHQuICBUaGlzIG1ldGhvZAorICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhl
IGxheWVyIGlzIHJlc2l6ZWQuCisgICAgdm9pZCB1cGRhdGVHcmFwaGljc0NvbnRleHQoY29uc3Qg
U2tJUmVjdCYgcmVjdCk7CisKKyAgICBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiBtX3N1Ymxh
eWVyczsKKyAgICBMYXllclNraWEqIG1fc3VwZXJsYXllcjsKKworICAgIGJvb2wgbV9uZWVkc0Rp
c3BsYXlPbkJvdW5kc0NoYW5nZTsKKyAgICBHcmFwaGljc0xheWVyU2tpYSogbV9vd25lcjsKKwor
ICAgIE93blB0cjxza2lhOjpQbGF0Zm9ybUNhbnZhcz4gbV9jYW52YXM7CisgICAgT3duUHRyPFBs
YXRmb3JtQ29udGV4dFNraWE+IG1fc2tpYUNvbnRleHQ7CisgICAgT3duUHRyPEdyYXBoaWNzQ29u
dGV4dD4gbV9ncmFwaGljc0NvbnRleHQ7CisgICAgQ29sb3IgbV9ib3JkZXJDb2xvcjsKKyAgICBm
bG9hdCBtX2JvcmRlcldpZHRoOworCisgICAgTGF5ZXJUeXBlIG1fbGF5ZXJUeXBlOworCisgICAg
U2tJUmVjdCBtX2JvdW5kczsKKyAgICBTa0lSZWN0IG1fYmFja2luZ1N0b3JlUmVjdDsKKyAgICBT
a1BvaW50IG1fcG9zaXRpb247CisgICAgU2tQb2ludCBtX2FuY2hvclBvaW50OworICAgIGZsb2F0
IG1fYW5jaG9yUG9pbnRaOworICAgIENvbG9yIG1fYmFja2dyb3VuZENvbG9yOworICAgIGJvb2wg
bV9jbGVhcnNDb250ZXh0OworICAgIGJvb2wgbV9kb3VibGVTaWRlZDsKKyAgICB1aW50MzJfdCBt
X2VkZ2VBbnRpYWxpYXNpbmdNYXNrOworICAgIFNrUmVjdCBtX2ZyYW1lOworICAgIGJvb2wgbV9o
aWRkZW47CisgICAgYm9vbCBtX21hc2tzVG9Cb3VuZHM7CisgICAgQ29udGVudHNHcmF2aXR5VHlw
ZSBtX2NvbnRlbnRzR3Jhdml0eTsKKyAgICBmbG9hdCBtX29wYWNpdHk7CisgICAgYm9vbCBtX29w
YXF1ZTsKKyAgICBmbG9hdCBtX3pQb3NpdGlvbjsKKyAgICBib29sIG1fZ2VvbWV0cnlGbGlwcGVk
OworICAgIFN0cmluZyBtX25hbWU7CisKKyAgICBTa01hdHJpeCBtX3RyYW5zZm9ybTsKKyAgICBT
a01hdHJpeCBtX3N1YmxheWVyVHJhbnNmb3JtOworfTsKKworfQorCisjZW5kaWYgLy8gVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYgLy8gV0tDQUNGTGF5ZXJfaApJbmRleDog
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nCShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw0MSBAQAorMjAxMC0wMy0wMiAgVmFuZ2VsaXMgS29r
a2V2aXMgIDx2YW5nZWxpc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkaW5nIHN1cHBvcnQgZm9yIHRoZSBBQ0NFTEVSQVRF
RF9DT01QT1NJVElORyByZW5kZXIgcGF0aCB0byBDaHJvbWl1bS4KKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM1NTU3CisgICAgICAgIEN1cnJlbnRseSBj
b21wb3NpdGluZyBvZiBsYXllcnMgaXMgcGVyZm9ybWVkIHZpYSBzL3cgY29tcG9zaXRvciB3aGlj
aCByZWxpZXMgb24gU2tpYS4gVGhpcyBpcyBhbiBpbml0aWFsIGNoZWNrLWluCisgICAgICAgIGFu
ZCBpdCdzIG9ubHkgYmVlbiB0ZXN0ZWQgb24gV2luZG93cy4gQ29tcGlsaW5nIHRoZSBjb2RlIHJl
cXVpcmVzIHNldGluZyAidXNlX2FjY2VsZXJhdGVkX2NvbXBvc2l0aW5nPTEiCisgICAgICAgIHRv
IEdZUF9ERUZJTkVTLiBUaGUgdXBkYXRlIG9mIGxheWVyIGNvbnRlbnRzIGFuZCBjb21wb3NpdGlu
ZyBpcyBmYWlybHkgaW5lZmZpY2llbnQgYnV0IHRoaXMgd2lsbCBiZSBmaXhlZCBpbgorICAgICAg
ICBzdWJzZXF1ZW50IGNoZWNrLWlucy4KKworICAgICAgICAqIHNyYy9DaHJvbWVDbGllbnRJbXBs
LmNwcDoKKyAgICAgICAgKFdlYktpdDo6Q2hyb21lQ2xpZW50SW1wbDo6YXR0YWNoUm9vdEdyYXBo
aWNzTGF5ZXIpOgorICAgICAgICAoV2ViS2l0OjpDaHJvbWVDbGllbnRJbXBsOjpzY2hlZHVsZUNv
bXBvc2l0aW5nTGF5ZXJTeW5jKToKKyAgICAgICAgKiBzcmMvQ2hyb21lQ2xpZW50SW1wbC5oOgor
ICAgICAgICAoV2ViS2l0OjpDaHJvbWVDbGllbnRJbXBsOjpzZXROZWVkc09uZVNob3REcmF3aW5n
U3luY2hyb25pemF0aW9uKToKKyAgICAgICAgIEFkZGVkIG1ldGhvZHMgcmVxdWlyZWQgYnkgdGhl
IFJlbmRlckxheWVyQ29tcG9zaXRvcgorCisgICAgICAgICogc3JjL1dlYkZyYW1lSW1wbC5jcHA6
CisgICAgICAgIChXZWJLaXQ6OldlYkZyYW1lSW1wbDo6cGFpbnRXaXRoQ29udGV4dCk6CisgICAg
ICAgIChXZWJLaXQ6OldlYkZyYW1lSW1wbDo6cGFpbnQpOgorICAgICAgICAqIHNyYy9XZWJGcmFt
ZUltcGwuaDoKKyAgICAgICAgU3BsaXQgV2ViRnJhbWVJbXBsOjpwYWludCgpIGludG8gdHdvIG1l
dGhvZHMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBjYWxsIHRoZSBwYWludAorICAgICAgICByb3V0
aW5lIHdpdGggYW4gZXhpc3RpbmcgR3JhcGhpY3NDb250ZXh0LCB3aGljaCBpcyBuZWNlc3Nhcnkg
Zm9yIHBhaW50aW5nIHRoZSByb290IGxheWVyIGludG8KKyAgICAgICAgaXRzIG93biBiYWNraW5n
IHN1cmZhY2UuCisKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuY3BwOgorICAgICAgICAoV2Vi
S2l0OjpXZWJWaWV3SW1wbDo6V2ViVmlld0ltcGwpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3
SW1wbDo6cGFpbnQpOgorICAgICAgICBNb2RpZmllZCBtZXRob2QgdG8gaGFuZGxlIHRoZSBhY2Nl
bGVyYXRlZCBjb21wb3NpdGluZyBwYXRoLiBOb3csIHdoZW4gZG9pbmcgYWNjZWxlcmF0ZWQgY29t
cG9zaXRpbmcsCisgICAgICAgIHBhaW50KCkgcmVzdWx0cyB0byByZXBhaW50aW5nIHRoZSBjb250
ZW50cyBvZiB0aGUgcm9vdCBsYXllciBhbmQgdGhlbiBkb2luZyBhIGNvbXBvc2l0ZSBvcGVyYXRp
b24uCisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjpzZXRSb290R3JhcGhpY3NMYXllcik6
CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjpzZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5n
KToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnVwZGF0ZVJvb3RMYXllckNvbnRlbnRz
KToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlzcGxh
eSk6CisgICAgICAgICogc3JjL1dlYlZpZXdJbXBsLmg6CisgICAgICAgIChXZWJLaXQ6OldlYlZp
ZXdJbXBsOjppc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcpOgorCiAyMDEwLTAzLTAyICBDaHJpcyBG
bGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQmV0
aCBEYWtpbi4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmNwcAko
cmV2aXNpb24gNTU0MjgpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSAiR2VvbG9jYXRp
b25TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlQ2hyb21pdW0u
aCIKICNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZpY2VDaHJvbWl1bS5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzTGF5ZXIuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVkZSAiSW50
UmVjdC5oIgogI2luY2x1ZGUgIk5vZGUuaCIKQEAgLTY4OSw0ICs2OTAsMTYgQEAgdm9pZCBDaHJv
bWVDbGllbnRJbXBsOjpyZXF1ZXN0R2VvbG9jYXRpbwogICAgIG1fd2ViVmlldy0+Y2xpZW50KCkt
PmdldEdlb2xvY2F0aW9uU2VydmljZSgpLT5yZXF1ZXN0UGVybWlzc2lvbkZvckZyYW1lKGdlb2xv
Y2F0aW9uU2VydmljZS0+Z2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlKCktPmdldEJyaWRnZUlkKCks
IGZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSk7CiB9CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCit2b2lkIENocm9tZUNsaWVudEltcGw6OmF0dGFjaFJvb3RHcmFwaGljc0xheWVy
KEZyYW1lKiBmcmFtZSwgR3JhcGhpY3NMYXllciogZ3JhcGhpY3NMYXllcikKK3sKKyAgICBtX3dl
YlZpZXctPnNldFJvb3RHcmFwaGljc0xheWVyKGdyYXBoaWNzTGF5ZXIgPyBncmFwaGljc0xheWVy
LT5wbGF0Zm9ybUxheWVyKCkgOiAwKTsKK30KKwordm9pZCBDaHJvbWVDbGllbnRJbXBsOjpzY2hl
ZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKCkKK3sKKyAgICBtX3dlYlZpZXctPnNldFJvb3RMYXll
ck5lZWRzRGlzcGxheSgpOworfQorI2VuZGlmCisKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApJbmRl
eDogV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgJKHJldmlzaW9uIDU1NDI4KQor
KysgV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgJKHdvcmtpbmcgY29weSkK
QEAgLTEyOSw2ICsxMjksMTYgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBmb3JtU3RhdGVE
aWRDaGFuZ2UoY29uc3QgV2ViQ29yZTo6Tm9kZSopOwogICAgIHZpcnR1YWwgUGFzc093blB0cjxX
ZWJDb3JlOjpIVE1MUGFyc2VyUXVpcmtzPiBjcmVhdGVIVE1MUGFyc2VyUXVpcmtzKCkgeyByZXR1
cm4gMDsgfQogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIC8vIFBhc3Mg
MCBhcyB0aGUgR3JhcGhpY3NMYXllciB0byBkZXRhdGNoIHRoZSByb290IGxheWVyLgorICAgIHZp
cnR1YWwgdm9pZCBhdHRhY2hSb290R3JhcGhpY3NMYXllcihXZWJDb3JlOjpGcmFtZSosIFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXIqKTsKKyAgICAvLyBTZXRzIGEgZmxhZyB0byBzcGVjaWZ5IHRoYXQg
dGhlIG5leHQgdGltZSBjb250ZW50IGlzIGRyYXduIHRvIHRoZSB3aW5kb3csCisgICAgLy8gdGhl
IGNoYW5nZXMgYXBwZWFyIG9uIHRoZSBzY3JlZW4gaW4gc3luY2hyb255IHdpdGggdXBkYXRlcyB0
byBHcmFwaGljc0xheWVycy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNPbmVTaG90RHJhd2lu
Z1N5bmNocm9uaXphdGlvbigpIHsgfQorICAgIC8vIFNldHMgYSBmbGFnIHRvIHNwZWNpZnkgdGhh
dCB0aGUgdmlldyBuZWVkcyB0byBiZSB1cGRhdGVkLCBzbyB3ZSBuZWVkCisgICAgLy8gdG8gZG8g
YW4gZWFnZXIgbGF5b3V0IGJlZm9yZSB0aGUgZHJhd2luZy4KKyAgICB2aXJ0dWFsIHZvaWQgc2No
ZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYygpOworI2VuZGlmCiAgICAgLy8gQ2hyb21lQ2xpZW50
Q2hyb21pdW0gbWV0aG9kczoKICAgICB2aXJ0dWFsIHZvaWQgcG9wdXBPcGVuZWQoV2ViQ29yZTo6
UG9wdXBDb250YWluZXIqIHBvcHVwQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBib3VuZHMsCkluZGV4OiBXZWJLaXQvY2hyb21p
dW0vc3JjL1dlYkZyYW1lSW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJGcmFtZUltcGwuY3BwCShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYktpdC9jaHJvbWl1bS9z
cmMvV2ViRnJhbWVJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTY0MywxMSArMTY0MywyMyBA
QCB2b2lkIFdlYkZyYW1lSW1wbDo6bGF5b3V0KCkKICAgICAgICAgdmlldy0+bGF5b3V0SWZOZWVk
ZWRSZWN1cnNpdmUoKTsKIH0KIAordm9pZCBXZWJGcmFtZUltcGw6OnBhaW50V2l0aENvbnRleHQo
R3JhcGhpY3NDb250ZXh0JiBnYywgY29uc3QgV2ViUmVjdCYgcmVjdCkKK3sKKyAgICBJbnRSZWN0
IGRpcnR5UmVjdChyZWN0KTsKKyAgICBnYy5zYXZlKCk7CisgICAgaWYgKG1fZnJhbWUtPmRvY3Vt
ZW50KCkgJiYgZnJhbWVWaWV3KCkpIHsKKyAgICAgICAgZ2MuY2xpcChkaXJ0eVJlY3QpOworICAg
ICAgICBmcmFtZVZpZXcoKS0+cGFpbnQoJmdjLCBkaXJ0eVJlY3QpOworICAgICAgICBtX2ZyYW1l
LT5wYWdlKCktPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZHJhd05vZGVIaWdobGlnaHQoZ2MpOwor
ICAgIH0gZWxzZQorICAgICAgICBnYy5maWxsUmVjdChkaXJ0eVJlY3QsIENvbG9yOjp3aGl0ZSwg
RGV2aWNlQ29sb3JTcGFjZSk7CisgICAgZ2MucmVzdG9yZSgpOworfQorCiB2b2lkIFdlYkZyYW1l
SW1wbDo6cGFpbnQoV2ViQ2FudmFzKiBjYW52YXMsIGNvbnN0IFdlYlJlY3QmIHJlY3QpCiB7CiAg
ICAgaWYgKHJlY3QuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm47Ci0gICAgSW50UmVjdCBkaXJ0
eVJlY3QocmVjdCk7CiAjaWYgV0VCS0lUX1VTSU5HX0NHCiAgICAgR3JhcGhpY3NDb250ZXh0IGdj
KGNhbnZhcyk7CiAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dCgm
Z2MpOwpAQCAtMTY1OSwxNCArMTY3MSw3IEBAIHZvaWQgV2ViRnJhbWVJbXBsOjpwYWludChXZWJD
YW52YXMqIGNhbnYKICNlbHNlCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICNlbmRpZgotICAgIGdj
LnNhdmUoKTsKLSAgICBpZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZVZpZXcoKSkgewot
ICAgICAgICBnYy5jbGlwKGRpcnR5UmVjdCk7Ci0gICAgICAgIGZyYW1lVmlldygpLT5wYWludCgm
Z2MsIGRpcnR5UmVjdCk7Ci0gICAgICAgIG1fZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9yQ29udHJv
bGxlcigpLT5kcmF3Tm9kZUhpZ2hsaWdodChnYyk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGdjLmZp
bGxSZWN0KGRpcnR5UmVjdCwgQ29sb3I6OndoaXRlLCBEZXZpY2VDb2xvclNwYWNlKTsKLSAgICBn
Yy5yZXN0b3JlKCk7CisgICAgcGFpbnRXaXRoQ29udGV4dChnYywgcmVjdCk7CiB9CiAKIHZvaWQg
V2ViRnJhbWVJbXBsOjpjcmVhdGVGcmFtZVZpZXcoKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3Ny
Yy9XZWJGcmFtZUltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZy
YW1lSW1wbC5oCShyZXZpc2lvbiA1NTQyOCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViRnJh
bWVJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJXZWJB
bmltYXRpb25Db250cm9sbGVySW1wbC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBH
cmFwaGljc0NvbnRleHQ7CiBjbGFzcyBIaXN0b3J5SXRlbTsKIGNsYXNzIEtVUkw7CiBjbGFzcyBO
b2RlOwpAQCAtMTgwLDYgKzE4MSw3IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgbGF5b3V0KCk7CiAg
ICAgdm9pZCBwYWludChXZWJDYW52YXMqLCBjb25zdCBXZWJSZWN0Jik7CisgICAgdm9pZCBwYWlu
dFdpdGhDb250ZXh0KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCYsIGNvbnN0IFdlYlJlY3QmKTsK
ICAgICB2b2lkIGNyZWF0ZUZyYW1lVmlldygpOwogCiAgICAgc3RhdGljIFdlYkZyYW1lSW1wbCog
ZnJvbUZyYW1lKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSk7CkluZGV4OiBXZWJLaXQvY2hyb21pdW0v
c3JjL1dlYlZpZXdJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dl
YlZpZXdJbXBsLmNwcAkocmV2aXNpb24gNTU0MjgpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dl
YlZpZXdJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTEwLDYgKzExMCwxMyBAQAogI2luY2x1
ZGUgIlJlbmRlclRoZW1lLmgiCiAjZW5kaWYKIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyNpbmNsdWRlICJ3ZWJraXQvZ2x1ZS93ZWJraXRfZ2x1ZS5oIgorI2lmIFdFQktJVF9V
U0lOR19TS0lBCisjaW5jbHVkZSAic2tpYS9MYXllclNraWEuaCIKKyNlbmRpZgorI2VuZGlmCisK
IC8vIEdldCByaWQgb2YgV1RGJ3MgcG93IGRlZmluZSBzbyB3ZSBjYW4gdXNlIHN0ZDo6cG93Lgog
I3VuZGVmIHBvdwogI2luY2x1ZGUgPGNtYXRoPiAvLyBmb3Igc3RkOjpwb3cKQEAgLTI0NSw2ICsy
NTIsMTAgQEAgV2ViVmlld0ltcGw6OldlYlZpZXdJbXBsKFdlYlZpZXdDbGllbnQqIAogICAgICwg
bV9zdWdnZXN0aW9uc1BvcHVwKDApCiAgICAgLCBtX2lzVHJhbnNwYXJlbnQoZmFsc2UpCiAgICAg
LCBtX3RhYnNUb0xpbmtzKGZhbHNlKQorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICAsIG1fbGF5ZXJSZW5kZXJlcigwKQorICAgICwgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRp
bmcoZmFsc2UpCisjZW5kaWYKIHsKICAgICAvLyBXZWJLaXQvd2luL1dlYlZpZXcuY3BwIGRvZXMg
dGhlIHNhbWUgdGhpbmcsIGV4Y2VwdCB0aGV5IGNhbGwgdGhlCiAgICAgLy8gS0pTIHNwZWNpZmlj
IHdyYXBwZXIgYXJvdW5kIHRoaXMgbWV0aG9kLiBXZSBuZWVkIHRvIGhhdmUgdGhyZWFkaW5nCkBA
IC04NzMsOSArODg0LDMwIEBAIHZvaWQgV2ViVmlld0ltcGw6OmxheW91dCgpCiAKIHZvaWQgV2Vi
Vmlld0ltcGw6OnBhaW50KFdlYkNhbnZhcyogY2FudmFzLCBjb25zdCBXZWJSZWN0JiByZWN0KQog
ewotICAgIFdlYkZyYW1lSW1wbCogd2ViZnJhbWUgPSBtYWluRnJhbWVJbXBsKCk7Ci0gICAgaWYg
KHdlYmZyYW1lKQotICAgICAgICB3ZWJmcmFtZS0+cGFpbnQoY2FudmFzLCByZWN0KTsKKworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAoIWlzQWNjZWxlcmF0ZWRDb21w
b3NpdGluZygpKSB7CisjZW5kaWYKKyAgICAgICAgV2ViRnJhbWVJbXBsKiB3ZWJmcmFtZSA9IG1h
aW5GcmFtZUltcGwoKTsKKyAgICAgICAgaWYgKHdlYmZyYW1lKQorICAgICAgICAgICAgd2ViZnJh
bWUtPnBhaW50KGNhbnZhcywgcmVjdCk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERyYXcgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290
IGxheWVyCisgICAgICAgIHVwZGF0ZVJvb3RMYXllckNvbnRlbnRzKHJlY3QpOworCisgICAgICAg
IC8vIEZJWE1FKHZhbmdlbGlzKTogTGF5ZXJzIHNob3VsZCBub3QgYmUgZm9yY2VkIHRvIHJlZHJh
dyB0aGVpciBjb250ZW50cworICAgICAgICAvLyBoZXJlIGJ1dCBzaG91bGQgdXBkYXRlIGFzIG5l
ZWRlZC4KKyAgICAgICAgbV9sYXllclJlbmRlcmVyLT51cGRhdGVMYXllckNvbnRlbnRzKCk7CisK
KyAgICAgICAgLy8gQ29tcG9zaXRlIGV2ZXJ5dGhpbmcgaW50byB0aGUgY2FudmFzIHRoYXQncyBw
YXNzZWQgdG8gdXMuCisgICAgICAgIFNrSVJlY3QgY2FudmFzSVJlY3Q7CisgICAgICAgIGNhbnZh
c0lSZWN0LnNldChyZWN0LngsIHJlY3QueSwgcmVjdC54K3JlY3Qud2lkdGgsIHJlY3QueStyZWN0
LmhlaWdodCk7CisgICAgICAgIFNrUmVjdCBjYW52YXNSZWN0OworICAgICAgICBjYW52YXNSZWN0
LnNldChjYW52YXNJUmVjdCk7CisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+ZHJhd0xheWVyc0lu
Q2FudmFzKHN0YXRpY19jYXN0PHNraWE6OlBsYXRmb3JtQ2FudmFzKj4oY2FudmFzKSwgY2FudmFz
UmVjdCk7CisgICAgfQorI2VuZGlmCiB9CiAKIC8vIEZJWE1FOiBtX2N1cnJlbnRJbnB1dEV2ZW50
IHNob3VsZCBiZSByZW1vdmVkIG9uY2UgQ2hyb21lQ2xpZW50OjpzaG93KCkgY2FuCkBAIC0xOTE2
LDQgKzE5NDgsNzYgQEAgYm9vbCBXZWJWaWV3SW1wbDo6dGFic1RvTGlua3MoKSBjb25zdAogICAg
IHJldHVybiBtX3RhYnNUb0xpbmtzOwogfQogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQordm9pZCBXZWJWaWV3SW1wbDo6c2V0Um9vdEdyYXBoaWNzTGF5ZXIoV2ViQ29yZTo6UGxh
dGZvcm1MYXllciogbGF5ZXIpCit7CisgICAgc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhsYXll
ciA/IHRydWUgOiBmYWxzZSk7CisgICAgaWYgKG1fbGF5ZXJSZW5kZXJlcikKKyAgICAgICAgbV9s
YXllclJlbmRlcmVyLT5zZXRSb290TGF5ZXIobGF5ZXIpOworfQorCit2b2lkIFdlYlZpZXdJbXBs
OjpzZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nKGJvb2wgYWNjZWxlcmF0ZWQpCit7CisgICAgaWYg
KG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nID09IGFjY2VsZXJhdGVkKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoYWNjZWxlcmF0ZWQpIHsKKyAgICAgICAgbV9sYXllclJlbmRlcmVyID0g
TGF5ZXJSZW5kZXJlclNraWE6OmNyZWF0ZSgpOworICAgICAgICBpZiAobV9sYXllclJlbmRlcmVy
KQorICAgICAgICAgICAgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcgPSB0cnVlOworICAgIH0g
ZWxzZSB7CisgICAgICAgIG1fbGF5ZXJSZW5kZXJlciA9IDA7CisgICAgICAgIG1faXNBY2NlbGVy
YXRlZENvbXBvc2l0aW5nID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIFdlYlZpZXdJbXBsOjp1
cGRhdGVSb290TGF5ZXJDb250ZW50cyhjb25zdCBXZWJSZWN0JiByZWN0KQoreworICAgIGlmICgh
aXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChX
ZWJGcmFtZUltcGwqIHdlYmZyYW1lID0gbWFpbkZyYW1lSW1wbCgpKSB7CisgICAgICAgIGlmIChG
cmFtZVZpZXcqIHZpZXcgPSB3ZWJmcmFtZS0+ZnJhbWVWaWV3KCkpIHsKKyAgICAgICAgICAgIFdl
YlJlY3Qgdmlld1JlY3QgPSB2aWV3LT5mcmFtZVJlY3QoKTsKKworICAgICAgICAgICAgU2tJUmVj
dCBzY3JvbGxGcmFtZTsKKyAgICAgICAgICAgIHNjcm9sbEZyYW1lLnNldCh2aWV3LT5zY3JvbGxY
KCksIHZpZXctPnNjcm9sbFkoKSwgdmlldy0+bGF5b3V0V2lkdGgoKSt2aWV3LT5zY3JvbGxYKCks
IHZpZXctPmxheW91dEhlaWdodCgpK3ZpZXctPnNjcm9sbFkoKSk7CisgICAgICAgICAgICBtX2xh
eWVyUmVuZGVyZXItPnNldFNjcm9sbEZyYW1lKHNjcm9sbEZyYW1lKTsKKyAgICAgICAgICAgIGlm
IChMYXllclNraWEqIHJvb3RMYXllciA9IG1fbGF5ZXJSZW5kZXJlci0+cm9vdExheWVyKCkpIHsK
KyAgICAgICAgICAgICAgICBTa0lSZWN0IHJvb3RMYXllckJvdW5kczsKKyAgICAgICAgICAgICAg
ICBJbnRSZWN0IHZpc2libGVSZWN0ID0gdmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KHRydWUpOwor
CisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBiYWNraW5nIHN0b3JlIHNpemUgdXNlZCBieSB0
aGUgcm9vdCBsYXllciB0byBiZSB0aGUgc2l6ZSBvZiB0aGUgdmlzaWJsZQorICAgICAgICAgICAg
ICAgIC8vIGFyZWEuICBOb3RlIHRoYXQgdGhlIHJvb3QgbGF5ZXIgYm91bmRzIGNvdWxkIGJlIGxh
cmdlciB0aGFuIHRoZSBiYWNraW5nIHN0b3JlIHNpemUKKyAgICAgICAgICAgICAgICAvLyBidXQg
dGhlcmUncyBubyByZWFzb24gdG8gd2FzdGUgbWVtb3J5IGJ5IGFsbG9jYXRpbmcgYmFja2luZyBz
dG9yZSBsYXJnZXIgdGhhbiB0aGUKKyAgICAgICAgICAgICAgICAvLyB2aXNpYmxlIHBvcnRpb24u
CisgICAgICAgICAgICAgICAgcm9vdExheWVyQm91bmRzLnNldCgwLCAwLCB2aXNpYmxlUmVjdC53
aWR0aCgpLCB2aXNpYmxlUmVjdC5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgcm9vdExheWVy
LT5zZXRCYWNraW5nU3RvcmVSZWN0KHJvb3RMYXllckJvdW5kcyk7CisgICAgICAgICAgICAgICAg
R3JhcGhpY3NDb250ZXh0KiByb290TGF5ZXJDb250ZXh0ID0gcm9vdExheWVyLT5ncmFwaGljc0Nv
bnRleHQoKTsKKyAgICAgICAgICAgICAgICByb290TGF5ZXJDb250ZXh0LT5zYXZlKCk7CisKKyAg
ICAgICAgICAgICAgICB3ZWJmcmFtZS0+cGFpbnRXaXRoQ29udGV4dCgqKHJvb3RMYXllci0+Z3Jh
cGhpY3NDb250ZXh0KCkpLCByZWN0KTsKKyAgICAgICAgICAgICAgICByb290TGF5ZXJDb250ZXh0
LT5yZXN0b3JlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQg
V2ViVmlld0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlzcGxheSgpCit7CisgICAgLy8gRklYTUUo
dmFuZ2VsaXMpOiBGb3Igbm93IHdlJ3JlIHBvc3RpbmcgYSByZXBhaW50IGV2ZW50IGZvciB0aGUg
ZW50aXJlIHBhZ2UKKyAgICAvLyAgICAgICAgICAgICAgICAgd2hpY2ggaXMgYW4gb3ZlcmtpbGwu
CisgICAgaWYgKFdlYkZyYW1lSW1wbCogd2ViZnJhbWUgPSBtYWluRnJhbWVJbXBsKCkpIHsKKyAg
ICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9IHdlYmZyYW1lLT5mcmFtZVZpZXcoKSkgeworICAg
ICAgICAgICAgSW50UmVjdCB2aXNpYmxlUmVjdCA9IHZpZXctPnZpc2libGVDb250ZW50UmVjdCh0
cnVlKTsKKyAgICAgICAgICAgIG1fY2xpZW50LT5kaWRJbnZhbGlkYXRlUmVjdCh2aXNpYmxlUmVj
dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9sYXllclJlbmRlcmVyKQorICAgICAg
ICBtX2xheWVyUmVuZGVyZXItPnNldE5lZWRzRGlzcGxheSgpOworfQorCisjZW5kaWYKKwogfSAv
LyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBs
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCShyZXZp
c2lvbiA1NTQyOCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAkod29ya2lu
ZyBjb3B5KQpAQCAtNDMsOSArNDMsMTYgQEAKICNpbmNsdWRlICJDb250ZXh0TWVudUNsaWVudElt
cGwuaCIKICNpbmNsdWRlICJEcmFnQ2xpZW50SW1wbC5oIgogI2luY2x1ZGUgIkVkaXRvckNsaWVu
dEltcGwuaCIKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCiAjaW5jbHVkZSAiSW5zcGVjdG9y
Q2xpZW50SW1wbC5oIgogI2luY2x1ZGUgIk5vdGlmaWNhdGlvblByZXNlbnRlckltcGwuaCIKIAor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyNpZiBXRUJLSVRfVVNJTkdfU0tJQQor
I2luY2x1ZGUgInNraWEvTGF5ZXJSZW5kZXJlclNraWEuaCIKKyNlbmRpZgorI2VuZGlmCisKICNp
bmNsdWRlIDx3dGYvT3duUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KIApAQCAt
Mjk2LDYgKzMwMywxMSBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBtX2N1cnJlbnRJbnB1dEV2
ZW50OwogICAgIH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB2b2lk
IHNldFJvb3RMYXllck5lZWRzRGlzcGxheSgpOworICAgIHZvaWQgc2V0Um9vdEdyYXBoaWNzTGF5
ZXIoV2ViQ29yZTo6UGxhdGZvcm1MYXllciogbGF5ZXIpOworI2VuZGlmCisKIHByaXZhdGU6CiAg
ICAgZnJpZW5kIGNsYXNzIFdlYlZpZXc7ICAvLyBTbyBXZWJWaWV3OjpDcmVhdGUgY2FuIGNhbGwg
b3VyIGNvbnN0cnVjdG9yCiAgICAgZnJpZW5kIGNsYXNzIFdURjo6UmVmQ291bnRlZDxXZWJWaWV3
SW1wbD47CkBAIC0zMjEsNiArMzMzLDEyIEBAIHByaXZhdGU6CiAgICAgLy8gdGhlIEhpdFRlc3RS
ZXN1bHQgZm9yIGl0LgogICAgIFdlYkNvcmU6OkhpdFRlc3RSZXN1bHQgaGl0VGVzdFJlc3VsdEZv
cldpbmRvd1Bvcyhjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpOwogCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorICAgIHZvaWQgc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhib29s
KTsKKyAgICBib29sIGlzQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1f
aXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nOyB9CisgICAgdm9pZCB1cGRhdGVSb290TGF5ZXJDb250
ZW50cyhjb25zdCBXZWJSZWN0JiByZWN0KTsKKyNlbmRpZgorCiAgICAgV2ViVmlld0NsaWVudCog
bV9jbGllbnQ7CiAKICAgICBCYWNrRm9yd2FyZExpc3RDbGllbnRJbXBsIG1fYmFja0ZvcndhcmRM
aXN0Q2xpZW50SW1wbDsKQEAgLTQ0Niw2ICs0NjQsMTEgQEAgcHJpdmF0ZToKICAgICBOb3RpZmlj
YXRpb25QcmVzZW50ZXJJbXBsIG1fbm90aWZpY2F0aW9uUHJlc2VudGVyOwogI2VuZGlmCiAKKyNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgT3duUHRyPFdlYkNvcmU6OkxheWVy
UmVuZGVyZXJTa2lhPiBtX2xheWVyUmVuZGVyZXI7CisgICAgYm9vbCBtX2lzQWNjZWxlcmF0ZWRD
b21wb3NpdGluZzsKKyNlbmRpZgorCiAgICAgc3RhdGljIGNvbnN0IFdlYklucHV0RXZlbnQqIG1f
Y3VycmVudElucHV0RXZlbnQ7CiB9OwogCg==
</data>
<flag name="review"
          id="33104"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50753</attachid>
            <date>2010-03-15 19:27:23 -0700</date>
            <delta_ts>2010-03-16 18:55:02 -0700</delta_ts>
            <desc>Patch addressing review comments</desc>
            <filename>skiaCompositor_4.txt</filename>
            <type>text/plain</type>
            <size>62722</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NjAyMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMTAtMDMtMTUgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudCBzb2Z0d2FyZSBjb21wb3NpdGVkIGdyYXBoaWNzIGxheWVycyBpbiBD
aHJvbWl1bSB1c2luZyB0aGUgU2tpYSBsaWJyYXJ5LgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAgICAgVGhpcyBpcyBhbiBpbml0aWFs
IHN0ZXAgaW4gdGhlIGltcGxlbWVudGF0aW9uLiBMYXllciBjb21wb3NpdGluZyBpcyBmdW5jdGlv
bmluZworICAgICAgICBidXQgbm90IG9wdGltaXplZCBpbiBhbnkgd2F5LiBTdWJlc3F1ZW50IGNo
ZWNrLWlucyB3aWxsIGJlIG5lY2Vzc2FyeSB0byBmaW5ldHVuZQorICAgICAgICBpdC4KKworICAg
ICAgICBUZXN0OiBObyBuZXcgZXhwb3NlZCBmdW5jdGlvbmFsaXR5IHNvIG5vIG5ldyB0ZXN0cy4K
KworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgICBBZGRlZCBuZXcgc291cmNlIGZp
bGVzIHRvIHRoZSBjaHJvbWl1bSBidWlsZAorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzTGF5ZXIuaDoKKyAgICAgICAgICBBZGRlZCBuZWNlc3NhcnkgdHlwZWRlZidzIGFuZCBm
b3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgQ2hyb21pdW0uCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRm
b3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuaDogQWRkZWQuCisgICAgICAgICAg
RGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBH
cmFwaGljc0xheWVyIGNsYXNzLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5
ZXJSZW5kZXJlclNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL0xheWVyUmVuZGVyZXJTa2lhLmg6IEFkZGVkLgorICAgICAgICAgIERlY2xhcmF0aW9uIGFu
ZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2tpYS1iYXNlZCBzb2Z0d2FyZSBjb21wb3NpdG9yLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcDogQWRkZWQuCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaDogQWRkZWQuCisgICAg
ICAgICAgRGVjbGFyYXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIGEgY29tcG9zaXRhYmxlIGxh
eWVyIHRoYXQgdXNlcyBhIFNraWEgY2FudmFzCisgICAgICAgICAgZm9yIGJhY2tpbmcgc3RvcmUu
CisKIDIwMTAtMDMtMTUgIENocmlzIEZsZWl6YWNoICA8Y2ZsZWl6YWNoQGFwcGxlLmNvbT4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBCZXRoIERha2luLgpAQCAtNTc4MSw2ICs1ODA4LDcgQEAKICAg
ICAgICAgKiBzdG9yYWdlL0RhdGFiYXNlVGhyZWFkLmg6CiAgICAgICAgIChXZWJDb3JlOjpEYXRh
YmFzZVRocmVhZDo6Z2V0VGhyZWFkSUQpOgogCis+Pj4+Pj4+IC5yNTYwMjIKIDIwMTAtMDMtMDIg
IEJyYWR5IEVpZHNvbiAgPGJlaWRzb25AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IFNhbSBXZWluaWcuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNTYwMjIpCisrKyBXZWJDb3JlL1dlYkNvcmUu
Z3lwaQkod29ya2luZyBjb3B5KQpAQCAtMjE3NCwxMCArMjE3NCwxNiBAQAogICAgICAgICAgICAg
J3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgn
LAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0U2tp
YS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250
ZXh0M0RTa2lhLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFw
aGljc0xheWVyU2tpYS5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEv
R3JhcGhpY3NMYXllclNraWEuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tp
YS9JbWFnZUJ1ZmZlclNraWEuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL0ltYWdlU2tpYS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEv
SW50UG9pbnRTa2lhLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9J
bnRSZWN0U2tpYS5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5
ZXJSZW5kZXJlclNraWEuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lh
L0xheWVyUmVuZGVyZXJTa2lhLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvTGF5ZXJTa2lhLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9M
YXllclNraWEuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9OYXRpdmVJ
bWFnZVNraWEuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL05hdGl2
ZUltYWdlU2tpYS5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BhdGhT
a2lhLmNwcCcsCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIu
aAkocmV2aXNpb24gNTYwMjIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNz
TGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNjMsNiArNjMsMTIgQEAgdHlwZWRlZiB2b2lkKiBO
YXRpdmVMYXllcjsKIGNsYXNzIFFHcmFwaGljc0l0ZW07CiB0eXBlZGVmIFFHcmFwaGljc0l0ZW0g
UGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgUUdyYXBoaWNzSXRlbSogTmF0aXZlTGF5ZXI7CisjZWxp
ZiBQTEFURk9STShDSFJPTUlVTSkKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIExheWVyU2tp
YTsKK3R5cGVkZWYgTGF5ZXJTa2lhIFBsYXRmb3JtTGF5ZXI7Cit0eXBlZGVmIHZvaWQqIE5hdGl2
ZUxheWVyOworfQogI2Vsc2UKIHR5cGVkZWYgdm9pZCogUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYg
dm9pZCogTmF0aXZlTGF5ZXI7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEv
R3JhcGhpY3NMYXllclNraWEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
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
ZSBjb21tb24gY29kZSAoZS5nLiB0aGUgY29kZSB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBsYXll
ciBoaWVyYXJjaHkpCisgKiBzaG91bGQgYmUga2VwdCBzZXBhcmF0ZSBhbmQgc2hhcmVkIGJldHdl
ZW4gcGxhdGZvcm1zLiBJdCB3b3VsZCBiZSBhIHdlbGwgd29ydGh3aGlsZQorICogZWZmb3J0IG9u
Y2UgdGhlIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gKGJpbmFyaWVzIGFuZCBoZWFkZXJzKSBvZiBD
b3JlQW5pbWF0aW9uIGlzCisgKiBjaGVja2VkIGluIHRvIHRoZSBXZWJLaXQgcmVwb3NpdG9yeS4g
VW50aWwgdGhlbiBvbmx5IEFwcGxlIGNhbiBtYWtlIHRoaXMgaGFwcGVuLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2lu
Y2x1ZGUgIkdyYXBoaWNzTGF5ZXJTa2lhLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5j
bHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVk
ZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJMYXllclNraWEuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0
cmluZy5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRp
bWUuaD4KKyNpbmNsdWRlIDx3dGYvU3RyaW5nRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBz
dGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgc2V0TGF5ZXJCb3JkZXJD
b2xvcihMYXllclNraWEmIGxheWVyLCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgbGF5ZXIu
c2V0Qm9yZGVyQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVhckJvcmRlckNvbG9y
KExheWVyU2tpYSYgbGF5ZXIpCit7CisgICAgbGF5ZXIuc2V0Qm9yZGVyQ29sb3IoMCk7Cit9CisK
K3N0YXRpYyB2b2lkIHNldExheWVyQmFja2dyb3VuZENvbG9yKExheWVyU2tpYSYgbGF5ZXIsIGNv
bnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBsYXllci5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3Ip
OworfQorCitzdGF0aWMgdm9pZCBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKExheWVyU2tpYSYg
bGF5ZXIpCit7CisgICAgbGF5ZXIuc2V0QmFja2dyb3VuZENvbG9yKDApOworfQorCitHcmFwaGlj
c0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gR3JhcGhpY3NMYXllcjo6
Y29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uKCkKK3sKKyAgICByZXR1cm4gQ29tcG9z
aXRpbmdDb29yZGluYXRlc0JvdHRvbVVwOworfQorCitQYXNzT3duUHRyPEdyYXBoaWNzTGF5ZXI+
IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZShHcmFwaGljc0xheWVyQ2xpZW50KiBjbGllbnQpCit7Cisg
ICAgcmV0dXJuIG5ldyBHcmFwaGljc0xheWVyU2tpYShjbGllbnQpOworfQorCitHcmFwaGljc0xh
eWVyU2tpYTo6R3JhcGhpY3NMYXllclNraWEoR3JhcGhpY3NMYXllckNsaWVudCogY2xpZW50KQor
ICAgIDogR3JhcGhpY3NMYXllcihjbGllbnQpCisgICAgLCBtX2NvbnRlbnRzTGF5ZXJQdXJwb3Nl
KE5vQ29udGVudHNMYXllcikKKyAgICAsIG1fY29udGVudHNMYXllckhhc0JhY2tncm91bmRDb2xv
cihmYWxzZSkKK3sKKyAgICBtX2xheWVyID0gTGF5ZXJTa2lhOjpjcmVhdGUoTGF5ZXJTa2lhOjpM
YXllciwgdGhpcyk7CisKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKK30KKworR3JhcGhp
Y3NMYXllclNraWE6On5HcmFwaGljc0xheWVyU2tpYSgpCit7CisgICAgLy8gQ2xlYW4gdXAgdGhl
IFNraWEgbGF5ZXIuCisgICAgaWYgKG1fbGF5ZXIpCisgICAgICAgIG1fbGF5ZXItPnJlbW92ZUZy
b21TdXBlcmxheWVyKCk7CisKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikKKyAgICAgICAgbV90
cmFuc2Zvcm1MYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyU2tpYTo6c2V0TmFtZShjb25zdCBTdHJpbmcmIGluTmFtZSkKK3sKKyAgICBTdHJpbmcg
bmFtZSA9IFN0cmluZzo6Zm9ybWF0KCJHcmFwaGljc0xheWVyU2tpYSglcCkgR3JhcGhpY3NMYXll
ciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhpcykgKyBpbk5hbWU7CisgICAgR3JhcGhpY3NMYXll
cjo6c2V0TmFtZShuYW1lKTsKK30KKworTmF0aXZlTGF5ZXIgR3JhcGhpY3NMYXllclNraWE6Om5h
dGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9sYXllci5nZXQoKTsKK30KKworYm9v
bCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q2hpbGRyZW4oY29uc3QgVmVjdG9yPEdyYXBoaWNzTGF5
ZXIqPiYgY2hpbGRyZW4pCit7CisgICAgYm9vbCBjaGlsZHJlbkNoYW5nZWQgPSBHcmFwaGljc0xh
eWVyOjpzZXRDaGlsZHJlbihjaGlsZHJlbik7CisgICAgLy8gRklYTUU6IEdyYXBoaWNzTGF5ZXI6
OnNldENoaWxkcmVuIGNhbGxzIGFkZENoaWxkKCkgZm9yIGVhY2ggc3VibGF5ZXIsIHdoaWNoCisg
ICAgLy8gd2lsbCBlbmQgdXAgY2FsbGluZyB1cGRhdGVTdWJsYXllckxpc3QoKSBOIHRpbWVzLgor
ICAgIGlmIChjaGlsZHJlbkNoYW5nZWQpCisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOwor
CisgICAgcmV0dXJuIGNoaWxkcmVuQ2hhbmdlZDsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tp
YTo6YWRkQ2hpbGQoR3JhcGhpY3NMYXllciogY2hpbGRMYXllcikKK3sKKyAgICBHcmFwaGljc0xh
eWVyOjphZGRDaGlsZChjaGlsZExheWVyKTsKKyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6YWRkQ2hpbGRBdEluZGV4KEdyYXBoaWNzTGF5ZXIq
IGNoaWxkTGF5ZXIsIGludCBpbmRleCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEF0
SW5kZXgoY2hpbGRMYXllciwgaW5kZXgpOworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjphZGRDaGlsZEJlbG93KEdyYXBoaWNzTGF5ZXIqIGNo
aWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7CisgICAgR3JhcGhpY3NMYXllcjo6
YWRkQ2hpbGRCZWxvdyhjaGlsZExheWVyLCBzaWJsaW5nKTsKKyAgICB1cGRhdGVTdWJsYXllckxp
c3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6YWRkQ2hpbGRBYm92ZShHcmFwaGlj
c0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVyICpzaWJsaW5nKQoreworICAgIEdyYXBo
aWNzTGF5ZXI6OmFkZENoaWxkQWJvdmUoY2hpbGRMYXllciwgc2libGluZyk7CisgICAgdXBkYXRl
U3VibGF5ZXJMaXN0KCk7Cit9CisKK2Jvb2wgR3JhcGhpY3NMYXllclNraWE6OnJlcGxhY2VDaGls
ZChHcmFwaGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpCit7Cisg
ICAgaWYgKEdyYXBoaWNzTGF5ZXI6OnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbmV3Q2hpbGQpKSB7
CisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpyZW1v
dmVGcm9tUGFyZW50KCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpyZW1vdmVGcm9tUGFyZW50KCk7
CisgICAgbGF5ZXJGb3JTdXBlcmxheWVyKCktPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFBvc2l0aW9uKHBvaW50KTsKKyAgICB1cGRh
dGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldEFuY2hv
clBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgcG9pbnQpCit7CisgICAgaWYgKHBvaW50ID09IG1f
YW5jaG9yUG9pbnQpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEFu
Y2hvclBvaW50KHBvaW50KTsKKyAgICB1cGRhdGVBbmNob3JQb2ludCgpOworfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXJTa2lhOjpzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBp
ZiAoc2l6ZSA9PSBtX3NpemUpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6
OnNldFNpemUoc2l6ZSk7CisgICAgdXBkYXRlTGF5ZXJTaXplKCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllclNraWE6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJh
bnNmb3JtKQoreworICAgIGlmICh0cmFuc2Zvcm0gPT0gbV90cmFuc2Zvcm0pCisgICAgICAgIHJl
dHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAg
IHVwZGF0ZVRyYW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRDaGls
ZHJlblRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKQorewor
ICAgIGlmICh0cmFuc2Zvcm0gPT0gbV9jaGlsZHJlblRyYW5zZm9ybSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW5UcmFuc2Zvcm0odHJhbnNmb3JtKTsK
KyAgICB1cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJT
a2lhOjpzZXRQcmVzZXJ2ZXMzRChib29sIHByZXNlcnZlczNEKQoreworICAgIGlmIChwcmVzZXJ2
ZXMzRCA9PSBtX3ByZXNlcnZlczNEKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xh
eWVyOjpzZXRQcmVzZXJ2ZXMzRChwcmVzZXJ2ZXMzRCk7CisgICAgdXBkYXRlTGF5ZXJQcmVzZXJ2
ZXMzRCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRNYXNrc1RvQm91bmRzKGJv
b2wgbWFza3NUb0JvdW5kcykKK3sKKyAgICBpZiAobWFza3NUb0JvdW5kcyA9PSBtX21hc2tzVG9C
b3VuZHMpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldE1hc2tzVG9C
b3VuZHMobWFza3NUb0JvdW5kcyk7CisgICAgdXBkYXRlTWFza3NUb0JvdW5kcygpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXREcmF3c0NvbnRlbnQoYm9vbCBkcmF3c0NvbnRlbnQp
Cit7CisgICAgaWYgKGRyYXdzQ29udGVudCA9PSBtX2RyYXdzQ29udGVudCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0RHJhd3NDb250ZW50KGRyYXdzQ29udGVudCk7
CisgICAgdXBkYXRlTGF5ZXJEcmF3c0NvbnRlbnQoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
U2tpYTo6c2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAo
bV9iYWNrZ3JvdW5kQ29sb3JTZXQgJiYgbV9iYWNrZ3JvdW5kQ29sb3IgPT0gY29sb3IpCisgICAg
ICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tncm91bmRDb2xvcihjb2xv
cik7CisKKyAgICBtX2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IgPSB0cnVlOworICAg
IHVwZGF0ZUxheWVyQmFja2dyb3VuZENvbG9yKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNr
aWE6OmNsZWFyQmFja2dyb3VuZENvbG9yKCkKK3sKKyAgICBpZiAoIW1fYmFja2dyb3VuZENvbG9y
U2V0KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpjbGVhckJhY2tncm91
bmRDb2xvcigpOworICAgIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKm1fY29udGVudHNMYXll
cik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldENvbnRlbnRzT3BhcXVlKGJvb2wg
b3BhcXVlKQoreworICAgIGlmIChtX2NvbnRlbnRzT3BhcXVlID09IG9wYXF1ZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNPcGFxdWUob3BhcXVlKTsK
KyAgICB1cGRhdGVDb250ZW50c09wYXF1ZSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lh
OjpzZXRCYWNrZmFjZVZpc2liaWxpdHkoYm9vbCB2aXNpYmxlKQoreworICAgIGlmIChtX2JhY2tm
YWNlVmlzaWJpbGl0eSA9PSB2aXNpYmxlKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRCYWNrZmFjZVZpc2liaWxpdHkodmlzaWJsZSk7CisgICAgdXBkYXRlQmFja2Zh
Y2VWaXNpYmlsaXR5KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldE9wYWNpdHko
ZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBmbG9hdCBjbGFtcGVkT3BhY2l0eSA9IG1heChtaW4ob3Bh
Y2l0eSwgMS4wZiksIDAuMGYpOworCisgICAgaWYgKG1fb3BhY2l0eSA9PSBjbGFtcGVkT3BhY2l0
eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0T3BhY2l0eShjbGFt
cGVkT3BhY2l0eSk7CisgICAgcHJpbWFyeUxheWVyKCktPnNldE9wYWNpdHkob3BhY2l0eSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgaWYg
KGRyYXdzQ29udGVudCgpKQorICAgICAgICBtX2xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZs
b2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoZHJhd3NDb250ZW50KCkpCisgICAgICAgIG1fbGF5
ZXItPnNldE5lZWRzRGlzcGxheShyZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6
c2V0Q29udGVudHNSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHJlY3QgPT0g
bV9jb250ZW50c1JlY3QpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNl
dENvbnRlbnRzUmVjdChyZWN0KTsKKyAgICB1cGRhdGVDb250ZW50c1JlY3QoKTsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q29udGVudHNUb0ltYWdlKEltYWdlKiBpbWFnZSkKK3sK
KyAgICAvLyBGSVhNRTogSW1wbGVtZW50Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNl
dENvbnRlbnRzVG9WaWRlbyhQbGF0Zm9ybUxheWVyKiB2aWRlb0xheWVyKQoreworICAgIC8vIEZJ
WE1FOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0R2VvbWV0cnlP
cmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24gb3JpZW50YXRpb24p
Cit7CisgICAgaWYgKG9yaWVudGF0aW9uID09IG1fZ2VvbWV0cnlPcmllbnRhdGlvbikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0R2VvbWV0cnlPcmllbnRhdGlvbihv
cmllbnRhdGlvbik7CisgICAgdXBkYXRlR2VvbWV0cnlPcmllbnRhdGlvbigpOworfQorCitQbGF0
Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyU2tpYTo6aG9zdExheWVyRm9yU3VibGF5ZXJzKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1MYXllciA/IG1fdHJhbnNmb3JtTGF5ZXIuZ2V0
KCkgOiBtX2xheWVyLmdldCgpOworfQorCitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyU2tp
YTo6bGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1M
YXllciA/IG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOworfQorCitQbGF0
Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyU2tpYTo6cGxhdGZvcm1MYXllcigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHByaW1hcnlMYXllcigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpz
ZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgaWYgKGNv
bG9yLmlzVmFsaWQoKSkKKyAgICAgICAgc2V0TGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKm1fbGF5ZXIs
IGNvbG9yKTsKKyAgICBlbHNlCisgICAgICAgIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKm1f
bGF5ZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXREZWJ1Z0JvcmRlcihjb25z
dCBDb2xvciYgY29sb3IsIGZsb2F0IGJvcmRlcldpZHRoKQoreworICAgIGlmIChjb2xvci5pc1Zh
bGlkKCkpIHsKKyAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcigqbV9sYXllciwgY29sb3IpOwor
ICAgICAgICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aChib3JkZXJXaWR0aCk7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgY2xlYXJCb3JkZXJDb2xvcigqbV9sYXllcik7CisgICAgICAgIG1fbGF5ZXIt
PnNldEJvcmRlcldpZHRoKDApOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6
dXBkYXRlU3VibGF5ZXJMaXN0KCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiBu
ZXdTdWJsYXllcnM7CisKKyAgICBpZiAobV90cmFuc2Zvcm1MYXllcikgeworICAgICAgICAvLyBB
ZGQgdGhlIHByaW1hcnkgbGF5ZXIgZmlyc3QuIEV2ZW4gaWYgd2UgaGF2ZSBuZWdhdGl2ZSB6LW9y
ZGVyIGNoaWxkcmVuLCB0aGUgcHJpbWFyeSBsYXllciBhbHdheXMgY29tZXMgYmVoaW5kLgorICAg
ICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKG1fbGF5ZXIuZ2V0KCkpOworICAgIH0gZWxzZSBpZiAo
bV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIC8vIEZJWE1FOiBhZGQgdGhlIGNvbnRlbnRzIGxh
eWVyIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggbmVnYXRpdmUgei1vcmRlciBjaGlsZHJlbi4K
KyAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjYXVzZSB2aXNpYmxlIHJlbmRlcmluZyBpc3N1ZXMg
YmVjYXVzZSBjdXJyZW50bHkgY29udGVudHMgbGF5ZXJzIGFyZSBvbmx5IHVzZWQKKyAgICAgICAg
Ly8gZm9yIHJlcGxhY2VkIGVsZW1lbnRzIHRoYXQgZG9uJ3QgaGF2ZSBjaGlsZHJlbi4KKyAgICAg
ICAgbmV3U3VibGF5ZXJzLmFwcGVuZChtX2NvbnRlbnRzTGF5ZXIuZ2V0KCkpOworICAgIH0KKwor
ICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mIGNoaWxkTGF5ZXJzID0gY2hpbGRyZW4o
KTsKKyAgICBzaXplX3QgbnVtQ2hpbGRyZW4gPSBjaGlsZExheWVycy5zaXplKCk7CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgKytpKSB7CisgICAgICAgIEdyYXBoaWNz
TGF5ZXJTa2lhKiBjdXJDaGlsZCA9IHN0YXRpY19jYXN0PEdyYXBoaWNzTGF5ZXJTa2lhKj4oY2hp
bGRMYXllcnNbaV0pOworCisgICAgICAgIExheWVyU2tpYSogY2hpbGRMYXllciA9IGN1ckNoaWxk
LT5sYXllckZvclN1cGVybGF5ZXIoKTsKKyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZChjaGls
ZExheWVyKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld1N1YmxheWVy
cy5zaXplKCk7ICsraSkKKyAgICAgICAgbmV3U3VibGF5ZXJzW2ldLT5yZW1vdmVGcm9tU3VwZXJs
YXllcigpOworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgbV90cmFuc2Zv
cm1MYXllci0+c2V0U3VibGF5ZXJzKG5ld1N1YmxheWVycyk7CisKKyAgICAgICAgaWYgKG1fY29u
dGVudHNMYXllcikgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRyYW5zZm9ybSBsYXll
ciwgdGhlbiB0aGUgY29udGVudHMgbGF5ZXIgaXMgcGFyZW50ZWQgaW4gdGhlCisgICAgICAgICAg
ICAvLyBwcmltYXJ5IGxheWVyICh3aGljaCBpcyBpdHNlbGYgYSBjaGlsZCBvZiB0aGUgdHJhbnNm
b3JtIGxheWVyKS4KKyAgICAgICAgICAgIG1fbGF5ZXItPnJlbW92ZUFsbFN1YmxheWVycygpOwor
ICAgICAgICAgICAgbV9sYXllci0+YWRkU3VibGF5ZXIobV9jb250ZW50c0xheWVyKTsKKyAgICAg
ICAgfQorICAgIH0gZWxzZQorICAgICAgICBtX2xheWVyLT5zZXRTdWJsYXllcnMobmV3U3VibGF5
ZXJzKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTGF5ZXJQb3NpdGlvbigp
Cit7CisgICAgLy8gUG9zaXRpb24gaXMgb2Zmc2V0IG9uIHRoZSBsYXllciBieSB0aGUgbGF5ZXIg
YW5jaG9yIHBvaW50LgorICAgIFNrUG9pbnQgbGF5ZXJQb3NpdGlvbjsKKyAgICBsYXllclBvc2l0
aW9uLnNldChtX3Bvc2l0aW9uLngoKSArIG1fYW5jaG9yUG9pbnQueCgpICogbV9zaXplLndpZHRo
KCksCisgICAgICAgICAgICAgICAgICAgICAgbV9wb3NpdGlvbi55KCkgKyBtX2FuY2hvclBvaW50
LnkoKSAqIG1fc2l6ZS5oZWlnaHQoKSk7CisKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0UG9zaXRp
b24obGF5ZXJQb3NpdGlvbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUxh
eWVyU2l6ZSgpCit7CisgICAgU2tJUmVjdCByZWN0OworICAgIHJlY3Quc2V0KDAsIDAsIG1fc2l6
ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkpOworICAgIGlmIChtX3RyYW5zZm9ybUxheWVyKSB7
CisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKKyAgICAgICAgLy8g
VGhlIGFuY2hvciBvZiB0aGUgY29udGVudHMgbGF5ZXIgaXMgYWx3YXlzIGF0IDAuNSwgMC41LCBz
byB0aGUgcG9zaXRpb24gaXMgY2VudGVyLXJlbGF0aXZlLgorICAgICAgICBTa1BvaW50IGNlbnRl
clBvaW50OworICAgICAgICBjZW50ZXJQb2ludC5zZXQobV9zaXplLndpZHRoKCkgLyAyLjBmLCBt
X3NpemUuaGVpZ2h0KCkgLyAyLjBmKTsKKyAgICAgICAgbV9sYXllci0+c2V0UG9zaXRpb24oY2Vu
dGVyUG9pbnQpOworICAgIH0KKworICAgIG1fbGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKKworICAg
IC8vIE5vdGUgdGhhdCB3ZSBkb24ndCByZXNpemUgbV9jb250ZW50c0xheWVyLiBJdCdzIHVwIHRo
ZSBjYWxsZXIgdG8gZG8gdGhhdC4KKworICAgIC8vIElmIHdlJ3ZlIGNoYW5nZWQgdGhlIGJvdW5k
cywgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24KKyAgICAvLyBvZiB0aGUgbGF5
ZXIsIHRha2luZyBhbmNob3IgcG9pbnQgaW50byBhY2NvdW50LgorICAgIHVwZGF0ZUxheWVyUG9z
aXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQW5jaG9yUG9pbnQo
KQoreworICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQ7CisgICAgYW5jaG9yUG9pbnQuc2V0KG1fYW5j
aG9yUG9pbnQueCgpLCBtX2FuY2hvclBvaW50LnkoKSk7CisgICAgcHJpbWFyeUxheWVyKCktPnNl
dEFuY2hvclBvaW50KGFuY2hvclBvaW50KTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5jaG9y
UG9pbnRaKG1fYW5jaG9yUG9pbnQueigpKTsKKyAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZVRyYW5zZm9ybSgpCit7CisgICAgcHJp
bWFyeUxheWVyKCktPnNldFRyYW5zZm9ybShtX3RyYW5zZm9ybS50b0FmZmluZVRyYW5zZm9ybSgp
KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ2hpbGRyZW5UcmFuc2Zvcm0o
KQoreworICAgIHByaW1hcnlMYXllcigpLT5zZXRTdWJsYXllclRyYW5zZm9ybShtX2NoaWxkcmVu
VHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTWFza3NUb0Jv
dW5kcygpCit7CisgICAgbV9sYXllci0+c2V0TWFza3NUb0JvdW5kcyhtX21hc2tzVG9Cb3VuZHMp
OworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJT
a2lhOjp1cGRhdGVDb250ZW50c09wYXF1ZSgpCit7CisgICAgbV9sYXllci0+c2V0T3BhcXVlKG1f
Y29udGVudHNPcGFxdWUpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVCYWNr
ZmFjZVZpc2liaWxpdHkoKQoreworICAgIG1fbGF5ZXItPnNldERvdWJsZVNpZGVkKG1fYmFja2Zh
Y2VWaXNpYmlsaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlTGF5ZXJQ
cmVzZXJ2ZXMzRCgpCit7CisgICAgLy8gRklYTUU6IGltcGxlbWVudAorfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJTa2lhOjp1cGRhdGVMYXllckRyYXdzQ29udGVudCgpCit7CisgICAgaWYgKG1fZHJh
d3NDb250ZW50KQorICAgICAgICBtX2xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKworICAgIHVw
ZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRh
dGVMYXllckJhY2tncm91bmRDb2xvcigpCit7CisgICAgaWYgKCFtX2NvbnRlbnRzTGF5ZXIpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG5ldmVyIGNyZWF0ZSB0aGUgY29udGVudHMgbGF5
ZXIganVzdCBmb3IgYmFja2dyb3VuZCBjb2xvciB5ZXQuCisgICAgaWYgKG1fYmFja2dyb3VuZENv
bG9yU2V0KQorICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xvcigqbV9jb250ZW50c0xheWVy
LCBtX2JhY2tncm91bmRDb2xvcik7CisgICAgZWxzZQorICAgICAgICBjbGVhckxheWVyQmFja2dy
b3VuZENvbG9yKCptX2NvbnRlbnRzTGF5ZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lh
Ojp1cGRhdGVDb250ZW50c0ltYWdlKCkKK3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50Cit9CisK
K3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUNvbnRlbnRzVmlkZW8oKQoreworICAgIC8v
IEZJWE1FOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ29u
dGVudHNSZWN0KCkKK3sKKyAgICBpZiAoIW1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJu
OworCisgICAgU2tQb2ludCBwb2ludDsKKyAgICBwb2ludC5zZXQobV9jb250ZW50c1JlY3QueCgp
LCBtX2NvbnRlbnRzUmVjdC55KCkpOworICAgIFNrSVJlY3QgcmVjdDsKKyAgICByZWN0LnNldCgw
LCAwLCBtX2NvbnRlbnRzUmVjdC53aWR0aCgpLCBtX2NvbnRlbnRzUmVjdC5oZWlnaHQoKSk7CisK
KyAgICBtX2NvbnRlbnRzTGF5ZXItPnNldFBvc2l0aW9uKHBvaW50KTsKKyAgICBtX2NvbnRlbnRz
TGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBk
YXRlR2VvbWV0cnlPcmllbnRhdGlvbigpCit7CisgICAgc3dpdGNoIChnZW9tZXRyeU9yaWVudGF0
aW9uKCkpIHsKKyAgICBjYXNlIENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNUb3BEb3duOgorICAgICAg
ICBtX2xheWVyLT5zZXRHZW9tZXRyeUZsaXBwZWQoZmFsc2UpOworICAgICAgICBicmVhazsKKwor
ICAgIGNhc2UgQ29tcG9zaXRpbmdDb29yZGluYXRlc0JvdHRvbVVwOgorICAgICAgICBtX2xheWVy
LT5zZXRHZW9tZXRyeUZsaXBwZWQodHJ1ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAv
LyBHZW9tZXRyeSBvcmllbnRhdGlvbiBpcyBtYXBwZWQgb250byBjaGlsZHJlbiB0cmFuc2Zvcm0g
aW4gb2xkZXIgUXVhcnR6Q29yZXMsCisgICAgLy8gc28gaXMgaGFuZGxlZCB2aWEgc2V0R2VvbWV0
cnlPcmllbnRhdGlvbigpLgorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXR1cENvbnRl
bnRzTGF5ZXIoTGF5ZXJTa2lhKiBjb250ZW50c0xheWVyKQoreworICAgIGlmIChjb250ZW50c0xh
eWVyID09IG1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fY29u
dGVudHNMYXllcikgeworICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnJlbW92ZUZyb21TdXBlcmxh
eWVyKCk7CisgICAgICAgIG1fY29udGVudHNMYXllciA9IDA7CisgICAgfQorCisgICAgaWYgKGNv
bnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgbV9jb250ZW50c0xheWVyID0gY29udGVudHNMYXllcjsK
KworICAgICAgICBTa1BvaW50IGFuY2hvclBvaW50OworICAgICAgICBhbmNob3JQb2ludC5zZXQo
MC4wZiwgMC4wZik7CisgICAgICAgIG1fY29udGVudHNMYXllci0+c2V0QW5jaG9yUG9pbnQoYW5j
aG9yUG9pbnQpOworCisgICAgICAgIC8vIEluc2VydCB0aGUgY29udGVudCBsYXllciBmaXJzdC4g
VmlkZW8gZWxlbWVudHMgcmVxdWlyZSB0aGlzLCBiZWNhdXNlIHRoZXkgaGF2ZQorICAgICAgICAv
LyBzaGFkb3cgY29udGVudCB0aGF0IG11c3QgZGlzcGxheSBpbiBmcm9udCBvZiB0aGUgdmlkZW8u
CisgICAgICAgIG1fbGF5ZXItPmluc2VydFN1YmxheWVyKG1fY29udGVudHNMYXllci5nZXQoKSwg
MCk7CisKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7CisKKyAgICAgICAgaWYgKHNob3dE
ZWJ1Z0JvcmRlcnMoKSkgeworICAgICAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcigqbV9jb250
ZW50c0xheWVyLCBDb2xvcigwLCAwLCAxMjgsIDE4MCkpOworICAgICAgICAgICAgbV9jb250ZW50
c0xheWVyLT5zZXRCb3JkZXJXaWR0aCgxLjBmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1cGRh
dGVEZWJ1Z0luZGljYXRvcnMoKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBzaW1wbHkgbWltaWNz
IHRoZSBvcGVyYXRpb24gb2YgR3JhcGhpY3NMYXllckNBCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lh
Ojp1cGRhdGVPcGFjaXR5T25MYXllcigpCit7CisgICAgcHJpbWFyeUxheWVyKCktPnNldE9wYWNp
dHkobV9vcGFjaXR5KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmgJKHJldmlzaW9uIDApCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IK
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBHcmFwaGljc0xheWVyU2tpYV9oCisjZGVmaW5l
IEdyYXBoaWNzTGF5ZXJTa2lhX2gKKworLy8gRklYTUU6IEZpbGUgaGVhdmlseSBib3Jyb3dzIGZy
b20gR3JhcGhpY3NMYXllckNBQ0YuaC4gIFNlZSBjb21tZW50CisvLyBhdCB0aGUgdG9wIG9mIEdy
YXBoaWNzTGF5ZXJTa2lhLmNwcC4KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXIu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBMYXllclNraWE7CisKK2NsYXNzIEdy
YXBoaWNzTGF5ZXJTa2lhIDogcHVibGljIEdyYXBoaWNzTGF5ZXIgeworcHVibGljOgorICAgIEdy
YXBoaWNzTGF5ZXJTa2lhKEdyYXBoaWNzTGF5ZXJDbGllbnQqKTsKKyAgICB2aXJ0dWFsIH5HcmFw
aGljc0xheWVyU2tpYSgpOworCisgICAgdmlydHVhbCB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5n
Jik7CisKKyAgICAvLyBmb3IgaG9zdGluZyB0aGlzIEdyYXBoaWNzTGF5ZXIgaW4gYSBuYXRpdmUg
bGF5ZXIgaGllcmFyY2h5CisgICAgdmlydHVhbCBOYXRpdmVMYXllciBuYXRpdmVMYXllcigpIGNv
bnN0OworCisgICAgdmlydHVhbCBib29sIHNldENoaWxkcmVuKGNvbnN0IFZlY3RvcjxHcmFwaGlj
c0xheWVyKj4mKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoR3JhcGhpY3NMYXllciopOwor
ICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEF0SW5kZXgoR3JhcGhpY3NMYXllciosIGludCBpbmRl
eCk7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQWJvdmUoR3JhcGhpY3NMYXllciogbGF5ZXIs
IEdyYXBoaWNzTGF5ZXIgKnNpYmxpbmcpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEJlbG93
KEdyYXBoaWNzTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyICpzaWJsaW5nKTsKKyAgICB2aXJ0
dWFsIGJvb2wgcmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGljc0xh
eWVyICpuZXdDaGlsZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOwor
CisgICAgdmlydHVhbCB2b2lkIHNldFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIGluUG9pbnQp
OworICAgIHZpcnR1YWwgdm9pZCBzZXRBbmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmIGlu
UG9pbnQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYgaW5TaXpl
KTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldFByZXNlcnZlczNE
KGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wpOworICAgIHZp
cnR1YWwgdm9pZCBzZXREcmF3c0NvbnRlbnQoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0
QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyQmFj
a2dyb3VuZENvbG9yKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcGFxdWUoYm9v
bCk7CisgICAgdmlydHVhbCB2b2lkIHNldEJhY2tmYWNlVmlzaWJpbGl0eShib29sKTsKKworICAg
IHZpcnR1YWwgdm9pZCBzZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHkpOworCisgICAgdmlydHVhbCB2
b2lkIHNldE5lZWRzRGlzcGxheSgpOworICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXlJ
blJlY3QoY29uc3QgRmxvYXRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNS
ZWN0KGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1h
Z2UoSW1hZ2UqKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3Jt
TGF5ZXIqKTsKKworICAgIHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNv
bnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENv
bG9yJik7CisgICAgdmlydHVhbCB2b2lkIHNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiwgZmxv
YXQgYm9yZGVyV2lkdGgpOworCisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5T3JpZW50YXRp
b24oQ29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uKTsKKworICAgIHZvaWQgbm90aWZ5
U3luY1JlcXVpcmVkKCkKKyAgICB7CisgICAgICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgICAg
IG1fY2xpZW50LT5ub3RpZnlTeW5jUmVxdWlyZWQodGhpcyk7CisgICAgfQorCitwcml2YXRlOgor
ICAgIHZvaWQgdXBkYXRlT3BhY2l0eU9uTGF5ZXIoKTsKKworICAgIExheWVyU2tpYSogcHJpbWFy
eUxheWVyKCkgY29uc3QgIHsgcmV0dXJuIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgPyBtX3RyYW5z
Zm9ybUxheWVyLmdldCgpIDogbV9sYXllci5nZXQoKTsgfQorICAgIExheWVyU2tpYSogaG9zdExh
eWVyRm9yU3VibGF5ZXJzKCkgY29uc3Q7CisgICAgTGF5ZXJTa2lhKiBsYXllckZvclN1cGVybGF5
ZXIoKSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisgICAgdm9pZCB1
cGRhdGVMYXllclBvc2l0aW9uKCk7CisgICAgdm9pZCB1cGRhdGVMYXllclNpemUoKTsKKyAgICB2
b2lkIHVwZGF0ZUFuY2hvclBvaW50KCk7CisgICAgdm9pZCB1cGRhdGVUcmFuc2Zvcm0oKTsKKyAg
ICB2b2lkIHVwZGF0ZUNoaWxkcmVuVHJhbnNmb3JtKCk7CisgICAgdm9pZCB1cGRhdGVNYXNrc1Rv
Qm91bmRzKCk7CisgICAgdm9pZCB1cGRhdGVDb250ZW50c09wYXF1ZSgpOworICAgIHZvaWQgdXBk
YXRlQmFja2ZhY2VWaXNpYmlsaXR5KCk7CisgICAgdm9pZCB1cGRhdGVMYXllclByZXNlcnZlczNE
KCk7CisgICAgdm9pZCB1cGRhdGVMYXllckRyYXdzQ29udGVudCgpOworICAgIHZvaWQgdXBkYXRl
TGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKTsKKworICAgIHZvaWQgdXBkYXRlQ29udGVudHNJbWFnZSgp
OworICAgIHZvaWQgdXBkYXRlQ29udGVudHNWaWRlbygpOworICAgIHZvaWQgdXBkYXRlQ29udGVu
dHNSZWN0KCk7CisgICAgdm9pZCB1cGRhdGVHZW9tZXRyeU9yaWVudGF0aW9uKCk7CisKKyAgICB2
b2lkIHNldHVwQ29udGVudHNMYXllcihMYXllclNraWEqKTsKKyAgICBMYXllclNraWEqIGNvbnRl
bnRzTGF5ZXIoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRzTGF5ZXIuZ2V0KCk7IH0KKworICAg
IFJlZlB0cjxMYXllclNraWE+IG1fbGF5ZXI7CisgICAgUmVmUHRyPExheWVyU2tpYT4gbV90cmFu
c2Zvcm1MYXllcjsKKyAgICBSZWZQdHI8TGF5ZXJTa2lhPiBtX2NvbnRlbnRzTGF5ZXI7CisKKyAg
ICBlbnVtIENvbnRlbnRzTGF5ZXJQdXJwb3NlIHsKKyAgICAgICAgTm9Db250ZW50c0xheWVyID0g
MCwKKyAgICAgICAgQ29udGVudHNMYXllckZvckltYWdlLAorICAgICAgICBDb250ZW50c0xheWVy
Rm9yVmlkZW8KKyAgICB9OworCisgICAgQ29udGVudHNMYXllclB1cnBvc2UgbV9jb250ZW50c0xh
eWVyUHVycG9zZTsKKyAgICBib29sIG1fY29udGVudHNMYXllckhhc0JhY2tncm91bmRDb2xvciA6
IDE7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuY3BwCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmNwcAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICog
TmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICog
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyNpbmNsdWRlICJMYXllclJlbmRlcmVyU2tp
YS5oIgorCisjaW5jbHVkZSAiTGF5ZXJTa2lhLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0
U2tpYS5oIgorI2luY2x1ZGUgInNraWEvZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK1Bhc3NPd25QdHI8TGF5ZXJSZW5kZXJlclNraWE+IExheWVyUmVuZGVy
ZXJTa2lhOjpjcmVhdGUoKQoreworICAgIHJldHVybiBuZXcgTGF5ZXJSZW5kZXJlclNraWEoKTsK
K30KKworTGF5ZXJSZW5kZXJlclNraWE6OkxheWVyUmVuZGVyZXJTa2lhKCkKKyAgICA6IG1fcm9v
dExheWVyKDApCisgICAgLCBtX25lZWRzRGlzcGxheShmYWxzZSkKK3sKK30KKworTGF5ZXJSZW5k
ZXJlclNraWE6On5MYXllclJlbmRlcmVyU2tpYSgpCit7Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJl
clNraWE6OmRyYXdMYXllcnNJbkNhbnZhcyhza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzLCBT
a1JlY3QgY2xpcFJlY3QpCit7CisgICAgaWYgKCFtX3Jvb3RMYXllcikKKyAgICAgICAgcmV0dXJu
OworCisgICAgY2FudmFzLT5zYXZlKCk7CisgICAgY2FudmFzLT5jbGlwUmVjdChjbGlwUmVjdCk7
CisKKyAgICAvLyBGaXJzdCBjb21wb3NpdGUgdGhlIHJvb3QgbGF5ZXIgaW50byB0aGUgY2FudmFz
LgorICAgIGNhbnZhcy0+ZHJhd0JpdG1hcChtX3Jvb3RMYXllci0+cGxhdGZvcm1DYW52YXMoKS0+
Z2V0RGV2aWNlKCktPmFjY2Vzc0JpdG1hcChmYWxzZSksIDAsIDAsIDApOworCisgICAgLy8gQWNj
b3VudCBmb3IgdGhlIHNjcm9sbCBvZmZzZXQgYmVmb3JlIGNvbXBvc2l0aW5nIHRoZSByZW1haW5p
bmcgbGF5ZXJzLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgcm9vdCBsYXllcidzIHBhaW50aW5nIHRh
a2VzIGludG8gYWNjb3VudCB0aGUgc2Nyb2xsIG9mZnNldCBhbHJlYWR5LgorICAgIGNhbnZhcy0+
dHJhbnNsYXRlKC1tX3Njcm9sbEZyYW1lLmZMZWZ0LCAtbV9zY3JvbGxGcmFtZS5mVG9wKTsKKwor
ICAgIGZsb2F0IG9wYWNpdHkgPSAxLjBmOworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJT
a2lhPiA+JiBzdWJsYXllcnMgPSBtX3Jvb3RMYXllci0+Z2V0U3VibGF5ZXJzKCk7CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCisgICAgICAgIGRyYXdM
YXllckluQ2FudmFzUmVjdXJzaXZlKGNhbnZhcywgc3VibGF5ZXJzW2ldLmdldCgpLCBvcGFjaXR5
KTsKKworICAgIGNhbnZhcy0+cmVzdG9yZSgpOworCisgICAgbV9uZWVkc0Rpc3BsYXkgPSBmYWxz
ZTsKK30KKwordm9pZCBMYXllclJlbmRlcmVyU2tpYTo6dXBkYXRlTGF5ZXJDb250ZW50cygpCit7
CisgICAgaWYgKG1fcm9vdExheWVyKQorICAgICAgICB1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJz
aXZlKG1fcm9vdExheWVyLmdldCgpKTsKK30KKwordm9pZCBMYXllclJlbmRlcmVyU2tpYTo6ZHJh
d0xheWVySW5DYW52YXNSZWN1cnNpdmUoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcywgTGF5
ZXJTa2lhKiBsYXllciwgZmxvYXQgb3BhY2l0eSkKK3sKKyAgICAvLyBHdWFyYW50ZWVzIHRoYXQg
dGhlIGNhbnZhcyBpcyByZXN0b3JlZCB0byBhIGtub3duIHN0YXRlIG9uIGRlc3RydWN0aW9uLgor
ICAgIFNrQXV0b0NhbnZhc1Jlc3RvcmUgYXV0b1Jlc3RvcmVDYW52YXMoY2FudmFzLCB0cnVlKTsK
KworICAgIFNrUG9pbnQgcG9zaXRpb24gPSBsYXllci0+cG9zaXRpb24oKTsKKyAgICBTa1BvaW50
IGFuY2hvclBvaW50ID0gbGF5ZXItPmFuY2hvclBvaW50KCk7CisgICAgU2tNYXRyaXggdHJhbnNm
b3JtID0gbGF5ZXItPnRyYW5zZm9ybSgpOworICAgIFNrSVJlY3QgYm91bmRzID0gbGF5ZXItPmJv
dW5kcygpOworCisgICAgY2FudmFzLT50cmFuc2xhdGUocG9zaXRpb24uZlgsIHBvc2l0aW9uLmZZ
KTsKKworICAgIFNrU2NhbGFyIHR4ID0gU2tTY2FsYXJNdWwoYW5jaG9yUG9pbnQuZlgsIGJvdW5k
cy53aWR0aCgpKTsKKyAgICBTa1NjYWxhciB0eSA9IFNrU2NhbGFyTXVsKGFuY2hvclBvaW50LmZZ
LCBib3VuZHMuaGVpZ2h0KCkpOworICAgIGNhbnZhcy0+dHJhbnNsYXRlKHR4LCB0eSk7CisgICAg
Y2FudmFzLT5jb25jYXQodHJhbnNmb3JtKTsKKyAgICBjYW52YXMtPnRyYW5zbGF0ZSgtdHgsIC10
eSk7CisKKyAgICAvLyBUaGUgcG9zaXRpb24gd2UgZ2V0IGlzIGZvciB0aGUgY2VudGVyIG9mIHRo
ZSBsYXllciBidXQKKyAgICAvLyBkcmF3Qml0bWFwIHN0YXJ0cyBhdCB0aGUgdXBwZXItbGVmdCBj
b3JuZXIgYW5kIHRoZXJlZm9yZQorICAgIC8vIHdlIG5lZWQgdG8gYWRqdXN0IG91ciB0cmFuc2Zv
cm0uCisgICAgY2FudmFzLT50cmFuc2xhdGUoLTAuNWYgKiBib3VuZHMud2lkdGgoKSwgLTAuNWYg
KiBib3VuZHMuaGVpZ2h0KCkpOworCisgICAgU2tQYWludCBvcGFjaXR5UGFpbnQ7CisgICAgb3Bh
Y2l0eSAqPSBsYXllci0+b3BhY2l0eSgpOworICAgIG9wYWNpdHlQYWludC5zZXRBbHBoYShvcGFj
aXR5ICogMjU1KTsKKworICAgIGNhbnZhcy0+ZHJhd0JpdG1hcChsYXllci0+cGxhdGZvcm1DYW52
YXMoKS0+Z2V0RGV2aWNlKCktPmFjY2Vzc0JpdG1hcChmYWxzZSksIDAsIDAsICZvcGFjaXR5UGFp
bnQpOworCisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllclNraWE+ID4mIHN1YmxheWVycyA9
IGxheWVyLT5nZXRTdWJsYXllcnMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1Ymxh
eWVycy5zaXplKCk7IGkrKykKKyAgICAgICAgZHJhd0xheWVySW5DYW52YXNSZWN1cnNpdmUoY2Fu
dmFzLCBzdWJsYXllcnNbaV0uZ2V0KCksIG9wYWNpdHkpOworfQorCit2b2lkIExheWVyUmVuZGVy
ZXJTa2lhOjp1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKExheWVyU2tpYSogbGF5ZXIpCit7
CisgICAgbGF5ZXItPnVwZGF0ZUNvbnRlbnRzKCk7CisKKyAgICBjb25zdCBWZWN0b3I8UmVmUHRy
PExheWVyU2tpYT4gPiYgc3VibGF5ZXJzID0gbGF5ZXItPmdldFN1YmxheWVycygpOworICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsrKQorICAgICAgICB1cGRh
dGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKHN1YmxheWVyc1tpXS5nZXQoKSk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tp
YS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJl
bmRlcmVyU2tpYS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL0xheWVyUmVuZGVyZXJTa2lhLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODAgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICog
ZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVS
IE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAq
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNp
Zm5kZWYgTGF5ZXJSZW5kZXJlclNraWFfaAorI2RlZmluZSBMYXllclJlbmRlcmVyU2tpYV9oCisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJMYXllclNraWEu
aCIKKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0
ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIHNraWEgeworY2xhc3Mg
UGxhdGZvcm1DYW52YXM7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJS
ZW5kZXJlclNraWEgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgorICAgIHN0YXRpYyBQ
YXNzT3duUHRyPExheWVyUmVuZGVyZXJTa2lhPiBjcmVhdGUoKTsKKworICAgIExheWVyUmVuZGVy
ZXJTa2lhKCk7CisgICAgfkxheWVyUmVuZGVyZXJTa2lhKCk7CisKKyAgICB2b2lkIGRyYXdMYXll
cnNJbkNhbnZhcyhza2lhOjpQbGF0Zm9ybUNhbnZhcyosIFNrUmVjdCBjbGlwUmVjdCk7CisKKyAg
ICB2b2lkIHVwZGF0ZUxheWVyQ29udGVudHMoKTsKKworICAgIHZvaWQgc2V0Um9vdExheWVyKFBh
c3NSZWZQdHI8TGF5ZXJTa2lhPiBsYXllcikgeyBtX3Jvb3RMYXllciA9IGxheWVyOyB9CisgICAg
TGF5ZXJTa2lhKiByb290TGF5ZXIoKSB7IHJldHVybiBtX3Jvb3RMYXllci5nZXQoKTsgfQorCisg
ICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSB7IG1fbmVlZHNEaXNwbGF5ID0gdHJ1ZTsgfQorCisg
ICAgdm9pZCBzZXRTY3JvbGxGcmFtZShTa0lSZWN0JiBzY3JvbGxGcmFtZSkgeyBtX3Njcm9sbEZy
YW1lID0gc2Nyb2xsRnJhbWU7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGRyYXdMYXllckluQ2Fu
dmFzUmVjdXJzaXZlKHNraWE6OlBsYXRmb3JtQ2FudmFzKiwgTGF5ZXJTa2lhKiwgZmxvYXQgb3Bh
Y2l0eSk7CisgICAgdm9pZCB1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKExheWVyU2tpYSog
bGF5ZXIpOworCisgICAgUmVmUHRyPExheWVyU2tpYT4gbV9yb290TGF5ZXI7CisKKyAgICBib29s
IG1fbmVlZHNEaXNwbGF5OworICAgIFNrSVJlY3QgbV9zY3JvbGxGcmFtZTsKK307CisKK30KKwor
I2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisg
KiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZ
UklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIkxheWVyU2tpYS5oIgorCisjaW5j
bHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlJlbmRlckxheWVyQmFja2lu
Zy5oIgorI2luY2x1ZGUgInNraWEvZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK1Bhc3NSZWZQdHI8TGF5ZXJTa2lh
PiBMYXllclNraWE6OmNyZWF0ZShMYXllclR5cGUgdHlwZSwgR3JhcGhpY3NMYXllclNraWEqIG93
bmVyKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgTGF5ZXJTa2lhKHR5cGUsIG93bmVyKSk7
Cit9CisKK0xheWVyU2tpYTo6TGF5ZXJTa2lhKExheWVyVHlwZSB0eXBlLCBHcmFwaGljc0xheWVy
U2tpYSogb3duZXIpCisgICAgOiBtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdlKGZhbHNlKQor
ICAgICwgbV9vd25lcihvd25lcikKKyAgICAsIG1fbGF5ZXJUeXBlKHR5cGUpCisgICAgLCBtX3N1
cGVybGF5ZXIoMCkKKyAgICAsIG1fYm9yZGVyV2lkdGgoMCkKKyAgICAsIG1fYm9yZGVyQ29sb3Io
MCwgMCwgMCwgMCkKKyAgICAsIG1fYmFja2dyb3VuZENvbG9yKDAsIDAsIDAsIDApCisgICAgLCBt
X2FuY2hvclBvaW50WigwKQorICAgICwgbV9jbGVhcnNDb250ZXh0KGZhbHNlKQorICAgICwgbV9k
b3VibGVTaWRlZChmYWxzZSkKKyAgICAsIG1fZWRnZUFudGlhbGlhc2luZ01hc2soMCkKKyAgICAs
IG1faGlkZGVuKGZhbHNlKQorICAgICwgbV9tYXNrc1RvQm91bmRzKGZhbHNlKQorICAgICwgbV9j
b250ZW50c0dyYXZpdHkoQm90dG9tKQorICAgICwgbV9vcGFjaXR5KDEuMCkKKyAgICAsIG1fb3Bh
cXVlKHRydWUpCisgICAgLCBtX3pQb3NpdGlvbigwLjApCisgICAgLCBtX2NhbnZhcygwKQorICAg
ICwgbV9za2lhQ29udGV4dCgwKQorICAgICwgbV9ncmFwaGljc0NvbnRleHQoMCkKKyAgICAsIG1f
Z2VvbWV0cnlGbGlwcGVkKGZhbHNlKQoreworICAgIG1fYm91bmRzLnNldEVtcHR5KCk7CisgICAg
bV9iYWNraW5nU3RvcmVSZWN0LnNldEVtcHR5KCk7CisgICAgbV9mcmFtZS5zZXRFbXB0eSgpOwor
ICAgIG1fcG9zaXRpb24uc2V0KDAsIDApOworICAgIG1fYW5jaG9yUG9pbnQuc2V0KDAsIDApOwor
ICAgIG1fdHJhbnNmb3JtLnJlc2V0KCk7CisgICAgbV9zdWJsYXllclRyYW5zZm9ybS5yZXNldCgp
OworCisgICAgdXBkYXRlR3JhcGhpY3NDb250ZXh0KG1fYmFja2luZ1N0b3JlUmVjdCk7Cit9CisK
K0xheWVyU2tpYTo6fkxheWVyU2tpYSgpCit7CisgICAgLy8gT3VyIHN1cGVybGF5ZXIgc2hvdWxk
IGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gdXMsIHNvIHRoZXJlIHNob3VsZCBiZSBubyB3YXkg
Zm9yIHVzIHRvIGJlIGRlc3Ryb3llZCB3aGlsZSB3ZSBzdGlsbCBoYXZlIGEgc3VwZXJsYXllci4K
KyAgICBBU1NFUlQoIXN1cGVybGF5ZXIoKSk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjp1cGRhdGVH
cmFwaGljc0NvbnRleHQoY29uc3QgU2tJUmVjdCYgcmVjdCkKK3sKKyAgICAvLyBDcmVhdGUgbmV3
IGNhbnZhcyBhbmQgY29udGV4dC4gT3duUHRyIHRha2VzIGNhcmUgb2YgZnJlZWluZyB1cAorICAg
IC8vIHRoZSBvbGQgb25lcy4KKyAgICBtX2NhbnZhcyA9IG5ldyBza2lhOjpQbGF0Zm9ybUNhbnZh
cyhyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCksIGZhbHNlKTsKKyAgICBtX3NraWFDb250ZXh0
ID0gbmV3IFBsYXRmb3JtQ29udGV4dFNraWEobV9jYW52YXMuZ2V0KCkpOworCisgICAgLy8gVGhp
cyBpcyBuZWVkZWQgdG8gZ2V0IHRleHQgdG8gc2hvdyB1cCBjb3JyZWN0bHkuIFdpdGhvdXQgaXQs
CisgICAgLy8gR0RJIHJlbmRlcnMgd2l0aCB6ZXJvIGFscGhhIGFuZCB0aGUgdGV4dCBiZWNvbWVz
IGludmlzaWJsZS4KKyAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBk
aXNhYmxlcyBjbGVhcnR5cGUuCisgICAgbV9za2lhQ29udGV4dC0+c2V0RHJhd2luZ1RvSW1hZ2VC
dWZmZXIodHJ1ZSk7CisKKyAgICBtX2dyYXBoaWNzQ29udGV4dCA9IG5ldyBHcmFwaGljc0NvbnRl
eHQocmVpbnRlcnByZXRfY2FzdDxQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCo+KG1fc2tpYUNvbnRl
eHQuZ2V0KCkpKTsKKworICAgIC8vIFRoZSBiYWNraW5nIHN0b3JlIGEgbGF5ZXIgZG9lcyBub3Qg
aGF2ZSB0byBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBsYXllcidzIGJvdW5kcy4KKyAgICAvLyBU
aGlzIGlzIG1vc3RseSB0cnVlIGZvciB0aGUgcm9vdCBsYXllciB3aG9zZSBiYWNraW5nIHN0b3Jl
IGlzIHNpemVkIGJhc2VkIG9uIHRoZSB2aWV3CisgICAgLy8gc2l6ZSByYXRoZXIgdGhhbiB0aGUg
YWN0dWFsIGxheWVyIHNpemUuCisgICAgbV9iYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKK30KKwor
dm9pZCBMYXllclNraWE6OnVwZGF0ZUNvbnRlbnRzKCkKK3sKKyAgICBSZW5kZXJMYXllckJhY2tp
bmcqIGJhY2tpbmcgPSBzdGF0aWNfY2FzdDxSZW5kZXJMYXllckJhY2tpbmcqPihtX293bmVyLT5j
bGllbnQoKSk7CisKKyAgICBpZiAoYmFja2luZyAmJiAhYmFja2luZy0+cGFpbnRpbmdHb2VzVG9X
aW5kb3coKSkKKyAgICAgICAgbV9vd25lci0+cGFpbnRHcmFwaGljc0xheWVyQ29udGVudHMoKm1f
Z3JhcGhpY3NDb250ZXh0LCBJbnRSZWN0KDAsIDAsIG1fYm91bmRzLndpZHRoKCksIG1fYm91bmRz
LmhlaWdodCgpKSk7CisKKyAgICAvLyBQYWludCB0aGUgZGVidWcgYm9yZGVyLgorICAgIC8vIEZJ
WE1FOiBBZGQgYSBmbGFnIHRvIGNoZWNrIGlmIGRlYnVnIGJvcmRlcnMgYXJlIHVzZWQuCisgICAg
bV9ncmFwaGljc0NvbnRleHQtPnNldFN0cm9rZUNvbG9yKG1fYm9yZGVyQ29sb3IsIERldmljZUNv
bG9yU3BhY2UpOworICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobV9i
b3JkZXJXaWR0aCk7CisgICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KDAs
IDApLCBJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCAwKSk7CisgICAgbV9ncmFwaGljc0NvbnRl
eHQtPmRyYXdMaW5lKEludFBvaW50KDAsIDApLCBJbnRQb2ludCgwLCBtX2JvdW5kcy5oZWlnaHQo
KSkpOworICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChtX2JvdW5kcy53
aWR0aCgpLCAwKSwgSW50UG9pbnQobV9ib3VuZHMud2lkdGgoKSwgbV9ib3VuZHMuaGVpZ2h0KCkp
KTsKKyAgICBtX2dyYXBoaWNzQ29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwgbV9ib3VuZHMu
aGVpZ2h0KCkpLCBJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkp
OworfQorCisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXROZWVkc0NvbW1pdCgpCit7CisgICAgLy8gQ2Fs
bCBub3RpZnlTeW5jUmVxdWlyZWQoKSwgd2hpY2ggaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBwbHVt
YnMgdGhyb3VnaCB0bworICAgIC8vIGNhbGwgc2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCkgb24g
dGhlIFdlYlZpZXcsIHdoaWNoIHdpbGwgY2F1c2UgTGF5ZXJSZW5kZXJlclNraWEKKyAgICAvLyB0
byByZW5kZXIgYSBmcmFtZS4KKyAgICBpZiAobV9vd25lcikKKyAgICAgICAgbV9vd25lci0+bm90
aWZ5U3luY1JlcXVpcmVkKCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjphZGRTdWJsYXllcihQYXNz
UmVmUHRyPExheWVyU2tpYT4gc3VibGF5ZXIpCit7CisgICAgaW5zZXJ0U3VibGF5ZXIoc3VibGF5
ZXIsIG51bVN1YmxheWVycygpKTsKK30KKwordm9pZCBMYXllclNraWE6Omluc2VydFN1YmxheWVy
KFBhc3NSZWZQdHI8TGF5ZXJTa2lhPiBzdWJsYXllciwgc2l6ZV90IGluZGV4KQoreworICAgIGlu
ZGV4ID0gbWluKGluZGV4LCBtX3N1YmxheWVycy5zaXplKCkpOworICAgIG1fc3VibGF5ZXJzLmlu
c2VydChpbmRleCwgc3VibGF5ZXIpOworICAgIHN1YmxheWVyLT5zZXRTdXBlcmxheWVyKHRoaXMp
OworICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpyZW1vdmVGcm9t
U3VwZXJsYXllcigpCit7CisgICAgTGF5ZXJTa2lhKiBzdXBlcmxheWVyID0gdGhpcy0+c3VwZXJs
YXllcigpOworICAgIGlmICghc3VwZXJsYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgc3Vw
ZXJsYXllci0+cmVtb3ZlU3VibGF5ZXIodGhpcyk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpyZW1v
dmVTdWJsYXllcihMYXllclNraWEqIHN1YmxheWVyKQoreworICAgIGludCBmb3VuZEluZGV4ID0g
aW5kZXhPZlN1YmxheWVyKHN1YmxheWVyKTsKKyAgICBpZiAoZm91bmRJbmRleCA9PSAtMSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9zdWJsYXllcnMucmVtb3ZlKGZvdW5kSW5kZXgpOworICAg
IHN1YmxheWVyLT5zZXRTdXBlcmxheWVyKDApOworICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9CisK
K2ludCBMYXllclNraWE6OmluZGV4T2ZTdWJsYXllcihjb25zdCBMYXllclNraWEqIHJlZmVyZW5j
ZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3VibGF5ZXJzLnNpemUoKTsgaSsr
KSB7CisgICAgICAgIGlmIChtX3N1YmxheWVyc1tpXSA9PSByZWZlcmVuY2UpCisgICAgICAgICAg
ICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIExheWVyU2tpYTo6
c2V0QmFja2luZ1N0b3JlUmVjdChjb25zdCBTa0lSZWN0JiByZWN0KQoreworICAgIGlmIChtX2Jh
Y2tpbmdTdG9yZVJlY3QgPT0gcmVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdXBkYXRlR3Jh
cGhpY3NDb250ZXh0KHJlY3QpOworfQorCit2b2lkIExheWVyU2tpYTo6c2V0Qm91bmRzKGNvbnN0
IFNrSVJlY3QmIHJlY3QpCit7CisgICAgaWYgKHJlY3QgPT0gbV9ib3VuZHMpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fYm91bmRzID0gcmVjdDsKKworICAgIC8vIFJlLWNyZWF0ZSB0aGUgY2Fu
dmFzIGFuZCBhc3NvY2lhdGVkIGNvbnRleHRzLgorICAgIHVwZGF0ZUdyYXBoaWNzQ29udGV4dCht
X2JvdW5kcyk7CisKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExheWVyU2tpYTo6
c2V0RnJhbWUoY29uc3QgU2tSZWN0JiByZWN0KQoreworICAgIGlmIChyZWN0ID09IG1fZnJhbWUp
CisgICAgICByZXR1cm47CisKKyAgICBtX2ZyYW1lID0gcmVjdDsKKyAgICBzZXROZWVkc0NvbW1p
dCgpOworfQorCitjb25zdCBMYXllclNraWEqIExheWVyU2tpYTo6cm9vdExheWVyKCkgY29uc3QK
K3sKKyAgICBjb25zdCBMYXllclNraWEqIGxheWVyID0gdGhpczsKKyAgICBmb3IgKExheWVyU2tp
YSogc3VwZXJsYXllciA9IGxheWVyLT5zdXBlcmxheWVyKCk7IHN1cGVybGF5ZXI7IGxheWVyID0g
c3VwZXJsYXllciwgc3VwZXJsYXllciA9IHN1cGVybGF5ZXItPnN1cGVybGF5ZXIoKSkgeyB9Cisg
ICAgcmV0dXJuIGxheWVyOworfQorCit2b2lkIExheWVyU2tpYTo6cmVtb3ZlQWxsU3VibGF5ZXJz
KCkKK3sKKyAgICBtX3N1YmxheWVycy5jbGVhcigpOworICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9
CisKK3ZvaWQgTGF5ZXJTa2lhOjpzZXRTdWJsYXllcnMoY29uc3QgVmVjdG9yPFJlZlB0cjxMYXll
clNraWE+ID4mIHN1YmxheWVycykKK3sKKyAgICBtX3N1YmxheWVycyA9IHN1YmxheWVyczsKK30K
Kwordm9pZCBMYXllclNraWE6OnNldFN1cGVybGF5ZXIoTGF5ZXJTa2lhKiBzdXBlcmxheWVyKQor
eworICAgIG1fc3VwZXJsYXllciA9IHN1cGVybGF5ZXI7Cit9CisKK0xheWVyU2tpYSogTGF5ZXJT
a2lhOjpzdXBlcmxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdXBlcmxheWVyOworfQor
Cit2b2lkIExheWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0IFNrUmVjdCYgZGlydHlSZWN0
KQoreworICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQor
Cit2b2lkIExheWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICAvLyBGSVhNRTogaW1w
bGVtZW50Cit9CisKKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICog
TmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICog
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgTGF5ZXJTa2lhX2gKKyNkZWZp
bmUgTGF5ZXJTa2lhX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworCisj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllclNraWEu
aCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNrQ29sb3IuaCIKKyNp
bmNsdWRlICJTa1BvaW50LmgiCisjaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgorI2luY2x1ZGUgIlRy
YW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUg
PHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRl
IDx3dGYvVmVjdG9yLmg+CisKKworbmFtZXNwYWNlIHNraWEgeworY2xhc3MgUGxhdGZvcm1DYW52
YXM7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJTa2lhIDogcHVibGlj
IFJlZkNvdW50ZWQ8TGF5ZXJTa2lhPiB7CitwdWJsaWM6CisgICAgZW51bSBMYXllclR5cGUgeyBM
YXllciwgVHJhbnNmb3JtTGF5ZXIgfTsKKyAgICBlbnVtIEZpbHRlclR5cGUgeyBMaW5lYXIsIE5l
YXJlc3QsIFRyaWxpbmVhciwgTGFuY3pvcyB9OworICAgIGVudW0gQ29udGVudHNHcmF2aXR5VHlw
ZSB7IENlbnRlciwgVG9wLCBCb3R0b20sIExlZnQsIFJpZ2h0LCBUb3BMZWZ0LCBUb3BSaWdodCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3R0b21MZWZ0LCBCb3R0b21SaWdodCwg
UmVzaXplLCBSZXNpemVBc3BlY3QsIFJlc2l6ZUFzcGVjdEZpbGwgfTsKKworICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPExheWVyU2tpYT4gY3JlYXRlKExheWVyVHlwZSwgR3JhcGhpY3NMYXllclNraWEq
IG93bmVyID0gMCk7CisKKyAgICB+TGF5ZXJTa2lhKCk7CisKKyAgICB2b2lkIGRpc3BsYXkoUGxh
dGZvcm1HcmFwaGljc0NvbnRleHQqKTsKKworICAgIHZvaWQgYWRkU3VibGF5ZXIoUGFzc1JlZlB0
cjxMYXllclNraWE+IHN1YmxheWVyKTsKKyAgICB2b2lkIGluc2VydFN1YmxheWVyKFBhc3NSZWZQ
dHI8TGF5ZXJTa2lhPiwgc2l6ZV90IGluZGV4KTsKKyAgICB2b2lkIHJlbW92ZUZyb21TdXBlcmxh
eWVyKCk7CisKKyAgICB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IFNrUG9pbnQmIGFuY2hvclBv
aW50KSB7IG1fYW5jaG9yUG9pbnQgPSBhbmNob3JQb2ludDsgc2V0TmVlZHNDb21taXQoKTsgfQor
ICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2FuY2hvclBvaW50OyB9
CisKKyAgICB2b2lkIHNldEFuY2hvclBvaW50WihmbG9hdCBhbmNob3JQb2ludFopIHsgbV9hbmNo
b3JQb2ludFogPSBhbmNob3JQb2ludFo7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBmbG9hdCBh
bmNob3JQb2ludFooKSBjb25zdCB7IHJldHVybiBtX2FuY2hvclBvaW50WjsgfQorCisgICAgdm9p
ZCBzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yKSB7IG1fYmFja2dyb3VuZENv
bG9yID0gY29sb3I7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBDb2xvciBiYWNrZ3JvdW5kQ29s
b3IoKSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmRDb2xvcjsgfQorCisgICAgdm9pZCBzZXRC
b3JkZXJDb2xvcihjb25zdCBDb2xvciYgY29sb3IpIHsgbV9ib3JkZXJDb2xvciA9IGNvbG9yOyBz
ZXROZWVkc0NvbW1pdCgpOyB9CisgICAgQ29sb3IgYm9yZGVyQ29sb3IoKSBjb25zdCB7IHJldHVy
biBtX2JvcmRlckNvbG9yOyB9CisKKyAgICB2b2lkIHNldEJvcmRlcldpZHRoKGZsb2F0IHdpZHRo
KSB7IG1fYm9yZGVyV2lkdGggPSB3aWR0aDsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIFNrU2Nh
bGFyIGJvcmRlcldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXJXaWR0aDsgfQorCisgICAg
dm9pZCBzZXRCb3VuZHMoY29uc3QgU2tJUmVjdCYpOworICAgIFNrSVJlY3QgYm91bmRzKCkgY29u
c3QgeyByZXR1cm4gbV9ib3VuZHM7IH0KKworICAgIHZvaWQgc2V0Q2xlYXJzQ29udGV4dChib29s
IGNsZWFycykgeyBtX2NsZWFyc0NvbnRleHQgPSBjbGVhcnM7IHNldE5lZWRzQ29tbWl0KCk7IH0K
KyAgICBib29sIGNsZWFyc0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2NsZWFyc0NvbnRleHQ7
IH0KKworICAgIHZvaWQgc2V0Q29udGVudHNHcmF2aXR5KENvbnRlbnRzR3Jhdml0eVR5cGUgZ3Jh
dml0eVR5cGUpIHsgbV9jb250ZW50c0dyYXZpdHkgPSBncmF2aXR5VHlwZTsgc2V0TmVlZHNDb21t
aXQoKTsgfQorICAgIENvbnRlbnRzR3Jhdml0eVR5cGUgY29udGVudHNHcmF2aXR5KCkgY29uc3Qg
eyByZXR1cm4gbV9jb250ZW50c0dyYXZpdHk7IH0KKworICAgIHZvaWQgc2V0RG91YmxlU2lkZWQo
Ym9vbCBkb3VibGVTaWRlZCkgeyBtX2RvdWJsZVNpZGVkID0gZG91YmxlU2lkZWQ7IHNldE5lZWRz
Q29tbWl0KCk7IH0KKyAgICBib29sIGRvdWJsZVNpZGVkKCkgY29uc3QgeyByZXR1cm4gbV9kb3Vi
bGVTaWRlZDsgfQorCisgICAgdm9pZCBzZXRFZGdlQW50aWFsaWFzaW5nTWFzayh1aW50MzJfdCBt
YXNrKSB7IG1fZWRnZUFudGlhbGlhc2luZ01hc2sgPSBtYXNrOyBzZXROZWVkc0NvbW1pdCgpOyB9
CisgICAgdWludDMyX3QgZWRnZUFudGlhbGlhc2luZ01hc2soKSBjb25zdCB7IHJldHVybiBtX2Vk
Z2VBbnRpYWxpYXNpbmdNYXNrOyB9CisKKyAgICB2b2lkIHNldEZyYW1lKGNvbnN0IFNrUmVjdCYp
OworICAgIFNrUmVjdCBmcmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJhbWU7IH0KKworICAgIHZv
aWQgc2V0SGlkZGVuKGJvb2wgaGlkZGVuKSB7IG1faGlkZGVuID0gaGlkZGVuOyBzZXROZWVkc0Nv
bW1pdCgpOyB9CisgICAgYm9vbCBpc0hpZGRlbigpIGNvbnN0IHsgcmV0dXJuIG1faGlkZGVuOyB9
CisKKyAgICB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCBtYXNrc1RvQm91bmRzKSB7IG1fbWFz
a3NUb0JvdW5kcyA9IG1hc2tzVG9Cb3VuZHM7IH0KKyAgICBib29sIG1hc2tzVG9Cb3VuZHMoKSBj
b25zdCB7IHJldHVybiBtX21hc2tzVG9Cb3VuZHM7IH0KKworICAgIHZvaWQgc2V0TmFtZShjb25z
dCBTdHJpbmcmIG5hbWUpIHsgbV9uYW1lID0gbmFtZTsgfQorICAgIFN0cmluZyBuYW1lKCkgY29u
c3QgeyByZXR1cm4gbV9uYW1lOyB9CisKKyAgICB2b2lkIHNldE5lZWRzRGlzcGxheShjb25zdCBT
a1JlY3QmIGRpcnR5UmVjdCk7CisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKKworICAgIHZv
aWQgc2V0TmVlZHNEaXNwbGF5T25Cb3VuZHNDaGFuZ2UoYm9vbCBuZWVkc0Rpc3BsYXkpIHsgbV9u
ZWVkc0Rpc3BsYXlPbkJvdW5kc0NoYW5nZSA9IG5lZWRzRGlzcGxheTsgfQorCisgICAgdm9pZCBz
ZXRPcGFjaXR5KGZsb2F0IG9wYWNpdHkpIHsgbV9vcGFjaXR5ID0gb3BhY2l0eTsgc2V0TmVlZHND
b21taXQoKTsgfQorICAgIGZsb2F0IG9wYWNpdHkoKSBjb25zdCB7IHJldHVybiBtX29wYWNpdHk7
IH0KKworICAgIHZvaWQgc2V0T3BhcXVlKGJvb2wgb3BhcXVlKSB7IG1fb3BhcXVlID0gb3BhcXVl
OyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgYm9vbCBvcGFxdWUoKSBjb25zdCB7IHJldHVybiBt
X29wYXF1ZTsgfQorCisgICAgdm9pZCBzZXRQb3NpdGlvbihjb25zdCBTa1BvaW50JiBwb3NpdGlv
bikgeyBtX3Bvc2l0aW9uID0gcG9zaXRpb247ICBzZXROZWVkc0NvbW1pdCgpOyB9CisKKyAgICBT
a1BvaW50IHBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGlvbjsgfQorCisgICAgdm9p
ZCBzZXRaUG9zaXRpb24oZmxvYXQgelBvc2l0aW9uKSB7IG1felBvc2l0aW9uID0gelBvc2l0aW9u
OyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgU2tTY2FsYXIgelBvc2l0aW9uKCkgY29uc3QgeyAg
cmV0dXJuIG1felBvc2l0aW9uOyB9CisKKyAgICBjb25zdCBMYXllclNraWEqIHJvb3RMYXllcigp
IGNvbnN0OworCisgICAgdm9pZCByZW1vdmVBbGxTdWJsYXllcnMoKTsKKworICAgIHZvaWQgc2V0
U3VibGF5ZXJzKGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lhPiA+Jik7CisKKyAgICBjb25z
dCBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiYgZ2V0U3VibGF5ZXJzKCkgY29uc3QgeyByZXR1
cm4gbV9zdWJsYXllcnM7IH0KKworICAgIHZvaWQgc2V0U3VibGF5ZXJUcmFuc2Zvcm0oY29uc3Qg
U2tNYXRyaXgmIHRyYW5zZm9ybSkgeyBtX3N1YmxheWVyVHJhbnNmb3JtID0gdHJhbnNmb3JtOyBz
ZXROZWVkc0NvbW1pdCgpOyB9CisgICAgU2tNYXRyaXggc3VibGF5ZXJUcmFuc2Zvcm0oKSBjb25z
dCB7IHJldHVybiBtX3N1YmxheWVyVHJhbnNmb3JtOyB9CisKKyAgICB2b2lkIHNldFN1cGVybGF5
ZXIoTGF5ZXJTa2lhKiBzdXBlcmxheWVyKTsKKyAgICBMYXllclNraWEqIHN1cGVybGF5ZXIoKSBj
b25zdDsKKworCisgICAgdm9pZCBzZXRUcmFuc2Zvcm0oY29uc3QgU2tNYXRyaXgmIHRyYW5zZm9y
bSkgeyBtX3RyYW5zZm9ybSA9IHRyYW5zZm9ybTsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGNv
bnN0IFNrTWF0cml4JiB0cmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX3RyYW5zZm9ybTsgfQor
CisgICAgdm9pZCBzZXRHZW9tZXRyeUZsaXBwZWQoYm9vbCBmbGlwcGVkKSB7IG1fZ2VvbWV0cnlG
bGlwcGVkID0gZmxpcHBlZDsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgZ2VvbWV0cnlG
bGlwcGVkKCkgY29uc3QgeyByZXR1cm4gbV9nZW9tZXRyeUZsaXBwZWQ7IH0KKworICAgIHZvaWQg
dXBkYXRlQ29udGVudHMoKTsKKworICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBwbGF0Zm9ybUNh
bnZhcygpIHsgcmV0dXJuIG1fY2FudmFzLmdldCgpOyB9CisgICAgR3JhcGhpY3NDb250ZXh0KiBn
cmFwaGljc0NvbnRleHQoKSB7IHJldHVybiBtX2dyYXBoaWNzQ29udGV4dC5nZXQoKTsgfQorCisg
ICAgdm9pZCBzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IFNrSVJlY3QmIHJlY3QpOworCitwcml2
YXRlOgorICAgIExheWVyU2tpYShMYXllclR5cGUsIEdyYXBoaWNzTGF5ZXJTa2lhKiBvd25lcik7
CisKKyAgICB2b2lkIHNldE5lZWRzQ29tbWl0KCk7CisKKyAgICB2b2lkIHBhaW50TWUoKTsKKwor
ICAgIHNpemVfdCBudW1TdWJsYXllcnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1f
c3VibGF5ZXJzLnNpemUoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0
aGUgc3VibGF5ZXIgb3IgLTEgaWYgbm90IGZvdW5kLgorICAgIGludCBpbmRleE9mU3VibGF5ZXIo
Y29uc3QgTGF5ZXJTa2lhKik7CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBm
cm9tIHJlbW92ZUZyb21TdXBlcmxheWVyLgorICAgIHZvaWQgcmVtb3ZlU3VibGF5ZXIoTGF5ZXJT
a2lhKik7CisKKyAgICAvLyBSZS1jcmVhdGUgdGhlIGNhbnZhcyBhbmQgZ3JhcGhpY3MgY29udGV4
dC4gVGhpcyBtZXRob2QKKyAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBsYXll
ciBpcyByZXNpemVkLgorICAgIHZvaWQgdXBkYXRlR3JhcGhpY3NDb250ZXh0KGNvbnN0IFNrSVJl
Y3QmIHJlY3QpOworCisgICAgVmVjdG9yPFJlZlB0cjxMYXllclNraWE+ID4gbV9zdWJsYXllcnM7
CisgICAgTGF5ZXJTa2lhKiBtX3N1cGVybGF5ZXI7CisKKyAgICBHcmFwaGljc0xheWVyU2tpYSog
bV9vd25lcjsKKyAgICBPd25QdHI8c2tpYTo6UGxhdGZvcm1DYW52YXM+IG1fY2FudmFzOworICAg
IE93blB0cjxQbGF0Zm9ybUNvbnRleHRTa2lhPiBtX3NraWFDb250ZXh0OworICAgIE93blB0cjxH
cmFwaGljc0NvbnRleHQ+IG1fZ3JhcGhpY3NDb250ZXh0OworCisgICAgTGF5ZXJUeXBlIG1fbGF5
ZXJUeXBlOworCisgICAgU2tJUmVjdCBtX2JvdW5kczsKKyAgICBTa0lSZWN0IG1fYmFja2luZ1N0
b3JlUmVjdDsKKyAgICBTa1BvaW50IG1fcG9zaXRpb247CisgICAgU2tQb2ludCBtX2FuY2hvclBv
aW50OworICAgIENvbG9yIG1fYmFja2dyb3VuZENvbG9yOworICAgIENvbG9yIG1fYm9yZGVyQ29s
b3I7CisKKyAgICBTa1JlY3QgbV9mcmFtZTsKKyAgICBTa01hdHJpeCBtX3RyYW5zZm9ybTsKKyAg
ICBTa01hdHJpeCBtX3N1YmxheWVyVHJhbnNmb3JtOworCisgICAgdWludDMyX3QgbV9lZGdlQW50
aWFsaWFzaW5nTWFzazsKKyAgICBmbG9hdCBtX29wYWNpdHk7CisgICAgZmxvYXQgbV96UG9zaXRp
b247CisgICAgZmxvYXQgbV9hbmNob3JQb2ludFo7CisgICAgZmxvYXQgbV9ib3JkZXJXaWR0aDsK
KworICAgIGJvb2wgbV9jbGVhcnNDb250ZXh0OworICAgIGJvb2wgbV9kb3VibGVTaWRlZDsKKyAg
ICBib29sIG1faGlkZGVuOworICAgIGJvb2wgbV9tYXNrc1RvQm91bmRzOworICAgIGJvb2wgbV9v
cGFxdWU7CisgICAgYm9vbCBtX2dlb21ldHJ5RmxpcHBlZDsKKyAgICBib29sIG1fbmVlZHNEaXNw
bGF5T25Cb3VuZHNDaGFuZ2U7CisKKyAgICBDb250ZW50c0dyYXZpdHlUeXBlIG1fY29udGVudHNH
cmF2aXR5OworICAgIFN0cmluZyBtX25hbWU7Cit9OworCit9CisKKyNlbmRpZiAvLyBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZgpJbmRleDogV2ViS2l0L2Nocm9taXVtL0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lv
biA1NjAyMikKKysrIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAg
LTEsMyArMSw0MSBAQAorMTAtMDMtMTUgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIEFkZGluZyBzdXBwb3J0IGZvciB0aGUgQUNDRUxFUkFURURfQ09NUE9TSVRJTkcgcmVuZGVy
IHBhdGggdG8gQ2hyb21pdW0uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zNTU1NworICAgICAgICBDdXJyZW50bHkgY29tcG9zaXRpbmcgb2YgbGF5ZXJz
IGlzIHBlcmZvcm1lZCB2aWEgcy93IGNvbXBvc2l0b3Igd2hpY2ggcmVsaWVzIG9uIFNraWEuIFRo
aXMgaXMgYW4gaW5pdGlhbCBjaGVjay1pbgorICAgICAgICBhbmQgaXQncyBvbmx5IGJlZW4gdGVz
dGVkIG9uIFdpbmRvd3MuIENvbXBpbGluZyB0aGUgY29kZSByZXF1aXJlcyBzZXRpbmcgInVzZV9h
Y2NlbGVyYXRlZF9jb21wb3NpdGluZz0xIgorICAgICAgICB0byBHWVBfREVGSU5FUy4gVGhlIHVw
ZGF0ZSBvZiBsYXllciBjb250ZW50cyBhbmQgY29tcG9zaXRpbmcgaXMgZmFpcmx5IGluZWZmaWNp
ZW50IGJ1dCB0aGlzIHdpbGwgYmUgZml4ZWQgaW4KKyAgICAgICAgc3Vic2VxdWVudCBjaGVjay1p
bnMuCisKKyAgICAgICAgKiBzcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHA6CisgICAgICAgIChXZWJL
aXQ6OkNocm9tZUNsaWVudEltcGw6OmF0dGFjaFJvb3RHcmFwaGljc0xheWVyKToKKyAgICAgICAg
KFdlYktpdDo6Q2hyb21lQ2xpZW50SW1wbDo6c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyU3luYyk6
CisgICAgICAgICogc3JjL0Nocm9tZUNsaWVudEltcGwuaDoKKyAgICAgICAgKFdlYktpdDo6Q2hy
b21lQ2xpZW50SW1wbDo6c2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbik6Cisg
ICAgICAgICBBZGRlZCBtZXRob2RzIHJlcXVpcmVkIGJ5IHRoZSBSZW5kZXJMYXllckNvbXBvc2l0
b3IKKworICAgICAgICAqIHNyYy9XZWJGcmFtZUltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpX
ZWJGcmFtZUltcGw6OnBhaW50V2l0aENvbnRleHQpOgorICAgICAgICAoV2ViS2l0OjpXZWJGcmFt
ZUltcGw6OnBhaW50KToKKyAgICAgICAgKiBzcmMvV2ViRnJhbWVJbXBsLmg6CisgICAgICAgIFNw
bGl0IFdlYkZyYW1lSW1wbDo6cGFpbnQoKSBpbnRvIHR3byBtZXRob2RzIHRvIG1ha2UgaXQgcG9z
c2libGUgdG8gY2FsbCB0aGUgcGFpbnQKKyAgICAgICAgcm91dGluZSB3aXRoIGFuIGV4aXN0aW5n
IEdyYXBoaWNzQ29udGV4dCwgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciBwYWludGluZyB0aGUgcm9v
dCBsYXllciBpbnRvCisgICAgICAgIGl0cyBvd24gYmFja2luZyBzdXJmYWNlLgorCisgICAgICAg
ICogc3JjL1dlYlZpZXdJbXBsLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6Oldl
YlZpZXdJbXBsKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnBhaW50KToKKyAgICAg
ICAgTW9kaWZpZWQgbWV0aG9kIHRvIGhhbmRsZSB0aGUgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcg
cGF0aC4gTm93LCB3aGVuIGRvaW5nIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nLAorICAgICAgICBw
YWludCgpIHJlc3VsdHMgdG8gcmVwYWludGluZyB0aGUgY29udGVudHMgb2YgdGhlIHJvb3QgbGF5
ZXIgYW5kIHRoZW4gZG9pbmcgYSBjb21wb3NpdGUgb3BlcmF0aW9uLgorICAgICAgICAoV2ViS2l0
OjpXZWJWaWV3SW1wbDo6c2V0Um9vdEdyYXBoaWNzTGF5ZXIpOgorICAgICAgICAoV2ViS2l0OjpX
ZWJWaWV3SW1wbDo6c2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyk6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjp1cGRhdGVSb290TGF5ZXJDb250ZW50cyk6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXdJbXBsOjpzZXRSb290TGF5ZXJOZWVkc0Rpc3BsYXkpOgorICAgICAgICAqIHNyYy9X
ZWJWaWV3SW1wbC5oOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6aXNBY2NlbGVyYXRl
ZENvbXBvc2l0aW5nKToKKwogMjAxMC0wMy0xNSAgTWFyY3VzIEJ1bGFjaCAgPGJ1bGFjaEBjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgSmVyZW15IE9ybG93LgpJbmRleDogV2Vi
S2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwuY3BwCShyZXZpc2lvbiA1NjAyMikKKysr
IFdlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZpY2UuaCIKICNpbmNs
dWRlICJHZW9sb2NhdGlvblNlcnZpY2VCcmlkZ2VDaHJvbWl1bS5oIgogI2luY2x1ZGUgIkdlb2xv
Y2F0aW9uU2VydmljZUNocm9taXVtLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgogI2lu
Y2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAi
Tm9kZS5oIgpAQCAtNjk3LDQgKzY5OCwxNiBAQCB2b2lkIENocm9tZUNsaWVudEltcGw6OnJlcXVl
c3RHZW9sb2NhdGlvCiAgICAgbV93ZWJWaWV3LT5jbGllbnQoKS0+Z2V0R2VvbG9jYXRpb25TZXJ2
aWNlKCktPnJlcXVlc3RQZXJtaXNzaW9uRm9yRnJhbWUoZ2VvbG9jYXRpb25TZXJ2aWNlLT5nZW9s
b2NhdGlvblNlcnZpY2VCcmlkZ2UoKS0+Z2V0QnJpZGdlSWQoKSwgZnJhbWUtPmRvY3VtZW50KCkt
PnVybCgpKTsKIH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK3ZvaWQgQ2hy
b21lQ2xpZW50SW1wbDo6YXR0YWNoUm9vdEdyYXBoaWNzTGF5ZXIoRnJhbWUqIGZyYW1lLCBHcmFw
aGljc0xheWVyKiBncmFwaGljc0xheWVyKQoreworICAgIG1fd2ViVmlldy0+c2V0Um9vdEdyYXBo
aWNzTGF5ZXIoZ3JhcGhpY3NMYXllciA/IGdyYXBoaWNzTGF5ZXItPnBsYXRmb3JtTGF5ZXIoKSA6
IDApOworfQorCit2b2lkIENocm9tZUNsaWVudEltcGw6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXll
clN5bmMoKQoreworICAgIG1fd2ViVmlldy0+c2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCk7Cit9
CisjZW5kaWYKKwogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQvY2hyb21pdW0v
c3JjL0Nocm9tZUNsaWVudEltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3Jj
L0Nocm9tZUNsaWVudEltcGwuaAkocmV2aXNpb24gNTYwMjIpCisrKyBXZWJLaXQvY2hyb21pdW0v
c3JjL0Nocm9tZUNsaWVudEltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMTMzLDYgKzEzMywxOCBA
QCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIG5lZWRUb3VjaEV2ZW50cyhib29sIG5lZWRUb3Vj
aEV2ZW50cykgeyB9CiAjZW5kaWYKIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICAvLyBQYXNzIDAgYXMgdGhlIEdyYXBoaWNzTGF5ZXIgdG8gZGV0YXRjaCB0aGUgcm9vdCBs
YXllci4KKyAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoUm9vdEdyYXBoaWNzTGF5ZXIoV2ViQ29yZTo6
RnJhbWUqLCBXZWJDb3JlOjpHcmFwaGljc0xheWVyKik7CisKKyAgICAvLyBTZXRzIGEgZmxhZyB0
byBzcGVjaWZ5IHRoYXQgdGhlIG5leHQgdGltZSBjb250ZW50IGlzIGRyYXduIHRvIHRoZSB3aW5k
b3csCisgICAgLy8gdGhlIGNoYW5nZXMgYXBwZWFyIG9uIHRoZSBzY3JlZW4gaW4gc3luY2hyb255
IHdpdGggdXBkYXRlcyB0byBHcmFwaGljc0xheWVycy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVl
ZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpIHsgfQorCisgICAgLy8gU2V0cyBhIGZs
YWcgdG8gc3BlY2lmeSB0aGF0IHRoZSB2aWV3IG5lZWRzIHRvIGJlIHVwZGF0ZWQsIHNvIHdlIG5l
ZWQKKyAgICAvLyB0byBkbyBhbiBlYWdlciBsYXlvdXQgYmVmb3JlIHRoZSBkcmF3aW5nLgorICAg
IHZpcnR1YWwgdm9pZCBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKCk7CisjZW5kaWYKICAg
ICAvLyBDaHJvbWVDbGllbnRDaHJvbWl1bSBtZXRob2RzOgogICAgIHZpcnR1YWwgdm9pZCBwb3B1
cE9wZW5lZChXZWJDb3JlOjpQb3B1cENvbnRhaW5lciogcG9wdXBDb250YWluZXIsCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGJvdW5kcywKSW5k
ZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBsLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZyYW1lSW1wbC5jcHAJKHJldmlzaW9uIDU2MDIyKQorKysg
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJGcmFtZUltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
NzQ4LDExICsxNzQ4LDIzIEBAIHZvaWQgV2ViRnJhbWVJbXBsOjpsYXlvdXQoKQogICAgICAgICB2
aWV3LT5sYXlvdXRJZk5lZWRlZFJlY3Vyc2l2ZSgpOwogfQogCit2b2lkIFdlYkZyYW1lSW1wbDo6
cGFpbnRXaXRoQ29udGV4dChHcmFwaGljc0NvbnRleHQmIGdjLCBjb25zdCBXZWJSZWN0JiByZWN0
KQoreworICAgIEludFJlY3QgZGlydHlSZWN0KHJlY3QpOworICAgIGdjLnNhdmUoKTsKKyAgICBp
ZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZVZpZXcoKSkgeworICAgICAgICBnYy5jbGlw
KGRpcnR5UmVjdCk7CisgICAgICAgIGZyYW1lVmlldygpLT5wYWludCgmZ2MsIGRpcnR5UmVjdCk7
CisgICAgICAgIG1fZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5kcmF3Tm9k
ZUhpZ2hsaWdodChnYyk7CisgICAgfSBlbHNlCisgICAgICAgIGdjLmZpbGxSZWN0KGRpcnR5UmVj
dCwgQ29sb3I6OndoaXRlLCBEZXZpY2VDb2xvclNwYWNlKTsKKyAgICBnYy5yZXN0b3JlKCk7Cit9
CisKIHZvaWQgV2ViRnJhbWVJbXBsOjpwYWludChXZWJDYW52YXMqIGNhbnZhcywgY29uc3QgV2Vi
UmVjdCYgcmVjdCkKIHsKICAgICBpZiAocmVjdC5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsK
LSAgICBJbnRSZWN0IGRpcnR5UmVjdChyZWN0KTsKICNpZiBXRUJLSVRfVVNJTkdfQ0cKICAgICBH
cmFwaGljc0NvbnRleHQgZ2MoY2FudmFzKTsKICAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRl
eHQgbG9jYWxDb250ZXh0KCZnYyk7CkBAIC0xNzY0LDE0ICsxNzc2LDcgQEAgdm9pZCBXZWJGcmFt
ZUltcGw6OnBhaW50KFdlYkNhbnZhcyogY2FudgogI2Vsc2UKICAgICBub3RJbXBsZW1lbnRlZCgp
OwogI2VuZGlmCi0gICAgZ2Muc2F2ZSgpOwotICAgIGlmIChtX2ZyYW1lLT5kb2N1bWVudCgpICYm
IGZyYW1lVmlldygpKSB7Ci0gICAgICAgIGdjLmNsaXAoZGlydHlSZWN0KTsKLSAgICAgICAgZnJh
bWVWaWV3KCktPnBhaW50KCZnYywgZGlydHlSZWN0KTsKLSAgICAgICAgbV9mcmFtZS0+cGFnZSgp
LT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmRyYXdOb2RlSGlnaGxpZ2h0KGdjKTsKLSAgICB9IGVs
c2UKLSAgICAgICAgZ2MuZmlsbFJlY3QoZGlydHlSZWN0LCBDb2xvcjo6d2hpdGUsIERldmljZUNv
bG9yU3BhY2UpOwotICAgIGdjLnJlc3RvcmUoKTsKKyAgICBwYWludFdpdGhDb250ZXh0KGdjLCBy
ZWN0KTsKIH0KIAogdm9pZCBXZWJGcmFtZUltcGw6OmNyZWF0ZUZyYW1lVmlldygpCkluZGV4OiBX
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZyYW1lSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9j
aHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBsLmgJKHJldmlzaW9uIDU2MDIyKQorKysgV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJGcmFtZUltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtNDIsNiArNDIsNyBA
QAogI2luY2x1ZGUgIldlYkFuaW1hdGlvbkNvbnRyb2xsZXJJbXBsLmgiCiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKIGNsYXNzIEhpc3RvcnlJdGVtOwogY2xh
c3MgS1VSTDsKIGNsYXNzIE5vZGU7CkBAIC0xODEsNiArMTgyLDcgQEAgcHVibGljOgogCiAgICAg
dm9pZCBsYXlvdXQoKTsKICAgICB2b2lkIHBhaW50KFdlYkNhbnZhcyosIGNvbnN0IFdlYlJlY3Qm
KTsKKyAgICB2b2lkIHBhaW50V2l0aENvbnRleHQoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Jiwg
Y29uc3QgV2ViUmVjdCYpOwogICAgIHZvaWQgY3JlYXRlRnJhbWVWaWV3KCk7CiAKICAgICBzdGF0
aWMgV2ViRnJhbWVJbXBsKiBmcm9tRnJhbWUoV2ViQ29yZTo6RnJhbWUqIGZyYW1lKTsKSW5kZXg6
IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCShyZXZpc2lvbiA1NjAyMikKKysrIFdlYktp
dC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNDYsNiAr
MjQ2LDEwIEBAIFdlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbChXZWJWaWV3Q2xpZW50KiAKICAgICAs
IG1faXNUcmFuc3BhcmVudChmYWxzZSkKICAgICAsIG1fdGFic1RvTGlua3MoZmFsc2UpCiAgICAg
LCBtX2hhdmVNb3VzZUNhcHR1cmUoZmFsc2UpCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorICAgICwgbV9sYXllclJlbmRlcmVyKDApCisgICAgLCBtX2lzQWNjZWxlcmF0ZWRDb21w
b3NpdGluZyhmYWxzZSkKKyNlbmRpZgogewogICAgIC8vIFdlYktpdC93aW4vV2ViVmlldy5jcHAg
ZG9lcyB0aGUgc2FtZSB0aGluZywgZXhjZXB0IHRoZXkgY2FsbCB0aGUKICAgICAvLyBLSlMgc3Bl
Y2lmaWMgd3JhcHBlciBhcm91bmQgdGhpcyBtZXRob2QuIFdlIG5lZWQgdG8gaGF2ZSB0aHJlYWRp
bmcKQEAgLTg5Miw5ICs4OTYsMzAgQEAgdm9pZCBXZWJWaWV3SW1wbDo6bGF5b3V0KCkKIAogdm9p
ZCBXZWJWaWV3SW1wbDo6cGFpbnQoV2ViQ2FudmFzKiBjYW52YXMsIGNvbnN0IFdlYlJlY3QmIHJl
Y3QpCiB7Ci0gICAgV2ViRnJhbWVJbXBsKiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKTsKLSAg
ICBpZiAod2ViZnJhbWUpCi0gICAgICAgIHdlYmZyYW1lLT5wYWludChjYW52YXMsIHJlY3QpOwor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmICghaXNBY2NlbGVyYXRl
ZENvbXBvc2l0aW5nKCkpIHsKKyNlbmRpZgorICAgICAgICBXZWJGcmFtZUltcGwqIHdlYmZyYW1l
ID0gbWFpbkZyYW1lSW1wbCgpOworICAgICAgICBpZiAod2ViZnJhbWUpCisgICAgICAgICAgICB3
ZWJmcmFtZS0+cGFpbnQoY2FudmFzLCByZWN0KTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRHJhdyB0aGUgY29udGVudHMgb2YgdGhl
IHJvb3QgbGF5ZXIKKyAgICAgICAgdXBkYXRlUm9vdExheWVyQ29udGVudHMocmVjdCk7CisKKyAg
ICAgICAgLy8gRklYTUU6IExheWVycyBzaG91bGQgbm90IGJlIGZvcmNlZCB0byByZWRyYXcgdGhl
aXIgY29udGVudHMKKyAgICAgICAgLy8gaGVyZSBidXQgc2hvdWxkIHVwZGF0ZSBhcyBuZWVkZWQu
CisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+dXBkYXRlTGF5ZXJDb250ZW50cygpOworCisgICAg
ICAgIC8vIENvbXBvc2l0ZSBldmVyeXRoaW5nIGludG8gdGhlIGNhbnZhcyB0aGF0J3MgcGFzc2Vk
IHRvIHVzLgorICAgICAgICBTa0lSZWN0IGNhbnZhc0lSZWN0OworICAgICAgICBjYW52YXNJUmVj
dC5zZXQocmVjdC54LCByZWN0LnksIHJlY3QueCArIHJlY3Qud2lkdGgsIHJlY3QueSArIHJlY3Qu
aGVpZ2h0KTsKKyAgICAgICAgU2tSZWN0IGNhbnZhc1JlY3Q7CisgICAgICAgIGNhbnZhc1JlY3Qu
c2V0KGNhbnZhc0lSZWN0KTsKKyAgICAgICAgbV9sYXllclJlbmRlcmVyLT5kcmF3TGF5ZXJzSW5D
YW52YXMoc3RhdGljX2Nhc3Q8c2tpYTo6UGxhdGZvcm1DYW52YXMqPihjYW52YXMpLCBjYW52YXNS
ZWN0KTsKKyAgICB9CisjZW5kaWYKIH0KIAogLy8gRklYTUU6IG1fY3VycmVudElucHV0RXZlbnQg
c2hvdWxkIGJlIHJlbW92ZWQgb25jZSBDaHJvbWVDbGllbnQ6OnNob3coKSBjYW4KQEAgLTE5Nzcs
NCArMjAwMiw3OCBAQCBib29sIFdlYlZpZXdJbXBsOjp0YWJzVG9MaW5rcygpIGNvbnN0CiAgICAg
cmV0dXJuIG1fdGFic1RvTGlua3M7CiB9CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCit2b2lkIFdlYlZpZXdJbXBsOjpzZXRSb290R3JhcGhpY3NMYXllcihXZWJDb3JlOjpQbGF0
Zm9ybUxheWVyKiBsYXllcikKK3sKKyAgICBzZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nKGxheWVy
ID8gdHJ1ZSA6IGZhbHNlKTsKKyAgICBpZiAobV9sYXllclJlbmRlcmVyKQorICAgICAgICBtX2xh
eWVyUmVuZGVyZXItPnNldFJvb3RMYXllcihsYXllcik7Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6
OnNldEFjY2VsZXJhdGVkQ29tcG9zaXRpbmcoYm9vbCBhY2NlbGVyYXRlZCkKK3sKKyAgICBpZiAo
bV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcgPT0gYWNjZWxlcmF0ZWQpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmIChhY2NlbGVyYXRlZCkgeworICAgICAgICBtX2xheWVyUmVuZGVyZXIgPSBM
YXllclJlbmRlcmVyU2tpYTo6Y3JlYXRlKCk7CisgICAgICAgIGlmIChtX2xheWVyUmVuZGVyZXIp
CisgICAgICAgICAgICBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyA9IHRydWU7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgbV9sYXllclJlbmRlcmVyID0gMDsKKyAgICAgICAgbV9pc0FjY2VsZXJh
dGVkQ29tcG9zaXRpbmcgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OnVw
ZGF0ZVJvb3RMYXllckNvbnRlbnRzKGNvbnN0IFdlYlJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFp
c0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViRnJh
bWVJbXBsKiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKTsKKyAgICBpZiAoIXdlYmZyYW1lKQor
ICAgICAgICByZXR1cm47CisgICAgRnJhbWVWaWV3KiB2aWV3ID0gd2ViZnJhbWUtPmZyYW1lVmll
dygpOworICAgIGlmICghdmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViUmVjdCB2aWV3
UmVjdCA9IHZpZXctPmZyYW1lUmVjdCgpOworICAgIFNrSVJlY3Qgc2Nyb2xsRnJhbWU7CisgICAg
c2Nyb2xsRnJhbWUuc2V0KHZpZXctPnNjcm9sbFgoKSwgdmlldy0+c2Nyb2xsWSgpLCB2aWV3LT5s
YXlvdXRXaWR0aCgpICsgdmlldy0+c2Nyb2xsWCgpLCB2aWV3LT5sYXlvdXRIZWlnaHQoKSArIHZp
ZXctPnNjcm9sbFkoKSk7CisgICAgbV9sYXllclJlbmRlcmVyLT5zZXRTY3JvbGxGcmFtZShzY3Jv
bGxGcmFtZSk7CisgICAgTGF5ZXJTa2lhKiByb290TGF5ZXIgPSBtX2xheWVyUmVuZGVyZXItPnJv
b3RMYXllcigpOworICAgIGlmIChyb290TGF5ZXIpIHsKKyAgICAgICAgU2tJUmVjdCByb290TGF5
ZXJCb3VuZHM7CisgICAgICAgIEludFJlY3QgdmlzaWJsZVJlY3QgPSB2aWV3LT52aXNpYmxlQ29u
dGVudFJlY3QodHJ1ZSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBiYWNraW5nIHN0b3JlIHNpemUg
dXNlZCBieSB0aGUgcm9vdCBsYXllciB0byBiZSB0aGUgc2l6ZSBvZiB0aGUgdmlzaWJsZQorICAg
ICAgICAvLyBhcmVhLiBOb3RlIHRoYXQgdGhlIHJvb3QgbGF5ZXIgYm91bmRzIGNvdWxkIGJlIGxh
cmdlciB0aGFuIHRoZSBiYWNraW5nIHN0b3JlIHNpemUKKyAgICAgICAgLy8gYnV0IHRoZXJlJ3Mg
bm8gcmVhc29uIHRvIHdhc3RlIG1lbW9yeSBieSBhbGxvY2F0aW5nIGJhY2tpbmcgc3RvcmUgbGFy
Z2VyIHRoYW4gdGhlCisgICAgICAgIC8vIHZpc2libGUgcG9ydGlvbi4KKyAgICAgICAgcm9vdExh
eWVyQm91bmRzLnNldCgwLCAwLCB2aXNpYmxlUmVjdC53aWR0aCgpLCB2aXNpYmxlUmVjdC5oZWln
aHQoKSk7CisgICAgICAgIHJvb3RMYXllci0+c2V0QmFja2luZ1N0b3JlUmVjdChyb290TGF5ZXJC
b3VuZHMpOworICAgICAgICBHcmFwaGljc0NvbnRleHQqIHJvb3RMYXllckNvbnRleHQgPSByb290
TGF5ZXItPmdyYXBoaWNzQ29udGV4dCgpOworICAgICAgICByb290TGF5ZXJDb250ZXh0LT5zYXZl
KCk7CisKKyAgICAgICAgd2ViZnJhbWUtPnBhaW50V2l0aENvbnRleHQoKihyb290TGF5ZXItPmdy
YXBoaWNzQ29udGV4dCgpKSwgcmVjdCk7CisgICAgICAgIHJvb3RMYXllckNvbnRleHQtPnJlc3Rv
cmUoKTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViVmlld0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlz
cGxheSgpCit7CisgICAgLy8gRklYTUU6IEZvciBub3cgd2UncmUgcG9zdGluZyBhIHJlcGFpbnQg
ZXZlbnQgZm9yIHRoZSBlbnRpcmUgcGFnZSB3aGljaCBpcyBhbiBvdmVya2lsbC4KKyAgICBpZiAo
V2ViRnJhbWVJbXBsKiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKSkgeworICAgICAgICBpZiAo
RnJhbWVWaWV3KiB2aWV3ID0gd2ViZnJhbWUtPmZyYW1lVmlldygpKSB7CisgICAgICAgICAgICBJ
bnRSZWN0IHZpc2libGVSZWN0ID0gdmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KHRydWUpOworICAg
ICAgICAgICAgbV9jbGllbnQtPmRpZEludmFsaWRhdGVSZWN0KHZpc2libGVSZWN0KTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIGlmIChtX2xheWVyUmVuZGVyZXIpCisgICAgICAgIG1fbGF5ZXJS
ZW5kZXJlci0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9CisKKyNlbmRpZgorCiB9IC8vIG5hbWVzcGFj
ZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmgJKHJldmlzaW9uIDU2MDIy
KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBA
IC00Myw5ICs0MywxNiBAQAogI2luY2x1ZGUgIkNvbnRleHRNZW51Q2xpZW50SW1wbC5oIgogI2lu
Y2x1ZGUgIkRyYWdDbGllbnRJbXBsLmgiCiAjaW5jbHVkZSAiRWRpdG9yQ2xpZW50SW1wbC5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXIuaCIKICNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRJbXBs
LmgiCiAjaW5jbHVkZSAiTm90aWZpY2F0aW9uUHJlc2VudGVySW1wbC5oIgogCisjaWYgVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2lmIFdFQktJVF9VU0lOR19TS0lBCisjaW5jbHVkZSAi
TGF5ZXJSZW5kZXJlclNraWEuaCIKKyNlbmRpZgorI2VuZGlmCisKICNpbmNsdWRlIDx3dGYvT3du
UHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KIApAQCAtMjk4LDYgKzMwNSwxMSBA
QCBwdWJsaWM6CiAgICAgICAgIHJldHVybiBtX2N1cnJlbnRJbnB1dEV2ZW50OwogICAgIH0KIAor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB2b2lkIHNldFJvb3RMYXllck5l
ZWRzRGlzcGxheSgpOworICAgIHZvaWQgc2V0Um9vdEdyYXBoaWNzTGF5ZXIoV2ViQ29yZTo6UGxh
dGZvcm1MYXllciopOworI2VuZGlmCisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIFdlYlZp
ZXc7ICAvLyBTbyBXZWJWaWV3OjpDcmVhdGUgY2FuIGNhbGwgb3VyIGNvbnN0cnVjdG9yCiAgICAg
ZnJpZW5kIGNsYXNzIFdURjo6UmVmQ291bnRlZDxXZWJWaWV3SW1wbD47CkBAIC0zMjMsNiArMzM1
LDEyIEBAIHByaXZhdGU6CiAgICAgLy8gdGhlIEhpdFRlc3RSZXN1bHQgZm9yIGl0LgogICAgIFdl
YkNvcmU6OkhpdFRlc3RSZXN1bHQgaGl0VGVzdFJlc3VsdEZvcldpbmRvd1Bvcyhjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYpOwogCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IHZvaWQgc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhib29sKTsKKyAgICBib29sIGlzQWNjZWxl
cmF0ZWRDb21wb3NpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0
aW5nOyB9CisgICAgdm9pZCB1cGRhdGVSb290TGF5ZXJDb250ZW50cyhjb25zdCBXZWJSZWN0Jik7
CisjZW5kaWYKKwogICAgIFdlYlZpZXdDbGllbnQqIG1fY2xpZW50OwogCiAgICAgQmFja0Zvcndh
cmRMaXN0Q2xpZW50SW1wbCBtX2JhY2tGb3J3YXJkTGlzdENsaWVudEltcGw7CkBAIC00NTAsNiAr
NDY4LDEwIEBAIHByaXZhdGU6CiAKICAgICBib29sIG1faGF2ZU1vdXNlQ2FwdHVyZTsKIAorI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBPd25QdHI8V2ViQ29yZTo6TGF5ZXJS
ZW5kZXJlclNraWE+IG1fbGF5ZXJSZW5kZXJlcjsKKyAgICBib29sIG1faXNBY2NlbGVyYXRlZENv
bXBvc2l0aW5nOworI2VuZGlmCiAgICAgc3RhdGljIGNvbnN0IFdlYklucHV0RXZlbnQqIG1fY3Vy
cmVudElucHV0RXZlbnQ7CiB9OwogCg==
</data>
<flag name="review"
          id="33983"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50866</attachid>
            <date>2010-03-16 18:55:02 -0700</date>
            <delta_ts>2010-03-18 12:57:55 -0700</delta_ts>
            <desc>Patch addressing more recent review comments</desc>
            <filename>skiaCompositor_5.txt</filename>
            <type>text/plain</type>
            <size>62195</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NjAyMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMTAtMDMtMTUgIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudCBzb2Z0d2FyZSBjb21wb3NpdGVkIGdyYXBoaWNzIGxheWVycyBpbiBD
aHJvbWl1bSB1c2luZyB0aGUgU2tpYSBsaWJyYXJ5LgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAgICAgVGhpcyBpcyBhbiBpbml0aWFs
IHN0ZXAgaW4gdGhlIGltcGxlbWVudGF0aW9uLiBMYXllciBjb21wb3NpdGluZyBpcyBmdW5jdGlv
bmluZworICAgICAgICBidXQgbm90IG9wdGltaXplZCBpbiBhbnkgd2F5LiBTdWJzZXNxdWVudCBj
aGVjay1pbnMgd2lsbCBiZSBuZWNlc3NhcnkgdG8gZmluZSB0dW5lCisgICAgICAgIGl0LgorCisg
ICAgICAgIFRlc3Q6IE5vIG5ldyBleHBvc2VkIGZ1bmN0aW9uYWxpdHkgc28gbm8gbmV3IHRlc3Rz
LgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAgIEFkZGVkIG5ldyBzb3VyY2Ug
ZmlsZXMgdG8gdGhlIGNocm9taXVtIGJ1aWxkCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
R3JhcGhpY3NMYXllci5oOgorICAgICAgICAgIEFkZGVkIG5lY2Vzc2FyeSB0eXBlZGVmJ3MgYW5k
IGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBDaHJvbWl1bS4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5oOiBBZGRlZC4KKyAgICAgICAg
ICBEZWNsYXJhdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmlj
IEdyYXBoaWNzTGF5ZXIgY2xhc3MuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9M
YXllclJlbmRlcmVyU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3NraWEvTGF5ZXJSZW5kZXJlclNraWEuaDogQWRkZWQuCisgICAgICAgICAgRGVjbGFyYXRpb24g
YW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTa2lhLWJhc2VkIHNvZnR3YXJlIGNvbXBvc2l0b3Iu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5oOiBBZGRlZC4KKyAg
ICAgICAgICBEZWNsYXJhdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgYSBjb21wb3NpdGFibGUg
bGF5ZXIgdGhhdCB1c2VzIGEgU2tpYSBjYW52YXMKKyAgICAgICAgICBmb3IgYmFja2luZyBzdG9y
ZS4KKwogMjAxMC0wMy0xNSAgQ2hyaXMgRmxlaXphY2ggIDxjZmxlaXphY2hAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IEJldGggRGFraW4uCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUu
Z3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNTYwMjIp
CisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtMjE3NCwxMCArMjE3
NCwxNiBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvR3JhcGhpY3NDb250ZXh0U2tpYS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL3NraWEvR3JhcGhpY3NDb250ZXh0M0RTa2lhLmNwcCcsCisgICAgICAgICAgICAncGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5jcHAnLAorICAgICAgICAgICAgJ3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuaCcsCiAgICAgICAgICAgICAn
cGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5jcHAnLAogICAgICAgICAgICAgJ3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvSW50UG9pbnRTa2lhLmNwcCcsCiAgICAgICAgICAgICAncGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbnRSZWN0U2tpYS5jcHAnLAorICAgICAgICAgICAgJ3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJlclNraWEuY3BwJywKKyAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmgnLAorICAgICAgICAgICAg
J3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmNwcCcsCisgICAgICAgICAgICAncGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0v
Z3JhcGhpY3Mvc2tpYS9OYXRpdmVJbWFnZVNraWEuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9y
bS9ncmFwaGljcy9za2lhL05hdGl2ZUltYWdlU2tpYS5oJywKICAgICAgICAgICAgICdwbGF0Zm9y
bS9ncmFwaGljcy9za2lhL1BhdGhTa2lhLmNwcCcsCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkocmV2aXNpb24gNTYwMjIpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNjMsNiArNjMs
MTIgQEAgdHlwZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKIGNsYXNzIFFHcmFwaGljc0l0ZW07CiB0
eXBlZGVmIFFHcmFwaGljc0l0ZW0gUGxhdGZvcm1MYXllcjsKIHR5cGVkZWYgUUdyYXBoaWNzSXRl
bSogTmF0aXZlTGF5ZXI7CisjZWxpZiBQTEFURk9STShDSFJPTUlVTSkKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK2NsYXNzIExheWVyU2tpYTsKK3R5cGVkZWYgTGF5ZXJTa2lhIFBsYXRmb3JtTGF5ZXI7
Cit0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOworfQogI2Vsc2UKIHR5cGVkZWYgdm9pZCogUGxh
dGZvcm1MYXllcjsKIHR5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7CkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5jcHAJKHJl
dmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXll
clNraWEuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgor
ICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9m
IGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKy8qKiBGSVhNRQorICogVGhp
cyBmaWxlIGJvcnJvd3MgY29kZSBoZWF2aWx5IGZyb20gcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dy
YXBoaWNzTGF5ZXJDQUNGLmNwcAorICogKGFuZCBoZW5jZSBpdCBpbmNsdWRlcyBib3RoIGNvcHly
aWdodHMpCisgKiBJZGVhbGx5IHRoZSBjb21tb24gY29kZSAobW9zdGx5IHRoZSBjb2RlIHRoYXQg
a2VlcHMgdHJhY2sgb2YgdGhlIGxheWVyIGhpZXJhcmNoeSkKKyAqIHNob3VsZCBiZSBrZXB0IHNl
cGFyYXRlIGFuZCBzaGFyZWQgYmV0d2VlbiBwbGF0Zm9ybXMuIEl0IHdvdWxkIGJlIGEgd2VsbCB3
b3J0aHdoaWxlCisgKiBlZmZvcnQgb25jZSB0aGUgV2luZG93cyBpbXBsZW1lbnRhdGlvbiAoYmlu
YXJpZXMgYW5kIGhlYWRlcnMpIG9mIENvcmVBbmltYXRpb24gaXMKKyAqIGNoZWNrZWQgaW4gdG8g
dGhlIFdlYktpdCByZXBvc2l0b3J5LiBVbnRpbCB0aGVuIG9ubHkgQXBwbGUgY2FuIG1ha2UgdGhp
cyBoYXBwZW4uCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllclNraWEuaCIKKworI2lu
Y2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJGbG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRl
ICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkxheWVyU2tpYS5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU3lzdGVtVGltZS5oIgor
I2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgorI2luY2x1ZGUgPHd0Zi9TdHJpbmdFeHRyYXMu
aD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0
aWMgdm9pZCBzZXRMYXllckJvcmRlckNvbG9yKExheWVyU2tpYSYgbGF5ZXIsIGNvbnN0IENvbG9y
JiBjb2xvcikKK3sKKyAgICBsYXllci5zZXRCb3JkZXJDb2xvcihjb2xvcik7Cit9CisKK3N0YXRp
YyB2b2lkIGNsZWFyQm9yZGVyQ29sb3IoTGF5ZXJTa2lhJiBsYXllcikKK3sKKyAgICBsYXllci5z
ZXRCb3JkZXJDb2xvcigwKTsKK30KKworc3RhdGljIHZvaWQgc2V0TGF5ZXJCYWNrZ3JvdW5kQ29s
b3IoTGF5ZXJTa2lhJiBsYXllciwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGxheWVyLnNl
dEJhY2tncm91bmRDb2xvcihjb2xvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyTGF5ZXJCYWNr
Z3JvdW5kQ29sb3IoTGF5ZXJTa2lhJiBsYXllcikKK3sKKyAgICBsYXllci5zZXRCYWNrZ3JvdW5k
Q29sb3IoMCk7Cit9CisKK0dyYXBoaWNzTGF5ZXI6OkNvbXBvc2l0aW5nQ29vcmRpbmF0ZXNPcmll
bnRhdGlvbiBHcmFwaGljc0xheWVyOjpjb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRpb24o
KQoreworICAgIHJldHVybiBDb21wb3NpdGluZ0Nvb3JkaW5hdGVzQm90dG9tVXA7Cit9CisKK1Bh
c3NPd25QdHI8R3JhcGhpY3NMYXllcj4gR3JhcGhpY3NMYXllcjo6Y3JlYXRlKEdyYXBoaWNzTGF5
ZXJDbGllbnQqIGNsaWVudCkKK3sKKyAgICByZXR1cm4gbmV3IEdyYXBoaWNzTGF5ZXJTa2lhKGNs
aWVudCk7Cit9CisKK0dyYXBoaWNzTGF5ZXJTa2lhOjpHcmFwaGljc0xheWVyU2tpYShHcmFwaGlj
c0xheWVyQ2xpZW50KiBjbGllbnQpCisgICAgOiBHcmFwaGljc0xheWVyKGNsaWVudCkKKyAgICAs
IG1fY29udGVudHNMYXllclB1cnBvc2UoTm9Db250ZW50c0xheWVyKQorICAgICwgbV9jb250ZW50
c0xheWVySGFzQmFja2dyb3VuZENvbG9yKGZhbHNlKQoreworICAgIG1fbGF5ZXIgPSBMYXllclNr
aWE6OmNyZWF0ZShMYXllclNraWE6OkxheWVyLCB0aGlzKTsKKworICAgIHVwZGF0ZURlYnVnSW5k
aWNhdG9ycygpOworfQorCitHcmFwaGljc0xheWVyU2tpYTo6fkdyYXBoaWNzTGF5ZXJTa2lhKCkK
K3sKKyAgICAvLyBDbGVhbiB1cCB0aGUgU2tpYSBsYXllci4KKyAgICBpZiAobV9sYXllcikKKyAg
ICAgICAgbV9sYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKworICAgIGlmIChtX3RyYW5z
Zm9ybUxheWVyKQorICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXll
cigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXROYW1lKGNvbnN0IFN0cmluZyYg
aW5OYW1lKQoreworICAgIFN0cmluZyBuYW1lID0gU3RyaW5nOjpmb3JtYXQoIkdyYXBoaWNzTGF5
ZXJTa2lhKCVwKSBHcmFwaGljc0xheWVyKCVwKSAiLCBtX2xheWVyLmdldCgpLCB0aGlzKSArIGlu
TmFtZTsKKyAgICBHcmFwaGljc0xheWVyOjpzZXROYW1lKG5hbWUpOworfQorCitOYXRpdmVMYXll
ciBHcmFwaGljc0xheWVyU2tpYTo6bmF0aXZlTGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBt
X2xheWVyLmdldCgpOworfQorCitib29sIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRDaGlsZHJlbihj
b25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+JiBjaGlsZHJlbikKK3sKKyAgICBib29sIGNoaWxk
cmVuQ2hhbmdlZCA9IEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuKGNoaWxkcmVuKTsKKyAgICAv
LyBGSVhNRTogR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW4gY2FsbHMgYWRkQ2hpbGQoKSBmb3Ig
ZWFjaCBzdWJsYXllciwgd2hpY2gKKyAgICAvLyB3aWxsIGVuZCB1cCBjYWxsaW5nIHVwZGF0ZVN1
YmxheWVyTGlzdCgpIE4gdGltZXMuCisgICAgaWYgKGNoaWxkcmVuQ2hhbmdlZCkKKyAgICAgICAg
dXBkYXRlU3VibGF5ZXJMaXN0KCk7CisKKyAgICByZXR1cm4gY2hpbGRyZW5DaGFuZ2VkOworfQor
Cit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjphZGRDaGlsZChHcmFwaGljc0xheWVyKiBjaGlsZExh
eWVyKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkKGNoaWxkTGF5ZXIpOworICAgIHVw
ZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjphZGRDaGls
ZEF0SW5kZXgoR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgaW50IGluZGV4KQoreworICAgIEdy
YXBoaWNzTGF5ZXI6OmFkZENoaWxkQXRJbmRleChjaGlsZExheWVyLCBpbmRleCk7CisgICAgdXBk
YXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OmFkZENoaWxk
QmVsb3coR3JhcGhpY3NMYXllciogY2hpbGRMYXllciwgR3JhcGhpY3NMYXllciogc2libGluZykK
K3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZEJlbG93KGNoaWxkTGF5ZXIsIHNpYmxpbmcp
OworICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lh
OjphZGRDaGlsZEFib3ZlKEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIg
KnNpYmxpbmcpCit7CisgICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRBYm92ZShjaGlsZExheWVy
LCBzaWJsaW5nKTsKKyAgICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKworYm9vbCBHcmFwaGlj
c0xheWVyU2tpYTo6cmVwbGFjZUNoaWxkKEdyYXBoaWNzTGF5ZXIqIG9sZENoaWxkLCBHcmFwaGlj
c0xheWVyKiBuZXdDaGlsZCkKK3sKKyAgICBpZiAoR3JhcGhpY3NMYXllcjo6cmVwbGFjZUNoaWxk
KG9sZENoaWxkLCBuZXdDaGlsZCkpIHsKKyAgICAgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllclNraWE6OnJlbW92ZUZyb21QYXJlbnQoKQoreworICAgIEdyYXBoaWNzTGF5
ZXI6OnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICBsYXllckZvclN1cGVybGF5ZXIoKS0+cmVtb3Zl
RnJvbVN1cGVybGF5ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0UG9zaXRp
b24oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgR3JhcGhpY3NMYXllcjo6c2V0UG9z
aXRpb24ocG9pbnQpOworICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyU2tpYTo6c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiBwb2ludCkK
K3sKKyAgICBpZiAocG9pbnQgPT0gbV9hbmNob3JQb2ludCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgR3JhcGhpY3NMYXllcjo6c2V0QW5jaG9yUG9pbnQocG9pbnQpOworICAgIHVwZGF0ZUFuY2hv
clBvaW50KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFNpemUoY29uc3QgRmxv
YXRTaXplJiBzaXplKQoreworICAgIGlmIChzaXplID09IG1fc2l6ZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0U2l6ZShzaXplKTsKKyAgICB1cGRhdGVMYXllclNp
emUoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0VHJhbnNmb3JtKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKHRyYW5zZm9ybSA9PSBt
X3RyYW5zZm9ybSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0VHJh
bnNmb3JtKHRyYW5zZm9ybSk7CisgICAgdXBkYXRlVHJhbnNmb3JtKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllclNraWE6OnNldENoaWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9u
TWF0cml4JiB0cmFuc2Zvcm0pCit7CisgICAgaWYgKHRyYW5zZm9ybSA9PSBtX2NoaWxkcmVuVHJh
bnNmb3JtKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRDaGlsZHJl
blRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIHVwZGF0ZUNoaWxkcmVuVHJhbnNmb3JtKCk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFByZXNlcnZlczNEKGJvb2wgcHJlc2VydmVz
M0QpCit7CisgICAgaWYgKHByZXNlcnZlczNEID09IG1fcHJlc2VydmVzM0QpCisgICAgICAgIHJl
dHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFByZXNlcnZlczNEKHByZXNlcnZlczNEKTsK
KyAgICB1cGRhdGVMYXllclByZXNlcnZlczNEKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNr
aWE6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCBtYXNrc1RvQm91bmRzKQoreworICAgIGlmIChtYXNr
c1RvQm91bmRzID09IG1fbWFza3NUb0JvdW5kcykKKyAgICAgICAgcmV0dXJuOworCisgICAgR3Jh
cGhpY3NMYXllcjo6c2V0TWFza3NUb0JvdW5kcyhtYXNrc1RvQm91bmRzKTsKKyAgICB1cGRhdGVN
YXNrc1RvQm91bmRzKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldERyYXdzQ29u
dGVudChib29sIGRyYXdzQ29udGVudCkKK3sKKyAgICBpZiAoZHJhd3NDb250ZW50ID09IG1fZHJh
d3NDb250ZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXREcmF3
c0NvbnRlbnQoZHJhd3NDb250ZW50KTsKKyAgICB1cGRhdGVMYXllckRyYXdzQ29udGVudCgpOwor
fQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29s
b3ImIGNvbG9yKQoreworICAgIGlmIChtX2JhY2tncm91bmRDb2xvclNldCAmJiBtX2JhY2tncm91
bmRDb2xvciA9PSBjb2xvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6
c2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKKworICAgIG1fY29udGVudHNMYXllckhhc0JhY2tn
cm91bmRDb2xvciA9IHRydWU7CisgICAgdXBkYXRlTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKTsKK30K
Kwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6Y2xlYXJCYWNrZ3JvdW5kQ29sb3IoKQoreworICAg
IGlmICghbV9iYWNrZ3JvdW5kQ29sb3JTZXQpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBo
aWNzTGF5ZXI6OmNsZWFyQmFja2dyb3VuZENvbG9yKCk7CisgICAgY2xlYXJMYXllckJhY2tncm91
bmRDb2xvcigqbV9jb250ZW50c0xheWVyKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6
c2V0Q29udGVudHNPcGFxdWUoYm9vbCBvcGFxdWUpCit7CisgICAgaWYgKG1fY29udGVudHNPcGFx
dWUgPT0gb3BhcXVlKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRD
b250ZW50c09wYXF1ZShvcGFxdWUpOworICAgIHVwZGF0ZUNvbnRlbnRzT3BhcXVlKCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldEJhY2tmYWNlVmlzaWJpbGl0eShib29sIHZpc2li
bGUpCit7CisgICAgaWYgKG1fYmFja2ZhY2VWaXNpYmlsaXR5ID09IHZpc2libGUpCisgICAgICAg
IHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJhY2tmYWNlVmlzaWJpbGl0eSh2aXNp
YmxlKTsKKyAgICB1cGRhdGVCYWNrZmFjZVZpc2liaWxpdHkoKTsKK30KKwordm9pZCBHcmFwaGlj
c0xheWVyU2tpYTo6c2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5KQoreworICAgIGZsb2F0IGNsYW1w
ZWRPcGFjaXR5ID0gbWF4KG1pbihvcGFjaXR5LCAxLjBmKSwgMC4wZik7CisKKyAgICBpZiAobV9v
cGFjaXR5ID09IGNsYW1wZWRPcGFjaXR5KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGlj
c0xheWVyOjpzZXRPcGFjaXR5KGNsYW1wZWRPcGFjaXR5KTsKKyAgICBwcmltYXJ5TGF5ZXIoKS0+
c2V0T3BhY2l0eShvcGFjaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0TmVl
ZHNEaXNwbGF5KCkKK3sKKyAgICBpZiAoZHJhd3NDb250ZW50KCkpCisgICAgICAgIG1fbGF5ZXIt
PnNldE5lZWRzRGlzcGxheSgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXROZWVk
c0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGlmIChkcmF3c0Nv
bnRlbnQoKSkKKyAgICAgICAgbV9sYXllci0+c2V0TmVlZHNEaXNwbGF5KHJlY3QpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRDb250ZW50c1JlY3QoY29uc3QgSW50UmVjdCYgcmVj
dCkKK3sKKyAgICBpZiAocmVjdCA9PSBtX2NvbnRlbnRzUmVjdCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVudHNSZWN0KHJlY3QpOworICAgIHVwZGF0ZUNv
bnRlbnRzUmVjdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRDb250ZW50c1Rv
SW1hZ2UoSW1hZ2UqIGltYWdlKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqIHZp
ZGVvTGF5ZXIpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudAorfQorCit2b2lkIEdyYXBoaWNz
TGF5ZXJTa2lhOjpzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0ZXNP
cmllbnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICBpZiAob3JpZW50YXRpb24gPT0gbV9nZW9t
ZXRyeU9yaWVudGF0aW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpz
ZXRHZW9tZXRyeU9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTsKKyAgICB1cGRhdGVHZW9tZXRyeU9y
aWVudGF0aW9uKCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJTa2lhOjpob3N0
TGF5ZXJGb3JTdWJsYXllcnMoKSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5zZm9ybUxheWVy
ID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5ZXIuZ2V0KCk7Cit9CisKK1BsYXRmb3Jt
TGF5ZXIqIEdyYXBoaWNzTGF5ZXJTa2lhOjpsYXllckZvclN1cGVybGF5ZXIoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3RyYW5zZm9ybUxheWVyID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1f
bGF5ZXIuZ2V0KCk7Cit9CisKK1BsYXRmb3JtTGF5ZXIqIEdyYXBoaWNzTGF5ZXJTa2lhOjpwbGF0
Zm9ybUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcHJpbWFyeUxheWVyKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclNraWE6OnNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9y
JiBjb2xvcikKK3sKKyAgICBpZiAoY29sb3IuaXNWYWxpZCgpKQorICAgICAgICBzZXRMYXllckJh
Y2tncm91bmRDb2xvcigqbV9sYXllciwgY29sb3IpOworICAgIGVsc2UKKyAgICAgICAgY2xlYXJM
YXllckJhY2tncm91bmRDb2xvcigqbV9sYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNr
aWE6OnNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiBjb2xvciwgZmxvYXQgYm9yZGVyV2lkdGgp
Cit7CisgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkgeworICAgICAgICBzZXRMYXllckJvcmRlckNv
bG9yKCptX2xheWVyLCBjb2xvcik7CisgICAgICAgIG1fbGF5ZXItPnNldEJvcmRlcldpZHRoKGJv
cmRlcldpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjbGVhckJvcmRlckNvbG9yKCptX2xh
eWVyKTsKKyAgICAgICAgbV9sYXllci0+c2V0Qm9yZGVyV2lkdGgoMCk7CisgICAgfQorfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVTdWJsYXllckxpc3QoKQoreworICAgIFZlY3Rv
cjxSZWZQdHI8TGF5ZXJTa2lhPiA+IG5ld1N1YmxheWVyczsKKworICAgIGlmIChtX3RyYW5zZm9y
bUxheWVyKSB7CisgICAgICAgIC8vIEFkZCB0aGUgcHJpbWFyeSBsYXllciBmaXJzdC4gRXZlbiBp
ZiB3ZSBoYXZlIG5lZ2F0aXZlIHotb3JkZXIgY2hpbGRyZW4sIHRoZSBwcmltYXJ5IGxheWVyIGFs
d2F5cyBjb21lcyBiZWhpbmQuCisgICAgICAgIG5ld1N1YmxheWVycy5hcHBlbmQobV9sYXllci5n
ZXQoKSk7CisgICAgfSBlbHNlIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgLy8gRklY
TUU6IGFkZCB0aGUgY29udGVudHMgbGF5ZXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgd2l0aCBuZWdh
dGl2ZSB6LW9yZGVyIGNoaWxkcmVuLgorICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGNhdXNlIHZp
c2libGUgcmVuZGVyaW5nIGlzc3VlcyBiZWNhdXNlIGN1cnJlbnRseSBjb250ZW50cyBsYXllcnMg
YXJlIG9ubHkgdXNlZAorICAgICAgICAvLyBmb3IgcmVwbGFjZWQgZWxlbWVudHMgdGhhdCBkb24n
dCBoYXZlIGNoaWxkcmVuLgorICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKG1fY29udGVudHNM
YXllci5nZXQoKSk7CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiYg
Y2hpbGRMYXllcnMgPSBjaGlsZHJlbigpOworICAgIHNpemVfdCBudW1DaGlsZHJlbiA9IGNoaWxk
TGF5ZXJzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyAr
K2kpIHsKKyAgICAgICAgR3JhcGhpY3NMYXllclNraWEqIGN1ckNoaWxkID0gc3RhdGljX2Nhc3Q8
R3JhcGhpY3NMYXllclNraWEqPihjaGlsZExheWVyc1tpXSk7CisKKyAgICAgICAgTGF5ZXJTa2lh
KiBjaGlsZExheWVyID0gY3VyQ2hpbGQtPmxheWVyRm9yU3VwZXJsYXllcigpOworICAgICAgICBu
ZXdTdWJsYXllcnMuYXBwZW5kKGNoaWxkTGF5ZXIpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbmV3U3VibGF5ZXJzLnNpemUoKTsgKytpKQorICAgICAgICBuZXdTdWJsYXll
cnNbaV0tPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICBpZiAobV90cmFuc2Zvcm1MYXll
cikgeworICAgICAgICBtX3RyYW5zZm9ybUxheWVyLT5zZXRTdWJsYXllcnMobmV3U3VibGF5ZXJz
KTsKKworICAgICAgICBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgICAgICAvLyBJZiB3
ZSBoYXZlIGEgdHJhbnNmb3JtIGxheWVyLCB0aGVuIHRoZSBjb250ZW50cyBsYXllciBpcyBwYXJl
bnRlZCBpbiB0aGUKKyAgICAgICAgICAgIC8vIHByaW1hcnkgbGF5ZXIgKHdoaWNoIGlzIGl0c2Vs
ZiBhIGNoaWxkIG9mIHRoZSB0cmFuc2Zvcm0gbGF5ZXIpLgorICAgICAgICAgICAgbV9sYXllci0+
cmVtb3ZlQWxsU3VibGF5ZXJzKCk7CisgICAgICAgICAgICBtX2xheWVyLT5hZGRTdWJsYXllciht
X2NvbnRlbnRzTGF5ZXIpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIG1fbGF5ZXIt
PnNldFN1YmxheWVycyhuZXdTdWJsYXllcnMpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lh
Ojp1cGRhdGVMYXllclBvc2l0aW9uKCkKK3sKKyAgICAvLyBQb3NpdGlvbiBpcyBvZmZzZXQgb24g
dGhlIGxheWVyIGJ5IHRoZSBsYXllciBhbmNob3IgcG9pbnQuCisgICAgU2tQb2ludCBsYXllclBv
c2l0aW9uOworICAgIGxheWVyUG9zaXRpb24uc2V0KG1fcG9zaXRpb24ueCgpICsgbV9hbmNob3JQ
b2ludC54KCkgKiBtX3NpemUud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBtX3Bvc2l0
aW9uLnkoKSArIG1fYW5jaG9yUG9pbnQueSgpICogbV9zaXplLmhlaWdodCgpKTsKKworICAgIHBy
aW1hcnlMYXllcigpLT5zZXRQb3NpdGlvbihsYXllclBvc2l0aW9uKTsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyU2tpYTo6dXBkYXRlTGF5ZXJTaXplKCkKK3sKKyAgICBTa0lSZWN0IHJlY3Q7Cisg
ICAgcmVjdC5zZXQoMCwgMCwgbV9zaXplLndpZHRoKCksIG1fc2l6ZS5oZWlnaHQoKSk7CisgICAg
aWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0Qm91
bmRzKHJlY3QpOworICAgICAgICAvLyBUaGUgYW5jaG9yIG9mIHRoZSBjb250ZW50cyBsYXllciBp
cyBhbHdheXMgYXQgMC41LCAwLjUsIHNvIHRoZSBwb3NpdGlvbiBpcyBjZW50ZXItcmVsYXRpdmUu
CisgICAgICAgIFNrUG9pbnQgY2VudGVyUG9pbnQ7CisgICAgICAgIGNlbnRlclBvaW50LnNldCht
X3NpemUud2lkdGgoKSAvIDIuMGYsIG1fc2l6ZS5oZWlnaHQoKSAvIDIuMGYpOworICAgICAgICBt
X2xheWVyLT5zZXRQb3NpdGlvbihjZW50ZXJQb2ludCk7CisgICAgfQorCisgICAgbV9sYXllci0+
c2V0Qm91bmRzKHJlY3QpOworCisgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IHJlc2l6ZSBtX2Nv
bnRlbnRzTGF5ZXIuIEl0J3MgdXAgdGhlIGNhbGxlciB0byBkbyB0aGF0LgorCisgICAgLy8gSWYg
d2UndmUgY2hhbmdlZCB0aGUgYm91bmRzLCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBwb3Np
dGlvbgorICAgIC8vIG9mIHRoZSBsYXllciwgdGFraW5nIGFuY2hvciBwb2ludCBpbnRvIGFjY291
bnQuCisgICAgdXBkYXRlTGF5ZXJQb3NpdGlvbigpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJT
a2lhOjp1cGRhdGVBbmNob3JQb2ludCgpCit7CisgICAgU2tQb2ludCBhbmNob3JQb2ludDsKKyAg
ICBhbmNob3JQb2ludC5zZXQobV9hbmNob3JQb2ludC54KCksIG1fYW5jaG9yUG9pbnQueSgpKTsK
KyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0QW5jaG9yUG9pbnQoYW5jaG9yUG9pbnQpOworICAgIHBy
aW1hcnlMYXllcigpLT5zZXRBbmNob3JQb2ludFoobV9hbmNob3JQb2ludC56KCkpOworICAgIHVw
ZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRl
VHJhbnNmb3JtKCkKK3sKKyAgICBwcmltYXJ5TGF5ZXIoKS0+c2V0VHJhbnNmb3JtKG1fdHJhbnNm
b3JtLnRvQWZmaW5lVHJhbnNmb3JtKCkpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1
cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgpCit7CisgICAgcHJpbWFyeUxheWVyKCktPnNldFN1Ymxh
eWVyVHJhbnNmb3JtKG1fY2hpbGRyZW5UcmFuc2Zvcm0pOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjp1cGRhdGVNYXNrc1RvQm91bmRzKCkKK3sKKyAgICBtX2xheWVyLT5zZXRNYXNrc1Rv
Qm91bmRzKG1fbWFza3NUb0JvdW5kcyk7CisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUNvbnRlbnRzT3BhcXVlKCkKK3sKKyAg
ICBtX2xheWVyLT5zZXRPcGFxdWUobV9jb250ZW50c09wYXF1ZSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllclNraWE6OnVwZGF0ZUJhY2tmYWNlVmlzaWJpbGl0eSgpCit7CisgICAgbV9sYXllci0+
c2V0RG91YmxlU2lkZWQobV9iYWNrZmFjZVZpc2liaWxpdHkpOworfQorCit2b2lkIEdyYXBoaWNz
TGF5ZXJTa2lhOjp1cGRhdGVMYXllclByZXNlcnZlczNEKCkKK3sKKyAgICAvLyBGSVhNRTogaW1w
bGVtZW50Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUxheWVyRHJhd3NDb250
ZW50KCkKK3sKKyAgICBpZiAobV9kcmF3c0NvbnRlbnQpCisgICAgICAgIG1fbGF5ZXItPnNldE5l
ZWRzRGlzcGxheSgpOworCisgICAgdXBkYXRlRGVidWdJbmRpY2F0b3JzKCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUxheWVyQmFja2dyb3VuZENvbG9yKCkKK3sKKyAgICBp
ZiAoIW1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2UgbmV2ZXIg
Y3JlYXRlIHRoZSBjb250ZW50cyBsYXllciBqdXN0IGZvciBiYWNrZ3JvdW5kIGNvbG9yIHlldC4K
KyAgICBpZiAobV9iYWNrZ3JvdW5kQ29sb3JTZXQpCisgICAgICAgIHNldExheWVyQmFja2dyb3Vu
ZENvbG9yKCptX2NvbnRlbnRzTGF5ZXIsIG1fYmFja2dyb3VuZENvbG9yKTsKKyAgICBlbHNlCisg
ICAgICAgIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29sb3IoKm1fY29udGVudHNMYXllcik7Cit9CisK
K3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUNvbnRlbnRzSW1hZ2UoKQoreworICAgIC8v
IEZJWE1FOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRlQ29u
dGVudHNWaWRlbygpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudAorfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJTa2lhOjp1cGRhdGVDb250ZW50c1JlY3QoKQoreworICAgIGlmICghbV9jb250ZW50
c0xheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BvaW50IHBvaW50OworICAgIHBvaW50
LnNldChtX2NvbnRlbnRzUmVjdC54KCksIG1fY29udGVudHNSZWN0LnkoKSk7CisgICAgU2tJUmVj
dCByZWN0OworICAgIHJlY3Quc2V0KDAsIDAsIG1fY29udGVudHNSZWN0LndpZHRoKCksIG1fY29u
dGVudHNSZWN0LmhlaWdodCgpKTsKKworICAgIG1fY29udGVudHNMYXllci0+c2V0UG9zaXRpb24o
cG9pbnQpOworICAgIG1fY29udGVudHNMYXllci0+c2V0Qm91bmRzKHJlY3QpOworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVHZW9tZXRyeU9yaWVudGF0aW9uKCkKK3sKKyAgICBz
d2l0Y2ggKGdlb21ldHJ5T3JpZW50YXRpb24oKSkgeworICAgIGNhc2UgQ29tcG9zaXRpbmdDb29y
ZGluYXRlc1RvcERvd246CisgICAgICAgIG1fbGF5ZXItPnNldEdlb21ldHJ5RmxpcHBlZChmYWxz
ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDb21wb3NpdGluZ0Nvb3JkaW5hdGVzQm90
dG9tVXA6CisgICAgICAgIG1fbGF5ZXItPnNldEdlb21ldHJ5RmxpcHBlZCh0cnVlKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICAgIC8vIEdlb21ldHJ5IG9yaWVudGF0aW9uIGlzIG1hcHBlZCBv
bnRvIGNoaWxkcmVuIHRyYW5zZm9ybSBpbiBvbGRlciBRdWFydHpDb3JlcywKKyAgICAvLyBzbyBp
cyBoYW5kbGVkIHZpYSBzZXRHZW9tZXRyeU9yaWVudGF0aW9uKCkuCit9CisKK3ZvaWQgR3JhcGhp
Y3NMYXllclNraWE6OnNldHVwQ29udGVudHNMYXllcihMYXllclNraWEqIGNvbnRlbnRzTGF5ZXIp
Cit7CisgICAgaWYgKGNvbnRlbnRzTGF5ZXIgPT0gbV9jb250ZW50c0xheWVyKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIG1fY29udGVudHNM
YXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKyAgICAgICAgbV9jb250ZW50c0xheWVyID0g
MDsKKyAgICB9CisKKyAgICBpZiAoY29udGVudHNMYXllcikgeworICAgICAgICBtX2NvbnRlbnRz
TGF5ZXIgPSBjb250ZW50c0xheWVyOworCisgICAgICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQ7Cisg
ICAgICAgIGFuY2hvclBvaW50LnNldCgwLjBmLCAwLjBmKTsKKyAgICAgICAgbV9jb250ZW50c0xh
eWVyLT5zZXRBbmNob3JQb2ludChhbmNob3JQb2ludCk7CisKKyAgICAgICAgLy8gSW5zZXJ0IHRo
ZSBjb250ZW50IGxheWVyIGZpcnN0LiBWaWRlbyBlbGVtZW50cyByZXF1aXJlIHRoaXMsIGJlY2F1
c2UgdGhleSBoYXZlCisgICAgICAgIC8vIHNoYWRvdyBjb250ZW50IHRoYXQgbXVzdCBkaXNwbGF5
IGluIGZyb250IG9mIHRoZSB2aWRlby4KKyAgICAgICAgbV9sYXllci0+aW5zZXJ0U3VibGF5ZXIo
bV9jb250ZW50c0xheWVyLmdldCgpLCAwKTsKKworICAgICAgICB1cGRhdGVDb250ZW50c1JlY3Qo
KTsKKworICAgICAgICBpZiAoc2hvd0RlYnVnQm9yZGVycygpKSB7CisgICAgICAgICAgICBzZXRM
YXllckJvcmRlckNvbG9yKCptX2NvbnRlbnRzTGF5ZXIsIENvbG9yKDAsIDAsIDEyOCwgMTgwKSk7
CisgICAgICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvcmRlcldpZHRoKDEuMGYpOworICAg
ICAgICB9CisgICAgfQorICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCisvLyBUaGlz
IGZ1bmN0aW9uIHNpbXBseSBtaW1pY3MgdGhlIG9wZXJhdGlvbiBvZiBHcmFwaGljc0xheWVyQ0EK
K3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZU9wYWNpdHlPbkxheWVyKCkKK3sKKyAgICBw
cmltYXJ5TGF5ZXIoKS0+c2V0T3BhY2l0eShtX29wYWNpdHkpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNr
aWEuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFw
aGljc0xheWVyU2tpYS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR3Jh
cGhpY3NMYXllclNraWFfaAorI2RlZmluZSBHcmFwaGljc0xheWVyU2tpYV9oCisKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJHcmFwaGljc0xheWVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xh
c3MgTGF5ZXJTa2lhOworCitjbGFzcyBHcmFwaGljc0xheWVyU2tpYSA6IHB1YmxpYyBHcmFwaGlj
c0xheWVyIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0xheWVyU2tpYShHcmFwaGljc0xheWVyQ2xp
ZW50Kik7CisgICAgdmlydHVhbCB+R3JhcGhpY3NMYXllclNraWEoKTsKKworICAgIHZpcnR1YWwg
dm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYpOworCisgICAgLy8gZm9yIGhvc3RpbmcgdGhpcyBH
cmFwaGljc0xheWVyIGluIGEgbmF0aXZlIGxheWVyIGhpZXJhcmNoeQorICAgIHZpcnR1YWwgTmF0
aXZlTGF5ZXIgbmF0aXZlTGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRDaGls
ZHJlbihjb25zdCBWZWN0b3I8R3JhcGhpY3NMYXllcio+Jik7CisgICAgdmlydHVhbCB2b2lkIGFk
ZENoaWxkKEdyYXBoaWNzTGF5ZXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRBdEluZGV4
KEdyYXBoaWNzTGF5ZXIqLCBpbnQgaW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZEFi
b3ZlKEdyYXBoaWNzTGF5ZXIqLCBHcmFwaGljc0xheWVyKiBzaWJsaW5nKTsKKyAgICB2aXJ0dWFs
IHZvaWQgYWRkQ2hpbGRCZWxvdyhHcmFwaGljc0xheWVyKiwgR3JhcGhpY3NMYXllciogc2libGlu
Zyk7CisgICAgdmlydHVhbCBib29sIHJlcGxhY2VDaGlsZChHcmFwaGljc0xheWVyKiBvbGRDaGls
ZCwgR3JhcGhpY3NMYXllciogbmV3Q2hpbGQpOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUZy
b21QYXJlbnQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBv
aW50Jik7CisgICAgdmlydHVhbCB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQz
RCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRTaXplKGNvbnN0IEZsb2F0U2l6ZSYpOworCisgICAg
dmlydHVhbCB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpOwor
CisgICAgdmlydHVhbCB2b2lkIHNldENoaWxkcmVuVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlc2VydmVzM0QoYm9vbCk7Cisg
ICAgdmlydHVhbCB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCk7CisgICAgdmlydHVhbCB2b2lk
IHNldERyYXdzQ29udGVudChib29sKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRCYWNrZ3JvdW5k
Q29sb3IoY29uc3QgQ29sb3ImKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJCYWNrZ3JvdW5kQ29s
b3IoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c09wYXF1ZShib29sKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0QmFja2ZhY2VWaXNpYmlsaXR5KGJvb2wpOworCisgICAgdmlydHVhbCB2
b2lkIHNldE9wYWNpdHkoZmxvYXQpOworCisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxh
eSgpOworICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRS
ZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNSZWN0KGNvbnN0IEludFJlY3Qm
KTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvSW1hZ2UoSW1hZ2UqKTsKKyAgICB2
aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb1ZpZGVvKFBsYXRmb3JtTGF5ZXIqKTsKKworICAgIHZp
cnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0OworCisgICAgdmlydHVh
bCB2b2lkIHNldERlYnVnQmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJik7CisgICAgdmlydHVh
bCB2b2lkIHNldERlYnVnQm9yZGVyKGNvbnN0IENvbG9yJiwgZmxvYXQgYm9yZGVyV2lkdGgpOwor
CisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5T3JpZW50YXRpb24oQ29tcG9zaXRpbmdDb29y
ZGluYXRlc09yaWVudGF0aW9uKTsKKworICAgIHZvaWQgbm90aWZ5U3luY1JlcXVpcmVkKCkKKyAg
ICB7CisgICAgICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5ub3RpZnlT
eW5jUmVxdWlyZWQodGhpcyk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgdXBkYXRlT3Bh
Y2l0eU9uTGF5ZXIoKTsKKworICAgIExheWVyU2tpYSogcHJpbWFyeUxheWVyKCkgY29uc3QgIHsg
cmV0dXJuIG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgPyBtX3RyYW5zZm9ybUxheWVyLmdldCgpIDog
bV9sYXllci5nZXQoKTsgfQorICAgIExheWVyU2tpYSogaG9zdExheWVyRm9yU3VibGF5ZXJzKCkg
Y29uc3Q7CisgICAgTGF5ZXJTa2lhKiBsYXllckZvclN1cGVybGF5ZXIoKSBjb25zdDsKKworICAg
IHZvaWQgdXBkYXRlU3VibGF5ZXJMaXN0KCk7CisgICAgdm9pZCB1cGRhdGVMYXllclBvc2l0aW9u
KCk7CisgICAgdm9pZCB1cGRhdGVMYXllclNpemUoKTsKKyAgICB2b2lkIHVwZGF0ZUFuY2hvclBv
aW50KCk7CisgICAgdm9pZCB1cGRhdGVUcmFuc2Zvcm0oKTsKKyAgICB2b2lkIHVwZGF0ZUNoaWxk
cmVuVHJhbnNmb3JtKCk7CisgICAgdm9pZCB1cGRhdGVNYXNrc1RvQm91bmRzKCk7CisgICAgdm9p
ZCB1cGRhdGVDb250ZW50c09wYXF1ZSgpOworICAgIHZvaWQgdXBkYXRlQmFja2ZhY2VWaXNpYmls
aXR5KCk7CisgICAgdm9pZCB1cGRhdGVMYXllclByZXNlcnZlczNEKCk7CisgICAgdm9pZCB1cGRh
dGVMYXllckRyYXdzQ29udGVudCgpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJCYWNrZ3JvdW5kQ29s
b3IoKTsKKworICAgIHZvaWQgdXBkYXRlQ29udGVudHNJbWFnZSgpOworICAgIHZvaWQgdXBkYXRl
Q29udGVudHNWaWRlbygpOworICAgIHZvaWQgdXBkYXRlQ29udGVudHNSZWN0KCk7CisgICAgdm9p
ZCB1cGRhdGVHZW9tZXRyeU9yaWVudGF0aW9uKCk7CisKKyAgICB2b2lkIHNldHVwQ29udGVudHNM
YXllcihMYXllclNraWEqKTsKKyAgICBMYXllclNraWEqIGNvbnRlbnRzTGF5ZXIoKSBjb25zdCB7
IHJldHVybiBtX2NvbnRlbnRzTGF5ZXIuZ2V0KCk7IH0KKworICAgIFJlZlB0cjxMYXllclNraWE+
IG1fbGF5ZXI7CisgICAgUmVmUHRyPExheWVyU2tpYT4gbV90cmFuc2Zvcm1MYXllcjsKKyAgICBS
ZWZQdHI8TGF5ZXJTa2lhPiBtX2NvbnRlbnRzTGF5ZXI7CisKKyAgICBlbnVtIENvbnRlbnRzTGF5
ZXJQdXJwb3NlIHsKKyAgICAgICAgTm9Db250ZW50c0xheWVyID0gMCwKKyAgICAgICAgQ29udGVu
dHNMYXllckZvckltYWdlLAorICAgICAgICBDb250ZW50c0xheWVyRm9yVmlkZW8KKyAgICB9Owor
CisgICAgQ29udGVudHNMYXllclB1cnBvc2UgbV9jb250ZW50c0xheWVyUHVycG9zZTsKKyAgICBi
b29sIG1fY29udGVudHNMYXllckhhc0JhY2tncm91bmRDb2xvciA6IDE7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVu
ZGVyZXJTa2lhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvTGF5ZXJSZW5kZXJlclNraWEuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmNwcAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyNpbmNsdWRlICJMYXllclJlbmRlcmVyU2tpYS5oIgorCisjaW5jbHVkZSAi
TGF5ZXJTa2lhLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUg
InNraWEvZXh0L3BsYXRmb3JtX2NhbnZhcy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bh
c3NPd25QdHI8TGF5ZXJSZW5kZXJlclNraWE+IExheWVyUmVuZGVyZXJTa2lhOjpjcmVhdGUoKQor
eworICAgIHJldHVybiBuZXcgTGF5ZXJSZW5kZXJlclNraWEoKTsKK30KKworTGF5ZXJSZW5kZXJl
clNraWE6OkxheWVyUmVuZGVyZXJTa2lhKCkKKyAgICA6IG1fcm9vdExheWVyKDApCisgICAgLCBt
X25lZWRzRGlzcGxheShmYWxzZSkKK3sKK30KKworTGF5ZXJSZW5kZXJlclNraWE6On5MYXllclJl
bmRlcmVyU2tpYSgpCit7Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJlclNraWE6OmRyYXdMYXllcnNJ
bkNhbnZhcyhza2lhOjpQbGF0Zm9ybUNhbnZhcyogY2FudmFzLCBTa1JlY3QgY2xpcFJlY3QpCit7
CisgICAgaWYgKCFtX3Jvb3RMYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FudmFzLT5z
YXZlKCk7CisgICAgY2FudmFzLT5jbGlwUmVjdChjbGlwUmVjdCk7CisKKyAgICAvLyBGaXJzdCBj
b21wb3NpdGUgdGhlIHJvb3QgbGF5ZXIgaW50byB0aGUgY2FudmFzLgorICAgIGNhbnZhcy0+ZHJh
d0JpdG1hcChtX3Jvb3RMYXllci0+cGxhdGZvcm1DYW52YXMoKS0+Z2V0RGV2aWNlKCktPmFjY2Vz
c0JpdG1hcChmYWxzZSksIDAsIDAsIDApOworCisgICAgLy8gQWNjb3VudCBmb3IgdGhlIHNjcm9s
bCBvZmZzZXQgYmVmb3JlIGNvbXBvc2l0aW5nIHRoZSByZW1haW5pbmcgbGF5ZXJzLgorICAgIC8v
IE5vdGUgdGhhdCB0aGUgcm9vdCBsYXllcidzIHBhaW50aW5nIHRha2VzIGludG8gYWNjb3VudCB0
aGUgc2Nyb2xsIG9mZnNldCBhbHJlYWR5LgorICAgIGNhbnZhcy0+dHJhbnNsYXRlKC1tX3Njcm9s
bEZyYW1lLmZMZWZ0LCAtbV9zY3JvbGxGcmFtZS5mVG9wKTsKKworICAgIGZsb2F0IG9wYWNpdHkg
PSAxLjBmOworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lhPiA+JiBzdWJsYXllcnMg
PSBtX3Jvb3RMYXllci0+Z2V0U3VibGF5ZXJzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCisgICAgICAgIGRyYXdMYXllckluQ2FudmFzUmVjdXJz
aXZlKGNhbnZhcywgc3VibGF5ZXJzW2ldLmdldCgpLCBvcGFjaXR5KTsKKworICAgIGNhbnZhcy0+
cmVzdG9yZSgpOworCisgICAgbV9uZWVkc0Rpc3BsYXkgPSBmYWxzZTsKK30KKwordm9pZCBMYXll
clJlbmRlcmVyU2tpYTo6dXBkYXRlTGF5ZXJDb250ZW50cygpCit7CisgICAgaWYgKG1fcm9vdExh
eWVyKQorICAgICAgICB1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKG1fcm9vdExheWVyLmdl
dCgpKTsKK30KKwordm9pZCBMYXllclJlbmRlcmVyU2tpYTo6ZHJhd0xheWVySW5DYW52YXNSZWN1
cnNpdmUoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcywgTGF5ZXJTa2lhKiBsYXllciwgZmxv
YXQgb3BhY2l0eSkKK3sKKyAgICAvLyBHdWFyYW50ZWVzIHRoYXQgdGhlIGNhbnZhcyBpcyByZXN0
b3JlZCB0byBhIGtub3duIHN0YXRlIG9uIGRlc3RydWN0aW9uLgorICAgIFNrQXV0b0NhbnZhc1Jl
c3RvcmUgYXV0b1Jlc3RvcmVDYW52YXMoY2FudmFzLCB0cnVlKTsKKworICAgIFNrUG9pbnQgcG9z
aXRpb24gPSBsYXllci0+cG9zaXRpb24oKTsKKyAgICBTa1BvaW50IGFuY2hvclBvaW50ID0gbGF5
ZXItPmFuY2hvclBvaW50KCk7CisgICAgU2tNYXRyaXggdHJhbnNmb3JtID0gbGF5ZXItPnRyYW5z
Zm9ybSgpOworICAgIFNrSVJlY3QgYm91bmRzID0gbGF5ZXItPmJvdW5kcygpOworCisgICAgY2Fu
dmFzLT50cmFuc2xhdGUocG9zaXRpb24uZlgsIHBvc2l0aW9uLmZZKTsKKworICAgIFNrU2NhbGFy
IHR4ID0gU2tTY2FsYXJNdWwoYW5jaG9yUG9pbnQuZlgsIGJvdW5kcy53aWR0aCgpKTsKKyAgICBT
a1NjYWxhciB0eSA9IFNrU2NhbGFyTXVsKGFuY2hvclBvaW50LmZZLCBib3VuZHMuaGVpZ2h0KCkp
OworICAgIGNhbnZhcy0+dHJhbnNsYXRlKHR4LCB0eSk7CisgICAgY2FudmFzLT5jb25jYXQodHJh
bnNmb3JtKTsKKyAgICBjYW52YXMtPnRyYW5zbGF0ZSgtdHgsIC10eSk7CisKKyAgICAvLyBUaGUg
cG9zaXRpb24gd2UgZ2V0IGlzIGZvciB0aGUgY2VudGVyIG9mIHRoZSBsYXllciwgYnV0CisgICAg
Ly8gZHJhd0JpdG1hcCBzdGFydHMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyLCBhbmQgdGhlcmVm
b3JlCisgICAgLy8gd2UgbmVlZCB0byBhZGp1c3Qgb3VyIHRyYW5zZm9ybS4KKyAgICBjYW52YXMt
PnRyYW5zbGF0ZSgtMC41ZiAqIGJvdW5kcy53aWR0aCgpLCAtMC41ZiAqIGJvdW5kcy5oZWlnaHQo
KSk7CisKKyAgICBTa1BhaW50IG9wYWNpdHlQYWludDsKKyAgICBvcGFjaXR5ICo9IGxheWVyLT5v
cGFjaXR5KCk7CisgICAgb3BhY2l0eVBhaW50LnNldEFscGhhKG9wYWNpdHkgKiAyNTUpOworCisg
ICAgY2FudmFzLT5kcmF3Qml0bWFwKGxheWVyLT5wbGF0Zm9ybUNhbnZhcygpLT5nZXREZXZpY2Uo
KS0+YWNjZXNzQml0bWFwKGZhbHNlKSwgMCwgMCwgJm9wYWNpdHlQYWludCk7CisKKyAgICBjb25z
dCBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiYgc3VibGF5ZXJzID0gbGF5ZXItPmdldFN1Ymxh
eWVycygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VibGF5ZXJzLnNpemUoKTsgaSsr
KQorICAgICAgICBkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2ZShjYW52YXMsIHN1YmxheWVyc1tp
XS5nZXQoKSwgb3BhY2l0eSk7Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJlclNraWE6OnVwZGF0ZUxh
eWVyQ29udGVudHNSZWN1cnNpdmUoTGF5ZXJTa2lhKiBsYXllcikKK3sKKyAgICBsYXllci0+dXBk
YXRlQ29udGVudHMoKTsKKworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lhPiA+JiBz
dWJsYXllcnMgPSBsYXllci0+Z2V0U3VibGF5ZXJzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBzdWJsYXllcnMuc2l6ZSgpOyBpKyspCisgICAgICAgIHVwZGF0ZUxheWVyQ29udGVudHNS
ZWN1cnNpdmUoc3VibGF5ZXJzW2ldLmdldCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmgJKHJl
dmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJSZW5kZXJl
clNraWEuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2lmbmRlZiBMYXllclJlbmRl
cmVyU2tpYV9oCisjZGVmaW5lIExheWVyUmVuZGVyZXJTa2lhX2gKKworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKworI2luY2x1ZGUgIkxheWVyU2tpYS5oIgorI2luY2x1ZGUgPHd0
Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ugc2tpYSB7CitjbGFzcyBQbGF0Zm9ybUNhbnZhczsK
K30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBMYXllclJlbmRlcmVyU2tpYSA6IHB1
YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25QdHI8TGF5ZXJS
ZW5kZXJlclNraWE+IGNyZWF0ZSgpOworCisgICAgTGF5ZXJSZW5kZXJlclNraWEoKTsKKyAgICB+
TGF5ZXJSZW5kZXJlclNraWEoKTsKKworICAgIHZvaWQgZHJhd0xheWVyc0luQ2FudmFzKHNraWE6
OlBsYXRmb3JtQ2FudmFzKiwgU2tSZWN0IGNsaXBSZWN0KTsKKworICAgIHZvaWQgdXBkYXRlTGF5
ZXJDb250ZW50cygpOworCisgICAgdm9pZCBzZXRSb290TGF5ZXIoUGFzc1JlZlB0cjxMYXllclNr
aWE+IGxheWVyKSB7IG1fcm9vdExheWVyID0gbGF5ZXI7IH0KKyAgICBMYXllclNraWEqIHJvb3RM
YXllcigpIHsgcmV0dXJuIG1fcm9vdExheWVyLmdldCgpOyB9CisKKyAgICB2b2lkIHNldE5lZWRz
RGlzcGxheSgpIHsgbV9uZWVkc0Rpc3BsYXkgPSB0cnVlOyB9CisKKyAgICB2b2lkIHNldFNjcm9s
bEZyYW1lKFNrSVJlY3QmIHNjcm9sbEZyYW1lKSB7IG1fc2Nyb2xsRnJhbWUgPSBzY3JvbGxGcmFt
ZTsgfQorCitwcml2YXRlOgorICAgIHZvaWQgZHJhd0xheWVySW5DYW52YXNSZWN1cnNpdmUoc2tp
YTo6UGxhdGZvcm1DYW52YXMqLCBMYXllclNraWEqLCBmbG9hdCBvcGFjaXR5KTsKKyAgICB2b2lk
IHVwZGF0ZUxheWVyQ29udGVudHNSZWN1cnNpdmUoTGF5ZXJTa2lhKik7CisKKyAgICBSZWZQdHI8
TGF5ZXJTa2lhPiBtX3Jvb3RMYXllcjsKKworICAgIGJvb2wgbV9uZWVkc0Rpc3BsYXk7CisgICAg
U2tJUmVjdCBtX3Njcm9sbEZyYW1lOworfTsKKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvc2tpYS9MYXllclNraWEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9MYXllclNraWEuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjQ5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorCisjaW5jbHVkZSAiTGF5ZXJTa2lhLmgiCisKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRT
a2lhLmgiCisjaW5jbHVkZSAiUmVuZGVyTGF5ZXJCYWNraW5nLmgiCisjaW5jbHVkZSAic2tpYS9l
eHQvcGxhdGZvcm1fY2FudmFzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKKworUGFzc1JlZlB0cjxMYXllclNraWE+IExheWVyU2tpYTo6Y3JlYXRlKExh
eWVyVHlwZSB0eXBlLCBHcmFwaGljc0xheWVyU2tpYSogb3duZXIpCit7CisgICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBMYXllclNraWEodHlwZSwgb3duZXIpKTsKK30KKworTGF5ZXJTa2lhOjpMYXll
clNraWEoTGF5ZXJUeXBlIHR5cGUsIEdyYXBoaWNzTGF5ZXJTa2lhKiBvd25lcikKKyAgICA6IG1f
bmVlZHNEaXNwbGF5T25Cb3VuZHNDaGFuZ2UoZmFsc2UpCisgICAgLCBtX293bmVyKG93bmVyKQor
ICAgICwgbV9sYXllclR5cGUodHlwZSkKKyAgICAsIG1fc3VwZXJsYXllcigwKQorICAgICwgbV9i
b3JkZXJXaWR0aCgwKQorICAgICwgbV9ib3JkZXJDb2xvcigwLCAwLCAwLCAwKQorICAgICwgbV9i
YWNrZ3JvdW5kQ29sb3IoMCwgMCwgMCwgMCkKKyAgICAsIG1fYW5jaG9yUG9pbnRaKDApCisgICAg
LCBtX2NsZWFyc0NvbnRleHQoZmFsc2UpCisgICAgLCBtX2RvdWJsZVNpZGVkKGZhbHNlKQorICAg
ICwgbV9lZGdlQW50aWFsaWFzaW5nTWFzaygwKQorICAgICwgbV9oaWRkZW4oZmFsc2UpCisgICAg
LCBtX21hc2tzVG9Cb3VuZHMoZmFsc2UpCisgICAgLCBtX2NvbnRlbnRzR3Jhdml0eShCb3R0b20p
CisgICAgLCBtX29wYWNpdHkoMS4wKQorICAgICwgbV9vcGFxdWUodHJ1ZSkKKyAgICAsIG1felBv
c2l0aW9uKDAuMCkKKyAgICAsIG1fY2FudmFzKDApCisgICAgLCBtX3NraWFDb250ZXh0KDApCisg
ICAgLCBtX2dyYXBoaWNzQ29udGV4dCgwKQorICAgICwgbV9nZW9tZXRyeUZsaXBwZWQoZmFsc2Up
Cit7CisgICAgbV9ib3VuZHMuc2V0RW1wdHkoKTsKKyAgICBtX2JhY2tpbmdTdG9yZVJlY3Quc2V0
RW1wdHkoKTsKKyAgICBtX2ZyYW1lLnNldEVtcHR5KCk7CisgICAgbV9wb3NpdGlvbi5zZXQoMCwg
MCk7CisgICAgbV9hbmNob3JQb2ludC5zZXQoMCwgMCk7CisgICAgbV90cmFuc2Zvcm0ucmVzZXQo
KTsKKyAgICBtX3N1YmxheWVyVHJhbnNmb3JtLnJlc2V0KCk7CisKKyAgICB1cGRhdGVHcmFwaGlj
c0NvbnRleHQobV9iYWNraW5nU3RvcmVSZWN0KTsKK30KKworTGF5ZXJTa2lhOjp+TGF5ZXJTa2lh
KCkKK3sKKyAgICAvLyBPdXIgc3VwZXJsYXllciBzaG91bGQgYmUgaG9sZGluZyBhIHJlZmVyZW5j
ZSB0byB1cywgc28gdGhlcmUgc2hvdWxkIGJlIG5vIHdheSBmb3IgdXMgdG8gYmUgZGVzdHJveWVk
IHdoaWxlIHdlIHN0aWxsIGhhdmUgYSBzdXBlcmxheWVyLgorICAgIEFTU0VSVCghc3VwZXJsYXll
cigpKTsKK30KKwordm9pZCBMYXllclNraWE6OnVwZGF0ZUdyYXBoaWNzQ29udGV4dChjb25zdCBT
a0lSZWN0JiByZWN0KQoreworICAgIC8vIENyZWF0ZSBuZXcgY2FudmFzIGFuZCBjb250ZXh0LiBP
d25QdHIgdGFrZXMgY2FyZSBvZiBmcmVlaW5nIHVwCisgICAgLy8gdGhlIG9sZCBvbmVzLgorICAg
IG1fY2FudmFzID0gbmV3IHNraWE6OlBsYXRmb3JtQ2FudmFzKHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSwgZmFsc2UpOworICAgIG1fc2tpYUNvbnRleHQgPSBuZXcgUGxhdGZvcm1Db250ZXh0
U2tpYShtX2NhbnZhcy5nZXQoKSk7CisKKyAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBnZXQgdGV4
dCB0byBzaG93IHVwIGNvcnJlY3RseS4gV2l0aG91dCBpdCwKKyAgICAvLyBHREkgcmVuZGVycyB3
aXRoIHplcm8gYWxwaGEgYW5kIHRoZSB0ZXh0IGJlY29tZXMgaW52aXNpYmxlLgorICAgIC8vIFVu
Zm9ydHVuYXRlbHksIHNldHRpbmcgdGhpcyB0byB0cnVlIGRpc2FibGVzIGNsZWFydHlwZS4KKyAg
ICBtX3NraWFDb250ZXh0LT5zZXREcmF3aW5nVG9JbWFnZUJ1ZmZlcih0cnVlKTsKKworICAgIG1f
Z3JhcGhpY3NDb250ZXh0ID0gbmV3IEdyYXBoaWNzQ29udGV4dChyZWludGVycHJldF9jYXN0PFBs
YXRmb3JtR3JhcGhpY3NDb250ZXh0Kj4obV9za2lhQ29udGV4dC5nZXQoKSkpOworCisgICAgLy8g
VGhlIGJhY2tpbmcgc3RvcmUgYWxsb2NhdGVkIGZvciBhIGxheWVyIGNhbiBiZSBzbWFsbGVyIHRo
YW4gdGhlIGxheWVyJ3MgYm91bmRzLgorICAgIC8vIFRoaXMgaXMgbW9zdGx5IHRydWUgZm9yIHRo
ZSByb290IGxheWVyIHdob3NlIGJhY2tpbmcgc3RvcmUgaXMgc2l6ZWQgYmFzZWQgb24gdGhlIHZp
c2libGUKKyAgICAvLyBwb3J0aW9uIG9mIHRoZSBsYXllciByYXRoZXIgdGhhbiB0aGUgYWN0dWFs
IHBhZ2Ugc2l6ZS4KKyAgICBtX2JhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworfQorCit2b2lkIExh
eWVyU2tpYTo6dXBkYXRlQ29udGVudHMoKQoreworICAgIFJlbmRlckxheWVyQmFja2luZyogYmFj
a2luZyA9IHN0YXRpY19jYXN0PFJlbmRlckxheWVyQmFja2luZyo+KG1fb3duZXItPmNsaWVudCgp
KTsKKworICAgIGlmIChiYWNraW5nICYmICFiYWNraW5nLT5wYWludGluZ0dvZXNUb1dpbmRvdygp
KQorICAgICAgICBtX293bmVyLT5wYWludEdyYXBoaWNzTGF5ZXJDb250ZW50cygqbV9ncmFwaGlj
c0NvbnRleHQsIEludFJlY3QoMCwgMCwgbV9ib3VuZHMud2lkdGgoKSwgbV9ib3VuZHMuaGVpZ2h0
KCkpKTsKKworICAgIC8vIFBhaW50IHRoZSBkZWJ1ZyBib3JkZXIuCisgICAgLy8gRklYTUU6IEFk
ZCBhIGZsYWcgdG8gY2hlY2sgaWYgZGVidWcgYm9yZGVycyBhcmUgdXNlZC4KKyAgICBtX2dyYXBo
aWNzQ29udGV4dC0+c2V0U3Ryb2tlQ29sb3IobV9ib3JkZXJDb2xvciwgRGV2aWNlQ29sb3JTcGFj
ZSk7CisgICAgbV9ncmFwaGljc0NvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcyhtX2JvcmRlcldp
ZHRoKTsKKyAgICBtX2dyYXBoaWNzQ29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwgMCksIElu
dFBvaW50KG1fYm91bmRzLndpZHRoKCksIDApKTsKKyAgICBtX2dyYXBoaWNzQ29udGV4dC0+ZHJh
d0xpbmUoSW50UG9pbnQoMCwgMCksIEludFBvaW50KDAsIG1fYm91bmRzLmhlaWdodCgpKSk7Cisg
ICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KG1fYm91bmRzLndpZHRoKCks
IDApLCBJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkpOworICAg
IG1fZ3JhcGhpY3NDb250ZXh0LT5kcmF3TGluZShJbnRQb2ludCgwLCBtX2JvdW5kcy5oZWlnaHQo
KSksIEludFBvaW50KG1fYm91bmRzLndpZHRoKCksIG1fYm91bmRzLmhlaWdodCgpKSk7Cit9CisK
K3ZvaWQgTGF5ZXJTa2lhOjpzZXROZWVkc0NvbW1pdCgpCit7CisgICAgLy8gQ2FsbCBub3RpZnlT
eW5jUmVxdWlyZWQoKSwgd2hpY2ggaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBwbHVtYnMgdGhyb3Vn
aCB0bworICAgIC8vIGNhbGwgc2V0Um9vdExheWVyTmVlZHNEaXNwbGF5KCkgb24gdGhlIFdlYlZp
ZXcsIHdoaWNoIHdpbGwgY2F1c2UgTGF5ZXJSZW5kZXJlclNraWEKKyAgICAvLyB0byByZW5kZXIg
YSBmcmFtZS4KKyAgICBpZiAobV9vd25lcikKKyAgICAgICAgbV9vd25lci0+bm90aWZ5U3luY1Jl
cXVpcmVkKCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjphZGRTdWJsYXllcihQYXNzUmVmUHRyPExh
eWVyU2tpYT4gc3VibGF5ZXIpCit7CisgICAgaW5zZXJ0U3VibGF5ZXIoc3VibGF5ZXIsIG51bVN1
YmxheWVycygpKTsKK30KKwordm9pZCBMYXllclNraWE6Omluc2VydFN1YmxheWVyKFBhc3NSZWZQ
dHI8TGF5ZXJTa2lhPiBzdWJsYXllciwgc2l6ZV90IGluZGV4KQoreworICAgIGluZGV4ID0gbWlu
KGluZGV4LCBtX3N1YmxheWVycy5zaXplKCkpOworICAgIG1fc3VibGF5ZXJzLmluc2VydChpbmRl
eCwgc3VibGF5ZXIpOworICAgIHN1YmxheWVyLT5zZXRTdXBlcmxheWVyKHRoaXMpOworICAgIHNl
dE5lZWRzQ29tbWl0KCk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpyZW1vdmVGcm9tU3VwZXJsYXll
cigpCit7CisgICAgTGF5ZXJTa2lhKiBzdXBlcmxheWVyID0gdGhpcy0+c3VwZXJsYXllcigpOwor
ICAgIGlmICghc3VwZXJsYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgc3VwZXJsYXllci0+
cmVtb3ZlU3VibGF5ZXIodGhpcyk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjpyZW1vdmVTdWJsYXll
cihMYXllclNraWEqIHN1YmxheWVyKQoreworICAgIGludCBmb3VuZEluZGV4ID0gaW5kZXhPZlN1
YmxheWVyKHN1YmxheWVyKTsKKyAgICBpZiAoZm91bmRJbmRleCA9PSAtMSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV9zdWJsYXllcnMucmVtb3ZlKGZvdW5kSW5kZXgpOworICAgIHN1YmxheWVy
LT5zZXRTdXBlcmxheWVyKDApOworICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9CisKK2ludCBMYXll
clNraWE6OmluZGV4T2ZTdWJsYXllcihjb25zdCBMYXllclNraWEqIHJlZmVyZW5jZSkKK3sKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3VibGF5ZXJzLnNpemUoKTsgaSsrKSB7CisgICAg
ICAgIGlmIChtX3N1YmxheWVyc1tpXSA9PSByZWZlcmVuY2UpCisgICAgICAgICAgICByZXR1cm4g
aTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIExheWVyU2tpYTo6c2V0QmFja2lu
Z1N0b3JlUmVjdChjb25zdCBTa0lSZWN0JiByZWN0KQoreworICAgIGlmIChtX2JhY2tpbmdTdG9y
ZVJlY3QgPT0gcmVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdXBkYXRlR3JhcGhpY3NDb250
ZXh0KHJlY3QpOworfQorCit2b2lkIExheWVyU2tpYTo6c2V0Qm91bmRzKGNvbnN0IFNrSVJlY3Qm
IHJlY3QpCit7CisgICAgaWYgKHJlY3QgPT0gbV9ib3VuZHMpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fYm91bmRzID0gcmVjdDsKKworICAgIC8vIFJlLWNyZWF0ZSB0aGUgY2FudmFzIGFuZCBh
c3NvY2lhdGVkIGNvbnRleHRzLgorICAgIHVwZGF0ZUdyYXBoaWNzQ29udGV4dChtX2JvdW5kcyk7
CisKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExheWVyU2tpYTo6c2V0RnJhbWUo
Y29uc3QgU2tSZWN0JiByZWN0KQoreworICAgIGlmIChyZWN0ID09IG1fZnJhbWUpCisgICAgICBy
ZXR1cm47CisKKyAgICBtX2ZyYW1lID0gcmVjdDsKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQor
Citjb25zdCBMYXllclNraWEqIExheWVyU2tpYTo6cm9vdExheWVyKCkgY29uc3QKK3sKKyAgICBj
b25zdCBMYXllclNraWEqIGxheWVyID0gdGhpczsKKyAgICBmb3IgKExheWVyU2tpYSogc3VwZXJs
YXllciA9IGxheWVyLT5zdXBlcmxheWVyKCk7IHN1cGVybGF5ZXI7IGxheWVyID0gc3VwZXJsYXll
ciwgc3VwZXJsYXllciA9IHN1cGVybGF5ZXItPnN1cGVybGF5ZXIoKSkgeyB9CisgICAgcmV0dXJu
IGxheWVyOworfQorCit2b2lkIExheWVyU2tpYTo6cmVtb3ZlQWxsU3VibGF5ZXJzKCkKK3sKKyAg
ICBtX3N1YmxheWVycy5jbGVhcigpOworICAgIHNldE5lZWRzQ29tbWl0KCk7Cit9CisKK3ZvaWQg
TGF5ZXJTa2lhOjpzZXRTdWJsYXllcnMoY29uc3QgVmVjdG9yPFJlZlB0cjxMYXllclNraWE+ID4m
IHN1YmxheWVycykKK3sKKyAgICBtX3N1YmxheWVycyA9IHN1YmxheWVyczsKK30KKwordm9pZCBM
YXllclNraWE6OnNldFN1cGVybGF5ZXIoTGF5ZXJTa2lhKiBzdXBlcmxheWVyKQoreworICAgIG1f
c3VwZXJsYXllciA9IHN1cGVybGF5ZXI7Cit9CisKK0xheWVyU2tpYSogTGF5ZXJTa2lhOjpzdXBl
cmxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdXBlcmxheWVyOworfQorCit2b2lkIExh
eWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0IFNrUmVjdCYgZGlydHlSZWN0KQoreworICAg
IC8vIEZJWE1FOiBpbXBsZW1lbnQKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExh
eWVyU2tpYTo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50Cit9
CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmgJKHJldmlzaW9uIDApCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmgJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworCisjaWZuZGVmIExheWVyU2tpYV9oCisjZGVmaW5lIExheWVyU2tp
YV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKworI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJTa2lhLmgiCisjaW5jbHVk
ZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTa0NvbG9yLmgiCisjaW5jbHVkZSAiU2tQ
b2ludC5oIgorI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlv
bk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1Jl
ZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgorCisKK25hbWVzcGFjZSBza2lhIHsKK2NsYXNzIFBsYXRmb3JtQ2FudmFzOworfQorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExheWVyU2tpYSA6IHB1YmxpYyBSZWZDb3VudGVk
PExheWVyU2tpYT4geworcHVibGljOgorICAgIGVudW0gTGF5ZXJUeXBlIHsgTGF5ZXIsIFRyYW5z
Zm9ybUxheWVyIH07CisgICAgZW51bSBGaWx0ZXJUeXBlIHsgTGluZWFyLCBOZWFyZXN0LCBUcmls
aW5lYXIsIExhbmN6b3MgfTsKKyAgICBlbnVtIENvbnRlbnRzR3Jhdml0eVR5cGUgeyBDZW50ZXIs
IFRvcCwgQm90dG9tLCBMZWZ0LCBSaWdodCwgVG9wTGVmdCwgVG9wUmlnaHQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgQm90dG9tTGVmdCwgQm90dG9tUmlnaHQsIFJlc2l6ZSwgUmVz
aXplQXNwZWN0LCBSZXNpemVBc3BlY3RGaWxsIH07CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxM
YXllclNraWE+IGNyZWF0ZShMYXllclR5cGUsIEdyYXBoaWNzTGF5ZXJTa2lhKiBvd25lciA9IDAp
OworCisgICAgfkxheWVyU2tpYSgpOworCisgICAgdm9pZCBkaXNwbGF5KFBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0Kik7CisKKyAgICB2b2lkIGFkZFN1YmxheWVyKFBhc3NSZWZQdHI8TGF5ZXJTa2lh
Pik7CisgICAgdm9pZCBpbnNlcnRTdWJsYXllcihQYXNzUmVmUHRyPExheWVyU2tpYT4sIHNpemVf
dCBpbmRleCk7CisgICAgdm9pZCByZW1vdmVGcm9tU3VwZXJsYXllcigpOworCisgICAgdm9pZCBz
ZXRBbmNob3JQb2ludChjb25zdCBTa1BvaW50JiBhbmNob3JQb2ludCkgeyBtX2FuY2hvclBvaW50
ID0gYW5jaG9yUG9pbnQ7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBTa1BvaW50IGFuY2hvclBv
aW50KCkgY29uc3QgeyByZXR1cm4gbV9hbmNob3JQb2ludDsgfQorCisgICAgdm9pZCBzZXRBbmNo
b3JQb2ludFooZmxvYXQgYW5jaG9yUG9pbnRaKSB7IG1fYW5jaG9yUG9pbnRaID0gYW5jaG9yUG9p
bnRaOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgZmxvYXQgYW5jaG9yUG9pbnRaKCkgY29uc3Qg
eyByZXR1cm4gbV9hbmNob3JQb2ludFo7IH0KKworICAgIHZvaWQgc2V0QmFja2dyb3VuZENvbG9y
KGNvbnN0IENvbG9yJiBjb2xvcikgeyBtX2JhY2tncm91bmRDb2xvciA9IGNvbG9yOyBzZXROZWVk
c0NvbW1pdCgpOyB9CisgICAgQ29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4g
bV9iYWNrZ3JvdW5kQ29sb3I7IH0KKworICAgIHZvaWQgc2V0Qm9yZGVyQ29sb3IoY29uc3QgQ29s
b3ImIGNvbG9yKSB7IG1fYm9yZGVyQ29sb3IgPSBjb2xvcjsgc2V0TmVlZHNDb21taXQoKTsgfQor
ICAgIENvbG9yIGJvcmRlckNvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXJDb2xvcjsgfQor
CisgICAgdm9pZCBzZXRCb3JkZXJXaWR0aChmbG9hdCB3aWR0aCkgeyBtX2JvcmRlcldpZHRoID0g
d2lkdGg7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBTa1NjYWxhciBib3JkZXJXaWR0aCgpIGNv
bnN0IHsgcmV0dXJuIG1fYm9yZGVyV2lkdGg7IH0KKworICAgIHZvaWQgc2V0Qm91bmRzKGNvbnN0
IFNrSVJlY3QmKTsKKyAgICBTa0lSZWN0IGJvdW5kcygpIGNvbnN0IHsgcmV0dXJuIG1fYm91bmRz
OyB9CisKKyAgICB2b2lkIHNldENsZWFyc0NvbnRleHQoYm9vbCBjbGVhcnMpIHsgbV9jbGVhcnND
b250ZXh0ID0gY2xlYXJzOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgYm9vbCBjbGVhcnNDb250
ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9jbGVhcnNDb250ZXh0OyB9CisKKyAgICB2b2lkIHNldENv
bnRlbnRzR3Jhdml0eShDb250ZW50c0dyYXZpdHlUeXBlIGdyYXZpdHlUeXBlKSB7IG1fY29udGVu
dHNHcmF2aXR5ID0gZ3Jhdml0eVR5cGU7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBDb250ZW50
c0dyYXZpdHlUeXBlIGNvbnRlbnRzR3Jhdml0eSgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGVudHNH
cmF2aXR5OyB9CisKKyAgICB2b2lkIHNldERvdWJsZVNpZGVkKGJvb2wgZG91YmxlU2lkZWQpIHsg
bV9kb3VibGVTaWRlZCA9IGRvdWJsZVNpZGVkOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgYm9v
bCBkb3VibGVTaWRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fZG91YmxlU2lkZWQ7IH0KKworICAgIHZv
aWQgc2V0RWRnZUFudGlhbGlhc2luZ01hc2sodWludDMyX3QgbWFzaykgeyBtX2VkZ2VBbnRpYWxp
YXNpbmdNYXNrID0gbWFzazsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIHVpbnQzMl90IGVkZ2VB
bnRpYWxpYXNpbmdNYXNrKCkgY29uc3QgeyByZXR1cm4gbV9lZGdlQW50aWFsaWFzaW5nTWFzazsg
fQorCisgICAgdm9pZCBzZXRGcmFtZShjb25zdCBTa1JlY3QmKTsKKyAgICBTa1JlY3QgZnJhbWUo
KSBjb25zdCB7IHJldHVybiBtX2ZyYW1lOyB9CisKKyAgICB2b2lkIHNldEhpZGRlbihib29sIGhp
ZGRlbikgeyBtX2hpZGRlbiA9IGhpZGRlbjsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wg
aXNIaWRkZW4oKSBjb25zdCB7IHJldHVybiBtX2hpZGRlbjsgfQorCisgICAgdm9pZCBzZXRNYXNr
c1RvQm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykgeyBtX21hc2tzVG9Cb3VuZHMgPSBtYXNrc1Rv
Qm91bmRzOyB9CisgICAgYm9vbCBtYXNrc1RvQm91bmRzKCkgY29uc3QgeyByZXR1cm4gbV9tYXNr
c1RvQm91bmRzOyB9CisKKyAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiBuYW1lKSB7IG1f
bmFtZSA9IG5hbWU7IH0KKyAgICBTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsg
fQorCisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoY29uc3QgU2tSZWN0JiBkaXJ0eVJlY3QpOwor
ICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CisKKyAgICB2b2lkIHNldE5lZWRzRGlzcGxheU9u
Qm91bmRzQ2hhbmdlKGJvb2wgbmVlZHNEaXNwbGF5KSB7IG1fbmVlZHNEaXNwbGF5T25Cb3VuZHND
aGFuZ2UgPSBuZWVkc0Rpc3BsYXk7IH0KKworICAgIHZvaWQgc2V0T3BhY2l0eShmbG9hdCBvcGFj
aXR5KSB7IG1fb3BhY2l0eSA9IG9wYWNpdHk7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBmbG9h
dCBvcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbV9vcGFjaXR5OyB9CisKKyAgICB2b2lkIHNldE9w
YXF1ZShib29sIG9wYXF1ZSkgeyBtX29wYXF1ZSA9IG9wYXF1ZTsgc2V0TmVlZHNDb21taXQoKTsg
fQorICAgIGJvb2wgb3BhcXVlKCkgY29uc3QgeyByZXR1cm4gbV9vcGFxdWU7IH0KKworICAgIHZv
aWQgc2V0UG9zaXRpb24oY29uc3QgU2tQb2ludCYgcG9zaXRpb24pIHsgbV9wb3NpdGlvbiA9IHBv
c2l0aW9uOyAgc2V0TmVlZHNDb21taXQoKTsgfQorCisgICAgU2tQb2ludCBwb3NpdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1fcG9zaXRpb247IH0KKworICAgIHZvaWQgc2V0WlBvc2l0aW9uKGZsb2F0
IHpQb3NpdGlvbikgeyBtX3pQb3NpdGlvbiA9IHpQb3NpdGlvbjsgc2V0TmVlZHNDb21taXQoKTsg
fQorICAgIFNrU2NhbGFyIHpQb3NpdGlvbigpIGNvbnN0IHsgIHJldHVybiBtX3pQb3NpdGlvbjsg
fQorCisgICAgY29uc3QgTGF5ZXJTa2lhKiByb290TGF5ZXIoKSBjb25zdDsKKworICAgIHZvaWQg
cmVtb3ZlQWxsU3VibGF5ZXJzKCk7CisKKyAgICB2b2lkIHNldFN1YmxheWVycyhjb25zdCBWZWN0
b3I8UmVmUHRyPExheWVyU2tpYT4gPiYpOworCisgICAgY29uc3QgVmVjdG9yPFJlZlB0cjxMYXll
clNraWE+ID4mIGdldFN1YmxheWVycygpIGNvbnN0IHsgcmV0dXJuIG1fc3VibGF5ZXJzOyB9CisK
KyAgICB2b2lkIHNldFN1YmxheWVyVHJhbnNmb3JtKGNvbnN0IFNrTWF0cml4JiB0cmFuc2Zvcm0p
IHsgbV9zdWJsYXllclRyYW5zZm9ybSA9IHRyYW5zZm9ybTsgc2V0TmVlZHNDb21taXQoKTsgfQor
ICAgIGNvbnN0IFNrTWF0cml4JiBzdWJsYXllclRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1f
c3VibGF5ZXJUcmFuc2Zvcm07IH0KKworICAgIHZvaWQgc2V0U3VwZXJsYXllcihMYXllclNraWEq
IHN1cGVybGF5ZXIpOworICAgIExheWVyU2tpYSogc3VwZXJsYXllcigpIGNvbnN0OworCisKKyAg
ICB2b2lkIHNldFRyYW5zZm9ybShjb25zdCBTa01hdHJpeCYgdHJhbnNmb3JtKSB7IG1fdHJhbnNm
b3JtID0gdHJhbnNmb3JtOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgY29uc3QgU2tNYXRyaXgm
IHRyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNmb3JtOyB9CisKKyAgICB2b2lkIHNl
dEdlb21ldHJ5RmxpcHBlZChib29sIGZsaXBwZWQpIHsgbV9nZW9tZXRyeUZsaXBwZWQgPSBmbGlw
cGVkOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgYm9vbCBnZW9tZXRyeUZsaXBwZWQoKSBjb25z
dCB7IHJldHVybiBtX2dlb21ldHJ5RmxpcHBlZDsgfQorCisgICAgdm9pZCB1cGRhdGVDb250ZW50
cygpOworCisgICAgc2tpYTo6UGxhdGZvcm1DYW52YXMqIHBsYXRmb3JtQ2FudmFzKCkgeyByZXR1
cm4gbV9jYW52YXMuZ2V0KCk7IH0KKyAgICBHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4
dCgpIHsgcmV0dXJuIG1fZ3JhcGhpY3NDb250ZXh0LmdldCgpOyB9CisKKyAgICB2b2lkIHNldEJh
Y2tpbmdTdG9yZVJlY3QoY29uc3QgU2tJUmVjdCYpOworCitwcml2YXRlOgorICAgIExheWVyU2tp
YShMYXllclR5cGUsIEdyYXBoaWNzTGF5ZXJTa2lhKiBvd25lcik7CisKKyAgICB2b2lkIHNldE5l
ZWRzQ29tbWl0KCk7CisKKyAgICB2b2lkIHBhaW50TWUoKTsKKworICAgIHNpemVfdCBudW1TdWJs
YXllcnMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc3VibGF5ZXJzLnNpemUoKTsK
KyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc3VibGF5ZXIgb3IgLTEg
aWYgbm90IGZvdW5kLgorICAgIGludCBpbmRleE9mU3VibGF5ZXIoY29uc3QgTGF5ZXJTa2lhKik7
CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHJlbW92ZUZyb21TdXBl
cmxheWVyLgorICAgIHZvaWQgcmVtb3ZlU3VibGF5ZXIoTGF5ZXJTa2lhKik7CisKKyAgICAvLyBS
ZS1jcmVhdGUgdGhlIGNhbnZhcyBhbmQgZ3JhcGhpY3MgY29udGV4dC4gVGhpcyBtZXRob2QKKyAg
ICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBsYXllciBpcyByZXNpemVkLgorICAg
IHZvaWQgdXBkYXRlR3JhcGhpY3NDb250ZXh0KGNvbnN0IFNrSVJlY3QmKTsKKworICAgIFZlY3Rv
cjxSZWZQdHI8TGF5ZXJTa2lhPiA+IG1fc3VibGF5ZXJzOworICAgIExheWVyU2tpYSogbV9zdXBl
cmxheWVyOworCisgICAgR3JhcGhpY3NMYXllclNraWEqIG1fb3duZXI7CisgICAgT3duUHRyPHNr
aWE6OlBsYXRmb3JtQ2FudmFzPiBtX2NhbnZhczsKKyAgICBPd25QdHI8UGxhdGZvcm1Db250ZXh0
U2tpYT4gbV9za2lhQ29udGV4dDsKKyAgICBPd25QdHI8R3JhcGhpY3NDb250ZXh0PiBtX2dyYXBo
aWNzQ29udGV4dDsKKworICAgIExheWVyVHlwZSBtX2xheWVyVHlwZTsKKworICAgIFNrSVJlY3Qg
bV9ib3VuZHM7CisgICAgU2tJUmVjdCBtX2JhY2tpbmdTdG9yZVJlY3Q7CisgICAgU2tQb2ludCBt
X3Bvc2l0aW9uOworICAgIFNrUG9pbnQgbV9hbmNob3JQb2ludDsKKyAgICBDb2xvciBtX2JhY2tn
cm91bmRDb2xvcjsKKyAgICBDb2xvciBtX2JvcmRlckNvbG9yOworCisgICAgU2tSZWN0IG1fZnJh
bWU7CisgICAgU2tNYXRyaXggbV90cmFuc2Zvcm07CisgICAgU2tNYXRyaXggbV9zdWJsYXllclRy
YW5zZm9ybTsKKworICAgIHVpbnQzMl90IG1fZWRnZUFudGlhbGlhc2luZ01hc2s7CisgICAgZmxv
YXQgbV9vcGFjaXR5OworICAgIGZsb2F0IG1felBvc2l0aW9uOworICAgIGZsb2F0IG1fYW5jaG9y
UG9pbnRaOworICAgIGZsb2F0IG1fYm9yZGVyV2lkdGg7CisKKyAgICBib29sIG1fY2xlYXJzQ29u
dGV4dDsKKyAgICBib29sIG1fZG91YmxlU2lkZWQ7CisgICAgYm9vbCBtX2hpZGRlbjsKKyAgICBi
b29sIG1fbWFza3NUb0JvdW5kczsKKyAgICBib29sIG1fb3BhcXVlOworICAgIGJvb2wgbV9nZW9t
ZXRyeUZsaXBwZWQ7CisgICAgYm9vbCBtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdlOworCisg
ICAgQ29udGVudHNHcmF2aXR5VHlwZSBtX2NvbnRlbnRzR3Jhdml0eTsKKyAgICBTdHJpbmcgbV9u
YW1lOworfTsKKworfQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
CisjZW5kaWYKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNTYwMjIpCisrKyBXZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDEgQEAKKzEwLTAzLTE1
ICBWYW5nZWxpcyBLb2trZXZpcyAgPHZhbmdlbGlzQGNocm9taXVtLm9yZz4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGRpbmcgc3VwcG9ydCBmb3Ig
dGhlIEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HIHJlbmRlciBwYXRoIHRvIENocm9taXVtLgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAg
ICAgQ3VycmVudGx5IGNvbXBvc2l0aW5nIG9mIGxheWVycyBpcyBwZXJmb3JtZWQgdmlhIHMvdyBj
b21wb3NpdG9yIHdoaWNoIHJlbGllcyBvbiBTa2lhLiBUaGlzIGlzIGFuIGluaXRpYWwgY2hlY2st
aW4KKyAgICAgICAgYW5kIGl0J3Mgb25seSBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzLiBDb21waWxp
bmcgdGhlIGNvZGUgcmVxdWlyZXMgc2V0aW5nICJ1c2VfYWNjZWxlcmF0ZWRfY29tcG9zaXRpbmc9
MSIKKyAgICAgICAgdG8gR1lQX0RFRklORVMuIFRoZSB1cGRhdGUgb2YgbGF5ZXIgY29udGVudHMg
YW5kIGNvbXBvc2l0aW5nIGlzIGZhaXJseSBpbmVmZmljaWVudCBidXQgdGhpcyB3aWxsIGJlIGZp
eGVkIGluCisgICAgICAgIHN1YnNlcXVlbnQgY2hlY2staW5zLgorCisgICAgICAgICogc3JjL0No
cm9tZUNsaWVudEltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpDaHJvbWVDbGllbnRJbXBsOjph
dHRhY2hSb290R3JhcGhpY3NMYXllcik6CisgICAgICAgIChXZWJLaXQ6OkNocm9tZUNsaWVudElt
cGw6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMpOgorICAgICAgICAqIHNyYy9DaHJvbWVD
bGllbnRJbXBsLmg6CisgICAgICAgIChXZWJLaXQ6OkNocm9tZUNsaWVudEltcGw6OnNldE5lZWRz
T25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24pOgorICAgICAgICAgQWRkZWQgbWV0aG9kcyBy
ZXF1aXJlZCBieSB0aGUgUmVuZGVyTGF5ZXJDb21wb3NpdG9yCisKKyAgICAgICAgKiBzcmMvV2Vi
RnJhbWVJbXBsLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViRnJhbWVJbXBsOjpwYWludFdpdGhD
b250ZXh0KToKKyAgICAgICAgKFdlYktpdDo6V2ViRnJhbWVJbXBsOjpwYWludCk6CisgICAgICAg
ICogc3JjL1dlYkZyYW1lSW1wbC5oOgorICAgICAgICBTcGxpdCBXZWJGcmFtZUltcGw6OnBhaW50
KCkgaW50byB0d28gbWV0aG9kcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGNhbGwgdGhlIHBhaW50
CisgICAgICAgIHJvdXRpbmUgd2l0aCBhbiBleGlzdGluZyBHcmFwaGljc0NvbnRleHQsIHdoaWNo
IGlzIG5lY2Vzc2FyeSBmb3IgcGFpbnRpbmcgdGhlIHJvb3QgbGF5ZXIgaW50bworICAgICAgICBp
dHMgb3duIGJhY2tpbmcgc3VyZmFjZS4KKworICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6
CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChX
ZWJLaXQ6OldlYlZpZXdJbXBsOjpwYWludCk6CisgICAgICAgIE1vZGlmaWVkIG1ldGhvZCB0byBo
YW5kbGUgdGhlIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIHBhdGguIE5vdywgd2hlbiBkb2luZyBh
Y2NlbGVyYXRlZCBjb21wb3NpdGluZywKKyAgICAgICAgcGFpbnQoKSByZXN1bHRzIGluIHJlcGFp
bnRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGxheWVyIGFuZCB0aGVuIGRvaW5nIGEgY29t
cG9zaXRlIG9wZXJhdGlvbi4KKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNldFJvb3RH
cmFwaGljc0xheWVyKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNldEFjY2VsZXJh
dGVkQ29tcG9zaXRpbmcpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6dXBkYXRlUm9v
dExheWVyQ29udGVudHMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6c2V0Um9vdExh
eWVyTmVlZHNEaXNwbGF5KToKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuaDoKKyAgICAgICAg
KFdlYktpdDo6V2ViVmlld0ltcGw6OmlzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyk6CisKIDIwMTAt
MDMtMTUgIE1hcmN1cyBCdWxhY2ggIDxidWxhY2hAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEplcmVteSBPcmxvdy4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21l
Q2xpZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVD
bGllbnRJbXBsLmNwcAkocmV2aXNpb24gNTYwMjIpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL0No
cm9tZUNsaWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5j
bHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNl
QnJpZGdlQ2hyb21pdW0uaCIKICNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZpY2VDaHJvbWl1bS5o
IgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXIuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0Lmgi
CiAjaW5jbHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIk5vZGUuaCIKQEAgLTY5Nyw0ICs2OTgs
MTYgQEAgdm9pZCBDaHJvbWVDbGllbnRJbXBsOjpyZXF1ZXN0R2VvbG9jYXRpbwogICAgIG1fd2Vi
Vmlldy0+Y2xpZW50KCktPmdldEdlb2xvY2F0aW9uU2VydmljZSgpLT5yZXF1ZXN0UGVybWlzc2lv
bkZvckZyYW1lKGdlb2xvY2F0aW9uU2VydmljZS0+Z2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlKCkt
PmdldEJyaWRnZUlkKCksIGZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSk7CiB9CiAKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIENocm9tZUNsaWVudEltcGw6OmF0dGFjaFJv
b3RHcmFwaGljc0xheWVyKEZyYW1lKiBmcmFtZSwgR3JhcGhpY3NMYXllciogZ3JhcGhpY3NMYXll
cikKK3sKKyAgICBtX3dlYlZpZXctPnNldFJvb3RHcmFwaGljc0xheWVyKGdyYXBoaWNzTGF5ZXIg
PyBncmFwaGljc0xheWVyLT5wbGF0Zm9ybUxheWVyKCkgOiAwKTsKK30KKwordm9pZCBDaHJvbWVD
bGllbnRJbXBsOjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKCkKK3sKKyAgICBtX3dlYlZp
ZXctPnNldFJvb3RMYXllck5lZWRzRGlzcGxheSgpOworfQorI2VuZGlmCisKIH0gLy8gbmFtZXNw
YWNlIFdlYktpdApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgJKHJl
dmlzaW9uIDU2MDIyKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTEzMyw2ICsxMzMsMTggQEAgcHVibGljOgogICAgIHZpcnR1YWwg
dm9pZCBuZWVkVG91Y2hFdmVudHMoYm9vbCBuZWVkVG91Y2hFdmVudHMpIHsgfQogI2VuZGlmCiAK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLy8gUGFzcyAwIGFzIHRoZSBH
cmFwaGljc0xheWVyIHRvIGRldGF0Y2ggdGhlIHJvb3QgbGF5ZXIuCisgICAgdmlydHVhbCB2b2lk
IGF0dGFjaFJvb3RHcmFwaGljc0xheWVyKFdlYkNvcmU6OkZyYW1lKiwgV2ViQ29yZTo6R3JhcGhp
Y3NMYXllciopOworCisgICAgLy8gU2V0cyBhIGZsYWcgdG8gc3BlY2lmeSB0aGF0IHRoZSBuZXh0
IHRpbWUgY29udGVudCBpcyBkcmF3biB0byB0aGUgd2luZG93LAorICAgIC8vIHRoZSBjaGFuZ2Vz
IGFwcGVhciBvbiB0aGUgc2NyZWVuIGluIHN5bmNocm9ueSB3aXRoIHVwZGF0ZXMgdG8gR3JhcGhp
Y3NMYXllcnMuCisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJv
bml6YXRpb24oKSB7IH0KKworICAgIC8vIFNldHMgYSBmbGFnIHRvIHNwZWNpZnkgdGhhdCB0aGUg
dmlldyBuZWVkcyB0byBiZSB1cGRhdGVkLCBzbyB3ZSBuZWVkCisgICAgLy8gdG8gZG8gYW4gZWFn
ZXIgbGF5b3V0IGJlZm9yZSB0aGUgZHJhd2luZy4KKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVD
b21wb3NpdGluZ0xheWVyU3luYygpOworI2VuZGlmCiAgICAgLy8gQ2hyb21lQ2xpZW50Q2hyb21p
dW0gbWV0aG9kczoKICAgICB2aXJ0dWFsIHZvaWQgcG9wdXBPcGVuZWQoV2ViQ29yZTo6UG9wdXBD
b250YWluZXIqIHBvcHVwQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBXZWJDb3JlOjpJbnRSZWN0JiBib3VuZHMsCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L1dlYkZyYW1lSW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJG
cmFtZUltcGwuY3BwCShyZXZpc2lvbiA1NjAyMikKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
RnJhbWVJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTc0OCwxMSArMTc0OCwyMyBAQCB2b2lk
IFdlYkZyYW1lSW1wbDo6bGF5b3V0KCkKICAgICAgICAgdmlldy0+bGF5b3V0SWZOZWVkZWRSZWN1
cnNpdmUoKTsKIH0KIAordm9pZCBXZWJGcmFtZUltcGw6OnBhaW50V2l0aENvbnRleHQoR3JhcGhp
Y3NDb250ZXh0JiBnYywgY29uc3QgV2ViUmVjdCYgcmVjdCkKK3sKKyAgICBJbnRSZWN0IGRpcnR5
UmVjdChyZWN0KTsKKyAgICBnYy5zYXZlKCk7CisgICAgaWYgKG1fZnJhbWUtPmRvY3VtZW50KCkg
JiYgZnJhbWVWaWV3KCkpIHsKKyAgICAgICAgZ2MuY2xpcChkaXJ0eVJlY3QpOworICAgICAgICBm
cmFtZVZpZXcoKS0+cGFpbnQoJmdjLCBkaXJ0eVJlY3QpOworICAgICAgICBtX2ZyYW1lLT5wYWdl
KCktPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZHJhd05vZGVIaWdobGlnaHQoZ2MpOworICAgIH0g
ZWxzZQorICAgICAgICBnYy5maWxsUmVjdChkaXJ0eVJlY3QsIENvbG9yOjp3aGl0ZSwgRGV2aWNl
Q29sb3JTcGFjZSk7CisgICAgZ2MucmVzdG9yZSgpOworfQorCiB2b2lkIFdlYkZyYW1lSW1wbDo6
cGFpbnQoV2ViQ2FudmFzKiBjYW52YXMsIGNvbnN0IFdlYlJlY3QmIHJlY3QpCiB7CiAgICAgaWYg
KHJlY3QuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm47Ci0gICAgSW50UmVjdCBkaXJ0eVJlY3Qo
cmVjdCk7CiAjaWYgV0VCS0lUX1VTSU5HX0NHCiAgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNhbnZh
cyk7CiAgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dCgmZ2MpOwpA
QCAtMTc2NCwxNCArMTc3Niw3IEBAIHZvaWQgV2ViRnJhbWVJbXBsOjpwYWludChXZWJDYW52YXMq
IGNhbnYKICNlbHNlCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICNlbmRpZgotICAgIGdjLnNhdmUo
KTsKLSAgICBpZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZVZpZXcoKSkgewotICAgICAg
ICBnYy5jbGlwKGRpcnR5UmVjdCk7Ci0gICAgICAgIGZyYW1lVmlldygpLT5wYWludCgmZ2MsIGRp
cnR5UmVjdCk7Ci0gICAgICAgIG1fZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9yQ29udHJvbGxlcigp
LT5kcmF3Tm9kZUhpZ2hsaWdodChnYyk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGdjLmZpbGxSZWN0
KGRpcnR5UmVjdCwgQ29sb3I6OndoaXRlLCBEZXZpY2VDb2xvclNwYWNlKTsKLSAgICBnYy5yZXN0
b3JlKCk7CisgICAgcGFpbnRXaXRoQ29udGV4dChnYywgcmVjdCk7CiB9CiAKIHZvaWQgV2ViRnJh
bWVJbXBsOjpjcmVhdGVGcmFtZVZpZXcoKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJG
cmFtZUltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZyYW1lSW1w
bC5oCShyZXZpc2lvbiA1NjAyMikKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBs
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJXZWJBbmltYXRp
b25Db250cm9sbGVySW1wbC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBHcmFwaGlj
c0NvbnRleHQ7CiBjbGFzcyBIaXN0b3J5SXRlbTsKIGNsYXNzIEtVUkw7CiBjbGFzcyBOb2RlOwpA
QCAtMTgxLDYgKzE4Miw3IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgbGF5b3V0KCk7CiAgICAgdm9p
ZCBwYWludChXZWJDYW52YXMqLCBjb25zdCBXZWJSZWN0Jik7CisgICAgdm9pZCBwYWludFdpdGhD
b250ZXh0KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCYsIGNvbnN0IFdlYlJlY3QmKTsKICAgICB2
b2lkIGNyZWF0ZUZyYW1lVmlldygpOwogCiAgICAgc3RhdGljIFdlYkZyYW1lSW1wbCogZnJvbUZy
YW1lKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSk7CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dl
YlZpZXdJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJ
bXBsLmNwcAkocmV2aXNpb24gNTYwMjIpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJ
bXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQ2LDYgKzI0NiwxMCBAQCBXZWJWaWV3SW1wbDo6
V2ViVmlld0ltcGwoV2ViVmlld0NsaWVudCogCiAgICAgLCBtX2lzVHJhbnNwYXJlbnQoZmFsc2Up
CiAgICAgLCBtX3RhYnNUb0xpbmtzKGZhbHNlKQogICAgICwgbV9oYXZlTW91c2VDYXB0dXJlKGZh
bHNlKQorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAsIG1fbGF5ZXJSZW5k
ZXJlcigwKQorICAgICwgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoZmFsc2UpCisjZW5kaWYK
IHsKICAgICAvLyBXZWJLaXQvd2luL1dlYlZpZXcuY3BwIGRvZXMgdGhlIHNhbWUgdGhpbmcsIGV4
Y2VwdCB0aGV5IGNhbGwgdGhlCiAgICAgLy8gS0pTIHNwZWNpZmljIHdyYXBwZXIgYXJvdW5kIHRo
aXMgbWV0aG9kLiBXZSBuZWVkIHRvIGhhdmUgdGhyZWFkaW5nCkBAIC04OTIsOSArODk2LDMwIEBA
IHZvaWQgV2ViVmlld0ltcGw6OmxheW91dCgpCiAKIHZvaWQgV2ViVmlld0ltcGw6OnBhaW50KFdl
YkNhbnZhcyogY2FudmFzLCBjb25zdCBXZWJSZWN0JiByZWN0KQogewotICAgIFdlYkZyYW1lSW1w
bCogd2ViZnJhbWUgPSBtYWluRnJhbWVJbXBsKCk7Ci0gICAgaWYgKHdlYmZyYW1lKQotICAgICAg
ICB3ZWJmcmFtZS0+cGFpbnQoY2FudmFzLCByZWN0KTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICBpZiAoIWlzQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpKSB7CisjZW5k
aWYKKyAgICAgICAgV2ViRnJhbWVJbXBsKiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKTsKKyAg
ICAgICAgaWYgKHdlYmZyYW1lKQorICAgICAgICAgICAgd2ViZnJhbWUtPnBhaW50KGNhbnZhcywg
cmVjdCk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIH0gZWxzZSB7Cisg
ICAgICAgIC8vIERyYXcgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGxheWVyLgorICAgICAgICB1
cGRhdGVSb290TGF5ZXJDb250ZW50cyhyZWN0KTsKKworICAgICAgICAvLyBGSVhNRTogTGF5ZXJz
IHNob3VsZCBub3QgYmUgZm9yY2VkIHRvIHJlZHJhdyB0aGVpciBjb250ZW50cworICAgICAgICAv
LyBoZXJlIGJ1dCBzaG91bGQgdXBkYXRlIGFzIG5lZWRlZC4KKyAgICAgICAgbV9sYXllclJlbmRl
cmVyLT51cGRhdGVMYXllckNvbnRlbnRzKCk7CisKKyAgICAgICAgLy8gQ29tcG9zaXRlIGV2ZXJ5
dGhpbmcgaW50byB0aGUgY2FudmFzIHRoYXQncyBwYXNzZWQgdG8gdXMuCisgICAgICAgIFNrSVJl
Y3QgY2FudmFzSVJlY3Q7CisgICAgICAgIGNhbnZhc0lSZWN0LnNldChyZWN0LngsIHJlY3QueSwg
cmVjdC54ICsgcmVjdC53aWR0aCwgcmVjdC55ICsgcmVjdC5oZWlnaHQpOworICAgICAgICBTa1Jl
Y3QgY2FudmFzUmVjdDsKKyAgICAgICAgY2FudmFzUmVjdC5zZXQoY2FudmFzSVJlY3QpOworICAg
ICAgICBtX2xheWVyUmVuZGVyZXItPmRyYXdMYXllcnNJbkNhbnZhcyhzdGF0aWNfY2FzdDxza2lh
OjpQbGF0Zm9ybUNhbnZhcyo+KGNhbnZhcyksIGNhbnZhc1JlY3QpOworICAgIH0KKyNlbmRpZgog
fQogCiAvLyBGSVhNRTogbV9jdXJyZW50SW5wdXRFdmVudCBzaG91bGQgYmUgcmVtb3ZlZCBvbmNl
IENocm9tZUNsaWVudDo6c2hvdygpIGNhbgpAQCAtMTk3Nyw0ICsyMDAyLDc4IEBAIGJvb2wgV2Vi
Vmlld0ltcGw6OnRhYnNUb0xpbmtzKCkgY29uc3QKICAgICByZXR1cm4gbV90YWJzVG9MaW5rczsK
IH0KIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK3ZvaWQgV2ViVmlld0ltcGw6
OnNldFJvb3RHcmFwaGljc0xheWVyKFdlYkNvcmU6OlBsYXRmb3JtTGF5ZXIqIGxheWVyKQorewor
ICAgIHNldEFjY2VsZXJhdGVkQ29tcG9zaXRpbmcobGF5ZXIgPyB0cnVlIDogZmFsc2UpOworICAg
IGlmIChtX2xheWVyUmVuZGVyZXIpCisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+c2V0Um9vdExh
eWVyKGxheWVyKTsKK30KKwordm9pZCBXZWJWaWV3SW1wbDo6c2V0QWNjZWxlcmF0ZWRDb21wb3Np
dGluZyhib29sIGFjY2VsZXJhdGVkKQoreworICAgIGlmIChtX2lzQWNjZWxlcmF0ZWRDb21wb3Np
dGluZyA9PSBhY2NlbGVyYXRlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGFjY2VsZXJh
dGVkKSB7CisgICAgICAgIG1fbGF5ZXJSZW5kZXJlciA9IExheWVyUmVuZGVyZXJTa2lhOjpjcmVh
dGUoKTsKKyAgICAgICAgaWYgKG1fbGF5ZXJSZW5kZXJlcikKKyAgICAgICAgICAgIG1faXNBY2Nl
bGVyYXRlZENvbXBvc2l0aW5nID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2xheWVy
UmVuZGVyZXIgPSAwOworICAgICAgICBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyA9IGZhbHNl
OworICAgIH0KK30KKwordm9pZCBXZWJWaWV3SW1wbDo6dXBkYXRlUm9vdExheWVyQ29udGVudHMo
Y29uc3QgV2ViUmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIWlzQWNjZWxlcmF0ZWRDb21wb3NpdGlu
ZygpKQorICAgICAgICByZXR1cm47CisKKyAgICBXZWJGcmFtZUltcGwqIHdlYmZyYW1lID0gbWFp
bkZyYW1lSW1wbCgpOworICAgIGlmICghd2ViZnJhbWUpCisgICAgICAgIHJldHVybjsKKyAgICBG
cmFtZVZpZXcqIHZpZXcgPSB3ZWJmcmFtZS0+ZnJhbWVWaWV3KCk7CisgICAgaWYgKCF2aWV3KQor
ICAgICAgICByZXR1cm47CisKKyAgICBXZWJSZWN0IHZpZXdSZWN0ID0gdmlldy0+ZnJhbWVSZWN0
KCk7CisgICAgU2tJUmVjdCBzY3JvbGxGcmFtZTsKKyAgICBzY3JvbGxGcmFtZS5zZXQodmlldy0+
c2Nyb2xsWCgpLCB2aWV3LT5zY3JvbGxZKCksIHZpZXctPmxheW91dFdpZHRoKCkgKyB2aWV3LT5z
Y3JvbGxYKCksIHZpZXctPmxheW91dEhlaWdodCgpICsgdmlldy0+c2Nyb2xsWSgpKTsKKyAgICBt
X2xheWVyUmVuZGVyZXItPnNldFNjcm9sbEZyYW1lKHNjcm9sbEZyYW1lKTsKKyAgICBMYXllclNr
aWEqIHJvb3RMYXllciA9IG1fbGF5ZXJSZW5kZXJlci0+cm9vdExheWVyKCk7CisgICAgaWYgKHJv
b3RMYXllcikgeworICAgICAgICBTa0lSZWN0IHJvb3RMYXllckJvdW5kczsKKyAgICAgICAgSW50
UmVjdCB2aXNpYmxlUmVjdCA9IHZpZXctPnZpc2libGVDb250ZW50UmVjdCh0cnVlKTsKKworICAg
ICAgICAvLyBTZXQgdGhlIGJhY2tpbmcgc3RvcmUgc2l6ZSB1c2VkIGJ5IHRoZSByb290IGxheWVy
IHRvIGJlIHRoZSBzaXplIG9mIHRoZSB2aXNpYmxlCisgICAgICAgIC8vIGFyZWEuIE5vdGUgdGhh
dCB0aGUgcm9vdCBsYXllciBib3VuZHMgY291bGQgYmUgbGFyZ2VyIHRoYW4gdGhlIGJhY2tpbmcg
c3RvcmUgc2l6ZSwKKyAgICAgICAgLy8gYnV0IHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHdhc3RlIG1l
bW9yeSBieSBhbGxvY2F0aW5nIGJhY2tpbmcgc3RvcmUgbGFyZ2VyIHRoYW4gdGhlCisgICAgICAg
IC8vIHZpc2libGUgcG9ydGlvbi4KKyAgICAgICAgcm9vdExheWVyQm91bmRzLnNldCgwLCAwLCB2
aXNpYmxlUmVjdC53aWR0aCgpLCB2aXNpYmxlUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIHJvb3RM
YXllci0+c2V0QmFja2luZ1N0b3JlUmVjdChyb290TGF5ZXJCb3VuZHMpOworICAgICAgICBHcmFw
aGljc0NvbnRleHQqIHJvb3RMYXllckNvbnRleHQgPSByb290TGF5ZXItPmdyYXBoaWNzQ29udGV4
dCgpOworICAgICAgICByb290TGF5ZXJDb250ZXh0LT5zYXZlKCk7CisKKyAgICAgICAgd2ViZnJh
bWUtPnBhaW50V2l0aENvbnRleHQoKihyb290TGF5ZXItPmdyYXBoaWNzQ29udGV4dCgpKSwgcmVj
dCk7CisgICAgICAgIHJvb3RMYXllckNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICB9Cit9CisKK3Zv
aWQgV2ViVmlld0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlzcGxheSgpCit7CisgICAgLy8gRklY
TUU6IEZvciBub3cgd2UncmUgcG9zdGluZyBhIHJlcGFpbnQgZXZlbnQgZm9yIHRoZSBlbnRpcmUg
cGFnZSB3aGljaCBpcyBhbiBvdmVya2lsbC4KKyAgICBpZiAoV2ViRnJhbWVJbXBsKiB3ZWJmcmFt
ZSA9IG1haW5GcmFtZUltcGwoKSkgeworICAgICAgICBpZiAoRnJhbWVWaWV3KiB2aWV3ID0gd2Vi
ZnJhbWUtPmZyYW1lVmlldygpKSB7CisgICAgICAgICAgICBJbnRSZWN0IHZpc2libGVSZWN0ID0g
dmlldy0+dmlzaWJsZUNvbnRlbnRSZWN0KHRydWUpOworICAgICAgICAgICAgbV9jbGllbnQtPmRp
ZEludmFsaWRhdGVSZWN0KHZpc2libGVSZWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
IChtX2xheWVyUmVuZGVyZXIpCisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+c2V0TmVlZHNEaXNw
bGF5KCk7Cit9CisKKyNlbmRpZgorCiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFdlYktp
dC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21p
dW0vc3JjL1dlYlZpZXdJbXBsLmgJKHJldmlzaW9uIDU2MDIyKQorKysgV2ViS2l0L2Nocm9taXVt
L3NyYy9XZWJWaWV3SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC00Myw3ICs0Myw5IEBACiAjaW5j
bHVkZSAiQ29udGV4dE1lbnVDbGllbnRJbXBsLmgiCiAjaW5jbHVkZSAiRHJhZ0NsaWVudEltcGwu
aCIKICNpbmNsdWRlICJFZGl0b3JDbGllbnRJbXBsLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NMYXll
ci5oIgogI2luY2x1ZGUgIkluc3BlY3RvckNsaWVudEltcGwuaCIKKyNpbmNsdWRlICJMYXllclJl
bmRlcmVyU2tpYS5oIgogI2luY2x1ZGUgIk5vdGlmaWNhdGlvblByZXNlbnRlckltcGwuaCIKIAog
I2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KQEAgLTI5OCw2ICszMDAsMTEgQEAgcHVibGljOgogICAg
ICAgICByZXR1cm4gbV9jdXJyZW50SW5wdXRFdmVudDsKICAgICB9CiAKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisgICAgdm9pZCBzZXRSb290TGF5ZXJOZWVkc0Rpc3BsYXkoKTsK
KyAgICB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKFdlYkNvcmU6OlBsYXRmb3JtTGF5ZXIqKTsK
KyNlbmRpZgorCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBXZWJWaWV3OyAgLy8gU28gV2Vi
Vmlldzo6Q3JlYXRlIGNhbiBjYWxsIG91ciBjb25zdHJ1Y3RvcgogICAgIGZyaWVuZCBjbGFzcyBX
VEY6OlJlZkNvdW50ZWQ8V2ViVmlld0ltcGw+OwpAQCAtMzIzLDYgKzMzMCwxMiBAQCBwcml2YXRl
OgogICAgIC8vIHRoZSBIaXRUZXN0UmVzdWx0IGZvciBpdC4KICAgICBXZWJDb3JlOjpIaXRUZXN0
UmVzdWx0IGhpdFRlc3RSZXN1bHRGb3JXaW5kb3dQb3MoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQm
KTsKIAorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB2b2lkIHNldEFjY2Vs
ZXJhdGVkQ29tcG9zaXRpbmcoYm9vbCk7CisgICAgYm9vbCBpc0FjY2VsZXJhdGVkQ29tcG9zaXRp
bmcoKSBjb25zdCB7IHJldHVybiBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZzsgfQorICAgIHZv
aWQgdXBkYXRlUm9vdExheWVyQ29udGVudHMoY29uc3QgV2ViUmVjdCYpOworI2VuZGlmCisKICAg
ICBXZWJWaWV3Q2xpZW50KiBtX2NsaWVudDsKIAogICAgIEJhY2tGb3J3YXJkTGlzdENsaWVudElt
cGwgbV9iYWNrRm9yd2FyZExpc3RDbGllbnRJbXBsOwpAQCAtNDUwLDYgKzQ2MywxMCBAQCBwcml2
YXRlOgogCiAgICAgYm9vbCBtX2hhdmVNb3VzZUNhcHR1cmU7CiAKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgT3duUHRyPFdlYkNvcmU6OkxheWVyUmVuZGVyZXJTa2lhPiBt
X2xheWVyUmVuZGVyZXI7CisgICAgYm9vbCBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZzsKKyNl
bmRpZgogICAgIHN0YXRpYyBjb25zdCBXZWJJbnB1dEV2ZW50KiBtX2N1cnJlbnRJbnB1dEV2ZW50
OwogfTsKIAo=
</data>
<flag name="review"
          id="34037"
          type_id="1"
          status="+"
          setter="levin"
    />
    <flag name="commit-queue"
          id="34156"
          type_id="3"
          status="-"
          setter="commit-queue"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51078</attachid>
            <date>2010-03-18 12:57:55 -0700</date>
            <delta_ts>2010-03-18 22:46:23 -0700</delta_ts>
            <desc>Fixed changelog entries so that the patch can be applied correctly (hopefully)</desc>
            <filename>skiaCompositor_6.txt</filename>
            <type>text/plain</type>
            <size>62186</size>
            <attacher name="Vangelis Kokkevis">vangelis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NjE4MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzAgQEAKKzIwMTAtMDMtMTggIFZhbmdlbGlzIEtva2tldmlzICA8dmFuZ2VsaXNA
Y2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEltcGxlbWVudCBzb2Z0d2FyZSBjb21wb3NpdGVkIGdyYXBoaWNzIGxheWVycyBpbiBD
aHJvbWl1bSB1c2luZyB0aGUgU2tpYSBsaWJyYXJ5LgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAgICAgVGhpcyBpcyBhbiBpbml0aWFs
IHN0ZXAgaW4gdGhlIGltcGxlbWVudGF0aW9uLiBMYXllciBjb21wb3NpdGluZyBpcyBmdW5jdGlv
bmluZworICAgICAgICBidXQgbm90IG9wdGltaXplZCBpbiBhbnkgd2F5LiBTdWJzZXNxdWVudCBj
aGVjay1pbnMgd2lsbCBiZSBuZWNlc3NhcnkgdG8gZmluZSB0dW5lCisgICAgICAgIGl0LgorCisg
ICAgICAgIFRlc3Q6IE5vIG5ldyBleHBvc2VkIGZ1bmN0aW9uYWxpdHkgc28gbm8gbmV3IHRlc3Rz
LgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAgIEFkZGVkIG5ldyBzb3VyY2Ug
ZmlsZXMgdG8gdGhlIGNocm9taXVtIGJ1aWxkCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
R3JhcGhpY3NMYXllci5oOgorICAgICAgICAgIEFkZGVkIG5lY2Vzc2FyeSB0eXBlZGVmJ3MgYW5k
IGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBDaHJvbWl1bS4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0xheWVyU2tpYS5oOiBBZGRlZC4KKyAgICAgICAg
ICBEZWNsYXJhdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmlj
IEdyYXBoaWNzTGF5ZXIgY2xhc3MuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9M
YXllclJlbmRlcmVyU2tpYS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L3NraWEvTGF5ZXJSZW5kZXJlclNraWEuaDogQWRkZWQuCisgICAgICAgICAgRGVjbGFyYXRpb24g
YW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTa2lhLWJhc2VkIHNvZnR3YXJlIGNvbXBvc2l0b3Iu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclNraWEuY3BwOiBBZGRlZC4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5oOiBBZGRlZC4KKyAg
ICAgICAgICBEZWNsYXJhdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgYSBjb21wb3NpdGFibGUg
bGF5ZXIgdGhhdCB1c2VzIGEgU2tpYSBjYW52YXMKKyAgICAgICAgICBmb3IgYmFja2luZyBzdG9y
ZS4KKwogMjAxMC0wMy0xOCAgRGF2aWQgSHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgU2ltb24gRnJhc2VyLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cGkK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDU2MTc5KQorKysg
V2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTIxNzYsMTAgKzIxNzYsMTYg
QEAKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZS5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dy
YXBoaWNzQ29udGV4dFNraWEuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL0dyYXBoaWNzQ29udGV4dDNEU2tpYS5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmgnLAogICAgICAgICAgICAgJ3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcCcsCiAgICAgICAgICAgICAncGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNraWEuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0ludFBvaW50U2tpYS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvSW50UmVjdFNraWEuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9n
cmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lhLmNwcCcsCisgICAgICAgICAgICAncGxhdGZv
cm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5oJywKKyAgICAgICAgICAgICdwbGF0
Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL3NraWEvTmF0aXZlSW1hZ2VTa2lhLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9OYXRpdmVJbWFnZVNraWEuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9QYXRoU2tpYS5jcHAnLApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0xheWVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0xheWVyLmgJKHJldmlzaW9uIDU2MTc5KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9HcmFwaGljc0xheWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTYzLDYgKzYzLDEyIEBA
IHR5cGVkZWYgdm9pZCogTmF0aXZlTGF5ZXI7CiBjbGFzcyBRR3JhcGhpY3NJdGVtOwogdHlwZWRl
ZiBRR3JhcGhpY3NJdGVtIFBsYXRmb3JtTGF5ZXI7CiB0eXBlZGVmIFFHcmFwaGljc0l0ZW0qIE5h
dGl2ZUxheWVyOworI2VsaWYgUExBVEZPUk0oQ0hST01JVU0pCituYW1lc3BhY2UgV2ViQ29yZSB7
CitjbGFzcyBMYXllclNraWE7Cit0eXBlZGVmIExheWVyU2tpYSBQbGF0Zm9ybUxheWVyOwordHlw
ZWRlZiB2b2lkKiBOYXRpdmVMYXllcjsKK30KICNlbHNlCiB0eXBlZGVmIHZvaWQqIFBsYXRmb3Jt
TGF5ZXI7CiB0eXBlZGVmIHZvaWQqIE5hdGl2ZUxheWVyOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NMYXllclNraWEuY3BwCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lh
LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisvKiogRklYTUUKKyAqIFRoaXMgZmls
ZSBib3Jyb3dzIGNvZGUgaGVhdmlseSBmcm9tIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9HcmFwaGlj
c0xheWVyQ0FDRi5jcHAKKyAqIChhbmQgaGVuY2UgaXQgaW5jbHVkZXMgYm90aCBjb3B5cmlnaHRz
KQorICogSWRlYWxseSB0aGUgY29tbW9uIGNvZGUgKG1vc3RseSB0aGUgY29kZSB0aGF0IGtlZXBz
IHRyYWNrIG9mIHRoZSBsYXllciBoaWVyYXJjaHkpCisgKiBzaG91bGQgYmUga2VwdCBzZXBhcmF0
ZSBhbmQgc2hhcmVkIGJldHdlZW4gcGxhdGZvcm1zLiBJdCB3b3VsZCBiZSBhIHdlbGwgd29ydGh3
aGlsZQorICogZWZmb3J0IG9uY2UgdGhlIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gKGJpbmFyaWVz
IGFuZCBoZWFkZXJzKSBvZiBDb3JlQW5pbWF0aW9uIGlzCisgKiBjaGVja2VkIGluIHRvIHRoZSBX
ZWJLaXQgcmVwb3NpdG9yeS4gVW50aWwgdGhlbiBvbmx5IEFwcGxlIGNhbiBtYWtlIHRoaXMgaGFw
cGVuLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKworI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJTa2lhLmgiCisKKyNpbmNsdWRl
ICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiRmxv
YXRSZWN0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJMYXllclNraWEuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNs
dWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvU3RyaW5nRXh0cmFzLmg+CisK
K3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZv
aWQgc2V0TGF5ZXJCb3JkZXJDb2xvcihMYXllclNraWEmIGxheWVyLCBjb25zdCBDb2xvciYgY29s
b3IpCit7CisgICAgbGF5ZXIuc2V0Qm9yZGVyQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9p
ZCBjbGVhckJvcmRlckNvbG9yKExheWVyU2tpYSYgbGF5ZXIpCit7CisgICAgbGF5ZXIuc2V0Qm9y
ZGVyQ29sb3IoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldExheWVyQmFja2dyb3VuZENvbG9yKExh
eWVyU2tpYSYgbGF5ZXIsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBsYXllci5zZXRCYWNr
Z3JvdW5kQ29sb3IoY29sb3IpOworfQorCitzdGF0aWMgdm9pZCBjbGVhckxheWVyQmFja2dyb3Vu
ZENvbG9yKExheWVyU2tpYSYgbGF5ZXIpCit7CisgICAgbGF5ZXIuc2V0QmFja2dyb3VuZENvbG9y
KDApOworfQorCitHcmFwaGljc0xheWVyOjpDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50YXRp
b24gR3JhcGhpY3NMYXllcjo6Y29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uKCkKK3sK
KyAgICByZXR1cm4gQ29tcG9zaXRpbmdDb29yZGluYXRlc0JvdHRvbVVwOworfQorCitQYXNzT3du
UHRyPEdyYXBoaWNzTGF5ZXI+IEdyYXBoaWNzTGF5ZXI6OmNyZWF0ZShHcmFwaGljc0xheWVyQ2xp
ZW50KiBjbGllbnQpCit7CisgICAgcmV0dXJuIG5ldyBHcmFwaGljc0xheWVyU2tpYShjbGllbnQp
OworfQorCitHcmFwaGljc0xheWVyU2tpYTo6R3JhcGhpY3NMYXllclNraWEoR3JhcGhpY3NMYXll
ckNsaWVudCogY2xpZW50KQorICAgIDogR3JhcGhpY3NMYXllcihjbGllbnQpCisgICAgLCBtX2Nv
bnRlbnRzTGF5ZXJQdXJwb3NlKE5vQ29udGVudHNMYXllcikKKyAgICAsIG1fY29udGVudHNMYXll
ckhhc0JhY2tncm91bmRDb2xvcihmYWxzZSkKK3sKKyAgICBtX2xheWVyID0gTGF5ZXJTa2lhOjpj
cmVhdGUoTGF5ZXJTa2lhOjpMYXllciwgdGhpcyk7CisKKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRv
cnMoKTsKK30KKworR3JhcGhpY3NMYXllclNraWE6On5HcmFwaGljc0xheWVyU2tpYSgpCit7Cisg
ICAgLy8gQ2xlYW4gdXAgdGhlIFNraWEgbGF5ZXIuCisgICAgaWYgKG1fbGF5ZXIpCisgICAgICAg
IG1fbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisKKyAgICBpZiAobV90cmFuc2Zvcm1M
YXllcikKKyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsK
K30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0TmFtZShjb25zdCBTdHJpbmcmIGluTmFt
ZSkKK3sKKyAgICBTdHJpbmcgbmFtZSA9IFN0cmluZzo6Zm9ybWF0KCJHcmFwaGljc0xheWVyU2tp
YSglcCkgR3JhcGhpY3NMYXllciglcCkgIiwgbV9sYXllci5nZXQoKSwgdGhpcykgKyBpbk5hbWU7
CisgICAgR3JhcGhpY3NMYXllcjo6c2V0TmFtZShuYW1lKTsKK30KKworTmF0aXZlTGF5ZXIgR3Jh
cGhpY3NMYXllclNraWE6Om5hdGl2ZUxheWVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9sYXll
ci5nZXQoKTsKK30KKworYm9vbCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q2hpbGRyZW4oY29uc3Qg
VmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiYgY2hpbGRyZW4pCit7CisgICAgYm9vbCBjaGlsZHJlbkNo
YW5nZWQgPSBHcmFwaGljc0xheWVyOjpzZXRDaGlsZHJlbihjaGlsZHJlbik7CisgICAgLy8gRklY
TUU6IEdyYXBoaWNzTGF5ZXI6OnNldENoaWxkcmVuIGNhbGxzIGFkZENoaWxkKCkgZm9yIGVhY2gg
c3VibGF5ZXIsIHdoaWNoCisgICAgLy8gd2lsbCBlbmQgdXAgY2FsbGluZyB1cGRhdGVTdWJsYXll
ckxpc3QoKSBOIHRpbWVzLgorICAgIGlmIChjaGlsZHJlbkNoYW5nZWQpCisgICAgICAgIHVwZGF0
ZVN1YmxheWVyTGlzdCgpOworCisgICAgcmV0dXJuIGNoaWxkcmVuQ2hhbmdlZDsKK30KKwordm9p
ZCBHcmFwaGljc0xheWVyU2tpYTo6YWRkQ2hpbGQoR3JhcGhpY3NMYXllciogY2hpbGRMYXllcikK
K3sKKyAgICBHcmFwaGljc0xheWVyOjphZGRDaGlsZChjaGlsZExheWVyKTsKKyAgICB1cGRhdGVT
dWJsYXllckxpc3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6YWRkQ2hpbGRBdElu
ZGV4KEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIGludCBpbmRleCkKK3sKKyAgICBHcmFwaGlj
c0xheWVyOjphZGRDaGlsZEF0SW5kZXgoY2hpbGRMYXllciwgaW5kZXgpOworICAgIHVwZGF0ZVN1
YmxheWVyTGlzdCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjphZGRDaGlsZEJlbG93
KEdyYXBoaWNzTGF5ZXIqIGNoaWxkTGF5ZXIsIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpCit7Cisg
ICAgR3JhcGhpY3NMYXllcjo6YWRkQ2hpbGRCZWxvdyhjaGlsZExheWVyLCBzaWJsaW5nKTsKKyAg
ICB1cGRhdGVTdWJsYXllckxpc3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6YWRk
Q2hpbGRBYm92ZShHcmFwaGljc0xheWVyKiBjaGlsZExheWVyLCBHcmFwaGljc0xheWVyICpzaWJs
aW5nKQoreworICAgIEdyYXBoaWNzTGF5ZXI6OmFkZENoaWxkQWJvdmUoY2hpbGRMYXllciwgc2li
bGluZyk7CisgICAgdXBkYXRlU3VibGF5ZXJMaXN0KCk7Cit9CisKK2Jvb2wgR3JhcGhpY3NMYXll
clNraWE6OnJlcGxhY2VDaGlsZChHcmFwaGljc0xheWVyKiBvbGRDaGlsZCwgR3JhcGhpY3NMYXll
ciogbmV3Q2hpbGQpCit7CisgICAgaWYgKEdyYXBoaWNzTGF5ZXI6OnJlcGxhY2VDaGlsZChvbGRD
aGlsZCwgbmV3Q2hpbGQpKSB7CisgICAgICAgIHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJTa2lhOjpyZW1vdmVGcm9tUGFyZW50KCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpy
ZW1vdmVGcm9tUGFyZW50KCk7CisgICAgbGF5ZXJGb3JTdXBlcmxheWVyKCktPnJlbW92ZUZyb21T
dXBlcmxheWVyKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFBvc2l0aW9uKGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFBvc2l0aW9u
KHBvaW50KTsKKyAgICB1cGRhdGVMYXllclBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllclNraWE6OnNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgcG9pbnQpCit7Cisg
ICAgaWYgKHBvaW50ID09IG1fYW5jaG9yUG9pbnQpCisgICAgICAgIHJldHVybjsKKworICAgIEdy
YXBoaWNzTGF5ZXI6OnNldEFuY2hvclBvaW50KHBvaW50KTsKKyAgICB1cGRhdGVBbmNob3JQb2lu
dCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRTaXplKGNvbnN0IEZsb2F0U2l6
ZSYgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA9PSBtX3NpemUpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEdyYXBoaWNzTGF5ZXI6OnNldFNpemUoc2l6ZSk7CisgICAgdXBkYXRlTGF5ZXJTaXplKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdHJhbnNmb3JtKQoreworICAgIGlmICh0cmFuc2Zvcm0gPT0gbV90cmFu
c2Zvcm0pCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldFRyYW5zZm9y
bSh0cmFuc2Zvcm0pOworICAgIHVwZGF0ZVRyYW5zZm9ybSgpOworfQorCit2b2lkIEdyYXBoaWNz
TGF5ZXJTa2lhOjpzZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgdHJhbnNmb3JtKQoreworICAgIGlmICh0cmFuc2Zvcm0gPT0gbV9jaGlsZHJlblRyYW5zZm9y
bSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q2hpbGRyZW5UcmFu
c2Zvcm0odHJhbnNmb3JtKTsKKyAgICB1cGRhdGVDaGlsZHJlblRyYW5zZm9ybSgpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRQcmVzZXJ2ZXMzRChib29sIHByZXNlcnZlczNEKQor
eworICAgIGlmIChwcmVzZXJ2ZXMzRCA9PSBtX3ByZXNlcnZlczNEKQorICAgICAgICByZXR1cm47
CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRQcmVzZXJ2ZXMzRChwcmVzZXJ2ZXMzRCk7CisgICAg
dXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpz
ZXRNYXNrc1RvQm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykKK3sKKyAgICBpZiAobWFza3NUb0Jv
dW5kcyA9PSBtX21hc2tzVG9Cb3VuZHMpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNz
TGF5ZXI6OnNldE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5kcyk7CisgICAgdXBkYXRlTWFza3NU
b0JvdW5kcygpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXREcmF3c0NvbnRlbnQo
Ym9vbCBkcmF3c0NvbnRlbnQpCit7CisgICAgaWYgKGRyYXdzQ29udGVudCA9PSBtX2RyYXdzQ29u
dGVudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0RHJhd3NDb250
ZW50KGRyYXdzQ29udGVudCk7CisgICAgdXBkYXRlTGF5ZXJEcmF3c0NvbnRlbnQoKTsKK30KKwor
dm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBj
b2xvcikKK3sKKyAgICBpZiAobV9iYWNrZ3JvdW5kQ29sb3JTZXQgJiYgbV9iYWNrZ3JvdW5kQ29s
b3IgPT0gY29sb3IpCisgICAgICAgIHJldHVybjsKKworICAgIEdyYXBoaWNzTGF5ZXI6OnNldEJh
Y2tncm91bmRDb2xvcihjb2xvcik7CisKKyAgICBtX2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5k
Q29sb3IgPSB0cnVlOworICAgIHVwZGF0ZUxheWVyQmFja2dyb3VuZENvbG9yKCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NMYXllclNraWE6OmNsZWFyQmFja2dyb3VuZENvbG9yKCkKK3sKKyAgICBpZiAo
IW1fYmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICByZXR1cm47CisKKyAgICBHcmFwaGljc0xh
eWVyOjpjbGVhckJhY2tncm91bmRDb2xvcigpOworICAgIGNsZWFyTGF5ZXJCYWNrZ3JvdW5kQ29s
b3IoKm1fY29udGVudHNMYXllcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldENv
bnRlbnRzT3BhcXVlKGJvb2wgb3BhcXVlKQoreworICAgIGlmIChtX2NvbnRlbnRzT3BhcXVlID09
IG9wYXF1ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0Q29udGVu
dHNPcGFxdWUob3BhcXVlKTsKKyAgICB1cGRhdGVDb250ZW50c09wYXF1ZSgpOworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJTa2lhOjpzZXRCYWNrZmFjZVZpc2liaWxpdHkoYm9vbCB2aXNpYmxlKQor
eworICAgIGlmIChtX2JhY2tmYWNlVmlzaWJpbGl0eSA9PSB2aXNpYmxlKQorICAgICAgICByZXR1
cm47CisKKyAgICBHcmFwaGljc0xheWVyOjpzZXRCYWNrZmFjZVZpc2liaWxpdHkodmlzaWJsZSk7
CisgICAgdXBkYXRlQmFja2ZhY2VWaXNpYmlsaXR5KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXll
clNraWE6OnNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBmbG9hdCBjbGFtcGVkT3Bh
Y2l0eSA9IG1heChtaW4ob3BhY2l0eSwgMS4wZiksIDAuMGYpOworCisgICAgaWYgKG1fb3BhY2l0
eSA9PSBjbGFtcGVkT3BhY2l0eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXll
cjo6c2V0T3BhY2l0eShjbGFtcGVkT3BhY2l0eSk7CisgICAgcHJpbWFyeUxheWVyKCktPnNldE9w
YWNpdHkob3BhY2l0eSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnNldE5lZWRzRGlz
cGxheSgpCit7CisgICAgaWYgKGRyYXdzQ29udGVudCgpKQorICAgICAgICBtX2xheWVyLT5zZXRO
ZWVkc0Rpc3BsYXkoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0TmVlZHNEaXNw
bGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoZHJhd3NDb250ZW50
KCkpCisgICAgICAgIG1fbGF5ZXItPnNldE5lZWRzRGlzcGxheShyZWN0KTsKK30KKwordm9pZCBH
cmFwaGljc0xheWVyU2tpYTo6c2V0Q29udGVudHNSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKHJlY3QgPT0gbV9jb250ZW50c1JlY3QpCisgICAgICAgIHJldHVybjsKKworICAg
IEdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRzUmVjdChyZWN0KTsKKyAgICB1cGRhdGVDb250ZW50
c1JlY3QoKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6c2V0Q29udGVudHNUb0ltYWdl
KEltYWdlKiBpbWFnZSkKK3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50Cit9CisKK3ZvaWQgR3Jh
cGhpY3NMYXllclNraWE6OnNldENvbnRlbnRzVG9WaWRlbyhQbGF0Zm9ybUxheWVyKiB2aWRlb0xh
eWVyKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xheWVy
U2tpYTo6c2V0R2VvbWV0cnlPcmllbnRhdGlvbihDb21wb3NpdGluZ0Nvb3JkaW5hdGVzT3JpZW50
YXRpb24gb3JpZW50YXRpb24pCit7CisgICAgaWYgKG9yaWVudGF0aW9uID09IG1fZ2VvbWV0cnlP
cmllbnRhdGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgR3JhcGhpY3NMYXllcjo6c2V0R2Vv
bWV0cnlPcmllbnRhdGlvbihvcmllbnRhdGlvbik7CisgICAgdXBkYXRlR2VvbWV0cnlPcmllbnRh
dGlvbigpOworfQorCitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyU2tpYTo6aG9zdExheWVy
Rm9yU3VibGF5ZXJzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1MYXllciA/IG1f
dHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVyLmdldCgpOworfQorCitQbGF0Zm9ybUxheWVy
KiBHcmFwaGljc0xheWVyU2tpYTo6bGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV90cmFuc2Zvcm1MYXllciA/IG1fdHJhbnNmb3JtTGF5ZXIuZ2V0KCkgOiBtX2xheWVy
LmdldCgpOworfQorCitQbGF0Zm9ybUxheWVyKiBHcmFwaGljc0xheWVyU2tpYTo6cGxhdGZvcm1M
YXllcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHByaW1hcnlMYXllcigpOworfQorCit2b2lkIEdy
YXBoaWNzTGF5ZXJTa2lhOjpzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYgY29s
b3IpCit7CisgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgc2V0TGF5ZXJCYWNrZ3Jv
dW5kQ29sb3IoKm1fbGF5ZXIsIGNvbG9yKTsKKyAgICBlbHNlCisgICAgICAgIGNsZWFyTGF5ZXJC
YWNrZ3JvdW5kQ29sb3IoKm1fbGF5ZXIpOworfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjpz
ZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYgY29sb3IsIGZsb2F0IGJvcmRlcldpZHRoKQorewor
ICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgc2V0TGF5ZXJCb3JkZXJDb2xvcigq
bV9sYXllciwgY29sb3IpOworICAgICAgICBtX2xheWVyLT5zZXRCb3JkZXJXaWR0aChib3JkZXJX
aWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xlYXJCb3JkZXJDb2xvcigqbV9sYXllcik7
CisgICAgICAgIG1fbGF5ZXItPnNldEJvcmRlcldpZHRoKDApOworICAgIH0KK30KKwordm9pZCBH
cmFwaGljc0xheWVyU2tpYTo6dXBkYXRlU3VibGF5ZXJMaXN0KCkKK3sKKyAgICBWZWN0b3I8UmVm
UHRyPExheWVyU2tpYT4gPiBuZXdTdWJsYXllcnM7CisKKyAgICBpZiAobV90cmFuc2Zvcm1MYXll
cikgeworICAgICAgICAvLyBBZGQgdGhlIHByaW1hcnkgbGF5ZXIgZmlyc3QuIEV2ZW4gaWYgd2Ug
aGF2ZSBuZWdhdGl2ZSB6LW9yZGVyIGNoaWxkcmVuLCB0aGUgcHJpbWFyeSBsYXllciBhbHdheXMg
Y29tZXMgYmVoaW5kLgorICAgICAgICBuZXdTdWJsYXllcnMuYXBwZW5kKG1fbGF5ZXIuZ2V0KCkp
OworICAgIH0gZWxzZSBpZiAobV9jb250ZW50c0xheWVyKSB7CisgICAgICAgIC8vIEZJWE1FOiBh
ZGQgdGhlIGNvbnRlbnRzIGxheWVyIGluIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggbmVnYXRpdmUg
ei1vcmRlciBjaGlsZHJlbi4KKyAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjYXVzZSB2aXNpYmxl
IHJlbmRlcmluZyBpc3N1ZXMgYmVjYXVzZSBjdXJyZW50bHkgY29udGVudHMgbGF5ZXJzIGFyZSBv
bmx5IHVzZWQKKyAgICAgICAgLy8gZm9yIHJlcGxhY2VkIGVsZW1lbnRzIHRoYXQgZG9uJ3QgaGF2
ZSBjaGlsZHJlbi4KKyAgICAgICAgbmV3U3VibGF5ZXJzLmFwcGVuZChtX2NvbnRlbnRzTGF5ZXIu
Z2V0KCkpOworICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxHcmFwaGljc0xheWVyKj4mIGNoaWxk
TGF5ZXJzID0gY2hpbGRyZW4oKTsKKyAgICBzaXplX3QgbnVtQ2hpbGRyZW4gPSBjaGlsZExheWVy
cy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgKytpKSB7
CisgICAgICAgIEdyYXBoaWNzTGF5ZXJTa2lhKiBjdXJDaGlsZCA9IHN0YXRpY19jYXN0PEdyYXBo
aWNzTGF5ZXJTa2lhKj4oY2hpbGRMYXllcnNbaV0pOworCisgICAgICAgIExheWVyU2tpYSogY2hp
bGRMYXllciA9IGN1ckNoaWxkLT5sYXllckZvclN1cGVybGF5ZXIoKTsKKyAgICAgICAgbmV3U3Vi
bGF5ZXJzLmFwcGVuZChjaGlsZExheWVyKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IG5ld1N1YmxheWVycy5zaXplKCk7ICsraSkKKyAgICAgICAgbmV3U3VibGF5ZXJzW2ld
LT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworCisgICAgaWYgKG1fdHJhbnNmb3JtTGF5ZXIpIHsK
KyAgICAgICAgbV90cmFuc2Zvcm1MYXllci0+c2V0U3VibGF5ZXJzKG5ld1N1YmxheWVycyk7CisK
KyAgICAgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2
ZSBhIHRyYW5zZm9ybSBsYXllciwgdGhlbiB0aGUgY29udGVudHMgbGF5ZXIgaXMgcGFyZW50ZWQg
aW4gdGhlCisgICAgICAgICAgICAvLyBwcmltYXJ5IGxheWVyICh3aGljaCBpcyBpdHNlbGYgYSBj
aGlsZCBvZiB0aGUgdHJhbnNmb3JtIGxheWVyKS4KKyAgICAgICAgICAgIG1fbGF5ZXItPnJlbW92
ZUFsbFN1YmxheWVycygpOworICAgICAgICAgICAgbV9sYXllci0+YWRkU3VibGF5ZXIobV9jb250
ZW50c0xheWVyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBtX2xheWVyLT5zZXRT
dWJsYXllcnMobmV3U3VibGF5ZXJzKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBk
YXRlTGF5ZXJQb3NpdGlvbigpCit7CisgICAgLy8gUG9zaXRpb24gaXMgb2Zmc2V0IG9uIHRoZSBs
YXllciBieSB0aGUgbGF5ZXIgYW5jaG9yIHBvaW50LgorICAgIFNrUG9pbnQgbGF5ZXJQb3NpdGlv
bjsKKyAgICBsYXllclBvc2l0aW9uLnNldChtX3Bvc2l0aW9uLngoKSArIG1fYW5jaG9yUG9pbnQu
eCgpICogbV9zaXplLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgbV9wb3NpdGlvbi55
KCkgKyBtX2FuY2hvclBvaW50LnkoKSAqIG1fc2l6ZS5oZWlnaHQoKSk7CisKKyAgICBwcmltYXJ5
TGF5ZXIoKS0+c2V0UG9zaXRpb24obGF5ZXJQb3NpdGlvbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NM
YXllclNraWE6OnVwZGF0ZUxheWVyU2l6ZSgpCit7CisgICAgU2tJUmVjdCByZWN0OworICAgIHJl
Y3Quc2V0KDAsIDAsIG1fc2l6ZS53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkpOworICAgIGlmICht
X3RyYW5zZm9ybUxheWVyKSB7CisgICAgICAgIG1fdHJhbnNmb3JtTGF5ZXItPnNldEJvdW5kcyhy
ZWN0KTsKKyAgICAgICAgLy8gVGhlIGFuY2hvciBvZiB0aGUgY29udGVudHMgbGF5ZXIgaXMgYWx3
YXlzIGF0IDAuNSwgMC41LCBzbyB0aGUgcG9zaXRpb24gaXMgY2VudGVyLXJlbGF0aXZlLgorICAg
ICAgICBTa1BvaW50IGNlbnRlclBvaW50OworICAgICAgICBjZW50ZXJQb2ludC5zZXQobV9zaXpl
LndpZHRoKCkgLyAyLjBmLCBtX3NpemUuaGVpZ2h0KCkgLyAyLjBmKTsKKyAgICAgICAgbV9sYXll
ci0+c2V0UG9zaXRpb24oY2VudGVyUG9pbnQpOworICAgIH0KKworICAgIG1fbGF5ZXItPnNldEJv
dW5kcyhyZWN0KTsKKworICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCByZXNpemUgbV9jb250ZW50
c0xheWVyLiBJdCdzIHVwIHRoZSBjYWxsZXIgdG8gZG8gdGhhdC4KKworICAgIC8vIElmIHdlJ3Zl
IGNoYW5nZWQgdGhlIGJvdW5kcywgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24K
KyAgICAvLyBvZiB0aGUgbGF5ZXIsIHRha2luZyBhbmNob3IgcG9pbnQgaW50byBhY2NvdW50Lgor
ICAgIHVwZGF0ZUxheWVyUG9zaXRpb24oKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6
dXBkYXRlQW5jaG9yUG9pbnQoKQoreworICAgIFNrUG9pbnQgYW5jaG9yUG9pbnQ7CisgICAgYW5j
aG9yUG9pbnQuc2V0KG1fYW5jaG9yUG9pbnQueCgpLCBtX2FuY2hvclBvaW50LnkoKSk7CisgICAg
cHJpbWFyeUxheWVyKCktPnNldEFuY2hvclBvaW50KGFuY2hvclBvaW50KTsKKyAgICBwcmltYXJ5
TGF5ZXIoKS0+c2V0QW5jaG9yUG9pbnRaKG1fYW5jaG9yUG9pbnQueigpKTsKKyAgICB1cGRhdGVM
YXllclBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZVRyYW5z
Zm9ybSgpCit7CisgICAgcHJpbWFyeUxheWVyKCktPnNldFRyYW5zZm9ybShtX3RyYW5zZm9ybS50
b0FmZmluZVRyYW5zZm9ybSgpKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tpYTo6dXBkYXRl
Q2hpbGRyZW5UcmFuc2Zvcm0oKQoreworICAgIHByaW1hcnlMYXllcigpLT5zZXRTdWJsYXllclRy
YW5zZm9ybShtX2NoaWxkcmVuVHJhbnNmb3JtKTsKK30KKwordm9pZCBHcmFwaGljc0xheWVyU2tp
YTo6dXBkYXRlTWFza3NUb0JvdW5kcygpCit7CisgICAgbV9sYXllci0+c2V0TWFza3NUb0JvdW5k
cyhtX21hc2tzVG9Cb3VuZHMpOworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2
b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVDb250ZW50c09wYXF1ZSgpCit7CisgICAgbV9s
YXllci0+c2V0T3BhcXVlKG1fY29udGVudHNPcGFxdWUpOworfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjp1cGRhdGVCYWNrZmFjZVZpc2liaWxpdHkoKQoreworICAgIG1fbGF5ZXItPnNldERv
dWJsZVNpZGVkKG1fYmFja2ZhY2VWaXNpYmlsaXR5KTsKK30KKwordm9pZCBHcmFwaGljc0xheWVy
U2tpYTo6dXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgpCit7CisgICAgLy8gRklYTUU6IGltcGxlbWVu
dAorfQorCit2b2lkIEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVMYXllckRyYXdzQ29udGVudCgp
Cit7CisgICAgaWYgKG1fZHJhd3NDb250ZW50KQorICAgICAgICBtX2xheWVyLT5zZXROZWVkc0Rp
c3BsYXkoKTsKKworICAgIHVwZGF0ZURlYnVnSW5kaWNhdG9ycygpOworfQorCit2b2lkIEdyYXBo
aWNzTGF5ZXJTa2lhOjp1cGRhdGVMYXllckJhY2tncm91bmRDb2xvcigpCit7CisgICAgaWYgKCFt
X2NvbnRlbnRzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG5ldmVyIGNyZWF0
ZSB0aGUgY29udGVudHMgbGF5ZXIganVzdCBmb3IgYmFja2dyb3VuZCBjb2xvciB5ZXQuCisgICAg
aWYgKG1fYmFja2dyb3VuZENvbG9yU2V0KQorICAgICAgICBzZXRMYXllckJhY2tncm91bmRDb2xv
cigqbV9jb250ZW50c0xheWVyLCBtX2JhY2tncm91bmRDb2xvcik7CisgICAgZWxzZQorICAgICAg
ICBjbGVhckxheWVyQmFja2dyb3VuZENvbG9yKCptX2NvbnRlbnRzTGF5ZXIpOworfQorCit2b2lk
IEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVDb250ZW50c0ltYWdlKCkKK3sKKyAgICAvLyBGSVhN
RTogSW1wbGVtZW50Cit9CisKK3ZvaWQgR3JhcGhpY3NMYXllclNraWE6OnVwZGF0ZUNvbnRlbnRz
VmlkZW8oKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQKK30KKwordm9pZCBHcmFwaGljc0xh
eWVyU2tpYTo6dXBkYXRlQ29udGVudHNSZWN0KCkKK3sKKyAgICBpZiAoIW1fY29udGVudHNMYXll
cikKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tQb2ludCBwb2ludDsKKyAgICBwb2ludC5zZXQo
bV9jb250ZW50c1JlY3QueCgpLCBtX2NvbnRlbnRzUmVjdC55KCkpOworICAgIFNrSVJlY3QgcmVj
dDsKKyAgICByZWN0LnNldCgwLCAwLCBtX2NvbnRlbnRzUmVjdC53aWR0aCgpLCBtX2NvbnRlbnRz
UmVjdC5oZWlnaHQoKSk7CisKKyAgICBtX2NvbnRlbnRzTGF5ZXItPnNldFBvc2l0aW9uKHBvaW50
KTsKKyAgICBtX2NvbnRlbnRzTGF5ZXItPnNldEJvdW5kcyhyZWN0KTsKK30KKwordm9pZCBHcmFw
aGljc0xheWVyU2tpYTo6dXBkYXRlR2VvbWV0cnlPcmllbnRhdGlvbigpCit7CisgICAgc3dpdGNo
IChnZW9tZXRyeU9yaWVudGF0aW9uKCkpIHsKKyAgICBjYXNlIENvbXBvc2l0aW5nQ29vcmRpbmF0
ZXNUb3BEb3duOgorICAgICAgICBtX2xheWVyLT5zZXRHZW9tZXRyeUZsaXBwZWQoZmFsc2UpOwor
ICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ29tcG9zaXRpbmdDb29yZGluYXRlc0JvdHRvbVVw
OgorICAgICAgICBtX2xheWVyLT5zZXRHZW9tZXRyeUZsaXBwZWQodHJ1ZSk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKyAgICAvLyBHZW9tZXRyeSBvcmllbnRhdGlvbiBpcyBtYXBwZWQgb250byBj
aGlsZHJlbiB0cmFuc2Zvcm0gaW4gb2xkZXIgUXVhcnR6Q29yZXMsCisgICAgLy8gc28gaXMgaGFu
ZGxlZCB2aWEgc2V0R2VvbWV0cnlPcmllbnRhdGlvbigpLgorfQorCit2b2lkIEdyYXBoaWNzTGF5
ZXJTa2lhOjpzZXR1cENvbnRlbnRzTGF5ZXIoTGF5ZXJTa2lhKiBjb250ZW50c0xheWVyKQorewor
ICAgIGlmIChjb250ZW50c0xheWVyID09IG1fY29udGVudHNMYXllcikKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKG1fY29udGVudHNMYXllcikgeworICAgICAgICBtX2NvbnRlbnRzTGF5ZXIt
PnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgICAgIG1fY29udGVudHNMYXllciA9IDA7Cisg
ICAgfQorCisgICAgaWYgKGNvbnRlbnRzTGF5ZXIpIHsKKyAgICAgICAgbV9jb250ZW50c0xheWVy
ID0gY29udGVudHNMYXllcjsKKworICAgICAgICBTa1BvaW50IGFuY2hvclBvaW50OworICAgICAg
ICBhbmNob3JQb2ludC5zZXQoMC4wZiwgMC4wZik7CisgICAgICAgIG1fY29udGVudHNMYXllci0+
c2V0QW5jaG9yUG9pbnQoYW5jaG9yUG9pbnQpOworCisgICAgICAgIC8vIEluc2VydCB0aGUgY29u
dGVudCBsYXllciBmaXJzdC4gVmlkZW8gZWxlbWVudHMgcmVxdWlyZSB0aGlzLCBiZWNhdXNlIHRo
ZXkgaGF2ZQorICAgICAgICAvLyBzaGFkb3cgY29udGVudCB0aGF0IG11c3QgZGlzcGxheSBpbiBm
cm9udCBvZiB0aGUgdmlkZW8uCisgICAgICAgIG1fbGF5ZXItPmluc2VydFN1YmxheWVyKG1fY29u
dGVudHNMYXllci5nZXQoKSwgMCk7CisKKyAgICAgICAgdXBkYXRlQ29udGVudHNSZWN0KCk7CisK
KyAgICAgICAgaWYgKHNob3dEZWJ1Z0JvcmRlcnMoKSkgeworICAgICAgICAgICAgc2V0TGF5ZXJC
b3JkZXJDb2xvcigqbV9jb250ZW50c0xheWVyLCBDb2xvcigwLCAwLCAxMjgsIDE4MCkpOworICAg
ICAgICAgICAgbV9jb250ZW50c0xheWVyLT5zZXRCb3JkZXJXaWR0aCgxLjBmKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICB1cGRhdGVEZWJ1Z0luZGljYXRvcnMoKTsKK30KKworLy8gVGhpcyBmdW5j
dGlvbiBzaW1wbHkgbWltaWNzIHRoZSBvcGVyYXRpb24gb2YgR3JhcGhpY3NMYXllckNBCit2b2lk
IEdyYXBoaWNzTGF5ZXJTa2lhOjp1cGRhdGVPcGFjaXR5T25MYXllcigpCit7CisgICAgcHJpbWFy
eUxheWVyKCktPnNldE9wYWNpdHkobV9vcGFjaXR5KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzTGF5ZXJTa2lhLmgJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NM
YXllclNraWEuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9u
LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElT
IiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICog
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEdyYXBoaWNz
TGF5ZXJTa2lhX2gKKyNkZWZpbmUgR3JhcGhpY3NMYXllclNraWFfaAorCisjaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiR3JhcGhpY3NMYXllci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIExh
eWVyU2tpYTsKKworY2xhc3MgR3JhcGhpY3NMYXllclNraWEgOiBwdWJsaWMgR3JhcGhpY3NMYXll
ciB7CitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllclNraWEoR3JhcGhpY3NMYXllckNsaWVudCop
OworICAgIHZpcnR1YWwgfkdyYXBoaWNzTGF5ZXJTa2lhKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQg
c2V0TmFtZShjb25zdCBTdHJpbmcmKTsKKworICAgIC8vIGZvciBob3N0aW5nIHRoaXMgR3JhcGhp
Y3NMYXllciBpbiBhIG5hdGl2ZSBsYXllciBoaWVyYXJjaHkKKyAgICB2aXJ0dWFsIE5hdGl2ZUxh
eWVyIG5hdGl2ZUxheWVyKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Q2hpbGRyZW4o
Y29uc3QgVmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiYpOworICAgIHZpcnR1YWwgdm9pZCBhZGRDaGls
ZChHcmFwaGljc0xheWVyKik7CisgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkQXRJbmRleChHcmFw
aGljc0xheWVyKiwgaW50IGluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGRBYm92ZShH
cmFwaGljc0xheWVyKiwgR3JhcGhpY3NMYXllciogc2libGluZyk7CisgICAgdmlydHVhbCB2b2lk
IGFkZENoaWxkQmVsb3coR3JhcGhpY3NMYXllciosIEdyYXBoaWNzTGF5ZXIqIHNpYmxpbmcpOwor
ICAgIHZpcnR1YWwgYm9vbCByZXBsYWNlQ2hpbGQoR3JhcGhpY3NMYXllciogb2xkQ2hpbGQsIEdy
YXBoaWNzTGF5ZXIqIG5ld0NoaWxkKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVGcm9tUGFy
ZW50KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYp
OworICAgIHZpcnR1YWwgdm9pZCBzZXRBbmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZShjb25zdCBGbG9hdFNpemUmKTsKKworICAgIHZpcnR1
YWwgdm9pZCBzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKworICAg
IHZpcnR1YWwgdm9pZCBzZXRDaGlsZHJlblRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYpOworCisgICAgdmlydHVhbCB2b2lkIHNldFByZXNlcnZlczNEKGJvb2wpOworICAgIHZp
cnR1YWwgdm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRE
cmF3c0NvbnRlbnQoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QmFja2dyb3VuZENvbG9y
KGNvbnN0IENvbG9yJik7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyQmFja2dyb3VuZENvbG9yKCk7
CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNPcGFxdWUoYm9vbCk7CisgICAgdmlydHVh
bCB2b2lkIHNldEJhY2tmYWNlVmlzaWJpbGl0eShib29sKTsKKworICAgIHZpcnR1YWwgdm9pZCBz
ZXRPcGFjaXR5KGZsb2F0KTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYp
OworCisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzUmVjdChjb25zdCBJbnRSZWN0Jik7CisK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0ltYWdlKEltYWdlKik7CisgICAgdmlydHVh
bCB2b2lkIHNldENvbnRlbnRzVG9WaWRlbyhQbGF0Zm9ybUxheWVyKik7CisKKyAgICB2aXJ0dWFs
IFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9p
ZCBzZXREZWJ1Z0JhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYpOworICAgIHZpcnR1YWwgdm9p
ZCBzZXREZWJ1Z0JvcmRlcihjb25zdCBDb2xvciYsIGZsb2F0IGJvcmRlcldpZHRoKTsKKworICAg
IHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeU9yaWVudGF0aW9uKENvbXBvc2l0aW5nQ29vcmRpbmF0
ZXNPcmllbnRhdGlvbik7CisKKyAgICB2b2lkIG5vdGlmeVN5bmNSZXF1aXJlZCgpCisgICAgewor
ICAgICAgICBpZiAobV9jbGllbnQpCisgICAgICAgICAgICBtX2NsaWVudC0+bm90aWZ5U3luY1Jl
cXVpcmVkKHRoaXMpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHVwZGF0ZU9wYWNpdHlP
bkxheWVyKCk7CisKKyAgICBMYXllclNraWEqIHByaW1hcnlMYXllcigpIGNvbnN0ICB7IHJldHVy
biBtX3RyYW5zZm9ybUxheWVyLmdldCgpID8gbV90cmFuc2Zvcm1MYXllci5nZXQoKSA6IG1fbGF5
ZXIuZ2V0KCk7IH0KKyAgICBMYXllclNraWEqIGhvc3RMYXllckZvclN1YmxheWVycygpIGNvbnN0
OworICAgIExheWVyU2tpYSogbGF5ZXJGb3JTdXBlcmxheWVyKCkgY29uc3Q7CisKKyAgICB2b2lk
IHVwZGF0ZVN1YmxheWVyTGlzdCgpOworICAgIHZvaWQgdXBkYXRlTGF5ZXJQb3NpdGlvbigpOwor
ICAgIHZvaWQgdXBkYXRlTGF5ZXJTaXplKCk7CisgICAgdm9pZCB1cGRhdGVBbmNob3JQb2ludCgp
OworICAgIHZvaWQgdXBkYXRlVHJhbnNmb3JtKCk7CisgICAgdm9pZCB1cGRhdGVDaGlsZHJlblRy
YW5zZm9ybSgpOworICAgIHZvaWQgdXBkYXRlTWFza3NUb0JvdW5kcygpOworICAgIHZvaWQgdXBk
YXRlQ29udGVudHNPcGFxdWUoKTsKKyAgICB2b2lkIHVwZGF0ZUJhY2tmYWNlVmlzaWJpbGl0eSgp
OworICAgIHZvaWQgdXBkYXRlTGF5ZXJQcmVzZXJ2ZXMzRCgpOworICAgIHZvaWQgdXBkYXRlTGF5
ZXJEcmF3c0NvbnRlbnQoKTsKKyAgICB2b2lkIHVwZGF0ZUxheWVyQmFja2dyb3VuZENvbG9yKCk7
CisKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzSW1hZ2UoKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRl
bnRzVmlkZW8oKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzUmVjdCgpOworICAgIHZvaWQgdXBk
YXRlR2VvbWV0cnlPcmllbnRhdGlvbigpOworCisgICAgdm9pZCBzZXR1cENvbnRlbnRzTGF5ZXIo
TGF5ZXJTa2lhKik7CisgICAgTGF5ZXJTa2lhKiBjb250ZW50c0xheWVyKCkgY29uc3QgeyByZXR1
cm4gbV9jb250ZW50c0xheWVyLmdldCgpOyB9CisKKyAgICBSZWZQdHI8TGF5ZXJTa2lhPiBtX2xh
eWVyOworICAgIFJlZlB0cjxMYXllclNraWE+IG1fdHJhbnNmb3JtTGF5ZXI7CisgICAgUmVmUHRy
PExheWVyU2tpYT4gbV9jb250ZW50c0xheWVyOworCisgICAgZW51bSBDb250ZW50c0xheWVyUHVy
cG9zZSB7CisgICAgICAgIE5vQ29udGVudHNMYXllciA9IDAsCisgICAgICAgIENvbnRlbnRzTGF5
ZXJGb3JJbWFnZSwKKyAgICAgICAgQ29udGVudHNMYXllckZvclZpZGVvCisgICAgfTsKKworICAg
IENvbnRlbnRzTGF5ZXJQdXJwb3NlIG1fY29udGVudHNMYXllclB1cnBvc2U7CisgICAgYm9vbCBt
X2NvbnRlbnRzTGF5ZXJIYXNCYWNrZ3JvdW5kQ29sb3IgOiAxOworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisj
ZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVy
U2tpYS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xh
eWVyUmVuZGVyZXJTa2lhLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisjaW5jbHVkZSAiTGF5ZXJSZW5kZXJlclNraWEuaCIKKworI2luY2x1ZGUgIkxheWVy
U2tpYS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNpbmNsdWRlICJza2lh
L2V4dC9wbGF0Zm9ybV9jYW52YXMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzT3du
UHRyPExheWVyUmVuZGVyZXJTa2lhPiBMYXllclJlbmRlcmVyU2tpYTo6Y3JlYXRlKCkKK3sKKyAg
ICByZXR1cm4gbmV3IExheWVyUmVuZGVyZXJTa2lhKCk7Cit9CisKK0xheWVyUmVuZGVyZXJTa2lh
OjpMYXllclJlbmRlcmVyU2tpYSgpCisgICAgOiBtX3Jvb3RMYXllcigwKQorICAgICwgbV9uZWVk
c0Rpc3BsYXkoZmFsc2UpCit7Cit9CisKK0xheWVyUmVuZGVyZXJTa2lhOjp+TGF5ZXJSZW5kZXJl
clNraWEoKQoreworfQorCit2b2lkIExheWVyUmVuZGVyZXJTa2lhOjpkcmF3TGF5ZXJzSW5DYW52
YXMoc2tpYTo6UGxhdGZvcm1DYW52YXMqIGNhbnZhcywgU2tSZWN0IGNsaXBSZWN0KQoreworICAg
IGlmICghbV9yb290TGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGNhbnZhcy0+c2F2ZSgp
OworICAgIGNhbnZhcy0+Y2xpcFJlY3QoY2xpcFJlY3QpOworCisgICAgLy8gRmlyc3QgY29tcG9z
aXRlIHRoZSByb290IGxheWVyIGludG8gdGhlIGNhbnZhcy4KKyAgICBjYW52YXMtPmRyYXdCaXRt
YXAobV9yb290TGF5ZXItPnBsYXRmb3JtQ2FudmFzKCktPmdldERldmljZSgpLT5hY2Nlc3NCaXRt
YXAoZmFsc2UpLCAwLCAwLCAwKTsKKworICAgIC8vIEFjY291bnQgZm9yIHRoZSBzY3JvbGwgb2Zm
c2V0IGJlZm9yZSBjb21wb3NpdGluZyB0aGUgcmVtYWluaW5nIGxheWVycy4KKyAgICAvLyBOb3Rl
IHRoYXQgdGhlIHJvb3QgbGF5ZXIncyBwYWludGluZyB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHNj
cm9sbCBvZmZzZXQgYWxyZWFkeS4KKyAgICBjYW52YXMtPnRyYW5zbGF0ZSgtbV9zY3JvbGxGcmFt
ZS5mTGVmdCwgLW1fc2Nyb2xsRnJhbWUuZlRvcCk7CisKKyAgICBmbG9hdCBvcGFjaXR5ID0gMS4w
ZjsKKyAgICBjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiYgc3VibGF5ZXJzID0gbV9y
b290TGF5ZXItPmdldFN1YmxheWVycygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Vi
bGF5ZXJzLnNpemUoKTsgaSsrKQorICAgICAgICBkcmF3TGF5ZXJJbkNhbnZhc1JlY3Vyc2l2ZShj
YW52YXMsIHN1YmxheWVyc1tpXS5nZXQoKSwgb3BhY2l0eSk7CisKKyAgICBjYW52YXMtPnJlc3Rv
cmUoKTsKKworICAgIG1fbmVlZHNEaXNwbGF5ID0gZmFsc2U7Cit9CisKK3ZvaWQgTGF5ZXJSZW5k
ZXJlclNraWE6OnVwZGF0ZUxheWVyQ29udGVudHMoKQoreworICAgIGlmIChtX3Jvb3RMYXllcikK
KyAgICAgICAgdXBkYXRlTGF5ZXJDb250ZW50c1JlY3Vyc2l2ZShtX3Jvb3RMYXllci5nZXQoKSk7
Cit9CisKK3ZvaWQgTGF5ZXJSZW5kZXJlclNraWE6OmRyYXdMYXllckluQ2FudmFzUmVjdXJzaXZl
KHNraWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMsIExheWVyU2tpYSogbGF5ZXIsIGZsb2F0IG9w
YWNpdHkpCit7CisgICAgLy8gR3VhcmFudGVlcyB0aGF0IHRoZSBjYW52YXMgaXMgcmVzdG9yZWQg
dG8gYSBrbm93biBzdGF0ZSBvbiBkZXN0cnVjdGlvbi4KKyAgICBTa0F1dG9DYW52YXNSZXN0b3Jl
IGF1dG9SZXN0b3JlQ2FudmFzKGNhbnZhcywgdHJ1ZSk7CisKKyAgICBTa1BvaW50IHBvc2l0aW9u
ID0gbGF5ZXItPnBvc2l0aW9uKCk7CisgICAgU2tQb2ludCBhbmNob3JQb2ludCA9IGxheWVyLT5h
bmNob3JQb2ludCgpOworICAgIFNrTWF0cml4IHRyYW5zZm9ybSA9IGxheWVyLT50cmFuc2Zvcm0o
KTsKKyAgICBTa0lSZWN0IGJvdW5kcyA9IGxheWVyLT5ib3VuZHMoKTsKKworICAgIGNhbnZhcy0+
dHJhbnNsYXRlKHBvc2l0aW9uLmZYLCBwb3NpdGlvbi5mWSk7CisKKyAgICBTa1NjYWxhciB0eCA9
IFNrU2NhbGFyTXVsKGFuY2hvclBvaW50LmZYLCBib3VuZHMud2lkdGgoKSk7CisgICAgU2tTY2Fs
YXIgdHkgPSBTa1NjYWxhck11bChhbmNob3JQb2ludC5mWSwgYm91bmRzLmhlaWdodCgpKTsKKyAg
ICBjYW52YXMtPnRyYW5zbGF0ZSh0eCwgdHkpOworICAgIGNhbnZhcy0+Y29uY2F0KHRyYW5zZm9y
bSk7CisgICAgY2FudmFzLT50cmFuc2xhdGUoLXR4LCAtdHkpOworCisgICAgLy8gVGhlIHBvc2l0
aW9uIHdlIGdldCBpcyBmb3IgdGhlIGNlbnRlciBvZiB0aGUgbGF5ZXIsIGJ1dAorICAgIC8vIGRy
YXdCaXRtYXAgc3RhcnRzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciwgYW5kIHRoZXJlZm9yZQor
ICAgIC8vIHdlIG5lZWQgdG8gYWRqdXN0IG91ciB0cmFuc2Zvcm0uCisgICAgY2FudmFzLT50cmFu
c2xhdGUoLTAuNWYgKiBib3VuZHMud2lkdGgoKSwgLTAuNWYgKiBib3VuZHMuaGVpZ2h0KCkpOwor
CisgICAgU2tQYWludCBvcGFjaXR5UGFpbnQ7CisgICAgb3BhY2l0eSAqPSBsYXllci0+b3BhY2l0
eSgpOworICAgIG9wYWNpdHlQYWludC5zZXRBbHBoYShvcGFjaXR5ICogMjU1KTsKKworICAgIGNh
bnZhcy0+ZHJhd0JpdG1hcChsYXllci0+cGxhdGZvcm1DYW52YXMoKS0+Z2V0RGV2aWNlKCktPmFj
Y2Vzc0JpdG1hcChmYWxzZSksIDAsIDAsICZvcGFjaXR5UGFpbnQpOworCisgICAgY29uc3QgVmVj
dG9yPFJlZlB0cjxMYXllclNraWE+ID4mIHN1YmxheWVycyA9IGxheWVyLT5nZXRTdWJsYXllcnMo
KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1YmxheWVycy5zaXplKCk7IGkrKykKKyAg
ICAgICAgZHJhd0xheWVySW5DYW52YXNSZWN1cnNpdmUoY2FudmFzLCBzdWJsYXllcnNbaV0uZ2V0
KCksIG9wYWNpdHkpOworfQorCit2b2lkIExheWVyUmVuZGVyZXJTa2lhOjp1cGRhdGVMYXllckNv
bnRlbnRzUmVjdXJzaXZlKExheWVyU2tpYSogbGF5ZXIpCit7CisgICAgbGF5ZXItPnVwZGF0ZUNv
bnRlbnRzKCk7CisKKyAgICBjb25zdCBWZWN0b3I8UmVmUHRyPExheWVyU2tpYT4gPiYgc3VibGF5
ZXJzID0gbGF5ZXItPmdldFN1YmxheWVycygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
c3VibGF5ZXJzLnNpemUoKTsgaSsrKQorICAgICAgICB1cGRhdGVMYXllckNvbnRlbnRzUmVjdXJz
aXZlKHN1YmxheWVyc1tpXS5nZXQoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwor
I2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9MYXllclJlbmRlcmVyU2tpYS5oCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyUmVuZGVyZXJTa2lh
LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgTGF5ZXJSZW5kZXJlclNr
aWFfaAorI2RlZmluZSBMYXllclJlbmRlcmVyU2tpYV9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJMYXllclNraWEuaCIKKyNpbmNsdWRlIDx3dGYvTm9u
Y29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KKworbmFtZXNwYWNlIHNraWEgeworY2xhc3MgUGxhdGZvcm1DYW52YXM7Cit9CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJSZW5kZXJlclNraWEgOiBwdWJsaWMg
Tm9uY29weWFibGUgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPExheWVyUmVuZGVy
ZXJTa2lhPiBjcmVhdGUoKTsKKworICAgIExheWVyUmVuZGVyZXJTa2lhKCk7CisgICAgfkxheWVy
UmVuZGVyZXJTa2lhKCk7CisKKyAgICB2b2lkIGRyYXdMYXllcnNJbkNhbnZhcyhza2lhOjpQbGF0
Zm9ybUNhbnZhcyosIFNrUmVjdCBjbGlwUmVjdCk7CisKKyAgICB2b2lkIHVwZGF0ZUxheWVyQ29u
dGVudHMoKTsKKworICAgIHZvaWQgc2V0Um9vdExheWVyKFBhc3NSZWZQdHI8TGF5ZXJTa2lhPiBs
YXllcikgeyBtX3Jvb3RMYXllciA9IGxheWVyOyB9CisgICAgTGF5ZXJTa2lhKiByb290TGF5ZXIo
KSB7IHJldHVybiBtX3Jvb3RMYXllci5nZXQoKTsgfQorCisgICAgdm9pZCBzZXROZWVkc0Rpc3Bs
YXkoKSB7IG1fbmVlZHNEaXNwbGF5ID0gdHJ1ZTsgfQorCisgICAgdm9pZCBzZXRTY3JvbGxGcmFt
ZShTa0lSZWN0JiBzY3JvbGxGcmFtZSkgeyBtX3Njcm9sbEZyYW1lID0gc2Nyb2xsRnJhbWU7IH0K
KworcHJpdmF0ZToKKyAgICB2b2lkIGRyYXdMYXllckluQ2FudmFzUmVjdXJzaXZlKHNraWE6OlBs
YXRmb3JtQ2FudmFzKiwgTGF5ZXJTa2lhKiwgZmxvYXQgb3BhY2l0eSk7CisgICAgdm9pZCB1cGRh
dGVMYXllckNvbnRlbnRzUmVjdXJzaXZlKExheWVyU2tpYSopOworCisgICAgUmVmUHRyPExheWVy
U2tpYT4gbV9yb290TGF5ZXI7CisKKyAgICBib29sIG1fbmVlZHNEaXNwbGF5OworICAgIFNrSVJl
Y3QgbV9zY3JvbGxGcmFtZTsKK307CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKworI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvTGF5ZXJTa2lhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3NraWEvTGF5ZXJTa2lhLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvc2tpYS9MYXllclNraWEuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI0OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
I2luY2x1ZGUgIkxheWVyU2tpYS5oIgorCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5o
IgorI2luY2x1ZGUgIlJlbmRlckxheWVyQmFja2luZy5oIgorI2luY2x1ZGUgInNraWEvZXh0L3Bs
YXRmb3JtX2NhbnZhcy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFj
ZSBzdGQ7CisKK1Bhc3NSZWZQdHI8TGF5ZXJTa2lhPiBMYXllclNraWE6OmNyZWF0ZShMYXllclR5
cGUgdHlwZSwgR3JhcGhpY3NMYXllclNraWEqIG93bmVyKQoreworICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgTGF5ZXJTa2lhKHR5cGUsIG93bmVyKSk7Cit9CisKK0xheWVyU2tpYTo6TGF5ZXJTa2lh
KExheWVyVHlwZSB0eXBlLCBHcmFwaGljc0xheWVyU2tpYSogb3duZXIpCisgICAgOiBtX25lZWRz
RGlzcGxheU9uQm91bmRzQ2hhbmdlKGZhbHNlKQorICAgICwgbV9vd25lcihvd25lcikKKyAgICAs
IG1fbGF5ZXJUeXBlKHR5cGUpCisgICAgLCBtX3N1cGVybGF5ZXIoMCkKKyAgICAsIG1fYm9yZGVy
V2lkdGgoMCkKKyAgICAsIG1fYm9yZGVyQ29sb3IoMCwgMCwgMCwgMCkKKyAgICAsIG1fYmFja2dy
b3VuZENvbG9yKDAsIDAsIDAsIDApCisgICAgLCBtX2FuY2hvclBvaW50WigwKQorICAgICwgbV9j
bGVhcnNDb250ZXh0KGZhbHNlKQorICAgICwgbV9kb3VibGVTaWRlZChmYWxzZSkKKyAgICAsIG1f
ZWRnZUFudGlhbGlhc2luZ01hc2soMCkKKyAgICAsIG1faGlkZGVuKGZhbHNlKQorICAgICwgbV9t
YXNrc1RvQm91bmRzKGZhbHNlKQorICAgICwgbV9jb250ZW50c0dyYXZpdHkoQm90dG9tKQorICAg
ICwgbV9vcGFjaXR5KDEuMCkKKyAgICAsIG1fb3BhcXVlKHRydWUpCisgICAgLCBtX3pQb3NpdGlv
bigwLjApCisgICAgLCBtX2NhbnZhcygwKQorICAgICwgbV9za2lhQ29udGV4dCgwKQorICAgICwg
bV9ncmFwaGljc0NvbnRleHQoMCkKKyAgICAsIG1fZ2VvbWV0cnlGbGlwcGVkKGZhbHNlKQorewor
ICAgIG1fYm91bmRzLnNldEVtcHR5KCk7CisgICAgbV9iYWNraW5nU3RvcmVSZWN0LnNldEVtcHR5
KCk7CisgICAgbV9mcmFtZS5zZXRFbXB0eSgpOworICAgIG1fcG9zaXRpb24uc2V0KDAsIDApOwor
ICAgIG1fYW5jaG9yUG9pbnQuc2V0KDAsIDApOworICAgIG1fdHJhbnNmb3JtLnJlc2V0KCk7Cisg
ICAgbV9zdWJsYXllclRyYW5zZm9ybS5yZXNldCgpOworCisgICAgdXBkYXRlR3JhcGhpY3NDb250
ZXh0KG1fYmFja2luZ1N0b3JlUmVjdCk7Cit9CisKK0xheWVyU2tpYTo6fkxheWVyU2tpYSgpCit7
CisgICAgLy8gT3VyIHN1cGVybGF5ZXIgc2hvdWxkIGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8g
dXMsIHNvIHRoZXJlIHNob3VsZCBiZSBubyB3YXkgZm9yIHVzIHRvIGJlIGRlc3Ryb3llZCB3aGls
ZSB3ZSBzdGlsbCBoYXZlIGEgc3VwZXJsYXllci4KKyAgICBBU1NFUlQoIXN1cGVybGF5ZXIoKSk7
Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjp1cGRhdGVHcmFwaGljc0NvbnRleHQoY29uc3QgU2tJUmVj
dCYgcmVjdCkKK3sKKyAgICAvLyBDcmVhdGUgbmV3IGNhbnZhcyBhbmQgY29udGV4dC4gT3duUHRy
IHRha2VzIGNhcmUgb2YgZnJlZWluZyB1cAorICAgIC8vIHRoZSBvbGQgb25lcy4KKyAgICBtX2Nh
bnZhcyA9IG5ldyBza2lhOjpQbGF0Zm9ybUNhbnZhcyhyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0
KCksIGZhbHNlKTsKKyAgICBtX3NraWFDb250ZXh0ID0gbmV3IFBsYXRmb3JtQ29udGV4dFNraWEo
bV9jYW52YXMuZ2V0KCkpOworCisgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IHRleHQgdG8g
c2hvdyB1cCBjb3JyZWN0bHkuIFdpdGhvdXQgaXQsCisgICAgLy8gR0RJIHJlbmRlcnMgd2l0aCB6
ZXJvIGFscGhhIGFuZCB0aGUgdGV4dCBiZWNvbWVzIGludmlzaWJsZS4KKyAgICAvLyBVbmZvcnR1
bmF0ZWx5LCBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBkaXNhYmxlcyBjbGVhcnR5cGUuCisgICAgbV9z
a2lhQ29udGV4dC0+c2V0RHJhd2luZ1RvSW1hZ2VCdWZmZXIodHJ1ZSk7CisKKyAgICBtX2dyYXBo
aWNzQ29udGV4dCA9IG5ldyBHcmFwaGljc0NvbnRleHQocmVpbnRlcnByZXRfY2FzdDxQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dCo+KG1fc2tpYUNvbnRleHQuZ2V0KCkpKTsKKworICAgIC8vIFRoZSBi
YWNraW5nIHN0b3JlIGFsbG9jYXRlZCBmb3IgYSBsYXllciBjYW4gYmUgc21hbGxlciB0aGFuIHRo
ZSBsYXllcidzIGJvdW5kcy4KKyAgICAvLyBUaGlzIGlzIG1vc3RseSB0cnVlIGZvciB0aGUgcm9v
dCBsYXllciB3aG9zZSBiYWNraW5nIHN0b3JlIGlzIHNpemVkIGJhc2VkIG9uIHRoZSB2aXNpYmxl
CisgICAgLy8gcG9ydGlvbiBvZiB0aGUgbGF5ZXIgcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCBwYWdl
IHNpemUuCisgICAgbV9iYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKK30KKwordm9pZCBMYXllclNr
aWE6OnVwZGF0ZUNvbnRlbnRzKCkKK3sKKyAgICBSZW5kZXJMYXllckJhY2tpbmcqIGJhY2tpbmcg
PSBzdGF0aWNfY2FzdDxSZW5kZXJMYXllckJhY2tpbmcqPihtX293bmVyLT5jbGllbnQoKSk7CisK
KyAgICBpZiAoYmFja2luZyAmJiAhYmFja2luZy0+cGFpbnRpbmdHb2VzVG9XaW5kb3coKSkKKyAg
ICAgICAgbV9vd25lci0+cGFpbnRHcmFwaGljc0xheWVyQ29udGVudHMoKm1fZ3JhcGhpY3NDb250
ZXh0LCBJbnRSZWN0KDAsIDAsIG1fYm91bmRzLndpZHRoKCksIG1fYm91bmRzLmhlaWdodCgpKSk7
CisKKyAgICAvLyBQYWludCB0aGUgZGVidWcgYm9yZGVyLgorICAgIC8vIEZJWE1FOiBBZGQgYSBm
bGFnIHRvIGNoZWNrIGlmIGRlYnVnIGJvcmRlcnMgYXJlIHVzZWQuCisgICAgbV9ncmFwaGljc0Nv
bnRleHQtPnNldFN0cm9rZUNvbG9yKG1fYm9yZGVyQ29sb3IsIERldmljZUNvbG9yU3BhY2UpOwor
ICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3MobV9ib3JkZXJXaWR0aCk7
CisgICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5lKEludFBvaW50KDAsIDApLCBJbnRQb2lu
dChtX2JvdW5kcy53aWR0aCgpLCAwKSk7CisgICAgbV9ncmFwaGljc0NvbnRleHQtPmRyYXdMaW5l
KEludFBvaW50KDAsIDApLCBJbnRQb2ludCgwLCBtX2JvdW5kcy5oZWlnaHQoKSkpOworICAgIG1f
Z3JhcGhpY3NDb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCAwKSwg
SW50UG9pbnQobV9ib3VuZHMud2lkdGgoKSwgbV9ib3VuZHMuaGVpZ2h0KCkpKTsKKyAgICBtX2dy
YXBoaWNzQ29udGV4dC0+ZHJhd0xpbmUoSW50UG9pbnQoMCwgbV9ib3VuZHMuaGVpZ2h0KCkpLCBJ
bnRQb2ludChtX2JvdW5kcy53aWR0aCgpLCBtX2JvdW5kcy5oZWlnaHQoKSkpOworfQorCit2b2lk
IExheWVyU2tpYTo6c2V0TmVlZHNDb21taXQoKQoreworICAgIC8vIENhbGwgbm90aWZ5U3luY1Jl
cXVpcmVkKCksIHdoaWNoIGluIHRoaXMgaW1wbGVtZW50YXRpb24gcGx1bWJzIHRocm91Z2ggdG8K
KyAgICAvLyBjYWxsIHNldFJvb3RMYXllck5lZWRzRGlzcGxheSgpIG9uIHRoZSBXZWJWaWV3LCB3
aGljaCB3aWxsIGNhdXNlIExheWVyUmVuZGVyZXJTa2lhCisgICAgLy8gdG8gcmVuZGVyIGEgZnJh
bWUuCisgICAgaWYgKG1fb3duZXIpCisgICAgICAgIG1fb3duZXItPm5vdGlmeVN5bmNSZXF1aXJl
ZCgpOworfQorCit2b2lkIExheWVyU2tpYTo6YWRkU3VibGF5ZXIoUGFzc1JlZlB0cjxMYXllclNr
aWE+IHN1YmxheWVyKQoreworICAgIGluc2VydFN1YmxheWVyKHN1YmxheWVyLCBudW1TdWJsYXll
cnMoKSk7Cit9CisKK3ZvaWQgTGF5ZXJTa2lhOjppbnNlcnRTdWJsYXllcihQYXNzUmVmUHRyPExh
eWVyU2tpYT4gc3VibGF5ZXIsIHNpemVfdCBpbmRleCkKK3sKKyAgICBpbmRleCA9IG1pbihpbmRl
eCwgbV9zdWJsYXllcnMuc2l6ZSgpKTsKKyAgICBtX3N1YmxheWVycy5pbnNlcnQoaW5kZXgsIHN1
YmxheWVyKTsKKyAgICBzdWJsYXllci0+c2V0U3VwZXJsYXllcih0aGlzKTsKKyAgICBzZXROZWVk
c0NvbW1pdCgpOworfQorCit2b2lkIExheWVyU2tpYTo6cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKQor
eworICAgIExheWVyU2tpYSogc3VwZXJsYXllciA9IHRoaXMtPnN1cGVybGF5ZXIoKTsKKyAgICBp
ZiAoIXN1cGVybGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIHN1cGVybGF5ZXItPnJlbW92
ZVN1YmxheWVyKHRoaXMpOworfQorCit2b2lkIExheWVyU2tpYTo6cmVtb3ZlU3VibGF5ZXIoTGF5
ZXJTa2lhKiBzdWJsYXllcikKK3sKKyAgICBpbnQgZm91bmRJbmRleCA9IGluZGV4T2ZTdWJsYXll
cihzdWJsYXllcik7CisgICAgaWYgKGZvdW5kSW5kZXggPT0gLTEpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fc3VibGF5ZXJzLnJlbW92ZShmb3VuZEluZGV4KTsKKyAgICBzdWJsYXllci0+c2V0
U3VwZXJsYXllcigwKTsKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCitpbnQgTGF5ZXJTa2lh
OjppbmRleE9mU3VibGF5ZXIoY29uc3QgTGF5ZXJTa2lhKiByZWZlcmVuY2UpCit7CisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBtX3N1YmxheWVycy5zaXplKCk7IGkrKykgeworICAgICAgICBp
ZiAobV9zdWJsYXllcnNbaV0gPT0gcmVmZXJlbmNlKQorICAgICAgICAgICAgcmV0dXJuIGk7Cisg
ICAgfQorICAgIHJldHVybiAtMTsKK30KKwordm9pZCBMYXllclNraWE6OnNldEJhY2tpbmdTdG9y
ZVJlY3QoY29uc3QgU2tJUmVjdCYgcmVjdCkKK3sKKyAgICBpZiAobV9iYWNraW5nU3RvcmVSZWN0
ID09IHJlY3QpCisgICAgICAgIHJldHVybjsKKworICAgIHVwZGF0ZUdyYXBoaWNzQ29udGV4dChy
ZWN0KTsKK30KKwordm9pZCBMYXllclNraWE6OnNldEJvdW5kcyhjb25zdCBTa0lSZWN0JiByZWN0
KQoreworICAgIGlmIChyZWN0ID09IG1fYm91bmRzKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X2JvdW5kcyA9IHJlY3Q7CisKKyAgICAvLyBSZS1jcmVhdGUgdGhlIGNhbnZhcyBhbmQgYXNzb2Np
YXRlZCBjb250ZXh0cy4KKyAgICB1cGRhdGVHcmFwaGljc0NvbnRleHQobV9ib3VuZHMpOworCisg
ICAgc2V0TmVlZHNDb21taXQoKTsKK30KKwordm9pZCBMYXllclNraWE6OnNldEZyYW1lKGNvbnN0
IFNrUmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocmVjdCA9PSBtX2ZyYW1lKQorICAgICAgcmV0dXJu
OworCisgICAgbV9mcmFtZSA9IHJlY3Q7CisgICAgc2V0TmVlZHNDb21taXQoKTsKK30KKworY29u
c3QgTGF5ZXJTa2lhKiBMYXllclNraWE6OnJvb3RMYXllcigpIGNvbnN0Cit7CisgICAgY29uc3Qg
TGF5ZXJTa2lhKiBsYXllciA9IHRoaXM7CisgICAgZm9yIChMYXllclNraWEqIHN1cGVybGF5ZXIg
PSBsYXllci0+c3VwZXJsYXllcigpOyBzdXBlcmxheWVyOyBsYXllciA9IHN1cGVybGF5ZXIsIHN1
cGVybGF5ZXIgPSBzdXBlcmxheWVyLT5zdXBlcmxheWVyKCkpIHsgfQorICAgIHJldHVybiBsYXll
cjsKK30KKwordm9pZCBMYXllclNraWE6OnJlbW92ZUFsbFN1YmxheWVycygpCit7CisgICAgbV9z
dWJsYXllcnMuY2xlYXIoKTsKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCit2b2lkIExheWVy
U2tpYTo6c2V0U3VibGF5ZXJzKGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lhPiA+JiBzdWJs
YXllcnMpCit7CisgICAgbV9zdWJsYXllcnMgPSBzdWJsYXllcnM7Cit9CisKK3ZvaWQgTGF5ZXJT
a2lhOjpzZXRTdXBlcmxheWVyKExheWVyU2tpYSogc3VwZXJsYXllcikKK3sKKyAgICBtX3N1cGVy
bGF5ZXIgPSBzdXBlcmxheWVyOworfQorCitMYXllclNraWEqIExheWVyU2tpYTo6c3VwZXJsYXll
cigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc3VwZXJsYXllcjsKK30KKwordm9pZCBMYXllclNr
aWE6OnNldE5lZWRzRGlzcGxheShjb25zdCBTa1JlY3QmIGRpcnR5UmVjdCkKK3sKKyAgICAvLyBG
SVhNRTogaW1wbGVtZW50CisgICAgc2V0TmVlZHNDb21taXQoKTsKK30KKwordm9pZCBMYXllclNr
aWE6OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgLy8gRklYTUU6IGltcGxlbWVudAorfQorCit9
CisKKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvTGF5ZXJTa2lhLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5oCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0xheWVyU2tpYS5oCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICog
bWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICog
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKworI2lmbmRlZiBMYXllclNraWFfaAorI2RlZmluZSBMYXllclNraWFfaAor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0xheWVyU2tpYS5oIgorI2luY2x1ZGUgIlBs
YXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU2tDb2xvci5oIgorI2luY2x1ZGUgIlNrUG9pbnQu
aCIKKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRy
aXguaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIu
aD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4K
KworCituYW1lc3BhY2Ugc2tpYSB7CitjbGFzcyBQbGF0Zm9ybUNhbnZhczsKK30KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjbGFzcyBMYXllclNraWEgOiBwdWJsaWMgUmVmQ291bnRlZDxMYXll
clNraWE+IHsKK3B1YmxpYzoKKyAgICBlbnVtIExheWVyVHlwZSB7IExheWVyLCBUcmFuc2Zvcm1M
YXllciB9OworICAgIGVudW0gRmlsdGVyVHlwZSB7IExpbmVhciwgTmVhcmVzdCwgVHJpbGluZWFy
LCBMYW5jem9zIH07CisgICAgZW51bSBDb250ZW50c0dyYXZpdHlUeXBlIHsgQ2VudGVyLCBUb3As
IEJvdHRvbSwgTGVmdCwgUmlnaHQsIFRvcExlZnQsIFRvcFJpZ2h0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEJvdHRvbUxlZnQsIEJvdHRvbVJpZ2h0LCBSZXNpemUsIFJlc2l6ZUFz
cGVjdCwgUmVzaXplQXNwZWN0RmlsbCB9OworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8TGF5ZXJT
a2lhPiBjcmVhdGUoTGF5ZXJUeXBlLCBHcmFwaGljc0xheWVyU2tpYSogb3duZXIgPSAwKTsKKwor
ICAgIH5MYXllclNraWEoKTsKKworICAgIHZvaWQgZGlzcGxheShQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dCopOworCisgICAgdm9pZCBhZGRTdWJsYXllcihQYXNzUmVmUHRyPExheWVyU2tpYT4pOwor
ICAgIHZvaWQgaW5zZXJ0U3VibGF5ZXIoUGFzc1JlZlB0cjxMYXllclNraWE+LCBzaXplX3QgaW5k
ZXgpOworICAgIHZvaWQgcmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKworICAgIHZvaWQgc2V0QW5j
aG9yUG9pbnQoY29uc3QgU2tQb2ludCYgYW5jaG9yUG9pbnQpIHsgbV9hbmNob3JQb2ludCA9IGFu
Y2hvclBvaW50OyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgU2tQb2ludCBhbmNob3JQb2ludCgp
IGNvbnN0IHsgcmV0dXJuIG1fYW5jaG9yUG9pbnQ7IH0KKworICAgIHZvaWQgc2V0QW5jaG9yUG9p
bnRaKGZsb2F0IGFuY2hvclBvaW50WikgeyBtX2FuY2hvclBvaW50WiA9IGFuY2hvclBvaW50Wjsg
c2V0TmVlZHNDb21taXQoKTsgfQorICAgIGZsb2F0IGFuY2hvclBvaW50WigpIGNvbnN0IHsgcmV0
dXJuIG1fYW5jaG9yUG9pbnRaOyB9CisKKyAgICB2b2lkIHNldEJhY2tncm91bmRDb2xvcihjb25z
dCBDb2xvciYgY29sb3IpIHsgbV9iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsgc2V0TmVlZHNDb21t
aXQoKTsgfQorICAgIENvbG9yIGJhY2tncm91bmRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYmFj
a2dyb3VuZENvbG9yOyB9CisKKyAgICB2b2lkIHNldEJvcmRlckNvbG9yKGNvbnN0IENvbG9yJiBj
b2xvcikgeyBtX2JvcmRlckNvbG9yID0gY29sb3I7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBD
b2xvciBib3JkZXJDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYm9yZGVyQ29sb3I7IH0KKworICAg
IHZvaWQgc2V0Qm9yZGVyV2lkdGgoZmxvYXQgd2lkdGgpIHsgbV9ib3JkZXJXaWR0aCA9IHdpZHRo
OyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgU2tTY2FsYXIgYm9yZGVyV2lkdGgoKSBjb25zdCB7
IHJldHVybiBtX2JvcmRlcldpZHRoOyB9CisKKyAgICB2b2lkIHNldEJvdW5kcyhjb25zdCBTa0lS
ZWN0Jik7CisgICAgU2tJUmVjdCBib3VuZHMoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kczsgfQor
CisgICAgdm9pZCBzZXRDbGVhcnNDb250ZXh0KGJvb2wgY2xlYXJzKSB7IG1fY2xlYXJzQ29udGV4
dCA9IGNsZWFyczsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgY2xlYXJzQ29udGV4dCgp
IGNvbnN0IHsgcmV0dXJuIG1fY2xlYXJzQ29udGV4dDsgfQorCisgICAgdm9pZCBzZXRDb250ZW50
c0dyYXZpdHkoQ29udGVudHNHcmF2aXR5VHlwZSBncmF2aXR5VHlwZSkgeyBtX2NvbnRlbnRzR3Jh
dml0eSA9IGdyYXZpdHlUeXBlOyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgQ29udGVudHNHcmF2
aXR5VHlwZSBjb250ZW50c0dyYXZpdHkoKSBjb25zdCB7IHJldHVybiBtX2NvbnRlbnRzR3Jhdml0
eTsgfQorCisgICAgdm9pZCBzZXREb3VibGVTaWRlZChib29sIGRvdWJsZVNpZGVkKSB7IG1fZG91
YmxlU2lkZWQgPSBkb3VibGVTaWRlZDsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgZG91
YmxlU2lkZWQoKSBjb25zdCB7IHJldHVybiBtX2RvdWJsZVNpZGVkOyB9CisKKyAgICB2b2lkIHNl
dEVkZ2VBbnRpYWxpYXNpbmdNYXNrKHVpbnQzMl90IG1hc2spIHsgbV9lZGdlQW50aWFsaWFzaW5n
TWFzayA9IG1hc2s7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICB1aW50MzJfdCBlZGdlQW50aWFs
aWFzaW5nTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1fZWRnZUFudGlhbGlhc2luZ01hc2s7IH0KKwor
ICAgIHZvaWQgc2V0RnJhbWUoY29uc3QgU2tSZWN0Jik7CisgICAgU2tSZWN0IGZyYW1lKCkgY29u
c3QgeyByZXR1cm4gbV9mcmFtZTsgfQorCisgICAgdm9pZCBzZXRIaWRkZW4oYm9vbCBoaWRkZW4p
IHsgbV9oaWRkZW4gPSBoaWRkZW47IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBib29sIGlzSGlk
ZGVuKCkgY29uc3QgeyByZXR1cm4gbV9oaWRkZW47IH0KKworICAgIHZvaWQgc2V0TWFza3NUb0Jv
dW5kcyhib29sIG1hc2tzVG9Cb3VuZHMpIHsgbV9tYXNrc1RvQm91bmRzID0gbWFza3NUb0JvdW5k
czsgfQorICAgIGJvb2wgbWFza3NUb0JvdW5kcygpIGNvbnN0IHsgcmV0dXJuIG1fbWFza3NUb0Jv
dW5kczsgfQorCisgICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkgeyBtX25hbWUg
PSBuYW1lOyB9CisgICAgU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKwor
ICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5KGNvbnN0IFNrUmVjdCYgZGlydHlSZWN0KTsKKyAgICB2
b2lkIHNldE5lZWRzRGlzcGxheSgpOworCisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXlPbkJvdW5k
c0NoYW5nZShib29sIG5lZWRzRGlzcGxheSkgeyBtX25lZWRzRGlzcGxheU9uQm91bmRzQ2hhbmdl
ID0gbmVlZHNEaXNwbGF5OyB9CisKKyAgICB2b2lkIHNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkg
eyBtX29wYWNpdHkgPSBvcGFjaXR5OyBzZXROZWVkc0NvbW1pdCgpOyB9CisgICAgZmxvYXQgb3Bh
Y2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1fb3BhY2l0eTsgfQorCisgICAgdm9pZCBzZXRPcGFxdWUo
Ym9vbCBvcGFxdWUpIHsgbV9vcGFxdWUgPSBvcGFxdWU7IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAg
ICBib29sIG9wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3BhcXVlOyB9CisKKyAgICB2b2lkIHNl
dFBvc2l0aW9uKGNvbnN0IFNrUG9pbnQmIHBvc2l0aW9uKSB7IG1fcG9zaXRpb24gPSBwb3NpdGlv
bjsgIHNldE5lZWRzQ29tbWl0KCk7IH0KKworICAgIFNrUG9pbnQgcG9zaXRpb24oKSBjb25zdCB7
IHJldHVybiBtX3Bvc2l0aW9uOyB9CisKKyAgICB2b2lkIHNldFpQb3NpdGlvbihmbG9hdCB6UG9z
aXRpb24pIHsgbV96UG9zaXRpb24gPSB6UG9zaXRpb247IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAg
ICBTa1NjYWxhciB6UG9zaXRpb24oKSBjb25zdCB7ICByZXR1cm4gbV96UG9zaXRpb247IH0KKwor
ICAgIGNvbnN0IExheWVyU2tpYSogcm9vdExheWVyKCkgY29uc3Q7CisKKyAgICB2b2lkIHJlbW92
ZUFsbFN1YmxheWVycygpOworCisgICAgdm9pZCBzZXRTdWJsYXllcnMoY29uc3QgVmVjdG9yPFJl
ZlB0cjxMYXllclNraWE+ID4mKTsKKworICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8TGF5ZXJTa2lh
PiA+JiBnZXRTdWJsYXllcnMoKSBjb25zdCB7IHJldHVybiBtX3N1YmxheWVyczsgfQorCisgICAg
dm9pZCBzZXRTdWJsYXllclRyYW5zZm9ybShjb25zdCBTa01hdHJpeCYgdHJhbnNmb3JtKSB7IG1f
c3VibGF5ZXJUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07IHNldE5lZWRzQ29tbWl0KCk7IH0KKyAgICBj
b25zdCBTa01hdHJpeCYgc3VibGF5ZXJUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX3N1Ymxh
eWVyVHJhbnNmb3JtOyB9CisKKyAgICB2b2lkIHNldFN1cGVybGF5ZXIoTGF5ZXJTa2lhKiBzdXBl
cmxheWVyKTsKKyAgICBMYXllclNraWEqIHN1cGVybGF5ZXIoKSBjb25zdDsKKworCisgICAgdm9p
ZCBzZXRUcmFuc2Zvcm0oY29uc3QgU2tNYXRyaXgmIHRyYW5zZm9ybSkgeyBtX3RyYW5zZm9ybSA9
IHRyYW5zZm9ybTsgc2V0TmVlZHNDb21taXQoKTsgfQorICAgIGNvbnN0IFNrTWF0cml4JiB0cmFu
c2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX3RyYW5zZm9ybTsgfQorCisgICAgdm9pZCBzZXRHZW9t
ZXRyeUZsaXBwZWQoYm9vbCBmbGlwcGVkKSB7IG1fZ2VvbWV0cnlGbGlwcGVkID0gZmxpcHBlZDsg
c2V0TmVlZHNDb21taXQoKTsgfQorICAgIGJvb2wgZ2VvbWV0cnlGbGlwcGVkKCkgY29uc3QgeyBy
ZXR1cm4gbV9nZW9tZXRyeUZsaXBwZWQ7IH0KKworICAgIHZvaWQgdXBkYXRlQ29udGVudHMoKTsK
KworICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBwbGF0Zm9ybUNhbnZhcygpIHsgcmV0dXJuIG1f
Y2FudmFzLmdldCgpOyB9CisgICAgR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQoKSB7
IHJldHVybiBtX2dyYXBoaWNzQ29udGV4dC5nZXQoKTsgfQorCisgICAgdm9pZCBzZXRCYWNraW5n
U3RvcmVSZWN0KGNvbnN0IFNrSVJlY3QmKTsKKworcHJpdmF0ZToKKyAgICBMYXllclNraWEoTGF5
ZXJUeXBlLCBHcmFwaGljc0xheWVyU2tpYSogb3duZXIpOworCisgICAgdm9pZCBzZXROZWVkc0Nv
bW1pdCgpOworCisgICAgdm9pZCBwYWludE1lKCk7CisKKyAgICBzaXplX3QgbnVtU3VibGF5ZXJz
KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3N1YmxheWVycy5zaXplKCk7CisgICAg
fQorCisgICAgLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHN1YmxheWVyIG9yIC0xIGlmIG5v
dCBmb3VuZC4KKyAgICBpbnQgaW5kZXhPZlN1YmxheWVyKGNvbnN0IExheWVyU2tpYSopOworCisg
ICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSByZW1vdmVGcm9tU3VwZXJsYXll
ci4KKyAgICB2b2lkIHJlbW92ZVN1YmxheWVyKExheWVyU2tpYSopOworCisgICAgLy8gUmUtY3Jl
YXRlIHRoZSBjYW52YXMgYW5kIGdyYXBoaWNzIGNvbnRleHQuIFRoaXMgbWV0aG9kCisgICAgLy8g
bXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgbGF5ZXIgaXMgcmVzaXplZC4KKyAgICB2b2lk
IHVwZGF0ZUdyYXBoaWNzQ29udGV4dChjb25zdCBTa0lSZWN0Jik7CisKKyAgICBWZWN0b3I8UmVm
UHRyPExheWVyU2tpYT4gPiBtX3N1YmxheWVyczsKKyAgICBMYXllclNraWEqIG1fc3VwZXJsYXll
cjsKKworICAgIEdyYXBoaWNzTGF5ZXJTa2lhKiBtX293bmVyOworICAgIE93blB0cjxza2lhOjpQ
bGF0Zm9ybUNhbnZhcz4gbV9jYW52YXM7CisgICAgT3duUHRyPFBsYXRmb3JtQ29udGV4dFNraWE+
IG1fc2tpYUNvbnRleHQ7CisgICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dD4gbV9ncmFwaGljc0Nv
bnRleHQ7CisKKyAgICBMYXllclR5cGUgbV9sYXllclR5cGU7CisKKyAgICBTa0lSZWN0IG1fYm91
bmRzOworICAgIFNrSVJlY3QgbV9iYWNraW5nU3RvcmVSZWN0OworICAgIFNrUG9pbnQgbV9wb3Np
dGlvbjsKKyAgICBTa1BvaW50IG1fYW5jaG9yUG9pbnQ7CisgICAgQ29sb3IgbV9iYWNrZ3JvdW5k
Q29sb3I7CisgICAgQ29sb3IgbV9ib3JkZXJDb2xvcjsKKworICAgIFNrUmVjdCBtX2ZyYW1lOwor
ICAgIFNrTWF0cml4IG1fdHJhbnNmb3JtOworICAgIFNrTWF0cml4IG1fc3VibGF5ZXJUcmFuc2Zv
cm07CisKKyAgICB1aW50MzJfdCBtX2VkZ2VBbnRpYWxpYXNpbmdNYXNrOworICAgIGZsb2F0IG1f
b3BhY2l0eTsKKyAgICBmbG9hdCBtX3pQb3NpdGlvbjsKKyAgICBmbG9hdCBtX2FuY2hvclBvaW50
WjsKKyAgICBmbG9hdCBtX2JvcmRlcldpZHRoOworCisgICAgYm9vbCBtX2NsZWFyc0NvbnRleHQ7
CisgICAgYm9vbCBtX2RvdWJsZVNpZGVkOworICAgIGJvb2wgbV9oaWRkZW47CisgICAgYm9vbCBt
X21hc2tzVG9Cb3VuZHM7CisgICAgYm9vbCBtX29wYXF1ZTsKKyAgICBib29sIG1fZ2VvbWV0cnlG
bGlwcGVkOworICAgIGJvb2wgbV9uZWVkc0Rpc3BsYXlPbkJvdW5kc0NoYW5nZTsKKworICAgIENv
bnRlbnRzR3Jhdml0eVR5cGUgbV9jb250ZW50c0dyYXZpdHk7CisgICAgU3RyaW5nIG1fbmFtZTsK
K307CisKK30KKworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2Vu
ZGlmCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU2MTgyKQorKysgV2ViS2l0L2Nocm9taXVt
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQxIEBACisyMDEwLTAzLTE4ICBW
YW5nZWxpcyBLb2trZXZpcyAgPHZhbmdlbGlzQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGRpbmcgc3VwcG9ydCBmb3IgdGhl
IEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HIHJlbmRlciBwYXRoIHRvIENocm9taXVtLgorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzU1NTcKKyAgICAgICAg
Q3VycmVudGx5IGNvbXBvc2l0aW5nIG9mIGxheWVycyBpcyBwZXJmb3JtZWQgdmlhIHMvdyBjb21w
b3NpdG9yIHdoaWNoIHJlbGllcyBvbiBTa2lhLiBUaGlzIGlzIGFuIGluaXRpYWwgY2hlY2staW4K
KyAgICAgICAgYW5kIGl0J3Mgb25seSBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzLiBDb21waWxpbmcg
dGhlIGNvZGUgcmVxdWlyZXMgc2V0aW5nICJ1c2VfYWNjZWxlcmF0ZWRfY29tcG9zaXRpbmc9MSIK
KyAgICAgICAgdG8gR1lQX0RFRklORVMuIFRoZSB1cGRhdGUgb2YgbGF5ZXIgY29udGVudHMgYW5k
IGNvbXBvc2l0aW5nIGlzIGZhaXJseSBpbmVmZmljaWVudCBidXQgdGhpcyB3aWxsIGJlIGZpeGVk
IGluCisgICAgICAgIHN1YnNlcXVlbnQgY2hlY2staW5zLgorCisgICAgICAgICogc3JjL0Nocm9t
ZUNsaWVudEltcGwuY3BwOgorICAgICAgICAoV2ViS2l0OjpDaHJvbWVDbGllbnRJbXBsOjphdHRh
Y2hSb290R3JhcGhpY3NMYXllcik6CisgICAgICAgIChXZWJLaXQ6OkNocm9tZUNsaWVudEltcGw6
OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5bmMpOgorICAgICAgICAqIHNyYy9DaHJvbWVDbGll
bnRJbXBsLmg6CisgICAgICAgIChXZWJLaXQ6OkNocm9tZUNsaWVudEltcGw6OnNldE5lZWRzT25l
U2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24pOgorICAgICAgICAgQWRkZWQgbWV0aG9kcyByZXF1
aXJlZCBieSB0aGUgUmVuZGVyTGF5ZXJDb21wb3NpdG9yCisKKyAgICAgICAgKiBzcmMvV2ViRnJh
bWVJbXBsLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViRnJhbWVJbXBsOjpwYWludFdpdGhDb250
ZXh0KToKKyAgICAgICAgKFdlYktpdDo6V2ViRnJhbWVJbXBsOjpwYWludCk6CisgICAgICAgICog
c3JjL1dlYkZyYW1lSW1wbC5oOgorICAgICAgICBTcGxpdCBXZWJGcmFtZUltcGw6OnBhaW50KCkg
aW50byB0d28gbWV0aG9kcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGNhbGwgdGhlIHBhaW50Cisg
ICAgICAgIHJvdXRpbmUgd2l0aCBhbiBleGlzdGluZyBHcmFwaGljc0NvbnRleHQsIHdoaWNoIGlz
IG5lY2Vzc2FyeSBmb3IgcGFpbnRpbmcgdGhlIHJvb3QgbGF5ZXIgaW50bworICAgICAgICBpdHMg
b3duIGJhY2tpbmcgc3VyZmFjZS4KKworICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6Cisg
ICAgICAgIChXZWJLaXQ6OldlYlZpZXdJbXBsOjpXZWJWaWV3SW1wbCk6CisgICAgICAgIChXZWJL
aXQ6OldlYlZpZXdJbXBsOjpwYWludCk6CisgICAgICAgIE1vZGlmaWVkIG1ldGhvZCB0byBoYW5k
bGUgdGhlIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIHBhdGguIE5vdywgd2hlbiBkb2luZyBhY2Nl
bGVyYXRlZCBjb21wb3NpdGluZywKKyAgICAgICAgcGFpbnQoKSByZXN1bHRzIGluIHJlcGFpbnRp
bmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGxheWVyIGFuZCB0aGVuIGRvaW5nIGEgY29tcG9z
aXRlIG9wZXJhdGlvbi4KKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNldFJvb3RHcmFw
aGljc0xheWVyKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OnNldEFjY2VsZXJhdGVk
Q29tcG9zaXRpbmcpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6dXBkYXRlUm9vdExh
eWVyQ29udGVudHMpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6c2V0Um9vdExheWVy
TmVlZHNEaXNwbGF5KToKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuaDoKKyAgICAgICAgKFdl
YktpdDo6V2ViVmlld0ltcGw6OmlzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyk6CisKIDIwMTAtMDMt
MTIgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBi
eSBEYXZpZCBMZXZpbi4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xpZW50SW1w
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBs
LmNwcAkocmV2aXNpb24gNTYxNzkpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVu
dEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSAiR2Vv
bG9jYXRpb25TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiR2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlQ2hy
b21pdW0uaCIKICNpbmNsdWRlICJHZW9sb2NhdGlvblNlcnZpY2VDaHJvbWl1bS5oIgorI2luY2x1
ZGUgIkdyYXBoaWNzTGF5ZXIuaCIKICNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAjaW5jbHVk
ZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIk5vZGUuaCIKQEAgLTY5Nyw0ICs2OTgsMTYgQEAgdm9p
ZCBDaHJvbWVDbGllbnRJbXBsOjpyZXF1ZXN0R2VvbG9jYXRpbwogICAgIG1fd2ViVmlldy0+Y2xp
ZW50KCktPmdldEdlb2xvY2F0aW9uU2VydmljZSgpLT5yZXF1ZXN0UGVybWlzc2lvbkZvckZyYW1l
KGdlb2xvY2F0aW9uU2VydmljZS0+Z2VvbG9jYXRpb25TZXJ2aWNlQnJpZGdlKCktPmdldEJyaWRn
ZUlkKCksIGZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSk7CiB9CiAKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCit2b2lkIENocm9tZUNsaWVudEltcGw6OmF0dGFjaFJvb3RHcmFwaGlj
c0xheWVyKEZyYW1lKiBmcmFtZSwgR3JhcGhpY3NMYXllciogZ3JhcGhpY3NMYXllcikKK3sKKyAg
ICBtX3dlYlZpZXctPnNldFJvb3RHcmFwaGljc0xheWVyKGdyYXBoaWNzTGF5ZXIgPyBncmFwaGlj
c0xheWVyLT5wbGF0Zm9ybUxheWVyKCkgOiAwKTsKK30KKwordm9pZCBDaHJvbWVDbGllbnRJbXBs
OjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJTeW5jKCkKK3sKKyAgICBtX3dlYlZpZXctPnNldFJv
b3RMYXllck5lZWRzRGlzcGxheSgpOworfQorI2VuZGlmCisKIH0gLy8gbmFtZXNwYWNlIFdlYktp
dApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgJKHJldmlzaW9uIDU2
MTc5KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTEzMyw2ICsxMzMsMTggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBuZWVk
VG91Y2hFdmVudHMoYm9vbCBuZWVkVG91Y2hFdmVudHMpIHsgfQogI2VuZGlmCiAKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLy8gUGFzcyAwIGFzIHRoZSBHcmFwaGljc0xh
eWVyIHRvIGRldGF0Y2ggdGhlIHJvb3QgbGF5ZXIuCisgICAgdmlydHVhbCB2b2lkIGF0dGFjaFJv
b3RHcmFwaGljc0xheWVyKFdlYkNvcmU6OkZyYW1lKiwgV2ViQ29yZTo6R3JhcGhpY3NMYXllciop
OworCisgICAgLy8gU2V0cyBhIGZsYWcgdG8gc3BlY2lmeSB0aGF0IHRoZSBuZXh0IHRpbWUgY29u
dGVudCBpcyBkcmF3biB0byB0aGUgd2luZG93LAorICAgIC8vIHRoZSBjaGFuZ2VzIGFwcGVhciBv
biB0aGUgc2NyZWVuIGluIHN5bmNocm9ueSB3aXRoIHVwZGF0ZXMgdG8gR3JhcGhpY3NMYXllcnMu
CisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24o
KSB7IH0KKworICAgIC8vIFNldHMgYSBmbGFnIHRvIHNwZWNpZnkgdGhhdCB0aGUgdmlldyBuZWVk
cyB0byBiZSB1cGRhdGVkLCBzbyB3ZSBuZWVkCisgICAgLy8gdG8gZG8gYW4gZWFnZXIgbGF5b3V0
IGJlZm9yZSB0aGUgZHJhd2luZy4KKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVDb21wb3NpdGlu
Z0xheWVyU3luYygpOworI2VuZGlmCiAgICAgLy8gQ2hyb21lQ2xpZW50Q2hyb21pdW0gbWV0aG9k
czoKICAgICB2aXJ0dWFsIHZvaWQgcG9wdXBPcGVuZWQoV2ViQ29yZTo6UG9wdXBDb250YWluZXIq
IHBvcHVwQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJD
b3JlOjpJbnRSZWN0JiBib3VuZHMsCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZyYW1l
SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJGcmFtZUltcGwu
Y3BwCShyZXZpc2lvbiA1NjE3OSkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBs
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTc1MiwxMSArMTc1MiwyMyBAQCB2b2lkIFdlYkZyYW1l
SW1wbDo6bGF5b3V0KCkKICAgICAgICAgdmlldy0+bGF5b3V0SWZOZWVkZWRSZWN1cnNpdmUoKTsK
IH0KIAordm9pZCBXZWJGcmFtZUltcGw6OnBhaW50V2l0aENvbnRleHQoR3JhcGhpY3NDb250ZXh0
JiBnYywgY29uc3QgV2ViUmVjdCYgcmVjdCkKK3sKKyAgICBJbnRSZWN0IGRpcnR5UmVjdChyZWN0
KTsKKyAgICBnYy5zYXZlKCk7CisgICAgaWYgKG1fZnJhbWUtPmRvY3VtZW50KCkgJiYgZnJhbWVW
aWV3KCkpIHsKKyAgICAgICAgZ2MuY2xpcChkaXJ0eVJlY3QpOworICAgICAgICBmcmFtZVZpZXco
KS0+cGFpbnQoJmdjLCBkaXJ0eVJlY3QpOworICAgICAgICBtX2ZyYW1lLT5wYWdlKCktPmluc3Bl
Y3RvckNvbnRyb2xsZXIoKS0+ZHJhd05vZGVIaWdobGlnaHQoZ2MpOworICAgIH0gZWxzZQorICAg
ICAgICBnYy5maWxsUmVjdChkaXJ0eVJlY3QsIENvbG9yOjp3aGl0ZSwgRGV2aWNlQ29sb3JTcGFj
ZSk7CisgICAgZ2MucmVzdG9yZSgpOworfQorCiB2b2lkIFdlYkZyYW1lSW1wbDo6cGFpbnQoV2Vi
Q2FudmFzKiBjYW52YXMsIGNvbnN0IFdlYlJlY3QmIHJlY3QpCiB7CiAgICAgaWYgKHJlY3QuaXNF
bXB0eSgpKQogICAgICAgICByZXR1cm47Ci0gICAgSW50UmVjdCBkaXJ0eVJlY3QocmVjdCk7CiAj
aWYgV0VCS0lUX1VTSU5HX0NHCiAgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNhbnZhcyk7CiAgICAg
TG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dCgmZ2MpOwpAQCAtMTc2OCwx
NCArMTc4MCw3IEBAIHZvaWQgV2ViRnJhbWVJbXBsOjpwYWludChXZWJDYW52YXMqIGNhbnYKICNl
bHNlCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKICNlbmRpZgotICAgIGdjLnNhdmUoKTsKLSAgICBp
ZiAobV9mcmFtZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZVZpZXcoKSkgewotICAgICAgICBnYy5jbGlw
KGRpcnR5UmVjdCk7Ci0gICAgICAgIGZyYW1lVmlldygpLT5wYWludCgmZ2MsIGRpcnR5UmVjdCk7
Ci0gICAgICAgIG1fZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5kcmF3Tm9k
ZUhpZ2hsaWdodChnYyk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGdjLmZpbGxSZWN0KGRpcnR5UmVj
dCwgQ29sb3I6OndoaXRlLCBEZXZpY2VDb2xvclNwYWNlKTsKLSAgICBnYy5yZXN0b3JlKCk7Cisg
ICAgcGFpbnRXaXRoQ29udGV4dChnYywgcmVjdCk7CiB9CiAKIHZvaWQgV2ViRnJhbWVJbXBsOjpj
cmVhdGVGcmFtZVZpZXcoKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJGcmFtZUltcGwu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZyYW1lSW1wbC5oCShyZXZp
c2lvbiA1NjE3OSkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBsLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJXZWJBbmltYXRpb25Db250cm9s
bGVySW1wbC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBHcmFwaGljc0NvbnRleHQ7
CiBjbGFzcyBIaXN0b3J5SXRlbTsKIGNsYXNzIEtVUkw7CiBjbGFzcyBOb2RlOwpAQCAtMTgxLDYg
KzE4Miw3IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgbGF5b3V0KCk7CiAgICAgdm9pZCBwYWludChX
ZWJDYW52YXMqLCBjb25zdCBXZWJSZWN0Jik7CisgICAgdm9pZCBwYWludFdpdGhDb250ZXh0KFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dCYsIGNvbnN0IFdlYlJlY3QmKTsKICAgICB2b2lkIGNyZWF0
ZUZyYW1lVmlldygpOwogCiAgICAgc3RhdGljIFdlYkZyYW1lSW1wbCogZnJvbUZyYW1lKFdlYkNv
cmU6OkZyYW1lKiBmcmFtZSk7CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBs
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAko
cmV2aXNpb24gNTYxNzkpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjQ2LDYgKzI0NiwxMCBAQCBXZWJWaWV3SW1wbDo6V2ViVmlld0lt
cGwoV2ViVmlld0NsaWVudCogCiAgICAgLCBtX2lzVHJhbnNwYXJlbnQoZmFsc2UpCiAgICAgLCBt
X3RhYnNUb0xpbmtzKGZhbHNlKQogICAgICwgbV9oYXZlTW91c2VDYXB0dXJlKGZhbHNlKQorI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAsIG1fbGF5ZXJSZW5kZXJlcigwKQor
ICAgICwgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoZmFsc2UpCisjZW5kaWYKIHsKICAgICAv
LyBXZWJLaXQvd2luL1dlYlZpZXcuY3BwIGRvZXMgdGhlIHNhbWUgdGhpbmcsIGV4Y2VwdCB0aGV5
IGNhbGwgdGhlCiAgICAgLy8gS0pTIHNwZWNpZmljIHdyYXBwZXIgYXJvdW5kIHRoaXMgbWV0aG9k
LiBXZSBuZWVkIHRvIGhhdmUgdGhyZWFkaW5nCkBAIC04OTIsOSArODk2LDMwIEBAIHZvaWQgV2Vi
Vmlld0ltcGw6OmxheW91dCgpCiAKIHZvaWQgV2ViVmlld0ltcGw6OnBhaW50KFdlYkNhbnZhcyog
Y2FudmFzLCBjb25zdCBXZWJSZWN0JiByZWN0KQogewotICAgIFdlYkZyYW1lSW1wbCogd2ViZnJh
bWUgPSBtYWluRnJhbWVJbXBsKCk7Ci0gICAgaWYgKHdlYmZyYW1lKQotICAgICAgICB3ZWJmcmFt
ZS0+cGFpbnQoY2FudmFzLCByZWN0KTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyAgICBpZiAoIWlzQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpKSB7CisjZW5kaWYKKyAgICAg
ICAgV2ViRnJhbWVJbXBsKiB3ZWJmcmFtZSA9IG1haW5GcmFtZUltcGwoKTsKKyAgICAgICAgaWYg
KHdlYmZyYW1lKQorICAgICAgICAgICAgd2ViZnJhbWUtPnBhaW50KGNhbnZhcywgcmVjdCk7Cisj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIH0gZWxzZSB7CisgICAgICAgIC8v
IERyYXcgdGhlIGNvbnRlbnRzIG9mIHRoZSByb290IGxheWVyLgorICAgICAgICB1cGRhdGVSb290
TGF5ZXJDb250ZW50cyhyZWN0KTsKKworICAgICAgICAvLyBGSVhNRTogTGF5ZXJzIHNob3VsZCBu
b3QgYmUgZm9yY2VkIHRvIHJlZHJhdyB0aGVpciBjb250ZW50cworICAgICAgICAvLyBoZXJlIGJ1
dCBzaG91bGQgdXBkYXRlIGFzIG5lZWRlZC4KKyAgICAgICAgbV9sYXllclJlbmRlcmVyLT51cGRh
dGVMYXllckNvbnRlbnRzKCk7CisKKyAgICAgICAgLy8gQ29tcG9zaXRlIGV2ZXJ5dGhpbmcgaW50
byB0aGUgY2FudmFzIHRoYXQncyBwYXNzZWQgdG8gdXMuCisgICAgICAgIFNrSVJlY3QgY2FudmFz
SVJlY3Q7CisgICAgICAgIGNhbnZhc0lSZWN0LnNldChyZWN0LngsIHJlY3QueSwgcmVjdC54ICsg
cmVjdC53aWR0aCwgcmVjdC55ICsgcmVjdC5oZWlnaHQpOworICAgICAgICBTa1JlY3QgY2FudmFz
UmVjdDsKKyAgICAgICAgY2FudmFzUmVjdC5zZXQoY2FudmFzSVJlY3QpOworICAgICAgICBtX2xh
eWVyUmVuZGVyZXItPmRyYXdMYXllcnNJbkNhbnZhcyhzdGF0aWNfY2FzdDxza2lhOjpQbGF0Zm9y
bUNhbnZhcyo+KGNhbnZhcyksIGNhbnZhc1JlY3QpOworICAgIH0KKyNlbmRpZgogfQogCiAvLyBG
SVhNRTogbV9jdXJyZW50SW5wdXRFdmVudCBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIENocm9tZUNs
aWVudDo6c2hvdygpIGNhbgpAQCAtMTk3Nyw0ICsyMDAyLDc4IEBAIGJvb2wgV2ViVmlld0ltcGw6
OnRhYnNUb0xpbmtzKCkgY29uc3QKICAgICByZXR1cm4gbV90YWJzVG9MaW5rczsKIH0KIAorI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK3ZvaWQgV2ViVmlld0ltcGw6OnNldFJvb3RH
cmFwaGljc0xheWVyKFdlYkNvcmU6OlBsYXRmb3JtTGF5ZXIqIGxheWVyKQoreworICAgIHNldEFj
Y2VsZXJhdGVkQ29tcG9zaXRpbmcobGF5ZXIgPyB0cnVlIDogZmFsc2UpOworICAgIGlmIChtX2xh
eWVyUmVuZGVyZXIpCisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+c2V0Um9vdExheWVyKGxheWVy
KTsKK30KKwordm9pZCBXZWJWaWV3SW1wbDo6c2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhib29s
IGFjY2VsZXJhdGVkKQoreworICAgIGlmIChtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyA9PSBh
Y2NlbGVyYXRlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGFjY2VsZXJhdGVkKSB7Cisg
ICAgICAgIG1fbGF5ZXJSZW5kZXJlciA9IExheWVyUmVuZGVyZXJTa2lhOjpjcmVhdGUoKTsKKyAg
ICAgICAgaWYgKG1fbGF5ZXJSZW5kZXJlcikKKyAgICAgICAgICAgIG1faXNBY2NlbGVyYXRlZENv
bXBvc2l0aW5nID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2xheWVyUmVuZGVyZXIg
PSAwOworICAgICAgICBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZyA9IGZhbHNlOworICAgIH0K
K30KKwordm9pZCBXZWJWaWV3SW1wbDo6dXBkYXRlUm9vdExheWVyQ29udGVudHMoY29uc3QgV2Vi
UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIWlzQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBXZWJGcmFtZUltcGwqIHdlYmZyYW1lID0gbWFpbkZyYW1lSW1w
bCgpOworICAgIGlmICghd2ViZnJhbWUpCisgICAgICAgIHJldHVybjsKKyAgICBGcmFtZVZpZXcq
IHZpZXcgPSB3ZWJmcmFtZS0+ZnJhbWVWaWV3KCk7CisgICAgaWYgKCF2aWV3KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBXZWJSZWN0IHZpZXdSZWN0ID0gdmlldy0+ZnJhbWVSZWN0KCk7CisgICAg
U2tJUmVjdCBzY3JvbGxGcmFtZTsKKyAgICBzY3JvbGxGcmFtZS5zZXQodmlldy0+c2Nyb2xsWCgp
LCB2aWV3LT5zY3JvbGxZKCksIHZpZXctPmxheW91dFdpZHRoKCkgKyB2aWV3LT5zY3JvbGxYKCks
IHZpZXctPmxheW91dEhlaWdodCgpICsgdmlldy0+c2Nyb2xsWSgpKTsKKyAgICBtX2xheWVyUmVu
ZGVyZXItPnNldFNjcm9sbEZyYW1lKHNjcm9sbEZyYW1lKTsKKyAgICBMYXllclNraWEqIHJvb3RM
YXllciA9IG1fbGF5ZXJSZW5kZXJlci0+cm9vdExheWVyKCk7CisgICAgaWYgKHJvb3RMYXllcikg
eworICAgICAgICBTa0lSZWN0IHJvb3RMYXllckJvdW5kczsKKyAgICAgICAgSW50UmVjdCB2aXNp
YmxlUmVjdCA9IHZpZXctPnZpc2libGVDb250ZW50UmVjdCh0cnVlKTsKKworICAgICAgICAvLyBT
ZXQgdGhlIGJhY2tpbmcgc3RvcmUgc2l6ZSB1c2VkIGJ5IHRoZSByb290IGxheWVyIHRvIGJlIHRo
ZSBzaXplIG9mIHRoZSB2aXNpYmxlCisgICAgICAgIC8vIGFyZWEuIE5vdGUgdGhhdCB0aGUgcm9v
dCBsYXllciBib3VuZHMgY291bGQgYmUgbGFyZ2VyIHRoYW4gdGhlIGJhY2tpbmcgc3RvcmUgc2l6
ZSwKKyAgICAgICAgLy8gYnV0IHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHdhc3RlIG1lbW9yeSBieSBh
bGxvY2F0aW5nIGJhY2tpbmcgc3RvcmUgbGFyZ2VyIHRoYW4gdGhlCisgICAgICAgIC8vIHZpc2li
bGUgcG9ydGlvbi4KKyAgICAgICAgcm9vdExheWVyQm91bmRzLnNldCgwLCAwLCB2aXNpYmxlUmVj
dC53aWR0aCgpLCB2aXNpYmxlUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIHJvb3RMYXllci0+c2V0
QmFja2luZ1N0b3JlUmVjdChyb290TGF5ZXJCb3VuZHMpOworICAgICAgICBHcmFwaGljc0NvbnRl
eHQqIHJvb3RMYXllckNvbnRleHQgPSByb290TGF5ZXItPmdyYXBoaWNzQ29udGV4dCgpOworICAg
ICAgICByb290TGF5ZXJDb250ZXh0LT5zYXZlKCk7CisKKyAgICAgICAgd2ViZnJhbWUtPnBhaW50
V2l0aENvbnRleHQoKihyb290TGF5ZXItPmdyYXBoaWNzQ29udGV4dCgpKSwgcmVjdCk7CisgICAg
ICAgIHJvb3RMYXllckNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViVmll
d0ltcGw6OnNldFJvb3RMYXllck5lZWRzRGlzcGxheSgpCit7CisgICAgLy8gRklYTUU6IEZvciBu
b3cgd2UncmUgcG9zdGluZyBhIHJlcGFpbnQgZXZlbnQgZm9yIHRoZSBlbnRpcmUgcGFnZSB3aGlj
aCBpcyBhbiBvdmVya2lsbC4KKyAgICBpZiAoV2ViRnJhbWVJbXBsKiB3ZWJmcmFtZSA9IG1haW5G
cmFtZUltcGwoKSkgeworICAgICAgICBpZiAoRnJhbWVWaWV3KiB2aWV3ID0gd2ViZnJhbWUtPmZy
YW1lVmlldygpKSB7CisgICAgICAgICAgICBJbnRSZWN0IHZpc2libGVSZWN0ID0gdmlldy0+dmlz
aWJsZUNvbnRlbnRSZWN0KHRydWUpOworICAgICAgICAgICAgbV9jbGllbnQtPmRpZEludmFsaWRh
dGVSZWN0KHZpc2libGVSZWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX2xheWVy
UmVuZGVyZXIpCisgICAgICAgIG1fbGF5ZXJSZW5kZXJlci0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9
CisKKyNlbmRpZgorCiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFdlYktpdC9jaHJvbWl1
bS9zcmMvV2ViVmlld0ltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dl
YlZpZXdJbXBsLmgJKHJldmlzaW9uIDU2MTc5KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJW
aWV3SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC00Myw3ICs0Myw5IEBACiAjaW5jbHVkZSAiQ29u
dGV4dE1lbnVDbGllbnRJbXBsLmgiCiAjaW5jbHVkZSAiRHJhZ0NsaWVudEltcGwuaCIKICNpbmNs
dWRlICJFZGl0b3JDbGllbnRJbXBsLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgogI2lu
Y2x1ZGUgIkluc3BlY3RvckNsaWVudEltcGwuaCIKKyNpbmNsdWRlICJMYXllclJlbmRlcmVyU2tp
YS5oIgogI2luY2x1ZGUgIk5vdGlmaWNhdGlvblByZXNlbnRlckltcGwuaCIKIAogI2luY2x1ZGUg
PHd0Zi9Pd25QdHIuaD4KQEAgLTI5OCw2ICszMDAsMTEgQEAgcHVibGljOgogICAgICAgICByZXR1
cm4gbV9jdXJyZW50SW5wdXRFdmVudDsKICAgICB9CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCisgICAgdm9pZCBzZXRSb290TGF5ZXJOZWVkc0Rpc3BsYXkoKTsKKyAgICB2b2lk
IHNldFJvb3RHcmFwaGljc0xheWVyKFdlYkNvcmU6OlBsYXRmb3JtTGF5ZXIqKTsKKyNlbmRpZgor
CiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBXZWJWaWV3OyAgLy8gU28gV2ViVmlldzo6Q3Jl
YXRlIGNhbiBjYWxsIG91ciBjb25zdHJ1Y3RvcgogICAgIGZyaWVuZCBjbGFzcyBXVEY6OlJlZkNv
dW50ZWQ8V2ViVmlld0ltcGw+OwpAQCAtMzIzLDYgKzMzMCwxMiBAQCBwcml2YXRlOgogICAgIC8v
IHRoZSBIaXRUZXN0UmVzdWx0IGZvciBpdC4KICAgICBXZWJDb3JlOjpIaXRUZXN0UmVzdWx0IGhp
dFRlc3RSZXN1bHRGb3JXaW5kb3dQb3MoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKTsKIAorI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB2b2lkIHNldEFjY2VsZXJhdGVkQ29t
cG9zaXRpbmcoYm9vbCk7CisgICAgYm9vbCBpc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSBjb25z
dCB7IHJldHVybiBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZzsgfQorICAgIHZvaWQgdXBkYXRl
Um9vdExheWVyQ29udGVudHMoY29uc3QgV2ViUmVjdCYpOworI2VuZGlmCisKICAgICBXZWJWaWV3
Q2xpZW50KiBtX2NsaWVudDsKIAogICAgIEJhY2tGb3J3YXJkTGlzdENsaWVudEltcGwgbV9iYWNr
Rm9yd2FyZExpc3RDbGllbnRJbXBsOwpAQCAtNDUwLDYgKzQ2MywxMCBAQCBwcml2YXRlOgogCiAg
ICAgYm9vbCBtX2hhdmVNb3VzZUNhcHR1cmU7CiAKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisgICAgT3duUHRyPFdlYkNvcmU6OkxheWVyUmVuZGVyZXJTa2lhPiBtX2xheWVyUmVu
ZGVyZXI7CisgICAgYm9vbCBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZzsKKyNlbmRpZgogICAg
IHN0YXRpYyBjb25zdCBXZWJJbnB1dEV2ZW50KiBtX2N1cnJlbnRJbnB1dEV2ZW50OwogfTsKIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>