<?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>99107</bug_id>
          
          <creation_ts>2012-10-11 15:51:09 -0700</creation_ts>
          <short_desc>BlockAllocator should use regions as its VM allocation abstraction</short_desc>
          <delta_ts>2012-10-11 20:10:33 -0700</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>Unspecified</rep_platform>
          <op_sys>Unspecified</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="Mark Hahnenberg">mhahnenberg</reporter>
          <assigned_to name="Mark Hahnenberg">mhahnenberg</assigned_to>
          <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>740344</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2012-10-11 15:51:09 -0700</bug_when>
    <thetext>Currently the BlockAllocator allocates a single block at a time directly from the OS. Our block allocations are on the large-ish side (64 KB) to amortize across many allocations the expense of mapping new virtual memory from the OS. These large blocks are then shared between the MarkedSpace and the CopiedSpace. This design makes it difficult to vary the size of the blocks in different parts of the Heap while still allowing us to amortize the VM allocation costs.

We should redesign the BlockAllocator so that it has a layer of indirection between blocks that are used by the allocator/collector and our primary unit of VM allocation from the OS. In particular, the BlockAllocator should allocate Regions of virtual memory from the OS, which are then subdivided into one or more Blocks to be used in our custom allocators. This design has the following nice properties:

1) We can remove the knowledge of PageAlignedAllocations from HeapBlocks. Each HeapBlock will now only know what Region it belongs to. The Region maintains all the metadata for how to allocate and deallocate virtual memory from the OS.
2) We can easily allocate in larger chunks than we need to satisfy a particular request for a Block. We can then continue to amortize our VM allocation costs while allowing for smaller block sizes, which should increase locality in the mutator when allocating, lazy sweeping, etc.
3) By encapsulating the logic of where our memory comes from inside of the Region class, we can more easily transition over to allocating VM from a specific range of pre-reserved address space. This will be a necessary step along the way to 32-bit pointers.

This particular patch will not change the size of MarkedBlocks or CopiedBlocks, nor will it change how much VM we allocate per failed Block request. It only sets up the data structures that we need to make these changes later when we have more performance data.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>740358</commentid>
    <comment_count>1</comment_count>
      <attachid>168300</attachid>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2012-10-11 16:03:58 -0700</bug_when>
    <thetext>Created attachment 168300
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>740383</commentid>
    <comment_count>2</comment_count>
      <attachid>168300</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2012-10-11 16:17:28 -0700</bug_when>
    <thetext>Comment on attachment 168300
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>740465</commentid>
    <comment_count>3</comment_count>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2012-10-11 17:34:43 -0700</bug_when>
    <thetext>No change in performance according to the benchmarks we track.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>740560</commentid>
    <comment_count>4</comment_count>
      <attachid>168300</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-10-11 20:10:30 -0700</bug_when>
    <thetext>Comment on attachment 168300
Patch

Clearing flags on attachment: 168300

Committed r131132: &lt;http://trac.webkit.org/changeset/131132&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>740561</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-10-11 20:10:33 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>168300</attachid>
            <date>2012-10-11 16:03:58 -0700</date>
            <delta_ts>2012-10-11 20:10:30 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-99107-20121011160256.patch</filename>
            <type>text/plain</type>
            <size>32740</size>
            <attacher name="Mark Hahnenberg">mhahnenberg</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTMxMTA0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEwOCBA
QAorMjAxMi0xMC0xMSAgTWFyayBIYWhuZW5iZXJnICA8bWhhaG5lbmJlcmdAYXBwbGUuY29tPgor
CisgICAgICAgIEJsb2NrQWxsb2NhdG9yIHNob3VsZCB1c2UgcmVnaW9ucyBhcyBpdHMgVk0gYWxs
b2NhdGlvbiBhYnN0cmFjdGlvbgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9OTkxMDcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBDdXJyZW50bHkgdGhlIEJsb2NrQWxsb2NhdG9yIGFsbG9jYXRlcyBhIHNpbmds
ZSBibG9jayBhdCBhIHRpbWUgZGlyZWN0bHkgZnJvbSB0aGUgT1MuIE91ciBibG9jayAKKyAgICAg
ICAgYWxsb2NhdGlvbnMgYXJlIG9uIHRoZSBsYXJnZS1pc2ggc2lkZSAoNjQgS0IpIHRvIGFtb3J0
aXplIGFjcm9zcyBtYW55IGFsbG9jYXRpb25zIHRoZSBleHBlbnNlIG9mIAorICAgICAgICBtYXBw
aW5nIG5ldyB2aXJ0dWFsIG1lbW9yeSBmcm9tIHRoZSBPUy4gVGhlc2UgbGFyZ2UgYmxvY2tzIGFy
ZSB0aGVuIHNoYXJlZCBiZXR3ZWVuIHRoZSBNYXJrZWRTcGFjZSAKKyAgICAgICAgYW5kIHRoZSBD
b3BpZWRTcGFjZS4gVGhpcyBkZXNpZ24gbWFrZXMgaXQgZGlmZmljdWx0IHRvIHZhcnkgdGhlIHNp
emUgb2YgdGhlIGJsb2NrcyBpbiBkaWZmZXJlbnQgCisgICAgICAgIHBhcnRzIG9mIHRoZSBIZWFw
IHdoaWxlIHN0aWxsIGFsbG93aW5nIHVzIHRvIGFtb3J0aXplIHRoZSBWTSBhbGxvY2F0aW9uIGNv
c3RzLgorCisgICAgICAgIFdlIHNob3VsZCByZWRlc2lnbiB0aGUgQmxvY2tBbGxvY2F0b3Igc28g
dGhhdCBpdCBoYXMgYSBsYXllciBvZiBpbmRpcmVjdGlvbiBiZXR3ZWVuIGJsb2NrcyB0aGF0IGFy
ZSAKKyAgICAgICAgdXNlZCBieSB0aGUgYWxsb2NhdG9yL2NvbGxlY3RvciBhbmQgb3VyIHByaW1h
cnkgdW5pdCBvZiBWTSBhbGxvY2F0aW9uIGZyb20gdGhlIE9TLiBJbiBwYXJ0aWN1bGFyLCAKKyAg
ICAgICAgdGhlIEJsb2NrQWxsb2NhdG9yIHNob3VsZCBhbGxvY2F0ZSBSZWdpb25zIG9mIHZpcnR1
YWwgbWVtb3J5IGZyb20gdGhlIE9TLCB3aGljaCBhcmUgdGhlbiBzdWJkaXZpZGVkIAorICAgICAg
ICBpbnRvIG9uZSBvciBtb3JlIEJsb2NrcyB0byBiZSB1c2VkIGluIG91ciBjdXN0b20gYWxsb2Nh
dG9ycy4gVGhpcyBkZXNpZ24gaGFzIHRoZSBmb2xsb3dpbmcgbmljZSBwcm9wZXJ0aWVzOgorCisg
ICAgICAgIDEpIFdlIGNhbiByZW1vdmUgdGhlIGtub3dsZWRnZSBvZiBQYWdlQWxsb2NhdGlvbkFs
aWduZWQgZnJvbSBIZWFwQmxvY2tzLiBFYWNoIEhlYXBCbG9jayB3aWxsIG5vdyAKKyAgICAgICAg
ICAgb25seSBrbm93IHdoYXQgUmVnaW9uIGl0IGJlbG9uZ3MgdG8uIFRoZSBSZWdpb24gbWFpbnRh
aW5zIGFsbCB0aGUgbWV0YWRhdGEgZm9yIGhvdyB0byBhbGxvY2F0ZSAKKyAgICAgICAgICAgYW5k
IGRlYWxsb2NhdGUgdmlydHVhbCBtZW1vcnkgZnJvbSB0aGUgT1MuCisKKyAgICAgICAgMikgV2Ug
Y2FuIGVhc2lseSBhbGxvY2F0ZSBpbiBsYXJnZXIgY2h1bmtzIHRoYW4gd2UgbmVlZCB0byBzYXRp
c2Z5IGEgcGFydGljdWxhciByZXF1ZXN0IGZvciBhIEJsb2NrLiAKKyAgICAgICAgICAgV2UgY2Fu
IHRoZW4gY29udGludWUgdG8gYW1vcnRpemUgb3VyIFZNIGFsbG9jYXRpb24gY29zdHMgd2hpbGUg
YWxsb3dpbmcgZm9yIHNtYWxsZXIgYmxvY2sgc2l6ZXMsIAorICAgICAgICAgICB3aGljaCBzaG91
bGQgaW5jcmVhc2UgbG9jYWxpdHkgaW4gdGhlIG11dGF0b3Igd2hlbiBhbGxvY2F0aW5nLCBsYXp5
IHN3ZWVwaW5nLCBldGMuCisKKyAgICAgICAgMykgQnkgZW5jYXBzdWxhdGluZyB0aGUgbG9naWMg
b2Ygd2hlcmUgb3VyIG1lbW9yeSBjb21lcyBmcm9tIGluc2lkZSBvZiB0aGUgUmVnaW9uIGNsYXNz
LCB3ZSBjYW4gbW9yZSAKKyAgICAgICAgICAgZWFzaWx5IHRyYW5zaXRpb24gb3ZlciB0byBhbGxv
Y2F0aW5nIFZNIGZyb20gYSBzcGVjaWZpYyByYW5nZSBvZiBwcmUtcmVzZXJ2ZWQgYWRkcmVzcyBz
cGFjZS4gVGhpcyAKKyAgICAgICAgICAgd2lsbCBiZSBhIG5lY2Vzc2FyeSBzdGVwIGFsb25nIHRo
ZSB3YXkgdG8gMzItYml0IHBvaW50ZXJzLgorCisgICAgICAgIFRoaXMgcGFydGljdWxhciBwYXRj
aCB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgTWFya2VkQmxvY2tzIG9yIENvcGllZEJsb2Nr
cywgbm9yIHdpbGwgaXQgY2hhbmdlIGhvdyAKKyAgICAgICAgbXVjaCBWTSB3ZSBhbGxvY2F0ZSBw
ZXIgZmFpbGVkIEJsb2NrIHJlcXVlc3QuIEl0IG9ubHkgc2V0cyB1cCB0aGUgZGF0YSBzdHJ1Y3R1
cmVzIHRoYXQgd2UgbmVlZCB0byBtYWtlIAorICAgICAgICB0aGVzZSBjaGFuZ2VzIGluIGZ1dHVy
ZSBwYXRjaGVzLgorCisgICAgICAgIE1vc3Qgb2YgdGhlIGNoYW5nZXMgaW4gdGhpcyBwYXRjaCBy
ZWxhdGUgdG8gdGhlIGFkZGl0aW9uIG9mIHRoZSBSZWdpb24gY2xhc3MgdG8gYmUgdXNlZCBieSB0
aGUgCisgICAgICAgIEJsb2NrQWxsb2NhdG9yIGFuZCB0aGUgdGhyZWFkaW5nIG9mIGNoYW5nZXMg
bWFkZSB0byBCbG9ja0FsbG9jYXRvcidzIGludGVyZmFjZSB0aHJvdWdoIHRvIHRoZSBjYWxsIHNp
dGVzLgorCisgICAgICAgICogaGVhcC9CbG9ja0FsbG9jYXRvci5jcHA6IFRoZSBCbG9ja0FsbG9j
YXRvciBub3cgaGFzIHRocmVlIGxpc3RzIHRoYXQgdHJhY2sgdGhlIHRocmVlIGRpc2pvaW50IHNl
dHMgb2YKKyAgICAgICAgUmVnaW9ucyB0aGF0IGl0IGNhcmVzIGFib3V0OiBlbXB0eSByZWdpb25z
LCBwYXJ0aWFsbHkgZnVsbCByZWdpb25zLCBhbmQgY29tcGxldGVseSBmdWxsIHJlZ2lvbnMuIAor
ICAgICAgICBFbXB0eSByZWdpb25zIGhhdmUgbm8gYmxvY2tzIGN1cnJlbnRseSBpbiB1c2UgYW5k
IGNhbiBiZSBmcmVlZCBpbW1lZGlhdGVseSBpZiB0aGUgZnJlZWluZyB0aHJlYWQgCisgICAgICAg
IGRldGVybWluZXMgdGhleSBzaG91bGQgYmUuIFBhcnRpYWwgcmVnaW9ucyBoYXZlIHNvbWUgYmxv
Y2tzIHVzZWQsIGJ1dCBhcmVuJ3QgY29tcGxldGVseSBpbiB1c2UgeWV0LiAKKyAgICAgICAgVGhl
c2UgcmVnaW9ucyBhcmUgcHJlZmVycmVkIGZvciByZWN5Y2xpbmcgYmVmb3JlIGVtcHR5IHJlZ2lv
bnMgdG8gbWl0aWdhdGUgZnJhZ21lbnRhdGlvbiB3aXRoaW4gcmVnaW9ucy4KKyAgICAgICAgQ29t
cGxldGVseSBmdWxsIHJlZ2lvbnMgYXJlIG5vIGxvbmdlciBhYmxlIHRvIGJlIHVzZWQgZm9yIGFs
bG9jYXRpb25zLiBSZWdpb25zIG1vdmUgYmV0d2VlbiB0aGVzZSAKKyAgICAgICAgdGhyZWUgbGlz
dHMgYXMgdGhleSBhcmUgY3JlYXRlZCBhbmQgdGhlaXIgY29uc3RpdHVlbnQgYmxvY2tzIGFyZSBh
bGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkLgorICAgICAgICAoSlNDOjpCbG9ja0FsbG9jYXRvcjo6
QmxvY2tBbGxvY2F0b3IpOgorICAgICAgICAoSlNDOjpCbG9ja0FsbG9jYXRvcjo6fkJsb2NrQWxs
b2NhdG9yKToKKyAgICAgICAgKEpTQzo6QmxvY2tBbGxvY2F0b3I6OnJlbGVhc2VGcmVlUmVnaW9u
cyk6CisgICAgICAgIChKU0M6OkJsb2NrQWxsb2NhdG9yOjp3YWl0Rm9yUmVsYXRpdmVUaW1lV2hp
bGVIb2xkaW5nTG9jayk6CisgICAgICAgIChKU0M6OkJsb2NrQWxsb2NhdG9yOjp3YWl0Rm9yUmVs
YXRpdmVUaW1lKToKKyAgICAgICAgKEpTQzo6QmxvY2tBbGxvY2F0b3I6OmJsb2NrRnJlZWluZ1Ro
cmVhZE1haW4pOgorICAgICAgICAqIGhlYXAvQmxvY2tBbGxvY2F0b3IuaDoKKyAgICAgICAgKEpT
Qyk6CisgICAgICAgIChEZWFkQmxvY2spOgorICAgICAgICAoSlNDOjpEZWFkQmxvY2s6OkRlYWRC
bG9jayk6CisgICAgICAgIChSZWdpb24pOgorICAgICAgICAoSlNDOjpSZWdpb246OmJsb2NrU2l6
ZSk6CisgICAgICAgIChKU0M6OlJlZ2lvbjo6aXNGdWxsKToKKyAgICAgICAgKEpTQzo6UmVnaW9u
Ojppc0VtcHR5KToKKyAgICAgICAgKEpTQzo6UmVnaW9uOjpjcmVhdGUpOiBUaGlzIGZ1bmN0aW9u
IGlzIHJlc3BvbnNpYmxlIGZvciBkb2luZyB0aGUgYWN0dWFsIFZNIGFsbG9jYXRpb24uIFRoaXMg
c2hvdWxkIGJlIHRoZSAKKyAgICAgICAgb25seSBmdW5jdGlvbiBpbiB0aGUgZW50aXJlIEpTQyBv
YmplY3QgcnVudGltZSB0aGF0IGNhbGxzIG91dCB0aGUgT1MgZm9yIHZpcnR1YWwgbWVtb3J5IGFs
bG9jYXRpb24uCisgICAgICAgIChKU0M6OlJlZ2lvbjo6UmVnaW9uKToKKyAgICAgICAgKEpTQzo6
UmVnaW9uOjp+UmVnaW9uKToKKyAgICAgICAgKEpTQzo6UmVnaW9uOjphbGxvY2F0ZSk6CisgICAg
ICAgIChKU0M6OlJlZ2lvbjo6ZGVhbGxvY2F0ZSk6CisgICAgICAgIChCbG9ja0FsbG9jYXRvcik6
CisgICAgICAgIChKU0M6OkJsb2NrQWxsb2NhdG9yOjp0cnlBbGxvY2F0ZUZyb21SZWdpb24pOiBI
ZWxwZXIgZnVuY3Rpb24gdGhhdCBlbmNhcHN1bGF0ZXMgY2hlY2tpbmcgYSBwYXJ0aWN1bGFyIGxp
c3QgCisgICAgICAgIG9mIHJlZ2lvbnMgZm9yIGEgZnJlZSBibG9jay4KKyAgICAgICAgKEpTQzo6
QmxvY2tBbGxvY2F0b3I6OmFsbG9jYXRlKToKKyAgICAgICAgKEpTQzo6QmxvY2tBbGxvY2F0b3I6
OmFsbG9jYXRlQ3VzdG9tU2l6ZSk6IFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFs
bG9jYXRpbmcgb25lLW9mZiBjdXN0b20gc2l6ZSAKKyAgICAgICAgcmVnaW9ucyBmb3IgdXNlIGlu
IG92ZXJzaXplIGFsbG9jYXRpb25zIGluIGJvdGggdGhlIE1hcmtlZFNwYWNlIGFuZCB0aGUgQ29w
aWVkU3BhY2UuIFRoZXNlIHJlZ2lvbnMgYXJlIG5vdCAKKyAgICAgICAgdHJhY2tlZCBieSB0aGUg
QmxvY2tBbGxvY2F0b3IuIFRoZSBvbmx5IHBvaW50ZXIgdG8gdGhlbSBpcyBpbiB0aGUgSGVhcEJs
b2NrIHRoYXQgaXMgcmV0dXJuZWQuIFRoZXNlIHJlZ2lvbnMgCisgICAgICAgIGNvbnRhaW4gZXhh
Y3RseSBvbmUgYmxvY2suCisgICAgICAgIChKU0M6OkJsb2NrQWxsb2NhdG9yOjpkZWFsbG9jYXRl
KToKKyAgICAgICAgKEpTQzo6QmxvY2tBbGxvY2F0b3I6OmRlYWxsb2NhdGVDdXN0b21TaXplKTog
VGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIG9uZS1vZmYgY3Vz
dG9tIHNpemUKKyAgICAgICAgcmVnaW9ucy4gVGhlIHJlZ2lvbnMgYXJlIGRlYWxsb2NhdGVkIGJh
Y2sgdG8gdGhlIE9TIGVhZ2VybHkuCisgICAgICAgICogaGVhcC9Db3BpZWRCbG9jay5oOiBSZS13
b3JrZWQgQ29waWVkQmxvY2tzIHRvIHVzZSBSZWdpb25zIGluc3RlYWQgb2YgUGFnZUFsbG9jYXRp
b25BbGlnbmVkLgorICAgICAgICAoQ29waWVkQmxvY2spOgorICAgICAgICAoSlNDOjpDb3BpZWRC
bG9jazo6Y3JlYXRlTm9aZXJvRmlsbCk6CisgICAgICAgIChKU0M6OkNvcGllZEJsb2NrOjpjcmVh
dGUpOgorICAgICAgICAoSlNDOjpDb3BpZWRCbG9jazo6Q29waWVkQmxvY2spOgorICAgICAgICAo
SlNDOjpDb3BpZWRCbG9jazo6cGF5bG9hZEVuZCk6CisgICAgICAgIChKU0M6OkNvcGllZEJsb2Nr
OjpjYXBhY2l0eSk6CisgICAgICAgICogaGVhcC9Db3BpZWRTcGFjZS5jcHA6CisgICAgICAgIChK
U0M6OkNvcGllZFNwYWNlOjp+Q29waWVkU3BhY2UpOgorICAgICAgICAoSlNDOjpDb3BpZWRTcGFj
ZTo6dHJ5QWxsb2NhdGVPdmVyc2l6ZSk6CisgICAgICAgIChKU0M6OkNvcGllZFNwYWNlOjp0cnlS
ZWFsbG9jYXRlT3ZlcnNpemUpOgorICAgICAgICAoSlNDOjpDb3BpZWRTcGFjZTo6ZG9uZUNvcHlp
bmcpOgorICAgICAgICAqIGhlYXAvQ29waWVkU3BhY2VJbmxpbmVNZXRob2RzLmg6CisgICAgICAg
IChKU0M6OkNvcGllZFNwYWNlOjphbGxvY2F0ZUJsb2NrRm9yQ29weWluZ1BoYXNlKToKKyAgICAg
ICAgKEpTQzo6Q29waWVkU3BhY2U6OmFsbG9jYXRlQmxvY2spOgorICAgICAgICAqIGhlYXAvSGVh
cEJsb2NrLmg6CisgICAgICAgIChKU0M6OkhlYXBCbG9jazo6ZGVzdHJveSk6CisgICAgICAgIChK
U0M6OkhlYXBCbG9jazo6SGVhcEJsb2NrKToKKyAgICAgICAgKEpTQzo6SGVhcEJsb2NrOjpyZWdp
b24pOgorICAgICAgICAoSGVhcEJsb2NrKToKKyAgICAgICAgKiBoZWFwL01hcmtlZEFsbG9jYXRv
ci5jcHA6CisgICAgICAgIChKU0M6Ok1hcmtlZEFsbG9jYXRvcjo6YWxsb2NhdGVCbG9jayk6Cisg
ICAgICAgICogaGVhcC9NYXJrZWRCbG9jay5jcHA6CisgICAgICAgIChKU0M6Ok1hcmtlZEJsb2Nr
OjpjcmVhdGUpOgorICAgICAgICAoSlNDOjpNYXJrZWRCbG9jazo6TWFya2VkQmxvY2spOgorICAg
ICAgICAqIGhlYXAvTWFya2VkQmxvY2suaDoKKyAgICAgICAgKEpTQzo6TWFya2VkQmxvY2s6OmNh
cGFjaXR5KToKKyAgICAgICAgKiBoZWFwL01hcmtlZFNwYWNlLmNwcDoKKyAgICAgICAgKEpTQzo6
TWFya2VkU3BhY2U6OmZyZWVCbG9jayk6CisKIDIwMTItMTAtMTEgIEZpbGlwIFBpemxvICA8ZnBp
emxvQGFwcGxlLmNvbT4KIAogICAgICAgICBVSW50MzJUb051bWJlciBhbmQgT1NSIGV4aXQgc2hv
dWxkIGJlIGF3YXJlIG9mIGNvcHkgcHJvcGFnYXRpb24gYW5kIGNvcnJlY3RseSByZWNvdmVyIGJv
dGggdmVyc2lvbnMgb2YgYSB2YXJpYWJsZSB0aGF0IHdhcyBzdWJqZWN0IHRvIGEgVUludDMyVG9O
dW1iZXIgY2FzdApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvQmxvY2tBbGxvY2F0
b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0Jsb2NrQWxs
b2NhdG9yLmNwcAkocmV2aXNpb24gMTMxMDY5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2hl
YXAvQmxvY2tBbGxvY2F0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw0NiArMzEsNDYgQEAK
IG5hbWVzcGFjZSBKU0MgewogCiBCbG9ja0FsbG9jYXRvcjo6QmxvY2tBbGxvY2F0b3IoKQotICAg
IDogbV9udW1iZXJPZkZyZWVCbG9ja3MoMCkKKyAgICA6IG1fbnVtYmVyT2ZFbXB0eVJlZ2lvbnMo
MCkKKyAgICAsIG1fbnVtYmVyT2ZQYXJ0aWFsUmVnaW9ucygwKQogICAgICwgbV9pc0N1cnJlbnRs
eUFsbG9jYXRpbmcoZmFsc2UpCiAgICAgLCBtX2Jsb2NrRnJlZWluZ1RocmVhZFNob3VsZFF1aXQo
ZmFsc2UpCiAgICAgLCBtX2Jsb2NrRnJlZWluZ1RocmVhZChjcmVhdGVUaHJlYWQoYmxvY2tGcmVl
aW5nVGhyZWFkU3RhcnRGdW5jLCB0aGlzLCAiSmF2YVNjcmlwdENvcmU6OkJsb2NrRnJlZSIpKQog
ewogICAgIEFTU0VSVChtX2Jsb2NrRnJlZWluZ1RocmVhZCk7Ci0gICAgbV9mcmVlQmxvY2tMb2Nr
LkluaXQoKTsKKyAgICBtX3JlZ2lvbkxvY2suSW5pdCgpOwogfQogCiBCbG9ja0FsbG9jYXRvcjo6
fkJsb2NrQWxsb2NhdG9yKCkKIHsKLSAgICByZWxlYXNlRnJlZUJsb2NrcygpOworICAgIHJlbGVh
c2VGcmVlUmVnaW9ucygpOwogICAgIHsKLSAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fZnJl
ZUJsb2NrQ29uZGl0aW9uTG9jayk7Ci0KKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fZW1w
dHlSZWdpb25Db25kaXRpb25Mb2NrKTsKICAgICAgICAgbV9ibG9ja0ZyZWVpbmdUaHJlYWRTaG91
bGRRdWl0ID0gdHJ1ZTsKLSAgICAgICAgbV9mcmVlQmxvY2tDb25kaXRpb24uYnJvYWRjYXN0KCk7
CisgICAgICAgIG1fZW1wdHlSZWdpb25Db25kaXRpb24uYnJvYWRjYXN0KCk7CiAgICAgfQogICAg
IHdhaXRGb3JUaHJlYWRDb21wbGV0aW9uKG1fYmxvY2tGcmVlaW5nVGhyZWFkKTsKIH0KIAotdm9p
ZCBCbG9ja0FsbG9jYXRvcjo6cmVsZWFzZUZyZWVCbG9ja3MoKQordm9pZCBCbG9ja0FsbG9jYXRv
cjo6cmVsZWFzZUZyZWVSZWdpb25zKCkKIHsKICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBE
ZWFkQmxvY2sqIGJsb2NrOworICAgICAgICBSZWdpb24qIHJlZ2lvbjsKICAgICAgICAgewotICAg
ICAgICAgICAgU3BpbkxvY2tIb2xkZXIgbG9ja2VyKCZtX2ZyZWVCbG9ja0xvY2spOwotICAgICAg
ICAgICAgaWYgKCFtX251bWJlck9mRnJlZUJsb2NrcykKLSAgICAgICAgICAgICAgICBibG9jayA9
IDA7CisgICAgICAgICAgICBTcGluTG9ja0hvbGRlciBsb2NrZXIoJm1fcmVnaW9uTG9jayk7Cisg
ICAgICAgICAgICBpZiAoIW1fbnVtYmVyT2ZFbXB0eVJlZ2lvbnMpCisgICAgICAgICAgICAgICAg
cmVnaW9uID0gMDsKICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJsb2NrID0g
bV9mcmVlQmxvY2tzLnJlbW92ZUhlYWQoKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQoYmxvY2sp
OwotICAgICAgICAgICAgICAgIG1fbnVtYmVyT2ZGcmVlQmxvY2tzLS07CisgICAgICAgICAgICAg
ICAgcmVnaW9uID0gbV9lbXB0eVJlZ2lvbnMucmVtb3ZlSGVhZCgpOworICAgICAgICAgICAgICAg
IEFTU0VSVChyZWdpb24pOworICAgICAgICAgICAgICAgIG1fbnVtYmVyT2ZFbXB0eVJlZ2lvbnMt
LTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgaWYgKCFibG9j
aykKKyAgICAgICAgaWYgKCFyZWdpb24pCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBE
ZWFkQmxvY2s6OmRlc3Ryb3koYmxvY2spLmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIHJl
Z2lvbjsKICAgICB9CiB9CiAKQEAgLTc5LDcgKzc5LDcgQEAgdm9pZCBCbG9ja0FsbG9jYXRvcjo6
d2FpdEZvclJlbGF0aXZlVGltZQogICAgIGlmIChtX2Jsb2NrRnJlZWluZ1RocmVhZFNob3VsZFF1
aXQpCiAgICAgICAgIHJldHVybjsKIAotICAgIG1fZnJlZUJsb2NrQ29uZGl0aW9uLnRpbWVkV2Fp
dChtX2ZyZWVCbG9ja0NvbmRpdGlvbkxvY2ssIGN1cnJlbnRUaW1lKCkgKyByZWxhdGl2ZSk7Cisg
ICAgbV9lbXB0eVJlZ2lvbkNvbmRpdGlvbi50aW1lZFdhaXQobV9lbXB0eVJlZ2lvbkNvbmRpdGlv
bkxvY2ssIGN1cnJlbnRUaW1lKCkgKyByZWxhdGl2ZSk7CiB9CiAKIHZvaWQgQmxvY2tBbGxvY2F0
b3I6OndhaXRGb3JSZWxhdGl2ZVRpbWUoZG91YmxlIHJlbGF0aXZlKQpAQCAtODgsNyArODgsNyBA
QCB2b2lkIEJsb2NrQWxsb2NhdG9yOjp3YWl0Rm9yUmVsYXRpdmVUaW1lCiAgICAgLy8gZnJlcXVl
bnRseS4gSXQgd291bGQgb25seSBiZSBhIGJ1ZyBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxlZCB0byBy
ZXR1cm4KICAgICAvLyB3aGVuIGl0IHdhcyBhc2tlZCB0byBkbyBzby4KICAgICAKLSAgICBNdXRl
eExvY2tlciBsb2NrZXIobV9mcmVlQmxvY2tDb25kaXRpb25Mb2NrKTsKKyAgICBNdXRleExvY2tl
ciBsb2NrZXIobV9lbXB0eVJlZ2lvbkNvbmRpdGlvbkxvY2spOwogICAgIHdhaXRGb3JSZWxhdGl2
ZVRpbWVXaGlsZUhvbGRpbmdMb2NrKHJlbGF0aXZlKTsKIH0KIApAQCAtMTE0LDQwICsxMTQsNDAg
QEAgdm9pZCBCbG9ja0FsbG9jYXRvcjo6YmxvY2tGcmVlaW5nVGhyZWFkTQogICAgICAgICAvLyBO
b3cgcHJvY2VzcyB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gS2VlcCBmcmVlaW5nIHVudGlsIGhh
bGYgb2YgdGhlCiAgICAgICAgIC8vIGJsb2NrcyB0aGF0IGFyZSBjdXJyZW50bHkgb24gdGhlIGxp
c3QgYXJlIGdvbmUuIEFzc3VtZSB0aGF0IGEgc2l6ZV90CiAgICAgICAgIC8vIGZpZWxkIGNhbiBi
ZSBhY2Nlc3NlZCBhdG9taWNhbGx5LgotICAgICAgICBzaXplX3QgY3VycmVudE51bWJlck9mRnJl
ZUJsb2NrcyA9IG1fbnVtYmVyT2ZGcmVlQmxvY2tzOwotICAgICAgICBpZiAoIWN1cnJlbnROdW1i
ZXJPZkZyZWVCbG9ja3MpCisgICAgICAgIHNpemVfdCBjdXJyZW50TnVtYmVyT2ZFbXB0eVJlZ2lv
bnMgPSBtX251bWJlck9mRW1wdHlSZWdpb25zOworICAgICAgICBpZiAoIWN1cnJlbnROdW1iZXJP
ZkVtcHR5UmVnaW9ucykKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAKLSAgICAgICAg
c2l6ZV90IGRlc2lyZWROdW1iZXJPZkZyZWVCbG9ja3MgPSBjdXJyZW50TnVtYmVyT2ZGcmVlQmxv
Y2tzIC8gMjsKKyAgICAgICAgc2l6ZV90IGRlc2lyZWROdW1iZXJPZkVtcHR5UmVnaW9ucyA9IGN1
cnJlbnROdW1iZXJPZkVtcHR5UmVnaW9ucyAvIDI7CiAgICAgICAgIAogICAgICAgICB3aGlsZSAo
IW1fYmxvY2tGcmVlaW5nVGhyZWFkU2hvdWxkUXVpdCkgewotICAgICAgICAgICAgRGVhZEJsb2Nr
KiBibG9jazsKKyAgICAgICAgICAgIFJlZ2lvbiogcmVnaW9uOwogICAgICAgICAgICAgewotICAg
ICAgICAgICAgICAgIFNwaW5Mb2NrSG9sZGVyIGxvY2tlcigmbV9mcmVlQmxvY2tMb2NrKTsKLSAg
ICAgICAgICAgICAgICBpZiAobV9udW1iZXJPZkZyZWVCbG9ja3MgPD0gZGVzaXJlZE51bWJlck9m
RnJlZUJsb2NrcykKLSAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSAwOworICAgICAgICAgICAg
ICAgIFNwaW5Mb2NrSG9sZGVyIGxvY2tlcigmbV9yZWdpb25Mb2NrKTsKKyAgICAgICAgICAgICAg
ICBpZiAobV9udW1iZXJPZkVtcHR5UmVnaW9ucyA8PSBkZXNpcmVkTnVtYmVyT2ZFbXB0eVJlZ2lv
bnMpCisgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9IDA7CiAgICAgICAgICAgICAgICAgZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbV9mcmVlQmxvY2tzLnJlbW92ZUhlYWQo
KTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGJsb2NrKTsKLSAgICAgICAgICAgICAgICAg
ICAgbV9udW1iZXJPZkZyZWVCbG9ja3MtLTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaW9uID0g
bV9lbXB0eVJlZ2lvbnMucmVtb3ZlSGVhZCgpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlQo
cmVnaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbV9udW1iZXJPZkVtcHR5UmVnaW9ucy0tOwog
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICAg
ICAgaWYgKCFibG9jaykKKyAgICAgICAgICAgIGlmICghcmVnaW9uKQogICAgICAgICAgICAgICAg
IGJyZWFrOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBEZWFkQmxvY2s6OmRlc3Ryb3koYmxv
Y2spLmRlYWxsb2NhdGUoKTsKKyAgICAgICAgICAgIGRlbGV0ZSByZWdpb247CiAgICAgICAgIH0K
IAogICAgICAgICAvLyBTbGVlcCB1bnRpbCB0aGVyZSBpcyBhY3R1YWxseSB3b3JrIHRvIGRvIHJh
dGhlciB0aGFuIHdha2luZyB1cCBldmVyeSBzZWNvbmQgdG8gY2hlY2suCi0gICAgICAgIE11dGV4
TG9ja2VyIGxvY2tlcihtX2ZyZWVCbG9ja0NvbmRpdGlvbkxvY2spOwotICAgICAgICBtX2ZyZWVC
bG9ja0xvY2suTG9jaygpOwotICAgICAgICB3aGlsZSAoIW1fbnVtYmVyT2ZGcmVlQmxvY2tzICYm
ICFtX2Jsb2NrRnJlZWluZ1RocmVhZFNob3VsZFF1aXQpIHsKLSAgICAgICAgICAgIG1fZnJlZUJs
b2NrTG9jay5VbmxvY2soKTsKLSAgICAgICAgICAgIG1fZnJlZUJsb2NrQ29uZGl0aW9uLndhaXQo
bV9mcmVlQmxvY2tDb25kaXRpb25Mb2NrKTsKLSAgICAgICAgICAgIG1fZnJlZUJsb2NrTG9jay5M
b2NrKCk7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2VtcHR5UmVnaW9uQ29uZGl0aW9u
TG9jayk7CisgICAgICAgIG1fcmVnaW9uTG9jay5Mb2NrKCk7CisgICAgICAgIHdoaWxlICghbV9u
dW1iZXJPZkVtcHR5UmVnaW9ucyAmJiAhbV9ibG9ja0ZyZWVpbmdUaHJlYWRTaG91bGRRdWl0KSB7
CisgICAgICAgICAgICBtX3JlZ2lvbkxvY2suVW5sb2NrKCk7CisgICAgICAgICAgICBtX2VtcHR5
UmVnaW9uQ29uZGl0aW9uLndhaXQobV9lbXB0eVJlZ2lvbkNvbmRpdGlvbkxvY2spOworICAgICAg
ICAgICAgbV9yZWdpb25Mb2NrLkxvY2soKTsKICAgICAgICAgfQotICAgICAgICBtX2ZyZWVCbG9j
a0xvY2suVW5sb2NrKCk7CisgICAgICAgIG1fcmVnaW9uTG9jay5VbmxvY2soKTsKICAgICB9CiB9
CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0Jsb2NrQWxsb2NhdG9yLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvQmxvY2tBbGxvY2F0b3IuaAko
cmV2aXNpb24gMTMxMDY5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvQmxvY2tBbGxv
Y2F0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMzUsMjUgKzM1LDk0IEBACiAKIG5hbWVzcGFjZSBK
U0MgewogCitjbGFzcyBDb3BpZWRCbG9jazsKK2NsYXNzIE1hcmtlZEJsb2NrOworY2xhc3MgUmVn
aW9uOworCiAvLyBTaW1wbGUgYWxsb2NhdG9yIHRvIHJlZHVjZSBWTSBjb3N0IGJ5IGhvbGRpbmcg
b250byBibG9ja3Mgb2YgbWVtb3J5IGZvcgogLy8gc2hvcnQgcGVyaW9kcyBvZiB0aW1lIGFuZCB0
aGVuIGZyZWVpbmcgdGhlbSBvbiBhIHNlY29uZGFyeSB0aHJlYWQuCiAKIGNsYXNzIERlYWRCbG9j
ayA6IHB1YmxpYyBIZWFwQmxvY2s8RGVhZEJsb2NrPiB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIERl
YWRCbG9jayogY3JlYXRlKGNvbnN0IFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCYpOworICAgIERlYWRC
bG9jayhSZWdpb24qKTsKK307CisKK2lubGluZSBEZWFkQmxvY2s6OkRlYWRCbG9jayhSZWdpb24q
IHJlZ2lvbikKKyAgICA6IEhlYXBCbG9jazxEZWFkQmxvY2s+KHJlZ2lvbikKK3sKK30KKworY2xh
c3MgUmVnaW9uIDogcHVibGljIERvdWJseUxpbmtlZExpc3ROb2RlPFJlZ2lvbj4geworICAgIGZy
aWVuZCBDTEFTU19JRl9HQ0MgRG91Ymx5TGlua2VkTGlzdE5vZGU8UmVnaW9uPjsKK3B1YmxpYzoK
KyAgICB+UmVnaW9uKCk7CisgICAgc3RhdGljIFJlZ2lvbiogY3JlYXRlKHNpemVfdCBibG9ja1Np
emUsIHNpemVfdCBibG9ja0FsaWdubWVudCwgc2l6ZV90IG51bWJlck9mQmxvY2tzKTsKKworICAg
IHNpemVfdCBibG9ja1NpemUoKSBjb25zdCB7IHJldHVybiBtX2Jsb2NrU2l6ZTsgfQorICAgIGJv
b2wgaXNGdWxsKCkgY29uc3QgeyByZXR1cm4gbV9ibG9ja3NJblVzZSA9PSBtX3RvdGFsQmxvY2tz
OyB9CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIW1fYmxvY2tzSW5Vc2U7IH0K
KworICAgIERlYWRCbG9jayogYWxsb2NhdGUoKTsKKyAgICB2b2lkIGRlYWxsb2NhdGUodm9pZCop
OwogCiBwcml2YXRlOgotICAgIERlYWRCbG9jayhjb25zdCBQYWdlQWxsb2NhdGlvbkFsaWduZWQm
KTsKKyAgICBSZWdpb24oUGFnZUFsbG9jYXRpb25BbGlnbmVkJiwgc2l6ZV90IGJsb2NrU2l6ZSwg
c2l6ZV90IHRvdGFsQmxvY2tzKTsKKworICAgIFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCBtX2FsbG9j
YXRpb247CisgICAgc2l6ZV90IG1fdG90YWxCbG9ja3M7CisgICAgc2l6ZV90IG1fYmxvY2tzSW5V
c2U7CisgICAgc2l6ZV90IG1fYmxvY2tTaXplOworICAgIFJlZ2lvbiogbV9wcmV2OworICAgIFJl
Z2lvbiogbV9uZXh0OworICAgIERvdWJseUxpbmtlZExpc3Q8RGVhZEJsb2NrPiBtX2RlYWRCbG9j
a3M7CiB9OwogCi1pbmxpbmUgRGVhZEJsb2NrOjpEZWFkQmxvY2soY29uc3QgUGFnZUFsbG9jYXRp
b25BbGlnbmVkJiBhbGxvY2F0aW9uKQotICAgIDogSGVhcEJsb2NrPERlYWRCbG9jaz4oYWxsb2Nh
dGlvbikKK2lubGluZSBSZWdpb24qIFJlZ2lvbjo6Y3JlYXRlKHNpemVfdCBibG9ja1NpemUsIHNp
emVfdCBibG9ja0FsaWdubWVudCwgc2l6ZV90IG51bWJlck9mQmxvY2tzKQoreworICAgIHNpemVf
dCByZWdpb25TaXplID0gYmxvY2tTaXplICogbnVtYmVyT2ZCbG9ja3M7CisgICAgUGFnZUFsbG9j
YXRpb25BbGlnbmVkIGFsbG9jYXRpb24gPSBQYWdlQWxsb2NhdGlvbkFsaWduZWQ6OmFsbG9jYXRl
KHJlZ2lvblNpemUsIGJsb2NrQWxpZ25tZW50LCBPU0FsbG9jYXRvcjo6SlNHQ0hlYXBQYWdlcyk7
CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPihhbGxvY2F0aW9uKSkKKyAgICAgICAgQ1JBU0go
KTsKKyAgICByZXR1cm4gbmV3IFJlZ2lvbihhbGxvY2F0aW9uLCBibG9ja1NpemUsIG51bWJlck9m
QmxvY2tzKTsKK30KKworaW5saW5lIFJlZ2lvbjo6UmVnaW9uKFBhZ2VBbGxvY2F0aW9uQWxpZ25l
ZCYgYWxsb2NhdGlvbiwgc2l6ZV90IGJsb2NrU2l6ZSwgc2l6ZV90IHRvdGFsQmxvY2tzKQorICAg
IDogRG91Ymx5TGlua2VkTGlzdE5vZGU8UmVnaW9uPigpCisgICAgLCBtX2FsbG9jYXRpb24oYWxs
b2NhdGlvbikKKyAgICAsIG1fdG90YWxCbG9ja3ModG90YWxCbG9ja3MpCisgICAgLCBtX2Jsb2Nr
c0luVXNlKDApCisgICAgLCBtX2Jsb2NrU2l6ZShibG9ja1NpemUpCisgICAgLCBtX3ByZXYoMCkK
KyAgICAsIG1fbmV4dCgwKQoreworICAgIEFTU0VSVChhbGxvY2F0aW9uKTsKKyAgICBjaGFyKiBz
dGFydCA9IHN0YXRpY19jYXN0PGNoYXIqPihhbGxvY2F0aW9uLmJhc2UoKSk7CisgICAgY2hhciog
ZW5kID0gc3RhcnQgKyBhbGxvY2F0aW9uLnNpemUoKTsKKyAgICBmb3IgKGNoYXIqIGN1cnJlbnQg
PSBzdGFydDsgY3VycmVudCA8IGVuZDsgY3VycmVudCArPSBibG9ja1NpemUpCisgICAgICAgIG1f
ZGVhZEJsb2Nrcy5hcHBlbmQobmV3IChOb3ROdWxsLCBjdXJyZW50KSBEZWFkQmxvY2sodGhpcykp
OworfQorCitpbmxpbmUgUmVnaW9uOjp+UmVnaW9uKCkKK3sKKyAgICBBU1NFUlQoIW1fYmxvY2tz
SW5Vc2UpOworICAgIG1fYWxsb2NhdGlvbi5kZWFsbG9jYXRlKCk7Cit9CisKK2lubGluZSBEZWFk
QmxvY2sqIFJlZ2lvbjo6YWxsb2NhdGUoKQogeworICAgIEFTU0VSVCghaXNGdWxsKCkpOworICAg
IG1fYmxvY2tzSW5Vc2UrKzsKKyAgICByZXR1cm4gbV9kZWFkQmxvY2tzLnJlbW92ZUhlYWQoKTsK
IH0KIAotaW5saW5lIERlYWRCbG9jayogRGVhZEJsb2NrOjpjcmVhdGUoY29uc3QgUGFnZUFsbG9j
YXRpb25BbGlnbmVkJiBhbGxvY2F0aW9uKQoraW5saW5lIHZvaWQgUmVnaW9uOjpkZWFsbG9jYXRl
KHZvaWQqIGJhc2UpCiB7Ci0gICAgcmV0dXJuIG5ldyhOb3ROdWxsLCBhbGxvY2F0aW9uLmJhc2Uo
KSkgRGVhZEJsb2NrKGFsbG9jYXRpb24pOworICAgIEFTU0VSVChiYXNlKTsKKyAgICBBU1NFUlQo
bV9ibG9ja3NJblVzZSk7CisgICAgQVNTRVJUKGJhc2UgPj0gbV9hbGxvY2F0aW9uLmJhc2UoKSAm
JiBiYXNlIDwgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fYWxsb2NhdGlvbi5iYXNlKCkpICsgbV9hbGxv
Y2F0aW9uLnNpemUoKSk7CisgICAgRGVhZEJsb2NrKiBibG9jayA9IG5ldyAoTm90TnVsbCwgYmFz
ZSkgRGVhZEJsb2NrKHRoaXMpOworICAgIG1fZGVhZEJsb2Nrcy5wdXNoKGJsb2NrKTsKKyAgICBt
X2Jsb2Nrc0luVXNlLS07CiB9CiAKIGNsYXNzIEJsb2NrQWxsb2NhdG9yIHsKQEAgLTYxLDYyICsx
MzAsMTE3IEBAIHB1YmxpYzoKICAgICBCbG9ja0FsbG9jYXRvcigpOwogICAgIH5CbG9ja0FsbG9j
YXRvcigpOwogCi0gICAgUGFnZUFsbG9jYXRpb25BbGlnbmVkIGFsbG9jYXRlKCk7Ci0gICAgdm9p
ZCBkZWFsbG9jYXRlKFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCk7CisgICAgdGVtcGxhdGUgPHR5cGVu
YW1lIFQ+IERlYWRCbG9jayogYWxsb2NhdGUoKTsKKyAgICBEZWFkQmxvY2sqIGFsbG9jYXRlQ3Vz
dG9tU2l6ZShzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgYmxvY2tBbGlnbm1lbnQpOworICAgIHRl
bXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGRlYWxsb2NhdGUoVCopOworICAgIHRlbXBsYXRlIDx0
eXBlbmFtZSBUPiB2b2lkIGRlYWxsb2NhdGVDdXN0b21TaXplKFQqKTsKIAogcHJpdmF0ZToKKyAg
ICBEZWFkQmxvY2sqIHRyeUFsbG9jYXRlRnJvbVJlZ2lvbihEb3VibHlMaW5rZWRMaXN0PFJlZ2lv
bj4mLCBzaXplX3QmKTsKKwogICAgIHZvaWQgd2FpdEZvclJlbGF0aXZlVGltZVdoaWxlSG9sZGlu
Z0xvY2soZG91YmxlIHJlbGF0aXZlKTsKICAgICB2b2lkIHdhaXRGb3JSZWxhdGl2ZVRpbWUoZG91
YmxlIHJlbGF0aXZlKTsKIAogICAgIHZvaWQgYmxvY2tGcmVlaW5nVGhyZWFkTWFpbigpOwogICAg
IHN0YXRpYyB2b2lkIGJsb2NrRnJlZWluZ1RocmVhZFN0YXJ0RnVuYyh2b2lkKiBoZWFwKTsKIAot
ICAgIHZvaWQgcmVsZWFzZUZyZWVCbG9ja3MoKTsKKyAgICB2b2lkIHJlbGVhc2VGcmVlUmVnaW9u
cygpOwogCi0gICAgRG91Ymx5TGlua2VkTGlzdDxEZWFkQmxvY2s+IG1fZnJlZUJsb2NrczsKLSAg
ICBzaXplX3QgbV9udW1iZXJPZkZyZWVCbG9ja3M7CisgICAgRG91Ymx5TGlua2VkTGlzdDxSZWdp
b24+IG1fZnVsbFJlZ2lvbnM7CisgICAgRG91Ymx5TGlua2VkTGlzdDxSZWdpb24+IG1fcGFydGlh
bFJlZ2lvbnM7CisgICAgRG91Ymx5TGlua2VkTGlzdDxSZWdpb24+IG1fZW1wdHlSZWdpb25zOwor
ICAgIHNpemVfdCBtX251bWJlck9mRW1wdHlSZWdpb25zOworICAgIHNpemVfdCBtX251bWJlck9m
UGFydGlhbFJlZ2lvbnM7CiAgICAgYm9vbCBtX2lzQ3VycmVudGx5QWxsb2NhdGluZzsKICAgICBi
b29sIG1fYmxvY2tGcmVlaW5nVGhyZWFkU2hvdWxkUXVpdDsKLSAgICBTcGluTG9jayBtX2ZyZWVC
bG9ja0xvY2s7Ci0gICAgTXV0ZXggbV9mcmVlQmxvY2tDb25kaXRpb25Mb2NrOwotICAgIFRocmVh
ZENvbmRpdGlvbiBtX2ZyZWVCbG9ja0NvbmRpdGlvbjsKKyAgICBTcGluTG9jayBtX3JlZ2lvbkxv
Y2s7CisgICAgTXV0ZXggbV9lbXB0eVJlZ2lvbkNvbmRpdGlvbkxvY2s7CisgICAgVGhyZWFkQ29u
ZGl0aW9uIG1fZW1wdHlSZWdpb25Db25kaXRpb247CiAgICAgVGhyZWFkSWRlbnRpZmllciBtX2Js
b2NrRnJlZWluZ1RocmVhZDsKIH07CiAKLWlubGluZSBQYWdlQWxsb2NhdGlvbkFsaWduZWQgQmxv
Y2tBbGxvY2F0b3I6OmFsbG9jYXRlKCkKK2lubGluZSBEZWFkQmxvY2sqIEJsb2NrQWxsb2NhdG9y
Ojp0cnlBbGxvY2F0ZUZyb21SZWdpb24oRG91Ymx5TGlua2VkTGlzdDxSZWdpb24+JiByZWdpb25z
LCBzaXplX3QmIG51bWJlck9mUmVnaW9ucykKIHsKLSAgICB7Ci0gICAgICAgIFNwaW5Mb2NrSG9s
ZGVyIGxvY2tlcigmbV9mcmVlQmxvY2tMb2NrKTsKLSAgICAgICAgbV9pc0N1cnJlbnRseUFsbG9j
YXRpbmcgPSB0cnVlOwotICAgICAgICBpZiAobV9udW1iZXJPZkZyZWVCbG9ja3MpIHsKLSAgICAg
ICAgICAgIEFTU0VSVCghbV9mcmVlQmxvY2tzLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICBtX251
bWJlck9mRnJlZUJsb2Nrcy0tOwotICAgICAgICAgICAgcmV0dXJuIERlYWRCbG9jazo6ZGVzdHJv
eShtX2ZyZWVCbG9ja3MucmVtb3ZlSGVhZCgpKTsKKyAgICBpZiAobnVtYmVyT2ZSZWdpb25zKSB7
CisgICAgICAgIEFTU0VSVCghcmVnaW9ucy5pc0VtcHR5KCkpOworICAgICAgICBSZWdpb24qIHJl
Z2lvbiA9IHJlZ2lvbnMuaGVhZCgpOworICAgICAgICBBU1NFUlQoIXJlZ2lvbi0+aXNGdWxsKCkp
OworICAgICAgICBEZWFkQmxvY2sqIGJsb2NrID0gcmVnaW9uLT5hbGxvY2F0ZSgpOworICAgICAg
ICBpZiAocmVnaW9uLT5pc0Z1bGwoKSkgeworICAgICAgICAgICAgbnVtYmVyT2ZSZWdpb25zLS07
CisgICAgICAgICAgICBtX2Z1bGxSZWdpb25zLnB1c2gocmVnaW9ucy5yZW1vdmVIZWFkKCkpOwog
ICAgICAgICB9CisgICAgICAgIHJldHVybiBibG9jazsKICAgICB9CisgICAgcmV0dXJuIDA7Cit9
CiAKLSAgICBBU1NFUlQobV9mcmVlQmxvY2tzLmlzRW1wdHkoKSk7Ci0gICAgUGFnZUFsbG9jYXRp
b25BbGlnbmVkIGFsbG9jYXRpb24gPSBQYWdlQWxsb2NhdGlvbkFsaWduZWQ6OmFsbG9jYXRlKERl
YWRCbG9jazo6c19ibG9ja1NpemUsIERlYWRCbG9jazo6c19ibG9ja1NpemUsIE9TQWxsb2NhdG9y
OjpKU0dDSGVhcFBhZ2VzKTsKLSAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KGFsbG9jYXRpb24p
KQotICAgICAgICBDUkFTSCgpOwotICAgIHJldHVybiBhbGxvY2F0aW9uOwordGVtcGxhdGU8dHlw
ZW5hbWUgVD4KK2lubGluZSBEZWFkQmxvY2sqIEJsb2NrQWxsb2NhdG9yOjphbGxvY2F0ZSgpCit7
CisgICAgRGVhZEJsb2NrKiBibG9jazsKKyAgICBtX2lzQ3VycmVudGx5QWxsb2NhdGluZyA9IHRy
dWU7CisgICAgeworICAgICAgICBTcGluTG9ja0hvbGRlciBsb2NrZXIoJm1fcmVnaW9uTG9jayk7
CisgICAgICAgIGlmICgoYmxvY2sgPSB0cnlBbGxvY2F0ZUZyb21SZWdpb24obV9wYXJ0aWFsUmVn
aW9ucywgbV9udW1iZXJPZlBhcnRpYWxSZWdpb25zKSkpCisgICAgICAgICAgICByZXR1cm4gYmxv
Y2s7CisgICAgICAgIGlmICgoYmxvY2sgPSB0cnlBbGxvY2F0ZUZyb21SZWdpb24obV9lbXB0eVJl
Z2lvbnMsIG1fbnVtYmVyT2ZFbXB0eVJlZ2lvbnMpKSkKKyAgICAgICAgICAgIHJldHVybiBibG9j
azsKKyAgICB9CisKKyAgICBSZWdpb24qIG5ld1JlZ2lvbiA9IFJlZ2lvbjo6Y3JlYXRlKFQ6OmJs
b2NrU2l6ZSwgVDo6YmxvY2tTaXplLCAxKTsKKworICAgIFNwaW5Mb2NrSG9sZGVyIGxvY2tlcigm
bV9yZWdpb25Mb2NrKTsKKyAgICBtX2VtcHR5UmVnaW9ucy5wdXNoKG5ld1JlZ2lvbik7CisgICAg
bV9udW1iZXJPZkVtcHR5UmVnaW9ucysrOworICAgIGJsb2NrID0gdHJ5QWxsb2NhdGVGcm9tUmVn
aW9uKG1fZW1wdHlSZWdpb25zLCBtX251bWJlck9mRW1wdHlSZWdpb25zKTsKKyAgICBBU1NFUlQo
YmxvY2spOworICAgIHJldHVybiBibG9jazsKK30KKworaW5saW5lIERlYWRCbG9jayogQmxvY2tB
bGxvY2F0b3I6OmFsbG9jYXRlQ3VzdG9tU2l6ZShzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgYmxv
Y2tBbGlnbm1lbnQpCit7CisgICAgc2l6ZV90IHJlYWxTaXplID0gV1RGOjpyb3VuZFVwVG9NdWx0
aXBsZU9mKGJsb2NrQWxpZ25tZW50LCBibG9ja1NpemUpOworICAgIFJlZ2lvbiogbmV3UmVnaW9u
ID0gUmVnaW9uOjpjcmVhdGUocmVhbFNpemUsIGJsb2NrQWxpZ25tZW50LCAxKTsKKyAgICBEZWFk
QmxvY2sqIGJsb2NrID0gbmV3UmVnaW9uLT5hbGxvY2F0ZSgpOworICAgIEFTU0VSVChibG9jayk7
CisgICAgcmV0dXJuIGJsb2NrOwogfQogCi1pbmxpbmUgdm9pZCBCbG9ja0FsbG9jYXRvcjo6ZGVh
bGxvY2F0ZShQYWdlQWxsb2NhdGlvbkFsaWduZWQgYWxsb2NhdGlvbikKK3RlbXBsYXRlPHR5cGVu
YW1lIFQ+CitpbmxpbmUgdm9pZCBCbG9ja0FsbG9jYXRvcjo6ZGVhbGxvY2F0ZShUKiBibG9jaykK
IHsKLSAgICBzaXplX3QgbnVtYmVyT2ZGcmVlQmxvY2tzOworICAgIGJvb2wgc2hvdWxkV2FrZUJs
b2NrRnJlZWluZ1RocmVhZCA9IGZhbHNlOwogICAgIHsKLSAgICAgICAgU3BpbkxvY2tIb2xkZXIg
bG9ja2VyKCZtX2ZyZWVCbG9ja0xvY2spOwotICAgICAgICBtX2ZyZWVCbG9ja3MucHVzaChEZWFk
QmxvY2s6OmNyZWF0ZShhbGxvY2F0aW9uKSk7Ci0gICAgICAgIG51bWJlck9mRnJlZUJsb2NrcyA9
IG1fbnVtYmVyT2ZGcmVlQmxvY2tzKys7CisgICAgICAgIFNwaW5Mb2NrSG9sZGVyIGxvY2tlcigm
bV9yZWdpb25Mb2NrKTsKKyAgICAgICAgUmVnaW9uKiByZWdpb24gPSBibG9jay0+cmVnaW9uKCk7
CisgICAgICAgIGlmIChyZWdpb24tPmlzRnVsbCgpKQorICAgICAgICAgICAgbV9mdWxsUmVnaW9u
cy5yZW1vdmUocmVnaW9uKTsKKyAgICAgICAgcmVnaW9uLT5kZWFsbG9jYXRlKGJsb2NrKTsKKyAg
ICAgICAgaWYgKHJlZ2lvbi0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtX2VtcHR5UmVnaW9u
cy5wdXNoKHJlZ2lvbik7CisgICAgICAgICAgICBzaG91bGRXYWtlQmxvY2tGcmVlaW5nVGhyZWFk
ID0gIW1fbnVtYmVyT2ZFbXB0eVJlZ2lvbnM7CisgICAgICAgICAgICBtX251bWJlck9mRW1wdHlS
ZWdpb25zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX3BhcnRpYWxSZWdpb25z
LnB1c2gocmVnaW9uKTsKKyAgICAgICAgICAgIG1fbnVtYmVyT2ZQYXJ0aWFsUmVnaW9ucysrOwor
ICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFudW1iZXJPZkZyZWVCbG9ja3MpIHsKLSAgICAg
ICAgTXV0ZXhMb2NrZXIgbXV0ZXhMb2NrZXIobV9mcmVlQmxvY2tDb25kaXRpb25Mb2NrKTsKLSAg
ICAgICAgbV9mcmVlQmxvY2tDb25kaXRpb24uc2lnbmFsKCk7CisgICAgaWYgKHNob3VsZFdha2VC
bG9ja0ZyZWVpbmdUaHJlYWQpIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbXV0ZXhMb2NrZXIobV9l
bXB0eVJlZ2lvbkNvbmRpdGlvbkxvY2spOworICAgICAgICBtX2VtcHR5UmVnaW9uQ29uZGl0aW9u
LnNpZ25hbCgpOwogICAgIH0KIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSB2b2lk
IEJsb2NrQWxsb2NhdG9yOjpkZWFsbG9jYXRlQ3VzdG9tU2l6ZShUKiBibG9jaykKK3sKKyAgICBS
ZWdpb24qIHJlZ2lvbiA9IGJsb2NrLT5yZWdpb24oKTsKKyAgICByZWdpb24tPmRlYWxsb2NhdGUo
YmxvY2spOworICAgIGRlbGV0ZSByZWdpb247Cit9CisKIH0gLy8gbmFtZXNwYWNlIEpTQwogCiAj
ZW5kaWYgLy8gQmxvY2tBbGxvY2F0b3JfaApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2hl
YXAvQ29waWVkQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVh
cC9Db3BpZWRCbG9jay5oCShyZXZpc2lvbiAxMzEwNjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvaGVhcC9Db3BpZWRCbG9jay5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw2ICsyNiw3IEBACiAj
aWZuZGVmIENvcGllZEJsb2NrX2gKICNkZWZpbmUgQ29waWVkQmxvY2tfaAogCisjaW5jbHVkZSAi
QmxvY2tBbGxvY2F0b3IuaCIKICNpbmNsdWRlICJIZWFwQmxvY2suaCIKICNpbmNsdWRlICJKU1Zh
bHVlLmgiCiAjaW5jbHVkZSAiSlNWYWx1ZUlubGluZU1ldGhvZHMuaCIKQEAgLTM4LDggKzM5LDgg
QEAgY2xhc3MgQ29waWVkQmxvY2sgOiBwdWJsaWMgSGVhcEJsb2NrPENvcAogICAgIGZyaWVuZCBj
bGFzcyBDb3BpZWRTcGFjZTsKICAgICBmcmllbmQgY2xhc3MgQ29waWVkQWxsb2NhdG9yOwogcHVi
bGljOgotICAgIHN0YXRpYyBDb3BpZWRCbG9jayogY3JlYXRlKGNvbnN0IFBhZ2VBbGxvY2F0aW9u
QWxpZ25lZCYpOwotICAgIHN0YXRpYyBDb3BpZWRCbG9jayogY3JlYXRlTm9aZXJvRmlsbChjb25z
dCBQYWdlQWxsb2NhdGlvbkFsaWduZWQmKTsKKyAgICBzdGF0aWMgQ29waWVkQmxvY2sqIGNyZWF0
ZShEZWFkQmxvY2sqKTsKKyAgICBzdGF0aWMgQ29waWVkQmxvY2sqIGNyZWF0ZU5vWmVyb0ZpbGwo
RGVhZEJsb2NrKik7CiAKICAgICAvLyBUaGUgcGF5bG9hZCBpcyB0aGUgcmVnaW9uIG9mIHRoZSBi
bG9jayB0aGF0IGlzIHVzYWJsZSBmb3IgYWxsb2NhdGlvbnMuCiAgICAgY2hhciogcGF5bG9hZCgp
OwpAQCAtNjAsMjQgKzYxLDI3IEBAIHB1YmxpYzoKICAgICBzaXplX3Qgc2l6ZSgpOwogICAgIHNp
emVfdCBjYXBhY2l0eSgpOwogCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBibG9ja1NpemUgPSA2
NCAqIEtCOworCiBwcml2YXRlOgotICAgIENvcGllZEJsb2NrKGNvbnN0IFBhZ2VBbGxvY2F0aW9u
QWxpZ25lZCYpOworICAgIENvcGllZEJsb2NrKFJlZ2lvbiopOwogICAgIHZvaWQgemVyb0ZpbGxX
aWxkZXJuZXNzKCk7IC8vIENhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgdG8gemVyby1maWxsIHRv
IHRoZSBlbmQgb2YgdGhlIGJsb2NrLgogCiAgICAgc2l6ZV90IG1fcmVtYWluaW5nOwogICAgIHVp
bnRwdHJfdCBtX2lzUGlubmVkOwogfTsKIAotaW5saW5lIENvcGllZEJsb2NrKiBDb3BpZWRCbG9j
azo6Y3JlYXRlTm9aZXJvRmlsbChjb25zdCBQYWdlQWxsb2NhdGlvbkFsaWduZWQmIGFsbG9jYXRp
b24pCitpbmxpbmUgQ29waWVkQmxvY2sqIENvcGllZEJsb2NrOjpjcmVhdGVOb1plcm9GaWxsKERl
YWRCbG9jayogYmxvY2spCiB7Ci0gICAgcmV0dXJuIG5ldyhOb3ROdWxsLCBhbGxvY2F0aW9uLmJh
c2UoKSkgQ29waWVkQmxvY2soYWxsb2NhdGlvbik7CisgICAgUmVnaW9uKiByZWdpb24gPSBibG9j
ay0+cmVnaW9uKCk7CisgICAgcmV0dXJuIG5ldyhOb3ROdWxsLCBibG9jaykgQ29waWVkQmxvY2so
cmVnaW9uKTsKIH0KIAotaW5saW5lIENvcGllZEJsb2NrKiBDb3BpZWRCbG9jazo6Y3JlYXRlKGNv
bnN0IFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCYgYWxsb2NhdGlvbikKK2lubGluZSBDb3BpZWRCbG9j
ayogQ29waWVkQmxvY2s6OmNyZWF0ZShEZWFkQmxvY2sqIGJsb2NrKQogewotICAgIENvcGllZEJs
b2NrKiBibG9jayA9IGNyZWF0ZU5vWmVyb0ZpbGwoYWxsb2NhdGlvbik7Ci0gICAgYmxvY2stPnpl
cm9GaWxsV2lsZGVybmVzcygpOwotICAgIHJldHVybiBibG9jazsKKyAgICBDb3BpZWRCbG9jayog
bmV3QmxvY2sgPSBjcmVhdGVOb1plcm9GaWxsKGJsb2NrKTsKKyAgICBuZXdCbG9jay0+emVyb0Zp
bGxXaWxkZXJuZXNzKCk7CisgICAgcmV0dXJuIG5ld0Jsb2NrOwogfQogCiBpbmxpbmUgdm9pZCBD
b3BpZWRCbG9jazo6emVyb0ZpbGxXaWxkZXJuZXNzKCkKQEAgLTkyLDggKzk2LDggQEAgaW5saW5l
IHZvaWQgQ29waWVkQmxvY2s6Onplcm9GaWxsV2lsZGVybgogI2VuZGlmCiB9CiAKLWlubGluZSBD
b3BpZWRCbG9jazo6Q29waWVkQmxvY2soY29uc3QgUGFnZUFsbG9jYXRpb25BbGlnbmVkJiBhbGxv
Y2F0aW9uKQotICAgIDogSGVhcEJsb2NrPENvcGllZEJsb2NrPihhbGxvY2F0aW9uKQoraW5saW5l
IENvcGllZEJsb2NrOjpDb3BpZWRCbG9jayhSZWdpb24qIHJlZ2lvbikKKyAgICA6IEhlYXBCbG9j
azxDb3BpZWRCbG9jaz4ocmVnaW9uKQogICAgICwgbV9yZW1haW5pbmcocGF5bG9hZENhcGFjaXR5
KCkpCiAgICAgLCBtX2lzUGlubmVkKGZhbHNlKQogewpAQCAtMTA3LDcgKzExMSw3IEBAIGlubGlu
ZSBjaGFyKiBDb3BpZWRCbG9jazo6cGF5bG9hZCgpCiAKIGlubGluZSBjaGFyKiBDb3BpZWRCbG9j
azo6cGF5bG9hZEVuZCgpCiB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRo
aXMpICsgYWxsb2NhdGlvbigpLnNpemUoKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxj
aGFyKj4odGhpcykgKyByZWdpb24oKS0+YmxvY2tTaXplKCk7CiB9CiAKIGlubGluZSBzaXplX3Qg
Q29waWVkQmxvY2s6OnBheWxvYWRDYXBhY2l0eSgpCkBAIC0xNTIsNyArMTU2LDcgQEAgaW5saW5l
IHNpemVfdCBDb3BpZWRCbG9jazo6c2l6ZSgpCiAKIGlubGluZSBzaXplX3QgQ29waWVkQmxvY2s6
OmNhcGFjaXR5KCkKIHsKLSAgICByZXR1cm4gYWxsb2NhdGlvbigpLnNpemUoKTsKKyAgICByZXR1
cm4gcmVnaW9uKCktPmJsb2NrU2l6ZSgpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0NvcGllZFNwYWNlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9Db3BpZWRTcGFjZS5jcHAJKHJldmlzaW9uIDEz
MTA2OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0NvcGllZFNwYWNlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNTAsNyArNTAsNyBAQCBDb3BpZWRTcGFjZTo6fkNvcGllZFNwYWNlKCkK
ICAgICAgICAgbV9oZWFwLT5ibG9ja0FsbG9jYXRvcigpLmRlYWxsb2NhdGUoQ29waWVkQmxvY2s6
OmRlc3Ryb3kobV9mcm9tU3BhY2UtPnJlbW92ZUhlYWQoKSkpOwogCiAgICAgd2hpbGUgKCFtX292
ZXJzaXplQmxvY2tzLmlzRW1wdHkoKSkKLSAgICAgICAgQ29waWVkQmxvY2s6OmRlc3Ryb3kobV9v
dmVyc2l6ZUJsb2Nrcy5yZW1vdmVIZWFkKCkpLmRlYWxsb2NhdGUoKTsKKyAgICAgICAgbV9oZWFw
LT5ibG9ja0FsbG9jYXRvcigpLmRlYWxsb2NhdGVDdXN0b21TaXplKENvcGllZEJsb2NrOjpkZXN0
cm95KG1fb3ZlcnNpemVCbG9ja3MucmVtb3ZlSGVhZCgpKSk7CiB9CiAKIHZvaWQgQ29waWVkU3Bh
Y2U6OmluaXQoKQpAQCAtNzksMTUgKzc5LDcgQEAgQ2hlY2tlZEJvb2xlYW4gQ29waWVkU3BhY2U6
OnRyeUFsbG9jYXRlTwogewogICAgIEFTU0VSVChpc092ZXJzaXplKGJ5dGVzKSk7CiAgICAgCi0g
ICAgc2l6ZV90IGJsb2NrU2l6ZSA9IFdURjo6cm91bmRVcFRvTXVsdGlwbGVPZihXVEY6OnBhZ2VT
aXplKCksIHNpemVvZihDb3BpZWRCbG9jaykgKyBieXRlcyk7Ci0KLSAgICBQYWdlQWxsb2NhdGlv
bkFsaWduZWQgYWxsb2NhdGlvbiA9IFBhZ2VBbGxvY2F0aW9uQWxpZ25lZDo6YWxsb2NhdGUoYmxv
Y2tTaXplLCBXVEY6OnBhZ2VTaXplKCksIE9TQWxsb2NhdG9yOjpKU0dDSGVhcFBhZ2VzKTsKLSAg
ICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KGFsbG9jYXRpb24pKSB7Ci0gICAgICAgICpvdXRQdHIg
PSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ29waWVkQmxvY2sqIGJs
b2NrID0gQ29waWVkQmxvY2s6OmNyZWF0ZShhbGxvY2F0aW9uKTsKKyAgICBDb3BpZWRCbG9jayog
YmxvY2sgPSBDb3BpZWRCbG9jazo6Y3JlYXRlKG1faGVhcC0+YmxvY2tBbGxvY2F0b3IoKS5hbGxv
Y2F0ZUN1c3RvbVNpemUoc2l6ZW9mKENvcGllZEJsb2NrKSArIGJ5dGVzLCBXVEY6OnBhZ2VTaXpl
KCkpKTsKICAgICBtX292ZXJzaXplQmxvY2tzLnB1c2goYmxvY2spOwogICAgIG1fYmxvY2tGaWx0
ZXIuYWRkKHJlaW50ZXJwcmV0X2Nhc3Q8Qml0cz4oYmxvY2spKTsKICAgICBtX2Jsb2NrU2V0LmFk
ZChibG9jayk7CkBAIC05Nyw3ICs4OSw3IEBAIENoZWNrZWRCb29sZWFuIENvcGllZFNwYWNlOjp0
cnlBbGxvY2F0ZU8KICAgICAqb3V0UHRyID0gYWxsb2NhdG9yLmZvcmNlQWxsb2NhdGUoYnl0ZXMp
OwogICAgIGFsbG9jYXRvci5yZXNldEN1cnJlbnRCbG9jaygpOwogCi0gICAgbV9oZWFwLT5kaWRB
bGxvY2F0ZShibG9ja1NpemUpOworICAgIG1faGVhcC0+ZGlkQWxsb2NhdGUoYmxvY2stPnJlZ2lv
bigpLT5ibG9ja1NpemUoKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTE0NSw3ICsxMzcs
NyBAQCBDaGVja2VkQm9vbGVhbiBDb3BpZWRTcGFjZTo6dHJ5UmVhbGxvY2F0CiAgICAgICAgIENv
cGllZEJsb2NrKiBvbGRCbG9jayA9IG92ZXJzaXplQmxvY2tGb3Iob2xkUHRyKTsKICAgICAgICAg
bV9vdmVyc2l6ZUJsb2Nrcy5yZW1vdmUob2xkQmxvY2spOwogICAgICAgICBtX2Jsb2NrU2V0LnJl
bW92ZShvbGRCbG9jayk7Ci0gICAgICAgIENvcGllZEJsb2NrOjpkZXN0cm95KG9sZEJsb2NrKS5k
ZWFsbG9jYXRlKCk7CisgICAgICAgIG1faGVhcC0+YmxvY2tBbGxvY2F0b3IoKS5kZWFsbG9jYXRl
Q3VzdG9tU2l6ZShDb3BpZWRCbG9jazo6ZGVzdHJveShvbGRCbG9jaykpOwogICAgIH0KICAgICAK
ICAgICAqcHRyID0gbmV3UHRyOwpAQCAtMjEzLDcgKzIwNSw3IEBAIHZvaWQgQ29waWVkU3BhY2U6
OmRvbmVDb3B5aW5nKCkKICAgICAgICAgaWYgKCFjdXJyLT5tX2lzUGlubmVkKSB7CiAgICAgICAg
ICAgICBtX292ZXJzaXplQmxvY2tzLnJlbW92ZShjdXJyKTsKICAgICAgICAgICAgIG1fYmxvY2tT
ZXQucmVtb3ZlKGN1cnIpOwotICAgICAgICAgICAgQ29waWVkQmxvY2s6OmRlc3Ryb3koY3Vyciku
ZGVhbGxvY2F0ZSgpOworICAgICAgICAgICAgbV9oZWFwLT5ibG9ja0FsbG9jYXRvcigpLmRlYWxs
b2NhdGVDdXN0b21TaXplKENvcGllZEJsb2NrOjpkZXN0cm95KGN1cnIpKTsKICAgICAgICAgfSBl
bHNlIHsKICAgICAgICAgICAgIG1fYmxvY2tGaWx0ZXIuYWRkKHJlaW50ZXJwcmV0X2Nhc3Q8Qml0
cz4oY3VycikpOwogICAgICAgICAgICAgY3Vyci0+bV9pc1Bpbm5lZCA9IGZhbHNlOwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvQ29waWVkU3BhY2VJbmxpbmVNZXRob2RzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvQ29waWVkU3BhY2VJbmxpbmVN
ZXRob2RzLmgJKHJldmlzaW9uIDEzMTA2OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFw
L0NvcGllZFNwYWNlSW5saW5lTWV0aG9kcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjEsNyArMTIx
LDcgQEAgaW5saW5lIHZvaWQgQ29waWVkU3BhY2U6OnJlY3ljbGVCbG9jayhDbwogaW5saW5lIENv
cGllZEJsb2NrKiBDb3BpZWRTcGFjZTo6YWxsb2NhdGVCbG9ja0ZvckNvcHlpbmdQaGFzZSgpCiB7
CiAgICAgQVNTRVJUKG1faW5Db3B5aW5nUGhhc2UpOwotICAgIENvcGllZEJsb2NrKiBibG9jayA9
IENvcGllZEJsb2NrOjpjcmVhdGVOb1plcm9GaWxsKG1faGVhcC0+YmxvY2tBbGxvY2F0b3IoKS5h
bGxvY2F0ZSgpKTsKKyAgICBDb3BpZWRCbG9jayogYmxvY2sgPSBDb3BpZWRCbG9jazo6Y3JlYXRl
Tm9aZXJvRmlsbChtX2hlYXAtPmJsb2NrQWxsb2NhdG9yKCkuYWxsb2NhdGU8Q29waWVkQmxvY2s+
KCkpOwogCiAgICAgewogICAgICAgICBNdXRleExvY2tlciBsb2NrZXIobV9sb2FuZWRCbG9ja3NM
b2NrKTsKQEAgLTEzOSw3ICsxMzksNyBAQCBpbmxpbmUgdm9pZCBDb3BpZWRTcGFjZTo6YWxsb2Nh
dGVCbG9jaygpCiAKICAgICBtX2FsbG9jYXRvci5yZXNldEN1cnJlbnRCbG9jaygpOwogICAgIAot
ICAgIENvcGllZEJsb2NrKiBibG9jayA9IENvcGllZEJsb2NrOjpjcmVhdGUobV9oZWFwLT5ibG9j
a0FsbG9jYXRvcigpLmFsbG9jYXRlKCkpOworICAgIENvcGllZEJsb2NrKiBibG9jayA9IENvcGll
ZEJsb2NrOjpjcmVhdGUobV9oZWFwLT5ibG9ja0FsbG9jYXRvcigpLmFsbG9jYXRlPENvcGllZEJs
b2NrPigpKTsKICAgICAgICAgCiAgICAgbV90b1NwYWNlLT5wdXNoKGJsb2NrKTsKICAgICBtX2Js
b2NrRmlsdGVyLmFkZChyZWludGVycHJldF9jYXN0PEJpdHM+KGJsb2NrKSk7CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwQmxvY2suaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaGVhcC9IZWFwQmxvY2suaAkocmV2aXNpb24gMTMxMDY5KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSGVhcEJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3
LDEzICsyNywxNCBAQAogI2RlZmluZSBIZWFwQmxvY2tfaAogCiAjaW5jbHVkZSA8d3RmL0RvdWJs
eUxpbmtlZExpc3QuaD4KLSNpbmNsdWRlIDx3dGYvUGFnZUFsbG9jYXRpb25BbGlnbmVkLmg+CiAj
aW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgogCiBuYW1lc3BhY2UgSlNDIHsKIAogZW51bSBB
bGxvY2F0aW9uRWZmb3J0IHsgQWxsb2NhdGlvbkNhbkZhaWwsIEFsbG9jYXRpb25NdXN0U3VjY2Vl
ZCB9OwogCitjbGFzcyBSZWdpb247CisKICNpZiBDT01QSUxFUihHQ0MpCiAjZGVmaW5lIENMQVNT
X0lGX0dDQyBjbGFzcwogI2Vsc2UKQEAgLTQ2LDI4ICs0NywyNSBAQCBjbGFzcyBIZWFwQmxvY2sg
OiBwdWJsaWMgRG91Ymx5TGlua2VkTGlzCiBwdWJsaWM6CiAgICAgc3RhdGljIGNvbnN0IHNpemVf
dCBzX2Jsb2NrU2l6ZSA9IDY0ICogS0I7CiAKLSAgICBzdGF0aWMgUGFnZUFsbG9jYXRpb25BbGln
bmVkIGRlc3Ryb3koSGVhcEJsb2NrKiBibG9jaykKKyAgICBzdGF0aWMgSGVhcEJsb2NrKiBkZXN0
cm95KEhlYXBCbG9jayogYmxvY2spCiAgICAgewogICAgICAgICBzdGF0aWNfY2FzdDxUKj4oYmxv
Y2spLT5+VCgpOwotCi0gICAgICAgIFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCBhbGxvY2F0aW9uOwot
ICAgICAgICBzdGQ6OnN3YXAoYWxsb2NhdGlvbiwgYmxvY2stPm1fYWxsb2NhdGlvbik7Ci0gICAg
ICAgIHJldHVybiBhbGxvY2F0aW9uOworICAgICAgICByZXR1cm4gYmxvY2s7CiAgICAgfQogCi0g
ICAgSGVhcEJsb2NrKGNvbnN0IFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCYgYWxsb2NhdGlvbikKKyAg
ICBIZWFwQmxvY2soUmVnaW9uKiByZWdpb24pCiAgICAgICAgIDogRG91Ymx5TGlua2VkTGlzdE5v
ZGU8VD4oKQotICAgICAgICAsIG1fYWxsb2NhdGlvbihhbGxvY2F0aW9uKQorICAgICAgICAsIG1f
cmVnaW9uKHJlZ2lvbikKICAgICAgICAgLCBtX3ByZXYoMCkKICAgICAgICAgLCBtX25leHQoMCkK
ICAgICB7Ci0gICAgICAgIEFTU0VSVChtX2FsbG9jYXRpb24pOworICAgICAgICBBU1NFUlQobV9y
ZWdpb24pOwogICAgIH0KIAotICAgIGNvbnN0IFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCBhbGxvY2F0
aW9uKCkgY29uc3QgeyByZXR1cm4gbV9hbGxvY2F0aW9uOyB9CisgICAgUmVnaW9uKiByZWdpb24o
KSBjb25zdCB7IHJldHVybiBtX3JlZ2lvbjsgfQogCiBwcml2YXRlOgotICAgIFBhZ2VBbGxvY2F0
aW9uQWxpZ25lZCBtX2FsbG9jYXRpb247CisgICAgUmVnaW9uKiBtX3JlZ2lvbjsKICAgICBUKiBt
X3ByZXY7CiAgICAgVCogbV9uZXh0OwogfTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9o
ZWFwL01hcmtlZEFsbG9jYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2hlYXAvTWFya2VkQWxsb2NhdG9yLmNwcAkocmV2aXNpb24gMTMxMDY5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkQWxsb2NhdG9yLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTExLDE1ICsxMTEsOSBAQCBNYXJrZWRCbG9jayogTWFya2VkQWxsb2NhdG9yOjphbGxvY2F0
ZUJsCiAKICAgICBzaXplX3QgY2VsbFNpemUgPSBtX2NlbGxTaXplID8gbV9jZWxsU2l6ZSA6IFdU
Rjo6cm91bmRVcFRvTXVsdGlwbGVPZjxNYXJrZWRCbG9jazo6YXRvbVNpemU+KGJ5dGVzKTsKIAot
ICAgIGlmIChibG9ja1NpemUgPT0gTWFya2VkQmxvY2s6OmJsb2NrU2l6ZSkgewotICAgICAgICBQ
YWdlQWxsb2NhdGlvbkFsaWduZWQgYWxsb2NhdGlvbiA9IG1faGVhcC0+YmxvY2tBbGxvY2F0b3Io
KS5hbGxvY2F0ZSgpOwotICAgICAgICByZXR1cm4gTWFya2VkQmxvY2s6OmNyZWF0ZShhbGxvY2F0
aW9uLCB0aGlzLCBjZWxsU2l6ZSwgbV9kZXN0cnVjdG9yVHlwZSk7Ci0gICAgfQotCi0gICAgUGFn
ZUFsbG9jYXRpb25BbGlnbmVkIGFsbG9jYXRpb24gPSBQYWdlQWxsb2NhdGlvbkFsaWduZWQ6OmFs
bG9jYXRlKGJsb2NrU2l6ZSwgTWFya2VkQmxvY2s6OmJsb2NrU2l6ZSwgT1NBbGxvY2F0b3I6OkpT
R0NIZWFwUGFnZXMpOwotICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oYWxsb2NhdGlvbikpCi0g
ICAgICAgIENSQVNIKCk7Ci0gICAgcmV0dXJuIE1hcmtlZEJsb2NrOjpjcmVhdGUoYWxsb2NhdGlv
biwgdGhpcywgY2VsbFNpemUsIG1fZGVzdHJ1Y3RvclR5cGUpOworICAgIGlmIChibG9ja1NpemUg
PT0gTWFya2VkQmxvY2s6OmJsb2NrU2l6ZSkKKyAgICAgICAgcmV0dXJuIE1hcmtlZEJsb2NrOjpj
cmVhdGUobV9oZWFwLT5ibG9ja0FsbG9jYXRvcigpLmFsbG9jYXRlPE1hcmtlZEJsb2NrPigpLCB0
aGlzLCBjZWxsU2l6ZSwgbV9kZXN0cnVjdG9yVHlwZSk7CisgICAgcmV0dXJuIE1hcmtlZEJsb2Nr
OjpjcmVhdGUobV9oZWFwLT5ibG9ja0FsbG9jYXRvcigpLmFsbG9jYXRlQ3VzdG9tU2l6ZShibG9j
a1NpemUsIE1hcmtlZEJsb2NrOjpibG9ja1NpemUpLCB0aGlzLCBjZWxsU2l6ZSwgbV9kZXN0cnVj
dG9yVHlwZSk7CiB9CiAKIHZvaWQgTWFya2VkQWxsb2NhdG9yOjphZGRCbG9jayhNYXJrZWRCbG9j
ayogYmxvY2spCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRCbG9jay5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkQmxvY2su
Y3BwCShyZXZpc2lvbiAxMzEwNjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJr
ZWRCbG9jay5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDEzICszMywxNCBAQAogCiBuYW1lc3Bh
Y2UgSlNDIHsKIAotTWFya2VkQmxvY2sqIE1hcmtlZEJsb2NrOjpjcmVhdGUoY29uc3QgUGFnZUFs
bG9jYXRpb25BbGlnbmVkJiBhbGxvY2F0aW9uLCBNYXJrZWRBbGxvY2F0b3IqIGFsbG9jYXRvciwg
c2l6ZV90IGNlbGxTaXplLCBEZXN0cnVjdG9yVHlwZSBkZXN0cnVjdG9yVHlwZSkKK01hcmtlZEJs
b2NrKiBNYXJrZWRCbG9jazo6Y3JlYXRlKERlYWRCbG9jayogYmxvY2ssIE1hcmtlZEFsbG9jYXRv
ciogYWxsb2NhdG9yLCBzaXplX3QgY2VsbFNpemUsIERlc3RydWN0b3JUeXBlIGRlc3RydWN0b3JU
eXBlKQogewotICAgIHJldHVybiBuZXcgKE5vdE51bGwsIGFsbG9jYXRpb24uYmFzZSgpKSBNYXJr
ZWRCbG9jayhhbGxvY2F0aW9uLCBhbGxvY2F0b3IsIGNlbGxTaXplLCBkZXN0cnVjdG9yVHlwZSk7
CisgICAgUmVnaW9uKiByZWdpb24gPSBibG9jay0+cmVnaW9uKCk7CisgICAgcmV0dXJuIG5ldyAo
Tm90TnVsbCwgYmxvY2spIE1hcmtlZEJsb2NrKHJlZ2lvbiwgYWxsb2NhdG9yLCBjZWxsU2l6ZSwg
ZGVzdHJ1Y3RvclR5cGUpOwogfQogCi1NYXJrZWRCbG9jazo6TWFya2VkQmxvY2soY29uc3QgUGFn
ZUFsbG9jYXRpb25BbGlnbmVkJiBhbGxvY2F0aW9uLCBNYXJrZWRBbGxvY2F0b3IqIGFsbG9jYXRv
ciwgc2l6ZV90IGNlbGxTaXplLCBEZXN0cnVjdG9yVHlwZSBkZXN0cnVjdG9yVHlwZSkKLSAgICA6
IEhlYXBCbG9jazxNYXJrZWRCbG9jaz4oYWxsb2NhdGlvbikKK01hcmtlZEJsb2NrOjpNYXJrZWRC
bG9jayhSZWdpb24qIHJlZ2lvbiwgTWFya2VkQWxsb2NhdG9yKiBhbGxvY2F0b3IsIHNpemVfdCBj
ZWxsU2l6ZSwgRGVzdHJ1Y3RvclR5cGUgZGVzdHJ1Y3RvclR5cGUpCisgICAgOiBIZWFwQmxvY2s8
TWFya2VkQmxvY2s+KHJlZ2lvbikKICAgICAsIG1fYXRvbXNQZXJDZWxsKChjZWxsU2l6ZSArIGF0
b21TaXplIC0gMSkgLyBhdG9tU2l6ZSkKICAgICAsIG1fZW5kQXRvbShhdG9tc1BlckJsb2NrIC0g
bV9hdG9tc1BlckNlbGwgKyAxKQogICAgICwgbV9kZXN0cnVjdG9yVHlwZShkZXN0cnVjdG9yVHlw
ZSkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01hcmtlZEJsb2NrLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkQmxvY2suaAkocmV2aXNp
b24gMTMxMDY5KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkQmxvY2suaAko
d29ya2luZyBjb3B5KQpAQCAtMjIsNiArMjIsNyBAQAogI2lmbmRlZiBNYXJrZWRCbG9ja19oCiAj
ZGVmaW5lIE1hcmtlZEJsb2NrX2gKIAorI2luY2x1ZGUgIkJsb2NrQWxsb2NhdG9yLmgiCiAjaW5j
bHVkZSAiQ2FyZFNldC5oIgogI2luY2x1ZGUgIkhlYXBCbG9jay5oIgogCkBAIC0xMTQsNyArMTE1
LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIH07CiAKICAgICAgICAgZW51bSBEZXN0cnVj
dG9yVHlwZSB7IE5vbmUsIEltbW9ydGFsU3RydWN0dXJlLCBOb3JtYWwgfTsKLSAgICAgICAgc3Rh
dGljIE1hcmtlZEJsb2NrKiBjcmVhdGUoY29uc3QgUGFnZUFsbG9jYXRpb25BbGlnbmVkJiwgTWFy
a2VkQWxsb2NhdG9yKiwgc2l6ZV90IGNlbGxTaXplLCBEZXN0cnVjdG9yVHlwZSk7CisgICAgICAg
IHN0YXRpYyBNYXJrZWRCbG9jayogY3JlYXRlKERlYWRCbG9jayosIE1hcmtlZEFsbG9jYXRvcios
IHNpemVfdCBjZWxsU2l6ZSwgRGVzdHJ1Y3RvclR5cGUpOwogCiAgICAgICAgIHN0YXRpYyBib29s
IGlzQXRvbUFsaWduZWQoY29uc3Qgdm9pZCopOwogICAgICAgICBzdGF0aWMgTWFya2VkQmxvY2sq
IGJsb2NrRm9yKGNvbnN0IHZvaWQqKTsKQEAgLTIwMCw3ICsyMDEsNyBAQCBuYW1lc3BhY2UgSlND
IHsKIAogICAgICAgICB0eXBlZGVmIGNoYXIgQXRvbVthdG9tU2l6ZV07CiAKLSAgICAgICAgTWFy
a2VkQmxvY2soY29uc3QgUGFnZUFsbG9jYXRpb25BbGlnbmVkJiwgTWFya2VkQWxsb2NhdG9yKiwg
c2l6ZV90IGNlbGxTaXplLCBEZXN0cnVjdG9yVHlwZSk7CisgICAgICAgIE1hcmtlZEJsb2NrKFJl
Z2lvbiosIE1hcmtlZEFsbG9jYXRvciosIHNpemVfdCBjZWxsU2l6ZSwgRGVzdHJ1Y3RvclR5cGUp
OwogICAgICAgICBBdG9tKiBhdG9tcygpOwogICAgICAgICBzaXplX3QgYXRvbU51bWJlcihjb25z
dCB2b2lkKik7CiAgICAgICAgIHZvaWQgY2FsbERlc3RydWN0b3IoSlNDZWxsKik7CkBAIC0zNDUs
NyArMzQ2LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAKICAgICBpbmxpbmUgc2l6ZV90IE1hcmtlZEJs
b2NrOjpjYXBhY2l0eSgpCiAgICAgewotICAgICAgICByZXR1cm4gYWxsb2NhdGlvbigpLnNpemUo
KTsKKyAgICAgICAgcmV0dXJuIHJlZ2lvbigpLT5ibG9ja1NpemUoKTsKICAgICB9CiAKICAgICBp
bmxpbmUgc2l6ZV90IE1hcmtlZEJsb2NrOjphdG9tTnVtYmVyKGNvbnN0IHZvaWQqIHApCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRTcGFjZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkU3BhY2UuY3BwCShyZXZpc2lvbiAx
MzEwNjkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRTcGFjZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTIwMCw4ICsyMDAsNyBAQCB2b2lkIE1hcmtlZFNwYWNlOjpmcmVlQmxv
Y2soTWFya2VkQmxvY2sqCiAgICAgICAgIG1faGVhcC0+YmxvY2tBbGxvY2F0b3IoKS5kZWFsbG9j
YXRlKE1hcmtlZEJsb2NrOjpkZXN0cm95KGJsb2NrKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9
Ci0KLSAgICBNYXJrZWRCbG9jazo6ZGVzdHJveShibG9jaykuZGVhbGxvY2F0ZSgpOworICAgIG1f
aGVhcC0+YmxvY2tBbGxvY2F0b3IoKS5kZWFsbG9jYXRlQ3VzdG9tU2l6ZShNYXJrZWRCbG9jazo6
ZGVzdHJveShibG9jaykpOwogfQogCiB2b2lkIE1hcmtlZFNwYWNlOjpmcmVlT3JTaHJpbmtCbG9j
ayhNYXJrZWRCbG9jayogYmxvY2spCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>