<?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>15835</bug_id>
          
          <creation_ts>2007-11-04 15:49:14 -0800</creation_ts>
          <short_desc>Switch List to Vector (.5% speedup)</short_desc>
          <delta_ts>2007-11-05 13:47:32 -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>523.x (Safari 3)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>60260</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-04 15:49:14 -0800</bug_when>
    <thetext>Patch coming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60261</commentid>
    <comment_count>1</comment_count>
      <attachid>17039</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-04 15:49:30 -0800</bug_when>
    <thetext>Created attachment 17039
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60265</commentid>
    <comment_count>2</comment_count>
      <attachid>17039</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-11-04 16:44:33 -0800</bug_when>
    <thetext>Comment on attachment 17039
Patch

The best idiom for iterating a vector is to use indices and not bother with iterator objects at all. I believe it&apos;s faster than the iterator version, and certainly more readable!

But for speed, you&apos;d want a version that doesn&apos;t do a range check each time.

r=me (as is -- those comments above are &quot;food for thought&quot;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60331</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-11-05 13:42:22 -0800</bug_when>
    <thetext>Nice!  Sad it was so little...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60333</commentid>
    <comment_count>4</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-05 13:47:05 -0800</bug_when>
    <thetext>Committed revision 27448.

Iteration by index would certainly be more readable. I think we could do that if we made &quot;return undefined if I&apos;m past the end&quot; a special-case function instead of the default behavior of operator[]. (Hopefully we could do that without introducing subtle regressions!)

Still, I worry that iteration by index might be slightly slower, based on this check-in by Maciej: http://trac.webkit.org/projects/webkit/changeset/27339. It seems like using a pointer directly into the VectorBuffer can be faster than using an integer offset into the Vector, which translates into a pointer into the VectorBuffer. (Maybe the compiler can optimize that translation out, though.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60334</commentid>
    <comment_count>5</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-05 13:47:32 -0800</bug_when>
    <thetext>Changeset 27448.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17039</attachid>
            <date>2007-11-04 15:49:30 -0800</date>
            <delta_ts>2007-11-04 16:44:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>patch-list.txt</filename>
            <type>text/plain</type>
            <size>30081</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3MzczKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDEgQEAKKzIwMDctMTEtMDQgIEdlb2ZmcmV5
IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKyAgICAgICAgCisgICAgICAgIFN3aXRjaGVkIExpc3QgaW1wbGVtZW50YXRpb24g
ZnJvbSBhIGN1c3RvbSBoZWFwIGFsbG9jYXRvciB0byBhbiBpbmxpbmUKKyAgICAgICAgVmVjdG9y
LCBmb3IgYSBkaXNhcHBvaW50aW5nIC41JSBTdW5TcGlkZXIgc3BlZWR1cC4KKyAgICAgICAgCisg
ICAgICAgIEFsc28gcmVuYW1lZCBMaXN0OjpzbGljZSB0byBMaXN0OjpnZXRTbGljZSBiZWNhdXNl
ICJnZXQiIGlzIHRoZSAKKyAgICAgICAgY29udmVudGlvbmFsIHByZWZpeCBmb3IgZnVuY3Rpb25z
IHJldHVybmluZyBhIHZhbHVlIHRocm91Z2ggYW4gb3V0IAorICAgICAgICBwYXJhbWV0ZXIuCisK
KyAgICAgICAgKiBranMvYXJyYXlfb2JqZWN0LmNwcDoKKyAgICAgICAgKEtKUzo6QXJyYXlQcm90
b0Z1bmM6OmNhbGxBc0Z1bmN0aW9uKTogUmVtb3ZlZCBzb21lIHJlZHVuZGFudCBmdW5jdGlvbgor
ICAgICAgICBjYWxscyBhbmQgbWVtb3J5IGFjY2Vzc2VzLgorCisgICAgICAgICoga2pzL2Jvb2xf
b2JqZWN0LmNwcDoKKyAgICAgICAgKEJvb2xlYW5PYmplY3RJbXA6OmNvbnN0cnVjdCk6IFJlbW92
ZWQgcXVlc3Rpb25hYmxlIHVzZSBvZiBpdGVyYXRvci4KKworICAgICAgICAqIGtqcy9saXN0LmNw
cDoKKyAgICAgICAgKiBranMvbGlzdC5oOiBOZXcgTGlzdCBjbGFzcywgaW1wbGVtZW50ZWQgaW4g
dGVybXMgb2YgVmVjdG9yLiBUd28gCisgICAgICAgIGludGVyZXN0aW5nIGRpZmZlcmVuY2VzOgor
ICAgICAgICAgICAgMS4gVGhlIGlubGluZSBjYXBhY2l0eSBpcyA4LCBub3QgNS4gTWFueSBvZiB0
aGUgTGlzdHMgY29uc3RydWN0ZWQgCisgICAgICAgICAgICBkdXJpbmcgYSBTdW5TcGlkZXIgcnVu
IGFyZSBsYXJnZXIgdGhhbiA1OyBhbG1vc3Qgbm9uZSBhcmUgbGFyZ2VyCisgICAgICAgICAgICB0
aGFuIDguCisKKyAgICAgICAgICAgIDIuIFRoZSBncm93dGggZmFjdG9yIGlzIDQsIG5vdCAyLiBT
aW5jZSB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQgTGlzdHMKKyAgICAgICAgICAgIGFyZW4ndCBsb25n
LWxpdmVkLCB3ZSBjYW4gZ3JvdyB0aGVtIG1vcmUgYWdncmVzc2l2ZWx5LCB0byBhdm9pZAorICAg
ICAgICAgICAgZXhjZXNzaXZlIGNvcHlpbmcuCisKKyAgICAgICAgKiBranMvcmVnZXhwX29iamVj
dC5jcHA6CisgICAgICAgIChSZWdFeHBPYmplY3RJbXA6OmNvbnN0cnVjdCk6IFJlbW92ZWQgcmVk
dW5kYW50IGZ1bmN0aW9uIGNhbGxzLgorCisgICAgICAgICoga2pzL3N0cmluZ19vYmplY3QuY3Bw
OgorICAgICAgICAoS0pTOjpTdHJpbmdPYmplY3RJbXA6OmNvbnN0cnVjdCk6IFJlbW92ZWQgcXVl
c3Rpb25hYmxlIHVzZSBvZiBpdGVyYXRvci4KKworICAgICAgICAqIHd0Zi9WZWN0b3IuaDoKKyAg
ICAgICAgKFdURjo6Ojp1bmNoZWNrZWRBcHBlbmQpOiBBZGRlZCBhIGZhc3QsIHVuY2hlY2tlZCB2
ZXJzaW9uIG9mIGFwcGVuZC4KKwogMjAwNy0xMS0wMSAgR2VvZmZyZXkgR2FyZW4gIDxnZ2FyZW5A
YXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE1hY2llaiBTdGFjaG93aWFrLgpJbmRl
eDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZXhwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAkocmV2aXNpb24gMjczNzMpCisrKyBKYXZhU2Ny
aXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5leHAJKHdvcmtpbmcgY29weSkKQEAgLTEyMyw2ICsxMjMs
NyBAQCBfX1pOM0tKUzExSW50ZXJwcmV0ZXI2c19ob29rRQogX19aTjNLSlMxMUludGVycHJldGVy
OGV2YWx1YXRlRVJLTlNfN1VTdHJpbmdFaVBLTlNfNVVDaGFyRWlQTlNfN0pTVmFsdWVFCiBfX1pO
M0tKUzExSW50ZXJwcmV0ZXI4ZXZhbHVhdGVFUktOU183VVN0cmluZ0VpUzNfUE5TXzdKU1ZhbHVl
RQogX19aTjNLSlMxMUludGVycHJldGVyQzFFUE5TXzE0SlNHbG9iYWxPYmplY3RFCitfX1pOM0tK
UzExSW50ZXJwcmV0ZXJDMUVQTlNfMTRKU0dsb2JhbE9iamVjdEUKIF9fWk4zS0pTMTFJbnRlcnBy
ZXRlckMxRXYKIF9fWk4zS0pTMTFJbnRlcnByZXRlckMyRVBOU18xNEpTR2xvYmFsT2JqZWN0RQog
X19aTjNLSlMxMUludGVycHJldGVyRDFFdgpAQCAtMTU3LDkgKzE1OCw4IEBAIF9fWk4zS0pTMTZS
dW50aW1lT2JqZWN0SW1wQzFFUE5TXzhCaW5kaW4KIF9fWk4zS0pTMTdQcm9wZXJ0eU5hbWVBcnJh
eTNhZGRFUktOU18xMElkZW50aWZpZXJFCiBfX1pOM0tKUzE5SW50ZXJuYWxGdW5jdGlvbkltcDRp
bmZvRQogX19aTjNLSlMxOUludGVybmFsRnVuY3Rpb25JbXBDMkVQTlNfMTdGdW5jdGlvblByb3Rv
dHlwZUVSS05TXzEwSWRlbnRpZmllckUKLV9fWk4zS0pTNExpc3Q2YXBwZW5kRVBOU183SlNWYWx1
ZUUKLV9fWk4zS0pTNExpc3Q3cmVsZWFzZUV2Ci1fX1pOM0tKUzRMaXN0QzFFdgorX19aTjNLSlM0
TGlzdDE1ZXhwYW5kQW5kQXBwZW5kRVBOU183SlNWYWx1ZUUKK19fWk4zS0pTNExpc3Q3bWFya1Nl
dEV2CiBfX1pOM0tKUzZKU0NlbGw5Z2V0T2JqZWN0RXYKIF9fWk4zS0pTNkpTQ2VsbG53RW0KIF9f
Wk4zS0pTNkpTTG9jazEyRHJvcEFsbExvY2tzQzFFdgpAQCAtMjQxLDEwICsyNDEsMTEgQEAgX19a
TkszS0pTMTJEYXRlSW5zdGFuY2U3Z2V0VGltZUVSZFJpCiBfX1pOSzNLSlMxM0FycmF5SW5zdGFu
Y2U3Z2V0SXRlbUVqCiBfX1pOSzNLSlMxOUludGVybmFsRnVuY3Rpb25JbXAxNGltcGxlbWVudHND
YWxsRXYKIF9fWk5LM0tKUzE5SW50ZXJuYWxGdW5jdGlvbkltcDIxaW1wbGVtZW50c0hhc0luc3Rh
bmNlRXYKLV9fWk5LM0tKUzRMaXN0MmF0RWkKLV9fWk5LM0tKUzRMaXN0NXNsaWNlRWlSUzBfCitf
X1pOSzNLSlM0TGlzdDhnZXRTbGljZUVpUlMwXworX19aTkszS0pTNkpTQ2VsbDE3Z2V0VHJ1bmNh
dGVkSW50MzJFUmkKIF9fWk5LM0tKUzZKU0NlbGwxN2dldFRydW5jYXRlZEludDMyRVJpCiBfX1pO
SzNLSlM2SlNDZWxsMThnZXRUcnVuY2F0ZWRVSW50MzJFUmoKK19fWk5LM0tKUzZKU0NlbGwxOGdl
dFRydW5jYXRlZFVJbnQzMkVSagogX19aTkszS0pTNkpTQ2VsbDlnZXROdW1iZXJFUmQKIF9fWk5L
M0tKUzZKU0NlbGw5Z2V0TnVtYmVyRXYKIF9fWk5LM0tKUzZKU0NlbGw5Z2V0U3RyaW5nRVJOU183
VVN0cmluZ0UKQEAgLTI2Niw2ICsyNjcsNyBAQCBfX1pOSzNLSlM4SlNPYmplY3QxMWhhc1Byb3Bl
cnR5RVBOU185RXhlCiBfX1pOSzNLSlM4SlNPYmplY3QxMmRlZmF1bHRWYWx1ZUVQTlNfOUV4ZWNT
dGF0ZUVOU182SlNUeXBlRQogX19aTkszS0pTOEpTT2JqZWN0MTRpbXBsZW1lbnRzQ2FsbEV2CiBf
X1pOSzNLSlM4SlNPYmplY3QxOGdldFByaW1pdGl2ZU51bWJlckVQTlNfOUV4ZWNTdGF0ZUVSZAor
X19aTkszS0pTOEpTT2JqZWN0MThnZXRQcmltaXRpdmVOdW1iZXJFUE5TXzlFeGVjU3RhdGVFUmQK
IF9fWk5LM0tKUzhKU09iamVjdDE5aW1wbGVtZW50c0NvbnN0cnVjdEV2CiBfX1pOSzNLSlM4SlNP
YmplY3QyMWltcGxlbWVudHNIYXNJbnN0YW5jZUV2CiBfX1pOSzNLSlM4SlNPYmplY3QzZ2V0RVBO
U185RXhlY1N0YXRlRVJLTlNfMTBJZGVudGlmaWVyRQpJbmRleDogSmF2YVNjcmlwdENvcmUva2pz
L2FycmF5X2luc3RhbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvYXJy
YXlfaW5zdGFuY2UuY3BwCShyZXZpc2lvbiAyNzM3MikKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9h
cnJheV9pbnN0YW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTkzLDkgKzkzLDEwIEBAIEFycmF5
SW5zdGFuY2U6OkFycmF5SW5zdGFuY2UoSlNPYmplY3QqIHAKICAgICBzdG9yYWdlLT5tX251bVZh
bHVlc0luVmVjdG9yID0gbGVuZ3RoOwogICAgIHN0b3JhZ2UtPm1fc3BhcnNlVmFsdWVNYXAgPSAw
OwogCi0gICAgTGlzdEl0ZXJhdG9yIGl0ID0gbGlzdC5iZWdpbigpOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKLSAgICAgICAgc3RvcmFnZS0+bV92ZWN0b3JbaV0g
PSBpdCsrOworICAgIHNpemVfdCBpID0gMDsKKyAgICBMaXN0Ojpjb25zdF9pdGVyYXRvciBlbmQg
PSBsaXN0LmVuZCgpOworICAgIGZvciAoTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsaXN0LmJl
Z2luKCk7IGl0ICE9IGVuZDsgKytpdCwgKytpKQorICAgICAgICBzdG9yYWdlLT5tX3ZlY3Rvcltp
XSA9ICppdDsKIAogICAgIG1fc3RvcmFnZSA9IHN0b3JhZ2U7CiAKSW5kZXg6IEphdmFTY3JpcHRD
b3JlL2tqcy9hcnJheV9vYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tq
cy9hcnJheV9vYmplY3QuY3BwCShyZXZpc2lvbiAyNzM3MykKKysrIEphdmFTY3JpcHRDb3JlL2tq
cy9hcnJheV9vYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNjQsNyArMTY0LDggQEAgSlNW
YWx1ZSogQXJyYXlQcm90b0Z1bmM6OmNhbGxBc0Z1bmN0aW9uKAogICAgIGludCBuID0gMDsKICAg
ICBKU1ZhbHVlICpjdXJBcmcgPSB0aGlzT2JqOwogICAgIEpTT2JqZWN0ICpjdXJPYmogPSBzdGF0
aWNfY2FzdDxKU09iamVjdCAqPih0aGlzT2JqKTsKLSAgICBMaXN0SXRlcmF0b3IgaXQgPSBhcmdz
LmJlZ2luKCk7CisgICAgTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhcmdzLmJlZ2luKCk7Cisg
ICAgTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gYXJncy5lbmQoKTsKICAgICBmb3IgKDs7KSB7
CiAgICAgICBpZiAoY3VyQXJnLT5pc09iamVjdCgpICYmCiAgICAgICAgICAgY3VyT2JqLT5pbmhl
cml0cygmQXJyYXlJbnN0YW5jZTo6aW5mbykpIHsKQEAgLTE4MiwxMCArMTgzLDExIEBAIEpTVmFs
dWUqIEFycmF5UHJvdG9GdW5jOjpjYWxsQXNGdW5jdGlvbigKICAgICAgICAgYXJyLT5wdXQoZXhl
YywgbiwgY3VyQXJnKTsKICAgICAgICAgbisrOwogICAgICAgfQotICAgICAgaWYgKGl0ID09IGFy
Z3MuZW5kKCkpCisgICAgICBpZiAoaXQgPT0gZW5kKQogICAgICAgICBicmVhazsKICAgICAgIGN1
ckFyZyA9ICppdDsKLSAgICAgIGN1ck9iaiA9IHN0YXRpY19jYXN0PEpTT2JqZWN0ICo+KGl0Kysp
OyAvLyBtYXkgYmUgMAorICAgICAgY3VyT2JqID0gc3RhdGljX2Nhc3Q8SlNPYmplY3QqPihjdXJB
cmcpOyAvLyBtYXkgYmUgMAorICAgICAgKytpdDsKICAgICB9CiAgICAgYXJyLT5wdXQoZXhlYywg
ZXhlYy0+cHJvcGVydHlOYW1lcygpLmxlbmd0aCwganNOdW1iZXIobiksIERvbnRFbnVtIHwgRG9u
dERlbGV0ZSk7CiAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9ib29sX29iamVjdC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL2Jvb2xfb2JqZWN0LmNwcAkocmV2aXNpb24g
MjczNzIpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvYm9vbF9vYmplY3QuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMDUsNyArMTA1LDcgQEAgSlNPYmplY3QgKkJvb2xlYW5PYmplY3RJbXA6OmNvbnN0
cnVjdChFeAogCiAgIGJvb2wgYjsKICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkKLSAgICBiID0gYXJn
cy5iZWdpbigpLT50b0Jvb2xlYW4oZXhlYyk7CisgICAgYiA9IGFyZ3NbMF0tPnRvQm9vbGVhbihl
eGVjKTsKICAgZWxzZQogICAgIGIgPSBmYWxzZTsKIApJbmRleDogSmF2YVNjcmlwdENvcmUva2pz
L2Z1bmN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvZnVuY3Rpb24u
Y3BwCShyZXZpc2lvbiAyNzM3MikKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9mdW5jdGlvbi5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI3Myw4ICsyNzMsOCBAQCBJbmRleFRvTmFtZU1hcDo6SW5kZXhU
b05hbWVNYXAoRnVuY3Rpb25JCiAgIHRoaXMtPnNpemUgPSBhcmdzLnNpemUoKTsKICAgCiAgIGlu
dCBpID0gMDsKLSAgTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXJncy5iZWdpbigpOyAKLSAgZm9y
ICg7IGl0ZXJhdG9yICE9IGFyZ3MuZW5kKCk7IGkrKywgaXRlcmF0b3IrKykKKyAgTGlzdDo6Y29u
c3RfaXRlcmF0b3IgZW5kID0gYXJncy5lbmQoKTsKKyAgZm9yIChMaXN0Ojpjb25zdF9pdGVyYXRv
ciBpdCA9IGFyZ3MuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2ksICsraXQpCiAgICAgX21hcFtpXSA9
IGZ1bmMtPmdldFBhcmFtZXRlck5hbWUoaSk7IC8vIG51bGwgaWYgdGhlcmUgaXMgbm8gY29ycmVz
cG9uZGluZyBwYXJhbWV0ZXIKIH0KIApAQCAtMzM4LDEwICszMzgsMTAgQEAgaW5kZXhUb05hbWVN
YXAoZnVuYywgYXJncykKICAgcHV0RGlyZWN0KGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5sZW5ndGgs
IGFyZ3Muc2l6ZSgpLCBEb250RW51bSk7CiAgIAogICBpbnQgaSA9IDA7Ci0gIExpc3RJdGVyYXRv
ciBpdGVyYXRvciA9IGFyZ3MuYmVnaW4oKTsgCi0gIGZvciAoOyBpdGVyYXRvciAhPSBhcmdzLmVu
ZCgpOyBpKyssIGl0ZXJhdG9yKyspIHsKKyAgTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gYXJn
cy5lbmQoKTsKKyAgZm9yIChMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFyZ3MuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0LCArK2kpIHsKICAgICBpZiAoIWluZGV4VG9OYW1lTWFwLmlzTWFwcGVk
KElkZW50aWZpZXI6OmZyb20oaSkpKSB7Ci0gICAgICBKU09iamVjdDo6cHV0KGV4ZWMsIElkZW50
aWZpZXI6OmZyb20oaSksICppdGVyYXRvciwgRG9udEVudW0pOworICAgICAgSlNPYmplY3Q6OnB1
dChleGVjLCBJZGVudGlmaWVyOjpmcm9tKGkpLCAqaXQsIERvbnRFbnVtKTsKICAgICB9CiAgIH0K
IH0KSW5kZXg6IEphdmFTY3JpcHRDb3JlL2tqcy9mdW5jdGlvbl9vYmplY3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy9mdW5jdGlvbl9vYmplY3QuY3BwCShyZXZpc2lvbiAy
NzM3MykKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9mdW5jdGlvbl9vYmplY3QuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xMzgsNyArMTM4LDcgQEAgSlNWYWx1ZSogRnVuY3Rpb25Qcm90b0Z1bmM6OmNh
bGxBc0Z1bmN0aQogICAgICAgY2FsbFRoaXMgPSB0aGlzQXJnLT50b09iamVjdChleGVjKTsKIAog
ICAgIExpc3QgYXJnc1RhaWw7Ci0gICAgYXJncy5zbGljZSgxLCBhcmdzVGFpbCk7CisgICAgYXJn
cy5nZXRTbGljZSgxLCBhcmdzVGFpbCk7CiAgICAgcmVzdWx0ID0gZnVuYy0+Y2FsbChleGVjLCBj
YWxsVGhpcywgYXJnc1RhaWwpOwogICAgIH0KICAgICBicmVhazsKSW5kZXg6IEphdmFTY3JpcHRD
b3JlL2tqcy9saXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ranMvbGlzdC5j
cHAJKHJldmlzaW9uIDI3MzczKQorKysgSmF2YVNjcmlwdENvcmUva2pzL2xpc3QuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yMSwyODEgKzIxLDYwIEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5j
bHVkZSAibGlzdC5oIgogCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlIDxhbGdvcml0
aG0+Ci0KLSNkZWZpbmUgRFVNUF9TVEFUSVNUSUNTIDAKLQotdXNpbmcgc3RkOjptaW47Ci0KIG5h
bWVzcGFjZSBLSlMgewogCi0vLyB0dW5hYmxlIHBhcmFtZXRlcnMKLWNvbnN0IGludCBwb29sU2l6
ZSA9IDUxMjsKLWNvbnN0IGludCBpbmxpbmVWYWx1ZXNTaXplID0gNTsKLQotZW51bSBMaXN0SW1w
U3RhdGUgeyB1bnVzZWRJblBvb2wgPSAwLCB1c2VkSW5Qb29sLCB1c2VkT25IZWFwLCBpbW1vcnRh
bCB9OwotCi1zdHJ1Y3QgTGlzdEltcCA6IExpc3RJbXBCYXNlCi17Ci0gICAgTGlzdEltcFN0YXRl
IHN0YXRlOwotICAgIGludCBjYXBhY2l0eTsKLSAgICBKU1ZhbHVlKiogb3ZlcmZsb3c7Ci0KLSAg
ICB1bmlvbiB7Ci0gICAgICAgIEpTVmFsdWUgKnZhbHVlc1tpbmxpbmVWYWx1ZXNTaXplXTsKLSAg
ICAgICAgTGlzdEltcCAqbmV4dEluRnJlZUxpc3Q7Ci0gICAgfTsKLQotI2lmIERVTVBfU1RBVElT
VElDUwotICAgIGludCBzaXplSGlnaFdhdGVyTWFyazsKLSNlbmRpZgotCi0gICAgdm9pZCBtYXJr
VmFsdWVzKCk7Ci19OwotCi1zdHJ1Y3QgSGVhcExpc3RJbXAgOiBMaXN0SW1wCi17Ci0gICAgSGVh
cExpc3RJbXAgKm5leHRJbkhlYXBMaXN0OwotICAgIEhlYXBMaXN0SW1wICpwcmV2SW5IZWFwTGlz
dDsKLX07Ci0KLXN0YXRpYyBMaXN0SW1wIHBvb2xbcG9vbFNpemVdOwotc3RhdGljIExpc3RJbXAg
KnBvb2xGcmVlTGlzdDsKLXN0YXRpYyBIZWFwTGlzdEltcCAqaGVhcExpc3Q7Ci1zdGF0aWMgaW50
IHBvb2xVc2VkOwotCi0jaWYgRFVNUF9TVEFUSVNUSUNTCi0KLXN0YXRpYyBpbnQgbnVtTGlzdHM7
Ci1zdGF0aWMgaW50IG51bUxpc3RzSGlnaFdhdGVyTWFyazsKLQotc3RhdGljIGludCBsaXN0U2l6
ZUhpZ2hXYXRlck1hcms7Ci0KLXN0YXRpYyBpbnQgbnVtTGlzdHNEZXN0cm95ZWQ7Ci1zdGF0aWMg
aW50IG51bUxpc3RzQmlnZ2VyVGhhblsxN107Ci0KLXN0cnVjdCBMaXN0U3RhdGlzdGljc0V4aXRM
b2dnZXIgeyB+TGlzdFN0YXRpc3RpY3NFeGl0TG9nZ2VyKCk7IH07Ci0KLXN0YXRpYyBMaXN0U3Rh
dGlzdGljc0V4aXRMb2dnZXIgbG9nZ2VyOwotCi1MaXN0U3RhdGlzdGljc0V4aXRMb2dnZXI6On5M
aXN0U3RhdGlzdGljc0V4aXRMb2dnZXIoKQordm9pZCBMaXN0OjpnZXRTbGljZShpbnQgc3RhcnRJ
bmRleCwgTGlzdCYgcmVzdWx0KSBjb25zdAogewotICAgIHByaW50ZigiXG5LSlM6Okxpc3Qgc3Rh
dGlzdGljczpcblxuIik7Ci0gICAgcHJpbnRmKCIlZCBsaXN0cyB3ZXJlIGFsbG9jYXRlZFxuIiwg
bnVtTGlzdHMpOwotICAgIHByaW50ZigiJWQgbGlzdHMgd2FzIHRoZSBoaWdoIHdhdGVyIG1hcmtc
biIsIG51bUxpc3RzSGlnaFdhdGVyTWFyayk7Ci0gICAgcHJpbnRmKCJsYXJnZXN0IGxpc3QgaGFk
ICVkIGVsZW1lbnRzXG4iLCBsaXN0U2l6ZUhpZ2hXYXRlck1hcmspOwotICAgIGlmIChudW1MaXN0
c0Rlc3Ryb3llZCkgewotICAgICAgICBwdXRjKCdcbicsIHN0ZG91dCk7Ci0gICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgMTc7IGkrKykgewotICAgICAgICAgICAgcHJpbnRmKCIlLjFmJSUgb2Yg
dGhlIGxpc3RzICglZCkgaGFkIG1vcmUgdGhhbiAlZCBlbGVtZW50JXNcbiIsCi0gICAgICAgICAg
ICAgICAgMTAwLjAgKiBudW1MaXN0c0JpZ2dlclRoYW5baV0gLyBudW1MaXN0c0Rlc3Ryb3llZCwK
LSAgICAgICAgICAgICAgICBudW1MaXN0c0JpZ2dlclRoYW5baV0sCi0gICAgICAgICAgICAgICAg
aSwgaSA9PSAxID8gIiIgOiAicyIpOwotICAgICAgICB9Ci0gICAgICAgIHB1dGMoJ1xuJywgc3Rk
b3V0KTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi1pbmxpbmUgdm9pZCBMaXN0SW1wOjptYXJrVmFs
dWVzKCkKLXsKLSAgICBpbnQgaW5saW5lU2l6ZSA9IG1pbihzaXplLCBpbmxpbmVWYWx1ZXNTaXpl
KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSAhPSBpbmxpbmVTaXplOyArK2kpIHsKLSAgICAgICAg
aWYgKCF2YWx1ZXNbaV0tPm1hcmtlZCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZXNbaV0tPm1hcmso
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBvdmVyZmxvd1NpemUgPSBzaXplIC0gaW5s
aW5lU2l6ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSAhPSBvdmVyZmxvd1NpemU7ICsraSkgewot
ICAgICAgICBpZiAoIW92ZXJmbG93W2ldLT5tYXJrZWQoKSkgewotICAgICAgICAgICAgb3ZlcmZs
b3dbaV0tPm1hcmsoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBMaXN0OjptYXJrUHJv
dGVjdGVkTGlzdHMoKQotewotICAgIGludCBzZWVuID0gMDsKLSAgICBpbnQgdXNlZCA9IHBvb2xV
c2VkOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sU2l6ZSAmJiBzZWVuIDwgdXNlZDsg
aSsrKSB7Ci0gICAgICAgIGlmIChwb29sW2ldLnN0YXRlID09IHVzZWRJblBvb2wpIHsKLSAgICAg
ICAgICAgIHNlZW4rKzsKLSAgICAgICAgICAgIGlmIChwb29sW2ldLnZhbHVlUmVmQ291bnQgPiAw
KSB7Ci0gICAgICAgICAgICAgICAgcG9vbFtpXS5tYXJrVmFsdWVzKCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKEhlYXBMaXN0SW1wICpsID0gaGVhcExpc3Q7
IGw7IGwgPSBsLT5uZXh0SW5IZWFwTGlzdCkgewotICAgICAgICBpZiAobC0+dmFsdWVSZWZDb3Vu
dCA+IDApIHsKLSAgICAgICAgICAgIGwtPm1hcmtWYWx1ZXMoKTsKLSAgICAgICAgfQotICAgIH0K
KyAgICBjb25zdF9pdGVyYXRvciBzdGFydCA9IG1pbihiZWdpbigpICsgc3RhcnRJbmRleCwgZW5k
KCkpOworICAgIHJlc3VsdC5tX3ZlY3Rvci5hcHBlbmRSYW5nZShzdGFydCwgZW5kKCkpOwogfQog
Ci0KLXN0YXRpYyBpbmxpbmUgTGlzdEltcCAqYWxsb2NhdGVMaXN0SW1wKCkKK2NvbnN0IExpc3Qm
IExpc3Q6OmVtcHR5KCkKIHsKLSAgICBBU1NFUlQoSlNMb2NrOjpsb2NrQ291bnQoKSA+IDApOwot
ICAgIAotICAgIC8vIEZpbmQgYSBmcmVlIG9uZSBpbiB0aGUgcG9vbC4KLSAgICBpZiAocG9vbFVz
ZWQgPCBwb29sU2l6ZSkgewotICAgICAgICBMaXN0SW1wICppbXAgPSBwb29sRnJlZUxpc3QgPyBw
b29sRnJlZUxpc3QgOiAmcG9vbFswXTsKLSAgICAgICAgcG9vbEZyZWVMaXN0ID0gaW1wLT5uZXh0
SW5GcmVlTGlzdCA/IGltcC0+bmV4dEluRnJlZUxpc3QgOiBpbXAgKyAxOwotICAgICAgICBpbXAt
PnN0YXRlID0gdXNlZEluUG9vbDsKLSAgICAgICAgcG9vbFVzZWQrKzsKLSAgICAgICAgcmV0dXJu
IGltcDsKLSAgICB9Ci0gICAgCi0gICAgSGVhcExpc3RJbXAgKmltcCA9IG5ldyBIZWFwTGlzdElt
cDsKLSAgICBpbXAtPnN0YXRlID0gdXNlZE9uSGVhcDsKLSAgICAvLyBsaW5rIGludG8gaGVhcCBs
aXN0Ci0gICAgaWYgKGhlYXBMaXN0KSB7Ci0gICAgICAgIGhlYXBMaXN0LT5wcmV2SW5IZWFwTGlz
dCA9IGltcDsKLSAgICB9Ci0gICAgaW1wLT5uZXh0SW5IZWFwTGlzdCA9IGhlYXBMaXN0OwotICAg
IGltcC0+cHJldkluSGVhcExpc3QgPSBOVUxMOwotICAgIGhlYXBMaXN0ID0gaW1wOwotCi0gICAg
cmV0dXJuIGltcDsKKyAgICBzdGF0aWMgY29uc3QgTGlzdCBzdGF0aWNMaXN0OworICAgIHJldHVy
biBzdGF0aWNMaXN0OwogfQogCi1MaXN0OjpMaXN0KCkgOiBfaW1wQmFzZShhbGxvY2F0ZUxpc3RJ
bXAoKSkKK0xpc3Q6Okxpc3RTZXQmIExpc3Q6Om1hcmtTZXQoKQogewotICAgIExpc3RJbXAgKmlt
cCA9IHN0YXRpY19jYXN0PExpc3RJbXAgKj4oX2ltcEJhc2UpOwotICAgIGltcC0+c2l6ZSA9IDA7
Ci0gICAgaW1wLT5yZWZDb3VudCA9IDE7Ci0gICAgaW1wLT52YWx1ZVJlZkNvdW50ID0gMTsKLSAg
ICBpbXAtPmNhcGFjaXR5ID0gMDsKLSAgICBpbXAtPm92ZXJmbG93ID0gMDsKLQotI2lmIERVTVBf
U1RBVElTVElDUwotICAgIGlmICgrK251bUxpc3RzID4gbnVtTGlzdHNIaWdoV2F0ZXJNYXJrKQot
ICAgICAgICBudW1MaXN0c0hpZ2hXYXRlck1hcmsgPSBudW1MaXN0czsKLSAgICBpbXAtPnNpemVI
aWdoV2F0ZXJNYXJrID0gMDsKLSNlbmRpZgorICAgIHN0YXRpYyBMaXN0U2V0IHN0YXRpY01hcmtT
ZXQ7CisgICAgcmV0dXJuIHN0YXRpY01hcmtTZXQ7CiB9CiAKLXZvaWQgTGlzdDo6bWFya1ZhbHVl
cygpCit2b2lkIExpc3Q6Om1hcmtQcm90ZWN0ZWRMaXN0c1Nsb3dDYXNlKCkKIHsKLSAgICBzdGF0
aWNfY2FzdDxMaXN0SW1wICo+KF9pbXBCYXNlKS0+bWFya1ZhbHVlcygpOwotfQotCi12b2lkIExp
c3Q6OnJlbGVhc2UoKQoteyAgIAotICAgIEFTU0VSVChKU0xvY2s6OmxvY2tDb3VudCgpID4gMCk7
Ci0gICAgCi0gICAgTGlzdEltcCAqaW1wID0gc3RhdGljX2Nhc3Q8TGlzdEltcCAqPihfaW1wQmFz
ZSk7Ci0gICAgCi0jaWYgRFVNUF9TVEFUSVNUSUNTCi0gICAgLS1udW1MaXN0czsKLSAgICArK251
bUxpc3RzRGVzdHJveWVkOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTc7IGkrKykKLSAgICAg
ICAgaWYgKGltcC0+c2l6ZUhpZ2hXYXRlck1hcmsgPiBpKQotICAgICAgICAgICAgKytudW1MaXN0
c0JpZ2dlclRoYW5baV07Ci0jZW5kaWYKLQotICAgIGRlbGV0ZSBbXSBpbXAtPm92ZXJmbG93Owot
ICAgIGltcC0+b3ZlcmZsb3cgPSAwOworICAgIExpc3RTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1hcmtT
ZXQoKS5lbmQoKTsKKyAgICBmb3IgKExpc3RTZXQ6Oml0ZXJhdG9yIGl0ID0gbWFya1NldCgpLmJl
Z2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBMaXN0KiBsaXN0ID0gKml0OwogCi0g
ICAgaWYgKGltcC0+c3RhdGUgPT0gdXNlZEluUG9vbCkgewotICAgICAgICBpbXAtPnN0YXRlID0g
dW51c2VkSW5Qb29sOwotICAgICAgICBpbXAtPm5leHRJbkZyZWVMaXN0ID0gcG9vbEZyZWVMaXN0
OwotICAgICAgICBwb29sRnJlZUxpc3QgPSBpbXA7Ci0gICAgICAgIHBvb2xVc2VkLS07Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgQVNTRVJUKGltcC0+c3RhdGUgPT0gdXNlZE9uSGVhcCk7Ci0gICAg
ICAgIEhlYXBMaXN0SW1wICpsaXN0ID0gc3RhdGljX2Nhc3Q8SGVhcExpc3RJbXAgKj4oaW1wKTsK
LQotICAgICAgICAvLyB1bmxpbmsgZnJvbSBoZWFwIGxpc3QKLSAgICAgICAgaWYgKCFsaXN0LT5w
cmV2SW5IZWFwTGlzdCkgewotICAgICAgICAgICAgaGVhcExpc3QgPSBsaXN0LT5uZXh0SW5IZWFw
TGlzdDsKLSAgICAgICAgICAgIGlmIChoZWFwTGlzdCkgewotICAgICAgICAgICAgICAgIGhlYXBM
aXN0LT5wcmV2SW5IZWFwTGlzdCA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICBsaXN0LT5wcmV2SW5IZWFwTGlzdC0+bmV4dEluSGVhcExpc3QgPSBs
aXN0LT5uZXh0SW5IZWFwTGlzdDsKLSAgICAgICAgICAgIGlmIChsaXN0LT5uZXh0SW5IZWFwTGlz
dCkgewotICAgICAgICAgICAgICAgIGxpc3QtPm5leHRJbkhlYXBMaXN0LT5wcmV2SW5IZWFwTGlz
dCA9IGxpc3QtPnByZXZJbkhlYXBMaXN0OwotICAgICAgICAgICAgfQorICAgICAgICBpdGVyYXRv
ciBlbmQyID0gbGlzdC0+ZW5kKCk7CisgICAgICAgIGZvciAoaXRlcmF0b3IgaXQyID0gbGlzdC0+
YmVnaW4oKTsgaXQyICE9IGVuZDI7ICsraXQyKSB7CisgICAgICAgICAgICBKU1ZhbHVlKiB2ID0g
Kml0MjsKKyAgICAgICAgICAgIGlmICghdi0+bWFya2VkKCkpCisgICAgICAgICAgICAgICAgdi0+
bWFyaygpOwogICAgICAgICB9Ci0KLSAgICAgICAgZGVsZXRlIGxpc3Q7CiAgICAgfQogfQogCi1K
U1ZhbHVlICpMaXN0OjphdChpbnQgaSkgY29uc3QKK3ZvaWQgTGlzdDo6ZXhwYW5kQW5kQXBwZW5k
KEpTVmFsdWUqIHYpCiB7Ci0gICAgTGlzdEltcCAqaW1wID0gc3RhdGljX2Nhc3Q8TGlzdEltcCAq
PihfaW1wQmFzZSk7Ci0gICAgaWYgKCh1bnNpZ25lZClpID49ICh1bnNpZ25lZClpbXAtPnNpemUp
Ci0gICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotICAgIGlmIChpIDwgaW5saW5lVmFsdWVz
U2l6ZSkKLSAgICAgICAgcmV0dXJuIGltcC0+dmFsdWVzW2ldOwotICAgIHJldHVybiBpbXAtPm92
ZXJmbG93W2kgLSBpbmxpbmVWYWx1ZXNTaXplXTsKLX0KLQotdm9pZCBMaXN0OjpjbGVhcigpCi17
Ci0gICAgX2ltcEJhc2UtPnNpemUgPSAwOwotfQotCi12b2lkIExpc3Q6OmFwcGVuZChKU1ZhbHVl
ICp2KQotewotICAgIEFTU0VSVChKU0xvY2s6OmxvY2tDb3VudCgpID4gMCk7CisgICAgQVNTRVJU
KG1fdmVjdG9yLnNpemUoKSA9PSBtX3ZlY3Rvci5jYXBhY2l0eSgpKTsKICAgICAKLSAgICBMaXN0
SW1wICppbXAgPSBzdGF0aWNfY2FzdDxMaXN0SW1wICo+KF9pbXBCYXNlKTsKLQotICAgIGludCBp
ID0gaW1wLT5zaXplKys7Ci0KLSNpZiBEVU1QX1NUQVRJU1RJQ1MKLSAgICBpZiAoaW1wLT5zaXpl
ID4gbGlzdFNpemVIaWdoV2F0ZXJNYXJrKQotICAgICAgICBsaXN0U2l6ZUhpZ2hXYXRlck1hcmsg
PSBpbXAtPnNpemU7Ci0jZW5kaWYKLQotICAgIGlmIChpIDwgaW5saW5lVmFsdWVzU2l6ZSkgewot
ICAgICAgICBpbXAtPnZhbHVlc1tpXSA9IHY7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAg
Ly8gNHggZ3Jvd3RoIHdvdWxkIGJlIGV4Y2Vzc2l2ZSBmb3IgYSBub3JtYWwgdmVjdG9yLCBidXQg
aXQncyBPSyBmb3IgTGlzdHMgCisgICAgLy8gYmVjYXVzZSB0aGV5J3JlIHNob3J0LWxpdmVkLgor
ICAgIG1fdmVjdG9yLnJlc2VydmVDYXBhY2l0eShtX3ZlY3Rvci5jYXBhY2l0eSgpICogNCk7CiAg
ICAgCi0gICAgaWYgKGkgPj0gaW1wLT5jYXBhY2l0eSkgewotICAgICAgICBpbnQgbmV3Q2FwYWNp
dHkgPSBpICogMjsKLSAgICAgICAgSlNWYWx1ZSoqIG5ld092ZXJmbG93ID0gbmV3IEpTVmFsdWUq
IFtuZXdDYXBhY2l0eSAtIGlubGluZVZhbHVlc1NpemVdOwotICAgICAgICBKU1ZhbHVlKiogb2xk
T3ZlcmZsb3cgPSBpbXAtPm92ZXJmbG93OwotICAgICAgICBpbnQgb2xkT3ZlcmZsb3dTaXplID0g
aSAtIGlubGluZVZhbHVlc1NpemU7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqICE9IG9sZE92
ZXJmbG93U2l6ZTsgaisrKQotICAgICAgICAgICAgbmV3T3ZlcmZsb3dbal0gPSBvbGRPdmVyZmxv
d1tqXTsKLSAgICAgICAgZGVsZXRlIFtdIG9sZE92ZXJmbG93OwotICAgICAgICBpbXAtPm92ZXJm
bG93ID0gbmV3T3ZlcmZsb3c7Ci0gICAgICAgIGltcC0+Y2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsK
KyAgICAvLyBBcyBsb25nIGFzIG91ciBzaXplIHN0YXlzIHdpdGhpbiBvdXIgVmVjdG9yJ3MgaW5s
aW5lIAorICAgIC8vIGNhcGFjaXR5LCBhbGwgb3VyIHZhbHVlcyBhcmUgYWxsb2NhdGVkIG9uIHRo
ZSBzdGFjaywgYW5kIAorICAgIC8vIHRoZXJlZm9yZSBkb24ndCBuZWVkIGV4cGxpY2l0IG1hcmtp
bmcuIE9uY2Ugb3VyIHNpemUgZXhjZWVkcworICAgIC8vIG91ciBWZWN0b3IncyBpbmxpbmUgY2Fw
YWNpdHksIHRob3VnaCwgb3VyIHZhbHVlcyBtb3ZlIHRvIHRoZSAKKyAgICAvLyBoZWFwLCB3aGVy
ZSB0aGV5IGRvIG5lZWQgZXhwbGljaXQgbWFya2luZy4KKyAgICBpZiAoIW1faXNJbk1hcmtTZXQp
IHsKKyAgICAgICAgbWFya1NldCgpLmFkZCh0aGlzKTsKKyAgICAgICAgbV9pc0luTWFya1NldCA9
IHRydWU7CiAgICAgfQotICAgIAotICAgIGltcC0+b3ZlcmZsb3dbaSAtIGlubGluZVZhbHVlc1Np
emVdID0gdjsKLX0KLQotdm9pZCBMaXN0OjpzbGljZShpbnQgc3RhcnRJbmRleCwgTGlzdCYgcmVz
dWx0KSBjb25zdAotewotICAgIExpc3RJbXAgKmltcCA9IHN0YXRpY19jYXN0PExpc3RJbXAgKj4o
X2ltcEJhc2UpOwotCi0gICAgaW50IHNpemUgPSBpbXAtPnNpemU7Ci0KLSAgICBpbnQgaW5saW5l
U2l6ZSA9IG1pbihzaXplLCBpbmxpbmVWYWx1ZXNTaXplKTsKLSAgICBmb3IgKGludCBpID0gc3Rh
cnRJbmRleDsgaSA8IGlubGluZVNpemU7ICsraSkKLSAgICAgICAgcmVzdWx0LmFwcGVuZChpbXAt
PnZhbHVlc1tpXSk7CiAKLSAgICBKU1ZhbHVlKiogb3ZlcmZsb3cgPSBpbXAtPm92ZXJmbG93Owot
ICAgIGludCBvdmVyZmxvd1NpemUgPSBzaXplIC0gaW5saW5lU2l6ZTsKLSAgICBmb3IgKGludCBp
ID0gMDsgaSA8IG92ZXJmbG93U2l6ZTsgKytpKQotICAgICAgICByZXN1bHQuYXBwZW5kKG92ZXJm
bG93W2ldKTsKLX0KLQotY29uc3QgTGlzdCYgTGlzdDo6ZW1wdHkoKQotewotICAgIHN0YXRpYyBM
aXN0KiBzdGF0aWNFbXB0eUxpc3QgPSBuZXcgTGlzdDsKLSAgICByZXR1cm4gKnN0YXRpY0VtcHR5
TGlzdDsKKyAgICBtX3ZlY3Rvci51bmNoZWNrZWRBcHBlbmQodik7CiB9CiAKIH0gLy8gbmFtZXNw
YWNlIEtKUwpJbmRleDogSmF2YVNjcmlwdENvcmUva2pzL2xpc3QuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBK
YXZhU2NyaXB0Q29yZS9ranMvbGlzdC5oCShyZXZpc2lvbiAyNzM3MykKKysrIEphdmFTY3JpcHRD
b3JlL2tqcy9saXN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNyArMSw2IEBACiAvKgotICogIFRo
aXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBLREUgbGlicmFyaWVzCiAgKiAgQ29weXJpZ2h0IChDKSAx
OTk5LTIwMDEgSGFycmkgUG9ydGVuIChwb3J0ZW5Aa2RlLm9yZykKLSAqICBDb3B5cmlnaHQgKEMp
IDIwMDMgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDcg
QXBwbGUgQ29tcHV0ZXIsIEluYy4KICAqCiAgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yMywxNDggKzIy
LDk5IEBACiAjaWZuZGVmIEtKU19MSVNUX0gKICNkZWZpbmUgS0pTX0xJU1RfSAogCi0jaW5jbHVk
ZSAidmFsdWUuaCIKKyNpbmNsdWRlIDxranMvdmFsdWUuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNl
dC5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KIAogbmFtZXNwYWNlIEtKUyB7CiAKLSAgICBzdHJ1Y3QgTGlzdEltcEJhc2UgewotICAgICAg
ICBpbnQgc2l6ZTsKLSAgICAgICAgaW50IHJlZkNvdW50OwotICAgICAgICBpbnQgdmFsdWVSZWZD
b3VudDsgLy8gRklYTUU6IEdldCByaWQgb2YgdGhpcy4KLSAgICB9OworICAgIGNsYXNzIEpTVmFs
dWU7CisgICAgY2xhc3MgTGlzdDsKICAgICAKLSAgICBjbGFzcyBMaXN0SXRlcmF0b3I7Ci0KLSAg
ICAvKioKLSAgICAgKiBAc2hvcnQgTmF0aXZlIGxpc3QgdHlwZS4KLSAgICAgKgotICAgICAqIExp
c3QgaXMgYSBuYXRpdmUgRUNNQVNjcmlwdCB0eXBlLiBMaXN0IHZhbHVlcyBhcmUgb25seSB1c2Vk
IGZvcgotICAgICAqIGludGVybWVkaWF0ZSByZXN1bHRzIG9mIGV4cHJlc3Npb24gZXZhbHVhdGlv
biBhbmQgY2Fubm90IGJlIHN0b3JlZAotICAgICAqIGFzIHByb3BlcnRpZXMgb2Ygb2JqZWN0cy4K
LSAgICAgKi8KICAgICBjbGFzcyBMaXN0IDogTm9uY29weWFibGUgeworICAgIHByaXZhdGU6Cisg
ICAgICAgIHR5cGVkZWYgVmVjdG9yPEpTVmFsdWUqLCA4PiBWZWN0b3JUeXBlOworICAgICAgICB0
eXBlZGVmIEhhc2hTZXQ8TGlzdCo+IExpc3RTZXQ7CisKICAgICBwdWJsaWM6Ci0gICAgICAgIExp
c3QoKTsKLSAgICAgICAgfkxpc3QoKSB7IGRlcmVmKCk7IH0KKyAgICAgICAgdHlwZWRlZiBWZWN0
b3JUeXBlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgdHlwZWRlZiBWZWN0b3JUeXBlOjpj
b25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgICBMaXN0KCkKKyAgICAgICAg
ICAgIDogbV9pc0luTWFya1NldChmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAg
ICAgfkxpc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobV9pc0luTWFya1NldCkKKyAg
ICAgICAgICAgICAgICBtYXJrU2V0KCkucmVtb3ZlKHRoaXMpOworICAgICAgICB9CisKKyAgICAg
ICAgaW50IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZlY3Rvci5zaXplKCk7IH0KKyAgICAgICAg
Ym9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV92ZWN0b3IuaXNFbXB0eSgpOyB9CisKKyAg
ICAgICAgSlNWYWx1ZSogYXQoc2l6ZV90IGkpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAg
IGlmIChpIDwgbV92ZWN0b3Iuc2l6ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBtX3ZlY3Rv
ci5hdChpKTsKKyAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgICAgICB9CisK
KyAgICAgICAgSlNWYWx1ZSogb3BlcmF0b3JbXShpbnQgaSkgY29uc3QgeyByZXR1cm4gYXQoaSk7
IH0KKworICAgICAgICB2b2lkIGNsZWFyKCkgeyBtX3ZlY3Rvci5jbGVhcigpOyB9CisKKyAgICAg
ICAgdm9pZCBhcHBlbmQoSlNWYWx1ZSogdikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1f
dmVjdG9yLnNpemUoKSA8IG1fdmVjdG9yLmNhcGFjaXR5KCkpCisgICAgICAgICAgICAgICAgbV92
ZWN0b3IudW5jaGVja2VkQXBwZW5kKHYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIC8vIFB1dHRpbmcgdGhlIHNsb3cgImV4cGFuZCBhbmQgYXBwZW5kIiBjYXNlIGFsbCBpbiBv
bmUgCisgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gbWVhc3VyYWJseSBpbXByb3ZlcyB0aGUg
cGVyZm9ybWFuY2Ugb2YgdGhlIGZhc3QgCisgICAgICAgICAgICAgICAgLy8gImp1c3QgYXBwZW5k
IiBjYXNlLgorICAgICAgICAgICAgICAgIGV4cGFuZEFuZEFwcGVuZCh2KTsKKyAgICAgICAgfQor
CisgICAgICAgIHZvaWQgZ2V0U2xpY2UoaW50IHN0YXJ0SW5kZXgsIExpc3QmIHJlc3VsdCkgY29u
c3Q7CisKKyAgICAgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtX3ZlY3Rvci5iZWdpbigp
OyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fdmVjdG9yLmVuZCgpOyB9CisK
KyAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX3ZlY3Rvci5i
ZWdpbigpOyB9CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1f
dmVjdG9yLmVuZCgpOyB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgbWFya1Byb3RlY3RlZExpc3Rz
KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtYXJrU2V0KCkuc2l6ZSgpKQorICAgICAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG1hcmtQcm90ZWN0ZWRMaXN0c1Nsb3dDYXNl
KCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY29uc3QgTGlzdCYgZW1wdHkoKTsgLy8g
RmFzdCBwYXRoIGZvciBhbiBlbXB0eSBsaXN0LgogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBB
cHBlbmQgYW4gb2JqZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0gICAgICAgICAqCi0gICAg
ICAgICAqIEBwYXJhbSB2YWwgUG9pbnRlciB0byBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAg
ICB2b2lkIGFwcGVuZChKU1ZhbHVlICp2YWwpOwotICAgICAgICAvKioKLSAgICAgICAgICogUmVt
b3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgKi8KLSAgICAgICAgdm9p
ZCBjbGVhcigpOwotCi0gICAgICAgIHZvaWQgcmVzZXQoKSB7IGRlcmVmKCk7ICsrKF9pbXBCYXNl
ID0gZW1wdHkoKS5faW1wQmFzZSktPnJlZkNvdW50OyB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAg
ICAqIE1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0LCBzdGFydGluZyBmcm9tIHN0YXJ0SW5kZXguCi0g
ICAgICAgICAqLwotICAgICAgICB2b2lkIHNsaWNlKGludCBzdGFydEluZGV4LCBMaXN0JiByZXN1
bHQpIGNvbnN0OwotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBs
aXN0IGlzIGVtcHR5LiBmYWxzZSBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBib29s
IGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBfaW1wQmFzZS0+c2l6ZSA9PSAwOyB9Ci0gICAgICAg
IC8qKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGxpc3QuCi0g
ICAgICAgICAqLwotICAgICAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9pbXBCYXNlLT5z
aXplOyB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIEEgS0pTOjpMaXN0SXRlcmF0
b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCi0gICAgICAgICAqLwotICAgICAgICBM
aXN0SXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1
cm4gQSBLSlM6Okxpc3RJdGVyYXRvciBwb2ludGluZyB0byB0aGUgbGFzdCBlbGVtZW50LgotICAg
ICAgICAgKi8KLSAgICAgICAgTGlzdEl0ZXJhdG9yIGVuZCgpIGNvbnN0OwotICAgICAgICAKLSAg
ICAgICAgLyoqCi0gICAgICAgICAqIFJldHJpZXZlIGFuIGVsZW1lbnQgYXQgYW4gaW5kZXhlZCBw
b3NpdGlvbi4gSWYgeW91IHdhbnQgdG8gaXRlcmF0ZQotICAgICAgICAgKiB0cm91Z2ggdGhlIHdo
b2xlIGxpc3QgdXNpbmcgS0pTOjpMaXN0SXRlcmF0b3Igd2lsbCBiZSBmYXN0ZXIuCi0gICAgICAg
ICAqCi0gICAgICAgICAqIEBwYXJhbSBpIExpc3QgaW5kZXguCi0gICAgICAgICAqIEByZXR1cm4g
UmV0dXJuIHRoZSBlbGVtZW50IGF0IHBvc2l0aW9uIGkuIEtKUzo6VW5kZWZpbmVkIGlmIHRoZQot
ICAgICAgICAgKiBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0gICAgICAgICAqLwotICAgICAgICBK
U1ZhbHVlICphdChpbnQgaSkgY29uc3Q7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBFcXVpdmFs
ZW50IHRvIGF0LgotICAgICAgICAgKi8KLSAgICAgICAgSlNWYWx1ZSAqb3BlcmF0b3JbXShpbnQg
aSkgY29uc3QgeyByZXR1cm4gYXQoaSk7IH0KLSAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAq
IFJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljIGluc3RhbmNlIG9mIGFuIGVtcHR5IGxpc3Qu
IFVzZWZ1bCBpZiBhCi0gICAgICAgICAqIGZ1bmN0aW9uIGhhcyBhIEtKUzo6TGlzdCBwYXJhbWV0
ZXIuCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgY29uc3QgTGlzdCAmZW1wdHkoKTsKLSAg
ICAgICAgCi0gICAgICAgIHN0YXRpYyB2b2lkIG1hcmtQcm90ZWN0ZWRMaXN0cygpOwogICAgIHBy
aXZhdGU6Ci0gICAgICAgIExpc3RJbXBCYXNlICpfaW1wQmFzZTsKLSAgICAgICAgCi0gICAgICAg
IHZvaWQgZGVyZWYoKSB7IC0tX2ltcEJhc2UtPnZhbHVlUmVmQ291bnQ7IGlmICgtLV9pbXBCYXNl
LT5yZWZDb3VudCA9PSAwKSByZWxlYXNlKCk7IH0KKyAgICAgICAgc3RhdGljIExpc3RTZXQmIG1h
cmtTZXQoKTsKKyAgICAgICAgc3RhdGljIHZvaWQgbWFya1Byb3RlY3RlZExpc3RzU2xvd0Nhc2Uo
KTsKIAotICAgICAgICB2b2lkIHJlbGVhc2UoKTsKLSAgICAgICAgdm9pZCBtYXJrVmFsdWVzKCk7
Ci0gICAgfTsKLSAgCi0gICAgLyoqCi0gICAgICogQHNob3J0IEl0ZXJhdG9yIGZvciBLSlM6Okxp
c3Qgb2JqZWN0cy4KLSAgICAgKi8KLSAgICBjbGFzcyBMaXN0SXRlcmF0b3IgewotICAgIHB1Ymxp
YzoKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHBv
aW50cyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdC4KLSAgICAgICAgICogQHBhcmFt
IGwgVGhlIGxpc3QgdGhlIGl0ZXJhdG9yIHdpbGwgb3BlcmF0ZSBvbi4KLSAgICAgICAgICovCi0g
ICAgICAgIExpc3RJdGVyYXRvcihjb25zdCBMaXN0ICZsKSA6IF9saXN0KCZsKSwgX2koMCkgeyB9
Ci0gICAgICAgIExpc3RJdGVyYXRvcihjb25zdCBMaXN0ICZsLCBpbnQgaW5kZXgpIDogX2xpc3Qo
JmwpLCBfaShpbmRleCkgeyB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBEZXJlZmVyZW5jZSB0
aGUgaXRlcmF0b3IuCi0gICAgICAgICAqIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBlbGVtZW50
IHRoZSBpdGVyYXRvciBvcGVyYXRlcyBvbi4KLSAgICAgICAgICovCi0gICAgICAgIEpTVmFsdWUg
Km9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBfbGlzdC0+YXQoX2kpOyB9Ci0gICAgICAgIEpT
VmFsdWUgKm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIF9saXN0LT5hdChfaSk7IH0KLSAgICAg
ICAgLyoqCi0gICAgICAgICAqIFByZWZpeCBpbmNyZW1lbnQgb3BlcmF0b3IuCi0gICAgICAgICAq
IEByZXR1cm4gVGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGluY3JlbWVudC4KLSAgICAgICAgICovCi0g
ICAgICAgIEpTVmFsdWUgKm9wZXJhdG9yKysoKSB7IHJldHVybiBfbGlzdC0+YXQoKytfaSk7IH0K
LSAgICAgICAgLyoqCi0gICAgICAgICAqIFBvc3RmaXggaW5jcmVtZW50IG9wZXJhdG9yLgotICAg
ICAgICAgKi8KLSAgICAgICAgSlNWYWx1ZSAqb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuIF9saXN0
LT5hdChfaSsrKTsgfQotICAgICAgICAvKioKLSAgICAgICAgICogUHJlZml4IGRlY3JlbWVudCBv
cGVyYXRvci4KLSAgICAgICAgICovCi0gICAgICAgIEpTVmFsdWUgKm9wZXJhdG9yLS0oKSB7IHJl
dHVybiBfbGlzdC0+YXQoLS1faSk7IH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBvc3RmaXgg
ZGVjcmVtZW50IG9wZXJhdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgSlNWYWx1ZSAqb3BlcmF0
b3ItLShpbnQpIHsgcmV0dXJuIF9saXN0LT5hdChfaS0tKTsgfQotICAgICAgICAvKioKLSAgICAg
ICAgICogQ29tcGFyZSB0aGUgaXRlcmF0b3Igd2l0aCBhbm90aGVyIG9uZS4KLSAgICAgICAgICog
QHJldHVybiBUcnVlIGlmIHRoZSB0d28gaXRlcmF0b3JzIG9wZXJhdGUgb24gdGhlIHNhbWUgbGlz
dCBlbGVtZW50LgotICAgICAgICAgKiBGYWxzZSBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAg
ICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGlzdEl0ZXJhdG9yICZpdCkgY29uc3QgeyByZXR1
cm4gX2kgPT0gaXQuX2k7IH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIGZvciBpbmVx
dWFsaXR5IHdpdGggYW5vdGhlciBpdGVyYXRvci4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlm
IHRoZSB0d28gaXRlcmF0b3JzIG9wZXJhdGUgb24gZGlmZmVyZW50IGxpc3QgZWxlbWVudHMuCi0g
ICAgICAgICAqLwotICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgTGlzdEl0ZXJhdG9yICZp
dCkgY29uc3QgeyByZXR1cm4gX2kgIT0gaXQuX2k7IH0KKyAgICAgICAgdm9pZCBleHBhbmRBbmRB
cHBlbmQoSlNWYWx1ZSopOworCisgICAgICAgIFZlY3RvclR5cGUgbV92ZWN0b3I7CisgICAgICAg
IGJvb2wgbV9pc0luTWFya1NldDsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IExpc3Qg
Kl9saXN0OwotICAgICAgICBpbnQgX2k7Ci0gICAgfTsKKyAgICAgICAgLy8gUHJvaGliaXRzIG5l
dyAvIGRlbGV0ZSwgd2hpY2ggd291bGQgYnJlYWsgR0MuCisgICAgICAgIHZvaWQqIG9wZXJhdG9y
IG5ldyhzaXplX3QpOworICAgICAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKik7CiAKLSAg
ICBpbmxpbmUgTGlzdEl0ZXJhdG9yIExpc3Q6OmJlZ2luKCkgY29uc3QgeyByZXR1cm4gTGlzdEl0
ZXJhdG9yKCp0aGlzKTsgfQotICAgIGlubGluZSBMaXN0SXRlcmF0b3IgTGlzdDo6ZW5kKCkgY29u
c3QgeyByZXR1cm4gTGlzdEl0ZXJhdG9yKCp0aGlzLCBzaXplKCkpOyB9Ci0gCisgICAgICAgIHZv
aWQqIG9wZXJhdG9yIG5ld1tdKHNpemVfdCk7CisgICAgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRl
W10odm9pZCopOworCisgICAgICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QsIHZvaWQqKTsK
KyAgICAgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCk7CisgICAgfTsKKyAg
ICAKIH0gLy8gbmFtZXNwYWNlIEtKUwogCiAjZW5kaWYgLy8gS0pTX0xJU1RfSApJbmRleDogSmF2
YVNjcmlwdENvcmUva2pzL3JlZ2V4cF9vYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3Jp
cHRDb3JlL2tqcy9yZWdleHBfb2JqZWN0LmNwcAkocmV2aXNpb24gMjczNzIpCisrKyBKYXZhU2Ny
aXB0Q29yZS9ranMvcmVnZXhwX29iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM5NCwxNSAr
Mzk0LDE4IEBAIGJvb2wgUmVnRXhwT2JqZWN0SW1wOjppbXBsZW1lbnRzQ29uc3RydWMKIC8vIEVD
TUEgMTUuMTAuNAogSlNPYmplY3QgKlJlZ0V4cE9iamVjdEltcDo6Y29uc3RydWN0KEV4ZWNTdGF0
ZSAqZXhlYywgY29uc3QgTGlzdCAmYXJncykKIHsKLSAgSlNPYmplY3QgKm8gPSBhcmdzWzBdLT5n
ZXRPYmplY3QoKTsKKyAgSlNWYWx1ZSogYXJnMCA9IGFyZ3NbMF07CisgIEpTVmFsdWUqIGFyZzEg
PSBhcmdzWzFdOworICAKKyAgSlNPYmplY3QqIG8gPSBhcmcwLT5nZXRPYmplY3QoKTsKICAgaWYg
KG8gJiYgby0+aW5oZXJpdHMoJlJlZ0V4cEltcDo6aW5mbykpIHsKLSAgICBpZiAoIWFyZ3NbMV0t
PmlzVW5kZWZpbmVkKCkpCisgICAgaWYgKCFhcmcxLT5pc1VuZGVmaW5lZCgpKQogICAgICAgcmV0
dXJuIHRocm93RXJyb3IoZXhlYywgVHlwZUVycm9yKTsKICAgICByZXR1cm4gbzsKICAgfQogICAK
LSAgVVN0cmluZyBwID0gYXJnc1swXS0+aXNVbmRlZmluZWQoKSA/IFVTdHJpbmcoIiIpIDogYXJn
c1swXS0+dG9TdHJpbmcoZXhlYyk7Ci0gIFVTdHJpbmcgZmxhZ3MgPSBhcmdzWzFdLT5pc1VuZGVm
aW5lZCgpID8gVVN0cmluZygiIikgOiBhcmdzWzFdLT50b1N0cmluZyhleGVjKTsKKyAgVVN0cmlu
ZyBwID0gYXJnMC0+aXNVbmRlZmluZWQoKSA/IFVTdHJpbmcoIiIpIDogYXJnMC0+dG9TdHJpbmco
ZXhlYyk7CisgIFVTdHJpbmcgZmxhZ3MgPSBhcmcxLT5pc1VuZGVmaW5lZCgpID8gVVN0cmluZygi
IikgOiBhcmcxLT50b1N0cmluZyhleGVjKTsKIAogICBSZWdFeHBQcm90b3R5cGUgKnByb3RvID0g
c3RhdGljX2Nhc3Q8UmVnRXhwUHJvdG90eXBlKj4oZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCkt
PmJ1aWx0aW5SZWdFeHBQcm90b3R5cGUoKSk7CiAgIFJlZ0V4cEltcCAqZGF0ID0gbmV3IFJlZ0V4
cEltcChwcm90byk7CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ranMvc3RyaW5nX29iamVjdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL3N0cmluZ19vYmplY3QuY3BwCShyZXZp
c2lvbiAyNzM3MikKKysrIEphdmFTY3JpcHRDb3JlL2tqcy9zdHJpbmdfb2JqZWN0LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNDgwLDkgKzQ4MCw5IEBAIEpTVmFsdWUqIFN0cmluZ1Byb3RvRnVuYzo6
Y2FsbEFzRnVuY3Rpb24KICAgICAgIHJlc3VsdCA9IGpzTmFOKCk7CiAgICAgYnJlYWs7CiAgIGNh
c2UgQ29uY2F0OiB7Ci0gICAgTGlzdEl0ZXJhdG9yIGl0ID0gYXJncy5iZWdpbigpOwotICAgIGZv
ciAoIDsgaXQgIT0gYXJncy5lbmQoKSA7ICsraXQpIHsKLSAgICAgICAgcyArPSBpdC0+dG9TdHJp
bmcoZXhlYyk7CisgICAgTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gYXJncy5lbmQoKTsKKyAg
ICBmb3IgKExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXJncy5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpIHsKKyAgICAgICAgcyArPSAoKml0KS0+dG9TdHJpbmcoZXhlYyk7CiAgICAgfQogICAg
IHJlc3VsdCA9IGpzU3RyaW5nKHMpOwogICAgIGJyZWFrOwpAQCAtODA4LDcgKzgwOCw3IEBAIEpT
T2JqZWN0ICpTdHJpbmdPYmplY3RJbXA6OmNvbnN0cnVjdChFeGUKICAgSlNPYmplY3QgKnByb3Rv
ID0gZXhlYy0+bGV4aWNhbEludGVycHJldGVyKCktPmJ1aWx0aW5TdHJpbmdQcm90b3R5cGUoKTsK
ICAgaWYgKGFyZ3Muc2l6ZSgpID09IDApCiAgICAgcmV0dXJuIG5ldyBTdHJpbmdJbnN0YW5jZShw
cm90byk7Ci0gIHJldHVybiBuZXcgU3RyaW5nSW5zdGFuY2UocHJvdG8sIGFyZ3MuYmVnaW4oKS0+
dG9TdHJpbmcoZXhlYykpOworICByZXR1cm4gbmV3IFN0cmluZ0luc3RhbmNlKHByb3RvLCBhcmdz
WzBdLT50b1N0cmluZyhleGVjKSk7CiB9CiAKIC8vIEVDTUEgMTUuNS4xCkBAIC04MzcsMTEgKzgz
NywxMCBAQCBKU1ZhbHVlICpTdHJpbmdPYmplY3RGdW5jSW1wOjpjYWxsQXNGdW5jCiAgIGlmIChh
cmdzLnNpemUoKSkgewogICAgIFVDaGFyICpidWYgPSBzdGF0aWNfY2FzdDxVQ2hhciAqPihmYXN0
TWFsbG9jKGFyZ3Muc2l6ZSgpICogc2l6ZW9mKFVDaGFyKSkpOwogICAgIFVDaGFyICpwID0gYnVm
OwotICAgIExpc3RJdGVyYXRvciBpdCA9IGFyZ3MuYmVnaW4oKTsKLSAgICB3aGlsZSAoaXQgIT0g
YXJncy5lbmQoKSkgewotICAgICAgdW5zaWduZWQgc2hvcnQgdSA9IHN0YXRpY19jYXN0PHVuc2ln
bmVkIHNob3J0PihpdC0+dG9VSW50MzIoZXhlYykpOworICAgIExpc3Q6OmNvbnN0X2l0ZXJhdG9y
IGVuZCA9IGFyZ3MuZW5kKCk7CisgICAgZm9yIChMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGFy
Z3MuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICB1bnNpZ25lZCBzaG9ydCB1ID0g
c3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KCgqaXQpLT50b1VJbnQzMihleGVjKSk7CiAgICAg
ICAqcCsrID0gVUNoYXIodSk7Ci0gICAgICBpdCsrOwogICAgIH0KICAgICBzID0gVVN0cmluZyhi
dWYsIGFyZ3Muc2l6ZSgpLCBmYWxzZSk7CiAgIH0gZWxzZQpJbmRleDogSmF2YVNjcmlwdENvcmUv
d3RmL1ZlY3Rvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi9WZWN0b3IuaAko
cmV2aXNpb24gMjczNzIpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvVmVjdG9yLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTQ1Niw2ICs0NTYsNyBAQCBuYW1lc3BhY2UgV1RGIHsKIAogICAgICAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBVPiB2b2lkIGFwcGVuZChjb25zdCBVKiwgc2l6ZV90KTsKICAgICAgICAg
dGVtcGxhdGU8dHlwZW5hbWUgVT4gdm9pZCBhcHBlbmQoY29uc3QgVSYpOworICAgICAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBVPiB2b2lkIHVuY2hlY2tlZEFwcGVuZChjb25zdCBVJiB2YWwpOwogICAg
ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCBzaXplX3QgYz4gdm9pZCBhcHBlbmQoY29uc3QgVmVj
dG9yPFUsIGM+Jik7CiAKICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gdm9pZCBpbnNlcnQo
c2l6ZV90IHBvc2l0aW9uLCBjb25zdCBVKiwgc2l6ZV90KTsKQEAgLTY2OSw2ICs2NzAsMTggQEAg
bmFtZXNwYWNlIFdURiB7CiAgICAgICAgICsrbV9zaXplOwogICAgIH0KIAorICAgIC8vIFRoaXMg
dmVyc2lvbiBvZiBhcHBlbmQgc2F2ZXMgYSBicmFuY2ggaW4gdGhlIGNhc2Ugd2hlcmUgeW91IGtu
b3cgdGhhdCB0aGUKKyAgICAvLyB2ZWN0b3IncyBjYXBhY2l0eSBpcyBsYXJnZSBlbm91Z2ggZm9y
IHRoZSBhcHBlbmQgdG8gc3VjY2VlZC4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVf
dCBpbmxpbmVDYXBhY2l0eT4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBpbmxpbmUgdm9pZCBW
ZWN0b3I8VCwgaW5saW5lQ2FwYWNpdHk+Ojp1bmNoZWNrZWRBcHBlbmQoY29uc3QgVSYgdmFsKQor
ICAgIHsKKyAgICAgICAgQVNTRVJUKHNpemUoKSA8IGNhcGFjaXR5KCkpOworICAgICAgICBjb25z
dCBVKiBwdHIgPSAmdmFsOworICAgICAgICBuZXcgKGVuZCgpKSBUKCpwdHIpOworICAgICAgICAr
K21fc2l6ZTsKKyAgICB9CisKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgaW5saW5l
Q2FwYWNpdHk+IHRlbXBsYXRlPHR5cGVuYW1lIFUsIHNpemVfdCBjPgogICAgIGlubGluZSB2b2lk
IFZlY3RvcjxULCBpbmxpbmVDYXBhY2l0eT46OmFwcGVuZChjb25zdCBWZWN0b3I8VSwgYz4mIHZh
bCkKICAgICB7CkluZGV4OiBKYXZhU2NyaXB0R2x1ZS9Gb3J3YXJkaW5nSGVhZGVycy9ranMvdmFs
dWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0R2x1ZS9Gb3J3YXJkaW5nSGVhZGVycy9ranMv
dmFsdWUuaAkocmV2aXNpb24gMCkKKysrIEphdmFTY3JpcHRHbHVlL0ZvcndhcmRpbmdIZWFkZXJz
L2tqcy92YWx1ZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8SmF2YVNj
cmlwdENvcmUvdmFsdWUuaD4KSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAyNzM3MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9n
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMDctMTEtMDQgIEdlb2ZmcmV5IEdh
cmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBTbWFsbCBhZGFwdGF0aW9ucyB0byBuZXcgS0pTOjpMaXN0IGNsYXNz
LgorCisgICAgICAgICogYmluZGluZ3MvanMva2pzX3dpbmRvdy5jcHA6CisgICAgICAgIChLSlM6
OldpbmRvd0Z1bmM6OmNhbGxBc0Z1bmN0aW9uKToKKyAgICAgICAgKEtKUzo6U2NoZWR1bGVkQWN0
aW9uOjpTY2hlZHVsZWRBY3Rpb24pOgorCiAyMDA3LTExLTAxICBHZW9mZnJleSBHYXJlbiAgPGdn
YXJlbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTWFjaWVqIFN0YWNob3dpYWsu
CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL2pzL2tqc193aW5kb3cuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvYmluZGluZ3MvanMva2pzX3dpbmRvdy5jcHAJKHJldmlzaW9uIDI3MzczKQorKysg
V2ViQ29yZS9iaW5kaW5ncy9qcy9ranNfd2luZG93LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTM5
MCw3ICsxMzkwLDcgQEAgSlNWYWx1ZSAqV2luZG93RnVuYzo6Y2FsbEFzRnVuY3Rpb24oRXhlYwog
ICAgICAgaW50IGkgPSBhcmdzWzFdLT50b0ludDMyKGV4ZWMpOwogICAgICAgCiAgICAgICBMaXN0
IGFyZ3NUYWlsOwotICAgICAgYXJncy5zbGljZSgyLCBhcmdzVGFpbCk7CisgICAgICBhcmdzLmdl
dFNsaWNlKDIsIGFyZ3NUYWlsKTsKIAogICAgICAgaW50IHIgPSAoY29uc3RfY2FzdDxXaW5kb3cq
Pih3aW5kb3cpKS0+aW5zdGFsbFRpbWVvdXQoZnVuYywgYXJnc1RhaWwsIGksIHRydWUgLypzaW5n
bGUgc2hvdCovKTsKICAgICAgIHJldHVybiBqc051bWJlcihyKTsKQEAgLTE0MTAsNyArMTQxMCw3
IEBAIEpTVmFsdWUgKldpbmRvd0Z1bmM6OmNhbGxBc0Z1bmN0aW9uKEV4ZWMKICAgICAgIGludCBp
ID0gYXJnc1sxXS0+dG9JbnQzMihleGVjKTsKIAogICAgICAgTGlzdCBhcmdzVGFpbDsKLSAgICAg
IGFyZ3Muc2xpY2UoMiwgYXJnc1RhaWwpOworICAgICAgYXJncy5nZXRTbGljZSgyLCBhcmdzVGFp
bCk7CiAKICAgICAgIGludCByID0gKGNvbnN0X2Nhc3Q8V2luZG93Kj4od2luZG93KSktPmluc3Rh
bGxUaW1lb3V0KGZ1bmMsIGFyZ3NUYWlsLCBpLCBmYWxzZSk7CiAgICAgICByZXR1cm4ganNOdW1i
ZXIocik7CkBAIC0xNTU5LDkgKzE1NTksOCBAQCBpbnQgV2luZG93OjppbnN0YWxsVGltZW91dChT
Y2hlZHVsZWRBY3RpCiBTY2hlZHVsZWRBY3Rpb246OlNjaGVkdWxlZEFjdGlvbihKU1ZhbHVlKiBm
dW5jLCBjb25zdCBMaXN0JiBhcmdzKQogICAgIDogbV9mdW5jKGZ1bmMpCiB7Ci0gICAgTGlzdEl0
ZXJhdG9yIGl0ID0gYXJncy5iZWdpbigpOwotICAgIExpc3RJdGVyYXRvciBlbmQgPSBhcmdzLmVu
ZCgpOwotICAgIHdoaWxlIChpdCAhPSBlbmQpCisgICAgTGlzdDo6Y29uc3RfaXRlcmF0b3IgZW5k
ID0gYXJncy5lbmQoKTsKKyAgICBmb3IgKExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXJncy5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCiAgICAgICAgIG1fYXJncy5hcHBlbmQoKml0KTsKIH0K
IApJbmRleDogV2ViS2l0L0ZvcndhcmRpbmdIZWFkZXJzL2tqcy92YWx1ZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdC9Gb3J3YXJkaW5nSGVhZGVycy9ranMvdmFsdWUuaAkocmV2aXNpb24gMCkKKysr
IFdlYktpdC9Gb3J3YXJkaW5nSGVhZGVycy9ranMvdmFsdWUuaAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSBAQAorI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUvdmFsdWUuaD4K
</data>
<flag name="review"
          id="7245"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>