<?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>32069</bug_id>
          
          <creation_ts>2009-12-02 09:08:38 -0800</creation_ts>
          <short_desc>Chromium: Need tickmarks in scrollbar</short_desc>
          <delta_ts>2009-12-09 11:52:42 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</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>0</everconfirmed>
          <reporter name="Avi Drissman">avi</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>fishd</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>168009</commentid>
    <comment_count>0</comment_count>
    <who name="Avi Drissman">avi</who>
    <bug_when>2009-12-02 09:08:38 -0800</bug_when>
    <thetext>Chromium draws tickmarks in the scrollbar when finding text. This needs to be done for the Mac.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168010</commentid>
    <comment_count>1</comment_count>
      <attachid>44154</attachid>
    <who name="Avi Drissman">avi</who>
    <bug_when>2009-12-02 09:11:16 -0800</bug_when>
    <thetext>Created attachment 44154
Patch to implement tickmarks

Note that in review, please compare ScrollbarThemeChromiumMac.* to ScrollbarThemeMac.*. It should be pretty self-explanatory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168011</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-02 09:11:57 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 44154 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168018</commentid>
    <comment_count>3</comment_count>
      <attachid>44156</attachid>
    <who name="Avi Drissman">avi</who>
    <bug_when>2009-12-02 09:24:20 -0800</bug_when>
    <thetext>Created attachment 44156
Now with svn cp!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168021</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-02 09:27:54 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 44156 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168024</commentid>
    <comment_count>5</comment_count>
      <attachid>44156</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-12-02 09:35:21 -0800</bug_when>
    <thetext>Comment on attachment 44156
Now with svn cp!

The code is all fine.  However, I&apos;m concerned about the forking.

It seems like it would be nice to share code with ScrollbarThemeChromium.cpp
for drawing the tickmarks and to share code with ScrollbarThemeMac.mm for
much of the other bits.

-Darin</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168028</commentid>
    <comment_count>6</comment_count>
      <attachid>44156</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-12-02 09:41:37 -0800</bug_when>
    <thetext>Comment on attachment 44156
Now with svn cp!

Avi explained why it has to be this way for now.  We have forked RenderTheme similarly.
This will eventually become a painful thing to deal with, and I&apos;m very interested in
finding a better solution.

But, for now r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168070</commentid>
    <comment_count>7</comment_count>
      <attachid>44156</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-02 11:03:31 -0800</bug_when>
    <thetext>Comment on attachment 44156
Now with svn cp!

Clearing flags on attachment: 44156

Committed r51603: &lt;http://trac.webkit.org/changeset/51603&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>168071</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-02 11:03:42 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169998</commentid>
    <comment_count>9</comment_count>
      <attachid>44538</attachid>
    <who name="Avi Drissman">avi</who>
    <bug_when>2009-12-09 07:53:06 -0800</bug_when>
    <thetext>Created attachment 44538
Patch to draw scrollbar ticks. Now with UX approval!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169999</commentid>
    <comment_count>10</comment_count>
    <who name="Avi Drissman">avi</who>
    <bug_when>2009-12-09 07:53:35 -0800</bug_when>
    <thetext>Sigh. UX says we need to draw these prettier.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170003</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-12-09 08:30:07 -0800</bug_when>
    <thetext>Avi, does that last comment imply that this patch should no longer be up for review?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170006</commentid>
    <comment_count>12</comment_count>
    <who name="Avi Drissman">avi</who>
    <bug_when>2009-12-09 08:35:43 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; Avi, does that last comment imply that this patch should no longer be up for
&gt; review?

Sorry. The latest patch, posted this morning, is what UX approved. It&apos;s up for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170017</commentid>
    <comment_count>13</comment_count>
      <attachid>44538</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-12-09 09:32:49 -0800</bug_when>
    <thetext>Comment on attachment 44538
Patch to draw scrollbar ticks. Now with UX approval!

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170020</commentid>
    <comment_count>14</comment_count>
      <attachid>44538</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-09 09:36:43 -0800</bug_when>
    <thetext>Comment on attachment 44538
Patch to draw scrollbar ticks. Now with UX approval!

Rejecting patch 44538 from commit-queue.

Unexpected failure when landing patch!  Please file a bug against bugzilla-tool.
Failed to run &quot;[&apos;WebKitTools/Scripts/bugzilla-tool&apos;, &apos;land-attachment&apos;, &apos;--force-clean&apos;, &apos;--non-interactive&apos;, &apos;--parent-command=commit-queue&apos;, &apos;--quiet&apos;, &apos;44538&apos;]&quot; exit_code: 1
Last 500 characters of output:
nd_handle_errors
    self.run()
  File &quot;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/modules/landingsequence.py&quot;, line 54, in run
    self.clean()
  File &quot;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/modules/landingsequence.py&quot;, line 81, in clean
    step.run()
  File &quot;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/modules/buildsteps.py&quot;, line 101, in run
    os.chdir(self._tool._scm.checkout_root)
AttributeError: &apos;NoneType&apos; object has no attribute &apos;checkout_root&apos;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170065</commentid>
    <comment_count>15</comment_count>
      <attachid>44538</attachid>
    <who name="Avi Drissman">avi</who>
    <bug_when>2009-12-09 11:20:19 -0800</bug_when>
    <thetext>Comment on attachment 44538
Patch to draw scrollbar ticks. Now with UX approval!

Can we try committing again?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170069</commentid>
    <comment_count>16</comment_count>
      <attachid>44538</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-09 11:22:55 -0800</bug_when>
    <thetext>Comment on attachment 44538
Patch to draw scrollbar ticks. Now with UX approval!

Rejecting patch 44538 from commit-queue.

avi@drissman.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/modules/committers.py.

- If you have committer rights please correct the error in WebKitTools/Scripts/modules/committers.py by adding yourself to the file (no review needed) and then set the committer flag again.

- If you do not have committer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170079</commentid>
    <comment_count>17</comment_count>
      <attachid>44538</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-12-09 11:37:15 -0800</bug_when>
    <thetext>Comment on attachment 44538
Patch to draw scrollbar ticks. Now with UX approval!

Sorry for the noise.  Adam believes to have fixed the issue.  I&apos;ve restarted the commit bot.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170086</commentid>
    <comment_count>18</comment_count>
      <attachid>44538</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-09 11:52:36 -0800</bug_when>
    <thetext>Comment on attachment 44538
Patch to draw scrollbar ticks. Now with UX approval!

Clearing flags on attachment: 44538

Committed r51909: &lt;http://trac.webkit.org/changeset/51909&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>170087</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2009-12-09 11:52:42 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44154</attachid>
            <date>2009-12-02 09:11:16 -0800</date>
            <delta_ts>2009-12-02 09:24:20 -0800</delta_ts>
            <desc>Patch to implement tickmarks</desc>
            <filename>scroll.patch</filename>
            <type>text/plain</type>
            <size>25323</size>
            <attacher name="Avi Drissman">avi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MTYwMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMDktMTItMDIgIEF2aSBEcmlzc21hbiAgPGF2aUBjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hy
b21pdW06IE5lZWQgdGlja21hcmtzIGluIHNjcm9sbGJhcgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzIwNjkKKworICAgICAgICAqIFdlYkNvcmUuZ3lw
L1dlYkNvcmUuZ3lwOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBwbGF0Zm9y
bS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjLmg6IEFkZGVkLgorICAgICAgICAq
IHBsYXRmb3JtL2Nocm9taXVtL1Njcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMubW06IEFkZGVkLgor
CiAyMDA5LTEyLTAxICBEYXZlIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IERhbiBCZXJuc3RlaW4uCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNTE2MDApCisrKyBXZWJD
b3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtMTg3OSw2ICsxODc5LDggQEAKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVtLmNwcCcs
CiAgICAgICAgICAgICAncGxhdGZvcm0vY2hyb21pdW0vU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bS5o
JywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVt
TGludXguY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVt
ZUNocm9taXVtTWFjLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1Njcm9sbGJh
clRoZW1lQ2hyb21pdW1NYWMubW0nLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1Nj
cm9sbGJhclRoZW1lQ2hyb21pdW1XaW4uY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJv
bWl1bS9TZWFyY2hQb3B1cE1lbnVDaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3Jt
L2Nocm9taXVtL1NoYXJlZFRpbWVyQ2hyb21pdW0uY3BwJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29y
ZS5neXAvV2ViQ29yZS5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJD
b3JlLmd5cAkocmV2aXNpb24gNTE2MDApCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUu
Z3lwCSh3b3JraW5nIGNvcHkpCkBAIC05MDksNyArOTA5LDYgQEAKICAgICAgICAgICAgIFsnaW5j
bHVkZScsICdwbGF0Zm9ybS9tYWMvQmxvY2tFeGNlcHRpb25zXFwubW0kJ10sCiAgICAgICAgICAg
ICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vbWFjL0xvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dFxc
Lm1tJCddLAogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL21hYy9QdXJnZWFibGVC
dWZmZXJNYWNcXC5jcHAkJ10sCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vbWFj
L1Njcm9sbGJhclRoZW1lTWFjXFwubW0kJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxh
dGZvcm0vbWFjL1dlYkNvcmVTeXN0ZW1JbnRlcmZhY2VcXC5tbSQnXSwKICAgICAgICAgICAgIFsn
aW5jbHVkZScsICdwbGF0Zm9ybS9tYWMvV2ViQ29yZVRleHRSZW5kZXJlclxcLm1tJCddLAogICAg
ICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL3RleHQvbWFjL1NoYXBlQXJhYmljXFwuYyQn
XSwKQEAgLTkyNCw4ICs5MjMsOCBAQAogICAgICAgICAgICAgIyBwbGF0Zm9ybS9ncmFwaGljcy9t
YWMsIGluY2x1ZGVkIGJ5IHJlZ2V4IGFib3ZlLCBpbnN0ZWFkLgogICAgICAgICAgICAgJy4uL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDdXN0b21QbGF0Zm9ybURhdGEuY3BwJywKIAot
ICAgICAgICAgICAgIyBUaGUgTWFjIGN1cnJlbnRseSB1c2VzIFNjcm9sbGJhclRoZW1lTWFjLm1t
LCBpbmNsdWRlZCBieSByZWdleAotICAgICAgICAgICAgIyBhYm92ZSwgaW5zdGVhZCBvZiBTY3Jv
bGxiYXJUaGVtZUNocm9taXVtLmNwcC4KKyAgICAgICAgICAgICMgVGhlIE1hYyBjdXJyZW50bHkg
dXNlcyBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjLm1tLCB3aGljaCBpcyBub3QKKyAgICAgICAg
ICAgICMgcmVsYXRlZCB0byBTY3JvbGxiYXJUaGVtZUNocm9taXVtLmNwcC4KICAgICAgICAgICAg
ICcuLi9wbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVtLmNwcCcsCiAKICAg
ICAgICAgICAgICMgVGhlIE1hYyB1c2VzIEltYWdlU291cmNlQ0cuY3BwIGZyb20gcGxhdGZvcm0v
Z3JhcGhpY3MvY2csIGluY2x1ZGVkCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1Nj
cm9sbGJhclRoZW1lQ2hyb21pdW1NYWMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2Nocm9taXVtL1Njcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMuaAkocmV2aXNpb24gMCkKKysrIFdl
YkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYy5oCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxl
IEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUg
SW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaWZuZGVmIFNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWNfaAorI2RlZmlu
ZSBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjX2gKKworI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1l
Q29tcG9zaXRlLmgiCisKKy8vIFRoaXMgZmlsZSAoYW5kIGl0cyBhc3NvY2lhdGVkIC5tbSBmaWxl
KSBpcyBhIGNsb25lIG9mIFNjcm9sbGJhclRoZW1lTWFjLmguCisvLyBTZWUgdGhlIC5tbSBmaWxl
IGZvciBkZXRhaWxzLgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFNjcm9sbGJhclRo
ZW1lQ2hyb21pdW1NYWMgOiBwdWJsaWMgU2Nyb2xsYmFyVGhlbWVDb21wb3NpdGUgeworcHVibGlj
OgorICAgIFNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMoKTsKKyAgICB2aXJ0dWFsIH5TY3JvbGxi
YXJUaGVtZUNocm9taXVtTWFjKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnQoU2Nyb2xsYmFy
KiwgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KTsK
KworICAgIHZpcnR1YWwgaW50IHNjcm9sbGJhclRoaWNrbmVzcyhTY3JvbGxiYXJDb250cm9sU2l6
ZSA9IFJlZ3VsYXJTY3JvbGxiYXIpOworCisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzQ29udHJv
bFRpbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCBkb3VibGUgaW5p
dGlhbEF1dG9zY3JvbGxUaW1lckRlbGF5KCk7CisgICAgdmlydHVhbCBkb3VibGUgYXV0b3Njcm9s
bFRpbWVyRGVsYXkoKTsKKworICAgIHZpcnR1YWwgU2Nyb2xsYmFyQnV0dG9uc1BsYWNlbWVudCBi
dXR0b25zUGxhY2VtZW50KCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJTY3Jv
bGxiYXIoU2Nyb2xsYmFyKik7CisgICAgdmlydHVhbCB2b2lkIHVucmVnaXN0ZXJTY3JvbGxiYXIo
U2Nyb2xsYmFyKik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgaGFzQnV0dG9ucyhT
Y3JvbGxiYXIqKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzVGh1bWIoU2Nyb2xsYmFyKik7CisKKyAg
ICB2aXJ0dWFsIEludFJlY3QgYmFja0J1dHRvblJlY3QoU2Nyb2xsYmFyKiwgU2Nyb2xsYmFyUGFy
dCwgYm9vbCBwYWludGluZyA9IGZhbHNlKTsKKyAgICB2aXJ0dWFsIEludFJlY3QgZm9yd2FyZEJ1
dHRvblJlY3QoU2Nyb2xsYmFyKiwgU2Nyb2xsYmFyUGFydCwgYm9vbCBwYWludGluZyA9IGZhbHNl
KTsKKyAgICB2aXJ0dWFsIEludFJlY3QgdHJhY2tSZWN0KFNjcm9sbGJhciosIGJvb2wgcGFpbnRp
bmcgPSBmYWxzZSk7CisKKyAgICB2aXJ0dWFsIGludCBtaW5pbXVtVGh1bWJMZW5ndGgoU2Nyb2xs
YmFyKik7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkQ2VudGVyT25UaHVtYihTY3JvbGxiYXIq
LCBjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKworcHVibGljOgorICAgIHZvaWQgcHJlZmVy
ZW5jZXNDaGFuZ2VkKCk7Cit9OworCit9CisKKyNlbmRpZiAvLyBTY3JvbGxiYXJUaGVtZUNocm9t
aXVtTWFjX2gKClByb3BlcnR5IGNoYW5nZXMgb246IFdlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0v
U2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYy5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTmFtZTogc3ZuOmVvbC1zdHls
ZQogICArIExGCgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVt
ZUNocm9taXVtTWFjLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0v
U2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYy5tbQkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vY2hyb21pdW0vU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYy5tbQkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBB
bGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFs
bCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZUNocm9t
aXVtTWFjLmgiCisKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlBsYXRmb3Jt
TW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlNjcm9sbFZpZXcuaCIKKyNpbmNsdWRlIDxDYXJib24v
Q2FyYm9uLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9V
bnVzZWRQYXJhbS5oPgorCisvLyBGSVhNRTogVGhlcmUgYXJlIHJlcGFpbnRpbmcgcHJvYmxlbXMg
ZHVlIHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25zJyB2aXN1YWwgb3ZlcmZsb3cuCisKK3VzaW5n
IG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworLy8gVGhpcyBmaWxl
IChhbmQgaXRzIGFzc29jaWF0ZWQgLmggZmlsZSkgaXMgYSBjbG9uZSBvZiBTY3JvbGxiYXJUaGVt
ZU1hYy5tbS4KKy8vIEJlY2F1c2Ugd2Ugd2FudCB0byBkcmF3IHRpY2ttYXJrcyBpbiB0aGUgc2Ny
b2xsYmFyLCB3ZSBtdXN0IG1haW50YWluIGEgZm9yay4KKy8vIFBsZWFzZSBtYWludGFpbiB0aGlz
IGZpbGUgYnkgcGVyZm9ybWluZyBwYXJhbGxlbCBjaGFuZ2VzIHRvIGl0LgorLy8KKy8vIFRoZSBv
bmx5IGNoYW5nZXMgZnJvbSBTY3JvbGxiYXJUaGVtZU1hYyBzaG91bGQgYmU6CisvLyAtIFRoZSBj
bGFzc25hbWUgY2hhbmdlIGZyb20gU2Nyb2xsYmFyVGhlbWVNYWMgdG8gU2Nyb2xsYmFyVGhlbWVD
aHJvbWl1bU1hYy4KKy8vIC0gSW4gcGFpbnQoKSB0aGUgY29kZSB0byBwYWludCB0aGUgdHJhY2ss
IHRpY2ttYXJrcywgYW5kIHRodW1iIHNlcGFyYXRlbHkuCisvLworLy8gRm9yIGFsbCBvdGhlciBk
aWZmZXJlbmNlcywgaWYgaXQgd2FzIGludHJvZHVjZWQgaW4gdGhpcyBmaWxlLCB0aGVuIHRoZQor
Ly8gbWFpbnRhaW5lciBmb3Jnb3QgdG8gaW5jbHVkZSBpdCBpbiB0aGUgbGlzdDsgb3RoZXJ3aXNl
IGl0IGlzIGFuIHVwZGF0ZSB0aGF0CisvLyBzaG91bGQgaGF2ZSBiZWVuIGFwcGxpZWQgdG8gdGhp
cyBmaWxlIGJ1dCB3YXMgbm90LgorCitzdGF0aWMgSGFzaFNldDxTY3JvbGxiYXIqPiogZ1Njcm9s
bGJhcnM7CisKK0BpbnRlcmZhY2UgU2Nyb2xsYmFyUHJlZnNPYnNlcnZlciA6IE5TT2JqZWN0Cit7
CisKK30KKworKyAodm9pZClyZWdpc3RlckFzT2JzZXJ2ZXI7CisrICh2b2lkKWFwcGVhcmFuY2VQ
cmVmc0NoYW5nZWQ6KE5TTm90aWZpY2F0aW9uKil0aGVOb3RpZmljYXRpb247CisrICh2b2lkKWJl
aGF2aW9yUHJlZnNDaGFuZ2VkOihOU05vdGlmaWNhdGlvbiopdGhlTm90aWZpY2F0aW9uOworCitA
ZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTY3JvbGxiYXJQcmVmc09ic2VydmVyCisKKysgKHZvaWQp
YXBwZWFyYW5jZVByZWZzQ2hhbmdlZDooTlNOb3RpZmljYXRpb24qKXVudXNlZE5vdGlmaWNhdGlv
bgoreworICAgIFVOVVNFRF9QQVJBTSh1bnVzZWROb3RpZmljYXRpb24pOworCisgICAgc3RhdGlj
X2Nhc3Q8U2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYyo+KFNjcm9sbGJhclRoZW1lOjpuYXRpdmVU
aGVtZSgpKS0+cHJlZmVyZW5jZXNDaGFuZ2VkKCk7CisgICAgaWYgKCFnU2Nyb2xsYmFycykKKyAg
ICAgICAgcmV0dXJuOworICAgIEhhc2hTZXQ8U2Nyb2xsYmFyKj46Oml0ZXJhdG9yIGVuZCA9IGdT
Y3JvbGxiYXJzLT5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8U2Nyb2xsYmFyKj46Oml0ZXJhdG9y
IGl0ID0gZ1Njcm9sbGJhcnMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAo
Kml0KS0+c3R5bGVDaGFuZ2VkKCk7CisgICAgICAgICgqaXQpLT5pbnZhbGlkYXRlKCk7CisgICAg
fQorfQorCisrICh2b2lkKWJlaGF2aW9yUHJlZnNDaGFuZ2VkOihOU05vdGlmaWNhdGlvbiopdW51
c2VkTm90aWZpY2F0aW9uCit7CisgICAgVU5VU0VEX1BBUkFNKHVudXNlZE5vdGlmaWNhdGlvbik7
CisKKyAgICBzdGF0aWNfY2FzdDxTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjKj4oU2Nyb2xsYmFy
VGhlbWU6Om5hdGl2ZVRoZW1lKCkpLT5wcmVmZXJlbmNlc0NoYW5nZWQoKTsKK30KKworKyAodm9p
ZClyZWdpc3RlckFzT2JzZXJ2ZXIKK3sKKyAgICBbW05TRGlzdHJpYnV0ZWROb3RpZmljYXRpb25D
ZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6c2VsZiBzZWxlY3RvcjpAc2VsZWN0b3Io
YXBwZWFyYW5jZVByZWZzQ2hhbmdlZDopIG5hbWU6QCJBcHBsZUFxdWFTY3JvbGxCYXJWYXJpYW50
Q2hhbmdlZCIgb2JqZWN0Om5pbCBzdXNwZW5zaW9uQmVoYXZpb3I6TlNOb3RpZmljYXRpb25TdXNw
ZW5zaW9uQmVoYXZpb3JEZWxpdmVySW1tZWRpYXRlbHldOworICAgIFtbTlNEaXN0cmlidXRlZE5v
dGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjpzZWxmIHNlbGVjdG9y
OkBzZWxlY3RvcihiZWhhdmlvclByZWZzQ2hhbmdlZDopIG5hbWU6QCJBcHBsZU5vUmVkaXNwbGF5
QXBwZWFyYW5jZVByZWZlcmVuY2VDaGFuZ2VkIiBvYmplY3Q6bmlsIHN1c3BlbnNpb25CZWhhdmlv
cjpOU05vdGlmaWNhdGlvblN1c3BlbnNpb25CZWhhdmlvckNvYWxlc2NlXTsKK30KKworQGVuZAor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Njcm9sbGJhclRoZW1lKiBTY3JvbGxiYXJUaGVtZTo6
bmF0aXZlVGhlbWUoKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoU2Nyb2xsYmFyVGhlbWVD
aHJvbWl1bU1hYywgdGhlbWUsICgpKTsKKyAgICByZXR1cm4gJnRoZW1lOworfQorCisvLyBGSVhN
RTogR2V0IHRoZXNlIG51bWJlcnMgZnJvbSBDb3JlVUkuCitzdGF0aWMgaW50IGNTY3JvbGxiYXJU
aGlja25lc3NbXSA9IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNSZWFsQnV0dG9uTGVuZ3RoW10g
PSB7IDI4LCAyMSB9Oworc3RhdGljIGludCBjQnV0dG9uSW5zZXRbXSA9IHsgMTQsIDExIH07Citz
dGF0aWMgaW50IGNCdXR0b25IaXRJbnNldFtdID0geyAzLCAyIH07CisvLyBjUmVhbEJ1dHRvbkxl
bmd0aCAtIGNCdXR0b25JbnNldAorc3RhdGljIGludCBjQnV0dG9uTGVuZ3RoW10gPSB7IDE0LCAx
MCB9Oworc3RhdGljIGludCBjVGh1bWJNaW5MZW5ndGhbXSA9IHsgMjYsIDIwIH07CisKK3N0YXRp
YyBpbnQgY091dGVyQnV0dG9uTGVuZ3RoW10gPSB7IDE2LCAxNCB9OyAvLyBUaGUgb3V0ZXIgYnV0
dG9uIGluIGEgZG91YmxlIGJ1dHRvbiBwYWlyIGlzIGEgYml0IGJpZ2dlci4KK3N0YXRpYyBpbnQg
Y091dGVyQnV0dG9uT3ZlcmxhcCA9IDI7CisKK3N0YXRpYyBmbG9hdCBnSW5pdGlhbEJ1dHRvbkRl
bGF5ID0gMC41ZjsKK3N0YXRpYyBmbG9hdCBnQXV0b3Njcm9sbEJ1dHRvbkRlbGF5ID0gMC4wNWY7
CitzdGF0aWMgYm9vbCBnSnVtcE9uVHJhY2tDbGljayA9IGZhbHNlOworc3RhdGljIFNjcm9sbGJh
ckJ1dHRvbnNQbGFjZW1lbnQgZ0J1dHRvblBsYWNlbWVudCA9IFNjcm9sbGJhckJ1dHRvbnNEb3Vi
bGVFbmQ7CisKK3N0YXRpYyB2b2lkIHVwZGF0ZUFycm93UGxhY2VtZW50KCkKK3sKKyAgICBOU1N0
cmluZyAqYnV0dG9uUGxhY2VtZW50ID0gW1tOU1VzZXJEZWZhdWx0cyBzdGFuZGFyZFVzZXJEZWZh
dWx0c10gb2JqZWN0Rm9yS2V5OkAiQXBwbGVTY3JvbGxCYXJWYXJpYW50Il07CisgICAgaWYgKFti
dXR0b25QbGFjZW1lbnQgaXNFcXVhbFRvU3RyaW5nOkAiU2luZ2xlIl0pCisgICAgICAgIGdCdXR0
b25QbGFjZW1lbnQgPSBTY3JvbGxiYXJCdXR0b25zU2luZ2xlOworICAgIGVsc2UgaWYgKFtidXR0
b25QbGFjZW1lbnQgaXNFcXVhbFRvU3RyaW5nOkAiRG91YmxlTWluIl0pCisgICAgICAgIGdCdXR0
b25QbGFjZW1lbnQgPSBTY3JvbGxiYXJCdXR0b25zRG91YmxlU3RhcnQ7CisgICAgZWxzZSBpZiAo
W2J1dHRvblBsYWNlbWVudCBpc0VxdWFsVG9TdHJpbmc6QCJEb3VibGVCb3RoIl0pCisgICAgICAg
IGdCdXR0b25QbGFjZW1lbnQgPSBTY3JvbGxiYXJCdXR0b25zRG91YmxlQm90aDsKKyAgICBlbHNl
CisgICAgICAgIGdCdXR0b25QbGFjZW1lbnQgPSBTY3JvbGxiYXJCdXR0b25zRG91YmxlRW5kOyAv
LyBUaGUgZGVmYXVsdCBpcyBTY3JvbGxiYXJCdXR0b25zRG91YmxlRW5kLgorfQorCit2b2lkIFNj
cm9sbGJhclRoZW1lQ2hyb21pdW1NYWM6OnJlZ2lzdGVyU2Nyb2xsYmFyKFNjcm9sbGJhciogc2Ny
b2xsYmFyKQoreworICAgIGlmICghZ1Njcm9sbGJhcnMpCisgICAgICAgIGdTY3JvbGxiYXJzID0g
bmV3IEhhc2hTZXQ8U2Nyb2xsYmFyKj47CisgICAgZ1Njcm9sbGJhcnMtPmFkZChzY3JvbGxiYXIp
OworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWM6OnVucmVnaXN0ZXJTY3JvbGxi
YXIoU2Nyb2xsYmFyKiBzY3JvbGxiYXIpCit7CisgICAgZ1Njcm9sbGJhcnMtPnJlbW92ZShzY3Jv
bGxiYXIpOworICAgIGlmIChnU2Nyb2xsYmFycy0+aXNFbXB0eSgpKSB7CisgICAgICAgIGRlbGV0
ZSBnU2Nyb2xsYmFyczsKKyAgICAgICAgZ1Njcm9sbGJhcnMgPSAwOworICAgIH0KK30KKworU2Ny
b2xsYmFyVGhlbWVDaHJvbWl1bU1hYzo6U2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYygpCit7Cisg
ICAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQ7CisgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAg
ICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIFtTY3JvbGxiYXJQcmVmc09ic2VydmVy
IHJlZ2lzdGVyQXNPYnNlcnZlcl07CisgICAgICAgIHByZWZlcmVuY2VzQ2hhbmdlZCgpOworICAg
IH0KK30KKworU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYzo6flNjcm9sbGJhclRoZW1lQ2hyb21p
dW1NYWMoKQoreworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWM6OnByZWZlcmVu
Y2VzQ2hhbmdlZCgpCit7CisgICAgTlNVc2VyRGVmYXVsdHMgKmRlZmF1bHRzID0gW05TVXNlckRl
ZmF1bHRzIHN0YW5kYXJkVXNlckRlZmF1bHRzXTsKKyAgICBbZGVmYXVsdHMgc3luY2hyb25pemVd
OworICAgIHVwZGF0ZUFycm93UGxhY2VtZW50KCk7CisgICAgZ0luaXRpYWxCdXR0b25EZWxheSA9
IFtkZWZhdWx0cyBmbG9hdEZvcktleTpAIk5TU2Nyb2xsZXJCdXR0b25EZWxheSJdOworICAgIGdB
dXRvc2Nyb2xsQnV0dG9uRGVsYXkgPSBbZGVmYXVsdHMgZmxvYXRGb3JLZXk6QCJOU1Njcm9sbGVy
QnV0dG9uUGVyaW9kIl07CisgICAgZ0p1bXBPblRyYWNrQ2xpY2sgPSBbZGVmYXVsdHMgYm9vbEZv
cktleTpAIkFwcGxlU2Nyb2xsZXJQYWdpbmdCZWhhdmlvciJdOworfQorCitpbnQgU2Nyb2xsYmFy
VGhlbWVDaHJvbWl1bU1hYzo6c2Nyb2xsYmFyVGhpY2tuZXNzKFNjcm9sbGJhckNvbnRyb2xTaXpl
IGNvbnRyb2xTaXplKQoreworICAgIHJldHVybiBjU2Nyb2xsYmFyVGhpY2tuZXNzW2NvbnRyb2xT
aXplXTsKK30KKworZG91YmxlIFNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWM6OmluaXRpYWxBdXRv
c2Nyb2xsVGltZXJEZWxheSgpCit7CisgICAgcmV0dXJuIGdJbml0aWFsQnV0dG9uRGVsYXk7Cit9
CisKK2RvdWJsZSBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjOjphdXRvc2Nyb2xsVGltZXJEZWxh
eSgpCit7CisgICAgcmV0dXJuIGdBdXRvc2Nyb2xsQnV0dG9uRGVsYXk7Cit9CisKK1Njcm9sbGJh
ckJ1dHRvbnNQbGFjZW1lbnQgU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYzo6YnV0dG9uc1BsYWNl
bWVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdCdXR0b25QbGFjZW1lbnQ7Cit9CisKK2Jvb2wg
U2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYzo6aGFzQnV0dG9ucyhTY3JvbGxiYXIqIHNjcm9sbGJh
cikKK3sKKyAgICByZXR1cm4gc2Nyb2xsYmFyLT5lbmFibGVkKCkgJiYgKHNjcm9sbGJhci0+b3Jp
ZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8KKyAgICAgICAgICAgICBzY3JvbGxi
YXItPndpZHRoKCkgOgorICAgICAgICAgICAgIHNjcm9sbGJhci0+aGVpZ2h0KCkpID49IDIgKiAo
Y1JlYWxCdXR0b25MZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpXSAtIGNCdXR0b25IaXRJ
bnNldFtzY3JvbGxiYXItPmNvbnRyb2xTaXplKCldKTsKK30KKworYm9vbCBTY3JvbGxiYXJUaGVt
ZUNocm9taXVtTWFjOjpoYXNUaHVtYihTY3JvbGxiYXIqIHNjcm9sbGJhcikKK3sKKyAgICByZXR1
cm4gc2Nyb2xsYmFyLT5lbmFibGVkKCkgJiYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyID8KKyAgICAgICAgICAgICBzY3JvbGxiYXItPndpZHRoKCkgOgor
ICAgICAgICAgICAgIHNjcm9sbGJhci0+aGVpZ2h0KCkpID49IDIgKiBjQnV0dG9uSW5zZXRbc2Ny
b2xsYmFyLT5jb250cm9sU2l6ZSgpXSArIGNUaHVtYk1pbkxlbmd0aFtzY3JvbGxiYXItPmNvbnRy
b2xTaXplKCldICsgMTsKK30KKworc3RhdGljIEludFJlY3QgYnV0dG9uUmVwYWludFJlY3QoY29u
c3QgSW50UmVjdCYgYnV0dG9uUmVjdCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24s
IFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXplLCBib29sIHN0YXJ0KQoreworICAgIElu
dFJlY3QgcGFpbnRSZWN0KGJ1dHRvblJlY3QpOworICAgIGlmIChvcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIHBhaW50UmVjdC5zZXRXaWR0aChjUmVhbEJ1dHRv
bkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAgICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAg
cGFpbnRSZWN0LnNldFgoYnV0dG9uUmVjdC54KCkgLSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJv
bFNpemVdIC0gYnV0dG9uUmVjdC53aWR0aCgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFp
bnRSZWN0LnNldEhlaWdodChjUmVhbEJ1dHRvbkxlbmd0aFtjb250cm9sU2l6ZV0pOworICAgICAg
ICBpZiAoIXN0YXJ0KQorICAgICAgICAgICAgcGFpbnRSZWN0LnNldFkoYnV0dG9uUmVjdC55KCkg
LSAoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemVdIC0gYnV0dG9uUmVjdC5oZWlnaHQoKSkp
OworICAgIH0KKworICAgIHJldHVybiBwYWludFJlY3Q7Cit9CisKK0ludFJlY3QgU2Nyb2xsYmFy
VGhlbWVDaHJvbWl1bU1hYzo6YmFja0J1dHRvblJlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIFNj
cm9sbGJhclBhcnQgcGFydCwgYm9vbCBwYWludGluZykKK3sKKyAgICBJbnRSZWN0IHJlc3VsdDsK
KworICAgIGlmIChwYXJ0ID09IEJhY2tCdXR0b25TdGFydFBhcnQgJiYgKGJ1dHRvbnNQbGFjZW1l
bnQoKSA9PSBTY3JvbGxiYXJCdXR0b25zTm9uZSB8fCBidXR0b25zUGxhY2VtZW50KCkgPT0gU2Ny
b2xsYmFyQnV0dG9uc0RvdWJsZUVuZCkpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICBp
ZiAocGFydCA9PSBCYWNrQnV0dG9uRW5kUGFydCAmJiAoYnV0dG9uc1BsYWNlbWVudCgpID09IFNj
cm9sbGJhckJ1dHRvbnNOb25lIHx8IGJ1dHRvbnNQbGFjZW1lbnQoKSA9PSBTY3JvbGxiYXJCdXR0
b25zRG91YmxlU3RhcnQgfHwgYnV0dG9uc1BsYWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNT
aW5nbGUpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgaW50IHRoaWNrbmVzcyA9IHNj
cm9sbGJhclRoaWNrbmVzcyhzY3JvbGxiYXItPmNvbnRyb2xTaXplKCkpOworICAgIGJvb2wgb3V0
ZXJCdXR0b24gPSBwYXJ0ID09IEJhY2tCdXR0b25TdGFydFBhcnQgJiYgKGJ1dHRvbnNQbGFjZW1l
bnQoKSA9PSBTY3JvbGxiYXJCdXR0b25zRG91YmxlU3RhcnQgfHwgYnV0dG9uc1BsYWNlbWVudCgp
ID09IFNjcm9sbGJhckJ1dHRvbnNEb3VibGVCb3RoKTsKKyAgICBpZiAob3V0ZXJCdXR0b24pIHsK
KyAgICAgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyKQorICAgICAgICAgICAgcmVzdWx0ID0gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc2Nyb2xs
YmFyLT55KCksIGNPdXRlckJ1dHRvbkxlbmd0aFtzY3JvbGxiYXItPmNvbnRyb2xTaXplKCldICsg
cGFpbnRpbmcgPyBjT3V0ZXJCdXR0b25PdmVybGFwIDogMCwgdGhpY2tuZXNzKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc2Nyb2xs
YmFyLT55KCksIHRoaWNrbmVzcywgY091dGVyQnV0dG9uTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJv
bFNpemUoKV0gKyBwYWludGluZyA/IGNPdXRlckJ1dHRvbk92ZXJsYXAgOiAwKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBPdXIgcmVwYWludCByZWN0IGlzIHNsaWdo
dGx5IGxhcmdlciwgc2luY2Ugd2UgYXJlIGEgYnV0dG9uIHRoYXQgaXMgYWRqYWNlbnQgdG8gdGhl
IHRyYWNrLgorICAgIGlmIChzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNj
cm9sbGJhcikgeworICAgICAgICBpbnQgc3RhcnQgPSBwYXJ0ID09IEJhY2tCdXR0b25TdGFydFBh
cnQgPyBzY3JvbGxiYXItPngoKSA6IHNjcm9sbGJhci0+eCgpICsgc2Nyb2xsYmFyLT53aWR0aCgp
IC0gY091dGVyQnV0dG9uTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV0gLSBjQnV0dG9u
TGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV07CisgICAgICAgIHJlc3VsdCA9IEludFJl
Y3Qoc3RhcnQsIHNjcm9sbGJhci0+eSgpLCBjQnV0dG9uTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJv
bFNpemUoKV0sIHRoaWNrbmVzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHN0YXJ0ID0g
cGFydCA9PSBCYWNrQnV0dG9uU3RhcnRQYXJ0ID8gc2Nyb2xsYmFyLT55KCkgOiBzY3JvbGxiYXIt
PnkoKSArIHNjcm9sbGJhci0+aGVpZ2h0KCkgLSBjT3V0ZXJCdXR0b25MZW5ndGhbc2Nyb2xsYmFy
LT5jb250cm9sU2l6ZSgpXSAtIGNCdXR0b25MZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgp
XTsKKyAgICAgICAgcmVzdWx0ID0gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc3RhcnQsIHRoaWNr
bmVzcywgY0J1dHRvbkxlbmd0aFtzY3JvbGxiYXItPmNvbnRyb2xTaXplKCldKTsKKyAgICB9CisK
KyAgICBpZiAocGFpbnRpbmcpCisgICAgICAgIHJldHVybiBidXR0b25SZXBhaW50UmVjdChyZXN1
bHQsIHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSwgc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpLCBw
YXJ0ID09IEJhY2tCdXR0b25TdGFydFBhcnQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0lu
dFJlY3QgU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYzo6Zm9yd2FyZEJ1dHRvblJlY3QoU2Nyb2xs
YmFyKiBzY3JvbGxiYXIsIFNjcm9sbGJhclBhcnQgcGFydCwgYm9vbCBwYWludGluZykKK3sKKyAg
ICBJbnRSZWN0IHJlc3VsdDsKKworICAgIGlmIChwYXJ0ID09IEZvcndhcmRCdXR0b25FbmRQYXJ0
ICYmIChidXR0b25zUGxhY2VtZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc05vbmUgfHwgYnV0dG9u
c1BsYWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNEb3VibGVTdGFydCkpCisgICAgICAgIHJl
dHVybiByZXN1bHQ7CisKKyAgICBpZiAocGFydCA9PSBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0ICYm
IChidXR0b25zUGxhY2VtZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc05vbmUgfHwgYnV0dG9uc1Bs
YWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNEb3VibGVFbmQgfHwgYnV0dG9uc1BsYWNlbWVu
dCgpID09IFNjcm9sbGJhckJ1dHRvbnNTaW5nbGUpKQorICAgICAgICByZXR1cm4gcmVzdWx0Owor
CisgICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcyhzY3JvbGxiYXItPmNvbnRy
b2xTaXplKCkpOworICAgIGludCBvdXRlckJ1dHRvbkxlbmd0aCA9IGNPdXRlckJ1dHRvbkxlbmd0
aFtzY3JvbGxiYXItPmNvbnRyb2xTaXplKCldOworICAgIGludCBidXR0b25MZW5ndGggPSBjQnV0
dG9uTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV07CisKKyAgICBib29sIG91dGVyQnV0
dG9uID0gcGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCAmJiAoYnV0dG9uc1BsYWNlbWVudCgp
ID09IFNjcm9sbGJhckJ1dHRvbnNEb3VibGVFbmQgfHwgYnV0dG9uc1BsYWNlbWVudCgpID09IFNj
cm9sbGJhckJ1dHRvbnNEb3VibGVCb3RoKTsKKyAgICBpZiAob3V0ZXJCdXR0b24pIHsKKyAgICAg
ICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7
CisgICAgICAgICAgICByZXN1bHQgPSBJbnRSZWN0KHNjcm9sbGJhci0+eCgpICsgc2Nyb2xsYmFy
LT53aWR0aCgpIC0gb3V0ZXJCdXR0b25MZW5ndGgsIHNjcm9sbGJhci0+eSgpLCBvdXRlckJ1dHRv
bkxlbmd0aCwgdGhpY2tuZXNzKTsKKyAgICAgICAgICAgIGlmIChwYWludGluZykKKyAgICAgICAg
ICAgICAgICByZXN1bHQuaW5mbGF0ZVgoY091dGVyQnV0dG9uT3ZlcmxhcCk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBJbnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3Jv
bGxiYXItPnkoKSArIHNjcm9sbGJhci0+aGVpZ2h0KCkgLSBvdXRlckJ1dHRvbkxlbmd0aCwgdGhp
Y2tuZXNzLCBvdXRlckJ1dHRvbkxlbmd0aCk7CisgICAgICAgICAgICBpZiAocGFpbnRpbmcpCisg
ICAgICAgICAgICAgICAgcmVzdWx0LmluZmxhdGVZKGNPdXRlckJ1dHRvbk92ZXJsYXApOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKHNjcm9sbGJh
ci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIGludCBz
dGFydCA9IHBhcnQgPT0gRm9yd2FyZEJ1dHRvbkVuZFBhcnQgPyBzY3JvbGxiYXItPngoKSArIHNj
cm9sbGJhci0+d2lkdGgoKSAtIGJ1dHRvbkxlbmd0aCA6IHNjcm9sbGJhci0+eCgpICsgb3V0ZXJC
dXR0b25MZW5ndGg7CisgICAgICAgIHJlc3VsdCA9IEludFJlY3Qoc3RhcnQsIHNjcm9sbGJhci0+
eSgpLCBidXR0b25MZW5ndGgsIHRoaWNrbmVzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50
IHN0YXJ0ID0gcGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCA/IHNjcm9sbGJhci0+eSgpICsg
c2Nyb2xsYmFyLT5oZWlnaHQoKSAtIGJ1dHRvbkxlbmd0aCA6IHNjcm9sbGJhci0+eSgpICsgb3V0
ZXJCdXR0b25MZW5ndGg7CisgICAgICAgIHJlc3VsdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCks
IHN0YXJ0LCB0aGlja25lc3MsIGJ1dHRvbkxlbmd0aCk7CisgICAgfQorICAgIGlmIChwYWludGlu
ZykKKyAgICAgICAgcmV0dXJuIGJ1dHRvblJlcGFpbnRSZWN0KHJlc3VsdCwgc2Nyb2xsYmFyLT5v
cmllbnRhdGlvbigpLCBzY3JvbGxiYXItPmNvbnRyb2xTaXplKCksIHBhcnQgPT0gRm9yd2FyZEJ1
dHRvblN0YXJ0UGFydCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50UmVjdCBTY3JvbGxi
YXJUaGVtZUNocm9taXVtTWFjOjp0cmFja1JlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGJvb2wg
cGFpbnRpbmcpCit7CisgICAgaWYgKHBhaW50aW5nIHx8ICFoYXNCdXR0b25zKHNjcm9sbGJhcikp
CisgICAgICAgIHJldHVybiBzY3JvbGxiYXItPmZyYW1lUmVjdCgpOworCisgICAgSW50UmVjdCBy
ZXN1bHQ7CisgICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcyhzY3JvbGxiYXIt
PmNvbnRyb2xTaXplKCkpOworICAgIGludCBzdGFydFdpZHRoID0gMDsKKyAgICBpbnQgZW5kV2lk
dGggPSAwOworICAgIGludCBvdXRlckJ1dHRvbkxlbmd0aCA9IGNPdXRlckJ1dHRvbkxlbmd0aFtz
Y3JvbGxiYXItPmNvbnRyb2xTaXplKCldOworICAgIGludCBidXR0b25MZW5ndGggPSBjQnV0dG9u
TGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV07CisgICAgaW50IGRvdWJsZUJ1dHRvbkxl
bmd0aCA9IG91dGVyQnV0dG9uTGVuZ3RoICsgYnV0dG9uTGVuZ3RoOworICAgIHN3aXRjaCAoYnV0
dG9uc1BsYWNlbWVudCgpKSB7CisgICAgICAgIGNhc2UgU2Nyb2xsYmFyQnV0dG9uc1NpbmdsZToK
KyAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBidXR0b25MZW5ndGg7CisgICAgICAgICAgICBlbmRX
aWR0aCA9IGJ1dHRvbkxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNj
cm9sbGJhckJ1dHRvbnNEb3VibGVTdGFydDoKKyAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBkb3Vi
bGVCdXR0b25MZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JvbGxi
YXJCdXR0b25zRG91YmxlRW5kOgorICAgICAgICAgICAgZW5kV2lkdGggPSBkb3VibGVCdXR0b25M
ZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JvbGxiYXJCdXR0b25z
RG91YmxlQm90aDoKKyAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBkb3VibGVCdXR0b25MZW5ndGg7
CisgICAgICAgICAgICBlbmRXaWR0aCA9IGRvdWJsZUJ1dHRvbkxlbmd0aDsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisg
ICAgaW50IHRvdGFsV2lkdGggPSBzdGFydFdpZHRoICsgZW5kV2lkdGg7CisgICAgaWYgKHNjcm9s
bGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1
cm4gSW50UmVjdChzY3JvbGxiYXItPngoKSArIHN0YXJ0V2lkdGgsIHNjcm9sbGJhci0+eSgpLCBz
Y3JvbGxiYXItPndpZHRoKCkgLSB0b3RhbFdpZHRoLCB0aGlja25lc3MpOworICAgIHJldHVybiBJ
bnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSArIHN0YXJ0V2lkdGgsIHRoaWNr
bmVzcywgc2Nyb2xsYmFyLT5oZWlnaHQoKSAtIHRvdGFsV2lkdGgpOworfQorCitpbnQgU2Nyb2xs
YmFyVGhlbWVDaHJvbWl1bU1hYzo6bWluaW11bVRodW1iTGVuZ3RoKFNjcm9sbGJhciogc2Nyb2xs
YmFyKQoreworICAgIHJldHVybiBjVGh1bWJNaW5MZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9sU2l6
ZSgpXTsKK30KKworYm9vbCBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjOjpzaG91bGRDZW50ZXJP
blRodW1iKFNjcm9sbGJhciosIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQoreworICAg
IGlmIChldnQuYnV0dG9uKCkgIT0gTGVmdEJ1dHRvbikKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChnSnVtcE9uVHJhY2tDbGljaykKKyAgICAgICAgcmV0dXJuICFldnQuYWx0S2V5KCk7
CisgICAgcmV0dXJuIGV2dC5hbHRLZXkoKTsKK30KKworc3RhdGljIGludCBzY3JvbGxiYXJQYXJ0
VG9ISVByZXNzZWRTdGF0ZShTY3JvbGxiYXJQYXJ0IHBhcnQpCit7CisgICAgc3dpdGNoIChwYXJ0
KSB7CisgICAgICAgIGNhc2UgQmFja0J1dHRvblN0YXJ0UGFydDoKKyAgICAgICAgICAgIHJldHVy
biBrVGhlbWVUb3BPdXRzaWRlQXJyb3dQcmVzc2VkOworICAgICAgICBjYXNlIEJhY2tCdXR0b25F
bmRQYXJ0OgorICAgICAgICAgICAgcmV0dXJuIGtUaGVtZVRvcE91dHNpZGVBcnJvd1ByZXNzZWQ7
IC8vIFRoaXMgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlLiAgRm9yIHNvbWUgcmVhc29uIHRoZSBv
dXRzaWRlIGNvbnN0YW50IGlzIHJlcXVpcmVkLgorICAgICAgICBjYXNlIEZvcndhcmRCdXR0b25T
dGFydFBhcnQ6CisgICAgICAgICAgICByZXR1cm4ga1RoZW1lVG9wSW5zaWRlQXJyb3dQcmVzc2Vk
OworICAgICAgICBjYXNlIEZvcndhcmRCdXR0b25FbmRQYXJ0OgorICAgICAgICAgICAgcmV0dXJu
IGtUaGVtZUJvdHRvbU91dHNpZGVBcnJvd1ByZXNzZWQ7CisgICAgICAgIGNhc2UgVGh1bWJQYXJ0
OgorICAgICAgICAgICAgcmV0dXJuIGtUaGVtZVRodW1iUHJlc3NlZDsKKyAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworYm9vbCBTY3JvbGxiYXJUaGVt
ZUNocm9taXVtTWFjOjpwYWludChTY3JvbGxiYXIqIHNjcm9sbGJhciwgR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KQoreworICAgIEhJVGhlbWVUcmFj
a0RyYXdJbmZvIHRyYWNrSW5mbzsKKyAgICB0cmFja0luZm8udmVyc2lvbiA9IDA7CisgICAgdHJh
Y2tJbmZvLmtpbmQgPSBzY3JvbGxiYXItPmNvbnRyb2xTaXplKCkgPT0gUmVndWxhclNjcm9sbGJh
ciA/IGtUaGVtZU1lZGl1bVNjcm9sbEJhciA6IGtUaGVtZVNtYWxsU2Nyb2xsQmFyOworICAgIHRy
YWNrSW5mby5ib3VuZHMgPSBzY3JvbGxiYXItPmZyYW1lUmVjdCgpOworICAgIHRyYWNrSW5mby5t
aW4gPSAwOworICAgIHRyYWNrSW5mby5tYXggPSBzY3JvbGxiYXItPm1heGltdW0oKTsKKyAgICB0
cmFja0luZm8udmFsdWUgPSBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKTsKKyAgICB0cmFja0luZm8u
dHJhY2tJbmZvLnNjcm9sbGJhci52aWV3c2l6ZSA9IHNjcm9sbGJhci0+cGFnZVN0ZXAoKTsKKyAg
ICB0cmFja0luZm8uYXR0cmlidXRlcyA9IDA7CisgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRp
b24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICB0cmFja0luZm8uYXR0cmlidXRl
cyB8PSBrVGhlbWVUcmFja0hvcml6b250YWw7CisKKyAgICBpZiAoIXNjcm9sbGJhci0+ZW5hYmxl
ZCgpKQorICAgICAgICB0cmFja0luZm8uZW5hYmxlU3RhdGUgPSBrVGhlbWVUcmFja0Rpc2FibGVk
OworICAgIGVsc2UKKyAgICAgICAgdHJhY2tJbmZvLmVuYWJsZVN0YXRlID0gc2Nyb2xsYmFyLT5j
bGllbnQoKS0+aXNBY3RpdmUoKSA/IGtUaGVtZVRyYWNrQWN0aXZlIDoga1RoZW1lVHJhY2tJbmFj
dGl2ZTsKKworICAgIGlmICghaGFzQnV0dG9ucyhzY3JvbGxiYXIpKQorICAgICAgICB0cmFja0lu
Zm8uZW5hYmxlU3RhdGUgPSBrVGhlbWVUcmFja05vdGhpbmdUb1Njcm9sbDsKKyAgICB0cmFja0lu
Zm8udHJhY2tJbmZvLnNjcm9sbGJhci5wcmVzc1N0YXRlID0gc2Nyb2xsYmFyUGFydFRvSElQcmVz
c2VkU3RhdGUoc2Nyb2xsYmFyLT5wcmVzc2VkUGFydCgpKTsKKworICAgIENHQWZmaW5lVHJhbnNm
b3JtIGN1cnJlbnRDVE0gPSBDR0NvbnRleHRHZXRDVE0oY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCkpOworCisgICAgLy8gVGhlIEFxdWEgc2Nyb2xsYmFyIGlzIGJ1Z2d5IHdoZW4gcm90YXRlZCBh
bmQgc2NhbGVkLiAgV2Ugd2lsbCBqdXN0IGRyYXcgaW50byBhIGJpdG1hcCBpZiB3ZSBkZXRlY3Qg
YSBzY2FsZSBvciByb3RhdGlvbi4KKyAgICBib29sIGNhbkRyYXdEaXJlY3RseSA9IGN1cnJlbnRD
VE0uYSA9PSAxLjBmICYmIGN1cnJlbnRDVE0uYiA9PSAwLjBmICYmIGN1cnJlbnRDVE0uYyA9PSAw
LjBmICYmIChjdXJyZW50Q1RNLmQgPT0gMS4wZiB8fCBjdXJyZW50Q1RNLmQgPT0gLTEuMGYpOwor
ICAgIEdyYXBoaWNzQ29udGV4dCogZHJhd2luZ0NvbnRleHQgPSBjb250ZXh0OworICAgIE93blB0
cjxJbWFnZUJ1ZmZlcj4gaW1hZ2VCdWZmZXI7CisgICAgaWYgKCFjYW5EcmF3RGlyZWN0bHkpIHsK
KyAgICAgICAgdHJhY2tJbmZvLmJvdW5kcyA9IEludFJlY3QoSW50UG9pbnQoKSwgc2Nyb2xsYmFy
LT5mcmFtZVJlY3QoKS5zaXplKCkpOworCisgICAgICAgIEludFJlY3QgYnVmZmVyUmVjdChzY3Jv
bGxiYXItPmZyYW1lUmVjdCgpKTsKKyAgICAgICAgYnVmZmVyUmVjdC5pbnRlcnNlY3QoZGFtYWdl
UmVjdCk7CisgICAgICAgIGJ1ZmZlclJlY3QubW92ZSgtc2Nyb2xsYmFyLT5mcmFtZVJlY3QoKS54
KCksIC1zY3JvbGxiYXItPmZyYW1lUmVjdCgpLnkoKSk7CisKKyAgICAgICAgaW1hZ2VCdWZmZXIg
PSBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKGJ1ZmZlclJlY3Quc2l6ZSgpKTsKKyAgICAgICAgaWYgKCFp
bWFnZUJ1ZmZlcikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGRyYXdpbmdD
b250ZXh0ID0gaW1hZ2VCdWZmZXItPmNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvLyBEcmF3IHRo
dW1ibGVzcy4KKyAgICBISVRoZW1lRHJhd1RyYWNrKCZ0cmFja0luZm8sIDAsIGRyYXdpbmdDb250
ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwga0hJVGhlbWVPcmllbnRhdGlvbk5vcm1hbCk7CisKKyAg
ICBWZWN0b3I8SW50UmVjdD4gdGlja21hcmtzOworICAgIHNjcm9sbGJhci0+Y2xpZW50KCktPmdl
dFRpY2ttYXJrcyh0aWNrbWFya3MpOworICAgIGlmIChzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkg
PT0gVmVydGljYWxTY3JvbGxiYXIgJiYgdGlja21hcmtzLnNpemUoKSkgeworICAgICAgICBzdGF0
aWMgUmVmUHRyPEltYWdlPiBkYXNoID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJ0aWNr
bWFya0Rhc2giKTsKKyAgICAgICAgaWYgKGRhc2gtPmlzTnVsbCgpKSB7CisgICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGRyYXdpbmdDb250ZXh0
LT5zYXZlKCk7CisKKyAgICAgICAgSW50UmVjdCB0aHVtYkFyZWEgPSB0cmFja1JlY3Qoc2Nyb2xs
YmFyLCBmYWxzZSk7CisgICAgICAgIGlmICghY2FuRHJhd0RpcmVjdGx5KSB7CisgICAgICAgICAg
ICB0aHVtYkFyZWEuc2V0WCgwKTsKKyAgICAgICAgICAgIHRodW1iQXJlYS5zZXRZKDApOworICAg
ICAgICB9CisgICAgICAgIC8vIFRoZSBlbmRzIGFyZSByb3VuZGVkIGFuZCB0aGUgdGh1bWIgZG9l
c24ndCBnbyB0aGVyZS4KKyAgICAgICAgdGh1bWJBcmVhLmluZmxhdGVZKC10aHVtYkFyZWEud2lk
dGgoKSAqIDIgLyAzKTsKKworICAgICAgICBmb3IgKFZlY3RvcjxJbnRSZWN0Pjo6Y29uc3RfaXRl
cmF0b3IgaSA9IHRpY2ttYXJrcy5iZWdpbigpOyBpICE9IHRpY2ttYXJrcy5lbmQoKTsgKytpKSB7
CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgaG93IGZhciBkb3duIChpbiAlKSB0aGUgdGljay1t
YXJrIHNob3VsZCBhcHBlYXIuCisgICAgICAgICAgICBjb25zdCBmbG9hdCBwZXJjZW50ID0gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KGktPnkoKSkgLyBzY3JvbGxiYXItPnRvdGFsU2l6ZSgpOworCisgICAg
ICAgICAgICAvLyBDYWxjdWxhdGUgaG93IGZhciBkb3duIChpbiBwaXhlbHMpIHRoZSB0aWNrLW1h
cmsgc2hvdWxkIGFwcGVhci4KKyAgICAgICAgICAgIGNvbnN0IGludCB5UG9zID0gdGh1bWJBcmVh
LnRvcExlZnQoKS55KCkgKyAodGh1bWJBcmVhLmhlaWdodCgpICogcGVyY2VudCk7CisKKyAgICAg
ICAgICAgIEludFBvaW50IHRpY2sodGh1bWJBcmVhLnRvcExlZnQoKS54KCksIHlQb3MpOworICAg
ICAgICAgICAgZHJhd2luZ0NvbnRleHQtPmRyYXdJbWFnZShkYXNoLmdldCgpLCBEZXZpY2VDb2xv
clNwYWNlLCB0aWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIGRyYXdpbmdDb250ZXh0LT5yZXN0
b3JlKCk7CisgICAgfQorCisgICAgaWYgKGhhc1RodW1iKHNjcm9sbGJhcikpIHsKKyAgICAgICAg
dHJhY2tJbmZvLmF0dHJpYnV0ZXMgfD0gKGtUaGVtZVRyYWNrU2hvd1RodW1iIHwga1RoZW1lVHJh
Y2tIaWRlVHJhY2spOworICAgICAgICBISVRoZW1lRHJhd1RyYWNrKCZ0cmFja0luZm8sIDAsIGRy
YXdpbmdDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwga0hJVGhlbWVPcmllbnRhdGlvbk5vcm1h
bCk7CisgICAgfQorCisgICAgaWYgKCFjYW5EcmF3RGlyZWN0bHkpIHsKKyAgICAgICAgY29udGV4
dC0+ZHJhd0ltYWdlKGltYWdlQnVmZmVyLT5pbWFnZSgpLCBEZXZpY2VDb2xvclNwYWNlLCBzY3Jv
bGxiYXItPmZyYW1lUmVjdCgpLmxvY2F0aW9uKCkpOworICAgIH0KKworICAgIHJldHVybiB0cnVl
OworfQorCit9CisKClByb3BlcnR5IGNoYW5nZXMgb246IFdlYkNvcmUvcGxhdGZvcm0vY2hyb21p
dW0vU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYy5tbQpfX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCk5hbWU6IHN2bjplb2wt
c3R5bGUKICAgKyBMRgoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44156</attachid>
            <date>2009-12-02 09:24:20 -0800</date>
            <delta_ts>2009-12-09 07:53:06 -0800</delta_ts>
            <desc>Now with svn cp!</desc>
            <filename>scroll.patch</filename>
            <type>text/plain</type>
            <size>39645</size>
            <attacher name="Avi Drissman">avi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MTYwMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMDktMTItMDIgIEF2aSBEcmlzc21hbiAgPGF2aUBjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hy
b21pdW06IE5lZWQgdGlja21hcmtzIGluIHNjcm9sbGJhcgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzIwNjkKKworICAgICAgICAqIFdlYkNvcmUuZ3lw
L1dlYkNvcmUuZ3lwOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBwbGF0Zm9y
bS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjLmg6IEFkZGVkLgorICAgICAgICAq
IHBsYXRmb3JtL2Nocm9taXVtL1Njcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMubW06IEFkZGVkLgor
CiAyMDA5LTEyLTAxICBEYXZlIEh5YXR0ICA8aHlhdHRAYXBwbGUuY29tPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IERhbiBCZXJuc3RlaW4uCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNTE2MDApCisrKyBXZWJD
b3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtMTg3OSw2ICsxODc5LDggQEAKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVtLmNwcCcs
CiAgICAgICAgICAgICAncGxhdGZvcm0vY2hyb21pdW0vU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bS5o
JywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVt
TGludXguY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVt
ZUNocm9taXVtTWFjLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1Njcm9sbGJh
clRoZW1lQ2hyb21pdW1NYWMubW0nLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1Nj
cm9sbGJhclRoZW1lQ2hyb21pdW1XaW4uY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJv
bWl1bS9TZWFyY2hQb3B1cE1lbnVDaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3Jt
L2Nocm9taXVtL1NoYXJlZFRpbWVyQ2hyb21pdW0uY3BwJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29y
ZS5neXAvV2ViQ29yZS5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmd5cC9XZWJD
b3JlLmd5cAkocmV2aXNpb24gNTE2MDApCisrKyBXZWJDb3JlL1dlYkNvcmUuZ3lwL1dlYkNvcmUu
Z3lwCSh3b3JraW5nIGNvcHkpCkBAIC05MDksNyArOTA5LDYgQEAKICAgICAgICAgICAgIFsnaW5j
bHVkZScsICdwbGF0Zm9ybS9tYWMvQmxvY2tFeGNlcHRpb25zXFwubW0kJ10sCiAgICAgICAgICAg
ICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vbWFjL0xvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dFxc
Lm1tJCddLAogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL21hYy9QdXJnZWFibGVC
dWZmZXJNYWNcXC5jcHAkJ10sCi0gICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vbWFj
L1Njcm9sbGJhclRoZW1lTWFjXFwubW0kJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxh
dGZvcm0vbWFjL1dlYkNvcmVTeXN0ZW1JbnRlcmZhY2VcXC5tbSQnXSwKICAgICAgICAgICAgIFsn
aW5jbHVkZScsICdwbGF0Zm9ybS9tYWMvV2ViQ29yZVRleHRSZW5kZXJlclxcLm1tJCddLAogICAg
ICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL3RleHQvbWFjL1NoYXBlQXJhYmljXFwuYyQn
XSwKQEAgLTkyNCw4ICs5MjMsOCBAQAogICAgICAgICAgICAgIyBwbGF0Zm9ybS9ncmFwaGljcy9t
YWMsIGluY2x1ZGVkIGJ5IHJlZ2V4IGFib3ZlLCBpbnN0ZWFkLgogICAgICAgICAgICAgJy4uL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDdXN0b21QbGF0Zm9ybURhdGEuY3BwJywKIAot
ICAgICAgICAgICAgIyBUaGUgTWFjIGN1cnJlbnRseSB1c2VzIFNjcm9sbGJhclRoZW1lTWFjLm1t
LCBpbmNsdWRlZCBieSByZWdleAotICAgICAgICAgICAgIyBhYm92ZSwgaW5zdGVhZCBvZiBTY3Jv
bGxiYXJUaGVtZUNocm9taXVtLmNwcC4KKyAgICAgICAgICAgICMgVGhlIE1hYyBjdXJyZW50bHkg
dXNlcyBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjLm1tLCB3aGljaCBpcyBub3QKKyAgICAgICAg
ICAgICMgcmVsYXRlZCB0byBTY3JvbGxiYXJUaGVtZUNocm9taXVtLmNwcC4KICAgICAgICAgICAg
ICcuLi9wbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVtLmNwcCcsCiAKICAg
ICAgICAgICAgICMgVGhlIE1hYyB1c2VzIEltYWdlU291cmNlQ0cuY3BwIGZyb20gcGxhdGZvcm0v
Z3JhcGhpY3MvY2csIGluY2x1ZGVkCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1Nj
cm9sbGJhclRoZW1lQ2hyb21pdW1NYWMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2Nocm9taXVtL1Njcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMuaAkocmV2aXNpb24gNTE2MDApCShm
cm9tIFdlYkNvcmUvcGxhdGZvcm0vbWFjL1Njcm9sbGJhclRoZW1lTWFjLmg6NTE2MDApCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1Njcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMuaAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFw
cGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgU2Nyb2xsYmFyVGhlbWVNYWNfaAorI2RlZmluZSBT
Y3JvbGxiYXJUaGVtZU1hY19oCisKKyNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZUNvbXBvc2l0ZS5o
IgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFNjcm9sbGJhclRoZW1lTWFjIDogcHVi
bGljIFNjcm9sbGJhclRoZW1lQ29tcG9zaXRlIHsKK3B1YmxpYzoKKyAgICBTY3JvbGxiYXJUaGVt
ZU1hYygpOworICAgIHZpcnR1YWwgflNjcm9sbGJhclRoZW1lTWFjKCk7CisKKyAgICB2aXJ0dWFs
IGJvb2wgcGFpbnQoU2Nyb2xsYmFyKiwgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJ
bnRSZWN0JiBkYW1hZ2VSZWN0KTsKKworICAgIHZpcnR1YWwgaW50IHNjcm9sbGJhclRoaWNrbmVz
cyhTY3JvbGxiYXJDb250cm9sU2l6ZSA9IFJlZ3VsYXJTY3JvbGxiYXIpOworICAgIAorICAgIHZp
cnR1YWwgYm9vbCBzdXBwb3J0c0NvbnRyb2xUaW50cygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0K
KworICAgIHZpcnR1YWwgZG91YmxlIGluaXRpYWxBdXRvc2Nyb2xsVGltZXJEZWxheSgpOworICAg
IHZpcnR1YWwgZG91YmxlIGF1dG9zY3JvbGxUaW1lckRlbGF5KCk7CisKKyAgICB2aXJ0dWFsIFNj
cm9sbGJhckJ1dHRvbnNQbGFjZW1lbnQgYnV0dG9uc1BsYWNlbWVudCgpIGNvbnN0OworCisgICAg
dmlydHVhbCB2b2lkIHJlZ2lzdGVyU2Nyb2xsYmFyKFNjcm9sbGJhciopOworICAgIHZpcnR1YWwg
dm9pZCB1bnJlZ2lzdGVyU2Nyb2xsYmFyKFNjcm9sbGJhciopOworCitwcm90ZWN0ZWQ6CisgICAg
dmlydHVhbCBib29sIGhhc0J1dHRvbnMoU2Nyb2xsYmFyKik7CisgICAgdmlydHVhbCBib29sIGhh
c1RodW1iKFNjcm9sbGJhciopOworCisgICAgdmlydHVhbCBJbnRSZWN0IGJhY2tCdXR0b25SZWN0
KFNjcm9sbGJhciosIFNjcm9sbGJhclBhcnQsIGJvb2wgcGFpbnRpbmcgPSBmYWxzZSk7CisgICAg
dmlydHVhbCBJbnRSZWN0IGZvcndhcmRCdXR0b25SZWN0KFNjcm9sbGJhciosIFNjcm9sbGJhclBh
cnQsIGJvb2wgcGFpbnRpbmcgPSBmYWxzZSk7CisgICAgdmlydHVhbCBJbnRSZWN0IHRyYWNrUmVj
dChTY3JvbGxiYXIqLCBib29sIHBhaW50aW5nID0gZmFsc2UpOworCisgICAgdmlydHVhbCBpbnQg
bWluaW11bVRodW1iTGVuZ3RoKFNjcm9sbGJhciopOworICAgIAorICAgIHZpcnR1YWwgYm9vbCBz
aG91bGRDZW50ZXJPblRodW1iKFNjcm9sbGJhciosIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYp
OworICAgIAorcHVibGljOgorICAgIHZvaWQgcHJlZmVyZW5jZXNDaGFuZ2VkKCk7Cit9OworCit9
CisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVt
ZUNocm9taXVtTWFjLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9T
Y3JvbGxiYXJUaGVtZUNocm9taXVtTWFjLmgJKHJldmlzaW9uIDUxNjAwKQorKysgV2ViQ29yZS9w
bGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4g
QWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBB
bGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0y
MCwyNSArMjEsMjggQEAKICAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKICAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0g
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotI2lmbmRlZiBTY3JvbGxiYXJU
aGVtZU1hY19oCi0jZGVmaW5lIFNjcm9sbGJhclRoZW1lTWFjX2gKKyNpZm5kZWYgU2Nyb2xsYmFy
VGhlbWVDaHJvbWl1bU1hY19oCisjZGVmaW5lIFNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWNfaAog
CiAjaW5jbHVkZSAiU2Nyb2xsYmFyVGhlbWVDb21wb3NpdGUuaCIKIAorLy8gVGhpcyBmaWxlIChh
bmQgaXRzIGFzc29jaWF0ZWQgLm1tIGZpbGUpIGlzIGEgY2xvbmUgb2YgU2Nyb2xsYmFyVGhlbWVN
YWMuaC4KKy8vIFNlZSB0aGUgLm1tIGZpbGUgZm9yIGRldGFpbHMuCisKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAotY2xhc3MgU2Nyb2xsYmFyVGhlbWVNYWMgOiBwdWJsaWMgU2Nyb2xsYmFyVGhlbWVD
b21wb3NpdGUgeworY2xhc3MgU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYyA6IHB1YmxpYyBTY3Jv
bGxiYXJUaGVtZUNvbXBvc2l0ZSB7CiBwdWJsaWM6Ci0gICAgU2Nyb2xsYmFyVGhlbWVNYWMoKTsK
LSAgICB2aXJ0dWFsIH5TY3JvbGxiYXJUaGVtZU1hYygpOworICAgIFNjcm9sbGJhclRoZW1lQ2hy
b21pdW1NYWMoKTsKKyAgICB2aXJ0dWFsIH5TY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjKCk7CiAK
ICAgICB2aXJ0dWFsIGJvb2wgcGFpbnQoU2Nyb2xsYmFyKiwgR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KTsKIAogICAgIHZpcnR1YWwgaW50IHNjcm9s
bGJhclRoaWNrbmVzcyhTY3JvbGxiYXJDb250cm9sU2l6ZSA9IFJlZ3VsYXJTY3JvbGxiYXIpOwot
ICAgIAorCiAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzQ29udHJvbFRpbnRzKCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQogCiAgICAgdmlydHVhbCBkb3VibGUgaW5pdGlhbEF1dG9zY3JvbGxUaW1l
ckRlbGF5KCk7CkBAIC01OCwxMyArNjIsMTMgQEAgcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgSW50
UmVjdCB0cmFja1JlY3QoU2Nyb2xsYmFyKiwgYm9vbCBwYWludGluZyA9IGZhbHNlKTsKIAogICAg
IHZpcnR1YWwgaW50IG1pbmltdW1UaHVtYkxlbmd0aChTY3JvbGxiYXIqKTsKLSAgICAKKwogICAg
IHZpcnR1YWwgYm9vbCBzaG91bGRDZW50ZXJPblRodW1iKFNjcm9sbGJhciosIGNvbnN0IFBsYXRm
b3JtTW91c2VFdmVudCYpOwotICAgIAorCiBwdWJsaWM6CiAgICAgdm9pZCBwcmVmZXJlbmNlc0No
YW5nZWQoKTsKIH07CiAKIH0KIAotI2VuZGlmCisjZW5kaWYgLy8gU2Nyb2xsYmFyVGhlbWVDaHJv
bWl1bU1hY19oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1Njcm9sbGJhclRoZW1l
Q2hyb21pdW1NYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9T
Y3JvbGxiYXJUaGVtZUNocm9taXVtTWFjLm1tCShyZXZpc2lvbiA1MTYwMCkJKGZyb20gV2ViQ29y
ZS9wbGF0Zm9ybS9tYWMvU2Nyb2xsYmFyVGhlbWVNYWMubW06NTE2MDApCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2Nocm9taXVtL1Njcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMubW0JKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5j
LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1l
TWFjLmgiCisKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91
c2VFdmVudC5oIgorI2luY2x1ZGUgIlNjcm9sbFZpZXcuaCIKKyNpbmNsdWRlIDxDYXJib24vQ2Fy
Ym9uLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9VbnVz
ZWRQYXJhbS5oPgorCisvLyBGSVhNRTogVGhlcmUgYXJlIHJlcGFpbnRpbmcgcHJvYmxlbXMgZHVl
IHRvIEFxdWEgc2Nyb2xsIGJhciBidXR0b25zJyB2aXN1YWwgb3ZlcmZsb3cuCisKK3VzaW5nIG5h
bWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworc3RhdGljIEhhc2hTZXQ8
U2Nyb2xsYmFyKj4qIGdTY3JvbGxiYXJzOworCitAaW50ZXJmYWNlIFNjcm9sbGJhclByZWZzT2Jz
ZXJ2ZXIgOiBOU09iamVjdAoreworCit9CisKKysgKHZvaWQpcmVnaXN0ZXJBc09ic2VydmVyOwor
KyAodm9pZClhcHBlYXJhbmNlUHJlZnNDaGFuZ2VkOihOU05vdGlmaWNhdGlvbiopdGhlTm90aWZp
Y2F0aW9uOworKyAodm9pZCliZWhhdmlvclByZWZzQ2hhbmdlZDooTlNOb3RpZmljYXRpb24qKXRo
ZU5vdGlmaWNhdGlvbjsKKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gU2Nyb2xsYmFyUHJlZnNP
YnNlcnZlcgorCisrICh2b2lkKWFwcGVhcmFuY2VQcmVmc0NoYW5nZWQ6KE5TTm90aWZpY2F0aW9u
Kil1bnVzZWROb3RpZmljYXRpb24KK3sKKyAgICBVTlVTRURfUEFSQU0odW51c2VkTm90aWZpY2F0
aW9uKTsKKworICAgIHN0YXRpY19jYXN0PFNjcm9sbGJhclRoZW1lTWFjKj4oU2Nyb2xsYmFyVGhl
bWU6Om5hdGl2ZVRoZW1lKCkpLT5wcmVmZXJlbmNlc0NoYW5nZWQoKTsKKyAgICBpZiAoIWdTY3Jv
bGxiYXJzKQorICAgICAgICByZXR1cm47CisgICAgSGFzaFNldDxTY3JvbGxiYXIqPjo6aXRlcmF0
b3IgZW5kID0gZ1Njcm9sbGJhcnMtPmVuZCgpOworICAgIGZvciAoSGFzaFNldDxTY3JvbGxiYXIq
Pjo6aXRlcmF0b3IgaXQgPSBnU2Nyb2xsYmFycy0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7
CisgICAgICAgICgqaXQpLT5zdHlsZUNoYW5nZWQoKTsKKyAgICAgICAgKCppdCktPmludmFsaWRh
dGUoKTsKKyAgICB9Cit9CisKKysgKHZvaWQpYmVoYXZpb3JQcmVmc0NoYW5nZWQ6KE5TTm90aWZp
Y2F0aW9uKil1bnVzZWROb3RpZmljYXRpb24KK3sKKyAgICBVTlVTRURfUEFSQU0odW51c2VkTm90
aWZpY2F0aW9uKTsKKworICAgIHN0YXRpY19jYXN0PFNjcm9sbGJhclRoZW1lTWFjKj4oU2Nyb2xs
YmFyVGhlbWU6Om5hdGl2ZVRoZW1lKCkpLT5wcmVmZXJlbmNlc0NoYW5nZWQoKTsKK30KKworKyAo
dm9pZClyZWdpc3RlckFzT2JzZXJ2ZXIKK3sKKyAgICBbW05TRGlzdHJpYnV0ZWROb3RpZmljYXRp
b25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6c2VsZiBzZWxlY3RvcjpAc2VsZWN0
b3IoYXBwZWFyYW5jZVByZWZzQ2hhbmdlZDopIG5hbWU6QCJBcHBsZUFxdWFTY3JvbGxCYXJWYXJp
YW50Q2hhbmdlZCIgb2JqZWN0Om5pbCBzdXNwZW5zaW9uQmVoYXZpb3I6TlNOb3RpZmljYXRpb25T
dXNwZW5zaW9uQmVoYXZpb3JEZWxpdmVySW1tZWRpYXRlbHldOworICAgIFtbTlNEaXN0cmlidXRl
ZE5vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjpzZWxmIHNlbGVj
dG9yOkBzZWxlY3RvcihiZWhhdmlvclByZWZzQ2hhbmdlZDopIG5hbWU6QCJBcHBsZU5vUmVkaXNw
bGF5QXBwZWFyYW5jZVByZWZlcmVuY2VDaGFuZ2VkIiBvYmplY3Q6bmlsIHN1c3BlbnNpb25CZWhh
dmlvcjpOU05vdGlmaWNhdGlvblN1c3BlbnNpb25CZWhhdmlvckNvYWxlc2NlXTsKK30KKworQGVu
ZAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Njcm9sbGJhclRoZW1lKiBTY3JvbGxiYXJUaGVt
ZTo6bmF0aXZlVGhlbWUoKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoU2Nyb2xsYmFyVGhl
bWVNYWMsIHRoZW1lLCAoKSk7CisgICAgcmV0dXJuICZ0aGVtZTsKK30KKworLy8gRklYTUU6IEdl
dCB0aGVzZSBudW1iZXJzIGZyb20gQ29yZVVJLgorc3RhdGljIGludCBjU2Nyb2xsYmFyVGhpY2tu
ZXNzW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjUmVhbEJ1dHRvbkxlbmd0aFtdID0geyAy
OCwgMjEgfTsKK3N0YXRpYyBpbnQgY0J1dHRvbkluc2V0W10gPSB7IDE0LCAxMSB9Oworc3RhdGlj
IGludCBjQnV0dG9uSGl0SW5zZXRbXSA9IHsgMywgMiB9OworLy8gY1JlYWxCdXR0b25MZW5ndGgg
LSBjQnV0dG9uSW5zZXQKK3N0YXRpYyBpbnQgY0J1dHRvbkxlbmd0aFtdID0geyAxNCwgMTAgfTsK
K3N0YXRpYyBpbnQgY1RodW1iTWluTGVuZ3RoW10gPSB7IDI2LCAyMCB9OworCitzdGF0aWMgaW50
IGNPdXRlckJ1dHRvbkxlbmd0aFtdID0geyAxNiwgMTQgfTsgLy8gVGhlIG91dGVyIGJ1dHRvbiBp
biBhIGRvdWJsZSBidXR0b24gcGFpciBpcyBhIGJpdCBiaWdnZXIuCitzdGF0aWMgaW50IGNPdXRl
ckJ1dHRvbk92ZXJsYXAgPSAyOworCitzdGF0aWMgZmxvYXQgZ0luaXRpYWxCdXR0b25EZWxheSA9
IDAuNWY7CitzdGF0aWMgZmxvYXQgZ0F1dG9zY3JvbGxCdXR0b25EZWxheSA9IDAuMDVmOworc3Rh
dGljIGJvb2wgZ0p1bXBPblRyYWNrQ2xpY2sgPSBmYWxzZTsKK3N0YXRpYyBTY3JvbGxiYXJCdXR0
b25zUGxhY2VtZW50IGdCdXR0b25QbGFjZW1lbnQgPSBTY3JvbGxiYXJCdXR0b25zRG91YmxlRW5k
OworCitzdGF0aWMgdm9pZCB1cGRhdGVBcnJvd1BsYWNlbWVudCgpCit7CisgICAgTlNTdHJpbmcg
KmJ1dHRvblBsYWNlbWVudCA9IFtbTlNVc2VyRGVmYXVsdHMgc3RhbmRhcmRVc2VyRGVmYXVsdHNd
IG9iamVjdEZvcktleTpAIkFwcGxlU2Nyb2xsQmFyVmFyaWFudCJdOworICAgIGlmIChbYnV0dG9u
UGxhY2VtZW50IGlzRXF1YWxUb1N0cmluZzpAIlNpbmdsZSJdKQorICAgICAgICBnQnV0dG9uUGxh
Y2VtZW50ID0gU2Nyb2xsYmFyQnV0dG9uc1NpbmdsZTsKKyAgICBlbHNlIGlmIChbYnV0dG9uUGxh
Y2VtZW50IGlzRXF1YWxUb1N0cmluZzpAIkRvdWJsZU1pbiJdKQorICAgICAgICBnQnV0dG9uUGxh
Y2VtZW50ID0gU2Nyb2xsYmFyQnV0dG9uc0RvdWJsZVN0YXJ0OworICAgIGVsc2UgaWYgKFtidXR0
b25QbGFjZW1lbnQgaXNFcXVhbFRvU3RyaW5nOkAiRG91YmxlQm90aCJdKQorICAgICAgICBnQnV0
dG9uUGxhY2VtZW50ID0gU2Nyb2xsYmFyQnV0dG9uc0RvdWJsZUJvdGg7CisgICAgZWxzZQorICAg
ICAgICBnQnV0dG9uUGxhY2VtZW50ID0gU2Nyb2xsYmFyQnV0dG9uc0RvdWJsZUVuZDsgLy8gVGhl
IGRlZmF1bHQgaXMgU2Nyb2xsYmFyQnV0dG9uc0RvdWJsZUVuZC4KK30KKwordm9pZCBTY3JvbGxi
YXJUaGVtZU1hYzo6cmVnaXN0ZXJTY3JvbGxiYXIoU2Nyb2xsYmFyKiBzY3JvbGxiYXIpCit7Cisg
ICAgaWYgKCFnU2Nyb2xsYmFycykKKyAgICAgICAgZ1Njcm9sbGJhcnMgPSBuZXcgSGFzaFNldDxT
Y3JvbGxiYXIqPjsKKyAgICBnU2Nyb2xsYmFycy0+YWRkKHNjcm9sbGJhcik7Cit9CisKK3ZvaWQg
U2Nyb2xsYmFyVGhlbWVNYWM6OnVucmVnaXN0ZXJTY3JvbGxiYXIoU2Nyb2xsYmFyKiBzY3JvbGxi
YXIpCit7CisgICAgZ1Njcm9sbGJhcnMtPnJlbW92ZShzY3JvbGxiYXIpOworICAgIGlmIChnU2Ny
b2xsYmFycy0+aXNFbXB0eSgpKSB7CisgICAgICAgIGRlbGV0ZSBnU2Nyb2xsYmFyczsKKyAgICAg
ICAgZ1Njcm9sbGJhcnMgPSAwOworICAgIH0KK30KKworU2Nyb2xsYmFyVGhlbWVNYWM6OlNjcm9s
bGJhclRoZW1lTWFjKCkKK3sKKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZDsKKyAgICBpZiAo
IWluaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgW1Nj
cm9sbGJhclByZWZzT2JzZXJ2ZXIgcmVnaXN0ZXJBc09ic2VydmVyXTsKKyAgICAgICAgcHJlZmVy
ZW5jZXNDaGFuZ2VkKCk7CisgICAgfQorfQorCitTY3JvbGxiYXJUaGVtZU1hYzo6flNjcm9sbGJh
clRoZW1lTWFjKCkKK3sKK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZU1hYzo6cHJlZmVyZW5jZXND
aGFuZ2VkKCkKK3sKKyAgICBOU1VzZXJEZWZhdWx0cyAqZGVmYXVsdHMgPSBbTlNVc2VyRGVmYXVs
dHMgc3RhbmRhcmRVc2VyRGVmYXVsdHNdOworICAgIFtkZWZhdWx0cyBzeW5jaHJvbml6ZV07Cisg
ICAgdXBkYXRlQXJyb3dQbGFjZW1lbnQoKTsKKyAgICBnSW5pdGlhbEJ1dHRvbkRlbGF5ID0gW2Rl
ZmF1bHRzIGZsb2F0Rm9yS2V5OkAiTlNTY3JvbGxlckJ1dHRvbkRlbGF5Il07CisgICAgZ0F1dG9z
Y3JvbGxCdXR0b25EZWxheSA9IFtkZWZhdWx0cyBmbG9hdEZvcktleTpAIk5TU2Nyb2xsZXJCdXR0
b25QZXJpb2QiXTsKKyAgICBnSnVtcE9uVHJhY2tDbGljayA9IFtkZWZhdWx0cyBib29sRm9yS2V5
OkAiQXBwbGVTY3JvbGxlclBhZ2luZ0JlaGF2aW9yIl07Cit9CisKK2ludCBTY3JvbGxiYXJUaGVt
ZU1hYzo6c2Nyb2xsYmFyVGhpY2tuZXNzKFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXpl
KQoreworICAgIHJldHVybiBjU2Nyb2xsYmFyVGhpY2tuZXNzW2NvbnRyb2xTaXplXTsKK30KKwor
ZG91YmxlIFNjcm9sbGJhclRoZW1lTWFjOjppbml0aWFsQXV0b3Njcm9sbFRpbWVyRGVsYXkoKQor
eworICAgIHJldHVybiBnSW5pdGlhbEJ1dHRvbkRlbGF5OworfQorCitkb3VibGUgU2Nyb2xsYmFy
VGhlbWVNYWM6OmF1dG9zY3JvbGxUaW1lckRlbGF5KCkKK3sKKyAgICByZXR1cm4gZ0F1dG9zY3Jv
bGxCdXR0b25EZWxheTsKK30KKyAgICAKK1Njcm9sbGJhckJ1dHRvbnNQbGFjZW1lbnQgU2Nyb2xs
YmFyVGhlbWVNYWM6OmJ1dHRvbnNQbGFjZW1lbnQoKSBjb25zdAoreworICAgIHJldHVybiBnQnV0
dG9uUGxhY2VtZW50OworfQorCitib29sIFNjcm9sbGJhclRoZW1lTWFjOjpoYXNCdXR0b25zKFNj
cm9sbGJhciogc2Nyb2xsYmFyKQoreworICAgIHJldHVybiBzY3JvbGxiYXItPmVuYWJsZWQoKSAm
JiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIgPyAKKyAg
ICAgICAgICAgICBzY3JvbGxiYXItPndpZHRoKCkgOiAKKyAgICAgICAgICAgICBzY3JvbGxiYXIt
PmhlaWdodCgpKSA+PSAyICogKGNSZWFsQnV0dG9uTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNp
emUoKV0gLSBjQnV0dG9uSGl0SW5zZXRbc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpXSk7Cit9CisK
K2Jvb2wgU2Nyb2xsYmFyVGhlbWVNYWM6Omhhc1RodW1iKFNjcm9sbGJhciogc2Nyb2xsYmFyKQor
eworICAgIHJldHVybiBzY3JvbGxiYXItPmVuYWJsZWQoKSAmJiAoc2Nyb2xsYmFyLT5vcmllbnRh
dGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIgPyAKKyAgICAgICAgICAgICBzY3JvbGxiYXIt
PndpZHRoKCkgOiAKKyAgICAgICAgICAgICBzY3JvbGxiYXItPmhlaWdodCgpKSA+PSAyICogY0J1
dHRvbkluc2V0W3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV0gKyBjVGh1bWJNaW5MZW5ndGhbc2Ny
b2xsYmFyLT5jb250cm9sU2l6ZSgpXSArIDE7Cit9CisKK3N0YXRpYyBJbnRSZWN0IGJ1dHRvblJl
cGFpbnRSZWN0KGNvbnN0IEludFJlY3QmIGJ1dHRvblJlY3QsIFNjcm9sbGJhck9yaWVudGF0aW9u
IG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6ZSwgYm9vbCBzdGFy
dCkKK3sKKyAgICBJbnRSZWN0IHBhaW50UmVjdChidXR0b25SZWN0KTsKKyAgICBpZiAob3JpZW50
YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICBwYWludFJlY3Quc2V0V2lk
dGgoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNpemVdKTsKKyAgICAgICAgaWYgKCFzdGFydCkK
KyAgICAgICAgICAgIHBhaW50UmVjdC5zZXRYKGJ1dHRvblJlY3QueCgpIC0gKGNSZWFsQnV0dG9u
TGVuZ3RoW2NvbnRyb2xTaXplXSAtIGJ1dHRvblJlY3Qud2lkdGgoKSkpOworICAgIH0gZWxzZSB7
CisgICAgICAgIHBhaW50UmVjdC5zZXRIZWlnaHQoY1JlYWxCdXR0b25MZW5ndGhbY29udHJvbFNp
emVdKTsKKyAgICAgICAgaWYgKCFzdGFydCkKKyAgICAgICAgICAgIHBhaW50UmVjdC5zZXRZKGJ1
dHRvblJlY3QueSgpIC0gKGNSZWFsQnV0dG9uTGVuZ3RoW2NvbnRyb2xTaXplXSAtIGJ1dHRvblJl
Y3QuaGVpZ2h0KCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGFpbnRSZWN0OworfQorCitJbnRS
ZWN0IFNjcm9sbGJhclRoZW1lTWFjOjpiYWNrQnV0dG9uUmVjdChTY3JvbGxiYXIqIHNjcm9sbGJh
ciwgU2Nyb2xsYmFyUGFydCBwYXJ0LCBib29sIHBhaW50aW5nKQoreworICAgIEludFJlY3QgcmVz
dWx0OworICAgIAorICAgIGlmIChwYXJ0ID09IEJhY2tCdXR0b25TdGFydFBhcnQgJiYgKGJ1dHRv
bnNQbGFjZW1lbnQoKSA9PSBTY3JvbGxiYXJCdXR0b25zTm9uZSB8fCBidXR0b25zUGxhY2VtZW50
KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc0RvdWJsZUVuZCkpCisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgCisgICAgaWYgKHBhcnQgPT0gQmFja0J1dHRvbkVuZFBhcnQgJiYgKGJ1dHRvbnNQbGFj
ZW1lbnQoKSA9PSBTY3JvbGxiYXJCdXR0b25zTm9uZSB8fCBidXR0b25zUGxhY2VtZW50KCkgPT0g
U2Nyb2xsYmFyQnV0dG9uc0RvdWJsZVN0YXJ0IHx8IGJ1dHRvbnNQbGFjZW1lbnQoKSA9PSBTY3Jv
bGxiYXJCdXR0b25zU2luZ2xlKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgCisg
ICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcyhzY3JvbGxiYXItPmNvbnRyb2xT
aXplKCkpOworICAgIGJvb2wgb3V0ZXJCdXR0b24gPSBwYXJ0ID09IEJhY2tCdXR0b25TdGFydFBh
cnQgJiYgKGJ1dHRvbnNQbGFjZW1lbnQoKSA9PSBTY3JvbGxiYXJCdXR0b25zRG91YmxlU3RhcnQg
fHwgYnV0dG9uc1BsYWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNEb3VibGVCb3RoKTsKKyAg
ICBpZiAob3V0ZXJCdXR0b24pIHsKKyAgICAgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24o
KSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgcmVzdWx0ID0gSW50UmVjdChz
Y3JvbGxiYXItPngoKSwgc2Nyb2xsYmFyLT55KCksIGNPdXRlckJ1dHRvbkxlbmd0aFtzY3JvbGxi
YXItPmNvbnRyb2xTaXplKCldICsgcGFpbnRpbmcgPyBjT3V0ZXJCdXR0b25PdmVybGFwIDogMCwg
dGhpY2tuZXNzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gSW50UmVjdChz
Y3JvbGxiYXItPngoKSwgc2Nyb2xsYmFyLT55KCksIHRoaWNrbmVzcywgY091dGVyQnV0dG9uTGVu
Z3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV0gKyBwYWludGluZyA/IGNPdXRlckJ1dHRvbk92
ZXJsYXAgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgLy8g
T3VyIHJlcGFpbnQgcmVjdCBpcyBzbGlnaHRseSBsYXJnZXIsIHNpbmNlIHdlIGFyZSBhIGJ1dHRv
biB0aGF0IGlzIGFkamFjZW50IHRvIHRoZSB0cmFjay4KKyAgICBpZiAoc2Nyb2xsYmFyLT5vcmll
bnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0g
cGFydCA9PSBCYWNrQnV0dG9uU3RhcnRQYXJ0ID8gc2Nyb2xsYmFyLT54KCkgOiBzY3JvbGxiYXIt
PngoKSArIHNjcm9sbGJhci0+d2lkdGgoKSAtIGNPdXRlckJ1dHRvbkxlbmd0aFtzY3JvbGxiYXIt
PmNvbnRyb2xTaXplKCldIC0gY0J1dHRvbkxlbmd0aFtzY3JvbGxiYXItPmNvbnRyb2xTaXplKCld
OworICAgICAgICByZXN1bHQgPSBJbnRSZWN0KHN0YXJ0LCBzY3JvbGxiYXItPnkoKSwgY0J1dHRv
bkxlbmd0aFtzY3JvbGxiYXItPmNvbnRyb2xTaXplKCldLCB0aGlja25lc3MpOworICAgIH0gZWxz
ZSB7CisgICAgICAgIGludCBzdGFydCA9IHBhcnQgPT0gQmFja0J1dHRvblN0YXJ0UGFydCA/IHNj
cm9sbGJhci0+eSgpIDogc2Nyb2xsYmFyLT55KCkgKyBzY3JvbGxiYXItPmhlaWdodCgpIC0gY091
dGVyQnV0dG9uTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV0gLSBjQnV0dG9uTGVuZ3Ro
W3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV07CisgICAgICAgIHJlc3VsdCA9IEludFJlY3Qoc2Ny
b2xsYmFyLT54KCksIHN0YXJ0LCB0aGlja25lc3MsIGNCdXR0b25MZW5ndGhbc2Nyb2xsYmFyLT5j
b250cm9sU2l6ZSgpXSk7CisgICAgfQorICAgIAorICAgIGlmIChwYWludGluZykKKyAgICAgICAg
cmV0dXJuIGJ1dHRvblJlcGFpbnRSZWN0KHJlc3VsdCwgc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigp
LCBzY3JvbGxiYXItPmNvbnRyb2xTaXplKCksIHBhcnQgPT0gQmFja0J1dHRvblN0YXJ0UGFydCk7
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50UmVjdCBTY3JvbGxiYXJUaGVtZU1hYzo6Zm9y
d2FyZEJ1dHRvblJlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIFNjcm9sbGJhclBhcnQgcGFydCwg
Ym9vbCBwYWludGluZykKK3sKKyAgICBJbnRSZWN0IHJlc3VsdDsKKyAgICAKKyAgICBpZiAocGFy
dCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCAmJiAoYnV0dG9uc1BsYWNlbWVudCgpID09IFNjcm9s
bGJhckJ1dHRvbnNOb25lIHx8IGJ1dHRvbnNQbGFjZW1lbnQoKSA9PSBTY3JvbGxiYXJCdXR0b25z
RG91YmxlU3RhcnQpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIAorICAgIGlmIChwYXJ0
ID09IEZvcndhcmRCdXR0b25TdGFydFBhcnQgJiYgKGJ1dHRvbnNQbGFjZW1lbnQoKSA9PSBTY3Jv
bGxiYXJCdXR0b25zTm9uZSB8fCBidXR0b25zUGxhY2VtZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9u
c0RvdWJsZUVuZCB8fCBidXR0b25zUGxhY2VtZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc1Npbmds
ZSkpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIAorICAgIGludCB0aGlja25lc3Mg
PSBzY3JvbGxiYXJUaGlja25lc3Moc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpKTsKKyAgICBpbnQg
b3V0ZXJCdXR0b25MZW5ndGggPSBjT3V0ZXJCdXR0b25MZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9s
U2l6ZSgpXTsKKyAgICBpbnQgYnV0dG9uTGVuZ3RoID0gY0J1dHRvbkxlbmd0aFtzY3JvbGxiYXIt
PmNvbnRyb2xTaXplKCldOworICAgIAorICAgIGJvb2wgb3V0ZXJCdXR0b24gPSBwYXJ0ID09IEZv
cndhcmRCdXR0b25FbmRQYXJ0ICYmIChidXR0b25zUGxhY2VtZW50KCkgPT0gU2Nyb2xsYmFyQnV0
dG9uc0RvdWJsZUVuZCB8fCBidXR0b25zUGxhY2VtZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc0Rv
dWJsZUJvdGgpOworICAgIGlmIChvdXRlckJ1dHRvbikgeworICAgICAgICBpZiAoc2Nyb2xsYmFy
LT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgICAgIHJl
c3VsdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCkgKyBzY3JvbGxiYXItPndpZHRoKCkgLSBvdXRl
ckJ1dHRvbkxlbmd0aCwgc2Nyb2xsYmFyLT55KCksIG91dGVyQnV0dG9uTGVuZ3RoLCB0aGlja25l
c3MpOworICAgICAgICAgICAgaWYgKHBhaW50aW5nKQorICAgICAgICAgICAgICAgIHJlc3VsdC5p
bmZsYXRlWChjT3V0ZXJCdXR0b25PdmVybGFwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIHJlc3VsdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpICsgc2Ny
b2xsYmFyLT5oZWlnaHQoKSAtIG91dGVyQnV0dG9uTGVuZ3RoLCB0aGlja25lc3MsIG91dGVyQnV0
dG9uTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwYWludGluZykKKyAgICAgICAgICAgICAgICBy
ZXN1bHQuaW5mbGF0ZVkoY091dGVyQnV0dG9uT3ZlcmxhcCk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRp
b24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIGludCBzdGFydCA9IHBhcnQg
PT0gRm9yd2FyZEJ1dHRvbkVuZFBhcnQgPyBzY3JvbGxiYXItPngoKSArIHNjcm9sbGJhci0+d2lk
dGgoKSAtIGJ1dHRvbkxlbmd0aCA6IHNjcm9sbGJhci0+eCgpICsgb3V0ZXJCdXR0b25MZW5ndGg7
CisgICAgICAgIHJlc3VsdCA9IEludFJlY3Qoc3RhcnQsIHNjcm9sbGJhci0+eSgpLCBidXR0b25M
ZW5ndGgsIHRoaWNrbmVzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gcGFy
dCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCA/IHNjcm9sbGJhci0+eSgpICsgc2Nyb2xsYmFyLT5o
ZWlnaHQoKSAtIGJ1dHRvbkxlbmd0aCA6IHNjcm9sbGJhci0+eSgpICsgb3V0ZXJCdXR0b25MZW5n
dGg7CisgICAgICAgIHJlc3VsdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHN0YXJ0LCB0aGlj
a25lc3MsIGJ1dHRvbkxlbmd0aCk7CisgICAgfQorICAgIGlmIChwYWludGluZykKKyAgICAgICAg
cmV0dXJuIGJ1dHRvblJlcGFpbnRSZWN0KHJlc3VsdCwgc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigp
LCBzY3JvbGxiYXItPmNvbnRyb2xTaXplKCksIHBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFy
dCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50UmVjdCBTY3JvbGxiYXJUaGVtZU1hYzo6
dHJhY2tSZWN0KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBib29sIHBhaW50aW5nKQoreworICAgIGlm
IChwYWludGluZyB8fCAhaGFzQnV0dG9ucyhzY3JvbGxiYXIpKQorICAgICAgICByZXR1cm4gc2Ny
b2xsYmFyLT5mcmFtZVJlY3QoKTsKKyAgICAKKyAgICBJbnRSZWN0IHJlc3VsdDsKKyAgICBpbnQg
dGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhpY2tuZXNzKHNjcm9sbGJhci0+Y29udHJvbFNpemUoKSk7
CisgICAgaW50IHN0YXJ0V2lkdGggPSAwOworICAgIGludCBlbmRXaWR0aCA9IDA7CisgICAgaW50
IG91dGVyQnV0dG9uTGVuZ3RoID0gY091dGVyQnV0dG9uTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJv
bFNpemUoKV07CisgICAgaW50IGJ1dHRvbkxlbmd0aCA9IGNCdXR0b25MZW5ndGhbc2Nyb2xsYmFy
LT5jb250cm9sU2l6ZSgpXTsKKyAgICBpbnQgZG91YmxlQnV0dG9uTGVuZ3RoID0gb3V0ZXJCdXR0
b25MZW5ndGggKyBidXR0b25MZW5ndGg7CisgICAgc3dpdGNoIChidXR0b25zUGxhY2VtZW50KCkp
IHsKKyAgICAgICAgY2FzZSBTY3JvbGxiYXJCdXR0b25zU2luZ2xlOgorICAgICAgICAgICAgc3Rh
cnRXaWR0aCA9IGJ1dHRvbkxlbmd0aDsKKyAgICAgICAgICAgIGVuZFdpZHRoID0gYnV0dG9uTGVu
Z3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2Nyb2xsYmFyQnV0dG9uc0Rv
dWJsZVN0YXJ0OgorICAgICAgICAgICAgc3RhcnRXaWR0aCA9IGRvdWJsZUJ1dHRvbkxlbmd0aDsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNjcm9sbGJhckJ1dHRvbnNEb3VibGVF
bmQ6CisgICAgICAgICAgICBlbmRXaWR0aCA9IGRvdWJsZUJ1dHRvbkxlbmd0aDsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIFNjcm9sbGJhckJ1dHRvbnNEb3VibGVCb3RoOgorICAg
ICAgICAgICAgc3RhcnRXaWR0aCA9IGRvdWJsZUJ1dHRvbkxlbmd0aDsKKyAgICAgICAgICAgIGVu
ZFdpZHRoID0gZG91YmxlQnV0dG9uTGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgaW50IHRvdGFs
V2lkdGggPSBzdGFydFdpZHRoICsgZW5kV2lkdGg7CisgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50
YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1cm4gSW50UmVjdChz
Y3JvbGxiYXItPngoKSArIHN0YXJ0V2lkdGgsIHNjcm9sbGJhci0+eSgpLCBzY3JvbGxiYXItPndp
ZHRoKCkgLSB0b3RhbFdpZHRoLCB0aGlja25lc3MpOworICAgIHJldHVybiBJbnRSZWN0KHNjcm9s
bGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSArIHN0YXJ0V2lkdGgsIHRoaWNrbmVzcywgc2Nyb2xs
YmFyLT5oZWlnaHQoKSAtIHRvdGFsV2lkdGgpOworfQorCitpbnQgU2Nyb2xsYmFyVGhlbWVNYWM6
Om1pbmltdW1UaHVtYkxlbmd0aChTY3JvbGxiYXIqIHNjcm9sbGJhcikKK3sKKyAgICByZXR1cm4g
Y1RodW1iTWluTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV07Cit9CisKK2Jvb2wgU2Ny
b2xsYmFyVGhlbWVNYWM6OnNob3VsZENlbnRlck9uVGh1bWIoU2Nyb2xsYmFyKiwgY29uc3QgUGxh
dGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaWYgKGV2dC5idXR0b24oKSAhPSBMZWZ0QnV0
dG9uKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdKdW1wT25UcmFja0NsaWNrKQor
ICAgICAgICByZXR1cm4gIWV2dC5hbHRLZXkoKTsKKyAgICByZXR1cm4gZXZ0LmFsdEtleSgpOwor
fQorCitzdGF0aWMgaW50IHNjcm9sbGJhclBhcnRUb0hJUHJlc3NlZFN0YXRlKFNjcm9sbGJhclBh
cnQgcGFydCkKK3sKKyAgICBzd2l0Y2ggKHBhcnQpIHsKKyAgICAgICAgY2FzZSBCYWNrQnV0dG9u
U3RhcnRQYXJ0OgorICAgICAgICAgICAgcmV0dXJuIGtUaGVtZVRvcE91dHNpZGVBcnJvd1ByZXNz
ZWQ7CisgICAgICAgIGNhc2UgQmFja0J1dHRvbkVuZFBhcnQ6CisgICAgICAgICAgICByZXR1cm4g
a1RoZW1lVG9wT3V0c2lkZUFycm93UHJlc3NlZDsgLy8gVGhpcyBkb2VzIG5vdCBtYWtlIG11Y2gg
c2Vuc2UuICBGb3Igc29tZSByZWFzb24gdGhlIG91dHNpZGUgY29uc3RhbnQgaXMgcmVxdWlyZWQu
CisgICAgICAgIGNhc2UgRm9yd2FyZEJ1dHRvblN0YXJ0UGFydDoKKyAgICAgICAgICAgIHJldHVy
biBrVGhlbWVUb3BJbnNpZGVBcnJvd1ByZXNzZWQ7CisgICAgICAgIGNhc2UgRm9yd2FyZEJ1dHRv
bkVuZFBhcnQ6CisgICAgICAgICAgICByZXR1cm4ga1RoZW1lQm90dG9tT3V0c2lkZUFycm93UHJl
c3NlZDsKKyAgICAgICAgY2FzZSBUaHVtYlBhcnQ6CisgICAgICAgICAgICByZXR1cm4ga1RoZW1l
VGh1bWJQcmVzc2VkOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorfQorCitib29sIFNjcm9sbGJhclRoZW1lTWFjOjpwYWludChTY3JvbGxiYXIqIHNjcm9s
bGJhciwgR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0
KQoreworICAgIEhJVGhlbWVUcmFja0RyYXdJbmZvIHRyYWNrSW5mbzsKKyAgICB0cmFja0luZm8u
dmVyc2lvbiA9IDA7CisgICAgdHJhY2tJbmZvLmtpbmQgPSBzY3JvbGxiYXItPmNvbnRyb2xTaXpl
KCkgPT0gUmVndWxhclNjcm9sbGJhciA/IGtUaGVtZU1lZGl1bVNjcm9sbEJhciA6IGtUaGVtZVNt
YWxsU2Nyb2xsQmFyOworICAgIHRyYWNrSW5mby5ib3VuZHMgPSBzY3JvbGxiYXItPmZyYW1lUmVj
dCgpOworICAgIHRyYWNrSW5mby5taW4gPSAwOworICAgIHRyYWNrSW5mby5tYXggPSBzY3JvbGxi
YXItPm1heGltdW0oKTsKKyAgICB0cmFja0luZm8udmFsdWUgPSBzY3JvbGxiYXItPmN1cnJlbnRQ
b3MoKTsKKyAgICB0cmFja0luZm8udHJhY2tJbmZvLnNjcm9sbGJhci52aWV3c2l6ZSA9IHNjcm9s
bGJhci0+cGFnZVN0ZXAoKTsKKyAgICB0cmFja0luZm8uYXR0cmlidXRlcyA9IDA7CisgICAgaWYg
KHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAg
ICB0cmFja0luZm8uYXR0cmlidXRlcyB8PSBrVGhlbWVUcmFja0hvcml6b250YWw7CisKKyAgICBp
ZiAoIXNjcm9sbGJhci0+ZW5hYmxlZCgpKQorICAgICAgICB0cmFja0luZm8uZW5hYmxlU3RhdGUg
PSBrVGhlbWVUcmFja0Rpc2FibGVkOworICAgIGVsc2UKKyAgICAgICAgdHJhY2tJbmZvLmVuYWJs
ZVN0YXRlID0gc2Nyb2xsYmFyLT5jbGllbnQoKS0+aXNBY3RpdmUoKSA/IGtUaGVtZVRyYWNrQWN0
aXZlIDoga1RoZW1lVHJhY2tJbmFjdGl2ZTsKKworICAgIGlmIChoYXNUaHVtYihzY3JvbGxiYXIp
KQorICAgICAgICB0cmFja0luZm8uYXR0cmlidXRlcyB8PSBrVGhlbWVUcmFja1Nob3dUaHVtYjsK
KyAgICBlbHNlIGlmICghaGFzQnV0dG9ucyhzY3JvbGxiYXIpKQorICAgICAgICB0cmFja0luZm8u
ZW5hYmxlU3RhdGUgPSBrVGhlbWVUcmFja05vdGhpbmdUb1Njcm9sbDsKKyAgICB0cmFja0luZm8u
dHJhY2tJbmZvLnNjcm9sbGJhci5wcmVzc1N0YXRlID0gc2Nyb2xsYmFyUGFydFRvSElQcmVzc2Vk
U3RhdGUoc2Nyb2xsYmFyLT5wcmVzc2VkUGFydCgpKTsKKyAgICAKKyAgICBDR0FmZmluZVRyYW5z
Zm9ybSBjdXJyZW50Q1RNID0gQ0dDb250ZXh0R2V0Q1RNKGNvbnRleHQtPnBsYXRmb3JtQ29udGV4
dCgpKTsKKyAgICAKKyAgICAvLyBUaGUgQXF1YSBzY3JvbGxiYXIgaXMgYnVnZ3kgd2hlbiByb3Rh
dGVkIGFuZCBzY2FsZWQuICBXZSB3aWxsIGp1c3QgZHJhdyBpbnRvIGEgYml0bWFwIGlmIHdlIGRl
dGVjdCBhIHNjYWxlIG9yIHJvdGF0aW9uLgorICAgIGJvb2wgY2FuRHJhd0RpcmVjdGx5ID0gY3Vy
cmVudENUTS5hID09IDEuMGYgJiYgY3VycmVudENUTS5iID09IDAuMGYgJiYgY3VycmVudENUTS5j
ID09IDAuMGYgJiYgKGN1cnJlbnRDVE0uZCA9PSAxLjBmIHx8IGN1cnJlbnRDVE0uZCA9PSAtMS4w
Zik7CisgICAgaWYgKGNhbkRyYXdEaXJlY3RseSkKKyAgICAgICAgSElUaGVtZURyYXdUcmFjaygm
dHJhY2tJbmZvLCAwLCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwga0hJVGhlbWVPcmllbnRh
dGlvbk5vcm1hbCk7CisgICAgZWxzZSB7CisgICAgICAgIHRyYWNrSW5mby5ib3VuZHMgPSBJbnRS
ZWN0KEludFBvaW50KCksIHNjcm9sbGJhci0+ZnJhbWVSZWN0KCkuc2l6ZSgpKTsKKyAgICAgICAg
CisgICAgICAgIEludFJlY3QgYnVmZmVyUmVjdChzY3JvbGxiYXItPmZyYW1lUmVjdCgpKTsKKyAg
ICAgICAgYnVmZmVyUmVjdC5pbnRlcnNlY3QoZGFtYWdlUmVjdCk7CisgICAgICAgIGJ1ZmZlclJl
Y3QubW92ZSgtc2Nyb2xsYmFyLT5mcmFtZVJlY3QoKS54KCksIC1zY3JvbGxiYXItPmZyYW1lUmVj
dCgpLnkoKSk7CisgICAgICAgIAorICAgICAgICBPd25QdHI8SW1hZ2VCdWZmZXI+IGltYWdlQnVm
ZmVyID0gSW1hZ2VCdWZmZXI6OmNyZWF0ZShidWZmZXJSZWN0LnNpemUoKSk7CisgICAgICAgIGlm
ICghaW1hZ2VCdWZmZXIpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAg
ICAgIEhJVGhlbWVEcmF3VHJhY2soJnRyYWNrSW5mbywgMCwgaW1hZ2VCdWZmZXItPmNvbnRleHQo
KS0+cGxhdGZvcm1Db250ZXh0KCksIGtISVRoZW1lT3JpZW50YXRpb25Ob3JtYWwpOworICAgICAg
ICBjb250ZXh0LT5kcmF3SW1hZ2UoaW1hZ2VCdWZmZXItPmltYWdlKCksIERldmljZUNvbG9yU3Bh
Y2UsIHNjcm9sbGJhci0+ZnJhbWVSZWN0KCkubG9jYXRpb24oKSk7CisgICAgfQorCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK30KKwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9TY3Jv
bGxiYXJUaGVtZUNocm9taXVtTWFjLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Y2hyb21pdW0vU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYy5tbQkocmV2aXNpb24gNTE2MDApCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1Njcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMubW0J
KHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA4
IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBH
b29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCkBAIC0yMCwxMSArMjEsMTEgQEAKICAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKICAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAogI2luY2x1
ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lTWFjLmgiCisjaW5jbHVkZSAi
U2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYy5oIgogCiAjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIK
ICNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKQEAgLTM4LDYgKzM5LDE4IEBACiB1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKKy8vIFRoaXMgZmls
ZSAoYW5kIGl0cyBhc3NvY2lhdGVkIC5oIGZpbGUpIGlzIGEgY2xvbmUgb2YgU2Nyb2xsYmFyVGhl
bWVNYWMubW0uCisvLyBCZWNhdXNlIHdlIHdhbnQgdG8gZHJhdyB0aWNrbWFya3MgaW4gdGhlIHNj
cm9sbGJhciwgd2UgbXVzdCBtYWludGFpbiBhIGZvcmsuCisvLyBQbGVhc2UgbWFpbnRhaW4gdGhp
cyBmaWxlIGJ5IHBlcmZvcm1pbmcgcGFyYWxsZWwgY2hhbmdlcyB0byBpdC4KKy8vCisvLyBUaGUg
b25seSBjaGFuZ2VzIGZyb20gU2Nyb2xsYmFyVGhlbWVNYWMgc2hvdWxkIGJlOgorLy8gLSBUaGUg
Y2xhc3NuYW1lIGNoYW5nZSBmcm9tIFNjcm9sbGJhclRoZW1lTWFjIHRvIFNjcm9sbGJhclRoZW1l
Q2hyb21pdW1NYWMuCisvLyAtIEluIHBhaW50KCkgdGhlIGNvZGUgdG8gcGFpbnQgdGhlIHRyYWNr
LCB0aWNrbWFya3MsIGFuZCB0aHVtYiBzZXBhcmF0ZWx5LgorLy8KKy8vIEZvciBhbGwgb3RoZXIg
ZGlmZmVyZW5jZXMsIGlmIGl0IHdhcyBpbnRyb2R1Y2VkIGluIHRoaXMgZmlsZSwgdGhlbiB0aGUK
Ky8vIG1haW50YWluZXIgZm9yZ290IHRvIGluY2x1ZGUgaXQgaW4gdGhlIGxpc3Q7IG90aGVyd2lz
ZSBpdCBpcyBhbiB1cGRhdGUgdGhhdAorLy8gc2hvdWxkIGhhdmUgYmVlbiBhcHBsaWVkIHRvIHRo
aXMgZmlsZSBidXQgd2FzIG5vdC4KKwogc3RhdGljIEhhc2hTZXQ8U2Nyb2xsYmFyKj4qIGdTY3Jv
bGxiYXJzOwogCiBAaW50ZXJmYWNlIFNjcm9sbGJhclByZWZzT2JzZXJ2ZXIgOiBOU09iamVjdApA
QCAtNTcsNyArNzAsNyBAQCBzdGF0aWMgSGFzaFNldDxTY3JvbGxiYXIqPiogZ1Njcm9sbGJhcnM7
CiB7CiAgICAgVU5VU0VEX1BBUkFNKHVudXNlZE5vdGlmaWNhdGlvbik7CiAKLSAgICBzdGF0aWNf
Y2FzdDxTY3JvbGxiYXJUaGVtZU1hYyo+KFNjcm9sbGJhclRoZW1lOjpuYXRpdmVUaGVtZSgpKS0+
cHJlZmVyZW5jZXNDaGFuZ2VkKCk7CisgICAgc3RhdGljX2Nhc3Q8U2Nyb2xsYmFyVGhlbWVDaHJv
bWl1bU1hYyo+KFNjcm9sbGJhclRoZW1lOjpuYXRpdmVUaGVtZSgpKS0+cHJlZmVyZW5jZXNDaGFu
Z2VkKCk7CiAgICAgaWYgKCFnU2Nyb2xsYmFycykKICAgICAgICAgcmV0dXJuOwogICAgIEhhc2hT
ZXQ8U2Nyb2xsYmFyKj46Oml0ZXJhdG9yIGVuZCA9IGdTY3JvbGxiYXJzLT5lbmQoKTsKQEAgLTcx
LDcgKzg0LDcgQEAgc3RhdGljIEhhc2hTZXQ8U2Nyb2xsYmFyKj4qIGdTY3JvbGxiYXJzOwogewog
ICAgIFVOVVNFRF9QQVJBTSh1bnVzZWROb3RpZmljYXRpb24pOwogCi0gICAgc3RhdGljX2Nhc3Q8
U2Nyb2xsYmFyVGhlbWVNYWMqPihTY3JvbGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKSktPnByZWZl
cmVuY2VzQ2hhbmdlZCgpOworICAgIHN0YXRpY19jYXN0PFNjcm9sbGJhclRoZW1lQ2hyb21pdW1N
YWMqPihTY3JvbGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKSktPnByZWZlcmVuY2VzQ2hhbmdlZCgp
OwogfQogCiArICh2b2lkKXJlZ2lzdGVyQXNPYnNlcnZlcgpAQCAtODYsNyArOTksNyBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKIFNjcm9sbGJhclRoZW1lKiBTY3JvbGxiYXJUaGVtZTo6bmF0aXZl
VGhlbWUoKQogewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoU2Nyb2xsYmFyVGhlbWVNYWMsIHRo
ZW1lLCAoKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTY3JvbGxiYXJUaGVtZUNocm9taXVt
TWFjLCB0aGVtZSwgKCkpOwogICAgIHJldHVybiAmdGhlbWU7CiB9CiAKQEAgLTEyMCwxNCArMTMz
LDE0IEBAIHN0YXRpYyB2b2lkIHVwZGF0ZUFycm93UGxhY2VtZW50KCkKICAgICAgICAgZ0J1dHRv
blBsYWNlbWVudCA9IFNjcm9sbGJhckJ1dHRvbnNEb3VibGVFbmQ7IC8vIFRoZSBkZWZhdWx0IGlz
IFNjcm9sbGJhckJ1dHRvbnNEb3VibGVFbmQuCiB9CiAKLXZvaWQgU2Nyb2xsYmFyVGhlbWVNYWM6
OnJlZ2lzdGVyU2Nyb2xsYmFyKFNjcm9sbGJhciogc2Nyb2xsYmFyKQordm9pZCBTY3JvbGxiYXJU
aGVtZUNocm9taXVtTWFjOjpyZWdpc3RlclNjcm9sbGJhcihTY3JvbGxiYXIqIHNjcm9sbGJhcikK
IHsKICAgICBpZiAoIWdTY3JvbGxiYXJzKQogICAgICAgICBnU2Nyb2xsYmFycyA9IG5ldyBIYXNo
U2V0PFNjcm9sbGJhcio+OwogICAgIGdTY3JvbGxiYXJzLT5hZGQoc2Nyb2xsYmFyKTsKIH0KIAot
dm9pZCBTY3JvbGxiYXJUaGVtZU1hYzo6dW5yZWdpc3RlclNjcm9sbGJhcihTY3JvbGxiYXIqIHNj
cm9sbGJhcikKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYzo6dW5yZWdpc3RlclNjcm9s
bGJhcihTY3JvbGxiYXIqIHNjcm9sbGJhcikKIHsKICAgICBnU2Nyb2xsYmFycy0+cmVtb3ZlKHNj
cm9sbGJhcik7CiAgICAgaWYgKGdTY3JvbGxiYXJzLT5pc0VtcHR5KCkpIHsKQEAgLTEzNiw3ICsx
NDksNyBAQCB2b2lkIFNjcm9sbGJhclRoZW1lTWFjOjp1bnJlZ2lzdGVyU2Nyb2xsCiAgICAgfQog
fQogCi1TY3JvbGxiYXJUaGVtZU1hYzo6U2Nyb2xsYmFyVGhlbWVNYWMoKQorU2Nyb2xsYmFyVGhl
bWVDaHJvbWl1bU1hYzo6U2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYygpCiB7CiAgICAgc3RhdGlj
IGJvb2wgaW5pdGlhbGl6ZWQ7CiAgICAgaWYgKCFpbml0aWFsaXplZCkgewpAQCAtMTQ2LDExICsx
NTksMTEgQEAgU2Nyb2xsYmFyVGhlbWVNYWM6OlNjcm9sbGJhclRoZW1lTWFjKCkKICAgICB9CiB9
CiAKLVNjcm9sbGJhclRoZW1lTWFjOjp+U2Nyb2xsYmFyVGhlbWVNYWMoKQorU2Nyb2xsYmFyVGhl
bWVDaHJvbWl1bU1hYzo6flNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMoKQogewogfQogCi12b2lk
IFNjcm9sbGJhclRoZW1lTWFjOjpwcmVmZXJlbmNlc0NoYW5nZWQoKQordm9pZCBTY3JvbGxiYXJU
aGVtZUNocm9taXVtTWFjOjpwcmVmZXJlbmNlc0NoYW5nZWQoKQogewogICAgIE5TVXNlckRlZmF1
bHRzICpkZWZhdWx0cyA9IFtOU1VzZXJEZWZhdWx0cyBzdGFuZGFyZFVzZXJEZWZhdWx0c107CiAg
ICAgW2RlZmF1bHRzIHN5bmNocm9uaXplXTsKQEAgLTE2MCwzNyArMTczLDM3IEBAIHZvaWQgU2Ny
b2xsYmFyVGhlbWVNYWM6OnByZWZlcmVuY2VzQ2hhbmcKICAgICBnSnVtcE9uVHJhY2tDbGljayA9
IFtkZWZhdWx0cyBib29sRm9yS2V5OkAiQXBwbGVTY3JvbGxlclBhZ2luZ0JlaGF2aW9yIl07CiB9
CiAKLWludCBTY3JvbGxiYXJUaGVtZU1hYzo6c2Nyb2xsYmFyVGhpY2tuZXNzKFNjcm9sbGJhckNv
bnRyb2xTaXplIGNvbnRyb2xTaXplKQoraW50IFNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWM6OnNj
cm9sbGJhclRoaWNrbmVzcyhTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6ZSkKIHsKICAg
ICByZXR1cm4gY1Njcm9sbGJhclRoaWNrbmVzc1tjb250cm9sU2l6ZV07CiB9CiAKLWRvdWJsZSBT
Y3JvbGxiYXJUaGVtZU1hYzo6aW5pdGlhbEF1dG9zY3JvbGxUaW1lckRlbGF5KCkKK2RvdWJsZSBT
Y3JvbGxiYXJUaGVtZUNocm9taXVtTWFjOjppbml0aWFsQXV0b3Njcm9sbFRpbWVyRGVsYXkoKQog
ewogICAgIHJldHVybiBnSW5pdGlhbEJ1dHRvbkRlbGF5OwogfQogCi1kb3VibGUgU2Nyb2xsYmFy
VGhlbWVNYWM6OmF1dG9zY3JvbGxUaW1lckRlbGF5KCkKK2RvdWJsZSBTY3JvbGxiYXJUaGVtZUNo
cm9taXVtTWFjOjphdXRvc2Nyb2xsVGltZXJEZWxheSgpCiB7CiAgICAgcmV0dXJuIGdBdXRvc2Ny
b2xsQnV0dG9uRGVsYXk7CiB9Ci0gICAgCi1TY3JvbGxiYXJCdXR0b25zUGxhY2VtZW50IFNjcm9s
bGJhclRoZW1lTWFjOjpidXR0b25zUGxhY2VtZW50KCkgY29uc3QKKworU2Nyb2xsYmFyQnV0dG9u
c1BsYWNlbWVudCBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjOjpidXR0b25zUGxhY2VtZW50KCkg
Y29uc3QKIHsKICAgICByZXR1cm4gZ0J1dHRvblBsYWNlbWVudDsKIH0KIAotYm9vbCBTY3JvbGxi
YXJUaGVtZU1hYzo6aGFzQnV0dG9ucyhTY3JvbGxiYXIqIHNjcm9sbGJhcikKK2Jvb2wgU2Nyb2xs
YmFyVGhlbWVDaHJvbWl1bU1hYzo6aGFzQnV0dG9ucyhTY3JvbGxiYXIqIHNjcm9sbGJhcikKIHsK
LSAgICByZXR1cm4gc2Nyb2xsYmFyLT5lbmFibGVkKCkgJiYgKHNjcm9sbGJhci0+b3JpZW50YXRp
b24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gCi0gICAgICAgICAgICAgc2Nyb2xsYmFyLT53
aWR0aCgpIDogCisgICAgcmV0dXJuIHNjcm9sbGJhci0+ZW5hYmxlZCgpICYmIChzY3JvbGxiYXIt
Pm9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/CisgICAgICAgICAgICAgc2Ny
b2xsYmFyLT53aWR0aCgpIDoKICAgICAgICAgICAgICBzY3JvbGxiYXItPmhlaWdodCgpKSA+PSAy
ICogKGNSZWFsQnV0dG9uTGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV0gLSBjQnV0dG9u
SGl0SW5zZXRbc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpXSk7CiB9CiAKLWJvb2wgU2Nyb2xsYmFy
VGhlbWVNYWM6Omhhc1RodW1iKFNjcm9sbGJhciogc2Nyb2xsYmFyKQorYm9vbCBTY3JvbGxiYXJU
aGVtZUNocm9taXVtTWFjOjpoYXNUaHVtYihTY3JvbGxiYXIqIHNjcm9sbGJhcikKIHsKLSAgICBy
ZXR1cm4gc2Nyb2xsYmFyLT5lbmFibGVkKCkgJiYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gCi0gICAgICAgICAgICAgc2Nyb2xsYmFyLT53aWR0aCgp
IDogCisgICAgcmV0dXJuIHNjcm9sbGJhci0+ZW5hYmxlZCgpICYmIChzY3JvbGxiYXItPm9yaWVu
dGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/CisgICAgICAgICAgICAgc2Nyb2xsYmFy
LT53aWR0aCgpIDoKICAgICAgICAgICAgICBzY3JvbGxiYXItPmhlaWdodCgpKSA+PSAyICogY0J1
dHRvbkluc2V0W3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV0gKyBjVGh1bWJNaW5MZW5ndGhbc2Ny
b2xsYmFyLT5jb250cm9sU2l6ZSgpXSArIDE7CiB9CiAKQEAgLTIxMCwxNiArMjIzLDE2IEBAIHN0
YXRpYyBJbnRSZWN0IGJ1dHRvblJlcGFpbnRSZWN0KGNvbnN0IEkKICAgICByZXR1cm4gcGFpbnRS
ZWN0OwogfQogCi1JbnRSZWN0IFNjcm9sbGJhclRoZW1lTWFjOjpiYWNrQnV0dG9uUmVjdChTY3Jv
bGxiYXIqIHNjcm9sbGJhciwgU2Nyb2xsYmFyUGFydCBwYXJ0LCBib29sIHBhaW50aW5nKQorSW50
UmVjdCBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjOjpiYWNrQnV0dG9uUmVjdChTY3JvbGxiYXIq
IHNjcm9sbGJhciwgU2Nyb2xsYmFyUGFydCBwYXJ0LCBib29sIHBhaW50aW5nKQogewogICAgIElu
dFJlY3QgcmVzdWx0OwotICAgIAorCiAgICAgaWYgKHBhcnQgPT0gQmFja0J1dHRvblN0YXJ0UGFy
dCAmJiAoYnV0dG9uc1BsYWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNOb25lIHx8IGJ1dHRv
bnNQbGFjZW1lbnQoKSA9PSBTY3JvbGxiYXJCdXR0b25zRG91YmxlRW5kKSkKICAgICAgICAgcmV0
dXJuIHJlc3VsdDsKLSAgICAKKwogICAgIGlmIChwYXJ0ID09IEJhY2tCdXR0b25FbmRQYXJ0ICYm
IChidXR0b25zUGxhY2VtZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc05vbmUgfHwgYnV0dG9uc1Bs
YWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNEb3VibGVTdGFydCB8fCBidXR0b25zUGxhY2Vt
ZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc1NpbmdsZSkpCiAgICAgICAgIHJldHVybiByZXN1bHQ7
Ci0gICAgICAgIAorCiAgICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcyhzY3Jv
bGxiYXItPmNvbnRyb2xTaXplKCkpOwogICAgIGJvb2wgb3V0ZXJCdXR0b24gPSBwYXJ0ID09IEJh
Y2tCdXR0b25TdGFydFBhcnQgJiYgKGJ1dHRvbnNQbGFjZW1lbnQoKSA9PSBTY3JvbGxiYXJCdXR0
b25zRG91YmxlU3RhcnQgfHwgYnV0dG9uc1BsYWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNE
b3VibGVCb3RoKTsKICAgICBpZiAob3V0ZXJCdXR0b24pIHsKQEAgLTIyOSw3ICsyNDIsNyBAQCBJ
bnRSZWN0IFNjcm9sbGJhclRoZW1lTWFjOjpiYWNrQnV0dG9uUmVjCiAgICAgICAgICAgICByZXN1
bHQgPSBJbnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSwgdGhpY2tuZXNzLCBj
T3V0ZXJCdXR0b25MZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpXSArIHBhaW50aW5nID8g
Y091dGVyQnV0dG9uT3ZlcmxhcCA6IDApOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0K
LSAgICAKKwogICAgIC8vIE91ciByZXBhaW50IHJlY3QgaXMgc2xpZ2h0bHkgbGFyZ2VyLCBzaW5j
ZSB3ZSBhcmUgYSBidXR0b24gdGhhdCBpcyBhZGphY2VudCB0byB0aGUgdHJhY2suCiAgICAgaWYg
KHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CiAgICAg
ICAgIGludCBzdGFydCA9IHBhcnQgPT0gQmFja0J1dHRvblN0YXJ0UGFydCA/IHNjcm9sbGJhci0+
eCgpIDogc2Nyb2xsYmFyLT54KCkgKyBzY3JvbGxiYXItPndpZHRoKCkgLSBjT3V0ZXJCdXR0b25M
ZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpXSAtIGNCdXR0b25MZW5ndGhbc2Nyb2xsYmFy
LT5jb250cm9sU2l6ZSgpXTsKQEAgLTIzOCwyNiArMjUxLDI2IEBAIEludFJlY3QgU2Nyb2xsYmFy
VGhlbWVNYWM6OmJhY2tCdXR0b25SZWMKICAgICAgICAgaW50IHN0YXJ0ID0gcGFydCA9PSBCYWNr
QnV0dG9uU3RhcnRQYXJ0ID8gc2Nyb2xsYmFyLT55KCkgOiBzY3JvbGxiYXItPnkoKSArIHNjcm9s
bGJhci0+aGVpZ2h0KCkgLSBjT3V0ZXJCdXR0b25MZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9sU2l6
ZSgpXSAtIGNCdXR0b25MZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpXTsKICAgICAgICAg
cmVzdWx0ID0gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc3RhcnQsIHRoaWNrbmVzcywgY0J1dHRv
bkxlbmd0aFtzY3JvbGxiYXItPmNvbnRyb2xTaXplKCldKTsKICAgICB9Ci0gICAgCisKICAgICBp
ZiAocGFpbnRpbmcpCiAgICAgICAgIHJldHVybiBidXR0b25SZXBhaW50UmVjdChyZXN1bHQsIHNj
cm9sbGJhci0+b3JpZW50YXRpb24oKSwgc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpLCBwYXJ0ID09
IEJhY2tCdXR0b25TdGFydFBhcnQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLUludFJlY3Qg
U2Nyb2xsYmFyVGhlbWVNYWM6OmZvcndhcmRCdXR0b25SZWN0KFNjcm9sbGJhciogc2Nyb2xsYmFy
LCBTY3JvbGxiYXJQYXJ0IHBhcnQsIGJvb2wgcGFpbnRpbmcpCitJbnRSZWN0IFNjcm9sbGJhclRo
ZW1lQ2hyb21pdW1NYWM6OmZvcndhcmRCdXR0b25SZWN0KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBT
Y3JvbGxiYXJQYXJ0IHBhcnQsIGJvb2wgcGFpbnRpbmcpCiB7CiAgICAgSW50UmVjdCByZXN1bHQ7
Ci0gICAgCisKICAgICBpZiAocGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCAmJiAoYnV0dG9u
c1BsYWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNOb25lIHx8IGJ1dHRvbnNQbGFjZW1lbnQo
KSA9PSBTY3JvbGxiYXJCdXR0b25zRG91YmxlU3RhcnQpKQogICAgICAgICByZXR1cm4gcmVzdWx0
OwotICAgIAorCiAgICAgaWYgKHBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCAmJiAoYnV0
dG9uc1BsYWNlbWVudCgpID09IFNjcm9sbGJhckJ1dHRvbnNOb25lIHx8IGJ1dHRvbnNQbGFjZW1l
bnQoKSA9PSBTY3JvbGxiYXJCdXR0b25zRG91YmxlRW5kIHx8IGJ1dHRvbnNQbGFjZW1lbnQoKSA9
PSBTY3JvbGxiYXJCdXR0b25zU2luZ2xlKSkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAg
ICAgCisKICAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhpY2tuZXNzKHNjcm9sbGJhci0+
Y29udHJvbFNpemUoKSk7CiAgICAgaW50IG91dGVyQnV0dG9uTGVuZ3RoID0gY091dGVyQnV0dG9u
TGVuZ3RoW3Njcm9sbGJhci0+Y29udHJvbFNpemUoKV07CiAgICAgaW50IGJ1dHRvbkxlbmd0aCA9
IGNCdXR0b25MZW5ndGhbc2Nyb2xsYmFyLT5jb250cm9sU2l6ZSgpXTsKLSAgICAKKwogICAgIGJv
b2wgb3V0ZXJCdXR0b24gPSBwYXJ0ID09IEZvcndhcmRCdXR0b25FbmRQYXJ0ICYmIChidXR0b25z
UGxhY2VtZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc0RvdWJsZUVuZCB8fCBidXR0b25zUGxhY2Vt
ZW50KCkgPT0gU2Nyb2xsYmFyQnV0dG9uc0RvdWJsZUJvdGgpOwogICAgIGlmIChvdXRlckJ1dHRv
bikgewogICAgICAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxT
Y3JvbGxiYXIpIHsKQEAgLTI3MSw3ICsyODQsNyBAQCBJbnRSZWN0IFNjcm9sbGJhclRoZW1lTWFj
Ojpmb3J3YXJkQnV0dG9uCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9
Ci0gICAgCisKICAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxT
Y3JvbGxiYXIpIHsKICAgICAgICAgaW50IHN0YXJ0ID0gcGFydCA9PSBGb3J3YXJkQnV0dG9uRW5k
UGFydCA/IHNjcm9sbGJhci0+eCgpICsgc2Nyb2xsYmFyLT53aWR0aCgpIC0gYnV0dG9uTGVuZ3Ro
IDogc2Nyb2xsYmFyLT54KCkgKyBvdXRlckJ1dHRvbkxlbmd0aDsKICAgICAgICAgcmVzdWx0ID0g
SW50UmVjdChzdGFydCwgc2Nyb2xsYmFyLT55KCksIGJ1dHRvbkxlbmd0aCwgdGhpY2tuZXNzKTsK
QEAgLTI4NCwxMSArMjk3LDExIEBAIEludFJlY3QgU2Nyb2xsYmFyVGhlbWVNYWM6OmZvcndhcmRC
dXR0b24KICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1JbnRSZWN0IFNjcm9sbGJhclRoZW1lTWFj
Ojp0cmFja1JlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGJvb2wgcGFpbnRpbmcpCitJbnRSZWN0
IFNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWM6OnRyYWNrUmVjdChTY3JvbGxiYXIqIHNjcm9sbGJh
ciwgYm9vbCBwYWludGluZykKIHsKICAgICBpZiAocGFpbnRpbmcgfHwgIWhhc0J1dHRvbnMoc2Ny
b2xsYmFyKSkKICAgICAgICAgcmV0dXJuIHNjcm9sbGJhci0+ZnJhbWVSZWN0KCk7Ci0gICAgCisK
ICAgICBJbnRSZWN0IHJlc3VsdDsKICAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhpY2tu
ZXNzKHNjcm9sbGJhci0+Y29udHJvbFNpemUoKSk7CiAgICAgaW50IHN0YXJ0V2lkdGggPSAwOwpA
QCAtMzE0LDE5ICszMjcsMTkgQEAgSW50UmVjdCBTY3JvbGxiYXJUaGVtZU1hYzo6dHJhY2tSZWN0
KFNjcgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIAor
CiAgICAgaW50IHRvdGFsV2lkdGggPSBzdGFydFdpZHRoICsgZW5kV2lkdGg7CiAgICAgaWYgKHNj
cm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQogICAgICAgICBy
ZXR1cm4gSW50UmVjdChzY3JvbGxiYXItPngoKSArIHN0YXJ0V2lkdGgsIHNjcm9sbGJhci0+eSgp
LCBzY3JvbGxiYXItPndpZHRoKCkgLSB0b3RhbFdpZHRoLCB0aGlja25lc3MpOwogICAgIHJldHVy
biBJbnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSArIHN0YXJ0V2lkdGgsIHRo
aWNrbmVzcywgc2Nyb2xsYmFyLT5oZWlnaHQoKSAtIHRvdGFsV2lkdGgpOwogfQogCi1pbnQgU2Ny
b2xsYmFyVGhlbWVNYWM6Om1pbmltdW1UaHVtYkxlbmd0aChTY3JvbGxiYXIqIHNjcm9sbGJhcikK
K2ludCBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjOjptaW5pbXVtVGh1bWJMZW5ndGgoU2Nyb2xs
YmFyKiBzY3JvbGxiYXIpCiB7CiAgICAgcmV0dXJuIGNUaHVtYk1pbkxlbmd0aFtzY3JvbGxiYXIt
PmNvbnRyb2xTaXplKCldOwogfQogCi1ib29sIFNjcm9sbGJhclRoZW1lTWFjOjpzaG91bGRDZW50
ZXJPblRodW1iKFNjcm9sbGJhciosIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQorYm9v
bCBTY3JvbGxiYXJUaGVtZUNocm9taXVtTWFjOjpzaG91bGRDZW50ZXJPblRodW1iKFNjcm9sbGJh
ciosIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZ0KQogewogICAgIGlmIChldnQuYnV0dG9u
KCkgIT0gTGVmdEJ1dHRvbikKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzUzLDcgKzM2Niw3
IEBAIHN0YXRpYyBpbnQgc2Nyb2xsYmFyUGFydFRvSElQcmVzc2VkU3RhdGUKICAgICB9CiB9CiAK
LWJvb2wgU2Nyb2xsYmFyVGhlbWVNYWM6OnBhaW50KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpCitib29sIFNj
cm9sbGJhclRoZW1lQ2hyb21pdW1NYWM6OnBhaW50KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpCiB7CiAgICAg
SElUaGVtZVRyYWNrRHJhd0luZm8gdHJhY2tJbmZvOwogICAgIHRyYWNrSW5mby52ZXJzaW9uID0g
MDsKQEAgLTM3MiwzMCArMzg1LDcxIEBAIGJvb2wgU2Nyb2xsYmFyVGhlbWVNYWM6OnBhaW50KFNj
cm9sbGJhcioKICAgICBlbHNlCiAgICAgICAgIHRyYWNrSW5mby5lbmFibGVTdGF0ZSA9IHNjcm9s
bGJhci0+Y2xpZW50KCktPmlzQWN0aXZlKCkgPyBrVGhlbWVUcmFja0FjdGl2ZSA6IGtUaGVtZVRy
YWNrSW5hY3RpdmU7CiAKLSAgICBpZiAoaGFzVGh1bWIoc2Nyb2xsYmFyKSkKLSAgICAgICAgdHJh
Y2tJbmZvLmF0dHJpYnV0ZXMgfD0ga1RoZW1lVHJhY2tTaG93VGh1bWI7Ci0gICAgZWxzZSBpZiAo
IWhhc0J1dHRvbnMoc2Nyb2xsYmFyKSkKKyAgICBpZiAoIWhhc0J1dHRvbnMoc2Nyb2xsYmFyKSkK
ICAgICAgICAgdHJhY2tJbmZvLmVuYWJsZVN0YXRlID0ga1RoZW1lVHJhY2tOb3RoaW5nVG9TY3Jv
bGw7CiAgICAgdHJhY2tJbmZvLnRyYWNrSW5mby5zY3JvbGxiYXIucHJlc3NTdGF0ZSA9IHNjcm9s
bGJhclBhcnRUb0hJUHJlc3NlZFN0YXRlKHNjcm9sbGJhci0+cHJlc3NlZFBhcnQoKSk7Ci0gICAg
CisKICAgICBDR0FmZmluZVRyYW5zZm9ybSBjdXJyZW50Q1RNID0gQ0dDb250ZXh0R2V0Q1RNKGNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpKTsKLSAgICAKKwogICAgIC8vIFRoZSBBcXVhIHNjcm9s
bGJhciBpcyBidWdneSB3aGVuIHJvdGF0ZWQgYW5kIHNjYWxlZC4gIFdlIHdpbGwganVzdCBkcmF3
IGludG8gYSBiaXRtYXAgaWYgd2UgZGV0ZWN0IGEgc2NhbGUgb3Igcm90YXRpb24uCiAgICAgYm9v
bCBjYW5EcmF3RGlyZWN0bHkgPSBjdXJyZW50Q1RNLmEgPT0gMS4wZiAmJiBjdXJyZW50Q1RNLmIg
PT0gMC4wZiAmJiBjdXJyZW50Q1RNLmMgPT0gMC4wZiAmJiAoY3VycmVudENUTS5kID09IDEuMGYg
fHwgY3VycmVudENUTS5kID09IC0xLjBmKTsKLSAgICBpZiAoY2FuRHJhd0RpcmVjdGx5KQotICAg
ICAgICBISVRoZW1lRHJhd1RyYWNrKCZ0cmFja0luZm8sIDAsIGNvbnRleHQtPnBsYXRmb3JtQ29u
dGV4dCgpLCBrSElUaGVtZU9yaWVudGF0aW9uTm9ybWFsKTsKLSAgICBlbHNlIHsKKyAgICBHcmFw
aGljc0NvbnRleHQqIGRyYXdpbmdDb250ZXh0ID0gY29udGV4dDsKKyAgICBPd25QdHI8SW1hZ2VC
dWZmZXI+IGltYWdlQnVmZmVyOworICAgIGlmICghY2FuRHJhd0RpcmVjdGx5KSB7CiAgICAgICAg
IHRyYWNrSW5mby5ib3VuZHMgPSBJbnRSZWN0KEludFBvaW50KCksIHNjcm9sbGJhci0+ZnJhbWVS
ZWN0KCkuc2l6ZSgpKTsKLSAgICAgICAgCisKICAgICAgICAgSW50UmVjdCBidWZmZXJSZWN0KHNj
cm9sbGJhci0+ZnJhbWVSZWN0KCkpOwogICAgICAgICBidWZmZXJSZWN0LmludGVyc2VjdChkYW1h
Z2VSZWN0KTsKICAgICAgICAgYnVmZmVyUmVjdC5tb3ZlKC1zY3JvbGxiYXItPmZyYW1lUmVjdCgp
LngoKSwgLXNjcm9sbGJhci0+ZnJhbWVSZWN0KCkueSgpKTsKLSAgICAgICAgCi0gICAgICAgIE93
blB0cjxJbWFnZUJ1ZmZlcj4gaW1hZ2VCdWZmZXIgPSBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKGJ1ZmZl
clJlY3Quc2l6ZSgpKTsKKworICAgICAgICBpbWFnZUJ1ZmZlciA9IEltYWdlQnVmZmVyOjpjcmVh
dGUoYnVmZmVyUmVjdC5zaXplKCkpOwogICAgICAgICBpZiAoIWltYWdlQnVmZmVyKQogICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICBISVRoZW1lRHJhd1RyYWNrKCZ0
cmFja0luZm8sIDAsIGltYWdlQnVmZmVyLT5jb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpLCBr
SElUaGVtZU9yaWVudGF0aW9uTm9ybWFsKTsKKworICAgICAgICBkcmF3aW5nQ29udGV4dCA9IGlt
YWdlQnVmZmVyLT5jb250ZXh0KCk7CisgICAgfQorCisgICAgLy8gRHJhdyB0aHVtYmxlc3MuCisg
ICAgSElUaGVtZURyYXdUcmFjaygmdHJhY2tJbmZvLCAwLCBkcmF3aW5nQ29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCksIGtISVRoZW1lT3JpZW50YXRpb25Ob3JtYWwpOworCisgICAgVmVjdG9yPElu
dFJlY3Q+IHRpY2ttYXJrczsKKyAgICBzY3JvbGxiYXItPmNsaWVudCgpLT5nZXRUaWNrbWFya3Mo
dGlja21hcmtzKTsKKyAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2Fs
U2Nyb2xsYmFyICYmIHRpY2ttYXJrcy5zaXplKCkpIHsKKyAgICAgICAgc3RhdGljIFJlZlB0cjxJ
bWFnZT4gZGFzaCA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZSgidGlja21hcmtEYXNoIik7
CisgICAgICAgIGlmIChkYXNoLT5pc051bGwoKSkgeworICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgICAgIH0KKworICAgICAgICBkcmF3aW5nQ29udGV4dC0+c2F2ZSgpOwor
CisgICAgICAgIEludFJlY3QgdGh1bWJBcmVhID0gdHJhY2tSZWN0KHNjcm9sbGJhciwgZmFsc2Up
OworICAgICAgICBpZiAoIWNhbkRyYXdEaXJlY3RseSkgeworICAgICAgICAgICAgdGh1bWJBcmVh
LnNldFgoMCk7CisgICAgICAgICAgICB0aHVtYkFyZWEuc2V0WSgwKTsKKyAgICAgICAgfQorICAg
ICAgICAvLyBUaGUgZW5kcyBhcmUgcm91bmRlZCBhbmQgdGhlIHRodW1iIGRvZXNuJ3QgZ28gdGhl
cmUuCisgICAgICAgIHRodW1iQXJlYS5pbmZsYXRlWSgtdGh1bWJBcmVhLndpZHRoKCkgKiAyIC8g
Myk7CisKKyAgICAgICAgZm9yIChWZWN0b3I8SW50UmVjdD46OmNvbnN0X2l0ZXJhdG9yIGkgPSB0
aWNrbWFya3MuYmVnaW4oKTsgaSAhPSB0aWNrbWFya3MuZW5kKCk7ICsraSkgeworICAgICAgICAg
ICAgLy8gQ2FsY3VsYXRlIGhvdyBmYXIgZG93biAoaW4gJSkgdGhlIHRpY2stbWFyayBzaG91bGQg
YXBwZWFyLgorICAgICAgICAgICAgY29uc3QgZmxvYXQgcGVyY2VudCA9IHN0YXRpY19jYXN0PGZs
b2F0PihpLT55KCkpIC8gc2Nyb2xsYmFyLT50b3RhbFNpemUoKTsKKworICAgICAgICAgICAgLy8g
Q2FsY3VsYXRlIGhvdyBmYXIgZG93biAoaW4gcGl4ZWxzKSB0aGUgdGljay1tYXJrIHNob3VsZCBh
cHBlYXIuCisgICAgICAgICAgICBjb25zdCBpbnQgeVBvcyA9IHRodW1iQXJlYS50b3BMZWZ0KCku
eSgpICsgKHRodW1iQXJlYS5oZWlnaHQoKSAqIHBlcmNlbnQpOworCisgICAgICAgICAgICBJbnRQ
b2ludCB0aWNrKHRodW1iQXJlYS50b3BMZWZ0KCkueCgpLCB5UG9zKTsKKyAgICAgICAgICAgIGRy
YXdpbmdDb250ZXh0LT5kcmF3SW1hZ2UoZGFzaC5nZXQoKSwgRGV2aWNlQ29sb3JTcGFjZSwgdGlj
ayk7CisgICAgICAgIH0KKworICAgICAgICBkcmF3aW5nQ29udGV4dC0+cmVzdG9yZSgpOworICAg
IH0KKworICAgIGlmIChoYXNUaHVtYihzY3JvbGxiYXIpKSB7CisgICAgICAgIHRyYWNrSW5mby5h
dHRyaWJ1dGVzIHw9IChrVGhlbWVUcmFja1Nob3dUaHVtYiB8IGtUaGVtZVRyYWNrSGlkZVRyYWNr
KTsKKyAgICAgICAgSElUaGVtZURyYXdUcmFjaygmdHJhY2tJbmZvLCAwLCBkcmF3aW5nQ29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCksIGtISVRoZW1lT3JpZW50YXRpb25Ob3JtYWwpOworICAgIH0K
KworICAgIGlmICghY2FuRHJhd0RpcmVjdGx5KSB7CiAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFn
ZShpbWFnZUJ1ZmZlci0+aW1hZ2UoKSwgRGV2aWNlQ29sb3JTcGFjZSwgc2Nyb2xsYmFyLT5mcmFt
ZVJlY3QoKS5sb2NhdGlvbigpKTsKICAgICB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44538</attachid>
            <date>2009-12-09 07:53:06 -0800</date>
            <delta_ts>2009-12-09 11:52:36 -0800</delta_ts>
            <desc>Patch to draw scrollbar ticks. Now with UX approval!</desc>
            <filename>scroll</filename>
            <type>text/plain</type>
            <size>2946</size>
            <attacher name="Avi Drissman">avi</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MTkwMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTMgQEAKKzIwMDktMTItMDkgIEF2aSBEcmlzc21hbiAgPGF2aUBjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hy
b21pdW0gdGlja21hcmtzIGluIHNjcm9sbGJhciBub3cgVVggYXBwcm92ZWQuCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMjA2OQorCisgICAgICAgICog
cGxhdGZvcm0vY2hyb21pdW0vU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYy5tbToKKyAgICAgICAg
KFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lQ2hyb21pdW1NYWM6OnBhaW50KToKKwogMjAwOS0xMi0w
OSAgT2xpdmVyIEh1bnQgIDxvbGl2ZXJAYXBwbGUuY29tPgogCiAgICAgICAgIEJ1aWxkIGZpeApJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9TY3JvbGxiYXJUaGVtZUNocm9taXVtTWFj
Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vU2Nyb2xsYmFyVGhl
bWVDaHJvbWl1bU1hYy5tbQkocmV2aXNpb24gNTE5MDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2No
cm9taXVtL1Njcm9sbGJhclRoZW1lQ2hyb21pdW1NYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTQx
NSwxMiArNDE1LDEwIEBAIGJvb2wgU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYzo6cGFpbnQoU2MK
ICAgICBWZWN0b3I8SW50UmVjdD4gdGlja21hcmtzOwogICAgIHNjcm9sbGJhci0+Y2xpZW50KCkt
PmdldFRpY2ttYXJrcyh0aWNrbWFya3MpOwogICAgIGlmIChzY3JvbGxiYXItPm9yaWVudGF0aW9u
KCkgPT0gVmVydGljYWxTY3JvbGxiYXIgJiYgdGlja21hcmtzLnNpemUoKSkgewotICAgICAgICBz
dGF0aWMgUmVmUHRyPEltYWdlPiBkYXNoID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJ0
aWNrbWFya0Rhc2giKTsKLSAgICAgICAgaWYgKGRhc2gtPmlzTnVsbCgpKSB7Ci0gICAgICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgfQotCiAgICAgICAgIGRyYXdpbmdDb250
ZXh0LT5zYXZlKCk7CisgICAgICAgIGRyYXdpbmdDb250ZXh0LT5zZXRTaG91bGRBbnRpYWxpYXMo
ZmFsc2UpOworICAgICAgICBkcmF3aW5nQ29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3IoMHhD
QywgMHhBQSwgMHgwMCwgMHhGRiksIERldmljZUNvbG9yU3BhY2UpOworICAgICAgICBkcmF3aW5n
Q29udGV4dC0+c2V0RmlsbENvbG9yKENvbG9yKDB4RkYsIDB4REQsIDB4MDAsIDB4RkYpLCBEZXZp
Y2VDb2xvclNwYWNlKTsKIAogICAgICAgICBJbnRSZWN0IHRodW1iQXJlYSA9IHRyYWNrUmVjdChz
Y3JvbGxiYXIsIGZhbHNlKTsKICAgICAgICAgaWYgKCFjYW5EcmF3RGlyZWN0bHkpIHsKQEAgLTQy
OCwxNyArNDI2LDIyIEBAIGJvb2wgU2Nyb2xsYmFyVGhlbWVDaHJvbWl1bU1hYzo6cGFpbnQoU2MK
ICAgICAgICAgICAgIHRodW1iQXJlYS5zZXRZKDApOwogICAgICAgICB9CiAgICAgICAgIC8vIFRo
ZSBlbmRzIGFyZSByb3VuZGVkIGFuZCB0aGUgdGh1bWIgZG9lc24ndCBnbyB0aGVyZS4KLSAgICAg
ICAgdGh1bWJBcmVhLmluZmxhdGVZKC10aHVtYkFyZWEud2lkdGgoKSAqIDIgLyAzKTsKKyAgICAg
ICAgdGh1bWJBcmVhLmluZmxhdGVZKC10aHVtYkFyZWEud2lkdGgoKSk7CiAKICAgICAgICAgZm9y
IChWZWN0b3I8SW50UmVjdD46OmNvbnN0X2l0ZXJhdG9yIGkgPSB0aWNrbWFya3MuYmVnaW4oKTsg
aSAhPSB0aWNrbWFya3MuZW5kKCk7ICsraSkgewogICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhv
dyBmYXIgZG93biAoaW4gJSkgdGhlIHRpY2stbWFyayBzaG91bGQgYXBwZWFyLgogICAgICAgICAg
ICAgY29uc3QgZmxvYXQgcGVyY2VudCA9IHN0YXRpY19jYXN0PGZsb2F0PihpLT55KCkpIC8gc2Ny
b2xsYmFyLT50b3RhbFNpemUoKTsKKyAgICAgICAgICAgIGlmIChwZXJjZW50IDwgMC4wIHx8IHBl
cmNlbnQgPiAxLjApCisgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAvLyBD
YWxjdWxhdGUgaG93IGZhciBkb3duIChpbiBwaXhlbHMpIHRoZSB0aWNrLW1hcmsgc2hvdWxkIGFw
cGVhci4KLSAgICAgICAgICAgIGNvbnN0IGludCB5UG9zID0gdGh1bWJBcmVhLnRvcExlZnQoKS55
KCkgKyAodGh1bWJBcmVhLmhlaWdodCgpICogcGVyY2VudCk7CisgICAgICAgICAgICBjb25zdCBp
bnQgeVBvcyA9IHN0YXRpY19jYXN0PGludD4oKHRodW1iQXJlYS50b3BMZWZ0KCkueSgpICsgKHRo
dW1iQXJlYS5oZWlnaHQoKSAqIHBlcmNlbnQpKSkgJiB+MTsKIAotICAgICAgICAgICAgSW50UG9p
bnQgdGljayh0aHVtYkFyZWEudG9wTGVmdCgpLngoKSwgeVBvcyk7Ci0gICAgICAgICAgICBkcmF3
aW5nQ29udGV4dC0+ZHJhd0ltYWdlKGRhc2guZ2V0KCksIERldmljZUNvbG9yU3BhY2UsIHRpY2sp
OworICAgICAgICAgICAgLy8gUGFpbnQuCisgICAgICAgICAgICBjb25zdCBpbnQgaW5kZW50ID0g
MjsKKyAgICAgICAgICAgIEZsb2F0UmVjdCB0aWNrUmVjdCh0aHVtYkFyZWEudG9wTGVmdCgpLngo
KSArIGluZGVudCwgeVBvcywgdGh1bWJBcmVhLndpZHRoKCkgLSAyICogaW5kZW50IC0gMSwgMik7
CisgICAgICAgICAgICBkcmF3aW5nQ29udGV4dC0+ZmlsbFJlY3QodGlja1JlY3QpOworICAgICAg
ICAgICAgZHJhd2luZ0NvbnRleHQtPnN0cm9rZVJlY3QodGlja1JlY3QsIDEpOwogICAgICAgICB9
CiAKICAgICAgICAgZHJhd2luZ0NvbnRleHQtPnJlc3RvcmUoKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>