<?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>180020</bug_id>
          
          <creation_ts>2017-11-26 15:44:10 -0800</creation_ts>
          <short_desc>Optimize FEMorphology</short_desc>
          <delta_ts>2017-12-06 16:29:38 -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>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Fraser (smfr)">simon.fraser</reporter>
          <assigned_to name="Simon Fraser (smfr)">simon.fraser</assigned_to>
          <cc>dino</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>sam</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1374760</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2017-11-26 15:44:10 -0800</bug_when>
    <thetext>Optimize FEMorphology</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1374761</commentid>
    <comment_count>1</comment_count>
      <attachid>327591</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2017-11-26 15:52:21 -0800</bug_when>
    <thetext>Created attachment 327591
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1374762</commentid>
    <comment_count>2</comment_count>
      <attachid>327591</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-11-26 16:34:25 -0800</bug_when>
    <thetext>Comment on attachment 327591
Patch

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

&gt; Source/WebCore/ChangeLog:16
&gt; +        This is about a 4x speedup before the parallel jobs tweaking. With fixed parallelism,
&gt; +        a 200x200 filter went from 15ms to about 1ms with these changes.

Noice.

&gt; Source/WebCore/platform/graphics/ColorUtilities.h:100
&gt; +    static ColorComponents fromRGBA(unsigned pixel)
&gt; +    {
&gt; +        return ColorComponents((pixel &gt;&gt; 24) &amp; 0xFF, (pixel &gt;&gt; 16) &amp; 0xFF, (pixel &gt;&gt; 8) &amp; 0xFF, pixel &amp; 0xFF);
&gt; +    }

In other places, we represent a pixel value like this with the RGBA class from Color.h.  Would be good to be consistent if it makes sense.

&gt; Source/WebCore/platform/graphics/ColorUtilities.h:113
&gt; +    unsigned toRGBA() const
&gt; +    {
&gt; +        return components[0] &lt;&lt; 24 | components[1] &lt;&lt; 16 | components[2] &lt;&lt; 8 | components[3];
&gt; +    }

Same as above.

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:98
&gt; +ALWAYS_INLINE ColorComponents minOrMax(ColorComponents a, ColorComponents b)
&gt;  {
&gt; -    return (y * width + x) * 4 + colorChannel;
&gt; +    if (type == FEMORPHOLOGY_OPERATOR_ERODE)
&gt; +        return perComponentMin(a, b);
&gt; +
&gt; +    return perComponentMax(a, b);

perComponentMin/perComponentMax both take const ColorComponents&amp;, but this takes it by value. Any idea which produces better code?

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:104
&gt; +    ColorComponents extremum = ColorComponents::fromRGBA(*reinterpret_cast&lt;const unsigned*&gt;(srcPixelArray.data() + pixelArrayIndex(x, yStart, width)));

Could use auto here.

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:107
&gt; +        ColorComponents pixel = ColorComponents::fromRGBA(*reinterpret_cast&lt;const unsigned*&gt;(srcPixelArray.data() + pixelArrayIndex(x, y, width)));

Auto?

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:126
&gt; +    ColorComponents extremum = kernel[0];

auto?

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:144
&gt; +    const Uint8ClampedArray&amp; srcPixelArray = *paintingData.srcPixelArray;
&gt; +    Uint8ClampedArray&amp; dstPixelArray = *paintingData.dstPixelArray;

auto?

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:155
&gt; +    ColumnExtrema extrema;
&gt; +    extrema.reserveCapacity(2 * radiusX + 1);

You can use extrema.reserveInitialCapacity() here.

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:161
&gt; +        extrema.resize(0);

This should be extrema.shrink(0);

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:173
&gt; +            if (x &gt; radiusX)
&gt; +                extrema.remove(0);

I can&apos;t tell how common this is. But in many cases where we need to remove from the beginning, a Deque can be be the better choice.

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:188
&gt; +    // Empirically, runtime is approximately linear over reasonable kernel sizes with a slope of about 0.65.

Might want to document how you determined this empirical data.

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:191
&gt; +    static const int minimalArea = (160 * 160); // Empirical data limit for parallel jobs

Same.

&gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:195
&gt;          ParallelJobs&lt;PlatformApplyParameters&gt; parallelJobs(&amp;WebCore::FEMorphology::platformApplyWorker, optimalThreadNumber);

No strictly related to this patch, but I checked what we were using for ParallelJobs, saw that ParallelJobsLibdispatch (which I assume we are using) uses dispatch_apply with a global queue. I believe using DISPATCH_APPLY_AUTO for the queue will work better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1374929</commentid>
    <comment_count>3</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2017-11-27 08:20:03 -0800</bug_when>
    <thetext>(In reply to Sam Weinig from comment #2)
&gt; Comment on attachment 327591 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=327591&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:16
&gt; &gt; +        This is about a 4x speedup before the parallel jobs tweaking. With fixed parallelism,
&gt; &gt; +        a 200x200 filter went from 15ms to about 1ms with these changes.
&gt; 
&gt; Noice.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/ColorUtilities.h:100
&gt; &gt; +    static ColorComponents fromRGBA(unsigned pixel)
&gt; &gt; +    {
&gt; &gt; +        return ColorComponents((pixel &gt;&gt; 24) &amp; 0xFF, (pixel &gt;&gt; 16) &amp; 0xFF, (pixel &gt;&gt; 8) &amp; 0xFF, pixel &amp; 0xFF);
&gt; &gt; +    }
&gt; 
&gt; In other places, we represent a pixel value like this with the RGBA class
&gt; from Color.h.  Would be good to be consistent if it makes sense.

Sadly the layout of RGBA belies its name. It actually represents ARGB:

inline uint8_t RGBA::alpha() const
{
    return m_integer &gt;&gt; 24;
}

&gt; &gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:98
&gt; &gt; +ALWAYS_INLINE ColorComponents minOrMax(ColorComponents a, ColorComponents b)
&gt; &gt;  {
&gt; &gt; -    return (y * width + x) * 4 + colorChannel;
&gt; &gt; +    if (type == FEMORPHOLOGY_OPERATOR_ERODE)
&gt; &gt; +        return perComponentMin(a, b);
&gt; &gt; +
&gt; &gt; +    return perComponentMax(a, b);
&gt; 
&gt; perComponentMin/perComponentMax both take const ColorComponents&amp;, but this
&gt; takes it by value. Any idea which produces better code?

Will see if there&apos;s any perf difference.

&gt; &gt; Source/WebCore/platform/graphics/filters/FEMorphology.cpp:195
&gt; &gt;          ParallelJobs&lt;PlatformApplyParameters&gt; parallelJobs(&amp;WebCore::FEMorphology::platformApplyWorker, optimalThreadNumber);
&gt; 
&gt; No strictly related to this patch, but I checked what we were using for
&gt; ParallelJobs, saw that ParallelJobsLibdispatch (which I assume we are using)
&gt; uses dispatch_apply with a global queue. I believe using DISPATCH_APPLY_AUTO
&gt; for the queue will work better.

Noted in bug 180024.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1374934</commentid>
    <comment_count>4</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2017-11-27 08:30:00 -0800</bug_when>
    <thetext>(In reply to Sam Weinig from comment #2)

&gt; perComponentMin/perComponentMax both take const ColorComponents&amp;, but this
&gt; takes it by value. Any idea which produces better code?

Passing by value was slower.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1374943</commentid>
    <comment_count>5</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2017-11-27 08:38:05 -0800</bug_when>
    <thetext>https://trac.webkit.org/changeset/225172/webkit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1378901</commentid>
    <comment_count>6</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-12-06 16:29:37 -0800</bug_when>
    <thetext>&lt;rdar://problem/35896093&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1378902</commentid>
    <comment_count>7</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-12-06 16:29:38 -0800</bug_when>
    <thetext>&lt;rdar://problem/35896095&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>327591</attachid>
            <date>2017-11-26 15:52:21 -0800</date>
            <delta_ts>2017-11-26 16:34:25 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-180020-20171126155220.patch</filename>
            <type>text/plain</type>
            <size>17801</size>
            <attacher name="Simon Fraser (smfr)">simon.fraser</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjI1MTM3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGNkZGVjMzUxMjhiYmIz
NjE2ODY4YTlhNTk2NTQzNTUyNjFhOTFiMC4uZWEyOTQxOWRlZjY5ZTRiYzJjNDY2YTgyN2U0MWJl
ZDAxMmM5MWYwMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQwIEBACisyMDE3LTExLTI2ICBTaW1v
biBGcmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBwbGUuY29tPgorCisgICAgICAgIE9wdGltaXplIEZF
TW9ycGhvbG9neQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTgwMDIwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgVXNlIGNvbnN0IFBhaW50aW5nRGF0YSYuCisgICAgICAgIENvbXB1dGUgYWxsIGNvbXBvbmVu
dHMgYXQgb25jZS4KKyAgICAgICAgQXZvaWQgVmVjdG9yPD4gY2FwYWNpdHkgY2hhbmdlcyBkdXJp
bmcgdGhlIHBpeGVsIGxvb3AuCisgICAgICAgIFR3ZWFrIHRoZSBwYXJhbGxlbCBqb2JzIHNjYWxp
bmcuCisgICAgICAgIFRlbXBsYXRpemUgdGhlIHRoZSBpbm5lciBsb29wIGZ1bmN0aW9ucyB0aGF0
IGNvbXB1dGUgbWluIG9yIG1heCBiYXNlZAorICAgICAgICBvbiB0aGUgZmlsdGVyIHR5cGUgdG8g
YXZvaWQgY29uZGl0aW9uYWxzIGluIHRpZ2h0IGxvb3BzLgorICAgICAgICAKKyAgICAgICAgVGhp
cyBpcyBhYm91dCBhIDR4IHNwZWVkdXAgYmVmb3JlIHRoZSBwYXJhbGxlbCBqb2JzIHR3ZWFraW5n
LiBXaXRoIGZpeGVkIHBhcmFsbGVsaXNtLAorICAgICAgICBhIDIwMHgyMDAgZmlsdGVyIHdlbnQg
ZnJvbSAxNW1zIHRvIGFib3V0IDFtcyB3aXRoIHRoZXNlIGNoYW5nZXMuCisKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9Db2xvclV0aWxpdGllcy5oOgorICAgICAgICAoV2ViQ29yZTo6Q29s
b3JDb21wb25lbnRzOjpmcm9tUkdCQSk6CisgICAgICAgIChXZWJDb3JlOjpDb2xvckNvbXBvbmVu
dHM6OnRvUkdCQSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpwZXJDb21wb25lbnRNYXgpOgor
ICAgICAgICAoV2ViQ29yZTo6cGVyQ29tcG9uZW50TWluKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9maWx0ZXJzL0ZFQ29sb3JNYXRyaXguY3BwOgorICAgICAgICAoV2ViQ29yZTo6RkVD
b2xvck1hdHJpeDo6cGxhdGZvcm1BcHBseVNvZnR3YXJlKTogUmVtb3ZlIHNvbWUgb2xkIHBlcmYg
bG9nZ2luZyBjb2RlLgorICAgICAgICBUaW1pbmdTY29wZSBub3cgZG9lcyBzb21ldGhpbmcgc2lt
aWxhci4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFTW9ycGhvbG9neS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpwaXhlbEFycmF5SW5kZXgpOgorICAgICAgICAoV2ViQ29y
ZTo6bWluT3JNYXgpOgorICAgICAgICAoV2ViQ29yZTo6Y29sdW1uRXh0cmVtdW0pOgorICAgICAg
ICAoV2ViQ29yZTo6a2VybmVsRXh0cmVtdW0pOgorICAgICAgICAoV2ViQ29yZTo6RkVNb3JwaG9s
b2d5OjpwbGF0Zm9ybUFwcGx5R2VuZXJpYyk6CisgICAgICAgIChXZWJDb3JlOjpGRU1vcnBob2xv
Z3k6OnBsYXRmb3JtQXBwbHlXb3JrZXIpOgorICAgICAgICAoV2ViQ29yZTo6RkVNb3JwaG9sb2d5
OjpwbGF0Zm9ybUFwcGx5KToKKyAgICAgICAgKFdlYkNvcmU6OkZFTW9ycGhvbG9neTo6cGxhdGZv
cm1BcHBseVNvZnR3YXJlKToKKyAgICAgICAgKFdlYkNvcmU6OnNob3VsZFN1cGVyc2VkZUV4dHJl
bXVtKTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFTW9y
cGhvbG9neS5oOgorCiAyMDE3LTExLTI0ICBTaW1vbiBGcmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBw
bGUuY29tPgogCiAgICAgICAgIFVzZSBtb3JlIFVpbnQ4Q2xhbXBlZEFycmF5JiBhbmQgY29uc3Ru
ZXNzIGluIGZpbHRlciBhbmQgaW1hZ2UgYnVmZmVyIGNvZGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yVXRpbGl0aWVzLmggYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvclV0aWxpdGllcy5oCmluZGV4IDk4MThkMjEwM2IxMzEz
NTNmMmZjZTYwM2FhYjk5YmNhYWYzYTE2NzcuLmIxZDQxZDU3YTNjYzE0MzM5NzMyMzM1Y2ZmNTRk
NTExYTA5ZGVlZGYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0NvbG9yVXRpbGl0aWVzLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Q29sb3JVdGlsaXRpZXMuaApAQCAtOTMsNyArOTMsMTIgQEAgc3RydWN0IEZsb2F0Q29tcG9uZW50
cyB7CiAKIHN0cnVjdCBDb2xvckNvbXBvbmVudHMgewogICAgIENvbG9yQ29tcG9uZW50cyhjb25z
dCBGbG9hdENvbXBvbmVudHMmKTsKLQorICAgIAorICAgIHN0YXRpYyBDb2xvckNvbXBvbmVudHMg
ZnJvbVJHQkEodW5zaWduZWQgcGl4ZWwpCisgICAgeworICAgICAgICByZXR1cm4gQ29sb3JDb21w
b25lbnRzKChwaXhlbCA+PiAyNCkgJiAweEZGLCAocGl4ZWwgPj4gMTYpICYgMHhGRiwgKHBpeGVs
ID4+IDgpICYgMHhGRiwgcGl4ZWwgJiAweEZGKTsKKyAgICB9CisgICAgCiAgICAgQ29sb3JDb21w
b25lbnRzKHVpbnQ4X3QgYSA9IDAsIHVpbnQ4X3QgYiA9IDAsIHVpbnQ4X3QgYyA9IDAsIHVpbnQ4
X3QgZCA9IDApCiAgICAgewogICAgICAgICBjb21wb25lbnRzWzBdID0gYTsKQEAgLTEwMSw5ICsx
MDYsMzUgQEAgc3RydWN0IENvbG9yQ29tcG9uZW50cyB7CiAgICAgICAgIGNvbXBvbmVudHNbMl0g
PSBjOwogICAgICAgICBjb21wb25lbnRzWzNdID0gZDsKICAgICB9CisgICAgCisgICAgdW5zaWdu
ZWQgdG9SR0JBKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBjb21wb25lbnRzWzBdIDw8
IDI0IHwgY29tcG9uZW50c1sxXSA8PCAxNiB8IGNvbXBvbmVudHNbMl0gPDwgOCB8IGNvbXBvbmVu
dHNbM107CisgICAgfQorCiAgICAgdWludDhfdCBjb21wb25lbnRzWzRdIHsgfTsKIH07CiAKK2lu
bGluZSBDb2xvckNvbXBvbmVudHMgcGVyQ29tcG9uZW50TWF4KGNvbnN0IENvbG9yQ29tcG9uZW50
cyYgYSwgY29uc3QgQ29sb3JDb21wb25lbnRzJiBiKQoreworICAgIHJldHVybiB7CisgICAgICAg
IHN0ZDo6bWF4KGEuY29tcG9uZW50c1swXSwgYi5jb21wb25lbnRzWzBdKSwKKyAgICAgICAgc3Rk
OjptYXgoYS5jb21wb25lbnRzWzFdLCBiLmNvbXBvbmVudHNbMV0pLAorICAgICAgICBzdGQ6Om1h
eChhLmNvbXBvbmVudHNbMl0sIGIuY29tcG9uZW50c1syXSksCisgICAgICAgIHN0ZDo6bWF4KGEu
Y29tcG9uZW50c1szXSwgYi5jb21wb25lbnRzWzNdKQorICAgIH07Cit9CisKK2lubGluZSBDb2xv
ckNvbXBvbmVudHMgcGVyQ29tcG9uZW50TWluKGNvbnN0IENvbG9yQ29tcG9uZW50cyYgYSwgY29u
c3QgQ29sb3JDb21wb25lbnRzJiBiKQoreworICAgIHJldHVybiB7CisgICAgICAgIHN0ZDo6bWlu
KGEuY29tcG9uZW50c1swXSwgYi5jb21wb25lbnRzWzBdKSwKKyAgICAgICAgc3RkOjptaW4oYS5j
b21wb25lbnRzWzFdLCBiLmNvbXBvbmVudHNbMV0pLAorICAgICAgICBzdGQ6Om1pbihhLmNvbXBv
bmVudHNbMl0sIGIuY29tcG9uZW50c1syXSksCisgICAgICAgIHN0ZDo6bWluKGEuY29tcG9uZW50
c1szXSwgYi5jb21wb25lbnRzWzNdKQorICAgIH07Cit9CisKIGlubGluZSB1aW50OF90IGNsYW1w
ZWRDb2xvckNvbXBvbmVudChmbG9hdCBmKQogewogICAgIC8vIFNlZSBhbHNvIGNvbG9yRmxvYXRU
b1JHQkFCeXRlKCkuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9maWx0ZXJzL0ZFQ29sb3JNYXRyaXguY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZmlsdGVycy9GRUNvbG9yTWF0cml4LmNwcAppbmRleCBiYzM1Mzc1ODg1OTg0ZWZjNWY4
ODY4NDAyZDcyOTg0NGE3MDZjYTBhLi42ZmYyODk0NzVmZTNhN2VlOWE0YjhjYWQyOGZiMDUwYzJh
ZGM0OTMwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0
ZXJzL0ZFQ29sb3JNYXRyaXguY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2ZpbHRlcnMvRkVDb2xvck1hdHJpeC5jcHAKQEAgLTI1LDE3ICsyNSwxNCBAQAogCiAjaW5j
bHVkZSAiRmlsdGVyLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSA8
d3RmL3RleHQvVGV4dFN0cmVhbS5oPgotCiAjaW5jbHVkZSA8cnVudGltZS9VaW50OENsYW1wZWRB
cnJheS5oPgogI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL3RleHQv
VGV4dFN0cmVhbS5oPgogCiAjaWYgVVNFKEFDQ0VMRVJBVEUpCiAjaW5jbHVkZSA8QWNjZWxlcmF0
ZS9BY2NlbGVyYXRlLmg+CiAjZW5kaWYKIAotI2RlZmluZSBQUklOVF9GSUxURVJfUEVSRk9STUFO
Q0UgMAotCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIEZFQ29sb3JNYXRyaXg6OkZFQ29sb3JNYXRy
aXgoRmlsdGVyJiBmaWx0ZXIsIENvbG9yTWF0cml4VHlwZSB0eXBlLCBjb25zdCBWZWN0b3I8Zmxv
YXQ+JiB2YWx1ZXMpCkBAIC0yODMsMTAgKzI4MCw2IEBAIHZvaWQgRkVDb2xvck1hdHJpeDo6cGxh
dGZvcm1BcHBseVNvZnR3YXJlKCkKICAgICBpZiAoIXJlc3VsdEltYWdlKQogICAgICAgICByZXR1
cm47CiAKLSNpZiBQUklOVF9GSUxURVJfUEVSRk9STUFOQ0UKLSAgICBNb25vdG9uaWNUaW1lIHN0
YXJ0VGltZSA9IE1vbm90b25pY1RpbWU6Om5vdygpOwotI2VuZGlmCi0KICAgICBJbWFnZUJ1ZmZl
ciogaW5CdWZmZXIgPSBpbi0+aW1hZ2VCdWZmZXJSZXN1bHQoKTsKICAgICBpZiAoaW5CdWZmZXIp
CiAgICAgICAgIHJlc3VsdEltYWdlLT5jb250ZXh0KCkuZHJhd0ltYWdlQnVmZmVyKCppbkJ1ZmZl
ciwgZHJhd2luZ1JlZ2lvbk9mSW5wdXRJbWFnZShpbi0+YWJzb2x1dGVQYWludFJlY3QoKSkpOwpA
QCAtMzE4LDIwICszMTEsNiBAQCB2b2lkIEZFQ29sb3JNYXRyaXg6OnBsYXRmb3JtQXBwbHlTb2Z0
d2FyZSgpCiAgICAgfQogCiAgICAgcmVzdWx0SW1hZ2UtPnB1dEJ5dGVBcnJheShVbm11bHRpcGxp
ZWQsICpwaXhlbEFycmF5LCBpbWFnZVJlY3Quc2l6ZSgpLCBpbWFnZVJlY3QsIEludFBvaW50KCkp
OwotCi0jaWYgUFJJTlRfRklMVEVSX1BFUkZPUk1BTkNFCi0gICAgTW9ub3RvbmljVGltZSBlbmRU
aW1lID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0gICAgU2Vjb25kcyBkdXJhdGlvbiA9IGVuZFRp
bWUgLSBzdGFydFRpbWU7Ci0gICAgdW5zaWduZWQgcGl4ZWxDb3VudCA9IGltYWdlUmVjdC53aWR0
aCgpICogaW1hZ2VSZWN0LmhlaWdodCgpOwotICAgIAotICAgIHN0YXRpYyBkb3VibGUgdG90YWxN
ZWdhcGl4ZWxzOwotICAgIHRvdGFsTWVnYXBpeGVscyArPSAoZG91YmxlKXBpeGVsQ291bnQgLyAx
MDQ4NTc2LjA7Ci0gICAgCi0gICAgc3RhdGljIFNlY29uZHMgdG90YWxUaW1lOwotICAgIHRvdGFs
VGltZSArPSBkdXJhdGlvbjsKLSAgICAKLSAgICBXVEZMb2dBbHdheXMoIkZFQ29sb3JNYXRyaXg6
OnBsYXRmb3JtQXBwbHlTb2Z0d2FyZSAoJWR4JWQpIHRvb2sgJS40Zm1zIChhdmUgJS40Zm1zL21w
KSIsIGltYWdlUmVjdC53aWR0aCgpLCBpbWFnZVJlY3QuaGVpZ2h0KCksIGR1cmF0aW9uLm1pbGxp
c2Vjb25kcygpLCB0b3RhbFRpbWUubWlsbGlzZWNvbmRzKCkgLyB0b3RhbE1lZ2FwaXhlbHMpOwot
I2VuZGlmCiB9CiAKIHN0YXRpYyBUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mIHRz
LCBjb25zdCBDb2xvck1hdHJpeFR5cGUmIHR5cGUpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFTW9ycGhvbG9neS5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZFTW9ycGhvbG9neS5jcHAKaW5kZXggYTUy
MDNmMDkxYThjM2Q3NzU5YWY3MmUwNjJjOTEwYjcwNThjNjZiZS4uMmIyMjZlNjdhMmQ4MmMyYWIw
YTNmZTkwY2ZjMjhjOTAwOTBlOWZjMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvZmlsdGVycy9GRU1vcnBob2xvZ3kuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRkVNb3JwaG9sb2d5LmNwcApAQCAtNCw2ICs0LDcg
QEAKICAqIENvcHlyaWdodCAoQykgMjAwNSBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgog
ICogQ29weXJpZ2h0IChDKSAyMDA5IERpcmsgU2NodWx6ZSA8a3JpdEB3ZWJraXQub3JnPgogICog
Q29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSBBcHBsZSBJbmMuIDIwMTcuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTI0LDEyICsyNSwxMiBAQAogI2luY2x1
ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkZFTW9ycGhvbG9neS5oIgogCisjaW5jbHVkZSAiQ29s
b3JVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJGaWx0ZXIuaCIKLSNpbmNsdWRlIDx3dGYvdGV4dC9U
ZXh0U3RyZWFtLmg+Ci0KICNpbmNsdWRlIDxydW50aW1lL1VpbnQ4Q2xhbXBlZEFycmF5Lmg+CiAj
aW5jbHVkZSA8d3RmL1BhcmFsbGVsSm9icy5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNp
bmNsdWRlIDx3dGYvdGV4dC9UZXh0U3RyZWFtLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApA
QCAtODMsOTggKzg0LDEyMSBAQCB2b2lkIEZFTW9ycGhvbG9neTo6ZGV0ZXJtaW5lQWJzb2x1dGVQ
YWludFJlY3QoKQogICAgIHNldEFic29sdXRlUGFpbnRSZWN0KGVuY2xvc2luZ0ludFJlY3QocGFp
bnRSZWN0KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRTdXBlcnNlZGVFeHRyZW11
bSh1bnNpZ25lZCBjaGFyIG5ld1ZhbHVlLCB1bnNpZ25lZCBjaGFyIGN1cnJlbnRWYWx1ZSwgTW9y
cGhvbG9neU9wZXJhdG9yVHlwZSB0eXBlKQorc3RhdGljIGlubGluZSBpbnQgcGl4ZWxBcnJheUlu
ZGV4KGludCB4LCBpbnQgeSwgaW50IHdpZHRoKQogewotICAgIHJldHVybiAodHlwZSA9PSBGRU1P
UlBIT0xPR1lfT1BFUkFUT1JfRVJPREUgJiYgbmV3VmFsdWUgPCBjdXJyZW50VmFsdWUpCi0gICAg
ICAgIHx8ICh0eXBlID09IEZFTU9SUEhPTE9HWV9PUEVSQVRPUl9ESUxBVEUgJiYgbmV3VmFsdWUg
PiBjdXJyZW50VmFsdWUpOworICAgIHJldHVybiAoeSAqIHdpZHRoICsgeCkgKiA0OwogfQogCi1z
dGF0aWMgaW5saW5lIGludCBwaXhlbEFycmF5SW5kZXgoaW50IHgsIGludCB5LCBpbnQgd2lkdGgs
IGludCBjb2xvckNoYW5uZWwpCit0ZW1wbGF0ZTxNb3JwaG9sb2d5T3BlcmF0b3JUeXBlIHR5cGU+
CitBTFdBWVNfSU5MSU5FIENvbG9yQ29tcG9uZW50cyBtaW5Pck1heChDb2xvckNvbXBvbmVudHMg
YSwgQ29sb3JDb21wb25lbnRzIGIpCiB7Ci0gICAgcmV0dXJuICh5ICogd2lkdGggKyB4KSAqIDQg
KyBjb2xvckNoYW5uZWw7CisgICAgaWYgKHR5cGUgPT0gRkVNT1JQSE9MT0dZX09QRVJBVE9SX0VS
T0RFKQorICAgICAgICByZXR1cm4gcGVyQ29tcG9uZW50TWluKGEsIGIpOworCisgICAgcmV0dXJu
IHBlckNvbXBvbmVudE1heChhLCBiKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFy
IGNvbHVtbkV4dHJlbXVtKGNvbnN0IFVpbnQ4Q2xhbXBlZEFycmF5JiBzcmNQaXhlbEFycmF5LCBp
bnQgeCwgaW50IHlTdGFydCwgaW50IHlFbmQsIGludCB3aWR0aCwgdW5zaWduZWQgY29sb3JDaGFu
bmVsLCBNb3JwaG9sb2d5T3BlcmF0b3JUeXBlIHR5cGUpCit0ZW1wbGF0ZTxNb3JwaG9sb2d5T3Bl
cmF0b3JUeXBlIHR5cGU+CitBTFdBWVNfSU5MSU5FIENvbG9yQ29tcG9uZW50cyBjb2x1bW5FeHRy
ZW11bShjb25zdCBVaW50OENsYW1wZWRBcnJheSYgc3JjUGl4ZWxBcnJheSwgaW50IHgsIGludCB5
U3RhcnQsIGludCB5RW5kLCBpbnQgd2lkdGgpCiB7Ci0gICAgdW5zaWduZWQgY2hhciBleHRyZW11
bSA9IHNyY1BpeGVsQXJyYXkuaXRlbShwaXhlbEFycmF5SW5kZXgoeCwgeVN0YXJ0LCB3aWR0aCwg
Y29sb3JDaGFubmVsKSk7CisgICAgQ29sb3JDb21wb25lbnRzIGV4dHJlbXVtID0gQ29sb3JDb21w
b25lbnRzOjpmcm9tUkdCQSgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCo+KHNyY1Bp
eGVsQXJyYXkuZGF0YSgpICsgcGl4ZWxBcnJheUluZGV4KHgsIHlTdGFydCwgd2lkdGgpKSk7CisK
ICAgICBmb3IgKGludCB5ID0geVN0YXJ0ICsgMTsgeSA8IHlFbmQ7ICsreSkgewotICAgICAgICB1
bnNpZ25lZCBjaGFyIHBpeGVsID0gc3JjUGl4ZWxBcnJheS5pdGVtKHBpeGVsQXJyYXlJbmRleCh4
LCB5LCB3aWR0aCwgY29sb3JDaGFubmVsKSk7Ci0gICAgICAgIGlmIChzaG91bGRTdXBlcnNlZGVF
eHRyZW11bShwaXhlbCwgZXh0cmVtdW0sIHR5cGUpKQotICAgICAgICAgICAgZXh0cmVtdW0gPSBw
aXhlbDsKKyAgICAgICAgQ29sb3JDb21wb25lbnRzIHBpeGVsID0gQ29sb3JDb21wb25lbnRzOjpm
cm9tUkdCQSgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCo+KHNyY1BpeGVsQXJyYXku
ZGF0YSgpICsgcGl4ZWxBcnJheUluZGV4KHgsIHksIHdpZHRoKSkpOworICAgICAgICBleHRyZW11
bSA9IG1pbk9yTWF4PHR5cGU+KGV4dHJlbXVtLCBwaXhlbCk7CiAgICAgfQogICAgIHJldHVybiBl
eHRyZW11bTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGtlcm5lbEV4dHJlbXVt
KGNvbnN0IFZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYga2VybmVsLCBNb3JwaG9sb2d5T3BlcmF0b3JU
eXBlIHR5cGUpCitBTFdBWVNfSU5MSU5FIENvbG9yQ29tcG9uZW50cyBjb2x1bW5FeHRyZW11bShj
b25zdCBVaW50OENsYW1wZWRBcnJheSYgc3JjUGl4ZWxBcnJheSwgaW50IHgsIGludCB5U3RhcnQs
IGludCB5RW5kLCBpbnQgd2lkdGgsIE1vcnBob2xvZ3lPcGVyYXRvclR5cGUgdHlwZSkKIHsKLSAg
ICBWZWN0b3I8dW5zaWduZWQgY2hhcj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBrZXJuZWwuYmVn
aW4oKTsKLSAgICB1bnNpZ25lZCBjaGFyIGV4dHJlbXVtID0gKml0ZXI7Ci0gICAgZm9yIChWZWN0
b3I8dW5zaWduZWQgY2hhcj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGtlcm5lbC5lbmQoKTsgKytp
dGVyICE9IGVuZDsgKSB7Ci0gICAgICAgIGlmIChzaG91bGRTdXBlcnNlZGVFeHRyZW11bSgqaXRl
ciwgZXh0cmVtdW0sIHR5cGUpKQotICAgICAgICAgICAgZXh0cmVtdW0gPSAqaXRlcjsKLSAgICB9
CisgICAgaWYgKHR5cGUgPT0gRkVNT1JQSE9MT0dZX09QRVJBVE9SX0VST0RFKQorICAgICAgICBy
ZXR1cm4gY29sdW1uRXh0cmVtdW08RkVNT1JQSE9MT0dZX09QRVJBVE9SX0VST0RFPihzcmNQaXhl
bEFycmF5LCB4LCB5U3RhcnQsIHlFbmQsIHdpZHRoKTsKKworICAgIHJldHVybiBjb2x1bW5FeHRy
ZW11bTxGRU1PUlBIT0xPR1lfT1BFUkFUT1JfRElMQVRFPihzcmNQaXhlbEFycmF5LCB4LCB5U3Rh
cnQsIHlFbmQsIHdpZHRoKTsKK30KKwordXNpbmcgQ29sdW1uRXh0cmVtYSA9IFZlY3RvcjxDb2xv
ckNvbXBvbmVudHMsIDE2PjsKKwordGVtcGxhdGU8TW9ycGhvbG9neU9wZXJhdG9yVHlwZSB0eXBl
PgorQUxXQVlTX0lOTElORSBDb2xvckNvbXBvbmVudHMga2VybmVsRXh0cmVtdW0oY29uc3QgQ29s
dW1uRXh0cmVtYSYga2VybmVsKQoreworICAgIENvbG9yQ29tcG9uZW50cyBleHRyZW11bSA9IGtl
cm5lbFswXTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGtlcm5lbC5zaXplKCk7ICsraSkK
KyAgICAgICAgZXh0cmVtdW0gPSBtaW5Pck1heDx0eXBlPihleHRyZW11bSwga2VybmVsW2ldKTsK
KwogICAgIHJldHVybiBleHRyZW11bTsKIH0KIAotdm9pZCBGRU1vcnBob2xvZ3k6OnBsYXRmb3Jt
QXBwbHlHZW5lcmljKFBhaW50aW5nRGF0YSogcGFpbnRpbmdEYXRhLCBpbnQgeVN0YXJ0LCBpbnQg
eUVuZCkKK0FMV0FZU19JTkxJTkUgQ29sb3JDb21wb25lbnRzIGtlcm5lbEV4dHJlbXVtKGNvbnN0
IENvbHVtbkV4dHJlbWEmIGtlcm5lbCwgTW9ycGhvbG9neU9wZXJhdG9yVHlwZSB0eXBlKQogewot
ICAgIGNvbnN0IFVpbnQ4Q2xhbXBlZEFycmF5JiBzcmNQaXhlbEFycmF5ID0gKnBhaW50aW5nRGF0
YS0+c3JjUGl4ZWxBcnJheTsKLSAgICBVaW50OENsYW1wZWRBcnJheSYgZHN0UGl4ZWxBcnJheSA9
ICpwYWludGluZ0RhdGEtPmRzdFBpeGVsQXJyYXk7Ci0gICAgY29uc3QgaW50IHJhZGl1c1ggPSBw
YWludGluZ0RhdGEtPnJhZGl1c1g7Ci0gICAgY29uc3QgaW50IHJhZGl1c1kgPSBwYWludGluZ0Rh
dGEtPnJhZGl1c1k7Ci0gICAgY29uc3QgaW50IHdpZHRoID0gcGFpbnRpbmdEYXRhLT53aWR0aDsK
LSAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcGFpbnRpbmdEYXRhLT5oZWlnaHQ7CisgICAgaWYgKHR5
cGUgPT0gRkVNT1JQSE9MT0dZX09QRVJBVE9SX0VST0RFKQorICAgICAgICByZXR1cm4ga2VybmVs
RXh0cmVtdW08RkVNT1JQSE9MT0dZX09QRVJBVE9SX0VST0RFPihrZXJuZWwpOworCisgICAgcmV0
dXJuIGtlcm5lbEV4dHJlbXVtPEZFTU9SUEhPTE9HWV9PUEVSQVRPUl9ESUxBVEU+KGtlcm5lbCk7
Cit9CisKK3ZvaWQgRkVNb3JwaG9sb2d5OjpwbGF0Zm9ybUFwcGx5R2VuZXJpYyhjb25zdCBQYWlu
dGluZ0RhdGEmIHBhaW50aW5nRGF0YSwgaW50IHN0YXJ0WSwgaW50IGVuZFkpCit7CisgICAgY29u
c3QgVWludDhDbGFtcGVkQXJyYXkmIHNyY1BpeGVsQXJyYXkgPSAqcGFpbnRpbmdEYXRhLnNyY1Bp
eGVsQXJyYXk7CisgICAgVWludDhDbGFtcGVkQXJyYXkmIGRzdFBpeGVsQXJyYXkgPSAqcGFpbnRp
bmdEYXRhLmRzdFBpeGVsQXJyYXk7CisKKyAgICBjb25zdCBpbnQgcmFkaXVzWCA9IHBhaW50aW5n
RGF0YS5yYWRpdXNYOworICAgIGNvbnN0IGludCByYWRpdXNZID0gcGFpbnRpbmdEYXRhLnJhZGl1
c1k7CisgICAgY29uc3QgaW50IHdpZHRoID0gcGFpbnRpbmdEYXRhLndpZHRoOworICAgIGNvbnN0
IGludCBoZWlnaHQgPSBwYWludGluZ0RhdGEuaGVpZ2h0OwogCiAgICAgQVNTRVJUKHJhZGl1c1gg
PD0gd2lkdGggfHwgcmFkaXVzWSA8PSBoZWlnaHQpOwotICAgIEFTU0VSVCh5U3RhcnQgPj0gMCAm
JiB5RW5kIDw9IGhlaWdodCAmJiB5U3RhcnQgPCB5RW5kKTsKLQotICAgIFZlY3Rvcjx1bnNpZ25l
ZCBjaGFyPiBleHRyZW1hOwotICAgIGZvciAoaW50IHkgPSB5U3RhcnQ7IHkgPCB5RW5kOyArK3kp
IHsKLSAgICAgICAgaW50IHlTdGFydEV4dHJlbWEgPSBzdGQ6Om1heCgwLCB5IC0gcmFkaXVzWSk7
Ci0gICAgICAgIGludCB5RW5kRXh0cmVtYSA9IHN0ZDo6bWluKGhlaWdodCAtIDEsIHkgKyByYWRp
dXNZKTsKLQotICAgICAgICBmb3IgKHVuc2lnbmVkIGNvbG9yQ2hhbm5lbCA9IDA7IGNvbG9yQ2hh
bm5lbCA8IDQ7ICsrY29sb3JDaGFubmVsKSB7Ci0gICAgICAgICAgICBleHRyZW1hLmNsZWFyKCk7
Ci0gICAgICAgICAgICAvLyBDb21wdXRlIGV4dHJlbWFzIGZvciBlYWNoIGNvbHVtbnMKLSAgICAg
ICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgcmFkaXVzWDsgKyt4KQotICAgICAgICAgICAgICAg
IGV4dHJlbWEuYXBwZW5kKGNvbHVtbkV4dHJlbXVtKHNyY1BpeGVsQXJyYXksIHgsIHlTdGFydEV4
dHJlbWEsIHlFbmRFeHRyZW1hLCB3aWR0aCwgY29sb3JDaGFubmVsLCBtX3R5cGUpKTsKLQotICAg
ICAgICAgICAgLy8gS2VybmVsIGlzIGZpbGxlZCwgZ2V0IGV4dHJlbWEgb2YgbmV4dCBjb2x1bW4K
LSAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICAg
ICAgICAgIGlmICh4IDwgd2lkdGggLSByYWRpdXNYKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlu
dCB4RW5kID0gc3RkOjptaW4oeCArIHJhZGl1c1gsIHdpZHRoIC0gMSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGV4dHJlbWEuYXBwZW5kKGNvbHVtbkV4dHJlbXVtKHNyY1BpeGVsQXJyYXksIHhFbmQs
IHlTdGFydEV4dHJlbWEsIHlFbmRFeHRyZW1hICsgMSwgd2lkdGgsIGNvbG9yQ2hhbm5lbCwgbV90
eXBlKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHggPiByYWRp
dXNYKQotICAgICAgICAgICAgICAgICAgICBleHRyZW1hLnJlbW92ZSgwKTsKLQotICAgICAgICAg
ICAgICAgIC8vIFRoZSBleHRyZW1hIG9yaWdpbmFsIHNpemUgPSByYWRpdXNYLgotICAgICAgICAg
ICAgICAgIC8vIE51bWJlciBvZiBuZXcgYWRkaXRpb24gPSB3aWR0aCAtIHJhZGl1c1guCi0gICAg
ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJlbW92YWxzID0gd2lkdGggLSByYWRpdXNYIC0gMS4K
LSAgICAgICAgICAgICAgICBBU1NFUlQoZXh0cmVtYS5zaXplKCkgPj0gc3RhdGljX2Nhc3Q8c2l6
ZV90PihyYWRpdXNYICsgMSkpOwotICAgICAgICAgICAgICAgIGRzdFBpeGVsQXJyYXkuc2V0KHBp
eGVsQXJyYXlJbmRleCh4LCB5LCB3aWR0aCwgY29sb3JDaGFubmVsKSwga2VybmVsRXh0cmVtdW0o
ZXh0cmVtYSwgbV90eXBlKSk7Ci0gICAgICAgICAgICB9CisgICAgQVNTRVJUKHN0YXJ0WSA+PSAw
ICYmIGVuZFkgPD0gaGVpZ2h0ICYmIHN0YXJ0WSA8IGVuZFkpOworCisgICAgQ29sdW1uRXh0cmVt
YSBleHRyZW1hOworICAgIGV4dHJlbWEucmVzZXJ2ZUNhcGFjaXR5KDIgKiByYWRpdXNYICsgMSk7
CisKKyAgICBmb3IgKGludCB5ID0gc3RhcnRZOyB5IDwgZW5kWTsgKyt5KSB7CisgICAgICAgIGlu
dCB5UmFkaXVzU3RhcnQgPSBzdGQ6Om1heCgwLCB5IC0gcmFkaXVzWSk7CisgICAgICAgIGludCB5
UmFkaXVzRW5kID0gc3RkOjptaW4oaGVpZ2h0LCB5ICsgcmFkaXVzWSArIDEpOworCisgICAgICAg
IGV4dHJlbWEucmVzaXplKDApOworCisgICAgICAgIC8vIFdlIHN0YXJ0IGF0IHRoZSBsZWZ0IGVk
Z2UsIHNvIGNvbXB1dGUgZXh0cmVtZSBmb3IgdGhlIHJhZGl1c1ggY29sdW1ucy4KKyAgICAgICAg
Zm9yIChpbnQgeCA9IDA7IHggPCByYWRpdXNYOyArK3gpCisgICAgICAgICAgICBleHRyZW1hLmFw
cGVuZChjb2x1bW5FeHRyZW11bShzcmNQaXhlbEFycmF5LCB4LCB5UmFkaXVzU3RhcnQsIHlSYWRp
dXNFbmQsIHdpZHRoLCBtX3R5cGUpKTsKKworICAgICAgICAvLyBLZXJuZWwgaXMgZmlsbGVkLCBn
ZXQgZXh0cmVtYSBvZiBuZXh0IGNvbHVtbgorICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdp
ZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGlmICh4IDwgd2lkdGggLSByYWRpdXNYKQorICAgICAg
ICAgICAgICAgIGV4dHJlbWEuYXBwZW5kKGNvbHVtbkV4dHJlbXVtKHNyY1BpeGVsQXJyYXksIHgg
KyByYWRpdXNYLCB5UmFkaXVzU3RhcnQsIHlSYWRpdXNFbmQsIHdpZHRoLCBtX3R5cGUpKTsKKwor
ICAgICAgICAgICAgaWYgKHggPiByYWRpdXNYKQorICAgICAgICAgICAgICAgIGV4dHJlbWEucmVt
b3ZlKDApOworCisgICAgICAgICAgICB1bnNpZ25lZCogZGVzdFBpeGVsID0gcmVpbnRlcnByZXRf
Y2FzdDx1bnNpZ25lZCo+KGRzdFBpeGVsQXJyYXkuZGF0YSgpICsgcGl4ZWxBcnJheUluZGV4KHgs
IHksIHdpZHRoKSk7CisgICAgICAgICAgICAqZGVzdFBpeGVsID0ga2VybmVsRXh0cmVtdW0oZXh0
cmVtYSwgbV90eXBlKS50b1JHQkEoKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBGRU1v
cnBob2xvZ3k6OnBsYXRmb3JtQXBwbHlXb3JrZXIoUGxhdGZvcm1BcHBseVBhcmFtZXRlcnMqIHBh
cmFtKQogewotICAgIHBhcmFtLT5maWx0ZXItPnBsYXRmb3JtQXBwbHlHZW5lcmljKHBhcmFtLT5w
YWludGluZ0RhdGEsIHBhcmFtLT5zdGFydFksIHBhcmFtLT5lbmRZKTsKKyAgICBwYXJhbS0+Zmls
dGVyLT5wbGF0Zm9ybUFwcGx5R2VuZXJpYygqcGFyYW0tPnBhaW50aW5nRGF0YSwgcGFyYW0tPnN0
YXJ0WSwgcGFyYW0tPmVuZFkpOwogfQogCi12b2lkIEZFTW9ycGhvbG9neTo6cGxhdGZvcm1BcHBs
eShQYWludGluZ0RhdGEqIHBhaW50aW5nRGF0YSkKK3ZvaWQgRkVNb3JwaG9sb2d5OjpwbGF0Zm9y
bUFwcGx5KGNvbnN0IFBhaW50aW5nRGF0YSYgcGFpbnRpbmdEYXRhKQogewotICAgIGludCBvcHRp
bWFsVGhyZWFkTnVtYmVyID0gKHBhaW50aW5nRGF0YS0+d2lkdGggKiBwYWludGluZ0RhdGEtPmhl
aWdodCkgLyBzX21pbmltYWxBcmVhOworICAgIC8vIEVtcGlyaWNhbGx5LCBydW50aW1lIGlzIGFw
cHJveGltYXRlbHkgbGluZWFyIG92ZXIgcmVhc29uYWJsZSBrZXJuZWwgc2l6ZXMgd2l0aCBhIHNs
b3BlIG9mIGFib3V0IDAuNjUuCisgICAgZmxvYXQga2VybmVsRmFjdG9yID0gc3FydChwYWludGlu
Z0RhdGEucmFkaXVzWCAqIHBhaW50aW5nRGF0YS5yYWRpdXNZKSAqIDAuNjU7CisKKyAgICBzdGF0
aWMgY29uc3QgaW50IG1pbmltYWxBcmVhID0gKDE2MCAqIDE2MCk7IC8vIEVtcGlyaWNhbCBkYXRh
IGxpbWl0IGZvciBwYXJhbGxlbCBqb2JzCisgICAgaW50IG9wdGltYWxUaHJlYWROdW1iZXIgPSAo
cGFpbnRpbmdEYXRhLndpZHRoICogcGFpbnRpbmdEYXRhLmhlaWdodCAqIGtlcm5lbEZhY3Rvcikg
LyBtaW5pbWFsQXJlYTsKKwogICAgIGlmIChvcHRpbWFsVGhyZWFkTnVtYmVyID4gMSkgewogICAg
ICAgICBQYXJhbGxlbEpvYnM8UGxhdGZvcm1BcHBseVBhcmFtZXRlcnM+IHBhcmFsbGVsSm9icygm
V2ViQ29yZTo6RkVNb3JwaG9sb2d5OjpwbGF0Zm9ybUFwcGx5V29ya2VyLCBvcHRpbWFsVGhyZWFk
TnVtYmVyKTsKICAgICAgICAgaW50IG51bU9mVGhyZWFkcyA9IHBhcmFsbGVsSm9icy5udW1iZXJP
ZkpvYnMoKTsKICAgICAgICAgaWYgKG51bU9mVGhyZWFkcyA+IDEpIHsKICAgICAgICAgICAgIC8v
IFNwbGl0IHRoZSBqb2IgaW50byAiam9iU2l6ZSItc2l6ZWQgam9icyBidXQgdGhlcmUgYSBmZXcg
am9icyB0aGF0IG5lZWQgdG8gYmUgc2xpZ2h0bHkgbGFyZ2VyIHNpbmNlCiAgICAgICAgICAgICAv
LyBqb2JTaXplICogam9icyA8IHRvdGFsIHNpemUuIFRoZXNlIGV4dHJhcyBhcmUgaGFuZGxlZCBi
eSB0aGUgcmVtYWluZGVyICJqb2JzV2l0aEV4dHJhIi4KLSAgICAgICAgICAgIGNvbnN0IGludCBq
b2JTaXplID0gcGFpbnRpbmdEYXRhLT5oZWlnaHQgLyBudW1PZlRocmVhZHM7Ci0gICAgICAgICAg
ICBjb25zdCBpbnQgam9ic1dpdGhFeHRyYSA9IHBhaW50aW5nRGF0YS0+aGVpZ2h0ICUgbnVtT2ZU
aHJlYWRzOworICAgICAgICAgICAgY29uc3QgaW50IGpvYlNpemUgPSBwYWludGluZ0RhdGEuaGVp
Z2h0IC8gbnVtT2ZUaHJlYWRzOworICAgICAgICAgICAgY29uc3QgaW50IGpvYnNXaXRoRXh0cmEg
PSBwYWludGluZ0RhdGEuaGVpZ2h0ICUgbnVtT2ZUaHJlYWRzOwogICAgICAgICAgICAgaW50IGN1
cnJlbnRZID0gMDsKICAgICAgICAgICAgIGZvciAoaW50IGpvYiA9IG51bU9mVGhyZWFkcyAtIDE7
IGpvYiA+PSAwOyAtLWpvYikgewogICAgICAgICAgICAgICAgIFBsYXRmb3JtQXBwbHlQYXJhbWV0
ZXJzJiBwYXJhbSA9IHBhcmFsbGVsSm9icy5wYXJhbWV0ZXIoam9iKTsKQEAgLTE4Miw3ICsyMDYs
NyBAQCB2b2lkIEZFTW9ycGhvbG9neTo6cGxhdGZvcm1BcHBseShQYWludGluZ0RhdGEqIHBhaW50
aW5nRGF0YSkKICAgICAgICAgICAgICAgICBwYXJhbS5zdGFydFkgPSBjdXJyZW50WTsKICAgICAg
ICAgICAgICAgICBjdXJyZW50WSArPSBqb2IgPCBqb2JzV2l0aEV4dHJhID8gam9iU2l6ZSArIDEg
OiBqb2JTaXplOwogICAgICAgICAgICAgICAgIHBhcmFtLmVuZFkgPSBjdXJyZW50WTsKLSAgICAg
ICAgICAgICAgICBwYXJhbS5wYWludGluZ0RhdGEgPSBwYWludGluZ0RhdGE7CisgICAgICAgICAg
ICAgICAgcGFyYW0ucGFpbnRpbmdEYXRhID0gJnBhaW50aW5nRGF0YTsKICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIHBhcmFsbGVsSm9icy5leGVjdXRlKCk7CiAgICAgICAgICAgICByZXR1cm47
CkBAIC0xOTAsNyArMjE0LDcgQEAgdm9pZCBGRU1vcnBob2xvZ3k6OnBsYXRmb3JtQXBwbHkoUGFp
bnRpbmdEYXRhKiBwYWludGluZ0RhdGEpCiAgICAgICAgIC8vIEZhbGxiYWNrIHRvIHNpbmdsZSB0
aHJlYWQgbW9kZWwKICAgICB9CiAKLSAgICBwbGF0Zm9ybUFwcGx5R2VuZXJpYyhwYWludGluZ0Rh
dGEsIDAsIHBhaW50aW5nRGF0YS0+aGVpZ2h0KTsKKyAgICBwbGF0Zm9ybUFwcGx5R2VuZXJpYyhw
YWludGluZ0RhdGEsIDAsIHBhaW50aW5nRGF0YS5oZWlnaHQpOwogfQogCiBib29sIEZFTW9ycGhv
bG9neTo6cGxhdGZvcm1BcHBseURlZ2VuZXJhdGUoVWludDhDbGFtcGVkQXJyYXkmIGRzdFBpeGVs
QXJyYXksIGNvbnN0IEludFJlY3QmIGltYWdlUmVjdCwgaW50IHJhZGl1c1gsIGludCByYWRpdXNZ
KQpAQCAtMjQ2LDcgKzI3MCw3IEBAIHZvaWQgRkVNb3JwaG9sb2d5OjpwbGF0Zm9ybUFwcGx5U29m
dHdhcmUoKQogICAgIHBhaW50aW5nRGF0YS5yYWRpdXNYID0gY2VpbGYocmFkaXVzWCAqIGZpbHRl
ci5maWx0ZXJTY2FsZSgpKTsKICAgICBwYWludGluZ0RhdGEucmFkaXVzWSA9IGNlaWxmKHJhZGl1
c1kgKiBmaWx0ZXIuZmlsdGVyU2NhbGUoKSk7CiAKLSAgICBwbGF0Zm9ybUFwcGx5KCZwYWludGlu
Z0RhdGEpOworICAgIHBsYXRmb3JtQXBwbHkocGFpbnRpbmdEYXRhKTsKIH0KIAogc3RhdGljIFRl
eHRTdHJlYW0mIG9wZXJhdG9yPDwoVGV4dFN0cmVhbSYgdHMsIGNvbnN0IE1vcnBob2xvZ3lPcGVy
YXRvclR5cGUmIHR5cGUpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9maWx0ZXJzL0ZFTW9ycGhvbG9neS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvZmlsdGVycy9GRU1vcnBob2xvZ3kuaAppbmRleCA5YzY2ODdmMDUyMjZkNGFhN2U1MjVl
N2IwMzRlMzk5MGQ5NDA1OTc5Li5kMWFhMzM4MTMwMTQzYTg4NWJkOWI5NGFjNjFiYTRmYTI5ZGI2
MDA2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJz
L0ZFTW9ycGhvbG9neS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Zp
bHRlcnMvRkVNb3JwaG9sb2d5LmgKQEAgLTY3LDE5ICs2NywxNyBAQCBwcml2YXRlOgogICAgICAg
ICBpbnQgcmFkaXVzWTsKICAgICB9OwogCi0gICAgc3RhdGljIGNvbnN0IGludCBzX21pbmltYWxB
cmVhID0gKDMwMCAqIDMwMCk7IC8vIEVtcGlyaWNhbCBkYXRhIGxpbWl0IGZvciBwYXJhbGxlbCBq
b2JzCi0KICAgICBzdHJ1Y3QgUGxhdGZvcm1BcHBseVBhcmFtZXRlcnMgewogICAgICAgICBGRU1v
cnBob2xvZ3kqIGZpbHRlcjsKICAgICAgICAgaW50IHN0YXJ0WTsKICAgICAgICAgaW50IGVuZFk7
Ci0gICAgICAgIFBhaW50aW5nRGF0YSogcGFpbnRpbmdEYXRhOworICAgICAgICBjb25zdCBQYWlu
dGluZ0RhdGEqIHBhaW50aW5nRGF0YTsKICAgICB9OwogCiAgICAgc3RhdGljIHZvaWQgcGxhdGZv
cm1BcHBseVdvcmtlcihQbGF0Zm9ybUFwcGx5UGFyYW1ldGVycyopOwogCi0gICAgaW5saW5lIHZv
aWQgcGxhdGZvcm1BcHBseShQYWludGluZ0RhdGEqKTsKLSAgICBpbmxpbmUgdm9pZCBwbGF0Zm9y
bUFwcGx5R2VuZXJpYyhQYWludGluZ0RhdGEqLCBjb25zdCBpbnQgeVN0YXJ0LCBjb25zdCBpbnQg
eUVuZCk7CisgICAgdm9pZCBwbGF0Zm9ybUFwcGx5KGNvbnN0IFBhaW50aW5nRGF0YSYpOworICAg
IHZvaWQgcGxhdGZvcm1BcHBseUdlbmVyaWMoY29uc3QgUGFpbnRpbmdEYXRhJiwgaW50IHN0YXJ0
WSwgaW50IGVuZFkpOwogCiAgICAgTW9ycGhvbG9neU9wZXJhdG9yVHlwZSBtX3R5cGU7CiAgICAg
ZmxvYXQgbV9yYWRpdXNYOwo=
</data>
<flag name="review"
          id="346791"
          type_id="1"
          status="+"
          setter="sam"
    />
          </attachment>
      

    </bug>

</bugzilla>