<?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>162923</bug_id>
          
          <creation_ts>2016-10-04 11:04:39 -0700</creation_ts>
          <short_desc>[Win][Direct2D] Add initial D2D Path and Gradient implementation</short_desc>
          <delta_ts>2016-10-05 10:20:59 -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>WebCore Misc.</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>161817</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Brent Fulgham">bfulgham</reporter>
          <assigned_to name="Brent Fulgham">bfulgham</assigned_to>
          <cc>achristensen</cc>
    
    <cc>bfulgham</cc>
    
    <cc>dino</cc>
    
    <cc>pvollan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1236266</commentid>
    <comment_count>0</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-04 11:04:39 -0700</bug_when>
    <thetext>This patch adds a Direct2D Path implementation, sufficient to support basic HTML5 Canvas operations.

This patch simply adds the new files. It does not incorporate them into the build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236458</commentid>
    <comment_count>1</comment_count>
      <attachid>290670</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-04 16:58:30 -0700</bug_when>
    <thetext>Created attachment 290670
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236558</commentid>
    <comment_count>2</comment_count>
      <attachid>290670</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2016-10-05 00:17:07 -0700</bug_when>
    <thetext>Comment on attachment 290670
Patch

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

lots of relatively small things.  r=me once they&apos;re addressed.

&gt; Source/WebCore/platform/graphics/win/GradientDirect2D.cpp:70
&gt; +            D2D1::RadialGradientBrushProperties(p0(), D2D1::Point2F(0, 0) /*p1()*/, startRadius(), endRadius()),

Is there a way we could not commit strangely-commented-out code like this?
// FIXME: Replace the second parameter with p1().

&gt; Source/WebCore/platform/graphics/win/GradientDirect2D.cpp:116
&gt; +    d2dContext-&gt;SetTags(3, 103);

These magic numbers need names and explanations.

&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:212
&gt; +    (void)applier;
&gt; +    (void)point;

Please use UNUSED_PARAM

&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:261
&gt; +        return FloatRect();

{ } here and elsewhere

&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:288
&gt; +    // FIXME
&gt; +    notImplemented();

FIXME not needed.

&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:335
&gt; +    (void)p1;
&gt; +    (void)p2;
&gt; +    (void)radius;

UNUSED_PARAM, or just don&apos;t name the parameters.

&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:342
&gt; +    bool equalWidths = (topLeftRadius.width() == topRightRadius.width() &amp;&amp; topRightRadius.width() == bottomLeftRadius.width() &amp;&amp; bottomLeftRadius.width() == bottomRightRadius.width());
&gt; +    bool equalHeights = (topLeftRadius.height() == bottomLeftRadius.height() &amp;&amp; bottomLeftRadius.height() == topRightRadius.height() &amp;&amp; topRightRadius.height() == bottomRightRadius.height());

These could use a helper function.

&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:366
&gt; +    m_activePath-&gt;EndFigure(D2D1_FIGURE_END_OPEN /*D2D1_FIGURE_END_CLOSED*/);

This shouldn&apos;t be committed like this.  Pick one.  Use a FIXME if we intend to change something.  Use a 2-state enum parameter if we want to be able to choose.

&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:403
&gt; +    if (std::abs(endAngle - firstArcEnd) &lt; 0.001)

areEssentiallyEqual, and make epsilon smaller if possible.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236690</commentid>
    <comment_count>3</comment_count>
      <attachid>290670</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-05 10:20:27 -0700</bug_when>
    <thetext>Comment on attachment 290670
Patch

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

Thanks for reviewing this. Maybe soon I can get you to hack on it ... :-)

&gt;&gt; Source/WebCore/platform/graphics/win/GradientDirect2D.cpp:70
&gt;&gt; +            D2D1::RadialGradientBrushProperties(p0(), D2D1::Point2F(0, 0) /*p1()*/, startRadius(), endRadius()),
&gt; 
&gt; Is there a way we could not commit strangely-commented-out code like this?
&gt; // FIXME: Replace the second parameter with p1().

That should just be p1(). Thanks for catching that -- I was debugging the radial gradient code and forget I had set p1 to origin.

&gt;&gt; Source/WebCore/platform/graphics/win/GradientDirect2D.cpp:116
&gt;&gt; +    d2dContext-&gt;SetTags(3, 103);
&gt; 
&gt; These magic numbers need names and explanations.

This is a D2D debugging function that takes two numbers as input. When you flush the context, if there is an error it gives the most recent tags (so you can locate the drawing commands that were in place when the failure occurred).

I switched to using &quot;__LINE__&quot; for the second argument and missed that in this file.

I&apos;ll add a macro for the first number, too.

&gt;&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:212
&gt;&gt; +    (void)point;
&gt; 
&gt; Please use UNUSED_PARAM

Done!

&gt;&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:261
&gt;&gt; +        return FloatRect();
&gt; 
&gt; { } here and elsewhere

Done!

&gt;&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:288
&gt;&gt; +    notImplemented();
&gt; 
&gt; FIXME not needed.

OK!

&gt;&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:335
&gt;&gt; +    (void)radius;
&gt; 
&gt; UNUSED_PARAM, or just don&apos;t name the parameters.

Done!

&gt;&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:342
&gt;&gt; +    bool equalHeights = (topLeftRadius.height() == bottomLeftRadius.height() &amp;&amp; bottomLeftRadius.height() == topRightRadius.height() &amp;&amp; topRightRadius.height() == bottomRightRadius.height());
&gt; 
&gt; These could use a helper function.

Good idea. Done.

&gt;&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:366
&gt;&gt; +    m_activePath-&gt;EndFigure(D2D1_FIGURE_END_OPEN /*D2D1_FIGURE_END_CLOSED*/);
&gt; 
&gt; This shouldn&apos;t be committed like this.  Pick one.  Use a FIXME if we intend to change something.  Use a 2-state enum parameter if we want to be able to choose.

The commented version was not needed. It&apos;s gone.

&gt;&gt; Source/WebCore/platform/graphics/win/PathDirect2D.cpp:403
&gt;&gt; +    if (std::abs(endAngle - firstArcEnd) &lt; 0.001)
&gt; 
&gt; areEssentiallyEqual, and make epsilon smaller if possible.

Yes! Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1236692</commentid>
    <comment_count>4</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2016-10-05 10:20:59 -0700</bug_when>
    <thetext>Committed r206815: &lt;http://trac.webkit.org/changeset/206815&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>290670</attachid>
            <date>2016-10-04 16:58:30 -0700</date>
            <delta_ts>2016-10-05 00:17:07 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-162923-20161004165519.patch</filename>
            <type>text/plain</type>
            <size>25510</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDIwNjc5NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE5IEBACisyMDE2LTEwLTA0ICBCcmVudCBG
dWxnaGFtICA8YmZ1bGdoYW1AYXBwbGUuY29tPgorCisgICAgICAgIFtXaW5dW0RpcmVjdDJEXSBB
ZGQgaW5pdGlhbCBEMkQgUGF0aCBhbmQgR3JhZGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2MjkyMworCisgICAgICAg
IFRoaXMgcGF0Y2ggbGFuZHMgYSBzZXQgb2YgbmV3IGZpbGVzIHRoYXQgaW1wbGVtZW50cyBpbml0
aWFsIFBhdGgKKyAgICAgICAgYW5kIEdyYWRpZW50IGZlYXR1cmVzIG9uIFdpbmRvd3MgdXNpbmcg
RGlyZWN0MkQuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIHVudGlsIGNvbXBsZXRlIGJhY2tlbmQg
bGFuZHMuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFkaWVudC5oOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGguY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL1BhdGguaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhZGllbnREaXJl
Y3QyRC5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbi9QYXRoRGly
ZWN0MkQuY3BwOiBBZGRlZC4KKwogMjAxNi0xMC0wMyAgUnlvc3VrZSBOaXdhICA8cm5pd2FAd2Vi
a2l0Lm9yZz4KIAogICAgICAgICBTaGFkb3dSb290IGludGVyZmFjZSBzaG91bGQgaGF2ZSBlbGVt
ZW50RnJvbVBvaW50CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFk
aWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dy
YWRpZW50LmgJKHJldmlzaW9uIDIwNjc3OCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0dyYWRpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTQxLDYgKzQxLDEwIEBAIHR5cGVk
ZWYgc3RydWN0IENHQ29udGV4dCogQ0dDb250ZXh0UmVmOwogdHlwZWRlZiBzdHJ1Y3QgQ0dHcmFk
aWVudCogQ0dHcmFkaWVudFJlZjsKIHR5cGVkZWYgQ0dHcmFkaWVudFJlZiBQbGF0Zm9ybUdyYWRp
ZW50OwogCisjZWxpZiBVU0UoRElSRUNUMkQpCitpbnRlcmZhY2UgSUQyRDFCcnVzaDsKK2ludGVy
ZmFjZSBJRDJEMVJlbmRlclRhcmdldDsKK3R5cGVkZWYgSUQyRDFCcnVzaCogUGxhdGZvcm1HcmFk
aWVudDsKICNlbGlmIFVTRShDQUlSTykKIHR5cGVkZWYgc3RydWN0IF9jYWlyb19wYXR0ZXJuIGNh
aXJvX3BhdHRlcm5fdDsKIHR5cGVkZWYgY2Fpcm9fcGF0dGVybl90KiBQbGF0Zm9ybUdyYWRpZW50
OwpAQCAtMTU5LDYgKzE2Myw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBVU0UoQ0cpCiAg
ICAgICAgIHZvaWQgcGFpbnQoQ0dDb250ZXh0UmVmKTsKICAgICAgICAgdm9pZCBwYWludChHcmFw
aGljc0NvbnRleHQqKTsKKyNlbGlmIFVTRShESVJFQ1QyRCkKKyAgICAgICAgUGxhdGZvcm1HcmFk
aWVudCBjcmVhdGVQbGF0Zm9ybUdyYWRpZW50SWZOZWNlc3NhcnkoSUQyRDFSZW5kZXJUYXJnZXQq
KTsKICNlbGlmIFVTRShDQUlSTykKICAgICAgICAgUGxhdGZvcm1HcmFkaWVudCBwbGF0Zm9ybUdy
YWRpZW50KGZsb2F0IGdsb2JhbEFscGhhKTsKICNlbmRpZgpAQCAtMTY3LDExICsxNzMsMTUgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBXRUJDT1JFX0VYUE9SVCBHcmFkaWVudChjb25z
dCBGbG9hdFBvaW50JiBwMCwgY29uc3QgRmxvYXRQb2ludCYgcDEpOwogICAgICAgICBHcmFkaWVu
dChjb25zdCBGbG9hdFBvaW50JiBwMCwgZmxvYXQgcjAsIGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBm
bG9hdCByMSwgZmxvYXQgYXNwZWN0UmF0aW8pOwogCi0gICAgICAgIHZvaWQgcGxhdGZvcm1Jbml0
KCkgeyBtX2dyYWRpZW50ID0gMDsgfQorICAgICAgICB2b2lkIHBsYXRmb3JtSW5pdCgpIHsgbV9n
cmFkaWVudCA9IG51bGxwdHI7IH0KICAgICAgICAgdm9pZCBwbGF0Zm9ybURlc3Ryb3koKTsKIAog
ICAgICAgICB2b2lkIHNvcnRTdG9wc0lmTmVjZXNzYXJ5KCk7CiAKKyNpZiBVU0UoRElSRUNUMkQp
CisgICAgICAgIHZvaWQgZ2VuZXJhdGVHcmFkaWVudChJRDJEMVJlbmRlclRhcmdldCopOworI2Vu
ZGlmCisKICAgICAgICAgLy8gS2VlcCBhbnkgcGFyYW1ldGVycyByZWxldmFudCB0byByZW5kZXJp
bmcgaW4gc3luYyB3aXRoIHRoZSBzdHJ1Y3R1cmUgaW4gR3JhZGllbnQ6Omhhc2goKS4KICAgICAg
ICAgYm9vbCBtX3JhZGlhbDsKICAgICAgICAgRmxvYXRQb2ludCBtX3AwOwpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5jcHAJKHJldmlzaW9uIDIwNjc3OCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xNTgsNyArMTU4LDcgQEAgdm9pZCBQYXRoOjphZGRCZXppZXJzRm9yUm91bmRlZFJlY3Qo
Y29ucwogICAgIGNsb3NlU3VicGF0aCgpOwogfQogCi0jaWYgIVVTRShDRykKKyNpZiAhVVNFKENH
KSAmJiAhVVNFKERJUkVDVDJEKQogUGF0aCBQYXRoOjpwb2x5Z29uUGF0aEZyb21Qb2ludHMoY29u
c3QgVmVjdG9yPEZsb2F0UG9pbnQ+JiBwb2ludHMpCiB7CiAgICAgUGF0aCBwYXRoOwpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguaAkocmV2aXNpb24gMjA2Nzc4KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiwgMjAwOSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgICAgICAgICAgICAgIDIwMDYgUm9i
IEJ1aXMgPGJ1aXNAa2RlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiwgMjAwOSwg
MjAxNiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDYgUm9iIEJ1aXMgPGJ1aXNAa2RlLm9yZz4KICAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRv
cmNoIE1vYmlsZSwgSW5jLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDEsNiArNDEsMTYgQEAKICNp
bmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dQYXRoLmg+CiB0eXBlZGVmIHN0cnVjdCBDR1BhdGggUGxh
dGZvcm1QYXRoOwogCisjZWxpZiBVU0UoRElSRUNUMkQpCisjaW5jbHVkZSAiQ09NUHRyLmgiCisK
K2ludGVyZmFjZSBJRDJEMUdlb21ldHJ5OworaW50ZXJmYWNlIElEMkQxR2VvbWV0cnlHcm91cDsK
K2ludGVyZmFjZSBJRDJEMVBhdGhHZW9tZXRyeTsKK2ludGVyZmFjZSBJRDJEMUdlb21ldHJ5U2lu
azsKKwordHlwZWRlZiBJRDJEMUdlb21ldHJ5R3JvdXAgUGxhdGZvcm1QYXRoOworCiAjZWxpZiBV
U0UoQ0FJUk8pCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTE3MSwxNiArMTgxLDI5IEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIAogICAgICAgICB2b2lkIGFkZEJlemllcnNGb3JSb3VuZGVkUmVj
dChjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFNpemUmIHRvcExlZnRSYWRpdXMsIGNvbnN0
IEZsb2F0U2l6ZSYgdG9wUmlnaHRSYWRpdXMsIGNvbnN0IEZsb2F0U2l6ZSYgYm90dG9tTGVmdFJh
ZGl1cywgY29uc3QgRmxvYXRTaXplJiBib3R0b21SaWdodFJhZGl1cyk7CiAKLSNpZiBVU0UoQ0cp
CisjaWYgVVNFKENHKSB8fCBVU0UoRElSRUNUMkQpCiAgICAgICAgIHZvaWQgcGxhdGZvcm1BZGRQ
YXRoRm9yUm91bmRlZFJlY3QoY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgRmxvYXRTaXplJiB0b3BM
ZWZ0UmFkaXVzLCBjb25zdCBGbG9hdFNpemUmIHRvcFJpZ2h0UmFkaXVzLCBjb25zdCBGbG9hdFNp
emUmIGJvdHRvbUxlZnRSYWRpdXMsIGNvbnN0IEZsb2F0U2l6ZSYgYm90dG9tUmlnaHRSYWRpdXMp
OwogI2VuZGlmCiAKKyNpZiBVU0UoRElSRUNUMkQpCisgICAgICAgIElEMkQxR2VvbWV0cnlTaW5r
KiBhY3RpdmVQYXRoKCkgY29uc3QgeyByZXR1cm4gbV9hY3RpdmVQYXRoLmdldCgpOyB9CisgICAg
ICAgIHZvaWQgYXBwZW5kR2VvbWV0cnkoSUQyRDFHZW9tZXRyeSopOworICAgICAgICB2b2lkIGNy
ZWF0ZUdlb21ldHJ5V2l0aEZpbGxNb2RlKFdpbmRSdWxlLCBDT01QdHI8SUQyRDFHZW9tZXRyeUdy
b3VwPiYpIGNvbnN0OworICAgICAgICB2b2lkIGRyYXdEaWRDb21wbGV0ZSgpIGNvbnN0OworCisg
ICAgICAgIEhSRVNVTFQgaW5pdGlhbGl6ZVBhdGhTdGF0ZSgpOworI2VuZGlmCisKICNpZm5kZWYg
TkRFQlVHCiAgICAgICAgIHZvaWQgZHVtcCgpIGNvbnN0OwogI2VuZGlmCiAKICAgICBwcml2YXRl
OgotICAgICAgICBQbGF0Zm9ybVBhdGhQdHIgbV9wYXRoOworICAgICAgICBQbGF0Zm9ybVBhdGhQ
dHIgbV9wYXRoIHsgbnVsbHB0ciB9OworI2lmIFVTRShESVJFQ1QyRCkKKyAgICAgICAgQ09NUHRy
PElEMkQxUGF0aEdlb21ldHJ5PiBtX2FjdGl2ZVBhdGhHZW9tZXRyeTsKKyAgICAgICAgQ09NUHRy
PElEMkQxR2VvbWV0cnlTaW5rPiBtX2FjdGl2ZVBhdGg7CisjZW5kaWYKICAgICB9OwogCiBUZXh0
U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mLCBjb25zdCBQYXRoJik7CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW4vR3JhZGllbnREaXJlY3QyRC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luL0dyYWRpZW50
RGlyZWN0MkQuY3BwCShub25leGlzdGVudCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9HcmFkaWVudERpcmVjdDJELmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBcHBsZSBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYWRpZW50LmgiCisKKyNpbmNsdWRlICJG
bG9hdFBvaW50LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSA8ZDJk
MS5oPgorI2luY2x1ZGUgPHd0Zi9SZXRhaW5QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit2b2lkIEdyYWRpZW50OjpwbGF0Zm9ybURlc3Ryb3koKQoreworICAgIGlmIChtX2dyYWRpZW50
KQorICAgICAgICBtX2dyYWRpZW50LT5SZWxlYXNlKCk7CisgICAgbV9ncmFkaWVudCA9IG51bGxw
dHI7Cit9CisKK0lEMkQxQnJ1c2gqIEdyYWRpZW50OjpwbGF0Zm9ybUdyYWRpZW50KCkKK3sKKyAg
ICBBU1NFUlQobV9ncmFkaWVudCk7CisgICAgcmV0dXJuIG1fZ3JhZGllbnQ7Cit9CisKK0lEMkQx
QnJ1c2gqIEdyYWRpZW50OjpjcmVhdGVQbGF0Zm9ybUdyYWRpZW50SWZOZWNlc3NhcnkoSUQyRDFS
ZW5kZXJUYXJnZXQqIGNvbnRleHQpCit7CisgICAgZ2VuZXJhdGVHcmFkaWVudChjb250ZXh0KTsK
KyAgICByZXR1cm4gbV9ncmFkaWVudDsKK30KKwordm9pZCBHcmFkaWVudDo6Z2VuZXJhdGVHcmFk
aWVudChJRDJEMVJlbmRlclRhcmdldCogcmVuZGVyVGFyZ2V0KQoreworICAgIHNvcnRTdG9wc0lm
TmVjZXNzYXJ5KCk7CisKKyAgICBWZWN0b3I8RDJEMV9HUkFESUVOVF9TVE9QPiBncmFkaWVudFN0
b3BzOworICAgIGZvciAoYXV0byBzdG9wIDogbV9zdG9wcykKKyAgICAgICAgZ3JhZGllbnRTdG9w
cy5hcHBlbmQoRDJEMTo6R3JhZGllbnRTdG9wKHN0b3Auc3RvcCwgRDJEMTo6Q29sb3JGKHN0b3Au
cmVkLCBzdG9wLmdyZWVuLCBzdG9wLmJsdWUsIHN0b3AuYWxwaGEpKSk7CisKKyAgICBDT01QdHI8
SUQyRDFHcmFkaWVudFN0b3BDb2xsZWN0aW9uPiBncmFkaWVudFN0b3BDb2xsZWN0aW9uOworICAg
IEhSRVNVTFQgaHIgPSByZW5kZXJUYXJnZXQtPkNyZWF0ZUdyYWRpZW50U3RvcENvbGxlY3Rpb24o
Z3JhZGllbnRTdG9wcy5kYXRhKCksIGdyYWRpZW50U3RvcHMuc2l6ZSgpLCAmZ3JhZGllbnRTdG9w
Q29sbGVjdGlvbik7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisKKyAgICBp
ZiAobV9yYWRpYWwpIHsKKyAgICAgICAgSUQyRDFSYWRpYWxHcmFkaWVudEJydXNoKiByYWRpYWxH
cmFkaWVudCA9IG51bGxwdHI7CisgICAgICAgIGhyID0gcmVuZGVyVGFyZ2V0LT5DcmVhdGVSYWRp
YWxHcmFkaWVudEJydXNoKAorICAgICAgICAgICAgRDJEMTo6UmFkaWFsR3JhZGllbnRCcnVzaFBy
b3BlcnRpZXMocDAoKSwgRDJEMTo6UG9pbnQyRigwLCAwKSAvKnAxKCkqLywgc3RhcnRSYWRpdXMo
KSwgZW5kUmFkaXVzKCkpLAorICAgICAgICAgICAgRDJEMTo6QnJ1c2hQcm9wZXJ0aWVzKCksIGdy
YWRpZW50U3RvcENvbGxlY3Rpb24uZ2V0KCksCisgICAgICAgICAgICAmcmFkaWFsR3JhZGllbnQp
OworICAgICAgICBSRUxFQVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKyAgICAgICAgbV9ncmFk
aWVudCA9IHJhZGlhbEdyYWRpZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIElEMkQxTGluZWFy
R3JhZGllbnRCcnVzaCogbGluZWFyR3JhZGllbnQgPSBudWxscHRyOworICAgICAgICBociA9IHJl
bmRlclRhcmdldC0+Q3JlYXRlTGluZWFyR3JhZGllbnRCcnVzaCgKKyAgICAgICAgICAgIEQyRDE6
OkxpbmVhckdyYWRpZW50QnJ1c2hQcm9wZXJ0aWVzKHAwKCksIHAxKCkpLAorICAgICAgICAgICAg
RDJEMTo6QnJ1c2hQcm9wZXJ0aWVzKCksIGdyYWRpZW50U3RvcENvbGxlY3Rpb24uZ2V0KCksCisg
ICAgICAgICAgICAmbGluZWFyR3JhZGllbnQpOworICAgICAgICBSRUxFQVNFX0FTU0VSVChTVUND
RUVERUQoaHIpKTsKKyAgICAgICAgbV9ncmFkaWVudCA9IGxpbmVhckdyYWRpZW50OworICAgIH0K
KworICAgIGhhc2goKTsKK30KKwordm9pZCBHcmFkaWVudDo6ZmlsbChHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBhdXRvIGQyZENvbnRleHQg
PSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKworICAgIGJvb2wgbmVlZFNjYWxpbmcgPSBh
c3BlY3RSYXRpbygpICE9IDE7CisgICAgaWYgKG5lZWRTY2FsaW5nKSB7CisgICAgICAgIGNvbnRl
eHQtPnNhdmUoKTsKKyAgICAgICAgLy8gU2NhbGUgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBncmFk
aWVudC4gV2Ugb25seSBldmVyIHNjYWxlIG5vbi1kZXByZWNhdGVkIGdyYWRpZW50cywKKyAgICAg
ICAgLy8gZm9yIHdoaWNoIG1fcDAgPT0gbV9wMS4KKyAgICAgICAgQVNTRVJUKG1fcDAgPT0gbV9w
MSk7CisKKyAgICAgICAgRDJEMV9NQVRSSVhfM1gyX0YgY3RtOworICAgICAgICBkMmRDb250ZXh0
LT5HZXRUcmFuc2Zvcm0oJmN0bSk7CisKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9y
bShjdG0pOworICAgICAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKG1fcDApOworICAgICAgICB0cmFu
c2Zvcm0uc2NhbGVOb25Vbmlmb3JtKDEuMCwgMS4wIC8gYXNwZWN0UmF0aW8oKSk7CisgICAgICAg
IHRyYW5zZm9ybS50cmFuc2xhdGUoLW1fcDApOworCisgICAgICAgIGQyZENvbnRleHQtPlNldFRy
YW5zZm9ybShjdG0pOworICAgIH0KKworICAgIGlmICghbV9jYWNoZWRIYXNoKQorICAgICAgICBn
ZW5lcmF0ZUdyYWRpZW50KGQyZENvbnRleHQpOworCisgICAgaWYgKCFjb250ZXh0LT5kaWRCZWdp
bkRyYXcoKSkKKyAgICAgICAgZDJkQ29udGV4dC0+QmVnaW5EcmF3KCk7CisKKyAgICBkMmRDb250
ZXh0LT5TZXRUYWdzKDMsIDEwMyk7CisKKyAgICBjb25zdCBEMkQxX1JFQ1RfRiBkMmRSZWN0ID0g
cmVjdDsKKyAgICBkMmRDb250ZXh0LT5GaWxsUmVjdGFuZ2xlKCZkMmRSZWN0LCBtX2dyYWRpZW50
KTsKKworICAgIGlmICghY29udGV4dC0+ZGlkQmVnaW5EcmF3KCkpIHsKKyAgICAgICAgRDJEMV9U
QUcgZmlyc3QsIHNlY29uZDsKKyAgICAgICAgSFJFU1VMVCBociA9IGQyZENvbnRleHQtPkVuZERy
YXcoJmZpcnN0LCAmc2Vjb25kKTsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhy
KSk7CisgICAgfQorCisgICAgaWYgKG5lZWRTY2FsaW5nKQorICAgICAgICBjb250ZXh0LT5yZXN0
b3JlKCk7Cit9CisKK30KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bi9QYXRoRGlyZWN0MkQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbi9QYXRoRGlyZWN0MkQuY3BwCShub25leGlzdGVudCkKKysrIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbi9QYXRoRGlyZWN0MkQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGF0aC5oIgorCisj
aWYgVVNFKERJUkVDVDJEKQorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVk
ZSAiQ09NUHRyLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVk
LmgiCisjaW5jbHVkZSAiU3Ryb2tlU3R5bGVBcHBsaWVyLmgiCisjaW5jbHVkZSA8ZDJkMS5oPgor
I2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1JldGFpblB0ci5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
KworUGF0aCBQYXRoOjpwb2x5Z29uUGF0aEZyb21Qb2ludHMoY29uc3QgVmVjdG9yPEZsb2F0UG9p
bnQ+JiBwb2ludHMpCit7CisgICAgUGF0aCBwYXRoOworICAgIGlmIChwb2ludHMuc2l6ZSgpIDwg
MikKKyAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICBWZWN0b3I8RDJEMV9QT0lOVF8yRiwgMzI+
IGQyZFBvaW50czsKKyAgICBkMmRQb2ludHMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShwb2ludHMu
c2l6ZSgpIC0gMSk7CisgICAgZm9yIChhdXRvIHBvaW50IDogcG9pbnRzKQorICAgICAgICBkMmRQ
b2ludHMudW5jaGVja2VkQXBwZW5kKEQyRDE6OlBvaW50MkYocG9pbnQueCgpLCBwb2ludC55KCkp
KTsKKworICAgIHBhdGgubW92ZVRvKHBvaW50cy5maXJzdCgpKTsKKworICAgIEFTU0VSVChwYXRo
LmFjdGl2ZVBhdGgoKSk7CisKKyAgICBwYXRoLmFjdGl2ZVBhdGgoKS0+QWRkTGluZXMoZDJkUG9p
bnRzLmRhdGEoKSwgZDJkUG9pbnRzLnNpemUoKSk7CisgICAgcGF0aC5jbG9zZVN1YnBhdGgoKTsK
KworICAgIHJldHVybiBwYXRoOworfQorCitQYXRoOjpQYXRoKCkKK3sKK30KKworUGF0aDo6flBh
dGgoKQoreworfQorCitQbGF0Zm9ybVBhdGhQdHIgUGF0aDo6ZW5zdXJlUGxhdGZvcm1QYXRoKCkK
K3sKKyAgICBpZiAoIW1fcGF0aCkgeworICAgICAgICBIUkVTVUxUIGhyID0gR3JhcGhpY3NDb250
ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZUdlb21ldHJ5R3JvdXAoRDJEMV9GSUxMX01PREVf
V0lORElORywgbnVsbHB0ciwgMCwgJm1fcGF0aCk7CisgICAgICAgIEFTU0VSVChTVUNDRUVERUQo
aHIpKTsKKyAgICAgICAgaWYgKEZBSUxFRChocikpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0
cjsKKyAgICB9CisKKyAgICByZXR1cm4gbV9wYXRoOworfQorCit2b2lkIFBhdGg6OmFwcGVuZEdl
b21ldHJ5KElEMkQxR2VvbWV0cnkqIGdlb21ldHJ5KQoreworICAgIHVuc2lnbmVkIGdlb21ldHJ5
Q291bnQgPSBtX3BhdGggPyBtX3BhdGgtPkdldFNvdXJjZUdlb21ldHJ5Q291bnQoKSA6IDA7Cisg
ICAgVmVjdG9yPElEMkQxR2VvbWV0cnkqPiBnZW9tZXRyaWVzKGdlb21ldHJ5Q291bnQsIG51bGxw
dHIpOworCisgICAgaWYgKGdlb21ldHJ5Q291bnQpCisgICAgICAgIG1fcGF0aC0+R2V0U291cmNl
R2VvbWV0cmllcyhnZW9tZXRyaWVzLmRhdGEoKSwgZ2VvbWV0cnlDb3VudCk7CisKKyAgICBnZW9t
ZXRyaWVzLmFwcGVuZChnZW9tZXRyeSk7CisKKyAgICBhdXRvIGZpbGxNb2RlID0gbV9wYXRoID8g
bV9wYXRoLT5HZXRGaWxsTW9kZSgpIDogRDJEMV9GSUxMX01PREVfV0lORElORzsKKworICAgIENP
TVB0cjxJRDJEMUdlb21ldHJ5R3JvdXA+IHByb3RlY3RlZFBhdGggPSBtX3BhdGg7CisgICAgbV9w
YXRoID0gbnVsbHB0cjsKKworICAgIEhSRVNVTFQgaHIgPSBHcmFwaGljc0NvbnRleHQ6OnN5c3Rl
bUZhY3RvcnkoKS0+Q3JlYXRlR2VvbWV0cnlHcm91cChmaWxsTW9kZSwgZ2VvbWV0cmllcy5kYXRh
KCksIGdlb21ldHJpZXMuc2l6ZSgpLCAmbV9wYXRoKTsKKyAgICBSRUxFQVNFX0FTU0VSVChTVUND
RUVERUQoaHIpKTsKK30KKwordm9pZCBQYXRoOjpjcmVhdGVHZW9tZXRyeVdpdGhGaWxsTW9kZShX
aW5kUnVsZSB3ZWJraXRGaWxsTW9kZSwgQ09NUHRyPElEMkQxR2VvbWV0cnlHcm91cD4mIHBhdGgp
IGNvbnN0Cit7CisgICAgUkVMRUFTRV9BU1NFUlQobV9wYXRoKTsKKworICAgIGF1dG8gZmlsbE1v
ZGUgPSAod2Via2l0RmlsbE1vZGUgPT0gUlVMRV9FVkVOT0REKSA/IEQyRDFfRklMTF9NT0RFX0FM
VEVSTkFURSA6IEQyRDFfRklMTF9NT0RFX1dJTkRJTkc7CisKKyAgICBpZiAoZmlsbE1vZGUgPT0g
bV9wYXRoLT5HZXRGaWxsTW9kZSgpKSB7CisgICAgICAgIHBhdGggPSBtX3BhdGg7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZW9tZXRyeUNvdW50ID0gbV9wYXRoLT5H
ZXRTb3VyY2VHZW9tZXRyeUNvdW50KCk7CisKKyAgICBWZWN0b3I8SUQyRDFHZW9tZXRyeSo+IGdl
b21ldHJpZXMoZ2VvbWV0cnlDb3VudCwgbnVsbHB0cik7CisgICAgQVNTRVJUKGdlb21ldHJ5Q291
bnQpOworICAgIG1fcGF0aC0+R2V0U291cmNlR2VvbWV0cmllcyhnZW9tZXRyaWVzLmRhdGEoKSwg
Z2VvbWV0cnlDb3VudCk7CisKKyAgICBIUkVTVUxUIGhyID0gR3JhcGhpY3NDb250ZXh0OjpzeXN0
ZW1GYWN0b3J5KCktPkNyZWF0ZUdlb21ldHJ5R3JvdXAoZmlsbE1vZGUsIGdlb21ldHJpZXMuZGF0
YSgpLCBnZW9tZXRyaWVzLnNpemUoKSwgJnBhdGgpOworICAgIFJFTEVBU0VfQVNTRVJUKFNVQ0NF
RURFRChocikpOworfQorCitQYXRoOjpQYXRoKGNvbnN0IFBhdGgmIG90aGVyKQoreworICAgIGlm
IChvdGhlci5wbGF0Zm9ybVBhdGgoKSAmJiBvdGhlci5hY3RpdmVQYXRoKCkpIHsKKyAgICAgICAg
YXV0byBvdGhlclBhdGggPSBvdGhlci5wbGF0Zm9ybVBhdGgoKTsKKworICAgICAgICB1bnNpZ25l
ZCBnZW9tZXRyeUNvdW50ID0gb3RoZXJQYXRoLT5HZXRTb3VyY2VHZW9tZXRyeUNvdW50KCk7CisK
KyAgICAgICAgVmVjdG9yPElEMkQxR2VvbWV0cnkqPiBnZW9tZXRyaWVzKGdlb21ldHJ5Q291bnQs
IG51bGxwdHIpOworICAgICAgICBBU1NFUlQoZ2VvbWV0cnlDb3VudCk7CisgICAgICAgIG90aGVy
UGF0aC0+R2V0U291cmNlR2VvbWV0cmllcyhnZW9tZXRyaWVzLmRhdGEoKSwgZ2VvbWV0cnlDb3Vu
dCk7CisKKyAgICAgICAgSFJFU1VMVCBociA9IEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9y
eSgpLT5DcmVhdGVHZW9tZXRyeUdyb3VwKG90aGVyLm1fcGF0aC0+R2V0RmlsbE1vZGUoKSwgZ2Vv
bWV0cmllcy5kYXRhKCksIGdlb21ldHJ5Q291bnQsICZtX3BhdGgpOworICAgICAgICBSRUxFQVNF
X0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKyAgICB9Cit9CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9y
PShjb25zdCBQYXRoJiBvdGhlcikKK3sKKyAgICBtX3BhdGggPSBvdGhlci5tX3BhdGg7CisgICAg
aWYgKG1fcGF0aCkKKyAgICAgICAgbV9wYXRoLT5BZGRSZWYoKTsKKworICAgIG1fYWN0aXZlUGF0
aCA9IG90aGVyLm1fYWN0aXZlUGF0aDsKKyAgICBtX2FjdGl2ZVBhdGhHZW9tZXRyeSA9IG90aGVy
Lm1fYWN0aXZlUGF0aEdlb21ldHJ5OworCisgICAgcmV0dXJuICp0aGlzOworfQorCitIUkVTVUxU
IFBhdGg6OmluaXRpYWxpemVQYXRoU3RhdGUoKQoreworICAgIGlmIChtX3BhdGgpCisgICAgICAg
IG1fcGF0aC0+UmVsZWFzZSgpOworICAgIG1fcGF0aCA9IG51bGxwdHI7CisgICAgbV9hY3RpdmVQ
YXRoID0gbnVsbHB0cjsKKyAgICBtX2FjdGl2ZVBhdGhHZW9tZXRyeSA9IG51bGxwdHI7CisKKyAg
ICBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlUGF0aEdlb21ldHJ5KCZt
X2FjdGl2ZVBhdGhHZW9tZXRyeSk7CisKKyAgICBWZWN0b3I8SUQyRDFHZW9tZXRyeSo+IGdlb21l
dHJpZXM7CisgICAgZ2VvbWV0cmllcy5hcHBlbmQobV9hY3RpdmVQYXRoR2VvbWV0cnkuZ2V0KCkp
OworCisgICAgSFJFU1VMVCBociA9IEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5D
cmVhdGVHZW9tZXRyeUdyb3VwKEQyRDFfRklMTF9NT0RFX1dJTkRJTkcsIGdlb21ldHJpZXMuZGF0
YSgpLCBnZW9tZXRyaWVzLnNpemUoKSwgJm1fcGF0aCk7CisgICAgaWYgKEZBSUxFRChocikpCisg
ICAgICAgIHJldHVybiBocjsKKworICAgIHJldHVybiBtX2FjdGl2ZVBhdGhHZW9tZXRyeS0+T3Bl
bigmbV9hY3RpdmVQYXRoKTsKK30KKwordm9pZCBQYXRoOjpkcmF3RGlkQ29tcGxldGUoKSBjb25z
dAoreworICAgIEZsb2F0UG9pbnQgY3VycmVudFBvaW50ID0gdGhpcy0+Y3VycmVudFBvaW50KCk7
CisKKyAgICAvLyBUbyBtYWludGFpbiBwcm9wZXIgc2VtYW50aWNzIHdpdGggQ0csIHdlIG5lZWQg
dG8gY2xlYXIgb3VyIERpcmVjdDJECisgICAgLy8gcGF0aCBvYmplY3RzIHdoZW4gYSBkcmF3IGhh
cyBmaW5pc2hlZC4KKyAgICBIUkVTVUxUIGhyID0gY29uc3RfY2FzdDxQYXRoKj4odGhpcyktPmlu
aXRpYWxpemVQYXRoU3RhdGUoKTsKKworICAgIGlmICghU1VDQ0VFREVEKGhyKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9hY3RpdmVQYXRoLT5TZXRGaWxsTW9kZShEMkQxX0ZJTExfTU9ERV9X
SU5ESU5HKTsKKworICAgIG1fYWN0aXZlUGF0aC0+QmVnaW5GaWd1cmUoY3VycmVudFBvaW50LCBE
MkQxX0ZJR1VSRV9CRUdJTl9GSUxMRUQpOworfQorCitib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIGlmIChpc051
bGwoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFmYXN0Qm91bmRpbmdSZWN0
KCkuY29udGFpbnMocG9pbnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCT09MIGNv
bnRhaW5zOworICAgIGlmICghU1VDQ0VFREVEKG1fcGF0aC0+RmlsbENvbnRhaW5zUG9pbnQoRDJE
MTo6UG9pbnQyRihwb2ludC54KCksIHBvaW50LnkoKSksIG51bGxwdHIsICZjb250YWlucykpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gY29udGFpbnM7Cit9CisKK2Jvb2wg
UGF0aDo6c3Ryb2tlQ29udGFpbnMoU3Ryb2tlU3R5bGVBcHBsaWVyKiBhcHBsaWVyLCBjb25zdCBG
bG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBpZiAoaXNOdWxsKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgICh2b2lkKWFwcGxpZXI7CisgICAgKHZvaWQpcG9pbnQ7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUGF0aDo6dHJh
bnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICB0cmFuc2Zvcm0oQWZmaW5lVHJh
bnNmb3JtKDEsIDAsIDAsIDEsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSkpOworfQorCit2
b2lkIFBhdGg6OnRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sK
KyAgICBpZiAodHJhbnNmb3JtLmlzSWRlbnRpdHkoKSB8fCBpc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGJvb2wgcGF0aElzQWN0aXZlID0gZmFsc2U7CisgICAgaWYgKG1fYWN0aXZl
UGF0aCkgeworICAgICAgICBtX2FjdGl2ZVBhdGgtPkNsb3NlKCk7CisgICAgICAgIG1fYWN0aXZl
UGF0aCA9IG51bGxwdHI7CisgICAgICAgIG1fYWN0aXZlUGF0aEdlb21ldHJ5ID0gbnVsbHB0cjsK
KyAgICAgICAgcGF0aElzQWN0aXZlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCBEMkQxX01B
VFJJWF8zWDJfRiYgZDJkVHJhbnNmb3JtID0gc3RhdGljX2Nhc3Q8Y29uc3QgRDJEMV9NQVRSSVhf
M1gyX0Y+KHRyYW5zZm9ybSk7CisgICAgQ09NUHRyPElEMkQxVHJhbnNmb3JtZWRHZW9tZXRyeT4g
dHJhbnNmb3JtZWRQYXRoOworICAgIGlmICghU1VDQ0VFREVEKEdyYXBoaWNzQ29udGV4dDo6c3lz
dGVtRmFjdG9yeSgpLT5DcmVhdGVUcmFuc2Zvcm1lZEdlb21ldHJ5KG1fcGF0aCwgZDJkVHJhbnNm
b3JtLCAmdHJhbnNmb3JtZWRQYXRoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIFZlY3RvcjxJ
RDJEMUdlb21ldHJ5Kj4gZ2VvbWV0cmllczsKKyAgICBnZW9tZXRyaWVzLmFwcGVuZCh0cmFuc2Zv
cm1lZFBhdGguZ2V0KCkpOworCisgICAgaWYgKHBhdGhJc0FjdGl2ZSkgeworICAgICAgICBHcmFw
aGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlUGF0aEdlb21ldHJ5KCZtX2FjdGl2
ZVBhdGhHZW9tZXRyeSk7CisgICAgICAgIG1fYWN0aXZlUGF0aEdlb21ldHJ5LT5PcGVuKCZtX2Fj
dGl2ZVBhdGgpOworICAgICAgICBnZW9tZXRyaWVzLmFwcGVuZChtX2FjdGl2ZVBhdGhHZW9tZXRy
eS5nZXQoKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsTW9kZSA9IG1fcGF0aC0+R2V0RmlsbE1v
ZGUoKTsKKworICAgIG1fcGF0aC0+UmVsZWFzZSgpOworICAgIG1fcGF0aCA9IG51bGxwdHI7CisK
KyAgICBIUkVTVUxUIGhyID0gR3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0
ZUdlb21ldHJ5R3JvdXAoZmlsbE1vZGUsIGdlb21ldHJpZXMuZGF0YSgpLCBnZW9tZXRyaWVzLnNp
emUoKSwgJm1fcGF0aCk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7Cit9CisK
K0Zsb2F0UmVjdCBQYXRoOjpib3VuZGluZ1JlY3QoKSBjb25zdAoreworICAgIGlmIChpc051bGwo
KSkKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworCisgICAgRDJEMV9SRUNUX0YgYm91bmRz
OworICAgIGlmICghU1VDQ0VFREVEKG1fcGF0aC0+R2V0Qm91bmRzKG51bGxwdHIsICZib3VuZHMp
KSkKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworCisgICAgcmV0dXJuIEZsb2F0UmVjdChi
b3VuZHMubGVmdCwgYm91bmRzLmJvdHRvbSwgYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQsIGJv
dW5kcy50b3AgLSBib3VuZHMuYm90dG9tKTsKK30KKworRmxvYXRSZWN0IFBhdGg6OmZhc3RCb3Vu
ZGluZ1JlY3QoKSBjb25zdAoreworICAgIGlmIChpc051bGwoKSkKKyAgICAgICAgcmV0dXJuIEZs
b2F0UmVjdCgpOworCisgICAgRDJEMV9SRUNUX0YgYm91bmRzOworICAgIGlmICghU1VDQ0VFREVE
KG1fcGF0aC0+R2V0Qm91bmRzKG51bGxwdHIsICZib3VuZHMpKSkKKyAgICAgICAgcmV0dXJuIEZs
b2F0UmVjdCgpOworCisgICAgcmV0dXJuIEZsb2F0UmVjdChib3VuZHMubGVmdCwgYm91bmRzLmJv
dHRvbSwgYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQsIGJvdW5kcy50b3AgLSBib3VuZHMuYm90
dG9tKTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdChTdHJva2VTdHls
ZUFwcGxpZXIqIGFwcGxpZXIpIGNvbnN0Cit7CisgICAgaWYgKGlzTnVsbCgpKQorICAgICAgICBy
ZXR1cm4gRmxvYXRSZWN0KCk7CisKKyAgICAvLyBGSVhNRQorICAgIG5vdEltcGxlbWVudGVkKCk7
CisgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworfQorCit2b2lkIFBhdGg6Om1vdmVUbyhjb25zdCBG
bG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBpZiAoIW1fYWN0aXZlUGF0aCkgeworICAgICAgICBH
cmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+Q3JlYXRlUGF0aEdlb21ldHJ5KCZtX2Fj
dGl2ZVBhdGhHZW9tZXRyeSk7CisKKyAgICAgICAgYXBwZW5kR2VvbWV0cnkobV9hY3RpdmVQYXRo
R2VvbWV0cnkuZ2V0KCkpOworCisgICAgICAgIGlmICghU1VDQ0VFREVEKG1fYWN0aXZlUGF0aEdl
b21ldHJ5LT5PcGVuKCZtX2FjdGl2ZVBhdGgpKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBtX2FjdGl2ZVBhdGgtPlNldEZpbGxNb2RlKEQyRDFfRklMTF9NT0RFX1dJTkRJTkcpOwor
ICAgIH0KKworICAgIG1fYWN0aXZlUGF0aC0+QmVnaW5GaWd1cmUocG9pbnQsIEQyRDFfRklHVVJF
X0JFR0lOX0ZJTExFRCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkTGluZVRvKGNvbnN0IEZsb2F0UG9p
bnQmIHBvaW50KQoreworICAgIEFTU0VSVChtX2FjdGl2ZVBhdGguZ2V0KCkpOworCisgICAgbV9h
Y3RpdmVQYXRoLT5BZGRMaW5lKEQyRDE6OlBvaW50MkYocG9pbnQueCgpLCBwb2ludC55KCkpKTsK
K30KKwordm9pZCBQYXRoOjphZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcCwgY29u
c3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBBU1NFUlQobV9hY3RpdmVQYXRoLmdldCgpKTsKKwor
ICAgIG1fYWN0aXZlUGF0aC0+QWRkUXVhZHJhdGljQmV6aWVyKEQyRDE6OlF1YWRyYXRpY0Jlemll
clNlZ21lbnQoRDJEMTo6UG9pbnQyRihjcC54KCksIGNwLnkoKSksIEQyRDE6OlBvaW50MkYocC54
KCksIHAueSgpKSkpOworfQorCit2b2lkIFBhdGg6OmFkZEJlemllckN1cnZlVG8oY29uc3QgRmxv
YXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBjcDIsIGNvbnN0IEZsb2F0UG9pbnQmIHAp
Cit7CisgICAgQVNTRVJUKG1fYWN0aXZlUGF0aC5nZXQoKSk7CisKKyAgICBGbG9hdFBvaW50IGJl
Zm9yZVBvaW50ID0gdGhpcy0+Y3VycmVudFBvaW50KCk7CisKKyAgICBtX2FjdGl2ZVBhdGgtPkFk
ZEJlemllcihEMkQxOjpCZXppZXJTZWdtZW50KGNwMSwgY3AyLCBwKSk7Cit9CisKK3ZvaWQgUGF0
aDo6YWRkQXJjVG8oY29uc3QgRmxvYXRQb2ludCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQmIHAyLCBm
bG9hdCByYWRpdXMpCit7CisgICAgKHZvaWQpcDE7CisgICAgKHZvaWQpcDI7CisgICAgKHZvaWQp
cmFkaXVzOworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgUGF0aDo6cGxhdGZvcm1B
ZGRQYXRoRm9yUm91bmRlZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBGbG9hdFNp
emUmIHRvcExlZnRSYWRpdXMsIGNvbnN0IEZsb2F0U2l6ZSYgdG9wUmlnaHRSYWRpdXMsIGNvbnN0
IEZsb2F0U2l6ZSYgYm90dG9tTGVmdFJhZGl1cywgY29uc3QgRmxvYXRTaXplJiBib3R0b21SaWdo
dFJhZGl1cykKK3sKKyAgICBib29sIGVxdWFsV2lkdGhzID0gKHRvcExlZnRSYWRpdXMud2lkdGgo
KSA9PSB0b3BSaWdodFJhZGl1cy53aWR0aCgpICYmIHRvcFJpZ2h0UmFkaXVzLndpZHRoKCkgPT0g
Ym90dG9tTGVmdFJhZGl1cy53aWR0aCgpICYmIGJvdHRvbUxlZnRSYWRpdXMud2lkdGgoKSA9PSBi
b3R0b21SaWdodFJhZGl1cy53aWR0aCgpKTsKKyAgICBib29sIGVxdWFsSGVpZ2h0cyA9ICh0b3BM
ZWZ0UmFkaXVzLmhlaWdodCgpID09IGJvdHRvbUxlZnRSYWRpdXMuaGVpZ2h0KCkgJiYgYm90dG9t
TGVmdFJhZGl1cy5oZWlnaHQoKSA9PSB0b3BSaWdodFJhZGl1cy5oZWlnaHQoKSAmJiB0b3BSaWdo
dFJhZGl1cy5oZWlnaHQoKSA9PSBib3R0b21SaWdodFJhZGl1cy5oZWlnaHQoKSk7CisKKyAgICBp
ZiAoZXF1YWxXaWR0aHMgJiYgZXF1YWxIZWlnaHRzKSB7CisgICAgICAgIC8vIEVuc3VyZSB0aGF0
IENHIGNhbiByZW5kZXIgdGhlIHJvdW5kZWQgcmVjdC4KKyAgICAgICAgZmxvYXQgcmFkaXVzV2lk
dGggPSB0b3BMZWZ0UmFkaXVzLndpZHRoKCk7CisgICAgICAgIGZsb2F0IHJhZGl1c0hlaWdodCA9
IHRvcExlZnRSYWRpdXMuaGVpZ2h0KCk7CisgICAgICAgIGF1dG8gcmVjdFRvRHJhdyA9IEQyRDE6
OlJlY3RGKHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC5tYXhYKCksIHJlY3QubWF4WSgpKTsKKwor
ICAgICAgICBDT01QdHI8SUQyRDFSb3VuZGVkUmVjdGFuZ2xlR2VvbWV0cnk+IHJvdW5kUmVjdDsK
KyAgICAgICAgSFJFU1VMVCBociA9IEdyYXBoaWNzQ29udGV4dDo6c3lzdGVtRmFjdG9yeSgpLT5D
cmVhdGVSb3VuZGVkUmVjdGFuZ2xlR2VvbWV0cnkoRDJEMTo6Um91bmRlZFJlY3QocmVjdFRvRHJh
dywgcmFkaXVzV2lkdGgsIHJhZGl1c0hlaWdodCksICZyb3VuZFJlY3QpOworICAgICAgICBSRUxF
QVNFX0FTU0VSVChTVUNDRUVERUQoaHIpKTsKKyAgICAgICAgYXBwZW5kR2VvbWV0cnkocm91bmRS
ZWN0LmdldCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFkZEJlemllcnNGb3JS
b3VuZGVkUmVjdChyZWN0LCB0b3BMZWZ0UmFkaXVzLCB0b3BSaWdodFJhZGl1cywgYm90dG9tTGVm
dFJhZGl1cywgYm90dG9tUmlnaHRSYWRpdXMpOworfQorCit2b2lkIFBhdGg6OmNsb3NlU3VicGF0
aCgpCit7CisgICAgaWYgKGlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQo
bV9hY3RpdmVQYXRoLmdldCgpKTsKKyAgICBtX2FjdGl2ZVBhdGgtPkVuZEZpZ3VyZShEMkQxX0ZJ
R1VSRV9FTkRfT1BFTiAvKkQyRDFfRklHVVJFX0VORF9DTE9TRUQqLyk7Cit9CisKK3N0YXRpYyB2
b2lkIGRyYXdBcmNTZWN0aW9uKElEMkQxR2VvbWV0cnlTaW5rKiBzaW5rLCBGbG9hdFBvaW50IGNl
bnRlciwgZmxvYXQgcmFkaXVzLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBlbmRBbmdsZSwgYm9v
bCBjbG9ja3dpc2UpCit7CisgICAgLy8gRGlyZWN0MkQgd2FudHMgdXMgdG8gc3BlY2lmeSB0aGUg
ZW5kIHBvaW50IG9mIHRoZSBhcmMsIG5vdCB0aGUgY2VudGVyLiBJdCB3aWxsIGJlIGRyYXduIGZy
b20KKyAgICAvLyB3aGF0ZXZlciB0aGUgY3VycmVudCBwb2ludCBpbiB0aGUgJ21fYWN0aXZlUGF0
aCcgaXMuCisgICAgRmxvYXRQb2ludCBwID0gY2VudGVyOworICAgIGZsb2F0IGVuZFggPSByYWRp
dXMgKiBzdGQ6OmNvcyhlbmRBbmdsZSk7CisgICAgZmxvYXQgZW5kWSA9IHJhZGl1cyAqIHN0ZDo6
c2luKGVuZEFuZ2xlKTsKKyAgICBwLm1vdmUoZW5kWCwgZW5kWSk7CisKKyAgICBmbG9hdCBhcmNE
ZWcgPSByYWQyZGVnKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSk7CisgICAgRDJEMV9TV0VFUF9ESVJF
Q1RJT04gZGlyZWN0aW9uID0gY2xvY2t3aXNlID8gRDJEMV9TV0VFUF9ESVJFQ1RJT05fQ0xPQ0tX
SVNFIDogRDJEMV9TV0VFUF9ESVJFQ1RJT05fQ09VTlRFUl9DTE9DS1dJU0U7CisgICAgc2luay0+
QWRkQXJjKEQyRDE6OkFyY1NlZ21lbnQocCwgRDJEMTo6U2l6ZUYocmFkaXVzLCByYWRpdXMpLCBh
cmNEZWcsIGRpcmVjdGlvbiwgRDJEMV9BUkNfU0laRV9TTUFMTCkpOworfQorCit2b2lkIFBhdGg6
OmFkZEFyYyhjb25zdCBGbG9hdFBvaW50JiBjZW50ZXIsIGZsb2F0IHJhZGl1cywgZmxvYXQgc3Rh
cnRBbmdsZSwgZmxvYXQgZW5kQW5nbGUsIGJvb2wgY2xvY2t3aXNlKQoreworICAgIGlmICghbV9h
Y3RpdmVQYXRoKSB7CisgICAgICAgIGZsb2F0IHN0YXJ0WCA9IHJhZGl1cyAqIHN0ZDo6Y29zKHN0
YXJ0QW5nbGUpOworICAgICAgICBmbG9hdCBzdGFydFkgPSByYWRpdXMgKiBzdGQ6OnNpbihzdGFy
dEFuZ2xlKTsKKworICAgICAgICBGbG9hdFBvaW50IHN0YXJ0ID0gY2VudGVyOworICAgICAgICBz
dGFydC5tb3ZlKHN0YXJ0WCwgc3RhcnRZKTsKKyAgICAgICAgbW92ZVRvKHN0YXJ0KTsKKyAgICB9
CisKKyAgICAvLyBEaXJlY3QyRCBoYXMgcHJvYmxlbXMgZHJhd2luZyBsYXJnZSBhcmNzLiBJdCBn
ZXRzIGNvbmZ1c2VkIGlmIGRyYXdpbmcgYSBjb21wbGV0ZSAob3IKKyAgICAvLyBuZWFybHkgY29t
cGxldGUpIGNpcmNsZSBpbiB0aGUgY291bnRlci1jbG9ja3dpc2UgZGlyZWN0aW9uLiBTbywgZHJh
dyBhbnkgYXJjcyBsYXJnZXIKKyAgICAvLyB0aGFuIDE4MCBkZWdyZWVzIGluIHR3byBwaWVjZXMu
CisgICAgZmxvYXQgZnVsbFN3ZWVwID0gZW5kQW5nbGUgLSBzdGFydEFuZ2xlOworICAgIGZsb2F0
IG5lZ2F0ZSA9IGZ1bGxTd2VlcCA8IDAgPyAtMS4wZiA6IDEuMGY7CisgICAgZmxvYXQgbWF4U3dl
ZXAgPSBuZWdhdGUgKiBzdGQ6Om1pbihzdGQ6OmFicyhmdWxsU3dlZXApLCBwaUZsb2F0KTsKKyAg
ICBmbG9hdCBmaXJzdEFyY0VuZCA9IHN0YXJ0QW5nbGUgKyBtYXhTd2VlcDsKKyAgICBkcmF3QXJj
U2VjdGlvbihtX2FjdGl2ZVBhdGguZ2V0KCksIGNlbnRlciwgcmFkaXVzLCBzdGFydEFuZ2xlLCBm
aXJzdEFyY0VuZCwgY2xvY2t3aXNlKTsKKworICAgIGlmIChzdGQ6OmFicyhlbmRBbmdsZSAtIGZp
cnN0QXJjRW5kKSA8IDAuMDAxKQorICAgICAgICByZXR1cm47CisKKyAgICBkcmF3QXJjU2VjdGlv
bihtX2FjdGl2ZVBhdGguZ2V0KCksIGNlbnRlciwgcmFkaXVzLCBmaXJzdEFyY0VuZCwgZW5kQW5n
bGUsIGNsb2Nrd2lzZSk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUmVjdChjb25zdCBGbG9hdFJlY3Qm
IHIpCit7CisgICAgQ09NUHRyPElEMkQxUmVjdGFuZ2xlR2VvbWV0cnk+IHJlY3RhbmdsZTsKKyAg
ICBIUkVTVUxUIGhyID0gR3JhcGhpY3NDb250ZXh0OjpzeXN0ZW1GYWN0b3J5KCktPkNyZWF0ZVJl
Y3RhbmdsZUdlb21ldHJ5KHN0YXRpY19jYXN0PEQyRDFfUkVDVF9GPihyKSwgJnJlY3RhbmdsZSk7
CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisgICAgYXBwZW5kR2VvbWV0cnko
cmVjdGFuZ2xlLmdldCgpKTsKK30KKwordm9pZCBQYXRoOjphZGRFbGxpcHNlKEZsb2F0UG9pbnQg
cCwgZmxvYXQgcmFkaXVzWCwgZmxvYXQgcmFkaXVzWSwgZmxvYXQgcm90YXRpb24sIGZsb2F0IHN0
YXJ0QW5nbGUsIGZsb2F0IGVuZEFuZ2xlLCBib29sIGFudGljbG9ja3dpc2UpCit7CisgICAgQWZm
aW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKKyAgICB0cmFuc2Zvcm0udHJhbnNsYXRlKHAueCgpLCBw
LnkoKSkucm90YXRlKHJhZDJkZWcocm90YXRpb24pKS5zY2FsZShyYWRpdXNYLCByYWRpdXNZKTsK
KworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkRWxsaXBzZShjb25z
dCBGbG9hdFJlY3QmIHIpCit7CisgICAgQ09NUHRyPElEMkQxRWxsaXBzZUdlb21ldHJ5PiBlbGxp
cHNlOworICAgIEhSRVNVTFQgaHIgPSBHcmFwaGljc0NvbnRleHQ6OnN5c3RlbUZhY3RvcnkoKS0+
Q3JlYXRlRWxsaXBzZUdlb21ldHJ5KEQyRDE6OkVsbGlwc2UoRDJEMTo6UG9pbnQyRihyLmNlbnRl
cigpLngoKSwgci5jZW50ZXIoKS55KCkpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpLCAmZWxsaXBz
ZSk7CisgICAgUkVMRUFTRV9BU1NFUlQoU1VDQ0VFREVEKGhyKSk7CisgICAgYXBwZW5kR2VvbWV0
cnkoZWxsaXBzZS5nZXQoKSk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUGF0aChjb25zdCBQYXRoJiBw
YXRoLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAoIXBhdGgu
cGxhdGZvcm1QYXRoKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghdHJhbnNmb3JtLmlz
SW52ZXJ0aWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCisKK3ZvaWQgUGF0aDo6Y2xlYXIoKQoreworICAgIGlmIChpc051bGwoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKG1fcGF0aCkKKyAgICAgICAgbV9wYXRoLT5SZWxlYXNlKCk7CisK
KyAgICBtX3BhdGggPSBudWxscHRyOworICAgIG1fYWN0aXZlUGF0aCA9IG51bGxwdHI7CisgICAg
bV9hY3RpdmVQYXRoR2VvbWV0cnkgPSBudWxscHRyOworfQorCitib29sIFBhdGg6OmlzRW1wdHko
KSBjb25zdAoreworICAgIGlmIChpc051bGwoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAg
ICBpZiAoIW1fcGF0aC0+R2V0U291cmNlR2VvbWV0cnlDb3VudCgpKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQYXRoOjpoYXNDdXJyZW50UG9p
bnQoKSBjb25zdAoreworICAgIHJldHVybiAhaXNFbXB0eSgpOworfQorICAgIAorRmxvYXRQb2lu
dCBQYXRoOjpjdXJyZW50UG9pbnQoKSBjb25zdCAKK3sKKyAgICBpZiAoaXNOdWxsKCkpCisgICAg
ICAgIHJldHVybiBGbG9hdFBvaW50KCk7CisKKyAgICBmbG9hdCBsZW5ndGg7CisgICAgSFJFU1VM
VCBociA9IG1fcGF0aC0+Q29tcHV0ZUxlbmd0aChudWxscHRyLCAmbGVuZ3RoKTsKKyAgICBpZiAo
IVNVQ0NFRURFRChocikpCisgICAgICAgIHJldHVybiBGbG9hdFBvaW50KCk7CisKKyAgICBEMkQx
X1BPSU5UXzJGIHBvaW50ID0geyB9OworICAgIEQyRDFfUE9JTlRfMkYgdGFuZ2VudCA9IHsgfTsK
KyAgICBociA9IG1fcGF0aC0+Q29tcHV0ZVBvaW50QXRMZW5ndGgobGVuZ3RoLCBudWxscHRyLCAm
cG9pbnQsICZ0YW5nZW50KTsKKyAgICBpZiAoIVNVQ0NFRURFRChocikpCisgICAgICAgIHJldHVy
biBGbG9hdFBvaW50KCk7CisKKyAgICByZXR1cm4gcG9pbnQ7Cit9CisKK3ZvaWQgUGF0aDo6YXBw
bHkoY29uc3QgUGF0aEFwcGxpZXJGdW5jdGlvbiYgZnVuY3Rpb24pIGNvbnN0Cit7CisgICAgaWYg
KGlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
Cit9CisKKyNlbmRpZiAvLyBVU0UoRElSRUNUMkQpCg==
</data>
<flag name="review"
          id="313836"
          type_id="1"
          status="+"
          setter="achristensen"
    />
          </attachment>
      

    </bug>

</bugzilla>