<?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>17483</bug_id>
          
          <creation_ts>2008-02-21 16:41:30 -0800</creation_ts>
          <short_desc>Implement Scrollbars on Windows (Cairo)</short_desc>
          <delta_ts>2008-02-29 16:30:38 -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>WebKit Misc.</component>
          <version>523.x (Safari 3)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Brent Fulgham">bfulgham</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>71441</commentid>
    <comment_count>0</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-21 16:41:30 -0800</bug_when>
    <thetext>If you attempt to use WebKit without the CoreGraphics and SafariTheme libraries, you do not have working scrollbars.

The attached patch provides support for themed scrollbars.  It is based on the PlatformScrollBarSafari.cpp and RenderThemeWin.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>71443</commentid>
    <comment_count>1</comment_count>
      <attachid>19267</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-21 17:16:18 -0800</bug_when>
    <thetext>Created attachment 19267
Add scrollbar support to Windows (Cairo) build</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>71506</commentid>
    <comment_count>2</comment_count>
      <attachid>19280</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-22 09:21:09 -0800</bug_when>
    <thetext>Created attachment 19280
Revised patch (paste error in text of patch)

This patch should be applied in the WebCore directory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>71811</commentid>
    <comment_count>3</comment_count>
      <attachid>19280</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-02-24 18:21:50 -0800</bug_when>
    <thetext>Comment on attachment 19280
Revised patch (paste error in text of patch)

Generally looks good. A few problems that make me say review-.

First, I had some trouble understanding the changes because there was no ChangeLog included in the patch.

+#if PLATFORM(CAIRO)

This is the wrong #if for non-SafariTheme scrollbars. Maybe the right one is USE_SAFARI_THEME. If not, we need to figure out a better one. Perhaps we need to add a define just to control what theme is used. Maybe we could make this use the machinery from &lt;wtf/Platform.h&gt;, even though what&apos;s being configured is truly a WebCore option. We can have the default be set automatically based on the presence or absence of CG, for now, but that rule about what theme to use should appear in exactly one place, not at all the various sites in the code.

There are lots of minor formatting issues in the code (please read the style guidelines). Here&apos;s an example:

+    if (!isEnabled()) {
+        state += SP_ABS_DISABLE_MODIFIER;
+    }
+    else if (m_client-&gt;isActive()) {
+       state += SP_ABS_HOT_MODIFIER;
+    }

Single-line bodies should not have braces around them. And the else should not be on a different line than that brace before it.

+   PlatformGraphicsContext* ctx = context-&gt;platformContext();
+   state = TS_ACTIVE;
+
+    // Now paint the button.

Why the different indenting here?

+       if (true) { //isFocused(o)) {

This commented out code is not the kind of thing we usually check in. You can include a comment, but use English rather than a code fragment, please.

+        DrawFrameControl(hdc, &amp;widgetRect, DFC_BUTTON, 0); //themeData.m_classicState);

Same thing here.

+    float proportion = (float)(m_visibleSize) / m_totalSize;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>71823</commentid>
    <comment_count>4</comment_count>
      <attachid>19333</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-24 20:38:18 -0800</bug_when>
    <thetext>Created attachment 19333
Corrections based on Darin&apos;s suggestions

* Clean up formatting
* Replace missing ChangeLog entry
* Switch to &quot;USE_SAFARI_THEME&quot;, and set it inside &lt;wtf/Platform.h&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>71842</commentid>
    <comment_count>5</comment_count>
      <attachid>19333</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-02-24 22:55:50 -0800</bug_when>
    <thetext>Comment on attachment 19333
Corrections based on Darin&apos;s suggestions

If USE_SAFARI_THEME is going to be in Platform.h, then it should be:

    #if USE(SAFARI_THEME)

Look at the other WTF_USE_ stuff in Platform.h to see examples.

Or it could be in WebCore as USE_SAFARI_THEME and not be part of the Platform.h thing. I think it&apos;s a bit ugly that decisions about overall WebKit configuration are in wtf/Platform.h and that&apos;s something we&apos;ll have to fix eventually.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>71883</commentid>
    <comment_count>6</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-25 09:32:01 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 19333 [edit])
&gt; If USE_SAFARI_THEME is going to be in Platform.h, then it should be:
&gt; 
&gt;     #if USE(SAFARI_THEME)

It&apos;s a little confusing (at least to me) what should go in wtf/Platform.h, and what belongs in WebCore/config.h.  Based on my (imperfect) understanding of things, it seems logical to put the THEME stuff in Platform.h because it&apos;s currently a 1:1 relationship with use of CG.  However it has no use inside the JavaScriptCore logic, so wtf/Platform.h might be at too high a visibility level.

For now, let&apos;s just leave things as-is and set to USE(SAFARI_THEME).

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>71888</commentid>
    <comment_count>7</comment_count>
      <attachid>19351</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-25 10:34:11 -0800</bug_when>
    <thetext>Created attachment 19351
Revision based on Darin&apos;s latest comments

Revised version using #If USE(SAFARI_THEME)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72079</commentid>
    <comment_count>8</comment_count>
      <attachid>19390</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-26 16:56:58 -0800</bug_when>
    <thetext>Created attachment 19390
Update based on Aroben/Bdash recommendations

* Use correct WTF_USE_SAFARI_THEME definition
* Switch to SOFT_LINK in RenderThemeWin and PlatformScrollbarWin.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72101</commentid>
    <comment_count>9</comment_count>
      <attachid>19394</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-26 20:03:40 -0800</bug_when>
    <thetext>Created attachment 19394
Revision based on Bdash review.

* Get rid of left-over debugging &quot;if (true)&quot; code.
* Revise formatting (noticed a tab, and some single-line conditionals inside braces.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72108</commentid>
    <comment_count>10</comment_count>
      <attachid>19395</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-26 22:15:03 -0800</bug_when>
    <thetext>Created attachment 19395
Revise to use proper 17-pixel width scrollbars

Correct scrollbar width to match platform-standard 17-pixel widths.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72177</commentid>
    <comment_count>11</comment_count>
      <attachid>19395</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-02-27 13:51:18 -0800</bug_when>
    <thetext>Comment on attachment 19395
Revise to use proper 17-pixel width scrollbars

+        (WebCore::RenderThemeWin::determineState): Extend to recognize
+          scrollbar parts.
+        (WebCore::RenderThemeWin::paintButton): Add new implementation
+          for drawing buttons given a graphic context and bounding box.

I don&apos;t see any callers of this new RenderThemeWin method, so I don&apos;t think you should add it or change determineState. Maybe I&apos;m missing something?

It would be good if the changes to make RenderThemeWin use the SOFT_LINK macros could be broken out into their own patch.

+// Note:  Copied from RenderThemeWin.  There should be some way to better
+// encapsulate/share this stuff.  See all RenderThemeSafari for more such stuff...
+//
+// After discussion with Adam Roben, we will make the ugly choice of copying logic
+// from RenderThemeWin until the Theme logic is refactored

I think a shorter comment would suffice, such as:

// FIXME: Refactor this soft-linking code in a way that can be shared with RenderThemeWin

Can you split up the patch as suggested above and re-upload it? That will make it much easier to review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72189</commentid>
    <comment_count>12</comment_count>
      <attachid>19410</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-27 15:08:50 -0800</bug_when>
    <thetext>Created attachment 19410
Scrollbars-only patch

Revised patch to only deal with Windows Scrollbar.  Moved RenderThemeWin change to a separate issue (#17576) for the revision to use softlink.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72196</commentid>
    <comment_count>13</comment_count>
      <attachid>19413</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-27 15:21:43 -0800</bug_when>
    <thetext>Created attachment 19413
Scrollbars-only patch (oops)

Patch revised as follows:
1.  RenderThemeWin changes are now under bug http://bugs.webkit.org/show_bug.cgi?id=17576.
2.  Scrollbar-only changes here.
3.  Added back missing wtf/Platform.h changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72308</commentid>
    <comment_count>14</comment_count>
      <attachid>19413</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-02-28 16:14:25 -0800</bug_when>
    <thetext>Comment on attachment 19413
Scrollbars-only patch (oops)

+#if PLATFORM(CG)
+#define WTF_USE_SAFARI_THEME 1
+#endif

The first line should probably be:

#if PLATFORM(WIN) &amp;&amp; !PLATFORM(CG)

since SafariTheme only exists on Windows.

+#if !USE(SAFARI_THEME)
+    mutable HANDLE m_scrollBarTheme;
+#endif

Similarly, this should be:

#if PLATFORM(WIN) &amp;&amp; !USE(SAFARI_THEME)

+const unsigned SP_ABS_HOT_MODIFIER = 1;
+const unsigned SP_ABS_PRESSED_MODIFIER = 2;
+const unsigned SP_ABS_DISABLE_MODIFIER = 3;

These should all be marked static.

+    // Cleanup theme stout.uff

Looks like a typo here. I&apos;m not sure this comment is needed though.

+    if (!isEnabled()) {
+        state += SP_ABS_DISABLE_MODIFIER;
+        classicState |= DFCS_INACTIVE;
+    }
+    else if ((m_pressedPart == BackButtonPart &amp;&amp; start)
+          || (m_pressedPart == ForwardButtonPart &amp;&amp; !start))
+    {
+        state += SP_ABS_PRESSED_MODIFIER;
+        classicState |= DFCS_PUSHED | DFCS_FLAT;
+    }
+    else if (m_client-&gt;isActive())
+    {
+       state += SP_ABS_HOT_MODIFIER;
+       classicState |= DFCS_HOT;
+    }

The braces here don&apos;t match our coding style.

+    if (!uxthemeLibrary() &amp;&amp; !m_scrollBarTheme)
+        m_scrollBarTheme = OpenThemeData(0, L&quot;Scrollbar&quot;);

I think you have the wrong condition here. I think you want:

if (uxthemeLibrary() &amp;&amp; !m_scrollBarTheme)

The other instances of this seem to have it right.

Maybe this initialization should be put into a helper function, since it&apos;s done over and over?

r- so the above can be fixed, but overall it looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72313</commentid>
    <comment_count>15</comment_count>
      <attachid>19440</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-28 17:52:58 -0800</bug_when>
    <thetext>Created attachment 19440
Update based on aroben&apos;s comments

* Switch wtf/Platform.h logic to use #if PLATFORM(WIN) &amp;&amp; !PLATFORM(CG)
* Switch win/PlatformScrollbar.h logic to use #if PLATFORM(WIN) &amp;&amp; !USE(SAFARI_THEME)
* Clean up comment type (actually, delete comment)
* Correct formatting
* Change scrollbar to get dimensions from GetSystemMetrics calls.  Use only system metrics (not Safari-set &apos;controlSize&apos;) for scrollbar dimensions.
* Make theme handle a static entry in the implementation, since it&apos;s always the same thing.  No longer release this handle as it is always needed during a run of the browser.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72346</commentid>
    <comment_count>16</comment_count>
      <attachid>19440</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-02-29 09:24:33 -0800</bug_when>
    <thetext>Comment on attachment 19440
Update based on aroben&apos;s comments

+static int cHorizontalWidth = 17;
+static int cHorizontalHeight = 17;
+static int cVerticalWidth = 17;
+static int cVerticalHeight = 17;
+static int cRealButtonLength = 28;
+static int cButtonInset = 14;
+static int cButtonHitInset = 3;

I don&apos;t think there&apos;s any reason to initialize these if you&apos;re just going to get the real values later.

+    , m_ButtonLength (14)

There shouldn&apos;t be a space before the parentheses here.

+    cHorizontalHeight = ::GetSystemMetrics(SM_CYHSCROLL);
+    cHorizontalWidth = ::GetSystemMetrics(SM_CXHSCROLL);
+    cVerticalHeight = ::GetSystemMetrics(SM_CYVSCROLL);
+    cVerticalWidth = ::GetSystemMetrics(SM_CXVSCROLL);
+    cThumbWidth = ::GetSystemMetrics(SM_CXHTHUMB);
+    cThumbHeight = ::GetSystemMetrics(SM_CYVTHUMB);

These should only need to be initialized once (though really we should listen for WM_SETTINGSCHANGE and refetch the values then, but that&apos;s for another day).

+    m_ButtonLength = ::GetSystemMetrics((orientation == VerticalScrollbar) ? SM_CYVSCROLL : SM_CXHSCROLL);

I think you can just have two more static variables, cHorizontalButtonLength and cVerticalButtonLength. Then you won&apos;t need this new member.

Once these are fixed I think this&apos;ll be good to go.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72358</commentid>
    <comment_count>17</comment_count>
      <attachid>19452</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2008-02-29 11:09:59 -0800</bug_when>
    <thetext>Created attachment 19452
Update revised based on Adam&apos;s comments

* Zero-initialized System Metric-based values so they can be initialized on first scrollbar construction.
* Added note that we should (someday) check for WM_SETTINGSCHANGE.
* Use two new static variables to hold button size
* No longer change PlatformScrollbar.h.  No new class members.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72367</commentid>
    <comment_count>18</comment_count>
      <attachid>19452</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-02-29 12:42:32 -0800</bug_when>
    <thetext>Comment on attachment 19452
Update revised based on Adam&apos;s comments

You&apos;re missing a ChangeLog for JavaScriptCore, but whomever lands this can make one.

+static int cHorizontalWidth = 0;
+static int cHorizontalHeight = 0;
+static int cVerticalWidth = 0;
+static int cVerticalHeight = 0;
+static int cHorizontalButtonWidth = 0;
+static int cVerticalButtonHeight = 0;

statics are automatically initialized to 0 in C++, so this explicit initialization isn&apos;t really necessary.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72398</commentid>
    <comment_count>19</comment_count>
    <who name="Matt Lilek">dev+webkit</who>
    <bug_when>2008-02-29 16:30:38 -0800</bug_when>
    <thetext>Landed in r30687.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19267</attachid>
            <date>2008-02-21 17:16:18 -0800</date>
            <delta_ts>2008-02-22 09:21:09 -0800</delta_ts>
            <desc>Add scrollbar support to Windows (Cairo) build</desc>
            <filename>WinScrollbars.patch</filename>
            <type>text/plain</type>
            <size>46038</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzMDQ2NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzYgQEAKKzIwMDgtMDItMjEgIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUBnbWFp
bC5jb20+CisKKyAgICAgICAgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTc0ODMKKyAgICAgICAgUHJvdmlkZSBuYXRpdmUgU2Nyb2xsQmFyIGltcGxlbWVudGF0aW9uIGZv
ciBXaW5kb3dzIChDYWlybykgYnVpbGQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBXQVJOSU5HOiBOTyBURVNUIENBU0VTIEFEREVEIE9SIENIQU5HRUQK
KworICAgICAgICAqIHBsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oOgorICAgICAgICAq
IHBsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHA6IENvcGllZCBmcm9tIFdlYkNv
cmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyU2FmYXJpLmNwcC4KKyAgICAgICAgKFdl
YkNvcmU6OnByZXBhcmVGb3JEcmF3aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OmRvbmVEcmF3aW5n
KToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtU2Nyb2xsYmFyOjpQbGF0Zm9ybVNjcm9sbGJh
cik6CisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRmb3JtU2Nyb2xs
YmFyKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlBv
c2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVt
YlByb3BvcnRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBw
ZXJSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEJ1dHRv
bik6CisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUcmFjayk6Cisg
ICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYik6CisgICAgICAg
IChXZWJDb3JlOjpQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBs
YXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU1vdmVFdmVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpQbGF0Zm9ybVNjcm9sbGJhcjo6d2luZG93Q2xpcFJlY3QpOgorICAgICAgICAqIHJlbmRlcmlu
Zy9SZW5kZXJUaGVtZVdpbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbjo6
UmVuZGVyVGhlbWVXaW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVXaW46OmNsb3Nl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luOjpzdXBwb3J0c0ZvY3VzKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luOjpnZXRUaGVtZURhdGEpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVXaW46OnBhaW50QnV0dG9uKToKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyVGhlbWVXaW4uaDoKKwogMjAwOC0wMi0yMSAgRGF2aWQgSHlhdHQgIDxoeWF0dEBh
cHBsZS5jb20+CiAKICAgICAgICAgRml4IGZvciBidWcgMTczMDEuICBDU1MgbWVkaWEgcXVlcmll
cyBuZWVkIHRvIHVzZSB0aGUgY29ycmVjdCB2aWV3cG9ydApJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCShyZXZpc2lvbiAzMDQ1NikKKysrIFdlYkNvcmUvcGxh
dGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwNiw2ICsx
MDYsMTEgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9wcmVzc2VkUG9zOwogICAgIFRpbWVyPFBsYXRm
b3JtU2Nyb2xsYmFyPiBtX3Njcm9sbFRpbWVyOwogICAgIGJvb2wgbV9vdmVybGFwc1Jlc2l6ZXI7
CisKKyNpZiBQTEFURk9STShDQUlSTykKKyAgICBITU9EVUxFIG1fdGhlbWVETEw7CisgICAgbXV0
YWJsZSBIQU5ETEUgbV9zY3JvbGxCYXJUaGVtZTsKKyNlbmRpZgogfTsKIAogfQpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkocmV2aXNpb24g
MzA0NTYpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyU2FmYXJp
LmNwcDozMDQ1NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2lu
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY2MCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKworI2lmZGVmIFVTRV9TQUZBUklfVEhFTUUgCisKKyNpbmNsdWRlICJQbGF0
Zm9ybVNjcm9sbEJhci5oIgorCisjaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAi
RnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50
LmgiCisjaW5jbHVkZSAiU29mdExpbmtpbmcuaCIKKworI2luY2x1ZGUgPENvcmVHcmFwaGljcy9D
b3JlR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxTYWZhcmlUaGVtZS9TYWZhcmlUaGVtZS5oPgorCisv
LyBGSVhNRTogVGhlcmUgYXJlIHJlcGFpbnRpbmcgcHJvYmxlbXMgZHVlIHRvIEFxdWEgc2Nyb2xs
IGJhciBidXR0b25zJyB2aXN1YWwgb3ZlcmZsb3cuCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNwYWNlIFNhZmFyaVRoZW1lOworCisv
LyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGVzZSBudW1iZXJzIGZyb20gU2FmYXJpVGhlbWUKK3N0
YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY0hv
cml6b250YWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbFdpZHRo
W10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVmVydGljYWxIZWlnaHRbXSA9IHsgMTUsIDEx
IH07CitzdGF0aWMgaW50IGNSZWFsQnV0dG9uTGVuZ3RoW10gPSB7IDI4LCAyMSB9Oworc3RhdGlj
IGludCBjQnV0dG9uSW5zZXRbXSA9IHsgMTQsIDExIH07CitzdGF0aWMgaW50IGNCdXR0b25IaXRJ
bnNldFtdID0geyAzLCAyIH07CisvLyBjUmVhbEJ1dHRvbkxlbmd0aCAtIGNCdXR0b25JbnNldAor
c3RhdGljIGludCBjQnV0dG9uTGVuZ3RoW10gPSB7IDE0LCAxMCB9Oworc3RhdGljIGludCBjVGh1
bWJXaWR0aFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1RodW1iSGVpZ2h0W10gPSB7IDE1
LCAxMSB9Oworc3RhdGljIGludCBjVGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIwIH07CisKKyNp
ZiAhZGVmaW5lZChOREVCVUcpICYmIGRlZmluZWQoVVNFX0RFQlVHX1NBRkFSSV9USEVNRSkKK1NP
RlRfTElOS19ERUJVR19MSUJSQVJZKFNhZmFyaVRoZW1lKQorI2Vsc2UKK1NPRlRfTElOS19MSUJS
QVJZKFNhZmFyaVRoZW1lKQorI2VuZGlmCisKK1NPRlRfTElOSyhTYWZhcmlUaGVtZSwgcGFpbnRU
aGVtZVBhcnQsIHZvaWQsIF9fc3RkY2FsbCwgKFRoZW1lUGFydCBwYXJ0LCBDR0NvbnRleHRSZWYg
Y29udGV4dCwgY29uc3QgQ0dSZWN0JiByZWN0LCBOU0NvbnRyb2xTaXplIHNpemUsIFRoZW1lQ29u
dHJvbFN0YXRlIHN0YXRlKSwgKHBhcnQsIGNvbnRleHQsIHJlY3QsIHNpemUsIHN0YXRlKSkKKwor
Y29uc3QgZG91YmxlIGNJbml0aWFsVGltZXJEZWxheSA9IDAuMjU7Citjb25zdCBkb3VibGUgY05v
cm1hbFRpbWVyRGVsYXkgPSAwLjA1OworCitQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZvcm1TY3Jv
bGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVu
dGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQorICAgIDogU2Nyb2xsYmFyKGNsaWVu
dCwgb3JpZW50YXRpb24sIHNpemUpLCBtX2hvdmVyZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBh
cnQoTm9QYXJ0KSwgbV9wcmVzc2VkUG9zKDApLAorICAgICAgbV9zY3JvbGxUaW1lcih0aGlzLCAm
UGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKSwKKyAgICAgIG1fb3Zlcmxh
cHNSZXNpemVyKGZhbHNlKQoreworICAgIC8vIE9idGFpbiB0aGUgY29ycmVjdCBzY3JvbGxiYXIg
c2l6ZXMgZnJvbSB0aGUgc3lzdGVtLgorICAgIGlmICghY0hvcml6b250YWxXaWR0aCkgeworICAg
ICAgICAvLyBGSVhNRTogR2V0IG1ldGljcyBmcm9tIFNhZmFyaVRoZW1lCisgICAgfQorCisgICAg
aWYgKG9yaWVudGF0aW9uID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICBzZXRGcmFtZUdl
b21ldHJ5KEludFJlY3QoMCwgMCwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGNWZXJ0
aWNhbEhlaWdodFtjb250cm9sU2l6ZSgpXSkpOworICAgIGVsc2UKKyAgICAgICAgc2V0RnJhbWVH
ZW9tZXRyeShJbnRSZWN0KDAsIDAsIGNIb3Jpem9udGFsV2lkdGhbY29udHJvbFNpemUoKV0sIGNI
b3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKSk7Cit9CisKK1BsYXRmb3JtU2Nyb2xsYmFy
Ojp+UGxhdGZvcm1TY3JvbGxiYXIoKQoreworICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUG9zaXRpb24oKQoreworICAgIGlu
dmFsaWRhdGVUcmFjaygpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVt
YlByb3BvcnRpb24oKQoreworICAgIGludmFsaWRhdGVUcmFjaygpOworfQorCitzdGF0aWMgSW50
UmVjdCB0cmFja1JlcGFpbnRSZWN0KGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgU2Nyb2xsYmFy
T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXpl
KQoreworICAgIEludFJlY3QgcGFpbnRSZWN0KHRyYWNrUmVjdCk7CisgICAgaWYgKG9yaWVudGF0
aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgIHBhaW50UmVjdC5pbmZsYXRlWChj
QnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisgICAgZWxzZQorICAgICAgICBwYWludFJlY3Qu
aW5mbGF0ZVkoY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworCisgICAgcmV0dXJuIHBhaW50
UmVjdDsKK30KKworc3RhdGljIEludFJlY3QgYnV0dG9uUmVwYWludFJlY3QoY29uc3QgSW50UmVj
dCYgYnV0dG9uUmVjdCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJh
ckNvbnRyb2xTaXplIGNvbnRyb2xTaXplLCBib29sIHN0YXJ0KQoreworICAgIEludFJlY3QgcGFp
bnRSZWN0KGJ1dHRvblJlY3QpOworICAgIGlmIChvcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyKSB7CisgICAgICAgIHBhaW50UmVjdC5zZXRXaWR0aChjUmVhbEJ1dHRvbkxlbmd0aFtj
b250cm9sU2l6ZV0pOworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcGFpbnRSZWN0
LnNldFgoYnV0dG9uUmVjdC54KCkgLSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemVdIC0g
YnV0dG9uUmVjdC53aWR0aCgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFpbnRSZWN0LnNl
dEhlaWdodChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBpZiAoIXN0
YXJ0KQorICAgICAgICAgICAgcGFpbnRSZWN0LnNldFkoYnV0dG9uUmVjdC55KCkgLSAoY1JlYWxC
dXR0b25MZW5ndGhbY29udHJvbFNpemVdIC0gYnV0dG9uUmVjdC5oZWlnaHQoKSkpOworICAgIH0K
KworICAgIHJldHVybiBwYWludFJlY3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6Omlu
dmFsaWRhdGVUcmFjaygpCit7CisgICAgSW50UmVjdCByZWN0ID0gdHJhY2tSZXBhaW50UmVjdCh0
cmFja1JlY3QoKSwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSk7CisgICAgcmVjdC5tb3Zl
KC14KCksIC15KCkpOworICAgIGludmFsaWRhdGVSZWN0KHJlY3QpOworfQorCit2b2lkIFBsYXRm
b3JtU2Nyb2xsYmFyOjppbnZhbGlkYXRlUGFydChTY3JvbGxiYXJQYXJ0IHBhcnQpCit7CisgICAg
aWYgKHBhcnQgPT0gTm9QYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHJlc3Vs
dDsgICAgCisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgICAgIGNhc2UgQmFja0J1dHRvblBhcnQ6
CisgICAgICAgICAgICByZXN1bHQgPSBidXR0b25SZXBhaW50UmVjdChiYWNrQnV0dG9uUmVjdCgp
LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIEZvcndhcmRCdXR0b25QYXJ0OgorICAgICAgICAgICAgcmVzdWx0ID0g
YnV0dG9uUmVwYWludFJlY3QoZm9yd2FyZEJ1dHRvblJlY3QoKSwgbV9vcmllbnRhdGlvbiwgY29u
dHJvbFNpemUoKSwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6
IHsKKyAgICAgICAgICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVy
VGh1bWJSZWN0OworICAgICAgICAgICAgc3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVmb3JlVGh1
bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICAgICAgICAgIGlmIChwYXJ0
ID09IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmVmb3JlVGh1bWJS
ZWN0OworICAgICAgICAgICAgZWxzZSBpZiAocGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KQorICAg
ICAgICAgICAgICAgIHJlc3VsdCA9IGFmdGVyVGh1bWJSZWN0OworICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRodW1iUmVjdDsKKyAgICAgICAgfQorICAgIH0KKyAg
ICByZXN1bHQubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnZhbGlkYXRlUmVjdChyZXN1bHQpOwor
fQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OndpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
V2lkZ2V0Ojp3aWR0aCgpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhlaWdodCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIFdpZGdldDo6aGVpZ2h0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1T
Y3JvbGxiYXI6OnNldFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBHZXQgb3Vy
IHdpbmRvdyByZXNpemVyIHJlY3QgYW5kIHNlZSBpZiB3ZSBvdmVybGFwLiAgQWRqdXN0IHRvIGF2
b2lkIHRoZSBvdmVybGFwCisgICAgLy8gaWYgbmVjZXNzYXJ5LgorICAgIEludFJlY3QgYWRqdXN0
ZWRSZWN0KHJlY3QpOworICAgIGlmIChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGcmFtZVZpZXco
KSkgeworICAgICAgICBib29sIG92ZXJsYXBzUmVzaXplciA9IGZhbHNlOworICAgICAgICBGcmFt
ZVZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisgICAgICAg
IEludFJlY3QgcmVzaXplclJlY3QgPSB2aWV3LT53aW5kb3dSZXNpemVyUmVjdCgpOworICAgICAg
ICByZXNpemVyUmVjdC5zZXRMb2NhdGlvbih2aWV3LT5jb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5k
b3cocmVzaXplclJlY3QubG9jYXRpb24oKSkpOworICAgICAgICBpZiAocmVjdC5pbnRlcnNlY3Rz
KHJlc2l6ZXJSZWN0KSkgeworICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uKCkgPT0gSG9yaXpv
bnRhbFNjcm9sbGJhcikgeworICAgICAgICAgICAgICAgIGludCBvdmVybGFwID0gcmVjdC5yaWdo
dCgpIC0gcmVzaXplclJlY3QueCgpOworICAgICAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAm
JiByZXNpemVyUmVjdC5yaWdodCgpID49IHJlY3QucmlnaHQoKSkgeworICAgICAgICAgICAgICAg
ICAgICBhZGp1c3RlZFJlY3Quc2V0V2lkdGgocmVjdC53aWR0aCgpIC0gb3ZlcmxhcCk7CisgICAg
ICAgICAgICAgICAgICAgIG92ZXJsYXBzUmVzaXplciA9IHRydWU7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcCA9IHJl
Y3QuYm90dG9tKCkgLSByZXNpemVyUmVjdC55KCk7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJs
YXAgPiAwICYmIHJlc2l6ZXJSZWN0LmJvdHRvbSgpID49IHJlY3QuYm90dG9tKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgYWRqdXN0ZWRSZWN0LnNldEhlaWdodChyZWN0LmhlaWdodCgpIC0gb3Zl
cmxhcCk7CisgICAgICAgICAgICAgICAgICAgIG92ZXJsYXBzUmVzaXplciA9IHRydWU7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG92
ZXJsYXBzUmVzaXplciAhPSBtX292ZXJsYXBzUmVzaXplcikgeworICAgICAgICAgICAgbV9vdmVy
bGFwc1Jlc2l6ZXIgPSBvdmVybGFwc1Jlc2l6ZXI7CisgICAgICAgICAgICB2aWV3LT5hZGp1c3RP
dmVybGFwcGluZ1Njcm9sbGJhckNvdW50KG1fb3ZlcmxhcHNSZXNpemVyID8gMSA6IC0xKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHNldEZyYW1lR2VvbWV0cnkoYWRqdXN0ZWRSZWN0KTsKK30K
Kwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c2V0UGFyZW50KFNjcm9sbFZpZXcqIHBhcmVudFZp
ZXcpCit7CisgICAgaWYgKCFwYXJlbnRWaWV3ICYmIG1fb3ZlcmxhcHNSZXNpemVyICYmIHBhcmVu
dCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKQorICAgICAgICBzdGF0aWNfY2FzdDxGcmFt
ZVZpZXcqPihwYXJlbnQoKSktPmFkanVzdE92ZXJsYXBwaW5nU2Nyb2xsYmFyQ291bnQoLTEpOwor
ICAgIFdpZGdldDo6c2V0UGFyZW50KHBhcmVudFZpZXcpOworfQorCit2b2lkIFBsYXRmb3JtU2Ny
b2xsYmFyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCAhPSBp
c0VuYWJsZWQoKSkgeworICAgICAgICBXaWRnZXQ6OnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAg
ICAgIGludmFsaWRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBh
aW50KEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBJbnRSZWN0JiBkYW1h
Z2VSZWN0KQoreworICAgIGlmIChncmFwaGljc0NvbnRleHQtPnVwZGF0aW5nQ29udHJvbFRpbnRz
KCkpIHsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKGdyYXBoaWNzQ29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBEb24ndCBwYWludCBhbnl0aGluZyBpZiB0aGUgc2Nyb2xsYmFyIGRvZXNu
J3QgaW50ZXJzZWN0IHRoZSBkYW1hZ2UgcmVjdC4KKyAgICBpZiAoIWZyYW1lR2VvbWV0cnkoKS5p
bnRlcnNlY3RzKGRhbWFnZVJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHRy
YWNrID0gdHJhY2tSZWN0KCk7CisgICAgcGFpbnRUcmFjayhncmFwaGljc0NvbnRleHQsIHRyYWNr
LCB0cnVlLCBkYW1hZ2VSZWN0KTsKKworICAgIGlmIChoYXNCdXR0b25zKCkpIHsKKyAgICAgICAg
cGFpbnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0LCBiYWNrQnV0dG9uUmVjdCgpLCB0cnVlLCBkYW1h
Z2VSZWN0KTsKKyAgICAgICAgcGFpbnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0LCBmb3J3YXJkQnV0
dG9uUmVjdCgpLCBmYWxzZSwgZGFtYWdlUmVjdCk7CisgICAgfQorCisgICAgaWYgKGhhc1RodW1i
KCkgJiYgZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHRyYWNrKSkgeworICAgICAgICBJbnRSZWN0IHN0
YXJ0VHJhY2tSZWN0LCB0aHVtYlJlY3QsIGVuZFRyYWNrUmVjdDsKKyAgICAgICAgc3BsaXRUcmFj
ayh0cmFjaywgc3RhcnRUcmFja1JlY3QsIHRodW1iUmVjdCwgZW5kVHJhY2tSZWN0KTsKKyAgICAg
ICAgcGFpbnRUaHVtYihncmFwaGljc0NvbnRleHQsIHRodW1iUmVjdCwgZGFtYWdlUmVjdCk7Cisg
ICAgfQorfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYXNCdXR0b25zKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNj
cm9sbGJhciA/IHdpZHRoKCkgOiBoZWlnaHQoKSkgPj0gMiAqIChjUmVhbEJ1dHRvbkxlbmd0aFtj
b250cm9sU2l6ZSgpXSAtIGNCdXR0b25IaXRJbnNldFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK2Jv
b2wgUGxhdGZvcm1TY3JvbGxiYXI6Omhhc1RodW1iKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaXNF
bmFibGVkKCkgJiYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IHdpZHRo
KCkgOiBoZWlnaHQoKSkgPj0gMiAqIGNCdXR0b25JbnNldFtjb250cm9sU2l6ZSgpXSArIGNUaHVt
Yk1pbkxlbmd0aFtjb250cm9sU2l6ZSgpXSArIDE7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3Jv
bGxiYXI6OmJhY2tCdXR0b25SZWN0KCkgY29uc3QKK3sKKyAgICAvLyBPdXIgZGVzaXJlZCByZWN0
IGlzIGVzc2VudGlhbGx5IDE3eDE3LgorICAgIAorICAgIC8vIE91ciBhY3R1YWwgcmVjdCB3aWxs
IHNocmluayB0byBoYWxmIHRoZSBhdmFpbGFibGUgc3BhY2Ugd2hlbgorICAgIC8vIHdlIGhhdmUg
PCAzNCBwaXhlbHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRoZSBzY3JvbGxiYXIKKyAgICAvLyB0byBz
Y2FsZSBkb3duIGFuZCBmdW5jdGlvbiBldmVuIGF0IHRpbnkgc2l6ZXMuCisgICAgaWYgKG1fb3Jp
ZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJlY3Qo
eCgpLCB5KCksIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0
W2NvbnRyb2xTaXplKCldKTsKKyAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgY1ZlcnRpY2Fs
V2lkdGhbY29udHJvbFNpemUoKV0sIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0pOworfQor
CitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpmb3J3YXJkQnV0dG9uUmVjdCgpIGNvbnN0Cit7
CisgICAgLy8gT3VyIGRlc2lyZWQgcmVjdCBpcyBlc3NlbnRpYWxseSAxN3gxNy4KKyAgICAKKyAg
ICAvLyBPdXIgYWN0dWFsIHJlY3Qgd2lsbCBzaHJpbmsgdG8gaGFsZiB0aGUgYXZhaWxhYmxlIHNw
YWNlIHdoZW4KKyAgICAvLyB3ZSBoYXZlIDwgMzQgcGl4ZWxzIGxlZnQuICBUaGlzIGFsbG93cyB0
aGUgc2Nyb2xsYmFyCisgICAgLy8gdG8gc2NhbGUgZG93biBhbmQgZnVuY3Rpb24gZXZlbiBhdCB0
aW55IHNpemVzLgorCisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJh
cikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpICsgd2lkdGgoKSAtIGNCdXR0b25MZW5ndGhb
Y29udHJvbFNpemUoKV0sIHkoKSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6
b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgp
ICsgaGVpZ2h0KCkgLSBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxXaWR0
aFtjb250cm9sU2l6ZSgpXSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0lu
dFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKG1f
b3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICBpZiAoIWhhc0J1
dHRvbnMoKSkKKyAgICAgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCB3aWR0aCgpLCBj
SG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBJbnRSZWN0
KHgoKSArIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIHkoKSwgd2lkdGgoKSAtIDIgKiBj
QnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6
ZSgpXSk7CisgICAgfQorCisgICAgaWYgKCFoYXNCdXR0b25zKCkpCisgICAgICAgIHJldHVybiBJ
bnRSZWN0KHgoKSwgeSgpLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgaGVpZ2h0KCkp
OworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpICsgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6
ZSgpXSwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGhlaWdodCgpIC0gMiAqIGNCdXR0
b25MZW5ndGhbY29udHJvbFNpemUoKV0pOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFy
Ojp0aHVtYlJlY3QoKSBjb25zdAoreworICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVt
YlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgIHNwbGl0VHJhY2sodHJhY2tSZWN0KCksIGJlZm9y
ZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdCk7CisgICAgcmV0dXJuIHRodW1i
UmVjdDsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3BsaXRUcmFjayhjb25zdCBJbnRS
ZWN0JiB0cmFja1JlY3QsIEludFJlY3QmIGJlZm9yZVRodW1iUmVjdCwgSW50UmVjdCYgdGh1bWJS
ZWN0LCBJbnRSZWN0JiBhZnRlclRodW1iUmVjdCkgY29uc3QKK3sKKyAgICAvLyBUaGlzIGZ1bmN0
aW9uIHdvbid0IGV2ZW4gZ2V0IGNhbGxlZCB1bmxlc3Mgd2UncmUgYmlnIGVub3VnaCB0byBoYXZl
IHNvbWUgY29tYmluYXRpb24gb2YgdGhlc2UgdGhyZWUgcmVjdHMgd2hlcmUgYXQgbGVhc3QKKyAg
ICAvLyBvbmUgb2YgdGhlbSBpcyBub24tZW1wdHkuCisgICAgaW50IHRodW1iUG9zID0gdGh1bWJQ
b3NpdGlvbigpOworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIp
IHsKKyAgICAgICAgdGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpICsgdGh1bWJQb3Ms
IHRyYWNrUmVjdC55KCkgKyAodHJhY2tSZWN0LmhlaWdodCgpIC0gY1RodW1iSGVpZ2h0W2NvbnRy
b2xTaXplKCldKSAvIDIsIHRodW1iTGVuZ3RoKCksIGNUaHVtYkhlaWdodFtjb250cm9sU2l6ZSgp
XSk7CisgICAgICAgIGJlZm9yZVRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwgdHJh
Y2tSZWN0LnkoKSwgdGh1bWJQb3MsIHRyYWNrUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIGFmdGVy
VGh1bWJSZWN0ID0gSW50UmVjdCh0aHVtYlJlY3QueCgpICsgdGh1bWJSZWN0LndpZHRoKCksIHRy
YWNrUmVjdC55KCksIHRyYWNrUmVjdC5yaWdodCgpIC0gdGh1bWJSZWN0LnJpZ2h0KCksIHRyYWNr
UmVjdC5oZWlnaHQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGh1bWJSZWN0ID0gSW50UmVj
dCh0cmFja1JlY3QueCgpICsgKHRyYWNrUmVjdC53aWR0aCgpIC0gY1RodW1iV2lkdGhbY29udHJv
bFNpemUoKV0pIC8gMiwgdHJhY2tSZWN0LnkoKSArIHRodW1iUG9zLCBjVGh1bWJXaWR0aFtjb250
cm9sU2l6ZSgpXSwgdGh1bWJMZW5ndGgoKSk7CisgICAgICAgIGJlZm9yZVRodW1iUmVjdCA9IElu
dFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRo
dW1iUG9zKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCks
IHRodW1iUmVjdC55KCkgKyB0aHVtYlJlY3QuaGVpZ2h0KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0
cmFja1JlY3QuYm90dG9tKCkgLSB0aHVtYlJlY3QuYm90dG9tKCkpOworICAgIH0KK30KKworaW50
IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoaXNF
bmFibGVkKCkpCisgICAgICAgIHJldHVybiAoZmxvYXQpbV9jdXJyZW50UG9zICogKHRyYWNrTGVu
Z3RoKCkgLSB0aHVtYkxlbmd0aCgpKSAvIChtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpOwor
ICAgIHJldHVybiAwOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iTGVuZ3RoKCkg
Y29uc3QKK3sKKyAgICBpZiAoIWlzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IGZsb2F0IHByb3BvcnRpb24gPSAoZmxvYXQpKG1fdmlzaWJsZVNpemUpIC8gbV90b3RhbFNpemU7
CisgICAgaW50IHRyYWNrTGVuID0gdHJhY2tMZW5ndGgoKTsKKyAgICBpbnQgbGVuZ3RoID0gcHJv
cG9ydGlvbiAqIHRyYWNrTGVuOworICAgIGludCBtaW5MZW5ndGggPSBjVGh1bWJNaW5MZW5ndGhb
Y29udHJvbFNpemUoKV07CisgICAgbGVuZ3RoID0gbWF4KGxlbmd0aCwgbWluTGVuZ3RoKTsKKyAg
ICBpZiAobGVuZ3RoID4gdHJhY2tMZW4pCisgICAgICAgIGxlbmd0aCA9IDA7IC8vIE9uY2UgdGhl
IHRodW1iIGlzIGJlbG93IHRoZSB0cmFjayBsZW5ndGgsIGl0IGp1c3QgZ29lcyBhd2F5ICh0byBt
YWtlIG1vcmUgcm9vbSBmb3IgdGhlIHRyYWNrKS4KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitp
bnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrTGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
KG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0cmFja1JlY3QoKS53aWR0
aCgpIDogdHJhY2tSZWN0KCkuaGVpZ2h0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6
OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVj
dCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3QKK3sKKyAgICBp
ZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0
IHBhaW50UmVjdCA9IGJ1dHRvblJlcGFpbnRSZWN0KHJlY3QsIG1fb3JpZW50YXRpb24sIGNvbnRy
b2xTaXplKCksIHN0YXJ0KTsKKyAgICAKKyAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhw
YWludFJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBUaGVtZVBhcnQgcGFydDsKKyAgICBU
aGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgp
KQorICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxMZWZ0
QXJyb3dQYXJ0IDogU2Nyb2xsUmlnaHRBcnJvd1BhcnQ7CisgICAgZWxzZQorICAgICAgICBwYXJ0
ID0gc3RhcnQgPyBTY3JvbGxVcEFycm93UGFydCA6IFNjcm9sbERvd25BcnJvd1BhcnQ7CisKKyAg
ICBpZiAoaXNFbmFibGVkKCkpCisgICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKyAgICBp
ZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgJiYgc3RhcnQpCisgICAgICAgIHx8
IChtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0b25QYXJ0ICYmICFzdGFydCkpCisgICAgICAg
IHN0YXRlIHw9IFByZXNzZWRTdGF0ZTsKKworICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRl
eHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxT
Y3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3Rh
dGUpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29u
dGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50
UmVjdCYgZGFtYWdlUmVjdCkgY29uc3QKK3sKKyAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGhhc0J1dHRvbnMo
KSA/IHRyYWNrUmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSkg
OiByZWN0OworICAgIAorICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkp
CisgICAgICAgIHJldHVybjsKKworICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gSFNjcm9sbFRyYWNrUGFydCA6IFZTY3JvbGxUcmFja1Bh
cnQ7CisgICAgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIGlmIChtX2NsaWVudC0+
aXNBY3RpdmUoKSkKKyAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgaWYgKGhhc0J1
dHRvbnMoKSkKKyAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworCisgICAgcGFpbnRUaGVt
ZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJv
bFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxh
ckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50
VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25z
dCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJy
YXJ5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3Rz
KHJlY3QpKWh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3MzM2CiAgICAg
ICAgUHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgZm9yIFdpbmRvd3MgKENhaXJvKSBidWlsZCBvZiBX
ZWJLaXQgdGhhdAogICAgICAgIGhhbmRsZXMgZm9udCBmb3JtYXR0aW5nLgogICAgICAgIC0gU3Bs
aXQgZm9udCBpbXBsZW1lbnRhdGlvbiBmaWxlcyB0byBhbGxvdyBtYXhpbWFsIGNvZGUgc2hhcmlu
ZwogICAgICAgICAgYmV0d2VlbiBDRyBhbmQgQ2Fpcm8gYmFjay1lbmRzLgorICAgICAgICByZXR1
cm47CisKKyAgICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNj
cm9sbGJhciA/IEhTY3JvbGxUaHVtYlBhcnQgOiBWU2Nyb2xsVGh1bWJQYXJ0OworICAgIFRoZW1l
Q29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisg
ICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOworICAgIGlmIChpc0VuYWJsZWQoKSkKKyAgICAg
ICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3Jv
bGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUp
OworfQorCitTY3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0KGNvbnN0IFBs
YXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAg
IHJldHVybiBOb1BhcnQ7CisKKyAgICBJbnRQb2ludCBtb3VzZVBvc2l0aW9uID0gY29udmVydEZy
b21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSk7CisgICAgbW91c2VQb3NpdGlvbi5tb3ZlKHgo
KSwgeSgpKTsKKworICAgIGlmIChoYXNCdXR0b25zKCkpIHsKKyAgICAgICAgaWYgKGJhY2tCdXR0
b25SZWN0KCkuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4gQmFj
a0J1dHRvblBhcnQ7CisKKyAgICAgICAgaWYgKGZvcndhcmRCdXR0b25SZWN0KCkuY29udGFpbnMo
bW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4gRm9yd2FyZEJ1dHRvblBhcnQ7Cisg
ICAgfQorCisgICAgaWYgKCFoYXNUaHVtYigpKQorICAgICAgICByZXR1cm4gTm9QYXJ0OworCisg
ICAgSW50UmVjdCB0cmFjayA9IHRyYWNrUmVjdCgpOworICAgIGlmICh0cmFjay5jb250YWlucyht
b3VzZVBvc2l0aW9uKSkgeworICAgICAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJS
ZWN0LCBhZnRlclRodW1iUmVjdDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywgYmVmb3JlVGh1
bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICAgICAgaWYgKGJlZm9yZVRo
dW1iUmVjdC5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBCYWNr
VHJhY2tQYXJ0OworICAgICAgICBpZiAodGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24p
KQorICAgICAgICAgICAgcmV0dXJuIFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuIEZvcndhcmRU
cmFja1BhcnQ7CisgICAgfQorICAgIHJldHVybiBOb1BhcnQ7Cit9CisKK2Jvb2wgUGxhdGZvcm1T
Y3JvbGxiYXI6OmhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYg
ZXZ0KQoreworICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkgeworICAgICAgICAv
LyBEcmFnIHRoZSB0aHVtYi4KKyAgICAgICAgaW50IHRodW1iUG9zID0gdGh1bWJQb3NpdGlvbigp
OworICAgICAgICBpbnQgdGh1bWJMZW4gPSB0aHVtYkxlbmd0aCgpOworICAgICAgICBpbnQgdHJh
Y2tMZW4gPSB0cmFja0xlbmd0aCgpOworICAgICAgICBpbnQgbWF4UG9zID0gdHJhY2tMZW4gLSB0
aHVtYkxlbjsKKyAgICAgICAgaW50IGRlbHRhID0gMDsKKyAgICAgICAgaWYgKG1fb3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgICAgIGRlbHRhID0gY29udmVydEZy
b21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueCgpIC0gbV9wcmVzc2VkUG9zOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBkZWx0YSA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhl
dnQucG9zKCkpLnkoKSAtIG1fcHJlc3NlZFBvczsKKworICAgICAgICBpZiAoZGVsdGEgPiAwKQor
ICAgICAgICAgICAgLy8gVGhlIG1vdXNlIG1vdmVkIGRvd24vcmlnaHQuCisgICAgICAgICAgICBk
ZWx0YSA9IG1pbihtYXhQb3MgLSB0aHVtYlBvcywgZGVsdGEpOworICAgICAgICBlbHNlIGlmIChk
ZWx0YSA8IDApCisgICAgICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgdXAvbGVmdC4KKyAgICAg
ICAgICAgIGRlbHRhID0gbWF4KC10aHVtYlBvcywgZGVsdGEpOworCisgICAgICAgIGlmIChkZWx0
YSAhPSAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZSgoZmxvYXQpKHRodW1iUG9zICsgZGVsdGEp
ICogKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkgLyAodHJhY2tMZW4gLSB0aHVtYkxlbikp
OworICAgICAgICAgICAgbV9wcmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24oKSAtIHRodW1iUG9z
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICBpZiAobV9wcmVzc2VkUGFydCAhPSBOb1BhcnQpCisgICAgICAgIG1fcHJlc3NlZFBvcyA9ICht
X29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBjb252ZXJ0RnJvbUNvbnRhaW5p
bmdXaW5kb3coZXZ0LnBvcygpKS54KCkgOiBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0
LnBvcygpKS55KCkpOworCisgICAgU2Nyb2xsYmFyUGFydCBwYXJ0ID0gaGl0VGVzdChldnQpOyAg
ICAKKyAgICBpZiAocGFydCAhPSBtX2hvdmVyZWRQYXJ0KSB7CisgICAgICAgIGlmIChtX3ByZXNz
ZWRQYXJ0ICE9IE5vUGFydCkgeworICAgICAgICAgICAgaWYgKHBhcnQgPT0gbV9wcmVzc2VkUGFy
dCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBpcyBtb3ZpbmcgYmFjayBvdmVyIHRo
ZSBwcmVzc2VkIHBhcnQuICBXZQorICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc3RhcnQgdXAg
dGhlIHRpbWVyIGFjdGlvbiBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBzdGFydFRpbWVySWZOZWVk
ZWQoY05vcm1hbFRpbWVyRGVsYXkpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1f
cHJlc3NlZFBhcnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtX2hvdmVyZWRQYXJ0ID09IG1f
cHJlc3NlZFBhcnQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbW91c2UgaXMgbGVhdmluZyB0
aGUgcHJlc3NlZCBwYXJ0LiAgS2lsbCBvdXIgdGltZXIKKyAgICAgICAgICAgICAgICAvLyBpZiBu
ZWVkZWQuCisgICAgICAgICAgICAgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKKyAgICAgICAgICAg
ICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KHBhcnQpOworICAgICAgICAg
ICAgaW52YWxpZGF0ZVBhcnQobV9ob3ZlcmVkUGFydCk7CisgICAgICAgIH0KKyAgICAgICAgbV9o
b3ZlcmVkUGFydCA9IHBhcnQ7CisgICAgfSAKKworICAgIHJldHVybiB0cnVlOworfQorCitib29s
IFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU91dEV2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYgZXZ0KQoreworICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAg
IG1faG92ZXJlZFBhcnQgPSBOb1BhcnQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VQcmVzc0V2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYgZXZ0KQoreworICAgIG1fcHJlc3NlZFBhcnQgPSBoaXRUZXN0KGV2dCk7CisgICAg
bV9wcmVzc2VkUG9zID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNv
bnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29u
dGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLnkoKSk7CisgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVz
c2VkUGFydCk7CisgICAgYXV0b3Njcm9sbFByZXNzZWRQYXJ0KGNJbml0aWFsVGltZXJEZWxheSk7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1v
dXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIGlu
dmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgIG1fcHJlc3NlZFBhcnQgPSBOb1BhcnQ7
CisgICAgbV9wcmVzc2VkUG9zID0gMDsKKyAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworCisgICAg
aWYgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKQorICAgICAgICBzdGF0aWNf
Y2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSktPmZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zZXRN
b3VzZVByZXNzZWQoZmFsc2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnN0YXJ0VGltZXJJZk5lZWRlZChkb3VibGUgZGVsYXkpCit7CisgICAgLy8g
RG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0aHVtYi4KKyAgICBpZiAobV9wcmVzc2VkUGFydCA9
PSBUaHVtYlBhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEhhbmRsZSB0aGUgdHJhY2su
ICBXZSBoYWx0IHRyYWNrIHNjcm9sbGluZyBvbmNlIHRoZSB0aHVtYiBpcyBsZXZlbAorICAgIC8v
IHdpdGggdXMuCisgICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQgfHwgbV9w
cmVzc2VkUGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KSAmJiB0aHVtYlVuZGVyTW91c2UoKSkgewor
ICAgICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgbV9ob3ZlcmVk
UGFydCA9IFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGNh
bid0IHNjcm9sbCBpZiB3ZSd2ZSBoaXQgdGhlIGJlZ2lubmluZyBvciBlbmQuCisgICAgU2Nyb2xs
RGlyZWN0aW9uIGRpciA9IHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCk7CisgICAgaWYgKGRp
ciA9PSBTY3JvbGxVcCB8fCBkaXIgPT0gU2Nyb2xsTGVmdCkgeworICAgICAgICBpZiAobV9jdXJy
ZW50UG9zID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aWYgKG1fY3VycmVudFBvcyA9PSBtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpCisgICAgICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zY3JvbGxUaW1lci5zdGFydE9uZVNob3QoZGVs
YXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzdG9wVGltZXJJZk5lZWRlZCgpCit7
CisgICAgaWYgKG1fc2Nyb2xsVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9zY3JvbGxUaW1l
ci5zdG9wKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxQcmVzc2Vk
UGFydChkb3VibGUgZGVsYXkpCit7CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0
aHVtYiBvciBpZiBub3RoaW5nIHdhcyBwcmVzc2VkLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09
IFRodW1iUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IE5vUGFydCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4KKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFj
a1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpICYmIHRodW1i
VW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOwor
ICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgLy8gSGFuZGxlIHRoZSBhcnJvd3MgYW5kIHRyYWNrLgorICAgIGlmIChzY3JvbGwo
cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKSwgcHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0
eSgpKSkKKyAgICAgICAgc3RhcnRUaW1lcklmTmVlZGVkKGRlbGF5KTsKK30KKwordm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQoVGltZXI8UGxhdGZvcm1TY3JvbGxi
YXI+KikKK3sKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoY05vcm1hbFRpbWVyRGVsYXkpOwor
fQorCitTY3JvbGxEaXJlY3Rpb24gUGxhdGZvcm1TY3JvbGxiYXI6OnByZXNzZWRQYXJ0U2Nyb2xs
RGlyZWN0aW9uKCkKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyKSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1f
cHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgIHJldHVybiBTY3JvbGxM
ZWZ0OworICAgICAgICByZXR1cm4gU2Nyb2xsUmlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBC
YWNrVHJhY2tQYXJ0KQorICAgICAgICAgICAgcmV0dXJuIFNjcm9sbFVwOworICAgICAgICByZXR1
cm4gU2Nyb2xsRG93bjsKKyAgICB9Cit9CisKK1Njcm9sbEdyYW51bGFyaXR5IFBsYXRmb3JtU2Ny
b2xsYmFyOjpwcmVzc2VkUGFydFNjcm9sbEdyYW51bGFyaXR5KCkKK3sKKyAgICBpZiAobV9wcmVz
c2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0
b25QYXJ0KQorICAgICAgICByZXR1cm4gU2Nyb2xsQnlMaW5lOworICAgIHJldHVybiBTY3JvbGxC
eVBhZ2U7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iVW5kZXJNb3VzZSgpCit7
CisgICAgLy8gQ29uc3RydWN0IGEgcmVjdC4KKyAgICBJbnRSZWN0IHRodW1iID0gdGh1bWJSZWN0
KCk7CisgICAgdGh1bWIubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnQgYmVnaW4gPSAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLngoKSA6IHRodW1iLnkoKTsK
KyAgICBpbnQgZW5kID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0
aHVtYi5yaWdodCgpIDogdGh1bWIuYm90dG9tKCk7CisgICAgcmV0dXJuIChiZWdpbiA8PSBtX3By
ZXNzZWRQb3MgJiYgbV9wcmVzc2VkUG9zIDwgZW5kKTsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xs
YmFyOjpob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRy
b2xTaXplKQoreworICAgIHJldHVybiBjSG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplXTsKK30K
KworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp2ZXJ0aWNhbFNjcm9sbGJhcldpZHRoKFNjcm9sbGJh
ckNvbnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAgIHJldHVybiBjVmVydGljYWxIZWlnaHRb
Y29udHJvbFNpemVdOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp3aW5kb3dDbGlw
UmVjdCgpIGNvbnN0Cit7CisgICAgSW50UmVjdCBjbGlwUmVjdCgwLCAwLCB3aWR0aCgpLCBoZWln
aHQoKSk7CisgICAgY2xpcFJlY3QgPSBjb252ZXJ0VG9Db250YWluaW5nV2luZG93KGNsaXBSZWN0
KTsKKyAgICBpZiAobV9jbGllbnQpCisgICAgICAgIGNsaXBSZWN0LmludGVyc2VjdChtX2NsaWVu
dC0+d2luZG93Q2xpcFJlY3QoKSk7CisgICAgcmV0dXJuIGNsaXBSZWN0OworfQorCit2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjpwYWludEdyaXBwZXIoSERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVj
dCkgY29uc3QKK3sKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6Z3JpcHBlclJlY3Qo
Y29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25zdAoreworICAgIHJldHVybiBJbnRSZWN0KCk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnRoZW1lQ2hhbmdlZCgpCit7Cit9CisKK30K
KworI2VuZGlmIC8vIGRlZmluZWQoVVNFX1NBRkFSSV9USEVNRSkKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHJldmlzaW9uIDMwNDU2KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEJyZW50IEZ1
bGdoYW0KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjUsNyArMjYsNiBAQAog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpZmRlZiBVU0VfU0FGQVJJX1RIRU1FIAogCiAjaW5j
bHVkZSAiUGxhdGZvcm1TY3JvbGxCYXIuaCIKIApAQCAtMzcsMTcgKzM3LDQwIEBACiAjaW5jbHVk
ZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCiAjaW5jbHVkZSAiU29mdExpbmtpbmcuaCIKIAotI2lu
Y2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxTYWZhcmlUaGVt
ZS9TYWZhcmlUaGVtZS5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlICJSZW5kZXJU
aGVtZVdpbi5oIgogCi0vLyBGSVhNRTogVGhlcmUgYXJlIHJlcGFpbnRpbmcgcHJvYmxlbXMgZHVl
IHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25zJyB2aXN1YWwgb3ZlcmZsb3cuCisvLyBHZW5lcmlj
IHN0YXRlIGNvbnN0YW50cworI2RlZmluZSBUU19OT1JNQUwgICAgMQorI2RlZmluZSBUU19IT1ZF
UiAgICAgMgorI2RlZmluZSBUU19BQ1RJVkUgICAgMworI2RlZmluZSBUU19ESVNBQkxFRCAgNAor
I2RlZmluZSBUU19GT0NVU0VEICAgNQorCisjZGVmaW5lIEFCU19VUE5PUk1BTCAxCisjZGVmaW5l
IEFCU19ET1dOTk9STUFMIDUKKyNkZWZpbmUgQUJTX0xFRlROT1JNQUwgOQorI2RlZmluZSBBQlNf
UklHSFROT1JNQUwgMTMKKworY29uc3QgdW5zaWduZWQgU1BfQUJTX0hPVF9NT0RJRklFUiA9IDE7
Citjb25zdCB1bnNpZ25lZCBTUF9BQlNfUFJFU1NFRF9NT0RJRklFUiA9IDI7Citjb25zdCB1bnNp
Z25lZCBTUF9BQlNfRElTQUJMRV9NT0RJRklFUiA9IDM7CisKKy8vIFNjcm9sbGJhciBjb25zdGFu
dHMKKyNkZWZpbmUgU1BfQlVUVE9OIDEKKyNkZWZpbmUgU1BfVEhVTUJIT1IgMgorI2RlZmluZSBT
UF9USFVNQlZFUlQgMworI2RlZmluZSBTUF9UUkFDS1NUQVJUSE9SIDQKKyNkZWZpbmUgU1BfVFJB
Q0tFTkRIT1IgNQorI2RlZmluZSBTUF9UUkFDS1NUQVJUVkVSVCA2CisjZGVmaW5lIFNQX1RSQUNL
RU5EVkVSVCA3CisjZGVmaW5lIFNQX0dSSVBQRVJIT1IgOAorI2RlZmluZSBTUF9HUklQUEVSVkVS
VCA5CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNp
bmcgbmFtZXNwYWNlIFNhZmFyaVRoZW1lOwotCiAvLyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGVz
ZSBudW1iZXJzIGZyb20gU2FmYXJpVGhlbWUKIHN0YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aFtd
ID0geyAxNSwgMTEgfTsKIHN0YXRpYyBpbnQgY0hvcml6b250YWxIZWlnaHRbXSA9IHsgMTUsIDEx
IH07CkBAIC02MiwyMiArODUsNzkgQEAgc3RhdGljIGludCBjVGh1bWJXaWR0aFtdID0geyAxNSwg
MTEgfTsKIHN0YXRpYyBpbnQgY1RodW1iSGVpZ2h0W10gPSB7IDE1LCAxMSB9Owogc3RhdGljIGlu
dCBjVGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIwIH07CiAKLSNpZiAhZGVmaW5lZChOREVCVUcp
ICYmIGRlZmluZWQoVVNFX0RFQlVHX1NBRkFSSV9USEVNRSkKLVNPRlRfTElOS19ERUJVR19MSUJS
QVJZKFNhZmFyaVRoZW1lKQotI2Vsc2UKLVNPRlRfTElOS19MSUJSQVJZKFNhZmFyaVRoZW1lKQot
I2VuZGlmCiAKLVNPRlRfTElOSyhTYWZhcmlUaGVtZSwgcGFpbnRUaGVtZVBhcnQsIHZvaWQsIF9f
c3RkY2FsbCwgKFRoZW1lUGFydCBwYXJ0LCBDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ0dS
ZWN0JiByZWN0LCBOU0NvbnRyb2xTaXplIHNpemUsIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlKSwg
KHBhcnQsIGNvbnRleHQsIHJlY3QsIHNpemUsIHN0YXRlKSkKKworLy8gTm90ZTogIENvcGllZCBm
cm9tIFJlbmRlclRoZW1lV2luLiAgVGhlcmUgc2hvdWxkIGJlIHNvbWUgd2F5IHRvIGJldHRlcgor
Ly8gZW5jYXBzdWxhdGUvc2hhcmUgdGhpcyBzdHVmZi4gIFNlZSBhbGwgUmVuZGVyVGhlbWVTYWZh
cmkgZm9yIG1vcmUgc3VjaCBzdHVmZi4uLgorLy8KKy8vIEFmdGVyIGRpc2N1c3Npb24gd2l0aCBB
ZGFtIFJvYmVuLCB3ZSB3aWxsIG1ha2UgdGhlIHVnbHkgY2hvaWNlIG9mIGNvcHlpbmcgbG9naWMK
Ky8vIGZyb20gUmVuZGVyVGhlbWVXaW4gdW50aWwgdGhlIFRoZW1lIGxvZ2ljIGlzIHJlZmFjdG9y
ZWQKK3R5cGVkZWYgSEFORExFIChXSU5BUEkqb3BlblRoZW1lRGF0YVB0cikoSFdORCBod25kLCBM
UENXU1RSIHBzekNsYXNzTGlzdCk7Cit0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpjbG9zZVRoZW1l
RGF0YVB0cikoSEFORExFIGhUaGVtZSk7Cit0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpkcmF3VGhl
bWVCYWNrZ3JvdW5kUHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIGNv
bnN0IFJFQ1QgKnBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgUkVDVCogcENsaXBSZWN0KTsKK3R5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmRyYXdU
aGVtZUVkZ2VQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCAKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJZCwgY29uc3Qg
UkVDVCAqcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1
bnNpZ25lZCB1RWRnZSwgdW5zaWduZWQgdUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVCogcENsaXBSZWN0KTsKK3R5cGVkZWYgSFJFU1VM
VCAoV0lOQVBJKmdldFRoZW1lQ29udGVudFJlY3RQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMs
IGludCBpUGFydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFJFQ1QqIHBDb250ZW50UmVjdCk7Cit0eXBlZGVmIEhSRVNVTFQg
KFdJTkFQSSpnZXRUaGVtZVBhcnRTaXplUHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQg
aVBhcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3Rh
dGVJZCwgUkVDVCogcHJjLCBpbnQgdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBTSVpFKiBwc3opOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVTeXNG
b250UHRyKShIQU5ETEUgaFRoZW1lLCBpbnQgaUZvbnRJZCwgT1VUIExPR0ZPTlQqIHBGb250KTsK
K3R5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lQ29sb3JQdHIpKEhBTkRMRSBoVGhlbWUs
IEhEQyBoZGMsIGludCBpUGFydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbnQgaVN0YXRlSWQsIGludCBpUHJvcElkLCBPVVQgQ09MT1JSRUYqIHBGb250KTsKKworc3Rh
dGljIG9wZW5UaGVtZURhdGFQdHIgb3BlblRoZW1lID0gMDsKK3N0YXRpYyBjbG9zZVRoZW1lRGF0
YVB0ciBjbG9zZVRoZW1lID0gMDsKK3N0YXRpYyBkcmF3VGhlbWVCYWNrZ3JvdW5kUHRyIGRyYXdU
aGVtZUJHID0gMDsKK3N0YXRpYyBkcmF3VGhlbWVFZGdlUHRyIGRyYXdUaGVtZUVkZ2UgPSAwOwor
c3RhdGljIGdldFRoZW1lQ29udGVudFJlY3RQdHIgZ2V0VGhlbWVDb250ZW50UmVjdCA9IDA7Citz
dGF0aWMgZ2V0VGhlbWVQYXJ0U2l6ZVB0ciBnZXRUaGVtZVBhcnRTaXplID0gMDsKK3N0YXRpYyBn
ZXRUaGVtZVN5c0ZvbnRQdHIgZ2V0VGhlbWVTeXNGb250ID0gMDsKK3N0YXRpYyBnZXRUaGVtZUNv
bG9yUHRyIGdldFRoZW1lQ29sb3IgPSAwOworCisvLyBNYXkgbmVlZCB0byBhZGQgc3R1ZmYgdG8g
dGhlc2UgbGF0ZXIsIHNvIGtlZXAgdGhlIGdyYXBoaWNzIGNvbnRleHQgcmV0cmlldmFsL3JlbGVh
c2UgaW4gc29tZSBoZWxwZXJzLgorc3RhdGljIEhEQyBwcmVwYXJlRm9yRHJhd2luZyhHcmFwaGlj
c0NvbnRleHQqIGcsIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgcmV0dXJuIGctPmdldFdpbmRv
d3NDb250ZXh0KHIpOworfQorIAorc3RhdGljIHZvaWQgZG9uZURyYXdpbmcoR3JhcGhpY3NDb250
ZXh0KiBnLCBIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIGctPnJlbGVhc2VXaW5k
b3dzQ29udGV4dChoZGMsIHIpOworfQorLy8gRW5kIENvcGllZCBmcm9tIFJlbmRlclRoZW1lV2lu
CiAKIGNvbnN0IGRvdWJsZSBjSW5pdGlhbFRpbWVyRGVsYXkgPSAwLjI1OwogY29uc3QgZG91Ymxl
IGNOb3JtYWxUaW1lckRlbGF5ID0gMC4wNTsKIAogUGxhdGZvcm1TY3JvbGxiYXI6OlBsYXRmb3Jt
U2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCogY2xpZW50LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBv
cmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkKLSAgICA6IFNjcm9sbGJhcihj
bGllbnQsIG9yaWVudGF0aW9uLCBzaXplKSwgbV9ob3ZlcmVkUGFydChOb1BhcnQpLCBtX3ByZXNz
ZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBvcygwKSwKLSAgICAgIG1fc2Nyb2xsVGltZXIodGhp
cywgJlBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZCksCi0gICAgICBtX292
ZXJsYXBzUmVzaXplcihmYWxzZSkKLXsKKyAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0
aW9uLCBzaXplKQorICAgICwgbV9ob3ZlcmVkUGFydChOb1BhcnQpCisgICAgLCBtX3ByZXNzZWRQ
YXJ0KE5vUGFydCkKKyAgICAsIG1fcHJlc3NlZFBvcygwKQorICAgICwgbV9zY3JvbGxUaW1lcih0
aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKQorICAgICwgbV9v
dmVybGFwc1Jlc2l6ZXIoZmFsc2UpCisgICAgLCBtX3RoZW1lRExMKDApCisgICAgLCBtX3Njcm9s
bEJhclRoZW1lKDApCit7CisgICAgLy8gTGF0Y2ggb250byB0aGUgdGhlbWVpbmcgZW5naW5lCisg
ICAgbV90aGVtZURMTCA9IDo6TG9hZExpYnJhcnkoTCJ1eHRoZW1lLmRsbCIpOworICAgIGlmICht
X3RoZW1lRExMKSB7CisgICAgICAgIG9wZW5UaGVtZSA9IChvcGVuVGhlbWVEYXRhUHRyKUdldFBy
b2NBZGRyZXNzKG1fdGhlbWVETEwsICJPcGVuVGhlbWVEYXRhIik7CisgICAgICAgIGNsb3NlVGhl
bWUgPSAoY2xvc2VUaGVtZURhdGFQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkNsb3Nl
VGhlbWVEYXRhIik7CisgICAgICAgIGRyYXdUaGVtZUJHID0gKGRyYXdUaGVtZUJhY2tncm91bmRQ
dHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkRyYXdUaGVtZUJhY2tncm91bmQiKTsKKyAg
ICAgICAgZHJhd1RoZW1lRWRnZSA9IChkcmF3VGhlbWVFZGdlUHRyKUdldFByb2NBZGRyZXNzKG1f
dGhlbWVETEwsICJEcmF3VGhlbWVFZGdlIik7CisgICAgICAgIGdldFRoZW1lQ29udGVudFJlY3Qg
PSAoZ2V0VGhlbWVDb250ZW50UmVjdFB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiR2V0
VGhlbWVCYWNrZ3JvdW5kQ29udGVudFJlY3QiKTsKKyAgICAgICAgZ2V0VGhlbWVQYXJ0U2l6ZSA9
IChnZXRUaGVtZVBhcnRTaXplUHRyKUdldFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJHZXRUaGVt
ZVBhcnRTaXplIik7CisgICAgICAgIGdldFRoZW1lU3lzRm9udCA9IChnZXRUaGVtZVN5c0ZvbnRQ
dHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkdldFRoZW1lU3lzRm9udCIpOworICAgICAg
ICBnZXRUaGVtZUNvbG9yID0gKGdldFRoZW1lQ29sb3JQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVt
ZURMTCwgIkdldFRoZW1lQ29sb3IiKTsKKyAgICB9CisKICAgICAvLyBPYnRhaW4gdGhlIGNvcnJl
Y3Qgc2Nyb2xsYmFyIHNpemVzIGZyb20gdGhlIHN5c3RlbS4KICAgICBpZiAoIWNIb3Jpem9udGFs
V2lkdGgpIHsKICAgICAgICAgLy8gRklYTUU6IEdldCBtZXRpY3MgZnJvbSBTYWZhcmlUaGVtZQpA
QCAtOTIsMTYgKzE3MiwyNiBAQCBQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZvcm1TY3JvbGxiYXIo
U2NyCiBQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRmb3JtU2Nyb2xsYmFyKCkKIHsKICAgICBzdG9w
VGltZXJJZk5lZWRlZCgpOworCisgICAgLy8gQ2xlYW51cCB0aGVtZSBzdHVmZgorICAgIGlmICgh
bV90aGVtZURMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fc2Nyb2xsQmFyVGhlbWUp
CisgICAgICAgIGNsb3NlVGhlbWUobV9zY3JvbGxCYXJUaGVtZSk7CisgICAgbV9zY3JvbGxCYXJU
aGVtZSA9IDA7CisKKyAgICA6OkZyZWVMaWJyYXJ5KG1fdGhlbWVETEwpOwogfQogCiB2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlBvc2l0aW9uKCkKIHsKLSAgICBpbnZhbGlkYXRl
VHJhY2soKTsKKyAgIGludmFsaWRhdGVUcmFjaygpOwogfQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xs
YmFyOjp1cGRhdGVUaHVtYlByb3BvcnRpb24oKQogewotICAgIGludmFsaWRhdGVUcmFjaygpOwor
ICAgaW52YWxpZGF0ZVRyYWNrKCk7CiB9CiAKIHN0YXRpYyBJbnRSZWN0IHRyYWNrUmVwYWludFJl
Y3QoY29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRh
dGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCkBAIC0zMTAsNiArNDAwLDEx
IEBAIEludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUmVjdCgpIGMKICAgICByZXR1cm4g
dGh1bWJSZWN0OwogfQogCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVyUmVjdChj
b25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFJlY3QoKTsK
K30KKwogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3BsaXRUcmFjayhjb25zdCBJbnRSZWN0JiB0
cmFja1JlY3QsIEludFJlY3QmIGJlZm9yZVRodW1iUmVjdCwgSW50UmVjdCYgdGh1bWJSZWN0LCBJ
bnRSZWN0JiBhZnRlclRodW1iUmVjdCkgY29uc3QKIHsKICAgICAvLyBUaGlzIGZ1bmN0aW9uIHdv
bid0IGV2ZW4gZ2V0IGNhbGxlZCB1bmxlc3Mgd2UncmUgYmlnIGVub3VnaCB0byBoYXZlIHNvbWUg
Y29tYmluYXRpb24gb2YgdGhlc2UgdGhyZWUgcmVjdHMgd2hlcmUgYXQgbGVhc3QKQEAgLTM1NSw2
OCArNDUwLDE0MyBAQCBpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrTGVuZ3RoKCkgY29uCiAK
IHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFt
YWdlUmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQotICAgICAg
ICByZXR1cm47Ci0KICAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGJ1dHRvblJlcGFpbnRSZWN0KHJl
Y3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHN0YXJ0KTsKICAgICAKICAgICBpZiAo
IWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBUaGVtZVBhcnQgcGFydDsKLSAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7Ci0gICAg
aWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsK
LSAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQotICAgICAgICBw
YXJ0ID0gc3RhcnQgPyBTY3JvbGxMZWZ0QXJyb3dQYXJ0IDogU2Nyb2xsUmlnaHRBcnJvd1BhcnQ7
Ci0gICAgZWxzZQotICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxVcEFycm93UGFydCA6IFNj
cm9sbERvd25BcnJvd1BhcnQ7CisgICAgdW5zaWduZWQgcGFydCA9IDA7CisgICAgdW5zaWduZWQg
c3RhdGUgPSAwOworICAgIHVuc2lnbmVkIGNsYXNzaWNQYXJ0ID0gMDsKKyAgICB1bnNpZ25lZCBj
bGFzc2ljU3RhdGUgPSAwOwogCi0gICAgaWYgKGlzRW5hYmxlZCgpKQotICAgICAgICBzdGF0ZSB8
PSBFbmFibGVkU3RhdGU7Ci0gICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0
ICYmIHN0YXJ0KQotICAgICAgICB8fCAobV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkQnV0dG9uUGFy
dCAmJiAhc3RhcnQpKQotICAgICAgICBzdGF0ZSB8PSBQcmVzc2VkU3RhdGU7CisgICAgaWYgKG1f
b3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgIHN0YXRlID0gc3Rh
cnQgPyBBQlNfTEVGVE5PUk1BTCA6IEFCU19SSUdIVE5PUk1BTDsKKyAgICAgICBjbGFzc2ljUGFy
dCA9IHN0YXJ0ID8gREZDU19TQ1JPTExMRUZUIDogREZDU19TQ1JPTExSSUdIVDsKKyAgICB9Cisg
ICAgZWxzZSB7CisgICAgICAgc3RhdGUgPSBzdGFydCA/IEFCU19VUE5PUk1BTCA6IEFCU19ET1dO
Tk9STUFMOworICAgICAgIGNsYXNzaWNQYXJ0ID0gc3RhcnQgPyBERkNTX1NDUk9MTFVQIDogREZD
U19TQ1JPTExET1dOOworICAgIH0KIAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQt
PnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3Jv
bGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUp
OworICAgIGlmICghaXNFbmFibGVkKCkpIHsKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJTX0RJU0FC
TEVfTU9ESUZJRVI7CisgICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0lOQUNUSVZFOworICAg
IH0KKyAgICBlbHNlIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCAmJiBzdGFy
dCkKKyAgICAgICAgICB8fCAobV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkQnV0dG9uUGFydCAmJiAh
c3RhcnQpKQorICAgIHsKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJTX1BSRVNTRURfTU9ESUZJRVI7
CisgICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX1BVU0hFRCB8IERGQ1NfRkxBVDsKKyAgICB9
CisgICAgZWxzZSBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAgeworICAgICAgIHN0YXRl
ICs9IFNQX0FCU19IT1RfTU9ESUZJRVI7CisgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfSE9U
OworICAgIH0KKworICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByZWN0
KTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0OworICAgIGlmIChtX3RoZW1lRExMICYmICFt
X3Njcm9sbEJhclRoZW1lKQorICAgICAgICBtX3Njcm9sbEJhclRoZW1lID0gb3BlblRoZW1lKDAs
IEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSAmJiBkcmF3VGhlbWVC
RykgeworICAgICAgICBkcmF3VGhlbWVCRyhtX3Njcm9sbEJhclRoZW1lLCBoZGMsIFNQX0JVVFRP
Tiwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEcmF3
RnJhbWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIGNsYXNzaWNQYXJ0LCBjbGFzc2ljU3RhdGUp
OworICAgIH0KKyAgICBkb25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3QpOwogfQogCiB2b2lk
IFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
Y29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVj
dCkgY29uc3QKIHsKLSAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQotICAgICAgICByZXR1
cm47Ci0KICAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGhhc0J1dHRvbnMoKSA/IHRyYWNrUmVwYWlu
dFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSkgOiByZWN0OwogICAgIAog
ICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCiAgICAgICAgIHJldHVy
bjsKIAotICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyID8gSFNjcm9sbFRyYWNrUGFydCA6IFZTY3JvbGxUcmFja1BhcnQ7Ci0gICAgVGhlbWVD
b250cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIHVuc2lnbmVkIHBhcnQgPSAwOworICAgIHVuc2ln
bmVkIGNsYXNzaWNQYXJ0ID0gREZDX1NDUk9MTDsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgcGFydCA9IHN0YXJ0ID8gU1BfVFJBQ0tTVEFS
VEhPUiA6IFNQX1RSQUNLRU5ESE9SOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICBwYXJ0ID0g
c3RhcnQgPyBTUF9UUkFDS1NUQVJUVkVSVCA6IFNQX1RSQUNLRU5EVkVSVDsKKyAgICB9CisKKyAg
ICB1bnNpZ25lZCBzdGF0ZSA9IFRTX0RJU0FCTEVEOworICAgIHVuc2lnbmVkIGNsYXNzaWNTdGF0
ZSA9IERGQ1NfTU9OTzsKICAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0
YXRlIHw9IEFjdGl2ZVN0YXRlOworICAgICAgICBzdGF0ZSB8PSBUU19BQ1RJVkU7CisgICAgZWxz
ZQorICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0lOQUNUSVZFOworCiAgICAgaWYgKGhhc0J1
dHRvbnMoKSkKLSAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgICAgICBzdGF0ZSB8
PSBUU19OT1JNQUw7CisKKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoY29udGV4dCwg
cmVjdCk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBpZiAobV90aGVtZURMTCAm
JiAhbV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgbV9zY3JvbGxCYXJUaGVtZSA9IG9wZW5UaGVt
ZSgwLCBMIlNjcm9sbGJhciIpOworCisgICAgaWYgKG1fc2Nyb2xsQmFyVGhlbWUgJiYgZHJhd1Ro
ZW1lQkcpIHsKKyAgICAgICAgZHJhd1RoZW1lQkcobV9zY3JvbGxCYXJUaGVtZSwgaGRjLCBwYXJ0
LCBzdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAg
RHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3aWRnZXRSZWN0LCBERkNfU0NST0xMLCBjbGFzc2ljU3Rh
dGUpOworICAgIH0KIAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBO
U1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworICAgIGRv
bmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcmVjdCk7CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxi
YXI6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBy
ZWN0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAogewotICAgIGlmICghU2FmYXJp
VGhlbWVMaWJyYXJ5KCkpCi0gICAgICAgIHJldHVybjsKLQogICAgIGlmICghZGFtYWdlUmVjdC5p
bnRlcnNlY3RzKHJlY3QpKQogICAgICAgICByZXR1cm47CiAKLSAgICBUaGVtZVBhcnQgcGFydCA9
IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IEhTY3JvbGxUaHVtYlBhcnQg
OiBWU2Nyb2xsVGh1bWJQYXJ0OwotICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAg
ICB1bnNpZ25lZCBwYXJ0ID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikg
PyBTUF9USFVNQkhPUiA6IFNQX1RIVU1CVkVSVDsKKyAgICB1bnNpZ25lZCBzdGF0ZSA9IDA7CisK
KyAgICBpZiAoIWlzRW5hYmxlZCgpKSB7CisgICAgICAgIHN0YXRlICs9IFNQX0FCU19ESVNBQkxF
X01PRElGSUVSOworICAgIH0KKyAgICBlbHNlIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkgewor
ICAgICAgIHN0YXRlICs9IFNQX0FCU19IT1RfTU9ESUZJRVI7CisgICAgfQorCisgICAgSERDIGhk
YyA9IHByZXBhcmVGb3JEcmF3aW5nKGNvbnRleHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0UmVj
dCA9IHJlY3Q7CisgICAgaWYgKG1fdGhlbWVETEwgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAg
ICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJTY3JvbGxiYXIiKTsKKworICAg
IGlmIChtX3Njcm9sbEJhclRoZW1lICYmIGRyYXdUaGVtZUJHKSB7CisgICAgICAgIGRyYXdUaGVt
ZUJHKG1fc2Nyb2xsQmFyVGhlbWUsIGhkYywgcGFydCwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxM
KTsKKyAgICAgICAgcGFpbnRHcmlwcGVyKGhkYywgd2lkZ2V0UmVjdCk7CisgICAgfQorICAgIGVs
c2UgeworICAgICAgICBIR0RJT0JKIGhTYXZlQnJ1c2ggPSBTZWxlY3RPYmplY3QoaGRjLCBHZXRT
eXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0UpKTsKKyAgICAgICAgRHJhd0VkZ2UoaGRjLCAmd2lk
Z2V0UmVjdCwgRURHRV9SQUlTRUQsIEJGX1JFQ1QpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRj
LGhTYXZlQnJ1c2gpOworICAgIH0KKworICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcmVj
dCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBj
b25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHVuc2lnbmVkIHBhcnQgPSAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IFNQX0dSSVBQRVJIT1IgOiBTUF9HUklQ
UEVSVkVSVDsKKyAgICB1bnNpZ25lZCBzdGF0ZSA9IDA7CisKICAgICBpZiAobV9jbGllbnQtPmlz
QWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOwotICAgIGlmIChpc0VuYWJs
ZWQoKSkKLSAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgICAgICBzdGF0ZSB8PSBU
U19BQ1RJVkU7CisKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0OworICAgIGlmIChtX3RoZW1l
RExMICYmICFtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBtX3Njcm9sbEJhclRoZW1lID0gb3Bl
blRoZW1lKDAsIEwiU2Nyb2xsYmFyIik7CiAKLSAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250
ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9s
bGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7
CisgICAgaWYgKG1fc2Nyb2xsQmFyVGhlbWUgJiYgZHJhd1RoZW1lQkcpIHsKKyAgICAgICAgZHJh
d1RoZW1lQkcobV9zY3JvbGxCYXJUaGVtZSwgaGRjLCBwYXJ0LCBzdGF0ZSwgJndpZGdldFJlY3Qs
IE5VTEwpOworICAgIH0KIH0KIAogU2Nyb2xsYmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0
VGVzdChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKQEAgLTQ0OCw2ICs2MTgsNyBAQCBT
Y3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0CiAgICAgICAgICAgICByZXR1
cm4gVGh1bWJQYXJ0OwogICAgICAgICByZXR1cm4gRm9yd2FyZFRyYWNrUGFydDsKICAgICB9CisK
ICAgICByZXR1cm4gTm9QYXJ0OwogfQogCkBAIC00NzYsNyArNjQ3LDcgQEAgYm9vbCBQbGF0Zm9y
bVNjcm9sbGJhcjo6aGFuZGxlTW91c2VNb3ZlRQogICAgICAgICAgICAgc2V0VmFsdWUoKGZsb2F0
KSh0aHVtYlBvcyArIGRlbHRhKSAqIChtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpIC8gKHRy
YWNrTGVuIC0gdGh1bWJMZW4pKTsKICAgICAgICAgICAgIG1fcHJlc3NlZFBvcyArPSB0aHVtYlBv
c2l0aW9uKCkgLSB0aHVtYlBvczsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1
cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTYzNiwxOSArODA3LDEyIEBAIGludCBQbGF0Zm9ybVNjcm9s
bGJhcjo6dmVydGljYWxTY3JvbGxiYXIKIEludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OndpbmRv
d0NsaXBSZWN0KCkgY29uc3QKIHsKICAgICBJbnRSZWN0IGNsaXBSZWN0KDAsIDAsIHdpZHRoKCks
IGhlaWdodCgpKTsKKwogICAgIGNsaXBSZWN0ID0gY29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhj
bGlwUmVjdCk7CiAgICAgaWYgKG1fY2xpZW50KQogICAgICAgICBjbGlwUmVjdC5pbnRlcnNlY3Qo
bV9jbGllbnQtPndpbmRvd0NsaXBSZWN0KCkpOwotICAgIHJldHVybiBjbGlwUmVjdDsKLX0KLQot
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBoZGMsIGNvbnN0IEludFJl
Y3QmIHJlY3QpIGNvbnN0Ci17Ci19CiAKLUludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBw
ZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKLXsKLSAgICByZXR1cm4gSW50
UmVjdCgpOworICAgIHJldHVybiBjbGlwUmVjdDsKIH0KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJh
cjo6dGhlbWVDaGFuZ2VkKCkKQEAgLTY1Nyw0ICs4MjEsMyBAQCB2b2lkIFBsYXRmb3JtU2Nyb2xs
YmFyOjp0aGVtZUNoYW5nZWQoKQogCiB9CiAKLSNlbmRpZiAvLyBkZWZpbmVkKFVTRV9TQUZBUklf
VEhFTUUpCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4uY3BwCShyZXZpc2lvbiAz
MDQ1NikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzIsNyArMzIsNyBAQAogLyogCiAgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBh
cmUgdXNlZCB0byBkZXRlcm1pbmUgaG93IGEgd2lkZ2V0IGlzIGRyYXduIHVzaW5nCiAgKiBXaW5k
b3dzJyBUaGVtZSBBUEkuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZW1lIHBhcnRzIGFuZCBz
dGF0ZXMgc2VlCi0gKiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5h
c3A/dXJsPS9saWJyYXJ5L2VuLXVzL3NoZWxsY2MvcGxhdGZvcm0vY29tbWN0bHMvdXNlcmV4L3Rv
cGljcy9wYXJ0c2FuZHN0YXRlcy5hc3AKKyAqIGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2Vu
LXVzL2xpYnJhcnkvYmI3NzMyMTAoVlMuODUpLmFzcHgKICAqLwogI2RlZmluZSBUSEVNRV9DT0xP
UiAyMDQKICNkZWZpbmUgVEhFTUVfRk9OVCAgMjEwCkBAIC01Myw2ICs1MywxOCBAQAogI2RlZmlu
ZSBURlBfVEVYVEZJRUxEIDEKICNkZWZpbmUgVEZTX1JFQURPTkxZICA2CiAKKy8vIFNjcm9sbGJh
ciBjb25zdGFudHMKKyNkZWZpbmUgU1BfQlVUVE9OIDEKKyNkZWZpbmUgU1BfVEhVTUJIT1IgMgor
I2RlZmluZSBTUF9USFVNQlZFUlQgMworI2RlZmluZSBTUF9UUkFDS1NUQVJUSE9SIDQKKyNkZWZp
bmUgU1BfVFJBQ0tFTkRIT1IgNQorI2RlZmluZSBTUF9UUkFDS1NUQVJUVkVSVCA2CisjZGVmaW5l
IFNQX1RSQUNLRU5EVkVSVCA3CisjZGVmaW5lIFNQX0dSSVBQRVJIT1IgOAorI2RlZmluZSBTUF9H
UklQUEVSVkVSVCA5CisKKwogLy8gQ29tYm9ib3ggY29uc3RhbnRzCiAjZGVmaW5lIENQX0RST1BE
T1dOQlVUVE9OIDEKIApAQCAtOTMsNyArMTA1LDEwIEBAIFJlbmRlclRoZW1lKiB0aGVtZSgpCiB9
CiAKIFJlbmRlclRoZW1lV2luOjpSZW5kZXJUaGVtZVdpbigpCi06bV90aGVtZURMTCgwKSwgbV9i
dXR0b25UaGVtZSgwKSwgbV90ZXh0RmllbGRUaGVtZSgwKSwgbV9tZW51TGlzdFRoZW1lKDApCisg
ICAgOiBtX3RoZW1lRExMKDApCisgICAgLCBtX2J1dHRvblRoZW1lKDApCisgICAgLCBtX3RleHRG
aWVsZFRoZW1lKDApCisgICAgLCBtX21lbnVMaXN0VGhlbWUoMCkKIHsKICAgICBtX3RoZW1lRExM
ID0gOjpMb2FkTGlicmFyeShMInV4dGhlbWUuZGxsIik7CiAgICAgaWYgKG1fdGhlbWVETEwpIHsK
QEAgLTEyNyw3ICsxNDIsOSBAQCB2b2lkIFJlbmRlclRoZW1lV2luOjpjbG9zZSgpCiAgICAgICAg
IGNsb3NlVGhlbWUobV90ZXh0RmllbGRUaGVtZSk7CiAgICAgaWYgKG1fbWVudUxpc3RUaGVtZSkK
ICAgICAgICAgY2xvc2VUaGVtZShtX21lbnVMaXN0VGhlbWUpOwotICAgIG1fYnV0dG9uVGhlbWUg
PSBtX3RleHRGaWVsZFRoZW1lID0gbV9tZW51TGlzdFRoZW1lID0gMDsKKyAgICBpZiAobV9zY3Jv
bGxCYXJUaGVtZSkKKyAgICAgICAgY2xvc2VUaGVtZShtX3Njcm9sbEJhclRoZW1lKTsKKyAgICBt
X2J1dHRvblRoZW1lID0gbV90ZXh0RmllbGRUaGVtZSA9IG1fbWVudUxpc3RUaGVtZSA9IG1fc2Ny
b2xsQmFyVGhlbWUgPSAwOwogfQogCiBDb2xvciBSZW5kZXJUaGVtZVdpbjo6cGxhdGZvcm1BY3Rp
dmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdApAQCAtMTY0LDggKzE4MSw2IEBAIGJv
b2wgUmVuZGVyVGhlbWVXaW46OnN1cHBvcnRzRm9jdXMoRUFwcGUKICAgICAgICAgZGVmYXVsdDoK
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7CiB9
CiAKIHVuc2lnbmVkIFJlbmRlclRoZW1lV2luOjpkZXRlcm1pbmVTdGF0ZShSZW5kZXJPYmplY3Qq
IG8pCkBAIC0yMjMsNiArMjM4LDMwIEBAIFRoZW1lRGF0YSBSZW5kZXJUaGVtZVdpbjo6Z2V0VGhl
bWVEYXRhKFIKICAgICAgICAgY2FzZSBUZXh0QXJlYUFwcGVhcmFuY2U6CiAgICAgICAgICAgICBy
ZXN1bHQubV9wYXJ0ID0gVEZQX1RFWFRGSUVMRDsKICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFNjcm9sbGJhclRyYWNrSG9yaXpvbnRhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICBy
ZXN1bHQubV9wYXJ0ID0gU1BfVFJBQ0tTVEFSVEhPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFNjcm9sbGJhclRyYWNrVmVydGljYWxBcHBlYXJhbmNlOgorICAgICAgICAgICAg
cmVzdWx0Lm1fcGFydCA9IFNQX1RSQUNLU1RBUlRWRVJUOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgU2Nyb2xsYmFyVGh1bWJIb3Jpem9udGFsQXBwZWFyYW5jZToKKyAgICAgICAg
ICAgIHJlc3VsdC5tX3BhcnQgPSBTUF9USFVNQkhPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFNjcm9sbGJhclRodW1iVmVydGljYWxBcHBlYXJhbmNlOgorICAgICAgICAgICAg
cmVzdWx0Lm1fcGFydCA9IFNQX1RIVU1CVkVSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFNjcm9sbGJhckdyaXBwZXJIb3Jpem9udGFsQXBwZWFyYW5jZToKKyAgICAgICAgICAg
IHJlc3VsdC5tX3BhcnQgPSBTUF9HUklQUEVSSE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgU2Nyb2xsYmFyR3JpcHBlclZlcnRpY2FsQXBwZWFyYW5jZToKKyAgICAgICAgICAg
IHJlc3VsdC5tX3BhcnQgPSBTUF9HUklQUEVSVkVSVDsKKyAgICAgICAgICAgIGJyZWFrOworLyoK
KyAgICBTY3JvbGxiYXJCdXR0b25VcEFwcGVhcmFuY2UsIFNjcm9sbGJhckJ1dHRvbkRvd25BcHBl
YXJhbmNlLCAKKyAgICBTY3JvbGxiYXJCdXR0b25MZWZ0QXBwZWFyYW5jZSwgU2Nyb2xsYmFyQnV0
dG9uUmlnaHRBcHBlYXJhbmNlLAorICAgIFNsaWRlckhvcml6b250YWxBcHBlYXJhbmNlLCBTbGlk
ZXJWZXJ0aWNhbEFwcGVhcmFuY2UsIFNsaWRlclRodW1iSG9yaXpvbnRhbEFwcGVhcmFuY2UsCisg
ICAgU2xpZGVyVGh1bWJWZXJ0aWNhbEFwcGVhcmFuY2UsIENhcmV0QXBwZWFyYW5jZSwgU2VhcmNo
RmllbGRBcHBlYXJhbmNlLCBTZWFyY2hGaWVsZERlY29yYXRpb25BcHBlYXJhbmNlLAorKi8KICAg
ICB9CiAKICAgICByZXN1bHQubV9zdGF0ZSA9IGRldGVybWluZVN0YXRlKG8pOwpAQCAtMjczLDYg
KzMxMiwzNSBAQCBib29sIFJlbmRlclRoZW1lV2luOjpwYWludEJ1dHRvbihSZW5kZXJPCiAgICAg
cmV0dXJuIGZhbHNlOwogfQogCitib29sIFJlbmRlclRoZW1lV2luOjpwYWludEJ1dHRvbihHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHIsIHVuc2lnbmVkIHN0YXRlLCB1
bnNpZ25lZCBzaXplKQoreworICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGN0eCA9IGNvbnRl
eHQtPnBsYXRmb3JtQ29udGV4dCgpOworICAgc3RhdGUgPSBUU19BQ1RJVkU7CisKKyAgICAvLyBO
b3cgcGFpbnQgdGhlIGJ1dHRvbi4KKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoY29u
dGV4dCwgcik7ICAKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByOworICAgIGlmIChtX3RoZW1lRExM
ICYmICFtX2J1dHRvblRoZW1lKQorICAgICAgICBtX2J1dHRvblRoZW1lID0gb3BlblRoZW1lKDAs
IEwiQnV0dG9uIik7CisgICAgaWYgKG1fYnV0dG9uVGhlbWUgJiYgZHJhd1RoZW1lQkcpIHsKKyAg
ICAgICAgZHJhd1RoZW1lQkcobV9idXR0b25UaGVtZSwgaGRjLCBCUF9CVVRUT04sIHN0YXRlLCAm
d2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICBpZiAodHJ1ZSkgeyAvL2lz
Rm9jdXNlZChvKSkgeworICAgICAgICAgICAgLy8gRHJhdyBibGFjayBmb2N1cyByZWN0IGFyb3Vu
ZCBidXR0b24gb3V0ZXIgZWRnZQorICAgICAgICAgICAgSEJSVVNIIGJydXNoID0gR2V0U3lzQ29s
b3JCcnVzaChDT0xPUl8zRERLU0hBRE9XKTsKKyAgICAgICAgICAgIGlmIChicnVzaCkgeworICAg
ICAgICAgICAgICAgIEZyYW1lUmVjdChoZGMsICZ3aWRnZXRSZWN0LCBicnVzaCk7CisgICAgICAg
ICAgICAgICAgSW5mbGF0ZVJlY3QoJndpZGdldFJlY3QsIC0xLCAtMSk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgRHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3aWRnZXRSZWN0LCBE
RkNfQlVUVE9OLCAwKTsgLy90aGVtZURhdGEubV9jbGFzc2ljU3RhdGUpOworICAgIH0KKyAgICBk
b25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHIpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisK
IHZvaWQgUmVuZGVyVGhlbWVXaW46OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0CiB7CiAgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lm
aWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRoZW1lV2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
VGhlbWVXaW4uaAkocmV2aXNpb24gMzA0NTYpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJU
aGVtZVdpbi5oCSh3b3JraW5nIGNvcHkpCkBAIC02Nyw2ICs2Nyw3IEBAIHB1YmxpYzoKICAgICB7
IHJldHVybiBzZXRDaGVja2JveFNpemUoc3R5bGUpOyB9CiAKICAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50QnV0dG9uKEdyYXBoaWNzQ29u
dGV4dCosIGNvbnN0IEludFJlY3QmLCB1bnNpZ25lZCwgdW5zaWduZWQpOwogCiAgICAgdmlydHVh
bCBib29sIHBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwogCkBAIC05Miw2ICs5Myw3IEBAIHByaXZhdGU6
CiAgICAgbXV0YWJsZSBIQU5ETEUgbV9idXR0b25UaGVtZTsKICAgICBtdXRhYmxlIEhBTkRMRSBt
X3RleHRGaWVsZFRoZW1lOwogICAgIG11dGFibGUgSEFORExFIG1fbWVudUxpc3RUaGVtZTsKKyAg
ICBtdXRhYmxlIEhBTkRMRSBtX3Njcm9sbEJhclRoZW1lOwogfTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19280</attachid>
            <date>2008-02-22 09:21:09 -0800</date>
            <delta_ts>2008-02-24 20:38:18 -0800</delta_ts>
            <desc>Revised patch (paste error in text of patch)</desc>
            <filename>WinScrollbar.patch</filename>
            <type>text/plain</type>
            <size>43850</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IHBsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBs
YXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCShyZXZpc2lvbiAzMDQ3NSkKKysrIHBsYXRm
b3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDYsNiArMTA2
LDExIEBAIHByaXZhdGU6CiAgICAgaW50IG1fcHJlc3NlZFBvczsKICAgICBUaW1lcjxQbGF0Zm9y
bVNjcm9sbGJhcj4gbV9zY3JvbGxUaW1lcjsKICAgICBib29sIG1fb3ZlcmxhcHNSZXNpemVyOwor
CisjaWYgUExBVEZPUk0oQ0FJUk8pCisgICAgSE1PRFVMRSBtX3RoZW1lRExMOworICAgIG11dGFi
bGUgSEFORExFIG1fc2Nyb2xsQmFyVGhlbWU7CisjZW5kaWYKIH07CiAKIH0KSW5kZXg6IHBsYXRm
b3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0v
d2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkocmV2aXNpb24gMzA0NTYpCShmcm9tIHBsYXRm
b3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhclNhZmFyaS5jcHA6MzA0NTYpCisrKyBwbGF0Zm9ybS93
aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgVVNFX1NBRkFSSV9U
SEVNRSAKKworI2luY2x1ZGUgIlBsYXRmb3JtU2Nyb2xsQmFyLmgiCisKKyNpbmNsdWRlICJFdmVu
dEhhbmRsZXIuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNs
dWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgorCisj
aW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorI2luY2x1ZGUgPFNhZmFyaVRo
ZW1lL1NhZmFyaVRoZW1lLmg+CisKKy8vIEZJWE1FOiBUaGVyZSBhcmUgcmVwYWludGluZyBwcm9i
bGVtcyBkdWUgdG8gQXF1YSBzY3JvbGwgYmFyIGJ1dHRvbnMnIHZpc3VhbCBvdmVyZmxvdy4KKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1l
c3BhY2UgU2FmYXJpVGhlbWU7CisKKy8vIEZJWE1FOiBXZSBzaG91bGQgZ2V0IHRoZXNlIG51bWJl
cnMgZnJvbSBTYWZhcmlUaGVtZQorc3RhdGljIGludCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1
LCAxMSB9Oworc3RhdGljIGludCBjSG9yaXpvbnRhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0
YXRpYyBpbnQgY1ZlcnRpY2FsV2lkdGhbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0
aWNhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1JlYWxCdXR0b25MZW5ndGhb
XSA9IHsgMjgsIDIxIH07CitzdGF0aWMgaW50IGNCdXR0b25JbnNldFtdID0geyAxNCwgMTEgfTsK
K3N0YXRpYyBpbnQgY0J1dHRvbkhpdEluc2V0W10gPSB7IDMsIDIgfTsKKy8vIGNSZWFsQnV0dG9u
TGVuZ3RoIC0gY0J1dHRvbkluc2V0CitzdGF0aWMgaW50IGNCdXR0b25MZW5ndGhbXSA9IHsgMTQs
IDEwIH07CitzdGF0aWMgaW50IGNUaHVtYldpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGlu
dCBjVGh1bWJIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNUaHVtYk1pbkxlbmd0
aFtdID0geyAyNiwgMjAgfTsKKworI2lmICFkZWZpbmVkKE5ERUJVRykgJiYgZGVmaW5lZChVU0Vf
REVCVUdfU0FGQVJJX1RIRU1FKQorU09GVF9MSU5LX0RFQlVHX0xJQlJBUlkoU2FmYXJpVGhlbWUp
CisjZWxzZQorU09GVF9MSU5LX0xJQlJBUlkoU2FmYXJpVGhlbWUpCisjZW5kaWYKKworU09GVF9M
SU5LKFNhZmFyaVRoZW1lLCBwYWludFRoZW1lUGFydCwgdm9pZCwgX19zdGRjYWxsLCAoVGhlbWVQ
YXJ0IHBhcnQsIENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDR1JlY3QmIHJlY3QsIE5TQ29u
dHJvbFNpemUgc2l6ZSwgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUpLCAocGFydCwgY29udGV4dCwg
cmVjdCwgc2l6ZSwgc3RhdGUpKQorCitjb25zdCBkb3VibGUgY0luaXRpYWxUaW1lckRlbGF5ID0g
MC4yNTsKK2NvbnN0IGRvdWJsZSBjTm9ybWFsVGltZXJEZWxheSA9IDAuMDU7CisKK1BsYXRmb3Jt
U2Nyb2xsYmFyOjpQbGF0Zm9ybVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwgU2Ny
b2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUp
CisgICAgOiBTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6ZSksIG1faG92ZXJlZFBh
cnQoTm9QYXJ0KSwgbV9wcmVzc2VkUGFydChOb1BhcnQpLCBtX3ByZXNzZWRQb3MoMCksCisgICAg
ICBtX3Njcm9sbFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVy
RmlyZWQpLAorICAgICAgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCit7CisgICAgLy8gT2J0YWlu
IHRoZSBjb3JyZWN0IHNjcm9sbGJhciBzaXplcyBmcm9tIHRoZSBzeXN0ZW0uCisgICAgaWYgKCFj
SG9yaXpvbnRhbFdpZHRoKSB7CisgICAgICAgIC8vIEZJWE1FOiBHZXQgbWV0aWNzIGZyb20gU2Fm
YXJpVGhlbWUKKyAgICB9CisKKyAgICBpZiAob3JpZW50YXRpb24gPT0gVmVydGljYWxTY3JvbGxi
YXIpCisgICAgICAgIHNldEZyYW1lR2VvbWV0cnkoSW50UmVjdCgwLCAwLCBjVmVydGljYWxXaWR0
aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsSGVpZ2h0W2NvbnRyb2xTaXplKCldKSk7CisgICAg
ZWxzZQorICAgICAgICBzZXRGcmFtZUdlb21ldHJ5KEludFJlY3QoMCwgMCwgY0hvcml6b250YWxX
aWR0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pKTsK
K30KKworUGxhdGZvcm1TY3JvbGxiYXI6On5QbGF0Zm9ybVNjcm9sbGJhcigpCit7CisgICAgc3Rv
cFRpbWVySWZOZWVkZWQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1
bWJQb3NpdGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUHJvcG9ydGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRy
YWNrKCk7Cit9CisKK3N0YXRpYyBJbnRSZWN0IHRyYWNrUmVwYWludFJlY3QoY29uc3QgSW50UmVj
dCYgdHJhY2tSZWN0LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFy
Q29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgSW50UmVjdCBwYWludFJlY3QodHJhY2tS
ZWN0KTsKKyAgICBpZiAob3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAg
ICAgcGFpbnRSZWN0LmluZmxhdGVYKGNCdXR0b25MZW5ndGhbY29udHJvbFNpemVdKTsKKyAgICBl
bHNlCisgICAgICAgIHBhaW50UmVjdC5pbmZsYXRlWShjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXpl
XSk7CisKKyAgICByZXR1cm4gcGFpbnRSZWN0OworfQorCitzdGF0aWMgSW50UmVjdCBidXR0b25S
ZXBhaW50UmVjdChjb25zdCBJbnRSZWN0JiBidXR0b25SZWN0LCBTY3JvbGxiYXJPcmllbnRhdGlv
biBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUsIGJvb2wgc3Rh
cnQpCit7CisgICAgSW50UmVjdCBwYWludFJlY3QoYnV0dG9uUmVjdCk7CisgICAgaWYgKG9yaWVu
dGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgcGFpbnRSZWN0LnNldFdp
ZHRoKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisgICAgICAgIGlmICghc3RhcnQp
CisgICAgICAgICAgICBwYWludFJlY3Quc2V0WChidXR0b25SZWN0LngoKSAtIChjUmVhbEJ1dHRv
bkxlbmd0aFtjb250cm9sU2l6ZV0gLSBidXR0b25SZWN0LndpZHRoKCkpKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBwYWludFJlY3Quc2V0SGVpZ2h0KGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xT
aXplXSk7CisgICAgICAgIGlmICghc3RhcnQpCisgICAgICAgICAgICBwYWludFJlY3Quc2V0WShi
dXR0b25SZWN0LnkoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBidXR0b25S
ZWN0LmhlaWdodCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHBhaW50UmVjdDsKK30KKwordm9p
ZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52YWxpZGF0ZVRyYWNrKCkKK3sKKyAgICBJbnRSZWN0IHJl
Y3QgPSB0cmFja1JlcGFpbnRSZWN0KHRyYWNrUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250cm9s
U2l6ZSgpKTsKKyAgICByZWN0Lm1vdmUoLXgoKSwgLXkoKSk7CisgICAgaW52YWxpZGF0ZVJlY3Qo
cmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmludmFsaWRhdGVQYXJ0KFNjcm9s
bGJhclBhcnQgcGFydCkKK3sKKyAgICBpZiAocGFydCA9PSBOb1BhcnQpCisgICAgICAgIHJldHVy
bjsKKworICAgIEludFJlY3QgcmVzdWx0OyAgICAKKyAgICBzd2l0Y2ggKHBhcnQpIHsKKyAgICAg
ICAgY2FzZSBCYWNrQnV0dG9uUGFydDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGJ1dHRvblJlcGFp
bnRSZWN0KGJhY2tCdXR0b25SZWN0KCksIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHRy
dWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRm9yd2FyZEJ1dHRvblBhcnQ6
CisgICAgICAgICAgICByZXN1bHQgPSBidXR0b25SZXBhaW50UmVjdChmb3J3YXJkQnV0dG9uUmVj
dCgpLCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgSW50UmVjdCBiZWZvcmVUaHVt
YlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgICAgICAgICBzcGxpdFRyYWNr
KHRyYWNrUmVjdCgpLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Qp
OworICAgICAgICAgICAgaWYgKHBhcnQgPT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgICAg
ICByZXN1bHQgPSBiZWZvcmVUaHVtYlJlY3Q7CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0ID09
IEZvcndhcmRUcmFja1BhcnQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWZ0ZXJUaHVtYlJl
Y3Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGh1bWJSZWN0
OworICAgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5tb3ZlKC14KCksIC15KCkpOworICAgIGlu
dmFsaWRhdGVSZWN0KHJlc3VsdCk7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6d2lkdGgo
KSBjb25zdAoreworICAgIHJldHVybiBXaWRnZXQ6OndpZHRoKCk7Cit9CisKK2ludCBQbGF0Zm9y
bVNjcm9sbGJhcjo6aGVpZ2h0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gV2lkZ2V0OjpoZWlnaHQo
KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c2V0UmVjdChjb25zdCBJbnRSZWN0JiBy
ZWN0KQoreworICAgIC8vIEdldCBvdXIgd2luZG93IHJlc2l6ZXIgcmVjdCBhbmQgc2VlIGlmIHdl
IG92ZXJsYXAuICBBZGp1c3QgdG8gYXZvaWQgdGhlIG92ZXJsYXAKKyAgICAvLyBpZiBuZWNlc3Nh
cnkuCisgICAgSW50UmVjdCBhZGp1c3RlZFJlY3QocmVjdCk7CisgICAgaWYgKHBhcmVudCgpICYm
IHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKSB7CisgICAgICAgIGJvb2wgb3ZlcmxhcHNSZXNpemVy
ID0gZmFsc2U7CisgICAgICAgIEZyYW1lVmlldyogdmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKTsKKyAgICAgICAgSW50UmVjdCByZXNpemVyUmVjdCA9IHZpZXctPndpbmRv
d1Jlc2l6ZXJSZWN0KCk7CisgICAgICAgIHJlc2l6ZXJSZWN0LnNldExvY2F0aW9uKHZpZXctPmNv
bnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhyZXNpemVyUmVjdC5sb2NhdGlvbigpKSk7CisgICAg
ICAgIGlmIChyZWN0LmludGVyc2VjdHMocmVzaXplclJlY3QpKSB7CisgICAgICAgICAgICBpZiAo
b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgICAgICAgICAg
aW50IG92ZXJsYXAgPSByZWN0LnJpZ2h0KCkgLSByZXNpemVyUmVjdC54KCk7CisgICAgICAgICAg
ICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIHJlc2l6ZXJSZWN0LnJpZ2h0KCkgPj0gcmVjdC5yaWdo
dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdGVkUmVjdC5zZXRXaWR0aChyZWN0Lndp
ZHRoKCkgLSBvdmVybGFwKTsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHNSZXNpemVyID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgIGludCBvdmVybGFwID0gcmVjdC5ib3R0b20oKSAtIHJlc2l6ZXJSZWN0LnkoKTsKKyAg
ICAgICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDAgJiYgcmVzaXplclJlY3QuYm90dG9tKCkgPj0g
cmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFJlY3Quc2V0SGVp
Z2h0KHJlY3QuaGVpZ2h0KCkgLSBvdmVybGFwKTsKKyAgICAgICAgICAgICAgICAgICAgb3Zlcmxh
cHNSZXNpemVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKworICAgICAgICBpZiAob3ZlcmxhcHNSZXNpemVyICE9IG1fb3ZlcmxhcHNSZXNpemVy
KSB7CisgICAgICAgICAgICBtX292ZXJsYXBzUmVzaXplciA9IG92ZXJsYXBzUmVzaXplcjsKKyAg
ICAgICAgICAgIHZpZXctPmFkanVzdE92ZXJsYXBwaW5nU2Nyb2xsYmFyQ291bnQobV9vdmVybGFw
c1Jlc2l6ZXIgPyAxIDogLTEpOworICAgICAgICB9CisgICAgfQorCisgICAgc2V0RnJhbWVHZW9t
ZXRyeShhZGp1c3RlZFJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRQYXJl
bnQoU2Nyb2xsVmlldyogcGFyZW50VmlldykKK3sKKyAgICBpZiAoIXBhcmVudFZpZXcgJiYgbV9v
dmVybGFwc1Jlc2l6ZXIgJiYgcGFyZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpCisg
ICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+YWRqdXN0T3ZlcmxhcHBp
bmdTY3JvbGxiYXJDb3VudCgtMSk7CisgICAgV2lkZ2V0OjpzZXRQYXJlbnQocGFyZW50Vmlldyk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQor
eworICAgIGlmIChlbmFibGVkICE9IGlzRW5hYmxlZCgpKSB7CisgICAgICAgIFdpZGdldDo6c2V0
RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KK30KKwordm9p
ZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRl
eHQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpCit7CisgICAgaWYgKGdyYXBoaWNzQ29udGV4
dC0+dXBkYXRpbmdDb250cm9sVGludHMoKSkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZ3JhcGhpY3NDb250ZXh0LT5wYWludGluZ0Rp
c2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIERvbid0IHBhaW50IGFueXRoaW5n
IGlmIHRoZSBzY3JvbGxiYXIgZG9lc24ndCBpbnRlcnNlY3QgdGhlIGRhbWFnZSByZWN0LgorICAg
IGlmICghZnJhbWVHZW9tZXRyeSgpLmludGVyc2VjdHMoZGFtYWdlUmVjdCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIEludFJlY3QgdHJhY2sgPSB0cmFja1JlY3QoKTsKKyAgICBwYWludFRyYWNr
KGdyYXBoaWNzQ29udGV4dCwgdHJhY2ssIHRydWUsIGRhbWFnZVJlY3QpOworCisgICAgaWYgKGhh
c0J1dHRvbnMoKSkgeworICAgICAgICBwYWludEJ1dHRvbihncmFwaGljc0NvbnRleHQsIGJhY2tC
dXR0b25SZWN0KCksIHRydWUsIGRhbWFnZVJlY3QpOworICAgICAgICBwYWludEJ1dHRvbihncmFw
aGljc0NvbnRleHQsIGZvcndhcmRCdXR0b25SZWN0KCksIGZhbHNlLCBkYW1hZ2VSZWN0KTsKKyAg
ICB9CisKKyAgICBpZiAoaGFzVGh1bWIoKSAmJiBkYW1hZ2VSZWN0LmludGVyc2VjdHModHJhY2sp
KSB7CisgICAgICAgIEludFJlY3Qgc3RhcnRUcmFja1JlY3QsIHRodW1iUmVjdCwgZW5kVHJhY2tS
ZWN0OworICAgICAgICBzcGxpdFRyYWNrKHRyYWNrLCBzdGFydFRyYWNrUmVjdCwgdGh1bWJSZWN0
LCBlbmRUcmFja1JlY3QpOworICAgICAgICBwYWludFRodW1iKGdyYXBoaWNzQ29udGV4dCwgdGh1
bWJSZWN0LCBkYW1hZ2VSZWN0KTsKKyAgICB9Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6
Omhhc0J1dHRvbnMoKSBjb25zdAoreworICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgpKSA+PSAy
ICogKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldIC0gY0J1dHRvbkhpdEluc2V0W2Nv
bnRyb2xTaXplKCldKTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFzVGh1bWIoKSBj
b25zdAoreworICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgpKSA+PSAyICogY0J1dHRvbkluc2V0
W2NvbnRyb2xTaXplKCldICsgY1RodW1iTWluTGVuZ3RoW2NvbnRyb2xTaXplKCldICsgMTsKK30K
KworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6YmFja0J1dHRvblJlY3QoKSBjb25zdAorewor
ICAgIC8vIE91ciBkZXNpcmVkIHJlY3QgaXMgZXNzZW50aWFsbHkgMTd4MTcuCisgICAgCisgICAg
Ly8gT3VyIGFjdHVhbCByZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFj
ZSB3aGVuCisgICAgLy8gd2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhl
IHNjcm9sbGJhcgorICAgIC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlu
eSBzaXplcy4KKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQor
ICAgICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6
ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAgIHJldHVybiBJbnRS
ZWN0KHgoKSwgeSgpLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0J1dHRvbkxlbmd0
aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmZvcndh
cmRCdXR0b25SZWN0KCkgY29uc3QKK3sKKyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2Vu
dGlhbGx5IDE3eDE3LgorICAgIAorICAgIC8vIE91ciBhY3R1YWwgcmVjdCB3aWxsIHNocmluayB0
byBoYWxmIHRoZSBhdmFpbGFibGUgc3BhY2Ugd2hlbgorICAgIC8vIHdlIGhhdmUgPCAzNCBwaXhl
bHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRoZSBzY3JvbGxiYXIKKyAgICAvLyB0byBzY2FsZSBkb3du
IGFuZCBmdW5jdGlvbiBldmVuIGF0IHRpbnkgc2l6ZXMuCisKKyAgICBpZiAobV9vcmllbnRhdGlv
biA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyB3
aWR0aCgpIC0gY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgeSgpLCBjQnV0dG9uTGVuZ3Ro
W2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAg
cmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyBoZWlnaHQoKSAtIGNCdXR0b25MZW5ndGhbY29udHJv
bFNpemUoKV0sIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjQnV0dG9uTGVuZ3RoW2Nv
bnRyb2xTaXplKCldKTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tSZWN0
KCkgY29uc3QKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
KSB7CisgICAgICAgIGlmICghaGFzQnV0dG9ucygpKQorICAgICAgICAgICAgcmV0dXJuIEludFJl
Y3QoeCgpLCB5KCksIHdpZHRoKCksIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsK
KyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpICsgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgp
XSwgeSgpLCB3aWR0aCgpIC0gMiAqIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNIb3Jp
em9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICB9CisKKyAgICBpZiAoIWhhc0J1dHRv
bnMoKSkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdpZHRoW2Nv
bnRyb2xTaXplKCldLCBoZWlnaHQoKSk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyBj
QnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgp
XSwgaGVpZ2h0KCkgLSAyICogY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0lu
dFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUmVjdCgpIGNvbnN0Cit7CisgICAgSW50UmVj
dCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgc3BsaXRU
cmFjayh0cmFja1JlY3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJS
ZWN0KTsKKyAgICByZXR1cm4gdGh1bWJSZWN0OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
OjpzcGxpdFRyYWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVmb3JlVGh1
bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0KSBjb25z
dAoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVubGVzcyB3
ZSdyZSBiaWcgZW5vdWdoIHRvIGhhdmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0aHJlZSBy
ZWN0cyB3aGVyZSBhdCBsZWFzdAorICAgIC8vIG9uZSBvZiB0aGVtIGlzIG5vbi1lbXB0eS4KKyAg
ICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAgaWYgKG1fb3JpZW50YXRpb24g
PT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRy
YWNrUmVjdC54KCkgKyB0aHVtYlBvcywgdHJhY2tSZWN0LnkoKSArICh0cmFja1JlY3QuaGVpZ2h0
KCkgLSBjVGh1bWJIZWlnaHRbY29udHJvbFNpemUoKV0pIC8gMiwgdGh1bWJMZW5ndGgoKSwgY1Ro
dW1iSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50
UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1JlY3QueSgpLCB0aHVtYlBvcywgdHJhY2tSZWN0Lmhl
aWdodCgpKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJbnRSZWN0KHRodW1iUmVjdC54KCkg
KyB0aHVtYlJlY3Qud2lkdGgoKSwgdHJhY2tSZWN0LnkoKSwgdHJhY2tSZWN0LnJpZ2h0KCkgLSB0
aHVtYlJlY3QucmlnaHQoKSwgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyAodHJhY2tSZWN0LndpZHRo
KCkgLSBjVGh1bWJXaWR0aFtjb250cm9sU2l6ZSgpXSkgLyAyLCB0cmFja1JlY3QueSgpICsgdGh1
bWJQb3MsIGNUaHVtYldpZHRoW2NvbnRyb2xTaXplKCldLCB0aHVtYkxlbmd0aCgpKTsKKyAgICAg
ICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1JlY3QueSgp
LCB0cmFja1JlY3Qud2lkdGgoKSwgdGh1bWJQb3MpOworICAgICAgICBhZnRlclRodW1iUmVjdCA9
IEludFJlY3QodHJhY2tSZWN0LngoKSwgdGh1bWJSZWN0LnkoKSArIHRodW1iUmVjdC5oZWlnaHQo
KSwgdHJhY2tSZWN0LndpZHRoKCksIHRyYWNrUmVjdC5ib3R0b20oKSAtIHRodW1iUmVjdC5ib3R0
b20oKSk7CisgICAgfQorfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUG9zaXRpb24o
KSBjb25zdAoreworICAgIGlmIChpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIChmbG9hdClt
X2N1cnJlbnRQb3MgKiAodHJhY2tMZW5ndGgoKSAtIHRodW1iTGVuZ3RoKCkpIC8gKG1fdG90YWxT
aXplIC0gbV92aXNpYmxlU2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQbGF0Zm9ybVNj
cm9sbGJhcjo6dGh1bWJMZW5ndGgoKSBjb25zdAoreworICAgIGlmICghaXNFbmFibGVkKCkpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgZmxvYXQgcHJvcG9ydGlvbiA9IChmbG9hdCkobV92aXNp
YmxlU2l6ZSkgLyBtX3RvdGFsU2l6ZTsKKyAgICBpbnQgdHJhY2tMZW4gPSB0cmFja0xlbmd0aCgp
OworICAgIGludCBsZW5ndGggPSBwcm9wb3J0aW9uICogdHJhY2tMZW47CisgICAgaW50IG1pbkxl
bmd0aCA9IGNUaHVtYk1pbkxlbmd0aFtjb250cm9sU2l6ZSgpXTsKKyAgICBsZW5ndGggPSBtYXgo
bGVuZ3RoLCBtaW5MZW5ndGgpOworICAgIGlmIChsZW5ndGggPiB0cmFja0xlbikKKyAgICAgICAg
bGVuZ3RoID0gMDsgLy8gT25jZSB0aGUgdGh1bWIgaXMgYmVsb3cgdGhlIHRyYWNrIGxlbmd0aCwg
aXQganVzdCBnb2VzIGF3YXkgKHRvIG1ha2UgbW9yZSByb29tIGZvciB0aGUgdHJhY2spLgorICAg
IHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5ndGgo
KSBjb25zdAoreworICAgIHJldHVybiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyKSA/IHRyYWNrUmVjdCgpLndpZHRoKCkgOiB0cmFja1JlY3QoKS5oZWlnaHQoKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1h
Z2VSZWN0KSBjb25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIEludFJlY3QgcGFpbnRSZWN0ID0gYnV0dG9uUmVwYWludFJlY3QocmVj
dCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwgc3RhcnQpOworICAgIAorICAgIGlmICgh
ZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAg
IFRoZW1lUGFydCBwYXJ0OworICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICBp
ZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOwor
ICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgIHBh
cnQgPSBzdGFydCA/IFNjcm9sbExlZnRBcnJvd1BhcnQgOiBTY3JvbGxSaWdodEFycm93UGFydDsK
KyAgICBlbHNlCisgICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbFVwQXJyb3dQYXJ0IDogU2Ny
b2xsRG93bkFycm93UGFydDsKKworICAgIGlmIChpc0VuYWJsZWQoKSkKKyAgICAgICAgc3RhdGUg
fD0gRW5hYmxlZFN0YXRlOworICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFy
dCAmJiBzdGFydCkKKyAgICAgICAgfHwgKG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblBh
cnQgJiYgIXN0YXJ0KSkKKyAgICAgICAgc3RhdGUgfD0gUHJlc3NlZFN0YXRlOworCisgICAgcGFp
bnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwg
Y29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5T
UmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6
OnBhaW50VHJhY2soR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0
LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlm
ICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3Qg
cGFpbnRSZWN0ID0gaGFzQnV0dG9ucygpID8gdHJhY2tSZXBhaW50UmVjdChyZWN0LCBtX29yaWVu
dGF0aW9uLCBjb250cm9sU2l6ZSgpKSA6IHJlY3Q7CisgICAgCisgICAgaWYgKCFkYW1hZ2VSZWN0
LmludGVyc2VjdHMocGFpbnRSZWN0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVGhlbWVQYXJ0
IHBhcnQgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVHJh
Y2tQYXJ0IDogVlNjcm9sbFRyYWNrUGFydDsKKyAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9
IDA7CisgICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQorICAgICAgICBzdGF0ZSB8PSBBY3Rp
dmVTdGF0ZTsKKyAgICBpZiAoaGFzQnV0dG9ucygpKQorICAgICAgICBzdGF0ZSB8PSBFbmFibGVk
U3RhdGU7CisKKyAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKSwgcGFpbnRSZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFs
bENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKK30KKwordm9pZCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNv
bnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7Cisg
ICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFRo
ZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gSFNj
cm9sbFRodW1iUGFydCA6IFZTY3JvbGxUaHVtYlBhcnQ7CisgICAgVGhlbWVDb250cm9sU3RhdGUg
c3RhdGUgPSAwOworICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICAgICAgc3RhdGUg
fD0gQWN0aXZlU3RhdGU7CisgICAgaWYgKGlzRW5hYmxlZCgpKQorICAgICAgICBzdGF0ZSB8PSBF
bmFibGVkU3RhdGU7CisKKyAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKSwgcmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21h
bGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisKK1Njcm9s
bGJhclBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRlc3QoY29uc3QgUGxhdGZvcm1Nb3VzZUV2
ZW50JiBldnQpCit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIE5vUGFy
dDsKKworICAgIEludFBvaW50IG1vdXNlUG9zaXRpb24gPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdX
aW5kb3coZXZ0LnBvcygpKTsKKyAgICBtb3VzZVBvc2l0aW9uLm1vdmUoeCgpLCB5KCkpOworCisg
ICAgaWYgKGhhc0J1dHRvbnMoKSkgeworICAgICAgICBpZiAoYmFja0J1dHRvblJlY3QoKS5jb250
YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBCYWNrQnV0dG9uUGFydDsK
KworICAgICAgICBpZiAoZm9yd2FyZEJ1dHRvblJlY3QoKS5jb250YWlucyhtb3VzZVBvc2l0aW9u
KSkKKyAgICAgICAgICAgIHJldHVybiBGb3J3YXJkQnV0dG9uUGFydDsKKyAgICB9CisKKyAgICBp
ZiAoIWhhc1RodW1iKCkpCisgICAgICAgIHJldHVybiBOb1BhcnQ7CisKKyAgICBJbnRSZWN0IHRy
YWNrID0gdHJhY2tSZWN0KCk7CisgICAgaWYgKHRyYWNrLmNvbnRhaW5zKG1vdXNlUG9zaXRpb24p
KSB7CisgICAgICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1
bWJSZWN0OworICAgICAgICBzcGxpdFRyYWNrKHRyYWNrLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1i
UmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOworICAgICAgICBpZiAoYmVmb3JlVGh1bWJSZWN0LmNvbnRh
aW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuIEJhY2tUcmFja1BhcnQ7Cisg
ICAgICAgIGlmICh0aHVtYlJlY3QuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAg
ICByZXR1cm4gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm4gRm9yd2FyZFRyYWNrUGFydDsKKyAg
ICB9CisgICAgcmV0dXJuIE5vUGFydDsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFu
ZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAg
aWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0KSB7CisgICAgICAgIC8vIERyYWcgdGhlIHRo
dW1iLgorICAgICAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAgICAgIGlu
dCB0aHVtYkxlbiA9IHRodW1iTGVuZ3RoKCk7CisgICAgICAgIGludCB0cmFja0xlbiA9IHRyYWNr
TGVuZ3RoKCk7CisgICAgICAgIGludCBtYXhQb3MgPSB0cmFja0xlbiAtIHRodW1iTGVuOworICAg
ICAgICBpbnQgZGVsdGEgPSAwOworICAgICAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9u
dGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdX
aW5kb3coZXZ0LnBvcygpKS54KCkgLSBtX3ByZXNzZWRQb3M7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIGRlbHRhID0gY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgp
IC0gbV9wcmVzc2VkUG9zOworCisgICAgICAgIGlmIChkZWx0YSA+IDApCisgICAgICAgICAgICAv
LyBUaGUgbW91c2UgbW92ZWQgZG93bi9yaWdodC4KKyAgICAgICAgICAgIGRlbHRhID0gbWluKG1h
eFBvcyAtIHRodW1iUG9zLCBkZWx0YSk7CisgICAgICAgIGVsc2UgaWYgKGRlbHRhIDwgMCkKKyAg
ICAgICAgICAgIC8vIFRoZSBtb3VzZSBtb3ZlZCB1cC9sZWZ0LgorICAgICAgICAgICAgZGVsdGEg
PSBtYXgoLXRodW1iUG9zLCBkZWx0YSk7CisKKyAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKKyAg
ICAgICAgICAgIHNldFZhbHVlKChmbG9hdCkodGh1bWJQb3MgKyBkZWx0YSkgKiAobV90b3RhbFNp
emUgLSBtX3Zpc2libGVTaXplKSAvICh0cmFja0xlbiAtIHRodW1iTGVuKSk7CisgICAgICAgICAg
ICBtX3ByZXNzZWRQb3MgKz0gdGh1bWJQb3NpdGlvbigpIC0gdGh1bWJQb3M7CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChtX3ByZXNz
ZWRQYXJ0ICE9IE5vUGFydCkKKyAgICAgICAgbV9wcmVzc2VkUG9zID0gKG1fb3JpZW50YXRpb24g
PT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQu
cG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLnkoKSk7
CisKKyAgICBTY3JvbGxiYXJQYXJ0IHBhcnQgPSBoaXRUZXN0KGV2dCk7ICAgIAorICAgIGlmIChw
YXJ0ICE9IG1faG92ZXJlZFBhcnQpIHsKKyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQgIT0gTm9Q
YXJ0KSB7CisgICAgICAgICAgICBpZiAocGFydCA9PSBtX3ByZXNzZWRQYXJ0KSB7CisgICAgICAg
ICAgICAgICAgLy8gVGhlIG1vdXNlIGlzIG1vdmluZyBiYWNrIG92ZXIgdGhlIHByZXNzZWQgcGFy
dC4gIFdlCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdGFydCB1cCB0aGUgdGltZXIgYWN0
aW9uIGFnYWluLgorICAgICAgICAgICAgICAgIHN0YXJ0VGltZXJJZk5lZWRlZChjTm9ybWFsVGlt
ZXJEZWxheSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7
CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1faG92ZXJlZFBhcnQgPT0gbV9wcmVzc2VkUGFydCkg
eworICAgICAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBpcyBsZWF2aW5nIHRoZSBwcmVzc2VkIHBh
cnQuICBLaWxsIG91ciB0aW1lcgorICAgICAgICAgICAgICAgIC8vIGlmIG5lZWRlZC4KKyAgICAg
ICAgICAgICAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworICAgICAgICAgICAgICAgIGludmFsaWRh
dGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQocGFydCk7CisgICAgICAgICAgICBpbnZhbGlkYXRl
UGFydChtX2hvdmVyZWRQYXJ0KTsKKyAgICAgICAgfQorICAgICAgICBtX2hvdmVyZWRQYXJ0ID0g
cGFydDsKKyAgICB9IAorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3Jv
bGxiYXI6OmhhbmRsZU1vdXNlT3V0RXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQp
Cit7CisgICAgaW52YWxpZGF0ZVBhcnQobV9ob3ZlcmVkUGFydCk7CisgICAgbV9ob3ZlcmVkUGFy
dCA9IE5vUGFydDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xs
YmFyOjpoYW5kbGVNb3VzZVByZXNzRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQp
Cit7CisgICAgbV9wcmVzc2VkUGFydCA9IGhpdFRlc3QoZXZ0KTsKKyAgICBtX3ByZXNzZWRQb3Mg
PSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gY29udmVydEZyb21Db250
YWluaW5nV2luZG93KGV2dC5wb3MoKSkueCgpIDogY29udmVydEZyb21Db250YWluaW5nV2luZG93
KGV2dC5wb3MoKSkueSgpKTsKKyAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAg
ICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoY0luaXRpYWxUaW1lckRlbGF5KTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZl
bnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaW52YWxpZGF0ZVBhcnQo
bV9wcmVzc2VkUGFydCk7CisgICAgbV9wcmVzc2VkUGFydCA9IE5vUGFydDsKKyAgICBtX3ByZXNz
ZWRQb3MgPSAwOworICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisKKyAgICBpZiAocGFyZW50KCkg
JiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPnNldE1vdXNlUHJlc3NlZChm
YWxzZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6
c3RhcnRUaW1lcklmTmVlZGVkKGRvdWJsZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBkbyBhbnl0
aGluZyBmb3IgdGhlIHRodW1iLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4gIFdlIGhhbHQgdHJh
Y2sgc2Nyb2xsaW5nIG9uY2UgdGhlIHRodW1iIGlzIGxldmVsCisgICAgLy8gd2l0aCB1cy4KKyAg
ICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09
IEZvcndhcmRUcmFja1BhcnQpICYmIHRodW1iVW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFs
aWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQ
YXJ0OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgY2FuJ3Qgc2Nyb2xsIGlm
IHdlJ3ZlIGhpdCB0aGUgYmVnaW5uaW5nIG9yIGVuZC4KKyAgICBTY3JvbGxEaXJlY3Rpb24gZGly
ID0gcHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKTsKKyAgICBpZiAoZGlyID09IFNjcm9sbFVw
IHx8IGRpciA9PSBTY3JvbGxMZWZ0KSB7CisgICAgICAgIGlmIChtX2N1cnJlbnRQb3MgPT0gMCkK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9jdXJyZW50
UG9zID09IG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBtX3Njcm9sbFRpbWVyLnN0YXJ0T25lU2hvdChkZWxheSk7Cit9CisKK3Zv
aWQgUGxhdGZvcm1TY3JvbGxiYXI6OnN0b3BUaW1lcklmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9z
Y3JvbGxUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9sbFRpbWVyLnN0b3AoKTsKK30K
Kwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFByZXNzZWRQYXJ0KGRvdWJsZSBk
ZWxheSkKK3sKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhlIHRodW1iIG9yIGlmIG5v
dGhpbmcgd2FzIHByZXNzZWQuCisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0IHx8
IG1fcHJlc3NlZFBhcnQgPT0gTm9QYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBIYW5k
bGUgdGhlIHRyYWNrLgorICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0IHx8
IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkgJiYgdGh1bWJVbmRlck1vdXNlKCkp
IHsKKyAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgIG1faG92
ZXJlZFBhcnQgPSBUaHVtYlBhcnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBI
YW5kbGUgdGhlIGFycm93cyBhbmQgdHJhY2suCisgICAgaWYgKHNjcm9sbChwcmVzc2VkUGFydFNj
cm9sbERpcmVjdGlvbigpLCBwcmVzc2VkUGFydFNjcm9sbEdyYW51bGFyaXR5KCkpKQorICAgICAg
ICBzdGFydFRpbWVySWZOZWVkZWQoZGVsYXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
OjphdXRvc2Nyb2xsVGltZXJGaXJlZChUaW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4qKQoreworICAg
IGF1dG9zY3JvbGxQcmVzc2VkUGFydChjTm9ybWFsVGltZXJEZWxheSk7Cit9CisKK1Njcm9sbERp
cmVjdGlvbiBQbGF0Zm9ybVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKQor
eworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAg
ICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2VkUGFydCA9
PSBCYWNrVHJhY2tQYXJ0KQorICAgICAgICAgICAgcmV0dXJuIFNjcm9sbExlZnQ7CisgICAgICAg
IHJldHVybiBTY3JvbGxSaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9wcmVzc2Vk
UGFydCA9PSBCYWNrQnV0dG9uUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQp
CisgICAgICAgICAgICByZXR1cm4gU2Nyb2xsVXA7CisgICAgICAgIHJldHVybiBTY3JvbGxEb3du
OworICAgIH0KK30KKworU2Nyb2xsR3JhbnVsYXJpdHkgUGxhdGZvcm1TY3JvbGxiYXI6OnByZXNz
ZWRQYXJ0U2Nyb2xsR3JhbnVsYXJpdHkoKQoreworICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJh
Y2tCdXR0b25QYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblBhcnQpCisgICAg
ICAgIHJldHVybiBTY3JvbGxCeUxpbmU7CisgICAgcmV0dXJuIFNjcm9sbEJ5UGFnZTsKK30KKwor
Ym9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJVbmRlck1vdXNlKCkKK3sKKyAgICAvLyBDb25z
dHJ1Y3QgYSByZWN0LgorICAgIEludFJlY3QgdGh1bWIgPSB0aHVtYlJlY3QoKTsKKyAgICB0aHVt
Yi5tb3ZlKC14KCksIC15KCkpOworICAgIGludCBiZWdpbiA9IChtX29yaWVudGF0aW9uID09IEhv
cml6b250YWxTY3JvbGxiYXIpID8gdGh1bWIueCgpIDogdGh1bWIueSgpOworICAgIGludCBlbmQg
PSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLnJpZ2h0KCkg
OiB0aHVtYi5ib3R0b20oKTsKKyAgICByZXR1cm4gKGJlZ2luIDw9IG1fcHJlc3NlZFBvcyAmJiBt
X3ByZXNzZWRQb3MgPCBlbmQpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6Omhvcml6b250
YWxTY3JvbGxiYXJIZWlnaHQoU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7Cisg
ICAgcmV0dXJuIGNIb3Jpem9udGFsV2lkdGhbY29udHJvbFNpemVdOworfQorCitpbnQgUGxhdGZv
cm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgoU2Nyb2xsYmFyQ29udHJvbFNpemUg
Y29udHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNWZXJ0aWNhbEhlaWdodFtjb250cm9sU2l6ZV07
Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OndpbmRvd0NsaXBSZWN0KCkgY29uc3QK
K3sKKyAgICBJbnRSZWN0IGNsaXBSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBj
bGlwUmVjdCA9IGNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3coY2xpcFJlY3QpOworICAgIGlmICht
X2NsaWVudCkKKyAgICAgICAgY2xpcFJlY3QuaW50ZXJzZWN0KG1fY2xpZW50LT53aW5kb3dDbGlw
UmVjdCgpKTsKKyAgICByZXR1cm4gY2xpcFJlY3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxi
YXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAorewor
fQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVyUmVjdChjb25zdCBJbnRSZWN0
JiB0aHVtYlJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwordm9pZCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVDaGFuZ2VkKCkKK3sKK30KKworfQorCisjZW5kaWYgLy8g
ZGVmaW5lZChVU0VfU0FGQVJJX1RIRU1FKQpJbmRleDogcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Ny
b2xsQmFyV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxC
YXJXaW4uY3BwCShyZXZpc2lvbiAzMDQ1NikKKysrIHBsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9s
bEJhcldpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJp
Z2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMDggQnJlbnQgRnVsZ2hhbQogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC0yNSw3ICsyNiw2IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAotI2lmZGVmIFVTRV9T
QUZBUklfVEhFTUUgCiAKICNpbmNsdWRlICJQbGF0Zm9ybVNjcm9sbEJhci5oIgogCkBAIC0zNywx
NyArMzcsNDAgQEAKICNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKICNpbmNsdWRlICJT
b2Z0TGlua2luZy5oIgogCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgot
I2luY2x1ZGUgPFNhZmFyaVRoZW1lL1NhZmFyaVRoZW1lLmg+CisjaW5jbHVkZSA8d2luZG93cy5o
PgorI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luLmgiCiAKLS8vIEZJWE1FOiBUaGVyZSBhcmUgcmVw
YWludGluZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBzY3JvbGwgYmFyIGJ1dHRvbnMnIHZpc3VhbCBv
dmVyZmxvdy4KKy8vIEdlbmVyaWMgc3RhdGUgY29uc3RhbnRzCisjZGVmaW5lIFRTX05PUk1BTCAg
ICAxCisjZGVmaW5lIFRTX0hPVkVSICAgICAyCisjZGVmaW5lIFRTX0FDVElWRSAgICAzCisjZGVm
aW5lIFRTX0RJU0FCTEVEICA0CisjZGVmaW5lIFRTX0ZPQ1VTRUQgICA1CisKKyNkZWZpbmUgQUJT
X1VQTk9STUFMIDEKKyNkZWZpbmUgQUJTX0RPV05OT1JNQUwgNQorI2RlZmluZSBBQlNfTEVGVE5P
Uk1BTCA5CisjZGVmaW5lIEFCU19SSUdIVE5PUk1BTCAxMworCitjb25zdCB1bnNpZ25lZCBTUF9B
QlNfSE9UX01PRElGSUVSID0gMTsKK2NvbnN0IHVuc2lnbmVkIFNQX0FCU19QUkVTU0VEX01PRElG
SUVSID0gMjsKK2NvbnN0IHVuc2lnbmVkIFNQX0FCU19ESVNBQkxFX01PRElGSUVSID0gMzsKKwor
Ly8gU2Nyb2xsYmFyIGNvbnN0YW50cworI2RlZmluZSBTUF9CVVRUT04gMQorI2RlZmluZSBTUF9U
SFVNQkhPUiAyCisjZGVmaW5lIFNQX1RIVU1CVkVSVCAzCisjZGVmaW5lIFNQX1RSQUNLU1RBUlRI
T1IgNAorI2RlZmluZSBTUF9UUkFDS0VOREhPUiA1CisjZGVmaW5lIFNQX1RSQUNLU1RBUlRWRVJU
IDYKKyNkZWZpbmUgU1BfVFJBQ0tFTkRWRVJUIDcKKyNkZWZpbmUgU1BfR1JJUFBFUkhPUiA4Cisj
ZGVmaW5lIFNQX0dSSVBQRVJWRVJUIDkKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3BhY2UgU2FmYXJpVGhlbWU7Ci0KIC8vIEZJWE1F
OiBXZSBzaG91bGQgZ2V0IHRoZXNlIG51bWJlcnMgZnJvbSBTYWZhcmlUaGVtZQogc3RhdGljIGlu
dCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1LCAxMSB9Owogc3RhdGljIGludCBjSG9yaXpvbnRh
bEhlaWdodFtdID0geyAxNSwgMTEgfTsKQEAgLTYyLDIyICs4NSw3OSBAQCBzdGF0aWMgaW50IGNU
aHVtYldpZHRoW10gPSB7IDE1LCAxMSB9Owogc3RhdGljIGludCBjVGh1bWJIZWlnaHRbXSA9IHsg
MTUsIDExIH07CiBzdGF0aWMgaW50IGNUaHVtYk1pbkxlbmd0aFtdID0geyAyNiwgMjAgfTsKIAot
I2lmICFkZWZpbmVkKE5ERUJVRykgJiYgZGVmaW5lZChVU0VfREVCVUdfU0FGQVJJX1RIRU1FKQot
U09GVF9MSU5LX0RFQlVHX0xJQlJBUlkoU2FmYXJpVGhlbWUpCi0jZWxzZQotU09GVF9MSU5LX0xJ
QlJBUlkoU2FmYXJpVGhlbWUpCi0jZW5kaWYKIAotU09GVF9MSU5LKFNhZmFyaVRoZW1lLCBwYWlu
dFRoZW1lUGFydCwgdm9pZCwgX19zdGRjYWxsLCAoVGhlbWVQYXJ0IHBhcnQsIENHQ29udGV4dFJl
ZiBjb250ZXh0LCBjb25zdCBDR1JlY3QmIHJlY3QsIE5TQ29udHJvbFNpemUgc2l6ZSwgVGhlbWVD
b250cm9sU3RhdGUgc3RhdGUpLCAocGFydCwgY29udGV4dCwgcmVjdCwgc2l6ZSwgc3RhdGUpKQor
CisvLyBOb3RlOiAgQ29waWVkIGZyb20gUmVuZGVyVGhlbWVXaW4uICBUaGVyZSBzaG91bGQgYmUg
c29tZSB3YXkgdG8gYmV0dGVyCisvLyBlbmNhcHN1bGF0ZS9zaGFyZSB0aGlzIHN0dWZmLiAgU2Vl
IGFsbCBSZW5kZXJUaGVtZVNhZmFyaSBmb3IgbW9yZSBzdWNoIHN0dWZmLi4uCisvLworLy8gQWZ0
ZXIgZGlzY3Vzc2lvbiB3aXRoIEFkYW0gUm9iZW4sIHdlIHdpbGwgbWFrZSB0aGUgdWdseSBjaG9p
Y2Ugb2YgY29weWluZyBsb2dpYworLy8gZnJvbSBSZW5kZXJUaGVtZVdpbiB1bnRpbCB0aGUgVGhl
bWUgbG9naWMgaXMgcmVmYWN0b3JlZAordHlwZWRlZiBIQU5ETEUgKFdJTkFQSSpvcGVuVGhlbWVE
YXRhUHRyKShIV05EIGh3bmQsIExQQ1dTVFIgcHN6Q2xhc3NMaXN0KTsKK3R5cGVkZWYgSFJFU1VM
VCAoV0lOQVBJKmNsb3NlVGhlbWVEYXRhUHRyKShIQU5ETEUgaFRoZW1lKTsKK3R5cGVkZWYgSFJF
U1VMVCAoV0lOQVBJKmRyYXdUaGVtZUJhY2tncm91bmRQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBo
ZGMsIGludCBpUGFydElkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCAqcFJlY3QsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUKiBwQ2xpcFJlY3QpOwordHlwZWRlZiBI
UkVTVUxUIChXSU5BUEkqZHJhd1RoZW1lRWRnZVB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywg
aW50IGlQYXJ0SWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUICpwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVFZGdlLCB1bnNpZ25lZCB1RmxhZ3MsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUKiBwQ2xpcFJl
Y3QpOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVDb250ZW50UmVjdFB0cikoSEFO
RExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDVCogcENvbnRlbnRSZWN0
KTsKK3R5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lUGFydFNpemVQdHIpKEhBTkRMRSBo
VGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBSRUNUKiBwcmMsIGludCB0cywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUqIHBzeik7Cit0eXBlZGVmIEhSRVNVTFQg
KFdJTkFQSSpnZXRUaGVtZVN5c0ZvbnRQdHIpKEhBTkRMRSBoVGhlbWUsIGludCBpRm9udElkLCBP
VVQgTE9HRk9OVCogcEZvbnQpOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVDb2xv
clB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJZCwgaW50IGlQcm9wSWQsIE9VVCBDT0xP
UlJFRiogcEZvbnQpOworCitzdGF0aWMgb3BlblRoZW1lRGF0YVB0ciBvcGVuVGhlbWUgPSAwOwor
c3RhdGljIGNsb3NlVGhlbWVEYXRhUHRyIGNsb3NlVGhlbWUgPSAwOworc3RhdGljIGRyYXdUaGVt
ZUJhY2tncm91bmRQdHIgZHJhd1RoZW1lQkcgPSAwOworc3RhdGljIGRyYXdUaGVtZUVkZ2VQdHIg
ZHJhd1RoZW1lRWRnZSA9IDA7CitzdGF0aWMgZ2V0VGhlbWVDb250ZW50UmVjdFB0ciBnZXRUaGVt
ZUNvbnRlbnRSZWN0ID0gMDsKK3N0YXRpYyBnZXRUaGVtZVBhcnRTaXplUHRyIGdldFRoZW1lUGFy
dFNpemUgPSAwOworc3RhdGljIGdldFRoZW1lU3lzRm9udFB0ciBnZXRUaGVtZVN5c0ZvbnQgPSAw
Oworc3RhdGljIGdldFRoZW1lQ29sb3JQdHIgZ2V0VGhlbWVDb2xvciA9IDA7CisKKy8vIE1heSBu
ZWVkIHRvIGFkZCBzdHVmZiB0byB0aGVzZSBsYXRlciwgc28ga2VlcCB0aGUgZ3JhcGhpY3MgY29u
dGV4dCByZXRyaWV2YWwvcmVsZWFzZSBpbiBzb21lIGhlbHBlcnMuCitzdGF0aWMgSERDIHByZXBh
cmVGb3JEcmF3aW5nKEdyYXBoaWNzQ29udGV4dCogZywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAg
ICByZXR1cm4gZy0+Z2V0V2luZG93c0NvbnRleHQocik7Cit9CisgCitzdGF0aWMgdm9pZCBkb25l
RHJhd2luZyhHcmFwaGljc0NvbnRleHQqIGcsIEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHIpCit7
CisgICAgZy0+cmVsZWFzZVdpbmRvd3NDb250ZXh0KGhkYywgcik7Cit9CisvLyBFbmQgQ29waWVk
IGZyb20gUmVuZGVyVGhlbWVXaW4KIAogY29uc3QgZG91YmxlIGNJbml0aWFsVGltZXJEZWxheSA9
IDAuMjU7CiBjb25zdCBkb3VibGUgY05vcm1hbFRpbWVyRGVsYXkgPSAwLjA1OwogCiBQbGF0Zm9y
bVNjcm9sbGJhcjo6UGxhdGZvcm1TY3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsIFNj
cm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXpl
KQotICAgIDogU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUpLCBtX2hvdmVyZWRQ
YXJ0KE5vUGFydCksIG1fcHJlc3NlZFBhcnQoTm9QYXJ0KSwgbV9wcmVzc2VkUG9zKDApLAotICAg
ICAgbV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1l
ckZpcmVkKSwKLSAgICAgIG1fb3ZlcmxhcHNSZXNpemVyKGZhbHNlKQoteworICAgIDogU2Nyb2xs
YmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUpCisgICAgLCBtX2hvdmVyZWRQYXJ0KE5vUGFy
dCkKKyAgICAsIG1fcHJlc3NlZFBhcnQoTm9QYXJ0KQorICAgICwgbV9wcmVzc2VkUG9zKDApCisg
ICAgLCBtX3Njcm9sbFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRp
bWVyRmlyZWQpCisgICAgLCBtX292ZXJsYXBzUmVzaXplcihmYWxzZSkKKyAgICAsIG1fdGhlbWVE
TEwoMCkKKyAgICAsIG1fc2Nyb2xsQmFyVGhlbWUoMCkKK3sKKyAgICAvLyBMYXRjaCBvbnRvIHRo
ZSB0aGVtZWluZyBlbmdpbmUKKyAgICBtX3RoZW1lRExMID0gOjpMb2FkTGlicmFyeShMInV4dGhl
bWUuZGxsIik7CisgICAgaWYgKG1fdGhlbWVETEwpIHsKKyAgICAgICAgb3BlblRoZW1lID0gKG9w
ZW5UaGVtZURhdGFQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIk9wZW5UaGVtZURhdGEi
KTsKKyAgICAgICAgY2xvc2VUaGVtZSA9IChjbG9zZVRoZW1lRGF0YVB0cilHZXRQcm9jQWRkcmVz
cyhtX3RoZW1lRExMLCAiQ2xvc2VUaGVtZURhdGEiKTsKKyAgICAgICAgZHJhd1RoZW1lQkcgPSAo
ZHJhd1RoZW1lQmFja2dyb3VuZFB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiRHJhd1Ro
ZW1lQmFja2dyb3VuZCIpOworICAgICAgICBkcmF3VGhlbWVFZGdlID0gKGRyYXdUaGVtZUVkZ2VQ
dHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkRyYXdUaGVtZUVkZ2UiKTsKKyAgICAgICAg
Z2V0VGhlbWVDb250ZW50UmVjdCA9IChnZXRUaGVtZUNvbnRlbnRSZWN0UHRyKUdldFByb2NBZGRy
ZXNzKG1fdGhlbWVETEwsICJHZXRUaGVtZUJhY2tncm91bmRDb250ZW50UmVjdCIpOworICAgICAg
ICBnZXRUaGVtZVBhcnRTaXplID0gKGdldFRoZW1lUGFydFNpemVQdHIpR2V0UHJvY0FkZHJlc3Mo
bV90aGVtZURMTCwgIkdldFRoZW1lUGFydFNpemUiKTsKKyAgICAgICAgZ2V0VGhlbWVTeXNGb250
ID0gKGdldFRoZW1lU3lzRm9udFB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiR2V0VGhl
bWVTeXNGb250Iik7CisgICAgICAgIGdldFRoZW1lQ29sb3IgPSAoZ2V0VGhlbWVDb2xvclB0cilH
ZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiR2V0VGhlbWVDb2xvciIpOworICAgIH0KKwogICAg
IC8vIE9idGFpbiB0aGUgY29ycmVjdCBzY3JvbGxiYXIgc2l6ZXMgZnJvbSB0aGUgc3lzdGVtLgog
ICAgIGlmICghY0hvcml6b250YWxXaWR0aCkgewogICAgICAgICAvLyBGSVhNRTogR2V0IG1ldGlj
cyBmcm9tIFNhZmFyaVRoZW1lCkBAIC05MiwxNiArMTcyLDI2IEBAIFBsYXRmb3JtU2Nyb2xsYmFy
OjpQbGF0Zm9ybVNjcm9sbGJhcihTY3IKIFBsYXRmb3JtU2Nyb2xsYmFyOjp+UGxhdGZvcm1TY3Jv
bGxiYXIoKQogewogICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisKKyAgICAvLyBDbGVhbnVwIHRo
ZW1lIHN0dWZmCisgICAgaWYgKCFtX3RoZW1lRExMKQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAobV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgY2xvc2VUaGVtZShtX3Njcm9sbEJhclRoZW1l
KTsKKyAgICBtX3Njcm9sbEJhclRoZW1lID0gMDsKKworICAgIDo6RnJlZUxpYnJhcnkobV90aGVt
ZURMTCk7CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUG9zaXRpb24o
KQogewotICAgIGludmFsaWRhdGVUcmFjaygpOworICAgaW52YWxpZGF0ZVRyYWNrKCk7CiB9CiAK
IHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUHJvcG9ydGlvbigpCiB7Ci0gICAg
aW52YWxpZGF0ZVRyYWNrKCk7CisgICBpbnZhbGlkYXRlVHJhY2soKTsKIH0KIAogc3RhdGljIElu
dFJlY3QgdHJhY2tSZXBhaW50UmVjdChjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIFNjcm9sbGJh
ck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6
ZSkKQEAgLTMxMCw2ICs0MDAsMTEgQEAgSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJS
ZWN0KCkgYwogICAgIHJldHVybiB0aHVtYlJlY3Q7CiB9CiAKK0ludFJlY3QgUGxhdGZvcm1TY3Jv
bGxiYXI6OmdyaXBwZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gSW50UmVjdCgpOworfQorCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRy
YWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJ
bnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0KSBjb25zdAogewogICAg
IC8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcg
ZW5vdWdoIHRvIGhhdmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVy
ZSBhdCBsZWFzdApAQCAtMzU1LDY4ICs0NTAsMTQzIEBAIGludCBQbGF0Zm9ybVNjcm9sbGJhcjo6
dHJhY2tMZW5ndGgoKSBjb24KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRCdXR0b24o
R3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0
LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAogewotICAgIGlmICghU2FmYXJpVGhl
bWVMaWJyYXJ5KCkpCi0gICAgICAgIHJldHVybjsKLQogICAgIEludFJlY3QgcGFpbnRSZWN0ID0g
YnV0dG9uUmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwgc3Rh
cnQpOwogICAgIAogICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCiAg
ICAgICAgIHJldHVybjsKIAotICAgIFRoZW1lUGFydCBwYXJ0OwotICAgIFRoZW1lQ29udHJvbFN0
YXRlIHN0YXRlID0gMDsKLSAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0
YXRlIHw9IEFjdGl2ZVN0YXRlOwotICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxT
Y3JvbGxiYXIpCi0gICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbExlZnRBcnJvd1BhcnQgOiBT
Y3JvbGxSaWdodEFycm93UGFydDsKLSAgICBlbHNlCi0gICAgICAgIHBhcnQgPSBzdGFydCA/IFNj
cm9sbFVwQXJyb3dQYXJ0IDogU2Nyb2xsRG93bkFycm93UGFydDsKKyAgICB1bnNpZ25lZCBwYXJ0
ID0gMDsKKyAgICB1bnNpZ25lZCBzdGF0ZSA9IDA7CisgICAgdW5zaWduZWQgY2xhc3NpY1BhcnQg
PSAwOworICAgIHVuc2lnbmVkIGNsYXNzaWNTdGF0ZSA9IDA7CiAKLSAgICBpZiAoaXNFbmFibGVk
KCkpCi0gICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKLSAgICBpZiAoKG1fcHJlc3NlZFBh
cnQgPT0gQmFja0J1dHRvblBhcnQgJiYgc3RhcnQpCi0gICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0
ID09IEZvcndhcmRCdXR0b25QYXJ0ICYmICFzdGFydCkpCi0gICAgICAgIHN0YXRlIHw9IFByZXNz
ZWRTdGF0ZTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7
CisgICAgICAgc3RhdGUgPSBzdGFydCA/IEFCU19MRUZUTk9STUFMIDogQUJTX1JJR0hUTk9STUFM
OworICAgICAgIGNsYXNzaWNQYXJ0ID0gc3RhcnQgPyBERkNTX1NDUk9MTExFRlQgOiBERkNTX1ND
Uk9MTFJJR0hUOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICBzdGF0ZSA9IHN0YXJ0ID8gQUJT
X1VQTk9STUFMIDogQUJTX0RPV05OT1JNQUw7CisgICAgICAgY2xhc3NpY1BhcnQgPSBzdGFydCA/
IERGQ1NfU0NST0xMVVAgOiBERkNTX1NDUk9MTERPV047CisgICAgfQogCi0gICAgcGFpbnRUaGVt
ZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJv
bFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxh
ckNvbnRyb2xTaXplLCBzdGF0ZSk7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkgeworICAgICAgICBz
dGF0ZSArPSBTUF9BQlNfRElTQUJMRV9NT0RJRklFUjsKKyAgICAgICAgY2xhc3NpY1N0YXRlIHw9
IERGQ1NfSU5BQ1RJVkU7CisgICAgfQorICAgIGVsc2UgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJh
Y2tCdXR0b25QYXJ0ICYmIHN0YXJ0KQorICAgICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZv
cndhcmRCdXR0b25QYXJ0ICYmICFzdGFydCkpCisgICAgeworICAgICAgICBzdGF0ZSArPSBTUF9B
QlNfUFJFU1NFRF9NT0RJRklFUjsKKyAgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfUFVTSEVE
IHwgREZDU19GTEFUOworICAgIH0KKyAgICBlbHNlIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkK
KyAgICB7CisgICAgICAgc3RhdGUgKz0gU1BfQUJTX0hPVF9NT0RJRklFUjsKKyAgICAgICBjbGFz
c2ljU3RhdGUgfD0gREZDU19IT1Q7CisgICAgfQorCisgICAgSERDIGhkYyA9IHByZXBhcmVGb3JE
cmF3aW5nKGNvbnRleHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHJlY3Q7CisgICAg
aWYgKG1fdGhlbWVETEwgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1fc2Nyb2xsQmFy
VGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJTY3JvbGxiYXIiKTsKKworICAgIGlmIChtX3Njcm9sbEJh
clRoZW1lICYmIGRyYXdUaGVtZUJHKSB7CisgICAgICAgIGRyYXdUaGVtZUJHKG1fc2Nyb2xsQmFy
VGhlbWUsIGhkYywgU1BfQlVUVE9OLCBzdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgY2xhc3Np
Y1BhcnQsIGNsYXNzaWNTdGF0ZSk7CisgICAgfQorICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhk
YywgcmVjdCk7CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VHJhY2soR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25z
dCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAogewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJy
YXJ5KCkpCi0gICAgICAgIHJldHVybjsKLQogICAgIEludFJlY3QgcGFpbnRSZWN0ID0gaGFzQnV0
dG9ucygpID8gdHJhY2tSZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6
ZSgpKSA6IHJlY3Q7CiAgICAgCiAgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRS
ZWN0KSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0
aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVHJhY2tQYXJ0IDogVlNjcm9sbFRy
YWNrUGFydDsKLSAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgdW5zaWduZWQg
cGFydCA9IDA7CisgICAgdW5zaWduZWQgY2xhc3NpY1BhcnQgPSBERkNfU0NST0xMOworICAgIGlm
IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICBwYXJ0ID0g
c3RhcnQgPyBTUF9UUkFDS1NUQVJUSE9SIDogU1BfVFJBQ0tFTkRIT1I7CisgICAgfQorICAgIGVs
c2UgeworICAgICAgIHBhcnQgPSBzdGFydCA/IFNQX1RSQUNLU1RBUlRWRVJUIDogU1BfVFJBQ0tF
TkRWRVJUOworICAgIH0KKworICAgIHVuc2lnbmVkIHN0YXRlID0gVFNfRElTQUJMRUQ7CisgICAg
dW5zaWduZWQgY2xhc3NpY1N0YXRlID0gREZDU19NT05POwogICAgIGlmIChtX2NsaWVudC0+aXNB
Y3RpdmUoKSkKLSAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgICAgIHN0YXRlIHw9
IFRTX0FDVElWRTsKKyAgICBlbHNlCisgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfSU5BQ1RJ
VkU7CisKICAgICBpZiAoaGFzQnV0dG9ucygpKQotICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3Rh
dGU7CisgICAgICAgIHN0YXRlIHw9IFRTX05PUk1BTDsKKworICAgIEhEQyBoZGMgPSBwcmVwYXJl
Rm9yRHJhd2luZyhjb250ZXh0LCByZWN0KTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0Owor
ICAgIGlmIChtX3RoZW1lRExMICYmICFtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBtX3Njcm9s
bEJhclRoZW1lID0gb3BlblRoZW1lKDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAobV9zY3Jv
bGxCYXJUaGVtZSAmJiBkcmF3VGhlbWVCRykgeworICAgICAgICBkcmF3VGhlbWVCRyhtX3Njcm9s
bEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgfQor
ICAgIGVsc2UgeworICAgICAgICBEcmF3RnJhbWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIERG
Q19TQ1JPTEwsIGNsYXNzaWNTdGF0ZSk7CisgICAgfQogCi0gICAgcGFpbnRUaGVtZVBhcnQocGFy
dCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9
PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xT
aXplLCBzdGF0ZSk7CisgICAgZG9uZURyYXdpbmcoY29udGV4dCwgaGRjLCByZWN0KTsKIH0KIAog
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0
CiB7Ci0gICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKLSAgICAgICAgcmV0dXJuOwotCiAg
ICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocmVjdCkpCiAgICAgICAgIHJldHVybjsKIAot
ICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
ID8gSFNjcm9sbFRodW1iUGFydCA6IFZTY3JvbGxUaHVtYlBhcnQ7Ci0gICAgVGhlbWVDb250cm9s
U3RhdGUgc3RhdGUgPSAwOworICAgIHVuc2lnbmVkIHBhcnQgPSAobV9vcmllbnRhdGlvbiA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyKSA/IFNQX1RIVU1CSE9SIDogU1BfVEhVTUJWRVJUOworICAgIHVu
c2lnbmVkIHN0YXRlID0gMDsKKworICAgIGlmICghaXNFbmFibGVkKCkpIHsKKyAgICAgICAgc3Rh
dGUgKz0gU1BfQUJTX0RJU0FCTEVfTU9ESUZJRVI7CisgICAgfQorICAgIGVsc2UgaWYgKG1fY2xp
ZW50LT5pc0FjdGl2ZSgpKSB7CisgICAgICAgc3RhdGUgKz0gU1BfQUJTX0hPVF9NT0RJRklFUjsK
KyAgICB9CisKKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoY29udGV4dCwgcmVjdCk7
CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBpZiAobV90aGVtZURMTCAmJiAhbV9z
Y3JvbGxCYXJUaGVtZSkKKyAgICAgICAgbV9zY3JvbGxCYXJUaGVtZSA9IG9wZW5UaGVtZSgwLCBM
IlNjcm9sbGJhciIpOworCisgICAgaWYgKG1fc2Nyb2xsQmFyVGhlbWUgJiYgZHJhd1RoZW1lQkcp
IHsKKyAgICAgICAgZHJhd1RoZW1lQkcobV9zY3JvbGxCYXJUaGVtZSwgaGRjLCBwYXJ0LCBzdGF0
ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgICAgICBwYWludEdyaXBwZXIoaGRjLCB3aWRnZXRS
ZWN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEhHRElPQkogaFNhdmVCcnVzaCA9IFNl
bGVjdE9iamVjdChoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlRORkFDRSkpOworICAgICAg
ICBEcmF3RWRnZShoZGMsICZ3aWRnZXRSZWN0LCBFREdFX1JBSVNFRCwgQkZfUkVDVCk7CisgICAg
ICAgIFNlbGVjdE9iamVjdChoZGMsaFNhdmVCcnVzaCk7CisgICAgfQorCisgICAgZG9uZURyYXdp
bmcoY29udGV4dCwgaGRjLCByZWN0KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFp
bnRHcmlwcGVyKEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgdW5z
aWduZWQgcGFydCA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gU1Bf
R1JJUFBFUkhPUiA6IFNQX0dSSVBQRVJWRVJUOworICAgIHVuc2lnbmVkIHN0YXRlID0gMDsKKwog
ICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKLSAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3Rh
dGU7Ci0gICAgaWYgKGlzRW5hYmxlZCgpKQotICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7
CisgICAgICAgIHN0YXRlIHw9IFRTX0FDVElWRTsKKworICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHJl
Y3Q7CisgICAgaWYgKG1fdGhlbWVETEwgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1f
c2Nyb2xsQmFyVGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJTY3JvbGxiYXIiKTsKIAotICAgIHBhaW50
VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LCBjb250cm9s
U2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFy
Q29udHJvbFNpemUsIHN0YXRlKTsKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSAmJiBkcmF3VGhl
bWVCRykgeworICAgICAgICBkcmF3VGhlbWVCRyhtX3Njcm9sbEJhclRoZW1lLCBoZGMsIHBhcnQs
IHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgfQogfQogCiBTY3JvbGxiYXJQYXJ0IFBs
YXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQpA
QCAtNDQ4LDYgKzYxOCw3IEBAIFNjcm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRl
c3QKICAgICAgICAgICAgIHJldHVybiBUaHVtYlBhcnQ7CiAgICAgICAgIHJldHVybiBGb3J3YXJk
VHJhY2tQYXJ0OwogICAgIH0KKwogICAgIHJldHVybiBOb1BhcnQ7CiB9CiAKQEAgLTQ3Niw3ICs2
NDcsNyBAQCBib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU1vdmVFCiAgICAgICAg
ICAgICBzZXRWYWx1ZSgoZmxvYXQpKHRodW1iUG9zICsgZGVsdGEpICogKG1fdG90YWxTaXplIC0g
bV92aXNpYmxlU2l6ZSkgLyAodHJhY2tMZW4gLSB0aHVtYkxlbikpOwogICAgICAgICAgICAgbV9w
cmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24oKSAtIHRodW1iUG9zOwogICAgICAgICB9Ci0gICAg
ICAgIAorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNjM2LDE5ICs4MDcsMTIg
QEAgaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp2ZXJ0aWNhbFNjcm9sbGJhcgogSW50UmVjdCBQbGF0
Zm9ybVNjcm9sbGJhcjo6d2luZG93Q2xpcFJlY3QoKSBjb25zdAogewogICAgIEludFJlY3QgY2xp
cFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCkpOworCiAgICAgY2xpcFJlY3QgPSBjb252ZXJ0
VG9Db250YWluaW5nV2luZG93KGNsaXBSZWN0KTsKICAgICBpZiAobV9jbGllbnQpCiAgICAgICAg
IGNsaXBSZWN0LmludGVyc2VjdChtX2NsaWVudC0+d2luZG93Q2xpcFJlY3QoKSk7Ci0gICAgcmV0
dXJuIGNsaXBSZWN0OwotfQotCi12b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEdyaXBwZXIo
SERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKLXsKLX0KIAotSW50UmVjdCBQbGF0
Zm9ybVNjcm9sbGJhcjo6Z3JpcHBlclJlY3QoY29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25z
dAotewotICAgIHJldHVybiBJbnRSZWN0KCk7CisgICAgcmV0dXJuIGNsaXBSZWN0OwogfQogCiB2
b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVtZUNoYW5nZWQoKQpAQCAtNjU3LDQgKzgyMSwzIEBA
IHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnRoZW1lQ2hhbmdlZCgpCiAKIH0KIAotI2VuZGlmIC8v
IGRlZmluZWQoVVNFX1NBRkFSSV9USEVNRSkKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUaGVtZVdp
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmNwcAkocmV2aXNp
b24gMzA0NzUpCisrKyByZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMiw3ICszMiw3IEBACiAvKiAKICAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSB1
c2VkIHRvIGRldGVybWluZSBob3cgYSB3aWRnZXQgaXMgZHJhd24gdXNpbmcKICAqIFdpbmRvd3Mn
IFRoZW1lIEFQSS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlbWUgcGFydHMgYW5kIHN0YXRl
cyBzZWUKLSAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91
cmw9L2xpYnJhcnkvZW4tdXMvc2hlbGxjYy9wbGF0Zm9ybS9jb21tY3Rscy91c2VyZXgvdG9waWNz
L3BhcnRzYW5kc3RhdGVzLmFzcAorICogaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMv
bGlicmFyeS9iYjc3MzIxMChWUy44NSkuYXNweAogICovCiAjZGVmaW5lIFRIRU1FX0NPTE9SIDIw
NAogI2RlZmluZSBUSEVNRV9GT05UICAyMTAKQEAgLTUzLDYgKzUzLDE4IEBACiAjZGVmaW5lIFRG
UF9URVhURklFTEQgMQogI2RlZmluZSBURlNfUkVBRE9OTFkgIDYKIAorLy8gU2Nyb2xsYmFyIGNv
bnN0YW50cworI2RlZmluZSBTUF9CVVRUT04gMQorI2RlZmluZSBTUF9USFVNQkhPUiAyCisjZGVm
aW5lIFNQX1RIVU1CVkVSVCAzCisjZGVmaW5lIFNQX1RSQUNLU1RBUlRIT1IgNAorI2RlZmluZSBT
UF9UUkFDS0VOREhPUiA1CisjZGVmaW5lIFNQX1RSQUNLU1RBUlRWRVJUIDYKKyNkZWZpbmUgU1Bf
VFJBQ0tFTkRWRVJUIDcKKyNkZWZpbmUgU1BfR1JJUFBFUkhPUiA4CisjZGVmaW5lIFNQX0dSSVBQ
RVJWRVJUIDkKKworCiAvLyBDb21ib2JveCBjb25zdGFudHMKICNkZWZpbmUgQ1BfRFJPUERPV05C
VVRUT04gMQogCkBAIC05Myw3ICsxMDUsMTAgQEAgUmVuZGVyVGhlbWUqIHRoZW1lKCkKIH0KIAog
UmVuZGVyVGhlbWVXaW46OlJlbmRlclRoZW1lV2luKCkKLTptX3RoZW1lRExMKDApLCBtX2J1dHRv
blRoZW1lKDApLCBtX3RleHRGaWVsZFRoZW1lKDApLCBtX21lbnVMaXN0VGhlbWUoMCkKKyAgICA6
IG1fdGhlbWVETEwoMCkKKyAgICAsIG1fYnV0dG9uVGhlbWUoMCkKKyAgICAsIG1fdGV4dEZpZWxk
VGhlbWUoMCkKKyAgICAsIG1fbWVudUxpc3RUaGVtZSgwKQogewogICAgIG1fdGhlbWVETEwgPSA6
OkxvYWRMaWJyYXJ5KEwidXh0aGVtZS5kbGwiKTsKICAgICBpZiAobV90aGVtZURMTCkgewpAQCAt
MTI3LDcgKzE0Miw5IEBAIHZvaWQgUmVuZGVyVGhlbWVXaW46OmNsb3NlKCkKICAgICAgICAgY2xv
c2VUaGVtZShtX3RleHRGaWVsZFRoZW1lKTsKICAgICBpZiAobV9tZW51TGlzdFRoZW1lKQogICAg
ICAgICBjbG9zZVRoZW1lKG1fbWVudUxpc3RUaGVtZSk7Ci0gICAgbV9idXR0b25UaGVtZSA9IG1f
dGV4dEZpZWxkVGhlbWUgPSBtX21lbnVMaXN0VGhlbWUgPSAwOworICAgIGlmIChtX3Njcm9sbEJh
clRoZW1lKQorICAgICAgICBjbG9zZVRoZW1lKG1fc2Nyb2xsQmFyVGhlbWUpOworICAgIG1fYnV0
dG9uVGhlbWUgPSBtX3RleHRGaWVsZFRoZW1lID0gbV9tZW51TGlzdFRoZW1lID0gbV9zY3JvbGxC
YXJUaGVtZSA9IDA7CiB9CiAKIENvbG9yIFJlbmRlclRoZW1lV2luOjpwbGF0Zm9ybUFjdGl2ZVNl
bGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0CkBAIC0xNjQsOCArMTgxLDYgQEAgYm9vbCBS
ZW5kZXJUaGVtZVdpbjo6c3VwcG9ydHNGb2N1cyhFQXBwZQogICAgICAgICBkZWZhdWx0OgogICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKIH0KIAog
dW5zaWduZWQgUmVuZGVyVGhlbWVXaW46OmRldGVybWluZVN0YXRlKFJlbmRlck9iamVjdCogbykK
QEAgLTIyMyw2ICsyMzgsMzAgQEAgVGhlbWVEYXRhIFJlbmRlclRoZW1lV2luOjpnZXRUaGVtZURh
dGEoUgogICAgICAgICBjYXNlIFRleHRBcmVhQXBwZWFyYW5jZToKICAgICAgICAgICAgIHJlc3Vs
dC5tX3BhcnQgPSBURlBfVEVYVEZJRUxEOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgU2Nyb2xsYmFyVHJhY2tIb3Jpem9udGFsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3Vs
dC5tX3BhcnQgPSBTUF9UUkFDS1NUQVJUSE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgU2Nyb2xsYmFyVHJhY2tWZXJ0aWNhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1
bHQubV9wYXJ0ID0gU1BfVFJBQ0tTVEFSVFZFUlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBTY3JvbGxiYXJUaHVtYkhvcml6b250YWxBcHBlYXJhbmNlOgorICAgICAgICAgICAg
cmVzdWx0Lm1fcGFydCA9IFNQX1RIVU1CSE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgU2Nyb2xsYmFyVGh1bWJWZXJ0aWNhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1
bHQubV9wYXJ0ID0gU1BfVEhVTUJWRVJUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgU2Nyb2xsYmFyR3JpcHBlckhvcml6b250YWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVz
dWx0Lm1fcGFydCA9IFNQX0dSSVBQRVJIT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBTY3JvbGxiYXJHcmlwcGVyVmVydGljYWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVz
dWx0Lm1fcGFydCA9IFNQX0dSSVBQRVJWRVJUOworICAgICAgICAgICAgYnJlYWs7CisvKgorICAg
IFNjcm9sbGJhckJ1dHRvblVwQXBwZWFyYW5jZSwgU2Nyb2xsYmFyQnV0dG9uRG93bkFwcGVhcmFu
Y2UsIAorICAgIFNjcm9sbGJhckJ1dHRvbkxlZnRBcHBlYXJhbmNlLCBTY3JvbGxiYXJCdXR0b25S
aWdodEFwcGVhcmFuY2UsCisgICAgU2xpZGVySG9yaXpvbnRhbEFwcGVhcmFuY2UsIFNsaWRlclZl
cnRpY2FsQXBwZWFyYW5jZSwgU2xpZGVyVGh1bWJIb3Jpem9udGFsQXBwZWFyYW5jZSwKKyAgICBT
bGlkZXJUaHVtYlZlcnRpY2FsQXBwZWFyYW5jZSwgQ2FyZXRBcHBlYXJhbmNlLCBTZWFyY2hGaWVs
ZEFwcGVhcmFuY2UsIFNlYXJjaEZpZWxkRGVjb3JhdGlvbkFwcGVhcmFuY2UsCisqLwogICAgIH0K
IAogICAgIHJlc3VsdC5tX3N0YXRlID0gZGV0ZXJtaW5lU3RhdGUobyk7CkBAIC0yNzMsNiArMzEy
LDM1IEBAIGJvb2wgUmVuZGVyVGhlbWVXaW46OnBhaW50QnV0dG9uKFJlbmRlck8KICAgICByZXR1
cm4gZmFsc2U7CiB9CiAKK2Jvb2wgUmVuZGVyVGhlbWVXaW46OnBhaW50QnV0dG9uKEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgciwgdW5zaWduZWQgc3RhdGUsIHVuc2ln
bmVkIHNpemUpCit7CisgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogY3R4ID0gY29udGV4dC0+
cGxhdGZvcm1Db250ZXh0KCk7CisgICBzdGF0ZSA9IFRTX0FDVElWRTsKKworICAgIC8vIE5vdyBw
YWludCB0aGUgYnV0dG9uLgorICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0
LCByKTsgIAorICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHI7CisgICAgaWYgKG1fdGhlbWVETEwgJiYg
IW1fYnV0dG9uVGhlbWUpCisgICAgICAgIG1fYnV0dG9uVGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJC
dXR0b24iKTsKKyAgICBpZiAobV9idXR0b25UaGVtZSAmJiBkcmF3VGhlbWVCRykgeworICAgICAg
ICBkcmF3VGhlbWVCRyhtX2J1dHRvblRoZW1lLCBoZGMsIEJQX0JVVFRPTiwgc3RhdGUsICZ3aWRn
ZXRSZWN0LCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgIGlmICh0cnVlKSB7IC8vaXNGb2N1
c2VkKG8pKSB7CisgICAgICAgICAgICAvLyBEcmF3IGJsYWNrIGZvY3VzIHJlY3QgYXJvdW5kIGJ1
dHRvbiBvdXRlciBlZGdlCisgICAgICAgICAgICBIQlJVU0ggYnJ1c2ggPSBHZXRTeXNDb2xvckJy
dXNoKENPTE9SXzNEREtTSEFET1cpOworICAgICAgICAgICAgaWYgKGJydXNoKSB7CisgICAgICAg
ICAgICAgICAgRnJhbWVSZWN0KGhkYywgJndpZGdldFJlY3QsIGJydXNoKTsKKyAgICAgICAgICAg
ICAgICBJbmZsYXRlUmVjdCgmd2lkZ2V0UmVjdCwgLTEsIC0xKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgICBEcmF3RnJhbWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIERGQ19C
VVRUT04sIDApOyAvL3RoZW1lRGF0YS5tX2NsYXNzaWNTdGF0ZSk7CisgICAgfQorICAgIGRvbmVE
cmF3aW5nKGNvbnRleHQsIGhkYywgcik7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKwogdm9p
ZCBSZW5kZXJUaGVtZVdpbjo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29u
c3QKIHsKICAgICAvLyBJZiB0aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQs
IHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLgpJbmRleDogcmVuZGVyaW5nL1JlbmRlclRoZW1l
V2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmgJKHJldmlzaW9u
IDMwNDc1KQorKysgcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmgJKHdvcmtpbmcgY29weSkKQEAg
LTY3LDYgKzY3LDcgQEAgcHVibGljOgogICAgIHsgcmV0dXJuIHNldENoZWNrYm94U2l6ZShzdHls
ZSk7IH0KIAogICAgIHZpcnR1YWwgYm9vbCBwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25z
dCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFs
IGJvb2wgcGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYsIHVuc2ln
bmVkLCB1bnNpZ25lZCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVy
T2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7
CiAKQEAgLTkyLDYgKzkzLDcgQEAgcHJpdmF0ZToKICAgICBtdXRhYmxlIEhBTkRMRSBtX2J1dHRv
blRoZW1lOwogICAgIG11dGFibGUgSEFORExFIG1fdGV4dEZpZWxkVGhlbWU7CiAgICAgbXV0YWJs
ZSBIQU5ETEUgbV9tZW51TGlzdFRoZW1lOworICAgIG11dGFibGUgSEFORExFIG1fc2Nyb2xsQmFy
VGhlbWU7CiB9OwogCiB9Owo=
</data>
<flag name="review"
          id="8418"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19333</attachid>
            <date>2008-02-24 20:38:18 -0800</date>
            <delta_ts>2008-02-25 10:34:11 -0800</delta_ts>
            <desc>Corrections based on Darin&apos;s suggestions</desc>
            <filename>cairo_scrollbars.patch</filename>
            <type>text/plain</type>
            <size>45303</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiAzMDU1MikKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIsNiArMTEyLDExIEBACiAj
ZGVmaW5lIFdURl9QTEFURk9STV9DQUlSTyAxCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKENHKQor
I2RlZmluZSBVU0VfU0FGQVJJX1RIRU1FIDEKKyNlbHNlCisjdW5kZWYgVVNFX1NBRkFSSV9USEVN
RQorI2VuZGlmCiAKICNpZmRlZiBfX1M2MF9fCiAvLyB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLCBp
dCBpcyBub3QgcmVhbGx5IHdpbmRvd3MKSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAzMDU1NCkKKysrIFdlYkNvcmUvQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjYgQEAKKzIwMDgtMDItMjQgIEJyZW50
IEZ1bGdoYW0gPGJmdWxnaGFtQGdtYWlsLmNvbT4KKworICAgICAgICBodHRwOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ4MworICAgICAgICBJbXBsZW1lbnQgc2Nyb2xsYmFy
cyBvbiBXaW5kb3dzIChDYWlybykKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBXQVJOSU5HOiBOTyBURVNUIENBU0VTIEFEREVEIE9SIENIQU5HRUQKKwor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oOiAgQWRkIHRoZW1lIEhB
TkRMRSBtZW1iZXIgdG8KKyAgICAgICAgICBzdXBwb3J0IFdpbmRvd3Mtc3R5bGUgc2Nyb2xsYmFy
cy4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGxhdGZyb21TY3JvbGxCYXJXaW4uY3BwOiAgRHVw
bGljYXRlIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgZnJvbSBQbGF0Zm9ybVNjcm9sbEJhcldp
blNhZmFyaS5jcHAsIHRoZW4gbW9kaWZ5IHRvIHVzZSB0aGUKKyAgICAgICAgICBuYXRpdmUgV2lu
ZG93cyB0aGVtZSBlbmdpbmUuCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmNw
cDogIENvcnJlY3QgbXNkbiBsaW5rIChjaGFuZ2VkIHNpbmNlCisgICAgICAgICAgZmlsZSBvcmln
aW5hbGx5IGNyZWF0ZWQpLCBhZGQgY29uc3RhbnRzIGFuZCBtZW1iZXIgaW5pdGlhbGl6YXRpb24K
KyAgICAgICAgICBuZWVkZWQgZm9yIHNjcm9sbGJhcnMuIAorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVXaW46OmRldGVybWluZVN0YXRlKTogRXh0ZW5kIHRvIHJlY29nbml6ZQorICAgICAg
ICAgIHNjcm9sbGJhciBwYXJ0cy4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luOjpw
YWludEJ1dHRvbik6IEFkZCBuZXcgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICBmb3IgZHJhd2lu
ZyBidXR0b25zIGdpdmVuIGEgZ3JhcGhpYyBjb250ZXh0IGFuZCBib3VuZGluZyBib3guCisgICAg
ICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmgKKwogMjAwOC0wMi0yNCAgRGFuIEJlcm5z
dGVpbiAgPG1pdHpAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVy
LgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCShyZXZpc2lv
biAzMDU1NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgJKHdv
cmtpbmcgY29weSkKQEAgLTEwNiw2ICsxMDYsMTEgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9wcmVz
c2VkUG9zOwogICAgIFRpbWVyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3Njcm9sbFRpbWVyOwogICAg
IGJvb2wgbV9vdmVybGFwc1Jlc2l6ZXI7CisKKyNpZm5kZWYgVVNFX1NBRkFSSV9USEVNRQorICAg
IEhNT0RVTEUgbV90aGVtZURMTDsKKyAgICBtdXRhYmxlIEhBTkRMRSBtX3Njcm9sbEJhclRoZW1l
OworI2VuZGlmCiB9OwogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNj
cm9sbEJhcldpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZv
cm1TY3JvbGxCYXJXaW4uY3BwCShyZXZpc2lvbiAzMDQ1NikJKGZyb20gV2ViQ29yZS9wbGF0Zm9y
bS93aW4vUGxhdGZvcm1TY3JvbGxCYXJTYWZhcmkuY3BwOjMwNDU2KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgVVNFX1NB
RkFSSV9USEVNRSAKKworI2luY2x1ZGUgIlBsYXRmb3JtU2Nyb2xsQmFyLmgiCisKKyNpbmNsdWRl
ICJFdmVudEhhbmRsZXIuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJGcmFt
ZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIK
KyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJTb2Z0TGlua2luZy5o
IgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorI2luY2x1ZGUgPFNh
ZmFyaVRoZW1lL1NhZmFyaVRoZW1lLmg+CisKKy8vIEZJWE1FOiBUaGVyZSBhcmUgcmVwYWludGlu
ZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBzY3JvbGwgYmFyIGJ1dHRvbnMnIHZpc3VhbCBvdmVyZmxv
dy4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2lu
ZyBuYW1lc3BhY2UgU2FmYXJpVGhlbWU7CisKKy8vIEZJWE1FOiBXZSBzaG91bGQgZ2V0IHRoZXNl
IG51bWJlcnMgZnJvbSBTYWZhcmlUaGVtZQorc3RhdGljIGludCBjSG9yaXpvbnRhbFdpZHRoW10g
PSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjSG9yaXpvbnRhbEhlaWdodFtdID0geyAxNSwgMTEg
fTsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsV2lkdGhbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50
IGNWZXJ0aWNhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1JlYWxCdXR0b25M
ZW5ndGhbXSA9IHsgMjgsIDIxIH07CitzdGF0aWMgaW50IGNCdXR0b25JbnNldFtdID0geyAxNCwg
MTEgfTsKK3N0YXRpYyBpbnQgY0J1dHRvbkhpdEluc2V0W10gPSB7IDMsIDIgfTsKKy8vIGNSZWFs
QnV0dG9uTGVuZ3RoIC0gY0J1dHRvbkluc2V0CitzdGF0aWMgaW50IGNCdXR0b25MZW5ndGhbXSA9
IHsgMTQsIDEwIH07CitzdGF0aWMgaW50IGNUaHVtYldpZHRoW10gPSB7IDE1LCAxMSB9Oworc3Rh
dGljIGludCBjVGh1bWJIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNUaHVtYk1p
bkxlbmd0aFtdID0geyAyNiwgMjAgfTsKKworI2lmICFkZWZpbmVkKE5ERUJVRykgJiYgZGVmaW5l
ZChVU0VfREVCVUdfU0FGQVJJX1RIRU1FKQorU09GVF9MSU5LX0RFQlVHX0xJQlJBUlkoU2FmYXJp
VGhlbWUpCisjZWxzZQorU09GVF9MSU5LX0xJQlJBUlkoU2FmYXJpVGhlbWUpCisjZW5kaWYKKwor
U09GVF9MSU5LKFNhZmFyaVRoZW1lLCBwYWludFRoZW1lUGFydCwgdm9pZCwgX19zdGRjYWxsLCAo
VGhlbWVQYXJ0IHBhcnQsIENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDR1JlY3QmIHJlY3Qs
IE5TQ29udHJvbFNpemUgc2l6ZSwgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUpLCAocGFydCwgY29u
dGV4dCwgcmVjdCwgc2l6ZSwgc3RhdGUpKQorCitjb25zdCBkb3VibGUgY0luaXRpYWxUaW1lckRl
bGF5ID0gMC4yNTsKK2NvbnN0IGRvdWJsZSBjTm9ybWFsVGltZXJEZWxheSA9IDAuMDU7CisKK1Bs
YXRmb3JtU2Nyb2xsYmFyOjpQbGF0Zm9ybVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqIGNsaWVu
dCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXpl
IHNpemUpCisgICAgOiBTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6ZSksIG1faG92
ZXJlZFBhcnQoTm9QYXJ0KSwgbV9wcmVzc2VkUGFydChOb1BhcnQpLCBtX3ByZXNzZWRQb3MoMCks
CisgICAgICBtX3Njcm9sbFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9s
bFRpbWVyRmlyZWQpLAorICAgICAgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCit7CisgICAgLy8g
T2J0YWluIHRoZSBjb3JyZWN0IHNjcm9sbGJhciBzaXplcyBmcm9tIHRoZSBzeXN0ZW0uCisgICAg
aWYgKCFjSG9yaXpvbnRhbFdpZHRoKSB7CisgICAgICAgIC8vIEZJWE1FOiBHZXQgbWV0aWNzIGZy
b20gU2FmYXJpVGhlbWUKKyAgICB9CisKKyAgICBpZiAob3JpZW50YXRpb24gPT0gVmVydGljYWxT
Y3JvbGxiYXIpCisgICAgICAgIHNldEZyYW1lR2VvbWV0cnkoSW50UmVjdCgwLCAwLCBjVmVydGlj
YWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsSGVpZ2h0W2NvbnRyb2xTaXplKCldKSk7
CisgICAgZWxzZQorICAgICAgICBzZXRGcmFtZUdlb21ldHJ5KEludFJlY3QoMCwgMCwgY0hvcml6
b250YWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUo
KV0pKTsKK30KKworUGxhdGZvcm1TY3JvbGxiYXI6On5QbGF0Zm9ybVNjcm9sbGJhcigpCit7Cisg
ICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBk
YXRlVGh1bWJQb3NpdGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUHJvcG9ydGlvbigpCit7CisgICAgaW52YWxp
ZGF0ZVRyYWNrKCk7Cit9CisKK3N0YXRpYyBJbnRSZWN0IHRyYWNrUmVwYWludFJlY3QoY29uc3Qg
SW50UmVjdCYgdHJhY2tSZWN0LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Ny
b2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgSW50UmVjdCBwYWludFJlY3Qo
dHJhY2tSZWN0KTsKKyAgICBpZiAob3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikK
KyAgICAgICAgcGFpbnRSZWN0LmluZmxhdGVYKGNCdXR0b25MZW5ndGhbY29udHJvbFNpemVdKTsK
KyAgICBlbHNlCisgICAgICAgIHBhaW50UmVjdC5pbmZsYXRlWShjQnV0dG9uTGVuZ3RoW2NvbnRy
b2xTaXplXSk7CisKKyAgICByZXR1cm4gcGFpbnRSZWN0OworfQorCitzdGF0aWMgSW50UmVjdCBi
dXR0b25SZXBhaW50UmVjdChjb25zdCBJbnRSZWN0JiBidXR0b25SZWN0LCBTY3JvbGxiYXJPcmll
bnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUsIGJv
b2wgc3RhcnQpCit7CisgICAgSW50UmVjdCBwYWludFJlY3QoYnV0dG9uUmVjdCk7CisgICAgaWYg
KG9yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgcGFpbnRSZWN0
LnNldFdpZHRoKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisgICAgICAgIGlmICgh
c3RhcnQpCisgICAgICAgICAgICBwYWludFJlY3Quc2V0WChidXR0b25SZWN0LngoKSAtIChjUmVh
bEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBidXR0b25SZWN0LndpZHRoKCkpKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBwYWludFJlY3Quc2V0SGVpZ2h0KGNSZWFsQnV0dG9uTGVuZ3RoW2Nv
bnRyb2xTaXplXSk7CisgICAgICAgIGlmICghc3RhcnQpCisgICAgICAgICAgICBwYWludFJlY3Qu
c2V0WShidXR0b25SZWN0LnkoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBi
dXR0b25SZWN0LmhlaWdodCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHBhaW50UmVjdDsKK30K
Kwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52YWxpZGF0ZVRyYWNrKCkKK3sKKyAgICBJbnRS
ZWN0IHJlY3QgPSB0cmFja1JlcGFpbnRSZWN0KHRyYWNrUmVjdCgpLCBtX29yaWVudGF0aW9uLCBj
b250cm9sU2l6ZSgpKTsKKyAgICByZWN0Lm1vdmUoLXgoKSwgLXkoKSk7CisgICAgaW52YWxpZGF0
ZVJlY3QocmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmludmFsaWRhdGVQYXJ0
KFNjcm9sbGJhclBhcnQgcGFydCkKK3sKKyAgICBpZiAocGFydCA9PSBOb1BhcnQpCisgICAgICAg
IHJldHVybjsKKworICAgIEludFJlY3QgcmVzdWx0OyAgICAKKyAgICBzd2l0Y2ggKHBhcnQpIHsK
KyAgICAgICAgY2FzZSBCYWNrQnV0dG9uUGFydDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGJ1dHRv
blJlcGFpbnRSZWN0KGJhY2tCdXR0b25SZWN0KCksIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXpl
KCksIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRm9yd2FyZEJ1dHRv
blBhcnQ6CisgICAgICAgICAgICByZXN1bHQgPSBidXR0b25SZXBhaW50UmVjdChmb3J3YXJkQnV0
dG9uUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpLCBmYWxzZSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgSW50UmVjdCBiZWZv
cmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgICAgICAgICBzcGxp
dFRyYWNrKHRyYWNrUmVjdCgpLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVt
YlJlY3QpOworICAgICAgICAgICAgaWYgKHBhcnQgPT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAg
ICAgICAgICByZXN1bHQgPSBiZWZvcmVUaHVtYlJlY3Q7CisgICAgICAgICAgICBlbHNlIGlmIChw
YXJ0ID09IEZvcndhcmRUcmFja1BhcnQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWZ0ZXJU
aHVtYlJlY3Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGh1
bWJSZWN0OworICAgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5tb3ZlKC14KCksIC15KCkpOwor
ICAgIGludmFsaWRhdGVSZWN0KHJlc3VsdCk7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6
d2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBXaWRnZXQ6OndpZHRoKCk7Cit9CisKK2ludCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6aGVpZ2h0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gV2lkZ2V0Ojpo
ZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c2V0UmVjdChjb25zdCBJbnRS
ZWN0JiByZWN0KQoreworICAgIC8vIEdldCBvdXIgd2luZG93IHJlc2l6ZXIgcmVjdCBhbmQgc2Vl
IGlmIHdlIG92ZXJsYXAuICBBZGp1c3QgdG8gYXZvaWQgdGhlIG92ZXJsYXAKKyAgICAvLyBpZiBu
ZWNlc3NhcnkuCisgICAgSW50UmVjdCBhZGp1c3RlZFJlY3QocmVjdCk7CisgICAgaWYgKHBhcmVu
dCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKSB7CisgICAgICAgIGJvb2wgb3ZlcmxhcHNS
ZXNpemVyID0gZmFsc2U7CisgICAgICAgIEZyYW1lVmlldyogdmlldyA9IHN0YXRpY19jYXN0PEZy
YW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICAgICAgSW50UmVjdCByZXNpemVyUmVjdCA9IHZpZXct
PndpbmRvd1Jlc2l6ZXJSZWN0KCk7CisgICAgICAgIHJlc2l6ZXJSZWN0LnNldExvY2F0aW9uKHZp
ZXctPmNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhyZXNpemVyUmVjdC5sb2NhdGlvbigpKSk7
CisgICAgICAgIGlmIChyZWN0LmludGVyc2VjdHMocmVzaXplclJlY3QpKSB7CisgICAgICAgICAg
ICBpZiAob3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgICAg
ICAgICAgaW50IG92ZXJsYXAgPSByZWN0LnJpZ2h0KCkgLSByZXNpemVyUmVjdC54KCk7CisgICAg
ICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIHJlc2l6ZXJSZWN0LnJpZ2h0KCkgPj0gcmVj
dC5yaWdodCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdGVkUmVjdC5zZXRXaWR0aChy
ZWN0LndpZHRoKCkgLSBvdmVybGFwKTsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHNSZXNp
emVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgIGludCBvdmVybGFwID0gcmVjdC5ib3R0b20oKSAtIHJlc2l6ZXJSZWN0Lnko
KTsKKyAgICAgICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDAgJiYgcmVzaXplclJlY3QuYm90dG9t
KCkgPj0gcmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFJlY3Qu
c2V0SGVpZ2h0KHJlY3QuaGVpZ2h0KCkgLSBvdmVybGFwKTsKKyAgICAgICAgICAgICAgICAgICAg
b3ZlcmxhcHNSZXNpemVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICBpZiAob3ZlcmxhcHNSZXNpemVyICE9IG1fb3ZlcmxhcHNS
ZXNpemVyKSB7CisgICAgICAgICAgICBtX292ZXJsYXBzUmVzaXplciA9IG92ZXJsYXBzUmVzaXpl
cjsKKyAgICAgICAgICAgIHZpZXctPmFkanVzdE92ZXJsYXBwaW5nU2Nyb2xsYmFyQ291bnQobV9v
dmVybGFwc1Jlc2l6ZXIgPyAxIDogLTEpOworICAgICAgICB9CisgICAgfQorCisgICAgc2V0RnJh
bWVHZW9tZXRyeShhZGp1c3RlZFJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpz
ZXRQYXJlbnQoU2Nyb2xsVmlldyogcGFyZW50VmlldykKK3sKKyAgICBpZiAoIXBhcmVudFZpZXcg
JiYgbV9vdmVybGFwc1Jlc2l6ZXIgJiYgcGFyZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3
KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+YWRqdXN0T3Zl
cmxhcHBpbmdTY3JvbGxiYXJDb3VudCgtMSk7CisgICAgV2lkZ2V0OjpzZXRQYXJlbnQocGFyZW50
Vmlldyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNldEVuYWJsZWQoYm9vbCBlbmFi
bGVkKQoreworICAgIGlmIChlbmFibGVkICE9IGlzRW5hYmxlZCgpKSB7CisgICAgICAgIFdpZGdl
dDo6c2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KK30K
Kwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBncmFwaGlj
c0NvbnRleHQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpCit7CisgICAgaWYgKGdyYXBoaWNz
Q29udGV4dC0+dXBkYXRpbmdDb250cm9sVGludHMoKSkgeworICAgICAgICBpbnZhbGlkYXRlKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZ3JhcGhpY3NDb250ZXh0LT5wYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIERvbid0IHBhaW50IGFu
eXRoaW5nIGlmIHRoZSBzY3JvbGxiYXIgZG9lc24ndCBpbnRlcnNlY3QgdGhlIGRhbWFnZSByZWN0
LgorICAgIGlmICghZnJhbWVHZW9tZXRyeSgpLmludGVyc2VjdHMoZGFtYWdlUmVjdCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIEludFJlY3QgdHJhY2sgPSB0cmFja1JlY3QoKTsKKyAgICBwYWlu
dFRyYWNrKGdyYXBoaWNzQ29udGV4dCwgdHJhY2ssIHRydWUsIGRhbWFnZVJlY3QpOworCisgICAg
aWYgKGhhc0J1dHRvbnMoKSkgeworICAgICAgICBwYWludEJ1dHRvbihncmFwaGljc0NvbnRleHQs
IGJhY2tCdXR0b25SZWN0KCksIHRydWUsIGRhbWFnZVJlY3QpOworICAgICAgICBwYWludEJ1dHRv
bihncmFwaGljc0NvbnRleHQsIGZvcndhcmRCdXR0b25SZWN0KCksIGZhbHNlLCBkYW1hZ2VSZWN0
KTsKKyAgICB9CisKKyAgICBpZiAoaGFzVGh1bWIoKSAmJiBkYW1hZ2VSZWN0LmludGVyc2VjdHMo
dHJhY2spKSB7CisgICAgICAgIEludFJlY3Qgc3RhcnRUcmFja1JlY3QsIHRodW1iUmVjdCwgZW5k
VHJhY2tSZWN0OworICAgICAgICBzcGxpdFRyYWNrKHRyYWNrLCBzdGFydFRyYWNrUmVjdCwgdGh1
bWJSZWN0LCBlbmRUcmFja1JlY3QpOworICAgICAgICBwYWludFRodW1iKGdyYXBoaWNzQ29udGV4
dCwgdGh1bWJSZWN0LCBkYW1hZ2VSZWN0KTsKKyAgICB9Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3Jv
bGxiYXI6Omhhc0J1dHRvbnMoKSBjb25zdAoreworICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAo
bV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgp
KSA+PSAyICogKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldIC0gY0J1dHRvbkhpdElu
c2V0W2NvbnRyb2xTaXplKCldKTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFzVGh1
bWIoKSBjb25zdAoreworICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAobV9vcmllbnRhdGlvbiA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgpKSA+PSAyICogY0J1dHRv
bkluc2V0W2NvbnRyb2xTaXplKCldICsgY1RodW1iTWluTGVuZ3RoW2NvbnRyb2xTaXplKCldICsg
MTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6YmFja0J1dHRvblJlY3QoKSBjb25z
dAoreworICAgIC8vIE91ciBkZXNpcmVkIHJlY3QgaXMgZXNzZW50aWFsbHkgMTd4MTcuCisgICAg
CisgICAgLy8gT3VyIGFjdHVhbCByZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJs
ZSBzcGFjZSB3aGVuCisgICAgLy8gd2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxv
d3MgdGhlIHNjcm9sbGJhcgorICAgIC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4g
YXQgdGlueSBzaXplcy4KKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyKQorICAgICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgY0J1dHRvbkxlbmd0aFtjb250
cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAgIHJldHVy
biBJbnRSZWN0KHgoKSwgeSgpLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0J1dHRv
bkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6
OmZvcndhcmRCdXR0b25SZWN0KCkgY29uc3QKK3sKKyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlz
IGVzc2VudGlhbGx5IDE3eDE3LgorICAgIAorICAgIC8vIE91ciBhY3R1YWwgcmVjdCB3aWxsIHNo
cmluayB0byBoYWxmIHRoZSBhdmFpbGFibGUgc3BhY2Ugd2hlbgorICAgIC8vIHdlIGhhdmUgPCAz
NCBwaXhlbHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRoZSBzY3JvbGxiYXIKKyAgICAvLyB0byBzY2Fs
ZSBkb3duIGFuZCBmdW5jdGlvbiBldmVuIGF0IHRpbnkgc2l6ZXMuCisKKyAgICBpZiAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1cm4gSW50UmVjdCh4
KCkgKyB3aWR0aCgpIC0gY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgeSgpLCBjQnV0dG9u
TGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7
CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyBoZWlnaHQoKSAtIGNCdXR0b25MZW5ndGhb
Y29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjQnV0dG9uTGVu
Z3RoW2NvbnRyb2xTaXplKCldKTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJh
Y2tSZWN0KCkgY29uc3QKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyKSB7CisgICAgICAgIGlmICghaGFzQnV0dG9ucygpKQorICAgICAgICAgICAgcmV0dXJu
IEludFJlY3QoeCgpLCB5KCksIHdpZHRoKCksIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXpl
KCldKTsKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpICsgY0J1dHRvbkxlbmd0aFtjb250cm9s
U2l6ZSgpXSwgeSgpLCB3aWR0aCgpIC0gMiAqIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0s
IGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICB9CisKKyAgICBpZiAoIWhh
c0J1dHRvbnMoKSkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdp
ZHRoW2NvbnRyb2xTaXplKCldLCBoZWlnaHQoKSk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5
KCkgKyBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxXaWR0aFtjb250cm9s
U2l6ZSgpXSwgaGVpZ2h0KCkgLSAyICogY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9
CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUmVjdCgpIGNvbnN0Cit7CisgICAg
SW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAg
c3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVy
VGh1bWJSZWN0KTsKKyAgICByZXR1cm4gdGh1bWJSZWN0OworfQorCit2b2lkIFBsYXRmb3JtU2Ny
b2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVm
b3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0
KSBjb25zdAoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVu
bGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhhdmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0
aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFzdAorICAgIC8vIG9uZSBvZiB0aGVtIGlzIG5vbi1lbXB0
eS4KKyAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAgaWYgKG1fb3JpZW50
YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICB0aHVtYlJlY3QgPSBJbnRS
ZWN0KHRyYWNrUmVjdC54KCkgKyB0aHVtYlBvcywgdHJhY2tSZWN0LnkoKSArICh0cmFja1JlY3Qu
aGVpZ2h0KCkgLSBjVGh1bWJIZWlnaHRbY29udHJvbFNpemUoKV0pIC8gMiwgdGh1bWJMZW5ndGgo
KSwgY1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICAgICAgYmVmb3JlVGh1bWJSZWN0
ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1JlY3QueSgpLCB0aHVtYlBvcywgdHJhY2tS
ZWN0LmhlaWdodCgpKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJbnRSZWN0KHRodW1iUmVj
dC54KCkgKyB0aHVtYlJlY3Qud2lkdGgoKSwgdHJhY2tSZWN0LnkoKSwgdHJhY2tSZWN0LnJpZ2h0
KCkgLSB0aHVtYlJlY3QucmlnaHQoKSwgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyAodHJhY2tSZWN0
LndpZHRoKCkgLSBjVGh1bWJXaWR0aFtjb250cm9sU2l6ZSgpXSkgLyAyLCB0cmFja1JlY3QueSgp
ICsgdGh1bWJQb3MsIGNUaHVtYldpZHRoW2NvbnRyb2xTaXplKCldLCB0aHVtYkxlbmd0aCgpKTsK
KyAgICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1Jl
Y3QueSgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdGh1bWJQb3MpOworICAgICAgICBhZnRlclRodW1i
UmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwgdGh1bWJSZWN0LnkoKSArIHRodW1iUmVjdC5o
ZWlnaHQoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRyYWNrUmVjdC5ib3R0b20oKSAtIHRodW1iUmVj
dC5ib3R0b20oKSk7CisgICAgfQorfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUG9z
aXRpb24oKSBjb25zdAoreworICAgIGlmIChpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIChm
bG9hdCltX2N1cnJlbnRQb3MgKiAodHJhY2tMZW5ndGgoKSAtIHRodW1iTGVuZ3RoKCkpIC8gKG1f
dG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBQbGF0
Zm9ybVNjcm9sbGJhcjo6dGh1bWJMZW5ndGgoKSBjb25zdAoreworICAgIGlmICghaXNFbmFibGVk
KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmxvYXQgcHJvcG9ydGlvbiA9IChmbG9hdCko
bV92aXNpYmxlU2l6ZSkgLyBtX3RvdGFsU2l6ZTsKKyAgICBpbnQgdHJhY2tMZW4gPSB0cmFja0xl
bmd0aCgpOworICAgIGludCBsZW5ndGggPSBwcm9wb3J0aW9uICogdHJhY2tMZW47CisgICAgaW50
IG1pbkxlbmd0aCA9IGNUaHVtYk1pbkxlbmd0aFtjb250cm9sU2l6ZSgpXTsKKyAgICBsZW5ndGgg
PSBtYXgobGVuZ3RoLCBtaW5MZW5ndGgpOworICAgIGlmIChsZW5ndGggPiB0cmFja0xlbikKKyAg
ICAgICAgbGVuZ3RoID0gMDsgLy8gT25jZSB0aGUgdGh1bWIgaXMgYmVsb3cgdGhlIHRyYWNrIGxl
bmd0aCwgaXQganVzdCBnb2VzIGF3YXkgKHRvIG1ha2UgbW9yZSByb29tIGZvciB0aGUgdHJhY2sp
LgorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tM
ZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyKSA/IHRyYWNrUmVjdCgpLndpZHRoKCkgOiB0cmFja1JlY3QoKS5oZWlnaHQoKTsK
K30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0
JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcGFpbnRSZWN0ID0gYnV0dG9uUmVwYWludFJl
Y3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwgc3RhcnQpOworICAgIAorICAg
IGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCisgICAgICAgIHJldHVybjsK
KworICAgIFRoZW1lUGFydCBwYXJ0OworICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsK
KyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0
YXRlOworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAg
ICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbExlZnRBcnJvd1BhcnQgOiBTY3JvbGxSaWdodEFycm93
UGFydDsKKyAgICBlbHNlCisgICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbFVwQXJyb3dQYXJ0
IDogU2Nyb2xsRG93bkFycm93UGFydDsKKworICAgIGlmIChpc0VuYWJsZWQoKSkKKyAgICAgICAg
c3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0
dG9uUGFydCAmJiBzdGFydCkKKyAgICAgICAgfHwgKG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1
dHRvblBhcnQgJiYgIXN0YXJ0KSkKKyAgICAgICAgc3RhdGUgfD0gUHJlc3NlZFN0YXRlOworCisg
ICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50
UmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6
ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3Jv
bGxiYXI6OnBhaW50VHJhY2soR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0
JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAorewor
ICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIElu
dFJlY3QgcGFpbnRSZWN0ID0gaGFzQnV0dG9ucygpID8gdHJhY2tSZXBhaW50UmVjdChyZWN0LCBt
X29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpKSA6IHJlY3Q7CisgICAgCisgICAgaWYgKCFkYW1h
Z2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVGhl
bWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Ny
b2xsVHJhY2tQYXJ0IDogVlNjcm9sbFRyYWNrUGFydDsKKyAgICBUaGVtZUNvbnRyb2xTdGF0ZSBz
dGF0ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQorICAgICAgICBzdGF0ZSB8
PSBBY3RpdmVTdGF0ZTsKKyAgICBpZiAoaGFzQnV0dG9ucygpKQorICAgICAgICBzdGF0ZSB8PSBF
bmFibGVkU3RhdGU7CisKKyAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKSwgcGFpbnRSZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8g
TlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0
Cit7CisgICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocmVjdCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
ID8gSFNjcm9sbFRodW1iUGFydCA6IFZTY3JvbGxUaHVtYlBhcnQ7CisgICAgVGhlbWVDb250cm9s
U3RhdGUgc3RhdGUgPSAwOworICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICAgICAg
c3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgaWYgKGlzRW5hYmxlZCgpKQorICAgICAgICBzdGF0
ZSB8PSBFbmFibGVkU3RhdGU7CisKKyAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5w
bGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/
IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisK
K1Njcm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRlc3QoY29uc3QgUGxhdGZvcm1N
b3VzZUV2ZW50JiBldnQpCit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
IE5vUGFydDsKKworICAgIEludFBvaW50IG1vdXNlUG9zaXRpb24gPSBjb252ZXJ0RnJvbUNvbnRh
aW5pbmdXaW5kb3coZXZ0LnBvcygpKTsKKyAgICBtb3VzZVBvc2l0aW9uLm1vdmUoeCgpLCB5KCkp
OworCisgICAgaWYgKGhhc0J1dHRvbnMoKSkgeworICAgICAgICBpZiAoYmFja0J1dHRvblJlY3Qo
KS5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBCYWNrQnV0dG9u
UGFydDsKKworICAgICAgICBpZiAoZm9yd2FyZEJ1dHRvblJlY3QoKS5jb250YWlucyhtb3VzZVBv
c2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBGb3J3YXJkQnV0dG9uUGFydDsKKyAgICB9CisK
KyAgICBpZiAoIWhhc1RodW1iKCkpCisgICAgICAgIHJldHVybiBOb1BhcnQ7CisKKyAgICBJbnRS
ZWN0IHRyYWNrID0gdHJhY2tSZWN0KCk7CisgICAgaWYgKHRyYWNrLmNvbnRhaW5zKG1vdXNlUG9z
aXRpb24pKSB7CisgICAgICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFm
dGVyVGh1bWJSZWN0OworICAgICAgICBzcGxpdFRyYWNrKHRyYWNrLCBiZWZvcmVUaHVtYlJlY3Qs
IHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOworICAgICAgICBpZiAoYmVmb3JlVGh1bWJSZWN0
LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuIEJhY2tUcmFja1Bh
cnQ7CisgICAgICAgIGlmICh0aHVtYlJlY3QuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAg
ICAgICAgICByZXR1cm4gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm4gRm9yd2FyZFRyYWNrUGFy
dDsKKyAgICB9CisgICAgcmV0dXJuIE5vUGFydDsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJh
cjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7
CisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0KSB7CisgICAgICAgIC8vIERyYWcg
dGhlIHRodW1iLgorICAgICAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAg
ICAgIGludCB0aHVtYkxlbiA9IHRodW1iTGVuZ3RoKCk7CisgICAgICAgIGludCB0cmFja0xlbiA9
IHRyYWNrTGVuZ3RoKCk7CisgICAgICAgIGludCBtYXhQb3MgPSB0cmFja0xlbiAtIHRodW1iTGVu
OworICAgICAgICBpbnQgZGVsdGEgPSAwOworICAgICAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRh
aW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkgLSBtX3ByZXNzZWRQb3M7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIGRlbHRhID0gY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3Mo
KSkueSgpIC0gbV9wcmVzc2VkUG9zOworCisgICAgICAgIGlmIChkZWx0YSA+IDApCisgICAgICAg
ICAgICAvLyBUaGUgbW91c2UgbW92ZWQgZG93bi9yaWdodC4KKyAgICAgICAgICAgIGRlbHRhID0g
bWluKG1heFBvcyAtIHRodW1iUG9zLCBkZWx0YSk7CisgICAgICAgIGVsc2UgaWYgKGRlbHRhIDwg
MCkKKyAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBtb3ZlZCB1cC9sZWZ0LgorICAgICAgICAgICAg
ZGVsdGEgPSBtYXgoLXRodW1iUG9zLCBkZWx0YSk7CisKKyAgICAgICAgaWYgKGRlbHRhICE9IDAp
IHsKKyAgICAgICAgICAgIHNldFZhbHVlKChmbG9hdCkodGh1bWJQb3MgKyBkZWx0YSkgKiAobV90
b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKSAvICh0cmFja0xlbiAtIHRodW1iTGVuKSk7CisgICAg
ICAgICAgICBtX3ByZXNzZWRQb3MgKz0gdGh1bWJQb3NpdGlvbigpIC0gdGh1bWJQb3M7CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICht
X3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkKKyAgICAgICAgbV9wcmVzc2VkUG9zID0gKG1fb3JpZW50
YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRv
dyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkp
LnkoKSk7CisKKyAgICBTY3JvbGxiYXJQYXJ0IHBhcnQgPSBoaXRUZXN0KGV2dCk7ICAgIAorICAg
IGlmIChwYXJ0ICE9IG1faG92ZXJlZFBhcnQpIHsKKyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQg
IT0gTm9QYXJ0KSB7CisgICAgICAgICAgICBpZiAocGFydCA9PSBtX3ByZXNzZWRQYXJ0KSB7Cisg
ICAgICAgICAgICAgICAgLy8gVGhlIG1vdXNlIGlzIG1vdmluZyBiYWNrIG92ZXIgdGhlIHByZXNz
ZWQgcGFydC4gIFdlCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdGFydCB1cCB0aGUgdGlt
ZXIgYWN0aW9uIGFnYWluLgorICAgICAgICAgICAgICAgIHN0YXJ0VGltZXJJZk5lZWRlZChjTm9y
bWFsVGltZXJEZWxheSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2Vk
UGFydCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1faG92ZXJlZFBhcnQgPT0gbV9wcmVzc2Vk
UGFydCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBpcyBsZWF2aW5nIHRoZSBwcmVz
c2VkIHBhcnQuICBLaWxsIG91ciB0aW1lcgorICAgICAgICAgICAgICAgIC8vIGlmIG5lZWRlZC4K
KyAgICAgICAgICAgICAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworICAgICAgICAgICAgICAgIGlu
dmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQocGFydCk7CisgICAgICAgICAgICBpbnZh
bGlkYXRlUGFydChtX2hvdmVyZWRQYXJ0KTsKKyAgICAgICAgfQorICAgICAgICBtX2hvdmVyZWRQ
YXJ0ID0gcGFydDsKKyAgICB9IAorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGxhdGZv
cm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlT3V0RXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50
JiBldnQpCit7CisgICAgaW52YWxpZGF0ZVBhcnQobV9ob3ZlcmVkUGFydCk7CisgICAgbV9ob3Zl
cmVkUGFydCA9IE5vUGFydDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFBsYXRmb3Jt
U2Nyb2xsYmFyOjpoYW5kbGVNb3VzZVByZXNzRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50
JiBldnQpCit7CisgICAgbV9wcmVzc2VkUGFydCA9IGhpdFRlc3QoZXZ0KTsKKyAgICBtX3ByZXNz
ZWRQb3MgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gY29udmVydEZy
b21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueCgpIDogY29udmVydEZyb21Db250YWluaW5n
V2luZG93KGV2dC5wb3MoKSkueSgpKTsKKyAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0
KTsKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoY0luaXRpYWxUaW1lckRlbGF5KTsKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VSZWxl
YXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaW52YWxpZGF0
ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgbV9wcmVzc2VkUGFydCA9IE5vUGFydDsKKyAgICBt
X3ByZXNzZWRQb3MgPSAwOworICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisKKyAgICBpZiAocGFy
ZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZy
YW1lVmlldyo+KHBhcmVudCgpKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPnNldE1vdXNlUHJl
c3NlZChmYWxzZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9s
bGJhcjo6c3RhcnRUaW1lcklmTmVlZGVkKGRvdWJsZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBk
byBhbnl0aGluZyBmb3IgdGhlIHRodW1iLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1i
UGFydCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4gIFdlIGhh
bHQgdHJhY2sgc2Nyb2xsaW5nIG9uY2UgdGhlIHRodW1iIGlzIGxldmVsCisgICAgLy8gd2l0aCB1
cy4KKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQ
YXJ0ID09IEZvcndhcmRUcmFja1BhcnQpICYmIHRodW1iVW5kZXJNb3VzZSgpKSB7CisgICAgICAg
IGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICBtX2hvdmVyZWRQYXJ0ID0g
VGh1bWJQYXJ0OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgY2FuJ3Qgc2Ny
b2xsIGlmIHdlJ3ZlIGhpdCB0aGUgYmVnaW5uaW5nIG9yIGVuZC4KKyAgICBTY3JvbGxEaXJlY3Rp
b24gZGlyID0gcHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKTsKKyAgICBpZiAoZGlyID09IFNj
cm9sbFVwIHx8IGRpciA9PSBTY3JvbGxMZWZ0KSB7CisgICAgICAgIGlmIChtX2N1cnJlbnRQb3Mg
PT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9j
dXJyZW50UG9zID09IG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBtX3Njcm9sbFRpbWVyLnN0YXJ0T25lU2hvdChkZWxheSk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnN0b3BUaW1lcklmTmVlZGVkKCkKK3sKKyAgICBp
ZiAobV9zY3JvbGxUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9sbFRpbWVyLnN0b3Ao
KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFByZXNzZWRQYXJ0KGRv
dWJsZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhlIHRodW1iIG9y
IGlmIG5vdGhpbmcgd2FzIHByZXNzZWQuCisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQ
YXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gTm9QYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBIYW5kbGUgdGhlIHRyYWNrLgorICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQ
YXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkgJiYgdGh1bWJVbmRlck1v
dXNlKCkpIHsKKyAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAg
IG1faG92ZXJlZFBhcnQgPSBUaHVtYlBhcnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBIYW5kbGUgdGhlIGFycm93cyBhbmQgdHJhY2suCisgICAgaWYgKHNjcm9sbChwcmVzc2Vk
UGFydFNjcm9sbERpcmVjdGlvbigpLCBwcmVzc2VkUGFydFNjcm9sbEdyYW51bGFyaXR5KCkpKQor
ICAgICAgICBzdGFydFRpbWVySWZOZWVkZWQoZGVsYXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Ny
b2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZChUaW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4qKQor
eworICAgIGF1dG9zY3JvbGxQcmVzc2VkUGFydChjTm9ybWFsVGltZXJEZWxheSk7Cit9CisKK1Nj
cm9sbERpcmVjdGlvbiBQbGF0Zm9ybVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rp
b24oKQoreworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsK
KyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2Vk
UGFydCA9PSBCYWNrVHJhY2tQYXJ0KQorICAgICAgICAgICAgcmV0dXJuIFNjcm9sbExlZnQ7Cisg
ICAgICAgIHJldHVybiBTY3JvbGxSaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9w
cmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFj
a1BhcnQpCisgICAgICAgICAgICByZXR1cm4gU2Nyb2xsVXA7CisgICAgICAgIHJldHVybiBTY3Jv
bGxEb3duOworICAgIH0KK30KKworU2Nyb2xsR3JhbnVsYXJpdHkgUGxhdGZvcm1TY3JvbGxiYXI6
OnByZXNzZWRQYXJ0U2Nyb2xsR3JhbnVsYXJpdHkoKQoreworICAgIGlmIChtX3ByZXNzZWRQYXJ0
ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblBhcnQp
CisgICAgICAgIHJldHVybiBTY3JvbGxCeUxpbmU7CisgICAgcmV0dXJuIFNjcm9sbEJ5UGFnZTsK
K30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJVbmRlck1vdXNlKCkKK3sKKyAgICAv
LyBDb25zdHJ1Y3QgYSByZWN0LgorICAgIEludFJlY3QgdGh1bWIgPSB0aHVtYlJlY3QoKTsKKyAg
ICB0aHVtYi5tb3ZlKC14KCksIC15KCkpOworICAgIGludCBiZWdpbiA9IChtX29yaWVudGF0aW9u
ID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gdGh1bWIueCgpIDogdGh1bWIueSgpOworICAgIGlu
dCBlbmQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLnJp
Z2h0KCkgOiB0aHVtYi5ib3R0b20oKTsKKyAgICByZXR1cm4gKGJlZ2luIDw9IG1fcHJlc3NlZFBv
cyAmJiBtX3ByZXNzZWRQb3MgPCBlbmQpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6Omhv
cml6b250YWxTY3JvbGxiYXJIZWlnaHQoU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUp
Cit7CisgICAgcmV0dXJuIGNIb3Jpem9udGFsV2lkdGhbY29udHJvbFNpemVdOworfQorCitpbnQg
UGxhdGZvcm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgoU2Nyb2xsYmFyQ29udHJv
bFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNWZXJ0aWNhbEhlaWdodFtjb250cm9s
U2l6ZV07Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OndpbmRvd0NsaXBSZWN0KCkg
Y29uc3QKK3sKKyAgICBJbnRSZWN0IGNsaXBSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsK
KyAgICBjbGlwUmVjdCA9IGNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3coY2xpcFJlY3QpOworICAg
IGlmIChtX2NsaWVudCkKKyAgICAgICAgY2xpcFJlY3QuaW50ZXJzZWN0KG1fY2xpZW50LT53aW5k
b3dDbGlwUmVjdCgpKTsKKyAgICByZXR1cm4gY2xpcFJlY3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1T
Y3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByZWN0KSBjb25z
dAoreworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVyUmVjdChjb25zdCBJ
bnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVDaGFuZ2VkKCkKK3sKK30KKworfQorCisjZW5k
aWYgLy8gZGVmaW5lZChVU0VfU0FGQVJJX1RIRU1FKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93
aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkocmV2aXNpb24gMzA0NTYpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQnJlbnQgRnVsZ2hhbQog
ICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNSw4ICsyNiw2IEBACiAKICNpbmNs
dWRlICJjb25maWcuaCIKIAotI2lmZGVmIFVTRV9TQUZBUklfVEhFTUUgCi0KICNpbmNsdWRlICJQ
bGF0Zm9ybVNjcm9sbEJhci5oIgogCiAjaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCkBAIC0zNywx
NyArMzYsNDAgQEAKICNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKICNpbmNsdWRlICJT
b2Z0TGlua2luZy5oIgogCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgot
I2luY2x1ZGUgPFNhZmFyaVRoZW1lL1NhZmFyaVRoZW1lLmg+CisjaW5jbHVkZSA8d2luZG93cy5o
PgorI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luLmgiCiAKLS8vIEZJWE1FOiBUaGVyZSBhcmUgcmVw
YWludGluZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBzY3JvbGwgYmFyIGJ1dHRvbnMnIHZpc3VhbCBv
dmVyZmxvdy4KKy8vIEdlbmVyaWMgc3RhdGUgY29uc3RhbnRzCisjZGVmaW5lIFRTX05PUk1BTCAg
ICAxCisjZGVmaW5lIFRTX0hPVkVSICAgICAyCisjZGVmaW5lIFRTX0FDVElWRSAgICAzCisjZGVm
aW5lIFRTX0RJU0FCTEVEICA0CisjZGVmaW5lIFRTX0ZPQ1VTRUQgICA1CisKKyNkZWZpbmUgQUJT
X1VQTk9STUFMIDEKKyNkZWZpbmUgQUJTX0RPV05OT1JNQUwgNQorI2RlZmluZSBBQlNfTEVGVE5P
Uk1BTCA5CisjZGVmaW5lIEFCU19SSUdIVE5PUk1BTCAxMworCitjb25zdCB1bnNpZ25lZCBTUF9B
QlNfSE9UX01PRElGSUVSID0gMTsKK2NvbnN0IHVuc2lnbmVkIFNQX0FCU19QUkVTU0VEX01PRElG
SUVSID0gMjsKK2NvbnN0IHVuc2lnbmVkIFNQX0FCU19ESVNBQkxFX01PRElGSUVSID0gMzsKKwor
Ly8gU2Nyb2xsYmFyIGNvbnN0YW50cworI2RlZmluZSBTUF9CVVRUT04gMQorI2RlZmluZSBTUF9U
SFVNQkhPUiAyCisjZGVmaW5lIFNQX1RIVU1CVkVSVCAzCisjZGVmaW5lIFNQX1RSQUNLU1RBUlRI
T1IgNAorI2RlZmluZSBTUF9UUkFDS0VOREhPUiA1CisjZGVmaW5lIFNQX1RSQUNLU1RBUlRWRVJU
IDYKKyNkZWZpbmUgU1BfVFJBQ0tFTkRWRVJUIDcKKyNkZWZpbmUgU1BfR1JJUFBFUkhPUiA4Cisj
ZGVmaW5lIFNQX0dSSVBQRVJWRVJUIDkKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3BhY2UgU2FmYXJpVGhlbWU7Ci0KIC8vIEZJWE1F
OiBXZSBzaG91bGQgZ2V0IHRoZXNlIG51bWJlcnMgZnJvbSBTYWZhcmlUaGVtZQogc3RhdGljIGlu
dCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1LCAxMSB9Owogc3RhdGljIGludCBjSG9yaXpvbnRh
bEhlaWdodFtdID0geyAxNSwgMTEgfTsKQEAgLTYyLDIyICs4NCw3OCBAQCBzdGF0aWMgaW50IGNU
aHVtYldpZHRoW10gPSB7IDE1LCAxMSB9Owogc3RhdGljIGludCBjVGh1bWJIZWlnaHRbXSA9IHsg
MTUsIDExIH07CiBzdGF0aWMgaW50IGNUaHVtYk1pbkxlbmd0aFtdID0geyAyNiwgMjAgfTsKIAot
I2lmICFkZWZpbmVkKE5ERUJVRykgJiYgZGVmaW5lZChVU0VfREVCVUdfU0FGQVJJX1RIRU1FKQot
U09GVF9MSU5LX0RFQlVHX0xJQlJBUlkoU2FmYXJpVGhlbWUpCi0jZWxzZQotU09GVF9MSU5LX0xJ
QlJBUlkoU2FmYXJpVGhlbWUpCi0jZW5kaWYKIAotU09GVF9MSU5LKFNhZmFyaVRoZW1lLCBwYWlu
dFRoZW1lUGFydCwgdm9pZCwgX19zdGRjYWxsLCAoVGhlbWVQYXJ0IHBhcnQsIENHQ29udGV4dFJl
ZiBjb250ZXh0LCBjb25zdCBDR1JlY3QmIHJlY3QsIE5TQ29udHJvbFNpemUgc2l6ZSwgVGhlbWVD
b250cm9sU3RhdGUgc3RhdGUpLCAocGFydCwgY29udGV4dCwgcmVjdCwgc2l6ZSwgc3RhdGUpKQor
Ly8gTm90ZTogIENvcGllZCBmcm9tIFJlbmRlclRoZW1lV2luLiAgVGhlcmUgc2hvdWxkIGJlIHNv
bWUgd2F5IHRvIGJldHRlcgorLy8gZW5jYXBzdWxhdGUvc2hhcmUgdGhpcyBzdHVmZi4gIFNlZSBh
bGwgUmVuZGVyVGhlbWVTYWZhcmkgZm9yIG1vcmUgc3VjaCBzdHVmZi4uLgorLy8KKy8vIEFmdGVy
IGRpc2N1c3Npb24gd2l0aCBBZGFtIFJvYmVuLCB3ZSB3aWxsIG1ha2UgdGhlIHVnbHkgY2hvaWNl
IG9mIGNvcHlpbmcgbG9naWMKKy8vIGZyb20gUmVuZGVyVGhlbWVXaW4gdW50aWwgdGhlIFRoZW1l
IGxvZ2ljIGlzIHJlZmFjdG9yZWQKK3R5cGVkZWYgSEFORExFIChXSU5BUEkqb3BlblRoZW1lRGF0
YVB0cikoSFdORCBod25kLCBMUENXU1RSIHBzekNsYXNzTGlzdCk7Cit0eXBlZGVmIEhSRVNVTFQg
KFdJTkFQSSpjbG9zZVRoZW1lRGF0YVB0cikoSEFORExFIGhUaGVtZSk7Cit0eXBlZGVmIEhSRVNV
TFQgKFdJTkFQSSpkcmF3VGhlbWVCYWNrZ3JvdW5kUHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRj
LCBpbnQgaVBhcnRJZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QgKnBSZWN0LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVCogcENsaXBSZWN0KTsKK3R5cGVkZWYgSFJF
U1VMVCAoV0lOQVBJKmRyYXdUaGVtZUVkZ2VQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGlu
dCBpUGFydElkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu
dCBpU3RhdGVJZCwgY29uc3QgUkVDVCAqcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1RWRnZSwgdW5zaWduZWQgdUZsYWdzLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVCogcENsaXBSZWN0
KTsKK3R5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lQ29udGVudFJlY3RQdHIpKEhBTkRM
RSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUKiBwUmVjdCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QqIHBDb250ZW50UmVjdCk7
Cit0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVtZVBhcnRTaXplUHRyKShIQU5ETEUgaFRo
ZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGludCBpU3RhdGVJZCwgUkVDVCogcHJjLCBpbnQgdHMsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFKiBwc3opOwordHlwZWRlZiBIUkVTVUxUIChX
SU5BUEkqZ2V0VGhlbWVTeXNGb250UHRyKShIQU5ETEUgaFRoZW1lLCBpbnQgaUZvbnRJZCwgT1VU
IExPR0ZPTlQqIHBGb250KTsKK3R5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lQ29sb3JQ
dHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIGludCBpUHJvcElkLCBPVVQgQ09MT1JS
RUYqIHBGb250KTsKKworc3RhdGljIG9wZW5UaGVtZURhdGFQdHIgb3BlblRoZW1lID0gMDsKK3N0
YXRpYyBjbG9zZVRoZW1lRGF0YVB0ciBjbG9zZVRoZW1lID0gMDsKK3N0YXRpYyBkcmF3VGhlbWVC
YWNrZ3JvdW5kUHRyIGRyYXdUaGVtZUJHID0gMDsKK3N0YXRpYyBkcmF3VGhlbWVFZGdlUHRyIGRy
YXdUaGVtZUVkZ2UgPSAwOworc3RhdGljIGdldFRoZW1lQ29udGVudFJlY3RQdHIgZ2V0VGhlbWVD
b250ZW50UmVjdCA9IDA7CitzdGF0aWMgZ2V0VGhlbWVQYXJ0U2l6ZVB0ciBnZXRUaGVtZVBhcnRT
aXplID0gMDsKK3N0YXRpYyBnZXRUaGVtZVN5c0ZvbnRQdHIgZ2V0VGhlbWVTeXNGb250ID0gMDsK
K3N0YXRpYyBnZXRUaGVtZUNvbG9yUHRyIGdldFRoZW1lQ29sb3IgPSAwOworCisvLyBNYXkgbmVl
ZCB0byBhZGQgc3R1ZmYgdG8gdGhlc2UgbGF0ZXIsIHNvIGtlZXAgdGhlIGdyYXBoaWNzIGNvbnRl
eHQgcmV0cmlldmFsL3JlbGVhc2UgaW4gc29tZSBoZWxwZXJzLgorc3RhdGljIEhEQyBwcmVwYXJl
Rm9yRHJhd2luZyhHcmFwaGljc0NvbnRleHQqIGcsIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAg
cmV0dXJuIGctPmdldFdpbmRvd3NDb250ZXh0KHIpOworfQorIAorc3RhdGljIHZvaWQgZG9uZURy
YXdpbmcoR3JhcGhpY3NDb250ZXh0KiBnLCBIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByKQorewor
ICAgIGctPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHIpOworfQorLy8gRW5kIENvcGllZCBm
cm9tIFJlbmRlclRoZW1lV2luCiAKIGNvbnN0IGRvdWJsZSBjSW5pdGlhbFRpbWVyRGVsYXkgPSAw
LjI1OwogY29uc3QgZG91YmxlIGNOb3JtYWxUaW1lckRlbGF5ID0gMC4wNTsKIAogUGxhdGZvcm1T
Y3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCogY2xpZW50LCBTY3Jv
bGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkK
LSAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKSwgbV9ob3ZlcmVkUGFy
dChOb1BhcnQpLCBtX3ByZXNzZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBvcygwKSwKLSAgICAg
IG1fc2Nyb2xsVGltZXIodGhpcywgJlBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJG
aXJlZCksCi0gICAgICBtX292ZXJsYXBzUmVzaXplcihmYWxzZSkKLXsKKyAgICA6IFNjcm9sbGJh
cihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKQorICAgICwgbV9ob3ZlcmVkUGFydChOb1BhcnQp
CisgICAgLCBtX3ByZXNzZWRQYXJ0KE5vUGFydCkKKyAgICAsIG1fcHJlc3NlZFBvcygwKQorICAg
ICwgbV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1l
ckZpcmVkKQorICAgICwgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCisgICAgLCBtX3RoZW1lRExM
KDApCisgICAgLCBtX3Njcm9sbEJhclRoZW1lKDApCit7CisgICAgLy8gTGF0Y2ggb250byB0aGUg
dGhlbWVpbmcgZW5naW5lCisgICAgbV90aGVtZURMTCA9IDo6TG9hZExpYnJhcnkoTCJ1eHRoZW1l
LmRsbCIpOworICAgIGlmIChtX3RoZW1lRExMKSB7CisgICAgICAgIG9wZW5UaGVtZSA9IChvcGVu
VGhlbWVEYXRhUHRyKUdldFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJPcGVuVGhlbWVEYXRhIik7
CisgICAgICAgIGNsb3NlVGhlbWUgPSAoY2xvc2VUaGVtZURhdGFQdHIpR2V0UHJvY0FkZHJlc3Mo
bV90aGVtZURMTCwgIkNsb3NlVGhlbWVEYXRhIik7CisgICAgICAgIGRyYXdUaGVtZUJHID0gKGRy
YXdUaGVtZUJhY2tncm91bmRQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkRyYXdUaGVt
ZUJhY2tncm91bmQiKTsKKyAgICAgICAgZHJhd1RoZW1lRWRnZSA9IChkcmF3VGhlbWVFZGdlUHRy
KUdldFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJEcmF3VGhlbWVFZGdlIik7CisgICAgICAgIGdl
dFRoZW1lQ29udGVudFJlY3QgPSAoZ2V0VGhlbWVDb250ZW50UmVjdFB0cilHZXRQcm9jQWRkcmVz
cyhtX3RoZW1lRExMLCAiR2V0VGhlbWVCYWNrZ3JvdW5kQ29udGVudFJlY3QiKTsKKyAgICAgICAg
Z2V0VGhlbWVQYXJ0U2l6ZSA9IChnZXRUaGVtZVBhcnRTaXplUHRyKUdldFByb2NBZGRyZXNzKG1f
dGhlbWVETEwsICJHZXRUaGVtZVBhcnRTaXplIik7CisgICAgICAgIGdldFRoZW1lU3lzRm9udCA9
IChnZXRUaGVtZVN5c0ZvbnRQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkdldFRoZW1l
U3lzRm9udCIpOworICAgICAgICBnZXRUaGVtZUNvbG9yID0gKGdldFRoZW1lQ29sb3JQdHIpR2V0
UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkdldFRoZW1lQ29sb3IiKTsKKyAgICB9CisKICAgICAv
LyBPYnRhaW4gdGhlIGNvcnJlY3Qgc2Nyb2xsYmFyIHNpemVzIGZyb20gdGhlIHN5c3RlbS4KICAg
ICBpZiAoIWNIb3Jpem9udGFsV2lkdGgpIHsKICAgICAgICAgLy8gRklYTUU6IEdldCBtZXRpY3Mg
ZnJvbSBTYWZhcmlUaGVtZQpAQCAtOTIsNiArMTcwLDE2IEBAIFBsYXRmb3JtU2Nyb2xsYmFyOjpQ
bGF0Zm9ybVNjcm9sbGJhcihTY3IKIFBsYXRmb3JtU2Nyb2xsYmFyOjp+UGxhdGZvcm1TY3JvbGxi
YXIoKQogewogICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisKKyAgICAvLyBDbGVhbnVwIHRoZW1l
IHN0dWZmCisgICAgaWYgKCFtX3RoZW1lRExMKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
bV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgY2xvc2VUaGVtZShtX3Njcm9sbEJhclRoZW1lKTsK
KyAgICBtX3Njcm9sbEJhclRoZW1lID0gMDsKKworICAgIDo6RnJlZUxpYnJhcnkobV90aGVtZURM
TCk7CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUG9zaXRpb24oKQpA
QCAtMzEwLDYgKzM5OCwxMSBAQCBJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlJlY3Qo
KSBjCiAgICAgcmV0dXJuIHRodW1iUmVjdDsKIH0KIAorSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJh
cjo6Z3JpcHBlclJlY3QoY29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25zdAoreworICAgIHJl
dHVybiBJbnRSZWN0KCk7Cit9CisKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNwbGl0VHJhY2so
Y29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBJbnRSZWN0JiBiZWZvcmVUaHVtYlJlY3QsIEludFJl
Y3QmIHRodW1iUmVjdCwgSW50UmVjdCYgYWZ0ZXJUaHVtYlJlY3QpIGNvbnN0CiB7CiAgICAgLy8g
VGhpcyBmdW5jdGlvbiB3b24ndCBldmVuIGdldCBjYWxsZWQgdW5sZXNzIHdlJ3JlIGJpZyBlbm91
Z2ggdG8gaGF2ZSBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZXNlIHRocmVlIHJlY3RzIHdoZXJlIGF0
IGxlYXN0CkBAIC0zNTUsNjggKzQ0OCwxMzQgQEAgaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0cmFj
a0xlbmd0aCgpIGNvbgogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEJ1dHRvbihHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgc3RhcnQsIGNv
bnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0CiB7Ci0gICAgaWYgKCFTYWZhcmlUaGVtZUxp
YnJhcnkoKSkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgSW50UmVjdCBwYWludFJlY3QgPSBidXR0
b25SZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpLCBzdGFydCk7
CiAgICAgCiAgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgVGhlbWVQYXJ0IHBhcnQ7Ci0gICAgVGhlbWVDb250cm9sU3RhdGUg
c3RhdGUgPSAwOwotICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKLSAgICAgICAgc3RhdGUg
fD0gQWN0aXZlU3RhdGU7Ci0gICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9s
bGJhcikKLSAgICAgICAgcGFydCA9IHN0YXJ0ID8gU2Nyb2xsTGVmdEFycm93UGFydCA6IFNjcm9s
bFJpZ2h0QXJyb3dQYXJ0OwotICAgIGVsc2UKLSAgICAgICAgcGFydCA9IHN0YXJ0ID8gU2Nyb2xs
VXBBcnJvd1BhcnQgOiBTY3JvbGxEb3duQXJyb3dQYXJ0OworICAgIHVuc2lnbmVkIHBhcnQgPSAw
OworICAgIHVuc2lnbmVkIHN0YXRlID0gMDsKKyAgICB1bnNpZ25lZCBjbGFzc2ljUGFydCA9IDA7
CisgICAgdW5zaWduZWQgY2xhc3NpY1N0YXRlID0gMDsKIAotICAgIGlmIChpc0VuYWJsZWQoKSkK
LSAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOwotICAgIGlmICgobV9wcmVzc2VkUGFydCA9
PSBCYWNrQnV0dG9uUGFydCAmJiBzdGFydCkKLSAgICAgICAgfHwgKG1fcHJlc3NlZFBhcnQgPT0g
Rm9yd2FyZEJ1dHRvblBhcnQgJiYgIXN0YXJ0KSkKLSAgICAgICAgc3RhdGUgfD0gUHJlc3NlZFN0
YXRlOworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAg
ICAgICBzdGF0ZSA9IHN0YXJ0ID8gQUJTX0xFRlROT1JNQUwgOiBBQlNfUklHSFROT1JNQUw7Cisg
ICAgICAgY2xhc3NpY1BhcnQgPSBzdGFydCA/IERGQ1NfU0NST0xMTEVGVCA6IERGQ1NfU0NST0xM
UklHSFQ7CisgICAgfSBlbHNlIHsKKyAgICAgICBzdGF0ZSA9IHN0YXJ0ID8gQUJTX1VQTk9STUFM
IDogQUJTX0RPV05OT1JNQUw7CisgICAgICAgY2xhc3NpY1BhcnQgPSBzdGFydCA/IERGQ1NfU0NS
T0xMVVAgOiBERkNTX1NDUk9MTERPV047CisgICAgfQogCi0gICAgcGFpbnRUaGVtZVBhcnQocGFy
dCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9
PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xT
aXplLCBzdGF0ZSk7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkgeworICAgICAgICBzdGF0ZSArPSBT
UF9BQlNfRElTQUJMRV9NT0RJRklFUjsKKyAgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfSU5B
Q1RJVkU7CisgICAgfQorICAgIGVsc2UgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25Q
YXJ0ICYmIHN0YXJ0KQorICAgICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0
b25QYXJ0ICYmICFzdGFydCkpCisgICAgeworICAgICAgICBzdGF0ZSArPSBTUF9BQlNfUFJFU1NF
RF9NT0RJRklFUjsKKyAgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfUFVTSEVEIHwgREZDU19G
TEFUOworICAgIH0KKyAgICBlbHNlIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICB7Cisg
ICAgICAgc3RhdGUgKz0gU1BfQUJTX0hPVF9NT0RJRklFUjsKKyAgICAgICBjbGFzc2ljU3RhdGUg
fD0gREZDU19IT1Q7CisgICAgfQorCisgICAgSERDIGhkYyA9IHByZXBhcmVGb3JEcmF3aW5nKGNv
bnRleHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHJlY3Q7CisgICAgaWYgKG1fdGhl
bWVETEwgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBv
cGVuVGhlbWUoMCwgTCJTY3JvbGxiYXIiKTsKKworICAgIGlmIChtX3Njcm9sbEJhclRoZW1lICYm
IGRyYXdUaGVtZUJHKQorICAgICAgICBkcmF3VGhlbWVCRyhtX3Njcm9sbEJhclRoZW1lLCBoZGMs
IFNQX0JVVFRPTiwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICBlbHNlCisgICAgICAg
IERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgY2xhc3NpY1BhcnQsIGNsYXNzaWNT
dGF0ZSk7CisKKyAgICBkb25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3QpOwogfQogCiB2b2lk
IFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
Y29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVj
dCkgY29uc3QKIHsKLSAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQotICAgICAgICByZXR1
cm47Ci0KICAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGhhc0J1dHRvbnMoKSA/IHRyYWNrUmVwYWlu
dFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSkgOiByZWN0OwogICAgIAog
ICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCiAgICAgICAgIHJldHVy
bjsKIAotICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyID8gSFNjcm9sbFRyYWNrUGFydCA6IFZTY3JvbGxUcmFja1BhcnQ7Ci0gICAgVGhlbWVD
b250cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIHVuc2lnbmVkIHBhcnQgPSAwOworICAgIHVuc2ln
bmVkIGNsYXNzaWNQYXJ0ID0gREZDX1NDUk9MTDsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgIHBhcnQgPSBzdGFydCA/IFNQX1RSQUNLU1RBUlRI
T1IgOiBTUF9UUkFDS0VOREhPUjsKKyAgICBlbHNlCisgICAgICAgcGFydCA9IHN0YXJ0ID8gU1Bf
VFJBQ0tTVEFSVFZFUlQgOiBTUF9UUkFDS0VORFZFUlQ7CisKKyAgICB1bnNpZ25lZCBzdGF0ZSA9
IFRTX0RJU0FCTEVEOworICAgIHVuc2lnbmVkIGNsYXNzaWNTdGF0ZSA9IERGQ1NfTU9OTzsKICAg
ICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRl
OworICAgICAgICBzdGF0ZSB8PSBUU19BQ1RJVkU7CisgICAgZWxzZQorICAgICAgIGNsYXNzaWNT
dGF0ZSB8PSBERkNTX0lOQUNUSVZFOworCiAgICAgaWYgKGhhc0J1dHRvbnMoKSkKLSAgICAgICAg
c3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgICAgICBzdGF0ZSB8PSBUU19OT1JNQUw7CiAKLSAg
ICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcGFpbnRS
ZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXpl
IDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKKyAgICBIREMgaGRjID0gcHJlcGFyZUZv
ckRyYXdpbmcoY29udGV4dCwgcmVjdCk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAg
ICBpZiAobV90aGVtZURMTCAmJiAhbV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgbV9zY3JvbGxC
YXJUaGVtZSA9IG9wZW5UaGVtZSgwLCBMIlNjcm9sbGJhciIpOworCisgICAgaWYgKG1fc2Nyb2xs
QmFyVGhlbWUgJiYgZHJhd1RoZW1lQkcpCisgICAgICAgIGRyYXdUaGVtZUJHKG1fc2Nyb2xsQmFy
VGhlbWUsIGhkYywgcGFydCwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICBlbHNlCisg
ICAgICAgIERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgREZDX1NDUk9MTCwgY2xh
c3NpY1N0YXRlKTsKKworICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcmVjdCk7CiB9CiAK
IHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25z
dAogewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCi0gICAgICAgIHJldHVybjsKLQog
ICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQogICAgICAgICByZXR1cm47CiAK
LSAgICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJh
ciA/IEhTY3JvbGxUaHVtYlBhcnQgOiBWU2Nyb2xsVGh1bWJQYXJ0OwotICAgIFRoZW1lQ29udHJv
bFN0YXRlIHN0YXRlID0gMDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gKG1fb3JpZW50YXRpb24gPT0g
SG9yaXpvbnRhbFNjcm9sbGJhcikgPyBTUF9USFVNQkhPUiA6IFNQX1RIVU1CVkVSVDsKKyAgICB1
bnNpZ25lZCBzdGF0ZSA9IDA7CisKKyAgICBpZiAoIWlzRW5hYmxlZCgpKQorICAgICAgICBzdGF0
ZSArPSBTUF9BQlNfRElTQUJMRV9NT0RJRklFUjsKKyAgICBlbHNlIGlmIChtX2NsaWVudC0+aXNB
Y3RpdmUoKSkKKyAgICAgICBzdGF0ZSArPSBTUF9BQlNfSE9UX01PRElGSUVSOworCisgICAgSERD
IGhkYyA9IHByZXBhcmVGb3JEcmF3aW5nKGNvbnRleHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0
UmVjdCA9IHJlY3Q7CisgICAgaWYgKG1fdGhlbWVETEwgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisg
ICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJTY3JvbGxiYXIiKTsKKwor
ICAgIGlmIChtX3Njcm9sbEJhclRoZW1lICYmIGRyYXdUaGVtZUJHKSB7CisgICAgICAgIGRyYXdU
aGVtZUJHKG1fc2Nyb2xsQmFyVGhlbWUsIGhkYywgcGFydCwgc3RhdGUsICZ3aWRnZXRSZWN0LCBO
VUxMKTsKKyAgICAgICAgcGFpbnRHcmlwcGVyKGhkYywgd2lkZ2V0UmVjdCk7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgSEdESU9CSiBoU2F2ZUJydXNoID0gU2VsZWN0T2JqZWN0KGhkYywgR2V0U3lz
Q29sb3JCcnVzaChDT0xPUl9CVE5GQUNFKSk7CisgICAgICAgIERyYXdFZGdlKGhkYywgJndpZGdl
dFJlY3QsIEVER0VfUkFJU0VELCBCRl9SRUNUKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYyxo
U2F2ZUJydXNoKTsKKyAgICB9CisKKyAgICBkb25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3Qp
OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEdyaXBwZXIoSERDIGhkYywgY29u
c3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICB1bnNpZ25lZCBwYXJ0ID0gKG1fb3JpZW50
YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyBTUF9HUklQUEVSSE9SIDogU1BfR1JJUFBF
UlZFUlQ7CisgICAgdW5zaWduZWQgc3RhdGUgPSAwOworCiAgICAgaWYgKG1fY2xpZW50LT5pc0Fj
dGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKLSAgICBpZiAoaXNFbmFibGVk
KCkpCi0gICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKyAgICAgICAgc3RhdGUgfD0gVFNf
QUNUSVZFOwogCi0gICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCksIHJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29u
dHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworICAgIFJFQ1Qgd2lkZ2V0
UmVjdCA9IHJlY3Q7CisgICAgaWYgKG1fdGhlbWVETEwgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisg
ICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJTY3JvbGxiYXIiKTsKKwor
ICAgIGlmIChtX3Njcm9sbEJhclRoZW1lICYmIGRyYXdUaGVtZUJHKQorICAgICAgICBkcmF3VGhl
bWVCRyhtX3Njcm9sbEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVM
TCk7CiB9CiAKIFNjcm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRlc3QoY29uc3Qg
UGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCkBAIC00NDgsNiArNjA3LDcgQEAgU2Nyb2xsYmFyUGFy
dCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0VGVzdAogICAgICAgICAgICAgcmV0dXJuIFRodW1iUGFy
dDsKICAgICAgICAgcmV0dXJuIEZvcndhcmRUcmFja1BhcnQ7CiAgICAgfQorCiAgICAgcmV0dXJu
IE5vUGFydDsKIH0KIApAQCAtNDc2LDcgKzYzNiw3IEBAIGJvb2wgUGxhdGZvcm1TY3JvbGxiYXI6
OmhhbmRsZU1vdXNlTW92ZUUKICAgICAgICAgICAgIHNldFZhbHVlKChmbG9hdCkodGh1bWJQb3Mg
KyBkZWx0YSkgKiAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKSAvICh0cmFja0xlbiAtIHRo
dW1iTGVuKSk7CiAgICAgICAgICAgICBtX3ByZXNzZWRQb3MgKz0gdGh1bWJQb3NpdGlvbigpIC0g
dGh1bWJQb3M7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHRydWU7CiAg
ICAgfQogCkBAIC02MzYsMTkgKzc5NiwxMiBAQCBpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnZlcnRp
Y2FsU2Nyb2xsYmFyCiBJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp3aW5kb3dDbGlwUmVjdCgp
IGNvbnN0CiB7CiAgICAgSW50UmVjdCBjbGlwUmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSk7
CisKICAgICBjbGlwUmVjdCA9IGNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3coY2xpcFJlY3QpOwog
ICAgIGlmIChtX2NsaWVudCkKICAgICAgICAgY2xpcFJlY3QuaW50ZXJzZWN0KG1fY2xpZW50LT53
aW5kb3dDbGlwUmVjdCgpKTsKLSAgICByZXR1cm4gY2xpcFJlY3Q7Ci19CiAKLXZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByZWN0KSBj
b25zdAotewotfQotCi1JbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVyUmVjdChjb25z
dCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEludFJlY3QoKTsKKyAg
ICByZXR1cm4gY2xpcFJlY3Q7CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnRoZW1lQ2hh
bmdlZCgpCkBAIC02NTcsNCArODEwLDMgQEAgdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVD
aGFuZ2VkKCkKIAogfQogCi0jZW5kaWYgLy8gZGVmaW5lZChVU0VfU0FGQVJJX1RIRU1FKQpJbmRl
eDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmNwcAkocmV2aXNpb24gMzA1NTQpCisrKyBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMy
LDcgKzMyLDcgQEAKIC8qIAogICogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHVzZWQgdG8g
ZGV0ZXJtaW5lIGhvdyBhIHdpZGdldCBpcyBkcmF3biB1c2luZwogICogV2luZG93cycgVGhlbWUg
QVBJLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVtZSBwYXJ0cyBhbmQgc3RhdGVzIHNlZQot
ICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGli
cmFyeS9lbi11cy9zaGVsbGNjL3BsYXRmb3JtL2NvbW1jdGxzL3VzZXJleC90b3BpY3MvcGFydHNh
bmRzdGF0ZXMuYXNwCisgKiBodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5
L2JiNzczMjEwKFZTLjg1KS5hc3B4CiAgKi8KICNkZWZpbmUgVEhFTUVfQ09MT1IgMjA0CiAjZGVm
aW5lIFRIRU1FX0ZPTlQgIDIxMApAQCAtNTMsNiArNTMsMTcgQEAKICNkZWZpbmUgVEZQX1RFWFRG
SUVMRCAxCiAjZGVmaW5lIFRGU19SRUFET05MWSAgNgogCisvLyBTY3JvbGxiYXIgY29uc3RhbnRz
CisjZGVmaW5lIFNQX0JVVFRPTiAxCisjZGVmaW5lIFNQX1RIVU1CSE9SIDIKKyNkZWZpbmUgU1Bf
VEhVTUJWRVJUIDMKKyNkZWZpbmUgU1BfVFJBQ0tTVEFSVEhPUiA0CisjZGVmaW5lIFNQX1RSQUNL
RU5ESE9SIDUKKyNkZWZpbmUgU1BfVFJBQ0tTVEFSVFZFUlQgNgorI2RlZmluZSBTUF9UUkFDS0VO
RFZFUlQgNworI2RlZmluZSBTUF9HUklQUEVSSE9SIDgKKyNkZWZpbmUgU1BfR1JJUFBFUlZFUlQg
OQorCiAvLyBDb21ib2JveCBjb25zdGFudHMKICNkZWZpbmUgQ1BfRFJPUERPV05CVVRUT04gMQog
CkBAIC05Myw3ICsxMDQsMTAgQEAgUmVuZGVyVGhlbWUqIHRoZW1lKCkKIH0KIAogUmVuZGVyVGhl
bWVXaW46OlJlbmRlclRoZW1lV2luKCkKLTptX3RoZW1lRExMKDApLCBtX2J1dHRvblRoZW1lKDAp
LCBtX3RleHRGaWVsZFRoZW1lKDApLCBtX21lbnVMaXN0VGhlbWUoMCkKKyAgICA6IG1fdGhlbWVE
TEwoMCkKKyAgICAsIG1fYnV0dG9uVGhlbWUoMCkKKyAgICAsIG1fdGV4dEZpZWxkVGhlbWUoMCkK
KyAgICAsIG1fbWVudUxpc3RUaGVtZSgwKQogewogICAgIG1fdGhlbWVETEwgPSA6OkxvYWRMaWJy
YXJ5KEwidXh0aGVtZS5kbGwiKTsKICAgICBpZiAobV90aGVtZURMTCkgewpAQCAtMTI3LDcgKzE0
MSw5IEBAIHZvaWQgUmVuZGVyVGhlbWVXaW46OmNsb3NlKCkKICAgICAgICAgY2xvc2VUaGVtZSht
X3RleHRGaWVsZFRoZW1lKTsKICAgICBpZiAobV9tZW51TGlzdFRoZW1lKQogICAgICAgICBjbG9z
ZVRoZW1lKG1fbWVudUxpc3RUaGVtZSk7Ci0gICAgbV9idXR0b25UaGVtZSA9IG1fdGV4dEZpZWxk
VGhlbWUgPSBtX21lbnVMaXN0VGhlbWUgPSAwOworICAgIGlmIChtX3Njcm9sbEJhclRoZW1lKQor
ICAgICAgICBjbG9zZVRoZW1lKG1fc2Nyb2xsQmFyVGhlbWUpOworICAgIG1fYnV0dG9uVGhlbWUg
PSBtX3RleHRGaWVsZFRoZW1lID0gbV9tZW51TGlzdFRoZW1lID0gbV9zY3JvbGxCYXJUaGVtZSA9
IDA7CiB9CiAKIENvbG9yIFJlbmRlclRoZW1lV2luOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJh
Y2tncm91bmRDb2xvcigpIGNvbnN0CkBAIC0xNjQsOCArMTgwLDYgQEAgYm9vbCBSZW5kZXJUaGVt
ZVdpbjo6c3VwcG9ydHNGb2N1cyhFQXBwZQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwogICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKIH0KIAogdW5zaWduZWQg
UmVuZGVyVGhlbWVXaW46OmRldGVybWluZVN0YXRlKFJlbmRlck9iamVjdCogbykKQEAgLTIyMyw2
ICsyMzcsMjQgQEAgVGhlbWVEYXRhIFJlbmRlclRoZW1lV2luOjpnZXRUaGVtZURhdGEoUgogICAg
ICAgICBjYXNlIFRleHRBcmVhQXBwZWFyYW5jZToKICAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQg
PSBURlBfVEVYVEZJRUxEOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xs
YmFyVHJhY2tIb3Jpem9udGFsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQg
PSBTUF9UUkFDS1NUQVJUSE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Ny
b2xsYmFyVHJhY2tWZXJ0aWNhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1bHQubV9wYXJ0
ID0gU1BfVFJBQ0tTVEFSVFZFUlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBT
Y3JvbGxiYXJUaHVtYkhvcml6b250YWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVzdWx0Lm1f
cGFydCA9IFNQX1RIVU1CSE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Ny
b2xsYmFyVGh1bWJWZXJ0aWNhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1bHQubV9wYXJ0
ID0gU1BfVEhVTUJWRVJUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xs
YmFyR3JpcHBlckhvcml6b250YWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVzdWx0Lm1fcGFy
dCA9IFNQX0dSSVBQRVJIT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3Jv
bGxiYXJHcmlwcGVyVmVydGljYWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVzdWx0Lm1fcGFy
dCA9IFNQX0dSSVBQRVJWRVJUOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgcmVz
dWx0Lm1fc3RhdGUgPSBkZXRlcm1pbmVTdGF0ZShvKTsKQEAgLTI2NCwxNSArMjk2LDQyIEBAIGJv
b2wgUmVuZGVyVGhlbWVXaW46OnBhaW50QnV0dG9uKFJlbmRlck8KICAgICAgICAgICAgIH0KICAg
ICAgICAgfQogICAgICAgICBEcmF3RnJhbWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIERGQ19C
VVRUT04sIHRoZW1lRGF0YS5tX2NsYXNzaWNTdGF0ZSk7Ci0gICAgICAgIGlmICgodGhlbWVEYXRh
Lm1fcGFydCAhPSBCUF9CVVRUT04pICYmIGlzRm9jdXNlZChvKSkgeworICAgICAgICBpZiAoKHRo
ZW1lRGF0YS5tX3BhcnQgIT0gQlBfQlVUVE9OKSAmJiBpc0ZvY3VzZWQobykpCiAgICAgICAgICAg
ICBEcmF3Rm9jdXNSZWN0KGhkYywgJndpZGdldFJlY3QpOwotICAgICAgICB9CiAgICAgfQogICAg
IGRvbmVEcmF3aW5nKGkuY29udGV4dCwgaGRjLCByKTsKIAogICAgIHJldHVybiBmYWxzZTsKIH0K
IAorYm9vbCBSZW5kZXJUaGVtZVdpbjo6cGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBJbnRSZWN0JiByLCB1bnNpZ25lZCBzdGF0ZSwgdW5zaWduZWQgc2l6ZSkKK3sK
KyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogY3R4ID0gY29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCk7CisgICAgc3RhdGUgPSBUU19BQ1RJVkU7CisKKyAgICAgLy8gTm93IHBhaW50IHRoZSBi
dXR0b24uCisgICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByKTsgIAor
ICAgICBSRUNUIHdpZGdldFJlY3QgPSByOworICAgICBpZiAobV90aGVtZURMTCAmJiAhbV9idXR0
b25UaGVtZSkKKyAgICAgICAgIG1fYnV0dG9uVGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJCdXR0b24i
KTsKKyAgICAgaWYgKG1fYnV0dG9uVGhlbWUgJiYgZHJhd1RoZW1lQkcpIHsKKyAgICAgICAgIGRy
YXdUaGVtZUJHKG1fYnV0dG9uVGhlbWUsIGhkYywgQlBfQlVUVE9OLCBzdGF0ZSwgJndpZGdldFJl
Y3QsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgICAg
IC8vIERyYXcgYmxhY2sgZm9jdXMgcmVjdCBhcm91bmQgYnV0dG9uIG91dGVyIGVkZ2UKKyAgICAg
ICAgICAgIEhCUlVTSCBicnVzaCA9IEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfM0RES1NIQURPVyk7
CisgICAgICAgICAgICBpZiAoYnJ1c2gpIHsKKyAgICAgICAgICAgICAgICBGcmFtZVJlY3QoaGRj
LCAmd2lkZ2V0UmVjdCwgYnJ1c2gpOworICAgICAgICAgICAgICAgIEluZmxhdGVSZWN0KCZ3aWRn
ZXRSZWN0LCAtMSwgLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERyYXdG
cmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgREZDX0JVVFRPTiwgMCk7CisgICAgfQorICAg
IGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcik7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
IHZvaWQgUmVuZGVyVGhlbWVXaW46OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0CiB7CiAgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lm
aWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRoZW1lV2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
VGhlbWVXaW4uaAkocmV2aXNpb24gMzA1NTQpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJU
aGVtZVdpbi5oCSh3b3JraW5nIGNvcHkpCkBAIC02Nyw2ICs2Nyw3IEBAIHB1YmxpYzoKICAgICB7
IHJldHVybiBzZXRDaGVja2JveFNpemUoc3R5bGUpOyB9CiAKICAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBhaW50QnV0dG9uKEdyYXBoaWNzQ29u
dGV4dCosIGNvbnN0IEludFJlY3QmLCB1bnNpZ25lZCwgdW5zaWduZWQpOwogCiAgICAgdmlydHVh
bCBib29sIHBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6
UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwogCkBAIC05Miw2ICs5Myw3IEBAIHByaXZhdGU6
CiAgICAgbXV0YWJsZSBIQU5ETEUgbV9idXR0b25UaGVtZTsKICAgICBtdXRhYmxlIEhBTkRMRSBt
X3RleHRGaWVsZFRoZW1lOwogICAgIG11dGFibGUgSEFORExFIG1fbWVudUxpc3RUaGVtZTsKKyAg
ICBtdXRhYmxlIEhBTkRMRSBtX3Njcm9sbEJhclRoZW1lOwogfTsKIAogfTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19351</attachid>
            <date>2008-02-25 10:34:11 -0800</date>
            <delta_ts>2008-02-26 16:56:58 -0800</delta_ts>
            <desc>Revision based on Darin&apos;s latest comments</desc>
            <filename>WinCairoScrollbars.patch</filename>
            <type>text/plain</type>
            <size>45295</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiAzMDU1MikKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIsNiArMTEyLDExIEBACiAj
ZGVmaW5lIFdURl9QTEFURk9STV9DQUlSTyAxCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKENHKQor
I2RlZmluZSBVU0VfU0FGQVJJX1RIRU1FIDEKKyNlbHNlCisjdW5kZWYgVVNFX1NBRkFSSV9USEVN
RQorI2VuZGlmCiAKICNpZmRlZiBfX1M2MF9fCiAvLyB3ZSBhcmUgY3Jvc3MtY29tcGlsaW5nLCBp
dCBpcyBub3QgcmVhbGx5IHdpbmRvd3MKSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAzMDU3MSkKKysrIFdlYkNvcmUvQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjYgQEAKKzIwMDgtMDItMjUgIEJyZW50
IEZ1bGdoYW0gPGJmdWxnaGFtQGdtYWlsLmNvbT4KKworICAgICAgICBodHRwOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzQ4MworICAgICAgICBJbXBsZW1lbnQgc2Nyb2xsYmFy
cyBvbiBXaW5kb3dzIChDYWlybykKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBXQVJOSU5HOiBOTyBURVNUIENBU0VTIEFEREVEIE9SIENIQU5HRUQKKwor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oOiAgQWRkIHRoZW1lIEhB
TkRMRSBtZW1iZXIgdG8KKyAgICAgICAgICBzdXBwb3J0IFdpbmRvd3Mtc3R5bGUgc2Nyb2xsYmFy
cy4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGxhdGZyb21TY3JvbGxCYXJXaW4uY3BwOiAgRHVw
bGljYXRlIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgZnJvbSBQbGF0Zm9ybVNjcm9sbEJhcldp
blNhZmFyaS5jcHAsIHRoZW4gbW9kaWZ5IHRvIHVzZSB0aGUKKyAgICAgICAgICBuYXRpdmUgV2lu
ZG93cyB0aGVtZSBlbmdpbmUuCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmNw
cDogIENvcnJlY3QgbXNkbiBsaW5rIChjaGFuZ2VkIHNpbmNlCisgICAgICAgICAgZmlsZSBvcmln
aW5hbGx5IGNyZWF0ZWQpLCBhZGQgY29uc3RhbnRzIGFuZCBtZW1iZXIgaW5pdGlhbGl6YXRpb24K
KyAgICAgICAgICBuZWVkZWQgZm9yIHNjcm9sbGJhcnMuIAorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVXaW46OmRldGVybWluZVN0YXRlKTogRXh0ZW5kIHRvIHJlY29nbml6ZQorICAgICAg
ICAgIHNjcm9sbGJhciBwYXJ0cy4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luOjpw
YWludEJ1dHRvbik6IEFkZCBuZXcgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICBmb3IgZHJhd2lu
ZyBidXR0b25zIGdpdmVuIGEgZ3JhcGhpYyBjb250ZXh0IGFuZCBib3VuZGluZyBib3guCisgICAg
ICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmgKKwogMjAwOC0wMi0yNSAgRGFyaW4gQWRs
ZXIgIDxkYXJpbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQW5kZXJzLgpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCShyZXZpc2lvbiAzMDU3
MSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTEwNiw2ICsxMDYsMTEgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9wcmVzc2VkUG9z
OwogICAgIFRpbWVyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3Njcm9sbFRpbWVyOwogICAgIGJvb2wg
bV9vdmVybGFwc1Jlc2l6ZXI7CisKKyNpZiAhVVNFKFNBRkFSSV9USEVNRSkKKyAgICBITU9EVUxF
IG1fdGhlbWVETEw7CisgICAgbXV0YWJsZSBIQU5ETEUgbV9zY3JvbGxCYXJUaGVtZTsKKyNlbmRp
ZgogfTsKIAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xs
QmFyV2luLmNwcAkocmV2aXNpb24gMzA0NTYpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vd2luL1Bs
YXRmb3JtU2Nyb2xsQmFyU2FmYXJpLmNwcDozMDQ1NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2lu
L1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY2MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmZGVmIFVTRV9TQUZBUklfVEhF
TUUgCisKKyNpbmNsdWRlICJQbGF0Zm9ybVNjcm9sbEJhci5oIgorCisjaW5jbHVkZSAiRXZlbnRI
YW5kbGVyLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVk
ZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiU29mdExpbmtpbmcuaCIKKworI2lu
Y2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxTYWZhcmlUaGVt
ZS9TYWZhcmlUaGVtZS5oPgorCisvLyBGSVhNRTogVGhlcmUgYXJlIHJlcGFpbnRpbmcgcHJvYmxl
bXMgZHVlIHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25zJyB2aXN1YWwgb3ZlcmZsb3cuCisKK3Vz
aW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNw
YWNlIFNhZmFyaVRoZW1lOworCisvLyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGVzZSBudW1iZXJz
IGZyb20gU2FmYXJpVGhlbWUKK3N0YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aFtdID0geyAxNSwg
MTEgfTsKK3N0YXRpYyBpbnQgY0hvcml6b250YWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0
aWMgaW50IGNWZXJ0aWNhbFdpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVmVydGlj
YWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNSZWFsQnV0dG9uTGVuZ3RoW10g
PSB7IDI4LCAyMSB9Oworc3RhdGljIGludCBjQnV0dG9uSW5zZXRbXSA9IHsgMTQsIDExIH07Citz
dGF0aWMgaW50IGNCdXR0b25IaXRJbnNldFtdID0geyAzLCAyIH07CisvLyBjUmVhbEJ1dHRvbkxl
bmd0aCAtIGNCdXR0b25JbnNldAorc3RhdGljIGludCBjQnV0dG9uTGVuZ3RoW10gPSB7IDE0LCAx
MCB9Oworc3RhdGljIGludCBjVGh1bWJXaWR0aFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQg
Y1RodW1iSGVpZ2h0W10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVGh1bWJNaW5MZW5ndGhb
XSA9IHsgMjYsIDIwIH07CisKKyNpZiAhZGVmaW5lZChOREVCVUcpICYmIGRlZmluZWQoVVNFX0RF
QlVHX1NBRkFSSV9USEVNRSkKK1NPRlRfTElOS19ERUJVR19MSUJSQVJZKFNhZmFyaVRoZW1lKQor
I2Vsc2UKK1NPRlRfTElOS19MSUJSQVJZKFNhZmFyaVRoZW1lKQorI2VuZGlmCisKK1NPRlRfTElO
SyhTYWZhcmlUaGVtZSwgcGFpbnRUaGVtZVBhcnQsIHZvaWQsIF9fc3RkY2FsbCwgKFRoZW1lUGFy
dCBwYXJ0LCBDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ0dSZWN0JiByZWN0LCBOU0NvbnRy
b2xTaXplIHNpemUsIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlKSwgKHBhcnQsIGNvbnRleHQsIHJl
Y3QsIHNpemUsIHN0YXRlKSkKKworY29uc3QgZG91YmxlIGNJbml0aWFsVGltZXJEZWxheSA9IDAu
MjU7Citjb25zdCBkb3VibGUgY05vcm1hbFRpbWVyRGVsYXkgPSAwLjA1OworCitQbGF0Zm9ybVNj
cm9sbGJhcjo6UGxhdGZvcm1TY3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsIFNjcm9s
bGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQor
ICAgIDogU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUpLCBtX2hvdmVyZWRQYXJ0
KE5vUGFydCksIG1fcHJlc3NlZFBhcnQoTm9QYXJ0KSwgbV9wcmVzc2VkUG9zKDApLAorICAgICAg
bV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZp
cmVkKSwKKyAgICAgIG1fb3ZlcmxhcHNSZXNpemVyKGZhbHNlKQoreworICAgIC8vIE9idGFpbiB0
aGUgY29ycmVjdCBzY3JvbGxiYXIgc2l6ZXMgZnJvbSB0aGUgc3lzdGVtLgorICAgIGlmICghY0hv
cml6b250YWxXaWR0aCkgeworICAgICAgICAvLyBGSVhNRTogR2V0IG1ldGljcyBmcm9tIFNhZmFy
aVRoZW1lCisgICAgfQorCisgICAgaWYgKG9yaWVudGF0aW9uID09IFZlcnRpY2FsU2Nyb2xsYmFy
KQorICAgICAgICBzZXRGcmFtZUdlb21ldHJ5KEludFJlY3QoMCwgMCwgY1ZlcnRpY2FsV2lkdGhb
Y29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbEhlaWdodFtjb250cm9sU2l6ZSgpXSkpOworICAgIGVs
c2UKKyAgICAgICAgc2V0RnJhbWVHZW9tZXRyeShJbnRSZWN0KDAsIDAsIGNIb3Jpem9udGFsV2lk
dGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKSk7Cit9
CisKK1BsYXRmb3JtU2Nyb2xsYmFyOjp+UGxhdGZvcm1TY3JvbGxiYXIoKQoreworICAgIHN0b3BU
aW1lcklmTmVlZGVkKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1i
UG9zaXRpb24oKQoreworICAgIGludmFsaWRhdGVUcmFjaygpOworfQorCit2b2lkIFBsYXRmb3Jt
U2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlByb3BvcnRpb24oKQoreworICAgIGludmFsaWRhdGVUcmFj
aygpOworfQorCitzdGF0aWMgSW50UmVjdCB0cmFja1JlcGFpbnRSZWN0KGNvbnN0IEludFJlY3Qm
IHRyYWNrUmVjdCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNv
bnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAgIEludFJlY3QgcGFpbnRSZWN0KHRyYWNrUmVj
dCk7CisgICAgaWYgKG9yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAg
IHBhaW50UmVjdC5pbmZsYXRlWChjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisgICAgZWxz
ZQorICAgICAgICBwYWludFJlY3QuaW5mbGF0ZVkoY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0p
OworCisgICAgcmV0dXJuIHBhaW50UmVjdDsKK30KKworc3RhdGljIEludFJlY3QgYnV0dG9uUmVw
YWludFJlY3QoY29uc3QgSW50UmVjdCYgYnV0dG9uUmVjdCwgU2Nyb2xsYmFyT3JpZW50YXRpb24g
b3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXplLCBib29sIHN0YXJ0
KQoreworICAgIEludFJlY3QgcGFpbnRSZWN0KGJ1dHRvblJlY3QpOworICAgIGlmIChvcmllbnRh
dGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIHBhaW50UmVjdC5zZXRXaWR0
aChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBpZiAoIXN0YXJ0KQor
ICAgICAgICAgICAgcGFpbnRSZWN0LnNldFgoYnV0dG9uUmVjdC54KCkgLSAoY1JlYWxCdXR0b25M
ZW5ndGhbY29udHJvbFNpemVdIC0gYnV0dG9uUmVjdC53aWR0aCgpKSk7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgcGFpbnRSZWN0LnNldEhlaWdodChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6
ZV0pOworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcGFpbnRSZWN0LnNldFkoYnV0
dG9uUmVjdC55KCkgLSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemVdIC0gYnV0dG9uUmVj
dC5oZWlnaHQoKSkpOworICAgIH0KKworICAgIHJldHVybiBwYWludFJlY3Q7Cit9CisKK3ZvaWQg
UGxhdGZvcm1TY3JvbGxiYXI6OmludmFsaWRhdGVUcmFjaygpCit7CisgICAgSW50UmVjdCByZWN0
ID0gdHJhY2tSZXBhaW50UmVjdCh0cmFja1JlY3QoKSwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNp
emUoKSk7CisgICAgcmVjdC5tb3ZlKC14KCksIC15KCkpOworICAgIGludmFsaWRhdGVSZWN0KHJl
Y3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjppbnZhbGlkYXRlUGFydChTY3JvbGxi
YXJQYXJ0IHBhcnQpCit7CisgICAgaWYgKHBhcnQgPT0gTm9QYXJ0KQorICAgICAgICByZXR1cm47
CisKKyAgICBJbnRSZWN0IHJlc3VsdDsgICAgCisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgICAg
IGNhc2UgQmFja0J1dHRvblBhcnQ6CisgICAgICAgICAgICByZXN1bHQgPSBidXR0b25SZXBhaW50
UmVjdChiYWNrQnV0dG9uUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpLCB0cnVl
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZvcndhcmRCdXR0b25QYXJ0Ogor
ICAgICAgICAgICAgcmVzdWx0ID0gYnV0dG9uUmVwYWludFJlY3QoZm9yd2FyZEJ1dHRvblJlY3Qo
KSwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwgZmFsc2UpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEludFJlY3QgYmVmb3JlVGh1bWJS
ZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICAgICAgc3BsaXRUcmFjayh0
cmFja1JlY3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsK
KyAgICAgICAgICAgIGlmIChwYXJ0ID09IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICAgICAg
cmVzdWx0ID0gYmVmb3JlVGh1bWJSZWN0OworICAgICAgICAgICAgZWxzZSBpZiAocGFydCA9PSBG
b3J3YXJkVHJhY2tQYXJ0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFmdGVyVGh1bWJSZWN0
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRodW1iUmVjdDsK
KyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnZh
bGlkYXRlUmVjdChyZXN1bHQpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OndpZHRoKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gV2lkZ2V0Ojp3aWR0aCgpOworfQorCitpbnQgUGxhdGZvcm1T
Y3JvbGxiYXI6OmhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdpZGdldDo6aGVpZ2h0KCk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNldFJlY3QoY29uc3QgSW50UmVjdCYgcmVj
dCkKK3sKKyAgICAvLyBHZXQgb3VyIHdpbmRvdyByZXNpemVyIHJlY3QgYW5kIHNlZSBpZiB3ZSBv
dmVybGFwLiAgQWRqdXN0IHRvIGF2b2lkIHRoZSBvdmVybGFwCisgICAgLy8gaWYgbmVjZXNzYXJ5
LgorICAgIEludFJlY3QgYWRqdXN0ZWRSZWN0KHJlY3QpOworICAgIGlmIChwYXJlbnQoKSAmJiBw
YXJlbnQoKS0+aXNGcmFtZVZpZXcoKSkgeworICAgICAgICBib29sIG92ZXJsYXBzUmVzaXplciA9
IGZhbHNlOworICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcq
PihwYXJlbnQoKSk7CisgICAgICAgIEludFJlY3QgcmVzaXplclJlY3QgPSB2aWV3LT53aW5kb3dS
ZXNpemVyUmVjdCgpOworICAgICAgICByZXNpemVyUmVjdC5zZXRMb2NhdGlvbih2aWV3LT5jb252
ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3cocmVzaXplclJlY3QubG9jYXRpb24oKSkpOworICAgICAg
ICBpZiAocmVjdC5pbnRlcnNlY3RzKHJlc2l6ZXJSZWN0KSkgeworICAgICAgICAgICAgaWYgKG9y
aWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICAgICAgICAgIGlu
dCBvdmVybGFwID0gcmVjdC5yaWdodCgpIC0gcmVzaXplclJlY3QueCgpOworICAgICAgICAgICAg
ICAgIGlmIChvdmVybGFwID4gMCAmJiByZXNpemVyUmVjdC5yaWdodCgpID49IHJlY3QucmlnaHQo
KSkgeworICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFJlY3Quc2V0V2lkdGgocmVjdC53aWR0
aCgpIC0gb3ZlcmxhcCk7CisgICAgICAgICAgICAgICAgICAgIG92ZXJsYXBzUmVzaXplciA9IHRy
dWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBpbnQgb3ZlcmxhcCA9IHJlY3QuYm90dG9tKCkgLSByZXNpemVyUmVjdC55KCk7CisgICAg
ICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIHJlc2l6ZXJSZWN0LmJvdHRvbSgpID49IHJl
Y3QuYm90dG9tKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRSZWN0LnNldEhlaWdo
dChyZWN0LmhlaWdodCgpIC0gb3ZlcmxhcCk7CisgICAgICAgICAgICAgICAgICAgIG92ZXJsYXBz
UmVzaXplciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgaWYgKG92ZXJsYXBzUmVzaXplciAhPSBtX292ZXJsYXBzUmVzaXplcikg
eworICAgICAgICAgICAgbV9vdmVybGFwc1Jlc2l6ZXIgPSBvdmVybGFwc1Jlc2l6ZXI7CisgICAg
ICAgICAgICB2aWV3LT5hZGp1c3RPdmVybGFwcGluZ1Njcm9sbGJhckNvdW50KG1fb3ZlcmxhcHNS
ZXNpemVyID8gMSA6IC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNldEZyYW1lR2VvbWV0
cnkoYWRqdXN0ZWRSZWN0KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c2V0UGFyZW50
KFNjcm9sbFZpZXcqIHBhcmVudFZpZXcpCit7CisgICAgaWYgKCFwYXJlbnRWaWV3ICYmIG1fb3Zl
cmxhcHNSZXNpemVyICYmIHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKQorICAg
ICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSktPmFkanVzdE92ZXJsYXBwaW5n
U2Nyb2xsYmFyQ291bnQoLTEpOworICAgIFdpZGdldDo6c2V0UGFyZW50KHBhcmVudFZpZXcpOwor
fQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sK
KyAgICBpZiAoZW5hYmxlZCAhPSBpc0VuYWJsZWQoKSkgeworICAgICAgICBXaWRnZXQ6OnNldEVu
YWJsZWQoZW5hYmxlZCk7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQg
UGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50KEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0
LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KQoreworICAgIGlmIChncmFwaGljc0NvbnRleHQt
PnVwZGF0aW5nQ29udHJvbFRpbnRzKCkpIHsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdyYXBoaWNzQ29udGV4dC0+cGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBEb24ndCBwYWludCBhbnl0aGluZyBp
ZiB0aGUgc2Nyb2xsYmFyIGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBkYW1hZ2UgcmVjdC4KKyAgICBp
ZiAoIWZyYW1lR2VvbWV0cnkoKS5pbnRlcnNlY3RzKGRhbWFnZVJlY3QpKQorICAgICAgICByZXR1
cm47CisKKyAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tSZWN0KCk7CisgICAgcGFpbnRUcmFjayhn
cmFwaGljc0NvbnRleHQsIHRyYWNrLCB0cnVlLCBkYW1hZ2VSZWN0KTsKKworICAgIGlmIChoYXNC
dXR0b25zKCkpIHsKKyAgICAgICAgcGFpbnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0LCBiYWNrQnV0
dG9uUmVjdCgpLCB0cnVlLCBkYW1hZ2VSZWN0KTsKKyAgICAgICAgcGFpbnRCdXR0b24oZ3JhcGhp
Y3NDb250ZXh0LCBmb3J3YXJkQnV0dG9uUmVjdCgpLCBmYWxzZSwgZGFtYWdlUmVjdCk7CisgICAg
fQorCisgICAgaWYgKGhhc1RodW1iKCkgJiYgZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHRyYWNrKSkg
eworICAgICAgICBJbnRSZWN0IHN0YXJ0VHJhY2tSZWN0LCB0aHVtYlJlY3QsIGVuZFRyYWNrUmVj
dDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywgc3RhcnRUcmFja1JlY3QsIHRodW1iUmVjdCwg
ZW5kVHJhY2tSZWN0KTsKKyAgICAgICAgcGFpbnRUaHVtYihncmFwaGljc0NvbnRleHQsIHRodW1i
UmVjdCwgZGFtYWdlUmVjdCk7CisgICAgfQorfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpo
YXNCdXR0b25zKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYgKG1fb3JpZW50
YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IHdpZHRoKCkgOiBoZWlnaHQoKSkgPj0gMiAq
IChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSAtIGNCdXR0b25IaXRJbnNldFtjb250
cm9sU2l6ZSgpXSk7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6Omhhc1RodW1iKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpv
bnRhbFNjcm9sbGJhciA/IHdpZHRoKCkgOiBoZWlnaHQoKSkgPj0gMiAqIGNCdXR0b25JbnNldFtj
b250cm9sU2l6ZSgpXSArIGNUaHVtYk1pbkxlbmd0aFtjb250cm9sU2l6ZSgpXSArIDE7Cit9CisK
K0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmJhY2tCdXR0b25SZWN0KCkgY29uc3QKK3sKKyAg
ICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2VudGlhbGx5IDE3eDE3LgorICAgIAorICAgIC8v
IE91ciBhY3R1YWwgcmVjdCB3aWxsIHNocmluayB0byBoYWxmIHRoZSBhdmFpbGFibGUgc3BhY2Ug
d2hlbgorICAgIC8vIHdlIGhhdmUgPCAzNCBwaXhlbHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRoZSBz
Y3JvbGxiYXIKKyAgICAvLyB0byBzY2FsZSBkb3duIGFuZCBmdW5jdGlvbiBldmVuIGF0IHRpbnkg
c2l6ZXMuCisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAg
ICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUo
KV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICByZXR1cm4gSW50UmVj
dCh4KCksIHkoKSwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGNCdXR0b25MZW5ndGhb
Y29udHJvbFNpemUoKV0pOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpmb3J3YXJk
QnV0dG9uUmVjdCgpIGNvbnN0Cit7CisgICAgLy8gT3VyIGRlc2lyZWQgcmVjdCBpcyBlc3NlbnRp
YWxseSAxN3gxNy4KKyAgICAKKyAgICAvLyBPdXIgYWN0dWFsIHJlY3Qgd2lsbCBzaHJpbmsgdG8g
aGFsZiB0aGUgYXZhaWxhYmxlIHNwYWNlIHdoZW4KKyAgICAvLyB3ZSBoYXZlIDwgMzQgcGl4ZWxz
IGxlZnQuICBUaGlzIGFsbG93cyB0aGUgc2Nyb2xsYmFyCisgICAgLy8gdG8gc2NhbGUgZG93biBh
bmQgZnVuY3Rpb24gZXZlbiBhdCB0aW55IHNpemVzLgorCisgICAgaWYgKG1fb3JpZW50YXRpb24g
PT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpICsgd2lk
dGgoKSAtIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIHkoKSwgY0J1dHRvbkxlbmd0aFtj
b250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAgIHJl
dHVybiBJbnRSZWN0KHgoKSwgeSgpICsgaGVpZ2h0KCkgLSBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xT
aXplKCldLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0J1dHRvbkxlbmd0aFtjb250
cm9sU2l6ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrUmVjdCgp
IGNvbnN0Cit7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikg
eworICAgICAgICBpZiAoIWhhc0J1dHRvbnMoKSkKKyAgICAgICAgICAgIHJldHVybiBJbnRSZWN0
KHgoKSwgeSgpLCB3aWR0aCgpLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7Cisg
ICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSArIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0s
IHkoKSwgd2lkdGgoKSAtIDIgKiBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpv
bnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgfQorCisgICAgaWYgKCFoYXNCdXR0b25z
KCkpCisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCBjVmVydGljYWxXaWR0aFtjb250
cm9sU2l6ZSgpXSwgaGVpZ2h0KCkpOworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpICsgY0J1
dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0s
IGhlaWdodCgpIC0gMiAqIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0pOworfQorCitJbnRS
ZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlJlY3QoKSBjb25zdAoreworICAgIEludFJlY3Qg
YmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgIHNwbGl0VHJh
Y2sodHJhY2tSZWN0KCksIGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVj
dCk7CisgICAgcmV0dXJuIHRodW1iUmVjdDsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6
c3BsaXRUcmFjayhjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIEludFJlY3QmIGJlZm9yZVRodW1i
UmVjdCwgSW50UmVjdCYgdGh1bWJSZWN0LCBJbnRSZWN0JiBhZnRlclRodW1iUmVjdCkgY29uc3QK
K3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHdvbid0IGV2ZW4gZ2V0IGNhbGxlZCB1bmxlc3Mgd2Un
cmUgYmlnIGVub3VnaCB0byBoYXZlIHNvbWUgY29tYmluYXRpb24gb2YgdGhlc2UgdGhyZWUgcmVj
dHMgd2hlcmUgYXQgbGVhc3QKKyAgICAvLyBvbmUgb2YgdGhlbSBpcyBub24tZW1wdHkuCisgICAg
aW50IHRodW1iUG9zID0gdGh1bWJQb3NpdGlvbigpOworICAgIGlmIChtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgdGh1bWJSZWN0ID0gSW50UmVjdCh0cmFj
a1JlY3QueCgpICsgdGh1bWJQb3MsIHRyYWNrUmVjdC55KCkgKyAodHJhY2tSZWN0LmhlaWdodCgp
IC0gY1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCldKSAvIDIsIHRodW1iTGVuZ3RoKCksIGNUaHVt
YkhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgICAgIGJlZm9yZVRodW1iUmVjdCA9IEludFJl
Y3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSwgdGh1bWJQb3MsIHRyYWNrUmVjdC5oZWln
aHQoKSk7CisgICAgICAgIGFmdGVyVGh1bWJSZWN0ID0gSW50UmVjdCh0aHVtYlJlY3QueCgpICsg
dGh1bWJSZWN0LndpZHRoKCksIHRyYWNrUmVjdC55KCksIHRyYWNrUmVjdC5yaWdodCgpIC0gdGh1
bWJSZWN0LnJpZ2h0KCksIHRyYWNrUmVjdC5oZWlnaHQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgdGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpICsgKHRyYWNrUmVjdC53aWR0aCgp
IC0gY1RodW1iV2lkdGhbY29udHJvbFNpemUoKV0pIC8gMiwgdHJhY2tSZWN0LnkoKSArIHRodW1i
UG9zLCBjVGh1bWJXaWR0aFtjb250cm9sU2l6ZSgpXSwgdGh1bWJMZW5ndGgoKSk7CisgICAgICAg
IGJlZm9yZVRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSwg
dHJhY2tSZWN0LndpZHRoKCksIHRodW1iUG9zKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJ
bnRSZWN0KHRyYWNrUmVjdC54KCksIHRodW1iUmVjdC55KCkgKyB0aHVtYlJlY3QuaGVpZ2h0KCks
IHRyYWNrUmVjdC53aWR0aCgpLCB0cmFja1JlY3QuYm90dG9tKCkgLSB0aHVtYlJlY3QuYm90dG9t
KCkpOworICAgIH0KK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlBvc2l0aW9uKCkg
Y29uc3QKK3sKKyAgICBpZiAoaXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybiAoZmxvYXQpbV9j
dXJyZW50UG9zICogKHRyYWNrTGVuZ3RoKCkgLSB0aHVtYkxlbmd0aCgpKSAvIChtX3RvdGFsU2l6
ZSAtIG1fdmlzaWJsZVNpemUpOworICAgIHJldHVybiAwOworfQorCitpbnQgUGxhdGZvcm1TY3Jv
bGxiYXI6OnRodW1iTGVuZ3RoKCkgY29uc3QKK3sKKyAgICBpZiAoIWlzRW5hYmxlZCgpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIGZsb2F0IHByb3BvcnRpb24gPSAoZmxvYXQpKG1fdmlzaWJs
ZVNpemUpIC8gbV90b3RhbFNpemU7CisgICAgaW50IHRyYWNrTGVuID0gdHJhY2tMZW5ndGgoKTsK
KyAgICBpbnQgbGVuZ3RoID0gcHJvcG9ydGlvbiAqIHRyYWNrTGVuOworICAgIGludCBtaW5MZW5n
dGggPSBjVGh1bWJNaW5MZW5ndGhbY29udHJvbFNpemUoKV07CisgICAgbGVuZ3RoID0gbWF4KGxl
bmd0aCwgbWluTGVuZ3RoKTsKKyAgICBpZiAobGVuZ3RoID4gdHJhY2tMZW4pCisgICAgICAgIGxl
bmd0aCA9IDA7IC8vIE9uY2UgdGhlIHRodW1iIGlzIGJlbG93IHRoZSB0cmFjayBsZW5ndGgsIGl0
IGp1c3QgZ29lcyBhd2F5ICh0byBtYWtlIG1vcmUgcm9vbSBmb3IgdGhlIHRyYWNrKS4KKyAgICBy
ZXR1cm4gbGVuZ3RoOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrTGVuZ3RoKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJh
cikgPyB0cmFja1JlY3QoKS53aWR0aCgpIDogdHJhY2tSZWN0KCkuaGVpZ2h0KCk7Cit9CisKK3Zv
aWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdl
UmVjdCkgY29uc3QKK3sKKyAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGJ1dHRvblJlcGFpbnRSZWN0KHJlY3Qs
IG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHN0YXJ0KTsKKyAgICAKKyAgICBpZiAoIWRh
bWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBU
aGVtZVBhcnQgcGFydDsKKyAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgaWYg
KG1fY2xpZW50LT5pc0FjdGl2ZSgpKQorICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAg
ICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICBwYXJ0
ID0gc3RhcnQgPyBTY3JvbGxMZWZ0QXJyb3dQYXJ0IDogU2Nyb2xsUmlnaHRBcnJvd1BhcnQ7Cisg
ICAgZWxzZQorICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxVcEFycm93UGFydCA6IFNjcm9s
bERvd25BcnJvd1BhcnQ7CisKKyAgICBpZiAoaXNFbmFibGVkKCkpCisgICAgICAgIHN0YXRlIHw9
IEVuYWJsZWRTdGF0ZTsKKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQg
JiYgc3RhcnQpCisgICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0b25QYXJ0
ICYmICFzdGFydCkpCisgICAgICAgIHN0YXRlIHw9IFByZXNzZWRTdGF0ZTsKKworICAgIHBhaW50
VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNv
bnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1Jl
Z3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpw
YWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwg
Ym9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3QKK3sKKyAgICBpZiAo
IVNhZmFyaVRoZW1lTGlicmFyeSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHBh
aW50UmVjdCA9IGhhc0J1dHRvbnMoKSA/IHRyYWNrUmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRh
dGlvbiwgY29udHJvbFNpemUoKSkgOiByZWN0OworICAgIAorICAgIGlmICghZGFtYWdlUmVjdC5p
bnRlcnNlY3RzKHBhaW50UmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFRoZW1lUGFydCBw
YXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gSFNjcm9sbFRyYWNr
UGFydCA6IFZTY3JvbGxUcmFja1BhcnQ7CisgICAgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUgPSAw
OworICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICAgICAgc3RhdGUgfD0gQWN0aXZl
U3RhdGU7CisgICAgaWYgKGhhc0J1dHRvbnMoKSkKKyAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0
YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxD
b250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1TY3JvbGxiYXI6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25z
dCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAg
IGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICgh
ZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBUaGVt
ZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IEhTY3Jv
bGxUaHVtYlBhcnQgOiBWU2Nyb2xsVGh1bWJQYXJ0OworICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0
YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAgICAgIHN0YXRlIHw9
IEFjdGl2ZVN0YXRlOworICAgIGlmIChpc0VuYWJsZWQoKSkKKyAgICAgICAgc3RhdGUgfD0gRW5h
YmxlZFN0YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1D
b250ZXh0KCksIHJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxs
Q29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworfQorCitTY3JvbGxi
YXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYgZXZ0KQoreworICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybiBOb1BhcnQ7
CisKKyAgICBJbnRQb2ludCBtb3VzZVBvc2l0aW9uID0gY29udmVydEZyb21Db250YWluaW5nV2lu
ZG93KGV2dC5wb3MoKSk7CisgICAgbW91c2VQb3NpdGlvbi5tb3ZlKHgoKSwgeSgpKTsKKworICAg
IGlmIChoYXNCdXR0b25zKCkpIHsKKyAgICAgICAgaWYgKGJhY2tCdXR0b25SZWN0KCkuY29udGFp
bnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4gQmFja0J1dHRvblBhcnQ7CisK
KyAgICAgICAgaWYgKGZvcndhcmRCdXR0b25SZWN0KCkuY29udGFpbnMobW91c2VQb3NpdGlvbikp
CisgICAgICAgICAgICByZXR1cm4gRm9yd2FyZEJ1dHRvblBhcnQ7CisgICAgfQorCisgICAgaWYg
KCFoYXNUaHVtYigpKQorICAgICAgICByZXR1cm4gTm9QYXJ0OworCisgICAgSW50UmVjdCB0cmFj
ayA9IHRyYWNrUmVjdCgpOworICAgIGlmICh0cmFjay5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkg
eworICAgICAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1i
UmVjdDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJl
Y3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICAgICAgaWYgKGJlZm9yZVRodW1iUmVjdC5jb250YWlu
cyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBCYWNrVHJhY2tQYXJ0OworICAg
ICAgICBpZiAodGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAgICAg
cmV0dXJuIFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuIEZvcndhcmRUcmFja1BhcnQ7CisgICAg
fQorICAgIHJldHVybiBOb1BhcnQ7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRs
ZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIGlm
IChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkgeworICAgICAgICAvLyBEcmFnIHRoZSB0aHVt
Yi4KKyAgICAgICAgaW50IHRodW1iUG9zID0gdGh1bWJQb3NpdGlvbigpOworICAgICAgICBpbnQg
dGh1bWJMZW4gPSB0aHVtYkxlbmd0aCgpOworICAgICAgICBpbnQgdHJhY2tMZW4gPSB0cmFja0xl
bmd0aCgpOworICAgICAgICBpbnQgbWF4UG9zID0gdHJhY2tMZW4gLSB0aHVtYkxlbjsKKyAgICAg
ICAgaW50IGRlbHRhID0gMDsKKyAgICAgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRh
bFNjcm9sbGJhcikKKyAgICAgICAgICAgIGRlbHRhID0gY29udmVydEZyb21Db250YWluaW5nV2lu
ZG93KGV2dC5wb3MoKSkueCgpIC0gbV9wcmVzc2VkUG9zOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBkZWx0YSA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLnkoKSAt
IG1fcHJlc3NlZFBvczsKKworICAgICAgICBpZiAoZGVsdGEgPiAwKQorICAgICAgICAgICAgLy8g
VGhlIG1vdXNlIG1vdmVkIGRvd24vcmlnaHQuCisgICAgICAgICAgICBkZWx0YSA9IG1pbihtYXhQ
b3MgLSB0aHVtYlBvcywgZGVsdGEpOworICAgICAgICBlbHNlIGlmIChkZWx0YSA8IDApCisgICAg
ICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgdXAvbGVmdC4KKyAgICAgICAgICAgIGRlbHRhID0g
bWF4KC10aHVtYlBvcywgZGVsdGEpOworCisgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7CisgICAg
ICAgICAgICBzZXRWYWx1ZSgoZmxvYXQpKHRodW1iUG9zICsgZGVsdGEpICogKG1fdG90YWxTaXpl
IC0gbV92aXNpYmxlU2l6ZSkgLyAodHJhY2tMZW4gLSB0aHVtYkxlbikpOworICAgICAgICAgICAg
bV9wcmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24oKSAtIHRodW1iUG9zOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9wcmVzc2Vk
UGFydCAhPSBOb1BhcnQpCisgICAgICAgIG1fcHJlc3NlZFBvcyA9IChtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIgPyBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBv
cygpKS54KCkgOiBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS55KCkpOwor
CisgICAgU2Nyb2xsYmFyUGFydCBwYXJ0ID0gaGl0VGVzdChldnQpOyAgICAKKyAgICBpZiAocGFy
dCAhPSBtX2hvdmVyZWRQYXJ0KSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFy
dCkgeworICAgICAgICAgICAgaWYgKHBhcnQgPT0gbV9wcmVzc2VkUGFydCkgeworICAgICAgICAg
ICAgICAgIC8vIFRoZSBtb3VzZSBpcyBtb3ZpbmcgYmFjayBvdmVyIHRoZSBwcmVzc2VkIHBhcnQu
ICBXZQorICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc3RhcnQgdXAgdGhlIHRpbWVyIGFjdGlv
biBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBzdGFydFRpbWVySWZOZWVkZWQoY05vcm1hbFRpbWVy
RGVsYXkpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOwor
ICAgICAgICAgICAgfSBlbHNlIGlmIChtX2hvdmVyZWRQYXJ0ID09IG1fcHJlc3NlZFBhcnQpIHsK
KyAgICAgICAgICAgICAgICAvLyBUaGUgbW91c2UgaXMgbGVhdmluZyB0aGUgcHJlc3NlZCBwYXJ0
LiAgS2lsbCBvdXIgdGltZXIKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWVkZWQuCisgICAgICAg
ICAgICAgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRl
UGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIGludmFsaWRhdGVQYXJ0KHBhcnQpOworICAgICAgICAgICAgaW52YWxpZGF0ZVBh
cnQobV9ob3ZlcmVkUGFydCk7CisgICAgICAgIH0KKyAgICAgICAgbV9ob3ZlcmVkUGFydCA9IHBh
cnQ7CisgICAgfSAKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xs
YmFyOjpoYW5kbGVNb3VzZU91dEV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQor
eworICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAgIG1faG92ZXJlZFBhcnQg
PSBOb1BhcnQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJh
cjo6aGFuZGxlTW91c2VQcmVzc0V2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQor
eworICAgIG1fcHJlc3NlZFBhcnQgPSBoaXRUZXN0KGV2dCk7CisgICAgbV9wcmVzc2VkUG9zID0g
KG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNvbnZlcnRGcm9tQ29udGFp
bmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhl
dnQucG9zKCkpLnkoKSk7CisgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAg
YXV0b3Njcm9sbFByZXNzZWRQYXJ0KGNJbml0aWFsVGltZXJEZWxheSk7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50
KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIGludmFsaWRhdGVQYXJ0KG1f
cHJlc3NlZFBhcnQpOworICAgIG1fcHJlc3NlZFBhcnQgPSBOb1BhcnQ7CisgICAgbV9wcmVzc2Vk
UG9zID0gMDsKKyAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworCisgICAgaWYgKHBhcmVudCgpICYm
IHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKQorICAgICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcq
PihwYXJlbnQoKSktPmZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zZXRNb3VzZVByZXNzZWQoZmFs
c2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnN0
YXJ0VGltZXJJZk5lZWRlZChkb3VibGUgZGVsYXkpCit7CisgICAgLy8gRG9uJ3QgZG8gYW55dGhp
bmcgZm9yIHRoZSB0aHVtYi4KKyAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBUaHVtYlBhcnQpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIEhhbmRsZSB0aGUgdHJhY2suICBXZSBoYWx0IHRyYWNr
IHNjcm9sbGluZyBvbmNlIHRoZSB0aHVtYiBpcyBsZXZlbAorICAgIC8vIHdpdGggdXMuCisgICAg
aWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBG
b3J3YXJkVHJhY2tQYXJ0KSAmJiB0aHVtYlVuZGVyTW91c2UoKSkgeworICAgICAgICBpbnZhbGlk
YXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgbV9ob3ZlcmVkUGFydCA9IFRodW1iUGFy
dDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGNhbid0IHNjcm9sbCBpZiB3
ZSd2ZSBoaXQgdGhlIGJlZ2lubmluZyBvciBlbmQuCisgICAgU2Nyb2xsRGlyZWN0aW9uIGRpciA9
IHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCk7CisgICAgaWYgKGRpciA9PSBTY3JvbGxVcCB8
fCBkaXIgPT0gU2Nyb2xsTGVmdCkgeworICAgICAgICBpZiAobV9jdXJyZW50UG9zID09IDApCisg
ICAgICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1fY3VycmVudFBv
cyA9PSBtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpCisgICAgICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgbV9zY3JvbGxUaW1lci5zdGFydE9uZVNob3QoZGVsYXkpOworfQorCit2b2lk
IFBsYXRmb3JtU2Nyb2xsYmFyOjpzdG9wVGltZXJJZk5lZWRlZCgpCit7CisgICAgaWYgKG1fc2Ny
b2xsVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9zY3JvbGxUaW1lci5zdG9wKCk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxQcmVzc2VkUGFydChkb3VibGUgZGVs
YXkpCit7CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0aHVtYiBvciBpZiBub3Ro
aW5nIHdhcyBwcmVzc2VkLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCB8fCBt
X3ByZXNzZWRQYXJ0ID09IE5vUGFydCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSGFuZGxl
IHRoZSB0cmFjay4KKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCB8fCBt
X3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpICYmIHRodW1iVW5kZXJNb3VzZSgpKSB7
CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICBtX2hvdmVy
ZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSGFu
ZGxlIHRoZSBhcnJvd3MgYW5kIHRyYWNrLgorICAgIGlmIChzY3JvbGwocHJlc3NlZFBhcnRTY3Jv
bGxEaXJlY3Rpb24oKSwgcHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0eSgpKSkKKyAgICAgICAg
c3RhcnRUaW1lcklmTmVlZGVkKGRlbGF5KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6
YXV0b3Njcm9sbFRpbWVyRmlyZWQoVGltZXI8UGxhdGZvcm1TY3JvbGxiYXI+KikKK3sKKyAgICBh
dXRvc2Nyb2xsUHJlc3NlZFBhcnQoY05vcm1hbFRpbWVyRGVsYXkpOworfQorCitTY3JvbGxEaXJl
Y3Rpb24gUGxhdGZvcm1TY3JvbGxiYXI6OnByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCkKK3sK
KyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAg
IGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0g
QmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgIHJldHVybiBTY3JvbGxMZWZ0OworICAgICAgICBy
ZXR1cm4gU2Nyb2xsUmlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1fcHJlc3NlZFBh
cnQgPT0gQmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0KQor
ICAgICAgICAgICAgcmV0dXJuIFNjcm9sbFVwOworICAgICAgICByZXR1cm4gU2Nyb2xsRG93bjsK
KyAgICB9Cit9CisKK1Njcm9sbEdyYW51bGFyaXR5IFBsYXRmb3JtU2Nyb2xsYmFyOjpwcmVzc2Vk
UGFydFNjcm9sbEdyYW51bGFyaXR5KCkKK3sKKyAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNr
QnV0dG9uUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0b25QYXJ0KQorICAgICAg
ICByZXR1cm4gU2Nyb2xsQnlMaW5lOworICAgIHJldHVybiBTY3JvbGxCeVBhZ2U7Cit9CisKK2Jv
b2wgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iVW5kZXJNb3VzZSgpCit7CisgICAgLy8gQ29uc3Ry
dWN0IGEgcmVjdC4KKyAgICBJbnRSZWN0IHRodW1iID0gdGh1bWJSZWN0KCk7CisgICAgdGh1bWIu
bW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnQgYmVnaW4gPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLngoKSA6IHRodW1iLnkoKTsKKyAgICBpbnQgZW5kID0g
KG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0aHVtYi5yaWdodCgpIDog
dGh1bWIuYm90dG9tKCk7CisgICAgcmV0dXJuIChiZWdpbiA8PSBtX3ByZXNzZWRQb3MgJiYgbV9w
cmVzc2VkUG9zIDwgZW5kKTsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjpob3Jpem9udGFs
U2Nyb2xsYmFySGVpZ2h0KFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAg
IHJldHVybiBjSG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplXTsKK30KKworaW50IFBsYXRmb3Jt
U2Nyb2xsYmFyOjp2ZXJ0aWNhbFNjcm9sbGJhcldpZHRoKFNjcm9sbGJhckNvbnRyb2xTaXplIGNv
bnRyb2xTaXplKQoreworICAgIHJldHVybiBjVmVydGljYWxIZWlnaHRbY29udHJvbFNpemVdOwor
fQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp3aW5kb3dDbGlwUmVjdCgpIGNvbnN0Cit7
CisgICAgSW50UmVjdCBjbGlwUmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSk7CisgICAgY2xp
cFJlY3QgPSBjb252ZXJ0VG9Db250YWluaW5nV2luZG93KGNsaXBSZWN0KTsKKyAgICBpZiAobV9j
bGllbnQpCisgICAgICAgIGNsaXBSZWN0LmludGVyc2VjdChtX2NsaWVudC0+d2luZG93Q2xpcFJl
Y3QoKSk7CisgICAgcmV0dXJuIGNsaXBSZWN0OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
OjpwYWludEdyaXBwZXIoSERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKK30K
KworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6Z3JpcHBlclJlY3QoY29uc3QgSW50UmVjdCYg
dGh1bWJSZWN0KSBjb25zdAoreworICAgIHJldHVybiBJbnRSZWN0KCk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1TY3JvbGxiYXI6OnRoZW1lQ2hhbmdlZCgpCit7Cit9CisKK30KKworI2VuZGlmIC8vIGRl
ZmluZWQoVVNFX1NBRkFSSV9USEVNRSkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRm
b3JtU2Nyb2xsQmFyV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Q
bGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHJldmlzaW9uIDMwNDU2KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEJyZW50IEZ1bGdoYW0KICAqCiAgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjUsOCArMjYsNiBAQAogCiAjaW5jbHVkZSAiY29u
ZmlnLmgiCiAKLSNpZmRlZiBVU0VfU0FGQVJJX1RIRU1FIAotCiAjaW5jbHVkZSAiUGxhdGZvcm1T
Y3JvbGxCYXIuaCIKIAogI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgpAQCAtMzcsMTcgKzM2LDQw
IEBACiAjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCiAjaW5jbHVkZSAiU29mdExpbmtp
bmcuaCIKIAotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KLSNpbmNsdWRl
IDxTYWZhcmlUaGVtZS9TYWZhcmlUaGVtZS5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNs
dWRlICJSZW5kZXJUaGVtZVdpbi5oIgogCi0vLyBGSVhNRTogVGhlcmUgYXJlIHJlcGFpbnRpbmcg
cHJvYmxlbXMgZHVlIHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25zJyB2aXN1YWwgb3ZlcmZsb3cu
CisvLyBHZW5lcmljIHN0YXRlIGNvbnN0YW50cworI2RlZmluZSBUU19OT1JNQUwgICAgMQorI2Rl
ZmluZSBUU19IT1ZFUiAgICAgMgorI2RlZmluZSBUU19BQ1RJVkUgICAgMworI2RlZmluZSBUU19E
SVNBQkxFRCAgNAorI2RlZmluZSBUU19GT0NVU0VEICAgNQorCisjZGVmaW5lIEFCU19VUE5PUk1B
TCAxCisjZGVmaW5lIEFCU19ET1dOTk9STUFMIDUKKyNkZWZpbmUgQUJTX0xFRlROT1JNQUwgOQor
I2RlZmluZSBBQlNfUklHSFROT1JNQUwgMTMKKworY29uc3QgdW5zaWduZWQgU1BfQUJTX0hPVF9N
T0RJRklFUiA9IDE7Citjb25zdCB1bnNpZ25lZCBTUF9BQlNfUFJFU1NFRF9NT0RJRklFUiA9IDI7
Citjb25zdCB1bnNpZ25lZCBTUF9BQlNfRElTQUJMRV9NT0RJRklFUiA9IDM7CisKKy8vIFNjcm9s
bGJhciBjb25zdGFudHMKKyNkZWZpbmUgU1BfQlVUVE9OIDEKKyNkZWZpbmUgU1BfVEhVTUJIT1Ig
MgorI2RlZmluZSBTUF9USFVNQlZFUlQgMworI2RlZmluZSBTUF9UUkFDS1NUQVJUSE9SIDQKKyNk
ZWZpbmUgU1BfVFJBQ0tFTkRIT1IgNQorI2RlZmluZSBTUF9UUkFDS1NUQVJUVkVSVCA2CisjZGVm
aW5lIFNQX1RSQUNLRU5EVkVSVCA3CisjZGVmaW5lIFNQX0dSSVBQRVJIT1IgOAorI2RlZmluZSBT
UF9HUklQUEVSVkVSVCA5CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIFNhZmFyaVRoZW1lOwotCiAvLyBGSVhNRTogV2Ugc2hv
dWxkIGdldCB0aGVzZSBudW1iZXJzIGZyb20gU2FmYXJpVGhlbWUKIHN0YXRpYyBpbnQgY0hvcml6
b250YWxXaWR0aFtdID0geyAxNSwgMTEgfTsKIHN0YXRpYyBpbnQgY0hvcml6b250YWxIZWlnaHRb
XSA9IHsgMTUsIDExIH07CkBAIC02MiwyMiArODQsNzggQEAgc3RhdGljIGludCBjVGh1bWJXaWR0
aFtdID0geyAxNSwgMTEgfTsKIHN0YXRpYyBpbnQgY1RodW1iSGVpZ2h0W10gPSB7IDE1LCAxMSB9
Owogc3RhdGljIGludCBjVGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIwIH07CiAKLSNpZiAhZGVm
aW5lZChOREVCVUcpICYmIGRlZmluZWQoVVNFX0RFQlVHX1NBRkFSSV9USEVNRSkKLVNPRlRfTElO
S19ERUJVR19MSUJSQVJZKFNhZmFyaVRoZW1lKQotI2Vsc2UKLVNPRlRfTElOS19MSUJSQVJZKFNh
ZmFyaVRoZW1lKQotI2VuZGlmCiAKLVNPRlRfTElOSyhTYWZhcmlUaGVtZSwgcGFpbnRUaGVtZVBh
cnQsIHZvaWQsIF9fc3RkY2FsbCwgKFRoZW1lUGFydCBwYXJ0LCBDR0NvbnRleHRSZWYgY29udGV4
dCwgY29uc3QgQ0dSZWN0JiByZWN0LCBOU0NvbnRyb2xTaXplIHNpemUsIFRoZW1lQ29udHJvbFN0
YXRlIHN0YXRlKSwgKHBhcnQsIGNvbnRleHQsIHJlY3QsIHNpemUsIHN0YXRlKSkKKy8vIE5vdGU6
ICBDb3BpZWQgZnJvbSBSZW5kZXJUaGVtZVdpbi4gIFRoZXJlIHNob3VsZCBiZSBzb21lIHdheSB0
byBiZXR0ZXIKKy8vIGVuY2Fwc3VsYXRlL3NoYXJlIHRoaXMgc3R1ZmYuICBTZWUgYWxsIFJlbmRl
clRoZW1lU2FmYXJpIGZvciBtb3JlIHN1Y2ggc3R1ZmYuLi4KKy8vCisvLyBBZnRlciBkaXNjdXNz
aW9uIHdpdGggQWRhbSBSb2Jlbiwgd2Ugd2lsbCBtYWtlIHRoZSB1Z2x5IGNob2ljZSBvZiBjb3B5
aW5nIGxvZ2ljCisvLyBmcm9tIFJlbmRlclRoZW1lV2luIHVudGlsIHRoZSBUaGVtZSBsb2dpYyBp
cyByZWZhY3RvcmVkCit0eXBlZGVmIEhBTkRMRSAoV0lOQVBJKm9wZW5UaGVtZURhdGFQdHIpKEhX
TkQgaHduZCwgTFBDV1NUUiBwc3pDbGFzc0xpc3QpOwordHlwZWRlZiBIUkVTVUxUIChXSU5BUEkq
Y2xvc2VUaGVtZURhdGFQdHIpKEhBTkRMRSBoVGhlbWUpOwordHlwZWRlZiBIUkVTVUxUIChXSU5B
UEkqZHJhd1RoZW1lQmFja2dyb3VuZFB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQ
YXJ0SWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlT
dGF0ZUlkLCBjb25zdCBSRUNUICpwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IFJFQ1QqIHBDbGlwUmVjdCk7Cit0eXBlZGVmIEhSRVNVTFQgKFdJ
TkFQSSpkcmF3VGhlbWVFZGdlUHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJ
ZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRl
SWQsIGNvbnN0IFJFQ1QgKnBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdW5zaWduZWQgdUVkZ2UsIHVuc2lnbmVkIHVGbGFncywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFQ1QqIHBDbGlwUmVjdCk7Cit0eXBl
ZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVtZUNvbnRlbnRSZWN0UHRyKShIQU5ETEUgaFRoZW1l
LCBIREMgaGRjLCBpbnQgaVBhcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCogcFJlY3QsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNUKiBwQ29udGVudFJlY3QpOwordHlwZWRl
ZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVQYXJ0U2l6ZVB0cikoSEFORExFIGhUaGVtZSwgSERD
IGhkYywgaW50IGlQYXJ0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpbnQgaVN0YXRlSWQsIFJFQ1QqIHByYywgaW50IHRzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgU0laRSogcHN6KTsKK3R5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdl
dFRoZW1lU3lzRm9udFB0cikoSEFORExFIGhUaGVtZSwgaW50IGlGb250SWQsIE9VVCBMT0dGT05U
KiBwRm9udCk7Cit0eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVtZUNvbG9yUHRyKShIQU5E
TEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBpbnQgaVByb3BJZCwgT1VUIENPTE9SUkVGKiBwRm9u
dCk7CisKK3N0YXRpYyBvcGVuVGhlbWVEYXRhUHRyIG9wZW5UaGVtZSA9IDA7CitzdGF0aWMgY2xv
c2VUaGVtZURhdGFQdHIgY2xvc2VUaGVtZSA9IDA7CitzdGF0aWMgZHJhd1RoZW1lQmFja2dyb3Vu
ZFB0ciBkcmF3VGhlbWVCRyA9IDA7CitzdGF0aWMgZHJhd1RoZW1lRWRnZVB0ciBkcmF3VGhlbWVF
ZGdlID0gMDsKK3N0YXRpYyBnZXRUaGVtZUNvbnRlbnRSZWN0UHRyIGdldFRoZW1lQ29udGVudFJl
Y3QgPSAwOworc3RhdGljIGdldFRoZW1lUGFydFNpemVQdHIgZ2V0VGhlbWVQYXJ0U2l6ZSA9IDA7
CitzdGF0aWMgZ2V0VGhlbWVTeXNGb250UHRyIGdldFRoZW1lU3lzRm9udCA9IDA7CitzdGF0aWMg
Z2V0VGhlbWVDb2xvclB0ciBnZXRUaGVtZUNvbG9yID0gMDsKKworLy8gTWF5IG5lZWQgdG8gYWRk
IHN0dWZmIHRvIHRoZXNlIGxhdGVyLCBzbyBrZWVwIHRoZSBncmFwaGljcyBjb250ZXh0IHJldHJp
ZXZhbC9yZWxlYXNlIGluIHNvbWUgaGVscGVycy4KK3N0YXRpYyBIREMgcHJlcGFyZUZvckRyYXdp
bmcoR3JhcGhpY3NDb250ZXh0KiBnLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIHJldHVybiBn
LT5nZXRXaW5kb3dzQ29udGV4dChyKTsKK30KKyAKK3N0YXRpYyB2b2lkIGRvbmVEcmF3aW5nKEdy
YXBoaWNzQ29udGV4dCogZywgSERDIGhkYywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBnLT5y
ZWxlYXNlV2luZG93c0NvbnRleHQoaGRjLCByKTsKK30KKy8vIEVuZCBDb3BpZWQgZnJvbSBSZW5k
ZXJUaGVtZVdpbgogCiBjb25zdCBkb3VibGUgY0luaXRpYWxUaW1lckRlbGF5ID0gMC4yNTsKIGNv
bnN0IGRvdWJsZSBjTm9ybWFsVGltZXJEZWxheSA9IDAuMDU7CiAKIFBsYXRmb3JtU2Nyb2xsYmFy
OjpQbGF0Zm9ybVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwgU2Nyb2xsYmFyT3Jp
ZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCi0gICAgOiBT
Y3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6ZSksIG1faG92ZXJlZFBhcnQoTm9QYXJ0
KSwgbV9wcmVzc2VkUGFydChOb1BhcnQpLCBtX3ByZXNzZWRQb3MoMCksCi0gICAgICBtX3Njcm9s
bFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQpLAot
ICAgICAgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCi17CisgICAgOiBTY3JvbGxiYXIoY2xpZW50
LCBvcmllbnRhdGlvbiwgc2l6ZSkKKyAgICAsIG1faG92ZXJlZFBhcnQoTm9QYXJ0KQorICAgICwg
bV9wcmVzc2VkUGFydChOb1BhcnQpCisgICAgLCBtX3ByZXNzZWRQb3MoMCkKKyAgICAsIG1fc2Ny
b2xsVGltZXIodGhpcywgJlBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZCkK
KyAgICAsIG1fb3ZlcmxhcHNSZXNpemVyKGZhbHNlKQorICAgICwgbV90aGVtZURMTCgwKQorICAg
ICwgbV9zY3JvbGxCYXJUaGVtZSgwKQoreworICAgIC8vIExhdGNoIG9udG8gdGhlIHRoZW1laW5n
IGVuZ2luZQorICAgIG1fdGhlbWVETEwgPSA6OkxvYWRMaWJyYXJ5KEwidXh0aGVtZS5kbGwiKTsK
KyAgICBpZiAobV90aGVtZURMTCkgeworICAgICAgICBvcGVuVGhlbWUgPSAob3BlblRoZW1lRGF0
YVB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiT3BlblRoZW1lRGF0YSIpOworICAgICAg
ICBjbG9zZVRoZW1lID0gKGNsb3NlVGhlbWVEYXRhUHRyKUdldFByb2NBZGRyZXNzKG1fdGhlbWVE
TEwsICJDbG9zZVRoZW1lRGF0YSIpOworICAgICAgICBkcmF3VGhlbWVCRyA9IChkcmF3VGhlbWVC
YWNrZ3JvdW5kUHRyKUdldFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJEcmF3VGhlbWVCYWNrZ3Jv
dW5kIik7CisgICAgICAgIGRyYXdUaGVtZUVkZ2UgPSAoZHJhd1RoZW1lRWRnZVB0cilHZXRQcm9j
QWRkcmVzcyhtX3RoZW1lRExMLCAiRHJhd1RoZW1lRWRnZSIpOworICAgICAgICBnZXRUaGVtZUNv
bnRlbnRSZWN0ID0gKGdldFRoZW1lQ29udGVudFJlY3RQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVt
ZURMTCwgIkdldFRoZW1lQmFja2dyb3VuZENvbnRlbnRSZWN0Iik7CisgICAgICAgIGdldFRoZW1l
UGFydFNpemUgPSAoZ2V0VGhlbWVQYXJ0U2l6ZVB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExM
LCAiR2V0VGhlbWVQYXJ0U2l6ZSIpOworICAgICAgICBnZXRUaGVtZVN5c0ZvbnQgPSAoZ2V0VGhl
bWVTeXNGb250UHRyKUdldFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJHZXRUaGVtZVN5c0ZvbnQi
KTsKKyAgICAgICAgZ2V0VGhlbWVDb2xvciA9IChnZXRUaGVtZUNvbG9yUHRyKUdldFByb2NBZGRy
ZXNzKG1fdGhlbWVETEwsICJHZXRUaGVtZUNvbG9yIik7CisgICAgfQorCiAgICAgLy8gT2J0YWlu
IHRoZSBjb3JyZWN0IHNjcm9sbGJhciBzaXplcyBmcm9tIHRoZSBzeXN0ZW0uCiAgICAgaWYgKCFj
SG9yaXpvbnRhbFdpZHRoKSB7CiAgICAgICAgIC8vIEZJWE1FOiBHZXQgbWV0aWNzIGZyb20gU2Fm
YXJpVGhlbWUKQEAgLTkyLDYgKzE3MCwxNiBAQCBQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZvcm1T
Y3JvbGxiYXIoU2NyCiBQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRmb3JtU2Nyb2xsYmFyKCkKIHsK
ICAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworCisgICAgLy8gQ2xlYW51cCB0aGVtZSBzdHVmZgor
ICAgIGlmICghbV90aGVtZURMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fc2Nyb2xs
QmFyVGhlbWUpCisgICAgICAgIGNsb3NlVGhlbWUobV9zY3JvbGxCYXJUaGVtZSk7CisgICAgbV9z
Y3JvbGxCYXJUaGVtZSA9IDA7CisKKyAgICA6OkZyZWVMaWJyYXJ5KG1fdGhlbWVETEwpOwogfQog
CiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlBvc2l0aW9uKCkKQEAgLTMxMCw2
ICszOTgsMTEgQEAgSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJSZWN0KCkgYwogICAg
IHJldHVybiB0aHVtYlJlY3Q7CiB9CiAKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBw
ZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gSW50
UmVjdCgpOworfQorCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0IElu
dFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVt
YlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0KSBjb25zdAogewogICAgIC8vIFRoaXMgZnVu
Y3Rpb24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhh
dmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFzdApA
QCAtMzU1LDY4ICs0NDgsMTM0IEBAIGludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5ndGgo
KSBjb24KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRCdXR0b24oR3JhcGhpY3NDb250
ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRS
ZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAogewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkp
Ci0gICAgICAgIHJldHVybjsKLQogICAgIEludFJlY3QgcGFpbnRSZWN0ID0gYnV0dG9uUmVwYWlu
dFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwgc3RhcnQpOwogICAgIAog
ICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCiAgICAgICAgIHJldHVy
bjsKIAotICAgIFRoZW1lUGFydCBwYXJ0OwotICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0g
MDsKLSAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9IEFjdGl2
ZVN0YXRlOwotICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCi0g
ICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbExlZnRBcnJvd1BhcnQgOiBTY3JvbGxSaWdodEFy
cm93UGFydDsKLSAgICBlbHNlCi0gICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbFVwQXJyb3dQ
YXJ0IDogU2Nyb2xsRG93bkFycm93UGFydDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gMDsKKyAgICB1
bnNpZ25lZCBzdGF0ZSA9IDA7CisgICAgdW5zaWduZWQgY2xhc3NpY1BhcnQgPSAwOworICAgIHVu
c2lnbmVkIGNsYXNzaWNTdGF0ZSA9IDA7CiAKLSAgICBpZiAoaXNFbmFibGVkKCkpCi0gICAgICAg
IHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKLSAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1
dHRvblBhcnQgJiYgc3RhcnQpCi0gICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRC
dXR0b25QYXJ0ICYmICFzdGFydCkpCi0gICAgICAgIHN0YXRlIHw9IFByZXNzZWRTdGF0ZTsKKyAg
ICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgc3Rh
dGUgPSBzdGFydCA/IEFCU19MRUZUTk9STUFMIDogQUJTX1JJR0hUTk9STUFMOworICAgICAgIGNs
YXNzaWNQYXJ0ID0gc3RhcnQgPyBERkNTX1NDUk9MTExFRlQgOiBERkNTX1NDUk9MTFJJR0hUOwor
ICAgIH0gZWxzZSB7CisgICAgICAgc3RhdGUgPSBzdGFydCA/IEFCU19VUE5PUk1BTCA6IEFCU19E
T1dOTk9STUFMOworICAgICAgIGNsYXNzaWNQYXJ0ID0gc3RhcnQgPyBERkNTX1NDUk9MTFVQIDog
REZDU19TQ1JPTExET1dOOworICAgIH0KIAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRl
eHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxT
Y3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3Rh
dGUpOworICAgIGlmICghaXNFbmFibGVkKCkpIHsKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJTX0RJ
U0FCTEVfTU9ESUZJRVI7CisgICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0lOQUNUSVZFOwor
ICAgIH0KKyAgICBlbHNlIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCAmJiBz
dGFydCkKKyAgICAgICAgICB8fCAobV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkQnV0dG9uUGFydCAm
JiAhc3RhcnQpKQorICAgIHsKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJTX1BSRVNTRURfTU9ESUZJ
RVI7CisgICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX1BVU0hFRCB8IERGQ1NfRkxBVDsKKyAg
ICB9CisgICAgZWxzZSBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAgeworICAgICAgIHN0
YXRlICs9IFNQX0FCU19IT1RfTU9ESUZJRVI7CisgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1Nf
SE9UOworICAgIH0KKworICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCBy
ZWN0KTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0OworICAgIGlmIChtX3RoZW1lRExMICYm
ICFtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBtX3Njcm9sbEJhclRoZW1lID0gb3BlblRoZW1l
KDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSAmJiBkcmF3VGhl
bWVCRykKKyAgICAgICAgZHJhd1RoZW1lQkcobV9zY3JvbGxCYXJUaGVtZSwgaGRjLCBTUF9CVVRU
T04sIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICBEcmF3RnJh
bWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIGNsYXNzaWNQYXJ0LCBjbGFzc2ljU3RhdGUpOwor
CisgICAgZG9uZURyYXdpbmcoY29udGV4dCwgaGRjLCByZWN0KTsKIH0KIAogdm9pZCBQbGF0Zm9y
bVNjcm9sbGJhcjo6cGFpbnRUcmFjayhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IElu
dFJlY3QmIHJlY3QsIGJvb2wgc3RhcnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0
CiB7Ci0gICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKLSAgICAgICAgcmV0dXJuOwotCiAg
ICAgSW50UmVjdCBwYWludFJlY3QgPSBoYXNCdXR0b25zKCkgPyB0cmFja1JlcGFpbnRSZWN0KHJl
Y3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCkpIDogcmVjdDsKICAgICAKICAgICBpZiAo
IWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/
IEhTY3JvbGxUcmFja1BhcnQgOiBWU2Nyb2xsVHJhY2tQYXJ0OwotICAgIFRoZW1lQ29udHJvbFN0
YXRlIHN0YXRlID0gMDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gMDsKKyAgICB1bnNpZ25lZCBjbGFz
c2ljUGFydCA9IERGQ19TQ1JPTEw7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRh
bFNjcm9sbGJhcikKKyAgICAgICBwYXJ0ID0gc3RhcnQgPyBTUF9UUkFDS1NUQVJUSE9SIDogU1Bf
VFJBQ0tFTkRIT1I7CisgICAgZWxzZQorICAgICAgIHBhcnQgPSBzdGFydCA/IFNQX1RSQUNLU1RB
UlRWRVJUIDogU1BfVFJBQ0tFTkRWRVJUOworCisgICAgdW5zaWduZWQgc3RhdGUgPSBUU19ESVNB
QkxFRDsKKyAgICB1bnNpZ25lZCBjbGFzc2ljU3RhdGUgPSBERkNTX01PTk87CiAgICAgaWYgKG1f
Y2xpZW50LT5pc0FjdGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICAg
ICAgc3RhdGUgfD0gVFNfQUNUSVZFOworICAgIGVsc2UKKyAgICAgICBjbGFzc2ljU3RhdGUgfD0g
REZDU19JTkFDVElWRTsKKwogICAgIGlmIChoYXNCdXR0b25zKCkpCi0gICAgICAgIHN0YXRlIHw9
IEVuYWJsZWRTdGF0ZTsKKyAgICAgICAgc3RhdGUgfD0gVFNfTk9STUFMOwogCi0gICAgcGFpbnRU
aGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29u
dHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVn
dWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7CisgICAgSERDIGhkYyA9IHByZXBhcmVGb3JEcmF3aW5n
KGNvbnRleHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHJlY3Q7CisgICAgaWYgKG1f
dGhlbWVETEwgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUg
PSBvcGVuVGhlbWUoMCwgTCJTY3JvbGxiYXIiKTsKKworICAgIGlmIChtX3Njcm9sbEJhclRoZW1l
ICYmIGRyYXdUaGVtZUJHKQorICAgICAgICBkcmF3VGhlbWVCRyhtX3Njcm9sbEJhclRoZW1lLCBo
ZGMsIHBhcnQsIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICBE
cmF3RnJhbWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIERGQ19TQ1JPTEwsIGNsYXNzaWNTdGF0
ZSk7CisKKyAgICBkb25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3QpOwogfQogCiB2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjpwYWludFRodW1iKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29u
c3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3QKIHsKLSAg
ICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQotICAgICAgICByZXR1cm47Ci0KICAgICBpZiAo
IWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhyZWN0KSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgVGhl
bWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Ny
b2xsVGh1bWJQYXJ0IDogVlNjcm9sbFRodW1iUGFydDsKLSAgICBUaGVtZUNvbnRyb2xTdGF0ZSBz
dGF0ZSA9IDA7CisgICAgdW5zaWduZWQgcGFydCA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250
YWxTY3JvbGxiYXIpID8gU1BfVEhVTUJIT1IgOiBTUF9USFVNQlZFUlQ7CisgICAgdW5zaWduZWQg
c3RhdGUgPSAwOworCisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAgc3RhdGUgKz0gU1Bf
QUJTX0RJU0FCTEVfTU9ESUZJRVI7CisgICAgZWxzZSBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkp
CisgICAgICAgc3RhdGUgKz0gU1BfQUJTX0hPVF9NT0RJRklFUjsKKworICAgIEhEQyBoZGMgPSBw
cmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByZWN0KTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSBy
ZWN0OworICAgIGlmIChtX3RoZW1lRExMICYmICFtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBt
X3Njcm9sbEJhclRoZW1lID0gb3BlblRoZW1lKDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAo
bV9zY3JvbGxCYXJUaGVtZSAmJiBkcmF3VGhlbWVCRykgeworICAgICAgICBkcmF3VGhlbWVCRyht
X3Njcm9sbEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7Cisg
ICAgICAgIHBhaW50R3JpcHBlcihoZGMsIHdpZGdldFJlY3QpOworICAgIH0gZWxzZSB7CisgICAg
ICAgIEhHRElPQkogaFNhdmVCcnVzaCA9IFNlbGVjdE9iamVjdChoZGMsIEdldFN5c0NvbG9yQnJ1
c2goQ09MT1JfQlRORkFDRSkpOworICAgICAgICBEcmF3RWRnZShoZGMsICZ3aWRnZXRSZWN0LCBF
REdFX1JBSVNFRCwgQkZfUkVDVCk7CisgICAgICAgIFNlbGVjdE9iamVjdChoZGMsaFNhdmVCcnVz
aCk7CisgICAgfQorCisgICAgZG9uZURyYXdpbmcoY29udGV4dCwgaGRjLCByZWN0KTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBoZGMsIGNvbnN0IEludFJl
Y3QmIHJlY3QpIGNvbnN0Cit7CisgICAgdW5zaWduZWQgcGFydCA9IChtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIpID8gU1BfR1JJUFBFUkhPUiA6IFNQX0dSSVBQRVJWRVJUOwor
ICAgIHVuc2lnbmVkIHN0YXRlID0gMDsKKwogICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkK
LSAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7Ci0gICAgaWYgKGlzRW5hYmxlZCgpKQotICAg
ICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisgICAgICAgIHN0YXRlIHw9IFRTX0FDVElWRTsK
IAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBy
ZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXpl
IDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSBy
ZWN0OworICAgIGlmIChtX3RoZW1lRExMICYmICFtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBt
X3Njcm9sbEJhclRoZW1lID0gb3BlblRoZW1lKDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAo
bV9zY3JvbGxCYXJUaGVtZSAmJiBkcmF3VGhlbWVCRykKKyAgICAgICAgZHJhd1RoZW1lQkcobV9z
Y3JvbGxCYXJUaGVtZSwgaGRjLCBwYXJ0LCBzdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOwogfQog
CiBTY3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0KGNvbnN0IFBsYXRmb3Jt
TW91c2VFdmVudCYgZXZ0KQpAQCAtNDQ4LDYgKzYwNyw3IEBAIFNjcm9sbGJhclBhcnQgUGxhdGZv
cm1TY3JvbGxiYXI6OmhpdFRlc3QKICAgICAgICAgICAgIHJldHVybiBUaHVtYlBhcnQ7CiAgICAg
ICAgIHJldHVybiBGb3J3YXJkVHJhY2tQYXJ0OwogICAgIH0KKwogICAgIHJldHVybiBOb1BhcnQ7
CiB9CiAKQEAgLTQ3Niw3ICs2MzYsNyBAQCBib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVN
b3VzZU1vdmVFCiAgICAgICAgICAgICBzZXRWYWx1ZSgoZmxvYXQpKHRodW1iUG9zICsgZGVsdGEp
ICogKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkgLyAodHJhY2tMZW4gLSB0aHVtYkxlbikp
OwogICAgICAgICAgICAgbV9wcmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24oKSAtIHRodW1iUG9z
OwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApA
QCAtNjM2LDE5ICs3OTYsMTIgQEAgaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp2ZXJ0aWNhbFNjcm9s
bGJhcgogSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6d2luZG93Q2xpcFJlY3QoKSBjb25zdAog
ewogICAgIEludFJlY3QgY2xpcFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCkpOworCiAgICAg
Y2xpcFJlY3QgPSBjb252ZXJ0VG9Db250YWluaW5nV2luZG93KGNsaXBSZWN0KTsKICAgICBpZiAo
bV9jbGllbnQpCiAgICAgICAgIGNsaXBSZWN0LmludGVyc2VjdChtX2NsaWVudC0+d2luZG93Q2xp
cFJlY3QoKSk7Ci0gICAgcmV0dXJuIGNsaXBSZWN0OwotfQogCi12b2lkIFBsYXRmb3JtU2Nyb2xs
YmFyOjpwYWludEdyaXBwZXIoSERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKLXsK
LX0KLQotSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6Z3JpcHBlclJlY3QoY29uc3QgSW50UmVj
dCYgdGh1bWJSZWN0KSBjb25zdAotewotICAgIHJldHVybiBJbnRSZWN0KCk7CisgICAgcmV0dXJu
IGNsaXBSZWN0OwogfQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVtZUNoYW5nZWQoKQpA
QCAtNjU3LDQgKzgxMCwzIEBAIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnRoZW1lQ2hhbmdlZCgp
CiAKIH0KIAotI2VuZGlmIC8vIGRlZmluZWQoVVNFX1NBRkFSSV9USEVNRSkKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJUaGVtZVdpbi5jcHAJKHJldmlzaW9uIDMwNTcxKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw3ICszMiw3
IEBACiAvKiAKICAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSB1c2VkIHRvIGRldGVybWlu
ZSBob3cgYSB3aWRnZXQgaXMgZHJhd24gdXNpbmcKICAqIFdpbmRvd3MnIFRoZW1lIEFQSS4gRm9y
IG1vcmUgaW5mb3JtYXRpb24gb24gdGhlbWUgcGFydHMgYW5kIHN0YXRlcyBzZWUKLSAqIGh0dHA6
Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4t
dXMvc2hlbGxjYy9wbGF0Zm9ybS9jb21tY3Rscy91c2VyZXgvdG9waWNzL3BhcnRzYW5kc3RhdGVz
LmFzcAorICogaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iYjc3MzIx
MChWUy44NSkuYXNweAogICovCiAjZGVmaW5lIFRIRU1FX0NPTE9SIDIwNAogI2RlZmluZSBUSEVN
RV9GT05UICAyMTAKQEAgLTUzLDYgKzUzLDE3IEBACiAjZGVmaW5lIFRGUF9URVhURklFTEQgMQog
I2RlZmluZSBURlNfUkVBRE9OTFkgIDYKIAorLy8gU2Nyb2xsYmFyIGNvbnN0YW50cworI2RlZmlu
ZSBTUF9CVVRUT04gMQorI2RlZmluZSBTUF9USFVNQkhPUiAyCisjZGVmaW5lIFNQX1RIVU1CVkVS
VCAzCisjZGVmaW5lIFNQX1RSQUNLU1RBUlRIT1IgNAorI2RlZmluZSBTUF9UUkFDS0VOREhPUiA1
CisjZGVmaW5lIFNQX1RSQUNLU1RBUlRWRVJUIDYKKyNkZWZpbmUgU1BfVFJBQ0tFTkRWRVJUIDcK
KyNkZWZpbmUgU1BfR1JJUFBFUkhPUiA4CisjZGVmaW5lIFNQX0dSSVBQRVJWRVJUIDkKKwogLy8g
Q29tYm9ib3ggY29uc3RhbnRzCiAjZGVmaW5lIENQX0RST1BET1dOQlVUVE9OIDEKIApAQCAtOTMs
NyArMTA0LDEwIEBAIFJlbmRlclRoZW1lKiB0aGVtZSgpCiB9CiAKIFJlbmRlclRoZW1lV2luOjpS
ZW5kZXJUaGVtZVdpbigpCi06bV90aGVtZURMTCgwKSwgbV9idXR0b25UaGVtZSgwKSwgbV90ZXh0
RmllbGRUaGVtZSgwKSwgbV9tZW51TGlzdFRoZW1lKDApCisgICAgOiBtX3RoZW1lRExMKDApCisg
ICAgLCBtX2J1dHRvblRoZW1lKDApCisgICAgLCBtX3RleHRGaWVsZFRoZW1lKDApCisgICAgLCBt
X21lbnVMaXN0VGhlbWUoMCkKIHsKICAgICBtX3RoZW1lRExMID0gOjpMb2FkTGlicmFyeShMInV4
dGhlbWUuZGxsIik7CiAgICAgaWYgKG1fdGhlbWVETEwpIHsKQEAgLTEyNyw3ICsxNDEsOSBAQCB2
b2lkIFJlbmRlclRoZW1lV2luOjpjbG9zZSgpCiAgICAgICAgIGNsb3NlVGhlbWUobV90ZXh0Rmll
bGRUaGVtZSk7CiAgICAgaWYgKG1fbWVudUxpc3RUaGVtZSkKICAgICAgICAgY2xvc2VUaGVtZSht
X21lbnVMaXN0VGhlbWUpOwotICAgIG1fYnV0dG9uVGhlbWUgPSBtX3RleHRGaWVsZFRoZW1lID0g
bV9tZW51TGlzdFRoZW1lID0gMDsKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAg
Y2xvc2VUaGVtZShtX3Njcm9sbEJhclRoZW1lKTsKKyAgICBtX2J1dHRvblRoZW1lID0gbV90ZXh0
RmllbGRUaGVtZSA9IG1fbWVudUxpc3RUaGVtZSA9IG1fc2Nyb2xsQmFyVGhlbWUgPSAwOwogfQog
CiBDb2xvciBSZW5kZXJUaGVtZVdpbjo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5k
Q29sb3IoKSBjb25zdApAQCAtMTY0LDggKzE4MCw2IEBAIGJvb2wgUmVuZGVyVGhlbWVXaW46OnN1
cHBvcnRzRm9jdXMoRUFwcGUKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKICAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHVuc2lnbmVkIFJlbmRlclRo
ZW1lV2luOjpkZXRlcm1pbmVTdGF0ZShSZW5kZXJPYmplY3QqIG8pCkBAIC0yMjMsNiArMjM3LDI0
IEBAIFRoZW1lRGF0YSBSZW5kZXJUaGVtZVdpbjo6Z2V0VGhlbWVEYXRhKFIKICAgICAgICAgY2Fz
ZSBUZXh0QXJlYUFwcGVhcmFuY2U6CiAgICAgICAgICAgICByZXN1bHQubV9wYXJ0ID0gVEZQX1RF
WFRGSUVMRDsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNjcm9sbGJhclRyYWNr
SG9yaXpvbnRhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1bHQubV9wYXJ0ID0gU1BfVFJB
Q0tTVEFSVEhPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNjcm9sbGJhclRy
YWNrVmVydGljYWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFNQX1RS
QUNLU1RBUlRWRVJUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xsYmFy
VGh1bWJIb3Jpem9udGFsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBT
UF9USFVNQkhPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNjcm9sbGJhclRo
dW1iVmVydGljYWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFNQX1RI
VU1CVkVSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNjcm9sbGJhckdyaXBw
ZXJIb3Jpem9udGFsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBTUF9H
UklQUEVSSE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xsYmFyR3Jp
cHBlclZlcnRpY2FsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBTUF9H
UklQUEVSVkVSVDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIHJlc3VsdC5tX3N0
YXRlID0gZGV0ZXJtaW5lU3RhdGUobyk7CkBAIC0yNjQsMTUgKzI5Niw0MiBAQCBib29sIFJlbmRl
clRoZW1lV2luOjpwYWludEJ1dHRvbihSZW5kZXJPCiAgICAgICAgICAgICB9CiAgICAgICAgIH0K
ICAgICAgICAgRHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3aWRnZXRSZWN0LCBERkNfQlVUVE9OLCB0
aGVtZURhdGEubV9jbGFzc2ljU3RhdGUpOwotICAgICAgICBpZiAoKHRoZW1lRGF0YS5tX3BhcnQg
IT0gQlBfQlVUVE9OKSAmJiBpc0ZvY3VzZWQobykpIHsKKyAgICAgICAgaWYgKCh0aGVtZURhdGEu
bV9wYXJ0ICE9IEJQX0JVVFRPTikgJiYgaXNGb2N1c2VkKG8pKQogICAgICAgICAgICAgRHJhd0Zv
Y3VzUmVjdChoZGMsICZ3aWRnZXRSZWN0KTsKLSAgICAgICAgfQogICAgIH0KICAgICBkb25lRHJh
d2luZyhpLmNvbnRleHQsIGhkYywgcik7CiAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wg
UmVuZGVyVGhlbWVXaW46OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29u
c3QgSW50UmVjdCYgciwgdW5zaWduZWQgc3RhdGUsIHVuc2lnbmVkIHNpemUpCit7CisgICAgUGxh
dGZvcm1HcmFwaGljc0NvbnRleHQqIGN0eCA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwor
ICAgIHN0YXRlID0gVFNfQUNUSVZFOworCisgICAgIC8vIE5vdyBwYWludCB0aGUgYnV0dG9uLgor
ICAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoY29udGV4dCwgcik7ICAKKyAgICAgUkVD
VCB3aWRnZXRSZWN0ID0gcjsKKyAgICAgaWYgKG1fdGhlbWVETEwgJiYgIW1fYnV0dG9uVGhlbWUp
CisgICAgICAgICBtX2J1dHRvblRoZW1lID0gb3BlblRoZW1lKDAsIEwiQnV0dG9uIik7CisgICAg
IGlmIChtX2J1dHRvblRoZW1lICYmIGRyYXdUaGVtZUJHKSB7CisgICAgICAgICBkcmF3VGhlbWVC
RyhtX2J1dHRvblRoZW1lLCBoZGMsIEJQX0JVVFRPTiwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxM
KTsKKyAgICB9IGVsc2UgeworICAgICAgIGlmICh0cnVlKSB7CisgICAgICAgICAgICAvLyBEcmF3
IGJsYWNrIGZvY3VzIHJlY3QgYXJvdW5kIGJ1dHRvbiBvdXRlciBlZGdlCisgICAgICAgICAgICBI
QlJVU0ggYnJ1c2ggPSBHZXRTeXNDb2xvckJydXNoKENPTE9SXzNEREtTSEFET1cpOworICAgICAg
ICAgICAgaWYgKGJydXNoKSB7CisgICAgICAgICAgICAgICAgRnJhbWVSZWN0KGhkYywgJndpZGdl
dFJlY3QsIGJydXNoKTsKKyAgICAgICAgICAgICAgICBJbmZsYXRlUmVjdCgmd2lkZ2V0UmVjdCwg
LTEsIC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBEcmF3RnJhbWVDb250
cm9sKGhkYywgJndpZGdldFJlY3QsIERGQ19CVVRUT04sIDApOworICAgIH0KKyAgICBkb25lRHJh
d2luZyhjb250ZXh0LCBoZGMsIHIpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIFJl
bmRlclRoZW1lV2luOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAog
ewogICAgIC8vIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwgdGhl
biB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJU
aGVtZVdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2lu
LmgJKHJldmlzaW9uIDMwNTcxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4u
aAkod29ya2luZyBjb3B5KQpAQCAtNjcsNiArNjcsNyBAQCBwdWJsaWM6CiAgICAgeyByZXR1cm4g
c2V0Q2hlY2tib3hTaXplKHN0eWxlKTsgfQogCiAgICAgdmlydHVhbCBib29sIHBhaW50QnV0dG9u
KFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50
UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqLCBj
b25zdCBJbnRSZWN0JiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKIAogICAgIHZpcnR1YWwgYm9vbCBw
YWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKIApAQCAtOTIsNiArOTMsNyBAQCBwcml2YXRlOgogICAgIG11
dGFibGUgSEFORExFIG1fYnV0dG9uVGhlbWU7CiAgICAgbXV0YWJsZSBIQU5ETEUgbV90ZXh0Rmll
bGRUaGVtZTsKICAgICBtdXRhYmxlIEhBTkRMRSBtX21lbnVMaXN0VGhlbWU7CisgICAgbXV0YWJs
ZSBIQU5ETEUgbV9zY3JvbGxCYXJUaGVtZTsKIH07CiAKIH07Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19390</attachid>
            <date>2008-02-26 16:56:58 -0800</date>
            <delta_ts>2008-02-26 20:03:40 -0800</delta_ts>
            <desc>Update based on Aroben/Bdash recommendations</desc>
            <filename>WinScrollbars.patch</filename>
            <type>text/plain</type>
            <size>51001</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiAzMDYwNSkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIsNiArMTEyLDExIEBACiAj
ZGVmaW5lIFdURl9QTEFURk9STV9DQUlSTyAxCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKENHKQor
I2RlZmluZSBXVEZfVVNFX1NBRkFSSV9USEVNRSAxCisjZWxzZQorI3VuZGVmIFdURl9VU0VfU0FG
QVJJX1RIRU1FCisjZW5kaWYKIAogI2lmZGVmIF9fUzYwX18KIC8vIHdlIGFyZSBjcm9zcy1jb21w
aWxpbmcsIGl0IGlzIG5vdCByZWFsbHkgd2luZG93cwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93
aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dp
bi9QbGF0Zm9ybVNjcm9sbEJhci5oCShyZXZpc2lvbiAzMDYwNikKKysrIFdlYkNvcmUvcGxhdGZv
cm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEwNiw2ICsxMDYs
MTAgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9wcmVzc2VkUG9zOwogICAgIFRpbWVyPFBsYXRmb3Jt
U2Nyb2xsYmFyPiBtX3Njcm9sbFRpbWVyOwogICAgIGJvb2wgbV9vdmVybGFwc1Jlc2l6ZXI7CisK
KyNpZiAhVVNFKFNBRkFSSV9USEVNRSkKKyAgICBtdXRhYmxlIEhBTkRMRSBtX3Njcm9sbEJhclRo
ZW1lOworI2VuZGlmCiB9OwogCiB9CkluZGV4OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMzA2MDYpCisrKyBXZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDA4LTAyLTI1ICBCcmVudCBG
dWxnaGFtIDxiZnVsZ2hhbUBnbWFpbC5jb20+CisKKyAgICAgICAgaHR0cDovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0ODMKKyAgICAgICAgSW1wbGVtZW50IHNjcm9sbGJhcnMg
b24gV2luZG93cyAoQ2Fpcm8pCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgV0FSTklORzogTk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAg
ICAgICAgKiBwbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaDogIEFkZCB0aGVtZSBIQU5E
TEUgbWVtYmVyIHRvCisgICAgICAgICAgc3VwcG9ydCBXaW5kb3dzLXN0eWxlIHNjcm9sbGJhcnMu
CisgICAgICAgICogcGxhdGZvcm0vd2luL1BsYXRmcm9tU2Nyb2xsQmFyV2luLmNwcDogIER1cGxp
Y2F0ZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgIGZyb20gUGxhdGZvcm1TY3JvbGxCYXJXaW5T
YWZhcmkuY3BwLCB0aGVuIG1vZGlmeSB0byB1c2UgdGhlCisgICAgICAgICAgbmF0aXZlIFdpbmRv
d3MgdGhlbWUgZW5naW5lLiAgVXNlIFNPRlRfTElOSworICAgICAgICAqIHJlbmRlcmluZy9SZW5k
ZXJUaGVtZVdpbi5jcHA6ICBDb3JyZWN0IG1zZG4gbGluayAoY2hhbmdlZCBzaW5jZQorICAgICAg
ICAgIGZpbGUgb3JpZ2luYWxseSBjcmVhdGVkKSwgYWRkIGNvbnN0YW50cyBhbmQgbWVtYmVyIGlu
aXRpYWxpemF0aW9uCisgICAgICAgICAgbmVlZGVkIGZvciBzY3JvbGxiYXJzLiAgQ29udmVydCB0
byBTT0ZUX0xJTksKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lV2luOjpkZXRlcm1pbmVT
dGF0ZSk6IEV4dGVuZCB0byByZWNvZ25pemUKKyAgICAgICAgICBzY3JvbGxiYXIgcGFydHMuCisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZVdpbjo6cGFpbnRCdXR0b24pOiBBZGQgbmV3IGlt
cGxlbWVudGF0aW9uCisgICAgICAgICAgZm9yIGRyYXdpbmcgYnV0dG9ucyBnaXZlbiBhIGdyYXBo
aWMgY29udGV4dCBhbmQgYm91bmRpbmcgYm94LgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJU
aGVtZVdpbi5oCisKIDIwMDgtMDItMjYgIERhdmlkIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IERhbgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxh
dGZvcm1TY3JvbGxCYXJXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2lu
L1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkocmV2aXNpb24gMzA0NTYpCShmcm9tIFdlYkNvcmUv
cGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyU2FmYXJpLmNwcDozMDQ1NikKKysrIFdlYkNv
cmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDY2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmZGVm
IFVTRV9TQUZBUklfVEhFTUUgCisKKyNpbmNsdWRlICJQbGF0Zm9ybVNjcm9sbEJhci5oIgorCisj
aW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVk
ZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRS
ZWN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiU29mdExp
bmtpbmcuaCIKKworI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KKyNpbmNs
dWRlIDxTYWZhcmlUaGVtZS9TYWZhcmlUaGVtZS5oPgorCisvLyBGSVhNRTogVGhlcmUgYXJlIHJl
cGFpbnRpbmcgcHJvYmxlbXMgZHVlIHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25zJyB2aXN1YWwg
b3ZlcmZsb3cuCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KwordXNpbmcgbmFtZXNwYWNlIFNhZmFyaVRoZW1lOworCisvLyBGSVhNRTogV2Ugc2hvdWxkIGdl
dCB0aGVzZSBudW1iZXJzIGZyb20gU2FmYXJpVGhlbWUKK3N0YXRpYyBpbnQgY0hvcml6b250YWxX
aWR0aFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY0hvcml6b250YWxIZWlnaHRbXSA9IHsg
MTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbFdpZHRoW10gPSB7IDE1LCAxMSB9Oworc3Rh
dGljIGludCBjVmVydGljYWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNSZWFs
QnV0dG9uTGVuZ3RoW10gPSB7IDI4LCAyMSB9Oworc3RhdGljIGludCBjQnV0dG9uSW5zZXRbXSA9
IHsgMTQsIDExIH07CitzdGF0aWMgaW50IGNCdXR0b25IaXRJbnNldFtdID0geyAzLCAyIH07Cisv
LyBjUmVhbEJ1dHRvbkxlbmd0aCAtIGNCdXR0b25JbnNldAorc3RhdGljIGludCBjQnV0dG9uTGVu
Z3RoW10gPSB7IDE0LCAxMCB9Oworc3RhdGljIGludCBjVGh1bWJXaWR0aFtdID0geyAxNSwgMTEg
fTsKK3N0YXRpYyBpbnQgY1RodW1iSGVpZ2h0W10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBj
VGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIwIH07CisKKyNpZiAhZGVmaW5lZChOREVCVUcpICYm
IGRlZmluZWQoVVNFX0RFQlVHX1NBRkFSSV9USEVNRSkKK1NPRlRfTElOS19ERUJVR19MSUJSQVJZ
KFNhZmFyaVRoZW1lKQorI2Vsc2UKK1NPRlRfTElOS19MSUJSQVJZKFNhZmFyaVRoZW1lKQorI2Vu
ZGlmCisKK1NPRlRfTElOSyhTYWZhcmlUaGVtZSwgcGFpbnRUaGVtZVBhcnQsIHZvaWQsIF9fc3Rk
Y2FsbCwgKFRoZW1lUGFydCBwYXJ0LCBDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ0dSZWN0
JiByZWN0LCBOU0NvbnRyb2xTaXplIHNpemUsIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlKSwgKHBh
cnQsIGNvbnRleHQsIHJlY3QsIHNpemUsIHN0YXRlKSkKKworY29uc3QgZG91YmxlIGNJbml0aWFs
VGltZXJEZWxheSA9IDAuMjU7Citjb25zdCBkb3VibGUgY05vcm1hbFRpbWVyRGVsYXkgPSAwLjA1
OworCitQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZvcm1TY3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50
KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250
cm9sU2l6ZSBzaXplKQorICAgIDogU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUp
LCBtX2hvdmVyZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBhcnQoTm9QYXJ0KSwgbV9wcmVzc2Vk
UG9zKDApLAorICAgICAgbV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1
dG9zY3JvbGxUaW1lckZpcmVkKSwKKyAgICAgIG1fb3ZlcmxhcHNSZXNpemVyKGZhbHNlKQorewor
ICAgIC8vIE9idGFpbiB0aGUgY29ycmVjdCBzY3JvbGxiYXIgc2l6ZXMgZnJvbSB0aGUgc3lzdGVt
LgorICAgIGlmICghY0hvcml6b250YWxXaWR0aCkgeworICAgICAgICAvLyBGSVhNRTogR2V0IG1l
dGljcyBmcm9tIFNhZmFyaVRoZW1lCisgICAgfQorCisgICAgaWYgKG9yaWVudGF0aW9uID09IFZl
cnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICBzZXRGcmFtZUdlb21ldHJ5KEludFJlY3QoMCwgMCwg
Y1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbEhlaWdodFtjb250cm9sU2l6
ZSgpXSkpOworICAgIGVsc2UKKyAgICAgICAgc2V0RnJhbWVHZW9tZXRyeShJbnRSZWN0KDAsIDAs
IGNIb3Jpem9udGFsV2lkdGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRy
b2xTaXplKCldKSk7Cit9CisKK1BsYXRmb3JtU2Nyb2xsYmFyOjp+UGxhdGZvcm1TY3JvbGxiYXIo
KQoreworICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxi
YXI6OnVwZGF0ZVRodW1iUG9zaXRpb24oKQoreworICAgIGludmFsaWRhdGVUcmFjaygpOworfQor
Cit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlByb3BvcnRpb24oKQoreworICAg
IGludmFsaWRhdGVUcmFjaygpOworfQorCitzdGF0aWMgSW50UmVjdCB0cmFja1JlcGFpbnRSZWN0
KGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRp
b24sIFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAgIEludFJlY3QgcGFp
bnRSZWN0KHRyYWNrUmVjdCk7CisgICAgaWYgKG9yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIpCisgICAgICAgIHBhaW50UmVjdC5pbmZsYXRlWChjQnV0dG9uTGVuZ3RoW2NvbnRyb2xT
aXplXSk7CisgICAgZWxzZQorICAgICAgICBwYWludFJlY3QuaW5mbGF0ZVkoY0J1dHRvbkxlbmd0
aFtjb250cm9sU2l6ZV0pOworCisgICAgcmV0dXJuIHBhaW50UmVjdDsKK30KKworc3RhdGljIElu
dFJlY3QgYnV0dG9uUmVwYWludFJlY3QoY29uc3QgSW50UmVjdCYgYnV0dG9uUmVjdCwgU2Nyb2xs
YmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xT
aXplLCBib29sIHN0YXJ0KQoreworICAgIEludFJlY3QgcGFpbnRSZWN0KGJ1dHRvblJlY3QpOwor
ICAgIGlmIChvcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIHBh
aW50UmVjdC5zZXRXaWR0aChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAg
ICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcGFpbnRSZWN0LnNldFgoYnV0dG9uUmVjdC54KCkg
LSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemVdIC0gYnV0dG9uUmVjdC53aWR0aCgpKSk7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFpbnRSZWN0LnNldEhlaWdodChjUmVhbEJ1dHRvbkxl
bmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcGFp
bnRSZWN0LnNldFkoYnV0dG9uUmVjdC55KCkgLSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNp
emVdIC0gYnV0dG9uUmVjdC5oZWlnaHQoKSkpOworICAgIH0KKworICAgIHJldHVybiBwYWludFJl
Y3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmludmFsaWRhdGVUcmFjaygpCit7Cisg
ICAgSW50UmVjdCByZWN0ID0gdHJhY2tSZXBhaW50UmVjdCh0cmFja1JlY3QoKSwgbV9vcmllbnRh
dGlvbiwgY29udHJvbFNpemUoKSk7CisgICAgcmVjdC5tb3ZlKC14KCksIC15KCkpOworICAgIGlu
dmFsaWRhdGVSZWN0KHJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjppbnZhbGlk
YXRlUGFydChTY3JvbGxiYXJQYXJ0IHBhcnQpCit7CisgICAgaWYgKHBhcnQgPT0gTm9QYXJ0KQor
ICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHJlc3VsdDsgICAgCisgICAgc3dpdGNoIChw
YXJ0KSB7CisgICAgICAgIGNhc2UgQmFja0J1dHRvblBhcnQ6CisgICAgICAgICAgICByZXN1bHQg
PSBidXR0b25SZXBhaW50UmVjdChiYWNrQnV0dG9uUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250
cm9sU2l6ZSgpLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZvcndh
cmRCdXR0b25QYXJ0OgorICAgICAgICAgICAgcmVzdWx0ID0gYnV0dG9uUmVwYWludFJlY3QoZm9y
d2FyZEJ1dHRvblJlY3QoKSwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwgZmFsc2UpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEludFJl
Y3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICAg
ICAgc3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFm
dGVyVGh1bWJSZWN0KTsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IEJhY2tUcmFja1BhcnQpCisg
ICAgICAgICAgICAgICAgcmVzdWx0ID0gYmVmb3JlVGh1bWJSZWN0OworICAgICAgICAgICAgZWxz
ZSBpZiAocGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9
IGFmdGVyVGh1bWJSZWN0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IHRodW1iUmVjdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQubW92ZSgteCgpLCAt
eSgpKTsKKyAgICBpbnZhbGlkYXRlUmVjdChyZXN1bHQpOworfQorCitpbnQgUGxhdGZvcm1TY3Jv
bGxiYXI6OndpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gV2lkZ2V0Ojp3aWR0aCgpOworfQor
CitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdp
ZGdldDo6aGVpZ2h0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNldFJlY3QoY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBHZXQgb3VyIHdpbmRvdyByZXNpemVyIHJlY3Qg
YW5kIHNlZSBpZiB3ZSBvdmVybGFwLiAgQWRqdXN0IHRvIGF2b2lkIHRoZSBvdmVybGFwCisgICAg
Ly8gaWYgbmVjZXNzYXJ5LgorICAgIEludFJlY3QgYWRqdXN0ZWRSZWN0KHJlY3QpOworICAgIGlm
IChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGcmFtZVZpZXcoKSkgeworICAgICAgICBib29sIG92
ZXJsYXBzUmVzaXplciA9IGZhbHNlOworICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBzdGF0aWNf
Y2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisgICAgICAgIEludFJlY3QgcmVzaXplclJlY3Qg
PSB2aWV3LT53aW5kb3dSZXNpemVyUmVjdCgpOworICAgICAgICByZXNpemVyUmVjdC5zZXRMb2Nh
dGlvbih2aWV3LT5jb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3cocmVzaXplclJlY3QubG9jYXRp
b24oKSkpOworICAgICAgICBpZiAocmVjdC5pbnRlcnNlY3RzKHJlc2l6ZXJSZWN0KSkgeworICAg
ICAgICAgICAgaWYgKG9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAg
ICAgICAgICAgICAgIGludCBvdmVybGFwID0gcmVjdC5yaWdodCgpIC0gcmVzaXplclJlY3QueCgp
OworICAgICAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiByZXNpemVyUmVjdC5yaWdodCgp
ID49IHJlY3QucmlnaHQoKSkgeworICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFJlY3Quc2V0
V2lkdGgocmVjdC53aWR0aCgpIC0gb3ZlcmxhcCk7CisgICAgICAgICAgICAgICAgICAgIG92ZXJs
YXBzUmVzaXplciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcCA9IHJlY3QuYm90dG9tKCkgLSByZXNpemVy
UmVjdC55KCk7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIHJlc2l6ZXJSZWN0
LmJvdHRvbSgpID49IHJlY3QuYm90dG9tKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0
ZWRSZWN0LnNldEhlaWdodChyZWN0LmhlaWdodCgpIC0gb3ZlcmxhcCk7CisgICAgICAgICAgICAg
ICAgICAgIG92ZXJsYXBzUmVzaXplciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG92ZXJsYXBzUmVzaXplciAhPSBtX292
ZXJsYXBzUmVzaXplcikgeworICAgICAgICAgICAgbV9vdmVybGFwc1Jlc2l6ZXIgPSBvdmVybGFw
c1Jlc2l6ZXI7CisgICAgICAgICAgICB2aWV3LT5hZGp1c3RPdmVybGFwcGluZ1Njcm9sbGJhckNv
dW50KG1fb3ZlcmxhcHNSZXNpemVyID8gMSA6IC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHNldEZyYW1lR2VvbWV0cnkoYWRqdXN0ZWRSZWN0KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9s
bGJhcjo6c2V0UGFyZW50KFNjcm9sbFZpZXcqIHBhcmVudFZpZXcpCit7CisgICAgaWYgKCFwYXJl
bnRWaWV3ICYmIG1fb3ZlcmxhcHNSZXNpemVyICYmIHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0Zy
YW1lVmlldygpKQorICAgICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSktPmFk
anVzdE92ZXJsYXBwaW5nU2Nyb2xsYmFyQ291bnQoLTEpOworICAgIFdpZGdldDo6c2V0UGFyZW50
KHBhcmVudFZpZXcpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRFbmFibGVkKGJv
b2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCAhPSBpc0VuYWJsZWQoKSkgeworICAgICAg
ICBXaWRnZXQ6OnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAg
ICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50KEdyYXBoaWNzQ29udGV4dCog
Z3JhcGhpY3NDb250ZXh0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KQoreworICAgIGlmIChn
cmFwaGljc0NvbnRleHQtPnVwZGF0aW5nQ29udHJvbFRpbnRzKCkpIHsKKyAgICAgICAgaW52YWxp
ZGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdyYXBoaWNzQ29udGV4
dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBEb24ndCBw
YWludCBhbnl0aGluZyBpZiB0aGUgc2Nyb2xsYmFyIGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBkYW1h
Z2UgcmVjdC4KKyAgICBpZiAoIWZyYW1lR2VvbWV0cnkoKS5pbnRlcnNlY3RzKGRhbWFnZVJlY3Qp
KQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tSZWN0KCk7Cisg
ICAgcGFpbnRUcmFjayhncmFwaGljc0NvbnRleHQsIHRyYWNrLCB0cnVlLCBkYW1hZ2VSZWN0KTsK
KworICAgIGlmIChoYXNCdXR0b25zKCkpIHsKKyAgICAgICAgcGFpbnRCdXR0b24oZ3JhcGhpY3ND
b250ZXh0LCBiYWNrQnV0dG9uUmVjdCgpLCB0cnVlLCBkYW1hZ2VSZWN0KTsKKyAgICAgICAgcGFp
bnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0LCBmb3J3YXJkQnV0dG9uUmVjdCgpLCBmYWxzZSwgZGFt
YWdlUmVjdCk7CisgICAgfQorCisgICAgaWYgKGhhc1RodW1iKCkgJiYgZGFtYWdlUmVjdC5pbnRl
cnNlY3RzKHRyYWNrKSkgeworICAgICAgICBJbnRSZWN0IHN0YXJ0VHJhY2tSZWN0LCB0aHVtYlJl
Y3QsIGVuZFRyYWNrUmVjdDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywgc3RhcnRUcmFja1Jl
Y3QsIHRodW1iUmVjdCwgZW5kVHJhY2tSZWN0KTsKKyAgICAgICAgcGFpbnRUaHVtYihncmFwaGlj
c0NvbnRleHQsIHRodW1iUmVjdCwgZGFtYWdlUmVjdCk7CisgICAgfQorfQorCitib29sIFBsYXRm
b3JtU2Nyb2xsYmFyOjpoYXNCdXR0b25zKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaXNFbmFibGVk
KCkgJiYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IHdpZHRoKCkgOiBo
ZWlnaHQoKSkgPj0gMiAqIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSAtIGNCdXR0
b25IaXRJbnNldFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6
Omhhc1RodW1iKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYgKG1fb3JpZW50
YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IHdpZHRoKCkgOiBoZWlnaHQoKSkgPj0gMiAq
IGNCdXR0b25JbnNldFtjb250cm9sU2l6ZSgpXSArIGNUaHVtYk1pbkxlbmd0aFtjb250cm9sU2l6
ZSgpXSArIDE7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmJhY2tCdXR0b25SZWN0
KCkgY29uc3QKK3sKKyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2VudGlhbGx5IDE3eDE3
LgorICAgIAorICAgIC8vIE91ciBhY3R1YWwgcmVjdCB3aWxsIHNocmluayB0byBoYWxmIHRoZSBh
dmFpbGFibGUgc3BhY2Ugd2hlbgorICAgIC8vIHdlIGhhdmUgPCAzNCBwaXhlbHMgbGVmdC4gIFRo
aXMgYWxsb3dzIHRoZSBzY3JvbGxiYXIKKyAgICAvLyB0byBzY2FsZSBkb3duIGFuZCBmdW5jdGlv
biBldmVuIGF0IHRpbnkgc2l6ZXMuCisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRh
bFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNCdXR0b25MZW5n
dGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAg
ICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0s
IGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0pOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Ny
b2xsYmFyOjpmb3J3YXJkQnV0dG9uUmVjdCgpIGNvbnN0Cit7CisgICAgLy8gT3VyIGRlc2lyZWQg
cmVjdCBpcyBlc3NlbnRpYWxseSAxN3gxNy4KKyAgICAKKyAgICAvLyBPdXIgYWN0dWFsIHJlY3Qg
d2lsbCBzaHJpbmsgdG8gaGFsZiB0aGUgYXZhaWxhYmxlIHNwYWNlIHdoZW4KKyAgICAvLyB3ZSBo
YXZlIDwgMzQgcGl4ZWxzIGxlZnQuICBUaGlzIGFsbG93cyB0aGUgc2Nyb2xsYmFyCisgICAgLy8g
dG8gc2NhbGUgZG93biBhbmQgZnVuY3Rpb24gZXZlbiBhdCB0aW55IHNpemVzLgorCisgICAgaWYg
KG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIElu
dFJlY3QoeCgpICsgd2lkdGgoKSAtIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIHkoKSwg
Y0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNp
emUoKV0pOworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpICsgaGVpZ2h0KCkgLSBjQnV0dG9u
TGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0J1
dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxi
YXI6OnRyYWNrUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpv
bnRhbFNjcm9sbGJhcikgeworICAgICAgICBpZiAoIWhhc0J1dHRvbnMoKSkKKyAgICAgICAgICAg
IHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCB3aWR0aCgpLCBjSG9yaXpvbnRhbEhlaWdodFtjb250
cm9sU2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSArIGNCdXR0b25MZW5ndGhb
Y29udHJvbFNpemUoKV0sIHkoKSwgd2lkdGgoKSAtIDIgKiBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xT
aXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgfQorCisgICAg
aWYgKCFoYXNCdXR0b25zKCkpCisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCBjVmVy
dGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgaGVpZ2h0KCkpOworICAgIHJldHVybiBJbnRSZWN0
KHgoKSwgeSgpICsgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsV2lkdGhb
Y29udHJvbFNpemUoKV0sIGhlaWdodCgpIC0gMiAqIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUo
KV0pOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlJlY3QoKSBjb25zdAor
eworICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0
OworICAgIHNwbGl0VHJhY2sodHJhY2tSZWN0KCksIGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0
LCBhZnRlclRodW1iUmVjdCk7CisgICAgcmV0dXJuIHRodW1iUmVjdDsKK30KKwordm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6c3BsaXRUcmFjayhjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIEludFJl
Y3QmIGJlZm9yZVRodW1iUmVjdCwgSW50UmVjdCYgdGh1bWJSZWN0LCBJbnRSZWN0JiBhZnRlclRo
dW1iUmVjdCkgY29uc3QKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHdvbid0IGV2ZW4gZ2V0IGNh
bGxlZCB1bmxlc3Mgd2UncmUgYmlnIGVub3VnaCB0byBoYXZlIHNvbWUgY29tYmluYXRpb24gb2Yg
dGhlc2UgdGhyZWUgcmVjdHMgd2hlcmUgYXQgbGVhc3QKKyAgICAvLyBvbmUgb2YgdGhlbSBpcyBu
b24tZW1wdHkuCisgICAgaW50IHRodW1iUG9zID0gdGh1bWJQb3NpdGlvbigpOworICAgIGlmICht
X29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgdGh1bWJSZWN0
ID0gSW50UmVjdCh0cmFja1JlY3QueCgpICsgdGh1bWJQb3MsIHRyYWNrUmVjdC55KCkgKyAodHJh
Y2tSZWN0LmhlaWdodCgpIC0gY1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCldKSAvIDIsIHRodW1i
TGVuZ3RoKCksIGNUaHVtYkhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgICAgIGJlZm9yZVRo
dW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSwgdGh1bWJQb3Ms
IHRyYWNrUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIGFmdGVyVGh1bWJSZWN0ID0gSW50UmVjdCh0
aHVtYlJlY3QueCgpICsgdGh1bWJSZWN0LndpZHRoKCksIHRyYWNrUmVjdC55KCksIHRyYWNrUmVj
dC5yaWdodCgpIC0gdGh1bWJSZWN0LnJpZ2h0KCksIHRyYWNrUmVjdC5oZWlnaHQoKSk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgdGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpICsgKHRy
YWNrUmVjdC53aWR0aCgpIC0gY1RodW1iV2lkdGhbY29udHJvbFNpemUoKV0pIC8gMiwgdHJhY2tS
ZWN0LnkoKSArIHRodW1iUG9zLCBjVGh1bWJXaWR0aFtjb250cm9sU2l6ZSgpXSwgdGh1bWJMZW5n
dGgoKSk7CisgICAgICAgIGJlZm9yZVRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwg
dHJhY2tSZWN0LnkoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRodW1iUG9zKTsKKyAgICAgICAgYWZ0
ZXJUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCksIHRodW1iUmVjdC55KCkgKyB0aHVt
YlJlY3QuaGVpZ2h0KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0cmFja1JlY3QuYm90dG9tKCkgLSB0
aHVtYlJlY3QuYm90dG9tKCkpOworICAgIH0KK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0
aHVtYlBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoaXNFbmFibGVkKCkpCisgICAgICAgIHJl
dHVybiAoZmxvYXQpbV9jdXJyZW50UG9zICogKHRyYWNrTGVuZ3RoKCkgLSB0aHVtYkxlbmd0aCgp
KSAvIChtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpOworICAgIHJldHVybiAwOworfQorCitp
bnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iTGVuZ3RoKCkgY29uc3QKK3sKKyAgICBpZiAoIWlz
RW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZsb2F0IHByb3BvcnRpb24gPSAo
ZmxvYXQpKG1fdmlzaWJsZVNpemUpIC8gbV90b3RhbFNpemU7CisgICAgaW50IHRyYWNrTGVuID0g
dHJhY2tMZW5ndGgoKTsKKyAgICBpbnQgbGVuZ3RoID0gcHJvcG9ydGlvbiAqIHRyYWNrTGVuOwor
ICAgIGludCBtaW5MZW5ndGggPSBjVGh1bWJNaW5MZW5ndGhbY29udHJvbFNpemUoKV07CisgICAg
bGVuZ3RoID0gbWF4KGxlbmd0aCwgbWluTGVuZ3RoKTsKKyAgICBpZiAobGVuZ3RoID4gdHJhY2tM
ZW4pCisgICAgICAgIGxlbmd0aCA9IDA7IC8vIE9uY2UgdGhlIHRodW1iIGlzIGJlbG93IHRoZSB0
cmFjayBsZW5ndGgsIGl0IGp1c3QgZ29lcyBhd2F5ICh0byBtYWtlIG1vcmUgcm9vbSBmb3IgdGhl
IHRyYWNrKS4KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6
OnRyYWNrTGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1fb3JpZW50YXRpb24gPT0gSG9y
aXpvbnRhbFNjcm9sbGJhcikgPyB0cmFja1JlY3QoKS53aWR0aCgpIDogdHJhY2tSZWN0KCkuaGVp
Z2h0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0dG9uKEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3Qg
SW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3QKK3sKKyAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFy
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGJ1dHRvblJl
cGFpbnRSZWN0KHJlY3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHN0YXJ0KTsKKyAg
ICAKKyAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBUaGVtZVBhcnQgcGFydDsKKyAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0
ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQorICAgICAgICBzdGF0ZSB8PSBB
Y3RpdmVTdGF0ZTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
KQorICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxMZWZ0QXJyb3dQYXJ0IDogU2Nyb2xsUmln
aHRBcnJvd1BhcnQ7CisgICAgZWxzZQorICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxVcEFy
cm93UGFydCA6IFNjcm9sbERvd25BcnJvd1BhcnQ7CisKKyAgICBpZiAoaXNFbmFibGVkKCkpCisg
ICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0g
QmFja0J1dHRvblBhcnQgJiYgc3RhcnQpCisgICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZv
cndhcmRCdXR0b25QYXJ0ICYmICFzdGFydCkpCisgICAgICAgIHN0YXRlIHw9IFByZXNzZWRTdGF0
ZTsKKworICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgp
LCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29u
dHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworfQorCit2b2lkIFBsYXRm
b3JtU2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3Qg
SW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29u
c3QKK3sKKyAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGhhc0J1dHRvbnMoKSA/IHRyYWNrUmVwYWludFJlY3Qo
cmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSkgOiByZWN0OworICAgIAorICAgIGlm
ICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
ID8gSFNjcm9sbFRyYWNrUGFydCA6IFZTY3JvbGxUcmFja1BhcnQ7CisgICAgVGhlbWVDb250cm9s
U3RhdGUgc3RhdGUgPSAwOworICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICAgICAg
c3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgaWYgKGhhc0J1dHRvbnMoKSkKKyAgICAgICAgc3Rh
dGUgfD0gRW5hYmxlZFN0YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+
cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9s
bGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0
KSBjb25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQorICAgICAgICByZXR1
cm47CisKKyAgICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNj
cm9sbGJhciA/IEhTY3JvbGxUaHVtYlBhcnQgOiBWU2Nyb2xsVGh1bWJQYXJ0OworICAgIFRoZW1l
Q29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisg
ICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOworICAgIGlmIChpc0VuYWJsZWQoKSkKKyAgICAg
ICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3Jv
bGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUp
OworfQorCitTY3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0KGNvbnN0IFBs
YXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAg
IHJldHVybiBOb1BhcnQ7CisKKyAgICBJbnRQb2ludCBtb3VzZVBvc2l0aW9uID0gY29udmVydEZy
b21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSk7CisgICAgbW91c2VQb3NpdGlvbi5tb3ZlKHgo
KSwgeSgpKTsKKworICAgIGlmIChoYXNCdXR0b25zKCkpIHsKKyAgICAgICAgaWYgKGJhY2tCdXR0
b25SZWN0KCkuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4gQmFj
a0J1dHRvblBhcnQ7CisKKyAgICAgICAgaWYgKGZvcndhcmRCdXR0b25SZWN0KCkuY29udGFpbnMo
bW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4gRm9yd2FyZEJ1dHRvblBhcnQ7Cisg
ICAgfQorCisgICAgaWYgKCFoYXNUaHVtYigpKQorICAgICAgICByZXR1cm4gTm9QYXJ0OworCisg
ICAgSW50UmVjdCB0cmFjayA9IHRyYWNrUmVjdCgpOworICAgIGlmICh0cmFjay5jb250YWlucyht
b3VzZVBvc2l0aW9uKSkgeworICAgICAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJS
ZWN0LCBhZnRlclRodW1iUmVjdDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywgYmVmb3JlVGh1
bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICAgICAgaWYgKGJlZm9yZVRo
dW1iUmVjdC5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBCYWNr
VHJhY2tQYXJ0OworICAgICAgICBpZiAodGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24p
KQorICAgICAgICAgICAgcmV0dXJuIFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuIEZvcndhcmRU
cmFja1BhcnQ7CisgICAgfQorICAgIHJldHVybiBOb1BhcnQ7Cit9CisKK2Jvb2wgUGxhdGZvcm1T
Y3JvbGxiYXI6OmhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYg
ZXZ0KQoreworICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkgeworICAgICAgICAv
LyBEcmFnIHRoZSB0aHVtYi4KKyAgICAgICAgaW50IHRodW1iUG9zID0gdGh1bWJQb3NpdGlvbigp
OworICAgICAgICBpbnQgdGh1bWJMZW4gPSB0aHVtYkxlbmd0aCgpOworICAgICAgICBpbnQgdHJh
Y2tMZW4gPSB0cmFja0xlbmd0aCgpOworICAgICAgICBpbnQgbWF4UG9zID0gdHJhY2tMZW4gLSB0
aHVtYkxlbjsKKyAgICAgICAgaW50IGRlbHRhID0gMDsKKyAgICAgICAgaWYgKG1fb3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgICAgIGRlbHRhID0gY29udmVydEZy
b21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueCgpIC0gbV9wcmVzc2VkUG9zOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBkZWx0YSA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhl
dnQucG9zKCkpLnkoKSAtIG1fcHJlc3NlZFBvczsKKworICAgICAgICBpZiAoZGVsdGEgPiAwKQor
ICAgICAgICAgICAgLy8gVGhlIG1vdXNlIG1vdmVkIGRvd24vcmlnaHQuCisgICAgICAgICAgICBk
ZWx0YSA9IG1pbihtYXhQb3MgLSB0aHVtYlBvcywgZGVsdGEpOworICAgICAgICBlbHNlIGlmIChk
ZWx0YSA8IDApCisgICAgICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgdXAvbGVmdC4KKyAgICAg
ICAgICAgIGRlbHRhID0gbWF4KC10aHVtYlBvcywgZGVsdGEpOworCisgICAgICAgIGlmIChkZWx0
YSAhPSAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZSgoZmxvYXQpKHRodW1iUG9zICsgZGVsdGEp
ICogKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkgLyAodHJhY2tMZW4gLSB0aHVtYkxlbikp
OworICAgICAgICAgICAgbV9wcmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24oKSAtIHRodW1iUG9z
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICBpZiAobV9wcmVzc2VkUGFydCAhPSBOb1BhcnQpCisgICAgICAgIG1fcHJlc3NlZFBvcyA9ICht
X29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBjb252ZXJ0RnJvbUNvbnRhaW5p
bmdXaW5kb3coZXZ0LnBvcygpKS54KCkgOiBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0
LnBvcygpKS55KCkpOworCisgICAgU2Nyb2xsYmFyUGFydCBwYXJ0ID0gaGl0VGVzdChldnQpOyAg
ICAKKyAgICBpZiAocGFydCAhPSBtX2hvdmVyZWRQYXJ0KSB7CisgICAgICAgIGlmIChtX3ByZXNz
ZWRQYXJ0ICE9IE5vUGFydCkgeworICAgICAgICAgICAgaWYgKHBhcnQgPT0gbV9wcmVzc2VkUGFy
dCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBpcyBtb3ZpbmcgYmFjayBvdmVyIHRo
ZSBwcmVzc2VkIHBhcnQuICBXZQorICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc3RhcnQgdXAg
dGhlIHRpbWVyIGFjdGlvbiBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBzdGFydFRpbWVySWZOZWVk
ZWQoY05vcm1hbFRpbWVyRGVsYXkpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1f
cHJlc3NlZFBhcnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtX2hvdmVyZWRQYXJ0ID09IG1f
cHJlc3NlZFBhcnQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbW91c2UgaXMgbGVhdmluZyB0
aGUgcHJlc3NlZCBwYXJ0LiAgS2lsbCBvdXIgdGltZXIKKyAgICAgICAgICAgICAgICAvLyBpZiBu
ZWVkZWQuCisgICAgICAgICAgICAgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKKyAgICAgICAgICAg
ICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KHBhcnQpOworICAgICAgICAg
ICAgaW52YWxpZGF0ZVBhcnQobV9ob3ZlcmVkUGFydCk7CisgICAgICAgIH0KKyAgICAgICAgbV9o
b3ZlcmVkUGFydCA9IHBhcnQ7CisgICAgfSAKKworICAgIHJldHVybiB0cnVlOworfQorCitib29s
IFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU91dEV2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYgZXZ0KQoreworICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAg
IG1faG92ZXJlZFBhcnQgPSBOb1BhcnQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VQcmVzc0V2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYgZXZ0KQoreworICAgIG1fcHJlc3NlZFBhcnQgPSBoaXRUZXN0KGV2dCk7CisgICAg
bV9wcmVzc2VkUG9zID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNv
bnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29u
dGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLnkoKSk7CisgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVz
c2VkUGFydCk7CisgICAgYXV0b3Njcm9sbFByZXNzZWRQYXJ0KGNJbml0aWFsVGltZXJEZWxheSk7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1v
dXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIGlu
dmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgIG1fcHJlc3NlZFBhcnQgPSBOb1BhcnQ7
CisgICAgbV9wcmVzc2VkUG9zID0gMDsKKyAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworCisgICAg
aWYgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKQorICAgICAgICBzdGF0aWNf
Y2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSktPmZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zZXRN
b3VzZVByZXNzZWQoZmFsc2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnN0YXJ0VGltZXJJZk5lZWRlZChkb3VibGUgZGVsYXkpCit7CisgICAgLy8g
RG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0aHVtYi4KKyAgICBpZiAobV9wcmVzc2VkUGFydCA9
PSBUaHVtYlBhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEhhbmRsZSB0aGUgdHJhY2su
ICBXZSBoYWx0IHRyYWNrIHNjcm9sbGluZyBvbmNlIHRoZSB0aHVtYiBpcyBsZXZlbAorICAgIC8v
IHdpdGggdXMuCisgICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQgfHwgbV9w
cmVzc2VkUGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KSAmJiB0aHVtYlVuZGVyTW91c2UoKSkgewor
ICAgICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgbV9ob3ZlcmVk
UGFydCA9IFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGNh
bid0IHNjcm9sbCBpZiB3ZSd2ZSBoaXQgdGhlIGJlZ2lubmluZyBvciBlbmQuCisgICAgU2Nyb2xs
RGlyZWN0aW9uIGRpciA9IHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCk7CisgICAgaWYgKGRp
ciA9PSBTY3JvbGxVcCB8fCBkaXIgPT0gU2Nyb2xsTGVmdCkgeworICAgICAgICBpZiAobV9jdXJy
ZW50UG9zID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aWYgKG1fY3VycmVudFBvcyA9PSBtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpCisgICAgICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zY3JvbGxUaW1lci5zdGFydE9uZVNob3QoZGVs
YXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzdG9wVGltZXJJZk5lZWRlZCgpCit7
CisgICAgaWYgKG1fc2Nyb2xsVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9zY3JvbGxUaW1l
ci5zdG9wKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxQcmVzc2Vk
UGFydChkb3VibGUgZGVsYXkpCit7CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0
aHVtYiBvciBpZiBub3RoaW5nIHdhcyBwcmVzc2VkLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09
IFRodW1iUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IE5vUGFydCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4KKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFj
a1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpICYmIHRodW1i
VW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOwor
ICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgLy8gSGFuZGxlIHRoZSBhcnJvd3MgYW5kIHRyYWNrLgorICAgIGlmIChzY3JvbGwo
cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKSwgcHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0
eSgpKSkKKyAgICAgICAgc3RhcnRUaW1lcklmTmVlZGVkKGRlbGF5KTsKK30KKwordm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQoVGltZXI8UGxhdGZvcm1TY3JvbGxi
YXI+KikKK3sKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoY05vcm1hbFRpbWVyRGVsYXkpOwor
fQorCitTY3JvbGxEaXJlY3Rpb24gUGxhdGZvcm1TY3JvbGxiYXI6OnByZXNzZWRQYXJ0U2Nyb2xs
RGlyZWN0aW9uKCkKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyKSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1f
cHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgIHJldHVybiBTY3JvbGxM
ZWZ0OworICAgICAgICByZXR1cm4gU2Nyb2xsUmlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBC
YWNrVHJhY2tQYXJ0KQorICAgICAgICAgICAgcmV0dXJuIFNjcm9sbFVwOworICAgICAgICByZXR1
cm4gU2Nyb2xsRG93bjsKKyAgICB9Cit9CisKK1Njcm9sbEdyYW51bGFyaXR5IFBsYXRmb3JtU2Ny
b2xsYmFyOjpwcmVzc2VkUGFydFNjcm9sbEdyYW51bGFyaXR5KCkKK3sKKyAgICBpZiAobV9wcmVz
c2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0
b25QYXJ0KQorICAgICAgICByZXR1cm4gU2Nyb2xsQnlMaW5lOworICAgIHJldHVybiBTY3JvbGxC
eVBhZ2U7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iVW5kZXJNb3VzZSgpCit7
CisgICAgLy8gQ29uc3RydWN0IGEgcmVjdC4KKyAgICBJbnRSZWN0IHRodW1iID0gdGh1bWJSZWN0
KCk7CisgICAgdGh1bWIubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnQgYmVnaW4gPSAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLngoKSA6IHRodW1iLnkoKTsK
KyAgICBpbnQgZW5kID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0
aHVtYi5yaWdodCgpIDogdGh1bWIuYm90dG9tKCk7CisgICAgcmV0dXJuIChiZWdpbiA8PSBtX3By
ZXNzZWRQb3MgJiYgbV9wcmVzc2VkUG9zIDwgZW5kKTsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xs
YmFyOjpob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRy
b2xTaXplKQoreworICAgIHJldHVybiBjSG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplXTsKK30K
KworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp2ZXJ0aWNhbFNjcm9sbGJhcldpZHRoKFNjcm9sbGJh
ckNvbnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAgIHJldHVybiBjVmVydGljYWxIZWlnaHRb
Y29udHJvbFNpemVdOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp3aW5kb3dDbGlw
UmVjdCgpIGNvbnN0Cit7CisgICAgSW50UmVjdCBjbGlwUmVjdCgwLCAwLCB3aWR0aCgpLCBoZWln
aHQoKSk7CisgICAgY2xpcFJlY3QgPSBjb252ZXJ0VG9Db250YWluaW5nV2luZG93KGNsaXBSZWN0
KTsKKyAgICBpZiAobV9jbGllbnQpCisgICAgICAgIGNsaXBSZWN0LmludGVyc2VjdChtX2NsaWVu
dC0+d2luZG93Q2xpcFJlY3QoKSk7CisgICAgcmV0dXJuIGNsaXBSZWN0OworfQorCit2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjpwYWludEdyaXBwZXIoSERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVj
dCkgY29uc3QKK3sKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6Z3JpcHBlclJlY3Qo
Y29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25zdAoreworICAgIHJldHVybiBJbnRSZWN0KCk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnRoZW1lQ2hhbmdlZCgpCit7Cit9CisKK30K
KworI2VuZGlmIC8vIGRlZmluZWQoVVNFX1NBRkFSSV9USEVNRSkKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHJldmlzaW9uIDMwNDU2KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IEJyZW50IEZ1
bGdoYW0KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjUsOCArMjYsNiBAQAog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpZmRlZiBVU0VfU0FGQVJJX1RIRU1FIAotCiAjaW5j
bHVkZSAiUGxhdGZvcm1TY3JvbGxCYXIuaCIKIAogI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgpA
QCAtMzcsMTcgKzM2LDQwIEBACiAjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCiAjaW5j
bHVkZSAiU29mdExpbmtpbmcuaCIKIAotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhp
Y3MuaD4KLSNpbmNsdWRlIDxTYWZhcmlUaGVtZS9TYWZhcmlUaGVtZS5oPgorI2luY2x1ZGUgPHdp
bmRvd3MuaD4KKyNpbmNsdWRlICJSZW5kZXJUaGVtZVdpbi5oIgogCi0vLyBGSVhNRTogVGhlcmUg
YXJlIHJlcGFpbnRpbmcgcHJvYmxlbXMgZHVlIHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25zJyB2
aXN1YWwgb3ZlcmZsb3cuCisvLyBHZW5lcmljIHN0YXRlIGNvbnN0YW50cworI2RlZmluZSBUU19O
T1JNQUwgICAgMQorI2RlZmluZSBUU19IT1ZFUiAgICAgMgorI2RlZmluZSBUU19BQ1RJVkUgICAg
MworI2RlZmluZSBUU19ESVNBQkxFRCAgNAorI2RlZmluZSBUU19GT0NVU0VEICAgNQorCisjZGVm
aW5lIEFCU19VUE5PUk1BTCAxCisjZGVmaW5lIEFCU19ET1dOTk9STUFMIDUKKyNkZWZpbmUgQUJT
X0xFRlROT1JNQUwgOQorI2RlZmluZSBBQlNfUklHSFROT1JNQUwgMTMKKworY29uc3QgdW5zaWdu
ZWQgU1BfQUJTX0hPVF9NT0RJRklFUiA9IDE7Citjb25zdCB1bnNpZ25lZCBTUF9BQlNfUFJFU1NF
RF9NT0RJRklFUiA9IDI7Citjb25zdCB1bnNpZ25lZCBTUF9BQlNfRElTQUJMRV9NT0RJRklFUiA9
IDM7CisKKy8vIFNjcm9sbGJhciBjb25zdGFudHMKKyNkZWZpbmUgU1BfQlVUVE9OIDEKKyNkZWZp
bmUgU1BfVEhVTUJIT1IgMgorI2RlZmluZSBTUF9USFVNQlZFUlQgMworI2RlZmluZSBTUF9UUkFD
S1NUQVJUSE9SIDQKKyNkZWZpbmUgU1BfVFJBQ0tFTkRIT1IgNQorI2RlZmluZSBTUF9UUkFDS1NU
QVJUVkVSVCA2CisjZGVmaW5lIFNQX1RSQUNLRU5EVkVSVCA3CisjZGVmaW5lIFNQX0dSSVBQRVJI
T1IgOAorI2RlZmluZSBTUF9HUklQUEVSVkVSVCA5CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIFNhZmFyaVRoZW1lOwotCiAv
LyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGVzZSBudW1iZXJzIGZyb20gU2FmYXJpVGhlbWUKIHN0
YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aFtdID0geyAxNSwgMTEgfTsKIHN0YXRpYyBpbnQgY0hv
cml6b250YWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CkBAIC02MiwyMSArODQsNDUgQEAgc3RhdGlj
IGludCBjVGh1bWJXaWR0aFtdID0geyAxNSwgMTEgfTsKIHN0YXRpYyBpbnQgY1RodW1iSGVpZ2h0
W10gPSB7IDE1LCAxMSB9Owogc3RhdGljIGludCBjVGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIw
IH07CiAKLSNpZiAhZGVmaW5lZChOREVCVUcpICYmIGRlZmluZWQoVVNFX0RFQlVHX1NBRkFSSV9U
SEVNRSkKLVNPRlRfTElOS19ERUJVR19MSUJSQVJZKFNhZmFyaVRoZW1lKQotI2Vsc2UKLVNPRlRf
TElOS19MSUJSQVJZKFNhZmFyaVRoZW1lKQotI2VuZGlmCiAKLVNPRlRfTElOSyhTYWZhcmlUaGVt
ZSwgcGFpbnRUaGVtZVBhcnQsIHZvaWQsIF9fc3RkY2FsbCwgKFRoZW1lUGFydCBwYXJ0LCBDR0Nv
bnRleHRSZWYgY29udGV4dCwgY29uc3QgQ0dSZWN0JiByZWN0LCBOU0NvbnRyb2xTaXplIHNpemUs
IFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlKSwgKHBhcnQsIGNvbnRleHQsIHJlY3QsIHNpemUsIHN0
YXRlKSkKKy8vIE5vdGU6ICBDb3BpZWQgZnJvbSBSZW5kZXJUaGVtZVdpbi4gIFRoZXJlIHNob3Vs
ZCBiZSBzb21lIHdheSB0byBiZXR0ZXIKKy8vIGVuY2Fwc3VsYXRlL3NoYXJlIHRoaXMgc3R1ZmYu
ICBTZWUgYWxsIFJlbmRlclRoZW1lU2FmYXJpIGZvciBtb3JlIHN1Y2ggc3R1ZmYuLi4KKy8vCisv
LyBBZnRlciBkaXNjdXNzaW9uIHdpdGggQWRhbSBSb2Jlbiwgd2Ugd2lsbCBtYWtlIHRoZSB1Z2x5
IGNob2ljZSBvZiBjb3B5aW5nIGxvZ2ljCisvLyBmcm9tIFJlbmRlclRoZW1lV2luIHVudGlsIHRo
ZSBUaGVtZSBsb2dpYyBpcyByZWZhY3RvcmVkCitTT0ZUX0xJTktfTElCUkFSWSh1eHRoZW1lKQor
U09GVF9MSU5LKHV4dGhlbWUsIE9wZW5UaGVtZURhdGEsIEhBTkRMRSwgV0lOQVBJLCAoSFdORCBo
d25kLCBMUENXU1RSIHBzekNsYXNzTGlzdCksIChod25kLCBwc3pDbGFzc0xpc3QpKQorU09GVF9M
SU5LKHV4dGhlbWUsIENsb3NlVGhlbWVEYXRhLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRo
ZW1lKSwgKGhUaGVtZSkpCitTT0ZUX0xJTksodXh0aGVtZSwgRHJhd1RoZW1lQmFja2dyb3VuZCwg
SFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIGlu
dCBpU3RhdGVJZCwgY29uc3QgUkVDVCogcFJlY3QsIGNvbnN0IFJFQ1QqIHBDbGlwUmVjdCksICho
VGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRlSWQsIHBSZWN0LCBwQ2xpcFJlY3QpKQorU09GVF9M
SU5LKHV4dGhlbWUsIERyYXdUaGVtZUVkZ2UsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhl
bWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0
LCB1bnNpZ25lZCB1RWRnZSwgdW5zaWduZWQgdUZsYWdzLCBjb25zdCBSRUNUKiBwQ2xpcFJlY3Qp
LCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgdUVkZ2UsIHVGbGFncywg
cENsaXBSZWN0KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZUNvbnRlbnRSZWN0LCBIUkVT
VUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlT
dGF0ZUlkLCBjb25zdCBSRUNUKiBwUmVjdCwgY29uc3QgUkVDVCogcENvbnRlbnRSZWN0KSwgKGhU
aGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgcFJlY3QsIHBDb250ZW50UmVjdCkpCitTT0ZU
X0xJTksodXh0aGVtZSwgR2V0VGhlbWVQYXJ0U2l6ZSwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExF
IGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgUkVDVCogcFJlY3Qs
IGludCB0cywgU0laRSogcHN6KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgcFJl
Y3QsIHRzLCBwc3opKQorU09GVF9MSU5LKHV4dGhlbWUsIEdldFRoZW1lU3lzRm9udCwgSFJFU1VM
VCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgaW50IGlGb250SWQsIE9VVCBMT0dGT05UKiBwRm9u
dCksIChoVGhlbWUsIGlGb250SWQsIHBGb250KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVt
ZUNvbG9yLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBh
cnRJZCwgaW50IGlTdGF0ZUlkLCBpbnQgaVByb3BJZCwgT1VUIENPTE9SUkVGKiBwQ29sb3IpLCAo
aFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBpUHJvcElkLCBwQ29sb3IpKQorCisvLyBN
YXkgbmVlZCB0byBhZGQgc3R1ZmYgdG8gdGhlc2UgbGF0ZXIsIHNvIGtlZXAgdGhlIGdyYXBoaWNz
IGNvbnRleHQgcmV0cmlldmFsL3JlbGVhc2UgaW4gc29tZSBoZWxwZXJzLgorc3RhdGljIEhEQyBw
cmVwYXJlRm9yRHJhd2luZyhHcmFwaGljc0NvbnRleHQqIGcsIGNvbnN0IEludFJlY3QmIHIpCit7
CisgICAgcmV0dXJuIGctPmdldFdpbmRvd3NDb250ZXh0KHIpOworfQorIAorc3RhdGljIHZvaWQg
ZG9uZURyYXdpbmcoR3JhcGhpY3NDb250ZXh0KiBnLCBIREMgaGRjLCBjb25zdCBJbnRSZWN0JiBy
KQoreworICAgIGctPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHIpOworfQorLy8gRW5kIENv
cGllZCBmcm9tIFJlbmRlclRoZW1lV2luCiAKIGNvbnN0IGRvdWJsZSBjSW5pdGlhbFRpbWVyRGVs
YXkgPSAwLjI1OwogY29uc3QgZG91YmxlIGNOb3JtYWxUaW1lckRlbGF5ID0gMC4wNTsKIAogUGxh
dGZvcm1TY3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCogY2xpZW50
LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUg
c2l6ZSkKLSAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKSwgbV9ob3Zl
cmVkUGFydChOb1BhcnQpLCBtX3ByZXNzZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBvcygwKSwK
LSAgICAgIG1fc2Nyb2xsVGltZXIodGhpcywgJlBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xs
VGltZXJGaXJlZCksCi0gICAgICBtX292ZXJsYXBzUmVzaXplcihmYWxzZSkKKyAgICA6IFNjcm9s
bGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKQorICAgICwgbV9ob3ZlcmVkUGFydChOb1Bh
cnQpCisgICAgLCBtX3ByZXNzZWRQYXJ0KE5vUGFydCkKKyAgICAsIG1fcHJlc3NlZFBvcygwKQor
ICAgICwgbV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxU
aW1lckZpcmVkKQorICAgICwgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCisgICAgLCBtX3Njcm9s
bEJhclRoZW1lKDApCiB7CiAgICAgLy8gT2J0YWluIHRoZSBjb3JyZWN0IHNjcm9sbGJhciBzaXpl
cyBmcm9tIHRoZSBzeXN0ZW0uCiAgICAgaWYgKCFjSG9yaXpvbnRhbFdpZHRoKSB7CkBAIC05Miw2
ICsxMzgsMTQgQEAgUGxhdGZvcm1TY3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcgogUGxh
dGZvcm1TY3JvbGxiYXI6On5QbGF0Zm9ybVNjcm9sbGJhcigpCiB7CiAgICAgc3RvcFRpbWVySWZO
ZWVkZWQoKTsKKworICAgIC8vIENsZWFudXAgdGhlbWUgc3R1ZmYKKyAgICBpZiAoIXV4dGhlbWVM
aWJyYXJ5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX3Njcm9sbEJhclRoZW1lKQor
ICAgICAgICBDbG9zZVRoZW1lRGF0YShtX3Njcm9sbEJhclRoZW1lKTsKKyAgICBtX3Njcm9sbEJh
clRoZW1lID0gMDsKIH0KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQb3Np
dGlvbigpCkBAIC0zMTAsNiArMzY0LDExIEBAIEludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRo
dW1iUmVjdCgpIGMKICAgICByZXR1cm4gdGh1bWJSZWN0OwogfQogCitJbnRSZWN0IFBsYXRmb3Jt
U2Nyb2xsYmFyOjpncmlwcGVyUmVjdChjb25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7
CisgICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3Bs
aXRUcmFjayhjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIEludFJlY3QmIGJlZm9yZVRodW1iUmVj
dCwgSW50UmVjdCYgdGh1bWJSZWN0LCBJbnRSZWN0JiBhZnRlclRodW1iUmVjdCkgY29uc3QKIHsK
ICAgICAvLyBUaGlzIGZ1bmN0aW9uIHdvbid0IGV2ZW4gZ2V0IGNhbGxlZCB1bmxlc3Mgd2UncmUg
YmlnIGVub3VnaCB0byBoYXZlIHNvbWUgY29tYmluYXRpb24gb2YgdGhlc2UgdGhyZWUgcmVjdHMg
d2hlcmUgYXQgbGVhc3QKQEAgLTM1NSw2OCArNDE0LDEzNCBAQCBpbnQgUGxhdGZvcm1TY3JvbGxi
YXI6OnRyYWNrTGVuZ3RoKCkgY29uCiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0
dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBz
dGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIVNhZmFy
aVRoZW1lTGlicmFyeSgpKQotICAgICAgICByZXR1cm47Ci0KICAgICBJbnRSZWN0IHBhaW50UmVj
dCA9IGJ1dHRvblJlcGFpbnRSZWN0KHJlY3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCks
IHN0YXJ0KTsKICAgICAKICAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3Qp
KQogICAgICAgICByZXR1cm47CiAKLSAgICBUaGVtZVBhcnQgcGFydDsKLSAgICBUaGVtZUNvbnRy
b2xTdGF0ZSBzdGF0ZSA9IDA7Ci0gICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQotICAgICAg
ICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKLSAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9u
dGFsU2Nyb2xsYmFyKQotICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxMZWZ0QXJyb3dQYXJ0
IDogU2Nyb2xsUmlnaHRBcnJvd1BhcnQ7Ci0gICAgZWxzZQotICAgICAgICBwYXJ0ID0gc3RhcnQg
PyBTY3JvbGxVcEFycm93UGFydCA6IFNjcm9sbERvd25BcnJvd1BhcnQ7CisgICAgdW5zaWduZWQg
cGFydCA9IDA7CisgICAgdW5zaWduZWQgc3RhdGUgPSAwOworICAgIHVuc2lnbmVkIGNsYXNzaWNQ
YXJ0ID0gMDsKKyAgICB1bnNpZ25lZCBjbGFzc2ljU3RhdGUgPSAwOwogCi0gICAgaWYgKGlzRW5h
YmxlZCgpKQotICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7Ci0gICAgaWYgKChtX3ByZXNz
ZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0ICYmIHN0YXJ0KQotICAgICAgICB8fCAobV9wcmVzc2Vk
UGFydCA9PSBGb3J3YXJkQnV0dG9uUGFydCAmJiAhc3RhcnQpKQotICAgICAgICBzdGF0ZSB8PSBQ
cmVzc2VkU3RhdGU7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJh
cikgeworICAgICAgIHN0YXRlID0gc3RhcnQgPyBBQlNfTEVGVE5PUk1BTCA6IEFCU19SSUdIVE5P
Uk1BTDsKKyAgICAgICBjbGFzc2ljUGFydCA9IHN0YXJ0ID8gREZDU19TQ1JPTExMRUZUIDogREZD
U19TQ1JPTExSSUdIVDsKKyAgICB9IGVsc2UgeworICAgICAgIHN0YXRlID0gc3RhcnQgPyBBQlNf
VVBOT1JNQUwgOiBBQlNfRE9XTk5PUk1BTDsKKyAgICAgICBjbGFzc2ljUGFydCA9IHN0YXJ0ID8g
REZDU19TQ1JPTExVUCA6IERGQ1NfU0NST0xMRE9XTjsKKyAgICB9CiAKLSAgICBwYWludFRoZW1l
UGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcGFpbnRSZWN0LCBjb250cm9s
U2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFy
Q29udHJvbFNpemUsIHN0YXRlKTsKKyAgICBpZiAoIWlzRW5hYmxlZCgpKSB7CisgICAgICAgIHN0
YXRlICs9IFNQX0FCU19ESVNBQkxFX01PRElGSUVSOworICAgICAgICBjbGFzc2ljU3RhdGUgfD0g
REZDU19JTkFDVElWRTsKKyAgICB9CisgICAgZWxzZSBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFj
a0J1dHRvblBhcnQgJiYgc3RhcnQpCisgICAgICAgICAgfHwgKG1fcHJlc3NlZFBhcnQgPT0gRm9y
d2FyZEJ1dHRvblBhcnQgJiYgIXN0YXJ0KSkKKyAgICB7CisgICAgICAgIHN0YXRlICs9IFNQX0FC
U19QUkVTU0VEX01PRElGSUVSOworICAgICAgICBjbGFzc2ljU3RhdGUgfD0gREZDU19QVVNIRUQg
fCBERkNTX0ZMQVQ7CisgICAgfQorICAgIGVsc2UgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQor
ICAgIHsKKyAgICAgICBzdGF0ZSArPSBTUF9BQlNfSE9UX01PRElGSUVSOworICAgICAgIGNsYXNz
aWNTdGF0ZSB8PSBERkNTX0hPVDsKKyAgICB9CisKKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRy
YXdpbmcoY29udGV4dCwgcmVjdCk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBp
ZiAoIXV4dGhlbWVMaWJyYXJ5KCkgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1fc2Ny
b2xsQmFyVGhlbWUgPSBPcGVuVGhlbWVEYXRhKDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAo
bV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgRHJhd1RoZW1lQmFja2dyb3VuZChtX3Njcm9sbEJh
clRoZW1lLCBoZGMsIFNQX0JVVFRPTiwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICBl
bHNlCisgICAgICAgIERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgY2xhc3NpY1Bh
cnQsIGNsYXNzaWNTdGF0ZSk7CisKKyAgICBkb25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3Qp
OwogfQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4
dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVj
dCYgZGFtYWdlUmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQot
ICAgICAgICByZXR1cm47Ci0KICAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGhhc0J1dHRvbnMoKSA/
IHRyYWNrUmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSkgOiBy
ZWN0OwogICAgIAogICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCiAg
ICAgICAgIHJldHVybjsKIAotICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyID8gSFNjcm9sbFRyYWNrUGFydCA6IFZTY3JvbGxUcmFja1BhcnQ7
Ci0gICAgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIHVuc2lnbmVkIHBhcnQgPSAw
OworICAgIHVuc2lnbmVkIGNsYXNzaWNQYXJ0ID0gREZDX1NDUk9MTDsKKyAgICBpZiAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgIHBhcnQgPSBzdGFydCA/IFNQ
X1RSQUNLU1RBUlRIT1IgOiBTUF9UUkFDS0VOREhPUjsKKyAgICBlbHNlCisgICAgICAgcGFydCA9
IHN0YXJ0ID8gU1BfVFJBQ0tTVEFSVFZFUlQgOiBTUF9UUkFDS0VORFZFUlQ7CisKKyAgICB1bnNp
Z25lZCBzdGF0ZSA9IFRTX0RJU0FCTEVEOworICAgIHVuc2lnbmVkIGNsYXNzaWNTdGF0ZSA9IERG
Q1NfTU9OTzsKICAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9
IEFjdGl2ZVN0YXRlOworICAgICAgICBzdGF0ZSB8PSBUU19BQ1RJVkU7CisgICAgZWxzZQorICAg
ICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0lOQUNUSVZFOworCiAgICAgaWYgKGhhc0J1dHRvbnMo
KSkKLSAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgICAgICBzdGF0ZSB8PSBUU19O
T1JNQUw7CiAKLSAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKSwgcGFpbnRSZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFs
bENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKKyAgICBIREMgaGRj
ID0gcHJlcGFyZUZvckRyYXdpbmcoY29udGV4dCwgcmVjdCk7CisgICAgUkVDVCB3aWRnZXRSZWN0
ID0gcmVjdDsKKyAgICBpZiAodXh0aGVtZUxpYnJhcnkoKSAmJiAhbV9zY3JvbGxCYXJUaGVtZSkK
KyAgICAgICAgbV9zY3JvbGxCYXJUaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJTY3JvbGxiYXIi
KTsKKworICAgIGlmIChtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBEcmF3VGhlbWVCYWNrZ3Jv
dW5kKG1fc2Nyb2xsQmFyVGhlbWUsIGhkYywgcGFydCwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxM
KTsKKyAgICBlbHNlCisgICAgICAgIERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwg
REZDX1NDUk9MTCwgY2xhc3NpY1N0YXRlKTsKKworICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhk
YywgcmVjdCk7CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VGh1bWIoR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBk
YW1hZ2VSZWN0KSBjb25zdAogewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCi0gICAg
ICAgIHJldHVybjsKLQogICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQogICAg
ICAgICByZXR1cm47CiAKLSAgICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9y
aXpvbnRhbFNjcm9sbGJhciA/IEhTY3JvbGxUaHVtYlBhcnQgOiBWU2Nyb2xsVGh1bWJQYXJ0Owot
ICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gKG1f
b3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyBTUF9USFVNQkhPUiA6IFNQX1RI
VU1CVkVSVDsKKyAgICB1bnNpZ25lZCBzdGF0ZSA9IDA7CisKKyAgICBpZiAoIWlzRW5hYmxlZCgp
KQorICAgICAgICBzdGF0ZSArPSBTUF9BQlNfRElTQUJMRV9NT0RJRklFUjsKKyAgICBlbHNlIGlm
IChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICAgICBzdGF0ZSArPSBTUF9BQlNfSE9UX01PRElG
SUVSOworCisgICAgSERDIGhkYyA9IHByZXBhcmVGb3JEcmF3aW5nKGNvbnRleHQsIHJlY3QpOwor
ICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHJlY3Q7CisgICAgaWYgKHV4dGhlbWVMaWJyYXJ5KCkgJiYg
IW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBPcGVuVGhlbWVE
YXRhKDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSkgeworICAg
ICAgICBEcmF3VGhlbWVCYWNrZ3JvdW5kKG1fc2Nyb2xsQmFyVGhlbWUsIGhkYywgcGFydCwgc3Rh
dGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICAgICAgcGFpbnRHcmlwcGVyKGhkYywgd2lkZ2V0
UmVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgSEdESU9CSiBoU2F2ZUJydXNoID0gU2VsZWN0
T2JqZWN0KGhkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5GQUNFKSk7CisgICAgICAgIERy
YXdFZGdlKGhkYywgJndpZGdldFJlY3QsIEVER0VfUkFJU0VELCBCRl9SRUNUKTsKKyAgICAgICAg
U2VsZWN0T2JqZWN0KGhkYyxoU2F2ZUJydXNoKTsKKyAgICB9CisKKyAgICBkb25lRHJhd2luZyhj
b250ZXh0LCBoZGMsIHJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEdy
aXBwZXIoSERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICB1bnNpZ25l
ZCBwYXJ0ID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyBTUF9HUklQ
UEVSSE9SIDogU1BfR1JJUFBFUlZFUlQ7CisgICAgdW5zaWduZWQgc3RhdGUgPSAwOworCiAgICAg
aWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsK
LSAgICBpZiAoaXNFbmFibGVkKCkpCi0gICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKyAg
ICAgICAgc3RhdGUgfD0gVFNfQUNUSVZFOwogCi0gICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3Jv
bGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUp
OworICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHJlY3Q7CisgICAgaWYgKHV4dGhlbWVMaWJyYXJ5KCkg
JiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBPcGVuVGhl
bWVEYXRhKDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSkKKyAg
ICAgICAgRHJhd1RoZW1lQmFja2dyb3VuZChtX3Njcm9sbEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0
YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CiB9CiAKIFNjcm9sbGJhclBhcnQgUGxhdGZvcm1TY3Jv
bGxiYXI6OmhpdFRlc3QoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCkBAIC00NDgsNiAr
NTczLDcgQEAgU2Nyb2xsYmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0VGVzdAogICAgICAg
ICAgICAgcmV0dXJuIFRodW1iUGFydDsKICAgICAgICAgcmV0dXJuIEZvcndhcmRUcmFja1BhcnQ7
CiAgICAgfQorCiAgICAgcmV0dXJuIE5vUGFydDsKIH0KIApAQCAtNDc2LDcgKzYwMiw3IEBAIGJv
b2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlTW92ZUUKICAgICAgICAgICAgIHNldFZh
bHVlKChmbG9hdCkodGh1bWJQb3MgKyBkZWx0YSkgKiAobV90b3RhbFNpemUgLSBtX3Zpc2libGVT
aXplKSAvICh0cmFja0xlbiAtIHRodW1iTGVuKSk7CiAgICAgICAgICAgICBtX3ByZXNzZWRQb3Mg
Kz0gdGh1bWJQb3NpdGlvbigpIC0gdGh1bWJQb3M7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAg
ICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC02MzYsMTkgKzc2MiwxMiBAQCBpbnQgUGxh
dGZvcm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Nyb2xsYmFyCiBJbnRSZWN0IFBsYXRmb3JtU2Nyb2xs
YmFyOjp3aW5kb3dDbGlwUmVjdCgpIGNvbnN0CiB7CiAgICAgSW50UmVjdCBjbGlwUmVjdCgwLCAw
LCB3aWR0aCgpLCBoZWlnaHQoKSk7CisKICAgICBjbGlwUmVjdCA9IGNvbnZlcnRUb0NvbnRhaW5p
bmdXaW5kb3coY2xpcFJlY3QpOwogICAgIGlmIChtX2NsaWVudCkKICAgICAgICAgY2xpcFJlY3Qu
aW50ZXJzZWN0KG1fY2xpZW50LT53aW5kb3dDbGlwUmVjdCgpKTsKLSAgICByZXR1cm4gY2xpcFJl
Y3Q7Ci19CiAKLXZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBj
b25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAotewotfQotCi1JbnRSZWN0IFBsYXRmb3JtU2Nyb2xs
YmFyOjpncmlwcGVyUmVjdChjb25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIEludFJlY3QoKTsKKyAgICByZXR1cm4gY2xpcFJlY3Q7CiB9CiAKIHZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnRoZW1lQ2hhbmdlZCgpCkBAIC02NTcsNCArNzc2LDMgQEAgdm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6dGhlbWVDaGFuZ2VkKCkKIAogfQogCi0jZW5kaWYgLy8gZGVmaW5lZChV
U0VfU0FGQVJJX1RIRU1FKQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmNwcAko
cmV2aXNpb24gMzA2MDYpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI3LDEyICsyNywxNCBAQAogI2luY2x1ZGUgIkRvY3VtZW50Lmgi
CiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcu
aCIKKyNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgorCiAjaW5jbHVkZSA8Y2Fpcm8td2luMzIuaD4K
IAogLyogCiAgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCB0byBkZXRlcm1pbmUg
aG93IGEgd2lkZ2V0IGlzIGRyYXduIHVzaW5nCiAgKiBXaW5kb3dzJyBUaGVtZSBBUEkuIEZvciBt
b3JlIGluZm9ybWF0aW9uIG9uIHRoZW1lIHBhcnRzIGFuZCBzdGF0ZXMgc2VlCi0gKiBodHRwOi8v
bXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVz
L3NoZWxsY2MvcGxhdGZvcm0vY29tbWN0bHMvdXNlcmV4L3RvcGljcy9wYXJ0c2FuZHN0YXRlcy5h
c3AKKyAqIGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYmI3NzMyMTAo
VlMuODUpLmFzcHgKICAqLwogI2RlZmluZSBUSEVNRV9DT0xPUiAyMDQKICNkZWZpbmUgVEhFTUVf
Rk9OVCAgMjEwCkBAIC01MywzNiArNTUsMjkgQEAKICNkZWZpbmUgVEZQX1RFWFRGSUVMRCAxCiAj
ZGVmaW5lIFRGU19SRUFET05MWSAgNgogCisvLyBTY3JvbGxiYXIgY29uc3RhbnRzCisjZGVmaW5l
IFNQX0JVVFRPTiAxCisjZGVmaW5lIFNQX1RIVU1CSE9SIDIKKyNkZWZpbmUgU1BfVEhVTUJWRVJU
IDMKKyNkZWZpbmUgU1BfVFJBQ0tTVEFSVEhPUiA0CisjZGVmaW5lIFNQX1RSQUNLRU5ESE9SIDUK
KyNkZWZpbmUgU1BfVFJBQ0tTVEFSVFZFUlQgNgorI2RlZmluZSBTUF9UUkFDS0VORFZFUlQgNwor
I2RlZmluZSBTUF9HUklQUEVSSE9SIDgKKyNkZWZpbmUgU1BfR1JJUFBFUlZFUlQgOQorCiAvLyBD
b21ib2JveCBjb25zdGFudHMKICNkZWZpbmUgQ1BfRFJPUERPV05CVVRUT04gMQogCi10eXBlZGVm
IEhBTkRMRSAoV0lOQVBJKm9wZW5UaGVtZURhdGFQdHIpKEhXTkQgaHduZCwgTFBDV1NUUiBwc3pD
bGFzc0xpc3QpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqY2xvc2VUaGVtZURhdGFQdHIpKEhB
TkRMRSBoVGhlbWUpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZHJhd1RoZW1lQmFja2dyb3Vu
ZFB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUICpw
UmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJF
Q1QqIHBDbGlwUmVjdCk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpkcmF3VGhlbWVFZGdlUHRy
KShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QgKnBSZWN0
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdUVk
Z2UsIHVuc2lnbmVkIHVGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IFJFQ1QqIHBDbGlwUmVjdCk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpn
ZXRUaGVtZUNvbnRlbnRSZWN0UHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJ
ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJ
ZCwgY29uc3QgUkVDVCogcFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBSRUNUKiBwQ29udGVudFJlY3QpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0
VGhlbWVQYXJ0U2l6ZVB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIFJFQ1Qq
IHByYywgaW50IHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0la
RSogcHN6KTsKLXR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lU3lzRm9udFB0cikoSEFO
RExFIGhUaGVtZSwgaW50IGlGb250SWQsIE9VVCBMT0dGT05UKiBwRm9udCk7Ci10eXBlZGVmIEhS
RVNVTFQgKFdJTkFQSSpnZXRUaGVtZUNvbG9yUHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBp
bnQgaVBhcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdGF0
ZUlkLCBpbnQgaVByb3BJZCwgT1VUIENPTE9SUkVGKiBwRm9udCk7Ci0KLXN0YXRpYyBvcGVuVGhl
bWVEYXRhUHRyIG9wZW5UaGVtZSA9IDA7Ci1zdGF0aWMgY2xvc2VUaGVtZURhdGFQdHIgY2xvc2VU
aGVtZSA9IDA7Ci1zdGF0aWMgZHJhd1RoZW1lQmFja2dyb3VuZFB0ciBkcmF3VGhlbWVCRyA9IDA7
Ci1zdGF0aWMgZHJhd1RoZW1lRWRnZVB0ciBkcmF3VGhlbWVFZGdlID0gMDsKLXN0YXRpYyBnZXRU
aGVtZUNvbnRlbnRSZWN0UHRyIGdldFRoZW1lQ29udGVudFJlY3QgPSAwOwotc3RhdGljIGdldFRo
ZW1lUGFydFNpemVQdHIgZ2V0VGhlbWVQYXJ0U2l6ZSA9IDA7Ci1zdGF0aWMgZ2V0VGhlbWVTeXNG
b250UHRyIGdldFRoZW1lU3lzRm9udCA9IDA7Ci1zdGF0aWMgZ2V0VGhlbWVDb2xvclB0ciBnZXRU
aGVtZUNvbG9yID0gMDsKK1NPRlRfTElOS19MSUJSQVJZKHV4dGhlbWUpCitTT0ZUX0xJTksodXh0
aGVtZSwgT3BlblRoZW1lRGF0YSwgSEFORExFLCBXSU5BUEksIChIV05EIGh3bmQsIExQQ1dTVFIg
cHN6Q2xhc3NMaXN0KSwgKGh3bmQsIHBzekNsYXNzTGlzdCkpCitTT0ZUX0xJTksodXh0aGVtZSwg
Q2xvc2VUaGVtZURhdGEsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUpLCAoaFRoZW1l
KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBEcmF3VGhlbWVCYWNrZ3JvdW5kLCBIUkVTVUxULCBXSU5B
UEksIChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBj
b25zdCBSRUNUKiBwUmVjdCwgY29uc3QgUkVDVCogcENsaXBSZWN0KSwgKGhUaGVtZSwgaGRjLCBp
UGFydElkLCBpU3RhdGVJZCwgcFJlY3QsIHBDbGlwUmVjdCkpCitTT0ZUX0xJTksodXh0aGVtZSwg
RHJhd1RoZW1lRWRnZSwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywg
aW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCogcFJlY3QsIHVuc2lnbmVkIHVF
ZGdlLCB1bnNpZ25lZCB1RmxhZ3MsIGNvbnN0IFJFQ1QqIHBDbGlwUmVjdCksIChoVGhlbWUsIGhk
YywgaVBhcnRJZCwgaVN0YXRlSWQsIHBSZWN0LCB1RWRnZSwgdUZsYWdzLCBwQ2xpcFJlY3QpKQor
U09GVF9MSU5LKHV4dGhlbWUsIEdldFRoZW1lQ29udGVudFJlY3QsIEhSRVNVTFQsIFdJTkFQSSwg
KEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0
IFJFQ1QqIHBSZWN0LCBjb25zdCBSRUNUKiBwQ29udGVudFJlY3QpLCAoaFRoZW1lLCBoZGMsIGlQ
YXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgcENvbnRlbnRSZWN0KSkKK1NPRlRfTElOSyh1eHRoZW1l
LCBHZXRUaGVtZVBhcnRTaXplLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMg
aGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBSRUNUKiBwUmVjdCwgaW50IHRzLCBTSVpF
KiBwc3opLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgdHMsIHBzeikp
CitTT0ZUX0xJTksodXh0aGVtZSwgR2V0VGhlbWVTeXNGb250LCBIUkVTVUxULCBXSU5BUEksIChI
QU5ETEUgaFRoZW1lLCBpbnQgaUZvbnRJZCwgT1VUIExPR0ZPTlQqIHBGb250KSwgKGhUaGVtZSwg
aUZvbnRJZCwgcEZvbnQpKQorU09GVF9MSU5LKHV4dGhlbWUsIEdldFRoZW1lQ29sb3IsIEhSRVNV
TFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0
YXRlSWQsIGludCBpUHJvcElkLCBPVVQgQ09MT1JSRUYqIHBDb2xvciksIChoVGhlbWUsIGhkYywg
aVBhcnRJZCwgaVN0YXRlSWQsIGlQcm9wSWQsIHBDb2xvcikpCiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIApAQCAtOTMsNDEgKzg4LDMyIEBAIFJlbmRlclRoZW1lKiB0aGVtZSgpCiB9CiAKIFJlbmRl
clRoZW1lV2luOjpSZW5kZXJUaGVtZVdpbigpCi06bV90aGVtZURMTCgwKSwgbV9idXR0b25UaGVt
ZSgwKSwgbV90ZXh0RmllbGRUaGVtZSgwKSwgbV9tZW51TGlzdFRoZW1lKDApCisgICAgOiBtX2J1
dHRvblRoZW1lKDApCisgICAgLCBtX3RleHRGaWVsZFRoZW1lKDApCisgICAgLCBtX21lbnVMaXN0
VGhlbWUoMCkKIHsKLSAgICBtX3RoZW1lRExMID0gOjpMb2FkTGlicmFyeShMInV4dGhlbWUuZGxs
Iik7Ci0gICAgaWYgKG1fdGhlbWVETEwpIHsKLSAgICAgICAgb3BlblRoZW1lID0gKG9wZW5UaGVt
ZURhdGFQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIk9wZW5UaGVtZURhdGEiKTsKLSAg
ICAgICAgY2xvc2VUaGVtZSA9IChjbG9zZVRoZW1lRGF0YVB0cilHZXRQcm9jQWRkcmVzcyhtX3Ro
ZW1lRExMLCAiQ2xvc2VUaGVtZURhdGEiKTsKLSAgICAgICAgZHJhd1RoZW1lQkcgPSAoZHJhd1Ro
ZW1lQmFja2dyb3VuZFB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiRHJhd1RoZW1lQmFj
a2dyb3VuZCIpOwotICAgICAgICBkcmF3VGhlbWVFZGdlID0gKGRyYXdUaGVtZUVkZ2VQdHIpR2V0
UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkRyYXdUaGVtZUVkZ2UiKTsKLSAgICAgICAgZ2V0VGhl
bWVDb250ZW50UmVjdCA9IChnZXRUaGVtZUNvbnRlbnRSZWN0UHRyKUdldFByb2NBZGRyZXNzKG1f
dGhlbWVETEwsICJHZXRUaGVtZUJhY2tncm91bmRDb250ZW50UmVjdCIpOwotICAgICAgICBnZXRU
aGVtZVBhcnRTaXplID0gKGdldFRoZW1lUGFydFNpemVQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVt
ZURMTCwgIkdldFRoZW1lUGFydFNpemUiKTsKLSAgICAgICAgZ2V0VGhlbWVTeXNGb250ID0gKGdl
dFRoZW1lU3lzRm9udFB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiR2V0VGhlbWVTeXNG
b250Iik7Ci0gICAgICAgIGdldFRoZW1lQ29sb3IgPSAoZ2V0VGhlbWVDb2xvclB0cilHZXRQcm9j
QWRkcmVzcyhtX3RoZW1lRExMLCAiR2V0VGhlbWVDb2xvciIpOwotICAgIH0KIH0KIAogUmVuZGVy
VGhlbWVXaW46On5SZW5kZXJUaGVtZVdpbigpCiB7Ci0gICAgaWYgKCFtX3RoZW1lRExMKQorICAg
IGlmICghdXh0aGVtZUxpYnJhcnkoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgY2xvc2UoKTsK
LQotICAgIDo6RnJlZUxpYnJhcnkobV90aGVtZURMTCk7CiB9CiAKIHZvaWQgUmVuZGVyVGhlbWVX
aW46OmNsb3NlKCkKIHsKICAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIG5lZWQgdG8gYmUgY2FsbGVk
IHdoZW4gdGhlIE9TIHRoZW1lIGNoYW5nZXMgdG8gZmx1c2ggb3VyIGNhY2hlZCB0aGVtZXMuCiAg
ICAgaWYgKG1fYnV0dG9uVGhlbWUpCi0gICAgICAgIGNsb3NlVGhlbWUobV9idXR0b25UaGVtZSk7
CisgICAgICAgIENsb3NlVGhlbWVEYXRhKG1fYnV0dG9uVGhlbWUpOwogICAgIGlmIChtX3RleHRG
aWVsZFRoZW1lKQotICAgICAgICBjbG9zZVRoZW1lKG1fdGV4dEZpZWxkVGhlbWUpOworICAgICAg
ICBDbG9zZVRoZW1lRGF0YShtX3RleHRGaWVsZFRoZW1lKTsKICAgICBpZiAobV9tZW51TGlzdFRo
ZW1lKQotICAgICAgICBjbG9zZVRoZW1lKG1fbWVudUxpc3RUaGVtZSk7Ci0gICAgbV9idXR0b25U
aGVtZSA9IG1fdGV4dEZpZWxkVGhlbWUgPSBtX21lbnVMaXN0VGhlbWUgPSAwOworICAgICAgICBD
bG9zZVRoZW1lRGF0YShtX21lbnVMaXN0VGhlbWUpOworICAgIGlmIChtX3Njcm9sbEJhclRoZW1l
KQorICAgICAgICBDbG9zZVRoZW1lRGF0YShtX3Njcm9sbEJhclRoZW1lKTsKKyAgICBtX2J1dHRv
blRoZW1lID0gbV90ZXh0RmllbGRUaGVtZSA9IG1fbWVudUxpc3RUaGVtZSA9IG1fc2Nyb2xsQmFy
VGhlbWUgPSAwOwogfQogCiBDb2xvciBSZW5kZXJUaGVtZVdpbjo6cGxhdGZvcm1BY3RpdmVTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdApAQCAtMTY0LDggKzE1MCw2IEBAIGJvb2wgUmVu
ZGVyVGhlbWVXaW46OnN1cHBvcnRzRm9jdXMoRUFwcGUKICAgICAgICAgZGVmYXVsdDoKICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHVu
c2lnbmVkIFJlbmRlclRoZW1lV2luOjpkZXRlcm1pbmVTdGF0ZShSZW5kZXJPYmplY3QqIG8pCkBA
IC0yMjMsNiArMjA3LDI0IEBAIFRoZW1lRGF0YSBSZW5kZXJUaGVtZVdpbjo6Z2V0VGhlbWVEYXRh
KFIKICAgICAgICAgY2FzZSBUZXh0QXJlYUFwcGVhcmFuY2U6CiAgICAgICAgICAgICByZXN1bHQu
bV9wYXJ0ID0gVEZQX1RFWFRGSUVMRDsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFNjcm9sbGJhclRyYWNrSG9yaXpvbnRhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1bHQu
bV9wYXJ0ID0gU1BfVFJBQ0tTVEFSVEhPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIFNjcm9sbGJhclRyYWNrVmVydGljYWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVzdWx0
Lm1fcGFydCA9IFNQX1RSQUNLU1RBUlRWRVJUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgU2Nyb2xsYmFyVGh1bWJIb3Jpem9udGFsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJl
c3VsdC5tX3BhcnQgPSBTUF9USFVNQkhPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIFNjcm9sbGJhclRodW1iVmVydGljYWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVzdWx0
Lm1fcGFydCA9IFNQX1RIVU1CVkVSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFNjcm9sbGJhckdyaXBwZXJIb3Jpem9udGFsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3Vs
dC5tX3BhcnQgPSBTUF9HUklQUEVSSE9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgU2Nyb2xsYmFyR3JpcHBlclZlcnRpY2FsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3Vs
dC5tX3BhcnQgPSBTUF9HUklQUEVSVkVSVDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAog
ICAgIHJlc3VsdC5tX3N0YXRlID0gZGV0ZXJtaW5lU3RhdGUobyk7CkBAIC0yNTAsMTAgKzI1Miwx
MCBAQCBib29sIFJlbmRlclRoZW1lV2luOjpwYWludEJ1dHRvbihSZW5kZXJPCiAgICAgLy8gTm93
IHBhaW50IHRoZSBidXR0b24uCiAgICAgSERDIGhkYyA9IHByZXBhcmVGb3JEcmF3aW5nKGkuY29u
dGV4dCwgcik7ICAKICAgICBSRUNUIHdpZGdldFJlY3QgPSByOwotICAgIGlmIChtX3RoZW1lRExM
ICYmICFtX2J1dHRvblRoZW1lKQotICAgICAgICBtX2J1dHRvblRoZW1lID0gb3BlblRoZW1lKDAs
IEwiQnV0dG9uIik7Ci0gICAgaWYgKG1fYnV0dG9uVGhlbWUgJiYgZHJhd1RoZW1lQkcpIHsKLSAg
ICAgICAgZHJhd1RoZW1lQkcobV9idXR0b25UaGVtZSwgaGRjLCB0aGVtZURhdGEubV9wYXJ0LCB0
aGVtZURhdGEubV9zdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgIGlmICh1eHRoZW1lTGli
cmFyeSgpICYmICFtX2J1dHRvblRoZW1lKQorICAgICAgICBtX2J1dHRvblRoZW1lID0gT3BlblRo
ZW1lRGF0YSgwLCBMIkJ1dHRvbiIpOworICAgIGlmIChtX2J1dHRvblRoZW1lKSB7CisgICAgICAg
IERyYXdUaGVtZUJhY2tncm91bmQobV9idXR0b25UaGVtZSwgaGRjLCB0aGVtZURhdGEubV9wYXJ0
LCB0aGVtZURhdGEubV9zdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOwogICAgIH0gZWxzZSB7CiAg
ICAgICAgIGlmICgodGhlbWVEYXRhLm1fcGFydCA9PSBCUF9CVVRUT04pICYmIGlzRm9jdXNlZChv
KSkgewogICAgICAgICAgICAgLy8gRHJhdyBibGFjayBmb2N1cyByZWN0IGFyb3VuZCBidXR0b24g
b3V0ZXIgZWRnZQpAQCAtMjY0LDE1ICsyNjYsNDIgQEAgYm9vbCBSZW5kZXJUaGVtZVdpbjo6cGFp
bnRCdXR0b24oUmVuZGVyTwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIERyYXdG
cmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgREZDX0JVVFRPTiwgdGhlbWVEYXRhLm1fY2xh
c3NpY1N0YXRlKTsKLSAgICAgICAgaWYgKCh0aGVtZURhdGEubV9wYXJ0ICE9IEJQX0JVVFRPTikg
JiYgaXNGb2N1c2VkKG8pKSB7CisgICAgICAgIGlmICgodGhlbWVEYXRhLm1fcGFydCAhPSBCUF9C
VVRUT04pICYmIGlzRm9jdXNlZChvKSkKICAgICAgICAgICAgIERyYXdGb2N1c1JlY3QoaGRjLCAm
d2lkZ2V0UmVjdCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgZG9uZURyYXdpbmcoaS5jb250ZXh0
LCBoZGMsIHIpOwogCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFJlbmRlclRoZW1lV2lu
OjpwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHIs
IHVuc2lnbmVkIHN0YXRlLCB1bnNpZ25lZCBzaXplKQoreworICAgIFBsYXRmb3JtR3JhcGhpY3ND
b250ZXh0KiBjdHggPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBzdGF0ZSA9IFRT
X0FDVElWRTsKKworICAgICAvLyBOb3cgcGFpbnQgdGhlIGJ1dHRvbi4KKyAgICAgSERDIGhkYyA9
IHByZXBhcmVGb3JEcmF3aW5nKGNvbnRleHQsIHIpOyAgCisgICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9
IHI7CisgICAgIGlmICh1eHRoZW1lTGlicmFyeSgpICYmICFtX2J1dHRvblRoZW1lKQorICAgICAg
ICAgbV9idXR0b25UaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJCdXR0b24iKTsKKyAgICAgaWYg
KG1fYnV0dG9uVGhlbWUpIHsKKyAgICAgICAgIERyYXdUaGVtZUJhY2tncm91bmQobV9idXR0b25U
aGVtZSwgaGRjLCBCUF9CVVRUT04sIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgLy8gRHJhdyBibGFjayBmb2N1
cyByZWN0IGFyb3VuZCBidXR0b24gb3V0ZXIgZWRnZQorICAgICAgICAgICAgSEJSVVNIIGJydXNo
ID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl8zRERLU0hBRE9XKTsKKyAgICAgICAgICAgIGlmIChi
cnVzaCkgeworICAgICAgICAgICAgICAgIEZyYW1lUmVjdChoZGMsICZ3aWRnZXRSZWN0LCBicnVz
aCk7CisgICAgICAgICAgICAgICAgSW5mbGF0ZVJlY3QoJndpZGdldFJlY3QsIC0xLCAtMSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3
aWRnZXRSZWN0LCBERkNfQlVUVE9OLCAwKTsKKyAgICB9CisgICAgZG9uZURyYXdpbmcoY29udGV4
dCwgaGRjLCByKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBSZW5kZXJUaGVtZVdp
bjo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKIHsKICAgICAvLyBJ
ZiB0aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBu
b3RoaW5nIHRvIGRvLgpAQCAtMjk3LDEwICszMjYsMTAgQEAgYm9vbCBSZW5kZXJUaGVtZVdpbjo6
cGFpbnRUZXh0RmllbGQoUmVuZAogICAgIC8vIE5vdyBwYWludCB0aGUgdGV4dCBmaWVsZC4KICAg
ICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoaS5jb250ZXh0LCByKTsKICAgICBSRUNUIHdp
ZGdldFJlY3QgPSByOwotICAgIGlmIChtX3RoZW1lRExMICYmICFtX3RleHRGaWVsZFRoZW1lKQot
ICAgICAgICBtX3RleHRGaWVsZFRoZW1lID0gb3BlblRoZW1lKDAsIEwiRWRpdCIpOwotICAgIGlm
IChtX3RleHRGaWVsZFRoZW1lICYmIGRyYXdUaGVtZUJHKSB7Ci0gICAgICAgIGRyYXdUaGVtZUJH
KG1fdGV4dEZpZWxkVGhlbWUsIGhkYywgdGhlbWVEYXRhLm1fcGFydCwgdGhlbWVEYXRhLm1fc3Rh
dGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICBpZiAodXh0aGVtZUxpYnJhcnkoKSAmJiAhbV90
ZXh0RmllbGRUaGVtZSkKKyAgICAgICAgbV90ZXh0RmllbGRUaGVtZSA9IE9wZW5UaGVtZURhdGEo
MCwgTCJFZGl0Iik7CisgICAgaWYgKG1fdGV4dEZpZWxkVGhlbWUpIHsKKyAgICAgICAgRHJhd1Ro
ZW1lQmFja2dyb3VuZChtX3RleHRGaWVsZFRoZW1lLCBoZGMsIHRoZW1lRGF0YS5tX3BhcnQsIHRo
ZW1lRGF0YS5tX3N0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CiAgICAgfSBlbHNlIHsKICAgICAg
ICAgRHJhd0VkZ2UoaGRjLCAmd2lkZ2V0UmVjdCwgRURHRV9TVU5LRU4sIEJGX1JFQ1QgfCBCRl9B
REpVU1QpOwogICAgICAgICBGaWxsUmVjdChoZGMsICZ3aWRnZXRSZWN0LCByZWludGVycHJldF9j
YXN0PEhCUlVTSD4oKCh0aGVtZURhdGEubV9jbGFzc2ljU3RhdGUgJiBERkNTX0lOQUNUSVZFKSA/
IENPTE9SX0JUTkZBQ0UgOiBDT0xPUl9XSU5ET1cpICsgMSkpOwpAQCAtMzQ1LDEwICszNzQsMTAg
QEAgYm9vbCBSZW5kZXJUaGVtZVdpbjo6cGFpbnRNZW51TGlzdEJ1dHRvbgogewogICAgIEhEQyBo
ZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhpLmNvbnRleHQsIHIpOwogICAgIFJFQ1Qgd2lkZ2V0UmVj
dCA9IHI7Ci0gICAgaWYgKG1fdGhlbWVETEwgJiYgIW1fbWVudUxpc3RUaGVtZSkKLSAgICAgICAg
bV9tZW51TGlzdFRoZW1lID0gb3BlblRoZW1lKDAsIEwiQ29tYm9ib3giKTsKLSAgICBpZiAobV9t
ZW51TGlzdFRoZW1lICYmIGRyYXdUaGVtZUJHKQotICAgICAgICBkcmF3VGhlbWVCRyhtX21lbnVM
aXN0VGhlbWUsIGhkYywgQ1BfRFJPUERPV05CVVRUT04sIGRldGVybWluZVN0YXRlKG8pLCAmd2lk
Z2V0UmVjdCwgTlVMTCk7CisgICAgaWYgKHV4dGhlbWVMaWJyYXJ5KCkgJiYgIW1fbWVudUxpc3RU
aGVtZSkKKyAgICAgICAgbV9tZW51TGlzdFRoZW1lID0gT3BlblRoZW1lRGF0YSgwLCBMIkNvbWJv
Ym94Iik7CisgICAgaWYgKG1fbWVudUxpc3RUaGVtZSkKKyAgICAgICAgRHJhd1RoZW1lQmFja2dy
b3VuZChtX21lbnVMaXN0VGhlbWUsIGhkYywgQ1BfRFJPUERPV05CVVRUT04sIGRldGVybWluZVN0
YXRlKG8pLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CiAgICAgZWxzZQogICAgICAgICBEcmF3RnJhbWVD
b250cm9sKGhkYywgJndpZGdldFJlY3QsIERGQ19TQ1JPTEwsIERGQ1NfU0NST0xMQ09NQk9CT1gg
fCBkZXRlcm1pbmVDbGFzc2ljU3RhdGUobykpOwogICAgIGRvbmVEcmF3aW5nKGkuY29udGV4dCwg
aGRjLCByKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4uaAkocmV2aXNpb24gMzA2
MDYpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5oCSh3b3JraW5nIGNvcHkp
CkBAIC02Nyw2ICs2Nyw3IEBAIHB1YmxpYzoKICAgICB7IHJldHVybiBzZXRDaGVja2JveFNpemUo
c3R5bGUpOyB9CiAKICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmly
dHVhbCBib29sIHBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmLCB1
bnNpZ25lZCwgdW5zaWduZWQpOwogCiAgICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxkKFJl
bmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOwogCkBAIC04OCwxMCArODksMTAgQEAgcHJpdmF0ZToKIAogICAgIFRoZW1lRGF0YSBnZXRU
aGVtZURhdGEoUmVuZGVyT2JqZWN0Kik7CiAgICAgCi0gICAgSE1PRFVMRSBtX3RoZW1lRExMOwog
ICAgIG11dGFibGUgSEFORExFIG1fYnV0dG9uVGhlbWU7CiAgICAgbXV0YWJsZSBIQU5ETEUgbV90
ZXh0RmllbGRUaGVtZTsKICAgICBtdXRhYmxlIEhBTkRMRSBtX21lbnVMaXN0VGhlbWU7CisgICAg
bXV0YWJsZSBIQU5ETEUgbV9zY3JvbGxCYXJUaGVtZTsKIH07CiAKIH07Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19394</attachid>
            <date>2008-02-26 20:03:40 -0800</date>
            <delta_ts>2008-02-26 22:15:03 -0800</delta_ts>
            <desc>Revision based on Bdash review.</desc>
            <filename>WinScrollbars.patch</filename>
            <type>text/plain</type>
            <size>50989</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiAzMDYwNSkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIsNiArMTEyLDkgQEAKICNk
ZWZpbmUgV1RGX1BMQVRGT1JNX0NBSVJPIDEKICNlbmRpZgogCisjaWYgUExBVEZPUk0oQ0cpCisj
ZGVmaW5lIFdURl9VU0VfU0FGQVJJX1RIRU1FIDEKKyNlbmRpZgogCiAjaWZkZWYgX19TNjBfXwog
Ly8gd2UgYXJlIGNyb3NzLWNvbXBpbGluZywgaXQgaXMgbm90IHJlYWxseSB3aW5kb3dzCkluZGV4
OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2
aXNpb24gMzA2MDYpCisrKyBXZWJDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI2IEBACisyMDA4LTAyLTI1ICBCcmVudCBGdWxnaGFtIDxiZnVsZ2hhbUBnbWFpbC5jb20+
CisKKyAgICAgICAgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0ODMK
KyAgICAgICAgSW1wbGVtZW50IHNjcm9sbGJhcnMgb24gV2luZG93cyAoQ2Fpcm8pCisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVT
VCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGxhdGZv
cm1TY3JvbGxCYXIuaDogIEFkZCB0aGVtZSBIQU5ETEUgbWVtYmVyIHRvCisgICAgICAgICAgc3Vw
cG9ydCBXaW5kb3dzLXN0eWxlIHNjcm9sbGJhcnMuCisgICAgICAgICogcGxhdGZvcm0vd2luL1Bs
YXRmcm9tU2Nyb2xsQmFyV2luLmNwcDogIER1cGxpY2F0ZSBpbXBsZW1lbnRhdGlvbgorICAgICAg
ICAgIGZyb20gUGxhdGZvcm1TY3JvbGxCYXJXaW5TYWZhcmkuY3BwLCB0aGVuIG1vZGlmeSB0byB1
c2UgdGhlCisgICAgICAgICAgbmF0aXZlIFdpbmRvd3MgdGhlbWUgZW5naW5lLiAgVXNlIFNPRlRf
TElOSworICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5jcHA6ICBDb3JyZWN0IG1z
ZG4gbGluayAoY2hhbmdlZCBzaW5jZQorICAgICAgICAgIGZpbGUgb3JpZ2luYWxseSBjcmVhdGVk
KSwgYWRkIGNvbnN0YW50cyBhbmQgbWVtYmVyIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgbmVl
ZGVkIGZvciBzY3JvbGxiYXJzLiAgQ29udmVydCB0byBTT0ZUX0xJTksKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lV2luOjpkZXRlcm1pbmVTdGF0ZSk6IEV4dGVuZCB0byByZWNvZ25pemUK
KyAgICAgICAgICBzY3JvbGxiYXIgcGFydHMuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZVdpbjo6cGFpbnRCdXR0b24pOiBBZGQgbmV3IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgZm9y
IGRyYXdpbmcgYnV0dG9ucyBnaXZlbiBhIGdyYXBoaWMgY29udGV4dCBhbmQgYm91bmRpbmcgYm94
LgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5oCisKIDIwMDgtMDItMjYgIERh
dmlkIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhbgpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCShyZXZpc2lvbiAz
MDYwNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgJKHdvcmtp
bmcgY29weSkKQEAgLTEwNiw2ICsxMDYsMTAgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9wcmVzc2Vk
UG9zOwogICAgIFRpbWVyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3Njcm9sbFRpbWVyOwogICAgIGJv
b2wgbV9vdmVybGFwc1Jlc2l6ZXI7CisKKyNpZiAhVVNFKFNBRkFSSV9USEVNRSkKKyAgICBtdXRh
YmxlIEhBTkRMRSBtX3Njcm9sbEJhclRoZW1lOworI2VuZGlmCiB9OwogCiB9CkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCShyZXZpc2lvbiAz
MDQ1NikJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJTYWZhcmku
Y3BwOjMwNDU2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjYwIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorCisjaWZkZWYgVVNFX1NBRkFSSV9USEVNRSAKKworI2luY2x1ZGUgIlBsYXRm
b3JtU2Nyb2xsQmFyLmgiCisKKyNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKKyNpbmNsdWRlICJG
cmFtZVZpZXcuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQu
aCIKKyNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0Nv
cmVHcmFwaGljcy5oPgorI2luY2x1ZGUgPFNhZmFyaVRoZW1lL1NhZmFyaVRoZW1lLmg+CisKKy8v
IEZJWE1FOiBUaGVyZSBhcmUgcmVwYWludGluZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBzY3JvbGwg
YmFyIGJ1dHRvbnMnIHZpc3VhbCBvdmVyZmxvdy4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgU2FmYXJpVGhlbWU7CisKKy8v
IEZJWE1FOiBXZSBzaG91bGQgZ2V0IHRoZXNlIG51bWJlcnMgZnJvbSBTYWZhcmlUaGVtZQorc3Rh
dGljIGludCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjSG9y
aXpvbnRhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsV2lkdGhb
XSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbEhlaWdodFtdID0geyAxNSwgMTEg
fTsKK3N0YXRpYyBpbnQgY1JlYWxCdXR0b25MZW5ndGhbXSA9IHsgMjgsIDIxIH07CitzdGF0aWMg
aW50IGNCdXR0b25JbnNldFtdID0geyAxNCwgMTEgfTsKK3N0YXRpYyBpbnQgY0J1dHRvbkhpdElu
c2V0W10gPSB7IDMsIDIgfTsKKy8vIGNSZWFsQnV0dG9uTGVuZ3RoIC0gY0J1dHRvbkluc2V0Citz
dGF0aWMgaW50IGNCdXR0b25MZW5ndGhbXSA9IHsgMTQsIDEwIH07CitzdGF0aWMgaW50IGNUaHVt
YldpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVGh1bWJIZWlnaHRbXSA9IHsgMTUs
IDExIH07CitzdGF0aWMgaW50IGNUaHVtYk1pbkxlbmd0aFtdID0geyAyNiwgMjAgfTsKKworI2lm
ICFkZWZpbmVkKE5ERUJVRykgJiYgZGVmaW5lZChVU0VfREVCVUdfU0FGQVJJX1RIRU1FKQorU09G
VF9MSU5LX0RFQlVHX0xJQlJBUlkoU2FmYXJpVGhlbWUpCisjZWxzZQorU09GVF9MSU5LX0xJQlJB
UlkoU2FmYXJpVGhlbWUpCisjZW5kaWYKKworU09GVF9MSU5LKFNhZmFyaVRoZW1lLCBwYWludFRo
ZW1lUGFydCwgdm9pZCwgX19zdGRjYWxsLCAoVGhlbWVQYXJ0IHBhcnQsIENHQ29udGV4dFJlZiBj
b250ZXh0LCBjb25zdCBDR1JlY3QmIHJlY3QsIE5TQ29udHJvbFNpemUgc2l6ZSwgVGhlbWVDb250
cm9sU3RhdGUgc3RhdGUpLCAocGFydCwgY29udGV4dCwgcmVjdCwgc2l6ZSwgc3RhdGUpKQorCitj
b25zdCBkb3VibGUgY0luaXRpYWxUaW1lckRlbGF5ID0gMC4yNTsKK2NvbnN0IGRvdWJsZSBjTm9y
bWFsVGltZXJEZWxheSA9IDAuMDU7CisKK1BsYXRmb3JtU2Nyb2xsYmFyOjpQbGF0Zm9ybVNjcm9s
bGJhcihTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50
YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCisgICAgOiBTY3JvbGxiYXIoY2xpZW50
LCBvcmllbnRhdGlvbiwgc2l6ZSksIG1faG92ZXJlZFBhcnQoTm9QYXJ0KSwgbV9wcmVzc2VkUGFy
dChOb1BhcnQpLCBtX3ByZXNzZWRQb3MoMCksCisgICAgICBtX3Njcm9sbFRpbWVyKHRoaXMsICZQ
bGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQpLAorICAgICAgbV9vdmVybGFw
c1Jlc2l6ZXIoZmFsc2UpCit7CisgICAgLy8gT2J0YWluIHRoZSBjb3JyZWN0IHNjcm9sbGJhciBz
aXplcyBmcm9tIHRoZSBzeXN0ZW0uCisgICAgaWYgKCFjSG9yaXpvbnRhbFdpZHRoKSB7CisgICAg
ICAgIC8vIEZJWE1FOiBHZXQgbWV0aWNzIGZyb20gU2FmYXJpVGhlbWUKKyAgICB9CisKKyAgICBp
ZiAob3JpZW50YXRpb24gPT0gVmVydGljYWxTY3JvbGxiYXIpCisgICAgICAgIHNldEZyYW1lR2Vv
bWV0cnkoSW50UmVjdCgwLCAwLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRp
Y2FsSGVpZ2h0W2NvbnRyb2xTaXplKCldKSk7CisgICAgZWxzZQorICAgICAgICBzZXRGcmFtZUdl
b21ldHJ5KEludFJlY3QoMCwgMCwgY0hvcml6b250YWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0hv
cml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pKTsKK30KKworUGxhdGZvcm1TY3JvbGxiYXI6
On5QbGF0Zm9ybVNjcm9sbGJhcigpCit7CisgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQb3NpdGlvbigpCit7CisgICAgaW52
YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1i
UHJvcG9ydGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3N0YXRpYyBJbnRS
ZWN0IHRyYWNrUmVwYWludFJlY3QoY29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBTY3JvbGxiYXJP
cmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUp
Cit7CisgICAgSW50UmVjdCBwYWludFJlY3QodHJhY2tSZWN0KTsKKyAgICBpZiAob3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcGFpbnRSZWN0LmluZmxhdGVYKGNC
dXR0b25MZW5ndGhbY29udHJvbFNpemVdKTsKKyAgICBlbHNlCisgICAgICAgIHBhaW50UmVjdC5p
bmZsYXRlWShjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisKKyAgICByZXR1cm4gcGFpbnRS
ZWN0OworfQorCitzdGF0aWMgSW50UmVjdCBidXR0b25SZXBhaW50UmVjdChjb25zdCBJbnRSZWN0
JiBidXR0b25SZWN0LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFy
Q29udHJvbFNpemUgY29udHJvbFNpemUsIGJvb2wgc3RhcnQpCit7CisgICAgSW50UmVjdCBwYWlu
dFJlY3QoYnV0dG9uUmVjdCk7CisgICAgaWYgKG9yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIpIHsKKyAgICAgICAgcGFpbnRSZWN0LnNldFdpZHRoKGNSZWFsQnV0dG9uTGVuZ3RoW2Nv
bnRyb2xTaXplXSk7CisgICAgICAgIGlmICghc3RhcnQpCisgICAgICAgICAgICBwYWludFJlY3Qu
c2V0WChidXR0b25SZWN0LngoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBi
dXR0b25SZWN0LndpZHRoKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYWludFJlY3Quc2V0
SGVpZ2h0KGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisgICAgICAgIGlmICghc3Rh
cnQpCisgICAgICAgICAgICBwYWludFJlY3Quc2V0WShidXR0b25SZWN0LnkoKSAtIChjUmVhbEJ1
dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBidXR0b25SZWN0LmhlaWdodCgpKSk7CisgICAgfQor
CisgICAgcmV0dXJuIHBhaW50UmVjdDsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52
YWxpZGF0ZVRyYWNrKCkKK3sKKyAgICBJbnRSZWN0IHJlY3QgPSB0cmFja1JlcGFpbnRSZWN0KHRy
YWNrUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpKTsKKyAgICByZWN0Lm1vdmUo
LXgoKSwgLXkoKSk7CisgICAgaW52YWxpZGF0ZVJlY3QocmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OmludmFsaWRhdGVQYXJ0KFNjcm9sbGJhclBhcnQgcGFydCkKK3sKKyAgICBp
ZiAocGFydCA9PSBOb1BhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcmVzdWx0
OyAgICAKKyAgICBzd2l0Y2ggKHBhcnQpIHsKKyAgICAgICAgY2FzZSBCYWNrQnV0dG9uUGFydDoK
KyAgICAgICAgICAgIHJlc3VsdCA9IGJ1dHRvblJlcGFpbnRSZWN0KGJhY2tCdXR0b25SZWN0KCks
IG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHRydWUpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgRm9yd2FyZEJ1dHRvblBhcnQ6CisgICAgICAgICAgICByZXN1bHQgPSBi
dXR0b25SZXBhaW50UmVjdChmb3J3YXJkQnV0dG9uUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250
cm9sU2l6ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDog
eworICAgICAgICAgICAgSW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJU
aHVtYlJlY3Q7CisgICAgICAgICAgICBzcGxpdFRyYWNrKHRyYWNrUmVjdCgpLCBiZWZvcmVUaHVt
YlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOworICAgICAgICAgICAgaWYgKHBhcnQg
PT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBiZWZvcmVUaHVtYlJl
Y3Q7CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpCisgICAg
ICAgICAgICAgICAgcmVzdWx0ID0gYWZ0ZXJUaHVtYlJlY3Q7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgcmVzdWx0ID0gdGh1bWJSZWN0OworICAgICAgICB9CisgICAgfQorICAg
IHJlc3VsdC5tb3ZlKC14KCksIC15KCkpOworICAgIGludmFsaWRhdGVSZWN0KHJlc3VsdCk7Cit9
CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6d2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBX
aWRnZXQ6OndpZHRoKCk7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGVpZ2h0KCkgY29u
c3QKK3sKKyAgICByZXR1cm4gV2lkZ2V0OjpoZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNj
cm9sbGJhcjo6c2V0UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEdldCBvdXIg
d2luZG93IHJlc2l6ZXIgcmVjdCBhbmQgc2VlIGlmIHdlIG92ZXJsYXAuICBBZGp1c3QgdG8gYXZv
aWQgdGhlIG92ZXJsYXAKKyAgICAvLyBpZiBuZWNlc3NhcnkuCisgICAgSW50UmVjdCBhZGp1c3Rl
ZFJlY3QocmVjdCk7CisgICAgaWYgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygp
KSB7CisgICAgICAgIGJvb2wgb3ZlcmxhcHNSZXNpemVyID0gZmFsc2U7CisgICAgICAgIEZyYW1l
VmlldyogdmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICAgICAg
SW50UmVjdCByZXNpemVyUmVjdCA9IHZpZXctPndpbmRvd1Jlc2l6ZXJSZWN0KCk7CisgICAgICAg
IHJlc2l6ZXJSZWN0LnNldExvY2F0aW9uKHZpZXctPmNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRv
dyhyZXNpemVyUmVjdC5sb2NhdGlvbigpKSk7CisgICAgICAgIGlmIChyZWN0LmludGVyc2VjdHMo
cmVzaXplclJlY3QpKSB7CisgICAgICAgICAgICBpZiAob3JpZW50YXRpb24oKSA9PSBIb3Jpem9u
dGFsU2Nyb2xsYmFyKSB7CisgICAgICAgICAgICAgICAgaW50IG92ZXJsYXAgPSByZWN0LnJpZ2h0
KCkgLSByZXNpemVyUmVjdC54KCk7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYm
IHJlc2l6ZXJSZWN0LnJpZ2h0KCkgPj0gcmVjdC5yaWdodCgpKSB7CisgICAgICAgICAgICAgICAg
ICAgIGFkanVzdGVkUmVjdC5zZXRXaWR0aChyZWN0LndpZHRoKCkgLSBvdmVybGFwKTsKKyAgICAg
ICAgICAgICAgICAgICAgb3ZlcmxhcHNSZXNpemVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBvdmVybGFwID0gcmVj
dC5ib3R0b20oKSAtIHJlc2l6ZXJSZWN0LnkoKTsKKyAgICAgICAgICAgICAgICBpZiAob3Zlcmxh
cCA+IDAgJiYgcmVzaXplclJlY3QuYm90dG9tKCkgPj0gcmVjdC5ib3R0b20oKSkgeworICAgICAg
ICAgICAgICAgICAgICBhZGp1c3RlZFJlY3Quc2V0SGVpZ2h0KHJlY3QuaGVpZ2h0KCkgLSBvdmVy
bGFwKTsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHNSZXNpemVyID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3Zl
cmxhcHNSZXNpemVyICE9IG1fb3ZlcmxhcHNSZXNpemVyKSB7CisgICAgICAgICAgICBtX292ZXJs
YXBzUmVzaXplciA9IG92ZXJsYXBzUmVzaXplcjsKKyAgICAgICAgICAgIHZpZXctPmFkanVzdE92
ZXJsYXBwaW5nU2Nyb2xsYmFyQ291bnQobV9vdmVybGFwc1Jlc2l6ZXIgPyAxIDogLTEpOworICAg
ICAgICB9CisgICAgfQorCisgICAgc2V0RnJhbWVHZW9tZXRyeShhZGp1c3RlZFJlY3QpOworfQor
Cit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRQYXJlbnQoU2Nyb2xsVmlldyogcGFyZW50Vmll
dykKK3sKKyAgICBpZiAoIXBhcmVudFZpZXcgJiYgbV9vdmVybGFwc1Jlc2l6ZXIgJiYgcGFyZW50
KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZyYW1l
Vmlldyo+KHBhcmVudCgpKS0+YWRqdXN0T3ZlcmxhcHBpbmdTY3JvbGxiYXJDb3VudCgtMSk7Cisg
ICAgV2lkZ2V0OjpzZXRQYXJlbnQocGFyZW50Vmlldyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3Jv
bGxiYXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkICE9IGlz
RW5hYmxlZCgpKSB7CisgICAgICAgIFdpZGdldDo6c2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAg
ICAgaW52YWxpZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFp
bnQoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEludFJlY3QmIGRhbWFn
ZVJlY3QpCit7CisgICAgaWYgKGdyYXBoaWNzQ29udGV4dC0+dXBkYXRpbmdDb250cm9sVGludHMo
KSkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBpZiAoZ3JhcGhpY3NDb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIERvbid0IHBhaW50IGFueXRoaW5nIGlmIHRoZSBzY3JvbGxiYXIgZG9lc24n
dCBpbnRlcnNlY3QgdGhlIGRhbWFnZSByZWN0LgorICAgIGlmICghZnJhbWVHZW9tZXRyeSgpLmlu
dGVyc2VjdHMoZGFtYWdlUmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgdHJh
Y2sgPSB0cmFja1JlY3QoKTsKKyAgICBwYWludFRyYWNrKGdyYXBoaWNzQ29udGV4dCwgdHJhY2ss
IHRydWUsIGRhbWFnZVJlY3QpOworCisgICAgaWYgKGhhc0J1dHRvbnMoKSkgeworICAgICAgICBw
YWludEJ1dHRvbihncmFwaGljc0NvbnRleHQsIGJhY2tCdXR0b25SZWN0KCksIHRydWUsIGRhbWFn
ZVJlY3QpOworICAgICAgICBwYWludEJ1dHRvbihncmFwaGljc0NvbnRleHQsIGZvcndhcmRCdXR0
b25SZWN0KCksIGZhbHNlLCBkYW1hZ2VSZWN0KTsKKyAgICB9CisKKyAgICBpZiAoaGFzVGh1bWIo
KSAmJiBkYW1hZ2VSZWN0LmludGVyc2VjdHModHJhY2spKSB7CisgICAgICAgIEludFJlY3Qgc3Rh
cnRUcmFja1JlY3QsIHRodW1iUmVjdCwgZW5kVHJhY2tSZWN0OworICAgICAgICBzcGxpdFRyYWNr
KHRyYWNrLCBzdGFydFRyYWNrUmVjdCwgdGh1bWJSZWN0LCBlbmRUcmFja1JlY3QpOworICAgICAg
ICBwYWludFRodW1iKGdyYXBoaWNzQ29udGV4dCwgdGh1bWJSZWN0LCBkYW1hZ2VSZWN0KTsKKyAg
ICB9Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6Omhhc0J1dHRvbnMoKSBjb25zdAorewor
ICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgpKSA+PSAyICogKGNSZWFsQnV0dG9uTGVuZ3RoW2Nv
bnRyb2xTaXplKCldIC0gY0J1dHRvbkhpdEluc2V0W2NvbnRyb2xTaXplKCldKTsKK30KKworYm9v
bCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFzVGh1bWIoKSBjb25zdAoreworICAgIHJldHVybiBpc0Vu
YWJsZWQoKSAmJiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgo
KSA6IGhlaWdodCgpKSA+PSAyICogY0J1dHRvbkluc2V0W2NvbnRyb2xTaXplKCldICsgY1RodW1i
TWluTGVuZ3RoW2NvbnRyb2xTaXplKCldICsgMTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9s
bGJhcjo6YmFja0J1dHRvblJlY3QoKSBjb25zdAoreworICAgIC8vIE91ciBkZXNpcmVkIHJlY3Qg
aXMgZXNzZW50aWFsbHkgMTd4MTcuCisgICAgCisgICAgLy8gT3VyIGFjdHVhbCByZWN0IHdpbGwg
c2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFjZSB3aGVuCisgICAgLy8gd2UgaGF2ZSA8
IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhlIHNjcm9sbGJhcgorICAgIC8vIHRvIHNj
YWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlueSBzaXplcy4KKyAgICBpZiAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1cm4gSW50UmVjdCh4
KCksIHkoKSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRb
Y29udHJvbFNpemUoKV0pOworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCBjVmVydGljYWxX
aWR0aFtjb250cm9sU2l6ZSgpXSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisK
K0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmZvcndhcmRCdXR0b25SZWN0KCkgY29uc3QKK3sK
KyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2VudGlhbGx5IDE3eDE3LgorICAgIAorICAg
IC8vIE91ciBhY3R1YWwgcmVjdCB3aWxsIHNocmluayB0byBoYWxmIHRoZSBhdmFpbGFibGUgc3Bh
Y2Ugd2hlbgorICAgIC8vIHdlIGhhdmUgPCAzNCBwaXhlbHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRo
ZSBzY3JvbGxiYXIKKyAgICAvLyB0byBzY2FsZSBkb3duIGFuZCBmdW5jdGlvbiBldmVuIGF0IHRp
bnkgc2l6ZXMuCisKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
KQorICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyB3aWR0aCgpIC0gY0J1dHRvbkxlbmd0aFtj
b250cm9sU2l6ZSgpXSwgeSgpLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpv
bnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkg
KyBoZWlnaHQoKSAtIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbFdpZHRo
W2NvbnRyb2xTaXplKCldLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldKTsKK30KKworSW50
UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tSZWN0KCkgY29uc3QKK3sKKyAgICBpZiAobV9v
cmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIGlmICghaGFzQnV0
dG9ucygpKQorICAgICAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIHdpZHRoKCksIGNI
b3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICAgICAgcmV0dXJuIEludFJlY3Qo
eCgpICsgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgeSgpLCB3aWR0aCgpIC0gMiAqIGNC
dXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXpl
KCldKTsKKyAgICB9CisKKyAgICBpZiAoIWhhc0J1dHRvbnMoKSkKKyAgICAgICAgcmV0dXJuIElu
dFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBoZWlnaHQoKSk7
CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXpl
KCldLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgaGVpZ2h0KCkgLSAyICogY0J1dHRv
bkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6
OnRodW1iUmVjdCgpIGNvbnN0Cit7CisgICAgSW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRodW1i
UmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgc3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVmb3Jl
VGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICByZXR1cm4gdGh1bWJS
ZWN0OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0IEludFJl
Y3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJl
Y3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0KSBjb25zdAoreworICAgIC8vIFRoaXMgZnVuY3Rp
b24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhhdmUg
c29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFzdAorICAg
IC8vIG9uZSBvZiB0aGVtIGlzIG5vbi1lbXB0eS4KKyAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBv
c2l0aW9uKCk7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikg
eworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyB0aHVtYlBvcywg
dHJhY2tSZWN0LnkoKSArICh0cmFja1JlY3QuaGVpZ2h0KCkgLSBjVGh1bWJIZWlnaHRbY29udHJv
bFNpemUoKV0pIC8gMiwgdGh1bWJMZW5ndGgoKSwgY1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCld
KTsKKyAgICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0cmFj
a1JlY3QueSgpLCB0aHVtYlBvcywgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgYWZ0ZXJU
aHVtYlJlY3QgPSBJbnRSZWN0KHRodW1iUmVjdC54KCkgKyB0aHVtYlJlY3Qud2lkdGgoKSwgdHJh
Y2tSZWN0LnkoKSwgdHJhY2tSZWN0LnJpZ2h0KCkgLSB0aHVtYlJlY3QucmlnaHQoKSwgdHJhY2tS
ZWN0LmhlaWdodCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0
KHRyYWNrUmVjdC54KCkgKyAodHJhY2tSZWN0LndpZHRoKCkgLSBjVGh1bWJXaWR0aFtjb250cm9s
U2l6ZSgpXSkgLyAyLCB0cmFja1JlY3QueSgpICsgdGh1bWJQb3MsIGNUaHVtYldpZHRoW2NvbnRy
b2xTaXplKCldLCB0aHVtYkxlbmd0aCgpKTsKKyAgICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50
UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1JlY3QueSgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdGh1
bWJQb3MpOworICAgICAgICBhZnRlclRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwg
dGh1bWJSZWN0LnkoKSArIHRodW1iUmVjdC5oZWlnaHQoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRy
YWNrUmVjdC5ib3R0b20oKSAtIHRodW1iUmVjdC5ib3R0b20oKSk7CisgICAgfQorfQorCitpbnQg
UGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUG9zaXRpb24oKSBjb25zdAoreworICAgIGlmIChpc0Vu
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIChmbG9hdCltX2N1cnJlbnRQb3MgKiAodHJhY2tMZW5n
dGgoKSAtIHRodW1iTGVuZ3RoKCkpIC8gKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSk7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJMZW5ndGgoKSBj
b25zdAoreworICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
ZmxvYXQgcHJvcG9ydGlvbiA9IChmbG9hdCkobV92aXNpYmxlU2l6ZSkgLyBtX3RvdGFsU2l6ZTsK
KyAgICBpbnQgdHJhY2tMZW4gPSB0cmFja0xlbmd0aCgpOworICAgIGludCBsZW5ndGggPSBwcm9w
b3J0aW9uICogdHJhY2tMZW47CisgICAgaW50IG1pbkxlbmd0aCA9IGNUaHVtYk1pbkxlbmd0aFtj
b250cm9sU2l6ZSgpXTsKKyAgICBsZW5ndGggPSBtYXgobGVuZ3RoLCBtaW5MZW5ndGgpOworICAg
IGlmIChsZW5ndGggPiB0cmFja0xlbikKKyAgICAgICAgbGVuZ3RoID0gMDsgLy8gT25jZSB0aGUg
dGh1bWIgaXMgYmVsb3cgdGhlIHRyYWNrIGxlbmd0aCwgaXQganVzdCBnb2VzIGF3YXkgKHRvIG1h
a2UgbW9yZSByb29tIGZvciB0aGUgdHJhY2spLgorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2lu
dCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiAo
bV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRyYWNrUmVjdCgpLndpZHRo
KCkgOiB0cmFja1JlY3QoKS5oZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6
cGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0
LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlm
ICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3Qg
cGFpbnRSZWN0ID0gYnV0dG9uUmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJv
bFNpemUoKSwgc3RhcnQpOworICAgIAorICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBh
aW50UmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFRoZW1lUGFydCBwYXJ0OworICAgIFRo
ZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkp
CisgICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOworICAgIGlmIChtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbExlZnRB
cnJvd1BhcnQgOiBTY3JvbGxSaWdodEFycm93UGFydDsKKyAgICBlbHNlCisgICAgICAgIHBhcnQg
PSBzdGFydCA/IFNjcm9sbFVwQXJyb3dQYXJ0IDogU2Nyb2xsRG93bkFycm93UGFydDsKKworICAg
IGlmIChpc0VuYWJsZWQoKSkKKyAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgIGlm
ICgobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCAmJiBzdGFydCkKKyAgICAgICAgfHwg
KG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblBhcnQgJiYgIXN0YXJ0KSkKKyAgICAgICAg
c3RhdGUgfD0gUHJlc3NlZFN0YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNj
cm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0
ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VHJhY2soR3JhcGhpY3NDb250
ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRS
ZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkp
CisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcGFpbnRSZWN0ID0gaGFzQnV0dG9ucygp
ID8gdHJhY2tSZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpKSA6
IHJlY3Q7CisgICAgCisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVHJhY2tQYXJ0IDogVlNjcm9sbFRyYWNrUGFy
dDsKKyAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5p
c0FjdGl2ZSgpKQorICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICBpZiAoaGFzQnV0
dG9ucygpKQorICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisKKyAgICBwYWludFRoZW1l
UGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcGFpbnRSZWN0LCBjb250cm9s
U2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFy
Q29udHJvbFNpemUsIHN0YXRlKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRU
aHVtYihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0
IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJh
cnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMo
cmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRh
dGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gSFNjcm9sbFRodW1iUGFydCA6IFZTY3JvbGxU
aHVtYlBhcnQ7CisgICAgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIGlmIChtX2Ns
aWVudC0+aXNBY3RpdmUoKSkKKyAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgaWYg
KGlzRW5hYmxlZCgpKQorICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisKKyAgICBwYWlu
dFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29udHJv
bFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxh
ckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisKK1Njcm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxi
YXI6OmhpdFRlc3QoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaWYgKCFp
c0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIE5vUGFydDsKKworICAgIEludFBvaW50IG1vdXNl
UG9zaXRpb24gPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKTsKKyAgICBt
b3VzZVBvc2l0aW9uLm1vdmUoeCgpLCB5KCkpOworCisgICAgaWYgKGhhc0J1dHRvbnMoKSkgewor
ICAgICAgICBpZiAoYmFja0J1dHRvblJlY3QoKS5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAg
ICAgICAgICAgIHJldHVybiBCYWNrQnV0dG9uUGFydDsKKworICAgICAgICBpZiAoZm9yd2FyZEJ1
dHRvblJlY3QoKS5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBG
b3J3YXJkQnV0dG9uUGFydDsKKyAgICB9CisKKyAgICBpZiAoIWhhc1RodW1iKCkpCisgICAgICAg
IHJldHVybiBOb1BhcnQ7CisKKyAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tSZWN0KCk7CisgICAg
aWYgKHRyYWNrLmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKSB7CisgICAgICAgIEludFJlY3QgYmVm
b3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICBzcGxpdFRy
YWNrKHRyYWNrLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOwor
ICAgICAgICBpZiAoYmVmb3JlVGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAg
ICAgICAgICAgcmV0dXJuIEJhY2tUcmFja1BhcnQ7CisgICAgICAgIGlmICh0aHVtYlJlY3QuY29u
dGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4gVGh1bWJQYXJ0OworICAg
ICAgICByZXR1cm4gRm9yd2FyZFRyYWNrUGFydDsKKyAgICB9CisgICAgcmV0dXJuIE5vUGFydDsK
K30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3Qg
UGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1
bWJQYXJ0KSB7CisgICAgICAgIC8vIERyYWcgdGhlIHRodW1iLgorICAgICAgICBpbnQgdGh1bWJQ
b3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAgICAgIGludCB0aHVtYkxlbiA9IHRodW1iTGVuZ3Ro
KCk7CisgICAgICAgIGludCB0cmFja0xlbiA9IHRyYWNrTGVuZ3RoKCk7CisgICAgICAgIGludCBt
YXhQb3MgPSB0cmFja0xlbiAtIHRodW1iTGVuOworICAgICAgICBpbnQgZGVsdGEgPSAwOworICAg
ICAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAg
ICAgZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkgLSBt
X3ByZXNzZWRQb3M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbHRhID0gY29udmVydEZy
b21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgpIC0gbV9wcmVzc2VkUG9zOworCisgICAg
ICAgIGlmIChkZWx0YSA+IDApCisgICAgICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgZG93bi9y
aWdodC4KKyAgICAgICAgICAgIGRlbHRhID0gbWluKG1heFBvcyAtIHRodW1iUG9zLCBkZWx0YSk7
CisgICAgICAgIGVsc2UgaWYgKGRlbHRhIDwgMCkKKyAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBt
b3ZlZCB1cC9sZWZ0LgorICAgICAgICAgICAgZGVsdGEgPSBtYXgoLXRodW1iUG9zLCBkZWx0YSk7
CisKKyAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKKyAgICAgICAgICAgIHNldFZhbHVlKChmbG9h
dCkodGh1bWJQb3MgKyBkZWx0YSkgKiAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKSAvICh0
cmFja0xlbiAtIHRodW1iTGVuKSk7CisgICAgICAgICAgICBtX3ByZXNzZWRQb3MgKz0gdGh1bWJQ
b3NpdGlvbigpIC0gdGh1bWJQb3M7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIGlmIChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkKKyAgICAg
ICAgbV9wcmVzc2VkUG9zID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/
IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9t
Q29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLnkoKSk7CisKKyAgICBTY3JvbGxiYXJQYXJ0IHBh
cnQgPSBoaXRUZXN0KGV2dCk7ICAgIAorICAgIGlmIChwYXJ0ICE9IG1faG92ZXJlZFBhcnQpIHsK
KyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQgIT0gTm9QYXJ0KSB7CisgICAgICAgICAgICBpZiAo
cGFydCA9PSBtX3ByZXNzZWRQYXJ0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG1vdXNlIGlz
IG1vdmluZyBiYWNrIG92ZXIgdGhlIHByZXNzZWQgcGFydC4gIFdlCisgICAgICAgICAgICAgICAg
Ly8gbmVlZCB0byBzdGFydCB1cCB0aGUgdGltZXIgYWN0aW9uIGFnYWluLgorICAgICAgICAgICAg
ICAgIHN0YXJ0VGltZXJJZk5lZWRlZChjTm9ybWFsVGltZXJEZWxheSk7CisgICAgICAgICAgICAg
ICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgICAgICB9IGVsc2UgaWYg
KG1faG92ZXJlZFBhcnQgPT0gbV9wcmVzc2VkUGFydCkgeworICAgICAgICAgICAgICAgIC8vIFRo
ZSBtb3VzZSBpcyBsZWF2aW5nIHRoZSBwcmVzc2VkIHBhcnQuICBLaWxsIG91ciB0aW1lcgorICAg
ICAgICAgICAgICAgIC8vIGlmIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBzdG9wVGltZXJJZk5l
ZWRlZCgpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52YWxpZGF0ZVBh
cnQocGFydCk7CisgICAgICAgICAgICBpbnZhbGlkYXRlUGFydChtX2hvdmVyZWRQYXJ0KTsKKyAg
ICAgICAgfQorICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gcGFydDsKKyAgICB9IAorCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlT3V0RXZl
bnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaW52YWxpZGF0ZVBhcnQo
bV9ob3ZlcmVkUGFydCk7CisgICAgbV9ob3ZlcmVkUGFydCA9IE5vUGFydDsKKworICAgIHJldHVy
biB0cnVlOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZVByZXNzRXZl
bnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgbV9wcmVzc2VkUGFydCA9
IGhpdFRlc3QoZXZ0KTsKKyAgICBtX3ByZXNzZWRQb3MgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyID8gY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSku
eCgpIDogY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgpKTsKKyAgICBp
bnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQo
Y0luaXRpYWxUaW1lckRlbGF5KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQbGF0Zm9y
bVNjcm9sbGJhcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2
ZW50JiBldnQpCit7CisgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgbV9w
cmVzc2VkUGFydCA9IE5vUGFydDsKKyAgICBtX3ByZXNzZWRQb3MgPSAwOworICAgIHN0b3BUaW1l
cklmTmVlZGVkKCk7CisKKyAgICBpZiAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3
KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+ZnJhbWUoKS0+
ZXZlbnRIYW5kbGVyKCktPnNldE1vdXNlUHJlc3NlZChmYWxzZSk7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3RhcnRUaW1lcklmTmVlZGVkKGRvdWJs
ZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhlIHRodW1iLgorICAg
IGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gSGFuZGxlIHRoZSB0cmFjay4gIFdlIGhhbHQgdHJhY2sgc2Nyb2xsaW5nIG9uY2UgdGhlIHRo
dW1iIGlzIGxldmVsCisgICAgLy8gd2l0aCB1cy4KKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0g
QmFja1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpICYmIHRo
dW1iVW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQp
OworICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgLy8gV2UgY2FuJ3Qgc2Nyb2xsIGlmIHdlJ3ZlIGhpdCB0aGUgYmVnaW5uaW5n
IG9yIGVuZC4KKyAgICBTY3JvbGxEaXJlY3Rpb24gZGlyID0gcHJlc3NlZFBhcnRTY3JvbGxEaXJl
Y3Rpb24oKTsKKyAgICBpZiAoZGlyID09IFNjcm9sbFVwIHx8IGRpciA9PSBTY3JvbGxMZWZ0KSB7
CisgICAgICAgIGlmIChtX2N1cnJlbnRQb3MgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICB9IGVsc2UgeworICAgICAgICBpZiAobV9jdXJyZW50UG9zID09IG1fdG90YWxTaXplIC0gbV92
aXNpYmxlU2l6ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3Njcm9sbFRp
bWVyLnN0YXJ0T25lU2hvdChkZWxheSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnN0
b3BUaW1lcklmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9zY3JvbGxUaW1lci5pc0FjdGl2ZSgpKQor
ICAgICAgICBtX3Njcm9sbFRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJh
cjo6YXV0b3Njcm9sbFByZXNzZWRQYXJ0KGRvdWJsZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBk
byBhbnl0aGluZyBmb3IgdGhlIHRodW1iIG9yIGlmIG5vdGhpbmcgd2FzIHByZXNzZWQuCisgICAg
aWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gTm9QYXJ0
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBIYW5kbGUgdGhlIHRyYWNrLgorICAgIGlmICgo
bV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2Fy
ZFRyYWNrUGFydCkgJiYgdGh1bWJVbmRlck1vdXNlKCkpIHsKKyAgICAgICAgaW52YWxpZGF0ZVBh
cnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgIG1faG92ZXJlZFBhcnQgPSBUaHVtYlBhcnQ7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgdGhlIGFycm93cyBhbmQgdHJh
Y2suCisgICAgaWYgKHNjcm9sbChwcmVzc2VkUGFydFNjcm9sbERpcmVjdGlvbigpLCBwcmVzc2Vk
UGFydFNjcm9sbEdyYW51bGFyaXR5KCkpKQorICAgICAgICBzdGFydFRpbWVySWZOZWVkZWQoZGVs
YXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZChU
aW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4qKQoreworICAgIGF1dG9zY3JvbGxQcmVzc2VkUGFydChj
Tm9ybWFsVGltZXJEZWxheSk7Cit9CisKK1Njcm9sbERpcmVjdGlvbiBQbGF0Zm9ybVNjcm9sbGJh
cjo6cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKQoreworICAgIGlmIChtX29yaWVudGF0aW9u
ID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0g
QmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0KQorICAgICAg
ICAgICAgcmV0dXJuIFNjcm9sbExlZnQ7CisgICAgICAgIHJldHVybiBTY3JvbGxSaWdodDsKKyAg
ICB9IGVsc2UgeworICAgICAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCB8
fCBtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICByZXR1cm4gU2Ny
b2xsVXA7CisgICAgICAgIHJldHVybiBTY3JvbGxEb3duOworICAgIH0KK30KKworU2Nyb2xsR3Jh
bnVsYXJpdHkgUGxhdGZvcm1TY3JvbGxiYXI6OnByZXNzZWRQYXJ0U2Nyb2xsR3JhbnVsYXJpdHko
KQoreworICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1fcHJlc3Nl
ZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblBhcnQpCisgICAgICAgIHJldHVybiBTY3JvbGxCeUxpbmU7
CisgICAgcmV0dXJuIFNjcm9sbEJ5UGFnZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6
dGh1bWJVbmRlck1vdXNlKCkKK3sKKyAgICAvLyBDb25zdHJ1Y3QgYSByZWN0LgorICAgIEludFJl
Y3QgdGh1bWIgPSB0aHVtYlJlY3QoKTsKKyAgICB0aHVtYi5tb3ZlKC14KCksIC15KCkpOworICAg
IGludCBiZWdpbiA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gdGh1
bWIueCgpIDogdGh1bWIueSgpOworICAgIGludCBlbmQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLnJpZ2h0KCkgOiB0aHVtYi5ib3R0b20oKTsKKyAgICBy
ZXR1cm4gKGJlZ2luIDw9IG1fcHJlc3NlZFBvcyAmJiBtX3ByZXNzZWRQb3MgPCBlbmQpOworfQor
CitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6Omhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQoU2Nyb2xs
YmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNIb3Jpem9udGFsV2lk
dGhbY29udHJvbFNpemVdOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Ny
b2xsYmFyV2lkdGgoU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0
dXJuIGNWZXJ0aWNhbEhlaWdodFtjb250cm9sU2l6ZV07Cit9CisKK0ludFJlY3QgUGxhdGZvcm1T
Y3JvbGxiYXI6OndpbmRvd0NsaXBSZWN0KCkgY29uc3QKK3sKKyAgICBJbnRSZWN0IGNsaXBSZWN0
KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBjbGlwUmVjdCA9IGNvbnZlcnRUb0NvbnRh
aW5pbmdXaW5kb3coY2xpcFJlY3QpOworICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgY2xpcFJl
Y3QuaW50ZXJzZWN0KG1fY2xpZW50LT53aW5kb3dDbGlwUmVjdCgpKTsKKyAgICByZXR1cm4gY2xp
cFJlY3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRj
LCBjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Ny
b2xsYmFyOjpncmlwcGVyUmVjdChjb25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVD
aGFuZ2VkKCkKK3sKK30KKworfQorCisjZW5kaWYgLy8gZGVmaW5lZChVU0VfU0FGQVJJX1RIRU1F
KQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNw
cAkocmV2aXNpb24gMzA0NTYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9s
bEJhcldpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJp
Z2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMDggQnJlbnQgRnVsZ2hhbQogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC0yNSw4ICsyNiw2IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAotI2lmZGVmIFVTRV9T
QUZBUklfVEhFTUUgCi0KICNpbmNsdWRlICJQbGF0Zm9ybVNjcm9sbEJhci5oIgogCiAjaW5jbHVk
ZSAiRXZlbnRIYW5kbGVyLmgiCkBAIC0zNywxNyArMzYsNDAgQEAKICNpbmNsdWRlICJQbGF0Zm9y
bU1vdXNlRXZlbnQuaCIKICNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgogCi0jaW5jbHVkZSA8Q29y
ZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgotI2luY2x1ZGUgPFNhZmFyaVRoZW1lL1NhZmFyaVRo
ZW1lLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luLmgi
CiAKLS8vIEZJWE1FOiBUaGVyZSBhcmUgcmVwYWludGluZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBz
Y3JvbGwgYmFyIGJ1dHRvbnMnIHZpc3VhbCBvdmVyZmxvdy4KKy8vIEdlbmVyaWMgc3RhdGUgY29u
c3RhbnRzCisjZGVmaW5lIFRTX05PUk1BTCAgICAxCisjZGVmaW5lIFRTX0hPVkVSICAgICAyCisj
ZGVmaW5lIFRTX0FDVElWRSAgICAzCisjZGVmaW5lIFRTX0RJU0FCTEVEICA0CisjZGVmaW5lIFRT
X0ZPQ1VTRUQgICA1CisKKyNkZWZpbmUgQUJTX1VQTk9STUFMIDEKKyNkZWZpbmUgQUJTX0RPV05O
T1JNQUwgNQorI2RlZmluZSBBQlNfTEVGVE5PUk1BTCA5CisjZGVmaW5lIEFCU19SSUdIVE5PUk1B
TCAxMworCitjb25zdCB1bnNpZ25lZCBTUF9BQlNfSE9UX01PRElGSUVSID0gMTsKK2NvbnN0IHVu
c2lnbmVkIFNQX0FCU19QUkVTU0VEX01PRElGSUVSID0gMjsKK2NvbnN0IHVuc2lnbmVkIFNQX0FC
U19ESVNBQkxFX01PRElGSUVSID0gMzsKKworLy8gU2Nyb2xsYmFyIGNvbnN0YW50cworI2RlZmlu
ZSBTUF9CVVRUT04gMQorI2RlZmluZSBTUF9USFVNQkhPUiAyCisjZGVmaW5lIFNQX1RIVU1CVkVS
VCAzCisjZGVmaW5lIFNQX1RSQUNLU1RBUlRIT1IgNAorI2RlZmluZSBTUF9UUkFDS0VOREhPUiA1
CisjZGVmaW5lIFNQX1RSQUNLU1RBUlRWRVJUIDYKKyNkZWZpbmUgU1BfVFJBQ0tFTkRWRVJUIDcK
KyNkZWZpbmUgU1BfR1JJUFBFUkhPUiA4CisjZGVmaW5lIFNQX0dSSVBQRVJWRVJUIDkKIAogdXNp
bmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3Bh
Y2UgU2FmYXJpVGhlbWU7Ci0KIC8vIEZJWE1FOiBXZSBzaG91bGQgZ2V0IHRoZXNlIG51bWJlcnMg
ZnJvbSBTYWZhcmlUaGVtZQogc3RhdGljIGludCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1LCAx
MSB9Owogc3RhdGljIGludCBjSG9yaXpvbnRhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKQEAgLTYy
LDIxICs4NCw0NSBAQCBzdGF0aWMgaW50IGNUaHVtYldpZHRoW10gPSB7IDE1LCAxMSB9Owogc3Rh
dGljIGludCBjVGh1bWJIZWlnaHRbXSA9IHsgMTUsIDExIH07CiBzdGF0aWMgaW50IGNUaHVtYk1p
bkxlbmd0aFtdID0geyAyNiwgMjAgfTsKIAotI2lmICFkZWZpbmVkKE5ERUJVRykgJiYgZGVmaW5l
ZChVU0VfREVCVUdfU0FGQVJJX1RIRU1FKQotU09GVF9MSU5LX0RFQlVHX0xJQlJBUlkoU2FmYXJp
VGhlbWUpCi0jZWxzZQotU09GVF9MSU5LX0xJQlJBUlkoU2FmYXJpVGhlbWUpCi0jZW5kaWYKIAot
U09GVF9MSU5LKFNhZmFyaVRoZW1lLCBwYWludFRoZW1lUGFydCwgdm9pZCwgX19zdGRjYWxsLCAo
VGhlbWVQYXJ0IHBhcnQsIENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDR1JlY3QmIHJlY3Qs
IE5TQ29udHJvbFNpemUgc2l6ZSwgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUpLCAocGFydCwgY29u
dGV4dCwgcmVjdCwgc2l6ZSwgc3RhdGUpKQorLy8gTm90ZTogIENvcGllZCBmcm9tIFJlbmRlclRo
ZW1lV2luLiAgVGhlcmUgc2hvdWxkIGJlIHNvbWUgd2F5IHRvIGJldHRlcgorLy8gZW5jYXBzdWxh
dGUvc2hhcmUgdGhpcyBzdHVmZi4gIFNlZSBhbGwgUmVuZGVyVGhlbWVTYWZhcmkgZm9yIG1vcmUg
c3VjaCBzdHVmZi4uLgorLy8KKy8vIEFmdGVyIGRpc2N1c3Npb24gd2l0aCBBZGFtIFJvYmVuLCB3
ZSB3aWxsIG1ha2UgdGhlIHVnbHkgY2hvaWNlIG9mIGNvcHlpbmcgbG9naWMKKy8vIGZyb20gUmVu
ZGVyVGhlbWVXaW4gdW50aWwgdGhlIFRoZW1lIGxvZ2ljIGlzIHJlZmFjdG9yZWQKK1NPRlRfTElO
S19MSUJSQVJZKHV4dGhlbWUpCitTT0ZUX0xJTksodXh0aGVtZSwgT3BlblRoZW1lRGF0YSwgSEFO
RExFLCBXSU5BUEksIChIV05EIGh3bmQsIExQQ1dTVFIgcHN6Q2xhc3NMaXN0KSwgKGh3bmQsIHBz
ekNsYXNzTGlzdCkpCitTT0ZUX0xJTksodXh0aGVtZSwgQ2xvc2VUaGVtZURhdGEsIEhSRVNVTFQs
IFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUpLCAoaFRoZW1lKSkKK1NPRlRfTElOSyh1eHRoZW1lLCBE
cmF3VGhlbWVCYWNrZ3JvdW5kLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMg
aGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUKiBwUmVjdCwgY29uc3Qg
UkVDVCogcENsaXBSZWN0KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgcFJlY3Qs
IHBDbGlwUmVjdCkpCitTT0ZUX0xJTksodXh0aGVtZSwgRHJhd1RoZW1lRWRnZSwgSFJFU1VMVCwg
V0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIGludCBpU3RhdGVJ
ZCwgY29uc3QgUkVDVCogcFJlY3QsIHVuc2lnbmVkIHVFZGdlLCB1bnNpZ25lZCB1RmxhZ3MsIGNv
bnN0IFJFQ1QqIHBDbGlwUmVjdCksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRlSWQsIHBS
ZWN0LCB1RWRnZSwgdUZsYWdzLCBwQ2xpcFJlY3QpKQorU09GVF9MSU5LKHV4dGhlbWUsIEdldFRo
ZW1lQ29udGVudFJlY3QsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMs
IGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0LCBjb25zdCBSRUNU
KiBwQ29udGVudFJlY3QpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwg
cENvbnRlbnRSZWN0KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZVBhcnRTaXplLCBIUkVT
VUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlT
dGF0ZUlkLCBSRUNUKiBwUmVjdCwgaW50IHRzLCBTSVpFKiBwc3opLCAoaFRoZW1lLCBoZGMsIGlQ
YXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgdHMsIHBzeikpCitTT0ZUX0xJTksodXh0aGVtZSwgR2V0
VGhlbWVTeXNGb250LCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBpbnQgaUZvbnRJ
ZCwgT1VUIExPR0ZPTlQqIHBGb250KSwgKGhUaGVtZSwgaUZvbnRJZCwgcEZvbnQpKQorU09GVF9M
SU5LKHV4dGhlbWUsIEdldFRoZW1lQ29sb3IsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhl
bWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGludCBpUHJvcElkLCBPVVQg
Q09MT1JSRUYqIHBDb2xvciksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRlSWQsIGlQcm9w
SWQsIHBDb2xvcikpCisKKy8vIE1heSBuZWVkIHRvIGFkZCBzdHVmZiB0byB0aGVzZSBsYXRlciwg
c28ga2VlcCB0aGUgZ3JhcGhpY3MgY29udGV4dCByZXRyaWV2YWwvcmVsZWFzZSBpbiBzb21lIGhl
bHBlcnMuCitzdGF0aWMgSERDIHByZXBhcmVGb3JEcmF3aW5nKEdyYXBoaWNzQ29udGV4dCogZywg
Y29uc3QgSW50UmVjdCYgcikKK3sKKyAgICByZXR1cm4gZy0+Z2V0V2luZG93c0NvbnRleHQocik7
Cit9CisgCitzdGF0aWMgdm9pZCBkb25lRHJhd2luZyhHcmFwaGljc0NvbnRleHQqIGcsIEhEQyBo
ZGMsIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgZy0+cmVsZWFzZVdpbmRvd3NDb250ZXh0KGhk
Yywgcik7Cit9CisvLyBFbmQgQ29waWVkIGZyb20gUmVuZGVyVGhlbWVXaW4KIAogY29uc3QgZG91
YmxlIGNJbml0aWFsVGltZXJEZWxheSA9IDAuMjU7CiBjb25zdCBkb3VibGUgY05vcm1hbFRpbWVy
RGVsYXkgPSAwLjA1OwogCiBQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZvcm1TY3JvbGxiYXIoU2Ny
b2xsYmFyQ2xpZW50KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBT
Y3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotICAgIDogU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50
YXRpb24sIHNpemUpLCBtX2hvdmVyZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBhcnQoTm9QYXJ0
KSwgbV9wcmVzc2VkUG9zKDApLAotICAgICAgbV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1T
Y3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKSwKLSAgICAgIG1fb3ZlcmxhcHNSZXNpemVy
KGZhbHNlKQorICAgIDogU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUpCisgICAg
LCBtX2hvdmVyZWRQYXJ0KE5vUGFydCkKKyAgICAsIG1fcHJlc3NlZFBhcnQoTm9QYXJ0KQorICAg
ICwgbV9wcmVzc2VkUG9zKDApCisgICAgLCBtX3Njcm9sbFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNj
cm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQpCisgICAgLCBtX292ZXJsYXBzUmVzaXplcihm
YWxzZSkKKyAgICAsIG1fc2Nyb2xsQmFyVGhlbWUoMCkKIHsKICAgICAvLyBPYnRhaW4gdGhlIGNv
cnJlY3Qgc2Nyb2xsYmFyIHNpemVzIGZyb20gdGhlIHN5c3RlbS4KICAgICBpZiAoIWNIb3Jpem9u
dGFsV2lkdGgpIHsKQEAgLTkyLDYgKzEzOCwxNCBAQCBQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZv
cm1TY3JvbGxiYXIoU2NyCiBQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRmb3JtU2Nyb2xsYmFyKCkK
IHsKICAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworCisgICAgLy8gQ2xlYW51cCB0aGVtZSBzdHVm
ZgorICAgIGlmICghdXh0aGVtZUxpYnJhcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KG1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIENsb3NlVGhlbWVEYXRhKG1fc2Nyb2xsQmFyVGhl
bWUpOworICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSAwOwogfQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xs
YmFyOjp1cGRhdGVUaHVtYlBvc2l0aW9uKCkKQEAgLTMxMCw2ICszNjQsMTEgQEAgSW50UmVjdCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJSZWN0KCkgYwogICAgIHJldHVybiB0aHVtYlJlY3Q7CiB9
CiAKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBwZXJSZWN0KGNvbnN0IEludFJlY3Qm
IHRodW1iUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gSW50UmVjdCgpOworfQorCiB2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgSW50
UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFmdGVy
VGh1bWJSZWN0KSBjb25zdAogewogICAgIC8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZXZlbiBnZXQg
Y2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhhdmUgc29tZSBjb21iaW5hdGlvbiBv
ZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFzdApAQCAtMzU1LDY4ICs0MTQsMTM0IEBA
IGludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5ndGgoKSBjb24KIAogdm9pZCBQbGF0Zm9y
bVNjcm9sbGJhcjo6cGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJ
bnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25z
dAogewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCi0gICAgICAgIHJldHVybjsKLQog
ICAgIEludFJlY3QgcGFpbnRSZWN0ID0gYnV0dG9uUmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRh
dGlvbiwgY29udHJvbFNpemUoKSwgc3RhcnQpOwogICAgIAogICAgIGlmICghZGFtYWdlUmVjdC5p
bnRlcnNlY3RzKHBhaW50UmVjdCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIFRoZW1lUGFydCBw
YXJ0OwotICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKLSAgICBpZiAobV9jbGllbnQt
PmlzQWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOwotICAgIGlmIChtX29y
aWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCi0gICAgICAgIHBhcnQgPSBzdGFydCA/
IFNjcm9sbExlZnRBcnJvd1BhcnQgOiBTY3JvbGxSaWdodEFycm93UGFydDsKLSAgICBlbHNlCi0g
ICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbFVwQXJyb3dQYXJ0IDogU2Nyb2xsRG93bkFycm93
UGFydDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gMDsKKyAgICB1bnNpZ25lZCBzdGF0ZSA9IDA7Cisg
ICAgdW5zaWduZWQgY2xhc3NpY1BhcnQgPSAwOworICAgIHVuc2lnbmVkIGNsYXNzaWNTdGF0ZSA9
IDA7CiAKLSAgICBpZiAoaXNFbmFibGVkKCkpCi0gICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0
ZTsKLSAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgJiYgc3RhcnQpCi0g
ICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0b25QYXJ0ICYmICFzdGFydCkp
Ci0gICAgICAgIHN0YXRlIHw9IFByZXNzZWRTdGF0ZTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgc3RhdGUgPSBzdGFydCA/IEFCU19MRUZU
Tk9STUFMIDogQUJTX1JJR0hUTk9STUFMOworICAgICAgIGNsYXNzaWNQYXJ0ID0gc3RhcnQgPyBE
RkNTX1NDUk9MTExFRlQgOiBERkNTX1NDUk9MTFJJR0hUOworICAgIH0gZWxzZSB7CisgICAgICAg
c3RhdGUgPSBzdGFydCA/IEFCU19VUE5PUk1BTCA6IEFCU19ET1dOTk9STUFMOworICAgICAgIGNs
YXNzaWNQYXJ0ID0gc3RhcnQgPyBERkNTX1NDUk9MTFVQIDogREZDU19TQ1JPTExET1dOOworICAg
IH0KIAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgp
LCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29u
dHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworICAgIGlmICghaXNFbmFi
bGVkKCkpIHsKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJTX0RJU0FCTEVfTU9ESUZJRVI7CisgICAg
ICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0lOQUNUSVZFOworICAgIH0KKyAgICBlbHNlIGlmICgo
bV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCAmJiBzdGFydCkKKyAgICAgICAgICB8fCAo
bV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkQnV0dG9uUGFydCAmJiAhc3RhcnQpKQorICAgIHsKKyAg
ICAgICAgc3RhdGUgKz0gU1BfQUJTX1BSRVNTRURfTU9ESUZJRVI7CisgICAgICAgIGNsYXNzaWNT
dGF0ZSB8PSBERkNTX1BVU0hFRCB8IERGQ1NfRkxBVDsKKyAgICB9CisgICAgZWxzZSBpZiAobV9j
bGllbnQtPmlzQWN0aXZlKCkpCisgICAgeworICAgICAgIHN0YXRlICs9IFNQX0FCU19IT1RfTU9E
SUZJRVI7CisgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfSE9UOworICAgIH0KKworICAgIEhE
QyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByZWN0KTsKKyAgICBSRUNUIHdpZGdl
dFJlY3QgPSByZWN0OworICAgIGlmICghdXh0aGVtZUxpYnJhcnkoKSAmJiAhbV9zY3JvbGxCYXJU
aGVtZSkKKyAgICAgICAgbV9zY3JvbGxCYXJUaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJTY3Jv
bGxiYXIiKTsKKworICAgIGlmIChtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBEcmF3VGhlbWVC
YWNrZ3JvdW5kKG1fc2Nyb2xsQmFyVGhlbWUsIGhkYywgU1BfQlVUVE9OLCBzdGF0ZSwgJndpZGdl
dFJlY3QsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgRHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3
aWRnZXRSZWN0LCBjbGFzc2ljUGFydCwgY2xhc3NpY1N0YXRlKTsKKworICAgIGRvbmVEcmF3aW5n
KGNvbnRleHQsIGhkYywgcmVjdCk7CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50
VHJhY2soR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29s
IHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAogewotICAgIGlmICghU2Fm
YXJpVGhlbWVMaWJyYXJ5KCkpCi0gICAgICAgIHJldHVybjsKLQogICAgIEludFJlY3QgcGFpbnRS
ZWN0ID0gaGFzQnV0dG9ucygpID8gdHJhY2tSZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9u
LCBjb250cm9sU2l6ZSgpKSA6IHJlY3Q7CiAgICAgCiAgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVy
c2VjdHMocGFpbnRSZWN0KSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgVGhlbWVQYXJ0IHBhcnQg
PSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVHJhY2tQYXJ0
IDogVlNjcm9sbFRyYWNrUGFydDsKLSAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7Cisg
ICAgdW5zaWduZWQgcGFydCA9IDA7CisgICAgdW5zaWduZWQgY2xhc3NpY1BhcnQgPSBERkNfU0NS
T0xMOworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAg
ICAgcGFydCA9IHN0YXJ0ID8gU1BfVFJBQ0tTVEFSVEhPUiA6IFNQX1RSQUNLRU5ESE9SOworICAg
IGVsc2UKKyAgICAgICBwYXJ0ID0gc3RhcnQgPyBTUF9UUkFDS1NUQVJUVkVSVCA6IFNQX1RSQUNL
RU5EVkVSVDsKKworICAgIHVuc2lnbmVkIHN0YXRlID0gVFNfRElTQUJMRUQ7CisgICAgdW5zaWdu
ZWQgY2xhc3NpY1N0YXRlID0gREZDU19NT05POwogICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUo
KSkKLSAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgICAgIHN0YXRlIHw9IFRTX0FD
VElWRTsKKyAgICBlbHNlCisgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfSU5BQ1RJVkU7CisK
ICAgICBpZiAoaGFzQnV0dG9ucygpKQotICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7Cisg
ICAgICAgIHN0YXRlIHw9IFRTX05PUk1BTDsKIAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21h
bGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwg
c3RhdGUpOworICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByZWN0KTsK
KyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0OworICAgIGlmICh1eHRoZW1lTGlicmFyeSgpICYm
ICFtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBtX3Njcm9sbEJhclRoZW1lID0gT3BlblRoZW1l
RGF0YSgwLCBMIlNjcm9sbGJhciIpOworCisgICAgaWYgKG1fc2Nyb2xsQmFyVGhlbWUpCisgICAg
ICAgIERyYXdUaGVtZUJhY2tncm91bmQobV9zY3JvbGxCYXJUaGVtZSwgaGRjLCBwYXJ0LCBzdGF0
ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgRHJhd0ZyYW1lQ29udHJv
bChoZGMsICZ3aWRnZXRSZWN0LCBERkNfU0NST0xMLCBjbGFzc2ljU3RhdGUpOworCisgICAgZG9u
ZURyYXdpbmcoY29udGV4dCwgaGRjLCByZWN0KTsKIH0KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJh
cjo6cGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJl
Y3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0CiB7Ci0gICAgaWYgKCFTYWZhcmlU
aGVtZUxpYnJhcnkoKSkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgaWYgKCFkYW1hZ2VSZWN0Lmlu
dGVyc2VjdHMocmVjdCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIFRoZW1lUGFydCBwYXJ0ID0g
bV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gSFNjcm9sbFRodW1iUGFydCA6
IFZTY3JvbGxUaHVtYlBhcnQ7Ci0gICAgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUgPSAwOworICAg
IHVuc2lnbmVkIHBhcnQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/
IFNQX1RIVU1CSE9SIDogU1BfVEhVTUJWRVJUOworICAgIHVuc2lnbmVkIHN0YXRlID0gMDsKKwor
ICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAgIHN0YXRlICs9IFNQX0FCU19ESVNBQkxFX01P
RElGSUVSOworICAgIGVsc2UgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQorICAgICAgIHN0YXRl
ICs9IFNQX0FCU19IT1RfTU9ESUZJRVI7CisKKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdp
bmcoY29udGV4dCwgcmVjdCk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBpZiAo
dXh0aGVtZUxpYnJhcnkoKSAmJiAhbV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgbV9zY3JvbGxC
YXJUaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJTY3JvbGxiYXIiKTsKKworICAgIGlmIChtX3Nj
cm9sbEJhclRoZW1lKSB7CisgICAgICAgIERyYXdUaGVtZUJhY2tncm91bmQobV9zY3JvbGxCYXJU
aGVtZSwgaGRjLCBwYXJ0LCBzdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgICAgICBwYWlu
dEdyaXBwZXIoaGRjLCB3aWRnZXRSZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBIR0RJT0JK
IGhTYXZlQnJ1c2ggPSBTZWxlY3RPYmplY3QoaGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JU
TkZBQ0UpKTsKKyAgICAgICAgRHJhd0VkZ2UoaGRjLCAmd2lkZ2V0UmVjdCwgRURHRV9SQUlTRUQs
IEJGX1JFQ1QpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLGhTYXZlQnJ1c2gpOworICAgIH0K
KworICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByZWN0KSBj
b25zdAoreworICAgIHVuc2lnbmVkIHBhcnQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyKSA/IFNQX0dSSVBQRVJIT1IgOiBTUF9HUklQUEVSVkVSVDsKKyAgICB1bnNpZ25l
ZCBzdGF0ZSA9IDA7CisKICAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0
YXRlIHw9IEFjdGl2ZVN0YXRlOwotICAgIGlmIChpc0VuYWJsZWQoKSkKLSAgICAgICAgc3RhdGUg
fD0gRW5hYmxlZFN0YXRlOworICAgICAgICBzdGF0ZSB8PSBUU19BQ1RJVkU7CiAKLSAgICBwYWlu
dFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29udHJv
bFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxh
ckNvbnRyb2xTaXplLCBzdGF0ZSk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBp
ZiAodXh0aGVtZUxpYnJhcnkoKSAmJiAhbV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgbV9zY3Jv
bGxCYXJUaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJTY3JvbGxiYXIiKTsKKworICAgIGlmICht
X3Njcm9sbEJhclRoZW1lKQorICAgICAgICBEcmF3VGhlbWVCYWNrZ3JvdW5kKG1fc2Nyb2xsQmFy
VGhlbWUsIGhkYywgcGFydCwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKIH0KIAogU2Nyb2xs
YmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0VGVzdChjb25zdCBQbGF0Zm9ybU1vdXNlRXZl
bnQmIGV2dCkKQEAgLTQ0OCw2ICs1NzMsNyBAQCBTY3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xs
YmFyOjpoaXRUZXN0CiAgICAgICAgICAgICByZXR1cm4gVGh1bWJQYXJ0OwogICAgICAgICByZXR1
cm4gRm9yd2FyZFRyYWNrUGFydDsKICAgICB9CisKICAgICByZXR1cm4gTm9QYXJ0OwogfQogCkBA
IC00NzYsNyArNjAyLDcgQEAgYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VNb3Zl
RQogICAgICAgICAgICAgc2V0VmFsdWUoKGZsb2F0KSh0aHVtYlBvcyArIGRlbHRhKSAqIChtX3Rv
dGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpIC8gKHRyYWNrTGVuIC0gdGh1bWJMZW4pKTsKICAgICAg
ICAgICAgIG1fcHJlc3NlZFBvcyArPSB0aHVtYlBvc2l0aW9uKCkgLSB0aHVtYlBvczsKICAgICAg
ICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTYzNiwx
OSArNzYyLDEyIEBAIGludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dmVydGljYWxTY3JvbGxiYXIKIElu
dFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OndpbmRvd0NsaXBSZWN0KCkgY29uc3QKIHsKICAgICBJ
bnRSZWN0IGNsaXBSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKwogICAgIGNsaXBSZWN0
ID0gY29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhjbGlwUmVjdCk7CiAgICAgaWYgKG1fY2xpZW50
KQogICAgICAgICBjbGlwUmVjdC5pbnRlcnNlY3QobV9jbGllbnQtPndpbmRvd0NsaXBSZWN0KCkp
OwotICAgIHJldHVybiBjbGlwUmVjdDsKLX0KIAotdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFp
bnRHcmlwcGVyKEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Ci17Ci19Ci0KLUlu
dFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBwZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1i
UmVjdCkgY29uc3QKLXsKLSAgICByZXR1cm4gSW50UmVjdCgpOworICAgIHJldHVybiBjbGlwUmVj
dDsKIH0KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVDaGFuZ2VkKCkKQEAgLTY1Nyw0
ICs3NzYsMyBAQCB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVtZUNoYW5nZWQoKQogCiB9CiAK
LSNlbmRpZiAvLyBkZWZpbmVkKFVTRV9TQUZBUklfVEhFTUUpCkluZGV4OiBXZWJDb3JlL3JlbmRl
cmluZy9SZW5kZXJUaGVtZVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyVGhlbWVXaW4uY3BwCShyZXZpc2lvbiAzMDYwNikKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRoZW1lV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsMTIgKzI3LDE0IEBACiAj
aW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNs
dWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNvZnRMaW5raW5nLmgiCisKICNpbmNs
dWRlIDxjYWlyby13aW4zMi5oPgogCiAvKiAKICAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFy
ZSB1c2VkIHRvIGRldGVybWluZSBob3cgYSB3aWRnZXQgaXMgZHJhd24gdXNpbmcKICAqIFdpbmRv
d3MnIFRoZW1lIEFQSS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlbWUgcGFydHMgYW5kIHN0
YXRlcyBzZWUKLSAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFz
cD91cmw9L2xpYnJhcnkvZW4tdXMvc2hlbGxjYy9wbGF0Zm9ybS9jb21tY3Rscy91c2VyZXgvdG9w
aWNzL3BhcnRzYW5kc3RhdGVzLmFzcAorICogaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4t
dXMvbGlicmFyeS9iYjc3MzIxMChWUy44NSkuYXNweAogICovCiAjZGVmaW5lIFRIRU1FX0NPTE9S
IDIwNAogI2RlZmluZSBUSEVNRV9GT05UICAyMTAKQEAgLTUzLDM2ICs1NSwyOSBAQAogI2RlZmlu
ZSBURlBfVEVYVEZJRUxEIDEKICNkZWZpbmUgVEZTX1JFQURPTkxZICA2CiAKKy8vIFNjcm9sbGJh
ciBjb25zdGFudHMKKyNkZWZpbmUgU1BfQlVUVE9OIDEKKyNkZWZpbmUgU1BfVEhVTUJIT1IgMgor
I2RlZmluZSBTUF9USFVNQlZFUlQgMworI2RlZmluZSBTUF9UUkFDS1NUQVJUSE9SIDQKKyNkZWZp
bmUgU1BfVFJBQ0tFTkRIT1IgNQorI2RlZmluZSBTUF9UUkFDS1NUQVJUVkVSVCA2CisjZGVmaW5l
IFNQX1RSQUNLRU5EVkVSVCA3CisjZGVmaW5lIFNQX0dSSVBQRVJIT1IgOAorI2RlZmluZSBTUF9H
UklQUEVSVkVSVCA5CisKIC8vIENvbWJvYm94IGNvbnN0YW50cwogI2RlZmluZSBDUF9EUk9QRE9X
TkJVVFRPTiAxCiAKLXR5cGVkZWYgSEFORExFIChXSU5BUEkqb3BlblRoZW1lRGF0YVB0cikoSFdO
RCBod25kLCBMUENXU1RSIHBzekNsYXNzTGlzdCk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpj
bG9zZVRoZW1lRGF0YVB0cikoSEFORExFIGhUaGVtZSk7Ci10eXBlZGVmIEhSRVNVTFQgKFdJTkFQ
SSpkcmF3VGhlbWVCYWNrZ3JvdW5kUHRyKShIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBh
cnRJZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0
YXRlSWQsIGNvbnN0IFJFQ1QgKnBSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgUkVDVCogcENsaXBSZWN0KTsKLXR5cGVkZWYgSFJFU1VMVCAoV0lO
QVBJKmRyYXdUaGVtZUVkZ2VQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElk
LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJ
ZCwgY29uc3QgUkVDVCAqcFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1bnNpZ25lZCB1RWRnZSwgdW5zaWduZWQgdUZsYWdzLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVCogcENsaXBSZWN0KTsKLXR5cGVk
ZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lQ29udGVudFJlY3RQdHIpKEhBTkRMRSBoVGhlbWUs
IEhEQyBoZGMsIGludCBpUGFydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUKiBwUmVjdCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QqIHBDb250ZW50UmVjdCk7Ci10eXBlZGVm
IEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVtZVBhcnRTaXplUHRyKShIQU5ETEUgaFRoZW1lLCBIREMg
aGRjLCBpbnQgaVBhcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGludCBpU3RhdGVJZCwgUkVDVCogcHJjLCBpbnQgdHMsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBTSVpFKiBwc3opOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0
VGhlbWVTeXNGb250UHRyKShIQU5ETEUgaFRoZW1lLCBpbnQgaUZvbnRJZCwgT1VUIExPR0ZPTlQq
IHBGb250KTsKLXR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lQ29sb3JQdHIpKEhBTkRM
RSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbnQgaVN0YXRlSWQsIGludCBpUHJvcElkLCBPVVQgQ09MT1JSRUYqIHBGb250
KTsKLQotc3RhdGljIG9wZW5UaGVtZURhdGFQdHIgb3BlblRoZW1lID0gMDsKLXN0YXRpYyBjbG9z
ZVRoZW1lRGF0YVB0ciBjbG9zZVRoZW1lID0gMDsKLXN0YXRpYyBkcmF3VGhlbWVCYWNrZ3JvdW5k
UHRyIGRyYXdUaGVtZUJHID0gMDsKLXN0YXRpYyBkcmF3VGhlbWVFZGdlUHRyIGRyYXdUaGVtZUVk
Z2UgPSAwOwotc3RhdGljIGdldFRoZW1lQ29udGVudFJlY3RQdHIgZ2V0VGhlbWVDb250ZW50UmVj
dCA9IDA7Ci1zdGF0aWMgZ2V0VGhlbWVQYXJ0U2l6ZVB0ciBnZXRUaGVtZVBhcnRTaXplID0gMDsK
LXN0YXRpYyBnZXRUaGVtZVN5c0ZvbnRQdHIgZ2V0VGhlbWVTeXNGb250ID0gMDsKLXN0YXRpYyBn
ZXRUaGVtZUNvbG9yUHRyIGdldFRoZW1lQ29sb3IgPSAwOworU09GVF9MSU5LX0xJQlJBUlkodXh0
aGVtZSkKK1NPRlRfTElOSyh1eHRoZW1lLCBPcGVuVGhlbWVEYXRhLCBIQU5ETEUsIFdJTkFQSSwg
KEhXTkQgaHduZCwgTFBDV1NUUiBwc3pDbGFzc0xpc3QpLCAoaHduZCwgcHN6Q2xhc3NMaXN0KSkK
K1NPRlRfTElOSyh1eHRoZW1lLCBDbG9zZVRoZW1lRGF0YSwgSFJFU1VMVCwgV0lOQVBJLCAoSEFO
RExFIGhUaGVtZSksIChoVGhlbWUpKQorU09GVF9MSU5LKHV4dGhlbWUsIERyYXdUaGVtZUJhY2tn
cm91bmQsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFy
dElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0LCBjb25zdCBSRUNUKiBwQ2xpcFJl
Y3QpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgcENsaXBSZWN0KSkK
K1NPRlRfTElOSyh1eHRoZW1lLCBEcmF3VGhlbWVFZGdlLCBIUkVTVUxULCBXSU5BUEksIChIQU5E
TEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNU
KiBwUmVjdCwgdW5zaWduZWQgdUVkZ2UsIHVuc2lnbmVkIHVGbGFncywgY29uc3QgUkVDVCogcENs
aXBSZWN0KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgcFJlY3QsIHVFZGdlLCB1
RmxhZ3MsIHBDbGlwUmVjdCkpCitTT0ZUX0xJTksodXh0aGVtZSwgR2V0VGhlbWVDb250ZW50UmVj
dCwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQs
IGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCogcFJlY3QsIGNvbnN0IFJFQ1QqIHBDb250ZW50UmVj
dCksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRlSWQsIHBSZWN0LCBwQ29udGVudFJlY3Qp
KQorU09GVF9MSU5LKHV4dGhlbWUsIEdldFRoZW1lUGFydFNpemUsIEhSRVNVTFQsIFdJTkFQSSwg
KEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIFJFQ1Qq
IHBSZWN0LCBpbnQgdHMsIFNJWkUqIHBzeiksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRl
SWQsIHBSZWN0LCB0cywgcHN6KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZVN5c0ZvbnQs
IEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIGludCBpRm9udElkLCBPVVQgTE9HRk9O
VCogcEZvbnQpLCAoaFRoZW1lLCBpRm9udElkLCBwRm9udCkpCitTT0ZUX0xJTksodXh0aGVtZSwg
R2V0VGhlbWVDb2xvciwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywg
aW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgaW50IGlQcm9wSWQsIE9VVCBDT0xPUlJFRiogcENv
bG9yKSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgaVByb3BJZCwgcENvbG9yKSkK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC05Myw0MSArODgsMzIgQEAgUmVuZGVyVGhlbWUq
IHRoZW1lKCkKIH0KIAogUmVuZGVyVGhlbWVXaW46OlJlbmRlclRoZW1lV2luKCkKLTptX3RoZW1l
RExMKDApLCBtX2J1dHRvblRoZW1lKDApLCBtX3RleHRGaWVsZFRoZW1lKDApLCBtX21lbnVMaXN0
VGhlbWUoMCkKKyAgICA6IG1fYnV0dG9uVGhlbWUoMCkKKyAgICAsIG1fdGV4dEZpZWxkVGhlbWUo
MCkKKyAgICAsIG1fbWVudUxpc3RUaGVtZSgwKQogewotICAgIG1fdGhlbWVETEwgPSA6OkxvYWRM
aWJyYXJ5KEwidXh0aGVtZS5kbGwiKTsKLSAgICBpZiAobV90aGVtZURMTCkgewotICAgICAgICBv
cGVuVGhlbWUgPSAob3BlblRoZW1lRGF0YVB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAi
T3BlblRoZW1lRGF0YSIpOwotICAgICAgICBjbG9zZVRoZW1lID0gKGNsb3NlVGhlbWVEYXRhUHRy
KUdldFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJDbG9zZVRoZW1lRGF0YSIpOwotICAgICAgICBk
cmF3VGhlbWVCRyA9IChkcmF3VGhlbWVCYWNrZ3JvdW5kUHRyKUdldFByb2NBZGRyZXNzKG1fdGhl
bWVETEwsICJEcmF3VGhlbWVCYWNrZ3JvdW5kIik7Ci0gICAgICAgIGRyYXdUaGVtZUVkZ2UgPSAo
ZHJhd1RoZW1lRWRnZVB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiRHJhd1RoZW1lRWRn
ZSIpOwotICAgICAgICBnZXRUaGVtZUNvbnRlbnRSZWN0ID0gKGdldFRoZW1lQ29udGVudFJlY3RQ
dHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkdldFRoZW1lQmFja2dyb3VuZENvbnRlbnRS
ZWN0Iik7Ci0gICAgICAgIGdldFRoZW1lUGFydFNpemUgPSAoZ2V0VGhlbWVQYXJ0U2l6ZVB0cilH
ZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAiR2V0VGhlbWVQYXJ0U2l6ZSIpOwotICAgICAgICBn
ZXRUaGVtZVN5c0ZvbnQgPSAoZ2V0VGhlbWVTeXNGb250UHRyKUdldFByb2NBZGRyZXNzKG1fdGhl
bWVETEwsICJHZXRUaGVtZVN5c0ZvbnQiKTsKLSAgICAgICAgZ2V0VGhlbWVDb2xvciA9IChnZXRU
aGVtZUNvbG9yUHRyKUdldFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJHZXRUaGVtZUNvbG9yIik7
Ci0gICAgfQogfQogCiBSZW5kZXJUaGVtZVdpbjo6flJlbmRlclRoZW1lV2luKCkKIHsKLSAgICBp
ZiAoIW1fdGhlbWVETEwpCisgICAgaWYgKCF1eHRoZW1lTGlicmFyeSgpKQogICAgICAgICByZXR1
cm47CiAKICAgICBjbG9zZSgpOwotCi0gICAgOjpGcmVlTGlicmFyeShtX3RoZW1lRExMKTsKIH0K
IAogdm9pZCBSZW5kZXJUaGVtZVdpbjo6Y2xvc2UoKQogewogICAgIC8vIFRoaXMgbWV0aG9kIHdp
bGwgbmVlZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgT1MgdGhlbWUgY2hhbmdlcyB0byBmbHVzaCBv
dXIgY2FjaGVkIHRoZW1lcy4KICAgICBpZiAobV9idXR0b25UaGVtZSkKLSAgICAgICAgY2xvc2VU
aGVtZShtX2J1dHRvblRoZW1lKTsKKyAgICAgICAgQ2xvc2VUaGVtZURhdGEobV9idXR0b25UaGVt
ZSk7CiAgICAgaWYgKG1fdGV4dEZpZWxkVGhlbWUpCi0gICAgICAgIGNsb3NlVGhlbWUobV90ZXh0
RmllbGRUaGVtZSk7CisgICAgICAgIENsb3NlVGhlbWVEYXRhKG1fdGV4dEZpZWxkVGhlbWUpOwog
ICAgIGlmIChtX21lbnVMaXN0VGhlbWUpCi0gICAgICAgIGNsb3NlVGhlbWUobV9tZW51TGlzdFRo
ZW1lKTsKLSAgICBtX2J1dHRvblRoZW1lID0gbV90ZXh0RmllbGRUaGVtZSA9IG1fbWVudUxpc3RU
aGVtZSA9IDA7CisgICAgICAgIENsb3NlVGhlbWVEYXRhKG1fbWVudUxpc3RUaGVtZSk7CisgICAg
aWYgKG1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIENsb3NlVGhlbWVEYXRhKG1fc2Nyb2xsQmFy
VGhlbWUpOworICAgIG1fYnV0dG9uVGhlbWUgPSBtX3RleHRGaWVsZFRoZW1lID0gbV9tZW51TGlz
dFRoZW1lID0gbV9zY3JvbGxCYXJUaGVtZSA9IDA7CiB9CiAKIENvbG9yIFJlbmRlclRoZW1lV2lu
OjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0CkBAIC0xNjQs
OCArMTUwLDYgQEAgYm9vbCBSZW5kZXJUaGVtZVdpbjo6c3VwcG9ydHNGb2N1cyhFQXBwZQogICAg
ICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLQotICAgIHJl
dHVybiBmYWxzZTsKIH0KIAogdW5zaWduZWQgUmVuZGVyVGhlbWVXaW46OmRldGVybWluZVN0YXRl
KFJlbmRlck9iamVjdCogbykKQEAgLTIyMyw2ICsyMDcsMjQgQEAgVGhlbWVEYXRhIFJlbmRlclRo
ZW1lV2luOjpnZXRUaGVtZURhdGEoUgogICAgICAgICBjYXNlIFRleHRBcmVhQXBwZWFyYW5jZToK
ICAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBURlBfVEVYVEZJRUxEOwogICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xsYmFyVHJhY2tIb3Jpem9udGFsQXBwZWFyYW5jZToK
KyAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBTUF9UUkFDS1NUQVJUSE9SOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xsYmFyVHJhY2tWZXJ0aWNhbEFwcGVhcmFuY2U6
CisgICAgICAgICAgICByZXN1bHQubV9wYXJ0ID0gU1BfVFJBQ0tTVEFSVFZFUlQ7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JvbGxiYXJUaHVtYkhvcml6b250YWxBcHBlYXJh
bmNlOgorICAgICAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFNQX1RIVU1CSE9SOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xsYmFyVGh1bWJWZXJ0aWNhbEFwcGVhcmFuY2U6
CisgICAgICAgICAgICByZXN1bHQubV9wYXJ0ID0gU1BfVEhVTUJWRVJUOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xsYmFyR3JpcHBlckhvcml6b250YWxBcHBlYXJhbmNl
OgorICAgICAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFNQX0dSSVBQRVJIT1I7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JvbGxiYXJHcmlwcGVyVmVydGljYWxBcHBlYXJhbmNl
OgorICAgICAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFNQX0dSSVBQRVJWRVJUOworICAgICAgICAg
ICAgYnJlYWs7CiAgICAgfQogCiAgICAgcmVzdWx0Lm1fc3RhdGUgPSBkZXRlcm1pbmVTdGF0ZShv
KTsKQEAgLTI1MCwxMSArMjUyLDExIEBAIGJvb2wgUmVuZGVyVGhlbWVXaW46OnBhaW50QnV0dG9u
KFJlbmRlck8KICAgICAvLyBOb3cgcGFpbnQgdGhlIGJ1dHRvbi4KICAgICBIREMgaGRjID0gcHJl
cGFyZUZvckRyYXdpbmcoaS5jb250ZXh0LCByKTsgIAogICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHI7
Ci0gICAgaWYgKG1fdGhlbWVETEwgJiYgIW1fYnV0dG9uVGhlbWUpCi0gICAgICAgIG1fYnV0dG9u
VGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJCdXR0b24iKTsKLSAgICBpZiAobV9idXR0b25UaGVtZSAm
JiBkcmF3VGhlbWVCRykgewotICAgICAgICBkcmF3VGhlbWVCRyhtX2J1dHRvblRoZW1lLCBoZGMs
IHRoZW1lRGF0YS5tX3BhcnQsIHRoZW1lRGF0YS5tX3N0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7
Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAodXh0aGVtZUxpYnJhcnkoKSAmJiAhbV9idXR0b25UaGVt
ZSkKKyAgICAgICAgbV9idXR0b25UaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJCdXR0b24iKTsK
KyAgICBpZiAobV9idXR0b25UaGVtZSkKKyAgICAgICAgRHJhd1RoZW1lQmFja2dyb3VuZChtX2J1
dHRvblRoZW1lLCBoZGMsIHRoZW1lRGF0YS5tX3BhcnQsIHRoZW1lRGF0YS5tX3N0YXRlLCAmd2lk
Z2V0UmVjdCwgTlVMTCk7CisgICAgZWxzZSB7CiAgICAgICAgIGlmICgodGhlbWVEYXRhLm1fcGFy
dCA9PSBCUF9CVVRUT04pICYmIGlzRm9jdXNlZChvKSkgewogICAgICAgICAgICAgLy8gRHJhdyBi
bGFjayBmb2N1cyByZWN0IGFyb3VuZCBidXR0b24gb3V0ZXIgZWRnZQogICAgICAgICAgICAgSEJS
VVNIIGJydXNoID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl8zRERLU0hBRE9XKTsKQEAgLTI2NCwx
NSArMjY2LDQwIEBAIGJvb2wgUmVuZGVyVGhlbWVXaW46OnBhaW50QnV0dG9uKFJlbmRlck8KICAg
ICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBEcmF3RnJhbWVDb250cm9sKGhkYywgJndp
ZGdldFJlY3QsIERGQ19CVVRUT04sIHRoZW1lRGF0YS5tX2NsYXNzaWNTdGF0ZSk7Ci0gICAgICAg
IGlmICgodGhlbWVEYXRhLm1fcGFydCAhPSBCUF9CVVRUT04pICYmIGlzRm9jdXNlZChvKSkgewor
ICAgICAgICBpZiAoKHRoZW1lRGF0YS5tX3BhcnQgIT0gQlBfQlVUVE9OKSAmJiBpc0ZvY3VzZWQo
bykpCiAgICAgICAgICAgICBEcmF3Rm9jdXNSZWN0KGhkYywgJndpZGdldFJlY3QpOwotICAgICAg
ICB9CiAgICAgfQogICAgIGRvbmVEcmF3aW5nKGkuY29udGV4dCwgaGRjLCByKTsKIAogICAgIHJl
dHVybiBmYWxzZTsKIH0KIAorYm9vbCBSZW5kZXJUaGVtZVdpbjo6cGFpbnRCdXR0b24oR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByLCB1bnNpZ25lZCBzdGF0ZSwgdW5z
aWduZWQgc2l6ZSkKK3sKKyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogY3R4ID0gY29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgc3RhdGUgPSBUU19BQ1RJVkU7CisKKyAgICAvLyBO
b3cgcGFpbnQgdGhlIGJ1dHRvbi4KKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoY29u
dGV4dCwgcik7ICAKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByOworICAgIGlmICh1eHRoZW1lTGli
cmFyeSgpICYmICFtX2J1dHRvblRoZW1lKQorICAgICAgICBtX2J1dHRvblRoZW1lID0gT3BlblRo
ZW1lRGF0YSgwLCBMIkJ1dHRvbiIpOworICAgIGlmIChtX2J1dHRvblRoZW1lKQorICAgICAgICBE
cmF3VGhlbWVCYWNrZ3JvdW5kKG1fYnV0dG9uVGhlbWUsIGhkYywgQlBfQlVUVE9OLCBzdGF0ZSwg
JndpZGdldFJlY3QsIE5VTEwpOworICAgIGVsc2UgeworICAgICAgICAvLyBEcmF3IGJsYWNrIGZv
Y3VzIHJlY3QgYXJvdW5kIGJ1dHRvbiBvdXRlciBlZGdlCisgICAgICAgIEhCUlVTSCBicnVzaCA9
IEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfM0RES1NIQURPVyk7CisgICAgICAgIGlmIChicnVzaCkg
eworICAgICAgICAgICAgRnJhbWVSZWN0KGhkYywgJndpZGdldFJlY3QsIGJydXNoKTsKKyAgICAg
ICAgICAgIEluZmxhdGVSZWN0KCZ3aWRnZXRSZWN0LCAtMSwgLTEpOworICAgICAgICB9CisgICAg
ICAgIERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgREZDX0JVVFRPTiwgMCk7Cisg
ICAgfQorICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcik7CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKIHZvaWQgUmVuZGVyVGhlbWVXaW46OnNldENoZWNrYm94U2l6ZShSZW5kZXJTdHls
ZSogc3R5bGUpIGNvbnN0CiB7CiAgICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJv
dGggc3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KQEAgLTI5NywxMSArMzI0
LDExIEBAIGJvb2wgUmVuZGVyVGhlbWVXaW46OnBhaW50VGV4dEZpZWxkKFJlbmQKICAgICAvLyBO
b3cgcGFpbnQgdGhlIHRleHQgZmllbGQuCiAgICAgSERDIGhkYyA9IHByZXBhcmVGb3JEcmF3aW5n
KGkuY29udGV4dCwgcik7CiAgICAgUkVDVCB3aWRnZXRSZWN0ID0gcjsKLSAgICBpZiAobV90aGVt
ZURMTCAmJiAhbV90ZXh0RmllbGRUaGVtZSkKLSAgICAgICAgbV90ZXh0RmllbGRUaGVtZSA9IG9w
ZW5UaGVtZSgwLCBMIkVkaXQiKTsKLSAgICBpZiAobV90ZXh0RmllbGRUaGVtZSAmJiBkcmF3VGhl
bWVCRykgewotICAgICAgICBkcmF3VGhlbWVCRyhtX3RleHRGaWVsZFRoZW1lLCBoZGMsIHRoZW1l
RGF0YS5tX3BhcnQsIHRoZW1lRGF0YS5tX3N0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7Ci0gICAg
fSBlbHNlIHsKKyAgICBpZiAodXh0aGVtZUxpYnJhcnkoKSAmJiAhbV90ZXh0RmllbGRUaGVtZSkK
KyAgICAgICAgbV90ZXh0RmllbGRUaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJFZGl0Iik7Cisg
ICAgaWYgKG1fdGV4dEZpZWxkVGhlbWUpCisgICAgICAgIERyYXdUaGVtZUJhY2tncm91bmQobV90
ZXh0RmllbGRUaGVtZSwgaGRjLCB0aGVtZURhdGEubV9wYXJ0LCB0aGVtZURhdGEubV9zdGF0ZSwg
JndpZGdldFJlY3QsIE5VTEwpOworICAgIGVsc2UgewogICAgICAgICBEcmF3RWRnZShoZGMsICZ3
aWRnZXRSZWN0LCBFREdFX1NVTktFTiwgQkZfUkVDVCB8IEJGX0FESlVTVCk7CiAgICAgICAgIEZp
bGxSZWN0KGhkYywgJndpZGdldFJlY3QsIHJlaW50ZXJwcmV0X2Nhc3Q8SEJSVVNIPigoKHRoZW1l
RGF0YS5tX2NsYXNzaWNTdGF0ZSAmIERGQ1NfSU5BQ1RJVkUpID8gQ09MT1JfQlRORkFDRSA6IENP
TE9SX1dJTkRPVykgKyAxKSk7CiAgICAgfQpAQCAtMzQ1LDEwICszNzIsMTAgQEAgYm9vbCBSZW5k
ZXJUaGVtZVdpbjo6cGFpbnRNZW51TGlzdEJ1dHRvbgogewogICAgIEhEQyBoZGMgPSBwcmVwYXJl
Rm9yRHJhd2luZyhpLmNvbnRleHQsIHIpOwogICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHI7Ci0gICAg
aWYgKG1fdGhlbWVETEwgJiYgIW1fbWVudUxpc3RUaGVtZSkKLSAgICAgICAgbV9tZW51TGlzdFRo
ZW1lID0gb3BlblRoZW1lKDAsIEwiQ29tYm9ib3giKTsKLSAgICBpZiAobV9tZW51TGlzdFRoZW1l
ICYmIGRyYXdUaGVtZUJHKQotICAgICAgICBkcmF3VGhlbWVCRyhtX21lbnVMaXN0VGhlbWUsIGhk
YywgQ1BfRFJPUERPV05CVVRUT04sIGRldGVybWluZVN0YXRlKG8pLCAmd2lkZ2V0UmVjdCwgTlVM
TCk7CisgICAgaWYgKHV4dGhlbWVMaWJyYXJ5KCkgJiYgIW1fbWVudUxpc3RUaGVtZSkKKyAgICAg
ICAgbV9tZW51TGlzdFRoZW1lID0gT3BlblRoZW1lRGF0YSgwLCBMIkNvbWJvYm94Iik7CisgICAg
aWYgKG1fbWVudUxpc3RUaGVtZSkKKyAgICAgICAgRHJhd1RoZW1lQmFja2dyb3VuZChtX21lbnVM
aXN0VGhlbWUsIGhkYywgQ1BfRFJPUERPV05CVVRUT04sIGRldGVybWluZVN0YXRlKG8pLCAmd2lk
Z2V0UmVjdCwgTlVMTCk7CiAgICAgZWxzZQogICAgICAgICBEcmF3RnJhbWVDb250cm9sKGhkYywg
JndpZGdldFJlY3QsIERGQ19TQ1JPTEwsIERGQ1NfU0NST0xMQ09NQk9CT1ggfCBkZXRlcm1pbmVD
bGFzc2ljU3RhdGUobykpOwogICAgIGRvbmVEcmF3aW5nKGkuY29udGV4dCwgaGRjLCByKTsKSW5k
ZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4uaAkocmV2aXNpb24gMzA2MDYpCisrKyBXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5oCSh3b3JraW5nIGNvcHkpCkBAIC02Nyw2ICs2
Nyw3IEBAIHB1YmxpYzoKICAgICB7IHJldHVybiBzZXRDaGVja2JveFNpemUoc3R5bGUpOyB9CiAK
ICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCBib29sIHBh
aW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmLCB1bnNpZ25lZCwgdW5z
aWduZWQpOwogCiAgICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCos
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwogCkBAIC04
OCwxMCArODksMTAgQEAgcHJpdmF0ZToKIAogICAgIFRoZW1lRGF0YSBnZXRUaGVtZURhdGEoUmVu
ZGVyT2JqZWN0Kik7CiAgICAgCi0gICAgSE1PRFVMRSBtX3RoZW1lRExMOwogICAgIG11dGFibGUg
SEFORExFIG1fYnV0dG9uVGhlbWU7CiAgICAgbXV0YWJsZSBIQU5ETEUgbV90ZXh0RmllbGRUaGVt
ZTsKICAgICBtdXRhYmxlIEhBTkRMRSBtX21lbnVMaXN0VGhlbWU7CisgICAgbXV0YWJsZSBIQU5E
TEUgbV9zY3JvbGxCYXJUaGVtZTsKIH07CiAKIH07Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19395</attachid>
            <date>2008-02-26 22:15:03 -0800</date>
            <delta_ts>2008-02-27 15:08:50 -0800</delta_ts>
            <desc>Revise to use proper 17-pixel width scrollbars</desc>
            <filename>WinScrollbars.patch</filename>
            <type>text/plain</type>
            <size>51528</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiAzMDYwNSkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIsNiArMTEyLDkgQEAKICNk
ZWZpbmUgV1RGX1BMQVRGT1JNX0NBSVJPIDEKICNlbmRpZgogCisjaWYgUExBVEZPUk0oQ0cpCisj
ZGVmaW5lIFdURl9VU0VfU0FGQVJJX1RIRU1FIDEKKyNlbmRpZgogCiAjaWZkZWYgX19TNjBfXwog
Ly8gd2UgYXJlIGNyb3NzLWNvbXBpbGluZywgaXQgaXMgbm90IHJlYWxseSB3aW5kb3dzCkluZGV4
OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2
aXNpb24gMzA2MDYpCisrKyBXZWJDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDI2IEBACisyMDA4LTAyLTI1ICBCcmVudCBGdWxnaGFtIDxiZnVsZ2hhbUBnbWFpbC5jb20+
CisKKyAgICAgICAgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0ODMK
KyAgICAgICAgSW1wbGVtZW50IHNjcm9sbGJhcnMgb24gV2luZG93cyAoQ2Fpcm8pCisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVT
VCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGxhdGZv
cm1TY3JvbGxCYXIuaDogIEFkZCB0aGVtZSBIQU5ETEUgbWVtYmVyIHRvCisgICAgICAgICAgc3Vw
cG9ydCBXaW5kb3dzLXN0eWxlIHNjcm9sbGJhcnMuCisgICAgICAgICogcGxhdGZvcm0vd2luL1Bs
YXRmcm9tU2Nyb2xsQmFyV2luLmNwcDogIER1cGxpY2F0ZSBpbXBsZW1lbnRhdGlvbgorICAgICAg
ICAgIGZyb20gUGxhdGZvcm1TY3JvbGxCYXJXaW5TYWZhcmkuY3BwLCB0aGVuIG1vZGlmeSB0byB1
c2UgdGhlCisgICAgICAgICAgbmF0aXZlIFdpbmRvd3MgdGhlbWUgZW5naW5lLiAgVXNlIFNPRlRf
TElOSworICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5jcHA6ICBDb3JyZWN0IG1z
ZG4gbGluayAoY2hhbmdlZCBzaW5jZQorICAgICAgICAgIGZpbGUgb3JpZ2luYWxseSBjcmVhdGVk
KSwgYWRkIGNvbnN0YW50cyBhbmQgbWVtYmVyIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgbmVl
ZGVkIGZvciBzY3JvbGxiYXJzLiAgQ29udmVydCB0byBTT0ZUX0xJTksKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lV2luOjpkZXRlcm1pbmVTdGF0ZSk6IEV4dGVuZCB0byByZWNvZ25pemUK
KyAgICAgICAgICBzY3JvbGxiYXIgcGFydHMuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZVdpbjo6cGFpbnRCdXR0b24pOiBBZGQgbmV3IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgZm9y
IGRyYXdpbmcgYnV0dG9ucyBnaXZlbiBhIGdyYXBoaWMgY29udGV4dCBhbmQgYm91bmRpbmcgYm94
LgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5oCisKIDIwMDgtMDItMjYgIERh
dmlkIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhbgpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCShyZXZpc2lvbiAz
MDYwNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgJKHdvcmtp
bmcgY29weSkKQEAgLTEwNiw2ICsxMDYsMTAgQEAgcHJpdmF0ZToKICAgICBpbnQgbV9wcmVzc2Vk
UG9zOwogICAgIFRpbWVyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3Njcm9sbFRpbWVyOwogICAgIGJv
b2wgbV9vdmVybGFwc1Jlc2l6ZXI7CisKKyNpZiAhVVNFKFNBRkFSSV9USEVNRSkKKyAgICBtdXRh
YmxlIEhBTkRMRSBtX3Njcm9sbEJhclRoZW1lOworI2VuZGlmCiB9OwogCiB9CkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCShyZXZpc2lvbiAz
MDQ1NikJKGZyb20gV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJTYWZhcmku
Y3BwOjMwNDU2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjYwIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorCisjaWZkZWYgVVNFX1NBRkFSSV9USEVNRSAKKworI2luY2x1ZGUgIlBsYXRm
b3JtU2Nyb2xsQmFyLmgiCisKKyNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKKyNpbmNsdWRlICJG
cmFtZVZpZXcuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQu
aCIKKyNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0Nv
cmVHcmFwaGljcy5oPgorI2luY2x1ZGUgPFNhZmFyaVRoZW1lL1NhZmFyaVRoZW1lLmg+CisKKy8v
IEZJWE1FOiBUaGVyZSBhcmUgcmVwYWludGluZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBzY3JvbGwg
YmFyIGJ1dHRvbnMnIHZpc3VhbCBvdmVyZmxvdy4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgU2FmYXJpVGhlbWU7CisKKy8v
IEZJWE1FOiBXZSBzaG91bGQgZ2V0IHRoZXNlIG51bWJlcnMgZnJvbSBTYWZhcmlUaGVtZQorc3Rh
dGljIGludCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjSG9y
aXpvbnRhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsV2lkdGhb
XSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbEhlaWdodFtdID0geyAxNSwgMTEg
fTsKK3N0YXRpYyBpbnQgY1JlYWxCdXR0b25MZW5ndGhbXSA9IHsgMjgsIDIxIH07CitzdGF0aWMg
aW50IGNCdXR0b25JbnNldFtdID0geyAxNCwgMTEgfTsKK3N0YXRpYyBpbnQgY0J1dHRvbkhpdElu
c2V0W10gPSB7IDMsIDIgfTsKKy8vIGNSZWFsQnV0dG9uTGVuZ3RoIC0gY0J1dHRvbkluc2V0Citz
dGF0aWMgaW50IGNCdXR0b25MZW5ndGhbXSA9IHsgMTQsIDEwIH07CitzdGF0aWMgaW50IGNUaHVt
YldpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVGh1bWJIZWlnaHRbXSA9IHsgMTUs
IDExIH07CitzdGF0aWMgaW50IGNUaHVtYk1pbkxlbmd0aFtdID0geyAyNiwgMjAgfTsKKworI2lm
ICFkZWZpbmVkKE5ERUJVRykgJiYgZGVmaW5lZChVU0VfREVCVUdfU0FGQVJJX1RIRU1FKQorU09G
VF9MSU5LX0RFQlVHX0xJQlJBUlkoU2FmYXJpVGhlbWUpCisjZWxzZQorU09GVF9MSU5LX0xJQlJB
UlkoU2FmYXJpVGhlbWUpCisjZW5kaWYKKworU09GVF9MSU5LKFNhZmFyaVRoZW1lLCBwYWludFRo
ZW1lUGFydCwgdm9pZCwgX19zdGRjYWxsLCAoVGhlbWVQYXJ0IHBhcnQsIENHQ29udGV4dFJlZiBj
b250ZXh0LCBjb25zdCBDR1JlY3QmIHJlY3QsIE5TQ29udHJvbFNpemUgc2l6ZSwgVGhlbWVDb250
cm9sU3RhdGUgc3RhdGUpLCAocGFydCwgY29udGV4dCwgcmVjdCwgc2l6ZSwgc3RhdGUpKQorCitj
b25zdCBkb3VibGUgY0luaXRpYWxUaW1lckRlbGF5ID0gMC4yNTsKK2NvbnN0IGRvdWJsZSBjTm9y
bWFsVGltZXJEZWxheSA9IDAuMDU7CisKK1BsYXRmb3JtU2Nyb2xsYmFyOjpQbGF0Zm9ybVNjcm9s
bGJhcihTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50
YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCisgICAgOiBTY3JvbGxiYXIoY2xpZW50
LCBvcmllbnRhdGlvbiwgc2l6ZSksIG1faG92ZXJlZFBhcnQoTm9QYXJ0KSwgbV9wcmVzc2VkUGFy
dChOb1BhcnQpLCBtX3ByZXNzZWRQb3MoMCksCisgICAgICBtX3Njcm9sbFRpbWVyKHRoaXMsICZQ
bGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQpLAorICAgICAgbV9vdmVybGFw
c1Jlc2l6ZXIoZmFsc2UpCit7CisgICAgLy8gT2J0YWluIHRoZSBjb3JyZWN0IHNjcm9sbGJhciBz
aXplcyBmcm9tIHRoZSBzeXN0ZW0uCisgICAgaWYgKCFjSG9yaXpvbnRhbFdpZHRoKSB7CisgICAg
ICAgIC8vIEZJWE1FOiBHZXQgbWV0aWNzIGZyb20gU2FmYXJpVGhlbWUKKyAgICB9CisKKyAgICBp
ZiAob3JpZW50YXRpb24gPT0gVmVydGljYWxTY3JvbGxiYXIpCisgICAgICAgIHNldEZyYW1lR2Vv
bWV0cnkoSW50UmVjdCgwLCAwLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRp
Y2FsSGVpZ2h0W2NvbnRyb2xTaXplKCldKSk7CisgICAgZWxzZQorICAgICAgICBzZXRGcmFtZUdl
b21ldHJ5KEludFJlY3QoMCwgMCwgY0hvcml6b250YWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0hv
cml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pKTsKK30KKworUGxhdGZvcm1TY3JvbGxiYXI6
On5QbGF0Zm9ybVNjcm9sbGJhcigpCit7CisgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQb3NpdGlvbigpCit7CisgICAgaW52
YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1i
UHJvcG9ydGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3N0YXRpYyBJbnRS
ZWN0IHRyYWNrUmVwYWludFJlY3QoY29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBTY3JvbGxiYXJP
cmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUp
Cit7CisgICAgSW50UmVjdCBwYWludFJlY3QodHJhY2tSZWN0KTsKKyAgICBpZiAob3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcGFpbnRSZWN0LmluZmxhdGVYKGNC
dXR0b25MZW5ndGhbY29udHJvbFNpemVdKTsKKyAgICBlbHNlCisgICAgICAgIHBhaW50UmVjdC5p
bmZsYXRlWShjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisKKyAgICByZXR1cm4gcGFpbnRS
ZWN0OworfQorCitzdGF0aWMgSW50UmVjdCBidXR0b25SZXBhaW50UmVjdChjb25zdCBJbnRSZWN0
JiBidXR0b25SZWN0LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFy
Q29udHJvbFNpemUgY29udHJvbFNpemUsIGJvb2wgc3RhcnQpCit7CisgICAgSW50UmVjdCBwYWlu
dFJlY3QoYnV0dG9uUmVjdCk7CisgICAgaWYgKG9yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIpIHsKKyAgICAgICAgcGFpbnRSZWN0LnNldFdpZHRoKGNSZWFsQnV0dG9uTGVuZ3RoW2Nv
bnRyb2xTaXplXSk7CisgICAgICAgIGlmICghc3RhcnQpCisgICAgICAgICAgICBwYWludFJlY3Qu
c2V0WChidXR0b25SZWN0LngoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBi
dXR0b25SZWN0LndpZHRoKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYWludFJlY3Quc2V0
SGVpZ2h0KGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisgICAgICAgIGlmICghc3Rh
cnQpCisgICAgICAgICAgICBwYWludFJlY3Quc2V0WShidXR0b25SZWN0LnkoKSAtIChjUmVhbEJ1
dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBidXR0b25SZWN0LmhlaWdodCgpKSk7CisgICAgfQor
CisgICAgcmV0dXJuIHBhaW50UmVjdDsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52
YWxpZGF0ZVRyYWNrKCkKK3sKKyAgICBJbnRSZWN0IHJlY3QgPSB0cmFja1JlcGFpbnRSZWN0KHRy
YWNrUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpKTsKKyAgICByZWN0Lm1vdmUo
LXgoKSwgLXkoKSk7CisgICAgaW52YWxpZGF0ZVJlY3QocmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OmludmFsaWRhdGVQYXJ0KFNjcm9sbGJhclBhcnQgcGFydCkKK3sKKyAgICBp
ZiAocGFydCA9PSBOb1BhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcmVzdWx0
OyAgICAKKyAgICBzd2l0Y2ggKHBhcnQpIHsKKyAgICAgICAgY2FzZSBCYWNrQnV0dG9uUGFydDoK
KyAgICAgICAgICAgIHJlc3VsdCA9IGJ1dHRvblJlcGFpbnRSZWN0KGJhY2tCdXR0b25SZWN0KCks
IG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHRydWUpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgRm9yd2FyZEJ1dHRvblBhcnQ6CisgICAgICAgICAgICByZXN1bHQgPSBi
dXR0b25SZXBhaW50UmVjdChmb3J3YXJkQnV0dG9uUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250
cm9sU2l6ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDog
eworICAgICAgICAgICAgSW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJU
aHVtYlJlY3Q7CisgICAgICAgICAgICBzcGxpdFRyYWNrKHRyYWNrUmVjdCgpLCBiZWZvcmVUaHVt
YlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOworICAgICAgICAgICAgaWYgKHBhcnQg
PT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBiZWZvcmVUaHVtYlJl
Y3Q7CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpCisgICAg
ICAgICAgICAgICAgcmVzdWx0ID0gYWZ0ZXJUaHVtYlJlY3Q7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgcmVzdWx0ID0gdGh1bWJSZWN0OworICAgICAgICB9CisgICAgfQorICAg
IHJlc3VsdC5tb3ZlKC14KCksIC15KCkpOworICAgIGludmFsaWRhdGVSZWN0KHJlc3VsdCk7Cit9
CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6d2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBX
aWRnZXQ6OndpZHRoKCk7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGVpZ2h0KCkgY29u
c3QKK3sKKyAgICByZXR1cm4gV2lkZ2V0OjpoZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNj
cm9sbGJhcjo6c2V0UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEdldCBvdXIg
d2luZG93IHJlc2l6ZXIgcmVjdCBhbmQgc2VlIGlmIHdlIG92ZXJsYXAuICBBZGp1c3QgdG8gYXZv
aWQgdGhlIG92ZXJsYXAKKyAgICAvLyBpZiBuZWNlc3NhcnkuCisgICAgSW50UmVjdCBhZGp1c3Rl
ZFJlY3QocmVjdCk7CisgICAgaWYgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygp
KSB7CisgICAgICAgIGJvb2wgb3ZlcmxhcHNSZXNpemVyID0gZmFsc2U7CisgICAgICAgIEZyYW1l
VmlldyogdmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICAgICAg
SW50UmVjdCByZXNpemVyUmVjdCA9IHZpZXctPndpbmRvd1Jlc2l6ZXJSZWN0KCk7CisgICAgICAg
IHJlc2l6ZXJSZWN0LnNldExvY2F0aW9uKHZpZXctPmNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRv
dyhyZXNpemVyUmVjdC5sb2NhdGlvbigpKSk7CisgICAgICAgIGlmIChyZWN0LmludGVyc2VjdHMo
cmVzaXplclJlY3QpKSB7CisgICAgICAgICAgICBpZiAob3JpZW50YXRpb24oKSA9PSBIb3Jpem9u
dGFsU2Nyb2xsYmFyKSB7CisgICAgICAgICAgICAgICAgaW50IG92ZXJsYXAgPSByZWN0LnJpZ2h0
KCkgLSByZXNpemVyUmVjdC54KCk7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYm
IHJlc2l6ZXJSZWN0LnJpZ2h0KCkgPj0gcmVjdC5yaWdodCgpKSB7CisgICAgICAgICAgICAgICAg
ICAgIGFkanVzdGVkUmVjdC5zZXRXaWR0aChyZWN0LndpZHRoKCkgLSBvdmVybGFwKTsKKyAgICAg
ICAgICAgICAgICAgICAgb3ZlcmxhcHNSZXNpemVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBvdmVybGFwID0gcmVj
dC5ib3R0b20oKSAtIHJlc2l6ZXJSZWN0LnkoKTsKKyAgICAgICAgICAgICAgICBpZiAob3Zlcmxh
cCA+IDAgJiYgcmVzaXplclJlY3QuYm90dG9tKCkgPj0gcmVjdC5ib3R0b20oKSkgeworICAgICAg
ICAgICAgICAgICAgICBhZGp1c3RlZFJlY3Quc2V0SGVpZ2h0KHJlY3QuaGVpZ2h0KCkgLSBvdmVy
bGFwKTsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHNSZXNpemVyID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3Zl
cmxhcHNSZXNpemVyICE9IG1fb3ZlcmxhcHNSZXNpemVyKSB7CisgICAgICAgICAgICBtX292ZXJs
YXBzUmVzaXplciA9IG92ZXJsYXBzUmVzaXplcjsKKyAgICAgICAgICAgIHZpZXctPmFkanVzdE92
ZXJsYXBwaW5nU2Nyb2xsYmFyQ291bnQobV9vdmVybGFwc1Jlc2l6ZXIgPyAxIDogLTEpOworICAg
ICAgICB9CisgICAgfQorCisgICAgc2V0RnJhbWVHZW9tZXRyeShhZGp1c3RlZFJlY3QpOworfQor
Cit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRQYXJlbnQoU2Nyb2xsVmlldyogcGFyZW50Vmll
dykKK3sKKyAgICBpZiAoIXBhcmVudFZpZXcgJiYgbV9vdmVybGFwc1Jlc2l6ZXIgJiYgcGFyZW50
KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZyYW1l
Vmlldyo+KHBhcmVudCgpKS0+YWRqdXN0T3ZlcmxhcHBpbmdTY3JvbGxiYXJDb3VudCgtMSk7Cisg
ICAgV2lkZ2V0OjpzZXRQYXJlbnQocGFyZW50Vmlldyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3Jv
bGxiYXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkICE9IGlz
RW5hYmxlZCgpKSB7CisgICAgICAgIFdpZGdldDo6c2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAg
ICAgaW52YWxpZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFp
bnQoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEludFJlY3QmIGRhbWFn
ZVJlY3QpCit7CisgICAgaWYgKGdyYXBoaWNzQ29udGV4dC0+dXBkYXRpbmdDb250cm9sVGludHMo
KSkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBpZiAoZ3JhcGhpY3NDb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIERvbid0IHBhaW50IGFueXRoaW5nIGlmIHRoZSBzY3JvbGxiYXIgZG9lc24n
dCBpbnRlcnNlY3QgdGhlIGRhbWFnZSByZWN0LgorICAgIGlmICghZnJhbWVHZW9tZXRyeSgpLmlu
dGVyc2VjdHMoZGFtYWdlUmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgdHJh
Y2sgPSB0cmFja1JlY3QoKTsKKyAgICBwYWludFRyYWNrKGdyYXBoaWNzQ29udGV4dCwgdHJhY2ss
IHRydWUsIGRhbWFnZVJlY3QpOworCisgICAgaWYgKGhhc0J1dHRvbnMoKSkgeworICAgICAgICBw
YWludEJ1dHRvbihncmFwaGljc0NvbnRleHQsIGJhY2tCdXR0b25SZWN0KCksIHRydWUsIGRhbWFn
ZVJlY3QpOworICAgICAgICBwYWludEJ1dHRvbihncmFwaGljc0NvbnRleHQsIGZvcndhcmRCdXR0
b25SZWN0KCksIGZhbHNlLCBkYW1hZ2VSZWN0KTsKKyAgICB9CisKKyAgICBpZiAoaGFzVGh1bWIo
KSAmJiBkYW1hZ2VSZWN0LmludGVyc2VjdHModHJhY2spKSB7CisgICAgICAgIEludFJlY3Qgc3Rh
cnRUcmFja1JlY3QsIHRodW1iUmVjdCwgZW5kVHJhY2tSZWN0OworICAgICAgICBzcGxpdFRyYWNr
KHRyYWNrLCBzdGFydFRyYWNrUmVjdCwgdGh1bWJSZWN0LCBlbmRUcmFja1JlY3QpOworICAgICAg
ICBwYWludFRodW1iKGdyYXBoaWNzQ29udGV4dCwgdGh1bWJSZWN0LCBkYW1hZ2VSZWN0KTsKKyAg
ICB9Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6Omhhc0J1dHRvbnMoKSBjb25zdAorewor
ICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgpKSA+PSAyICogKGNSZWFsQnV0dG9uTGVuZ3RoW2Nv
bnRyb2xTaXplKCldIC0gY0J1dHRvbkhpdEluc2V0W2NvbnRyb2xTaXplKCldKTsKK30KKworYm9v
bCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFzVGh1bWIoKSBjb25zdAoreworICAgIHJldHVybiBpc0Vu
YWJsZWQoKSAmJiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgo
KSA6IGhlaWdodCgpKSA+PSAyICogY0J1dHRvbkluc2V0W2NvbnRyb2xTaXplKCldICsgY1RodW1i
TWluTGVuZ3RoW2NvbnRyb2xTaXplKCldICsgMTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9s
bGJhcjo6YmFja0J1dHRvblJlY3QoKSBjb25zdAoreworICAgIC8vIE91ciBkZXNpcmVkIHJlY3Qg
aXMgZXNzZW50aWFsbHkgMTd4MTcuCisgICAgCisgICAgLy8gT3VyIGFjdHVhbCByZWN0IHdpbGwg
c2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFjZSB3aGVuCisgICAgLy8gd2UgaGF2ZSA8
IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhlIHNjcm9sbGJhcgorICAgIC8vIHRvIHNj
YWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlueSBzaXplcy4KKyAgICBpZiAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1cm4gSW50UmVjdCh4
KCksIHkoKSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRb
Y29udHJvbFNpemUoKV0pOworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCBjVmVydGljYWxX
aWR0aFtjb250cm9sU2l6ZSgpXSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisK
K0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmZvcndhcmRCdXR0b25SZWN0KCkgY29uc3QKK3sK
KyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2VudGlhbGx5IDE3eDE3LgorICAgIAorICAg
IC8vIE91ciBhY3R1YWwgcmVjdCB3aWxsIHNocmluayB0byBoYWxmIHRoZSBhdmFpbGFibGUgc3Bh
Y2Ugd2hlbgorICAgIC8vIHdlIGhhdmUgPCAzNCBwaXhlbHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRo
ZSBzY3JvbGxiYXIKKyAgICAvLyB0byBzY2FsZSBkb3duIGFuZCBmdW5jdGlvbiBldmVuIGF0IHRp
bnkgc2l6ZXMuCisKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
KQorICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyB3aWR0aCgpIC0gY0J1dHRvbkxlbmd0aFtj
b250cm9sU2l6ZSgpXSwgeSgpLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpv
bnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkg
KyBoZWlnaHQoKSAtIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbFdpZHRo
W2NvbnRyb2xTaXplKCldLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldKTsKK30KKworSW50
UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tSZWN0KCkgY29uc3QKK3sKKyAgICBpZiAobV9v
cmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIGlmICghaGFzQnV0
dG9ucygpKQorICAgICAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIHdpZHRoKCksIGNI
b3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICAgICAgcmV0dXJuIEludFJlY3Qo
eCgpICsgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgeSgpLCB3aWR0aCgpIC0gMiAqIGNC
dXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXpl
KCldKTsKKyAgICB9CisKKyAgICBpZiAoIWhhc0J1dHRvbnMoKSkKKyAgICAgICAgcmV0dXJuIElu
dFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBoZWlnaHQoKSk7
CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXpl
KCldLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgaGVpZ2h0KCkgLSAyICogY0J1dHRv
bkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6
OnRodW1iUmVjdCgpIGNvbnN0Cit7CisgICAgSW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRodW1i
UmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgc3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVmb3Jl
VGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICByZXR1cm4gdGh1bWJS
ZWN0OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0IEludFJl
Y3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJl
Y3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0KSBjb25zdAoreworICAgIC8vIFRoaXMgZnVuY3Rp
b24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhhdmUg
c29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFzdAorICAg
IC8vIG9uZSBvZiB0aGVtIGlzIG5vbi1lbXB0eS4KKyAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBv
c2l0aW9uKCk7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikg
eworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyB0aHVtYlBvcywg
dHJhY2tSZWN0LnkoKSArICh0cmFja1JlY3QuaGVpZ2h0KCkgLSBjVGh1bWJIZWlnaHRbY29udHJv
bFNpemUoKV0pIC8gMiwgdGh1bWJMZW5ndGgoKSwgY1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCld
KTsKKyAgICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0cmFj
a1JlY3QueSgpLCB0aHVtYlBvcywgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgYWZ0ZXJU
aHVtYlJlY3QgPSBJbnRSZWN0KHRodW1iUmVjdC54KCkgKyB0aHVtYlJlY3Qud2lkdGgoKSwgdHJh
Y2tSZWN0LnkoKSwgdHJhY2tSZWN0LnJpZ2h0KCkgLSB0aHVtYlJlY3QucmlnaHQoKSwgdHJhY2tS
ZWN0LmhlaWdodCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0
KHRyYWNrUmVjdC54KCkgKyAodHJhY2tSZWN0LndpZHRoKCkgLSBjVGh1bWJXaWR0aFtjb250cm9s
U2l6ZSgpXSkgLyAyLCB0cmFja1JlY3QueSgpICsgdGh1bWJQb3MsIGNUaHVtYldpZHRoW2NvbnRy
b2xTaXplKCldLCB0aHVtYkxlbmd0aCgpKTsKKyAgICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50
UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1JlY3QueSgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdGh1
bWJQb3MpOworICAgICAgICBhZnRlclRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwg
dGh1bWJSZWN0LnkoKSArIHRodW1iUmVjdC5oZWlnaHQoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRy
YWNrUmVjdC5ib3R0b20oKSAtIHRodW1iUmVjdC5ib3R0b20oKSk7CisgICAgfQorfQorCitpbnQg
UGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUG9zaXRpb24oKSBjb25zdAoreworICAgIGlmIChpc0Vu
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIChmbG9hdCltX2N1cnJlbnRQb3MgKiAodHJhY2tMZW5n
dGgoKSAtIHRodW1iTGVuZ3RoKCkpIC8gKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSk7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJMZW5ndGgoKSBj
b25zdAoreworICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
ZmxvYXQgcHJvcG9ydGlvbiA9IChmbG9hdCkobV92aXNpYmxlU2l6ZSkgLyBtX3RvdGFsU2l6ZTsK
KyAgICBpbnQgdHJhY2tMZW4gPSB0cmFja0xlbmd0aCgpOworICAgIGludCBsZW5ndGggPSBwcm9w
b3J0aW9uICogdHJhY2tMZW47CisgICAgaW50IG1pbkxlbmd0aCA9IGNUaHVtYk1pbkxlbmd0aFtj
b250cm9sU2l6ZSgpXTsKKyAgICBsZW5ndGggPSBtYXgobGVuZ3RoLCBtaW5MZW5ndGgpOworICAg
IGlmIChsZW5ndGggPiB0cmFja0xlbikKKyAgICAgICAgbGVuZ3RoID0gMDsgLy8gT25jZSB0aGUg
dGh1bWIgaXMgYmVsb3cgdGhlIHRyYWNrIGxlbmd0aCwgaXQganVzdCBnb2VzIGF3YXkgKHRvIG1h
a2UgbW9yZSByb29tIGZvciB0aGUgdHJhY2spLgorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2lu
dCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiAo
bV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRyYWNrUmVjdCgpLndpZHRo
KCkgOiB0cmFja1JlY3QoKS5oZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6
cGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0
LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlm
ICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3Qg
cGFpbnRSZWN0ID0gYnV0dG9uUmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJv
bFNpemUoKSwgc3RhcnQpOworICAgIAorICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBh
aW50UmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFRoZW1lUGFydCBwYXJ0OworICAgIFRo
ZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkp
CisgICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOworICAgIGlmIChtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbExlZnRB
cnJvd1BhcnQgOiBTY3JvbGxSaWdodEFycm93UGFydDsKKyAgICBlbHNlCisgICAgICAgIHBhcnQg
PSBzdGFydCA/IFNjcm9sbFVwQXJyb3dQYXJ0IDogU2Nyb2xsRG93bkFycm93UGFydDsKKworICAg
IGlmIChpc0VuYWJsZWQoKSkKKyAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgIGlm
ICgobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCAmJiBzdGFydCkKKyAgICAgICAgfHwg
KG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblBhcnQgJiYgIXN0YXJ0KSkKKyAgICAgICAg
c3RhdGUgfD0gUHJlc3NlZFN0YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNj
cm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0
ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VHJhY2soR3JhcGhpY3NDb250
ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRS
ZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkp
CisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcGFpbnRSZWN0ID0gaGFzQnV0dG9ucygp
ID8gdHJhY2tSZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpKSA6
IHJlY3Q7CisgICAgCisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVHJhY2tQYXJ0IDogVlNjcm9sbFRyYWNrUGFy
dDsKKyAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5p
c0FjdGl2ZSgpKQorICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICBpZiAoaGFzQnV0
dG9ucygpKQorICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisKKyAgICBwYWludFRoZW1l
UGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcGFpbnRSZWN0LCBjb250cm9s
U2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFy
Q29udHJvbFNpemUsIHN0YXRlKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRU
aHVtYihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0
IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJh
cnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMo
cmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRh
dGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gSFNjcm9sbFRodW1iUGFydCA6IFZTY3JvbGxU
aHVtYlBhcnQ7CisgICAgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIGlmIChtX2Ns
aWVudC0+aXNBY3RpdmUoKSkKKyAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgaWYg
KGlzRW5hYmxlZCgpKQorICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisKKyAgICBwYWlu
dFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29udHJv
bFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxh
ckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisKK1Njcm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxi
YXI6OmhpdFRlc3QoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaWYgKCFp
c0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIE5vUGFydDsKKworICAgIEludFBvaW50IG1vdXNl
UG9zaXRpb24gPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKTsKKyAgICBt
b3VzZVBvc2l0aW9uLm1vdmUoeCgpLCB5KCkpOworCisgICAgaWYgKGhhc0J1dHRvbnMoKSkgewor
ICAgICAgICBpZiAoYmFja0J1dHRvblJlY3QoKS5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAg
ICAgICAgICAgIHJldHVybiBCYWNrQnV0dG9uUGFydDsKKworICAgICAgICBpZiAoZm9yd2FyZEJ1
dHRvblJlY3QoKS5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBG
b3J3YXJkQnV0dG9uUGFydDsKKyAgICB9CisKKyAgICBpZiAoIWhhc1RodW1iKCkpCisgICAgICAg
IHJldHVybiBOb1BhcnQ7CisKKyAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tSZWN0KCk7CisgICAg
aWYgKHRyYWNrLmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKSB7CisgICAgICAgIEludFJlY3QgYmVm
b3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICBzcGxpdFRy
YWNrKHRyYWNrLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOwor
ICAgICAgICBpZiAoYmVmb3JlVGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAg
ICAgICAgICAgcmV0dXJuIEJhY2tUcmFja1BhcnQ7CisgICAgICAgIGlmICh0aHVtYlJlY3QuY29u
dGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4gVGh1bWJQYXJ0OworICAg
ICAgICByZXR1cm4gRm9yd2FyZFRyYWNrUGFydDsKKyAgICB9CisgICAgcmV0dXJuIE5vUGFydDsK
K30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3Qg
UGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1
bWJQYXJ0KSB7CisgICAgICAgIC8vIERyYWcgdGhlIHRodW1iLgorICAgICAgICBpbnQgdGh1bWJQ
b3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAgICAgIGludCB0aHVtYkxlbiA9IHRodW1iTGVuZ3Ro
KCk7CisgICAgICAgIGludCB0cmFja0xlbiA9IHRyYWNrTGVuZ3RoKCk7CisgICAgICAgIGludCBt
YXhQb3MgPSB0cmFja0xlbiAtIHRodW1iTGVuOworICAgICAgICBpbnQgZGVsdGEgPSAwOworICAg
ICAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAg
ICAgZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkgLSBt
X3ByZXNzZWRQb3M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbHRhID0gY29udmVydEZy
b21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgpIC0gbV9wcmVzc2VkUG9zOworCisgICAg
ICAgIGlmIChkZWx0YSA+IDApCisgICAgICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgZG93bi9y
aWdodC4KKyAgICAgICAgICAgIGRlbHRhID0gbWluKG1heFBvcyAtIHRodW1iUG9zLCBkZWx0YSk7
CisgICAgICAgIGVsc2UgaWYgKGRlbHRhIDwgMCkKKyAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBt
b3ZlZCB1cC9sZWZ0LgorICAgICAgICAgICAgZGVsdGEgPSBtYXgoLXRodW1iUG9zLCBkZWx0YSk7
CisKKyAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKKyAgICAgICAgICAgIHNldFZhbHVlKChmbG9h
dCkodGh1bWJQb3MgKyBkZWx0YSkgKiAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKSAvICh0
cmFja0xlbiAtIHRodW1iTGVuKSk7CisgICAgICAgICAgICBtX3ByZXNzZWRQb3MgKz0gdGh1bWJQ
b3NpdGlvbigpIC0gdGh1bWJQb3M7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIGlmIChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkKKyAgICAg
ICAgbV9wcmVzc2VkUG9zID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/
IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9t
Q29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLnkoKSk7CisKKyAgICBTY3JvbGxiYXJQYXJ0IHBh
cnQgPSBoaXRUZXN0KGV2dCk7ICAgIAorICAgIGlmIChwYXJ0ICE9IG1faG92ZXJlZFBhcnQpIHsK
KyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQgIT0gTm9QYXJ0KSB7CisgICAgICAgICAgICBpZiAo
cGFydCA9PSBtX3ByZXNzZWRQYXJ0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG1vdXNlIGlz
IG1vdmluZyBiYWNrIG92ZXIgdGhlIHByZXNzZWQgcGFydC4gIFdlCisgICAgICAgICAgICAgICAg
Ly8gbmVlZCB0byBzdGFydCB1cCB0aGUgdGltZXIgYWN0aW9uIGFnYWluLgorICAgICAgICAgICAg
ICAgIHN0YXJ0VGltZXJJZk5lZWRlZChjTm9ybWFsVGltZXJEZWxheSk7CisgICAgICAgICAgICAg
ICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgICAgICB9IGVsc2UgaWYg
KG1faG92ZXJlZFBhcnQgPT0gbV9wcmVzc2VkUGFydCkgeworICAgICAgICAgICAgICAgIC8vIFRo
ZSBtb3VzZSBpcyBsZWF2aW5nIHRoZSBwcmVzc2VkIHBhcnQuICBLaWxsIG91ciB0aW1lcgorICAg
ICAgICAgICAgICAgIC8vIGlmIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBzdG9wVGltZXJJZk5l
ZWRlZCgpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52YWxpZGF0ZVBh
cnQocGFydCk7CisgICAgICAgICAgICBpbnZhbGlkYXRlUGFydChtX2hvdmVyZWRQYXJ0KTsKKyAg
ICAgICAgfQorICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gcGFydDsKKyAgICB9IAorCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlT3V0RXZl
bnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaW52YWxpZGF0ZVBhcnQo
bV9ob3ZlcmVkUGFydCk7CisgICAgbV9ob3ZlcmVkUGFydCA9IE5vUGFydDsKKworICAgIHJldHVy
biB0cnVlOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZVByZXNzRXZl
bnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgbV9wcmVzc2VkUGFydCA9
IGhpdFRlc3QoZXZ0KTsKKyAgICBtX3ByZXNzZWRQb3MgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyID8gY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSku
eCgpIDogY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgpKTsKKyAgICBp
bnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQo
Y0luaXRpYWxUaW1lckRlbGF5KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQbGF0Zm9y
bVNjcm9sbGJhcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2
ZW50JiBldnQpCit7CisgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgbV9w
cmVzc2VkUGFydCA9IE5vUGFydDsKKyAgICBtX3ByZXNzZWRQb3MgPSAwOworICAgIHN0b3BUaW1l
cklmTmVlZGVkKCk7CisKKyAgICBpZiAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3
KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+ZnJhbWUoKS0+
ZXZlbnRIYW5kbGVyKCktPnNldE1vdXNlUHJlc3NlZChmYWxzZSk7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3RhcnRUaW1lcklmTmVlZGVkKGRvdWJs
ZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhlIHRodW1iLgorICAg
IGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gSGFuZGxlIHRoZSB0cmFjay4gIFdlIGhhbHQgdHJhY2sgc2Nyb2xsaW5nIG9uY2UgdGhlIHRo
dW1iIGlzIGxldmVsCisgICAgLy8gd2l0aCB1cy4KKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0g
QmFja1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpICYmIHRo
dW1iVW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQp
OworICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgLy8gV2UgY2FuJ3Qgc2Nyb2xsIGlmIHdlJ3ZlIGhpdCB0aGUgYmVnaW5uaW5n
IG9yIGVuZC4KKyAgICBTY3JvbGxEaXJlY3Rpb24gZGlyID0gcHJlc3NlZFBhcnRTY3JvbGxEaXJl
Y3Rpb24oKTsKKyAgICBpZiAoZGlyID09IFNjcm9sbFVwIHx8IGRpciA9PSBTY3JvbGxMZWZ0KSB7
CisgICAgICAgIGlmIChtX2N1cnJlbnRQb3MgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICB9IGVsc2UgeworICAgICAgICBpZiAobV9jdXJyZW50UG9zID09IG1fdG90YWxTaXplIC0gbV92
aXNpYmxlU2l6ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3Njcm9sbFRp
bWVyLnN0YXJ0T25lU2hvdChkZWxheSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnN0
b3BUaW1lcklmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9zY3JvbGxUaW1lci5pc0FjdGl2ZSgpKQor
ICAgICAgICBtX3Njcm9sbFRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJh
cjo6YXV0b3Njcm9sbFByZXNzZWRQYXJ0KGRvdWJsZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBk
byBhbnl0aGluZyBmb3IgdGhlIHRodW1iIG9yIGlmIG5vdGhpbmcgd2FzIHByZXNzZWQuCisgICAg
aWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gTm9QYXJ0
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBIYW5kbGUgdGhlIHRyYWNrLgorICAgIGlmICgo
bV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2Fy
ZFRyYWNrUGFydCkgJiYgdGh1bWJVbmRlck1vdXNlKCkpIHsKKyAgICAgICAgaW52YWxpZGF0ZVBh
cnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgIG1faG92ZXJlZFBhcnQgPSBUaHVtYlBhcnQ7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgdGhlIGFycm93cyBhbmQgdHJh
Y2suCisgICAgaWYgKHNjcm9sbChwcmVzc2VkUGFydFNjcm9sbERpcmVjdGlvbigpLCBwcmVzc2Vk
UGFydFNjcm9sbEdyYW51bGFyaXR5KCkpKQorICAgICAgICBzdGFydFRpbWVySWZOZWVkZWQoZGVs
YXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZChU
aW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4qKQoreworICAgIGF1dG9zY3JvbGxQcmVzc2VkUGFydChj
Tm9ybWFsVGltZXJEZWxheSk7Cit9CisKK1Njcm9sbERpcmVjdGlvbiBQbGF0Zm9ybVNjcm9sbGJh
cjo6cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKQoreworICAgIGlmIChtX29yaWVudGF0aW9u
ID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0g
QmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0KQorICAgICAg
ICAgICAgcmV0dXJuIFNjcm9sbExlZnQ7CisgICAgICAgIHJldHVybiBTY3JvbGxSaWdodDsKKyAg
ICB9IGVsc2UgeworICAgICAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCB8
fCBtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICByZXR1cm4gU2Ny
b2xsVXA7CisgICAgICAgIHJldHVybiBTY3JvbGxEb3duOworICAgIH0KK30KKworU2Nyb2xsR3Jh
bnVsYXJpdHkgUGxhdGZvcm1TY3JvbGxiYXI6OnByZXNzZWRQYXJ0U2Nyb2xsR3JhbnVsYXJpdHko
KQoreworICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1fcHJlc3Nl
ZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblBhcnQpCisgICAgICAgIHJldHVybiBTY3JvbGxCeUxpbmU7
CisgICAgcmV0dXJuIFNjcm9sbEJ5UGFnZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6
dGh1bWJVbmRlck1vdXNlKCkKK3sKKyAgICAvLyBDb25zdHJ1Y3QgYSByZWN0LgorICAgIEludFJl
Y3QgdGh1bWIgPSB0aHVtYlJlY3QoKTsKKyAgICB0aHVtYi5tb3ZlKC14KCksIC15KCkpOworICAg
IGludCBiZWdpbiA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gdGh1
bWIueCgpIDogdGh1bWIueSgpOworICAgIGludCBlbmQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLnJpZ2h0KCkgOiB0aHVtYi5ib3R0b20oKTsKKyAgICBy
ZXR1cm4gKGJlZ2luIDw9IG1fcHJlc3NlZFBvcyAmJiBtX3ByZXNzZWRQb3MgPCBlbmQpOworfQor
CitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6Omhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQoU2Nyb2xs
YmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNIb3Jpem9udGFsV2lk
dGhbY29udHJvbFNpemVdOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Ny
b2xsYmFyV2lkdGgoU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0
dXJuIGNWZXJ0aWNhbEhlaWdodFtjb250cm9sU2l6ZV07Cit9CisKK0ludFJlY3QgUGxhdGZvcm1T
Y3JvbGxiYXI6OndpbmRvd0NsaXBSZWN0KCkgY29uc3QKK3sKKyAgICBJbnRSZWN0IGNsaXBSZWN0
KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBjbGlwUmVjdCA9IGNvbnZlcnRUb0NvbnRh
aW5pbmdXaW5kb3coY2xpcFJlY3QpOworICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgY2xpcFJl
Y3QuaW50ZXJzZWN0KG1fY2xpZW50LT53aW5kb3dDbGlwUmVjdCgpKTsKKyAgICByZXR1cm4gY2xp
cFJlY3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRj
LCBjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Ny
b2xsYmFyOjpncmlwcGVyUmVjdChjb25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVD
aGFuZ2VkKCkKK3sKK30KKworfQorCisjZW5kaWYgLy8gZGVmaW5lZChVU0VfU0FGQVJJX1RIRU1F
KQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNw
cAkocmV2aXNpb24gMzA0NTYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9s
bEJhcldpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJp
Z2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMDggQnJlbnQgRnVsZ2hhbQogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CkBAIC0yNSw4ICsyNiw2IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAotI2lmZGVmIFVTRV9T
QUZBUklfVEhFTUUgCi0KICNpbmNsdWRlICJQbGF0Zm9ybVNjcm9sbEJhci5oIgogCiAjaW5jbHVk
ZSAiRXZlbnRIYW5kbGVyLmgiCkBAIC0zNyw0NiArMzYsOTMgQEAKICNpbmNsdWRlICJQbGF0Zm9y
bU1vdXNlRXZlbnQuaCIKICNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgogCi0jaW5jbHVkZSA8Q29y
ZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgotI2luY2x1ZGUgPFNhZmFyaVRoZW1lL1NhZmFyaVRo
ZW1lLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luLmgi
CiAKLS8vIEZJWE1FOiBUaGVyZSBhcmUgcmVwYWludGluZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBz
Y3JvbGwgYmFyIGJ1dHRvbnMnIHZpc3VhbCBvdmVyZmxvdy4KKy8vIEdlbmVyaWMgc3RhdGUgY29u
c3RhbnRzCisjZGVmaW5lIFRTX05PUk1BTCAgICAxCisjZGVmaW5lIFRTX0hPVkVSICAgICAyCisj
ZGVmaW5lIFRTX0FDVElWRSAgICAzCisjZGVmaW5lIFRTX0RJU0FCTEVEICA0CisjZGVmaW5lIFRT
X0ZPQ1VTRUQgICA1CisKKyNkZWZpbmUgQUJTX1VQTk9STUFMIDEKKyNkZWZpbmUgQUJTX0RPV05O
T1JNQUwgNQorI2RlZmluZSBBQlNfTEVGVE5PUk1BTCA5CisjZGVmaW5lIEFCU19SSUdIVE5PUk1B
TCAxMworCitjb25zdCB1bnNpZ25lZCBTUF9BQlNfSE9UX01PRElGSUVSID0gMTsKK2NvbnN0IHVu
c2lnbmVkIFNQX0FCU19QUkVTU0VEX01PRElGSUVSID0gMjsKK2NvbnN0IHVuc2lnbmVkIFNQX0FC
U19ESVNBQkxFX01PRElGSUVSID0gMzsKKworLy8gU2Nyb2xsYmFyIGNvbnN0YW50cworI2RlZmlu
ZSBTUF9CVVRUT04gMQorI2RlZmluZSBTUF9USFVNQkhPUiAyCisjZGVmaW5lIFNQX1RIVU1CVkVS
VCAzCisjZGVmaW5lIFNQX1RSQUNLU1RBUlRIT1IgNAorI2RlZmluZSBTUF9UUkFDS0VOREhPUiA1
CisjZGVmaW5lIFNQX1RSQUNLU1RBUlRWRVJUIDYKKyNkZWZpbmUgU1BfVFJBQ0tFTkRWRVJUIDcK
KyNkZWZpbmUgU1BfR1JJUFBFUkhPUiA4CisjZGVmaW5lIFNQX0dSSVBQRVJWRVJUIDkKIAogdXNp
bmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3Bh
Y2UgU2FmYXJpVGhlbWU7Ci0KIC8vIEZJWE1FOiBXZSBzaG91bGQgZ2V0IHRoZXNlIG51bWJlcnMg
ZnJvbSBTYWZhcmlUaGVtZQotc3RhdGljIGludCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1LCAx
MSB9Owotc3RhdGljIGludCBjSG9yaXpvbnRhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKLXN0YXRp
YyBpbnQgY1ZlcnRpY2FsV2lkdGhbXSA9IHsgMTUsIDExIH07Ci1zdGF0aWMgaW50IGNWZXJ0aWNh
bEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aFtdID0g
eyAxNywgMTEgfTsKK3N0YXRpYyBpbnQgY0hvcml6b250YWxIZWlnaHRbXSA9IHsgMTcsIDExIH07
CitzdGF0aWMgaW50IGNWZXJ0aWNhbFdpZHRoW10gPSB7IDE3LCAxMSB9Oworc3RhdGljIGludCBj
VmVydGljYWxIZWlnaHRbXSA9IHsgMTcsIDExIH07CiBzdGF0aWMgaW50IGNSZWFsQnV0dG9uTGVu
Z3RoW10gPSB7IDI4LCAyMSB9Owogc3RhdGljIGludCBjQnV0dG9uSW5zZXRbXSA9IHsgMTQsIDEx
IH07CiBzdGF0aWMgaW50IGNCdXR0b25IaXRJbnNldFtdID0geyAzLCAyIH07CiAvLyBjUmVhbEJ1
dHRvbkxlbmd0aCAtIGNCdXR0b25JbnNldAogc3RhdGljIGludCBjQnV0dG9uTGVuZ3RoW10gPSB7
IDE0LCAxMCB9Owotc3RhdGljIGludCBjVGh1bWJXaWR0aFtdID0geyAxNSwgMTEgfTsKLXN0YXRp
YyBpbnQgY1RodW1iSGVpZ2h0W10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVGh1bWJXaWR0
aFtdID0geyAxNywgMTEgfTsKK3N0YXRpYyBpbnQgY1RodW1iSGVpZ2h0W10gPSB7IDE3LCAxMSB9
Owogc3RhdGljIGludCBjVGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIwIH07CiAKLSNpZiAhZGVm
aW5lZChOREVCVUcpICYmIGRlZmluZWQoVVNFX0RFQlVHX1NBRkFSSV9USEVNRSkKLVNPRlRfTElO
S19ERUJVR19MSUJSQVJZKFNhZmFyaVRoZW1lKQotI2Vsc2UKLVNPRlRfTElOS19MSUJSQVJZKFNh
ZmFyaVRoZW1lKQotI2VuZGlmCiAKLVNPRlRfTElOSyhTYWZhcmlUaGVtZSwgcGFpbnRUaGVtZVBh
cnQsIHZvaWQsIF9fc3RkY2FsbCwgKFRoZW1lUGFydCBwYXJ0LCBDR0NvbnRleHRSZWYgY29udGV4
dCwgY29uc3QgQ0dSZWN0JiByZWN0LCBOU0NvbnRyb2xTaXplIHNpemUsIFRoZW1lQ29udHJvbFN0
YXRlIHN0YXRlKSwgKHBhcnQsIGNvbnRleHQsIHJlY3QsIHNpemUsIHN0YXRlKSkKKy8vIE5vdGU6
ICBDb3BpZWQgZnJvbSBSZW5kZXJUaGVtZVdpbi4gIFRoZXJlIHNob3VsZCBiZSBzb21lIHdheSB0
byBiZXR0ZXIKKy8vIGVuY2Fwc3VsYXRlL3NoYXJlIHRoaXMgc3R1ZmYuICBTZWUgYWxsIFJlbmRl
clRoZW1lU2FmYXJpIGZvciBtb3JlIHN1Y2ggc3R1ZmYuLi4KKy8vCisvLyBBZnRlciBkaXNjdXNz
aW9uIHdpdGggQWRhbSBSb2Jlbiwgd2Ugd2lsbCBtYWtlIHRoZSB1Z2x5IGNob2ljZSBvZiBjb3B5
aW5nIGxvZ2ljCisvLyBmcm9tIFJlbmRlclRoZW1lV2luIHVudGlsIHRoZSBUaGVtZSBsb2dpYyBp
cyByZWZhY3RvcmVkCitTT0ZUX0xJTktfTElCUkFSWSh1eHRoZW1lKQorU09GVF9MSU5LKHV4dGhl
bWUsIE9wZW5UaGVtZURhdGEsIEhBTkRMRSwgV0lOQVBJLCAoSFdORCBod25kLCBMUENXU1RSIHBz
ekNsYXNzTGlzdCksIChod25kLCBwc3pDbGFzc0xpc3QpKQorU09GVF9MSU5LKHV4dGhlbWUsIENs
b3NlVGhlbWVEYXRhLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lKSwgKGhUaGVtZSkp
CitTT0ZUX0xJTksodXh0aGVtZSwgRHJhd1RoZW1lQmFja2dyb3VuZCwgSFJFU1VMVCwgV0lOQVBJ
LCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgY29u
c3QgUkVDVCogcFJlY3QsIGNvbnN0IFJFQ1QqIHBDbGlwUmVjdCksIChoVGhlbWUsIGhkYywgaVBh
cnRJZCwgaVN0YXRlSWQsIHBSZWN0LCBwQ2xpcFJlY3QpKQorU09GVF9MSU5LKHV4dGhlbWUsIERy
YXdUaGVtZUVkZ2UsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGlu
dCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0LCB1bnNpZ25lZCB1RWRn
ZSwgdW5zaWduZWQgdUZsYWdzLCBjb25zdCBSRUNUKiBwQ2xpcFJlY3QpLCAoaFRoZW1lLCBoZGMs
IGlQYXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgdUVkZ2UsIHVGbGFncywgcENsaXBSZWN0KSkKK1NP
RlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZUNvbnRlbnRSZWN0LCBIUkVTVUxULCBXSU5BUEksIChI
QU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBjb25zdCBS
RUNUKiBwUmVjdCwgY29uc3QgUkVDVCogcENvbnRlbnRSZWN0KSwgKGhUaGVtZSwgaGRjLCBpUGFy
dElkLCBpU3RhdGVJZCwgcFJlY3QsIHBDb250ZW50UmVjdCkpCitTT0ZUX0xJTksodXh0aGVtZSwg
R2V0VGhlbWVQYXJ0U2l6ZSwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhk
YywgaW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgUkVDVCogcFJlY3QsIGludCB0cywgU0laRSog
cHN6KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgcFJlY3QsIHRzLCBwc3opKQor
U09GVF9MSU5LKHV4dGhlbWUsIEdldFRoZW1lU3lzRm9udCwgSFJFU1VMVCwgV0lOQVBJLCAoSEFO
RExFIGhUaGVtZSwgaW50IGlGb250SWQsIE9VVCBMT0dGT05UKiBwRm9udCksIChoVGhlbWUsIGlG
b250SWQsIHBGb250KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZUNvbG9yLCBIUkVTVUxU
LCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0
ZUlkLCBpbnQgaVByb3BJZCwgT1VUIENPTE9SUkVGKiBwQ29sb3IpLCAoaFRoZW1lLCBoZGMsIGlQ
YXJ0SWQsIGlTdGF0ZUlkLCBpUHJvcElkLCBwQ29sb3IpKQorCisvLyBNYXkgbmVlZCB0byBhZGQg
c3R1ZmYgdG8gdGhlc2UgbGF0ZXIsIHNvIGtlZXAgdGhlIGdyYXBoaWNzIGNvbnRleHQgcmV0cmll
dmFsL3JlbGVhc2UgaW4gc29tZSBoZWxwZXJzLgorc3RhdGljIEhEQyBwcmVwYXJlRm9yRHJhd2lu
ZyhHcmFwaGljc0NvbnRleHQqIGcsIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgcmV0dXJuIGct
PmdldFdpbmRvd3NDb250ZXh0KHIpOworfQorIAorc3RhdGljIHZvaWQgZG9uZURyYXdpbmcoR3Jh
cGhpY3NDb250ZXh0KiBnLCBIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIGctPnJl
bGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHIpOworfQorLy8gRW5kIENvcGllZCBmcm9tIFJlbmRl
clRoZW1lV2luCiAKIGNvbnN0IGRvdWJsZSBjSW5pdGlhbFRpbWVyRGVsYXkgPSAwLjI1OwogY29u
c3QgZG91YmxlIGNOb3JtYWxUaW1lckRlbGF5ID0gMC4wNTsKIAogUGxhdGZvcm1TY3JvbGxiYXI6
OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCogY2xpZW50LCBTY3JvbGxiYXJPcmll
bnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkKLSAgICA6IFNj
cm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKSwgbV9ob3ZlcmVkUGFydChOb1BhcnQp
LCBtX3ByZXNzZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBvcygwKSwKLSAgICAgIG1fc2Nyb2xs
VGltZXIodGhpcywgJlBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZCksCi0g
ICAgICBtX292ZXJsYXBzUmVzaXplcihmYWxzZSkKKyAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9y
aWVudGF0aW9uLCBzaXplKQorICAgICwgbV9ob3ZlcmVkUGFydChOb1BhcnQpCisgICAgLCBtX3By
ZXNzZWRQYXJ0KE5vUGFydCkKKyAgICAsIG1fcHJlc3NlZFBvcygwKQorICAgICwgbV9zY3JvbGxU
aW1lcih0aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKQorICAg
ICwgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCisgICAgLCBtX3Njcm9sbEJhclRoZW1lKDApCiB7
CiAgICAgLy8gT2J0YWluIHRoZSBjb3JyZWN0IHNjcm9sbGJhciBzaXplcyBmcm9tIHRoZSBzeXN0
ZW0uCiAgICAgaWYgKCFjSG9yaXpvbnRhbFdpZHRoKSB7CkBAIC05Miw2ICsxMzgsMTQgQEAgUGxh
dGZvcm1TY3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcgogUGxhdGZvcm1TY3JvbGxiYXI6
On5QbGF0Zm9ybVNjcm9sbGJhcigpCiB7CiAgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKKworICAg
IC8vIENsZWFudXAgdGhlbWUgc3RvdXQudWZmCisgICAgaWYgKCF1eHRoZW1lTGlicmFyeSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgQ2xv
c2VUaGVtZURhdGEobV9zY3JvbGxCYXJUaGVtZSk7CisgICAgbV9zY3JvbGxCYXJUaGVtZSA9IDA7
CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUG9zaXRpb24oKQpAQCAt
MzEwLDYgKzM2NCwxMSBAQCBJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlJlY3QoKSBj
CiAgICAgcmV0dXJuIHRodW1iUmVjdDsKIH0KIAorSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6
Z3JpcHBlclJlY3QoY29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25zdAoreworICAgIHJldHVy
biBJbnRSZWN0KCk7Cit9CisKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNwbGl0VHJhY2soY29u
c3QgSW50UmVjdCYgdHJhY2tSZWN0LCBJbnRSZWN0JiBiZWZvcmVUaHVtYlJlY3QsIEludFJlY3Qm
IHRodW1iUmVjdCwgSW50UmVjdCYgYWZ0ZXJUaHVtYlJlY3QpIGNvbnN0CiB7CiAgICAgLy8gVGhp
cyBmdW5jdGlvbiB3b24ndCBldmVuIGdldCBjYWxsZWQgdW5sZXNzIHdlJ3JlIGJpZyBlbm91Z2gg
dG8gaGF2ZSBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZXNlIHRocmVlIHJlY3RzIHdoZXJlIGF0IGxl
YXN0CkBAIC0zNTUsNjggKzQxNCwxMzQgQEAgaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0cmFja0xl
bmd0aCgpIGNvbgogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEJ1dHRvbihHcmFwaGlj
c0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgc3RhcnQsIGNvbnN0
IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0CiB7Ci0gICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJh
cnkoKSkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgSW50UmVjdCBwYWludFJlY3QgPSBidXR0b25S
ZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpLCBzdGFydCk7CiAg
ICAgCiAgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKICAgICAgICAg
cmV0dXJuOwogCi0gICAgVGhlbWVQYXJ0IHBhcnQ7Ci0gICAgVGhlbWVDb250cm9sU3RhdGUgc3Rh
dGUgPSAwOwotICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKLSAgICAgICAgc3RhdGUgfD0g
QWN0aXZlU3RhdGU7Ci0gICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJh
cikKLSAgICAgICAgcGFydCA9IHN0YXJ0ID8gU2Nyb2xsTGVmdEFycm93UGFydCA6IFNjcm9sbFJp
Z2h0QXJyb3dQYXJ0OwotICAgIGVsc2UKLSAgICAgICAgcGFydCA9IHN0YXJ0ID8gU2Nyb2xsVXBB
cnJvd1BhcnQgOiBTY3JvbGxEb3duQXJyb3dQYXJ0OworICAgIHVuc2lnbmVkIHBhcnQgPSAwOwor
ICAgIHVuc2lnbmVkIHN0YXRlID0gMDsKKyAgICB1bnNpZ25lZCBjbGFzc2ljUGFydCA9IDA7Cisg
ICAgdW5zaWduZWQgY2xhc3NpY1N0YXRlID0gMDsKIAotICAgIGlmIChpc0VuYWJsZWQoKSkKLSAg
ICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOwotICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBC
YWNrQnV0dG9uUGFydCAmJiBzdGFydCkKLSAgICAgICAgfHwgKG1fcHJlc3NlZFBhcnQgPT0gRm9y
d2FyZEJ1dHRvblBhcnQgJiYgIXN0YXJ0KSkKLSAgICAgICAgc3RhdGUgfD0gUHJlc3NlZFN0YXRl
OworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAg
ICBzdGF0ZSA9IHN0YXJ0ID8gQUJTX0xFRlROT1JNQUwgOiBBQlNfUklHSFROT1JNQUw7CisgICAg
ICAgY2xhc3NpY1BhcnQgPSBzdGFydCA/IERGQ1NfU0NST0xMTEVGVCA6IERGQ1NfU0NST0xMUklH
SFQ7CisgICAgfSBlbHNlIHsKKyAgICAgICBzdGF0ZSA9IHN0YXJ0ID8gQUJTX1VQTk9STUFMIDog
QUJTX0RPV05OT1JNQUw7CisgICAgICAgY2xhc3NpY1BhcnQgPSBzdGFydCA/IERGQ1NfU0NST0xM
VVAgOiBERkNTX1NDUk9MTERPV047CisgICAgfQogCi0gICAgcGFpbnRUaGVtZVBhcnQocGFydCwg
Y29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9PSBT
bWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXpl
LCBzdGF0ZSk7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkgeworICAgICAgICBzdGF0ZSArPSBTUF9B
QlNfRElTQUJMRV9NT0RJRklFUjsKKyAgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfSU5BQ1RJ
VkU7CisgICAgfQorICAgIGVsc2UgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0
ICYmIHN0YXJ0KQorICAgICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0b25Q
YXJ0ICYmICFzdGFydCkpCisgICAgeworICAgICAgICBzdGF0ZSArPSBTUF9BQlNfUFJFU1NFRF9N
T0RJRklFUjsKKyAgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfUFVTSEVEIHwgREZDU19GTEFU
OworICAgIH0KKyAgICBlbHNlIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICB7CisgICAg
ICAgc3RhdGUgKz0gU1BfQUJTX0hPVF9NT0RJRklFUjsKKyAgICAgICBjbGFzc2ljU3RhdGUgfD0g
REZDU19IT1Q7CisgICAgfQorCisgICAgSERDIGhkYyA9IHByZXBhcmVGb3JEcmF3aW5nKGNvbnRl
eHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHJlY3Q7CisgICAgaWYgKCF1eHRoZW1l
TGlicmFyeSgpICYmICFtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBtX3Njcm9sbEJhclRoZW1l
ID0gT3BlblRoZW1lRGF0YSgwLCBMIlNjcm9sbGJhciIpOworCisgICAgaWYgKG1fc2Nyb2xsQmFy
VGhlbWUpCisgICAgICAgIERyYXdUaGVtZUJhY2tncm91bmQobV9zY3JvbGxCYXJUaGVtZSwgaGRj
LCBTUF9CVVRUT04sIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgZWxzZQorICAgICAg
ICBEcmF3RnJhbWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIGNsYXNzaWNQYXJ0LCBjbGFzc2lj
U3RhdGUpOworCisgICAgZG9uZURyYXdpbmcoY29udGV4dCwgaGRjLCByZWN0KTsKIH0KIAogdm9p
ZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUcmFjayhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQs
IGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgc3RhcnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJl
Y3QpIGNvbnN0CiB7Ci0gICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKLSAgICAgICAgcmV0
dXJuOwotCiAgICAgSW50UmVjdCBwYWludFJlY3QgPSBoYXNCdXR0b25zKCkgPyB0cmFja1JlcGFp
bnRSZWN0KHJlY3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCkpIDogcmVjdDsKICAgICAK
ICAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQogICAgICAgICByZXR1
cm47CiAKLSAgICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNj
cm9sbGJhciA/IEhTY3JvbGxUcmFja1BhcnQgOiBWU2Nyb2xsVHJhY2tQYXJ0OwotICAgIFRoZW1l
Q29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gMDsKKyAgICB1bnNp
Z25lZCBjbGFzc2ljUGFydCA9IERGQ19TQ1JPTEw7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0g
SG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICBwYXJ0ID0gc3RhcnQgPyBTUF9UUkFDS1NUQVJU
SE9SIDogU1BfVFJBQ0tFTkRIT1I7CisgICAgZWxzZQorICAgICAgIHBhcnQgPSBzdGFydCA/IFNQ
X1RSQUNLU1RBUlRWRVJUIDogU1BfVFJBQ0tFTkRWRVJUOworCisgICAgdW5zaWduZWQgc3RhdGUg
PSBUU19ESVNBQkxFRDsKKyAgICB1bnNpZ25lZCBjbGFzc2ljU3RhdGUgPSBERkNTX01PTk87CiAg
ICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0
ZTsKKyAgICAgICAgc3RhdGUgfD0gVFNfQUNUSVZFOworICAgIGVsc2UKKyAgICAgICBjbGFzc2lj
U3RhdGUgfD0gREZDU19JTkFDVElWRTsKKwogICAgIGlmIChoYXNCdXR0b25zKCkpCi0gICAgICAg
IHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKyAgICAgICAgc3RhdGUgfD0gVFNfTk9STUFMOwogCi0g
ICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50
UmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6
ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7CisgICAgSERDIGhkYyA9IHByZXBhcmVG
b3JEcmF3aW5nKGNvbnRleHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0UmVjdCA9IHJlY3Q7Cisg
ICAgaWYgKHV4dGhlbWVMaWJyYXJ5KCkgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1f
c2Nyb2xsQmFyVGhlbWUgPSBPcGVuVGhlbWVEYXRhKDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBp
ZiAobV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgRHJhd1RoZW1lQmFja2dyb3VuZChtX3Njcm9s
bEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgZWxz
ZQorICAgICAgICBEcmF3RnJhbWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIERGQ19TQ1JPTEws
IGNsYXNzaWNTdGF0ZSk7CisKKyAgICBkb25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3QpOwog
fQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRodW1iKEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkg
Y29uc3QKIHsKLSAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQotICAgICAgICByZXR1cm47
Ci0KICAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhyZWN0KSkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIgPyBIU2Nyb2xsVGh1bWJQYXJ0IDogVlNjcm9sbFRodW1iUGFydDsKLSAgICBUaGVtZUNv
bnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgdW5zaWduZWQgcGFydCA9IChtX29yaWVudGF0aW9u
ID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gU1BfVEhVTUJIT1IgOiBTUF9USFVNQlZFUlQ7Cisg
ICAgdW5zaWduZWQgc3RhdGUgPSAwOworCisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAg
c3RhdGUgKz0gU1BfQUJTX0RJU0FCTEVfTU9ESUZJRVI7CisgICAgZWxzZSBpZiAobV9jbGllbnQt
PmlzQWN0aXZlKCkpCisgICAgICAgc3RhdGUgKz0gU1BfQUJTX0hPVF9NT0RJRklFUjsKKworICAg
IEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByZWN0KTsKKyAgICBSRUNUIHdp
ZGdldFJlY3QgPSByZWN0OworICAgIGlmICh1eHRoZW1lTGlicmFyeSgpICYmICFtX3Njcm9sbEJh
clRoZW1lKQorICAgICAgICBtX3Njcm9sbEJhclRoZW1lID0gT3BlblRoZW1lRGF0YSgwLCBMIlNj
cm9sbGJhciIpOworCisgICAgaWYgKG1fc2Nyb2xsQmFyVGhlbWUpIHsKKyAgICAgICAgRHJhd1Ro
ZW1lQmFja2dyb3VuZChtX3Njcm9sbEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0YXRlLCAmd2lkZ2V0
UmVjdCwgTlVMTCk7CisgICAgICAgIHBhaW50R3JpcHBlcihoZGMsIHdpZGdldFJlY3QpOworICAg
IH0gZWxzZSB7CisgICAgICAgIEhHRElPQkogaFNhdmVCcnVzaCA9IFNlbGVjdE9iamVjdChoZGMs
IEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlRORkFDRSkpOworICAgICAgICBEcmF3RWRnZShoZGMs
ICZ3aWRnZXRSZWN0LCBFREdFX1JBSVNFRCwgQkZfUkVDVCk7CisgICAgICAgIFNlbGVjdE9iamVj
dChoZGMsaFNhdmVCcnVzaCk7CisgICAgfQorCisgICAgZG9uZURyYXdpbmcoY29udGV4dCwgaGRj
LCByZWN0KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBo
ZGMsIGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgdW5zaWduZWQgcGFydCA9ICht
X29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gU1BfR1JJUFBFUkhPUiA6IFNQ
X0dSSVBQRVJWRVJUOworICAgIHVuc2lnbmVkIHN0YXRlID0gMDsKKwogICAgIGlmIChtX2NsaWVu
dC0+aXNBY3RpdmUoKSkKLSAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7Ci0gICAgaWYgKGlz
RW5hYmxlZCgpKQotICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisgICAgICAgIHN0YXRl
IHw9IFRTX0FDVElWRTsKIAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRm
b3JtQ29udGV4dCgpLCByZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNT
bWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKKyAgICBSRUNU
IHdpZGdldFJlY3QgPSByZWN0OworICAgIGlmICh1eHRoZW1lTGlicmFyeSgpICYmICFtX3Njcm9s
bEJhclRoZW1lKQorICAgICAgICBtX3Njcm9sbEJhclRoZW1lID0gT3BlblRoZW1lRGF0YSgwLCBM
IlNjcm9sbGJhciIpOworCisgICAgaWYgKG1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIERyYXdU
aGVtZUJhY2tncm91bmQobV9zY3JvbGxCYXJUaGVtZSwgaGRjLCBwYXJ0LCBzdGF0ZSwgJndpZGdl
dFJlY3QsIE5VTEwpOwogfQogCiBTY3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRU
ZXN0KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQpAQCAtNDQ4LDYgKzU3Myw3IEBAIFNj
cm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRlc3QKICAgICAgICAgICAgIHJldHVy
biBUaHVtYlBhcnQ7CiAgICAgICAgIHJldHVybiBGb3J3YXJkVHJhY2tQYXJ0OwogICAgIH0KKwog
ICAgIHJldHVybiBOb1BhcnQ7CiB9CiAKQEAgLTQ3Niw3ICs2MDIsNyBAQCBib29sIFBsYXRmb3Jt
U2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU1vdmVFCiAgICAgICAgICAgICBzZXRWYWx1ZSgoZmxvYXQp
KHRodW1iUG9zICsgZGVsdGEpICogKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkgLyAodHJh
Y2tMZW4gLSB0aHVtYkxlbikpOwogICAgICAgICAgICAgbV9wcmVzc2VkUG9zICs9IHRodW1iUG9z
aXRpb24oKSAtIHRodW1iUG9zOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVy
biB0cnVlOwogICAgIH0KIApAQCAtNjM2LDE5ICs3NjIsMTIgQEAgaW50IFBsYXRmb3JtU2Nyb2xs
YmFyOjp2ZXJ0aWNhbFNjcm9sbGJhcgogSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6d2luZG93
Q2xpcFJlY3QoKSBjb25zdAogewogICAgIEludFJlY3QgY2xpcFJlY3QoMCwgMCwgd2lkdGgoKSwg
aGVpZ2h0KCkpOworCiAgICAgY2xpcFJlY3QgPSBjb252ZXJ0VG9Db250YWluaW5nV2luZG93KGNs
aXBSZWN0KTsKICAgICBpZiAobV9jbGllbnQpCiAgICAgICAgIGNsaXBSZWN0LmludGVyc2VjdCht
X2NsaWVudC0+d2luZG93Q2xpcFJlY3QoKSk7Ci0gICAgcmV0dXJuIGNsaXBSZWN0OwotfQogCi12
b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEdyaXBwZXIoSERDIGhkYywgY29uc3QgSW50UmVj
dCYgcmVjdCkgY29uc3QKLXsKLX0KLQotSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6Z3JpcHBl
clJlY3QoY29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25zdAotewotICAgIHJldHVybiBJbnRS
ZWN0KCk7CisgICAgcmV0dXJuIGNsaXBSZWN0OwogfQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
Ojp0aGVtZUNoYW5nZWQoKQpAQCAtNjU3LDQgKzc3NiwzIEBAIHZvaWQgUGxhdGZvcm1TY3JvbGxi
YXI6OnRoZW1lQ2hhbmdlZCgpCiAKIH0KIAotI2VuZGlmIC8vIGRlZmluZWQoVVNFX1NBRkFSSV9U
SEVNRSkKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5jcHAJKHJldmlzaW9uIDMw
NjA2KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVXaW4uY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0yNywxMiArMjcsMTQgQEAKICNpbmNsdWRlICJEb2N1bWVudC5oIgogI2luY2x1ZGUg
IkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVk
ZSAiU29mdExpbmtpbmcuaCIKKwogI2luY2x1ZGUgPGNhaXJvLXdpbjMyLmg+CiAKIC8qIAogICog
VGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyBhIHdpZGdl
dCBpcyBkcmF3biB1c2luZwogICogV2luZG93cycgVGhlbWUgQVBJLiBGb3IgbW9yZSBpbmZvcm1h
dGlvbiBvbiB0aGVtZSBwYXJ0cyBhbmQgc3RhdGVzIHNlZQotICogaHR0cDovL21zZG4ubWljcm9z
b2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9zaGVsbGNjL3Bs
YXRmb3JtL2NvbW1jdGxzL3VzZXJleC90b3BpY3MvcGFydHNhbmRzdGF0ZXMuYXNwCisgKiBodHRw
Oi8vbXNkbjIubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2JiNzczMjEwKFZTLjg1KS5hc3B4
CiAgKi8KICNkZWZpbmUgVEhFTUVfQ09MT1IgMjA0CiAjZGVmaW5lIFRIRU1FX0ZPTlQgIDIxMApA
QCAtNTMsMzYgKzU1LDI5IEBACiAjZGVmaW5lIFRGUF9URVhURklFTEQgMQogI2RlZmluZSBURlNf
UkVBRE9OTFkgIDYKIAorLy8gU2Nyb2xsYmFyIGNvbnN0YW50cworI2RlZmluZSBTUF9CVVRUT04g
MQorI2RlZmluZSBTUF9USFVNQkhPUiAyCisjZGVmaW5lIFNQX1RIVU1CVkVSVCAzCisjZGVmaW5l
IFNQX1RSQUNLU1RBUlRIT1IgNAorI2RlZmluZSBTUF9UUkFDS0VOREhPUiA1CisjZGVmaW5lIFNQ
X1RSQUNLU1RBUlRWRVJUIDYKKyNkZWZpbmUgU1BfVFJBQ0tFTkRWRVJUIDcKKyNkZWZpbmUgU1Bf
R1JJUFBFUkhPUiA4CisjZGVmaW5lIFNQX0dSSVBQRVJWRVJUIDkKKwogLy8gQ29tYm9ib3ggY29u
c3RhbnRzCiAjZGVmaW5lIENQX0RST1BET1dOQlVUVE9OIDEKIAotdHlwZWRlZiBIQU5ETEUgKFdJ
TkFQSSpvcGVuVGhlbWVEYXRhUHRyKShIV05EIGh3bmQsIExQQ1dTVFIgcHN6Q2xhc3NMaXN0KTsK
LXR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmNsb3NlVGhlbWVEYXRhUHRyKShIQU5ETEUgaFRoZW1l
KTsKLXR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmRyYXdUaGVtZUJhY2tncm91bmRQdHIpKEhBTkRM
RSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCAqcFJlY3QsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUKiBwQ2xpcFJl
Y3QpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZHJhd1RoZW1lRWRnZVB0cikoSEFORExFIGhU
aGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUICpwUmVjdCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVFZGdlLCB1bnNpZ25l
ZCB1RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBSRUNUKiBwQ2xpcFJlY3QpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkqZ2V0VGhlbWVDb250
ZW50UmVjdFB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXRlSWQsIGNvbnN0IFJF
Q1QqIHBSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVD
VCogcENvbnRlbnRSZWN0KTsKLXR5cGVkZWYgSFJFU1VMVCAoV0lOQVBJKmdldFRoZW1lUGFydFNp
emVQdHIpKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdGF0ZUlkLCBSRUNUKiBwcmMsIGludCB0
cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUqIHBzeik7Ci10
eXBlZGVmIEhSRVNVTFQgKFdJTkFQSSpnZXRUaGVtZVN5c0ZvbnRQdHIpKEhBTkRMRSBoVGhlbWUs
IGludCBpRm9udElkLCBPVVQgTE9HRk9OVCogcEZvbnQpOwotdHlwZWRlZiBIUkVTVUxUIChXSU5B
UEkqZ2V0VGhlbWVDb2xvclB0cikoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3RhdGVJZCwgaW50IGlQ
cm9wSWQsIE9VVCBDT0xPUlJFRiogcEZvbnQpOwotCi1zdGF0aWMgb3BlblRoZW1lRGF0YVB0ciBv
cGVuVGhlbWUgPSAwOwotc3RhdGljIGNsb3NlVGhlbWVEYXRhUHRyIGNsb3NlVGhlbWUgPSAwOwot
c3RhdGljIGRyYXdUaGVtZUJhY2tncm91bmRQdHIgZHJhd1RoZW1lQkcgPSAwOwotc3RhdGljIGRy
YXdUaGVtZUVkZ2VQdHIgZHJhd1RoZW1lRWRnZSA9IDA7Ci1zdGF0aWMgZ2V0VGhlbWVDb250ZW50
UmVjdFB0ciBnZXRUaGVtZUNvbnRlbnRSZWN0ID0gMDsKLXN0YXRpYyBnZXRUaGVtZVBhcnRTaXpl
UHRyIGdldFRoZW1lUGFydFNpemUgPSAwOwotc3RhdGljIGdldFRoZW1lU3lzRm9udFB0ciBnZXRU
aGVtZVN5c0ZvbnQgPSAwOwotc3RhdGljIGdldFRoZW1lQ29sb3JQdHIgZ2V0VGhlbWVDb2xvciA9
IDA7CitTT0ZUX0xJTktfTElCUkFSWSh1eHRoZW1lKQorU09GVF9MSU5LKHV4dGhlbWUsIE9wZW5U
aGVtZURhdGEsIEhBTkRMRSwgV0lOQVBJLCAoSFdORCBod25kLCBMUENXU1RSIHBzekNsYXNzTGlz
dCksIChod25kLCBwc3pDbGFzc0xpc3QpKQorU09GVF9MSU5LKHV4dGhlbWUsIENsb3NlVGhlbWVE
YXRhLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lKSwgKGhUaGVtZSkpCitTT0ZUX0xJ
TksodXh0aGVtZSwgRHJhd1RoZW1lQmFja2dyb3VuZCwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExF
IGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCog
cFJlY3QsIGNvbnN0IFJFQ1QqIHBDbGlwUmVjdCksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0
YXRlSWQsIHBSZWN0LCBwQ2xpcFJlY3QpKQorU09GVF9MSU5LKHV4dGhlbWUsIERyYXdUaGVtZUVk
Z2UsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElk
LCBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0LCB1bnNpZ25lZCB1RWRnZSwgdW5zaWdu
ZWQgdUZsYWdzLCBjb25zdCBSRUNUKiBwQ2xpcFJlY3QpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQs
IGlTdGF0ZUlkLCBwUmVjdCwgdUVkZ2UsIHVGbGFncywgcENsaXBSZWN0KSkKK1NPRlRfTElOSyh1
eHRoZW1lLCBHZXRUaGVtZUNvbnRlbnRSZWN0LCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRo
ZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUKiBwUmVj
dCwgY29uc3QgUkVDVCogcENvbnRlbnRSZWN0KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3Rh
dGVJZCwgcFJlY3QsIHBDb250ZW50UmVjdCkpCitTT0ZUX0xJTksodXh0aGVtZSwgR2V0VGhlbWVQ
YXJ0U2l6ZSwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQ
YXJ0SWQsIGludCBpU3RhdGVJZCwgUkVDVCogcFJlY3QsIGludCB0cywgU0laRSogcHN6KSwgKGhU
aGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgcFJlY3QsIHRzLCBwc3opKQorU09GVF9MSU5L
KHV4dGhlbWUsIEdldFRoZW1lU3lzRm9udCwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVt
ZSwgaW50IGlGb250SWQsIE9VVCBMT0dGT05UKiBwRm9udCksIChoVGhlbWUsIGlGb250SWQsIHBG
b250KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZUNvbG9yLCBIUkVTVUxULCBXSU5BUEks
IChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBpbnQg
aVByb3BJZCwgT1VUIENPTE9SUkVGKiBwQ29sb3IpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlT
dGF0ZUlkLCBpUHJvcElkLCBwQ29sb3IpKQogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTkz
LDQxICs4OCwzMiBAQCBSZW5kZXJUaGVtZSogdGhlbWUoKQogfQogCiBSZW5kZXJUaGVtZVdpbjo6
UmVuZGVyVGhlbWVXaW4oKQotOm1fdGhlbWVETEwoMCksIG1fYnV0dG9uVGhlbWUoMCksIG1fdGV4
dEZpZWxkVGhlbWUoMCksIG1fbWVudUxpc3RUaGVtZSgwKQorICAgIDogbV9idXR0b25UaGVtZSgw
KQorICAgICwgbV90ZXh0RmllbGRUaGVtZSgwKQorICAgICwgbV9tZW51TGlzdFRoZW1lKDApCiB7
Ci0gICAgbV90aGVtZURMTCA9IDo6TG9hZExpYnJhcnkoTCJ1eHRoZW1lLmRsbCIpOwotICAgIGlm
IChtX3RoZW1lRExMKSB7Ci0gICAgICAgIG9wZW5UaGVtZSA9IChvcGVuVGhlbWVEYXRhUHRyKUdl
dFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJPcGVuVGhlbWVEYXRhIik7Ci0gICAgICAgIGNsb3Nl
VGhlbWUgPSAoY2xvc2VUaGVtZURhdGFQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkNs
b3NlVGhlbWVEYXRhIik7Ci0gICAgICAgIGRyYXdUaGVtZUJHID0gKGRyYXdUaGVtZUJhY2tncm91
bmRQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkRyYXdUaGVtZUJhY2tncm91bmQiKTsK
LSAgICAgICAgZHJhd1RoZW1lRWRnZSA9IChkcmF3VGhlbWVFZGdlUHRyKUdldFByb2NBZGRyZXNz
KG1fdGhlbWVETEwsICJEcmF3VGhlbWVFZGdlIik7Ci0gICAgICAgIGdldFRoZW1lQ29udGVudFJl
Y3QgPSAoZ2V0VGhlbWVDb250ZW50UmVjdFB0cilHZXRQcm9jQWRkcmVzcyhtX3RoZW1lRExMLCAi
R2V0VGhlbWVCYWNrZ3JvdW5kQ29udGVudFJlY3QiKTsKLSAgICAgICAgZ2V0VGhlbWVQYXJ0U2l6
ZSA9IChnZXRUaGVtZVBhcnRTaXplUHRyKUdldFByb2NBZGRyZXNzKG1fdGhlbWVETEwsICJHZXRU
aGVtZVBhcnRTaXplIik7Ci0gICAgICAgIGdldFRoZW1lU3lzRm9udCA9IChnZXRUaGVtZVN5c0Zv
bnRQdHIpR2V0UHJvY0FkZHJlc3MobV90aGVtZURMTCwgIkdldFRoZW1lU3lzRm9udCIpOwotICAg
ICAgICBnZXRUaGVtZUNvbG9yID0gKGdldFRoZW1lQ29sb3JQdHIpR2V0UHJvY0FkZHJlc3MobV90
aGVtZURMTCwgIkdldFRoZW1lQ29sb3IiKTsKLSAgICB9CiB9CiAKIFJlbmRlclRoZW1lV2luOjp+
UmVuZGVyVGhlbWVXaW4oKQogewotICAgIGlmICghbV90aGVtZURMTCkKKyAgICBpZiAoIXV4dGhl
bWVMaWJyYXJ5KCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIGNsb3NlKCk7Ci0KLSAgICA6OkZy
ZWVMaWJyYXJ5KG1fdGhlbWVETEwpOwogfQogCiB2b2lkIFJlbmRlclRoZW1lV2luOjpjbG9zZSgp
CiB7CiAgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBuZWVkIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBP
UyB0aGVtZSBjaGFuZ2VzIHRvIGZsdXNoIG91ciBjYWNoZWQgdGhlbWVzLgogICAgIGlmIChtX2J1
dHRvblRoZW1lKQotICAgICAgICBjbG9zZVRoZW1lKG1fYnV0dG9uVGhlbWUpOworICAgICAgICBD
bG9zZVRoZW1lRGF0YShtX2J1dHRvblRoZW1lKTsKICAgICBpZiAobV90ZXh0RmllbGRUaGVtZSkK
LSAgICAgICAgY2xvc2VUaGVtZShtX3RleHRGaWVsZFRoZW1lKTsKKyAgICAgICAgQ2xvc2VUaGVt
ZURhdGEobV90ZXh0RmllbGRUaGVtZSk7CiAgICAgaWYgKG1fbWVudUxpc3RUaGVtZSkKLSAgICAg
ICAgY2xvc2VUaGVtZShtX21lbnVMaXN0VGhlbWUpOwotICAgIG1fYnV0dG9uVGhlbWUgPSBtX3Rl
eHRGaWVsZFRoZW1lID0gbV9tZW51TGlzdFRoZW1lID0gMDsKKyAgICAgICAgQ2xvc2VUaGVtZURh
dGEobV9tZW51TGlzdFRoZW1lKTsKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAg
Q2xvc2VUaGVtZURhdGEobV9zY3JvbGxCYXJUaGVtZSk7CisgICAgbV9idXR0b25UaGVtZSA9IG1f
dGV4dEZpZWxkVGhlbWUgPSBtX21lbnVMaXN0VGhlbWUgPSBtX3Njcm9sbEJhclRoZW1lID0gMDsK
IH0KIAogQ29sb3IgUmVuZGVyVGhlbWVXaW46OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKCkgY29uc3QKQEAgLTE2NCw4ICsxNTAsNiBAQCBib29sIFJlbmRlclRoZW1lV2lu
OjpzdXBwb3J0c0ZvY3VzKEVBcHBlCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CiAgICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwogfQogCiB1bnNpZ25lZCBSZW5k
ZXJUaGVtZVdpbjo6ZGV0ZXJtaW5lU3RhdGUoUmVuZGVyT2JqZWN0KiBvKQpAQCAtMjIzLDYgKzIw
NywyNCBAQCBUaGVtZURhdGEgUmVuZGVyVGhlbWVXaW46OmdldFRoZW1lRGF0YShSCiAgICAgICAg
IGNhc2UgVGV4dEFyZWFBcHBlYXJhbmNlOgogICAgICAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFRG
UF9URVhURklFTEQ7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JvbGxiYXJU
cmFja0hvcml6b250YWxBcHBlYXJhbmNlOgorICAgICAgICAgICAgcmVzdWx0Lm1fcGFydCA9IFNQ
X1RSQUNLU1RBUlRIT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JvbGxi
YXJUcmFja1ZlcnRpY2FsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBT
UF9UUkFDS1NUQVJUVkVSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNjcm9s
bGJhclRodW1iSG9yaXpvbnRhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1bHQubV9wYXJ0
ID0gU1BfVEhVTUJIT1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JvbGxi
YXJUaHVtYlZlcnRpY2FsQXBwZWFyYW5jZToKKyAgICAgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBT
UF9USFVNQlZFUlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JvbGxiYXJH
cmlwcGVySG9yaXpvbnRhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1bHQubV9wYXJ0ID0g
U1BfR1JJUFBFUkhPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNjcm9sbGJh
ckdyaXBwZXJWZXJ0aWNhbEFwcGVhcmFuY2U6CisgICAgICAgICAgICByZXN1bHQubV9wYXJ0ID0g
U1BfR1JJUFBFUlZFUlQ7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICByZXN1bHQu
bV9zdGF0ZSA9IGRldGVybWluZVN0YXRlKG8pOwpAQCAtMjUwLDExICsyNTIsMTEgQEAgYm9vbCBS
ZW5kZXJUaGVtZVdpbjo6cGFpbnRCdXR0b24oUmVuZGVyTwogICAgIC8vIE5vdyBwYWludCB0aGUg
YnV0dG9uLgogICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhpLmNvbnRleHQsIHIpOyAg
CiAgICAgUkVDVCB3aWRnZXRSZWN0ID0gcjsKLSAgICBpZiAobV90aGVtZURMTCAmJiAhbV9idXR0
b25UaGVtZSkKLSAgICAgICAgbV9idXR0b25UaGVtZSA9IG9wZW5UaGVtZSgwLCBMIkJ1dHRvbiIp
OwotICAgIGlmIChtX2J1dHRvblRoZW1lICYmIGRyYXdUaGVtZUJHKSB7Ci0gICAgICAgIGRyYXdU
aGVtZUJHKG1fYnV0dG9uVGhlbWUsIGhkYywgdGhlbWVEYXRhLm1fcGFydCwgdGhlbWVEYXRhLm1f
c3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKLSAgICB9IGVsc2UgeworICAgIGlmICh1eHRoZW1l
TGlicmFyeSgpICYmICFtX2J1dHRvblRoZW1lKQorICAgICAgICBtX2J1dHRvblRoZW1lID0gT3Bl
blRoZW1lRGF0YSgwLCBMIkJ1dHRvbiIpOworICAgIGlmIChtX2J1dHRvblRoZW1lKQorICAgICAg
ICBEcmF3VGhlbWVCYWNrZ3JvdW5kKG1fYnV0dG9uVGhlbWUsIGhkYywgdGhlbWVEYXRhLm1fcGFy
dCwgdGhlbWVEYXRhLm1fc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICBlbHNlIHsKICAg
ICAgICAgaWYgKCh0aGVtZURhdGEubV9wYXJ0ID09IEJQX0JVVFRPTikgJiYgaXNGb2N1c2VkKG8p
KSB7CiAgICAgICAgICAgICAvLyBEcmF3IGJsYWNrIGZvY3VzIHJlY3QgYXJvdW5kIGJ1dHRvbiBv
dXRlciBlZGdlCiAgICAgICAgICAgICBIQlJVU0ggYnJ1c2ggPSBHZXRTeXNDb2xvckJydXNoKENP
TE9SXzNEREtTSEFET1cpOwpAQCAtMjY0LDE1ICsyNjYsNDAgQEAgYm9vbCBSZW5kZXJUaGVtZVdp
bjo6cGFpbnRCdXR0b24oUmVuZGVyTwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAg
IERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgREZDX0JVVFRPTiwgdGhlbWVEYXRh
Lm1fY2xhc3NpY1N0YXRlKTsKLSAgICAgICAgaWYgKCh0aGVtZURhdGEubV9wYXJ0ICE9IEJQX0JV
VFRPTikgJiYgaXNGb2N1c2VkKG8pKSB7CisgICAgICAgIGlmICgodGhlbWVEYXRhLm1fcGFydCAh
PSBCUF9CVVRUT04pICYmIGlzRm9jdXNlZChvKSkKICAgICAgICAgICAgIERyYXdGb2N1c1JlY3Qo
aGRjLCAmd2lkZ2V0UmVjdCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgZG9uZURyYXdpbmcoaS5j
b250ZXh0LCBoZGMsIHIpOwogCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFJlbmRlclRo
ZW1lV2luOjpwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJl
Y3QmIHIsIHVuc2lnbmVkIHN0YXRlLCB1bnNpZ25lZCBzaXplKQoreworICAgIFBsYXRmb3JtR3Jh
cGhpY3NDb250ZXh0KiBjdHggPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBzdGF0
ZSA9IFRTX0FDVElWRTsKKworICAgIC8vIE5vdyBwYWludCB0aGUgYnV0dG9uLgorICAgIEhEQyBo
ZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByKTsgIAorICAgIFJFQ1Qgd2lkZ2V0UmVj
dCA9IHI7CisgICAgaWYgKHV4dGhlbWVMaWJyYXJ5KCkgJiYgIW1fYnV0dG9uVGhlbWUpCisgICAg
ICAgIG1fYnV0dG9uVGhlbWUgPSBPcGVuVGhlbWVEYXRhKDAsIEwiQnV0dG9uIik7CisgICAgaWYg
KG1fYnV0dG9uVGhlbWUpCisgICAgICAgIERyYXdUaGVtZUJhY2tncm91bmQobV9idXR0b25UaGVt
ZSwgaGRjLCBCUF9CVVRUT04sIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgZWxzZSB7
CisgICAgICAgIC8vIERyYXcgYmxhY2sgZm9jdXMgcmVjdCBhcm91bmQgYnV0dG9uIG91dGVyIGVk
Z2UKKyAgICAgICAgSEJSVVNIIGJydXNoID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl8zRERLU0hB
RE9XKTsKKyAgICAgICAgaWYgKGJydXNoKSB7CisgICAgICAgICAgICBGcmFtZVJlY3QoaGRjLCAm
d2lkZ2V0UmVjdCwgYnJ1c2gpOworICAgICAgICAgICAgSW5mbGF0ZVJlY3QoJndpZGdldFJlY3Qs
IC0xLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgRHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3aWRn
ZXRSZWN0LCBERkNfQlVUVE9OLCAwKTsKKyAgICB9CisgICAgZG9uZURyYXdpbmcoY29udGV4dCwg
aGRjLCByKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBSZW5kZXJUaGVtZVdpbjo6
c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKIHsKICAgICAvLyBJZiB0
aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2UgaGF2ZSBub3Ro
aW5nIHRvIGRvLgpAQCAtMjk3LDExICszMjQsMTEgQEAgYm9vbCBSZW5kZXJUaGVtZVdpbjo6cGFp
bnRUZXh0RmllbGQoUmVuZAogICAgIC8vIE5vdyBwYWludCB0aGUgdGV4dCBmaWVsZC4KICAgICBI
REMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoaS5jb250ZXh0LCByKTsKICAgICBSRUNUIHdpZGdl
dFJlY3QgPSByOwotICAgIGlmIChtX3RoZW1lRExMICYmICFtX3RleHRGaWVsZFRoZW1lKQotICAg
ICAgICBtX3RleHRGaWVsZFRoZW1lID0gb3BlblRoZW1lKDAsIEwiRWRpdCIpOwotICAgIGlmICht
X3RleHRGaWVsZFRoZW1lICYmIGRyYXdUaGVtZUJHKSB7Ci0gICAgICAgIGRyYXdUaGVtZUJHKG1f
dGV4dEZpZWxkVGhlbWUsIGhkYywgdGhlbWVEYXRhLm1fcGFydCwgdGhlbWVEYXRhLm1fc3RhdGUs
ICZ3aWRnZXRSZWN0LCBOVUxMKTsKLSAgICB9IGVsc2UgeworICAgIGlmICh1eHRoZW1lTGlicmFy
eSgpICYmICFtX3RleHRGaWVsZFRoZW1lKQorICAgICAgICBtX3RleHRGaWVsZFRoZW1lID0gT3Bl
blRoZW1lRGF0YSgwLCBMIkVkaXQiKTsKKyAgICBpZiAobV90ZXh0RmllbGRUaGVtZSkKKyAgICAg
ICAgRHJhd1RoZW1lQmFja2dyb3VuZChtX3RleHRGaWVsZFRoZW1lLCBoZGMsIHRoZW1lRGF0YS5t
X3BhcnQsIHRoZW1lRGF0YS5tX3N0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgZWxzZSB7
CiAgICAgICAgIERyYXdFZGdlKGhkYywgJndpZGdldFJlY3QsIEVER0VfU1VOS0VOLCBCRl9SRUNU
IHwgQkZfQURKVVNUKTsKICAgICAgICAgRmlsbFJlY3QoaGRjLCAmd2lkZ2V0UmVjdCwgcmVpbnRl
cnByZXRfY2FzdDxIQlJVU0g+KCgodGhlbWVEYXRhLm1fY2xhc3NpY1N0YXRlICYgREZDU19JTkFD
VElWRSkgPyBDT0xPUl9CVE5GQUNFIDogQ09MT1JfV0lORE9XKSArIDEpKTsKICAgICB9CkBAIC0z
NDUsMTAgKzM3MiwxMCBAQCBib29sIFJlbmRlclRoZW1lV2luOjpwYWludE1lbnVMaXN0QnV0dG9u
CiB7CiAgICAgSERDIGhkYyA9IHByZXBhcmVGb3JEcmF3aW5nKGkuY29udGV4dCwgcik7CiAgICAg
UkVDVCB3aWRnZXRSZWN0ID0gcjsKLSAgICBpZiAobV90aGVtZURMTCAmJiAhbV9tZW51TGlzdFRo
ZW1lKQotICAgICAgICBtX21lbnVMaXN0VGhlbWUgPSBvcGVuVGhlbWUoMCwgTCJDb21ib2JveCIp
OwotICAgIGlmIChtX21lbnVMaXN0VGhlbWUgJiYgZHJhd1RoZW1lQkcpCi0gICAgICAgIGRyYXdU
aGVtZUJHKG1fbWVudUxpc3RUaGVtZSwgaGRjLCBDUF9EUk9QRE9XTkJVVFRPTiwgZGV0ZXJtaW5l
U3RhdGUobyksICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICBpZiAodXh0aGVtZUxpYnJhcnkoKSAm
JiAhbV9tZW51TGlzdFRoZW1lKQorICAgICAgICBtX21lbnVMaXN0VGhlbWUgPSBPcGVuVGhlbWVE
YXRhKDAsIEwiQ29tYm9ib3giKTsKKyAgICBpZiAobV9tZW51TGlzdFRoZW1lKQorICAgICAgICBE
cmF3VGhlbWVCYWNrZ3JvdW5kKG1fbWVudUxpc3RUaGVtZSwgaGRjLCBDUF9EUk9QRE9XTkJVVFRP
TiwgZGV0ZXJtaW5lU3RhdGUobyksICZ3aWRnZXRSZWN0LCBOVUxMKTsKICAgICBlbHNlCiAgICAg
ICAgIERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgREZDX1NDUk9MTCwgREZDU19T
Q1JPTExDT01CT0JPWCB8IGRldGVybWluZUNsYXNzaWNTdGF0ZShvKSk7CiAgICAgZG9uZURyYXdp
bmcoaS5jb250ZXh0LCBoZGMsIHIpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhl
bWVXaW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZVdpbi5o
CShyZXZpc2lvbiAzMDYwNikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lV2luLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTY3LDYgKzY3LDcgQEAgcHVibGljOgogICAgIHsgcmV0dXJuIHNl
dENoZWNrYm94U2l6ZShzdHlsZSk7IH0KIAogICAgIHZpcnR1YWwgYm9vbCBwYWludEJ1dHRvbihS
ZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiwgY29u
c3QgSW50UmVjdCYsIHVuc2lnbmVkLCB1bnNpZ25lZCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8m
LCBjb25zdCBJbnRSZWN0Jik7CiAKQEAgLTg4LDEwICs4OSwxMCBAQCBwcml2YXRlOgogCiAgICAg
VGhlbWVEYXRhIGdldFRoZW1lRGF0YShSZW5kZXJPYmplY3QqKTsKICAgICAKLSAgICBITU9EVUxF
IG1fdGhlbWVETEw7CiAgICAgbXV0YWJsZSBIQU5ETEUgbV9idXR0b25UaGVtZTsKICAgICBtdXRh
YmxlIEhBTkRMRSBtX3RleHRGaWVsZFRoZW1lOwogICAgIG11dGFibGUgSEFORExFIG1fbWVudUxp
c3RUaGVtZTsKKyAgICBtdXRhYmxlIEhBTkRMRSBtX3Njcm9sbEJhclRoZW1lOwogfTsKIAogfTsK
</data>
<flag name="review"
          id="8489"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19410</attachid>
            <date>2008-02-27 15:08:50 -0800</date>
            <delta_ts>2008-02-27 15:21:43 -0800</delta_ts>
            <desc>Scrollbars-only patch</desc>
            <filename>WinScrollbars.patch</filename>
            <type>text/plain</type>
            <size>38251</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzMDYzMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDgtMDItMjcgIEJyZW50IEZ1bGdoYW0gPGJmdWxnaGFtQGdtYWls
LmNvbT4KKworICAgICAgICBodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
NzQ4MworICAgICAgICBJbXBsZW1lbnQgc2Nyb2xsYmFycyBvbiBXaW5kb3dzIChDYWlybykKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXQVJOSU5HOiBO
TyBURVNUIENBU0VTIEFEREVEIE9SIENIQU5HRUQKKworICAgICAgICAqIHBsYXRmb3JtL3dpbi9Q
bGF0Zm9ybVNjcm9sbEJhci5oOiAgQWRkIHRoZW1lIEhBTkRMRSBtZW1iZXIgdG8KKyAgICAgICAg
ICBzdXBwb3J0IFdpbmRvd3Mtc3R5bGUgc2Nyb2xsYmFycy4KKyAgICAgICAgKiBwbGF0Zm9ybS93
aW4vUGxhdGZyb21TY3JvbGxCYXJXaW4uY3BwOiAgRHVwbGljYXRlIGltcGxlbWVudGF0aW9uCisg
ICAgICAgICAgZnJvbSBQbGF0Zm9ybVNjcm9sbEJhcldpblNhZmFyaS5jcHAsIHRoZW4gbW9kaWZ5
IHRvIHVzZSB0aGUKKyAgICAgICAgICBuYXRpdmUgV2luZG93cyB0aGVtZSBlbmdpbmUuICBVc2Ug
U09GVF9MSU5LCisKIDIwMDgtMDItMjcgIEp1bGllbiBDaGFmZnJhaXggPGp1bGllbi5jaGFmZnJh
aXhAZ21haWwuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFsZXhleS4KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAkocmV2aXNpb24gMzA2MjUpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDYsNiArMTA2LDEwIEBAIHByaXZhdGU6CiAgICAgaW50IG1fcHJlc3NlZFBvczsKICAgICBU
aW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4gbV9zY3JvbGxUaW1lcjsKICAgICBib29sIG1fb3Zlcmxh
cHNSZXNpemVyOworCisjaWYgIVVTRShTQUZBUklfVEhFTUUpCisgICAgbXV0YWJsZSBIQU5ETEUg
bV9zY3JvbGxCYXJUaGVtZTsKKyNlbmRpZgogfTsKIAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkocmV2aXNpb24gMzA0NTYpCShmcm9t
IFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyU2FmYXJpLmNwcDozMDQ1NikK
KysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDY2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KworI2lmZGVmIFVTRV9TQUZBUklfVEhFTUUgCisKKyNpbmNsdWRlICJQbGF0Zm9ybVNjcm9sbEJh
ci5oIgorCisjaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
CisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNs
dWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVk
ZSAiU29mdExpbmtpbmcuaCIKKworI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3Mu
aD4KKyNpbmNsdWRlIDxTYWZhcmlUaGVtZS9TYWZhcmlUaGVtZS5oPgorCisvLyBGSVhNRTogVGhl
cmUgYXJlIHJlcGFpbnRpbmcgcHJvYmxlbXMgZHVlIHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25z
JyB2aXN1YWwgb3ZlcmZsb3cuCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKwordXNpbmcgbmFtZXNwYWNlIFNhZmFyaVRoZW1lOworCisvLyBGSVhNRTogV2Ug
c2hvdWxkIGdldCB0aGVzZSBudW1iZXJzIGZyb20gU2FmYXJpVGhlbWUKK3N0YXRpYyBpbnQgY0hv
cml6b250YWxXaWR0aFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY0hvcml6b250YWxIZWln
aHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbFdpZHRoW10gPSB7IDE1LCAx
MSB9Oworc3RhdGljIGludCBjVmVydGljYWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMg
aW50IGNSZWFsQnV0dG9uTGVuZ3RoW10gPSB7IDI4LCAyMSB9Oworc3RhdGljIGludCBjQnV0dG9u
SW5zZXRbXSA9IHsgMTQsIDExIH07CitzdGF0aWMgaW50IGNCdXR0b25IaXRJbnNldFtdID0geyAz
LCAyIH07CisvLyBjUmVhbEJ1dHRvbkxlbmd0aCAtIGNCdXR0b25JbnNldAorc3RhdGljIGludCBj
QnV0dG9uTGVuZ3RoW10gPSB7IDE0LCAxMCB9Oworc3RhdGljIGludCBjVGh1bWJXaWR0aFtdID0g
eyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1RodW1iSGVpZ2h0W10gPSB7IDE1LCAxMSB9Oworc3Rh
dGljIGludCBjVGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIwIH07CisKKyNpZiAhZGVmaW5lZChO
REVCVUcpICYmIGRlZmluZWQoVVNFX0RFQlVHX1NBRkFSSV9USEVNRSkKK1NPRlRfTElOS19ERUJV
R19MSUJSQVJZKFNhZmFyaVRoZW1lKQorI2Vsc2UKK1NPRlRfTElOS19MSUJSQVJZKFNhZmFyaVRo
ZW1lKQorI2VuZGlmCisKK1NPRlRfTElOSyhTYWZhcmlUaGVtZSwgcGFpbnRUaGVtZVBhcnQsIHZv
aWQsIF9fc3RkY2FsbCwgKFRoZW1lUGFydCBwYXJ0LCBDR0NvbnRleHRSZWYgY29udGV4dCwgY29u
c3QgQ0dSZWN0JiByZWN0LCBOU0NvbnRyb2xTaXplIHNpemUsIFRoZW1lQ29udHJvbFN0YXRlIHN0
YXRlKSwgKHBhcnQsIGNvbnRleHQsIHJlY3QsIHNpemUsIHN0YXRlKSkKKworY29uc3QgZG91Ymxl
IGNJbml0aWFsVGltZXJEZWxheSA9IDAuMjU7Citjb25zdCBkb3VibGUgY05vcm1hbFRpbWVyRGVs
YXkgPSAwLjA1OworCitQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZvcm1TY3JvbGxiYXIoU2Nyb2xs
YmFyQ2xpZW50KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3Jv
bGxiYXJDb250cm9sU2l6ZSBzaXplKQorICAgIDogU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRp
b24sIHNpemUpLCBtX2hvdmVyZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBhcnQoTm9QYXJ0KSwg
bV9wcmVzc2VkUG9zKDApLAorICAgICAgbV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1TY3Jv
bGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKSwKKyAgICAgIG1fb3ZlcmxhcHNSZXNpemVyKGZh
bHNlKQoreworICAgIC8vIE9idGFpbiB0aGUgY29ycmVjdCBzY3JvbGxiYXIgc2l6ZXMgZnJvbSB0
aGUgc3lzdGVtLgorICAgIGlmICghY0hvcml6b250YWxXaWR0aCkgeworICAgICAgICAvLyBGSVhN
RTogR2V0IG1ldGljcyBmcm9tIFNhZmFyaVRoZW1lCisgICAgfQorCisgICAgaWYgKG9yaWVudGF0
aW9uID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICBzZXRGcmFtZUdlb21ldHJ5KEludFJl
Y3QoMCwgMCwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbEhlaWdodFtj
b250cm9sU2l6ZSgpXSkpOworICAgIGVsc2UKKyAgICAgICAgc2V0RnJhbWVHZW9tZXRyeShJbnRS
ZWN0KDAsIDAsIGNIb3Jpem9udGFsV2lkdGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVp
Z2h0W2NvbnRyb2xTaXplKCldKSk7Cit9CisKK1BsYXRmb3JtU2Nyb2xsYmFyOjp+UGxhdGZvcm1T
Y3JvbGxiYXIoKQoreworICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUG9zaXRpb24oKQoreworICAgIGludmFsaWRhdGVUcmFj
aygpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlByb3BvcnRpb24o
KQoreworICAgIGludmFsaWRhdGVUcmFjaygpOworfQorCitzdGF0aWMgSW50UmVjdCB0cmFja1Jl
cGFpbnRSZWN0KGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgU2Nyb2xsYmFyT3JpZW50YXRpb24g
b3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAgIElu
dFJlY3QgcGFpbnRSZWN0KHRyYWNrUmVjdCk7CisgICAgaWYgKG9yaWVudGF0aW9uID09IEhvcml6
b250YWxTY3JvbGxiYXIpCisgICAgICAgIHBhaW50UmVjdC5pbmZsYXRlWChjQnV0dG9uTGVuZ3Ro
W2NvbnRyb2xTaXplXSk7CisgICAgZWxzZQorICAgICAgICBwYWludFJlY3QuaW5mbGF0ZVkoY0J1
dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworCisgICAgcmV0dXJuIHBhaW50UmVjdDsKK30KKwor
c3RhdGljIEludFJlY3QgYnV0dG9uUmVwYWludFJlY3QoY29uc3QgSW50UmVjdCYgYnV0dG9uUmVj
dCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXpl
IGNvbnRyb2xTaXplLCBib29sIHN0YXJ0KQoreworICAgIEludFJlY3QgcGFpbnRSZWN0KGJ1dHRv
blJlY3QpOworICAgIGlmIChvcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7Cisg
ICAgICAgIHBhaW50UmVjdC5zZXRXaWR0aChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0p
OworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcGFpbnRSZWN0LnNldFgoYnV0dG9u
UmVjdC54KCkgLSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemVdIC0gYnV0dG9uUmVjdC53
aWR0aCgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFpbnRSZWN0LnNldEhlaWdodChjUmVh
bEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAg
ICAgICAgcGFpbnRSZWN0LnNldFkoYnV0dG9uUmVjdC55KCkgLSAoY1JlYWxCdXR0b25MZW5ndGhb
Y29udHJvbFNpemVdIC0gYnV0dG9uUmVjdC5oZWlnaHQoKSkpOworICAgIH0KKworICAgIHJldHVy
biBwYWludFJlY3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmludmFsaWRhdGVUcmFj
aygpCit7CisgICAgSW50UmVjdCByZWN0ID0gdHJhY2tSZXBhaW50UmVjdCh0cmFja1JlY3QoKSwg
bV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSk7CisgICAgcmVjdC5tb3ZlKC14KCksIC15KCkp
OworICAgIGludmFsaWRhdGVSZWN0KHJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
OjppbnZhbGlkYXRlUGFydChTY3JvbGxiYXJQYXJ0IHBhcnQpCit7CisgICAgaWYgKHBhcnQgPT0g
Tm9QYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHJlc3VsdDsgICAgCisgICAg
c3dpdGNoIChwYXJ0KSB7CisgICAgICAgIGNhc2UgQmFja0J1dHRvblBhcnQ6CisgICAgICAgICAg
ICByZXN1bHQgPSBidXR0b25SZXBhaW50UmVjdChiYWNrQnV0dG9uUmVjdCgpLCBtX29yaWVudGF0
aW9uLCBjb250cm9sU2l6ZSgpLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEZvcndhcmRCdXR0b25QYXJ0OgorICAgICAgICAgICAgcmVzdWx0ID0gYnV0dG9uUmVwYWlu
dFJlY3QoZm9yd2FyZEJ1dHRvblJlY3QoKSwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwg
ZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAg
ICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0Owor
ICAgICAgICAgICAgc3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVt
YlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IEJhY2tUcmFj
a1BhcnQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmVmb3JlVGh1bWJSZWN0OworICAgICAg
ICAgICAgZWxzZSBpZiAocGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KQorICAgICAgICAgICAgICAg
IHJlc3VsdCA9IGFmdGVyVGh1bWJSZWN0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIHJlc3VsdCA9IHRodW1iUmVjdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQubW92
ZSgteCgpLCAteSgpKTsKKyAgICBpbnZhbGlkYXRlUmVjdChyZXN1bHQpOworfQorCitpbnQgUGxh
dGZvcm1TY3JvbGxiYXI6OndpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gV2lkZ2V0Ojp3aWR0
aCgpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhlaWdodCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIFdpZGdldDo6aGVpZ2h0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNl
dFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBHZXQgb3VyIHdpbmRvdyByZXNp
emVyIHJlY3QgYW5kIHNlZSBpZiB3ZSBvdmVybGFwLiAgQWRqdXN0IHRvIGF2b2lkIHRoZSBvdmVy
bGFwCisgICAgLy8gaWYgbmVjZXNzYXJ5LgorICAgIEludFJlY3QgYWRqdXN0ZWRSZWN0KHJlY3Qp
OworICAgIGlmIChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGcmFtZVZpZXcoKSkgeworICAgICAg
ICBib29sIG92ZXJsYXBzUmVzaXplciA9IGZhbHNlOworICAgICAgICBGcmFtZVZpZXcqIHZpZXcg
PSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisgICAgICAgIEludFJlY3QgcmVz
aXplclJlY3QgPSB2aWV3LT53aW5kb3dSZXNpemVyUmVjdCgpOworICAgICAgICByZXNpemVyUmVj
dC5zZXRMb2NhdGlvbih2aWV3LT5jb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3cocmVzaXplclJl
Y3QubG9jYXRpb24oKSkpOworICAgICAgICBpZiAocmVjdC5pbnRlcnNlY3RzKHJlc2l6ZXJSZWN0
KSkgeworICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJh
cikgeworICAgICAgICAgICAgICAgIGludCBvdmVybGFwID0gcmVjdC5yaWdodCgpIC0gcmVzaXpl
clJlY3QueCgpOworICAgICAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiByZXNpemVyUmVj
dC5yaWdodCgpID49IHJlY3QucmlnaHQoKSkgeworICAgICAgICAgICAgICAgICAgICBhZGp1c3Rl
ZFJlY3Quc2V0V2lkdGgocmVjdC53aWR0aCgpIC0gb3ZlcmxhcCk7CisgICAgICAgICAgICAgICAg
ICAgIG92ZXJsYXBzUmVzaXplciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcCA9IHJlY3QuYm90dG9tKCkg
LSByZXNpemVyUmVjdC55KCk7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIHJl
c2l6ZXJSZWN0LmJvdHRvbSgpID49IHJlY3QuYm90dG9tKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgYWRqdXN0ZWRSZWN0LnNldEhlaWdodChyZWN0LmhlaWdodCgpIC0gb3ZlcmxhcCk7CisgICAg
ICAgICAgICAgICAgICAgIG92ZXJsYXBzUmVzaXplciA9IHRydWU7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG92ZXJsYXBzUmVzaXpl
ciAhPSBtX292ZXJsYXBzUmVzaXplcikgeworICAgICAgICAgICAgbV9vdmVybGFwc1Jlc2l6ZXIg
PSBvdmVybGFwc1Jlc2l6ZXI7CisgICAgICAgICAgICB2aWV3LT5hZGp1c3RPdmVybGFwcGluZ1Nj
cm9sbGJhckNvdW50KG1fb3ZlcmxhcHNSZXNpemVyID8gMSA6IC0xKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHNldEZyYW1lR2VvbWV0cnkoYWRqdXN0ZWRSZWN0KTsKK30KKwordm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6c2V0UGFyZW50KFNjcm9sbFZpZXcqIHBhcmVudFZpZXcpCit7CisgICAg
aWYgKCFwYXJlbnRWaWV3ICYmIG1fb3ZlcmxhcHNSZXNpemVyICYmIHBhcmVudCgpICYmIHBhcmVu
dCgpLT5pc0ZyYW1lVmlldygpKQorICAgICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJl
bnQoKSktPmFkanVzdE92ZXJsYXBwaW5nU2Nyb2xsYmFyQ291bnQoLTEpOworICAgIFdpZGdldDo6
c2V0UGFyZW50KHBhcmVudFZpZXcpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRF
bmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCAhPSBpc0VuYWJsZWQoKSkg
eworICAgICAgICBXaWRnZXQ6OnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIGludmFsaWRh
dGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50KEdyYXBoaWNz
Q29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KQorewor
ICAgIGlmIChncmFwaGljc0NvbnRleHQtPnVwZGF0aW5nQ29udHJvbFRpbnRzKCkpIHsKKyAgICAg
ICAgaW52YWxpZGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdyYXBo
aWNzQ29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBEb24ndCBwYWludCBhbnl0aGluZyBpZiB0aGUgc2Nyb2xsYmFyIGRvZXNuJ3QgaW50ZXJzZWN0
IHRoZSBkYW1hZ2UgcmVjdC4KKyAgICBpZiAoIWZyYW1lR2VvbWV0cnkoKS5pbnRlcnNlY3RzKGRh
bWFnZVJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tS
ZWN0KCk7CisgICAgcGFpbnRUcmFjayhncmFwaGljc0NvbnRleHQsIHRyYWNrLCB0cnVlLCBkYW1h
Z2VSZWN0KTsKKworICAgIGlmIChoYXNCdXR0b25zKCkpIHsKKyAgICAgICAgcGFpbnRCdXR0b24o
Z3JhcGhpY3NDb250ZXh0LCBiYWNrQnV0dG9uUmVjdCgpLCB0cnVlLCBkYW1hZ2VSZWN0KTsKKyAg
ICAgICAgcGFpbnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0LCBmb3J3YXJkQnV0dG9uUmVjdCgpLCBm
YWxzZSwgZGFtYWdlUmVjdCk7CisgICAgfQorCisgICAgaWYgKGhhc1RodW1iKCkgJiYgZGFtYWdl
UmVjdC5pbnRlcnNlY3RzKHRyYWNrKSkgeworICAgICAgICBJbnRSZWN0IHN0YXJ0VHJhY2tSZWN0
LCB0aHVtYlJlY3QsIGVuZFRyYWNrUmVjdDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywgc3Rh
cnRUcmFja1JlY3QsIHRodW1iUmVjdCwgZW5kVHJhY2tSZWN0KTsKKyAgICAgICAgcGFpbnRUaHVt
YihncmFwaGljc0NvbnRleHQsIHRodW1iUmVjdCwgZGFtYWdlUmVjdCk7CisgICAgfQorfQorCiti
b29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYXNCdXR0b25zKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
aXNFbmFibGVkKCkgJiYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IHdp
ZHRoKCkgOiBoZWlnaHQoKSkgPj0gMiAqIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgp
XSAtIGNCdXR0b25IaXRJbnNldFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK2Jvb2wgUGxhdGZvcm1T
Y3JvbGxiYXI6Omhhc1RodW1iKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYg
KG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IHdpZHRoKCkgOiBoZWlnaHQo
KSkgPj0gMiAqIGNCdXR0b25JbnNldFtjb250cm9sU2l6ZSgpXSArIGNUaHVtYk1pbkxlbmd0aFtj
b250cm9sU2l6ZSgpXSArIDE7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmJhY2tC
dXR0b25SZWN0KCkgY29uc3QKK3sKKyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2VudGlh
bGx5IDE3eDE3LgorICAgIAorICAgIC8vIE91ciBhY3R1YWwgcmVjdCB3aWxsIHNocmluayB0byBo
YWxmIHRoZSBhdmFpbGFibGUgc3BhY2Ugd2hlbgorICAgIC8vIHdlIGhhdmUgPCAzNCBwaXhlbHMg
bGVmdC4gIFRoaXMgYWxsb3dzIHRoZSBzY3JvbGxiYXIKKyAgICAvLyB0byBzY2FsZSBkb3duIGFu
ZCBmdW5jdGlvbiBldmVuIGF0IHRpbnkgc2l6ZXMuCisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0g
SG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNC
dXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXpl
KCldKTsKKyAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgY1ZlcnRpY2FsV2lkdGhbY29udHJv
bFNpemUoKV0sIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0pOworfQorCitJbnRSZWN0IFBs
YXRmb3JtU2Nyb2xsYmFyOjpmb3J3YXJkQnV0dG9uUmVjdCgpIGNvbnN0Cit7CisgICAgLy8gT3Vy
IGRlc2lyZWQgcmVjdCBpcyBlc3NlbnRpYWxseSAxN3gxNy4KKyAgICAKKyAgICAvLyBPdXIgYWN0
dWFsIHJlY3Qgd2lsbCBzaHJpbmsgdG8gaGFsZiB0aGUgYXZhaWxhYmxlIHNwYWNlIHdoZW4KKyAg
ICAvLyB3ZSBoYXZlIDwgMzQgcGl4ZWxzIGxlZnQuICBUaGlzIGFsbG93cyB0aGUgc2Nyb2xsYmFy
CisgICAgLy8gdG8gc2NhbGUgZG93biBhbmQgZnVuY3Rpb24gZXZlbiBhdCB0aW55IHNpemVzLgor
CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAg
cmV0dXJuIEludFJlY3QoeCgpICsgd2lkdGgoKSAtIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUo
KV0sIHkoKSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRb
Y29udHJvbFNpemUoKV0pOworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpICsgaGVpZ2h0KCkg
LSBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6
ZSgpXSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZv
cm1TY3JvbGxiYXI6OnRyYWNrUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKG1fb3JpZW50YXRpb24g
PT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICBpZiAoIWhhc0J1dHRvbnMoKSkKKyAg
ICAgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCB3aWR0aCgpLCBjSG9yaXpvbnRhbEhl
aWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSArIGNCdXR0
b25MZW5ndGhbY29udHJvbFNpemUoKV0sIHkoKSwgd2lkdGgoKSAtIDIgKiBjQnV0dG9uTGVuZ3Ro
W2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAg
fQorCisgICAgaWYgKCFoYXNCdXR0b25zKCkpCisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSwg
eSgpLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgaGVpZ2h0KCkpOworICAgIHJldHVy
biBJbnRSZWN0KHgoKSwgeSgpICsgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRp
Y2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGhlaWdodCgpIC0gMiAqIGNCdXR0b25MZW5ndGhbY29u
dHJvbFNpemUoKV0pOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlJlY3Qo
KSBjb25zdAoreworICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVy
VGh1bWJSZWN0OworICAgIHNwbGl0VHJhY2sodHJhY2tSZWN0KCksIGJlZm9yZVRodW1iUmVjdCwg
dGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdCk7CisgICAgcmV0dXJuIHRodW1iUmVjdDsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3BsaXRUcmFjayhjb25zdCBJbnRSZWN0JiB0cmFja1Jl
Y3QsIEludFJlY3QmIGJlZm9yZVRodW1iUmVjdCwgSW50UmVjdCYgdGh1bWJSZWN0LCBJbnRSZWN0
JiBhZnRlclRodW1iUmVjdCkgY29uc3QKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHdvbid0IGV2
ZW4gZ2V0IGNhbGxlZCB1bmxlc3Mgd2UncmUgYmlnIGVub3VnaCB0byBoYXZlIHNvbWUgY29tYmlu
YXRpb24gb2YgdGhlc2UgdGhyZWUgcmVjdHMgd2hlcmUgYXQgbGVhc3QKKyAgICAvLyBvbmUgb2Yg
dGhlbSBpcyBub24tZW1wdHkuCisgICAgaW50IHRodW1iUG9zID0gdGh1bWJQb3NpdGlvbigpOwor
ICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAg
dGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpICsgdGh1bWJQb3MsIHRyYWNrUmVjdC55
KCkgKyAodHJhY2tSZWN0LmhlaWdodCgpIC0gY1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCldKSAv
IDIsIHRodW1iTGVuZ3RoKCksIGNUaHVtYkhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgICAg
IGJlZm9yZVRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSwg
dGh1bWJQb3MsIHRyYWNrUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIGFmdGVyVGh1bWJSZWN0ID0g
SW50UmVjdCh0aHVtYlJlY3QueCgpICsgdGh1bWJSZWN0LndpZHRoKCksIHRyYWNrUmVjdC55KCks
IHRyYWNrUmVjdC5yaWdodCgpIC0gdGh1bWJSZWN0LnJpZ2h0KCksIHRyYWNrUmVjdC5oZWlnaHQo
KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3Qu
eCgpICsgKHRyYWNrUmVjdC53aWR0aCgpIC0gY1RodW1iV2lkdGhbY29udHJvbFNpemUoKV0pIC8g
MiwgdHJhY2tSZWN0LnkoKSArIHRodW1iUG9zLCBjVGh1bWJXaWR0aFtjb250cm9sU2l6ZSgpXSwg
dGh1bWJMZW5ndGgoKSk7CisgICAgICAgIGJlZm9yZVRodW1iUmVjdCA9IEludFJlY3QodHJhY2tS
ZWN0LngoKSwgdHJhY2tSZWN0LnkoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRodW1iUG9zKTsKKyAg
ICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCksIHRodW1iUmVjdC55
KCkgKyB0aHVtYlJlY3QuaGVpZ2h0KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0cmFja1JlY3QuYm90
dG9tKCkgLSB0aHVtYlJlY3QuYm90dG9tKCkpOworICAgIH0KK30KKworaW50IFBsYXRmb3JtU2Ny
b2xsYmFyOjp0aHVtYlBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoaXNFbmFibGVkKCkpCisg
ICAgICAgIHJldHVybiAoZmxvYXQpbV9jdXJyZW50UG9zICogKHRyYWNrTGVuZ3RoKCkgLSB0aHVt
Ykxlbmd0aCgpKSAvIChtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpOworICAgIHJldHVybiAw
OworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iTGVuZ3RoKCkgY29uc3QKK3sKKyAg
ICBpZiAoIWlzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZsb2F0IHByb3Bv
cnRpb24gPSAoZmxvYXQpKG1fdmlzaWJsZVNpemUpIC8gbV90b3RhbFNpemU7CisgICAgaW50IHRy
YWNrTGVuID0gdHJhY2tMZW5ndGgoKTsKKyAgICBpbnQgbGVuZ3RoID0gcHJvcG9ydGlvbiAqIHRy
YWNrTGVuOworICAgIGludCBtaW5MZW5ndGggPSBjVGh1bWJNaW5MZW5ndGhbY29udHJvbFNpemUo
KV07CisgICAgbGVuZ3RoID0gbWF4KGxlbmd0aCwgbWluTGVuZ3RoKTsKKyAgICBpZiAobGVuZ3Ro
ID4gdHJhY2tMZW4pCisgICAgICAgIGxlbmd0aCA9IDA7IC8vIE9uY2UgdGhlIHRodW1iIGlzIGJl
bG93IHRoZSB0cmFjayBsZW5ndGgsIGl0IGp1c3QgZ29lcyBhd2F5ICh0byBtYWtlIG1vcmUgcm9v
bSBmb3IgdGhlIHRyYWNrKS4KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitpbnQgUGxhdGZvcm1T
Y3JvbGxiYXI6OnRyYWNrTGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1fb3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0cmFja1JlY3QoKS53aWR0aCgpIDogdHJhY2tS
ZWN0KCkuaGVpZ2h0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0dG9u
KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFy
dCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3QKK3sKKyAgICBpZiAoIVNhZmFyaVRo
ZW1lTGlicmFyeSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHBhaW50UmVjdCA9
IGJ1dHRvblJlcGFpbnRSZWN0KHJlY3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHN0
YXJ0KTsKKyAgICAKKyAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBUaGVtZVBhcnQgcGFydDsKKyAgICBUaGVtZUNvbnRyb2xT
dGF0ZSBzdGF0ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQorICAgICAgICBz
dGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyKQorICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxMZWZ0QXJyb3dQYXJ0IDog
U2Nyb2xsUmlnaHRBcnJvd1BhcnQ7CisgICAgZWxzZQorICAgICAgICBwYXJ0ID0gc3RhcnQgPyBT
Y3JvbGxVcEFycm93UGFydCA6IFNjcm9sbERvd25BcnJvd1BhcnQ7CisKKyAgICBpZiAoaXNFbmFi
bGVkKCkpCisgICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKyAgICBpZiAoKG1fcHJlc3Nl
ZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgJiYgc3RhcnQpCisgICAgICAgIHx8IChtX3ByZXNzZWRQ
YXJ0ID09IEZvcndhcmRCdXR0b25QYXJ0ICYmICFzdGFydCkpCisgICAgICAgIHN0YXRlIHw9IFBy
ZXNzZWRTdGF0ZTsKKworICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBO
U1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworfQorCit2
b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdl
UmVjdCkgY29uc3QKK3sKKyAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGhhc0J1dHRvbnMoKSA/IHRyYWNrUmVw
YWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSkgOiByZWN0OworICAg
IAorICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyID8gSFNjcm9sbFRyYWNrUGFydCA6IFZTY3JvbGxUcmFja1BhcnQ7CisgICAgVGhl
bWVDb250cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkK
KyAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgaWYgKGhhc0J1dHRvbnMoKSkKKyAg
ICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwg
Y29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9PSBT
bWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXpl
LCBzdGF0ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VGh1bWIoR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBk
YW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9y
aXpvbnRhbFNjcm9sbGJhciA/IEhTY3JvbGxUaHVtYlBhcnQgOiBWU2Nyb2xsVGh1bWJQYXJ0Owor
ICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0
aXZlKCkpCisgICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOworICAgIGlmIChpc0VuYWJsZWQo
KSkKKyAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQo
cGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHJlY3QsIGNvbnRyb2xTaXplKCkgPT0g
U21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6
ZSwgc3RhdGUpOworfQorCitTY3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0
KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIGlmICghaXNFbmFibGVkKCkp
CisgICAgICAgIHJldHVybiBOb1BhcnQ7CisKKyAgICBJbnRQb2ludCBtb3VzZVBvc2l0aW9uID0g
Y29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSk7CisgICAgbW91c2VQb3NpdGlv
bi5tb3ZlKHgoKSwgeSgpKTsKKworICAgIGlmIChoYXNCdXR0b25zKCkpIHsKKyAgICAgICAgaWYg
KGJhY2tCdXR0b25SZWN0KCkuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICBy
ZXR1cm4gQmFja0J1dHRvblBhcnQ7CisKKyAgICAgICAgaWYgKGZvcndhcmRCdXR0b25SZWN0KCku
Y29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4gRm9yd2FyZEJ1dHRv
blBhcnQ7CisgICAgfQorCisgICAgaWYgKCFoYXNUaHVtYigpKQorICAgICAgICByZXR1cm4gTm9Q
YXJ0OworCisgICAgSW50UmVjdCB0cmFjayA9IHRyYWNrUmVjdCgpOworICAgIGlmICh0cmFjay5j
b250YWlucyhtb3VzZVBvc2l0aW9uKSkgeworICAgICAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVj
dCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywg
YmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICAgICAgaWYg
KGJlZm9yZVRodW1iUmVjdC5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJl
dHVybiBCYWNrVHJhY2tQYXJ0OworICAgICAgICBpZiAodGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNl
UG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuIFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJu
IEZvcndhcmRUcmFja1BhcnQ7CisgICAgfQorICAgIHJldHVybiBOb1BhcnQ7Cit9CisKK2Jvb2wg
UGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYgZXZ0KQoreworICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkgewor
ICAgICAgICAvLyBEcmFnIHRoZSB0aHVtYi4KKyAgICAgICAgaW50IHRodW1iUG9zID0gdGh1bWJQ
b3NpdGlvbigpOworICAgICAgICBpbnQgdGh1bWJMZW4gPSB0aHVtYkxlbmd0aCgpOworICAgICAg
ICBpbnQgdHJhY2tMZW4gPSB0cmFja0xlbmd0aCgpOworICAgICAgICBpbnQgbWF4UG9zID0gdHJh
Y2tMZW4gLSB0aHVtYkxlbjsKKyAgICAgICAgaW50IGRlbHRhID0gMDsKKyAgICAgICAgaWYgKG1f
b3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgICAgIGRlbHRhID0g
Y29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueCgpIC0gbV9wcmVzc2VkUG9z
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZWx0YSA9IGNvbnZlcnRGcm9tQ29udGFpbmlu
Z1dpbmRvdyhldnQucG9zKCkpLnkoKSAtIG1fcHJlc3NlZFBvczsKKworICAgICAgICBpZiAoZGVs
dGEgPiAwKQorICAgICAgICAgICAgLy8gVGhlIG1vdXNlIG1vdmVkIGRvd24vcmlnaHQuCisgICAg
ICAgICAgICBkZWx0YSA9IG1pbihtYXhQb3MgLSB0aHVtYlBvcywgZGVsdGEpOworICAgICAgICBl
bHNlIGlmIChkZWx0YSA8IDApCisgICAgICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgdXAvbGVm
dC4KKyAgICAgICAgICAgIGRlbHRhID0gbWF4KC10aHVtYlBvcywgZGVsdGEpOworCisgICAgICAg
IGlmIChkZWx0YSAhPSAwKSB7CisgICAgICAgICAgICBzZXRWYWx1ZSgoZmxvYXQpKHRodW1iUG9z
ICsgZGVsdGEpICogKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkgLyAodHJhY2tMZW4gLSB0
aHVtYkxlbikpOworICAgICAgICAgICAgbV9wcmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24oKSAt
IHRodW1iUG9zOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICBpZiAobV9wcmVzc2VkUGFydCAhPSBOb1BhcnQpCisgICAgICAgIG1fcHJlc3Nl
ZFBvcyA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBjb252ZXJ0RnJv
bUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkgOiBjb252ZXJ0RnJvbUNvbnRhaW5pbmdX
aW5kb3coZXZ0LnBvcygpKS55KCkpOworCisgICAgU2Nyb2xsYmFyUGFydCBwYXJ0ID0gaGl0VGVz
dChldnQpOyAgICAKKyAgICBpZiAocGFydCAhPSBtX2hvdmVyZWRQYXJ0KSB7CisgICAgICAgIGlm
IChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkgeworICAgICAgICAgICAgaWYgKHBhcnQgPT0gbV9w
cmVzc2VkUGFydCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBpcyBtb3ZpbmcgYmFj
ayBvdmVyIHRoZSBwcmVzc2VkIHBhcnQuICBXZQorICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8g
c3RhcnQgdXAgdGhlIHRpbWVyIGFjdGlvbiBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBzdGFydFRp
bWVySWZOZWVkZWQoY05vcm1hbFRpbWVyRGVsYXkpOworICAgICAgICAgICAgICAgIGludmFsaWRh
dGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtX2hvdmVyZWRQ
YXJ0ID09IG1fcHJlc3NlZFBhcnQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbW91c2UgaXMg
bGVhdmluZyB0aGUgcHJlc3NlZCBwYXJ0LiAgS2lsbCBvdXIgdGltZXIKKyAgICAgICAgICAgICAg
ICAvLyBpZiBuZWVkZWQuCisgICAgICAgICAgICAgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKKyAg
ICAgICAgICAgICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KHBhcnQpOwor
ICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9ob3ZlcmVkUGFydCk7CisgICAgICAgIH0KKyAg
ICAgICAgbV9ob3ZlcmVkUGFydCA9IHBhcnQ7CisgICAgfSAKKworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU91dEV2ZW50KGNvbnN0IFBs
YXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBh
cnQpOworICAgIG1faG92ZXJlZFBhcnQgPSBOb1BhcnQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VQcmVzc0V2ZW50KGNvbnN0IFBs
YXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAgIG1fcHJlc3NlZFBhcnQgPSBoaXRUZXN0KGV2
dCk7CisgICAgbV9wcmVzc2VkUG9zID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9s
bGJhciA/IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZl
cnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLnkoKSk7CisgICAgaW52YWxpZGF0ZVBh
cnQobV9wcmVzc2VkUGFydCk7CisgICAgYXV0b3Njcm9sbFByZXNzZWRQYXJ0KGNJbml0aWFsVGlt
ZXJEZWxheSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6
OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQor
eworICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgIG1fcHJlc3NlZFBhcnQg
PSBOb1BhcnQ7CisgICAgbV9wcmVzc2VkUG9zID0gMDsKKyAgICBzdG9wVGltZXJJZk5lZWRlZCgp
OworCisgICAgaWYgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKQorICAgICAg
ICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSktPmZyYW1lKCktPmV2ZW50SGFuZGxl
cigpLT5zZXRNb3VzZVByZXNzZWQoZmFsc2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Zv
aWQgUGxhdGZvcm1TY3JvbGxiYXI6OnN0YXJ0VGltZXJJZk5lZWRlZChkb3VibGUgZGVsYXkpCit7
CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0aHVtYi4KKyAgICBpZiAobV9wcmVz
c2VkUGFydCA9PSBUaHVtYlBhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEhhbmRsZSB0
aGUgdHJhY2suICBXZSBoYWx0IHRyYWNrIHNjcm9sbGluZyBvbmNlIHRoZSB0aHVtYiBpcyBsZXZl
bAorICAgIC8vIHdpdGggdXMuCisgICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1Bh
cnQgfHwgbV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KSAmJiB0aHVtYlVuZGVyTW91
c2UoKSkgeworICAgICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAg
bV9ob3ZlcmVkUGFydCA9IFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFdlIGNhbid0IHNjcm9sbCBpZiB3ZSd2ZSBoaXQgdGhlIGJlZ2lubmluZyBvciBlbmQuCisg
ICAgU2Nyb2xsRGlyZWN0aW9uIGRpciA9IHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCk7Cisg
ICAgaWYgKGRpciA9PSBTY3JvbGxVcCB8fCBkaXIgPT0gU2Nyb2xsTGVmdCkgeworICAgICAgICBp
ZiAobV9jdXJyZW50UG9zID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsK
KyAgICAgICAgaWYgKG1fY3VycmVudFBvcyA9PSBtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUp
CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zY3JvbGxUaW1lci5zdGFydE9u
ZVNob3QoZGVsYXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzdG9wVGltZXJJZk5l
ZWRlZCgpCit7CisgICAgaWYgKG1fc2Nyb2xsVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9z
Y3JvbGxUaW1lci5zdG9wKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3Jv
bGxQcmVzc2VkUGFydChkb3VibGUgZGVsYXkpCit7CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcg
Zm9yIHRoZSB0aHVtYiBvciBpZiBub3RoaW5nIHdhcyBwcmVzc2VkLgorICAgIGlmIChtX3ByZXNz
ZWRQYXJ0ID09IFRodW1iUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IE5vUGFydCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4KKyAgICBpZiAoKG1fcHJlc3NlZFBh
cnQgPT0gQmFja1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFja1BhcnQp
ICYmIHRodW1iVW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3Nl
ZFBhcnQpOworICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgLy8gSGFuZGxlIHRoZSBhcnJvd3MgYW5kIHRyYWNrLgorICAgIGlm
IChzY3JvbGwocHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKSwgcHJlc3NlZFBhcnRTY3JvbGxH
cmFudWxhcml0eSgpKSkKKyAgICAgICAgc3RhcnRUaW1lcklmTmVlZGVkKGRlbGF5KTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQoVGltZXI8UGxhdGZv
cm1TY3JvbGxiYXI+KikKK3sKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoY05vcm1hbFRpbWVy
RGVsYXkpOworfQorCitTY3JvbGxEaXJlY3Rpb24gUGxhdGZvcm1TY3JvbGxiYXI6OnByZXNzZWRQ
YXJ0U2Nyb2xsRGlyZWN0aW9uKCkKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9u
dGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25Q
YXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgIHJldHVy
biBTY3JvbGxMZWZ0OworICAgICAgICByZXR1cm4gU2Nyb2xsUmlnaHQ7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2Vk
UGFydCA9PSBCYWNrVHJhY2tQYXJ0KQorICAgICAgICAgICAgcmV0dXJuIFNjcm9sbFVwOworICAg
ICAgICByZXR1cm4gU2Nyb2xsRG93bjsKKyAgICB9Cit9CisKK1Njcm9sbEdyYW51bGFyaXR5IFBs
YXRmb3JtU2Nyb2xsYmFyOjpwcmVzc2VkUGFydFNjcm9sbEdyYW51bGFyaXR5KCkKK3sKKyAgICBp
ZiAobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZv
cndhcmRCdXR0b25QYXJ0KQorICAgICAgICByZXR1cm4gU2Nyb2xsQnlMaW5lOworICAgIHJldHVy
biBTY3JvbGxCeVBhZ2U7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iVW5kZXJN
b3VzZSgpCit7CisgICAgLy8gQ29uc3RydWN0IGEgcmVjdC4KKyAgICBJbnRSZWN0IHRodW1iID0g
dGh1bWJSZWN0KCk7CisgICAgdGh1bWIubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnQgYmVnaW4g
PSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLngoKSA6IHRo
dW1iLnkoKTsKKyAgICBpbnQgZW5kID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9s
bGJhcikgPyB0aHVtYi5yaWdodCgpIDogdGh1bWIuYm90dG9tKCk7CisgICAgcmV0dXJuIChiZWdp
biA8PSBtX3ByZXNzZWRQb3MgJiYgbV9wcmVzc2VkUG9zIDwgZW5kKTsKK30KKworaW50IFBsYXRm
b3JtU2Nyb2xsYmFyOjpob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KFNjcm9sbGJhckNvbnRyb2xT
aXplIGNvbnRyb2xTaXplKQoreworICAgIHJldHVybiBjSG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xT
aXplXTsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp2ZXJ0aWNhbFNjcm9sbGJhcldpZHRo
KFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAgIHJldHVybiBjVmVydGlj
YWxIZWlnaHRbY29udHJvbFNpemVdOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp3
aW5kb3dDbGlwUmVjdCgpIGNvbnN0Cit7CisgICAgSW50UmVjdCBjbGlwUmVjdCgwLCAwLCB3aWR0
aCgpLCBoZWlnaHQoKSk7CisgICAgY2xpcFJlY3QgPSBjb252ZXJ0VG9Db250YWluaW5nV2luZG93
KGNsaXBSZWN0KTsKKyAgICBpZiAobV9jbGllbnQpCisgICAgICAgIGNsaXBSZWN0LmludGVyc2Vj
dChtX2NsaWVudC0+d2luZG93Q2xpcFJlY3QoKSk7CisgICAgcmV0dXJuIGNsaXBSZWN0OworfQor
Cit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEdyaXBwZXIoSERDIGhkYywgY29uc3QgSW50
UmVjdCYgcmVjdCkgY29uc3QKK3sKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6Z3Jp
cHBlclJlY3QoY29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25zdAoreworICAgIHJldHVybiBJ
bnRSZWN0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnRoZW1lQ2hhbmdlZCgpCit7
Cit9CisKK30KKworI2VuZGlmIC8vIGRlZmluZWQoVVNFX1NBRkFSSV9USEVNRSkKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHJldmlzaW9u
IDMwNDU2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAw
NyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4
IEJyZW50IEZ1bGdoYW0KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjUsOCAr
MjYsNiBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpZmRlZiBVU0VfU0FGQVJJX1RIRU1F
IAotCiAjaW5jbHVkZSAiUGxhdGZvcm1TY3JvbGxCYXIuaCIKIAogI2luY2x1ZGUgIkV2ZW50SGFu
ZGxlci5oIgpAQCAtMzcsNDYgKzM2LDg5IEBACiAjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50
LmgiCiAjaW5jbHVkZSAiU29mdExpbmtpbmcuaCIKIAotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9D
b3JlR3JhcGhpY3MuaD4KLSNpbmNsdWRlIDxTYWZhcmlUaGVtZS9TYWZhcmlUaGVtZS5oPgorI2lu
Y2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlICJSZW5kZXJUaGVtZVdpbi5oIgogCi0vLyBGSVhN
RTogVGhlcmUgYXJlIHJlcGFpbnRpbmcgcHJvYmxlbXMgZHVlIHRvIEFxdWEgc2Nyb2xsIGJhciBi
dXR0b25zJyB2aXN1YWwgb3ZlcmZsb3cuCisvLyBHZW5lcmljIHN0YXRlIGNvbnN0YW50cworI2Rl
ZmluZSBUU19OT1JNQUwgICAgMQorI2RlZmluZSBUU19IT1ZFUiAgICAgMgorI2RlZmluZSBUU19B
Q1RJVkUgICAgMworI2RlZmluZSBUU19ESVNBQkxFRCAgNAorI2RlZmluZSBUU19GT0NVU0VEICAg
NQorCisjZGVmaW5lIEFCU19VUE5PUk1BTCAxCisjZGVmaW5lIEFCU19ET1dOTk9STUFMIDUKKyNk
ZWZpbmUgQUJTX0xFRlROT1JNQUwgOQorI2RlZmluZSBBQlNfUklHSFROT1JNQUwgMTMKKworY29u
c3QgdW5zaWduZWQgU1BfQUJTX0hPVF9NT0RJRklFUiA9IDE7Citjb25zdCB1bnNpZ25lZCBTUF9B
QlNfUFJFU1NFRF9NT0RJRklFUiA9IDI7Citjb25zdCB1bnNpZ25lZCBTUF9BQlNfRElTQUJMRV9N
T0RJRklFUiA9IDM7CisKKy8vIFNjcm9sbGJhciBjb25zdGFudHMKKyNkZWZpbmUgU1BfQlVUVE9O
IDEKKyNkZWZpbmUgU1BfVEhVTUJIT1IgMgorI2RlZmluZSBTUF9USFVNQlZFUlQgMworI2RlZmlu
ZSBTUF9UUkFDS1NUQVJUSE9SIDQKKyNkZWZpbmUgU1BfVFJBQ0tFTkRIT1IgNQorI2RlZmluZSBT
UF9UUkFDS1NUQVJUVkVSVCA2CisjZGVmaW5lIFNQX1RSQUNLRU5EVkVSVCA3CisjZGVmaW5lIFNQ
X0dSSVBQRVJIT1IgOAorI2RlZmluZSBTUF9HUklQUEVSVkVSVCA5CiAKIHVzaW5nIG5hbWVzcGFj
ZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIFNhZmFyaVRo
ZW1lOwotCiAvLyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGVzZSBudW1iZXJzIGZyb20gU2FmYXJp
VGhlbWUKLXN0YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aFtdID0geyAxNSwgMTEgfTsKLXN0YXRp
YyBpbnQgY0hvcml6b250YWxIZWlnaHRbXSA9IHsgMTUsIDExIH07Ci1zdGF0aWMgaW50IGNWZXJ0
aWNhbFdpZHRoW10gPSB7IDE1LCAxMSB9Owotc3RhdGljIGludCBjVmVydGljYWxIZWlnaHRbXSA9
IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNIb3Jpem9udGFsV2lkdGhbXSA9IHsgMTcsIDExIH07
CitzdGF0aWMgaW50IGNIb3Jpem9udGFsSGVpZ2h0W10gPSB7IDE3LCAxMSB9Oworc3RhdGljIGlu
dCBjVmVydGljYWxXaWR0aFtdID0geyAxNywgMTEgfTsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsSGVp
Z2h0W10gPSB7IDE3LCAxMSB9Owogc3RhdGljIGludCBjUmVhbEJ1dHRvbkxlbmd0aFtdID0geyAy
OCwgMjEgfTsKIHN0YXRpYyBpbnQgY0J1dHRvbkluc2V0W10gPSB7IDE0LCAxMSB9Owogc3RhdGlj
IGludCBjQnV0dG9uSGl0SW5zZXRbXSA9IHsgMywgMiB9OwogLy8gY1JlYWxCdXR0b25MZW5ndGgg
LSBjQnV0dG9uSW5zZXQKIHN0YXRpYyBpbnQgY0J1dHRvbkxlbmd0aFtdID0geyAxNCwgMTAgfTsK
LXN0YXRpYyBpbnQgY1RodW1iV2lkdGhbXSA9IHsgMTUsIDExIH07Ci1zdGF0aWMgaW50IGNUaHVt
YkhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1RodW1iV2lkdGhbXSA9IHsgMTcs
IDExIH07CitzdGF0aWMgaW50IGNUaHVtYkhlaWdodFtdID0geyAxNywgMTEgfTsKIHN0YXRpYyBp
bnQgY1RodW1iTWluTGVuZ3RoW10gPSB7IDI2LCAyMCB9OwogCi0jaWYgIWRlZmluZWQoTkRFQlVH
KSAmJiBkZWZpbmVkKFVTRV9ERUJVR19TQUZBUklfVEhFTUUpCi1TT0ZUX0xJTktfREVCVUdfTElC
UkFSWShTYWZhcmlUaGVtZSkKLSNlbHNlCi1TT0ZUX0xJTktfTElCUkFSWShTYWZhcmlUaGVtZSkK
LSNlbmRpZgogCi1TT0ZUX0xJTksoU2FmYXJpVGhlbWUsIHBhaW50VGhlbWVQYXJ0LCB2b2lkLCBf
X3N0ZGNhbGwsIChUaGVtZVBhcnQgcGFydCwgQ0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENH
UmVjdCYgcmVjdCwgTlNDb250cm9sU2l6ZSBzaXplLCBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSks
IChwYXJ0LCBjb250ZXh0LCByZWN0LCBzaXplLCBzdGF0ZSkpCisvLyBGSVhNRTogIFJlZmFjdG9y
IHRoZSBzb2Z0LWxpbmtpbmcgY29kZSBzbyB0aGF0IGl0IGNhbiBiZSBzaGFyZWQgd2l0aCBSZW5k
ZXJUaGVtZVdpbgorU09GVF9MSU5LX0xJQlJBUlkodXh0aGVtZSkKK1NPRlRfTElOSyh1eHRoZW1l
LCBPcGVuVGhlbWVEYXRhLCBIQU5ETEUsIFdJTkFQSSwgKEhXTkQgaHduZCwgTFBDV1NUUiBwc3pD
bGFzc0xpc3QpLCAoaHduZCwgcHN6Q2xhc3NMaXN0KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBDbG9z
ZVRoZW1lRGF0YSwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSksIChoVGhlbWUpKQor
U09GVF9MSU5LKHV4dGhlbWUsIERyYXdUaGVtZUJhY2tncm91bmQsIEhSRVNVTFQsIFdJTkFQSSwg
KEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0
IFJFQ1QqIHBSZWN0LCBjb25zdCBSRUNUKiBwQ2xpcFJlY3QpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0
SWQsIGlTdGF0ZUlkLCBwUmVjdCwgcENsaXBSZWN0KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBEcmF3
VGhlbWVFZGdlLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQg
aVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUKiBwUmVjdCwgdW5zaWduZWQgdUVkZ2Us
IHVuc2lnbmVkIHVGbGFncywgY29uc3QgUkVDVCogcENsaXBSZWN0KSwgKGhUaGVtZSwgaGRjLCBp
UGFydElkLCBpU3RhdGVJZCwgcFJlY3QsIHVFZGdlLCB1RmxhZ3MsIHBDbGlwUmVjdCkpCitTT0ZU
X0xJTksodXh0aGVtZSwgR2V0VGhlbWVDb250ZW50UmVjdCwgSFJFU1VMVCwgV0lOQVBJLCAoSEFO
RExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgY29uc3QgUkVD
VCogcFJlY3QsIGNvbnN0IFJFQ1QqIHBDb250ZW50UmVjdCksIChoVGhlbWUsIGhkYywgaVBhcnRJ
ZCwgaVN0YXRlSWQsIHBSZWN0LCBwQ29udGVudFJlY3QpKQorU09GVF9MSU5LKHV4dGhlbWUsIEdl
dFRoZW1lUGFydFNpemUsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMs
IGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIFJFQ1QqIHBSZWN0LCBpbnQgdHMsIFNJWkUqIHBz
eiksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRlSWQsIHBSZWN0LCB0cywgcHN6KSkKK1NP
RlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZVN5c0ZvbnQsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRM
RSBoVGhlbWUsIGludCBpRm9udElkLCBPVVQgTE9HRk9OVCogcEZvbnQpLCAoaFRoZW1lLCBpRm9u
dElkLCBwRm9udCkpCitTT0ZUX0xJTksodXh0aGVtZSwgR2V0VGhlbWVDb2xvciwgSFJFU1VMVCwg
V0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIGludCBpU3RhdGVJ
ZCwgaW50IGlQcm9wSWQsIE9VVCBDT0xPUlJFRiogcENvbG9yKSwgKGhUaGVtZSwgaGRjLCBpUGFy
dElkLCBpU3RhdGVJZCwgaVByb3BJZCwgcENvbG9yKSkKKworLy8gTWF5IG5lZWQgdG8gYWRkIHN0
dWZmIHRvIHRoZXNlIGxhdGVyLCBzbyBrZWVwIHRoZSBncmFwaGljcyBjb250ZXh0IHJldHJpZXZh
bC9yZWxlYXNlIGluIHNvbWUgaGVscGVycy4KK3N0YXRpYyBIREMgcHJlcGFyZUZvckRyYXdpbmco
R3JhcGhpY3NDb250ZXh0KiBnLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIHJldHVybiBnLT5n
ZXRXaW5kb3dzQ29udGV4dChyKTsKK30KKyAKK3N0YXRpYyB2b2lkIGRvbmVEcmF3aW5nKEdyYXBo
aWNzQ29udGV4dCogZywgSERDIGhkYywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBnLT5yZWxl
YXNlV2luZG93c0NvbnRleHQoaGRjLCByKTsKK30KKy8vIEVuZCBDb3BpZWQgZnJvbSBSZW5kZXJU
aGVtZVdpbgogCiBjb25zdCBkb3VibGUgY0luaXRpYWxUaW1lckRlbGF5ID0gMC4yNTsKIGNvbnN0
IGRvdWJsZSBjTm9ybWFsVGltZXJEZWxheSA9IDAuMDU7CiAKIFBsYXRmb3JtU2Nyb2xsYmFyOjpQ
bGF0Zm9ybVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwgU2Nyb2xsYmFyT3JpZW50
YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCi0gICAgOiBTY3Jv
bGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6ZSksIG1faG92ZXJlZFBhcnQoTm9QYXJ0KSwg
bV9wcmVzc2VkUGFydChOb1BhcnQpLCBtX3ByZXNzZWRQb3MoMCksCi0gICAgICBtX3Njcm9sbFRp
bWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQpLAotICAg
ICAgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCisgICAgOiBTY3JvbGxiYXIoY2xpZW50LCBvcmll
bnRhdGlvbiwgc2l6ZSkKKyAgICAsIG1faG92ZXJlZFBhcnQoTm9QYXJ0KQorICAgICwgbV9wcmVz
c2VkUGFydChOb1BhcnQpCisgICAgLCBtX3ByZXNzZWRQb3MoMCkKKyAgICAsIG1fc2Nyb2xsVGlt
ZXIodGhpcywgJlBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZCkKKyAgICAs
IG1fb3ZlcmxhcHNSZXNpemVyKGZhbHNlKQorICAgICwgbV9zY3JvbGxCYXJUaGVtZSgwKQogewog
ICAgIC8vIE9idGFpbiB0aGUgY29ycmVjdCBzY3JvbGxiYXIgc2l6ZXMgZnJvbSB0aGUgc3lzdGVt
LgogICAgIGlmICghY0hvcml6b250YWxXaWR0aCkgewpAQCAtOTIsNiArMTM0LDE0IEBAIFBsYXRm
b3JtU2Nyb2xsYmFyOjpQbGF0Zm9ybVNjcm9sbGJhcihTY3IKIFBsYXRmb3JtU2Nyb2xsYmFyOjp+
UGxhdGZvcm1TY3JvbGxiYXIoKQogewogICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisKKyAgICAv
LyBDbGVhbnVwIHRoZW1lIHN0b3V0LnVmZgorICAgIGlmICghdXh0aGVtZUxpYnJhcnkoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIENsb3Nl
VGhlbWVEYXRhKG1fc2Nyb2xsQmFyVGhlbWUpOworICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSAwOwog
fQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlBvc2l0aW9uKCkKQEAgLTMx
MCw2ICszNjAsMTEgQEAgSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJSZWN0KCkgYwog
ICAgIHJldHVybiB0aHVtYlJlY3Q7CiB9CiAKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6Omdy
aXBwZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4g
SW50UmVjdCgpOworfQorCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0
IEludFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0
aHVtYlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0KSBjb25zdAogewogICAgIC8vIFRoaXMg
ZnVuY3Rpb24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRv
IGhhdmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFz
dApAQCAtMzU1LDY4ICs0MTAsMTM0IEBAIGludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5n
dGgoKSBjb24KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRCdXR0b24oR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJ
bnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAogewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5
KCkpCi0gICAgICAgIHJldHVybjsKLQogICAgIEludFJlY3QgcGFpbnRSZWN0ID0gYnV0dG9uUmVw
YWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwgc3RhcnQpOwogICAg
IAogICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCiAgICAgICAgIHJl
dHVybjsKIAotICAgIFRoZW1lUGFydCBwYXJ0OwotICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRl
ID0gMDsKLSAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9IEFj
dGl2ZVN0YXRlOwotICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIp
Ci0gICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbExlZnRBcnJvd1BhcnQgOiBTY3JvbGxSaWdo
dEFycm93UGFydDsKLSAgICBlbHNlCi0gICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbFVwQXJy
b3dQYXJ0IDogU2Nyb2xsRG93bkFycm93UGFydDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gMDsKKyAg
ICB1bnNpZ25lZCBzdGF0ZSA9IDA7CisgICAgdW5zaWduZWQgY2xhc3NpY1BhcnQgPSAwOworICAg
IHVuc2lnbmVkIGNsYXNzaWNTdGF0ZSA9IDA7CiAKLSAgICBpZiAoaXNFbmFibGVkKCkpCi0gICAg
ICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKLSAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFj
a0J1dHRvblBhcnQgJiYgc3RhcnQpCi0gICAgICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZvcndh
cmRCdXR0b25QYXJ0ICYmICFzdGFydCkpCi0gICAgICAgIHN0YXRlIHw9IFByZXNzZWRTdGF0ZTsK
KyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAg
c3RhdGUgPSBzdGFydCA/IEFCU19MRUZUTk9STUFMIDogQUJTX1JJR0hUTk9STUFMOworICAgICAg
IGNsYXNzaWNQYXJ0ID0gc3RhcnQgPyBERkNTX1NDUk9MTExFRlQgOiBERkNTX1NDUk9MTFJJR0hU
OworICAgIH0gZWxzZSB7CisgICAgICAgc3RhdGUgPSBzdGFydCA/IEFCU19VUE5PUk1BTCA6IEFC
U19ET1dOTk9STUFMOworICAgICAgIGNsYXNzaWNQYXJ0ID0gc3RhcnQgPyBERkNTX1NDUk9MTFVQ
IDogREZDU19TQ1JPTExET1dOOworICAgIH0KIAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21h
bGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwg
c3RhdGUpOworICAgIGlmICghaXNFbmFibGVkKCkpIHsKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJT
X0RJU0FCTEVfTU9ESUZJRVI7CisgICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0lOQUNUSVZF
OworICAgIH0KKyAgICBlbHNlIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCAm
JiBzdGFydCkKKyAgICAgICAgICB8fCAobV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkQnV0dG9uUGFy
dCAmJiAhc3RhcnQpKQorICAgIHsKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJTX1BSRVNTRURfTU9E
SUZJRVI7CisgICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX1BVU0hFRCB8IERGQ1NfRkxBVDsK
KyAgICB9CisgICAgZWxzZSBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAgeworICAgICAg
IHN0YXRlICs9IFNQX0FCU19IT1RfTU9ESUZJRVI7CisgICAgICAgY2xhc3NpY1N0YXRlIHw9IERG
Q1NfSE9UOworICAgIH0KKworICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0
LCByZWN0KTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0OworICAgIGlmICghdXh0aGVtZUxp
YnJhcnkoKSAmJiAhbV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgbV9zY3JvbGxCYXJUaGVtZSA9
IE9wZW5UaGVtZURhdGEoMCwgTCJTY3JvbGxiYXIiKTsKKworICAgIGlmIChtX3Njcm9sbEJhclRo
ZW1lKQorICAgICAgICBEcmF3VGhlbWVCYWNrZ3JvdW5kKG1fc2Nyb2xsQmFyVGhlbWUsIGhkYywg
U1BfQlVUVE9OLCBzdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAg
RHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3aWRnZXRSZWN0LCBjbGFzc2ljUGFydCwgY2xhc3NpY1N0
YXRlKTsKKworICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcmVjdCk7CiB9CiAKIHZvaWQg
UGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VHJhY2soR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBj
b25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0
KSBjb25zdAogewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCi0gICAgICAgIHJldHVy
bjsKLQogICAgIEludFJlY3QgcGFpbnRSZWN0ID0gaGFzQnV0dG9ucygpID8gdHJhY2tSZXBhaW50
UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpKSA6IHJlY3Q7CiAgICAgCiAg
ICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIgPyBIU2Nyb2xsVHJhY2tQYXJ0IDogVlNjcm9sbFRyYWNrUGFydDsKLSAgICBUaGVtZUNv
bnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgdW5zaWduZWQgcGFydCA9IDA7CisgICAgdW5zaWdu
ZWQgY2xhc3NpY1BhcnQgPSBERkNfU0NST0xMOworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhv
cml6b250YWxTY3JvbGxiYXIpCisgICAgICAgcGFydCA9IHN0YXJ0ID8gU1BfVFJBQ0tTVEFSVEhP
UiA6IFNQX1RSQUNLRU5ESE9SOworICAgIGVsc2UKKyAgICAgICBwYXJ0ID0gc3RhcnQgPyBTUF9U
UkFDS1NUQVJUVkVSVCA6IFNQX1RSQUNLRU5EVkVSVDsKKworICAgIHVuc2lnbmVkIHN0YXRlID0g
VFNfRElTQUJMRUQ7CisgICAgdW5zaWduZWQgY2xhc3NpY1N0YXRlID0gREZDU19NT05POwogICAg
IGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKLSAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7
CisgICAgICAgIHN0YXRlIHw9IFRTX0FDVElWRTsKKyAgICBlbHNlCisgICAgICAgY2xhc3NpY1N0
YXRlIHw9IERGQ1NfSU5BQ1RJVkU7CisKICAgICBpZiAoaGFzQnV0dG9ucygpKQotICAgICAgICBz
dGF0ZSB8PSBFbmFibGVkU3RhdGU7CisgICAgICAgIHN0YXRlIHw9IFRTX05PUk1BTDsKIAotICAg
IHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJl
Y3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUg
OiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9y
RHJhd2luZyhjb250ZXh0LCByZWN0KTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0OworICAg
IGlmICh1eHRoZW1lTGlicmFyeSgpICYmICFtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBtX3Nj
cm9sbEJhclRoZW1lID0gT3BlblRoZW1lRGF0YSgwLCBMIlNjcm9sbGJhciIpOworCisgICAgaWYg
KG1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIERyYXdUaGVtZUJhY2tncm91bmQobV9zY3JvbGxC
YXJUaGVtZSwgaGRjLCBwYXJ0LCBzdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgIGVsc2UK
KyAgICAgICAgRHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3aWRnZXRSZWN0LCBERkNfU0NST0xMLCBj
bGFzc2ljU3RhdGUpOworCisgICAgZG9uZURyYXdpbmcoY29udGV4dCwgaGRjLCByZWN0KTsKIH0K
IAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNv
bnN0CiB7Ci0gICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKLSAgICAgICAgcmV0dXJuOwot
CiAgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocmVjdCkpCiAgICAgICAgIHJldHVybjsK
IAotICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyID8gSFNjcm9sbFRodW1iUGFydCA6IFZTY3JvbGxUaHVtYlBhcnQ7Ci0gICAgVGhlbWVDb250
cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIHVuc2lnbmVkIHBhcnQgPSAobV9vcmllbnRhdGlvbiA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IFNQX1RIVU1CSE9SIDogU1BfVEhVTUJWRVJUOworICAg
IHVuc2lnbmVkIHN0YXRlID0gMDsKKworICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAgIHN0
YXRlICs9IFNQX0FCU19ESVNBQkxFX01PRElGSUVSOworICAgIGVsc2UgaWYgKG1fY2xpZW50LT5p
c0FjdGl2ZSgpKQorICAgICAgIHN0YXRlICs9IFNQX0FCU19IT1RfTU9ESUZJRVI7CisKKyAgICBI
REMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoY29udGV4dCwgcmVjdCk7CisgICAgUkVDVCB3aWRn
ZXRSZWN0ID0gcmVjdDsKKyAgICBpZiAodXh0aGVtZUxpYnJhcnkoKSAmJiAhbV9zY3JvbGxCYXJU
aGVtZSkKKyAgICAgICAgbV9zY3JvbGxCYXJUaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJTY3Jv
bGxiYXIiKTsKKworICAgIGlmIChtX3Njcm9sbEJhclRoZW1lKSB7CisgICAgICAgIERyYXdUaGVt
ZUJhY2tncm91bmQobV9zY3JvbGxCYXJUaGVtZSwgaGRjLCBwYXJ0LCBzdGF0ZSwgJndpZGdldFJl
Y3QsIE5VTEwpOworICAgICAgICBwYWludEdyaXBwZXIoaGRjLCB3aWRnZXRSZWN0KTsKKyAgICB9
IGVsc2UgeworICAgICAgICBIR0RJT0JKIGhTYXZlQnJ1c2ggPSBTZWxlY3RPYmplY3QoaGRjLCBH
ZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0UpKTsKKyAgICAgICAgRHJhd0VkZ2UoaGRjLCAm
d2lkZ2V0UmVjdCwgRURHRV9SQUlTRUQsIEJGX1JFQ1QpOworICAgICAgICBTZWxlY3RPYmplY3Qo
aGRjLGhTYXZlQnJ1c2gpOworICAgIH0KKworICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywg
cmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRj
LCBjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHVuc2lnbmVkIHBhcnQgPSAobV9v
cmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IFNQX0dSSVBQRVJIT1IgOiBTUF9H
UklQUEVSVkVSVDsKKyAgICB1bnNpZ25lZCBzdGF0ZSA9IDA7CisKICAgICBpZiAobV9jbGllbnQt
PmlzQWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOwotICAgIGlmIChpc0Vu
YWJsZWQoKSkKLSAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgICAgICBzdGF0ZSB8
PSBUU19BQ1RJVkU7CiAKLSAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKSwgcmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21h
bGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7CisgICAgUkVDVCB3
aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBpZiAodXh0aGVtZUxpYnJhcnkoKSAmJiAhbV9zY3JvbGxC
YXJUaGVtZSkKKyAgICAgICAgbV9zY3JvbGxCYXJUaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJT
Y3JvbGxiYXIiKTsKKworICAgIGlmIChtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBEcmF3VGhl
bWVCYWNrZ3JvdW5kKG1fc2Nyb2xsQmFyVGhlbWUsIGhkYywgcGFydCwgc3RhdGUsICZ3aWRnZXRS
ZWN0LCBOVUxMKTsKIH0KIAogU2Nyb2xsYmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0VGVz
dChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKQEAgLTQ0OCw2ICs1NjksNyBAQCBTY3Jv
bGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0CiAgICAgICAgICAgICByZXR1cm4g
VGh1bWJQYXJ0OwogICAgICAgICByZXR1cm4gRm9yd2FyZFRyYWNrUGFydDsKICAgICB9CisKICAg
ICByZXR1cm4gTm9QYXJ0OwogfQogCkBAIC00NzYsNyArNTk4LDcgQEAgYm9vbCBQbGF0Zm9ybVNj
cm9sbGJhcjo6aGFuZGxlTW91c2VNb3ZlRQogICAgICAgICAgICAgc2V0VmFsdWUoKGZsb2F0KSh0
aHVtYlBvcyArIGRlbHRhKSAqIChtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpIC8gKHRyYWNr
TGVuIC0gdGh1bWJMZW4pKTsKICAgICAgICAgICAgIG1fcHJlc3NlZFBvcyArPSB0aHVtYlBvc2l0
aW9uKCkgLSB0aHVtYlBvczsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4g
dHJ1ZTsKICAgICB9CiAKQEAgLTYzNiwxOSArNzU4LDEyIEBAIGludCBQbGF0Zm9ybVNjcm9sbGJh
cjo6dmVydGljYWxTY3JvbGxiYXIKIEludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OndpbmRvd0Ns
aXBSZWN0KCkgY29uc3QKIHsKICAgICBJbnRSZWN0IGNsaXBSZWN0KDAsIDAsIHdpZHRoKCksIGhl
aWdodCgpKTsKKwogICAgIGNsaXBSZWN0ID0gY29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhjbGlw
UmVjdCk7CiAgICAgaWYgKG1fY2xpZW50KQogICAgICAgICBjbGlwUmVjdC5pbnRlcnNlY3QobV9j
bGllbnQtPndpbmRvd0NsaXBSZWN0KCkpOwotICAgIHJldHVybiBjbGlwUmVjdDsKLX0KIAotdm9p
ZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBoZGMsIGNvbnN0IEludFJlY3Qm
IHJlY3QpIGNvbnN0Ci17Ci19Ci0KLUludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBwZXJS
ZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKLXsKLSAgICByZXR1cm4gSW50UmVj
dCgpOworICAgIHJldHVybiBjbGlwUmVjdDsKIH0KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6
dGhlbWVDaGFuZ2VkKCkKQEAgLTY1Nyw0ICs3NzIsMyBAQCB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
Ojp0aGVtZUNoYW5nZWQoKQogCiB9CiAKLSNlbmRpZiAvLyBkZWZpbmVkKFVTRV9TQUZBUklfVEhF
TUUpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19413</attachid>
            <date>2008-02-27 15:21:43 -0800</date>
            <delta_ts>2008-02-28 17:52:58 -0800</delta_ts>
            <desc>Scrollbars-only patch (oops)</desc>
            <filename>WinScrollbars.patch</filename>
            <type>text/plain</type>
            <size>38645</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiAzMDYyNSkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIsNiArMTEyLDkgQEAKICNk
ZWZpbmUgV1RGX1BMQVRGT1JNX0NBSVJPIDEKICNlbmRpZgogCisjaWYgUExBVEZPUk0oQ0cpCisj
ZGVmaW5lIFdURl9VU0VfU0FGQVJJX1RIRU1FIDEKKyNlbmRpZgogCiAjaWZkZWYgX19TNjBfXwog
Ly8gd2UgYXJlIGNyb3NzLWNvbXBpbGluZywgaXQgaXMgbm90IHJlYWxseSB3aW5kb3dzCkluZGV4
OiBXZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2
aXNpb24gMzA2MzApCisrKyBXZWJDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDE4IEBACisyMDA4LTAyLTI3ICBCcmVudCBGdWxnaGFtIDxiZnVsZ2hhbUBnbWFpbC5jb20+
CisKKyAgICAgICAgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0ODMK
KyAgICAgICAgSW1wbGVtZW50IHNjcm9sbGJhcnMgb24gV2luZG93cyAoQ2Fpcm8pCisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV0FSTklORzogTk8gVEVT
VCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vUGxhdGZv
cm1TY3JvbGxCYXIuaDogIEFkZCB0aGVtZSBIQU5ETEUgbWVtYmVyIHRvCisgICAgICAgICAgc3Vw
cG9ydCBXaW5kb3dzLXN0eWxlIHNjcm9sbGJhcnMuCisgICAgICAgICogcGxhdGZvcm0vd2luL1Bs
YXRmcm9tU2Nyb2xsQmFyV2luLmNwcDogIER1cGxpY2F0ZSBpbXBsZW1lbnRhdGlvbgorICAgICAg
ICAgIGZyb20gUGxhdGZvcm1TY3JvbGxCYXJXaW5TYWZhcmkuY3BwLCB0aGVuIG1vZGlmeSB0byB1
c2UgdGhlCisgICAgICAgICAgbmF0aXZlIFdpbmRvd3MgdGhlbWUgZW5naW5lLiAgVXNlIFNPRlRf
TElOSworCiAyMDA4LTAyLTI3ICBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdt
YWlsLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbGV4ZXkuCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgJKHJldmlzaW9uIDMwNjI1KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAkod29ya2luZyBjb3B5KQpAQCAtMTA2
LDYgKzEwNiwxMCBAQCBwcml2YXRlOgogICAgIGludCBtX3ByZXNzZWRQb3M7CiAgICAgVGltZXI8
UGxhdGZvcm1TY3JvbGxiYXI+IG1fc2Nyb2xsVGltZXI7CiAgICAgYm9vbCBtX292ZXJsYXBzUmVz
aXplcjsKKworI2lmICFVU0UoU0FGQVJJX1RIRU1FKQorICAgIG11dGFibGUgSEFORExFIG1fc2Ny
b2xsQmFyVGhlbWU7CisjZW5kaWYKIH07CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2lu
L1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHJldmlzaW9uIDMwNDU2KQkoZnJvbSBXZWJD
b3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhclNhZmFyaS5jcHA6MzA0NTYpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw2NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNp
ZmRlZiBVU0VfU0FGQVJJX1RIRU1FIAorCisjaW5jbHVkZSAiUGxhdGZvcm1TY3JvbGxCYXIuaCIK
KworI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2lu
Y2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAi
SW50UmVjdC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlNv
ZnRMaW5raW5nLmgiCisKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+Cisj
aW5jbHVkZSA8U2FmYXJpVGhlbWUvU2FmYXJpVGhlbWUuaD4KKworLy8gRklYTUU6IFRoZXJlIGFy
ZSByZXBhaW50aW5nIHByb2JsZW1zIGR1ZSB0byBBcXVhIHNjcm9sbCBiYXIgYnV0dG9ucycgdmlz
dWFsIG92ZXJmbG93LgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBTYWZhcmlUaGVtZTsKKworLy8gRklYTUU6IFdlIHNob3Vs
ZCBnZXQgdGhlc2UgbnVtYmVycyBmcm9tIFNhZmFyaVRoZW1lCitzdGF0aWMgaW50IGNIb3Jpem9u
dGFsV2lkdGhbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNIb3Jpem9udGFsSGVpZ2h0W10g
PSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVmVydGljYWxXaWR0aFtdID0geyAxNSwgMTEgfTsK
K3N0YXRpYyBpbnQgY1ZlcnRpY2FsSGVpZ2h0W10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBj
UmVhbEJ1dHRvbkxlbmd0aFtdID0geyAyOCwgMjEgfTsKK3N0YXRpYyBpbnQgY0J1dHRvbkluc2V0
W10gPSB7IDE0LCAxMSB9Oworc3RhdGljIGludCBjQnV0dG9uSGl0SW5zZXRbXSA9IHsgMywgMiB9
OworLy8gY1JlYWxCdXR0b25MZW5ndGggLSBjQnV0dG9uSW5zZXQKK3N0YXRpYyBpbnQgY0J1dHRv
bkxlbmd0aFtdID0geyAxNCwgMTAgfTsKK3N0YXRpYyBpbnQgY1RodW1iV2lkdGhbXSA9IHsgMTUs
IDExIH07CitzdGF0aWMgaW50IGNUaHVtYkhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBp
bnQgY1RodW1iTWluTGVuZ3RoW10gPSB7IDI2LCAyMCB9OworCisjaWYgIWRlZmluZWQoTkRFQlVH
KSAmJiBkZWZpbmVkKFVTRV9ERUJVR19TQUZBUklfVEhFTUUpCitTT0ZUX0xJTktfREVCVUdfTElC
UkFSWShTYWZhcmlUaGVtZSkKKyNlbHNlCitTT0ZUX0xJTktfTElCUkFSWShTYWZhcmlUaGVtZSkK
KyNlbmRpZgorCitTT0ZUX0xJTksoU2FmYXJpVGhlbWUsIHBhaW50VGhlbWVQYXJ0LCB2b2lkLCBf
X3N0ZGNhbGwsIChUaGVtZVBhcnQgcGFydCwgQ0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENH
UmVjdCYgcmVjdCwgTlNDb250cm9sU2l6ZSBzaXplLCBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSks
IChwYXJ0LCBjb250ZXh0LCByZWN0LCBzaXplLCBzdGF0ZSkpCisKK2NvbnN0IGRvdWJsZSBjSW5p
dGlhbFRpbWVyRGVsYXkgPSAwLjI1OworY29uc3QgZG91YmxlIGNOb3JtYWxUaW1lckRlbGF5ID0g
MC4wNTsKKworUGxhdGZvcm1TY3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9sbGJhckNs
aWVudCogY2xpZW50LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFy
Q29udHJvbFNpemUgc2l6ZSkKKyAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBz
aXplKSwgbV9ob3ZlcmVkUGFydChOb1BhcnQpLCBtX3ByZXNzZWRQYXJ0KE5vUGFydCksIG1fcHJl
c3NlZFBvcygwKSwKKyAgICAgIG1fc2Nyb2xsVGltZXIodGhpcywgJlBsYXRmb3JtU2Nyb2xsYmFy
OjphdXRvc2Nyb2xsVGltZXJGaXJlZCksCisgICAgICBtX292ZXJsYXBzUmVzaXplcihmYWxzZSkK
K3sKKyAgICAvLyBPYnRhaW4gdGhlIGNvcnJlY3Qgc2Nyb2xsYmFyIHNpemVzIGZyb20gdGhlIHN5
c3RlbS4KKyAgICBpZiAoIWNIb3Jpem9udGFsV2lkdGgpIHsKKyAgICAgICAgLy8gRklYTUU6IEdl
dCBtZXRpY3MgZnJvbSBTYWZhcmlUaGVtZQorICAgIH0KKworICAgIGlmIChvcmllbnRhdGlvbiA9
PSBWZXJ0aWNhbFNjcm9sbGJhcikKKyAgICAgICAgc2V0RnJhbWVHZW9tZXRyeShJbnRSZWN0KDAs
IDAsIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxIZWlnaHRbY29udHJv
bFNpemUoKV0pKTsKKyAgICBlbHNlCisgICAgICAgIHNldEZyYW1lR2VvbWV0cnkoSW50UmVjdCgw
LCAwLCBjSG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtj
b250cm9sU2l6ZSgpXSkpOworfQorCitQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRmb3JtU2Nyb2xs
YmFyKCkKK3sKKyAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Ny
b2xsYmFyOjp1cGRhdGVUaHVtYlBvc2l0aW9uKCkKK3sKKyAgICBpbnZhbGlkYXRlVHJhY2soKTsK
K30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQcm9wb3J0aW9uKCkKK3sK
KyAgICBpbnZhbGlkYXRlVHJhY2soKTsKK30KKworc3RhdGljIEludFJlY3QgdHJhY2tSZXBhaW50
UmVjdChjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVu
dGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6ZSkKK3sKKyAgICBJbnRSZWN0
IHBhaW50UmVjdCh0cmFja1JlY3QpOworICAgIGlmIChvcmllbnRhdGlvbiA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyKQorICAgICAgICBwYWludFJlY3QuaW5mbGF0ZVgoY0J1dHRvbkxlbmd0aFtjb250
cm9sU2l6ZV0pOworICAgIGVsc2UKKyAgICAgICAgcGFpbnRSZWN0LmluZmxhdGVZKGNCdXR0b25M
ZW5ndGhbY29udHJvbFNpemVdKTsKKworICAgIHJldHVybiBwYWludFJlY3Q7Cit9CisKK3N0YXRp
YyBJbnRSZWN0IGJ1dHRvblJlcGFpbnRSZWN0KGNvbnN0IEludFJlY3QmIGJ1dHRvblJlY3QsIFNj
cm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250
cm9sU2l6ZSwgYm9vbCBzdGFydCkKK3sKKyAgICBJbnRSZWN0IHBhaW50UmVjdChidXR0b25SZWN0
KTsKKyAgICBpZiAob3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAg
ICBwYWludFJlY3Quc2V0V2lkdGgoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemVdKTsKKyAg
ICAgICAgaWYgKCFzdGFydCkKKyAgICAgICAgICAgIHBhaW50UmVjdC5zZXRYKGJ1dHRvblJlY3Qu
eCgpIC0gKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSAtIGJ1dHRvblJlY3Qud2lkdGgo
KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhaW50UmVjdC5zZXRIZWlnaHQoY1JlYWxCdXR0
b25MZW5ndGhbY29udHJvbFNpemVdKTsKKyAgICAgICAgaWYgKCFzdGFydCkKKyAgICAgICAgICAg
IHBhaW50UmVjdC5zZXRZKGJ1dHRvblJlY3QueSgpIC0gKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRy
b2xTaXplXSAtIGJ1dHRvblJlY3QuaGVpZ2h0KCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGFp
bnRSZWN0OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjppbnZhbGlkYXRlVHJhY2soKQor
eworICAgIEludFJlY3QgcmVjdCA9IHRyYWNrUmVwYWludFJlY3QodHJhY2tSZWN0KCksIG1fb3Jp
ZW50YXRpb24sIGNvbnRyb2xTaXplKCkpOworICAgIHJlY3QubW92ZSgteCgpLCAteSgpKTsKKyAg
ICBpbnZhbGlkYXRlUmVjdChyZWN0KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52
YWxpZGF0ZVBhcnQoU2Nyb2xsYmFyUGFydCBwYXJ0KQoreworICAgIGlmIChwYXJ0ID09IE5vUGFy
dCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCByZXN1bHQ7ICAgIAorICAgIHN3aXRj
aCAocGFydCkgeworICAgICAgICBjYXNlIEJhY2tCdXR0b25QYXJ0OgorICAgICAgICAgICAgcmVz
dWx0ID0gYnV0dG9uUmVwYWludFJlY3QoYmFja0J1dHRvblJlY3QoKSwgbV9vcmllbnRhdGlvbiwg
Y29udHJvbFNpemUoKSwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBG
b3J3YXJkQnV0dG9uUGFydDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGJ1dHRvblJlcGFpbnRSZWN0
KGZvcndhcmRCdXR0b25SZWN0KCksIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIGZhbHNl
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBJ
bnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdDsKKyAgICAg
ICAgICAgIHNwbGl0VHJhY2sodHJhY2tSZWN0KCksIGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0
LCBhZnRlclRodW1iUmVjdCk7CisgICAgICAgICAgICBpZiAocGFydCA9PSBCYWNrVHJhY2tQYXJ0
KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJlZm9yZVRodW1iUmVjdDsKKyAgICAgICAgICAg
IGVsc2UgaWYgKHBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkKKyAgICAgICAgICAgICAgICByZXN1
bHQgPSBhZnRlclRodW1iUmVjdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBy
ZXN1bHQgPSB0aHVtYlJlY3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0Lm1vdmUoLXgo
KSwgLXkoKSk7CisgICAgaW52YWxpZGF0ZVJlY3QocmVzdWx0KTsKK30KKworaW50IFBsYXRmb3Jt
U2Nyb2xsYmFyOjp3aWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdpZGdldDo6d2lkdGgoKTsK
K30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjpoZWlnaHQoKSBjb25zdAoreworICAgIHJldHVy
biBXaWRnZXQ6OmhlaWdodCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRSZWN0
KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgLy8gR2V0IG91ciB3aW5kb3cgcmVzaXplciBy
ZWN0IGFuZCBzZWUgaWYgd2Ugb3ZlcmxhcC4gIEFkanVzdCB0byBhdm9pZCB0aGUgb3ZlcmxhcAor
ICAgIC8vIGlmIG5lY2Vzc2FyeS4KKyAgICBJbnRSZWN0IGFkanVzdGVkUmVjdChyZWN0KTsKKyAg
ICBpZiAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgYm9v
bCBvdmVybGFwc1Jlc2l6ZXIgPSBmYWxzZTsKKyAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gc3Rh
dGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworICAgICAgICBJbnRSZWN0IHJlc2l6ZXJS
ZWN0ID0gdmlldy0+d2luZG93UmVzaXplclJlY3QoKTsKKyAgICAgICAgcmVzaXplclJlY3Quc2V0
TG9jYXRpb24odmlldy0+Y29udmVydEZyb21Db250YWluaW5nV2luZG93KHJlc2l6ZXJSZWN0Lmxv
Y2F0aW9uKCkpKTsKKyAgICAgICAgaWYgKHJlY3QuaW50ZXJzZWN0cyhyZXNpemVyUmVjdCkpIHsK
KyAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsK
KyAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcCA9IHJlY3QucmlnaHQoKSAtIHJlc2l6ZXJSZWN0
LngoKTsKKyAgICAgICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDAgJiYgcmVzaXplclJlY3Qucmln
aHQoKSA+PSByZWN0LnJpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRSZWN0
LnNldFdpZHRoKHJlY3Qud2lkdGgoKSAtIG92ZXJsYXApOworICAgICAgICAgICAgICAgICAgICBv
dmVybGFwc1Jlc2l6ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IG92ZXJsYXAgPSByZWN0LmJvdHRvbSgpIC0gcmVz
aXplclJlY3QueSgpOworICAgICAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiByZXNpemVy
UmVjdC5ib3R0b20oKSA+PSByZWN0LmJvdHRvbSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFk
anVzdGVkUmVjdC5zZXRIZWlnaHQocmVjdC5oZWlnaHQoKSAtIG92ZXJsYXApOworICAgICAgICAg
ICAgICAgICAgICBvdmVybGFwc1Jlc2l6ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdmVybGFwc1Jlc2l6ZXIgIT0g
bV9vdmVybGFwc1Jlc2l6ZXIpIHsKKyAgICAgICAgICAgIG1fb3ZlcmxhcHNSZXNpemVyID0gb3Zl
cmxhcHNSZXNpemVyOworICAgICAgICAgICAgdmlldy0+YWRqdXN0T3ZlcmxhcHBpbmdTY3JvbGxi
YXJDb3VudChtX292ZXJsYXBzUmVzaXplciA/IDEgOiAtMSk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBzZXRGcmFtZUdlb21ldHJ5KGFkanVzdGVkUmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1T
Y3JvbGxiYXI6OnNldFBhcmVudChTY3JvbGxWaWV3KiBwYXJlbnRWaWV3KQoreworICAgIGlmICgh
cGFyZW50VmlldyAmJiBtX292ZXJsYXBzUmVzaXplciAmJiBwYXJlbnQoKSAmJiBwYXJlbnQoKS0+
aXNGcmFtZVZpZXcoKSkKKyAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkp
LT5hZGp1c3RPdmVybGFwcGluZ1Njcm9sbGJhckNvdW50KC0xKTsKKyAgICBXaWRnZXQ6OnNldFBh
cmVudChwYXJlbnRWaWV3KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c2V0RW5hYmxl
ZChib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQgIT0gaXNFbmFibGVkKCkpIHsKKyAg
ICAgICAgV2lkZ2V0OjpzZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICBpbnZhbGlkYXRlKCk7
CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludChHcmFwaGljc0NvbnRl
eHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkKK3sKKyAgICBp
ZiAoZ3JhcGhpY3NDb250ZXh0LT51cGRhdGluZ0NvbnRyb2xUaW50cygpKSB7CisgICAgICAgIGlu
dmFsaWRhdGUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChncmFwaGljc0Nv
bnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRG9u
J3QgcGFpbnQgYW55dGhpbmcgaWYgdGhlIHNjcm9sbGJhciBkb2Vzbid0IGludGVyc2VjdCB0aGUg
ZGFtYWdlIHJlY3QuCisgICAgaWYgKCFmcmFtZUdlb21ldHJ5KCkuaW50ZXJzZWN0cyhkYW1hZ2VS
ZWN0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCB0cmFjayA9IHRyYWNrUmVjdCgp
OworICAgIHBhaW50VHJhY2soZ3JhcGhpY3NDb250ZXh0LCB0cmFjaywgdHJ1ZSwgZGFtYWdlUmVj
dCk7CisKKyAgICBpZiAoaGFzQnV0dG9ucygpKSB7CisgICAgICAgIHBhaW50QnV0dG9uKGdyYXBo
aWNzQ29udGV4dCwgYmFja0J1dHRvblJlY3QoKSwgdHJ1ZSwgZGFtYWdlUmVjdCk7CisgICAgICAg
IHBhaW50QnV0dG9uKGdyYXBoaWNzQ29udGV4dCwgZm9yd2FyZEJ1dHRvblJlY3QoKSwgZmFsc2Us
IGRhbWFnZVJlY3QpOworICAgIH0KKworICAgIGlmIChoYXNUaHVtYigpICYmIGRhbWFnZVJlY3Qu
aW50ZXJzZWN0cyh0cmFjaykpIHsKKyAgICAgICAgSW50UmVjdCBzdGFydFRyYWNrUmVjdCwgdGh1
bWJSZWN0LCBlbmRUcmFja1JlY3Q7CisgICAgICAgIHNwbGl0VHJhY2sodHJhY2ssIHN0YXJ0VHJh
Y2tSZWN0LCB0aHVtYlJlY3QsIGVuZFRyYWNrUmVjdCk7CisgICAgICAgIHBhaW50VGh1bWIoZ3Jh
cGhpY3NDb250ZXh0LCB0aHVtYlJlY3QsIGRhbWFnZVJlY3QpOworICAgIH0KK30KKworYm9vbCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6aGFzQnV0dG9ucygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlzRW5h
YmxlZCgpICYmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyB3aWR0aCgp
IDogaGVpZ2h0KCkpID49IDIgKiAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0gLSBj
QnV0dG9uSGl0SW5zZXRbY29udHJvbFNpemUoKV0pOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xs
YmFyOjpoYXNUaHVtYigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlzRW5hYmxlZCgpICYmIChtX29y
aWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyB3aWR0aCgpIDogaGVpZ2h0KCkpID49
IDIgKiBjQnV0dG9uSW5zZXRbY29udHJvbFNpemUoKV0gKyBjVGh1bWJNaW5MZW5ndGhbY29udHJv
bFNpemUoKV0gKyAxOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpiYWNrQnV0dG9u
UmVjdCgpIGNvbnN0Cit7CisgICAgLy8gT3VyIGRlc2lyZWQgcmVjdCBpcyBlc3NlbnRpYWxseSAx
N3gxNy4KKyAgICAKKyAgICAvLyBPdXIgYWN0dWFsIHJlY3Qgd2lsbCBzaHJpbmsgdG8gaGFsZiB0
aGUgYXZhaWxhYmxlIHNwYWNlIHdoZW4KKyAgICAvLyB3ZSBoYXZlIDwgMzQgcGl4ZWxzIGxlZnQu
ICBUaGlzIGFsbG93cyB0aGUgc2Nyb2xsYmFyCisgICAgLy8gdG8gc2NhbGUgZG93biBhbmQgZnVu
Y3Rpb24gZXZlbiBhdCB0aW55IHNpemVzLgorICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6
b250YWxTY3JvbGxiYXIpCisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCBjQnV0dG9u
TGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7
CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXpl
KCldLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldKTsKK30KKworSW50UmVjdCBQbGF0Zm9y
bVNjcm9sbGJhcjo6Zm9yd2FyZEJ1dHRvblJlY3QoKSBjb25zdAoreworICAgIC8vIE91ciBkZXNp
cmVkIHJlY3QgaXMgZXNzZW50aWFsbHkgMTd4MTcuCisgICAgCisgICAgLy8gT3VyIGFjdHVhbCBy
ZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFjZSB3aGVuCisgICAgLy8g
d2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhlIHNjcm9sbGJhcgorICAg
IC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlueSBzaXplcy4KKworICAg
IGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgIHJldHVy
biBJbnRSZWN0KHgoKSArIHdpZHRoKCkgLSBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCB5
KCksIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRy
b2xTaXplKCldKTsKKyAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSArIGhlaWdodCgpIC0gY0J1
dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0s
IGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0pOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Ny
b2xsYmFyOjp0cmFja1JlY3QoKSBjb25zdAoreworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhv
cml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaWYgKCFoYXNCdXR0b25zKCkpCisgICAgICAg
ICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgd2lkdGgoKSwgY0hvcml6b250YWxIZWlnaHRb
Y29udHJvbFNpemUoKV0pOworICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyBjQnV0dG9uTGVu
Z3RoW2NvbnRyb2xTaXplKCldLCB5KCksIHdpZHRoKCkgLSAyICogY0J1dHRvbkxlbmd0aFtjb250
cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAgIH0KKwor
ICAgIGlmICghaGFzQnV0dG9ucygpKQorICAgICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwg
Y1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGhlaWdodCgpKTsKKyAgICByZXR1cm4gSW50
UmVjdCh4KCksIHkoKSArIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbFdp
ZHRoW2NvbnRyb2xTaXplKCldLCBoZWlnaHQoKSAtIDIgKiBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xT
aXplKCldKTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJSZWN0KCkgY29u
c3QKK3sKKyAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1i
UmVjdDsKKyAgICBzcGxpdFRyYWNrKHRyYWNrUmVjdCgpLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1i
UmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOworICAgIHJldHVybiB0aHVtYlJlY3Q7Cit9CisKK3ZvaWQg
UGxhdGZvcm1TY3JvbGxiYXI6OnNwbGl0VHJhY2soY29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBJ
bnRSZWN0JiBiZWZvcmVUaHVtYlJlY3QsIEludFJlY3QmIHRodW1iUmVjdCwgSW50UmVjdCYgYWZ0
ZXJUaHVtYlJlY3QpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiB3b24ndCBldmVuIGdl
dCBjYWxsZWQgdW5sZXNzIHdlJ3JlIGJpZyBlbm91Z2ggdG8gaGF2ZSBzb21lIGNvbWJpbmF0aW9u
IG9mIHRoZXNlIHRocmVlIHJlY3RzIHdoZXJlIGF0IGxlYXN0CisgICAgLy8gb25lIG9mIHRoZW0g
aXMgbm9uLWVtcHR5LgorICAgIGludCB0aHVtYlBvcyA9IHRodW1iUG9zaXRpb24oKTsKKyAgICBp
ZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIHRodW1i
UmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSArIHRodW1iUG9zLCB0cmFja1JlY3QueSgpICsg
KHRyYWNrUmVjdC5oZWlnaHQoKSAtIGNUaHVtYkhlaWdodFtjb250cm9sU2l6ZSgpXSkgLyAyLCB0
aHVtYkxlbmd0aCgpLCBjVGh1bWJIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAgICAgICBiZWZv
cmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCksIHRyYWNrUmVjdC55KCksIHRodW1i
UG9zLCB0cmFja1JlY3QuaGVpZ2h0KCkpOworICAgICAgICBhZnRlclRodW1iUmVjdCA9IEludFJl
Y3QodGh1bWJSZWN0LngoKSArIHRodW1iUmVjdC53aWR0aCgpLCB0cmFja1JlY3QueSgpLCB0cmFj
a1JlY3QucmlnaHQoKSAtIHRodW1iUmVjdC5yaWdodCgpLCB0cmFja1JlY3QuaGVpZ2h0KCkpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIHRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSAr
ICh0cmFja1JlY3Qud2lkdGgoKSAtIGNUaHVtYldpZHRoW2NvbnRyb2xTaXplKCldKSAvIDIsIHRy
YWNrUmVjdC55KCkgKyB0aHVtYlBvcywgY1RodW1iV2lkdGhbY29udHJvbFNpemUoKV0sIHRodW1i
TGVuZ3RoKCkpOworICAgICAgICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54
KCksIHRyYWNrUmVjdC55KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0aHVtYlBvcyk7CisgICAgICAg
IGFmdGVyVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0aHVtYlJlY3QueSgpICsg
dGh1bWJSZWN0LmhlaWdodCgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdHJhY2tSZWN0LmJvdHRvbSgp
IC0gdGh1bWJSZWN0LmJvdHRvbSgpKTsKKyAgICB9Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJh
cjo6dGh1bWJQb3NpdGlvbigpIGNvbnN0Cit7CisgICAgaWYgKGlzRW5hYmxlZCgpKQorICAgICAg
ICByZXR1cm4gKGZsb2F0KW1fY3VycmVudFBvcyAqICh0cmFja0xlbmd0aCgpIC0gdGh1bWJMZW5n
dGgoKSkgLyAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKTsKKyAgICByZXR1cm4gMDsKK30K
KworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYkxlbmd0aCgpIGNvbnN0Cit7CisgICAgaWYg
KCFpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmbG9hdCBwcm9wb3J0aW9u
ID0gKGZsb2F0KShtX3Zpc2libGVTaXplKSAvIG1fdG90YWxTaXplOworICAgIGludCB0cmFja0xl
biA9IHRyYWNrTGVuZ3RoKCk7CisgICAgaW50IGxlbmd0aCA9IHByb3BvcnRpb24gKiB0cmFja0xl
bjsKKyAgICBpbnQgbWluTGVuZ3RoID0gY1RodW1iTWluTGVuZ3RoW2NvbnRyb2xTaXplKCldOwor
ICAgIGxlbmd0aCA9IG1heChsZW5ndGgsIG1pbkxlbmd0aCk7CisgICAgaWYgKGxlbmd0aCA+IHRy
YWNrTGVuKQorICAgICAgICBsZW5ndGggPSAwOyAvLyBPbmNlIHRoZSB0aHVtYiBpcyBiZWxvdyB0
aGUgdHJhY2sgbGVuZ3RoLCBpdCBqdXN0IGdvZXMgYXdheSAodG8gbWFrZSBtb3JlIHJvb20gZm9y
IHRoZSB0cmFjaykuCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xs
YmFyOjp0cmFja0xlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIpID8gdHJhY2tSZWN0KCkud2lkdGgoKSA6IHRyYWNrUmVjdCgp
LmhlaWdodCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEJ1dHRvbihHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgc3RhcnQsIGNv
bnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFTYWZhcmlUaGVtZUxp
YnJhcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBwYWludFJlY3QgPSBidXR0
b25SZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpLCBzdGFydCk7
CisgICAgCisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgVGhlbWVQYXJ0IHBhcnQ7CisgICAgVGhlbWVDb250cm9sU3RhdGUg
c3RhdGUgPSAwOworICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICAgICAgc3RhdGUg
fD0gQWN0aXZlU3RhdGU7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9s
bGJhcikKKyAgICAgICAgcGFydCA9IHN0YXJ0ID8gU2Nyb2xsTGVmdEFycm93UGFydCA6IFNjcm9s
bFJpZ2h0QXJyb3dQYXJ0OworICAgIGVsc2UKKyAgICAgICAgcGFydCA9IHN0YXJ0ID8gU2Nyb2xs
VXBBcnJvd1BhcnQgOiBTY3JvbGxEb3duQXJyb3dQYXJ0OworCisgICAgaWYgKGlzRW5hYmxlZCgp
KQorICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisgICAgaWYgKChtX3ByZXNzZWRQYXJ0
ID09IEJhY2tCdXR0b25QYXJ0ICYmIHN0YXJ0KQorICAgICAgICB8fCAobV9wcmVzc2VkUGFydCA9
PSBGb3J3YXJkQnV0dG9uUGFydCAmJiAhc3RhcnQpKQorICAgICAgICBzdGF0ZSB8PSBQcmVzc2Vk
U3RhdGU7CisKKyAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKSwgcGFpbnRSZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFs
bENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKK30KKwordm9pZCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUcmFjayhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNv
bnN0IEludFJlY3QmIHJlY3QsIGJvb2wgc3RhcnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3Qp
IGNvbnN0Cit7CisgICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgSW50UmVjdCBwYWludFJlY3QgPSBoYXNCdXR0b25zKCkgPyB0cmFja1JlcGFpbnRS
ZWN0KHJlY3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCkpIDogcmVjdDsKKyAgICAKKyAg
ICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQorICAgICAgICByZXR1cm47
CisKKyAgICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9s
bGJhciA/IEhTY3JvbGxUcmFja1BhcnQgOiBWU2Nyb2xsVHJhY2tQYXJ0OworICAgIFRoZW1lQ29u
dHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAg
ICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOworICAgIGlmIChoYXNCdXR0b25zKCkpCisgICAgICAg
IHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKworICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNvbnRl
eHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxT
Y3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3Rh
dGUpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRodW1iKEdyYXBoaWNzQ29u
dGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW50UmVjdCYgZGFtYWdl
UmVjdCkgY29uc3QKK3sKKyAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhyZWN0KSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250
YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVGh1bWJQYXJ0IDogVlNjcm9sbFRodW1iUGFydDsKKyAgICBU
aGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgp
KQorICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICBpZiAoaXNFbmFibGVkKCkpCisg
ICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKworICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQs
IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxs
U2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0
YXRlKTsKK30KKworU2Nyb2xsYmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0VGVzdChjb25z
dCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBpZiAoIWlzRW5hYmxlZCgpKQorICAg
ICAgICByZXR1cm4gTm9QYXJ0OworCisgICAgSW50UG9pbnQgbW91c2VQb3NpdGlvbiA9IGNvbnZl
cnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpOworICAgIG1vdXNlUG9zaXRpb24ubW92
ZSh4KCksIHkoKSk7CisKKyAgICBpZiAoaGFzQnV0dG9ucygpKSB7CisgICAgICAgIGlmIChiYWNr
QnV0dG9uUmVjdCgpLmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJu
IEJhY2tCdXR0b25QYXJ0OworCisgICAgICAgIGlmIChmb3J3YXJkQnV0dG9uUmVjdCgpLmNvbnRh
aW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuIEZvcndhcmRCdXR0b25QYXJ0
OworICAgIH0KKworICAgIGlmICghaGFzVGh1bWIoKSkKKyAgICAgICAgcmV0dXJuIE5vUGFydDsK
KworICAgIEludFJlY3QgdHJhY2sgPSB0cmFja1JlY3QoKTsKKyAgICBpZiAodHJhY2suY29udGFp
bnMobW91c2VQb3NpdGlvbikpIHsKKyAgICAgICAgSW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRo
dW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgICAgIHNwbGl0VHJhY2sodHJhY2ssIGJlZm9y
ZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdCk7CisgICAgICAgIGlmIChiZWZv
cmVUaHVtYlJlY3QuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm4g
QmFja1RyYWNrUGFydDsKKyAgICAgICAgaWYgKHRodW1iUmVjdC5jb250YWlucyhtb3VzZVBvc2l0
aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBUaHVtYlBhcnQ7CisgICAgICAgIHJldHVybiBGb3J3
YXJkVHJhY2tQYXJ0OworICAgIH0KKyAgICByZXR1cm4gTm9QYXJ0OworfQorCitib29sIFBsYXRm
b3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU1vdmVFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZl
bnQmIGV2dCkKK3sKKyAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBUaHVtYlBhcnQpIHsKKyAgICAg
ICAgLy8gRHJhZyB0aGUgdGh1bWIuCisgICAgICAgIGludCB0aHVtYlBvcyA9IHRodW1iUG9zaXRp
b24oKTsKKyAgICAgICAgaW50IHRodW1iTGVuID0gdGh1bWJMZW5ndGgoKTsKKyAgICAgICAgaW50
IHRyYWNrTGVuID0gdHJhY2tMZW5ndGgoKTsKKyAgICAgICAgaW50IG1heFBvcyA9IHRyYWNrTGVu
IC0gdGh1bWJMZW47CisgICAgICAgIGludCBkZWx0YSA9IDA7CisgICAgICAgIGlmIChtX29yaWVu
dGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgICAgICBkZWx0YSA9IGNvbnZl
cnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSAtIG1fcHJlc3NlZFBvczsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5k
b3coZXZ0LnBvcygpKS55KCkgLSBtX3ByZXNzZWRQb3M7CisKKyAgICAgICAgaWYgKGRlbHRhID4g
MCkKKyAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBtb3ZlZCBkb3duL3JpZ2h0LgorICAgICAgICAg
ICAgZGVsdGEgPSBtaW4obWF4UG9zIC0gdGh1bWJQb3MsIGRlbHRhKTsKKyAgICAgICAgZWxzZSBp
ZiAoZGVsdGEgPCAwKQorICAgICAgICAgICAgLy8gVGhlIG1vdXNlIG1vdmVkIHVwL2xlZnQuCisg
ICAgICAgICAgICBkZWx0YSA9IG1heCgtdGh1bWJQb3MsIGRlbHRhKTsKKworICAgICAgICBpZiAo
ZGVsdGEgIT0gMCkgeworICAgICAgICAgICAgc2V0VmFsdWUoKGZsb2F0KSh0aHVtYlBvcyArIGRl
bHRhKSAqIChtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpIC8gKHRyYWNrTGVuIC0gdGh1bWJM
ZW4pKTsKKyAgICAgICAgICAgIG1fcHJlc3NlZFBvcyArPSB0aHVtYlBvc2l0aW9uKCkgLSB0aHVt
YlBvczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgaWYgKG1fcHJlc3NlZFBhcnQgIT0gTm9QYXJ0KQorICAgICAgICBtX3ByZXNzZWRQb3Mg
PSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gY29udmVydEZyb21Db250
YWluaW5nV2luZG93KGV2dC5wb3MoKSkueCgpIDogY29udmVydEZyb21Db250YWluaW5nV2luZG93
KGV2dC5wb3MoKSkueSgpKTsKKworICAgIFNjcm9sbGJhclBhcnQgcGFydCA9IGhpdFRlc3QoZXZ0
KTsgICAgCisgICAgaWYgKHBhcnQgIT0gbV9ob3ZlcmVkUGFydCkgeworICAgICAgICBpZiAobV9w
cmVzc2VkUGFydCAhPSBOb1BhcnQpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IG1fcHJlc3Nl
ZFBhcnQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbW91c2UgaXMgbW92aW5nIGJhY2sgb3Zl
ciB0aGUgcHJlc3NlZCBwYXJ0LiAgV2UKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHN0YXJ0
IHVwIHRoZSB0aW1lciBhY3Rpb24gYWdhaW4uCisgICAgICAgICAgICAgICAgc3RhcnRUaW1lcklm
TmVlZGVkKGNOb3JtYWxUaW1lckRlbGF5KTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUGFy
dChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9ob3ZlcmVkUGFydCA9
PSBtX3ByZXNzZWRQYXJ0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG1vdXNlIGlzIGxlYXZp
bmcgdGhlIHByZXNzZWQgcGFydC4gIEtpbGwgb3VyIHRpbWVyCisgICAgICAgICAgICAgICAgLy8g
aWYgbmVlZGVkLgorICAgICAgICAgICAgICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisgICAgICAg
ICAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlUGFydChwYXJ0KTsKKyAgICAg
ICAgICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAgICAgICB9CisgICAgICAg
IG1faG92ZXJlZFBhcnQgPSBwYXJ0OworICAgIH0gCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Ym9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VPdXRFdmVudChjb25zdCBQbGF0Zm9y
bU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBpbnZhbGlkYXRlUGFydChtX2hvdmVyZWRQYXJ0KTsK
KyAgICBtX2hvdmVyZWRQYXJ0ID0gTm9QYXJ0OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlUHJlc3NFdmVudChjb25zdCBQbGF0Zm9y
bU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBtX3ByZXNzZWRQYXJ0ID0gaGl0VGVzdChldnQpOwor
ICAgIG1fcHJlc3NlZFBvcyA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIg
PyBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkgOiBjb252ZXJ0RnJv
bUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS55KCkpOworICAgIGludmFsaWRhdGVQYXJ0KG1f
cHJlc3NlZFBhcnQpOworICAgIGF1dG9zY3JvbGxQcmVzc2VkUGFydChjSW5pdGlhbFRpbWVyRGVs
YXkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5k
bGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAg
ICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICBtX3ByZXNzZWRQYXJ0ID0gTm9Q
YXJ0OworICAgIG1fcHJlc3NlZFBvcyA9IDA7CisgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKKwor
ICAgIGlmIChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGcmFtZVZpZXcoKSkKKyAgICAgICAgc3Rh
dGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpLT5mcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+
c2V0TW91c2VQcmVzc2VkKGZhbHNlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjpzdGFydFRpbWVySWZOZWVkZWQoZG91YmxlIGRlbGF5KQoreworICAg
IC8vIERvbid0IGRvIGFueXRoaW5nIGZvciB0aGUgdGh1bWIuCisgICAgaWYgKG1fcHJlc3NlZFBh
cnQgPT0gVGh1bWJQYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBIYW5kbGUgdGhlIHRy
YWNrLiAgV2UgaGFsdCB0cmFjayBzY3JvbGxpbmcgb25jZSB0aGUgdGh1bWIgaXMgbGV2ZWwKKyAg
ICAvLyB3aXRoIHVzLgorICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0IHx8
IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkgJiYgdGh1bWJVbmRlck1vdXNlKCkp
IHsKKyAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgIG1faG92
ZXJlZFBhcnQgPSBUaHVtYlBhcnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBX
ZSBjYW4ndCBzY3JvbGwgaWYgd2UndmUgaGl0IHRoZSBiZWdpbm5pbmcgb3IgZW5kLgorICAgIFNj
cm9sbERpcmVjdGlvbiBkaXIgPSBwcmVzc2VkUGFydFNjcm9sbERpcmVjdGlvbigpOworICAgIGlm
IChkaXIgPT0gU2Nyb2xsVXAgfHwgZGlyID09IFNjcm9sbExlZnQpIHsKKyAgICAgICAgaWYgKG1f
Y3VycmVudFBvcyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAg
ICAgIGlmIChtX2N1cnJlbnRQb3MgPT0gbV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fc2Nyb2xsVGltZXIuc3RhcnRPbmVTaG90
KGRlbGF5KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3RvcFRpbWVySWZOZWVkZWQo
KQoreworICAgIGlmIChtX3Njcm9sbFRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fc2Nyb2xs
VGltZXIuc3RvcCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsUHJl
c3NlZFBhcnQoZG91YmxlIGRlbGF5KQoreworICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGZvciB0
aGUgdGh1bWIgb3IgaWYgbm90aGluZyB3YXMgcHJlc3NlZC4KKyAgICBpZiAobV9wcmVzc2VkUGFy
dCA9PSBUaHVtYlBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBOb1BhcnQpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIEhhbmRsZSB0aGUgdHJhY2suCisgICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09
IEJhY2tUcmFja1BhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KSAmJiB0
aHVtYlVuZGVyTW91c2UoKSkgeworICAgICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0
KTsKKyAgICAgICAgbV9ob3ZlcmVkUGFydCA9IFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIC8vIEhhbmRsZSB0aGUgYXJyb3dzIGFuZCB0cmFjay4KKyAgICBpZiAoc2Ny
b2xsKHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCksIHByZXNzZWRQYXJ0U2Nyb2xsR3JhbnVs
YXJpdHkoKSkpCisgICAgICAgIHN0YXJ0VGltZXJJZk5lZWRlZChkZWxheSk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKFRpbWVyPFBsYXRmb3JtU2Ny
b2xsYmFyPiopCit7CisgICAgYXV0b3Njcm9sbFByZXNzZWRQYXJ0KGNOb3JtYWxUaW1lckRlbGF5
KTsKK30KKworU2Nyb2xsRGlyZWN0aW9uIFBsYXRmb3JtU2Nyb2xsYmFyOjpwcmVzc2VkUGFydFNj
cm9sbERpcmVjdGlvbigpCit7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNj
cm9sbGJhcikgeworICAgICAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCB8
fCBtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICByZXR1cm4gU2Ny
b2xsTGVmdDsKKyAgICAgICAgcmV0dXJuIFNjcm9sbFJpZ2h0OworICAgIH0gZWxzZSB7CisgICAg
ICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1fcHJlc3NlZFBhcnQg
PT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgIHJldHVybiBTY3JvbGxVcDsKKyAgICAgICAg
cmV0dXJuIFNjcm9sbERvd247CisgICAgfQorfQorCitTY3JvbGxHcmFudWxhcml0eSBQbGF0Zm9y
bVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0eSgpCit7CisgICAgaWYgKG1f
cHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBGb3J3YXJk
QnV0dG9uUGFydCkKKyAgICAgICAgcmV0dXJuIFNjcm9sbEJ5TGluZTsKKyAgICByZXR1cm4gU2Ny
b2xsQnlQYWdlOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlVuZGVyTW91c2Uo
KQoreworICAgIC8vIENvbnN0cnVjdCBhIHJlY3QuCisgICAgSW50UmVjdCB0aHVtYiA9IHRodW1i
UmVjdCgpOworICAgIHRodW1iLm1vdmUoLXgoKSwgLXkoKSk7CisgICAgaW50IGJlZ2luID0gKG1f
b3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0aHVtYi54KCkgOiB0aHVtYi55
KCk7CisgICAgaW50IGVuZCA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIp
ID8gdGh1bWIucmlnaHQoKSA6IHRodW1iLmJvdHRvbSgpOworICAgIHJldHVybiAoYmVnaW4gPD0g
bV9wcmVzc2VkUG9zICYmIG1fcHJlc3NlZFBvcyA8IGVuZCk7Cit9CisKK2ludCBQbGF0Zm9ybVNj
cm9sbGJhcjo6aG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodChTY3JvbGxiYXJDb250cm9sU2l6ZSBj
b250cm9sU2l6ZSkKK3sKKyAgICByZXR1cm4gY0hvcml6b250YWxXaWR0aFtjb250cm9sU2l6ZV07
Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dmVydGljYWxTY3JvbGxiYXJXaWR0aChTY3Jv
bGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6ZSkKK3sKKyAgICByZXR1cm4gY1ZlcnRpY2FsSGVp
Z2h0W2NvbnRyb2xTaXplXTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6d2luZG93
Q2xpcFJlY3QoKSBjb25zdAoreworICAgIEludFJlY3QgY2xpcFJlY3QoMCwgMCwgd2lkdGgoKSwg
aGVpZ2h0KCkpOworICAgIGNsaXBSZWN0ID0gY29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhjbGlw
UmVjdCk7CisgICAgaWYgKG1fY2xpZW50KQorICAgICAgICBjbGlwUmVjdC5pbnRlcnNlY3QobV9j
bGllbnQtPndpbmRvd0NsaXBSZWN0KCkpOworICAgIHJldHVybiBjbGlwUmVjdDsKK30KKwordm9p
ZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBoZGMsIGNvbnN0IEludFJlY3Qm
IHJlY3QpIGNvbnN0Cit7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBwZXJS
ZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gSW50UmVj
dCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVtZUNoYW5nZWQoKQoreworfQor
Cit9CisKKyNlbmRpZiAvLyBkZWZpbmVkKFVTRV9TQUZBUklfVEhFTUUpCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCShyZXZpc2lvbiAzMDQ1
NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBCcmVu
dCBGdWxnaGFtCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI1LDggKzI2LDYg
QEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCi0jaWZkZWYgVVNFX1NBRkFSSV9USEVNRSAKLQog
I2luY2x1ZGUgIlBsYXRmb3JtU2Nyb2xsQmFyLmgiCiAKICNpbmNsdWRlICJFdmVudEhhbmRsZXIu
aCIKQEAgLTM3LDQ2ICszNiw4OSBAQAogI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgog
I2luY2x1ZGUgIlNvZnRMaW5raW5nLmgiCiAKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdy
YXBoaWNzLmg+Ci0jaW5jbHVkZSA8U2FmYXJpVGhlbWUvU2FmYXJpVGhlbWUuaD4KKyNpbmNsdWRl
IDx3aW5kb3dzLmg+CisjaW5jbHVkZSAiUmVuZGVyVGhlbWVXaW4uaCIKIAotLy8gRklYTUU6IFRo
ZXJlIGFyZSByZXBhaW50aW5nIHByb2JsZW1zIGR1ZSB0byBBcXVhIHNjcm9sbCBiYXIgYnV0dG9u
cycgdmlzdWFsIG92ZXJmbG93LgorLy8gR2VuZXJpYyBzdGF0ZSBjb25zdGFudHMKKyNkZWZpbmUg
VFNfTk9STUFMICAgIDEKKyNkZWZpbmUgVFNfSE9WRVIgICAgIDIKKyNkZWZpbmUgVFNfQUNUSVZF
ICAgIDMKKyNkZWZpbmUgVFNfRElTQUJMRUQgIDQKKyNkZWZpbmUgVFNfRk9DVVNFRCAgIDUKKwor
I2RlZmluZSBBQlNfVVBOT1JNQUwgMQorI2RlZmluZSBBQlNfRE9XTk5PUk1BTCA1CisjZGVmaW5l
IEFCU19MRUZUTk9STUFMIDkKKyNkZWZpbmUgQUJTX1JJR0hUTk9STUFMIDEzCisKK2NvbnN0IHVu
c2lnbmVkIFNQX0FCU19IT1RfTU9ESUZJRVIgPSAxOworY29uc3QgdW5zaWduZWQgU1BfQUJTX1BS
RVNTRURfTU9ESUZJRVIgPSAyOworY29uc3QgdW5zaWduZWQgU1BfQUJTX0RJU0FCTEVfTU9ESUZJ
RVIgPSAzOworCisvLyBTY3JvbGxiYXIgY29uc3RhbnRzCisjZGVmaW5lIFNQX0JVVFRPTiAxCisj
ZGVmaW5lIFNQX1RIVU1CSE9SIDIKKyNkZWZpbmUgU1BfVEhVTUJWRVJUIDMKKyNkZWZpbmUgU1Bf
VFJBQ0tTVEFSVEhPUiA0CisjZGVmaW5lIFNQX1RSQUNLRU5ESE9SIDUKKyNkZWZpbmUgU1BfVFJB
Q0tTVEFSVFZFUlQgNgorI2RlZmluZSBTUF9UUkFDS0VORFZFUlQgNworI2RlZmluZSBTUF9HUklQ
UEVSSE9SIDgKKyNkZWZpbmUgU1BfR1JJUFBFUlZFUlQgOQogCiB1c2luZyBuYW1lc3BhY2Ugc3Rk
OwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBTYWZhcmlUaGVtZTsK
LQogLy8gRklYTUU6IFdlIHNob3VsZCBnZXQgdGhlc2UgbnVtYmVycyBmcm9tIFNhZmFyaVRoZW1l
Ci1zdGF0aWMgaW50IGNIb3Jpem9udGFsV2lkdGhbXSA9IHsgMTUsIDExIH07Ci1zdGF0aWMgaW50
IGNIb3Jpem9udGFsSGVpZ2h0W10gPSB7IDE1LCAxMSB9Owotc3RhdGljIGludCBjVmVydGljYWxX
aWR0aFtdID0geyAxNSwgMTEgfTsKLXN0YXRpYyBpbnQgY1ZlcnRpY2FsSGVpZ2h0W10gPSB7IDE1
LCAxMSB9Oworc3RhdGljIGludCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE3LCAxMSB9Oworc3Rh
dGljIGludCBjSG9yaXpvbnRhbEhlaWdodFtdID0geyAxNywgMTEgfTsKK3N0YXRpYyBpbnQgY1Zl
cnRpY2FsV2lkdGhbXSA9IHsgMTcsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbEhlaWdodFtd
ID0geyAxNywgMTEgfTsKIHN0YXRpYyBpbnQgY1JlYWxCdXR0b25MZW5ndGhbXSA9IHsgMjgsIDIx
IH07CiBzdGF0aWMgaW50IGNCdXR0b25JbnNldFtdID0geyAxNCwgMTEgfTsKIHN0YXRpYyBpbnQg
Y0J1dHRvbkhpdEluc2V0W10gPSB7IDMsIDIgfTsKIC8vIGNSZWFsQnV0dG9uTGVuZ3RoIC0gY0J1
dHRvbkluc2V0CiBzdGF0aWMgaW50IGNCdXR0b25MZW5ndGhbXSA9IHsgMTQsIDEwIH07Ci1zdGF0
aWMgaW50IGNUaHVtYldpZHRoW10gPSB7IDE1LCAxMSB9Owotc3RhdGljIGludCBjVGh1bWJIZWln
aHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNUaHVtYldpZHRoW10gPSB7IDE3LCAxMSB9
Oworc3RhdGljIGludCBjVGh1bWJIZWlnaHRbXSA9IHsgMTcsIDExIH07CiBzdGF0aWMgaW50IGNU
aHVtYk1pbkxlbmd0aFtdID0geyAyNiwgMjAgfTsKIAotI2lmICFkZWZpbmVkKE5ERUJVRykgJiYg
ZGVmaW5lZChVU0VfREVCVUdfU0FGQVJJX1RIRU1FKQotU09GVF9MSU5LX0RFQlVHX0xJQlJBUlko
U2FmYXJpVGhlbWUpCi0jZWxzZQotU09GVF9MSU5LX0xJQlJBUlkoU2FmYXJpVGhlbWUpCi0jZW5k
aWYKIAotU09GVF9MSU5LKFNhZmFyaVRoZW1lLCBwYWludFRoZW1lUGFydCwgdm9pZCwgX19zdGRj
YWxsLCAoVGhlbWVQYXJ0IHBhcnQsIENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDR1JlY3Qm
IHJlY3QsIE5TQ29udHJvbFNpemUgc2l6ZSwgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUpLCAocGFy
dCwgY29udGV4dCwgcmVjdCwgc2l6ZSwgc3RhdGUpKQorLy8gRklYTUU6ICBSZWZhY3RvciB0aGUg
c29mdC1saW5raW5nIGNvZGUgc28gdGhhdCBpdCBjYW4gYmUgc2hhcmVkIHdpdGggUmVuZGVyVGhl
bWVXaW4KK1NPRlRfTElOS19MSUJSQVJZKHV4dGhlbWUpCitTT0ZUX0xJTksodXh0aGVtZSwgT3Bl
blRoZW1lRGF0YSwgSEFORExFLCBXSU5BUEksIChIV05EIGh3bmQsIExQQ1dTVFIgcHN6Q2xhc3NM
aXN0KSwgKGh3bmQsIHBzekNsYXNzTGlzdCkpCitTT0ZUX0xJTksodXh0aGVtZSwgQ2xvc2VUaGVt
ZURhdGEsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUpLCAoaFRoZW1lKSkKK1NPRlRf
TElOSyh1eHRoZW1lLCBEcmF3VGhlbWVCYWNrZ3JvdW5kLCBIUkVTVUxULCBXSU5BUEksIChIQU5E
TEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNU
KiBwUmVjdCwgY29uc3QgUkVDVCogcENsaXBSZWN0KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBp
U3RhdGVJZCwgcFJlY3QsIHBDbGlwUmVjdCkpCitTT0ZUX0xJTksodXh0aGVtZSwgRHJhd1RoZW1l
RWRnZSwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0
SWQsIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCogcFJlY3QsIHVuc2lnbmVkIHVFZGdlLCB1bnNp
Z25lZCB1RmxhZ3MsIGNvbnN0IFJFQ1QqIHBDbGlwUmVjdCksIChoVGhlbWUsIGhkYywgaVBhcnRJ
ZCwgaVN0YXRlSWQsIHBSZWN0LCB1RWRnZSwgdUZsYWdzLCBwQ2xpcFJlY3QpKQorU09GVF9MSU5L
KHV4dGhlbWUsIEdldFRoZW1lQ29udGVudFJlY3QsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBo
VGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBS
ZWN0LCBjb25zdCBSRUNUKiBwQ29udGVudFJlY3QpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlT
dGF0ZUlkLCBwUmVjdCwgcENvbnRlbnRSZWN0KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVt
ZVBhcnRTaXplLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQg
aVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBSRUNUKiBwUmVjdCwgaW50IHRzLCBTSVpFKiBwc3opLCAo
aFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgdHMsIHBzeikpCitTT0ZUX0xJ
TksodXh0aGVtZSwgR2V0VGhlbWVTeXNGb250LCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRo
ZW1lLCBpbnQgaUZvbnRJZCwgT1VUIExPR0ZPTlQqIHBGb250KSwgKGhUaGVtZSwgaUZvbnRJZCwg
cEZvbnQpKQorU09GVF9MSU5LKHV4dGhlbWUsIEdldFRoZW1lQ29sb3IsIEhSRVNVTFQsIFdJTkFQ
SSwgKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGlu
dCBpUHJvcElkLCBPVVQgQ09MT1JSRUYqIHBDb2xvciksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwg
aVN0YXRlSWQsIGlQcm9wSWQsIHBDb2xvcikpCisKKy8vIE1heSBuZWVkIHRvIGFkZCBzdHVmZiB0
byB0aGVzZSBsYXRlciwgc28ga2VlcCB0aGUgZ3JhcGhpY3MgY29udGV4dCByZXRyaWV2YWwvcmVs
ZWFzZSBpbiBzb21lIGhlbHBlcnMuCitzdGF0aWMgSERDIHByZXBhcmVGb3JEcmF3aW5nKEdyYXBo
aWNzQ29udGV4dCogZywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICByZXR1cm4gZy0+Z2V0V2lu
ZG93c0NvbnRleHQocik7Cit9CisgCitzdGF0aWMgdm9pZCBkb25lRHJhd2luZyhHcmFwaGljc0Nv
bnRleHQqIGcsIEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgZy0+cmVsZWFzZVdp
bmRvd3NDb250ZXh0KGhkYywgcik7Cit9CisvLyBFbmQgQ29waWVkIGZyb20gUmVuZGVyVGhlbWVX
aW4KIAogY29uc3QgZG91YmxlIGNJbml0aWFsVGltZXJEZWxheSA9IDAuMjU7CiBjb25zdCBkb3Vi
bGUgY05vcm1hbFRpbWVyRGVsYXkgPSAwLjA1OwogCiBQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZv
cm1TY3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9u
IG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQotICAgIDogU2Nyb2xsYmFy
KGNsaWVudCwgb3JpZW50YXRpb24sIHNpemUpLCBtX2hvdmVyZWRQYXJ0KE5vUGFydCksIG1fcHJl
c3NlZFBhcnQoTm9QYXJ0KSwgbV9wcmVzc2VkUG9zKDApLAotICAgICAgbV9zY3JvbGxUaW1lcih0
aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKSwKLSAgICAgIG1f
b3ZlcmxhcHNSZXNpemVyKGZhbHNlKQorICAgIDogU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50YXRp
b24sIHNpemUpCisgICAgLCBtX2hvdmVyZWRQYXJ0KE5vUGFydCkKKyAgICAsIG1fcHJlc3NlZFBh
cnQoTm9QYXJ0KQorICAgICwgbV9wcmVzc2VkUG9zKDApCisgICAgLCBtX3Njcm9sbFRpbWVyKHRo
aXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQpCisgICAgLCBtX292
ZXJsYXBzUmVzaXplcihmYWxzZSkKKyAgICAsIG1fc2Nyb2xsQmFyVGhlbWUoMCkKIHsKICAgICAv
LyBPYnRhaW4gdGhlIGNvcnJlY3Qgc2Nyb2xsYmFyIHNpemVzIGZyb20gdGhlIHN5c3RlbS4KICAg
ICBpZiAoIWNIb3Jpem9udGFsV2lkdGgpIHsKQEAgLTkyLDYgKzEzNCwxNCBAQCBQbGF0Zm9ybVNj
cm9sbGJhcjo6UGxhdGZvcm1TY3JvbGxiYXIoU2NyCiBQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRm
b3JtU2Nyb2xsYmFyKCkKIHsKICAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworCisgICAgLy8gQ2xl
YW51cCB0aGVtZSBzdG91dC51ZmYKKyAgICBpZiAoIXV4dGhlbWVMaWJyYXJ5KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmIChtX3Njcm9sbEJhclRoZW1lKQorICAgICAgICBDbG9zZVRoZW1l
RGF0YShtX3Njcm9sbEJhclRoZW1lKTsKKyAgICBtX3Njcm9sbEJhclRoZW1lID0gMDsKIH0KIAog
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQb3NpdGlvbigpCkBAIC0zMTAsNiAr
MzYwLDExIEBAIEludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUmVjdCgpIGMKICAgICBy
ZXR1cm4gdGh1bWJSZWN0OwogfQogCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVy
UmVjdChjb25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFJl
Y3QoKTsKK30KKwogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3BsaXRUcmFjayhjb25zdCBJbnRS
ZWN0JiB0cmFja1JlY3QsIEludFJlY3QmIGJlZm9yZVRodW1iUmVjdCwgSW50UmVjdCYgdGh1bWJS
ZWN0LCBJbnRSZWN0JiBhZnRlclRodW1iUmVjdCkgY29uc3QKIHsKICAgICAvLyBUaGlzIGZ1bmN0
aW9uIHdvbid0IGV2ZW4gZ2V0IGNhbGxlZCB1bmxlc3Mgd2UncmUgYmlnIGVub3VnaCB0byBoYXZl
IHNvbWUgY29tYmluYXRpb24gb2YgdGhlc2UgdGhyZWUgcmVjdHMgd2hlcmUgYXQgbGVhc3QKQEAg
LTM1NSw2OCArNDEwLDEzNCBAQCBpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrTGVuZ3RoKCkg
Y29uCiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4
dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVj
dCYgZGFtYWdlUmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQot
ICAgICAgICByZXR1cm47Ci0KICAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGJ1dHRvblJlcGFpbnRS
ZWN0KHJlY3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHN0YXJ0KTsKICAgICAKICAg
ICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQogICAgICAgICByZXR1cm47
CiAKLSAgICBUaGVtZVBhcnQgcGFydDsKLSAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7
Ci0gICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVT
dGF0ZTsKLSAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQotICAg
ICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxMZWZ0QXJyb3dQYXJ0IDogU2Nyb2xsUmlnaHRBcnJv
d1BhcnQ7Ci0gICAgZWxzZQotICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxVcEFycm93UGFy
dCA6IFNjcm9sbERvd25BcnJvd1BhcnQ7CisgICAgdW5zaWduZWQgcGFydCA9IDA7CisgICAgdW5z
aWduZWQgc3RhdGUgPSAwOworICAgIHVuc2lnbmVkIGNsYXNzaWNQYXJ0ID0gMDsKKyAgICB1bnNp
Z25lZCBjbGFzc2ljU3RhdGUgPSAwOwogCi0gICAgaWYgKGlzRW5hYmxlZCgpKQotICAgICAgICBz
dGF0ZSB8PSBFbmFibGVkU3RhdGU7Ci0gICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0
b25QYXJ0ICYmIHN0YXJ0KQotICAgICAgICB8fCAobV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkQnV0
dG9uUGFydCAmJiAhc3RhcnQpKQotICAgICAgICBzdGF0ZSB8PSBQcmVzc2VkU3RhdGU7CisgICAg
aWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgIHN0YXRl
ID0gc3RhcnQgPyBBQlNfTEVGVE5PUk1BTCA6IEFCU19SSUdIVE5PUk1BTDsKKyAgICAgICBjbGFz
c2ljUGFydCA9IHN0YXJ0ID8gREZDU19TQ1JPTExMRUZUIDogREZDU19TQ1JPTExSSUdIVDsKKyAg
ICB9IGVsc2UgeworICAgICAgIHN0YXRlID0gc3RhcnQgPyBBQlNfVVBOT1JNQUwgOiBBQlNfRE9X
Tk5PUk1BTDsKKyAgICAgICBjbGFzc2ljUGFydCA9IHN0YXJ0ID8gREZDU19TQ1JPTExVUCA6IERG
Q1NfU0NST0xMRE9XTjsKKyAgICB9CiAKLSAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0
LT5wbGF0Zm9ybUNvbnRleHQoKSwgcGFpbnRSZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Ny
b2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRl
KTsKKyAgICBpZiAoIWlzRW5hYmxlZCgpKSB7CisgICAgICAgIHN0YXRlICs9IFNQX0FCU19ESVNB
QkxFX01PRElGSUVSOworICAgICAgICBjbGFzc2ljU3RhdGUgfD0gREZDU19JTkFDVElWRTsKKyAg
ICB9CisgICAgZWxzZSBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgJiYgc3Rh
cnQpCisgICAgICAgICAgfHwgKG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblBhcnQgJiYg
IXN0YXJ0KSkKKyAgICB7CisgICAgICAgIHN0YXRlICs9IFNQX0FCU19QUkVTU0VEX01PRElGSUVS
OworICAgICAgICBjbGFzc2ljU3RhdGUgfD0gREZDU19QVVNIRUQgfCBERkNTX0ZMQVQ7CisgICAg
fQorICAgIGVsc2UgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQorICAgIHsKKyAgICAgICBzdGF0
ZSArPSBTUF9BQlNfSE9UX01PRElGSUVSOworICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0hP
VDsKKyAgICB9CisKKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoY29udGV4dCwgcmVj
dCk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBpZiAoIXV4dGhlbWVMaWJyYXJ5
KCkgJiYgIW1fc2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBPcGVu
VGhlbWVEYXRhKDAsIEwiU2Nyb2xsYmFyIik7CisKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSkK
KyAgICAgICAgRHJhd1RoZW1lQmFja2dyb3VuZChtX3Njcm9sbEJhclRoZW1lLCBoZGMsIFNQX0JV
VFRPTiwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIERyYXdG
cmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgY2xhc3NpY1BhcnQsIGNsYXNzaWNTdGF0ZSk7
CisKKyAgICBkb25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3QpOwogfQogCiB2b2lkIFBsYXRm
b3JtU2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3Qg
SW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29u
c3QKIHsKLSAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQotICAgICAgICByZXR1cm47Ci0K
ICAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGhhc0J1dHRvbnMoKSA/IHRyYWNrUmVwYWludFJlY3Qo
cmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSkgOiByZWN0OwogICAgIAogICAgIGlm
ICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCiAgICAgICAgIHJldHVybjsKIAot
ICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
ID8gSFNjcm9sbFRyYWNrUGFydCA6IFZTY3JvbGxUcmFja1BhcnQ7Ci0gICAgVGhlbWVDb250cm9s
U3RhdGUgc3RhdGUgPSAwOworICAgIHVuc2lnbmVkIHBhcnQgPSAwOworICAgIHVuc2lnbmVkIGNs
YXNzaWNQYXJ0ID0gREZDX1NDUk9MTDsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9u
dGFsU2Nyb2xsYmFyKQorICAgICAgIHBhcnQgPSBzdGFydCA/IFNQX1RSQUNLU1RBUlRIT1IgOiBT
UF9UUkFDS0VOREhPUjsKKyAgICBlbHNlCisgICAgICAgcGFydCA9IHN0YXJ0ID8gU1BfVFJBQ0tT
VEFSVFZFUlQgOiBTUF9UUkFDS0VORFZFUlQ7CisKKyAgICB1bnNpZ25lZCBzdGF0ZSA9IFRTX0RJ
U0FCTEVEOworICAgIHVuc2lnbmVkIGNsYXNzaWNTdGF0ZSA9IERGQ1NfTU9OTzsKICAgICBpZiAo
bV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOworICAg
ICAgICBzdGF0ZSB8PSBUU19BQ1RJVkU7CisgICAgZWxzZQorICAgICAgIGNsYXNzaWNTdGF0ZSB8
PSBERkNTX0lOQUNUSVZFOworCiAgICAgaWYgKGhhc0J1dHRvbnMoKSkKLSAgICAgICAgc3RhdGUg
fD0gRW5hYmxlZFN0YXRlOworICAgICAgICBzdGF0ZSB8PSBUU19OT1JNQUw7CiAKLSAgICBwYWlu
dFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcGFpbnRSZWN0LCBj
b250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNS
ZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdp
bmcoY29udGV4dCwgcmVjdCk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBpZiAo
dXh0aGVtZUxpYnJhcnkoKSAmJiAhbV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgbV9zY3JvbGxC
YXJUaGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJTY3JvbGxiYXIiKTsKKworICAgIGlmIChtX3Nj
cm9sbEJhclRoZW1lKQorICAgICAgICBEcmF3VGhlbWVCYWNrZ3JvdW5kKG1fc2Nyb2xsQmFyVGhl
bWUsIGhkYywgcGFydCwgc3RhdGUsICZ3aWRnZXRSZWN0LCBOVUxMKTsKKyAgICBlbHNlCisgICAg
ICAgIERyYXdGcmFtZUNvbnRyb2woaGRjLCAmd2lkZ2V0UmVjdCwgREZDX1NDUk9MTCwgY2xhc3Np
Y1N0YXRlKTsKKworICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcmVjdCk7CiB9CiAKIHZv
aWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAog
ewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCi0gICAgICAgIHJldHVybjsKLQogICAg
IGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/
IEhTY3JvbGxUaHVtYlBhcnQgOiBWU2Nyb2xsVGh1bWJQYXJ0OwotICAgIFRoZW1lQ29udHJvbFN0
YXRlIHN0YXRlID0gMDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gKG1fb3JpZW50YXRpb24gPT0gSG9y
aXpvbnRhbFNjcm9sbGJhcikgPyBTUF9USFVNQkhPUiA6IFNQX1RIVU1CVkVSVDsKKyAgICB1bnNp
Z25lZCBzdGF0ZSA9IDA7CisKKyAgICBpZiAoIWlzRW5hYmxlZCgpKQorICAgICAgICBzdGF0ZSAr
PSBTUF9BQlNfRElTQUJMRV9NT0RJRklFUjsKKyAgICBlbHNlIGlmIChtX2NsaWVudC0+aXNBY3Rp
dmUoKSkKKyAgICAgICBzdGF0ZSArPSBTUF9BQlNfSE9UX01PRElGSUVSOworCisgICAgSERDIGhk
YyA9IHByZXBhcmVGb3JEcmF3aW5nKGNvbnRleHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0UmVj
dCA9IHJlY3Q7CisgICAgaWYgKHV4dGhlbWVMaWJyYXJ5KCkgJiYgIW1fc2Nyb2xsQmFyVGhlbWUp
CisgICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBPcGVuVGhlbWVEYXRhKDAsIEwiU2Nyb2xsYmFy
Iik7CisKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSkgeworICAgICAgICBEcmF3VGhlbWVCYWNr
Z3JvdW5kKG1fc2Nyb2xsQmFyVGhlbWUsIGhkYywgcGFydCwgc3RhdGUsICZ3aWRnZXRSZWN0LCBO
VUxMKTsKKyAgICAgICAgcGFpbnRHcmlwcGVyKGhkYywgd2lkZ2V0UmVjdCk7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgSEdESU9CSiBoU2F2ZUJydXNoID0gU2VsZWN0T2JqZWN0KGhkYywgR2V0U3lz
Q29sb3JCcnVzaChDT0xPUl9CVE5GQUNFKSk7CisgICAgICAgIERyYXdFZGdlKGhkYywgJndpZGdl
dFJlY3QsIEVER0VfUkFJU0VELCBCRl9SRUNUKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0KGhkYyxo
U2F2ZUJydXNoKTsKKyAgICB9CisKKyAgICBkb25lRHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3Qp
OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEdyaXBwZXIoSERDIGhkYywgY29u
c3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICB1bnNpZ25lZCBwYXJ0ID0gKG1fb3JpZW50
YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyBTUF9HUklQUEVSSE9SIDogU1BfR1JJUFBF
UlZFUlQ7CisgICAgdW5zaWduZWQgc3RhdGUgPSAwOworCiAgICAgaWYgKG1fY2xpZW50LT5pc0Fj
dGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKLSAgICBpZiAoaXNFbmFibGVk
KCkpCi0gICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKyAgICAgICAgc3RhdGUgfD0gVFNf
QUNUSVZFOwogCi0gICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCksIHJlY3QsIGNvbnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29u
dHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworICAgIFJFQ1Qgd2lkZ2V0
UmVjdCA9IHJlY3Q7CisgICAgaWYgKHV4dGhlbWVMaWJyYXJ5KCkgJiYgIW1fc2Nyb2xsQmFyVGhl
bWUpCisgICAgICAgIG1fc2Nyb2xsQmFyVGhlbWUgPSBPcGVuVGhlbWVEYXRhKDAsIEwiU2Nyb2xs
YmFyIik7CisKKyAgICBpZiAobV9zY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgRHJhd1RoZW1lQmFj
a2dyb3VuZChtX3Njcm9sbEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0YXRlLCAmd2lkZ2V0UmVjdCwg
TlVMTCk7CiB9CiAKIFNjcm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRlc3QoY29u
c3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCkBAIC00NDgsNiArNTY5LDcgQEAgU2Nyb2xsYmFy
UGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0VGVzdAogICAgICAgICAgICAgcmV0dXJuIFRodW1i
UGFydDsKICAgICAgICAgcmV0dXJuIEZvcndhcmRUcmFja1BhcnQ7CiAgICAgfQorCiAgICAgcmV0
dXJuIE5vUGFydDsKIH0KIApAQCAtNDc2LDcgKzU5OCw3IEBAIGJvb2wgUGxhdGZvcm1TY3JvbGxi
YXI6OmhhbmRsZU1vdXNlTW92ZUUKICAgICAgICAgICAgIHNldFZhbHVlKChmbG9hdCkodGh1bWJQ
b3MgKyBkZWx0YSkgKiAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKSAvICh0cmFja0xlbiAt
IHRodW1iTGVuKSk7CiAgICAgICAgICAgICBtX3ByZXNzZWRQb3MgKz0gdGh1bWJQb3NpdGlvbigp
IC0gdGh1bWJQb3M7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHRydWU7
CiAgICAgfQogCkBAIC02MzYsMTkgKzc1OCwxMiBAQCBpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnZl
cnRpY2FsU2Nyb2xsYmFyCiBJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp3aW5kb3dDbGlwUmVj
dCgpIGNvbnN0CiB7CiAgICAgSW50UmVjdCBjbGlwUmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQo
KSk7CisKICAgICBjbGlwUmVjdCA9IGNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3coY2xpcFJlY3Qp
OwogICAgIGlmIChtX2NsaWVudCkKICAgICAgICAgY2xpcFJlY3QuaW50ZXJzZWN0KG1fY2xpZW50
LT53aW5kb3dDbGlwUmVjdCgpKTsKLSAgICByZXR1cm4gY2xpcFJlY3Q7Ci19CiAKLXZvaWQgUGxh
dGZvcm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByZWN0
KSBjb25zdAotewotfQotCi1JbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVyUmVjdChj
b25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEludFJlY3QoKTsK
KyAgICByZXR1cm4gY2xpcFJlY3Q7CiB9CiAKIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnRoZW1l
Q2hhbmdlZCgpCkBAIC02NTcsNCArNzcyLDMgQEAgdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhl
bWVDaGFuZ2VkKCkKIAogfQogCi0jZW5kaWYgLy8gZGVmaW5lZChVU0VfU0FGQVJJX1RIRU1FKQo=
</data>
<flag name="review"
          id="8497"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19440</attachid>
            <date>2008-02-28 17:52:58 -0800</date>
            <delta_ts>2008-02-29 11:09:59 -0800</delta_ts>
            <desc>Update based on aroben&apos;s comments</desc>
            <filename>WinScrollbars.patch</filename>
            <type>text/plain</type>
            <size>45883</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiAzMDYyNSkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIsNiArMTEyLDkgQEAKICNk
ZWZpbmUgV1RGX1BMQVRGT1JNX0NBSVJPIDEKICNlbmRpZgogCisjaWYgUExBVEZPUk0oV0lOKSYm
IFBMQVRGT1JNKENHKQorI2RlZmluZSBXVEZfVVNFX1NBRkFSSV9USEVNRSAxCisjZW5kaWYKIAog
I2lmZGVmIF9fUzYwX18KIC8vIHdlIGFyZSBjcm9zcy1jb21waWxpbmcsIGl0IGlzIG5vdCByZWFs
bHkgd2luZG93cwpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDMwNjU1KQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtp
bmcgY29weSkKQEAgLTEsMyArMSwxOSBAQAorMjAwOC0wMi0yOCAgQnJlbnQgRnVsZ2hhbSA8YmZ1
bGdoYW1AZ21haWwuY29tPgorCisgICAgICAgIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE3NDgzCisgICAgICAgIEltcGxlbWVudCBzY3JvbGxiYXJzIG9uIFdpbmRvd3Mg
KENhaXJvKQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFdBUk5JTkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAgICAgICogcGxh
dGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmg6ICBBZGQgbWVtYmVyIHRvIHN0b3JlIHNjcm9s
bGJhcgorICAgICAgICAgIGJ1dHRvbiBsZW5ndGggKGRpZmZlcnMgYnkgaG9yaXpvbnRhbC92ZXJ0
aWNhbCkuCisgICAgICAgICogcGxhdGZvcm0vd2luL1BsYXRmcm9tU2Nyb2xsQmFyV2luLmNwcDog
IER1cGxpY2F0ZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgIGZyb20gUGxhdGZvcm1TY3JvbGxC
YXJXaW5TYWZhcmkuY3BwLCB0aGVuIG1vZGlmeSB0byB1c2UgdGhlCisgICAgICAgICAgbmF0aXZl
IFdpbmRvd3MgdGhlbWUgZW5naW5lLiAgVXNlIFNPRlRfTElOSy4gIFVzZSBwbGF0Zm9ybQorICAg
ICAgICAgICdHZXRTeXN0ZW1NZXRyaWNzJyBjYWxsIHRvIGRlY2lkZSBzaXplIG9mIHNjcm9sbGJh
cnMgYW5kIGJ1dHRvbnMuCisKIDIwMDgtMDItMjggIE1hdHQgTGlsZWsgIDx3ZWJraXRAbWF0dGxp
bGVrLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBUaW0gSGF0Y2hlci4KSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXIuaAkocmV2aXNpb24gMzA2MzUpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhci5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xMDYsNiArMTA2LDEwIEBAIHByaXZhdGU6CiAgICAgaW50IG1fcHJlc3NlZFBvczsKICAgICBU
aW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4gbV9zY3JvbGxUaW1lcjsKICAgICBib29sIG1fb3Zlcmxh
cHNSZXNpemVyOworCisjaWYgUExBVEZPUk0oV0lOKSAmJiAhVVNFKFNBRkFSSV9USEVNRSkKKyAg
ICBpbnQgbV9CdXR0b25MZW5ndGg7CisjZW5kaWYKIH07CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHJldmlzaW9uIDMwNDU2KQko
ZnJvbSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhclNhZmFyaS5jcHA6MzA0
NTYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw2NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcg
QXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpZmRlZiBVU0VfU0FGQVJJX1RIRU1FIAorCisjaW5jbHVkZSAiUGxhdGZvcm1TY3Jv
bGxCYXIuaCIKKworI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkZyYW1lVmll
dy5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisj
aW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2lu
Y2x1ZGUgIlNvZnRMaW5raW5nLmgiCisKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBo
aWNzLmg+CisjaW5jbHVkZSA8U2FmYXJpVGhlbWUvU2FmYXJpVGhlbWUuaD4KKworLy8gRklYTUU6
IFRoZXJlIGFyZSByZXBhaW50aW5nIHByb2JsZW1zIGR1ZSB0byBBcXVhIHNjcm9sbCBiYXIgYnV0
dG9ucycgdmlzdWFsIG92ZXJmbG93LgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBTYWZhcmlUaGVtZTsKKworLy8gRklYTUU6
IFdlIHNob3VsZCBnZXQgdGhlc2UgbnVtYmVycyBmcm9tIFNhZmFyaVRoZW1lCitzdGF0aWMgaW50
IGNIb3Jpem9udGFsV2lkdGhbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNIb3Jpem9udGFs
SGVpZ2h0W10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVmVydGljYWxXaWR0aFtdID0geyAx
NSwgMTEgfTsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsSGVpZ2h0W10gPSB7IDE1LCAxMSB9Oworc3Rh
dGljIGludCBjUmVhbEJ1dHRvbkxlbmd0aFtdID0geyAyOCwgMjEgfTsKK3N0YXRpYyBpbnQgY0J1
dHRvbkluc2V0W10gPSB7IDE0LCAxMSB9Oworc3RhdGljIGludCBjQnV0dG9uSGl0SW5zZXRbXSA9
IHsgMywgMiB9OworLy8gY1JlYWxCdXR0b25MZW5ndGggLSBjQnV0dG9uSW5zZXQKK3N0YXRpYyBp
bnQgY0J1dHRvbkxlbmd0aFtdID0geyAxNCwgMTAgfTsKK3N0YXRpYyBpbnQgY1RodW1iV2lkdGhb
XSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNUaHVtYkhlaWdodFtdID0geyAxNSwgMTEgfTsK
K3N0YXRpYyBpbnQgY1RodW1iTWluTGVuZ3RoW10gPSB7IDI2LCAyMCB9OworCisjaWYgIWRlZmlu
ZWQoTkRFQlVHKSAmJiBkZWZpbmVkKFVTRV9ERUJVR19TQUZBUklfVEhFTUUpCitTT0ZUX0xJTktf
REVCVUdfTElCUkFSWShTYWZhcmlUaGVtZSkKKyNlbHNlCitTT0ZUX0xJTktfTElCUkFSWShTYWZh
cmlUaGVtZSkKKyNlbmRpZgorCitTT0ZUX0xJTksoU2FmYXJpVGhlbWUsIHBhaW50VGhlbWVQYXJ0
LCB2b2lkLCBfX3N0ZGNhbGwsIChUaGVtZVBhcnQgcGFydCwgQ0dDb250ZXh0UmVmIGNvbnRleHQs
IGNvbnN0IENHUmVjdCYgcmVjdCwgTlNDb250cm9sU2l6ZSBzaXplLCBUaGVtZUNvbnRyb2xTdGF0
ZSBzdGF0ZSksIChwYXJ0LCBjb250ZXh0LCByZWN0LCBzaXplLCBzdGF0ZSkpCisKK2NvbnN0IGRv
dWJsZSBjSW5pdGlhbFRpbWVyRGVsYXkgPSAwLjI1OworY29uc3QgZG91YmxlIGNOb3JtYWxUaW1l
ckRlbGF5ID0gMC4wNTsKKworUGxhdGZvcm1TY3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNj
cm9sbGJhckNsaWVudCogY2xpZW50LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwg
U2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSkKKyAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9yaWVu
dGF0aW9uLCBzaXplKSwgbV9ob3ZlcmVkUGFydChOb1BhcnQpLCBtX3ByZXNzZWRQYXJ0KE5vUGFy
dCksIG1fcHJlc3NlZFBvcygwKSwKKyAgICAgIG1fc2Nyb2xsVGltZXIodGhpcywgJlBsYXRmb3Jt
U2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZCksCisgICAgICBtX292ZXJsYXBzUmVzaXpl
cihmYWxzZSkKK3sKKyAgICAvLyBPYnRhaW4gdGhlIGNvcnJlY3Qgc2Nyb2xsYmFyIHNpemVzIGZy
b20gdGhlIHN5c3RlbS4KKyAgICBpZiAoIWNIb3Jpem9udGFsV2lkdGgpIHsKKyAgICAgICAgLy8g
RklYTUU6IEdldCBtZXRpY3MgZnJvbSBTYWZhcmlUaGVtZQorICAgIH0KKworICAgIGlmIChvcmll
bnRhdGlvbiA9PSBWZXJ0aWNhbFNjcm9sbGJhcikKKyAgICAgICAgc2V0RnJhbWVHZW9tZXRyeShJ
bnRSZWN0KDAsIDAsIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxIZWln
aHRbY29udHJvbFNpemUoKV0pKTsKKyAgICBlbHNlCisgICAgICAgIHNldEZyYW1lR2VvbWV0cnko
SW50UmVjdCgwLCAwLCBjSG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRh
bEhlaWdodFtjb250cm9sU2l6ZSgpXSkpOworfQorCitQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRm
b3JtU2Nyb2xsYmFyKCkKK3sKKyAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworfQorCit2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlBvc2l0aW9uKCkKK3sKKyAgICBpbnZhbGlkYXRl
VHJhY2soKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQcm9wb3J0
aW9uKCkKK3sKKyAgICBpbnZhbGlkYXRlVHJhY2soKTsKK30KKworc3RhdGljIEludFJlY3QgdHJh
Y2tSZXBhaW50UmVjdChjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIFNjcm9sbGJhck9yaWVudGF0
aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6ZSkKK3sKKyAg
ICBJbnRSZWN0IHBhaW50UmVjdCh0cmFja1JlY3QpOworICAgIGlmIChvcmllbnRhdGlvbiA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICBwYWludFJlY3QuaW5mbGF0ZVgoY0J1dHRvbkxl
bmd0aFtjb250cm9sU2l6ZV0pOworICAgIGVsc2UKKyAgICAgICAgcGFpbnRSZWN0LmluZmxhdGVZ
KGNCdXR0b25MZW5ndGhbY29udHJvbFNpemVdKTsKKworICAgIHJldHVybiBwYWludFJlY3Q7Cit9
CisKK3N0YXRpYyBJbnRSZWN0IGJ1dHRvblJlcGFpbnRSZWN0KGNvbnN0IEludFJlY3QmIGJ1dHRv
blJlY3QsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9s
U2l6ZSBjb250cm9sU2l6ZSwgYm9vbCBzdGFydCkKK3sKKyAgICBJbnRSZWN0IHBhaW50UmVjdChi
dXR0b25SZWN0KTsKKyAgICBpZiAob3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikg
eworICAgICAgICBwYWludFJlY3Quc2V0V2lkdGgoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNp
emVdKTsKKyAgICAgICAgaWYgKCFzdGFydCkKKyAgICAgICAgICAgIHBhaW50UmVjdC5zZXRYKGJ1
dHRvblJlY3QueCgpIC0gKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSAtIGJ1dHRvblJl
Y3Qud2lkdGgoKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhaW50UmVjdC5zZXRIZWlnaHQo
Y1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemVdKTsKKyAgICAgICAgaWYgKCFzdGFydCkKKyAg
ICAgICAgICAgIHBhaW50UmVjdC5zZXRZKGJ1dHRvblJlY3QueSgpIC0gKGNSZWFsQnV0dG9uTGVu
Z3RoW2NvbnRyb2xTaXplXSAtIGJ1dHRvblJlY3QuaGVpZ2h0KCkpKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gcGFpbnRSZWN0OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjppbnZhbGlkYXRl
VHJhY2soKQoreworICAgIEludFJlY3QgcmVjdCA9IHRyYWNrUmVwYWludFJlY3QodHJhY2tSZWN0
KCksIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCkpOworICAgIHJlY3QubW92ZSgteCgpLCAt
eSgpKTsKKyAgICBpbnZhbGlkYXRlUmVjdChyZWN0KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9s
bGJhcjo6aW52YWxpZGF0ZVBhcnQoU2Nyb2xsYmFyUGFydCBwYXJ0KQoreworICAgIGlmIChwYXJ0
ID09IE5vUGFydCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCByZXN1bHQ7ICAgIAor
ICAgIHN3aXRjaCAocGFydCkgeworICAgICAgICBjYXNlIEJhY2tCdXR0b25QYXJ0OgorICAgICAg
ICAgICAgcmVzdWx0ID0gYnV0dG9uUmVwYWludFJlY3QoYmFja0J1dHRvblJlY3QoKSwgbV9vcmll
bnRhdGlvbiwgY29udHJvbFNpemUoKSwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBGb3J3YXJkQnV0dG9uUGFydDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGJ1dHRvblJl
cGFpbnRSZWN0KGZvcndhcmRCdXR0b25SZWN0KCksIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXpl
KCksIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiB7CisgICAg
ICAgICAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVj
dDsKKyAgICAgICAgICAgIHNwbGl0VHJhY2sodHJhY2tSZWN0KCksIGJlZm9yZVRodW1iUmVjdCwg
dGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdCk7CisgICAgICAgICAgICBpZiAocGFydCA9PSBCYWNr
VHJhY2tQYXJ0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJlZm9yZVRodW1iUmVjdDsKKyAg
ICAgICAgICAgIGVsc2UgaWYgKHBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkKKyAgICAgICAgICAg
ICAgICByZXN1bHQgPSBhZnRlclRodW1iUmVjdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICByZXN1bHQgPSB0aHVtYlJlY3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0
Lm1vdmUoLXgoKSwgLXkoKSk7CisgICAgaW52YWxpZGF0ZVJlY3QocmVzdWx0KTsKK30KKworaW50
IFBsYXRmb3JtU2Nyb2xsYmFyOjp3aWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdpZGdldDo6
d2lkdGgoKTsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjpoZWlnaHQoKSBjb25zdAorewor
ICAgIHJldHVybiBXaWRnZXQ6OmhlaWdodCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
OjpzZXRSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgLy8gR2V0IG91ciB3aW5kb3cg
cmVzaXplciByZWN0IGFuZCBzZWUgaWYgd2Ugb3ZlcmxhcC4gIEFkanVzdCB0byBhdm9pZCB0aGUg
b3ZlcmxhcAorICAgIC8vIGlmIG5lY2Vzc2FyeS4KKyAgICBJbnRSZWN0IGFkanVzdGVkUmVjdChy
ZWN0KTsKKyAgICBpZiAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpIHsKKyAg
ICAgICAgYm9vbCBvdmVybGFwc1Jlc2l6ZXIgPSBmYWxzZTsKKyAgICAgICAgRnJhbWVWaWV3KiB2
aWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworICAgICAgICBJbnRSZWN0
IHJlc2l6ZXJSZWN0ID0gdmlldy0+d2luZG93UmVzaXplclJlY3QoKTsKKyAgICAgICAgcmVzaXpl
clJlY3Quc2V0TG9jYXRpb24odmlldy0+Y29udmVydEZyb21Db250YWluaW5nV2luZG93KHJlc2l6
ZXJSZWN0LmxvY2F0aW9uKCkpKTsKKyAgICAgICAgaWYgKHJlY3QuaW50ZXJzZWN0cyhyZXNpemVy
UmVjdCkpIHsKKyAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3Jv
bGxiYXIpIHsKKyAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcCA9IHJlY3QucmlnaHQoKSAtIHJl
c2l6ZXJSZWN0LngoKTsKKyAgICAgICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDAgJiYgcmVzaXpl
clJlY3QucmlnaHQoKSA+PSByZWN0LnJpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRq
dXN0ZWRSZWN0LnNldFdpZHRoKHJlY3Qud2lkdGgoKSAtIG92ZXJsYXApOworICAgICAgICAgICAg
ICAgICAgICBvdmVybGFwc1Jlc2l6ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IG92ZXJsYXAgPSByZWN0LmJvdHRv
bSgpIC0gcmVzaXplclJlY3QueSgpOworICAgICAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAm
JiByZXNpemVyUmVjdC5ib3R0b20oKSA+PSByZWN0LmJvdHRvbSgpKSB7CisgICAgICAgICAgICAg
ICAgICAgIGFkanVzdGVkUmVjdC5zZXRIZWlnaHQocmVjdC5oZWlnaHQoKSAtIG92ZXJsYXApOwor
ICAgICAgICAgICAgICAgICAgICBvdmVybGFwc1Jlc2l6ZXIgPSB0cnVlOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdmVybGFwc1Jl
c2l6ZXIgIT0gbV9vdmVybGFwc1Jlc2l6ZXIpIHsKKyAgICAgICAgICAgIG1fb3ZlcmxhcHNSZXNp
emVyID0gb3ZlcmxhcHNSZXNpemVyOworICAgICAgICAgICAgdmlldy0+YWRqdXN0T3ZlcmxhcHBp
bmdTY3JvbGxiYXJDb3VudChtX292ZXJsYXBzUmVzaXplciA/IDEgOiAtMSk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBzZXRGcmFtZUdlb21ldHJ5KGFkanVzdGVkUmVjdCk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1TY3JvbGxiYXI6OnNldFBhcmVudChTY3JvbGxWaWV3KiBwYXJlbnRWaWV3KQorewor
ICAgIGlmICghcGFyZW50VmlldyAmJiBtX292ZXJsYXBzUmVzaXplciAmJiBwYXJlbnQoKSAmJiBw
YXJlbnQoKS0+aXNGcmFtZVZpZXcoKSkKKyAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
cGFyZW50KCkpLT5hZGp1c3RPdmVybGFwcGluZ1Njcm9sbGJhckNvdW50KC0xKTsKKyAgICBXaWRn
ZXQ6OnNldFBhcmVudChwYXJlbnRWaWV3KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6
c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQgIT0gaXNFbmFibGVk
KCkpIHsKKyAgICAgICAgV2lkZ2V0OjpzZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICBpbnZh
bGlkYXRlKCk7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludChHcmFw
aGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkK
K3sKKyAgICBpZiAoZ3JhcGhpY3NDb250ZXh0LT51cGRhdGluZ0NvbnRyb2xUaW50cygpKSB7Cisg
ICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChn
cmFwaGljc0NvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gRG9uJ3QgcGFpbnQgYW55dGhpbmcgaWYgdGhlIHNjcm9sbGJhciBkb2Vzbid0IGludGVy
c2VjdCB0aGUgZGFtYWdlIHJlY3QuCisgICAgaWYgKCFmcmFtZUdlb21ldHJ5KCkuaW50ZXJzZWN0
cyhkYW1hZ2VSZWN0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCB0cmFjayA9IHRy
YWNrUmVjdCgpOworICAgIHBhaW50VHJhY2soZ3JhcGhpY3NDb250ZXh0LCB0cmFjaywgdHJ1ZSwg
ZGFtYWdlUmVjdCk7CisKKyAgICBpZiAoaGFzQnV0dG9ucygpKSB7CisgICAgICAgIHBhaW50QnV0
dG9uKGdyYXBoaWNzQ29udGV4dCwgYmFja0J1dHRvblJlY3QoKSwgdHJ1ZSwgZGFtYWdlUmVjdCk7
CisgICAgICAgIHBhaW50QnV0dG9uKGdyYXBoaWNzQ29udGV4dCwgZm9yd2FyZEJ1dHRvblJlY3Qo
KSwgZmFsc2UsIGRhbWFnZVJlY3QpOworICAgIH0KKworICAgIGlmIChoYXNUaHVtYigpICYmIGRh
bWFnZVJlY3QuaW50ZXJzZWN0cyh0cmFjaykpIHsKKyAgICAgICAgSW50UmVjdCBzdGFydFRyYWNr
UmVjdCwgdGh1bWJSZWN0LCBlbmRUcmFja1JlY3Q7CisgICAgICAgIHNwbGl0VHJhY2sodHJhY2ss
IHN0YXJ0VHJhY2tSZWN0LCB0aHVtYlJlY3QsIGVuZFRyYWNrUmVjdCk7CisgICAgICAgIHBhaW50
VGh1bWIoZ3JhcGhpY3NDb250ZXh0LCB0aHVtYlJlY3QsIGRhbWFnZVJlY3QpOworICAgIH0KK30K
KworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFzQnV0dG9ucygpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGlzRW5hYmxlZCgpICYmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIg
PyB3aWR0aCgpIDogaGVpZ2h0KCkpID49IDIgKiAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNp
emUoKV0gLSBjQnV0dG9uSGl0SW5zZXRbY29udHJvbFNpemUoKV0pOworfQorCitib29sIFBsYXRm
b3JtU2Nyb2xsYmFyOjpoYXNUaHVtYigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlzRW5hYmxlZCgp
ICYmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyB3aWR0aCgpIDogaGVp
Z2h0KCkpID49IDIgKiBjQnV0dG9uSW5zZXRbY29udHJvbFNpemUoKV0gKyBjVGh1bWJNaW5MZW5n
dGhbY29udHJvbFNpemUoKV0gKyAxOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpi
YWNrQnV0dG9uUmVjdCgpIGNvbnN0Cit7CisgICAgLy8gT3VyIGRlc2lyZWQgcmVjdCBpcyBlc3Nl
bnRpYWxseSAxN3gxNy4KKyAgICAKKyAgICAvLyBPdXIgYWN0dWFsIHJlY3Qgd2lsbCBzaHJpbmsg
dG8gaGFsZiB0aGUgYXZhaWxhYmxlIHNwYWNlIHdoZW4KKyAgICAvLyB3ZSBoYXZlIDwgMzQgcGl4
ZWxzIGxlZnQuICBUaGlzIGFsbG93cyB0aGUgc2Nyb2xsYmFyCisgICAgLy8gdG8gc2NhbGUgZG93
biBhbmQgZnVuY3Rpb24gZXZlbiBhdCB0aW55IHNpemVzLgorICAgIGlmIChtX29yaWVudGF0aW9u
ID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgp
LCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9s
U2l6ZSgpXSk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdpZHRoW2Nv
bnRyb2xTaXplKCldLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldKTsKK30KKworSW50UmVj
dCBQbGF0Zm9ybVNjcm9sbGJhcjo6Zm9yd2FyZEJ1dHRvblJlY3QoKSBjb25zdAoreworICAgIC8v
IE91ciBkZXNpcmVkIHJlY3QgaXMgZXNzZW50aWFsbHkgMTd4MTcuCisgICAgCisgICAgLy8gT3Vy
IGFjdHVhbCByZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFjZSB3aGVu
CisgICAgLy8gd2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhlIHNjcm9s
bGJhcgorICAgIC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlueSBzaXpl
cy4KKworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAg
ICAgIHJldHVybiBJbnRSZWN0KHgoKSArIHdpZHRoKCkgLSBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xT
aXplKCldLCB5KCksIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVp
Z2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSArIGhlaWdo
dCgpIC0gY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsV2lkdGhbY29udHJv
bFNpemUoKV0sIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0pOworfQorCitJbnRSZWN0IFBs
YXRmb3JtU2Nyb2xsYmFyOjp0cmFja1JlY3QoKSBjb25zdAoreworICAgIGlmIChtX29yaWVudGF0
aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaWYgKCFoYXNCdXR0b25zKCkp
CisgICAgICAgICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgd2lkdGgoKSwgY0hvcml6b250
YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyBj
QnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCB5KCksIHdpZHRoKCkgLSAyICogY0J1dHRvbkxl
bmd0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOwor
ICAgIH0KKworICAgIGlmICghaGFzQnV0dG9ucygpKQorICAgICAgICByZXR1cm4gSW50UmVjdCh4
KCksIHkoKSwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGhlaWdodCgpKTsKKyAgICBy
ZXR1cm4gSW50UmVjdCh4KCksIHkoKSArIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNW
ZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBoZWlnaHQoKSAtIDIgKiBjQnV0dG9uTGVuZ3Ro
W2NvbnRyb2xTaXplKCldKTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJS
ZWN0KCkgY29uc3QKK3sKKyAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBh
ZnRlclRodW1iUmVjdDsKKyAgICBzcGxpdFRyYWNrKHRyYWNrUmVjdCgpLCBiZWZvcmVUaHVtYlJl
Y3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOworICAgIHJldHVybiB0aHVtYlJlY3Q7Cit9
CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNwbGl0VHJhY2soY29uc3QgSW50UmVjdCYgdHJh
Y2tSZWN0LCBJbnRSZWN0JiBiZWZvcmVUaHVtYlJlY3QsIEludFJlY3QmIHRodW1iUmVjdCwgSW50
UmVjdCYgYWZ0ZXJUaHVtYlJlY3QpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiB3b24n
dCBldmVuIGdldCBjYWxsZWQgdW5sZXNzIHdlJ3JlIGJpZyBlbm91Z2ggdG8gaGF2ZSBzb21lIGNv
bWJpbmF0aW9uIG9mIHRoZXNlIHRocmVlIHJlY3RzIHdoZXJlIGF0IGxlYXN0CisgICAgLy8gb25l
IG9mIHRoZW0gaXMgbm9uLWVtcHR5LgorICAgIGludCB0aHVtYlBvcyA9IHRodW1iUG9zaXRpb24o
KTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAg
ICAgIHRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSArIHRodW1iUG9zLCB0cmFja1Jl
Y3QueSgpICsgKHRyYWNrUmVjdC5oZWlnaHQoKSAtIGNUaHVtYkhlaWdodFtjb250cm9sU2l6ZSgp
XSkgLyAyLCB0aHVtYkxlbmd0aCgpLCBjVGh1bWJIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAg
ICAgICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCksIHRyYWNrUmVjdC55
KCksIHRodW1iUG9zLCB0cmFja1JlY3QuaGVpZ2h0KCkpOworICAgICAgICBhZnRlclRodW1iUmVj
dCA9IEludFJlY3QodGh1bWJSZWN0LngoKSArIHRodW1iUmVjdC53aWR0aCgpLCB0cmFja1JlY3Qu
eSgpLCB0cmFja1JlY3QucmlnaHQoKSAtIHRodW1iUmVjdC5yaWdodCgpLCB0cmFja1JlY3QuaGVp
Z2h0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRodW1iUmVjdCA9IEludFJlY3QodHJhY2tS
ZWN0LngoKSArICh0cmFja1JlY3Qud2lkdGgoKSAtIGNUaHVtYldpZHRoW2NvbnRyb2xTaXplKCld
KSAvIDIsIHRyYWNrUmVjdC55KCkgKyB0aHVtYlBvcywgY1RodW1iV2lkdGhbY29udHJvbFNpemUo
KV0sIHRodW1iTGVuZ3RoKCkpOworICAgICAgICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRy
YWNrUmVjdC54KCksIHRyYWNrUmVjdC55KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0aHVtYlBvcyk7
CisgICAgICAgIGFmdGVyVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0aHVtYlJl
Y3QueSgpICsgdGh1bWJSZWN0LmhlaWdodCgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdHJhY2tSZWN0
LmJvdHRvbSgpIC0gdGh1bWJSZWN0LmJvdHRvbSgpKTsKKyAgICB9Cit9CisKK2ludCBQbGF0Zm9y
bVNjcm9sbGJhcjo6dGh1bWJQb3NpdGlvbigpIGNvbnN0Cit7CisgICAgaWYgKGlzRW5hYmxlZCgp
KQorICAgICAgICByZXR1cm4gKGZsb2F0KW1fY3VycmVudFBvcyAqICh0cmFja0xlbmd0aCgpIC0g
dGh1bWJMZW5ndGgoKSkgLyAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKTsKKyAgICByZXR1
cm4gMDsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYkxlbmd0aCgpIGNvbnN0Cit7
CisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmbG9hdCBw
cm9wb3J0aW9uID0gKGZsb2F0KShtX3Zpc2libGVTaXplKSAvIG1fdG90YWxTaXplOworICAgIGlu
dCB0cmFja0xlbiA9IHRyYWNrTGVuZ3RoKCk7CisgICAgaW50IGxlbmd0aCA9IHByb3BvcnRpb24g
KiB0cmFja0xlbjsKKyAgICBpbnQgbWluTGVuZ3RoID0gY1RodW1iTWluTGVuZ3RoW2NvbnRyb2xT
aXplKCldOworICAgIGxlbmd0aCA9IG1heChsZW5ndGgsIG1pbkxlbmd0aCk7CisgICAgaWYgKGxl
bmd0aCA+IHRyYWNrTGVuKQorICAgICAgICBsZW5ndGggPSAwOyAvLyBPbmNlIHRoZSB0aHVtYiBp
cyBiZWxvdyB0aGUgdHJhY2sgbGVuZ3RoLCBpdCBqdXN0IGdvZXMgYXdheSAodG8gbWFrZSBtb3Jl
IHJvb20gZm9yIHRoZSB0cmFjaykuCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworaW50IFBsYXRm
b3JtU2Nyb2xsYmFyOjp0cmFja0xlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtX29yaWVu
dGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gdHJhY2tSZWN0KCkud2lkdGgoKSA6IHRy
YWNrUmVjdCgpLmhlaWdodCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludEJ1
dHRvbihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wg
c3RhcnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFTYWZh
cmlUaGVtZUxpYnJhcnkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBwYWludFJl
Y3QgPSBidXR0b25SZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgp
LCBzdGFydCk7CisgICAgCisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVGhlbWVQYXJ0IHBhcnQ7CisgICAgVGhlbWVDb250
cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKKyAgICAg
ICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpv
bnRhbFNjcm9sbGJhcikKKyAgICAgICAgcGFydCA9IHN0YXJ0ID8gU2Nyb2xsTGVmdEFycm93UGFy
dCA6IFNjcm9sbFJpZ2h0QXJyb3dQYXJ0OworICAgIGVsc2UKKyAgICAgICAgcGFydCA9IHN0YXJ0
ID8gU2Nyb2xsVXBBcnJvd1BhcnQgOiBTY3JvbGxEb3duQXJyb3dQYXJ0OworCisgICAgaWYgKGlz
RW5hYmxlZCgpKQorICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisgICAgaWYgKChtX3By
ZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0ICYmIHN0YXJ0KQorICAgICAgICB8fCAobV9wcmVz
c2VkUGFydCA9PSBGb3J3YXJkQnV0dG9uUGFydCAmJiAhc3RhcnQpKQorICAgICAgICBzdGF0ZSB8
PSBQcmVzc2VkU3RhdGU7CisKKyAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0
Zm9ybUNvbnRleHQoKSwgcGFpbnRSZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFy
ID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKK30K
Kwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUcmFjayhHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgc3RhcnQsIGNvbnN0IEludFJlY3QmIGRh
bWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgSW50UmVjdCBwYWludFJlY3QgPSBoYXNCdXR0b25zKCkgPyB0cmFj
a1JlcGFpbnRSZWN0KHJlY3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCkpIDogcmVjdDsK
KyAgICAKKyAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpv
bnRhbFNjcm9sbGJhciA/IEhTY3JvbGxUcmFja1BhcnQgOiBWU2Nyb2xsVHJhY2tQYXJ0OworICAg
IFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZl
KCkpCisgICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOworICAgIGlmIChoYXNCdXR0b25zKCkp
CisgICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKworICAgIHBhaW50VGhlbWVQYXJ0KHBh
cnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkg
PT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9s
U2l6ZSwgc3RhdGUpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRodW1iKEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW50UmVj
dCYgZGFtYWdlUmVjdCkgY29uc3QKK3sKKyAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhyZWN0KSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09
IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVGh1bWJQYXJ0IDogVlNjcm9sbFRodW1iUGFy
dDsKKyAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5p
c0FjdGl2ZSgpKQorICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICBpZiAoaXNFbmFi
bGVkKCkpCisgICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsKKworICAgIHBhaW50VGhlbWVQ
YXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LCBjb250cm9sU2l6ZSgp
ID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJv
bFNpemUsIHN0YXRlKTsKK30KKworU2Nyb2xsYmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0
VGVzdChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBpZiAoIWlzRW5hYmxl
ZCgpKQorICAgICAgICByZXR1cm4gTm9QYXJ0OworCisgICAgSW50UG9pbnQgbW91c2VQb3NpdGlv
biA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpOworICAgIG1vdXNlUG9z
aXRpb24ubW92ZSh4KCksIHkoKSk7CisKKyAgICBpZiAoaGFzQnV0dG9ucygpKSB7CisgICAgICAg
IGlmIChiYWNrQnV0dG9uUmVjdCgpLmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAg
ICAgcmV0dXJuIEJhY2tCdXR0b25QYXJ0OworCisgICAgICAgIGlmIChmb3J3YXJkQnV0dG9uUmVj
dCgpLmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuIEZvcndhcmRC
dXR0b25QYXJ0OworICAgIH0KKworICAgIGlmICghaGFzVGh1bWIoKSkKKyAgICAgICAgcmV0dXJu
IE5vUGFydDsKKworICAgIEludFJlY3QgdHJhY2sgPSB0cmFja1JlY3QoKTsKKyAgICBpZiAodHJh
Y2suY29udGFpbnMobW91c2VQb3NpdGlvbikpIHsKKyAgICAgICAgSW50UmVjdCBiZWZvcmVUaHVt
YlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgICAgIHNwbGl0VHJhY2sodHJh
Y2ssIGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdCk7CisgICAgICAg
IGlmIChiZWZvcmVUaHVtYlJlY3QuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAg
ICByZXR1cm4gQmFja1RyYWNrUGFydDsKKyAgICAgICAgaWYgKHRodW1iUmVjdC5jb250YWlucyht
b3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBUaHVtYlBhcnQ7CisgICAgICAgIHJl
dHVybiBGb3J3YXJkVHJhY2tQYXJ0OworICAgIH0KKyAgICByZXR1cm4gTm9QYXJ0OworfQorCiti
b29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU1vdmVFdmVudChjb25zdCBQbGF0Zm9y
bU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBUaHVtYlBhcnQp
IHsKKyAgICAgICAgLy8gRHJhZyB0aGUgdGh1bWIuCisgICAgICAgIGludCB0aHVtYlBvcyA9IHRo
dW1iUG9zaXRpb24oKTsKKyAgICAgICAgaW50IHRodW1iTGVuID0gdGh1bWJMZW5ndGgoKTsKKyAg
ICAgICAgaW50IHRyYWNrTGVuID0gdHJhY2tMZW5ndGgoKTsKKyAgICAgICAgaW50IG1heFBvcyA9
IHRyYWNrTGVuIC0gdGh1bWJMZW47CisgICAgICAgIGludCBkZWx0YSA9IDA7CisgICAgICAgIGlm
IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgICAgICBkZWx0
YSA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSAtIG1fcHJlc3Nl
ZFBvczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRh
aW5pbmdXaW5kb3coZXZ0LnBvcygpKS55KCkgLSBtX3ByZXNzZWRQb3M7CisKKyAgICAgICAgaWYg
KGRlbHRhID4gMCkKKyAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBtb3ZlZCBkb3duL3JpZ2h0Lgor
ICAgICAgICAgICAgZGVsdGEgPSBtaW4obWF4UG9zIC0gdGh1bWJQb3MsIGRlbHRhKTsKKyAgICAg
ICAgZWxzZSBpZiAoZGVsdGEgPCAwKQorICAgICAgICAgICAgLy8gVGhlIG1vdXNlIG1vdmVkIHVw
L2xlZnQuCisgICAgICAgICAgICBkZWx0YSA9IG1heCgtdGh1bWJQb3MsIGRlbHRhKTsKKworICAg
ICAgICBpZiAoZGVsdGEgIT0gMCkgeworICAgICAgICAgICAgc2V0VmFsdWUoKGZsb2F0KSh0aHVt
YlBvcyArIGRlbHRhKSAqIChtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpIC8gKHRyYWNrTGVu
IC0gdGh1bWJMZW4pKTsKKyAgICAgICAgICAgIG1fcHJlc3NlZFBvcyArPSB0aHVtYlBvc2l0aW9u
KCkgLSB0aHVtYlBvczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorCisgICAgaWYgKG1fcHJlc3NlZFBhcnQgIT0gTm9QYXJ0KQorICAgICAgICBtX3By
ZXNzZWRQb3MgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gY29udmVy
dEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueCgpIDogY29udmVydEZyb21Db250YWlu
aW5nV2luZG93KGV2dC5wb3MoKSkueSgpKTsKKworICAgIFNjcm9sbGJhclBhcnQgcGFydCA9IGhp
dFRlc3QoZXZ0KTsgICAgCisgICAgaWYgKHBhcnQgIT0gbV9ob3ZlcmVkUGFydCkgeworICAgICAg
ICBpZiAobV9wcmVzc2VkUGFydCAhPSBOb1BhcnQpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09
IG1fcHJlc3NlZFBhcnQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbW91c2UgaXMgbW92aW5n
IGJhY2sgb3ZlciB0aGUgcHJlc3NlZCBwYXJ0LiAgV2UKKyAgICAgICAgICAgICAgICAvLyBuZWVk
IHRvIHN0YXJ0IHVwIHRoZSB0aW1lciBhY3Rpb24gYWdhaW4uCisgICAgICAgICAgICAgICAgc3Rh
cnRUaW1lcklmTmVlZGVkKGNOb3JtYWxUaW1lckRlbGF5KTsKKyAgICAgICAgICAgICAgICBpbnZh
bGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9ob3Zl
cmVkUGFydCA9PSBtX3ByZXNzZWRQYXJ0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG1vdXNl
IGlzIGxlYXZpbmcgdGhlIHByZXNzZWQgcGFydC4gIEtpbGwgb3VyIHRpbWVyCisgICAgICAgICAg
ICAgICAgLy8gaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7
CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlUGFydChwYXJ0
KTsKKyAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAgICAgICB9
CisgICAgICAgIG1faG92ZXJlZFBhcnQgPSBwYXJ0OworICAgIH0gCisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VPdXRFdmVudChjb25z
dCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBpbnZhbGlkYXRlUGFydChtX2hvdmVy
ZWRQYXJ0KTsKKyAgICBtX2hvdmVyZWRQYXJ0ID0gTm9QYXJ0OworCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlUHJlc3NFdmVudChjb25z
dCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBtX3ByZXNzZWRQYXJ0ID0gaGl0VGVz
dChldnQpOworICAgIG1fcHJlc3NlZFBvcyA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxT
Y3JvbGxiYXIgPyBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkgOiBj
b252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS55KCkpOworICAgIGludmFsaWRh
dGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgIGF1dG9zY3JvbGxQcmVzc2VkUGFydChjSW5pdGlh
bFRpbWVyRGVsYXkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xs
YmFyOjpoYW5kbGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2
dCkKK3sKKyAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICBtX3ByZXNzZWRQ
YXJ0ID0gTm9QYXJ0OworICAgIG1fcHJlc3NlZFBvcyA9IDA7CisgICAgc3RvcFRpbWVySWZOZWVk
ZWQoKTsKKworICAgIGlmIChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGcmFtZVZpZXcoKSkKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpLT5mcmFtZSgpLT5ldmVudEhh
bmRsZXIoKS0+c2V0TW91c2VQcmVzc2VkKGZhbHNlKTsKKworICAgIHJldHVybiB0cnVlOworfQor
Cit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzdGFydFRpbWVySWZOZWVkZWQoZG91YmxlIGRlbGF5
KQoreworICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGZvciB0aGUgdGh1bWIuCisgICAgaWYgKG1f
cHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBIYW5k
bGUgdGhlIHRyYWNrLiAgV2UgaGFsdCB0cmFjayBzY3JvbGxpbmcgb25jZSB0aGUgdGh1bWIgaXMg
bGV2ZWwKKyAgICAvLyB3aXRoIHVzLgorICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrVHJh
Y2tQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkgJiYgdGh1bWJVbmRl
ck1vdXNlKCkpIHsKKyAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAg
ICAgIG1faG92ZXJlZFBhcnQgPSBUaHVtYlBhcnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICAvLyBXZSBjYW4ndCBzY3JvbGwgaWYgd2UndmUgaGl0IHRoZSBiZWdpbm5pbmcgb3IgZW5k
LgorICAgIFNjcm9sbERpcmVjdGlvbiBkaXIgPSBwcmVzc2VkUGFydFNjcm9sbERpcmVjdGlvbigp
OworICAgIGlmIChkaXIgPT0gU2Nyb2xsVXAgfHwgZGlyID09IFNjcm9sbExlZnQpIHsKKyAgICAg
ICAgaWYgKG1fY3VycmVudFBvcyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0gZWxz
ZSB7CisgICAgICAgIGlmIChtX2N1cnJlbnRQb3MgPT0gbV90b3RhbFNpemUgLSBtX3Zpc2libGVT
aXplKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fc2Nyb2xsVGltZXIuc3Rh
cnRPbmVTaG90KGRlbGF5KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3RvcFRpbWVy
SWZOZWVkZWQoKQoreworICAgIGlmIChtX3Njcm9sbFRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAg
IG1fc2Nyb2xsVGltZXIuc3RvcCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjphdXRv
c2Nyb2xsUHJlc3NlZFBhcnQoZG91YmxlIGRlbGF5KQoreworICAgIC8vIERvbid0IGRvIGFueXRo
aW5nIGZvciB0aGUgdGh1bWIgb3IgaWYgbm90aGluZyB3YXMgcHJlc3NlZC4KKyAgICBpZiAobV9w
cmVzc2VkUGFydCA9PSBUaHVtYlBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBOb1BhcnQpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIEhhbmRsZSB0aGUgdHJhY2suCisgICAgaWYgKChtX3ByZXNz
ZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkVHJhY2tQ
YXJ0KSAmJiB0aHVtYlVuZGVyTW91c2UoKSkgeworICAgICAgICBpbnZhbGlkYXRlUGFydChtX3By
ZXNzZWRQYXJ0KTsKKyAgICAgICAgbV9ob3ZlcmVkUGFydCA9IFRodW1iUGFydDsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIEhhbmRsZSB0aGUgYXJyb3dzIGFuZCB0cmFjay4KKyAg
ICBpZiAoc2Nyb2xsKHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCksIHByZXNzZWRQYXJ0U2Ny
b2xsR3JhbnVsYXJpdHkoKSkpCisgICAgICAgIHN0YXJ0VGltZXJJZk5lZWRlZChkZWxheSk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKFRpbWVyPFBs
YXRmb3JtU2Nyb2xsYmFyPiopCit7CisgICAgYXV0b3Njcm9sbFByZXNzZWRQYXJ0KGNOb3JtYWxU
aW1lckRlbGF5KTsKK30KKworU2Nyb2xsRGlyZWN0aW9uIFBsYXRmb3JtU2Nyb2xsYmFyOjpwcmVz
c2VkUGFydFNjcm9sbERpcmVjdGlvbigpCit7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9y
aXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0
dG9uUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICBy
ZXR1cm4gU2Nyb2xsTGVmdDsKKyAgICAgICAgcmV0dXJuIFNjcm9sbFJpZ2h0OworICAgIH0gZWxz
ZSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1fcHJl
c3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgIHJldHVybiBTY3JvbGxVcDsK
KyAgICAgICAgcmV0dXJuIFNjcm9sbERvd247CisgICAgfQorfQorCitTY3JvbGxHcmFudWxhcml0
eSBQbGF0Zm9ybVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0eSgpCit7Cisg
ICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgfHwgbV9wcmVzc2VkUGFydCA9
PSBGb3J3YXJkQnV0dG9uUGFydCkKKyAgICAgICAgcmV0dXJuIFNjcm9sbEJ5TGluZTsKKyAgICBy
ZXR1cm4gU2Nyb2xsQnlQYWdlOworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlVu
ZGVyTW91c2UoKQoreworICAgIC8vIENvbnN0cnVjdCBhIHJlY3QuCisgICAgSW50UmVjdCB0aHVt
YiA9IHRodW1iUmVjdCgpOworICAgIHRodW1iLm1vdmUoLXgoKSwgLXkoKSk7CisgICAgaW50IGJl
Z2luID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0aHVtYi54KCkg
OiB0aHVtYi55KCk7CisgICAgaW50IGVuZCA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxT
Y3JvbGxiYXIpID8gdGh1bWIucmlnaHQoKSA6IHRodW1iLmJvdHRvbSgpOworICAgIHJldHVybiAo
YmVnaW4gPD0gbV9wcmVzc2VkUG9zICYmIG1fcHJlc3NlZFBvcyA8IGVuZCk7Cit9CisKK2ludCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6aG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodChTY3JvbGxiYXJDb250
cm9sU2l6ZSBjb250cm9sU2l6ZSkKK3sKKyAgICByZXR1cm4gY0hvcml6b250YWxXaWR0aFtjb250
cm9sU2l6ZV07Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dmVydGljYWxTY3JvbGxiYXJX
aWR0aChTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6ZSkKK3sKKyAgICByZXR1cm4gY1Zl
cnRpY2FsSGVpZ2h0W2NvbnRyb2xTaXplXTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJh
cjo6d2luZG93Q2xpcFJlY3QoKSBjb25zdAoreworICAgIEludFJlY3QgY2xpcFJlY3QoMCwgMCwg
d2lkdGgoKSwgaGVpZ2h0KCkpOworICAgIGNsaXBSZWN0ID0gY29udmVydFRvQ29udGFpbmluZ1dp
bmRvdyhjbGlwUmVjdCk7CisgICAgaWYgKG1fY2xpZW50KQorICAgICAgICBjbGlwUmVjdC5pbnRl
cnNlY3QobV9jbGllbnQtPndpbmRvd0NsaXBSZWN0KCkpOworICAgIHJldHVybiBjbGlwUmVjdDsK
K30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBoZGMsIGNvbnN0
IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6
OmdyaXBwZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKK3sKKyAgICByZXR1
cm4gSW50UmVjdCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVtZUNoYW5nZWQo
KQoreworfQorCit9CisKKyNlbmRpZiAvLyBkZWZpbmVkKFVTRV9TQUZBUklfVEhFTUUpCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCShyZXZp
c2lvbiAzMDQ1NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2lu
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwOCBCcmVudCBGdWxnaGFtCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI1
LDggKzI2LDYgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCi0jaWZkZWYgVVNFX1NBRkFSSV9U
SEVNRSAKLQogI2luY2x1ZGUgIlBsYXRmb3JtU2Nyb2xsQmFyLmgiCiAKICNpbmNsdWRlICJFdmVu
dEhhbmRsZXIuaCIKQEAgLTM3LDU2ICszNiwxMTAgQEAKICNpbmNsdWRlICJQbGF0Zm9ybU1vdXNl
RXZlbnQuaCIKICNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgogCi0jaW5jbHVkZSA8Q29yZUdyYXBo
aWNzL0NvcmVHcmFwaGljcy5oPgotI2luY2x1ZGUgPFNhZmFyaVRoZW1lL1NhZmFyaVRoZW1lLmg+
CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIlJlbmRlclRoZW1lV2luLmgiCiAKLS8v
IEZJWE1FOiBUaGVyZSBhcmUgcmVwYWludGluZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBzY3JvbGwg
YmFyIGJ1dHRvbnMnIHZpc3VhbCBvdmVyZmxvdy4KKy8vIEdlbmVyaWMgc3RhdGUgY29uc3RhbnRz
CisjZGVmaW5lIFRTX05PUk1BTCAgICAxCisjZGVmaW5lIFRTX0hPVkVSICAgICAyCisjZGVmaW5l
IFRTX0FDVElWRSAgICAzCisjZGVmaW5lIFRTX0RJU0FCTEVEICA0CisjZGVmaW5lIFRTX0ZPQ1VT
RUQgICA1CisKKyNkZWZpbmUgQUJTX1VQTk9STUFMIDEKKyNkZWZpbmUgQUJTX0RPV05OT1JNQUwg
NQorI2RlZmluZSBBQlNfTEVGVE5PUk1BTCA5CisjZGVmaW5lIEFCU19SSUdIVE5PUk1BTCAxMwor
CitzdGF0aWMgY29uc3QgdW5zaWduZWQgU1BfQUJTX0hPVF9NT0RJRklFUiA9IDE7CitzdGF0aWMg
Y29uc3QgdW5zaWduZWQgU1BfQUJTX1BSRVNTRURfTU9ESUZJRVIgPSAyOworc3RhdGljIGNvbnN0
IHVuc2lnbmVkIFNQX0FCU19ESVNBQkxFX01PRElGSUVSID0gMzsKKworLy8gU2Nyb2xsYmFyIGNv
bnN0YW50cworI2RlZmluZSBTUF9CVVRUT04gMQorI2RlZmluZSBTUF9USFVNQkhPUiAyCisjZGVm
aW5lIFNQX1RIVU1CVkVSVCAzCisjZGVmaW5lIFNQX1RSQUNLU1RBUlRIT1IgNAorI2RlZmluZSBT
UF9UUkFDS0VOREhPUiA1CisjZGVmaW5lIFNQX1RSQUNLU1RBUlRWRVJUIDYKKyNkZWZpbmUgU1Bf
VFJBQ0tFTkRWRVJUIDcKKyNkZWZpbmUgU1BfR1JJUFBFUkhPUiA4CisjZGVmaW5lIFNQX0dSSVBQ
RVJWRVJUIDkKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
Ci11c2luZyBuYW1lc3BhY2UgU2FmYXJpVGhlbWU7Ci0KIC8vIEZJWE1FOiBXZSBzaG91bGQgZ2V0
IHRoZXNlIG51bWJlcnMgZnJvbSBTYWZhcmlUaGVtZQotc3RhdGljIGludCBjSG9yaXpvbnRhbFdp
ZHRoW10gPSB7IDE1LCAxMSB9Owotc3RhdGljIGludCBjSG9yaXpvbnRhbEhlaWdodFtdID0geyAx
NSwgMTEgfTsKLXN0YXRpYyBpbnQgY1ZlcnRpY2FsV2lkdGhbXSA9IHsgMTUsIDExIH07Ci1zdGF0
aWMgaW50IGNWZXJ0aWNhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKLXN0YXRpYyBpbnQgY1JlYWxC
dXR0b25MZW5ndGhbXSA9IHsgMjgsIDIxIH07Ci1zdGF0aWMgaW50IGNCdXR0b25JbnNldFtdID0g
eyAxNCwgMTEgfTsKLXN0YXRpYyBpbnQgY0J1dHRvbkhpdEluc2V0W10gPSB7IDMsIDIgfTsKK3N0
YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aCA9IDE3Oworc3RhdGljIGludCBjSG9yaXpvbnRhbEhl
aWdodCA9IDE3Oworc3RhdGljIGludCBjVmVydGljYWxXaWR0aCA9IDE3Oworc3RhdGljIGludCBj
VmVydGljYWxIZWlnaHQgPSAxNzsKK3N0YXRpYyBpbnQgY1JlYWxCdXR0b25MZW5ndGggPSAyODsK
K3N0YXRpYyBpbnQgY0J1dHRvbkluc2V0ID0gMTQ7CitzdGF0aWMgaW50IGNCdXR0b25IaXRJbnNl
dCA9IDM7CiAvLyBjUmVhbEJ1dHRvbkxlbmd0aCAtIGNCdXR0b25JbnNldAotc3RhdGljIGludCBj
QnV0dG9uTGVuZ3RoW10gPSB7IDE0LCAxMCB9Owotc3RhdGljIGludCBjVGh1bWJXaWR0aFtdID0g
eyAxNSwgMTEgfTsKLXN0YXRpYyBpbnQgY1RodW1iSGVpZ2h0W10gPSB7IDE1LCAxMSB9Owotc3Rh
dGljIGludCBjVGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIwIH07Ci0KLSNpZiAhZGVmaW5lZChO
REVCVUcpICYmIGRlZmluZWQoVVNFX0RFQlVHX1NBRkFSSV9USEVNRSkKLVNPRlRfTElOS19ERUJV
R19MSUJSQVJZKFNhZmFyaVRoZW1lKQotI2Vsc2UKLVNPRlRfTElOS19MSUJSQVJZKFNhZmFyaVRo
ZW1lKQotI2VuZGlmCitzdGF0aWMgaW50IGNUaHVtYldpZHRoID0gMTc7CitzdGF0aWMgaW50IGNU
aHVtYkhlaWdodCA9IDE3Oworc3RhdGljIGludCBjVGh1bWJNaW5MZW5ndGggPSAyNjsKKworc3Rh
dGljIEhBTkRMRSBjU2Nyb2xsQmFyVGhlbWUgPSAwOwogCi1TT0ZUX0xJTksoU2FmYXJpVGhlbWUs
IHBhaW50VGhlbWVQYXJ0LCB2b2lkLCBfX3N0ZGNhbGwsIChUaGVtZVBhcnQgcGFydCwgQ0dDb250
ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENHUmVjdCYgcmVjdCwgTlNDb250cm9sU2l6ZSBzaXplLCBU
aGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSksIChwYXJ0LCBjb250ZXh0LCByZWN0LCBzaXplLCBzdGF0
ZSkpCisvLyBGSVhNRTogIFJlZmFjdG9yIHRoZSBzb2Z0LWxpbmtpbmcgY29kZSBzbyB0aGF0IGl0
IGNhbiBiZSBzaGFyZWQgd2l0aCBSZW5kZXJUaGVtZVdpbgorU09GVF9MSU5LX0xJQlJBUlkodXh0
aGVtZSkKK1NPRlRfTElOSyh1eHRoZW1lLCBPcGVuVGhlbWVEYXRhLCBIQU5ETEUsIFdJTkFQSSwg
KEhXTkQgaHduZCwgTFBDV1NUUiBwc3pDbGFzc0xpc3QpLCAoaHduZCwgcHN6Q2xhc3NMaXN0KSkK
K1NPRlRfTElOSyh1eHRoZW1lLCBDbG9zZVRoZW1lRGF0YSwgSFJFU1VMVCwgV0lOQVBJLCAoSEFO
RExFIGhUaGVtZSksIChoVGhlbWUpKQorU09GVF9MSU5LKHV4dGhlbWUsIERyYXdUaGVtZUJhY2tn
cm91bmQsIEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFy
dElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0IFJFQ1QqIHBSZWN0LCBjb25zdCBSRUNUKiBwQ2xpcFJl
Y3QpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgcENsaXBSZWN0KSkK
K1NPRlRfTElOSyh1eHRoZW1lLCBEcmF3VGhlbWVFZGdlLCBIUkVTVUxULCBXSU5BUEksIChIQU5E
TEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNU
KiBwUmVjdCwgdW5zaWduZWQgdUVkZ2UsIHVuc2lnbmVkIHVGbGFncywgY29uc3QgUkVDVCogcENs
aXBSZWN0KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgcFJlY3QsIHVFZGdlLCB1
RmxhZ3MsIHBDbGlwUmVjdCkpCitTT0ZUX0xJTksodXh0aGVtZSwgR2V0VGhlbWVDb250ZW50UmVj
dCwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQs
IGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCogcFJlY3QsIGNvbnN0IFJFQ1QqIHBDb250ZW50UmVj
dCksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRlSWQsIHBSZWN0LCBwQ29udGVudFJlY3Qp
KQorU09GVF9MSU5LKHV4dGhlbWUsIEdldFRoZW1lUGFydFNpemUsIEhSRVNVTFQsIFdJTkFQSSwg
KEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIFJFQ1Qq
IHBSZWN0LCBpbnQgdHMsIFNJWkUqIHBzeiksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRl
SWQsIHBSZWN0LCB0cywgcHN6KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZVN5c0ZvbnQs
IEhSRVNVTFQsIFdJTkFQSSwgKEhBTkRMRSBoVGhlbWUsIGludCBpRm9udElkLCBPVVQgTE9HRk9O
VCogcEZvbnQpLCAoaFRoZW1lLCBpRm9udElkLCBwRm9udCkpCitTT0ZUX0xJTksodXh0aGVtZSwg
R2V0VGhlbWVDb2xvciwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywg
aW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgaW50IGlQcm9wSWQsIE9VVCBDT0xPUlJFRiogcENv
bG9yKSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgaVByb3BJZCwgcENvbG9yKSkK
Kworc3RhdGljIHZvaWQgY2hlY2tBbmRJbml0U2Nyb2xsYmFyVGhlbWUoKQoreworICAgIGlmICh1
eHRoZW1lTGlicmFyeSgpICYmICFjU2Nyb2xsQmFyVGhlbWUpCisgICAgICAgIGNTY3JvbGxCYXJU
aGVtZSA9IE9wZW5UaGVtZURhdGEoMCwgTCJTY3JvbGxiYXIiKTsKK30KKworLy8gTWF5IG5lZWQg
dG8gYWRkIHN0dWZmIHRvIHRoZXNlIGxhdGVyLCBzbyBrZWVwIHRoZSBncmFwaGljcyBjb250ZXh0
IHJldHJpZXZhbC9yZWxlYXNlIGluIHNvbWUgaGVscGVycy4KK3N0YXRpYyBIREMgcHJlcGFyZUZv
ckRyYXdpbmcoR3JhcGhpY3NDb250ZXh0KiBnLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIHJl
dHVybiBnLT5nZXRXaW5kb3dzQ29udGV4dChyKTsKK30KKyAKK3N0YXRpYyB2b2lkIGRvbmVEcmF3
aW5nKEdyYXBoaWNzQ29udGV4dCogZywgSERDIGhkYywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAg
ICBnLT5yZWxlYXNlV2luZG93c0NvbnRleHQoaGRjLCByKTsKK30KKy8vIEVuZCBDb3BpZWQgZnJv
bSBSZW5kZXJUaGVtZVdpbgogCiBjb25zdCBkb3VibGUgY0luaXRpYWxUaW1lckRlbGF5ID0gMC4y
NTsKIGNvbnN0IGRvdWJsZSBjTm9ybWFsVGltZXJEZWxheSA9IDAuMDU7CiAKIFBsYXRmb3JtU2Ny
b2xsYmFyOjpQbGF0Zm9ybVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqIGNsaWVudCwgU2Nyb2xs
YmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIHNpemUpCi0g
ICAgOiBTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6ZSksIG1faG92ZXJlZFBhcnQo
Tm9QYXJ0KSwgbV9wcmVzc2VkUGFydChOb1BhcnQpLCBtX3ByZXNzZWRQb3MoMCksCi0gICAgICBt
X3Njcm9sbFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmly
ZWQpLAotICAgICAgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCisgICAgOiBTY3JvbGxiYXIoY2xp
ZW50LCBvcmllbnRhdGlvbiwgc2l6ZSkKKyAgICAsIG1faG92ZXJlZFBhcnQoTm9QYXJ0KQorICAg
ICwgbV9wcmVzc2VkUGFydChOb1BhcnQpCisgICAgLCBtX3ByZXNzZWRQb3MoMCkKKyAgICAsIG1f
c2Nyb2xsVGltZXIodGhpcywgJlBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJl
ZCkKKyAgICAsIG1fb3ZlcmxhcHNSZXNpemVyKGZhbHNlKQorICAgICwgbV9CdXR0b25MZW5ndGgg
KDE0KQogewogICAgIC8vIE9idGFpbiB0aGUgY29ycmVjdCBzY3JvbGxiYXIgc2l6ZXMgZnJvbSB0
aGUgc3lzdGVtLgotICAgIGlmICghY0hvcml6b250YWxXaWR0aCkgewotICAgICAgICAvLyBGSVhN
RTogR2V0IG1ldGljcyBmcm9tIFNhZmFyaVRoZW1lCi0gICAgfQorICAgIGNIb3Jpem9udGFsSGVp
Z2h0ID0gOjpHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZSFNDUk9MTCk7CisgICAgY0hvcml6b250YWxX
aWR0aCA9IDo6R2V0U3lzdGVtTWV0cmljcyhTTV9DWEhTQ1JPTEwpOworICAgIGNWZXJ0aWNhbEhl
aWdodCA9IDo6R2V0U3lzdGVtTWV0cmljcyhTTV9DWVZTQ1JPTEwpOworICAgIGNWZXJ0aWNhbFdp
ZHRoID0gOjpHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVlNDUk9MTCk7CisgICAgY1RodW1iV2lkdGgg
PSA6OkdldFN5c3RlbU1ldHJpY3MoU01fQ1hIVEhVTUIpOworICAgIGNUaHVtYkhlaWdodCA9IDo6
R2V0U3lzdGVtTWV0cmljcyhTTV9DWVZUSFVNQik7CisKKyAgICBtX0J1dHRvbkxlbmd0aCA9IDo6
R2V0U3lzdGVtTWV0cmljcygob3JpZW50YXRpb24gPT0gVmVydGljYWxTY3JvbGxiYXIpID8gU01f
Q1lWU0NST0xMIDogU01fQ1hIU0NST0xMKTsKIAogICAgIGlmIChvcmllbnRhdGlvbiA9PSBWZXJ0
aWNhbFNjcm9sbGJhcikKLSAgICAgICAgc2V0RnJhbWVHZW9tZXRyeShJbnRSZWN0KDAsIDAsIGNW
ZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxIZWlnaHRbY29udHJvbFNpemUo
KV0pKTsKKyAgICAgICAgc2V0RnJhbWVHZW9tZXRyeShJbnRSZWN0KDAsIDAsIGNWZXJ0aWNhbFdp
ZHRoLCBjVmVydGljYWxIZWlnaHQpKTsKICAgICBlbHNlCi0gICAgICAgIHNldEZyYW1lR2VvbWV0
cnkoSW50UmVjdCgwLCAwLCBjSG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpv
bnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSkpOworICAgICAgICBzZXRGcmFtZUdlb21ldHJ5KElu
dFJlY3QoMCwgMCwgY0hvcml6b250YWxXaWR0aCwgY0hvcml6b250YWxIZWlnaHQpKTsKIH0KIAog
UGxhdGZvcm1TY3JvbGxiYXI6On5QbGF0Zm9ybVNjcm9sbGJhcigpCkBAIC0xMDYsMTEgKzE1OSwx
MyBAQCB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp1cGRhdGVUaHVtYlByb3BvCiAKIHN0YXRpYyBJ
bnRSZWN0IHRyYWNrUmVwYWludFJlY3QoY29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBTY3JvbGxi
YXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNp
emUpCiB7CisgICAgY29uc3QgaW50IGNCdXR0b25MZW5ndGggPSA6OkdldFN5c3RlbU1ldHJpY3Mo
KG9yaWVudGF0aW9uID09IFZlcnRpY2FsU2Nyb2xsYmFyKSA/IFNNX0NZVlNDUk9MTCA6IFNNX0NY
SFNDUk9MTCk7CisKICAgICBJbnRSZWN0IHBhaW50UmVjdCh0cmFja1JlY3QpOwogICAgIGlmIChv
cmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQotICAgICAgICBwYWludFJlY3QuaW5m
bGF0ZVgoY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBwYWludFJlY3QuaW5m
bGF0ZVgoY0J1dHRvbkxlbmd0aCk7CiAgICAgZWxzZQotICAgICAgICBwYWludFJlY3QuaW5mbGF0
ZVkoY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBwYWludFJlY3QuaW5mbGF0
ZVkoY0J1dHRvbkxlbmd0aCk7CiAKICAgICByZXR1cm4gcGFpbnRSZWN0OwogfQpAQCAtMTE5LDEz
ICsxNzQsMTMgQEAgc3RhdGljIEludFJlY3QgYnV0dG9uUmVwYWludFJlY3QoY29uc3QgSQogewog
ICAgIEludFJlY3QgcGFpbnRSZWN0KGJ1dHRvblJlY3QpOwogICAgIGlmIChvcmllbnRhdGlvbiA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7Ci0gICAgICAgIHBhaW50UmVjdC5zZXRXaWR0aChjUmVh
bEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBwYWludFJlY3Quc2V0V2lkdGgo
Y1JlYWxCdXR0b25MZW5ndGgpOwogICAgICAgICBpZiAoIXN0YXJ0KQotICAgICAgICAgICAgcGFp
bnRSZWN0LnNldFgoYnV0dG9uUmVjdC54KCkgLSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNp
emVdIC0gYnV0dG9uUmVjdC53aWR0aCgpKSk7CisgICAgICAgICAgICBwYWludFJlY3Quc2V0WChi
dXR0b25SZWN0LngoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aCAtIGJ1dHRvblJlY3Qud2lkdGgoKSkp
OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhaW50UmVjdC5zZXRIZWlnaHQoY1JlYWxCdXR0b25M
ZW5ndGhbY29udHJvbFNpemVdKTsKKyAgICAgICAgcGFpbnRSZWN0LnNldEhlaWdodChjUmVhbEJ1
dHRvbkxlbmd0aCk7CiAgICAgICAgIGlmICghc3RhcnQpCi0gICAgICAgICAgICBwYWludFJlY3Qu
c2V0WShidXR0b25SZWN0LnkoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBi
dXR0b25SZWN0LmhlaWdodCgpKSk7CisgICAgICAgICAgICBwYWludFJlY3Quc2V0WShidXR0b25S
ZWN0LnkoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aCAtIGJ1dHRvblJlY3QuaGVpZ2h0KCkpKTsKICAg
ICB9CiAKICAgICByZXR1cm4gcGFpbnRSZWN0OwpAQCAtMjU3LDEyICszMTIsMTIgQEAgdm9pZCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnQoR3JhcGhpY3NDbwogCiBib29sIFBsYXRmb3JtU2Nyb2xs
YmFyOjpoYXNCdXR0b25zKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYgKG1f
b3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IHdpZHRoKCkgOiBoZWlnaHQoKSkg
Pj0gMiAqIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSAtIGNCdXR0b25IaXRJbnNl
dFtjb250cm9sU2l6ZSgpXSk7CisgICAgcmV0dXJuIGlzRW5hYmxlZCgpICYmIChtX29yaWVudGF0
aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyB3aWR0aCgpIDogaGVpZ2h0KCkpID49IDIgKiAo
Y1JlYWxCdXR0b25MZW5ndGggLSBjQnV0dG9uSGl0SW5zZXQpOwogfQogCiBib29sIFBsYXRmb3Jt
U2Nyb2xsYmFyOjpoYXNUaHVtYigpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzRW5hYmxlZCgpICYm
IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyB3aWR0aCgpIDogaGVpZ2h0
KCkpID49IDIgKiBjQnV0dG9uSW5zZXRbY29udHJvbFNpemUoKV0gKyBjVGh1bWJNaW5MZW5ndGhb
Y29udHJvbFNpemUoKV0gKyAxOworICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAobV9vcmllbnRh
dGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgpKSA+PSAyICog
Y0J1dHRvbkluc2V0ICsgY1RodW1iTWluTGVuZ3RoICsgMTsKIH0KIAogSW50UmVjdCBQbGF0Zm9y
bVNjcm9sbGJhcjo6YmFja0J1dHRvblJlY3QoKSBjb25zdApAQCAtMjczLDggKzMyOCw4IEBAIElu
dFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmJhY2tCdXR0b25SZWMKICAgICAvLyB3ZSBoYXZlIDwg
MzQgcGl4ZWxzIGxlZnQuICBUaGlzIGFsbG93cyB0aGUgc2Nyb2xsYmFyCiAgICAgLy8gdG8gc2Nh
bGUgZG93biBhbmQgZnVuY3Rpb24gZXZlbiBhdCB0aW55IHNpemVzLgogICAgIGlmIChtX29yaWVu
dGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCi0gICAgICAgIHJldHVybiBJbnRSZWN0KHgo
KSwgeSgpLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtj
b250cm9sU2l6ZSgpXSk7Ci0gICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdp
ZHRoW2NvbnRyb2xTaXplKCldLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldKTsKKyAgICAg
ICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIG1fQnV0dG9uTGVuZ3RoLCBjSG9yaXpvbnRhbEhl
aWdodCk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdpZHRoLCBtX0J1
dHRvbkxlbmd0aCk7CiB9CiAKIEludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmZvcndhcmRCdXR0
b25SZWN0KCkgY29uc3QKQEAgLTI4NiwyMSArMzQxLDIxIEBAIEludFJlY3QgUGxhdGZvcm1TY3Jv
bGxiYXI6OmZvcndhcmRCdXR0b24KICAgICAvLyB0byBzY2FsZSBkb3duIGFuZCBmdW5jdGlvbiBl
dmVuIGF0IHRpbnkgc2l6ZXMuCiAKICAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyKQotICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyB3aWR0aCgpIC0gY0J1dHRv
bkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgeSgpLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCld
LCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7Ci0gICAgcmV0dXJuIEludFJlY3Qo
eCgpLCB5KCkgKyBoZWlnaHQoKSAtIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNWZXJ0
aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldKTsK
KyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpICsgd2lkdGgoKSAtIG1fQnV0dG9uTGVuZ3RoLCB5
KCksIG1fQnV0dG9uTGVuZ3RoLCBjSG9yaXpvbnRhbEhlaWdodCk7CisgICAgcmV0dXJuIEludFJl
Y3QoeCgpLCB5KCkgKyBoZWlnaHQoKSAtIG1fQnV0dG9uTGVuZ3RoLCBjVmVydGljYWxXaWR0aCwg
bV9CdXR0b25MZW5ndGgpOwogfQogCiBJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp0cmFja1Jl
Y3QoKSBjb25zdAogewogICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxi
YXIpIHsKICAgICAgICAgaWYgKCFoYXNCdXR0b25zKCkpCi0gICAgICAgICAgICByZXR1cm4gSW50
UmVjdCh4KCksIHkoKSwgd2lkdGgoKSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0p
OwotICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXpl
KCldLCB5KCksIHdpZHRoKCkgLSAyICogY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY0hv
cml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOworICAgICAgICAgICAgcmV0dXJuIEludFJl
Y3QoeCgpLCB5KCksIHdpZHRoKCksIGNIb3Jpem9udGFsSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJu
IEludFJlY3QoeCgpICsgbV9CdXR0b25MZW5ndGgsIHkoKSwgd2lkdGgoKSAtIDIgKiBtX0J1dHRv
bkxlbmd0aCwgY0hvcml6b250YWxIZWlnaHQpOwogICAgIH0KIAogICAgIGlmICghaGFzQnV0dG9u
cygpKQotICAgICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgY1ZlcnRpY2FsV2lkdGhbY29u
dHJvbFNpemUoKV0sIGhlaWdodCgpKTsKLSAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSArIGNC
dXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCld
LCBoZWlnaHQoKSAtIDIgKiBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldKTsKKyAgICAgICAg
cmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNWZXJ0aWNhbFdpZHRoLCBoZWlnaHQoKSk7CisgICAg
cmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyBtX0J1dHRvbkxlbmd0aCwgY1ZlcnRpY2FsV2lkdGgs
IGhlaWdodCgpIC0gMiAqIG1fQnV0dG9uTGVuZ3RoKTsKIH0KIAogSW50UmVjdCBQbGF0Zm9ybVNj
cm9sbGJhcjo6dGh1bWJSZWN0KCkgY29uc3QKQEAgLTMxMCwxNyArMzY1LDIyIEBAIEludFJlY3Qg
UGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUmVjdCgpIGMKICAgICByZXR1cm4gdGh1bWJSZWN0Owog
fQogCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVyUmVjdChjb25zdCBJbnRSZWN0
JiB0aHVtYlJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwogdm9pZCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6c3BsaXRUcmFjayhjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIElu
dFJlY3QmIGJlZm9yZVRodW1iUmVjdCwgSW50UmVjdCYgdGh1bWJSZWN0LCBJbnRSZWN0JiBhZnRl
clRodW1iUmVjdCkgY29uc3QKIHsKICAgICAvLyBUaGlzIGZ1bmN0aW9uIHdvbid0IGV2ZW4gZ2V0
IGNhbGxlZCB1bmxlc3Mgd2UncmUgYmlnIGVub3VnaCB0byBoYXZlIHNvbWUgY29tYmluYXRpb24g
b2YgdGhlc2UgdGhyZWUgcmVjdHMgd2hlcmUgYXQgbGVhc3QKICAgICAvLyBvbmUgb2YgdGhlbSBp
cyBub24tZW1wdHkuCiAgICAgaW50IHRodW1iUG9zID0gdGh1bWJQb3NpdGlvbigpOwogICAgIGlm
IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKLSAgICAgICAgdGh1bWJS
ZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpICsgdGh1bWJQb3MsIHRyYWNrUmVjdC55KCkgKyAo
dHJhY2tSZWN0LmhlaWdodCgpIC0gY1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCldKSAvIDIsIHRo
dW1iTGVuZ3RoKCksIGNUaHVtYkhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgICAgIHRodW1i
UmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSArIHRodW1iUG9zLCB0cmFja1JlY3QueSgpICsg
KHRyYWNrUmVjdC5oZWlnaHQoKSAtIGNUaHVtYkhlaWdodCkgLyAyLCB0aHVtYkxlbmd0aCgpLCBj
VGh1bWJIZWlnaHQpOwogICAgICAgICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVj
dC54KCksIHRyYWNrUmVjdC55KCksIHRodW1iUG9zLCB0cmFja1JlY3QuaGVpZ2h0KCkpOwogICAg
ICAgICBhZnRlclRodW1iUmVjdCA9IEludFJlY3QodGh1bWJSZWN0LngoKSArIHRodW1iUmVjdC53
aWR0aCgpLCB0cmFja1JlY3QueSgpLCB0cmFja1JlY3QucmlnaHQoKSAtIHRodW1iUmVjdC5yaWdo
dCgpLCB0cmFja1JlY3QuaGVpZ2h0KCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHRodW1iUmVj
dCA9IEludFJlY3QodHJhY2tSZWN0LngoKSArICh0cmFja1JlY3Qud2lkdGgoKSAtIGNUaHVtYldp
ZHRoW2NvbnRyb2xTaXplKCldKSAvIDIsIHRyYWNrUmVjdC55KCkgKyB0aHVtYlBvcywgY1RodW1i
V2lkdGhbY29udHJvbFNpemUoKV0sIHRodW1iTGVuZ3RoKCkpOworICAgICAgICB0aHVtYlJlY3Qg
PSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyAodHJhY2tSZWN0LndpZHRoKCkgLSBjVGh1bWJXaWR0
aCkgLyAyLCB0cmFja1JlY3QueSgpICsgdGh1bWJQb3MsIGNUaHVtYldpZHRoLCB0aHVtYkxlbmd0
aCgpKTsKICAgICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0
cmFja1JlY3QueSgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdGh1bWJQb3MpOwogICAgICAgICBhZnRl
clRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwgdGh1bWJSZWN0LnkoKSArIHRodW1i
UmVjdC5oZWlnaHQoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRyYWNrUmVjdC5ib3R0b20oKSAtIHRo
dW1iUmVjdC5ib3R0b20oKSk7CiAgICAgfQpAQCAtMzQxLDcgKzQwMSw3IEBAIGludCBQbGF0Zm9y
bVNjcm9sbGJhcjo6dGh1bWJMZW5ndGgoKSBjb24KICAgICBmbG9hdCBwcm9wb3J0aW9uID0gKGZs
b2F0KShtX3Zpc2libGVTaXplKSAvIG1fdG90YWxTaXplOwogICAgIGludCB0cmFja0xlbiA9IHRy
YWNrTGVuZ3RoKCk7CiAgICAgaW50IGxlbmd0aCA9IHByb3BvcnRpb24gKiB0cmFja0xlbjsKLSAg
ICBpbnQgbWluTGVuZ3RoID0gY1RodW1iTWluTGVuZ3RoW2NvbnRyb2xTaXplKCldOworICAgIGlu
dCBtaW5MZW5ndGggPSBjVGh1bWJNaW5MZW5ndGg7CiAgICAgbGVuZ3RoID0gbWF4KGxlbmd0aCwg
bWluTGVuZ3RoKTsKICAgICBpZiAobGVuZ3RoID4gdHJhY2tMZW4pCiAgICAgICAgIGxlbmd0aCA9
IDA7IC8vIE9uY2UgdGhlIHRodW1iIGlzIGJlbG93IHRoZSB0cmFjayBsZW5ndGgsIGl0IGp1c3Qg
Z29lcyBhd2F5ICh0byBtYWtlIG1vcmUgcm9vbSBmb3IgdGhlIHRyYWNrKS4KQEAgLTM1NSw2OCAr
NDE1LDEyNiBAQCBpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrTGVuZ3RoKCkgY29uCiAKIHZv
aWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdl
UmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIVNhZmFyaVRoZW1lTGlicmFyeSgpKQotICAgICAgICBy
ZXR1cm47Ci0KICAgICBJbnRSZWN0IHBhaW50UmVjdCA9IGJ1dHRvblJlcGFpbnRSZWN0KHJlY3Qs
IG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCksIHN0YXJ0KTsKICAgICAKICAgICBpZiAoIWRh
bWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQogICAgICAgICByZXR1cm47CiAKLSAgICBU
aGVtZVBhcnQgcGFydDsKLSAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7Ci0gICAgaWYg
KG1fY2xpZW50LT5pc0FjdGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKLSAg
ICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQotICAgICAgICBwYXJ0
ID0gc3RhcnQgPyBTY3JvbGxMZWZ0QXJyb3dQYXJ0IDogU2Nyb2xsUmlnaHRBcnJvd1BhcnQ7Ci0g
ICAgZWxzZQotICAgICAgICBwYXJ0ID0gc3RhcnQgPyBTY3JvbGxVcEFycm93UGFydCA6IFNjcm9s
bERvd25BcnJvd1BhcnQ7CisgICAgdW5zaWduZWQgcGFydCA9IDA7CisgICAgdW5zaWduZWQgc3Rh
dGUgPSAwOworICAgIHVuc2lnbmVkIGNsYXNzaWNQYXJ0ID0gMDsKKyAgICB1bnNpZ25lZCBjbGFz
c2ljU3RhdGUgPSAwOwogCi0gICAgaWYgKGlzRW5hYmxlZCgpKQotICAgICAgICBzdGF0ZSB8PSBF
bmFibGVkU3RhdGU7Ci0gICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0ICYm
IHN0YXJ0KQotICAgICAgICB8fCAobV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkQnV0dG9uUGFydCAm
JiAhc3RhcnQpKQotICAgICAgICBzdGF0ZSB8PSBQcmVzc2VkU3RhdGU7CisgICAgaWYgKG1fb3Jp
ZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgIHN0YXRlID0gc3RhcnQg
PyBBQlNfTEVGVE5PUk1BTCA6IEFCU19SSUdIVE5PUk1BTDsKKyAgICAgICBjbGFzc2ljUGFydCA9
IHN0YXJ0ID8gREZDU19TQ1JPTExMRUZUIDogREZDU19TQ1JPTExSSUdIVDsKKyAgICB9IGVsc2Ug
eworICAgICAgIHN0YXRlID0gc3RhcnQgPyBBQlNfVVBOT1JNQUwgOiBBQlNfRE9XTk5PUk1BTDsK
KyAgICAgICBjbGFzc2ljUGFydCA9IHN0YXJ0ID8gREZDU19TQ1JPTExVUCA6IERGQ1NfU0NST0xM
RE9XTjsKKyAgICB9CisKKyAgICBpZiAoIWlzRW5hYmxlZCgpKSB7CisgICAgICAgIHN0YXRlICs9
IFNQX0FCU19ESVNBQkxFX01PRElGSUVSOworICAgICAgICBjbGFzc2ljU3RhdGUgfD0gREZDU19J
TkFDVElWRTsKKyAgICB9IGVsc2UgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0
ICYmIHN0YXJ0KQorICAgICAgICAgICAgfHwgKG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRv
blBhcnQgJiYgIXN0YXJ0KSkgeworICAgICAgICBzdGF0ZSArPSBTUF9BQlNfUFJFU1NFRF9NT0RJ
RklFUjsKKyAgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfUFVTSEVEIHwgREZDU19GTEFUOwor
ICAgIH0gZWxzZSBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpIHsKKyAgICAgICBzdGF0ZSArPSBT
UF9BQlNfSE9UX01PRElGSUVSOworICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0hPVDsKKyAg
ICB9CisKKyAgICBIREMgaGRjID0gcHJlcGFyZUZvckRyYXdpbmcoY29udGV4dCwgcmVjdCk7Cisg
ICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBjaGVja0FuZEluaXRTY3JvbGxiYXJUaGVt
ZSgpOworCisgICAgaWYgKGNTY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgRHJhd1RoZW1lQmFja2dy
b3VuZChjU2Nyb2xsQmFyVGhlbWUsIGhkYywgU1BfQlVUVE9OLCBzdGF0ZSwgJndpZGdldFJlY3Qs
IE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgRHJhd0ZyYW1lQ29udHJvbChoZGMsICZ3aWRnZXRS
ZWN0LCBjbGFzc2ljUGFydCwgY2xhc3NpY1N0YXRlKTsKIAotICAgIHBhaW50VGhlbWVQYXJ0KHBh
cnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNvbnRyb2xTaXplKCkg
PT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1JlZ3VsYXJDb250cm9s
U2l6ZSwgc3RhdGUpOworICAgIGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcmVjdCk7CiB9CiAK
IHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VHJhY2soR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1h
Z2VSZWN0KSBjb25zdAogewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCi0gICAgICAg
IHJldHVybjsKLQogICAgIEludFJlY3QgcGFpbnRSZWN0ID0gaGFzQnV0dG9ucygpID8gdHJhY2tS
ZXBhaW50UmVjdChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpKSA6IHJlY3Q7CiAg
ICAgCiAgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKICAgICAgICAg
cmV0dXJuOwogCi0gICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250
YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVHJhY2tQYXJ0IDogVlNjcm9sbFRyYWNrUGFydDsKLSAgICBU
aGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgdW5zaWduZWQgcGFydCA9IDA7CisgICAg
dW5zaWduZWQgY2xhc3NpY1BhcnQgPSBERkNfU0NST0xMOworICAgIGlmIChtX29yaWVudGF0aW9u
ID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgcGFydCA9IHN0YXJ0ID8gU1BfVFJBQ0tT
VEFSVEhPUiA6IFNQX1RSQUNLRU5ESE9SOworICAgIGVsc2UKKyAgICAgICBwYXJ0ID0gc3RhcnQg
PyBTUF9UUkFDS1NUQVJUVkVSVCA6IFNQX1RSQUNLRU5EVkVSVDsKKworICAgIHVuc2lnbmVkIHN0
YXRlID0gVFNfRElTQUJMRUQ7CisgICAgdW5zaWduZWQgY2xhc3NpY1N0YXRlID0gREZDU19NT05P
OwogICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKLSAgICAgICAgc3RhdGUgfD0gQWN0aXZl
U3RhdGU7CisgICAgICAgIHN0YXRlIHw9IFRTX0FDVElWRTsKKyAgICBlbHNlCisgICAgICAgY2xh
c3NpY1N0YXRlIHw9IERGQ1NfSU5BQ1RJVkU7CisKICAgICBpZiAoaGFzQnV0dG9ucygpKQotICAg
ICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisgICAgICAgIHN0YXRlIHw9IFRTX05PUk1BTDsK
KworICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByZWN0KTsKKyAgICBS
RUNUIHdpZGdldFJlY3QgPSByZWN0OworICAgIGNoZWNrQW5kSW5pdFNjcm9sbGJhclRoZW1lKCk7
CiAKLSAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwg
cGFpbnRSZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Nyb2xsYmFyID8gTlNTbWFsbENvbnRy
b2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRlKTsKKyAgICBpZiAoY1Njcm9sbEJh
clRoZW1lKQorICAgICAgICBEcmF3VGhlbWVCYWNrZ3JvdW5kKGNTY3JvbGxCYXJUaGVtZSwgaGRj
LCBwYXJ0LCBzdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgRHJh
d0ZyYW1lQ29udHJvbChoZGMsICZ3aWRnZXRSZWN0LCBERkNfU0NST0xMLCBjbGFzc2ljU3RhdGUp
OworCisgICAgZG9uZURyYXdpbmcoY29udGV4dCwgaGRjLCByZWN0KTsKIH0KIAogdm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0
IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0CiB7Ci0gICAg
aWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgaWYgKCFk
YW1hZ2VSZWN0LmludGVyc2VjdHMocmVjdCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIFRoZW1l
UGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gSFNjcm9s
bFRodW1iUGFydCA6IFZTY3JvbGxUaHVtYlBhcnQ7Ci0gICAgVGhlbWVDb250cm9sU3RhdGUgc3Rh
dGUgPSAwOworICAgIHVuc2lnbmVkIHBhcnQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyKSA/IFNQX1RIVU1CSE9SIDogU1BfVEhVTUJWRVJUOworICAgIHVuc2lnbmVkIHN0
YXRlID0gMDsKKworICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAgIHN0YXRlICs9IFNQX0FC
U19ESVNBQkxFX01PRElGSUVSOworICAgIGVsc2UgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQor
ICAgICAgIHN0YXRlICs9IFNQX0FCU19IT1RfTU9ESUZJRVI7CisKKyAgICBIREMgaGRjID0gcHJl
cGFyZUZvckRyYXdpbmcoY29udGV4dCwgcmVjdCk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVj
dDsKKyAgICBjaGVja0FuZEluaXRTY3JvbGxiYXJUaGVtZSgpOworCisgICAgaWYgKGNTY3JvbGxC
YXJUaGVtZSkgeworICAgICAgICBEcmF3VGhlbWVCYWNrZ3JvdW5kKGNTY3JvbGxCYXJUaGVtZSwg
aGRjLCBwYXJ0LCBzdGF0ZSwgJndpZGdldFJlY3QsIE5VTEwpOworICAgICAgICBwYWludEdyaXBw
ZXIoaGRjLCB3aWRnZXRSZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBIR0RJT0JKIGhTYXZl
QnJ1c2ggPSBTZWxlY3RPYmplY3QoaGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0Up
KTsKKyAgICAgICAgRHJhd0VkZ2UoaGRjLCAmd2lkZ2V0UmVjdCwgRURHRV9SQUlTRUQsIEJGX1JF
Q1QpOworICAgICAgICBTZWxlY3RPYmplY3QoaGRjLGhTYXZlQnJ1c2gpOworICAgIH0KKworICAg
IGRvbmVEcmF3aW5nKGNvbnRleHQsIGhkYywgcmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3Jv
bGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAor
eworICAgIHVuc2lnbmVkIHBhcnQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyKSA/IFNQX0dSSVBQRVJIT1IgOiBTUF9HUklQUEVSVkVSVDsKKyAgICB1bnNpZ25lZCBzdGF0
ZSA9IDA7CisKICAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9
IEFjdGl2ZVN0YXRlOwotICAgIGlmIChpc0VuYWJsZWQoKSkKLSAgICAgICAgc3RhdGUgfD0gRW5h
YmxlZFN0YXRlOworICAgICAgICBzdGF0ZSB8PSBUU19BQ1RJVkU7CiAKLSAgICBwYWludFRoZW1l
UGFydChwYXJ0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29udHJvbFNpemUo
KSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRy
b2xTaXplLCBzdGF0ZSk7CisgICAgUkVDVCB3aWRnZXRSZWN0ID0gcmVjdDsKKyAgICBjaGVja0Fu
ZEluaXRTY3JvbGxiYXJUaGVtZSgpOworCisgICAgaWYgKGNTY3JvbGxCYXJUaGVtZSkKKyAgICAg
ICAgRHJhd1RoZW1lQmFja2dyb3VuZChjU2Nyb2xsQmFyVGhlbWUsIGhkYywgcGFydCwgc3RhdGUs
ICZ3aWRnZXRSZWN0LCBOVUxMKTsKIH0KIAogU2Nyb2xsYmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJh
cjo6aGl0VGVzdChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKQEAgLTQ0OCw2ICs1NjYs
NyBAQCBTY3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0CiAgICAgICAgICAg
ICByZXR1cm4gVGh1bWJQYXJ0OwogICAgICAgICByZXR1cm4gRm9yd2FyZFRyYWNrUGFydDsKICAg
ICB9CisKICAgICByZXR1cm4gTm9QYXJ0OwogfQogCkBAIC00NzYsNyArNTk1LDcgQEAgYm9vbCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VNb3ZlRQogICAgICAgICAgICAgc2V0VmFsdWUo
KGZsb2F0KSh0aHVtYlBvcyArIGRlbHRhKSAqIChtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUp
IC8gKHRyYWNrTGVuIC0gdGh1bWJMZW4pKTsKICAgICAgICAgICAgIG1fcHJlc3NlZFBvcyArPSB0
aHVtYlBvc2l0aW9uKCkgLSB0aHVtYlBvczsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAg
ICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTYyNSwzMCArNzQ0LDIzIEBAIGJvb2wgUGxhdGZv
cm1TY3JvbGxiYXI6OnRodW1iVW5kZXJNb3VzZSgKIAogaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjpo
b3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0KFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXpl
KQogewotICAgIHJldHVybiBjSG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplXTsKKyAgICByZXR1
cm4gY0hvcml6b250YWxXaWR0aDsKIH0KIAogaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp2ZXJ0aWNh
bFNjcm9sbGJhcldpZHRoKFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXplKQogewotICAg
IHJldHVybiBjVmVydGljYWxIZWlnaHRbY29udHJvbFNpemVdOworICAgIHJldHVybiBjVmVydGlj
YWxIZWlnaHQ7CiB9CiAKIEludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OndpbmRvd0NsaXBSZWN0
KCkgY29uc3QKIHsKICAgICBJbnRSZWN0IGNsaXBSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgp
KTsKKwogICAgIGNsaXBSZWN0ID0gY29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhjbGlwUmVjdCk7
CiAgICAgaWYgKG1fY2xpZW50KQogICAgICAgICBjbGlwUmVjdC5pbnRlcnNlY3QobV9jbGllbnQt
PndpbmRvd0NsaXBSZWN0KCkpOwotICAgIHJldHVybiBjbGlwUmVjdDsKLX0KIAotdm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHJlY3Qp
IGNvbnN0Ci17Ci19Ci0KLUludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBwZXJSZWN0KGNv
bnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKLXsKLSAgICByZXR1cm4gSW50UmVjdCgpOwor
ICAgIHJldHVybiBjbGlwUmVjdDsKIH0KIAogdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVD
aGFuZ2VkKCkKQEAgLTY1Nyw0ICs3NjksMyBAQCB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVt
ZUNoYW5nZWQoKQogCiB9CiAKLSNlbmRpZiAvLyBkZWZpbmVkKFVTRV9TQUZBUklfVEhFTUUpCg==
</data>
<flag name="review"
          id="8503"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19452</attachid>
            <date>2008-02-29 11:09:59 -0800</date>
            <delta_ts>2008-02-29 12:42:32 -0800</delta_ts>
            <desc>Update revised based on Adam&apos;s comments</desc>
            <filename>WinScrollbars.patch</filename>
            <type>text/plain</type>
            <size>45813</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL3d0Zi9QbGF0Zm9ybS5oCShyZXZpc2lvbiAzMDYyNSkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9QbGF0Zm9ybS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTIsNiArMTEyLDkgQEAKICNk
ZWZpbmUgV1RGX1BMQVRGT1JNX0NBSVJPIDEKICNlbmRpZgogCisjaWYgUExBVEZPUk0oV0lOKSYm
IFBMQVRGT1JNKENHKQorI2RlZmluZSBXVEZfVVNFX1NBRkFSSV9USEVNRSAxCisjZW5kaWYKIAog
I2lmZGVmIF9fUzYwX18KIC8vIHdlIGFyZSBjcm9zcy1jb21waWxpbmcsIGl0IGlzIG5vdCByZWFs
bHkgd2luZG93cwpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDMwNjY3KQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtp
bmcgY29weSkKQEAgLTEsMyArMSwxNyBAQAorMjAwOC0wMi0yOSAgQnJlbnQgRnVsZ2hhbSA8YmZ1
bGdoYW1AZ21haWwuY29tPgorCisgICAgICAgIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTE3NDgzCisgICAgICAgIEltcGxlbWVudCBzY3JvbGxiYXJzIG9uIFdpbmRvd3Mg
KENhaXJvKQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFdBUk5JTkc6IE5PIFRFU1QgQ0FTRVMgQURERUQgT1IgQ0hBTkdFRAorCisgICAgICAgICogcGxh
dGZvcm0vd2luL1BsYXRmcm9tU2Nyb2xsQmFyV2luLmNwcDogIER1cGxpY2F0ZSBpbXBsZW1lbnRh
dGlvbgorICAgICAgICAgIGZyb20gUGxhdGZvcm1TY3JvbGxCYXJXaW5TYWZhcmkuY3BwLCB0aGVu
IG1vZGlmeSB0byB1c2UgdGhlCisgICAgICAgICAgbmF0aXZlIFdpbmRvd3MgdGhlbWUgZW5naW5l
LiAgVXNlIFNPRlRfTElOSy4gIFVzZSBwbGF0Zm9ybQorICAgICAgICAgICdHZXRTeXN0ZW1NZXRy
aWNzJyBjYWxsIHRvIGRlY2lkZSBzaXplIG9mIHNjcm9sbGJhcnMgYW5kIGJ1dHRvbnMuCisKIDIw
MDgtMDItMjkgIERhdmlkIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIDxyZGFy
Oi8vcHJvYmxlbS81NzU1OTE2PiBSRUdSRVNTSU9OOiBMb2FkaW5nIEhUTUw1IHNwZWMgaXMgNXgg
c2xvd2VyIG9uIFRPVCB0aGFuIGluIDMuMC40CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Q
bGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93
aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCShyZXZpc2lvbiAzMDQ1NikJKGZyb20gV2ViQ29y
ZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJTYWZhcmkuY3BwOjMwNDU2KQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZk
ZWYgVVNFX1NBRkFSSV9USEVNRSAKKworI2luY2x1ZGUgIlBsYXRmb3JtU2Nyb2xsQmFyLmgiCisK
KyNpbmNsdWRlICJFdmVudEhhbmRsZXIuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNs
dWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJTb2Z0
TGlua2luZy5oIgorCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorI2lu
Y2x1ZGUgPFNhZmFyaVRoZW1lL1NhZmFyaVRoZW1lLmg+CisKKy8vIEZJWE1FOiBUaGVyZSBhcmUg
cmVwYWludGluZyBwcm9ibGVtcyBkdWUgdG8gQXF1YSBzY3JvbGwgYmFyIGJ1dHRvbnMnIHZpc3Vh
bCBvdmVyZmxvdy4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCit1c2luZyBuYW1lc3BhY2UgU2FmYXJpVGhlbWU7CisKKy8vIEZJWE1FOiBXZSBzaG91bGQg
Z2V0IHRoZXNlIG51bWJlcnMgZnJvbSBTYWZhcmlUaGVtZQorc3RhdGljIGludCBjSG9yaXpvbnRh
bFdpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjSG9yaXpvbnRhbEhlaWdodFtdID0g
eyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsV2lkdGhbXSA9IHsgMTUsIDExIH07Citz
dGF0aWMgaW50IGNWZXJ0aWNhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1Jl
YWxCdXR0b25MZW5ndGhbXSA9IHsgMjgsIDIxIH07CitzdGF0aWMgaW50IGNCdXR0b25JbnNldFtd
ID0geyAxNCwgMTEgfTsKK3N0YXRpYyBpbnQgY0J1dHRvbkhpdEluc2V0W10gPSB7IDMsIDIgfTsK
Ky8vIGNSZWFsQnV0dG9uTGVuZ3RoIC0gY0J1dHRvbkluc2V0CitzdGF0aWMgaW50IGNCdXR0b25M
ZW5ndGhbXSA9IHsgMTQsIDEwIH07CitzdGF0aWMgaW50IGNUaHVtYldpZHRoW10gPSB7IDE1LCAx
MSB9Oworc3RhdGljIGludCBjVGh1bWJIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50
IGNUaHVtYk1pbkxlbmd0aFtdID0geyAyNiwgMjAgfTsKKworI2lmICFkZWZpbmVkKE5ERUJVRykg
JiYgZGVmaW5lZChVU0VfREVCVUdfU0FGQVJJX1RIRU1FKQorU09GVF9MSU5LX0RFQlVHX0xJQlJB
UlkoU2FmYXJpVGhlbWUpCisjZWxzZQorU09GVF9MSU5LX0xJQlJBUlkoU2FmYXJpVGhlbWUpCisj
ZW5kaWYKKworU09GVF9MSU5LKFNhZmFyaVRoZW1lLCBwYWludFRoZW1lUGFydCwgdm9pZCwgX19z
dGRjYWxsLCAoVGhlbWVQYXJ0IHBhcnQsIENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDR1Jl
Y3QmIHJlY3QsIE5TQ29udHJvbFNpemUgc2l6ZSwgVGhlbWVDb250cm9sU3RhdGUgc3RhdGUpLCAo
cGFydCwgY29udGV4dCwgcmVjdCwgc2l6ZSwgc3RhdGUpKQorCitjb25zdCBkb3VibGUgY0luaXRp
YWxUaW1lckRlbGF5ID0gMC4yNTsKK2NvbnN0IGRvdWJsZSBjTm9ybWFsVGltZXJEZWxheSA9IDAu
MDU7CisKK1BsYXRmb3JtU2Nyb2xsYmFyOjpQbGF0Zm9ybVNjcm9sbGJhcihTY3JvbGxiYXJDbGll
bnQqIGNsaWVudCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNv
bnRyb2xTaXplIHNpemUpCisgICAgOiBTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6
ZSksIG1faG92ZXJlZFBhcnQoTm9QYXJ0KSwgbV9wcmVzc2VkUGFydChOb1BhcnQpLCBtX3ByZXNz
ZWRQb3MoMCksCisgICAgICBtX3Njcm9sbFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6
YXV0b3Njcm9sbFRpbWVyRmlyZWQpLAorICAgICAgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCit7
CisgICAgLy8gT2J0YWluIHRoZSBjb3JyZWN0IHNjcm9sbGJhciBzaXplcyBmcm9tIHRoZSBzeXN0
ZW0uCisgICAgaWYgKCFjSG9yaXpvbnRhbFdpZHRoKSB7CisgICAgICAgIC8vIEZJWE1FOiBHZXQg
bWV0aWNzIGZyb20gU2FmYXJpVGhlbWUKKyAgICB9CisKKyAgICBpZiAob3JpZW50YXRpb24gPT0g
VmVydGljYWxTY3JvbGxiYXIpCisgICAgICAgIHNldEZyYW1lR2VvbWV0cnkoSW50UmVjdCgwLCAw
LCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsSGVpZ2h0W2NvbnRyb2xT
aXplKCldKSk7CisgICAgZWxzZQorICAgICAgICBzZXRGcmFtZUdlb21ldHJ5KEludFJlY3QoMCwg
MCwgY0hvcml6b250YWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29u
dHJvbFNpemUoKV0pKTsKK30KKworUGxhdGZvcm1TY3JvbGxiYXI6On5QbGF0Zm9ybVNjcm9sbGJh
cigpCit7CisgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9s
bGJhcjo6dXBkYXRlVGh1bWJQb3NpdGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRyYWNrKCk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRodW1iUHJvcG9ydGlvbigpCit7Cisg
ICAgaW52YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3N0YXRpYyBJbnRSZWN0IHRyYWNrUmVwYWludFJl
Y3QoY29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRh
dGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgSW50UmVjdCBw
YWludFJlY3QodHJhY2tSZWN0KTsKKyAgICBpZiAob3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNj
cm9sbGJhcikKKyAgICAgICAgcGFpbnRSZWN0LmluZmxhdGVYKGNCdXR0b25MZW5ndGhbY29udHJv
bFNpemVdKTsKKyAgICBlbHNlCisgICAgICAgIHBhaW50UmVjdC5pbmZsYXRlWShjQnV0dG9uTGVu
Z3RoW2NvbnRyb2xTaXplXSk7CisKKyAgICByZXR1cm4gcGFpbnRSZWN0OworfQorCitzdGF0aWMg
SW50UmVjdCBidXR0b25SZXBhaW50UmVjdChjb25zdCBJbnRSZWN0JiBidXR0b25SZWN0LCBTY3Jv
bGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJv
bFNpemUsIGJvb2wgc3RhcnQpCit7CisgICAgSW50UmVjdCBwYWludFJlY3QoYnV0dG9uUmVjdCk7
CisgICAgaWYgKG9yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAg
cGFpbnRSZWN0LnNldFdpZHRoKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSk7CisgICAg
ICAgIGlmICghc3RhcnQpCisgICAgICAgICAgICBwYWludFJlY3Quc2V0WChidXR0b25SZWN0Lngo
KSAtIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0gLSBidXR0b25SZWN0LndpZHRoKCkp
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYWludFJlY3Quc2V0SGVpZ2h0KGNSZWFsQnV0dG9u
TGVuZ3RoW2NvbnRyb2xTaXplXSk7CisgICAgICAgIGlmICghc3RhcnQpCisgICAgICAgICAgICBw
YWludFJlY3Quc2V0WShidXR0b25SZWN0LnkoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9s
U2l6ZV0gLSBidXR0b25SZWN0LmhlaWdodCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHBhaW50
UmVjdDsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52YWxpZGF0ZVRyYWNrKCkKK3sK
KyAgICBJbnRSZWN0IHJlY3QgPSB0cmFja1JlcGFpbnRSZWN0KHRyYWNrUmVjdCgpLCBtX29yaWVu
dGF0aW9uLCBjb250cm9sU2l6ZSgpKTsKKyAgICByZWN0Lm1vdmUoLXgoKSwgLXkoKSk7CisgICAg
aW52YWxpZGF0ZVJlY3QocmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmludmFs
aWRhdGVQYXJ0KFNjcm9sbGJhclBhcnQgcGFydCkKK3sKKyAgICBpZiAocGFydCA9PSBOb1BhcnQp
CisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcmVzdWx0OyAgICAKKyAgICBzd2l0Y2gg
KHBhcnQpIHsKKyAgICAgICAgY2FzZSBCYWNrQnV0dG9uUGFydDoKKyAgICAgICAgICAgIHJlc3Vs
dCA9IGJ1dHRvblJlcGFpbnRSZWN0KGJhY2tCdXR0b25SZWN0KCksIG1fb3JpZW50YXRpb24sIGNv
bnRyb2xTaXplKCksIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRm9y
d2FyZEJ1dHRvblBhcnQ6CisgICAgICAgICAgICByZXN1bHQgPSBidXR0b25SZXBhaW50UmVjdChm
b3J3YXJkQnV0dG9uUmVjdCgpLCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpLCBmYWxzZSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgSW50
UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgICAg
ICAgICBzcGxpdFRyYWNrKHRyYWNrUmVjdCgpLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwg
YWZ0ZXJUaHVtYlJlY3QpOworICAgICAgICAgICAgaWYgKHBhcnQgPT0gQmFja1RyYWNrUGFydCkK
KyAgICAgICAgICAgICAgICByZXN1bHQgPSBiZWZvcmVUaHVtYlJlY3Q7CisgICAgICAgICAgICBl
bHNlIGlmIChwYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpCisgICAgICAgICAgICAgICAgcmVzdWx0
ID0gYWZ0ZXJUaHVtYlJlY3Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVz
dWx0ID0gdGh1bWJSZWN0OworICAgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5tb3ZlKC14KCks
IC15KCkpOworICAgIGludmFsaWRhdGVSZWN0KHJlc3VsdCk7Cit9CisKK2ludCBQbGF0Zm9ybVNj
cm9sbGJhcjo6d2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBXaWRnZXQ6OndpZHRoKCk7Cit9
CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGVpZ2h0KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
V2lkZ2V0OjpoZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c2V0UmVjdChj
b25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEdldCBvdXIgd2luZG93IHJlc2l6ZXIgcmVj
dCBhbmQgc2VlIGlmIHdlIG92ZXJsYXAuICBBZGp1c3QgdG8gYXZvaWQgdGhlIG92ZXJsYXAKKyAg
ICAvLyBpZiBuZWNlc3NhcnkuCisgICAgSW50UmVjdCBhZGp1c3RlZFJlY3QocmVjdCk7CisgICAg
aWYgKHBhcmVudCgpICYmIHBhcmVudCgpLT5pc0ZyYW1lVmlldygpKSB7CisgICAgICAgIGJvb2wg
b3ZlcmxhcHNSZXNpemVyID0gZmFsc2U7CisgICAgICAgIEZyYW1lVmlldyogdmlldyA9IHN0YXRp
Y19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICAgICAgSW50UmVjdCByZXNpemVyUmVj
dCA9IHZpZXctPndpbmRvd1Jlc2l6ZXJSZWN0KCk7CisgICAgICAgIHJlc2l6ZXJSZWN0LnNldExv
Y2F0aW9uKHZpZXctPmNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhyZXNpemVyUmVjdC5sb2Nh
dGlvbigpKSk7CisgICAgICAgIGlmIChyZWN0LmludGVyc2VjdHMocmVzaXplclJlY3QpKSB7Cisg
ICAgICAgICAgICBpZiAob3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7Cisg
ICAgICAgICAgICAgICAgaW50IG92ZXJsYXAgPSByZWN0LnJpZ2h0KCkgLSByZXNpemVyUmVjdC54
KCk7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIHJlc2l6ZXJSZWN0LnJpZ2h0
KCkgPj0gcmVjdC5yaWdodCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdGVkUmVjdC5z
ZXRXaWR0aChyZWN0LndpZHRoKCkgLSBvdmVybGFwKTsKKyAgICAgICAgICAgICAgICAgICAgb3Zl
cmxhcHNSZXNpemVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgIGludCBvdmVybGFwID0gcmVjdC5ib3R0b20oKSAtIHJlc2l6
ZXJSZWN0LnkoKTsKKyAgICAgICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDAgJiYgcmVzaXplclJl
Y3QuYm90dG9tKCkgPj0gcmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgICAgICAgICBhZGp1
c3RlZFJlY3Quc2V0SGVpZ2h0KHJlY3QuaGVpZ2h0KCkgLSBvdmVybGFwKTsKKyAgICAgICAgICAg
ICAgICAgICAgb3ZlcmxhcHNSZXNpemVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3ZlcmxhcHNSZXNpemVyICE9IG1f
b3ZlcmxhcHNSZXNpemVyKSB7CisgICAgICAgICAgICBtX292ZXJsYXBzUmVzaXplciA9IG92ZXJs
YXBzUmVzaXplcjsKKyAgICAgICAgICAgIHZpZXctPmFkanVzdE92ZXJsYXBwaW5nU2Nyb2xsYmFy
Q291bnQobV9vdmVybGFwc1Jlc2l6ZXIgPyAxIDogLTEpOworICAgICAgICB9CisgICAgfQorCisg
ICAgc2V0RnJhbWVHZW9tZXRyeShhZGp1c3RlZFJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Ny
b2xsYmFyOjpzZXRQYXJlbnQoU2Nyb2xsVmlldyogcGFyZW50VmlldykKK3sKKyAgICBpZiAoIXBh
cmVudFZpZXcgJiYgbV9vdmVybGFwc1Jlc2l6ZXIgJiYgcGFyZW50KCkgJiYgcGFyZW50KCktPmlz
RnJhbWVWaWV3KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+
YWRqdXN0T3ZlcmxhcHBpbmdTY3JvbGxiYXJDb3VudCgtMSk7CisgICAgV2lkZ2V0OjpzZXRQYXJl
bnQocGFyZW50Vmlldyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNldEVuYWJsZWQo
Ym9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkICE9IGlzRW5hYmxlZCgpKSB7CisgICAg
ICAgIFdpZGdldDo6c2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOwor
ICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnQoR3JhcGhpY3NDb250ZXh0
KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpCit7CisgICAgaWYg
KGdyYXBoaWNzQ29udGV4dC0+dXBkYXRpbmdDb250cm9sVGludHMoKSkgeworICAgICAgICBpbnZh
bGlkYXRlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZ3JhcGhpY3NDb250
ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIERvbid0
IHBhaW50IGFueXRoaW5nIGlmIHRoZSBzY3JvbGxiYXIgZG9lc24ndCBpbnRlcnNlY3QgdGhlIGRh
bWFnZSByZWN0LgorICAgIGlmICghZnJhbWVHZW9tZXRyeSgpLmludGVyc2VjdHMoZGFtYWdlUmVj
dCkpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgdHJhY2sgPSB0cmFja1JlY3QoKTsK
KyAgICBwYWludFRyYWNrKGdyYXBoaWNzQ29udGV4dCwgdHJhY2ssIHRydWUsIGRhbWFnZVJlY3Qp
OworCisgICAgaWYgKGhhc0J1dHRvbnMoKSkgeworICAgICAgICBwYWludEJ1dHRvbihncmFwaGlj
c0NvbnRleHQsIGJhY2tCdXR0b25SZWN0KCksIHRydWUsIGRhbWFnZVJlY3QpOworICAgICAgICBw
YWludEJ1dHRvbihncmFwaGljc0NvbnRleHQsIGZvcndhcmRCdXR0b25SZWN0KCksIGZhbHNlLCBk
YW1hZ2VSZWN0KTsKKyAgICB9CisKKyAgICBpZiAoaGFzVGh1bWIoKSAmJiBkYW1hZ2VSZWN0Lmlu
dGVyc2VjdHModHJhY2spKSB7CisgICAgICAgIEludFJlY3Qgc3RhcnRUcmFja1JlY3QsIHRodW1i
UmVjdCwgZW5kVHJhY2tSZWN0OworICAgICAgICBzcGxpdFRyYWNrKHRyYWNrLCBzdGFydFRyYWNr
UmVjdCwgdGh1bWJSZWN0LCBlbmRUcmFja1JlY3QpOworICAgICAgICBwYWludFRodW1iKGdyYXBo
aWNzQ29udGV4dCwgdGh1bWJSZWN0LCBkYW1hZ2VSZWN0KTsKKyAgICB9Cit9CisKK2Jvb2wgUGxh
dGZvcm1TY3JvbGxiYXI6Omhhc0J1dHRvbnMoKSBjb25zdAoreworICAgIHJldHVybiBpc0VuYWJs
ZWQoKSAmJiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgoKSA6
IGhlaWdodCgpKSA+PSAyICogKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldIC0gY0J1
dHRvbkhpdEluc2V0W2NvbnRyb2xTaXplKCldKTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJh
cjo6aGFzVGh1bWIoKSBjb25zdAoreworICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgpKSA+PSAy
ICogY0J1dHRvbkluc2V0W2NvbnRyb2xTaXplKCldICsgY1RodW1iTWluTGVuZ3RoW2NvbnRyb2xT
aXplKCldICsgMTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6YmFja0J1dHRvblJl
Y3QoKSBjb25zdAoreworICAgIC8vIE91ciBkZXNpcmVkIHJlY3QgaXMgZXNzZW50aWFsbHkgMTd4
MTcuCisgICAgCisgICAgLy8gT3VyIGFjdHVhbCByZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhl
IGF2YWlsYWJsZSBzcGFjZSB3aGVuCisgICAgLy8gd2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAg
VGhpcyBhbGxvd3MgdGhlIHNjcm9sbGJhcgorICAgIC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0
aW9uIGV2ZW4gYXQgdGlueSBzaXplcy4KKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9u
dGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgY0J1dHRvbkxl
bmd0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOwor
ICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgp
XSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1T
Y3JvbGxiYXI6OmZvcndhcmRCdXR0b25SZWN0KCkgY29uc3QKK3sKKyAgICAvLyBPdXIgZGVzaXJl
ZCByZWN0IGlzIGVzc2VudGlhbGx5IDE3eDE3LgorICAgIAorICAgIC8vIE91ciBhY3R1YWwgcmVj
dCB3aWxsIHNocmluayB0byBoYWxmIHRoZSBhdmFpbGFibGUgc3BhY2Ugd2hlbgorICAgIC8vIHdl
IGhhdmUgPCAzNCBwaXhlbHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRoZSBzY3JvbGxiYXIKKyAgICAv
LyB0byBzY2FsZSBkb3duIGFuZCBmdW5jdGlvbiBldmVuIGF0IHRpbnkgc2l6ZXMuCisKKyAgICBp
ZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1cm4g
SW50UmVjdCh4KCkgKyB3aWR0aCgpIC0gY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgeSgp
LCBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9s
U2l6ZSgpXSk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyBoZWlnaHQoKSAtIGNCdXR0
b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBj
QnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldKTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9s
bGJhcjo6dHJhY2tSZWN0KCkgY29uc3QKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIGlmICghaGFzQnV0dG9ucygpKQorICAgICAgICAg
ICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIHdpZHRoKCksIGNIb3Jpem9udGFsSGVpZ2h0W2Nv
bnRyb2xTaXplKCldKTsKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpICsgY0J1dHRvbkxlbmd0
aFtjb250cm9sU2l6ZSgpXSwgeSgpLCB3aWR0aCgpIC0gMiAqIGNCdXR0b25MZW5ndGhbY29udHJv
bFNpemUoKV0sIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICB9CisKKyAg
ICBpZiAoIWhhc0J1dHRvbnMoKSkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNW
ZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBoZWlnaHQoKSk7CisgICAgcmV0dXJuIEludFJl
Y3QoeCgpLCB5KCkgKyBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplKCldLCBjVmVydGljYWxXaWR0
aFtjb250cm9sU2l6ZSgpXSwgaGVpZ2h0KCkgLSAyICogY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6
ZSgpXSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUmVjdCgpIGNvbnN0
Cit7CisgICAgSW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJl
Y3Q7CisgICAgc3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJl
Y3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICByZXR1cm4gdGh1bWJSZWN0OworfQorCit2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgSW50
UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFmdGVy
VGh1bWJSZWN0KSBjb25zdAoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZXZlbiBnZXQg
Y2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhhdmUgc29tZSBjb21iaW5hdGlvbiBv
ZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFzdAorICAgIC8vIG9uZSBvZiB0aGVtIGlz
IG5vbi1lbXB0eS4KKyAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAgaWYg
KG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICB0aHVtYlJl
Y3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyB0aHVtYlBvcywgdHJhY2tSZWN0LnkoKSArICh0
cmFja1JlY3QuaGVpZ2h0KCkgLSBjVGh1bWJIZWlnaHRbY29udHJvbFNpemUoKV0pIC8gMiwgdGh1
bWJMZW5ndGgoKSwgY1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICAgICAgYmVmb3Jl
VGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1JlY3QueSgpLCB0aHVtYlBv
cywgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJbnRSZWN0
KHRodW1iUmVjdC54KCkgKyB0aHVtYlJlY3Qud2lkdGgoKSwgdHJhY2tSZWN0LnkoKSwgdHJhY2tS
ZWN0LnJpZ2h0KCkgLSB0aHVtYlJlY3QucmlnaHQoKSwgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyAo
dHJhY2tSZWN0LndpZHRoKCkgLSBjVGh1bWJXaWR0aFtjb250cm9sU2l6ZSgpXSkgLyAyLCB0cmFj
a1JlY3QueSgpICsgdGh1bWJQb3MsIGNUaHVtYldpZHRoW2NvbnRyb2xTaXplKCldLCB0aHVtYkxl
bmd0aCgpKTsKKyAgICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgp
LCB0cmFja1JlY3QueSgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdGh1bWJQb3MpOworICAgICAgICBh
ZnRlclRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwgdGh1bWJSZWN0LnkoKSArIHRo
dW1iUmVjdC5oZWlnaHQoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRyYWNrUmVjdC5ib3R0b20oKSAt
IHRodW1iUmVjdC5ib3R0b20oKSk7CisgICAgfQorfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6
OnRodW1iUG9zaXRpb24oKSBjb25zdAoreworICAgIGlmIChpc0VuYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuIChmbG9hdCltX2N1cnJlbnRQb3MgKiAodHJhY2tMZW5ndGgoKSAtIHRodW1iTGVuZ3Ro
KCkpIC8gKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisK
K2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJMZW5ndGgoKSBjb25zdAoreworICAgIGlmICgh
aXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmxvYXQgcHJvcG9ydGlvbiA9
IChmbG9hdCkobV92aXNpYmxlU2l6ZSkgLyBtX3RvdGFsU2l6ZTsKKyAgICBpbnQgdHJhY2tMZW4g
PSB0cmFja0xlbmd0aCgpOworICAgIGludCBsZW5ndGggPSBwcm9wb3J0aW9uICogdHJhY2tMZW47
CisgICAgaW50IG1pbkxlbmd0aCA9IGNUaHVtYk1pbkxlbmd0aFtjb250cm9sU2l6ZSgpXTsKKyAg
ICBsZW5ndGggPSBtYXgobGVuZ3RoLCBtaW5MZW5ndGgpOworICAgIGlmIChsZW5ndGggPiB0cmFj
a0xlbikKKyAgICAgICAgbGVuZ3RoID0gMDsgLy8gT25jZSB0aGUgdGh1bWIgaXMgYmVsb3cgdGhl
IHRyYWNrIGxlbmd0aCwgaXQganVzdCBnb2VzIGF3YXkgKHRvIG1ha2UgbW9yZSByb29tIGZvciB0
aGUgdHJhY2spLgorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJh
cjo6dHJhY2tMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiAobV9vcmllbnRhdGlvbiA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRyYWNrUmVjdCgpLndpZHRoKCkgOiB0cmFja1JlY3QoKS5o
ZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRCdXR0b24oR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25z
dCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJy
YXJ5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcGFpbnRSZWN0ID0gYnV0dG9u
UmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlvbiwgY29udHJvbFNpemUoKSwgc3RhcnQpOwor
ICAgIAorICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCisgICAgICAg
IHJldHVybjsKKworICAgIFRoZW1lUGFydCBwYXJ0OworICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0
YXRlID0gMDsKKyAgICBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAgICAgIHN0YXRlIHw9
IEFjdGl2ZVN0YXRlOworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxi
YXIpCisgICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbExlZnRBcnJvd1BhcnQgOiBTY3JvbGxS
aWdodEFycm93UGFydDsKKyAgICBlbHNlCisgICAgICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbFVw
QXJyb3dQYXJ0IDogU2Nyb2xsRG93bkFycm93UGFydDsKKworICAgIGlmIChpc0VuYWJsZWQoKSkK
KyAgICAgICAgc3RhdGUgfD0gRW5hYmxlZFN0YXRlOworICAgIGlmICgobV9wcmVzc2VkUGFydCA9
PSBCYWNrQnV0dG9uUGFydCAmJiBzdGFydCkKKyAgICAgICAgfHwgKG1fcHJlc3NlZFBhcnQgPT0g
Rm9yd2FyZEJ1dHRvblBhcnQgJiYgIXN0YXJ0KSkKKyAgICAgICAgc3RhdGUgfD0gUHJlc3NlZFN0
YXRlOworCisgICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9sbGJhciA/IE5TU21hbGxD
b250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1TY3JvbGxiYXI6OnBhaW50VHJhY2soR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25z
dCBJbnRSZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBj
b25zdAoreworICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCisgICAgICAgIHJldHVybjsK
KworICAgIEludFJlY3QgcGFpbnRSZWN0ID0gaGFzQnV0dG9ucygpID8gdHJhY2tSZXBhaW50UmVj
dChyZWN0LCBtX29yaWVudGF0aW9uLCBjb250cm9sU2l6ZSgpKSA6IHJlY3Q7CisgICAgCisgICAg
aWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgVGhlbWVQYXJ0IHBhcnQgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxi
YXIgPyBIU2Nyb2xsVHJhY2tQYXJ0IDogVlNjcm9sbFRyYWNrUGFydDsKKyAgICBUaGVtZUNvbnRy
b2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAgaWYgKG1fY2xpZW50LT5pc0FjdGl2ZSgpKQorICAgICAg
ICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICBpZiAoaGFzQnV0dG9ucygpKQorICAgICAgICBz
dGF0ZSB8PSBFbmFibGVkU3RhdGU7CisKKyAgICBwYWludFRoZW1lUGFydChwYXJ0LCBjb250ZXh0
LT5wbGF0Zm9ybUNvbnRleHQoKSwgcGFpbnRSZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Ny
b2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRl
KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYihHcmFwaGljc0NvbnRl
eHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJl
Y3QpIGNvbnN0Cit7CisgICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocmVjdCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIFRoZW1lUGFydCBwYXJ0ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyID8gSFNjcm9sbFRodW1iUGFydCA6IFZTY3JvbGxUaHVtYlBhcnQ7CisgICAgVGhl
bWVDb250cm9sU3RhdGUgc3RhdGUgPSAwOworICAgIGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkK
KyAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7CisgICAgaWYgKGlzRW5hYmxlZCgpKQorICAg
ICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7CisKKyAgICBwYWludFRoZW1lUGFydChwYXJ0LCBj
b250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNj
cm9sbGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0
ZSk7Cit9CisKK1Njcm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRlc3QoY29uc3Qg
UGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuIE5vUGFydDsKKworICAgIEludFBvaW50IG1vdXNlUG9zaXRpb24gPSBjb252ZXJ0
RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKTsKKyAgICBtb3VzZVBvc2l0aW9uLm1vdmUo
eCgpLCB5KCkpOworCisgICAgaWYgKGhhc0J1dHRvbnMoKSkgeworICAgICAgICBpZiAoYmFja0J1
dHRvblJlY3QoKS5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBC
YWNrQnV0dG9uUGFydDsKKworICAgICAgICBpZiAoZm9yd2FyZEJ1dHRvblJlY3QoKS5jb250YWlu
cyhtb3VzZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBGb3J3YXJkQnV0dG9uUGFydDsK
KyAgICB9CisKKyAgICBpZiAoIWhhc1RodW1iKCkpCisgICAgICAgIHJldHVybiBOb1BhcnQ7CisK
KyAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tSZWN0KCk7CisgICAgaWYgKHRyYWNrLmNvbnRhaW5z
KG1vdXNlUG9zaXRpb24pKSB7CisgICAgICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVt
YlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICBzcGxpdFRyYWNrKHRyYWNrLCBiZWZvcmVU
aHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOworICAgICAgICBpZiAoYmVmb3Jl
VGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuIEJh
Y2tUcmFja1BhcnQ7CisgICAgICAgIGlmICh0aHVtYlJlY3QuY29udGFpbnMobW91c2VQb3NpdGlv
bikpCisgICAgICAgICAgICByZXR1cm4gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm4gRm9yd2Fy
ZFRyYWNrUGFydDsKKyAgICB9CisgICAgcmV0dXJuIE5vUGFydDsKK30KKworYm9vbCBQbGF0Zm9y
bVNjcm9sbGJhcjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50
JiBldnQpCit7CisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0KSB7CisgICAgICAg
IC8vIERyYWcgdGhlIHRodW1iLgorICAgICAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0aW9u
KCk7CisgICAgICAgIGludCB0aHVtYkxlbiA9IHRodW1iTGVuZ3RoKCk7CisgICAgICAgIGludCB0
cmFja0xlbiA9IHRyYWNrTGVuZ3RoKCk7CisgICAgICAgIGludCBtYXhQb3MgPSB0cmFja0xlbiAt
IHRodW1iTGVuOworICAgICAgICBpbnQgZGVsdGEgPSAwOworICAgICAgICBpZiAobV9vcmllbnRh
dGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgZGVsdGEgPSBjb252ZXJ0
RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkgLSBtX3ByZXNzZWRQb3M7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIGRlbHRhID0gY29udmVydEZyb21Db250YWluaW5nV2luZG93
KGV2dC5wb3MoKSkueSgpIC0gbV9wcmVzc2VkUG9zOworCisgICAgICAgIGlmIChkZWx0YSA+IDAp
CisgICAgICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgZG93bi9yaWdodC4KKyAgICAgICAgICAg
IGRlbHRhID0gbWluKG1heFBvcyAtIHRodW1iUG9zLCBkZWx0YSk7CisgICAgICAgIGVsc2UgaWYg
KGRlbHRhIDwgMCkKKyAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBtb3ZlZCB1cC9sZWZ0LgorICAg
ICAgICAgICAgZGVsdGEgPSBtYXgoLXRodW1iUG9zLCBkZWx0YSk7CisKKyAgICAgICAgaWYgKGRl
bHRhICE9IDApIHsKKyAgICAgICAgICAgIHNldFZhbHVlKChmbG9hdCkodGh1bWJQb3MgKyBkZWx0
YSkgKiAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKSAvICh0cmFja0xlbiAtIHRodW1iTGVu
KSk7CisgICAgICAgICAgICBtX3ByZXNzZWRQb3MgKz0gdGh1bWJQb3NpdGlvbigpIC0gdGh1bWJQ
b3M7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwor
ICAgIGlmIChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkKKyAgICAgICAgbV9wcmVzc2VkUG9zID0g
KG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNvbnZlcnRGcm9tQ29udGFp
bmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhl
dnQucG9zKCkpLnkoKSk7CisKKyAgICBTY3JvbGxiYXJQYXJ0IHBhcnQgPSBoaXRUZXN0KGV2dCk7
ICAgIAorICAgIGlmIChwYXJ0ICE9IG1faG92ZXJlZFBhcnQpIHsKKyAgICAgICAgaWYgKG1fcHJl
c3NlZFBhcnQgIT0gTm9QYXJ0KSB7CisgICAgICAgICAgICBpZiAocGFydCA9PSBtX3ByZXNzZWRQ
YXJ0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG1vdXNlIGlzIG1vdmluZyBiYWNrIG92ZXIg
dGhlIHByZXNzZWQgcGFydC4gIFdlCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdGFydCB1
cCB0aGUgdGltZXIgYWN0aW9uIGFnYWluLgorICAgICAgICAgICAgICAgIHN0YXJ0VGltZXJJZk5l
ZWRlZChjTm9ybWFsVGltZXJEZWxheSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQo
bV9wcmVzc2VkUGFydCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1faG92ZXJlZFBhcnQgPT0g
bV9wcmVzc2VkUGFydCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBpcyBsZWF2aW5n
IHRoZSBwcmVzc2VkIHBhcnQuICBLaWxsIG91ciB0aW1lcgorICAgICAgICAgICAgICAgIC8vIGlm
IG5lZWRlZC4KKyAgICAgICAgICAgICAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworICAgICAgICAg
ICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICAgICAgfQorICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQocGFydCk7CisgICAgICAg
ICAgICBpbnZhbGlkYXRlUGFydChtX2hvdmVyZWRQYXJ0KTsKKyAgICAgICAgfQorICAgICAgICBt
X2hvdmVyZWRQYXJ0ID0gcGFydDsKKyAgICB9IAorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlT3V0RXZlbnQoY29uc3QgUGxhdGZvcm1N
b3VzZUV2ZW50JiBldnQpCit7CisgICAgaW52YWxpZGF0ZVBhcnQobV9ob3ZlcmVkUGFydCk7Cisg
ICAgbV9ob3ZlcmVkUGFydCA9IE5vUGFydDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29s
IFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZVByZXNzRXZlbnQoY29uc3QgUGxhdGZvcm1N
b3VzZUV2ZW50JiBldnQpCit7CisgICAgbV9wcmVzc2VkUGFydCA9IGhpdFRlc3QoZXZ0KTsKKyAg
ICBtX3ByZXNzZWRQb3MgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8g
Y29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueCgpIDogY29udmVydEZyb21D
b250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgpKTsKKyAgICBpbnZhbGlkYXRlUGFydChtX3By
ZXNzZWRQYXJ0KTsKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoY0luaXRpYWxUaW1lckRlbGF5
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxl
TW91c2VSZWxlYXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAg
aW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgbV9wcmVzc2VkUGFydCA9IE5vUGFy
dDsKKyAgICBtX3ByZXNzZWRQb3MgPSAwOworICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisKKyAg
ICBpZiAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpCisgICAgICAgIHN0YXRp
Y19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPnNl
dE1vdXNlUHJlc3NlZChmYWxzZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6c3RhcnRUaW1lcklmTmVlZGVkKGRvdWJsZSBkZWxheSkKK3sKKyAgICAv
LyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhlIHRodW1iLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0
ID09IFRodW1iUGFydCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSGFuZGxlIHRoZSB0cmFj
ay4gIFdlIGhhbHQgdHJhY2sgc2Nyb2xsaW5nIG9uY2UgdGhlIHRodW1iIGlzIGxldmVsCisgICAg
Ly8gd2l0aCB1cy4KKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCB8fCBt
X3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpICYmIHRodW1iVW5kZXJNb3VzZSgpKSB7
CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICBtX2hvdmVy
ZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2Ug
Y2FuJ3Qgc2Nyb2xsIGlmIHdlJ3ZlIGhpdCB0aGUgYmVnaW5uaW5nIG9yIGVuZC4KKyAgICBTY3Jv
bGxEaXJlY3Rpb24gZGlyID0gcHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKTsKKyAgICBpZiAo
ZGlyID09IFNjcm9sbFVwIHx8IGRpciA9PSBTY3JvbGxMZWZ0KSB7CisgICAgICAgIGlmIChtX2N1
cnJlbnRQb3MgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAg
ICBpZiAobV9jdXJyZW50UG9zID09IG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX3Njcm9sbFRpbWVyLnN0YXJ0T25lU2hvdChk
ZWxheSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnN0b3BUaW1lcklmTmVlZGVkKCkK
K3sKKyAgICBpZiAobV9zY3JvbGxUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9sbFRp
bWVyLnN0b3AoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFByZXNz
ZWRQYXJ0KGRvdWJsZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhl
IHRodW1iIG9yIGlmIG5vdGhpbmcgd2FzIHByZXNzZWQuCisgICAgaWYgKG1fcHJlc3NlZFBhcnQg
PT0gVGh1bWJQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gTm9QYXJ0KQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBIYW5kbGUgdGhlIHRyYWNrLgorICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBC
YWNrVHJhY2tQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkgJiYgdGh1
bWJVbmRlck1vdXNlKCkpIHsKKyAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7
CisgICAgICAgIG1faG92ZXJlZFBhcnQgPSBUaHVtYlBhcnQ7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBIYW5kbGUgdGhlIGFycm93cyBhbmQgdHJhY2suCisgICAgaWYgKHNjcm9s
bChwcmVzc2VkUGFydFNjcm9sbERpcmVjdGlvbigpLCBwcmVzc2VkUGFydFNjcm9sbEdyYW51bGFy
aXR5KCkpKQorICAgICAgICBzdGFydFRpbWVySWZOZWVkZWQoZGVsYXkpOworfQorCit2b2lkIFBs
YXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGltZXJGaXJlZChUaW1lcjxQbGF0Zm9ybVNjcm9s
bGJhcj4qKQoreworICAgIGF1dG9zY3JvbGxQcmVzc2VkUGFydChjTm9ybWFsVGltZXJEZWxheSk7
Cit9CisKK1Njcm9sbERpcmVjdGlvbiBQbGF0Zm9ybVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3Jv
bGxEaXJlY3Rpb24oKQoreworICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIpIHsKKyAgICAgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgfHwg
bV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0KQorICAgICAgICAgICAgcmV0dXJuIFNjcm9s
bExlZnQ7CisgICAgICAgIHJldHVybiBTY3JvbGxSaWdodDsKKyAgICB9IGVsc2UgeworICAgICAg
ICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09
IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICByZXR1cm4gU2Nyb2xsVXA7CisgICAgICAgIHJl
dHVybiBTY3JvbGxEb3duOworICAgIH0KK30KKworU2Nyb2xsR3JhbnVsYXJpdHkgUGxhdGZvcm1T
Y3JvbGxiYXI6OnByZXNzZWRQYXJ0U2Nyb2xsR3JhbnVsYXJpdHkoKQoreworICAgIGlmIChtX3By
ZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25QYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1
dHRvblBhcnQpCisgICAgICAgIHJldHVybiBTY3JvbGxCeUxpbmU7CisgICAgcmV0dXJuIFNjcm9s
bEJ5UGFnZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJVbmRlck1vdXNlKCkK
K3sKKyAgICAvLyBDb25zdHJ1Y3QgYSByZWN0LgorICAgIEludFJlY3QgdGh1bWIgPSB0aHVtYlJl
Y3QoKTsKKyAgICB0aHVtYi5tb3ZlKC14KCksIC15KCkpOworICAgIGludCBiZWdpbiA9IChtX29y
aWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gdGh1bWIueCgpIDogdGh1bWIueSgp
OworICAgIGludCBlbmQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/
IHRodW1iLnJpZ2h0KCkgOiB0aHVtYi5ib3R0b20oKTsKKyAgICByZXR1cm4gKGJlZ2luIDw9IG1f
cHJlc3NlZFBvcyAmJiBtX3ByZXNzZWRQb3MgPCBlbmQpOworfQorCitpbnQgUGxhdGZvcm1TY3Jv
bGxiYXI6Omhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQoU2Nyb2xsYmFyQ29udHJvbFNpemUgY29u
dHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNIb3Jpem9udGFsV2lkdGhbY29udHJvbFNpemVdOwor
fQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgoU2Nyb2xs
YmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNWZXJ0aWNhbEhlaWdo
dFtjb250cm9sU2l6ZV07Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OndpbmRvd0Ns
aXBSZWN0KCkgY29uc3QKK3sKKyAgICBJbnRSZWN0IGNsaXBSZWN0KDAsIDAsIHdpZHRoKCksIGhl
aWdodCgpKTsKKyAgICBjbGlwUmVjdCA9IGNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3coY2xpcFJl
Y3QpOworICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgY2xpcFJlY3QuaW50ZXJzZWN0KG1fY2xp
ZW50LT53aW5kb3dDbGlwUmVjdCgpKTsKKyAgICByZXR1cm4gY2xpcFJlY3Q7Cit9CisKK3ZvaWQg
UGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KSBjb25zdAoreworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVyUmVj
dChjb25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFJlY3Qo
KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVDaGFuZ2VkKCkKK3sKK30KKwor
fQorCisjZW5kaWYgLy8gZGVmaW5lZChVU0VfU0FGQVJJX1RIRU1FKQpJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS93aW4vUGxhdGZvcm1TY3JvbGxCYXJXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vd2luL1BsYXRmb3JtU2Nyb2xsQmFyV2luLmNwcAkocmV2aXNpb24gMzA0NTYp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9QbGF0Zm9ybVNjcm9sbEJhcldpbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxl
IEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQnJlbnQg
RnVsZ2hhbQogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNSw4ICsyNiw2IEBA
CiAKICNpbmNsdWRlICJjb25maWcuaCIKIAotI2lmZGVmIFVTRV9TQUZBUklfVEhFTUUgCi0KICNp
bmNsdWRlICJQbGF0Zm9ybVNjcm9sbEJhci5oIgogCiAjaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgi
CkBAIC0zNyw1NiArMzYsMTE0IEBACiAjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCiAj
aW5jbHVkZSAiU29mdExpbmtpbmcuaCIKIAotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3Jh
cGhpY3MuaD4KLSNpbmNsdWRlIDxTYWZhcmlUaGVtZS9TYWZhcmlUaGVtZS5oPgorI2luY2x1ZGUg
PHdpbmRvd3MuaD4KKyNpbmNsdWRlICJSZW5kZXJUaGVtZVdpbi5oIgogCi0vLyBGSVhNRTogVGhl
cmUgYXJlIHJlcGFpbnRpbmcgcHJvYmxlbXMgZHVlIHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25z
JyB2aXN1YWwgb3ZlcmZsb3cuCisvLyBHZW5lcmljIHN0YXRlIGNvbnN0YW50cworI2RlZmluZSBU
U19OT1JNQUwgICAgMQorI2RlZmluZSBUU19IT1ZFUiAgICAgMgorI2RlZmluZSBUU19BQ1RJVkUg
ICAgMworI2RlZmluZSBUU19ESVNBQkxFRCAgNAorI2RlZmluZSBUU19GT0NVU0VEICAgNQorCisj
ZGVmaW5lIEFCU19VUE5PUk1BTCAxCisjZGVmaW5lIEFCU19ET1dOTk9STUFMIDUKKyNkZWZpbmUg
QUJTX0xFRlROT1JNQUwgOQorI2RlZmluZSBBQlNfUklHSFROT1JNQUwgMTMKKworc3RhdGljIGNv
bnN0IHVuc2lnbmVkIFNQX0FCU19IT1RfTU9ESUZJRVIgPSAxOworc3RhdGljIGNvbnN0IHVuc2ln
bmVkIFNQX0FCU19QUkVTU0VEX01PRElGSUVSID0gMjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBT
UF9BQlNfRElTQUJMRV9NT0RJRklFUiA9IDM7CisKKy8vIFNjcm9sbGJhciBjb25zdGFudHMKKyNk
ZWZpbmUgU1BfQlVUVE9OIDEKKyNkZWZpbmUgU1BfVEhVTUJIT1IgMgorI2RlZmluZSBTUF9USFVN
QlZFUlQgMworI2RlZmluZSBTUF9UUkFDS1NUQVJUSE9SIDQKKyNkZWZpbmUgU1BfVFJBQ0tFTkRI
T1IgNQorI2RlZmluZSBTUF9UUkFDS1NUQVJUVkVSVCA2CisjZGVmaW5lIFNQX1RSQUNLRU5EVkVS
VCA3CisjZGVmaW5lIFNQX0dSSVBQRVJIT1IgOAorI2RlZmluZSBTUF9HUklQUEVSVkVSVCA5CiAK
IHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFt
ZXNwYWNlIFNhZmFyaVRoZW1lOwotCiAvLyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGVzZSBudW1i
ZXJzIGZyb20gU2FmYXJpVGhlbWUKLXN0YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aFtdID0geyAx
NSwgMTEgfTsKLXN0YXRpYyBpbnQgY0hvcml6b250YWxIZWlnaHRbXSA9IHsgMTUsIDExIH07Ci1z
dGF0aWMgaW50IGNWZXJ0aWNhbFdpZHRoW10gPSB7IDE1LCAxMSB9Owotc3RhdGljIGludCBjVmVy
dGljYWxIZWlnaHRbXSA9IHsgMTUsIDExIH07Ci1zdGF0aWMgaW50IGNSZWFsQnV0dG9uTGVuZ3Ro
W10gPSB7IDI4LCAyMSB9Owotc3RhdGljIGludCBjQnV0dG9uSW5zZXRbXSA9IHsgMTQsIDExIH07
Ci1zdGF0aWMgaW50IGNCdXR0b25IaXRJbnNldFtdID0geyAzLCAyIH07CitzdGF0aWMgaW50IGNI
b3Jpem9udGFsV2lkdGggPSAwOworc3RhdGljIGludCBjSG9yaXpvbnRhbEhlaWdodCA9IDA7Citz
dGF0aWMgaW50IGNWZXJ0aWNhbFdpZHRoID0gMDsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsSGVpZ2h0
ID0gMDsKK3N0YXRpYyBpbnQgY0hvcml6b250YWxCdXR0b25XaWR0aCA9IDA7CitzdGF0aWMgaW50
IGNWZXJ0aWNhbEJ1dHRvbkhlaWdodCA9IDA7CitzdGF0aWMgaW50IGNSZWFsQnV0dG9uTGVuZ3Ro
ID0gMjg7CitzdGF0aWMgaW50IGNCdXR0b25JbnNldCA9IDE0Oworc3RhdGljIGludCBjQnV0dG9u
SGl0SW5zZXQgPSAzOwogLy8gY1JlYWxCdXR0b25MZW5ndGggLSBjQnV0dG9uSW5zZXQKLXN0YXRp
YyBpbnQgY0J1dHRvbkxlbmd0aFtdID0geyAxNCwgMTAgfTsKLXN0YXRpYyBpbnQgY1RodW1iV2lk
dGhbXSA9IHsgMTUsIDExIH07Ci1zdGF0aWMgaW50IGNUaHVtYkhlaWdodFtdID0geyAxNSwgMTEg
fTsKLXN0YXRpYyBpbnQgY1RodW1iTWluTGVuZ3RoW10gPSB7IDI2LCAyMCB9OwotCi0jaWYgIWRl
ZmluZWQoTkRFQlVHKSAmJiBkZWZpbmVkKFVTRV9ERUJVR19TQUZBUklfVEhFTUUpCi1TT0ZUX0xJ
TktfREVCVUdfTElCUkFSWShTYWZhcmlUaGVtZSkKLSNlbHNlCi1TT0ZUX0xJTktfTElCUkFSWShT
YWZhcmlUaGVtZSkKLSNlbmRpZgorc3RhdGljIGludCBjVGh1bWJXaWR0aCA9IDA7CitzdGF0aWMg
aW50IGNUaHVtYkhlaWdodCA9IDA7CitzdGF0aWMgaW50IGNUaHVtYk1pbkxlbmd0aCA9IDI2Owor
CitzdGF0aWMgSEFORExFIGNTY3JvbGxCYXJUaGVtZSA9IDA7CiAKLVNPRlRfTElOSyhTYWZhcmlU
aGVtZSwgcGFpbnRUaGVtZVBhcnQsIHZvaWQsIF9fc3RkY2FsbCwgKFRoZW1lUGFydCBwYXJ0LCBD
R0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ0dSZWN0JiByZWN0LCBOU0NvbnRyb2xTaXplIHNp
emUsIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlKSwgKHBhcnQsIGNvbnRleHQsIHJlY3QsIHNpemUs
IHN0YXRlKSkKKy8vIEZJWE1FOiAgUmVmYWN0b3IgdGhlIHNvZnQtbGlua2luZyBjb2RlIHNvIHRo
YXQgaXQgY2FuIGJlIHNoYXJlZCB3aXRoIFJlbmRlclRoZW1lV2luCitTT0ZUX0xJTktfTElCUkFS
WSh1eHRoZW1lKQorU09GVF9MSU5LKHV4dGhlbWUsIE9wZW5UaGVtZURhdGEsIEhBTkRMRSwgV0lO
QVBJLCAoSFdORCBod25kLCBMUENXU1RSIHBzekNsYXNzTGlzdCksIChod25kLCBwc3pDbGFzc0xp
c3QpKQorU09GVF9MSU5LKHV4dGhlbWUsIENsb3NlVGhlbWVEYXRhLCBIUkVTVUxULCBXSU5BUEks
IChIQU5ETEUgaFRoZW1lKSwgKGhUaGVtZSkpCitTT0ZUX0xJTksodXh0aGVtZSwgRHJhd1RoZW1l
QmFja2dyb3VuZCwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50
IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwgY29uc3QgUkVDVCogcFJlY3QsIGNvbnN0IFJFQ1QqIHBD
bGlwUmVjdCksIChoVGhlbWUsIGhkYywgaVBhcnRJZCwgaVN0YXRlSWQsIHBSZWN0LCBwQ2xpcFJl
Y3QpKQorU09GVF9MSU5LKHV4dGhlbWUsIERyYXdUaGVtZUVkZ2UsIEhSRVNVTFQsIFdJTkFQSSwg
KEhBTkRMRSBoVGhlbWUsIEhEQyBoZGMsIGludCBpUGFydElkLCBpbnQgaVN0YXRlSWQsIGNvbnN0
IFJFQ1QqIHBSZWN0LCB1bnNpZ25lZCB1RWRnZSwgdW5zaWduZWQgdUZsYWdzLCBjb25zdCBSRUNU
KiBwQ2xpcFJlY3QpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBwUmVjdCwgdUVk
Z2UsIHVGbGFncywgcENsaXBSZWN0KSkKK1NPRlRfTElOSyh1eHRoZW1lLCBHZXRUaGVtZUNvbnRl
bnRSZWN0LCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMgaGRjLCBpbnQgaVBh
cnRJZCwgaW50IGlTdGF0ZUlkLCBjb25zdCBSRUNUKiBwUmVjdCwgY29uc3QgUkVDVCogcENvbnRl
bnRSZWN0KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBpU3RhdGVJZCwgcFJlY3QsIHBDb250ZW50
UmVjdCkpCitTT0ZUX0xJTksodXh0aGVtZSwgR2V0VGhlbWVQYXJ0U2l6ZSwgSFJFU1VMVCwgV0lO
QVBJLCAoSEFORExFIGhUaGVtZSwgSERDIGhkYywgaW50IGlQYXJ0SWQsIGludCBpU3RhdGVJZCwg
UkVDVCogcFJlY3QsIGludCB0cywgU0laRSogcHN6KSwgKGhUaGVtZSwgaGRjLCBpUGFydElkLCBp
U3RhdGVJZCwgcFJlY3QsIHRzLCBwc3opKQorU09GVF9MSU5LKHV4dGhlbWUsIEdldFRoZW1lU3lz
Rm9udCwgSFJFU1VMVCwgV0lOQVBJLCAoSEFORExFIGhUaGVtZSwgaW50IGlGb250SWQsIE9VVCBM
T0dGT05UKiBwRm9udCksIChoVGhlbWUsIGlGb250SWQsIHBGb250KSkKK1NPRlRfTElOSyh1eHRo
ZW1lLCBHZXRUaGVtZUNvbG9yLCBIUkVTVUxULCBXSU5BUEksIChIQU5ETEUgaFRoZW1lLCBIREMg
aGRjLCBpbnQgaVBhcnRJZCwgaW50IGlTdGF0ZUlkLCBpbnQgaVByb3BJZCwgT1VUIENPTE9SUkVG
KiBwQ29sb3IpLCAoaFRoZW1lLCBoZGMsIGlQYXJ0SWQsIGlTdGF0ZUlkLCBpUHJvcElkLCBwQ29s
b3IpKQorCitzdGF0aWMgdm9pZCBjaGVja0FuZEluaXRTY3JvbGxiYXJUaGVtZSgpCit7CisgICAg
aWYgKHV4dGhlbWVMaWJyYXJ5KCkgJiYgIWNTY3JvbGxCYXJUaGVtZSkKKyAgICAgICAgY1Njcm9s
bEJhclRoZW1lID0gT3BlblRoZW1lRGF0YSgwLCBMIlNjcm9sbGJhciIpOworfQorCisvLyBNYXkg
bmVlZCB0byBhZGQgc3R1ZmYgdG8gdGhlc2UgbGF0ZXIsIHNvIGtlZXAgdGhlIGdyYXBoaWNzIGNv
bnRleHQgcmV0cmlldmFsL3JlbGVhc2UgaW4gc29tZSBoZWxwZXJzLgorc3RhdGljIEhEQyBwcmVw
YXJlRm9yRHJhd2luZyhHcmFwaGljc0NvbnRleHQqIGcsIGNvbnN0IEludFJlY3QmIHIpCit7Cisg
ICAgcmV0dXJuIGctPmdldFdpbmRvd3NDb250ZXh0KHIpOworfQorIAorc3RhdGljIHZvaWQgZG9u
ZURyYXdpbmcoR3JhcGhpY3NDb250ZXh0KiBnLCBIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByKQor
eworICAgIGctPnJlbGVhc2VXaW5kb3dzQ29udGV4dChoZGMsIHIpOworfQorLy8gRW5kIENvcGll
ZCBmcm9tIFJlbmRlclRoZW1lV2luCiAKIGNvbnN0IGRvdWJsZSBjSW5pdGlhbFRpbWVyRGVsYXkg
PSAwLjI1OwogY29uc3QgZG91YmxlIGNOb3JtYWxUaW1lckRlbGF5ID0gMC4wNTsKIAogUGxhdGZv
cm1TY3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCogY2xpZW50LCBT
Y3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6
ZSkKLSAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKSwgbV9ob3ZlcmVk
UGFydChOb1BhcnQpLCBtX3ByZXNzZWRQYXJ0KE5vUGFydCksIG1fcHJlc3NlZFBvcygwKSwKLSAg
ICAgIG1fc2Nyb2xsVGltZXIodGhpcywgJlBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xsVGlt
ZXJGaXJlZCksCi0gICAgICBtX292ZXJsYXBzUmVzaXplcihmYWxzZSkKKyAgICA6IFNjcm9sbGJh
cihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKQorICAgICwgbV9ob3ZlcmVkUGFydChOb1BhcnQp
CisgICAgLCBtX3ByZXNzZWRQYXJ0KE5vUGFydCkKKyAgICAsIG1fcHJlc3NlZFBvcygwKQorICAg
ICwgbV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1l
ckZpcmVkKQorICAgICwgbV9vdmVybGFwc1Jlc2l6ZXIoZmFsc2UpCiB7CiAgICAgLy8gT2J0YWlu
IHRoZSBjb3JyZWN0IHNjcm9sbGJhciBzaXplcyBmcm9tIHRoZSBzeXN0ZW0uCi0gICAgaWYgKCFj
SG9yaXpvbnRhbFdpZHRoKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBHZXQgbWV0aWNzIGZyb20gU2Fm
YXJpVGhlbWUKKyAgICAvLyBGSVhNRTogIFdlIHNob3VsZCB1cGRhdGUgdGhlc2Ugb24gYSBXTV9T
RVRUSU5HU0NIQU5HRSwgdG9vLgorICAgIGlmICghY0hvcml6b250YWxIZWlnaHQpIHsKKyAgICAg
ICBjSG9yaXpvbnRhbEhlaWdodCA9IDo6R2V0U3lzdGVtTWV0cmljcyhTTV9DWUhTQ1JPTEwpOwor
ICAgICAgIGNIb3Jpem9udGFsV2lkdGggPSA6OkdldFN5c3RlbU1ldHJpY3MoU01fQ1hIU0NST0xM
KTsKKyAgICAgICBjVmVydGljYWxIZWlnaHQgPSA6OkdldFN5c3RlbU1ldHJpY3MoU01fQ1lWU0NS
T0xMKTsKKyAgICAgICBjVmVydGljYWxXaWR0aCA9IDo6R2V0U3lzdGVtTWV0cmljcyhTTV9DWFZT
Q1JPTEwpOworICAgICAgIGNUaHVtYldpZHRoID0gOjpHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYSFRI
VU1CKTsKKyAgICAgICBjVGh1bWJIZWlnaHQgPSA6OkdldFN5c3RlbU1ldHJpY3MoU01fQ1lWVEhV
TUIpOworICAgICAgIGNIb3Jpem9udGFsQnV0dG9uV2lkdGggPSA6OkdldFN5c3RlbU1ldHJpY3Mo
U01fQ1lWU0NST0xMKTsKKyAgICAgICBjVmVydGljYWxCdXR0b25IZWlnaHQgPSA6OkdldFN5c3Rl
bU1ldHJpY3MoU01fQ1hIU0NST0xMKTsKICAgICB9CiAKICAgICBpZiAob3JpZW50YXRpb24gPT0g
VmVydGljYWxTY3JvbGxiYXIpCi0gICAgICAgIHNldEZyYW1lR2VvbWV0cnkoSW50UmVjdCgwLCAw
LCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsSGVpZ2h0W2NvbnRyb2xT
aXplKCldKSk7CisgICAgICAgIHNldEZyYW1lR2VvbWV0cnkoSW50UmVjdCgwLCAwLCBjVmVydGlj
YWxXaWR0aCwgY1ZlcnRpY2FsSGVpZ2h0KSk7CiAgICAgZWxzZQotICAgICAgICBzZXRGcmFtZUdl
b21ldHJ5KEludFJlY3QoMCwgMCwgY0hvcml6b250YWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0hv
cml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pKTsKKyAgICAgICAgc2V0RnJhbWVHZW9tZXRy
eShJbnRSZWN0KDAsIDAsIGNIb3Jpem9udGFsV2lkdGgsIGNIb3Jpem9udGFsSGVpZ2h0KSk7CiB9
CiAKIFBsYXRmb3JtU2Nyb2xsYmFyOjp+UGxhdGZvcm1TY3JvbGxiYXIoKQpAQCAtMTA2LDExICsx
NjMsMTMgQEAgdm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQcm9wbwogCiBzdGF0
aWMgSW50UmVjdCB0cmFja1JlcGFpbnRSZWN0KGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgU2Ny
b2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRy
b2xTaXplKQogeworICAgIGNvbnN0IGludCBjQnV0dG9uTGVuZ3RoID0gKG9yaWVudGF0aW9uID09
IFZlcnRpY2FsU2Nyb2xsYmFyKSA/IGNWZXJ0aWNhbEJ1dHRvbkhlaWdodCA6IGNIb3Jpem9udGFs
QnV0dG9uV2lkdGg7CisKICAgICBJbnRSZWN0IHBhaW50UmVjdCh0cmFja1JlY3QpOwogICAgIGlm
IChvcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQotICAgICAgICBwYWludFJlY3Qu
aW5mbGF0ZVgoY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBwYWludFJlY3Qu
aW5mbGF0ZVgoY0J1dHRvbkxlbmd0aCk7CiAgICAgZWxzZQotICAgICAgICBwYWludFJlY3QuaW5m
bGF0ZVkoY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBwYWludFJlY3QuaW5m
bGF0ZVkoY0J1dHRvbkxlbmd0aCk7CiAKICAgICByZXR1cm4gcGFpbnRSZWN0OwogfQpAQCAtMTE5
LDEzICsxNzgsMTMgQEAgc3RhdGljIEludFJlY3QgYnV0dG9uUmVwYWludFJlY3QoY29uc3QgSQog
ewogICAgIEludFJlY3QgcGFpbnRSZWN0KGJ1dHRvblJlY3QpOwogICAgIGlmIChvcmllbnRhdGlv
biA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7Ci0gICAgICAgIHBhaW50UmVjdC5zZXRXaWR0aChj
UmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBwYWludFJlY3Quc2V0V2lk
dGgoY1JlYWxCdXR0b25MZW5ndGgpOwogICAgICAgICBpZiAoIXN0YXJ0KQotICAgICAgICAgICAg
cGFpbnRSZWN0LnNldFgoYnV0dG9uUmVjdC54KCkgLSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJv
bFNpemVdIC0gYnV0dG9uUmVjdC53aWR0aCgpKSk7CisgICAgICAgICAgICBwYWludFJlY3Quc2V0
WChidXR0b25SZWN0LngoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aCAtIGJ1dHRvblJlY3Qud2lkdGgo
KSkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhaW50UmVjdC5zZXRIZWlnaHQoY1JlYWxCdXR0
b25MZW5ndGhbY29udHJvbFNpemVdKTsKKyAgICAgICAgcGFpbnRSZWN0LnNldEhlaWdodChjUmVh
bEJ1dHRvbkxlbmd0aCk7CiAgICAgICAgIGlmICghc3RhcnQpCi0gICAgICAgICAgICBwYWludFJl
Y3Quc2V0WShidXR0b25SZWN0LnkoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0g
LSBidXR0b25SZWN0LmhlaWdodCgpKSk7CisgICAgICAgICAgICBwYWludFJlY3Quc2V0WShidXR0
b25SZWN0LnkoKSAtIChjUmVhbEJ1dHRvbkxlbmd0aCAtIGJ1dHRvblJlY3QuaGVpZ2h0KCkpKTsK
ICAgICB9CiAKICAgICByZXR1cm4gcGFpbnRSZWN0OwpAQCAtMjU3LDI0ICszMTYsMjIgQEAgdm9p
ZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnQoR3JhcGhpY3NDbwogCiBib29sIFBsYXRmb3JtU2Ny
b2xsYmFyOjpoYXNCdXR0b25zKCkgY29uc3QKIHsKLSAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYg
KG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IHdpZHRoKCkgOiBoZWlnaHQo
KSkgPj0gMiAqIChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSAtIGNCdXR0b25IaXRJ
bnNldFtjb250cm9sU2l6ZSgpXSk7CisgICAgcmV0dXJuIGlzRW5hYmxlZCgpICYmIChtX29yaWVu
dGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyB3aWR0aCgpIDogaGVpZ2h0KCkpID49IDIg
KiAoY1JlYWxCdXR0b25MZW5ndGggLSBjQnV0dG9uSGl0SW5zZXQpOwogfQogCiBib29sIFBsYXRm
b3JtU2Nyb2xsYmFyOjpoYXNUaHVtYigpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlzRW5hYmxlZCgp
ICYmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyB3aWR0aCgpIDogaGVp
Z2h0KCkpID49IDIgKiBjQnV0dG9uSW5zZXRbY29udHJvbFNpemUoKV0gKyBjVGh1bWJNaW5MZW5n
dGhbY29udHJvbFNpemUoKV0gKyAxOworICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gd2lkdGgoKSA6IGhlaWdodCgpKSA+PSAy
ICogY0J1dHRvbkluc2V0ICsgY1RodW1iTWluTGVuZ3RoICsgMTsKIH0KIAogSW50UmVjdCBQbGF0
Zm9ybVNjcm9sbGJhcjo6YmFja0J1dHRvblJlY3QoKSBjb25zdAogewotICAgIC8vIE91ciBkZXNp
cmVkIHJlY3QgaXMgZXNzZW50aWFsbHkgMTd4MTcuCi0gICAgCiAgICAgLy8gT3VyIGFjdHVhbCBy
ZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFjZSB3aGVuCiAgICAgLy8g
d2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhlIHNjcm9sbGJhcgogICAg
IC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlueSBzaXplcy4KICAgICBp
ZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQotICAgICAgICByZXR1cm4g
SW50UmVjdCh4KCksIHkoKSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250
YWxIZWlnaHRbY29udHJvbFNpemUoKV0pOwotICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCBj
VmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgp
XSk7CisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCBjSG9yaXpvbnRhbEJ1dHRvbldp
ZHRoLCBjSG9yaXpvbnRhbEhlaWdodCk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNW
ZXJ0aWNhbFdpZHRoLCBjVmVydGljYWxCdXR0b25IZWlnaHQpOwogfQogCiBJbnRSZWN0IFBsYXRm
b3JtU2Nyb2xsYmFyOjpmb3J3YXJkQnV0dG9uUmVjdCgpIGNvbnN0CkBAIC0yODQsMjMgKzM0MSwy
MiBAQCBJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpmb3J3YXJkQnV0dG9uCiAgICAgLy8gT3Vy
IGFjdHVhbCByZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFjZSB3aGVu
CiAgICAgLy8gd2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhlIHNjcm9s
bGJhcgogICAgIC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlueSBzaXpl
cy4KLQogICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCi0gICAg
ICAgIHJldHVybiBJbnRSZWN0KHgoKSArIHdpZHRoKCkgLSBjQnV0dG9uTGVuZ3RoW2NvbnRyb2xT
aXplKCldLCB5KCksIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0sIGNIb3Jpem9udGFsSGVp
Z2h0W2NvbnRyb2xTaXplKCldKTsKLSAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSArIGhlaWdo
dCgpIC0gY0J1dHRvbkxlbmd0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsV2lkdGhbY29udHJv
bFNpemUoKV0sIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0pOworICAgICAgICByZXR1cm4g
SW50UmVjdCh4KCkgKyB3aWR0aCgpIC0gY0hvcml6b250YWxCdXR0b25XaWR0aCwgeSgpLCBjSG9y
aXpvbnRhbEJ1dHRvbldpZHRoLCBjSG9yaXpvbnRhbEhlaWdodCk7CisgICAgcmV0dXJuIEludFJl
Y3QoeCgpLCB5KCkgKyBoZWlnaHQoKSAtIGNWZXJ0aWNhbEJ1dHRvbkhlaWdodCwgY1ZlcnRpY2Fs
V2lkdGgsIGNWZXJ0aWNhbEJ1dHRvbkhlaWdodCk7CiB9CiAKIEludFJlY3QgUGxhdGZvcm1TY3Jv
bGxiYXI6OnRyYWNrUmVjdCgpIGNvbnN0CiB7CiAgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9y
aXpvbnRhbFNjcm9sbGJhcikgewogICAgICAgICBpZiAoIWhhc0J1dHRvbnMoKSkKLSAgICAgICAg
ICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpLCB3aWR0aCgpLCBjSG9yaXpvbnRhbEhlaWdodFtj
b250cm9sU2l6ZSgpXSk7Ci0gICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSArIGNCdXR0b25MZW5n
dGhbY29udHJvbFNpemUoKV0sIHkoKSwgd2lkdGgoKSAtIDIgKiBjQnV0dG9uTGVuZ3RoW2NvbnRy
b2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9sU2l6ZSgpXSk7CisgICAgICAgICAg
ICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgd2lkdGgoKSwgY0hvcml6b250YWxIZWlnaHQpOwor
ICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyBjSG9yaXpvbnRhbEJ1dHRvbldpZHRoLCB5KCks
IHdpZHRoKCkgLSAyICogY0hvcml6b250YWxCdXR0b25XaWR0aCwgY0hvcml6b250YWxIZWlnaHQp
OwogICAgIH0KIAogICAgIGlmICghaGFzQnV0dG9ucygpKQotICAgICAgICByZXR1cm4gSW50UmVj
dCh4KCksIHkoKSwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0sIGhlaWdodCgpKTsKLSAg
ICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSArIGNCdXR0b25MZW5ndGhbY29udHJvbFNpemUoKV0s
IGNWZXJ0aWNhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBoZWlnaHQoKSAtIDIgKiBjQnV0dG9uTGVu
Z3RoW2NvbnRyb2xTaXplKCldKTsKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIGNW
ZXJ0aWNhbFdpZHRoLCBoZWlnaHQoKSk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyBj
VmVydGljYWxCdXR0b25IZWlnaHQsIGNWZXJ0aWNhbFdpZHRoLCBoZWlnaHQoKSAtIDIgKiBjVmVy
dGljYWxCdXR0b25IZWlnaHQpOwogfQogCiBJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVt
YlJlY3QoKSBjb25zdApAQCAtMzEwLDE3ICszNjYsMjIgQEAgSW50UmVjdCBQbGF0Zm9ybVNjcm9s
bGJhcjo6dGh1bWJSZWN0KCkgYwogICAgIHJldHVybiB0aHVtYlJlY3Q7CiB9CiAKK0ludFJlY3Qg
UGxhdGZvcm1TY3JvbGxiYXI6OmdyaXBwZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gSW50UmVjdCgpOworfQorCiB2b2lkIFBsYXRmb3JtU2Nyb2xs
YmFyOjpzcGxpdFRyYWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVmb3Jl
VGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0KSBj
b25zdAogewogICAgIC8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVubGVz
cyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhhdmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0aHJl
ZSByZWN0cyB3aGVyZSBhdCBsZWFzdAogICAgIC8vIG9uZSBvZiB0aGVtIGlzIG5vbi1lbXB0eS4K
ICAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0aW9uKCk7CiAgICAgaWYgKG1fb3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgewotICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0
KHRyYWNrUmVjdC54KCkgKyB0aHVtYlBvcywgdHJhY2tSZWN0LnkoKSArICh0cmFja1JlY3QuaGVp
Z2h0KCkgLSBjVGh1bWJIZWlnaHRbY29udHJvbFNpemUoKV0pIC8gMiwgdGh1bWJMZW5ndGgoKSwg
Y1RodW1iSGVpZ2h0W2NvbnRyb2xTaXplKCldKTsKKyAgICAgICAgdGh1bWJSZWN0ID0gSW50UmVj
dCh0cmFja1JlY3QueCgpICsgdGh1bWJQb3MsIHRyYWNrUmVjdC55KCkgKyAodHJhY2tSZWN0Lmhl
aWdodCgpIC0gY1RodW1iSGVpZ2h0KSAvIDIsIHRodW1iTGVuZ3RoKCksIGNUaHVtYkhlaWdodCk7
CiAgICAgICAgIGJlZm9yZVRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tS
ZWN0LnkoKSwgdGh1bWJQb3MsIHRyYWNrUmVjdC5oZWlnaHQoKSk7CiAgICAgICAgIGFmdGVyVGh1
bWJSZWN0ID0gSW50UmVjdCh0aHVtYlJlY3QueCgpICsgdGh1bWJSZWN0LndpZHRoKCksIHRyYWNr
UmVjdC55KCksIHRyYWNrUmVjdC5yaWdodCgpIC0gdGh1bWJSZWN0LnJpZ2h0KCksIHRyYWNrUmVj
dC5oZWlnaHQoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdGh1bWJSZWN0ID0gSW50UmVjdCh0
cmFja1JlY3QueCgpICsgKHRyYWNrUmVjdC53aWR0aCgpIC0gY1RodW1iV2lkdGhbY29udHJvbFNp
emUoKV0pIC8gMiwgdHJhY2tSZWN0LnkoKSArIHRodW1iUG9zLCBjVGh1bWJXaWR0aFtjb250cm9s
U2l6ZSgpXSwgdGh1bWJMZW5ndGgoKSk7CisgICAgICAgIHRodW1iUmVjdCA9IEludFJlY3QodHJh
Y2tSZWN0LngoKSArICh0cmFja1JlY3Qud2lkdGgoKSAtIGNUaHVtYldpZHRoKSAvIDIsIHRyYWNr
UmVjdC55KCkgKyB0aHVtYlBvcywgY1RodW1iV2lkdGgsIHRodW1iTGVuZ3RoKCkpOwogICAgICAg
ICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCksIHRyYWNrUmVjdC55KCks
IHRyYWNrUmVjdC53aWR0aCgpLCB0aHVtYlBvcyk7CiAgICAgICAgIGFmdGVyVGh1bWJSZWN0ID0g
SW50UmVjdCh0cmFja1JlY3QueCgpLCB0aHVtYlJlY3QueSgpICsgdGh1bWJSZWN0LmhlaWdodCgp
LCB0cmFja1JlY3Qud2lkdGgoKSwgdHJhY2tSZWN0LmJvdHRvbSgpIC0gdGh1bWJSZWN0LmJvdHRv
bSgpKTsKICAgICB9CkBAIC0zNDEsNyArNDAyLDcgQEAgaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0
aHVtYkxlbmd0aCgpIGNvbgogICAgIGZsb2F0IHByb3BvcnRpb24gPSAoZmxvYXQpKG1fdmlzaWJs
ZVNpemUpIC8gbV90b3RhbFNpemU7CiAgICAgaW50IHRyYWNrTGVuID0gdHJhY2tMZW5ndGgoKTsK
ICAgICBpbnQgbGVuZ3RoID0gcHJvcG9ydGlvbiAqIHRyYWNrTGVuOwotICAgIGludCBtaW5MZW5n
dGggPSBjVGh1bWJNaW5MZW5ndGhbY29udHJvbFNpemUoKV07CisgICAgaW50IG1pbkxlbmd0aCA9
IGNUaHVtYk1pbkxlbmd0aDsKICAgICBsZW5ndGggPSBtYXgobGVuZ3RoLCBtaW5MZW5ndGgpOwog
ICAgIGlmIChsZW5ndGggPiB0cmFja0xlbikKICAgICAgICAgbGVuZ3RoID0gMDsgLy8gT25jZSB0
aGUgdGh1bWIgaXMgYmVsb3cgdGhlIHRyYWNrIGxlbmd0aCwgaXQganVzdCBnb2VzIGF3YXkgKHRv
IG1ha2UgbW9yZSByb29tIGZvciB0aGUgdHJhY2spLgpAQCAtMzU1LDY4ICs0MTYsMTI2IEBAIGlu
dCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5ndGgoKSBjb24KIAogdm9pZCBQbGF0Zm9ybVNj
cm9sbGJhcjo6cGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRS
ZWN0JiByZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAog
ewotICAgIGlmICghU2FmYXJpVGhlbWVMaWJyYXJ5KCkpCi0gICAgICAgIHJldHVybjsKLQogICAg
IEludFJlY3QgcGFpbnRSZWN0ID0gYnV0dG9uUmVwYWludFJlY3QocmVjdCwgbV9vcmllbnRhdGlv
biwgY29udHJvbFNpemUoKSwgc3RhcnQpOwogICAgIAogICAgIGlmICghZGFtYWdlUmVjdC5pbnRl
cnNlY3RzKHBhaW50UmVjdCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIFRoZW1lUGFydCBwYXJ0
OwotICAgIFRoZW1lQ29udHJvbFN0YXRlIHN0YXRlID0gMDsKLSAgICBpZiAobV9jbGllbnQtPmlz
QWN0aXZlKCkpCi0gICAgICAgIHN0YXRlIHw9IEFjdGl2ZVN0YXRlOwotICAgIGlmIChtX29yaWVu
dGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpCi0gICAgICAgIHBhcnQgPSBzdGFydCA/IFNj
cm9sbExlZnRBcnJvd1BhcnQgOiBTY3JvbGxSaWdodEFycm93UGFydDsKLSAgICBlbHNlCi0gICAg
ICAgIHBhcnQgPSBzdGFydCA/IFNjcm9sbFVwQXJyb3dQYXJ0IDogU2Nyb2xsRG93bkFycm93UGFy
dDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gMDsKKyAgICB1bnNpZ25lZCBzdGF0ZSA9IDA7CisgICAg
dW5zaWduZWQgY2xhc3NpY1BhcnQgPSAwOworICAgIHVuc2lnbmVkIGNsYXNzaWNTdGF0ZSA9IDA7
CiAKLSAgICBpZiAoaXNFbmFibGVkKCkpCi0gICAgICAgIHN0YXRlIHw9IEVuYWJsZWRTdGF0ZTsK
LSAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgJiYgc3RhcnQpCi0gICAg
ICAgIHx8IChtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0b25QYXJ0ICYmICFzdGFydCkpCi0g
ICAgICAgIHN0YXRlIHw9IFByZXNzZWRTdGF0ZTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgc3RhdGUgPSBzdGFydCA/IEFCU19MRUZUTk9S
TUFMIDogQUJTX1JJR0hUTk9STUFMOworICAgICAgIGNsYXNzaWNQYXJ0ID0gc3RhcnQgPyBERkNT
X1NDUk9MTExFRlQgOiBERkNTX1NDUk9MTFJJR0hUOworICAgIH0gZWxzZSB7CisgICAgICAgc3Rh
dGUgPSBzdGFydCA/IEFCU19VUE5PUk1BTCA6IEFCU19ET1dOTk9STUFMOworICAgICAgIGNsYXNz
aWNQYXJ0ID0gc3RhcnQgPyBERkNTX1NDUk9MTFVQIDogREZDU19TQ1JPTExET1dOOworICAgIH0K
KworICAgIGlmICghaXNFbmFibGVkKCkpIHsKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJTX0RJU0FC
TEVfTU9ESUZJRVI7CisgICAgICAgIGNsYXNzaWNTdGF0ZSB8PSBERkNTX0lOQUNUSVZFOworICAg
IH0gZWxzZSBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblBhcnQgJiYgc3RhcnQpCisg
ICAgICAgICAgICB8fCAobV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkQnV0dG9uUGFydCAmJiAhc3Rh
cnQpKSB7CisgICAgICAgIHN0YXRlICs9IFNQX0FCU19QUkVTU0VEX01PRElGSUVSOworICAgICAg
ICBjbGFzc2ljU3RhdGUgfD0gREZDU19QVVNIRUQgfCBERkNTX0ZMQVQ7CisgICAgfSBlbHNlIGlm
IChtX2NsaWVudC0+aXNBY3RpdmUoKSkgeworICAgICAgIHN0YXRlICs9IFNQX0FCU19IT1RfTU9E
SUZJRVI7CisgICAgICAgY2xhc3NpY1N0YXRlIHw9IERGQ1NfSE9UOworICAgIH0KKworICAgIEhE
QyBoZGMgPSBwcmVwYXJlRm9yRHJhd2luZyhjb250ZXh0LCByZWN0KTsKKyAgICBSRUNUIHdpZGdl
dFJlY3QgPSByZWN0OworICAgIGNoZWNrQW5kSW5pdFNjcm9sbGJhclRoZW1lKCk7CisKKyAgICBp
ZiAoY1Njcm9sbEJhclRoZW1lKQorICAgICAgICBEcmF3VGhlbWVCYWNrZ3JvdW5kKGNTY3JvbGxC
YXJUaGVtZSwgaGRjLCBTUF9CVVRUT04sIHN0YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAg
ZWxzZQorICAgICAgICBEcmF3RnJhbWVDb250cm9sKGhkYywgJndpZGdldFJlY3QsIGNsYXNzaWNQ
YXJ0LCBjbGFzc2ljU3RhdGUpOwogCi0gICAgcGFpbnRUaGVtZVBhcnQocGFydCwgY29udGV4dC0+
cGxhdGZvcm1Db250ZXh0KCksIHBhaW50UmVjdCwgY29udHJvbFNpemUoKSA9PSBTbWFsbFNjcm9s
bGJhciA/IE5TU21hbGxDb250cm9sU2l6ZSA6IE5TUmVndWxhckNvbnRyb2xTaXplLCBzdGF0ZSk7
CisgICAgZG9uZURyYXdpbmcoY29udGV4dCwgaGRjLCByZWN0KTsKIH0KIAogdm9pZCBQbGF0Zm9y
bVNjcm9sbGJhcjo6cGFpbnRUcmFjayhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IElu
dFJlY3QmIHJlY3QsIGJvb2wgc3RhcnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0
CiB7Ci0gICAgaWYgKCFTYWZhcmlUaGVtZUxpYnJhcnkoKSkKLSAgICAgICAgcmV0dXJuOwotCiAg
ICAgSW50UmVjdCBwYWludFJlY3QgPSBoYXNCdXR0b25zKCkgPyB0cmFja1JlcGFpbnRSZWN0KHJl
Y3QsIG1fb3JpZW50YXRpb24sIGNvbnRyb2xTaXplKCkpIDogcmVjdDsKICAgICAKICAgICBpZiAo
IWRhbWFnZVJlY3QuaW50ZXJzZWN0cyhwYWludFJlY3QpKQogICAgICAgICByZXR1cm47CiAKLSAg
ICBUaGVtZVBhcnQgcGFydCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/
IEhTY3JvbGxUcmFja1BhcnQgOiBWU2Nyb2xsVHJhY2tQYXJ0OwotICAgIFRoZW1lQ29udHJvbFN0
YXRlIHN0YXRlID0gMDsKKyAgICB1bnNpZ25lZCBwYXJ0ID0gMDsKKyAgICB1bnNpZ25lZCBjbGFz
c2ljUGFydCA9IERGQ19TQ1JPTEw7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRh
bFNjcm9sbGJhcikKKyAgICAgICBwYXJ0ID0gc3RhcnQgPyBTUF9UUkFDS1NUQVJUSE9SIDogU1Bf
VFJBQ0tFTkRIT1I7CisgICAgZWxzZQorICAgICAgIHBhcnQgPSBzdGFydCA/IFNQX1RSQUNLU1RB
UlRWRVJUIDogU1BfVFJBQ0tFTkRWRVJUOworCisgICAgdW5zaWduZWQgc3RhdGUgPSBUU19ESVNB
QkxFRDsKKyAgICB1bnNpZ25lZCBjbGFzc2ljU3RhdGUgPSBERkNTX01PTk87CiAgICAgaWYgKG1f
Y2xpZW50LT5pc0FjdGl2ZSgpKQotICAgICAgICBzdGF0ZSB8PSBBY3RpdmVTdGF0ZTsKKyAgICAg
ICAgc3RhdGUgfD0gVFNfQUNUSVZFOworICAgIGVsc2UKKyAgICAgICBjbGFzc2ljU3RhdGUgfD0g
REZDU19JTkFDVElWRTsKKwogICAgIGlmIChoYXNCdXR0b25zKCkpCi0gICAgICAgIHN0YXRlIHw9
IEVuYWJsZWRTdGF0ZTsKKyAgICAgICAgc3RhdGUgfD0gVFNfTk9STUFMOworCisgICAgSERDIGhk
YyA9IHByZXBhcmVGb3JEcmF3aW5nKGNvbnRleHQsIHJlY3QpOworICAgIFJFQ1Qgd2lkZ2V0UmVj
dCA9IHJlY3Q7CisgICAgY2hlY2tBbmRJbml0U2Nyb2xsYmFyVGhlbWUoKTsKIAotICAgIHBhaW50
VGhlbWVQYXJ0KHBhcnQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwYWludFJlY3QsIGNv
bnRyb2xTaXplKCkgPT0gU21hbGxTY3JvbGxiYXIgPyBOU1NtYWxsQ29udHJvbFNpemUgOiBOU1Jl
Z3VsYXJDb250cm9sU2l6ZSwgc3RhdGUpOworICAgIGlmIChjU2Nyb2xsQmFyVGhlbWUpCisgICAg
ICAgIERyYXdUaGVtZUJhY2tncm91bmQoY1Njcm9sbEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0YXRl
LCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICBEcmF3RnJhbWVDb250cm9s
KGhkYywgJndpZGdldFJlY3QsIERGQ19TQ1JPTEwsIGNsYXNzaWNTdGF0ZSk7CisKKyAgICBkb25l
RHJhd2luZyhjb250ZXh0LCBoZGMsIHJlY3QpOwogfQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
OjpwYWludFRodW1iKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVj
dCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3QKIHsKLSAgICBpZiAoIVNhZmFyaVRo
ZW1lTGlicmFyeSgpKQotICAgICAgICByZXR1cm47Ci0KICAgICBpZiAoIWRhbWFnZVJlY3QuaW50
ZXJzZWN0cyhyZWN0KSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgVGhlbWVQYXJ0IHBhcnQgPSBt
X29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBIU2Nyb2xsVGh1bWJQYXJ0IDog
VlNjcm9sbFRodW1iUGFydDsKLSAgICBUaGVtZUNvbnRyb2xTdGF0ZSBzdGF0ZSA9IDA7CisgICAg
dW5zaWduZWQgcGFydCA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8g
U1BfVEhVTUJIT1IgOiBTUF9USFVNQlZFUlQ7CisgICAgdW5zaWduZWQgc3RhdGUgPSAwOworCisg
ICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAgc3RhdGUgKz0gU1BfQUJTX0RJU0FCTEVfTU9E
SUZJRVI7CisgICAgZWxzZSBpZiAobV9jbGllbnQtPmlzQWN0aXZlKCkpCisgICAgICAgc3RhdGUg
Kz0gU1BfQUJTX0hPVF9NT0RJRklFUjsKKworICAgIEhEQyBoZGMgPSBwcmVwYXJlRm9yRHJhd2lu
Zyhjb250ZXh0LCByZWN0KTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0OworICAgIGNoZWNr
QW5kSW5pdFNjcm9sbGJhclRoZW1lKCk7CisKKyAgICBpZiAoY1Njcm9sbEJhclRoZW1lKSB7Cisg
ICAgICAgIERyYXdUaGVtZUJhY2tncm91bmQoY1Njcm9sbEJhclRoZW1lLCBoZGMsIHBhcnQsIHN0
YXRlLCAmd2lkZ2V0UmVjdCwgTlVMTCk7CisgICAgICAgIHBhaW50R3JpcHBlcihoZGMsIHdpZGdl
dFJlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIEhHRElPQkogaFNhdmVCcnVzaCA9IFNlbGVj
dE9iamVjdChoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlRORkFDRSkpOworICAgICAgICBE
cmF3RWRnZShoZGMsICZ3aWRnZXRSZWN0LCBFREdFX1JBSVNFRCwgQkZfUkVDVCk7CisgICAgICAg
IFNlbGVjdE9iamVjdChoZGMsaFNhdmVCcnVzaCk7CisgICAgfQorCisgICAgZG9uZURyYXdpbmco
Y29udGV4dCwgaGRjLCByZWN0KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRH
cmlwcGVyKEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgdW5zaWdu
ZWQgcGFydCA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gU1BfR1JJ
UFBFUkhPUiA6IFNQX0dSSVBQRVJWRVJUOworICAgIHVuc2lnbmVkIHN0YXRlID0gMDsKKwogICAg
IGlmIChtX2NsaWVudC0+aXNBY3RpdmUoKSkKLSAgICAgICAgc3RhdGUgfD0gQWN0aXZlU3RhdGU7
Ci0gICAgaWYgKGlzRW5hYmxlZCgpKQotICAgICAgICBzdGF0ZSB8PSBFbmFibGVkU3RhdGU7Cisg
ICAgICAgIHN0YXRlIHw9IFRTX0FDVElWRTsKIAotICAgIHBhaW50VGhlbWVQYXJ0KHBhcnQsIGNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LCBjb250cm9sU2l6ZSgpID09IFNtYWxsU2Ny
b2xsYmFyID8gTlNTbWFsbENvbnRyb2xTaXplIDogTlNSZWd1bGFyQ29udHJvbFNpemUsIHN0YXRl
KTsKKyAgICBSRUNUIHdpZGdldFJlY3QgPSByZWN0OworICAgIGNoZWNrQW5kSW5pdFNjcm9sbGJh
clRoZW1lKCk7CisKKyAgICBpZiAoY1Njcm9sbEJhclRoZW1lKQorICAgICAgICBEcmF3VGhlbWVC
YWNrZ3JvdW5kKGNTY3JvbGxCYXJUaGVtZSwgaGRjLCBwYXJ0LCBzdGF0ZSwgJndpZGdldFJlY3Qs
IE5VTEwpOwogfQogCiBTY3JvbGxiYXJQYXJ0IFBsYXRmb3JtU2Nyb2xsYmFyOjpoaXRUZXN0KGNv
bnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQpAQCAtNDQ4LDYgKzU2Nyw3IEBAIFNjcm9sbGJh
clBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRlc3QKICAgICAgICAgICAgIHJldHVybiBUaHVt
YlBhcnQ7CiAgICAgICAgIHJldHVybiBGb3J3YXJkVHJhY2tQYXJ0OwogICAgIH0KKwogICAgIHJl
dHVybiBOb1BhcnQ7CiB9CiAKQEAgLTQ3Niw3ICs1OTYsNyBAQCBib29sIFBsYXRmb3JtU2Nyb2xs
YmFyOjpoYW5kbGVNb3VzZU1vdmVFCiAgICAgICAgICAgICBzZXRWYWx1ZSgoZmxvYXQpKHRodW1i
UG9zICsgZGVsdGEpICogKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkgLyAodHJhY2tMZW4g
LSB0aHVtYkxlbikpOwogICAgICAgICAgICAgbV9wcmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24o
KSAtIHRodW1iUG9zOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiB0cnVl
OwogICAgIH0KIApAQCAtNjI1LDMwICs3NDUsMjMgQEAgYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6
dGh1bWJVbmRlck1vdXNlKAogCiBpbnQgUGxhdGZvcm1TY3JvbGxiYXI6Omhvcml6b250YWxTY3Jv
bGxiYXJIZWlnaHQoU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCiB7Ci0gICAgcmV0
dXJuIGNIb3Jpem9udGFsV2lkdGhbY29udHJvbFNpemVdOworICAgIHJldHVybiBjSG9yaXpvbnRh
bFdpZHRoOwogfQogCiBpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Nyb2xsYmFyV2lk
dGgoU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCiB7Ci0gICAgcmV0dXJuIGNWZXJ0
aWNhbEhlaWdodFtjb250cm9sU2l6ZV07CisgICAgcmV0dXJuIGNWZXJ0aWNhbEhlaWdodDsKIH0K
IAogSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6d2luZG93Q2xpcFJlY3QoKSBjb25zdAogewog
ICAgIEludFJlY3QgY2xpcFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCkpOworCiAgICAgY2xp
cFJlY3QgPSBjb252ZXJ0VG9Db250YWluaW5nV2luZG93KGNsaXBSZWN0KTsKICAgICBpZiAobV9j
bGllbnQpCiAgICAgICAgIGNsaXBSZWN0LmludGVyc2VjdChtX2NsaWVudC0+d2luZG93Q2xpcFJl
Y3QoKSk7Ci0gICAgcmV0dXJuIGNsaXBSZWN0OwotfQogCi12b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
OjpwYWludEdyaXBwZXIoSERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKLXsKLX0K
LQotSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6Z3JpcHBlclJlY3QoY29uc3QgSW50UmVjdCYg
dGh1bWJSZWN0KSBjb25zdAotewotICAgIHJldHVybiBJbnRSZWN0KCk7CisgICAgcmV0dXJuIGNs
aXBSZWN0OwogfQogCiB2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVtZUNoYW5nZWQoKQpAQCAt
NjU3LDQgKzc3MCwzIEBAIHZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnRoZW1lQ2hhbmdlZCgpCiAK
IH0KIAotI2VuZGlmIC8vIGRlZmluZWQoVVNFX1NBRkFSSV9USEVNRSkK
</data>
<flag name="review"
          id="8508"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
      

    </bug>

</bugzilla>