<?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>125730</bug_id>
          
          <creation_ts>2013-12-13 21:04:42 -0800</creation_ts>
          <short_desc>cStack: Crypto crashes in GC</short_desc>
          <delta_ts>2013-12-13 23:15:58 -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>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>113621</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>barraclough</cc>
    
    <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mhahnenberg</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>959765</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-13 21:04:42 -0800</bug_when>
    <thetext>...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>959766</commentid>
    <comment_count>1</comment_count>
      <attachid>219230</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-13 21:05:16 -0800</bug_when>
    <thetext>Created attachment 219230
the version of Crypto I use</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>959791</commentid>
    <comment_count>2</comment_count>
      <attachid>219241</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2013-12-13 22:43:47 -0800</bug_when>
    <thetext>Created attachment 219241
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>959792</commentid>
    <comment_count>3</comment_count>
      <attachid>219241</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-13 22:46:55 -0800</bug_when>
    <thetext>Comment on attachment 219241
Patch

I would get rid of the new USE macro as just use LLINT_CLOOP directly. They are exactly equivalent anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>959794</commentid>
    <comment_count>4</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2013-12-13 22:50:20 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 219241 [details])
&gt; I would get rid of the new USE macro as just use LLINT_CLOOP directly. They are exactly equivalent anyway.

Mark Lam recently added the WTF_USE_SEPARATE_C_AND_JS_STACK macro.  I&apos;d like to handle that in another patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>959796</commentid>
    <comment_count>5</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2013-12-13 23:15:48 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; (From update of attachment 219241 [details] [details])
&gt; &gt; I would get rid of the new USE macro as just use LLINT_CLOOP directly. They are exactly equivalent anyway.
&gt; 
&gt; Mark Lam recently added the WTF_USE_SEPARATE_C_AND_JS_STACK macro.  I&apos;d like to handle that in another patch.

Tracked in https://bugs.webkit.org/show_bug.cgi?id=125733 - &quot;CStack Branch: Remove WTF_USE_SEPARATE_C_AND_JS_STACK&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>959797</commentid>
    <comment_count>6</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2013-12-13 23:15:58 -0800</bug_when>
    <thetext>Committed r160589: &lt;http://trac.webkit.org/changeset/160589&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>219230</attachid>
            <date>2013-12-13 21:05:16 -0800</date>
            <delta_ts>2013-12-13 21:05:16 -0800</delta_ts>
            <desc>the version of Crypto I use</desc>
            <filename>crypto.js</filename>
            <type>text/plain</type>
            <size>57705</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">Ly8gQ29weXJpZ2h0IDIwMDggdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0Ci8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLy8gbWV0OgovLwovLyAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAovLyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLy8gICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLy8gICAgICAgZGlzY2xhaW1l
ciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi8v
ICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwovLyAgICAgICBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLy8gICAg
ICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgovLwovLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi8vIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgovLyBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAovLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAovLyBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLy8g
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCi8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi8vIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CgoKLy8gU2ltcGxlIGZyYW1ld29yayBmb3IgcnVubmluZyB0aGUgYmVuY2htYXJrIHN1aXRlcyBh
bmQKLy8gY29tcHV0aW5nIGEgc2NvcmUgYmFzZWQgb24gdGhlIHRpbWluZyBtZWFzdXJlbWVudHMu
CgoKLy8gQSBiZW5jaG1hcmsgaGFzIGEgbmFtZSAoc3RyaW5nKSBhbmQgYSBmdW5jdGlvbiB0aGF0
IHdpbGwgYmUgcnVuIHRvCi8vIGRvIHRoZSBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudC4gVGhlIG9w
dGlvbmFsIHNldHVwIGFuZCB0ZWFyRG93bgovLyBhcmd1bWVudHMgYXJlIGZ1bmN0aW9ucyB0aGF0
IHdpbGwgYmUgaW52b2tlZCBiZWZvcmUgYW5kIGFmdGVyCi8vIHJ1bm5pbmcgdGhlIGJlbmNobWFy
aywgYnV0IHRoZSBydW5uaW5nIHRpbWUgb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwKLy8gbm90IGJl
IGFjY291bnRlZCBmb3IgaW4gdGhlIGJlbmNobWFyayBzY29yZS4KZnVuY3Rpb24gQmVuY2htYXJr
KG5hbWUsIHJ1biwgc2V0dXAsIHRlYXJEb3duKSB7CiAgdGhpcy5uYW1lID0gbmFtZTsKICB0aGlz
LnJ1biA9IHJ1bjsKICB0aGlzLlNldHVwID0gc2V0dXAgPyBzZXR1cCA6IGZ1bmN0aW9uKCkgeyB9
OwogIHRoaXMuVGVhckRvd24gPSB0ZWFyRG93biA/IHRlYXJEb3duIDogZnVuY3Rpb24oKSB7IH07
Cn0KCgovLyBCZW5jaG1hcmsgcmVzdWx0cyBob2xkIHRoZSBiZW5jaG1hcmsgYW5kIHRoZSBtZWFz
dXJlZCB0aW1lIHVzZWQgdG8KLy8gcnVuIHRoZSBiZW5jaG1hcmsuIFRoZSBiZW5jaG1hcmsgc2Nv
cmUgaXMgY29tcHV0ZWQgbGF0ZXIgb25jZSBhCi8vIGZ1bGwgYmVuY2htYXJrIHN1aXRlIGhhcyBy
dW4gdG8gY29tcGxldGlvbi4KZnVuY3Rpb24gQmVuY2htYXJrUmVzdWx0KGJlbmNobWFyaywgdGlt
ZSkgewogIHRoaXMuYmVuY2htYXJrID0gYmVuY2htYXJrOwogIHRoaXMudGltZSA9IHRpbWU7Cn0K
CgovLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgcmVzdWx0cyB0byBudW1iZXJzLiBVc2VkIGJ5IHRo
ZSBnZW9tZXRyaWMKLy8gbWVhbiBjb21wdXRhdGlvbi4KQmVuY2htYXJrUmVzdWx0LnByb3RvdHlw
ZS52YWx1ZU9mID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMudGltZTsKfQoKCi8vIFN1aXRl
cyBvZiBiZW5jaG1hcmtzIGNvbnNpc3Qgb2YgYSBuYW1lIGFuZCB0aGUgc2V0IG9mIGJlbmNobWFy
a3MgaW4KLy8gYWRkaXRpb24gdG8gdGhlIHJlZmVyZW5jZSB0aW1pbmcgdGhhdCB0aGUgZmluYWwg
c2NvcmUgd2lsbCBiZSBiYXNlZAovLyBvbi4gVGhpcyB3YXksIGFsbCBzY29yZXMgYXJlIHJlbGF0
aXZlIHRvIGEgcmVmZXJlbmNlIHJ1biBhbmQgaGlnaGVyCi8vIHNjb3JlcyBpbXBsaWVzIGJldHRl
ciBwZXJmb3JtYW5jZS4KZnVuY3Rpb24gQmVuY2htYXJrU3VpdGUobmFtZSwgcmVmZXJlbmNlLCBi
ZW5jaG1hcmtzKSB7CiAgdGhpcy5uYW1lID0gbmFtZTsKICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVy
ZW5jZTsKICB0aGlzLmJlbmNobWFya3MgPSBiZW5jaG1hcmtzOwogIEJlbmNobWFya1N1aXRlLnN1
aXRlcy5wdXNoKHRoaXMpOwp9CgoKLy8gS2VlcCB0cmFjayBvZiBhbGwgZGVjbGFyZWQgYmVuY2ht
YXJrIHN1aXRlcy4KQmVuY2htYXJrU3VpdGUuc3VpdGVzID0gW107CgoKLy8gU2NvcmVzIGFyZSBu
b3QgY29tcGFyYWJsZSBhY3Jvc3MgdmVyc2lvbnMuIEJ1bXAgdGhlIHZlcnNpb24gaWYKLy8geW91
J3JlIG1ha2luZyBjaGFuZ2VzIHRoYXQgd2lsbCBhZmZlY3QgdGhhdCBzY29yZXMsIGUuZy4gaWYg
eW91IGFkZAovLyBhIG5ldyBiZW5jaG1hcmsgb3IgY2hhbmdlIGFuIGV4aXN0aW5nIG9uZS4KQmVu
Y2htYXJrU3VpdGUudmVyc2lvbiA9ICc2JzsKCgovLyBUbyBtYWtlIHRoZSBiZW5jaG1hcmsgcmVz
dWx0cyBwcmVkaWN0YWJsZSwgd2UgcmVwbGFjZSBNYXRoLnJhbmRvbQovLyB3aXRoIGEgMTAwJSBk
ZXRlcm1pbmlzdGljIGFsdGVybmF0aXZlLgpNYXRoLnJhbmRvbSA9IChmdW5jdGlvbigpIHsKICB2
YXIgc2VlZCA9IDQ5NzM0MzIxOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIC8vIFJvYmVydCBK
ZW5raW5zJyAzMiBiaXQgaW50ZWdlciBoYXNoIGZ1bmN0aW9uLgogICAgc2VlZCA9ICgoc2VlZCAr
IDB4N2VkNTVkMTYpICsgKHNlZWQgPDwgMTIpKSAgJiAweGZmZmZmZmZmOwogICAgc2VlZCA9ICgo
c2VlZCBeIDB4Yzc2MWMyM2MpIF4gKHNlZWQgPj4+IDE5KSkgJiAweGZmZmZmZmZmOwogICAgc2Vl
ZCA9ICgoc2VlZCArIDB4MTY1NjY3YjEpICsgKHNlZWQgPDwgNSkpICAgJiAweGZmZmZmZmZmOwog
ICAgc2VlZCA9ICgoc2VlZCArIDB4ZDNhMjY0NmMpIF4gKHNlZWQgPDwgOSkpICAgJiAweGZmZmZm
ZmZmOwogICAgc2VlZCA9ICgoc2VlZCArIDB4ZmQ3MDQ2YzUpICsgKHNlZWQgPDwgMykpICAgJiAw
eGZmZmZmZmZmOwogICAgc2VlZCA9ICgoc2VlZCBeIDB4YjU1YTRmMDkpIF4gKHNlZWQgPj4+IDE2
KSkgJiAweGZmZmZmZmZmOwogICAgcmV0dXJuIChzZWVkICYgMHhmZmZmZmZmKSAvIDB4MTAwMDAw
MDA7CiAgfTsKfSkoKTsKCgovLyBSdW5zIGFsbCByZWdpc3RlcmVkIGJlbmNobWFyayBzdWl0ZXMg
YW5kIG9wdGlvbmFsbHkgeWllbGRzIGJldHdlZW4KLy8gZWFjaCBpbmRpdmlkdWFsIGJlbmNobWFy
ayB0byBhdm9pZCBydW5uaW5nIGZvciB0b28gbG9uZyBpbiB0aGUKLy8gY29udGV4dCBvZiBicm93
c2Vycy4gT25jZSBkb25lLCB0aGUgZmluYWwgc2NvcmUgaXMgcmVwb3J0ZWQgdG8gdGhlCi8vIHJ1
bm5lci4KQmVuY2htYXJrU3VpdGUuUnVuU3VpdGVzID0gZnVuY3Rpb24ocnVubmVyKSB7CiAgdmFy
IGNvbnRpbnVhdGlvbiA9IG51bGw7CiAgdmFyIHN1aXRlcyA9IEJlbmNobWFya1N1aXRlLnN1aXRl
czsKICB2YXIgbGVuZ3RoID0gc3VpdGVzLmxlbmd0aDsKICBCZW5jaG1hcmtTdWl0ZS5zY29yZXMg
PSBbXTsKICB2YXIgaW5kZXggPSAwOwogIGZ1bmN0aW9uIFJ1blN0ZXAoKSB7CiAgICB3aGlsZSAo
Y29udGludWF0aW9uIHx8IGluZGV4IDwgbGVuZ3RoKSB7CiAgICAgIGlmIChjb250aW51YXRpb24p
IHsKICAgICAgICBjb250aW51YXRpb24gPSBjb250aW51YXRpb24oKTsKICAgICAgfSBlbHNlIHsK
ICAgICAgICB2YXIgc3VpdGUgPSBzdWl0ZXNbaW5kZXgrK107CiAgICAgICAgaWYgKHJ1bm5lci5O
b3RpZnlTdGFydCkgcnVubmVyLk5vdGlmeVN0YXJ0KHN1aXRlLm5hbWUpOwogICAgICAgIGNvbnRp
bnVhdGlvbiA9IHN1aXRlLlJ1blN0ZXAocnVubmVyKTsKICAgICAgfQogICAgICBpZiAoY29udGlu
dWF0aW9uICYmIHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnNldFRpbWVv
dXQpIHsKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChSdW5TdGVwLCAyNSk7CiAgICAgICAgcmV0
dXJuOwogICAgICB9CiAgICB9CiAgICBpZiAocnVubmVyLk5vdGlmeVNjb3JlKSB7CiAgICAgIHZh
ciBzY29yZSA9IEJlbmNobWFya1N1aXRlLkdlb21ldHJpY01lYW4oQmVuY2htYXJrU3VpdGUuc2Nv
cmVzKTsKICAgICAgdmFyIGZvcm1hdHRlZCA9IEJlbmNobWFya1N1aXRlLkZvcm1hdFNjb3JlKDEw
MCAqIHNjb3JlKTsKICAgICAgcnVubmVyLk5vdGlmeVNjb3JlKGZvcm1hdHRlZCk7CiAgICB9CiAg
fQogIFJ1blN0ZXAoKTsKfQoKCi8vIENvdW50cyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlZ2lzdGVy
ZWQgYmVuY2htYXJrcy4gVXNlZnVsIGZvcgovLyBzaG93aW5nIHByb2dyZXNzIGFzIGEgcGVyY2Vu
dGFnZS4KQmVuY2htYXJrU3VpdGUuQ291bnRCZW5jaG1hcmtzID0gZnVuY3Rpb24oKSB7CiAgdmFy
IHJlc3VsdCA9IDA7CiAgdmFyIHN1aXRlcyA9IEJlbmNobWFya1N1aXRlLnN1aXRlczsKICBmb3Ig
KHZhciBpID0gMDsgaSA8IHN1aXRlcy5sZW5ndGg7IGkrKykgewogICAgcmVzdWx0ICs9IHN1aXRl
c1tpXS5iZW5jaG1hcmtzLmxlbmd0aDsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKCi8vIENvbXB1
dGVzIHRoZSBnZW9tZXRyaWMgbWVhbiBvZiBhIHNldCBvZiBudW1iZXJzLgpCZW5jaG1hcmtTdWl0
ZS5HZW9tZXRyaWNNZWFuID0gZnVuY3Rpb24obnVtYmVycykgewogIHZhciBsb2cgPSAwOwogIGZv
ciAodmFyIGkgPSAwOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykgewogICAgbG9nICs9IE1hdGgu
bG9nKG51bWJlcnNbaV0pOwogIH0KICByZXR1cm4gTWF0aC5wb3coTWF0aC5FLCBsb2cgLyBudW1i
ZXJzLmxlbmd0aCk7Cn0KCgovLyBDb252ZXJ0cyBhIHNjb3JlIHZhbHVlIHRvIGEgc3RyaW5nIHdp
dGggYXQgbGVhc3QgdGhyZWUgc2lnbmlmaWNhbnQKLy8gZGlnaXRzLgpCZW5jaG1hcmtTdWl0ZS5G
b3JtYXRTY29yZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgaWYgKHZhbHVlID4gMTAwKSB7CiAgICBy
ZXR1cm4gdmFsdWUudG9GaXhlZCgwKTsKICB9IGVsc2UgewogICAgcmV0dXJuIHZhbHVlLnRvUHJl
Y2lzaW9uKDMpOwogIH0KfQoKLy8gTm90aWZpZXMgdGhlIHJ1bm5lciB0aGF0IHdlJ3JlIGRvbmUg
cnVubmluZyBhIHNpbmdsZSBiZW5jaG1hcmsgaW4KLy8gdGhlIGJlbmNobWFyayBzdWl0ZS4gVGhp
cyBjYW4gYmUgdXNlZnVsIHRvIHJlcG9ydCBwcm9ncmVzcy4KQmVuY2htYXJrU3VpdGUucHJvdG90
eXBlLk5vdGlmeVN0ZXAgPSBmdW5jdGlvbihyZXN1bHQpIHsKICB0aGlzLnJlc3VsdHMucHVzaChy
ZXN1bHQpOwogIGlmICh0aGlzLnJ1bm5lci5Ob3RpZnlTdGVwKSB0aGlzLnJ1bm5lci5Ob3RpZnlT
dGVwKHJlc3VsdC5iZW5jaG1hcmsubmFtZSk7Cn0KCgovLyBOb3RpZmllcyB0aGUgcnVubmVyIHRo
YXQgd2UncmUgZG9uZSB3aXRoIHJ1bm5pbmcgYSBzdWl0ZSBhbmQgdGhhdAovLyB3ZSBoYXZlIGEg
cmVzdWx0IHdoaWNoIGNhbiBiZSByZXBvcnRlZCB0byB0aGUgdXNlciBpZiBuZWVkZWQuCkJlbmNo
bWFya1N1aXRlLnByb3RvdHlwZS5Ob3RpZnlSZXN1bHQgPSBmdW5jdGlvbigpIHsKICB2YXIgbWVh
biA9IEJlbmNobWFya1N1aXRlLkdlb21ldHJpY01lYW4odGhpcy5yZXN1bHRzKTsKICB2YXIgc2Nv
cmUgPSB0aGlzLnJlZmVyZW5jZSAvIG1lYW47CiAgQmVuY2htYXJrU3VpdGUuc2NvcmVzLnB1c2go
c2NvcmUpOwogIGlmICh0aGlzLnJ1bm5lci5Ob3RpZnlSZXN1bHQpIHsKICAgIHZhciBmb3JtYXR0
ZWQgPSBCZW5jaG1hcmtTdWl0ZS5Gb3JtYXRTY29yZSgxMDAgKiBzY29yZSk7CiAgICB0aGlzLnJ1
bm5lci5Ob3RpZnlSZXN1bHQodGhpcy5uYW1lLCBmb3JtYXR0ZWQpOwogIH0KfQoKCi8vIE5vdGlm
aWVzIHRoZSBydW5uZXIgdGhhdCBydW5uaW5nIGEgYmVuY2htYXJrIHJlc3VsdGVkIGluIGFuIGVy
cm9yLgpCZW5jaG1hcmtTdWl0ZS5wcm90b3R5cGUuTm90aWZ5RXJyb3IgPSBmdW5jdGlvbihlcnJv
cikgewogIGlmICh0aGlzLnJ1bm5lci5Ob3RpZnlFcnJvcikgewogICAgdGhpcy5ydW5uZXIuTm90
aWZ5RXJyb3IodGhpcy5uYW1lLCBlcnJvcik7CiAgfQogIGlmICh0aGlzLnJ1bm5lci5Ob3RpZnlT
dGVwKSB7CiAgICB0aGlzLnJ1bm5lci5Ob3RpZnlTdGVwKHRoaXMubmFtZSk7CiAgfQp9CgoKLy8g
UnVucyBhIHNpbmdsZSBiZW5jaG1hcmsgZm9yIGF0IGxlYXN0IGEgc2Vjb25kIGFuZCBjb21wdXRl
cyB0aGUKLy8gYXZlcmFnZSB0aW1lIGl0IHRha2VzIHRvIHJ1biBhIHNpbmdsZSBpdGVyYXRpb24u
CkJlbmNobWFya1N1aXRlLnByb3RvdHlwZS5SdW5TaW5nbGVCZW5jaG1hcmsgPSBmdW5jdGlvbihi
ZW5jaG1hcmssIGRhdGEpIHsKICBmdW5jdGlvbiBNZWFzdXJlKGRhdGEpIHsKICAgIHZhciBlbGFw
c2VkID0gMDsKICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKCk7CiAgICBmb3IgKHZhciBuID0gMDsg
ZWxhcHNlZCA8IDEwMDA7IG4rKykgewogICAgICBiZW5jaG1hcmsucnVuKCk7CiAgICAgIGVsYXBz
ZWQgPSBuZXcgRGF0ZSgpIC0gc3RhcnQ7CiAgICB9CiAgICBpZiAoZGF0YSAhPSBudWxsKSB7CiAg
ICAgIGRhdGEucnVucyArPSBuOwogICAgICBkYXRhLmVsYXBzZWQgKz0gZWxhcHNlZDsKICAgIH0K
ICB9CgogIGlmIChkYXRhID09IG51bGwpIHsKICAgIC8vIE1lYXN1cmUgdGhlIGJlbmNobWFyayBv
bmNlIGZvciB3YXJtIHVwIGFuZCB0aHJvdyB0aGUgcmVzdWx0CiAgICAvLyBhd2F5LiBSZXR1cm4g
YSBmcmVzaCBkYXRhIG9iamVjdC4KICAgIE1lYXN1cmUobnVsbCk7CiAgICByZXR1cm4geyBydW5z
OiAwLCBlbGFwc2VkOiAwIH07CiAgfSBlbHNlIHsKICAgIE1lYXN1cmUoZGF0YSk7CiAgICAvLyBJ
ZiB3ZSd2ZSBydW4gdG9vIGZldyBpdGVyYXRpb25zLCB3ZSBjb250aW51ZSBmb3IgYW5vdGhlciBz
ZWNvbmQuCiAgICBpZiAoZGF0YS5ydW5zIDwgMzIpIHJldHVybiBkYXRhOwogICAgdmFyIHVzZWMg
PSAoZGF0YS5lbGFwc2VkICogMTAwMCkgLyBkYXRhLnJ1bnM7CiAgICB0aGlzLk5vdGlmeVN0ZXAo
bmV3IEJlbmNobWFya1Jlc3VsdChiZW5jaG1hcmssIHVzZWMpKTsKICAgIHJldHVybiBudWxsOwog
IH0KfQoKCi8vIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHJ1bm5pbmcgYSBzdWl0ZSwgYnV0IHN0b3Bz
IGJldHdlZW4gZWFjaAovLyBpbmRpdmlkdWFsIGJlbmNobWFyayBpbiB0aGUgc3VpdGUgYW5kIHJl
dHVybnMgYSBjb250aW51YXRpb24KLy8gZnVuY3Rpb24gd2hpY2ggY2FuIGJlIGludm9rZWQgdG8g
cnVuIHRoZSBuZXh0IGJlbmNobWFyay4gT25jZSB0aGUKLy8gbGFzdCBiZW5jaG1hcmsgaGFzIGJl
ZW4gZXhlY3V0ZWQsIG51bGwgaXMgcmV0dXJuZWQuCkJlbmNobWFya1N1aXRlLnByb3RvdHlwZS5S
dW5TdGVwID0gZnVuY3Rpb24ocnVubmVyKSB7CiAgdGhpcy5yZXN1bHRzID0gW107CiAgdGhpcy5y
dW5uZXIgPSBydW5uZXI7CiAgdmFyIGxlbmd0aCA9IHRoaXMuYmVuY2htYXJrcy5sZW5ndGg7CiAg
dmFyIGluZGV4ID0gMDsKICB2YXIgc3VpdGUgPSB0aGlzOwogIHZhciBkYXRhOwoKICAvLyBSdW4g
dGhlIHNldHVwLCB0aGUgYWN0dWFsIGJlbmNobWFyaywgYW5kIHRoZSB0ZWFyIGRvd24gaW4gdGhy
ZWUKICAvLyBzZXBhcmF0ZSBzdGVwcyB0byBhbGxvdyB0aGUgZnJhbWV3b3JrIHRvIHlpZWxkIGJl
dHdlZW4gYW55IG9mIHRoZQogIC8vIHN0ZXBzLgoKICBmdW5jdGlvbiBSdW5OZXh0U2V0dXAoKSB7
CiAgICBpZiAoaW5kZXggPCBsZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBzdWl0ZS5iZW5j
aG1hcmtzW2luZGV4XS5TZXR1cCgpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgc3VpdGUu
Tm90aWZ5RXJyb3IoZSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJu
IFJ1bk5leHRCZW5jaG1hcms7CiAgICB9CiAgICBzdWl0ZS5Ob3RpZnlSZXN1bHQoKTsKICAgIHJl
dHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gUnVuTmV4dEJlbmNobWFyaygpIHsKICAgIHRyeSB7
CiAgICAgIGRhdGEgPSBzdWl0ZS5SdW5TaW5nbGVCZW5jaG1hcmsoc3VpdGUuYmVuY2htYXJrc1tp
bmRleF0sIGRhdGEpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBzdWl0ZS5Ob3RpZnlFcnJvcihl
KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvLyBJZiBkYXRhIGlzIG51bGwsIHdlJ3Jl
IGRvbmUgd2l0aCB0aGlzIGJlbmNobWFyay4KICAgIHJldHVybiAoZGF0YSA9PSBudWxsKSA/IFJ1
bk5leHRUZWFyRG93biA6IFJ1bk5leHRCZW5jaG1hcmsoKTsKICB9CgogIGZ1bmN0aW9uIFJ1bk5l
eHRUZWFyRG93bigpIHsKICAgIHRyeSB7CiAgICAgIHN1aXRlLmJlbmNobWFya3NbaW5kZXgrK10u
VGVhckRvd24oKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc3VpdGUuTm90aWZ5RXJyb3IoZSk7
CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIFJ1bk5leHRTZXR1cDsKICB9Cgog
IC8vIFN0YXJ0IG91dCBydW5uaW5nIHRoZSBzZXR1cC4KICByZXR1cm4gUnVuTmV4dFNldHVwKCk7
Cn0KCi8qCiAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1ICBUb20gV3UKICogQWxsIFJpZ2h0cyBS
ZXNlcnZlZC4KICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFy
Z2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFu
ZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogKiAiU29mdHdhcmUiKSwgdG8g
ZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAqIHdp
dGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwg
cHVibGlzaCwKICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9m
IHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3
YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1p
c3Npb24gbm90aWNlIHNoYWxsIGJlCiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3Rh
bnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJP
VklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKICogRVhQUkVT
UywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFO
WQogKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuCiAqCiAqIElOIE5PIEVWRU5UIFNIQUxMIFRPTSBXVSBCRSBMSUFCTEUgRk9S
IEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLAogKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgT0YgQU5ZIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIKICogUkVTVUxUSU5H
IEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBPUiBOT1QgQURWSVNF
RCBPRgogKiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIEFSSVNJTkcgT1VUCiAqIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNF
IE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqCiAqIEluIGFkZGl0aW9uLCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbiBhcHBsaWVzOgogKgogKiBBbGwgcmVkaXN0cmlidXRpb25zIG11
c3QgcmV0YWluIGFuIGludGFjdCBjb3B5IG9mIHRoaXMgY29weXJpZ2h0IG5vdGljZQogKiBhbmQg
ZGlzY2xhaW1lci4KICovCgoKLy8gVGhlIGNvZGUgaGFzIGJlZW4gYWRhcHRlZCBmb3IgdXNlIGFz
IGEgYmVuY2htYXJrIGJ5IEdvb2dsZS4KdmFyIENyeXB0byA9IG5ldyBCZW5jaG1hcmtTdWl0ZSgn
Q3J5cHRvJywgMjY2MTgxLCBbCiAgbmV3IEJlbmNobWFyaygiRW5jcnlwdCIsIGVuY3J5cHQpLAog
IG5ldyBCZW5jaG1hcmsoIkRlY3J5cHQiLCBkZWNyeXB0KQpdKTsKCgovLyBCYXNpYyBKYXZhU2Ny
aXB0IEJOIGxpYnJhcnkgLSBzdWJzZXQgdXNlZnVsIGZvciBSU0EgZW5jcnlwdGlvbi4KCi8vIEJp
dHMgcGVyIGRpZ2l0CnZhciBkYml0czsKdmFyIEJJX0RCOwp2YXIgQklfRE07CnZhciBCSV9EVjsK
CnZhciBCSV9GUDsKdmFyIEJJX0ZWOwp2YXIgQklfRjE7CnZhciBCSV9GMjsKCi8vIEphdmFTY3Jp
cHQgZW5naW5lIGFuYWx5c2lzCnZhciBjYW5hcnkgPSAweGRlYWRiZWVmY2FmZTsKdmFyIGpfbG0g
PSAoKGNhbmFyeSYweGZmZmZmZik9PTB4ZWZjYWZlKTsKCi8vIChwdWJsaWMpIENvbnN0cnVjdG9y
CmZ1bmN0aW9uIEJpZ0ludGVnZXIoYSxiLGMpIHsKICB0aGlzLmFycmF5ID0gbmV3IEFycmF5KCk7
CiAgaWYoYSAhPSBudWxsKQogICAgaWYoIm51bWJlciIgPT0gdHlwZW9mIGEpIHRoaXMuZnJvbU51
bWJlcihhLGIsYyk7CiAgICBlbHNlIGlmKGIgPT0gbnVsbCAmJiAic3RyaW5nIiAhPSB0eXBlb2Yg
YSkgdGhpcy5mcm9tU3RyaW5nKGEsMjU2KTsKICAgIGVsc2UgdGhpcy5mcm9tU3RyaW5nKGEsYik7
Cn0KCi8vIHJldHVybiBuZXcsIHVuc2V0IEJpZ0ludGVnZXIKZnVuY3Rpb24gbmJpKCkgeyByZXR1
cm4gbmV3IEJpZ0ludGVnZXIobnVsbCk7IH0KCi8vIGFtOiBDb21wdXRlIHdfaiArPSAoeCp0aGlz
X2kpLCBwcm9wYWdhdGUgY2FycmllcywKLy8gYyBpcyBpbml0aWFsIGNhcnJ5LCByZXR1cm5zIGZp
bmFsIGNhcnJ5LgovLyBjIDwgMypkdmFsdWUsIHggPCAyKmR2YWx1ZSwgdGhpc19pIDwgZHZhbHVl
Ci8vIFdlIG5lZWQgdG8gc2VsZWN0IHRoZSBmYXN0ZXN0IG9uZSB0aGF0IHdvcmtzIGluIHRoaXMg
ZW52aXJvbm1lbnQuCgovLyBhbTE6IHVzZSBhIHNpbmdsZSBtdWx0IGFuZCBkaXZpZGUgdG8gZ2V0
IHRoZSBoaWdoIGJpdHMsCi8vIG1heCBkaWdpdCBiaXRzIHNob3VsZCBiZSAyNiBiZWNhdXNlCi8v
IG1heCBpbnRlcm5hbCB2YWx1ZSA9IDIqZHZhbHVlXjItMipkdmFsdWUgKDwgMl41MykKZnVuY3Rp
b24gYW0xKGkseCx3LGosYyxuKSB7CiAgdmFyIHRoaXNfYXJyYXkgPSB0aGlzLmFycmF5OwogIHZh
ciB3X2FycmF5ICAgID0gdy5hcnJheTsKICB3aGlsZSgtLW4gPj0gMCkgewogICAgdmFyIHYgPSB4
KnRoaXNfYXJyYXlbaSsrXSt3X2FycmF5W2pdK2M7CiAgICBjID0gTWF0aC5mbG9vcih2LzB4NDAw
MDAwMCk7CiAgICB3X2FycmF5W2orK10gPSB2JjB4M2ZmZmZmZjsKICB9CiAgcmV0dXJuIGM7Cn0K
Ci8vIGFtMiBhdm9pZHMgYSBiaWcgbXVsdC1hbmQtZXh0cmFjdCBjb21wbGV0ZWx5LgovLyBNYXgg
ZGlnaXQgYml0cyBzaG91bGQgYmUgPD0gMzAgYmVjYXVzZSB3ZSBkbyBiaXR3aXNlIG9wcwovLyBv
biB2YWx1ZXMgdXAgdG8gMipoZHZhbHVlXjItaGR2YWx1ZS0xICg8IDJeMzEpCmZ1bmN0aW9uIGFt
MihpLHgsdyxqLGMsbikgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICB2YXIgd19h
cnJheSAgICA9IHcuYXJyYXk7CiAgdmFyIHhsID0geCYweDdmZmYsIHhoID0geD4+MTU7CiAgd2hp
bGUoLS1uID49IDApIHsKICAgIHZhciBsID0gdGhpc19hcnJheVtpXSYweDdmZmY7CiAgICB2YXIg
aCA9IHRoaXNfYXJyYXlbaSsrXT4+MTU7CiAgICB2YXIgbSA9IHhoKmwraCp4bDsKICAgIGwgPSB4
bCpsKygobSYweDdmZmYpPDwxNSkrd19hcnJheVtqXSsoYyYweDNmZmZmZmZmKTsKICAgIGMgPSAo
bD4+PjMwKSsobT4+PjE1KSt4aCpoKyhjPj4+MzApOwogICAgd19hcnJheVtqKytdID0gbCYweDNm
ZmZmZmZmOwogIH0KICByZXR1cm4gYzsKfQoKLy8gQWx0ZXJuYXRlbHksIHNldCBtYXggZGlnaXQg
Yml0cyB0byAyOCBzaW5jZSBzb21lCi8vIGJyb3dzZXJzIHNsb3cgZG93biB3aGVuIGRlYWxpbmcg
d2l0aCAzMi1iaXQgbnVtYmVycy4KZnVuY3Rpb24gYW0zKGkseCx3LGosYyxuKSB7CiAgdmFyIHRo
aXNfYXJyYXkgPSB0aGlzLmFycmF5OwogIHZhciB3X2FycmF5ICAgID0gdy5hcnJheTsKCiAgdmFy
IHhsID0geCYweDNmZmYsIHhoID0geD4+MTQ7CiAgd2hpbGUoLS1uID49IDApIHsKICAgIHZhciBs
ID0gdGhpc19hcnJheVtpXSYweDNmZmY7CiAgICB2YXIgaCA9IHRoaXNfYXJyYXlbaSsrXT4+MTQ7
CiAgICB2YXIgbSA9IHhoKmwraCp4bDsKICAgIGwgPSB4bCpsKygobSYweDNmZmYpPDwxNCkrd19h
cnJheVtqXStjOwogICAgYyA9IChsPj4yOCkrKG0+PjE0KSt4aCpoOwogICAgd19hcnJheVtqKytd
ID0gbCYweGZmZmZmZmY7CiAgfQogIHJldHVybiBjOwp9CgovLyBUaGlzIGlzIHRhaWxvcmVkIHRv
IFZNcyB3aXRoIDItYml0IHRhZ2dpbmcuIEl0IG1ha2VzIHN1cmUKLy8gdGhhdCBhbGwgdGhlIGNv
bXB1dGF0aW9ucyBzdGF5IHdpdGhpbiB0aGUgMjkgYml0cyBhdmFpbGFibGUuCmZ1bmN0aW9uIGFt
NChpLHgsdyxqLGMsbikgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICB2YXIgd19h
cnJheSAgICA9IHcuYXJyYXk7CgogIHZhciB4bCA9IHgmMHgxZmZmLCB4aCA9IHg+PjEzOwogIHdo
aWxlKC0tbiA+PSAwKSB7CiAgICB2YXIgbCA9IHRoaXNfYXJyYXlbaV0mMHgxZmZmOwogICAgdmFy
IGggPSB0aGlzX2FycmF5W2krK10+PjEzOwogICAgdmFyIG0gPSB4aCpsK2gqeGw7CiAgICBsID0g
eGwqbCsoKG0mMHgxZmZmKTw8MTMpK3dfYXJyYXlbal0rYzsKICAgIGMgPSAobD4+MjYpKyhtPj4x
MykreGgqaDsKICAgIHdfYXJyYXlbaisrXSA9IGwmMHgzZmZmZmZmOwogIH0KICByZXR1cm4gYzsK
fQoKLy8gYW0zLzI4IGlzIGJlc3QgZm9yIFNNLCBSaGlubywgYnV0IGFtNC8yNiBpcyBiZXN0IGZv
ciB2OC4KLy8gS2VzdHJlbCAoT3BlcmEgOS41KSBnZXRzIGl0cyBiZXN0IHJlc3VsdCB3aXRoIGFt
NC8yNi4KLy8gSUU3IGRvZXMgOSUgYmV0dGVyIHdpdGggYW0zLzI4IHRoYW4gd2l0aCBhbTQvMjYu
Ci8vIEZpcmVmb3ggKFNNKSBnZXRzIDEwJSBmYXN0ZXIgd2l0aCBhbTMvMjggdGhhbiB3aXRoIGFt
NC8yNi4KCnNldHVwRW5naW5lID0gZnVuY3Rpb24oZm4sIGJpdHMpIHsKICBCaWdJbnRlZ2VyLnBy
b3RvdHlwZS5hbSA9IGZuOwogIGRiaXRzID0gYml0czsKCiAgQklfREIgPSBkYml0czsKICBCSV9E
TSA9ICgoMTw8ZGJpdHMpLTEpOwogIEJJX0RWID0gKDE8PGRiaXRzKTsKCiAgQklfRlAgPSA1MjsK
ICBCSV9GViA9IE1hdGgucG93KDIsQklfRlApOwogIEJJX0YxID0gQklfRlAtZGJpdHM7CiAgQklf
RjIgPSAyKmRiaXRzLUJJX0ZQOwp9CgoKLy8gRGlnaXQgY29udmVyc2lvbnMKdmFyIEJJX1JNID0g
IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CnZhciBCSV9SQyA9IG5ldyBB
cnJheSgpOwp2YXIgcnIsdnY7CnJyID0gIjAiLmNoYXJDb2RlQXQoMCk7CmZvcih2diA9IDA7IHZ2
IDw9IDk7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7CnJyID0gImEiLmNoYXJDb2RlQXQoMCk7CmZv
cih2diA9IDEwOyB2diA8IDM2OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2OwpyciA9ICJBIi5jaGFy
Q29kZUF0KDApOwpmb3IodnYgPSAxMDsgdnYgPCAzNjsgKyt2dikgQklfUkNbcnIrK10gPSB2djsK
CmZ1bmN0aW9uIGludDJjaGFyKG4pIHsgcmV0dXJuIEJJX1JNLmNoYXJBdChuKTsgfQpmdW5jdGlv
biBpbnRBdChzLGkpIHsKICB2YXIgYyA9IEJJX1JDW3MuY2hhckNvZGVBdChpKV07CiAgcmV0dXJu
IChjPT1udWxsKT8tMTpjOwp9CgovLyAocHJvdGVjdGVkKSBjb3B5IHRoaXMgdG8gcgpmdW5jdGlv
biBibnBDb3B5VG8ocikgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICB2YXIgcl9h
cnJheSAgICA9IHIuYXJyYXk7CgogIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkg
cl9hcnJheVtpXSA9IHRoaXNfYXJyYXlbaV07CiAgci50ID0gdGhpcy50OwogIHIucyA9IHRoaXMu
czsKfQoKLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gaW50ZWdlciB2YWx1ZSB4LCAtRFYgPD0geCA8
IERWCmZ1bmN0aW9uIGJucEZyb21JbnQoeCkgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJh
eTsKICB0aGlzLnQgPSAxOwogIHRoaXMucyA9ICh4PDApPy0xOjA7CiAgaWYoeCA+IDApIHRoaXNf
YXJyYXlbMF0gPSB4OwogIGVsc2UgaWYoeCA8IC0xKSB0aGlzX2FycmF5WzBdID0geCtEVjsKICBl
bHNlIHRoaXMudCA9IDA7Cn0KCi8vIHJldHVybiBiaWdpbnQgaW5pdGlhbGl6ZWQgdG8gdmFsdWUK
ZnVuY3Rpb24gbmJ2KGkpIHsgdmFyIHIgPSBuYmkoKTsgci5mcm9tSW50KGkpOyByZXR1cm4gcjsg
fQoKLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gc3RyaW5nIGFuZCByYWRpeApmdW5jdGlvbiBibnBG
cm9tU3RyaW5nKHMsYikgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICB2YXIgazsK
ICBpZihiID09IDE2KSBrID0gNDsKICBlbHNlIGlmKGIgPT0gOCkgayA9IDM7CiAgZWxzZSBpZihi
ID09IDI1NikgayA9IDg7IC8vIGJ5dGUgYXJyYXkKICBlbHNlIGlmKGIgPT0gMikgayA9IDE7CiAg
ZWxzZSBpZihiID09IDMyKSBrID0gNTsKICBlbHNlIGlmKGIgPT0gNCkgayA9IDI7CiAgZWxzZSB7
IHRoaXMuZnJvbVJhZGl4KHMsYik7IHJldHVybjsgfQogIHRoaXMudCA9IDA7CiAgdGhpcy5zID0g
MDsKICB2YXIgaSA9IHMubGVuZ3RoLCBtaSA9IGZhbHNlLCBzaCA9IDA7CiAgd2hpbGUoLS1pID49
IDApIHsKICAgIHZhciB4ID0gKGs9PTgpP3NbaV0mMHhmZjppbnRBdChzLGkpOwogICAgaWYoeCA8
IDApIHsKICAgICAgaWYocy5jaGFyQXQoaSkgPT0gIi0iKSBtaSA9IHRydWU7CiAgICAgIGNvbnRp
bnVlOwogICAgfQogICAgbWkgPSBmYWxzZTsKICAgIGlmKHNoID09IDApCiAgICAgIHRoaXNfYXJy
YXlbdGhpcy50KytdID0geDsKICAgIGVsc2UgaWYoc2grayA+IEJJX0RCKSB7CiAgICAgIHRoaXNf
YXJyYXlbdGhpcy50LTFdIHw9ICh4JigoMTw8KEJJX0RCLXNoKSktMSkpPDxzaDsKICAgICAgdGhp
c19hcnJheVt0aGlzLnQrK10gPSAoeD4+KEJJX0RCLXNoKSk7CiAgICB9CiAgICBlbHNlCiAgICAg
IHRoaXNfYXJyYXlbdGhpcy50LTFdIHw9IHg8PHNoOwogICAgc2ggKz0gazsKICAgIGlmKHNoID49
IEJJX0RCKSBzaCAtPSBCSV9EQjsKICB9CiAgaWYoayA9PSA4ICYmIChzWzBdJjB4ODApICE9IDAp
IHsKICAgIHRoaXMucyA9IC0xOwogICAgaWYoc2ggPiAwKSB0aGlzX2FycmF5W3RoaXMudC0xXSB8
PSAoKDE8PChCSV9EQi1zaCkpLTEpPDxzaDsKICB9CiAgdGhpcy5jbGFtcCgpOwogIGlmKG1pKSBC
aWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKTsKfQoKLy8gKHByb3RlY3RlZCkgY2xhbXAg
b2ZmIGV4Y2VzcyBoaWdoIHdvcmRzCmZ1bmN0aW9uIGJucENsYW1wKCkgewogIHZhciB0aGlzX2Fy
cmF5ID0gdGhpcy5hcnJheTsKICB2YXIgYyA9IHRoaXMucyZCSV9ETTsKICB3aGlsZSh0aGlzLnQg
PiAwICYmIHRoaXNfYXJyYXlbdGhpcy50LTFdID09IGMpIC0tdGhpcy50Owp9CgovLyAocHVibGlj
KSByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIGdpdmVuIHJhZGl4CmZ1bmN0aW9uIGJu
VG9TdHJpbmcoYikgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICBpZih0aGlzLnMg
PCAwKSByZXR1cm4gIi0iK3RoaXMubmVnYXRlKCkudG9TdHJpbmcoYik7CiAgdmFyIGs7CiAgaWYo
YiA9PSAxNikgayA9IDQ7CiAgZWxzZSBpZihiID09IDgpIGsgPSAzOwogIGVsc2UgaWYoYiA9PSAy
KSBrID0gMTsKICBlbHNlIGlmKGIgPT0gMzIpIGsgPSA1OwogIGVsc2UgaWYoYiA9PSA0KSBrID0g
MjsKICBlbHNlIHJldHVybiB0aGlzLnRvUmFkaXgoYik7CiAgdmFyIGttID0gKDE8PGspLTEsIGQs
IG0gPSBmYWxzZSwgciA9ICIiLCBpID0gdGhpcy50OwogIHZhciBwID0gQklfREItKGkqQklfREIp
JWs7CiAgaWYoaS0tID4gMCkgewogICAgaWYocCA8IEJJX0RCICYmIChkID0gdGhpc19hcnJheVtp
XT4+cCkgPiAwKSB7IG0gPSB0cnVlOyByID0gaW50MmNoYXIoZCk7IH0KICAgIHdoaWxlKGkgPj0g
MCkgewogICAgICBpZihwIDwgaykgewogICAgICAgIGQgPSAodGhpc19hcnJheVtpXSYoKDE8PHAp
LTEpKTw8KGstcCk7CiAgICAgICAgZCB8PSB0aGlzX2FycmF5Wy0taV0+PihwKz1CSV9EQi1rKTsK
ICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBkID0gKHRoaXNfYXJyYXlbaV0+PihwLT1rKSkm
a207CiAgICAgICAgaWYocCA8PSAwKSB7IHAgKz0gQklfREI7IC0taTsgfQogICAgICB9CiAgICAg
IGlmKGQgPiAwKSBtID0gdHJ1ZTsKICAgICAgaWYobSkgciArPSBpbnQyY2hhcihkKTsKICAgIH0K
ICB9CiAgcmV0dXJuIG0/cjoiMCI7Cn0KCi8vIChwdWJsaWMpIC10aGlzCmZ1bmN0aW9uIGJuTmVn
YXRlKCkgeyB2YXIgciA9IG5iaSgpOyBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyxyKTsgcmV0
dXJuIHI7IH0KCi8vIChwdWJsaWMpIHx0aGlzfApmdW5jdGlvbiBibkFicygpIHsgcmV0dXJuICh0
aGlzLnM8MCk/dGhpcy5uZWdhdGUoKTp0aGlzOyB9CgovLyAocHVibGljKSByZXR1cm4gKyBpZiB0
aGlzID4gYSwgLSBpZiB0aGlzIDwgYSwgMCBpZiBlcXVhbApmdW5jdGlvbiBibkNvbXBhcmVUbyhh
KSB7CiAgdmFyIHRoaXNfYXJyYXkgPSB0aGlzLmFycmF5OwogIHZhciBhX2FycmF5ID0gYS5hcnJh
eTsKCiAgdmFyIHIgPSB0aGlzLnMtYS5zOwogIGlmKHIgIT0gMCkgcmV0dXJuIHI7CiAgdmFyIGkg
PSB0aGlzLnQ7CiAgciA9IGktYS50OwogIGlmKHIgIT0gMCkgcmV0dXJuIHI7CiAgd2hpbGUoLS1p
ID49IDApIGlmKChyPXRoaXNfYXJyYXlbaV0tYV9hcnJheVtpXSkgIT0gMCkgcmV0dXJuIHI7CiAg
cmV0dXJuIDA7Cn0KCi8vIHJldHVybnMgYml0IGxlbmd0aCBvZiB0aGUgaW50ZWdlciB4CmZ1bmN0
aW9uIG5iaXRzKHgpIHsKICB2YXIgciA9IDEsIHQ7CiAgaWYoKHQ9eD4+PjE2KSAhPSAwKSB7IHgg
PSB0OyByICs9IDE2OyB9CiAgaWYoKHQ9eD4+OCkgIT0gMCkgeyB4ID0gdDsgciArPSA4OyB9CiAg
aWYoKHQ9eD4+NCkgIT0gMCkgeyB4ID0gdDsgciArPSA0OyB9CiAgaWYoKHQ9eD4+MikgIT0gMCkg
eyB4ID0gdDsgciArPSAyOyB9CiAgaWYoKHQ9eD4+MSkgIT0gMCkgeyB4ID0gdDsgciArPSAxOyB9
CiAgcmV0dXJuIHI7Cn0KCi8vIChwdWJsaWMpIHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4g
InRoaXMiCmZ1bmN0aW9uIGJuQml0TGVuZ3RoKCkgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5h
cnJheTsKICBpZih0aGlzLnQgPD0gMCkgcmV0dXJuIDA7CiAgcmV0dXJuIEJJX0RCKih0aGlzLnQt
MSkrbmJpdHModGhpc19hcnJheVt0aGlzLnQtMV1eKHRoaXMucyZCSV9ETSkpOwp9CgovLyAocHJv
dGVjdGVkKSByID0gdGhpcyA8PCBuKkRCCmZ1bmN0aW9uIGJucERMU2hpZnRUbyhuLHIpIHsKICB2
YXIgdGhpc19hcnJheSA9IHRoaXMuYXJyYXk7CiAgdmFyIHJfYXJyYXkgPSByLmFycmF5OwogIHZh
ciBpOwogIGZvcihpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByX2FycmF5W2krbl0gPSB0aGlz
X2FycmF5W2ldOwogIGZvcihpID0gbi0xOyBpID49IDA7IC0taSkgcl9hcnJheVtpXSA9IDA7CiAg
ci50ID0gdGhpcy50K247CiAgci5zID0gdGhpcy5zOwp9CgovLyAocHJvdGVjdGVkKSByID0gdGhp
cyA+PiBuKkRCCmZ1bmN0aW9uIGJucERSU2hpZnRUbyhuLHIpIHsKICB2YXIgdGhpc19hcnJheSA9
IHRoaXMuYXJyYXk7CiAgdmFyIHJfYXJyYXkgPSByLmFycmF5OwogIGZvcih2YXIgaSA9IG47IGkg
PCB0aGlzLnQ7ICsraSkgcl9hcnJheVtpLW5dID0gdGhpc19hcnJheVtpXTsKICByLnQgPSBNYXRo
Lm1heCh0aGlzLnQtbiwwKTsKICByLnMgPSB0aGlzLnM7Cn0KCi8vIChwcm90ZWN0ZWQpIHIgPSB0
aGlzIDw8IG4KZnVuY3Rpb24gYm5wTFNoaWZ0VG8obixyKSB7CiAgdmFyIHRoaXNfYXJyYXkgPSB0
aGlzLmFycmF5OwogIHZhciByX2FycmF5ID0gci5hcnJheTsKICB2YXIgYnMgPSBuJUJJX0RCOwog
IHZhciBjYnMgPSBCSV9EQi1iczsKICB2YXIgYm0gPSAoMTw8Y2JzKS0xOwogIHZhciBkcyA9IE1h
dGguZmxvb3Iobi9CSV9EQiksIGMgPSAodGhpcy5zPDxicykmQklfRE0sIGk7CiAgZm9yKGkgPSB0
aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHsKICAgIHJfYXJyYXlbaStkcysxXSA9ICh0aGlzX2FycmF5
W2ldPj5jYnMpfGM7CiAgICBjID0gKHRoaXNfYXJyYXlbaV0mYm0pPDxiczsKICB9CiAgZm9yKGkg
PSBkcy0xOyBpID49IDA7IC0taSkgcl9hcnJheVtpXSA9IDA7CiAgcl9hcnJheVtkc10gPSBjOwog
IHIudCA9IHRoaXMudCtkcysxOwogIHIucyA9IHRoaXMuczsKICByLmNsYW1wKCk7Cn0KCi8vIChw
cm90ZWN0ZWQpIHIgPSB0aGlzID4+IG4KZnVuY3Rpb24gYm5wUlNoaWZ0VG8obixyKSB7CiAgdmFy
IHRoaXNfYXJyYXkgPSB0aGlzLmFycmF5OwogIHZhciByX2FycmF5ID0gci5hcnJheTsKICByLnMg
PSB0aGlzLnM7CiAgdmFyIGRzID0gTWF0aC5mbG9vcihuL0JJX0RCKTsKICBpZihkcyA+PSB0aGlz
LnQpIHsgci50ID0gMDsgcmV0dXJuOyB9CiAgdmFyIGJzID0gbiVCSV9EQjsKICB2YXIgY2JzID0g
QklfREItYnM7CiAgdmFyIGJtID0gKDE8PGJzKS0xOwogIHJfYXJyYXlbMF0gPSB0aGlzX2FycmF5
W2RzXT4+YnM7CiAgZm9yKHZhciBpID0gZHMrMTsgaSA8IHRoaXMudDsgKytpKSB7CiAgICByX2Fy
cmF5W2ktZHMtMV0gfD0gKHRoaXNfYXJyYXlbaV0mYm0pPDxjYnM7CiAgICByX2FycmF5W2ktZHNd
ID0gdGhpc19hcnJheVtpXT4+YnM7CiAgfQogIGlmKGJzID4gMCkgcl9hcnJheVt0aGlzLnQtZHMt
MV0gfD0gKHRoaXMucyZibSk8PGNiczsKICByLnQgPSB0aGlzLnQtZHM7CiAgci5jbGFtcCgpOwp9
CgovLyAocHJvdGVjdGVkKSByID0gdGhpcyAtIGEKZnVuY3Rpb24gYm5wU3ViVG8oYSxyKSB7CiAg
dmFyIHRoaXNfYXJyYXkgPSB0aGlzLmFycmF5OwogIHZhciByX2FycmF5ID0gci5hcnJheTsKICB2
YXIgYV9hcnJheSA9IGEuYXJyYXk7CiAgdmFyIGkgPSAwLCBjID0gMCwgbSA9IE1hdGgubWluKGEu
dCx0aGlzLnQpOwogIHdoaWxlKGkgPCBtKSB7CiAgICBjICs9IHRoaXNfYXJyYXlbaV0tYV9hcnJh
eVtpXTsKICAgIHJfYXJyYXlbaSsrXSA9IGMmQklfRE07CiAgICBjID4+PSBCSV9EQjsKICB9CiAg
aWYoYS50IDwgdGhpcy50KSB7CiAgICBjIC09IGEuczsKICAgIHdoaWxlKGkgPCB0aGlzLnQpIHsK
ICAgICAgYyArPSB0aGlzX2FycmF5W2ldOwogICAgICByX2FycmF5W2krK10gPSBjJkJJX0RNOwog
ICAgICBjID4+PSBCSV9EQjsKICAgIH0KICAgIGMgKz0gdGhpcy5zOwogIH0KICBlbHNlIHsKICAg
IGMgKz0gdGhpcy5zOwogICAgd2hpbGUoaSA8IGEudCkgewogICAgICBjIC09IGFfYXJyYXlbaV07
CiAgICAgIHJfYXJyYXlbaSsrXSA9IGMmQklfRE07CiAgICAgIGMgPj49IEJJX0RCOwogICAgfQog
ICAgYyAtPSBhLnM7CiAgfQogIHIucyA9IChjPDApPy0xOjA7CiAgaWYoYyA8IC0xKSByX2FycmF5
W2krK10gPSBCSV9EVitjOwogIGVsc2UgaWYoYyA+IDApIHJfYXJyYXlbaSsrXSA9IGM7CiAgci50
ID0gaTsKICByLmNsYW1wKCk7Cn0KCi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzICogYSwgciAhPSB0
aGlzLGEgKEhBQyAxNC4xMikKLy8gInRoaXMiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBh
cHByb3ByaWF0ZS4KZnVuY3Rpb24gYm5wTXVsdGlwbHlUbyhhLHIpIHsKICB2YXIgdGhpc19hcnJh
eSA9IHRoaXMuYXJyYXk7CiAgdmFyIHJfYXJyYXkgPSByLmFycmF5OwogIHZhciB4ID0gdGhpcy5h
YnMoKSwgeSA9IGEuYWJzKCk7CiAgdmFyIHlfYXJyYXkgPSB5LmFycmF5OwoKICB2YXIgaSA9IHgu
dDsKICByLnQgPSBpK3kudDsKICB3aGlsZSgtLWkgPj0gMCkgcl9hcnJheVtpXSA9IDA7CiAgZm9y
KGkgPSAwOyBpIDwgeS50OyArK2kpIHJfYXJyYXlbaSt4LnRdID0geC5hbSgwLHlfYXJyYXlbaV0s
cixpLDAseC50KTsKICByLnMgPSAwOwogIHIuY2xhbXAoKTsKICBpZih0aGlzLnMgIT0gYS5zKSBC
aWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKTsKfQoKLy8gKHByb3RlY3RlZCkgciA9IHRoaXNeMiwg
ciAhPSB0aGlzIChIQUMgMTQuMTYpCmZ1bmN0aW9uIGJucFNxdWFyZVRvKHIpIHsKICB2YXIgeCA9
IHRoaXMuYWJzKCk7CiAgdmFyIHhfYXJyYXkgPSB4LmFycmF5OwogIHZhciByX2FycmF5ID0gci5h
cnJheTsKCiAgdmFyIGkgPSByLnQgPSAyKngudDsKICB3aGlsZSgtLWkgPj0gMCkgcl9hcnJheVtp
XSA9IDA7CiAgZm9yKGkgPSAwOyBpIDwgeC50LTE7ICsraSkgewogICAgdmFyIGMgPSB4LmFtKGks
eF9hcnJheVtpXSxyLDIqaSwwLDEpOwogICAgaWYoKHJfYXJyYXlbaSt4LnRdKz14LmFtKGkrMSwy
KnhfYXJyYXlbaV0sciwyKmkrMSxjLHgudC1pLTEpKSA+PSBCSV9EVikgewogICAgICByX2FycmF5
W2kreC50XSAtPSBCSV9EVjsKICAgICAgcl9hcnJheVtpK3gudCsxXSA9IDE7CiAgICB9CiAgfQog
IGlmKHIudCA+IDApIHJfYXJyYXlbci50LTFdICs9IHguYW0oaSx4X2FycmF5W2ldLHIsMippLDAs
MSk7CiAgci5zID0gMDsKICByLmNsYW1wKCk7Cn0KCi8vIChwcm90ZWN0ZWQpIGRpdmlkZSB0aGlz
IGJ5IG0sIHF1b3RpZW50IGFuZCByZW1haW5kZXIgdG8gcSwgciAoSEFDIDE0LjIwKQovLyByICE9
IHEsIHRoaXMgIT0gbS4gIHEgb3IgciBtYXkgYmUgbnVsbC4KZnVuY3Rpb24gYm5wRGl2UmVtVG8o
bSxxLHIpIHsKICB2YXIgcG0gPSBtLmFicygpOwogIGlmKHBtLnQgPD0gMCkgcmV0dXJuOwogIHZh
ciBwdCA9IHRoaXMuYWJzKCk7CiAgaWYocHQudCA8IHBtLnQpIHsKICAgIGlmKHEgIT0gbnVsbCkg
cS5mcm9tSW50KDApOwogICAgaWYociAhPSBudWxsKSB0aGlzLmNvcHlUbyhyKTsKICAgIHJldHVy
bjsKICB9CiAgaWYociA9PSBudWxsKSByID0gbmJpKCk7CiAgdmFyIHkgPSBuYmkoKSwgdHMgPSB0
aGlzLnMsIG1zID0gbS5zOwogIHZhciBwbV9hcnJheSA9IHBtLmFycmF5OwogIHZhciBuc2ggPSBC
SV9EQi1uYml0cyhwbV9hcnJheVtwbS50LTFdKTsJLy8gbm9ybWFsaXplIG1vZHVsdXMKICBpZihu
c2ggPiAwKSB7IHBtLmxTaGlmdFRvKG5zaCx5KTsgcHQubFNoaWZ0VG8obnNoLHIpOyB9CiAgZWxz
ZSB7IHBtLmNvcHlUbyh5KTsgcHQuY29weVRvKHIpOyB9CiAgdmFyIHlzID0geS50OwoKICB2YXIg
eV9hcnJheSA9IHkuYXJyYXk7CiAgdmFyIHkwID0geV9hcnJheVt5cy0xXTsKICBpZih5MCA9PSAw
KSByZXR1cm47CiAgdmFyIHl0ID0geTAqKDE8PEJJX0YxKSsoKHlzPjEpP3lfYXJyYXlbeXMtMl0+
PkJJX0YyOjApOwogIHZhciBkMSA9IEJJX0ZWL3l0LCBkMiA9ICgxPDxCSV9GMSkveXQsIGUgPSAx
PDxCSV9GMjsKICB2YXIgaSA9IHIudCwgaiA9IGkteXMsIHQgPSAocT09bnVsbCk/bmJpKCk6cTsK
ICB5LmRsU2hpZnRUbyhqLHQpOwoKICB2YXIgcl9hcnJheSA9IHIuYXJyYXk7CiAgaWYoci5jb21w
YXJlVG8odCkgPj0gMCkgewogICAgcl9hcnJheVtyLnQrK10gPSAxOwogICAgci5zdWJUbyh0LHIp
OwogIH0KICBCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oeXMsdCk7CiAgdC5zdWJUbyh5LHkpOwkv
LyAibmVnYXRpdmUiIHkgc28gd2UgY2FuIHJlcGxhY2Ugc3ViIHdpdGggYW0gbGF0ZXIKICB3aGls
ZSh5LnQgPCB5cykgeV9hcnJheVt5LnQrK10gPSAwOwogIHdoaWxlKC0taiA+PSAwKSB7CiAgICAv
LyBFc3RpbWF0ZSBxdW90aWVudCBkaWdpdAogICAgdmFyIHFkID0gKHJfYXJyYXlbLS1pXT09eTAp
P0JJX0RNOk1hdGguZmxvb3Iocl9hcnJheVtpXSpkMSsocl9hcnJheVtpLTFdK2UpKmQyKTsKICAg
IGlmKChyX2FycmF5W2ldKz15LmFtKDAscWQscixqLDAseXMpKSA8IHFkKSB7CS8vIFRyeSBpdCBv
dXQKICAgICAgeS5kbFNoaWZ0VG8oaix0KTsKICAgICAgci5zdWJUbyh0LHIpOwogICAgICB3aGls
ZShyX2FycmF5W2ldIDwgLS1xZCkgci5zdWJUbyh0LHIpOwogICAgfQogIH0KICBpZihxICE9IG51
bGwpIHsKICAgIHIuZHJTaGlmdFRvKHlzLHEpOwogICAgaWYodHMgIT0gbXMpIEJpZ0ludGVnZXIu
WkVSTy5zdWJUbyhxLHEpOwogIH0KICByLnQgPSB5czsKICByLmNsYW1wKCk7CiAgaWYobnNoID4g
MCkgci5yU2hpZnRUbyhuc2gscik7CS8vIERlbm9ybWFsaXplIHJlbWFpbmRlcgogIGlmKHRzIDwg
MCkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7Cn0KCi8vIChwdWJsaWMpIHRoaXMgbW9kIGEK
ZnVuY3Rpb24gYm5Nb2QoYSkgewogIHZhciByID0gbmJpKCk7CiAgdGhpcy5hYnMoKS5kaXZSZW1U
byhhLG51bGwscik7CiAgaWYodGhpcy5zIDwgMCAmJiByLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpF
Uk8pID4gMCkgYS5zdWJUbyhyLHIpOwogIHJldHVybiByOwp9CgovLyBNb2R1bGFyIHJlZHVjdGlv
biB1c2luZyAiY2xhc3NpYyIgYWxnb3JpdGhtCmZ1bmN0aW9uIENsYXNzaWMobSkgeyB0aGlzLm0g
PSBtOyB9CmZ1bmN0aW9uIGNDb252ZXJ0KHgpIHsKICBpZih4LnMgPCAwIHx8IHguY29tcGFyZVRv
KHRoaXMubSkgPj0gMCkgcmV0dXJuIHgubW9kKHRoaXMubSk7CiAgZWxzZSByZXR1cm4geDsKfQpm
dW5jdGlvbiBjUmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH0KZnVuY3Rpb24gY1JlZHVjZSh4KSB7IHgu
ZGl2UmVtVG8odGhpcy5tLG51bGwseCk7IH0KZnVuY3Rpb24gY011bFRvKHgseSxyKSB7IHgubXVs
dGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfQpmdW5jdGlvbiBjU3FyVG8oeCxyKSB7IHgu
c3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9CgpDbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0
ID0gY0NvbnZlcnQ7CkNsYXNzaWMucHJvdG90eXBlLnJldmVydCA9IGNSZXZlcnQ7CkNsYXNzaWMu
cHJvdG90eXBlLnJlZHVjZSA9IGNSZWR1Y2U7CkNsYXNzaWMucHJvdG90eXBlLm11bFRvID0gY011
bFRvOwpDbGFzc2ljLnByb3RvdHlwZS5zcXJUbyA9IGNTcXJUbzsKCi8vIChwcm90ZWN0ZWQpIHJl
dHVybiAiLTEvdGhpcyAlIDJeREIiOyB1c2VmdWwgZm9yIE1vbnQuIHJlZHVjdGlvbgovLyBqdXN0
aWZpY2F0aW9uOgovLyAgICAgICAgIHh5ID09IDEgKG1vZCBtKQovLyAgICAgICAgIHh5ID0gIDEr
a20KLy8gICB4eSgyLXh5KSA9ICgxK2ttKSgxLWttKQovLyB4W3koMi14eSldID0gMS1rXjJtXjIK
Ly8geFt5KDIteHkpXSA9PSAxIChtb2QgbV4yKQovLyBpZiB5IGlzIDEveCBtb2QgbSwgdGhlbiB5
KDIteHkpIGlzIDEveCBtb2QgbV4yCi8vIHNob3VsZCByZWR1Y2UgeCBhbmQgeSgyLXh5KSBieSBt
XjIgYXQgZWFjaCBzdGVwIHRvIGtlZXAgc2l6ZSBib3VuZGVkLgovLyBKUyBtdWx0aXBseSAib3Zl
cmZsb3dzIiBkaWZmZXJlbnRseSBmcm9tIEMvQysrLCBzbyBjYXJlIGlzIG5lZWRlZCBoZXJlLgpm
dW5jdGlvbiBibnBJbnZEaWdpdCgpIHsKICB2YXIgdGhpc19hcnJheSA9IHRoaXMuYXJyYXk7CiAg
aWYodGhpcy50IDwgMSkgcmV0dXJuIDA7CiAgdmFyIHggPSB0aGlzX2FycmF5WzBdOwogIGlmKCh4
JjEpID09IDApIHJldHVybiAwOwogIHZhciB5ID0geCYzOwkJLy8geSA9PSAxL3ggbW9kIDJeMgog
IHkgPSAoeSooMi0oeCYweGYpKnkpKSYweGY7CS8vIHkgPT0gMS94IG1vZCAyXjQKICB5ID0gKHkq
KDItKHgmMHhmZikqeSkpJjB4ZmY7CS8vIHkgPT0gMS94IG1vZCAyXjgKICB5ID0gKHkqKDItKCgo
eCYweGZmZmYpKnkpJjB4ZmZmZikpKSYweGZmZmY7CS8vIHkgPT0gMS94IG1vZCAyXjE2CiAgLy8g
bGFzdCBzdGVwIC0gY2FsY3VsYXRlIGludmVyc2UgbW9kIERWIGRpcmVjdGx5OwogIC8vIGFzc3Vt
ZXMgMTYgPCBEQiA8PSAzMiBhbmQgYXNzdW1lcyBhYmlsaXR5IHRvIGhhbmRsZSA0OC1iaXQgaW50
cwogIHkgPSAoeSooMi14KnklQklfRFYpKSVCSV9EVjsJCS8vIHkgPT0gMS94IG1vZCAyXmRiaXRz
CiAgLy8gd2UgcmVhbGx5IHdhbnQgdGhlIG5lZ2F0aXZlIGludmVyc2UsIGFuZCAtRFYgPCB5IDwg
RFYKICByZXR1cm4gKHk+MCk/QklfRFYteToteTsKfQoKLy8gTW9udGdvbWVyeSByZWR1Y3Rpb24K
ZnVuY3Rpb24gTW9udGdvbWVyeShtKSB7CiAgdGhpcy5tID0gbTsKICB0aGlzLm1wID0gbS5pbnZE
aWdpdCgpOwogIHRoaXMubXBsID0gdGhpcy5tcCYweDdmZmY7CiAgdGhpcy5tcGggPSB0aGlzLm1w
Pj4xNTsKICB0aGlzLnVtID0gKDE8PChCSV9EQi0xNSkpLTE7CiAgdGhpcy5tdDIgPSAyKm0udDsK
fQoKLy8geFIgbW9kIG0KZnVuY3Rpb24gbW9udENvbnZlcnQoeCkgewogIHZhciByID0gbmJpKCk7
CiAgeC5hYnMoKS5kbFNoaWZ0VG8odGhpcy5tLnQscik7CiAgci5kaXZSZW1Ubyh0aGlzLm0sbnVs
bCxyKTsKICBpZih4LnMgPCAwICYmIHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPiAwKSB0
aGlzLm0uc3ViVG8ocixyKTsKICByZXR1cm4gcjsKfQoKLy8geC9SIG1vZCBtCmZ1bmN0aW9uIG1v
bnRSZXZlcnQoeCkgewogIHZhciByID0gbmJpKCk7CiAgeC5jb3B5VG8ocik7CiAgdGhpcy5yZWR1
Y2Uocik7CiAgcmV0dXJuIHI7Cn0KCi8vIHggPSB4L1IgbW9kIG0gKEhBQyAxNC4zMikKZnVuY3Rp
b24gbW9udFJlZHVjZSh4KSB7CiAgdmFyIHhfYXJyYXkgPSB4LmFycmF5OwogIHdoaWxlKHgudCA8
PSB0aGlzLm10MikJLy8gcGFkIHggc28gYW0gaGFzIGVub3VnaCByb29tIGxhdGVyCiAgICB4X2Fy
cmF5W3gudCsrXSA9IDA7CiAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMubS50OyArK2kpIHsKICAg
IC8vIGZhc3RlciB3YXkgb2YgY2FsY3VsYXRpbmcgdTAgPSB4W2ldKm1wIG1vZCBEVgogICAgdmFy
IGogPSB4X2FycmF5W2ldJjB4N2ZmZjsKICAgIHZhciB1MCA9IChqKnRoaXMubXBsKygoKGoqdGhp
cy5tcGgrKHhfYXJyYXlbaV0+PjE1KSp0aGlzLm1wbCkmdGhpcy51bSk8PDE1KSkmQklfRE07CiAg
ICAvLyB1c2UgYW0gdG8gY29tYmluZSB0aGUgbXVsdGlwbHktc2hpZnQtYWRkIGludG8gb25lIGNh
bGwKICAgIGogPSBpK3RoaXMubS50OwogICAgeF9hcnJheVtqXSArPSB0aGlzLm0uYW0oMCx1MCx4
LGksMCx0aGlzLm0udCk7CiAgICAvLyBwcm9wYWdhdGUgY2FycnkKICAgIHdoaWxlKHhfYXJyYXlb
al0gPj0gQklfRFYpIHsgeF9hcnJheVtqXSAtPSBCSV9EVjsgeF9hcnJheVsrK2pdKys7IH0KICB9
CiAgeC5jbGFtcCgpOwogIHguZHJTaGlmdFRvKHRoaXMubS50LHgpOwogIGlmKHguY29tcGFyZVRv
KHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7Cn0KCi8vIHIgPSAieF4yL1IgbW9kIG0i
OyB4ICE9IHIKZnVuY3Rpb24gbW9udFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJl
ZHVjZShyKTsgfQoKLy8gciA9ICJ4eS9SIG1vZCBtIjsgeCx5ICE9IHIKZnVuY3Rpb24gbW9udE11
bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfQoKTW9udGdv
bWVyeS5wcm90b3R5cGUuY29udmVydCA9IG1vbnRDb252ZXJ0OwpNb250Z29tZXJ5LnByb3RvdHlw
ZS5yZXZlcnQgPSBtb250UmV2ZXJ0OwpNb250Z29tZXJ5LnByb3RvdHlwZS5yZWR1Y2UgPSBtb250
UmVkdWNlOwpNb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbyA9IG1vbnRNdWxUbzsKTW9udGdvbWVy
eS5wcm90b3R5cGUuc3FyVG8gPSBtb250U3FyVG87CgovLyAocHJvdGVjdGVkKSB0cnVlIGlmZiB0
aGlzIGlzIGV2ZW4KZnVuY3Rpb24gYm5wSXNFdmVuKCkgewogIHZhciB0aGlzX2FycmF5ID0gdGhp
cy5hcnJheTsKICByZXR1cm4gKCh0aGlzLnQ+MCk/KHRoaXNfYXJyYXlbMF0mMSk6dGhpcy5zKSA9
PSAwOwp9CgovLyAocHJvdGVjdGVkKSB0aGlzXmUsIGUgPCAyXjMyLCBkb2luZyBzcXIgYW5kIG11
bCB3aXRoICJyIiAoSEFDIDE0Ljc5KQpmdW5jdGlvbiBibnBFeHAoZSx6KSB7CiAgaWYoZSA+IDB4
ZmZmZmZmZmYgfHwgZSA8IDEpIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKICB2YXIgciA9IG5iaSgp
LCByMiA9IG5iaSgpLCBnID0gei5jb252ZXJ0KHRoaXMpLCBpID0gbmJpdHMoZSktMTsKICBnLmNv
cHlUbyhyKTsKICB3aGlsZSgtLWkgPj0gMCkgewogICAgei5zcXJUbyhyLHIyKTsKICAgIGlmKChl
JigxPDxpKSkgPiAwKSB6Lm11bFRvKHIyLGcscik7CiAgICBlbHNlIHsgdmFyIHQgPSByOyByID0g
cjI7IHIyID0gdDsgfQogIH0KICByZXR1cm4gei5yZXZlcnQocik7Cn0KCi8vIChwdWJsaWMpIHRo
aXNeZSAlIG0sIDAgPD0gZSA8IDJeMzIKZnVuY3Rpb24gYm5Nb2RQb3dJbnQoZSxtKSB7CiAgdmFy
IHo7CiAgaWYoZSA8IDI1NiB8fCBtLmlzRXZlbigpKSB6ID0gbmV3IENsYXNzaWMobSk7IGVsc2Ug
eiA9IG5ldyBNb250Z29tZXJ5KG0pOwogIHJldHVybiB0aGlzLmV4cChlLHopOwp9CgovLyBwcm90
ZWN0ZWQKQmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvID0gYm5wQ29weVRvOwpCaWdJbnRlZ2Vy
LnByb3RvdHlwZS5mcm9tSW50ID0gYm5wRnJvbUludDsKQmlnSW50ZWdlci5wcm90b3R5cGUuZnJv
bVN0cmluZyA9IGJucEZyb21TdHJpbmc7CkJpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wID0gYm5w
Q2xhbXA7CkJpZ0ludGVnZXIucHJvdG90eXBlLmRsU2hpZnRUbyA9IGJucERMU2hpZnRUbzsKQmln
SW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvID0gYm5wRFJTaGlmdFRvOwpCaWdJbnRlZ2VyLnBy
b3RvdHlwZS5sU2hpZnRUbyA9IGJucExTaGlmdFRvOwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5yU2hp
ZnRUbyA9IGJucFJTaGlmdFRvOwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbyA9IGJucFN1YlRv
OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvID0gYm5wTXVsdGlwbHlUbzsKQmlnSW50
ZWdlci5wcm90b3R5cGUuc3F1YXJlVG8gPSBibnBTcXVhcmVUbzsKQmlnSW50ZWdlci5wcm90b3R5
cGUuZGl2UmVtVG8gPSBibnBEaXZSZW1UbzsKQmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQg
PSBibnBJbnZEaWdpdDsKQmlnSW50ZWdlci5wcm90b3R5cGUuaXNFdmVuID0gYm5wSXNFdmVuOwpC
aWdJbnRlZ2VyLnByb3RvdHlwZS5leHAgPSBibnBFeHA7CgovLyBwdWJsaWMKQmlnSW50ZWdlci5w
cm90b3R5cGUudG9TdHJpbmcgPSBiblRvU3RyaW5nOwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5uZWdh
dGUgPSBibk5lZ2F0ZTsKQmlnSW50ZWdlci5wcm90b3R5cGUuYWJzID0gYm5BYnM7CkJpZ0ludGVn
ZXIucHJvdG90eXBlLmNvbXBhcmVUbyA9IGJuQ29tcGFyZVRvOwpCaWdJbnRlZ2VyLnByb3RvdHlw
ZS5iaXRMZW5ndGggPSBibkJpdExlbmd0aDsKQmlnSW50ZWdlci5wcm90b3R5cGUubW9kID0gYm5N
b2Q7CkJpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvd0ludCA9IGJuTW9kUG93SW50OwoKLy8gImNv
bnN0YW50cyIKQmlnSW50ZWdlci5aRVJPID0gbmJ2KDApOwpCaWdJbnRlZ2VyLk9ORSA9IG5idigx
KTsKLy8gQ29weXJpZ2h0IChjKSAyMDA1ICBUb20gV3UKLy8gQWxsIFJpZ2h0cyBSZXNlcnZlZC4K
Ly8gU2VlICJMSUNFTlNFIiBmb3IgZGV0YWlscy4KCi8vIEV4dGVuZGVkIEphdmFTY3JpcHQgQk4g
ZnVuY3Rpb25zLCByZXF1aXJlZCBmb3IgUlNBIHByaXZhdGUgb3BzLgoKLy8gKHB1YmxpYykKZnVu
Y3Rpb24gYm5DbG9uZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5jb3B5VG8ocik7IHJldHVybiBy
OyB9CgovLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgaW50ZWdlcgpmdW5jdGlvbiBibkludFZh
bHVlKCkgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICBpZih0aGlzLnMgPCAwKSB7
CiAgICBpZih0aGlzLnQgPT0gMSkgcmV0dXJuIHRoaXNfYXJyYXlbMF0tQklfRFY7CiAgICBlbHNl
IGlmKHRoaXMudCA9PSAwKSByZXR1cm4gLTE7CiAgfQogIGVsc2UgaWYodGhpcy50ID09IDEpIHJl
dHVybiB0aGlzX2FycmF5WzBdOwogIGVsc2UgaWYodGhpcy50ID09IDApIHJldHVybiAwOwogIC8v
IGFzc3VtZXMgMTYgPCBEQiA8IDMyCiAgcmV0dXJuICgodGhpc19hcnJheVsxXSYoKDE8PCgzMi1C
SV9EQikpLTEpKTw8QklfREIpfHRoaXNfYXJyYXlbMF07Cn0KCi8vIChwdWJsaWMpIHJldHVybiB2
YWx1ZSBhcyBieXRlCmZ1bmN0aW9uIGJuQnl0ZVZhbHVlKCkgewogIHZhciB0aGlzX2FycmF5ID0g
dGhpcy5hcnJheTsKICByZXR1cm4gKHRoaXMudD09MCk/dGhpcy5zOih0aGlzX2FycmF5WzBdPDwy
NCk+PjI0Owp9CgovLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgc2hvcnQgKGFzc3VtZXMgREI+
PTE2KQpmdW5jdGlvbiBiblNob3J0VmFsdWUoKSB7CiAgdmFyIHRoaXNfYXJyYXkgPSB0aGlzLmFy
cmF5OwogIHJldHVybiAodGhpcy50PT0wKT90aGlzLnM6KHRoaXNfYXJyYXlbMF08PDE2KT4+MTY7
Cn0KCi8vIChwcm90ZWN0ZWQpIHJldHVybiB4IHMudC4gcl54IDwgRFYKZnVuY3Rpb24gYm5wQ2h1
bmtTaXplKHIpIHsgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5MTjIqQklfREIvTWF0aC5sb2cocikp
OyB9CgovLyAocHVibGljKSAwIGlmIHRoaXMgPT0gMCwgMSBpZiB0aGlzID4gMApmdW5jdGlvbiBi
blNpZ051bSgpIHsKICB2YXIgdGhpc19hcnJheSA9IHRoaXMuYXJyYXk7CiAgaWYodGhpcy5zIDwg
MCkgcmV0dXJuIC0xOwogIGVsc2UgaWYodGhpcy50IDw9IDAgfHwgKHRoaXMudCA9PSAxICYmIHRo
aXNfYXJyYXlbMF0gPD0gMCkpIHJldHVybiAwOwogIGVsc2UgcmV0dXJuIDE7Cn0KCi8vIChwcm90
ZWN0ZWQpIGNvbnZlcnQgdG8gcmFkaXggc3RyaW5nCmZ1bmN0aW9uIGJucFRvUmFkaXgoYikgewog
IGlmKGIgPT0gbnVsbCkgYiA9IDEwOwogIGlmKHRoaXMuc2lnbnVtKCkgPT0gMCB8fCBiIDwgMiB8
fCBiID4gMzYpIHJldHVybiAiMCI7CiAgdmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7CiAgdmFy
IGEgPSBNYXRoLnBvdyhiLGNzKTsKICB2YXIgZCA9IG5idihhKSwgeSA9IG5iaSgpLCB6ID0gbmJp
KCksIHIgPSAiIjsKICB0aGlzLmRpdlJlbVRvKGQseSx6KTsKICB3aGlsZSh5LnNpZ251bSgpID4g
MCkgewogICAgciA9IChhK3ouaW50VmFsdWUoKSkudG9TdHJpbmcoYikuc3Vic3RyKDEpICsgcjsK
ICAgIHkuZGl2UmVtVG8oZCx5LHopOwogIH0KICByZXR1cm4gei5pbnRWYWx1ZSgpLnRvU3RyaW5n
KGIpICsgcjsKfQoKLy8gKHByb3RlY3RlZCkgY29udmVydCBmcm9tIHJhZGl4IHN0cmluZwpmdW5j
dGlvbiBibnBGcm9tUmFkaXgocyxiKSB7CiAgdGhpcy5mcm9tSW50KDApOwogIGlmKGIgPT0gbnVs
bCkgYiA9IDEwOwogIHZhciBjcyA9IHRoaXMuY2h1bmtTaXplKGIpOwogIHZhciBkID0gTWF0aC5w
b3coYixjcyksIG1pID0gZmFsc2UsIGogPSAwLCB3ID0gMDsKICBmb3IodmFyIGkgPSAwOyBpIDwg
cy5sZW5ndGg7ICsraSkgewogICAgdmFyIHggPSBpbnRBdChzLGkpOwogICAgaWYoeCA8IDApIHsK
ICAgICAgaWYocy5jaGFyQXQoaSkgPT0gIi0iICYmIHRoaXMuc2lnbnVtKCkgPT0gMCkgbWkgPSB0
cnVlOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHcgPSBiKncreDsKICAgIGlmKCsraiA+PSBj
cykgewogICAgICB0aGlzLmRNdWx0aXBseShkKTsKICAgICAgdGhpcy5kQWRkT2Zmc2V0KHcsMCk7
CiAgICAgIGogPSAwOwogICAgICB3ID0gMDsKICAgIH0KICB9CiAgaWYoaiA+IDApIHsKICAgIHRo
aXMuZE11bHRpcGx5KE1hdGgucG93KGIsaikpOwogICAgdGhpcy5kQWRkT2Zmc2V0KHcsMCk7CiAg
fQogIGlmKG1pKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKTsKfQoKLy8gKHByb3Rl
Y3RlZCkgYWx0ZXJuYXRlIGNvbnN0cnVjdG9yCmZ1bmN0aW9uIGJucEZyb21OdW1iZXIoYSxiLGMp
IHsKICBpZigibnVtYmVyIiA9PSB0eXBlb2YgYikgewogICAgLy8gbmV3IEJpZ0ludGVnZXIoaW50
LGludCxSTkcpCiAgICBpZihhIDwgMikgdGhpcy5mcm9tSW50KDEpOwogICAgZWxzZSB7CiAgICAg
IHRoaXMuZnJvbU51bWJlcihhLGMpOwogICAgICBpZighdGhpcy50ZXN0Qml0KGEtMSkpCS8vIGZv
cmNlIE1TQiBzZXQKICAgICAgICB0aGlzLmJpdHdpc2VUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExl
ZnQoYS0xKSxvcF9vcix0aGlzKTsKICAgICAgaWYodGhpcy5pc0V2ZW4oKSkgdGhpcy5kQWRkT2Zm
c2V0KDEsMCk7IC8vIGZvcmNlIG9kZAogICAgICB3aGlsZSghdGhpcy5pc1Byb2JhYmxlUHJpbWUo
YikpIHsKICAgICAgICB0aGlzLmRBZGRPZmZzZXQoMiwwKTsKICAgICAgICBpZih0aGlzLmJpdExl
bmd0aCgpID4gYSkgdGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYS0xKSx0aGlz
KTsKICAgICAgfQogICAgfQogIH0KICBlbHNlIHsKICAgIC8vIG5ldyBCaWdJbnRlZ2VyKGludCxS
TkcpCiAgICB2YXIgeCA9IG5ldyBBcnJheSgpLCB0ID0gYSY3OwogICAgeC5sZW5ndGggPSAoYT4+
MykrMTsKICAgIGIubmV4dEJ5dGVzKHgpOwogICAgaWYodCA+IDApIHhbMF0gJj0gKCgxPDx0KS0x
KTsgZWxzZSB4WzBdID0gMDsKICAgIHRoaXMuZnJvbVN0cmluZyh4LDI1Nik7CiAgfQp9CgovLyAo
cHVibGljKSBjb252ZXJ0IHRvIGJpZ2VuZGlhbiBieXRlIGFycmF5CmZ1bmN0aW9uIGJuVG9CeXRl
QXJyYXkoKSB7CiAgdmFyIHRoaXNfYXJyYXkgPSB0aGlzLmFycmF5OwogIHZhciBpID0gdGhpcy50
LCByID0gbmV3IEFycmF5KCk7CiAgclswXSA9IHRoaXMuczsKICB2YXIgcCA9IEJJX0RCLShpKkJJ
X0RCKSU4LCBkLCBrID0gMDsKICBpZihpLS0gPiAwKSB7CiAgICBpZihwIDwgQklfREIgJiYgKGQg
PSB0aGlzX2FycmF5W2ldPj5wKSAhPSAodGhpcy5zJkJJX0RNKT4+cCkKICAgICAgcltrKytdID0g
ZHwodGhpcy5zPDwoQklfREItcCkpOwogICAgd2hpbGUoaSA+PSAwKSB7CiAgICAgIGlmKHAgPCA4
KSB7CiAgICAgICAgZCA9ICh0aGlzX2FycmF5W2ldJigoMTw8cCktMSkpPDwoOC1wKTsKICAgICAg
ICBkIHw9IHRoaXNfYXJyYXlbLS1pXT4+KHArPUJJX0RCLTgpOwogICAgICB9CiAgICAgIGVsc2Ug
ewogICAgICAgIGQgPSAodGhpc19hcnJheVtpXT4+KHAtPTgpKSYweGZmOwogICAgICAgIGlmKHAg
PD0gMCkgeyBwICs9IEJJX0RCOyAtLWk7IH0KICAgICAgfQogICAgICBpZigoZCYweDgwKSAhPSAw
KSBkIHw9IC0yNTY7CiAgICAgIGlmKGsgPT0gMCAmJiAodGhpcy5zJjB4ODApICE9IChkJjB4ODAp
KSArK2s7CiAgICAgIGlmKGsgPiAwIHx8IGQgIT0gdGhpcy5zKSByW2srK10gPSBkOwogICAgfQog
IH0KICByZXR1cm4gcjsKfQoKZnVuY3Rpb24gYm5FcXVhbHMoYSkgeyByZXR1cm4odGhpcy5jb21w
YXJlVG8oYSk9PTApOyB9CmZ1bmN0aW9uIGJuTWluKGEpIHsgcmV0dXJuKHRoaXMuY29tcGFyZVRv
KGEpPDApP3RoaXM6YTsgfQpmdW5jdGlvbiBibk1heChhKSB7IHJldHVybih0aGlzLmNvbXBhcmVU
byhhKT4wKT90aGlzOmE7IH0KCi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIG9wIGEgKGJpdHdpc2Up
CmZ1bmN0aW9uIGJucEJpdHdpc2VUbyhhLG9wLHIpIHsKICB2YXIgdGhpc19hcnJheSA9IHRoaXMu
YXJyYXk7CiAgdmFyIGFfYXJyYXkgICAgPSBhLmFycmF5OwogIHZhciByX2FycmF5ICAgID0gci5h
cnJheTsKICB2YXIgaSwgZiwgbSA9IE1hdGgubWluKGEudCx0aGlzLnQpOwogIGZvcihpID0gMDsg
aSA8IG07ICsraSkgcl9hcnJheVtpXSA9IG9wKHRoaXNfYXJyYXlbaV0sYV9hcnJheVtpXSk7CiAg
aWYoYS50IDwgdGhpcy50KSB7CiAgICBmID0gYS5zJkJJX0RNOwogICAgZm9yKGkgPSBtOyBpIDwg
dGhpcy50OyArK2kpIHJfYXJyYXlbaV0gPSBvcCh0aGlzX2FycmF5W2ldLGYpOwogICAgci50ID0g
dGhpcy50OwogIH0KICBlbHNlIHsKICAgIGYgPSB0aGlzLnMmQklfRE07CiAgICBmb3IoaSA9IG07
IGkgPCBhLnQ7ICsraSkgcl9hcnJheVtpXSA9IG9wKGYsYV9hcnJheVtpXSk7CiAgICByLnQgPSBh
LnQ7CiAgfQogIHIucyA9IG9wKHRoaXMucyxhLnMpOwogIHIuY2xhbXAoKTsKfQoKLy8gKHB1Ymxp
YykgdGhpcyAmIGEKZnVuY3Rpb24gb3BfYW5kKHgseSkgeyByZXR1cm4geCZ5OyB9CmZ1bmN0aW9u
IGJuQW5kKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9hbmQscik7IHJl
dHVybiByOyB9CgovLyAocHVibGljKSB0aGlzIHwgYQpmdW5jdGlvbiBvcF9vcih4LHkpIHsgcmV0
dXJuIHh8eTsgfQpmdW5jdGlvbiBibk9yKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNl
VG8oYSxvcF9vcixyKTsgcmV0dXJuIHI7IH0KCi8vIChwdWJsaWMpIHRoaXMgXiBhCmZ1bmN0aW9u
IG9wX3hvcih4LHkpIHsgcmV0dXJuIHheeTsgfQpmdW5jdGlvbiBiblhvcihhKSB7IHZhciByID0g
bmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfeG9yLHIpOyByZXR1cm4gcjsgfQoKLy8gKHB1Ymxp
YykgdGhpcyAmIH5hCmZ1bmN0aW9uIG9wX2FuZG5vdCh4LHkpIHsgcmV0dXJuIHgmfnk7IH0KZnVu
Y3Rpb24gYm5BbmROb3QoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX2Fu
ZG5vdCxyKTsgcmV0dXJuIHI7IH0KCi8vIChwdWJsaWMpIH50aGlzCmZ1bmN0aW9uIGJuTm90KCkg
ewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICB2YXIgciA9IG5iaSgpOwogIHZhciBy
X2FycmF5ID0gci5hcnJheTsKCiAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKSByX2Fy
cmF5W2ldID0gQklfRE0mfnRoaXNfYXJyYXlbaV07CiAgci50ID0gdGhpcy50OwogIHIucyA9IH50
aGlzLnM7CiAgcmV0dXJuIHI7Cn0KCi8vIChwdWJsaWMpIHRoaXMgPDwgbgpmdW5jdGlvbiBiblNo
aWZ0TGVmdChuKSB7CiAgdmFyIHIgPSBuYmkoKTsKICBpZihuIDwgMCkgdGhpcy5yU2hpZnRUbygt
bixyKTsgZWxzZSB0aGlzLmxTaGlmdFRvKG4scik7CiAgcmV0dXJuIHI7Cn0KCi8vIChwdWJsaWMp
IHRoaXMgPj4gbgpmdW5jdGlvbiBiblNoaWZ0UmlnaHQobikgewogIHZhciByID0gbmJpKCk7CiAg
aWYobiA8IDApIHRoaXMubFNoaWZ0VG8oLW4scik7IGVsc2UgdGhpcy5yU2hpZnRUbyhuLHIpOwog
IHJldHVybiByOwp9CgovLyByZXR1cm4gaW5kZXggb2YgbG93ZXN0IDEtYml0IGluIHgsIHggPCAy
XjMxCmZ1bmN0aW9uIGxiaXQoeCkgewogIGlmKHggPT0gMCkgcmV0dXJuIC0xOwogIHZhciByID0g
MDsKICBpZigoeCYweGZmZmYpID09IDApIHsgeCA+Pj0gMTY7IHIgKz0gMTY7IH0KICBpZigoeCYw
eGZmKSA9PSAwKSB7IHggPj49IDg7IHIgKz0gODsgfQogIGlmKCh4JjB4ZikgPT0gMCkgeyB4ID4+
PSA0OyByICs9IDQ7IH0KICBpZigoeCYzKSA9PSAwKSB7IHggPj49IDI7IHIgKz0gMjsgfQogIGlm
KCh4JjEpID09IDApICsrcjsKICByZXR1cm4gcjsKfQoKLy8gKHB1YmxpYykgcmV0dXJucyBpbmRl
eCBvZiBsb3dlc3QgMS1iaXQgKG9yIC0xIGlmIG5vbmUpCmZ1bmN0aW9uIGJuR2V0TG93ZXN0U2V0
Qml0KCkgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICBmb3IodmFyIGkgPSAwOyBp
IDwgdGhpcy50OyArK2kpCiAgICBpZih0aGlzX2FycmF5W2ldICE9IDApIHJldHVybiBpKkJJX0RC
K2xiaXQodGhpc19hcnJheVtpXSk7CiAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIHRoaXMudCpCSV9E
QjsKICByZXR1cm4gLTE7Cn0KCi8vIHJldHVybiBudW1iZXIgb2YgMSBiaXRzIGluIHgKZnVuY3Rp
b24gY2JpdCh4KSB7CiAgdmFyIHIgPSAwOwogIHdoaWxlKHggIT0gMCkgeyB4ICY9IHgtMTsgKyty
OyB9CiAgcmV0dXJuIHI7Cn0KCi8vIChwdWJsaWMpIHJldHVybiBudW1iZXIgb2Ygc2V0IGJpdHMK
ZnVuY3Rpb24gYm5CaXRDb3VudCgpIHsKICB2YXIgciA9IDAsIHggPSB0aGlzLnMmQklfRE07CiAg
Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKSByICs9IGNiaXQodGhpc19hcnJheVtpXV54
KTsKICByZXR1cm4gcjsKfQoKLy8gKHB1YmxpYykgdHJ1ZSBpZmYgbnRoIGJpdCBpcyBzZXQKZnVu
Y3Rpb24gYm5UZXN0Qml0KG4pIHsKICB2YXIgdGhpc19hcnJheSA9IHRoaXMuYXJyYXk7CiAgdmFy
IGogPSBNYXRoLmZsb29yKG4vQklfREIpOwogIGlmKGogPj0gdGhpcy50KSByZXR1cm4odGhpcy5z
IT0wKTsKICByZXR1cm4oKHRoaXNfYXJyYXlbal0mKDE8PChuJUJJX0RCKSkpIT0wKTsKfQoKLy8g
KHByb3RlY3RlZCkgdGhpcyBvcCAoMTw8bikKZnVuY3Rpb24gYm5wQ2hhbmdlQml0KG4sb3ApIHsK
ICB2YXIgciA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChuKTsKICB0aGlzLmJpdHdpc2VUbyhy
LG9wLHIpOwogIHJldHVybiByOwp9CgovLyAocHVibGljKSB0aGlzIHwgKDE8PG4pCmZ1bmN0aW9u
IGJuU2V0Qml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3Bfb3IpOyB9CgovLyAocHVi
bGljKSB0aGlzICYgfigxPDxuKQpmdW5jdGlvbiBibkNsZWFyQml0KG4pIHsgcmV0dXJuIHRoaXMu
Y2hhbmdlQml0KG4sb3BfYW5kbm90KTsgfQoKLy8gKHB1YmxpYykgdGhpcyBeICgxPDxuKQpmdW5j
dGlvbiBibkZsaXBCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF94b3IpOyB9Cgov
LyAocHJvdGVjdGVkKSByID0gdGhpcyArIGEKZnVuY3Rpb24gYm5wQWRkVG8oYSxyKSB7CiAgdmFy
IHRoaXNfYXJyYXkgPSB0aGlzLmFycmF5OwogIHZhciBhX2FycmF5ID0gYS5hcnJheTsKICB2YXIg
cl9hcnJheSA9IHIuYXJyYXk7CiAgdmFyIGkgPSAwLCBjID0gMCwgbSA9IE1hdGgubWluKGEudCx0
aGlzLnQpOwogIHdoaWxlKGkgPCBtKSB7CiAgICBjICs9IHRoaXNfYXJyYXlbaV0rYV9hcnJheVtp
XTsKICAgIHJfYXJyYXlbaSsrXSA9IGMmQklfRE07CiAgICBjID4+PSBCSV9EQjsKICB9CiAgaWYo
YS50IDwgdGhpcy50KSB7CiAgICBjICs9IGEuczsKICAgIHdoaWxlKGkgPCB0aGlzLnQpIHsKICAg
ICAgYyArPSB0aGlzX2FycmF5W2ldOwogICAgICByX2FycmF5W2krK10gPSBjJkJJX0RNOwogICAg
ICBjID4+PSBCSV9EQjsKICAgIH0KICAgIGMgKz0gdGhpcy5zOwogIH0KICBlbHNlIHsKICAgIGMg
Kz0gdGhpcy5zOwogICAgd2hpbGUoaSA8IGEudCkgewogICAgICBjICs9IGFfYXJyYXlbaV07CiAg
ICAgIHJfYXJyYXlbaSsrXSA9IGMmQklfRE07CiAgICAgIGMgPj49IEJJX0RCOwogICAgfQogICAg
YyArPSBhLnM7CiAgfQogIHIucyA9IChjPDApPy0xOjA7CiAgaWYoYyA+IDApIHJfYXJyYXlbaSsr
XSA9IGM7CiAgZWxzZSBpZihjIDwgLTEpIHJfYXJyYXlbaSsrXSA9IEJJX0RWK2M7CiAgci50ID0g
aTsKICByLmNsYW1wKCk7Cn0KCi8vIChwdWJsaWMpIHRoaXMgKyBhCmZ1bmN0aW9uIGJuQWRkKGEp
IHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5hZGRUbyhhLHIpOyByZXR1cm4gcjsgfQoKLy8gKHB1Ymxp
YykgdGhpcyAtIGEKZnVuY3Rpb24gYm5TdWJ0cmFjdChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMu
c3ViVG8oYSxyKTsgcmV0dXJuIHI7IH0KCi8vIChwdWJsaWMpIHRoaXMgKiBhCmZ1bmN0aW9uIGJu
TXVsdGlwbHkoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLm11bHRpcGx5VG8oYSxyKTsgcmV0dXJu
IHI7IH0KCi8vIChwdWJsaWMpIHRoaXMgLyBhCmZ1bmN0aW9uIGJuRGl2aWRlKGEpIHsgdmFyIHIg
PSBuYmkoKTsgdGhpcy5kaXZSZW1UbyhhLHIsbnVsbCk7IHJldHVybiByOyB9CgovLyAocHVibGlj
KSB0aGlzICUgYQpmdW5jdGlvbiBiblJlbWFpbmRlcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMu
ZGl2UmVtVG8oYSxudWxsLHIpOyByZXR1cm4gcjsgfQoKLy8gKHB1YmxpYykgW3RoaXMvYSx0aGlz
JWFdCmZ1bmN0aW9uIGJuRGl2aWRlQW5kUmVtYWluZGVyKGEpIHsKICB2YXIgcSA9IG5iaSgpLCBy
ID0gbmJpKCk7CiAgdGhpcy5kaXZSZW1UbyhhLHEscik7CiAgcmV0dXJuIG5ldyBBcnJheShxLHIp
Owp9CgovLyAocHJvdGVjdGVkKSB0aGlzICo9IG4sIHRoaXMgPj0gMCwgMSA8IG4gPCBEVgpmdW5j
dGlvbiBibnBETXVsdGlwbHkobikgewogIHZhciB0aGlzX2FycmF5ID0gdGhpcy5hcnJheTsKICB0
aGlzX2FycmF5W3RoaXMudF0gPSB0aGlzLmFtKDAsbi0xLHRoaXMsMCwwLHRoaXMudCk7CiAgKyt0
aGlzLnQ7CiAgdGhpcy5jbGFtcCgpOwp9CgovLyAocHJvdGVjdGVkKSB0aGlzICs9IG4gPDwgdyB3
b3JkcywgdGhpcyA+PSAwCmZ1bmN0aW9uIGJucERBZGRPZmZzZXQobix3KSB7CiAgdmFyIHRoaXNf
YXJyYXkgPSB0aGlzLmFycmF5OwogIHdoaWxlKHRoaXMudCA8PSB3KSB0aGlzX2FycmF5W3RoaXMu
dCsrXSA9IDA7CiAgdGhpc19hcnJheVt3XSArPSBuOwogIHdoaWxlKHRoaXNfYXJyYXlbd10gPj0g
QklfRFYpIHsKICAgIHRoaXNfYXJyYXlbd10gLT0gQklfRFY7CiAgICBpZigrK3cgPj0gdGhpcy50
KSB0aGlzX2FycmF5W3RoaXMudCsrXSA9IDA7CiAgICArK3RoaXNfYXJyYXlbd107CiAgfQp9Cgov
LyBBICJudWxsIiByZWR1Y2VyCmZ1bmN0aW9uIE51bGxFeHAoKSB7fQpmdW5jdGlvbiBuTm9wKHgp
IHsgcmV0dXJuIHg7IH0KZnVuY3Rpb24gbk11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIp
OyB9CmZ1bmN0aW9uIG5TcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgfQoKTnVsbEV4cC5wcm90
b3R5cGUuY29udmVydCA9IG5Ob3A7Ck51bGxFeHAucHJvdG90eXBlLnJldmVydCA9IG5Ob3A7Ck51
bGxFeHAucHJvdG90eXBlLm11bFRvID0gbk11bFRvOwpOdWxsRXhwLnByb3RvdHlwZS5zcXJUbyA9
IG5TcXJUbzsKCi8vIChwdWJsaWMpIHRoaXNeZQpmdW5jdGlvbiBiblBvdyhlKSB7IHJldHVybiB0
aGlzLmV4cChlLG5ldyBOdWxsRXhwKCkpOyB9CgovLyAocHJvdGVjdGVkKSByID0gbG93ZXIgbiB3
b3JkcyBvZiAidGhpcyAqIGEiLCBhLnQgPD0gbgovLyAidGhpcyIgc2hvdWxkIGJlIHRoZSBsYXJn
ZXIgb25lIGlmIGFwcHJvcHJpYXRlLgpmdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYSxuLHIp
IHsKICB2YXIgcl9hcnJheSA9IHIuYXJyYXk7CiAgdmFyIGFfYXJyYXkgPSBhLmFycmF5OwogIHZh
ciBpID0gTWF0aC5taW4odGhpcy50K2EudCxuKTsKICByLnMgPSAwOyAvLyBhc3N1bWVzIGEsdGhp
cyA+PSAwCiAgci50ID0gaTsKICB3aGlsZShpID4gMCkgcl9hcnJheVstLWldID0gMDsKICB2YXIg
ajsKICBmb3IoaiA9IHIudC10aGlzLnQ7IGkgPCBqOyArK2kpIHJfYXJyYXlbaSt0aGlzLnRdID0g
dGhpcy5hbSgwLGFfYXJyYXlbaV0scixpLDAsdGhpcy50KTsKICBmb3IoaiA9IE1hdGgubWluKGEu
dCxuKTsgaSA8IGo7ICsraSkgdGhpcy5hbSgwLGFfYXJyYXlbaV0scixpLDAsbi1pKTsKICByLmNs
YW1wKCk7Cn0KCi8vIChwcm90ZWN0ZWQpIHIgPSAidGhpcyAqIGEiIHdpdGhvdXQgbG93ZXIgbiB3
b3JkcywgbiA+IDAKLy8gInRoaXMiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3By
aWF0ZS4KZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGEsbixyKSB7CiAgdmFyIHJfYXJyYXkg
PSByLmFycmF5OwogIHZhciBhX2FycmF5ID0gYS5hcnJheTsKICAtLW47CiAgdmFyIGkgPSByLnQg
PSB0aGlzLnQrYS50LW47CiAgci5zID0gMDsgLy8gYXNzdW1lcyBhLHRoaXMgPj0gMAogIHdoaWxl
KC0taSA+PSAwKSByX2FycmF5W2ldID0gMDsKICBmb3IoaSA9IE1hdGgubWF4KG4tdGhpcy50LDAp
OyBpIDwgYS50OyArK2kpCiAgICByX2FycmF5W3RoaXMudCtpLW5dID0gdGhpcy5hbShuLWksYV9h
cnJheVtpXSxyLDAsMCx0aGlzLnQraS1uKTsKICByLmNsYW1wKCk7CiAgci5kclNoaWZ0VG8oMSxy
KTsKfQoKLy8gQmFycmV0dCBtb2R1bGFyIHJlZHVjdGlvbgpmdW5jdGlvbiBCYXJyZXR0KG0pIHsK
ICAvLyBzZXR1cCBCYXJyZXR0CiAgdGhpcy5yMiA9IG5iaSgpOwogIHRoaXMucTMgPSBuYmkoKTsK
ICBCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oMiptLnQsdGhpcy5yMik7CiAgdGhpcy5tdSA9IHRo
aXMucjIuZGl2aWRlKG0pOwogIHRoaXMubSA9IG07Cn0KCmZ1bmN0aW9uIGJhcnJldHRDb252ZXJ0
KHgpIHsKICBpZih4LnMgPCAwIHx8IHgudCA+IDIqdGhpcy5tLnQpIHJldHVybiB4Lm1vZCh0aGlz
Lm0pOwogIGVsc2UgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA8IDApIHJldHVybiB4OwogIGVsc2Ug
eyB2YXIgciA9IG5iaSgpOyB4LmNvcHlUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IHJldHVybiByOyB9
Cn0KCmZ1bmN0aW9uIGJhcnJldHRSZXZlcnQoeCkgeyByZXR1cm4geDsgfQoKLy8geCA9IHggbW9k
IG0gKEhBQyAxNC40MikKZnVuY3Rpb24gYmFycmV0dFJlZHVjZSh4KSB7CiAgeC5kclNoaWZ0VG8o
dGhpcy5tLnQtMSx0aGlzLnIyKTsKICBpZih4LnQgPiB0aGlzLm0udCsxKSB7IHgudCA9IHRoaXMu
bS50KzE7IHguY2xhbXAoKTsgfQogIHRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhp
cy5tLnQrMSx0aGlzLnEzKTsKICB0aGlzLm0ubXVsdGlwbHlMb3dlclRvKHRoaXMucTMsdGhpcy5t
LnQrMSx0aGlzLnIyKTsKICB3aGlsZSh4LmNvbXBhcmVUbyh0aGlzLnIyKSA8IDApIHguZEFkZE9m
ZnNldCgxLHRoaXMubS50KzEpOwogIHguc3ViVG8odGhpcy5yMix4KTsKICB3aGlsZSh4LmNvbXBh
cmVUbyh0aGlzLm0pID49IDApIHguc3ViVG8odGhpcy5tLHgpOwp9CgovLyByID0geF4yIG1vZCBt
OyB4ICE9IHIKZnVuY3Rpb24gYmFycmV0dFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlz
LnJlZHVjZShyKTsgfQoKLy8gciA9IHgqeSBtb2QgbTsgeCx5ICE9IHIKZnVuY3Rpb24gYmFycmV0
dE11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfQoKQmFy
cmV0dC5wcm90b3R5cGUuY29udmVydCA9IGJhcnJldHRDb252ZXJ0OwpCYXJyZXR0LnByb3RvdHlw
ZS5yZXZlcnQgPSBiYXJyZXR0UmV2ZXJ0OwpCYXJyZXR0LnByb3RvdHlwZS5yZWR1Y2UgPSBiYXJy
ZXR0UmVkdWNlOwpCYXJyZXR0LnByb3RvdHlwZS5tdWxUbyA9IGJhcnJldHRNdWxUbzsKQmFycmV0
dC5wcm90b3R5cGUuc3FyVG8gPSBiYXJyZXR0U3FyVG87CgovLyAocHVibGljKSB0aGlzXmUgJSBt
IChIQUMgMTQuODUpCmZ1bmN0aW9uIGJuTW9kUG93KGUsbSkgewogIHZhciBlX2FycmF5ID0gZS5h
cnJheTsKICB2YXIgaSA9IGUuYml0TGVuZ3RoKCksIGssIHIgPSBuYnYoMSksIHo7CiAgaWYoaSA8
PSAwKSByZXR1cm4gcjsKICBlbHNlIGlmKGkgPCAxOCkgayA9IDE7CiAgZWxzZSBpZihpIDwgNDgp
IGsgPSAzOwogIGVsc2UgaWYoaSA8IDE0NCkgayA9IDQ7CiAgZWxzZSBpZihpIDwgNzY4KSBrID0g
NTsKICBlbHNlIGsgPSA2OwogIGlmKGkgPCA4KQogICAgeiA9IG5ldyBDbGFzc2ljKG0pOwogIGVs
c2UgaWYobS5pc0V2ZW4oKSkKICAgIHogPSBuZXcgQmFycmV0dChtKTsKICBlbHNlCiAgICB6ID0g
bmV3IE1vbnRnb21lcnkobSk7CgogIC8vIHByZWNvbXB1dGF0aW9uCiAgdmFyIGcgPSBuZXcgQXJy
YXkoKSwgbiA9IDMsIGsxID0gay0xLCBrbSA9ICgxPDxrKS0xOwogIGdbMV0gPSB6LmNvbnZlcnQo
dGhpcyk7CiAgaWYoayA+IDEpIHsKICAgIHZhciBnMiA9IG5iaSgpOwogICAgei5zcXJUbyhnWzFd
LGcyKTsKICAgIHdoaWxlKG4gPD0ga20pIHsKICAgICAgZ1tuXSA9IG5iaSgpOwogICAgICB6Lm11
bFRvKGcyLGdbbi0yXSxnW25dKTsKICAgICAgbiArPSAyOwogICAgfQogIH0KCiAgdmFyIGogPSBl
LnQtMSwgdywgaXMxID0gdHJ1ZSwgcjIgPSBuYmkoKSwgdDsKICBpID0gbmJpdHMoZV9hcnJheVtq
XSktMTsKICB3aGlsZShqID49IDApIHsKICAgIGlmKGkgPj0gazEpIHcgPSAoZV9hcnJheVtqXT4+
KGktazEpKSZrbTsKICAgIGVsc2UgewogICAgICB3ID0gKGVfYXJyYXlbal0mKCgxPDwoaSsxKSkt
MSkpPDwoazEtaSk7CiAgICAgIGlmKGogPiAwKSB3IHw9IGVfYXJyYXlbai0xXT4+KEJJX0RCK2kt
azEpOwogICAgfQoKICAgIG4gPSBrOwogICAgd2hpbGUoKHcmMSkgPT0gMCkgeyB3ID4+PSAxOyAt
LW47IH0KICAgIGlmKChpIC09IG4pIDwgMCkgeyBpICs9IEJJX0RCOyAtLWo7IH0KICAgIGlmKGlz
MSkgewkvLyByZXQgPT0gMSwgZG9uJ3QgYm90aGVyIHNxdWFyaW5nIG9yIG11bHRpcGx5aW5nIGl0
CiAgICAgIGdbd10uY29weVRvKHIpOwogICAgICBpczEgPSBmYWxzZTsKICAgIH0KICAgIGVsc2Ug
ewogICAgICB3aGlsZShuID4gMSkgeyB6LnNxclRvKHIscjIpOyB6LnNxclRvKHIyLHIpOyBuIC09
IDI7IH0KICAgICAgaWYobiA+IDApIHouc3FyVG8ocixyMik7IGVsc2UgeyB0ID0gcjsgciA9IHIy
OyByMiA9IHQ7IH0KICAgICAgei5tdWxUbyhyMixnW3ddLHIpOwogICAgfQoKICAgIHdoaWxlKGog
Pj0gMCAmJiAoZV9hcnJheVtqXSYoMTw8aSkpID09IDApIHsKICAgICAgei5zcXJUbyhyLHIyKTsg
dCA9IHI7IHIgPSByMjsgcjIgPSB0OwogICAgICBpZigtLWkgPCAwKSB7IGkgPSBCSV9EQi0xOyAt
LWo7IH0KICAgIH0KICB9CiAgcmV0dXJuIHoucmV2ZXJ0KHIpOwp9CgovLyAocHVibGljKSBnY2Qo
dGhpcyxhKSAoSEFDIDE0LjU0KQpmdW5jdGlvbiBibkdDRChhKSB7CiAgdmFyIHggPSAodGhpcy5z
PDApP3RoaXMubmVnYXRlKCk6dGhpcy5jbG9uZSgpOwogIHZhciB5ID0gKGEuczwwKT9hLm5lZ2F0
ZSgpOmEuY2xvbmUoKTsKICBpZih4LmNvbXBhcmVUbyh5KSA8IDApIHsgdmFyIHQgPSB4OyB4ID0g
eTsgeSA9IHQ7IH0KICB2YXIgaSA9IHguZ2V0TG93ZXN0U2V0Qml0KCksIGcgPSB5LmdldExvd2Vz
dFNldEJpdCgpOwogIGlmKGcgPCAwKSByZXR1cm4geDsKICBpZihpIDwgZykgZyA9IGk7CiAgaWYo
ZyA+IDApIHsKICAgIHguclNoaWZ0VG8oZyx4KTsKICAgIHkuclNoaWZ0VG8oZyx5KTsKICB9CiAg
d2hpbGUoeC5zaWdudW0oKSA+IDApIHsKICAgIGlmKChpID0geC5nZXRMb3dlc3RTZXRCaXQoKSkg
PiAwKSB4LnJTaGlmdFRvKGkseCk7CiAgICBpZigoaSA9IHkuZ2V0TG93ZXN0U2V0Qml0KCkpID4g
MCkgeS5yU2hpZnRUbyhpLHkpOwogICAgaWYoeC5jb21wYXJlVG8oeSkgPj0gMCkgewogICAgICB4
LnN1YlRvKHkseCk7CiAgICAgIHguclNoaWZ0VG8oMSx4KTsKICAgIH0KICAgIGVsc2UgewogICAg
ICB5LnN1YlRvKHgseSk7CiAgICAgIHkuclNoaWZ0VG8oMSx5KTsKICAgIH0KICB9CiAgaWYoZyA+
IDApIHkubFNoaWZ0VG8oZyx5KTsKICByZXR1cm4geTsKfQoKLy8gKHByb3RlY3RlZCkgdGhpcyAl
IG4sIG4gPCAyXjI2CmZ1bmN0aW9uIGJucE1vZEludChuKSB7CiAgdmFyIHRoaXNfYXJyYXkgPSB0
aGlzLmFycmF5OwogIGlmKG4gPD0gMCkgcmV0dXJuIDA7CiAgdmFyIGQgPSBCSV9EViVuLCByID0g
KHRoaXMuczwwKT9uLTE6MDsKICBpZih0aGlzLnQgPiAwKQogICAgaWYoZCA9PSAwKSByID0gdGhp
c19hcnJheVswXSVuOwogICAgZWxzZSBmb3IodmFyIGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkp
IHIgPSAoZCpyK3RoaXNfYXJyYXlbaV0pJW47CiAgcmV0dXJuIHI7Cn0KCi8vIChwdWJsaWMpIDEv
dGhpcyAlIG0gKEhBQyAxNC42MSkKZnVuY3Rpb24gYm5Nb2RJbnZlcnNlKG0pIHsKICB2YXIgYWMg
PSBtLmlzRXZlbigpOwogIGlmKCh0aGlzLmlzRXZlbigpICYmIGFjKSB8fCBtLnNpZ251bSgpID09
IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87CiAgdmFyIHUgPSBtLmNsb25lKCksIHYgPSB0aGlz
LmNsb25lKCk7CiAgdmFyIGEgPSBuYnYoMSksIGIgPSBuYnYoMCksIGMgPSBuYnYoMCksIGQgPSBu
YnYoMSk7CiAgd2hpbGUodS5zaWdudW0oKSAhPSAwKSB7CiAgICB3aGlsZSh1LmlzRXZlbigpKSB7
CiAgICAgIHUuclNoaWZ0VG8oMSx1KTsKICAgICAgaWYoYWMpIHsKICAgICAgICBpZighYS5pc0V2
ZW4oKSB8fCAhYi5pc0V2ZW4oKSkgeyBhLmFkZFRvKHRoaXMsYSk7IGIuc3ViVG8obSxiKTsgfQog
ICAgICAgIGEuclNoaWZ0VG8oMSxhKTsKICAgICAgfQogICAgICBlbHNlIGlmKCFiLmlzRXZlbigp
KSBiLnN1YlRvKG0sYik7CiAgICAgIGIuclNoaWZ0VG8oMSxiKTsKICAgIH0KICAgIHdoaWxlKHYu
aXNFdmVuKCkpIHsKICAgICAgdi5yU2hpZnRUbygxLHYpOwogICAgICBpZihhYykgewogICAgICAg
IGlmKCFjLmlzRXZlbigpIHx8ICFkLmlzRXZlbigpKSB7IGMuYWRkVG8odGhpcyxjKTsgZC5zdWJU
byhtLGQpOyB9CiAgICAgICAgYy5yU2hpZnRUbygxLGMpOwogICAgICB9CiAgICAgIGVsc2UgaWYo
IWQuaXNFdmVuKCkpIGQuc3ViVG8obSxkKTsKICAgICAgZC5yU2hpZnRUbygxLGQpOwogICAgfQog
ICAgaWYodS5jb21wYXJlVG8odikgPj0gMCkgewogICAgICB1LnN1YlRvKHYsdSk7CiAgICAgIGlm
KGFjKSBhLnN1YlRvKGMsYSk7CiAgICAgIGIuc3ViVG8oZCxiKTsKICAgIH0KICAgIGVsc2Ugewog
ICAgICB2LnN1YlRvKHUsdik7CiAgICAgIGlmKGFjKSBjLnN1YlRvKGEsYyk7CiAgICAgIGQuc3Vi
VG8oYixkKTsKICAgIH0KICB9CiAgaWYodi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpICE9IDAp
IHJldHVybiBCaWdJbnRlZ2VyLlpFUk87CiAgaWYoZC5jb21wYXJlVG8obSkgPj0gMCkgcmV0dXJu
IGQuc3VidHJhY3QobSk7CiAgaWYoZC5zaWdudW0oKSA8IDApIGQuYWRkVG8obSxkKTsgZWxzZSBy
ZXR1cm4gZDsKICBpZihkLnNpZ251bSgpIDwgMCkgcmV0dXJuIGQuYWRkKG0pOyBlbHNlIHJldHVy
biBkOwp9Cgp2YXIgbG93cHJpbWVzID0gWzIsMyw1LDcsMTEsMTMsMTcsMTksMjMsMjksMzEsMzcs
NDEsNDMsNDcsNTMsNTksNjEsNjcsNzEsNzMsNzksODMsODksOTcsMTAxLDEwMywxMDcsMTA5LDEx
MywxMjcsMTMxLDEzNywxMzksMTQ5LDE1MSwxNTcsMTYzLDE2NywxNzMsMTc5LDE4MSwxOTEsMTkz
LDE5NywxOTksMjExLDIyMywyMjcsMjI5LDIzMywyMzksMjQxLDI1MSwyNTcsMjYzLDI2OSwyNzEs
Mjc3LDI4MSwyODMsMjkzLDMwNywzMTEsMzEzLDMxNywzMzEsMzM3LDM0NywzNDksMzUzLDM1OSwz
NjcsMzczLDM3OSwzODMsMzg5LDM5Nyw0MDEsNDA5LDQxOSw0MjEsNDMxLDQzMyw0MzksNDQzLDQ0
OSw0NTcsNDYxLDQ2Myw0NjcsNDc5LDQ4Nyw0OTEsNDk5LDUwMyw1MDldOwp2YXIgbHBsaW0gPSAo
MTw8MjYpL2xvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdOwoKLy8gKHB1YmxpYykgdGVzdCBw
cmltYWxpdHkgd2l0aCBjZXJ0YWludHkgPj0gMS0uNV50CmZ1bmN0aW9uIGJuSXNQcm9iYWJsZVBy
aW1lKHQpIHsKICB2YXIgaSwgeCA9IHRoaXMuYWJzKCk7CiAgdmFyIHhfYXJyYXkgPSB4LmFycmF5
OwogIGlmKHgudCA9PSAxICYmIHhfYXJyYXlbMF0gPD0gbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5n
dGgtMV0pIHsKICAgIGZvcihpID0gMDsgaSA8IGxvd3ByaW1lcy5sZW5ndGg7ICsraSkKICAgICAg
aWYoeF9hcnJheVswXSA9PSBsb3dwcmltZXNbaV0pIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZh
bHNlOwogIH0KICBpZih4LmlzRXZlbigpKSByZXR1cm4gZmFsc2U7CiAgaSA9IDE7CiAgd2hpbGUo
aSA8IGxvd3ByaW1lcy5sZW5ndGgpIHsKICAgIHZhciBtID0gbG93cHJpbWVzW2ldLCBqID0gaSsx
OwogICAgd2hpbGUoaiA8IGxvd3ByaW1lcy5sZW5ndGggJiYgbSA8IGxwbGltKSBtICo9IGxvd3By
aW1lc1tqKytdOwogICAgbSA9IHgubW9kSW50KG0pOwogICAgd2hpbGUoaSA8IGopIGlmKG0lbG93
cHJpbWVzW2krK10gPT0gMCkgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4geC5taWxsZXJSYWJp
bih0KTsKfQoKLy8gKHByb3RlY3RlZCkgdHJ1ZSBpZiBwcm9iYWJseSBwcmltZSAoSEFDIDQuMjQs
IE1pbGxlci1SYWJpbikKZnVuY3Rpb24gYm5wTWlsbGVyUmFiaW4odCkgewogIHZhciBuMSA9IHRo
aXMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpOwogIHZhciBrID0gbjEuZ2V0TG93ZXN0U2V0Qml0
KCk7CiAgaWYoayA8PSAwKSByZXR1cm4gZmFsc2U7CiAgdmFyIHIgPSBuMS5zaGlmdFJpZ2h0KGsp
OwogIHQgPSAodCsxKT4+MTsKICBpZih0ID4gbG93cHJpbWVzLmxlbmd0aCkgdCA9IGxvd3ByaW1l
cy5sZW5ndGg7CiAgdmFyIGEgPSBuYmkoKTsKICBmb3IodmFyIGkgPSAwOyBpIDwgdDsgKytpKSB7
CiAgICBhLmZyb21JbnQobG93cHJpbWVzW2ldKTsKICAgIHZhciB5ID0gYS5tb2RQb3cocix0aGlz
KTsKICAgIGlmKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwICYmIHkuY29tcGFyZVRv
KG4xKSAhPSAwKSB7CiAgICAgIHZhciBqID0gMTsKICAgICAgd2hpbGUoaisrIDwgayAmJiB5LmNv
bXBhcmVUbyhuMSkgIT0gMCkgewogICAgICAgIHkgPSB5Lm1vZFBvd0ludCgyLHRoaXMpOwogICAg
ICAgIGlmKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PSAwKSByZXR1cm4gZmFsc2U7CiAg
ICAgIH0KICAgICAgaWYoeS5jb21wYXJlVG8objEpICE9IDApIHJldHVybiBmYWxzZTsKICAgIH0K
ICB9CiAgcmV0dXJuIHRydWU7Cn0KCi8vIHByb3RlY3RlZApCaWdJbnRlZ2VyLnByb3RvdHlwZS5j
aHVua1NpemUgPSBibnBDaHVua1NpemU7CkJpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXggPSBi
bnBUb1JhZGl4OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tUmFkaXggPSBibnBGcm9tUmFkaXg7
CkJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21OdW1iZXIgPSBibnBGcm9tTnVtYmVyOwpCaWdJbnRl
Z2VyLnByb3RvdHlwZS5iaXR3aXNlVG8gPSBibnBCaXR3aXNlVG87CkJpZ0ludGVnZXIucHJvdG90
eXBlLmNoYW5nZUJpdCA9IGJucENoYW5nZUJpdDsKQmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG8g
PSBibnBBZGRUbzsKQmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5ID0gYm5wRE11bHRpcGx5
OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5kQWRkT2Zmc2V0ID0gYm5wREFkZE9mZnNldDsKQmlnSW50
ZWdlci5wcm90b3R5cGUubXVsdGlwbHlMb3dlclRvID0gYm5wTXVsdGlwbHlMb3dlclRvOwpCaWdJ
bnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG8gPSBibnBNdWx0aXBseVVwcGVyVG87CkJp
Z0ludGVnZXIucHJvdG90eXBlLm1vZEludCA9IGJucE1vZEludDsKQmlnSW50ZWdlci5wcm90b3R5
cGUubWlsbGVyUmFiaW4gPSBibnBNaWxsZXJSYWJpbjsKCi8vIHB1YmxpYwpCaWdJbnRlZ2VyLnBy
b3RvdHlwZS5jbG9uZSA9IGJuQ2xvbmU7CkJpZ0ludGVnZXIucHJvdG90eXBlLmludFZhbHVlID0g
Ym5JbnRWYWx1ZTsKQmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlID0gYm5CeXRlVmFsdWU7
CkJpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWUgPSBiblNob3J0VmFsdWU7CkJpZ0ludGVn
ZXIucHJvdG90eXBlLnNpZ251bSA9IGJuU2lnTnVtOwpCaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5
dGVBcnJheSA9IGJuVG9CeXRlQXJyYXk7CkJpZ0ludGVnZXIucHJvdG90eXBlLmVxdWFscyA9IGJu
RXF1YWxzOwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5taW4gPSBibk1pbjsKQmlnSW50ZWdlci5wcm90
b3R5cGUubWF4ID0gYm5NYXg7CkJpZ0ludGVnZXIucHJvdG90eXBlLmFuZCA9IGJuQW5kOwpCaWdJ
bnRlZ2VyLnByb3RvdHlwZS5vciA9IGJuT3I7CkJpZ0ludGVnZXIucHJvdG90eXBlLnhvciA9IGJu
WG9yOwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmROb3QgPSBibkFuZE5vdDsKQmlnSW50ZWdlci5w
cm90b3R5cGUubm90ID0gYm5Ob3Q7CkJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdCA9IGJu
U2hpZnRMZWZ0OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0ID0gYm5TaGlmdFJpZ2h0
OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5nZXRMb3dlc3RTZXRCaXQgPSBibkdldExvd2VzdFNldEJp
dDsKQmlnSW50ZWdlci5wcm90b3R5cGUuYml0Q291bnQgPSBibkJpdENvdW50OwpCaWdJbnRlZ2Vy
LnByb3RvdHlwZS50ZXN0Qml0ID0gYm5UZXN0Qml0OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5zZXRC
aXQgPSBiblNldEJpdDsKQmlnSW50ZWdlci5wcm90b3R5cGUuY2xlYXJCaXQgPSBibkNsZWFyQml0
OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5mbGlwQml0ID0gYm5GbGlwQml0OwpCaWdJbnRlZ2VyLnBy
b3RvdHlwZS5hZGQgPSBibkFkZDsKQmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3QgPSBiblN1
YnRyYWN0OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseSA9IGJuTXVsdGlwbHk7CkJpZ0lu
dGVnZXIucHJvdG90eXBlLmRpdmlkZSA9IGJuRGl2aWRlOwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5y
ZW1haW5kZXIgPSBiblJlbWFpbmRlcjsKQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlQW5kUmVt
YWluZGVyID0gYm5EaXZpZGVBbmRSZW1haW5kZXI7CkJpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBv
dyA9IGJuTW9kUG93OwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlID0gYm5Nb2RJbnZl
cnNlOwpCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3cgPSBiblBvdzsKQmlnSW50ZWdlci5wcm90b3R5
cGUuZ2NkID0gYm5HQ0Q7CkJpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZSA9IGJu
SXNQcm9iYWJsZVByaW1lOwoKLy8gQmlnSW50ZWdlciBpbnRlcmZhY2VzIG5vdCBpbXBsZW1lbnRl
ZCBpbiBqc2JuOgoKLy8gQmlnSW50ZWdlcihpbnQgc2lnbnVtLCBieXRlW10gbWFnbml0dWRlKQov
LyBkb3VibGUgZG91YmxlVmFsdWUoKQovLyBmbG9hdCBmbG9hdFZhbHVlKCkKLy8gaW50IGhhc2hD
b2RlKCkKLy8gbG9uZyBsb25nVmFsdWUoKQovLyBzdGF0aWMgQmlnSW50ZWdlciB2YWx1ZU9mKGxv
bmcgdmFsKQovLyBwcm5nNC5qcyAtIHVzZXMgQXJjZm91ciBhcyBhIFBSTkcKCmZ1bmN0aW9uIEFy
Y2ZvdXIoKSB7CiAgdGhpcy5pID0gMDsKICB0aGlzLmogPSAwOwogIHRoaXMuUyA9IG5ldyBBcnJh
eSgpOwp9CgovLyBJbml0aWFsaXplIGFyY2ZvdXIgY29udGV4dCBmcm9tIGtleSwgYW4gYXJyYXkg
b2YgaW50cywgZWFjaCBmcm9tIFswLi4yNTVdCmZ1bmN0aW9uIEFSQzRpbml0KGtleSkgewogIHZh
ciBpLCBqLCB0OwogIGZvcihpID0gMDsgaSA8IDI1NjsgKytpKQogICAgdGhpcy5TW2ldID0gaTsK
ICBqID0gMDsKICBmb3IoaSA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgaiA9IChqICsgdGhpcy5T
W2ldICsga2V5W2kgJSBrZXkubGVuZ3RoXSkgJiAyNTU7CiAgICB0ID0gdGhpcy5TW2ldOwogICAg
dGhpcy5TW2ldID0gdGhpcy5TW2pdOwogICAgdGhpcy5TW2pdID0gdDsKICB9CiAgdGhpcy5pID0g
MDsKICB0aGlzLmogPSAwOwp9CgpmdW5jdGlvbiBBUkM0bmV4dCgpIHsKICB2YXIgdDsKICB0aGlz
LmkgPSAodGhpcy5pICsgMSkgJiAyNTU7CiAgdGhpcy5qID0gKHRoaXMuaiArIHRoaXMuU1t0aGlz
LmldKSAmIDI1NTsKICB0ID0gdGhpcy5TW3RoaXMuaV07CiAgdGhpcy5TW3RoaXMuaV0gPSB0aGlz
LlNbdGhpcy5qXTsKICB0aGlzLlNbdGhpcy5qXSA9IHQ7CiAgcmV0dXJuIHRoaXMuU1sodCArIHRo
aXMuU1t0aGlzLmldKSAmIDI1NV07Cn0KCkFyY2ZvdXIucHJvdG90eXBlLmluaXQgPSBBUkM0aW5p
dDsKQXJjZm91ci5wcm90b3R5cGUubmV4dCA9IEFSQzRuZXh0OwoKLy8gUGx1ZyBpbiB5b3VyIFJO
RyBjb25zdHJ1Y3RvciBoZXJlCmZ1bmN0aW9uIHBybmdfbmV3c3RhdGUoKSB7CiAgcmV0dXJuIG5l
dyBBcmNmb3VyKCk7Cn0KCi8vIFBvb2wgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQg
Z3JlYXRlciB0aGFuIDMyLgovLyBBbiBhcnJheSBvZiBieXRlcyB0aGUgc2l6ZSBvZiB0aGUgcG9v
bCB3aWxsIGJlIHBhc3NlZCB0byBpbml0KCkKdmFyIHJuZ19wc2l6ZSA9IDI1NjsKLy8gUmFuZG9t
IG51bWJlciBnZW5lcmF0b3IgLSByZXF1aXJlcyBhIFBSTkcgYmFja2VuZCwgZS5nLiBwcm5nNC5q
cwoKLy8gRm9yIGJlc3QgcmVzdWx0cywgcHV0IGNvZGUgbGlrZQovLyA8Ym9keSBvbkNsaWNrPSdy
bmdfc2VlZF90aW1lKCk7JyBvbktleVByZXNzPSdybmdfc2VlZF90aW1lKCk7Jz4KLy8gaW4geW91
ciBtYWluIEhUTUwgZG9jdW1lbnQuCgp2YXIgcm5nX3N0YXRlOwp2YXIgcm5nX3Bvb2w7CnZhciBy
bmdfcHB0cjsKCi8vIE1peCBpbiBhIDMyLWJpdCBpbnRlZ2VyIGludG8gdGhlIHBvb2wKZnVuY3Rp
b24gcm5nX3NlZWRfaW50KHgpIHsKICBybmdfcG9vbFtybmdfcHB0cisrXSBePSB4ICYgMjU1Owog
IHJuZ19wb29sW3JuZ19wcHRyKytdIF49ICh4ID4+IDgpICYgMjU1OwogIHJuZ19wb29sW3JuZ19w
cHRyKytdIF49ICh4ID4+IDE2KSAmIDI1NTsKICBybmdfcG9vbFtybmdfcHB0cisrXSBePSAoeCA+
PiAyNCkgJiAyNTU7CiAgaWYocm5nX3BwdHIgPj0gcm5nX3BzaXplKSBybmdfcHB0ciAtPSBybmdf
cHNpemU7Cn0KCi8vIE1peCBpbiB0aGUgY3VycmVudCB0aW1lICh3L21pbGxpc2Vjb25kcykgaW50
byB0aGUgcG9vbApmdW5jdGlvbiBybmdfc2VlZF90aW1lKCkgewogIC8vIFVzZSBwcmUtY29tcHV0
ZWQgZGF0ZSB0byBhdm9pZCBtYWtpbmcgdGhlIGJlbmNobWFyayAKICAvLyByZXN1bHRzIGRlcGVu
ZGVudCBvbiB0aGUgY3VycmVudCBkYXRlLgogIHJuZ19zZWVkX2ludCgxMTIyOTI2OTg5NDg3KTsK
fQoKLy8gSW5pdGlhbGl6ZSB0aGUgcG9vbCB3aXRoIGp1bmsgaWYgbmVlZGVkLgppZihybmdfcG9v
bCA9PSBudWxsKSB7CiAgcm5nX3Bvb2wgPSBuZXcgQXJyYXkoKTsKICBybmdfcHB0ciA9IDA7CiAg
dmFyIHQ7CiAgd2hpbGUocm5nX3BwdHIgPCBybmdfcHNpemUpIHsgIC8vIGV4dHJhY3Qgc29tZSBy
YW5kb21uZXNzIGZyb20gTWF0aC5yYW5kb20oKQogICAgdCA9IE1hdGguZmxvb3IoNjU1MzYgKiBN
YXRoLnJhbmRvbSgpKTsKICAgIHJuZ19wb29sW3JuZ19wcHRyKytdID0gdCA+Pj4gODsKICAgIHJu
Z19wb29sW3JuZ19wcHRyKytdID0gdCAmIDI1NTsKICB9CiAgcm5nX3BwdHIgPSAwOwogIHJuZ19z
ZWVkX3RpbWUoKTsKICAvL3JuZ19zZWVkX2ludCh3aW5kb3cuc2NyZWVuWCk7CiAgLy9ybmdfc2Vl
ZF9pbnQod2luZG93LnNjcmVlblkpOwp9CgpmdW5jdGlvbiBybmdfZ2V0X2J5dGUoKSB7CiAgaWYo
cm5nX3N0YXRlID09IG51bGwpIHsKICAgIHJuZ19zZWVkX3RpbWUoKTsKICAgIHJuZ19zdGF0ZSA9
IHBybmdfbmV3c3RhdGUoKTsKICAgIHJuZ19zdGF0ZS5pbml0KHJuZ19wb29sKTsKICAgIGZvcihy
bmdfcHB0ciA9IDA7IHJuZ19wcHRyIDwgcm5nX3Bvb2wubGVuZ3RoOyArK3JuZ19wcHRyKQogICAg
ICBybmdfcG9vbFtybmdfcHB0cl0gPSAwOwogICAgcm5nX3BwdHIgPSAwOwogICAgLy9ybmdfcG9v
bCA9IG51bGw7CiAgfQogIC8vIFRPRE86IGFsbG93IHJlc2VlZGluZyBhZnRlciBmaXJzdCByZXF1
ZXN0CiAgcmV0dXJuIHJuZ19zdGF0ZS5uZXh0KCk7Cn0KCmZ1bmN0aW9uIHJuZ19nZXRfYnl0ZXMo
YmEpIHsKICB2YXIgaTsKICBmb3IoaSA9IDA7IGkgPCBiYS5sZW5ndGg7ICsraSkgYmFbaV0gPSBy
bmdfZ2V0X2J5dGUoKTsKfQoKZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCkge30KClNlY3VyZVJhbmRv
bS5wcm90b3R5cGUubmV4dEJ5dGVzID0gcm5nX2dldF9ieXRlczsKLy8gRGVwZW5kcyBvbiBqc2Ju
LmpzIGFuZCBybmcuanMKCi8vIGNvbnZlcnQgYSAoaGV4KSBzdHJpbmcgdG8gYSBiaWdudW0gb2Jq
ZWN0CmZ1bmN0aW9uIHBhcnNlQmlnSW50KHN0cixyKSB7CiAgcmV0dXJuIG5ldyBCaWdJbnRlZ2Vy
KHN0cixyKTsKfQoKZnVuY3Rpb24gbGluZWJyayhzLG4pIHsKICB2YXIgcmV0ID0gIiI7CiAgdmFy
IGkgPSAwOwogIHdoaWxlKGkgKyBuIDwgcy5sZW5ndGgpIHsKICAgIHJldCArPSBzLnN1YnN0cmlu
ZyhpLGkrbikgKyAiXG4iOwogICAgaSArPSBuOwogIH0KICByZXR1cm4gcmV0ICsgcy5zdWJzdHJp
bmcoaSxzLmxlbmd0aCk7Cn0KCmZ1bmN0aW9uIGJ5dGUySGV4KGIpIHsKICBpZihiIDwgMHgxMCkK
ICAgIHJldHVybiAiMCIgKyBiLnRvU3RyaW5nKDE2KTsKICBlbHNlCiAgICByZXR1cm4gYi50b1N0
cmluZygxNik7Cn0KCi8vIFBLQ1MjMSAodHlwZSAyLCByYW5kb20pIHBhZCBpbnB1dCBzdHJpbmcg
cyB0byBuIGJ5dGVzLCBhbmQgcmV0dXJuIGEgYmlnaW50CmZ1bmN0aW9uIHBrY3MxcGFkMihzLG4p
IHsKICBpZihuIDwgcy5sZW5ndGggKyAxMSkgewogICAgYWxlcnQoIk1lc3NhZ2UgdG9vIGxvbmcg
Zm9yIFJTQSIpOwogICAgcmV0dXJuIG51bGw7CiAgfQogIHZhciBiYSA9IG5ldyBBcnJheSgpOwog
IHZhciBpID0gcy5sZW5ndGggLSAxOwogIHdoaWxlKGkgPj0gMCAmJiBuID4gMCkgYmFbLS1uXSA9
IHMuY2hhckNvZGVBdChpLS0pOwogIGJhWy0tbl0gPSAwOwogIHZhciBybmcgPSBuZXcgU2VjdXJl
UmFuZG9tKCk7CiAgdmFyIHggPSBuZXcgQXJyYXkoKTsKICB3aGlsZShuID4gMikgeyAvLyByYW5k
b20gbm9uLXplcm8gcGFkCiAgICB4WzBdID0gMDsKICAgIHdoaWxlKHhbMF0gPT0gMCkgcm5nLm5l
eHRCeXRlcyh4KTsKICAgIGJhWy0tbl0gPSB4WzBdOwogIH0KICBiYVstLW5dID0gMjsKICBiYVst
LW5dID0gMDsKICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoYmEpOwp9CgovLyAiZW1wdHkiIFJTQSBr
ZXkgY29uc3RydWN0b3IKZnVuY3Rpb24gUlNBS2V5KCkgewogIHRoaXMubiA9IG51bGw7CiAgdGhp
cy5lID0gMDsKICB0aGlzLmQgPSBudWxsOwogIHRoaXMucCA9IG51bGw7CiAgdGhpcy5xID0gbnVs
bDsKICB0aGlzLmRtcDEgPSBudWxsOwogIHRoaXMuZG1xMSA9IG51bGw7CiAgdGhpcy5jb2VmZiA9
IG51bGw7Cn0KCi8vIFNldCB0aGUgcHVibGljIGtleSBmaWVsZHMgTiBhbmQgZSBmcm9tIGhleCBz
dHJpbmdzCmZ1bmN0aW9uIFJTQVNldFB1YmxpYyhOLEUpIHsKICBpZihOICE9IG51bGwgJiYgRSAh
PSBudWxsICYmIE4ubGVuZ3RoID4gMCAmJiBFLmxlbmd0aCA+IDApIHsKICAgIHRoaXMubiA9IHBh
cnNlQmlnSW50KE4sMTYpOwogICAgdGhpcy5lID0gcGFyc2VJbnQoRSwxNik7CiAgfQogIGVsc2UK
ICAgIGFsZXJ0KCJJbnZhbGlkIFJTQSBwdWJsaWMga2V5Iik7Cn0KCi8vIFBlcmZvcm0gcmF3IHB1
YmxpYyBvcGVyYXRpb24gb24gIngiOiByZXR1cm4geF5lIChtb2QgbikKZnVuY3Rpb24gUlNBRG9Q
dWJsaWMoeCkgewogIHJldHVybiB4Lm1vZFBvd0ludCh0aGlzLmUsIHRoaXMubik7Cn0KCi8vIFJl
dHVybiB0aGUgUEtDUyMxIFJTQSBlbmNyeXB0aW9uIG9mICJ0ZXh0IiBhcyBhbiBldmVuLWxlbmd0
aCBoZXggc3RyaW5nCmZ1bmN0aW9uIFJTQUVuY3J5cHQodGV4dCkgewogIHZhciBtID0gcGtjczFw
YWQyKHRleHQsKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+Myk7CiAgaWYobSA9PSBudWxsKSByZXR1
cm4gbnVsbDsKICB2YXIgYyA9IHRoaXMuZG9QdWJsaWMobSk7CiAgaWYoYyA9PSBudWxsKSByZXR1
cm4gbnVsbDsKICB2YXIgaCA9IGMudG9TdHJpbmcoMTYpOwogIGlmKChoLmxlbmd0aCAmIDEpID09
IDApIHJldHVybiBoOyBlbHNlIHJldHVybiAiMCIgKyBoOwp9CgovLyBSZXR1cm4gdGhlIFBLQ1Mj
MSBSU0EgZW5jcnlwdGlvbiBvZiAidGV4dCIgYXMgYSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcKLy9m
dW5jdGlvbiBSU0FFbmNyeXB0QjY0KHRleHQpIHsKLy8gIHZhciBoID0gdGhpcy5lbmNyeXB0KHRl
eHQpOwovLyAgaWYoaCkgcmV0dXJuIGhleDJiNjQoaCk7IGVsc2UgcmV0dXJuIG51bGw7Ci8vfQoK
Ly8gcHJvdGVjdGVkClJTQUtleS5wcm90b3R5cGUuZG9QdWJsaWMgPSBSU0FEb1B1YmxpYzsKCi8v
IHB1YmxpYwpSU0FLZXkucHJvdG90eXBlLnNldFB1YmxpYyA9IFJTQVNldFB1YmxpYzsKUlNBS2V5
LnByb3RvdHlwZS5lbmNyeXB0ID0gUlNBRW5jcnlwdDsKLy9SU0FLZXkucHJvdG90eXBlLmVuY3J5
cHRfYjY0ID0gUlNBRW5jcnlwdEI2NDsKLy8gRGVwZW5kcyBvbiByc2EuanMgYW5kIGpzYm4yLmpz
CgovLyBVbmRvIFBLQ1MjMSAodHlwZSAyLCByYW5kb20pIHBhZGRpbmcgYW5kLCBpZiB2YWxpZCwg
cmV0dXJuIHRoZSBwbGFpbnRleHQKZnVuY3Rpb24gcGtjczF1bnBhZDIoZCxuKSB7CiAgdmFyIGIg
PSBkLnRvQnl0ZUFycmF5KCk7CiAgdmFyIGkgPSAwOwogIHdoaWxlKGkgPCBiLmxlbmd0aCAmJiBi
W2ldID09IDApICsraTsKICBpZihiLmxlbmd0aC1pICE9IG4tMSB8fCBiW2ldICE9IDIpCiAgICBy
ZXR1cm4gbnVsbDsKICArK2k7CiAgd2hpbGUoYltpXSAhPSAwKQogICAgaWYoKytpID49IGIubGVu
Z3RoKSByZXR1cm4gbnVsbDsKICB2YXIgcmV0ID0gIiI7CiAgd2hpbGUoKytpIDwgYi5sZW5ndGgp
CiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShiW2ldKTsKICByZXR1cm4gcmV0Owp9Cgov
LyBTZXQgdGhlIHByaXZhdGUga2V5IGZpZWxkcyBOLCBlLCBhbmQgZCBmcm9tIGhleCBzdHJpbmdz
CmZ1bmN0aW9uIFJTQVNldFByaXZhdGUoTixFLEQpIHsKICBpZihOICE9IG51bGwgJiYgRSAhPSBu
dWxsICYmIE4ubGVuZ3RoID4gMCAmJiBFLmxlbmd0aCA+IDApIHsKICAgIHRoaXMubiA9IHBhcnNl
QmlnSW50KE4sMTYpOwogICAgdGhpcy5lID0gcGFyc2VJbnQoRSwxNik7CiAgICB0aGlzLmQgPSBw
YXJzZUJpZ0ludChELDE2KTsKICB9CiAgZWxzZQogICAgYWxlcnQoIkludmFsaWQgUlNBIHByaXZh
dGUga2V5Iik7Cn0KCi8vIFNldCB0aGUgcHJpdmF0ZSBrZXkgZmllbGRzIE4sIGUsIGQgYW5kIENS
VCBwYXJhbXMgZnJvbSBoZXggc3RyaW5ncwpmdW5jdGlvbiBSU0FTZXRQcml2YXRlRXgoTixFLEQs
UCxRLERQLERRLEMpIHsKICBpZihOICE9IG51bGwgJiYgRSAhPSBudWxsICYmIE4ubGVuZ3RoID4g
MCAmJiBFLmxlbmd0aCA+IDApIHsKICAgIHRoaXMubiA9IHBhcnNlQmlnSW50KE4sMTYpOwogICAg
dGhpcy5lID0gcGFyc2VJbnQoRSwxNik7CiAgICB0aGlzLmQgPSBwYXJzZUJpZ0ludChELDE2KTsK
ICAgIHRoaXMucCA9IHBhcnNlQmlnSW50KFAsMTYpOwogICAgdGhpcy5xID0gcGFyc2VCaWdJbnQo
USwxNik7CiAgICB0aGlzLmRtcDEgPSBwYXJzZUJpZ0ludChEUCwxNik7CiAgICB0aGlzLmRtcTEg
PSBwYXJzZUJpZ0ludChEUSwxNik7CiAgICB0aGlzLmNvZWZmID0gcGFyc2VCaWdJbnQoQywxNik7
CiAgfQogIGVsc2UKICAgIGFsZXJ0KCJJbnZhbGlkIFJTQSBwcml2YXRlIGtleSIpOwp9CgovLyBH
ZW5lcmF0ZSBhIG5ldyByYW5kb20gcHJpdmF0ZSBrZXkgQiBiaXRzIGxvbmcsIHVzaW5nIHB1Ymxp
YyBleHB0IEUKZnVuY3Rpb24gUlNBR2VuZXJhdGUoQixFKSB7CiAgdmFyIHJuZyA9IG5ldyBTZWN1
cmVSYW5kb20oKTsKICB2YXIgcXMgPSBCPj4xOwogIHRoaXMuZSA9IHBhcnNlSW50KEUsMTYpOwog
IHZhciBlZSA9IG5ldyBCaWdJbnRlZ2VyKEUsMTYpOwogIGZvcig7OykgewogICAgZm9yKDs7KSB7
CiAgICAgIHRoaXMucCA9IG5ldyBCaWdJbnRlZ2VyKEItcXMsMSxybmcpOwogICAgICBpZih0aGlz
LnAuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpLmdjZChlZSkuY29tcGFyZVRvKEJpZ0ludGVnZXIu
T05FKSA9PSAwICYmIHRoaXMucC5pc1Byb2JhYmxlUHJpbWUoMTApKSBicmVhazsKICAgIH0KICAg
IGZvcig7OykgewogICAgICB0aGlzLnEgPSBuZXcgQmlnSW50ZWdlcihxcywxLHJuZyk7CiAgICAg
IGlmKHRoaXMucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKGVlKS5jb21wYXJlVG8oQmln
SW50ZWdlci5PTkUpID09IDAgJiYgdGhpcy5xLmlzUHJvYmFibGVQcmltZSgxMCkpIGJyZWFrOwog
ICAgfQogICAgaWYodGhpcy5wLmNvbXBhcmVUbyh0aGlzLnEpIDw9IDApIHsKICAgICAgdmFyIHQg
PSB0aGlzLnA7CiAgICAgIHRoaXMucCA9IHRoaXMucTsKICAgICAgdGhpcy5xID0gdDsKICAgIH0K
ICAgIHZhciBwMSA9IHRoaXMucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7CiAgICB2YXIgcTEg
PSB0aGlzLnEuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpOwogICAgdmFyIHBoaSA9IHAxLm11bHRp
cGx5KHExKTsKICAgIGlmKHBoaS5nY2QoZWUpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0g
MCkgewogICAgICB0aGlzLm4gPSB0aGlzLnAubXVsdGlwbHkodGhpcy5xKTsKICAgICAgdGhpcy5k
ID0gZWUubW9kSW52ZXJzZShwaGkpOwogICAgICB0aGlzLmRtcDEgPSB0aGlzLmQubW9kKHAxKTsK
ICAgICAgdGhpcy5kbXExID0gdGhpcy5kLm1vZChxMSk7CiAgICAgIHRoaXMuY29lZmYgPSB0aGlz
LnEubW9kSW52ZXJzZSh0aGlzLnApOwogICAgICBicmVhazsKICAgIH0KICB9Cn0KCi8vIFBlcmZv
cm0gcmF3IHByaXZhdGUgb3BlcmF0aW9uIG9uICJ4IjogcmV0dXJuIHheZCAobW9kIG4pCmZ1bmN0
aW9uIFJTQURvUHJpdmF0ZSh4KSB7CiAgaWYodGhpcy5wID09IG51bGwgfHwgdGhpcy5xID09IG51
bGwpCiAgICByZXR1cm4geC5tb2RQb3codGhpcy5kLCB0aGlzLm4pOwoKICAvLyBUT0RPOiByZS1j
YWxjdWxhdGUgYW55IG1pc3NpbmcgQ1JUIHBhcmFtcwogIHZhciB4cCA9IHgubW9kKHRoaXMucCku
bW9kUG93KHRoaXMuZG1wMSwgdGhpcy5wKTsKICB2YXIgeHEgPSB4Lm1vZCh0aGlzLnEpLm1vZFBv
dyh0aGlzLmRtcTEsIHRoaXMucSk7CgogIHdoaWxlKHhwLmNvbXBhcmVUbyh4cSkgPCAwKQogICAg
eHAgPSB4cC5hZGQodGhpcy5wKTsKICByZXR1cm4geHAuc3VidHJhY3QoeHEpLm11bHRpcGx5KHRo
aXMuY29lZmYpLm1vZCh0aGlzLnApLm11bHRpcGx5KHRoaXMucSkuYWRkKHhxKTsKfQoKLy8gUmV0
dXJuIHRoZSBQS0NTIzEgUlNBIGRlY3J5cHRpb24gb2YgImN0ZXh0Ii4KLy8gImN0ZXh0IiBpcyBh
biBldmVuLWxlbmd0aCBoZXggc3RyaW5nIGFuZCB0aGUgb3V0cHV0IGlzIGEgcGxhaW4gc3RyaW5n
LgpmdW5jdGlvbiBSU0FEZWNyeXB0KGN0ZXh0KSB7CiAgdmFyIGMgPSBwYXJzZUJpZ0ludChjdGV4
dCwgMTYpOwogIHZhciBtID0gdGhpcy5kb1ByaXZhdGUoYyk7CiAgaWYobSA9PSBudWxsKSByZXR1
cm4gbnVsbDsKICByZXR1cm4gcGtjczF1bnBhZDIobSwgKHRoaXMubi5iaXRMZW5ndGgoKSs3KT4+
Myk7Cn0KCi8vIFJldHVybiB0aGUgUEtDUyMxIFJTQSBkZWNyeXB0aW9uIG9mICJjdGV4dCIuCi8v
ICJjdGV4dCIgaXMgYSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgYW5kIHRoZSBvdXRwdXQgaXMgYSBw
bGFpbiBzdHJpbmcuCi8vZnVuY3Rpb24gUlNBQjY0RGVjcnlwdChjdGV4dCkgewovLyAgdmFyIGgg
PSBiNjR0b2hleChjdGV4dCk7Ci8vICBpZihoKSByZXR1cm4gdGhpcy5kZWNyeXB0KGgpOyBlbHNl
IHJldHVybiBudWxsOwovL30KCi8vIHByb3RlY3RlZApSU0FLZXkucHJvdG90eXBlLmRvUHJpdmF0
ZSA9IFJTQURvUHJpdmF0ZTsKCi8vIHB1YmxpYwpSU0FLZXkucHJvdG90eXBlLnNldFByaXZhdGUg
PSBSU0FTZXRQcml2YXRlOwpSU0FLZXkucHJvdG90eXBlLnNldFByaXZhdGVFeCA9IFJTQVNldFBy
aXZhdGVFeDsKUlNBS2V5LnByb3RvdHlwZS5nZW5lcmF0ZSA9IFJTQUdlbmVyYXRlOwpSU0FLZXku
cHJvdG90eXBlLmRlY3J5cHQgPSBSU0FEZWNyeXB0OwovL1JTQUtleS5wcm90b3R5cGUuYjY0X2Rl
Y3J5cHQgPSBSU0FCNjREZWNyeXB0OwoKCm5WYWx1ZT0iYTUyNjE5Mzk5NzU5NDhiYjdhNThkZmZl
NWZmNTRlNjVmMDQ5OGY5MTc1ZjVhMDkyODg4MTBiODk3NTg3MWU5OWFmM2I1ZGQ5NDA1N2IwZmMw
NzUzNWY1Zjk3NDQ0NTA0ZmEzNTE2OWQ0NjFkMGQzMGNmMDE5MmUzMDc3MjdjMDY1MTY4Yzc4ODc3
MWM1NjFhOTQwMGZiNDkxNzVlOWU2YWE0ZTIzZmUxMWFmNjllOTQxMmRkMjNiMGNiNjY4NGM0YzI0
MjliY2UxMzllODQ4YWIyNmQwODI5MDczMzUxZjRhY2QzNjA3NGVhZmQwMzZhNWViODMzNTlkMmE2
OThkMyI7CmVWYWx1ZT0iMTAwMDEiOwpkVmFsdWU9IjhlOTkxMmY2ZDM2NDU4OTRlOGQzOGNiNThj
MGRiODFmZjUxNmNmNGM3ZTVhMTRjN2YxZWRkYjE0NTlkMmNkZWQ0ZDhkMjkzZmM5N2FlZTZhZWZi
ODYxODU5YzhiNmEzZDFkZmU3MTA0NjNlMWY5ZGRjNzIwNDhjMDk3NTE5NzFjNGE1ODBhYTUxZWI1
MjMzNTdhM2NjNDhkMzFjZmFkMWQ0YTE2NTA2NmVkOTJkNDc0OGZiNjU3MTIxMWRhNWNiMTRiYzEx
YjZlMmRmN2MxYTU1OWU2ZDVhYzFjZDVjOTQ3MDNhMjI4OTE0NjRmYmEyM2QwZDk2NTA4NjI3N2Ex
NjEiOwpwVmFsdWU9ImQwOTBjZTU4YTkyYzc1MjMzYTY0ODZjYjBhOTIwOWJmMzU4M2I2NGY1NDBj
NzZmNTI5NGJiOTdkMjg1ZWVkMzNhZWMyMjBiZGUxNGIyNDE3OTUxMTc4YWMxNTJjZWFiNmRhNzA5
MDkwNWI0NzgxOTU0OThiMzUyMDQ4ZjE1ZTdkIjsKcVZhbHVlPSJjYWI1NzVkYzY1MmJiNjZkZjE1
YTAzNTk2MDlkNTFkMWRiMTg0NzUwYzAwYzY2OThiOTBlZjM0NjVjOTk2NTUxMDNlZGJmMGQ1NGM1
NmFlYzBjZTNjNGQyMjU5MjMzODA5MmExMjZhMGNjNDlmNjVhNGEzMGQyMjJiNDExZTU4ZiI7CmRt
cDFWYWx1ZT0iMWEyNGJjYThlMjczZGYyZjBlNDdjMTk5YmJmNjc4NjA0ZTdkZjcyMTU0ODBjNzdj
OGRiMzlmNDliMDAwY2UyY2Y3NTAwMDM4YWNmZmY1NDMzYjdkNTgyYTAxZjE4MjZlNmY0ZDQyZTFj
NTdmNWUxZmVmN2IxMmFhYmM1OWZkMjUiOwpkbXExVmFsdWU9IjNkMDY5ODJlZmJiZTQ3MzM5ZTFm
NmQzNmIxMjE2YjhhNzQxZDQxMGIwYzY2MmY1NGY3MTE4YjI3YjlhNGVjOWQ5MTQzMzdlYjM5ODQx
ZDg2NjZmMzAzNDQwOGNmOTRmNWI2MmYxMWM0MDJmYzk5NGZlMTVhMDU0OTMxNTBkOWZkIjsKY29l
ZmZWYWx1ZT0iM2EzZTczMWFjZDg5NjBiN2ZmOWViODFhN2ZmOTNiZDFjZmE3NGNiZDU2OTg3ZGI1
OGI0NTk0ZmIwOWMwOTA4NGRiMTczNGM4MTQzZjk4YjYwMmI5ODFhYWE5MjQzY2EyOGRlYjY5YjVi
MjgwZWU4ZGNlZTBmZDI2MjVlNTMyNTAiOwoKc2V0dXBFbmdpbmUoYW0zLCAyOCk7Cgp2YXIgVEVY
VCA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBleHRyZW1lbHkgbGF6eSBm
cm9nISAiICsKICAgICJOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRv
IHRoZSBwYXJ0eS4iOwp2YXIgZW5jcnlwdGVkOwoKZnVuY3Rpb24gZW5jcnlwdCgpIHsKICB2YXIg
UlNBID0gbmV3IFJTQUtleSgpOwogIFJTQS5zZXRQdWJsaWMoblZhbHVlLCBlVmFsdWUpOwogIFJT
QS5zZXRQcml2YXRlRXgoblZhbHVlLCBlVmFsdWUsIGRWYWx1ZSwgcFZhbHVlLCBxVmFsdWUsIGRt
cDFWYWx1ZSwgZG1xMVZhbHVlLCBjb2VmZlZhbHVlKTsKICBlbmNyeXB0ZWQgPSBSU0EuZW5jcnlw
dChURVhUKTsKfQoKZnVuY3Rpb24gZGVjcnlwdCgpIHsKICB2YXIgUlNBID0gbmV3IFJTQUtleSgp
OwogIFJTQS5zZXRQdWJsaWMoblZhbHVlLCBlVmFsdWUpOwogIFJTQS5zZXRQcml2YXRlRXgoblZh
bHVlLCBlVmFsdWUsIGRWYWx1ZSwgcFZhbHVlLCBxVmFsdWUsIGRtcDFWYWx1ZSwgZG1xMVZhbHVl
LCBjb2VmZlZhbHVlKTsKICB2YXIgZGVjcnlwdGVkID0gUlNBLmRlY3J5cHQoZW5jcnlwdGVkKTsK
ICBpZiAoZGVjcnlwdGVkICE9IFRFWFQpIHsKICAgIHRocm93IG5ldyBFcnJvcigiQ3J5cHRvIG9w
ZXJhdGlvbiBmYWlsZWQiKTsKICB9Cn0KCmZ1bmN0aW9uIGpzY1NldFVwKCkgeyB9CmZ1bmN0aW9u
IGpzY1RlYXJEb3duKCkgeyB9CgpmdW5jdGlvbiBqc2NSdW4oKSB7CiAgICBlbmNyeXB0KCk7Cn0K
CmpzY1NldFVwKCk7CmZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDsgKytpKQogICAganNjUnVuKCk7
CnByaW50KCJEb25lIHdhcm1pbmcgdXAuIik7CnZhciBfX2JlZm9yZSA9IHByZWNpc2VUaW1lKCk7
CmZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDsgKytpKQogICAganNjUnVuKCk7CnZhciBfX2FmdGVy
ID0gcHJlY2lzZVRpbWUoKTsKcHJpbnQoIlRoYXQgdG9vayAiICsgKF9fYWZ0ZXIgLSBfX2JlZm9y
ZSkgKiAxMDAwICsgIiBtcy4iKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>219241</attachid>
            <date>2013-12-13 22:43:47 -0800</date>
            <delta_ts>2013-12-13 22:46:55 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>125730.patch</filename>
            <type>text/plain</type>
            <size>4329</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTYwNTg3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE5IEBA
CisyMDEzLTEyLTEzICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgorCisgICAg
ICAgIGNTdGFjazogQ3J5cHRvIGNyYXNoZXMgaW4gR0MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyNTczMAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIE5lZWQgdG8gZGlzYWJsZSB2aXNpdGluZyB0aGUgSlNT
dGFjayB3aGVuIHdlIGFyZSBvbiB0aGUgQyBzdGFjay4KKyAgICAgICAgTWFkZSB2aXNpdGluZyB0
aGUgSlNTdGFjayBjb25kaXRpb25hbCBvbiBVU0UoU0VQQVJBVEVfQ19BTkRfSlNfU1RBQ0spCisg
ICAgICAgIGFuZCB0aGVuIHR1cm5lZCBvZmYgV1RGX1VTRV9TRVBBUkFURV9DX0FORF9KU19TVEFD
SyBpbiBwbGF0Zm9ybS5oLgorCisgICAgICAgICogaGVhcC9IZWFwLmNwcDoKKyAgICAgICAgKEpT
Qzo6SGVhcDo6bWFya1Jvb3RzKToKKyAgICAgICAgKiBpbnRlcnByZXRlci9KU1N0YWNrLmNwcDoK
KyAgICAgICAgKEpTQzo6SlNTdGFjazo6Z2F0aGVyQ29uc2VydmF0aXZlUm9vdHMpOgorCiAyMDEz
LTEyLTEzICBNaWNoYWVsIFNhYm9mZiAgPG1zYWJvZmZAYXBwbGUuY29tPgogCiAgICAgICAgIGNT
dGFjazogQ3J5cHRvIGRvZXNuJ3Qgd29yayBhdCBhbGwgdW5sZXNzIExMSW50IGlzIGRpc2FibGVk
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwLmNwcAkocmV2aXNpb24gMTYwNTg1KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQ1OCw2ICs0NTgsNyBAQCB2b2lkIEhlYXA6Om1hcmtSb290cygpCiAgICAgICAgIG1fbWFjaGlu
ZVRocmVhZHMuZ2F0aGVyQ29uc2VydmF0aXZlUm9vdHMobWFjaGluZVRocmVhZFJvb3RzLCAmZHVt
bXkpOwogICAgIH0KIAorI2lmIFVTRShTRVBBUkFURV9DX0FORF9KU19TVEFDSykKICAgICBDb25z
ZXJ2YXRpdmVSb290cyBzdGFja1Jvb3RzKCZtX29iamVjdFNwYWNlLmJsb2NrcygpLCAmbV9zdG9y
YWdlU3BhY2UpOwogICAgIG1fY29kZUJsb2Nrcy5jbGVhck1hcmtzKCk7CiAgICAgewpAQCAtNDY1
LDYgKzQ2Niw3IEBAIHZvaWQgSGVhcDo6bWFya1Jvb3RzKCkKICAgICAgICAgc3RhY2soKS5nYXRo
ZXJDb25zZXJ2YXRpdmVSb290cyhzdGFja1Jvb3RzLCBtX2ppdFN0dWJSb3V0aW5lcywgbV9jb2Rl
QmxvY2tzKTsKICAgICAgICAgc3RhY2soKS5zYW5pdGl6ZVN0YWNrKCk7CiAgICAgfQorI2VuZGlm
CiAKICNpZiBFTkFCTEUoREZHX0pJVCkKICAgICBDb25zZXJ2YXRpdmVSb290cyBzY3JhdGNoQnVm
ZmVyUm9vdHMoJm1fb2JqZWN0U3BhY2UuYmxvY2tzKCksICZtX3N0b3JhZ2VTcGFjZSk7CkBAIC00
OTYsMTIgKzQ5OCwxNCBAQCB2b2lkIEhlYXA6Om1hcmtSb290cygpCiAgICAgICAgICAgICB2aXNp
dG9yLmFwcGVuZChtYWNoaW5lVGhyZWFkUm9vdHMpOwogICAgICAgICAgICAgdmlzaXRvci5kb25h
dGVBbmREcmFpbigpOwogICAgICAgICB9CisjaWYgVVNFKFNFUEFSQVRFX0NfQU5EX0pTX1NUQUNL
KQogICAgICAgICB7CiAgICAgICAgICAgICBHQ1BIQVNFKFZpc2l0U3RhY2tSb290cyk7CiAgICAg
ICAgICAgICBNQVJLX0xPR19ST09UKHZpc2l0b3IsICJTdGFjayIpOwogICAgICAgICAgICAgdmlz
aXRvci5hcHBlbmQoc3RhY2tSb290cyk7CiAgICAgICAgICAgICB2aXNpdG9yLmRvbmF0ZUFuZERy
YWluKCk7CiAgICAgICAgIH0KKyNlbmRpZgogI2lmIEVOQUJMRShERkdfSklUKQogICAgICAgICB7
CiAgICAgICAgICAgICBHQ1BIQVNFKFZpc2l0U2NyYXRjaEJ1ZmZlclJvb3RzKTsKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9KU1N0YWNrLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvSlNTdGFjay5jcHAJKHJldmlzaW9u
IDE2MDU4NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci9KU1N0YWNrLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtOTUsMTIgKzk1LDIyIEBAIGJvb2wgSlNTdGFjazo6Z3Jvd1Ns
b3dDYXNlKFJlZ2lzdGVyKiBuZXcKIAogdm9pZCBKU1N0YWNrOjpnYXRoZXJDb25zZXJ2YXRpdmVS
b290cyhDb25zZXJ2YXRpdmVSb290cyYgY29uc2VydmF0aXZlUm9vdHMpCiB7CisjaWYgVVNFKFNF
UEFSQVRFX0NfQU5EX0pTX1NUQUNLKQogICAgIGNvbnNlcnZhdGl2ZVJvb3RzLmFkZChnZXRCYXNl
T2ZTdGFjaygpLCBnZXRUb3BPZlN0YWNrKCkpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oY29u
c2VydmF0aXZlUm9vdHMpOworI2VuZGlmCiB9CiAKIHZvaWQgSlNTdGFjazo6Z2F0aGVyQ29uc2Vy
dmF0aXZlUm9vdHMoQ29uc2VydmF0aXZlUm9vdHMmIGNvbnNlcnZhdGl2ZVJvb3RzLCBKSVRTdHVi
Um91dGluZVNldCYgaml0U3R1YlJvdXRpbmVzLCBDb2RlQmxvY2tTZXQmIGNvZGVCbG9ja3MpCiB7
CisjaWYgVVNFKFNFUEFSQVRFX0NfQU5EX0pTX1NUQUNLKQogICAgIGNvbnNlcnZhdGl2ZVJvb3Rz
LmFkZChnZXRCYXNlT2ZTdGFjaygpLCBnZXRUb3BPZlN0YWNrKCksIGppdFN0dWJSb3V0aW5lcywg
Y29kZUJsb2Nrcyk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShjb25zZXJ2YXRpdmVSb290cyk7
CisgICAgVU5VU0VEX1BBUkFNKGppdFN0dWJSb3V0aW5lcyk7CisgICAgVU5VU0VEX1BBUkFNKGNv
ZGVCbG9ja3MpOworI2VuZGlmCiB9CiAKIHZvaWQgSlNTdGFjazo6c2FuaXRpemVTdGFjaygpCklu
ZGV4OiBTb3VyY2UvV1RGL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL0NoYW5n
ZUxvZwkocmV2aXNpb24gMTYwNTg3KQorKysgU291cmNlL1dURi9DaGFuZ2VMb2cJKHdvcmtpbmcg
Y29weSkKQEAgLTEsMyArMSwxNiBAQAorMjAxMy0xMi0xMyAgTWljaGFlbCBTYWJvZmYgIDxtc2Fi
b2ZmQGFwcGxlLmNvbT4KKworICAgICAgICBjU3RhY2s6IENyeXB0byBjcmFzaGVzIGluIEdDCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjU3MzAKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBOZWVkIHRvIGRp
c2FibGUgdmlzaXRpbmcgdGhlIEpTU3RhY2sgd2hlbiB3ZSBhcmUgb24gdGhlIEMgc3RhY2suCisg
ICAgICAgIE1hZGUgdmlzaXRpbmcgdGhlIEpTU3RhY2sgY29uZGl0aW9uYWwgb24gVVNFKFNFUEFS
QVRFX0NfQU5EX0pTX1NUQUNLKQorICAgICAgICBhbmQgdGhlbiB0dXJuZWQgb2ZmIFdURl9VU0Vf
U0VQQVJBVEVfQ19BTkRfSlNfU1RBQ0sgaW4gcGxhdGZvcm0uaC4KKworICAgICAgICAqIHd0Zi9Q
bGF0Zm9ybS5oOgorCiAyMDEzLTEyLTA2ICBMYXN6bG8gVmlkYWNzICA8bGFjQGluZi51LXN6ZWdl
ZC5odT4KIAogICAgICAgICBEZWZpbmUgU0hBMSBoYXNoIHNpemUgaW4gU0hBMS5oIGFuZCB1c2Ug
aXQgYXQgdmFyaW91cyBwbGFjZXMuCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9QbGF0Zm9ybS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1BsYXRmb3JtLmgJKHJldmlzaW9uIDE2MDU4NSkK
KysrIFNvdXJjZS9XVEYvd3RmL1BsYXRmb3JtLmgJKHdvcmtpbmcgY29weSkKQEAgLTg2NSw3ICs4
NjUsNyBAQAogICAgQyBzdGFjayBmb3IgSlMgZnJhbWVzLCB3ZSdsbCBuZWVkIHRvIG1ha2UgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25hbCBvbiBFTkFCTEUoTExJTlRfQ0xPT1ApCiAgICBvbmx5Lgog
Ki8KLSNpZiBFTkFCTEUoTExJTlRfQ0xPT1ApIHx8IDEKKyNpZiBFTkFCTEUoTExJTlRfQ0xPT1Ap
CiAjZGVmaW5lIFdURl9VU0VfU0VQQVJBVEVfQ19BTkRfSlNfU1RBQ0sgMQogI2VuZGlmCiAK
</data>
<flag name="review"
          id="242835"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>