<?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>146205</bug_id>
          
          <creation_ts>2015-06-22 07:10:26 -0700</creation_ts>
          <short_desc>Decoding of animated PNG (APNG) is not optimized for memory usage.</short_desc>
          <delta_ts>2019-05-07 11:08:17 -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>Images</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://people.igalia.com/clopez/apngmem</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="Carlos Alberto Lopez Perez">clopez</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cgarcia</cc>
    
    <cc>commit-queue</cc>
    
    <cc>maxstepin</cc>
    
    <cc>sagar73510</cc>
    
    <cc>superpuperbomb</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1103830</commentid>
    <comment_count>0</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2015-06-22 07:10:26 -0700</bug_when>
    <thetext>The current code for decoding animated PNGs (see bug 17022.) decodes all frames at once
and loads the raw pixels on memory for each frame.

This is a problem when we have an animated PNG with many frames.

Take the following example:

http://people.igalia.com/clopez/apngmem

The image loaded (clouds.png) has 375 frames at 700 x 394 (8-bit/color RGBA),
so when each frame of this image is loaded into memory it uses:

700*394*4 ~ 1.05 MB

That should be ok if the image had only a few frames, however it has 375 frames,
so when we load all the 375 frames into memory we end using around ~400MB,
which is too much.


The current PNGImageDecoder decoder implements PNGImageDecoder::clearFrameBufferCache(),
which helps to clear the already displayed frames. So if you check the memory
usage of WebKitWebProcess when the example test page is playing the animation,
you will see that the memory used by WebKitWebProcess lowers as it displays
the animation, however when the animation ends and starts again, the memory usage
peaks again because it decodes all the frames into memory again.


So, instead of loading all the frames on memory at once, I think it should be better
if it loads the frames on demand as the animation shows on the screen.


The GIF decoder has a parameter named haltAtFrame that seems designed to 
avoid this very same isue. See:
http://trac.webkit.org/browser/trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp?rev=185822#L299
http://trac.webkit.org/browser/trunk/Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp?rev=185822#L354

For example, check loading this gif (1116 frames at 800 x 800) &lt;http://people.igalia.com/clopez/apngmem/giant-redacted.gif&gt;
on the WebKitGTK+ MiniBrowser and on some image viewer (eog, ristretto, ...).

You will see that on the WebKitGTK+ MiniBrowser it only uses a few megabytes
while on the image viewer it would use so much ram that it will end being killed by the OOM.

I have converted this gif to png with gif2apng. The result is here &lt;http://people.igalia.com/clopez/apngmem/giant-redacted.png&gt;
If you download it and open with WebKitGTK+ you will see that it uses a lot of ram. While with the gif version that don&apos;t happens.

So, I think that the png decoder should gain support to only decode the frames
up to a haltAtFrame parameter like the GIFImageDecoder does.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103844</commentid>
    <comment_count>1</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2015-06-22 09:08:20 -0700</bug_when>
    <thetext>(In reply to comment #0)
&gt; The current code for decoding animated PNGs (see bug 17022.) decodes all
&gt; frames at once
&gt; and loads the raw pixels on memory for each frame.
&gt; 
&gt; This is a problem when we have an animated PNG with many frames.
&gt; 
&gt; Take the following example:
&gt; 
&gt; http://people.igalia.com/clopez/apngmem
&gt; 
&gt; The image loaded (clouds.png) has 375 frames at 700 x 394 (8-bit/color RGBA),
&gt; so when each frame of this image is loaded into memory it uses:
&gt; 
&gt; 700*394*4 ~ 1.05 MB
&gt; 
&gt; That should be ok if the image had only a few frames, however it has 375
&gt; frames,
&gt; so when we load all the 375 frames into memory we end using around ~400MB,
&gt; which is too much.
&gt; 
&gt;

I have replaced the previous examples with one that includes the same test with gif and apng because is much clearer the issue.

Now if you load http://people.igalia.com/clopez/apngmem you see there two test pages, the one with gif and the another one with apng.

On the one with gif WebKitWebProcess only uses ~110MB in total, on the one with apng it peaks at ~ 3GB of RAM, and as the animation is playing the memory usage starts to lower (because PNGImageDecoder::clearFrameBufferCache() is starting to clear already played frames), but when the animation finish and it starts again the memory usage peaks again at 3GB of RAM because we load all frames into memory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1125499</commentid>
    <comment_count>2</comment_count>
      <attachid>261090</attachid>
    <who name="Max Stepin">maxstepin</who>
    <bug_when>2015-09-13 14:28:43 -0700</bug_when>
    <thetext>Created attachment 261090
v01.patch

Only decode the frames up to haltAtFrame</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1125584</commentid>
    <comment_count>3</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2015-09-14 04:33:27 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Created attachment 261090 [details]
&gt; v01.patch
&gt; 
&gt; Only decode the frames up to haltAtFrame

Thanks for the patch Max.

I have tested it, and it fixes the problem with the memory consumption completely.


The problem now is that I can see some artifacts on the imagen.

I have taken two screen-shoots to show you what I&apos;m talking about:

 * http://people.igalia.com/clopez/apngmem/artifacts/while_playing.png This how the image looks on the MiniBrowser after playing it for some seconds. The numbers on the nodes showing the network traffic are blurry. Looks like if the numbers from the previous frames were not cleared somehow.

http://people.igalia.com/clopez/apngmem/artifacts/after_resize_window.png This is what happens if I resize the window of the MiniBrowser while it plays the animation. The image gets completely messed up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1125711</commentid>
    <comment_count>4</comment_count>
    <who name="Max Stepin">maxstepin</who>
    <bug_when>2015-09-14 13:12:09 -0700</bug_when>
    <thetext>If segmentLength is big enough we might overshoot a little, and decode not just haltAtFrame but a few more frames after haltAtFrame.

It might potentially lead to a problem with clearFrameBufferCache().

I guess we need to find a way to stop precisely at haltAtFrame. 

There is something similar: decodingSizeOnly() case stops precisely at the header, I&apos;ll see if we can use this method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1132294</commentid>
    <comment_count>5</comment_count>
      <attachid>262881</attachid>
    <who name="Max Stepin">maxstepin</who>
    <bug_when>2015-10-12 01:34:15 -0700</bug_when>
    <thetext>Created attachment 262881
v02.patch

Only decode the frames up to haltAtFrame, also set the frame attributes as soon as possible, instead of waiting until frameComplete(). 

That was the reason for the artifacts - &apos;dispose&apos; attribute was used by clearFrameBufferCache() a bit earlier, before it was actually set.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1139327</commentid>
    <comment_count>6</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2015-11-04 04:59:16 -0800</bug_when>
    <thetext>This last patch fixes the artifact issue. Now the image is displayed correctly and the memory usage problem is fixed. (70MB now vs 2.5GB before).

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1152012</commentid>
    <comment_count>7</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2016-01-02 12:26:33 -0800</bug_when>
    <thetext>I think he also needs cq+?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1152017</commentid>
    <comment_count>8</comment_count>
      <attachid>262881</attachid>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2016-01-02 13:33:19 -0800</bug_when>
    <thetext>Comment on attachment 262881
v02.patch

OK, I see no reason not to commit this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1152022</commentid>
    <comment_count>9</comment_count>
      <attachid>262881</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-02 14:22:30 -0800</bug_when>
    <thetext>Comment on attachment 262881
v02.patch

Clearing flags on attachment: 262881

Committed r194503: &lt;http://trac.webkit.org/changeset/194503&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1152023</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-01-02 14:22:34 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>261090</attachid>
            <date>2015-09-13 14:28:43 -0700</date>
            <delta_ts>2015-10-12 01:34:15 -0700</delta_ts>
            <desc>v01.patch</desc>
            <filename>v01.patch</filename>
            <type>text/plain</type>
            <size>4523</size>
            <attacher name="Max Stepin">maxstepin</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4OTY3NCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBACisyMDE1LTA5LTEzICBNYXggU3Rl
cGluICA8bWF4c3RlcGluQGdtYWlsLmNvbT4KKworICAgICAgICBBUE5HIGRlY29kZXI6IG9ubHkg
ZGVjb2RlIHRoZSBmcmFtZXMgdXAgdG8gaGFsdEF0RnJhbWUKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NjIwNQorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgYWxyZWFkeSBjb3ZlcmVk
IGJ5IGV4aXN0aW5nIHRlc3RzLgorCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMv
cG5nL1BOR0ltYWdlRGVjb2Rlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZVJlYWRl
cjo6Y2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VSZWFkZXI6OmRlY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OmZyYW1lQnVmZmVyQXRJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OnBuZ0NvbXBsZXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlBOR0ltYWdlRGVjb2Rlcjo6ZGVjb2RlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFn
ZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmg6CisgICAgICAgIChXZWJDb3JlOjpQTkdJ
bWFnZURlY29kZXI6OmlzQ29tcGxldGUpOgorICAgICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VEZWNv
ZGVyOjppc0NvbXBsZXRlQXRJbmRleCk6CisKIDIwMTUtMDktMTIgIENocmlzIER1bWV6ICA8Y2R1
bWV6QGFwcGxlLmNvbT4KIAogICAgICAgICB3aW5kb3cuRXZlbnRUYXJnZXQgc2hvdWxkIGV4aXN0
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9wbmcvUE5HSW1h
Z2VEZWNvZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFn
ZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmNwcAkocmV2aXNpb24gMTg5NjczKQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5nL1BOR0ltYWdlRGVjb2Rl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE2MSw3ICsxNjEsNyBAQCBwdWJsaWM6CiAgICAgICAg
IG1fcmVhZE9mZnNldCA9IDA7CiAgICAgfQogCi0gICAgYm9vbCBkZWNvZGUoY29uc3QgU2hhcmVk
QnVmZmVyJiBkYXRhLCBib29sIHNpemVPbmx5KQorICAgIGJvb2wgZGVjb2RlKGNvbnN0IFNoYXJl
ZEJ1ZmZlciYgZGF0YSwgYm9vbCBzaXplT25seSwgdW5zaWduZWQgaGFsdEF0RnJhbWUpCiAgICAg
ewogICAgICAgICBtX2RlY29kaW5nU2l6ZU9ubHkgPSBzaXplT25seTsKICAgICAgICAgUE5HSW1h
Z2VEZWNvZGVyKiBkZWNvZGVyID0gc3RhdGljX2Nhc3Q8UE5HSW1hZ2VEZWNvZGVyKj4ocG5nX2dl
dF9wcm9ncmVzc2l2ZV9wdHIobV9wbmcpKTsKQEAgLTE3OCw3ICsxNzgsNyBAQCBwdWJsaWM6CiAg
ICAgICAgICAgICAvLyBXZSBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgaXNTaXpl
QXZhaWxhYmxlKCkgYmVjYXVzZSB3ZQogICAgICAgICAgICAgLy8gbWVyZWx5IHdhbnQgdG8gY2hl
Y2sgaWYgd2UndmUgbWFuYWdlZCB0byBzZXQgdGhlIHNpemUsIG5vdAogICAgICAgICAgICAgLy8g
KHJlY3Vyc2l2ZWx5KSB0cmlnZ2VyIGFkZGl0aW9uYWwgZGVjb2RpbmcgaWYgd2UgaGF2ZW4ndC4K
LSAgICAgICAgICAgIGlmIChzaXplT25seSA/IGRlY29kZXItPkltYWdlRGVjb2Rlcjo6aXNTaXpl
QXZhaWxhYmxlKCkgOiBkZWNvZGVyLT5pc0NvbXBsZXRlKCkpCisgICAgICAgICAgICBpZiAoc2l6
ZU9ubHkgPyBkZWNvZGVyLT5JbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpIDogZGVjb2Rl
ci0+aXNDb21wbGV0ZUF0SW5kZXgoaGFsdEF0RnJhbWUpKQogICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI3NCw3ICsyNzQs
NyBAQCBQTkdJbWFnZURlY29kZXI6On5QTkdJbWFnZURlY29kZXIoKQogYm9vbCBQTkdJbWFnZURl
Y29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpCiB7CiAgICAgaWYgKCFJbWFnZURlY29kZXI6OmlzU2l6
ZUF2YWlsYWJsZSgpKQotICAgICAgICAgZGVjb2RlKHRydWUpOworICAgICAgICBkZWNvZGUodHJ1
ZSwgMCk7CiAKICAgICByZXR1cm4gSW1hZ2VEZWNvZGVyOjppc1NpemVBdmFpbGFibGUoKTsKIH0K
QEAgLTMwOCw3ICszMDgsNyBAQCBJbWFnZUZyYW1lKiBQTkdJbWFnZURlY29kZXI6OmZyYW1lQnVm
ZmVyCiAKICAgICBJbWFnZUZyYW1lJiBmcmFtZSA9IG1fZnJhbWVCdWZmZXJDYWNoZVtpbmRleF07
CiAgICAgaWYgKGZyYW1lLnN0YXR1cygpICE9IEltYWdlRnJhbWU6OkZyYW1lQ29tcGxldGUpCi0g
ICAgICAgIGRlY29kZShmYWxzZSk7CisgICAgICAgIGRlY29kZShmYWxzZSwgaW5kZXgpOwogICAg
IHJldHVybiAmZnJhbWU7CiB9CiAKQEAgLTY4Nyw3ICs2ODcsNyBAQCB2b2lkIFBOR0ltYWdlRGVj
b2Rlcjo6cG5nQ29tcGxldGUoKQogICAgICAgICBtX2ZyYW1lQnVmZmVyQ2FjaGUuZmlyc3QoKS5z
ZXRTdGF0dXMoSW1hZ2VGcmFtZTo6RnJhbWVDb21wbGV0ZSk7CiB9CiAKLXZvaWQgUE5HSW1hZ2VE
ZWNvZGVyOjpkZWNvZGUoYm9vbCBvbmx5U2l6ZSkKK3ZvaWQgUE5HSW1hZ2VEZWNvZGVyOjpkZWNv
ZGUoYm9vbCBvbmx5U2l6ZSwgdW5zaWduZWQgaGFsdEF0RnJhbWUpCiB7CiAgICAgaWYgKGZhaWxl
ZCgpKQogICAgICAgICByZXR1cm47CkBAIC02OTcsNyArNjk3LDcgQEAgdm9pZCBQTkdJbWFnZURl
Y29kZXI6OmRlY29kZShib29sIG9ubHlTaQogCiAgICAgLy8gSWYgd2UgY291bGRuJ3QgZGVjb2Rl
IHRoZSBpbWFnZSBidXQgd2UndmUgcmVjZWl2ZWQgYWxsIHRoZSBkYXRhLCBkZWNvZGluZwogICAg
IC8vIGhhcyBmYWlsZWQuCi0gICAgaWYgKCFtX3JlYWRlci0+ZGVjb2RlKCptX2RhdGEsIG9ubHlT
aXplKSAmJiBpc0FsbERhdGFSZWNlaXZlZCgpKQorICAgIGlmICghbV9yZWFkZXItPmRlY29kZSgq
bV9kYXRhLCBvbmx5U2l6ZSwgaGFsdEF0RnJhbWUpICYmIGlzQWxsRGF0YVJlY2VpdmVkKCkpCiAg
ICAgICAgIHNldEZhaWxlZCgpOwogICAgIC8vIElmIHdlJ3JlIGRvbmUgZGVjb2RpbmcgdGhlIGlt
YWdlLCB3ZSBkb24ndCBuZWVkIHRoZSBQTkdJbWFnZVJlYWRlcgogICAgIC8vIGFueW1vcmUuICAo
SWYgd2UgZmFpbGVkLCB8bV9yZWFkZXJ8IGhhcyBhbHJlYWR5IGJlZW4gY2xlYXJlZC4pCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNv
ZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2Rl
cnMvcG5nL1BOR0ltYWdlRGVjb2Rlci5oCShyZXZpc2lvbiAxODk2NzMpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmgJKHdvcmtp
bmcgY29weSkKQEAgLTgwLDExICs4MCwxNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGJvb2wgaXNDb21wbGV0ZUF0
SW5kZXgoc2l6ZV90IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGluZGV4
IDwgbV9mcmFtZUJ1ZmZlckNhY2hlLnNpemUoKSAmJiBtX2ZyYW1lQnVmZmVyQ2FjaGVbaW5kZXhd
LnN0YXR1cygpID09IEltYWdlRnJhbWU6OkZyYW1lQ29tcGxldGUpOworICAgICAgICB9CisKICAg
ICBwcml2YXRlOgogICAgICAgICAvLyBEZWNvZGVzIHRoZSBpbWFnZS4gIElmIHxvbmx5U2l6ZXwg
aXMgdHJ1ZSwgc3RvcHMgZGVjb2RpbmcgYWZ0ZXIKICAgICAgICAgLy8gY2FsY3VsYXRpbmcgdGhl
IGltYWdlIHNpemUuICBJZiBkZWNvZGluZyBmYWlscyBidXQgdGhlcmUgaXMgbm8gbW9yZQogICAg
ICAgICAvLyBkYXRhIGNvbWluZywgc2V0cyB0aGUgImRlY29kZSBmYWlsdXJlIiBmbGFnLgotICAg
ICAgICB2b2lkIGRlY29kZShib29sIG9ubHlTaXplKTsKKyAgICAgICAgdm9pZCBkZWNvZGUoYm9v
bCBvbmx5U2l6ZSwgdW5zaWduZWQgaGFsdEF0RnJhbWUpOwogI2lmIEVOQUJMRShBUE5HKQogICAg
ICAgICB2b2lkIGluaXRGcmFtZUJ1ZmZlcihzaXplX3QgZnJhbWVJbmRleCk7CiAgICAgICAgIHZv
aWQgZnJhbWVDb21wbGV0ZSgpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>262881</attachid>
            <date>2015-10-12 01:34:15 -0700</date>
            <delta_ts>2016-01-02 14:22:30 -0800</delta_ts>
            <desc>v02.patch</desc>
            <filename>v02.patch</filename>
            <type>text/plain</type>
            <size>6263</size>
            <attacher name="Max Stepin">maxstepin</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE5MDg1MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBACisyMDE1LTA5LTEzICBNYXggU3Rl
cGluICA8bWF4c3RlcGluQGdtYWlsLmNvbT4KKworICAgICAgICBBUE5HIGRlY29kZXI6IG9ubHkg
ZGVjb2RlIHRoZSBmcmFtZXMgdXAgdG8gaGFsdEF0RnJhbWUKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NjIwNQorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgYWxyZWFkeSBjb3ZlcmVk
IGJ5IGV4aXN0aW5nIHRlc3RzLgorCisgICAgICAgICogcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMv
cG5nL1BOR0ltYWdlRGVjb2Rlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZVJlYWRl
cjo6Y2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VSZWFkZXI6OmRlY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OmZyYW1lQnVmZmVyQXRJbmRleCk6CisgICAg
ICAgIChXZWJDb3JlOjpQTkdJbWFnZURlY29kZXI6OnBuZ0NvbXBsZXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OlBOR0ltYWdlRGVjb2Rlcjo6ZGVjb2RlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9pbWFn
ZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmg6CisgICAgICAgIChXZWJDb3JlOjpQTkdJ
bWFnZURlY29kZXI6OmlzQ29tcGxldGUpOgorICAgICAgICAoV2ViQ29yZTo6UE5HSW1hZ2VEZWNv
ZGVyOjppc0NvbXBsZXRlQXRJbmRleCk6CisKIDIwMTUtMTAtMTEgIEJyaWFuIEJ1cmcgIDxiYnVy
Z0BhcHBsZS5jb20+CiAKICAgICAgICAgQWRkIG1pc3NpbmcgYnVpbHRpbnMgZmlsZXMgdG8gdGhl
IFhjb2RlIHByb2plY3RzCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNv
ZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmNwcAkocmV2aXNp
b24gMTkwODUwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5n
L1BOR0ltYWdlRGVjb2Rlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE2MSw3ICsxNjEsNyBAQCBw
dWJsaWM6CiAgICAgICAgIG1fcmVhZE9mZnNldCA9IDA7CiAgICAgfQogCi0gICAgYm9vbCBkZWNv
ZGUoY29uc3QgU2hhcmVkQnVmZmVyJiBkYXRhLCBib29sIHNpemVPbmx5KQorICAgIGJvb2wgZGVj
b2RlKGNvbnN0IFNoYXJlZEJ1ZmZlciYgZGF0YSwgYm9vbCBzaXplT25seSwgdW5zaWduZWQgaGFs
dEF0RnJhbWUpCiAgICAgewogICAgICAgICBtX2RlY29kaW5nU2l6ZU9ubHkgPSBzaXplT25seTsK
ICAgICAgICAgUE5HSW1hZ2VEZWNvZGVyKiBkZWNvZGVyID0gc3RhdGljX2Nhc3Q8UE5HSW1hZ2VE
ZWNvZGVyKj4ocG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIobV9wbmcpKTsKQEAgLTE3OCw3ICsxNzgs
NyBAQCBwdWJsaWM6CiAgICAgICAgICAgICAvLyBXZSBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHN1
cGVyY2xhc3MgaXNTaXplQXZhaWxhYmxlKCkgYmVjYXVzZSB3ZQogICAgICAgICAgICAgLy8gbWVy
ZWx5IHdhbnQgdG8gY2hlY2sgaWYgd2UndmUgbWFuYWdlZCB0byBzZXQgdGhlIHNpemUsIG5vdAog
ICAgICAgICAgICAgLy8gKHJlY3Vyc2l2ZWx5KSB0cmlnZ2VyIGFkZGl0aW9uYWwgZGVjb2Rpbmcg
aWYgd2UgaGF2ZW4ndC4KLSAgICAgICAgICAgIGlmIChzaXplT25seSA/IGRlY29kZXItPkltYWdl
RGVjb2Rlcjo6aXNTaXplQXZhaWxhYmxlKCkgOiBkZWNvZGVyLT5pc0NvbXBsZXRlKCkpCisgICAg
ICAgICAgICBpZiAoc2l6ZU9ubHkgPyBkZWNvZGVyLT5JbWFnZURlY29kZXI6OmlzU2l6ZUF2YWls
YWJsZSgpIDogZGVjb2Rlci0+aXNDb21wbGV0ZUF0SW5kZXgoaGFsdEF0RnJhbWUpKQogICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsK
QEAgLTI3NCw3ICsyNzQsNyBAQCBQTkdJbWFnZURlY29kZXI6On5QTkdJbWFnZURlY29kZXIoKQog
Ym9vbCBQTkdJbWFnZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpCiB7CiAgICAgaWYgKCFJbWFn
ZURlY29kZXI6OmlzU2l6ZUF2YWlsYWJsZSgpKQotICAgICAgICAgZGVjb2RlKHRydWUpOworICAg
ICAgICBkZWNvZGUodHJ1ZSwgMCk7CiAKICAgICByZXR1cm4gSW1hZ2VEZWNvZGVyOjppc1NpemVB
dmFpbGFibGUoKTsKIH0KQEAgLTMwOCw3ICszMDgsNyBAQCBJbWFnZUZyYW1lKiBQTkdJbWFnZURl
Y29kZXI6OmZyYW1lQnVmZmVyCiAKICAgICBJbWFnZUZyYW1lJiBmcmFtZSA9IG1fZnJhbWVCdWZm
ZXJDYWNoZVtpbmRleF07CiAgICAgaWYgKGZyYW1lLnN0YXR1cygpICE9IEltYWdlRnJhbWU6OkZy
YW1lQ29tcGxldGUpCi0gICAgICAgIGRlY29kZShmYWxzZSk7CisgICAgICAgIGRlY29kZShmYWxz
ZSwgaW5kZXgpOwogICAgIHJldHVybiAmZnJhbWU7CiB9CiAKQEAgLTY4Nyw3ICs2ODcsNyBAQCB2
b2lkIFBOR0ltYWdlRGVjb2Rlcjo6cG5nQ29tcGxldGUoKQogICAgICAgICBtX2ZyYW1lQnVmZmVy
Q2FjaGUuZmlyc3QoKS5zZXRTdGF0dXMoSW1hZ2VGcmFtZTo6RnJhbWVDb21wbGV0ZSk7CiB9CiAK
LXZvaWQgUE5HSW1hZ2VEZWNvZGVyOjpkZWNvZGUoYm9vbCBvbmx5U2l6ZSkKK3ZvaWQgUE5HSW1h
Z2VEZWNvZGVyOjpkZWNvZGUoYm9vbCBvbmx5U2l6ZSwgdW5zaWduZWQgaGFsdEF0RnJhbWUpCiB7
CiAgICAgaWYgKGZhaWxlZCgpKQogICAgICAgICByZXR1cm47CkBAIC02OTcsNyArNjk3LDcgQEAg
dm9pZCBQTkdJbWFnZURlY29kZXI6OmRlY29kZShib29sIG9ubHlTaQogCiAgICAgLy8gSWYgd2Ug
Y291bGRuJ3QgZGVjb2RlIHRoZSBpbWFnZSBidXQgd2UndmUgcmVjZWl2ZWQgYWxsIHRoZSBkYXRh
LCBkZWNvZGluZwogICAgIC8vIGhhcyBmYWlsZWQuCi0gICAgaWYgKCFtX3JlYWRlci0+ZGVjb2Rl
KCptX2RhdGEsIG9ubHlTaXplKSAmJiBpc0FsbERhdGFSZWNlaXZlZCgpKQorICAgIGlmICghbV9y
ZWFkZXItPmRlY29kZSgqbV9kYXRhLCBvbmx5U2l6ZSwgaGFsdEF0RnJhbWUpICYmIGlzQWxsRGF0
YVJlY2VpdmVkKCkpCiAgICAgICAgIHNldEZhaWxlZCgpOwogICAgIC8vIElmIHdlJ3JlIGRvbmUg
ZGVjb2RpbmcgdGhlIGltYWdlLCB3ZSBkb24ndCBuZWVkIHRoZSBQTkdJbWFnZVJlYWRlcgogICAg
IC8vIGFueW1vcmUuICAoSWYgd2UgZmFpbGVkLCB8bV9yZWFkZXJ8IGhhcyBhbHJlYWR5IGJlZW4g
Y2xlYXJlZC4pCkBAIC03NzEsNiArNzcxLDI3IEBAIHZvaWQgUE5HSW1hZ2VEZWNvZGVyOjpyZWFk
Q2h1bmtzKHBuZ191bmsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAg
IGlmIChtX2ZyYW1lQnVmZmVyQ2FjaGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtX2ZyYW1l
QnVmZmVyQ2FjaGUucmVzaXplKDEpOworICAgICAgICAgICAgbV9mcmFtZUJ1ZmZlckNhY2hlWzBd
LnNldFByZW11bHRpcGx5QWxwaGEobV9wcmVtdWx0aXBseUFscGhhKTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmIChtX2N1cnJlbnRGcmFtZSA8IG1fZnJhbWVCdWZmZXJDYWNoZS5zaXplKCkpIHsK
KyAgICAgICAgICAgIEltYWdlRnJhbWUmIGJ1ZmZlciA9IG1fZnJhbWVCdWZmZXJDYWNoZVttX2N1
cnJlbnRGcmFtZV07CisKKyAgICAgICAgICAgIGlmICghbV9kZWxheURlbm9taW5hdG9yKQorICAg
ICAgICAgICAgICAgIGJ1ZmZlci5zZXREdXJhdGlvbihtX2RlbGF5TnVtZXJhdG9yICogMTApOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXREdXJhdGlvbihtX2Rl
bGF5TnVtZXJhdG9yICogMTAwMCAvIG1fZGVsYXlEZW5vbWluYXRvcik7CisKKyAgICAgICAgICAg
IGlmIChtX2Rpc3Bvc2UgPT0gMikKKyAgICAgICAgICAgICAgICBidWZmZXIuc2V0RGlzcG9zYWxN
ZXRob2QoSW1hZ2VGcmFtZTo6RGlzcG9zZU92ZXJ3cml0ZVByZXZpb3VzKTsKKyAgICAgICAgICAg
IGVsc2UgaWYgKG1fZGlzcG9zZSA9PSAxKQorICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXREaXNw
b3NhbE1ldGhvZChJbWFnZUZyYW1lOjpEaXNwb3NlT3ZlcndyaXRlQmdjb2xvcik7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnVmZmVyLnNldERpc3Bvc2FsTWV0aG9kKEltYWdl
RnJhbWU6OkRpc3Bvc2VLZWVwKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1fZnJhbWVJbmZvID0g
dHJ1ZTsKICAgICAgICAgbV9mcmFtZUlzSGlkZGVuID0gZmFsc2U7CiAKQEAgLTkyNywxOCArOTQ4
LDYgQEAgdm9pZCBQTkdJbWFnZURlY29kZXI6OmZyYW1lQ29tcGxldGUoKQogICAgIEltYWdlRnJh
bWUmIGJ1ZmZlciA9IG1fZnJhbWVCdWZmZXJDYWNoZVttX2N1cnJlbnRGcmFtZV07CiAgICAgYnVm
ZmVyLnNldFN0YXR1cyhJbWFnZUZyYW1lOjpGcmFtZUNvbXBsZXRlKTsKIAotICAgIGlmICghbV9k
ZWxheURlbm9taW5hdG9yKQotICAgICAgICBidWZmZXIuc2V0RHVyYXRpb24obV9kZWxheU51bWVy
YXRvciAqIDEwKTsKLSAgICBlbHNlCi0gICAgICAgIGJ1ZmZlci5zZXREdXJhdGlvbihtX2RlbGF5
TnVtZXJhdG9yICogMTAwMCAvIG1fZGVsYXlEZW5vbWluYXRvcik7Ci0KLSAgICBpZiAobV9kaXNw
b3NlID09IDIpCi0gICAgICAgIGJ1ZmZlci5zZXREaXNwb3NhbE1ldGhvZChJbWFnZUZyYW1lOjpE
aXNwb3NlT3ZlcndyaXRlUHJldmlvdXMpOwotICAgIGVsc2UgaWYgKG1fZGlzcG9zZSA9PSAxKQot
ICAgICAgICBidWZmZXIuc2V0RGlzcG9zYWxNZXRob2QoSW1hZ2VGcmFtZTo6RGlzcG9zZU92ZXJ3
cml0ZUJnY29sb3IpOwotICAgIGVsc2UKLSAgICAgICAgYnVmZmVyLnNldERpc3Bvc2FsTWV0aG9k
KEltYWdlRnJhbWU6OkRpc3Bvc2VLZWVwKTsKLQogICAgIHBuZ19ieXRlcCBpbnRlcmxhY2VCdWZm
ZXIgPSBtX3JlYWRlci0+aW50ZXJsYWNlQnVmZmVyKCk7CiAKICAgICBpZiAobV9jdXJyZW50RnJh
bWUgJiYgaW50ZXJsYWNlQnVmZmVyKSB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9p
bWFnZS1kZWNvZGVycy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcG5nL1BOR0ltYWdlRGVjb2Rlci5oCShy
ZXZpc2lvbiAxOTA4NTApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVy
cy9wbmcvUE5HSW1hZ2VEZWNvZGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTgwLDExICs4MCwxNiBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAg
fQogCisgICAgICAgIGJvb2wgaXNDb21wbGV0ZUF0SW5kZXgoc2l6ZV90IGluZGV4KQorICAgICAg
ICB7CisgICAgICAgICAgICByZXR1cm4gKGluZGV4IDwgbV9mcmFtZUJ1ZmZlckNhY2hlLnNpemUo
KSAmJiBtX2ZyYW1lQnVmZmVyQ2FjaGVbaW5kZXhdLnN0YXR1cygpID09IEltYWdlRnJhbWU6OkZy
YW1lQ29tcGxldGUpOworICAgICAgICB9CisKICAgICBwcml2YXRlOgogICAgICAgICAvLyBEZWNv
ZGVzIHRoZSBpbWFnZS4gIElmIHxvbmx5U2l6ZXwgaXMgdHJ1ZSwgc3RvcHMgZGVjb2RpbmcgYWZ0
ZXIKICAgICAgICAgLy8gY2FsY3VsYXRpbmcgdGhlIGltYWdlIHNpemUuICBJZiBkZWNvZGluZyBm
YWlscyBidXQgdGhlcmUgaXMgbm8gbW9yZQogICAgICAgICAvLyBkYXRhIGNvbWluZywgc2V0cyB0
aGUgImRlY29kZSBmYWlsdXJlIiBmbGFnLgotICAgICAgICB2b2lkIGRlY29kZShib29sIG9ubHlT
aXplKTsKKyAgICAgICAgdm9pZCBkZWNvZGUoYm9vbCBvbmx5U2l6ZSwgdW5zaWduZWQgaGFsdEF0
RnJhbWUpOwogI2lmIEVOQUJMRShBUE5HKQogICAgICAgICB2b2lkIGluaXRGcmFtZUJ1ZmZlcihz
aXplX3QgZnJhbWVJbmRleCk7CiAgICAgICAgIHZvaWQgZnJhbWVDb21wbGV0ZSgpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>