<?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>31318</bug_id>
          
          <creation_ts>2009-11-10 14:32:44 -0800</creation_ts>
          <short_desc>Windows: Implement full screen mode for &lt;video&gt;</short_desc>
          <delta_ts>2010-01-08 11:25:11 -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>Media</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows XP</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Marrin">cmarrin</reporter>
          <assigned_to name="Chris Marrin">cmarrin</assigned_to>
          <cc>aroben</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>162226</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-11-10 14:32:44 -0800</bug_when>
    <thetext>Implement full screen mode for &lt;video&gt;

rdar://problem/5966569</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>162232</commentid>
    <comment_count>1</comment_count>
      <attachid>42898</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-11-10 14:39:07 -0800</bug_when>
    <thetext>Created attachment 42898
Unfinished patch

This patch contains most of the functionality for full screen. There is a full-screen button on the in-page video controller which takes you to full-screen mode. This brings up a full screen controller with placeholder icons. Right now the center icon plays/pauses and the rightmost one takes you out of full screen. You can also hit space bar for play/pause and ESC to go out of full-screen.

Issues:

1) Replace icons

2) Implement timeline and volume sliders

3) Hook up max and min volume buttons

4) Handle video aspect ratio properly

5) Make HUD appear and disappear

6) Make HUD draggable.

This last issue is blocked because I don&apos;t know how to erase pixels on the special video overlay plane. Investigation is in progress.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170989</commentid>
    <comment_count>2</comment_count>
      <attachid>44717</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-11 16:26:55 -0800</bug_when>
    <thetext>Created attachment 44717
Icons for full-screen video controller</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170990</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-11 16:28:08 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 44717 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170991</commentid>
    <comment_count>4</comment_count>
      <attachid>44717</attachid>
    <who name="Jon Honeycutt">jhoneycutt</who>
    <bug_when>2009-12-11 16:32:27 -0800</bug_when>
    <thetext>Comment on attachment 44717
Icons for full-screen video controller

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170992</commentid>
    <comment_count>5</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-11 16:40:44 -0800</bug_when>
    <thetext>Landed icons in http://trac.webkit.org/changeset/52030</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174376</commentid>
    <comment_count>6</comment_count>
      <attachid>45401</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-22 13:59:06 -0800</bug_when>
    <thetext>Created attachment 45401
Final patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174378</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-22 14:02:41 -0800</bug_when>
    <thetext>Attachment 45401 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Last 3072 characters of output:
, and then alphabetically sorted.  [build/include_order] [4]
WebKit/win/WebVideoFSHUDController.cpp:32:  Alphabetical sorting problem.  [build/include_order] [4]
WebKit/win/WebVideoFSHUDController.cpp:33:  Found header this file implements after other header. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
WebKit/win/WebVideoFSHUDController.cpp:38:  Alphabetical sorting problem.  [build/include_order] [4]
WebKit/win/WebVideoFSHUDController.cpp:79:  Missing space after ,  [whitespace/comma] [3]
WebKit/win/WebVideoFSHUDController.cpp:81:  Missing space after ,  [whitespace/comma] [3]
WebKit/win/WebVideoFSHUDController.cpp:99:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
WebKit/win/WebVideoFSHUDController.cpp:97:  Missing space before ( in switch(  [whitespace/parens] [5]
WebKit/win/WebVideoFSHUDController.cpp:225:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/win/WebVideoFSHUDController.cpp:336:  Should have a space between // and comment  [whitespace/comments] [4]
WebKit/win/WebVideoFSHUDController.cpp:342:  Should have a space between // and comment  [whitespace/comments] [4]
WebKit/win/WebVideoFSHUDController.cpp:380:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
WebKit/win/WebVideoFSHUDController.cpp:379:  Missing space before ( in switch(  [whitespace/parens] [5]
WebCore/platform/graphics/win/QTMovieWin.h:117:  _handleMessages is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WebKit/win/WebVideoFSController.h:35:  Alphabetical sorting problem.  [build/include_order] [4]
WebKit/win/WebVideoFSController.h:38:  This { should be at the end of the previous line  [whitespace/braces] [4]
WebCore/platform/graphics/win/QTMovieWin.cpp:1070:  QTMovieWin::_handleMessages is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
WebCore/platform/graphics/win/QTMovieWin.cpp:1080:  Tab found; better to use spaces  [whitespace/tab] [1]
WebCore/platform/graphics/win/QTMovieWin.cpp:1080:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/graphics/win/QTMovieWin.cpp:1081:  Tab found; better to use spaces  [whitespace/tab] [1]
WebCore/platform/graphics/win/QTMovieWin.cpp:1082:  Tab found; better to use spaces  [whitespace/tab] [1]
WebCore/platform/graphics/win/QTMovieWin.cpp:1082:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/graphics/win/QTMovieWin.cpp:1085:  Tab found; better to use spaces  [whitespace/tab] [1]
WebCore/platform/graphics/win/QTMovieWin.cpp:1085:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/graphics/win/QTMovieWin.cpp:1086:  Tab found; better to use spaces  [whitespace/tab] [1]
WebCore/platform/graphics/win/QTMovieWin.cpp:1123:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/loader/FrameLoader.cpp:1477:  Should have a space between // and comment  [whitespace/comments] [4]
Total errors found: 38</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174381</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-22 14:05:03 -0800</bug_when>
    <thetext>Two issues remain with full-screen video.

1) Add select highlight to full-screen video HUD on Windows
(https://bugs.webkit.org/show_bug.cgi?id=32880)

2) Make full-screen video HUD fade in and out on Windows
(https://bugs.webkit.org/show_bug.cgi?id=32881)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174393</commentid>
    <comment_count>9</comment_count>
      <attachid>45401</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-12-22 14:19:14 -0800</bug_when>
    <thetext>Comment on attachment 45401
Final patch

Exciting to see this!

The use of &quot;the&quot; and &quot;my&quot; prefixes in the code is not typical of WebKit code. Should keep that to a minimum.

&gt; -    ASSERT(m_frame-&gt;document()-&gt;parsing());
&gt; +    //ASSERT(m_frame-&gt;document()-&gt;parsing());

If this needs to be removed, then we want to remove it, not comment it out. The change log does not mention this, so maybe you ought to just put it back in?

&gt; +    virtual bool supportsFullscreen() const { return true; }
&gt; +
&gt; +    virtual PlatformMedia platformMedia() const
&gt; +    {
&gt; +        PlatformMedia p;
&gt; +        MediaPlayerPrivate* m = const_cast&lt;MediaPlayerPrivate*&gt;(this);
&gt; +        p.qtMovie = reinterpret_cast&lt;QTMovie*&gt;(m-&gt;m_qtMovie.get());
&gt; +        return p;
&gt; +    }

It&apos;s normally not good style to put virtual function definitions inside class definitions, because that asks to inline them and they can rarely be inlined. So I suggest putting the function bodies in the cpp file instead of the header.

I also think these overrides should be private, since it&apos;s normally a programming mistake to call them with a MediaPlayerPrivate* rather than a MediaPlayerPrivateInterface*.

&gt; +    WindowPtr m_fsWindow;
&gt; +    GWorldPtr m_fsOrigGWorld;
&gt; +    Rect m_fsRect;
&gt; +    QTMovieWinFSClient* m_fsClient;
&gt; +    char* m_fsRestoreState;

I find the use of &quot;fs&quot; and &quot;FS&quot; confusing. Would it really make things too long-winded to say &quot;fullScreen&quot; instead?

&gt; +    QTMovieWin* movie = reinterpret_cast&lt;QTMovieWin*&gt;(GetWindowLongPtr(theWnd, GWL_USERDATA));

Can we use static_cast here?

&gt; +	OSErr myErr = BeginFullScreen(&amp;m_private-&gt;m_fsRestoreState, NULL, 0, 0, &amp;m_private-&gt;m_fsWindow, NULL, fullScreenAllowEvents); 
&gt; +	QTMLSetWindowWndProc(m_private-&gt;m_fsWindow, _handleMessages);
&gt; +	CreatePortAssociation(GetPortNativeWindow(m_private-&gt;m_fsWindow), NULL, 0L);

Tabs here, so we won&apos;t be able to check in as-is.

The uses of NULL and 0L here should be replaced by uses of 0.

&gt; +    HWND wnd = (HWND) GetPortNativeWindow(m_private-&gt;m_fsWindow);
&gt; +    SetWindowLongPtr(wnd, GWL_USERDATA, (LONG) this);

&gt; +    HWND wnd = (HWND) GetPortNativeWindow(m_private-&gt;m_fsWindow);

&gt; +    DestroyPortAssociation((CGrafPtr) m_private-&gt;m_fsWindow);

Could we use static_cast or reinterpret_cast for these casts?

&gt; +    SetMovieGWorld(m_private-&gt;m_movie, m_private-&gt;m_fsOrigGWorld, NULL);
&gt; +    OSErr myErr = EndFullScreen(m_private-&gt;m_fsRestoreState, 0L);

More NULL and 0L.

&gt; +class QTMovieWinFSClient {
&gt; +public:
&gt; +    virtual LRESULT fsClientWndProc(HWND theWnd, UINT theMessage, UINT wParam, LONG lParam) = 0;

Normally we leave out the argument name theWnd in cases like this. I&apos;d also name the message just &quot;message&quot; rather than &quot;theMessage&quot;.

&gt; +    HWND enterFullscreen(QTMovieWinFSClient* client);

Normally we leave out the argument name in cases like this.

&gt; +WebVideoFSController::WebVideoFSController()
&gt; + : m_window(0)
&gt; + , m_hudController(0)

Non-standard indentation here.

&gt; +void WebVideoFSController::setMediaElement(WebCore::HTMLMediaElement* mediaElement)
&gt; +{
&gt; +    m_mediaElement = mediaElement;
&gt; +    if (!m_mediaElement) {
&gt; +        // FIXME: Do some cleanup here
&gt; +        return;
&gt; +    }
&gt; +}

Is this really the way we want to check it in? Does we need that empty if statement?

I don&apos;t think the WebCore prefix is needed here. Instead we should do using namespace WebCore at the top of the file.

&gt; +LRESULT WebVideoFSController::fsClientWndProc(HWND theWnd, UINT theMessage, UINT wParam, LONG lParam)

I&apos;d leave off the &quot;the&quot; here.

&gt; +    switch(theMessage) {

Missing space here.

&gt; +bool WebVideoFSController::hudClientCanPlay()
&gt; +{
&gt; +    return m_mediaElement ? m_mediaElement-&gt;canPlay() : false;
&gt; +}

I often use &amp;&amp; for such boolean expressions rather than ?: -- m_mediaElement &amp;&amp; m_mediaElement-&gt;canPlay().

&gt; +    return m_mediaElement ? (m_mediaElement-&gt;currentTime()) : 0;

Extra parentheses here are not needed.

&gt; +    return m_mediaElement ? (m_mediaElement-&gt;duration()) : 0;

Not here either.

&gt; +#include &quot;QTMovieWin.h&quot;
&gt; +#include &quot;WebVideoFSHUDController.h&quot;
&gt; +
&gt; +#include &lt;wtf/RefPtr.h&gt;
&gt; +#include &lt;WebCore/HTMLMediaElement.h&gt;

Normally we sort includes in a single paragraph.

&gt; +class WebVideoFSController : public QTMovieWinFSClient, public WebVideoFSHUDClient
&gt; +{

Brace goes on the same line as the class name.

Should inherit from Noncopyable, unless one of the base classes adds it.

I suggest both base classes be private bases rather than public.

&gt; +    void setMediaElement(WebCore::HTMLMediaElement* mediaElement);

We normally leave out the argument name in cases like this.

&gt; +    // QTMovieWinFSClient
&gt; +    virtual LRESULT fsClientWndProc(HWND theWnd, UINT theMessage, UINT wParam, LONG lParam);
&gt; +
&gt; +    // WebVideoFSHUDClient
&gt; +    virtual void hudClientExitFullscreen();
&gt; +    virtual bool hudClientCanPlay();
&gt; +    virtual void hudClientPlay();
&gt; +    virtual void hudClientPause();
&gt; +    virtual float hudClientVolume() const;
&gt; +    virtual void hudClientSetVolume(float);
&gt; +    virtual float hudClientCurrentTime() const;
&gt; +    virtual void hudClientSetCurrentTime(float);
&gt; +    virtual float hudClientDuration() const;
&gt; +    virtual void hudClientBeginScrubbing();
&gt; +    virtual void hudClientEndScrubbing();

Can these all be private?

&gt; +#include &lt;windowsx.h&gt;
&gt; +
&gt; +#include &quot;WebKitDLL.h&quot;
&gt; +#include &quot;WebVideoFSHUDController.h&quot;
&gt; +
&gt; +#include &lt;ApplicationServices/ApplicationServices.h&gt;
&gt; +#include &lt;WebKitSystemInterface/WebKitSystemInterface.h&gt;
&gt; +
&gt; +#include &lt;WebCore/BitmapInfo.h&gt;
&gt; +#include &lt;WebCore/Font.h&gt;
&gt; +#include &lt;WebCore/FontSelector.h&gt;
&gt; +#include &lt;WebCore/GraphicsContext.h&gt;
&gt; +#include &lt;WebCore/TextRun.h&gt;
&gt; +#include &lt;wtf/StdLibExtras.h&gt;

Normally we sort includes in a single paragraph.

&gt; +static const float kTimerInterval = 0.033;

The use of &quot;k&quot; in all the constants is not normal WebKit style.

&gt; +// Button/slider/text positions
&gt; +static const IntPoint kPlayPauseButtonPoint((kWindowWidth - kButtonSize) / 2, kMarginTop);
&gt; +static const IntPoint kVolumeUpButtonPoint(kMargin + kButtonMiniSize + kVolumeSliderWidth + kButtonMiniSize / 2, kMarginTop + (kButtonSize - kButtonMiniSize) / 2);
&gt; +static const IntPoint kVolumeDownButtonPoint(kMargin, kMarginTop + (kButtonSize - kButtonMiniSize) / 2);
&gt; +static const IntPoint kVolumeSliderPoint(kVolumeDownButtonPoint.x() + kButtonMiniSize, kVolumeDownButtonPoint.y() + kButtonMiniSize / 2 - kSliderHeight / 2);
&gt; +static const IntPoint kTimeSliderPoint(kWindowWidth / 2 - kTimeSliderWidth / 2, kWindowHeight - kMargin - kSliderHeight);
&gt; +static const IntPoint kExitFullscreenButtonPoint(kWindowWidth - 2 * kMargin - kButtonMiniSize, kMarginTop + (kButtonSize - kButtonMiniSize) / 2);
&gt; +static const IntPoint kLeftTextPoint(kWindowWidth / 2 - kTimeSliderWidth / 2 - kMargin, kWindowHeight - kMargin - kSliderHeight / 2);
&gt; +static const IntPoint kRightTextPoint(kWindowWidth / 2 + kTimeSliderWidth / 2 + kMargin, kWindowHeight - kMargin - kSliderHeight / 2);

All these constants of classes with constructors are going to create initialization time constructors, which are not good for DLL loading speed and thus application startup speed. Can we find a way to avoid that?

I didn&apos;t finish reviewing. If I have more time I&apos;ll pick up where I left off.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174411</commentid>
    <comment_count>10</comment_count>
      <attachid>45401</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-12-22 14:43:03 -0800</bug_when>
    <thetext>Comment on attachment 45401
Final patch



&gt; Index: WebCore/loader/FrameLoader.cpp
&gt; ===================================================================

&gt;      ASSERT(m_workingURL.isEmpty());
&gt;      ASSERT(m_frame-&gt;document());
&gt; -    ASSERT(m_frame-&gt;document()-&gt;parsing());
&gt; +    //ASSERT(m_frame-&gt;document()-&gt;parsing());
&gt;      write(bytes, length);

Not part of the patch, I assume?

&gt; Index: WebCore/platform/graphics/win/MediaPlayerPrivateQuickTimeWin.h
&gt; ===================================================================

&gt; +    virtual PlatformMedia platformMedia() const
&gt; +    {
&gt; +        PlatformMedia p;
&gt; +        MediaPlayerPrivate* m = const_cast&lt;MediaPlayerPrivate*&gt;(this);
&gt; +        p.qtMovie = reinterpret_cast&lt;QTMovie*&gt;(m-&gt;m_qtMovie.get());

It would be OK to do the const_cast inline.

p.qtMovie = reinterpret_cast&lt;QTMovie*&gt;(const_cast&lt;MediaPlayerPrivate*&gt;(this)-&gt;m_qtMovie.get());

Why is the const_cast needed anyway? Maybe just add a private const accessor for the qtMovie?

&gt; Index: WebCore/platform/graphics/win/QTMovieWin.cpp
&gt; ===================================================================

&gt; +    WindowPtr m_fsWindow;
&gt; +    GWorldPtr m_fsOrigGWorld;
&gt; +    Rect m_fsRect;
&gt; +    QTMovieWinFSClient* m_fsClient;
&gt; +    char* m_fsRestoreState;

Please expand &apos;fs&apos; to fullscreen in these names.

&gt; @@ -159,6 +164,10 @@ QTMovieWinPrivate::QTMovieWinPrivate()
&gt;  #if !ASSERT_DISABLED
&gt;      , m_scaleCached(false)
&gt;  #endif
&gt; +    , m_fsWindow(0)
&gt; +    , m_fsOrigGWorld(0)
&gt; +    , m_fsClient(0)
&gt; +    , m_fsRestoreState(0)

Initialize m_fsRect?

&gt; @@ -1040,7 +1049,7 @@ bool QTMovieWin::initializeQuickTime() 
&gt;      if (!initialized) {
&gt;          initialized = true;
&gt;          // Initialize and check QuickTime version
&gt; -        OSErr result = InitializeQTML(0);
&gt; +        OSErr result = InitializeQTML(kInitializeQTMLEnableDoubleBufferedSurface);

Does this have any impact on non-fullscreen video playback performance?

&gt; +HWND QTMovieWin::enterFullscreen(QTMovieWinFSClient* client)
&gt; +{
&gt; +    m_private-&gt;m_fsClient = client;
&gt; +    
&gt; +	OSErr myErr = BeginFullScreen(&amp;m_private-&gt;m_fsRestoreState, NULL, 0, 0, &amp;m_private-&gt;m_fsWindow, NULL, fullScreenAllowEvents); 

myErr is unused. Should check for errors.

&gt; +	QTMLSetWindowWndProc(m_private-&gt;m_fsWindow, _handleMessages);
&gt; +	CreatePortAssociation(GetPortNativeWindow(m_private-&gt;m_fsWindow), NULL, 0L);
&gt; +
&gt; +    GetMovieBox(m_private-&gt;m_movie, &amp;m_private-&gt;m_fsRect);
&gt; +	GetMovieGWorld(m_private-&gt;m_movie, &amp;m_private-&gt;m_fsOrigGWorld, NULL);
&gt; +	SetMovieGWorld(m_private-&gt;m_movie, (CGrafPtr)m_private-&gt;m_fsWindow, GetGWorldDevice((CGrafPtr)m_private-&gt;m_fsWindow));

Tabs here. Use 0 rather than NULL.

&gt; +
&gt; +    // Set the size of the box to preserve aspect ratio
&gt; +    Rect rect = m_private-&gt;m_fsWindow-&gt;portRect;
&gt; +
&gt; +    float movieRatio = static_cast&lt;float&gt;(m_private-&gt;m_width) / m_private-&gt;m_height;
&gt; +    int windowWidth =  rect.right - rect.left;
&gt; +    int windowHeight = rect.bottom - rect.top;
&gt; +    float windowRatio = static_cast&lt;float&gt;(windowWidth) / windowHeight;
&gt; +    int actualWidth = (windowRatio &gt; movieRatio) ? (windowHeight * movieRatio) : windowWidth;
&gt; +    int actualHeight = (windowRatio &lt; movieRatio) ? (windowWidth / movieRatio) : windowHeight;
&gt; +    int offsetX = (windowWidth - actualWidth) / 2;
&gt; +    int offsetY = (windowHeight - actualHeight) / 2;

Ah, the old &quot;resize maintaining aspect ratio&quot; logic. I think we have that 3-4 times in WebKit. Maybe make a method on IntRect or FloatRect and use it?

&gt; +    rect.left = offsetX;
&gt; +    rect.right = offsetX + actualWidth;
&gt; +    rect.top = offsetY;
&gt; +    rect.bottom = offsetY + actualHeight;
&gt; +
&gt; +    SetMovieBox(m_private-&gt;m_movie, &amp;rect);
&gt; +    ShowHideTaskBar(true);
&gt; +
&gt; +    // set the this pointer on the HWND

Sentence case for comments pls.

&gt; +    HWND wnd = (HWND) GetPortNativeWindow(m_private-&gt;m_fsWindow);

No space after the )

&gt; +    SetWindowLongPtr(wnd, GWL_USERDATA, (LONG) this);

Ditto.

&gt; +void QTMovieWin::exitFullscreen()
&gt; +{
&gt; +    if (!m_private-&gt;m_fsWindow)
&gt; +        return;
&gt; +
&gt; +    HWND wnd = (HWND) GetPortNativeWindow(m_private-&gt;m_fsWindow);
&gt; +    SetWindowLongPtr(wnd, GWL_USERDATA, 0);
&gt; +    DestroyPortAssociation((CGrafPtr) m_private-&gt;m_fsWindow);
&gt; +    SetMovieGWorld(m_private-&gt;m_movie, m_private-&gt;m_fsOrigGWorld, NULL);
&gt; +    OSErr myErr = EndFullScreen(m_private-&gt;m_fsRestoreState, 0L);

Check for errors?

&gt; +    SetMovieBox(m_private-&gt;m_movie, &amp;m_private-&gt;m_fsRect);
&gt; +    m_private-&gt;m_fsWindow = 0;
&gt; +}

Please add an assertion in QTMovieWin&apos;s dtor to ensure that we&apos;ve left fullscreen when it gets deleted, otherwise I think we&apos;ll leak a bunch of state.

&gt; Index: WebCore/platform/graphics/win/QTMovieWin.h
&gt; ===================================================================

&gt; +class QTMovieWinFSClient {
&gt; +public:
&gt; +    virtual LRESULT fsClientWndProc(HWND theWnd, UINT theMessage, UINT wParam, LONG lParam) = 0;
&gt; +};

Please expand &apos;FS&apos; and &apos;fs&apos;. It&apos;s not obvious to the casual reader what &apos;fs&apos; is an abbreviation of.

&gt; +    HWND enterFullscreen(QTMovieWinFSClient* client);

Add a comment saying what the return value is, and what it might be used for.

&gt;  private:
&gt;      void load(CFURLRef, bool preservesPitch);
&gt; +    static LRESULT _handleMessages(HWND theWnd, UINT theMessage, UINT wParam, LONG lParam);
&gt; +    LRESULT handleMessages(HWND theWnd, UINT theMessage, UINT wParam, LONG lParam);

Not a big fan of the same names differing by an underscore.

&gt; Index: WebKit/win/WebVideoFSController.cpp
&gt; ===================================================================

I&apos;d prefer FS to be expanded in the file name and class names.

&gt; +WebVideoFSController::WebVideoFSController()
&gt; + : m_window(0)
&gt; + , m_hudController(0)

Evil tabs.

&gt; +void WebVideoFSController::setMediaElement(WebCore::HTMLMediaElement* mediaElement)
&gt; +{
&gt; +    m_mediaElement = mediaElement;
&gt; +    if (!m_mediaElement) {
&gt; +        // FIXME: Do some cleanup here
&gt; +        return;
&gt; +    }
&gt; +}

This is the kind of FIXME that will never get fixed unless you do it now.

&gt; +float WebVideoFSController::hudClientVolume() const
&gt; +{
&gt; +    return m_mediaElement ? m_mediaElement-&gt;volume() : 0;
&gt; +}
&gt; +void WebVideoFSController::hudClientSetVolume(float volume)

Missing blank line.

&gt; +void WebVideoFSController::exitFullscreen()
&gt; +{
&gt; +    if (movie())
&gt; +        movie()-&gt;exitFullscreen();
&gt; +}

Group next to enterFullscreen().

&gt; Index: WebKit/win/WebVideoFSController.h
&gt; ===================================================================

&gt; +class WebVideoFSController : public QTMovieWinFSClient, public WebVideoFSHUDClient

I&apos;d prefer FS to be expanded in the file name and class names.

&gt; +public:
&gt; +    WebVideoFSController();
&gt; +    ~WebVideoFSController();

Make the dtor virtual?

&gt; +    WebCore::HTMLMediaElement* mediaElement() { return m_mediaElement.get(); }

Method should be const.

&gt; +
&gt; +    void enterFullscreen();
&gt; +    void exitFullscreen();
&gt; +
&gt; +    // QTMovieWinFSClient
&gt; +    virtual LRESULT fsClientWndProc(HWND theWnd, UINT theMessage, UINT wParam, LONG lParam);
&gt; +
&gt; +    // WebVideoFSHUDClient
&gt; +    virtual bool hudClientCanPlay();

Should be const.

&gt; +    QTMovieWin* movie();

const.

&gt; Index: WebKit/win/WebVideoFSHUDController.cpp
&gt; ===================================================================

&gt; +void HUDSlider::draw(WebCore::GraphicsContext&amp; context)
&gt; +{
&gt; +    // Draw gutter
&gt; +    IntSize radius(m_height / 2, m_height / 2);
&gt; +    context.fillRoundedRect(IntRect(m_position, IntSize(m_width, m_height)), radius, radius, radius, radius, kSliderGutterColor, DeviceColorSpace);
&gt; +
&gt; +    // Draw button
&gt; +    context.setStrokeColor(kSliderButtonColor, DeviceColorSpace);
&gt; +    context.setFillColor(kSliderButtonColor, DeviceColorSpace);

You should save and restore the context around code that changes state.

&gt; +WebVideoFSHUDController::WebVideoFSHUDController(WebVideoFSHUDClient* client, HWND window)

&gt; +    void* pixels;
&gt; +    BitmapInfo bitmapInfo = BitmapInfo::createBottomUp(IntSize(kWindowWidth, kWindowHeight));
&gt; +    m_bitmap.set(::CreateDIBSection(NULL, &amp;bitmapInfo, DIB_RGB_COLORS, &amp;pixels, NULL, 0));

Does &apos;pixels&apos; need to be cleaned up?

&gt; +bool WebVideoFSHUDController::registerWindowClass()
&gt; +{
&gt; +    static bool haveRegisteredWindowClass = false;
&gt; +    if (haveRegisteredWindowClass)
&gt; +        return true;
&gt; +
&gt; +    haveRegisteredWindowClass = true;
&gt; +
&gt; +    WNDCLASSEX wcex;
&gt; +
&gt; +    wcex.cbSize = sizeof(WNDCLASSEX);
&gt; +
&gt; +    wcex.style          = CS_HREDRAW | CS_VREDRAW;
&gt; +    wcex.lpfnWndProc    = wndProc;
&gt; +    wcex.cbClsExtra     = 0;
&gt; +    wcex.cbWndExtra     = 4;
&gt; +    wcex.hInstance      = gInstance;
&gt; +    wcex.hIcon          = 0;
&gt; +    wcex.hCursor        = ::LoadCursor(0, IDC_ARROW);
&gt; +    wcex.hbrBackground  = 0;
&gt; +    wcex.lpszMenuName   = 0;
&gt; +    wcex.lpszClassName  = kWebVideoFSHUDWindowClassName;
&gt; +    wcex.hIconSm        = 0;

Lining up like this isn&apos;t normal webkit style.

&gt; +void WebVideoFSHUDController::createWindow()
&gt; +{
&gt; +    registerWindowClass();

Check the return value?

&gt; +static String timeToString(float time)
&gt; +{
&gt; +    if (!isfinite(time))
&gt; +        time = 0;
&gt; +    int seconds = fabsf(time); 
&gt; +    int hours = seconds / (60 * 60);
&gt; +    int minutes = (seconds / 60) % 60;
&gt; +    seconds %= 60;
&gt; +
&gt; +    if (hours) {
&gt; +        if (hours &gt; 9)
&gt; +            return String::format(&quot;%s%02d:%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), hours, minutes, seconds);
&gt; +        return String::format(&quot;%s%01d:%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), hours, minutes, seconds);
&gt; +    }
&gt; +
&gt; +    return String::format(&quot;%s%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), minutes, seconds);
&gt; +}

Would be nice to share this code with Mac.

&gt; +void WebVideoFSHUDController::draw()
&gt; +{
&gt; +    GraphicsContext gc(bitmapDC, true);

Context is often called &apos;ctx&apos;.

&gt; +    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &amp;metrics, 0);
&gt; +    //desc.setWeight(FontWeightBold);

Don&apos;t check in commented code.

&gt; +    FontFamily family;
&gt; +    family.setFamily(metrics.lfSmCaptionFont.lfFaceName);
&gt; +    desc.setFamily(family);
&gt; +
&gt; +    desc.setComputedSize(kTextSize);
&gt; +    //desc.setGenericFamily(FontDescription::MonospaceFamily);

Ditto.

&gt; +LRESULT WebVideoFSHUDController::wndProc(HWND wnd, UINT message, UINT wParam, LONG lParam)

&gt; +    switch(message) {

Missing space after switch.

&gt; +void WebVideoFSHUDController::onChar(int c)
&gt; +{
&gt; +    if (c == 0x1b)
&gt; +        m_client-&gt;hudClientExitFullscreen();
&gt; +    else if (c == 0x20)
&gt; +        togglePlay();
&gt; +}

Are there constants for those chars you can use? At least comment them.

&gt; +void WebVideoFSHUDController::timerFired(WebCore::Timer&lt;WebVideoFSHUDController&gt;*)
&gt; +{
&gt; +    // When the movie is playing, the event queue seems to be getting starved,
&gt; +    // so we fire a timer every 33ms and simulate a mouse move. This only
&gt; +    // happens when the left button is down

Is there a Radar to track the cause of this hack?

&gt; +void WebVideoFSHUDController::onMouseMove(int x, int y)
&gt; +{
&gt; +    // Messages are actually coming into the full-screen window, so we have to subtract the window position
&gt; +    x -= m_posX;
&gt; +    y -= m_posY;

You could make this self-documenting with a method call, and cleaner using IntPoint everywhere:
    IntPoint  localCoords = convertToLocalCoords(point);

&gt; +        draw();
&gt; +    } else if (m_movingWindow) {
&gt; +        m_posX += x - m_moveOffsetX;
&gt; +        m_posY += y - m_moveOffsetY;
&gt; +        draw();

Should you really be drawing synchronously in all these places, or would it suffice just to invalidate and
let Windows call you back to do drawing?

&gt; Index: WebKit/win/WebVideoFSHUDController.h
&gt; ===================================================================
&gt; +class HUDWidget {
&gt; +public:
&gt; +    HUDWidget(const WebCore::IntPoint&amp; position, int width, int height)

Use IntSize for width and height? Or, IntRect for frame?

&gt; +    bool isPicked(int x, int y) const { return x &gt;= m_position.x() &amp;&amp; x &lt; m_position.x() + m_width &amp;&amp; y &gt;= m_position.y() &amp;&amp; y &lt; m_position.y() + m_height; }

I&apos;d prefer this be called &apos;hitTest&apos;. &quot;Picking&quot; is more of a 3D term.

&gt; +protected:
&gt; +    WebCore::IntPoint m_position;
&gt; +    int m_width, m_height;

Crys out for IntRect.

&gt; +class WebVideoFSHUDClient {
&gt; +public:
&gt; +    virtual void hudClientExitFullscreen() = 0;
&gt; +    virtual bool hudClientCanPlay() = 0;

Should be const.

&gt; +class WebVideoFSHUDController {

&gt; +    WebVideoFSHUDClient* m_client;
&gt; +    HWND m_window, m_parentWindow;
&gt; +    OwnPtr&lt;HBITMAP&gt; m_bitmap;
&gt; +    int m_fsWidth, m_fsHeight;
&gt; +    int m_posX, m_posY;

IntRect?

&gt; +    int m_moveOffsetX, m_moveOffsetY;

IntPoint or IntSize?

&gt; Index: WebKit/win/WebView.cpp
&gt; ===================================================================

&gt; +void WebView::enterFullscreenForNode(Node* node)
&gt; +{
&gt; +    ASSERT(node-&gt;hasTagName(WebCore::HTMLNames::videoTag));

I think this check should not just be in the ASSERT; check the type, and return if it&apos;s not video.

&gt; +void WebView::exitFullscreen()
&gt; +{
&gt; +    free(malloc(1));
&gt; +    m_fsController = 0;
&gt; +    free(malloc(1));

Looks like you left some testing code in.

Mostly good, but I&apos;d like to see one more rev.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174444</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-22 15:32:24 -0800</bug_when>
    <thetext>I&apos;ve gone through and changed all instances of Fullscreen to FS and fs in my code because it WAS making everything get very longwinded, especially WebVideoFullScreenHUDController! It&apos;s not so bad for other names (like fsScreen or something) but for consistency I changed them all.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174446</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-22 15:46:17 -0800</bug_when>
    <thetext>&gt; +    QTMovieWin* movie = reinterpret_cast&lt;QTMovieWin*&gt;(GetWindowLongPtr(theWnd, GWL_USERDATA));

&gt; Can we use static_cast here?

No, even though the call is GetWindowLongPtr() it returns a LONG (thanks to Microsoft&apos;s wonderful naming scheme), so you have to use reinterpret_cast to get it to be a pointer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>174472</commentid>
    <comment_count>13</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-12-22 16:40:56 -0800</bug_when>
    <thetext>&gt; &gt; @@ -159,6 +164,10 @@ QTMovieWinPrivate::QTMovieWinPrivate()
&gt; &gt;  #if !ASSERT_DISABLED
&gt; &gt;      , m_scaleCached(false)
&gt; &gt;  #endif
&gt; &gt; +    , m_fsWindow(0)
&gt; &gt; +    , m_fsOrigGWorld(0)
&gt; &gt; +    , m_fsClient(0)
&gt; &gt; +    , m_fsRestoreState(0)
&gt; 
&gt; Initialize m_fsRect?

I&apos;m not sure how to initialize a struct.

&gt; 
&gt; &gt; @@ -1040,7 +1049,7 @@ bool QTMovieWin::initializeQuickTime() 
&gt; &gt;      if (!initialized) {
&gt; &gt;          initialized = true;
&gt; &gt;          // Initialize and check QuickTime version
&gt; &gt; -        OSErr result = InitializeQTML(0);
&gt; &gt; +        OSErr result = InitializeQTML(kInitializeQTMLEnableDoubleBufferedSurface);
&gt; 
&gt; Does this have any impact on non-fullscreen video playback performance?

It doesn&apos;t seem to. I need to ask Eric when he gets back. I&apos;ve opened a bug (https://bugs.webkit.org/show_bug.cgi?id=32889)

&gt; &gt; +    // Set the size of the box to preserve aspect ratio
&gt; &gt; +    Rect rect = m_private-&gt;m_fsWindow-&gt;portRect;
&gt; &gt; +
&gt; &gt; +    float movieRatio = static_cast&lt;float&gt;(m_private-&gt;m_width) / m_private-&gt;m_height;
&gt; &gt; +    int windowWidth =  rect.right - rect.left;
&gt; &gt; +    int windowHeight = rect.bottom - rect.top;
&gt; &gt; +    float windowRatio = static_cast&lt;float&gt;(windowWidth) / windowHeight;
&gt; &gt; +    int actualWidth = (windowRatio &gt; movieRatio) ? (windowHeight * movieRatio) : windowWidth;
&gt; &gt; +    int actualHeight = (windowRatio &lt; movieRatio) ? (windowWidth / movieRatio) : windowHeight;
&gt; &gt; +    int offsetX = (windowWidth - actualWidth) / 2;
&gt; &gt; +    int offsetY = (windowHeight - actualHeight) / 2;
&gt; 
&gt; Ah, the old &quot;resize maintaining aspect ratio&quot; logic. I think we have that 3-4
&gt; times in WebKit. Maybe make a method on IntRect or FloatRect and use it?

If you can identify other places where it&apos;s used I&apos;d be happy to fix it in a separate bug :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176980</commentid>
    <comment_count>14</comment_count>
      <attachid>45851</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-01-04 18:07:30 -0800</bug_when>
    <thetext>Created attachment 45851
Replacement patch

This addresses all of Simon and Darin&apos;s comments. In particular, I&apos;ve collapsed WebVideoFSController and WebVideoFSHUDController into a single class FullscreenVideoController. The name is short enough to make MSDev happy and avoids abbreviations. And these two classes had a convoluted way of communicating with each other, so this also makes things a bit simpler.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>176985</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-04 18:12:55 -0800</bug_when>
    <thetext>Attachment 45851 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKit/win/FullscreenVideoController.h:39:  Inner-style forward declarations are invalid.  Remove this line.  [build/forward_decl] [5]
WebKit/win/FullscreenVideoController.h:139:  More than one command on the same line  [whitespace/newline] [4]
WebKit/win/WebView.cpp:34:  Alphabetical sorting problem.  [build/include_order] [4]
WebKit/win/WebView.cpp:92:  Alphabetical sorting problem.  [build/include_order] [4]
WebKit/win/WebView.cpp:5657:  An else should appear on the same line as the preceding }  [whitespace/newline] [4]
Total errors found: 5</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177340</commentid>
    <comment_count>16</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-01-05 13:15:23 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; &gt; &gt; @@ -159,6 +164,10 @@ QTMovieWinPrivate::QTMovieWinPrivate()
&gt; &gt; &gt;  #if !ASSERT_DISABLED
&gt; &gt; &gt;      , m_scaleCached(false)
&gt; &gt; &gt;  #endif
&gt; &gt; &gt; +    , m_fsWindow(0)
&gt; &gt; &gt; +    , m_fsOrigGWorld(0)
&gt; &gt; &gt; +    , m_fsClient(0)
&gt; &gt; &gt; +    , m_fsRestoreState(0)
&gt; &gt; 
&gt; &gt; Initialize m_fsRect?
&gt; 
&gt; I&apos;m not sure how to initialize a struct.

Is there a const empty rect value you can use? Or:
m_fsRect(0, 0, 0, 0) or  m_fsRect( { 0, 0, 0, 0 }) perhaps.
&gt; 
&gt; &gt; 
&gt; &gt; &gt; @@ -1040,7 +1049,7 @@ bool QTMovieWin::initializeQuickTime() 
&gt; &gt; &gt;      if (!initialized) {
&gt; &gt; &gt;          initialized = true;
&gt; &gt; &gt;          // Initialize and check QuickTime version
&gt; &gt; &gt; -        OSErr result = InitializeQTML(0);
&gt; &gt; &gt; +        OSErr result = InitializeQTML(kInitializeQTMLEnableDoubleBufferedSurface);
&gt; &gt; 
&gt; &gt; Does this have any impact on non-fullscreen video playback performance?
&gt; 
&gt; It doesn&apos;t seem to.

Did you look at Task Monitor to determine this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177420</commentid>
    <comment_count>17</comment_count>
      <attachid>45933</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-01-05 15:00:01 -0800</bug_when>
    <thetext>Created attachment 45933
Replacement patch

This resolves all the issues from the style bot and expands all the remaining &apos;fs&apos; names. The only ones left are in the icon filenames. If we rename those, it should be in a separate patch to avoid confusion.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177422</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-05 15:04:47 -0800</bug_when>
    <thetext>Attachment 45933 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKit/win/FullscreenVideoController.h:40:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Total errors found: 1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177630</commentid>
    <comment_count>19</comment_count>
      <attachid>45933</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-01-06 10:00:51 -0800</bug_when>
    <thetext>Comment on attachment 45933
Replacement patch

&gt; @@ -159,11 +161,17 @@ QTMovieWinPrivate::QTMovieWinPrivate()
&gt;  #if !ASSERT_DISABLED
&gt;      , m_scaleCached(false)
&gt;  #endif
&gt; +    , m_fullscreenWindow(0)
&gt; +    , m_fullscreenOrigGWorld(0)
&gt; +    , m_fullscreenClient(0)
&gt; +    , m_fullscreenRestoreState(0)
&gt;  {
&gt;  }

I think it would be good to initialize m_fullscreenRect, even if you can&apos;t do it in an initializer.

&gt; +LRESULT QTMovieWin::fullscreenWndProc(HWND wnd, UINT message, UINT wParam, LONG lParam)

Is there a reason not to use the WPARAM and LPARAM types here?

&gt; +{
&gt; +    QTMovieWin* movie = reinterpret_cast&lt;QTMovieWin*&gt;(GetWindowLongPtr(wnd, GWL_USERDATA));
&gt; +    return movie-&gt;m_private-&gt;m_fullscreenClient-&gt;fullscreenClientWndProc(wnd, message, wParam, lParam);
&gt; +}

It seems possible that this function could be called before you have set up the QTMovieWin pointer. Perhaps you should null-check movie before dereferencing it?

&gt; +HWND QTMovieWin::enterFullscreen(QTMovieWinFullscreenClient* client)
&gt; +{
&gt; +    m_private-&gt;m_fullscreenClient = client;
&gt; +    
&gt; +    BeginFullScreen(&amp;m_private-&gt;m_fullscreenRestoreState, 0, 0, 0, &amp;m_private-&gt;m_fullscreenWindow, 0, fullScreenAllowEvents); 

Where is fullScreenAllowEvents defined? I can&apos;t find it.

&gt; +    QTMLSetWindowWndProc(m_private-&gt;m_fullscreenWindow, fullscreenWndProc);
&gt; +    CreatePortAssociation(GetPortNativeWindow(m_private-&gt;m_fullscreenWindow), 0, 0L);

Is the L suffix really needed here?

&gt; +    GetMovieBox(m_private-&gt;m_movie, &amp;m_private-&gt;m_fullscreenRect);
&gt; +    GetMovieGWorld(m_private-&gt;m_movie, &amp;m_private-&gt;m_fullscreenOrigGWorld, 0);
&gt; +    SetMovieGWorld(m_private-&gt;m_movie, (CGrafPtr)m_private-&gt;m_fullscreenWindow, GetGWorldDevice((CGrafPtr)m_private-&gt;m_fullscreenWindow));

C++-style casts would be better here.

&gt; +    // Set the &apos;this&apos; pointer on the HWND
&gt; +    HWND wnd = static_cast&lt;HWND&gt;(GetPortNativeWindow(m_private-&gt;m_fullscreenWindow));
&gt; +    SetWindowLongPtr(wnd, GWL_USERDATA, (LONG)this);

A C++-style cast would be better.

It isn&apos;t safe to set GWL_USERDATA on a window of some unknown window class. QuickTime might be using GWL_USERDATA for its own purposes, or the window class might not reserve any space GWL_USERDATA at all!

A safe way to do this would be to use SetProp to set the pointer, GetProp to retrieve it, and RemoveProp to remove it when WM_DESTROY is received or when you&apos;re done with the window, whichever comes first.

&gt; +void QTMovieWin::exitFullscreen()
&gt; +{
&gt; +    if (!m_private-&gt;m_fullscreenWindow)
&gt; +        return;
&gt; +
&gt; +    HWND wnd = (HWND) GetPortNativeWindow(m_private-&gt;m_fullscreenWindow);

A C++-style cast would be better.

&gt; +    SetWindowLongPtr(wnd, GWL_USERDATA, 0);
&gt; +    DestroyPortAssociation((CGrafPtr) m_private-&gt;m_fullscreenWindow);

C++ cast, please.

&gt; +class QTMovieWinFullscreenClient {
&gt; +public:
&gt; +    virtual LRESULT fullscreenClientWndProc(HWND, UINT message, UINT wParam, LONG lParam) = 0;

Same question here about using WPARAM and LPARAM.

&gt; +++ WebKit/win/ChangeLog	(working copy)
&gt; @@ -1,3 +1,44 @@
&gt; +2010-01-04  Chris Marrin  &lt;cmarrin@apple.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Implement full-screen video for Windows
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=31318
&gt; +        
&gt; +        This adds a full-screen controller, FullscreenVideoController, 
&gt; +        which manages going in and out of full-screen. The acual 

Typo: acual

&gt; +        I&apos;ve also updated the icons to make them position correctly
&gt; +        in the HUD.

Seems strange that this had to be done by modifying the icons, as opposed to the code.

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

It&apos;s 2010, you know. :-)

&gt; +HUDButton::HUDButton(HUDButtonType type, const WebCore::IntPoint&amp; position)

No need for the WebCore:: qualifier here or anywhere else in this file.

&gt; +    : HUDWidget(IntRect(position, IntSize(0, 0)))

No need for the parameters to the IntSize constructor.

&gt; +    if (buttonResource) {
&gt; +        m_buttonImage = Image::loadPlatformResource(buttonResource);
&gt; +        m_buttonImage-&gt;ref();
&gt; +        m_rect.setWidth(m_buttonImage-&gt;width());
&gt; +        m_rect.setHeight(m_buttonImage-&gt;height());
&gt; +    }
&gt; +    if (buttonResourceAlt) {
&gt; +        m_buttonImageAlt = Image::loadPlatformResource(buttonResourceAlt);
&gt; +        m_buttonImageAlt-&gt;ref();
&gt; +    }

Seems like these extra ref()s are unnecessary and will lead to leaks.

&gt; +void HUDButton::draw(GraphicsContext&amp; context)
&gt; +{
&gt; +    if (m_showAltButton &amp;&amp; m_buttonImageAlt)
&gt; +        context.drawImage(m_buttonImageAlt.get(), DeviceColorSpace, m_rect.location());
&gt; +    else if (m_buttonImage)
&gt; +        context.drawImage(m_buttonImage.get(), DeviceColorSpace, m_rect.location());
&gt; +}

A local Image* variable might make this a little clearer.

&gt; +void HUDSlider::draw(WebCore::GraphicsContext&amp; context)
&gt; +{
&gt; +    // Draw gutter
&gt; +    IntSize radius(m_rect.height() / 2, m_rect.height() / 2);
&gt; +    context.fillRoundedRect(m_rect, radius, radius, radius, radius, Color(sliderGutterColor), DeviceColorSpace);
&gt; +
&gt; +    // Draw button
&gt; +    context.setStrokeColor(Color(sliderButtonColor), DeviceColorSpace);
&gt; +    context.setFillColor(Color(sliderButtonColor), DeviceColorSpace);
&gt; +
&gt; +    if (m_buttonShape == RoundButton)
&gt; +        context.drawEllipse(IntRect(m_rect.location().x() + m_sliderPosition, m_rect.location().y() - (m_buttonSize - m_rect.height()) / 2, m_buttonSize, m_buttonSize));
&gt; +    else {

An early return after drawEllipse would make this a bit cleaner.

&gt; +        // Draw a diamond
&gt; +        FloatPoint points[4];
&gt; +        float half = m_buttonSize / 2;

The right-hand side of this statement is doing integer math. Is that what you want?

&gt; +        points[0].setX(half + m_rect.location().x() + m_sliderPosition);
&gt; +        points[0].setY(m_rect.location().y());
&gt; +        points[1].setX(m_buttonSize + m_rect.location().x() + m_sliderPosition);
&gt; +        points[1].setY(half + m_rect.location().y());

I like to order expressions like this in left-to-right and bottom-to-top order, so:

points[1].setX(m_rect.location().x() + m_sliderPosition + m_buttonSize);
points[1].setY(m_rect.location().y() + half);

But that&apos;s really just a personal preference.

&gt; +void HUDSlider::drag(int x, int y, bool start)

Could you use an IntPoint here?

&gt; +{
&gt; +    if (start) {
&gt; +        // When we start, we need to snap the slider position to the x position if we clicked the gutter.
&gt; +        // But if we click the button, we need to drag relative to where we clicked down. We only need
&gt; +        // to check X because we would not even get here unless Y were already inside.
&gt; +        int relativeX = x - m_rect.location().x();
&gt; +        if (relativeX &gt;= m_sliderPosition &amp;&amp; relativeX &lt;= m_sliderPosition + m_buttonSize)
&gt; +            m_dragStartOffset = x - m_sliderPosition;
&gt; +        else
&gt; +            m_dragStartOffset = m_rect.location().x() + m_buttonSize / 2;
&gt; +    }
&gt; +
&gt; +    m_sliderPosition = x - m_dragStartOffset;
&gt; +    if (m_sliderPosition &lt; 0)
&gt; +        m_sliderPosition = 0;
&gt; +    else if (m_sliderPosition &gt; m_rect.width() - m_buttonSize)
&gt; +        m_sliderPosition = m_rect.width() - m_buttonSize;

min() and max() might make this a little clearer:

m_sliderPosition = max(0, min(m_rect.width() - m_buttonSize, m_sliderPosition));

&gt; +void FullscreenVideoController::setMediaElement(HTMLMediaElement* mediaElement)
&gt; +{
&gt; +    m_mediaElement = mediaElement;
&gt; +    if (!m_mediaElement) {
&gt; +        // Can&apos;t do full-screen, just get out
&gt; +        if (movie())
&gt; +            movie()-&gt;exitFullscreen();
&gt; +    }
&gt; +}

Calling our own exitFullscreen() function seems slightly better here.




&gt; +
&gt; +void FullscreenVideoController::enterFullscreen()
&gt; +{
&gt; +    if (movie()) {
&gt; +        m_videoWindow = movie()-&gt;enterFullscreen(this);
&gt; +    
&gt; +        RECT windowRect;
&gt; +        GetClientRect(m_videoWindow, &amp;windowRect);
&gt; +        m_fullscreenSize.setWidth(windowRect.right - windowRect.left + 1);
&gt; +        m_fullscreenSize.setHeight(windowRect.bottom - windowRect.top + 1);
&gt; +
&gt; +        createHUDWindow();
&gt; +    }
&gt; +}

An early return would get rid of the nesting here.

&gt; +void FullscreenVideoController::exitFullscreen()
&gt; +{
&gt; +    if (movie())
&gt; +        movie()-&gt;exitFullscreen();
&gt; +}

Do we need to clear m_videoWindow and destroy the HUD window here?

&gt; +const LPCWSTR fullscreenVideeoHUDWindowClassName = L&quot;fullscreenVideeoHUDWindowClass&quot;;

This should be marked static.

&gt; +void FullscreenVideoController::createHUDWindow()
&gt; +{
&gt; +    m_hudPosition.setX((m_fullscreenSize.width() - windowWidth) / 2);
&gt; +    m_hudPosition.setY(m_fullscreenSize.height() * 0.9 - windowHeight / 2);

I think you should use a constant for 0.9 here.

&gt; +static String timeToString(float time)
&gt; +{
&gt; +    if (!isfinite(time))
&gt; +        time = 0;
&gt; +    int seconds = fabsf(time); 
&gt; +    int hours = seconds / (60 * 60);
&gt; +    int minutes = (seconds / 60) % 60;
&gt; +    seconds %= 60;
&gt; +
&gt; +    if (hours) {
&gt; +        if (hours &gt; 9)
&gt; +            return String::format(&quot;%s%02d:%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), hours, minutes, seconds);
&gt; +        return String::format(&quot;%s%01d:%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), hours, minutes, seconds);
&gt; +    }
&gt; +
&gt; +    return String::format(&quot;%s%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), minutes, seconds);
&gt; +}

Do we need to localize these format strings?

&gt; +void FullscreenVideoController::draw()
&gt; +{
&gt; +    HDC windowDC = GetDC(m_hudWindow);
&gt; +    HDC bitmapDC = CreateCompatibleDC(windowDC);
&gt; +    SelectObject(bitmapDC, m_bitmap.get());
&gt; +
&gt; +    GraphicsContext context(bitmapDC, true);
&gt; +
&gt; +    context.save();

Do we really need to save the context just after creating it?

&gt; +    // Draw the background
&gt; +    IntSize outerRadius(borderRadius, borderRadius);
&gt; +    IntRect outerSize(0, 0, windowWidth, windowHeight);
&gt; +    IntSize innerRadius(borderRadius - borderThickness, borderRadius - borderThickness);
&gt; +    IntRect innerSize(borderThickness, borderThickness, windowWidth - borderThickness * 2, windowHeight - borderThickness * 2);

It&apos;s strange to have IntRect variables with names that end in &quot;Size&quot;.

&gt; +    // Left string
&gt; +    s = timeToString(currentTime());
&gt; +    TextRun leftText(s);
&gt; +    context.setFillColor(Color(textColor), DeviceColorSpace);
&gt; +    context.drawText(font, leftText, IntPoint(windowWidth / 2 - timeSliderWidth / 2 - margin - font.width(leftText), windowHeight - margin - sliderHeight / 2 + 3));
&gt; +
&gt; +    // Right string
&gt; +    s = timeToString(currentTime() - duration());
&gt; +    TextRun rightText(s);
&gt; +    context.setFillColor(Color(textColor), DeviceColorSpace);
&gt; +    context.drawText(font, rightText, IntPoint(windowWidth / 2 + timeSliderWidth / 2 + margin, windowHeight - margin - sliderHeight / 2 + 3));

What are these &quot;+ 3&quot;s for? Can the 3 be put in a constant?

&gt; +    // Copy to the window
&gt; +    BLENDFUNCTION blendFunction = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
&gt; +    SIZE size = { windowWidth, windowHeight };
&gt; +    POINT sourcePoint = {0, 0};
&gt; +    POINT destPoint = { m_hudPosition.x(), m_hudPosition.y() };
&gt; +    BOOL result = UpdateLayeredWindow(m_hudWindow, windowDC, &amp;destPoint, &amp;size, bitmapDC, &amp;sourcePoint, 0, &amp;blendFunction, ULW_ALPHA);

The second parameter to UpdateLayeredWindow is supposed to be a DC for the screen, not for the window. But you can just pass in 0 instead.

The result variable is unused, which might cause problems in release builds.

&gt; +    DWORD error = GetLastError();

I think this code shouldn&apos;t be checked in.

&gt; +LRESULT FullscreenVideoController::hudWndProc(HWND wnd, UINT message, UINT wParam, LONG lParam)
&gt; +{
&gt; +    LONG_PTR longPtr = GetWindowLongPtr(wnd, 0);
&gt; +    FullscreenVideoController* controller = reinterpret_cast&lt;FullscreenVideoController*&gt;(longPtr);
&gt; +    if (!controller)
&gt; +        return DefWindowProc(wnd, message, wParam, lParam);
&gt; +
&gt; +    switch (message) {
&gt; +    case WM_PAINT:
&gt; +        PAINTSTRUCT ps;
&gt; +        BeginPaint(wnd, &amp;ps);
&gt; +        controller-&gt;draw();
&gt; +        EndPaint(wnd, &amp;ps);
&gt; +        break;

As &lt;http://msdn.microsoft.com/en-us/library/ms997507.aspx&gt; says, you don&apos;t need to respond to WM_PAINT.

&gt; +void FullscreenVideoController::onChar(int c)
&gt; +{
&gt; +    if (c == 0x1b) {
&gt; +        // ESC exits full-screen
&gt; +        if (m_mediaElement)
&gt; +            m_mediaElement-&gt;exitFullscreen();
&gt; +    } else if (c == 0x20) {
&gt; +        // SPACE toggles play/pause
&gt; +        togglePlay();
&gt; +    }
&gt; +}

VK_ESCAPE and VK_SPACE would be better than 0x1b and 0x20, respectively.

&gt; +void FullscreenVideoController::onMouseDown(int x, int y)
&gt; +{
&gt; +    fullScreenToHUDCoordinates(x, y);
&gt; +
&gt; +    // Don&apos;t bother hit testing if we&apos;re outside the bounds of the window
&gt; +    if (x &lt; 0 || x &gt;= windowWidth || y &lt; 0 || y &gt;= windowHeight)
&gt; +        return;
&gt; +
&gt; +    m_pickedWidget = 0;

I think a name like m_mouseDownWidget or m_pressedWidget might be clearer.

&gt; +void FullscreenVideoController::onMouseMove(int x, int y)
&gt; +{
&gt; +    fullScreenToHUDCoordinates(x, y);
&gt; +
&gt; +    if (m_pickedWidget) {
&gt; +        m_pickedWidget-&gt;drag(x, y, false);
&gt; +        if (m_pickedWidget == &amp;m_volumeSlider)
&gt; +            setVolume(m_volumeSlider.value());
&gt; +        else if (m_pickedWidget == &amp;m_timeSlider)
&gt; +            setCurrentTime(m_timeSlider.value() * duration());
&gt; +        draw();
&gt; +    } else if (m_movingWindow) {
&gt; +        m_hudPosition.move(x - m_moveOffset.x(), y - m_moveOffset.y());
&gt; +        draw();
&gt; +    }

Why do we have to redraw when we&apos;re just moving the HUD window?

&gt; +void FullscreenVideoController::onMouseUp(int x, int y)
&gt; +{
&gt; +    fullScreenToHUDCoordinates(x, y);
&gt; +    m_movingWindow = false;
&gt; +
&gt; +    // We are running a timer during mouse moves. We want to also run it
&gt; +    // while the video is playing to update the time slider. So don&apos;t stop
&gt; +    // it if the video is running
&gt; +    if (canPlay())
&gt; +        m_timer.stop();
&gt; +
&gt; +    if (m_pickedWidget) {
&gt; +        if (m_playPauseButton.hitTest(x, y))
&gt; +            togglePlay();

If I press the mouse down on one button, drag over to another button, and then release the mouse, this code will activate the dragged-to button. Is that what we want?

&gt; +        else if (m_volumeUpButton.hitTest(x, y)) {
&gt; +            setVolume(1);
&gt; +            m_volumeSlider.setValue(1);
&gt; +        } else if (m_volumeDownButton.hitTest(x, y)) {
&gt; +            setVolume(0);
&gt; +            m_volumeSlider.setValue(0);
&gt; +        } else if (m_pickedWidget == &amp;m_timeSlider)
&gt; +            endScrubbing();
&gt; +        else if (m_exitFullscreenButton.hitTest(x, y)) {
&gt; +            if (m_mediaElement)
&gt; +                m_mediaElement-&gt;exitFullscreen();
&gt; +            return;
&gt; +        }
&gt; +    }
&gt; +
&gt; +    m_pickedWidget = 0;
&gt; +    draw();
&gt; +}

Why don&apos;t we want to clear m_pickedWidget in the &quot;exit fullscreen&quot; case?

&gt; Property changes on: WebKit/win/FullscreenVideoController.cpp
&gt; ___________________________________________________________________
&gt; Added: svn:executable
&gt;    + *

Please remove this property.

&gt; +    HUDWidget(const WebCore::IntRect&amp; rect)
&gt; +        : m_rect(rect)
&gt; +    { }

Either put the entire constructor on a single line, or put each brace on its own line.

&gt; +    HUDButton(HUDButtonType type, const WebCore::IntPoint&amp;);

No need for the &quot;type&quot; parameter name here.

&gt; +class HUDSlider : public HUDWidget {
&gt; +public:
&gt; +    enum HUDSliderButtonShape { RoundButton, DiamondButton };
&gt; +
&gt; +    HUDSlider(HUDSliderButtonShape, int buttonSize, const WebCore::IntRect&amp; rect);
&gt; +    ~HUDSlider() { }
&gt; +
&gt; +    virtual void draw(WebCore::GraphicsContext&amp;);
&gt; +    virtual void drag(int x, int y, bool start);
&gt; +    float value() const { return static_cast&lt;float&gt;(m_sliderPosition) / (m_rect.width() - m_buttonSize); }
&gt; +    void setValue(float value) { m_sliderPosition = static_cast&lt;int&gt;(value * (m_rect.width() - m_buttonSize)); }
&gt; +
&gt; +private:
&gt; +    HUDSliderButtonShape m_buttonShape;
&gt; +    int m_buttonSize;
&gt; +    int m_sliderPosition;

I think it would be better to name this variable m_buttonPosition. The whole class is the slider, so it seems weird for it to keep track of a &quot;slider position&quot;.

&gt; +    RefPtr&lt;WebCore::HTMLMediaElement&gt; m_mediaElement;
&gt; +
&gt; +    HWND m_hudWindow, m_videoWindow;
&gt; +    OwnPtr&lt;HBITMAP&gt; m_bitmap;
&gt; +    WebCore::IntSize m_fullscreenSize;
&gt; +    WebCore::IntPoint m_hudPosition;
&gt; +
&gt; +    // HUD Support
&gt; +    void fullScreenToHUDCoordinates(int&amp; x, int&amp; y) const
&gt; +    {
&gt; +        x -= m_hudPosition.x();
&gt; +        y -= m_hudPosition.y();
&gt; +    }

Can this take and return an IntPoint?

We normally put all data members after all function members.

&gt; +    static void registerHUDWindowClass();
&gt; +    static LRESULT CALLBACK hudWndProc(HWND, UINT message, WPARAM wParam, LPARAM lParam);

No need for the &quot;wParam&quot; and &quot;lParam&quot; parmeter names.

&gt; +    void onMouseDown(int x, int y);
&gt; +    void onMouseMove(int x, int y);
&gt; +    void onMouseUp(int x, int y);

Can these take IntPoints?

&gt; Property changes on: WebKit/win/FullscreenVideoController.h
&gt; ___________________________________________________________________
&gt; Added: svn:executable
&gt;    + *

Please remove this property.

&gt; +void WebView::enterFullscreenForNode(Node* node)
&gt; +{
&gt; +    if (!node-&gt;hasTagName(WebCore::HTMLNames::videoTag))
&gt; +        return;

No need for the &quot;WebCore::&quot; qualifier here.

&gt; +    HTMLMediaElement* videoElement = static_cast&lt;HTMLMediaElement*&gt;(node);
&gt; +
&gt; +    if (m_fullscreenController) {
&gt; +        if (m_fullscreenController-&gt;mediaElement() == videoElement) {
&gt; +            // The backend may just warn us that the underlaying plaftormMovie()
&gt; +            // has changed. Just force an update.
&gt; +            m_fullscreenController-&gt;setMediaElement(videoElement);
&gt; +            return; // No more to do.
&gt; +        }
&gt; +
&gt; +        // First exit Fullscreen for the old mediaElement.
&gt; +        m_fullscreenController-&gt;mediaElement()-&gt;exitFullscreen();
&gt; +        // This previous call has to trigger exitFullscreen,
&gt; +        // which has to clear m_fullscreenController.
&gt; +        ASSERT(!m_fullscreenController);
&gt; +    }
&gt; +    if (!m_fullscreenController) {

Given the first if and the assertion above, this if is guaranteed to be true, right?

&gt; +        m_fullscreenController = new FullscreenVideoController();

No need for the () here.

&gt; +bool WebChromeClient::supportsFullscreenForNode(const Node* node)
&gt; +{
&gt; +    return node-&gt;hasTagName(WebCore::HTMLNames::videoTag);
&gt; +}

No need for the &quot;WebCore::&quot; qualifier here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177905</commentid>
    <comment_count>20</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-01-06 18:08:47 -0800</bug_when>
    <thetext>&gt; &gt; +static String timeToString(float time)
&gt; &gt; +{
&gt; &gt; +    if (!isfinite(time))
&gt; &gt; +        time = 0;
&gt; &gt; +    int seconds = fabsf(time); 
&gt; &gt; +    int hours = seconds / (60 * 60);
&gt; &gt; +    int minutes = (seconds / 60) % 60;
&gt; &gt; +    seconds %= 60;
&gt; &gt; +
&gt; &gt; +    if (hours) {
&gt; &gt; +        if (hours &gt; 9)
&gt; &gt; +            return String::format(&quot;%s%02d:%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), hours, minutes, seconds);
&gt; &gt; +        return String::format(&quot;%s%01d:%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), hours, minutes, seconds);
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    return String::format(&quot;%s%02d:%02d&quot;, (time &lt; 0 ? &quot;-&quot; : &quot;&quot;), minutes, seconds);
&gt; &gt; +}
&gt; 
&gt; Do we need to localize these format strings?

This is a duplicate of code in MediaControlTimeDisplayElement, which doesn&apos;t do any localization. There is a bug opened to unify these (https://bugs.webkit.org/show_bug.cgi?id=33281)

&gt; 
&gt; &gt; +void FullscreenVideoController::draw()
&gt; &gt; +{
&gt; &gt; +    HDC windowDC = GetDC(m_hudWindow);
&gt; &gt; +    HDC bitmapDC = CreateCompatibleDC(windowDC);
&gt; &gt; +    SelectObject(bitmapDC, m_bitmap.get());
&gt; &gt; +
&gt; &gt; +    GraphicsContext context(bitmapDC, true);
&gt; &gt; +
&gt; &gt; +    context.save();
&gt; 
&gt; Do we really need to save the context just after creating it?

This was recommended by Simon as the desired style.

&gt; &gt; +void FullscreenVideoController::onMouseDown(int x, int y)
&gt; &gt; +{
&gt; &gt; +    fullScreenToHUDCoordinates(x, y);
&gt; &gt; +
&gt; &gt; +    // Don&apos;t bother hit testing if we&apos;re outside the bounds of the window
&gt; &gt; +    if (x &lt; 0 || x &gt;= windowWidth || y &lt; 0 || y &gt;= windowHeight)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    m_pickedWidget = 0;
&gt; 
&gt; I think a name like m_mouseDownWidget or m_pressedWidget might be clearer.

I named it m_hitWidget, riffing off the change I made for Simon from isPicked() to hitTest().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177906</commentid>
    <comment_count>21</comment_count>
      <attachid>46014</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-01-06 18:10:45 -0800</bug_when>
    <thetext>Created attachment 46014
Patch with Adam&apos;s issues addressed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>177907</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-06 18:15:21 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 46014 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178391</commentid>
    <comment_count>23</comment_count>
      <attachid>46014</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-01-07 14:42:48 -0800</bug_when>
    <thetext>Comment on attachment 46014
Patch with Adam&apos;s issues addressed

This patch has no ChangeLogs!

&gt; +LRESULT QTMovieWin::fullscreenWndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam)
&gt; +{
&gt; +    QTMovieWin* movie = reinterpret_cast&lt;QTMovieWin*&gt;(GetProp(wnd, fullscreenQTMovieWinPointerProp));

I think static_cast will work here, since HANDLE is just a void*.

&gt; +    // Set the &apos;this&apos; pointer on the HWND
&gt; +    HWND wnd = static_cast&lt;HWND&gt;(GetPortNativeWindow(m_private-&gt;m_fullscreenWindow));
&gt; +    SetProp(wnd, fullscreenQTMovieWinPointerProp, reinterpret_cast&lt;HANDLE&gt;(this));

...and here.

&gt; +class QTMovieWinFullscreenClient {
&gt; +public:
&gt; +    virtual LRESULT fullscreenClientWndProc(HWND, UINT message, WPARAM wParam, LPARAM lParam) = 0;

No need for the wParam and lParam parameter names.

&gt; +void HUDSlider::drag(IntPoint point, bool start)

point can be a reference-to-const (const IntPoint&amp;). (Sorry for not being explicit about this last time.)

&gt; +FullscreenVideoController::~FullscreenVideoController()
&gt; +{
&gt; +    if (movie())
&gt; +        movie()-&gt;exitFullscreen();
&gt; +
&gt; +    m_bitmap.clear();
&gt; +}

m_bitmap.clear() will happen automatically in OwnPtr&apos;s destructor.

&gt; +void FullscreenVideoController::setMediaElement(HTMLMediaElement* mediaElement)
&gt; +{
&gt; +    m_mediaElement = mediaElement;
&gt; +    if (!m_mediaElement) {
&gt; +        // Can&apos;t do full-screen, just get out
&gt; +        exitFullscreen();
&gt; +    }
&gt; +}

Is it safe for someone to call setMediaElement(0) twice in a row? Will exitFullscreen() do something bad in that case?

The normal way we avoid this is to check to see that the media element is actually changing:

if (mediaElement == m_mediaElement)
    return;
...do the rest...

&gt; +void FullscreenVideoController::enterFullscreen()
&gt; +{
&gt; +    if (!movie())
&gt; +        return;
&gt; +
&gt; +    m_videoWindow = movie()-&gt;enterFullscreen(this);
&gt; +
&gt; +    RECT windowRect;
&gt; +    GetClientRect(m_videoWindow, &amp;windowRect);
&gt; +    m_fullscreenSize.setWidth(windowRect.right - windowRect.left + 1);
&gt; +    m_fullscreenSize.setHeight(windowRect.bottom - windowRect.top + 1);

What&apos;s with the &quot;+ 1&quot;s here?

&gt; +void FullscreenVideoController::exitFullscreen()
&gt; +{
&gt; +    if (movie())
&gt; +        movie()-&gt;exitFullscreen();
&gt; +
&gt; +    m_videoWindow = 0;
&gt; +    SetWindowLongPtr(m_hudWindow, 0, 0);
&gt; +    DestroyWindow(m_hudWindow);
&gt; +}

Seems like we should clear out m_hudWindow at this point.

&gt; +void FullscreenVideoController::registerHUDWindowClass()
&gt; +{
&gt; +    static bool haveRegisteredHUDWindowClass = false;

We normally omit the &quot;= false&quot; on statics like this, since it happens automatically.

&gt; +void FullscreenVideoController::createHUDWindow()
&gt; +{
&gt; +    m_hudPosition.setX((m_fullscreenSize.width() - windowWidth) / 2);
&gt; +    m_hudPosition.setY(m_fullscreenSize.height() * initialHUDPositionY - windowHeight / 2);
&gt; +
&gt; +    // Local variable that will hold the returned pixels. No need to cleanup this value. It
&gt; +    // will get cleaned up when m_bitmap is destroyed in the dtor
&gt; +    void* pixels;
&gt; +    BitmapInfo bitmapInfo = BitmapInfo::createBottomUp(IntSize(windowWidth, windowHeight));
&gt; +    m_bitmap.set(::CreateDIBSection(0, &amp;bitmapInfo, DIB_RGB_COLORS, &amp;pixels, 0, 0));
&gt; +    
&gt; +    // Dirty the window so the HUD draws
&gt; +    RECT clearRect = { m_hudPosition.x(), m_hudPosition.y(), m_hudPosition.x() + windowWidth - 1, m_hudPosition.y() + windowHeight - 1 };

What&apos;s with these &quot;- 1&quot;s?

&gt; +void FullscreenVideoController::draw()
&gt; +{
&gt; +    HDC windowDC = GetDC(m_hudWindow);
&gt; +    HDC bitmapDC = CreateCompatibleDC(windowDC);

You can release windowDC right here.

&gt; +    bool hitTest(WebCore::IntPoint point) const { return point.x() &gt;= m_rect.x() &amp;&amp; point.x() &lt; m_rect.x() + m_rect.width() &amp;&amp; point.y() &gt;= m_rect.y() &amp;&amp; point.y() &lt; m_rect.y() + m_rect.height(); }

point can be a reference-to-const. I think you can just use IntRect::contains.

&gt; +    virtual void drag(WebCore::IntPoint, bool start) { }

You should use a reference-to-const.

&gt; +    WebCore::IntPoint fullScreenToHUDCoordinates(WebCore::IntPoint point) const
&gt; +    {
&gt; +        return WebCore::IntPoint(point.x()- m_hudPosition.x(), point.y() - m_hudPosition.y());
&gt; +    }

point can be a reference-to-const.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178462</commentid>
    <comment_count>24</comment_count>
      <attachid>46102</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-01-07 17:37:37 -0800</bug_when>
    <thetext>Created attachment 46102
Another replacement patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178466</commentid>
    <comment_count>25</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-07 17:43:12 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 46102 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178675</commentid>
    <comment_count>26</comment_count>
      <attachid>46102</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-01-08 07:58:17 -0800</bug_when>
    <thetext>Comment on attachment 46102
Another replacement patch

&gt; +    static LRESULT fullscreenWndProc(HWND, UINT message, WPARAM wParam, LPARAM lParam);

No need for the wParam and lParam parameter names.

&gt; +    bool hitTest(const WebCore::IntPoint&amp; point) const { return point.x() &gt;= m_rect.x() &amp;&amp; point.x() &lt; m_rect.x() + m_rect.width() &amp;&amp; point.y() &gt;= m_rect.y() &amp;&amp; point.y() &lt; m_rect.y() + m_rect.height(); }

I still think this could just be: return m_rect.contains(point);

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178722</commentid>
    <comment_count>27</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-01-08 11:25:11 -0800</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/52998</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>42898</attachid>
            <date>2009-11-10 14:39:07 -0800</date>
            <delta_ts>2009-12-22 13:59:06 -0800</delta_ts>
            <desc>Unfinished patch</desc>
            <filename>31318.patch</filename>
            <type>text/plain</type>
            <size>42907</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC93aW4vV2ViVmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9X
ZWJWaWV3LmNwcAkocmV2aXNpb24gNTA0NzApCisrKyBXZWJLaXQvd2luL1dlYlZpZXcuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAiV2ViTm90aWZpY2F0aW9u
Q2VudGVyLmgiCiAjaW5jbHVkZSAiV2ViUGx1Z2luSGFsdGVyQ2xpZW50LmgiCiAjaW5jbHVkZSAi
V2ViUHJlZmVyZW5jZXMuaCIKKyNpbmNsdWRlICJXZWJWaWRlb0Z1bGxzY3JlZW5Db250cm9sbGVy
LmgiCiAjaW5jbHVkZSAiV2luZG93c1RvdWNoLmgiCiAjcHJhZ21hIHdhcm5pbmcoIHB1c2gsIDAg
KQogI2luY2x1ZGUgPFdlYkNvcmUvQXBwbGljYXRpb25DYWNoZVN0b3JhZ2UuaD4KQEAgLTgyLDYg
KzgzLDcgQEAKICNpbmNsdWRlIDxXZWJDb3JlL0hpc3RvcnlJdGVtLmg+CiAjaW5jbHVkZSA8V2Vi
Q29yZS9IaXRUZXN0UmVxdWVzdC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvSGl0VGVzdFJlc3VsdC5o
PgorI2luY2x1ZGUgPFdlYkNvcmUvSFRNTE5hbWVzLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9JbnRS
ZWN0Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9LZXlib2FyZEV2ZW50Lmg+CiAjaW5jbHVkZSA8V2Vi
Q29yZS9MYW5ndWFnZS5oPgpAQCAtMzIyLDYgKzMyNCw3IEBACiAsIG1fbGFzdFBhblkoMCkKICwg
bV94T3ZlcnBhbigwKQogLCBtX3lPdmVycGFuKDApCissIG1fZnVsbHNjcmVlbkNvbnRyb2xsZXIo
MCkKIHsKICAgICBKU0M6OmluaXRpYWxpemVUaHJlYWRpbmcoKTsKIApAQCAtNTQ2OSw2ICs1NDcy
LDQyIEBACiAgICAgcmV0dXJuIFNfT0s7CiB9CiAKK3ZvaWQgV2ViVmlldzo6ZW50ZXJGdWxsc2Ny
ZWVuRm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIEFTU0VSVChub2RlLT5oYXNUYWdOYW1lKFdl
YkNvcmU6OkhUTUxOYW1lczo6dmlkZW9UYWcpKTsKKyAgICBIVE1MTWVkaWFFbGVtZW50KiB2aWRl
b0VsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obm9kZSk7CisKKyAgICBp
ZiAobV9mdWxsc2NyZWVuQ29udHJvbGxlcikgeworICAgICAgICBpZiAobV9mdWxsc2NyZWVuQ29u
dHJvbGxlci0+bWVkaWFFbGVtZW50KCkgPT0gdmlkZW9FbGVtZW50KSB7CisgICAgICAgICAgICAv
LyBUaGUgYmFja2VuZCBtYXkganVzdCB3YXJuIHVzIHRoYXQgdGhlIHVuZGVybGF5aW5nIHBsYWZ0
b3JtTW92aWUoKQorICAgICAgICAgICAgLy8gaGFzIGNoYW5nZWQuIEp1c3QgZm9yY2UgYW4gdXBk
YXRlLgorICAgICAgICAgICAgbV9mdWxsc2NyZWVuQ29udHJvbGxlci0+c2V0TWVkaWFFbGVtZW50
KHZpZGVvRWxlbWVudCk7CisgICAgICAgICAgICByZXR1cm47IC8vIE5vIG1vcmUgdG8gZG8uCisg
ICAgICAgIH0KKworICAgICAgICAvLyBGaXJzdCBleGl0IEZ1bGxzY3JlZW4gZm9yIHRoZSBvbGQg
bWVkaWFFbGVtZW50LgorICAgICAgICBtX2Z1bGxzY3JlZW5Db250cm9sbGVyLT5tZWRpYUVsZW1l
bnQoKS0+ZXhpdEZ1bGxzY3JlZW4oKTsKKyAgICAgICAgLy8gVGhpcyBwcmV2aW91cyBjYWxsIGhh
cyB0byB0cmlnZ2VyIGV4aXRGdWxsc2NyZWVuLAorICAgICAgICAvLyB3aGljaCBoYXMgdG8gY2xl
YXIgbV9mdWxsc2NyZWVuQ29udHJvbGxlci4KKyAgICAgICAgQVNTRVJUKCFtX2Z1bGxzY3JlZW5D
b250cm9sbGVyKTsKKyAgICB9CisgICAgaWYgKCFtX2Z1bGxzY3JlZW5Db250cm9sbGVyKSB7Cisg
ICAgICAgIG1fZnVsbHNjcmVlbkNvbnRyb2xsZXIgPSBuZXcgV2ViVmlkZW9GdWxsc2NyZWVuQ29u
dHJvbGxlcigpOworICAgICAgICBtX2Z1bGxzY3JlZW5Db250cm9sbGVyLT5zZXRNZWRpYUVsZW1l
bnQodmlkZW9FbGVtZW50KTsKKyAgICAgICAgbV9mdWxsc2NyZWVuQ29udHJvbGxlci0+ZW50ZXJG
dWxsc2NyZWVuKCk7ICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgICAgICBtX2Z1bGxzY3Jl
ZW5Db250cm9sbGVyLT5zZXRNZWRpYUVsZW1lbnQodmlkZW9FbGVtZW50KTsKK30KKwordm9pZCBX
ZWJWaWV3OjpleGl0RnVsbHNjcmVlbigpCit7CisgICAgaWYgKG1fZnVsbHNjcmVlbkNvbnRyb2xs
ZXIpCisgICAgICAgIG1fZnVsbHNjcmVlbkNvbnRyb2xsZXItPmV4aXRGdWxsc2NyZWVuKCk7Cisg
ICAgZGVsZXRlIG1fZnVsbHNjcmVlbkNvbnRyb2xsZXI7CisgICAgbV9mdWxsc2NyZWVuQ29udHJv
bGxlciA9IDA7Cit9CisKIHN0YXRpYyBQYXNzT3duUHRyPFZlY3RvcjxTdHJpbmc+ID4gdG9TdHJp
bmdWZWN0b3IodW5zaWduZWQgcGF0dGVybnNDb3VudCwgQlNUUiogcGF0dGVybnMpCiB7CiAgICAg
Ly8gQ29udmVydCB0aGUgcGF0dGVybnMgaW50byBhIFZlY3Rvci4KSW5kZXg6IFdlYktpdC93aW4v
V2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxlci5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L3dpbi9XZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9sbGVyLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYktpdC93aW4vV2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJv
bGxlci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDU0IEBACisvKg0KKyAqIENvcHlyaWdo
dCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQNCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMNCisgKiBhcmUgbWV0Og0KKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLg0KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uDQorICoNCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVS
LCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZDQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVINCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1INCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwNCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sDQorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SDQorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQ0KKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIA0KKyAqLw0KKw0KKyNpbmNsdWRlICJjb25maWcuaCINCisNCisjaWYgRU5BQkxFKFZJ
REVPKQ0KKw0KKyNpbmNsdWRlICJXZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9sbGVy
LmgiDQorDQorI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNl
cy5oPg0KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJm
YWNlLmg+DQorDQorI2luY2x1ZGUgPFdlYkNvcmUvQml0bWFwSW5mby5oPg0KKyNpbmNsdWRlIDxX
ZWJDb3JlL0dyYXBoaWNzQ29udGV4dC5oPg0KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+
CisNCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsNCisNCisvLyBIVUQgU2l6ZQ0KK3N0YXRpYyBj
b25zdCBpbnQga1dpbmRvd0hlaWdodCA9IDU5Ow0KK3N0YXRpYyBjb25zdCBpbnQga1dpbmRvd1dp
ZHRoID0gNDM4Ow0KKw0KKy8vIE1hcmdpbnMgYW5kIGJ1dHRvbiBzaXplcw0KK3N0YXRpYyBjb25z
dCBpbnQga01hcmdpbiA9IDk7DQorc3RhdGljIGNvbnN0IGludCBrTWFyZ2luVG9wID0gOTsNCitz
dGF0aWMgY29uc3QgaW50IGtCdXR0b25TaXplID0gMjU7DQorc3RhdGljIGNvbnN0IGludCBrQnV0
dG9uTWluaVNpemUgPSAxNjsNCitzdGF0aWMgY29uc3QgaW50IGtWb2x1bWVTbGlkZXJXaWR0aCA9
IDUwOw0KKw0KKy8vIEJ1dHRvbiBwb3NpdGlvbnMNCitzdGF0aWMgY29uc3QgSW50UG9pbnQga1Bs
YXlQYXVzZUJ1dHRvblBvaW50KChrV2luZG93V2lkdGggLSBrQnV0dG9uU2l6ZSkgLyAyLCBrTWFy
Z2luVG9wKTsNCitzdGF0aWMgY29uc3QgSW50UG9pbnQga1ZvbHVtZVVwQnV0dG9uUG9pbnQoa01h
cmdpbiArIGtCdXR0b25NaW5pU2l6ZSArIGtWb2x1bWVTbGlkZXJXaWR0aCArIGtCdXR0b25NaW5p
U2l6ZSAvIDIsIGtNYXJnaW5Ub3AgKyAoa0J1dHRvblNpemUgLSBrQnV0dG9uTWluaVNpemUpIC8g
Mik7DQorc3RhdGljIGNvbnN0IEludFBvaW50IGtWb2x1bWVEb3duQnV0dG9uUG9pbnQoa01hcmdp
biwga01hcmdpblRvcCArIChrQnV0dG9uU2l6ZSAtIGtCdXR0b25NaW5pU2l6ZSkgLyAyKTsNCitz
dGF0aWMgY29uc3QgSW50UG9pbnQga0V4aXRGdWxsc2NyZWVuQnV0dG9uUG9pbnQoa1dpbmRvd1dp
ZHRoIC0gMiAqIGtNYXJnaW4gLSBrQnV0dG9uTWluaVNpemUsIGtNYXJnaW5Ub3AgKyAoa0J1dHRv
blNpemUgLSBrQnV0dG9uTWluaVNpemUpIC8gMik7DQorDQorLy8gQmFja2dyb3VuZCB2YWx1ZXMN
CitzdGF0aWMgY29uc3QgaW50IGtCb3JkZXJSYWRpdXMgPSAxMjsNCitzdGF0aWMgY29uc3QgaW50
IGtCb3JkZXJUaGlja25lc3MgPSAyOw0KK3N0YXRpYyBjb25zdCBJbnRTaXplIGtPdXRlclJhZGl1
cyhrQm9yZGVyUmFkaXVzLCBrQm9yZGVyUmFkaXVzKTsNCitzdGF0aWMgY29uc3QgSW50UmVjdCBr
T3V0ZXJTaXplKDAsMCxrV2luZG93V2lkdGgsa1dpbmRvd0hlaWdodCk7DQorc3RhdGljIGNvbnN0
IEludFNpemUga0lubmVyUmFkaXVzKGtCb3JkZXJSYWRpdXMgLSBrQm9yZGVyVGhpY2tuZXNzLCBr
Qm9yZGVyUmFkaXVzIC0ga0JvcmRlclRoaWNrbmVzcyk7DQorc3RhdGljIGNvbnN0IEludFJlY3Qg
a0lubmVyU2l6ZShrQm9yZGVyVGhpY2tuZXNzLCBrQm9yZGVyVGhpY2tuZXNzLCBrV2luZG93V2lk
dGggLSBrQm9yZGVyVGhpY2tuZXNzICogMixrV2luZG93SGVpZ2h0IC0ga0JvcmRlclRoaWNrbmVz
cyAqIDIpOw0KKw0KKy8vIENvbG9ycw0KK3N0YXRpYyBjb25zdCBDb2xvciBrQmFja2dyb3VuZENv
bG9yKDB4RkYyMDIwMjApOw0KK3N0YXRpYyBjb25zdCBDb2xvciBrQm9yZGVyQ29sb3IoMHhGRkEw
QTBBMCk7DQorc3RhdGljIGNvbnN0IENvbG9yIGtUZXh0Q29sb3IoMHhGRkZGRkZGRik7DQorDQor
SFVEQnV0dG9uOjpIVURCdXR0b24oV2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxl
cipjbGllbnQsIEhVREJ1dHRvblR5cGUgdHlwZSwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIHBv
c2l0aW9uKQ0KKyA6IG1fd2lkdGgoMCkNCisgLCBtX2hlaWdodCgwKQ0KKyAsIG1fcG9zaXRpb24o
cG9zaXRpb24pDQorICwgbV90eXBlKHR5cGUpDQorew0KKyAgICBjb25zdCBjaGFyKiBidXR0b25S
ZXNvdXJjZSA9IDA7DQorICAgIGNvbnN0IGNoYXIqIGJ1dHRvblByZXNzZWRSZXNvdXJjZSA9IDA7
DQorICAgIHN3aXRjaChtX3R5cGUpIHsNCisgICAgICAgIA0KKyAgICAgICAgY2FzZSBQbGF5UGF1
c2VCdXR0b246DQorICAgICAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAicGFuSWNvbiI7DQorICAg
ICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRpbWVTbGlkZXJCdXR0b246DQorICAgICAg
ICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFZvbHVtZVVwQnV0dG9uOg0KKyAgICAgICAgICAg
IGJ1dHRvblJlc291cmNlID0gInBhbkljb24iOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAg
ICAgY2FzZSBWb2x1bWVTbGlkZXJCdXR0b246DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAg
ICBjYXNlIFZvbHVtZURvd25CdXR0b246DQorICAgICAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAi
cGFuSWNvbiI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEV4aXRGdWxsc2Ny
ZWVuQnV0dG9uOg0KKyAgICAgICAgICAgIGJ1dHRvblJlc291cmNlID0gInBhbkljb24iOw0KKyAg
ICAgICAgICAgIGJyZWFrOw0KKyAgICB9DQorDQorICAgIGlmIChidXR0b25SZXNvdXJjZSkgew0K
KyAgICAgICAgbV9idXR0b25JbWFnZSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShidXR0
b25SZXNvdXJjZSk7CisgICAgICAgIG1fd2lkdGggPSBtX2J1dHRvbkltYWdlLT53aWR0aCgpOwor
ICAgICAgICBtX2hlaWdodCA9IG1fYnV0dG9uSW1hZ2UtPmhlaWdodCgpOworICAgIH0KKyAgICBp
ZiAoYnV0dG9uUHJlc3NlZFJlc291cmNlKQ0KKyAgICAgICAgbV9idXR0b25QcmVzc2VkSW1hZ2Ug
PSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoYnV0dG9uUHJlc3NlZFJlc291cmNlKTsKK30N
CisNCitIVURCdXR0b246On5IVURCdXR0b24oKQ0KK3sNCit9DQorDQordm9pZCBIVURCdXR0b246
OmRyYXcoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0KQ0KK3sNCisgICAgaWYgKG1fYnV0dG9uSW1h
Z2UpDQorICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShtX2J1dHRvbkltYWdlLmdldCgpLCBtX3Bv
c2l0aW9uKTsKK30NCisNCitib29sIEhVREJ1dHRvbjo6aXNQaWNrZWQoaW50IHgsIGludCB5KSBj
b25zdA0KK3sNCisgICAgcmV0dXJuIHggPj0gbV9wb3NpdGlvbi54KCkgJiYgeCA8IG1fcG9zaXRp
b24ueCgpICsgbV93aWR0aCAmJiB5ID49IG1fcG9zaXRpb24ueSgpICYmIHkgPCBtX3Bvc2l0aW9u
LnkoKSArIG1faGVpZ2h0Ow0KK30NCisNCitXZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250
cm9sbGVyOjpXZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9sbGVyKFdlYlZpZGVvRnVs
bHNjcmVlbkhVRENsaWVudCogY2xpZW50LCBIV05EIHdpbmRvdykNCisgOiBtX2NsaWVudChjbGll
bnQpDQorICwgbV93aW5kb3cod2luZG93KQ0KKyAsIG1fcGl4ZWxzKDApDQorICwgbV9wbGF5UGF1
c2VCdXR0b24odGhpcywgSFVEQnV0dG9uOjpQbGF5UGF1c2VCdXR0b24sIGtQbGF5UGF1c2VCdXR0
b25Qb2ludCkNCisgLCBtX3RpbWVTbGlkZXJCdXR0b24odGhpcywgSFVEQnV0dG9uOjpUaW1lU2xp
ZGVyQnV0dG9uLCBJbnRQb2ludCgwLCAwKSkNCisgLCBtX3ZvbHVtZVVwQnV0dG9uKHRoaXMsIEhV
REJ1dHRvbjo6Vm9sdW1lVXBCdXR0b24sIGtWb2x1bWVVcEJ1dHRvblBvaW50KQ0KKyAsIG1fdm9s
dW1lU2xpZGVyQnV0dG9uKHRoaXMsIEhVREJ1dHRvbjo6Vm9sdW1lU2xpZGVyQnV0dG9uLCBJbnRQ
b2ludCgwLCAwKSkNCisgLCBtX3ZvbHVtZURvd25CdXR0b24odGhpcywgSFVEQnV0dG9uOjpWb2x1
bWVEb3duQnV0dG9uLCBrVm9sdW1lRG93bkJ1dHRvblBvaW50KQ0KKyAsIG1fZXhpdEZ1bGxzY3Jl
ZW5CdXR0b24odGhpcywgSFVEQnV0dG9uOjpFeGl0RnVsbHNjcmVlbkJ1dHRvbiwga0V4aXRGdWxs
c2NyZWVuQnV0dG9uUG9pbnQpDQorDQorew0KKyAgICBSRUNUIHdpbmRvd1JlY3Q7DQorICAgIEdl
dENsaWVudFJlY3QobV93aW5kb3csICZ3aW5kb3dSZWN0KTsNCisgICAgaW50IHdpZHRoID0gd2lu
ZG93UmVjdC5yaWdodCAtIHdpbmRvd1JlY3QubGVmdCArIDE7DQorICAgIGludCBoZWlnaHQgPSB3
aW5kb3dSZWN0LmJvdHRvbSAtIHdpbmRvd1JlY3QudG9wICsgMTsNCisgICAgbV94UG9zID0gKHdp
ZHRoIC0ga1dpbmRvd1dpZHRoKSAvIDI7DQorICAgIG1feVBvcyA9IGhlaWdodCAqIDAuOSAtIGtX
aW5kb3dIZWlnaHQgLyAyOw0KKw0KKyAgICBtX3NpemUuY3ggPSBrV2luZG93V2lkdGg7DQorICAg
IG1fc2l6ZS5jeSA9IGtXaW5kb3dIZWlnaHQ7DQorICAgIEJpdG1hcEluZm8gYml0bWFwSW5mbyA9
IEJpdG1hcEluZm86OmNyZWF0ZUJvdHRvbVVwKEludFNpemUobV9zaXplKSk7DQorICAgIG1fYml0
bWFwLnNldCg6OkNyZWF0ZURJQlNlY3Rpb24oTlVMTCwgJmJpdG1hcEluZm8sIERJQl9SR0JfQ09M
T1JTLCAmbV9waXhlbHMsIE5VTEwsIDApKTsNCisgICAgDQorICAgIC8vIERpcnR5IHRoZSB3aW5k
b3cgc28gdGhlIEhVRCBkcmF3cw0KKyAgICBSRUNUIGNsZWFyUmVjdCA9IHsgbV94UG9zLCBtX3lQ
b3MsIG1feFBvcyArIGtXaW5kb3dXaWR0aCAtIDEsIG1feVBvcyArIGtXaW5kb3dIZWlnaHQgLSAx
IH07DQorICAgIEludmFsaWRhdGVSZWN0KG1fd2luZG93LCAmY2xlYXJSZWN0LCB0cnVlKTsNCit9
DQorDQorV2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxlcjo6fldlYlZpZGVvRnVs
bHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xsZXIoKQ0KK3sNCit9DQorDQordm9pZCBXZWJWaWRlb0Z1
bGxzY3JlZW5IVURXaW5kb3dDb250cm9sbGVyOjpkcmF3KCkNCit7DQorICAgIEhEQyB3aW5kb3dE
QyA9IEdldERDKG1fd2luZG93KTsNCisgICAgSERDIGJpdG1hcERDID0gQ3JlYXRlQ29tcGF0aWJs
ZURDKHdpbmRvd0RDKTsNCisgICAgU2VsZWN0T2JqZWN0KGJpdG1hcERDLCBtX2JpdG1hcC5nZXQo
KSk7DQorDQorICAgIEdyYXBoaWNzQ29udGV4dCBnYyhiaXRtYXBEQywgdHJ1ZSk7DQorDQorICAg
IC8vIERyYXcgdGhlIGJhY2tncm91bmQNCisgICAgZ2MuZmlsbFJvdW5kZWRSZWN0KGtPdXRlclNp
emUsIGtPdXRlclJhZGl1cywga091dGVyUmFkaXVzLCBrT3V0ZXJSYWRpdXMsIGtPdXRlclJhZGl1
cywga0JvcmRlckNvbG9yKTsNCisgICAgZ2MuZmlsbFJvdW5kZWRSZWN0KGtJbm5lclNpemUsIGtJ
bm5lclJhZGl1cywga0lubmVyUmFkaXVzLCBrSW5uZXJSYWRpdXMsIGtJbm5lclJhZGl1cywga0Jh
Y2tncm91bmRDb2xvcik7DQorDQorICAgIC8vIERyYXcgdGhlIHdpZGdldHMNCisgICAgbV9wbGF5
UGF1c2VCdXR0b24uZHJhdyhnYyk7DQorICAgIG1fdm9sdW1lVXBCdXR0b24uZHJhdyhnYyk7DQor
ICAgIG1fdm9sdW1lU2xpZGVyQnV0dG9uLmRyYXcoZ2MpOw0KKyAgICBtX3ZvbHVtZURvd25CdXR0
b24uZHJhdyhnYyk7DQorICAgIG1fdGltZVNsaWRlckJ1dHRvbi5kcmF3KGdjKTsNCisgICAgbV9l
eGl0RnVsbHNjcmVlbkJ1dHRvbi5kcmF3KGdjKTsNCisNCisgICAgLy8gQ29weSB0byB0aGUgd2lu
ZG93DQorICAgIEJMRU5ERlVOQ1RJT04gYmxlbmRGdW5jdGlvbiA9IHtBQ19TUkNfT1ZFUiwgMCwg
MjU1LCBBQ19TUkNfQUxQSEF9Ow0KKyAgICBCT09MIHJlc3VsdCA9IEFscGhhQmxlbmQod2luZG93
REMsIG1feFBvcywgbV95UG9zLCBrV2luZG93V2lkdGgsIGtXaW5kb3dIZWlnaHQsIGJpdG1hcERD
LCAwLCAwLCBrV2luZG93V2lkdGgsIGtXaW5kb3dIZWlnaHQsIGJsZW5kRnVuY3Rpb24pOw0KKw0K
KyAgICA6OkRlbGV0ZURDKGJpdG1hcERDKTsNCisgICAgOjpSZWxlYXNlREMobV93aW5kb3csIHdp
bmRvd0RDKTsNCit9DQorDQordm9pZCBXZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9s
bGVyOjptb3ZlKGludCB4LCBpbnQgeSkNCit7DQorICAgIC8vUkVDVCBjbGVhclJlY3QgPSB7IG1f
eFBvcywgbV95UG9zLCBtX3hQb3MgKyB3aW5kb3dXaWR0aCAtIDEsIG1feVBvcyArIHdpbmRvd0hl
aWdodCAtIDEgfTsNCisgICAgLy9JbnZhbGlkYXRlUmVjdChtX3dpbmRvdywgJmNsZWFyUmVjdCwg
dHJ1ZSk7DQorDQorICAgIC8qDQorICAgIC8vIEVyYXNlIGluIHRoZSBvbGQgbG9jYXRpb24NCisg
ICAgSERDIHdpbmRvd0RDID0gR2V0REMobV93aW5kb3cpOw0KKyAgICBIREMgYml0bWFwREMgPSBD
cmVhdGVDb21wYXRpYmxlREMod2luZG93REMpOw0KKyAgICBTZWxlY3RPYmplY3QoYml0bWFwREMs
IG1fYml0bWFwLmdldCgpKTsNCisNCisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGJpdG1hcERDLCB0
cnVlKTsNCisNCisgICAgZ2MuZmlsbFJvdW5kZWRSZWN0KG91dGVyU2l6ZSwgb3V0ZXJSYWRpdXMs
IG91dGVyUmFkaXVzLCBvdXRlclJhZGl1cywgb3V0ZXJSYWRpdXMsIF9jbGVhckNvbG9yKTsNCisg
ICAgQkxFTkRGVU5DVElPTiBibGVuZEZ1bmN0aW9uID0ge0FDX1NSQ19PVkVSLCAwLCAyNTUsIEFD
X1NSQ19BTFBIQX07DQorICAgIEJPT0wgcmVzdWx0ID0gQWxwaGFCbGVuZCh3aW5kb3dEQywgbV94
UG9zLCBtX3lQb3MsIHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQsIGJpdG1hcERDLCAwLCAwLCB3
aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0LCBibGVuZEZ1bmN0aW9uKTsNCisNCisgICAgOjpEZWxl
dGVEQyhiaXRtYXBEQyk7DQorICAgIDo6UmVsZWFzZURDKG1fd2luZG93LCB3aW5kb3dEQyk7DQor
ICAgICovDQorDQorICAgIC8vIERyYXcgaW4gdGhlIG5ldyBwb3NpdGlvbg0KKyAgICBtX3hQb3Mg
PSB4Ow0KKyAgICBtX3lQb3MgPSB5Ow0KKyAgICAvL2RyYXcoKTsNCisNCisgICAgUkVDVCBjbGVh
clJlY3Q7DQorICAgIEdldENsaWVudFJlY3QobV93aW5kb3csICZjbGVhclJlY3QpOw0KKyAgICBJ
bnZhbGlkYXRlUmVjdChtX3dpbmRvdywgJmNsZWFyUmVjdCwgdHJ1ZSk7DQorfQ0KKw0KK3ZvaWQg
V2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxlcjo6b25DaGFyKGludCBjKQ0KK3sN
CisgICAgaWYgKGMgPT0gMHg2MSkNCisgICAgICAgIG1vdmUoMjAwLCAyMDApOw0KKyAgICBlbHNl
IGlmIChjID09IDB4MWIpDQorICAgICAgICBtX2NsaWVudC0+aHVkQ2xpZW50RXhpdEZ1bGxzY3Jl
ZW4oKTsNCisgICAgZWxzZSBpZiAoYyA9PSAweDIwKQ0KKyAgICAgICAgdG9nZ2xlUGxheSgpOw0K
K30NCisNCit2b2lkIFdlYlZpZGVvRnVsbHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xsZXI6Om9uTW91
c2VEb3duKGludCB4LCBpbnQgeSkNCit7DQorICAgIHggLT0gbV94UG9zOw0KKyAgICB5IC09IG1f
eVBvczsNCit9DQorDQordm9pZCBXZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9sbGVy
Ojpvbk1vdXNlTW92ZShpbnQgeCwgaW50IHkpDQorew0KKyAgICB4IC09IG1feFBvczsNCisgICAg
eSAtPSBtX3lQb3M7DQorfQ0KKw0KK3ZvaWQgV2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29u
dHJvbGxlcjo6b25Nb3VzZVVwKGludCB4LCBpbnQgeSkNCit7DQorICAgIHggLT0gbV94UG9zOw0K
KyAgICB5IC09IG1feVBvczsNCisgICAgaWYgKG1fcGxheVBhdXNlQnV0dG9uLmlzUGlja2VkKHgs
IHkpKQ0KKyAgICAgICAgdG9nZ2xlUGxheSgpOw0KKyAgICBlbHNlIGlmIChtX2V4aXRGdWxsc2Ny
ZWVuQnV0dG9uLmlzUGlja2VkKHgsIHkpKQ0KKyAgICAgICAgbV9jbGllbnQtPmh1ZENsaWVudEV4
aXRGdWxsc2NyZWVuKCk7DQorfQ0KKw0KK3ZvaWQgV2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93
Q29udHJvbGxlcjo6dG9nZ2xlUGxheSgpDQorew0KKyAgICBpZiAobV9jbGllbnQtPmh1ZENsaWVu
dENhblBsYXkoKSkNCisgICAgICAgIG1fY2xpZW50LT5odWRDbGllbnRQbGF5KCk7DQorICAgIGVs
c2UNCisgICAgICAgIG1fY2xpZW50LT5odWRDbGllbnRQYXVzZSgpOw0KK30NCisNCitlbnVtIHsN
CisgICAgV0tNZWRpYVVJQ29udHJvbFBsYXlQYXVzZUJ1dHRvbiwNCisgICAgV0tNZWRpYVVJQ29u
dHJvbFJld2luZEJ1dHRvbiwNCisgICAgV0tNZWRpYVVJQ29udHJvbEZhc3RGb3J3YXJkQnV0dG9u
LA0KKyAgICBXS01lZGlhVUlDb250cm9sRXhpdEZ1bGxzY3JlZW5CdXR0b24sDQorICAgIFdLTWVk
aWFVSUNvbnRyb2xWb2x1bWVEb3duQnV0dG9uLA0KKyAgICBXS01lZGlhVUlDb250cm9sU2xpZGVy
LA0KKyAgICBXS01lZGlhVUlDb250cm9sVm9sdW1lVXBCdXR0b24sDQorICAgIFdLTWVkaWFVSUNv
bnRyb2xUaW1lbGluZQ0KK307DQorDQorLyoNCisgc3RhdGljIE5TVGV4dEZpZWxkICpjcmVhdGVU
aW1lVGV4dEZpZWxkKE5TUmVjdCBmcmFtZSkNCit7DQorICAgIE5TVGV4dEZpZWxkICp0ZXh0Rmll
bGQgPSBbW05TVGV4dEZpZWxkIGFsbG9jXSBpbml0V2l0aEZyYW1lOmZyYW1lXTsNCisgICAgW3Rl
eHRGaWVsZCBzZXRUZXh0Q29sb3I6W05TQ29sb3Igd2hpdGVDb2xvcl1dOw0KKyAgICBbdGV4dEZp
ZWxkIHNldEJvcmRlcmVkOk5PXTsNCisgICAgW3RleHRGaWVsZCBzZXRGb250OltOU0ZvbnQgc3lz
dGVtRm9udE9mU2l6ZToxMF1dOw0KKyAgICBbdGV4dEZpZWxkIHNldERyYXdzQmFja2dyb3VuZDpO
T107DQorICAgIFt0ZXh0RmllbGQgc2V0QmV6ZWxlZDpOT107DQorICAgIFt0ZXh0RmllbGQgc2V0
RWRpdGFibGU6Tk9dOw0KKyAgICBbdGV4dEZpZWxkIHNldFNlbGVjdGFibGU6Tk9dOw0KKyAgICBy
ZXR1cm4gdGV4dEZpZWxkOw0KK30NCisNCistICh2b2lkKXdpbmRvd0RpZExvYWQNCit7DQorICAg
IHN0YXRpYyBjb25zdCBDR0Zsb2F0IGtNYXJnaW4gPSA5Ow0KKyAgICBzdGF0aWMgY29uc3QgQ0dG
bG9hdCBrTWFyZ2luVG9wID0gOTsNCisgICAgc3RhdGljIGNvbnN0IENHRmxvYXQga0J1dHRvblNp
emUgPSAyNTsNCisgICAgc3RhdGljIGNvbnN0IENHRmxvYXQga0J1dHRvbk1pbmlTaXplID0gMTY7
DQorDQorICAgIE5TV2luZG93ICp3aW5kb3cgPSBbc2VsZiB3aW5kb3ddOw0KKyAgICBBU1NFUlQo
d2luZG93KTsNCisNCisjaWZkZWYgSEFWRV9NRURJQV9DT05UUk9MDQorICAgIE5TVmlldyAqYmFj
a2dyb3VuZCA9IFdLQ3JlYXRlTWVkaWFVSUJhY2tncm91bmRWaWV3KCk7DQorI2Vsc2UNCisgICAg
TlNWaWV3ICpiYWNrZ3JvdW5kID0gW1tOU1ZpZXcgYWxsb2NdIGluaXRdOw0KKyNlbmRpZg0KKyAg
ICBbd2luZG93IHNldENvbnRlbnRWaWV3OmJhY2tncm91bmRdOw0KKyNpZiAhZGVmaW5lZChCVUlM
RElOR19PTl9USUdFUikNCisgICAgX2FyZWEgPSBbW05TVHJhY2tpbmdBcmVhIGFsbG9jXSBpbml0
V2l0aFJlY3Q6W2JhY2tncm91bmQgYm91bmRzXSBvcHRpb25zOk5TVHJhY2tpbmdNb3VzZUVudGVy
ZWRBbmRFeGl0ZWR8TlNUcmFja2luZ0FjdGl2ZUFsd2F5cyBvd25lcjpzZWxmIHVzZXJJbmZvOm5p
bF07DQorICAgIFtiYWNrZ3JvdW5kIGFkZFRyYWNraW5nQXJlYTpfYXJlYV07DQorI2VuZGlmDQor
ICAgIFtiYWNrZ3JvdW5kIHJlbGVhc2VdOyAgICANCisNCisgICAgTlNWaWV3ICpjb250ZW50Vmll
dyA9IFtbc2VsZiB3aW5kb3ddIGNvbnRlbnRWaWV3XTsNCisNCisgICAgQ0dGbG9hdCB0b3AgPSB3
aW5kb3dIZWlnaHQgLSBrTWFyZ2luVG9wOw0KKyAgICBDR0Zsb2F0IGNlbnRlciA9ICh3aW5kb3dX
aWR0aCAtIGtCdXR0b25TaXplKSAvIDI7DQorICAgIF9wbGF5QnV0dG9uID0gY3JlYXRlQ29udHJv
bFdpdGhNZWRpYVVJQ29udHJvbFR5cGUoV0tNZWRpYVVJQ29udHJvbFBsYXlQYXVzZUJ1dHRvbiwg
TlNNYWtlUmVjdChjZW50ZXIsIHRvcCAtIGtCdXR0b25TaXplLCBrQnV0dG9uU2l6ZSwga0J1dHRv
blNpemUpKTsNCisgICAgW19wbGF5QnV0dG9uIHNldFRhcmdldDpzZWxmXTsNCisgICAgW19wbGF5
QnV0dG9uIHNldEFjdGlvbjpAc2VsZWN0b3IocGxheWluZ0NoYW5nZWQ6KV07DQorICAgIFtjb250
ZW50VmlldyBhZGRTdWJ2aWV3Ol9wbGF5QnV0dG9uXTsNCisNCisgICAgQ0dGbG9hdCBjbG9zZVRv
UmlnaHQgPSB3aW5kb3dXaWR0aCAtIDIgKiBrTWFyZ2luIC0ga0J1dHRvbk1pbmlTaXplOw0KKyAg
ICBOU0NvbnRyb2wgKmV4aXRGdWxsc2NyZWVuQnV0dG9uID0gY3JlYXRlQ29udHJvbFdpdGhNZWRp
YVVJQ29udHJvbFR5cGUoV0tNZWRpYVVJQ29udHJvbEV4aXRGdWxsc2NyZWVuQnV0dG9uLCBOU01h
a2VSZWN0KGNsb3NlVG9SaWdodCwgdG9wIC0ga0J1dHRvblNpemUgLyAyIC0ga0J1dHRvbk1pbmlT
aXplIC8gMiwga0J1dHRvbk1pbmlTaXplLCBrQnV0dG9uTWluaVNpemUpKTsNCisgICAgW2V4aXRG
dWxsc2NyZWVuQnV0dG9uIHNldEFjdGlvbjpAc2VsZWN0b3IoZXhpdEZ1bGxzY3JlZW46KV07DQor
ICAgIFtleGl0RnVsbHNjcmVlbkJ1dHRvbiBzZXRUYXJnZXQ6c2VsZl07DQorICAgIFtjb250ZW50
VmlldyBhZGRTdWJ2aWV3OmV4aXRGdWxsc2NyZWVuQnV0dG9uXTsNCisgICAgW2V4aXRGdWxsc2Ny
ZWVuQnV0dG9uIHJlbGVhc2VdOw0KKyAgICANCisgICAgQ0dGbG9hdCBsZWZ0ID0ga01hcmdpbjsN
CisgICAgTlNDb250cm9sICp2b2x1bWVEb3duQnV0dG9uID0gY3JlYXRlQ29udHJvbFdpdGhNZWRp
YVVJQ29udHJvbFR5cGUoV0tNZWRpYVVJQ29udHJvbFZvbHVtZURvd25CdXR0b24sIE5TTWFrZVJl
Y3QobGVmdCwgdG9wIC0ga0J1dHRvblNpemUgLyAyIC0ga0J1dHRvbk1pbmlTaXplIC8gMiwga0J1
dHRvbk1pbmlTaXplLCBrQnV0dG9uTWluaVNpemUpKTsNCisgICAgW2NvbnRlbnRWaWV3IGFkZFN1
YnZpZXc6dm9sdW1lRG93bkJ1dHRvbl07DQorICAgIFt2b2x1bWVEb3duQnV0dG9uIHJlbGVhc2Vd
Ow0KKw0KKyAgICBzdGF0aWMgY29uc3QgaW50IHZvbHVtZVNsaWRlcldpZHRoID0gNTA7DQorDQor
ICAgIGxlZnQgPSBrTWFyZ2luICsga0J1dHRvbk1pbmlTaXplOw0KKyAgICBfdm9sdW1lU2xpZGVy
ID0gY3JlYXRlQ29udHJvbFdpdGhNZWRpYVVJQ29udHJvbFR5cGUoV0tNZWRpYVVJQ29udHJvbFNs
aWRlciwgTlNNYWtlUmVjdChsZWZ0LCB0b3AgLSBrQnV0dG9uU2l6ZSAvIDIgLSBrQnV0dG9uTWlu
aVNpemUgLyAyLCB2b2x1bWVTbGlkZXJXaWR0aCwga0J1dHRvbk1pbmlTaXplKSk7DQorICAgIFtf
dm9sdW1lU2xpZGVyIHNldFZhbHVlOltOU051bWJlciBudW1iZXJXaXRoRG91YmxlOltzZWxmIG1h
eFZvbHVtZV1dIGZvcktleTpAIm1heFZhbHVlIl07DQorICAgIFtfdm9sdW1lU2xpZGVyIHNldFRh
cmdldDpzZWxmXTsNCisgICAgW192b2x1bWVTbGlkZXIgc2V0QWN0aW9uOkBzZWxlY3Rvcih2b2x1
bWVDaGFuZ2VkOildOw0KKyAgICBbY29udGVudFZpZXcgYWRkU3Vidmlldzpfdm9sdW1lU2xpZGVy
XTsNCisNCisgICAgbGVmdCA9IGtNYXJnaW4gKyBrQnV0dG9uTWluaVNpemUgKyB2b2x1bWVTbGlk
ZXJXaWR0aCArIGtCdXR0b25NaW5pU2l6ZSAvIDI7DQorICAgIE5TQ29udHJvbCAqYnV0dG9uID0g
Y3JlYXRlQ29udHJvbFdpdGhNZWRpYVVJQ29udHJvbFR5cGUoV0tNZWRpYVVJQ29udHJvbFZvbHVt
ZVVwQnV0dG9uLCBOU01ha2VSZWN0KGxlZnQsIHRvcCAtIGtCdXR0b25TaXplIC8gMiAtIGtCdXR0
b25NaW5pU2l6ZSAvIDIsIGtCdXR0b25NaW5pU2l6ZSwga0J1dHRvbk1pbmlTaXplKSk7DQorICAg
IFtjb250ZW50VmlldyBhZGRTdWJ2aWV3OmJ1dHRvbl07DQorICAgIFtidXR0b24gcmVsZWFzZV07
DQorICAgIA0KKyAgICBzdGF0aWMgY29uc3QgaW50IHRpbWVUZXh0V2lkdGggPSA1MDsNCisgICAg
c3RhdGljIGNvbnN0IGludCBzbGlkZXJIZWlnaHQgPSAxMzsNCisgICAgc3RhdGljIGNvbnN0IGlu
dCBzbGlkZXJNYXJnaW5GaXh1cCA9IDQ7DQorDQorI2lmZGVmIEhBVkVfTUVESUFfQ09OVFJPTA0K
KyAgICBfdGltZWxpbmUgPSBXS0NyZWF0ZU1lZGlhVUlDb250cm9sKFdLTWVkaWFVSUNvbnRyb2xU
aW1lbGluZSk7DQorI2Vsc2UNCisgICAgX3RpbWVsaW5lID0gW1tOU1NsaWRlciBhbGxvY10gaW5p
dF07DQorI2VuZGlmDQorICAgIFtfdGltZWxpbmUgc2V0VGFyZ2V0OnNlbGZdOw0KKyAgICBbX3Rp
bWVsaW5lIHNldEFjdGlvbjpAc2VsZWN0b3IodGltZWxpbmVQb3NpdGlvbkNoYW5nZWQ6KV07DQor
ICAgIFtfdGltZWxpbmUgc2V0RnJhbWU6TlNNYWtlUmVjdChrTWFyZ2luICsgdGltZVRleHRXaWR0
aCArIGtNYXJnaW4vMiwga01hcmdpbiAtIHNsaWRlck1hcmdpbkZpeHVwLCB3aW5kb3dXaWR0aCAt
IDIgKiAoa01hcmdpbiAtIHNsaWRlck1hcmdpbkZpeHVwKSAtIGtNYXJnaW4gKiAyIC0gMiAqIHRp
bWVUZXh0V2lkdGgsIHNsaWRlckhlaWdodCldOw0KKyAgICBbY29udGVudFZpZXcgYWRkU3Vidmll
dzpfdGltZWxpbmVdOw0KKw0KKyAgICBzdGF0aWMgY29uc3QgaW50IHRpbWVUZXh0SGVpZ2h0ID0g
MTE7DQorDQorICAgIF9lbGFwc2VkVGltZVRleHQgPSBjcmVhdGVUaW1lVGV4dEZpZWxkKE5TTWFr
ZVJlY3Qoa01hcmdpbiwga01hcmdpbiwgdGltZVRleHRXaWR0aCwgdGltZVRleHRIZWlnaHQpKTsN
CisgICAgW2NvbnRlbnRWaWV3IGFkZFN1YnZpZXc6X2VsYXBzZWRUaW1lVGV4dF07DQorDQorICAg
IF9yZW1haW5pbmdUaW1lVGV4dCA9IGNyZWF0ZVRpbWVUZXh0RmllbGQoTlNNYWtlUmVjdCh3aW5k
b3dXaWR0aCAtIGtNYXJnaW4gLSB0aW1lVGV4dFdpZHRoLCBrTWFyZ2luLCB0aW1lVGV4dFdpZHRo
LCB0aW1lVGV4dEhlaWdodCkpOw0KKyAgICBbY29udGVudFZpZXcgYWRkU3VidmlldzpfcmVtYWlu
aW5nVGltZVRleHRdOw0KKyAgICANCisgICAgW3dpbmRvdyByZWNhbGN1bGF0ZUtleVZpZXdMb29w
XTsNCisgICAgW3dpbmRvdyBzZXRJbml0aWFsRmlyc3RSZXNwb25kZXI6X3BsYXlCdXR0b25dOw0K
KyAgICBbd2luZG93IGNlbnRlcl07DQorfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgDQorLSAoZG91YmxlKW1heFZvbHVtZQ0KK3sNCisgICAgLy8gU2V0IHRoZSB2b2x1bWUgc2xp
ZGVyIHJlc29sdXRpb24NCisgICAgcmV0dXJuIDEwMDsNCit9DQorDQorLSAoZG91YmxlKXZvbHVt
ZQ0KK3sNCisgICAgcmV0dXJuIFtfZGVsZWdhdGUgbWVkaWFFbGVtZW50XSA/IFtfZGVsZWdhdGUg
bWVkaWFFbGVtZW50XS0+dm9sdW1lKCkgKiBbc2VsZiBtYXhWb2x1bWVdIDogMDsNCit9DQorDQor
LSAodm9pZClzZXRWb2x1bWU6KGRvdWJsZSl2b2x1bWUNCit7DQorICAgIGlmICghW19kZWxlZ2F0
ZSBtZWRpYUVsZW1lbnRdKQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICBXZWJDb3JlOjpFeGNlcHRp
b25Db2RlIGU7DQorICAgIFtfZGVsZWdhdGUgbWVkaWFFbGVtZW50XS0+c2V0Vm9sdW1lKHZvbHVt
ZSAvIFtzZWxmIG1heFZvbHVtZV0sIGUpOw0KK30NCisNCistIChCT09MKXBsYXlpbmcNCit7DQor
ICAgIGlmICghW19kZWxlZ2F0ZSBtZWRpYUVsZW1lbnRdKQ0KKyAgICAgICAgcmV0dXJuIGZhbHNl
Ow0KKyAgICByZXR1cm4gIVtfZGVsZWdhdGUgbWVkaWFFbGVtZW50XS0+Y2FuUGxheSgpOw0KK30N
CisNCistICh2b2lkKXNldFBsYXlpbmc6KEJPT0wpcGxheWluZw0KK3sNCisgICAgaWYgKCFbX2Rl
bGVnYXRlIG1lZGlhRWxlbWVudF0pDQorICAgICAgICByZXR1cm47DQorDQorICAgIGlmIChwbGF5
aW5nKQ0KKyAgICAgICAgW19kZWxlZ2F0ZSBtZWRpYUVsZW1lbnRdLT5wbGF5KCk7DQorICAgIGVs
c2UNCisgICAgICAgIFtfZGVsZWdhdGUgbWVkaWFFbGVtZW50XS0+cGF1c2UoKTsNCit9DQorDQor
c3RhdGljIE5TU3RyaW5nICp0aW1lVG9TdHJpbmcoZG91YmxlIHRpbWUpDQorew0KKyAgICBpZiAo
IWlzZmluaXRlKHRpbWUpKQ0KKyAgICAgICAgdGltZSA9IDA7DQorICAgIGludCBzZWNvbmRzID0g
KGludClmYWJzZih0aW1lKTsgDQorICAgIGludCBob3VycyA9IHNlY29uZHMgLyAoNjAgKiA2MCk7
DQorICAgIGludCBtaW51dGVzID0gKHNlY29uZHMgLyA2MCkgJSA2MDsNCisgICAgc2Vjb25kcyAl
PSA2MDsNCisgICAgaWYgKGhvdXJzKSB7DQorICAgICAgICBpZiAoaG91cnMgPiA5KQ0KKyAgICAg
ICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVzJTAyZDolMDJkOiUw
MmQiLCAodGltZSA8IDAgPyAiLSIgOiAiIiksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzXTsNCisg
ICAgICAgIGVsc2UNCisgICAgICAgICAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3Jt
YXQ6QCIlcyUwMWQ6JTAyZDolMDJkIiwgKHRpbWUgPCAwID8gIi0iIDogIiIpLCBob3VycywgbWlu
dXRlcywgc2Vjb25kc107DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIFtOU1N0
cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXMlMDJkOiUwMmQiLCAodGltZSA8IDAgPyAiLSIgOiAi
IiksIG1pbnV0ZXMsIHNlY29uZHNdOw0KKyAgICANCit9DQorDQorc3RhdGljIE5TU3RyaW5nICpz
dHJpbmdUb1RpbWVUZXh0QXR0cmlidXRlZChOU1N0cmluZyAqc3RyaW5nLCBOU1RleHRBbGlnbm1l
bnQgYWxpZ24pDQorew0KKyAgICBOU1NoYWRvdyAqYmxhY2tTaGFkb3cgPSBbW05TU2hhZG93IGFs
bG9jXSBpbml0XTsNCisgICAgW2JsYWNrU2hhZG93IHNldFNoYWRvd0NvbG9yOltOU0NvbG9yIGJs
YWNrQ29sb3JdXTsNCisgICAgW2JsYWNrU2hhZG93IHNldFNoYWRvd0JsdXJSYWRpdXM6MF07DQor
ICAgIFtibGFja1NoYWRvdyBzZXRTaGFkb3dPZmZzZXQ6TlNNYWtlU2l6ZSgwLCAtMSldOw0KKyAg
ICBOU011dGFibGVQYXJhZ3JhcGhTdHlsZSAqc3R5bGUgPSBbW05TTXV0YWJsZVBhcmFncmFwaFN0
eWxlIGFsbG9jXSBpbml0XTsNCisgICAgW3N0eWxlIHNldEFsaWdubWVudDphbGlnbl07DQorICAg
IE5TRGljdGlvbmFyeSAqZGljdCA9IFtOU0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3Rz
QW5kS2V5czpibGFja1NoYWRvdywgTlNTaGFkb3dBdHRyaWJ1dGVOYW1lLCBzdHlsZSwgTlNQYXJh
Z3JhcGhTdHlsZUF0dHJpYnV0ZU5hbWUsIG5pbF07DQorICAgIFtzdHlsZSByZWxlYXNlXTsNCisg
ICAgW2JsYWNrU2hhZG93IHJlbGVhc2VdOw0KKw0KKyAgICBOU0F0dHJpYnV0ZWRTdHJpbmcgKmF0
dHJTdHJpbmcgPSBbW05TQXR0cmlidXRlZFN0cmluZyBhbGxvY10gaW5pdFdpdGhTdHJpbmc6c3Ry
aW5nIGF0dHJpYnV0ZXM6ZGljdF07DQorICAgIHJldHVybiBbYXR0clN0cmluZyBhdXRvcmVsZWFz
ZV07ICAgIA0KK30NCisNCistIChOU1N0cmluZyAqKXJlbWFpbmluZ1RpbWVUZXh0DQorew0KKyAg
ICBpZiAoIVtfZGVsZWdhdGUgbWVkaWFFbGVtZW50XSkNCisgICAgICAgIHJldHVybiBAIiI7DQor
DQorICAgIC8vIE5lZ2F0aXZlIG51bWJlcg0KKyAgICByZXR1cm4gc3RyaW5nVG9UaW1lVGV4dEF0
dHJpYnV0ZWQodGltZVRvU3RyaW5nKFtfZGVsZWdhdGUgbWVkaWFFbGVtZW50XS0+Y3VycmVudFRp
bWUoKSAtIFtfZGVsZWdhdGUgbWVkaWFFbGVtZW50XS0+ZHVyYXRpb24oKSksIE5TTGVmdFRleHRB
bGlnbm1lbnQpOw0KK30NCisNCistIChOU1N0cmluZyAqKWVsYXBzZWRUaW1lVGV4dA0KK3sNCisg
ICAgaWYgKCFbX2RlbGVnYXRlIG1lZGlhRWxlbWVudF0pDQorICAgICAgICByZXR1cm4gQCIiOw0K
Kw0KKyAgICByZXR1cm4gc3RyaW5nVG9UaW1lVGV4dEF0dHJpYnV0ZWQodGltZVRvU3RyaW5nKFtf
ZGVsZWdhdGUgbWVkaWFFbGVtZW50XS0+Y3VycmVudFRpbWUoKSksIE5TUmlnaHRUZXh0QWxpZ25t
ZW50KTsNCit9DQorKi8NCisNCisjZW5kaWYNCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBXZWJLaXQv
d2luL1dlYlZpZGVvRnVsbHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xsZXIuY3BwCl9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K
QWRkZWQ6IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1
cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNv
cmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5jcHAJKHJldmlzaW9uIDUwNDcwKQorKysgV2ViS2l0
L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8V2ViQ29yZS9GbG9hdFJlY3QuaD4KICNpbmNsdWRl
IDxXZWJDb3JlL0ZyYW1lTG9hZFJlcXVlc3QuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lVmll
dy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvSFRNTE5hbWVzLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9M
b2NhbGl6ZWRTdHJpbmdzLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Ob3RJbXBsZW1lbnRlZC5oPgog
I2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgpAQCAtNzYwLDMgKzc2MSwyMyBAQAogICAgIG1fd2Vi
Vmlldy0+dWlEZWxlZ2F0ZSgmZGVsZWdhdGUpOwogICAgIHJldHVybiBkZWxlZ2F0ZTsKIH0KKwor
I2lmIEVOQUJMRShWSURFTykKKworYm9vbCBXZWJDaHJvbWVDbGllbnQ6OnN1cHBvcnRzRnVsbHNj
cmVlbkZvck5vZGUoY29uc3QgTm9kZSogbm9kZSkKK3sKKyAgICByZXR1cm4gbm9kZS0+aGFzVGFn
TmFtZShXZWJDb3JlOjpIVE1MTmFtZXM6OnZpZGVvVGFnKTsKK30KKwordm9pZCBXZWJDaHJvbWVD
bGllbnQ6OmVudGVyRnVsbHNjcmVlbkZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBtX3dlYlZp
ZXctPmVudGVyRnVsbHNjcmVlbkZvck5vZGUobm9kZSk7Cit9CisKK3ZvaWQgV2ViQ2hyb21lQ2xp
ZW50OjpleGl0RnVsbHNjcmVlbkZvck5vZGUoTm9kZSopCit7CisgICAgbV93ZWJWaWV3LT5leGl0
RnVsbHNjcmVlbigpOworfQorCisjZW5kaWYKKwpJbmRleDogV2ViS2l0L3dpbi9XZWJDb3JlU3Vw
cG9ydC9XZWJDaHJvbWVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVT
dXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCShyZXZpc2lvbiA1MDQ3MCkKKysrIFdlYktpdC93aW4v
V2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTEzNiw2
ICsxMzYsMTIgQEAKIAogICAgIHZpcnR1YWwgdm9pZCByZXF1ZXN0R2VvbG9jYXRpb25QZXJtaXNz
aW9uRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqLCBXZWJDb3JlOjpHZW9sb2NhdGlvbiopOwogCisj
aWYgRU5BQkxFKFZJREVPKQorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Z1bGxzY3JlZW5Gb3JO
b2RlKGNvbnN0IFdlYkNvcmU6Ok5vZGUqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZW50ZXJGdWxsc2Ny
ZWVuRm9yTm9kZShXZWJDb3JlOjpOb2RlKik7CisgICAgdmlydHVhbCB2b2lkIGV4aXRGdWxsc2Ny
ZWVuRm9yTm9kZShXZWJDb3JlOjpOb2RlKik7CisjZW5kaWYKKwogI2lmIEVOQUJMRShOT1RJRklD
QVRJT05TKQogICAgIHZpcnR1YWwgV2ViQ29yZTo6Tm90aWZpY2F0aW9uUHJlc2VudGVyKiBub3Rp
ZmljYXRpb25QcmVzZW50ZXIoKSBjb25zdCB7IHJldHVybiByZWludGVycHJldF9jYXN0PFdlYkNv
cmU6Ok5vdGlmaWNhdGlvblByZXNlbnRlcio+KG1fbm90aWZpY2F0aW9uc0RlbGVnYXRlLmdldCgp
KTsgfQogI2VuZGlmCkluZGV4OiBXZWJLaXQvd2luL1dlYlZpZGVvRnVsbHNjcmVlbkNvbnRyb2xs
ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZpZGVvRnVsbHNjcmVlbkNvbnRyb2xs
ZXIuaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC93aW4vV2ViVmlkZW9GdWxsc2NyZWVuQ29udHJv
bGxlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBX
ZWJWaWRlb0Z1bGxzY3JlZW5Db250cm9sbGVyX2gNCisjZGVmaW5lIFdlYlZpZGVvRnVsbHNjcmVl
bkNvbnRyb2xsZXJfaA0KKw0KKyNpZiBFTkFCTEUoVklERU8pCisKKyNpbmNsdWRlICJRVE1vdmll
V2luLmgiCisjaW5jbHVkZSAiV2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxlci5o
IgorCisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvSFRNTE1lZGlh
RWxlbWVudC5oPgorCitjbGFzcyBXZWJWaWRlb0Z1bGxzY3JlZW5Db250cm9sbGVyIDogcHVibGlj
IFFUTW92aWVXaW5GU0NsaWVudCwgcHVibGljIFdlYlZpZGVvRnVsbHNjcmVlbkhVRENsaWVudAor
eworcHVibGljOgorICAgIFdlYlZpZGVvRnVsbHNjcmVlbkNvbnRyb2xsZXIoKTsKKyAgICB+V2Vi
VmlkZW9GdWxsc2NyZWVuQ29udHJvbGxlcigpOworCisgICAgdm9pZCBzZXRNZWRpYUVsZW1lbnQo
V2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50KTsKKyAgICBXZWJDb3JlOjpI
VE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQoKSB7IHJldHVybiBtX21lZGlhRWxlbWVudC5n
ZXQoKTsgfQorCisgICAgdm9pZCBlbnRlckZ1bGxzY3JlZW4oKTsKKyAgICB2b2lkIGV4aXRGdWxs
c2NyZWVuKCk7CisKKyAgICAvLyBRVE1vdmllV2luRlNDbGllbnQKKyAgICB2aXJ0dWFsIExSRVNV
TFQgaGFuZGxlTWVzc2FnZXMoSFdORCB0aGVXbmQsIFVJTlQgdGhlTWVzc2FnZSwgVUlOVCB3UGFy
YW0sIExPTkcgbFBhcmFtKTsNCisNCisgICAgLy8gV2ViVmlkZW9GdWxsc2NyZWVuSFVEQ2xpZW50
CisgICAgdmlydHVhbCB2b2lkIGh1ZENsaWVudEV4aXRGdWxsc2NyZWVuKCk7CisgICAgdmlydHVh
bCBib29sIGh1ZENsaWVudENhblBsYXkoKTsNCisgICAgdmlydHVhbCB2b2lkIGh1ZENsaWVudFBs
YXkoKTsNCisgICAgdmlydHVhbCB2b2lkIGh1ZENsaWVudFBhdXNlKCk7DQorCitwcml2YXRlOgor
ICAgIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLIHdpbmRvd1Byb2MoSFdORCBod25kLCBVSU5UIG1l
c3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworICAgIHZvaWQgZW5zdXJlV2lu
ZG93KCk7CisgICAgUVRNb3ZpZVdpbiogbW92aWUoKTsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpI
VE1MTWVkaWFFbGVtZW50PiBtX21lZGlhRWxlbWVudDsKKyAgICBIV05EIG1fd2luZG93OworICAg
IFdlYlZpZGVvRnVsbHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xsZXIqIG1faHVkQ29udHJvbGxlcjsK
KworICAgIGJvb2wgbV9pc0VuZGluZ0Z1bGxzY3JlZW47CisgICAgYm9vbCBtX2lzV2luZG93TG9h
ZGVkOworICAgIGJvb2wgbV9mb3JjZURpc2FibGVBbmltYXRpb247CisgICAgYm9vbCBtX2h1ZE5l
ZWRzSW5pdGlhbERyYXc7CisgICAgYm9vbCBtX2h1ZEluaXRpYWxEcmF3UmVhZHk7Cit9OworCisj
ZW5kaWYKKworI2VuZGlmCisKClByb3BlcnR5IGNoYW5nZXMgb246IFdlYktpdC93aW4vV2ViVmlk
ZW9GdWxsc2NyZWVuQ29udHJvbGxlci5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjpleGVjdXRhYmxl
CiAgICsgKgoKSW5kZXg6IFdlYktpdC93aW4vV2ViVmlldy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC93aW4vV2ViVmlldy5oCShyZXZpc2lvbiA1MDQ3MCkKKysrIFdlYktpdC93aW4vV2ViVmlldy5o
CSh3b3JraW5nIGNvcHkpCkBAIC00MSw2ICs0MSw3IEBACiBjbGFzcyBXZWJCYWNrRm9yd2FyZExp
c3Q7CiBjbGFzcyBXZWJJbnNwZWN0b3I7CiBjbGFzcyBXZWJJbnNwZWN0b3JDbGllbnQ7CitjbGFz
cyBXZWJWaWRlb0Z1bGxzY3JlZW5Db250cm9sbGVyOwogCiBXZWJWaWV3KiBraXQoV2ViQ29yZTo6
UGFnZSopOwogV2ViQ29yZTo6UGFnZSogY29yZShJV2ViVmlldyopOwpAQCAtODYxLDYgKzg2Miw5
IEBACiAKICAgICB2b2lkIGRvd25sb2FkVVJMKGNvbnN0IFdlYkNvcmU6OktVUkwmKTsKIAorICAg
IHZvaWQgZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShXZWJDb3JlOjpOb2RlKik7CisgICAgdm9pZCBl
eGl0RnVsbHNjcmVlbigpOworCiBwcml2YXRlOgogICAgIHZvaWQgc2V0Wm9vbU11bHRpcGxpZXIo
ZmxvYXQgbXVsdGlwbGllciwgYm9vbCBpc1RleHRPbmx5KTsKICAgICBmbG9hdCB6b29tTXVsdGlw
bGllcihib29sIGlzVGV4dE9ubHkpOwpAQCAtOTcwLDYgKzk3NCw4IEBACiAgICAgbG9uZyBtX2xh
c3RQYW5ZOwogICAgIGxvbmcgbV94T3ZlcnBhbjsKICAgICBsb25nIG1feU92ZXJwYW47CisKKyAg
ICBXZWJWaWRlb0Z1bGxzY3JlZW5Db250cm9sbGVyKiBtX2Z1bGxzY3JlZW5Db250cm9sbGVyOwog
fTsKIAogI2VuZGlmCkluZGV4OiBXZWJLaXQvd2luL1dlYlZpZGVvRnVsbHNjcmVlbkNvbnRyb2xs
ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViVmlkZW9GdWxsc2NyZWVuQ29udHJv
bGxlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvd2luL1dlYlZpZGVvRnVsbHNjcmVlbkNv
bnRyb2xsZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIwMyBAQAorLyoNCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyAqDQorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0DQorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQorICogYXJlIG1ldDoNCisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4NCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUNCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQ0KKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
DQorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SDQorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsDQorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLA0KKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUg0KKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkNCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiANCisgKi8NCisNCisjaW5jbHVkZSAiY29uZmlnLmgiDQorDQorI2lmIEVOQUJM
RShWSURFTykNCisNCisjaW5jbHVkZSA8d2luZG93c3guaD4NCisNCisjaW5jbHVkZSA8d3RmL1Vu
dXNlZFBhcmFtLmg+DQorI2luY2x1ZGUgPFdlYkNvcmUvU29mdExpbmtpbmcuaD4NCisjaW5jbHVk
ZSA8V2ViQ29yZS9JbnRSZWN0Lmg+DQorDQorI2luY2x1ZGUgPFdlYkNvcmUvUVRNb3ZpZVdpbi5o
Pg0KKw0KKyNpbmNsdWRlICJXZWJWaWRlb0Z1bGxzY3JlZW5Db250cm9sbGVyLmgiDQorI2luY2x1
ZGUgIldlYlZpZGVvRnVsbHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xsZXIuaCINCisNCisjaWYgUExB
VEZPUk0oQ0YpDQorI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+DQor
I2VuZGlmDQorDQorI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJLaXRTeXN0ZW1J
bnRlcmZhY2UuaD4NCisNCisvL1NPRlRfTElOS19GUkFNRVdPUksoUVRLaXQpDQorLy9TT0ZUX0xJ
TktfQ0xBU1MoUVRLaXQsIFFUTW92aWVWaWV3KQ0KKw0KK2NvbnN0IExQQ1dTVFIga1dlYlZpZGVv
RnVsbFNjcmVlbldpbmRvd0NsYXNzTmFtZSA9IEwiV2ViVmlkZW9GdWxsU2NyZWVuV2luZG93Q2xh
c3MiOw0KKw0KK0xSRVNVTFQgV2ViVmlkZW9GdWxsc2NyZWVuQ29udHJvbGxlcjo6d2luZG93UHJv
YyhIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkN
Cit7DQorICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBh
cmFtKTsNCit9DQorDQorV2ViVmlkZW9GdWxsc2NyZWVuQ29udHJvbGxlcjo6V2ViVmlkZW9GdWxs
c2NyZWVuQ29udHJvbGxlcigpDQorIDogbV93aW5kb3coMCkNCisgLCBtX2h1ZENvbnRyb2xsZXIo
MCkNCisgLCBtX2lzRW5kaW5nRnVsbHNjcmVlbihmYWxzZSkNCisgLCBtX2lzV2luZG93TG9hZGVk
KGZhbHNlKQ0KKyAsIG1fZm9yY2VEaXNhYmxlQW5pbWF0aW9uKGZhbHNlKQ0KKyAsIG1faHVkTmVl
ZHNJbml0aWFsRHJhdyh0cnVlKQ0KKyAsIG1faHVkSW5pdGlhbERyYXdSZWFkeShmYWxzZSkNCit7
DQorfQ0KKw0KK1dlYlZpZGVvRnVsbHNjcmVlbkNvbnRyb2xsZXI6On5XZWJWaWRlb0Z1bGxzY3Jl
ZW5Db250cm9sbGVyKCkNCit7DQorICAgIGlmIChtb3ZpZSgpKQ0KKyAgICAgICAgbW92aWUoKS0+
ZXhpdEZ1bGxzY3JlZW4oKTsNCit9DQorDQorUVRNb3ZpZVdpbiogV2ViVmlkZW9GdWxsc2NyZWVu
Q29udHJvbGxlcjo6bW92aWUoKQ0KK3sNCisgICAgcmV0dXJuIG1fbWVkaWFFbGVtZW50ID8gcmVp
bnRlcnByZXRfY2FzdDxRVE1vdmllV2luKj4obV9tZWRpYUVsZW1lbnQtPnBsYXRmb3JtTWVkaWEo
KS5xdE1vdmllKSA6IDA7DQorfQ0KKw0KK3ZvaWQgV2ViVmlkZW9GdWxsc2NyZWVuQ29udHJvbGxl
cjo6c2V0TWVkaWFFbGVtZW50KFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVu
dCkNCit7DQorICAgIG1fbWVkaWFFbGVtZW50ID0gbWVkaWFFbGVtZW50Ow0KKyAgICBpZiAoIW1f
bWVkaWFFbGVtZW50KSB7DQorICAgICAgICAvLyBGSVhNRTogRG8gc29tZSBjbGVhbnVwIGhlcmUN
CisgICAgICAgIHJldHVybjsNCisgICAgfQ0KK30NCisNCisvKg0KK3N0YXRpYyB2b2lkIGNvbnN0
cmFpbkZyYW1lVG9SYXRpb09mRnJhbWUoTlNSZWN0ICpmcmFtZVRvQ29uc3RyYWluLCBjb25zdCBO
U1JlY3QgKmZyYW1lKQ0KK3sNCisgICAgLy8gS2VlcCBhIGNvbnN0cmFpbmVkIGFzcGVjdCByYXRp
byBmb3IgdGhlIGRlc3RpbmF0aW9uIHdpbmRvdw0KKyAgICBkb3VibGUgb3JpZ2luYWxSYXRpbyA9
IGZyYW1lLT5zaXplLndpZHRoIC8gZnJhbWUtPnNpemUuaGVpZ2h0Ow0KKyAgICBkb3VibGUgbmV3
UmF0aW8gPSBmcmFtZVRvQ29uc3RyYWluLT5zaXplLndpZHRoIC8gZnJhbWVUb0NvbnN0cmFpbi0+
c2l6ZS5oZWlnaHQ7DQorICAgIGlmIChuZXdSYXRpbyA+IG9yaWdpbmFsUmF0aW8pIHsNCisgICAg
ICAgIGRvdWJsZSBuZXdXaWR0aCA9IG9yaWdpbmFsUmF0aW8gKiBmcmFtZVRvQ29uc3RyYWluLT5z
aXplLmhlaWdodDsNCisgICAgICAgIGRvdWJsZSBkaWZmID0gZnJhbWVUb0NvbnN0cmFpbi0+c2l6
ZS53aWR0aCAtIG5ld1dpZHRoOw0KKyAgICAgICAgZnJhbWVUb0NvbnN0cmFpbi0+c2l6ZS53aWR0
aCA9IG5ld1dpZHRoOw0KKyAgICAgICAgZnJhbWVUb0NvbnN0cmFpbi0+b3JpZ2luLnggKz0gZGlm
ZiAvIDI7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBkb3VibGUgbmV3SGVpZ2h0ID0gZnJhbWVU
b0NvbnN0cmFpbi0+c2l6ZS53aWR0aCAvIG9yaWdpbmFsUmF0aW87DQorICAgICAgICBkb3VibGUg
ZGlmZiA9IGZyYW1lVG9Db25zdHJhaW4tPnNpemUuaGVpZ2h0IC0gbmV3SGVpZ2h0Ow0KKyAgICAg
ICAgZnJhbWVUb0NvbnN0cmFpbi0+c2l6ZS5oZWlnaHQgPSBuZXdIZWlnaHQ7DQorICAgICAgICBm
cmFtZVRvQ29uc3RyYWluLT5vcmlnaW4ueSArPSBkaWZmIC8gMjsNCisgICAgfSAgICANCit9DQor
DQorc3RhdGljIE5TV2luZG93ICpjcmVhdGVCYWNrZ3JvdW5kRnVsbHNjcmVlbldpbmRvdyhOU1Jl
Y3QgZnJhbWUsIGludCBsZXZlbCkNCit7DQorICAgIE5TV2luZG93ICp3aW5kb3cgPSBbW05TV2lu
ZG93IGFsbG9jXSBpbml0V2l0aENvbnRlbnRSZWN0OmZyYW1lIHN0eWxlTWFzazpOU0JvcmRlcmxl
c3NXaW5kb3dNYXNrIGJhY2tpbmc6TlNCYWNraW5nU3RvcmVCdWZmZXJlZCBkZWZlcjpOT107DQor
ICAgIFt3aW5kb3cgc2V0T3BhcXVlOllFU107DQorICAgIFt3aW5kb3cgc2V0QmFja2dyb3VuZENv
bG9yOltOU0NvbG9yIGJsYWNrQ29sb3JdXTsNCisgICAgW3dpbmRvdyBzZXRMZXZlbDpsZXZlbF07
DQorICAgIFt3aW5kb3cgc2V0SGlkZXNPbkRlYWN0aXZhdGU6WUVTXTsNCisgICAgW3dpbmRvdyBz
ZXRSZWxlYXNlZFdoZW5DbG9zZWQ6Tk9dOw0KKyAgICByZXR1cm4gd2luZG93Ow0KK30NCisqLw0K
Kw0KK3ZvaWQgV2ViVmlkZW9GdWxsc2NyZWVuQ29udHJvbGxlcjo6ZW50ZXJGdWxsc2NyZWVuKCkN
Cit7DQorICAgIGlmIChtb3ZpZSgpKQ0KKyAgICAgICAgbV93aW5kb3cgPSBtb3ZpZSgpLT5lbnRl
ckZ1bGxzY3JlZW4odGhpcyk7DQorICAgIA0KKyAgICBtX2h1ZENvbnRyb2xsZXIgPSBuZXcgV2Vi
VmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxlcih0aGlzLCBtX3dpbmRvdyk7DQorfQ0K
Kw0KK0xSRVNVTFQgV2ViVmlkZW9GdWxsc2NyZWVuQ29udHJvbGxlcjo6aGFuZGxlTWVzc2FnZXMo
SFdORCB0aGVXbmQsIFVJTlQgdGhlTWVzc2FnZSwgVUlOVCB3UGFyYW0sIExPTkcgbFBhcmFtKQ0K
K3sNCisgICAgZnByaW50ZihzdGRlcnIsICJtc2c9MHglMHhcbiIsIHRoZU1lc3NhZ2UpOw0KKw0K
KyAgICBzd2l0Y2godGhlTWVzc2FnZSkgew0KKyAgICAgICAgY2FzZSAweGMyMTM6CisgICAgICAg
ICAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhhY2sgdG8gd29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0
IHRoZQorICAgICAgICAgICAgLy8gZnVsbC1zY3JlZW4gd2luZG93IGRvZXMgbm90IHNlZW0gdG8g
cHJlc2VudCBhIHNwZWNpZmljIGV2ZW50CisgICAgICAgICAgICAvLyB3aGVuIHRoZSB2aWRlbyBo
YXMgYmVlbiBkaXNwbGF5ZWQgZm9yIHRoZSBmaXJzdCB0aW1lLiBJZiB5b3UKKyAgICAgICAgICAg
IC8vIGRyYXcgdGhlIEhVRCBiZWZvcmUgdGhpcywgaXQgd2lsbCBnZXQgZXJhc2VkLiBCdXQgaXQg
c2VlbXMKKyAgICAgICAgICAgIC8vIHRoYXQgYW4gZXZlbnQgd2l0aCB0aGUgaGV4IHZhbHVlIDB4
YzIxMyB0aGF0IGZpcmVzIGFmdGVyCisgICAgICAgICAgICAvLyB0aGUgZmlyc3QgV01fUEFJTlQg
ZXZlbnQgYWx3YXlzIGNvbWVzIGluIGFmdGVyIHRoZSB2aWRlbworICAgICAgICAgICAgLy8gaGFz
IHJlbmRlcmVkIGZvciB0aGUgZmlyc3QgdGltZS4gU28gd2UgdXNlIHRoYXQgc2VxdWVuY2UuCisg
ICAgICAgICAgICBpZiAobV9odWROZWVkc0luaXRpYWxEcmF3ICYmIG1faHVkSW5pdGlhbERyYXdS
ZWFkeSkgeworICAgICAgICAgICAgICAgIG1faHVkTmVlZHNJbml0aWFsRHJhdyA9IGZhbHNlOwor
ICAgICAgICAgICAgICAgIFJFQ1QgY2xlYXJSZWN0Ow0KKyAgICAgICAgICAgICAgICBHZXRDbGll
bnRSZWN0KHRoZVduZCwgJmNsZWFyUmVjdCk7DQorICAgICAgICAgICAgICAgIEludmFsaWRhdGVS
ZWN0KHRoZVduZCwgJmNsZWFyUmVjdCwgdHJ1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIFdNX1BBSU5UOgorICAgICAgICAgICAgaWYgKG1faHVk
TmVlZHNJbml0aWFsRHJhdykKKyAgICAgICAgICAgICAgICBtX2h1ZEluaXRpYWxEcmF3UmVhZHkg
PSB0cnVlOworCisgICAgICAgICAgICBQQUlOVFNUUlVDVCBwczsKKyAgICAgICAgICAgIEJlZ2lu
UGFpbnQodGhlV25kLCAmcHMpOworICAgICAgICAgICAgbV9odWRDb250cm9sbGVyLT5kcmF3KCk7
CisgICAgICAgICAgICBFbmRQYWludCh0aGVXbmQsICZwcyk7CisgICAgICAgICAgICBmcHJpbnRm
KHN0ZGVyciwgImRyYXcgSFVEIChtZXNzYWdlPTB4JTB4KVxuIiwgdGhlTWVzc2FnZSk7DQorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fQ0hBUjoKKyAgICAgICAgICAgIG1faHVk
Q29udHJvbGxlci0+b25DaGFyKHdQYXJhbSk7CisgICAgICAgICAgICBicmVhazsNCisgICAgICAg
IGNhc2UgV01fTEJVVFRPTkRPV046DQorICAgICAgICAgICAgbV9odWRDb250cm9sbGVyLT5vbk1v
dXNlRG93bihHRVRfWF9MUEFSQU0obFBhcmFtKSwgR0VUX1lfTFBBUkFNKGxQYXJhbSkpOw0KKyAg
ICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBXTV9NT1VTRU1PVkU6DQorICAgICAgICAg
ICAgbV9odWRDb250cm9sbGVyLT5vbk1vdXNlTW92ZShHRVRfWF9MUEFSQU0obFBhcmFtKSwgR0VU
X1lfTFBBUkFNKGxQYXJhbSkpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBX
TV9MQlVUVE9OVVA6DQorICAgICAgICAgICAgbV9odWRDb250cm9sbGVyLT5vbk1vdXNlVXAoR0VU
X1hfTFBBUkFNKGxQYXJhbSksIEdFVF9ZX0xQQVJBTShsUGFyYW0pKTsNCisgICAgICAgICAgICBi
cmVhazsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gRGVmV2luZG93UHJvYyh0aGVXbmQsIHRoZU1l
c3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsNCit9DQorDQordm9pZCBXZWJWaWRlb0Z1bGxzY3JlZW5D
b250cm9sbGVyOjpodWRDbGllbnRFeGl0RnVsbHNjcmVlbigpDQorew0KKyAgICBpZiAobV9tZWRp
YUVsZW1lbnQpDQorICAgICAgICBtX21lZGlhRWxlbWVudC0+ZXhpdEZ1bGxzY3JlZW4oKTsNCit9
DQorDQorYm9vbCBXZWJWaWRlb0Z1bGxzY3JlZW5Db250cm9sbGVyOjpodWRDbGllbnRDYW5QbGF5
KCkNCit7DQorICAgIHJldHVybiBtX21lZGlhRWxlbWVudCA/IG1fbWVkaWFFbGVtZW50LT5jYW5Q
bGF5KCkgOiBmYWxzZTsNCit9DQorDQordm9pZCBXZWJWaWRlb0Z1bGxzY3JlZW5Db250cm9sbGVy
OjpodWRDbGllbnRQbGF5KCkNCit7DQorICAgIGlmIChtX21lZGlhRWxlbWVudCkNCisgICAgICAg
IG1fbWVkaWFFbGVtZW50LT5wbGF5KCk7DQorfQ0KKw0KK3ZvaWQgV2ViVmlkZW9GdWxsc2NyZWVu
Q29udHJvbGxlcjo6aHVkQ2xpZW50UGF1c2UoKQ0KK3sNCisgICAgaWYgKG1fbWVkaWFFbGVtZW50
KQ0KKyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPnBhdXNlKCk7DQorfQ0KKw0KK3ZvaWQgV2ViVmlk
ZW9GdWxsc2NyZWVuQ29udHJvbGxlcjo6ZXhpdEZ1bGxzY3JlZW4oKQ0KK3sNCisgICAgaWYgKG1v
dmllKCkpDQorICAgICAgICBtb3ZpZSgpLT5leGl0RnVsbHNjcmVlbigpOw0KK30NCisNCisjZW5k
aWYgLyogRU5BQkxFKFZJREVPKSAqLw0KClByb3BlcnR5IGNoYW5nZXMgb246IFdlYktpdC93aW4v
V2ViVmlkZW9GdWxsc2NyZWVuQ29udHJvbGxlci5jcHAKX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmV4
ZWN1dGFibGUKICAgKyAqCgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL1dlYktpdC52
Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL1dlYktpdC52Y3By
b2oJKHJldmlzaW9uIDUwNDcwKQorKysgV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL1dlYktpdC52
Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTgyMiw2ICs4MjIsMTQgQEAKIAkJCQk+DQogCQkJPC9G
aWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViVmlkZW9GdWxsc2NyZWVu
Q29udHJvbGxlci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0
aXZlUGF0aD0iLi5cV2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxlci5oIg0KKwkJ
CQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViVmll
dy5oIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KQEAgLTEyMTAsNiArMTIxOCwxNCBAQAogCQkJCT4N
CiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxXZWJWaWRlb0Z1
bGxzY3JlZW5Db250cm9sbGVyLmNwcCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0K
KwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlZpZGVvRnVsbHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xs
ZXIuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0
aD0iLi5cV2ViVmlldy5jcHAiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpJbmRleDogV2ViS2l0L3dp
bi9XZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9sbGVyLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L3dpbi9XZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9sbGVyLmgJKHJldmlz
aW9uIDApCisrKyBXZWJLaXQvd2luL1dlYlZpZGVvRnVsbHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xs
ZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMDYgQEAKKy8qDQorICogQ29weXJpZ2h0IChD
KSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucw0KKyAqIGFyZSBtZXQ6DQorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
DQorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4N
CisgKg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkNCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUg0KKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUg0KKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLA0KKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywNCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IN
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZDQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUDQorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gDQorICovDQorDQorI2lmbmRlZiBXZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9s
bGVyX2gNCisjZGVmaW5lIFdlYlZpZGVvRnVsbHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xsZXJfaA0K
Kw0KKyNpZiBFTkFCTEUoVklERU8pDQorDQorI2luY2x1ZGUgPFdlYkNvcmUvSFRNTE1lZGlhRWxl
bWVudC5oPg0KKyNpbmNsdWRlIDxXZWJDb3JlL0ltYWdlLmg+DQorI2luY2x1ZGUgPFdlYkNvcmUv
SW50UG9pbnQuaD4NCisNCitjbGFzcyBXZWJWaWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9s
bGVyOw0KK2NsYXNzIFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDsNCisNCisvLyBCdXR0b24gVUkg
SGFuZGxlcg0KK2NsYXNzIEhVREJ1dHRvbiB7DQorcHVibGljOg0KKyAgICBlbnVtIEhVREJ1dHRv
blR5cGUgew0KKyAgICAgICAgUGxheVBhdXNlQnV0dG9uLA0KKyAgICAgICAgVGltZVNsaWRlckJ1
dHRvbiwNCisgICAgICAgIFZvbHVtZVVwQnV0dG9uLA0KKyAgICAgICAgVm9sdW1lU2xpZGVyQnV0
dG9uLA0KKyAgICAgICAgVm9sdW1lRG93bkJ1dHRvbiwNCisgICAgICAgIEV4aXRGdWxsc2NyZWVu
QnV0dG9uDQorICAgIH07DQorDQorICAgIEhVREJ1dHRvbihXZWJWaWRlb0Z1bGxzY3JlZW5IVURX
aW5kb3dDb250cm9sbGVyKiwgSFVEQnV0dG9uVHlwZSB0eXBlLCBjb25zdCBXZWJDb3JlOjpJbnRQ
b2ludCYpOw0KKyAgICB+SFVEQnV0dG9uKCk7DQorDQorICAgIHZvaWQgZHJhdyhXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQmKTsNCisgICAgYm9vbCBpc1BpY2tlZChpbnQgeCwgaW50IHkpIGNvbnN0
Ow0KKw0KK3ByaXZhdGU6DQorICAgIFJlZlB0cjxXZWJDb3JlOjpJbWFnZT4gbV9idXR0b25JbWFn
ZTsNCisgICAgUmVmUHRyPFdlYkNvcmU6OkltYWdlPiBtX2J1dHRvblByZXNzZWRJbWFnZTsNCisN
CisgICAgaW50IG1fd2lkdGgsIG1faGVpZ2h0Ow0KKyAgICBXZWJDb3JlOjpJbnRQb2ludCBtX3Bv
c2l0aW9uOw0KKyAgICBIVURCdXR0b25UeXBlIG1fdHlwZTsNCit9Ow0KKw0KK2NsYXNzIFdlYlZp
ZGVvRnVsbHNjcmVlbkhVRENsaWVudCB7DQorcHVibGljOg0KKyAgICB2aXJ0dWFsIHZvaWQgaHVk
Q2xpZW50RXhpdEZ1bGxzY3JlZW4oKSA9IDA7DQorICAgIHZpcnR1YWwgYm9vbCBodWRDbGllbnRD
YW5QbGF5KCkgPSAwOw0KKyAgICB2aXJ0dWFsIHZvaWQgaHVkQ2xpZW50UGxheSgpID0gMDsNCisg
ICAgdmlydHVhbCB2b2lkIGh1ZENsaWVudFBhdXNlKCkgPSAwOw0KK307DQorDQorY2xhc3MgV2Vi
VmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxlciB7DQorcHVibGljOg0KKyAgICBXZWJW
aWRlb0Z1bGxzY3JlZW5IVURXaW5kb3dDb250cm9sbGVyKFdlYlZpZGVvRnVsbHNjcmVlbkhVRENs
aWVudCosIEhXTkQpOw0KKyAgICB+V2ViVmlkZW9GdWxsc2NyZWVuSFVEV2luZG93Q29udHJvbGxl
cigpOw0KKw0KKyAgICB2b2lkIGRyYXcoKTsNCisgICAgdm9pZCBtb3ZlKGludCB4LCBpbnQgeSk7
DQorDQorICAgIHZvaWQgb25DaGFyKGludCBjKTsNCisgICAgdm9pZCBvbk1vdXNlRG93bihpbnQg
eCwgaW50IHkpOw0KKyAgICB2b2lkIG9uTW91c2VNb3ZlKGludCB4LCBpbnQgeSk7DQorICAgIHZv
aWQgb25Nb3VzZVVwKGludCB4LCBpbnQgeSk7DQorDQorcHJpdmF0ZToNCisgICAgdm9pZCB0b2dn
bGVQbGF5KCk7DQorDQorICAgIFdlYlZpZGVvRnVsbHNjcmVlbkhVRENsaWVudCogbV9jbGllbnQ7
DQorICAgIEhXTkQgbV93aW5kb3c7DQorICAgIE93blB0cjxIQklUTUFQPiBtX2JpdG1hcDsNCisg
ICAgU0laRSBtX3NpemU7DQorICAgIGludCBtX3hQb3MsIG1feVBvczsNCisgICAgdm9pZCogbV9w
aXhlbHM7DQorDQorICAgIEhVREJ1dHRvbiAgIG1fcGxheVBhdXNlQnV0dG9uOw0KKyAgICBIVURC
dXR0b24gICBtX3RpbWVTbGlkZXJCdXR0b247DQorICAgIEhVREJ1dHRvbiAgIG1fdm9sdW1lVXBC
dXR0b247DQorICAgIEhVREJ1dHRvbiAgIG1fdm9sdW1lU2xpZGVyQnV0dG9uOw0KKyAgICBIVURC
dXR0b24gICBtX3ZvbHVtZURvd25CdXR0b247DQorICAgIEhVREJ1dHRvbiAgIG1fZXhpdEZ1bGxz
Y3JlZW5CdXR0b247DQorfTsNCisNCisjZW5kaWYNCisNCisjZW5kaWYNCgpQcm9wZXJ0eSBjaGFu
Z2VzIG9uOiBXZWJLaXQvd2luL1dlYlZpZGVvRnVsbHNjcmVlbkhVRFdpbmRvd0NvbnRyb2xsZXIu
aApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCkFkZGVkOiBzdm46ZXhlY3V0YWJsZQogICArICoKCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAkocmV2aXNpb24gNTA0NzAp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTAxLDYgKzEwMSwxMSBAQAogICAgIFFUTW92aWVXaW4qIG1fbW92aWVXaW47
CiAgICAgTW92aWUgbV9tb3ZpZTsKICAgICBNb3ZpZUNvbnRyb2xsZXIgbV9tb3ZpZUNvbnRyb2xs
ZXI7CisgICAgV2luZG93UHRyIG1fZnVsbHNjcmVlbldpbmRvdzsKKyAgICBHV29ybGRQdHIgbV9v
cmlnR1dvcmxkOworICAgIFJlY3QgbV9mc1JlY3Q7CisgICAgUVRNb3ZpZVdpbkZTQ2xpZW50KiBt
X2ZzQ2xpZW50OworICAgIGNoYXIqIG1fcmVzdG9yZVN0YXRlOwogICAgIGJvb2wgbV90YXNraW5n
OwogICAgIFFUTW92aWVXaW5DbGllbnQqIG1fY2xpZW50OwogICAgIGxvbmcgbV9sb2FkU3RhdGU7
CkBAIC0xMzAsNiArMTM1LDEwIEBACiAgICAgOiBtX21vdmllV2luKDApCiAgICAgLCBtX21vdmll
KDApCiAgICAgLCBtX21vdmllQ29udHJvbGxlcigwKQorICAgICwgbV9mdWxsc2NyZWVuV2luZG93
KDApCisgICAgLCBtX29yaWdHV29ybGQoMCkKKyAgICAsIG1fZnNDbGllbnQoMCkKKyAgICAsIG1f
cmVzdG9yZVN0YXRlKDApCiAgICAgLCBtX3Rhc2tpbmcoZmFsc2UpCiAgICAgLCBtX2NsaWVudCgw
KQogICAgICwgbV9sb2FkU3RhdGUoMCkKQEAgLTEwMzEsNiArMTA0MCw0NCBAQAogICAgIHJldHVy
biBpbml0aWFsaXphdGlvblN1Y2NlZWRlZDsKIH0KIAorTFJFU1VMVCBRVE1vdmllV2luOjpfaGFu
ZGxlTWVzc2FnZXMoSFdORCB0aGVXbmQsIFVJTlQgdGhlTWVzc2FnZSwgVUlOVCB3UGFyYW0sIExP
TkcgbFBhcmFtKQoreworICAgIFFUTW92aWVXaW4qIG1vdmllID0gcmVpbnRlcnByZXRfY2FzdDxR
VE1vdmllV2luKj4oR2V0V2luZG93TG9uZ1B0cih0aGVXbmQsIEdXTF9VU0VSREFUQSkpOworICAg
IHJldHVybiBtb3ZpZS0+bV9wcml2YXRlLT5tX2ZzQ2xpZW50LT5oYW5kbGVNZXNzYWdlcyh0aGVX
bmQsIHRoZU1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKK30KKworSFdORCBRVE1vdmllV2luOjpl
bnRlckZ1bGxzY3JlZW4oUVRNb3ZpZVdpbkZTQ2xpZW50KiBjbGllbnQpCit7CisgICAgbV9wcml2
YXRlLT5tX2ZzQ2xpZW50ID0gY2xpZW50OworICAgIAorCU9TRXJyIG15RXJyID0gQmVnaW5GdWxs
U2NyZWVuKCZtX3ByaXZhdGUtPm1fcmVzdG9yZVN0YXRlLCBOVUxMLCAwLCAwLCAmbV9wcml2YXRl
LT5tX2Z1bGxzY3JlZW5XaW5kb3csIE5VTEwsIGZ1bGxTY3JlZW5BbGxvd0V2ZW50cyk7IAorCVFU
TUxTZXRXaW5kb3dXbmRQcm9jKG1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93LCBfaGFuZGxl
TWVzc2FnZXMpOworCUNyZWF0ZVBvcnRBc3NvY2lhdGlvbihHZXRQb3J0TmF0aXZlV2luZG93KG1f
cHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93KSwgTlVMTCwgMEwpOworCisgICAgR2V0TW92aWVC
b3gobV9wcml2YXRlLT5tX21vdmllLCAmbV9wcml2YXRlLT5tX2ZzUmVjdCk7CisJR2V0TW92aWVH
V29ybGQobV9wcml2YXRlLT5tX21vdmllLCAmbV9wcml2YXRlLT5tX29yaWdHV29ybGQsIE5VTEwp
OworCVNldE1vdmllR1dvcmxkKG1fcHJpdmF0ZS0+bV9tb3ZpZSwgKENHcmFmUHRyKW1fcHJpdmF0
ZS0+bV9mdWxsc2NyZWVuV2luZG93LCBHZXRHV29ybGREZXZpY2UoKENHcmFmUHRyKW1fcHJpdmF0
ZS0+bV9mdWxsc2NyZWVuV2luZG93KSk7CisJU2V0TW92aWVCb3gobV9wcml2YXRlLT5tX21vdmll
LCAmbV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5XaW5kb3ctPnBvcnRSZWN0KTsKKworICAgIC8vIHNl
dCB0aGUgdGhpcyBwb2ludGVyIG9uIHRoZSBIV05ECisgICAgSFdORCB3bmQgPSAoSFdORCkgR2V0
UG9ydE5hdGl2ZVdpbmRvdyhtX3ByaXZhdGUtPm1fZnVsbHNjcmVlbldpbmRvdyk7CisgICAgU2V0
V2luZG93TG9uZ1B0cih3bmQsIEdXTF9VU0VSREFUQSwgKExPTkcpIHRoaXMpOworCisgICAgcmV0
dXJuIHduZDsKK30KKwordm9pZCBRVE1vdmllV2luOjpleGl0RnVsbHNjcmVlbigpCit7CisgICAg
aWYgKCFtX3ByaXZhdGUtPm1fZnVsbHNjcmVlbldpbmRvdykKKyAgICAgICAgcmV0dXJuOworCisg
ICAgU2V0TW92aWVHV29ybGQobV9wcml2YXRlLT5tX21vdmllLCBtX3ByaXZhdGUtPm1fb3JpZ0dX
b3JsZCwgTlVMTCk7CisgICAgT1NFcnIgbXlFcnIgPSBFbmRGdWxsU2NyZWVuKG1fcHJpdmF0ZS0+
bV9yZXN0b3JlU3RhdGUsIDBMKTsKKyAgICBTZXRNb3ZpZUJveChtX3ByaXZhdGUtPm1fbW92aWUs
ICZtX3ByaXZhdGUtPm1fZnNSZWN0KTsKKyAgICBEZXN0cm95UG9ydEFzc29jaWF0aW9uKChDR3Jh
ZlB0cikgbV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5XaW5kb3cpOworICAgIG1fcHJpdmF0ZS0+bV9m
dWxsc2NyZWVuV2luZG93ID0gMDsKK30KKwogQk9PTCBXSU5BUEkgRGxsTWFpbihISU5TVEFOQ0Ug
aGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdlJlc2VydmVkKQogewogICAgIHN3
aXRjaCAoZmR3UmVhc29uKSB7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9N
ZWRpYVBsYXllclByaXZhdGVRdWlja1RpbWVXaW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXllclByaXZhdGVRdWlja1RpbWVXaW4uaAkocmV2
aXNpb24gNTA0NzApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXll
clByaXZhdGVRdWlja1RpbWVXaW4uaAkod29ya2luZyBjb3B5KQpAQCAtOTMsNiArOTMsMTYgQEAK
ICAgICAKICAgICBib29sIGhhc1NpbmdsZVNlY3VyaXR5T3JpZ2luKCkgY29uc3Q7CiAKKyAgICB2
aXJ0dWFsIGJvb2wgc3VwcG9ydHNGdWxsc2NyZWVuKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQor
CisgICAgdmlydHVhbCBQbGF0Zm9ybU1lZGlhIHBsYXRmb3JtTWVkaWEoKSBjb25zdAorICAgIHsK
KyAgICAgICAgUGxhdGZvcm1NZWRpYSBwOworICAgICAgICBNZWRpYVBsYXllclByaXZhdGUqIG0g
PSBjb25zdF9jYXN0PE1lZGlhUGxheWVyUHJpdmF0ZSo+KHRoaXMpOworICAgICAgICBwLnF0TW92
aWUgPSByZWludGVycHJldF9jYXN0PFFUTW92aWUqPihtLT5tX3F0TW92aWUuZ2V0KCkpOworICAg
ICAgICByZXR1cm4gcDsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgTWVkaWFQbGF5ZXJQcml2YXRl
KE1lZGlhUGxheWVyKik7CiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1FU
TW92aWVXaW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9R
VE1vdmllV2luLmgJKHJldmlzaW9uIDUwNDcwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vUVRNb3ZpZVdpbi5oCSh3b3JraW5nIGNvcHkpCkBAIC00NSw2ICs0NSwxMSBAQAogICAg
IHZpcnR1YWwgdm9pZCBtb3ZpZU5ld0ltYWdlQXZhaWxhYmxlKFFUTW92aWVXaW4qKSA9IDA7CiB9
OwogCitjbGFzcyBRVE1vdmllV2luRlNDbGllbnQgeworcHVibGljOgorICAgIHZpcnR1YWwgTFJF
U1VMVCBoYW5kbGVNZXNzYWdlcyhIV05EIHRoZVduZCwgVUlOVCB0aGVNZXNzYWdlLCBVSU5UIHdQ
YXJhbSwgTE9ORyBsUGFyYW0pID0gMDsKK307CisKIGVudW0gewogICAgIFFUTW92aWVMb2FkU3Rh
dGVFcnJvciA9IC0xTCwKICAgICBRVE1vdmllTG9hZFN0YXRlTG9hZGVkICA9IDIwMDBMLApAQCAt
MTAxLDggKzEwNiwxMyBAQAogICAgIHN0YXRpYyB1bnNpZ25lZCBjb3VudFN1cHBvcnRlZFR5cGVz
KCk7CiAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkVHlwZSh1bnNpZ25lZCBpbmRleCwgY29u
c3QgVUNoYXIqJiBzdHIsIHVuc2lnbmVkJiBsZW4pOwogCisgICAgSFdORCBlbnRlckZ1bGxzY3Jl
ZW4oUVRNb3ZpZVdpbkZTQ2xpZW50KiBjbGllbnQpOworICAgIHZvaWQgZXhpdEZ1bGxzY3JlZW4o
KTsKKwogcHJpdmF0ZToKICAgICB2b2lkIGxvYWQoQ0ZVUkxSZWYsIGJvb2wgcHJlc2VydmVzUGl0
Y2gpOworICAgIHN0YXRpYyBMUkVTVUxUIF9oYW5kbGVNZXNzYWdlcyhIV05EIHRoZVduZCwgVUlO
VCB0aGVNZXNzYWdlLCBVSU5UIHdQYXJhbSwgTE9ORyBsUGFyYW0pOworICAgIExSRVNVTFQgaGFu
ZGxlTWVzc2FnZXMoSFdORCB0aGVXbmQsIFVJTlQgdGhlTWVzc2FnZSwgVUlOVCB3UGFyYW0sIExP
TkcgbFBhcmFtKTsKIAogICAgIFFUTW92aWVXaW5Qcml2YXRlKiBtX3ByaXZhdGU7CiAgICAgYm9v
bCBtX2Rpc2FibGVkOwpJbmRleDogV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0ZyYW1lTG9hZGVyLmNwcAkocmV2aXNpb24gNTA0NzAp
CisrKyBXZWJDb3JlL2xvYWRlci9GcmFtZUxvYWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0
NjAsNyArMTQ2MCw3IEBACiB7CiAgICAgQVNTRVJUKG1fd29ya2luZ1VSTC5pc0VtcHR5KCkpOwog
ICAgIEFTU0VSVChtX2ZyYW1lLT5kb2N1bWVudCgpKTsKLSAgICBBU1NFUlQobV9mcmFtZS0+ZG9j
dW1lbnQoKS0+cGFyc2luZygpKTsKKyAgICAvL0FTU0VSVChtX2ZyYW1lLT5kb2N1bWVudCgpLT5w
YXJzaW5nKCkpOwogICAgIHdyaXRlKGJ5dGVzLCBsZW5ndGgpOwogfQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44717</attachid>
            <date>2009-12-11 16:26:55 -0800</date>
            <delta_ts>2009-12-11 16:32:26 -0800</delta_ts>
            <desc>Icons for full-screen video controller</desc>
            <filename>31318-icons.patch</filename>
            <type>text/plain</type>
            <size>8395</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC93aW4vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vQ2hh
bmdlTG9nCShyZXZpc2lvbiA1MjAyOSkKKysrIFdlYktpdC93aW4vQ2hhbmdlTG9nCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDMgKzEsMTkgQEAKKzIwMDktMTItMTEgIENocmlzIE1hcnJpbiAgPGNtYXJy
aW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEFkZGVkIGljb25zIGZvciBmdWxsLXNjcmVlbiB2aWRlbyBvbiBXaW5kb3dzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTMxOAorCisgICAg
ICAgICogV2ViS2l0LnZjcHJvai9XZWJLaXQucmM6CisgICAgICAgICogV2ViS2l0LnZjcHJvai9X
ZWJLaXQudmNwcm9qOgorICAgICAgICAqIFdlYktpdC52Y3Byb2ovZnNWaWRlb0F1ZGlvVm9sdW1l
SGlnaC5wbmc6IEFkZGVkLgorICAgICAgICAqIFdlYktpdC52Y3Byb2ovZnNWaWRlb0F1ZGlvVm9s
dW1lTG93LnBuZzogQWRkZWQuCisgICAgICAgICogV2ViS2l0LnZjcHJvai9mc1ZpZGVvRXhpdEZ1
bGxzY3JlZW4ucG5nOiBBZGRlZC4KKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL2ZzVmlkZW9QYXVz
ZS5wbmc6IEFkZGVkLgorICAgICAgICAqIFdlYktpdC52Y3Byb2ovZnNWaWRlb1BsYXkucG5nOiBB
ZGRlZC4KKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL3Jlc291cmNlLmg6CisKIDIwMDktMTItMTEg
IENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUuY29tPgogCkluZGV4OiBXZWJLaXQvd2luL1dl
YktpdC52Y3Byb2ovV2ViS2l0LnJjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViS2l0LnZj
cHJvai9XZWJLaXQucmMJKHJldmlzaW9uIDUyMDE4KQorKysgV2ViS2l0L3dpbi9XZWJLaXQudmNw
cm9qL1dlYktpdC5yYwkod29ya2luZyBjb3B5KQpAQCAtODEsNCArODEsOSBAQCBJRFJfU0VBUkNI
X0NBTkNFTCAgICAgICAgICAgICAgICBQTkcgICAgCiBJRFJfU0VBUkNIX0NBTkNFTF9QUkVTU0VE
ICAgICAgICBQTkcgICAgICAgICAgICAgICAgICAgICAic2VhcmNoQ2FuY2VsUHJlc3NlZC5wbmci
CiBJRFJfU0VBUkNIX01BR05JRklFUiAgICAgICAgICAgICBQTkcgICAgICAgICAgICAgICAgICAg
ICAic2VhcmNoTWFnbmlmaWVyLnBuZyIKIElEUl9TRUFSQ0hfTUFHTklGSUVSX1JFU1VMVFMgICAg
IFBORyAgICAgICAgICAgICAgICAgICAgICJzZWFyY2hNYWduaWZpZXJSZXN1bHRzLnBuZyIKK0lE
Ul9GU19WSURFT19BVURJT19WT0xVTUVfSElHSCAgIFBORyAgICAgICAgICAgICAgICAgICAgICJm
c1ZpZGVvQXVkaW9Wb2x1bWVIaWdoLnBuZyIKK0lEUl9GU19WSURFT19BVURJT19WT0xVTUVfTE9X
ICAgIFBORyAgICAgICAgICAgICAgICAgICAgICJmc1ZpZGVvQXVkaW9Wb2x1bWVMb3cucG5nIgor
SURSX0ZTX1ZJREVPX0VYSVRfRlVMTFNDUkVFTiAgICAgUE5HICAgICAgICAgICAgICAgICAgICAg
ImZzVmlkZW9FeGl0RnVsbHNjcmVlbi5wbmciCitJRFJfRlNfVklERU9fUEFVU0UgICAgICAgICAg
ICAgICBQTkcgICAgICAgICAgICAgICAgICAgICAiZnNWaWRlb1BhdXNlLnBuZyIKK0lEUl9GU19W
SURFT19QTEFZICAgICAgICAgICAgICAgIFBORyAgICAgICAgICAgICAgICAgICAgICJmc1ZpZGVv
UGxheS5wbmciCiAKSW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9XZWJLaXQudmNwcm9q
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9XZWJLaXQudmNwcm9qCShy
ZXZpc2lvbiA1MjAxOCkKKysrIFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9XZWJLaXQudmNwcm9q
CSh3b3JraW5nIGNvcHkpCkBAIC03MjIsMTQgKzcyMiw2IEBACiAJCQkJPg0KIAkJCTwvRmlsZT4N
CiAJCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlNjcmlwdFdvcmxkLmgiDQotCQkJ
CT4NCi0JCQk8L0ZpbGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPEZpbGUNCi0JCQkJUmVs
YXRpdmVQYXRoPSIuLlxXZWJTZXJpYWxpemVkSlNWYWx1ZS5oIg0KLQkJCQk+DQotCQkJPC9GaWxl
Pg0KLQkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViS2l0U3RhdGlzdGljcy5oIg0K
IAkJCQk+DQogCQkJPC9GaWxlPg0KQEAgLTgwMiw2ICs3OTQsMTAgQEAKIAkJCQk+DQogCQkJPC9G
aWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViU2NyaXB0V29ybGQuaCIN
CisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdl
YlNjcm9sbEJhci5oIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KQEAgLTgxMCw2ICs4MDYsMTAgQEAK
IAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2Vi
U2VyaWFsaXplZEpTVmFsdWUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlRleHRSZW5kZXJlci5oIg0KIAkJCQk+DQogCQkJPC9GaWxl
Pg0KQEAgLTExMDIsMTQgKzExMDIsNiBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUN
Ci0JCQkJUmVsYXRpdmVQYXRoPSIuLlxXZWJTY3JpcHRXb3JsZC5jcHAiDQotCQkJCT4NCi0JCQk8
L0ZpbGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRo
PSIuLlxXZWJTZXJpYWxpemVkSlNWYWx1ZS5jcHAiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJ
PEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxXZWJLaXRTdGF0aXN0aWNzLmNwcCINCiAJCQkJ
Pg0KIAkJCTwvRmlsZT4NCkBAIC0xMTQ2LDYgKzExMzgsMTAgQEAKIAkJCQk+DQogCQkJPC9GaWxl
Pg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViU2NyaXB0V29ybGQuY3BwIg0K
KwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2Vi
U2Nyb2xsQmFyLmNwcCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCkBAIC0xMTU0LDYgKzExNTAsMTAg
QEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5c
V2ViU2VyaWFsaXplZEpTVmFsdWUuY3BwIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxl
DQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViVGV4dFJlbmRlcmVyLmNwcCINCiAJCQkJPg0KIAkJ
CTwvRmlsZT4NCkBAIC0xMjQ2LDYgKzEyNDYsMjYgQEAKIAkJCU5hbWU9IlJlc291cmNlcyINCiAJ
CQk+DQogCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuXGZzVmlkZW9BdWRpb1ZvbHVtZUhp
Z2gucG5nIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0
aD0iLlxmc1ZpZGVvQXVkaW9Wb2x1bWVMb3cucG5nIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJ
CTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxmc1ZpZGVvRXhpdEZ1bGxzY3JlZW4ucG5nIg0K
KwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlxmc1Zp
ZGVvUGF1c2UucG5nIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0
aXZlUGF0aD0iLlxmc1ZpZGVvUGxheS5wbmciDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZp
bGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuXG1pc3NpbmdJbWFnZS5wbmciDQogCQkJCT4NCiAJCQk8
L0ZpbGU+DQpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL3Jlc291cmNlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL3Jlc291cmNlLmgJKHJldmlzaW9uIDUy
MDE4KQorKysgV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL3Jlc291cmNlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTIzLDYgKzIzLDExIEBACiAjZGVmaW5lIElEUl9TRUFSQ0hfQ0FOQ0VMX1BSRVNTRUQg
ICAgICAgMTkKICNkZWZpbmUgSURSX1NFQVJDSF9NQUdOSUZJRVIgICAgICAgICAgICAyMAogI2Rl
ZmluZSBJRFJfU0VBUkNIX01BR05JRklFUl9SRVNVTFRTICAgIDIxCisjZGVmaW5lIElEUl9GU19W
SURFT19BVURJT19WT0xVTUVfSElHSCAgMjIKKyNkZWZpbmUgSURSX0ZTX1ZJREVPX0FVRElPX1ZP
TFVNRV9MT1cgICAyMworI2RlZmluZSBJRFJfRlNfVklERU9fRVhJVF9GVUxMU0NSRUVOICAgIDI0
CisjZGVmaW5lIElEUl9GU19WSURFT19QQVVTRSAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgSURS
X0ZTX1ZJREVPX1BMQVkgICAgICAgICAgICAgICAyNgogI2RlZmluZSBJRENfU1RBVElDICAgICAg
ICAgICAgICAgICAgICAgIC0xCiAKICNkZWZpbmUgQlVJTERfTlVNQkVSICAgICAgICAgICAgICAg
ICAgICAxCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRlb0F1ZGlvVm9sdW1l
SGlnaC5wbmcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5h
cnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKUHJvcGVy
dHkgY2hhbmdlcyBvbjogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9BdWRpb1ZvbHVt
ZUhpZ2gucG5nCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjpleGVjdXRhYmxlCiAgICsgKgpBZGRlZDog
c3ZuOm1pbWUtdHlwZQogICArIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKCmlWQk9SdzBLR2dv
QUFBQU5TVWhFVWdBQUFBOEFBQUFPQ0FZQUFBRHdpa2J2QUFBQUNYQklXWE1BQUF1SkFBQUxpUUUz
eWN1dEFBQUEKR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFB
QU9GSlJFRlVlTnFVVXRFTmdqQVViSW4vc0FGMQpBdDFBTm9BTmNBUGR3QkVZZ1RpQmJvQWI2QWJB
QkxwQnZaZGNrNWNxZ2k4NVdxNTk3OXAzTldaaGVPOWJvQVBTdVkwcGtFZmNCdWlCCmV5aVFmRXZF
Y0FPY0t0VHhmOHR0MXlsRnFTeXhVL3lGWENsOFdMZjRuRlIrcGFvWHdFTTRhKzFaQ3NnYTVtdWVa
REIrT2tRaEI1NUEKelhuZ0QzTC81RmZqb0RKaU9BSjd6Z2QxSXBjc2NNa3hTU0lEWG1GaE5XY1ps
UXMyTUtNVEZkVS9Ib0xYM2FZRHdZV09uUGpkVEwyawoyS3FlamN2WkxCOC9vcmlBVHE2cFhqS3hN
UXZ1YTZJQ0VxMzVONmhhYSs0dHdBQjVMaFBUTG5vNTl3QUFBQUJKUlU1RXJrSmdnZz09CgpJbmRl
eDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9BdWRpb1ZvbHVtZUxvdy5wbmcKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlwZS4Kc3Zu
Om1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKUHJvcGVydHkgY2hhbmdlcyBv
bjogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9BdWRpb1ZvbHVtZUxvdy5wbmcKX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXwpBZGRlZDogc3ZuOmV4ZWN1dGFibGUKICAgKyAqCkFkZGVkOiBzdm46bWltZS10eXBl
CiAgICsgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCgoKaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FB
QUFvQUFBQUtDQVlBQUFDTk1zKzlBQUFBQ1hCSVdYTUFBQXVKQUFBTGlRRTN5Y3V0QUFBQQpHWFJG
V0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBRzFKUkVGVWVOcGlZ
TUFDL3YvL0h3L0U5Z3o0CkFGVFJmN3dLa1JTQkZRS3hQQkRyZytSWVFDSjRMQWdBNGdsQUpRRU0v
M0VEZTZndElMQ2ZpWUZJd0VUQVkvSlE1Z1VXSU5HQTVpWUQKSkw0Q0VDOUFVd00yZ1IrSXoyTUxI
aFNyR1JrWlB3SXBCNUJWNk00QUNEQUE3S3RuV0hwdHQ4WUFBQUFBU1VWT1JLNUNZSUk9CgpJbmRl
eDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9FeGl0RnVsbHNjcmVlbi5wbmcKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlwZS4Kc3Zu
Om1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKUHJvcGVydHkgY2hhbmdlcyBv
bjogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9FeGl0RnVsbHNjcmVlbi5wbmcKX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXwpBZGRlZDogc3ZuOmV4ZWN1dGFibGUKICAgKyAqCkFkZGVkOiBzdm46bWltZS10eXBl
CiAgICsgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCgoKaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FB
QUJBQUFBQU9DQVlBQUFBbUw1eUtBQUFBQ1hCSVdYTUFBQXVKQUFBTGlRRTN5Y3V0QUFBQQpHWFJG
V0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBSnhKUkVGVWVOcGkr
UC8vLy9uL0VBQ2krUm1nCkFNaU9aeUFHL0VjRllFT0FlRDRRN3lmV2dQMW9ocnlIMGtRWndBVEVB
VUI4QVVsTWdJRUV3TVRJeVBnUlNEc0E4UWNHTWdBVGxKNUEKcXMwd3dBSU5iUVVnUG9BbWQ0RVlB
eGlKQ0dSUTFCcmdrTDVBVEN6Wi84Y081aE1iemZiNE5ETXhrQWNNWUttV2JBTkFnUTR5aEJRRApG
cUFGR3NpUUJtSU5XQUJNY0luUUJJY1M4Z0FCQmdEblY1R01HNWdKQWdBQUFBQkpSVTVFcmtKZ2dn
PT0KCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRlb1BhdXNlLnBuZwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09CkNhbm5vdCBkaXNwbGF5OiBmaWxlIG1hcmtlZCBhcyBhIGJpbmFyeSB0eXBlLgpzdm46
bWltZS10eXBlID0gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCgpQcm9wZXJ0eSBjaGFuZ2VzIG9u
OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRlb1BhdXNlLnBuZwpfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFk
ZGVkOiBzdm46ZXhlY3V0YWJsZQogICArICoKQWRkZWQ6IHN2bjptaW1lLXR5cGUKICAgKyBhcHBs
aWNhdGlvbi9vY3RldC1zdHJlYW0KCgppVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBWUNB
WUFBQUQrdmcxTEFBQUFDWEJJV1hNQUFBdUpBQUFMaVFFM3ljdXRBQUFBCkdYUkZXSFJUYjJaMGQy
RnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFDeEpSRUZVZU5waStFOFkxRE9nQVpB
WUlVMU0KRERRQ293YVBHanhxOEtqQm93YVBHanhxOEdBMUdDREFBSy9pUnVlUnl1VnZBQUFBQUVs
RlRrU3VRbUNDCgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9QbGF5LnBu
Zwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09CkNhbm5vdCBkaXNwbGF5OiBmaWxlIG1hcmtlZCBhcyBhIGJpbmFyeSB0eXBl
Lgpzdm46bWltZS10eXBlID0gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCgpQcm9wZXJ0eSBjaGFu
Z2VzIG9uOiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRlb1BsYXkucG5nCl9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18KQWRkZWQ6IHN2bjpleGVjdXRhYmxlCiAgICsgKgpBZGRlZDogc3ZuOm1pbWUtdHlwZQogICAr
IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCZ0FB
QUFZQ0FZQUFBRGdkejM0QUFBQUNYQklXWE1BQUF1SkFBQUxpUUUzeWN1dEFBQUEKR1hSRldIUlRi
MlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUg5SlJFRlVlTnJVbGNzTmdD
QVVCTkVHTE5GUwp0RlBzd0JKV1NEUnFSTVBuemNGSjlzSmhKK0h6Y0pMV2tDbGtjQVE2WVVSNllp
dlNPMUUwa29JRDN5UlNQblVpbFZNbVVqMTVJclh6CkxaSWRhWkhzdVltNnVPSVlscEM1ZHpUMEZ2
M2lrTEZyaWowMGJGUmd3dzRiMTU3NmNHeUtFd0xiNG91QUtkN1pCQmdBVHpNYXdBTHEKWWlVQUFB
QUFTVVZPUks1Q1lJST0KCg==
</data>
<flag name="review"
          id="26623"
          type_id="1"
          status="+"
          setter="jhoneycutt"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45401</attachid>
            <date>2009-12-22 13:59:06 -0800</date>
            <delta_ts>2010-01-04 18:07:30 -0800</delta_ts>
            <desc>Final patch</desc>
            <filename>31318.patch</filename>
            <type>text/plain</type>
            <size>71431</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MjQ5OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMDktMTItMjIgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIElt
cGxlbWVudCBmdWxsLXNjcmVlbiB2aWRlbyBmb3IgV2luZG93cworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEzMTgKKyAgICAgICAgCisgICAgICAgIFRo
aXMgaXMgbW9zdGx5IHN1cHBvcnQgbG9naWMgZm9yIHRha2luZyB2aWRlbworICAgICAgICBpbnRv
IGFuZCBvdXQgb2YgZnVsbC1zY3JlZW4uIEl0IGFsc28gY29udGFpbnMgdGhlCisgICAgICAgIFFU
TW92aWVXaW4gcGllY2Ugd2hpY2ggYWRkcyBzdXBwb3J0IGZvciB0aGUgYWN0dWFsCisgICAgICAg
IGZ1bGwtc2NyZWVuIHdpbmRvdyBpdHNlbGYuIEV2ZW50cyBmcm9tIHRoZSB3aW5kb3cKKyAgICAg
ICAgYXJlIHNlbnQgdG8gdGhlIFdlYlZpZGVvRlNDb250cm9sbGVyIGZvciBoYW5kbGluZy4KKwor
ICAgICAgICAqIGxvYWRlci9GcmFtZUxvYWRlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFt
ZUxvYWRlcjo6YWRkRGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL01lZGlh
UGxheWVyUHJpdmF0ZVF1aWNrVGltZVdpbi5oOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5
ZXJQcml2YXRlOjpzdXBwb3J0c0Z1bGxzY3JlZW4pOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQ
bGF5ZXJQcml2YXRlOjpwbGF0Zm9ybU1lZGlhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy93aW4vUVRNb3ZpZVdpbi5jcHA6CisgICAgICAgIChRVE1vdmllV2luUHJpdmF0ZTo6UVRNb3Zp
ZVdpblByaXZhdGUpOgorICAgICAgICAoUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1aWNrVGltZSk6
CisgICAgICAgIChRVE1vdmllV2luOjpfaGFuZGxlTWVzc2FnZXMpOgorICAgICAgICAoUVRNb3Zp
ZVdpbjo6ZW50ZXJGdWxsc2NyZWVuKToKKyAgICAgICAgKFFUTW92aWVXaW46OmV4aXRGdWxsc2Ny
ZWVuKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vUVRNb3ZpZVdpbi5oOgorCiAy
MDA5LTEyLTIyICBQYXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IFRpbW90aHkgSGF0Y2hlci4KSW5kZXg6IFdlYkNvcmUvbG9hZGVyL0Zy
YW1lTG9hZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2xvYWRlci9GcmFtZUxvYWRlci5j
cHAJKHJldmlzaW9uIDUyNDk3KQorKysgV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNDc0LDcgKzE0NzQsNyBAQCB2b2lkIEZyYW1lTG9hZGVyOjphZGRE
YXRhKGNvbnN0IGNoYXIqIGJ5CiB7CiAgICAgQVNTRVJUKG1fd29ya2luZ1VSTC5pc0VtcHR5KCkp
OwogICAgIEFTU0VSVChtX2ZyYW1lLT5kb2N1bWVudCgpKTsKLSAgICBBU1NFUlQobV9mcmFtZS0+
ZG9jdW1lbnQoKS0+cGFyc2luZygpKTsKKyAgICAvL0FTU0VSVChtX2ZyYW1lLT5kb2N1bWVudCgp
LT5wYXJzaW5nKCkpOwogICAgIHdyaXRlKGJ5dGVzLCBsZW5ndGgpOwogfQogCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXllclByaXZhdGVRdWlja1RpbWVXaW4u
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXll
clByaXZhdGVRdWlja1RpbWVXaW4uaAkocmV2aXNpb24gNTI0OTcpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXllclByaXZhdGVRdWlja1RpbWVXaW4uaAkod29ya2lu
ZyBjb3B5KQpAQCAtNTAsNiArNTAsMTYgQEAgcHVibGljOgogCiAgICAgfk1lZGlhUGxheWVyUHJp
dmF0ZSgpOwogCisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRnVsbHNjcmVlbigpIGNvbnN0IHsg
cmV0dXJuIHRydWU7IH0KKworICAgIHZpcnR1YWwgUGxhdGZvcm1NZWRpYSBwbGF0Zm9ybU1lZGlh
KCkgY29uc3QKKyAgICB7CisgICAgICAgIFBsYXRmb3JtTWVkaWEgcDsKKyAgICAgICAgTWVkaWFQ
bGF5ZXJQcml2YXRlKiBtID0gY29uc3RfY2FzdDxNZWRpYVBsYXllclByaXZhdGUqPih0aGlzKTsK
KyAgICAgICAgcC5xdE1vdmllID0gcmVpbnRlcnByZXRfY2FzdDxRVE1vdmllKj4obS0+bV9xdE1v
dmllLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCiBwcml2YXRlOgogICAgIE1l
ZGlhUGxheWVyUHJpdmF0ZShNZWRpYVBsYXllciopOwogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAkocmV2aXNpb24gNTI0OTcpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTMwLDYgKzEzMCwxMSBAQCBwdWJsaWM6CiAjaWYgIUFTU0VSVF9ESVNBQkxFRAogICAgIGJv
b2wgbV9zY2FsZUNhY2hlZDsKICNlbmRpZgorICAgIFdpbmRvd1B0ciBtX2ZzV2luZG93OworICAg
IEdXb3JsZFB0ciBtX2ZzT3JpZ0dXb3JsZDsKKyAgICBSZWN0IG1fZnNSZWN0OworICAgIFFUTW92
aWVXaW5GU0NsaWVudCogbV9mc0NsaWVudDsKKyAgICBjaGFyKiBtX2ZzUmVzdG9yZVN0YXRlOwog
fTsKIAogUVRNb3ZpZVdpblByaXZhdGU6OlFUTW92aWVXaW5Qcml2YXRlKCkKQEAgLTE1OSw2ICsx
NjQsMTAgQEAgUVRNb3ZpZVdpblByaXZhdGU6OlFUTW92aWVXaW5Qcml2YXRlKCkKICNpZiAhQVNT
RVJUX0RJU0FCTEVECiAgICAgLCBtX3NjYWxlQ2FjaGVkKGZhbHNlKQogI2VuZGlmCisgICAgLCBt
X2ZzV2luZG93KDApCisgICAgLCBtX2ZzT3JpZ0dXb3JsZCgwKQorICAgICwgbV9mc0NsaWVudCgw
KQorICAgICwgbV9mc1Jlc3RvcmVTdGF0ZSgwKQogewogfQogCkBAIC0xMDQwLDcgKzEwNDksNyBA
QCBib29sIFFUTW92aWVXaW46OmluaXRpYWxpemVRdWlja1RpbWUoKSAKICAgICBpZiAoIWluaXRp
YWxpemVkKSB7CiAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgLy8gSW5pdGlh
bGl6ZSBhbmQgY2hlY2sgUXVpY2tUaW1lIHZlcnNpb24KLSAgICAgICAgT1NFcnIgcmVzdWx0ID0g
SW5pdGlhbGl6ZVFUTUwoMCk7CisgICAgICAgIE9TRXJyIHJlc3VsdCA9IEluaXRpYWxpemVRVE1M
KGtJbml0aWFsaXplUVRNTEVuYWJsZURvdWJsZUJ1ZmZlcmVkU3VyZmFjZSk7CiAgICAgICAgIGlm
IChyZXN1bHQgPT0gbm9FcnIpCiAgICAgICAgICAgICByZXN1bHQgPSBHZXN0YWx0KGdlc3RhbHRR
dWlja1RpbWUsICZxdWlja1RpbWVWZXJzaW9uKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBub0Vy
cikgewpAQCAtMTA1OCw2ICsxMDY3LDY1IEBAIGJvb2wgUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1
aWNrVGltZSgpIAogICAgIHJldHVybiBpbml0aWFsaXphdGlvblN1Y2NlZWRlZDsKIH0KIAorTFJF
U1VMVCBRVE1vdmllV2luOjpfaGFuZGxlTWVzc2FnZXMoSFdORCB0aGVXbmQsIFVJTlQgdGhlTWVz
c2FnZSwgVUlOVCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICAgIFFUTW92aWVXaW4qIG1vdmll
ID0gcmVpbnRlcnByZXRfY2FzdDxRVE1vdmllV2luKj4oR2V0V2luZG93TG9uZ1B0cih0aGVXbmQs
IEdXTF9VU0VSREFUQSkpOworICAgIHJldHVybiBtb3ZpZS0+bV9wcml2YXRlLT5tX2ZzQ2xpZW50
LT5mc0NsaWVudFduZFByb2ModGhlV25kLCB0aGVNZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cit9
CisKK0hXTkQgUVRNb3ZpZVdpbjo6ZW50ZXJGdWxsc2NyZWVuKFFUTW92aWVXaW5GU0NsaWVudCog
Y2xpZW50KQoreworICAgIG1fcHJpdmF0ZS0+bV9mc0NsaWVudCA9IGNsaWVudDsKKyAgICAKKwlP
U0VyciBteUVyciA9IEJlZ2luRnVsbFNjcmVlbigmbV9wcml2YXRlLT5tX2ZzUmVzdG9yZVN0YXRl
LCBOVUxMLCAwLCAwLCAmbV9wcml2YXRlLT5tX2ZzV2luZG93LCBOVUxMLCBmdWxsU2NyZWVuQWxs
b3dFdmVudHMpOyAKKwlRVE1MU2V0V2luZG93V25kUHJvYyhtX3ByaXZhdGUtPm1fZnNXaW5kb3cs
IF9oYW5kbGVNZXNzYWdlcyk7CisJQ3JlYXRlUG9ydEFzc29jaWF0aW9uKEdldFBvcnROYXRpdmVX
aW5kb3cobV9wcml2YXRlLT5tX2ZzV2luZG93KSwgTlVMTCwgMEwpOworCisgICAgR2V0TW92aWVC
b3gobV9wcml2YXRlLT5tX21vdmllLCAmbV9wcml2YXRlLT5tX2ZzUmVjdCk7CisJR2V0TW92aWVH
V29ybGQobV9wcml2YXRlLT5tX21vdmllLCAmbV9wcml2YXRlLT5tX2ZzT3JpZ0dXb3JsZCwgTlVM
TCk7CisJU2V0TW92aWVHV29ybGQobV9wcml2YXRlLT5tX21vdmllLCAoQ0dyYWZQdHIpbV9wcml2
YXRlLT5tX2ZzV2luZG93LCBHZXRHV29ybGREZXZpY2UoKENHcmFmUHRyKW1fcHJpdmF0ZS0+bV9m
c1dpbmRvdykpOworCisgICAgLy8gU2V0IHRoZSBzaXplIG9mIHRoZSBib3ggdG8gcHJlc2VydmUg
YXNwZWN0IHJhdGlvCisgICAgUmVjdCByZWN0ID0gbV9wcml2YXRlLT5tX2ZzV2luZG93LT5wb3J0
UmVjdDsKKworICAgIGZsb2F0IG1vdmllUmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4obV9wcml2
YXRlLT5tX3dpZHRoKSAvIG1fcHJpdmF0ZS0+bV9oZWlnaHQ7CisgICAgaW50IHdpbmRvd1dpZHRo
ID0gIHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7CisgICAgaW50IHdpbmRvd0hlaWdodCA9IHJlY3Qu
Ym90dG9tIC0gcmVjdC50b3A7CisgICAgZmxvYXQgd2luZG93UmF0aW8gPSBzdGF0aWNfY2FzdDxm
bG9hdD4od2luZG93V2lkdGgpIC8gd2luZG93SGVpZ2h0OworICAgIGludCBhY3R1YWxXaWR0aCA9
ICh3aW5kb3dSYXRpbyA+IG1vdmllUmF0aW8pID8gKHdpbmRvd0hlaWdodCAqIG1vdmllUmF0aW8p
IDogd2luZG93V2lkdGg7CisgICAgaW50IGFjdHVhbEhlaWdodCA9ICh3aW5kb3dSYXRpbyA8IG1v
dmllUmF0aW8pID8gKHdpbmRvd1dpZHRoIC8gbW92aWVSYXRpbykgOiB3aW5kb3dIZWlnaHQ7Cisg
ICAgaW50IG9mZnNldFggPSAod2luZG93V2lkdGggLSBhY3R1YWxXaWR0aCkgLyAyOworICAgIGlu
dCBvZmZzZXRZID0gKHdpbmRvd0hlaWdodCAtIGFjdHVhbEhlaWdodCkgLyAyOworCisgICAgcmVj
dC5sZWZ0ID0gb2Zmc2V0WDsKKyAgICByZWN0LnJpZ2h0ID0gb2Zmc2V0WCArIGFjdHVhbFdpZHRo
OworICAgIHJlY3QudG9wID0gb2Zmc2V0WTsKKyAgICByZWN0LmJvdHRvbSA9IG9mZnNldFkgKyBh
Y3R1YWxIZWlnaHQ7CisKKyAgICBTZXRNb3ZpZUJveChtX3ByaXZhdGUtPm1fbW92aWUsICZyZWN0
KTsKKyAgICBTaG93SGlkZVRhc2tCYXIodHJ1ZSk7CisKKyAgICAvLyBzZXQgdGhlIHRoaXMgcG9p
bnRlciBvbiB0aGUgSFdORAorICAgIEhXTkQgd25kID0gKEhXTkQpIEdldFBvcnROYXRpdmVXaW5k
b3cobV9wcml2YXRlLT5tX2ZzV2luZG93KTsKKyAgICBTZXRXaW5kb3dMb25nUHRyKHduZCwgR1dM
X1VTRVJEQVRBLCAoTE9ORykgdGhpcyk7CisKKyAgICByZXR1cm4gd25kOworfQorCit2b2lkIFFU
TW92aWVXaW46OmV4aXRGdWxsc2NyZWVuKCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9mc1dp
bmRvdykKKyAgICAgICAgcmV0dXJuOworCisgICAgSFdORCB3bmQgPSAoSFdORCkgR2V0UG9ydE5h
dGl2ZVdpbmRvdyhtX3ByaXZhdGUtPm1fZnNXaW5kb3cpOworICAgIFNldFdpbmRvd0xvbmdQdHIo
d25kLCBHV0xfVVNFUkRBVEEsIDApOworICAgIERlc3Ryb3lQb3J0QXNzb2NpYXRpb24oKENHcmFm
UHRyKSBtX3ByaXZhdGUtPm1fZnNXaW5kb3cpOworICAgIFNldE1vdmllR1dvcmxkKG1fcHJpdmF0
ZS0+bV9tb3ZpZSwgbV9wcml2YXRlLT5tX2ZzT3JpZ0dXb3JsZCwgTlVMTCk7CisgICAgT1NFcnIg
bXlFcnIgPSBFbmRGdWxsU2NyZWVuKG1fcHJpdmF0ZS0+bV9mc1Jlc3RvcmVTdGF0ZSwgMEwpOwor
ICAgIFNldE1vdmllQm94KG1fcHJpdmF0ZS0+bV9tb3ZpZSwgJm1fcHJpdmF0ZS0+bV9mc1JlY3Qp
OworICAgIG1fcHJpdmF0ZS0+bV9mc1dpbmRvdyA9IDA7Cit9CisKIEJPT0wgV0lOQVBJIERsbE1h
aW4oSElOU1RBTkNFIGhpbnN0RExMLCBEV09SRCBmZHdSZWFzb24sIExQVk9JRCBscHZSZXNlcnZl
ZCkKIHsKICAgICBzd2l0Y2ggKGZkd1JlYXNvbikgewpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW4vUVRNb3ZpZVdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1FUTW92aWVXaW4uaAkocmV2aXNpb24gNTI0OTcpCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDYg
KzQ1LDExIEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgbW92aWVOZXdJbWFnZUF2YWlsYWJs
ZShRVE1vdmllV2luKikgPSAwOwogfTsKIAorY2xhc3MgUVRNb3ZpZVdpbkZTQ2xpZW50IHsKK3B1
YmxpYzoKKyAgICB2aXJ0dWFsIExSRVNVTFQgZnNDbGllbnRXbmRQcm9jKEhXTkQgdGhlV25kLCBV
SU5UIHRoZU1lc3NhZ2UsIFVJTlQgd1BhcmFtLCBMT05HIGxQYXJhbSkgPSAwOworfTsKKwogZW51
bSB7CiAgICAgUVRNb3ZpZUxvYWRTdGF0ZUVycm9yID0gLTFMLAogICAgIFFUTW92aWVMb2FkU3Rh
dGVMb2FkZWQgID0gMjAwMEwsCkBAIC0xMDQsOCArMTA5LDEzIEBAIHB1YmxpYzoKICAgICBzdGF0
aWMgdW5zaWduZWQgY291bnRTdXBwb3J0ZWRUeXBlcygpOwogICAgIHN0YXRpYyB2b2lkIGdldFN1
cHBvcnRlZFR5cGUodW5zaWduZWQgaW5kZXgsIGNvbnN0IFVDaGFyKiYgc3RyLCB1bnNpZ25lZCYg
bGVuKTsKIAorICAgIEhXTkQgZW50ZXJGdWxsc2NyZWVuKFFUTW92aWVXaW5GU0NsaWVudCogY2xp
ZW50KTsKKyAgICB2b2lkIGV4aXRGdWxsc2NyZWVuKCk7CisKIHByaXZhdGU6CiAgICAgdm9pZCBs
b2FkKENGVVJMUmVmLCBib29sIHByZXNlcnZlc1BpdGNoKTsKKyAgICBzdGF0aWMgTFJFU1VMVCBf
aGFuZGxlTWVzc2FnZXMoSFdORCB0aGVXbmQsIFVJTlQgdGhlTWVzc2FnZSwgVUlOVCB3UGFyYW0s
IExPTkcgbFBhcmFtKTsKKyAgICBMUkVTVUxUIGhhbmRsZU1lc3NhZ2VzKEhXTkQgdGhlV25kLCBV
SU5UIHRoZU1lc3NhZ2UsIFVJTlQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CiAKICAgICBRVE1vdmll
V2luUHJpdmF0ZSogbV9wcml2YXRlOwogICAgIGJvb2wgbV9kaXNhYmxlZDsKSW5kZXg6IFdlYktp
dC93aW4vQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vQ2hhbmdlTG9nCShyZXZp
c2lvbiA1MjQ5OCkKKysrIFdlYktpdC93aW4vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDMgKzEsNDYgQEAKKzIwMDktMTItMjIgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEltcGxl
bWVudCBmdWxsLXNjcmVlbiB2aWRlbyBmb3IgV2luZG93cworICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEzMTgKKyAgICAgICAgCisgICAgICAgIFRoaXMg
YWRkcyBhIGZ1bGwtc2NyZWVuIGNvbnRyb2xsZXIsIFdlYlZpZGVvRlNDb250cm9sbGVyLCAKKyAg
ICAgICAgd2hpY2ggbWFuYWdlcyBnb2luZyBpbiBhbmQgb3V0IG9mIGZ1bGwtc2NyZWVuLiBUaGUg
YWN1YWwgCisgICAgICAgIGZ1bGwtc2NyZWVuIHdpbmRvdyBpcyBjcmVhdGVkIGFuZCBtYW5hZ2Vk
IGJ5IGxvZ2ljIGFkZGVkIAorICAgICAgICB0byBRVE1vdmllV2luLiBUaGUgSFVEIG1vdmllIGNv
bnRyb2xsZXIgaXMgaW1wbGVtZW50ZWQgaW4KKyAgICAgICAgV2ViVmlkZW9GU0hVRENvbnRyb2xs
ZXIuIEl0IHJlbmRlcnMgYW5kIG1hbmFnZXMgZXZlbnRzIHRvCisgICAgICAgIGNvbnRyb2wgdGhl
IHBsYXlpbmcgdmlkZW8uIE1vdmllIGNvbnRyb2xsZXIgZXZlbnRzIGdvIAorICAgICAgICB0aHJv
dWdoIFdlYlZpZGVvRlNIVURDb250cm9sbGVyIHRvIFdlYlZpZGVvRlNDb250cm9sbGVyCisgICAg
ICAgIHdoaWNoIHRoZW4gc2VuZHMgdGhlbSB0byBIVE1MTWVkaWFFbGVtZW50LCB3aGljaCBpcyBw
YXNzZWQKKyAgICAgICAgdG8gdGhlIGNvbnRyb2xsZXIgYnkgV2ViVmlldywgd2hpY2ggZ2V0cyB0
aGUgY2FsbCB0byBnbworICAgICAgICBpbnRvIGZ1bGwtc2NyZWVuIG1vZGUgZnJvbSBIVE1MTWVk
aWFFbGVtZW50IHZpYSBDaHJvbWVDbGllbnQuCisgICAgICAgIAorICAgICAgICBJJ3ZlIGFsc28g
dXBkYXRlZCB0aGUgaWNvbnMgdG8gbWFrZSB0aGVtIHBvc2l0aW9uIGNvcnJlY3RseQorICAgICAg
ICBpbiB0aGUgSFVELgorCisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50
LmNwcDoKKyAgICAgICAgKFdlYkNocm9tZUNsaWVudDo6c3VwcG9ydHNGdWxsc2NyZWVuRm9yTm9k
ZSk6CisgICAgICAgIChXZWJDaHJvbWVDbGllbnQ6OmVudGVyRnVsbHNjcmVlbkZvck5vZGUpOgor
ICAgICAgICAoV2ViQ2hyb21lQ2xpZW50OjpleGl0RnVsbHNjcmVlbkZvck5vZGUpOgorICAgICAg
ICAqIFdlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oOgorICAgICAgICAqIFdlYktpdC52
Y3Byb2ovV2ViS2l0LnZjcHJvajoKKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL2ZzVmlkZW9BdWRp
b1ZvbHVtZUhpZ2gucG5nOgorICAgICAgICAqIFdlYktpdC52Y3Byb2ovZnNWaWRlb0F1ZGlvVm9s
dW1lTG93LnBuZzoKKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL2ZzVmlkZW9FeGl0RnVsbHNjcmVl
bi5wbmc6CisgICAgICAgICogV2ViS2l0LnZjcHJvai9mc1ZpZGVvUGF1c2UucG5nOgorICAgICAg
ICAqIFdlYktpdC52Y3Byb2ovZnNWaWRlb1BsYXkucG5nOgorICAgICAgICAqIFdlYktpdERMTC5j
cHA6CisgICAgICAgIChsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKToKKyAgICAgICAgKiBXZWJWaWRl
b0ZTQ29udHJvbGxlci5jcHA6IEFkZGVkLgorICAgICAgICAqIFdlYlZpZGVvRlNDb250cm9sbGVy
Lmg6IEFkZGVkLgorICAgICAgICAqIFdlYlZpZGVvRlNIVURDb250cm9sbGVyLmNwcDogQWRkZWQu
CisgICAgICAgICogV2ViVmlkZW9GU0hVRENvbnRyb2xsZXIuaDogQWRkZWQuCisgICAgICAgICog
V2ViVmlldy5jcHA6CisgICAgICAgIChXZWJWaWV3OjplbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKToK
KyAgICAgICAgKFdlYlZpZXc6OmV4aXRGdWxsc2NyZWVuKToKKyAgICAgICAgKiBXZWJWaWV3Lmg6
CisKIDIwMDktMTItMjEgIEFkYW0gUm9iZW4gIDxhcm9iZW5AYXBwbGUuY29tPgogCiAgICAgICAg
IEZpeCBub24tQUNDRUxFUkFURURfQ09NUE9TSVRJTkcgYnVpbGRzCkluZGV4OiBXZWJLaXQvd2lu
L1dlYktpdERMTC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJLaXRETEwuY3BwCShy
ZXZpc2lvbiA1MjQ5NykKKysrIFdlYktpdC93aW4vV2ViS2l0RExMLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTc5LDYgKzE3OSwxNiBAQCBQYXNzUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4g
bG9hZFJlCiAgICAgICAgIGlkciA9IElEUl9aT09NX09VVF9DVVJTT1I7CiAgICAgZWxzZSBpZiAo
IXN0cmNtcChuYW1lLCAidmVydGljYWxUZXh0Q3Vyc29yIikpCiAgICAgICAgIGlkciA9IElEUl9W
RVJUSUNBTF9URVhUX0NVUlNPUjsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmc1ZpZGVv
QXVkaW9Wb2x1bWVIaWdoIikpCisgICAgICAgIGlkciA9IElEUl9GU19WSURFT19BVURJT19WT0xV
TUVfSElHSDsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmc1ZpZGVvQXVkaW9Wb2x1bWVM
b3ciKSkKKyAgICAgICAgaWRyID0gSURSX0ZTX1ZJREVPX0FVRElPX1ZPTFVNRV9MT1c7CisgICAg
ZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZnNWaWRlb0V4aXRGdWxsc2NyZWVuIikpCisgICAgICAg
IGlkciA9IElEUl9GU19WSURFT19FWElUX0ZVTExTQ1JFRU47CisgICAgZWxzZSBpZiAoIXN0cmNt
cChuYW1lLCAiZnNWaWRlb1BhdXNlIikpCisgICAgICAgIGlkciA9IElEUl9GU19WSURFT19QQVVT
RTsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmc1ZpZGVvUGxheSIpKQorICAgICAgICBp
ZHIgPSBJRFJfRlNfVklERU9fUExBWTsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiAwOwogCklu
ZGV4OiBXZWJLaXQvd2luL1dlYlZpZGVvRlNDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQvd2luL1dlYlZpZGVvRlNDb250cm9sbGVyLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktp
dC93aW4vV2ViVmlkZW9GU0NvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE3
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShWSURFTykK
KworI2luY2x1ZGUgPHdpbmRvd3N4Lmg+CisKKyNpbmNsdWRlIDx3dGYvVW51c2VkUGFyYW0uaD4K
KyNpbmNsdWRlIDxXZWJDb3JlL1NvZnRMaW5raW5nLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbnRS
ZWN0Lmg+CisKKyNpbmNsdWRlIDxXZWJDb3JlL1FUTW92aWVXaW4uaD4KKworI2luY2x1ZGUgIldl
YlZpZGVvRlNDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiV2ViVmlkZW9GU0hVRENvbnRyb2xsZXIu
aCIKKworI2lmIFBMQVRGT1JNKENGKQorI2luY2x1ZGUgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3Vu
ZGF0aW9uLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJL
aXRTeXN0ZW1JbnRlcmZhY2UuaD4KKworTFJFU1VMVCBXZWJWaWRlb0ZTQ29udHJvbGxlcjo6d2lu
ZG93UHJvYyhIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQ
YXJhbSkKK3sKKyAgICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBtZXNzYWdlLCB3UGFyYW0s
IGxQYXJhbSk7Cit9CisKK1dlYlZpZGVvRlNDb250cm9sbGVyOjpXZWJWaWRlb0ZTQ29udHJvbGxl
cigpCisgOiBtX3dpbmRvdygwKQorICwgbV9odWRDb250cm9sbGVyKDApCit7Cit9CisKK1dlYlZp
ZGVvRlNDb250cm9sbGVyOjp+V2ViVmlkZW9GU0NvbnRyb2xsZXIoKQoreworICAgIGlmIChtb3Zp
ZSgpKQorICAgICAgICBtb3ZpZSgpLT5leGl0RnVsbHNjcmVlbigpOworfQorCitRVE1vdmllV2lu
KiBXZWJWaWRlb0ZTQ29udHJvbGxlcjo6bW92aWUoKQoreworICAgIHJldHVybiBtX21lZGlhRWxl
bWVudCA/IHJlaW50ZXJwcmV0X2Nhc3Q8UVRNb3ZpZVdpbio+KG1fbWVkaWFFbGVtZW50LT5wbGF0
Zm9ybU1lZGlhKCkucXRNb3ZpZSkgOiAwOworfQorCit2b2lkIFdlYlZpZGVvRlNDb250cm9sbGVy
OjpzZXRNZWRpYUVsZW1lbnQoV2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50
KQoreworICAgIG1fbWVkaWFFbGVtZW50ID0gbWVkaWFFbGVtZW50OworICAgIGlmICghbV9tZWRp
YUVsZW1lbnQpIHsKKyAgICAgICAgLy8gRklYTUU6IERvIHNvbWUgY2xlYW51cCBoZXJlCisgICAg
ICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgV2ViVmlkZW9GU0NvbnRyb2xsZXI6OmVudGVy
RnVsbHNjcmVlbigpCit7CisgICAgaWYgKG1vdmllKCkpCisgICAgICAgIG1fd2luZG93ID0gbW92
aWUoKS0+ZW50ZXJGdWxsc2NyZWVuKHRoaXMpOworICAgIAorICAgIG1faHVkQ29udHJvbGxlciA9
IG5ldyBXZWJWaWRlb0ZTSFVEQ29udHJvbGxlcih0aGlzLCBtX3dpbmRvdyk7Cit9CisKK0xSRVNV
TFQgV2ViVmlkZW9GU0NvbnRyb2xsZXI6OmZzQ2xpZW50V25kUHJvYyhIV05EIHRoZVduZCwgVUlO
VCB0aGVNZXNzYWdlLCBVSU5UIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgc3dpdGNoKHRo
ZU1lc3NhZ2UpIHsKKyAgICAgICAgY2FzZSBXTV9DSEFSOgorICAgICAgICAgICAgbV9odWRDb250
cm9sbGVyLT5vbkNoYXIod1BhcmFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFdNX0xCVVRUT05ET1dOOgorICAgICAgICAgICAgbV9odWRDb250cm9sbGVyLT5vbk1vdXNlRG93
bihHRVRfWF9MUEFSQU0obFBhcmFtKSwgR0VUX1lfTFBBUkFNKGxQYXJhbSkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fTU9VU0VNT1ZFOgorICAgICAgICAgICAgbV9odWRD
b250cm9sbGVyLT5vbk1vdXNlTW92ZShHRVRfWF9MUEFSQU0obFBhcmFtKSwgR0VUX1lfTFBBUkFN
KGxQYXJhbSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fTEJVVFRPTlVQ
OgorICAgICAgICAgICAgbV9odWRDb250cm9sbGVyLT5vbk1vdXNlVXAoR0VUX1hfTFBBUkFNKGxQ
YXJhbSksIEdFVF9ZX0xQQVJBTShsUGFyYW0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0K
KworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKHRoZVduZCwgdGhlTWVzc2FnZSwgd1BhcmFtLCBs
UGFyYW0pOworfQorCit2b2lkIFdlYlZpZGVvRlNDb250cm9sbGVyOjpodWRDbGllbnRFeGl0RnVs
bHNjcmVlbigpCit7CisgICAgaWYgKG1fbWVkaWFFbGVtZW50KQorICAgICAgICBtX21lZGlhRWxl
bWVudC0+ZXhpdEZ1bGxzY3JlZW4oKTsKK30KKworYm9vbCBXZWJWaWRlb0ZTQ29udHJvbGxlcjo6
aHVkQ2xpZW50Q2FuUGxheSgpCit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVtZW50ID8gbV9tZWRp
YUVsZW1lbnQtPmNhblBsYXkoKSA6IGZhbHNlOworfQorCit2b2lkIFdlYlZpZGVvRlNDb250cm9s
bGVyOjpodWRDbGllbnRQbGF5KCkKK3sKKyAgICBpZiAobV9tZWRpYUVsZW1lbnQpCisgICAgICAg
IG1fbWVkaWFFbGVtZW50LT5wbGF5KCk7Cit9CisKK3ZvaWQgV2ViVmlkZW9GU0NvbnRyb2xsZXI6
Omh1ZENsaWVudFBhdXNlKCkKK3sKKyAgICBpZiAobV9tZWRpYUVsZW1lbnQpCisgICAgICAgIG1f
bWVkaWFFbGVtZW50LT5wYXVzZSgpOworfQorCitmbG9hdCBXZWJWaWRlb0ZTQ29udHJvbGxlcjo6
aHVkQ2xpZW50Vm9sdW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9tZWRpYUVsZW1lbnQgPyBt
X21lZGlhRWxlbWVudC0+dm9sdW1lKCkgOiAwOworfQordm9pZCBXZWJWaWRlb0ZTQ29udHJvbGxl
cjo6aHVkQ2xpZW50U2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkKK3sKKyAgICBpZiAobV9tZWRpYUVs
ZW1lbnQpIHsKKyAgICAgICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZSBlYzsKKyAgICAgICAgbV9t
ZWRpYUVsZW1lbnQtPnNldFZvbHVtZSh2b2x1bWUsIGVjKTsKKyAgICB9Cit9CisKK2Zsb2F0IFdl
YlZpZGVvRlNDb250cm9sbGVyOjpodWRDbGllbnRDdXJyZW50VGltZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fbWVkaWFFbGVtZW50ID8gKG1fbWVkaWFFbGVtZW50LT5jdXJyZW50VGltZSgpKSA6
IDA7Cit9CisKK3ZvaWQgV2ViVmlkZW9GU0NvbnRyb2xsZXI6Omh1ZENsaWVudFNldEN1cnJlbnRU
aW1lKGZsb2F0IHZhbHVlKQoreworICAgIGlmIChtX21lZGlhRWxlbWVudCkgeworICAgICAgICBX
ZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjOworICAgICAgICBtX21lZGlhRWxlbWVudC0+c2V0Q3Vy
cmVudFRpbWUodmFsdWUsIGVjKTsKKyAgICB9Cit9CisKK2Zsb2F0IFdlYlZpZGVvRlNDb250cm9s
bGVyOjpodWRDbGllbnREdXJhdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVt
ZW50ID8gKG1fbWVkaWFFbGVtZW50LT5kdXJhdGlvbigpKSA6IDA7Cit9CisKK3ZvaWQgV2ViVmlk
ZW9GU0NvbnRyb2xsZXI6Omh1ZENsaWVudEJlZ2luU2NydWJiaW5nKCkKK3sKKyAgICBpZiAobV9t
ZWRpYUVsZW1lbnQpIAorICAgICAgICBtX21lZGlhRWxlbWVudC0+YmVnaW5TY3J1YmJpbmcoKTsK
K30KKwordm9pZCBXZWJWaWRlb0ZTQ29udHJvbGxlcjo6aHVkQ2xpZW50RW5kU2NydWJiaW5nKCkK
K3sKKyAgICBpZiAobV9tZWRpYUVsZW1lbnQpIAorICAgICAgICBtX21lZGlhRWxlbWVudC0+ZW5k
U2NydWJiaW5nKCk7Cit9CisKK3ZvaWQgV2ViVmlkZW9GU0NvbnRyb2xsZXI6OmV4aXRGdWxsc2Ny
ZWVuKCkKK3sKKyAgICBpZiAobW92aWUoKSkKKyAgICAgICAgbW92aWUoKS0+ZXhpdEZ1bGxzY3Jl
ZW4oKTsKK30KKworI2VuZGlmIC8qIEVOQUJMRShWSURFTykgKi8KSW5kZXg6IFdlYktpdC93aW4v
V2ViVmlkZW9GU0NvbnRyb2xsZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZpZGVv
RlNDb250cm9sbGVyLmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvd2luL1dlYlZpZGVvRlNDb250
cm9sbGVyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVm
IFdlYlZpZGVvRlNDb250cm9sbGVyX2gKKyNkZWZpbmUgV2ViVmlkZW9GU0NvbnRyb2xsZXJfaAor
CisjaWYgRU5BQkxFKFZJREVPKQorCisjaW5jbHVkZSAiUVRNb3ZpZVdpbi5oIgorI2luY2x1ZGUg
IldlYlZpZGVvRlNIVURDb250cm9sbGVyLmgiCisKKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+Cisj
aW5jbHVkZSA8V2ViQ29yZS9IVE1MTWVkaWFFbGVtZW50Lmg+CisKK2NsYXNzIFdlYlZpZGVvRlND
b250cm9sbGVyIDogcHVibGljIFFUTW92aWVXaW5GU0NsaWVudCwgcHVibGljIFdlYlZpZGVvRlNI
VURDbGllbnQKK3sKK3B1YmxpYzoKKyAgICBXZWJWaWRlb0ZTQ29udHJvbGxlcigpOworICAgIH5X
ZWJWaWRlb0ZTQ29udHJvbGxlcigpOworCisgICAgdm9pZCBzZXRNZWRpYUVsZW1lbnQoV2ViQ29y
ZTo6SFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50KTsKKyAgICBXZWJDb3JlOjpIVE1MTWVk
aWFFbGVtZW50KiBtZWRpYUVsZW1lbnQoKSB7IHJldHVybiBtX21lZGlhRWxlbWVudC5nZXQoKTsg
fQorCisgICAgdm9pZCBlbnRlckZ1bGxzY3JlZW4oKTsKKyAgICB2b2lkIGV4aXRGdWxsc2NyZWVu
KCk7CisKKyAgICAvLyBRVE1vdmllV2luRlNDbGllbnQKKyAgICB2aXJ0dWFsIExSRVNVTFQgZnND
bGllbnRXbmRQcm9jKEhXTkQgdGhlV25kLCBVSU5UIHRoZU1lc3NhZ2UsIFVJTlQgd1BhcmFtLCBM
T05HIGxQYXJhbSk7CisKKyAgICAvLyBXZWJWaWRlb0ZTSFVEQ2xpZW50CisgICAgdmlydHVhbCB2
b2lkIGh1ZENsaWVudEV4aXRGdWxsc2NyZWVuKCk7CisgICAgdmlydHVhbCBib29sIGh1ZENsaWVu
dENhblBsYXkoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaHVkQ2xpZW50UGxheSgpOworICAgIHZpcnR1
YWwgdm9pZCBodWRDbGllbnRQYXVzZSgpOworICAgIHZpcnR1YWwgZmxvYXQgaHVkQ2xpZW50Vm9s
dW1lKCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGh1ZENsaWVudFNldFZvbHVtZShmbG9hdCk7
CisgICAgdmlydHVhbCBmbG9hdCBodWRDbGllbnRDdXJyZW50VGltZSgpIGNvbnN0OworICAgIHZp
cnR1YWwgdm9pZCBodWRDbGllbnRTZXRDdXJyZW50VGltZShmbG9hdCk7CisgICAgdmlydHVhbCBm
bG9hdCBodWRDbGllbnREdXJhdGlvbigpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBodWRDbGll
bnRCZWdpblNjcnViYmluZygpOworICAgIHZpcnR1YWwgdm9pZCBodWRDbGllbnRFbmRTY3J1YmJp
bmcoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgTFJFU1VMVCBDQUxMQkFDSyB3aW5kb3dQcm9j
KEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsK
KyAgICB2b2lkIGVuc3VyZVdpbmRvdygpOworICAgIFFUTW92aWVXaW4qIG1vdmllKCk7CisKKyAg
ICBSZWZQdHI8V2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudD4gbV9tZWRpYUVsZW1lbnQ7CisgICAg
SFdORCBtX3dpbmRvdzsKKyAgICBPd25QdHI8V2ViVmlkZW9GU0hVRENvbnRyb2xsZXI+IG1faHVk
Q29udHJvbGxlcjsKK307CisKKyNlbmRpZgorCisjZW5kaWYgLy8gV2ViVmlkZW9GU0NvbnRyb2xs
ZXJfaAorCkluZGV4OiBXZWJLaXQvd2luL1dlYlZpZGVvRlNIVURDb250cm9sbGVyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZpZGVvRlNIVURDb250cm9sbGVyLmNwcAkocmV2aXNp
b24gMCkKKysrIFdlYktpdC93aW4vV2ViVmlkZW9GU0hVRENvbnRyb2xsZXIuY3BwCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDUzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKwor
I2lmIEVOQUJMRShWSURFTykKKworI2luY2x1ZGUgPHdpbmRvd3N4Lmg+CisKKyNpbmNsdWRlICJX
ZWJLaXRETEwuaCIKKyNpbmNsdWRlICJXZWJWaWRlb0ZTSFVEQ29udHJvbGxlci5oIgorCisjaW5j
bHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisjaW5jbHVk
ZSA8V2ViS2l0U3lzdGVtSW50ZXJmYWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPgorCisjaW5j
bHVkZSA8V2ViQ29yZS9CaXRtYXBJbmZvLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9Gb250Lmg+Cisj
aW5jbHVkZSA8V2ViQ29yZS9Gb250U2VsZWN0b3IuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0dyYXBo
aWNzQ29udGV4dC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvVGV4dFJ1bi5oPgorI2luY2x1ZGUgPHd0
Zi9TdGRMaWJFeHRyYXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK3N0YXRpYyBj
b25zdCBmbG9hdCBrVGltZXJJbnRlcnZhbCA9IDAuMDMzOworCisvLyBIVUQgU2l6ZQorc3RhdGlj
IGNvbnN0IGludCBrV2luZG93SGVpZ2h0ID0gNTk7CitzdGF0aWMgY29uc3QgaW50IGtXaW5kb3dX
aWR0aCA9IDQzODsKKworLy8gTWFyZ2lucyBhbmQgYnV0dG9uIHNpemVzCitzdGF0aWMgY29uc3Qg
aW50IGtNYXJnaW4gPSA5Oworc3RhdGljIGNvbnN0IGludCBrTWFyZ2luVG9wID0gOTsKK3N0YXRp
YyBjb25zdCBpbnQga0J1dHRvblNpemUgPSAyNTsKK3N0YXRpYyBjb25zdCBpbnQga0J1dHRvbk1p
bmlTaXplID0gMTY7CitzdGF0aWMgY29uc3QgaW50IGtWb2x1bWVTbGlkZXJXaWR0aCA9IDUwOwor
c3RhdGljIGNvbnN0IGludCBrVGltZVNsaWRlcldpZHRoID0gMzEwOworc3RhdGljIGNvbnN0IGlu
dCBrU2xpZGVySGVpZ2h0ID0gODsKK3N0YXRpYyBjb25zdCBpbnQga1ZvbHVtZVNsaWRlckJ1dHRv
blNpemUgPSAxMDsKK3N0YXRpYyBjb25zdCBpbnQga1RpbWVTbGlkZXJCdXR0b25TaXplID0gODsK
K3N0YXRpYyBjb25zdCBpbnQga1RleHRTaXplID0gMTE7CisKKy8vIEJ1dHRvbi9zbGlkZXIvdGV4
dCBwb3NpdGlvbnMKK3N0YXRpYyBjb25zdCBJbnRQb2ludCBrUGxheVBhdXNlQnV0dG9uUG9pbnQo
KGtXaW5kb3dXaWR0aCAtIGtCdXR0b25TaXplKSAvIDIsIGtNYXJnaW5Ub3ApOworc3RhdGljIGNv
bnN0IEludFBvaW50IGtWb2x1bWVVcEJ1dHRvblBvaW50KGtNYXJnaW4gKyBrQnV0dG9uTWluaVNp
emUgKyBrVm9sdW1lU2xpZGVyV2lkdGggKyBrQnV0dG9uTWluaVNpemUgLyAyLCBrTWFyZ2luVG9w
ICsgKGtCdXR0b25TaXplIC0ga0J1dHRvbk1pbmlTaXplKSAvIDIpOworc3RhdGljIGNvbnN0IElu
dFBvaW50IGtWb2x1bWVEb3duQnV0dG9uUG9pbnQoa01hcmdpbiwga01hcmdpblRvcCArIChrQnV0
dG9uU2l6ZSAtIGtCdXR0b25NaW5pU2l6ZSkgLyAyKTsKK3N0YXRpYyBjb25zdCBJbnRQb2ludCBr
Vm9sdW1lU2xpZGVyUG9pbnQoa1ZvbHVtZURvd25CdXR0b25Qb2ludC54KCkgKyBrQnV0dG9uTWlu
aVNpemUsIGtWb2x1bWVEb3duQnV0dG9uUG9pbnQueSgpICsga0J1dHRvbk1pbmlTaXplIC8gMiAt
IGtTbGlkZXJIZWlnaHQgLyAyKTsKK3N0YXRpYyBjb25zdCBJbnRQb2ludCBrVGltZVNsaWRlclBv
aW50KGtXaW5kb3dXaWR0aCAvIDIgLSBrVGltZVNsaWRlcldpZHRoIC8gMiwga1dpbmRvd0hlaWdo
dCAtIGtNYXJnaW4gLSBrU2xpZGVySGVpZ2h0KTsKK3N0YXRpYyBjb25zdCBJbnRQb2ludCBrRXhp
dEZ1bGxzY3JlZW5CdXR0b25Qb2ludChrV2luZG93V2lkdGggLSAyICoga01hcmdpbiAtIGtCdXR0
b25NaW5pU2l6ZSwga01hcmdpblRvcCArIChrQnV0dG9uU2l6ZSAtIGtCdXR0b25NaW5pU2l6ZSkg
LyAyKTsKK3N0YXRpYyBjb25zdCBJbnRQb2ludCBrTGVmdFRleHRQb2ludChrV2luZG93V2lkdGgg
LyAyIC0ga1RpbWVTbGlkZXJXaWR0aCAvIDIgLSBrTWFyZ2luLCBrV2luZG93SGVpZ2h0IC0ga01h
cmdpbiAtIGtTbGlkZXJIZWlnaHQgLyAyKTsKK3N0YXRpYyBjb25zdCBJbnRQb2ludCBrUmlnaHRU
ZXh0UG9pbnQoa1dpbmRvd1dpZHRoIC8gMiArIGtUaW1lU2xpZGVyV2lkdGggLyAyICsga01hcmdp
biwga1dpbmRvd0hlaWdodCAtIGtNYXJnaW4gLSBrU2xpZGVySGVpZ2h0IC8gMik7CisKKy8vIEJh
Y2tncm91bmQgdmFsdWVzCitzdGF0aWMgY29uc3QgaW50IGtCb3JkZXJSYWRpdXMgPSAxMjsKK3N0
YXRpYyBjb25zdCBpbnQga0JvcmRlclRoaWNrbmVzcyA9IDI7CitzdGF0aWMgY29uc3QgSW50U2l6
ZSBrT3V0ZXJSYWRpdXMoa0JvcmRlclJhZGl1cywga0JvcmRlclJhZGl1cyk7CitzdGF0aWMgY29u
c3QgSW50UmVjdCBrT3V0ZXJTaXplKDAsMCxrV2luZG93V2lkdGgsa1dpbmRvd0hlaWdodCk7Citz
dGF0aWMgY29uc3QgSW50U2l6ZSBrSW5uZXJSYWRpdXMoa0JvcmRlclJhZGl1cyAtIGtCb3JkZXJU
aGlja25lc3MsIGtCb3JkZXJSYWRpdXMgLSBrQm9yZGVyVGhpY2tuZXNzKTsKK3N0YXRpYyBjb25z
dCBJbnRSZWN0IGtJbm5lclNpemUoa0JvcmRlclRoaWNrbmVzcywga0JvcmRlclRoaWNrbmVzcywg
a1dpbmRvd1dpZHRoIC0ga0JvcmRlclRoaWNrbmVzcyAqIDIsa1dpbmRvd0hlaWdodCAtIGtCb3Jk
ZXJUaGlja25lc3MgKiAyKTsKKworLy8gQ29sb3JzCitzdGF0aWMgY29uc3QgQ29sb3Iga0JhY2tn
cm91bmRDb2xvcigweEEwMjAyMDIwKTsKK3N0YXRpYyBjb25zdCBDb2xvciBrQm9yZGVyQ29sb3Io
MHhGRkEwQTBBMCk7CitzdGF0aWMgY29uc3QgQ29sb3Iga1NsaWRlckd1dHRlckNvbG9yKDB4RkYx
NDE0MTQpOworc3RhdGljIGNvbnN0IENvbG9yIGtTbGlkZXJCdXR0b25Db2xvcigweEZGODA4MDgw
KTsKK3N0YXRpYyBjb25zdCBDb2xvciBrVGV4dENvbG9yKDB4RkZGRkZGRkYpOworCitIVURCdXR0
b246OkhVREJ1dHRvbihIVURCdXR0b25UeXBlIHR5cGUsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50
JiBwb3NpdGlvbikKKyAgICA6IEhVRFdpZGdldChwb3NpdGlvbiwgMCwgMCkKKyAgICAsIG1fdHlw
ZSh0eXBlKQorICAgICwgbV9zaG93QWx0QnV0dG9uKGZhbHNlKQoreworICAgIGNvbnN0IGNoYXIq
IGJ1dHRvblJlc291cmNlID0gMDsKKyAgICBjb25zdCBjaGFyKiBidXR0b25SZXNvdXJjZUFsdCA9
IDA7CisgICAgc3dpdGNoKG1fdHlwZSkgeworICAgICAgICAKKyAgICAgICAgY2FzZSBQbGF5UGF1
c2VCdXR0b246CisgICAgICAgICAgICBidXR0b25SZXNvdXJjZSA9ICJmc1ZpZGVvUGxheSI7Cisg
ICAgICAgICAgICBidXR0b25SZXNvdXJjZUFsdCA9ICJmc1ZpZGVvUGF1c2UiOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgVGltZVNsaWRlckJ1dHRvbjoKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIFZvbHVtZVVwQnV0dG9uOgorICAgICAgICAgICAgYnV0dG9uUmVz
b3VyY2UgPSAiZnNWaWRlb0F1ZGlvVm9sdW1lSGlnaCI7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBWb2x1bWVTbGlkZXJCdXR0b246CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBWb2x1bWVEb3duQnV0dG9uOgorICAgICAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAi
ZnNWaWRlb0F1ZGlvVm9sdW1lTG93IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IEV4aXRGdWxsc2NyZWVuQnV0dG9uOgorICAgICAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAiZnNW
aWRlb0V4aXRGdWxsc2NyZWVuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlm
IChidXR0b25SZXNvdXJjZSkgeworICAgICAgICBtX2J1dHRvbkltYWdlID0gSW1hZ2U6OmxvYWRQ
bGF0Zm9ybVJlc291cmNlKGJ1dHRvblJlc291cmNlKTsKKyAgICAgICAgbV9idXR0b25JbWFnZS0+
cmVmKCk7CisgICAgICAgIG1fd2lkdGggPSBtX2J1dHRvbkltYWdlLT53aWR0aCgpOworICAgICAg
ICBtX2hlaWdodCA9IG1fYnV0dG9uSW1hZ2UtPmhlaWdodCgpOworICAgIH0KKyAgICBpZiAoYnV0
dG9uUmVzb3VyY2VBbHQpIHsKKyAgICAgICAgbV9idXR0b25JbWFnZUFsdCA9IEltYWdlOjpsb2Fk
UGxhdGZvcm1SZXNvdXJjZShidXR0b25SZXNvdXJjZUFsdCk7CisgICAgICAgIG1fYnV0dG9uSW1h
Z2VBbHQtPnJlZigpOworICAgIH0KK30KKwordm9pZCBIVURCdXR0b246OmRyYXcoR3JhcGhpY3ND
b250ZXh0JiBjb250ZXh0KQoreworICAgIGlmIChtX3Nob3dBbHRCdXR0b24gJiYgbV9idXR0b25J
bWFnZUFsdCkKKyAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UobV9idXR0b25JbWFnZUFsdC5nZXQo
KSwgRGV2aWNlQ29sb3JTcGFjZSwgbV9wb3NpdGlvbik7CisgICAgZWxzZSBpZiAobV9idXR0b25J
bWFnZSkKKyAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UobV9idXR0b25JbWFnZS5nZXQoKSwgRGV2
aWNlQ29sb3JTcGFjZSwgbV9wb3NpdGlvbik7Cit9CisKK0hVRFNsaWRlcjo6SFVEU2xpZGVyKEhV
RFNsaWRlckJ1dHRvblNoYXBlIHNoYXBlLCBpbnQgYnV0dG9uU2l6ZSwgY29uc3QgV2ViQ29yZTo6
SW50UG9pbnQmIHBvc2l0aW9uLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgOiBIVURXaWRn
ZXQocG9zaXRpb24sIHdpZHRoLCBoZWlnaHQpCisgICAgLCBtX2J1dHRvblNoYXBlKHNoYXBlKQor
ICAgICwgbV9idXR0b25TaXplKGJ1dHRvblNpemUpCisgICAgLCBtX3NsaWRlclBvc2l0aW9uKDAp
CisgICAgLCBtX2RyYWdTdGFydE9mZnNldCgwKQoreworfQorCit2b2lkIEhVRFNsaWRlcjo6ZHJh
dyhXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQmIGNvbnRleHQpCit7CisgICAgLy8gRHJhdyBndXR0
ZXIKKyAgICBJbnRTaXplIHJhZGl1cyhtX2hlaWdodCAvIDIsIG1faGVpZ2h0IC8gMik7CisgICAg
Y29udGV4dC5maWxsUm91bmRlZFJlY3QoSW50UmVjdChtX3Bvc2l0aW9uLCBJbnRTaXplKG1fd2lk
dGgsIG1faGVpZ2h0KSksIHJhZGl1cywgcmFkaXVzLCByYWRpdXMsIHJhZGl1cywga1NsaWRlckd1
dHRlckNvbG9yLCBEZXZpY2VDb2xvclNwYWNlKTsKKworICAgIC8vIERyYXcgYnV0dG9uCisgICAg
Y29udGV4dC5zZXRTdHJva2VDb2xvcihrU2xpZGVyQnV0dG9uQ29sb3IsIERldmljZUNvbG9yU3Bh
Y2UpOworICAgIGNvbnRleHQuc2V0RmlsbENvbG9yKGtTbGlkZXJCdXR0b25Db2xvciwgRGV2aWNl
Q29sb3JTcGFjZSk7CisKKyAgICBpZiAobV9idXR0b25TaGFwZSA9PSBSb3VuZEJ1dHRvbikKKyAg
ICAgICAgY29udGV4dC5kcmF3RWxsaXBzZShJbnRSZWN0KG1fcG9zaXRpb24ueCgpICsgbV9zbGlk
ZXJQb3NpdGlvbiwgbV9wb3NpdGlvbi55KCkgLSAobV9idXR0b25TaXplIC0gbV9oZWlnaHQpIC8g
MiwgbV9idXR0b25TaXplLCBtX2J1dHRvblNpemUpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8g
RHJhdyBhIGRpYW1vbmQKKyAgICAgICAgRmxvYXRQb2ludCBwb2ludHNbNF07CisgICAgICAgIGZs
b2F0IGhhbGYgPSBtX2J1dHRvblNpemUgLyAyOworICAgICAgICBwb2ludHNbMF0uc2V0WChoYWxm
ICsgbV9wb3NpdGlvbi54KCkgKyBtX3NsaWRlclBvc2l0aW9uKTsKKyAgICAgICAgcG9pbnRzWzBd
LnNldFkobV9wb3NpdGlvbi55KCkpOworICAgICAgICBwb2ludHNbMV0uc2V0WChtX2J1dHRvblNp
emUgKyBtX3Bvc2l0aW9uLngoKSArIG1fc2xpZGVyUG9zaXRpb24pOworICAgICAgICBwb2ludHNb
MV0uc2V0WShoYWxmICsgbV9wb3NpdGlvbi55KCkpOworICAgICAgICBwb2ludHNbMl0uc2V0WCho
YWxmICsgbV9wb3NpdGlvbi54KCkgKyBtX3NsaWRlclBvc2l0aW9uKTsKKyAgICAgICAgcG9pbnRz
WzJdLnNldFkobV9idXR0b25TaXplICsgbV9wb3NpdGlvbi55KCkpOworICAgICAgICBwb2ludHNb
M10uc2V0WChtX3Bvc2l0aW9uLngoKSArIG1fc2xpZGVyUG9zaXRpb24pOworICAgICAgICBwb2lu
dHNbM10uc2V0WShoYWxmICsgbV9wb3NpdGlvbi55KCkpOworICAgICAgICBjb250ZXh0LmRyYXdD
b252ZXhQb2x5Z29uKDQsIHBvaW50cywgdHJ1ZSk7CisgICAgfQorfQorCit2b2lkIEhVRFNsaWRl
cjo6ZHJhZyhpbnQgeCwgaW50IHksIGJvb2wgc3RhcnQpCit7CisgICAgaWYgKHN0YXJ0KSB7Cisg
ICAgICAgIC8vIFdoZW4gd2Ugc3RhcnQsIHdlIG5lZWQgdG8gc25hcCB0aGUgc2xpZGVyIHBvc2l0
aW9uIHRvIHRoZSB4IHBvc2l0aW9uIGlmIHdlIGNsaWNrZWQgdGhlIGd1dHRlci4KKyAgICAgICAg
Ly8gQnV0IGlmIHdlIGNsaWNrIHRoZSBidXR0b24sIHdlIG5lZWQgdG8gZHJhZyByZWxhdGl2ZSB0
byB3aGVyZSB3ZSBjbGlja2VkIGRvd24uIFdlIG9ubHkgbmVlZAorICAgICAgICAvLyB0byBjaGVj
ayBYIGJlY2F1c2Ugd2Ugd291bGQgbm90IGV2ZW4gZ2V0IGhlcmUgdW5sZXNzIFkgd2VyZSBhbHJl
YWR5IGluc2lkZS4KKyAgICAgICAgaW50IHJlbGF0aXZlWCA9IHggLSBtX3Bvc2l0aW9uLngoKTsK
KyAgICAgICAgaWYgKHJlbGF0aXZlWCA+PSBtX3NsaWRlclBvc2l0aW9uICYmIHJlbGF0aXZlWCA8
PSBtX3NsaWRlclBvc2l0aW9uICsgbV9idXR0b25TaXplKQorICAgICAgICAgICAgbV9kcmFnU3Rh
cnRPZmZzZXQgPSB4IC0gbV9zbGlkZXJQb3NpdGlvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgbV9kcmFnU3RhcnRPZmZzZXQgPSBtX3Bvc2l0aW9uLngoKSArIG1fYnV0dG9uU2l6ZSAvIDI7
CisgICAgfQorCisgICAgbV9zbGlkZXJQb3NpdGlvbiA9IHggLSBtX2RyYWdTdGFydE9mZnNldDsK
KyAgICBpZiAobV9zbGlkZXJQb3NpdGlvbiA8IDApCisgICAgICAgIG1fc2xpZGVyUG9zaXRpb24g
PSAwOworICAgIGVsc2UgaWYgKG1fc2xpZGVyUG9zaXRpb24gPiBtX3dpZHRoIC0gbV9idXR0b25T
aXplKQorICAgICAgICBtX3NsaWRlclBvc2l0aW9uID0gbV93aWR0aCAtIG1fYnV0dG9uU2l6ZTsK
K30KKworV2ViVmlkZW9GU0hVRENvbnRyb2xsZXI6OldlYlZpZGVvRlNIVURDb250cm9sbGVyKFdl
YlZpZGVvRlNIVURDbGllbnQqIGNsaWVudCwgSFdORCB3aW5kb3cpCisgICAgOiBtX2NsaWVudChj
bGllbnQpCisgICAgLCBtX3dpbmRvdygwKQorICAgICwgbV9wYXJlbnRXaW5kb3cod2luZG93KQor
ICAgICwgbV9mc1dpZHRoKDApCisgICAgLCBtX2ZzSGVpZ2h0KDApCisgICAgLCBtX3Bvc1goMCkK
KyAgICAsIG1fcG9zWSgwKQorICAgICwgbV9wbGF5UGF1c2VCdXR0b24oSFVEQnV0dG9uOjpQbGF5
UGF1c2VCdXR0b24sIGtQbGF5UGF1c2VCdXR0b25Qb2ludCkKKyAgICAsIG1fdGltZVNsaWRlckJ1
dHRvbihIVURCdXR0b246OlRpbWVTbGlkZXJCdXR0b24sIEludFBvaW50KDAsIDApKQorICAgICwg
bV92b2x1bWVVcEJ1dHRvbihIVURCdXR0b246OlZvbHVtZVVwQnV0dG9uLCBrVm9sdW1lVXBCdXR0
b25Qb2ludCkKKyAgICAsIG1fdm9sdW1lU2xpZGVyQnV0dG9uKEhVREJ1dHRvbjo6Vm9sdW1lU2xp
ZGVyQnV0dG9uLCBJbnRQb2ludCgwLCAwKSkKKyAgICAsIG1fdm9sdW1lRG93bkJ1dHRvbihIVURC
dXR0b246OlZvbHVtZURvd25CdXR0b24sIGtWb2x1bWVEb3duQnV0dG9uUG9pbnQpCisgICAgLCBt
X2V4aXRGdWxsc2NyZWVuQnV0dG9uKEhVREJ1dHRvbjo6RXhpdEZ1bGxzY3JlZW5CdXR0b24sIGtF
eGl0RnVsbHNjcmVlbkJ1dHRvblBvaW50KQorICAgICwgbV92b2x1bWVTbGlkZXIoSFVEU2xpZGVy
OjpSb3VuZEJ1dHRvbiwga1ZvbHVtZVNsaWRlckJ1dHRvblNpemUsIGtWb2x1bWVTbGlkZXJQb2lu
dCwga1ZvbHVtZVNsaWRlcldpZHRoLCBrU2xpZGVySGVpZ2h0KQorICAgICwgbV90aW1lU2xpZGVy
KEhVRFNsaWRlcjo6RGlhbW9uZEJ1dHRvbiwga1RpbWVTbGlkZXJCdXR0b25TaXplLCBrVGltZVNs
aWRlclBvaW50LCBrVGltZVNsaWRlcldpZHRoLCBrU2xpZGVySGVpZ2h0KQorICAgICwgbV9waWNr
ZWRXaWRnZXQoMCkKKyAgICAsIG1fbW92aW5nV2luZG93KGZhbHNlKQorICAgICwgbV90aW1lcih0
aGlzLCAmV2ViVmlkZW9GU0hVRENvbnRyb2xsZXI6OnRpbWVyRmlyZWQpCisKK3sKKyAgICBSRUNU
IHdpbmRvd1JlY3Q7CisgICAgR2V0Q2xpZW50UmVjdChtX3BhcmVudFdpbmRvdywgJndpbmRvd1Jl
Y3QpOworICAgIG1fZnNXaWR0aCA9IHdpbmRvd1JlY3QucmlnaHQgLSB3aW5kb3dSZWN0LmxlZnQg
KyAxOworICAgIG1fZnNIZWlnaHQgPSB3aW5kb3dSZWN0LmJvdHRvbSAtIHdpbmRvd1JlY3QudG9w
ICsgMTsKKyAgICBtX3Bvc1ggPSAobV9mc1dpZHRoIC0ga1dpbmRvd1dpZHRoKSAvIDI7CisgICAg
bV9wb3NZID0gbV9mc0hlaWdodCAqIDAuOSAtIGtXaW5kb3dIZWlnaHQgLyAyOworCisgICAgdm9p
ZCogcGl4ZWxzOworICAgIEJpdG1hcEluZm8gYml0bWFwSW5mbyA9IEJpdG1hcEluZm86OmNyZWF0
ZUJvdHRvbVVwKEludFNpemUoa1dpbmRvd1dpZHRoLCBrV2luZG93SGVpZ2h0KSk7CisgICAgbV9i
aXRtYXAuc2V0KDo6Q3JlYXRlRElCU2VjdGlvbihOVUxMLCAmYml0bWFwSW5mbywgRElCX1JHQl9D
T0xPUlMsICZwaXhlbHMsIE5VTEwsIDApKTsKKyAgICAKKyAgICAvLyBEaXJ0eSB0aGUgd2luZG93
IHNvIHRoZSBIVUQgZHJhd3MKKyAgICBSRUNUIGNsZWFyUmVjdCA9IHsgbV9wb3NYLCBtX3Bvc1ks
IG1fcG9zWCArIGtXaW5kb3dXaWR0aCAtIDEsIG1fcG9zWSArIGtXaW5kb3dIZWlnaHQgLSAxIH07
CisgICAgSW52YWxpZGF0ZVJlY3QobV93aW5kb3csICZjbGVhclJlY3QsIHRydWUpOworCisgICAg
bV9wbGF5UGF1c2VCdXR0b24uc2V0U2hvd0FsdEJ1dHRvbighbV9jbGllbnQtPmh1ZENsaWVudENh
blBsYXkoKSk7CisgICAgbV92b2x1bWVTbGlkZXIuc2V0VmFsdWUobV9jbGllbnQtPmh1ZENsaWVu
dFZvbHVtZSgpKTsKKyAgICBtX3RpbWVTbGlkZXIuc2V0VmFsdWUobV9jbGllbnQtPmh1ZENsaWVu
dEN1cnJlbnRUaW1lKCkgLyBtX2NsaWVudC0+aHVkQ2xpZW50RHVyYXRpb24oKSk7CisKKyAgICBj
cmVhdGVXaW5kb3coKTsKKyAgICBkcmF3KCk7CisKKyAgICBpZiAoIW1fY2xpZW50LT5odWRDbGll
bnRDYW5QbGF5KCkpCisgICAgICAgIG1fdGltZXIuc3RhcnRSZXBlYXRpbmcoa1RpbWVySW50ZXJ2
YWwpOworfQorCitXZWJWaWRlb0ZTSFVEQ29udHJvbGxlcjo6fldlYlZpZGVvRlNIVURDb250cm9s
bGVyKCkKK3sKKyAgICBtX2JpdG1hcC5jbGVhcigpOworICAgIFNldFdpbmRvd0xvbmdQdHIobV93
aW5kb3csIDAsIDApOworICAgIERlc3Ryb3lXaW5kb3cobV93aW5kb3cpOworfQorCitjb25zdCBM
UENXU1RSIGtXZWJWaWRlb0ZTSFVEV2luZG93Q2xhc3NOYW1lID0gTCJXZWJWaWRlb0ZTSFVEV2lu
ZG93Q2xhc3MiOworCitib29sIFdlYlZpZGVvRlNIVURDb250cm9sbGVyOjpyZWdpc3RlcldpbmRv
d0NsYXNzKCkKK3sKKyAgICBzdGF0aWMgYm9vbCBoYXZlUmVnaXN0ZXJlZFdpbmRvd0NsYXNzID0g
ZmFsc2U7CisgICAgaWYgKGhhdmVSZWdpc3RlcmVkV2luZG93Q2xhc3MpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgaGF2ZVJlZ2lzdGVyZWRXaW5kb3dDbGFzcyA9IHRydWU7CisKKyAgICBX
TkRDTEFTU0VYIHdjZXg7CisKKyAgICB3Y2V4LmNiU2l6ZSA9IHNpemVvZihXTkRDTEFTU0VYKTsK
KworICAgIHdjZXguc3R5bGUgICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKKyAg
ICB3Y2V4LmxwZm5XbmRQcm9jICAgID0gd25kUHJvYzsKKyAgICB3Y2V4LmNiQ2xzRXh0cmEgICAg
ID0gMDsKKyAgICB3Y2V4LmNiV25kRXh0cmEgICAgID0gNDsKKyAgICB3Y2V4LmhJbnN0YW5jZSAg
ICAgID0gZ0luc3RhbmNlOworICAgIHdjZXguaEljb24gICAgICAgICAgPSAwOworICAgIHdjZXgu
aEN1cnNvciAgICAgICAgPSA6OkxvYWRDdXJzb3IoMCwgSURDX0FSUk9XKTsKKyAgICB3Y2V4Lmhi
ckJhY2tncm91bmQgID0gMDsKKyAgICB3Y2V4Lmxwc3pNZW51TmFtZSAgID0gMDsKKyAgICB3Y2V4
Lmxwc3pDbGFzc05hbWUgID0ga1dlYlZpZGVvRlNIVURXaW5kb3dDbGFzc05hbWU7CisgICAgd2Nl
eC5oSWNvblNtICAgICAgICA9IDA7CisKKyAgICByZXR1cm4gIVJlZ2lzdGVyQ2xhc3NFeCgmd2Nl
eCk7Cit9CisKK3ZvaWQgV2ViVmlkZW9GU0hVRENvbnRyb2xsZXI6OmNyZWF0ZVdpbmRvdygpCit7
CisgICAgcmVnaXN0ZXJXaW5kb3dDbGFzcygpOworCisgICAgbV93aW5kb3cgPSBDcmVhdGVXaW5k
b3dFeChXU19FWF9MQVlFUkVEIHwgV1NfRVhfVFJBTlNQQVJFTlQgfCBXU19FWF9UT1BNT1NUIHwg
V1NfRVhfVE9PTFdJTkRPVywgCisgICAgICAgIGtXZWJWaWRlb0ZTSFVEV2luZG93Q2xhc3NOYW1l
LCAwLCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUsCisgICAgICAgIG1fcG9zWCwgbV9wb3NZLCAwLCAw
LCAwLCAwLCBnSW5zdGFuY2UsIDApOworICAgIEFTU0VSVCg6OklzV2luZG93KG1fd2luZG93KSk7
CisgICAgU2V0V2luZG93TG9uZ1B0cihtX3dpbmRvdywgMCwgcmVpbnRlcnByZXRfY2FzdDxMT05H
X1BUUj4odGhpcykpOworfQorCitzdGF0aWMgU3RyaW5nIHRpbWVUb1N0cmluZyhmbG9hdCB0aW1l
KQoreworICAgIGlmICghaXNmaW5pdGUodGltZSkpCisgICAgICAgIHRpbWUgPSAwOworICAgIGlu
dCBzZWNvbmRzID0gZmFic2YodGltZSk7IAorICAgIGludCBob3VycyA9IHNlY29uZHMgLyAoNjAg
KiA2MCk7CisgICAgaW50IG1pbnV0ZXMgPSAoc2Vjb25kcyAvIDYwKSAlIDYwOworICAgIHNlY29u
ZHMgJT0gNjA7CisKKyAgICBpZiAoaG91cnMpIHsKKyAgICAgICAgaWYgKGhvdXJzID4gOSkKKyAg
ICAgICAgICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJXMlMDJkOiUwMmQ6JTAyZCIsICh0aW1l
IDwgMCA/ICItIiA6ICIiKSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpOworICAgICAgICByZXR1
cm4gU3RyaW5nOjpmb3JtYXQoIiVzJTAxZDolMDJkOiUwMmQiLCAodGltZSA8IDAgPyAiLSIgOiAi
IiksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5n
Ojpmb3JtYXQoIiVzJTAyZDolMDJkIiwgKHRpbWUgPCAwID8gIi0iIDogIiIpLCBtaW51dGVzLCBz
ZWNvbmRzKTsKK30KKwordm9pZCBXZWJWaWRlb0ZTSFVEQ29udHJvbGxlcjo6ZHJhdygpCit7Cisg
ICAgSERDIHdpbmRvd0RDID0gR2V0REMobV93aW5kb3cpOworICAgIEhEQyBiaXRtYXBEQyA9IENy
ZWF0ZUNvbXBhdGlibGVEQyh3aW5kb3dEQyk7CisgICAgU2VsZWN0T2JqZWN0KGJpdG1hcERDLCBt
X2JpdG1hcC5nZXQoKSk7CisKKyAgICBHcmFwaGljc0NvbnRleHQgZ2MoYml0bWFwREMsIHRydWUp
OworCisgICAgLy8gRHJhdyB0aGUgYmFja2dyb3VuZAorICAgIGdjLmZpbGxSb3VuZGVkUmVjdChr
T3V0ZXJTaXplLCBrT3V0ZXJSYWRpdXMsIGtPdXRlclJhZGl1cywga091dGVyUmFkaXVzLCBrT3V0
ZXJSYWRpdXMsIGtCb3JkZXJDb2xvciwgRGV2aWNlQ29sb3JTcGFjZSk7CisgICAgZ2Muc2V0Q29t
cG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZUNvcHkpOworICAgIGdjLmZpbGxSb3VuZGVkUmVjdChr
SW5uZXJTaXplLCBrSW5uZXJSYWRpdXMsIGtJbm5lclJhZGl1cywga0lubmVyUmFkaXVzLCBrSW5u
ZXJSYWRpdXMsIGtCYWNrZ3JvdW5kQ29sb3IsIERldmljZUNvbG9yU3BhY2UpOworCisgICAgLy8g
RHJhdyB0aGUgd2lkZ2V0cworICAgIG1fcGxheVBhdXNlQnV0dG9uLmRyYXcoZ2MpOworICAgIG1f
dm9sdW1lVXBCdXR0b24uZHJhdyhnYyk7CisgICAgbV92b2x1bWVTbGlkZXJCdXR0b24uZHJhdyhn
Yyk7CisgICAgbV92b2x1bWVEb3duQnV0dG9uLmRyYXcoZ2MpOworICAgIG1fdGltZVNsaWRlckJ1
dHRvbi5kcmF3KGdjKTsKKyAgICBtX2V4aXRGdWxsc2NyZWVuQnV0dG9uLmRyYXcoZ2MpOworICAg
IG1fdm9sdW1lU2xpZGVyLmRyYXcoZ2MpOworICAgIG1fdGltZVNsaWRlci5kcmF3KGdjKTsKKwor
ICAgIC8vIERyYXcgdGhlIHRleHQgc3RyaW5ncworICAgIEZvbnREZXNjcmlwdGlvbiBkZXNjOwor
CisgICAgTk9OQ0xJRU5UTUVUUklDUyBtZXRyaWNzOworICAgIG1ldHJpY3MuY2JTaXplID0gc2l6
ZW9mKG1ldHJpY3MpOworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvKFNQSV9HRVROT05DTElFTlRN
RVRSSUNTLCBtZXRyaWNzLmNiU2l6ZSwgJm1ldHJpY3MsIDApOworICAgIC8vZGVzYy5zZXRXZWln
aHQoRm9udFdlaWdodEJvbGQpOworICAgIEZvbnRGYW1pbHkgZmFtaWx5OworICAgIGZhbWlseS5z
ZXRGYW1pbHkobWV0cmljcy5sZlNtQ2FwdGlvbkZvbnQubGZGYWNlTmFtZSk7CisgICAgZGVzYy5z
ZXRGYW1pbHkoZmFtaWx5KTsKKworICAgIGRlc2Muc2V0Q29tcHV0ZWRTaXplKGtUZXh0U2l6ZSk7
CisgICAgLy9kZXNjLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VG
YW1pbHkpOworICAgIEZvbnQgZm9udCA9IEZvbnQoZGVzYywgMCwgMCk7CisgICAgZm9udC51cGRh
dGUoMCk7CisKKyAgICBTdHJpbmcgczsKKworICAgIC8vIExlZnQgc3RyaW5nCisgICAgcyA9IHRp
bWVUb1N0cmluZyhtX2NsaWVudC0+aHVkQ2xpZW50Q3VycmVudFRpbWUoKSk7CisgICAgVGV4dFJ1
biBsZWZ0VGV4dChzKTsKKyAgICBnYy5zZXRGaWxsQ29sb3Ioa1RleHRDb2xvciwgRGV2aWNlQ29s
b3JTcGFjZSk7CisgICAgZ2MuZHJhd1RleHQoZm9udCwgbGVmdFRleHQsIEludFBvaW50KGtMZWZ0
VGV4dFBvaW50LngoKSAtIGZvbnQud2lkdGgobGVmdFRleHQpLCBrTGVmdFRleHRQb2ludC55KCkg
KyAzKSk7CisKKyAgICAvLyBSaWdodCBzdHJpbmcKKyAgICBzID0gdGltZVRvU3RyaW5nKG1fY2xp
ZW50LT5odWRDbGllbnRDdXJyZW50VGltZSgpIC0gbV9jbGllbnQtPmh1ZENsaWVudER1cmF0aW9u
KCkpOworICAgIFRleHRSdW4gcmlnaHRUZXh0KHMpOworICAgIGdjLnNldEZpbGxDb2xvcihrVGV4
dENvbG9yLCBEZXZpY2VDb2xvclNwYWNlKTsKKyAgICBnYy5kcmF3VGV4dChmb250LCByaWdodFRl
eHQsIEludFBvaW50KGtSaWdodFRleHRQb2ludC54KCksIGtSaWdodFRleHRQb2ludC55KCkgKyAz
KSk7CisKKyAgICAvLyBDb3B5IHRvIHRoZSB3aW5kb3cKKyAgICBCTEVOREZVTkNUSU9OIGJsZW5k
RnVuY3Rpb24gPSB7QUNfU1JDX09WRVIsIDAsIDI1NSwgQUNfU1JDX0FMUEhBfTsKKyAgICBTSVpF
IHNpemUgPSB7IGtXaW5kb3dXaWR0aCwga1dpbmRvd0hlaWdodCB9OworICAgIFBPSU5UIHNvdXJj
ZVBvaW50ID0gezAsIDB9OworICAgIFBPSU5UIGRlc3RQb2ludCA9IHttX3Bvc1gsIG1fcG9zWX07
CisgICAgQk9PTCByZXN1bHQgPSBVcGRhdGVMYXllcmVkV2luZG93KG1fd2luZG93LCB3aW5kb3dE
QywgJmRlc3RQb2ludCwgJnNpemUsIGJpdG1hcERDLCAmc291cmNlUG9pbnQsIDAsICZibGVuZEZ1
bmN0aW9uLCBVTFdfQUxQSEEpOworICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisK
KyAgICA6OkRlbGV0ZURDKGJpdG1hcERDKTsKKyAgICA6OlJlbGVhc2VEQyhtX3dpbmRvdywgd2lu
ZG93REMpOworfQorCitMUkVTVUxUIFdlYlZpZGVvRlNIVURDb250cm9sbGVyOjp3bmRQcm9jKEhX
TkQgd25kLCBVSU5UIG1lc3NhZ2UsIFVJTlQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgICBM
T05HX1BUUiBsb25nUHRyID0gR2V0V2luZG93TG9uZ1B0cih3bmQsIDApOworICAgIFdlYlZpZGVv
RlNIVURDb250cm9sbGVyKiBodWRDb250cm9sbGVyID0gcmVpbnRlcnByZXRfY2FzdDxXZWJWaWRl
b0ZTSFVEQ29udHJvbGxlcio+KGxvbmdQdHIpOworICAgIGlmICghaHVkQ29udHJvbGxlcikKKyAg
ICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2Mod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7
CisKKyAgICBzd2l0Y2gobWVzc2FnZSkgeworICAgICAgICBjYXNlIFdNX1BBSU5UOgorICAgICAg
ICAgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgICAgICAgICBCZWdpblBhaW50KHduZCwgJnBzKTsK
KyAgICAgICAgICAgIGh1ZENvbnRyb2xsZXItPmRyYXcoKTsKKyAgICAgICAgICAgIEVuZFBhaW50
KHduZCwgJnBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdNX0NIQVI6Cisg
ICAgICAgICAgICBodWRDb250cm9sbGVyLT5vbkNoYXIod1BhcmFtKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIFdNX0xCVVRUT05ET1dOOgorICAgICAgICAgICAgaHVkQ29udHJv
bGxlci0+b25Nb3VzZURvd24oR0VUX1hfTFBBUkFNKGxQYXJhbSksIEdFVF9ZX0xQQVJBTShsUGFy
YW0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdNX01PVVNFTU9WRToKKyAg
ICAgICAgICAgIGh1ZENvbnRyb2xsZXItPm9uTW91c2VNb3ZlKEdFVF9YX0xQQVJBTShsUGFyYW0p
LCBHRVRfWV9MUEFSQU0obFBhcmFtKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBXTV9MQlVUVE9OVVA6CisgICAgICAgICAgICBodWRDb250cm9sbGVyLT5vbk1vdXNlVXAoR0VU
X1hfTFBBUkFNKGxQYXJhbSksIEdFVF9ZX0xQQVJBTShsUGFyYW0pKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgIH0KKworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKHduZCwgbWVzc2FnZSwgd1Bh
cmFtLCBsUGFyYW0pOworfQorCit2b2lkIFdlYlZpZGVvRlNIVURDb250cm9sbGVyOjpvbkNoYXIo
aW50IGMpCit7CisgICAgaWYgKGMgPT0gMHgxYikKKyAgICAgICAgbV9jbGllbnQtPmh1ZENsaWVu
dEV4aXRGdWxsc2NyZWVuKCk7CisgICAgZWxzZSBpZiAoYyA9PSAweDIwKQorICAgICAgICB0b2dn
bGVQbGF5KCk7Cit9CisKK3ZvaWQgV2ViVmlkZW9GU0hVRENvbnRyb2xsZXI6OnRpbWVyRmlyZWQo
V2ViQ29yZTo6VGltZXI8V2ViVmlkZW9GU0hVRENvbnRyb2xsZXI+KikKK3sKKyAgICAvLyBXaGVu
IHRoZSBtb3ZpZSBpcyBwbGF5aW5nLCB0aGUgZXZlbnQgcXVldWUgc2VlbXMgdG8gYmUgZ2V0dGlu
ZyBzdGFydmVkLAorICAgIC8vIHNvIHdlIGZpcmUgYSB0aW1lciBldmVyeSAzM21zIGFuZCBzaW11
bGF0ZSBhIG1vdXNlIG1vdmUuIFRoaXMgb25seQorICAgIC8vIGhhcHBlbnMgd2hlbiB0aGUgbGVm
dCBidXR0b24gaXMgZG93bgorICAgIGlmIChtX3BpY2tlZFdpZGdldCB8fCBtX21vdmluZ1dpbmRv
dykgeworICAgICAgICBQT0lOVCBwOworICAgICAgICBHZXRDdXJzb3JQb3MoJnApOworICAgICAg
ICBvbk1vdXNlTW92ZShwLngsIHAueSk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSB0aW1l
IHNsaWRlcgorICAgIG1fdGltZVNsaWRlci5zZXRWYWx1ZShtX2NsaWVudC0+aHVkQ2xpZW50Q3Vy
cmVudFRpbWUoKSAvIG1fY2xpZW50LT5odWRDbGllbnREdXJhdGlvbigpKTsKKyAgICBkcmF3KCk7
Cit9CisKK3ZvaWQgV2ViVmlkZW9GU0hVRENvbnRyb2xsZXI6Om9uTW91c2VEb3duKGludCB4LCBp
bnQgeSkKK3sKKyAgICAvLyBNZXNzYWdlcyBhcmUgYWN0dWFsbHkgY29taW5nIGludG8gdGhlIGZ1
bGwtc2NyZWVuIHdpbmRvdywgc28gd2UgaGF2ZSB0byBzdWJ0cmFjdCB0aGUgd2luZG93IHBvc2l0
aW9uCisgICAgeCAtPSBtX3Bvc1g7CisgICAgeSAtPSBtX3Bvc1k7CisKKyAgICAvLyBEb24ndCBi
b3RoZXIgaGl0IHRlc3RpbmcgaWYgd2UncmUgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSB3aW5k
b3cKKyAgICBpZiAoeCA8IDAgfHwgeCA+PSBrV2luZG93V2lkdGggfHwgeSA8IDAgfHwgeSA+PSBr
V2luZG93SGVpZ2h0KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3BpY2tlZFdpZGdldCA9IDA7
CisgICAgbV9tb3ZpbmdXaW5kb3cgPSBmYWxzZTsKKworICAgIGlmIChtX3BsYXlQYXVzZUJ1dHRv
bi5pc1BpY2tlZCh4LCB5KSkKKyAgICAgICAgbV9waWNrZWRXaWRnZXQgPSAmbV9wbGF5UGF1c2VC
dXR0b247CisgICAgZWxzZSBpZiAobV9leGl0RnVsbHNjcmVlbkJ1dHRvbi5pc1BpY2tlZCh4LCB5
KSkKKyAgICAgICAgbV9waWNrZWRXaWRnZXQgPSAmbV9leGl0RnVsbHNjcmVlbkJ1dHRvbjsKKyAg
ICBlbHNlIGlmIChtX3ZvbHVtZVVwQnV0dG9uLmlzUGlja2VkKHgsIHkpKQorICAgICAgICBtX3Bp
Y2tlZFdpZGdldCA9ICZtX3ZvbHVtZVVwQnV0dG9uOworICAgIGVsc2UgaWYgKG1fdm9sdW1lRG93
bkJ1dHRvbi5pc1BpY2tlZCh4LCB5KSkKKyAgICAgICAgbV9waWNrZWRXaWRnZXQgPSAmbV92b2x1
bWVEb3duQnV0dG9uOworICAgIGVsc2UgaWYgKG1fdm9sdW1lU2xpZGVyLmlzUGlja2VkKHgsIHkp
KSB7CisgICAgICAgIG1fcGlja2VkV2lkZ2V0ID0gJm1fdm9sdW1lU2xpZGVyOworICAgICAgICBt
X3ZvbHVtZVNsaWRlci5kcmFnKHgsIHksIHRydWUpOworICAgIH0gZWxzZSBpZiAobV90aW1lU2xp
ZGVyLmlzUGlja2VkKHgsIHkpKSB7CisgICAgICAgIG1fcGlja2VkV2lkZ2V0ID0gJm1fdGltZVNs
aWRlcjsKKyAgICAgICAgbV90aW1lU2xpZGVyLmRyYWcoeCwgeSwgdHJ1ZSk7CisgICAgICAgIG1f
Y2xpZW50LT5odWRDbGllbnRCZWdpblNjcnViYmluZygpOworICAgIH0KKworICAgIC8vIElmIHdl
IGRpZCBub3QgcGljayBhbnkgb2Ygb3VyIHdpZGdldHMgd2UgYXJlIHN0YXJ0aW5nIGEgd2luZG93
IG1vdmUKKyAgICBpZiAoIW1fcGlja2VkV2lkZ2V0KSB7CisgICAgICAgIG1fbW92ZU9mZnNldFgg
PSB4OworICAgICAgICBtX21vdmVPZmZzZXRZID0geTsKKyAgICAgICAgbV9tb3ZpbmdXaW5kb3cg
PSB0cnVlOworICAgIH0KKworICAgIG1fdGltZXIuc3RhcnRSZXBlYXRpbmcoa1RpbWVySW50ZXJ2
YWwpOworfQorCit2b2lkIFdlYlZpZGVvRlNIVURDb250cm9sbGVyOjpvbk1vdXNlTW92ZShpbnQg
eCwgaW50IHkpCit7CisgICAgLy8gTWVzc2FnZXMgYXJlIGFjdHVhbGx5IGNvbWluZyBpbnRvIHRo
ZSBmdWxsLXNjcmVlbiB3aW5kb3csIHNvIHdlIGhhdmUgdG8gc3VidHJhY3QgdGhlIHdpbmRvdyBw
b3NpdGlvbgorICAgIHggLT0gbV9wb3NYOworICAgIHkgLT0gbV9wb3NZOworCisgICAgaWYgKG1f
cGlja2VkV2lkZ2V0KSB7CisgICAgICAgIG1fcGlja2VkV2lkZ2V0LT5kcmFnKHgsIHksIGZhbHNl
KTsKKyAgICAgICAgaWYgKG1fcGlja2VkV2lkZ2V0ID09ICZtX3ZvbHVtZVNsaWRlcikKKyAgICAg
ICAgICAgIG1fY2xpZW50LT5odWRDbGllbnRTZXRWb2x1bWUobV92b2x1bWVTbGlkZXIudmFsdWUo
KSk7CisgICAgICAgIGVsc2UgaWYgKG1fcGlja2VkV2lkZ2V0ID09ICZtX3RpbWVTbGlkZXIpCisg
ICAgICAgICAgICBtX2NsaWVudC0+aHVkQ2xpZW50U2V0Q3VycmVudFRpbWUobV90aW1lU2xpZGVy
LnZhbHVlKCkgKiBtX2NsaWVudC0+aHVkQ2xpZW50RHVyYXRpb24oKSk7CisgICAgICAgIGRyYXco
KTsKKyAgICB9IGVsc2UgaWYgKG1fbW92aW5nV2luZG93KSB7CisgICAgICAgIG1fcG9zWCArPSB4
IC0gbV9tb3ZlT2Zmc2V0WDsKKyAgICAgICAgbV9wb3NZICs9IHkgLSBtX21vdmVPZmZzZXRZOwor
ICAgICAgICBkcmF3KCk7CisgICAgfQorfQorCit2b2lkIFdlYlZpZGVvRlNIVURDb250cm9sbGVy
Ojpvbk1vdXNlVXAoaW50IHgsIGludCB5KQoreworICAgIC8vIE1lc3NhZ2VzIGFyZSBhY3R1YWxs
eSBjb21pbmcgaW50byB0aGUgZnVsbC1zY3JlZW4gd2luZG93LCBzbyB3ZSBoYXZlIHRvIHN1YnRy
YWN0IHRoZSB3aW5kb3cgcG9zaXRpb24KKyAgICB4IC09IG1fcG9zWDsKKyAgICB5IC09IG1fcG9z
WTsKKworICAgIG1fbW92aW5nV2luZG93ID0gZmFsc2U7CisKKyAgICAvLyBXZSBhcmUgcnVubmlu
ZyBhIHRpbWVyIGR1cmluZyBtb3VzZSBtb3Zlcy4gV2Ugd2FudCB0byBhbHNvIHJ1biBpdAorICAg
IC8vIHdoaWxlIHRoZSB2aWRlbyBpcyBwbGF5aW5nIHRvIHVwZGF0ZSB0aGUgdGltZSBzbGlkZXIu
IFNvIGRvbid0IHN0b3AKKyAgICAvLyBpdCBpZiB0aGUgdmlkZW8gaXMgcnVubmluZworICAgIGlm
IChtX2NsaWVudC0+aHVkQ2xpZW50Q2FuUGxheSgpKQorICAgICAgICBtX3RpbWVyLnN0b3AoKTsK
KworICAgIGlmIChtX3BpY2tlZFdpZGdldCkgeworICAgICAgICBpZiAobV9wbGF5UGF1c2VCdXR0
b24uaXNQaWNrZWQoeCwgeSkpCisgICAgICAgICAgICB0b2dnbGVQbGF5KCk7CisgICAgICAgIGVs
c2UgaWYgKG1fdm9sdW1lVXBCdXR0b24uaXNQaWNrZWQoeCwgeSkpIHsKKyAgICAgICAgICAgIG1f
Y2xpZW50LT5odWRDbGllbnRTZXRWb2x1bWUoMSk7CisgICAgICAgICAgICBtX3ZvbHVtZVNsaWRl
ci5zZXRWYWx1ZSgxKTsKKyAgICAgICAgfSBlbHNlIGlmIChtX3ZvbHVtZURvd25CdXR0b24uaXNQ
aWNrZWQoeCwgeSkpIHsKKyAgICAgICAgICAgIG1fY2xpZW50LT5odWRDbGllbnRTZXRWb2x1bWUo
MCk7CisgICAgICAgICAgICBtX3ZvbHVtZVNsaWRlci5zZXRWYWx1ZSgwKTsKKyAgICAgICAgfSBl
bHNlIGlmIChtX3BpY2tlZFdpZGdldCA9PSAmbV90aW1lU2xpZGVyKQorICAgICAgICAgICAgbV9j
bGllbnQtPmh1ZENsaWVudEVuZFNjcnViYmluZygpOworICAgICAgICBlbHNlIGlmIChtX2V4aXRG
dWxsc2NyZWVuQnV0dG9uLmlzUGlja2VkKHgsIHkpKSB7CisgICAgICAgICAgICBtX2NsaWVudC0+
aHVkQ2xpZW50RXhpdEZ1bGxzY3JlZW4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgIH0KKworICAgIG1fcGlja2VkV2lkZ2V0ID0gMDsKKyAgICBkcmF3KCk7Cit9CisKK3Zv
aWQgV2ViVmlkZW9GU0hVRENvbnRyb2xsZXI6OnRvZ2dsZVBsYXkoKQoreworICAgIGlmIChtX2Ns
aWVudC0+aHVkQ2xpZW50Q2FuUGxheSgpKQorICAgICAgICBtX2NsaWVudC0+aHVkQ2xpZW50UGxh
eSgpOworICAgIGVsc2UKKyAgICAgICAgbV9jbGllbnQtPmh1ZENsaWVudFBhdXNlKCk7CisKKyAg
ICBtX3BsYXlQYXVzZUJ1dHRvbi5zZXRTaG93QWx0QnV0dG9uKCFtX2NsaWVudC0+aHVkQ2xpZW50
Q2FuUGxheSgpKTsKKyAgICBpZiAoIW1fY2xpZW50LT5odWRDbGllbnRDYW5QbGF5KCkpCisgICAg
ICAgIG1fdGltZXIuc3RhcnRSZXBlYXRpbmcoa1RpbWVySW50ZXJ2YWwpOworICAgIGVsc2UKKyAg
ICAgICAgbV90aW1lci5zdG9wKCk7Cit9CisKKyNlbmRpZgpJbmRleDogV2ViS2l0L3dpbi9XZWJW
aWRlb0ZTSFVEQ29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViVmlkZW9G
U0hVRENvbnRyb2xsZXIuaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC93aW4vV2ViVmlkZW9GU0hV
RENvbnRyb2xsZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aWZuZGVmIFdlYlZpZGVvRlNIVURDb250cm9sbGVyX2gKKyNkZWZpbmUgV2ViVmlkZW9GU0hVRENv
bnRyb2xsZXJfaAorCisjaWYgRU5BQkxFKFZJREVPKQorCisjaW5jbHVkZSA8V2ViQ29yZS9IVE1M
TWVkaWFFbGVtZW50Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbWFnZS5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvSW50UG9pbnQuaD4KKworY2xhc3MgV2ViVmlkZW9GU0hVRENvbnRyb2xsZXI7CitjbGFz
cyBXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ7CisKK2NsYXNzIEhVRFdpZGdldCB7CitwdWJsaWM6
CisgICAgSFVEV2lkZ2V0KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBwb3NpdGlvbiwgaW50IHdp
ZHRoLCBpbnQgaGVpZ2h0KQorICAgICAgICA6IG1fcG9zaXRpb24ocG9zaXRpb24pCisgICAgICAg
ICwgbV93aWR0aCh3aWR0aCkKKyAgICAgICAgLCBtX2hlaWdodChoZWlnaHQpIHsgfQorICAgIH5I
VURXaWRnZXQoKSB7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkcmF3KFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dCYpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhZyhpbnQgeCwgaW50IHksIGJvb2wg
c3RhcnQpID0gMDsKKyAgICBib29sIGlzUGlja2VkKGludCB4LCBpbnQgeSkgY29uc3QgeyByZXR1
cm4geCA+PSBtX3Bvc2l0aW9uLngoKSAmJiB4IDwgbV9wb3NpdGlvbi54KCkgKyBtX3dpZHRoICYm
IHkgPj0gbV9wb3NpdGlvbi55KCkgJiYgeSA8IG1fcG9zaXRpb24ueSgpICsgbV9oZWlnaHQ7IH0K
KworcHJvdGVjdGVkOgorICAgIFdlYkNvcmU6OkludFBvaW50IG1fcG9zaXRpb247CisgICAgaW50
IG1fd2lkdGgsIG1faGVpZ2h0OworfTsKKworY2xhc3MgSFVEQnV0dG9uIDogcHVibGljIEhVRFdp
ZGdldCB7CitwdWJsaWM6CisgICAgZW51bSBIVURCdXR0b25UeXBlIHsKKyAgICAgICAgTm9CdXR0
b24sCisgICAgICAgIFBsYXlQYXVzZUJ1dHRvbiwKKyAgICAgICAgVGltZVNsaWRlckJ1dHRvbiwK
KyAgICAgICAgVm9sdW1lVXBCdXR0b24sCisgICAgICAgIFZvbHVtZVNsaWRlckJ1dHRvbiwKKyAg
ICAgICAgVm9sdW1lRG93bkJ1dHRvbiwKKyAgICAgICAgRXhpdEZ1bGxzY3JlZW5CdXR0b24KKyAg
ICB9OworCisgICAgSFVEQnV0dG9uKEhVREJ1dHRvblR5cGUgdHlwZSwgY29uc3QgV2ViQ29yZTo6
SW50UG9pbnQmKTsKKyAgICB+SFVEQnV0dG9uKCkgeyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZHJh
dyhXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhZyhpbnQg
eCwgaW50IHksIGJvb2wgc3RhcnQpIHsgfQorICAgIHZvaWQgc2V0U2hvd0FsdEJ1dHRvbihib29s
IGIpICB7IG1fc2hvd0FsdEJ1dHRvbiA9IGI7IH0KKworcHJpdmF0ZToKKyAgICBSZWZQdHI8V2Vi
Q29yZTo6SW1hZ2U+IG1fYnV0dG9uSW1hZ2U7CisgICAgUmVmUHRyPFdlYkNvcmU6OkltYWdlPiBt
X2J1dHRvbkltYWdlQWx0OworICAgIEhVREJ1dHRvblR5cGUgbV90eXBlOworICAgIGJvb2wgbV9z
aG93QWx0QnV0dG9uOworfTsKKworY2xhc3MgSFVEU2xpZGVyIDogcHVibGljIEhVRFdpZGdldCB7
CitwdWJsaWM6CisgICAgZW51bSBIVURTbGlkZXJCdXR0b25TaGFwZSB7IFJvdW5kQnV0dG9uLCBE
aWFtb25kQnV0dG9uIH07CisKKyAgICBIVURTbGlkZXIoSFVEU2xpZGVyQnV0dG9uU2hhcGUsIGlu
dCBidXR0b25TaXplLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYsIGludCB3aWR0aCwgaW50IGhl
aWdodCk7CisgICAgfkhVRFNsaWRlcigpIHsgfQorCisgICAgdmlydHVhbCB2b2lkIGRyYXcoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0Jik7CisgICAgdmlydHVhbCB2b2lkIGRyYWcoaW50IHgsIGlu
dCB5LCBib29sIHN0YXJ0KTsKKyAgICBmbG9hdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRp
Y19jYXN0PGZsb2F0PihtX3NsaWRlclBvc2l0aW9uKSAvIChtX3dpZHRoIC0gbV9idXR0b25TaXpl
KTsgfQorICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsgbV9zbGlkZXJQb3NpdGlvbiA9
IHN0YXRpY19jYXN0PGludD4odmFsdWUgKiAobV93aWR0aCAtIG1fYnV0dG9uU2l6ZSkpOyB9CisK
K3ByaXZhdGU6CisgICAgSFVEU2xpZGVyQnV0dG9uU2hhcGUgbV9idXR0b25TaGFwZTsKKyAgICBp
bnQgbV9idXR0b25TaXplOworICAgIGludCBtX3NsaWRlclBvc2l0aW9uOworICAgIGludCBtX2Ry
YWdTdGFydE9mZnNldDsKK307CisKK2NsYXNzIFdlYlZpZGVvRlNIVURDbGllbnQgeworcHVibGlj
OgorICAgIHZpcnR1YWwgdm9pZCBodWRDbGllbnRFeGl0RnVsbHNjcmVlbigpID0gMDsKKyAgICB2
aXJ0dWFsIGJvb2wgaHVkQ2xpZW50Q2FuUGxheSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaHVk
Q2xpZW50UGxheSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaHVkQ2xpZW50UGF1c2UoKSA9IDA7
CisgICAgdmlydHVhbCBmbG9hdCBodWRDbGllbnRWb2x1bWUoKSBjb25zdCA9IDA7CisgICAgdmly
dHVhbCB2b2lkIGh1ZENsaWVudFNldFZvbHVtZShmbG9hdCkgPSAwOworICAgIHZpcnR1YWwgZmxv
YXQgaHVkQ2xpZW50Q3VycmVudFRpbWUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIGh1
ZENsaWVudFNldEN1cnJlbnRUaW1lKGZsb2F0KSA9IDA7CisgICAgdmlydHVhbCBmbG9hdCBodWRD
bGllbnREdXJhdGlvbigpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaHVkQ2xpZW50QmVn
aW5TY3J1YmJpbmcoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGh1ZENsaWVudEVuZFNjcnViYmlu
ZygpID0gMDsKK307CisKK2NsYXNzIFdlYlZpZGVvRlNIVURDb250cm9sbGVyIHsKK3B1YmxpYzoK
KyAgICBXZWJWaWRlb0ZTSFVEQ29udHJvbGxlcihXZWJWaWRlb0ZTSFVEQ2xpZW50KiwgSFdORCk7
CisgICAgfldlYlZpZGVvRlNIVURDb250cm9sbGVyKCk7CisKKyAgICB2b2lkIGRyYXcoKTsKKwor
ICAgIHZvaWQgb25DaGFyKGludCBjKTsKKyAgICB2b2lkIG9uTW91c2VEb3duKGludCB4LCBpbnQg
eSk7CisgICAgdm9pZCBvbk1vdXNlTW92ZShpbnQgeCwgaW50IHkpOworICAgIHZvaWQgb25Nb3Vz
ZVVwKGludCB4LCBpbnQgeSk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgcmVnaXN0ZXJX
aW5kb3dDbGFzcygpOworICAgIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLIHduZFByb2MoSFdORCwg
VUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKKyAgICB2b2lkIGNy
ZWF0ZVdpbmRvdygpOworICAgIHZvaWQgdGltZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxXZWJWaWRl
b0ZTSFVEQ29udHJvbGxlcj4qKTsKKworICAgIHZvaWQgdG9nZ2xlUGxheSgpOworCisgICAgV2Vi
VmlkZW9GU0hVRENsaWVudCogbV9jbGllbnQ7CisgICAgSFdORCBtX3dpbmRvdywgbV9wYXJlbnRX
aW5kb3c7CisgICAgT3duUHRyPEhCSVRNQVA+IG1fYml0bWFwOworICAgIGludCBtX2ZzV2lkdGgs
IG1fZnNIZWlnaHQ7CisgICAgaW50IG1fcG9zWCwgbV9wb3NZOworCisgICAgSFVEQnV0dG9uIG1f
cGxheVBhdXNlQnV0dG9uOworICAgIEhVREJ1dHRvbiBtX3RpbWVTbGlkZXJCdXR0b247CisgICAg
SFVEQnV0dG9uIG1fdm9sdW1lVXBCdXR0b247CisgICAgSFVEQnV0dG9uIG1fdm9sdW1lU2xpZGVy
QnV0dG9uOworICAgIEhVREJ1dHRvbiBtX3ZvbHVtZURvd25CdXR0b247CisgICAgSFVEQnV0dG9u
IG1fZXhpdEZ1bGxzY3JlZW5CdXR0b247CisgICAgSFVEU2xpZGVyIG1fdm9sdW1lU2xpZGVyOwor
ICAgIEhVRFNsaWRlciBtX3RpbWVTbGlkZXI7CisKKyAgICBIVURXaWRnZXQqIG1fcGlja2VkV2lk
Z2V0OworICAgIGludCBtX21vdmVPZmZzZXRYLCBtX21vdmVPZmZzZXRZOworICAgIGJvb2wgbV9t
b3ZpbmdXaW5kb3c7CisgICAgV2ViQ29yZTo6VGltZXI8V2ViVmlkZW9GU0hVRENvbnRyb2xsZXI+
IG1fdGltZXI7Cit9OworCisjZW5kaWYKKworI2VuZGlmIC8vIFdlYlZpZGVvRlNIVURDb250cm9s
bGVyX2gKSW5kZXg6IFdlYktpdC93aW4vV2ViVmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L3dpbi9XZWJWaWV3LmNwcAkocmV2aXNpb24gNTI0OTcpCisrKyBXZWJLaXQvd2luL1dlYlZpZXcu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSAiV2ViUGx1Z2lu
SGFsdGVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiV2ViUHJlZmVyZW5jZXMuaCIKICNpbmNsdWRlICJX
ZWJTY3JpcHRXb3JsZC5oIgorI2luY2x1ZGUgIldlYlZpZGVvRlNDb250cm9sbGVyLmgiCiAjaW5j
bHVkZSAiV2luZG93c1RvdWNoLmgiCiAjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSW5pdGlhbGl6
ZVRocmVhZGluZy5oPgogI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTTG9jay5oPgpAQCAtODcs
NiArODgsOCBAQAogI2luY2x1ZGUgPFdlYkNvcmUvSGlzdG9yeUl0ZW0uaD4KICNpbmNsdWRlIDxX
ZWJDb3JlL0hpdFRlc3RSZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9IaXRUZXN0UmVzdWx0
Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9IVE1MTWVkaWFFbGVtZW50Lmg+CisjaW5jbHVkZSA8V2Vi
Q29yZS9IVE1MTmFtZXMuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ludFJlY3QuaD4KICNpbmNsdWRl
IDxXZWJDb3JlL0tleWJvYXJkRXZlbnQuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0xhbmd1YWdlLmg+
CkBAIC01NTE4LDYgKzU1MjEsNDMgQEAgc3RhdGljIEtVUkwgdG9LVVJMKEJTVFIgYnN0cikKICAg
ICByZXR1cm4gS1VSTChLVVJMKCksIHRvU3RyaW5nKGJzdHIpKTsKIH0KIAordm9pZCBXZWJWaWV3
OjplbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgQVNTRVJUKG5vZGUt
Pmhhc1RhZ05hbWUoV2ViQ29yZTo6SFRNTE5hbWVzOjp2aWRlb1RhZykpOworICAgIEhUTUxNZWRp
YUVsZW1lbnQqIHZpZGVvRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihu
b2RlKTsKKworICAgIGlmIChtX2ZzQ29udHJvbGxlcikgeworICAgICAgICBpZiAobV9mc0NvbnRy
b2xsZXItPm1lZGlhRWxlbWVudCgpID09IHZpZGVvRWxlbWVudCkgeworICAgICAgICAgICAgLy8g
VGhlIGJhY2tlbmQgbWF5IGp1c3Qgd2FybiB1cyB0aGF0IHRoZSB1bmRlcmxheWluZyBwbGFmdG9y
bU1vdmllKCkKKyAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkLiBKdXN0IGZvcmNlIGFuIHVwZGF0
ZS4KKyAgICAgICAgICAgIG1fZnNDb250cm9sbGVyLT5zZXRNZWRpYUVsZW1lbnQodmlkZW9FbGVt
ZW50KTsKKyAgICAgICAgICAgIHJldHVybjsgLy8gTm8gbW9yZSB0byBkby4KKyAgICAgICAgfQor
CisgICAgICAgIC8vIEZpcnN0IGV4aXQgRnVsbHNjcmVlbiBmb3IgdGhlIG9sZCBtZWRpYUVsZW1l
bnQuCisgICAgICAgIG1fZnNDb250cm9sbGVyLT5tZWRpYUVsZW1lbnQoKS0+ZXhpdEZ1bGxzY3Jl
ZW4oKTsKKyAgICAgICAgLy8gVGhpcyBwcmV2aW91cyBjYWxsIGhhcyB0byB0cmlnZ2VyIGV4aXRG
dWxsc2NyZWVuLAorICAgICAgICAvLyB3aGljaCBoYXMgdG8gY2xlYXIgbV9mc0NvbnRyb2xsZXIu
CisgICAgICAgIEFTU0VSVCghbV9mc0NvbnRyb2xsZXIpOworICAgIH0KKyAgICBpZiAoIW1fZnND
b250cm9sbGVyKSB7CisgICAgICAgIG1fZnNDb250cm9sbGVyID0gbmV3IFdlYlZpZGVvRlNDb250
cm9sbGVyKCk7CisgICAgICAgIG1fZnNDb250cm9sbGVyLT5zZXRNZWRpYUVsZW1lbnQodmlkZW9F
bGVtZW50KTsKKyAgICAgICAgbV9mc0NvbnRyb2xsZXItPmVudGVyRnVsbHNjcmVlbigpOyAgICAg
ICAgCisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbV9mc0NvbnRyb2xsZXItPnNldE1lZGlhRWxl
bWVudCh2aWRlb0VsZW1lbnQpOworfQorCit2b2lkIFdlYlZpZXc6OmV4aXRGdWxsc2NyZWVuKCkK
K3sKKyAgICBpZiAobV9mc0NvbnRyb2xsZXIpCisgICAgICAgIG1fZnNDb250cm9sbGVyLT5leGl0
RnVsbHNjcmVlbigpOworICAgIGZyZWUobWFsbG9jKDEpKTsKKyAgICBtX2ZzQ29udHJvbGxlciA9
IDA7CisgICAgZnJlZShtYWxsb2MoMSkpOworfQorCiBzdGF0aWMgUGFzc093blB0cjxWZWN0b3I8
U3RyaW5nPiA+IHRvU3RyaW5nVmVjdG9yKHVuc2lnbmVkIHBhdHRlcm5zQ291bnQsIEJTVFIqIHBh
dHRlcm5zKQogewogICAgIC8vIENvbnZlcnQgdGhlIHBhdHRlcm5zIGludG8gYSBWZWN0b3IuCklu
ZGV4OiBXZWJLaXQvd2luL1dlYlZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZp
ZXcuaAkocmV2aXNpb24gNTI0OTcpCisrKyBXZWJLaXQvd2luL1dlYlZpZXcuaAkod29ya2luZyBj
b3B5KQpAQCAtNDMsNiArNDMsNyBAQCBjbGFzcyBXZWJGcmFtZTsKIGNsYXNzIFdlYkJhY2tGb3J3
YXJkTGlzdDsKIGNsYXNzIFdlYkluc3BlY3RvcjsKIGNsYXNzIFdlYkluc3BlY3RvckNsaWVudDsK
K2NsYXNzIFdlYlZpZGVvRlNDb250cm9sbGVyOwogCiBXZWJWaWV3KiBraXQoV2ViQ29yZTo6UGFn
ZSopOwogV2ViQ29yZTo6UGFnZSogY29yZShJV2ViVmlldyopOwpAQCAtODY4LDYgKzg2OSw5IEBA
IHB1YmxpYzoKICAgICB2b2lkIHNldFJvb3RDaGlsZExheWVyKFdlYkNvcmU6OlBsYXRmb3JtTGF5
ZXIqIGxheWVyKTsKICNlbmRpZgogCisgICAgdm9pZCBlbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKFdl
YkNvcmU6Ok5vZGUqKTsKKyAgICB2b2lkIGV4aXRGdWxsc2NyZWVuKCk7CisKIHByaXZhdGU6CiAg
ICAgdm9pZCBzZXRab29tTXVsdGlwbGllcihmbG9hdCBtdWx0aXBsaWVyLCBib29sIGlzVGV4dE9u
bHkpOwogICAgIGZsb2F0IHpvb21NdWx0aXBsaWVyKGJvb2wgaXNUZXh0T25seSk7CkBAIC05ODEs
NiArOTg1LDggQEAgcHJvdGVjdGVkOgogICAgIGxvbmcgbV94T3ZlcnBhbjsKICAgICBsb25nIG1f
eU92ZXJwYW47CiAKKyAgICBPd25QdHI8V2ViVmlkZW9GU0NvbnRyb2xsZXI+IG1fZnNDb250cm9s
bGVyOworCiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogICAgIGJvb2wgaXNBY2Nl
bGVyYXRlZENvbXBvc2l0aW5nKCkgY29uc3QgeyByZXR1cm4gbV9pc0FjY2VsZXJhdGVkQ29tcG9z
aXRpbmc7IH0KICAgICB2b2lkIHNldEFjY2VsZXJhdGVkQ29tcG9zaXRpbmcoYm9vbCk7CkluZGV4
OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuY3BwCShyZXZp
c2lvbiA1MjQ5NykKKysrIFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPFdlYkNvcmUv
RmxvYXRSZWN0Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZUxvYWRSZXF1ZXN0Lmg+CiAjaW5j
bHVkZSA8V2ViQ29yZS9GcmFtZVZpZXcuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0hUTUxOYW1lcy5o
PgogI2luY2x1ZGUgPFdlYkNvcmUvTG9jYWxpemVkU3RyaW5ncy5oPgogI2luY2x1ZGUgPFdlYkNv
cmUvTm90SW1wbGVtZW50ZWQuaD4KICNpbmNsdWRlIDxXZWJDb3JlL1BhZ2UuaD4KQEAgLTc3Mywz
ICs3NzQsMjMgQEAgQ09NUHRyPElXZWJVSURlbGVnYXRlPiBXZWJDaHJvbWVDbGllbnQ6OgogICAg
IG1fd2ViVmlldy0+dWlEZWxlZ2F0ZSgmZGVsZWdhdGUpOwogICAgIHJldHVybiBkZWxlZ2F0ZTsK
IH0KKworI2lmIEVOQUJMRShWSURFTykKKworYm9vbCBXZWJDaHJvbWVDbGllbnQ6OnN1cHBvcnRz
RnVsbHNjcmVlbkZvck5vZGUoY29uc3QgTm9kZSogbm9kZSkKK3sKKyAgICByZXR1cm4gbm9kZS0+
aGFzVGFnTmFtZShXZWJDb3JlOjpIVE1MTmFtZXM6OnZpZGVvVGFnKTsKK30KKwordm9pZCBXZWJD
aHJvbWVDbGllbnQ6OmVudGVyRnVsbHNjcmVlbkZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBt
X3dlYlZpZXctPmVudGVyRnVsbHNjcmVlbkZvck5vZGUobm9kZSk7Cit9CisKK3ZvaWQgV2ViQ2hy
b21lQ2xpZW50OjpleGl0RnVsbHNjcmVlbkZvck5vZGUoTm9kZSopCit7CisgICAgbV93ZWJWaWV3
LT5leGl0RnVsbHNjcmVlbigpOworfQorCisjZW5kaWYKKwpJbmRleDogV2ViS2l0L3dpbi9XZWJD
b3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dl
YkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCShyZXZpc2lvbiA1MjQ5NykKKysrIFdlYktp
dC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAg
LTE0Nyw2ICsxNDcsMTIgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RHZW9s
b2NhdGlvblBlcm1pc3Npb25Gb3JGcmFtZShXZWJDb3JlOjpGcmFtZSosIFdlYkNvcmU6Okdlb2xv
Y2F0aW9uKik7CiAKKyNpZiBFTkFCTEUoVklERU8pCisgICAgdmlydHVhbCBib29sIHN1cHBvcnRz
RnVsbHNjcmVlbkZvck5vZGUoY29uc3QgV2ViQ29yZTo6Tm9kZSopOworICAgIHZpcnR1YWwgdm9p
ZCBlbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZXhpdEZ1bGxzY3JlZW5Gb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyNlbmRpZgorCiAjaWYg
RU5BQkxFKE5PVElGSUNBVElPTlMpCiAgICAgdmlydHVhbCBXZWJDb3JlOjpOb3RpZmljYXRpb25Q
cmVzZW50ZXIqIG5vdGlmaWNhdGlvblByZXNlbnRlcigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJw
cmV0X2Nhc3Q8V2ViQ29yZTo6Tm90aWZpY2F0aW9uUHJlc2VudGVyKj4obV9ub3RpZmljYXRpb25z
RGVsZWdhdGUuZ2V0KCkpOyB9CiAjZW5kaWYKSW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJv
ai9XZWJLaXQudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9X
ZWJLaXQudmNwcm9qCShyZXZpc2lvbiA1MjQ5NykKKysrIFdlYktpdC93aW4vV2ViS2l0LnZjcHJv
ai9XZWJLaXQudmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC04MzQsNiArODM0LDE0IEBACiAJCQkJ
Pg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlZpZGVv
RlNDb250cm9sbGVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVs
YXRpdmVQYXRoPSIuLlxXZWJWaWRlb0ZTSFVEQ29udHJvbGxlci5oIg0KKwkJCQk+DQorCQkJPC9G
aWxlPg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2ViVmlldy5oIg0KIAkJCQk+
DQogCQkJPC9GaWxlPg0KQEAgLTEyMzQsNiArMTI0MiwxNCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+
DQogCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxXZWJWaWRlb0ZTQ29udHJvbGxlci5j
cHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIu
LlxXZWJWaWRlb0ZTSFVEQ29udHJvbGxlci5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJ
PEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxXZWJWaWV3LmNwcCINCiAJCQkJPg0KIAkJCTwv
RmlsZT4NCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRlb0F1ZGlvVm9sdW1l
SGlnaC5wbmcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5h
cnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKaVZCT1J3
MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXVKQUFB
TGlRRTN5Y3V0QUFBSwpUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZO
blZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVCmtTWXFJUWtRU29naG9ka1ZVY0VSUlVV
RUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFgKUHVl
czg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01C
QVBoK1BEd3JJc0FIdmdBQgplTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFV
QUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0CkFHQW5mK2JUQUlDZCtKbDdBUUJi
bENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzMK
QU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRt
Ykk4dVNRNVJZRmJDQzF4QjFkWApMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FB
S0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArCjVjK3JjRUFBQU9GMGZ0SCtM
Qyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJl
WGsKNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRL
VWN6NUlKaEdMYzVvOUgvTGNMLy93ZAoweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tj
VWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBCjR2Y0FBUEs3YjhIVUtB
Z0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9U
QkdDekEKQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVB
ZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waApDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdn
WG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1CmgxeEd1cEU3eUFB
eWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZR
cTJnUDJvOCsKUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4x
WTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTQpXRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtU
cUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RCkFrbXhwRlRT
RXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tu
V0pBY2FUNFUrSW8KVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZV
WWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcApyK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2
QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaCkQ1bHZW
VmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFR
blVscXRWcXAxUTYxTWIKVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZN
WWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WQovUjI3aXoycXFhRTVRek5LTTFlelV2
T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyClNL
dFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRy
MXJpNnFhNlVib2J0RWQ3OXUKcCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZn
R3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaApsV0dYNFlTUnVkRThvOVZHalVZ
UGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsx
Cm16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBk
czBhdG5hMGwxcnV0dTZjUnA3bE8KazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0Zu
WWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeQpGRHBXT3Q2YXpwenVQMzNG
OUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4
dDNJCnZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElR
K0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0IKWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXlu
K00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLwowUUNuZ0NVQlp3T0pn
VUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1
ak9rYzVwCkRvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMw
VDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXEKUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxp
cXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJcwpPcFpBVEloT09K
VHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhr
a3hUT2xMT1c1CmhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitw
bjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1EKckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJh
L3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOQpyR281c2p4
eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RW
Q3VXRmZldmMxKzFkClQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5cita
M0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVgKRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZO
S051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0Nwp2UFkw
N05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNB
LzBISXc2MjE3blUxUjNTClBWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2
ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2EKUnB0VG12dGJZbHU2VDh3KzBkYnEz
bnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTwoz
Mm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4
ZTduTHVhcnJsY2E3bnVlcjIxCmUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkv
WGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlYKUDF2KzNOanYzSDlxd0hlZzg5
SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82
aQovc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3
MFZ2dnR3WGZjZHgzdm85OFBUK1I4CklIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRz
QUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHEKWUFBQU9wZ0FBQmR2a2wv
RlJnQUFBUDFKUkVGVWVOcThrOUZOdzBBUVJHZWovRHNkMkZRQUhUZ2QyRlRnZEFBZFVFTG93Q1dZ
RHB4VQprSFRnVUFGMDhQS1JQV2xsYkFjSmlmM2FtN3VkMjV2Wk0wRC9Fa0FMOUVBV3NObkRHWkNQ
c0VkZ0FFNkpCTkJxcWxqU1FWSVJ5SHBmClAvbXhqNldiVDl5aURIam5XQVdVYVIvUUduZ0xISFc0
SlhWVG05a3owRWw2TjdNSDRDQnBKK2tvNXFNRWN1QUxhRHhQK0l2cjhWT0QKR0diMktlbFYwczd6
aTZTdHBIUFNhUFVMQndzdmxLU05wTys0dWI3amZlWWRiRjNValR0VWV4ZVR3MEowd1oxSjd2U09E
Y0IrY3BBQwpTYlJ4Y0RGekZ4RFBGOGMyRWpUZVJlWEYrOFZSRHUvWGlBU2d2ZnNYWmdncm9CbGhz
cjkrNStzQXM0NDNCVTk5WGVJQUFBQUFTVVZPClJLNUNZSUk9CgpJbmRleDogV2ViS2l0L3dpbi9X
ZWJLaXQudmNwcm9qL2ZzVmlkZW9BdWRpb1ZvbHVtZUxvdy5wbmcKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpDYW5ub3Qg
ZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGFw
cGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFD
QVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXVKQUFBTGlRRTN5Y3V0QUFBSwpUMmxEUTFCUWFHOTBi
M05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlG
SkNpNEFVCmtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lh
S09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFgKUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVl
Q0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQgplTk1MQ0FEQVRa
dkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdE
TFkyTGpBRkF0CkFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9w
RkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzMKQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdE
SUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWApMaDRvemtr
WEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0
NnI4Ry95SmlZdVArCjVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVM
WnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGsKNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFz
K1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZAoweUxF
U1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJM
YWhkWXdQMlN5Y1FXSFRBCjR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNj
UUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekEKQmh6QkJkekJDL3hnTm9SQ0pNVENR
aEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waApD
SjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5V
Z3hVb3BVSUZWSUhmSTljZ0k1CmgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dv
UkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCsKUThjd3dPZ1lCelBFYkRBdXhz
TkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0Zo
TQpXRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84
VEx4QjdpRVBFTnlRU2lVTXlKN21RCkFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1
eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW8KVXNwcVNobmxFT1UwNVFa
bG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdY
YVBkcApyK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwz
R0srWVRLWVowNHNaeDFRd056SHJtT2VaCkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21x
cHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWIKVTJlcE82aUhxbWVv
YjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4y
WHgyS3J1WQovUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNksz
aFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyClNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4
MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXUKcCs2WW5yNWVn
SjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhW
RkRYY05BUTZWaApsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRl
cE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxCm16MHgxekxubStlYjE1dmZ0MkJhZUZvc3Rx
aTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE8KazA2cm50
Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlm
WkRxc2RXaDErYzdSeQpGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZP
YjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJCnZlUktkUFZ4WGVGNjB2V2RtN09id3Uy
bzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0IKWjdY
bkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52
bmwrRjMwTi9JLzlrLzNyLwowUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFC
aktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwCkRvVlFmdWpXMEFkaDVtR0x3MzRN
SjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXEK
UE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5
RjF3ZWFIT3d2U0ZweGFwTGhJcwpPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5J
aS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1CmhDZXBrTHhNRFV6ZG16cWVG
cHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3
T1EKckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4v
L3RFc0lTNFpLMnBZWkxWeTBkV09hOQpyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2
dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkClQxZ3ZXZCsxWWZxR25S
cytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBh
cWwrYVgKRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFT
a1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0Nwp2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0
Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTClBWUlNqOVlyNjBj
T3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2Nk
TDJwQ212S2EKUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxU
azJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTwozMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0
ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxCmUyYjM2UnVl
Tjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5
RUR0UWRsRDNZZlYKUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdE
WWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aQovc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnls
NU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4CklIOG8v
Mmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93
QUFnT2tBQUhVd0FBRHEKWUFBQU9wZ0FBQmR2a2wvRlJnQUFBSXhKUkVGVWVOclVrK0VKd2pBVWhD
L1MvNDVRTjdBYnhBMTBBMGZvQ2gzRlRUcENYY1VKUHY4OAo1QkY1S1NRZ2VCQzRKSGVYaENNSlVB
OE82a1IzZ0lEUENQYnZRQTQ5dFFBejB4VGd6QUFaR0lGek5ZQVlHWmlOWDVzQzdHU0ExWHQrClZ5
TXdHbjM2OWFIUUxZN2ZKRTF1ZnBMMEtEVFZGbzdBdGxkaitJU1Uwa3ZTcGJ6eWwrNy9QOU43QUdH
UjlwdkJYSSs1QUFBQUFFbEYKVGtTdVFtQ0MKCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3By
b2ovZnNWaWRlb0V4aXRGdWxsc2NyZWVuLnBuZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkNhbm5vdCBkaXNwbGF5OiBm
aWxlIG1hcmtlZCBhcyBhIGJpbmFyeSB0eXBlLgpzdm46bWltZS10eXBlID0gYXBwbGljYXRpb24v
b2N0ZXQtc3RyZWFtCgppVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85
aEFBQUFDWEJJV1hNQUFBdUpBQUFMaVFFM3ljdXRBQUFLClQybERRMUJRYUc5MGIzTm9iM0FnU1VO
RElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVUKa1NZ
cUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3
NFh1amE5YTg5K2JOL3JYWApQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1
UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCCmVOTUxDQURBVFp2QU1CeUgvdy9x
UXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXQK
QUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1T
OFE1QU5ndEFEQkpWMlpJQUxDMwpBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pB
QlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYCkxoNG96a2tYS3hRMllRSmht
a0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1
UCsKNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9P
bmFWL053K0g0OFBFV2hrTG5aMmVYawo1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRM
N2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkCjB5TEVTV0s1V0NvVTQx
RVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3lj
UVdIVEEKNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxU
S3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QQpCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhK
Z0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoCkNKN0JLTHlCQ1FS
QnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJ
SGZJOWNnSTUKaDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4
bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84KwpROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5q
eTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNCldFN1lTS2dn
SENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVO
eVFTaVVNeUo3bVEKQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5
SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJbwpVc3BxU2hubEVPVTA1UVpsbURKQlZhT2FV
dDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwCnIraDB1
aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0
c1p4MVF3TnpIcm1PZVoKRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0Vjgx
WExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYgpVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Z
a0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZCi9S
MjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZ
MFRMa3haVnhycXBhWGxsaXIKU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQv
T0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dQpwKzZZbnI1ZWdKNU1iNmZlZWIz
bitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZo
CmxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1t
S2FZN1REdE14ODNNemFMTjFwazEKbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJh
cGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsTwprMDZybnRabnc3RHh0c20y
cWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStj
N1J5CkZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVj
NFB6aUl1SlM0TExMcGMrTHBzYnh0M0kKdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3
b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQgpaN1huSXk5akw1Rlhy
ZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kv
OWsvM3IvCjBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0
S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXAKRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0
NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cQpQTm8zdWpTNlA4
WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZT
RnB4YXBMaElzCk9wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVO
Y0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzUKaENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRx
OU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUQpyQVZaTFFx
MlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0Wksy
cFlaTFZ5MGRXT2E5CnJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBt
ZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWQKVDFndldkKzFZZnFHblJzK0ZZbUtyaFRi
RjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWApEbTRO
MmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3
dExkdFdIWCtHN1I3aHQ3CnZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2Nkpx
dW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1MKUFZSU2o5WXI2MGNPeHgrKy9wM3Zk
eTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYQpS
cHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxa
MTlmaTc1M0dEYm9yWjc1MlBPCjMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3
aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjEKZTJiMzZSdWVOODdkOUwxNThS
Yi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lm
VgpQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1Ru
aVAzTDk2ZnluUTg5a3p5YWVGLzZpCi9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2Vy
QTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjgKSUg4by8yajVzZlZUMEtm
N2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3
QUFEcQpZQUFBT3BnQUFCZHZrbC9GUmdBQUFLZEpSRUZVZU5xa2s5RU53akFNUko4ai9zTUlqTkFO
eWdoc2dOaUVFZGlnM2FUZElOa0VtT0Q0CklKVktCTWh0NzhlU3JieEk1N05KWXBNa0piMlZKTVZa
Lyt3RnpKVWtSVW1kcE1FTEdDckl2VlFYSUFBbklNOTYreVVXQkRON0FrZmcKc2NiRFVPcHQ2YytU
ZHNYdEF6QldzK3dCbU1Qa0NEUS94dG16cFZiZjFYblgzUDU3SEZZR3VKbFN1eG9BakpMaUVrQmZt
ZFlBVnkrZwpON05MQ2R5SDg3YjFuRjhEQUwxOGw0aEI4RCsvQUFBQUFFbEZUa1N1UW1DQwoKSW5k
ZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9mc1ZpZGVvUGF1c2UucG5nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
Q2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5
cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFC
a0FBQUFaQ0FZQUFBREU2WVZqQUFBQUNYQklXWE1BQUF1SkFBQUxpUUUzeWN1dEFBQUsKVDJsRFEx
QlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0
dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElv
SzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1ZXM4NTJ6endmQUNBeVdTRE5STllB
TXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUIKZU5N
TENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pU
QUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3
QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzCkFNRE9FQXV5QUFnTUFEQlJpSVVw
QUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFgK
TGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09O
bzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9Y
Z3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrCjVOaEt4RUpiWWNwWGZmNW53
bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8v
d2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNH
bytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pR
Q0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBCkJoekJCZHpCQy94Z05v
UkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGox
d0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJS
UklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExW
RHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrClE4Y3d3T2dZQnpQ
RWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMEln
WVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJ
TENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9q
azhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvClVzcHFTaG5s
RU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3Rv
cFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJH
QWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZH
eW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iClUyZXBP
NmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdU
WEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktL
ZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpTS3RScTBmcnZUYXU3YWVkcHIxRnUx
bjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1CnAr
NllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3
ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZ
bUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMQptejB4MXpMbm0rZWIxNXZmdDJC
YWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xP
CmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJO
L1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBM
S2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSQp2ZVJLZFBWeFhlRjYwdldk
bTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBR
MCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5
TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJa
ZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cApEb1ZRZnVqVzBBZGg1
bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05T
bytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMr
TjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0Nu
bkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNQpoQ2Vwa0x4TURV
emRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4
ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1
UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlx
MkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZApUMWd2V2Qr
MVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJl
TFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZK
enMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZO
MVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzUwpQVlJT
ajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgw
eDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5
V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8KMzJvUGIrKzZFSFRoMGtYL2krYzd2
RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMQpl
MmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3Mlhjbjdx
MjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZ
K1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkKL3N1dUZ4WXZmdmpWNjlmTzBa
alJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtS
OApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlD
REFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmtsL0ZSZ0FBQUR0SlJFRlVlTnJzelNF
T0FDQVF4TUNGajkvVGk4Y2NCb0pvZlRNQlFsOWxDNmlETDBCbUhpUWkKSWlJaUlpSWk4amN5Z092
SUFnQUEvLzhEQUpSQVV0eDVkV045QUFBQUFFbEZUa1N1UW1DQwoKSW5kZXg6IFdlYktpdC93aW4v
V2ViS2l0LnZjcHJvai9mc1ZpZGVvUGxheS5wbmcKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpDYW5ub3QgZGlzcGxheTog
ZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9u
L29jdGV0LXN0cmVhbQoKaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJrQUFBQVpDQVlBQUFERTZZ
VmpBQUFBQ1hCSVdYTUFBQXVKQUFBTGlRRTN5Y3V0QUFBSwpUMmxEUTFCUWFHOTBiM05vYjNBZ1NV
TkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVCmtT
WXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNy
NzRYdWphOWE4OStiTi9yWFgKUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVR
dVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQgplTk1MQ0FEQVRadkFNQnlIL3cv
cVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0
CkFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJt
UzhRNUFOZ3RBREJKVjJaSUFMQzMKQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNa
QUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWApMaDRvemtrWEt4UTJZUUpo
bWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZ
dVArCjVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFv
T25hVi9OdytINDhQRVdoa0xuWjJlWGsKNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0
TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZAoweUxFU1dLNVdDb1U0
MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5
Y1FXSFRBCjR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xs
VEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekEKQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhI
SmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waApDSjdCS0x5QkNR
UkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZW
SUhmSTljZ0k1CmgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhR
eG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCsKUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pO
ank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTQpXRTdZU0tn
Z0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBF
TnlRU2lVTXlKN21RCkFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0Fy
eUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW8KVXNwcVNobmxFT1UwNVFabG1ESkJWYU9h
VXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcApyK2gw
dWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVow
NHNaeDFRd056SHJtT2VaCkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4
MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWIKVTJlcE82aUhxbWVvYjFRL3BINVov
WWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WQov
UjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2
WTBUTGt4WlZ4cnFwYVhsbGlyClNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0
L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXUKcCs2WW5yNWVnSjVNYjZmZWVi
M24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZW
aApsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJt
bUthWTdURHRNeDgzTXphTE4xcGsxCm16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VS
YXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE8KazA2cm50Wm53N0R4dHNt
MnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDEr
YzdSeQpGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1
YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJCnZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVw
N29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0IKWjdYbkl5OWpMNUZY
cmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9J
LzlrLzNyLwowUUNuZ0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJq
NEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwCkRvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQ
NDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXEKUE5vM3VqUzZQ
OFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2
U0ZweGFwTGhJcwpPcFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJF
TmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1CmhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBU
cTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1EKckFWWkxR
cTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpL
MnBZWkxWeTBkV09hOQpyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIw
bWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMxKzFkClQxZ3ZXZCsxWWZxR25ScytGWW1LcmhU
YkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVgKRG00
TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEy
N3RMZHRXSFgrRzdSN2h0Nwp2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZK
cXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3blUxUjNTClBWUlNqOVlyNjBjT3h4KysvcDN2
ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2EK
UnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRs
WjE5Zmk3NTNHRGJvclo3NTJQTwozMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRW
N2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxCmUyYjM2UnVlTjg3ZDlMMTU4
UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZ
ZlYKUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09U
bmlQM0w5NmZ5blE4OWt6eWFlRi82aQovc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9l
ckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4CklIOG8vMmo1c2ZWVDBL
ZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhV
d0FBRHEKWUFBQU9wZ0FBQmR2a2wvRlJnQUFBSVZKUkVGVWVOclUxZEVOZ0NBTWhPSHFBbzdvS0k3
S0NJN3crMlJFSWdab3o4UWJvRjlTNERCZwpCelpnTVVFQU02NUlzQktSWURVa3gxWTFjaVo1c0Zi
RWhmVWlROWdvMG9WNWtTWXNDbm5Gb3BGSFRJWGNNTUJtK3lKL1c1ZjA0S1ZYCldQb1lwYlVpTFVo
cDFTZmxweFV5dklhRURpOFJ5ZkFjbVFCNWRSMEFBQUQvL3dNQWkwQzcvSW9QWFNzQUFBQUFTVVZP
Uks1Q1lJST0KCg==
</data>
<flag name="review"
          id="27434"
          type_id="1"
          status="-"
          setter="simon.fraser"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45851</attachid>
            <date>2010-01-04 18:07:30 -0800</date>
            <delta_ts>2010-01-05 15:00:01 -0800</delta_ts>
            <desc>Replacement patch</desc>
            <filename>31318.patch</filename>
            <type>text/plain</type>
            <size>68498</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1Mjc2OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMTAtMDEtMDQgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIElt
cGxlbWVudCBmdWxsLXNjcmVlbiB2aWRlbyBmb3IgV2luZG93cworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEzMTgKKyAgICAgICAgCisgICAgICAgIFRo
aXMgaXMgbW9zdGx5IHN1cHBvcnQgbG9naWMgZm9yIHRha2luZyB2aWRlbworICAgICAgICBpbnRv
IGFuZCBvdXQgb2YgZnVsbC1zY3JlZW4uIEl0IGFsc28gY29udGFpbnMgdGhlCisgICAgICAgIFFU
TW92aWVXaW4gcGllY2Ugd2hpY2ggYWRkcyBzdXBwb3J0IGZvciB0aGUgYWN0dWFsCisgICAgICAg
IGZ1bGwtc2NyZWVuIHdpbmRvdyBpdHNlbGYuIEV2ZW50cyBmcm9tIHRoZSB3aW5kb3cKKyAgICAg
ICAgYXJlIHNlbnQgdG8gdGhlIEZ1bGxzY3JlZW5WaWRlb3NDb250cm9sbGVyIGZvciBoYW5kbGlu
Zy4KKworICAgICAgICAqIGxvYWRlci9GcmFtZUxvYWRlci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpGcmFtZUxvYWRlcjo6YWRkRGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L01lZGlhUGxheWVyUHJpdmF0ZVF1aWNrVGltZVdpbi5oOgorICAgICAgICAoV2ViQ29yZTo6TWVk
aWFQbGF5ZXJQcml2YXRlOjpzdXBwb3J0c0Z1bGxzY3JlZW4pOgorICAgICAgICAoV2ViQ29yZTo6
TWVkaWFQbGF5ZXJQcml2YXRlOjpwbGF0Zm9ybU1lZGlhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW4vUVRNb3ZpZVdpbi5jcHA6CisgICAgICAgIChRVE1vdmllV2luUHJpdmF0ZTo6
UVRNb3ZpZVdpblByaXZhdGUpOgorICAgICAgICAoUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1aWNr
VGltZSk6CisgICAgICAgIChRVE1vdmllV2luOjpfaGFuZGxlTWVzc2FnZXMpOgorICAgICAgICAo
UVRNb3ZpZVdpbjo6ZW50ZXJGdWxsc2NyZWVuKToKKyAgICAgICAgKFFUTW92aWVXaW46OmV4aXRG
dWxsc2NyZWVuKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vUVRNb3ZpZVdpbi5o
OgorCiAyMDEwLTAxLTA0ICBLZXZpbiBPbGxpdmllciAgPGtldmlub0B0aGVvbGxpdmllcnMuY29t
PgogCiAgICAgICAgIFt3eF0gQnVpbGQgZml4LCBhZGQgYSBjb3VwbGUgaW5jbHVkZSBkaXJzIHRv
IHRoZSBidWlsZC4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL01lZGlhUGxh
eWVyUHJpdmF0ZVF1aWNrVGltZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmNwcAkocmV2aXNp
b24gNTI3NjgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXllclBy
aXZhdGVRdWlja1RpbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04OCw2ICs4OCwxOCBAQCBN
ZWRpYVBsYXllclByaXZhdGU6On5NZWRpYVBsYXllclByaXZhdGUoCiB7CiB9CiAKK2Jvb2wgTWVk
aWFQbGF5ZXJQcml2YXRlOjpzdXBwb3J0c0Z1bGxzY3JlZW4oKSBjb25zdAoreworICAgIHJldHVy
biB0cnVlOworfQorCitQbGF0Zm9ybU1lZGlhIE1lZGlhUGxheWVyUHJpdmF0ZTo6cGxhdGZvcm1N
ZWRpYSgpIGNvbnN0Cit7CisgICAgUGxhdGZvcm1NZWRpYSBwOworICAgIHAucXRNb3ZpZSA9IHJl
aW50ZXJwcmV0X2Nhc3Q8UVRNb3ZpZSo+KG1fcXRNb3ZpZS5nZXQoKSk7CisgICAgcmV0dXJuIHA7
Cit9CisKIGNsYXNzIFRhc2tUaW1lciA6IFRpbWVyQmFzZSB7CiBwdWJsaWM6CiAgICAgc3RhdGlj
IHZvaWQgaW5pdGlhbGl6ZSgpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
TWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgJKHJl
dmlzaW9uIDUyNzY4KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5
ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTUzLDYgKzUzLDkgQEAg
cHVibGljOgogcHJpdmF0ZToKICAgICBNZWRpYVBsYXllclByaXZhdGUoTWVkaWFQbGF5ZXIqKTsK
IAorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Z1bGxzY3JlZW4oKSBjb25zdDsKKyAgICB2aXJ0
dWFsIFBsYXRmb3JtTWVkaWEgcGxhdGZvcm1NZWRpYSgpIGNvbnN0OworCiAgICAgSW50U2l6ZSBu
YXR1cmFsU2l6ZSgpIGNvbnN0OwogICAgIGJvb2wgaGFzVmlkZW8oKSBjb25zdDsKICAgICBib29s
IGhhc0F1ZGlvKCkgY29uc3Q7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9R
VE1vdmllV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9RVE1vdmllV2luLmNwcAkocmV2aXNpb24gNTI3NjgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsMTggKzI0LDE1
IEBACiAgKi8KICNpbmNsdWRlICJjb25maWcuaCIKIAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQog
I2luY2x1ZGUgIlFUTW92aWVXaW4uaCIKIAogLy8gUHV0IE1vdmllcy5oIGZpcnN0IHNvIGJ1aWxk
IGZhaWx1cmVzIGhlcmUgcG9pbnQgY2xlYXJseSB0byBRdWlja1RpbWUKICNpbmNsdWRlIDxNb3Zp
ZXMuaD4KLSNpbmNsdWRlIDxRdWlja1RpbWVDb21wb25lbnRzLmg+Ci0jaW5jbHVkZSA8R1hNYXRo
Lmg+Ci0jaW5jbHVkZSA8UVRNTC5oPgogCiAjaW5jbHVkZSAiUVRNb3ZpZVdpblRpbWVyLmgiCi0K
KyNpbmNsdWRlIDxHWE1hdGguaD4KKyNpbmNsdWRlIDxRVE1MLmg+CisjaW5jbHVkZSA8UXVpY2tU
aW1lQ29tcG9uZW50cy5oPgogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CiAjaW5jbHVkZSA8
d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KQEAgLTEzMCw2ICsx
MjcsMTEgQEAgcHVibGljOgogI2lmICFBU1NFUlRfRElTQUJMRUQKICAgICBib29sIG1fc2NhbGVD
YWNoZWQ7CiAjZW5kaWYKKyAgICBXaW5kb3dQdHIgbV9mc1dpbmRvdzsKKyAgICBHV29ybGRQdHIg
bV9mc09yaWdHV29ybGQ7CisgICAgUmVjdCBtX2ZzUmVjdDsKKyAgICBRVE1vdmllV2luRlNDbGll
bnQqIG1fZnNDbGllbnQ7CisgICAgY2hhciogbV9mc1Jlc3RvcmVTdGF0ZTsKIH07CiAKIFFUTW92
aWVXaW5Qcml2YXRlOjpRVE1vdmllV2luUHJpdmF0ZSgpCkBAIC0xNTksMTEgKzE2MSwxNyBAQCBR
VE1vdmllV2luUHJpdmF0ZTo6UVRNb3ZpZVdpblByaXZhdGUoKQogI2lmICFBU1NFUlRfRElTQUJM
RUQKICAgICAsIG1fc2NhbGVDYWNoZWQoZmFsc2UpCiAjZW5kaWYKKyAgICAsIG1fZnNXaW5kb3co
MCkKKyAgICAsIG1fZnNPcmlnR1dvcmxkKDApCisgICAgLCBtX2ZzQ2xpZW50KDApCisgICAgLCBt
X2ZzUmVzdG9yZVN0YXRlKDApCiB7CiB9CiAKIFFUTW92aWVXaW5Qcml2YXRlOjp+UVRNb3ZpZVdp
blByaXZhdGUoKQogeworICAgIEFTU0VSVCghbV9mc1dpbmRvdyk7CisKICAgICBlbmRUYXNrKCk7
CiAgICAgaWYgKG1fZ1dvcmxkKQogICAgICAgICBkZWxldGVHV29ybGQoKTsKQEAgLTM1OSw3ICsz
NjcsNyBAQCB2b2lkIFFUTW92aWVXaW5Qcml2YXRlOjpjcmVhdGVHV29ybGQoKQogICAgIGJvdW5k
cy5sZWZ0ID0gMDsgCiAgICAgYm91bmRzLnJpZ2h0ID0gbV9nV29ybGRXaWR0aDsKICAgICBib3Vu
ZHMuYm90dG9tID0gbV9nV29ybGRIZWlnaHQ7Ci0gICAgT1NFcnIgZXJyID0gUVROZXdHV29ybGQo
Jm1fZ1dvcmxkLCBrMzJCR1JBUGl4ZWxGb3JtYXQsICZib3VuZHMsIE5VTEwsIE5VTEwsIE5VTEwp
OyAKKyAgICBPU0VyciBlcnIgPSBRVE5ld0dXb3JsZCgmbV9nV29ybGQsIGszMkJHUkFQaXhlbEZv
cm1hdCwgJmJvdW5kcywgMCwgMCwgMCk7IAogICAgIGlmIChlcnIpIAogICAgICAgICByZXR1cm47
CiAgICAgR2V0TW92aWVHV29ybGQobV9tb3ZpZSwgJm1fc2F2ZWRHV29ybGQsIDApOwpAQCAtNzI5
LDcgKzczNyw3IEBAIHZvaWQgUVRNb3ZpZVdpbjo6bG9hZChDRlVSTFJlZiB1cmwsIGJvb2wKICAg
ICBtb3ZpZVByb3BDb3VudCsrOyAKIAogICAgIEFTU0VSVChtb3ZpZVByb3BDb3VudCA8PSBzaXpl
b2YobW92aWVQcm9wcykvc2l6ZW9mKG1vdmllUHJvcHNbMF0pKTsKLSAgICBtX3ByaXZhdGUtPm1f
bG9hZEVycm9yID0gTmV3TW92aWVGcm9tUHJvcGVydGllcyhtb3ZpZVByb3BDb3VudCwgbW92aWVQ
cm9wcywgMCwgTlVMTCwgJm1fcHJpdmF0ZS0+bV9tb3ZpZSk7CisgICAgbV9wcml2YXRlLT5tX2xv
YWRFcnJvciA9IE5ld01vdmllRnJvbVByb3BlcnRpZXMobW92aWVQcm9wQ291bnQsIG1vdmllUHJv
cHMsIDAsIDAsICZtX3ByaXZhdGUtPm1fbW92aWUpOwogCiBlbmQ6CiAgICAgbV9wcml2YXRlLT5z
dGFydFRhc2soKTsKQEAgLTk1Myw3ICs5NjEsNyBAQCBzdGF0aWMgdm9pZCBpbml0aWFsaXplU3Vw
cG9ydGVkVHlwZXMoKSAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIGlm
ICghKGluZm9DRC5jb21wb25lbnRGbGFncyAmIGhhc01vdmllSW1wb3J0TUlNRUxpc3QpKQogICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgUVRBdG9tQ29udGFpbmVyIG1pbWVM
aXN0ID0gTlVMTDsKKyAgICAgICAgICAgIFFUQXRvbUNvbnRhaW5lciBtaW1lTGlzdCA9IDA7CiAg
ICAgICAgICAgICBlcnIgPSBNb3ZpZUltcG9ydEdldE1JTUVUeXBlTGlzdCgoQ29tcG9uZW50SW5z
dGFuY2UpY29tcCwgJm1pbWVMaXN0KTsKICAgICAgICAgICAgIGlmIChlcnIgfHwgIW1pbWVMaXN0
KQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtOTYyLDcgKzk3MCw3IEBAIHN0YXRpYyB2
b2lkIGluaXRpYWxpemVTdXBwb3J0ZWRUeXBlcygpIAogICAgICAgICAgICAgUVRMb2NrQ29udGFp
bmVyKG1pbWVMaXN0KTsKICAgICAgICAgICAgIGludCB0eXBlQ291bnQgPSBRVENvdW50Q2hpbGRy
ZW5PZlR5cGUobWltZUxpc3QsIGtQYXJlbnRBdG9tSXNDb250YWluZXIsIGtNaW1lSW5mb01pbWVU
eXBlVGFnKTsKICAgICAgICAgICAgIGZvciAoaW50IHR5cGVJbmRleCA9IDE7IHR5cGVJbmRleCA8
PSB0eXBlQ291bnQ7IHR5cGVJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgUVRBdG9tIG1pbWVU
YWcgPSBRVEZpbmRDaGlsZEJ5SW5kZXgobWltZUxpc3QsIDAsIGtNaW1lSW5mb01pbWVUeXBlVGFn
LCB0eXBlSW5kZXgsIE5VTEwpOworICAgICAgICAgICAgICAgIFFUQXRvbSBtaW1lVGFnID0gUVRG
aW5kQ2hpbGRCeUluZGV4KG1pbWVMaXN0LCAwLCBrTWltZUluZm9NaW1lVHlwZVRhZywgdHlwZUlu
ZGV4LCAwKTsKICAgICAgICAgICAgICAgICBpZiAoIW1pbWVUYWcpCiAgICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGNoYXIqIGF0b21EYXRhOwpAQCAtOTgwLDcg
Kzk4OCw3IEBAIHN0YXRpYyB2b2lkIGluaXRpYWxpemVTdXBwb3J0ZWRUeXBlcygpIAogICAgICAg
ICAgICAgICAgIGlmIChzdHJuY21wKHR5cGVCdWZmZXIsICJhdWRpby8iLCA2KSAmJiBzdHJuY21w
KHR5cGVCdWZmZXIsICJ2aWRlby8iLCA2KSkKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7
CiAKLSAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBjZk1pbWVUeXBlID0gQ0ZTdHJpbmdDcmVh
dGVXaXRoQ1N0cmluZyhOVUxMLCB0eXBlQnVmZmVyLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwor
ICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIGNmTWltZVR5cGUgPSBDRlN0cmluZ0NyZWF0ZVdp
dGhDU3RyaW5nKDAsIHR5cGVCdWZmZXIsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7CiAgICAgICAg
ICAgICAgICAgaWYgKCFjZk1pbWVUeXBlKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
IApAQCAtMTA0MCw3ICsxMDQ4LDcgQEAgYm9vbCBRVE1vdmllV2luOjppbml0aWFsaXplUXVpY2tU
aW1lKCkgCiAgICAgaWYgKCFpbml0aWFsaXplZCkgewogICAgICAgICBpbml0aWFsaXplZCA9IHRy
dWU7CiAgICAgICAgIC8vIEluaXRpYWxpemUgYW5kIGNoZWNrIFF1aWNrVGltZSB2ZXJzaW9uCi0g
ICAgICAgIE9TRXJyIHJlc3VsdCA9IEluaXRpYWxpemVRVE1MKDApOworICAgICAgICBPU0VyciBy
ZXN1bHQgPSBJbml0aWFsaXplUVRNTChrSW5pdGlhbGl6ZVFUTUxFbmFibGVEb3VibGVCdWZmZXJl
ZFN1cmZhY2UpOwogICAgICAgICBpZiAocmVzdWx0ID09IG5vRXJyKQogICAgICAgICAgICAgcmVz
dWx0ID0gR2VzdGFsdChnZXN0YWx0UXVpY2tUaW1lLCAmcXVpY2tUaW1lVmVyc2lvbik7CiAgICAg
ICAgIGlmIChyZXN1bHQgIT0gbm9FcnIpIHsKQEAgLTEwNTgsMTUgKzEwNjYsNzQgQEAgYm9vbCBR
VE1vdmllV2luOjppbml0aWFsaXplUXVpY2tUaW1lKCkgCiAgICAgcmV0dXJuIGluaXRpYWxpemF0
aW9uU3VjY2VlZGVkOwogfQogCitMUkVTVUxUIFFUTW92aWVXaW46OmZzV25kUHJvYyhIV05EIHdu
ZCwgVUlOVCBtZXNzYWdlLCBVSU5UIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgUVRNb3Zp
ZVdpbiogbW92aWUgPSByZWludGVycHJldF9jYXN0PFFUTW92aWVXaW4qPihHZXRXaW5kb3dMb25n
UHRyKHduZCwgR1dMX1VTRVJEQVRBKSk7CisgICAgcmV0dXJuIG1vdmllLT5tX3ByaXZhdGUtPm1f
ZnNDbGllbnQtPmZ1bGxzY3JlZW5DbGllbnRXbmRQcm9jKHduZCwgbWVzc2FnZSwgd1BhcmFtLCBs
UGFyYW0pOworfQorCitIV05EIFFUTW92aWVXaW46OmVudGVyRnVsbHNjcmVlbihRVE1vdmllV2lu
RlNDbGllbnQqIGNsaWVudCkKK3sKKyAgICBtX3ByaXZhdGUtPm1fZnNDbGllbnQgPSBjbGllbnQ7
CisgICAgCisgICAgQmVnaW5GdWxsU2NyZWVuKCZtX3ByaXZhdGUtPm1fZnNSZXN0b3JlU3RhdGUs
IDAsIDAsIDAsICZtX3ByaXZhdGUtPm1fZnNXaW5kb3csIDAsIGZ1bGxTY3JlZW5BbGxvd0V2ZW50
cyk7IAorICAgIFFUTUxTZXRXaW5kb3dXbmRQcm9jKG1fcHJpdmF0ZS0+bV9mc1dpbmRvdywgZnNX
bmRQcm9jKTsKKyAgICBDcmVhdGVQb3J0QXNzb2NpYXRpb24oR2V0UG9ydE5hdGl2ZVdpbmRvdyht
X3ByaXZhdGUtPm1fZnNXaW5kb3cpLCAwLCAwTCk7CisKKyAgICBHZXRNb3ZpZUJveChtX3ByaXZh
dGUtPm1fbW92aWUsICZtX3ByaXZhdGUtPm1fZnNSZWN0KTsKKyAgICBHZXRNb3ZpZUdXb3JsZCht
X3ByaXZhdGUtPm1fbW92aWUsICZtX3ByaXZhdGUtPm1fZnNPcmlnR1dvcmxkLCAwKTsKKyAgICBT
ZXRNb3ZpZUdXb3JsZChtX3ByaXZhdGUtPm1fbW92aWUsIChDR3JhZlB0ciltX3ByaXZhdGUtPm1f
ZnNXaW5kb3csIEdldEdXb3JsZERldmljZSgoQ0dyYWZQdHIpbV9wcml2YXRlLT5tX2ZzV2luZG93
KSk7CisKKyAgICAvLyBTZXQgdGhlIHNpemUgb2YgdGhlIGJveCB0byBwcmVzZXJ2ZSBhc3BlY3Qg
cmF0aW8KKyAgICBSZWN0IHJlY3QgPSBtX3ByaXZhdGUtPm1fZnNXaW5kb3ctPnBvcnRSZWN0Owor
CisgICAgZmxvYXQgbW92aWVSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PihtX3ByaXZhdGUtPm1f
d2lkdGgpIC8gbV9wcml2YXRlLT5tX2hlaWdodDsKKyAgICBpbnQgd2luZG93V2lkdGggPSAgcmVj
dC5yaWdodCAtIHJlY3QubGVmdDsKKyAgICBpbnQgd2luZG93SGVpZ2h0ID0gcmVjdC5ib3R0b20g
LSByZWN0LnRvcDsKKyAgICBmbG9hdCB3aW5kb3dSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0Pih3
aW5kb3dXaWR0aCkgLyB3aW5kb3dIZWlnaHQ7CisgICAgaW50IGFjdHVhbFdpZHRoID0gKHdpbmRv
d1JhdGlvID4gbW92aWVSYXRpbykgPyAod2luZG93SGVpZ2h0ICogbW92aWVSYXRpbykgOiB3aW5k
b3dXaWR0aDsKKyAgICBpbnQgYWN0dWFsSGVpZ2h0ID0gKHdpbmRvd1JhdGlvIDwgbW92aWVSYXRp
bykgPyAod2luZG93V2lkdGggLyBtb3ZpZVJhdGlvKSA6IHdpbmRvd0hlaWdodDsKKyAgICBpbnQg
b2Zmc2V0WCA9ICh3aW5kb3dXaWR0aCAtIGFjdHVhbFdpZHRoKSAvIDI7CisgICAgaW50IG9mZnNl
dFkgPSAod2luZG93SGVpZ2h0IC0gYWN0dWFsSGVpZ2h0KSAvIDI7CisKKyAgICByZWN0LmxlZnQg
PSBvZmZzZXRYOworICAgIHJlY3QucmlnaHQgPSBvZmZzZXRYICsgYWN0dWFsV2lkdGg7CisgICAg
cmVjdC50b3AgPSBvZmZzZXRZOworICAgIHJlY3QuYm90dG9tID0gb2Zmc2V0WSArIGFjdHVhbEhl
aWdodDsKKworICAgIFNldE1vdmllQm94KG1fcHJpdmF0ZS0+bV9tb3ZpZSwgJnJlY3QpOworICAg
IFNob3dIaWRlVGFza0Jhcih0cnVlKTsKKworICAgIC8vIFNldCB0aGUgJ3RoaXMnIHBvaW50ZXIg
b24gdGhlIEhXTkQKKyAgICBIV05EIHduZCA9IHN0YXRpY19jYXN0PEhXTkQ+KEdldFBvcnROYXRp
dmVXaW5kb3cobV9wcml2YXRlLT5tX2ZzV2luZG93KSk7CisgICAgU2V0V2luZG93TG9uZ1B0cih3
bmQsIEdXTF9VU0VSREFUQSwgKExPTkcpdGhpcyk7CisKKyAgICByZXR1cm4gd25kOworfQorCit2
b2lkIFFUTW92aWVXaW46OmV4aXRGdWxsc2NyZWVuKCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZS0+
bV9mc1dpbmRvdykKKyAgICAgICAgcmV0dXJuOworCisgICAgSFdORCB3bmQgPSAoSFdORCkgR2V0
UG9ydE5hdGl2ZVdpbmRvdyhtX3ByaXZhdGUtPm1fZnNXaW5kb3cpOworICAgIFNldFdpbmRvd0xv
bmdQdHIod25kLCBHV0xfVVNFUkRBVEEsIDApOworICAgIERlc3Ryb3lQb3J0QXNzb2NpYXRpb24o
KENHcmFmUHRyKSBtX3ByaXZhdGUtPm1fZnNXaW5kb3cpOworICAgIFNldE1vdmllR1dvcmxkKG1f
cHJpdmF0ZS0+bV9tb3ZpZSwgbV9wcml2YXRlLT5tX2ZzT3JpZ0dXb3JsZCwgMCk7CisgICAgRW5k
RnVsbFNjcmVlbihtX3ByaXZhdGUtPm1fZnNSZXN0b3JlU3RhdGUsIDBMKTsKKyAgICBTZXRNb3Zp
ZUJveChtX3ByaXZhdGUtPm1fbW92aWUsICZtX3ByaXZhdGUtPm1fZnNSZWN0KTsKKyAgICBtX3By
aXZhdGUtPm1fZnNXaW5kb3cgPSAwOworfQorCiBCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5D
RSBoaW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHB2UmVzZXJ2ZWQpCiB7CiAgICAg
c3dpdGNoIChmZHdSZWFzb24pIHsKLSAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6Ci0g
ICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6
Ci0gICAgICAgIGNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6Ci0gICAgICAgIGNhc2UgRExMX1RIUkVB
RF9ERVRBQ0g6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgY2FzZSBETExfUFJPQ0VT
U19BVFRBQ0g6CisgICAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRExMX1BST0NFU1NfREVU
QUNIOgorICAgIGNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6CisgICAgY2FzZSBETExfVEhSRUFEX0RF
VEFDSDoKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKICAgICByZXR1cm4gRkFMU0U7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9RVE1vdmllV2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy93aW4vUVRNb3ZpZVdpbi5oCShyZXZpc2lvbiA1Mjc2OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvd2luL1FUTW92aWVXaW4uaAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBA
QAogI2RlZmluZSBRVE1vdmllV2luX2gKIAogI2luY2x1ZGUgPFVuaWNvZGUuaD4KKyNpbmNsdWRl
IDx3aW5kb3dzLmg+CiAKICNpZmRlZiBRVE1PVklFV0lOX0VYUE9SVFMKICNkZWZpbmUgUVRNT1ZJ
RVdJTl9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCkBAIC00NSw2ICs0NiwxMSBAQCBwdWJsaWM6
CiAgICAgdmlydHVhbCB2b2lkIG1vdmllTmV3SW1hZ2VBdmFpbGFibGUoUVRNb3ZpZVdpbiopID0g
MDsKIH07CiAKK2NsYXNzIFFUTW92aWVXaW5GU0NsaWVudCB7CitwdWJsaWM6CisgICAgdmlydHVh
bCBMUkVTVUxUIGZ1bGxzY3JlZW5DbGllbnRXbmRQcm9jKEhXTkQsIFVJTlQgbWVzc2FnZSwgVUlO
VCB3UGFyYW0sIExPTkcgbFBhcmFtKSA9IDA7Cit9OworCiBlbnVtIHsKICAgICBRVE1vdmllTG9h
ZFN0YXRlRXJyb3IgPSAtMUwsCiAgICAgUVRNb3ZpZUxvYWRTdGF0ZUxvYWRlZCAgPSAyMDAwTCwK
QEAgLTEwNCw4ICsxMTAsMTMgQEAgcHVibGljOgogICAgIHN0YXRpYyB1bnNpZ25lZCBjb3VudFN1
cHBvcnRlZFR5cGVzKCk7CiAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkVHlwZSh1bnNpZ25l
ZCBpbmRleCwgY29uc3QgVUNoYXIqJiBzdHIsIHVuc2lnbmVkJiBsZW4pOwogCisgICAgLy8gUmV0
dXJucyB0aGUgZnVsbC1zY3JlZW4gd2luZG93IGNyZWF0ZWQKKyAgICBIV05EIGVudGVyRnVsbHNj
cmVlbihRVE1vdmllV2luRlNDbGllbnQqKTsKKyAgICB2b2lkIGV4aXRGdWxsc2NyZWVuKCk7CisK
IHByaXZhdGU6CiAgICAgdm9pZCBsb2FkKENGVVJMUmVmLCBib29sIHByZXNlcnZlc1BpdGNoKTsK
KyAgICBzdGF0aWMgTFJFU1VMVCBmc1duZFByb2MoSFdORCwgVUlOVCBtZXNzYWdlLCBVSU5UIHdQ
YXJhbSwgTE9ORyBsUGFyYW0pOwogCiAgICAgUVRNb3ZpZVdpblByaXZhdGUqIG1fcHJpdmF0ZTsK
ICAgICBib29sIG1fZGlzYWJsZWQ7CkluZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gNTI3NjkpCisrKyBXZWJLaXQv
d2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ0IEBACisyMDEwLTAxLTA0
ICBDaHJpcyBNYXJyaW4gIDxjbWFycmluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbXBsZW1lbnQgZnVsbC1zY3JlZW4gdmlkZW8g
Zm9yIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTMxMzE4CisgICAgICAgIAorICAgICAgICBUaGlzIGFkZHMgYSBmdWxsLXNjcmVlbiBjb250
cm9sbGVyLCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyLCAKKyAgICAgICAgd2hpY2ggbWFuYWdl
cyBnb2luZyBpbiBhbmQgb3V0IG9mIGZ1bGwtc2NyZWVuLiBUaGUgYWN1YWwgCisgICAgICAgIGZ1
bGwtc2NyZWVuIHdpbmRvdyBpcyBjcmVhdGVkIGFuZCBtYW5hZ2VkIGJ5IGxvZ2ljIGFkZGVkIAor
ICAgICAgICB0byBRVE1vdmllV2luLiBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyIGFsc28gY3Jl
YXRlcyBhbmQKKyAgICAgICAgbWFuYWdlcyBhIEhVRC4gVGhlIEhVRCByZW5kZXJzIGFuZCBtYW5h
Z2VzIGV2ZW50cyB0bworICAgICAgICBjb250cm9sIHRoZSBwbGF5aW5nIHZpZGVvLiBNb3ZpZSBj
b250cm9sbGVyIGV2ZW50cyBnbyB0byAKKyAgICAgICAgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxl
ciB3aGljaCB0aGVuIHNlbmRzIHRoZW0gdG8gSFRNTE1lZGlhRWxlbWVudCwgCisgICAgICAgIHdo
aWNoIGlzIHBhc3NlZCB0byB0aGUgY29udHJvbGxlciBieSBXZWJWaWV3LCB3aGljaCBnZXRzIHRo
ZSBjYWxsIAorICAgICAgICB0byBnbyBpbnRvIGZ1bGwtc2NyZWVuIG1vZGUgZnJvbSBIVE1MTWVk
aWFFbGVtZW50IHZpYSAKKyAgICAgICAgQ2hyb21lQ2xpZW50LgorICAgICAgICAKKyAgICAgICAg
SSd2ZSBhbHNvIHVwZGF0ZWQgdGhlIGljb25zIHRvIG1ha2UgdGhlbSBwb3NpdGlvbiBjb3JyZWN0
bHkKKyAgICAgICAgaW4gdGhlIEhVRC4KKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L1dlYkNo
cm9tZUNsaWVudC5jcHA6CisgICAgICAgIChXZWJDaHJvbWVDbGllbnQ6OnN1cHBvcnRzRnVsbHNj
cmVlbkZvck5vZGUpOgorICAgICAgICAoV2ViQ2hyb21lQ2xpZW50OjplbnRlckZ1bGxzY3JlZW5G
b3JOb2RlKToKKyAgICAgICAgKFdlYkNocm9tZUNsaWVudDo6ZXhpdEZ1bGxzY3JlZW5Gb3JOb2Rl
KToKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaDoKKyAgICAgICAg
KiBXZWJLaXQudmNwcm9qL1dlYktpdC52Y3Byb2o6CisgICAgICAgICogV2ViS2l0LnZjcHJvai9m
c1ZpZGVvQXVkaW9Wb2x1bWVIaWdoLnBuZzoKKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL2ZzVmlk
ZW9BdWRpb1ZvbHVtZUxvdy5wbmc6CisgICAgICAgICogV2ViS2l0LnZjcHJvai9mc1ZpZGVvRXhp
dEZ1bGxzY3JlZW4ucG5nOgorICAgICAgICAqIFdlYktpdC52Y3Byb2ovZnNWaWRlb1BhdXNlLnBu
ZzoKKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL2ZzVmlkZW9QbGF5LnBuZzoKKyAgICAgICAgKiBX
ZWJLaXRETEwuY3BwOgorICAgICAgICAobG9hZFJlc291cmNlSW50b0J1ZmZlcik6CisgICAgICAg
ICogRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlci5jcHA6IEFkZGVkLgorICAgICAgICAqIEZ1bGxz
Y3JlZW5WaWRlb0NvbnRyb2xsZXIuaDogQWRkZWQuCisgICAgICAgICogV2ViVmlldy5jcHA6Cisg
ICAgICAgIChXZWJWaWV3OjplbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKToKKyAgICAgICAgKFdlYlZp
ZXc6OmV4aXRGdWxsc2NyZWVuKToKKyAgICAgICAgKiBXZWJWaWV3Lmg6CisKIDIwMTAtMDEtMDQg
IEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xs
ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vRnVsbHNjcmVlblZpZGVvQ29udHJvbGxl
ci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xs
ZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmIEVOQUJMRShWSURFTykKKworI2luY2x1ZGUgIkZ1bGxzY3JlZW5W
aWRlb0NvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIldlYktpdERMTC5oIgorI2luY2x1ZGUgPEFw
cGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdlYkNv
cmUvQml0bWFwSW5mby5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRm9udC5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvRm9udFNlbGVjdG9yLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRleHQu
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL1RleHRSdW4uaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0ZW1J
bnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8d2luZG93c3guaD4K
KyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCitzdGF0aWMgY29uc3QgZmxvYXQgdGltZXJJbnRlcnZhbCA9IDAuMDMzOworCisvLyBIVUQg
U2l6ZQorc3RhdGljIGNvbnN0IGludCB3aW5kb3dIZWlnaHQgPSA1OTsKK3N0YXRpYyBjb25zdCBp
bnQgd2luZG93V2lkdGggPSA0Mzg7CisKKy8vIE1hcmdpbnMgYW5kIGJ1dHRvbiBzaXplcworc3Rh
dGljIGNvbnN0IGludCBtYXJnaW4gPSA5Oworc3RhdGljIGNvbnN0IGludCBtYXJnaW5Ub3AgPSA5
Oworc3RhdGljIGNvbnN0IGludCBidXR0b25TaXplID0gMjU7CitzdGF0aWMgY29uc3QgaW50IGJ1
dHRvbk1pbmlTaXplID0gMTY7CitzdGF0aWMgY29uc3QgaW50IHZvbHVtZVNsaWRlcldpZHRoID0g
NTA7CitzdGF0aWMgY29uc3QgaW50IHRpbWVTbGlkZXJXaWR0aCA9IDMxMDsKK3N0YXRpYyBjb25z
dCBpbnQgc2xpZGVySGVpZ2h0ID0gODsKK3N0YXRpYyBjb25zdCBpbnQgdm9sdW1lU2xpZGVyQnV0
dG9uU2l6ZSA9IDEwOworc3RhdGljIGNvbnN0IGludCB0aW1lU2xpZGVyQnV0dG9uU2l6ZSA9IDg7
CitzdGF0aWMgY29uc3QgaW50IHRleHRTaXplID0gMTE7CisKKy8vIEJhY2tncm91bmQgdmFsdWVz
CitzdGF0aWMgY29uc3QgaW50IGJvcmRlclJhZGl1cyA9IDEyOworc3RhdGljIGNvbnN0IGludCBi
b3JkZXJUaGlja25lc3MgPSAyOworCisvLyBDb2xvcnMKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBp
bnQgYmFja2dyb3VuZENvbG9yID0gMHhBMDIwMjAyMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBp
bnQgYm9yZGVyQ29sb3IgPSAweEZGQTBBMEEwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBz
bGlkZXJHdXR0ZXJDb2xvciA9IDB4RkYxNDE0MTQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50
IHNsaWRlckJ1dHRvbkNvbG9yID0gMHhGRjgwODA4MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBp
bnQgdGV4dENvbG9yID0gMHhGRkZGRkZGRjsKKworSFVEQnV0dG9uOjpIVURCdXR0b24oSFVEQnV0
dG9uVHlwZSB0eXBlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgcG9zaXRpb24pCisgICAgOiBI
VURXaWRnZXQoSW50UmVjdChwb3NpdGlvbiwgSW50U2l6ZSgwLCAwKSkpCisgICAgLCBtX3R5cGUo
dHlwZSkKKyAgICAsIG1fc2hvd0FsdEJ1dHRvbihmYWxzZSkKK3sKKyAgICBjb25zdCBjaGFyKiBi
dXR0b25SZXNvdXJjZSA9IDA7CisgICAgY29uc3QgY2hhciogYnV0dG9uUmVzb3VyY2VBbHQgPSAw
OworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQbGF5UGF1c2VCdXR0b246CisgICAg
ICAgIGJ1dHRvblJlc291cmNlID0gImZzVmlkZW9QbGF5IjsKKyAgICAgICAgYnV0dG9uUmVzb3Vy
Y2VBbHQgPSAiZnNWaWRlb1BhdXNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUaW1lU2xp
ZGVyQnV0dG9uOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFZvbHVtZVVwQnV0dG9uOgorICAg
ICAgICBidXR0b25SZXNvdXJjZSA9ICJmc1ZpZGVvQXVkaW9Wb2x1bWVIaWdoIjsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBWb2x1bWVTbGlkZXJCdXR0b246CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgVm9sdW1lRG93bkJ1dHRvbjoKKyAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAiZnNWaWRl
b0F1ZGlvVm9sdW1lTG93IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeGl0RnVsbHNjcmVl
bkJ1dHRvbjoKKyAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAiZnNWaWRlb0V4aXRGdWxsc2NyZWVu
IjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGJ1dHRvblJlc291cmNlKSB7Cisg
ICAgICAgIG1fYnV0dG9uSW1hZ2UgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoYnV0dG9u
UmVzb3VyY2UpOworICAgICAgICBtX2J1dHRvbkltYWdlLT5yZWYoKTsKKyAgICAgICAgbV9yZWN0
LnNldFdpZHRoKG1fYnV0dG9uSW1hZ2UtPndpZHRoKCkpOworICAgICAgICBtX3JlY3Quc2V0SGVp
Z2h0KG1fYnV0dG9uSW1hZ2UtPmhlaWdodCgpKTsKKyAgICB9CisgICAgaWYgKGJ1dHRvblJlc291
cmNlQWx0KSB7CisgICAgICAgIG1fYnV0dG9uSW1hZ2VBbHQgPSBJbWFnZTo6bG9hZFBsYXRmb3Jt
UmVzb3VyY2UoYnV0dG9uUmVzb3VyY2VBbHQpOworICAgICAgICBtX2J1dHRvbkltYWdlQWx0LT5y
ZWYoKTsKKyAgICB9Cit9CisKK3ZvaWQgSFVEQnV0dG9uOjpkcmF3KEdyYXBoaWNzQ29udGV4dCYg
Y29udGV4dCkKK3sKKyAgICBpZiAobV9zaG93QWx0QnV0dG9uICYmIG1fYnV0dG9uSW1hZ2VBbHQp
CisgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKG1fYnV0dG9uSW1hZ2VBbHQuZ2V0KCksIERldmlj
ZUNvbG9yU3BhY2UsIG1fcmVjdC5sb2NhdGlvbigpKTsKKyAgICBlbHNlIGlmIChtX2J1dHRvbklt
YWdlKQorICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShtX2J1dHRvbkltYWdlLmdldCgpLCBEZXZp
Y2VDb2xvclNwYWNlLCBtX3JlY3QubG9jYXRpb24oKSk7Cit9CisKK0hVRFNsaWRlcjo6SFVEU2xp
ZGVyKEhVRFNsaWRlckJ1dHRvblNoYXBlIHNoYXBlLCBpbnQgYnV0dG9uU2l6ZSwgY29uc3QgV2Vi
Q29yZTo6SW50UmVjdCYgcmVjdCkKKyAgICA6IEhVRFdpZGdldChyZWN0KQorICAgICwgbV9idXR0
b25TaGFwZShzaGFwZSkKKyAgICAsIG1fYnV0dG9uU2l6ZShidXR0b25TaXplKQorICAgICwgbV9z
bGlkZXJQb3NpdGlvbigwKQorICAgICwgbV9kcmFnU3RhcnRPZmZzZXQoMCkKK3sKK30KKwordm9p
ZCBIVURTbGlkZXI6OmRyYXcoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0JiBjb250ZXh0KQorewor
ICAgIC8vIERyYXcgZ3V0dGVyCisgICAgSW50U2l6ZSByYWRpdXMobV9yZWN0LmhlaWdodCgpIC8g
MiwgbV9yZWN0LmhlaWdodCgpIC8gMik7CisgICAgY29udGV4dC5maWxsUm91bmRlZFJlY3QobV9y
ZWN0LCByYWRpdXMsIHJhZGl1cywgcmFkaXVzLCByYWRpdXMsIENvbG9yKHNsaWRlckd1dHRlckNv
bG9yKSwgRGV2aWNlQ29sb3JTcGFjZSk7CisKKyAgICAvLyBEcmF3IGJ1dHRvbgorICAgIGNvbnRl
eHQuc2V0U3Ryb2tlQ29sb3IoQ29sb3Ioc2xpZGVyQnV0dG9uQ29sb3IpLCBEZXZpY2VDb2xvclNw
YWNlKTsKKyAgICBjb250ZXh0LnNldEZpbGxDb2xvcihDb2xvcihzbGlkZXJCdXR0b25Db2xvciks
IERldmljZUNvbG9yU3BhY2UpOworCisgICAgaWYgKG1fYnV0dG9uU2hhcGUgPT0gUm91bmRCdXR0
b24pCisgICAgICAgIGNvbnRleHQuZHJhd0VsbGlwc2UoSW50UmVjdChtX3JlY3QubG9jYXRpb24o
KS54KCkgKyBtX3NsaWRlclBvc2l0aW9uLCBtX3JlY3QubG9jYXRpb24oKS55KCkgLSAobV9idXR0
b25TaXplIC0gbV9yZWN0LmhlaWdodCgpKSAvIDIsIG1fYnV0dG9uU2l6ZSwgbV9idXR0b25TaXpl
KSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIERyYXcgYSBkaWFtb25kCisgICAgICAgIEZsb2F0
UG9pbnQgcG9pbnRzWzRdOworICAgICAgICBmbG9hdCBoYWxmID0gbV9idXR0b25TaXplIC8gMjsK
KyAgICAgICAgcG9pbnRzWzBdLnNldFgoaGFsZiArIG1fcmVjdC5sb2NhdGlvbigpLngoKSArIG1f
c2xpZGVyUG9zaXRpb24pOworICAgICAgICBwb2ludHNbMF0uc2V0WShtX3JlY3QubG9jYXRpb24o
KS55KCkpOworICAgICAgICBwb2ludHNbMV0uc2V0WChtX2J1dHRvblNpemUgKyBtX3JlY3QubG9j
YXRpb24oKS54KCkgKyBtX3NsaWRlclBvc2l0aW9uKTsKKyAgICAgICAgcG9pbnRzWzFdLnNldFko
aGFsZiArIG1fcmVjdC5sb2NhdGlvbigpLnkoKSk7CisgICAgICAgIHBvaW50c1syXS5zZXRYKGhh
bGYgKyBtX3JlY3QubG9jYXRpb24oKS54KCkgKyBtX3NsaWRlclBvc2l0aW9uKTsKKyAgICAgICAg
cG9pbnRzWzJdLnNldFkobV9idXR0b25TaXplICsgbV9yZWN0LmxvY2F0aW9uKCkueSgpKTsKKyAg
ICAgICAgcG9pbnRzWzNdLnNldFgobV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9zbGlkZXJQb3Np
dGlvbik7CisgICAgICAgIHBvaW50c1szXS5zZXRZKGhhbGYgKyBtX3JlY3QubG9jYXRpb24oKS55
KCkpOworICAgICAgICBjb250ZXh0LmRyYXdDb252ZXhQb2x5Z29uKDQsIHBvaW50cywgdHJ1ZSk7
CisgICAgfQorfQorCit2b2lkIEhVRFNsaWRlcjo6ZHJhZyhpbnQgeCwgaW50IHksIGJvb2wgc3Rh
cnQpCit7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgIC8vIFdoZW4gd2Ugc3RhcnQsIHdlIG5l
ZWQgdG8gc25hcCB0aGUgc2xpZGVyIHBvc2l0aW9uIHRvIHRoZSB4IHBvc2l0aW9uIGlmIHdlIGNs
aWNrZWQgdGhlIGd1dHRlci4KKyAgICAgICAgLy8gQnV0IGlmIHdlIGNsaWNrIHRoZSBidXR0b24s
IHdlIG5lZWQgdG8gZHJhZyByZWxhdGl2ZSB0byB3aGVyZSB3ZSBjbGlja2VkIGRvd24uIFdlIG9u
bHkgbmVlZAorICAgICAgICAvLyB0byBjaGVjayBYIGJlY2F1c2Ugd2Ugd291bGQgbm90IGV2ZW4g
Z2V0IGhlcmUgdW5sZXNzIFkgd2VyZSBhbHJlYWR5IGluc2lkZS4KKyAgICAgICAgaW50IHJlbGF0
aXZlWCA9IHggLSBtX3JlY3QubG9jYXRpb24oKS54KCk7CisgICAgICAgIGlmIChyZWxhdGl2ZVgg
Pj0gbV9zbGlkZXJQb3NpdGlvbiAmJiByZWxhdGl2ZVggPD0gbV9zbGlkZXJQb3NpdGlvbiArIG1f
YnV0dG9uU2l6ZSkKKyAgICAgICAgICAgIG1fZHJhZ1N0YXJ0T2Zmc2V0ID0geCAtIG1fc2xpZGVy
UG9zaXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fZHJhZ1N0YXJ0T2Zmc2V0ID0g
bV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25TaXplIC8gMjsKKyAgICB9CisKKyAgICBt
X3NsaWRlclBvc2l0aW9uID0geCAtIG1fZHJhZ1N0YXJ0T2Zmc2V0OworICAgIGlmIChtX3NsaWRl
clBvc2l0aW9uIDwgMCkKKyAgICAgICAgbV9zbGlkZXJQb3NpdGlvbiA9IDA7CisgICAgZWxzZSBp
ZiAobV9zbGlkZXJQb3NpdGlvbiA+IG1fcmVjdC53aWR0aCgpIC0gbV9idXR0b25TaXplKQorICAg
ICAgICBtX3NsaWRlclBvc2l0aW9uID0gbV9yZWN0LndpZHRoKCkgLSBtX2J1dHRvblNpemU7Cit9
CisKK0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OkZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIo
KQorICAgIDogbV9odWRXaW5kb3coMCkKKyAgICAsIG1fdmlkZW9XaW5kb3coMCkKKyAgICAsIG1f
cGxheVBhdXNlQnV0dG9uKEhVREJ1dHRvbjo6UGxheVBhdXNlQnV0dG9uLCBJbnRQb2ludCgod2lu
ZG93V2lkdGggLSBidXR0b25TaXplKSAvIDIsIG1hcmdpblRvcCkpCisgICAgLCBtX3RpbWVTbGlk
ZXJCdXR0b24oSFVEQnV0dG9uOjpUaW1lU2xpZGVyQnV0dG9uLCBJbnRQb2ludCgwLCAwKSkKKyAg
ICAsIG1fdm9sdW1lVXBCdXR0b24oSFVEQnV0dG9uOjpWb2x1bWVVcEJ1dHRvbiwgSW50UG9pbnQo
bWFyZ2luICsgYnV0dG9uTWluaVNpemUgKyB2b2x1bWVTbGlkZXJXaWR0aCArIGJ1dHRvbk1pbmlT
aXplIC8gMiwgbWFyZ2luVG9wICsgKGJ1dHRvblNpemUgLSBidXR0b25NaW5pU2l6ZSkgLyAyKSkK
KyAgICAsIG1fdm9sdW1lU2xpZGVyQnV0dG9uKEhVREJ1dHRvbjo6Vm9sdW1lU2xpZGVyQnV0dG9u
LCBJbnRQb2ludCgwLCAwKSkKKyAgICAsIG1fdm9sdW1lRG93bkJ1dHRvbihIVURCdXR0b246OlZv
bHVtZURvd25CdXR0b24sIEludFBvaW50KG1hcmdpbiwgbWFyZ2luVG9wICsgKGJ1dHRvblNpemUg
LSBidXR0b25NaW5pU2l6ZSkgLyAyKSkKKyAgICAsIG1fZXhpdEZ1bGxzY3JlZW5CdXR0b24oSFVE
QnV0dG9uOjpFeGl0RnVsbHNjcmVlbkJ1dHRvbiwgSW50UG9pbnQod2luZG93V2lkdGggLSAyICog
bWFyZ2luIC0gYnV0dG9uTWluaVNpemUsIG1hcmdpblRvcCArIChidXR0b25TaXplIC0gYnV0dG9u
TWluaVNpemUpIC8gMikpCisgICAgLCBtX3ZvbHVtZVNsaWRlcihIVURTbGlkZXI6OlJvdW5kQnV0
dG9uLCB2b2x1bWVTbGlkZXJCdXR0b25TaXplLCBJbnRSZWN0KEludFBvaW50KG1hcmdpbiArIGJ1
dHRvbk1pbmlTaXplLCBtYXJnaW5Ub3AgKyAoYnV0dG9uU2l6ZSAtIGJ1dHRvbk1pbmlTaXplKSAv
IDIgKyBidXR0b25NaW5pU2l6ZSAvIDIgLSBzbGlkZXJIZWlnaHQgLyAyKSwgSW50U2l6ZSh2b2x1
bWVTbGlkZXJXaWR0aCwgc2xpZGVySGVpZ2h0KSkpCisgICAgLCBtX3RpbWVTbGlkZXIoSFVEU2xp
ZGVyOjpEaWFtb25kQnV0dG9uLCB0aW1lU2xpZGVyQnV0dG9uU2l6ZSwgSW50UmVjdChJbnRQb2lu
dCh3aW5kb3dXaWR0aCAvIDIgLSB0aW1lU2xpZGVyV2lkdGggLyAyLCB3aW5kb3dIZWlnaHQgLSBt
YXJnaW4gLSBzbGlkZXJIZWlnaHQpLCBJbnRTaXplKHRpbWVTbGlkZXJXaWR0aCwgc2xpZGVySGVp
Z2h0KSkpCisgICAgLCBtX3BpY2tlZFdpZGdldCgwKQorICAgICwgbV9tb3ZpbmdXaW5kb3coZmFs
c2UpCisgICAgLCBtX3RpbWVyKHRoaXMsICZGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp0aW1l
ckZpcmVkKQoreworfQorCitGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp+RnVsbHNjcmVlblZp
ZGVvQ29udHJvbGxlcigpCit7CisgICAgaWYgKG1vdmllKCkpCisgICAgICAgIG1vdmllKCktPmV4
aXRGdWxsc2NyZWVuKCk7CisKKyAgICBtX2JpdG1hcC5jbGVhcigpOworICAgIFNldFdpbmRvd0xv
bmdQdHIobV9odWRXaW5kb3csIDAsIDApOworICAgIERlc3Ryb3lXaW5kb3cobV9odWRXaW5kb3cp
OworfQorCitRVE1vdmllV2luKiBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjptb3ZpZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVtZW50ID8gcmVpbnRlcnByZXRfY2FzdDxRVE1v
dmllV2luKj4obV9tZWRpYUVsZW1lbnQtPnBsYXRmb3JtTWVkaWEoKS5xdE1vdmllKSA6IDA7Cit9
CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6c2V0TWVkaWFFbGVtZW50KEhUTUxN
ZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCkKK3sKKyAgICBtX21lZGlhRWxlbWVudCA9IG1lZGlh
RWxlbWVudDsKKyAgICBpZiAoIW1fbWVkaWFFbGVtZW50KSB7CisgICAgICAgIC8vIENhbid0IGRv
IGZ1bGwtc2NyZWVuLCBqdXN0IGdldCBvdXQKKyAgICAgICAgaWYgKG1vdmllKCkpCisgICAgICAg
ICAgICBtb3ZpZSgpLT5leGl0RnVsbHNjcmVlbigpOworICAgIH0KK30KKwordm9pZCBGdWxsc2Ny
ZWVuVmlkZW9Db250cm9sbGVyOjplbnRlckZ1bGxzY3JlZW4oKQoreworICAgIGlmIChtb3ZpZSgp
KSB7CisgICAgICAgIG1fdmlkZW9XaW5kb3cgPSBtb3ZpZSgpLT5lbnRlckZ1bGxzY3JlZW4odGhp
cyk7CisgICAgCisgICAgICAgIFJFQ1Qgd2luZG93UmVjdDsKKyAgICAgICAgR2V0Q2xpZW50UmVj
dChtX3ZpZGVvV2luZG93LCAmd2luZG93UmVjdCk7CisgICAgICAgIG1fZnVsbHNjcmVlblNpemUu
c2V0V2lkdGgod2luZG93UmVjdC5yaWdodCAtIHdpbmRvd1JlY3QubGVmdCArIDEpOworICAgICAg
ICBtX2Z1bGxzY3JlZW5TaXplLnNldEhlaWdodCh3aW5kb3dSZWN0LmJvdHRvbSAtIHdpbmRvd1Jl
Y3QudG9wICsgMSk7CisKKyAgICAgICAgY3JlYXRlSFVEV2luZG93KCk7CisgICAgfQorfQorCit2
b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmV4aXRGdWxsc2NyZWVuKCkKK3sKKyAgICBp
ZiAobW92aWUoKSkKKyAgICAgICAgbW92aWUoKS0+ZXhpdEZ1bGxzY3JlZW4oKTsKK30KKworYm9v
bCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpjYW5QbGF5KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9tZWRpYUVsZW1lbnQgJiYgbV9tZWRpYUVsZW1lbnQtPmNhblBsYXkoKTsKK30KKwordm9p
ZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpwbGF5KCkKK3sKKyAgICBpZiAobV9tZWRpYUVs
ZW1lbnQpCisgICAgICAgIG1fbWVkaWFFbGVtZW50LT5wbGF5KCk7Cit9CisKK3ZvaWQgRnVsbHNj
cmVlblZpZGVvQ29udHJvbGxlcjo6cGF1c2UoKQoreworICAgIGlmIChtX21lZGlhRWxlbWVudCkK
KyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPnBhdXNlKCk7Cit9CisKK2Zsb2F0IEZ1bGxzY3JlZW5W
aWRlb0NvbnRyb2xsZXI6OnZvbHVtZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVt
ZW50ID8gbV9tZWRpYUVsZW1lbnQtPnZvbHVtZSgpIDogMDsKK30KKwordm9pZCBGdWxsc2NyZWVu
VmlkZW9Db250cm9sbGVyOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKQoreworICAgIGlmIChtX21l
ZGlhRWxlbWVudCkgeworICAgICAgICBFeGNlcHRpb25Db2RlIGVjOworICAgICAgICBtX21lZGlh
RWxlbWVudC0+c2V0Vm9sdW1lKHZvbHVtZSwgZWMpOworICAgIH0KK30KKworZmxvYXQgRnVsbHNj
cmVlblZpZGVvQ29udHJvbGxlcjo6Y3VycmVudFRpbWUoKSBjb25zdAoreworICAgIHJldHVybiBt
X21lZGlhRWxlbWVudCA/IG1fbWVkaWFFbGVtZW50LT5jdXJyZW50VGltZSgpIDogMDsKK30KKwor
dm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpzZXRDdXJyZW50VGltZShmbG9hdCB2YWx1
ZSkKK3sKKyAgICBpZiAobV9tZWRpYUVsZW1lbnQpIHsKKyAgICAgICAgRXhjZXB0aW9uQ29kZSBl
YzsKKyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPnNldEN1cnJlbnRUaW1lKHZhbHVlLCBlYyk7Cisg
ICAgfQorfQorCitmbG9hdCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpkdXJhdGlvbigpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVtZW50ID8gbV9tZWRpYUVsZW1lbnQtPmR1cmF0
aW9uKCkgOiAwOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmJlZ2luU2Ny
dWJiaW5nKCkKK3sKKyAgICBpZiAobV9tZWRpYUVsZW1lbnQpIAorICAgICAgICBtX21lZGlhRWxl
bWVudC0+YmVnaW5TY3J1YmJpbmcoKTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9s
bGVyOjplbmRTY3J1YmJpbmcoKQoreworICAgIGlmIChtX21lZGlhRWxlbWVudCkgCisgICAgICAg
IG1fbWVkaWFFbGVtZW50LT5lbmRTY3J1YmJpbmcoKTsKK30KKworTFJFU1VMVCBGdWxsc2NyZWVu
VmlkZW9Db250cm9sbGVyOjpmdWxsc2NyZWVuQ2xpZW50V25kUHJvYyhIV05EIHduZCwgVUlOVCBt
ZXNzYWdlLCBVSU5UIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgc3dpdGNoIChtZXNzYWdl
KSB7CisgICAgY2FzZSBXTV9DSEFSOgorICAgICAgICBvbkNoYXIod1BhcmFtKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKyAgICAgICAgb25Nb3VzZURvd24oR0VU
X1hfTFBBUkFNKGxQYXJhbSksIEdFVF9ZX0xQQVJBTShsUGFyYW0pKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBXTV9NT1VTRU1PVkU6CisgICAgICAgIG9uTW91c2VNb3ZlKEdFVF9YX0xQQVJB
TShsUGFyYW0pLCBHRVRfWV9MUEFSQU0obFBhcmFtKSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgV01fTEJVVFRPTlVQOgorICAgICAgICBvbk1vdXNlVXAoR0VUX1hfTFBBUkFNKGxQYXJhbSks
IEdFVF9ZX0xQQVJBTShsUGFyYW0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0
dXJuIERlZldpbmRvd1Byb2Mod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisKK2Nv
bnN0IExQQ1dTVFIgZnVsbHNjcmVlblZpZGVlb0hVRFdpbmRvd0NsYXNzTmFtZSA9IEwiZnVsbHNj
cmVlblZpZGVlb0hVRFdpbmRvd0NsYXNzIjsKKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9s
bGVyOjpyZWdpc3RlckhVRFdpbmRvd0NsYXNzKCkKK3sKKyAgICBzdGF0aWMgYm9vbCBoYXZlUmVn
aXN0ZXJlZEhVRFdpbmRvd0NsYXNzID0gZmFsc2U7CisgICAgaWYgKGhhdmVSZWdpc3RlcmVkSFVE
V2luZG93Q2xhc3MpCisgICAgICAgIHJldHVybjsKKworICAgIGhhdmVSZWdpc3RlcmVkSFVEV2lu
ZG93Q2xhc3MgPSB0cnVlOworCisgICAgV05EQ0xBU1NFWCB3Y2V4OworCisgICAgd2NleC5jYlNp
emUgPSBzaXplb2YoV05EQ0xBU1NFWCk7CisKKyAgICB3Y2V4LnN0eWxlID0gQ1NfSFJFRFJBVyB8
IENTX1ZSRURSQVc7CisgICAgd2NleC5scGZuV25kUHJvYyA9IGh1ZFduZFByb2M7CisgICAgd2Nl
eC5jYkNsc0V4dHJhID0gMDsKKyAgICB3Y2V4LmNiV25kRXh0cmEgPSA0OworICAgIHdjZXguaElu
c3RhbmNlID0gZ0luc3RhbmNlOworICAgIHdjZXguaEljb24gPSAwOworICAgIHdjZXguaEN1cnNv
ciA9IExvYWRDdXJzb3IoMCwgSURDX0FSUk9XKTsKKyAgICB3Y2V4LmhickJhY2tncm91bmQgPSAw
OworICAgIHdjZXgubHBzek1lbnVOYW1lID0gMDsKKyAgICB3Y2V4Lmxwc3pDbGFzc05hbWUgPSBm
dWxsc2NyZWVuVmlkZWVvSFVEV2luZG93Q2xhc3NOYW1lOworICAgIHdjZXguaEljb25TbSA9IDA7
CisKKyAgICBSZWdpc3RlckNsYXNzRXgoJndjZXgpOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRl
b0NvbnRyb2xsZXI6OmNyZWF0ZUhVRFdpbmRvdygpCit7CisgICAgbV9odWRQb3NpdGlvbi5zZXRY
KChtX2Z1bGxzY3JlZW5TaXplLndpZHRoKCkgLSB3aW5kb3dXaWR0aCkgLyAyKTsKKyAgICBtX2h1
ZFBvc2l0aW9uLnNldFkobV9mdWxsc2NyZWVuU2l6ZS5oZWlnaHQoKSAqIDAuOSAtIHdpbmRvd0hl
aWdodCAvIDIpOworCisgICAgLy8gTG9jYWwgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgdGhlIHJl
dHVybmVkIHBpeGVscy4gTm8gbmVlZCB0byBjbGVhbnVwIHRoaXMgdmFsdWUuIEl0CisgICAgLy8g
d2lsbCBnZXQgY2xlYW5lZCB1cCB3aGVuIG1fYml0bWFwIGlzIGRlc3Ryb3llZCBpbiB0aGUgZHRv
cgorICAgIHZvaWQqIHBpeGVsczsKKyAgICBCaXRtYXBJbmZvIGJpdG1hcEluZm8gPSBCaXRtYXBJ
bmZvOjpjcmVhdGVCb3R0b21VcChJbnRTaXplKHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQpKTsK
KyAgICBtX2JpdG1hcC5zZXQoOjpDcmVhdGVESUJTZWN0aW9uKDAsICZiaXRtYXBJbmZvLCBESUJf
UkdCX0NPTE9SUywgJnBpeGVscywgMCwgMCkpOworICAgIAorICAgIC8vIERpcnR5IHRoZSB3aW5k
b3cgc28gdGhlIEhVRCBkcmF3cworICAgIFJFQ1QgY2xlYXJSZWN0ID0geyBtX2h1ZFBvc2l0aW9u
LngoKSwgbV9odWRQb3NpdGlvbi55KCksIG1faHVkUG9zaXRpb24ueCgpICsgd2luZG93V2lkdGgg
LSAxLCBtX2h1ZFBvc2l0aW9uLnkoKSArIHdpbmRvd0hlaWdodCAtIDEgfTsKKyAgICBJbnZhbGlk
YXRlUmVjdChtX3ZpZGVvV2luZG93LCAmY2xlYXJSZWN0LCB0cnVlKTsKKworICAgIG1fcGxheVBh
dXNlQnV0dG9uLnNldFNob3dBbHRCdXR0b24oIWNhblBsYXkoKSk7CisgICAgbV92b2x1bWVTbGlk
ZXIuc2V0VmFsdWUodm9sdW1lKCkpOworICAgIG1fdGltZVNsaWRlci5zZXRWYWx1ZShjdXJyZW50
VGltZSgpIC8gZHVyYXRpb24oKSk7CisKKyAgICBpZiAoIWNhblBsYXkoKSkKKyAgICAgICAgbV90
aW1lci5zdGFydFJlcGVhdGluZyh0aW1lckludGVydmFsKTsKKworICAgIHJlZ2lzdGVySFVEV2lu
ZG93Q2xhc3MoKTsKKworICAgIG1faHVkV2luZG93ID0gQ3JlYXRlV2luZG93RXgoV1NfRVhfTEFZ
RVJFRCB8IFdTX0VYX1RSQU5TUEFSRU5UIHwgV1NfRVhfVE9QTU9TVCB8IFdTX0VYX1RPT0xXSU5E
T1csIAorICAgICAgICBmdWxsc2NyZWVuVmlkZWVvSFVEV2luZG93Q2xhc3NOYW1lLCAwLCBXU19Q
T1BVUCB8IFdTX1ZJU0lCTEUsCisgICAgICAgIG1faHVkUG9zaXRpb24ueCgpLCBtX2h1ZFBvc2l0
aW9uLnkoKSwgMCwgMCwgMCwgMCwgZ0luc3RhbmNlLCAwKTsKKyAgICBBU1NFUlQoOjpJc1dpbmRv
dyhtX2h1ZFdpbmRvdykpOworICAgIFNldFdpbmRvd0xvbmdQdHIobV9odWRXaW5kb3csIDAsIHJl
aW50ZXJwcmV0X2Nhc3Q8TE9OR19QVFI+KHRoaXMpKTsKKworICAgIGRyYXcoKTsKK30KKworc3Rh
dGljIFN0cmluZyB0aW1lVG9TdHJpbmcoZmxvYXQgdGltZSkKK3sKKyAgICBpZiAoIWlzZmluaXRl
KHRpbWUpKQorICAgICAgICB0aW1lID0gMDsKKyAgICBpbnQgc2Vjb25kcyA9IGZhYnNmKHRpbWUp
OyAKKyAgICBpbnQgaG91cnMgPSBzZWNvbmRzIC8gKDYwICogNjApOworICAgIGludCBtaW51dGVz
ID0gKHNlY29uZHMgLyA2MCkgJSA2MDsKKyAgICBzZWNvbmRzICU9IDYwOworCisgICAgaWYgKGhv
dXJzKSB7CisgICAgICAgIGlmIChob3VycyA+IDkpCisgICAgICAgICAgICByZXR1cm4gU3RyaW5n
Ojpmb3JtYXQoIiVzJTAyZDolMDJkOiUwMmQiLCAodGltZSA8IDAgPyAiLSIgOiAiIiksIGhvdXJz
LCBtaW51dGVzLCBzZWNvbmRzKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIlcyUw
MWQ6JTAyZDolMDJkIiwgKHRpbWUgPCAwID8gIi0iIDogIiIpLCBob3VycywgbWludXRlcywgc2Vj
b25kcyk7CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIlcyUwMmQ6JTAyZCIs
ICh0aW1lIDwgMCA/ICItIiA6ICIiKSwgbWludXRlcywgc2Vjb25kcyk7Cit9CisKK3ZvaWQgRnVs
bHNjcmVlblZpZGVvQ29udHJvbGxlcjo6ZHJhdygpCit7CisgICAgSERDIHdpbmRvd0RDID0gR2V0
REMobV9odWRXaW5kb3cpOworICAgIEhEQyBiaXRtYXBEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyh3
aW5kb3dEQyk7CisgICAgU2VsZWN0T2JqZWN0KGJpdG1hcERDLCBtX2JpdG1hcC5nZXQoKSk7CisK
KyAgICBHcmFwaGljc0NvbnRleHQgY29udGV4dChiaXRtYXBEQywgdHJ1ZSk7CisKKyAgICBjb250
ZXh0LnNhdmUoKTsKKworICAgIC8vIERyYXcgdGhlIGJhY2tncm91bmQKKyAgICBJbnRTaXplIG91
dGVyUmFkaXVzKGJvcmRlclJhZGl1cywgYm9yZGVyUmFkaXVzKTsKKyAgICBJbnRSZWN0IG91dGVy
U2l6ZSgwLCAwLCB3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTsKKyAgICBJbnRTaXplIGlubmVy
UmFkaXVzKGJvcmRlclJhZGl1cyAtIGJvcmRlclRoaWNrbmVzcywgYm9yZGVyUmFkaXVzIC0gYm9y
ZGVyVGhpY2tuZXNzKTsKKyAgICBJbnRSZWN0IGlubmVyU2l6ZShib3JkZXJUaGlja25lc3MsIGJv
cmRlclRoaWNrbmVzcywgd2luZG93V2lkdGggLSBib3JkZXJUaGlja25lc3MgKiAyLCB3aW5kb3dI
ZWlnaHQgLSBib3JkZXJUaGlja25lc3MgKiAyKTsKKworICAgIGNvbnRleHQuZmlsbFJvdW5kZWRS
ZWN0KG91dGVyU2l6ZSwgb3V0ZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBvdXRlclJhZGl1cywgb3V0
ZXJSYWRpdXMsIENvbG9yKGJvcmRlckNvbG9yKSwgRGV2aWNlQ29sb3JTcGFjZSk7CisgICAgY29u
dGV4dC5zZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlQ29weSk7CisgICAgY29udGV4dC5m
aWxsUm91bmRlZFJlY3QoaW5uZXJTaXplLCBpbm5lclJhZGl1cywgaW5uZXJSYWRpdXMsIGlubmVy
UmFkaXVzLCBpbm5lclJhZGl1cywgQ29sb3IoYmFja2dyb3VuZENvbG9yKSwgRGV2aWNlQ29sb3JT
cGFjZSk7CisKKyAgICAvLyBEcmF3IHRoZSB3aWRnZXRzCisgICAgbV9wbGF5UGF1c2VCdXR0b24u
ZHJhdyhjb250ZXh0KTsKKyAgICBtX3ZvbHVtZVVwQnV0dG9uLmRyYXcoY29udGV4dCk7CisgICAg
bV92b2x1bWVTbGlkZXJCdXR0b24uZHJhdyhjb250ZXh0KTsKKyAgICBtX3ZvbHVtZURvd25CdXR0
b24uZHJhdyhjb250ZXh0KTsKKyAgICBtX3RpbWVTbGlkZXJCdXR0b24uZHJhdyhjb250ZXh0KTsK
KyAgICBtX2V4aXRGdWxsc2NyZWVuQnV0dG9uLmRyYXcoY29udGV4dCk7CisgICAgbV92b2x1bWVT
bGlkZXIuZHJhdyhjb250ZXh0KTsKKyAgICBtX3RpbWVTbGlkZXIuZHJhdyhjb250ZXh0KTsKKwor
ICAgIC8vIERyYXcgdGhlIHRleHQgc3RyaW5ncworICAgIEZvbnREZXNjcmlwdGlvbiBkZXNjOwor
CisgICAgTk9OQ0xJRU5UTUVUUklDUyBtZXRyaWNzOworICAgIG1ldHJpY3MuY2JTaXplID0gc2l6
ZW9mKG1ldHJpY3MpOworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvKFNQSV9HRVROT05DTElFTlRN
RVRSSUNTLCBtZXRyaWNzLmNiU2l6ZSwgJm1ldHJpY3MsIDApOworICAgIEZvbnRGYW1pbHkgZmFt
aWx5OworICAgIGZhbWlseS5zZXRGYW1pbHkobWV0cmljcy5sZlNtQ2FwdGlvbkZvbnQubGZGYWNl
TmFtZSk7CisgICAgZGVzYy5zZXRGYW1pbHkoZmFtaWx5KTsKKworICAgIGRlc2Muc2V0Q29tcHV0
ZWRTaXplKHRleHRTaXplKTsKKyAgICBGb250IGZvbnQgPSBGb250KGRlc2MsIDAsIDApOworICAg
IGZvbnQudXBkYXRlKDApOworCisgICAgU3RyaW5nIHM7CisKKyAgICAvLyBMZWZ0IHN0cmluZwor
ICAgIHMgPSB0aW1lVG9TdHJpbmcoY3VycmVudFRpbWUoKSk7CisgICAgVGV4dFJ1biBsZWZ0VGV4
dChzKTsKKyAgICBjb250ZXh0LnNldEZpbGxDb2xvcihDb2xvcih0ZXh0Q29sb3IpLCBEZXZpY2VD
b2xvclNwYWNlKTsKKyAgICBjb250ZXh0LmRyYXdUZXh0KGZvbnQsIGxlZnRUZXh0LCBJbnRQb2lu
dCh3aW5kb3dXaWR0aCAvIDIgLSB0aW1lU2xpZGVyV2lkdGggLyAyIC0gbWFyZ2luIC0gZm9udC53
aWR0aChsZWZ0VGV4dCksIHdpbmRvd0hlaWdodCAtIG1hcmdpbiAtIHNsaWRlckhlaWdodCAvIDIg
KyAzKSk7CisKKyAgICAvLyBSaWdodCBzdHJpbmcKKyAgICBzID0gdGltZVRvU3RyaW5nKGN1cnJl
bnRUaW1lKCkgLSBkdXJhdGlvbigpKTsKKyAgICBUZXh0UnVuIHJpZ2h0VGV4dChzKTsKKyAgICBj
b250ZXh0LnNldEZpbGxDb2xvcihDb2xvcih0ZXh0Q29sb3IpLCBEZXZpY2VDb2xvclNwYWNlKTsK
KyAgICBjb250ZXh0LmRyYXdUZXh0KGZvbnQsIHJpZ2h0VGV4dCwgSW50UG9pbnQod2luZG93V2lk
dGggLyAyICsgdGltZVNsaWRlcldpZHRoIC8gMiArIG1hcmdpbiwgd2luZG93SGVpZ2h0IC0gbWFy
Z2luIC0gc2xpZGVySGVpZ2h0IC8gMiArIDMpKTsKKworICAgIC8vIENvcHkgdG8gdGhlIHdpbmRv
dworICAgIEJMRU5ERlVOQ1RJT04gYmxlbmRGdW5jdGlvbiA9IHtBQ19TUkNfT1ZFUiwgMCwgMjU1
LCBBQ19TUkNfQUxQSEF9OworICAgIFNJWkUgc2l6ZSA9IHsgd2luZG93V2lkdGgsIHdpbmRvd0hl
aWdodCB9OworICAgIFBPSU5UIHNvdXJjZVBvaW50ID0gezAsIDB9OworICAgIFBPSU5UIGRlc3RQ
b2ludCA9IHsgbV9odWRQb3NpdGlvbi54KCksIG1faHVkUG9zaXRpb24ueSgpIH07CisgICAgQk9P
TCByZXN1bHQgPSBVcGRhdGVMYXllcmVkV2luZG93KG1faHVkV2luZG93LCB3aW5kb3dEQywgJmRl
c3RQb2ludCwgJnNpemUsIGJpdG1hcERDLCAmc291cmNlUG9pbnQsIDAsICZibGVuZEZ1bmN0aW9u
LCBVTFdfQUxQSEEpOworICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisKKyAgICBj
b250ZXh0LnJlc3RvcmUoKTsKKworICAgIDo6RGVsZXRlREMoYml0bWFwREMpOworICAgIDo6UmVs
ZWFzZURDKG1faHVkV2luZG93LCB3aW5kb3dEQyk7Cit9CisKK0xSRVNVTFQgRnVsbHNjcmVlblZp
ZGVvQ29udHJvbGxlcjo6aHVkV25kUHJvYyhIV05EIHduZCwgVUlOVCBtZXNzYWdlLCBVSU5UIHdQ
YXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgTE9OR19QVFIgbG9uZ1B0ciA9IEdldFdpbmRvd0xv
bmdQdHIod25kLCAwKTsKKyAgICBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKiBjb250cm9sbGVy
ID0gcmVpbnRlcnByZXRfY2FzdDxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKj4obG9uZ1B0cik7
CisgICAgaWYgKCFjb250cm9sbGVyKQorICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyh3bmQs
IG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIHN3aXRjaCAobWVzc2FnZSkgeworICAg
IGNhc2UgV01fUEFJTlQ6CisgICAgICAgIFBBSU5UU1RSVUNUIHBzOworICAgICAgICBCZWdpblBh
aW50KHduZCwgJnBzKTsKKyAgICAgICAgY29udHJvbGxlci0+ZHJhdygpOworICAgICAgICBFbmRQ
YWludCh3bmQsICZwcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV01fQ0hBUjoKKyAgICAg
ICAgY29udHJvbGxlci0+b25DaGFyKHdQYXJhbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
V01fTEJVVFRPTkRPV046CisgICAgICAgIGNvbnRyb2xsZXItPm9uTW91c2VEb3duKEdFVF9YX0xQ
QVJBTShsUGFyYW0pLCBHRVRfWV9MUEFSQU0obFBhcmFtKSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgV01fTU9VU0VNT1ZFOgorICAgICAgICBjb250cm9sbGVyLT5vbk1vdXNlTW92ZShHRVRf
WF9MUEFSQU0obFBhcmFtKSwgR0VUX1lfTFBBUkFNKGxQYXJhbSkpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIFdNX0xCVVRUT05VUDoKKyAgICAgICAgY29udHJvbGxlci0+b25Nb3VzZVVwKEdF
VF9YX0xQQVJBTShsUGFyYW0pLCBHRVRfWV9MUEFSQU0obFBhcmFtKSk7CisgICAgICAgIGJyZWFr
OworICAgIH0KKworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKHduZCwgbWVzc2FnZSwgd1BhcmFt
LCBsUGFyYW0pOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6Om9uQ2hhcihp
bnQgYykKK3sKKyAgICBpZiAoYyA9PSAweDFiKSB7CisgICAgICAgIC8vIEVTQyBleGl0cyBmdWxs
LXNjcmVlbgorICAgICAgICBpZiAobV9tZWRpYUVsZW1lbnQpCisgICAgICAgICAgICBtX21lZGlh
RWxlbWVudC0+ZXhpdEZ1bGxzY3JlZW4oKTsKKyAgICB9IGVsc2UgaWYgKGMgPT0gMHgyMCkgewor
ICAgICAgICAvLyBTUEFDRSB0b2dnbGVzIHBsYXkvcGF1c2UKKyAgICAgICAgdG9nZ2xlUGxheSgp
OworICAgIH0KK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp0aW1lckZpcmVk
KFdlYkNvcmU6OlRpbWVyPEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI+KikKK3sKKyAgICAvLyBX
aGVuIHRoZSBtb3ZpZSBpcyBwbGF5aW5nLCB0aGUgZXZlbnQgcXVldWUgc2VlbXMgdG8gYmUgZ2V0
dGluZyBzdGFydmVkLAorICAgIC8vIHNvIHdlIGZpcmUgYSB0aW1lciBldmVyeSAzM21zIGFuZCBz
aW11bGF0ZSBhIG1vdXNlIG1vdmUuIFRoaXMgb25seQorICAgIC8vIGhhcHBlbnMgd2hlbiB0aGUg
bGVmdCBidXR0b24gaXMgZG93bgorICAgIGlmIChtX3BpY2tlZFdpZGdldCB8fCBtX21vdmluZ1dp
bmRvdykgeworICAgICAgICBQT0lOVCBwOworICAgICAgICBHZXRDdXJzb3JQb3MoJnApOworICAg
ICAgICBvbk1vdXNlTW92ZShwLngsIHAueSk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSB0
aW1lIHNsaWRlcgorICAgIG1fdGltZVNsaWRlci5zZXRWYWx1ZShjdXJyZW50VGltZSgpIC8gZHVy
YXRpb24oKSk7CisgICAgZHJhdygpOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xs
ZXI6Om9uTW91c2VEb3duKGludCB4LCBpbnQgeSkKK3sKKyAgICBmdWxsU2NyZWVuVG9IVURDb29y
ZGluYXRlcyh4LCB5KTsKKworICAgIC8vIERvbid0IGJvdGhlciBoaXQgdGVzdGluZyBpZiB3ZSdy
ZSBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIHdpbmRvdworICAgIGlmICh4IDwgMCB8fCB4ID49
IHdpbmRvd1dpZHRoIHx8IHkgPCAwIHx8IHkgPj0gd2luZG93SGVpZ2h0KQorICAgICAgICByZXR1
cm47CisKKyAgICBtX3BpY2tlZFdpZGdldCA9IDA7CisgICAgbV9tb3ZpbmdXaW5kb3cgPSBmYWxz
ZTsKKworICAgIGlmIChtX3BsYXlQYXVzZUJ1dHRvbi5oaXRUZXN0KHgsIHkpKQorICAgICAgICBt
X3BpY2tlZFdpZGdldCA9ICZtX3BsYXlQYXVzZUJ1dHRvbjsKKyAgICBlbHNlIGlmIChtX2V4aXRG
dWxsc2NyZWVuQnV0dG9uLmhpdFRlc3QoeCwgeSkpCisgICAgICAgIG1fcGlja2VkV2lkZ2V0ID0g
Jm1fZXhpdEZ1bGxzY3JlZW5CdXR0b247CisgICAgZWxzZSBpZiAobV92b2x1bWVVcEJ1dHRvbi5o
aXRUZXN0KHgsIHkpKQorICAgICAgICBtX3BpY2tlZFdpZGdldCA9ICZtX3ZvbHVtZVVwQnV0dG9u
OworICAgIGVsc2UgaWYgKG1fdm9sdW1lRG93bkJ1dHRvbi5oaXRUZXN0KHgsIHkpKQorICAgICAg
ICBtX3BpY2tlZFdpZGdldCA9ICZtX3ZvbHVtZURvd25CdXR0b247CisgICAgZWxzZSBpZiAobV92
b2x1bWVTbGlkZXIuaGl0VGVzdCh4LCB5KSkgeworICAgICAgICBtX3BpY2tlZFdpZGdldCA9ICZt
X3ZvbHVtZVNsaWRlcjsKKyAgICAgICAgbV92b2x1bWVTbGlkZXIuZHJhZyh4LCB5LCB0cnVlKTsK
KyAgICB9IGVsc2UgaWYgKG1fdGltZVNsaWRlci5oaXRUZXN0KHgsIHkpKSB7CisgICAgICAgIG1f
cGlja2VkV2lkZ2V0ID0gJm1fdGltZVNsaWRlcjsKKyAgICAgICAgbV90aW1lU2xpZGVyLmRyYWco
eCwgeSwgdHJ1ZSk7CisgICAgICAgIGJlZ2luU2NydWJiaW5nKCk7CisgICAgfQorCisgICAgLy8g
SWYgd2UgZGlkIG5vdCBwaWNrIGFueSBvZiBvdXIgd2lkZ2V0cyB3ZSBhcmUgc3RhcnRpbmcgYSB3
aW5kb3cgbW92ZQorICAgIGlmICghbV9waWNrZWRXaWRnZXQpIHsKKyAgICAgICAgbV9tb3ZlT2Zm
c2V0LnNldFgoeCk7CisgICAgICAgIG1fbW92ZU9mZnNldC5zZXRZKHkpOworICAgICAgICBtX21v
dmluZ1dpbmRvdyA9IHRydWU7CisgICAgfQorCisgICAgbV90aW1lci5zdGFydFJlcGVhdGluZyh0
aW1lckludGVydmFsKTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpvbk1v
dXNlTW92ZShpbnQgeCwgaW50IHkpCit7CisgICAgZnVsbFNjcmVlblRvSFVEQ29vcmRpbmF0ZXMo
eCwgeSk7CisKKyAgICBpZiAobV9waWNrZWRXaWRnZXQpIHsKKyAgICAgICAgbV9waWNrZWRXaWRn
ZXQtPmRyYWcoeCwgeSwgZmFsc2UpOworICAgICAgICBpZiAobV9waWNrZWRXaWRnZXQgPT0gJm1f
dm9sdW1lU2xpZGVyKQorICAgICAgICAgICAgc2V0Vm9sdW1lKG1fdm9sdW1lU2xpZGVyLnZhbHVl
KCkpOworICAgICAgICBlbHNlIGlmIChtX3BpY2tlZFdpZGdldCA9PSAmbV90aW1lU2xpZGVyKQor
ICAgICAgICAgICAgc2V0Q3VycmVudFRpbWUobV90aW1lU2xpZGVyLnZhbHVlKCkgKiBkdXJhdGlv
bigpKTsKKyAgICAgICAgZHJhdygpOworICAgIH0gZWxzZSBpZiAobV9tb3ZpbmdXaW5kb3cpIHsK
KyAgICAgICAgbV9odWRQb3NpdGlvbi5tb3ZlKHggLSBtX21vdmVPZmZzZXQueCgpLCB5IC0gbV9t
b3ZlT2Zmc2V0LnkoKSk7CisgICAgICAgIGRyYXcoKTsKKyAgICB9Cit9CisKK3ZvaWQgRnVsbHNj
cmVlblZpZGVvQ29udHJvbGxlcjo6b25Nb3VzZVVwKGludCB4LCBpbnQgeSkKK3sKKyAgICBmdWxs
U2NyZWVuVG9IVURDb29yZGluYXRlcyh4LCB5KTsKKyAgICBtX21vdmluZ1dpbmRvdyA9IGZhbHNl
OworCisgICAgLy8gV2UgYXJlIHJ1bm5pbmcgYSB0aW1lciBkdXJpbmcgbW91c2UgbW92ZXMuIFdl
IHdhbnQgdG8gYWxzbyBydW4gaXQKKyAgICAvLyB3aGlsZSB0aGUgdmlkZW8gaXMgcGxheWluZyB0
byB1cGRhdGUgdGhlIHRpbWUgc2xpZGVyLiBTbyBkb24ndCBzdG9wCisgICAgLy8gaXQgaWYgdGhl
IHZpZGVvIGlzIHJ1bm5pbmcKKyAgICBpZiAoY2FuUGxheSgpKQorICAgICAgICBtX3RpbWVyLnN0
b3AoKTsKKworICAgIGlmIChtX3BpY2tlZFdpZGdldCkgeworICAgICAgICBpZiAobV9wbGF5UGF1
c2VCdXR0b24uaGl0VGVzdCh4LCB5KSkKKyAgICAgICAgICAgIHRvZ2dsZVBsYXkoKTsKKyAgICAg
ICAgZWxzZSBpZiAobV92b2x1bWVVcEJ1dHRvbi5oaXRUZXN0KHgsIHkpKSB7CisgICAgICAgICAg
ICBzZXRWb2x1bWUoMSk7CisgICAgICAgICAgICBtX3ZvbHVtZVNsaWRlci5zZXRWYWx1ZSgxKTsK
KyAgICAgICAgfSBlbHNlIGlmIChtX3ZvbHVtZURvd25CdXR0b24uaGl0VGVzdCh4LCB5KSkgewor
ICAgICAgICAgICAgc2V0Vm9sdW1lKDApOworICAgICAgICAgICAgbV92b2x1bWVTbGlkZXIuc2V0
VmFsdWUoMCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9waWNrZWRXaWRnZXQgPT0gJm1fdGltZVNs
aWRlcikKKyAgICAgICAgICAgIGVuZFNjcnViYmluZygpOworICAgICAgICBlbHNlIGlmIChtX2V4
aXRGdWxsc2NyZWVuQnV0dG9uLmhpdFRlc3QoeCwgeSkpIHsKKyAgICAgICAgICAgIGlmIChtX21l
ZGlhRWxlbWVudCkKKyAgICAgICAgICAgICAgICBtX21lZGlhRWxlbWVudC0+ZXhpdEZ1bGxzY3Jl
ZW4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fcGlj
a2VkV2lkZ2V0ID0gMDsKKyAgICBkcmF3KCk7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29u
dHJvbGxlcjo6dG9nZ2xlUGxheSgpCit7CisgICAgaWYgKGNhblBsYXkoKSkKKyAgICAgICAgcGxh
eSgpOworICAgIGVsc2UKKyAgICAgICAgcGF1c2UoKTsKKworICAgIG1fcGxheVBhdXNlQnV0dG9u
LnNldFNob3dBbHRCdXR0b24oIWNhblBsYXkoKSk7CisgICAgaWYgKCFjYW5QbGF5KCkpCisgICAg
ICAgIG1fdGltZXIuc3RhcnRSZXBlYXRpbmcodGltZXJJbnRlcnZhbCk7CisgICAgZWxzZQorICAg
ICAgICBtX3RpbWVyLnN0b3AoKTsKK30KKworI2VuZGlmCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBX
ZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIuY3BwCl9fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6
IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IFdlYktpdC93aW4vRnVsbHNjcmVlblZpZGVv
Q29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vRnVsbHNjcmVlblZpZGVvQ29u
dHJvbGxlci5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L3dpbi9GdWxsc2NyZWVuVmlkZW9Db250
cm9sbGVyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRl
ZiBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyX2gKKyNkZWZpbmUgRnVsbHNjcmVlblZpZGVvQ29u
dHJvbGxlcl9oCisKKyNpZiBFTkFCTEUoVklERU8pCisKKyNpbmNsdWRlICJRVE1vdmllV2luLmgi
CisKKyNpbmNsdWRlIDxXZWJDb3JlL0hUTUxNZWRpYUVsZW1lbnQuaD4KKyNpbmNsdWRlIDxXZWJD
b3JlL0ltYWdlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbnRQb2ludC5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvSW50U2l6ZS5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworY2xhc3MgV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0OworCitjbGFzcyBIVURXaWRnZXQgeworcHVibGljOgorICAgIEhV
RFdpZGdldChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0KQorICAgICAgICA6IG1fcmVjdChy
ZWN0KQorICAgIHsgfQorICAgIAorICAgIHZpcnR1YWwgfkhVRFdpZGdldCgpIHsgfQorCisgICAg
dmlydHVhbCB2b2lkIGRyYXcoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0JikgPSAwOworICAgIHZp
cnR1YWwgdm9pZCBkcmFnKGludCB4LCBpbnQgeSwgYm9vbCBzdGFydCkgPSAwOworICAgIGJvb2wg
aGl0VGVzdChpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuIHggPj0gbV9yZWN0LngoKSAmJiB4
IDwgbV9yZWN0LngoKSArIG1fcmVjdC53aWR0aCgpICYmIHkgPj0gbV9yZWN0LnkoKSAmJiB5IDwg
bV9yZWN0LnkoKSArIG1fcmVjdC5oZWlnaHQoKTsgfQorCitwcm90ZWN0ZWQ6CisgICAgV2ViQ29y
ZTo6SW50UmVjdCBtX3JlY3Q7Cit9OworCitjbGFzcyBIVURCdXR0b24gOiBwdWJsaWMgSFVEV2lk
Z2V0IHsKK3B1YmxpYzoKKyAgICBlbnVtIEhVREJ1dHRvblR5cGUgeworICAgICAgICBOb0J1dHRv
biwKKyAgICAgICAgUGxheVBhdXNlQnV0dG9uLAorICAgICAgICBUaW1lU2xpZGVyQnV0dG9uLAor
ICAgICAgICBWb2x1bWVVcEJ1dHRvbiwKKyAgICAgICAgVm9sdW1lU2xpZGVyQnV0dG9uLAorICAg
ICAgICBWb2x1bWVEb3duQnV0dG9uLAorICAgICAgICBFeGl0RnVsbHNjcmVlbkJ1dHRvbgorICAg
IH07CisKKyAgICBIVURCdXR0b24oSFVEQnV0dG9uVHlwZSB0eXBlLCBjb25zdCBXZWJDb3JlOjpJ
bnRQb2ludCYpOworICAgIH5IVURCdXR0b24oKSB7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkcmF3
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCYpOworICAgIHZpcnR1YWwgdm9pZCBkcmFnKGludCB4
LCBpbnQgeSwgYm9vbCBzdGFydCkgeyB9CisgICAgdm9pZCBzZXRTaG93QWx0QnV0dG9uKGJvb2wg
YikgIHsgbV9zaG93QWx0QnV0dG9uID0gYjsgfQorCitwcml2YXRlOgorICAgIFJlZlB0cjxXZWJD
b3JlOjpJbWFnZT4gbV9idXR0b25JbWFnZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6SW1hZ2U+IG1f
YnV0dG9uSW1hZ2VBbHQ7CisgICAgSFVEQnV0dG9uVHlwZSBtX3R5cGU7CisgICAgYm9vbCBtX3No
b3dBbHRCdXR0b247Cit9OworCitjbGFzcyBIVURTbGlkZXIgOiBwdWJsaWMgSFVEV2lkZ2V0IHsK
K3B1YmxpYzoKKyAgICBlbnVtIEhVRFNsaWRlckJ1dHRvblNoYXBlIHsgUm91bmRCdXR0b24sIERp
YW1vbmRCdXR0b24gfTsKKworICAgIEhVRFNsaWRlcihIVURTbGlkZXJCdXR0b25TaGFwZSwgaW50
IGJ1dHRvblNpemUsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QpOworICAgIH5IVURTbGlk
ZXIoKSB7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkcmF3KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dCYpOworICAgIHZpcnR1YWwgdm9pZCBkcmFnKGludCB4LCBpbnQgeSwgYm9vbCBzdGFydCk7Cisg
ICAgZmxvYXQgdmFsdWUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9zbGlk
ZXJQb3NpdGlvbikgLyAobV9yZWN0LndpZHRoKCkgLSBtX2J1dHRvblNpemUpOyB9CisgICAgdm9p
ZCBzZXRWYWx1ZShmbG9hdCB2YWx1ZSkgeyBtX3NsaWRlclBvc2l0aW9uID0gc3RhdGljX2Nhc3Q8
aW50Pih2YWx1ZSAqIChtX3JlY3Qud2lkdGgoKSAtIG1fYnV0dG9uU2l6ZSkpOyB9CisKK3ByaXZh
dGU6CisgICAgSFVEU2xpZGVyQnV0dG9uU2hhcGUgbV9idXR0b25TaGFwZTsKKyAgICBpbnQgbV9i
dXR0b25TaXplOworICAgIGludCBtX3NsaWRlclBvc2l0aW9uOworICAgIGludCBtX2RyYWdTdGFy
dE9mZnNldDsKK307CisKK2NsYXNzIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIgOiBRVE1vdmll
V2luRlNDbGllbnQsIHB1YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgRnVsbHNjcmVl
blZpZGVvQ29udHJvbGxlcigpOworICAgIHZpcnR1YWwgfkZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xs
ZXIoKTsKKworICAgIHZvaWQgc2V0TWVkaWFFbGVtZW50KFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1l
bnQqKTsKKyAgICBXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQoKSBjb25z
dCB7IHJldHVybiBtX21lZGlhRWxlbWVudC5nZXQoKTsgfQorCisgICAgdm9pZCBlbnRlckZ1bGxz
Y3JlZW4oKTsKKyAgICB2b2lkIGV4aXRGdWxsc2NyZWVuKCk7CisKK3ByaXZhdGU6CisgICAgLy8g
UVRNb3ZpZVdpbkZTQ2xpZW50CisgICAgdmlydHVhbCBMUkVTVUxUIGZ1bGxzY3JlZW5DbGllbnRX
bmRQcm9jKEhXTkQsIFVJTlQgbWVzc2FnZSwgVUlOVCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKKwor
ICAgIHZvaWQgZW5zdXJlV2luZG93KCk7CisgICAgUVRNb3ZpZVdpbiogbW92aWUoKSBjb25zdDsK
KworICAgIGJvb2wgY2FuUGxheSgpIGNvbnN0OworICAgIHZvaWQgcGxheSgpOworICAgIHZvaWQg
cGF1c2UoKTsKKyAgICBmbG9hdCB2b2x1bWUoKSBjb25zdDsKKyAgICB2b2lkIHNldFZvbHVtZShm
bG9hdCk7CisgICAgZmxvYXQgY3VycmVudFRpbWUoKSBjb25zdDsKKyAgICB2b2lkIHNldEN1cnJl
bnRUaW1lKGZsb2F0KTsKKyAgICBmbG9hdCBkdXJhdGlvbigpIGNvbnN0OworICAgIHZvaWQgYmVn
aW5TY3J1YmJpbmcoKTsKKyAgICB2b2lkIGVuZFNjcnViYmluZygpOworCisgICAgUmVmUHRyPFdl
YkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ+IG1fbWVkaWFFbGVtZW50OworCisgICAgSFdORCBtX2h1
ZFdpbmRvdywgbV92aWRlb1dpbmRvdzsKKyAgICBPd25QdHI8SEJJVE1BUD4gbV9iaXRtYXA7Cisg
ICAgV2ViQ29yZTo6SW50U2l6ZSBtX2Z1bGxzY3JlZW5TaXplOworICAgIFdlYkNvcmU6OkludFBv
aW50IG1faHVkUG9zaXRpb247CisKKyAgICAvLyBIVUQgU3VwcG9ydAorICAgIHZvaWQgZnVsbFNj
cmVlblRvSFVEQ29vcmRpbmF0ZXMoaW50JiB4LCBpbnQmIHkpIGNvbnN0IHsgeCAtPSBtX2h1ZFBv
c2l0aW9uLngoKTsgeSAtPSBtX2h1ZFBvc2l0aW9uLnkoKTsgfQorCisgICAgc3RhdGljIHZvaWQg
cmVnaXN0ZXJIVURXaW5kb3dDbGFzcygpOworICAgIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLIGh1
ZFduZFByb2MoSFdORCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFt
KTsKKyAgICB2b2lkIGNyZWF0ZUhVRFdpbmRvdygpOworICAgIHZvaWQgdGltZXJGaXJlZChXZWJD
b3JlOjpUaW1lcjxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyPiopOworCisgICAgdm9pZCB0b2dn
bGVQbGF5KCk7CisgICAgdm9pZCBkcmF3KCk7CisKKyAgICB2b2lkIG9uQ2hhcihpbnQgYyk7Cisg
ICAgdm9pZCBvbk1vdXNlRG93bihpbnQgeCwgaW50IHkpOworICAgIHZvaWQgb25Nb3VzZU1vdmUo
aW50IHgsIGludCB5KTsKKyAgICB2b2lkIG9uTW91c2VVcChpbnQgeCwgaW50IHkpOworCisgICAg
SFVEQnV0dG9uIG1fcGxheVBhdXNlQnV0dG9uOworICAgIEhVREJ1dHRvbiBtX3RpbWVTbGlkZXJC
dXR0b247CisgICAgSFVEQnV0dG9uIG1fdm9sdW1lVXBCdXR0b247CisgICAgSFVEQnV0dG9uIG1f
dm9sdW1lU2xpZGVyQnV0dG9uOworICAgIEhVREJ1dHRvbiBtX3ZvbHVtZURvd25CdXR0b247Cisg
ICAgSFVEQnV0dG9uIG1fZXhpdEZ1bGxzY3JlZW5CdXR0b247CisgICAgSFVEU2xpZGVyIG1fdm9s
dW1lU2xpZGVyOworICAgIEhVRFNsaWRlciBtX3RpbWVTbGlkZXI7CisKKyAgICBIVURXaWRnZXQq
IG1fcGlja2VkV2lkZ2V0OworICAgIFdlYkNvcmU6OkludFBvaW50IG1fbW92ZU9mZnNldDsKKyAg
ICBib29sIG1fbW92aW5nV2luZG93OworICAgIFdlYkNvcmU6OlRpbWVyPEZ1bGxzY3JlZW5WaWRl
b0NvbnRyb2xsZXI+IG1fdGltZXI7Cit9OworCisjZW5kaWYKKworI2VuZGlmIC8vIEZ1bGxzY3Jl
ZW5WaWRlb0NvbnRyb2xsZXJfaAoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0L3dpbi9GdWxs
c2NyZWVuVmlkZW9Db250cm9sbGVyLmgKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmV4ZWN1dGFibGUK
ICAgKyAqCgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXRETEwuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdC93aW4vV2ViS2l0RExMLmNwcAkocmV2aXNpb24gNTI3NjgpCisrKyBXZWJLaXQvd2luL1dl
YktpdERMTC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3OSw2ICsxNzksMTYgQEAgUGFzc1JlZlB0
cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGxvYWRSZQogICAgICAgICBpZHIgPSBJRFJfWk9PTV9P
VVRfQ1VSU09SOwogICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInZlcnRpY2FsVGV4dEN1cnNv
ciIpKQogICAgICAgICBpZHIgPSBJRFJfVkVSVElDQUxfVEVYVF9DVVJTT1I7CisgICAgZWxzZSBp
ZiAoIXN0cmNtcChuYW1lLCAiZnNWaWRlb0F1ZGlvVm9sdW1lSGlnaCIpKQorICAgICAgICBpZHIg
PSBJRFJfRlNfVklERU9fQVVESU9fVk9MVU1FX0hJR0g7CisgICAgZWxzZSBpZiAoIXN0cmNtcChu
YW1lLCAiZnNWaWRlb0F1ZGlvVm9sdW1lTG93IikpCisgICAgICAgIGlkciA9IElEUl9GU19WSURF
T19BVURJT19WT0xVTUVfTE9XOworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZzVmlkZW9F
eGl0RnVsbHNjcmVlbiIpKQorICAgICAgICBpZHIgPSBJRFJfRlNfVklERU9fRVhJVF9GVUxMU0NS
RUVOOworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZzVmlkZW9QYXVzZSIpKQorICAgICAg
ICBpZHIgPSBJRFJfRlNfVklERU9fUEFVU0U7CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAi
ZnNWaWRlb1BsYXkiKSkKKyAgICAgICAgaWRyID0gSURSX0ZTX1ZJREVPX1BMQVk7CiAgICAgZWxz
ZQogICAgICAgICByZXR1cm4gMDsKIApJbmRleDogV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZpZXcuY3BwCShyZXZpc2lvbiA1Mjc2OCkKKysrIFdl
YktpdC93aW4vV2ViVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDYgKzMxLDcgQEAKICNp
bmNsdWRlICJET01Db3JlQ2xhc3Nlcy5oIgogI2luY2x1ZGUgIk1hcnNoYWxsaW5nSGVscGVycy5o
IgogI2luY2x1ZGUgIlNvZnRMaW5raW5nLmgiCisjaW5jbHVkZSAiRnVsbHNjcmVlblZpZGVvQ29u
dHJvbGxlci5oIgogI2luY2x1ZGUgIldlYkJhY2tGb3J3YXJkTGlzdC5oIgogI2luY2x1ZGUgIldl
YkNocm9tZUNsaWVudC5oIgogI2luY2x1ZGUgIldlYkNvbnRleHRNZW51Q2xpZW50LmgiCkBAIC04
OCw2ICs4OSw4IEBACiAjaW5jbHVkZSA8V2ViQ29yZS9IaXN0b3J5SXRlbS5oPgogI2luY2x1ZGUg
PFdlYkNvcmUvSGl0VGVzdFJlcXVlc3QuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0hpdFRlc3RSZXN1
bHQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0hUTUxNZWRpYUVsZW1lbnQuaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL0hUTUxOYW1lcy5oPgogI2luY2x1ZGUgPFdlYkNvcmUvSW50UmVjdC5oPgogI2luY2x1
ZGUgPFdlYkNvcmUvS2V5Ym9hcmRFdmVudC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvTGFuZ3VhZ2Uu
aD4KQEAgLTU2MjUsNiArNTYyOCw0MyBAQCBzdGF0aWMgS1VSTCB0b0tVUkwoQlNUUiBic3RyKQog
ICAgIHJldHVybiBLVVJMKEtVUkwoKSwgdG9TdHJpbmcoYnN0cikpOwogfQogCit2b2lkIFdlYlZp
ZXc6OmVudGVyRnVsbHNjcmVlbkZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBpZiAoIW5vZGUt
Pmhhc1RhZ05hbWUoV2ViQ29yZTo6SFRNTE5hbWVzOjp2aWRlb1RhZykpCisgICAgICAgIHJldHVy
bjsKKworICAgIEhUTUxNZWRpYUVsZW1lbnQqIHZpZGVvRWxlbWVudCA9IHN0YXRpY19jYXN0PEhU
TUxNZWRpYUVsZW1lbnQqPihub2RlKTsKKworICAgIGlmIChtX2Z1bGxzY3JlZW5Db250cm9sbGVy
KSB7CisgICAgICAgIGlmIChtX2Z1bGxzY3JlZW5Db250cm9sbGVyLT5tZWRpYUVsZW1lbnQoKSA9
PSB2aWRlb0VsZW1lbnQpIHsKKyAgICAgICAgICAgIC8vIFRoZSBiYWNrZW5kIG1heSBqdXN0IHdh
cm4gdXMgdGhhdCB0aGUgdW5kZXJsYXlpbmcgcGxhZnRvcm1Nb3ZpZSgpCisgICAgICAgICAgICAv
LyBoYXMgY2hhbmdlZC4gSnVzdCBmb3JjZSBhbiB1cGRhdGUuCisgICAgICAgICAgICBtX2Z1bGxz
Y3JlZW5Db250cm9sbGVyLT5zZXRNZWRpYUVsZW1lbnQodmlkZW9FbGVtZW50KTsKKyAgICAgICAg
ICAgIHJldHVybjsgLy8gTm8gbW9yZSB0byBkby4KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZp
cnN0IGV4aXQgRnVsbHNjcmVlbiBmb3IgdGhlIG9sZCBtZWRpYUVsZW1lbnQuCisgICAgICAgIG1f
ZnVsbHNjcmVlbkNvbnRyb2xsZXItPm1lZGlhRWxlbWVudCgpLT5leGl0RnVsbHNjcmVlbigpOwor
ICAgICAgICAvLyBUaGlzIHByZXZpb3VzIGNhbGwgaGFzIHRvIHRyaWdnZXIgZXhpdEZ1bGxzY3Jl
ZW4sCisgICAgICAgIC8vIHdoaWNoIGhhcyB0byBjbGVhciBtX2Z1bGxzY3JlZW5Db250cm9sbGVy
LgorICAgICAgICBBU1NFUlQoIW1fZnVsbHNjcmVlbkNvbnRyb2xsZXIpOworICAgIH0KKyAgICBp
ZiAoIW1fZnVsbHNjcmVlbkNvbnRyb2xsZXIpIHsKKyAgICAgICAgbV9mdWxsc2NyZWVuQ29udHJv
bGxlciA9IG5ldyBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKCk7CisgICAgICAgIG1fZnVsbHNj
cmVlbkNvbnRyb2xsZXItPnNldE1lZGlhRWxlbWVudCh2aWRlb0VsZW1lbnQpOworICAgICAgICBt
X2Z1bGxzY3JlZW5Db250cm9sbGVyLT5lbnRlckZ1bGxzY3JlZW4oKTsgICAgICAgIAorICAgIH0K
KyAgICBlbHNlCisgICAgICAgIG1fZnVsbHNjcmVlbkNvbnRyb2xsZXItPnNldE1lZGlhRWxlbWVu
dCh2aWRlb0VsZW1lbnQpOworfQorCit2b2lkIFdlYlZpZXc6OmV4aXRGdWxsc2NyZWVuKCkKK3sK
KyAgICBpZiAobV9mdWxsc2NyZWVuQ29udHJvbGxlcikKKyAgICAgICAgbV9mdWxsc2NyZWVuQ29u
dHJvbGxlci0+ZXhpdEZ1bGxzY3JlZW4oKTsKKyAgICBtX2Z1bGxzY3JlZW5Db250cm9sbGVyID0g
MDsKK30KKwogc3RhdGljIFBhc3NPd25QdHI8VmVjdG9yPFN0cmluZz4gPiB0b1N0cmluZ1ZlY3Rv
cih1bnNpZ25lZCBwYXR0ZXJuc0NvdW50LCBCU1RSKiBwYXR0ZXJucykKIHsKICAgICAvLyBDb252
ZXJ0IHRoZSBwYXR0ZXJucyBpbnRvIGEgVmVjdG9yLgpJbmRleDogV2ViS2l0L3dpbi9XZWJWaWV3
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJWaWV3LmgJKHJldmlzaW9uIDUyNzY4KQor
KysgV2ViS2l0L3dpbi9XZWJWaWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTM5LDggKzM5LDkgQEAK
ICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KIAotY2xh
c3MgV2ViRnJhbWU7CitjbGFzcyBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOwogY2xhc3MgV2Vi
QmFja0ZvcndhcmRMaXN0OworY2xhc3MgV2ViRnJhbWU7CiBjbGFzcyBXZWJJbnNwZWN0b3I7CiBj
bGFzcyBXZWJJbnNwZWN0b3JDbGllbnQ7CiAKQEAgLTg2OCw2ICs4NjksOSBAQCBwdWJsaWM6CiAg
ICAgdm9pZCBzZXRSb290Q2hpbGRMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUxheWVyKiBsYXllcik7
CiAjZW5kaWYKIAorICAgIHZvaWQgZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShXZWJDb3JlOjpOb2Rl
Kik7CisgICAgdm9pZCBleGl0RnVsbHNjcmVlbigpOworCiBwcml2YXRlOgogICAgIHZvaWQgc2V0
Wm9vbU11bHRpcGxpZXIoZmxvYXQgbXVsdGlwbGllciwgYm9vbCBpc1RleHRPbmx5KTsKICAgICBm
bG9hdCB6b29tTXVsdGlwbGllcihib29sIGlzVGV4dE9ubHkpOwpAQCAtOTgxLDYgKzk4NSw4IEBA
IHByb3RlY3RlZDoKICAgICBsb25nIG1feE92ZXJwYW47CiAgICAgbG9uZyBtX3lPdmVycGFuOwog
CisgICAgT3duUHRyPEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI+IG1fZnVsbHNjcmVlbkNvbnRy
b2xsZXI7CisKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAgYm9vbCBpc0Fj
Y2VsZXJhdGVkQ29tcG9zaXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2lzQWNjZWxlcmF0ZWRDb21w
b3NpdGluZzsgfQogICAgIHZvaWQgc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhib29sKTsKSW5k
ZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5jcHAJKHJl
dmlzaW9uIDUyNzY4KQorKysgV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGll
bnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8V2ViQ29y
ZS9GbG9hdFJlY3QuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lTG9hZFJlcXVlc3QuaD4KICNp
bmNsdWRlIDxXZWJDb3JlL0ZyYW1lVmlldy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvSFRNTE5hbWVz
Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Mb2NhbGl6ZWRTdHJpbmdzLmg+CiAjaW5jbHVkZSA8V2Vi
Q29yZS9Ob3RJbXBsZW1lbnRlZC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgpAQCAtNzcz
LDMgKzc3NCwyMyBAQCBDT01QdHI8SVdlYlVJRGVsZWdhdGU+IFdlYkNocm9tZUNsaWVudDo6CiAg
ICAgbV93ZWJWaWV3LT51aURlbGVnYXRlKCZkZWxlZ2F0ZSk7CiAgICAgcmV0dXJuIGRlbGVnYXRl
OwogfQorCisjaWYgRU5BQkxFKFZJREVPKQorCitib29sIFdlYkNocm9tZUNsaWVudDo6c3VwcG9y
dHNGdWxsc2NyZWVuRm9yTm9kZShjb25zdCBOb2RlKiBub2RlKQoreworICAgIHJldHVybiBub2Rl
LT5oYXNUYWdOYW1lKFdlYkNvcmU6OkhUTUxOYW1lczo6dmlkZW9UYWcpOworfQorCit2b2lkIFdl
YkNocm9tZUNsaWVudDo6ZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShOb2RlKiBub2RlKQoreworICAg
IG1fd2ViVmlldy0+ZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShub2RlKTsKK30KKwordm9pZCBXZWJD
aHJvbWVDbGllbnQ6OmV4aXRGdWxsc2NyZWVuRm9yTm9kZShOb2RlKikKK3sKKyAgICBtX3dlYlZp
ZXctPmV4aXRGdWxsc2NyZWVuKCk7Cit9CisKKyNlbmRpZgorCkluZGV4OiBXZWJLaXQvd2luL1dl
YkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4v
V2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmgJKHJldmlzaW9uIDUyNzY4KQorKysgV2Vi
S2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaAkod29ya2luZyBjb3B5KQpA
QCAtMTQ3LDYgKzE0NywxMiBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVxdWVzdEdl
b2xvY2F0aW9uUGVybWlzc2lvbkZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiwgV2ViQ29yZTo6R2Vv
bG9jYXRpb24qKTsKIAorI2lmIEVOQUJMRShWSURFTykKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9y
dHNGdWxsc2NyZWVuRm9yTm9kZShjb25zdCBXZWJDb3JlOjpOb2RlKik7CisgICAgdmlydHVhbCB2
b2lkIGVudGVyRnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIHZpcnR1YWwg
dm9pZCBleGl0RnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworI2VuZGlmCisKICNp
ZiBFTkFCTEUoTk9USUZJQ0FUSU9OUykKICAgICB2aXJ0dWFsIFdlYkNvcmU6Ok5vdGlmaWNhdGlv
blByZXNlbnRlciogbm90aWZpY2F0aW9uUHJlc2VudGVyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRl
cnByZXRfY2FzdDxXZWJDb3JlOjpOb3RpZmljYXRpb25QcmVzZW50ZXIqPihtX25vdGlmaWNhdGlv
bnNEZWxlZ2F0ZS5nZXQoKSk7IH0KICNlbmRpZgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNw
cm9qL1dlYktpdC52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9q
L1dlYktpdC52Y3Byb2oJKHJldmlzaW9uIDUyNzY4KQorKysgV2ViS2l0L3dpbi9XZWJLaXQudmNw
cm9qL1dlYktpdC52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTU4Miw2ICs1ODIsMTAgQEAKIAkJ
CQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRnVsbHNj
cmVlblZpZGVvQ29udHJvbGxlci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQog
CQkJCVJlbGF0aXZlUGF0aD0iLi5cTWFyc2hhbGxpbmdIZWxwZXJzLmgiDQogCQkJCT4NCiAJCQk8
L0ZpbGU+DQpAQCAtODk0LDYgKzg5OCwxMCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZp
bGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyLmNwcCIN
CisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1l
bW9yeVN0cmVhbS5jcHAiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpJbmRleDogV2ViS2l0L3dpbi9X
ZWJLaXQudmNwcm9qL2ZzVmlkZW9BdWRpb1ZvbHVtZUhpZ2gucG5nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQ2Fubm90
IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5cGUgPSBh
cHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFR
Q0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUF1SkFBQUxpUUUzeWN1dEFBQUsKVDJsRFExQlFhRzkw
YjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJ
RkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJ
YUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVF
ZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUIKZU5NTENBREFU
WnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFH
RExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZv
cEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzCkFNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FH
RElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFgKTGg0b3pr
a1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4
dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZl
TFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrCjVOaEt4RUpiWWNwWGZmNW53bC9BVi8x
cytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QKMHlM
RVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVS
TGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21T
Y1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBCkJoekJCZHpCQy94Z05vUkNKTVRD
UWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGgK
Q0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJO
VWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNH
b1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrClE4Y3d3T2dZQnpQRWJEQXV4
c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNG
aE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0Vv
OFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpH
dXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvClVzcHFTaG5sRU9VMDVR
WmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21n
WGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhs
M0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92Vktt
cXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iClUyZXBPNmlIcW1l
b2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhO
Mlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZL
M2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVC
eDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1CnArNllucjVl
Z0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4
VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxU
ZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMQptejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0
cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPCmswNnJu
dFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZ
ZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5W
T2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSQp2ZVJLZFBWeFhlRjYwdldkbTdPYnd1
Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCClo3
WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhO
dm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUx
QmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cApEb1ZRZnVqVzBBZGg1bUdMdzM0
TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVx
ClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2
eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0pu
SWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNQpoQ2Vwa0x4TURVemRtenFl
RnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkph
N09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZu
Ly90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZU
NnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZApUMWd2V2QrMVlmcUdu
UnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRw
YXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1Ax
U2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpm
dEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzUwpQVlJTajlZcjYw
Y094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdj
ZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllM
VGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8KMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBL
NGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMQplMmIzNlJ1
ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hm
OUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVH
RFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkKL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5
bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOApJSDhv
LzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUv
d0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmtsL0ZSZ0FBQVAxSlJFRlVlTnE4azlGTncwQVFS
R2VqL0RzZDJGUUFIVGdkMkZUZ2RBQWRVRUxvd0NXWURweFUKa0hUZ1VBRjA4UEtSUFdsbGJBY0pp
ZjNhbTd1ZDI1dlpNMEQvRWtBTDlFQVdzTm5ER1pDUHNFZGdBRTZKQk5CcXFsalNRVklSeUhwZgpQ
L214ajZXYlQ5eWlESGpuV0FXVWFSL1FHbmdMSEhXNEpYVlRtOWt6MEVsNk43TUg0Q0JwSitrbzVx
TUVjdUFMYUR4UCtJdnI4Vk9ECkdHYjJLZWxWMHM3emk2U3RwSFBTYVBVTEJ3c3ZsS1NOcE8rNHVi
N2pmZVlkYkYzVWpUdFVleGVUdzBKMHdaMUo3dlNPRGNCK2NwQUMKU2JSeGNERnpGeERQRjhjMkVq
VGVSZVhGKzhWUkR1L1hpQVNndmZzWFpnZ3JvQmxoc3I5KzUrc0FzNDQzQlU5OVhlSUFBQUFBU1VW
TwpSSzVDWUlJPQoKSW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9mc1ZpZGVvQXVkaW9W
b2x1bWVMb3cucG5nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEg
YmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlW
Qk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUF1
SkFBQUxpUUUzeWN1dEFBQUsKVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhq
YW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNF
UlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhY
ClB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6
L1NNQkFQaCtQRHdySXNBSHZnQUIKZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhM
Q0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3
QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklB
TEMzCkFNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FB
QUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFgKTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4
OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBm
dEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtM
bloyZVhrCjVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dz
ejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlV
S1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4
SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JC
QkcvVEJHQ3pBCkJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21B
djFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxn
ampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBF
N3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcy
b2VmUXEyZ1AybzgrClE4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdE
dTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhD
SnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214
cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4
bHNLbldKQWNhVDRVK0lvClVzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0
bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBS
K2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpE
NWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0x
UGpxUW5VbHF0VnFwMVE2MU1iClUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NW
L2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00x
ZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxp
cgpTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHha
TlBUcjFyaTZxYTZVYm9idEVkNzl1CnArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9W
SERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlW
R2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxO
MXBrMQptejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZ
VlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPCmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIy
ZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1
UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytM
cHNieHQzSQp2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnow
TVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5
ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJa
d09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJT
SDM1NWpPa2M1cApEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNF
TnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4
dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJ
aE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pH
OE5Ya2t4VE9sTE9XNQpoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpP
MlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21k
bFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdv
NXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZy
Nnd0VkN1V0ZmZXZjMSsxZApUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2
eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hi
TDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcK
dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4
d1BTQS8wSEl3NjIxN25VMVIzUwpQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndS
SG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dysw
ZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUy
UE8KMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9w
UFRUOGU3bkx1YXJybGNhN251ZXIyMQplMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIv
ZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdI
ZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlh
ZUYvNmkKL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhn
ek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dN
ekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJk
dmtsL0ZSZ0FBQUl4SlJFRlVlTnJVaytFSndqQVVoQy9TLzQ1UU43QWJ4QTEwQTBmb0NoM0ZUVHBD
WGNVSlB2ODgKNUJGNUtTUWdlQkM0SkhlWGhDTUpVQThPNmtSM2dJRFBDUGJ2UUE0OXRRQXoweFRn
ekFBWkdJRnpOWUFZR1ppTlg1c0M3R1NBMVh0KwpWeU13R24zNjlhSFFMWTdmSkUxdWZwTDBLRFRW
Rm83QXRsZGorSVNVMGt2U3BienlsKzcvUDlON0FHR1I5cHZCWEkrNUFBQUFBRWxGClRrU3VRbUND
CgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9FeGl0RnVsbHNjcmVlbi5w
bmcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlw
ZS4Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKaVZCT1J3MEtHZ29B
QUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXVKQUFBTGlRRTN5
Y3V0QUFBSwpUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBG
ajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVCmtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdp
QU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFgKUHVlczg1Mnp6
d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BE
d3JJc0FIdmdBQgplTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmpr
S21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0CkFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFh
Q1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzMKQU1ET0VB
dXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNR
NVJZRmJDQzF4QjFkWApMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJI
Z2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArCjVjK3JjRUFBQU9GMGZ0SCtMQyt6R29B
N0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGsKNU5o
S3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlK
aEdMYzVvOUgvTGNMLy93ZAoweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlr
NHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBCjR2Y0FBUEs3YjhIVUtBZ0RnR2lE
NGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekEK
Qmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJh
SWFUY0E0dXdsVzREajF3RC9waApDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJ
Y0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1CmgxeEd1cEU3eUFBeWd2eUd2
RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJv
OCsKUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3
UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTQpXRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpy
b1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RCkFrbXhwRlRTRXRKRzBt
NVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FU
NFUrSW8KVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpS
MW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcApyK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3
TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaCkQ1bHZWVmdxdGlw
OEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRW
cXAxUTYxTWIKVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1a
czNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WQovUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhI
NDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyClNLdFJxMGZy
dlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFh
NlVib2J0RWQ3OXUKcCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tC
dHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaApsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdY
T01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxCm16MHgx
ekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5h
MGwxcnV0dTZjUnA3bE8KazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4
V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeQpGRHBXT3Q2YXpwenVQMzNGOUpicEwy
ZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJCnZl
UktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRF
L0M1K1ZNR3Zmckg1UFEwK0IKWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3
MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLwowUUNuZ0NVQlp3T0pnVUdCV3dM
NytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVw
CkRvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpF
M3B0bk1VODVyeTFLTlNvK3FpNXEKUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVz
dnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJcwpPcFpBVEloT09KVHdRUkFx
cUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xM
T1c1CmhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5
NnhsaGJMK3hXNkx0eThlbFFmSmE3T1EKckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktP
WmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOQpyR281c2p4eGVkc0s0
eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZl
dmMxKzFkClQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFh
dkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVgKRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3
WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0Nwp2UFkwN05YYlc3
ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2
MjE3blUxUjNTClBWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9j
ZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2EKUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4Ujlz
ZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTwozMm9QYisr
NkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVh
cnJsY2E3bnVlcjIxCmUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDEr
Y2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlYKUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NH
aFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aQovc3V1
RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3
WGZjZHgzdm85OFBUK1I4CklIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZ
MGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHEKWUFBQU9wZ0FBQmR2a2wvRlJnQUFB
S2RKUkVGVWVOcWtrOUVOd2pBTVJKOGovc01Jak5BTnlnaHNnTmlFRWRpZzNhVGRJTmtFbU9ENApJ
SlZLQk1odDc4ZVNyYnhJNTdOSllwTWtKYjJWSk1WWi8rd0Z6SlVrUlVtZHBNRUxHQ3JJdlZRWElB
QW5JTTk2K3lVV0JETjdBa2ZnCnNjYkRVT3B0NmMrVGRzWHRBekJXcyt3Qm1NUGtDRFEveHRtenBW
YmYxWG5YM1A1N0hGWUd1SmxTdXhvQWpKTGlFa0JmbWRZQVZ5K2cKTjdOTENkeUg4N2IxbkY4REFM
MThsNGhCOEQrL0FBQUFBRWxGVGtTdVFtQ0MKCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3By
b2ovZnNWaWRlb1BhdXNlLnBuZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkNhbm5vdCBkaXNwbGF5OiBmaWxlIG1hcmtl
ZCBhcyBhIGJpbmFyeSB0eXBlLgpzdm46bWltZS10eXBlID0gYXBwbGljYXRpb24vb2N0ZXQtc3Ry
ZWFtCgppVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmtBQUFBWkNBWUFBQURFNllWakFBQUFDWEJJ
V1hNQUFBdUpBQUFMaVFFM3ljdXRBQUFLClQybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpw
YkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVUKa1NZcUlRa1FTb2do
b2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5
K2JOL3JYWApQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFF
QWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCCmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VB
Y0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXQKQUdBbmYrYlRB
SUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFE
QkpWMlpJQUxDMwpBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhT
dXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYCkxoNG96a2tYS3hRMllRSmhta0F1d25tWkdU
S0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCsKNWMrcmNF
QUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0
OFBFV2hrTG5aMmVYawo1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlG
SEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkCjB5TEVTV0s1V0NvVTQxRVNjWTVFbW96
ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEEKNHZj
QUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFB
UktDQktyQkJHL1RCR0N6QQpCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlH
emJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoCkNKN0JLTHlCQ1FSQnlBZ1RZU0hh
aUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTUK
aDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFj
clFhUFl3Mm9lZlFxMmdQMm84KwpROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4
aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNCldFN1lTS2dnSENRMEVkb0pO
d2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3
bVEKQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVE
UGtHK1FoOGxzS25XSkFjYVQ0VStJbwpVc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5Z
OWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwCnIraDB1aEhkbFI1T2w5
Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpI
cm1PZVoKRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxO
OXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYgpVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5
RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZCi9SMjdpejJxcWFF
NVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhy
cXBhWGxsaXIKU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxU
M2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dQpwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFV
L1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZoCmxXR1g0WVNS
dWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14
ODNNemFMTjFwazEKbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVo
Vm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsTwprMDZybnRabnc3RHh0c20ycWJjWnNPWFlC
dHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5CkZEcFdP
dDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0
TExMcGMrTHBzYnh0M0kKdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55
bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQgpaN1huSXk5akw1RlhyZGV3dDZWM3F2
ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvCjBR
Q25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNG
b3lPeVFyU0gzNTVqT2tjNXAKRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRH
WE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cQpQTm8zdWpTNlA4WXVabG5NMVZp
ZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElz
Ck9wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dx
VFhxUzdKRzhOWGtreFRPbExPVzUKaENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4
UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUQpyQVZaTFFxMlFxYm9WRm9v
MXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRX
T2E5CnJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5
b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWQKVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28z
SGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWApEbTROMmRxMERkOVd0
TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtH
N1I3aHQ3CnZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhh
MU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1MKUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpa
ekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYQpScHRUbXZ0Ylls
dTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dE
Ym9yWjc1MlBPCjMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIz
cWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjEKZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1Qz
ZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVgpQMXYrM05q
djNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2Znlu
UTg5a3p5YWVGLzZpCi9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJD
eGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjgKSUg4by8yajVzZlZUMEtmN2t4bVRrLzhF
QTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcQpZQUFB
T3BnQUFCZHZrbC9GUmdBQUFEdEpSRUZVZU5yc3pTRU9BQ0FReE1DRmo5L1RpOGNjQm9Kb2ZUTUJR
bDlsQzZpREwwQm1IaVFpCklpSWlJaUlpOGpjeWdPdklBZ0FBLy84REFKUkFVdHg1ZFdOOUFBQUFB
RWxGVGtTdVFtQ0MKCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRlb1BsYXku
cG5nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5
cGUuCnN2bjptaW1lLXR5cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9SdzBLR2dv
QUFBQU5TVWhFVWdBQUFCa0FBQUFaQ0FZQUFBREU2WVZqQUFBQUNYQklXWE1BQUF1SkFBQUxpUUUz
eWN1dEFBQUsKVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBw
RmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGln
aUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1ZXM4NTJ6
endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQ
RHdySXNBSHZnQUIKZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZq
a0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZB
YUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzCkFNRE9F
QXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVT
UTVSWUZiQ0MxeEIxZFgKTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZS
SGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgrTEMrekdv
QTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrCjVO
aEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJ
SmhHTGM1bzlIL0xjTC8vd2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5
azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVLQWdEZ0dp
RDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pB
CkJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJS
YUlhVGNBNHV3bFc0RGoxd0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0
SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lBQXlndnlH
dkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1Ay
bzgrClE4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hk
d1FTZ1VYQUNUWUVkMElnWVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBK
cm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZUU0V0Skcw
bTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNh
VDRVK0lvClVzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6
UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3
d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2VlZncXRp
cDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0
VnFwMVE2MU1iClUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJN
WnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4
SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpTS3RScTBm
cnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZx
YTZVYm9idEVkNzl1CnArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3dr
QnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25H
WE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMQptejB4
MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRu
YTBsMXJ1dHU2Y1JwN2xPCmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50
OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMzRjlKYnBM
MmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSQp2
ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVk
RS9DNStWTUd2ZnJINVBRMCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6
dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJad09KZ1VHQld3
TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1
cApEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2Ukpa
RTNwdG5NVTg1cnkxS05TbytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01
c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9PSlR3UVJB
cXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9s
TE9XNQpoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoy
eTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5L
T1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNqeHhlZHNL
NHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0Zm
ZXZjMSsxZApUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBx
YXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdn
N1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZMDdOWGJX
N3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3
NjIxN25VMVIzUwpQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMv
Y2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5
c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8KMzJvUGIr
KzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1
YXJybGNhN251ZXIyMQplMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQx
K2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4OUhjUi9j
R2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkKL3N1
dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0
d1hmY2R4M3ZvOThQVCtSOApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFn
WTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmtsL0ZSZ0FB
QUlWSlJFRlVlTnJVMWRFTmdDQU1oT0hxQW83b0tJN0tDSTd3KzJSRUlnWm96OFFib0Y5UzREQmcK
QnpaZ01VRUFNNjVJc0JLUllEVWt4MVkxY2laNXNGYkVoZlVpUTlnbzBvVjVrU1lzQ25uRm9wRkhU
SVhjTU1CbSt5Si9XNWYwNEtWWApXUG9ZcGJVaUxVaHAxU2ZscHhVeXZJYUVEaThSeWZBY21RQjVk
UjBBQUFELy93TUFpMEM3L0lvUFhTc0FBQUFBU1VWT1JLNUNZSUk9Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45933</attachid>
            <date>2010-01-05 15:00:01 -0800</date>
            <delta_ts>2010-01-06 18:10:45 -0800</delta_ts>
            <desc>Replacement patch</desc>
            <filename>31318.patch</filename>
            <type>text/plain</type>
            <size>70547</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1Mjc2OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMTAtMDEtMDQgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIElt
cGxlbWVudCBmdWxsLXNjcmVlbiB2aWRlbyBmb3IgV2luZG93cworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEzMTgKKyAgICAgICAgCisgICAgICAgIFRo
aXMgaXMgbW9zdGx5IHN1cHBvcnQgbG9naWMgZm9yIHRha2luZyB2aWRlbworICAgICAgICBpbnRv
IGFuZCBvdXQgb2YgZnVsbC1zY3JlZW4uIEl0IGFsc28gY29udGFpbnMgdGhlCisgICAgICAgIFFU
TW92aWVXaW4gcGllY2Ugd2hpY2ggYWRkcyBzdXBwb3J0IGZvciB0aGUgYWN0dWFsCisgICAgICAg
IGZ1bGwtc2NyZWVuIHdpbmRvdyBpdHNlbGYuIEV2ZW50cyBmcm9tIHRoZSB3aW5kb3cKKyAgICAg
ICAgYXJlIHNlbnQgdG8gdGhlIEZ1bGxzY3JlZW5WaWRlb3NDb250cm9sbGVyIGZvciBoYW5kbGlu
Zy4KKworICAgICAgICAqIGxvYWRlci9GcmFtZUxvYWRlci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpGcmFtZUxvYWRlcjo6YWRkRGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L01lZGlhUGxheWVyUHJpdmF0ZVF1aWNrVGltZVdpbi5oOgorICAgICAgICAoV2ViQ29yZTo6TWVk
aWFQbGF5ZXJQcml2YXRlOjpzdXBwb3J0c0Z1bGxzY3JlZW4pOgorICAgICAgICAoV2ViQ29yZTo6
TWVkaWFQbGF5ZXJQcml2YXRlOjpwbGF0Zm9ybU1lZGlhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW4vUVRNb3ZpZVdpbi5jcHA6CisgICAgICAgIChRVE1vdmllV2luUHJpdmF0ZTo6
UVRNb3ZpZVdpblByaXZhdGUpOgorICAgICAgICAoUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1aWNr
VGltZSk6CisgICAgICAgIChRVE1vdmllV2luOjpfaGFuZGxlTWVzc2FnZXMpOgorICAgICAgICAo
UVRNb3ZpZVdpbjo6ZW50ZXJGdWxsc2NyZWVuKToKKyAgICAgICAgKFFUTW92aWVXaW46OmV4aXRG
dWxsc2NyZWVuKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vUVRNb3ZpZVdpbi5o
OgorCiAyMDEwLTAxLTA0ICBLZXZpbiBPbGxpdmllciAgPGtldmlub0B0aGVvbGxpdmllcnMuY29t
PgogCiAgICAgICAgIFt3eF0gQnVpbGQgZml4LCBhZGQgYSBjb3VwbGUgaW5jbHVkZSBkaXJzIHRv
IHRoZSBidWlsZC4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL01lZGlhUGxh
eWVyUHJpdmF0ZVF1aWNrVGltZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmNwcAkocmV2aXNp
b24gNTI3NjgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXllclBy
aXZhdGVRdWlja1RpbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04OCw2ICs4OCwxOCBAQCBN
ZWRpYVBsYXllclByaXZhdGU6On5NZWRpYVBsYXllclByaXZhdGUoCiB7CiB9CiAKK2Jvb2wgTWVk
aWFQbGF5ZXJQcml2YXRlOjpzdXBwb3J0c0Z1bGxzY3JlZW4oKSBjb25zdAoreworICAgIHJldHVy
biB0cnVlOworfQorCitQbGF0Zm9ybU1lZGlhIE1lZGlhUGxheWVyUHJpdmF0ZTo6cGxhdGZvcm1N
ZWRpYSgpIGNvbnN0Cit7CisgICAgUGxhdGZvcm1NZWRpYSBwOworICAgIHAucXRNb3ZpZSA9IHJl
aW50ZXJwcmV0X2Nhc3Q8UVRNb3ZpZSo+KG1fcXRNb3ZpZS5nZXQoKSk7CisgICAgcmV0dXJuIHA7
Cit9CisKIGNsYXNzIFRhc2tUaW1lciA6IFRpbWVyQmFzZSB7CiBwdWJsaWM6CiAgICAgc3RhdGlj
IHZvaWQgaW5pdGlhbGl6ZSgpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4v
TWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgJKHJl
dmlzaW9uIDUyNzY4KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5
ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTUzLDYgKzUzLDkgQEAg
cHVibGljOgogcHJpdmF0ZToKICAgICBNZWRpYVBsYXllclByaXZhdGUoTWVkaWFQbGF5ZXIqKTsK
IAorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Z1bGxzY3JlZW4oKSBjb25zdDsKKyAgICB2aXJ0
dWFsIFBsYXRmb3JtTWVkaWEgcGxhdGZvcm1NZWRpYSgpIGNvbnN0OworCiAgICAgSW50U2l6ZSBu
YXR1cmFsU2l6ZSgpIGNvbnN0OwogICAgIGJvb2wgaGFzVmlkZW8oKSBjb25zdDsKICAgICBib29s
IGhhc0F1ZGlvKCkgY29uc3Q7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9R
VE1vdmllV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9RVE1vdmllV2luLmNwcAkocmV2aXNpb24gNTI3NjgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsMTggKzI0LDE1
IEBACiAgKi8KICNpbmNsdWRlICJjb25maWcuaCIKIAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQog
I2luY2x1ZGUgIlFUTW92aWVXaW4uaCIKIAogLy8gUHV0IE1vdmllcy5oIGZpcnN0IHNvIGJ1aWxk
IGZhaWx1cmVzIGhlcmUgcG9pbnQgY2xlYXJseSB0byBRdWlja1RpbWUKICNpbmNsdWRlIDxNb3Zp
ZXMuaD4KLSNpbmNsdWRlIDxRdWlja1RpbWVDb21wb25lbnRzLmg+Ci0jaW5jbHVkZSA8R1hNYXRo
Lmg+Ci0jaW5jbHVkZSA8UVRNTC5oPgogCiAjaW5jbHVkZSAiUVRNb3ZpZVdpblRpbWVyLmgiCi0K
KyNpbmNsdWRlIDxHWE1hdGguaD4KKyNpbmNsdWRlIDxRVE1MLmg+CisjaW5jbHVkZSA8UXVpY2tU
aW1lQ29tcG9uZW50cy5oPgogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CiAjaW5jbHVkZSA8
d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KQEAgLTEzMCw2ICsx
MjcsMTEgQEAgcHVibGljOgogI2lmICFBU1NFUlRfRElTQUJMRUQKICAgICBib29sIG1fc2NhbGVD
YWNoZWQ7CiAjZW5kaWYKKyAgICBXaW5kb3dQdHIgbV9mdWxsc2NyZWVuV2luZG93OworICAgIEdX
b3JsZFB0ciBtX2Z1bGxzY3JlZW5PcmlnR1dvcmxkOworICAgIFJlY3QgbV9mdWxsc2NyZWVuUmVj
dDsKKyAgICBRVE1vdmllV2luRnVsbHNjcmVlbkNsaWVudCogbV9mdWxsc2NyZWVuQ2xpZW50Owor
ICAgIGNoYXIqIG1fZnVsbHNjcmVlblJlc3RvcmVTdGF0ZTsKIH07CiAKIFFUTW92aWVXaW5Qcml2
YXRlOjpRVE1vdmllV2luUHJpdmF0ZSgpCkBAIC0xNTksMTEgKzE2MSwxNyBAQCBRVE1vdmllV2lu
UHJpdmF0ZTo6UVRNb3ZpZVdpblByaXZhdGUoKQogI2lmICFBU1NFUlRfRElTQUJMRUQKICAgICAs
IG1fc2NhbGVDYWNoZWQoZmFsc2UpCiAjZW5kaWYKKyAgICAsIG1fZnVsbHNjcmVlbldpbmRvdygw
KQorICAgICwgbV9mdWxsc2NyZWVuT3JpZ0dXb3JsZCgwKQorICAgICwgbV9mdWxsc2NyZWVuQ2xp
ZW50KDApCisgICAgLCBtX2Z1bGxzY3JlZW5SZXN0b3JlU3RhdGUoMCkKIHsKIH0KIAogUVRNb3Zp
ZVdpblByaXZhdGU6On5RVE1vdmllV2luUHJpdmF0ZSgpCiB7CisgICAgQVNTRVJUKCFtX2Z1bGxz
Y3JlZW5XaW5kb3cpOworCiAgICAgZW5kVGFzaygpOwogICAgIGlmIChtX2dXb3JsZCkKICAgICAg
ICAgZGVsZXRlR1dvcmxkKCk7CkBAIC0zNTksNyArMzY3LDcgQEAgdm9pZCBRVE1vdmllV2luUHJp
dmF0ZTo6Y3JlYXRlR1dvcmxkKCkKICAgICBib3VuZHMubGVmdCA9IDA7IAogICAgIGJvdW5kcy5y
aWdodCA9IG1fZ1dvcmxkV2lkdGg7CiAgICAgYm91bmRzLmJvdHRvbSA9IG1fZ1dvcmxkSGVpZ2h0
OwotICAgIE9TRXJyIGVyciA9IFFUTmV3R1dvcmxkKCZtX2dXb3JsZCwgazMyQkdSQVBpeGVsRm9y
bWF0LCAmYm91bmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsgCisgICAgT1NFcnIgZXJyID0gUVROZXdH
V29ybGQoJm1fZ1dvcmxkLCBrMzJCR1JBUGl4ZWxGb3JtYXQsICZib3VuZHMsIDAsIDAsIDApOyAK
ICAgICBpZiAoZXJyKSAKICAgICAgICAgcmV0dXJuOwogICAgIEdldE1vdmllR1dvcmxkKG1fbW92
aWUsICZtX3NhdmVkR1dvcmxkLCAwKTsKQEAgLTcyOSw3ICs3MzcsNyBAQCB2b2lkIFFUTW92aWVX
aW46OmxvYWQoQ0ZVUkxSZWYgdXJsLCBib29sCiAgICAgbW92aWVQcm9wQ291bnQrKzsgCiAKICAg
ICBBU1NFUlQobW92aWVQcm9wQ291bnQgPD0gc2l6ZW9mKG1vdmllUHJvcHMpL3NpemVvZihtb3Zp
ZVByb3BzWzBdKSk7Ci0gICAgbV9wcml2YXRlLT5tX2xvYWRFcnJvciA9IE5ld01vdmllRnJvbVBy
b3BlcnRpZXMobW92aWVQcm9wQ291bnQsIG1vdmllUHJvcHMsIDAsIE5VTEwsICZtX3ByaXZhdGUt
Pm1fbW92aWUpOworICAgIG1fcHJpdmF0ZS0+bV9sb2FkRXJyb3IgPSBOZXdNb3ZpZUZyb21Qcm9w
ZXJ0aWVzKG1vdmllUHJvcENvdW50LCBtb3ZpZVByb3BzLCAwLCAwLCAmbV9wcml2YXRlLT5tX21v
dmllKTsKIAogZW5kOgogICAgIG1fcHJpdmF0ZS0+c3RhcnRUYXNrKCk7CkBAIC05NTMsNyArOTYx
LDcgQEAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVN1cHBvcnRlZFR5cGVzKCkgCiAgICAgICAgICAg
ICAgICAgY29udGludWU7CiAgICAgICAgICAgICBpZiAoIShpbmZvQ0QuY29tcG9uZW50RmxhZ3Mg
JiBoYXNNb3ZpZUltcG9ydE1JTUVMaXN0KSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgIFFUQXRvbUNvbnRhaW5lciBtaW1lTGlzdCA9IE5VTEw7CisgICAgICAgICAgICBR
VEF0b21Db250YWluZXIgbWltZUxpc3QgPSAwOwogICAgICAgICAgICAgZXJyID0gTW92aWVJbXBv
cnRHZXRNSU1FVHlwZUxpc3QoKENvbXBvbmVudEluc3RhbmNlKWNvbXAsICZtaW1lTGlzdCk7CiAg
ICAgICAgICAgICBpZiAoZXJyIHx8ICFtaW1lTGlzdCkKICAgICAgICAgICAgICAgICBjb250aW51
ZTsKQEAgLTk2Miw3ICs5NzAsNyBAQCBzdGF0aWMgdm9pZCBpbml0aWFsaXplU3VwcG9ydGVkVHlw
ZXMoKSAKICAgICAgICAgICAgIFFUTG9ja0NvbnRhaW5lcihtaW1lTGlzdCk7CiAgICAgICAgICAg
ICBpbnQgdHlwZUNvdW50ID0gUVRDb3VudENoaWxkcmVuT2ZUeXBlKG1pbWVMaXN0LCBrUGFyZW50
QXRvbUlzQ29udGFpbmVyLCBrTWltZUluZm9NaW1lVHlwZVRhZyk7CiAgICAgICAgICAgICBmb3Ig
KGludCB0eXBlSW5kZXggPSAxOyB0eXBlSW5kZXggPD0gdHlwZUNvdW50OyB0eXBlSW5kZXgrKykg
ewotICAgICAgICAgICAgICAgIFFUQXRvbSBtaW1lVGFnID0gUVRGaW5kQ2hpbGRCeUluZGV4KG1p
bWVMaXN0LCAwLCBrTWltZUluZm9NaW1lVHlwZVRhZywgdHlwZUluZGV4LCBOVUxMKTsKKyAgICAg
ICAgICAgICAgICBRVEF0b20gbWltZVRhZyA9IFFURmluZENoaWxkQnlJbmRleChtaW1lTGlzdCwg
MCwga01pbWVJbmZvTWltZVR5cGVUYWcsIHR5cGVJbmRleCwgMCk7CiAgICAgICAgICAgICAgICAg
aWYgKCFtaW1lVGFnKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAg
ICAgICBjaGFyKiBhdG9tRGF0YTsKQEAgLTk4MCw3ICs5ODgsNyBAQCBzdGF0aWMgdm9pZCBpbml0
aWFsaXplU3VwcG9ydGVkVHlwZXMoKSAKICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcCh0eXBl
QnVmZmVyLCAiYXVkaW8vIiwgNikgJiYgc3RybmNtcCh0eXBlQnVmZmVyLCAidmlkZW8vIiwgNikp
CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICAgICAgQ0ZTdHJp
bmdSZWYgY2ZNaW1lVHlwZSA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoTlVMTCwgdHlwZUJ1
ZmZlciwga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKKyAgICAgICAgICAgICAgICBDRlN0cmluZ1Jl
ZiBjZk1pbWVUeXBlID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZygwLCB0eXBlQnVmZmVyLCBr
Q0ZTdHJpbmdFbmNvZGluZ1VURjgpOwogICAgICAgICAgICAgICAgIGlmICghY2ZNaW1lVHlwZSkK
ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKQEAgLTEwNDAsNyArMTA0OCw3IEBAIGJv
b2wgUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1aWNrVGltZSgpIAogICAgIGlmICghaW5pdGlhbGl6
ZWQpIHsKICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAvLyBJbml0aWFsaXpl
IGFuZCBjaGVjayBRdWlja1RpbWUgdmVyc2lvbgotICAgICAgICBPU0VyciByZXN1bHQgPSBJbml0
aWFsaXplUVRNTCgwKTsKKyAgICAgICAgT1NFcnIgcmVzdWx0ID0gSW5pdGlhbGl6ZVFUTUwoa0lu
aXRpYWxpemVRVE1MRW5hYmxlRG91YmxlQnVmZmVyZWRTdXJmYWNlKTsKICAgICAgICAgaWYgKHJl
c3VsdCA9PSBub0VycikKICAgICAgICAgICAgIHJlc3VsdCA9IEdlc3RhbHQoZ2VzdGFsdFF1aWNr
VGltZSwgJnF1aWNrVGltZVZlcnNpb24pOwogICAgICAgICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7
CkBAIC0xMDU4LDE1ICsxMDY2LDc0IEBAIGJvb2wgUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1aWNr
VGltZSgpIAogICAgIHJldHVybiBpbml0aWFsaXphdGlvblN1Y2NlZWRlZDsKIH0KIAorTFJFU1VM
VCBRVE1vdmllV2luOjpmdWxsc2NyZWVuV25kUHJvYyhIV05EIHduZCwgVUlOVCBtZXNzYWdlLCBV
SU5UIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgUVRNb3ZpZVdpbiogbW92aWUgPSByZWlu
dGVycHJldF9jYXN0PFFUTW92aWVXaW4qPihHZXRXaW5kb3dMb25nUHRyKHduZCwgR1dMX1VTRVJE
QVRBKSk7CisgICAgcmV0dXJuIG1vdmllLT5tX3ByaXZhdGUtPm1fZnVsbHNjcmVlbkNsaWVudC0+
ZnVsbHNjcmVlbkNsaWVudFduZFByb2Mod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cit9
CisKK0hXTkQgUVRNb3ZpZVdpbjo6ZW50ZXJGdWxsc2NyZWVuKFFUTW92aWVXaW5GdWxsc2NyZWVu
Q2xpZW50KiBjbGllbnQpCit7CisgICAgbV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5DbGllbnQgPSBj
bGllbnQ7CisgICAgCisgICAgQmVnaW5GdWxsU2NyZWVuKCZtX3ByaXZhdGUtPm1fZnVsbHNjcmVl
blJlc3RvcmVTdGF0ZSwgMCwgMCwgMCwgJm1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93LCAw
LCBmdWxsU2NyZWVuQWxsb3dFdmVudHMpOyAKKyAgICBRVE1MU2V0V2luZG93V25kUHJvYyhtX3By
aXZhdGUtPm1fZnVsbHNjcmVlbldpbmRvdywgZnVsbHNjcmVlblduZFByb2MpOworICAgIENyZWF0
ZVBvcnRBc3NvY2lhdGlvbihHZXRQb3J0TmF0aXZlV2luZG93KG1fcHJpdmF0ZS0+bV9mdWxsc2Ny
ZWVuV2luZG93KSwgMCwgMEwpOworCisgICAgR2V0TW92aWVCb3gobV9wcml2YXRlLT5tX21vdmll
LCAmbV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5SZWN0KTsKKyAgICBHZXRNb3ZpZUdXb3JsZChtX3By
aXZhdGUtPm1fbW92aWUsICZtX3ByaXZhdGUtPm1fZnVsbHNjcmVlbk9yaWdHV29ybGQsIDApOwor
ICAgIFNldE1vdmllR1dvcmxkKG1fcHJpdmF0ZS0+bV9tb3ZpZSwgKENHcmFmUHRyKW1fcHJpdmF0
ZS0+bV9mdWxsc2NyZWVuV2luZG93LCBHZXRHV29ybGREZXZpY2UoKENHcmFmUHRyKW1fcHJpdmF0
ZS0+bV9mdWxsc2NyZWVuV2luZG93KSk7CisKKyAgICAvLyBTZXQgdGhlIHNpemUgb2YgdGhlIGJv
eCB0byBwcmVzZXJ2ZSBhc3BlY3QgcmF0aW8KKyAgICBSZWN0IHJlY3QgPSBtX3ByaXZhdGUtPm1f
ZnVsbHNjcmVlbldpbmRvdy0+cG9ydFJlY3Q7CisKKyAgICBmbG9hdCBtb3ZpZVJhdGlvID0gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KG1fcHJpdmF0ZS0+bV93aWR0aCkgLyBtX3ByaXZhdGUtPm1faGVpZ2h0
OworICAgIGludCB3aW5kb3dXaWR0aCA9ICByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworICAgIGlu
dCB3aW5kb3dIZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOworICAgIGZsb2F0IHdpbmRv
d1JhdGlvID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpbmRvd1dpZHRoKSAvIHdpbmRvd0hlaWdodDsK
KyAgICBpbnQgYWN0dWFsV2lkdGggPSAod2luZG93UmF0aW8gPiBtb3ZpZVJhdGlvKSA/ICh3aW5k
b3dIZWlnaHQgKiBtb3ZpZVJhdGlvKSA6IHdpbmRvd1dpZHRoOworICAgIGludCBhY3R1YWxIZWln
aHQgPSAod2luZG93UmF0aW8gPCBtb3ZpZVJhdGlvKSA/ICh3aW5kb3dXaWR0aCAvIG1vdmllUmF0
aW8pIDogd2luZG93SGVpZ2h0OworICAgIGludCBvZmZzZXRYID0gKHdpbmRvd1dpZHRoIC0gYWN0
dWFsV2lkdGgpIC8gMjsKKyAgICBpbnQgb2Zmc2V0WSA9ICh3aW5kb3dIZWlnaHQgLSBhY3R1YWxI
ZWlnaHQpIC8gMjsKKworICAgIHJlY3QubGVmdCA9IG9mZnNldFg7CisgICAgcmVjdC5yaWdodCA9
IG9mZnNldFggKyBhY3R1YWxXaWR0aDsKKyAgICByZWN0LnRvcCA9IG9mZnNldFk7CisgICAgcmVj
dC5ib3R0b20gPSBvZmZzZXRZICsgYWN0dWFsSGVpZ2h0OworCisgICAgU2V0TW92aWVCb3gobV9w
cml2YXRlLT5tX21vdmllLCAmcmVjdCk7CisgICAgU2hvd0hpZGVUYXNrQmFyKHRydWUpOworCisg
ICAgLy8gU2V0IHRoZSAndGhpcycgcG9pbnRlciBvbiB0aGUgSFdORAorICAgIEhXTkQgd25kID0g
c3RhdGljX2Nhc3Q8SFdORD4oR2V0UG9ydE5hdGl2ZVdpbmRvdyhtX3ByaXZhdGUtPm1fZnVsbHNj
cmVlbldpbmRvdykpOworICAgIFNldFdpbmRvd0xvbmdQdHIod25kLCBHV0xfVVNFUkRBVEEsIChM
T05HKXRoaXMpOworCisgICAgcmV0dXJuIHduZDsKK30KKwordm9pZCBRVE1vdmllV2luOjpleGl0
RnVsbHNjcmVlbigpCit7CisgICAgaWYgKCFtX3ByaXZhdGUtPm1fZnVsbHNjcmVlbldpbmRvdykK
KyAgICAgICAgcmV0dXJuOworCisgICAgSFdORCB3bmQgPSAoSFdORCkgR2V0UG9ydE5hdGl2ZVdp
bmRvdyhtX3ByaXZhdGUtPm1fZnVsbHNjcmVlbldpbmRvdyk7CisgICAgU2V0V2luZG93TG9uZ1B0
cih3bmQsIEdXTF9VU0VSREFUQSwgMCk7CisgICAgRGVzdHJveVBvcnRBc3NvY2lhdGlvbigoQ0dy
YWZQdHIpIG1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93KTsKKyAgICBTZXRNb3ZpZUdXb3Js
ZChtX3ByaXZhdGUtPm1fbW92aWUsIG1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuT3JpZ0dXb3JsZCwg
MCk7CisgICAgRW5kRnVsbFNjcmVlbihtX3ByaXZhdGUtPm1fZnVsbHNjcmVlblJlc3RvcmVTdGF0
ZSwgMEwpOworICAgIFNldE1vdmllQm94KG1fcHJpdmF0ZS0+bV9tb3ZpZSwgJm1fcHJpdmF0ZS0+
bV9mdWxsc2NyZWVuUmVjdCk7CisgICAgbV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5XaW5kb3cgPSAw
OworfQorCiBCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBoaW5zdERMTCwgRFdPUkQgZmR3
UmVhc29uLCBMUFZPSUQgbHB2UmVzZXJ2ZWQpCiB7CiAgICAgc3dpdGNoIChmZHdSZWFzb24pIHsK
LSAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6Ci0gICAgICAgICAgICByZXR1cm4gVFJV
RTsKLSAgICAgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6Ci0gICAgICAgIGNhc2UgRExMX1RI
UkVBRF9BVFRBQ0g6Ci0gICAgICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6Ci0gICAgICAgICAg
ICByZXR1cm4gRkFMU0U7CisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgIHJl
dHVybiBUUlVFOworICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgIGNhc2UgRExMX1RI
UkVBRF9BVFRBQ0g6CisgICAgY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKyAgICAgICAgcmV0dXJu
IEZBTFNFOwogICAgIH0KICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICByZXR1cm4gRkFM
U0U7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUVRNb3ZpZVdpbi5oCShy
ZXZpc2lvbiA1Mjc2OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1FUTW92aWVX
aW4uaAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogI2RlZmluZSBRVE1vdmllV2lu
X2gKIAogI2luY2x1ZGUgPFVuaWNvZGUuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKICNpZmRl
ZiBRVE1PVklFV0lOX0VYUE9SVFMKICNkZWZpbmUgUVRNT1ZJRVdJTl9BUEkgX19kZWNsc3BlYyhk
bGxleHBvcnQpCkBAIC00NSw2ICs0NiwxMSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIG1v
dmllTmV3SW1hZ2VBdmFpbGFibGUoUVRNb3ZpZVdpbiopID0gMDsKIH07CiAKK2NsYXNzIFFUTW92
aWVXaW5GdWxsc2NyZWVuQ2xpZW50IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIExSRVNVTFQgZnVs
bHNjcmVlbkNsaWVudFduZFByb2MoSFdORCwgVUlOVCBtZXNzYWdlLCBVSU5UIHdQYXJhbSwgTE9O
RyBsUGFyYW0pID0gMDsKK307CisKIGVudW0gewogICAgIFFUTW92aWVMb2FkU3RhdGVFcnJvciA9
IC0xTCwKICAgICBRVE1vdmllTG9hZFN0YXRlTG9hZGVkICA9IDIwMDBMLApAQCAtMTA0LDggKzEx
MCwxMyBAQCBwdWJsaWM6CiAgICAgc3RhdGljIHVuc2lnbmVkIGNvdW50U3VwcG9ydGVkVHlwZXMo
KTsKICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRUeXBlKHVuc2lnbmVkIGluZGV4LCBjb25z
dCBVQ2hhciomIHN0ciwgdW5zaWduZWQmIGxlbik7CiAKKyAgICAvLyBSZXR1cm5zIHRoZSBmdWxs
LXNjcmVlbiB3aW5kb3cgY3JlYXRlZAorICAgIEhXTkQgZW50ZXJGdWxsc2NyZWVuKFFUTW92aWVX
aW5GdWxsc2NyZWVuQ2xpZW50Kik7CisgICAgdm9pZCBleGl0RnVsbHNjcmVlbigpOworCiBwcml2
YXRlOgogICAgIHZvaWQgbG9hZChDRlVSTFJlZiwgYm9vbCBwcmVzZXJ2ZXNQaXRjaCk7CisgICAg
c3RhdGljIExSRVNVTFQgZnVsbHNjcmVlblduZFByb2MoSFdORCwgVUlOVCBtZXNzYWdlLCBVSU5U
IHdQYXJhbSwgTE9ORyBsUGFyYW0pOwogCiAgICAgUVRNb3ZpZVdpblByaXZhdGUqIG1fcHJpdmF0
ZTsKICAgICBib29sIG1fZGlzYWJsZWQ7CkluZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gNTI3NjkpCisrKyBXZWJL
aXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ0IEBACisyMDEwLTAx
LTA0ICBDaHJpcyBNYXJyaW4gIDxjbWFycmluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbXBsZW1lbnQgZnVsbC1zY3JlZW4gdmlk
ZW8gZm9yIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTMxMzE4CisgICAgICAgIAorICAgICAgICBUaGlzIGFkZHMgYSBmdWxsLXNjcmVlbiBj
b250cm9sbGVyLCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyLCAKKyAgICAgICAgd2hpY2ggbWFu
YWdlcyBnb2luZyBpbiBhbmQgb3V0IG9mIGZ1bGwtc2NyZWVuLiBUaGUgYWN1YWwgCisgICAgICAg
IGZ1bGwtc2NyZWVuIHdpbmRvdyBpcyBjcmVhdGVkIGFuZCBtYW5hZ2VkIGJ5IGxvZ2ljIGFkZGVk
IAorICAgICAgICB0byBRVE1vdmllV2luLiBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyIGFsc28g
Y3JlYXRlcyBhbmQKKyAgICAgICAgbWFuYWdlcyBhIEhVRC4gVGhlIEhVRCByZW5kZXJzIGFuZCBt
YW5hZ2VzIGV2ZW50cyB0bworICAgICAgICBjb250cm9sIHRoZSBwbGF5aW5nIHZpZGVvLiBNb3Zp
ZSBjb250cm9sbGVyIGV2ZW50cyBnbyB0byAKKyAgICAgICAgRnVsbHNjcmVlblZpZGVvQ29udHJv
bGxlciB3aGljaCB0aGVuIHNlbmRzIHRoZW0gdG8gSFRNTE1lZGlhRWxlbWVudCwgCisgICAgICAg
IHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgY29udHJvbGxlciBieSBXZWJWaWV3LCB3aGljaCBnZXRz
IHRoZSBjYWxsIAorICAgICAgICB0byBnbyBpbnRvIGZ1bGwtc2NyZWVuIG1vZGUgZnJvbSBIVE1M
TWVkaWFFbGVtZW50IHZpYSAKKyAgICAgICAgQ2hyb21lQ2xpZW50LgorICAgICAgICAKKyAgICAg
ICAgSSd2ZSBhbHNvIHVwZGF0ZWQgdGhlIGljb25zIHRvIG1ha2UgdGhlbSBwb3NpdGlvbiBjb3Jy
ZWN0bHkKKyAgICAgICAgaW4gdGhlIEhVRC4KKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L1dl
YkNocm9tZUNsaWVudC5jcHA6CisgICAgICAgIChXZWJDaHJvbWVDbGllbnQ6OnN1cHBvcnRzRnVs
bHNjcmVlbkZvck5vZGUpOgorICAgICAgICAoV2ViQ2hyb21lQ2xpZW50OjplbnRlckZ1bGxzY3Jl
ZW5Gb3JOb2RlKToKKyAgICAgICAgKFdlYkNocm9tZUNsaWVudDo6ZXhpdEZ1bGxzY3JlZW5Gb3JO
b2RlKToKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaDoKKyAgICAg
ICAgKiBXZWJLaXQudmNwcm9qL1dlYktpdC52Y3Byb2o6CisgICAgICAgICogV2ViS2l0LnZjcHJv
ai9mc1ZpZGVvQXVkaW9Wb2x1bWVIaWdoLnBuZzoKKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL2Zz
VmlkZW9BdWRpb1ZvbHVtZUxvdy5wbmc6CisgICAgICAgICogV2ViS2l0LnZjcHJvai9mc1ZpZGVv
RXhpdEZ1bGxzY3JlZW4ucG5nOgorICAgICAgICAqIFdlYktpdC52Y3Byb2ovZnNWaWRlb1BhdXNl
LnBuZzoKKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL2ZzVmlkZW9QbGF5LnBuZzoKKyAgICAgICAg
KiBXZWJLaXRETEwuY3BwOgorICAgICAgICAobG9hZFJlc291cmNlSW50b0J1ZmZlcik6CisgICAg
ICAgICogRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlci5jcHA6IEFkZGVkLgorICAgICAgICAqIEZ1
bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIuaDogQWRkZWQuCisgICAgICAgICogV2ViVmlldy5jcHA6
CisgICAgICAgIChXZWJWaWV3OjplbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKToKKyAgICAgICAgKFdl
YlZpZXc6OmV4aXRGdWxsc2NyZWVuKToKKyAgICAgICAgKiBXZWJWaWV3Lmg6CisKIDIwMTAtMDEt
MDQgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgRGFyaW4gQWRsZXIuCkluZGV4OiBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRy
b2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vRnVsbHNjcmVlblZpZGVvQ29udHJv
bGxlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRy
b2xsZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShWSURFTykKKworI2luY2x1ZGUgIkZ1bGxzY3Jl
ZW5WaWRlb0NvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIldlYktpdERMTC5oIgorI2luY2x1ZGUg
PEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvQml0bWFwSW5mby5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRm9udC5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvRm9udFNlbGVjdG9yLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRl
eHQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1RleHRSdW4uaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0
ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8d2luZG93c3gu
aD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJD
b3JlOworCitzdGF0aWMgY29uc3QgZmxvYXQgdGltZXJJbnRlcnZhbCA9IDAuMDMzOworCisvLyBI
VUQgU2l6ZQorc3RhdGljIGNvbnN0IGludCB3aW5kb3dIZWlnaHQgPSA1OTsKK3N0YXRpYyBjb25z
dCBpbnQgd2luZG93V2lkdGggPSA0Mzg7CisKKy8vIE1hcmdpbnMgYW5kIGJ1dHRvbiBzaXplcwor
c3RhdGljIGNvbnN0IGludCBtYXJnaW4gPSA5Oworc3RhdGljIGNvbnN0IGludCBtYXJnaW5Ub3Ag
PSA5Oworc3RhdGljIGNvbnN0IGludCBidXR0b25TaXplID0gMjU7CitzdGF0aWMgY29uc3QgaW50
IGJ1dHRvbk1pbmlTaXplID0gMTY7CitzdGF0aWMgY29uc3QgaW50IHZvbHVtZVNsaWRlcldpZHRo
ID0gNTA7CitzdGF0aWMgY29uc3QgaW50IHRpbWVTbGlkZXJXaWR0aCA9IDMxMDsKK3N0YXRpYyBj
b25zdCBpbnQgc2xpZGVySGVpZ2h0ID0gODsKK3N0YXRpYyBjb25zdCBpbnQgdm9sdW1lU2xpZGVy
QnV0dG9uU2l6ZSA9IDEwOworc3RhdGljIGNvbnN0IGludCB0aW1lU2xpZGVyQnV0dG9uU2l6ZSA9
IDg7CitzdGF0aWMgY29uc3QgaW50IHRleHRTaXplID0gMTE7CisKKy8vIEJhY2tncm91bmQgdmFs
dWVzCitzdGF0aWMgY29uc3QgaW50IGJvcmRlclJhZGl1cyA9IDEyOworc3RhdGljIGNvbnN0IGlu
dCBib3JkZXJUaGlja25lc3MgPSAyOworCisvLyBDb2xvcnMKK3N0YXRpYyBjb25zdCB1bnNpZ25l
ZCBpbnQgYmFja2dyb3VuZENvbG9yID0gMHhBMDIwMjAyMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25l
ZCBpbnQgYm9yZGVyQ29sb3IgPSAweEZGQTBBMEEwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGlu
dCBzbGlkZXJHdXR0ZXJDb2xvciA9IDB4RkYxNDE0MTQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQg
aW50IHNsaWRlckJ1dHRvbkNvbG9yID0gMHhGRjgwODA4MDsKK3N0YXRpYyBjb25zdCB1bnNpZ25l
ZCBpbnQgdGV4dENvbG9yID0gMHhGRkZGRkZGRjsKKworSFVEQnV0dG9uOjpIVURCdXR0b24oSFVE
QnV0dG9uVHlwZSB0eXBlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgcG9zaXRpb24pCisgICAg
OiBIVURXaWRnZXQoSW50UmVjdChwb3NpdGlvbiwgSW50U2l6ZSgwLCAwKSkpCisgICAgLCBtX3R5
cGUodHlwZSkKKyAgICAsIG1fc2hvd0FsdEJ1dHRvbihmYWxzZSkKK3sKKyAgICBjb25zdCBjaGFy
KiBidXR0b25SZXNvdXJjZSA9IDA7CisgICAgY29uc3QgY2hhciogYnV0dG9uUmVzb3VyY2VBbHQg
PSAwOworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQbGF5UGF1c2VCdXR0b246Cisg
ICAgICAgIGJ1dHRvblJlc291cmNlID0gImZzVmlkZW9QbGF5IjsKKyAgICAgICAgYnV0dG9uUmVz
b3VyY2VBbHQgPSAiZnNWaWRlb1BhdXNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUaW1l
U2xpZGVyQnV0dG9uOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFZvbHVtZVVwQnV0dG9uOgor
ICAgICAgICBidXR0b25SZXNvdXJjZSA9ICJmc1ZpZGVvQXVkaW9Wb2x1bWVIaWdoIjsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBWb2x1bWVTbGlkZXJCdXR0b246CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgVm9sdW1lRG93bkJ1dHRvbjoKKyAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAiZnNW
aWRlb0F1ZGlvVm9sdW1lTG93IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeGl0RnVsbHNj
cmVlbkJ1dHRvbjoKKyAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAiZnNWaWRlb0V4aXRGdWxsc2Ny
ZWVuIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGJ1dHRvblJlc291cmNlKSB7
CisgICAgICAgIG1fYnV0dG9uSW1hZ2UgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoYnV0
dG9uUmVzb3VyY2UpOworICAgICAgICBtX2J1dHRvbkltYWdlLT5yZWYoKTsKKyAgICAgICAgbV9y
ZWN0LnNldFdpZHRoKG1fYnV0dG9uSW1hZ2UtPndpZHRoKCkpOworICAgICAgICBtX3JlY3Quc2V0
SGVpZ2h0KG1fYnV0dG9uSW1hZ2UtPmhlaWdodCgpKTsKKyAgICB9CisgICAgaWYgKGJ1dHRvblJl
c291cmNlQWx0KSB7CisgICAgICAgIG1fYnV0dG9uSW1hZ2VBbHQgPSBJbWFnZTo6bG9hZFBsYXRm
b3JtUmVzb3VyY2UoYnV0dG9uUmVzb3VyY2VBbHQpOworICAgICAgICBtX2J1dHRvbkltYWdlQWx0
LT5yZWYoKTsKKyAgICB9Cit9CisKK3ZvaWQgSFVEQnV0dG9uOjpkcmF3KEdyYXBoaWNzQ29udGV4
dCYgY29udGV4dCkKK3sKKyAgICBpZiAobV9zaG93QWx0QnV0dG9uICYmIG1fYnV0dG9uSW1hZ2VB
bHQpCisgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKG1fYnV0dG9uSW1hZ2VBbHQuZ2V0KCksIERl
dmljZUNvbG9yU3BhY2UsIG1fcmVjdC5sb2NhdGlvbigpKTsKKyAgICBlbHNlIGlmIChtX2J1dHRv
bkltYWdlKQorICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShtX2J1dHRvbkltYWdlLmdldCgpLCBE
ZXZpY2VDb2xvclNwYWNlLCBtX3JlY3QubG9jYXRpb24oKSk7Cit9CisKK0hVRFNsaWRlcjo6SFVE
U2xpZGVyKEhVRFNsaWRlckJ1dHRvblNoYXBlIHNoYXBlLCBpbnQgYnV0dG9uU2l6ZSwgY29uc3Qg
V2ViQ29yZTo6SW50UmVjdCYgcmVjdCkKKyAgICA6IEhVRFdpZGdldChyZWN0KQorICAgICwgbV9i
dXR0b25TaGFwZShzaGFwZSkKKyAgICAsIG1fYnV0dG9uU2l6ZShidXR0b25TaXplKQorICAgICwg
bV9zbGlkZXJQb3NpdGlvbigwKQorICAgICwgbV9kcmFnU3RhcnRPZmZzZXQoMCkKK3sKK30KKwor
dm9pZCBIVURTbGlkZXI6OmRyYXcoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0JiBjb250ZXh0KQor
eworICAgIC8vIERyYXcgZ3V0dGVyCisgICAgSW50U2l6ZSByYWRpdXMobV9yZWN0LmhlaWdodCgp
IC8gMiwgbV9yZWN0LmhlaWdodCgpIC8gMik7CisgICAgY29udGV4dC5maWxsUm91bmRlZFJlY3Qo
bV9yZWN0LCByYWRpdXMsIHJhZGl1cywgcmFkaXVzLCByYWRpdXMsIENvbG9yKHNsaWRlckd1dHRl
ckNvbG9yKSwgRGV2aWNlQ29sb3JTcGFjZSk7CisKKyAgICAvLyBEcmF3IGJ1dHRvbgorICAgIGNv
bnRleHQuc2V0U3Ryb2tlQ29sb3IoQ29sb3Ioc2xpZGVyQnV0dG9uQ29sb3IpLCBEZXZpY2VDb2xv
clNwYWNlKTsKKyAgICBjb250ZXh0LnNldEZpbGxDb2xvcihDb2xvcihzbGlkZXJCdXR0b25Db2xv
ciksIERldmljZUNvbG9yU3BhY2UpOworCisgICAgaWYgKG1fYnV0dG9uU2hhcGUgPT0gUm91bmRC
dXR0b24pCisgICAgICAgIGNvbnRleHQuZHJhd0VsbGlwc2UoSW50UmVjdChtX3JlY3QubG9jYXRp
b24oKS54KCkgKyBtX3NsaWRlclBvc2l0aW9uLCBtX3JlY3QubG9jYXRpb24oKS55KCkgLSAobV9i
dXR0b25TaXplIC0gbV9yZWN0LmhlaWdodCgpKSAvIDIsIG1fYnV0dG9uU2l6ZSwgbV9idXR0b25T
aXplKSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIERyYXcgYSBkaWFtb25kCisgICAgICAgIEZs
b2F0UG9pbnQgcG9pbnRzWzRdOworICAgICAgICBmbG9hdCBoYWxmID0gbV9idXR0b25TaXplIC8g
MjsKKyAgICAgICAgcG9pbnRzWzBdLnNldFgoaGFsZiArIG1fcmVjdC5sb2NhdGlvbigpLngoKSAr
IG1fc2xpZGVyUG9zaXRpb24pOworICAgICAgICBwb2ludHNbMF0uc2V0WShtX3JlY3QubG9jYXRp
b24oKS55KCkpOworICAgICAgICBwb2ludHNbMV0uc2V0WChtX2J1dHRvblNpemUgKyBtX3JlY3Qu
bG9jYXRpb24oKS54KCkgKyBtX3NsaWRlclBvc2l0aW9uKTsKKyAgICAgICAgcG9pbnRzWzFdLnNl
dFkoaGFsZiArIG1fcmVjdC5sb2NhdGlvbigpLnkoKSk7CisgICAgICAgIHBvaW50c1syXS5zZXRY
KGhhbGYgKyBtX3JlY3QubG9jYXRpb24oKS54KCkgKyBtX3NsaWRlclBvc2l0aW9uKTsKKyAgICAg
ICAgcG9pbnRzWzJdLnNldFkobV9idXR0b25TaXplICsgbV9yZWN0LmxvY2F0aW9uKCkueSgpKTsK
KyAgICAgICAgcG9pbnRzWzNdLnNldFgobV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9zbGlkZXJQ
b3NpdGlvbik7CisgICAgICAgIHBvaW50c1szXS5zZXRZKGhhbGYgKyBtX3JlY3QubG9jYXRpb24o
KS55KCkpOworICAgICAgICBjb250ZXh0LmRyYXdDb252ZXhQb2x5Z29uKDQsIHBvaW50cywgdHJ1
ZSk7CisgICAgfQorfQorCit2b2lkIEhVRFNsaWRlcjo6ZHJhZyhpbnQgeCwgaW50IHksIGJvb2wg
c3RhcnQpCit7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgIC8vIFdoZW4gd2Ugc3RhcnQsIHdl
IG5lZWQgdG8gc25hcCB0aGUgc2xpZGVyIHBvc2l0aW9uIHRvIHRoZSB4IHBvc2l0aW9uIGlmIHdl
IGNsaWNrZWQgdGhlIGd1dHRlci4KKyAgICAgICAgLy8gQnV0IGlmIHdlIGNsaWNrIHRoZSBidXR0
b24sIHdlIG5lZWQgdG8gZHJhZyByZWxhdGl2ZSB0byB3aGVyZSB3ZSBjbGlja2VkIGRvd24uIFdl
IG9ubHkgbmVlZAorICAgICAgICAvLyB0byBjaGVjayBYIGJlY2F1c2Ugd2Ugd291bGQgbm90IGV2
ZW4gZ2V0IGhlcmUgdW5sZXNzIFkgd2VyZSBhbHJlYWR5IGluc2lkZS4KKyAgICAgICAgaW50IHJl
bGF0aXZlWCA9IHggLSBtX3JlY3QubG9jYXRpb24oKS54KCk7CisgICAgICAgIGlmIChyZWxhdGl2
ZVggPj0gbV9zbGlkZXJQb3NpdGlvbiAmJiByZWxhdGl2ZVggPD0gbV9zbGlkZXJQb3NpdGlvbiAr
IG1fYnV0dG9uU2l6ZSkKKyAgICAgICAgICAgIG1fZHJhZ1N0YXJ0T2Zmc2V0ID0geCAtIG1fc2xp
ZGVyUG9zaXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fZHJhZ1N0YXJ0T2Zmc2V0
ID0gbV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25TaXplIC8gMjsKKyAgICB9CisKKyAg
ICBtX3NsaWRlclBvc2l0aW9uID0geCAtIG1fZHJhZ1N0YXJ0T2Zmc2V0OworICAgIGlmIChtX3Ns
aWRlclBvc2l0aW9uIDwgMCkKKyAgICAgICAgbV9zbGlkZXJQb3NpdGlvbiA9IDA7CisgICAgZWxz
ZSBpZiAobV9zbGlkZXJQb3NpdGlvbiA+IG1fcmVjdC53aWR0aCgpIC0gbV9idXR0b25TaXplKQor
ICAgICAgICBtX3NsaWRlclBvc2l0aW9uID0gbV9yZWN0LndpZHRoKCkgLSBtX2J1dHRvblNpemU7
Cit9CisKK0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OkZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xs
ZXIoKQorICAgIDogbV9odWRXaW5kb3coMCkKKyAgICAsIG1fdmlkZW9XaW5kb3coMCkKKyAgICAs
IG1fcGxheVBhdXNlQnV0dG9uKEhVREJ1dHRvbjo6UGxheVBhdXNlQnV0dG9uLCBJbnRQb2ludCgo
d2luZG93V2lkdGggLSBidXR0b25TaXplKSAvIDIsIG1hcmdpblRvcCkpCisgICAgLCBtX3RpbWVT
bGlkZXJCdXR0b24oSFVEQnV0dG9uOjpUaW1lU2xpZGVyQnV0dG9uLCBJbnRQb2ludCgwLCAwKSkK
KyAgICAsIG1fdm9sdW1lVXBCdXR0b24oSFVEQnV0dG9uOjpWb2x1bWVVcEJ1dHRvbiwgSW50UG9p
bnQobWFyZ2luICsgYnV0dG9uTWluaVNpemUgKyB2b2x1bWVTbGlkZXJXaWR0aCArIGJ1dHRvbk1p
bmlTaXplIC8gMiwgbWFyZ2luVG9wICsgKGJ1dHRvblNpemUgLSBidXR0b25NaW5pU2l6ZSkgLyAy
KSkKKyAgICAsIG1fdm9sdW1lU2xpZGVyQnV0dG9uKEhVREJ1dHRvbjo6Vm9sdW1lU2xpZGVyQnV0
dG9uLCBJbnRQb2ludCgwLCAwKSkKKyAgICAsIG1fdm9sdW1lRG93bkJ1dHRvbihIVURCdXR0b246
OlZvbHVtZURvd25CdXR0b24sIEludFBvaW50KG1hcmdpbiwgbWFyZ2luVG9wICsgKGJ1dHRvblNp
emUgLSBidXR0b25NaW5pU2l6ZSkgLyAyKSkKKyAgICAsIG1fZXhpdEZ1bGxzY3JlZW5CdXR0b24o
SFVEQnV0dG9uOjpFeGl0RnVsbHNjcmVlbkJ1dHRvbiwgSW50UG9pbnQod2luZG93V2lkdGggLSAy
ICogbWFyZ2luIC0gYnV0dG9uTWluaVNpemUsIG1hcmdpblRvcCArIChidXR0b25TaXplIC0gYnV0
dG9uTWluaVNpemUpIC8gMikpCisgICAgLCBtX3ZvbHVtZVNsaWRlcihIVURTbGlkZXI6OlJvdW5k
QnV0dG9uLCB2b2x1bWVTbGlkZXJCdXR0b25TaXplLCBJbnRSZWN0KEludFBvaW50KG1hcmdpbiAr
IGJ1dHRvbk1pbmlTaXplLCBtYXJnaW5Ub3AgKyAoYnV0dG9uU2l6ZSAtIGJ1dHRvbk1pbmlTaXpl
KSAvIDIgKyBidXR0b25NaW5pU2l6ZSAvIDIgLSBzbGlkZXJIZWlnaHQgLyAyKSwgSW50U2l6ZSh2
b2x1bWVTbGlkZXJXaWR0aCwgc2xpZGVySGVpZ2h0KSkpCisgICAgLCBtX3RpbWVTbGlkZXIoSFVE
U2xpZGVyOjpEaWFtb25kQnV0dG9uLCB0aW1lU2xpZGVyQnV0dG9uU2l6ZSwgSW50UmVjdChJbnRQ
b2ludCh3aW5kb3dXaWR0aCAvIDIgLSB0aW1lU2xpZGVyV2lkdGggLyAyLCB3aW5kb3dIZWlnaHQg
LSBtYXJnaW4gLSBzbGlkZXJIZWlnaHQpLCBJbnRTaXplKHRpbWVTbGlkZXJXaWR0aCwgc2xpZGVy
SGVpZ2h0KSkpCisgICAgLCBtX3BpY2tlZFdpZGdldCgwKQorICAgICwgbV9tb3ZpbmdXaW5kb3co
ZmFsc2UpCisgICAgLCBtX3RpbWVyKHRoaXMsICZGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp0
aW1lckZpcmVkKQoreworfQorCitGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp+RnVsbHNjcmVl
blZpZGVvQ29udHJvbGxlcigpCit7CisgICAgaWYgKG1vdmllKCkpCisgICAgICAgIG1vdmllKCkt
PmV4aXRGdWxsc2NyZWVuKCk7CisKKyAgICBtX2JpdG1hcC5jbGVhcigpOworICAgIFNldFdpbmRv
d0xvbmdQdHIobV9odWRXaW5kb3csIDAsIDApOworICAgIERlc3Ryb3lXaW5kb3cobV9odWRXaW5k
b3cpOworfQorCitRVE1vdmllV2luKiBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjptb3ZpZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVtZW50ID8gcmVpbnRlcnByZXRfY2FzdDxR
VE1vdmllV2luKj4obV9tZWRpYUVsZW1lbnQtPnBsYXRmb3JtTWVkaWEoKS5xdE1vdmllKSA6IDA7
Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6c2V0TWVkaWFFbGVtZW50KEhU
TUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCkKK3sKKyAgICBtX21lZGlhRWxlbWVudCA9IG1l
ZGlhRWxlbWVudDsKKyAgICBpZiAoIW1fbWVkaWFFbGVtZW50KSB7CisgICAgICAgIC8vIENhbid0
IGRvIGZ1bGwtc2NyZWVuLCBqdXN0IGdldCBvdXQKKyAgICAgICAgaWYgKG1vdmllKCkpCisgICAg
ICAgICAgICBtb3ZpZSgpLT5leGl0RnVsbHNjcmVlbigpOworICAgIH0KK30KKwordm9pZCBGdWxs
c2NyZWVuVmlkZW9Db250cm9sbGVyOjplbnRlckZ1bGxzY3JlZW4oKQoreworICAgIGlmIChtb3Zp
ZSgpKSB7CisgICAgICAgIG1fdmlkZW9XaW5kb3cgPSBtb3ZpZSgpLT5lbnRlckZ1bGxzY3JlZW4o
dGhpcyk7CisgICAgCisgICAgICAgIFJFQ1Qgd2luZG93UmVjdDsKKyAgICAgICAgR2V0Q2xpZW50
UmVjdChtX3ZpZGVvV2luZG93LCAmd2luZG93UmVjdCk7CisgICAgICAgIG1fZnVsbHNjcmVlblNp
emUuc2V0V2lkdGgod2luZG93UmVjdC5yaWdodCAtIHdpbmRvd1JlY3QubGVmdCArIDEpOworICAg
ICAgICBtX2Z1bGxzY3JlZW5TaXplLnNldEhlaWdodCh3aW5kb3dSZWN0LmJvdHRvbSAtIHdpbmRv
d1JlY3QudG9wICsgMSk7CisKKyAgICAgICAgY3JlYXRlSFVEV2luZG93KCk7CisgICAgfQorfQor
Cit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmV4aXRGdWxsc2NyZWVuKCkKK3sKKyAg
ICBpZiAobW92aWUoKSkKKyAgICAgICAgbW92aWUoKS0+ZXhpdEZ1bGxzY3JlZW4oKTsKK30KKwor
Ym9vbCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpjYW5QbGF5KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9tZWRpYUVsZW1lbnQgJiYgbV9tZWRpYUVsZW1lbnQtPmNhblBsYXkoKTsKK30KKwor
dm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpwbGF5KCkKK3sKKyAgICBpZiAobV9tZWRp
YUVsZW1lbnQpCisgICAgICAgIG1fbWVkaWFFbGVtZW50LT5wbGF5KCk7Cit9CisKK3ZvaWQgRnVs
bHNjcmVlblZpZGVvQ29udHJvbGxlcjo6cGF1c2UoKQoreworICAgIGlmIChtX21lZGlhRWxlbWVu
dCkKKyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPnBhdXNlKCk7Cit9CisKK2Zsb2F0IEZ1bGxzY3Jl
ZW5WaWRlb0NvbnRyb2xsZXI6OnZvbHVtZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFF
bGVtZW50ID8gbV9tZWRpYUVsZW1lbnQtPnZvbHVtZSgpIDogMDsKK30KKwordm9pZCBGdWxsc2Ny
ZWVuVmlkZW9Db250cm9sbGVyOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKQoreworICAgIGlmICht
X21lZGlhRWxlbWVudCkgeworICAgICAgICBFeGNlcHRpb25Db2RlIGVjOworICAgICAgICBtX21l
ZGlhRWxlbWVudC0+c2V0Vm9sdW1lKHZvbHVtZSwgZWMpOworICAgIH0KK30KKworZmxvYXQgRnVs
bHNjcmVlblZpZGVvQ29udHJvbGxlcjo6Y3VycmVudFRpbWUoKSBjb25zdAoreworICAgIHJldHVy
biBtX21lZGlhRWxlbWVudCA/IG1fbWVkaWFFbGVtZW50LT5jdXJyZW50VGltZSgpIDogMDsKK30K
Kwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpzZXRDdXJyZW50VGltZShmbG9hdCB2
YWx1ZSkKK3sKKyAgICBpZiAobV9tZWRpYUVsZW1lbnQpIHsKKyAgICAgICAgRXhjZXB0aW9uQ29k
ZSBlYzsKKyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPnNldEN1cnJlbnRUaW1lKHZhbHVlLCBlYyk7
CisgICAgfQorfQorCitmbG9hdCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpkdXJhdGlvbigp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVtZW50ID8gbV9tZWRpYUVsZW1lbnQtPmR1
cmF0aW9uKCkgOiAwOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmJlZ2lu
U2NydWJiaW5nKCkKK3sKKyAgICBpZiAobV9tZWRpYUVsZW1lbnQpIAorICAgICAgICBtX21lZGlh
RWxlbWVudC0+YmVnaW5TY3J1YmJpbmcoKTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250
cm9sbGVyOjplbmRTY3J1YmJpbmcoKQoreworICAgIGlmIChtX21lZGlhRWxlbWVudCkgCisgICAg
ICAgIG1fbWVkaWFFbGVtZW50LT5lbmRTY3J1YmJpbmcoKTsKK30KKworTFJFU1VMVCBGdWxsc2Ny
ZWVuVmlkZW9Db250cm9sbGVyOjpmdWxsc2NyZWVuQ2xpZW50V25kUHJvYyhIV05EIHduZCwgVUlO
VCBtZXNzYWdlLCBVSU5UIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgc3dpdGNoIChtZXNz
YWdlKSB7CisgICAgY2FzZSBXTV9DSEFSOgorICAgICAgICBvbkNoYXIod1BhcmFtKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKyAgICAgICAgb25Nb3VzZURvd24o
R0VUX1hfTFBBUkFNKGxQYXJhbSksIEdFVF9ZX0xQQVJBTShsUGFyYW0pKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBXTV9NT1VTRU1PVkU6CisgICAgICAgIG9uTW91c2VNb3ZlKEdFVF9YX0xQ
QVJBTShsUGFyYW0pLCBHRVRfWV9MUEFSQU0obFBhcmFtKSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgV01fTEJVVFRPTlVQOgorICAgICAgICBvbk1vdXNlVXAoR0VUX1hfTFBBUkFNKGxQYXJh
bSksIEdFVF9ZX0xQQVJBTShsUGFyYW0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAg
cmV0dXJuIERlZldpbmRvd1Byb2Mod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisK
K2NvbnN0IExQQ1dTVFIgZnVsbHNjcmVlblZpZGVlb0hVRFdpbmRvd0NsYXNzTmFtZSA9IEwiZnVs
bHNjcmVlblZpZGVlb0hVRFdpbmRvd0NsYXNzIjsKKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250
cm9sbGVyOjpyZWdpc3RlckhVRFdpbmRvd0NsYXNzKCkKK3sKKyAgICBzdGF0aWMgYm9vbCBoYXZl
UmVnaXN0ZXJlZEhVRFdpbmRvd0NsYXNzID0gZmFsc2U7CisgICAgaWYgKGhhdmVSZWdpc3RlcmVk
SFVEV2luZG93Q2xhc3MpCisgICAgICAgIHJldHVybjsKKworICAgIGhhdmVSZWdpc3RlcmVkSFVE
V2luZG93Q2xhc3MgPSB0cnVlOworCisgICAgV05EQ0xBU1NFWCB3Y2V4OworCisgICAgd2NleC5j
YlNpemUgPSBzaXplb2YoV05EQ0xBU1NFWCk7CisKKyAgICB3Y2V4LnN0eWxlID0gQ1NfSFJFRFJB
VyB8IENTX1ZSRURSQVc7CisgICAgd2NleC5scGZuV25kUHJvYyA9IGh1ZFduZFByb2M7CisgICAg
d2NleC5jYkNsc0V4dHJhID0gMDsKKyAgICB3Y2V4LmNiV25kRXh0cmEgPSA0OworICAgIHdjZXgu
aEluc3RhbmNlID0gZ0luc3RhbmNlOworICAgIHdjZXguaEljb24gPSAwOworICAgIHdjZXguaEN1
cnNvciA9IExvYWRDdXJzb3IoMCwgSURDX0FSUk9XKTsKKyAgICB3Y2V4LmhickJhY2tncm91bmQg
PSAwOworICAgIHdjZXgubHBzek1lbnVOYW1lID0gMDsKKyAgICB3Y2V4Lmxwc3pDbGFzc05hbWUg
PSBmdWxsc2NyZWVuVmlkZWVvSFVEV2luZG93Q2xhc3NOYW1lOworICAgIHdjZXguaEljb25TbSA9
IDA7CisKKyAgICBSZWdpc3RlckNsYXNzRXgoJndjZXgpOworfQorCit2b2lkIEZ1bGxzY3JlZW5W
aWRlb0NvbnRyb2xsZXI6OmNyZWF0ZUhVRFdpbmRvdygpCit7CisgICAgbV9odWRQb3NpdGlvbi5z
ZXRYKChtX2Z1bGxzY3JlZW5TaXplLndpZHRoKCkgLSB3aW5kb3dXaWR0aCkgLyAyKTsKKyAgICBt
X2h1ZFBvc2l0aW9uLnNldFkobV9mdWxsc2NyZWVuU2l6ZS5oZWlnaHQoKSAqIDAuOSAtIHdpbmRv
d0hlaWdodCAvIDIpOworCisgICAgLy8gTG9jYWwgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgdGhl
IHJldHVybmVkIHBpeGVscy4gTm8gbmVlZCB0byBjbGVhbnVwIHRoaXMgdmFsdWUuIEl0CisgICAg
Ly8gd2lsbCBnZXQgY2xlYW5lZCB1cCB3aGVuIG1fYml0bWFwIGlzIGRlc3Ryb3llZCBpbiB0aGUg
ZHRvcgorICAgIHZvaWQqIHBpeGVsczsKKyAgICBCaXRtYXBJbmZvIGJpdG1hcEluZm8gPSBCaXRt
YXBJbmZvOjpjcmVhdGVCb3R0b21VcChJbnRTaXplKHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQp
KTsKKyAgICBtX2JpdG1hcC5zZXQoOjpDcmVhdGVESUJTZWN0aW9uKDAsICZiaXRtYXBJbmZvLCBE
SUJfUkdCX0NPTE9SUywgJnBpeGVscywgMCwgMCkpOworICAgIAorICAgIC8vIERpcnR5IHRoZSB3
aW5kb3cgc28gdGhlIEhVRCBkcmF3cworICAgIFJFQ1QgY2xlYXJSZWN0ID0geyBtX2h1ZFBvc2l0
aW9uLngoKSwgbV9odWRQb3NpdGlvbi55KCksIG1faHVkUG9zaXRpb24ueCgpICsgd2luZG93V2lk
dGggLSAxLCBtX2h1ZFBvc2l0aW9uLnkoKSArIHdpbmRvd0hlaWdodCAtIDEgfTsKKyAgICBJbnZh
bGlkYXRlUmVjdChtX3ZpZGVvV2luZG93LCAmY2xlYXJSZWN0LCB0cnVlKTsKKworICAgIG1fcGxh
eVBhdXNlQnV0dG9uLnNldFNob3dBbHRCdXR0b24oIWNhblBsYXkoKSk7CisgICAgbV92b2x1bWVT
bGlkZXIuc2V0VmFsdWUodm9sdW1lKCkpOworICAgIG1fdGltZVNsaWRlci5zZXRWYWx1ZShjdXJy
ZW50VGltZSgpIC8gZHVyYXRpb24oKSk7CisKKyAgICBpZiAoIWNhblBsYXkoKSkKKyAgICAgICAg
bV90aW1lci5zdGFydFJlcGVhdGluZyh0aW1lckludGVydmFsKTsKKworICAgIHJlZ2lzdGVySFVE
V2luZG93Q2xhc3MoKTsKKworICAgIG1faHVkV2luZG93ID0gQ3JlYXRlV2luZG93RXgoV1NfRVhf
TEFZRVJFRCB8IFdTX0VYX1RSQU5TUEFSRU5UIHwgV1NfRVhfVE9QTU9TVCB8IFdTX0VYX1RPT0xX
SU5ET1csIAorICAgICAgICBmdWxsc2NyZWVuVmlkZWVvSFVEV2luZG93Q2xhc3NOYW1lLCAwLCBX
U19QT1BVUCB8IFdTX1ZJU0lCTEUsCisgICAgICAgIG1faHVkUG9zaXRpb24ueCgpLCBtX2h1ZFBv
c2l0aW9uLnkoKSwgMCwgMCwgMCwgMCwgZ0luc3RhbmNlLCAwKTsKKyAgICBBU1NFUlQoOjpJc1dp
bmRvdyhtX2h1ZFdpbmRvdykpOworICAgIFNldFdpbmRvd0xvbmdQdHIobV9odWRXaW5kb3csIDAs
IHJlaW50ZXJwcmV0X2Nhc3Q8TE9OR19QVFI+KHRoaXMpKTsKKworICAgIGRyYXcoKTsKK30KKwor
c3RhdGljIFN0cmluZyB0aW1lVG9TdHJpbmcoZmxvYXQgdGltZSkKK3sKKyAgICBpZiAoIWlzZmlu
aXRlKHRpbWUpKQorICAgICAgICB0aW1lID0gMDsKKyAgICBpbnQgc2Vjb25kcyA9IGZhYnNmKHRp
bWUpOyAKKyAgICBpbnQgaG91cnMgPSBzZWNvbmRzIC8gKDYwICogNjApOworICAgIGludCBtaW51
dGVzID0gKHNlY29uZHMgLyA2MCkgJSA2MDsKKyAgICBzZWNvbmRzICU9IDYwOworCisgICAgaWYg
KGhvdXJzKSB7CisgICAgICAgIGlmIChob3VycyA+IDkpCisgICAgICAgICAgICByZXR1cm4gU3Ry
aW5nOjpmb3JtYXQoIiVzJTAyZDolMDJkOiUwMmQiLCAodGltZSA8IDAgPyAiLSIgOiAiIiksIGhv
dXJzLCBtaW51dGVzLCBzZWNvbmRzKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIl
cyUwMWQ6JTAyZDolMDJkIiwgKHRpbWUgPCAwID8gIi0iIDogIiIpLCBob3VycywgbWludXRlcywg
c2Vjb25kcyk7CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIlcyUwMmQ6JTAy
ZCIsICh0aW1lIDwgMCA/ICItIiA6ICIiKSwgbWludXRlcywgc2Vjb25kcyk7Cit9CisKK3ZvaWQg
RnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6ZHJhdygpCit7CisgICAgSERDIHdpbmRvd0RDID0g
R2V0REMobV9odWRXaW5kb3cpOworICAgIEhEQyBiaXRtYXBEQyA9IENyZWF0ZUNvbXBhdGlibGVE
Qyh3aW5kb3dEQyk7CisgICAgU2VsZWN0T2JqZWN0KGJpdG1hcERDLCBtX2JpdG1hcC5nZXQoKSk7
CisKKyAgICBHcmFwaGljc0NvbnRleHQgY29udGV4dChiaXRtYXBEQywgdHJ1ZSk7CisKKyAgICBj
b250ZXh0LnNhdmUoKTsKKworICAgIC8vIERyYXcgdGhlIGJhY2tncm91bmQKKyAgICBJbnRTaXpl
IG91dGVyUmFkaXVzKGJvcmRlclJhZGl1cywgYm9yZGVyUmFkaXVzKTsKKyAgICBJbnRSZWN0IG91
dGVyU2l6ZSgwLCAwLCB3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTsKKyAgICBJbnRTaXplIGlu
bmVyUmFkaXVzKGJvcmRlclJhZGl1cyAtIGJvcmRlclRoaWNrbmVzcywgYm9yZGVyUmFkaXVzIC0g
Ym9yZGVyVGhpY2tuZXNzKTsKKyAgICBJbnRSZWN0IGlubmVyU2l6ZShib3JkZXJUaGlja25lc3Ms
IGJvcmRlclRoaWNrbmVzcywgd2luZG93V2lkdGggLSBib3JkZXJUaGlja25lc3MgKiAyLCB3aW5k
b3dIZWlnaHQgLSBib3JkZXJUaGlja25lc3MgKiAyKTsKKworICAgIGNvbnRleHQuZmlsbFJvdW5k
ZWRSZWN0KG91dGVyU2l6ZSwgb3V0ZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBvdXRlclJhZGl1cywg
b3V0ZXJSYWRpdXMsIENvbG9yKGJvcmRlckNvbG9yKSwgRGV2aWNlQ29sb3JTcGFjZSk7CisgICAg
Y29udGV4dC5zZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlQ29weSk7CisgICAgY29udGV4
dC5maWxsUm91bmRlZFJlY3QoaW5uZXJTaXplLCBpbm5lclJhZGl1cywgaW5uZXJSYWRpdXMsIGlu
bmVyUmFkaXVzLCBpbm5lclJhZGl1cywgQ29sb3IoYmFja2dyb3VuZENvbG9yKSwgRGV2aWNlQ29s
b3JTcGFjZSk7CisKKyAgICAvLyBEcmF3IHRoZSB3aWRnZXRzCisgICAgbV9wbGF5UGF1c2VCdXR0
b24uZHJhdyhjb250ZXh0KTsKKyAgICBtX3ZvbHVtZVVwQnV0dG9uLmRyYXcoY29udGV4dCk7Cisg
ICAgbV92b2x1bWVTbGlkZXJCdXR0b24uZHJhdyhjb250ZXh0KTsKKyAgICBtX3ZvbHVtZURvd25C
dXR0b24uZHJhdyhjb250ZXh0KTsKKyAgICBtX3RpbWVTbGlkZXJCdXR0b24uZHJhdyhjb250ZXh0
KTsKKyAgICBtX2V4aXRGdWxsc2NyZWVuQnV0dG9uLmRyYXcoY29udGV4dCk7CisgICAgbV92b2x1
bWVTbGlkZXIuZHJhdyhjb250ZXh0KTsKKyAgICBtX3RpbWVTbGlkZXIuZHJhdyhjb250ZXh0KTsK
KworICAgIC8vIERyYXcgdGhlIHRleHQgc3RyaW5ncworICAgIEZvbnREZXNjcmlwdGlvbiBkZXNj
OworCisgICAgTk9OQ0xJRU5UTUVUUklDUyBtZXRyaWNzOworICAgIG1ldHJpY3MuY2JTaXplID0g
c2l6ZW9mKG1ldHJpY3MpOworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvKFNQSV9HRVROT05DTElF
TlRNRVRSSUNTLCBtZXRyaWNzLmNiU2l6ZSwgJm1ldHJpY3MsIDApOworICAgIEZvbnRGYW1pbHkg
ZmFtaWx5OworICAgIGZhbWlseS5zZXRGYW1pbHkobWV0cmljcy5sZlNtQ2FwdGlvbkZvbnQubGZG
YWNlTmFtZSk7CisgICAgZGVzYy5zZXRGYW1pbHkoZmFtaWx5KTsKKworICAgIGRlc2Muc2V0Q29t
cHV0ZWRTaXplKHRleHRTaXplKTsKKyAgICBGb250IGZvbnQgPSBGb250KGRlc2MsIDAsIDApOwor
ICAgIGZvbnQudXBkYXRlKDApOworCisgICAgU3RyaW5nIHM7CisKKyAgICAvLyBMZWZ0IHN0cmlu
ZworICAgIHMgPSB0aW1lVG9TdHJpbmcoY3VycmVudFRpbWUoKSk7CisgICAgVGV4dFJ1biBsZWZ0
VGV4dChzKTsKKyAgICBjb250ZXh0LnNldEZpbGxDb2xvcihDb2xvcih0ZXh0Q29sb3IpLCBEZXZp
Y2VDb2xvclNwYWNlKTsKKyAgICBjb250ZXh0LmRyYXdUZXh0KGZvbnQsIGxlZnRUZXh0LCBJbnRQ
b2ludCh3aW5kb3dXaWR0aCAvIDIgLSB0aW1lU2xpZGVyV2lkdGggLyAyIC0gbWFyZ2luIC0gZm9u
dC53aWR0aChsZWZ0VGV4dCksIHdpbmRvd0hlaWdodCAtIG1hcmdpbiAtIHNsaWRlckhlaWdodCAv
IDIgKyAzKSk7CisKKyAgICAvLyBSaWdodCBzdHJpbmcKKyAgICBzID0gdGltZVRvU3RyaW5nKGN1
cnJlbnRUaW1lKCkgLSBkdXJhdGlvbigpKTsKKyAgICBUZXh0UnVuIHJpZ2h0VGV4dChzKTsKKyAg
ICBjb250ZXh0LnNldEZpbGxDb2xvcihDb2xvcih0ZXh0Q29sb3IpLCBEZXZpY2VDb2xvclNwYWNl
KTsKKyAgICBjb250ZXh0LmRyYXdUZXh0KGZvbnQsIHJpZ2h0VGV4dCwgSW50UG9pbnQod2luZG93
V2lkdGggLyAyICsgdGltZVNsaWRlcldpZHRoIC8gMiArIG1hcmdpbiwgd2luZG93SGVpZ2h0IC0g
bWFyZ2luIC0gc2xpZGVySGVpZ2h0IC8gMiArIDMpKTsKKworICAgIC8vIENvcHkgdG8gdGhlIHdp
bmRvdworICAgIEJMRU5ERlVOQ1RJT04gYmxlbmRGdW5jdGlvbiA9IHtBQ19TUkNfT1ZFUiwgMCwg
MjU1LCBBQ19TUkNfQUxQSEF9OworICAgIFNJWkUgc2l6ZSA9IHsgd2luZG93V2lkdGgsIHdpbmRv
d0hlaWdodCB9OworICAgIFBPSU5UIHNvdXJjZVBvaW50ID0gezAsIDB9OworICAgIFBPSU5UIGRl
c3RQb2ludCA9IHsgbV9odWRQb3NpdGlvbi54KCksIG1faHVkUG9zaXRpb24ueSgpIH07CisgICAg
Qk9PTCByZXN1bHQgPSBVcGRhdGVMYXllcmVkV2luZG93KG1faHVkV2luZG93LCB3aW5kb3dEQywg
JmRlc3RQb2ludCwgJnNpemUsIGJpdG1hcERDLCAmc291cmNlUG9pbnQsIDAsICZibGVuZEZ1bmN0
aW9uLCBVTFdfQUxQSEEpOworICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisKKyAg
ICBjb250ZXh0LnJlc3RvcmUoKTsKKworICAgIDo6RGVsZXRlREMoYml0bWFwREMpOworICAgIDo6
UmVsZWFzZURDKG1faHVkV2luZG93LCB3aW5kb3dEQyk7Cit9CisKK0xSRVNVTFQgRnVsbHNjcmVl
blZpZGVvQ29udHJvbGxlcjo6aHVkV25kUHJvYyhIV05EIHduZCwgVUlOVCBtZXNzYWdlLCBVSU5U
IHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgTE9OR19QVFIgbG9uZ1B0ciA9IEdldFdpbmRv
d0xvbmdQdHIod25kLCAwKTsKKyAgICBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKiBjb250cm9s
bGVyID0gcmVpbnRlcnByZXRfY2FzdDxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKj4obG9uZ1B0
cik7CisgICAgaWYgKCFjb250cm9sbGVyKQorICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyh3
bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIHN3aXRjaCAobWVzc2FnZSkgewor
ICAgIGNhc2UgV01fUEFJTlQ6CisgICAgICAgIFBBSU5UU1RSVUNUIHBzOworICAgICAgICBCZWdp
blBhaW50KHduZCwgJnBzKTsKKyAgICAgICAgY29udHJvbGxlci0+ZHJhdygpOworICAgICAgICBF
bmRQYWludCh3bmQsICZwcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV01fQ0hBUjoKKyAg
ICAgICAgY29udHJvbGxlci0+b25DaGFyKHdQYXJhbSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgV01fTEJVVFRPTkRPV046CisgICAgICAgIGNvbnRyb2xsZXItPm9uTW91c2VEb3duKEdFVF9Y
X0xQQVJBTShsUGFyYW0pLCBHRVRfWV9MUEFSQU0obFBhcmFtKSk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgV01fTU9VU0VNT1ZFOgorICAgICAgICBjb250cm9sbGVyLT5vbk1vdXNlTW92ZShH
RVRfWF9MUEFSQU0obFBhcmFtKSwgR0VUX1lfTFBBUkFNKGxQYXJhbSkpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFdNX0xCVVRUT05VUDoKKyAgICAgICAgY29udHJvbGxlci0+b25Nb3VzZVVw
KEdFVF9YX0xQQVJBTShsUGFyYW0pLCBHRVRfWV9MUEFSQU0obFBhcmFtKSk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKHduZCwgbWVzc2FnZSwgd1Bh
cmFtLCBsUGFyYW0pOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6Om9uQ2hh
cihpbnQgYykKK3sKKyAgICBpZiAoYyA9PSAweDFiKSB7CisgICAgICAgIC8vIEVTQyBleGl0cyBm
dWxsLXNjcmVlbgorICAgICAgICBpZiAobV9tZWRpYUVsZW1lbnQpCisgICAgICAgICAgICBtX21l
ZGlhRWxlbWVudC0+ZXhpdEZ1bGxzY3JlZW4oKTsKKyAgICB9IGVsc2UgaWYgKGMgPT0gMHgyMCkg
eworICAgICAgICAvLyBTUEFDRSB0b2dnbGVzIHBsYXkvcGF1c2UKKyAgICAgICAgdG9nZ2xlUGxh
eSgpOworICAgIH0KK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp0aW1lckZp
cmVkKFdlYkNvcmU6OlRpbWVyPEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI+KikKK3sKKyAgICAv
LyBXaGVuIHRoZSBtb3ZpZSBpcyBwbGF5aW5nLCB0aGUgZXZlbnQgcXVldWUgc2VlbXMgdG8gYmUg
Z2V0dGluZyBzdGFydmVkLAorICAgIC8vIHNvIHdlIGZpcmUgYSB0aW1lciBldmVyeSAzM21zIGFu
ZCBzaW11bGF0ZSBhIG1vdXNlIG1vdmUuIFRoaXMgb25seQorICAgIC8vIGhhcHBlbnMgd2hlbiB0
aGUgbGVmdCBidXR0b24gaXMgZG93bgorICAgIGlmIChtX3BpY2tlZFdpZGdldCB8fCBtX21vdmlu
Z1dpbmRvdykgeworICAgICAgICBQT0lOVCBwOworICAgICAgICBHZXRDdXJzb3JQb3MoJnApOwor
ICAgICAgICBvbk1vdXNlTW92ZShwLngsIHAueSk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRo
ZSB0aW1lIHNsaWRlcgorICAgIG1fdGltZVNsaWRlci5zZXRWYWx1ZShjdXJyZW50VGltZSgpIC8g
ZHVyYXRpb24oKSk7CisgICAgZHJhdygpOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRy
b2xsZXI6Om9uTW91c2VEb3duKGludCB4LCBpbnQgeSkKK3sKKyAgICBmdWxsU2NyZWVuVG9IVURD
b29yZGluYXRlcyh4LCB5KTsKKworICAgIC8vIERvbid0IGJvdGhlciBoaXQgdGVzdGluZyBpZiB3
ZSdyZSBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIHdpbmRvdworICAgIGlmICh4IDwgMCB8fCB4
ID49IHdpbmRvd1dpZHRoIHx8IHkgPCAwIHx8IHkgPj0gd2luZG93SGVpZ2h0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX3BpY2tlZFdpZGdldCA9IDA7CisgICAgbV9tb3ZpbmdXaW5kb3cgPSBm
YWxzZTsKKworICAgIGlmIChtX3BsYXlQYXVzZUJ1dHRvbi5oaXRUZXN0KHgsIHkpKQorICAgICAg
ICBtX3BpY2tlZFdpZGdldCA9ICZtX3BsYXlQYXVzZUJ1dHRvbjsKKyAgICBlbHNlIGlmIChtX2V4
aXRGdWxsc2NyZWVuQnV0dG9uLmhpdFRlc3QoeCwgeSkpCisgICAgICAgIG1fcGlja2VkV2lkZ2V0
ID0gJm1fZXhpdEZ1bGxzY3JlZW5CdXR0b247CisgICAgZWxzZSBpZiAobV92b2x1bWVVcEJ1dHRv
bi5oaXRUZXN0KHgsIHkpKQorICAgICAgICBtX3BpY2tlZFdpZGdldCA9ICZtX3ZvbHVtZVVwQnV0
dG9uOworICAgIGVsc2UgaWYgKG1fdm9sdW1lRG93bkJ1dHRvbi5oaXRUZXN0KHgsIHkpKQorICAg
ICAgICBtX3BpY2tlZFdpZGdldCA9ICZtX3ZvbHVtZURvd25CdXR0b247CisgICAgZWxzZSBpZiAo
bV92b2x1bWVTbGlkZXIuaGl0VGVzdCh4LCB5KSkgeworICAgICAgICBtX3BpY2tlZFdpZGdldCA9
ICZtX3ZvbHVtZVNsaWRlcjsKKyAgICAgICAgbV92b2x1bWVTbGlkZXIuZHJhZyh4LCB5LCB0cnVl
KTsKKyAgICB9IGVsc2UgaWYgKG1fdGltZVNsaWRlci5oaXRUZXN0KHgsIHkpKSB7CisgICAgICAg
IG1fcGlja2VkV2lkZ2V0ID0gJm1fdGltZVNsaWRlcjsKKyAgICAgICAgbV90aW1lU2xpZGVyLmRy
YWcoeCwgeSwgdHJ1ZSk7CisgICAgICAgIGJlZ2luU2NydWJiaW5nKCk7CisgICAgfQorCisgICAg
Ly8gSWYgd2UgZGlkIG5vdCBwaWNrIGFueSBvZiBvdXIgd2lkZ2V0cyB3ZSBhcmUgc3RhcnRpbmcg
YSB3aW5kb3cgbW92ZQorICAgIGlmICghbV9waWNrZWRXaWRnZXQpIHsKKyAgICAgICAgbV9tb3Zl
T2Zmc2V0LnNldFgoeCk7CisgICAgICAgIG1fbW92ZU9mZnNldC5zZXRZKHkpOworICAgICAgICBt
X21vdmluZ1dpbmRvdyA9IHRydWU7CisgICAgfQorCisgICAgbV90aW1lci5zdGFydFJlcGVhdGlu
Zyh0aW1lckludGVydmFsKTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpv
bk1vdXNlTW92ZShpbnQgeCwgaW50IHkpCit7CisgICAgZnVsbFNjcmVlblRvSFVEQ29vcmRpbmF0
ZXMoeCwgeSk7CisKKyAgICBpZiAobV9waWNrZWRXaWRnZXQpIHsKKyAgICAgICAgbV9waWNrZWRX
aWRnZXQtPmRyYWcoeCwgeSwgZmFsc2UpOworICAgICAgICBpZiAobV9waWNrZWRXaWRnZXQgPT0g
Jm1fdm9sdW1lU2xpZGVyKQorICAgICAgICAgICAgc2V0Vm9sdW1lKG1fdm9sdW1lU2xpZGVyLnZh
bHVlKCkpOworICAgICAgICBlbHNlIGlmIChtX3BpY2tlZFdpZGdldCA9PSAmbV90aW1lU2xpZGVy
KQorICAgICAgICAgICAgc2V0Q3VycmVudFRpbWUobV90aW1lU2xpZGVyLnZhbHVlKCkgKiBkdXJh
dGlvbigpKTsKKyAgICAgICAgZHJhdygpOworICAgIH0gZWxzZSBpZiAobV9tb3ZpbmdXaW5kb3cp
IHsKKyAgICAgICAgbV9odWRQb3NpdGlvbi5tb3ZlKHggLSBtX21vdmVPZmZzZXQueCgpLCB5IC0g
bV9tb3ZlT2Zmc2V0LnkoKSk7CisgICAgICAgIGRyYXcoKTsKKyAgICB9Cit9CisKK3ZvaWQgRnVs
bHNjcmVlblZpZGVvQ29udHJvbGxlcjo6b25Nb3VzZVVwKGludCB4LCBpbnQgeSkKK3sKKyAgICBm
dWxsU2NyZWVuVG9IVURDb29yZGluYXRlcyh4LCB5KTsKKyAgICBtX21vdmluZ1dpbmRvdyA9IGZh
bHNlOworCisgICAgLy8gV2UgYXJlIHJ1bm5pbmcgYSB0aW1lciBkdXJpbmcgbW91c2UgbW92ZXMu
IFdlIHdhbnQgdG8gYWxzbyBydW4gaXQKKyAgICAvLyB3aGlsZSB0aGUgdmlkZW8gaXMgcGxheWlu
ZyB0byB1cGRhdGUgdGhlIHRpbWUgc2xpZGVyLiBTbyBkb24ndCBzdG9wCisgICAgLy8gaXQgaWYg
dGhlIHZpZGVvIGlzIHJ1bm5pbmcKKyAgICBpZiAoY2FuUGxheSgpKQorICAgICAgICBtX3RpbWVy
LnN0b3AoKTsKKworICAgIGlmIChtX3BpY2tlZFdpZGdldCkgeworICAgICAgICBpZiAobV9wbGF5
UGF1c2VCdXR0b24uaGl0VGVzdCh4LCB5KSkKKyAgICAgICAgICAgIHRvZ2dsZVBsYXkoKTsKKyAg
ICAgICAgZWxzZSBpZiAobV92b2x1bWVVcEJ1dHRvbi5oaXRUZXN0KHgsIHkpKSB7CisgICAgICAg
ICAgICBzZXRWb2x1bWUoMSk7CisgICAgICAgICAgICBtX3ZvbHVtZVNsaWRlci5zZXRWYWx1ZSgx
KTsKKyAgICAgICAgfSBlbHNlIGlmIChtX3ZvbHVtZURvd25CdXR0b24uaGl0VGVzdCh4LCB5KSkg
eworICAgICAgICAgICAgc2V0Vm9sdW1lKDApOworICAgICAgICAgICAgbV92b2x1bWVTbGlkZXIu
c2V0VmFsdWUoMCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9waWNrZWRXaWRnZXQgPT0gJm1fdGlt
ZVNsaWRlcikKKyAgICAgICAgICAgIGVuZFNjcnViYmluZygpOworICAgICAgICBlbHNlIGlmICht
X2V4aXRGdWxsc2NyZWVuQnV0dG9uLmhpdFRlc3QoeCwgeSkpIHsKKyAgICAgICAgICAgIGlmICht
X21lZGlhRWxlbWVudCkKKyAgICAgICAgICAgICAgICBtX21lZGlhRWxlbWVudC0+ZXhpdEZ1bGxz
Y3JlZW4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1f
cGlja2VkV2lkZ2V0ID0gMDsKKyAgICBkcmF3KCk7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVv
Q29udHJvbGxlcjo6dG9nZ2xlUGxheSgpCit7CisgICAgaWYgKGNhblBsYXkoKSkKKyAgICAgICAg
cGxheSgpOworICAgIGVsc2UKKyAgICAgICAgcGF1c2UoKTsKKworICAgIG1fcGxheVBhdXNlQnV0
dG9uLnNldFNob3dBbHRCdXR0b24oIWNhblBsYXkoKSk7CisgICAgaWYgKCFjYW5QbGF5KCkpCisg
ICAgICAgIG1fdGltZXIuc3RhcnRSZXBlYXRpbmcodGltZXJJbnRlcnZhbCk7CisgICAgZWxzZQor
ICAgICAgICBtX3RpbWVyLnN0b3AoKTsKK30KKworI2VuZGlmCgpQcm9wZXJ0eSBjaGFuZ2VzIG9u
OiBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIuY3BwCl9fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRk
ZWQ6IHN2bjpleGVjdXRhYmxlCiAgICsgKgoKSW5kZXg6IFdlYktpdC93aW4vRnVsbHNjcmVlblZp
ZGVvQ29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vRnVsbHNjcmVlblZpZGVv
Q29udHJvbGxlci5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L3dpbi9GdWxsc2NyZWVuVmlkZW9D
b250cm9sbGVyLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lm
bmRlZiBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyX2gKKyNkZWZpbmUgRnVsbHNjcmVlblZpZGVv
Q29udHJvbGxlcl9oCisKKyNpZiBFTkFCTEUoVklERU8pCisKKyNpbmNsdWRlICJRVE1vdmllV2lu
LmgiCisKKyNpbmNsdWRlIDxXZWJDb3JlL0hUTUxNZWRpYUVsZW1lbnQuaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL0ltYWdlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbnRQb2ludC5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvSW50U2l6ZS5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKK30KKworY2xhc3MgSFVEV2lk
Z2V0IHsKK3B1YmxpYzoKKyAgICBIVURXaWRnZXQoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgcmVj
dCkKKyAgICAgICAgOiBtX3JlY3QocmVjdCkKKyAgICB7IH0KKyAgICAKKyAgICB2aXJ0dWFsIH5I
VURXaWRnZXQoKSB7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkcmF3KFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dCYpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhZyhpbnQgeCwgaW50IHksIGJvb2wg
c3RhcnQpID0gMDsKKyAgICBib29sIGhpdFRlc3QoaW50IHgsIGludCB5KSBjb25zdCB7IHJldHVy
biB4ID49IG1fcmVjdC54KCkgJiYgeCA8IG1fcmVjdC54KCkgKyBtX3JlY3Qud2lkdGgoKSAmJiB5
ID49IG1fcmVjdC55KCkgJiYgeSA8IG1fcmVjdC55KCkgKyBtX3JlY3QuaGVpZ2h0KCk7IH0KKwor
cHJvdGVjdGVkOgorICAgIFdlYkNvcmU6OkludFJlY3QgbV9yZWN0OworfTsKKworY2xhc3MgSFVE
QnV0dG9uIDogcHVibGljIEhVRFdpZGdldCB7CitwdWJsaWM6CisgICAgZW51bSBIVURCdXR0b25U
eXBlIHsKKyAgICAgICAgTm9CdXR0b24sCisgICAgICAgIFBsYXlQYXVzZUJ1dHRvbiwKKyAgICAg
ICAgVGltZVNsaWRlckJ1dHRvbiwKKyAgICAgICAgVm9sdW1lVXBCdXR0b24sCisgICAgICAgIFZv
bHVtZVNsaWRlckJ1dHRvbiwKKyAgICAgICAgVm9sdW1lRG93bkJ1dHRvbiwKKyAgICAgICAgRXhp
dEZ1bGxzY3JlZW5CdXR0b24KKyAgICB9OworCisgICAgSFVEQnV0dG9uKEhVREJ1dHRvblR5cGUg
dHlwZSwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKTsKKyAgICB+SFVEQnV0dG9uKCkgeyB9CisK
KyAgICB2aXJ0dWFsIHZvaWQgZHJhdyhXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQmKTsKKyAgICB2
aXJ0dWFsIHZvaWQgZHJhZyhpbnQgeCwgaW50IHksIGJvb2wgc3RhcnQpIHsgfQorICAgIHZvaWQg
c2V0U2hvd0FsdEJ1dHRvbihib29sIGIpICB7IG1fc2hvd0FsdEJ1dHRvbiA9IGI7IH0KKworcHJp
dmF0ZToKKyAgICBSZWZQdHI8V2ViQ29yZTo6SW1hZ2U+IG1fYnV0dG9uSW1hZ2U7CisgICAgUmVm
UHRyPFdlYkNvcmU6OkltYWdlPiBtX2J1dHRvbkltYWdlQWx0OworICAgIEhVREJ1dHRvblR5cGUg
bV90eXBlOworICAgIGJvb2wgbV9zaG93QWx0QnV0dG9uOworfTsKKworY2xhc3MgSFVEU2xpZGVy
IDogcHVibGljIEhVRFdpZGdldCB7CitwdWJsaWM6CisgICAgZW51bSBIVURTbGlkZXJCdXR0b25T
aGFwZSB7IFJvdW5kQnV0dG9uLCBEaWFtb25kQnV0dG9uIH07CisKKyAgICBIVURTbGlkZXIoSFVE
U2xpZGVyQnV0dG9uU2hhcGUsIGludCBidXR0b25TaXplLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0
JiByZWN0KTsKKyAgICB+SFVEU2xpZGVyKCkgeyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZHJhdyhX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQmKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhZyhpbnQgeCwg
aW50IHksIGJvb2wgc3RhcnQpOworICAgIGZsb2F0IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KG1fc2xpZGVyUG9zaXRpb24pIC8gKG1fcmVjdC53aWR0aCgpIC0gbV9i
dXR0b25TaXplKTsgfQorICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsgbV9zbGlkZXJQ
b3NpdGlvbiA9IHN0YXRpY19jYXN0PGludD4odmFsdWUgKiAobV9yZWN0LndpZHRoKCkgLSBtX2J1
dHRvblNpemUpKTsgfQorCitwcml2YXRlOgorICAgIEhVRFNsaWRlckJ1dHRvblNoYXBlIG1fYnV0
dG9uU2hhcGU7CisgICAgaW50IG1fYnV0dG9uU2l6ZTsKKyAgICBpbnQgbV9zbGlkZXJQb3NpdGlv
bjsKKyAgICBpbnQgbV9kcmFnU3RhcnRPZmZzZXQ7Cit9OworCitjbGFzcyBGdWxsc2NyZWVuVmlk
ZW9Db250cm9sbGVyIDogUVRNb3ZpZVdpbkZ1bGxzY3JlZW5DbGllbnQsIHB1YmxpYyBOb25jb3B5
YWJsZSB7CitwdWJsaWM6CisgICAgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcigpOworICAgIHZp
cnR1YWwgfkZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIoKTsKKworICAgIHZvaWQgc2V0TWVkaWFF
bGVtZW50KFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQqKTsKKyAgICBXZWJDb3JlOjpIVE1MTWVk
aWFFbGVtZW50KiBtZWRpYUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX21lZGlhRWxlbWVudC5n
ZXQoKTsgfQorCisgICAgdm9pZCBlbnRlckZ1bGxzY3JlZW4oKTsKKyAgICB2b2lkIGV4aXRGdWxs
c2NyZWVuKCk7CisKK3ByaXZhdGU6CisgICAgLy8gUVRNb3ZpZVdpbkZ1bGxzY3JlZW5DbGllbnQK
KyAgICB2aXJ0dWFsIExSRVNVTFQgZnVsbHNjcmVlbkNsaWVudFduZFByb2MoSFdORCwgVUlOVCBt
ZXNzYWdlLCBVSU5UIHdQYXJhbSwgTE9ORyBsUGFyYW0pOworCisgICAgdm9pZCBlbnN1cmVXaW5k
b3coKTsKKyAgICBRVE1vdmllV2luKiBtb3ZpZSgpIGNvbnN0OworCisgICAgYm9vbCBjYW5QbGF5
KCkgY29uc3Q7CisgICAgdm9pZCBwbGF5KCk7CisgICAgdm9pZCBwYXVzZSgpOworICAgIGZsb2F0
IHZvbHVtZSgpIGNvbnN0OworICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0KTsKKyAgICBmbG9hdCBj
dXJyZW50VGltZSgpIGNvbnN0OworICAgIHZvaWQgc2V0Q3VycmVudFRpbWUoZmxvYXQpOworICAg
IGZsb2F0IGR1cmF0aW9uKCkgY29uc3Q7CisgICAgdm9pZCBiZWdpblNjcnViYmluZygpOworICAg
IHZvaWQgZW5kU2NydWJiaW5nKCk7CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6SFRNTE1lZGlhRWxl
bWVudD4gbV9tZWRpYUVsZW1lbnQ7CisKKyAgICBIV05EIG1faHVkV2luZG93LCBtX3ZpZGVvV2lu
ZG93OworICAgIE93blB0cjxIQklUTUFQPiBtX2JpdG1hcDsKKyAgICBXZWJDb3JlOjpJbnRTaXpl
IG1fZnVsbHNjcmVlblNpemU7CisgICAgV2ViQ29yZTo6SW50UG9pbnQgbV9odWRQb3NpdGlvbjsK
KworICAgIC8vIEhVRCBTdXBwb3J0CisgICAgdm9pZCBmdWxsU2NyZWVuVG9IVURDb29yZGluYXRl
cyhpbnQmIHgsIGludCYgeSkgY29uc3QKKyAgICB7CisgICAgICAgIHggLT0gbV9odWRQb3NpdGlv
bi54KCk7CisgICAgICAgIHkgLT0gbV9odWRQb3NpdGlvbi55KCk7CisgICAgfQorCisgICAgc3Rh
dGljIHZvaWQgcmVnaXN0ZXJIVURXaW5kb3dDbGFzcygpOworICAgIHN0YXRpYyBMUkVTVUxUIENB
TExCQUNLIGh1ZFduZFByb2MoSFdORCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFS
QU0gbFBhcmFtKTsKKyAgICB2b2lkIGNyZWF0ZUhVRFdpbmRvdygpOworICAgIHZvaWQgdGltZXJG
aXJlZChXZWJDb3JlOjpUaW1lcjxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyPiopOworCisgICAg
dm9pZCB0b2dnbGVQbGF5KCk7CisgICAgdm9pZCBkcmF3KCk7CisKKyAgICB2b2lkIG9uQ2hhcihp
bnQgYyk7CisgICAgdm9pZCBvbk1vdXNlRG93bihpbnQgeCwgaW50IHkpOworICAgIHZvaWQgb25N
b3VzZU1vdmUoaW50IHgsIGludCB5KTsKKyAgICB2b2lkIG9uTW91c2VVcChpbnQgeCwgaW50IHkp
OworCisgICAgSFVEQnV0dG9uIG1fcGxheVBhdXNlQnV0dG9uOworICAgIEhVREJ1dHRvbiBtX3Rp
bWVTbGlkZXJCdXR0b247CisgICAgSFVEQnV0dG9uIG1fdm9sdW1lVXBCdXR0b247CisgICAgSFVE
QnV0dG9uIG1fdm9sdW1lU2xpZGVyQnV0dG9uOworICAgIEhVREJ1dHRvbiBtX3ZvbHVtZURvd25C
dXR0b247CisgICAgSFVEQnV0dG9uIG1fZXhpdEZ1bGxzY3JlZW5CdXR0b247CisgICAgSFVEU2xp
ZGVyIG1fdm9sdW1lU2xpZGVyOworICAgIEhVRFNsaWRlciBtX3RpbWVTbGlkZXI7CisKKyAgICBI
VURXaWRnZXQqIG1fcGlja2VkV2lkZ2V0OworICAgIFdlYkNvcmU6OkludFBvaW50IG1fbW92ZU9m
ZnNldDsKKyAgICBib29sIG1fbW92aW5nV2luZG93OworICAgIFdlYkNvcmU6OlRpbWVyPEZ1bGxz
Y3JlZW5WaWRlb0NvbnRyb2xsZXI+IG1fdGltZXI7Cit9OworCisjZW5kaWYKKworI2VuZGlmIC8v
IEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXJfaAoKUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViS2l0
L3dpbi9GdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyLmgKX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmV4
ZWN1dGFibGUKICAgKyAqCgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXRETEwuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdC93aW4vV2ViS2l0RExMLmNwcAkocmV2aXNpb24gNTI3NjgpCisrKyBXZWJL
aXQvd2luL1dlYktpdERMTC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3OSw2ICsxNzksMTYgQEAg
UGFzc1JlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGxvYWRSZQogICAgICAgICBpZHIgPSBJ
RFJfWk9PTV9PVVRfQ1VSU09SOwogICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInZlcnRpY2Fs
VGV4dEN1cnNvciIpKQogICAgICAgICBpZHIgPSBJRFJfVkVSVElDQUxfVEVYVF9DVVJTT1I7Cisg
ICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZnNWaWRlb0F1ZGlvVm9sdW1lSGlnaCIpKQorICAg
ICAgICBpZHIgPSBJRFJfRlNfVklERU9fQVVESU9fVk9MVU1FX0hJR0g7CisgICAgZWxzZSBpZiAo
IXN0cmNtcChuYW1lLCAiZnNWaWRlb0F1ZGlvVm9sdW1lTG93IikpCisgICAgICAgIGlkciA9IElE
Ul9GU19WSURFT19BVURJT19WT0xVTUVfTE9XOworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwg
ImZzVmlkZW9FeGl0RnVsbHNjcmVlbiIpKQorICAgICAgICBpZHIgPSBJRFJfRlNfVklERU9fRVhJ
VF9GVUxMU0NSRUVOOworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZzVmlkZW9QYXVzZSIp
KQorICAgICAgICBpZHIgPSBJRFJfRlNfVklERU9fUEFVU0U7CisgICAgZWxzZSBpZiAoIXN0cmNt
cChuYW1lLCAiZnNWaWRlb1BsYXkiKSkKKyAgICAgICAgaWRyID0gSURSX0ZTX1ZJREVPX1BMQVk7
CiAgICAgZWxzZQogICAgICAgICByZXR1cm4gMDsKIApJbmRleDogV2ViS2l0L3dpbi9XZWJWaWV3
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZpZXcuY3BwCShyZXZpc2lvbiA1Mjc2
OCkKKysrIFdlYktpdC93aW4vV2ViVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0LDExICsy
NCwxMiBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJXZWJLaXRETEwu
aCIKKwogI2luY2x1ZGUgIldlYlZpZXcuaCIKIAogI2luY2x1ZGUgIkNGRGljdGlvbmFyeVByb3Bl
cnR5QmFnLmgiCiAjaW5jbHVkZSAiRE9NQ29yZUNsYXNzZXMuaCIKKyNpbmNsdWRlICJGdWxsc2Ny
ZWVuVmlkZW9Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAiTWFyc2hhbGxpbmdIZWxwZXJzLmgiCiAj
aW5jbHVkZSAiU29mdExpbmtpbmcuaCIKICNpbmNsdWRlICJXZWJCYWNrRm9yd2FyZExpc3QuaCIK
QEAgLTQ2LDYgKzQ3LDcgQEAKICNpbmNsdWRlICJXZWJJbnNwZWN0b3IuaCIKICNpbmNsdWRlICJX
ZWJJbnNwZWN0b3JDbGllbnQuaCIKICNpbmNsdWRlICJXZWJLaXQuaCIKKyNpbmNsdWRlICJXZWJL
aXRETEwuaCIKICNpbmNsdWRlICJXZWJLaXRMb2dnaW5nLmgiCiAjaW5jbHVkZSAiV2ViS2l0U3Rh
dGlzdGljc1ByaXZhdGUuaCIKICNpbmNsdWRlICJXZWJLaXRTeXN0ZW1CaXRzLmgiCkBAIC01OCwx
NyArNjAsMTcgQEAKICNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9Jbml0aWFsaXplVGhyZWFkaW5n
Lmg+CiAjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSlNMb2NrLmg+CiAjaW5jbHVkZSA8SmF2YVNj
cmlwdENvcmUvSlNWYWx1ZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvQXBwbGljYXRpb25DYWNoZVN0
b3JhZ2UuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0FYT2JqZWN0Q2FjaGUuaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL0FwcGxpY2F0aW9uQ2FjaGVTdG9yYWdlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9CU3Ry
aW5nLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9CYWNrRm9yd2FyZExpc3QuaD4KICNpbmNsdWRlIDxX
ZWJDb3JlL0JpdG1hcEluZm8uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL0JTdHJpbmcuaD4KKyNpbmNs
dWRlIDxXZWJDb3JlL0NTdHJpbmcuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0NhY2hlLmg+CiAjaW5j
bHVkZSA8V2ViQ29yZS9DaHJvbWUuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0NvbnRleHRNZW51Lmg+
CiAjaW5jbHVkZSA8V2ViQ29yZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuaD4KICNpbmNsdWRlIDxX
ZWJDb3JlL0Nvb2tpZVN0b3JhZ2VXaW4uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL0NTdHJpbmcuaD4K
ICNpbmNsdWRlIDxXZWJDb3JlL0N1cnNvci5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRG9jdW1lbnQu
aD4KICNpbmNsdWRlIDxXZWJDb3JlL0RyYWdDb250cm9sbGVyLmg+CkBAIC03NywxNCArNzksMTYg
QEAKICNpbmNsdWRlIDxXZWJDb3JlL0V2ZW50SGFuZGxlci5oPgogI2luY2x1ZGUgPFdlYkNvcmUv
RXZlbnROYW1lcy5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgotI2luY2x1ZGUg
PFdlYkNvcmUvRm9jdXNDb250cm9sbGVyLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GbG9hdFF1YWQu
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ZvY3VzQ29udHJvbGxlci5oPgogI2luY2x1ZGUgPFdlYkNv
cmUvRnJhbWVMb2FkZXIuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lVHJlZS5oPgogI2luY2x1
ZGUgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZVdpbi5oPgog
I2luY2x1ZGUgPFdlYkNvcmUvR0RJT2JqZWN0Q291bnRlci5oPgogI2luY2x1ZGUgPFdlYkNvcmUv
R3JhcGhpY3NDb250ZXh0Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9IVE1MTWVkaWFFbGVtZW50Lmg+
CisjaW5jbHVkZSA8V2ViQ29yZS9IVE1MTmFtZXMuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0hpc3Rv
cnlJdGVtLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9IaXRUZXN0UmVxdWVzdC5oPgogI2luY2x1ZGUg
PFdlYkNvcmUvSGl0VGVzdFJlc3VsdC5oPgpAQCAtMTMzLDEzICsxMzcsMTMgQEAKICNpbmNsdWRl
IDxXZWJLaXRTeXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+IAogI2VuZGlm
CiAKLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPFNobE9iai5oPgogI2luY2x1
ZGUgPGNvbXV0aWwuaD4KICNpbmNsdWRlIDxkaW1tLmg+CiAjaW5jbHVkZSA8b2xlYWNjLmg+Ci0j
aW5jbHVkZSA8U2hsT2JqLmg+CiAjaW5jbHVkZSA8dGNoYXIuaD4KICNpbmNsdWRlIDx3aW5kb3dz
eC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAKIC8vIFNvZnQgbGluayBmdW5jdGlvbnMg
Zm9yIGdlc3R1cmVzIGFuZCBwYW5uaW5nIGZlZWRiYWNrCiBTT0ZUX0xJTktfTElCUkFSWShVU0VS
MzIpOwpAQCAtNTYyNSw2ICs1NjI5LDQyIEBAIHN0YXRpYyBLVVJMIHRvS1VSTChCU1RSIGJzdHIp
CiAgICAgcmV0dXJuIEtVUkwoS1VSTCgpLCB0b1N0cmluZyhic3RyKSk7CiB9CiAKK3ZvaWQgV2Vi
Vmlldzo6ZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9k
ZS0+aGFzVGFnTmFtZShXZWJDb3JlOjpIVE1MTmFtZXM6OnZpZGVvVGFnKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgSFRNTE1lZGlhRWxlbWVudCogdmlkZW9FbGVtZW50ID0gc3RhdGljX2Nhc3Q8
SFRNTE1lZGlhRWxlbWVudCo+KG5vZGUpOworCisgICAgaWYgKG1fZnVsbHNjcmVlbkNvbnRyb2xs
ZXIpIHsKKyAgICAgICAgaWYgKG1fZnVsbHNjcmVlbkNvbnRyb2xsZXItPm1lZGlhRWxlbWVudCgp
ID09IHZpZGVvRWxlbWVudCkgeworICAgICAgICAgICAgLy8gVGhlIGJhY2tlbmQgbWF5IGp1c3Qg
d2FybiB1cyB0aGF0IHRoZSB1bmRlcmxheWluZyBwbGFmdG9ybU1vdmllKCkKKyAgICAgICAgICAg
IC8vIGhhcyBjaGFuZ2VkLiBKdXN0IGZvcmNlIGFuIHVwZGF0ZS4KKyAgICAgICAgICAgIG1fZnVs
bHNjcmVlbkNvbnRyb2xsZXItPnNldE1lZGlhRWxlbWVudCh2aWRlb0VsZW1lbnQpOworICAgICAg
ICAgICAgcmV0dXJuOyAvLyBObyBtb3JlIHRvIGRvLgorICAgICAgICB9CisKKyAgICAgICAgLy8g
Rmlyc3QgZXhpdCBGdWxsc2NyZWVuIGZvciB0aGUgb2xkIG1lZGlhRWxlbWVudC4KKyAgICAgICAg
bV9mdWxsc2NyZWVuQ29udHJvbGxlci0+bWVkaWFFbGVtZW50KCktPmV4aXRGdWxsc2NyZWVuKCk7
CisgICAgICAgIC8vIFRoaXMgcHJldmlvdXMgY2FsbCBoYXMgdG8gdHJpZ2dlciBleGl0RnVsbHNj
cmVlbiwKKyAgICAgICAgLy8gd2hpY2ggaGFzIHRvIGNsZWFyIG1fZnVsbHNjcmVlbkNvbnRyb2xs
ZXIuCisgICAgICAgIEFTU0VSVCghbV9mdWxsc2NyZWVuQ29udHJvbGxlcik7CisgICAgfQorICAg
IGlmICghbV9mdWxsc2NyZWVuQ29udHJvbGxlcikgeworICAgICAgICBtX2Z1bGxzY3JlZW5Db250
cm9sbGVyID0gbmV3IEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIoKTsKKyAgICAgICAgbV9mdWxs
c2NyZWVuQ29udHJvbGxlci0+c2V0TWVkaWFFbGVtZW50KHZpZGVvRWxlbWVudCk7CisgICAgICAg
IG1fZnVsbHNjcmVlbkNvbnRyb2xsZXItPmVudGVyRnVsbHNjcmVlbigpOyAgICAgICAgCisgICAg
fSBlbHNlCisgICAgICAgIG1fZnVsbHNjcmVlbkNvbnRyb2xsZXItPnNldE1lZGlhRWxlbWVudCh2
aWRlb0VsZW1lbnQpOworfQorCit2b2lkIFdlYlZpZXc6OmV4aXRGdWxsc2NyZWVuKCkKK3sKKyAg
ICBpZiAobV9mdWxsc2NyZWVuQ29udHJvbGxlcikKKyAgICAgICAgbV9mdWxsc2NyZWVuQ29udHJv
bGxlci0+ZXhpdEZ1bGxzY3JlZW4oKTsKKyAgICBtX2Z1bGxzY3JlZW5Db250cm9sbGVyID0gMDsK
K30KKwogc3RhdGljIFBhc3NPd25QdHI8VmVjdG9yPFN0cmluZz4gPiB0b1N0cmluZ1ZlY3Rvcih1
bnNpZ25lZCBwYXR0ZXJuc0NvdW50LCBCU1RSKiBwYXR0ZXJucykKIHsKICAgICAvLyBDb252ZXJ0
IHRoZSBwYXR0ZXJucyBpbnRvIGEgVmVjdG9yLgpJbmRleDogV2ViS2l0L3dpbi9XZWJWaWV3LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJWaWV3LmgJKHJldmlzaW9uIDUyNzY4KQorKysg
V2ViS2l0L3dpbi9XZWJWaWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTM5LDggKzM5LDkgQEAKICNp
bmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KIAotY2xhc3Mg
V2ViRnJhbWU7CitjbGFzcyBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOwogY2xhc3MgV2ViQmFj
a0ZvcndhcmRMaXN0OworY2xhc3MgV2ViRnJhbWU7CiBjbGFzcyBXZWJJbnNwZWN0b3I7CiBjbGFz
cyBXZWJJbnNwZWN0b3JDbGllbnQ7CiAKQEAgLTg2OCw2ICs4NjksOSBAQCBwdWJsaWM6CiAgICAg
dm9pZCBzZXRSb290Q2hpbGRMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUxheWVyKiBsYXllcik7CiAj
ZW5kaWYKIAorICAgIHZvaWQgZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShXZWJDb3JlOjpOb2RlKik7
CisgICAgdm9pZCBleGl0RnVsbHNjcmVlbigpOworCiBwcml2YXRlOgogICAgIHZvaWQgc2V0Wm9v
bU11bHRpcGxpZXIoZmxvYXQgbXVsdGlwbGllciwgYm9vbCBpc1RleHRPbmx5KTsKICAgICBmbG9h
dCB6b29tTXVsdGlwbGllcihib29sIGlzVGV4dE9ubHkpOwpAQCAtOTgxLDYgKzk4NSw4IEBAIHBy
b3RlY3RlZDoKICAgICBsb25nIG1feE92ZXJwYW47CiAgICAgbG9uZyBtX3lPdmVycGFuOwogCisg
ICAgT3duUHRyPEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI+IG1fZnVsbHNjcmVlbkNvbnRyb2xs
ZXI7CisKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAgICAgYm9vbCBpc0FjY2Vs
ZXJhdGVkQ29tcG9zaXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2lzQWNjZWxlcmF0ZWRDb21wb3Np
dGluZzsgfQogICAgIHZvaWQgc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZyhib29sKTsKSW5kZXg6
IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5jcHAJKHJldmlz
aW9uIDUyNzY4KQorKysgV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8V2ViQ29yZS9G
bG9hdFJlY3QuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lTG9hZFJlcXVlc3QuaD4KICNpbmNs
dWRlIDxXZWJDb3JlL0ZyYW1lVmlldy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvSFRNTE5hbWVzLmg+
CiAjaW5jbHVkZSA8V2ViQ29yZS9Mb2NhbGl6ZWRTdHJpbmdzLmg+CiAjaW5jbHVkZSA8V2ViQ29y
ZS9Ob3RJbXBsZW1lbnRlZC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgpAQCAtNzczLDMg
Kzc3NCwyMyBAQCBDT01QdHI8SVdlYlVJRGVsZWdhdGU+IFdlYkNocm9tZUNsaWVudDo6CiAgICAg
bV93ZWJWaWV3LT51aURlbGVnYXRlKCZkZWxlZ2F0ZSk7CiAgICAgcmV0dXJuIGRlbGVnYXRlOwog
fQorCisjaWYgRU5BQkxFKFZJREVPKQorCitib29sIFdlYkNocm9tZUNsaWVudDo6c3VwcG9ydHNG
dWxsc2NyZWVuRm9yTm9kZShjb25zdCBOb2RlKiBub2RlKQoreworICAgIHJldHVybiBub2RlLT5o
YXNUYWdOYW1lKFdlYkNvcmU6OkhUTUxOYW1lczo6dmlkZW9UYWcpOworfQorCit2b2lkIFdlYkNo
cm9tZUNsaWVudDo6ZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIG1f
d2ViVmlldy0+ZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShub2RlKTsKK30KKwordm9pZCBXZWJDaHJv
bWVDbGllbnQ6OmV4aXRGdWxsc2NyZWVuRm9yTm9kZShOb2RlKikKK3sKKyAgICBtX3dlYlZpZXct
PmV4aXRGdWxsc2NyZWVuKCk7Cit9CisKKyNlbmRpZgorCkluZGV4OiBXZWJLaXQvd2luL1dlYkNv
cmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2Vi
Q29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmgJKHJldmlzaW9uIDUyNzY4KQorKysgV2ViS2l0
L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAt
MTQ3LDYgKzE0NywxMiBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVxdWVzdEdlb2xv
Y2F0aW9uUGVybWlzc2lvbkZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiwgV2ViQ29yZTo6R2VvbG9j
YXRpb24qKTsKIAorI2lmIEVOQUJMRShWSURFTykKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNG
dWxsc2NyZWVuRm9yTm9kZShjb25zdCBXZWJDb3JlOjpOb2RlKik7CisgICAgdmlydHVhbCB2b2lk
IGVudGVyRnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIHZpcnR1YWwgdm9p
ZCBleGl0RnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworI2VuZGlmCisKICNpZiBF
TkFCTEUoTk9USUZJQ0FUSU9OUykKICAgICB2aXJ0dWFsIFdlYkNvcmU6Ok5vdGlmaWNhdGlvblBy
ZXNlbnRlciogbm90aWZpY2F0aW9uUHJlc2VudGVyKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnBy
ZXRfY2FzdDxXZWJDb3JlOjpOb3RpZmljYXRpb25QcmVzZW50ZXIqPihtX25vdGlmaWNhdGlvbnNE
ZWxlZ2F0ZS5nZXQoKSk7IH0KICNlbmRpZgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9q
L1dlYktpdC52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL1dl
YktpdC52Y3Byb2oJKHJldmlzaW9uIDUyNzY4KQorKysgV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9q
L1dlYktpdC52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTU4Miw2ICs1ODIsMTAgQEAKIAkJCQk+
DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRnVsbHNjcmVl
blZpZGVvQ29udHJvbGxlci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJ
CVJlbGF0aXZlUGF0aD0iLi5cTWFyc2hhbGxpbmdIZWxwZXJzLmgiDQogCQkJCT4NCiAJCQk8L0Zp
bGU+DQpAQCAtODk0LDYgKzg5OCwxMCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUN
CisJCQkJUmVsYXRpdmVQYXRoPSIuLlxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyLmNwcCINCisJ
CQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1lbW9y
eVN0cmVhbS5jcHAiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpJbmRleDogV2ViS2l0L3dpbi9XZWJL
aXQudmNwcm9qL2ZzVmlkZW9BdWRpb1ZvbHVtZUhpZ2gucG5nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQ2Fubm90IGRp
c3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5cGUgPSBhcHBs
aWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZ
QUFBQWY4LzloQUFBQUNYQklXWE1BQUF1SkFBQUxpUUUzeWN1dEFBQUsKVDJsRFExQlFhRzkwYjNO
b2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpD
aTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtP
ZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNE
eDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUIKZU5NTENBREFUWnZB
TUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZ
MkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZB
Rmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzCkFNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJ
eU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFgKTGg0b3pra1hL
eFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZy
OEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpy
SVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrCjVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytY
NDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QKMHlMRVNX
SzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFo
ZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FB
QVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBCkJoekJCZHpCQy94Z05vUkNKTVRDUWhC
Q0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGgKQ0o3
QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4
VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JH
b2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrClE4Y3d3T2dZQnpQRWJEQXV4c05D
c1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE0K
V0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRM
eEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlC
em1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvClVzcHFTaG5sRU9VMDVRWmxt
REpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQ
ZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dL
K1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBx
cmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iClUyZXBPNmlIcW1lb2Ix
US9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4
MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hU
dktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBv
blhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1CnArNllucjVlZ0o1
TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZE
WGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBO
N3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMQptejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWky
dUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPCmswNnJudFpu
dzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpE
cXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2Iw
MGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSQp2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8y
Ni91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCClo3WG5J
eTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5s
K0YzME4vSS85ay8zci8KMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpL
QzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cApEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0
V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxClBO
bzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYx
d2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkv
Uk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNQpoQ2Vwa0x4TURVemRtenFlRnBw
MklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09R
CnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90
RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0
VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZApUMWd2V2QrMVlmcUduUnMr
RlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFs
K2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tW
UFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEor
N1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzUwpQVlJTajlZcjYwY094
eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwy
cENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsy
Znl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8KMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQ
S3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMQplMmIzNlJ1ZU44
N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVE
dFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFli
cm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkKL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVP
L2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOApJSDhvLzJq
NXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FB
Z09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmtsL0ZSZ0FBQVAxSlJFRlVlTnE4azlGTncwQVFSR2Vq
L0RzZDJGUUFIVGdkMkZUZ2RBQWRVRUxvd0NXWURweFUKa0hUZ1VBRjA4UEtSUFdsbGJBY0ppZjNh
bTd1ZDI1dlpNMEQvRWtBTDlFQVdzTm5ER1pDUHNFZGdBRTZKQk5CcXFsalNRVklSeUhwZgpQL214
ajZXYlQ5eWlESGpuV0FXVWFSL1FHbmdMSEhXNEpYVlRtOWt6MEVsNk43TUg0Q0JwSitrbzVxTUVj
dUFMYUR4UCtJdnI4Vk9ECkdHYjJLZWxWMHM3emk2U3RwSFBTYVBVTEJ3c3ZsS1NOcE8rNHViN2pm
ZVlkYkYzVWpUdFVleGVUdzBKMHdaMUo3dlNPRGNCK2NwQUMKU2JSeGNERnpGeERQRjhjMkVqVGVS
ZVhGKzhWUkR1L1hpQVNndmZzWFpnZ3JvQmxoc3I5KzUrc0FzNDQzQlU5OVhlSUFBQUFBU1VWTwpS
SzVDWUlJPQoKSW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9mc1ZpZGVvQXVkaW9Wb2x1
bWVMb3cucG5nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmlu
YXJ5IHR5cGUuCnN2bjptaW1lLXR5cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9S
dzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUF1SkFB
QUxpUUUzeWN1dEFBQUsKVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5W
Tm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJV
VUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1
ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NN
QkFQaCtQRHdySXNBSHZnQUIKZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lB
VUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFC
YmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMz
CkFNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0
bWJJOHVTUTVSWUZiQ0MxeEIxZFgKTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdB
QUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgr
TEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloy
ZVhrCjVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBU
S1VjejVJSmhHTGM1bzlIL0xjTC8vd2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NL
Y1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVL
QWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcv
VEJHQ3pBCkJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFF
QWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampn
Z1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lB
QXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2Vm
UXEyZ1AybzgrClE4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRu
MVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlL
VHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZU
U0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNL
bldKQWNhVDRVK0lvClVzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2
VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lY
NkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2
VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpx
UW5VbHF0VnFwMVE2MU1iClUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2
TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpV
dk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpT
S3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBU
cjFyaTZxYTZVYm9idEVkNzl1CnArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERG
Z0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pV
WVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBr
MQptejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZw
ZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPCmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldG
blloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMz
RjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNi
eHQzSQp2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJ
UStCUjVkRS9DNStWTUd2ZnJINVBRMCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5
bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJad09K
Z1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1
NWpPa2M1cApEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnoz
MFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVM
aXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9P
SlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Y
a2t4VE9sTE9XNQpoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlor
cG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYy
YS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNq
eHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0
VkN1V0ZmZXZjMSsxZApUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIr
WjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVm
TktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZ
MDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BT
QS8wSEl3NjIxN25VMVIzUwpQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5r
NmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJx
M25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8K
MzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRU
OGU3bkx1YXJybGNhN251ZXIyMQplMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5
L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4
OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYv
NmkKL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1W
NzBWdnZ0d1hmY2R4M3ZvOThQVCtSOApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxk
c0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmts
L0ZSZ0FBQUl4SlJFRlVlTnJVaytFSndqQVVoQy9TLzQ1UU43QWJ4QTEwQTBmb0NoM0ZUVHBDWGNV
SlB2ODgKNUJGNUtTUWdlQkM0SkhlWGhDTUpVQThPNmtSM2dJRFBDUGJ2UUE0OXRRQXoweFRnekFB
WkdJRnpOWUFZR1ppTlg1c0M3R1NBMVh0KwpWeU13R24zNjlhSFFMWTdmSkUxdWZwTDBLRFRWRm83
QXRsZGorSVNVMGt2U3BienlsKzcvUDlON0FHR1I5cHZCWEkrNUFBQUFBRWxGClRrU3VRbUNDCgpJ
bmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9FeGl0RnVsbHNjcmVlbi5wbmcK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5hcnkgdHlwZS4K
c3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKaVZCT1J3MEtHZ29BQUFB
TlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXVKQUFBTGlRRTN5Y3V0
QUFBSwpUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZOblZGUHBGajMz
M3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVCmtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9P
am9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFgKUHVlczg1Mnp6d2ZB
Q0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJ
c0FIdmdBQgplTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFVQUVCNmprS21B
RUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0CkFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JB
Q0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzMKQU1ET0VBdXlB
QWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZ
RmJDQzF4QjFkWApMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FBS0NSRlJIZ2cv
UDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArCjVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0Jv
QnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGsKNU5oS3hF
SmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdM
YzVvOUgvTGNMLy93ZAoweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tjVWwwdjlrNHQ4
cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBCjR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5
My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekEKQmh6
QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFU
Y0E0dXdsVzREajF3RC9waApDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdnWG1ZWDRJY0ZJ
QkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1CmgxeEd1cEU3eUFBeWd2eUd2RWN4
bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCsK
UThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNn
VVhBQ1RZRWQwSWdZUjVCU0ZoTQpXRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtUcUV1MEpyb1Ir
Y1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RCkFrbXhwRlRTRXRKRzBtNVNJ
K2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUr
SW8KVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1q
bk5neFpKUzZXdG9wWFRHbWdYYVBkcApyK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2QVAwZHd3Tmho
V0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaCkQ1bHZWVmdxdGlwOEZa
SEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAx
UTYxTWIKVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNn
c0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WQovUjI3aXoycXFhRTVRek5LTTFlelV2T1VaajhINDVo
eCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyClNLdFJxMGZydlRh
dTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVi
b2J0RWQ3OXUKcCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNN
emhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaApsV0dYNFlTUnVkRThvOVZHalVZUGpHbkdYT01r
NDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsxCm16MHgxekxu
bStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwx
cnV0dTZjUnA3bE8KazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3
KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeQpGRHBXT3Q2YXpwenVQMzNGOUpicEwyZFl6
eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4dDNJCnZlUktk
UFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1
K1ZNR3Zmckg1UFEwK0IKWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNq
TGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLwowUUNuZ0NVQlp3T0pnVUdCV3dMNytI
cDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1ak9rYzVwCkRv
VlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0
bk1VODVyeTFLTlNvK3FpNXEKUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQv
ODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJcwpPcFpBVEloT09KVHdRUkFxcUJh
TUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhra3hUT2xMT1c1
CmhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5Nnhs
aGJMK3hXNkx0eThlbFFmSmE3T1EKckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFy
bml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOQpyR281c2p4eGVkc0s0eFVG
SzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RWQ3VXRmZldmMx
KzFkClQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1
V1RQWnRKbTZlYmVMWjViRHBhcWwrYVgKRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1
YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0Nwp2UFkwN05YYlc3ejMv
VDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNBLzBISXc2MjE3
blUxUjNTClBWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURU
cmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2EKUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1
dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTwozMm9QYisrNkVI
VGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4ZTduTHVhcnJs
Y2E3bnVlcjIxCmUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lm
OXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlYKUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQ
UC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aQovc3V1RnhZ
dmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3MFZ2dnR3WGZj
ZHgzdm85OFBUK1I4CklIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQWdZMGhT
VFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHEKWUFBQU9wZ0FBQmR2a2wvRlJnQUFBS2RK
UkVGVWVOcWtrOUVOd2pBTVJKOGovc01Jak5BTnlnaHNnTmlFRWRpZzNhVGRJTmtFbU9ENApJSlZL
Qk1odDc4ZVNyYnhJNTdOSllwTWtKYjJWSk1WWi8rd0Z6SlVrUlVtZHBNRUxHQ3JJdlZRWElBQW5J
TTk2K3lVV0JETjdBa2ZnCnNjYkRVT3B0NmMrVGRzWHRBekJXcyt3Qm1NUGtDRFEveHRtenBWYmYx
WG5YM1A1N0hGWUd1SmxTdXhvQWpKTGlFa0JmbWRZQVZ5K2cKTjdOTENkeUg4N2IxbkY4REFMMThs
NGhCOEQrL0FBQUFBRWxGVGtTdVFtQ0MKCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ov
ZnNWaWRlb1BhdXNlLnBuZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09CkNhbm5vdCBkaXNwbGF5OiBmaWxlIG1hcmtlZCBh
cyBhIGJpbmFyeSB0eXBlLgpzdm46bWltZS10eXBlID0gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFt
CgppVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmtBQUFBWkNBWUFBQURFNllWakFBQUFDWEJJV1hN
QUFBdUpBQUFMaVFFM3ljdXRBQUFLClQybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdV
QUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVUKa1NZcUlRa1FTb2dob2Rr
VlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JO
L3JYWApQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6
WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCCmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iw
a1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXQKQUdBbmYrYlRBSUNk
K0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpW
MlpJQUxDMwpBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVF
T2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYCkxoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JO
QS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCsKNWMrcmNFQUFB
T0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBF
V2hrTG5aMmVYawo1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQ
amd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkCjB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1x
VWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEEKNHZjQUFQ
SzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktD
QktyQkJHL1RCR0N6QQpCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJB
ZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoCkNKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFG
aWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTUKaDF4
R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFh
UFl3Mm9lZlFxMmdQMm84KwpROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3
VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNCldFN1lTS2dnSENRMEVkb0pOd2tE
aEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVEK
QWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtH
K1FoOGxzS25XSkFjYVQ0VStJbwpVc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFR
cTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwCnIraDB1aEhkbFI1T2w5Qlgw
c3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1P
ZVoKRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJr
WlZNMVBqcVFuVWxxdFZxcDFRNjFNYgpVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBG
R2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZCi9SMjdpejJxcWFFNVF6
TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBh
WGxsaXIKU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2Fj
S3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dQpwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1cz
NnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZoCmxXR1g0WVNSdWRF
OG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNN
emFMTjFwazEKbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81
V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsTwprMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1
dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5CkZEcFdPdDZh
enB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExM
cGMrTHBzYnh0M0kKdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVX
VE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQgpaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3
eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvCjBRQ25n
Q1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lP
eVFyU0gzNTVqT2tjNXAKRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5Y
ZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cQpQTm8zdWpTNlA4WXVabG5NMVZpZFdF
bHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzCk9w
WkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhx
UzdKRzhOWGtreFRPbExPVzUKaENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFv
aFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUQpyQVZaTFFxMlFxYm9WRm9vMXlv
SHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5
CnJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xC
dFFGcjZ3dFZDdVdGZmV2YzErMWQKVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGps
RzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWApEbTROMmRxMERkOVd0TzMx
OWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3
aHQ3CnZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9i
WEh0eHdQU0EvMEhJdzYyMTduVTFSM1MKUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0
aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYQpScHRUbXZ0YllsdTZU
OHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9y
Wjc1MlBPCjMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRP
bzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjEKZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZm
TjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVgpQMXYrM05qdjNI
OXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5
a3p5YWVGLzZpCi9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2
K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjgKSUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVq
ei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcQpZQUFBT3Bn
QUFCZHZrbC9GUmdBQUFEdEpSRUZVZU5yc3pTRU9BQ0FReE1DRmo5L1RpOGNjQm9Kb2ZUTUJRbDls
QzZpREwwQm1IaVFpCklpSWlJaUlpOGpjeWdPdklBZ0FBLy84REFKUkFVdHg1ZFdOOUFBQUFBRWxG
VGtTdVFtQ0MKCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRlb1BsYXkucG5n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUu
CnN2bjptaW1lLXR5cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9SdzBLR2dvQUFB
QU5TVWhFVWdBQUFCa0FBQUFaQ0FZQUFBREU2WVZqQUFBQUNYQklXWE1BQUF1SkFBQUxpUUUzeWN1
dEFBQUsKVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmoz
MzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFP
T2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1ZXM4NTJ6endm
QUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdy
SXNBSHZnQUIKZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0tt
QUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNS
QUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzCkFNRE9FQXV5
QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVS
WUZiQ0MxeEIxZFgKTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdn
L1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdC
b0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrCjVOaEt4
RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhH
TGM1bzlIL0xjTC8vd2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0
OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVLQWdEZ0dpRDRj
OTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBCkJo
ekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlh
VGNBNHV3bFc0RGoxd0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNG
SUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lBQXlndnlHdkVj
eGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1Aybzgr
ClE4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FT
Z1VYQUNUWUVkMElnWVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9S
K2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZUU0V0SkcwbTVT
SStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRV
K0lvClVzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFt
am5OZ3haSlM2V3RvcFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05o
aFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2VlZncXRpcDhG
WkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFw
MVE2MU1iClUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMz
Z3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1
aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpTS3RScTBmcnZU
YXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZV
Ym9idEVkNzl1CnArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRz
TXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9N
azQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMQptejB4MXpM
bm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBs
MXJ1dHU2Y1JwN2xPCmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1
dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMzRjlKYnBMMmRZ
enhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSQp2ZVJL
ZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9D
NStWTUd2ZnJINVBRMCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMz
akxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJad09KZ1VHQld3TDcr
SHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cApE
b1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNw
dG5NVTg1cnkxS05TbytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0
Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9PSlR3UVJBcXFC
YU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9X
NQpoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4
bGhiTCt4VzZMdHk4ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1ph
cm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNqeHhlZHNLNHhV
Rks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZj
MSsxZApUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZF
dVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pE
dWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZMDdOWGJXN3oz
L1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIx
N25VMVIzUwpQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VE
VHJhZG94N3JPRUgweDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZE
NXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8KMzJvUGIrKzZF
SFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJy
bGNhN251ZXIyMQplMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2Np
Zjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZ
UFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkKL3N1dUZ4
WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hm
Y2R4M3ZvOThQVCtSOApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBo
U1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmtsL0ZSZ0FBQUlW
SlJFRlVlTnJVMWRFTmdDQU1oT0hxQW83b0tJN0tDSTd3KzJSRUlnWm96OFFib0Y5UzREQmcKQnpa
Z01VRUFNNjVJc0JLUllEVWt4MVkxY2laNXNGYkVoZlVpUTlnbzBvVjVrU1lzQ25uRm9wRkhUSVhj
TU1CbSt5Si9XNWYwNEtWWApXUG9ZcGJVaUxVaHAxU2ZscHhVeXZJYUVEaThSeWZBY21RQjVkUjBB
QUFELy93TUFpMEM3L0lvUFhTc0FBQUFBU1VWT1JLNUNZSUk9Cgo=
</data>
<flag name="review"
          id="28107"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46014</attachid>
            <date>2010-01-06 18:10:45 -0800</date>
            <delta_ts>2010-01-07 17:37:37 -0800</delta_ts>
            <desc>Patch with Adam&apos;s issues addressed</desc>
            <filename>31318.patch</filename>
            <type>text/plain</type>
            <size>67242</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL01lZGlhUGxheWVyUHJpdmF0ZVF1
aWNrVGltZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93
aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmNwcAkocmV2aXNpb24gNTI4NTQpCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9NZWRpYVBsYXllclByaXZhdGVRdWlja1Rp
bWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04OCw2ICs4OCwxOCBAQCBNZWRpYVBsYXllclBy
aXZhdGU6On5NZWRpYVBsYXllclByaXZhdGUoCiB7CiB9CiAKK2Jvb2wgTWVkaWFQbGF5ZXJQcml2
YXRlOjpzdXBwb3J0c0Z1bGxzY3JlZW4oKSBjb25zdAoreworICAgIHJldHVybiB0cnVlOworfQor
CitQbGF0Zm9ybU1lZGlhIE1lZGlhUGxheWVyUHJpdmF0ZTo6cGxhdGZvcm1NZWRpYSgpIGNvbnN0
Cit7CisgICAgUGxhdGZvcm1NZWRpYSBwOworICAgIHAucXRNb3ZpZSA9IHJlaW50ZXJwcmV0X2Nh
c3Q8UVRNb3ZpZSo+KG1fcXRNb3ZpZS5nZXQoKSk7CisgICAgcmV0dXJuIHA7Cit9CisKIGNsYXNz
IFRhc2tUaW1lciA6IFRpbWVyQmFzZSB7CiBwdWJsaWM6CiAgICAgc3RhdGljIHZvaWQgaW5pdGlh
bGl6ZSgpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQ
cml2YXRlUXVpY2tUaW1lV2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgJKHJldmlzaW9uIDUyODU0
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVp
Y2tUaW1lV2luLmgJKHdvcmtpbmcgY29weSkKQEAgLTUzLDYgKzUzLDkgQEAgcHVibGljOgogcHJp
dmF0ZToKICAgICBNZWRpYVBsYXllclByaXZhdGUoTWVkaWFQbGF5ZXIqKTsKIAorICAgIHZpcnR1
YWwgYm9vbCBzdXBwb3J0c0Z1bGxzY3JlZW4oKSBjb25zdDsKKyAgICB2aXJ0dWFsIFBsYXRmb3Jt
TWVkaWEgcGxhdGZvcm1NZWRpYSgpIGNvbnN0OworCiAgICAgSW50U2l6ZSBuYXR1cmFsU2l6ZSgp
IGNvbnN0OwogICAgIGJvb2wgaGFzVmlkZW8oKSBjb25zdDsKICAgICBib29sIGhhc0F1ZGlvKCkg
Y29uc3Q7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2lu
LmNwcAkocmV2aXNpb24gNTI4NTQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9R
VE1vdmllV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsMTggKzI0LDE1IEBACiAgKi8KICNp
bmNsdWRlICJjb25maWcuaCIKIAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQogI2luY2x1ZGUgIlFU
TW92aWVXaW4uaCIKIAogLy8gUHV0IE1vdmllcy5oIGZpcnN0IHNvIGJ1aWxkIGZhaWx1cmVzIGhl
cmUgcG9pbnQgY2xlYXJseSB0byBRdWlja1RpbWUKICNpbmNsdWRlIDxNb3ZpZXMuaD4KLSNpbmNs
dWRlIDxRdWlja1RpbWVDb21wb25lbnRzLmg+Ci0jaW5jbHVkZSA8R1hNYXRoLmg+Ci0jaW5jbHVk
ZSA8UVRNTC5oPgogCiAjaW5jbHVkZSAiUVRNb3ZpZVdpblRpbWVyLmgiCi0KKyNpbmNsdWRlIDxH
WE1hdGguaD4KKyNpbmNsdWRlIDxRVE1MLmg+CisjaW5jbHVkZSA8UXVpY2tUaW1lQ29tcG9uZW50
cy5oPgogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQu
aD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KQEAgLTUwLDYgKzQ3LDcgQEAgc3RhdGlj
IGNvbnN0IGxvbmcgc3ViVGl0bGVUcmFja1R5cGUgPSAncwogc3RhdGljIGNvbnN0IGxvbmcgbXBl
ZzRPYmplY3REZXNjcmlwdGlvblRyYWNrVHlwZSA9ICdvZHNtJzsKIHN0YXRpYyBjb25zdCBsb25n
IG1wZWc0U2NlbmVEZXNjcmlwdGlvblRyYWNrVHlwZSA9ICdzZHNtJzsKIHN0YXRpYyBjb25zdCBs
b25nIGNsb3NlZENhcHRpb25EaXNwbGF5UHJvcGVydHlJRCA9ICdkaXNwJzsKK3N0YXRpYyBMUENU
U1RSIGZ1bGxzY3JlZW5RVE1vdmllV2luUG9pbnRlclByb3AgPSBURVhUKCJmdWxsc2NyZWVuUVRN
b3ZpZVdpblBvaW50ZXIiKTsKIAogLy8gUmVzaXppbmcgR1dvcmxkcyBpcyBzbG93LCBnaXZlIHRo
ZW0gYSBtaW5pbXVtIHNpemUgc28gc2l6ZSBvZiBzbWFsbCAKIC8vIHZpZGVvcyBjYW4gYmUgYW5p
bWF0ZWQgc21vb3RobHkKQEAgLTEzMCw2ICsxMjgsMTEgQEAgcHVibGljOgogI2lmICFBU1NFUlRf
RElTQUJMRUQKICAgICBib29sIG1fc2NhbGVDYWNoZWQ7CiAjZW5kaWYKKyAgICBXaW5kb3dQdHIg
bV9mdWxsc2NyZWVuV2luZG93OworICAgIEdXb3JsZFB0ciBtX2Z1bGxzY3JlZW5PcmlnR1dvcmxk
OworICAgIFJlY3QgbV9mdWxsc2NyZWVuUmVjdDsKKyAgICBRVE1vdmllV2luRnVsbHNjcmVlbkNs
aWVudCogbV9mdWxsc2NyZWVuQ2xpZW50OworICAgIGNoYXIqIG1fZnVsbHNjcmVlblJlc3RvcmVT
dGF0ZTsKIH07CiAKIFFUTW92aWVXaW5Qcml2YXRlOjpRVE1vdmllV2luUHJpdmF0ZSgpCkBAIC0x
NTksMTEgKzE2MiwxOSBAQCBRVE1vdmllV2luUHJpdmF0ZTo6UVRNb3ZpZVdpblByaXZhdGUoKQog
I2lmICFBU1NFUlRfRElTQUJMRUQKICAgICAsIG1fc2NhbGVDYWNoZWQoZmFsc2UpCiAjZW5kaWYK
KyAgICAsIG1fZnVsbHNjcmVlbldpbmRvdygwKQorICAgICwgbV9mdWxsc2NyZWVuT3JpZ0dXb3Js
ZCgwKQorICAgICwgbV9mdWxsc2NyZWVuQ2xpZW50KDApCisgICAgLCBtX2Z1bGxzY3JlZW5SZXN0
b3JlU3RhdGUoMCkKIHsKKyAgICBSZWN0IHJlY3QgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBtX2Z1
bGxzY3JlZW5SZWN0ID0gcmVjdDsKIH0KIAogUVRNb3ZpZVdpblByaXZhdGU6On5RVE1vdmllV2lu
UHJpdmF0ZSgpCiB7CisgICAgQVNTRVJUKCFtX2Z1bGxzY3JlZW5XaW5kb3cpOworCiAgICAgZW5k
VGFzaygpOwogICAgIGlmIChtX2dXb3JsZCkKICAgICAgICAgZGVsZXRlR1dvcmxkKCk7CkBAIC0z
NTksNyArMzcwLDcgQEAgdm9pZCBRVE1vdmllV2luUHJpdmF0ZTo6Y3JlYXRlR1dvcmxkKCkKICAg
ICBib3VuZHMubGVmdCA9IDA7IAogICAgIGJvdW5kcy5yaWdodCA9IG1fZ1dvcmxkV2lkdGg7CiAg
ICAgYm91bmRzLmJvdHRvbSA9IG1fZ1dvcmxkSGVpZ2h0OwotICAgIE9TRXJyIGVyciA9IFFUTmV3
R1dvcmxkKCZtX2dXb3JsZCwgazMyQkdSQVBpeGVsRm9ybWF0LCAmYm91bmRzLCBOVUxMLCBOVUxM
LCBOVUxMKTsgCisgICAgT1NFcnIgZXJyID0gUVROZXdHV29ybGQoJm1fZ1dvcmxkLCBrMzJCR1JB
UGl4ZWxGb3JtYXQsICZib3VuZHMsIDAsIDAsIDApOyAKICAgICBpZiAoZXJyKSAKICAgICAgICAg
cmV0dXJuOwogICAgIEdldE1vdmllR1dvcmxkKG1fbW92aWUsICZtX3NhdmVkR1dvcmxkLCAwKTsK
QEAgLTcyOSw3ICs3NDAsNyBAQCB2b2lkIFFUTW92aWVXaW46OmxvYWQoQ0ZVUkxSZWYgdXJsLCBi
b29sCiAgICAgbW92aWVQcm9wQ291bnQrKzsgCiAKICAgICBBU1NFUlQobW92aWVQcm9wQ291bnQg
PD0gc2l6ZW9mKG1vdmllUHJvcHMpL3NpemVvZihtb3ZpZVByb3BzWzBdKSk7Ci0gICAgbV9wcml2
YXRlLT5tX2xvYWRFcnJvciA9IE5ld01vdmllRnJvbVByb3BlcnRpZXMobW92aWVQcm9wQ291bnQs
IG1vdmllUHJvcHMsIDAsIE5VTEwsICZtX3ByaXZhdGUtPm1fbW92aWUpOworICAgIG1fcHJpdmF0
ZS0+bV9sb2FkRXJyb3IgPSBOZXdNb3ZpZUZyb21Qcm9wZXJ0aWVzKG1vdmllUHJvcENvdW50LCBt
b3ZpZVByb3BzLCAwLCAwLCAmbV9wcml2YXRlLT5tX21vdmllKTsKIAogZW5kOgogICAgIG1fcHJp
dmF0ZS0+c3RhcnRUYXNrKCk7CkBAIC05NTMsNyArOTY0LDcgQEAgc3RhdGljIHZvaWQgaW5pdGlh
bGl6ZVN1cHBvcnRlZFR5cGVzKCkgCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAg
ICAgICBpZiAoIShpbmZvQ0QuY29tcG9uZW50RmxhZ3MgJiBoYXNNb3ZpZUltcG9ydE1JTUVMaXN0
KSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFFUQXRvbUNvbnRhaW5l
ciBtaW1lTGlzdCA9IE5VTEw7CisgICAgICAgICAgICBRVEF0b21Db250YWluZXIgbWltZUxpc3Qg
PSAwOwogICAgICAgICAgICAgZXJyID0gTW92aWVJbXBvcnRHZXRNSU1FVHlwZUxpc3QoKENvbXBv
bmVudEluc3RhbmNlKWNvbXAsICZtaW1lTGlzdCk7CiAgICAgICAgICAgICBpZiAoZXJyIHx8ICFt
aW1lTGlzdCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTk2Miw3ICs5NzMsNyBAQCBz
dGF0aWMgdm9pZCBpbml0aWFsaXplU3VwcG9ydGVkVHlwZXMoKSAKICAgICAgICAgICAgIFFUTG9j
a0NvbnRhaW5lcihtaW1lTGlzdCk7CiAgICAgICAgICAgICBpbnQgdHlwZUNvdW50ID0gUVRDb3Vu
dENoaWxkcmVuT2ZUeXBlKG1pbWVMaXN0LCBrUGFyZW50QXRvbUlzQ29udGFpbmVyLCBrTWltZUlu
Zm9NaW1lVHlwZVRhZyk7CiAgICAgICAgICAgICBmb3IgKGludCB0eXBlSW5kZXggPSAxOyB0eXBl
SW5kZXggPD0gdHlwZUNvdW50OyB0eXBlSW5kZXgrKykgewotICAgICAgICAgICAgICAgIFFUQXRv
bSBtaW1lVGFnID0gUVRGaW5kQ2hpbGRCeUluZGV4KG1pbWVMaXN0LCAwLCBrTWltZUluZm9NaW1l
VHlwZVRhZywgdHlwZUluZGV4LCBOVUxMKTsKKyAgICAgICAgICAgICAgICBRVEF0b20gbWltZVRh
ZyA9IFFURmluZENoaWxkQnlJbmRleChtaW1lTGlzdCwgMCwga01pbWVJbmZvTWltZVR5cGVUYWcs
IHR5cGVJbmRleCwgMCk7CiAgICAgICAgICAgICAgICAgaWYgKCFtaW1lVGFnKQogICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICBjaGFyKiBhdG9tRGF0YTsKQEAg
LTk4MCw3ICs5OTEsNyBAQCBzdGF0aWMgdm9pZCBpbml0aWFsaXplU3VwcG9ydGVkVHlwZXMoKSAK
ICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcCh0eXBlQnVmZmVyLCAiYXVkaW8vIiwgNikgJiYg
c3RybmNtcCh0eXBlQnVmZmVyLCAidmlkZW8vIiwgNikpCiAgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwogCi0gICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgY2ZNaW1lVHlwZSA9IENGU3Ry
aW5nQ3JlYXRlV2l0aENTdHJpbmcoTlVMTCwgdHlwZUJ1ZmZlciwga0NGU3RyaW5nRW5jb2RpbmdV
VEY4KTsKKyAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBjZk1pbWVUeXBlID0gQ0ZTdHJpbmdD
cmVhdGVXaXRoQ1N0cmluZygwLCB0eXBlQnVmZmVyLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwog
ICAgICAgICAgICAgICAgIGlmICghY2ZNaW1lVHlwZSkKICAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7CiAKQEAgLTEwNDAsNyArMTA1MSw3IEBAIGJvb2wgUVRNb3ZpZVdpbjo6aW5pdGlhbGl6
ZVF1aWNrVGltZSgpIAogICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgaW5pdGlhbGl6
ZWQgPSB0cnVlOwogICAgICAgICAvLyBJbml0aWFsaXplIGFuZCBjaGVjayBRdWlja1RpbWUgdmVy
c2lvbgotICAgICAgICBPU0VyciByZXN1bHQgPSBJbml0aWFsaXplUVRNTCgwKTsKKyAgICAgICAg
T1NFcnIgcmVzdWx0ID0gSW5pdGlhbGl6ZVFUTUwoa0luaXRpYWxpemVRVE1MRW5hYmxlRG91Ymxl
QnVmZmVyZWRTdXJmYWNlKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBub0VycikKICAgICAgICAg
ICAgIHJlc3VsdCA9IEdlc3RhbHQoZ2VzdGFsdFF1aWNrVGltZSwgJnF1aWNrVGltZVZlcnNpb24p
OwogICAgICAgICBpZiAocmVzdWx0ICE9IG5vRXJyKSB7CkBAIC0xMDU4LDE1ICsxMDY5LDgwIEBA
IGJvb2wgUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1aWNrVGltZSgpIAogICAgIHJldHVybiBpbml0
aWFsaXphdGlvblN1Y2NlZWRlZDsKIH0KIAorTFJFU1VMVCBRVE1vdmllV2luOjpmdWxsc2NyZWVu
V25kUHJvYyhIV05EIHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBh
cmFtKQoreworICAgIFFUTW92aWVXaW4qIG1vdmllID0gcmVpbnRlcnByZXRfY2FzdDxRVE1vdmll
V2luKj4oR2V0UHJvcCh3bmQsIGZ1bGxzY3JlZW5RVE1vdmllV2luUG9pbnRlclByb3ApKTsKKwor
ICAgIGlmIChtZXNzYWdlID09IFdNX0RFU1RST1kpCisgICAgICAgIFJlbW92ZVByb3Aod25kLCBm
dWxsc2NyZWVuUVRNb3ZpZVdpblBvaW50ZXJQcm9wKTsKKworICAgIGlmICghbW92aWUpCisgICAg
ICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwor
CisgICAgcmV0dXJuIG1vdmllLT5tX3ByaXZhdGUtPm1fZnVsbHNjcmVlbkNsaWVudC0+ZnVsbHNj
cmVlbkNsaWVudFduZFByb2Mod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisKK0hX
TkQgUVRNb3ZpZVdpbjo6ZW50ZXJGdWxsc2NyZWVuKFFUTW92aWVXaW5GdWxsc2NyZWVuQ2xpZW50
KiBjbGllbnQpCit7CisgICAgbV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5DbGllbnQgPSBjbGllbnQ7
CisgICAgCisgICAgQmVnaW5GdWxsU2NyZWVuKCZtX3ByaXZhdGUtPm1fZnVsbHNjcmVlblJlc3Rv
cmVTdGF0ZSwgMCwgMCwgMCwgJm1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93LCAwLCBmdWxs
U2NyZWVuQWxsb3dFdmVudHMpOyAKKyAgICBRVE1MU2V0V2luZG93V25kUHJvYyhtX3ByaXZhdGUt
Pm1fZnVsbHNjcmVlbldpbmRvdywgZnVsbHNjcmVlblduZFByb2MpOworICAgIENyZWF0ZVBvcnRB
c3NvY2lhdGlvbihHZXRQb3J0TmF0aXZlV2luZG93KG1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2lu
ZG93KSwgMCwgMCk7CisKKyAgICBHZXRNb3ZpZUJveChtX3ByaXZhdGUtPm1fbW92aWUsICZtX3By
aXZhdGUtPm1fZnVsbHNjcmVlblJlY3QpOworICAgIEdldE1vdmllR1dvcmxkKG1fcHJpdmF0ZS0+
bV9tb3ZpZSwgJm1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuT3JpZ0dXb3JsZCwgMCk7CisgICAgU2V0
TW92aWVHV29ybGQobV9wcml2YXRlLT5tX21vdmllLCByZWludGVycHJldF9jYXN0PENHcmFmUHRy
PihtX3ByaXZhdGUtPm1fZnVsbHNjcmVlbldpbmRvdyksIEdldEdXb3JsZERldmljZShyZWludGVy
cHJldF9jYXN0PENHcmFmUHRyPihtX3ByaXZhdGUtPm1fZnVsbHNjcmVlbldpbmRvdykpKTsKKwor
ICAgIC8vIFNldCB0aGUgc2l6ZSBvZiB0aGUgYm94IHRvIHByZXNlcnZlIGFzcGVjdCByYXRpbwor
ICAgIFJlY3QgcmVjdCA9IG1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93LT5wb3J0UmVjdDsK
KworICAgIGZsb2F0IG1vdmllUmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4obV9wcml2YXRlLT5t
X3dpZHRoKSAvIG1fcHJpdmF0ZS0+bV9oZWlnaHQ7CisgICAgaW50IHdpbmRvd1dpZHRoID0gIHJl
Y3QucmlnaHQgLSByZWN0LmxlZnQ7CisgICAgaW50IHdpbmRvd0hlaWdodCA9IHJlY3QuYm90dG9t
IC0gcmVjdC50b3A7CisgICAgZmxvYXQgd2luZG93UmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4o
d2luZG93V2lkdGgpIC8gd2luZG93SGVpZ2h0OworICAgIGludCBhY3R1YWxXaWR0aCA9ICh3aW5k
b3dSYXRpbyA+IG1vdmllUmF0aW8pID8gKHdpbmRvd0hlaWdodCAqIG1vdmllUmF0aW8pIDogd2lu
ZG93V2lkdGg7CisgICAgaW50IGFjdHVhbEhlaWdodCA9ICh3aW5kb3dSYXRpbyA8IG1vdmllUmF0
aW8pID8gKHdpbmRvd1dpZHRoIC8gbW92aWVSYXRpbykgOiB3aW5kb3dIZWlnaHQ7CisgICAgaW50
IG9mZnNldFggPSAod2luZG93V2lkdGggLSBhY3R1YWxXaWR0aCkgLyAyOworICAgIGludCBvZmZz
ZXRZID0gKHdpbmRvd0hlaWdodCAtIGFjdHVhbEhlaWdodCkgLyAyOworCisgICAgcmVjdC5sZWZ0
ID0gb2Zmc2V0WDsKKyAgICByZWN0LnJpZ2h0ID0gb2Zmc2V0WCArIGFjdHVhbFdpZHRoOworICAg
IHJlY3QudG9wID0gb2Zmc2V0WTsKKyAgICByZWN0LmJvdHRvbSA9IG9mZnNldFkgKyBhY3R1YWxI
ZWlnaHQ7CisKKyAgICBTZXRNb3ZpZUJveChtX3ByaXZhdGUtPm1fbW92aWUsICZyZWN0KTsKKyAg
ICBTaG93SGlkZVRhc2tCYXIodHJ1ZSk7CisKKyAgICAvLyBTZXQgdGhlICd0aGlzJyBwb2ludGVy
IG9uIHRoZSBIV05ECisgICAgSFdORCB3bmQgPSBzdGF0aWNfY2FzdDxIV05EPihHZXRQb3J0TmF0
aXZlV2luZG93KG1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93KSk7CisgICAgU2V0UHJvcCh3
bmQsIGZ1bGxzY3JlZW5RVE1vdmllV2luUG9pbnRlclByb3AsIHJlaW50ZXJwcmV0X2Nhc3Q8SEFO
RExFPih0aGlzKSk7CisKKyAgICByZXR1cm4gd25kOworfQorCit2b2lkIFFUTW92aWVXaW46OmV4
aXRGdWxsc2NyZWVuKCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93
KQorICAgICAgICByZXR1cm47CisKKyAgICBIV05EIHduZCA9IHN0YXRpY19jYXN0PEhXTkQ+KEdl
dFBvcnROYXRpdmVXaW5kb3cobV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5XaW5kb3cpKTsKKyAgICBE
ZXN0cm95UG9ydEFzc29jaWF0aW9uKHJlaW50ZXJwcmV0X2Nhc3Q8Q0dyYWZQdHI+KG1fcHJpdmF0
ZS0+bV9mdWxsc2NyZWVuV2luZG93KSk7CisgICAgU2V0TW92aWVHV29ybGQobV9wcml2YXRlLT5t
X21vdmllLCBtX3ByaXZhdGUtPm1fZnVsbHNjcmVlbk9yaWdHV29ybGQsIDApOworICAgIEVuZEZ1
bGxTY3JlZW4obV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5SZXN0b3JlU3RhdGUsIDBMKTsKKyAgICBT
ZXRNb3ZpZUJveChtX3ByaXZhdGUtPm1fbW92aWUsICZtX3ByaXZhdGUtPm1fZnVsbHNjcmVlblJl
Y3QpOworICAgIG1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuV2luZG93ID0gMDsKK30KKwogQk9PTCBX
SU5BUEkgRGxsTWFpbihISU5TVEFOQ0UgaGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lE
IGxwdlJlc2VydmVkKQogewogICAgIHN3aXRjaCAoZmR3UmVhc29uKSB7Ci0gICAgICAgIGNhc2Ug
RExMX1BST0NFU1NfQVRUQUNIOgotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIGNh
c2UgRExMX1BST0NFU1NfREVUQUNIOgotICAgICAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgot
ICAgICAgICBjYXNlIERMTF9USFJFQURfREVUQUNIOgotICAgICAgICAgICAgcmV0dXJuIEZBTFNF
OworICAgIGNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgorICAgICAgICByZXR1cm4gVFJVRTsKKyAg
ICBjYXNlIERMTF9QUk9DRVNTX0RFVEFDSDoKKyAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgor
ICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9
CiAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgcmV0dXJuIEZBTFNFOwpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUVRNb3ZpZVdpbi5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1FUTW92aWVXaW4uaAkocmV2aXNpb24gNTI4NTQp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgUVRNb3ZpZVdpbl9oCiAKICNpbmNsdWRl
IDxVbmljb2RlLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgogCiAjaWZkZWYgUVRNT1ZJRVdJTl9F
WFBPUlRTCiAjZGVmaW5lIFFUTU9WSUVXSU5fQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQpAQCAt
NDUsNiArNDYsMTEgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBtb3ZpZU5ld0ltYWdlQXZh
aWxhYmxlKFFUTW92aWVXaW4qKSA9IDA7CiB9OwogCitjbGFzcyBRVE1vdmllV2luRnVsbHNjcmVl
bkNsaWVudCB7CitwdWJsaWM6CisgICAgdmlydHVhbCBMUkVTVUxUIGZ1bGxzY3JlZW5DbGllbnRX
bmRQcm9jKEhXTkQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkg
PSAwOworfTsKKwogZW51bSB7CiAgICAgUVRNb3ZpZUxvYWRTdGF0ZUVycm9yID0gLTFMLAogICAg
IFFUTW92aWVMb2FkU3RhdGVMb2FkZWQgID0gMjAwMEwsCkBAIC0xMDQsOCArMTEwLDEzIEBAIHB1
YmxpYzoKICAgICBzdGF0aWMgdW5zaWduZWQgY291bnRTdXBwb3J0ZWRUeXBlcygpOwogICAgIHN0
YXRpYyB2b2lkIGdldFN1cHBvcnRlZFR5cGUodW5zaWduZWQgaW5kZXgsIGNvbnN0IFVDaGFyKiYg
c3RyLCB1bnNpZ25lZCYgbGVuKTsKIAorICAgIC8vIFJldHVybnMgdGhlIGZ1bGwtc2NyZWVuIHdp
bmRvdyBjcmVhdGVkCisgICAgSFdORCBlbnRlckZ1bGxzY3JlZW4oUVRNb3ZpZVdpbkZ1bGxzY3Jl
ZW5DbGllbnQqKTsKKyAgICB2b2lkIGV4aXRGdWxsc2NyZWVuKCk7CisKIHByaXZhdGU6CiAgICAg
dm9pZCBsb2FkKENGVVJMUmVmLCBib29sIHByZXNlcnZlc1BpdGNoKTsKKyAgICBzdGF0aWMgTFJF
U1VMVCBmdWxsc2NyZWVuV25kUHJvYyhIV05ELCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0s
IExQQVJBTSBsUGFyYW0pOwogCiAgICAgUVRNb3ZpZVdpblByaXZhdGUqIG1fcHJpdmF0ZTsKICAg
ICBib29sIG1fZGlzYWJsZWQ7CkluZGV4OiBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRy
b2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vRnVsbHNjcmVlblZpZGVvQ29udHJv
bGxlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRy
b2xsZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShWSURFTykKKworI2luY2x1ZGUgIkZ1bGxzY3Jl
ZW5WaWRlb0NvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIldlYktpdERMTC5oIgorI2luY2x1ZGUg
PEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvQml0bWFwSW5mby5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRm9udC5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvRm9udFNlbGVjdG9yLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRl
eHQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1RleHRSdW4uaD4KKyNpbmNsdWRlIDxXZWJLaXRTeXN0
ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8d2luZG93c3gu
aD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7
Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHRpbWVySW50
ZXJ2YWwgPSAwLjAzMzsKKworLy8gSFVEIFNpemUKK3N0YXRpYyBjb25zdCBpbnQgd2luZG93SGVp
Z2h0ID0gNTk7CitzdGF0aWMgY29uc3QgaW50IHdpbmRvd1dpZHRoID0gNDM4OworCisvLyBNYXJn
aW5zIGFuZCBidXR0b24gc2l6ZXMKK3N0YXRpYyBjb25zdCBpbnQgbWFyZ2luID0gOTsKK3N0YXRp
YyBjb25zdCBpbnQgbWFyZ2luVG9wID0gOTsKK3N0YXRpYyBjb25zdCBpbnQgYnV0dG9uU2l6ZSA9
IDI1Oworc3RhdGljIGNvbnN0IGludCBidXR0b25NaW5pU2l6ZSA9IDE2Oworc3RhdGljIGNvbnN0
IGludCB2b2x1bWVTbGlkZXJXaWR0aCA9IDUwOworc3RhdGljIGNvbnN0IGludCB0aW1lU2xpZGVy
V2lkdGggPSAzMTA7CitzdGF0aWMgY29uc3QgaW50IHNsaWRlckhlaWdodCA9IDg7CitzdGF0aWMg
Y29uc3QgaW50IHZvbHVtZVNsaWRlckJ1dHRvblNpemUgPSAxMDsKK3N0YXRpYyBjb25zdCBpbnQg
dGltZVNsaWRlckJ1dHRvblNpemUgPSA4Oworc3RhdGljIGNvbnN0IGludCB0ZXh0U2l6ZSA9IDEx
Oworc3RhdGljIGNvbnN0IGZsb2F0IGluaXRpYWxIVURQb3NpdGlvblkgPSAwLjk7IC8vIEluaXRp
YWwgWSBwb3NpdGlvbiBvZiBIVUQgaW4gcGVyY2VudGFnZSBmcm9tIHRvcCBvZiBzY3JlZW4KKwor
Ly8gQmFja2dyb3VuZCB2YWx1ZXMKK3N0YXRpYyBjb25zdCBpbnQgYm9yZGVyUmFkaXVzID0gMTI7
CitzdGF0aWMgY29uc3QgaW50IGJvcmRlclRoaWNrbmVzcyA9IDI7CisKKy8vIENvbG9ycworc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGludCBiYWNrZ3JvdW5kQ29sb3IgPSAweEEwMjAyMDIwOworc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGludCBib3JkZXJDb2xvciA9IDB4RkZBMEEwQTA7CitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgaW50IHNsaWRlckd1dHRlckNvbG9yID0gMHhGRjE0MTQxNDsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBpbnQgc2xpZGVyQnV0dG9uQ29sb3IgPSAweEZGODA4MDgwOworc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGludCB0ZXh0Q29sb3IgPSAweEZGRkZGRkZGOworCitIVURCdXR0
b246OkhVREJ1dHRvbihIVURCdXR0b25UeXBlIHR5cGUsIGNvbnN0IEludFBvaW50JiBwb3NpdGlv
bikKKyAgICA6IEhVRFdpZGdldChJbnRSZWN0KHBvc2l0aW9uLCBJbnRTaXplKCkpKQorICAgICwg
bV90eXBlKHR5cGUpCisgICAgLCBtX3Nob3dBbHRCdXR0b24oZmFsc2UpCit7CisgICAgY29uc3Qg
Y2hhciogYnV0dG9uUmVzb3VyY2UgPSAwOworICAgIGNvbnN0IGNoYXIqIGJ1dHRvblJlc291cmNl
QWx0ID0gMDsKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNhc2UgUGxheVBhdXNlQnV0dG9u
OgorICAgICAgICBidXR0b25SZXNvdXJjZSA9ICJmc1ZpZGVvUGxheSI7CisgICAgICAgIGJ1dHRv
blJlc291cmNlQWx0ID0gImZzVmlkZW9QYXVzZSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
VGltZVNsaWRlckJ1dHRvbjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWb2x1bWVVcEJ1dHRv
bjoKKyAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAiZnNWaWRlb0F1ZGlvVm9sdW1lSGlnaCI7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgVm9sdW1lU2xpZGVyQnV0dG9uOgorICAgICAgICBicmVh
azsKKyAgICBjYXNlIFZvbHVtZURvd25CdXR0b246CisgICAgICAgIGJ1dHRvblJlc291cmNlID0g
ImZzVmlkZW9BdWRpb1ZvbHVtZUxvdyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXhpdEZ1
bGxzY3JlZW5CdXR0b246CisgICAgICAgIGJ1dHRvblJlc291cmNlID0gImZzVmlkZW9FeGl0RnVs
bHNjcmVlbiI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChidXR0b25SZXNvdXJj
ZSkgeworICAgICAgICBtX2J1dHRvbkltYWdlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNl
KGJ1dHRvblJlc291cmNlKTsKKyAgICAgICAgbV9yZWN0LnNldFdpZHRoKG1fYnV0dG9uSW1hZ2Ut
PndpZHRoKCkpOworICAgICAgICBtX3JlY3Quc2V0SGVpZ2h0KG1fYnV0dG9uSW1hZ2UtPmhlaWdo
dCgpKTsKKyAgICB9CisgICAgaWYgKGJ1dHRvblJlc291cmNlQWx0KQorICAgICAgICBtX2J1dHRv
bkltYWdlQWx0ID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKGJ1dHRvblJlc291cmNlQWx0
KTsKK30KKwordm9pZCBIVURCdXR0b246OmRyYXcoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0KQor
eworICAgIEltYWdlKiBpbWFnZSA9IChtX3Nob3dBbHRCdXR0b24gJiYgbV9idXR0b25JbWFnZUFs
dCkgPyBtX2J1dHRvbkltYWdlQWx0LmdldCgpIDogbV9idXR0b25JbWFnZS5nZXQoKTsKKyAgICBj
b250ZXh0LmRyYXdJbWFnZShpbWFnZSwgRGV2aWNlQ29sb3JTcGFjZSwgbV9yZWN0LmxvY2F0aW9u
KCkpOworfQorCitIVURTbGlkZXI6OkhVRFNsaWRlcihIVURTbGlkZXJCdXR0b25TaGFwZSBzaGFw
ZSwgaW50IGJ1dHRvblNpemUsIGNvbnN0IEludFJlY3QmIHJlY3QpCisgICAgOiBIVURXaWRnZXQo
cmVjdCkKKyAgICAsIG1fYnV0dG9uU2hhcGUoc2hhcGUpCisgICAgLCBtX2J1dHRvblNpemUoYnV0
dG9uU2l6ZSkKKyAgICAsIG1fYnV0dG9uUG9zaXRpb24oMCkKKyAgICAsIG1fZHJhZ1N0YXJ0T2Zm
c2V0KDApCit7Cit9CisKK3ZvaWQgSFVEU2xpZGVyOjpkcmF3KEdyYXBoaWNzQ29udGV4dCYgY29u
dGV4dCkKK3sKKyAgICAvLyBEcmF3IGd1dHRlcgorICAgIEludFNpemUgcmFkaXVzKG1fcmVjdC5o
ZWlnaHQoKSAvIDIsIG1fcmVjdC5oZWlnaHQoKSAvIDIpOworICAgIGNvbnRleHQuZmlsbFJvdW5k
ZWRSZWN0KG1fcmVjdCwgcmFkaXVzLCByYWRpdXMsIHJhZGl1cywgcmFkaXVzLCBDb2xvcihzbGlk
ZXJHdXR0ZXJDb2xvciksIERldmljZUNvbG9yU3BhY2UpOworCisgICAgLy8gRHJhdyBidXR0b24K
KyAgICBjb250ZXh0LnNldFN0cm9rZUNvbG9yKENvbG9yKHNsaWRlckJ1dHRvbkNvbG9yKSwgRGV2
aWNlQ29sb3JTcGFjZSk7CisgICAgY29udGV4dC5zZXRGaWxsQ29sb3IoQ29sb3Ioc2xpZGVyQnV0
dG9uQ29sb3IpLCBEZXZpY2VDb2xvclNwYWNlKTsKKworICAgIGlmIChtX2J1dHRvblNoYXBlID09
IFJvdW5kQnV0dG9uKSB7CisgICAgICAgIGNvbnRleHQuZHJhd0VsbGlwc2UoSW50UmVjdChtX3Jl
Y3QubG9jYXRpb24oKS54KCkgKyBtX2J1dHRvblBvc2l0aW9uLCBtX3JlY3QubG9jYXRpb24oKS55
KCkgLSAobV9idXR0b25TaXplIC0gbV9yZWN0LmhlaWdodCgpKSAvIDIsIG1fYnV0dG9uU2l6ZSwg
bV9idXR0b25TaXplKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEcmF3IGEg
ZGlhbW9uZAorICAgIEZsb2F0UG9pbnQgcG9pbnRzWzRdOworICAgIGZsb2F0IGhhbGYgPSBzdGF0
aWNfY2FzdDxmbG9hdD4obV9idXR0b25TaXplKSAvIDI7CisgICAgcG9pbnRzWzBdLnNldFgobV9y
ZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25Qb3NpdGlvbiArIGhhbGYpOworICAgIHBvaW50
c1swXS5zZXRZKG1fcmVjdC5sb2NhdGlvbigpLnkoKSk7CisgICAgcG9pbnRzWzFdLnNldFgobV9y
ZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25Qb3NpdGlvbiArIG1fYnV0dG9uU2l6ZSk7Cisg
ICAgcG9pbnRzWzFdLnNldFkobV9yZWN0LmxvY2F0aW9uKCkueSgpICsgaGFsZik7CisgICAgcG9p
bnRzWzJdLnNldFgobV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25Qb3NpdGlvbiArIGhh
bGYpOworICAgIHBvaW50c1syXS5zZXRZKG1fcmVjdC5sb2NhdGlvbigpLnkoKSArIG1fYnV0dG9u
U2l6ZSk7CisgICAgcG9pbnRzWzNdLnNldFgobV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0
b25Qb3NpdGlvbik7CisgICAgcG9pbnRzWzNdLnNldFkobV9yZWN0LmxvY2F0aW9uKCkueSgpICsg
aGFsZik7CisgICAgY29udGV4dC5kcmF3Q29udmV4UG9seWdvbig0LCBwb2ludHMsIHRydWUpOwor
fQorCit2b2lkIEhVRFNsaWRlcjo6ZHJhZyhJbnRQb2ludCBwb2ludCwgYm9vbCBzdGFydCkKK3sK
KyAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgLy8gV2hlbiB3ZSBzdGFydCwgd2UgbmVlZCB0byBz
bmFwIHRoZSBzbGlkZXIgcG9zaXRpb24gdG8gdGhlIHggcG9zaXRpb24gaWYgd2UgY2xpY2tlZCB0
aGUgZ3V0dGVyLgorICAgICAgICAvLyBCdXQgaWYgd2UgY2xpY2sgdGhlIGJ1dHRvbiwgd2UgbmVl
ZCB0byBkcmFnIHJlbGF0aXZlIHRvIHdoZXJlIHdlIGNsaWNrZWQgZG93bi4gV2Ugb25seSBuZWVk
CisgICAgICAgIC8vIHRvIGNoZWNrIFggYmVjYXVzZSB3ZSB3b3VsZCBub3QgZXZlbiBnZXQgaGVy
ZSB1bmxlc3MgWSB3ZXJlIGFscmVhZHkgaW5zaWRlLgorICAgICAgICBpbnQgcmVsYXRpdmVYID0g
cG9pbnQueCgpIC0gbV9yZWN0LmxvY2F0aW9uKCkueCgpOworICAgICAgICBpZiAocmVsYXRpdmVY
ID49IG1fYnV0dG9uUG9zaXRpb24gJiYgcmVsYXRpdmVYIDw9IG1fYnV0dG9uUG9zaXRpb24gKyBt
X2J1dHRvblNpemUpCisgICAgICAgICAgICBtX2RyYWdTdGFydE9mZnNldCA9IHBvaW50LngoKSAt
IG1fYnV0dG9uUG9zaXRpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fZHJhZ1N0YXJ0
T2Zmc2V0ID0gbV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25TaXplIC8gMjsKKyAgICB9
CisKKyAgICBtX2J1dHRvblBvc2l0aW9uID0gbWF4KDAsIG1pbihtX3JlY3Qud2lkdGgoKSAtIG1f
YnV0dG9uU2l6ZSwgcG9pbnQueCgpIC0gbV9kcmFnU3RhcnRPZmZzZXQpKTsNCit9CisKK0Z1bGxz
Y3JlZW5WaWRlb0NvbnRyb2xsZXI6OkZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIoKQorICAgIDog
bV9odWRXaW5kb3coMCkKKyAgICAsIG1fdmlkZW9XaW5kb3coMCkKKyAgICAsIG1fcGxheVBhdXNl
QnV0dG9uKEhVREJ1dHRvbjo6UGxheVBhdXNlQnV0dG9uLCBJbnRQb2ludCgod2luZG93V2lkdGgg
LSBidXR0b25TaXplKSAvIDIsIG1hcmdpblRvcCkpCisgICAgLCBtX3RpbWVTbGlkZXJCdXR0b24o
SFVEQnV0dG9uOjpUaW1lU2xpZGVyQnV0dG9uLCBJbnRQb2ludCgwLCAwKSkKKyAgICAsIG1fdm9s
dW1lVXBCdXR0b24oSFVEQnV0dG9uOjpWb2x1bWVVcEJ1dHRvbiwgSW50UG9pbnQobWFyZ2luICsg
YnV0dG9uTWluaVNpemUgKyB2b2x1bWVTbGlkZXJXaWR0aCArIGJ1dHRvbk1pbmlTaXplIC8gMiwg
bWFyZ2luVG9wICsgKGJ1dHRvblNpemUgLSBidXR0b25NaW5pU2l6ZSkgLyAyKSkKKyAgICAsIG1f
dm9sdW1lU2xpZGVyQnV0dG9uKEhVREJ1dHRvbjo6Vm9sdW1lU2xpZGVyQnV0dG9uLCBJbnRQb2lu
dCgwLCAwKSkKKyAgICAsIG1fdm9sdW1lRG93bkJ1dHRvbihIVURCdXR0b246OlZvbHVtZURvd25C
dXR0b24sIEludFBvaW50KG1hcmdpbiwgbWFyZ2luVG9wICsgKGJ1dHRvblNpemUgLSBidXR0b25N
aW5pU2l6ZSkgLyAyKSkKKyAgICAsIG1fZXhpdEZ1bGxzY3JlZW5CdXR0b24oSFVEQnV0dG9uOjpF
eGl0RnVsbHNjcmVlbkJ1dHRvbiwgSW50UG9pbnQod2luZG93V2lkdGggLSAyICogbWFyZ2luIC0g
YnV0dG9uTWluaVNpemUsIG1hcmdpblRvcCArIChidXR0b25TaXplIC0gYnV0dG9uTWluaVNpemUp
IC8gMikpCisgICAgLCBtX3ZvbHVtZVNsaWRlcihIVURTbGlkZXI6OlJvdW5kQnV0dG9uLCB2b2x1
bWVTbGlkZXJCdXR0b25TaXplLCBJbnRSZWN0KEludFBvaW50KG1hcmdpbiArIGJ1dHRvbk1pbmlT
aXplLCBtYXJnaW5Ub3AgKyAoYnV0dG9uU2l6ZSAtIGJ1dHRvbk1pbmlTaXplKSAvIDIgKyBidXR0
b25NaW5pU2l6ZSAvIDIgLSBzbGlkZXJIZWlnaHQgLyAyKSwgSW50U2l6ZSh2b2x1bWVTbGlkZXJX
aWR0aCwgc2xpZGVySGVpZ2h0KSkpCisgICAgLCBtX3RpbWVTbGlkZXIoSFVEU2xpZGVyOjpEaWFt
b25kQnV0dG9uLCB0aW1lU2xpZGVyQnV0dG9uU2l6ZSwgSW50UmVjdChJbnRQb2ludCh3aW5kb3dX
aWR0aCAvIDIgLSB0aW1lU2xpZGVyV2lkdGggLyAyLCB3aW5kb3dIZWlnaHQgLSBtYXJnaW4gLSBz
bGlkZXJIZWlnaHQpLCBJbnRTaXplKHRpbWVTbGlkZXJXaWR0aCwgc2xpZGVySGVpZ2h0KSkpCisg
ICAgLCBtX2hpdFdpZGdldCgwKQorICAgICwgbV9tb3ZpbmdXaW5kb3coZmFsc2UpCisgICAgLCBt
X3RpbWVyKHRoaXMsICZGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp0aW1lckZpcmVkKQorewor
fQorCitGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp+RnVsbHNjcmVlblZpZGVvQ29udHJvbGxl
cigpCit7CisgICAgaWYgKG1vdmllKCkpCisgICAgICAgIG1vdmllKCktPmV4aXRGdWxsc2NyZWVu
KCk7CisKKyAgICBtX2JpdG1hcC5jbGVhcigpOworfQorCitRVE1vdmllV2luKiBGdWxsc2NyZWVu
VmlkZW9Db250cm9sbGVyOjptb3ZpZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVt
ZW50ID8gcmVpbnRlcnByZXRfY2FzdDxRVE1vdmllV2luKj4obV9tZWRpYUVsZW1lbnQtPnBsYXRm
b3JtTWVkaWEoKS5xdE1vdmllKSA6IDA7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29udHJv
bGxlcjo6c2V0TWVkaWFFbGVtZW50KEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCkKK3sK
KyAgICBtX21lZGlhRWxlbWVudCA9IG1lZGlhRWxlbWVudDsKKyAgICBpZiAoIW1fbWVkaWFFbGVt
ZW50KSB7CisgICAgICAgIC8vIENhbid0IGRvIGZ1bGwtc2NyZWVuLCBqdXN0IGdldCBvdXQKKyAg
ICAgICAgZXhpdEZ1bGxzY3JlZW4oKTsKKyAgICB9Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVv
Q29udHJvbGxlcjo6ZW50ZXJGdWxsc2NyZWVuKCkKK3sKKyAgICBpZiAoIW1vdmllKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fdmlkZW9XaW5kb3cgPSBtb3ZpZSgpLT5lbnRlckZ1bGxzY3Jl
ZW4odGhpcyk7CisKKyAgICBSRUNUIHdpbmRvd1JlY3Q7CisgICAgR2V0Q2xpZW50UmVjdChtX3Zp
ZGVvV2luZG93LCAmd2luZG93UmVjdCk7CisgICAgbV9mdWxsc2NyZWVuU2l6ZS5zZXRXaWR0aCh3
aW5kb3dSZWN0LnJpZ2h0IC0gd2luZG93UmVjdC5sZWZ0ICsgMSk7CisgICAgbV9mdWxsc2NyZWVu
U2l6ZS5zZXRIZWlnaHQod2luZG93UmVjdC5ib3R0b20gLSB3aW5kb3dSZWN0LnRvcCArIDEpOwor
CisgICAgY3JlYXRlSFVEV2luZG93KCk7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29udHJv
bGxlcjo6ZXhpdEZ1bGxzY3JlZW4oKQoreworICAgIGlmIChtb3ZpZSgpKQorICAgICAgICBtb3Zp
ZSgpLT5leGl0RnVsbHNjcmVlbigpOworCisgICAgbV92aWRlb1dpbmRvdyA9IDA7CisgICAgU2V0
V2luZG93TG9uZ1B0cihtX2h1ZFdpbmRvdywgMCwgMCk7CisgICAgRGVzdHJveVdpbmRvdyhtX2h1
ZFdpbmRvdyk7Cit9CisKK2Jvb2wgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6Y2FuUGxheSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVtZW50ICYmIG1fbWVkaWFFbGVtZW50LT5j
YW5QbGF5KCk7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6cGxheSgpCit7
CisgICAgaWYgKG1fbWVkaWFFbGVtZW50KQorICAgICAgICBtX21lZGlhRWxlbWVudC0+cGxheSgp
OworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OnBhdXNlKCkKK3sKKyAgICBp
ZiAobV9tZWRpYUVsZW1lbnQpCisgICAgICAgIG1fbWVkaWFFbGVtZW50LT5wYXVzZSgpOworfQor
CitmbG9hdCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp2b2x1bWUoKSBjb25zdAoreworICAg
IHJldHVybiBtX21lZGlhRWxlbWVudCA/IG1fbWVkaWFFbGVtZW50LT52b2x1bWUoKSA6IDA7Cit9
CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVt
ZSkKK3sKKyAgICBpZiAobV9tZWRpYUVsZW1lbnQpIHsKKyAgICAgICAgRXhjZXB0aW9uQ29kZSBl
YzsKKyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPnNldFZvbHVtZSh2b2x1bWUsIGVjKTsKKyAgICB9
Cit9CisKK2Zsb2F0IEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmN1cnJlbnRUaW1lKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gbV9tZWRpYUVsZW1lbnQgPyBtX21lZGlhRWxlbWVudC0+Y3VycmVu
dFRpbWUoKSA6IDA7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6c2V0Q3Vy
cmVudFRpbWUoZmxvYXQgdmFsdWUpCit7CisgICAgaWYgKG1fbWVkaWFFbGVtZW50KSB7CisgICAg
ICAgIEV4Y2VwdGlvbkNvZGUgZWM7CisgICAgICAgIG1fbWVkaWFFbGVtZW50LT5zZXRDdXJyZW50
VGltZSh2YWx1ZSwgZWMpOworICAgIH0KK30KKworZmxvYXQgRnVsbHNjcmVlblZpZGVvQ29udHJv
bGxlcjo6ZHVyYXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX21lZGlhRWxlbWVudCA/IG1f
bWVkaWFFbGVtZW50LT5kdXJhdGlvbigpIDogMDsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9D
b250cm9sbGVyOjpiZWdpblNjcnViYmluZygpCit7CisgICAgaWYgKG1fbWVkaWFFbGVtZW50KSAK
KyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPmJlZ2luU2NydWJiaW5nKCk7Cit9CisKK3ZvaWQgRnVs
bHNjcmVlblZpZGVvQ29udHJvbGxlcjo6ZW5kU2NydWJiaW5nKCkKK3sKKyAgICBpZiAobV9tZWRp
YUVsZW1lbnQpIAorICAgICAgICBtX21lZGlhRWxlbWVudC0+ZW5kU2NydWJiaW5nKCk7Cit9CisK
K0xSRVNVTFQgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6ZnVsbHNjcmVlbkNsaWVudFduZFBy
b2MoSFdORCB3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkK
K3sKKyAgICBzd2l0Y2ggKG1lc3NhZ2UpIHsKKyAgICBjYXNlIFdNX0NIQVI6CisgICAgICAgIG9u
Q2hhcih3UGFyYW0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX0xCVVRUT05ET1dOOgor
ICAgICAgICBvbk1vdXNlRG93bihJbnRQb2ludChHRVRfWF9MUEFSQU0obFBhcmFtKSwgR0VUX1lf
TFBBUkFNKGxQYXJhbSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9NT1VTRU1PVkU6
CisgICAgICAgIG9uTW91c2VNb3ZlKEludFBvaW50KEdFVF9YX0xQQVJBTShsUGFyYW0pLCBHRVRf
WV9MUEFSQU0obFBhcmFtKSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX0xCVVRUT05V
UDoKKyAgICAgICAgb25Nb3VzZVVwKEludFBvaW50KEdFVF9YX0xQQVJBTShsUGFyYW0pLCBHRVRf
WV9MUEFSQU0obFBhcmFtKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4g
RGVmV2luZG93UHJvYyh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKK30KKworc3RhdGlj
IGNvbnN0IExQQ1dTVFIgZnVsbHNjcmVlblZpZGVlb0hVRFdpbmRvd0NsYXNzTmFtZSA9IEwiZnVs
bHNjcmVlblZpZGVlb0hVRFdpbmRvd0NsYXNzIjsKKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250
cm9sbGVyOjpyZWdpc3RlckhVRFdpbmRvd0NsYXNzKCkKK3sKKyAgICBzdGF0aWMgYm9vbCBoYXZl
UmVnaXN0ZXJlZEhVRFdpbmRvd0NsYXNzID0gZmFsc2U7CisgICAgaWYgKGhhdmVSZWdpc3RlcmVk
SFVEV2luZG93Q2xhc3MpCisgICAgICAgIHJldHVybjsKKworICAgIGhhdmVSZWdpc3RlcmVkSFVE
V2luZG93Q2xhc3MgPSB0cnVlOworCisgICAgV05EQ0xBU1NFWCB3Y2V4OworCisgICAgd2NleC5j
YlNpemUgPSBzaXplb2YoV05EQ0xBU1NFWCk7CisKKyAgICB3Y2V4LnN0eWxlID0gQ1NfSFJFRFJB
VyB8IENTX1ZSRURSQVc7CisgICAgd2NleC5scGZuV25kUHJvYyA9IGh1ZFduZFByb2M7CisgICAg
d2NleC5jYkNsc0V4dHJhID0gMDsKKyAgICB3Y2V4LmNiV25kRXh0cmEgPSA0OworICAgIHdjZXgu
aEluc3RhbmNlID0gZ0luc3RhbmNlOworICAgIHdjZXguaEljb24gPSAwOworICAgIHdjZXguaEN1
cnNvciA9IExvYWRDdXJzb3IoMCwgSURDX0FSUk9XKTsKKyAgICB3Y2V4LmhickJhY2tncm91bmQg
PSAwOworICAgIHdjZXgubHBzek1lbnVOYW1lID0gMDsKKyAgICB3Y2V4Lmxwc3pDbGFzc05hbWUg
PSBmdWxsc2NyZWVuVmlkZWVvSFVEV2luZG93Q2xhc3NOYW1lOworICAgIHdjZXguaEljb25TbSA9
IDA7CisKKyAgICBSZWdpc3RlckNsYXNzRXgoJndjZXgpOworfQorCit2b2lkIEZ1bGxzY3JlZW5W
aWRlb0NvbnRyb2xsZXI6OmNyZWF0ZUhVRFdpbmRvdygpCit7CisgICAgbV9odWRQb3NpdGlvbi5z
ZXRYKChtX2Z1bGxzY3JlZW5TaXplLndpZHRoKCkgLSB3aW5kb3dXaWR0aCkgLyAyKTsKKyAgICBt
X2h1ZFBvc2l0aW9uLnNldFkobV9mdWxsc2NyZWVuU2l6ZS5oZWlnaHQoKSAqIGluaXRpYWxIVURQ
b3NpdGlvblkgLSB3aW5kb3dIZWlnaHQgLyAyKTsKKworICAgIC8vIExvY2FsIHZhcmlhYmxlIHRo
YXQgd2lsbCBob2xkIHRoZSByZXR1cm5lZCBwaXhlbHMuIE5vIG5lZWQgdG8gY2xlYW51cCB0aGlz
IHZhbHVlLiBJdAorICAgIC8vIHdpbGwgZ2V0IGNsZWFuZWQgdXAgd2hlbiBtX2JpdG1hcCBpcyBk
ZXN0cm95ZWQgaW4gdGhlIGR0b3IKKyAgICB2b2lkKiBwaXhlbHM7CisgICAgQml0bWFwSW5mbyBi
aXRtYXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRlQm90dG9tVXAoSW50U2l6ZSh3aW5kb3dXaWR0
aCwgd2luZG93SGVpZ2h0KSk7CisgICAgbV9iaXRtYXAuc2V0KDo6Q3JlYXRlRElCU2VjdGlvbigw
LCAmYml0bWFwSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApKTsKKyAgICAKKyAg
ICAvLyBEaXJ0eSB0aGUgd2luZG93IHNvIHRoZSBIVUQgZHJhd3MKKyAgICBSRUNUIGNsZWFyUmVj
dCA9IHsgbV9odWRQb3NpdGlvbi54KCksIG1faHVkUG9zaXRpb24ueSgpLCBtX2h1ZFBvc2l0aW9u
LngoKSArIHdpbmRvd1dpZHRoIC0gMSwgbV9odWRQb3NpdGlvbi55KCkgKyB3aW5kb3dIZWlnaHQg
LSAxIH07CisgICAgSW52YWxpZGF0ZVJlY3QobV92aWRlb1dpbmRvdywgJmNsZWFyUmVjdCwgdHJ1
ZSk7CisKKyAgICBtX3BsYXlQYXVzZUJ1dHRvbi5zZXRTaG93QWx0QnV0dG9uKCFjYW5QbGF5KCkp
OworICAgIG1fdm9sdW1lU2xpZGVyLnNldFZhbHVlKHZvbHVtZSgpKTsKKyAgICBtX3RpbWVTbGlk
ZXIuc2V0VmFsdWUoY3VycmVudFRpbWUoKSAvIGR1cmF0aW9uKCkpOworCisgICAgaWYgKCFjYW5Q
bGF5KCkpCisgICAgICAgIG1fdGltZXIuc3RhcnRSZXBlYXRpbmcodGltZXJJbnRlcnZhbCk7CisK
KyAgICByZWdpc3RlckhVRFdpbmRvd0NsYXNzKCk7CisKKyAgICBtX2h1ZFdpbmRvdyA9IENyZWF0
ZVdpbmRvd0V4KFdTX0VYX0xBWUVSRUQgfCBXU19FWF9UUkFOU1BBUkVOVCB8IFdTX0VYX1RPUE1P
U1QgfCBXU19FWF9UT09MV0lORE9XLCAKKyAgICAgICAgZnVsbHNjcmVlblZpZGVlb0hVRFdpbmRv
d0NsYXNzTmFtZSwgMCwgV1NfUE9QVVAgfCBXU19WSVNJQkxFLAorICAgICAgICBtX2h1ZFBvc2l0
aW9uLngoKSwgbV9odWRQb3NpdGlvbi55KCksIDAsIDAsIDAsIDAsIGdJbnN0YW5jZSwgMCk7Cisg
ICAgQVNTRVJUKDo6SXNXaW5kb3cobV9odWRXaW5kb3cpKTsKKyAgICBTZXRXaW5kb3dMb25nUHRy
KG1faHVkV2luZG93LCAwLCByZWludGVycHJldF9jYXN0PExPTkdfUFRSPih0aGlzKSk7CisKKyAg
ICBkcmF3KCk7Cit9CisKK3N0YXRpYyBTdHJpbmcgdGltZVRvU3RyaW5nKGZsb2F0IHRpbWUpCit7
CisgICAgaWYgKCFpc2Zpbml0ZSh0aW1lKSkKKyAgICAgICAgdGltZSA9IDA7CisgICAgaW50IHNl
Y29uZHMgPSBmYWJzZih0aW1lKTsgCisgICAgaW50IGhvdXJzID0gc2Vjb25kcyAvICg2MCAqIDYw
KTsKKyAgICBpbnQgbWludXRlcyA9IChzZWNvbmRzIC8gNjApICUgNjA7CisgICAgc2Vjb25kcyAl
PSA2MDsKKworICAgIGlmIChob3VycykgeworICAgICAgICBpZiAoaG91cnMgPiA5KQorICAgICAg
ICAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIlcyUwMmQ6JTAyZDolMDJkIiwgKHRpbWUgPCAw
ID8gIi0iIDogIiIpLCBob3VycywgbWludXRlcywgc2Vjb25kcyk7CisgICAgICAgIHJldHVybiBT
dHJpbmc6OmZvcm1hdCgiJXMlMDFkOiUwMmQ6JTAyZCIsICh0aW1lIDwgMCA/ICItIiA6ICIiKSwg
aG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpOworICAgIH0KKworICAgIHJldHVybiBTdHJpbmc6OmZv
cm1hdCgiJXMlMDJkOiUwMmQiLCAodGltZSA8IDAgPyAiLSIgOiAiIiksIG1pbnV0ZXMsIHNlY29u
ZHMpOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmRyYXcoKQoreworICAg
IEhEQyB3aW5kb3dEQyA9IEdldERDKG1faHVkV2luZG93KTsKKyAgICBIREMgYml0bWFwREMgPSBD
cmVhdGVDb21wYXRpYmxlREMod2luZG93REMpOworICAgIFNlbGVjdE9iamVjdChiaXRtYXBEQywg
bV9iaXRtYXAuZ2V0KCkpOworCisgICAgR3JhcGhpY3NDb250ZXh0IGNvbnRleHQoYml0bWFwREMs
IHRydWUpOworCisgICAgY29udGV4dC5zYXZlKCk7CisKKyAgICAvLyBEcmF3IHRoZSBiYWNrZ3Jv
dW5kCisgICAgSW50U2l6ZSBvdXRlclJhZGl1cyhib3JkZXJSYWRpdXMsIGJvcmRlclJhZGl1cyk7
CisgICAgSW50UmVjdCBvdXRlclJlY3QoMCwgMCwgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCk7
CisgICAgSW50U2l6ZSBpbm5lclJhZGl1cyhib3JkZXJSYWRpdXMgLSBib3JkZXJUaGlja25lc3Ms
IGJvcmRlclJhZGl1cyAtIGJvcmRlclRoaWNrbmVzcyk7CisgICAgSW50UmVjdCBpbm5lclJlY3Qo
Ym9yZGVyVGhpY2tuZXNzLCBib3JkZXJUaGlja25lc3MsIHdpbmRvd1dpZHRoIC0gYm9yZGVyVGhp
Y2tuZXNzICogMiwgd2luZG93SGVpZ2h0IC0gYm9yZGVyVGhpY2tuZXNzICogMik7CisKKyAgICBj
b250ZXh0LmZpbGxSb3VuZGVkUmVjdChvdXRlclJlY3QsIG91dGVyUmFkaXVzLCBvdXRlclJhZGl1
cywgb3V0ZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBDb2xvcihib3JkZXJDb2xvciksIERldmljZUNv
bG9yU3BhY2UpOworICAgIGNvbnRleHQuc2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZUNv
cHkpOworICAgIGNvbnRleHQuZmlsbFJvdW5kZWRSZWN0KGlubmVyUmVjdCwgaW5uZXJSYWRpdXMs
IGlubmVyUmFkaXVzLCBpbm5lclJhZGl1cywgaW5uZXJSYWRpdXMsIENvbG9yKGJhY2tncm91bmRD
b2xvciksIERldmljZUNvbG9yU3BhY2UpOworCisgICAgLy8gRHJhdyB0aGUgd2lkZ2V0cworICAg
IG1fcGxheVBhdXNlQnV0dG9uLmRyYXcoY29udGV4dCk7CisgICAgbV92b2x1bWVVcEJ1dHRvbi5k
cmF3KGNvbnRleHQpOworICAgIG1fdm9sdW1lU2xpZGVyQnV0dG9uLmRyYXcoY29udGV4dCk7Cisg
ICAgbV92b2x1bWVEb3duQnV0dG9uLmRyYXcoY29udGV4dCk7CisgICAgbV90aW1lU2xpZGVyQnV0
dG9uLmRyYXcoY29udGV4dCk7CisgICAgbV9leGl0RnVsbHNjcmVlbkJ1dHRvbi5kcmF3KGNvbnRl
eHQpOworICAgIG1fdm9sdW1lU2xpZGVyLmRyYXcoY29udGV4dCk7CisgICAgbV90aW1lU2xpZGVy
LmRyYXcoY29udGV4dCk7CisKKyAgICAvLyBEcmF3IHRoZSB0ZXh0IHN0cmluZ3MKKyAgICBGb250
RGVzY3JpcHRpb24gZGVzYzsKKworICAgIE5PTkNMSUVOVE1FVFJJQ1MgbWV0cmljczsKKyAgICBt
ZXRyaWNzLmNiU2l6ZSA9IHNpemVvZihtZXRyaWNzKTsKKyAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5m
byhTUElfR0VUTk9OQ0xJRU5UTUVUUklDUywgbWV0cmljcy5jYlNpemUsICZtZXRyaWNzLCAwKTsK
KyAgICBGb250RmFtaWx5IGZhbWlseTsKKyAgICBmYW1pbHkuc2V0RmFtaWx5KG1ldHJpY3MubGZT
bUNhcHRpb25Gb250LmxmRmFjZU5hbWUpOworICAgIGRlc2Muc2V0RmFtaWx5KGZhbWlseSk7CisK
KyAgICBkZXNjLnNldENvbXB1dGVkU2l6ZSh0ZXh0U2l6ZSk7CisgICAgRm9udCBmb250ID0gRm9u
dChkZXNjLCAwLCAwKTsKKyAgICBmb250LnVwZGF0ZSgwKTsKKworICAgIFN0cmluZyBzOworCisg
ICAgLy8gVGhlIHkgcG9zaXRpb25pbmcgb2YgdGhlc2UgdHdvIHRleHQgc3RyaW5ncyBpcyB0cmlj
a3kgYmVjYXVzZSB0aGV5IGFyZSBzbyBzbWFsbC4gVGhleQorICAgIC8vIGFyZSBjdXJyZW50bHkg
cG9zaXRpb25lZCByZWxhdGl2ZSB0byB0aGUgY2VudGVyIG9mIHRoZSBzbGlkZXIgYW5kIHRoZW4g
ZG93biB0aGUgZm9udAorICAgIC8vIGhlaWdodCAvIDQgKHdoaWNoIGlzIGFjdHVhbGx5IGhhbGYg
b2YgZm9udCBoZWlnaHQgLzIpLCB3aGljaCBwb3NpdGlvbnMgdGhlIGNlbnRlciBvZgorICAgIC8v
IHRoZSB0ZXh0IGF0IHRoZSBjZW50ZXIgb2YgdGhlIHNsaWRlci4KKyAgICAvLyBMZWZ0IHN0cmlu
ZworICAgIHMgPSB0aW1lVG9TdHJpbmcoY3VycmVudFRpbWUoKSk7CisgICAgVGV4dFJ1biBsZWZ0
VGV4dChzKTsKKyAgICBjb250ZXh0LnNldEZpbGxDb2xvcihDb2xvcih0ZXh0Q29sb3IpLCBEZXZp
Y2VDb2xvclNwYWNlKTsKKyAgICBjb250ZXh0LmRyYXdUZXh0KGZvbnQsIGxlZnRUZXh0LCBJbnRQ
b2ludCh3aW5kb3dXaWR0aCAvIDIgLSB0aW1lU2xpZGVyV2lkdGggLyAyIC0gbWFyZ2luIC0gZm9u
dC53aWR0aChsZWZ0VGV4dCksIHdpbmRvd0hlaWdodCAtIG1hcmdpbiAtIHNsaWRlckhlaWdodCAv
IDIgKyBmb250LmhlaWdodCgpIC8gNCkpOworCisgICAgLy8gUmlnaHQgc3RyaW5nCisgICAgcyA9
IHRpbWVUb1N0cmluZyhjdXJyZW50VGltZSgpIC0gZHVyYXRpb24oKSk7CisgICAgVGV4dFJ1biBy
aWdodFRleHQocyk7CisgICAgY29udGV4dC5zZXRGaWxsQ29sb3IoQ29sb3IodGV4dENvbG9yKSwg
RGV2aWNlQ29sb3JTcGFjZSk7CisgICAgY29udGV4dC5kcmF3VGV4dChmb250LCByaWdodFRleHQs
IEludFBvaW50KHdpbmRvd1dpZHRoIC8gMiArIHRpbWVTbGlkZXJXaWR0aCAvIDIgKyBtYXJnaW4s
IHdpbmRvd0hlaWdodCAtIG1hcmdpbiAtIHNsaWRlckhlaWdodCAvIDIgKyBmb250LmhlaWdodCgp
IC8gNCkpOworCisgICAgLy8gQ29weSB0byB0aGUgd2luZG93CisgICAgQkxFTkRGVU5DVElPTiBi
bGVuZEZ1bmN0aW9uID0ge0FDX1NSQ19PVkVSLCAwLCAyNTUsIEFDX1NSQ19BTFBIQX07CisgICAg
U0laRSBzaXplID0geyB3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0IH07CisgICAgUE9JTlQgc291
cmNlUG9pbnQgPSB7MCwgMH07CisgICAgUE9JTlQgZGVzdFBvaW50ID0geyBtX2h1ZFBvc2l0aW9u
LngoKSwgbV9odWRQb3NpdGlvbi55KCkgfTsKKyAgICBCT09MIHJlc3VsdCA9IFVwZGF0ZUxheWVy
ZWRXaW5kb3cobV9odWRXaW5kb3csIDAsICZkZXN0UG9pbnQsICZzaXplLCBiaXRtYXBEQywgJnNv
dXJjZVBvaW50LCAwLCAmYmxlbmRGdW5jdGlvbiwgVUxXX0FMUEhBKTsKKworICAgIGNvbnRleHQu
cmVzdG9yZSgpOworCisgICAgOjpEZWxldGVEQyhiaXRtYXBEQyk7CisgICAgOjpSZWxlYXNlREMo
bV9odWRXaW5kb3csIHdpbmRvd0RDKTsKK30KKworTFJFU1VMVCBGdWxsc2NyZWVuVmlkZW9Db250
cm9sbGVyOjpodWRXbmRQcm9jKEhXTkQgd25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0s
IExQQVJBTSBsUGFyYW0pCit7CisgICAgTE9OR19QVFIgbG9uZ1B0ciA9IEdldFdpbmRvd0xvbmdQ
dHIod25kLCAwKTsKKyAgICBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKiBjb250cm9sbGVyID0g
cmVpbnRlcnByZXRfY2FzdDxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKj4obG9uZ1B0cik7Cisg
ICAgaWYgKCFjb250cm9sbGVyKQorICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyh3bmQsIG1l
c3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIHN3aXRjaCAobWVzc2FnZSkgeworICAgIGNh
c2UgV01fQ0hBUjoKKyAgICAgICAgY29udHJvbGxlci0+b25DaGFyKHdQYXJhbSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgV01fTEJVVFRPTkRPV046CisgICAgICAgIGNvbnRyb2xsZXItPm9u
TW91c2VEb3duKEludFBvaW50KEdFVF9YX0xQQVJBTShsUGFyYW0pLCBHRVRfWV9MUEFSQU0obFBh
cmFtKSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX01PVVNFTU9WRToKKyAgICAgICAg
Y29udHJvbGxlci0+b25Nb3VzZU1vdmUoSW50UG9pbnQoR0VUX1hfTFBBUkFNKGxQYXJhbSksIEdF
VF9ZX0xQQVJBTShsUGFyYW0pKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV01fTEJVVFRP
TlVQOgorICAgICAgICBjb250cm9sbGVyLT5vbk1vdXNlVXAoSW50UG9pbnQoR0VUX1hfTFBBUkFN
KGxQYXJhbSksIEdFVF9ZX0xQQVJBTShsUGFyYW0pKSk7CisgICAgICAgIGJyZWFrOworICAgIH0K
KworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0p
OworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6Om9uQ2hhcihpbnQgYykKK3sK
KyAgICBpZiAoYyA9PSBWS19FU0NBUEUpIHsKKyAgICAgICAgaWYgKG1fbWVkaWFFbGVtZW50KQor
ICAgICAgICAgICAgbV9tZWRpYUVsZW1lbnQtPmV4aXRGdWxsc2NyZWVuKCk7CisgICAgfSBlbHNl
IGlmIChjID09IFZLX1NQQUNFKQorICAgICAgICB0b2dnbGVQbGF5KCk7Cit9CisKK3ZvaWQgRnVs
bHNjcmVlblZpZGVvQ29udHJvbGxlcjo6dGltZXJGaXJlZChUaW1lcjxGdWxsc2NyZWVuVmlkZW9D
b250cm9sbGVyPiopCit7CisgICAgLy8gVXBkYXRlIHRoZSB0aW1lIHNsaWRlcgorICAgIG1fdGlt
ZVNsaWRlci5zZXRWYWx1ZShjdXJyZW50VGltZSgpIC8gZHVyYXRpb24oKSk7CisgICAgZHJhdygp
OworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6Om9uTW91c2VEb3duKEludFBv
aW50IHBvaW50KQoreworICAgIHBvaW50ID0gZnVsbFNjcmVlblRvSFVEQ29vcmRpbmF0ZXMocG9p
bnQpOworCisgICAgLy8gRG9uJ3QgYm90aGVyIGhpdCB0ZXN0aW5nIGlmIHdlJ3JlIG91dHNpZGUg
dGhlIGJvdW5kcyBvZiB0aGUgd2luZG93CisgICAgaWYgKHBvaW50LngoKSA8IDAgfHwgcG9pbnQu
eCgpID49IHdpbmRvd1dpZHRoIHx8IHBvaW50LnkoKSA8IDAgfHwgcG9pbnQueSgpID49IHdpbmRv
d0hlaWdodCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9oaXRXaWRnZXQgPSAwOworICAgIG1f
bW92aW5nV2luZG93ID0gZmFsc2U7CisKKyAgICBpZiAobV9wbGF5UGF1c2VCdXR0b24uaGl0VGVz
dChwb2ludCkpCisgICAgICAgIG1faGl0V2lkZ2V0ID0gJm1fcGxheVBhdXNlQnV0dG9uOworICAg
IGVsc2UgaWYgKG1fZXhpdEZ1bGxzY3JlZW5CdXR0b24uaGl0VGVzdChwb2ludCkpCisgICAgICAg
IG1faGl0V2lkZ2V0ID0gJm1fZXhpdEZ1bGxzY3JlZW5CdXR0b247CisgICAgZWxzZSBpZiAobV92
b2x1bWVVcEJ1dHRvbi5oaXRUZXN0KHBvaW50KSkKKyAgICAgICAgbV9oaXRXaWRnZXQgPSAmbV92
b2x1bWVVcEJ1dHRvbjsKKyAgICBlbHNlIGlmIChtX3ZvbHVtZURvd25CdXR0b24uaGl0VGVzdChw
b2ludCkpCisgICAgICAgIG1faGl0V2lkZ2V0ID0gJm1fdm9sdW1lRG93bkJ1dHRvbjsKKyAgICBl
bHNlIGlmIChtX3ZvbHVtZVNsaWRlci5oaXRUZXN0KHBvaW50KSkgeworICAgICAgICBtX2hpdFdp
ZGdldCA9ICZtX3ZvbHVtZVNsaWRlcjsKKyAgICAgICAgbV92b2x1bWVTbGlkZXIuZHJhZyhwb2lu
dCwgdHJ1ZSk7CisgICAgICAgIHNldFZvbHVtZShtX3ZvbHVtZVNsaWRlci52YWx1ZSgpKTsKKyAg
ICB9IGVsc2UgaWYgKG1fdGltZVNsaWRlci5oaXRUZXN0KHBvaW50KSkgeworICAgICAgICBtX2hp
dFdpZGdldCA9ICZtX3RpbWVTbGlkZXI7CisgICAgICAgIG1fdGltZVNsaWRlci5kcmFnKHBvaW50
LCB0cnVlKTsKKyAgICAgICAgYmVnaW5TY3J1YmJpbmcoKTsKKyAgICAgICAgc2V0Q3VycmVudFRp
bWUobV90aW1lU2xpZGVyLnZhbHVlKCkgKiBkdXJhdGlvbigpKTsKKyAgICB9CisKKyAgICAvLyBJ
ZiB3ZSBkaWQgbm90IHBpY2sgYW55IG9mIG91ciB3aWRnZXRzIHdlIGFyZSBzdGFydGluZyBhIHdp
bmRvdyBtb3ZlCisgICAgaWYgKCFtX2hpdFdpZGdldCkgeworICAgICAgICBtX21vdmVPZmZzZXQg
PSBwb2ludDsKKyAgICAgICAgbV9tb3ZpbmdXaW5kb3cgPSB0cnVlOworICAgIH0KKworICAgIGRy
YXcoKTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpvbk1vdXNlTW92ZShJ
bnRQb2ludCBwb2ludCkKK3sKKyAgICBwb2ludCA9IGZ1bGxTY3JlZW5Ub0hVRENvb3JkaW5hdGVz
KHBvaW50KTsKKworICAgIGlmIChtX2hpdFdpZGdldCkgeworICAgICAgICBtX2hpdFdpZGdldC0+
ZHJhZyhwb2ludCwgZmFsc2UpOworICAgICAgICBpZiAobV9oaXRXaWRnZXQgPT0gJm1fdm9sdW1l
U2xpZGVyKQorICAgICAgICAgICAgc2V0Vm9sdW1lKG1fdm9sdW1lU2xpZGVyLnZhbHVlKCkpOwor
ICAgICAgICBlbHNlIGlmIChtX2hpdFdpZGdldCA9PSAmbV90aW1lU2xpZGVyKQorICAgICAgICAg
ICAgc2V0Q3VycmVudFRpbWUobV90aW1lU2xpZGVyLnZhbHVlKCkgKiBkdXJhdGlvbigpKTsKKyAg
ICAgICAgZHJhdygpOworICAgIH0gZWxzZSBpZiAobV9tb3ZpbmdXaW5kb3cpCisgICAgICAgIG1f
aHVkUG9zaXRpb24ubW92ZShwb2ludC54KCkgLSBtX21vdmVPZmZzZXQueCgpLCBwb2ludC55KCkg
LSBtX21vdmVPZmZzZXQueSgpKTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVy
Ojpvbk1vdXNlVXAoSW50UG9pbnQgcG9pbnQpCit7CisgICAgcG9pbnQgPSBmdWxsU2NyZWVuVG9I
VURDb29yZGluYXRlcyhwb2ludCk7CisgICAgbV9tb3ZpbmdXaW5kb3cgPSBmYWxzZTsKKworICAg
IGlmIChtX2hpdFdpZGdldCkgeworICAgICAgICBpZiAobV9oaXRXaWRnZXQgPT0gJm1fcGxheVBh
dXNlQnV0dG9uICYmIG1fcGxheVBhdXNlQnV0dG9uLmhpdFRlc3QocG9pbnQpKQorICAgICAgICAg
ICAgdG9nZ2xlUGxheSgpOworICAgICAgICBlbHNlIGlmIChtX2hpdFdpZGdldCA9PSAmbV92b2x1
bWVVcEJ1dHRvbiAmJiBtX3ZvbHVtZVVwQnV0dG9uLmhpdFRlc3QocG9pbnQpKSB7CisgICAgICAg
ICAgICBzZXRWb2x1bWUoMSk7CisgICAgICAgICAgICBtX3ZvbHVtZVNsaWRlci5zZXRWYWx1ZSgx
KTsKKyAgICAgICAgfSBlbHNlIGlmIChtX2hpdFdpZGdldCA9PSAmbV92b2x1bWVEb3duQnV0dG9u
ICYmIG1fdm9sdW1lRG93bkJ1dHRvbi5oaXRUZXN0KHBvaW50KSkgeworICAgICAgICAgICAgc2V0
Vm9sdW1lKDApOworICAgICAgICAgICAgbV92b2x1bWVTbGlkZXIuc2V0VmFsdWUoMCk7CisgICAg
ICAgIH0gZWxzZSBpZiAobV9oaXRXaWRnZXQgPT0gJm1fdGltZVNsaWRlcikKKyAgICAgICAgICAg
IGVuZFNjcnViYmluZygpOworICAgICAgICBlbHNlIGlmIChtX2hpdFdpZGdldCA9PSAmbV9leGl0
RnVsbHNjcmVlbkJ1dHRvbiAmJiBtX2V4aXRGdWxsc2NyZWVuQnV0dG9uLmhpdFRlc3QocG9pbnQp
KSB7CisgICAgICAgICAgICBpZiAobV9tZWRpYUVsZW1lbnQpCisgICAgICAgICAgICAgICAgbV9t
ZWRpYUVsZW1lbnQtPmV4aXRGdWxsc2NyZWVuKCk7CisgICAgICAgICAgICBtX2hpdFdpZGdldCA9
IDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2hpdFdp
ZGdldCA9IDA7CisgICAgZHJhdygpOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xs
ZXI6OnRvZ2dsZVBsYXkoKQoreworICAgIGlmIChjYW5QbGF5KCkpCisgICAgICAgIHBsYXkoKTsK
KyAgICBlbHNlCisgICAgICAgIHBhdXNlKCk7CisKKyAgICBtX3BsYXlQYXVzZUJ1dHRvbi5zZXRT
aG93QWx0QnV0dG9uKCFjYW5QbGF5KCkpOworCisgICAgLy8gUnVuIGEgdGltZXIgd2hpbGUgdGhl
IHZpZGVvIGlzIHBsYXlpbmcgc28gd2UgY2FuIGtlZXAgdGhlIHRpbWUKKyAgICAvLyBzbGlkZXIg
YW5kIHRpbWUgdmFsdWVzIHVwIHRvIGRhdGUuCisgICAgaWYgKCFjYW5QbGF5KCkpCisgICAgICAg
IG1fdGltZXIuc3RhcnRSZXBlYXRpbmcodGltZXJJbnRlcnZhbCk7CisgICAgZWxzZQorICAgICAg
ICBtX3RpbWVyLnN0b3AoKTsKKworICAgIGRyYXcoKTsKK30KKworI2VuZGlmCkluZGV4OiBXZWJL
aXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
d2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIuaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC93
aW4vRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE3
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZm5kZWYgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcl9oCisjZGVm
aW5lIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXJfaAorCisjaWYgRU5BQkxFKFZJREVPKQorCisj
aW5jbHVkZSAiUVRNb3ZpZVdpbi5oIgorCisjaW5jbHVkZSA8V2ViQ29yZS9IVE1MTWVkaWFFbGVt
ZW50Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbWFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvSW50
UG9pbnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ludFNpemUuaD4KKyNpbmNsdWRlIDx3dGYvUmVm
UHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK30K
KworY2xhc3MgSFVEV2lkZ2V0IHsKK3B1YmxpYzoKKyAgICBIVURXaWRnZXQoY29uc3QgV2ViQ29y
ZTo6SW50UmVjdCYgcmVjdCkgOiBtX3JlY3QocmVjdCkgeyB9CisgICAgCisgICAgdmlydHVhbCB+
SFVEV2lkZ2V0KCkgeyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZHJhdyhXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQmKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRyYWcoV2ViQ29yZTo6SW50UG9pbnQs
IGJvb2wgc3RhcnQpID0gMDsKKyAgICBib29sIGhpdFRlc3QoV2ViQ29yZTo6SW50UG9pbnQgcG9p
bnQpIGNvbnN0IHsgcmV0dXJuIHBvaW50LngoKSA+PSBtX3JlY3QueCgpICYmIHBvaW50LngoKSA8
IG1fcmVjdC54KCkgKyBtX3JlY3Qud2lkdGgoKSAmJiBwb2ludC55KCkgPj0gbV9yZWN0LnkoKSAm
JiBwb2ludC55KCkgPCBtX3JlY3QueSgpICsgbV9yZWN0LmhlaWdodCgpOyB9CisKK3Byb3RlY3Rl
ZDoKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1fcmVjdDsKK307CisKK2NsYXNzIEhVREJ1dHRvbiA6
IHB1YmxpYyBIVURXaWRnZXQgeworcHVibGljOgorICAgIGVudW0gSFVEQnV0dG9uVHlwZSB7Cisg
ICAgICAgIE5vQnV0dG9uLAorICAgICAgICBQbGF5UGF1c2VCdXR0b24sCisgICAgICAgIFRpbWVT
bGlkZXJCdXR0b24sCisgICAgICAgIFZvbHVtZVVwQnV0dG9uLAorICAgICAgICBWb2x1bWVTbGlk
ZXJCdXR0b24sCisgICAgICAgIFZvbHVtZURvd25CdXR0b24sCisgICAgICAgIEV4aXRGdWxsc2Ny
ZWVuQnV0dG9uCisgICAgfTsKKworICAgIEhVREJ1dHRvbihIVURCdXR0b25UeXBlLCBjb25zdCBX
ZWJDb3JlOjpJbnRQb2ludCYpOworICAgIH5IVURCdXR0b24oKSB7IH0KKworICAgIHZpcnR1YWwg
dm9pZCBkcmF3KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCYpOworICAgIHZpcnR1YWwgdm9pZCBk
cmFnKFdlYkNvcmU6OkludFBvaW50LCBib29sIHN0YXJ0KSB7IH0KKyAgICB2b2lkIHNldFNob3dB
bHRCdXR0b24oYm9vbCBiKSAgeyBtX3Nob3dBbHRCdXR0b24gPSBiOyB9CisKK3ByaXZhdGU6Cisg
ICAgUmVmUHRyPFdlYkNvcmU6OkltYWdlPiBtX2J1dHRvbkltYWdlOworICAgIFJlZlB0cjxXZWJD
b3JlOjpJbWFnZT4gbV9idXR0b25JbWFnZUFsdDsKKyAgICBIVURCdXR0b25UeXBlIG1fdHlwZTsK
KyAgICBib29sIG1fc2hvd0FsdEJ1dHRvbjsKK307CisKK2NsYXNzIEhVRFNsaWRlciA6IHB1Ymxp
YyBIVURXaWRnZXQgeworcHVibGljOgorICAgIGVudW0gSFVEU2xpZGVyQnV0dG9uU2hhcGUgeyBS
b3VuZEJ1dHRvbiwgRGlhbW9uZEJ1dHRvbiB9OworCisgICAgSFVEU2xpZGVyKEhVRFNsaWRlckJ1
dHRvblNoYXBlLCBpbnQgYnV0dG9uU2l6ZSwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCk7
CisgICAgfkhVRFNsaWRlcigpIHsgfQorCisgICAgdmlydHVhbCB2b2lkIGRyYXcoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0Jik7CisgICAgdmlydHVhbCB2b2lkIGRyYWcoV2ViQ29yZTo6SW50UG9p
bnQsIGJvb2wgc3RhcnQpOworICAgIGZsb2F0IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KG1fYnV0dG9uUG9zaXRpb24pIC8gKG1fcmVjdC53aWR0aCgpIC0gbV9idXR0
b25TaXplKTsgfQorICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsgbV9idXR0b25Qb3Np
dGlvbiA9IHN0YXRpY19jYXN0PGludD4odmFsdWUgKiAobV9yZWN0LndpZHRoKCkgLSBtX2J1dHRv
blNpemUpKTsgfQorCitwcml2YXRlOgorICAgIEhVRFNsaWRlckJ1dHRvblNoYXBlIG1fYnV0dG9u
U2hhcGU7CisgICAgaW50IG1fYnV0dG9uU2l6ZTsKKyAgICBpbnQgbV9idXR0b25Qb3NpdGlvbjsK
KyAgICBpbnQgbV9kcmFnU3RhcnRPZmZzZXQ7Cit9OworCitjbGFzcyBGdWxsc2NyZWVuVmlkZW9D
b250cm9sbGVyIDogUVRNb3ZpZVdpbkZ1bGxzY3JlZW5DbGllbnQsIHB1YmxpYyBOb25jb3B5YWJs
ZSB7CitwdWJsaWM6CisgICAgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcigpOworICAgIHZpcnR1
YWwgfkZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIoKTsKKworICAgIHZvaWQgc2V0TWVkaWFFbGVt
ZW50KFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQqKTsKKyAgICBXZWJDb3JlOjpIVE1MTWVkaWFF
bGVtZW50KiBtZWRpYUVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX21lZGlhRWxlbWVudC5nZXQo
KTsgfQorCisgICAgdm9pZCBlbnRlckZ1bGxzY3JlZW4oKTsKKyAgICB2b2lkIGV4aXRGdWxsc2Ny
ZWVuKCk7CisKK3ByaXZhdGU6CisgICAgLy8gUVRNb3ZpZVdpbkZ1bGxzY3JlZW5DbGllbnQKKyAg
ICB2aXJ0dWFsIExSRVNVTFQgZnVsbHNjcmVlbkNsaWVudFduZFByb2MoSFdORCwgVUlOVCBtZXNz
YWdlLCBXUEFSQU0sIExQQVJBTSk7CisKKyAgICB2b2lkIGVuc3VyZVdpbmRvdygpOworICAgIFFU
TW92aWVXaW4qIG1vdmllKCkgY29uc3Q7CisKKyAgICBib29sIGNhblBsYXkoKSBjb25zdDsKKyAg
ICB2b2lkIHBsYXkoKTsKKyAgICB2b2lkIHBhdXNlKCk7CisgICAgZmxvYXQgdm9sdW1lKCkgY29u
c3Q7CisgICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQpOworICAgIGZsb2F0IGN1cnJlbnRUaW1lKCkg
Y29uc3Q7CisgICAgdm9pZCBzZXRDdXJyZW50VGltZShmbG9hdCk7CisgICAgZmxvYXQgZHVyYXRp
b24oKSBjb25zdDsKKyAgICB2b2lkIGJlZ2luU2NydWJiaW5nKCk7CisgICAgdm9pZCBlbmRTY3J1
YmJpbmcoKTsKKworICAgIFdlYkNvcmU6OkludFBvaW50IGZ1bGxTY3JlZW5Ub0hVRENvb3JkaW5h
dGVzKFdlYkNvcmU6OkludFBvaW50IHBvaW50KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IFdlYkNvcmU6OkludFBvaW50KHBvaW50LngoKS0gbV9odWRQb3NpdGlvbi54KCksIHBvaW50Lnko
KSAtIG1faHVkUG9zaXRpb24ueSgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCByZWdpc3Rl
ckhVRFdpbmRvd0NsYXNzKCk7CisgICAgc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgaHVkV25kUHJv
YyhIV05ELCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSwgTFBBUkFNKTsKKyAgICB2b2lkIGNyZWF0ZUhV
RFdpbmRvdygpOworICAgIHZvaWQgdGltZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxGdWxsc2NyZWVu
VmlkZW9Db250cm9sbGVyPiopOworCisgICAgdm9pZCB0b2dnbGVQbGF5KCk7CisgICAgdm9pZCBk
cmF3KCk7CisKKyAgICB2b2lkIG9uQ2hhcihpbnQgYyk7CisgICAgdm9pZCBvbk1vdXNlRG93bihX
ZWJDb3JlOjpJbnRQb2ludCk7CisgICAgdm9pZCBvbk1vdXNlTW92ZShXZWJDb3JlOjpJbnRQb2lu
dCk7CisgICAgdm9pZCBvbk1vdXNlVXAoV2ViQ29yZTo6SW50UG9pbnQpOworCisgICAgUmVmUHRy
PFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ+IG1fbWVkaWFFbGVtZW50OworCisgICAgSFdORCBt
X2h1ZFdpbmRvdywgbV92aWRlb1dpbmRvdzsKKyAgICBPd25QdHI8SEJJVE1BUD4gbV9iaXRtYXA7
CisgICAgV2ViQ29yZTo6SW50U2l6ZSBtX2Z1bGxzY3JlZW5TaXplOworICAgIFdlYkNvcmU6Oklu
dFBvaW50IG1faHVkUG9zaXRpb247CisKKyAgICBIVURCdXR0b24gbV9wbGF5UGF1c2VCdXR0b247
CisgICAgSFVEQnV0dG9uIG1fdGltZVNsaWRlckJ1dHRvbjsKKyAgICBIVURCdXR0b24gbV92b2x1
bWVVcEJ1dHRvbjsKKyAgICBIVURCdXR0b24gbV92b2x1bWVTbGlkZXJCdXR0b247CisgICAgSFVE
QnV0dG9uIG1fdm9sdW1lRG93bkJ1dHRvbjsKKyAgICBIVURCdXR0b24gbV9leGl0RnVsbHNjcmVl
bkJ1dHRvbjsKKyAgICBIVURTbGlkZXIgbV92b2x1bWVTbGlkZXI7CisgICAgSFVEU2xpZGVyIG1f
dGltZVNsaWRlcjsKKworICAgIEhVRFdpZGdldCogbV9oaXRXaWRnZXQ7CisgICAgV2ViQ29yZTo6
SW50UG9pbnQgbV9tb3ZlT2Zmc2V0OworICAgIGJvb2wgbV9tb3ZpbmdXaW5kb3c7CisgICAgV2Vi
Q29yZTo6VGltZXI8RnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcj4gbV90aW1lcjsKK307CisKKyNl
bmRpZgorCisjZW5kaWYgLy8gRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcl9oCkluZGV4OiBXZWJL
aXQvd2luL1dlYktpdERMTC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJLaXRETEwu
Y3BwCShyZXZpc2lvbiA1Mjg1NCkKKysrIFdlYktpdC93aW4vV2ViS2l0RExMLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTc5LDYgKzE3OSwxNiBAQCBQYXNzUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1
ZmZlcj4gbG9hZFJlCiAgICAgICAgIGlkciA9IElEUl9aT09NX09VVF9DVVJTT1I7CiAgICAgZWxz
ZSBpZiAoIXN0cmNtcChuYW1lLCAidmVydGljYWxUZXh0Q3Vyc29yIikpCiAgICAgICAgIGlkciA9
IElEUl9WRVJUSUNBTF9URVhUX0NVUlNPUjsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJm
c1ZpZGVvQXVkaW9Wb2x1bWVIaWdoIikpCisgICAgICAgIGlkciA9IElEUl9GU19WSURFT19BVURJ
T19WT0xVTUVfSElHSDsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmc1ZpZGVvQXVkaW9W
b2x1bWVMb3ciKSkKKyAgICAgICAgaWRyID0gSURSX0ZTX1ZJREVPX0FVRElPX1ZPTFVNRV9MT1c7
CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZnNWaWRlb0V4aXRGdWxsc2NyZWVuIikpCisg
ICAgICAgIGlkciA9IElEUl9GU19WSURFT19FWElUX0ZVTExTQ1JFRU47CisgICAgZWxzZSBpZiAo
IXN0cmNtcChuYW1lLCAiZnNWaWRlb1BhdXNlIikpCisgICAgICAgIGlkciA9IElEUl9GU19WSURF
T19QQVVTRTsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmc1ZpZGVvUGxheSIpKQorICAg
ICAgICBpZHIgPSBJRFJfRlNfVklERU9fUExBWTsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiAw
OwogCkluZGV4OiBXZWJLaXQvd2luL1dlYlZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93
aW4vV2ViVmlldy5jcHAJKHJldmlzaW9uIDUyODU0KQorKysgV2ViS2l0L3dpbi9XZWJWaWV3LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjQsMTEgKzI0LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgIldlYktpdERMTC5oIgorCiAjaW5jbHVkZSAiV2ViVmlldy5oIgog
CiAjaW5jbHVkZSAiQ0ZEaWN0aW9uYXJ5UHJvcGVydHlCYWcuaCIKICNpbmNsdWRlICJET01Db3Jl
Q2xhc3Nlcy5oIgorI2luY2x1ZGUgIkZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIuaCIKICNpbmNs
dWRlICJNYXJzaGFsbGluZ0hlbHBlcnMuaCIKICNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgogI2lu
Y2x1ZGUgIldlYkJhY2tGb3J3YXJkTGlzdC5oIgpAQCAtNDYsNiArNDcsNyBAQAogI2luY2x1ZGUg
IldlYkluc3BlY3Rvci5oIgogI2luY2x1ZGUgIldlYkluc3BlY3RvckNsaWVudC5oIgogI2luY2x1
ZGUgIldlYktpdC5oIgorI2luY2x1ZGUgIldlYktpdERMTC5oIgogI2luY2x1ZGUgIldlYktpdExv
Z2dpbmcuaCIKICNpbmNsdWRlICJXZWJLaXRTdGF0aXN0aWNzUHJpdmF0ZS5oIgogI2luY2x1ZGUg
IldlYktpdFN5c3RlbUJpdHMuaCIKQEAgLTU4LDE3ICs2MCwxNyBAQAogI2luY2x1ZGUgPEphdmFT
Y3JpcHRDb3JlL0luaXRpYWxpemVUaHJlYWRpbmcuaD4KICNpbmNsdWRlIDxKYXZhU2NyaXB0Q29y
ZS9KU0xvY2suaD4KICNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU1ZhbHVlLmg+Ci0jaW5jbHVk
ZSA8V2ViQ29yZS9BcHBsaWNhdGlvbkNhY2hlU3RvcmFnZS5oPgogI2luY2x1ZGUgPFdlYkNvcmUv
QVhPYmplY3RDYWNoZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvQXBwbGljYXRpb25DYWNoZVN0b3Jh
Z2UuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0JTdHJpbmcuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0Jh
Y2tGb3J3YXJkTGlzdC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvQml0bWFwSW5mby5oPgotI2luY2x1
ZGUgPFdlYkNvcmUvQlN0cmluZy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvQ1N0cmluZy5oPgogI2lu
Y2x1ZGUgPFdlYkNvcmUvQ2FjaGUuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0Nocm9tZS5oPgogI2lu
Y2x1ZGUgPFdlYkNvcmUvQ29udGV4dE1lbnUuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0NvbnRleHRN
ZW51Q29udHJvbGxlci5oPgogI2luY2x1ZGUgPFdlYkNvcmUvQ29va2llU3RvcmFnZVdpbi5oPgot
I2luY2x1ZGUgPFdlYkNvcmUvQ1N0cmluZy5oPgogI2luY2x1ZGUgPFdlYkNvcmUvQ3Vyc29yLmg+
CiAjaW5jbHVkZSA8V2ViQ29yZS9Eb2N1bWVudC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0Nv
bnRyb2xsZXIuaD4KQEAgLTc3LDE0ICs3OSwxNiBAQAogI2luY2x1ZGUgPFdlYkNvcmUvRXZlbnRI
YW5kbGVyLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9FdmVudE5hbWVzLmg+CiAjaW5jbHVkZSA8V2Vi
Q29yZS9GaWxlU3lzdGVtLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9Gb2N1c0NvbnRyb2xsZXIuaD4K
ICNpbmNsdWRlIDxXZWJDb3JlL0Zsb2F0UXVhZC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRm9jdXND
b250cm9sbGVyLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZUxvYWRlci5oPgogI2luY2x1ZGUg
PFdlYkNvcmUvRnJhbWVUcmVlLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZVZpZXcuaD4KICNp
bmNsdWRlIDxXZWJDb3JlL0ZyYW1lV2luLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9HRElPYmplY3RD
b3VudGVyLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRleHQuaD4KKyNpbmNsdWRl
IDxXZWJDb3JlL0hUTUxNZWRpYUVsZW1lbnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0hUTUxOYW1l
cy5oPgogI2luY2x1ZGUgPFdlYkNvcmUvSGlzdG9yeUl0ZW0uaD4KICNpbmNsdWRlIDxXZWJDb3Jl
L0hpdFRlc3RSZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9IaXRUZXN0UmVzdWx0Lmg+CkBA
IC0xMzMsMTMgKzEzNywxMyBAQAogI2luY2x1ZGUgPFdlYktpdFN5c3RlbUludGVyZmFjZS9XZWJL
aXRTeXN0ZW1JbnRlcmZhY2UuaD4gCiAjZW5kaWYKIAotI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+
CisjaW5jbHVkZSA8U2hsT2JqLmg+CiAjaW5jbHVkZSA8Y29tdXRpbC5oPgogI2luY2x1ZGUgPGRp
bW0uaD4KICNpbmNsdWRlIDxvbGVhY2MuaD4KLSNpbmNsdWRlIDxTaGxPYmouaD4KICNpbmNsdWRl
IDx0Y2hhci5oPgogI2luY2x1ZGUgPHdpbmRvd3N4Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQu
aD4KIAogLy8gU29mdCBsaW5rIGZ1bmN0aW9ucyBmb3IgZ2VzdHVyZXMgYW5kIHBhbm5pbmcgZmVl
ZGJhY2sKIFNPRlRfTElOS19MSUJSQVJZKFVTRVIzMik7CkBAIC01NjU2LDYgKzU2NjAsNDAgQEAg
c3RhdGljIEtVUkwgdG9LVVJMKEJTVFIgYnN0cikKICAgICByZXR1cm4gS1VSTChLVVJMKCksIHRv
U3RyaW5nKGJzdHIpKTsKIH0KIAordm9pZCBXZWJWaWV3OjplbnRlckZ1bGxzY3JlZW5Gb3JOb2Rl
KE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6dmlk
ZW9UYWcpKQorICAgICAgICByZXR1cm47CisKKyAgICBIVE1MTWVkaWFFbGVtZW50KiB2aWRlb0Vs
ZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obm9kZSk7CisKKyAgICBpZiAo
bV9mdWxsc2NyZWVuQ29udHJvbGxlcikgeworICAgICAgICBpZiAobV9mdWxsc2NyZWVuQ29udHJv
bGxlci0+bWVkaWFFbGVtZW50KCkgPT0gdmlkZW9FbGVtZW50KSB7CisgICAgICAgICAgICAvLyBU
aGUgYmFja2VuZCBtYXkganVzdCB3YXJuIHVzIHRoYXQgdGhlIHVuZGVybGF5aW5nIHBsYWZ0b3Jt
TW92aWUoKQorICAgICAgICAgICAgLy8gaGFzIGNoYW5nZWQuIEp1c3QgZm9yY2UgYW4gdXBkYXRl
LgorICAgICAgICAgICAgbV9mdWxsc2NyZWVuQ29udHJvbGxlci0+c2V0TWVkaWFFbGVtZW50KHZp
ZGVvRWxlbWVudCk7CisgICAgICAgICAgICByZXR1cm47IC8vIE5vIG1vcmUgdG8gZG8uCisgICAg
ICAgIH0KKworICAgICAgICAvLyBGaXJzdCBleGl0IEZ1bGxzY3JlZW4gZm9yIHRoZSBvbGQgbWVk
aWFFbGVtZW50LgorICAgICAgICBtX2Z1bGxzY3JlZW5Db250cm9sbGVyLT5tZWRpYUVsZW1lbnQo
KS0+ZXhpdEZ1bGxzY3JlZW4oKTsKKyAgICAgICAgLy8gVGhpcyBwcmV2aW91cyBjYWxsIGhhcyB0
byB0cmlnZ2VyIGV4aXRGdWxsc2NyZWVuLAorICAgICAgICAvLyB3aGljaCBoYXMgdG8gY2xlYXIg
bV9mdWxsc2NyZWVuQ29udHJvbGxlci4KKyAgICAgICAgQVNTRVJUKCFtX2Z1bGxzY3JlZW5Db250
cm9sbGVyKTsKKyAgICB9CisKKyAgICBtX2Z1bGxzY3JlZW5Db250cm9sbGVyID0gbmV3IEZ1bGxz
Y3JlZW5WaWRlb0NvbnRyb2xsZXI7CisgICAgbV9mdWxsc2NyZWVuQ29udHJvbGxlci0+c2V0TWVk
aWFFbGVtZW50KHZpZGVvRWxlbWVudCk7CisgICAgbV9mdWxsc2NyZWVuQ29udHJvbGxlci0+ZW50
ZXJGdWxsc2NyZWVuKCk7ICAgICAgICAKK30KKwordm9pZCBXZWJWaWV3OjpleGl0RnVsbHNjcmVl
bigpCit7CisgICAgaWYgKG1fZnVsbHNjcmVlbkNvbnRyb2xsZXIpCisgICAgICAgIG1fZnVsbHNj
cmVlbkNvbnRyb2xsZXItPmV4aXRGdWxsc2NyZWVuKCk7CisgICAgbV9mdWxsc2NyZWVuQ29udHJv
bGxlciA9IDA7Cit9CisKIHN0YXRpYyBQYXNzT3duUHRyPFZlY3RvcjxTdHJpbmc+ID4gdG9TdHJp
bmdWZWN0b3IodW5zaWduZWQgcGF0dGVybnNDb3VudCwgQlNUUiogcGF0dGVybnMpCiB7CiAgICAg
Ly8gQ29udmVydCB0aGUgcGF0dGVybnMgaW50byBhIFZlY3Rvci4KSW5kZXg6IFdlYktpdC93aW4v
V2ViVmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViVmlldy5oCShyZXZpc2lvbiA1
Mjg1NCkKKysrIFdlYktpdC93aW4vV2ViVmlldy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw4ICsz
OSw5IEBACiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvT3duUHRyLmg+
CiAKLWNsYXNzIFdlYkZyYW1lOworY2xhc3MgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjsKIGNs
YXNzIFdlYkJhY2tGb3J3YXJkTGlzdDsKK2NsYXNzIFdlYkZyYW1lOwogY2xhc3MgV2ViSW5zcGVj
dG9yOwogY2xhc3MgV2ViSW5zcGVjdG9yQ2xpZW50OwogCkBAIC04NjgsNiArODY5LDkgQEAgcHVi
bGljOgogICAgIHZvaWQgc2V0Um9vdENoaWxkTGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1MYXllciog
bGF5ZXIpOwogI2VuZGlmCiAKKyAgICB2b2lkIGVudGVyRnVsbHNjcmVlbkZvck5vZGUoV2ViQ29y
ZTo6Tm9kZSopOworICAgIHZvaWQgZXhpdEZ1bGxzY3JlZW4oKTsKKwogcHJpdmF0ZToKICAgICB2
b2lkIHNldFpvb21NdWx0aXBsaWVyKGZsb2F0IG11bHRpcGxpZXIsIGJvb2wgaXNUZXh0T25seSk7
CiAgICAgZmxvYXQgem9vbU11bHRpcGxpZXIoYm9vbCBpc1RleHRPbmx5KTsKQEAgLTk4NCw2ICs5
ODgsOCBAQCBwcm90ZWN0ZWQ6CiAgICAgbG9uZyBtX3hPdmVycGFuOwogICAgIGxvbmcgbV95T3Zl
cnBhbjsKIAorICAgIE93blB0cjxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyPiBtX2Z1bGxzY3Jl
ZW5Db250cm9sbGVyOworCiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogICAgIGJv
b2wgaXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkgY29uc3QgeyByZXR1cm4gbV9pc0FjY2VsZXJh
dGVkQ29tcG9zaXRpbmc7IH0KICAgICB2b2lkIHNldEFjY2VsZXJhdGVkQ29tcG9zaXRpbmcoYm9v
bCk7CkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQu
Y3BwCShyZXZpc2lvbiA1Mjg1NCkKKysrIFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hy
b21lQ2xpZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUg
PFdlYkNvcmUvRmxvYXRSZWN0Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZUxvYWRSZXF1ZXN0
Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZVZpZXcuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0hU
TUxOYW1lcy5oPgogI2luY2x1ZGUgPFdlYkNvcmUvTG9jYWxpemVkU3RyaW5ncy5oPgogI2luY2x1
ZGUgPFdlYkNvcmUvTm90SW1wbGVtZW50ZWQuaD4KICNpbmNsdWRlIDxXZWJDb3JlL1BhZ2UuaD4K
QEAgLTc3MywzICs3NzQsMjMgQEAgQ09NUHRyPElXZWJVSURlbGVnYXRlPiBXZWJDaHJvbWVDbGll
bnQ6OgogICAgIG1fd2ViVmlldy0+dWlEZWxlZ2F0ZSgmZGVsZWdhdGUpOwogICAgIHJldHVybiBk
ZWxlZ2F0ZTsKIH0KKworI2lmIEVOQUJMRShWSURFTykKKworYm9vbCBXZWJDaHJvbWVDbGllbnQ6
OnN1cHBvcnRzRnVsbHNjcmVlbkZvck5vZGUoY29uc3QgTm9kZSogbm9kZSkKK3sKKyAgICByZXR1
cm4gbm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnZpZGVvVGFnKTsKK30KKwordm9pZCBXZWJD
aHJvbWVDbGllbnQ6OmVudGVyRnVsbHNjcmVlbkZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBt
X3dlYlZpZXctPmVudGVyRnVsbHNjcmVlbkZvck5vZGUobm9kZSk7Cit9CisKK3ZvaWQgV2ViQ2hy
b21lQ2xpZW50OjpleGl0RnVsbHNjcmVlbkZvck5vZGUoTm9kZSopCit7CisgICAgbV93ZWJWaWV3
LT5leGl0RnVsbHNjcmVlbigpOworfQorCisjZW5kaWYKKwpJbmRleDogV2ViS2l0L3dpbi9XZWJD
b3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dl
YkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCShyZXZpc2lvbiA1Mjg1NCkKKysrIFdlYktp
dC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAg
LTE0Nyw2ICsxNDcsMTIgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RHZW9s
b2NhdGlvblBlcm1pc3Npb25Gb3JGcmFtZShXZWJDb3JlOjpGcmFtZSosIFdlYkNvcmU6Okdlb2xv
Y2F0aW9uKik7CiAKKyNpZiBFTkFCTEUoVklERU8pCisgICAgdmlydHVhbCBib29sIHN1cHBvcnRz
RnVsbHNjcmVlbkZvck5vZGUoY29uc3QgV2ViQ29yZTo6Tm9kZSopOworICAgIHZpcnR1YWwgdm9p
ZCBlbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZXhpdEZ1bGxzY3JlZW5Gb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyNlbmRpZgorCiAjaWYg
RU5BQkxFKE5PVElGSUNBVElPTlMpCiAgICAgdmlydHVhbCBXZWJDb3JlOjpOb3RpZmljYXRpb25Q
cmVzZW50ZXIqIG5vdGlmaWNhdGlvblByZXNlbnRlcigpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJw
cmV0X2Nhc3Q8V2ViQ29yZTo6Tm90aWZpY2F0aW9uUHJlc2VudGVyKj4obV9ub3RpZmljYXRpb25z
RGVsZWdhdGUuZ2V0KCkpOyB9CiAjZW5kaWYKSW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJv
ai9XZWJLaXQudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9X
ZWJLaXQudmNwcm9qCShyZXZpc2lvbiA1Mjg1NCkKKysrIFdlYktpdC93aW4vV2ViS2l0LnZjcHJv
ai9XZWJLaXQudmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC01ODIsNiArNTgyLDEwIEBACiAJCQkJ
Pg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXEZ1bGxzY3Jl
ZW5WaWRlb0NvbnRyb2xsZXIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJ
CQlSZWxhdGl2ZVBhdGg9Ii4uXE1hcnNoYWxsaW5nSGVscGVycy5oIg0KIAkJCQk+DQogCQkJPC9G
aWxlPg0KQEAgLTg5NCw2ICs4OTgsMTAgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxl
DQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlci5jcHAiDQor
CQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxNZW1v
cnlTdHJlYW0uY3BwIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KSW5kZXg6IFdlYktpdC93aW4vV2Vi
S2l0LnZjcHJvai9mc1ZpZGVvQXVkaW9Wb2x1bWVIaWdoLnBuZwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkNhbm5vdCBk
aXNwbGF5OiBmaWxlIG1hcmtlZCBhcyBhIGJpbmFyeSB0eXBlLgpzdm46bWltZS10eXBlID0gYXBw
bGljYXRpb24vb2N0ZXQtc3RyZWFtCgppVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNB
WUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBdUpBQUFMaVFFM3ljdXRBQUFLClQybERRMUJRYUc5MGIz
Tm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZK
Q2k0QVUKa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFL
T2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWApQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVD
RHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCCmVOTUxDQURBVFp2
QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RM
WTJMakFGQXQKQUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BG
QUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDMwpBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJ
SXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYCkxoNG96a2tY
S3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2
cjhHL3lKaVl1UCsKNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxa
cklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYawo1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMr
WDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkCjB5TEVT
V0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1Ukxh
aGRZd1AyU3ljUVdIVEEKNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NR
QUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QQpCaHpCQmR6QkMveGdOb1JDSk1UQ1Fo
QkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoCkNK
N0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVn
eFVvcFVJRlZJSGZJOWNnSTUKaDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29S
R29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84KwpROGN3d09nWUJ6UEViREF1eHNO
Q3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhN
CldFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhU
THhCN2lFUEVOeVFTaVVNeUo3bVEKQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5
QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJbwpVc3BxU2hubEVPVTA1UVps
bURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hh
UGRwCnIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNH
SytZVEtZWjA0c1p4MVF3TnpIcm1PZVoKRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFw
cXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYgpVMmVwTzZpSHFtZW9i
MVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJY
eDJLcnVZCi9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNo
VHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXIKU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngw
b25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dQpwKzZZbnI1ZWdK
NU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZG
RFhjTkFRNlZoCmxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVw
TjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazEKbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFp
MnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsTwprMDZybnRa
bnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZa
RHFzZFdoMStjN1J5CkZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9i
MDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0kKdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJv
MjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQgpaN1hu
SXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZu
bCtGMzBOL0kvOWsvM3IvCjBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJq
S0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXAKRG9WUWZ1alcwQWRoNW1HTHczNE1K
NFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cQpQ
Tm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlG
MXdlYUhPd3ZTRnB4YXBMaElzCk9wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklp
L1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzUKaENlcGtMeE1EVXpkbXpxZUZw
cDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdP
UQpyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8v
dEVzSVM0WksycFlaTFZ5MGRXT2E5CnJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2
dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWQKVDFndldkKzFZZnFHblJz
K0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFx
bCthWApEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNr
VlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3CnZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRK
KzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1MKUFZSU2o5WXI2MGNP
eHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RM
MnBDbXZLYQpScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRr
MmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPCjMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRk
UEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjEKZTJiMzZSdWVO
ODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlF
RHRRZGxEM1lmVgpQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZ
YnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpCi9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1
Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjgKSUg4by8y
ajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dB
QWdPa0FBSFV3QUFEcQpZQUFBT3BnQUFCZHZrbC9GUmdBQUFQMUpSRUZVZU5xOGs5Rk53MEFRUkdl
ai9Ec2QyRlFBSFRnZDJGVGdkQUFkVUVMb3dDV1lEcHhVCmtIVGdVQUYwOFBLUlBXbGxiQWNKaWYz
YW03dWQyNXZaTTBEL0VrQUw5RUFXc05uREdaQ1BzRWRnQUU2SkJOQnFxbGpTUVZJUnlIcGYKUC9t
eGo2V2JUOXlpREhqbldBV1VhUi9RR25nTEhIVzRKWFZUbTlrejBFbDZON01INENCcEora281cU1F
Y3VBTGFEeFArSXZyOFZPRApHR2IyS2VsVjBzN3ppNlN0cEhQU2FQVUxCd3N2bEtTTnBPKzR1Yjdq
ZmVZZGJGM1VqVHRVZXhlVHcwSjB3WjFKN3ZTT0RjQitjcEFDClNiUnhjREZ6RnhEUEY4YzJFalRl
UmVYRis4VlJEdS9YaUFTZ3Zmc1haZ2dyb0JsaHNyOSs1K3NBczQ0M0JVOTlYZUlBQUFBQVNVVk8K
Uks1Q1lJST0KCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRlb0F1ZGlvVm9s
dW1lTG93LnBuZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09CkNhbm5vdCBkaXNwbGF5OiBmaWxlIG1hcmtlZCBhcyBhIGJp
bmFyeSB0eXBlLgpzdm46bWltZS10eXBlID0gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCgppVkJP
UncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBdUpB
QUFMaVFFM3ljdXRBQUFLClQybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFu
Vk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVUKa1NZcUlRa1FTb2dob2RrVlVjRVJS
VVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWApQ
dWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9T
TUJBUGgrUER3cklzQUh2Z0FCCmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJ
QVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXQKQUdBbmYrYlRBSUNkK0psN0FR
QmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxD
MwpBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFC
NG1iSTh1U1E1UllGYkNDMXhCMWRYCkxoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3
QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCsKNWMrcmNFQUFBT0YwZnRI
K0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5a
MmVYawo1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3ow
VEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkCjB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtT
S2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEEKNHZjQUFQSzdiOEhV
S0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJH
L1RCR0N6QQpCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYx
RUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoCkNKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pq
Z2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTUKaDF4R3VwRTd5
QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9l
ZlFxMmdQMm84KwpROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0
bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNCldFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5
S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVEKQWtteHBG
VFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxz
S25XSkFjYVQ0VStJbwpVc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxL
dlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwCnIraDB1aEhkbFI1T2w5Qlgwc3ZwUitp
WDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVoKRDVs
dlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBq
cVFuVWxxdFZxcDFRNjFNYgpVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9q
dk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZCi9SMjdpejJxcWFFNVF6TktNMWV6
VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXIK
U0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5Q
VHIxcmk2cWE2VWJvYnRFZDc5dQpwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhE
RmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZoCmxXR1g0WVNSdWRFOG85Vkdq
VVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFw
azEKbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZW
cGRzMGF0bmEwbDFydXR1NmNScDdsTwprMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZX
Rm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5CkZEcFdPdDZhenB6dVAz
M0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBz
Ynh0M0kKdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1Q
SVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQgpaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1
eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvCjBRQ25nQ1VCWndP
SmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gz
NTVqT2tjNXAKRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56
MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cQpQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1
TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzCk9wWkFUSWhP
T0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhO
WGtreFRPbExPVzUKaENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJa
K3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUQpyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxW
MmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5CnJHbzVz
anh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3
dFZDdVdGZmV2YzErMWQKVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnly
K1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWApEbTROMmRxMERkOVd0TzMxOWtYYkw1
Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3CnZQ
WTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQ
U0EvMEhJdzYyMTduVTFSM1MKUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53Ukhu
azZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYQpScHRUbXZ0YllsdTZUOHcrMGRi
cTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBP
CjMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBU
VDhlN25MdWFycmxjYTdudWVyMjEKZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZG
OS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVgpQMXYrM05qdjNIOXF3SGVn
ODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVG
LzZpCi9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pN
VjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjgKSUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpM
ZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcQpZQUFBT3BnQUFCZHZr
bC9GUmdBQUFJeEpSRUZVZU5yVWsrRUp3akFVaEMvUy80NVFON0FieEExMEEwZm9DaDNGVFRwQ1hj
VUpQdjg4CjVCRjVLU1FnZUJDNEpIZVhoQ01KVUE4TzZrUjNnSURQQ1BidlFBNDl0UUF6MHhUZ3pB
QVpHSUZ6TllBWUdaaU5YNXNDN0dTQTFYdCsKVnlNd0duMzY5YUhRTFk3ZkpFMXVmcEwwS0RUVkZv
N0F0bGRqK0lTVTBrdlNwYnp5bCs3L1A5TjdBR0dSOXB2QlhJKzVBQUFBQUVsRgpUa1N1UW1DQwoK
SW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9mc1ZpZGVvRXhpdEZ1bGxzY3JlZW4ucG5n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUu
CnN2bjptaW1lLXR5cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9SdzBLR2dvQUFB
QU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUF1SkFBQUxpUUUzeWN1
dEFBQUsKVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmoz
MzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFP
T2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1ZXM4NTJ6endm
QUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdy
SXNBSHZnQUIKZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0tt
QUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNS
QUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzCkFNRE9FQXV5
QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVS
WUZiQ0MxeEIxZFgKTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdn
L1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdC
b0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrCjVOaEt4
RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhH
TGM1bzlIL0xjTC8vd2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0
OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVLQWdEZ0dpRDRj
OTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBCkJo
ekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlh
VGNBNHV3bFc0RGoxd0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNG
SUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lBQXlndnlHdkVj
eGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1Aybzgr
ClE4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FT
Z1VYQUNUWUVkMElnWVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9S
K2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZUU0V0SkcwbTVT
SStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRV
K0lvClVzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFt
am5OZ3haSlM2V3RvcFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05o
aFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2VlZncXRpcDhG
WkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFw
MVE2MU1iClUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMz
Z3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1
aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpTS3RScTBmcnZU
YXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZV
Ym9idEVkNzl1CnArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRz
TXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9N
azQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMQptejB4MXpM
bm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBs
MXJ1dHU2Y1JwN2xPCmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1
dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMzRjlKYnBMMmRZ
enhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSQp2ZVJL
ZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9D
NStWTUd2ZnJINVBRMCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMz
akxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJad09KZ1VHQld3TDcr
SHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cApE
b1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNw
dG5NVTg1cnkxS05TbytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0
Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9PSlR3UVJBcXFC
YU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9X
NQpoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4
bGhiTCt4VzZMdHk4ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1ph
cm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNqeHhlZHNLNHhV
Rks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZj
MSsxZApUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZF
dVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pE
dWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZMDdOWGJXN3oz
L1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIx
N25VMVIzUwpQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VE
VHJhZG94N3JPRUgweDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZE
NXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8KMzJvUGIrKzZF
SFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJy
bGNhN251ZXIyMQplMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2Np
Zjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZ
UFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkKL3N1dUZ4
WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hm
Y2R4M3ZvOThQVCtSOApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBo
U1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmtsL0ZSZ0FBQUtk
SlJFRlVlTnFrazlFTndqQU1SSjhqL3NNSWpOQU55Z2hzZ05pRUVkaWczYVRkSU5rRW1PRDQKSUpW
S0JNaHQ3OGVTcmJ4STU3TkpZcE1rSmIyVkpNVlovK3dGekpVa1JVbWRwTUVMR0NySXZWUVhJQUFu
SU05Nit5VVdCRE43QWtmZwpzY2JEVU9wdDZjK1Rkc1h0QXpCV3Mrd0JtTVBrQ0RRL3h0bXpwVmJm
MVhuWDNQNTdIRllHdUpsU3V4b0FqSkxpRWtCZm1kWUFWeStnCk43TkxDZHlIODdiMW5GOERBTDE4
bDRoQjhEKy9BQUFBQUVsRlRrU3VRbUNDCgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9q
L2ZzVmlkZW9QYXVzZS5wbmcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJrZWQg
YXMgYSBiaW5hcnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVh
bQoKaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJrQUFBQVpDQVlBQUFERTZZVmpBQUFBQ1hCSVdY
TUFBQXVKQUFBTGlRRTN5Y3V0QUFBSwpUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJH
VUFBSGphblZOblZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVCmtTWXFJUWtRU29naG9k
a1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OSti
Ti9yWFgKUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFp
elpDRnovU01CQVBoK1BEd3JJc0FIdmdBQgplTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNC
MGtUaExDSUFVQUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0CkFHQW5mK2JUQUlD
ZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJK
VjJaSUFMQzMKQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1
RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWApMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtC
TkEvZzg4d0FBS0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArCjVjK3JjRUFB
QU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQ
RVdoa0xuWjJlWGsKNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhC
UGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZAoweUxFU1dLNVdDb1U0MUVTY1k1RW1venpN
cVVpaVVLU0tjVWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBCjR2Y0FB
UEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJL
Q0JLckJCRy9UQkdDekEKQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3pi
QWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waApDSjdCS0x5QkNRUkJ5QWdUWVNIYWlB
RmlpbGdqamdnWG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1Cmgx
eEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JR
YVBZdzJvZWZRcTJnUDJvOCsKUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhx
d1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTQpXRTdZU0tnZ0hDUTBFZG9KTndr
RGhGSENKeUtUcUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21R
CkFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBr
RytRaDhsc0tuV0pBY2FUNFUrSW8KVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlh
UXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcApyK2gwdWhIZGxSNU9sOUJY
MHN2cFIraVg2QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJt
T2VaCkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjly
a1pWTTFQanFRblVscXRWcXAxUTYxTWIKVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURw
Rkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WQovUjI3aXoycXFhRTVR
ek5LTTFlelV2T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFw
YVhsbGlyClNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNh
Y0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXUKcCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9X
MzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaApsV0dYNFlTUnVk
RThvOVZHalVZUGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgz
TXphTE4xcGsxCm16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZv
NVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE8KazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1
dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeQpGRHBXT3Q2
YXpwenVQMzNGOUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExM
THBjK0xwc2J4dDNJCnZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1l
V1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0IKWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRo
N3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLwowUUNu
Z0NVQlp3T0pnVUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95
T3lRclNIMzU1ak9rYzVwCkRvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hO
WGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXEKUE5vM3VqUzZQOFl1WmxuTTFWaWRX
RWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJcwpP
cFpBVEloT09KVHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRY
cVM3Skc4Tlhra3hUT2xMT1c1CmhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFx
b2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1EKckFWWkxRcTJRcWJvVkZvbzF5
b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09h
OQpyR281c2p4eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9M
QnRRRnI2d3RWQ3VXRmZldmMxKzFkClQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hq
bEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVgKRG00TjJkcTBEZDlXdE8z
MTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdS
N2h0Nwp2UFkwN05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFP
YlhIdHh3UFNBLzBISXc2MjE3blUxUjNTClBWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpH
NGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2EKUnB0VG12dGJZbHU2
VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJv
clo3NTJQTwozMm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3Fk
T284L3BQVFQ4ZTduTHVhcnJsY2E3bnVlcjIxCmUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2
Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlYKUDF2KzNOanYz
SDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4
OWt6eWFlRi82aQovc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3ho
Nit5WGd6TVY3MFZ2dnR3WGZjZHgzdm85OFBUK1I4CklIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1
anovR016TGRzQUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHEKWUFBQU9w
Z0FBQmR2a2wvRlJnQUFBRHRKUkVGVWVOcnN6U0VPQUNBUXhNQ0ZqOS9UaThjY0JvSm9mVE1CUWw5
bEM2aURMMEJtSGlRaQpJaUlpSWlJaThqY3lnT3ZJQWdBQS8vOERBSlJBVXR4NWRXTjlBQUFBQUVs
RlRrU3VRbUNDCgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9QbGF5LnBu
Zwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09CkNhbm5vdCBkaXNwbGF5OiBmaWxlIG1hcmtlZCBhcyBhIGJpbmFyeSB0eXBl
Lgpzdm46bWltZS10eXBlID0gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCgppVkJPUncwS0dnb0FB
QUFOU1VoRVVnQUFBQmtBQUFBWkNBWUFBQURFNllWakFBQUFDWEJJV1hNQUFBdUpBQUFMaVFFM3lj
dXRBQUFLClQybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZq
MzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVUKa1NZcUlRa1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lB
T09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1amE5YTg5K2JOL3JYWApQdWVzODUyenp3
ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3
cklzQUh2Z0FCCmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtL
bUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXQKQUdBbmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFD
UkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1QU5ndEFEQkpWMlpJQUxDMwpBTURPRUF1
eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1
UllGYkNDMXhCMWRYCkxoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhn
Zy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCsKNWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3
Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFWL053K0g0OFBFV2hrTG5aMmVYawo1TmhL
eEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpo
R0xjNW85SC9MY0wvL3dkCjB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0
dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEEKNHZjQUFQSzdiOEhVS0FnRGdHaUQ0
YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6L0hDQUFBUktDQktyQkJHL1RCR0N6QQpC
aHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJ
YVRjQTR1d2xXNERqMXdEL3BoCkNKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNElj
RklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTUKaDF4R3VwRTd5QUF5Z3Z5R3ZF
Y3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84
KwpROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdR
U2dVWEFDVFlFZDBJZ1lSNUJTRmhNCldFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJv
UitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVEKQWtteHBGVFNFdEpHMG01
U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhrbmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0
VStJbwpVc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIx
bWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwCnIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dO
aGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVoKRDVsdlZWZ3F0aXA4
RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExWSStwWGxOOXJrWlZNMVBqcVFuVWxxdFZx
cDFRNjFNYgpVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpz
M2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZCi9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0
NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXIKU0t0UnEwZnJ2
VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0JaM25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2
VWJvYnRFZDc5dQpwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0
c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZoCmxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hP
TWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazEKbXoweDF6
TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxudXRyeHVoVm81V2FWWVZWcGRzMGF0bmEw
bDFydXR1NmNScDdsTwprMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhX
dXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5CkZEcFdPdDZhenB6dVAzM0Y5SmJwTDJk
WXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0kKdmVS
S2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zjbjh3MG55bWVXVE56ME1QSVErQlI1ZEUv
QzUrVk1HdmZySDVQUTArQgpaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0encz
M2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvCjBRQ25nQ1VCWndPSmdVR0JXd0w3
K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXAK
RG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdpRmdhMFRHWE5YZlIzRU56MzBUNlJKWkUz
cHRuTVU4NXJ5MUtOU28rcWk1cQpQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2
dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzCk9wWkFUSWhPT0pUd1FSQXFx
QmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExP
VzUKaENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1ZT1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2
eGxoYkwreFc2THR5OGVsUWZKYTdPUQpyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09a
YXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5CnJHbzVzanh4ZWRzSzR4
VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2
YzErMWQKVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVjVmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2
RXVXVFBadEptNmViZUxaNWJEcGFxbCthWApEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3Zzda
RHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3CnZQWTA3TlhiVzd6
My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYy
MTduVTFSM1MKUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBOTmcxVmpaekc0aU53UkhuazZmY0ozL2Nl
RFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYQpScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNm
RDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPCjMyb1BiKys2
RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFy
cmxjYTdudWVyMjEKZTJiMzZSdWVOODdkOUwxNThSYi8xdFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStj
aWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVgpQMXYrM05qdjNIOXF3SGVnODlIY1IvY0do
WVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpCi9zdXVG
eFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdY
ZmNkeDN2bzk4UFQrUjgKSUg4by8yajVzZlZUMEtmN2t4bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kw
aFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFEcQpZQUFBT3BnQUFCZHZrbC9GUmdBQUFJ
VkpSRUZVZU5yVTFkRU5nQ0FNaE9IcUFvN29LSTdLQ0k3dysyUkVJZ1pvejhRYm9GOVM0REJnCkJ6
WmdNVUVBTTY1SXNCS1JZRFVreDFZMWNpWjVzRmJFaGZVaVE5Z28wb1Y1a1NZc0NubkZvcEZIVElY
Y01NQm0reUovVzVmMDRLVlgKV1BvWXBiVWlMVWhwMVNmbHB4VXl2SWFFRGk4UnlmQWNtUUI1ZFIw
QUFBRC8vd01BaTBDNy9Jb1BYU3NBQUFBQVNVVk9SSzVDWUlJPQoK
</data>
<flag name="review"
          id="28204"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46102</attachid>
            <date>2010-01-07 17:37:37 -0800</date>
            <delta_ts>2010-01-08 07:58:17 -0800</delta_ts>
            <desc>Another replacement patch</desc>
            <filename>31318.patch</filename>
            <type>text/plain</type>
            <size>71069</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1Mjk2MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMTAtMDEtMDggIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIElt
cGxlbWVudCBmdWxsLXNjcmVlbiB2aWRlbyBmb3IgV2luZG93cworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEzMTgKKyAgICAgICAgCisgICAgICAgIFRo
aXMgaXMgbW9zdGx5IHN1cHBvcnQgbG9naWMgZm9yIHRha2luZyB2aWRlbworICAgICAgICBpbnRv
IGFuZCBvdXQgb2YgZnVsbC1zY3JlZW4uIEl0IGFsc28gY29udGFpbnMgdGhlCisgICAgICAgIFFU
TW92aWVXaW4gcGllY2Ugd2hpY2ggYWRkcyBzdXBwb3J0IGZvciB0aGUgYWN0dWFsCisgICAgICAg
IGZ1bGwtc2NyZWVuIHdpbmRvdyBpdHNlbGYuIEV2ZW50cyBmcm9tIHRoZSB3aW5kb3cKKyAgICAg
ICAgYXJlIHNlbnQgdG8gdGhlIEZ1bGxzY3JlZW5WaWRlb3NDb250cm9sbGVyIGZvciBoYW5kbGlu
Zy4KKworICAgICAgICAqIGxvYWRlci9GcmFtZUxvYWRlci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpGcmFtZUxvYWRlcjo6YWRkRGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
L01lZGlhUGxheWVyUHJpdmF0ZVF1aWNrVGltZVdpbi5oOgorICAgICAgICAoV2ViQ29yZTo6TWVk
aWFQbGF5ZXJQcml2YXRlOjpzdXBwb3J0c0Z1bGxzY3JlZW4pOgorICAgICAgICAoV2ViQ29yZTo6
TWVkaWFQbGF5ZXJQcml2YXRlOjpwbGF0Zm9ybU1lZGlhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW4vUVRNb3ZpZVdpbi5jcHA6CisgICAgICAgIChRVE1vdmllV2luUHJpdmF0ZTo6
UVRNb3ZpZVdpblByaXZhdGUpOgorICAgICAgICAoUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1aWNr
VGltZSk6CisgICAgICAgIChRVE1vdmllV2luOjpfaGFuZGxlTWVzc2FnZXMpOgorICAgICAgICAo
UVRNb3ZpZVdpbjo6ZW50ZXJGdWxsc2NyZWVuKToKKyAgICAgICAgKFFUTW92aWVXaW46OmV4aXRG
dWxsc2NyZWVuKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vUVRNb3ZpZVdpbi5o
OgorCiAyMDEwLTAxLTA3ICBHZW9mZnJleSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgU2FtIFdlaW5pZy4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luL01lZGlhUGxheWVyUHJpdmF0ZVF1aWNrVGltZVdpbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tU
aW1lV2luLmNwcAkocmV2aXNpb24gNTI5NjMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbi9NZWRpYVBsYXllclByaXZhdGVRdWlja1RpbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC04OCw2ICs4OCwxOCBAQCBNZWRpYVBsYXllclByaXZhdGU6On5NZWRpYVBsYXllclByaXZhdGUo
CiB7CiB9CiAKK2Jvb2wgTWVkaWFQbGF5ZXJQcml2YXRlOjpzdXBwb3J0c0Z1bGxzY3JlZW4oKSBj
b25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCitQbGF0Zm9ybU1lZGlhIE1lZGlhUGxheWVy
UHJpdmF0ZTo6cGxhdGZvcm1NZWRpYSgpIGNvbnN0Cit7CisgICAgUGxhdGZvcm1NZWRpYSBwOwor
ICAgIHAucXRNb3ZpZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UVRNb3ZpZSo+KG1fcXRNb3ZpZS5nZXQo
KSk7CisgICAgcmV0dXJuIHA7Cit9CisKIGNsYXNzIFRhc2tUaW1lciA6IFRpbWVyQmFzZSB7CiBw
dWJsaWM6CiAgICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpOwpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRl
UXVpY2tUaW1lV2luLmgJKHJldmlzaW9uIDUyOTYzKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW4vTWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lV2luLmgJKHdvcmtpbmcgY29weSkK
QEAgLTUzLDYgKzUzLDkgQEAgcHVibGljOgogcHJpdmF0ZToKICAgICBNZWRpYVBsYXllclByaXZh
dGUoTWVkaWFQbGF5ZXIqKTsKIAorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Z1bGxzY3JlZW4o
KSBjb25zdDsKKyAgICB2aXJ0dWFsIFBsYXRmb3JtTWVkaWEgcGxhdGZvcm1NZWRpYSgpIGNvbnN0
OworCiAgICAgSW50U2l6ZSBuYXR1cmFsU2l6ZSgpIGNvbnN0OwogICAgIGJvb2wgaGFzVmlkZW8o
KSBjb25zdDsKICAgICBib29sIGhhc0F1ZGlvKCkgY29uc3Q7CkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAkocmV2aXNpb24gNTI5NjMpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2luLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjQsMTggKzI0LDE1IEBACiAgKi8KICNpbmNsdWRlICJjb25maWcuaCIKIAotI2luY2x1
ZGUgPHdpbmRvd3MuaD4KLQogI2luY2x1ZGUgIlFUTW92aWVXaW4uaCIKIAogLy8gUHV0IE1vdmll
cy5oIGZpcnN0IHNvIGJ1aWxkIGZhaWx1cmVzIGhlcmUgcG9pbnQgY2xlYXJseSB0byBRdWlja1Rp
bWUKICNpbmNsdWRlIDxNb3ZpZXMuaD4KLSNpbmNsdWRlIDxRdWlja1RpbWVDb21wb25lbnRzLmg+
Ci0jaW5jbHVkZSA8R1hNYXRoLmg+Ci0jaW5jbHVkZSA8UVRNTC5oPgogCiAjaW5jbHVkZSAiUVRN
b3ZpZVdpblRpbWVyLmgiCi0KKyNpbmNsdWRlIDxHWE1hdGguaD4KKyNpbmNsdWRlIDxRVE1MLmg+
CisjaW5jbHVkZSA8UXVpY2tUaW1lQ29tcG9uZW50cy5oPgogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRp
b25zLmg+CiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFi
bGUuaD4KQEAgLTUwLDYgKzQ3LDcgQEAgc3RhdGljIGNvbnN0IGxvbmcgc3ViVGl0bGVUcmFja1R5
cGUgPSAncwogc3RhdGljIGNvbnN0IGxvbmcgbXBlZzRPYmplY3REZXNjcmlwdGlvblRyYWNrVHlw
ZSA9ICdvZHNtJzsKIHN0YXRpYyBjb25zdCBsb25nIG1wZWc0U2NlbmVEZXNjcmlwdGlvblRyYWNr
VHlwZSA9ICdzZHNtJzsKIHN0YXRpYyBjb25zdCBsb25nIGNsb3NlZENhcHRpb25EaXNwbGF5UHJv
cGVydHlJRCA9ICdkaXNwJzsKK3N0YXRpYyBMUENUU1RSIGZ1bGxzY3JlZW5RVE1vdmllV2luUG9p
bnRlclByb3AgPSBURVhUKCJmdWxsc2NyZWVuUVRNb3ZpZVdpblBvaW50ZXIiKTsKIAogLy8gUmVz
aXppbmcgR1dvcmxkcyBpcyBzbG93LCBnaXZlIHRoZW0gYSBtaW5pbXVtIHNpemUgc28gc2l6ZSBv
ZiBzbWFsbCAKIC8vIHZpZGVvcyBjYW4gYmUgYW5pbWF0ZWQgc21vb3RobHkKQEAgLTEzMCw2ICsx
MjgsMTEgQEAgcHVibGljOgogI2lmICFBU1NFUlRfRElTQUJMRUQKICAgICBib29sIG1fc2NhbGVD
YWNoZWQ7CiAjZW5kaWYKKyAgICBXaW5kb3dQdHIgbV9mdWxsc2NyZWVuV2luZG93OworICAgIEdX
b3JsZFB0ciBtX2Z1bGxzY3JlZW5PcmlnR1dvcmxkOworICAgIFJlY3QgbV9mdWxsc2NyZWVuUmVj
dDsKKyAgICBRVE1vdmllV2luRnVsbHNjcmVlbkNsaWVudCogbV9mdWxsc2NyZWVuQ2xpZW50Owor
ICAgIGNoYXIqIG1fZnVsbHNjcmVlblJlc3RvcmVTdGF0ZTsKIH07CiAKIFFUTW92aWVXaW5Qcml2
YXRlOjpRVE1vdmllV2luUHJpdmF0ZSgpCkBAIC0xNTksMTEgKzE2MiwxOSBAQCBRVE1vdmllV2lu
UHJpdmF0ZTo6UVRNb3ZpZVdpblByaXZhdGUoKQogI2lmICFBU1NFUlRfRElTQUJMRUQKICAgICAs
IG1fc2NhbGVDYWNoZWQoZmFsc2UpCiAjZW5kaWYKKyAgICAsIG1fZnVsbHNjcmVlbldpbmRvdygw
KQorICAgICwgbV9mdWxsc2NyZWVuT3JpZ0dXb3JsZCgwKQorICAgICwgbV9mdWxsc2NyZWVuQ2xp
ZW50KDApCisgICAgLCBtX2Z1bGxzY3JlZW5SZXN0b3JlU3RhdGUoMCkKIHsKKyAgICBSZWN0IHJl
Y3QgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBtX2Z1bGxzY3JlZW5SZWN0ID0gcmVjdDsKIH0KIAog
UVRNb3ZpZVdpblByaXZhdGU6On5RVE1vdmllV2luUHJpdmF0ZSgpCiB7CisgICAgQVNTRVJUKCFt
X2Z1bGxzY3JlZW5XaW5kb3cpOworCiAgICAgZW5kVGFzaygpOwogICAgIGlmIChtX2dXb3JsZCkK
ICAgICAgICAgZGVsZXRlR1dvcmxkKCk7CkBAIC0zNTksNyArMzcwLDcgQEAgdm9pZCBRVE1vdmll
V2luUHJpdmF0ZTo6Y3JlYXRlR1dvcmxkKCkKICAgICBib3VuZHMubGVmdCA9IDA7IAogICAgIGJv
dW5kcy5yaWdodCA9IG1fZ1dvcmxkV2lkdGg7CiAgICAgYm91bmRzLmJvdHRvbSA9IG1fZ1dvcmxk
SGVpZ2h0OwotICAgIE9TRXJyIGVyciA9IFFUTmV3R1dvcmxkKCZtX2dXb3JsZCwgazMyQkdSQVBp
eGVsRm9ybWF0LCAmYm91bmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsgCisgICAgT1NFcnIgZXJyID0g
UVROZXdHV29ybGQoJm1fZ1dvcmxkLCBrMzJCR1JBUGl4ZWxGb3JtYXQsICZib3VuZHMsIDAsIDAs
IDApOyAKICAgICBpZiAoZXJyKSAKICAgICAgICAgcmV0dXJuOwogICAgIEdldE1vdmllR1dvcmxk
KG1fbW92aWUsICZtX3NhdmVkR1dvcmxkLCAwKTsKQEAgLTcyOSw3ICs3NDAsNyBAQCB2b2lkIFFU
TW92aWVXaW46OmxvYWQoQ0ZVUkxSZWYgdXJsLCBib29sCiAgICAgbW92aWVQcm9wQ291bnQrKzsg
CiAKICAgICBBU1NFUlQobW92aWVQcm9wQ291bnQgPD0gc2l6ZW9mKG1vdmllUHJvcHMpL3NpemVv
Zihtb3ZpZVByb3BzWzBdKSk7Ci0gICAgbV9wcml2YXRlLT5tX2xvYWRFcnJvciA9IE5ld01vdmll
RnJvbVByb3BlcnRpZXMobW92aWVQcm9wQ291bnQsIG1vdmllUHJvcHMsIDAsIE5VTEwsICZtX3By
aXZhdGUtPm1fbW92aWUpOworICAgIG1fcHJpdmF0ZS0+bV9sb2FkRXJyb3IgPSBOZXdNb3ZpZUZy
b21Qcm9wZXJ0aWVzKG1vdmllUHJvcENvdW50LCBtb3ZpZVByb3BzLCAwLCAwLCAmbV9wcml2YXRl
LT5tX21vdmllKTsKIAogZW5kOgogICAgIG1fcHJpdmF0ZS0+c3RhcnRUYXNrKCk7CkBAIC05NTMs
NyArOTY0LDcgQEAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVN1cHBvcnRlZFR5cGVzKCkgCiAgICAg
ICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBpZiAoIShpbmZvQ0QuY29tcG9uZW50
RmxhZ3MgJiBoYXNNb3ZpZUltcG9ydE1JTUVMaXN0KSkKICAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgIFFUQXRvbUNvbnRhaW5lciBtaW1lTGlzdCA9IE5VTEw7CisgICAgICAg
ICAgICBRVEF0b21Db250YWluZXIgbWltZUxpc3QgPSAwOwogICAgICAgICAgICAgZXJyID0gTW92
aWVJbXBvcnRHZXRNSU1FVHlwZUxpc3QoKENvbXBvbmVudEluc3RhbmNlKWNvbXAsICZtaW1lTGlz
dCk7CiAgICAgICAgICAgICBpZiAoZXJyIHx8ICFtaW1lTGlzdCkKICAgICAgICAgICAgICAgICBj
b250aW51ZTsKQEAgLTk2Miw3ICs5NzMsNyBAQCBzdGF0aWMgdm9pZCBpbml0aWFsaXplU3VwcG9y
dGVkVHlwZXMoKSAKICAgICAgICAgICAgIFFUTG9ja0NvbnRhaW5lcihtaW1lTGlzdCk7CiAgICAg
ICAgICAgICBpbnQgdHlwZUNvdW50ID0gUVRDb3VudENoaWxkcmVuT2ZUeXBlKG1pbWVMaXN0LCBr
UGFyZW50QXRvbUlzQ29udGFpbmVyLCBrTWltZUluZm9NaW1lVHlwZVRhZyk7CiAgICAgICAgICAg
ICBmb3IgKGludCB0eXBlSW5kZXggPSAxOyB0eXBlSW5kZXggPD0gdHlwZUNvdW50OyB0eXBlSW5k
ZXgrKykgewotICAgICAgICAgICAgICAgIFFUQXRvbSBtaW1lVGFnID0gUVRGaW5kQ2hpbGRCeUlu
ZGV4KG1pbWVMaXN0LCAwLCBrTWltZUluZm9NaW1lVHlwZVRhZywgdHlwZUluZGV4LCBOVUxMKTsK
KyAgICAgICAgICAgICAgICBRVEF0b20gbWltZVRhZyA9IFFURmluZENoaWxkQnlJbmRleChtaW1l
TGlzdCwgMCwga01pbWVJbmZvTWltZVR5cGVUYWcsIHR5cGVJbmRleCwgMCk7CiAgICAgICAgICAg
ICAgICAgaWYgKCFtaW1lVGFnKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAg
ICAgICAgICAgICBjaGFyKiBhdG9tRGF0YTsKQEAgLTk4MCw3ICs5OTEsNyBAQCBzdGF0aWMgdm9p
ZCBpbml0aWFsaXplU3VwcG9ydGVkVHlwZXMoKSAKICAgICAgICAgICAgICAgICBpZiAoc3RybmNt
cCh0eXBlQnVmZmVyLCAiYXVkaW8vIiwgNikgJiYgc3RybmNtcCh0eXBlQnVmZmVyLCAidmlkZW8v
IiwgNikpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICAgICAg
Q0ZTdHJpbmdSZWYgY2ZNaW1lVHlwZSA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoTlVMTCwg
dHlwZUJ1ZmZlciwga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKKyAgICAgICAgICAgICAgICBDRlN0
cmluZ1JlZiBjZk1pbWVUeXBlID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZygwLCB0eXBlQnVm
ZmVyLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwogICAgICAgICAgICAgICAgIGlmICghY2ZNaW1l
VHlwZSkKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKQEAgLTEwNDAsNyArMTA1MSw3
IEBAIGJvb2wgUVRNb3ZpZVdpbjo6aW5pdGlhbGl6ZVF1aWNrVGltZSgpIAogICAgIGlmICghaW5p
dGlhbGl6ZWQpIHsKICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAvLyBJbml0
aWFsaXplIGFuZCBjaGVjayBRdWlja1RpbWUgdmVyc2lvbgotICAgICAgICBPU0VyciByZXN1bHQg
PSBJbml0aWFsaXplUVRNTCgwKTsKKyAgICAgICAgT1NFcnIgcmVzdWx0ID0gSW5pdGlhbGl6ZVFU
TUwoa0luaXRpYWxpemVRVE1MRW5hYmxlRG91YmxlQnVmZmVyZWRTdXJmYWNlKTsKICAgICAgICAg
aWYgKHJlc3VsdCA9PSBub0VycikKICAgICAgICAgICAgIHJlc3VsdCA9IEdlc3RhbHQoZ2VzdGFs
dFF1aWNrVGltZSwgJnF1aWNrVGltZVZlcnNpb24pOwogICAgICAgICBpZiAocmVzdWx0ICE9IG5v
RXJyKSB7CkBAIC0xMDU4LDE1ICsxMDY5LDgwIEBAIGJvb2wgUVRNb3ZpZVdpbjo6aW5pdGlhbGl6
ZVF1aWNrVGltZSgpIAogICAgIHJldHVybiBpbml0aWFsaXphdGlvblN1Y2NlZWRlZDsKIH0KIAor
TFJFU1VMVCBRVE1vdmllV2luOjpmdWxsc2NyZWVuV25kUHJvYyhIV05EIHduZCwgVUlOVCBtZXNz
YWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFFUTW92aWVXaW4qIG1v
dmllID0gc3RhdGljX2Nhc3Q8UVRNb3ZpZVdpbio+KEdldFByb3Aod25kLCBmdWxsc2NyZWVuUVRN
b3ZpZVdpblBvaW50ZXJQcm9wKSk7CisKKyAgICBpZiAobWVzc2FnZSA9PSBXTV9ERVNUUk9ZKQor
ICAgICAgICBSZW1vdmVQcm9wKHduZCwgZnVsbHNjcmVlblFUTW92aWVXaW5Qb2ludGVyUHJvcCk7
CisKKyAgICBpZiAoIW1vdmllKQorICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyh3bmQsIG1l
c3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIHJldHVybiBtb3ZpZS0+bV9wcml2YXRlLT5t
X2Z1bGxzY3JlZW5DbGllbnQtPmZ1bGxzY3JlZW5DbGllbnRXbmRQcm9jKHduZCwgbWVzc2FnZSwg
d1BhcmFtLCBsUGFyYW0pOworfQorCitIV05EIFFUTW92aWVXaW46OmVudGVyRnVsbHNjcmVlbihR
VE1vdmllV2luRnVsbHNjcmVlbkNsaWVudCogY2xpZW50KQoreworICAgIG1fcHJpdmF0ZS0+bV9m
dWxsc2NyZWVuQ2xpZW50ID0gY2xpZW50OworICAgIAorICAgIEJlZ2luRnVsbFNjcmVlbigmbV9w
cml2YXRlLT5tX2Z1bGxzY3JlZW5SZXN0b3JlU3RhdGUsIDAsIDAsIDAsICZtX3ByaXZhdGUtPm1f
ZnVsbHNjcmVlbldpbmRvdywgMCwgZnVsbFNjcmVlbkFsbG93RXZlbnRzKTsgCisgICAgUVRNTFNl
dFdpbmRvd1duZFByb2MobV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5XaW5kb3csIGZ1bGxzY3JlZW5X
bmRQcm9jKTsKKyAgICBDcmVhdGVQb3J0QXNzb2NpYXRpb24oR2V0UG9ydE5hdGl2ZVdpbmRvdyht
X3ByaXZhdGUtPm1fZnVsbHNjcmVlbldpbmRvdyksIDAsIDApOworCisgICAgR2V0TW92aWVCb3go
bV9wcml2YXRlLT5tX21vdmllLCAmbV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5SZWN0KTsKKyAgICBH
ZXRNb3ZpZUdXb3JsZChtX3ByaXZhdGUtPm1fbW92aWUsICZtX3ByaXZhdGUtPm1fZnVsbHNjcmVl
bk9yaWdHV29ybGQsIDApOworICAgIFNldE1vdmllR1dvcmxkKG1fcHJpdmF0ZS0+bV9tb3ZpZSwg
cmVpbnRlcnByZXRfY2FzdDxDR3JhZlB0cj4obV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5XaW5kb3cp
LCBHZXRHV29ybGREZXZpY2UocmVpbnRlcnByZXRfY2FzdDxDR3JhZlB0cj4obV9wcml2YXRlLT5t
X2Z1bGxzY3JlZW5XaW5kb3cpKSk7CisKKyAgICAvLyBTZXQgdGhlIHNpemUgb2YgdGhlIGJveCB0
byBwcmVzZXJ2ZSBhc3BlY3QgcmF0aW8KKyAgICBSZWN0IHJlY3QgPSBtX3ByaXZhdGUtPm1fZnVs
bHNjcmVlbldpbmRvdy0+cG9ydFJlY3Q7CisKKyAgICBmbG9hdCBtb3ZpZVJhdGlvID0gc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KG1fcHJpdmF0ZS0+bV93aWR0aCkgLyBtX3ByaXZhdGUtPm1faGVpZ2h0Owor
ICAgIGludCB3aW5kb3dXaWR0aCA9ICByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworICAgIGludCB3
aW5kb3dIZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOworICAgIGZsb2F0IHdpbmRvd1Jh
dGlvID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpbmRvd1dpZHRoKSAvIHdpbmRvd0hlaWdodDsKKyAg
ICBpbnQgYWN0dWFsV2lkdGggPSAod2luZG93UmF0aW8gPiBtb3ZpZVJhdGlvKSA/ICh3aW5kb3dI
ZWlnaHQgKiBtb3ZpZVJhdGlvKSA6IHdpbmRvd1dpZHRoOworICAgIGludCBhY3R1YWxIZWlnaHQg
PSAod2luZG93UmF0aW8gPCBtb3ZpZVJhdGlvKSA/ICh3aW5kb3dXaWR0aCAvIG1vdmllUmF0aW8p
IDogd2luZG93SGVpZ2h0OworICAgIGludCBvZmZzZXRYID0gKHdpbmRvd1dpZHRoIC0gYWN0dWFs
V2lkdGgpIC8gMjsKKyAgICBpbnQgb2Zmc2V0WSA9ICh3aW5kb3dIZWlnaHQgLSBhY3R1YWxIZWln
aHQpIC8gMjsKKworICAgIHJlY3QubGVmdCA9IG9mZnNldFg7CisgICAgcmVjdC5yaWdodCA9IG9m
ZnNldFggKyBhY3R1YWxXaWR0aDsKKyAgICByZWN0LnRvcCA9IG9mZnNldFk7CisgICAgcmVjdC5i
b3R0b20gPSBvZmZzZXRZICsgYWN0dWFsSGVpZ2h0OworCisgICAgU2V0TW92aWVCb3gobV9wcml2
YXRlLT5tX21vdmllLCAmcmVjdCk7CisgICAgU2hvd0hpZGVUYXNrQmFyKHRydWUpOworCisgICAg
Ly8gU2V0IHRoZSAndGhpcycgcG9pbnRlciBvbiB0aGUgSFdORAorICAgIEhXTkQgd25kID0gc3Rh
dGljX2Nhc3Q8SFdORD4oR2V0UG9ydE5hdGl2ZVdpbmRvdyhtX3ByaXZhdGUtPm1fZnVsbHNjcmVl
bldpbmRvdykpOworICAgIFNldFByb3Aod25kLCBmdWxsc2NyZWVuUVRNb3ZpZVdpblBvaW50ZXJQ
cm9wLCBzdGF0aWNfY2FzdDxIQU5ETEU+KHRoaXMpKTsKKworICAgIHJldHVybiB3bmQ7Cit9CisK
K3ZvaWQgUVRNb3ZpZVdpbjo6ZXhpdEZ1bGxzY3JlZW4oKQoreworICAgIGlmICghbV9wcml2YXRl
LT5tX2Z1bGxzY3JlZW5XaW5kb3cpCisgICAgICAgIHJldHVybjsKKworICAgIEhXTkQgd25kID0g
c3RhdGljX2Nhc3Q8SFdORD4oR2V0UG9ydE5hdGl2ZVdpbmRvdyhtX3ByaXZhdGUtPm1fZnVsbHNj
cmVlbldpbmRvdykpOworICAgIERlc3Ryb3lQb3J0QXNzb2NpYXRpb24ocmVpbnRlcnByZXRfY2Fz
dDxDR3JhZlB0cj4obV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5XaW5kb3cpKTsKKyAgICBTZXRNb3Zp
ZUdXb3JsZChtX3ByaXZhdGUtPm1fbW92aWUsIG1fcHJpdmF0ZS0+bV9mdWxsc2NyZWVuT3JpZ0dX
b3JsZCwgMCk7CisgICAgRW5kRnVsbFNjcmVlbihtX3ByaXZhdGUtPm1fZnVsbHNjcmVlblJlc3Rv
cmVTdGF0ZSwgMEwpOworICAgIFNldE1vdmllQm94KG1fcHJpdmF0ZS0+bV9tb3ZpZSwgJm1fcHJp
dmF0ZS0+bV9mdWxsc2NyZWVuUmVjdCk7CisgICAgbV9wcml2YXRlLT5tX2Z1bGxzY3JlZW5XaW5k
b3cgPSAwOworfQorCiBCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBoaW5zdERMTCwgRFdP
UkQgZmR3UmVhc29uLCBMUFZPSUQgbHB2UmVzZXJ2ZWQpCiB7CiAgICAgc3dpdGNoIChmZHdSZWFz
b24pIHsKLSAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6Ci0gICAgICAgICAgICByZXR1
cm4gVFJVRTsKLSAgICAgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6Ci0gICAgICAgIGNhc2Ug
RExMX1RIUkVBRF9BVFRBQ0g6Ci0gICAgICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6Ci0gICAg
ICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAg
ICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorICAgIGNhc2Ug
RExMX1RIUkVBRF9BVFRBQ0g6CisgICAgY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKyAgICAgICAg
cmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKICAgICByZXR1
cm4gRkFMU0U7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9RVE1vdmllV2lu
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vUVRNb3ZpZVdp
bi5oCShyZXZpc2lvbiA1Mjk2MykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL1FU
TW92aWVXaW4uaAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcsNyBAQAogI2RlZmluZSBRVE1v
dmllV2luX2gKIAogI2luY2x1ZGUgPFVuaWNvZGUuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CiAK
ICNpZmRlZiBRVE1PVklFV0lOX0VYUE9SVFMKICNkZWZpbmUgUVRNT1ZJRVdJTl9BUEkgX19kZWNs
c3BlYyhkbGxleHBvcnQpCkBAIC00NSw2ICs0NiwxMSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2
b2lkIG1vdmllTmV3SW1hZ2VBdmFpbGFibGUoUVRNb3ZpZVdpbiopID0gMDsKIH07CiAKK2NsYXNz
IFFUTW92aWVXaW5GdWxsc2NyZWVuQ2xpZW50IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIExSRVNV
TFQgZnVsbHNjcmVlbkNsaWVudFduZFByb2MoSFdORCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0sIExQ
QVJBTSkgPSAwOworfTsKKwogZW51bSB7CiAgICAgUVRNb3ZpZUxvYWRTdGF0ZUVycm9yID0gLTFM
LAogICAgIFFUTW92aWVMb2FkU3RhdGVMb2FkZWQgID0gMjAwMEwsCkBAIC0xMDQsOCArMTEwLDEz
IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgdW5zaWduZWQgY291bnRTdXBwb3J0ZWRUeXBlcygpOwog
ICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZFR5cGUodW5zaWduZWQgaW5kZXgsIGNvbnN0IFVD
aGFyKiYgc3RyLCB1bnNpZ25lZCYgbGVuKTsKIAorICAgIC8vIFJldHVybnMgdGhlIGZ1bGwtc2Ny
ZWVuIHdpbmRvdyBjcmVhdGVkCisgICAgSFdORCBlbnRlckZ1bGxzY3JlZW4oUVRNb3ZpZVdpbkZ1
bGxzY3JlZW5DbGllbnQqKTsKKyAgICB2b2lkIGV4aXRGdWxsc2NyZWVuKCk7CisKIHByaXZhdGU6
CiAgICAgdm9pZCBsb2FkKENGVVJMUmVmLCBib29sIHByZXNlcnZlc1BpdGNoKTsKKyAgICBzdGF0
aWMgTFJFU1VMVCBmdWxsc2NyZWVuV25kUHJvYyhIV05ELCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3
UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogCiAgICAgUVRNb3ZpZVdpblByaXZhdGUqIG1fcHJpdmF0
ZTsKICAgICBib29sIG1fZGlzYWJsZWQ7CkluZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gNTI5NjMpCisrKyBXZWJL
aXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ1IEBACisyMDEwLTAx
LTA4ICBDaHJpcyBNYXJyaW4gIDxjbWFycmluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbXBsZW1lbnQgZnVsbC1zY3JlZW4gdmlk
ZW8gZm9yIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTMxMzE4CisgICAgICAgIAorICAgICAgICBUaGlzIGFkZHMgYSBmdWxsLXNjcmVlbiBj
b250cm9sbGVyLCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyLCAKKyAgICAgICAgd2hpY2ggbWFu
YWdlcyBnb2luZyBpbiBhbmQgb3V0IG9mIGZ1bGwtc2NyZWVuLiBUaGUgYWN0dWFsIAorICAgICAg
ICBmdWxsLXNjcmVlbiB3aW5kb3cgaXMgY3JlYXRlZCBhbmQgbWFuYWdlZCBieSBsb2dpYyBhZGRl
ZCAKKyAgICAgICAgdG8gUVRNb3ZpZVdpbi4gRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlciBhbHNv
IGNyZWF0ZXMgYW5kCisgICAgICAgIG1hbmFnZXMgYSBIVUQuIFRoZSBIVUQgcmVuZGVycyBhbmQg
bWFuYWdlcyBldmVudHMgdG8KKyAgICAgICAgY29udHJvbCB0aGUgcGxheWluZyB2aWRlby4gTW92
aWUgY29udHJvbGxlciBldmVudHMgZ28gdG8gCisgICAgICAgIEZ1bGxzY3JlZW5WaWRlb0NvbnRy
b2xsZXIgd2hpY2ggdGhlbiBzZW5kcyB0aGVtIHRvIEhUTUxNZWRpYUVsZW1lbnQsIAorICAgICAg
ICB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGNvbnRyb2xsZXIgYnkgV2ViVmlldywgd2hpY2ggZ2V0
cyB0aGUgY2FsbCAKKyAgICAgICAgdG8gZ28gaW50byBmdWxsLXNjcmVlbiBtb2RlIGZyb20gSFRN
TE1lZGlhRWxlbWVudCB2aWEgCisgICAgICAgIENocm9tZUNsaWVudC4KKyAgICAgICAgCisgICAg
ICAgIEkndmUgYWxzbyB1cGRhdGVkIHRoZSBpY29ucyBzbyB0aGUgcmVsYXRlZCBzZXRzIChQbGF5
L1BhdXNlIGFuZAorICAgICAgICB2b2x1bWUgaGlnaC92b2x1bWUgbG93L2V4aXQgZnVsbHNjcmVl
bikgYXJlIHRoZSBzYW1lIHNpemUuIFRoaXMgCisgICAgICAgIGFsbG93cyBtZSB0byBwb3NpdGlv
biB0aGVtIHVzaW5nIGNvbW1vbiBjb2RlLgorCisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvV2Vi
Q2hyb21lQ2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkNocm9tZUNsaWVudDo6c3VwcG9ydHNGdWxs
c2NyZWVuRm9yTm9kZSk6CisgICAgICAgIChXZWJDaHJvbWVDbGllbnQ6OmVudGVyRnVsbHNjcmVl
bkZvck5vZGUpOgorICAgICAgICAoV2ViQ2hyb21lQ2xpZW50OjpleGl0RnVsbHNjcmVlbkZvck5v
ZGUpOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oOgorICAgICAg
ICAqIFdlYktpdC52Y3Byb2ovV2ViS2l0LnZjcHJvajoKKyAgICAgICAgKiBXZWJLaXQudmNwcm9q
L2ZzVmlkZW9BdWRpb1ZvbHVtZUhpZ2gucG5nOgorICAgICAgICAqIFdlYktpdC52Y3Byb2ovZnNW
aWRlb0F1ZGlvVm9sdW1lTG93LnBuZzoKKyAgICAgICAgKiBXZWJLaXQudmNwcm9qL2ZzVmlkZW9F
eGl0RnVsbHNjcmVlbi5wbmc6CisgICAgICAgICogV2ViS2l0LnZjcHJvai9mc1ZpZGVvUGF1c2Uu
cG5nOgorICAgICAgICAqIFdlYktpdC52Y3Byb2ovZnNWaWRlb1BsYXkucG5nOgorICAgICAgICAq
IFdlYktpdERMTC5jcHA6CisgICAgICAgIChsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKToKKyAgICAg
ICAgKiBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyLmNwcDogQWRkZWQuCisgICAgICAgICogRnVs
bHNjcmVlblZpZGVvQ29udHJvbGxlci5oOiBBZGRlZC4KKyAgICAgICAgKiBXZWJWaWV3LmNwcDoK
KyAgICAgICAgKFdlYlZpZXc6OmVudGVyRnVsbHNjcmVlbkZvck5vZGUpOgorICAgICAgICAoV2Vi
Vmlldzo6ZXhpdEZ1bGxzY3JlZW4pOgorICAgICAgICAqIFdlYlZpZXcuaDoKKwogMjAxMC0wMS0w
NyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgTWFjaWVqIFN0YWNob3dpYWsuCkluZGV4OiBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0Nv
bnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vRnVsbHNjcmVlblZpZGVvQ29u
dHJvbGxlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0Nv
bnRyb2xsZXIuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShWSURFTykKKworI2luY2x1ZGUgIkZ1bGxz
Y3JlZW5WaWRlb0NvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIldlYktpdERMTC5oIgorI2luY2x1
ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvQml0bWFwSW5mby5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRm9udC5oPgorI2luY2x1
ZGUgPFdlYkNvcmUvRm9udFNlbGVjdG9yLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0Nv
bnRleHQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1RleHRSdW4uaD4KKyNpbmNsdWRlIDxXZWJLaXRT
eXN0ZW1JbnRlcmZhY2UvV2ViS2l0U3lzdGVtSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8d2luZG93
c3guaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBz
dGQ7Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHRpbWVy
SW50ZXJ2YWwgPSAwLjAzMzsKKworLy8gSFVEIFNpemUKK3N0YXRpYyBjb25zdCBpbnQgd2luZG93
SGVpZ2h0ID0gNTk7CitzdGF0aWMgY29uc3QgaW50IHdpbmRvd1dpZHRoID0gNDM4OworCisvLyBN
YXJnaW5zIGFuZCBidXR0b24gc2l6ZXMKK3N0YXRpYyBjb25zdCBpbnQgbWFyZ2luID0gOTsKK3N0
YXRpYyBjb25zdCBpbnQgbWFyZ2luVG9wID0gOTsKK3N0YXRpYyBjb25zdCBpbnQgYnV0dG9uU2l6
ZSA9IDI1Oworc3RhdGljIGNvbnN0IGludCBidXR0b25NaW5pU2l6ZSA9IDE2Oworc3RhdGljIGNv
bnN0IGludCB2b2x1bWVTbGlkZXJXaWR0aCA9IDUwOworc3RhdGljIGNvbnN0IGludCB0aW1lU2xp
ZGVyV2lkdGggPSAzMTA7CitzdGF0aWMgY29uc3QgaW50IHNsaWRlckhlaWdodCA9IDg7CitzdGF0
aWMgY29uc3QgaW50IHZvbHVtZVNsaWRlckJ1dHRvblNpemUgPSAxMDsKK3N0YXRpYyBjb25zdCBp
bnQgdGltZVNsaWRlckJ1dHRvblNpemUgPSA4Oworc3RhdGljIGNvbnN0IGludCB0ZXh0U2l6ZSA9
IDExOworc3RhdGljIGNvbnN0IGZsb2F0IGluaXRpYWxIVURQb3NpdGlvblkgPSAwLjk7IC8vIElu
aXRpYWwgWSBwb3NpdGlvbiBvZiBIVUQgaW4gcGVyY2VudGFnZSBmcm9tIHRvcCBvZiBzY3JlZW4K
KworLy8gQmFja2dyb3VuZCB2YWx1ZXMKK3N0YXRpYyBjb25zdCBpbnQgYm9yZGVyUmFkaXVzID0g
MTI7CitzdGF0aWMgY29uc3QgaW50IGJvcmRlclRoaWNrbmVzcyA9IDI7CisKKy8vIENvbG9ycwor
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBiYWNrZ3JvdW5kQ29sb3IgPSAweEEwMjAyMDIwOwor
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBib3JkZXJDb2xvciA9IDB4RkZBMEEwQTA7CitzdGF0
aWMgY29uc3QgdW5zaWduZWQgaW50IHNsaWRlckd1dHRlckNvbG9yID0gMHhGRjE0MTQxNDsKK3N0
YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2xpZGVyQnV0dG9uQ29sb3IgPSAweEZGODA4MDgwOwor
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0ZXh0Q29sb3IgPSAweEZGRkZGRkZGOworCitIVURC
dXR0b246OkhVREJ1dHRvbihIVURCdXR0b25UeXBlIHR5cGUsIGNvbnN0IEludFBvaW50JiBwb3Np
dGlvbikKKyAgICA6IEhVRFdpZGdldChJbnRSZWN0KHBvc2l0aW9uLCBJbnRTaXplKCkpKQorICAg
ICwgbV90eXBlKHR5cGUpCisgICAgLCBtX3Nob3dBbHRCdXR0b24oZmFsc2UpCit7CisgICAgY29u
c3QgY2hhciogYnV0dG9uUmVzb3VyY2UgPSAwOworICAgIGNvbnN0IGNoYXIqIGJ1dHRvblJlc291
cmNlQWx0ID0gMDsKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNhc2UgUGxheVBhdXNlQnV0
dG9uOgorICAgICAgICBidXR0b25SZXNvdXJjZSA9ICJmc1ZpZGVvUGxheSI7CisgICAgICAgIGJ1
dHRvblJlc291cmNlQWx0ID0gImZzVmlkZW9QYXVzZSI7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgVGltZVNsaWRlckJ1dHRvbjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWb2x1bWVVcEJ1
dHRvbjoKKyAgICAgICAgYnV0dG9uUmVzb3VyY2UgPSAiZnNWaWRlb0F1ZGlvVm9sdW1lSGlnaCI7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVm9sdW1lU2xpZGVyQnV0dG9uOgorICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFZvbHVtZURvd25CdXR0b246CisgICAgICAgIGJ1dHRvblJlc291cmNl
ID0gImZzVmlkZW9BdWRpb1ZvbHVtZUxvdyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXhp
dEZ1bGxzY3JlZW5CdXR0b246CisgICAgICAgIGJ1dHRvblJlc291cmNlID0gImZzVmlkZW9FeGl0
RnVsbHNjcmVlbiI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChidXR0b25SZXNv
dXJjZSkgeworICAgICAgICBtX2J1dHRvbkltYWdlID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291
cmNlKGJ1dHRvblJlc291cmNlKTsKKyAgICAgICAgbV9yZWN0LnNldFdpZHRoKG1fYnV0dG9uSW1h
Z2UtPndpZHRoKCkpOworICAgICAgICBtX3JlY3Quc2V0SGVpZ2h0KG1fYnV0dG9uSW1hZ2UtPmhl
aWdodCgpKTsKKyAgICB9CisgICAgaWYgKGJ1dHRvblJlc291cmNlQWx0KQorICAgICAgICBtX2J1
dHRvbkltYWdlQWx0ID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKGJ1dHRvblJlc291cmNl
QWx0KTsKK30KKwordm9pZCBIVURCdXR0b246OmRyYXcoR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0
KQoreworICAgIEltYWdlKiBpbWFnZSA9IChtX3Nob3dBbHRCdXR0b24gJiYgbV9idXR0b25JbWFn
ZUFsdCkgPyBtX2J1dHRvbkltYWdlQWx0LmdldCgpIDogbV9idXR0b25JbWFnZS5nZXQoKTsKKyAg
ICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgRGV2aWNlQ29sb3JTcGFjZSwgbV9yZWN0LmxvY2F0
aW9uKCkpOworfQorCitIVURTbGlkZXI6OkhVRFNsaWRlcihIVURTbGlkZXJCdXR0b25TaGFwZSBz
aGFwZSwgaW50IGJ1dHRvblNpemUsIGNvbnN0IEludFJlY3QmIHJlY3QpCisgICAgOiBIVURXaWRn
ZXQocmVjdCkKKyAgICAsIG1fYnV0dG9uU2hhcGUoc2hhcGUpCisgICAgLCBtX2J1dHRvblNpemUo
YnV0dG9uU2l6ZSkKKyAgICAsIG1fYnV0dG9uUG9zaXRpb24oMCkKKyAgICAsIG1fZHJhZ1N0YXJ0
T2Zmc2V0KDApCit7Cit9CisKK3ZvaWQgSFVEU2xpZGVyOjpkcmF3KEdyYXBoaWNzQ29udGV4dCYg
Y29udGV4dCkKK3sKKyAgICAvLyBEcmF3IGd1dHRlcgorICAgIEludFNpemUgcmFkaXVzKG1fcmVj
dC5oZWlnaHQoKSAvIDIsIG1fcmVjdC5oZWlnaHQoKSAvIDIpOworICAgIGNvbnRleHQuZmlsbFJv
dW5kZWRSZWN0KG1fcmVjdCwgcmFkaXVzLCByYWRpdXMsIHJhZGl1cywgcmFkaXVzLCBDb2xvcihz
bGlkZXJHdXR0ZXJDb2xvciksIERldmljZUNvbG9yU3BhY2UpOworCisgICAgLy8gRHJhdyBidXR0
b24KKyAgICBjb250ZXh0LnNldFN0cm9rZUNvbG9yKENvbG9yKHNsaWRlckJ1dHRvbkNvbG9yKSwg
RGV2aWNlQ29sb3JTcGFjZSk7CisgICAgY29udGV4dC5zZXRGaWxsQ29sb3IoQ29sb3Ioc2xpZGVy
QnV0dG9uQ29sb3IpLCBEZXZpY2VDb2xvclNwYWNlKTsKKworICAgIGlmIChtX2J1dHRvblNoYXBl
ID09IFJvdW5kQnV0dG9uKSB7CisgICAgICAgIGNvbnRleHQuZHJhd0VsbGlwc2UoSW50UmVjdCht
X3JlY3QubG9jYXRpb24oKS54KCkgKyBtX2J1dHRvblBvc2l0aW9uLCBtX3JlY3QubG9jYXRpb24o
KS55KCkgLSAobV9idXR0b25TaXplIC0gbV9yZWN0LmhlaWdodCgpKSAvIDIsIG1fYnV0dG9uU2l6
ZSwgbV9idXR0b25TaXplKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEcmF3
IGEgZGlhbW9uZAorICAgIEZsb2F0UG9pbnQgcG9pbnRzWzRdOworICAgIGZsb2F0IGhhbGYgPSBz
dGF0aWNfY2FzdDxmbG9hdD4obV9idXR0b25TaXplKSAvIDI7CisgICAgcG9pbnRzWzBdLnNldFgo
bV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25Qb3NpdGlvbiArIGhhbGYpOworICAgIHBv
aW50c1swXS5zZXRZKG1fcmVjdC5sb2NhdGlvbigpLnkoKSk7CisgICAgcG9pbnRzWzFdLnNldFgo
bV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25Qb3NpdGlvbiArIG1fYnV0dG9uU2l6ZSk7
CisgICAgcG9pbnRzWzFdLnNldFkobV9yZWN0LmxvY2F0aW9uKCkueSgpICsgaGFsZik7CisgICAg
cG9pbnRzWzJdLnNldFgobV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9idXR0b25Qb3NpdGlvbiAr
IGhhbGYpOworICAgIHBvaW50c1syXS5zZXRZKG1fcmVjdC5sb2NhdGlvbigpLnkoKSArIG1fYnV0
dG9uU2l6ZSk7CisgICAgcG9pbnRzWzNdLnNldFgobV9yZWN0LmxvY2F0aW9uKCkueCgpICsgbV9i
dXR0b25Qb3NpdGlvbik7CisgICAgcG9pbnRzWzNdLnNldFkobV9yZWN0LmxvY2F0aW9uKCkueSgp
ICsgaGFsZik7CisgICAgY29udGV4dC5kcmF3Q29udmV4UG9seWdvbig0LCBwb2ludHMsIHRydWUp
OworfQorCit2b2lkIEhVRFNsaWRlcjo6ZHJhZyhjb25zdCBJbnRQb2ludCYgcG9pbnQsIGJvb2wg
c3RhcnQpCit7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgIC8vIFdoZW4gd2Ugc3RhcnQsIHdl
IG5lZWQgdG8gc25hcCB0aGUgc2xpZGVyIHBvc2l0aW9uIHRvIHRoZSB4IHBvc2l0aW9uIGlmIHdl
IGNsaWNrZWQgdGhlIGd1dHRlci4KKyAgICAgICAgLy8gQnV0IGlmIHdlIGNsaWNrIHRoZSBidXR0
b24sIHdlIG5lZWQgdG8gZHJhZyByZWxhdGl2ZSB0byB3aGVyZSB3ZSBjbGlja2VkIGRvd24uIFdl
IG9ubHkgbmVlZAorICAgICAgICAvLyB0byBjaGVjayBYIGJlY2F1c2Ugd2Ugd291bGQgbm90IGV2
ZW4gZ2V0IGhlcmUgdW5sZXNzIFkgd2VyZSBhbHJlYWR5IGluc2lkZS4KKyAgICAgICAgaW50IHJl
bGF0aXZlWCA9IHBvaW50LngoKSAtIG1fcmVjdC5sb2NhdGlvbigpLngoKTsKKyAgICAgICAgaWYg
KHJlbGF0aXZlWCA+PSBtX2J1dHRvblBvc2l0aW9uICYmIHJlbGF0aXZlWCA8PSBtX2J1dHRvblBv
c2l0aW9uICsgbV9idXR0b25TaXplKQorICAgICAgICAgICAgbV9kcmFnU3RhcnRPZmZzZXQgPSBw
b2ludC54KCkgLSBtX2J1dHRvblBvc2l0aW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICBt
X2RyYWdTdGFydE9mZnNldCA9IG1fcmVjdC5sb2NhdGlvbigpLngoKSArIG1fYnV0dG9uU2l6ZSAv
IDI7CisgICAgfQorCisgICAgbV9idXR0b25Qb3NpdGlvbiA9IG1heCgwLCBtaW4obV9yZWN0Lndp
ZHRoKCkgLSBtX2J1dHRvblNpemUsIHBvaW50LngoKSAtIG1fZHJhZ1N0YXJ0T2Zmc2V0KSk7Cit9
CisKK0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OkZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIo
KQorICAgIDogbV9odWRXaW5kb3coMCkKKyAgICAsIG1fdmlkZW9XaW5kb3coMCkKKyAgICAsIG1f
cGxheVBhdXNlQnV0dG9uKEhVREJ1dHRvbjo6UGxheVBhdXNlQnV0dG9uLCBJbnRQb2ludCgod2lu
ZG93V2lkdGggLSBidXR0b25TaXplKSAvIDIsIG1hcmdpblRvcCkpCisgICAgLCBtX3RpbWVTbGlk
ZXJCdXR0b24oSFVEQnV0dG9uOjpUaW1lU2xpZGVyQnV0dG9uLCBJbnRQb2ludCgwLCAwKSkKKyAg
ICAsIG1fdm9sdW1lVXBCdXR0b24oSFVEQnV0dG9uOjpWb2x1bWVVcEJ1dHRvbiwgSW50UG9pbnQo
bWFyZ2luICsgYnV0dG9uTWluaVNpemUgKyB2b2x1bWVTbGlkZXJXaWR0aCArIGJ1dHRvbk1pbmlT
aXplIC8gMiwgbWFyZ2luVG9wICsgKGJ1dHRvblNpemUgLSBidXR0b25NaW5pU2l6ZSkgLyAyKSkK
KyAgICAsIG1fdm9sdW1lU2xpZGVyQnV0dG9uKEhVREJ1dHRvbjo6Vm9sdW1lU2xpZGVyQnV0dG9u
LCBJbnRQb2ludCgwLCAwKSkKKyAgICAsIG1fdm9sdW1lRG93bkJ1dHRvbihIVURCdXR0b246OlZv
bHVtZURvd25CdXR0b24sIEludFBvaW50KG1hcmdpbiwgbWFyZ2luVG9wICsgKGJ1dHRvblNpemUg
LSBidXR0b25NaW5pU2l6ZSkgLyAyKSkKKyAgICAsIG1fZXhpdEZ1bGxzY3JlZW5CdXR0b24oSFVE
QnV0dG9uOjpFeGl0RnVsbHNjcmVlbkJ1dHRvbiwgSW50UG9pbnQod2luZG93V2lkdGggLSAyICog
bWFyZ2luIC0gYnV0dG9uTWluaVNpemUsIG1hcmdpblRvcCArIChidXR0b25TaXplIC0gYnV0dG9u
TWluaVNpemUpIC8gMikpCisgICAgLCBtX3ZvbHVtZVNsaWRlcihIVURTbGlkZXI6OlJvdW5kQnV0
dG9uLCB2b2x1bWVTbGlkZXJCdXR0b25TaXplLCBJbnRSZWN0KEludFBvaW50KG1hcmdpbiArIGJ1
dHRvbk1pbmlTaXplLCBtYXJnaW5Ub3AgKyAoYnV0dG9uU2l6ZSAtIGJ1dHRvbk1pbmlTaXplKSAv
IDIgKyBidXR0b25NaW5pU2l6ZSAvIDIgLSBzbGlkZXJIZWlnaHQgLyAyKSwgSW50U2l6ZSh2b2x1
bWVTbGlkZXJXaWR0aCwgc2xpZGVySGVpZ2h0KSkpCisgICAgLCBtX3RpbWVTbGlkZXIoSFVEU2xp
ZGVyOjpEaWFtb25kQnV0dG9uLCB0aW1lU2xpZGVyQnV0dG9uU2l6ZSwgSW50UmVjdChJbnRQb2lu
dCh3aW5kb3dXaWR0aCAvIDIgLSB0aW1lU2xpZGVyV2lkdGggLyAyLCB3aW5kb3dIZWlnaHQgLSBt
YXJnaW4gLSBzbGlkZXJIZWlnaHQpLCBJbnRTaXplKHRpbWVTbGlkZXJXaWR0aCwgc2xpZGVySGVp
Z2h0KSkpCisgICAgLCBtX2hpdFdpZGdldCgwKQorICAgICwgbV9tb3ZpbmdXaW5kb3coZmFsc2Up
CisgICAgLCBtX3RpbWVyKHRoaXMsICZGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp0aW1lckZp
cmVkKQoreworfQorCitGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjp+RnVsbHNjcmVlblZpZGVv
Q29udHJvbGxlcigpCit7CisgICAgaWYgKG1vdmllKCkpCisgICAgICAgIG1vdmllKCktPmV4aXRG
dWxsc2NyZWVuKCk7Cit9CisKK1FUTW92aWVXaW4qIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6
Om1vdmllKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9tZWRpYUVsZW1lbnQgPyByZWludGVycHJl
dF9jYXN0PFFUTW92aWVXaW4qPihtX21lZGlhRWxlbWVudC0+cGxhdGZvcm1NZWRpYSgpLnF0TW92
aWUpIDogMDsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpzZXRNZWRpYUVs
ZW1lbnQoSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50KQoreworICAgIGlmIChtZWRpYUVs
ZW1lbnQgPT0gbV9tZWRpYUVsZW1lbnQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fbWVkaWFF
bGVtZW50ID0gbWVkaWFFbGVtZW50OworICAgIGlmICghbV9tZWRpYUVsZW1lbnQpIHsKKyAgICAg
ICAgLy8gQ2FuJ3QgZG8gZnVsbC1zY3JlZW4sIGp1c3QgZ2V0IG91dAorICAgICAgICBleGl0RnVs
bHNjcmVlbigpOworICAgIH0KK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpl
bnRlckZ1bGxzY3JlZW4oKQoreworICAgIGlmICghbW92aWUoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV92aWRlb1dpbmRvdyA9IG1vdmllKCktPmVudGVyRnVsbHNjcmVlbih0aGlzKTsKKwor
ICAgIFJFQ1Qgd2luZG93UmVjdDsKKyAgICBHZXRDbGllbnRSZWN0KG1fdmlkZW9XaW5kb3csICZ3
aW5kb3dSZWN0KTsKKyAgICBtX2Z1bGxzY3JlZW5TaXplLnNldFdpZHRoKHdpbmRvd1JlY3Qucmln
aHQgLSB3aW5kb3dSZWN0LmxlZnQpOworICAgIG1fZnVsbHNjcmVlblNpemUuc2V0SGVpZ2h0KHdp
bmRvd1JlY3QuYm90dG9tIC0gd2luZG93UmVjdC50b3ApOworCisgICAgY3JlYXRlSFVEV2luZG93
KCk7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6ZXhpdEZ1bGxzY3JlZW4o
KQoreworICAgIGlmIChtb3ZpZSgpKQorICAgICAgICBtb3ZpZSgpLT5leGl0RnVsbHNjcmVlbigp
OworCisgICAgbV92aWRlb1dpbmRvdyA9IDA7CisgICAgU2V0V2luZG93TG9uZ1B0cihtX2h1ZFdp
bmRvdywgMCwgMCk7CisgICAgRGVzdHJveVdpbmRvdyhtX2h1ZFdpbmRvdyk7CisgICAgbV9odWRX
aW5kb3cgPSAwOworfQorCitib29sIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmNhblBsYXko
KSBjb25zdAoreworICAgIHJldHVybiBtX21lZGlhRWxlbWVudCAmJiBtX21lZGlhRWxlbWVudC0+
Y2FuUGxheSgpOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OnBsYXkoKQor
eworICAgIGlmIChtX21lZGlhRWxlbWVudCkKKyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPnBsYXko
KTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpwYXVzZSgpCit7CisgICAg
aWYgKG1fbWVkaWFFbGVtZW50KQorICAgICAgICBtX21lZGlhRWxlbWVudC0+cGF1c2UoKTsKK30K
KworZmxvYXQgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjo6dm9sdW1lKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV9tZWRpYUVsZW1lbnQgPyBtX21lZGlhRWxlbWVudC0+dm9sdW1lKCkgOiAwOwor
fQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OnNldFZvbHVtZShmbG9hdCB2b2x1
bWUpCit7CisgICAgaWYgKG1fbWVkaWFFbGVtZW50KSB7CisgICAgICAgIEV4Y2VwdGlvbkNvZGUg
ZWM7CisgICAgICAgIG1fbWVkaWFFbGVtZW50LT5zZXRWb2x1bWUodm9sdW1lLCBlYyk7CisgICAg
fQorfQorCitmbG9hdCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpjdXJyZW50VGltZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fbWVkaWFFbGVtZW50ID8gbV9tZWRpYUVsZW1lbnQtPmN1cnJl
bnRUaW1lKCkgOiAwOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OnNldEN1
cnJlbnRUaW1lKGZsb2F0IHZhbHVlKQoreworICAgIGlmIChtX21lZGlhRWxlbWVudCkgeworICAg
ICAgICBFeGNlcHRpb25Db2RlIGVjOworICAgICAgICBtX21lZGlhRWxlbWVudC0+c2V0Q3VycmVu
dFRpbWUodmFsdWUsIGVjKTsKKyAgICB9Cit9CisKK2Zsb2F0IEZ1bGxzY3JlZW5WaWRlb0NvbnRy
b2xsZXI6OmR1cmF0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9tZWRpYUVsZW1lbnQgPyBt
X21lZGlhRWxlbWVudC0+ZHVyYXRpb24oKSA6IDA7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVv
Q29udHJvbGxlcjo6YmVnaW5TY3J1YmJpbmcoKQoreworICAgIGlmIChtX21lZGlhRWxlbWVudCkg
CisgICAgICAgIG1fbWVkaWFFbGVtZW50LT5iZWdpblNjcnViYmluZygpOworfQorCit2b2lkIEZ1
bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmVuZFNjcnViYmluZygpCit7CisgICAgaWYgKG1fbWVk
aWFFbGVtZW50KSAKKyAgICAgICAgbV9tZWRpYUVsZW1lbnQtPmVuZFNjcnViYmluZygpOworfQor
CitMUkVTVUxUIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmZ1bGxzY3JlZW5DbGllbnRXbmRQ
cm9jKEhXTkQgd25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0p
Cit7CisgICAgc3dpdGNoIChtZXNzYWdlKSB7CisgICAgY2FzZSBXTV9DSEFSOgorICAgICAgICBv
bkNoYXIod1BhcmFtKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoK
KyAgICAgICAgb25Nb3VzZURvd24oSW50UG9pbnQoR0VUX1hfTFBBUkFNKGxQYXJhbSksIEdFVF9Z
X0xQQVJBTShsUGFyYW0pKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV01fTU9VU0VNT1ZF
OgorICAgICAgICBvbk1vdXNlTW92ZShJbnRQb2ludChHRVRfWF9MUEFSQU0obFBhcmFtKSwgR0VU
X1lfTFBBUkFNKGxQYXJhbSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9MQlVUVE9O
VVA6CisgICAgICAgIG9uTW91c2VVcChJbnRQb2ludChHRVRfWF9MUEFSQU0obFBhcmFtKSwgR0VU
X1lfTFBBUkFNKGxQYXJhbSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJu
IERlZldpbmRvd1Byb2Mod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisKK3N0YXRp
YyBjb25zdCBMUENXU1RSIGZ1bGxzY3JlZW5WaWRlZW9IVURXaW5kb3dDbGFzc05hbWUgPSBMImZ1
bGxzY3JlZW5WaWRlZW9IVURXaW5kb3dDbGFzcyI7CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29u
dHJvbGxlcjo6cmVnaXN0ZXJIVURXaW5kb3dDbGFzcygpCit7CisgICAgc3RhdGljIGJvb2wgaGF2
ZVJlZ2lzdGVyZWRIVURXaW5kb3dDbGFzczsKKyAgICBpZiAoaGF2ZVJlZ2lzdGVyZWRIVURXaW5k
b3dDbGFzcykKKyAgICAgICAgcmV0dXJuOworCisgICAgaGF2ZVJlZ2lzdGVyZWRIVURXaW5kb3dD
bGFzcyA9IHRydWU7CisKKyAgICBXTkRDTEFTU0VYIHdjZXg7CisKKyAgICB3Y2V4LmNiU2l6ZSA9
IHNpemVvZihXTkRDTEFTU0VYKTsKKworICAgIHdjZXguc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1Nf
VlJFRFJBVzsKKyAgICB3Y2V4LmxwZm5XbmRQcm9jID0gaHVkV25kUHJvYzsKKyAgICB3Y2V4LmNi
Q2xzRXh0cmEgPSAwOworICAgIHdjZXguY2JXbmRFeHRyYSA9IDQ7CisgICAgd2NleC5oSW5zdGFu
Y2UgPSBnSW5zdGFuY2U7CisgICAgd2NleC5oSWNvbiA9IDA7CisgICAgd2NleC5oQ3Vyc29yID0g
TG9hZEN1cnNvcigwLCBJRENfQVJST1cpOworICAgIHdjZXguaGJyQmFja2dyb3VuZCA9IDA7Cisg
ICAgd2NleC5scHN6TWVudU5hbWUgPSAwOworICAgIHdjZXgubHBzekNsYXNzTmFtZSA9IGZ1bGxz
Y3JlZW5WaWRlZW9IVURXaW5kb3dDbGFzc05hbWU7CisgICAgd2NleC5oSWNvblNtID0gMDsKKwor
ICAgIFJlZ2lzdGVyQ2xhc3NFeCgmd2NleCk7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29u
dHJvbGxlcjo6Y3JlYXRlSFVEV2luZG93KCkKK3sKKyAgICBtX2h1ZFBvc2l0aW9uLnNldFgoKG1f
ZnVsbHNjcmVlblNpemUud2lkdGgoKSAtIHdpbmRvd1dpZHRoKSAvIDIpOworICAgIG1faHVkUG9z
aXRpb24uc2V0WShtX2Z1bGxzY3JlZW5TaXplLmhlaWdodCgpICogaW5pdGlhbEhVRFBvc2l0aW9u
WSAtIHdpbmRvd0hlaWdodCAvIDIpOworCisgICAgLy8gTG9jYWwgdmFyaWFibGUgdGhhdCB3aWxs
IGhvbGQgdGhlIHJldHVybmVkIHBpeGVscy4gTm8gbmVlZCB0byBjbGVhbnVwIHRoaXMgdmFsdWUu
IEl0CisgICAgLy8gd2lsbCBnZXQgY2xlYW5lZCB1cCB3aGVuIG1fYml0bWFwIGlzIGRlc3Ryb3ll
ZCBpbiB0aGUgZHRvcgorICAgIHZvaWQqIHBpeGVsczsKKyAgICBCaXRtYXBJbmZvIGJpdG1hcElu
Zm8gPSBCaXRtYXBJbmZvOjpjcmVhdGVCb3R0b21VcChJbnRTaXplKHdpbmRvd1dpZHRoLCB3aW5k
b3dIZWlnaHQpKTsKKyAgICBtX2JpdG1hcC5zZXQoOjpDcmVhdGVESUJTZWN0aW9uKDAsICZiaXRt
YXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJnBpeGVscywgMCwgMCkpOworICAgIAorICAgIC8vIERp
cnR5IHRoZSB3aW5kb3cgc28gdGhlIEhVRCBkcmF3cworICAgIFJFQ1QgY2xlYXJSZWN0ID0geyBt
X2h1ZFBvc2l0aW9uLngoKSwgbV9odWRQb3NpdGlvbi55KCksIG1faHVkUG9zaXRpb24ueCgpICsg
d2luZG93V2lkdGgsIG1faHVkUG9zaXRpb24ueSgpICsgd2luZG93SGVpZ2h0IH07CisgICAgSW52
YWxpZGF0ZVJlY3QobV92aWRlb1dpbmRvdywgJmNsZWFyUmVjdCwgdHJ1ZSk7CisKKyAgICBtX3Bs
YXlQYXVzZUJ1dHRvbi5zZXRTaG93QWx0QnV0dG9uKCFjYW5QbGF5KCkpOworICAgIG1fdm9sdW1l
U2xpZGVyLnNldFZhbHVlKHZvbHVtZSgpKTsKKyAgICBtX3RpbWVTbGlkZXIuc2V0VmFsdWUoY3Vy
cmVudFRpbWUoKSAvIGR1cmF0aW9uKCkpOworCisgICAgaWYgKCFjYW5QbGF5KCkpCisgICAgICAg
IG1fdGltZXIuc3RhcnRSZXBlYXRpbmcodGltZXJJbnRlcnZhbCk7CisKKyAgICByZWdpc3RlckhV
RFdpbmRvd0NsYXNzKCk7CisKKyAgICBtX2h1ZFdpbmRvdyA9IENyZWF0ZVdpbmRvd0V4KFdTX0VY
X0xBWUVSRUQgfCBXU19FWF9UUkFOU1BBUkVOVCB8IFdTX0VYX1RPUE1PU1QgfCBXU19FWF9UT09M
V0lORE9XLCAKKyAgICAgICAgZnVsbHNjcmVlblZpZGVlb0hVRFdpbmRvd0NsYXNzTmFtZSwgMCwg
V1NfUE9QVVAgfCBXU19WSVNJQkxFLAorICAgICAgICBtX2h1ZFBvc2l0aW9uLngoKSwgbV9odWRQ
b3NpdGlvbi55KCksIDAsIDAsIDAsIDAsIGdJbnN0YW5jZSwgMCk7CisgICAgQVNTRVJUKDo6SXNX
aW5kb3cobV9odWRXaW5kb3cpKTsKKyAgICBTZXRXaW5kb3dMb25nUHRyKG1faHVkV2luZG93LCAw
LCByZWludGVycHJldF9jYXN0PExPTkdfUFRSPih0aGlzKSk7CisKKyAgICBkcmF3KCk7Cit9CisK
K3N0YXRpYyBTdHJpbmcgdGltZVRvU3RyaW5nKGZsb2F0IHRpbWUpCit7CisgICAgaWYgKCFpc2Zp
bml0ZSh0aW1lKSkKKyAgICAgICAgdGltZSA9IDA7CisgICAgaW50IHNlY29uZHMgPSBmYWJzZih0
aW1lKTsgCisgICAgaW50IGhvdXJzID0gc2Vjb25kcyAvICg2MCAqIDYwKTsKKyAgICBpbnQgbWlu
dXRlcyA9IChzZWNvbmRzIC8gNjApICUgNjA7CisgICAgc2Vjb25kcyAlPSA2MDsKKworICAgIGlm
IChob3VycykgeworICAgICAgICBpZiAoaG91cnMgPiA5KQorICAgICAgICAgICAgcmV0dXJuIFN0
cmluZzo6Zm9ybWF0KCIlcyUwMmQ6JTAyZDolMDJkIiwgKHRpbWUgPCAwID8gIi0iIDogIiIpLCBo
b3VycywgbWludXRlcywgc2Vjb25kcyk7CisgICAgICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgi
JXMlMDFkOiUwMmQ6JTAyZCIsICh0aW1lIDwgMCA/ICItIiA6ICIiKSwgaG91cnMsIG1pbnV0ZXMs
IHNlY29uZHMpOworICAgIH0KKworICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJXMlMDJkOiUw
MmQiLCAodGltZSA8IDAgPyAiLSIgOiAiIiksIG1pbnV0ZXMsIHNlY29uZHMpOworfQorCit2b2lk
IEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6OmRyYXcoKQoreworICAgIEhEQyB3aW5kb3dEQyA9
IEdldERDKG1faHVkV2luZG93KTsKKyAgICBIREMgYml0bWFwREMgPSBDcmVhdGVDb21wYXRpYmxl
REMod2luZG93REMpOworICAgIDo6UmVsZWFzZURDKG1faHVkV2luZG93LCB3aW5kb3dEQyk7Cisg
ICAgU2VsZWN0T2JqZWN0KGJpdG1hcERDLCBtX2JpdG1hcC5nZXQoKSk7CisKKyAgICBHcmFwaGlj
c0NvbnRleHQgY29udGV4dChiaXRtYXBEQywgdHJ1ZSk7CisKKyAgICBjb250ZXh0LnNhdmUoKTsK
KworICAgIC8vIERyYXcgdGhlIGJhY2tncm91bmQKKyAgICBJbnRTaXplIG91dGVyUmFkaXVzKGJv
cmRlclJhZGl1cywgYm9yZGVyUmFkaXVzKTsKKyAgICBJbnRSZWN0IG91dGVyUmVjdCgwLCAwLCB3
aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTsKKyAgICBJbnRTaXplIGlubmVyUmFkaXVzKGJvcmRl
clJhZGl1cyAtIGJvcmRlclRoaWNrbmVzcywgYm9yZGVyUmFkaXVzIC0gYm9yZGVyVGhpY2tuZXNz
KTsKKyAgICBJbnRSZWN0IGlubmVyUmVjdChib3JkZXJUaGlja25lc3MsIGJvcmRlclRoaWNrbmVz
cywgd2luZG93V2lkdGggLSBib3JkZXJUaGlja25lc3MgKiAyLCB3aW5kb3dIZWlnaHQgLSBib3Jk
ZXJUaGlja25lc3MgKiAyKTsKKworICAgIGNvbnRleHQuZmlsbFJvdW5kZWRSZWN0KG91dGVyUmVj
dCwgb3V0ZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBvdXRlclJhZGl1cywgb3V0ZXJSYWRpdXMsIENv
bG9yKGJvcmRlckNvbG9yKSwgRGV2aWNlQ29sb3JTcGFjZSk7CisgICAgY29udGV4dC5zZXRDb21w
b3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlQ29weSk7CisgICAgY29udGV4dC5maWxsUm91bmRlZFJl
Y3QoaW5uZXJSZWN0LCBpbm5lclJhZGl1cywgaW5uZXJSYWRpdXMsIGlubmVyUmFkaXVzLCBpbm5l
clJhZGl1cywgQ29sb3IoYmFja2dyb3VuZENvbG9yKSwgRGV2aWNlQ29sb3JTcGFjZSk7CisKKyAg
ICAvLyBEcmF3IHRoZSB3aWRnZXRzCisgICAgbV9wbGF5UGF1c2VCdXR0b24uZHJhdyhjb250ZXh0
KTsKKyAgICBtX3ZvbHVtZVVwQnV0dG9uLmRyYXcoY29udGV4dCk7CisgICAgbV92b2x1bWVTbGlk
ZXJCdXR0b24uZHJhdyhjb250ZXh0KTsKKyAgICBtX3ZvbHVtZURvd25CdXR0b24uZHJhdyhjb250
ZXh0KTsKKyAgICBtX3RpbWVTbGlkZXJCdXR0b24uZHJhdyhjb250ZXh0KTsKKyAgICBtX2V4aXRG
dWxsc2NyZWVuQnV0dG9uLmRyYXcoY29udGV4dCk7CisgICAgbV92b2x1bWVTbGlkZXIuZHJhdyhj
b250ZXh0KTsKKyAgICBtX3RpbWVTbGlkZXIuZHJhdyhjb250ZXh0KTsKKworICAgIC8vIERyYXcg
dGhlIHRleHQgc3RyaW5ncworICAgIEZvbnREZXNjcmlwdGlvbiBkZXNjOworCisgICAgTk9OQ0xJ
RU5UTUVUUklDUyBtZXRyaWNzOworICAgIG1ldHJpY3MuY2JTaXplID0gc2l6ZW9mKG1ldHJpY3Mp
OworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvKFNQSV9HRVROT05DTElFTlRNRVRSSUNTLCBtZXRy
aWNzLmNiU2l6ZSwgJm1ldHJpY3MsIDApOworICAgIEZvbnRGYW1pbHkgZmFtaWx5OworICAgIGZh
bWlseS5zZXRGYW1pbHkobWV0cmljcy5sZlNtQ2FwdGlvbkZvbnQubGZGYWNlTmFtZSk7CisgICAg
ZGVzYy5zZXRGYW1pbHkoZmFtaWx5KTsKKworICAgIGRlc2Muc2V0Q29tcHV0ZWRTaXplKHRleHRT
aXplKTsKKyAgICBGb250IGZvbnQgPSBGb250KGRlc2MsIDAsIDApOworICAgIGZvbnQudXBkYXRl
KDApOworCisgICAgU3RyaW5nIHM7CisKKyAgICAvLyBUaGUgeSBwb3NpdGlvbmluZyBvZiB0aGVz
ZSB0d28gdGV4dCBzdHJpbmdzIGlzIHRyaWNreSBiZWNhdXNlIHRoZXkgYXJlIHNvIHNtYWxsLiBU
aGV5CisgICAgLy8gYXJlIGN1cnJlbnRseSBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIHRoZSBjZW50
ZXIgb2YgdGhlIHNsaWRlciBhbmQgdGhlbiBkb3duIHRoZSBmb250CisgICAgLy8gaGVpZ2h0IC8g
NCAod2hpY2ggaXMgYWN0dWFsbHkgaGFsZiBvZiBmb250IGhlaWdodCAvMiksIHdoaWNoIHBvc2l0
aW9ucyB0aGUgY2VudGVyIG9mCisgICAgLy8gdGhlIHRleHQgYXQgdGhlIGNlbnRlciBvZiB0aGUg
c2xpZGVyLgorICAgIC8vIExlZnQgc3RyaW5nCisgICAgcyA9IHRpbWVUb1N0cmluZyhjdXJyZW50
VGltZSgpKTsKKyAgICBUZXh0UnVuIGxlZnRUZXh0KHMpOworICAgIGNvbnRleHQuc2V0RmlsbENv
bG9yKENvbG9yKHRleHRDb2xvciksIERldmljZUNvbG9yU3BhY2UpOworICAgIGNvbnRleHQuZHJh
d1RleHQoZm9udCwgbGVmdFRleHQsIEludFBvaW50KHdpbmRvd1dpZHRoIC8gMiAtIHRpbWVTbGlk
ZXJXaWR0aCAvIDIgLSBtYXJnaW4gLSBmb250LndpZHRoKGxlZnRUZXh0KSwgd2luZG93SGVpZ2h0
IC0gbWFyZ2luIC0gc2xpZGVySGVpZ2h0IC8gMiArIGZvbnQuaGVpZ2h0KCkgLyA0KSk7CisKKyAg
ICAvLyBSaWdodCBzdHJpbmcKKyAgICBzID0gdGltZVRvU3RyaW5nKGN1cnJlbnRUaW1lKCkgLSBk
dXJhdGlvbigpKTsKKyAgICBUZXh0UnVuIHJpZ2h0VGV4dChzKTsKKyAgICBjb250ZXh0LnNldEZp
bGxDb2xvcihDb2xvcih0ZXh0Q29sb3IpLCBEZXZpY2VDb2xvclNwYWNlKTsKKyAgICBjb250ZXh0
LmRyYXdUZXh0KGZvbnQsIHJpZ2h0VGV4dCwgSW50UG9pbnQod2luZG93V2lkdGggLyAyICsgdGlt
ZVNsaWRlcldpZHRoIC8gMiArIG1hcmdpbiwgd2luZG93SGVpZ2h0IC0gbWFyZ2luIC0gc2xpZGVy
SGVpZ2h0IC8gMiArIGZvbnQuaGVpZ2h0KCkgLyA0KSk7CisKKyAgICAvLyBDb3B5IHRvIHRoZSB3
aW5kb3cKKyAgICBCTEVOREZVTkNUSU9OIGJsZW5kRnVuY3Rpb24gPSB7QUNfU1JDX09WRVIsIDAs
IDI1NSwgQUNfU1JDX0FMUEhBfTsKKyAgICBTSVpFIHNpemUgPSB7IHdpbmRvd1dpZHRoLCB3aW5k
b3dIZWlnaHQgfTsKKyAgICBQT0lOVCBzb3VyY2VQb2ludCA9IHswLCAwfTsKKyAgICBQT0lOVCBk
ZXN0UG9pbnQgPSB7IG1faHVkUG9zaXRpb24ueCgpLCBtX2h1ZFBvc2l0aW9uLnkoKSB9OworICAg
IEJPT0wgcmVzdWx0ID0gVXBkYXRlTGF5ZXJlZFdpbmRvdyhtX2h1ZFdpbmRvdywgMCwgJmRlc3RQ
b2ludCwgJnNpemUsIGJpdG1hcERDLCAmc291cmNlUG9pbnQsIDAsICZibGVuZEZ1bmN0aW9uLCBV
TFdfQUxQSEEpOworCisgICAgY29udGV4dC5yZXN0b3JlKCk7CisKKyAgICA6OkRlbGV0ZURDKGJp
dG1hcERDKTsKK30KKworTFJFU1VMVCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpodWRXbmRQ
cm9jKEhXTkQgd25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0p
Cit7CisgICAgTE9OR19QVFIgbG9uZ1B0ciA9IEdldFdpbmRvd0xvbmdQdHIod25kLCAwKTsKKyAg
ICBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKiBjb250cm9sbGVyID0gcmVpbnRlcnByZXRfY2Fz
dDxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyKj4obG9uZ1B0cik7CisgICAgaWYgKCFjb250cm9s
bGVyKQorICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwg
bFBhcmFtKTsKKworICAgIHN3aXRjaCAobWVzc2FnZSkgeworICAgIGNhc2UgV01fQ0hBUjoKKyAg
ICAgICAgY29udHJvbGxlci0+b25DaGFyKHdQYXJhbSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgV01fTEJVVFRPTkRPV046CisgICAgICAgIGNvbnRyb2xsZXItPm9uTW91c2VEb3duKEludFBv
aW50KEdFVF9YX0xQQVJBTShsUGFyYW0pLCBHRVRfWV9MUEFSQU0obFBhcmFtKSkpOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFdNX01PVVNFTU9WRToKKyAgICAgICAgY29udHJvbGxlci0+b25N
b3VzZU1vdmUoSW50UG9pbnQoR0VUX1hfTFBBUkFNKGxQYXJhbSksIEdFVF9ZX0xQQVJBTShsUGFy
YW0pKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV01fTEJVVFRPTlVQOgorICAgICAgICBj
b250cm9sbGVyLT5vbk1vdXNlVXAoSW50UG9pbnQoR0VUX1hfTFBBUkFNKGxQYXJhbSksIEdFVF9Z
X0xQQVJBTShsUGFyYW0pKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBE
ZWZXaW5kb3dQcm9jKHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworfQorCit2b2lkIEZ1
bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6Om9uQ2hhcihpbnQgYykKK3sKKyAgICBpZiAoYyA9PSBW
S19FU0NBUEUpIHsKKyAgICAgICAgaWYgKG1fbWVkaWFFbGVtZW50KQorICAgICAgICAgICAgbV9t
ZWRpYUVsZW1lbnQtPmV4aXRGdWxsc2NyZWVuKCk7CisgICAgfSBlbHNlIGlmIChjID09IFZLX1NQ
QUNFKQorICAgICAgICB0b2dnbGVQbGF5KCk7Cit9CisKK3ZvaWQgRnVsbHNjcmVlblZpZGVvQ29u
dHJvbGxlcjo6dGltZXJGaXJlZChUaW1lcjxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyPiopCit7
CisgICAgLy8gVXBkYXRlIHRoZSB0aW1lIHNsaWRlcgorICAgIG1fdGltZVNsaWRlci5zZXRWYWx1
ZShjdXJyZW50VGltZSgpIC8gZHVyYXRpb24oKSk7CisgICAgZHJhdygpOworfQorCit2b2lkIEZ1
bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI6Om9uTW91c2VEb3duKGNvbnN0IEludFBvaW50JiBwb2lu
dCkKK3sKKyAgICBJbnRQb2ludCBjb252ZXJ0ZWRQb2ludChmdWxsU2NyZWVuVG9IVURDb29yZGlu
YXRlcyhwb2ludCkpOworCisgICAgLy8gRG9uJ3QgYm90aGVyIGhpdCB0ZXN0aW5nIGlmIHdlJ3Jl
IG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgd2luZG93CisgICAgaWYgKGNvbnZlcnRlZFBvaW50
LngoKSA8IDAgfHwgY29udmVydGVkUG9pbnQueCgpID49IHdpbmRvd1dpZHRoIHx8IGNvbnZlcnRl
ZFBvaW50LnkoKSA8IDAgfHwgY29udmVydGVkUG9pbnQueSgpID49IHdpbmRvd0hlaWdodCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9oaXRXaWRnZXQgPSAwOworICAgIG1fbW92aW5nV2luZG93
ID0gZmFsc2U7CisKKyAgICBpZiAobV9wbGF5UGF1c2VCdXR0b24uaGl0VGVzdChjb252ZXJ0ZWRQ
b2ludCkpCisgICAgICAgIG1faGl0V2lkZ2V0ID0gJm1fcGxheVBhdXNlQnV0dG9uOworICAgIGVs
c2UgaWYgKG1fZXhpdEZ1bGxzY3JlZW5CdXR0b24uaGl0VGVzdChjb252ZXJ0ZWRQb2ludCkpCisg
ICAgICAgIG1faGl0V2lkZ2V0ID0gJm1fZXhpdEZ1bGxzY3JlZW5CdXR0b247CisgICAgZWxzZSBp
ZiAobV92b2x1bWVVcEJ1dHRvbi5oaXRUZXN0KGNvbnZlcnRlZFBvaW50KSkKKyAgICAgICAgbV9o
aXRXaWRnZXQgPSAmbV92b2x1bWVVcEJ1dHRvbjsKKyAgICBlbHNlIGlmIChtX3ZvbHVtZURvd25C
dXR0b24uaGl0VGVzdChjb252ZXJ0ZWRQb2ludCkpCisgICAgICAgIG1faGl0V2lkZ2V0ID0gJm1f
dm9sdW1lRG93bkJ1dHRvbjsKKyAgICBlbHNlIGlmIChtX3ZvbHVtZVNsaWRlci5oaXRUZXN0KGNv
bnZlcnRlZFBvaW50KSkgeworICAgICAgICBtX2hpdFdpZGdldCA9ICZtX3ZvbHVtZVNsaWRlcjsK
KyAgICAgICAgbV92b2x1bWVTbGlkZXIuZHJhZyhjb252ZXJ0ZWRQb2ludCwgdHJ1ZSk7CisgICAg
ICAgIHNldFZvbHVtZShtX3ZvbHVtZVNsaWRlci52YWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1f
dGltZVNsaWRlci5oaXRUZXN0KGNvbnZlcnRlZFBvaW50KSkgeworICAgICAgICBtX2hpdFdpZGdl
dCA9ICZtX3RpbWVTbGlkZXI7CisgICAgICAgIG1fdGltZVNsaWRlci5kcmFnKGNvbnZlcnRlZFBv
aW50LCB0cnVlKTsKKyAgICAgICAgYmVnaW5TY3J1YmJpbmcoKTsKKyAgICAgICAgc2V0Q3VycmVu
dFRpbWUobV90aW1lU2xpZGVyLnZhbHVlKCkgKiBkdXJhdGlvbigpKTsKKyAgICB9CisKKyAgICAv
LyBJZiB3ZSBkaWQgbm90IHBpY2sgYW55IG9mIG91ciB3aWRnZXRzIHdlIGFyZSBzdGFydGluZyBh
IHdpbmRvdyBtb3ZlCisgICAgaWYgKCFtX2hpdFdpZGdldCkgeworICAgICAgICBtX21vdmVPZmZz
ZXQgPSBjb252ZXJ0ZWRQb2ludDsKKyAgICAgICAgbV9tb3ZpbmdXaW5kb3cgPSB0cnVlOworICAg
IH0KKworICAgIGRyYXcoKTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyOjpv
bk1vdXNlTW92ZShjb25zdCBJbnRQb2ludCYgcG9pbnQpCit7CisgICAgSW50UG9pbnQgY29udmVy
dGVkUG9pbnQoZnVsbFNjcmVlblRvSFVEQ29vcmRpbmF0ZXMocG9pbnQpKTsKKworICAgIGlmICht
X2hpdFdpZGdldCkgeworICAgICAgICBtX2hpdFdpZGdldC0+ZHJhZyhjb252ZXJ0ZWRQb2ludCwg
ZmFsc2UpOworICAgICAgICBpZiAobV9oaXRXaWRnZXQgPT0gJm1fdm9sdW1lU2xpZGVyKQorICAg
ICAgICAgICAgc2V0Vm9sdW1lKG1fdm9sdW1lU2xpZGVyLnZhbHVlKCkpOworICAgICAgICBlbHNl
IGlmIChtX2hpdFdpZGdldCA9PSAmbV90aW1lU2xpZGVyKQorICAgICAgICAgICAgc2V0Q3VycmVu
dFRpbWUobV90aW1lU2xpZGVyLnZhbHVlKCkgKiBkdXJhdGlvbigpKTsKKyAgICAgICAgZHJhdygp
OworICAgIH0gZWxzZSBpZiAobV9tb3ZpbmdXaW5kb3cpCisgICAgICAgIG1faHVkUG9zaXRpb24u
bW92ZShjb252ZXJ0ZWRQb2ludC54KCkgLSBtX21vdmVPZmZzZXQueCgpLCBjb252ZXJ0ZWRQb2lu
dC55KCkgLSBtX21vdmVPZmZzZXQueSgpKTsKK30KKwordm9pZCBGdWxsc2NyZWVuVmlkZW9Db250
cm9sbGVyOjpvbk1vdXNlVXAoY29uc3QgSW50UG9pbnQmIHBvaW50KQoreworICAgIEludFBvaW50
IGNvbnZlcnRlZFBvaW50KGZ1bGxTY3JlZW5Ub0hVRENvb3JkaW5hdGVzKHBvaW50KSk7CisgICAg
bV9tb3ZpbmdXaW5kb3cgPSBmYWxzZTsKKworICAgIGlmIChtX2hpdFdpZGdldCkgeworICAgICAg
ICBpZiAobV9oaXRXaWRnZXQgPT0gJm1fcGxheVBhdXNlQnV0dG9uICYmIG1fcGxheVBhdXNlQnV0
dG9uLmhpdFRlc3QoY29udmVydGVkUG9pbnQpKQorICAgICAgICAgICAgdG9nZ2xlUGxheSgpOwor
ICAgICAgICBlbHNlIGlmIChtX2hpdFdpZGdldCA9PSAmbV92b2x1bWVVcEJ1dHRvbiAmJiBtX3Zv
bHVtZVVwQnV0dG9uLmhpdFRlc3QoY29udmVydGVkUG9pbnQpKSB7CisgICAgICAgICAgICBzZXRW
b2x1bWUoMSk7CisgICAgICAgICAgICBtX3ZvbHVtZVNsaWRlci5zZXRWYWx1ZSgxKTsKKyAgICAg
ICAgfSBlbHNlIGlmIChtX2hpdFdpZGdldCA9PSAmbV92b2x1bWVEb3duQnV0dG9uICYmIG1fdm9s
dW1lRG93bkJ1dHRvbi5oaXRUZXN0KGNvbnZlcnRlZFBvaW50KSkgeworICAgICAgICAgICAgc2V0
Vm9sdW1lKDApOworICAgICAgICAgICAgbV92b2x1bWVTbGlkZXIuc2V0VmFsdWUoMCk7CisgICAg
ICAgIH0gZWxzZSBpZiAobV9oaXRXaWRnZXQgPT0gJm1fdGltZVNsaWRlcikKKyAgICAgICAgICAg
IGVuZFNjcnViYmluZygpOworICAgICAgICBlbHNlIGlmIChtX2hpdFdpZGdldCA9PSAmbV9leGl0
RnVsbHNjcmVlbkJ1dHRvbiAmJiBtX2V4aXRGdWxsc2NyZWVuQnV0dG9uLmhpdFRlc3QoY29udmVy
dGVkUG9pbnQpKSB7CisgICAgICAgICAgICBpZiAobV9tZWRpYUVsZW1lbnQpCisgICAgICAgICAg
ICAgICAgbV9tZWRpYUVsZW1lbnQtPmV4aXRGdWxsc2NyZWVuKCk7CisgICAgICAgICAgICBtX2hp
dFdpZGdldCA9IDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBtX2hpdFdpZGdldCA9IDA7CisgICAgZHJhdygpOworfQorCit2b2lkIEZ1bGxzY3JlZW5WaWRl
b0NvbnRyb2xsZXI6OnRvZ2dsZVBsYXkoKQoreworICAgIGlmIChjYW5QbGF5KCkpCisgICAgICAg
IHBsYXkoKTsKKyAgICBlbHNlCisgICAgICAgIHBhdXNlKCk7CisKKyAgICBtX3BsYXlQYXVzZUJ1
dHRvbi5zZXRTaG93QWx0QnV0dG9uKCFjYW5QbGF5KCkpOworCisgICAgLy8gUnVuIGEgdGltZXIg
d2hpbGUgdGhlIHZpZGVvIGlzIHBsYXlpbmcgc28gd2UgY2FuIGtlZXAgdGhlIHRpbWUKKyAgICAv
LyBzbGlkZXIgYW5kIHRpbWUgdmFsdWVzIHVwIHRvIGRhdGUuCisgICAgaWYgKCFjYW5QbGF5KCkp
CisgICAgICAgIG1fdGltZXIuc3RhcnRSZXBlYXRpbmcodGltZXJJbnRlcnZhbCk7CisgICAgZWxz
ZQorICAgICAgICBtX3RpbWVyLnN0b3AoKTsKKworICAgIGRyYXcoKTsKK30KKworI2VuZGlmCklu
ZGV4OiBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvd2luL0Z1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIuaAkocmV2aXNpb24gMCkKKysr
IFdlYktpdC93aW4vRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlci5oCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxl
cl9oCisjZGVmaW5lIEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXJfaAorCisjaWYgRU5BQkxFKFZJ
REVPKQorCisjaW5jbHVkZSAiUVRNb3ZpZVdpbi5oIgorCisjaW5jbHVkZSA8V2ViQ29yZS9IVE1M
TWVkaWFFbGVtZW50Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbWFnZS5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvSW50UG9pbnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ludFNpemUuaD4KKyNpbmNsdWRl
IDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEdyYXBoaWNzQ29u
dGV4dDsKK30KKworY2xhc3MgSFVEV2lkZ2V0IHsKK3B1YmxpYzoKKyAgICBIVURXaWRnZXQoY29u
c3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCkgOiBtX3JlY3QocmVjdCkgeyB9CisgICAgCisgICAg
dmlydHVhbCB+SFVEV2lkZ2V0KCkgeyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZHJhdyhXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQmKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRyYWcoY29uc3QgV2Vi
Q29yZTo6SW50UG9pbnQmLCBib29sIHN0YXJ0KSA9IDA7CisgICAgYm9vbCBoaXRUZXN0KGNvbnN0
IFdlYkNvcmU6OkludFBvaW50JiBwb2ludCkgY29uc3QgeyByZXR1cm4gcG9pbnQueCgpID49IG1f
cmVjdC54KCkgJiYgcG9pbnQueCgpIDwgbV9yZWN0LngoKSArIG1fcmVjdC53aWR0aCgpICYmIHBv
aW50LnkoKSA+PSBtX3JlY3QueSgpICYmIHBvaW50LnkoKSA8IG1fcmVjdC55KCkgKyBtX3JlY3Qu
aGVpZ2h0KCk7IH0KKworcHJvdGVjdGVkOgorICAgIFdlYkNvcmU6OkludFJlY3QgbV9yZWN0Owor
fTsKKworY2xhc3MgSFVEQnV0dG9uIDogcHVibGljIEhVRFdpZGdldCB7CitwdWJsaWM6CisgICAg
ZW51bSBIVURCdXR0b25UeXBlIHsKKyAgICAgICAgTm9CdXR0b24sCisgICAgICAgIFBsYXlQYXVz
ZUJ1dHRvbiwKKyAgICAgICAgVGltZVNsaWRlckJ1dHRvbiwKKyAgICAgICAgVm9sdW1lVXBCdXR0
b24sCisgICAgICAgIFZvbHVtZVNsaWRlckJ1dHRvbiwKKyAgICAgICAgVm9sdW1lRG93bkJ1dHRv
biwKKyAgICAgICAgRXhpdEZ1bGxzY3JlZW5CdXR0b24KKyAgICB9OworCisgICAgSFVEQnV0dG9u
KEhVREJ1dHRvblR5cGUsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7CisgICAgfkhVREJ1dHRv
bigpIHsgfQorCisgICAgdmlydHVhbCB2b2lkIGRyYXcoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
Jik7CisgICAgdmlydHVhbCB2b2lkIGRyYWcoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmLCBib29s
IHN0YXJ0KSB7IH0KKyAgICB2b2lkIHNldFNob3dBbHRCdXR0b24oYm9vbCBiKSAgeyBtX3Nob3dB
bHRCdXR0b24gPSBiOyB9CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPFdlYkNvcmU6OkltYWdlPiBt
X2J1dHRvbkltYWdlOworICAgIFJlZlB0cjxXZWJDb3JlOjpJbWFnZT4gbV9idXR0b25JbWFnZUFs
dDsKKyAgICBIVURCdXR0b25UeXBlIG1fdHlwZTsKKyAgICBib29sIG1fc2hvd0FsdEJ1dHRvbjsK
K307CisKK2NsYXNzIEhVRFNsaWRlciA6IHB1YmxpYyBIVURXaWRnZXQgeworcHVibGljOgorICAg
IGVudW0gSFVEU2xpZGVyQnV0dG9uU2hhcGUgeyBSb3VuZEJ1dHRvbiwgRGlhbW9uZEJ1dHRvbiB9
OworCisgICAgSFVEU2xpZGVyKEhVRFNsaWRlckJ1dHRvblNoYXBlLCBpbnQgYnV0dG9uU2l6ZSwg
Y29uc3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCk7CisgICAgfkhVRFNsaWRlcigpIHsgfQorCisg
ICAgdmlydHVhbCB2b2lkIGRyYXcoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Jik7CisgICAgdmly
dHVhbCB2b2lkIGRyYWcoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmLCBib29sIHN0YXJ0KTsKKyAg
ICBmbG9hdCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihtX2J1dHRv
blBvc2l0aW9uKSAvIChtX3JlY3Qud2lkdGgoKSAtIG1fYnV0dG9uU2l6ZSk7IH0KKyAgICB2b2lk
IHNldFZhbHVlKGZsb2F0IHZhbHVlKSB7IG1fYnV0dG9uUG9zaXRpb24gPSBzdGF0aWNfY2FzdDxp
bnQ+KHZhbHVlICogKG1fcmVjdC53aWR0aCgpIC0gbV9idXR0b25TaXplKSk7IH0KKworcHJpdmF0
ZToKKyAgICBIVURTbGlkZXJCdXR0b25TaGFwZSBtX2J1dHRvblNoYXBlOworICAgIGludCBtX2J1
dHRvblNpemU7CisgICAgaW50IG1fYnV0dG9uUG9zaXRpb247CisgICAgaW50IG1fZHJhZ1N0YXJ0
T2Zmc2V0OworfTsKKworY2xhc3MgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlciA6IFFUTW92aWVX
aW5GdWxsc2NyZWVuQ2xpZW50LCBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgorICAgIEZ1
bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXIoKTsKKyAgICB2aXJ0dWFsIH5GdWxsc2NyZWVuVmlkZW9D
b250cm9sbGVyKCk7CisKKyAgICB2b2lkIHNldE1lZGlhRWxlbWVudChXZWJDb3JlOjpIVE1MTWVk
aWFFbGVtZW50Kik7CisgICAgV2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50
KCkgY29uc3QgeyByZXR1cm4gbV9tZWRpYUVsZW1lbnQuZ2V0KCk7IH0KKworICAgIHZvaWQgZW50
ZXJGdWxsc2NyZWVuKCk7CisgICAgdm9pZCBleGl0RnVsbHNjcmVlbigpOworCitwcml2YXRlOgor
ICAgIC8vIFFUTW92aWVXaW5GdWxsc2NyZWVuQ2xpZW50CisgICAgdmlydHVhbCBMUkVTVUxUIGZ1
bGxzY3JlZW5DbGllbnRXbmRQcm9jKEhXTkQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNLCBMUEFSQU0p
OworCisgICAgdm9pZCBlbnN1cmVXaW5kb3coKTsKKyAgICBRVE1vdmllV2luKiBtb3ZpZSgpIGNv
bnN0OworCisgICAgYm9vbCBjYW5QbGF5KCkgY29uc3Q7CisgICAgdm9pZCBwbGF5KCk7CisgICAg
dm9pZCBwYXVzZSgpOworICAgIGZsb2F0IHZvbHVtZSgpIGNvbnN0OworICAgIHZvaWQgc2V0Vm9s
dW1lKGZsb2F0KTsKKyAgICBmbG9hdCBjdXJyZW50VGltZSgpIGNvbnN0OworICAgIHZvaWQgc2V0
Q3VycmVudFRpbWUoZmxvYXQpOworICAgIGZsb2F0IGR1cmF0aW9uKCkgY29uc3Q7CisgICAgdm9p
ZCBiZWdpblNjcnViYmluZygpOworICAgIHZvaWQgZW5kU2NydWJiaW5nKCk7CisKKyAgICBXZWJD
b3JlOjpJbnRQb2ludCBmdWxsU2NyZWVuVG9IVURDb29yZGluYXRlcyhjb25zdCBXZWJDb3JlOjpJ
bnRQb2ludCYgcG9pbnQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gV2ViQ29yZTo6SW50
UG9pbnQocG9pbnQueCgpLSBtX2h1ZFBvc2l0aW9uLngoKSwgcG9pbnQueSgpIC0gbV9odWRQb3Np
dGlvbi55KCkpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVySFVEV2luZG93Q2xh
c3MoKTsKKyAgICBzdGF0aWMgTFJFU1VMVCBDQUxMQkFDSyBodWRXbmRQcm9jKEhXTkQsIFVJTlQg
bWVzc2FnZSwgV1BBUkFNLCBMUEFSQU0pOworICAgIHZvaWQgY3JlYXRlSFVEV2luZG93KCk7Cisg
ICAgdm9pZCB0aW1lckZpcmVkKFdlYkNvcmU6OlRpbWVyPEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xs
ZXI+Kik7CisKKyAgICB2b2lkIHRvZ2dsZVBsYXkoKTsKKyAgICB2b2lkIGRyYXcoKTsKKworICAg
IHZvaWQgb25DaGFyKGludCBjKTsKKyAgICB2b2lkIG9uTW91c2VEb3duKGNvbnN0IFdlYkNvcmU6
OkludFBvaW50Jik7CisgICAgdm9pZCBvbk1vdXNlTW92ZShjb25zdCBXZWJDb3JlOjpJbnRQb2lu
dCYpOworICAgIHZvaWQgb25Nb3VzZVVwKGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7CisKKyAg
ICBSZWZQdHI8V2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudD4gbV9tZWRpYUVsZW1lbnQ7CisKKyAg
ICBIV05EIG1faHVkV2luZG93LCBtX3ZpZGVvV2luZG93OworICAgIE93blB0cjxIQklUTUFQPiBt
X2JpdG1hcDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIG1fZnVsbHNjcmVlblNpemU7CisgICAgV2Vi
Q29yZTo6SW50UG9pbnQgbV9odWRQb3NpdGlvbjsKKworICAgIEhVREJ1dHRvbiBtX3BsYXlQYXVz
ZUJ1dHRvbjsKKyAgICBIVURCdXR0b24gbV90aW1lU2xpZGVyQnV0dG9uOworICAgIEhVREJ1dHRv
biBtX3ZvbHVtZVVwQnV0dG9uOworICAgIEhVREJ1dHRvbiBtX3ZvbHVtZVNsaWRlckJ1dHRvbjsK
KyAgICBIVURCdXR0b24gbV92b2x1bWVEb3duQnV0dG9uOworICAgIEhVREJ1dHRvbiBtX2V4aXRG
dWxsc2NyZWVuQnV0dG9uOworICAgIEhVRFNsaWRlciBtX3ZvbHVtZVNsaWRlcjsKKyAgICBIVURT
bGlkZXIgbV90aW1lU2xpZGVyOworCisgICAgSFVEV2lkZ2V0KiBtX2hpdFdpZGdldDsKKyAgICBX
ZWJDb3JlOjpJbnRQb2ludCBtX21vdmVPZmZzZXQ7CisgICAgYm9vbCBtX21vdmluZ1dpbmRvdzsK
KyAgICBXZWJDb3JlOjpUaW1lcjxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyPiBtX3RpbWVyOwor
fTsKKworI2VuZGlmCisKKyNlbmRpZiAvLyBGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVyX2gKSW5k
ZXg6IFdlYktpdC93aW4vV2ViS2l0RExMLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dl
YktpdERMTC5jcHAJKHJldmlzaW9uIDUyOTYzKQorKysgV2ViS2l0L3dpbi9XZWJLaXRETEwuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xNzksNiArMTc5LDE2IEBAIFBhc3NSZWZQdHI8V2ViQ29yZTo6
U2hhcmVkQnVmZmVyPiBsb2FkUmUKICAgICAgICAgaWRyID0gSURSX1pPT01fT1VUX0NVUlNPUjsK
ICAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ2ZXJ0aWNhbFRleHRDdXJzb3IiKSkKICAgICAg
ICAgaWRyID0gSURSX1ZFUlRJQ0FMX1RFWFRfQ1VSU09SOworICAgIGVsc2UgaWYgKCFzdHJjbXAo
bmFtZSwgImZzVmlkZW9BdWRpb1ZvbHVtZUhpZ2giKSkKKyAgICAgICAgaWRyID0gSURSX0ZTX1ZJ
REVPX0FVRElPX1ZPTFVNRV9ISUdIOworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZzVmlk
ZW9BdWRpb1ZvbHVtZUxvdyIpKQorICAgICAgICBpZHIgPSBJRFJfRlNfVklERU9fQVVESU9fVk9M
VU1FX0xPVzsKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmc1ZpZGVvRXhpdEZ1bGxzY3Jl
ZW4iKSkKKyAgICAgICAgaWRyID0gSURSX0ZTX1ZJREVPX0VYSVRfRlVMTFNDUkVFTjsKKyAgICBl
bHNlIGlmICghc3RyY21wKG5hbWUsICJmc1ZpZGVvUGF1c2UiKSkKKyAgICAgICAgaWRyID0gSURS
X0ZTX1ZJREVPX1BBVVNFOworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZzVmlkZW9QbGF5
IikpCisgICAgICAgIGlkciA9IElEUl9GU19WSURFT19QTEFZOwogICAgIGVsc2UKICAgICAgICAg
cmV0dXJuIDA7CiAKSW5kZXg6IFdlYktpdC93aW4vV2ViVmlldy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L3dpbi9XZWJWaWV3LmNwcAkocmV2aXNpb24gNTI5NjMpCisrKyBXZWJLaXQvd2luL1dl
YlZpZXcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCwxMSArMjQsMTIgQEAKICAqLwogCiAjaW5j
bHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiV2ViS2l0RExMLmgiCisKICNpbmNsdWRlICJXZWJW
aWV3LmgiCiAKICNpbmNsdWRlICJDRkRpY3Rpb25hcnlQcm9wZXJ0eUJhZy5oIgogI2luY2x1ZGUg
IkRPTUNvcmVDbGFzc2VzLmgiCisjaW5jbHVkZSAiRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlci5o
IgogI2luY2x1ZGUgIk1hcnNoYWxsaW5nSGVscGVycy5oIgogI2luY2x1ZGUgIlNvZnRMaW5raW5n
LmgiCiAjaW5jbHVkZSAiV2ViQmFja0ZvcndhcmRMaXN0LmgiCkBAIC00Niw2ICs0Nyw3IEBACiAj
aW5jbHVkZSAiV2ViSW5zcGVjdG9yLmgiCiAjaW5jbHVkZSAiV2ViSW5zcGVjdG9yQ2xpZW50Lmgi
CiAjaW5jbHVkZSAiV2ViS2l0LmgiCisjaW5jbHVkZSAiV2ViS2l0RExMLmgiCiAjaW5jbHVkZSAi
V2ViS2l0TG9nZ2luZy5oIgogI2luY2x1ZGUgIldlYktpdFN0YXRpc3RpY3NQcml2YXRlLmgiCiAj
aW5jbHVkZSAiV2ViS2l0U3lzdGVtQml0cy5oIgpAQCAtNTgsMTcgKzYwLDE3IEBACiAjaW5jbHVk
ZSA8SmF2YVNjcmlwdENvcmUvSW5pdGlhbGl6ZVRocmVhZGluZy5oPgogI2luY2x1ZGUgPEphdmFT
Y3JpcHRDb3JlL0pTTG9jay5oPgogI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTVmFsdWUuaD4K
LSNpbmNsdWRlIDxXZWJDb3JlL0FwcGxpY2F0aW9uQ2FjaGVTdG9yYWdlLmg+CiAjaW5jbHVkZSA8
V2ViQ29yZS9BWE9iamVjdENhY2hlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9BcHBsaWNhdGlvbkNh
Y2hlU3RvcmFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvQlN0cmluZy5oPgogI2luY2x1ZGUgPFdl
YkNvcmUvQmFja0ZvcndhcmRMaXN0Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9CaXRtYXBJbmZvLmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9CU3RyaW5nLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9DU3RyaW5n
Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9DYWNoZS5oPgogI2luY2x1ZGUgPFdlYkNvcmUvQ2hyb21l
Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Db250ZXh0TWVudS5oPgogI2luY2x1ZGUgPFdlYkNvcmUv
Q29udGV4dE1lbnVDb250cm9sbGVyLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Db29raWVTdG9yYWdl
V2luLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9DU3RyaW5nLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9D
dXJzb3IuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0RvY3VtZW50Lmg+CiAjaW5jbHVkZSA8V2ViQ29y
ZS9EcmFnQ29udHJvbGxlci5oPgpAQCAtNzcsMTQgKzc5LDE2IEBACiAjaW5jbHVkZSA8V2ViQ29y
ZS9FdmVudEhhbmRsZXIuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0V2ZW50TmFtZXMuaD4KICNpbmNs
dWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KLSNpbmNsdWRlIDxXZWJDb3JlL0ZvY3VzQ29udHJv
bGxlci5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRmxvYXRRdWFkLmg+CisjaW5jbHVkZSA8V2ViQ29y
ZS9Gb2N1c0NvbnRyb2xsZXIuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lTG9hZGVyLmg+CiAj
aW5jbHVkZSA8V2ViQ29yZS9GcmFtZVRyZWUuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lVmll
dy5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWVXaW4uaD4KICNpbmNsdWRlIDxXZWJDb3JlL0dE
SU9iamVjdENvdW50ZXIuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0dyYXBoaWNzQ29udGV4dC5oPgor
I2luY2x1ZGUgPFdlYkNvcmUvSFRNTE1lZGlhRWxlbWVudC5oPgorI2luY2x1ZGUgPFdlYkNvcmUv
SFRNTE5hbWVzLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9IaXN0b3J5SXRlbS5oPgogI2luY2x1ZGUg
PFdlYkNvcmUvSGl0VGVzdFJlcXVlc3QuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0hpdFRlc3RSZXN1
bHQuaD4KQEAgLTEzMywxMyArMTM3LDEzIEBACiAjaW5jbHVkZSA8V2ViS2l0U3lzdGVtSW50ZXJm
YWNlL1dlYktpdFN5c3RlbUludGVyZmFjZS5oPiAKICNlbmRpZgogCi0jaW5jbHVkZSA8d3RmL0hh
c2hTZXQuaD4KKyNpbmNsdWRlIDxTaGxPYmouaD4KICNpbmNsdWRlIDxjb211dGlsLmg+CiAjaW5j
bHVkZSA8ZGltbS5oPgogI2luY2x1ZGUgPG9sZWFjYy5oPgotI2luY2x1ZGUgPFNobE9iai5oPgog
I2luY2x1ZGUgPHRjaGFyLmg+CiAjaW5jbHVkZSA8d2luZG93c3guaD4KKyNpbmNsdWRlIDx3dGYv
SGFzaFNldC5oPgogCiAvLyBTb2Z0IGxpbmsgZnVuY3Rpb25zIGZvciBnZXN0dXJlcyBhbmQgcGFu
bmluZyBmZWVkYmFjawogU09GVF9MSU5LX0xJQlJBUlkoVVNFUjMyKTsKQEAgLTU2NTYsNiArNTY2
MCw0MCBAQCBzdGF0aWMgS1VSTCB0b0tVUkwoQlNUUiBic3RyKQogICAgIHJldHVybiBLVVJMKEtV
UkwoKSwgdG9TdHJpbmcoYnN0cikpOwogfQogCit2b2lkIFdlYlZpZXc6OmVudGVyRnVsbHNjcmVl
bkZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBpZiAoIW5vZGUtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjp2aWRlb1RhZykpCisgICAgICAgIHJldHVybjsKKworICAgIEhUTUxNZWRpYUVsZW1lbnQq
IHZpZGVvRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihub2RlKTsKKwor
ICAgIGlmIChtX2Z1bGxzY3JlZW5Db250cm9sbGVyKSB7CisgICAgICAgIGlmIChtX2Z1bGxzY3Jl
ZW5Db250cm9sbGVyLT5tZWRpYUVsZW1lbnQoKSA9PSB2aWRlb0VsZW1lbnQpIHsKKyAgICAgICAg
ICAgIC8vIFRoZSBiYWNrZW5kIG1heSBqdXN0IHdhcm4gdXMgdGhhdCB0aGUgdW5kZXJsYXlpbmcg
cGxhZnRvcm1Nb3ZpZSgpCisgICAgICAgICAgICAvLyBoYXMgY2hhbmdlZC4gSnVzdCBmb3JjZSBh
biB1cGRhdGUuCisgICAgICAgICAgICBtX2Z1bGxzY3JlZW5Db250cm9sbGVyLT5zZXRNZWRpYUVs
ZW1lbnQodmlkZW9FbGVtZW50KTsKKyAgICAgICAgICAgIHJldHVybjsgLy8gTm8gbW9yZSB0byBk
by4KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpcnN0IGV4aXQgRnVsbHNjcmVlbiBmb3IgdGhl
IG9sZCBtZWRpYUVsZW1lbnQuCisgICAgICAgIG1fZnVsbHNjcmVlbkNvbnRyb2xsZXItPm1lZGlh
RWxlbWVudCgpLT5leGl0RnVsbHNjcmVlbigpOworICAgICAgICAvLyBUaGlzIHByZXZpb3VzIGNh
bGwgaGFzIHRvIHRyaWdnZXIgZXhpdEZ1bGxzY3JlZW4sCisgICAgICAgIC8vIHdoaWNoIGhhcyB0
byBjbGVhciBtX2Z1bGxzY3JlZW5Db250cm9sbGVyLgorICAgICAgICBBU1NFUlQoIW1fZnVsbHNj
cmVlbkNvbnRyb2xsZXIpOworICAgIH0KKworICAgIG1fZnVsbHNjcmVlbkNvbnRyb2xsZXIgPSBu
ZXcgRnVsbHNjcmVlblZpZGVvQ29udHJvbGxlcjsKKyAgICBtX2Z1bGxzY3JlZW5Db250cm9sbGVy
LT5zZXRNZWRpYUVsZW1lbnQodmlkZW9FbGVtZW50KTsKKyAgICBtX2Z1bGxzY3JlZW5Db250cm9s
bGVyLT5lbnRlckZ1bGxzY3JlZW4oKTsgICAgICAgIAorfQorCit2b2lkIFdlYlZpZXc6OmV4aXRG
dWxsc2NyZWVuKCkKK3sKKyAgICBpZiAobV9mdWxsc2NyZWVuQ29udHJvbGxlcikKKyAgICAgICAg
bV9mdWxsc2NyZWVuQ29udHJvbGxlci0+ZXhpdEZ1bGxzY3JlZW4oKTsKKyAgICBtX2Z1bGxzY3Jl
ZW5Db250cm9sbGVyID0gMDsKK30KKwogc3RhdGljIFBhc3NPd25QdHI8VmVjdG9yPFN0cmluZz4g
PiB0b1N0cmluZ1ZlY3Rvcih1bnNpZ25lZCBwYXR0ZXJuc0NvdW50LCBCU1RSKiBwYXR0ZXJucykK
IHsKICAgICAvLyBDb252ZXJ0IHRoZSBwYXR0ZXJucyBpbnRvIGEgVmVjdG9yLgpJbmRleDogV2Vi
S2l0L3dpbi9XZWJWaWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJWaWV3LmgJKHJl
dmlzaW9uIDUyOTYzKQorKysgV2ViS2l0L3dpbi9XZWJWaWV3LmgJKHdvcmtpbmcgY29weSkKQEAg
LTM5LDggKzM5LDkgQEAKICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9P
d25QdHIuaD4KIAotY2xhc3MgV2ViRnJhbWU7CitjbGFzcyBGdWxsc2NyZWVuVmlkZW9Db250cm9s
bGVyOwogY2xhc3MgV2ViQmFja0ZvcndhcmRMaXN0OworY2xhc3MgV2ViRnJhbWU7CiBjbGFzcyBX
ZWJJbnNwZWN0b3I7CiBjbGFzcyBXZWJJbnNwZWN0b3JDbGllbnQ7CiAKQEAgLTg2OCw2ICs4Njks
OSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRSb290Q2hpbGRMYXllcihXZWJDb3JlOjpQbGF0Zm9y
bUxheWVyKiBsYXllcik7CiAjZW5kaWYKIAorICAgIHZvaWQgZW50ZXJGdWxsc2NyZWVuRm9yTm9k
ZShXZWJDb3JlOjpOb2RlKik7CisgICAgdm9pZCBleGl0RnVsbHNjcmVlbigpOworCiBwcml2YXRl
OgogICAgIHZvaWQgc2V0Wm9vbU11bHRpcGxpZXIoZmxvYXQgbXVsdGlwbGllciwgYm9vbCBpc1Rl
eHRPbmx5KTsKICAgICBmbG9hdCB6b29tTXVsdGlwbGllcihib29sIGlzVGV4dE9ubHkpOwpAQCAt
OTg0LDYgKzk4OCw4IEBAIHByb3RlY3RlZDoKICAgICBsb25nIG1feE92ZXJwYW47CiAgICAgbG9u
ZyBtX3lPdmVycGFuOwogCisgICAgT3duUHRyPEZ1bGxzY3JlZW5WaWRlb0NvbnRyb2xsZXI+IG1f
ZnVsbHNjcmVlbkNvbnRyb2xsZXI7CisKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CiAgICAgYm9vbCBpc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2lz
QWNjZWxlcmF0ZWRDb21wb3NpdGluZzsgfQogICAgIHZvaWQgc2V0QWNjZWxlcmF0ZWRDb21wb3Np
dGluZyhib29sKTsKSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xp
ZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9t
ZUNsaWVudC5jcHAJKHJldmlzaW9uIDUyOTYzKQorKysgV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9y
dC9XZWJDaHJvbWVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00NCw2ICs0NCw3IEBACiAj
aW5jbHVkZSA8V2ViQ29yZS9GbG9hdFJlY3QuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lTG9h
ZFJlcXVlc3QuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lVmlldy5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvSFRNTE5hbWVzLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Mb2NhbGl6ZWRTdHJpbmdzLmg+
CiAjaW5jbHVkZSA8V2ViQ29yZS9Ob3RJbXBsZW1lbnRlZC5oPgogI2luY2x1ZGUgPFdlYkNvcmUv
UGFnZS5oPgpAQCAtNzczLDMgKzc3NCwyMyBAQCBDT01QdHI8SVdlYlVJRGVsZWdhdGU+IFdlYkNo
cm9tZUNsaWVudDo6CiAgICAgbV93ZWJWaWV3LT51aURlbGVnYXRlKCZkZWxlZ2F0ZSk7CiAgICAg
cmV0dXJuIGRlbGVnYXRlOwogfQorCisjaWYgRU5BQkxFKFZJREVPKQorCitib29sIFdlYkNocm9t
ZUNsaWVudDo6c3VwcG9ydHNGdWxsc2NyZWVuRm9yTm9kZShjb25zdCBOb2RlKiBub2RlKQorewor
ICAgIHJldHVybiBub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6dmlkZW9UYWcpOworfQorCit2
b2lkIFdlYkNocm9tZUNsaWVudDo6ZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShOb2RlKiBub2RlKQor
eworICAgIG1fd2ViVmlldy0+ZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShub2RlKTsKK30KKwordm9p
ZCBXZWJDaHJvbWVDbGllbnQ6OmV4aXRGdWxsc2NyZWVuRm9yTm9kZShOb2RlKikKK3sKKyAgICBt
X3dlYlZpZXctPmV4aXRGdWxsc2NyZWVuKCk7Cit9CisKKyNlbmRpZgorCkluZGV4OiBXZWJLaXQv
d2luL1dlYkNvcmVTdXBwb3J0L1dlYkNocm9tZUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ2hyb21lQ2xpZW50LmgJKHJldmlzaW9uIDUyOTYzKQor
KysgV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDaHJvbWVDbGllbnQuaAkod29ya2luZyBj
b3B5KQpAQCAtMTQ3LDYgKzE0NywxMiBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVx
dWVzdEdlb2xvY2F0aW9uUGVybWlzc2lvbkZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiwgV2ViQ29y
ZTo6R2VvbG9jYXRpb24qKTsKIAorI2lmIEVOQUJMRShWSURFTykKKyAgICB2aXJ0dWFsIGJvb2wg
c3VwcG9ydHNGdWxsc2NyZWVuRm9yTm9kZShjb25zdCBXZWJDb3JlOjpOb2RlKik7CisgICAgdmly
dHVhbCB2b2lkIGVudGVyRnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIHZp
cnR1YWwgdm9pZCBleGl0RnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworI2VuZGlm
CisKICNpZiBFTkFCTEUoTk9USUZJQ0FUSU9OUykKICAgICB2aXJ0dWFsIFdlYkNvcmU6Ok5vdGlm
aWNhdGlvblByZXNlbnRlciogbm90aWZpY2F0aW9uUHJlc2VudGVyKCkgY29uc3QgeyByZXR1cm4g
cmVpbnRlcnByZXRfY2FzdDxXZWJDb3JlOjpOb3RpZmljYXRpb25QcmVzZW50ZXIqPihtX25vdGlm
aWNhdGlvbnNEZWxlZ2F0ZS5nZXQoKSk7IH0KICNlbmRpZgpJbmRleDogV2ViS2l0L3dpbi9XZWJL
aXQudmNwcm9qL1dlYktpdC52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJLaXQu
dmNwcm9qL1dlYktpdC52Y3Byb2oJKHJldmlzaW9uIDUyOTYzKQorKysgV2ViS2l0L3dpbi9XZWJL
aXQudmNwcm9qL1dlYktpdC52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTU4Miw2ICs1ODIsMTAg
QEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5c
RnVsbHNjcmVlblZpZGVvQ29udHJvbGxlci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxG
aWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cTWFyc2hhbGxpbmdIZWxwZXJzLmgiDQogCQkJCT4N
CiAJCQk8L0ZpbGU+DQpAQCAtODk0LDYgKzg5OCwxMCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQog
CQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxGdWxsc2NyZWVuVmlkZW9Db250cm9sbGVy
LmNwcCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXE1lbW9yeVN0cmVhbS5jcHAiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQpJbmRleDogV2ViS2l0
L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9BdWRpb1ZvbHVtZUhpZ2gucG5nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
Q2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5
cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFC
QUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklXWE1BQUF1SkFBQUxpUUUzeWN1dEFBQUsKVDJsRFEx
QlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0
dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElv
SzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1ZXM4NTJ6endmQUNBeVdTRE5STllB
TXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUIKZU5N
TENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pU
QUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3
QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzCkFNRE9FQXV5QUFnTUFEQlJpSVVw
QUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFgK
TGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09O
bzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9Y
Z3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrCjVOaEt4RUpiWWNwWGZmNW53
bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8v
d2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNH
bytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pR
Q0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBCkJoekJCZHpCQy94Z05v
UkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGox
d0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJS
UklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExW
RHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrClE4Y3d3T2dZQnpQ
RWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMEln
WVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJ
TENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9q
azhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvClVzcHFTaG5s
RU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3Rv
cFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJH
QWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZH
eW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iClUyZXBP
NmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdU
WEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktL
ZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpTS3RScTBmcnZUYXU3YWVkcHIxRnUx
bjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1CnAr
NllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3
ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZ
bUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMQptejB4MXpMbm0rZWIxNXZmdDJC
YWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xP
CmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJO
L1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBM
S2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSQp2ZVJLZFBWeFhlRjYwdldk
bTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBR
MCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5
TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJa
ZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cApEb1ZRZnVqVzBBZGg1
bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05T
bytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMr
TjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0Nu
bkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNQpoQ2Vwa0x4TURV
emRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4
ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1
UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlx
MkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZApUMWd2V2Qr
MVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJl
TFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZK
enMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZO
MVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzUwpQVlJT
ajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgw
eDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5
V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8KMzJvUGIrKzZFSFRoMGtYL2krYzd2
RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMQpl
MmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3Mlhjbjdx
MjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZ
K1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYvNmkKL3N1dUZ4WXZmdmpWNjlmTzBa
alJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtS
OApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlD
REFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmtsL0ZSZ0FBQVAxSlJFRlVlTnE4azlG
TncwQVFSR2VqL0RzZDJGUUFIVGdkMkZUZ2RBQWRVRUxvd0NXWURweFUKa0hUZ1VBRjA4UEtSUFds
bGJBY0ppZjNhbTd1ZDI1dlpNMEQvRWtBTDlFQVdzTm5ER1pDUHNFZGdBRTZKQk5CcXFsalNRVklS
eUhwZgpQL214ajZXYlQ5eWlESGpuV0FXVWFSL1FHbmdMSEhXNEpYVlRtOWt6MEVsNk43TUg0Q0Jw
SitrbzVxTUVjdUFMYUR4UCtJdnI4Vk9ECkdHYjJLZWxWMHM3emk2U3RwSFBTYVBVTEJ3c3ZsS1NO
cE8rNHViN2pmZVlkYkYzVWpUdFVleGVUdzBKMHdaMUo3dlNPRGNCK2NwQUMKU2JSeGNERnpGeERQ
RjhjMkVqVGVSZVhGKzhWUkR1L1hpQVNndmZzWFpnZ3JvQmxoc3I5KzUrc0FzNDQzQlU5OVhlSUFB
QUFBU1VWTwpSSzVDWUlJPQoKSW5kZXg6IFdlYktpdC93aW4vV2ViS2l0LnZjcHJvai9mc1ZpZGVv
QXVkaW9Wb2x1bWVMb3cucG5nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2Vk
IGFzIGEgYmluYXJ5IHR5cGUuCnN2bjptaW1lLXR5cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJl
YW0KCmlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQUNYQklX
WE1BQUF1SkFBQUxpUUUzeWN1dEFBQUsKVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBi
R1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hv
ZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkr
Yk4vclhYClB1ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVB
aXpaQ0Z6L1NNQkFQaCtQRHdySXNBSHZnQUIKZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFj
QjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJ
Q2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURC
SlYyWklBTEMzCkFNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1
dUVPY3FBQUI0bWJJOHVTUTVSWUZiQ0MxeEIxZFgKTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RL
Qk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VB
QUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4
UEVXaGtMbloyZVhrCjVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZI
QlBqZ3dzejBUS1VjejVJSmhHTGM1bzlIL0xjTC8vd2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6
TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNB
QVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFS
S0NCS3JCQkcvVEJHQ3pBCkJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6
YkFkS21BdjFFQWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFp
QUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpo
MXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNy
UWFQWXcyb2VmUXEyZ1AybzgrClE4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnho
cXdWcXdEdTRuMVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53
a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15Sjdt
UQpBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQ
a0crUWg4bHNLbldKQWNhVDRVK0lvClVzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5
YVFxMmh0bEt2VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlC
WDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhy
bU9lWgpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45
cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iClUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlE
cEZHZ3NWL2p2TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1
UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJx
cGFYbGxpcgpTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQz
YWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1CnArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUv
VzM2cC9WSERGZ0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1
ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4
M016YUxOMXBrMQptejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhW
bzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPCmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0
dXV0bTIyZldGblloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090
NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRM
TExwYytMcHNieHQzSQp2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnlt
ZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZk
aDd4Yys5ajV5bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFD
bmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0Zv
eU95UXJTSDM1NWpPa2M1cApEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdY
TlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlk
V0Vsc1N4dzVMaXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMK
T3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FU
WHFTN0pHOE5Ya2t4VE9sTE9XNQpoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhR
cW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28x
eW9Ic21kbFYyYS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdP
YTkKckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3Qnlv
TEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZApUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNI
amxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RP
MzE5a1hiTDVmTktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3
UjdodDcKdlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGEx
T2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzUwpQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6
RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1
NlQ4dyswZGJxM25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Ri
b3JaNzUyUE8KMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNx
ZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMQplMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNk
dmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2
M0g5cXdIZWc4OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5R
ODlrenlhZUYvNmkKL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4
aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVB
NWp6L0dNekxkc0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFP
cGdBQUJkdmtsL0ZSZ0FBQUl4SlJFRlVlTnJVaytFSndqQVVoQy9TLzQ1UU43QWJ4QTEwQTBmb0No
M0ZUVHBDWGNVSlB2ODgKNUJGNUtTUWdlQkM0SkhlWGhDTUpVQThPNmtSM2dJRFBDUGJ2UUE0OXRR
QXoweFRnekFBWkdJRnpOWUFZR1ppTlg1c0M3R1NBMVh0KwpWeU13R24zNjlhSFFMWTdmSkUxdWZw
TDBLRFRWRm83QXRsZGorSVNVMGt2U3BienlsKzcvUDlON0FHR1I5cHZCWEkrNUFBQUFBRWxGClRr
U3VRbUNDCgpJbmRleDogV2ViS2l0L3dpbi9XZWJLaXQudmNwcm9qL2ZzVmlkZW9FeGl0RnVsbHNj
cmVlbi5wbmcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQpDYW5ub3QgZGlzcGxheTogZmlsZSBtYXJrZWQgYXMgYSBiaW5h
cnkgdHlwZS4Kc3ZuOm1pbWUtdHlwZSA9IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQoKaVZCT1J3
MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXVKQUFB
TGlRRTN5Y3V0QUFBSwpUMmxEUTFCUWFHOTBiM05vYjNBZ1NVTkRJSEJ5YjJacGJHVUFBSGphblZO
blZGUHBGajMzM3ZSQ1M0aUFsRXR2VWhVSUlGSkNpNEFVCmtTWXFJUWtRU29naG9ka1ZVY0VSUlVV
RUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFgKUHVl
czg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01C
QVBoK1BEd3JJc0FIdmdBQgplTk1MQ0FEQVRadkFNQnlIL3cvcVFwbGNBWUNFQWNCMGtUaExDSUFV
QUVCNmprS21BRUJHQVlDZG1DWlRBS0FFQUdETFkyTGpBRkF0CkFHQW5mK2JUQUlDZCtKbDdBUUJi
bENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzMK
QU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRt
Ykk4dVNRNVJZRmJDQzF4QjFkWApMaDRvemtrWEt4UTJZUUpobWtBdXdubVpHVEtCTkEvZzg4d0FB
S0NSRlJIZ2cvUDllTTRPcnM3T05vNjJEbDh0NnI4Ry95SmlZdVArCjVjK3JjRUFBQU9GMGZ0SCtM
Qyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJl
WGsKNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRL
VWN6NUlKaEdMYzVvOUgvTGNMLy93ZAoweUxFU1dLNVdDb1U0MUVTY1k1RW1venpNcVVpaVVLU0tj
VWwwdjlrNHQ4cyt3TSszelVBc0dvK0FYdVJMYWhkWXdQMlN5Y1FXSFRBCjR2Y0FBUEs3YjhIVUtB
Z0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9U
QkdDekEKQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVB
ZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waApDSjdCS0x5QkNRUkJ5QWdUWVNIYWlBRmlpbGdqamdn
WG1ZWDRJY0ZJQkJLTEpDREppQlJSSWt1Uk5VZ3hVb3BVSUZWSUhmSTljZ0k1CmgxeEd1cEU3eUFB
eWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZR
cTJnUDJvOCsKUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4x
WTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTQpXRTdZU0tnZ0hDUTBFZG9KTndrRGhGSENKeUtU
cUV1MEpyb1IrY1FZWWpJeGgxaElMQ1BXRW84VEx4QjdpRVBFTnlRU2lVTXlKN21RCkFrbXhwRlRT
RXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tu
V0pBY2FUNFUrSW8KVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZV
WWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcApyK2gwdWhIZGxSNU9sOUJYMHN2cFIraVg2
QVAwZHd3TmhoV0R4NGhuS0JtYkdBY1laeGwzR0srWVRLWVowNHNaeDFRd056SHJtT2VaCkQ1bHZW
VmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFR
blVscXRWcXAxUTYxTWIKVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZN
WWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WQovUjI3aXoycXFhRTVRek5LTTFlelV2
T1VaajhINDVoeCtKeDBUZ25uS0tlWDgzNkszaFR2S2VJcEc2WTBUTGt4WlZ4cnFwYVhsbGlyClNL
dFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRy
MXJpNnFhNlVib2J0RWQ3OXUKcCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZn
R3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaApsV0dYNFlTUnVkRThvOVZHalVZ
UGpHbkdYT01rNDIzR2JjYWpKZ1ltSVNaTFRlcE43cHBTVGJtbUthWTdURHRNeDgzTXphTE4xcGsx
Cm16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBk
czBhdG5hMGwxcnV0dTZjUnA3bE8KazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0Zu
WWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeQpGRHBXT3Q2YXpwenVQMzNG
OUpicEwyZFl6eERQMkRQanRoUExLY1JwblZPYjAwZG5GMmU1YzRQemlJdUpTNExMTHBjK0xwc2J4
dDNJCnZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElR
K0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0IKWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXlu
K00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLwowUUNuZ0NVQlp3T0pn
VUdCV3dMNytIcDhJYitPUHpyYlpmYXkyZTFCaktDNVFSVkJqNEt0Z3VYQnJTRm95T3lRclNIMzU1
ak9rYzVwCkRvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMw
VDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXEKUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxp
cXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJcwpPcFpBVEloT09K
VHdRUkFxcUJhTUpmSVRkeVdPQ25uQ0hjSm5JaS9STnRHSTJFTmNLaDVPOGtncVRYcVM3Skc4Tlhr
a3hUT2xMT1c1CmhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitw
bjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1EKckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJh
L3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOQpyR281c2p4
eGVkc0s0eFVGSzRaV0Jxdzh1SXEyS20zVlQ2dnRWNWV1ZnIwbWVrMXJnVjdCeW9MQnRRRnI2d3RW
Q3VXRmZldmMxKzFkClQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5cita
M0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVgKRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZO
S051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0Nwp2UFkw
N05YYlc3ejMvVDdKdnR0VkFWVk4xV2JWWmZ0Sis3UDNQNjZKcXVuNGx2dHRYYTFPYlhIdHh3UFNB
LzBISXc2MjE3blUxUjNTClBWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2
ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2EKUnB0VG12dGJZbHU2VDh3KzBkYnEz
bnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTwoz
Mm9QYisrNkVIVGgwa1gvaStjN3ZEdk9YUEs0ZFBLeTIrVVRWN2hYbXE4NlgyM3FkT284L3BQVFQ4
ZTduTHVhcnJsY2E3bnVlcjIxCmUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkv
WGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlYKUDF2KzNOanYzSDlxd0hlZzg5
SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82
aQovc3V1RnhZdmZ2alY2OWZPMFpqUm9aZnlsNU8vYlh5bC9lckE2eG12MjhiQ3hoNit5WGd6TVY3
MFZ2dnR3WGZjZHgzdm85OFBUK1I4CklIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRz
QUFBQWdZMGhTVFFBQWVpVUFBSUNEQUFENS93QUFnT2tBQUhVd0FBRHEKWUFBQU9wZ0FBQmR2a2wv
RlJnQUFBS2RKUkVGVWVOcWtrOUVOd2pBTVJKOGovc01Jak5BTnlnaHNnTmlFRWRpZzNhVGRJTmtF
bU9ENApJSlZLQk1odDc4ZVNyYnhJNTdOSllwTWtKYjJWSk1WWi8rd0Z6SlVrUlVtZHBNRUxHQ3JJ
dlZRWElBQW5JTTk2K3lVV0JETjdBa2ZnCnNjYkRVT3B0NmMrVGRzWHRBekJXcyt3Qm1NUGtDRFEv
eHRtenBWYmYxWG5YM1A1N0hGWUd1SmxTdXhvQWpKTGlFa0JmbWRZQVZ5K2cKTjdOTENkeUg4N2Ix
bkY4REFMMThsNGhCOEQrL0FBQUFBRWxGVGtTdVFtQ0MKCkluZGV4OiBXZWJLaXQvd2luL1dlYktp
dC52Y3Byb2ovZnNWaWRlb1BhdXNlLnBuZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkNhbm5vdCBkaXNwbGF5OiBmaWxl
IG1hcmtlZCBhcyBhIGJpbmFyeSB0eXBlLgpzdm46bWltZS10eXBlID0gYXBwbGljYXRpb24vb2N0
ZXQtc3RyZWFtCgppVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmtBQUFBWkNBWUFBQURFNllWakFB
QUFDWEJJV1hNQUFBdUpBQUFMaVFFM3ljdXRBQUFLClQybERRMUJRYUc5MGIzTm9iM0FnU1VORElI
QnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVUKa1NZcUlR
a1FTb2dob2RrVlVjRVJSVVVFRzhpZ2lBT09qb0NNRlZFc0RJb0syQWZrSWFLT2c2T0lpc3I3NFh1
amE5YTg5K2JOL3JYWApQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlF
S0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCCmVOTUxDQURBVFp2QU1CeUgvdy9xUXBs
Y0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXQKQUdB
bmYrYlRBSUNkK0psN0FRQmJsQ0VWQWFDUkFDQVRaWWhFQUdnN0FLelBWb3BGQUZnd0FCUm1TOFE1
QU5ndEFEQkpWMlpJQUxDMwpBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJH
OGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYCkxoNG96a2tYS3hRMllRSmhta0F1
d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCsK
NWMrcmNFQUFBT0YwZnRIK0xDK3pHb0E3Qm9CdC9xSWw3Z1JvWGd1Z2RmZUxacklQUUxVQW9PbmFW
L053K0g0OFBFV2hrTG5aMmVYawo1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lK
SUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkCjB5TEVTV0s1V0NvVTQxRVNj
WTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdI
VEEKNHZjQUFQSzdiOEhVS0FnRGdHaUQ0YzkzLys4Ly9VZWdKUUNBWmttU2NRQUFYa1FrTGxUS3N6
L0hDQUFBUktDQktyQkJHL1RCR0N6QQpCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0th
eUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoCkNKN0JLTHlCQ1FSQnlB
Z1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJ
OWNnSTUKaDF4R3VwRTd5QUF5Z3Z5R3ZFY3hsSUd5VVQzVURMVkR1YWczR29SR29ndlFaSFF4bW84
V29KdlFjclFhUFl3Mm9lZlFxMmdQMm84KwpROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdF
aXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNCldFN1lTS2dnSENR
MEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFT
aVVNeUo3bVEKQWtteHBGVFNFdEpHMG01U0kra3NxWnMwU0Jvams4bmFaR3V5QnptVUxDQXJ5SVhr
bmVURDVEUGtHK1FoOGxzS25XSkFjYVQ0VStJbwpVc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJv
b1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwCnIraDB1aEhk
bFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4
MVF3TnpIcm1PZVoKRDVsdlZWZ3F0aXA4RlpIS0NwVktsU2FWR3lvdlZLbXFwcXJlcWd0VjgxWExW
SStwWGxOOXJrWlZNMVBqcVFuVWxxdFZxcDFRNjFNYgpVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dX
Y05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZCi9SMjdp
ejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRM
a3haVnhycXBhWGxsaXIKU0t0UnEwZnJ2VGF1N2FlZHByMUZ1MW43Z1E1Qngwb25YQ2RIWjQvT0Ja
M25VOWxUM2FjS3B4Wk5QVHIxcmk2cWE2VWJvYnRFZDc5dQpwKzZZbnI1ZWdKNU1iNmZlZWIzbito
eDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZoCmxX
R1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZ
N1REdE14ODNNemFMTjFwazEKbXoweDF6TG5tK2ViMTV2ZnQyQmFlRm9zdHFpMnVHVkpzdVJhcGxu
dXRyeHVoVm81V2FWWVZWcGRzMGF0bmEwbDFydXR1NmNScDdsTwprMDZybnRabnc3RHh0c20ycWJj
WnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5
CkZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6
aUl1SlM0TExMcGMrTHBzYnh0M0kKdmVSS2RQVnhYZUY2MHZXZG03T2J3dTJvMjYvdU51NXA3b2Zj
bjh3MG55bWVXVE56ME1QSVErQlI1ZEUvQzUrVk1HdmZySDVQUTArQgpaN1huSXk5akw1RlhyZGV3
dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsv
M3IvCjBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3Rn
dVhCclNGb3lPeVFyU0gzNTVqT2tjNXAKRG9WUWZ1alcwQWRoNW1HTHczNE1KNFdIaFZlR1A0NXdp
RmdhMFRHWE5YZlIzRU56MzBUNlJKWkUzcHRuTVU4NXJ5MUtOU28rcWk1cQpQTm8zdWpTNlA4WXVa
bG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4
YXBMaElzCk9wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0to
NU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzUKaENlcGtMeE1EVXpkbXpxZUZwcDJJRzB5UFRxOU1Z
T1NrWkJ4UXFvaFRaTzJaK3BuNW1aMnk2eGxoYkwreFc2THR5OGVsUWZKYTdPUQpyQVZaTFFxMlFx
Ym9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFla
TFZ5MGRXT2E5CnJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsx
cmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWQKVDFndldkKzFZZnFHblJzK0ZZbUtyaFRiRjVj
VmY5Z28zSGpsRzRkdnlyK1ozSlMwcWF2RXVXVFBadEptNmViZUxaNWJEcGFxbCthWApEbTROMmRx
MERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExk
dFdIWCtHN1I3aHQ3CnZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40
bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1MKUFZSU2o5WXI2MGNPeHgrKy9wM3ZkeTBO
TmcxVmpaekc0aU53UkhuazZmY0ozL2NlRFRyYWRveDdyT0VIMHg5MkhXY2RMMnBDbXZLYQpScHRU
bXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlm
aTc1M0dEYm9yWjc1MlBPCjMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFht
cTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjEKZTJiMzZSdWVOODdkOUwxNThSYi8x
dFdlT1QzZHZmTjZiL2ZGOS9YZkZ0MStjaWY5enN1NzJYY243cTI4VDd4ZjlFRHRRZGxEM1lmVgpQ
MXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAz
TDk2ZnluUTg5a3p5YWVGLzZpCi9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4
bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjgKSUg4by8yajVzZlZUMEtmN2t4
bVRrLzhFQTVqei9HTXpMZHNBQUFBZ1kwaFNUUUFBZWlVQUFJQ0RBQUQ1L3dBQWdPa0FBSFV3QUFE
cQpZQUFBT3BnQUFCZHZrbC9GUmdBQUFEdEpSRUZVZU5yc3pTRU9BQ0FReE1DRmo5L1RpOGNjQm9K
b2ZUTUJRbDlsQzZpREwwQm1IaVFpCklpSWlJaUlpOGpjeWdPdklBZ0FBLy84REFKUkFVdHg1ZFdO
OUFBQUFBRWxGVGtTdVFtQ0MKCkluZGV4OiBXZWJLaXQvd2luL1dlYktpdC52Y3Byb2ovZnNWaWRl
b1BsYXkucG5nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KQ2Fubm90IGRpc3BsYXk6IGZpbGUgbWFya2VkIGFzIGEgYmlu
YXJ5IHR5cGUuCnN2bjptaW1lLXR5cGUgPSBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KCmlWQk9S
dzBLR2dvQUFBQU5TVWhFVWdBQUFCa0FBQUFaQ0FZQUFBREU2WVZqQUFBQUNYQklXWE1BQUF1SkFB
QUxpUUUzeWN1dEFBQUsKVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5W
Tm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVQprU1lxSVFrUVNvZ2hvZGtWVWNFUlJV
VUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYClB1
ZXM4NTJ6endmQUNBeVdTRE5STllBTXFVSWVFZUNEeDhURzRlUXVRSUVLSkhBQUVBaXpaQ0Z6L1NN
QkFQaCtQRHdySXNBSHZnQUIKZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lB
VUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdApBR0FuZitiVEFJQ2QrSmw3QVFC
YmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMz
CkFNRE9FQXV5QUFnTUFEQlJpSVVwQUFSN0FHRElJeU40QUlTWkFCUkc4bGM4OFN1dUVPY3FBQUI0
bWJJOHVTUTVSWUZiQ0MxeEIxZFgKTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdB
QUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKwo1YytyY0VBQUFPRjBmdEgr
TEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloy
ZVhrCjVOaEt4RUpiWWNwWGZmNW53bC9BVi8xcytYNDgvUGYxNEw3aUpJRXlYWUZIQlBqZ3dzejBU
S1VjejVJSmhHTGM1bzlIL0xjTC8vd2QKMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NL
Y1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQQo0dmNBQVBLN2I4SFVL
QWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcv
VEJHQ3pBCkJoekJCZHpCQy94Z05vUkNKTVRDUWhCQ0NtU0FISEpnS2F5Q1FpaUd6YkFkS21BdjFF
QWROTUJSYUlhVGNBNHV3bFc0RGoxd0QvcGgKQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampn
Z1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNQpoMXhHdXBFN3lB
QXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2Vm
UXEyZ1AybzgrClE4Y3d3T2dZQnpQRWJEQXV4c05Dc1Rnc0NaTmp5N0VpckF5cnhocXdWcXdEdTRu
MVk4K3hkd1FTZ1VYQUNUWUVkMElnWVI1QlNGaE0KV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlL
VHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUQpBa214cEZU
U0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNL
bldKQWNhVDRVK0lvClVzcHFTaG5sRU9VMDVRWmxtREpCVmFPYVV0Mm9vVlFSTlk5YVFxMmh0bEt2
VVllb0V6UjFtam5OZ3haSlM2V3RvcFhUR21nWGFQZHAKcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lY
NkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWgpENWx2
VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpx
UW5VbHF0VnFwMVE2MU1iClUyZXBPNmlIcW1lb2IxUS9wSDVaL1lrR1djTk13MDlEcEZHZ3NWL2p2
TVlnQzJNWnMzZ3NJV3NOcTRaMWdUWEVKckhOMlh4MktydVkKL1IyN2l6MnFxYUU1UXpOS00xZXpV
dk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpcgpT
S3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBU
cjFyaTZxYTZVYm9idEVkNzl1CnArNllucjVlZ0o1TWI2ZmVlYjNuK2h4OUwvMVUvVzM2cC9WSERG
Z0dzd3drQnRzTXpoZzh4VFZ4Ynp3ZEw4ZmI4VkZEWGNOQVE2VmgKbFdHWDRZU1J1ZEU4bzlWR2pV
WVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBr
MQptejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZw
ZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPCmswNnJudFpudzdEeHRzbTJxYmNac09YWUJ0dXV0bTIyZldG
blloZG50OFd1dys2VHZaTjl1bjJOL1QwSERZZlpEcXNkV2gxK2M3UnkKRkRwV090NmF6cHp1UDMz
RjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNi
eHQzSQp2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJ
UStCUjVkRS9DNStWTUd2ZnJINVBRMCtCClo3WG5JeTlqTDVGWHJkZXd0NlYzcXZkaDd4Yys5ajV5
bitNKzR6dzMzakxlV1YvTU44QzN5TGZMVDhOdm5sK0YzME4vSS85ay8zci8KMFFDbmdDVUJad09K
Z1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1
NWpPa2M1cApEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnoz
MFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxClBObzN1alM2UDhZdVpsbk0xVmlkV0Vsc1N4dzVM
aXF1Tm01c3Z0Lzg3Zk9INHAzaUMrTjdGNWd2eUYxd2VhSE93dlNGcHhhcExoSXMKT3BaQVRJaE9P
SlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Y
a2t4VE9sTE9XNQpoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlor
cG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RCnJBVlpMUXEyUXFib1ZGb28xeW9Ic21kbFYy
YS96WW5LT1phcm5pdk43Y3l6eXR1UU41enZuLy90RXNJUzRaSzJwWVpMVnkwZFdPYTkKckdvNXNq
eHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0
VkN1V0ZmZXZjMSsxZApUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIr
WjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYCkRtNE4yZHEwRGQ5V3RPMzE5a1hiTDVm
TktOdTdnN1pEdWFPL1BMaThaYWZKenMwN1AxU2tWUFJVK2xRMjd0TGR0V0hYK0c3UjdodDcKdlBZ
MDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BT
QS8wSEl3NjIxN25VMVIzUwpQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5r
NmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthClJwdFRtdnRiWWx1NlQ4dyswZGJx
M25yOFI5c2ZENXcwUEZsNVN2TlV5V25hNllMVGsyZnl6NHlkbFoxOWZpNzUzR0Rib3JaNzUyUE8K
MzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRU
OGU3bkx1YXJybGNhN251ZXIyMQplMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5
L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWClAxdiszTmp2M0g5cXdIZWc4
OUhjUi9jR2hZUFAvcEgxanc5REJZK1pqOHVHRFlicm5qZytPVG5pUDNMOTZmeW5RODlrenlhZUYv
NmkKL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1W
NzBWdnZ0d1hmY2R4M3ZvOThQVCtSOApJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxk
c0FBQUFnWTBoU1RRQUFlaVVBQUlDREFBRDUvd0FBZ09rQUFIVXdBQURxCllBQUFPcGdBQUJkdmts
L0ZSZ0FBQUlWSlJFRlVlTnJVMWRFTmdDQU1oT0hxQW83b0tJN0tDSTd3KzJSRUlnWm96OFFib0Y5
UzREQmcKQnpaZ01VRUFNNjVJc0JLUllEVWt4MVkxY2laNXNGYkVoZlVpUTlnbzBvVjVrU1lzQ25u
Rm9wRkhUSVhjTU1CbSt5Si9XNWYwNEtWWApXUG9ZcGJVaUxVaHAxU2ZscHhVeXZJYUVEaThSeWZB
Y21RQjVkUjBBQUFELy93TUFpMEM3L0lvUFhTc0FBQUFBU1VWT1JLNUNZSUk9Cgo=
</data>
<flag name="review"
          id="28319"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
      

    </bug>

</bugzilla>