<?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>157324</bug_id>
          
          <creation_ts>2016-05-03 14:02:09 -0700</creation_ts>
          <short_desc>References from code to Structures should be stronger than weak</short_desc>
          <delta_ts>2016-05-19 14:07:05 -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>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>157334</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>ggaren</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1189847</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-05-03 14:02:09 -0700</bug_when>
    <thetext>If code refers to a Structure and the Structure dies, then currently we&apos;ll kill the code.  This makes sense because the Structure could be the only thing left referring to some global object or prototype.

But this also causes unnecessary churn.  Sometimes there will be a structure that we just haven&apos;t really done anything with recently and so it appears dead.  The approach we use elsewhere in our type inference is that the type that the code uses is general enough to handle every past execution.  Having the GC clear code when some Structure it uses dies means that we forget that the code used that Structure.  We&apos;ll either assume that the code is more monomorphic than it really is (because after GC we patch in some other structure but not the deleted one, so it looks like we only ever saw the new structure), or we&apos;ll assume that it&apos;s crazier than it really is (because we&apos;ll remember that there had been some structure that caused deletion, so we&apos;ll assume that deletions might happen in the future, so we&apos;ll use a fully dynamic IC).

We should have a more nuanced policy: if it&apos;s cheap to mark a dead Structure then we should mark it just so that all of the code that refers to it remembers that there had been this exact Structure in the past.  If the code often goes through different Structures then we already have great mechanisms to realize that the code is nutty (namely, the PolymorphicAccess size limit).  But if the code just does this a handful of times then remembering this old Structure is probably net good:

- It obeys the &quot;handle all past executions&quot; law.
- It preserves the history of the property access, allowing a precise measure of its past polymorphism.
- It makes the code ready to run fast if the user decides to use that Structure again. Marking the Structure means it will stay in whatever property transition tables it was in, so if the program does the same thing it did in the past, it will get this old Structure.

Right now it looks like this is a progression in gbemu and it makes gbemu perform more deterministically. I still need to do more experiments to validate this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1189860</commentid>
    <comment_count>1</comment_count>
      <attachid>278026</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-05-03 14:34:21 -0700</bug_when>
    <thetext>Created attachment 278026
possible patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1189902</commentid>
    <comment_count>2</comment_count>
      <attachid>278044</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-05-03 16:34:09 -0700</bug_when>
    <thetext>Created attachment 278044
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1189916</commentid>
    <comment_count>3</comment_count>
      <attachid>278044</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-05-03 17:31:20 -0700</bug_when>
    <thetext>Comment on attachment 278044
the patch

View in context: https://bugs.webkit.org/attachment.cgi?id=278044&amp;action=review

r=me with comments.

&gt; Source/JavaScriptCore/ChangeLog:23
&gt; +        This change introduces a more nuanced policy a more nuanced policy: if it&apos;s cheap to mark a

duplicate &quot;a more nuanced policy&quot;.

&gt; Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp:562
&gt; +    if (m_structure)
&gt; +        result &amp;= m_structure-&gt;markIfCheap(visitor);

If markIfCheap() returns true here, does it still make sense to continue below?  We might end up appending m_structure twice, but I suppose that is harmless in terms of correctness.

Out of curiosity, can Heap::isMarked(m_structure-&gt;previousID()) ever be false if m_structure-&gt;markIfCheap() is true?

&gt; Source/JavaScriptCore/runtime/Structure.cpp:1141
&gt; +    return (!m_globalObject || Heap::isMarked(m_globalObject.get()))
&gt; +        &amp;&amp; (!storedPrototypeObject() || Heap::isMarked(storedPrototypeObject()));

Can you clarify why this is considered to be &quot;cheap&quot;?  Is it because these are the conditions that do not require traversing the graphs of m_globalObject and storedPrototypeObject()?  I see.  So, &quot;cheap&quot; here means, the GC doesn&apos;t have to do much work for marking this structure, yes?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1189947</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-05-03 19:16:03 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Comment on attachment 278044 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=278044&amp;action=review
&gt; 
&gt; r=me with comments.
&gt; 
&gt; &gt; Source/JavaScriptCore/ChangeLog:23
&gt; &gt; +        This change introduces a more nuanced policy a more nuanced policy: if it&apos;s cheap to mark a
&gt; 
&gt; duplicate &quot;a more nuanced policy&quot;.

Fixed.

&gt; 
&gt; &gt; Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp:562
&gt; &gt; +    if (m_structure)
&gt; &gt; +        result &amp;= m_structure-&gt;markIfCheap(visitor);
&gt; 
&gt; If markIfCheap() returns true here, does it still make sense to continue
&gt; below?  We might end up appending m_structure twice, but I suppose that is
&gt; harmless in terms of correctness.

You&apos;re right!

I wanted to structure the code according to the intuition behind it: first handle all transitions that don&apos;t care about m_type and then switch on m_type to handle the per-type things.  That&apos;s the structure we use elsewhere in AccessCase, so I felt like it would be helpful for others to be consistent.

&gt; 
&gt; Out of curiosity, can Heap::isMarked(m_structure-&gt;previousID()) ever be
&gt; false if m_structure-&gt;markIfCheap() is true?

Sure!  We could have just marked the global object and prototype, but have yet to trace beyond this and mark either m_structure or m_structure-&gt;previousID().

The propagateTransitions() code could be called at any stage in tracing and we must assume that objects could be in any state so long as the stack is black and the tri-color invariant holds.  As a reminder, the tri-color theory of marking says that: white = not marked, grey = marked but not yet visited, black = marked and visited. The invariant is that black objects cannot refer to white ones, because at the moment that we visit an object, we mark anything it refers to. Marking changes white objects to grey, but it doesn&apos;t change the color of objects that were already grey or black. In our GC, isMarked() is true when the object is not white. A grey object can be distinguished from a black one based on whether it&apos;s in the worklist. If it&apos;s not in the worklist anymore, then we have visited it, so it&apos;s black. This information can also be computed, under the right circumstances, using a combination of the mark bit and data in the object&apos;s header. A useful property of the tri-color invariant is that it&apos;s an exact property of our GC: just as the tri-color invariant doesn&apos;t prohibit grey or white objects from pointing to objects of any color, so too must our GC always assume that so long as the job of marking is not yet complete, it&apos;s possible for white or grey objects to refer to objects of any color.

So, m_structure and m_structure-&gt;previousID() could both be white, in which case m_structure-&gt;previousID() would return false. markIfCheap() would return true if m_structure-&gt;globalObject and m_structure-&gt;storedPrototype are both grey or black. That&apos;s totally possible, since white objects are allowed to reference grey or black objects. It doesn&apos;t violate the tri-color invariant, therefore it is possible.

&gt; 
&gt; &gt; Source/JavaScriptCore/runtime/Structure.cpp:1141
&gt; &gt; +    return (!m_globalObject || Heap::isMarked(m_globalObject.get()))
&gt; &gt; +        &amp;&amp; (!storedPrototypeObject() || Heap::isMarked(storedPrototypeObject()));
&gt; 
&gt; Can you clarify why this is considered to be &quot;cheap&quot;?  Is it because these
&gt; are the conditions that do not require traversing the graphs of
&gt; m_globalObject and storedPrototypeObject()?  I see.  So, &quot;cheap&quot; here means,
&gt; the GC doesn&apos;t have to do much work for marking this structure, yes?

I&apos;ll write a comment about this.  Here&apos;s a detailed explanation.

A structure by itself is not an expensive thing to have in the heap. We control how big it is, and we&apos;re quite good at ensuring that those structures that we cache in this code are unlikely to be large. Structures are a VM-internal data structure that the user cannot directly manipulate, so even if we keep alive one that isn&apos;t of use to the user, we can be sure that this &quot;leak&quot; is bounded in size: we control the bound because we control the object. But, a structure strongly references its objects&apos; global object and prototype. The global object and prototype can be arbitrarily large, and they may refer to an arbitrarily large user-constructed graph of other arbitrarily large objects.

Hence, if a VM-internal optimization like inline caching marks a structure even though there are no objects in the heap that have that structure as their structure, then the risk is that we will keep a global object or prototype alive too long. Ordinarily a structure would keep a global object or prototype alive because the structure is referenced from some object O and that object has G and P as their global object and prototype, respectively. We&apos;re semantically required to keep G and P alive if O is alive so the fact that this happens via some structure that acts as an intermediary is just fine.

But if there does not exist any object that uses the structure and the VM keeps it alive due to caching, then it&apos;s possible that this will keep an otherwise-dead global object and prototype alive.  That&apos;s bad, since this means that the VM&apos;s optimization may make a program that runs fine (because the ginormous global object got deallocated on next GC) into one that doesn&apos;t (it swaps or jetsams because the VM kept alive a ginormous global object across many GCs because the VM internally cached some otherwise-dead structure).

I&apos;ve argued that structures by themselves are cheap to mark because the structure object itself is small and completely under our control. I&apos;ve also argued that structures may be extremely expensive to mark because the structure may refer to a ginormous global object or prototype, and the structure may be the last reference to those ginormous things - so marking the structure would be uniquely responsible for increasing our memory footprint by a lot.

Hence, being &quot;cheap&quot; to mark means: marking this structure will definitely only add a small and bounded amount of bytes to the heap size.  This is true if the global object and prototype are already marked, since in that case, marking the structure will only increase footprint by the size of the structure itself, which has a small and bounded size.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1189949</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-05-03 19:23:11 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/200405</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1194938</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-05-19 14:07:05 -0700</bug_when>
    <thetext>*** Bug 128072 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>278026</attachid>
            <date>2016-05-03 14:34:21 -0700</date>
            <delta_ts>2016-05-03 16:34:09 -0700</delta_ts>
            <desc>possible patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>7904</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCShy
ZXZpc2lvbiAyMDAzNDYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJs
b2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYxNiwzMiArMjYxNiwxNiBAQCB2b2lkIENvZGVC
bG9jazo6cHJvcGFnYXRlVHJhbnNpdGlvbnMoU2xvCiAKICNpZiBFTkFCTEUoSklUKQogICAgIGlm
IChKSVRDb2RlOjppc0pJVChqaXRUeXBlKCkpKSB7Ci0gICAgICAgIGZvciAoQmFnPFN0cnVjdHVy
ZVN0dWJJbmZvPjo6aXRlcmF0b3IgaXRlciA9IG1fc3R1YkluZm9zLmJlZ2luKCk7ICEhaXRlcjsg
KytpdGVyKSB7Ci0gICAgICAgICAgICBTdHJ1Y3R1cmVTdHViSW5mbyYgc3R1YkluZm8gPSAqKml0
ZXI7Ci0gICAgICAgICAgICBpZiAoc3R1YkluZm8uY2FjaGVUeXBlICE9IENhY2hlVHlwZTo6U3R1
YikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFBvbHltb3JwaGljQWNj
ZXNzKiBsaXN0ID0gc3R1YkluZm8udS5zdHViOwotICAgICAgICAgICAgSlNDZWxsKiBvcmlnaW4g
PSBzdHViSW5mby5jb2RlT3JpZ2luLmNvZGVPcmlnaW5Pd25lcigpOwotICAgICAgICAgICAgaWYg
KG9yaWdpbiAmJiAhSGVhcDo6aXNNYXJrZWQob3JpZ2luKSkgewotICAgICAgICAgICAgICAgIGFs
bEFyZU1hcmtlZFNvRmFyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSBsaXN0LT5zaXplKCk7IGot
LTspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBBY2Nlc3NDYXNlJiBhY2Nlc3MgPSBsaXN0LT5h
dChqKTsKLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzLnR5cGUoKSAhPSBBY2Nlc3NDYXNlOjpU
cmFuc2l0aW9uKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAg
ICBpZiAoSGVhcDo6aXNNYXJrZWQoYWNjZXNzLnN0cnVjdHVyZSgpKSkKLSAgICAgICAgICAgICAg
ICAgICAgdmlzaXRvci5hcHBlbmRVbmJhcnJpZXJlZFJlYWRPbmx5UG9pbnRlcihhY2Nlc3MubmV3
U3RydWN0dXJlKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAg
YWxsQXJlTWFya2VkU29GYXIgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAg
ICAgICBmb3IgKEJhZzxTdHJ1Y3R1cmVTdHViSW5mbz46Oml0ZXJhdG9yIGl0ZXIgPSBtX3N0dWJJ
bmZvcy5iZWdpbigpOyAhIWl0ZXI7ICsraXRlcikKKyAgICAgICAgICAgIGFsbEFyZU1hcmtlZFNv
RmFyICY9ICgqaXRlciktPnByb3BhZ2F0ZVRyYW5zaXRpb25zKHZpc2l0b3IpOwogICAgIH0KICNl
bmRpZiAvLyBFTkFCTEUoSklUKQogICAgIAogI2lmIEVOQUJMRShERkdfSklUKQogICAgIGlmIChK
SVRDb2RlOjppc09wdGltaXppbmdKSVQoaml0VHlwZSgpKSkgewogICAgICAgICBERkc6OkNvbW1v
bkRhdGEqIGRmZ0NvbW1vbiA9IG1faml0Q29kZS0+ZGZnQ29tbW9uKCk7CisgICAgICAgIGZvciAo
YXV0byYgd2Vha1JlZmVyZW5jZSA6IGRmZ0NvbW1vbi0+d2Vha1N0cnVjdHVyZVJlZmVyZW5jZXMp
CisgICAgICAgICAgICBhbGxBcmVNYXJrZWRTb0ZhciAmPSB3ZWFrUmVmZXJlbmNlLT5tYXJrSWZD
aGVhcCh2aXNpdG9yKTsKICAgICAgICAgCiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBkZmdDb21tb24tPnRyYW5zaXRpb25zLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBpZiAo
c2hvdWxkTWFya1RyYW5zaXRpb24oZGZnQ29tbW9uLT50cmFuc2l0aW9uc1tpXSkpIHsKSW5kZXg6
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Qb2x5bW9ycGhpY0FjY2Vzcy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1BvbHltb3JwaGljQWNj
ZXNzLmNwcAkocmV2aXNpb24gMjAwMzQ2KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b2RlL1BvbHltb3JwaGljQWNjZXNzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTU0LDYgKzU1NCwy
NyBAQCBib29sIEFjY2Vzc0Nhc2U6OnZpc2l0V2VhayhWTSYgdm0pIGNvbnN0CiAgICAgcmV0dXJu
IHRydWU7CiB9CiAKK2Jvb2wgQWNjZXNzQ2FzZTo6cHJvcGFnYXRlVHJhbnNpdGlvbnMoU2xvdFZp
c2l0b3ImIHZpc2l0b3IpIGNvbnN0Cit7CisgICAgYm9vbCByZXN1bHQgPSB0cnVlOworICAgIAor
ICAgIGlmIChtX3N0cnVjdHVyZSkKKyAgICAgICAgcmVzdWx0ICY9IG1fc3RydWN0dXJlLT5tYXJr
SWZDaGVhcCh2aXNpdG9yKTsKKyAgICAKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNhc2Ug
VHJhbnNpdGlvbjoKKyAgICAgICAgaWYgKEhlYXA6OmlzTWFya2VkKG1fc3RydWN0dXJlLT5wcmV2
aW91c0lEKCkpKQorICAgICAgICAgICAgdmlzaXRvci5hcHBlbmRVbmJhcnJpZXJlZFJlYWRPbmx5
UG9pbnRlcihtX3N0cnVjdHVyZS5nZXQoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJl
c3VsdCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVh
azsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogdm9pZCBBY2Nlc3NDYXNl
OjpnZW5lcmF0ZVdpdGhHdWFyZCgKICAgICBBY2Nlc3NHZW5lcmF0aW9uU3RhdGUmIHN0YXRlLCBD
Q2FsbEhlbHBlcnM6Okp1bXBMaXN0JiBmYWxsVGhyb3VnaCkKIHsKQEAgLTE0ODcsNiArMTUwOCwx
NCBAQCBib29sIFBvbHltb3JwaGljQWNjZXNzOjp2aXNpdFdlYWsoVk0mIHZtCiAgICAgcmV0dXJu
IHRydWU7CiB9CiAKK2Jvb2wgUG9seW1vcnBoaWNBY2Nlc3M6OnByb3BhZ2F0ZVRyYW5zaXRpb25z
KFNsb3RWaXNpdG9yJiB2aXNpdG9yKSBjb25zdAoreworICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZSgpOyArK2kpCisgICAgICAgIHJlc3Vs
dCAmPSBhdChpKS5wcm9wYWdhdGVUcmFuc2l0aW9ucyh2aXNpdG9yKTsKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCiB2b2lkIFBvbHltb3JwaGljQWNjZXNzOjpkdW1wKFByaW50U3RyZWFtJiBvdXQp
IGNvbnN0CiB7CiAgICAgb3V0LnByaW50KFJhd1BvaW50ZXIodGhpcyksICI6WyIpOwpJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1BvbHltb3JwaGljQWNjZXNzLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1BvbHltb3JwaGljQWNjZXNz
LmgJKHJldmlzaW9uIDIwMDM0NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Q
b2x5bW9ycGhpY0FjY2Vzcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNDgsNiArMjQ4LDcgQEAgcHJp
dmF0ZToKICAgICBBY2Nlc3NDYXNlKCk7CiAKICAgICBib29sIHZpc2l0V2VhayhWTSYpIGNvbnN0
OworICAgIGJvb2wgcHJvcGFnYXRlVHJhbnNpdGlvbnMoU2xvdFZpc2l0b3ImKSBjb25zdDsKICAg
ICAKICAgICAvLyBGSVhNRTogVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIG9mIGhvdyBBY2Nlc3ND
YXNlIHB1dHMgcG9zdC1nZW5lcmF0aW9uIHRoaW5ncyBpbnRvIGl0c2VsZi4KICAgICAvLyBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2NDU2CkBAIC0zOTYsNiArMzk3
LDEwIEBAIHB1YmxpYzoKIAogICAgIC8vIElmIHRoaXMgcmV0dXJucyBmYWxzZSB0aGVuIHdlIGFy
ZSByZXF1ZXN0aW5nIGEgcmVzZXQgb2YgdGhlIG93bmluZyBTdHJ1Y3R1cmVTdHViSW5mby4KICAg
ICBib29sIHZpc2l0V2VhayhWTSYpIGNvbnN0OworICAgIAorICAgIC8vIFRoaXMgcmV0dXJucyB0
cnVlIGlmIGl0IGhhcyBtYXJrZWQgZXZlcnl0aGluZyBpdCB3aWxsIGV2ZXIgbWFya2VkLiBUaGlz
IGNhbiBiZSB1c2VkIGFzIGFuCisgICAgLy8gb3B0aW1pemF0aW9uIHRvIHRoZW4gYXZvaWQgY2Fs
bGluZyB0aGlzIG1ldGhvZCBhZ2FpbiBkdXJpbmcgdGhlIGZpeHBvaW50LgorICAgIGJvb2wgcHJv
cGFnYXRlVHJhbnNpdGlvbnMoU2xvdFZpc2l0b3ImKSBjb25zdDsKIAogICAgIHZvaWQgYWJvdXRU
b0RpZSgpOwogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvU3RydWN0dXJl
U3R1YkluZm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9TdHJ1Y3R1cmVTdHViSW5mby5jcHAJKHJldmlzaW9uIDIwMDM0NikKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29kZS9TdHJ1Y3R1cmVTdHViSW5mby5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTIzMCw3ICsyMzAsMTAgQEAgdm9pZCBTdHJ1Y3R1cmVTdHViSW5mbzo6dmlzaXRXZWFrUmVm
ZXJlbgogewogICAgIFZNJiB2bSA9ICpjb2RlQmxvY2stPnZtKCk7CiAgICAgCi0gICAgYnVmZmVy
ZWRTdHJ1Y3R1cmVzLmNsZWFyKCk7CisgICAgYnVmZmVyZWRTdHJ1Y3R1cmVzLmdlbmVyaWNGaWx0
ZXIoCisgICAgICAgIFsmXSAoU3RydWN0dXJlKiBzdHJ1Y3R1cmUpIC0+IGJvb2wgeworICAgICAg
ICAgICAgcmV0dXJuIEhlYXA6OmlzTWFya2VkKHN0cnVjdHVyZSk7CisgICAgICAgIH0pOwogCiAg
ICAgc3dpdGNoIChjYWNoZVR5cGUpIHsKICAgICBjYXNlIENhY2hlVHlwZTo6R2V0QnlJZFNlbGY6
CkBAIC0yNTAsNiArMjUzLDIyIEBAIHZvaWQgU3RydWN0dXJlU3R1YkluZm86OnZpc2l0V2Vha1Jl
ZmVyZW4KICAgICByZXNldEJ5R0MgPSB0cnVlOwogfQogCitib29sIFN0cnVjdHVyZVN0dWJJbmZv
Ojpwcm9wYWdhdGVUcmFuc2l0aW9ucyhTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBzd2l0
Y2ggKGNhY2hlVHlwZSkgeworICAgIGNhc2UgQ2FjaGVUeXBlOjpVbnNldDoKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgY2FzZSBDYWNoZVR5cGU6OkdldEJ5SWRTZWxmOgorICAgIGNhc2UgQ2Fj
aGVUeXBlOjpQdXRCeUlkUmVwbGFjZToKKyAgICAgICAgcmV0dXJuIHUuYnlJZFNlbGYuYmFzZU9i
amVjdFN0cnVjdHVyZS0+bWFya0lmQ2hlYXAodmlzaXRvcik7CisgICAgY2FzZSBDYWNoZVR5cGU6
OlN0dWI6CisgICAgICAgIHJldHVybiB1LnN0dWItPnByb3BhZ2F0ZVRyYW5zaXRpb25zKHZpc2l0
b3IpOworICAgIH0KKyAgICAKKyAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
IHJldHVybiB0cnVlOworfQorCiBib29sIFN0cnVjdHVyZVN0dWJJbmZvOjpjb250YWluc1BDKHZv
aWQqIHBjKSBjb25zdAogewogICAgIGlmIChjYWNoZVR5cGUgIT0gQ2FjaGVUeXBlOjpTdHViKQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1N0cnVjdHVyZVN0dWJJbmZvLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1N0cnVjdHVyZVN0
dWJJbmZvLmgJKHJldmlzaW9uIDIwMDM0NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29kZS9TdHJ1Y3R1cmVTdHViSW5mby5oCSh3b3JraW5nIGNvcHkpCkBAIC04MSw2ICs4MSw5IEBA
IHB1YmxpYzoKICAgICAvLyBDaGVjayBpZiB0aGUgc3R1YiBoYXMgd2VhayByZWZlcmVuY2VzIHRo
YXQgYXJlIGRlYWQuIElmIGl0IGRvZXMsIHRoZW4gaXQgcmVzZXRzIGl0c2VsZiwKICAgICAvLyBl
aXRoZXIgZW50aXJlbHkgb3IganVzdCBlbm91Z2ggdG8gZW5zdXJlIHRoYXQgdGhvc2UgZGVhZCBw
b2ludGVycyBkb24ndCBnZXQgdXNlZCBhbnltb3JlLgogICAgIHZvaWQgdmlzaXRXZWFrUmVmZXJl
bmNlcyhDb2RlQmxvY2sqKTsKKyAgICAKKyAgICAvLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiBpdCBo
YXMgbWFya2VkIGV2ZXJ5dGhpbmcgdGhhdCBpdCB3aWxsIGV2ZXIgbWFyay4KKyAgICBib29sIHBy
b3BhZ2F0ZVRyYW5zaXRpb25zKFNsb3RWaXNpdG9yJik7CiAgICAgICAgIAogICAgIEFMV0FZU19J
TkxJTkUgYm9vbCBjb25zaWRlckNhY2hpbmcoU3RydWN0dXJlKiBzdHJ1Y3R1cmUpCiAgICAgewpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU3RydWN0dXJlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TdHJ1Y3R1cmUuY3BwCShyZXZp
c2lvbiAyMDAzNDYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TdHJ1Y3R1cmUu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTM1LDYgKzExMzUsMjEgQEAgdm9pZCBTdHJ1Y3R1cmU6
OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZQogICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0
LT5tX2luZmVycmVkVHlwZVRhYmxlKTsKIH0KIAorYm9vbCBTdHJ1Y3R1cmU6OmlzQ2hlYXBEdXJp
bmdHQygpCit7CisgICAgcmV0dXJuICghbV9nbG9iYWxPYmplY3QgfHwgSGVhcDo6aXNNYXJrZWQo
bV9nbG9iYWxPYmplY3QuZ2V0KCkpKQorICAgICAgICAmJiAoIXN0b3JlZFByb3RvdHlwZU9iamVj
dCgpIHx8IEhlYXA6OmlzTWFya2VkKHN0b3JlZFByb3RvdHlwZU9iamVjdCgpKSk7Cit9CisKK2Jv
b2wgU3RydWN0dXJlOjptYXJrSWZDaGVhcChTbG90VmlzaXRvciYgdmlzaXRvcikKK3sKKyAgICBp
ZiAoIWlzQ2hlYXBEdXJpbmdHQygpKQorICAgICAgICByZXR1cm4gSGVhcDo6aXNNYXJrZWQodGhp
cyk7CisgICAgCisgICAgdmlzaXRvci5hcHBlbmRVbmJhcnJpZXJlZFJlYWRPbmx5UG9pbnRlcih0
aGlzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBTdHJ1Y3R1cmU6OnByb3RvdHlwZUNo
YWluTWF5SW50ZXJjZXB0U3RvcmVUbyhWTSYgdm0sIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUp
CiB7CiAgICAgaWYgKHBhcnNlSW5kZXgocHJvcGVydHlOYW1lKSkKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL1N0cnVjdHVyZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL1N0cnVjdHVyZS5oCShyZXZpc2lvbiAyMDAzNDYpCisrKyBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TdHJ1Y3R1cmUuaAkod29ya2luZyBjb3B5KQpAQCAt
MjYwLDYgKzI2MCwxMSBAQCBwdWJsaWM6CiAgICAgU3RydWN0dXJlQ2hhaW4qIHByb3RvdHlwZUNo
YWluKFZNJiwgSlNHbG9iYWxPYmplY3QqKSBjb25zdDsKICAgICBTdHJ1Y3R1cmVDaGFpbiogcHJv
dG90eXBlQ2hhaW4oRXhlY1N0YXRlKikgY29uc3Q7CiAgICAgc3RhdGljIHZvaWQgdmlzaXRDaGls
ZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworICAgIAorICAgIGJvb2wgaXNDaGVhcER1cmlu
Z0dDKCk7CisgICAgCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RydWN0dXJlIGlzIG5v
dyBtYXJrZWQuCisgICAgYm9vbCBtYXJrSWZDaGVhcChTbG90VmlzaXRvciYpOwogICAgICAgICAK
ICAgICAvLyBXaWxsIGp1c3QgdGhlIHByb3RvdHlwZSBjaGFpbiBpbnRlcmNlcHQgdGhpcyBwcm9w
ZXJ0eSBhY2Nlc3M/CiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgYm9vbCBwcm90b3R5cGVDaGFpbk1h
eUludGVyY2VwdFN0b3JlVG8oVk0mLCBQcm9wZXJ0eU5hbWUpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>278044</attachid>
            <date>2016-05-03 16:34:09 -0700</date>
            <delta_ts>2016-05-03 17:31:20 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>13850</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjAwMzkyKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDk4IEBA
CisyMDE2LTA1LTAzICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
UmVmZXJlbmNlcyBmcm9tIGNvZGUgdG8gU3RydWN0dXJlcyBzaG91bGQgYmUgc3Ryb25nZXIgdGhh
biB3ZWFrCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
NTczMjQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisg
ICAgICAgIElmIGNvZGUgcmVmZXJzIHRvIGEgU3RydWN0dXJlIGFuZCB0aGUgU3RydWN0dXJlIGRp
ZXMsIHRoZW4gcHJldmlvdXNseSB3ZSdkIGtpbGwgdGhlIGNvZGUuIAorICAgICAgICBUaGlzIG1h
a2VzIHNlbnNlIGJlY2F1c2UgdGhlIFN0cnVjdHVyZSBjb3VsZCBiZSB0aGUgb25seSB0aGluZyBs
ZWZ0IHJlZmVycmluZyB0byBzb21lIGdsb2JhbAorICAgICAgICBvYmplY3Qgb3IgcHJvdG90eXBl
LgorCisgICAgICAgIEJ1dCB0aGlzIGFsc28gY2F1c2VzIHVubmVjZXNzYXJ5IGNodXJuLiBTb21l
dGltZXMgdGhlcmUgd2lsbCBiZSBhIHN0cnVjdHVyZSB0aGF0IHdlIGp1c3QKKyAgICAgICAgaGF2
ZW4ndCByZWFsbHkgZG9uZSBhbnl0aGluZyB3aXRoIHJlY2VudGx5IGFuZCBzbyBpdCBhcHBlYXJz
IGRlYWQuIFRoZSBhcHByb2FjaCB3ZSB1c2UKKyAgICAgICAgZWxzZXdoZXJlIGluIG91ciB0eXBl
IGluZmVyZW5jZSBpcyB0aGF0IHRoZSB0eXBlIHRoYXQgdGhlIGNvZGUgdXNlcyBpcyBnZW5lcmFs
IGVub3VnaCB0bworICAgICAgICBoYW5kbGUgZXZlcnkgcGFzdCBleGVjdXRpb24uIEhhdmluZyB0
aGUgR0MgY2xlYXIgY29kZSB3aGVuIHNvbWUgU3RydWN0dXJlIGl0IHVzZXMgZGllcyBtZWFucwor
ICAgICAgICB0aGF0IHdlIGZvcmdldCB0aGF0IHRoZSBjb2RlIHVzZWQgdGhhdCBTdHJ1Y3R1cmUu
IFdlJ2xsIGVpdGhlciBhc3N1bWUgdGhhdCB0aGUgY29kZSBpcyBtb3JlCisgICAgICAgIG1vbm9t
b3JwaGljIHRoYW4gaXQgcmVhbGx5IGlzIChiZWNhdXNlIGFmdGVyIEdDIHdlIHBhdGNoIGluIHNv
bWUgb3RoZXIgc3RydWN0dXJlIGJ1dCBub3QgdGhlCisgICAgICAgIGRlbGV0ZWQgb25lLCBzbyBp
dCBsb29rcyBsaWtlIHdlIG9ubHkgZXZlciBzYXcgdGhlIG5ldyBzdHJ1Y3R1cmUpLCBvciB3ZSds
bCBhc3N1bWUgdGhhdCBpdCdzCisgICAgICAgIGNyYXppZXIgdGhhbiBpdCByZWFsbHkgaXMgKGJl
Y2F1c2Ugd2UnbGwgcmVtZW1iZXIgdGhhdCB0aGVyZSBoYWQgYmVlbiBzb21lIHN0cnVjdHVyZSB0
aGF0CisgICAgICAgIGNhdXNlZCBkZWxldGlvbiwgc28gd2UnbGwgYXNzdW1lIHRoYXQgZGVsZXRp
b25zIG1pZ2h0IGhhcHBlbiBpbiB0aGUgZnV0dXJlLCBzbyB3ZSdsbCB1c2UgYQorICAgICAgICBm
dWxseSBkeW5hbWljIElDKS4KKworICAgICAgICBUaGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGEgbW9y
ZSBudWFuY2VkIHBvbGljeSBhIG1vcmUgbnVhbmNlZCBwb2xpY3k6IGlmIGl0J3MgY2hlYXAgdG8g
bWFyayBhCisgICAgICAgIGRlYWQgU3RydWN0dXJlIHRoZW4gd2Ugc2hvdWxkIG1hcmsgaXQganVz
dCBzbyB0aGF0IGFsbCBvZiB0aGUgY29kZSB0aGF0IHJlZmVycyB0byBpdAorICAgICAgICByZW1l
bWJlcnMgdGhhdCB0aGVyZSBoYWQgYmVlbiB0aGlzIGV4YWN0IFN0cnVjdHVyZSBpbiB0aGUgcGFz
dC4gSWYgdGhlIGNvZGUgb2Z0ZW4gZ29lcworICAgICAgICB0aHJvdWdoIGRpZmZlcmVudCBTdHJ1
Y3R1cmVzIHRoZW4gd2UgYWxyZWFkeSBoYXZlIGdyZWF0IG1lY2hhbmlzbXMgdG8gcmVhbGl6ZSB0
aGF0IHRoZSBjb2RlCisgICAgICAgIGlzIG51dHR5IChuYW1lbHksIHRoZSBQb2x5bW9ycGhpY0Fj
Y2VzcyBzaXplIGxpbWl0KS4gQnV0IGlmIHRoZSBjb2RlIGp1c3QgZG9lcyB0aGlzIGEKKyAgICAg
ICAgaGFuZGZ1bCBvZiB0aW1lcyB0aGVuIHJlbWVtYmVyaW5nIHRoaXMgb2xkIFN0cnVjdHVyZSBp
cyBwcm9iYWJseSBuZXQgZ29vZDoKKworICAgICAgICAtIEl0IG9iZXlzIHRoZSAiaGFuZGxlIGFs
bCBwYXN0IGV4ZWN1dGlvbnMiIGxhdy4KKyAgICAgICAgLSBJdCBwcmVzZXJ2ZXMgdGhlIGhpc3Rv
cnkgb2YgdGhlIHByb3BlcnR5IGFjY2VzcywgYWxsb3dpbmcgYSBwcmVjaXNlIG1lYXN1cmUgb2Yg
aXRzIHBhc3QKKyAgICAgICAgICBwb2x5bW9ycGhpc20uCisgICAgICAgIC0gSXQgbWFrZXMgdGhl
IGNvZGUgcmVhZHkgdG8gcnVuIGZhc3QgaWYgdGhlIHVzZXIgZGVjaWRlcyB0byB1c2UgdGhhdCBT
dHJ1Y3R1cmUgYWdhaW4uCisgICAgICAgICAgTWFya2luZyB0aGUgU3RydWN0dXJlIG1lYW5zIGl0
IHdpbGwgc3RheSBpbiB3aGF0ZXZlciBwcm9wZXJ0eSB0cmFuc2l0aW9uIHRhYmxlcyBpdCB3YXMg
aW4sCisgICAgICAgICAgc28gaWYgdGhlIHByb2dyYW0gZG9lcyB0aGUgc2FtZSB0aGluZyBpdCBk
aWQgaW4gdGhlIHBhc3QsIGl0IHdpbGwgZ2V0IHRoaXMgb2xkIFN0cnVjdHVyZS4KKworICAgICAg
ICBJdCBsb29rcyBsaWtlIHRoaXMgaXMgYSBwcm9ncmVzc2lvbiBpbiBnYmVtdSBhbmQgaXQgbWFr
ZXMgZ2JlbXUgcGVyZm9ybSBtb3JlCisgICAgICAgIGRldGVybWluaXN0aWNhbGx5LiBBbHNvLCBp
dCBzZWVtcyB0aGF0IHRoaXMgbWFrZXMgSmV0U3RyZWFtIHJ1biBmYXN0ZXIuCisgICAgICAgIAor
ICAgICAgICBPdmVyIGZpdmUgaW4tYnJvd3NlciBydW5zIG9mIEpldFN0cmVhbSwgaGVyZSdzIHdo
YXQgd2Ugc2VlIGJlZm9yZSBhbmQgYWZ0ZXI6CisgICAgICAgIAorICAgICAgICBHZW9tZXRyaWMg
TWVhbjoKKyAgICAgICAgICAgIEJlZm9yZSAgICAgICAgICAgICAgQWZ0ZXIKKyAgICAgICAgICAg
IDIyOS4yMyArLSA4LjI1MjMgICAgMjMwLjcwICstIDEyLjg4OAorICAgICAgICAgICAgMjMyLjkx
ICstIDE1LjYzOCAgICAyMzkuMDQgKy0gMTMuNzY2CisgICAgICAgICAgICAyMzQuNzkgKy0gMTIu
NzYwICAgIDIzNi4zMiArLSAxNS41NjIKKyAgICAgICAgICAgIDIzNi4yMCArLSAyMy4xMjUgICAg
MjQyLjAyICstIDMuMzg2NQorICAgICAgICAgICAgMjM3LjIyICstIDIuMTkyOSAgICAyMzcuMjMg
Ky0gMTcuNjY0CisgICAgICAgIAorICAgICAgICBKdXN0IGdiZW11OgorICAgICAgICAgICAgQmVm
b3JlICAgICAgICAgICAgICBBZnRlcgorICAgICAgICAgICAgNTQxLjAgKy0gMTM1LjggICAgICA0
ODEuNyArLSAxNDMuNAorICAgICAgICAgICAgNTE4LjkgKy0gMTUuNjUgICAgICA1MDguMSArLSAx
MzYuMworICAgICAgICAgICAgMzYyLjUgKy0gMC44ODg0ICAgICA0ODkuNyArLSAxMDEuNAorICAg
ICAgICAgICAgNDcwLjcgKy0gMzEzLjMgICAgICA1MzAuNyArLSAxMS40OQorICAgICAgICAgICAg
NDE4LjcgKy0gMTgwLjYgICAgICA1MzcuMiArLSA2LjUxNAorICAgICAgICAKKyAgICAgICAgTm90
aWNlIHRoYXQgdGhlcmUgaXMgcGxlbnR5IG9mIG5vaXNlIGJlZm9yZSBhbmQgYWZ0ZXIsIGJ1dCB0
aGUgbm9pc2UgaXMgbm93IGZhciBsZXNzIHNldmVyZS4KKyAgICAgICAgQWZ0ZXIgdGhpcyBjaGFu
Z2UgSSBkaWQgbm90IHNlZSBhbnkgcnVucyBsaWtlICI0NzAuNyArLSAzMTMuMyIgd2hlcmUgdGhl
IHNpemUgb2YgdGhlIAorICAgICAgICBjb25maWRlbmNlIGludGVydmFsICgzMTMuMyAqIDIpIGlz
IGdyZWF0ZXIgdGhhbiB0aGUgc2NvcmUgKDQ3MC43KS4gQWxzbywgbm90aWNlIHRoYXQgdGhlCisg
ICAgICAgIGxlYXN0IG5vaXN5IHJ1biBiZWZvcmUgdGhlIGNoYW5nZSBhbHNvIGdvdCBhIGxvd2Vy
IHNjb3JlIHRoYW4gd2UgZXZlciBvYnNlcnZlZCBhZnRlciB0aGUKKyAgICAgICAgY2hhbmdlICgz
Ni41ICstIDAuODg4NCkuIFRoZSBub2lzZSwgYW5kIHRoZXNlIG9jY2FzaW9uYWwgdmVyeSBsb3cg
c2NvcmVzLCBhcmUgZHVlIHRvIGEKKyAgICAgICAgcGF0aG9sb2d5IHdoZXJlIHRoZSBHQyB3b3Vs
ZCByZXNldCBzb21lIHN0dWJzIGF0IGFuIHVuZm9ydHVuYXRlIHRpbWUgZHVyaW5nIHByb2ZpbGlu
ZywKKyAgICAgICAgY2F1c2luZyB0aGUgb3B0aW1pemluZyBjb21waWxlciB0byBtYWtlIG1hbnkg
cG9vciBkZWNpc2lvbnMuIFRoYXQgcGF0aG9sb2d5IGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgYW55
bW9yZS4KKyAgICAgICAgCisgICAgICAgIE9uIHRoZSBvdGhlciBoYW5kLCBwcmlvciB0byB0aGlz
IGNoYW5nZSBpdCB3YXMgcG9zc2libGUgZm9yIGdiZW11IHRvIHNvbWV0aW1lcyBydW4gc29vb29w
ZXIKKyAgICAgICAgZmFzdCBiZWNhdXNlIHRoZSBHQyB3b3VsZCBjYXVzZSB0aGUgcHJvZmlsZXIg
dG8gZm9yZ2V0IGdiZW11J3MgYmVoYXZpb3Igb24gdGhlIGZpcnN0IHRpY2sKKyAgICAgICAgYW5k
IGZvY3VzIG9ubHkgb24gaXRzIGJlaGF2aW9yIGluIHN1YnNlcXVlbnQgdGlja3MuIFNvLCBpbiBz
dGVhZHkgc3RhdGUsIHdlJ2Qgb3B0aW1pemUgZ2JlbXUKKyAgICAgICAgZm9yIGl0cyBsYXRlciBi
ZWhhdmlvciByYXRoZXIgdGhhbiBhIGNvbWJpbmF0aW9uIG9mIGl0cyBlYXJseSBiZWhhdmlvciBh
bmQgbGF0ZXIgYmVoYXZpb3IuCisgICAgICAgIFdlIHJhcmVseSBnb3QgbHVja3kgdGhpcyB3YXks
IHNvIGl0J3Mgbm90IGZhaXIgdG8gdmlldyB0aGlzIHF1aXJrIGFzIGEgZmVhdHVyZS4KKyAgICAg
ICAgCisgICAgICAgICogYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcDoKKyAgICAgICAgKEpTQzo6Q29k
ZUJsb2NrOjpwcm9wYWdhdGVUcmFuc2l0aW9ucyk6CisgICAgICAgICogYnl0ZWNvZGUvUG9seW1v
cnBoaWNBY2Nlc3MuY3BwOgorICAgICAgICAoSlNDOjpBY2Nlc3NDYXNlOjp2aXNpdFdlYWspOgor
ICAgICAgICAoSlNDOjpBY2Nlc3NDYXNlOjpwcm9wYWdhdGVUcmFuc2l0aW9ucyk6CisgICAgICAg
IChKU0M6OkFjY2Vzc0Nhc2U6OmdlbmVyYXRlV2l0aEd1YXJkKToKKyAgICAgICAgKEpTQzo6UG9s
eW1vcnBoaWNBY2Nlc3M6OnZpc2l0V2Vhayk6CisgICAgICAgIChKU0M6OlBvbHltb3JwaGljQWNj
ZXNzOjpwcm9wYWdhdGVUcmFuc2l0aW9ucyk6CisgICAgICAgIChKU0M6OlBvbHltb3JwaGljQWNj
ZXNzOjpkdW1wKToKKyAgICAgICAgKiBieXRlY29kZS9Qb2x5bW9ycGhpY0FjY2Vzcy5oOgorICAg
ICAgICAqIGJ5dGVjb2RlL1N0cnVjdHVyZVN0dWJJbmZvLmNwcDoKKyAgICAgICAgKEpTQzo6U3Ry
dWN0dXJlU3R1YkluZm86OnZpc2l0V2Vha1JlZmVyZW5jZXMpOgorICAgICAgICAoSlNDOjpTdHJ1
Y3R1cmVTdHViSW5mbzo6cHJvcGFnYXRlVHJhbnNpdGlvbnMpOgorICAgICAgICAoSlNDOjpTdHJ1
Y3R1cmVTdHViSW5mbzo6Y29udGFpbnNQQyk6CisgICAgICAgICogYnl0ZWNvZGUvU3RydWN0dXJl
U3R1YkluZm8uaDoKKyAgICAgICAgKEpTQzo6U3RydWN0dXJlU3R1YkluZm86OmNvbnNpZGVyQ2Fj
aGluZyk6CisgICAgICAgICogcnVudGltZS9TdHJ1Y3R1cmUuY3BwOgorICAgICAgICAoSlNDOjpT
dHJ1Y3R1cmU6OnZpc2l0Q2hpbGRyZW4pOgorICAgICAgICAoSlNDOjpTdHJ1Y3R1cmU6OmlzQ2hl
YXBEdXJpbmdHQyk6CisgICAgICAgIChKU0M6OlN0cnVjdHVyZTo6bWFya0lmQ2hlYXApOgorICAg
ICAgICAoSlNDOjpTdHJ1Y3R1cmU6OnByb3RvdHlwZUNoYWluTWF5SW50ZXJjZXB0U3RvcmVUbyk6
CisgICAgICAgICogcnVudGltZS9TdHJ1Y3R1cmUuaDoKKwogMjAxNi0wNS0wMyAgTWljaGFlbCBT
YWJvZmYgIDxtc2Fib2ZmQGFwcGxlLmNvbT4KIAogICAgICAgICBDcmFzaDogQXJyYXkucHJvdG90
eXBlLnNsaWNlKCkgYW5kIC5zcGxpY2UoKSBjYW4gY2FsbCBmYXN0U2xpY2UoKSBhZnRlciBhbiBh
cnJheSBpcyB0cnVuY2F0ZWQKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9D
b2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29k
ZS9Db2RlQmxvY2suY3BwCShyZXZpc2lvbiAyMDAzNDYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYxNiwzMiArMjYx
NiwxNiBAQCB2b2lkIENvZGVCbG9jazo6cHJvcGFnYXRlVHJhbnNpdGlvbnMoU2xvCiAKICNpZiBF
TkFCTEUoSklUKQogICAgIGlmIChKSVRDb2RlOjppc0pJVChqaXRUeXBlKCkpKSB7Ci0gICAgICAg
IGZvciAoQmFnPFN0cnVjdHVyZVN0dWJJbmZvPjo6aXRlcmF0b3IgaXRlciA9IG1fc3R1YkluZm9z
LmJlZ2luKCk7ICEhaXRlcjsgKytpdGVyKSB7Ci0gICAgICAgICAgICBTdHJ1Y3R1cmVTdHViSW5m
byYgc3R1YkluZm8gPSAqKml0ZXI7Ci0gICAgICAgICAgICBpZiAoc3R1YkluZm8uY2FjaGVUeXBl
ICE9IENhY2hlVHlwZTo6U3R1YikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIFBvbHltb3JwaGljQWNjZXNzKiBsaXN0ID0gc3R1YkluZm8udS5zdHViOwotICAgICAgICAg
ICAgSlNDZWxsKiBvcmlnaW4gPSBzdHViSW5mby5jb2RlT3JpZ2luLmNvZGVPcmlnaW5Pd25lcigp
OwotICAgICAgICAgICAgaWYgKG9yaWdpbiAmJiAhSGVhcDo6aXNNYXJrZWQob3JpZ2luKSkgewot
ICAgICAgICAgICAgICAgIGFsbEFyZU1hcmtlZFNvRmFyID0gZmFsc2U7Ci0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGog
PSBsaXN0LT5zaXplKCk7IGotLTspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBBY2Nlc3NDYXNl
JiBhY2Nlc3MgPSBsaXN0LT5hdChqKTsKLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzLnR5cGUo
KSAhPSBBY2Nlc3NDYXNlOjpUcmFuc2l0aW9uKQotICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgICAgICBpZiAoSGVhcDo6aXNNYXJrZWQoYWNjZXNzLnN0cnVjdHVyZSgp
KSkKLSAgICAgICAgICAgICAgICAgICAgdmlzaXRvci5hcHBlbmRVbmJhcnJpZXJlZFJlYWRPbmx5
UG9pbnRlcihhY2Nlc3MubmV3U3RydWN0dXJlKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgYWxsQXJlTWFya2VkU29GYXIgPSBmYWxzZTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQorICAgICAgICBmb3IgKEJhZzxTdHJ1Y3R1cmVTdHViSW5mbz46Oml0ZXJh
dG9yIGl0ZXIgPSBtX3N0dWJJbmZvcy5iZWdpbigpOyAhIWl0ZXI7ICsraXRlcikKKyAgICAgICAg
ICAgIGFsbEFyZU1hcmtlZFNvRmFyICY9ICgqaXRlciktPnByb3BhZ2F0ZVRyYW5zaXRpb25zKHZp
c2l0b3IpOwogICAgIH0KICNlbmRpZiAvLyBFTkFCTEUoSklUKQogICAgIAogI2lmIEVOQUJMRShE
RkdfSklUKQogICAgIGlmIChKSVRDb2RlOjppc09wdGltaXppbmdKSVQoaml0VHlwZSgpKSkgewog
ICAgICAgICBERkc6OkNvbW1vbkRhdGEqIGRmZ0NvbW1vbiA9IG1faml0Q29kZS0+ZGZnQ29tbW9u
KCk7CisgICAgICAgIGZvciAoYXV0byYgd2Vha1JlZmVyZW5jZSA6IGRmZ0NvbW1vbi0+d2Vha1N0
cnVjdHVyZVJlZmVyZW5jZXMpCisgICAgICAgICAgICBhbGxBcmVNYXJrZWRTb0ZhciAmPSB3ZWFr
UmVmZXJlbmNlLT5tYXJrSWZDaGVhcCh2aXNpdG9yKTsKICAgICAgICAgCiAgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBkZmdDb21tb24tPnRyYW5zaXRpb25zLnNpemUoKTsgKytpKSB7
CiAgICAgICAgICAgICBpZiAoc2hvdWxkTWFya1RyYW5zaXRpb24oZGZnQ29tbW9uLT50cmFuc2l0
aW9uc1tpXSkpIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Qb2x5bW9y
cGhpY0FjY2Vzcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b2RlL1BvbHltb3JwaGljQWNjZXNzLmNwcAkocmV2aXNpb24gMjAwMzQ2KQorKysgU291cmNlL0ph
dmFTY3JpcHRDb3JlL2J5dGVjb2RlL1BvbHltb3JwaGljQWNjZXNzLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTU0LDYgKzU1NCwyNyBAQCBib29sIEFjY2Vzc0Nhc2U6OnZpc2l0V2VhayhWTSYgdm0p
IGNvbnN0CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgQWNjZXNzQ2FzZTo6cHJvcGFnYXRl
VHJhbnNpdGlvbnMoU2xvdFZpc2l0b3ImIHZpc2l0b3IpIGNvbnN0Cit7CisgICAgYm9vbCByZXN1
bHQgPSB0cnVlOworICAgIAorICAgIGlmIChtX3N0cnVjdHVyZSkKKyAgICAgICAgcmVzdWx0ICY9
IG1fc3RydWN0dXJlLT5tYXJrSWZDaGVhcCh2aXNpdG9yKTsKKyAgICAKKyAgICBzd2l0Y2ggKG1f
dHlwZSkgeworICAgIGNhc2UgVHJhbnNpdGlvbjoKKyAgICAgICAgaWYgKEhlYXA6OmlzTWFya2Vk
KG1fc3RydWN0dXJlLT5wcmV2aW91c0lEKCkpKQorICAgICAgICAgICAgdmlzaXRvci5hcHBlbmRV
bmJhcnJpZXJlZFJlYWRPbmx5UG9pbnRlcihtX3N0cnVjdHVyZS5nZXQoKSk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBkZWZh
dWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30K
Kwogdm9pZCBBY2Nlc3NDYXNlOjpnZW5lcmF0ZVdpdGhHdWFyZCgKICAgICBBY2Nlc3NHZW5lcmF0
aW9uU3RhdGUmIHN0YXRlLCBDQ2FsbEhlbHBlcnM6Okp1bXBMaXN0JiBmYWxsVGhyb3VnaCkKIHsK
QEAgLTE0ODcsNiArMTUwOCwxNCBAQCBib29sIFBvbHltb3JwaGljQWNjZXNzOjp2aXNpdFdlYWso
Vk0mIHZtCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgUG9seW1vcnBoaWNBY2Nlc3M6OnBy
b3BhZ2F0ZVRyYW5zaXRpb25zKFNsb3RWaXNpdG9yJiB2aXNpdG9yKSBjb25zdAoreworICAgIGJv
b2wgcmVzdWx0ID0gdHJ1ZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZSgpOyAr
K2kpCisgICAgICAgIHJlc3VsdCAmPSBhdChpKS5wcm9wYWdhdGVUcmFuc2l0aW9ucyh2aXNpdG9y
KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiB2b2lkIFBvbHltb3JwaGljQWNjZXNzOjpkdW1w
KFByaW50U3RyZWFtJiBvdXQpIGNvbnN0CiB7CiAgICAgb3V0LnByaW50KFJhd1BvaW50ZXIodGhp
cyksICI6WyIpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1BvbHltb3Jw
aGljQWNjZXNzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2Rl
L1BvbHltb3JwaGljQWNjZXNzLmgJKHJldmlzaW9uIDIwMDM0NikKKysrIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ieXRlY29kZS9Qb2x5bW9ycGhpY0FjY2Vzcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
NDgsNiArMjQ4LDcgQEAgcHJpdmF0ZToKICAgICBBY2Nlc3NDYXNlKCk7CiAKICAgICBib29sIHZp
c2l0V2VhayhWTSYpIGNvbnN0OworICAgIGJvb2wgcHJvcGFnYXRlVHJhbnNpdGlvbnMoU2xvdFZp
c2l0b3ImKSBjb25zdDsKICAgICAKICAgICAvLyBGSVhNRTogVGhpcyBvbmx5IGV4aXN0cyBiZWNh
dXNlIG9mIGhvdyBBY2Nlc3NDYXNlIHB1dHMgcG9zdC1nZW5lcmF0aW9uIHRoaW5ncyBpbnRvIGl0
c2VsZi4KICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2
NDU2CkBAIC0zOTYsNiArMzk3LDEwIEBAIHB1YmxpYzoKIAogICAgIC8vIElmIHRoaXMgcmV0dXJu
cyBmYWxzZSB0aGVuIHdlIGFyZSByZXF1ZXN0aW5nIGEgcmVzZXQgb2YgdGhlIG93bmluZyBTdHJ1
Y3R1cmVTdHViSW5mby4KICAgICBib29sIHZpc2l0V2VhayhWTSYpIGNvbnN0OworICAgIAorICAg
IC8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIGl0IGhhcyBtYXJrZWQgZXZlcnl0aGluZyBpdCB3aWxs
IGV2ZXIgbWFya2VkLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuCisgICAgLy8gb3B0aW1pemF0aW9u
IHRvIHRoZW4gYXZvaWQgY2FsbGluZyB0aGlzIG1ldGhvZCBhZ2FpbiBkdXJpbmcgdGhlIGZpeHBv
aW50LgorICAgIGJvb2wgcHJvcGFnYXRlVHJhbnNpdGlvbnMoU2xvdFZpc2l0b3ImKSBjb25zdDsK
IAogICAgIHZvaWQgYWJvdXRUb0RpZSgpOwogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvZGUvU3RydWN0dXJlU3R1YkluZm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ieXRlY29kZS9TdHJ1Y3R1cmVTdHViSW5mby5jcHAJKHJldmlzaW9uIDIwMDM0
NikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9TdHJ1Y3R1cmVTdHViSW5mby5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTIzMCw3ICsyMzAsMTAgQEAgdm9pZCBTdHJ1Y3R1cmVTdHVi
SW5mbzo6dmlzaXRXZWFrUmVmZXJlbgogewogICAgIFZNJiB2bSA9ICpjb2RlQmxvY2stPnZtKCk7
CiAgICAgCi0gICAgYnVmZmVyZWRTdHJ1Y3R1cmVzLmNsZWFyKCk7CisgICAgYnVmZmVyZWRTdHJ1
Y3R1cmVzLmdlbmVyaWNGaWx0ZXIoCisgICAgICAgIFsmXSAoU3RydWN0dXJlKiBzdHJ1Y3R1cmUp
IC0+IGJvb2wgeworICAgICAgICAgICAgcmV0dXJuIEhlYXA6OmlzTWFya2VkKHN0cnVjdHVyZSk7
CisgICAgICAgIH0pOwogCiAgICAgc3dpdGNoIChjYWNoZVR5cGUpIHsKICAgICBjYXNlIENhY2hl
VHlwZTo6R2V0QnlJZFNlbGY6CkBAIC0yNTAsNiArMjUzLDIyIEBAIHZvaWQgU3RydWN0dXJlU3R1
YkluZm86OnZpc2l0V2Vha1JlZmVyZW4KICAgICByZXNldEJ5R0MgPSB0cnVlOwogfQogCitib29s
IFN0cnVjdHVyZVN0dWJJbmZvOjpwcm9wYWdhdGVUcmFuc2l0aW9ucyhTbG90VmlzaXRvciYgdmlz
aXRvcikKK3sKKyAgICBzd2l0Y2ggKGNhY2hlVHlwZSkgeworICAgIGNhc2UgQ2FjaGVUeXBlOjpV
bnNldDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBDYWNoZVR5cGU6OkdldEJ5SWRT
ZWxmOgorICAgIGNhc2UgQ2FjaGVUeXBlOjpQdXRCeUlkUmVwbGFjZToKKyAgICAgICAgcmV0dXJu
IHUuYnlJZFNlbGYuYmFzZU9iamVjdFN0cnVjdHVyZS0+bWFya0lmQ2hlYXAodmlzaXRvcik7Cisg
ICAgY2FzZSBDYWNoZVR5cGU6OlN0dWI6CisgICAgICAgIHJldHVybiB1LnN0dWItPnByb3BhZ2F0
ZVRyYW5zaXRpb25zKHZpc2l0b3IpOworICAgIH0KKyAgICAKKyAgICBSRUxFQVNFX0FTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIFN0cnVjdHVyZVN0dWJJ
bmZvOjpjb250YWluc1BDKHZvaWQqIHBjKSBjb25zdAogewogICAgIGlmIChjYWNoZVR5cGUgIT0g
Q2FjaGVUeXBlOjpTdHViKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL1N0
cnVjdHVyZVN0dWJJbmZvLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb2RlL1N0cnVjdHVyZVN0dWJJbmZvLmgJKHJldmlzaW9uIDIwMDM0NikKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ieXRlY29kZS9TdHJ1Y3R1cmVTdHViSW5mby5oCSh3b3JraW5nIGNvcHkp
CkBAIC04MSw2ICs4MSw5IEBAIHB1YmxpYzoKICAgICAvLyBDaGVjayBpZiB0aGUgc3R1YiBoYXMg
d2VhayByZWZlcmVuY2VzIHRoYXQgYXJlIGRlYWQuIElmIGl0IGRvZXMsIHRoZW4gaXQgcmVzZXRz
IGl0c2VsZiwKICAgICAvLyBlaXRoZXIgZW50aXJlbHkgb3IganVzdCBlbm91Z2ggdG8gZW5zdXJl
IHRoYXQgdGhvc2UgZGVhZCBwb2ludGVycyBkb24ndCBnZXQgdXNlZCBhbnltb3JlLgogICAgIHZv
aWQgdmlzaXRXZWFrUmVmZXJlbmNlcyhDb2RlQmxvY2sqKTsKKyAgICAKKyAgICAvLyBUaGlzIHJl
dHVybnMgdHJ1ZSBpZiBpdCBoYXMgbWFya2VkIGV2ZXJ5dGhpbmcgdGhhdCBpdCB3aWxsIGV2ZXIg
bWFyay4KKyAgICBib29sIHByb3BhZ2F0ZVRyYW5zaXRpb25zKFNsb3RWaXNpdG9yJik7CiAgICAg
ICAgIAogICAgIEFMV0FZU19JTkxJTkUgYm9vbCBjb25zaWRlckNhY2hpbmcoU3RydWN0dXJlKiBz
dHJ1Y3R1cmUpCiAgICAgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvU3Ry
dWN0dXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9T
dHJ1Y3R1cmUuY3BwCShyZXZpc2lvbiAyMDAzNDYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9TdHJ1Y3R1cmUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTM1LDYgKzExMzUsMjEg
QEAgdm9pZCBTdHJ1Y3R1cmU6OnZpc2l0Q2hpbGRyZW4oSlNDZWxsKiBjZQogICAgIHZpc2l0b3Iu
YXBwZW5kKCZ0aGlzT2JqZWN0LT5tX2luZmVycmVkVHlwZVRhYmxlKTsKIH0KIAorYm9vbCBTdHJ1
Y3R1cmU6OmlzQ2hlYXBEdXJpbmdHQygpCit7CisgICAgcmV0dXJuICghbV9nbG9iYWxPYmplY3Qg
fHwgSGVhcDo6aXNNYXJrZWQobV9nbG9iYWxPYmplY3QuZ2V0KCkpKQorICAgICAgICAmJiAoIXN0
b3JlZFByb3RvdHlwZU9iamVjdCgpIHx8IEhlYXA6OmlzTWFya2VkKHN0b3JlZFByb3RvdHlwZU9i
amVjdCgpKSk7Cit9CisKK2Jvb2wgU3RydWN0dXJlOjptYXJrSWZDaGVhcChTbG90VmlzaXRvciYg
dmlzaXRvcikKK3sKKyAgICBpZiAoIWlzQ2hlYXBEdXJpbmdHQygpKQorICAgICAgICByZXR1cm4g
SGVhcDo6aXNNYXJrZWQodGhpcyk7CisgICAgCisgICAgdmlzaXRvci5hcHBlbmRVbmJhcnJpZXJl
ZFJlYWRPbmx5UG9pbnRlcih0aGlzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBTdHJ1
Y3R1cmU6OnByb3RvdHlwZUNoYWluTWF5SW50ZXJjZXB0U3RvcmVUbyhWTSYgdm0sIFByb3BlcnR5
TmFtZSBwcm9wZXJ0eU5hbWUpCiB7CiAgICAgaWYgKHBhcnNlSW5kZXgocHJvcGVydHlOYW1lKSkK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N0cnVjdHVyZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1N0cnVjdHVyZS5oCShyZXZpc2lv
biAyMDAzNDYpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9TdHJ1Y3R1cmUuaAko
d29ya2luZyBjb3B5KQpAQCAtMjYwLDYgKzI2MCwxMSBAQCBwdWJsaWM6CiAgICAgU3RydWN0dXJl
Q2hhaW4qIHByb3RvdHlwZUNoYWluKFZNJiwgSlNHbG9iYWxPYmplY3QqKSBjb25zdDsKICAgICBT
dHJ1Y3R1cmVDaGFpbiogcHJvdG90eXBlQ2hhaW4oRXhlY1N0YXRlKikgY29uc3Q7CiAgICAgc3Rh
dGljIHZvaWQgdmlzaXRDaGlsZHJlbihKU0NlbGwqLCBTbG90VmlzaXRvciYpOworICAgIAorICAg
IGJvb2wgaXNDaGVhcER1cmluZ0dDKCk7CisgICAgCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRo
aXMgc3RydWN0dXJlIGlzIG5vdyBtYXJrZWQuCisgICAgYm9vbCBtYXJrSWZDaGVhcChTbG90Vmlz
aXRvciYpOwogICAgICAgICAKICAgICAvLyBXaWxsIGp1c3QgdGhlIHByb3RvdHlwZSBjaGFpbiBp
bnRlcmNlcHQgdGhpcyBwcm9wZXJ0eSBhY2Nlc3M/CiAgICAgSlNfRVhQT1JUX1BSSVZBVEUgYm9v
bCBwcm90b3R5cGVDaGFpbk1heUludGVyY2VwdFN0b3JlVG8oVk0mLCBQcm9wZXJ0eU5hbWUpOwo=
</data>
<flag name="review"
          id="302188"
          type_id="1"
          status="+"
          setter="mark.lam"
    />
          </attachment>
      

    </bug>

</bugzilla>