<?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>49526</bug_id>
          
          <creation_ts>2010-11-14 23:44:08 -0800</creation_ts>
          <short_desc>[WK2][Qt] WebKit2 implementation of tiled backing store</short_desc>
          <delta_ts>2010-11-15 16:32:35 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</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>Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Andreas Kling">kling</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>kenneth</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>309195</commentid>
    <comment_count>0</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-11-14 23:44:08 -0800</bug_when>
    <thetext>Patch coming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>309196</commentid>
    <comment_count>1</comment_count>
      <attachid>73877</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-11-14 23:48:50 -0800</bug_when>
    <thetext>Created attachment 73877
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>309209</commentid>
    <comment_count>2</comment_count>
      <attachid>73877</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-11-15 02:24:53 -0800</bug_when>
    <thetext>Comment on attachment 73877
Proposed patch

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

First round of comments.

&gt; WebKit2/Shared/CoreIPCSupport/DrawingAreaMessageKinds.h:50
&gt; +    // Called to request a tile update

Add a dot at the end

&gt; WebKit2/Shared/CoreIPCSupport/DrawingAreaMessageKinds.h:53
&gt; +    // Called to cancel a requested tile update

Here as well

&gt; WebKit2/Shared/CoreIPCSupport/DrawingAreaMessageKinds.h:54
&gt; +    CancelTileUpdate,

You have UpdateTile and CancelTileUpdate? Maybe the former should be called RequestTileUpdate?

&gt; WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h:44
&gt; +    TileUpdatesComplete,

Maybe a better name can be found, as it is not clear what it complete. a current round of tile updates?

&gt; WebKit2/UIProcess/API/qt/qgraphicswkview.cpp:52
&gt; +    void _q_scaleChanged();
&gt; +    void commitScale();

Why is one with _q_? and the other not? Should both be, or none be?

&gt; WebKit2/UIProcess/API/qt/qgraphicswkview.cpp:74
&gt; +    PassOwnPtr&lt;DrawingAreaProxy&gt; drawingAreaProxy;
&gt; +#if ENABLE(TILED_BACKING_STORE)
&gt; +    if (backingStoreType == Tiled) {
&gt; +        drawingAreaProxy = TiledDrawingAreaProxy::create(this);
&gt; +        connect(this, SIGNAL(scaleChanged()), this, SLOT(_q_scaleChanged()));
&gt; +    } else
&gt; +#endif
&gt; +        drawingAreaProxy = ChunkedUpdateDrawingAreaProxy::create(this);

switch instead?

&gt; WebKit2/UIProcess/API/qt/qgraphicswkview.cpp:78
&gt; +    d-&gt;page-&gt;setViewportSize(geometry().size().toSize());

does this make sense? What about setResizesToConten....

&gt; WebKit2/UIProcess/API/qt/qgraphicswkview.cpp:314
&gt; +void QGraphicsWKView::commitScaleChange()

You have begin and commit? Submit, commit? or begin, end?

&gt; WebKit2/UIProcess/API/qt/qgraphicswkview.cpp:341
&gt; +        // For now we block until complete

dot at the end

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:57
&gt; +    , m_tileCreationDelay(0.01)
&gt; +    , m_keepAreaMultiplier(2.5f, 4.5f)

Why the f some places but not all?

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:84
&gt; +    page-&gt;process()-&gt;send(DrawingAreaMessage::SetSize, page-&gt;pageID(), CoreIPC::In(viewSize));

This is using old API, you should be able to call sent(DrawingAreaMessage::SetSize(viewSize) I beleive

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:105
&gt; +    page-&gt;process()-&gt;send(DrawingAreaMessage::ResumePainting, page-&gt;pageID(), CoreIPC::In());

Here as well

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:125
&gt; +void TiledDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
&gt; +{
&gt; +    switch (messageID.get&lt;DrawingAreaProxyMessage::Kind&gt;()) {
&gt; +    case DrawingAreaProxyMessage::TileUpdated: {

Can you verify it this is the way it is still done?

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:172
&gt; +    page()-&gt;process()-&gt;connection()-&gt;send(DrawingAreaMessage::UpdateTile, page()-&gt;pageID(), CoreIPC::In(tileID, dirtyRect, contentsScale()));

new api

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:182
&gt; +        static const double ipcTimeout = 2.0;

Is ipcTimeout the best name?

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:349
&gt; +    IntRect visibleRect = mapFromContents(webViewVisibleRect());

I think we need to hook this up to visibleContentRect from webcore.

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:383
&gt; +    // Manhattan distance, biased so that vertical distances are shorter.

Would be nice with a why

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:458
&gt; +    // Now construct the tile(s)

dot at end

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:465
&gt; +    // Paint the content of the newly created tiles

Dot at end

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:477
&gt; +    bool resized = false;

wasResized?

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:535
&gt; +    page-&gt;process()-&gt;send(DrawingAreaMessage::CancelTileUpdate, page-&gt;pageID(), CoreIPC::In(tile-&gt;ID()));

new API?

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.h:92
&gt; +    void getKeepAndCoverAreaMultipliers(WebCore::FloatSize&amp; keepMultiplier, WebCore::FloatSize&amp; coverMultiplier)

Remove get?

&gt; WebKit2/WebProcess/WebPage/TiledDrawingArea.cpp:94
&gt; +    // Layout if necessary.
&gt; +    m_webPage-&gt;layoutIfNeeded();

that comment is quite useless :-)

&gt; WebKit2/WebProcess/WebPage/TiledDrawingArea.cpp:124
&gt; +    WebProcess::shared().connection()-&gt;send(DrawingAreaProxyMessage::DidSetSize, m_webPage-&gt;pageID(), CoreIPC::In(viewSize));

new API?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>309239</commentid>
    <comment_count>3</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-11-15 04:35:55 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; You have UpdateTile and CancelTileUpdate? Maybe the former should be called RequestTileUpdate?

Okydoky.

&gt; &gt; WebKit2/Shared/CoreIPCSupport/DrawingAreaProxyMessageKinds.h:44
&gt; &gt; +    TileUpdatesComplete,
&gt; 
&gt; Maybe a better name can be found, as it is not clear what it complete. a current round of tile updates?

Indeed. It fires when there are no more tile update requests pending.
Any ideas for something better? RequestedTilesUpdated?

&gt; &gt; WebKit2/UIProcess/API/qt/qgraphicswkview.cpp:52
&gt; &gt; +    void _q_scaleChanged();
&gt; &gt; +    void commitScale();
&gt; 
&gt; Why is one with _q_? and the other not? Should both be, or none be?

The _q_ is Qt convention for handling the public class&apos;s signal in the private class. We could call it e.g. onScaleChanged() instead, I don&apos;t really mind.

&gt; &gt; WebKit2/UIProcess/API/qt/qgraphicswkview.cpp:78
&gt; &gt; +    d-&gt;page-&gt;setViewportSize(geometry().size().toSize());
&gt; 
&gt; does this make sense? What about setResizesToConten....

Hmhmhm.. you want to hardcode setRTC in tiling mode?

&gt; &gt; WebKit2/UIProcess/API/qt/qgraphicswkview.cpp:314
&gt; &gt; +void QGraphicsWKView::commitScaleChange()
&gt; 
&gt; You have begin and commit? Submit, commit? or begin, end?

Will change to begin/end.

&gt; This is using old API, you should be able to call sent(DrawingAreaMessage::SetSize(viewSize) I beleive

The necessary code isn&apos;t generated for this class. Fixable of course, but I&apos;d rather do that in a separate patch.

&gt; &gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:125
&gt; &gt; +void TiledDrawingAreaProxy::didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
&gt; &gt; +{
&gt; &gt; +    switch (messageID.get&lt;DrawingAreaProxyMessage::Kind&gt;()) {
&gt; &gt; +    case DrawingAreaProxyMessage::TileUpdated: {
&gt; 
&gt; Can you verify it this is the way it is still done?

It is.

&gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:182
&gt; &gt; +        static const double ipcTimeout = 2.0;
&gt; 
&gt; Is ipcTimeout the best name?

Maybe not.. I&apos;ll call it tileUpdateTimeout instead then.

&gt; &gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:349
&gt; &gt; +    IntRect visibleRect = mapFromContents(webViewVisibleRect());
&gt; 
&gt; I think we need to hook this up to visibleContentRect from webcore.

Ok.

&gt; &gt; WebKit2/UIProcess/TiledDrawingAreaProxy.cpp:477
&gt; &gt; +    bool resized = false;
&gt; 
&gt; wasResized?

Ok.

&gt; &gt; WebKit2/UIProcess/TiledDrawingAreaProxy.h:92
&gt; &gt; +    void getKeepAndCoverAreaMultipliers(WebCore::FloatSize&amp; keepMultiplier, WebCore::FloatSize&amp; coverMultiplier)
&gt; 
&gt; Remove get?

I&apos;d rather not</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>309240</commentid>
    <comment_count>4</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-11-15 04:37:20 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; &gt; &gt; WebKit2/UIProcess/TiledDrawingAreaProxy.h:92
&gt; &gt; &gt; +    void getKeepAndCoverAreaMultipliers(WebCore::FloatSize&amp; keepMultiplier, WebCore::FloatSize&amp; coverMultiplier)
&gt; &gt; 
&gt; &gt; Remove get?
&gt; 
&gt; I&apos;d rather not

Premature submit- I&apos;d rather not since the method isn&apos;t returning anything but modifying output vars. What would you suggest?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>309321</commentid>
    <comment_count>5</comment_count>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-11-15 09:35:09 -0800</bug_when>
    <thetext>Committed r72010: &lt;http://trac.webkit.org/changeset/72010&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>309334</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-11-15 10:23:44 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/72010 might have broken Leopard Intel Release (Tests)
The following tests are not passing:
fast/workers/storage/interrupt-database-sync.html</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>73877</attachid>
            <date>2010-11-14 23:48:50 -0800</date>
            <delta_ts>2010-11-15 16:32:35 -0800</delta_ts>
            <desc>Proposed patch</desc>
            <filename>bug-49526.diff</filename>
            <type>text/plain</type>
            <size>72974</size>
            <attacher name="Andreas Kling">kling</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdDIvQ2hhbmdlTG9nIGIvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXgg
YmNiZjU1Ni4uNjdhZjAyNyAxMDA2NDQKLS0tIGEvV2ViS2l0Mi9DaGFuZ2VMb2cKKysrIGIvV2Vi
S2l0Mi9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMzUgQEAKKzIwMTAtMTEtMTIgIEFuZHJlYXMgS2xp
bmcgIDxhbmRyZWFzLmtsaW5nQG5va2lhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBbV0syXVtRdF0gV2ViS2l0MiBpbXBsZW1lbnRhdGlvbiBv
ZiB0aWxlZCBiYWNraW5nIHN0b3JlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD00OTUyNgorCisgICAgICAgIEJhc2ljIHRpbGluZyBpbXBsZW1lbnRhdGlv
biBmb3IgV2ViS2l0Mi9RdC4KKworICAgICAgICBPcmlnaW5hbCBwYXRjaCBieSBBbnR0aSBLb2l2
aXN0by4KKworICAgICAgICAqIFNoYXJlZC9Db3JlSVBDU3VwcG9ydC9EcmF3aW5nQXJlYU1lc3Nh
Z2VLaW5kcy5oOgorICAgICAgICBOZXcgbWVzc2FnZXM6IFVwZGF0ZVRpbGUgYW5kIENhbmNlbFRp
bGVVcGRhdGUKKworICAgICAgICAqIFNoYXJlZC9Db3JlSVBDU3VwcG9ydC9EcmF3aW5nQXJlYVBy
b3h5TWVzc2FnZUtpbmRzLmg6CisgICAgICAgIE5ldyBtZXNzYWdlczogSW52YWxpZGF0ZSwgVGls
ZVVwZGF0ZWQsIFRpbGVVcGRhdGVzQ29tcGxldGUKKworICAgICAgICAqIFNoYXJlZC9EcmF3aW5n
QXJlYUJhc2UuaDoKKyAgICAgICAgTmV3IGFyZWEgdHlwZTogVGlsZWREcmF3aW5nQXJlYVR5cGUK
KworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvcXQvcWdyYXBoaWNzd2t2aWV3Lmg6CisgICAgICAg
ICogVUlQcm9jZXNzL0FQSS9xdC9xZ3JhcGhpY3N3a3ZpZXcuY3BwOgorICAgICAgICAoUUdyYXBo
aWNzV0tWaWV3OjpRR3JhcGhpY3NXS1ZpZXcpOgorICAgICAgICAoUUdyYXBoaWNzV0tWaWV3Ojpz
ZXRHZW9tZXRyeSk6CisgICAgICAgIChRR3JhcGhpY3NXS1ZpZXdQcml2YXRlOjpRR3JhcGhpY3NX
S1ZpZXdQcml2YXRlKToKKyAgICAgICAgKFFHcmFwaGljc1dLVmlldzo6YmVnaW5TY2FsZUNoYW5n
ZSk6CisgICAgICAgIChRR3JhcGhpY3NXS1ZpZXc6OmNvbW1pdFNjYWxlQ2hhbmdlKToKKyAgICAg
ICAgKFFHcmFwaGljc1dLVmlld1ByaXZhdGU6Ol9xX3NjYWxlQ2hhbmdlZCk6CisgICAgICAgIChR
R3JhcGhpY3NXS1ZpZXdQcml2YXRlOjpjb21taXRTY2FsZSk6CisgICAgICAgIE9wdC1pbiBzdXBw
b3J0IGZvciB0aWxlZCBiYWNraW5nIHN0b3JlLgorCisgICAgICAgICogVUlQcm9jZXNzL1RpbGVk
RHJhd2luZ0FyZWFQcm94eS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdp
bmdBcmVhUHJveHk6OmNyZWF0ZSk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQ
cm94eTo6VGlsZWREcmF3aW5nQXJlYVByb3h5KToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3
aW5nQXJlYVByb3h5Ojp+VGlsZWREcmF3aW5nQXJlYVByb3h5KToKKyAgICAgICAgKFdlYktpdDo6
VGlsZWREcmF3aW5nQXJlYVByb3h5OjpzZXRTaXplKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWRE
cmF3aW5nQXJlYVByb3h5OjpzZXRQYWdlSXNWaXNpYmxlKToKKyAgICAgICAgKFdlYktpdDo6VGls
ZWREcmF3aW5nQXJlYVByb3h5OjpkaWRTZXRTaXplKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWRE
cmF3aW5nQXJlYVByb3h5OjpkaWRSZWNlaXZlTWVzc2FnZSk6CisgICAgICAgIChXZWJLaXQ6OlRp
bGVkRHJhd2luZ0FyZWFQcm94eTo6ZGlkUmVjZWl2ZVN5bmNNZXNzYWdlKToKKyAgICAgICAgKFdl
YktpdDo6VGlsZWREcmF3aW5nQXJlYVByb3h5OjpyZXF1ZXN0VGlsZVVwZGF0ZSk6CisgICAgICAg
IChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6d2FpdFVudGlsVXBkYXRlc0NvbXBsZXRl
KToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYVByb3h5OjpjcmVhdGVUaWxlKToK
KyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYVByb3h5OjpzZXRUaWxlU2l6ZSk6Cisg
ICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6c2V0VGlsZUNyZWF0aW9uRGVs
YXkpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVhUHJveHk6OnNldEtlZXBBbmRD
b3ZlckFyZWFNdWx0aXBsaWVycyk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQ
cm94eTo6aW52YWxpZGF0ZSk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQcm94
eTo6dXBkYXRlVGlsZUJ1ZmZlcnMpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVh
UHJveHk6OnRpbGVCdWZmZXJVcGRhdGVDb21wbGV0ZSk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVk
RHJhd2luZ0FyZWFQcm94eTo6cGFpbnQpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdB
cmVhUHJveHk6OmFkanVzdFZpc2libGVSZWN0KToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3
aW5nQXJlYVByb3h5OjpzZXRDb250ZW50c1NjYWxlKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWRE
cmF3aW5nQXJlYVByb3h5OjpyZW1vdmVBbGxUaWxlcyk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVk
RHJhd2luZ0FyZWFQcm94eTo6dGlsZURpc3RhbmNlKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWRE
cmF3aW5nQXJlYVByb3h5OjpjYWxjdWxhdGVLZWVwUmVjdCk6CisgICAgICAgIChXZWJLaXQ6OlRp
bGVkRHJhd2luZ0FyZWFQcm94eTo6Y2FsY3VsYXRlQ292ZXJSZWN0KToKKyAgICAgICAgKFdlYktp
dDo6VGlsZWREcmF3aW5nQXJlYVByb3h5OjpjcmVhdGVUaWxlcyk6CisgICAgICAgIChXZWJLaXQ6
OlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6cmVzaXplRWRnZVRpbGVzKToKKyAgICAgICAgKFdlYktp
dDo6VGlsZWREcmF3aW5nQXJlYVByb3h5Ojpkcm9wVGlsZXNPdXRzaWRlUmVjdCk6CisgICAgICAg
IChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6dGlsZUF0KToKKyAgICAgICAgKFdlYktp
dDo6VGlsZWREcmF3aW5nQXJlYVByb3h5OjpzZXRUaWxlKToKKyAgICAgICAgKFdlYktpdDo6VGls
ZWREcmF3aW5nQXJlYVByb3h5OjpyZW1vdmVUaWxlKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWRE
cmF3aW5nQXJlYVByb3h5OjptYXBUb0NvbnRlbnRzKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWRE
cmF3aW5nQXJlYVByb3h5OjptYXBGcm9tQ29udGVudHMpOgorICAgICAgICAoV2ViS2l0OjpUaWxl
ZERyYXdpbmdBcmVhUHJveHk6OmNvbnRlbnRzUmVjdCk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVk
RHJhd2luZ0FyZWFQcm94eTo6dGlsZVJlY3RGb3JDb29yZGluYXRlKToKKyAgICAgICAgKFdlYktp
dDo6VGlsZWREcmF3aW5nQXJlYVByb3h5Ojp0aWxlQ29vcmRpbmF0ZUZvclBvaW50KToKKyAgICAg
ICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYVByb3h5OjpzdGFydFRpbGVCdWZmZXJVcGRhdGVU
aW1lcik6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6dGlsZUJ1ZmZl
clVwZGF0ZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVhUHJv
eHk6OnN0YXJ0VGlsZUNyZWF0aW9uVGltZXIpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdp
bmdBcmVhUHJveHk6OnRpbGVDcmVhdGlvblRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViS2l0OjpU
aWxlZERyYXdpbmdBcmVhUHJveHk6Omhhc1BlbmRpbmdVcGRhdGVzKToKKyAgICAgICAgKiBVSVBy
b2Nlc3MvVGlsZWREcmF3aW5nQXJlYVByb3h5Lmg6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpU
aWxlZERyYXdpbmdBcmVhUHJveHk6OmNvbnRlbnRzU2NhbGUpOgorICAgICAgICAoV2ViS2l0OjpU
aWxlZERyYXdpbmdBcmVhUHJveHk6OmF0dGFjaENvbXBvc2l0aW5nQ29udGV4dCk6CisgICAgICAg
IChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6ZGV0YWNoQ29tcG9zaXRpbmdDb250ZXh0
KToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYVByb3h5Ojp0aWxlU2l6ZSk6Cisg
ICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6dGlsZUNyZWF0aW9uRGVsYXkp
OgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVhUHJveHk6OmdldEtlZXBBbmRDb3Zl
ckFyZWFNdWx0aXBsaWVycyk6CisgICAgICAgICogVUlQcm9jZXNzL1RpbGVkRHJhd2luZ0FyZWFU
aWxlLmg6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVhVGlsZTo6Y3Jl
YXRlKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYVRpbGU6Omhhc0JhY2tCdWZm
ZXJVcGRhdGVQZW5kaW5nKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYVRpbGU6
OmNvb3JkaW5hdGUpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVhVGlsZTo6cmVj
dCk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFUaWxlOjpJRCk6CisgICAgICAg
ICogV2ViUHJvY2Vzcy9XZWJQYWdlL0RyYXdpbmdBcmVhLmNwcDoKKyAgICAgICAgKFdlYktpdDo6
RHJhd2luZ0FyZWE6OmNyZWF0ZSk6CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1RpbGVk
RHJhd2luZ0FyZWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJl
YTo6VGlsZWREcmF3aW5nQXJlYSk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWE6
On5UaWxlZERyYXdpbmdBcmVhKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYTo6
aW52YWxpZGF0ZVdpbmRvdyk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWE6Omlu
dmFsaWRhdGVDb250ZW50c0FuZFdpbmRvdyk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2lu
Z0FyZWE6OmludmFsaWRhdGVDb250ZW50c0ZvclNsb3dTY3JvbGwpOgorICAgICAgICAoV2ViS2l0
OjpUaWxlZERyYXdpbmdBcmVhOjpzY3JvbGwpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdp
bmdBcmVhOjpzZXROZWVkc0Rpc3BsYXkpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdB
cmVhOjpkaXNwbGF5KToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYTo6c2NoZWR1
bGVEaXNwbGF5KToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYTo6c2V0U2l6ZSk6
CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWE6OnN1c3BlbmRQYWludGluZyk6Cisg
ICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWE6OnJlc3VtZVBhaW50aW5nKToKKyAgICAg
ICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYTo6ZGlkVXBkYXRlKToKKyAgICAgICAgKFdlYktp
dDo6VGlsZWREcmF3aW5nQXJlYTo6dXBkYXRlVGlsZSk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVk
RHJhd2luZ0FyZWE6OnRpbGVVcGRhdGVUaW1lckZpcmVkKToKKyAgICAgICAgKFdlYktpdDo6VGls
ZWREcmF3aW5nQXJlYTo6ZGlkUmVjZWl2ZU1lc3NhZ2UpOgorICAgICAgICAqIFdlYlByb2Nlc3Mv
V2ViUGFnZS9UaWxlZERyYXdpbmdBcmVhLmg6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpUaWxl
ZERyYXdpbmdBcmVhOjphdHRhY2hDb21wb3NpdGluZ0NvbnRleHQpOgorICAgICAgICAoV2ViS2l0
OjpUaWxlZERyYXdpbmdBcmVhOjpkZXRhY2hDb21wb3NpdGluZ0NvbnRleHQpOgorICAgICAgICAo
V2ViS2l0OjpUaWxlZERyYXdpbmdBcmVhOjpzZXRSb290Q29tcG9zaXRpbmdMYXllcik6CisgICAg
ICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWE6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllclN5
bmMpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVhOjpzeW5jQ29tcG9zaXRpbmdM
YXllcnMpOgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9xdC9UaWxlZERyYXdpbmdBcmVh
UXQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYTo6cGFpbnRJ
bnRvVXBkYXRlQ2h1bmspOgorICAgICAgICAqIFdlYktpdDIucHJvOgorICAgICAgICAqIFVJUHJv
Y2Vzcy9xdC9UaWxlZERyYXdpbmdBcmVhVGlsZVF0LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJL
aXQ6OmNoZWNrZXJlZFBpeG1hcCk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2luZ0FyZWFU
aWxlOjpUaWxlZERyYXdpbmdBcmVhVGlsZSk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2lu
Z0FyZWFUaWxlOjp+VGlsZWREcmF3aW5nQXJlYVRpbGUpOgorICAgICAgICAoV2ViS2l0OjpUaWxl
ZERyYXdpbmdBcmVhVGlsZTo6aXNEaXJ0eSk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2lu
Z0FyZWFUaWxlOjppc1JlYWR5VG9QYWludCk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2lu
Z0FyZWFUaWxlOjpoYXNSZWFkeUJhY2tCdWZmZXIpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERy
YXdpbmdBcmVhVGlsZTo6aW52YWxpZGF0ZSk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVkRHJhd2lu
Z0FyZWFUaWxlOjpyZXNpemUpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVhVGls
ZTo6c3dhcEJhY2tCdWZmZXJUb0Zyb250KToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5n
QXJlYVRpbGU6OnBhaW50KToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJlYVRpbGU6
OnBhaW50Q2hlY2tlclBhdHRlcm4pOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdpbmdBcmVh
VGlsZTo6dXBkYXRlRnJvbUNodW5rKToKKyAgICAgICAgKFdlYktpdDo6VGlsZWREcmF3aW5nQXJl
YVRpbGU6OnVwZGF0ZUJhY2tCdWZmZXIpOgorICAgICAgICAqIFVJUHJvY2Vzcy9xdC9UaWxlZERy
YXdpbmdBcmVhUHJveHlRdC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdp
bmdBcmVhUHJveHk6OnVwZGF0ZVdlYlZpZXcpOgorICAgICAgICAoV2ViS2l0OjpUaWxlZERyYXdp
bmdBcmVhUHJveHk6OndlYlZpZXdWaXNpYmxlUmVjdCk6CisgICAgICAgIChXZWJLaXQ6OlRpbGVk
RHJhd2luZ0FyZWFQcm94eTo6cGFnZSk6CisKIDIwMTAtMTEtMTIgIEJlbmphbWluIFBvdWxhaW4g
IDxiZW5qYW1pbi5wb3VsYWluQG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbmRy
ZWFzIEtsaW5nLgpkaWZmIC0tZ2l0IGEvV2ViS2l0Mi9TaGFyZWQvQ29yZUlQQ1N1cHBvcnQvRHJh
d2luZ0FyZWFNZXNzYWdlS2luZHMuaCBiL1dlYktpdDIvU2hhcmVkL0NvcmVJUENTdXBwb3J0L0Ry
YXdpbmdBcmVhTWVzc2FnZUtpbmRzLmgKaW5kZXggODAyZTYxMi4uN2U5ZmI5MiAxMDA2NDQKLS0t
IGEvV2ViS2l0Mi9TaGFyZWQvQ29yZUlQQ1N1cHBvcnQvRHJhd2luZ0FyZWFNZXNzYWdlS2luZHMu
aAorKysgYi9XZWJLaXQyL1NoYXJlZC9Db3JlSVBDU3VwcG9ydC9EcmF3aW5nQXJlYU1lc3NhZ2VL
aW5kcy5oCkBAIC00NSw2ICs0NSwxNCBAQCBlbnVtIEtpbmQgewogICAgIC8vIENhbGxlZCB3aGVu
IGFuIHVwZGF0ZSBjaHVuayBzZW50IHRvIHRoZSBkcmF3aW5nIGFyZWEgaGFzIGJlZW4KICAgICAv
LyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgYmFja2luZyBzdG9yZS4KICAgICBEaWRVcGRhdGUsCisK
KyNpZiBFTkFCTEUoVElMRURfQkFDS0lOR19TVE9SRSkKKyAgICAvLyBDYWxsZWQgdG8gcmVxdWVz
dCBhIHRpbGUgdXBkYXRlCisgICAgVXBkYXRlVGlsZSwKKworICAgIC8vIENhbGxlZCB0byBjYW5j
ZWwgYSByZXF1ZXN0ZWQgdGlsZSB1cGRhdGUKKyAgICBDYW5jZWxUaWxlVXBkYXRlLAorI2VuZGlm
CiB9OwogCiB9CmRpZmYgLS1naXQgYS9XZWJLaXQyL1NoYXJlZC9Db3JlSVBDU3VwcG9ydC9EcmF3
aW5nQXJlYVByb3h5TWVzc2FnZUtpbmRzLmggYi9XZWJLaXQyL1NoYXJlZC9Db3JlSVBDU3VwcG9y
dC9EcmF3aW5nQXJlYVByb3h5TWVzc2FnZUtpbmRzLmgKaW5kZXggOGIyOWVkMS4uYWU5ZDI4MiAx
MDA2NDQKLS0tIGEvV2ViS2l0Mi9TaGFyZWQvQ29yZUlQQ1N1cHBvcnQvRHJhd2luZ0FyZWFQcm94
eU1lc3NhZ2VLaW5kcy5oCisrKyBiL1dlYktpdDIvU2hhcmVkL0NvcmVJUENTdXBwb3J0L0RyYXdp
bmdBcmVhUHJveHlNZXNzYWdlS2luZHMuaApAQCAtMzgsNiArMzgsMTEgQEAgZW51bSBLaW5kIHsK
ICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAgQXR0YWNoQ29tcG9zaXRpbmdD
b250ZXh0LAogI2VuZGlmCisjaWYgRU5BQkxFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCisgICAgSW52
YWxpZGF0ZSwKKyAgICBUaWxlVXBkYXRlZCwKKyAgICBUaWxlVXBkYXRlc0NvbXBsZXRlLAorI2Vu
ZGlmCiB9OwogCiB9CmRpZmYgLS1naXQgYS9XZWJLaXQyL1NoYXJlZC9EcmF3aW5nQXJlYUJhc2Uu
aCBiL1dlYktpdDIvU2hhcmVkL0RyYXdpbmdBcmVhQmFzZS5oCmluZGV4IDQxNjU2ZDguLjE0NmUz
OGUgMTAwNjQ0Ci0tLSBhL1dlYktpdDIvU2hhcmVkL0RyYXdpbmdBcmVhQmFzZS5oCisrKyBiL1dl
YktpdDIvU2hhcmVkL0RyYXdpbmdBcmVhQmFzZS5oCkBAIC00NCw2ICs0NCw5IEBAIHB1YmxpYzoK
ICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAgICAgIExheWVyQmFja2VkRHJh
d2luZ0FyZWFUeXBlLAogI2VuZGlmCisjaWYgRU5BQkxFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCisg
ICAgICAgIFRpbGVkRHJhd2luZ0FyZWFUeXBlLAorI2VuZGlmCiAgICAgfTsKICAgICAKICAgICB0
eXBlZGVmIHVpbnQ2NF90IERyYXdpbmdBcmVhSUQ7CmRpZmYgLS1naXQgYS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvcXQvcWdyYXBoaWNzd2t2aWV3LmNwcCBiL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9x
dC9xZ3JhcGhpY3N3a3ZpZXcuY3BwCmluZGV4IDkyYzQzY2EuLjk1MGVlZjIgMTAwNjQ0Ci0tLSBh
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC9xZ3JhcGhpY3N3a3ZpZXcuY3BwCisrKyBiL1dlYktp
dDIvVUlQcm9jZXNzL0FQSS9xdC9xZ3JhcGhpY3N3a3ZpZXcuY3BwCkBAIC0yMyw2ICsyMyw4IEBA
CiAjaW5jbHVkZSAiQ2h1bmtlZFVwZGF0ZURyYXdpbmdBcmVhUHJveHkuaCIKICNpbmNsdWRlICJJ
bnRTaXplLmgiCiAjaW5jbHVkZSAiUnVuTG9vcC5oIgorI2luY2x1ZGUgIlRpbGVkRHJhd2luZ0Fy
ZWFQcm94eS5oIgorI2luY2x1ZGUgIlVwZGF0ZUNodW5rLmgiCiAjaW5jbHVkZSAiV0tBUElDYXN0
LmgiCiAjaW5jbHVkZSAiV2ViUGFnZU5hbWVzcGFjZS5oIgogI2luY2x1ZGUgInF3a3BhZ2UuaCIK
QEAgLTMzLDYgKzM1LDcgQEAKICNpbmNsdWRlIDxRUGFpbnRlcj4KICNpbmNsdWRlIDxRU2Nyb2xs
QmFyPgogI2luY2x1ZGUgPFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbT4KKyNpbmNsdWRlIDxRVXJs
PgogI2luY2x1ZGUgPFF0RGVidWc+CiAjaW5jbHVkZSA8V2ViS2l0Mi9XS1JldGFpblB0ci5oPgog
I2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KQEAgLTQ1LDggKzQ4LDEzIEBAIHN0cnVjdCBRR3JhcGhp
Y3NXS1ZpZXdQcml2YXRlIHsKICAgICBRR3JhcGhpY3NXS1ZpZXdQcml2YXRlKFFHcmFwaGljc1dL
Vmlldyogdmlldyk7CiAgICAgV0tQYWdlUmVmIHBhZ2VSZWYoKSBjb25zdCB7IHJldHVybiBwYWdl
LT5wYWdlUmVmKCk7IH0KIAorICAgIHZvaWQgX3Ffc2NhbGVDaGFuZ2VkKCk7CisgICAgdm9pZCBj
b21taXRTY2FsZSgpOworCiAgICAgUUdyYXBoaWNzV0tWaWV3KiBxOwogICAgIFFXS1BhZ2UqIHBh
Z2U7CisgICAgUnVuTG9vcDo6VGltZXI8UUdyYXBoaWNzV0tWaWV3UHJpdmF0ZT4gbV9zY2FsZUNv
bW1pdFRpbWVyOworICAgIGJvb2wgbV9pc0NoYW5naW5nU2NhbGU7CiB9OwogCiBRR3JhcGhpY3NX
S1ZpZXc6OlFHcmFwaGljc1dLVmlldyhXS1BhZ2VOYW1lc3BhY2VSZWYgcGFnZU5hbWVzcGFjZVJl
ZiwgQmFja2luZ1N0b3JlVHlwZSBiYWNraW5nU3RvcmVUeXBlLCBRR3JhcGhpY3NJdGVtKiBwYXJl
bnQpCkBAIC01Niw4ICs2NCwxOCBAQCBRR3JhcGhpY3NXS1ZpZXc6OlFHcmFwaGljc1dLVmlldyhX
S1BhZ2VOYW1lc3BhY2VSZWYgcGFnZU5hbWVzcGFjZVJlZiwgQmFja2luZ1N0bwogICAgIHNldEZv
Y3VzUG9saWN5KFF0OjpTdHJvbmdGb2N1cyk7CiAgICAgc2V0QWNjZXB0SG92ZXJFdmVudHModHJ1
ZSk7CiAKKyAgICBQYXNzT3duUHRyPERyYXdpbmdBcmVhUHJveHk+IGRyYXdpbmdBcmVhUHJveHk7
CisjaWYgRU5BQkxFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCisgICAgaWYgKGJhY2tpbmdTdG9yZVR5
cGUgPT0gVGlsZWQpIHsKKyAgICAgICAgZHJhd2luZ0FyZWFQcm94eSA9IFRpbGVkRHJhd2luZ0Fy
ZWFQcm94eTo6Y3JlYXRlKHRoaXMpOworICAgICAgICBjb25uZWN0KHRoaXMsIFNJR05BTChzY2Fs
ZUNoYW5nZWQoKSksIHRoaXMsIFNMT1QoX3Ffc2NhbGVDaGFuZ2VkKCkpKTsKKyAgICB9IGVsc2UK
KyNlbmRpZgorICAgICAgICBkcmF3aW5nQXJlYVByb3h5ID0gQ2h1bmtlZFVwZGF0ZURyYXdpbmdB
cmVhUHJveHk6OmNyZWF0ZSh0aGlzKTsKKwogICAgIGQtPnBhZ2UgPSBuZXcgUVdLUGFnZShwYWdl
TmFtZXNwYWNlUmVmKTsKLSAgICBkLT5wYWdlLT5kLT5pbml0KHNpemUoKS50b1NpemUoKSwgQ2h1
bmtlZFVwZGF0ZURyYXdpbmdBcmVhUHJveHk6OmNyZWF0ZSh0aGlzKSk7CisgICAgZC0+cGFnZS0+
ZC0+aW5pdChzaXplKCkudG9TaXplKCksIGRyYXdpbmdBcmVhUHJveHkpOworICAgIGQtPnBhZ2Ut
PnNldFZpZXdwb3J0U2l6ZShnZW9tZXRyeSgpLnNpemUoKS50b1NpemUoKSk7CiAgICAgY29ubmVj
dChkLT5wYWdlLCBTSUdOQUwodGl0bGVDaGFuZ2VkKFFTdHJpbmcpKSwgdGhpcywgU0lHTkFMKHRp
dGxlQ2hhbmdlZChRU3RyaW5nKSkpOwogICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKGxvYWRT
dGFydGVkKCkpLCB0aGlzLCBTSUdOQUwobG9hZFN0YXJ0ZWQoKSkpOwogICAgIGNvbm5lY3QoZC0+
cGFnZSwgU0lHTkFMKGxvYWRGaW5pc2hlZChib29sKSksIHRoaXMsIFNJR05BTChsb2FkRmluaXNo
ZWQoYm9vbCkpKTsKQEAgLTg1LDcgKzEwMywxMCBAQCB2b2lkIFFHcmFwaGljc1dLVmlldzo6cGFp
bnQoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogbwog
CiB2b2lkIFFHcmFwaGljc1dLVmlldzo6c2V0R2VvbWV0cnkoY29uc3QgUVJlY3RGJiByZWN0KQog
eworICAgIFFTaXplRiBvbGRTaXplID0gZ2VvbWV0cnkoKS5zaXplKCk7CiAgICAgUUdyYXBoaWNz
V2lkZ2V0OjpzZXRHZW9tZXRyeShyZWN0KTsKKyAgICBpZiAoZ2VvbWV0cnkoKS5zaXplKCkgPT0g
b2xkU2l6ZSkKKyAgICAgICAgcmV0dXJuOwogCiAgICAgLy8gTk9URTogY2FsbCBnZW9tZXRyeSgp
IGFzIHNldEdlb21ldHJ5IGVuc3VyZXMgdGhhdAogICAgIC8vIHRoZSBnZW9tZXRyeSBpcyB3aXRo
aW4gbGVnYWwgYm91bmRzIChtaW5pbXVtU2l6ZSwgbWF4aW11bVNpemUpCkBAIC0yNjIsNiArMjgz
LDcgQEAgdm9pZCBRR3JhcGhpY3NXS1ZpZXc6OmZvY3VzT3V0RXZlbnQoUUZvY3VzRXZlbnQqKQog
CiBRR3JhcGhpY3NXS1ZpZXdQcml2YXRlOjpRR3JhcGhpY3NXS1ZpZXdQcml2YXRlKFFHcmFwaGlj
c1dLVmlldyogdmlldykKICAgICA6IHEodmlldykKKyAgICAsIG1fc2NhbGVDb21taXRUaW1lcihS
dW5Mb29wOjpjdXJyZW50KCksIHRoaXMsICZRR3JhcGhpY3NXS1ZpZXdQcml2YXRlOjpjb21taXRT
Y2FsZSkKIHsKIH0KIApAQCAtMjgwLDQgKzMwMiw0NiBAQCBRUmVjdEYgUUdyYXBoaWNzV0tWaWV3
Ojp2aXNpYmxlUmVjdCgpIGNvbnN0CiAgICAgcmV0dXJuIG1hcFJlY3RGcm9tU2NlbmUoUVJlY3RG
KFFQb2ludEYoeE9mZnNldCwgeU9mZnNldCksIGdyYXBoaWNzVmlldy0+dmlld3BvcnQoKS0+c2l6
ZSgpKSk7CiB9CiAKK3ZvaWQgUUdyYXBoaWNzV0tWaWV3OjpiZWdpblNjYWxlQ2hhbmdlKCkKK3sK
KyNpZiBFTkFCTEUoVElMRURfQkFDS0lOR19TVE9SRSkKKyAgICBBU1NFUlQoIWQtPm1faXNDaGFu
Z2luZ1NjYWxlKTsKKyAgICBkLT5tX2lzQ2hhbmdpbmdTY2FsZSA9IHRydWU7CisgICAgZC0+bV9z
Y2FsZUNvbW1pdFRpbWVyLnN0b3AoKTsKKyNlbmRpZgorfQorCit2b2lkIFFHcmFwaGljc1dLVmll
dzo6Y29tbWl0U2NhbGVDaGFuZ2UoKQoreworI2lmIEVOQUJMRShUSUxFRF9CQUNLSU5HX1NUT1JF
KQorICAgIEFTU0VSVChkLT5tX2lzQ2hhbmdpbmdTY2FsZSk7CisgICAgZC0+bV9pc0NoYW5naW5n
U2NhbGUgPSBmYWxzZTsKKyAgICBkLT5jb21taXRTY2FsZSgpOworI2VuZGlmCit9CisKK3ZvaWQg
UUdyYXBoaWNzV0tWaWV3UHJpdmF0ZTo6X3Ffc2NhbGVDaGFuZ2VkKCkKK3sKKyNpZiBFTkFCTEUo
VElMRURfQkFDS0lOR19TVE9SRSkKKyAgICBpZiAoIW1faXNDaGFuZ2luZ1NjYWxlKQorICAgICAg
ICBtX3NjYWxlQ29tbWl0VGltZXIuc3RhcnRPbmVTaG90KDAuMSk7CisjZW5kaWYKK30KKwordm9p
ZCBRR3JhcGhpY3NXS1ZpZXdQcml2YXRlOjpjb21taXRTY2FsZSgpCit7CisjaWYgRU5BQkxFKFRJ
TEVEX0JBQ0tJTkdfU1RPUkUpCisgICAgRHJhd2luZ0FyZWFQcm94eSogZHJhd2luZ0FyZWEgPSBw
YWdlLT5kLT5wYWdlLT5kcmF3aW5nQXJlYSgpOworICAgIGZsb2F0IG5ld1NjYWxlID0gcS0+c2Nh
bGUoKTsKKyAgICBpZiAoZHJhd2luZ0FyZWEtPmluZm8oKS50eXBlID09IERyYXdpbmdBcmVhUHJv
eHk6OlRpbGVkRHJhd2luZ0FyZWFUeXBlKSB7CisgICAgICAgIFRpbGVkRHJhd2luZ0FyZWFQcm94
eSogdGlsZWREcmF3aW5nQXJlYSA9IHN0YXRpY19jYXN0PFRpbGVkRHJhd2luZ0FyZWFQcm94eSo+
KGRyYXdpbmdBcmVhKTsKKyAgICAgICAgaWYgKHRpbGVkRHJhd2luZ0FyZWEtPmNvbnRlbnRzU2Nh
bGUoKSA9PSBuZXdTY2FsZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdGlsZWREcmF3
aW5nQXJlYS0+c2V0Q29udGVudHNTY2FsZShuZXdTY2FsZSk7CisgICAgICAgIC8vIEZvciBub3cg
d2UgYmxvY2sgdW50aWwgY29tcGxldGUKKyAgICAgICAgdGlsZWREcmF3aW5nQXJlYS0+d2FpdFVu
dGlsVXBkYXRlc0NvbXBsZXRlKCk7CisgICAgfQorI2VuZGlmCit9CisKICNpbmNsdWRlICJtb2Nf
cWdyYXBoaWNzd2t2aWV3LmNwcCIKZGlmZiAtLWdpdCBhL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9x
dC9xZ3JhcGhpY3N3a3ZpZXcuaCBiL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC9xZ3JhcGhpY3N3
a3ZpZXcuaAppbmRleCBjNWU0M2IyLi44NDU1MmUyIDEwMDY0NAotLS0gYS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvcXQvcWdyYXBoaWNzd2t2aWV3LmgKKysrIGIvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L3F0L3FncmFwaGljc3drdmlldy5oCkBAIC00OCw2ICs0OCw5IEBAIHB1YmxpYzoKICAgICAvLyBG
SVhNRTogc2hvdWxkIG5vdCBiZSBwdWJsaWMKICAgICB2aXJ0dWFsIFFSZWN0RiB2aXNpYmxlUmVj
dCgpIGNvbnN0OwogCisgICAgdm9pZCBiZWdpblNjYWxlQ2hhbmdlKCk7CisgICAgdm9pZCBjb21t
aXRTY2FsZUNoYW5nZSgpOworCiBwdWJsaWM6CiAgICAgUV9TSUdOQUwgdm9pZCB0aXRsZUNoYW5n
ZWQoY29uc3QgUVN0cmluZyYgdGl0bGUpOwogICAgIFFfU0lHTkFMIHZvaWQgbG9hZFN0YXJ0ZWQo
KTsKQEAgLTgwLDggKzgzLDExIEBAIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgZm9jdXNP
dXRFdmVudChRRm9jdXNFdmVudCopOwogCiBwcml2YXRlOgorICAgIFFfUFJJVkFURV9TTE9UKGQs
IHZvaWQgX3Ffc2NhbGVDaGFuZ2VkKCkpOworCiAgICAgUUdyYXBoaWNzV0tWaWV3UHJpdmF0ZSog
ZDsKICAgICBmcmllbmQgY2xhc3MgUUdyYXBoaWNzV0tWaWV3UHJpdmF0ZTsKKyAgICBmcmllbmQg
Y2xhc3MgVGlsZWREcmF3aW5nQXJlYVByb3h5OwogfTsKIAogI2VuZGlmIC8qIHFncmFwaGljc3dr
dmlld19oICovCmRpZmYgLS1naXQgYS9XZWJLaXQyL1VJUHJvY2Vzcy9UaWxlZERyYXdpbmdBcmVh
UHJveHkuY3BwIGIvV2ViS2l0Mi9VSVByb2Nlc3MvVGlsZWREcmF3aW5nQXJlYVByb3h5LmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGU4YWU1Ci0tLSAvZGV2L251bGwK
KysrIGIvV2ViS2l0Mi9VSVByb2Nlc3MvVGlsZWREcmF3aW5nQXJlYVByb3h5LmNwcApAQCAtMCww
ICsxLDYxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBh
bmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlRpbGVkRHJh
d2luZ0FyZWFQcm94eS5oIgorCisjaW5jbHVkZSAiRHJhd2luZ0FyZWFNZXNzYWdlS2luZHMuaCIK
KyNpbmNsdWRlICJEcmF3aW5nQXJlYVByb3h5TWVzc2FnZUtpbmRzLmgiCisjaW5jbHVkZSAiTWVz
c2FnZUlELmgiCisjaW5jbHVkZSAiVXBkYXRlQ2h1bmsuaCIKKyNpbmNsdWRlICJXZWJDb3JlQXJn
dW1lbnRDb2RlcnMuaCIKKyNpbmNsdWRlICJXZWJQYWdlUHJveHkuaCIKKyNpbmNsdWRlICJXZWJQ
cm9jZXNzUHJveHkuaCIKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBX
ZWJLaXQgeworCitzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRUaWxlV2lkdGggPSAxMDI0Oworc3Rh
dGljIGNvbnN0IGludCBkZWZhdWx0VGlsZUhlaWdodCA9IDEwMjQ7CisKK1Bhc3NPd25QdHI8VGls
ZWREcmF3aW5nQXJlYVByb3h5PiBUaWxlZERyYXdpbmdBcmVhUHJveHk6OmNyZWF0ZShQbGF0Zm9y
bVdlYlZpZXcqIHdlYlZpZXcpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBUaWxlZERyYXdp
bmdBcmVhUHJveHkod2ViVmlldykpOworfQorCitUaWxlZERyYXdpbmdBcmVhUHJveHk6OlRpbGVk
RHJhd2luZ0FyZWFQcm94eShQbGF0Zm9ybVdlYlZpZXcqIHdlYlZpZXcpCisgICAgOiBEcmF3aW5n
QXJlYVByb3h5KFRpbGVkRHJhd2luZ0FyZWFUeXBlKQorICAgICwgbV9pc1dhaXRpbmdGb3JEaWRT
ZXRGcmFtZU5vdGlmaWNhdGlvbihmYWxzZSkKKyAgICAsIG1faXNWaXNpYmxlKHRydWUpCisgICAg
LCBtX3dlYlZpZXcod2ViVmlldykKKyAgICAsIG1fdGlsZUJ1ZmZlclVwZGF0ZVRpbWVyKFJ1bkxv
b3A6Om1haW4oKSwgdGhpcywgJlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6dGlsZUJ1ZmZlclVwZGF0
ZVRpbWVyRmlyZWQpCisgICAgLCBtX3RpbGVDcmVhdGlvblRpbWVyKFJ1bkxvb3A6Om1haW4oKSwg
dGhpcywgJlRpbGVkRHJhd2luZ0FyZWFQcm94eTo6dGlsZUNyZWF0aW9uVGltZXJGaXJlZCkKKyAg
ICAsIG1fdGlsZVNpemUoZGVmYXVsdFRpbGVXaWR0aCwgZGVmYXVsdFRpbGVIZWlnaHQpCisgICAg
LCBtX3RpbGVDcmVhdGlvbkRlbGF5KDAuMDEpCisgICAgLCBtX2tlZXBBcmVhTXVsdGlwbGllcigy
LjVmLCA0LjVmKQorICAgICwgbV9jb3ZlckFyZWFNdWx0aXBsaWVyKDIuZiwgMy5mKQorICAgICwg
bV9jb250ZW50c1NjYWxlKDEuZikKK3sKK30KKworVGlsZWREcmF3aW5nQXJlYVByb3h5Ojp+VGls
ZWREcmF3aW5nQXJlYVByb3h5KCkKK3sKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhUHJveHk6
OnNldFNpemUoY29uc3QgSW50U2l6ZSYgdmlld1NpemUpCit7CisgICAgV2ViUGFnZVByb3h5KiBw
YWdlID0gdGhpcy0+cGFnZSgpOworICAgIGlmICghcGFnZSB8fCAhcGFnZS0+aXNWYWxpZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAodmlld1NpemUuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX3ZpZXdTaXplID0gdmlld1NpemU7CisgICAgbV9sYXN0U2V0Vmlld1Np
emUgPSB2aWV3U2l6ZTsKKworICAgIGlmIChtX2lzV2FpdGluZ0ZvckRpZFNldEZyYW1lTm90aWZp
Y2F0aW9uKQorICAgICAgICByZXR1cm47CisgICAgbV9pc1dhaXRpbmdGb3JEaWRTZXRGcmFtZU5v
dGlmaWNhdGlvbiA9IHRydWU7CisKKyAgICBwYWdlLT5wcm9jZXNzKCktPnJlc3BvbnNpdmVuZXNz
VGltZXIoKS0+c3RhcnQoKTsKKyAgICBwYWdlLT5wcm9jZXNzKCktPnNlbmQoRHJhd2luZ0FyZWFN
ZXNzYWdlOjpTZXRTaXplLCBwYWdlLT5wYWdlSUQoKSwgQ29yZUlQQzo6SW4odmlld1NpemUpKTsK
K30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhUHJveHk6OnNldFBhZ2VJc1Zpc2libGUoYm9vbCBp
c1Zpc2libGUpCit7CisgICAgV2ViUGFnZVByb3h5KiBwYWdlID0gdGhpcy0+cGFnZSgpOworCisg
ICAgaWYgKGlzVmlzaWJsZSA9PSBtX2lzVmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
bV9pc1Zpc2libGUgPSBpc1Zpc2libGU7CisgICAgaWYgKCFwYWdlIHx8ICFwYWdlLT5pc1ZhbGlk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9pc1Zpc2libGUpIHsKKyAgICAgICAg
Ly8gVGVsbCB0aGUgd2ViIHByb2Nlc3MgdGhhdCBpdCBkb2Vzbid0IG5lZWQgdG8gcGFpbnQgYW55
dGhpbmcgZm9yIG5vdy4KKyAgICAgICAgcGFnZS0+cHJvY2VzcygpLT5zZW5kKERyYXdpbmdBcmVh
TWVzc2FnZTo6U3VzcGVuZFBhaW50aW5nLCBwYWdlLT5wYWdlSUQoKSwgQ29yZUlQQzo6SW4oKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUaGUgcGFnZSBpcyBub3cgdmlzaWJs
ZS4KKyAgICBwYWdlLT5wcm9jZXNzKCktPnNlbmQoRHJhd2luZ0FyZWFNZXNzYWdlOjpSZXN1bWVQ
YWludGluZywgcGFnZS0+cGFnZUlEKCksIENvcmVJUEM6OkluKCkpOworCisgICAgLy8gRklYTUU6
IFdlIHNob3VsZCByZXF1ZXN0IGEgZnVsbCByZXBhaW50IGhlcmUgaWYgbmVlZGVkLgorfQorCit2
b2lkIFRpbGVkRHJhd2luZ0FyZWFQcm94eTo6ZGlkU2V0U2l6ZShjb25zdCBJbnRTaXplJiB2aWV3
U2l6ZSkKK3sKKyAgICBBU1NFUlQobV9pc1dhaXRpbmdGb3JEaWRTZXRGcmFtZU5vdGlmaWNhdGlv
bik7CisgICAgbV9pc1dhaXRpbmdGb3JEaWRTZXRGcmFtZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwor
CisgICAgaWYgKHZpZXdTaXplICE9IG1fbGFzdFNldFZpZXdTaXplKQorICAgICAgICBzZXRTaXpl
KG1fbGFzdFNldFZpZXdTaXplKTsKKworICAgIFdlYlBhZ2VQcm94eSogcGFnZSA9IHRoaXMtPnBh
Z2UoKTsKKyAgICBwYWdlLT5wcm9jZXNzKCktPnJlc3BvbnNpdmVuZXNzVGltZXIoKS0+c3RvcCgp
OworfQorCit2b2lkIFRpbGVkRHJhd2luZ0FyZWFQcm94eTo6ZGlkUmVjZWl2ZU1lc3NhZ2UoQ29y
ZUlQQzo6Q29ubmVjdGlvbiosIENvcmVJUEM6Ok1lc3NhZ2VJRCBtZXNzYWdlSUQsIENvcmVJUEM6
OkFyZ3VtZW50RGVjb2RlciogYXJndW1lbnRzKQoreworICAgIHN3aXRjaCAobWVzc2FnZUlELmdl
dDxEcmF3aW5nQXJlYVByb3h5TWVzc2FnZTo6S2luZD4oKSkgeworICAgIGNhc2UgRHJhd2luZ0Fy
ZWFQcm94eU1lc3NhZ2U6OlRpbGVVcGRhdGVkOiB7CisgICAgICAgIGludCB0aWxlSUQ7CisgICAg
ICAgIFVwZGF0ZUNodW5rIHVwZGF0ZUNodW5rOworICAgICAgICBmbG9hdCBzY2FsZTsKKyAgICAg
ICAgdW5zaWduZWQgcGVuZGluZ1VwZGF0ZUNvdW50OworICAgICAgICBpZiAoIWFyZ3VtZW50cy0+
ZGVjb2RlKENvcmVJUEM6Ok91dCh0aWxlSUQsIHVwZGF0ZUNodW5rLCBzY2FsZSwgcGVuZGluZ1Vw
ZGF0ZUNvdW50KSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVGlsZWREcmF3aW5n
QXJlYVRpbGUqIHRpbGUgPSBtX3RpbGVzQnlJRC5nZXQodGlsZUlEKTsKKyAgICAgICAgQVNTRVJU
KCF0aWxlIHx8IHRpbGUtPklEKCkgPT0gdGlsZUlEKTsKKyAgICAgICAgaWYgKHRpbGUpCisgICAg
ICAgICAgICB0aWxlLT51cGRhdGVGcm9tQ2h1bmsoJnVwZGF0ZUNodW5rLCBzY2FsZSk7CisgICAg
ICAgIHRpbGVCdWZmZXJVcGRhdGVDb21wbGV0ZSgpOworICAgICAgICBicmVhazsKKyAgICB9Cisg
ICAgY2FzZSBEcmF3aW5nQXJlYVByb3h5TWVzc2FnZTo6RGlkU2V0U2l6ZTogeworICAgICAgICBJ
bnRTaXplIHNpemU7CisgICAgICAgIGlmICghYXJndW1lbnRzLT5kZWNvZGUoQ29yZUlQQzo6T3V0
KHNpemUpKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBkaWRTZXRTaXplKHNpemUp
OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEcmF3aW5nQXJlYVByb3h5TWVzc2Fn
ZTo6SW52YWxpZGF0ZTogeworICAgICAgICBJbnRSZWN0IHJlY3Q7CisgICAgICAgIGlmICghYXJn
dW1lbnRzLT5kZWNvZGUoQ29yZUlQQzo6T3V0KHJlY3QpKSkKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICBpbnZhbGlkYXRlKHJlY3QpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAg
Y2FzZSBEcmF3aW5nQXJlYVByb3h5TWVzc2FnZTo6VGlsZVVwZGF0ZXNDb21wbGV0ZTogeworICAg
ICAgICB0aWxlQnVmZmVyVXBkYXRlQ29tcGxldGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKwor
dm9pZCBUaWxlZERyYXdpbmdBcmVhUHJveHk6OmRpZFJlY2VpdmVTeW5jTWVzc2FnZShDb3JlSVBD
OjpDb25uZWN0aW9uKiwgQ29yZUlQQzo6TWVzc2FnZUlELCBDb3JlSVBDOjpBcmd1bWVudERlY29k
ZXIqLCBDb3JlSVBDOjpBcmd1bWVudEVuY29kZXImKQoreworICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworfQorCit2b2lkIFRpbGVkRHJhd2luZ0FyZWFQcm94eTo6cmVxdWVzdFRpbGVVcGRhdGUo
aW50IHRpbGVJRCwgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0KQoreworICAgIHBhZ2UoKS0+cHJv
Y2VzcygpLT5jb25uZWN0aW9uKCktPnNlbmQoRHJhd2luZ0FyZWFNZXNzYWdlOjpVcGRhdGVUaWxl
LCBwYWdlKCktPnBhZ2VJRCgpLCBDb3JlSVBDOjpJbih0aWxlSUQsIGRpcnR5UmVjdCwgY29udGVu
dHNTY2FsZSgpKSk7Cit9CisKK3ZvaWQgVGlsZWREcmF3aW5nQXJlYVByb3h5Ojp3YWl0VW50aWxV
cGRhdGVzQ29tcGxldGUoKQoreworICAgIHdoaWxlIChoYXNQZW5kaW5nVXBkYXRlcygpKSB7Cisg
ICAgICAgIGludCB0aWxlSUQ7CisgICAgICAgIFVwZGF0ZUNodW5rIHVwZGF0ZUNodW5rOworICAg
ICAgICBmbG9hdCBzY2FsZTsKKyAgICAgICAgdW5zaWduZWQgcGVuZGluZ1VwZGF0ZUNvdW50Owor
ICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIGlwY1RpbWVvdXQgPSAyLjA7CisgICAgICAgIE93
blB0cjxDb3JlSVBDOjpBcmd1bWVudERlY29kZXI+IGFyZ3VtZW50cyA9IHBhZ2UoKS0+cHJvY2Vz
cygpLT5jb25uZWN0aW9uKCktPndhaXRGb3IoRHJhd2luZ0FyZWFQcm94eU1lc3NhZ2U6OlRpbGVV
cGRhdGVkLCBwYWdlKCktPnBhZ2VJRCgpLCBpcGNUaW1lb3V0KTsKKyAgICAgICAgaWYgKCFhcmd1
bWVudHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCFhcmd1bWVudHMtPmRlY29k
ZShDb3JlSVBDOjpPdXQodGlsZUlELCB1cGRhdGVDaHVuaywgc2NhbGUsIHBlbmRpbmdVcGRhdGVD
b3VudCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFRpbGVkRHJhd2luZ0FyZWFUaWxl
KiB0aWxlID0gbV90aWxlc0J5SUQuZ2V0KHRpbGVJRCk7CisgICAgICAgIEFTU0VSVCghdGlsZSB8
fCB0aWxlLT5JRCgpID09IHRpbGVJRCk7CisgICAgICAgIGlmICh0aWxlKQorICAgICAgICAgICAg
dGlsZS0+dXBkYXRlRnJvbUNodW5rKCZ1cGRhdGVDaHVuaywgc2NhbGUpOworICAgIH0KKyAgICB0
aWxlQnVmZmVyVXBkYXRlQ29tcGxldGUoKTsKK30KKworUGFzc1JlZlB0cjxUaWxlZERyYXdpbmdB
cmVhVGlsZT4gVGlsZWREcmF3aW5nQXJlYVByb3h5OjpjcmVhdGVUaWxlKGNvbnN0IFRpbGVkRHJh
d2luZ0FyZWFUaWxlOjpDb29yZGluYXRlJiBjb29yZGluYXRlKQoreworICAgIFJlZlB0cjxUaWxl
ZERyYXdpbmdBcmVhVGlsZT4gdGlsZSA9IFRpbGVkRHJhd2luZ0FyZWFUaWxlOjpjcmVhdGUodGhp
cywgY29vcmRpbmF0ZSk7CisgICAgc2V0VGlsZShjb29yZGluYXRlLCB0aWxlKTsKKyAgICByZXR1
cm4gdGlsZTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhUHJveHk6OnNldFRpbGVTaXplKGNv
bnN0IEludFNpemUmIHNpemUpCit7CisgICAgaWYgKG1fdGlsZVNpemUgPT0gc2l6ZSkKKyAgICAg
ICAgcmV0dXJuOworICAgIG1fdGlsZVNpemUgPSBzaXplOworICAgIHJlbW92ZUFsbFRpbGVzKCk7
CisgICAgc3RhcnRUaWxlQ3JlYXRpb25UaW1lcigpOworfQorCit2b2lkIFRpbGVkRHJhd2luZ0Fy
ZWFQcm94eTo6c2V0VGlsZUNyZWF0aW9uRGVsYXkoZG91YmxlIGRlbGF5KQoreworICAgIG1fdGls
ZUNyZWF0aW9uRGVsYXkgPSBkZWxheTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhUHJveHk6
OnNldEtlZXBBbmRDb3ZlckFyZWFNdWx0aXBsaWVycyhjb25zdCBGbG9hdFNpemUmIGtlZXBNdWx0
aXBsaWVyLCBjb25zdCBGbG9hdFNpemUmIGNvdmVyTXVsdGlwbGllcikKK3sKKyAgICBtX2tlZXBB
cmVhTXVsdGlwbGllciA9IGtlZXBNdWx0aXBsaWVyOworICAgIG1fY292ZXJBcmVhTXVsdGlwbGll
ciA9IGNvdmVyTXVsdGlwbGllcjsKKyAgICBzdGFydFRpbGVDcmVhdGlvblRpbWVyKCk7Cit9CisK
K3ZvaWQgVGlsZWREcmF3aW5nQXJlYVByb3h5OjppbnZhbGlkYXRlKGNvbnN0IEludFJlY3QmIGNv
bnRlbnRzRGlydHlSZWN0KQoreworICAgIEludFJlY3QgZGlydHlSZWN0KG1hcEZyb21Db250ZW50
cyhjb250ZW50c0RpcnR5UmVjdCkpOworCisgICAgVGlsZWREcmF3aW5nQXJlYVRpbGU6OkNvb3Jk
aW5hdGUgdG9wTGVmdCA9IHRpbGVDb29yZGluYXRlRm9yUG9pbnQoZGlydHlSZWN0LnRvcExlZnQo
KSk7CisgICAgVGlsZWREcmF3aW5nQXJlYVRpbGU6OkNvb3JkaW5hdGUgYm90dG9tUmlnaHQgPSB0
aWxlQ29vcmRpbmF0ZUZvclBvaW50KGRpcnR5UmVjdC5ib3R0b21SaWdodCgpKTsKKworICAgIElu
dFJlY3QgY292ZXJSZWN0ID0gY2FsY3VsYXRlQ292ZXJSZWN0KG1fcHJldmlvdXNWaXNpYmxlUmVj
dCk7CisKKyAgICBWZWN0b3I8VGlsZWREcmF3aW5nQXJlYVRpbGU6OkNvb3JkaW5hdGU+IHRpbGVz
VG9SZW1vdmU7CisKKyAgICBmb3IgKHVuc2lnbmVkIHlDb29yZGluYXRlID0gdG9wTGVmdC55KCk7
IHlDb29yZGluYXRlIDw9IGJvdHRvbVJpZ2h0LnkoKTsgKyt5Q29vcmRpbmF0ZSkgeworICAgICAg
ICBmb3IgKHVuc2lnbmVkIHhDb29yZGluYXRlID0gdG9wTGVmdC54KCk7IHhDb29yZGluYXRlIDw9
IGJvdHRvbVJpZ2h0LngoKTsgKyt4Q29vcmRpbmF0ZSkgeworICAgICAgICAgICAgUmVmUHRyPFRp
bGVkRHJhd2luZ0FyZWFUaWxlPiBjdXJyZW50VGlsZSA9IHRpbGVBdChUaWxlZERyYXdpbmdBcmVh
VGlsZTo6Q29vcmRpbmF0ZSh4Q29vcmRpbmF0ZSwgeUNvb3JkaW5hdGUpKTsKKyAgICAgICAgICAg
IGlmICghY3VycmVudFRpbGUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICBpZiAoIWN1cnJlbnRUaWxlLT5yZWN0KCkuaW50ZXJzZWN0cyhkaXJ0eVJlY3QpKQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gSWYgYSB0aWxlIG91dHNpZGUgb3V0
IGN1cnJlbnQgY292ZXIgcmVjdCBnZXRzIGludmFsaWRhdGVkLCBqdXN0IGRyb3AgaXQgaW5zdGVh
ZCBvZiB1cGRhdGluZy4KKyAgICAgICAgICAgIGlmICghY3VycmVudFRpbGUtPnJlY3QoKS5pbnRl
cnNlY3RzKGNvdmVyUmVjdCkpIHsKKyAgICAgICAgICAgICAgICB0aWxlc1RvUmVtb3ZlLmFwcGVu
ZChjdXJyZW50VGlsZS0+Y29vcmRpbmF0ZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRUaWxlLT5pbnZhbGlkYXRlKGRpcnR5
UmVjdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1bnNpZ25lZCByZW1vdmVDb3VudCA9IHRp
bGVzVG9SZW1vdmUuc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgbiA9IDA7IG4gPCByZW1vdmVD
b3VudDsgKytuKQorICAgICAgICByZW1vdmVUaWxlKHRpbGVzVG9SZW1vdmVbbl0pOworCisgICAg
c3RhcnRUaWxlQnVmZmVyVXBkYXRlVGltZXIoKTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVh
UHJveHk6OnVwZGF0ZVRpbGVCdWZmZXJzKCkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPFRpbGVkRHJh
d2luZ0FyZWFUaWxlPiA+IG5ld0RpcnR5VGlsZXM7CisgICAgVGlsZU1hcDo6aXRlcmF0b3IgZW5k
ID0gbV90aWxlcy5lbmQoKTsKKyAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxl
cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgUmVmUHRyPFRpbGVkRHJhd2lu
Z0FyZWFUaWxlPiYgY3VycmVudCA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmICghY3VycmVudC0+
aXNEaXJ0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG5ld0RpcnR5VGlsZXMu
YXBwZW5kKGl0LT5zZWNvbmQpOworICAgIH0KKworICAgIGlmIChuZXdEaXJ0eVRpbGVzLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdW5zaWduZWQgc2l6ZSA9IG5ld0RpcnR5VGls
ZXMuc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgbiA9IDA7IG4gPCBzaXplOyArK24pCisgICAg
ICAgIG5ld0RpcnR5VGlsZXNbbl0tPnVwZGF0ZUJhY2tCdWZmZXIoKTsKK30KKwordm9pZCBUaWxl
ZERyYXdpbmdBcmVhUHJveHk6OnRpbGVCdWZmZXJVcGRhdGVDb21wbGV0ZSgpCit7CisgICAgLy8g
QmFpbCBvdXQgaWYgYWxsIHRpbGUgYmFjayBidWZmZXJzIGhhdmUgbm90IGJlZW4gdXBkYXRlZC4K
KyAgICBWZWN0b3I8VGlsZWREcmF3aW5nQXJlYVRpbGUqPiB0aWxlc1RvRmxpcDsKKyAgICBUaWxl
TWFwOjppdGVyYXRvciBlbmQgPSBtX3RpbGVzLmVuZCgpOworICAgIGZvciAoVGlsZU1hcDo6aXRl
cmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBS
ZWZQdHI8VGlsZWREcmF3aW5nQXJlYVRpbGU+JiBjdXJyZW50ID0gaXQtPnNlY29uZDsKKyAgICAg
ICAgaWYgKGN1cnJlbnQtPmlzUmVhZHlUb1BhaW50KCkgJiYgKGN1cnJlbnQtPmlzRGlydHkoKSB8
fCBjdXJyZW50LT5oYXNCYWNrQnVmZmVyVXBkYXRlUGVuZGluZygpKSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgaWYgKGN1cnJlbnQtPmhhc1JlYWR5QmFja0J1ZmZlcigpKQorICAgICAg
ICAgICAgdGlsZXNUb0ZsaXAuYXBwZW5kKGN1cnJlbnQuZ2V0KCkpOworICAgIH0KKyAgICAvLyBF
dmVyeXRoaW5nIGRvbmUsIG1vdmUgYmFjayBidWZmZXJzIHRvIGZyb250LgorICAgIFZlY3RvcjxJ
bnRSZWN0PiBwYWludGVkQXJlYTsKKyAgICB1bnNpZ25lZCBzaXplID0gdGlsZXNUb0ZsaXAuc2l6
ZSgpOworICAgIGZvciAodW5zaWduZWQgbiA9IDA7IG4gPCBzaXplOyArK24pIHsKKyAgICAgICAg
VGlsZWREcmF3aW5nQXJlYVRpbGUqIHRpbGUgPSB0aWxlc1RvRmxpcFtuXTsKKyAgICAgICAgdGls
ZS0+c3dhcEJhY2tCdWZmZXJUb0Zyb250KCk7CisgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90
IHJlcXVlc3Qgc3lzdGVtIHJlcGFpbnQgZm9yIHRoZSBmdWxsIHRpbGUuCisgICAgICAgIHBhaW50
ZWRBcmVhLmFwcGVuZChtYXBUb0NvbnRlbnRzKHRpbGUtPnJlY3QoKSkpOworICAgIH0KKyAgICBp
ZiAoc2l6ZSkKKyAgICAgICAgdXBkYXRlV2ViVmlldyhwYWludGVkQXJlYSk7CisKKyAgICBtX3Rp
bGVDcmVhdGlvblRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdB
cmVhUHJveHk6OnBhaW50KGNvbnN0IEludFJlY3QmIHJlY3QsIFBsYXRmb3JtRHJhd2luZ0NvbnRl
eHQgY29udGV4dCkKK3sKKyAgICBpZiAobV9pc1dhaXRpbmdGb3JEaWRTZXRGcmFtZU5vdGlmaWNh
dGlvbikgeworICAgICAgICBXZWJQYWdlUHJveHkqIHBhZ2UgPSB0aGlzLT5wYWdlKCk7CisgICAg
ICAgIGlmICghcGFnZS0+aXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IGlmIChwYWdlLT5wcm9jZXNzKCktPmlzTGF1bmNoaW5nKCkpCisgICAgICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgYWRqdXN0VmlzaWJsZVJlY3QoKTsKKworICAgIEdyYXBoaWNzQ29udGV4
dCBnYyhjb250ZXh0KTsKKyAgICBnYy5zYXZlKCk7CisKKyAgICAvLyBBc3N1bWVzIHRoZSBiYWNr
aW5nIHN0b3JlIGlzIHBhaW50ZWQgd2l0aCB0aGUgc2NhbGUgdHJhbnNmb3JtIGFwcGxpZWQuCisg
ICAgLy8gU2luY2UgdGlsZSBjb250ZW50IGlzIGFscmVhZHkgc2NhbGVkLCBmaXJzdCByZXZlcnQg
dGhlIHNjYWxpbmcgZnJvbSB0aGUgcGFpbnRlci4KKyAgICBnYy5zY2FsZShGbG9hdFNpemUoMS5m
IC8gbV9jb250ZW50c1NjYWxlLCAxLmYgLyBtX2NvbnRlbnRzU2NhbGUpKTsKKworICAgIEludFJl
Y3QgZGlydHlSZWN0ID0gbWFwRnJvbUNvbnRlbnRzKHJlY3QpOworCisgICAgVGlsZWREcmF3aW5n
QXJlYVRpbGU6OkNvb3JkaW5hdGUgdG9wTGVmdCA9IHRpbGVDb29yZGluYXRlRm9yUG9pbnQoZGly
dHlSZWN0LnRvcExlZnQoKSk7CisgICAgVGlsZWREcmF3aW5nQXJlYVRpbGU6OkNvb3JkaW5hdGUg
Ym90dG9tUmlnaHQgPSB0aWxlQ29vcmRpbmF0ZUZvclBvaW50KGRpcnR5UmVjdC5ib3R0b21SaWdo
dCgpKTsKKworICAgIGZvciAodW5zaWduZWQgeUNvb3JkaW5hdGUgPSB0b3BMZWZ0LnkoKTsgeUNv
b3JkaW5hdGUgPD0gYm90dG9tUmlnaHQueSgpOyArK3lDb29yZGluYXRlKSB7CisgICAgICAgIGZv
ciAodW5zaWduZWQgeENvb3JkaW5hdGUgPSB0b3BMZWZ0LngoKTsgeENvb3JkaW5hdGUgPD0gYm90
dG9tUmlnaHQueCgpOyArK3hDb29yZGluYXRlKSB7CisgICAgICAgICAgICBUaWxlZERyYXdpbmdB
cmVhVGlsZTo6Q29vcmRpbmF0ZSBjdXJyZW50Q29vcmRpbmF0ZSh4Q29vcmRpbmF0ZSwgeUNvb3Jk
aW5hdGUpOworICAgICAgICAgICAgUmVmUHRyPFRpbGVkRHJhd2luZ0FyZWFUaWxlPiBjdXJyZW50
VGlsZSA9IHRpbGVBdChjdXJyZW50Q29vcmRpbmF0ZSk7CisgICAgICAgICAgICBpZiAoY3VycmVu
dFRpbGUgJiYgY3VycmVudFRpbGUtPmlzUmVhZHlUb1BhaW50KCkpCisgICAgICAgICAgICAgICAg
Y3VycmVudFRpbGUtPnBhaW50KCZnYywgZGlydHlSZWN0KTsKKyAgICAgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgICAgIEludFJlY3QgdGlsZVJlY3QgPSB0aWxlUmVjdEZvckNvb3JkaW5hdGUo
Y3VycmVudENvb3JkaW5hdGUpOworICAgICAgICAgICAgICAgIEludFJlY3QgdGFyZ2V0ID0gaW50
ZXJzZWN0aW9uKHRpbGVSZWN0LCBkaXJ0eVJlY3QpOworICAgICAgICAgICAgICAgIGlmICh0YXJn
ZXQuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
ICAgICBUaWxlZERyYXdpbmdBcmVhVGlsZTo6cGFpbnRDaGVja2VyUGF0dGVybigmZ2MsIEZsb2F0
UmVjdCh0YXJnZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBnYy5y
ZXN0b3JlKCk7Cit9CisKK3ZvaWQgVGlsZWREcmF3aW5nQXJlYVByb3h5OjphZGp1c3RWaXNpYmxl
UmVjdCgpCit7CisgICAgSW50UmVjdCB2aXNpYmxlUmVjdCA9IG1hcEZyb21Db250ZW50cyh3ZWJW
aWV3VmlzaWJsZVJlY3QoKSk7CisgICAgaWYgKG1fcHJldmlvdXNWaXNpYmxlUmVjdCA9PSB2aXNp
YmxlUmVjdCkKKyAgICAgICAgcmV0dXJuOworICAgIG1fcHJldmlvdXNWaXNpYmxlUmVjdCA9IHZp
c2libGVSZWN0OworCisgICAgc3RhcnRUaWxlQ3JlYXRpb25UaW1lcigpOworfQorCit2b2lkIFRp
bGVkRHJhd2luZ0FyZWFQcm94eTo6c2V0Q29udGVudHNTY2FsZShmbG9hdCBzY2FsZSkKK3sKKyAg
ICBpZiAobV9jb250ZW50c1NjYWxlID09IHNjYWxlKQorICAgICAgICByZXR1cm47CisgICAgbV9j
b250ZW50c1NjYWxlID0gc2NhbGU7CisgICAgcmVtb3ZlQWxsVGlsZXMoKTsKKyAgICBjcmVhdGVU
aWxlcygpOworfQorCit2b2lkIFRpbGVkRHJhd2luZ0FyZWFQcm94eTo6cmVtb3ZlQWxsVGlsZXMo
KQoreworICAgIFZlY3RvcjxSZWZQdHI8VGlsZWREcmF3aW5nQXJlYVRpbGU+ID4gdGlsZXNUb1Jl
bW92ZTsKKyAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV90aWxlcywgdGlsZXNUb1JlbW92ZSk7Cisg
ICAgdW5zaWduZWQgcmVtb3ZlQ291bnQgPSB0aWxlc1RvUmVtb3ZlLnNpemUoKTsKKyAgICBmb3Ig
KHVuc2lnbmVkIG4gPSAwOyBuIDwgcmVtb3ZlQ291bnQ7ICsrbikKKyAgICAgICAgcmVtb3ZlVGls
ZSh0aWxlc1RvUmVtb3ZlW25dLT5jb29yZGluYXRlKCkpOworfQorCitkb3VibGUgVGlsZWREcmF3
aW5nQXJlYVByb3h5Ojp0aWxlRGlzdGFuY2UoY29uc3QgSW50UmVjdCYgdmlld3BvcnQsIGNvbnN0
IFRpbGVkRHJhd2luZ0FyZWFUaWxlOjpDb29yZGluYXRlJiB0aWxlQ29vcmRpbmF0ZSkKK3sKKyAg
ICBpZiAodmlld3BvcnQuaW50ZXJzZWN0cyh0aWxlUmVjdEZvckNvb3JkaW5hdGUodGlsZUNvb3Jk
aW5hdGUpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBJbnRQb2ludCB2aWV3Q2VudGVyID0g
dmlld3BvcnQubG9jYXRpb24oKSArIEludFNpemUodmlld3BvcnQud2lkdGgoKSAvIDIsIHZpZXdw
b3J0LmhlaWdodCgpIC8gMik7CisgICAgVGlsZWREcmF3aW5nQXJlYVRpbGU6OkNvb3JkaW5hdGUg
Y2VudGVyQ29vcmRpbmF0ZSA9IHRpbGVDb29yZGluYXRlRm9yUG9pbnQodmlld0NlbnRlcik7CisK
KyAgICAvLyBNYW5oYXR0YW4gZGlzdGFuY2UsIGJpYXNlZCBzbyB0aGF0IHZlcnRpY2FsIGRpc3Rh
bmNlcyBhcmUgc2hvcnRlci4KKyAgICBjb25zdCBkb3VibGUgaG9yaXpvbnRhbEJpYXMgPSAxLjM7
CisgICAgcmV0dXJuIGFicyhjZW50ZXJDb29yZGluYXRlLnkoKSAtIHRpbGVDb29yZGluYXRlLnko
KSkgKyBob3Jpem9udGFsQmlhcyAqIGFicyhjZW50ZXJDb29yZGluYXRlLngoKSAtIHRpbGVDb29y
ZGluYXRlLngoKSk7Cit9CisKK0ludFJlY3QgVGlsZWREcmF3aW5nQXJlYVByb3h5OjpjYWxjdWxh
dGVLZWVwUmVjdChjb25zdCBJbnRSZWN0JiB2aXNpYmxlUmVjdCkgY29uc3QKK3sKKyAgICBJbnRS
ZWN0IHJlc3VsdCA9IHZpc2libGVSZWN0OworICAgIHJlc3VsdC5pbmZsYXRlWCh2aXNpYmxlUmVj
dC53aWR0aCgpICogKG1fa2VlcEFyZWFNdWx0aXBsaWVyLndpZHRoKCkgLSAxLmYpKTsKKyAgICBy
ZXN1bHQuaW5mbGF0ZVkodmlzaWJsZVJlY3QuaGVpZ2h0KCkgKiAobV9rZWVwQXJlYU11bHRpcGxp
ZXIuaGVpZ2h0KCkgLSAxLmYpKTsKKyAgICByZXN1bHQuaW50ZXJzZWN0KGNvbnRlbnRzUmVjdCgp
KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnRSZWN0IFRpbGVkRHJhd2luZ0FyZWFQcm94
eTo6Y2FsY3VsYXRlQ292ZXJSZWN0KGNvbnN0IEludFJlY3QmIHZpc2libGVSZWN0KSBjb25zdAor
eworICAgIEludFJlY3QgcmVzdWx0ID0gdmlzaWJsZVJlY3Q7CisgICAgcmVzdWx0LmluZmxhdGVY
KHZpc2libGVSZWN0LndpZHRoKCkgKiAobV9jb3ZlckFyZWFNdWx0aXBsaWVyLndpZHRoKCkgLSAx
LmYpKTsKKyAgICByZXN1bHQuaW5mbGF0ZVkodmlzaWJsZVJlY3QuaGVpZ2h0KCkgKiAobV9jb3Zl
ckFyZWFNdWx0aXBsaWVyLmhlaWdodCgpIC0gMS5mKSk7CisgICAgcmVzdWx0LmludGVyc2VjdChj
b250ZW50c1JlY3QoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBUaWxlZERyYXdp
bmdBcmVhUHJveHk6OmNyZWF0ZVRpbGVzKCkKK3sKKyAgICBJbnRSZWN0IHZpc2libGVSZWN0ID0g
bWFwRnJvbUNvbnRlbnRzKHdlYlZpZXdWaXNpYmxlUmVjdCgpKTsKKyAgICBtX3ByZXZpb3VzVmlz
aWJsZVJlY3QgPSB2aXNpYmxlUmVjdDsKKworICAgIGlmICh2aXNpYmxlUmVjdC5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFJlc2l6ZSB0aWxlcyBvbiBlZGdlcyBpbiBjYXNl
IHRoZSBjb250ZW50cyBzaXplIGhhcyBjaGFuZ2VkLgorICAgIGJvb2wgZGlkUmVzaXplVGlsZXMg
PSByZXNpemVFZGdlVGlsZXMoKTsKKworICAgIC8vIFJlbW92ZSB0aWxlcyBvdXRzaWRlIG91dCBj
dXJyZW50IG1heGltdW0ga2VlcCByZWN0LgorICAgIGRyb3BUaWxlc091dHNpZGVSZWN0KGNhbGN1
bGF0ZUtlZXBSZWN0KHZpc2libGVSZWN0KSk7CisKKyAgICAvLyBDb3ZlciB0aGUgY292ZXIgcmVj
dCB3aXRoIHRpbGVzLgorICAgIEludFJlY3QgY292ZXJSZWN0ID0gY2FsY3VsYXRlQ292ZXJSZWN0
KHZpc2libGVSZWN0KTsKKworICAgIC8vIFNlYXJjaCBmb3IgdGhlIHRpbGUgcG9zaXRpb24gY2xv
c2VzdCB0byB0aGUgdmlld3BvcnQgY2VudGVyIHRoYXQgZG9lcyBub3QgeWV0IGNvbnRhaW4gYSB0
aWxlLgorICAgIC8vIFdoaWNoIHBvc2l0aW9uIGlzIGNvbnNpZGVyZWQgdGhlIGNsb3Nlc3QgZGVw
ZW5kcyBvbiB0aGUgdGlsZURpc3RhbmNlIGZ1bmN0aW9uLgorICAgIGRvdWJsZSBzaG9ydGVzdERp
c3RhbmNlID0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOworICAgIFZl
Y3RvcjxUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZT4gdGlsZXNUb0NyZWF0ZTsKKyAg
ICB1bnNpZ25lZCByZXF1aXJlZFRpbGVDb3VudCA9IDA7CisgICAgYm9vbCBoYXNWaXNpYmxlQ2hl
Y2tlcnMgPSBmYWxzZTsKKyAgICBUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZSB0b3BM
ZWZ0ID0gdGlsZUNvb3JkaW5hdGVGb3JQb2ludChjb3ZlclJlY3QudG9wTGVmdCgpKTsKKyAgICBU
aWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZSBib3R0b21SaWdodCA9IHRpbGVDb29yZGlu
YXRlRm9yUG9pbnQoY292ZXJSZWN0LmJvdHRvbVJpZ2h0KCkpOworICAgIGZvciAodW5zaWduZWQg
eUNvb3JkaW5hdGUgPSB0b3BMZWZ0LnkoKTsgeUNvb3JkaW5hdGUgPD0gYm90dG9tUmlnaHQueSgp
OyArK3lDb29yZGluYXRlKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgeENvb3JkaW5hdGUgPSB0
b3BMZWZ0LngoKTsgeENvb3JkaW5hdGUgPD0gYm90dG9tUmlnaHQueCgpOyArK3hDb29yZGluYXRl
KSB7CisgICAgICAgICAgICBUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZSBjdXJyZW50
Q29vcmRpbmF0ZSh4Q29vcmRpbmF0ZSwgeUNvb3JkaW5hdGUpOworICAgICAgICAgICAgLy8gRGlz
dGFuY2UgaXMgMCBmb3IgYWxsIGN1cnJlbnRseSB2aXNpYmxlIHRpbGVzLgorICAgICAgICAgICAg
ZG91YmxlIGRpc3RhbmNlID0gdGlsZURpc3RhbmNlKHZpc2libGVSZWN0LCBjdXJyZW50Q29vcmRp
bmF0ZSk7CisKKyAgICAgICAgICAgIFJlZlB0cjxUaWxlZERyYXdpbmdBcmVhVGlsZT4gdGlsZSA9
IHRpbGVBdChjdXJyZW50Q29vcmRpbmF0ZSk7CisgICAgICAgICAgICBpZiAoIWRpc3RhbmNlICYm
ICghdGlsZSB8fCAhdGlsZS0+aXNSZWFkeVRvUGFpbnQoKSkpCisgICAgICAgICAgICAgICAgaGFz
VmlzaWJsZUNoZWNrZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICh0aWxlKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICArK3JlcXVpcmVkVGlsZUNvdW50OworCisg
ICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiBzaG9ydGVzdERpc3RhbmNlKQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgc2hvcnRlc3REaXN0YW5j
ZSkgeworICAgICAgICAgICAgICAgIHRpbGVzVG9DcmVhdGUuY2xlYXIoKTsKKyAgICAgICAgICAg
ICAgICBzaG9ydGVzdERpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICB0aWxlc1RvQ3JlYXRlLmFwcGVuZChjdXJyZW50Q29vcmRpbmF0ZSk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAoaGFzVmlzaWJsZUNoZWNrZXJzICYmIHNob3J0ZXN0RGlzdGFuY2Ug
PiAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBOb3cgY29uc3RydWN0IHRoZSB0aWxlKHMp
CisgICAgdW5zaWduZWQgdGlsZXNUb0NyZWF0ZUNvdW50ID0gdGlsZXNUb0NyZWF0ZS5zaXplKCk7
CisgICAgZm9yICh1bnNpZ25lZCBuID0gMDsgbiA8IHRpbGVzVG9DcmVhdGVDb3VudDsgKytuKQor
ICAgICAgICBjcmVhdGVUaWxlKHRpbGVzVG9DcmVhdGVbbl0pOworCisgICAgcmVxdWlyZWRUaWxl
Q291bnQgLT0gdGlsZXNUb0NyZWF0ZUNvdW50OworCisgICAgLy8gUGFpbnQgdGhlIGNvbnRlbnQg
b2YgdGhlIG5ld2x5IGNyZWF0ZWQgdGlsZXMKKyAgICBpZiAodGlsZXNUb0NyZWF0ZUNvdW50IHx8
IGRpZFJlc2l6ZVRpbGVzKQorICAgICAgICB1cGRhdGVUaWxlQnVmZmVycygpOworCisgICAgLy8g
S2VlcCBjcmVhdGluZyB0aWxlcyB1bnRpbCB0aGUgd2hvbGUgY292ZXJSZWN0IGlzIGNvdmVyZWQu
CisgICAgaWYgKHJlcXVpcmVkVGlsZUNvdW50KQorICAgICAgICBtX3RpbGVDcmVhdGlvblRpbWVy
LnN0YXJ0T25lU2hvdChtX3RpbGVDcmVhdGlvbkRlbGF5KTsKK30KKworYm9vbCBUaWxlZERyYXdp
bmdBcmVhUHJveHk6OnJlc2l6ZUVkZ2VUaWxlcygpCit7CisgICAgSW50UmVjdCBjb250ZW50c1Jl
Y3QgPSB0aGlzLT5jb250ZW50c1JlY3QoKTsKKyAgICBib29sIHJlc2l6ZWQgPSBmYWxzZTsKKwor
ICAgIFZlY3RvcjxUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZT4gdGlsZXNUb1JlbW92
ZTsKKyAgICBUaWxlTWFwOjppdGVyYXRvciBlbmQgPSBtX3RpbGVzLmVuZCgpOworICAgIGZvciAo
VGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkg
eworICAgICAgICBUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZSB0aWxlQ29vcmRpbmF0
ZSA9IGl0LT5zZWNvbmQtPmNvb3JkaW5hdGUoKTsKKyAgICAgICAgSW50UmVjdCB0aWxlUmVjdCA9
IGl0LT5zZWNvbmQtPnJlY3QoKTsKKyAgICAgICAgSW50UmVjdCBleHBlY3RlZFRpbGVSZWN0ID0g
dGlsZVJlY3RGb3JDb29yZGluYXRlKHRpbGVDb29yZGluYXRlKTsKKyAgICAgICAgaWYgKCFjb250
ZW50c1JlY3QuY29udGFpbnModGlsZVJlY3QpKQorICAgICAgICAgICAgdGlsZXNUb1JlbW92ZS5h
cHBlbmQodGlsZUNvb3JkaW5hdGUpOworICAgICAgICBlbHNlIGlmIChleHBlY3RlZFRpbGVSZWN0
ICE9IHRpbGVSZWN0KSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLT5yZXNpemUoZXhwZWN0ZWRU
aWxlUmVjdC5zaXplKCkpOworICAgICAgICAgICAgcmVzaXplZCA9IHRydWU7CisgICAgICAgIH0K
KyAgICB9CisgICAgdW5zaWduZWQgcmVtb3ZlQ291bnQgPSB0aWxlc1RvUmVtb3ZlLnNpemUoKTsK
KyAgICBmb3IgKHVuc2lnbmVkIG4gPSAwOyBuIDwgcmVtb3ZlQ291bnQ7ICsrbikKKyAgICAgICAg
cmVtb3ZlVGlsZSh0aWxlc1RvUmVtb3ZlW25dKTsKKyAgICByZXR1cm4gcmVzaXplZDsKK30KKwor
dm9pZCBUaWxlZERyYXdpbmdBcmVhUHJveHk6OmRyb3BUaWxlc091dHNpZGVSZWN0KGNvbnN0IElu
dFJlY3QmIGtlZXBSZWN0KQoreworICAgIEZsb2F0UmVjdCBrZWVwUmVjdEYgPSBrZWVwUmVjdDsK
KworICAgIFZlY3RvcjxUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZT4gdG9SZW1vdmU7
CisgICAgVGlsZU1hcDo6aXRlcmF0b3IgZW5kID0gbV90aWxlcy5lbmQoKTsKKyAgICBmb3IgKFRp
bGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
KyAgICAgICAgVGlsZWREcmF3aW5nQXJlYVRpbGU6OkNvb3JkaW5hdGUgY29vcmRpbmF0ZSA9IGl0
LT5zZWNvbmQtPmNvb3JkaW5hdGUoKTsKKyAgICAgICAgRmxvYXRSZWN0IHRpbGVSZWN0ID0gaXQt
PnNlY29uZC0+cmVjdCgpOworICAgICAgICBpZiAoIXRpbGVSZWN0LmludGVyc2VjdHMoa2VlcFJl
Y3RGKSkKKyAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChjb29yZGluYXRlKTsKKyAgICB9Cisg
ICAgdW5zaWduZWQgcmVtb3ZlQ291bnQgPSB0b1JlbW92ZS5zaXplKCk7CisgICAgZm9yICh1bnNp
Z25lZCBuID0gMDsgbiA8IHJlbW92ZUNvdW50OyArK24pCisgICAgICAgIHJlbW92ZVRpbGUodG9S
ZW1vdmVbbl0pOworfQorCitQYXNzUmVmUHRyPFRpbGVkRHJhd2luZ0FyZWFUaWxlPiBUaWxlZERy
YXdpbmdBcmVhUHJveHk6OnRpbGVBdChjb25zdCBUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRp
bmF0ZSYgY29vcmRpbmF0ZSkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90aWxlcy5nZXQoY29vcmRp
bmF0ZSk7Cit9CisKK3ZvaWQgVGlsZWREcmF3aW5nQXJlYVByb3h5OjpzZXRUaWxlKGNvbnN0IFRp
bGVkRHJhd2luZ0FyZWFUaWxlOjpDb29yZGluYXRlJiBjb29yZGluYXRlLCBSZWZQdHI8VGlsZWRE
cmF3aW5nQXJlYVRpbGU+IHRpbGUpCit7CisgICAgbV90aWxlcy5zZXQoY29vcmRpbmF0ZSwgdGls
ZSk7CisgICAgbV90aWxlc0J5SUQuc2V0KHRpbGUtPklEKCksIHRpbGUuZ2V0KCkpOworfQorCit2
b2lkIFRpbGVkRHJhd2luZ0FyZWFQcm94eTo6cmVtb3ZlVGlsZShjb25zdCBUaWxlZERyYXdpbmdB
cmVhVGlsZTo6Q29vcmRpbmF0ZSYgY29vcmRpbmF0ZSkKK3sKKyAgICBSZWZQdHI8VGlsZWREcmF3
aW5nQXJlYVRpbGU+IHRpbGUgPSBtX3RpbGVzLnRha2UoY29vcmRpbmF0ZSk7CisKKyAgICBtX3Rp
bGVzQnlJRC5yZW1vdmUodGlsZS0+SUQoKSk7CisKKyAgICBpZiAoIXRpbGUtPmhhc0JhY2tCdWZm
ZXJVcGRhdGVQZW5kaW5nKCkpCisgICAgICAgIHJldHVybjsKKyAgICBXZWJQYWdlUHJveHkqIHBh
Z2UgPSB0aGlzLT5wYWdlKCk7CisgICAgcGFnZS0+cHJvY2VzcygpLT5zZW5kKERyYXdpbmdBcmVh
TWVzc2FnZTo6Q2FuY2VsVGlsZVVwZGF0ZSwgcGFnZS0+cGFnZUlEKCksIENvcmVJUEM6OkluKHRp
bGUtPklEKCkpKTsKK30KKworSW50UmVjdCBUaWxlZERyYXdpbmdBcmVhUHJveHk6Om1hcFRvQ29u
dGVudHMoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZW5jbG9zaW5n
SW50UmVjdChGbG9hdFJlY3QocmVjdC54KCkgLyBtX2NvbnRlbnRzU2NhbGUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueSgpIC8gbV9jb250ZW50c1NjYWxlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LndpZHRoKCkgLyBtX2Nv
bnRlbnRzU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Qu
aGVpZ2h0KCkgLyBtX2NvbnRlbnRzU2NhbGUpKTsKK30KKworSW50UmVjdCBUaWxlZERyYXdpbmdB
cmVhUHJveHk6Om1hcEZyb21Db250ZW50cyhjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAorewor
ICAgIHJldHVybiBlbmNsb3NpbmdJbnRSZWN0KEZsb2F0UmVjdChyZWN0LngoKSAqIG1fY29udGVu
dHNTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC55KCkg
KiBtX2NvbnRlbnRzU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJlY3Qud2lkdGgoKSAqIG1fY29udGVudHNTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQoKSAqIG1fY29udGVudHNTY2FsZSkpOworfQorCitJ
bnRSZWN0IFRpbGVkRHJhd2luZ0FyZWFQcm94eTo6Y29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbWFwRnJvbUNvbnRlbnRzKEludFJlY3QoSW50UG9pbnQoMCwgMCksIG1fdmlld1Np
emUpKTsKK30KKworSW50UmVjdCBUaWxlZERyYXdpbmdBcmVhUHJveHk6OnRpbGVSZWN0Rm9yQ29v
cmRpbmF0ZShjb25zdCBUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZSYgY29vcmRpbmF0
ZSkgY29uc3QKK3sKKyAgICBJbnRSZWN0IHJlY3QoY29vcmRpbmF0ZS54KCkgKiBtX3RpbGVTaXpl
LndpZHRoKCksCisgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGUueSgpICogbV90aWxlU2l6ZS5o
ZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgbV90aWxlU2l6ZS53aWR0aCgpLAorICAgICAgICAg
ICAgICAgICBtX3RpbGVTaXplLmhlaWdodCgpKTsKKworICAgIHJlY3QuaW50ZXJzZWN0KGNvbnRl
bnRzUmVjdCgpKTsKKyAgICByZXR1cm4gcmVjdDsKK30KKworVGlsZWREcmF3aW5nQXJlYVRpbGU6
OkNvb3JkaW5hdGUgVGlsZWREcmF3aW5nQXJlYVByb3h5Ojp0aWxlQ29vcmRpbmF0ZUZvclBvaW50
KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBpbnQgeCA9IHBvaW50LngoKSAv
IG1fdGlsZVNpemUud2lkdGgoKTsKKyAgICBpbnQgeSA9IHBvaW50LnkoKSAvIG1fdGlsZVNpemUu
aGVpZ2h0KCk7CisgICAgcmV0dXJuIFRpbGVkRHJhd2luZ0FyZWFUaWxlOjpDb29yZGluYXRlKHN0
ZDo6bWF4KHgsIDApLCBzdGQ6Om1heCh5LCAwKSk7Cit9CisKKwordm9pZCBUaWxlZERyYXdpbmdB
cmVhUHJveHk6OnN0YXJ0VGlsZUJ1ZmZlclVwZGF0ZVRpbWVyKCkKK3sKKyAgICBpZiAobV90aWxl
QnVmZmVyVXBkYXRlVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fdGls
ZUJ1ZmZlclVwZGF0ZVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKK30KKwordm9pZCBUaWxlZERyYXdp
bmdBcmVhUHJveHk6OnRpbGVCdWZmZXJVcGRhdGVUaW1lckZpcmVkKCkKK3sKKyAgICB1cGRhdGVU
aWxlQnVmZmVycygpOworfQorCit2b2lkIFRpbGVkRHJhd2luZ0FyZWFQcm94eTo6c3RhcnRUaWxl
Q3JlYXRpb25UaW1lcigpCit7CisgICAgaWYgKG1fdGlsZUNyZWF0aW9uVGltZXIuaXNBY3RpdmUo
KSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fdGlsZUNyZWF0aW9uVGltZXIuc3RhcnRPbmVTaG90
KDApOworfQorCit2b2lkIFRpbGVkRHJhd2luZ0FyZWFQcm94eTo6dGlsZUNyZWF0aW9uVGltZXJG
aXJlZCgpCit7CisgICAgY3JlYXRlVGlsZXMoKTsKK30KKworYm9vbCBUaWxlZERyYXdpbmdBcmVh
UHJveHk6Omhhc1BlbmRpbmdVcGRhdGVzKCkgY29uc3QKK3sKKyAgICBUaWxlTWFwOjpjb25zdF9p
dGVyYXRvciBlbmQgPSBtX3RpbGVzLmVuZCgpOworICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBj
b25zdCBSZWZQdHI8VGlsZWREcmF3aW5nQXJlYVRpbGU+JiBjdXJyZW50ID0gaXQtPnNlY29uZDsK
KyAgICAgICAgaWYgKGN1cnJlbnQtPmhhc0JhY2tCdWZmZXJVcGRhdGVQZW5kaW5nKCkpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJLaXQKKwpkaWZmIC0tZ2l0IGEvV2ViS2l0Mi9VSVByb2Nlc3MvVGlsZWRE
cmF3aW5nQXJlYVByb3h5LmggYi9XZWJLaXQyL1VJUHJvY2Vzcy9UaWxlZERyYXdpbmdBcmVhUHJv
eHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWEyNmQ0Ci0tLSAvZGV2
L251bGwKKysrIGIvV2ViS2l0Mi9VSVByb2Nlc3MvVGlsZWREcmF3aW5nQXJlYVByb3h5LmgKQEAg
LTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRp
b24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVGlsZWRE
cmF3aW5nQXJlYVByb3h5X2gKKyNkZWZpbmUgVGlsZWREcmF3aW5nQXJlYVByb3h5X2gKKworI2lm
IEVOQUJMRShUSUxFRF9CQUNLSU5HX1NUT1JFKQorCisjaW5jbHVkZSAiRHJhd2luZ0FyZWFQcm94
eS5oIgorI2luY2x1ZGUgPFdlYkNvcmUvR3JhcGhpY3NDb250ZXh0Lmg+CisjaW5jbHVkZSA8V2Vi
Q29yZS9JbnRTaXplLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbnRSZWN0Lmg+CisjaW5jbHVkZSA8
d3RmL0hhc2hTZXQuaD4KKworI2luY2x1ZGUgIlJ1bkxvb3AuaCIKKyNpbmNsdWRlICJUaWxlZERy
YXdpbmdBcmVhVGlsZS5oIgorCisjaWYgUExBVEZPUk0oTUFDKQorI2luY2x1ZGUgPHd0Zi9SZXRh
aW5QdHIuaD4KKyNpZmRlZiBfX09CSkNfXworQGNsYXNzIFdLVmlldzsKKyNlbHNlCitjbGFzcyBX
S1ZpZXc7CisjZW5kaWYKKyNlbGlmIFBMQVRGT1JNKFFUKQorY2xhc3MgUUdyYXBoaWNzV0tWaWV3
OworI2luY2x1ZGUgPFFJbWFnZT4KKyNlbmRpZgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xh
c3MgVXBkYXRlQ2h1bms7CitjbGFzcyBXZWJQYWdlUHJveHk7CisKKyNpZiBQTEFURk9STShNQUMp
Cit0eXBlZGVmIFdLVmlldyBQbGF0Zm9ybVdlYlZpZXc7CisjZWxpZiBQTEFURk9STShXSU4pCitj
bGFzcyBXZWJWaWV3OwordHlwZWRlZiBXZWJWaWV3IFBsYXRmb3JtV2ViVmlldzsKKyNlbGlmIFBM
QVRGT1JNKFFUKQordHlwZWRlZiBRR3JhcGhpY3NXS1ZpZXcgUGxhdGZvcm1XZWJWaWV3OworI2Vu
ZGlmCisKK2NsYXNzIFRpbGVkRHJhd2luZ0FyZWFQcm94eSA6IHB1YmxpYyBEcmF3aW5nQXJlYVBy
b3h5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxUaWxlZERyYXdpbmdBcmVhUHJv
eHk+IGNyZWF0ZShQbGF0Zm9ybVdlYlZpZXcqIHdlYlZpZXcpOworCisgICAgVGlsZWREcmF3aW5n
QXJlYVByb3h5KFBsYXRmb3JtV2ViVmlldyopOworICAgIHZpcnR1YWwgflRpbGVkRHJhd2luZ0Fy
ZWFQcm94eSgpOworCisgICAgZmxvYXQgY29udGVudHNTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIG1f
Y29udGVudHNTY2FsZTsgfQorICAgIHZvaWQgc2V0Q29udGVudHNTY2FsZShmbG9hdCk7CisKKyAg
ICB2b2lkIHdhaXRVbnRpbFVwZGF0ZXNDb21wbGV0ZSgpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hDb21wb3NpdGluZ0NvbnRleHQo
dWludDMyX3QgLyogY29udGV4dElEICovKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoQ29t
cG9zaXRpbmdDb250ZXh0KCkgeyB9CisjZW5kaWYKKworICAgIHZvaWQgcGFpbnQoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0KiwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpOworCisgICAgV2ViQ29y
ZTo6SW50U2l6ZSB0aWxlU2l6ZSgpIHsgcmV0dXJuIG1fdGlsZVNpemU7IH0KKyAgICB2b2lkIHNl
dFRpbGVTaXplKGNvbnN0IFdlYkNvcmU6OkludFNpemUmKTsKKworICAgIGRvdWJsZSB0aWxlQ3Jl
YXRpb25EZWxheSgpIGNvbnN0IHsgcmV0dXJuIG1fdGlsZUNyZWF0aW9uRGVsYXk7IH0KKyAgICB2
b2lkIHNldFRpbGVDcmVhdGlvbkRlbGF5KGRvdWJsZSBkZWxheSk7CisKKyAgICAvLyBUaWxlZCBh
cmUgZHJvcHBlZCBvdXRzaWRlIHRoZSBrZWVwIGFyZWEsIGFuZCBjcmVhdGVkIGZvciBjb3ZlciBh
cmVhLiBUaGUgdmFsdWVzIGEgcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0IHNpemUuCisgICAgdm9p
ZCBnZXRLZWVwQW5kQ292ZXJBcmVhTXVsdGlwbGllcnMoV2ViQ29yZTo6RmxvYXRTaXplJiBrZWVw
TXVsdGlwbGllciwgV2ViQ29yZTo6RmxvYXRTaXplJiBjb3Zlck11bHRpcGxpZXIpCisgICAgewor
ICAgICAgICBrZWVwTXVsdGlwbGllciA9IG1fa2VlcEFyZWFNdWx0aXBsaWVyOworICAgICAgICBj
b3Zlck11bHRpcGxpZXIgPSBtX2NvdmVyQXJlYU11bHRpcGxpZXI7CisgICAgfQorICAgIHZvaWQg
c2V0S2VlcEFuZENvdmVyQXJlYU11bHRpcGxpZXJzKGNvbnN0IFdlYkNvcmU6OkZsb2F0U2l6ZSYg
a2VlcE11bHRpcGxpZXIsIGNvbnN0IFdlYkNvcmU6OkZsb2F0U2l6ZSYgY292ZXJNdWx0aXBsaWVy
KTsKKworICAgIHZvaWQgdGlsZUJ1ZmZlclVwZGF0ZUNvbXBsZXRlKCk7CisKKyAgICBXZWJDb3Jl
OjpJbnRSZWN0IG1hcFRvQ29udGVudHMoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpIGNvbnN0Owor
ICAgIFdlYkNvcmU6OkludFJlY3QgbWFwRnJvbUNvbnRlbnRzKGNvbnN0IFdlYkNvcmU6OkludFJl
Y3QmKSBjb25zdDsKKworICAgIGJvb2wgaGFzUGVuZGluZ1VwZGF0ZXMoKSBjb25zdDsKKworcHJp
dmF0ZToKKyAgICBXZWJQYWdlUHJveHkqIHBhZ2UoKTsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHdl
YlZpZXdWaXNpYmxlUmVjdCgpOworICAgIHZvaWQgdXBkYXRlV2ViVmlldyhjb25zdCBWZWN0b3I8
V2ViQ29yZTo6SW50UmVjdD4mIHBhaW50ZWRBcmVhKTsKKworICAgIC8vIERyYXdpbmdBcmVhUHJv
eHkKKyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVjZWl2ZU1lc3NhZ2UoQ29yZUlQQzo6Q29ubmVjdGlv
biosIENvcmVJUEM6Ok1lc3NhZ2VJRCwgQ29yZUlQQzo6QXJndW1lbnREZWNvZGVyKik7CisgICAg
dmlydHVhbCB2b2lkIGRpZFJlY2VpdmVTeW5jTWVzc2FnZShDb3JlSVBDOjpDb25uZWN0aW9uKiwg
Q29yZUlQQzo6TWVzc2FnZUlELCBDb3JlSVBDOjpBcmd1bWVudERlY29kZXIqLCBDb3JlSVBDOjpB
cmd1bWVudEVuY29kZXImKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoY29uc3QgV2ViQ29yZTo6
SW50UmVjdCYsIFBsYXRmb3JtRHJhd2luZ0NvbnRleHQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRT
aXplKGNvbnN0IFdlYkNvcmU6OkludFNpemUmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGFnZUlz
VmlzaWJsZShib29sIGlzVmlzaWJsZSk7CisKKyAgICB2b2lkIGRpZFNldFNpemUoY29uc3QgV2Vi
Q29yZTo6SW50U2l6ZSYpOworICAgIHZvaWQgaW52YWxpZGF0ZShjb25zdCBXZWJDb3JlOjpJbnRS
ZWN0JiByZWN0KTsKKyAgICB2b2lkIGFkanVzdFZpc2libGVSZWN0KCk7CisKKyAgICB2b2lkIHJl
cXVlc3RUaWxlVXBkYXRlKGludCB0aWxlSUQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGRpcnR5
UmVjdCk7CisKKyAgICBQYXNzUmVmUHRyPFRpbGVkRHJhd2luZ0FyZWFUaWxlPiBjcmVhdGVUaWxl
KGNvbnN0IFRpbGVkRHJhd2luZ0FyZWFUaWxlOjpDb29yZGluYXRlJik7CisKKyAgICB2b2lkIHN0
YXJ0VGlsZUJ1ZmZlclVwZGF0ZVRpbWVyKCk7CisgICAgdm9pZCBzdGFydFRpbGVDcmVhdGlvblRp
bWVyKCk7CisKKyAgICB2b2lkIHRpbGVCdWZmZXJVcGRhdGVUaW1lckZpcmVkKCk7CisgICAgdm9p
ZCB0aWxlQ3JlYXRpb25UaW1lckZpcmVkKCk7CisKKyAgICB2b2lkIHVwZGF0ZVRpbGVCdWZmZXJz
KCk7CisgICAgdm9pZCBjcmVhdGVUaWxlcygpOworCisgICAgYm9vbCByZXNpemVFZGdlVGlsZXMo
KTsKKyAgICB2b2lkIGRyb3BUaWxlc091dHNpZGVSZWN0KGNvbnN0IFdlYkNvcmU6OkludFJlY3Qm
KTsKKworICAgIFBhc3NSZWZQdHI8VGlsZWREcmF3aW5nQXJlYVRpbGU+IHRpbGVBdChjb25zdCBU
aWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZSYpIGNvbnN0OworICAgIHZvaWQgc2V0VGls
ZShjb25zdCBUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZSYgY29vcmRpbmF0ZSwgUmVm
UHRyPFRpbGVkRHJhd2luZ0FyZWFUaWxlPiB0aWxlKTsKKyAgICB2b2lkIHJlbW92ZVRpbGUoY29u
c3QgVGlsZWREcmF3aW5nQXJlYVRpbGU6OkNvb3JkaW5hdGUmIGNvb3JkaW5hdGUpOworICAgIHZv
aWQgcmVtb3ZlQWxsVGlsZXMoKTsKKworICAgIFdlYkNvcmU6OkludFJlY3QgY29udGVudHNSZWN0
KCkgY29uc3Q7CisKKyAgICBXZWJDb3JlOjpJbnRSZWN0IGNhbGN1bGF0ZUtlZXBSZWN0KGNvbnN0
IFdlYkNvcmU6OkludFJlY3QmIHZpc2libGVSZWN0KSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRS
ZWN0IGNhbGN1bGF0ZUNvdmVyUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiB2aXNpYmxlUmVj
dCkgY29uc3Q7CisKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHRpbGVSZWN0Rm9yQ29vcmRpbmF0ZShj
b25zdCBUaWxlZERyYXdpbmdBcmVhVGlsZTo6Q29vcmRpbmF0ZSYpIGNvbnN0OworICAgIFRpbGVk
RHJhd2luZ0FyZWFUaWxlOjpDb29yZGluYXRlIHRpbGVDb29yZGluYXRlRm9yUG9pbnQoY29uc3Qg
V2ViQ29yZTo6SW50UG9pbnQmKSBjb25zdDsKKyAgICBkb3VibGUgdGlsZURpc3RhbmNlKGNvbnN0
IFdlYkNvcmU6OkludFJlY3QmIHZpZXdwb3J0LCBjb25zdCBUaWxlZERyYXdpbmdBcmVhVGlsZTo6
Q29vcmRpbmF0ZSYpOworCitwcml2YXRlOgorICAgIGJvb2wgbV9pc1dhaXRpbmdGb3JEaWRTZXRG
cmFtZU5vdGlmaWNhdGlvbjsKKyAgICBib29sIG1faXNWaXNpYmxlOworCisgICAgV2ViQ29yZTo6
SW50U2l6ZSBtX3ZpZXdTaXplOyAvLyBTaXplIG9mIHRoZSBCYWNraW5nU3RvcmUgYXMgd2VsbC4K
KyAgICBXZWJDb3JlOjpJbnRTaXplIG1fbGFzdFNldFZpZXdTaXplOworCisgICAgUGxhdGZvcm1X
ZWJWaWV3KiBtX3dlYlZpZXc7CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8VGlsZWREcmF3aW5nQXJl
YVRpbGU6OkNvb3JkaW5hdGUsIFJlZlB0cjxUaWxlZERyYXdpbmdBcmVhVGlsZT4gPiBUaWxlTWFw
OworICAgIFRpbGVNYXAgbV90aWxlczsKKworICAgIFdURjo6SGFzaE1hcDxpbnQsIFRpbGVkRHJh
d2luZ0FyZWFUaWxlKj4gbV90aWxlc0J5SUQ7CisKKyAgICB0eXBlZGVmIFJ1bkxvb3A6OlRpbWVy
PFRpbGVkRHJhd2luZ0FyZWFQcm94eT4gVGlsZVRpbWVyOworICAgIFRpbGVUaW1lciBtX3RpbGVC
dWZmZXJVcGRhdGVUaW1lcjsKKyAgICBUaWxlVGltZXIgbV90aWxlQ3JlYXRpb25UaW1lcjsKKwor
ICAgIFdlYkNvcmU6OkludFNpemUgbV90aWxlU2l6ZTsKKyAgICBkb3VibGUgbV90aWxlQ3JlYXRp
b25EZWxheTsKKyAgICBXZWJDb3JlOjpGbG9hdFNpemUgbV9rZWVwQXJlYU11bHRpcGxpZXI7Cisg
ICAgV2ViQ29yZTo6RmxvYXRTaXplIG1fY292ZXJBcmVhTXVsdGlwbGllcjsKKworICAgIFdlYkNv
cmU6OkludFJlY3QgbV9wcmV2aW91c1Zpc2libGVSZWN0OworICAgIGZsb2F0IG1fY29udGVudHNT
Y2FsZTsKKworICAgIGZyaWVuZCBjbGFzcyBUaWxlZERyYXdpbmdBcmVhVGlsZTsKK307CisKK30g
Ly8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gVElMRURfQkFDS0lOR19TVE9SRQorCisj
ZW5kaWYgLy8gVGlsZWREcmF3aW5nQXJlYVByb3h5X2gKZGlmZiAtLWdpdCBhL1dlYktpdDIvVUlQ
cm9jZXNzL1RpbGVkRHJhd2luZ0FyZWFUaWxlLmggYi9XZWJLaXQyL1VJUHJvY2Vzcy9UaWxlZERy
YXdpbmdBcmVhVGlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDE0
NjEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQyL1VJUHJvY2Vzcy9UaWxlZERyYXdpbmdBcmVh
VGlsZS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEg
Q29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5k
ZWYgVGlsZWREcmF3aW5nQXJlYVRpbGVfaAorI2RlZmluZSBUaWxlZERyYXdpbmdBcmVhVGlsZV9o
CisKKyNpbmNsdWRlICJJbnRQb2ludC5oIgorI2luY2x1ZGUgIkludFBvaW50SGFzaC5oIgorI2lu
Y2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRl
IDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisKKyNpZiBQ
TEFURk9STShRVCkKKyNpbmNsdWRlIDxRUGl4bWFwPgorI2luY2x1ZGUgPFFSZWdpb24+CisjZW5k
aWYKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFRpbGVkRHJhd2luZ0FyZWFQcm94eTsK
K2NsYXNzIFVwZGF0ZUNodW5rOworCitjbGFzcyBUaWxlZERyYXdpbmdBcmVhVGlsZSA6IHB1Ymxp
YyBSZWZDb3VudGVkPFRpbGVkRHJhd2luZ0FyZWFUaWxlPiB7CitwdWJsaWM6CisgICAgdHlwZWRl
ZiBXZWJDb3JlOjpJbnRQb2ludCBDb29yZGluYXRlOworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8
VGlsZWREcmF3aW5nQXJlYVRpbGU+IGNyZWF0ZShUaWxlZERyYXdpbmdBcmVhUHJveHkqIHByb3h5
LCBjb25zdCBDb29yZGluYXRlJiB0aWxlQ29vcmRpbmF0ZSkgeyByZXR1cm4gYWRvcHRSZWYobmV3
IFRpbGVkRHJhd2luZ0FyZWFUaWxlKHByb3h5LCB0aWxlQ29vcmRpbmF0ZSkpOyB9CisgICAgflRp
bGVkRHJhd2luZ0FyZWFUaWxlKCk7CisKKyAgICBib29sIGlzRGlydHkoKSBjb25zdDsKKyAgICB2
b2lkIGludmFsaWRhdGUoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpOworICAgIHZvaWQgdXBkYXRl
QmFja0J1ZmZlcigpOworICAgIGJvb2wgaGFzUmVhZHlCYWNrQnVmZmVyKCkgY29uc3Q7CisgICAg
dm9pZCBzd2FwQmFja0J1ZmZlclRvRnJvbnQoKTsKKyAgICBib29sIGlzUmVhZHlUb1BhaW50KCkg
Y29uc3Q7CisgICAgdm9pZCBwYWludChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQqLCBjb25zdCBX
ZWJDb3JlOjpJbnRSZWN0Jik7CisgICAgYm9vbCBoYXNCYWNrQnVmZmVyVXBkYXRlUGVuZGluZygp
IGNvbnN0IHsgcmV0dXJuIG1faGFzVXBkYXRlUGVuZGluZzsgfQorCisgICAgY29uc3QgVGlsZWRE
cmF3aW5nQXJlYVRpbGU6OkNvb3JkaW5hdGUmIGNvb3JkaW5hdGUoKSBjb25zdCB7IHJldHVybiBt
X2Nvb3JkaW5hdGU7IH0KKyAgICBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0KCkgY29uc3Qg
eyByZXR1cm4gbV9yZWN0OyB9CisgICAgdm9pZCByZXNpemUoY29uc3QgV2ViQ29yZTo6SW50U2l6
ZSYpOworCisgICAgdm9pZCB1cGRhdGVGcm9tQ2h1bmsoVXBkYXRlQ2h1bmsqIHVwZGF0ZUNodW5r
LCBmbG9hdCk7CisKKyAgICBzdGF0aWMgdm9pZCBwYWludENoZWNrZXJQYXR0ZXJuKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dCosIGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYpOworCisgICAgaW50
IElEKCkgY29uc3QgeyByZXR1cm4gbV9JRDsgfQorCitwcml2YXRlOgorICAgIFRpbGVkRHJhd2lu
Z0FyZWFUaWxlKFRpbGVkRHJhd2luZ0FyZWFQcm94eSogcHJveHksIGNvbnN0IFRpbGVkRHJhd2lu
Z0FyZWFUaWxlOjpDb29yZGluYXRlJiB0aWxlQ29vcmRpbmF0ZSk7CisKKyAgICBUaWxlZERyYXdp
bmdBcmVhUHJveHkqIG1fcHJveHk7CisgICAgQ29vcmRpbmF0ZSBtX2Nvb3JkaW5hdGU7CisgICAg
V2ViQ29yZTo6SW50UmVjdCBtX3JlY3Q7CisKKyAgICBpbnQgbV9JRDsKKyAgICBib29sIG1faGFz
VXBkYXRlUGVuZGluZzsKKworI2lmIFBMQVRGT1JNKFFUKQorICAgIFFQaXhtYXAgbV9idWZmZXI7
CisgICAgUVBpeG1hcCBtX2JhY2tCdWZmZXI7CisgICAgUVJlZ2lvbiBtX2RpcnR5UmVnaW9uOwor
I2VuZGlmCit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViS2l0Mi9VSVByb2Nlc3Mv
cXQvVGlsZWREcmF3aW5nQXJlYVByb3h5UXQuY3BwIGIvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvVGls
ZWREcmF3aW5nQXJlYVByb3h5UXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLmY5NDcxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9UaWxl
ZERyYXdpbmdBcmVhUHJveHlRdC5jcHAKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykK
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgIlRpbGVkRHJhd2luZ0FyZWFQcm94eS5oIgorCisjaW5jbHVk
ZSAiRHJhd2luZ0FyZWFNZXNzYWdlS2luZHMuaCIKKyNpbmNsdWRlICJEcmF3aW5nQXJlYVByb3h5
TWVzc2FnZUtpbmRzLmgiCisjaW5jbHVkZSAiVXBkYXRlQ2h1bmsuaCIKKyNpbmNsdWRlICJXS0FQ
SUNhc3QuaCIKKyNpbmNsdWRlICJXZWJQYWdlUHJveHkuaCIKKworI2luY2x1ZGUgInFncmFwaGlj
c3drdmlldy5oIgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworI2RlZmluZSBUSUxFX0RF
QlVHX0xPRworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBUaWxlZERyYXdpbmdBcmVhUHJv
eHk6OnVwZGF0ZVdlYlZpZXcoY29uc3QgVmVjdG9yPEludFJlY3Q+JiBwYWludGVkQXJlYSkKK3sK
KyAgICBpZiAoIXBhZ2UoKSB8fCAhcGFnZSgpLT5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIHVuc2lnbmVkIHNpemUgPSBwYWludGVkQXJlYS5zaXplKCk7CisgICAgZm9yICh1bnNp
Z25lZCBuID0gMDsgbiA8IHNpemU7ICsrbikKKyAgICAgICAgbV93ZWJWaWV3LT51cGRhdGUoUVJl
Y3QocGFpbnRlZEFyZWFbbl0pKTsKK30KKworSW50UmVjdCBUaWxlZERyYXdpbmdBcmVhUHJveHk6
OndlYlZpZXdWaXNpYmxlUmVjdCgpCit7CisgICAgcmV0dXJuIGVuY2xvc2luZ0ludFJlY3QoRmxv
YXRSZWN0KG1fd2ViVmlldy0+dmlzaWJsZVJlY3QoKSkpOworfQorCitXZWJQYWdlUHJveHkqIFRp
bGVkRHJhd2luZ0FyZWFQcm94eTo6cGFnZSgpCit7CisgICAgcmV0dXJuIHRvSW1wbChtX3dlYlZp
ZXctPnBhZ2UoKS0+cGFnZVJlZigpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYg
LS1naXQgYS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9UaWxlZERyYXdpbmdBcmVhVGlsZVF0LmNwcCBi
L1dlYktpdDIvVUlQcm9jZXNzL3F0L1RpbGVkRHJhd2luZ0FyZWFUaWxlUXQuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2U2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJLaXQyL1VJUHJvY2Vzcy9xdC9UaWxlZERyYXdpbmdBcmVhVGlsZVF0LmNwcApAQCAtMCwwICsx
LDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQv
b3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisg
KiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICog
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlRpbGVkRHJhd2lu
Z0FyZWFUaWxlLmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJU
aWxlZERyYXdpbmdBcmVhUHJveHkuaCIKKyNpbmNsdWRlICJXZWJQYWdlUHJveHkuaCIKKyNpbmNs
dWRlICJXZWJQcm9jZXNzUHJveHkuaCIKKyNpbmNsdWRlICJVcGRhdGVDaHVuay5oIgorI2luY2x1
ZGUgPFFBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRT2JqZWN0PgorI2luY2x1ZGUgPFFQYWludGVy
PgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3N0
YXRpYyBjb25zdCB1bnNpZ25lZCBjaGVja2VyU2l6ZSA9IDE2Oworc3RhdGljIGNvbnN0IHVuc2ln
bmVkIGNoZWNrZXJDb2xvcjEgPSAweGZmNTU1NTU1Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNo
ZWNrZXJDb2xvcjIgPSAweGZmYWFhYWFhOworCitzdGF0aWMgUVBpeG1hcCYgY2hlY2tlcmVkUGl4
bWFwKCkKK3sKKyAgICBzdGF0aWMgUVBpeG1hcCogcGl4bWFwOworICAgIGlmICghcGl4bWFwKSB7
CisgICAgICAgIHBpeG1hcCA9IG5ldyBRUGl4bWFwKGNoZWNrZXJTaXplLCBjaGVja2VyU2l6ZSk7
CisgICAgICAgIFFQYWludGVyIHBhaW50ZXIocGl4bWFwKTsKKyAgICAgICAgUUNvbG9yIGNvbG9y
MShjaGVja2VyQ29sb3IxKTsKKyAgICAgICAgUUNvbG9yIGNvbG9yMihjaGVja2VyQ29sb3IyKTsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCB5ID0gMDsgeSA8IGNoZWNrZXJTaXplOyB5ICs9IGNoZWNr
ZXJTaXplIC8gMikgeworICAgICAgICAgICAgYm9vbCBhbHRlcm5hdGUgPSB5ICUgY2hlY2tlclNp
emU7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgY2hlY2tlclNpemU7IHgg
Kz0gY2hlY2tlclNpemUgLyAyKSB7CisgICAgICAgICAgICAgICAgcGFpbnRlci5maWxsUmVjdCh4
LCB5LCBjaGVja2VyU2l6ZSAvIDIsIGNoZWNrZXJTaXplIC8gMiwgYWx0ZXJuYXRlID8gY29sb3Ix
IDogY29sb3IyKTsKKyAgICAgICAgICAgICAgICBhbHRlcm5hdGUgPSAhYWx0ZXJuYXRlOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAqcGl4bWFwOworfQorCitU
aWxlZERyYXdpbmdBcmVhVGlsZTo6VGlsZWREcmF3aW5nQXJlYVRpbGUoVGlsZWREcmF3aW5nQXJl
YVByb3h5KiBwcm94eSwgY29uc3QgQ29vcmRpbmF0ZSYgdGlsZUNvb3JkaW5hdGUpCisgICAgOiBt
X3Byb3h5KHByb3h5KQorICAgICwgbV9jb29yZGluYXRlKHRpbGVDb29yZGluYXRlKQorICAgICwg
bV9yZWN0KHByb3h5LT50aWxlUmVjdEZvckNvb3JkaW5hdGUodGlsZUNvb3JkaW5hdGUpKQorICAg
ICwgbV9oYXNVcGRhdGVQZW5kaW5nKGZhbHNlKQorICAgICwgbV9kaXJ0eVJlZ2lvbihtX3JlY3Qp
Cit7CisgICAgc3RhdGljIGludCBpZCA9IDA7CisgICAgbV9JRCA9ICsraWQ7CisjaWZkZWYgVElM
RV9ERUJVR19MT0cKKyAgICBxRGVidWcoKSA8PCAiZGVsZXRpbmcgdGlsZSBpZD0iIDw8IG1fSUQ7
CisjZW5kaWYKK30KKworVGlsZWREcmF3aW5nQXJlYVRpbGU6On5UaWxlZERyYXdpbmdBcmVhVGls
ZSgpCit7CisjaWZkZWYgVElMRV9ERUJVR19MT0cKKyAgICBxRGVidWcoKSA8PCAiZGVsZXRpbmcg
dGlsZSBpZD0iIDw8IG1fSUQ7CisjZW5kaWYKK30KKworYm9vbCBUaWxlZERyYXdpbmdBcmVhVGls
ZTo6aXNEaXJ0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFtX2RpcnR5UmVnaW9uLmlzRW1wdHko
KTsKK30KKworYm9vbCBUaWxlZERyYXdpbmdBcmVhVGlsZTo6aXNSZWFkeVRvUGFpbnQoKSBjb25z
dAoreworICAgIHJldHVybiAhbV9idWZmZXIuaXNOdWxsKCk7Cit9CisKK2Jvb2wgVGlsZWREcmF3
aW5nQXJlYVRpbGU6Omhhc1JlYWR5QmFja0J1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuICFt
X2JhY2tCdWZmZXIuaXNOdWxsKCkgJiYgIW1faGFzVXBkYXRlUGVuZGluZzsKK30KKwordm9pZCBU
aWxlZERyYXdpbmdBcmVhVGlsZTo6aW52YWxpZGF0ZShjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3Qp
Cit7CisgICAgSW50UmVjdCB0aWxlRGlydHlSZWN0ID0gaW50ZXJzZWN0aW9uKGRpcnR5UmVjdCwg
bV9yZWN0KTsKKyAgICBpZiAodGlsZURpcnR5UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIG1fZGlydHlSZWdpb24gKz0gdGlsZURpcnR5UmVjdDsKK30KKwordm9pZCBUaWxl
ZERyYXdpbmdBcmVhVGlsZTo6cmVzaXplKGNvbnN0IEludFNpemUmIG5ld1NpemUpCit7CisgICAg
SW50UmVjdCBvbGRSZWN0ID0gbV9yZWN0OworICAgIG1fcmVjdCA9IEludFJlY3QobV9yZWN0LnRv
cExlZnQoKSwgbmV3U2l6ZSk7CisgICAgaWYgKG1fcmVjdC5yaWdodCgpID4gb2xkUmVjdC5yaWdo
dCgpKQorICAgICAgICBpbnZhbGlkYXRlKEludFJlY3Qob2xkUmVjdC5yaWdodCgpLCBvbGRSZWN0
LnkoKSwgbV9yZWN0LnJpZ2h0KCkgLSBvbGRSZWN0LnJpZ2h0KCksIG1fcmVjdC5oZWlnaHQoKSkp
OworICAgIGlmIChtX3JlY3QuYm90dG9tKCkgPiBvbGRSZWN0LmJvdHRvbSgpKQorICAgICAgICBp
bnZhbGlkYXRlKEludFJlY3Qob2xkUmVjdC54KCksIG9sZFJlY3QuYm90dG9tKCksIG1fcmVjdC53
aWR0aCgpLCBtX3JlY3QuYm90dG9tKCkgLSBvbGRSZWN0LmJvdHRvbSgpKSk7Cit9CisKK3ZvaWQg
VGlsZWREcmF3aW5nQXJlYVRpbGU6OnN3YXBCYWNrQnVmZmVyVG9Gcm9udCgpCit7CisgICAgQVNT
RVJUKCFtX2JhY2tCdWZmZXIuaXNOdWxsKCkpOworCisgICAgbV9idWZmZXIgPSBtX2JhY2tCdWZm
ZXI7CisgICAgbV9iYWNrQnVmZmVyID0gUVBpeG1hcCgpOworfQorCit2b2lkIFRpbGVkRHJhd2lu
Z0FyZWFUaWxlOjpwYWludChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisgICAgQVNTRVJUKCFtX2J1ZmZlci5pc051bGwoKSk7CisKKyAgICBJbnRSZWN0
IHRhcmdldCA9IGludGVyc2VjdGlvbihyZWN0LCBtX3JlY3QpOworICAgIEludFJlY3Qgc291cmNl
KCh0YXJnZXQueCgpIC0gbV9yZWN0LngoKSksCisgICAgICAgICAgICAgICAgICAgKHRhcmdldC55
KCkgLSBtX3JlY3QueSgpKSwKKyAgICAgICAgICAgICAgICAgICB0YXJnZXQud2lkdGgoKSwKKyAg
ICAgICAgICAgICAgICAgICB0YXJnZXQuaGVpZ2h0KCkpOworCisgICAgY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCktPmRyYXdQaXhtYXAodGFyZ2V0LCBtX2J1ZmZlciwgc291cmNlKTsKK30KKwor
dm9pZCBUaWxlZERyYXdpbmdBcmVhVGlsZTo6cGFpbnRDaGVja2VyUGF0dGVybihHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgdGFyZ2V0KQoreworICAgIFFQYWludGVy
KiBwYWludGVyID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgUVRyYW5zZm9ybSB3
b3JsZFRyYW5zZm9ybSA9IHBhaW50ZXItPndvcmxkVHJhbnNmb3JtKCk7CisgICAgcXJlYWwgc2Nh
bGVYID0gd29ybGRUcmFuc2Zvcm0ubTExKCk7CisgICAgcXJlYWwgc2NhbGVZID0gd29ybGRUcmFu
c2Zvcm0ubTIyKCk7CisKKyAgICBRUmVjdCB0YXJnZXRWaWV3UmVjdCA9IFFSZWN0Rih0YXJnZXQu
eCgpICogc2NhbGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC55
KCkgKiBzY2FsZVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lndp
ZHRoKCkgKiBzY2FsZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0
LmhlaWdodCgpICogc2NhbGVZKS50b0FsaWduZWRSZWN0KCk7CisKKyAgICBRVHJhbnNmb3JtIGFk
anVzdGVkVHJhbnNmb3JtKDEuLCB3b3JsZFRyYW5zZm9ybS5tMTIoKSwgd29ybGRUcmFuc2Zvcm0u
bTEzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZFRyYW5zZm9ybS5t
MjEoKSwgMS4sIHdvcmxkVHJhbnNmb3JtLm0yMygpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgd29ybGRUcmFuc2Zvcm0ubTMxKCksIHdvcmxkVHJhbnNmb3JtLm0zMigpLCB3b3Js
ZFRyYW5zZm9ybS5tMzMoKSk7CisgICAgcGFpbnRlci0+c2V0V29ybGRUcmFuc2Zvcm0oYWRqdXN0
ZWRUcmFuc2Zvcm0pOworCisgICAgcGFpbnRlci0+ZHJhd1RpbGVkUGl4bWFwKHRhcmdldFZpZXdS
ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyZWRQaXhtYXAoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBvaW50KHRhcmdldFZpZXdSZWN0LmxlZnQoKSAl
IGNoZWNrZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0
Vmlld1JlY3QudG9wKCkgJSBjaGVja2VyU2l6ZSkpOworCisgICAgcGFpbnRlci0+c2V0V29ybGRU
cmFuc2Zvcm0od29ybGRUcmFuc2Zvcm0pOworfQorCit2b2lkIFRpbGVkRHJhd2luZ0FyZWFUaWxl
Ojp1cGRhdGVGcm9tQ2h1bmsoVXBkYXRlQ2h1bmsqIHVwZGF0ZUNodW5rLCBmbG9hdCkKK3sKKyAg
ICBRSW1hZ2UgaW1hZ2UodXBkYXRlQ2h1bmstPmNyZWF0ZUltYWdlKCkpOworICAgIGNvbnN0IElu
dFJlY3QmIHVwZGF0ZUNodW5rUmVjdCA9IHVwZGF0ZUNodW5rLT5yZWN0KCk7CisKKyNpZmRlZiBU
SUxFX0RFQlVHX0xPRworICAgIHFEZWJ1ZygpIDw8ICJ0aWxlIHVwZGF0ZWQgaWQ9IiA8PCBJRCgp
IDw8ICIgcmVjdD0iIDw8IFFSZWN0KHVwZGF0ZUNodW5rUmVjdCk7CisjZW5kaWYKKyAgICBpZiAo
dXBkYXRlQ2h1bmtSZWN0LnNpemUoKSA9PSBtX3Byb3h5LT50aWxlU2l6ZSgpKQorICAgICAgICBt
X2JhY2tCdWZmZXIgPSBRUGl4bWFwKFFQaXhtYXA6OmZyb21JbWFnZShpbWFnZSkpOworICAgIGVs
c2UgeworICAgICAgICBpZiAobV9iYWNrQnVmZmVyLmlzTnVsbCgpKQorICAgICAgICAgICAgbV9i
YWNrQnVmZmVyID0gbV9idWZmZXIuaXNOdWxsKCkgPyBRUGl4bWFwKG1fcHJveHktPnRpbGVTaXpl
KCkpIDogbV9idWZmZXI7CisgICAgICAgIFFQYWludGVyIHBhaW50ZXIoJm1fYmFja0J1ZmZlcik7
CisgICAgICAgIEludFNpemUgZHJhd1BvaW50ID0gdXBkYXRlQ2h1bmtSZWN0LnRvcExlZnQoKSAt
IG1fcmVjdC50b3BMZWZ0KCk7CisgICAgICAgIHBhaW50ZXIuZHJhd0ltYWdlKFFQb2ludChkcmF3
UG9pbnQud2lkdGgoKSwgZHJhd1BvaW50LmhlaWdodCgpKSwgaW1hZ2UpOworICAgIH0KKyAgICBt
X2hhc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhVGls
ZTo6dXBkYXRlQmFja0J1ZmZlcigpCit7CisgICAgaWYgKGlzUmVhZHlUb1BhaW50KCkgJiYgIWlz
RGlydHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUU6IGluZGl2aWR1YWwgcmVj
dHMKKyAgICBJbnRSZWN0IGRpcnR5UmVjdCA9IG1fZGlydHlSZWdpb24uYm91bmRpbmdSZWN0KCk7
CisgICAgbV9kaXJ0eVJlZ2lvbiA9IFFSZWdpb24oKTsKKworI2lmZGVmIFRJTEVfREVCVUdfTE9H
CisgICAgcURlYnVnKCkgPDwgInJlcXVlc3RpbmcgdGlsZSB1cGRhdGUgaWQ9IiA8PCBtX0lEIDw8
ICIgcmVjdD0iIDw8IFFSZWN0KGRpcnR5UmVjdCkgPDwgIiBzY2FsZT0iIDw8IG1fcHJveHktPmNv
bnRlbnRzU2NhbGUoKTsKKyNlbmRpZgorICAgIGlmICghbV9wcm94eS0+cGFnZSgpLT5wcm9jZXNz
KCktPmlzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fcHJveHktPnJlcXVlc3RUaWxl
VXBkYXRlKG1fSUQsIGRpcnR5UmVjdCk7CisKKyAgICBtX2hhc1VwZGF0ZVBlbmRpbmcgPSB0cnVl
OworfQorCit9CmRpZmYgLS1naXQgYS9XZWJLaXQyL1dlYktpdDIucHJvIGIvV2ViS2l0Mi9XZWJL
aXQyLnBybwppbmRleCA4MWMxMmFkLi5mY2E4ZjA2IDEwMDY0NAotLS0gYS9XZWJLaXQyL1dlYktp
dDIucHJvCisrKyBiL1dlYktpdDIvV2ViS2l0Mi5wcm8KQEAgLTI4NCw2ICsyODQsNyBAQCBIRUFE
RVJTICs9IFwKICAgICBVSVByb2Nlc3MvUGx1Z2lucy9QbHVnaW5JbmZvU3RvcmUuaCBcCiAgICAg
VUlQcm9jZXNzL1Byb2Nlc3NNb2RlbC5oIFwKICAgICBVSVByb2Nlc3MvUmVzcG9uc2l2ZW5lc3NU
aW1lci5oIFwKKyAgICBVSVByb2Nlc3MvVGlsZWREcmF3aW5nQXJlYVByb3h5LmggXAogICAgIFVJ
UHJvY2Vzcy9WaXNpdGVkTGlua1Byb3ZpZGVyLmggXAogICAgIFVJUHJvY2Vzcy9XZWJDb250ZXh0
LmggXAogICAgIFVJUHJvY2Vzcy9XZWJDb250ZXh0SW5qZWN0ZWRCdW5kbGVDbGllbnQuaCBcCkBA
IC00NTQsNiArNDU1LDcgQEAgU09VUkNFUyArPSBcCiAgICAgVUlQcm9jZXNzL1BsdWdpbnMvUGx1
Z2luSW5mb1N0b3JlLmNwcCBcCiAgICAgVUlQcm9jZXNzL1BsdWdpbnMvcXQvUGx1Z2luSW5mb1N0
b3JlUXQuY3BwIFwKICAgICBVSVByb2Nlc3MvUmVzcG9uc2l2ZW5lc3NUaW1lci5jcHAgXAorICAg
IFVJUHJvY2Vzcy9UaWxlZERyYXdpbmdBcmVhUHJveHkuY3BwIFwKICAgICBVSVByb2Nlc3MvVmlz
aXRlZExpbmtQcm92aWRlci5jcHAgXAogICAgIFVJUHJvY2Vzcy9XZWJCYWNrRm9yd2FyZExpc3Qu
Y3BwIFwKICAgICBVSVByb2Nlc3MvV2ViQmFja0ZvcndhcmRMaXN0SXRlbS5jcHAgXApAQCAtNDgw
LDYgKzQ4Miw4IEBAIFNPVVJDRVMgKz0gXAogICAgIFVJUHJvY2Vzcy9XZWJQcm9jZXNzUHJveHku
Y3BwIFwKICAgICBVSVByb2Nlc3MvV2ViVUlDbGllbnQuY3BwIFwKICAgICBVSVByb2Nlc3MvcXQv
Q2h1bmtlZFVwZGF0ZURyYXdpbmdBcmVhUHJveHlRdC5jcHAgXAorICAgIFVJUHJvY2Vzcy9xdC9U
aWxlZERyYXdpbmdBcmVhUHJveHlRdC5jcHAgXAorICAgIFVJUHJvY2Vzcy9xdC9UaWxlZERyYXdp
bmdBcmVhVGlsZVF0LmNwcCBcCiAgICAgVUlQcm9jZXNzL3F0L1dlYkNvbnRleHRNZW51UHJveHlR
dC5jcHAgXAogICAgIFVJUHJvY2Vzcy9xdC9XZWJDb250ZXh0UXQuY3BwIFwKICAgICBVSVByb2Nl
c3MvcXQvV2ViSW5zcGVjdG9yUHJveHlRdC5jcHAgXApAQCAtNTM5LDYgKzU0Myw3IEBAIFNPVVJD
RVMgKz0gXAogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9EcmF3aW5nQXJlYS5jcHAgXAogICAgIFdl
YlByb2Nlc3MvV2ViUGFnZS9GaW5kQ29udHJvbGxlci5jcHAgXAogICAgIFdlYlByb2Nlc3MvV2Vi
UGFnZS9QYWdlT3ZlcmxheS5jcHAgXAorICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9UaWxlZERyYXdp
bmdBcmVhLmNwcCBcCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkJhY2tGb3J3YXJkTGlzdFBy
b3h5LmNwcCBcCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkNvbnRleHRNZW51LmNwcCBcCiAg
ICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkVkaXRDb21tYW5kLmNwcCBcCkBAIC01NDcsNiArNTUy
LDcgQEAgU09VUkNFUyArPSBcCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL3F0L1dlYkluc3BlY3Rv
clF0LmNwcCBcCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3BwIFwKICAgICBXZWJQ
cm9jZXNzL1dlYlBhZ2UvcXQvQ2h1bmtlZFVwZGF0ZURyYXdpbmdBcmVhUXQuY3BwIFwKKyAgICBX
ZWJQcm9jZXNzL1dlYlBhZ2UvcXQvVGlsZWREcmF3aW5nQXJlYVF0LmNwcCBcCiAgICAgV2ViUHJv
Y2Vzcy9XZWJQYWdlL3F0L1dlYlBhZ2VRdC5jcHAgXAogICAgIFdlYlByb2Nlc3MvV2ViUHJvY2Vz
cy5jcHAgXAogICAgIFdlYlByb2Nlc3MvcXQvV2ViUHJvY2Vzc01haW5RdC5jcHAgXApkaWZmIC0t
Z2l0IGEvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvRHJhd2luZ0FyZWEuY3BwIGIvV2ViS2l0
Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvRHJhd2luZ0FyZWEuY3BwCmluZGV4IDI3MzEyNmIuLjBmOWI2
YWUgMTAwNjQ0Ci0tLSBhL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL0RyYXdpbmdBcmVhLmNw
cAorKysgYi9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9EcmF3aW5nQXJlYS5jcHAKQEAgLTMx
LDYgKzMxLDEwIEBACiAjaW5jbHVkZSAiTGF5ZXJCYWNrZWREcmF3aW5nQXJlYS5oIgogI2VuZGlm
CiAKKyNpZiBFTkFCTEUoVElMRURfQkFDS0lOR19TVE9SRSkKKyNpbmNsdWRlICJUaWxlZERyYXdp
bmdBcmVhLmgiCisjZW5kaWYKKwogbmFtZXNwYWNlIFdlYktpdCB7CiAKIFBhc3NSZWZQdHI8RHJh
d2luZ0FyZWE+IERyYXdpbmdBcmVhOjpjcmVhdGUoVHlwZSB0eXBlLCBEcmF3aW5nQXJlYUlEIGlk
ZW50aWZpZXIsIFdlYlBhZ2UqIHdlYlBhZ2UpCkBAIC00Nyw2ICs1MSwxMCBAQCBQYXNzUmVmUHRy
PERyYXdpbmdBcmVhPiBEcmF3aW5nQXJlYTo6Y3JlYXRlKFR5cGUgdHlwZSwgRHJhd2luZ0FyZWFJ
RCBpZGVudGlmaWVyLAogICAgICAgICBjYXNlIExheWVyQmFja2VkRHJhd2luZ0FyZWFUeXBlOgog
ICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBMYXllckJhY2tlZERyYXdpbmdBcmVhKGlk
ZW50aWZpZXIsIHdlYlBhZ2UpKTsKICNlbmRpZgorI2lmIEVOQUJMRShUSUxFRF9CQUNLSU5HX1NU
T1JFKQorICAgICAgICBjYXNlIFRpbGVkRHJhd2luZ0FyZWFUeXBlOgorICAgICAgICAgICAgcmV0
dXJuIGFkb3B0UmVmKG5ldyBUaWxlZERyYXdpbmdBcmVhKGlkZW50aWZpZXIsIHdlYlBhZ2UpKTsK
KyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvV2ViS2l0Mi9XZWJQ
cm9jZXNzL1dlYlBhZ2UvVGlsZWREcmF3aW5nQXJlYS5jcHAgYi9XZWJLaXQyL1dlYlByb2Nlc3Mv
V2ViUGFnZS9UaWxlZERyYXdpbmdBcmVhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi45N2UzNDFlCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0Mi9XZWJQcm9jZXNzL1dl
YlBhZ2UvVGlsZWREcmF3aW5nQXJlYS5jcHAKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1p
ZXMpCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZiBFTkFCTEUoVElMRURfQkFDS0lOR19TVE9SRSkKKworI2luY2x1
ZGUgIlRpbGVkRHJhd2luZ0FyZWEuaCIKKworI2luY2x1ZGUgIkRyYXdpbmdBcmVhTWVzc2FnZUtp
bmRzLmgiCisjaW5jbHVkZSAiRHJhd2luZ0FyZWFQcm94eU1lc3NhZ2VLaW5kcy5oIgorI2luY2x1
ZGUgIk1lc3NhZ2VJRC5oIgorI2luY2x1ZGUgIlVwZGF0ZUNodW5rLmgiCisjaW5jbHVkZSAiV2Vi
Q29yZS9GcmFtZS5oIgorI2luY2x1ZGUgIldlYkNvcmUvRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAi
V2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgiCisjaW5jbHVkZSAiV2ViRnJhbWUuaCIKKyNpbmNsdWRl
ICJXZWJQYWdlLmgiCisjaW5jbHVkZSAiV2ViUHJvY2Vzcy5oIgorCit1c2luZyBuYW1lc3BhY2Ug
V2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1RpbGVkRHJhd2luZ0FyZWE6OlRpbGVk
RHJhd2luZ0FyZWEoRHJhd2luZ0FyZWFJRCBpZGVudGlmaWVyLCBXZWJQYWdlKiB3ZWJQYWdlKQor
ICAgIDogRHJhd2luZ0FyZWEoVGlsZWREcmF3aW5nQXJlYVR5cGUsIGlkZW50aWZpZXIsIHdlYlBh
Z2UpCisgICAgLCBtX2lzV2FpdGluZ0ZvclVwZGF0ZShmYWxzZSkKKyAgICAsIG1fc2hvdWxkUGFp
bnQodHJ1ZSkKKyAgICAsIG1fZGlzcGxheVRpbWVyKFdlYlByb2Nlc3M6OnNoYXJlZCgpLnJ1bkxv
b3AoKSwgdGhpcywgJlRpbGVkRHJhd2luZ0FyZWE6OmRpc3BsYXkpCisgICAgLCBtX3RpbGVVcGRh
dGVUaW1lcihXZWJQcm9jZXNzOjpzaGFyZWQoKS5ydW5Mb29wKCksIHRoaXMsICZUaWxlZERyYXdp
bmdBcmVhOjp0aWxlVXBkYXRlVGltZXJGaXJlZCkKK3sKK30KKworVGlsZWREcmF3aW5nQXJlYTo6
flRpbGVkRHJhd2luZ0FyZWEoKQoreworfQorCit2b2lkIFRpbGVkRHJhd2luZ0FyZWE6OmludmFs
aWRhdGVXaW5kb3coY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBpbW1lZGlhdGUpCit7Cit9CisK
K3ZvaWQgVGlsZWREcmF3aW5nQXJlYTo6aW52YWxpZGF0ZUNvbnRlbnRzQW5kV2luZG93KGNvbnN0
IEludFJlY3QmIHJlY3QsIGJvb2wgaW1tZWRpYXRlKQoreworICAgIHNldE5lZWRzRGlzcGxheShy
ZWN0KTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhOjppbnZhbGlkYXRlQ29udGVudHNGb3JT
bG93U2Nyb2xsKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgaW1tZWRpYXRlKQoreworICAgIHNl
dE5lZWRzRGlzcGxheShyZWN0KTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhOjpzY3JvbGwo
Y29uc3QgSW50U2l6ZSYgc2Nyb2xsRGVsdGEsIGNvbnN0IEludFJlY3QmIHJlY3RUb1Njcm9sbCwg
Y29uc3QgSW50UmVjdCYgY2xpcFJlY3QpCit7CisgICAgLy8gRklYTUU6IERvIHNvbWV0aGluZyBt
dWNoIHNtYXJ0ZXIuCisgICAgc2V0TmVlZHNEaXNwbGF5KHJlY3RUb1Njcm9sbCk7Cit9CisKK3Zv
aWQgVGlsZWREcmF3aW5nQXJlYTo6c2V0TmVlZHNEaXNwbGF5KGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisgICAgLy8gRklYTUU6IENvbGxlY3QgYSBzZXQgb2YgcmVjdHMvcmVnaW9uIGluc3RlYWQg
b2YganVzdCB0aGUgdW5pb24gb2YgYWxsIHJlY3RzLgorICAgIG1fZGlydHlSZWN0LnVuaXRlKHJl
Y3QpOworICAgIHNjaGVkdWxlRGlzcGxheSgpOworfQorCit2b2lkIFRpbGVkRHJhd2luZ0FyZWE6
OmRpc3BsYXkoKQoreworICAgIGlmICghbV9zaG91bGRQYWludCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKG1fZGlydHlSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gTGF5b3V0IGlmIG5lY2Vzc2FyeS4KKyAgICBtX3dlYlBhZ2UtPmxheW91dElmTmVlZGVkKCk7
CisKKyAgICBJbnRSZWN0IGRpcnR5UmVjdCA9IG1fZGlydHlSZWN0OworICAgIG1fZGlydHlSZWN0
ID0gSW50UmVjdCgpOworCisgICAgV2ViUHJvY2Vzczo6c2hhcmVkKCkuY29ubmVjdGlvbigpLT5z
ZW5kKERyYXdpbmdBcmVhUHJveHlNZXNzYWdlOjpJbnZhbGlkYXRlLCBtX3dlYlBhZ2UtPnBhZ2VJ
RCgpLCBDb3JlSVBDOjpJbihkaXJ0eVJlY3QpKTsKKworICAgIG1fZGlzcGxheVRpbWVyLnN0b3Ao
KTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhOjpzY2hlZHVsZURpc3BsYXkoKQoreworICAg
IGlmICghbV9zaG91bGRQYWludCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fZGlzcGxh
eVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZGlzcGxheVRpbWVy
LnN0YXJ0T25lU2hvdCgwKTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhOjpzZXRTaXplKGNv
bnN0IEludFNpemUmIHZpZXdTaXplKQoreworICAgIEFTU0VSVChtX3Nob3VsZFBhaW50KTsKKyAg
ICBBU1NFUlRfQVJHKHZpZXdTaXplLCAhdmlld1NpemUuaXNFbXB0eSgpKTsKKworICAgIG1fd2Vi
UGFnZS0+c2V0U2l6ZSh2aWV3U2l6ZSk7CisKKyAgICBzY2hlZHVsZURpc3BsYXkoKTsKKworICAg
IFdlYlByb2Nlc3M6OnNoYXJlZCgpLmNvbm5lY3Rpb24oKS0+c2VuZChEcmF3aW5nQXJlYVByb3h5
TWVzc2FnZTo6RGlkU2V0U2l6ZSwgbV93ZWJQYWdlLT5wYWdlSUQoKSwgQ29yZUlQQzo6SW4odmll
d1NpemUpKTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhOjpzdXNwZW5kUGFpbnRpbmcoKQor
eworICAgIEFTU0VSVChtX3Nob3VsZFBhaW50KTsKKworICAgIG1fc2hvdWxkUGFpbnQgPSBmYWxz
ZTsKKyAgICBtX2Rpc3BsYXlUaW1lci5zdG9wKCk7Cit9CisKK3ZvaWQgVGlsZWREcmF3aW5nQXJl
YTo6cmVzdW1lUGFpbnRpbmcoKQoreworICAgIEFTU0VSVCghbV9zaG91bGRQYWludCk7CisKKyAg
ICBtX3Nob3VsZFBhaW50ID0gdHJ1ZTsKKworICAgIC8vIERpc3BsYXkgaWYgbmVlZGVkLgorICAg
IGRpc3BsYXkoKTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdBcmVhOjpkaWRVcGRhdGUoKQorewor
ICAgIC8vIERpc3BsYXkgaWYgbmVlZGVkLgorICAgIGRpc3BsYXkoKTsKK30KKwordm9pZCBUaWxl
ZERyYXdpbmdBcmVhOjp1cGRhdGVUaWxlKGludCB0aWxlSUQsIGNvbnN0IEludFJlY3QmIGRpcnR5
UmVjdCwgZmxvYXQgc2NhbGUpCit7CisgICAgbV93ZWJQYWdlLT5sYXlvdXRJZk5lZWRlZCgpOwor
CisgICAgVXBkYXRlQ2h1bmsgdXBkYXRlQ2h1bmsoZGlydHlSZWN0KTsKKyAgICBwYWludEludG9V
cGRhdGVDaHVuaygmdXBkYXRlQ2h1bmssIHNjYWxlKTsKKworICAgIHVuc2lnbmVkIHBlbmRpbmdV
cGRhdGVDb3VudCA9IG1fcGVuZGluZ1VwZGF0ZXMuc2l6ZSgpOworICAgIFdlYlByb2Nlc3M6OnNo
YXJlZCgpLmNvbm5lY3Rpb24oKS0+c2VuZChEcmF3aW5nQXJlYVByb3h5TWVzc2FnZTo6VGlsZVVw
ZGF0ZWQsIG1fd2ViUGFnZS0+cGFnZUlEKCksIENvcmVJUEM6OkluKHRpbGVJRCwgdXBkYXRlQ2h1
bmssIHNjYWxlLCBwZW5kaW5nVXBkYXRlQ291bnQpKTsKK30KKwordm9pZCBUaWxlZERyYXdpbmdB
cmVhOjp0aWxlVXBkYXRlVGltZXJGaXJlZCgpCit7CisgICAgQVNTRVJUKCFtX3BlbmRpbmdVcGRh
dGVzLmlzRW1wdHkoKSk7CisKKyAgICBVcGRhdGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9wZW5kaW5n
VXBkYXRlcy5iZWdpbigpOworICAgIFRpbGVVcGRhdGUgdXBkYXRlID0gaXQtPnNlY29uZDsKKyAg
ICBtX3BlbmRpbmdVcGRhdGVzLnJlbW92ZShpdCk7CisKKyAgICB1cGRhdGVUaWxlKHVwZGF0ZS50
aWxlSUQsIHVwZGF0ZS5kaXJ0eVJlY3QsIHVwZGF0ZS5zY2FsZSk7CisKKyAgICBpZiAobV9wZW5k
aW5nVXBkYXRlcy5pc0VtcHR5KCkpCisgICAgICAgIFdlYlByb2Nlc3M6OnNoYXJlZCgpLmNvbm5l
Y3Rpb24oKS0+c2VuZChEcmF3aW5nQXJlYVByb3h5TWVzc2FnZTo6VGlsZVVwZGF0ZXNDb21wbGV0
ZSwgbV93ZWJQYWdlLT5wYWdlSUQoKSwgQ29yZUlQQzo6SW4oKSk7CisgICAgZWxzZQorICAgICAg
ICBtX3RpbGVVcGRhdGVUaW1lci5zdGFydE9uZVNob3QoMC4wMDEpOworfQorCit2b2lkIFRpbGVk
RHJhd2luZ0FyZWE6OmRpZFJlY2VpdmVNZXNzYWdlKENvcmVJUEM6OkNvbm5lY3Rpb24qLCBDb3Jl
SVBDOjpNZXNzYWdlSUQgbWVzc2FnZUlELCBDb3JlSVBDOjpBcmd1bWVudERlY29kZXIqIGFyZ3Vt
ZW50cykKK3sKKyAgICBzd2l0Y2ggKG1lc3NhZ2VJRC5nZXQ8RHJhd2luZ0FyZWFNZXNzYWdlOjpL
aW5kPigpKSB7CisgICAgY2FzZSBEcmF3aW5nQXJlYU1lc3NhZ2U6OlNldFNpemU6IHsKKyAgICAg
ICAgSW50U2l6ZSBzaXplOworICAgICAgICBpZiAoIWFyZ3VtZW50cy0+ZGVjb2RlKENvcmVJUEM6
Ok91dChzaXplKSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgc2V0U2l6ZShzaXpl
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRHJhd2luZ0FyZWFNZXNzYWdlOjpT
dXNwZW5kUGFpbnRpbmc6CisgICAgICAgIHN1c3BlbmRQYWludGluZygpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIERyYXdpbmdBcmVhTWVzc2FnZTo6UmVzdW1lUGFpbnRpbmc6CisgICAgICAg
IHJlc3VtZVBhaW50aW5nKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRHJhd2luZ0FyZWFN
ZXNzYWdlOjpDYW5jZWxUaWxlVXBkYXRlOiB7CisgICAgICAgIGludCB0aWxlSUQ7CisgICAgICAg
IGlmICghYXJndW1lbnRzLT5kZWNvZGUoQ29yZUlQQzo6T3V0KHRpbGVJRCkpKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBVcGRhdGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9wZW5kaW5nVXBk
YXRlcy5maW5kKHRpbGVJRCk7CisgICAgICAgIGlmIChpdCAhPSBtX3BlbmRpbmdVcGRhdGVzLmVu
ZCgpKSB7CisgICAgICAgICAgICBtX3BlbmRpbmdVcGRhdGVzLnJlbW92ZShpdCk7CisgICAgICAg
ICAgICBpZiAobV9wZW5kaW5nVXBkYXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBX
ZWJQcm9jZXNzOjpzaGFyZWQoKS5jb25uZWN0aW9uKCktPnNlbmQoRHJhd2luZ0FyZWFQcm94eU1l
c3NhZ2U6OlRpbGVVcGRhdGVzQ29tcGxldGUsIG1fd2ViUGFnZS0+cGFnZUlEKCksIENvcmVJUEM6
OkluKCkpOworICAgICAgICAgICAgICAgIG1fdGlsZVVwZGF0ZVRpbWVyLnN0b3AoKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEcmF3
aW5nQXJlYU1lc3NhZ2U6OlVwZGF0ZVRpbGU6IHsKKyAgICAgICAgVGlsZVVwZGF0ZSB1cGRhdGU7
CisgICAgICAgIGlmICghYXJndW1lbnRzLT5kZWNvZGUoQ29yZUlQQzo6T3V0KHVwZGF0ZS50aWxl
SUQsIHVwZGF0ZS5kaXJ0eVJlY3QsIHVwZGF0ZS5zY2FsZSkpKQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBVcGRhdGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9wZW5kaW5nVXBkYXRlcy5maW5k
KHVwZGF0ZS50aWxlSUQpOworICAgICAgICBpZiAoaXQgIT0gbV9wZW5kaW5nVXBkYXRlcy5lbmQo
KSkKKyAgICAgICAgICAgIGl0LT5zZWNvbmQuZGlydHlSZWN0LnVuaXRlKHVwZGF0ZS5kaXJ0eVJl
Y3QpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fcGVuZGluZ1VwZGF0ZXMuYWRkKHVw
ZGF0ZS50aWxlSUQsIHVwZGF0ZSk7CisgICAgICAgICAgICBpZiAoIW1fdGlsZVVwZGF0ZVRpbWVy
LmlzQWN0aXZlKCkpCisgICAgICAgICAgICAgICAgbV90aWxlVXBkYXRlVGltZXIuc3RhcnRPbmVT
aG90KDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0Ogor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmIC8vIFRJTEVEX0JBQ0tJTkdfU1RPUkUK
ZGlmZiAtLWdpdCBhL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1RpbGVkRHJhd2luZ0FyZWEu
aCBiL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1RpbGVkRHJhd2luZ0FyZWEuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIwYjY1Ci0tLSAvZGV2L251bGwKKysrIGIv
V2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvVGlsZWREcmF3aW5nQXJlYS5oCkBAIC0wLDAgKzEs
OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29y
IGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVGlsZWREcmF3aW5nQXJl
YV9oCisjZGVmaW5lIFRpbGVkRHJhd2luZ0FyZWFfaAorCisjaWYgRU5BQkxFKFRJTEVEX0JBQ0tJ
TkdfU1RPUkUpCisKKyNpbmNsdWRlICJEcmF3aW5nQXJlYS5oIgorI2luY2x1ZGUgIlJ1bkxvb3Au
aCIKKyNpbmNsdWRlIDxXZWJDb3JlL0ludFBvaW50Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbnRS
ZWN0Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKKwor
Y2xhc3MgVXBkYXRlQ2h1bms7CisKK2NsYXNzIFRpbGVkRHJhd2luZ0FyZWEgOiBwdWJsaWMgRHJh
d2luZ0FyZWEgeworcHVibGljOgorICAgIFRpbGVkRHJhd2luZ0FyZWEoRHJhd2luZ0FyZWFJRCBp
ZGVudGlmaWVyLCBXZWJQYWdlKik7CisgICAgdmlydHVhbCB+VGlsZWREcmF3aW5nQXJlYSgpOwor
CisgICAgdmlydHVhbCB2b2lkIGludmFsaWRhdGVXaW5kb3coY29uc3QgV2ViQ29yZTo6SW50UmVj
dCYgcmVjdCwgYm9vbCBpbW1lZGlhdGUpOworICAgIHZpcnR1YWwgdm9pZCBpbnZhbGlkYXRlQ29u
dGVudHNBbmRXaW5kb3coY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCwgYm9vbCBpbW1lZGlh
dGUpOworICAgIHZpcnR1YWwgdm9pZCBpbnZhbGlkYXRlQ29udGVudHNGb3JTbG93U2Nyb2xsKGNv
bnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QsIGJvb2wgaW1tZWRpYXRlKTsKKyAgICB2aXJ0dWFs
IHZvaWQgc2Nyb2xsKGNvbnN0IFdlYkNvcmU6OkludFNpemUmIHNjcm9sbERlbHRhLCBjb25zdCBX
ZWJDb3JlOjpJbnRSZWN0JiByZWN0VG9TY3JvbGwsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGNs
aXBSZWN0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KGNvbnN0IFdlYkNvcmU6
OkludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGxheSgpOworCisjaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHZpcnR1YWwgdm9pZCBhdHRhY2hDb21wb3NpdGluZ0Nv
bnRleHQoKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoQ29tcG9zaXRpbmdDb250ZXh0KCkg
eyB9CisgICAgdmlydHVhbCB2b2lkIHNldFJvb3RDb21wb3NpdGluZ0xheWVyKFdlYkNvcmU6Okdy
YXBoaWNzTGF5ZXIqKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVDb21wb3NpdGluZ0xh
eWVyU3luYygpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBzeW5jQ29tcG9zaXRpbmdMYXllcnMoKSB7
IH0KKyNlbmRpZgorCisgICAgdmlydHVhbCB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKENvcmVJUEM6
OkNvbm5lY3Rpb24qLCBDb3JlSVBDOjpNZXNzYWdlSUQsIENvcmVJUEM6OkFyZ3VtZW50RGVjb2Rl
ciopOworCitwcml2YXRlOgorICAgIHZvaWQgc2NoZWR1bGVEaXNwbGF5KCk7CisKKyAgICAvLyBD
b3JlSVBDIG1lc3NhZ2UgaGFuZGxlcnMuCisgICAgdm9pZCBzZXRTaXplKGNvbnN0IFdlYkNvcmU6
OkludFNpemUmIHZpZXdTaXplKTsKKyAgICB2b2lkIHN1c3BlbmRQYWludGluZygpOworICAgIHZv
aWQgcmVzdW1lUGFpbnRpbmcoKTsKKyAgICB2b2lkIGRpZFVwZGF0ZSgpOworICAgIHZvaWQgdXBk
YXRlVGlsZShpbnQgdGlsZUlELCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBkaXJ0eVJlY3QsIGZs
b2F0IHNjYWxlKTsKKworICAgIC8vIFBsYXRmb3JtIG92ZXJyaWRlcworICAgIHZvaWQgcGFpbnRJ
bnRvVXBkYXRlQ2h1bmsoVXBkYXRlQ2h1bmsqLCBmbG9hdCBzY2FsZSk7CisKKyAgICB2b2lkIHRp
bGVVcGRhdGVUaW1lckZpcmVkKCk7CisKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1fZGlydHlSZWN0
OworICAgIGJvb2wgbV9pc1dhaXRpbmdGb3JVcGRhdGU7CisgICAgYm9vbCBtX3Nob3VsZFBhaW50
OworICAgIFJ1bkxvb3A6OlRpbWVyPFRpbGVkRHJhd2luZ0FyZWE+IG1fZGlzcGxheVRpbWVyOwor
CisgICAgc3RydWN0IFRpbGVVcGRhdGUgeworICAgICAgICBpbnQgdGlsZUlEOworICAgICAgICBX
ZWJDb3JlOjpJbnRSZWN0IGRpcnR5UmVjdDsKKyAgICAgICAgZmxvYXQgc2NhbGU7CisgICAgfTsK
KyAgICB0eXBlZGVmIEhhc2hNYXA8aW50LCBUaWxlVXBkYXRlPiBVcGRhdGVNYXA7CisgICAgVXBk
YXRlTWFwIG1fcGVuZGluZ1VwZGF0ZXM7CisgICAgUnVuTG9vcDo6VGltZXI8VGlsZWREcmF3aW5n
QXJlYT4gbV90aWxlVXBkYXRlVGltZXI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKwor
I2VuZGlmIC8vIFRJTEVEX0JBQ0tJTkdfU1RPUkUKKworI2VuZGlmIC8vIFRpbGVkRHJhd2luZ0Fy
ZWFfaApkaWZmIC0tZ2l0IGEvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvcXQvVGlsZWREcmF3
aW5nQXJlYVF0LmNwcCBiL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL3F0L1RpbGVkRHJhd2lu
Z0FyZWFRdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhZDc4Mgot
LS0gL2Rldi9udWxsCisrKyBiL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL3F0L1RpbGVkRHJh
d2luZ0FyZWFRdC5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2lmIEVOQUJMRShUSUxFRF9CQUNLSU5HX1NUT1JFKQorCisjaW5jbHVkZSAiVGlsZWREcmF3
aW5nQXJlYS5oIgorCisjaW5jbHVkZSAiVXBkYXRlQ2h1bmsuaCIKKyNpbmNsdWRlICJXZWJQYWdl
LmgiCisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRleHQuaD4KKworI2luY2x1ZGUgPFFJ
bWFnZT4KKyNpbmNsdWRlIDxRUGFpbnRlcj4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisK
K25hbWVzcGFjZSBXZWJLaXQgeworCit2b2lkIFRpbGVkRHJhd2luZ0FyZWE6OnBhaW50SW50b1Vw
ZGF0ZUNodW5rKFVwZGF0ZUNodW5rKiB1cGRhdGVDaHVuaywgZmxvYXQgc2NhbGUpCit7CisgICAg
SW50UmVjdCB0aWxlUmVjdCA9IHVwZGF0ZUNodW5rLT5yZWN0KCk7CisgICAgUUltYWdlIGltYWdl
KHVwZGF0ZUNodW5rLT5jcmVhdGVJbWFnZSgpKTsKKyAgICBRUGFpbnRlciBwYWludGVyKCZpbWFn
ZSk7CisgICAgLy8gTm93IHBhaW50IGludG8gdGhlIGJhY2tpbmcgc3RvcmUuCisgICAgR3JhcGhp
Y3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dCgmcGFpbnRlcik7CisgICAgZ3JhcGhpY3NDb250ZXh0
LnRyYW5zbGF0ZSgtdGlsZVJlY3QueCgpLCAtdGlsZVJlY3QueSgpKTsKKyAgICBncmFwaGljc0Nv
bnRleHQuc2NhbGUoRmxvYXRTaXplKHNjYWxlLCBzY2FsZSkpOworICAgIEludFJlY3QgY29udGVu
dFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KEZsb2F0UmVjdCh0aWxlUmVjdC54KCkgLyBzY2FsZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGls
ZVJlY3QueSgpIC8gc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHRpbGVSZWN0LndpZHRoKCkgLyBzY2FsZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVJlY3QuaGVpZ2h0KCkg
LyBzY2FsZSkpOworICAgIG1fd2ViUGFnZS0+ZHJhd1JlY3QoZ3JhcGhpY3NDb250ZXh0LCBjb250
ZW50UmVjdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gVElMRURf
QkFDS0lOR19TVE9SRQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>