<?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>54133</bug_id>
          
          <creation_ts>2011-02-09 12:19:14 -0800</creation_ts>
          <short_desc>[chromium] Replace tiler data structure with something smarter</short_desc>
          <delta_ts>2011-03-10 14:47:50 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adrienne Walker">enne</reporter>
          <assigned_to name="Adrienne Walker">enne</assigned_to>
          <cc>enne</cc>
    
    <cc>jamesr</cc>
    
    <cc>kbr</cc>
    
    <cc>nduca</cc>
    
    <cc>vangelis</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>348459</commentid>
    <comment_count>0</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-02-09 12:19:14 -0800</bug_when>
    <thetext>Currently, Chromium&apos;s tiled compositor uses a logical 2D array to hold all the tiles in a page, where their position is implicit based on their location in the array.  If the page size is large, this is inefficient.  At extremely large page sizes, this becomes impossible due to integer arithmetic overflow.

This needs to be changed to something that uses less memory and is more efficient when resizing.  Even just storing position explicitly and having a flat list of &quot;visible&quot; tiles might be just as reasonable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>355662</commentid>
    <comment_count>1</comment_count>
      <attachid>83403</attachid>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-02-22 15:51:08 -0800</bug_when>
    <thetext>Created attachment 83403
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>356261</commentid>
    <comment_count>2</comment_count>
      <attachid>83403</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-23 11:44:48 -0800</bug_when>
    <thetext>Comment on attachment 83403
Patch

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

Looks good overall. A couple of minor comments/questions and one small must-fix bug.

&gt; Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp:206
&gt;      for (size_t i = 0; i &lt; m_tiles.size(); ++i) {
&gt; -        if (m_tiles[i])
&gt; -            m_unusedTiles.append(m_tiles[i].release());
&gt; +        m_unusedTiles.append(m_tiles[i].release());
&gt;      }

No braces for one-line bodies.

&gt; Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp:223
&gt; +    // To avoid an O(n^2) check for tile existence via tileAt, keep a flag
&gt; +    // vector indexed by tile location marking all the tiles we&apos;ve seen already.

Wouldn&apos;t it be better to just bite the bullet and use a HashMap whose keys are the (i,j) pairs of ints and whose values are Tile*&apos;s?

&gt; Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp:497
&gt; +    m_tiler-&gt;m_tiles[m_idx].release();

This leaks memory! You probably meant to call clear(), but you shouldn&apos;t need to do this at all -- the resize() call after the swap() should take care of destroying the last OwnPtr&lt;Tile&gt; and therefore its referent.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>356270</commentid>
    <comment_count>3</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-02-23 11:52:58 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 83403 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=83403&amp;action=review
&gt; 
&gt; Looks good overall. A couple of minor comments/questions and one small must-fix bug.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp:206
&gt; &gt;      for (size_t i = 0; i &lt; m_tiles.size(); ++i) {
&gt; &gt; -        if (m_tiles[i])
&gt; &gt; -            m_unusedTiles.append(m_tiles[i].release());
&gt; &gt; +        m_unusedTiles.append(m_tiles[i].release());
&gt; &gt;      }
&gt; 
&gt; No braces for one-line bodies.

Oh, quite right.  I&apos;m sad that check-webkit-style didn&apos;t yell at me first.

&gt; &gt; Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp:223
&gt; &gt; +    // To avoid an O(n^2) check for tile existence via tileAt, keep a flag
&gt; &gt; +    // vector indexed by tile location marking all the tiles we&apos;ve seen already.
&gt; 
&gt; Wouldn&apos;t it be better to just bite the bullet and use a HashMap whose keys are the (i,j) pairs of ints and whose values are Tile*&apos;s?

That&apos;s a good suggestion.  It&apos;d probably clean up this code quite a bit, so I&apos;ll look into that.

&gt; &gt; Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp:497
&gt; &gt; +    m_tiler-&gt;m_tiles[m_idx].release();
&gt; 
&gt; This leaks memory! You probably meant to call clear(), but you shouldn&apos;t need to do this at all -- the resize() call after the swap() should take care of destroying the last OwnPtr&lt;Tile&gt; and therefore its referent.

Ack! You&apos;re quite right.  Thanks for catching that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>357120</commentid>
    <comment_count>4</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-02-24 09:53:19 -0800</bug_when>
    <thetext>Re: HashMap.  It&apos;s definitely the right data structure to use and the code is a lot cleaner for it.  However, as it turns out, HashMap is incompatible with OwnPtr as a value type (because there&apos;s no copy constructor on an OwnPtr).

The easiest, but most terrible solution is to leak/adopt the memory manually in LayerTilerChromium when adding and removing from the HashMap, but it subverts the whole reason for using OwnPtr in the first place.

A better approach might be creating an OwnPtrHashMap.  abarth proposed this last year, but it didn&apos;t materialize.  I think it also might be possible to add some additional template parameters to HashMap to allow for the storing of raw pointers in the underlying implementation but use PassOwnPtr at the HashMap API boundary to ensure that no memory leaks.

This looks like a not terribly small yak to shave, so I will likely punt on this patch temporarily.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>357122</commentid>
    <comment_count>5</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-02-24 09:56:08 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Re: HashMap.  It&apos;s definitely the right data structure to use and the code is a lot cleaner for it.  However, as it turns out, HashMap is incompatible with OwnPtr as a value type (because there&apos;s no copy constructor on an OwnPtr).
&gt; 
&gt; The easiest, but most terrible solution is to leak/adopt the memory manually in LayerTilerChromium when adding and removing from the HashMap, but it subverts the whole reason for using OwnPtr in the first place.
&gt; 
&gt; A better approach might be creating an OwnPtrHashMap.  abarth proposed this last year, but it didn&apos;t materialize.  I think it also might be possible to add some additional template parameters to HashMap to allow for the storing of raw pointers in the underlying implementation but use PassOwnPtr at the HashMap API boundary to ensure that no memory leaks.
&gt; 
&gt; This looks like a not terribly small yak to shave, so I will likely punt on this patch temporarily.

I assume you mean you&apos;ll go ahead with using a list and then potentially upgrade to a hash map in the future? I don&apos;t mean to derail this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>365473</commentid>
    <comment_count>6</comment_count>
      <attachid>85383</attachid>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-03-10 13:11:58 -0800</bug_when>
    <thetext>Created attachment 85383
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>365520</commentid>
    <comment_count>7</comment_count>
      <attachid>85383</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-03-10 14:03:33 -0800</bug_when>
    <thetext>Comment on attachment 85383
Patch

This looks much better. Thanks for cleaning it up and researching how best to use a map for the tiles.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>365549</commentid>
    <comment_count>8</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2011-03-10 14:47:50 -0800</bug_when>
    <thetext>Committed r80767: &lt;http://trac.webkit.org/changeset/80767&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>83403</attachid>
            <date>2011-02-22 15:51:08 -0800</date>
            <delta_ts>2011-03-10 13:11:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-54133-20110222155107.patch</filename>
            <type>text/plain</type>
            <size>28290</size>
            <attacher name="Adrienne Walker">enne</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogNzkzMDEKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBkMzE4NGNlNWQ4M2ZkZTA5
YTUxY2MzNzlhMGZjNzQ4MjFhYzdiN2VkLi5iN2Y2MTljYTIyNWIzNmNlMDM0NjcwMGJkODg1OGQ4
MjJmNTI0YzQ3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDYgQEAKKzIwMTEtMDItMjIgIEFkcmll
bm5lIFdhbGtlciAgPGVubmVAZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBbY2hyb21pdW1dIE1ha2UgdGlsZWQgY29tcG9zaXRvciBk
YXRhIHN0cnVjdHVyZSBtb3JlIGVmZmljaWVudC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTU0MTMzCisKKyAgICAgICAgUHJldmlvdXNseSwgdGhlIGNv
bXBvc2l0b3IgaGFkIGEgc3BhcnNlIDJEIGFycmF5IG9mIHRpbGVzIGZvciB0aGUKKyAgICAgICAg
d2hvbGUgcGFnZSwgbW9zdCBvZiB3aGljaCB3ZXJlIG51bGwuICBUaGUgdGlsZXMgd2VyZSBpbXBs
aWNpdGx5CisgICAgICAgIGxvY2F0ZWQgYmFzZWQgb24gdGhlaXIgcG9zaXRpb24gaW4gdGhlIGFy
cmF5LiBUaGlzIHdhcyBpbmVmZmljaWVudAorICAgICAgICB3aGVuIHRoZSBwYWdlIGdyZXcgKGUu
Zy4gaW5maW5pdGUgc2Nyb2xsaW5nKSBhbmQgY2F1c2VkIHNvbWUgYnVncworICAgICAgICAoZS5n
LiB3aWR0aCAqIGhlaWdodCA+IE1BWF9JTlQpLiAgVGhpcyBjaGFuZ2UgbW9kaWZpZXMgdGlsZXMg
dG8gaGF2ZQorICAgICAgICBleHBsaWNpdCBwb3NpdGlvbnMgc28gdGhleSBjYW4gYmUgc3RvcmVk
IGluIGEgcGFja2VkIGFycmF5LgorCisgICAgICAgIFRlc3RzOiBMYXlvdXRUZXN0cy9jb21wb3Np
dGluZy8KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyVGlsZXJD
aHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OnJlc2V0
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6Y3JlYXRlVGlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OmludmFsaWRhdGVUaWxlcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OmNvbnRlbnRSZWN0VG9UaWxlSW5k
aWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OnRpbGVBdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OnRpbGVDb250ZW50UmVjdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OnRpbGVMYXllclJlY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlckNocm9taXVtOjppbnZhbGlkYXRlUmVjdCk6CisgICAg
ICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OmludmFsaWRhdGVFbnRpcmVMYXllcik6
CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OnVwZGF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OmRyYXcpOgorICAgICAgICAoV2ViQ29yZTo6
TGF5ZXJUaWxlckNocm9taXVtOjpncm93TGF5ZXJUb0NvbnRhaW4pOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlckNocm9taXVtOjpSZWN0VGlsZUl0ZXJhdG9yOjpSZWN0VGlsZUl0ZXJhdG9y
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6UmVjdFRpbGVJdGVyYXRv
cjo6bmV4dEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6UmVj
dFRpbGVJdGVyYXRvcjo6b3BlcmF0b3IrKyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVy
Q2hyb21pdW06OlJlY3RUaWxlSXRlcmF0b3I6Om9wZXJhdG9yKik6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllclRpbGVyQ2hyb21pdW06OlJlY3RUaWxlSXRlcmF0b3I6OmVyYXNlKToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6SW5zaWRlUmVjdFRpbGVJdGVyYXRvcjo6SW5z
aWRlUmVjdFRpbGVJdGVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21p
dW06Ok91dHNpZGVSZWN0VGlsZUl0ZXJhdG9yOjpPdXRzaWRlUmVjdFRpbGVJdGVyYXRvcik6Cisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJUaWxlckNocm9taXVtLmg6
CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OlRpbGU6OlRpbGUpOgorICAg
ICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlckNocm9taXVtOjpUaWxlOjppKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6VGlsZTo6aik6CisgICAgICAgIChXZWJDb3JlOjpM
YXllclRpbGVyQ2hyb21pdW06OlRpbGU6Om1vdmVUbyk6CisgICAgICAgIChXZWJDb3JlOjpMYXll
clRpbGVyQ2hyb21pdW06OlJlY3RUaWxlSXRlcmF0b3I6OmlkeCk6CisKIDIwMTEtMDItMjIgIFN0
ZXZlIExhY2V5ICA8c2psQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJp
biBGaXNoZXIuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9MYXllclRpbGVyQ2hyb21pdW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJUaWxlckNocm9taXVtLmNwcAppbmRleCBkNGU4MzkxM2I5
OTJlZWI3OWVkMDUxNWQyZWEwYjkzM2YwZmVkNWM3Li41MTFlZjE5Y2M5YzZiMDllOTVhNzg4Y2I0
N2JlMzI5NGQ0YWY2NDBlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9MYXllclRpbGVyQ2hyb21pdW0uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyVGlsZXJDaHJvbWl1bS5jcHAKQEAgLTkx
LDU4ICs5MSw0MiBAQCB2b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6cmVzZXQoKQogewogICAgIG1f
dGlsZXMuY2xlYXIoKTsKICAgICBtX3VudXNlZFRpbGVzLmNsZWFyKCk7Ci0KICAgICBtX3RpbGlu
Z0RhdGEuc2V0VG90YWxTaXplKDAsIDApOwotICAgIG1fbGFzdFVwZGF0ZUxheWVyUmVjdCA9IElu
dFJlY3QoKTsKIH0KIAogTGF5ZXJUaWxlckNocm9taXVtOjpUaWxlKiBMYXllclRpbGVyQ2hyb21p
dW06OmNyZWF0ZVRpbGUoaW50IGksIGludCBqKQogewotICAgIGNvbnN0IGludCBpbmRleCA9IHRp
bGVJbmRleChpLCBqKTsKLSAgICBBU1NFUlQoIW1fdGlsZXNbaW5kZXhdKTsKKyAgICBBU1NFUlQo
IXRpbGVBdChpLCBqKSk7CiAKICAgICBpZiAobV91bnVzZWRUaWxlcy5zaXplKCkgPiAwKSB7Ci0g
ICAgICAgIG1fdGlsZXNbaW5kZXhdID0gbV91bnVzZWRUaWxlcy5sYXN0KCkucmVsZWFzZSgpOwor
ICAgICAgICBtX3RpbGVzLmFwcGVuZChtX3VudXNlZFRpbGVzLmxhc3QoKS5yZWxlYXNlKCkpOwog
ICAgICAgICBtX3VudXNlZFRpbGVzLnJlbW92ZUxhc3QoKTsKICAgICB9IGVsc2UgewogICAgICAg
ICBHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCA9IGxheWVyUmVuZGVyZXJDb250ZXh0KCk7CiAg
ICAgICAgIFRleHR1cmVNYW5hZ2VyKiBtYW5hZ2VyID0gbGF5ZXJSZW5kZXJlcigpLT50ZXh0dXJl
TWFuYWdlcigpOwotICAgICAgICBPd25QdHI8VGlsZT4gdGlsZSA9IGFkb3B0UHRyKG5ldyBUaWxl
KExheWVyVGV4dHVyZTo6Y3JlYXRlKGNvbnRleHQsIG1hbmFnZXIpKSk7Ci0gICAgICAgIG1fdGls
ZXNbaW5kZXhdID0gdGlsZS5yZWxlYXNlKCk7CisgICAgICAgIE93blB0cjxUaWxlPiBuZXdUaWxl
ID0gYWRvcHRQdHIobmV3IFRpbGUoTGF5ZXJUZXh0dXJlOjpjcmVhdGUoY29udGV4dCwgbWFuYWdl
cikpKTsKKyAgICAgICAgbV90aWxlcy5hcHBlbmQobmV3VGlsZS5yZWxlYXNlKCkpOwogICAgIH0K
KyAgICBUaWxlKiB0aWxlID0gbV90aWxlcy5sYXN0KCkuZ2V0KCk7CisgICAgQVNTRVJUKHRpbGUp
OwogCi0gICAgbV90aWxlc1tpbmRleF0tPm1fZGlydHlMYXllclJlY3QgPSB0aWxlTGF5ZXJSZWN0
KGksIGopOwotICAgIHJldHVybiBtX3RpbGVzW2luZGV4XS5nZXQoKTsKKyAgICB0aWxlLT5tb3Zl
VG8oaSwgaik7CisgICAgdGlsZS0+bV9kaXJ0eUxheWVyUmVjdCA9IHRpbGVMYXllclJlY3QodGls
ZSk7CisgICAgcmV0dXJuIHRpbGU7CiB9CiAKLXZvaWQgTGF5ZXJUaWxlckNocm9taXVtOjppbnZh
bGlkYXRlVGlsZXMoY29uc3QgSW50UmVjdCYgb2xkTGF5ZXJSZWN0LCBjb25zdCBJbnRSZWN0JiBu
ZXdMYXllclJlY3QpCit2b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6aW52YWxpZGF0ZVRpbGVzKGNv
bnN0IEludFJlY3QmIGNvbnRlbnRSZWN0KQogewogICAgIGlmICghbV90aWxlcy5zaXplKCkpCiAg
ICAgICAgIHJldHVybjsKIAotICAgIEludFJlY3Qgb2xkQ29udGVudFJlY3QgPSBsYXllclJlY3RU
b0NvbnRlbnRSZWN0KG9sZExheWVyUmVjdCk7Ci0gICAgaW50IG9sZExlZnQsIG9sZFRvcCwgb2xk
UmlnaHQsIG9sZEJvdHRvbTsKLSAgICBjb250ZW50UmVjdFRvVGlsZUluZGljZXMob2xkQ29udGVu
dFJlY3QsIG9sZExlZnQsIG9sZFRvcCwgb2xkUmlnaHQsIG9sZEJvdHRvbSk7Ci0KLSAgICBJbnRS
ZWN0IG5ld0NvbnRlbnRSZWN0ID0gbGF5ZXJSZWN0VG9Db250ZW50UmVjdChuZXdMYXllclJlY3Qp
OwotICAgIGludCBuZXdMZWZ0LCBuZXdUb3AsIG5ld1JpZ2h0LCBuZXdCb3R0b207Ci0gICAgY29u
dGVudFJlY3RUb1RpbGVJbmRpY2VzKG5ld0NvbnRlbnRSZWN0LCBuZXdMZWZ0LCBuZXdUb3AsIG5l
d1JpZ2h0LCBuZXdCb3R0b20pOwotCi0gICAgLy8gSXRlcmF0aW5nIHRocm91Z2gganVzdCB0aGUg
b2xkIHRpbGUgaW5kaWNlcyBpcyBhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQKLSAgICAvLyBpdGVy
YXRpbmcgdGhyb3VnaCB0aGUgZW50aXJlIG1fdGlsZXMgYXJyYXkuCi0gICAgZm9yIChpbnQgaiA9
IG9sZFRvcDsgaiA8PSBvbGRCb3R0b207ICsraikgewotICAgICAgICBmb3IgKGludCBpID0gb2xk
TGVmdDsgaSA8PSBvbGRSaWdodDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoaSA+PSBuZXdMZWZ0
ICYmIGkgPD0gbmV3UmlnaHQgJiYgaiA+PSBuZXdUb3AgJiYgaiA8PSBuZXdCb3R0b20pCi0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IHRp
bGVJbmRleChpLCBqKTsKLSAgICAgICAgICAgIGlmIChtX3RpbGVzW2luZGV4XSkKLSAgICAgICAg
ICAgICAgICBtX3VudXNlZFRpbGVzLmFwcGVuZChtX3RpbGVzW2luZGV4XS5yZWxlYXNlKCkpOwot
ICAgICAgICB9CisgICAgZm9yIChPdXRzaWRlUmVjdFRpbGVJdGVyYXRvciBpdGVyKHRoaXMsIGNv
bnRlbnRSZWN0KTsgKml0ZXI7IGl0ZXIuZXJhc2UoKSkgeworICAgICAgICBzaXplX3QgaWR4ID0g
aXRlci5pZHgoKTsKKyAgICAgICAgbV91bnVzZWRUaWxlcy5hcHBlbmQobV90aWxlc1tpZHhdLnJl
bGVhc2UoKSk7CiAgICAgfQogfQogCi12b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6Y29udGVudFJl
Y3RUb1RpbGVJbmRpY2VzKGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0LCBpbnQgJmxlZnQsIGlu
dCAmdG9wLCBpbnQgJnJpZ2h0LCBpbnQgJmJvdHRvbSkgY29uc3QKK3ZvaWQgTGF5ZXJUaWxlckNo
cm9taXVtOjpjb250ZW50UmVjdFRvVGlsZUluZGljZXMoY29uc3QgSW50UmVjdCYgY29udGVudFJl
Y3QsIGludCYgbGVmdCwgaW50JiB0b3AsIGludCYgcmlnaHQsIGludCYgYm90dG9tKSBjb25zdAog
ewogICAgIGNvbnN0IEludFJlY3QgbGF5ZXJSZWN0ID0gY29udGVudFJlY3RUb0xheWVyUmVjdChj
b250ZW50UmVjdCk7CiAKQEAgLTE3MCwzNiArMTU0LDMyIEBAIEludFJlY3QgTGF5ZXJUaWxlckNo
cm9taXVtOjpsYXllclJlY3RUb0NvbnRlbnRSZWN0KGNvbnN0IEludFJlY3QmIGxheWVyUmVjdCkg
Y29uCiAgICAgcmV0dXJuIGNvbnRlbnRSZWN0OwogfQogCi1pbnQgTGF5ZXJUaWxlckNocm9taXVt
Ojp0aWxlSW5kZXgoaW50IGksIGludCBqKSBjb25zdAorTGF5ZXJUaWxlckNocm9taXVtOjpUaWxl
KiBMYXllclRpbGVyQ2hyb21pdW06OnRpbGVBdChpbnQgaSwgaW50IGopIGNvbnN0CiB7Ci0gICAg
cmV0dXJuIG1fdGlsaW5nRGF0YS50aWxlSW5kZXgoaSwgaik7CisgICAgZm9yIChzaXplX3QgaWR4
ID0gMDsgaWR4IDwgbV90aWxlcy5zaXplKCk7ICsraWR4KSB7CisgICAgICAgIFRpbGUqIHRpbGUg
PSBtX3RpbGVzW2lkeF0uZ2V0KCk7CisgICAgICAgIGlmICh0aWxlLT5pKCkgPT0gaSAmJiB0aWxl
LT5qKCkgPT0gaikKKyAgICAgICAgICAgIHJldHVybiB0aWxlOworICAgIH0KKworICAgIHJldHVy
biAwOwogfQogCi1JbnRSZWN0IExheWVyVGlsZXJDaHJvbWl1bTo6dGlsZUNvbnRlbnRSZWN0KGlu
dCBpLCBpbnQgaikgY29uc3QKK0ludFJlY3QgTGF5ZXJUaWxlckNocm9taXVtOjp0aWxlQ29udGVu
dFJlY3QoY29uc3QgVGlsZSogdGlsZSkgY29uc3QKIHsKLSAgICBJbnRSZWN0IGNvbnRlbnRSZWN0
ID0gdGlsZUxheWVyUmVjdChpLCBqKTsKKyAgICBJbnRSZWN0IGNvbnRlbnRSZWN0ID0gdGlsZUxh
eWVyUmVjdCh0aWxlKTsKICAgICBjb250ZW50UmVjdC5tb3ZlKG1fbGF5ZXJQb3NpdGlvbi54KCks
IG1fbGF5ZXJQb3NpdGlvbi55KCkpOwogICAgIHJldHVybiBjb250ZW50UmVjdDsKIH0KIAotSW50
UmVjdCBMYXllclRpbGVyQ2hyb21pdW06OnRpbGVMYXllclJlY3QoaW50IGksIGludCBqKSBjb25z
dAorSW50UmVjdCBMYXllclRpbGVyQ2hyb21pdW06OnRpbGVMYXllclJlY3QoY29uc3QgVGlsZSog
dGlsZSkgY29uc3QKIHsKLSAgICBjb25zdCBpbnQgaW5kZXggPSBtX3RpbGluZ0RhdGEudGlsZUlu
ZGV4KGksIGopOworICAgIGNvbnN0IGludCBpbmRleCA9IG1fdGlsaW5nRGF0YS50aWxlSW5kZXgo
dGlsZS0+aSgpLCB0aWxlLT5qKCkpOwogICAgIEludFJlY3QgbGF5ZXJSZWN0ID0gbV90aWxpbmdE
YXRhLnRpbGVCb3VuZHNXaXRoQm9yZGVyKGluZGV4KTsKICAgICBsYXllclJlY3Quc2V0U2l6ZSht
X3RpbGVTaXplKTsKICAgICByZXR1cm4gbGF5ZXJSZWN0OwogfQogCi1JbnRTaXplIExheWVyVGls
ZXJDaHJvbWl1bTo6bGF5ZXJTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gSW50U2l6ZShtX3Rp
bGluZ0RhdGEudG90YWxTaXplWCgpLCBtX3RpbGluZ0RhdGEudG90YWxTaXplWSgpKTsKLX0KLQot
SW50U2l6ZSBMYXllclRpbGVyQ2hyb21pdW06OmxheWVyVGlsZVNpemUoKSBjb25zdAotewotICAg
IHJldHVybiBJbnRTaXplKG1fdGlsaW5nRGF0YS5udW1UaWxlc1goKSwgbV90aWxpbmdEYXRhLm51
bVRpbGVzWSgpKTsKLX0KLQogdm9pZCBMYXllclRpbGVyQ2hyb21pdW06OmludmFsaWRhdGVSZWN0
KGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0KQogewogICAgIGlmIChjb250ZW50UmVjdC5pc0Vt
cHR5KCkpCkBAIC0yMDksMzIgKzE4OSwyNCBAQCB2b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6aW52
YWxpZGF0ZVJlY3QoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QpCiAKICAgICAvLyBEaXJ0eSBy
ZWN0cyBhcmUgYWx3YXlzIGluIGxheWVyIHNwYWNlLCBhcyB0aGUgbGF5ZXIgY291bGQgYmUgcmVw
b3NpdGlvbmVkCiAgICAgLy8gYWZ0ZXIgaW52YWxpZGF0aW9uLgotICAgIEludFJlY3QgbGF5ZXJS
ZWN0ID0gY29udGVudFJlY3RUb0xheWVyUmVjdChjb250ZW50UmVjdCk7CisgICAgY29uc3QgSW50
UmVjdCBsYXllclJlY3QgPSBjb250ZW50UmVjdFRvTGF5ZXJSZWN0KGNvbnRlbnRSZWN0KTsKIAot
ICAgIGludCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207Ci0gICAgY29udGVudFJlY3RUb1RpbGVJ
bmRpY2VzKGNvbnRlbnRSZWN0LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIGZvciAo
aW50IGogPSB0b3A7IGogPD0gYm90dG9tOyArK2opIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IGxl
ZnQ7IGkgPD0gcmlnaHQ7ICsraSkgewotICAgICAgICAgICAgVGlsZSogdGlsZSA9IG1fdGlsZXNb
dGlsZUluZGV4KGksIGopXS5nZXQoKTsKLSAgICAgICAgICAgIGlmICghdGlsZSkKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIEludFJlY3QgYm91bmQgPSB0aWxlTGF5ZXJS
ZWN0KGksIGopOwotICAgICAgICAgICAgYm91bmQuaW50ZXJzZWN0KGxheWVyUmVjdCk7Ci0gICAg
ICAgICAgICB0aWxlLT5tX2RpcnR5TGF5ZXJSZWN0LnVuaXRlKGJvdW5kKTsKLSAgICAgICAgfQor
ICAgIGZvciAoSW5zaWRlUmVjdFRpbGVJdGVyYXRvciBpdGVyKHRoaXMsIGNvbnRlbnRSZWN0KTsg
Kml0ZXI7ICsraXRlcikgeworICAgICAgICBUaWxlKiB0aWxlID0gKml0ZXI7CisgICAgICAgIElu
dFJlY3QgYm91bmQgPSB0aWxlTGF5ZXJSZWN0KHRpbGUpOworICAgICAgICBib3VuZC5pbnRlcnNl
Y3QobGF5ZXJSZWN0KTsKKyAgICAgICAgdGlsZS0+bV9kaXJ0eUxheWVyUmVjdC51bml0ZShib3Vu
ZCk7CiAgICAgfQogfQogCiB2b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6aW52YWxpZGF0ZUVudGly
ZUxheWVyKCkKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fdGlsZXMuc2l6ZSgpOyAr
K2kpIHsKLSAgICAgICAgaWYgKG1fdGlsZXNbaV0pCi0gICAgICAgICAgICBtX3VudXNlZFRpbGVz
LmFwcGVuZChtX3RpbGVzW2ldLnJlbGVhc2UoKSk7CisgICAgICAgIG1fdW51c2VkVGlsZXMuYXBw
ZW5kKG1fdGlsZXNbaV0ucmVsZWFzZSgpKTsKICAgICB9CiAgICAgbV90aWxlcy5jbGVhcigpOwog
CiAgICAgbV90aWxpbmdEYXRhLnNldFRvdGFsU2l6ZSgwLCAwKTsKLSAgICBtX2xhc3RVcGRhdGVM
YXllclJlY3QgPSBJbnRSZWN0KCk7CiB9CiAKIHZvaWQgTGF5ZXJUaWxlckNocm9taXVtOjp1cGRh
dGUoVGlsZVBhaW50SW50ZXJmYWNlJiBwYWludGVyLCBjb25zdCBJbnRSZWN0JiBjb250ZW50UmVj
dCkKQEAgLTI0NCwyNCArMjE2LDQ1IEBAIHZvaWQgTGF5ZXJUaWxlckNocm9taXVtOjp1cGRhdGUo
VGlsZVBhaW50SW50ZXJmYWNlJiBwYWludGVyLCBjb25zdCBJbnRSZWN0JiBjb250CiAKICAgICAv
LyBJbnZhbGlkYXRlIG9sZCB0aWxlcyB0aGF0IHdlcmUgcHJldmlvdXNseSB1c2VkIGJ1dCBhcmVu
J3QgaW4gdXNlIHRoaXMKICAgICAvLyBmcmFtZSBzbyB0aGF0IHRoZXkgY2FuIGdldCByZXVzZWQg
Zm9yIG5ldyB0aWxlcy4KLSAgICBJbnRSZWN0IGxheWVyUmVjdCA9IGNvbnRlbnRSZWN0VG9MYXll
clJlY3QoY29udGVudFJlY3QpOwotICAgIGludmFsaWRhdGVUaWxlcyhtX2xhc3RVcGRhdGVMYXll
clJlY3QsIGxheWVyUmVjdCk7Ci0gICAgbV9sYXN0VXBkYXRlTGF5ZXJSZWN0ID0gbGF5ZXJSZWN0
OwotCisgICAgaW52YWxpZGF0ZVRpbGVzKGNvbnRlbnRSZWN0KTsKICAgICBncm93TGF5ZXJUb0Nv
bnRhaW4oY29udGVudFJlY3QpOwogCi0gICAgLy8gQ3JlYXRlIHRpbGVzIGFzIG5lZWRlZCwgZXhw
YW5kaW5nIGEgZGlydHkgcmVjdCB0byBjb250YWluIGFsbAotICAgIC8vIHRoZSBkaXJ0eSByZWdp
b25zIGN1cnJlbnRseSBiZWluZyBkcmF3bi4KLSAgICBJbnRSZWN0IGRpcnR5TGF5ZXJSZWN0Owor
ICAgIC8vIFRvIGF2b2lkIGFuIE8obl4yKSBjaGVjayBmb3IgdGlsZSBleGlzdGVuY2UgdmlhIHRp
bGVBdCwga2VlcCBhIGZsYWcKKyAgICAvLyB2ZWN0b3IgaW5kZXhlZCBieSB0aWxlIGxvY2F0aW9u
IG1hcmtpbmcgYWxsIHRoZSB0aWxlcyB3ZSd2ZSBzZWVuIGFscmVhZHkuCiAgICAgaW50IGxlZnQs
IHRvcCwgcmlnaHQsIGJvdHRvbTsKICAgICBjb250ZW50UmVjdFRvVGlsZUluZGljZXMoY29udGVu
dFJlY3QsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgY29uc3QgaW50IGluZGV4V2lk
dGggPSByaWdodCAtIGxlZnQgKyAxOworICAgIGNvbnN0IGludCBpbmRleEhlaWdodCA9IGJvdHRv
bSAtIHRvcCArIDE7CisgICAgVmVjdG9yPGJvb2w+IHRpbGVFeGlzdHMoaW5kZXhXaWR0aCAqIGlu
ZGV4SGVpZ2h0LCBmYWxzZSk7CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGV4aXN0aW5n
IHRpbGVzLCBleHBhbmRpbmcgYSBkaXJ0eSByZWN0IHRvIGNvbnRhaW4KKyAgICAvLyBhbGwgdGhl
IGRpcnR5IHJlZ2lvbnMgY3VycmVudGx5IGJlaW5nIGRyYXduLgorICAgIEludFJlY3QgZGlydHlM
YXllclJlY3Q7CisgICAgZm9yIChJbnNpZGVSZWN0VGlsZUl0ZXJhdG9yIGl0ZXIodGhpcywgY29u
dGVudFJlY3QpOyAqaXRlcjsgKytpdGVyKSB7CisgICAgICAgIFRpbGUqIHRpbGUgPSAqaXRlcjsK
KyAgICAgICAgaWYgKCF0aWxlLT50ZXh0dXJlKCktPmlzVmFsaWQobV90aWxlU2l6ZSwgR3JhcGhp
Y3NDb250ZXh0M0Q6OlJHQkEpKQorICAgICAgICAgICAgdGlsZS0+bV9kaXJ0eUxheWVyUmVjdCA9
IHRpbGVMYXllclJlY3QodGlsZSk7CisgICAgICAgIGRpcnR5TGF5ZXJSZWN0LnVuaXRlKHRpbGUt
Pm1fZGlydHlMYXllclJlY3QpOworCisgICAgICAgIGNvbnN0IGludCBvZmZzZXRYID0gdGlsZS0+
aSgpIC0gbGVmdDsKKyAgICAgICAgY29uc3QgaW50IG9mZnNldFkgPSB0aWxlLT5qKCkgLSB0b3A7
CisgICAgICAgIGlmIChvZmZzZXRYIDwgMCB8fCBvZmZzZXRYID4gaW5kZXhXaWR0aCB8fCBvZmZz
ZXRZIDwgMCB8fCBvZmZzZXRZID4gaW5kZXhIZWlnaHQpCisgICAgICAgICAgICBDUkFTSCgpOwor
CisgICAgICAgIHRpbGVFeGlzdHNbb2Zmc2V0WCArIG9mZnNldFkgKiBpbmRleFdpZHRoXSA9IHRy
dWU7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGFueSBtaXNzaW5nIHRpbGVzIG5lZWRlZCB0byBk
cmF3IHRoZSBjb250ZW50IHJlY3QuCiAgICAgZm9yIChpbnQgaiA9IHRvcDsgaiA8PSBib3R0b207
ICsraikgewogICAgICAgICBmb3IgKGludCBpID0gbGVmdDsgaSA8PSByaWdodDsgKytpKSB7Ci0g
ICAgICAgICAgICBUaWxlKiB0aWxlID0gbV90aWxlc1t0aWxlSW5kZXgoaSwgaildLmdldCgpOwot
ICAgICAgICAgICAgaWYgKCF0aWxlKQotICAgICAgICAgICAgICAgIHRpbGUgPSBjcmVhdGVUaWxl
KGksIGopOwotICAgICAgICAgICAgaWYgKCF0aWxlLT50ZXh0dXJlKCktPmlzVmFsaWQobV90aWxl
U2l6ZSwgR3JhcGhpY3NDb250ZXh0M0Q6OlJHQkEpKQotICAgICAgICAgICAgICAgIHRpbGUtPm1f
ZGlydHlMYXllclJlY3QgPSB0aWxlTGF5ZXJSZWN0KGksIGopOworICAgICAgICAgICAgY29uc3Qg
aW50IG9mZnNldFggPSBpIC0gbGVmdDsKKyAgICAgICAgICAgIGNvbnN0IGludCBvZmZzZXRZID0g
aiAtIHRvcDsKKyAgICAgICAgICAgIGlmIChvZmZzZXRYIDwgMCB8fCBvZmZzZXRYID4gaW5kZXhX
aWR0aCB8fCBvZmZzZXRZIDwgMCB8fCBvZmZzZXRZID4gaW5kZXhIZWlnaHQpCisgICAgICAgICAg
ICAgICAgQ1JBU0goKTsKKyAgICAgICAgICAgIGlmICh0aWxlRXhpc3RzW29mZnNldFggKyBvZmZz
ZXRZICogaW5kZXhXaWR0aF0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
ICAgIFRpbGUqIHRpbGUgPSBjcmVhdGVUaWxlKGksIGopOwogICAgICAgICAgICAgZGlydHlMYXll
clJlY3QudW5pdGUodGlsZS0+bV9kaXJ0eUxheWVyUmVjdCk7CiAgICAgICAgIH0KICAgICB9CkBA
IC0zMTksNjcgKzMxMiw2MyBAQCB2b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6dXBkYXRlKFRpbGVQ
YWludEludGVyZmFjZSYgcGFpbnRlciwgY29uc3QgSW50UmVjdCYgY29udAogICAgIGlmICghbV90
aWxlcy5zaXplKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGZvciAoaW50IGogPSB0b3A7IGog
PD0gYm90dG9tOyArK2opIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7
ICsraSkgewotICAgICAgICAgICAgVGlsZSogdGlsZSA9IG1fdGlsZXNbdGlsZUluZGV4KGksIGop
XS5nZXQoKTsKLSAgICAgICAgICAgIGlmICghdGlsZSkKLSAgICAgICAgICAgICAgICBDUkFTSCgp
OwotICAgICAgICAgICAgaWYgKCF0aWxlLT5kaXJ0eSgpKQotICAgICAgICAgICAgICAgIGNvbnRp
bnVlOwotCi0gICAgICAgICAgICAvLyBDYWxjdWxhdGUgcGFnZS1zcGFjZSByZWN0YW5nbGUgdG8g
Y29weSBmcm9tLgotICAgICAgICAgICAgSW50UmVjdCBzb3VyY2VSZWN0ID0gdGlsZUNvbnRlbnRS
ZWN0KGksIGopOwotICAgICAgICAgICAgY29uc3QgSW50UG9pbnQgYW5jaG9yID0gc291cmNlUmVj
dC5sb2NhdGlvbigpOwotICAgICAgICAgICAgc291cmNlUmVjdC5pbnRlcnNlY3QobGF5ZXJSZWN0
VG9Db250ZW50UmVjdCh0aWxlLT5tX2RpcnR5TGF5ZXJSZWN0KSk7Ci0gICAgICAgICAgICBpZiAo
c291cmNlUmVjdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAg
ICAgICAgIGlmICghdGlsZS0+dGV4dHVyZSgpLT5yZXNlcnZlKG1fdGlsZVNpemUsIEdyYXBoaWNz
Q29udGV4dDNEOjpSR0JBKSkgewotICAgICAgICAgICAgICAgIG1fc2tpcHNEcmF3ID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICByZXNldCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRpbGUtc3BhY2UgcmVjdGFuZ2xl
IHRvIHVwbG9hZCBpbnRvLgotICAgICAgICAgICAgSW50UmVjdCBkZXN0UmVjdChJbnRQb2ludChz
b3VyY2VSZWN0LngoKSAtIGFuY2hvci54KCksIHNvdXJjZVJlY3QueSgpIC0gYW5jaG9yLnkoKSks
IHNvdXJjZVJlY3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGlmIChkZXN0UmVjdC54KCkgPCAwKQot
ICAgICAgICAgICAgICAgIENSQVNIKCk7Ci0gICAgICAgICAgICBpZiAoZGVzdFJlY3QueSgpIDwg
MCkKLSAgICAgICAgICAgICAgICBDUkFTSCgpOwotCi0gICAgICAgICAgICAvLyBPZmZzZXQgZnJv
bSBwYWludCByZWN0YW5nbGUgdG8gdGhpcyB0aWxlJ3MgZGlydHkgcmVjdGFuZ2xlLgotICAgICAg
ICAgICAgSW50UG9pbnQgcGFpbnRPZmZzZXQoc291cmNlUmVjdC54KCkgLSBwYWludFJlY3QueCgp
LCBzb3VyY2VSZWN0LnkoKSAtIHBhaW50UmVjdC55KCkpOwotICAgICAgICAgICAgaWYgKHBhaW50
T2Zmc2V0LngoKSA8IDApCi0gICAgICAgICAgICAgICAgQ1JBU0goKTsKLSAgICAgICAgICAgIGlm
IChwYWludE9mZnNldC55KCkgPCAwKQotICAgICAgICAgICAgICAgIENSQVNIKCk7Ci0gICAgICAg
ICAgICBpZiAocGFpbnRPZmZzZXQueCgpICsgZGVzdFJlY3Qud2lkdGgoKSA+IHBhaW50UmVjdC53
aWR0aCgpKQotICAgICAgICAgICAgICAgIENSQVNIKCk7Ci0gICAgICAgICAgICBpZiAocGFpbnRP
ZmZzZXQueSgpICsgZGVzdFJlY3QuaGVpZ2h0KCkgPiBwYWludFJlY3QuaGVpZ2h0KCkpCi0gICAg
ICAgICAgICAgICAgQ1JBU0goKTsKLQotICAgICAgICAgICAgdWludDhfdCogcGl4ZWxTb3VyY2U7
Ci0gICAgICAgICAgICBpZiAocGFpbnRSZWN0LndpZHRoKCkgPT0gc291cmNlUmVjdC53aWR0aCgp
ICYmICFwYWludE9mZnNldC54KCkpCi0gICAgICAgICAgICAgICAgcGl4ZWxTb3VyY2UgPSAmcGFp
bnRQaXhlbHNbNCAqIHBhaW50T2Zmc2V0LnkoKSAqIHBhaW50UmVjdC53aWR0aCgpXTsKLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFN0cmlkZXMgbm90IGVxdWFsLCBzbyBk
byBhIHJvdy1ieS1yb3cgbWVtY3B5IGZyb20gdGhlCi0gICAgICAgICAgICAgICAgLy8gcGFpbnQg
cmVzdWx0cyBpbnRvIGEgdGVtcCBidWZmZXIgZm9yIHVwbG9hZGluZy4KLSAgICAgICAgICAgICAg
ICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBkZXN0UmVjdC5oZWlnaHQoKTsgKytyb3cpCi0gICAg
ICAgICAgICAgICAgICAgIG1lbWNweSgmbV90aWxlUGl4ZWxzW2Rlc3RSZWN0LndpZHRoKCkgKiA0
ICogcm93XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWludFBpeGVsc1s0ICogKHBh
aW50T2Zmc2V0LngoKSArIChwYWludE9mZnNldC55KCkgKyByb3cpICogcGFpbnRSZWN0LndpZHRo
KCkpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RSZWN0LndpZHRoKCkgKiA0KTsK
KyAgICBmb3IgKEluc2lkZVJlY3RUaWxlSXRlcmF0b3IgaXRlcih0aGlzLCBjb250ZW50UmVjdCk7
ICppdGVyOyArK2l0ZXIpIHsKKyAgICAgICAgVGlsZSogdGlsZSA9ICppdGVyOworICAgICAgICBp
ZiAoIXRpbGUtPmRpcnR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBD
YWxjdWxhdGUgcGFnZS1zcGFjZSByZWN0YW5nbGUgdG8gY29weSBmcm9tLgorICAgICAgICBJbnRS
ZWN0IHNvdXJjZVJlY3QgPSB0aWxlQ29udGVudFJlY3QodGlsZSk7CisgICAgICAgIGNvbnN0IElu
dFBvaW50IGFuY2hvciA9IHNvdXJjZVJlY3QubG9jYXRpb24oKTsKKyAgICAgICAgc291cmNlUmVj
dC5pbnRlcnNlY3QobGF5ZXJSZWN0VG9Db250ZW50UmVjdCh0aWxlLT5tX2RpcnR5TGF5ZXJSZWN0
KSk7CisgICAgICAgIGlmIChzb3VyY2VSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgIGlmICghdGlsZS0+dGV4dHVyZSgpLT5yZXNlcnZlKG1fdGlsZVNpemUs
IEdyYXBoaWNzQ29udGV4dDNEOjpSR0JBKSkgeworICAgICAgICAgICAgbV9za2lwc0RyYXcgPSB0
cnVlOworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQogCi0gICAgICAgICAgICAgICAgcGl4ZWxTb3VyY2UgPSAmbV90aWxlUGl4ZWxzWzBdOwotICAg
ICAgICAgICAgfQorICAgICAgICAvLyBDYWxjdWxhdGUgdGlsZS1zcGFjZSByZWN0YW5nbGUgdG8g
dXBsb2FkIGludG8uCisgICAgICAgIEludFJlY3QgZGVzdFJlY3QoSW50UG9pbnQoc291cmNlUmVj
dC54KCkgLSBhbmNob3IueCgpLCBzb3VyY2VSZWN0LnkoKSAtIGFuY2hvci55KCkpLCBzb3VyY2VS
ZWN0LnNpemUoKSk7CisgICAgICAgIGlmIChkZXN0UmVjdC54KCkgPCAwKQorICAgICAgICAgICAg
Q1JBU0goKTsKKyAgICAgICAgaWYgKGRlc3RSZWN0LnkoKSA8IDApCisgICAgICAgICAgICBDUkFT
SCgpOworCisgICAgICAgIC8vIE9mZnNldCBmcm9tIHBhaW50IHJlY3RhbmdsZSB0byB0aGlzIHRp
bGUncyBkaXJ0eSByZWN0YW5nbGUuCisgICAgICAgIEludFBvaW50IHBhaW50T2Zmc2V0KHNvdXJj
ZVJlY3QueCgpIC0gcGFpbnRSZWN0LngoKSwgc291cmNlUmVjdC55KCkgLSBwYWludFJlY3QueSgp
KTsKKyAgICAgICAgaWYgKHBhaW50T2Zmc2V0LngoKSA8IDApCisgICAgICAgICAgICBDUkFTSCgp
OworICAgICAgICBpZiAocGFpbnRPZmZzZXQueSgpIDwgMCkKKyAgICAgICAgICAgIENSQVNIKCk7
CisgICAgICAgIGlmIChwYWludE9mZnNldC54KCkgKyBkZXN0UmVjdC53aWR0aCgpID4gcGFpbnRS
ZWN0LndpZHRoKCkpCisgICAgICAgICAgICBDUkFTSCgpOworICAgICAgICBpZiAocGFpbnRPZmZz
ZXQueSgpICsgZGVzdFJlY3QuaGVpZ2h0KCkgPiBwYWludFJlY3QuaGVpZ2h0KCkpCisgICAgICAg
ICAgICBDUkFTSCgpOworCisgICAgICAgIHVpbnQ4X3QqIHBpeGVsU291cmNlOworICAgICAgICBp
ZiAocGFpbnRSZWN0LndpZHRoKCkgPT0gc291cmNlUmVjdC53aWR0aCgpICYmICFwYWludE9mZnNl
dC54KCkpCisgICAgICAgICAgICBwaXhlbFNvdXJjZSA9ICZwYWludFBpeGVsc1s0ICogcGFpbnRP
ZmZzZXQueSgpICogcGFpbnRSZWN0LndpZHRoKCldOworICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgIC8vIFN0cmlkZXMgbm90IGVxdWFsLCBzbyBkbyBhIHJvdy1ieS1yb3cgbWVtY3B5IGZyb20g
dGhlCisgICAgICAgICAgICAvLyBwYWludCByZXN1bHRzIGludG8gYSB0ZW1wIGJ1ZmZlciBmb3Ig
dXBsb2FkaW5nLgorICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgZGVzdFJlY3Qu
aGVpZ2h0KCk7ICsrcm93KQorICAgICAgICAgICAgICAgIG1lbWNweSgmbV90aWxlUGl4ZWxzW2Rl
c3RSZWN0LndpZHRoKCkgKiA0ICogcm93XSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBhaW50
UGl4ZWxzWzQgKiAocGFpbnRPZmZzZXQueCgpICsgKHBhaW50T2Zmc2V0LnkoKSArIHJvdykgKiBw
YWludFJlY3Qud2lkdGgoKSldLAorICAgICAgICAgICAgICAgICAgICAgICBkZXN0UmVjdC53aWR0
aCgpICogNCk7CisKKyAgICAgICAgICAgIHBpeGVsU291cmNlID0gJm1fdGlsZVBpeGVsc1swXTsK
KyAgICAgICAgfQogCi0gICAgICAgICAgICB0aWxlLT50ZXh0dXJlKCktPmJpbmRUZXh0dXJlKCk7
Ci0gICAgICAgICAgICBHTEMoY29udGV4dCwgY29udGV4dC0+dGV4UGFyYW1ldGVyaShHcmFwaGlj
c0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfTUlOX0ZJ
TFRFUiwgR3JhcGhpY3NDb250ZXh0M0Q6Ok5FQVJFU1QpKTsKLSAgICAgICAgICAgIEdMQyhjb250
ZXh0LCBjb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFXzJE
LCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NQUdfRklMVEVSLCBHcmFwaGljc0NvbnRleHQz
RDo6TkVBUkVTVCkpOworICAgICAgICB0aWxlLT50ZXh0dXJlKCktPmJpbmRUZXh0dXJlKCk7Cisg
ICAgICAgIEdMQyhjb250ZXh0LCBjb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4
dDNEOjpURVhUVVJFXzJELCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NSU5fRklMVEVSLCBH
cmFwaGljc0NvbnRleHQzRDo6TkVBUkVTVCkpOworICAgICAgICBHTEMoY29udGV4dCwgY29udGV4
dC0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3ND
b250ZXh0M0Q6OlRFWFRVUkVfTUFHX0ZJTFRFUiwgR3JhcGhpY3NDb250ZXh0M0Q6Ok5FQVJFU1Qp
KTsKIAotICAgICAgICAgICAgR0xDKGNvbnRleHQsIGNvbnRleHQtPnRleFN1YkltYWdlMkQoR3Jh
cGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIDAsIGRlc3RSZWN0LngoKSwgZGVzdFJlY3QueSgp
LCBkZXN0UmVjdC53aWR0aCgpLCBkZXN0UmVjdC5oZWlnaHQoKSwgR3JhcGhpY3NDb250ZXh0M0Q6
OlJHQkEsIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05FRF9CWVRFLCBwaXhlbFNvdXJjZSkpOwor
ICAgICAgICBHTEMoY29udGV4dCwgY29udGV4dC0+dGV4U3ViSW1hZ2UyRChHcmFwaGljc0NvbnRl
eHQzRDo6VEVYVFVSRV8yRCwgMCwgZGVzdFJlY3QueCgpLCBkZXN0UmVjdC55KCksIGRlc3RSZWN0
LndpZHRoKCksIGRlc3RSZWN0LmhlaWdodCgpLCBHcmFwaGljc0NvbnRleHQzRDo6UkdCQSwgR3Jh
cGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX0JZVEUsIHBpeGVsU291cmNlKSk7CiAKLSAgICAgICAg
ICAgIHRpbGUtPmNsZWFyRGlydHkoKTsKLSAgICAgICAgfQorICAgICAgICB0aWxlLT5jbGVhckRp
cnR5KCk7CiAgICAgfQogfQogCkBAIC0zOTgsNzAgKzM4Nyw0MyBAQCB2b2lkIExheWVyVGlsZXJD
aHJvbWl1bTo6ZHJhdyhjb25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCkKICAgICBsYXllclJlbmRl
cmVyKCktPnVzZVNoYWRlcihwcm9ncmFtLT5wcm9ncmFtKCkpOwogICAgIEdMQyhjb250ZXh0LCBj
b250ZXh0LT51bmlmb3JtMWkocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS5zYW1wbGVyTG9jYXRp
b24oKSwgMCkpOwogCi0gICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKLSAgICBjb250
ZW50UmVjdFRvVGlsZUluZGljZXMoY29udGVudFJlY3QsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRv
bSk7Ci0gICAgZm9yIChpbnQgaiA9IHRvcDsgaiA8PSBib3R0b207ICsraikgewotICAgICAgICBm
b3IgKGludCBpID0gbGVmdDsgaSA8PSByaWdodDsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBp
bnQgaW5kZXggPSB0aWxlSW5kZXgoaSwgaik7Ci0gICAgICAgICAgICBUaWxlKiB0aWxlID0gbV90
aWxlc1tpbmRleF0uZ2V0KCk7Ci0gICAgICAgICAgICBBU1NFUlQodGlsZSk7CisgICAgZm9yIChJ
bnNpZGVSZWN0VGlsZUl0ZXJhdG9yIGl0ZXIodGhpcywgY29udGVudFJlY3QpOyAqaXRlcjsgKytp
dGVyKSB7CisgICAgICAgIFRpbGUqIHRpbGUgPSAqaXRlcjsKKyAgICAgICAgQVNTRVJUKHRpbGUp
OwogCi0gICAgICAgICAgICB0aWxlLT50ZXh0dXJlKCktPmJpbmRUZXh0dXJlKCk7CisgICAgICAg
IHRpbGUtPnRleHR1cmUoKS0+YmluZFRleHR1cmUoKTsKIAotICAgICAgICAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggdGlsZU1hdHJpeDsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdGls
ZU1hdHJpeDsKIAotICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIHRpbGVDb250ZW50UmVjdCBoZXJl
LCBhcyB0aGF0IGNvbnRhaW5zIHRoZSBmdWxsCi0gICAgICAgICAgICAvLyByZWN0IHdpdGggYm9y
ZGVyIHRleGVscyB3aGljaCBzaG91bGRuJ3QgYmUgZHJhd24uCi0gICAgICAgICAgICBJbnRSZWN0
IHRpbGVSZWN0ID0gbV90aWxpbmdEYXRhLnRpbGVCb3VuZHMoaW5kZXgpOwotICAgICAgICAgICAg
dGlsZVJlY3QubW92ZShtX2xheWVyUG9zaXRpb24ueCgpLCBtX2xheWVyUG9zaXRpb24ueSgpKTsK
LSAgICAgICAgICAgIHRpbGVNYXRyaXgudHJhbnNsYXRlM2QodGlsZVJlY3QueCgpIC0gY29udGVu
dFJlY3QueCgpICsgdGlsZVJlY3Qud2lkdGgoKSAvIDIuMCwgdGlsZVJlY3QueSgpIC0gY29udGVu
dFJlY3QueSgpICsgdGlsZVJlY3QuaGVpZ2h0KCkgLyAyLjAsIDApOworICAgICAgICAvLyBEb24n
dCB1c2UgdGlsZUNvbnRlbnRSZWN0IGhlcmUsIGFzIHRoYXQgY29udGFpbnMgdGhlIGZ1bGwKKyAg
ICAgICAgLy8gcmVjdCB3aXRoIGJvcmRlciB0ZXhlbHMgd2hpY2ggc2hvdWxkbid0IGJlIGRyYXdu
LgorICAgICAgICBJbnRSZWN0IHRpbGVSZWN0ID0gbV90aWxpbmdEYXRhLnRpbGVCb3VuZHMobV90
aWxpbmdEYXRhLnRpbGVJbmRleCh0aWxlLT5pKCksIHRpbGUtPmooKSkpOworICAgICAgICB0aWxl
UmVjdC5tb3ZlKG1fbGF5ZXJQb3NpdGlvbi54KCksIG1fbGF5ZXJQb3NpdGlvbi55KCkpOworICAg
ICAgICB0aWxlTWF0cml4LnRyYW5zbGF0ZTNkKHRpbGVSZWN0LngoKSAtIGNvbnRlbnRSZWN0Lngo
KSArIHRpbGVSZWN0LndpZHRoKCkgLyAyLjAsIHRpbGVSZWN0LnkoKSAtIGNvbnRlbnRSZWN0Lnko
KSArIHRpbGVSZWN0LmhlaWdodCgpIC8gMi4wLCAwKTsKIAotICAgICAgICAgICAgSW50UG9pbnQg
dGV4T2Zmc2V0ID0gbV90aWxpbmdEYXRhLnRleHR1cmVPZmZzZXQoaSwgaik7Ci0gICAgICAgICAg
ICBmbG9hdCB0aWxlV2lkdGggPSBzdGF0aWNfY2FzdDxmbG9hdD4obV90aWxlU2l6ZS53aWR0aCgp
KTsKLSAgICAgICAgICAgIGZsb2F0IHRpbGVIZWlnaHQgPSBzdGF0aWNfY2FzdDxmbG9hdD4obV90
aWxlU2l6ZS5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBmbG9hdCB0ZXhUcmFuc2xhdGVYID0gdGV4
T2Zmc2V0LngoKSAvIHRpbGVXaWR0aDsKLSAgICAgICAgICAgIGZsb2F0IHRleFRyYW5zbGF0ZVkg
PSB0ZXhPZmZzZXQueSgpIC8gdGlsZUhlaWdodDsKLSAgICAgICAgICAgIGZsb2F0IHRleFNjYWxl
WCA9IHRpbGVSZWN0LndpZHRoKCkgLyB0aWxlV2lkdGg7Ci0gICAgICAgICAgICBmbG9hdCB0ZXhT
Y2FsZVkgPSB0aWxlUmVjdC5oZWlnaHQoKSAvIHRpbGVIZWlnaHQ7CisgICAgICAgIEludFBvaW50
IHRleE9mZnNldCA9IG1fdGlsaW5nRGF0YS50ZXh0dXJlT2Zmc2V0KHRpbGUtPmkoKSwgdGlsZS0+
aigpKTsKKyAgICAgICAgZmxvYXQgdGlsZVdpZHRoID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fdGls
ZVNpemUud2lkdGgoKSk7CisgICAgICAgIGZsb2F0IHRpbGVIZWlnaHQgPSBzdGF0aWNfY2FzdDxm
bG9hdD4obV90aWxlU2l6ZS5oZWlnaHQoKSk7CisgICAgICAgIGZsb2F0IHRleFRyYW5zbGF0ZVgg
PSB0ZXhPZmZzZXQueCgpIC8gdGlsZVdpZHRoOworICAgICAgICBmbG9hdCB0ZXhUcmFuc2xhdGVZ
ID0gdGV4T2Zmc2V0LnkoKSAvIHRpbGVIZWlnaHQ7CisgICAgICAgIGZsb2F0IHRleFNjYWxlWCA9
IHRpbGVSZWN0LndpZHRoKCkgLyB0aWxlV2lkdGg7CisgICAgICAgIGZsb2F0IHRleFNjYWxlWSA9
IHRpbGVSZWN0LmhlaWdodCgpIC8gdGlsZUhlaWdodDsKIAotICAgICAgICAgICAgZHJhd1RleHR1
cmVkUXVhZChjb250ZXh0LCBsYXllclJlbmRlcmVyKCktPnByb2plY3Rpb25NYXRyaXgoKSwgdGls
ZU1hdHJpeCwgdGlsZVJlY3Qud2lkdGgoKSwgdGlsZVJlY3QuaGVpZ2h0KCksIDEsIHRleFRyYW5z
bGF0ZVgsIHRleFRyYW5zbGF0ZVksIHRleFNjYWxlWCwgdGV4U2NhbGVZLCBwcm9ncmFtKTsKKyAg
ICAgICAgZHJhd1RleHR1cmVkUXVhZChjb250ZXh0LCBsYXllclJlbmRlcmVyKCktPnByb2plY3Rp
b25NYXRyaXgoKSwgdGlsZU1hdHJpeCwgdGlsZVJlY3Qud2lkdGgoKSwgdGlsZVJlY3QuaGVpZ2h0
KCksIDEsIHRleFRyYW5zbGF0ZVgsIHRleFRyYW5zbGF0ZVksIHRleFNjYWxlWCwgdGV4U2NhbGVZ
LCBwcm9ncmFtKTsKIAotICAgICAgICAgICAgdGlsZS0+dGV4dHVyZSgpLT51bnJlc2VydmUoKTsK
LSAgICAgICAgfQorICAgICAgICB0aWxlLT50ZXh0dXJlKCktPnVucmVzZXJ2ZSgpOwogICAgIH0K
IH0KIAotdm9pZCBMYXllclRpbGVyQ2hyb21pdW06OnJlc2l6ZUxheWVyKGNvbnN0IEludFNpemUm
IHNpemUpCi17Ci0gICAgaWYgKGxheWVyU2l6ZSgpID09IHNpemUpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGNvbnN0IEludFNpemUgb2xkVGlsZVNpemUgPSBsYXllclRpbGVTaXplKCk7Ci0gICAg
bV90aWxpbmdEYXRhLnNldFRvdGFsU2l6ZShzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOwot
ICAgIGNvbnN0IEludFNpemUgbmV3VGlsZVNpemUgPSBsYXllclRpbGVTaXplKCk7Ci0KLSAgICBp
ZiAob2xkVGlsZVNpemUgPT0gbmV3VGlsZVNpemUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlm
IChuZXdUaWxlU2l6ZS5oZWlnaHQoKSAmJiAobmV3VGlsZVNpemUud2lkdGgoKSA+IElOVF9NQVgg
LyBuZXdUaWxlU2l6ZS5oZWlnaHQoKSkpCi0gICAgICAgIENSQVNIKCk7Ci0KLSAgICBWZWN0b3I8
T3duUHRyPFRpbGU+ID4gbmV3VGlsZXM7Ci0gICAgbmV3VGlsZXMucmVzaXplKG5ld1RpbGVTaXpl
LndpZHRoKCkgKiBuZXdUaWxlU2l6ZS5oZWlnaHQoKSk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGog
PCBvbGRUaWxlU2l6ZS5oZWlnaHQoKTsgKytqKQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8
IG9sZFRpbGVTaXplLndpZHRoKCk7ICsraSkKLSAgICAgICAgICAgIG5ld1RpbGVzW2kgKyBqICog
bmV3VGlsZVNpemUud2lkdGgoKV0uc3dhcChtX3RpbGVzW2kgKyBqICogb2xkVGlsZVNpemUud2lk
dGgoKV0pOwotICAgIG1fdGlsZXMuc3dhcChuZXdUaWxlcyk7Ci19Ci0KIHZvaWQgTGF5ZXJUaWxl
ckNocm9taXVtOjpncm93TGF5ZXJUb0NvbnRhaW4oY29uc3QgSW50UmVjdCYgY29udGVudFJlY3Qp
CiB7CiAgICAgLy8gR3JvdyB0aGUgdGlsZSBhcnJheSB0byBjb250YWluIHRoaXMgY29udGVudCBy
ZWN0LgogICAgIEludFJlY3QgbGF5ZXJSZWN0ID0gY29udGVudFJlY3RUb0xheWVyUmVjdChjb250
ZW50UmVjdCk7CiAgICAgSW50U2l6ZSByZWN0U2l6ZSA9IEludFNpemUobGF5ZXJSZWN0Lm1heFgo
KSwgbGF5ZXJSZWN0Lm1heFkoKSk7CiAKLSAgICBJbnRTaXplIG5ld1NpemUgPSByZWN0U2l6ZS5l
eHBhbmRlZFRvKGxheWVyU2l6ZSgpKTsKLSAgICByZXNpemVMYXllcihuZXdTaXplKTsKKyAgICBJ
bnRTaXplIG9sZExheWVyU2l6ZShtX3RpbGluZ0RhdGEudG90YWxTaXplWCgpLCBtX3RpbGluZ0Rh
dGEudG90YWxTaXplWSgpKTsKKyAgICBJbnRTaXplIG5ld1NpemUgPSByZWN0U2l6ZS5leHBhbmRl
ZFRvKG9sZExheWVyU2l6ZSk7CisgICAgbV90aWxpbmdEYXRhLnNldFRvdGFsU2l6ZShuZXdTaXpl
LndpZHRoKCksIG5ld1NpemUuaGVpZ2h0KCkpOwogfQogCiB2b2lkIExheWVyVGlsZXJDaHJvbWl1
bTo6ZHJhd1RleHR1cmVkUXVhZChHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCwgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHByb2plY3Rpb25NYXRyaXgsIGNvbnN0IFRyYW5zZm9ybWF0aW9u
TWF0cml4JiBkcmF3TWF0cml4LApAQCAtNDkwLDYgKzQ1Miw2NCBAQCB2b2lkIExheWVyVGlsZXJD
aHJvbWl1bTo6ZHJhd1RleHR1cmVkUXVhZChHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCwgY29u
c3QgVHJhbgogICAgIEdMQyhjb250ZXh0LCBjb250ZXh0LT5kcmF3RWxlbWVudHMoR3JhcGhpY3ND
b250ZXh0M0Q6OlRSSUFOR0xFUywgNiwgR3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX1NIT1JU
LCAwKSk7CiB9CiAKK0xheWVyVGlsZXJDaHJvbWl1bTo6UmVjdFRpbGVJdGVyYXRvcjo6UmVjdFRp
bGVJdGVyYXRvcihMYXllclRpbGVyQ2hyb21pdW0qIHRpbGVyLCBjb25zdCBJbnRSZWN0ICZyZWN0
LCBDb21wYXJlT3B0aW9uIG9wdGlvbikKKyAgICA6IG1fdGlsZXIodGlsZXIpCisgICAgLCBtX3Jl
Y3QocmVjdCkKKyAgICAsIG1fb3B0aW9uKG9wdGlvbikKK3sKKyAgICBtX2lkeCA9IG5leHRJbmRl
eCgwKTsKK30KKworc2l6ZV90IExheWVyVGlsZXJDaHJvbWl1bTo6UmVjdFRpbGVJdGVyYXRvcjo6
bmV4dEluZGV4KHNpemVfdCBzdGFydCkKK3sKKyAgICBpZiAoc3RhcnQgPj0gbV90aWxlci0+bV90
aWxlcy5zaXplKCkpCisgICAgICAgIHJldHVybiBzdGFydDsKKworICAgIGZvciAoc2l6ZV90IGlk
eCA9IHN0YXJ0OyBpZHggPCBtX3RpbGVyLT5tX3RpbGVzLnNpemUoKTsgKytpZHgpIHsKKyAgICAg
ICAgY29uc3QgTGF5ZXJUaWxlckNocm9taXVtOjpUaWxlKiB0aWxlID0gbV90aWxlci0+bV90aWxl
c1tpZHhdLmdldCgpOworICAgICAgICBBU1NFUlQodGlsZSk7CisgICAgICAgIGNvbnN0IEludFJl
Y3QgY29udGVudCA9IG1fdGlsZXItPnRpbGVDb250ZW50UmVjdCh0aWxlKTsKKyAgICAgICAgaWYg
KGNvbnRlbnQuaW50ZXJzZWN0cyhtX3JlY3QpID09IChtX29wdGlvbiA9PSBJbnNpZGUpKQorICAg
ICAgICAgICAgcmV0dXJuIGlkeDsKKyAgICB9CisKKyAgICByZXR1cm4gbV90aWxlci0+bV90aWxl
cy5zaXplKCk7Cit9CisKK3ZvaWQgTGF5ZXJUaWxlckNocm9taXVtOjpSZWN0VGlsZUl0ZXJhdG9y
OjpvcGVyYXRvcisrKCkKK3sKKyAgICBtX2lkeCA9IG5leHRJbmRleChtX2lkeCArIDEpOworfQor
CitMYXllclRpbGVyQ2hyb21pdW06OlRpbGUqIExheWVyVGlsZXJDaHJvbWl1bTo6UmVjdFRpbGVJ
dGVyYXRvcjo6b3BlcmF0b3IqKCkKK3sKKyAgICBpZiAobV9pZHggPj0gbV90aWxlci0+bV90aWxl
cy5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIG1fdGlsZXItPm1fdGls
ZXNbbV9pZHhdLmdldCgpOworfQorCit2b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6UmVjdFRpbGVJ
dGVyYXRvcjo6ZXJhc2UoKQoreworICAgIGlmIChtX2lkeCA+PSBtX3RpbGVyLT5tX3RpbGVzLnNp
emUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV90aWxlci0+bV90aWxlc1ttX2lkeF0ucmVs
ZWFzZSgpOworICAgIG1fdGlsZXItPm1fdGlsZXNbbV9pZHhdLnN3YXAobV90aWxlci0+bV90aWxl
cy5sYXN0KCkpOworICAgIG1fdGlsZXItPm1fdGlsZXMucmVzaXplKG1fdGlsZXItPm1fdGlsZXMu
c2l6ZSgpIC0gMSk7CisgICAgbV9pZHggPSBuZXh0SW5kZXgobV9pZHgpOworfQorCitMYXllclRp
bGVyQ2hyb21pdW06Okluc2lkZVJlY3RUaWxlSXRlcmF0b3I6Okluc2lkZVJlY3RUaWxlSXRlcmF0
b3IoTGF5ZXJUaWxlckNocm9taXVtKiB0aWxlciwgY29uc3QgSW50UmVjdCAmcmVjdCkKKyAgICA6
IFJlY3RUaWxlSXRlcmF0b3IodGlsZXIsIHJlY3QsIFJlY3RUaWxlSXRlcmF0b3I6Okluc2lkZSkK
K3sKK30KKworTGF5ZXJUaWxlckNocm9taXVtOjpPdXRzaWRlUmVjdFRpbGVJdGVyYXRvcjo6T3V0
c2lkZVJlY3RUaWxlSXRlcmF0b3IoTGF5ZXJUaWxlckNocm9taXVtKiB0aWxlciwgY29uc3QgSW50
UmVjdCAmcmVjdCkKKyAgICA6IFJlY3RUaWxlSXRlcmF0b3IodGlsZXIsIHJlY3QsIFJlY3RUaWxl
SXRlcmF0b3I6Ok91dHNpZGUpCit7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2Vu
ZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyVGlsZXJDaHJvbWl1bS5oIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJUaWxlckNocm9t
aXVtLmgKaW5kZXggMzdlNTBlZmM2NjRlYjkyMzRhODBmM2M1ZWQ2MzNkZTRiM2FjZjM1Mi4uYzAw
M2Y1ODllYTkyMDk0ZTU4YjA4ZDYzZGEwNGM2N2E1YWFmOWYxNyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJUaWxlckNocm9taXVtLmgK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJUaWxl
ckNocm9taXVtLmgKQEAgLTcxLDE3ICs3MSw1NSBAQCBwcml2YXRlOgogICAgIGNsYXNzIFRpbGUg
ewogICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShUaWxlKTsKICAgICBwdWJsaWM6Ci0gICAg
ICAgIGV4cGxpY2l0IFRpbGUoUGFzc093blB0cjxMYXllclRleHR1cmU+IHRleCkgOiBtX3RleCh0
ZXgpIHt9CisgICAgICAgIGV4cGxpY2l0IFRpbGUoUGFzc093blB0cjxMYXllclRleHR1cmU+IHRl
eCkgOiBtX3RleCh0ZXgpLCBtX2koLTEpLCBtX2ooLTEpIHt9CiAKICAgICAgICAgTGF5ZXJUZXh0
dXJlKiB0ZXh0dXJlKCkgeyByZXR1cm4gbV90ZXguZ2V0KCk7IH0KIAogICAgICAgICBib29sIGRp
cnR5KCkgY29uc3QgeyByZXR1cm4gIW1fZGlydHlMYXllclJlY3QuaXNFbXB0eSgpOyB9CiAgICAg
ICAgIHZvaWQgY2xlYXJEaXJ0eSgpIHsgbV9kaXJ0eUxheWVyUmVjdCA9IEludFJlY3QoKTsgfQog
CisgICAgICAgIGludCBpKCkgY29uc3QgeyByZXR1cm4gbV9pOyB9CisgICAgICAgIGludCBqKCkg
Y29uc3QgeyByZXR1cm4gbV9qOyB9CisgICAgICAgIHZvaWQgbW92ZVRvKGludCBpLCBpbnQgaikg
eyBtX2kgPSBpOyBtX2ogPSBqOyB9CisKICAgICAgICAgLy8gTGF5ZXItc3BhY2UgZGlydHkgcmVj
dGFuZ2xlIHRoYXQgbmVlZHMgdG8gYmUgcmVwYWludGVkLgogICAgICAgICBJbnRSZWN0IG1fZGly
dHlMYXllclJlY3Q7CiAgICAgcHJpdmF0ZToKICAgICAgICAgT3duUHRyPExheWVyVGV4dHVyZT4g
bV90ZXg7CisgICAgICAgIGludCBtX2k7CisgICAgICAgIGludCBtX2o7CisgICAgfTsKKworICAg
IGNsYXNzIFJlY3RUaWxlSXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBDb21w
YXJlT3B0aW9uIHsgSW5zaWRlLCBPdXRzaWRlIH07CisKKyAgICAgICAgUmVjdFRpbGVJdGVyYXRv
cihMYXllclRpbGVyQ2hyb21pdW0qLCBjb25zdCBJbnRSZWN0JiwgQ29tcGFyZU9wdGlvbik7Cisg
ICAgICAgIHZvaWQgb3BlcmF0b3IrKygpOworICAgICAgICBUaWxlKiBvcGVyYXRvciooKTsKKyAg
ICAgICAgc2l6ZV90IGlkeCgpIGNvbnN0IHsgcmV0dXJuIG1faWR4OyB9CisKKyAgICAgICAgLy8g
RXJhc2UgdGhlIGN1cnJlbnQgdGlsZSAoc3dhcCBmcm9tIGxhc3QpIGFuZCBpbmNyZW1lbnQgaXRl
cmF0b3IuCisgICAgICAgIHZvaWQgZXJhc2UoKTsKKyAgICBwcml2YXRlOgorICAgICAgICBzaXpl
X3QgbmV4dEluZGV4KHNpemVfdCBzdGFydCk7CisKKyAgICAgICAgTGF5ZXJUaWxlckNocm9taXVt
KiBtX3RpbGVyOworICAgICAgICBJbnRSZWN0IG1fcmVjdDsKKyAgICAgICAgQ29tcGFyZU9wdGlv
biBtX29wdGlvbjsKKyAgICAgICAgc2l6ZV90IG1faWR4OworICAgIH07CisKKyAgICAvLyBJdGVy
YXRlIHRocm91Z2ggYWxsIHRoZSB0aWxlcyB0aGF0IGFyZSBhdCBhbGwgaW5zaWRlIHRoZSBjb250
ZW50IHJlY3QuCisgICAgY2xhc3MgSW5zaWRlUmVjdFRpbGVJdGVyYXRvciA6IHB1YmxpYyBSZWN0
VGlsZUl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEluc2lkZVJlY3RUaWxlSXRlcmF0
b3IoTGF5ZXJUaWxlckNocm9taXVtKiwgY29uc3QgSW50UmVjdCYpOworICAgIH07CisKKyAgICAv
LyBJdGVyYXRlIHRocm91Z2ggYWxsIHRoZSB0aWxlcyB0aGF0IGFyZSBlbnRpcmVseSBvdXRzaWRl
IHRoZSBjb250ZW50IHJlY3QuCisgICAgY2xhc3MgT3V0c2lkZVJlY3RUaWxlSXRlcmF0b3IgOiBw
dWJsaWMgUmVjdFRpbGVJdGVyYXRvciB7CisgICAgcHVibGljOgorICAgICAgICBPdXRzaWRlUmVj
dFRpbGVJdGVyYXRvcihMYXllclRpbGVyQ2hyb21pdW0qLCBjb25zdCBJbnRSZWN0Jik7CiAgICAg
fTsKIAogICAgIHZvaWQgZHJhd1RleHR1cmVkUXVhZChHcmFwaGljc0NvbnRleHQzRCosIGNvbnN0
IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgZHJhd01hdHJpeCwKQEAgLTkwLDM5ICsxMjgsMzEgQEAgcHJpdmF0ZToKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdGV4U2NhbGVYLCBmbG9hdCB0ZXhTY2FsZVks
CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExheWVyVGlsZXJDaHJvbWl1bTo6UHJv
Z3JhbSopOwogCi0gICAgdm9pZCByZXNpemVMYXllcihjb25zdCBJbnRTaXplJiBzaXplKTsKICAg
ICAvLyBHcm93IGxheWVyIHNpemUgdG8gY29udGFpbiB0aGlzIHJlY3RhbmdsZS4KICAgICB2b2lk
IGdyb3dMYXllclRvQ29udGFpbihjb25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCk7CiAKICAgICBM
YXllclJlbmRlcmVyQ2hyb21pdW0qIGxheWVyUmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX2xh
eWVyUmVuZGVyZXI7IH0KICAgICBHcmFwaGljc0NvbnRleHQzRCogbGF5ZXJSZW5kZXJlckNvbnRl
eHQoKSBjb25zdDsKICAgICBUaWxlKiBjcmVhdGVUaWxlKGludCBpLCBpbnQgaik7Ci0gICAgLy8g
SW52YWxpZGF0ZSBhbnkgdGlsZXMgd2hpY2ggZG8gbm90IGludGVyc2VjdCB3aXRoIHRoZSBuZXdM
YXllclJlY3QuCi0gICAgdm9pZCBpbnZhbGlkYXRlVGlsZXMoY29uc3QgSW50UmVjdCYgb2xkTGF5
ZXJSZWN0LCBjb25zdCBJbnRSZWN0JiBuZXdMYXllclJlY3QpOworICAgIC8vIEludmFsaWRhdGUg
YW55IHRpbGVzIHdoaWNoIGRvIG5vdCBpbnRlcnNlY3Qgd2l0aCB0aGUgY29udGVudFJlY3QKKyAg
ICB2b2lkIGludmFsaWRhdGVUaWxlcyhjb25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCk7CiAgICAg
dm9pZCByZXNldCgpOwogICAgIHZvaWQgY29udGVudFJlY3RUb1RpbGVJbmRpY2VzKGNvbnN0IElu
dFJlY3QmIGNvbnRlbnRSZWN0LCBpbnQgJmxlZnQsIGludCAmdG9wLCBpbnQgJnJpZ2h0LCBpbnQg
JmJvdHRvbSkgY29uc3Q7CiAgICAgSW50UmVjdCBjb250ZW50UmVjdFRvTGF5ZXJSZWN0KGNvbnN0
IEludFJlY3QmIGNvbnRlbnRSZWN0KSBjb25zdDsKICAgICBJbnRSZWN0IGxheWVyUmVjdFRvQ29u
dGVudFJlY3QoY29uc3QgSW50UmVjdCYgbGF5ZXJSZWN0KSBjb25zdDsKIAotICAgIC8vIFJldHVy
bnMgdGhlIGluZGV4IGludG8gbV90aWxlcyBmb3IgYSBnaXZlbiB0aWxlIGxvY2F0aW9uLgotICAg
IGludCB0aWxlSW5kZXgoaW50IGksIGludCBqKSBjb25zdDsKLSAgICAvLyBSZXR1cm5zIHRoZSBi
b3VuZHMgaW4gY29udGVudCBzcGFjZSBmb3IgYSBnaXZlbiB0aWxlIGxvY2F0aW9uLgotICAgIElu
dFJlY3QgdGlsZUNvbnRlbnRSZWN0KGludCBpLCBpbnQgaikgY29uc3Q7Ci0gICAgLy8gUmV0dXJu
cyB0aGUgYm91bmRzIGluIGxheWVyIHNwYWNlIGZvciBhIGdpdmVuIHRpbGUgbG9jYXRpb24uCi0g
ICAgSW50UmVjdCB0aWxlTGF5ZXJSZWN0KGludCBpLCBpbnQgaikgY29uc3Q7Ci0KLSAgICBJbnRT
aXplIGxheWVyU2l6ZSgpIGNvbnN0OwotICAgIEludFNpemUgbGF5ZXJUaWxlU2l6ZSgpIGNvbnN0
OworICAgIFRpbGUqIHRpbGVBdChpbnQsIGludCkgY29uc3Q7CisgICAgSW50UmVjdCB0aWxlQ29u
dGVudFJlY3QoY29uc3QgVGlsZSopIGNvbnN0OworICAgIEludFJlY3QgdGlsZUxheWVyUmVjdChj
b25zdCBUaWxlKikgY29uc3Q7CiAKICAgICBJbnRTaXplIG1fdGlsZVNpemU7Ci0gICAgSW50UmVj
dCBtX2xhc3RVcGRhdGVMYXllclJlY3Q7CiAgICAgSW50UG9pbnQgbV9sYXllclBvc2l0aW9uOwog
CiAgICAgYm9vbCBtX3NraXBzRHJhdzsKIAotICAgIC8vIExvZ2ljYWwgMkQgYXJyYXkgb2YgdGls
ZXMgKGRpbWVuc2lvbnMgb2YgbV9sYXllclRpbGVTaXplKQorICAgIC8vIFRpZ2h0bHkgcGFja2Vk
IHNldCBvZiBjdXJyZW50bHkgdXNlZCB0aWxlcy4KICAgICBWZWN0b3I8T3duUHRyPFRpbGU+ID4g
bV90aWxlczsKLSAgICAvLyBMaW5lYXIgYXJyYXkgb2YgdW51c2VkIHRpbGVzLgorICAgIC8vIFRp
Z2h0bHkgcGFja2VkIHNldCBvZiB1bnVzZWQgdGlsZXMuCiAgICAgVmVjdG9yPE93blB0cjxUaWxl
PiA+IG1fdW51c2VkVGlsZXM7CiAKICAgICAvLyBDYWNoZSBhIHRpbGUtc2l6ZWQgcGl4ZWwgYnVm
ZmVyIHRvIGRyYXcgaW50by4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>85383</attachid>
            <date>2011-03-10 13:11:58 -0800</date>
            <delta_ts>2011-03-10 14:03:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-54133-20110310131157.patch</filename>
            <type>text/plain</type>
            <size>18623</size>
            <attacher name="Adrienne Walker">enne</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODA2NjYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAyZWQ0NTMxMzQ4MzMwYWJi
ZDA2NzA1YmFmMmE3NThhM2UzZjBjZGExLi42YzJlYWE5ZmEyMGNkNzg1OGNjYWRkNzhmNWRkNjc1
YTUyYTVlOWI5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDIgQEAKKzIwMTEtMDMtMTAgIEFkcmll
bm5lIFdhbGtlciAgPGVubmVAZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBbY2hyb21pdW1dIE1ha2UgdGlsZWQgY29tcG9zaXRvciBk
YXRhIHN0cnVjdHVyZSBtb3JlIGVmZmljaWVudC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTU0MTMzCisKKyAgICAgICAgUHJldmlvdXNseSwgdGhlIGNv
bXBvc2l0b3IgaGFkIGEgc3BhcnNlIDJEIGFycmF5IG9mIHRpbGVzIGZvciB0aGUKKyAgICAgICAg
d2hvbGUgcGFnZSwgbW9zdCBvZiB3aGljaCB3ZXJlIG51bGwuICBUaGUgdGlsZXMgd2VyZSBpbXBs
aWNpdGx5CisgICAgICAgIGxvY2F0ZWQgYmFzZWQgb24gdGhlaXIgcG9zaXRpb24gaW4gdGhlIGFy
cmF5LiBUaGlzIHdhcyBpbmVmZmljaWVudAorICAgICAgICB3aGVuIHRoZSBwYWdlIGdyZXcgKGUu
Zy4gaW5maW5pdGUgc2Nyb2xsaW5nKSBhbmQgY2F1c2VkIHNvbWUgYnVncworICAgICAgICAoZS5n
LiB3aWR0aCAqIGhlaWdodCA+IE1BWF9JTlQpLiAgVGhpcyBjaGFuZ2UgbW9kaWZpZXMgdGlsZXMg
dG8gaGF2ZQorICAgICAgICBleHBsaWNpdCBwb3NpdGlvbnMgc28gdGhleSBjYW4gYmUgc3RvcmVk
IGluIGEgaGFzaCBtYXAuCisKKyAgICAgICAgVGVzdHM6IExheW91dFRlc3RzL2NvbXBvc2l0aW5n
LworCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJUaWxlckNocm9t
aXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6cmVzZXQpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlckNocm9taXVtOjpjcmVhdGVUaWxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6aW52YWxpZGF0ZVRpbGVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6Y29udGVudFJlY3RUb1RpbGVJbmRpY2Vz
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6dGlsZUF0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6dGlsZUNvbnRlbnRSZWN0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6dGlsZUxheWVyUmVjdCk6CisgICAgICAg
IChXZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OmludmFsaWRhdGVSZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6aW52YWxpZGF0ZUVudGlyZUxheWVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6dXBkYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6dXBkYXRlRnJvbVBpeGVscyk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllclRpbGVyQ2hyb21pdW06OmRyYXcpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJUaWxlckNocm9taXVtOjpncm93TGF5ZXJUb0NvbnRhaW4pOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0xheWVyVGlsZXJDaHJvbWl1bS5oOgorICAgICAgICAoV2ViQ29y
ZTo6TGF5ZXJUaWxlckNocm9taXVtOjpUaWxlOjpUaWxlKToKKyAgICAgICAgKFdlYkNvcmU6Okxh
eWVyVGlsZXJDaHJvbWl1bTo6VGlsZTo6aSk6CisgICAgICAgIChXZWJDb3JlOjpMYXllclRpbGVy
Q2hyb21pdW06OlRpbGU6OmopOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlckNocm9taXVt
OjpUaWxlOjptb3ZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJUaWxlckNocm9taXVtOjpU
aWxlTWFwS2V5VHJhaXRzOjplbXB0eVZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyVGls
ZXJDaHJvbWl1bTo6VGlsZU1hcEtleVRyYWl0czo6Y29uc3RydWN0RGVsZXRlZFZhbHVlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkxheWVyVGlsZXJDaHJvbWl1bTo6VGlsZU1hcEtleVRyYWl0czo6aXNE
ZWxldGVkVmFsdWUpOgorCiAyMDExLTAzLTA5ICBKYW1lcyBSb2JpbnNvbiAgPGphbWVzckBjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSdXNzZWxsLgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJUaWxl
ckNocm9taXVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0xheWVyVGlsZXJDaHJvbWl1bS5jcHAKaW5kZXggODY1OTJhNmE4ZDJkNTc3NGY4NmM5Nzg2Mzkx
NWEzNmIxMWVhOTM1My4uZWRlMGQxZjBiMzQxZTcyMjY1YjcyYjFlYTQyNDA0ZWNhNjQwZWU5ZiAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5
ZXJUaWxlckNocm9taXVtLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9MYXllclRpbGVyQ2hyb21pdW0uY3BwCkBAIC04NCw1OCArODQsNTAgQEAgdm9p
ZCBMYXllclRpbGVyQ2hyb21pdW06OnJlc2V0KCkKIHsKICAgICBtX3RpbGVzLmNsZWFyKCk7CiAg
ICAgbV91bnVzZWRUaWxlcy5jbGVhcigpOwotCiAgICAgbV90aWxpbmdEYXRhLnNldFRvdGFsU2l6
ZSgwLCAwKTsKLSAgICBtX2xhc3RVcGRhdGVMYXllclJlY3QgPSBJbnRSZWN0KCk7CiB9CiAKIExh
eWVyVGlsZXJDaHJvbWl1bTo6VGlsZSogTGF5ZXJUaWxlckNocm9taXVtOjpjcmVhdGVUaWxlKGlu
dCBpLCBpbnQgaikKIHsKLSAgICBjb25zdCBpbnQgaW5kZXggPSB0aWxlSW5kZXgoaSwgaik7Ci0g
ICAgQVNTRVJUKCFtX3RpbGVzW2luZGV4XSk7CisgICAgQVNTRVJUKCF0aWxlQXQoaSwgaikpOwog
CisgICAgUmVmUHRyPFRpbGU+IHRpbGU7CiAgICAgaWYgKG1fdW51c2VkVGlsZXMuc2l6ZSgpID4g
MCkgewotICAgICAgICBtX3RpbGVzW2luZGV4XSA9IG1fdW51c2VkVGlsZXMubGFzdCgpLnJlbGVh
c2UoKTsKKyAgICAgICAgdGlsZSA9IG1fdW51c2VkVGlsZXMubGFzdCgpLnJlbGVhc2UoKTsKICAg
ICAgICAgbV91bnVzZWRUaWxlcy5yZW1vdmVMYXN0KCk7CisgICAgICAgIEFTU0VSVCh0aWxlLT5y
ZWZDb3VudCgpID09IDEpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEdyYXBoaWNzQ29udGV4dDNE
KiBjb250ZXh0ID0gbGF5ZXJSZW5kZXJlckNvbnRleHQoKTsKICAgICAgICAgVGV4dHVyZU1hbmFn
ZXIqIG1hbmFnZXIgPSBsYXllclJlbmRlcmVyKCktPnRleHR1cmVNYW5hZ2VyKCk7Ci0gICAgICAg
IE93blB0cjxUaWxlPiB0aWxlID0gYWRvcHRQdHIobmV3IFRpbGUoTGF5ZXJUZXh0dXJlOjpjcmVh
dGUoY29udGV4dCwgbWFuYWdlcikpKTsKLSAgICAgICAgbV90aWxlc1tpbmRleF0gPSB0aWxlLnJl
bGVhc2UoKTsKKyAgICAgICAgdGlsZSA9IGFkb3B0UmVmKG5ldyBUaWxlKExheWVyVGV4dHVyZTo6
Y3JlYXRlKGNvbnRleHQsIG1hbmFnZXIpKSk7CiAgICAgfQorICAgIG1fdGlsZXMuYWRkKG1ha2Vf
cGFpcihpLCBqKSwgdGlsZSk7CisKKyAgICB0aWxlLT5tb3ZlVG8oaSwgaik7CisgICAgdGlsZS0+
bV9kaXJ0eUxheWVyUmVjdCA9IHRpbGVMYXllclJlY3QodGlsZS5nZXQoKSk7CiAKLSAgICBtX3Rp
bGVzW2luZGV4XS0+bV9kaXJ0eUxheWVyUmVjdCA9IHRpbGVMYXllclJlY3QoaSwgaik7Ci0gICAg
cmV0dXJuIG1fdGlsZXNbaW5kZXhdLmdldCgpOworICAgIHJldHVybiB0aWxlLmdldCgpOwogfQog
Ci12b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6aW52YWxpZGF0ZVRpbGVzKGNvbnN0IEludFJlY3Qm
IG9sZExheWVyUmVjdCwgY29uc3QgSW50UmVjdCYgbmV3TGF5ZXJSZWN0KQordm9pZCBMYXllclRp
bGVyQ2hyb21pdW06OmludmFsaWRhdGVUaWxlcyhjb25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCkK
IHsKICAgICBpZiAoIW1fdGlsZXMuc2l6ZSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBJbnRS
ZWN0IG9sZENvbnRlbnRSZWN0ID0gbGF5ZXJSZWN0VG9Db250ZW50UmVjdChvbGRMYXllclJlY3Qp
OwotICAgIGludCBvbGRMZWZ0LCBvbGRUb3AsIG9sZFJpZ2h0LCBvbGRCb3R0b207Ci0gICAgY29u
dGVudFJlY3RUb1RpbGVJbmRpY2VzKG9sZENvbnRlbnRSZWN0LCBvbGRMZWZ0LCBvbGRUb3AsIG9s
ZFJpZ2h0LCBvbGRCb3R0b20pOwotCi0gICAgSW50UmVjdCBuZXdDb250ZW50UmVjdCA9IGxheWVy
UmVjdFRvQ29udGVudFJlY3QobmV3TGF5ZXJSZWN0KTsKLSAgICBpbnQgbmV3TGVmdCwgbmV3VG9w
LCBuZXdSaWdodCwgbmV3Qm90dG9tOwotICAgIGNvbnRlbnRSZWN0VG9UaWxlSW5kaWNlcyhuZXdD
b250ZW50UmVjdCwgbmV3TGVmdCwgbmV3VG9wLCBuZXdSaWdodCwgbmV3Qm90dG9tKTsKLQotICAg
IC8vIEl0ZXJhdGluZyB0aHJvdWdoIGp1c3QgdGhlIG9sZCB0aWxlIGluZGljZXMgaXMgYW4gb3B0
aW1pemF0aW9uIHRvIGF2b2lkCi0gICAgLy8gaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVudGlyZSBt
X3RpbGVzIGFycmF5LgotICAgIGZvciAoaW50IGogPSBvbGRUb3A7IGogPD0gb2xkQm90dG9tOyAr
K2opIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IG9sZExlZnQ7IGkgPD0gb2xkUmlnaHQ7ICsraSkg
ewotICAgICAgICAgICAgaWYgKGkgPj0gbmV3TGVmdCAmJiBpIDw9IG5ld1JpZ2h0ICYmIGogPj0g
bmV3VG9wICYmIGogPD0gbmV3Qm90dG9tKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSB0aWxlSW5kZXgoaSwgaik7Ci0gICAgICAgICAg
ICBpZiAobV90aWxlc1tpbmRleF0pCi0gICAgICAgICAgICAgICAgbV91bnVzZWRUaWxlcy5hcHBl
bmQobV90aWxlc1tpbmRleF0ucmVsZWFzZSgpKTsKLSAgICAgICAgfQorICAgIFZlY3RvcjxUaWxl
TWFwS2V5PiByZW1vdmVLZXlzOworICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXRlciA9IG1f
dGlsZXMuYmVnaW4oKTsgaXRlciAhPSBtX3RpbGVzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAg
VGlsZSogdGlsZSA9IGl0ZXItPnNlY29uZC5nZXQoKTsKKyAgICAgICAgSW50UmVjdCB0aWxlUmVj
dCA9IHRpbGVDb250ZW50UmVjdCh0aWxlKTsKKyAgICAgICAgaWYgKHRpbGVSZWN0LmludGVyc2Vj
dHMoY29udGVudFJlY3QpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJlbW92ZUtl
eXMuYXBwZW5kKGl0ZXItPmZpcnN0KTsKICAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IHJlbW92ZUtleXMuc2l6ZSgpOyArK2kpCisgICAgICAgIG1fdW51c2VkVGlsZXMuYXBwZW5k
KG1fdGlsZXMudGFrZShyZW1vdmVLZXlzW2ldKSk7CiB9CiAKLXZvaWQgTGF5ZXJUaWxlckNocm9t
aXVtOjpjb250ZW50UmVjdFRvVGlsZUluZGljZXMoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3Qs
IGludCAmbGVmdCwgaW50ICZ0b3AsIGludCAmcmlnaHQsIGludCAmYm90dG9tKSBjb25zdAordm9p
ZCBMYXllclRpbGVyQ2hyb21pdW06OmNvbnRlbnRSZWN0VG9UaWxlSW5kaWNlcyhjb25zdCBJbnRS
ZWN0JiBjb250ZW50UmVjdCwgaW50JiBsZWZ0LCBpbnQmIHRvcCwgaW50JiByaWdodCwgaW50JiBi
b3R0b20pIGNvbnN0CiB7CiAgICAgY29uc3QgSW50UmVjdCBsYXllclJlY3QgPSBjb250ZW50UmVj
dFRvTGF5ZXJSZWN0KGNvbnRlbnRSZWN0KTsKIApAQCAtMTYzLDM2ICsxNTUsMjggQEAgSW50UmVj
dCBMYXllclRpbGVyQ2hyb21pdW06OmxheWVyUmVjdFRvQ29udGVudFJlY3QoY29uc3QgSW50UmVj
dCYgbGF5ZXJSZWN0KSBjb24KICAgICByZXR1cm4gY29udGVudFJlY3Q7CiB9CiAKLWludCBMYXll
clRpbGVyQ2hyb21pdW06OnRpbGVJbmRleChpbnQgaSwgaW50IGopIGNvbnN0CitMYXllclRpbGVy
Q2hyb21pdW06OlRpbGUqIExheWVyVGlsZXJDaHJvbWl1bTo6dGlsZUF0KGludCBpLCBpbnQgaikg
Y29uc3QKIHsKLSAgICByZXR1cm4gbV90aWxpbmdEYXRhLnRpbGVJbmRleChpLCBqKTsKKyAgICBU
aWxlKiB0aWxlID0gbV90aWxlcy5nZXQobWFrZV9wYWlyKGksIGopKS5nZXQoKTsKKyAgICBBU1NF
UlQoIXRpbGUgfHwgdGlsZS0+cmVmQ291bnQoKSA9PSAxKTsKKyAgICByZXR1cm4gdGlsZTsKIH0K
IAotSW50UmVjdCBMYXllclRpbGVyQ2hyb21pdW06OnRpbGVDb250ZW50UmVjdChpbnQgaSwgaW50
IGopIGNvbnN0CitJbnRSZWN0IExheWVyVGlsZXJDaHJvbWl1bTo6dGlsZUNvbnRlbnRSZWN0KGNv
bnN0IFRpbGUqIHRpbGUpIGNvbnN0CiB7Ci0gICAgSW50UmVjdCBjb250ZW50UmVjdCA9IHRpbGVM
YXllclJlY3QoaSwgaik7CisgICAgSW50UmVjdCBjb250ZW50UmVjdCA9IHRpbGVMYXllclJlY3Qo
dGlsZSk7CiAgICAgY29udGVudFJlY3QubW92ZShtX2xheWVyUG9zaXRpb24ueCgpLCBtX2xheWVy
UG9zaXRpb24ueSgpKTsKICAgICByZXR1cm4gY29udGVudFJlY3Q7CiB9CiAKLUludFJlY3QgTGF5
ZXJUaWxlckNocm9taXVtOjp0aWxlTGF5ZXJSZWN0KGludCBpLCBpbnQgaikgY29uc3QKK0ludFJl
Y3QgTGF5ZXJUaWxlckNocm9taXVtOjp0aWxlTGF5ZXJSZWN0KGNvbnN0IFRpbGUqIHRpbGUpIGNv
bnN0CiB7Ci0gICAgY29uc3QgaW50IGluZGV4ID0gbV90aWxpbmdEYXRhLnRpbGVJbmRleChpLCBq
KTsKKyAgICBjb25zdCBpbnQgaW5kZXggPSBtX3RpbGluZ0RhdGEudGlsZUluZGV4KHRpbGUtPmko
KSwgdGlsZS0+aigpKTsKICAgICBJbnRSZWN0IGxheWVyUmVjdCA9IG1fdGlsaW5nRGF0YS50aWxl
Qm91bmRzV2l0aEJvcmRlcihpbmRleCk7CiAgICAgbGF5ZXJSZWN0LnNldFNpemUobV90aWxlU2l6
ZSk7CiAgICAgcmV0dXJuIGxheWVyUmVjdDsKIH0KIAotSW50U2l6ZSBMYXllclRpbGVyQ2hyb21p
dW06OmxheWVyU2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEludFNpemUobV90aWxpbmdEYXRh
LnRvdGFsU2l6ZVgoKSwgbV90aWxpbmdEYXRhLnRvdGFsU2l6ZVkoKSk7Ci19Ci0KLUludFNpemUg
TGF5ZXJUaWxlckNocm9taXVtOjpsYXllclRpbGVTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
SW50U2l6ZShtX3RpbGluZ0RhdGEubnVtVGlsZXNYKCksIG1fdGlsaW5nRGF0YS5udW1UaWxlc1ko
KSk7Ci19Ci0KIHZvaWQgTGF5ZXJUaWxlckNocm9taXVtOjppbnZhbGlkYXRlUmVjdChjb25zdCBJ
bnRSZWN0JiBjb250ZW50UmVjdCkKIHsKICAgICBpZiAoY29udGVudFJlY3QuaXNFbXB0eSgpKQpA
QCAtMjAyLDE2ICsxODYsMTYgQEAgdm9pZCBMYXllclRpbGVyQ2hyb21pdW06OmludmFsaWRhdGVS
ZWN0KGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0KQogCiAgICAgLy8gRGlydHkgcmVjdHMgYXJl
IGFsd2F5cyBpbiBsYXllciBzcGFjZSwgYXMgdGhlIGxheWVyIGNvdWxkIGJlIHJlcG9zaXRpb25l
ZAogICAgIC8vIGFmdGVyIGludmFsaWRhdGlvbi4KLSAgICBJbnRSZWN0IGxheWVyUmVjdCA9IGNv
bnRlbnRSZWN0VG9MYXllclJlY3QoY29udGVudFJlY3QpOworICAgIGNvbnN0IEludFJlY3QgbGF5
ZXJSZWN0ID0gY29udGVudFJlY3RUb0xheWVyUmVjdChjb250ZW50UmVjdCk7CiAKICAgICBpbnQg
bGVmdCwgdG9wLCByaWdodCwgYm90dG9tOwogICAgIGNvbnRlbnRSZWN0VG9UaWxlSW5kaWNlcyhj
b250ZW50UmVjdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKICAgICBmb3IgKGludCBqID0g
dG9wOyBqIDw9IGJvdHRvbTsgKytqKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSBsZWZ0OyBpIDw9
IHJpZ2h0OyArK2kpIHsKLSAgICAgICAgICAgIFRpbGUqIHRpbGUgPSBtX3RpbGVzW3RpbGVJbmRl
eChpLCBqKV0uZ2V0KCk7CisgICAgICAgICAgICBUaWxlKiB0aWxlID0gdGlsZUF0KGksIGopOwog
ICAgICAgICAgICAgaWYgKCF0aWxlKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgSW50UmVjdCBib3VuZCA9IHRpbGVMYXllclJlY3QoaSwgaik7CisgICAgICAgICAgICBJ
bnRSZWN0IGJvdW5kID0gdGlsZUxheWVyUmVjdCh0aWxlKTsKICAgICAgICAgICAgIGJvdW5kLmlu
dGVyc2VjdChsYXllclJlY3QpOwogICAgICAgICAgICAgdGlsZS0+bV9kaXJ0eUxheWVyUmVjdC51
bml0ZShib3VuZCk7CiAgICAgICAgIH0KQEAgLTIyMCwxNCArMjA0LDEzIEBAIHZvaWQgTGF5ZXJU
aWxlckNocm9taXVtOjppbnZhbGlkYXRlUmVjdChjb25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCkK
IAogdm9pZCBMYXllclRpbGVyQ2hyb21pdW06OmludmFsaWRhdGVFbnRpcmVMYXllcigpCiB7Ci0g
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3RpbGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
IGlmIChtX3RpbGVzW2ldKQotICAgICAgICAgICAgbV91bnVzZWRUaWxlcy5hcHBlbmQobV90aWxl
c1tpXS5yZWxlYXNlKCkpOworICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXRlciA9IG1fdGls
ZXMuYmVnaW4oKTsgaXRlciAhPSBtX3RpbGVzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgQVNT
RVJUKGl0ZXItPnNlY29uZC0+cmVmQ291bnQoKSA9PSAxKTsKKyAgICAgICAgbV91bnVzZWRUaWxl
cy5hcHBlbmQoaXRlci0+c2Vjb25kLnJlbGVhc2UoKSk7CiAgICAgfQogICAgIG1fdGlsZXMuY2xl
YXIoKTsKIAogICAgIG1fdGlsaW5nRGF0YS5zZXRUb3RhbFNpemUoMCwgMCk7Ci0gICAgbV9sYXN0
VXBkYXRlTGF5ZXJSZWN0ID0gSW50UmVjdCgpOwogfQogCiB2b2lkIExheWVyVGlsZXJDaHJvbWl1
bTo6dXBkYXRlKFRpbGVQYWludEludGVyZmFjZSYgcGFpbnRlciwgY29uc3QgSW50UmVjdCYgY29u
dGVudFJlY3QpCkBAIC0yMzcsMTAgKzIyMCw3IEBAIHZvaWQgTGF5ZXJUaWxlckNocm9taXVtOjp1
cGRhdGUoVGlsZVBhaW50SW50ZXJmYWNlJiBwYWludGVyLCBjb25zdCBJbnRSZWN0JiBjb250CiAK
ICAgICAvLyBJbnZhbGlkYXRlIG9sZCB0aWxlcyB0aGF0IHdlcmUgcHJldmlvdXNseSB1c2VkIGJ1
dCBhcmVuJ3QgaW4gdXNlIHRoaXMKICAgICAvLyBmcmFtZSBzbyB0aGF0IHRoZXkgY2FuIGdldCBy
ZXVzZWQgZm9yIG5ldyB0aWxlcy4KLSAgICBJbnRSZWN0IGxheWVyUmVjdCA9IGNvbnRlbnRSZWN0
VG9MYXllclJlY3QoY29udGVudFJlY3QpOwotICAgIGludmFsaWRhdGVUaWxlcyhtX2xhc3RVcGRh
dGVMYXllclJlY3QsIGxheWVyUmVjdCk7Ci0gICAgbV9sYXN0VXBkYXRlTGF5ZXJSZWN0ID0gbGF5
ZXJSZWN0OwotCisgICAgaW52YWxpZGF0ZVRpbGVzKGNvbnRlbnRSZWN0KTsKICAgICBncm93TGF5
ZXJUb0NvbnRhaW4oY29udGVudFJlY3QpOwogCiAgICAgLy8gQ3JlYXRlIHRpbGVzIGFzIG5lZWRl
ZCwgZXhwYW5kaW5nIGEgZGlydHkgcmVjdCB0byBjb250YWluIGFsbApAQCAtMjUwLDExICsyMzAs
MTEgQEAgdm9pZCBMYXllclRpbGVyQ2hyb21pdW06OnVwZGF0ZShUaWxlUGFpbnRJbnRlcmZhY2Um
IHBhaW50ZXIsIGNvbnN0IEludFJlY3QmIGNvbnQKICAgICBjb250ZW50UmVjdFRvVGlsZUluZGlj
ZXMoY29udGVudFJlY3QsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CiAgICAgZm9yIChpbnQg
aiA9IHRvcDsgaiA8PSBib3R0b207ICsraikgewogICAgICAgICBmb3IgKGludCBpID0gbGVmdDsg
aSA8PSByaWdodDsgKytpKSB7Ci0gICAgICAgICAgICBUaWxlKiB0aWxlID0gbV90aWxlc1t0aWxl
SW5kZXgoaSwgaildLmdldCgpOworICAgICAgICAgICAgVGlsZSogdGlsZSA9IHRpbGVBdChpLCBq
KTsKICAgICAgICAgICAgIGlmICghdGlsZSkKICAgICAgICAgICAgICAgICB0aWxlID0gY3JlYXRl
VGlsZShpLCBqKTsKICAgICAgICAgICAgIGlmICghdGlsZS0+dGV4dHVyZSgpLT5pc1ZhbGlkKG1f
dGlsZVNpemUsIEdyYXBoaWNzQ29udGV4dDNEOjpSR0JBKSkKLSAgICAgICAgICAgICAgICB0aWxl
LT5tX2RpcnR5TGF5ZXJSZWN0ID0gdGlsZUxheWVyUmVjdChpLCBqKTsKKyAgICAgICAgICAgICAg
ICB0aWxlLT5tX2RpcnR5TGF5ZXJSZWN0ID0gdGlsZUxheWVyUmVjdCh0aWxlKTsKICAgICAgICAg
ICAgIGRpcnR5TGF5ZXJSZWN0LnVuaXRlKHRpbGUtPm1fZGlydHlMYXllclJlY3QpOwogICAgICAg
ICB9CiAgICAgfQpAQCAtMjg1LDE0ICsyNjUsMTQgQEAgdm9pZCBMYXllclRpbGVyQ2hyb21pdW06
OnVwZGF0ZUZyb21QaXhlbHMoY29uc3QgSW50UmVjdCYgcGFpbnRSZWN0LCBjb25zdCB1aW50OF8K
ICAgICBjb250ZW50UmVjdFRvVGlsZUluZGljZXMocGFpbnRSZWN0LCBsZWZ0LCB0b3AsIHJpZ2h0
LCBib3R0b20pOwogICAgIGZvciAoaW50IGogPSB0b3A7IGogPD0gYm90dG9tOyArK2opIHsKICAg
ICAgICAgZm9yIChpbnQgaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7ICsraSkgewotICAgICAgICAgICAg
VGlsZSogdGlsZSA9IG1fdGlsZXNbdGlsZUluZGV4KGksIGopXS5nZXQoKTsKKyAgICAgICAgICAg
IFRpbGUqIHRpbGUgPSB0aWxlQXQoaSwgaik7CiAgICAgICAgICAgICBpZiAoIXRpbGUpCiAgICAg
ICAgICAgICAgICAgQ1JBU0goKTsKICAgICAgICAgICAgIGlmICghdGlsZS0+ZGlydHkoKSkKICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHBhZ2Ut
c3BhY2UgcmVjdGFuZ2xlIHRvIGNvcHkgZnJvbS4KLSAgICAgICAgICAgIEludFJlY3Qgc291cmNl
UmVjdCA9IHRpbGVDb250ZW50UmVjdChpLCBqKTsKKyAgICAgICAgICAgIEludFJlY3Qgc291cmNl
UmVjdCA9IHRpbGVDb250ZW50UmVjdCh0aWxlKTsKICAgICAgICAgICAgIGNvbnN0IEludFBvaW50
IGFuY2hvciA9IHNvdXJjZVJlY3QubG9jYXRpb24oKTsKICAgICAgICAgICAgIHNvdXJjZVJlY3Qu
aW50ZXJzZWN0KGxheWVyUmVjdFRvQ29udGVudFJlY3QodGlsZS0+bV9kaXJ0eUxheWVyUmVjdCkp
OwogICAgICAgICAgICAgaWYgKHNvdXJjZVJlY3QuaXNFbXB0eSgpKQpAQCAtMzY2LDggKzM0Niw3
IEBAIHZvaWQgTGF5ZXJUaWxlckNocm9taXVtOjpkcmF3KGNvbnN0IEludFJlY3QmIGNvbnRlbnRS
ZWN0KQogICAgIGNvbnRlbnRSZWN0VG9UaWxlSW5kaWNlcyhjb250ZW50UmVjdCwgbGVmdCwgdG9w
LCByaWdodCwgYm90dG9tKTsKICAgICBmb3IgKGludCBqID0gdG9wOyBqIDw9IGJvdHRvbTsgKytq
KSB7CiAgICAgICAgIGZvciAoaW50IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyArK2kpIHsKLSAgICAg
ICAgICAgIGNvbnN0IGludCBpbmRleCA9IHRpbGVJbmRleChpLCBqKTsKLSAgICAgICAgICAgIFRp
bGUqIHRpbGUgPSBtX3RpbGVzW2luZGV4XS5nZXQoKTsKKyAgICAgICAgICAgIFRpbGUqIHRpbGUg
PSB0aWxlQXQoaSwgaik7CiAgICAgICAgICAgICBBU1NFUlQodGlsZSk7CiAKICAgICAgICAgICAg
IHRpbGUtPnRleHR1cmUoKS0+YmluZFRleHR1cmUoKTsKQEAgLTM3NiwxMSArMzU1LDExIEBAIHZv
aWQgTGF5ZXJUaWxlckNocm9taXVtOjpkcmF3KGNvbnN0IEludFJlY3QmIGNvbnRlbnRSZWN0KQog
CiAgICAgICAgICAgICAvLyBEb24ndCB1c2UgdGlsZUNvbnRlbnRSZWN0IGhlcmUsIGFzIHRoYXQg
Y29udGFpbnMgdGhlIGZ1bGwKICAgICAgICAgICAgIC8vIHJlY3Qgd2l0aCBib3JkZXIgdGV4ZWxz
IHdoaWNoIHNob3VsZG4ndCBiZSBkcmF3bi4KLSAgICAgICAgICAgIEludFJlY3QgdGlsZVJlY3Qg
PSBtX3RpbGluZ0RhdGEudGlsZUJvdW5kcyhpbmRleCk7CisgICAgICAgICAgICBJbnRSZWN0IHRp
bGVSZWN0ID0gbV90aWxpbmdEYXRhLnRpbGVCb3VuZHMobV90aWxpbmdEYXRhLnRpbGVJbmRleCh0
aWxlLT5pKCksIHRpbGUtPmooKSkpOwogICAgICAgICAgICAgdGlsZVJlY3QubW92ZShtX2xheWVy
UG9zaXRpb24ueCgpLCBtX2xheWVyUG9zaXRpb24ueSgpKTsKICAgICAgICAgICAgIHRpbGVNYXRy
aXgudHJhbnNsYXRlM2QodGlsZVJlY3QueCgpIC0gY29udGVudFJlY3QueCgpICsgdGlsZVJlY3Qu
d2lkdGgoKSAvIDIuMCwgdGlsZVJlY3QueSgpIC0gY29udGVudFJlY3QueSgpICsgdGlsZVJlY3Qu
aGVpZ2h0KCkgLyAyLjAsIDApOwogCi0gICAgICAgICAgICBJbnRQb2ludCB0ZXhPZmZzZXQgPSBt
X3RpbGluZ0RhdGEudGV4dHVyZU9mZnNldChpLCBqKTsKKyAgICAgICAgICAgIEludFBvaW50IHRl
eE9mZnNldCA9IG1fdGlsaW5nRGF0YS50ZXh0dXJlT2Zmc2V0KHRpbGUtPmkoKSwgdGlsZS0+aigp
KTsKICAgICAgICAgICAgIGZsb2F0IHRpbGVXaWR0aCA9IHN0YXRpY19jYXN0PGZsb2F0PihtX3Rp
bGVTaXplLndpZHRoKCkpOwogICAgICAgICAgICAgZmxvYXQgdGlsZUhlaWdodCA9IHN0YXRpY19j
YXN0PGZsb2F0PihtX3RpbGVTaXplLmhlaWdodCgpKTsKICAgICAgICAgICAgIGZsb2F0IHRleFRy
YW5zbGF0ZVggPSB0ZXhPZmZzZXQueCgpIC8gdGlsZVdpZHRoOwpAQCAtMzk1LDM3ICszNzQsMTUg
QEAgdm9pZCBMYXllclRpbGVyQ2hyb21pdW06OmRyYXcoY29uc3QgSW50UmVjdCYgY29udGVudFJl
Y3QpCiAgICAgfQogfQogCi12b2lkIExheWVyVGlsZXJDaHJvbWl1bTo6cmVzaXplTGF5ZXIoY29u
c3QgSW50U2l6ZSYgc2l6ZSkKLXsKLSAgICBpZiAobGF5ZXJTaXplKCkgPT0gc2l6ZSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgY29uc3QgSW50U2l6ZSBvbGRUaWxlU2l6ZSA9IGxheWVyVGlsZVNp
emUoKTsKLSAgICBtX3RpbGluZ0RhdGEuc2V0VG90YWxTaXplKHNpemUud2lkdGgoKSwgc2l6ZS5o
ZWlnaHQoKSk7Ci0gICAgY29uc3QgSW50U2l6ZSBuZXdUaWxlU2l6ZSA9IGxheWVyVGlsZVNpemUo
KTsKLQotICAgIGlmIChvbGRUaWxlU2l6ZSA9PSBuZXdUaWxlU2l6ZSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaWYgKG5ld1RpbGVTaXplLmhlaWdodCgpICYmIChuZXdUaWxlU2l6ZS53aWR0aCgp
ID4gSU5UX01BWCAvIG5ld1RpbGVTaXplLmhlaWdodCgpKSkKLSAgICAgICAgQ1JBU0goKTsKLQot
ICAgIFZlY3RvcjxPd25QdHI8VGlsZT4gPiBuZXdUaWxlczsKLSAgICBuZXdUaWxlcy5yZXNpemUo
bmV3VGlsZVNpemUud2lkdGgoKSAqIG5ld1RpbGVTaXplLmhlaWdodCgpKTsKLSAgICBmb3IgKGlu
dCBqID0gMDsgaiA8IG9sZFRpbGVTaXplLmhlaWdodCgpOyArK2opCi0gICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgb2xkVGlsZVNpemUud2lkdGgoKTsgKytpKQotICAgICAgICAgICAgbmV3VGls
ZXNbaSArIGogKiBuZXdUaWxlU2l6ZS53aWR0aCgpXS5zd2FwKG1fdGlsZXNbaSArIGogKiBvbGRU
aWxlU2l6ZS53aWR0aCgpXSk7Ci0gICAgbV90aWxlcy5zd2FwKG5ld1RpbGVzKTsKLX0KLQogdm9p
ZCBMYXllclRpbGVyQ2hyb21pdW06Omdyb3dMYXllclRvQ29udGFpbihjb25zdCBJbnRSZWN0JiBj
b250ZW50UmVjdCkKIHsKICAgICAvLyBHcm93IHRoZSB0aWxlIGFycmF5IHRvIGNvbnRhaW4gdGhp
cyBjb250ZW50IHJlY3QuCiAgICAgSW50UmVjdCBsYXllclJlY3QgPSBjb250ZW50UmVjdFRvTGF5
ZXJSZWN0KGNvbnRlbnRSZWN0KTsKICAgICBJbnRTaXplIHJlY3RTaXplID0gSW50U2l6ZShsYXll
clJlY3QubWF4WCgpLCBsYXllclJlY3QubWF4WSgpKTsKIAotICAgIEludFNpemUgbmV3U2l6ZSA9
IHJlY3RTaXplLmV4cGFuZGVkVG8obGF5ZXJTaXplKCkpOwotICAgIHJlc2l6ZUxheWVyKG5ld1Np
emUpOworICAgIEludFNpemUgb2xkTGF5ZXJTaXplKG1fdGlsaW5nRGF0YS50b3RhbFNpemVYKCks
IG1fdGlsaW5nRGF0YS50b3RhbFNpemVZKCkpOworICAgIEludFNpemUgbmV3U2l6ZSA9IHJlY3RT
aXplLmV4cGFuZGVkVG8ob2xkTGF5ZXJTaXplKTsKKyAgICBtX3RpbGluZ0RhdGEuc2V0VG90YWxT
aXplKG5ld1NpemUud2lkdGgoKSwgbmV3U2l6ZS5oZWlnaHQoKSk7CiB9CiAKIHZvaWQgTGF5ZXJU
aWxlckNocm9taXVtOjpkcmF3VGV4dHVyZWRRdWFkKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0
LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIGRyYXdNYXRyaXgsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllclRpbGVyQ2hyb21pdW0uaCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyVGlsZXJDaHJvbWl1bS5o
CmluZGV4IGJkYjM1YTVjNDgxODI1N2M5M2JhMzFkZDIzYWRlNjc2ZTYyNzNiODMuLjJmMzU2ZTRj
ODllZWQ1OTZkNjgwNTY4YmE5YjNhM2QyMDFkNTQyZDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyVGlsZXJDaHJvbWl1bS5oCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyVGlsZXJDaHJv
bWl1bS5oCkBAIC0zMyw3ICszMyw5IEBACiAjaW5jbHVkZSAiTGF5ZXJUZXh0dXJlLmgiCiAjaW5j
bHVkZSAiUGxhdGZvcm1DYW52YXMuaCIKICNpbmNsdWRlICJUaWxpbmdEYXRhLmgiCisjaW5jbHVk
ZSA8d3RmL0hhc2hUcmFpdHMuaD4KICNpbmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KKyNpbmNs
dWRlIDx3dGYvUmVmQ291bnRlZC5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTcwLDIw
ICs3MiwyNiBAQCBwdWJsaWM6CiBwcml2YXRlOgogICAgIExheWVyVGlsZXJDaHJvbWl1bShMYXll
clJlbmRlcmVyQ2hyb21pdW0qLCBjb25zdCBJbnRTaXplJiB0aWxlU2l6ZSwgQm9yZGVyVGV4ZWxP
cHRpb24pOwogCi0gICAgY2xhc3MgVGlsZSB7CisgICAgY2xhc3MgVGlsZSA6IHB1YmxpYyBSZWZD
b3VudGVkPFRpbGU+IHsKICAgICAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoVGlsZSk7CiAgICAg
cHVibGljOgotICAgICAgICBleHBsaWNpdCBUaWxlKFBhc3NPd25QdHI8TGF5ZXJUZXh0dXJlPiB0
ZXgpIDogbV90ZXgodGV4KSB7fQorICAgICAgICBleHBsaWNpdCBUaWxlKFBhc3NPd25QdHI8TGF5
ZXJUZXh0dXJlPiB0ZXgpIDogbV90ZXgodGV4KSwgbV9pKC0xKSwgbV9qKC0xKSB7fQogCiAgICAg
ICAgIExheWVyVGV4dHVyZSogdGV4dHVyZSgpIHsgcmV0dXJuIG1fdGV4LmdldCgpOyB9CiAKICAg
ICAgICAgYm9vbCBkaXJ0eSgpIGNvbnN0IHsgcmV0dXJuICFtX2RpcnR5TGF5ZXJSZWN0LmlzRW1w
dHkoKTsgfQogICAgICAgICB2b2lkIGNsZWFyRGlydHkoKSB7IG1fZGlydHlMYXllclJlY3QgPSBJ
bnRSZWN0KCk7IH0KIAorICAgICAgICBpbnQgaSgpIGNvbnN0IHsgcmV0dXJuIG1faTsgfQorICAg
ICAgICBpbnQgaigpIGNvbnN0IHsgcmV0dXJuIG1fajsgfQorICAgICAgICB2b2lkIG1vdmVUbyhp
bnQgaSwgaW50IGopIHsgbV9pID0gaTsgbV9qID0gajsgfQorCiAgICAgICAgIC8vIExheWVyLXNw
YWNlIGRpcnR5IHJlY3RhbmdsZSB0aGF0IG5lZWRzIHRvIGJlIHJlcGFpbnRlZC4KICAgICAgICAg
SW50UmVjdCBtX2RpcnR5TGF5ZXJSZWN0OwogICAgIHByaXZhdGU6CiAgICAgICAgIE93blB0cjxM
YXllclRleHR1cmU+IG1fdGV4OworICAgICAgICBpbnQgbV9pOworICAgICAgICBpbnQgbV9qOwog
ICAgIH07CiAKICAgICB2b2lkIGRyYXdUZXh0dXJlZFF1YWQoR3JhcGhpY3NDb250ZXh0M0QqLCBj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIGRyYXdNYXRyaXgsCkBAIC05Miw0MCArMTAwLDQ1IEBAIHByaXZhdGU6
CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRleFNjYWxlWCwgZmxvYXQgdGV4U2Nh
bGVZLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYXllclRpbGVyQ2hyb21pdW06
OlByb2dyYW0qKTsKIAotICAgIHZvaWQgcmVzaXplTGF5ZXIoY29uc3QgSW50U2l6ZSYgc2l6ZSk7
CiAgICAgLy8gR3JvdyBsYXllciBzaXplIHRvIGNvbnRhaW4gdGhpcyByZWN0YW5nbGUuCiAgICAg
dm9pZCBncm93TGF5ZXJUb0NvbnRhaW4oY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QpOwogCiAg
ICAgTGF5ZXJSZW5kZXJlckNocm9taXVtKiBsYXllclJlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4g
bV9sYXllclJlbmRlcmVyOyB9CiAgICAgR3JhcGhpY3NDb250ZXh0M0QqIGxheWVyUmVuZGVyZXJD
b250ZXh0KCkgY29uc3Q7CiAgICAgVGlsZSogY3JlYXRlVGlsZShpbnQgaSwgaW50IGopOwotICAg
IC8vIEludmFsaWRhdGUgYW55IHRpbGVzIHdoaWNoIGRvIG5vdCBpbnRlcnNlY3Qgd2l0aCB0aGUg
bmV3TGF5ZXJSZWN0LgotICAgIHZvaWQgaW52YWxpZGF0ZVRpbGVzKGNvbnN0IEludFJlY3QmIG9s
ZExheWVyUmVjdCwgY29uc3QgSW50UmVjdCYgbmV3TGF5ZXJSZWN0KTsKKyAgICAvLyBJbnZhbGlk
YXRlIGFueSB0aWxlcyB3aGljaCBkbyBub3QgaW50ZXJzZWN0IHdpdGggdGhlIGNvbnRlbnRSZWN0
CisgICAgdm9pZCBpbnZhbGlkYXRlVGlsZXMoY29uc3QgSW50UmVjdCYgY29udGVudFJlY3QpOwog
ICAgIHZvaWQgcmVzZXQoKTsKICAgICB2b2lkIGNvbnRlbnRSZWN0VG9UaWxlSW5kaWNlcyhjb25z
dCBJbnRSZWN0JiBjb250ZW50UmVjdCwgaW50ICZsZWZ0LCBpbnQgJnRvcCwgaW50ICZyaWdodCwg
aW50ICZib3R0b20pIGNvbnN0OwogICAgIEludFJlY3QgY29udGVudFJlY3RUb0xheWVyUmVjdChj
b25zdCBJbnRSZWN0JiBjb250ZW50UmVjdCkgY29uc3Q7CiAgICAgSW50UmVjdCBsYXllclJlY3RU
b0NvbnRlbnRSZWN0KGNvbnN0IEludFJlY3QmIGxheWVyUmVjdCkgY29uc3Q7CiAKLSAgICAvLyBS
ZXR1cm5zIHRoZSBpbmRleCBpbnRvIG1fdGlsZXMgZm9yIGEgZ2l2ZW4gdGlsZSBsb2NhdGlvbi4K
LSAgICBpbnQgdGlsZUluZGV4KGludCBpLCBpbnQgaikgY29uc3Q7Ci0gICAgLy8gUmV0dXJucyB0
aGUgYm91bmRzIGluIGNvbnRlbnQgc3BhY2UgZm9yIGEgZ2l2ZW4gdGlsZSBsb2NhdGlvbi4KLSAg
ICBJbnRSZWN0IHRpbGVDb250ZW50UmVjdChpbnQgaSwgaW50IGopIGNvbnN0OwotICAgIC8vIFJl
dHVybnMgdGhlIGJvdW5kcyBpbiBsYXllciBzcGFjZSBmb3IgYSBnaXZlbiB0aWxlIGxvY2F0aW9u
LgotICAgIEludFJlY3QgdGlsZUxheWVyUmVjdChpbnQgaSwgaW50IGopIGNvbnN0OwotCi0gICAg
SW50U2l6ZSBsYXllclNpemUoKSBjb25zdDsKLSAgICBJbnRTaXplIGxheWVyVGlsZVNpemUoKSBj
b25zdDsKKyAgICBUaWxlKiB0aWxlQXQoaW50LCBpbnQpIGNvbnN0OworICAgIEludFJlY3QgdGls
ZUNvbnRlbnRSZWN0KGNvbnN0IFRpbGUqKSBjb25zdDsKKyAgICBJbnRSZWN0IHRpbGVMYXllclJl
Y3QoY29uc3QgVGlsZSopIGNvbnN0OwogCiAgICAgSW50U2l6ZSBtX3RpbGVTaXplOwotICAgIElu
dFJlY3QgbV9sYXN0VXBkYXRlTGF5ZXJSZWN0OwogICAgIEludFBvaW50IG1fbGF5ZXJQb3NpdGlv
bjsKIAogICAgIGJvb2wgbV9za2lwc0RyYXc7CiAKLSAgICAvLyBMb2dpY2FsIDJEIGFycmF5IG9m
IHRpbGVzIChkaW1lbnNpb25zIG9mIG1fbGF5ZXJUaWxlU2l6ZSkKLSAgICBWZWN0b3I8T3duUHRy
PFRpbGU+ID4gbV90aWxlczsKLSAgICAvLyBMaW5lYXIgYXJyYXkgb2YgdW51c2VkIHRpbGVzLgot
ICAgIFZlY3RvcjxPd25QdHI8VGlsZT4gPiBtX3VudXNlZFRpbGVzOworICAgIC8vIERlZmF1bHQg
aGFzaCBrZXkgdHJhaXRzIGZvciBpbnRlZ2VycyBkaXNhbGxvdyAwIGFuZCAtMSBhcyBhIGtleSwg
c28KKyAgICAvLyB1c2UgYSBjdXN0b20gaGFzaCB0cmFpdCB3aGljaCBkaXNhbGxvd3MgLTEgYW5k
IC0yIGluc3RlYWQuCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8aW50LCBpbnQ+IFRpbGVNYXBLZXk7
CisgICAgc3RydWN0IFRpbGVNYXBLZXlUcmFpdHMgOiBIYXNoVHJhaXRzPFRpbGVNYXBLZXk+IHsK
KyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgZW1wdHlWYWx1ZUlzWmVybyA9IGZhbHNlOworICAg
ICAgICBzdGF0aWMgY29uc3QgYm9vbCBuZWVkc0Rlc3RydWN0aW9uID0gZmFsc2U7CisgICAgICAg
IHN0YXRpYyBUaWxlTWFwS2V5IGVtcHR5VmFsdWUoKSB7IHJldHVybiBzdGQ6Om1ha2VfcGFpcigt
MSwgLTEpOyB9CisgICAgICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdERlbGV0ZWRWYWx1ZShUaWxl
TWFwS2V5JiBzbG90KSB7IHNsb3QgPSBzdGQ6Om1ha2VfcGFpcigtMiwgLTIpOyB9CisgICAgICAg
IHN0YXRpYyBib29sIGlzRGVsZXRlZFZhbHVlKFRpbGVNYXBLZXkgdmFsdWUpIHsgcmV0dXJuIHZh
bHVlLmZpcnN0ID09IC0yICYmIHZhbHVlLnNlY29uZCA9PSAtMjsgfQorICAgIH07CisgICAgLy8g
RklYTUU6IFRoZSBtYXBwZWQgdmFsdWUgaW4gVGlsZU1hcCBzaG91bGQgcmVhbGx5IGJlIGFuIE93
blB0ciwgYXMgdGhlCisgICAgLy8gcmVmY291bnQgb2YgYSBUaWxlIHNob3VsZCBuZXZlciBiZSBt
b3JlIHRoYW4gMS4gSG93ZXZlciwgSGFzaE1hcAorICAgIC8vIGRvZXNuJ3QgZWFzaWx5IHN1cHBv
cnQgT3duUHRyIGFzIGEgdmFsdWUuCisgICAgdHlwZWRlZiBIYXNoTWFwPFRpbGVNYXBLZXksIFJl
ZlB0cjxUaWxlPiwgRGVmYXVsdEhhc2g8VGlsZU1hcEtleT46Okhhc2gsIFRpbGVNYXBLZXlUcmFp
dHM+IFRpbGVNYXA7CisgICAgVGlsZU1hcCBtX3RpbGVzOworICAgIC8vIFRpZ2h0bHkgcGFja2Vk
IHNldCBvZiB1bnVzZWQgdGlsZXMuCisgICAgVmVjdG9yPFJlZlB0cjxUaWxlPiA+IG1fdW51c2Vk
VGlsZXM7CiAKICAgICBQbGF0Zm9ybUNhbnZhcyBtX2NhbnZhczsKIAo=
</data>
<flag name="review"
          id="77496"
          type_id="1"
          status="+"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>