<?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>94574</bug_id>
          
          <creation_ts>2012-08-20 23:04:54 -0700</creation_ts>
          <short_desc>[V8] Remove String::New() from V8 binding (Part 1)</short_desc>
          <delta_ts>2012-08-22 23:50:52 -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 JavaScript</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></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>93095</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kentaro Hara">haraken</reporter>
          <assigned_to name="Kentaro Hara">haraken</assigned_to>
          <cc>abarth</cc>
    
    <cc>japhet</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>700493</commentid>
    <comment_count>0</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-08-20 23:04:54 -0700</bug_when>
    <thetext>Currently, V8 binding mixes String::New(), String::NewSymbol() and v8String().

String::New() should be replaced with String::NewSymbol() or v8String(), depending on use cases:

- If it is a symbol (e.g. attribute name, constant string, etc), String::NewSymbol() should be used. Cache of the created symbols is managed by V8.

- If it is not a symbol, v8String() should be used. Cache of the created strings is managed by V8 binding (i.e. StringCache class).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700495</commentid>
    <comment_count>1</comment_count>
      <attachid>159624</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-08-20 23:07:06 -0700</bug_when>
    <thetext>Created attachment 159624
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700542</commentid>
    <comment_count>2</comment_count>
      <attachid>159624</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-21 00:33:25 -0700</bug_when>
    <thetext>Comment on attachment 159624
Patch

Clearing flags on attachment: 159624

Committed r126141: &lt;http://trac.webkit.org/changeset/126141&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700543</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-21 00:33:28 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700618</commentid>
    <comment_count>4</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-08-21 04:39:22 -0700</bug_when>
    <thetext>(In reply to comment #0)
&gt; - If it is a symbol (e.g. attribute name, constant string, etc), String::NewSymbol() should be used. Cache of the created symbols is managed by V8.
&gt; 
&gt; - If it is not a symbol, v8String() should be used. Cache of the created strings is managed by V8 binding (i.e. StringCache class).

This approach looks bad... I found that v8::String::NewSymbol() is much slower than v8String(). We should _always_ use v8String().

I measured the performance:

// 83 nano sec
static v8::Handle&lt;v8::Value&gt; attr1AttrGetter(v8::Local&lt;v8::String&gt; name, const v8::AccessorInfo&amp; info)
{
    static String str1 = String(&quot;foo&quot;);
    static String str2 = String(&quot;foo&quot;);
    v8::Handle&lt;v8::Value&gt; v1 = v8String(str1);
    v8::Handle&lt;v8::Value&gt; v2 = v8String(str2);
    if (!v1.IsEmpty() &amp;&amp; !v2.IsEmpty())
        return v8Undefined();
    return v8::Null(); // Never reach.
}

// 86 nano sec
static v8::Handle&lt;v8::Value&gt; attr2AttrGetter(v8::Local&lt;v8::String&gt; name, const v8::AccessorInfo&amp; info)
{
    static String str1 = String(&quot;foo&quot;);
    static String str2 = String(&quot;bar&quot;);
    v8::Handle&lt;v8::Value&gt; v1 = v8String(str1);
    v8::Handle&lt;v8::Value&gt; v2 = v8String(str2);
    if (!v1.IsEmpty() &amp;&amp; !v2.IsEmpty())
        return v8Undefined();
    return v8::Null(); // Never reach.
}

// 376 nano sec
static v8::Handle&lt;v8::Value&gt; attr3AttrGetter(v8::Local&lt;v8::String&gt; name, const v8::AccessorInfo&amp; info)
{
    v8::Handle&lt;v8::Value&gt; v1 = v8::String::NewSymbol(&quot;foo&quot;, 3);
    v8::Handle&lt;v8::Value&gt; v2 = v8::String::NewSymbol(&quot;foo&quot;, 3);
    if (!v1.IsEmpty() &amp;&amp; !v2.IsEmpty())
        return v8Undefined();
    return v8::Null(); // Never reach.
}

// 377 nano sec
static v8::Handle&lt;v8::Value&gt; attr4AttrGetter(v8::Local&lt;v8::String&gt; name, const v8::AccessorInfo&amp; info)
{
    v8::Handle&lt;v8::Value&gt; v1 = v8::String::NewSymbol(&quot;foo&quot;, 3);
    v8::Handle&lt;v8::Value&gt; v2 = v8::String::NewSymbol(&quot;bar&quot;, 3);
    if (!v1.IsEmpty() &amp;&amp; !v2.IsEmpty())
        return v8Undefined();
    return v8::Null(); // Never reach.
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700774</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-21 08:14:08 -0700</bug_when>
    <thetext>Presumably there&apos;s a perf win when comparing symbols later or in memory because symbols can share the underlying storage of the characters.

Perhaps we should use symbols in places like template construction that we execute once and then use over and over again?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700800</commentid>
    <comment_count>6</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-08-21 08:38:41 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Presumably there&apos;s a perf win when comparing symbols later or in memory because symbols can share the underlying storage of the characters.

Maybe. But v8String() also shares the underlying storage (i.e. WebCoreStringResource). v8String() implements a couple of fast paths to access cached WebCoreStringResource, which I think would be the reason why v8String() shows a better performance than v8::String::NewSymbol().

&gt; Perhaps we should use symbols in places like template construction that we execute once and then use over and over again?

Specifically, what kind of code are you assuming?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700802</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-21 08:44:11 -0700</bug_when>
    <thetext>&gt; Specifically, what kind of code are you assuming?

The code in the V8 bindings that uses the term &quot;template&quot;.  Specifically, it&apos;s code that we run at startup to teach V8 how to make various DOM objects.  We build &quot;template&quot; objects in V8 that we then clone when we want to instantiate a DOM object.

I&apos;m just guessing at what NewSymbol does based on how symbolized strings are used in similar VMs.  Typically, they&apos;re optimized for comparison operations, like AtomicString in WebCore.  I don&apos;t actually know if they&apos;re useful for us.  I&apos;m just speculating.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700810</commentid>
    <comment_count>8</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-08-21 09:01:55 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt; Specifically, what kind of code are you assuming?
&gt; 
&gt; The code in the V8 bindings that uses the term &quot;template&quot;.  Specifically, it&apos;s code that we run at startup to teach V8 how to make various DOM objects.  We build &quot;template&quot; objects in V8 that we then clone when we want to instantiate a DOM object.

Got it... But the result in https://bugs.webkit.org/show_bug.cgi?id=94588#c1 implies that v8String() would be faster than v8::String::NewSymbol() even for the &quot;template&quot; code?

In the results I confirmed that:

  for (i = 0; i &lt; 1000000; i++)
    v8String(String(&quot;foo&quot;));

is faster than

  for (i = 0; i &lt; 1000000; i++)
    v8::String::NewSymbol(&quot;foo&quot;);

and that

  for (i = 0; i &lt; 1000000; i++)
    v8String(String(&quot;foo&quot;)); v8String(String(&quot;bar&quot;));

is faster than

  for (i = 0; i &lt; 1000000; i++)
    v8::String::NewSymbol(&quot;foo&quot;); v8::String::NewSymbol(&quot;bar&quot;);

Or should I measure the performance with a lot of more strings?

&gt; I&apos;m just guessing at what NewSymbol does based on how symbolized strings are used in similar VMs.  Typically, they&apos;re optimized for comparison operations, like AtomicString in WebCore.  I don&apos;t actually know if they&apos;re useful for us.  I&apos;m just speculating.

FYI, in case of v8String(), StringCache manages:

- a persistent handle of the most recently accessed StringImpl()
- a hashmap from StringImpl()s to persistent handles.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700832</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-21 09:29:27 -0700</bug_when>
    <thetext>You&apos;re just measuring creation.  What about comparison of the strings?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>702738</commentid>
    <comment_count>10</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2012-08-22 23:50:52 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; You&apos;re just measuring creation.  What about comparison of the strings?

abarth: You&apos;re quite right. I had a discussion with the V8 team.

[1] String comparison of String::NewSymbol() is faster than string comparison of String::New(). Thus we should use String::NewSymbol() for symbols, and String::New() for other strings.

Note: The string comparison is done when properties are looked up in V8, but it just affects the performance of property accesses through V8 APIs (e.g. Get(), Set(), Has(), etc). It does not affect the performance of property accesses in JIT code (i.e. it does not affect the overhead of calling back xxxAttrGetter()/xxxAttrSetter()). I confirmed it.

[2] We can improve the performance by using a persistent handle for String::NewSymbol().

  object-&gt;Set(String::NewSymbol(&quot;foo&quot;)); // Local handle A.
  object-&gt;Get(String::NewSymbol(&quot;foo&quot;)); // Local handle B. Given that local handle B is different from local handle A, V8 needs to compare two symbols.

  Persistent&lt;String&gt; handle = Persistent&lt;String&gt;::New(String::NewSymbol(&quot;foo&quot;));
  object-&gt;Set(handle); // Persistent handle A.
  object-&gt;Get(handle); // Persistent handle A. Given that two persistent handles are identical, V8 just needs to compare two handles. This is faster than comparing two symbols.

This persistent handle won&apos;t cause memory bloat. Given that the string contents (e.g. &quot;foo&quot;) are already stored in object, the additional memory required for the persistent handle is just two pointers per persistent handle (according to the V8 team).


[1] is easy to implement. So I&apos;ll do [1] from now.

[2] will require a substantial amount of work. Furthermore, as mentioned above, it just affects the performance of property accesses through V8 APIs. We are not sure how critical the performance is in the real world. So I&apos;ll do [2] when I find that it is critical.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>159624</attachid>
            <date>2012-08-20 23:07:06 -0700</date>
            <delta_ts>2012-08-21 00:33:25 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-94574-20120821150625.patch</filename>
            <type>text/plain</type>
            <size>26985</size>
            <attacher name="Kentaro Hara">haraken</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI2MTI4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZTgzNDUzMGFhYWZjZjNm
YjMyNTk0YmI3YTVmNGVmOTAzNDJlMjk2Ny4uMTQ5MzY1ODUzODQ1Y2QyYmMzMmY3YTdmOWY2OGU0
YjE3ZTUxYTY1YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ4IEBACisyMDEyLTA4LTIwICBLZW50
YXJvIEhhcmEgIDxoYXJha2VuQGNocm9taXVtLm9yZz4KKworICAgICAgICBbVjhdIFJlbW92ZSBT
dHJpbmc6Ok5ldygpIGZyb20gVjggYmluZGluZyAoUGFydCAxKQorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTQ1NzQKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBDdXJyZW50bHksIFY4IGJpbmRpbmcgbWl4ZXMg
U3RyaW5nOjpOZXcoKSwgU3RyaW5nOjpOZXdTeW1ib2woKSBhbmQgdjhTdHJpbmcoKS4KKyAgICAg
ICAgU3RyaW5nOjpOZXcoKSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBTdHJpbmc6Ok5ld1N5bWJv
bCgpIG9yIHY4U3RyaW5nKCksCisgICAgICAgIGRlcGVuZGluZyBvbiB1c2UgY2FzZXM6CisKKyAg
ICAgICAgLSBJZiBpdCBpcyBhIHN5bWJvbCAoZS5nLiBhdHRyaWJ1dGUgbmFtZSwgY29uc3RhbnQg
c3RyaW5nLCBldGMpLAorICAgICAgICBTdHJpbmc6Ok5ld1N5bWJvbCgpIHNob3VsZCBiZSB1c2Vk
LiBDYWNoZSBvZiBjcmVhdGVkIHN5bWJvbHMgaXMgbWFuYWdlZCBieSBWOC4KKworICAgICAgICAt
IElmIGl0IGlzIG5vdCBhIHN5bWJvbCwgdjhTdHJpbmcoKSBzaG91bGQgYmUgdXNlZC4gQ2FjaGUg
b2YgY3JlYXRlZCBzdHJpbmdzCisgICAgICAgIGlzIG1hbmFnZWQgYnkgVjggYmluZGluZyAoaS5l
LiBTdHJpbmdDYWNoZSBjbGFzcykuCisKKyAgICAgICAgVGhpcyBwYXRjaCByZXBsYWNlcyBTdHJp
bmc6Ok5ldygpIGZvciBzeW1ib2xzIHdpdGggU3RyaW5nOjpOZXdTeW1ib2woKS4KKworICAgICAg
ICBObyB0ZXN0cy4gTm8gY2hhbmdlIGluIGJlaGF2aW9yLgorCisgICAgICAgICogYmluZGluZ3Mv
c2NyaXB0cy9Db2RlR2VuZXJhdG9yVjgucG06CisgICAgICAgIChHZW5lcmF0ZU5hbWVkQ29uc3Ry
dWN0b3JDYWxsYmFjayk6CisgICAgICAgIChHZW5lcmF0ZU5vblN0YW5kYXJkRnVuY3Rpb24pOgor
ICAgICAgICAoR2VuZXJhdGVJbXBsZW1lbnRhdGlvbik6CisgICAgICAgICogYmluZGluZ3Mvc2Ny
aXB0cy90ZXN0L1Y4L1Y4RmxvYXQ2NEFycmF5LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbmZp
Z3VyZVY4RmxvYXQ2NEFycmF5VGVtcGxhdGUpOgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMv
dGVzdC9WOC9WOFRlc3RBY3RpdmVET01PYmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29u
ZmlndXJlVjhUZXN0QWN0aXZlRE9NT2JqZWN0VGVtcGxhdGUpOgorICAgICAgICAqIGJpbmRpbmdz
L3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RFdmVudFRhcmdldC5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDb25maWd1cmVWOFRlc3RFdmVudFRhcmdldFRlbXBsYXRlKToKKyAgICAgICAgKiBiaW5kaW5n
cy9zY3JpcHRzL3Rlc3QvVjgvVjhUZXN0SW50ZXJmYWNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkNvbmZpZ3VyZVY4VGVzdEludGVyZmFjZVRlbXBsYXRlKToKKyAgICAgICAgKiBiaW5kaW5ncy9z
Y3JpcHRzL3Rlc3QvVjgvVjhUZXN0TmFtZWRDb25zdHJ1Y3Rvci5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpWOFRlc3ROYW1lZENvbnN0cnVjdG9yQ29uc3RydWN0b3I6OkdldFRlbXBsYXRlKToKKyAg
ICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgvVjhUZXN0T2JqLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkNvbmZpZ3VyZVY4VGVzdE9ialRlbXBsYXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OlY4VGVzdE9iajo6aW5zdGFsbFBlckNvbnRleHRQcm9wZXJ0aWVzKToKKyAgICAgICAgKiBiaW5k
aW5ncy92OC9WOERPTUNvbmZpZ3VyYXRpb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhET01D
b25maWd1cmF0aW9uOjpiYXRjaENvbmZpZ3VyZUNvbnN0YW50cyk6CisgICAgICAgIChXZWJDb3Jl
OjpWOERPTUNvbmZpZ3VyYXRpb246OmJhdGNoQ29uZmlndXJlQ2FsbGJhY2tzKToKKyAgICAgICAg
KFdlYkNvcmU6OlY4RE9NQ29uZmlndXJhdGlvbjo6Y29uZmlndXJlVGVtcGxhdGUpOgorICAgICAg
ICAqIGJpbmRpbmdzL3Y4L1Y4RE9NQ29uZmlndXJhdGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6
VjhET01Db25maWd1cmF0aW9uOjpjb25maWd1cmVBdHRyaWJ1dGUpOgorCiAyMDEyLTA4LTIwICBT
aGlueWEgS2F3YW5ha2EgIDxzaGlueWFrQGNocm9taXVtLm9yZz4KIAogICAgICAgICBTaGFkb3dS
b290LmNsb25lTm9kZSgpIG11c3QgYWx3YXlzIHRocm93IGEgREFUQV9DTE9ORV9FUlIgZXhjZXB0
aW9uLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9Db2RlR2Vu
ZXJhdG9yVjgucG0gYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0
b3JWOC5wbQppbmRleCBiZjYzNjc4NGEyODFjZGEyZDA0M2FjNGU4ZjRkYWU3OTM3NDk1OWQ2Li4y
YzE3MGUyYzkyNDA4NWMwNjA2NDM2ZjIwN2YwOTI2YWJiYTAzNmZhIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5wbQpAQCAtMjA5OCw3
ICsyMDk4LDcgQEAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IFY4JHtpbXBs
Q2xhc3NOYW1lfUNvbnN0cnVjdG9yOjpHZXRUZW1wbGF0ZSgKIAogICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlID0gcmVzdWx0LT5JbnN0YW5jZVRlbXBsYXRlKCk7CiAg
ICAgaW5zdGFuY2UtPlNldEludGVybmFsRmllbGRDb3VudChWOCR7aW1wbENsYXNzTmFtZX06Omlu
dGVybmFsRmllbGRDb3VudCk7Ci0gICAgcmVzdWx0LT5TZXRDbGFzc05hbWUodjg6OlN0cmluZzo6
TmV3KCIke2ltcGxDbGFzc05hbWV9IikpOworICAgIHJlc3VsdC0+U2V0Q2xhc3NOYW1lKHY4OjpT
dHJpbmc6Ok5ld1N5bWJvbCgiJHtpbXBsQ2xhc3NOYW1lfSIpKTsKICAgICByZXN1bHQtPkluaGVy
aXQoVjgke2ltcGxDbGFzc05hbWV9OjpHZXRUZW1wbGF0ZSgpKTsKIAogICAgIGNhY2hlZFRlbXBs
YXRlID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcocmVzdWx0KTsK
QEAgLTIyOTgsNyArMjI5OCw3IEBAIHN1YiBHZW5lcmF0ZU5vblN0YW5kYXJkRnVuY3Rpb24KICAg
ICAgICAgcHVzaChAaW1wbENvbnRlbnQsIDw8RU5EKTsKIAogICAgIC8vICRjb21tZW50SW5mbwot
ICAgICR7Y29uZGl0aW9uYWx9JHRlbXBsYXRlLT5TZXRBY2Nlc3Nvcih2ODo6U3RyaW5nOjpOZXco
IiRuYW1lIiksICR7aW50ZXJmYWNlTmFtZX1WOEludGVybmFsOjoke25hbWV9QXR0ckdldHRlciwg
JHtpbnRlcmZhY2VOYW1lfVY4SW50ZXJuYWw6OiR7aW50ZXJmYWNlTmFtZX1Eb21haW5TYWZlRnVu
Y3Rpb25TZXR0ZXIsIHY4VW5kZWZpbmVkKCksIHY4OjpBTExfQ0FOX1JFQUQsIHN0YXRpY19jYXN0
PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4oJHByb3BlcnR5X2F0dHJpYnV0ZXMpKTsKKyAgICAke2Nv
bmRpdGlvbmFsfSR0ZW1wbGF0ZS0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3U3ltYm9sKCIk
bmFtZSIpLCAke2ludGVyZmFjZU5hbWV9VjhJbnRlcm5hbDo6JHtuYW1lfUF0dHJHZXR0ZXIsICR7
aW50ZXJmYWNlTmFtZX1WOEludGVybmFsOjoke2ludGVyZmFjZU5hbWV9RG9tYWluU2FmZUZ1bmN0
aW9uU2V0dGVyLCB2OFVuZGVmaW5lZCgpLCB2ODo6QUxMX0NBTl9SRUFELCBzdGF0aWNfY2FzdDx2
ODo6UHJvcGVydHlBdHRyaWJ1dGU+KCRwcm9wZXJ0eV9hdHRyaWJ1dGVzKSk7CiBFTkQKICAgICAg
ICAgcmV0dXJuOwogICAgIH0KQEAgLTIzMjksNyArMjMyOSw3IEBAIEVORAogICAgIG15ICRjb25k
aXRpb25hbFN0cmluZyA9ICRjb2RlR2VuZXJhdG9yLT5HZW5lcmF0ZUNvbmRpdGlvbmFsU3RyaW5n
KCRmdW5jdGlvbi0+c2lnbmF0dXJlKTsKICAgICBwdXNoKEBpbXBsQ29udGVudCwgIiNpZiAke2Nv
bmRpdGlvbmFsU3RyaW5nfVxuIikgaWYgJGNvbmRpdGlvbmFsU3RyaW5nOwogCi0gICAgcHVzaChA
aW1wbENvbnRlbnQsICIgICAgJHtjb25kaXRpb25hbH0kdGVtcGxhdGUtPlNldCh2ODo6U3RyaW5n
OjpOZXcoXCIkbmFtZVwiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldygkY2FsbGJhY2ssIHY4
VW5kZWZpbmVkKCksICR7c2lnbmF0dXJlfSkkcHJvcGVydHlfYXR0cmlidXRlcyk7XG4iKTsKKyAg
ICBwdXNoKEBpbXBsQ29udGVudCwgIiAgICAke2NvbmRpdGlvbmFsfSR0ZW1wbGF0ZS0+U2V0KHY4
OjpTdHJpbmc6Ok5ld1N5bWJvbChcIiRuYW1lXCIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3
KCRjYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgJHtzaWduYXR1cmV9KSRwcm9wZXJ0eV9hdHRyaWJ1
dGVzKTtcbiIpOwogCiAgICAgcHVzaChAaW1wbENvbnRlbnQsICIjZW5kaWYgLy8gJHtjb25kaXRp
b25hbFN0cmluZ31cbiIpIGlmICRjb25kaXRpb25hbFN0cmluZzsKIH0KQEAgLTI5NTEsOSArMjk1
MSw5IEBAIEVORAogCiAgICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoZXNlIGZ1bmN0aW9u
cyBhcmUgb24gdGhlIGluc3RhbmNlIGluc3RlYWQKICAgICAvLyBvZiBvbiB0aGUgcHJvdG90eXBl
IG9iamVjdCB0byBlbnN1cmUgdGhhdCB0aGV5IGNhbm5vdCBiZSBvdmVyd3JpdHRlbi4KLSAgICBp
bnN0YW5jZS0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3KCJyZWxvYWQiKSwgVjhMb2NhdGlv
bjo6cmVsb2FkQWNjZXNzb3JHZXR0ZXIsIDAsIHY4VW5kZWZpbmVkKCksIHY4OjpBTExfQ0FOX1JF
QUQsIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUgfCB2
ODo6UmVhZE9ubHkpKTsKLSAgICBpbnN0YW5jZS0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3
KCJyZXBsYWNlIiksIFY4TG9jYXRpb246OnJlcGxhY2VBY2Nlc3NvckdldHRlciwgMCwgdjhVbmRl
ZmluZWQoKSwgdjg6OkFMTF9DQU5fUkVBRCwgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmli
dXRlPih2ODo6RG9udERlbGV0ZSB8IHY4OjpSZWFkT25seSkpOwotICAgIGluc3RhbmNlLT5TZXRB
Y2Nlc3Nvcih2ODo6U3RyaW5nOjpOZXcoImFzc2lnbiIpLCBWOExvY2F0aW9uOjphc3NpZ25BY2Nl
c3NvckdldHRlciwgMCwgdjhVbmRlZmluZWQoKSwgdjg6OkFMTF9DQU5fUkVBRCwgc3RhdGljX2Nh
c3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6RG9udERlbGV0ZSB8IHY4OjpSZWFkT25seSkp
OworICAgIGluc3RhbmNlLT5TZXRBY2Nlc3Nvcih2ODo6U3RyaW5nOjpOZXdTeW1ib2woInJlbG9h
ZCIpLCBWOExvY2F0aW9uOjpyZWxvYWRBY2Nlc3NvckdldHRlciwgMCwgdjhVbmRlZmluZWQoKSwg
djg6OkFMTF9DQU5fUkVBRCwgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6
RG9udERlbGV0ZSB8IHY4OjpSZWFkT25seSkpOworICAgIGluc3RhbmNlLT5TZXRBY2Nlc3Nvcih2
ODo6U3RyaW5nOjpOZXdTeW1ib2woInJlcGxhY2UiKSwgVjhMb2NhdGlvbjo6cmVwbGFjZUFjY2Vz
c29yR2V0dGVyLCAwLCB2OFVuZGVmaW5lZCgpLCB2ODo6QUxMX0NBTl9SRUFELCBzdGF0aWNfY2Fz
dDx2ODo6UHJvcGVydHlBdHRyaWJ1dGU+KHY4OjpEb250RGVsZXRlIHwgdjg6OlJlYWRPbmx5KSk7
CisgICAgaW5zdGFuY2UtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiYXNzaWdu
IiksIFY4TG9jYXRpb246OmFzc2lnbkFjY2Vzc29yR2V0dGVyLCAwLCB2OFVuZGVmaW5lZCgpLCB2
ODo6QUxMX0NBTl9SRUFELCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRyaWJ1dGU+KHY4OjpE
b250RGVsZXRlIHwgdjg6OlJlYWRPbmx5KSk7CiBFTkQKICAgICB9CiAKQEAgLTMwNDAsNyArMzA0
MCw3IEBAIEVORAogICAgICAgICAgICAgICAgIG15ICRuYW1lID0gJHJ1bnRpbWVGdW5jLT5zaWdu
YXR1cmUtPm5hbWU7CiAgICAgICAgICAgICAgICAgbXkgJGNhbGxiYWNrID0gR2V0RnVuY3Rpb25U
ZW1wbGF0ZUNhbGxiYWNrTmFtZSgkcnVudGltZUZ1bmMsICRpbnRlcmZhY2VOYW1lKTsKICAgICAg
ICAgICAgICAgICBwdXNoKEBpbXBsQ29udGVudCwgPDxFTkQpOwotICAgICAgICBwcm90by0+U2V0
KHY4OjpTdHJpbmc6Ok5ldygiJHtuYW1lfSIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KCR7
Y2FsbGJhY2t9LCB2OFVuZGVmaW5lZCgpLCBkZWZhdWx0U2lnbmF0dXJlKS0+R2V0RnVuY3Rpb24o
KSk7CisgICAgICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCIke25hbWV9Iiks
IHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoJHtjYWxsYmFja30sIHY4VW5kZWZpbmVkKCksIGRl
ZmF1bHRTaWduYXR1cmUpLT5HZXRGdW5jdGlvbigpKTsKIEVORAogICAgICAgICAgICAgICAgIHB1
c2goQGltcGxDb250ZW50LCAiICAgIH1cbiIpOwogICAgICAgICAgICAgICAgIHB1c2goQGltcGxD
b250ZW50LCAiI2VuZGlmIC8vICR7Y29uZGl0aW9uYWxTdHJpbmd9XG4iKSBpZiAkY29uZGl0aW9u
YWxTdHJpbmc7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rl
c3QvVjgvVjhGbG9hdDY0QXJyYXkuY3BwIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0
cy90ZXN0L1Y4L1Y4RmxvYXQ2NEFycmF5LmNwcAppbmRleCA2NDU0YTk2ZmU4NzQ4OWIzMTBkNTE4
MTJlZmVjMDg3NWExYmMzNjlhLi41MzRhOGRlY2I2MWEzMDUxN2JiMWI5YzJlM2U3MWIyOWEyY2I2
MjFmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgv
VjhGbG9hdDY0QXJyYXkuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMv
dGVzdC9WOC9WOEZsb2F0NjRBcnJheS5jcHAKQEAgLTEwNyw3ICsxMDcsNyBAQCBzdGF0aWMgdjg6
OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IENvbmZpZ3VyZVY4RmxvYXQ2NEFycmF5
VGVtcGxhdGUodjg6OgogICAgIGNvbnN0IGludCBmb29BcmdjID0gMTsKICAgICB2ODo6SGFuZGxl
PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmb29Bcmd2W2Zvb0FyZ2NdID0geyBWOEZsb2F0MzJBcnJh
eTo6R2V0UmF3VGVtcGxhdGUoKSB9OwogICAgIHY4OjpIYW5kbGU8djg6OlNpZ25hdHVyZT4gZm9v
U2lnbmF0dXJlID0gdjg6OlNpZ25hdHVyZTo6TmV3KGRlc2MsIGZvb0FyZ2MsIGZvb0FyZ3YpOwot
ICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3KCJmb28iKSwgdjg6OkZ1bmN0aW9uVGVtcGxh
dGU6Ok5ldyhGbG9hdDY0QXJyYXlWOEludGVybmFsOjpmb29DYWxsYmFjaywgdjhVbmRlZmluZWQo
KSwgZm9vU2lnbmF0dXJlKSk7CisgICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2wo
ImZvbyIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KEZsb2F0NjRBcnJheVY4SW50ZXJuYWw6
OmZvb0NhbGxiYWNrLCB2OFVuZGVmaW5lZCgpLCBmb29TaWduYXR1cmUpKTsKIAogICAgIC8vIEN1
c3RvbSB0b1N0cmluZyB0ZW1wbGF0ZQogICAgIGRlc2MtPlNldChnZXRUb1N0cmluZ05hbWUoKSwg
Z2V0VG9TdHJpbmdUZW1wbGF0ZSgpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RBY3RpdmVET01PYmplY3QuY3BwIGIvU291cmNlL1dl
YkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdEFjdGl2ZURPTU9iamVjdC5jcHAK
aW5kZXggODg2Nzk4NDFlZjg3MjVjY2Y0OTUxYWNkNGU2ODRiY2IyZWE5ZTNmNy4uODZiMWZkMmM4
NjMxNmM2OGNmNDhiY2I5NTgyMzM3MDZjZjNiMzY5NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdEFjdGl2ZURPTU9iamVjdC5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdEFjdGl2ZURP
TU9iamVjdC5jcHAKQEAgLTEzNCwxMCArMTM0LDEwIEBAIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2
ODo6RnVuY3Rpb25UZW1wbGF0ZT4gQ29uZmlndXJlVjhUZXN0QWN0aXZlRE9NT2JqZWN0VGVtcGxh
CiAgICAgY29uc3QgaW50IGV4Y2l0aW5nRnVuY3Rpb25BcmdjID0gMTsKICAgICB2ODo6SGFuZGxl
PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBleGNpdGluZ0Z1bmN0aW9uQXJndltleGNpdGluZ0Z1bmN0
aW9uQXJnY10gPSB7IFY4Tm9kZTo6R2V0UmF3VGVtcGxhdGUoKSB9OwogICAgIHY4OjpIYW5kbGU8
djg6OlNpZ25hdHVyZT4gZXhjaXRpbmdGdW5jdGlvblNpZ25hdHVyZSA9IHY4OjpTaWduYXR1cmU6
Ok5ldyhkZXNjLCBleGNpdGluZ0Z1bmN0aW9uQXJnYywgZXhjaXRpbmdGdW5jdGlvbkFyZ3YpOwot
ICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3KCJleGNpdGluZ0Z1bmN0aW9uIiksIHY4OjpG
dW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdEFjdGl2ZURPTU9iamVjdFY4SW50ZXJuYWw6OmV4Y2l0
aW5nRnVuY3Rpb25DYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgZXhjaXRpbmdGdW5jdGlvblNpZ25h
dHVyZSkpOworICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJleGNpdGluZ0Z1
bmN0aW9uIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdEFjdGl2ZURPTU9iamVjdFY4
SW50ZXJuYWw6OmV4Y2l0aW5nRnVuY3Rpb25DYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgZXhjaXRp
bmdGdW5jdGlvblNpZ25hdHVyZSkpOwogCiAgICAgLy8gRnVuY3Rpb24gJ3Bvc3RNZXNzYWdlJyAo
RXh0QXR0cjogJ0RvTm90Q2hlY2tTZWN1cml0eScpCi0gICAgcHJvdG8tPlNldEFjY2Vzc29yKHY4
OjpTdHJpbmc6Ok5ldygicG9zdE1lc3NhZ2UiKSwgVGVzdEFjdGl2ZURPTU9iamVjdFY4SW50ZXJu
YWw6OnBvc3RNZXNzYWdlQXR0ckdldHRlciwgVGVzdEFjdGl2ZURPTU9iamVjdFY4SW50ZXJuYWw6
OlRlc3RBY3RpdmVET01PYmplY3REb21haW5TYWZlRnVuY3Rpb25TZXR0ZXIsIHY4VW5kZWZpbmVk
KCksIHY4OjpBTExfQ0FOX1JFQUQsIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4o
djg6OkRvbnREZWxldGUpKTsKKyAgICBwcm90by0+U2V0QWNjZXNzb3Iodjg6OlN0cmluZzo6TmV3
U3ltYm9sKCJwb3N0TWVzc2FnZSIpLCBUZXN0QWN0aXZlRE9NT2JqZWN0VjhJbnRlcm5hbDo6cG9z
dE1lc3NhZ2VBdHRyR2V0dGVyLCBUZXN0QWN0aXZlRE9NT2JqZWN0VjhJbnRlcm5hbDo6VGVzdEFj
dGl2ZURPTU9iamVjdERvbWFpblNhZmVGdW5jdGlvblNldHRlciwgdjhVbmRlZmluZWQoKSwgdjg6
OkFMTF9DQU5fUkVBRCwgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6RG9u
dERlbGV0ZSkpOwogCiAgICAgLy8gQ3VzdG9tIHRvU3RyaW5nIHRlbXBsYXRlCiAgICAgZGVzYy0+
U2V0KGdldFRvU3RyaW5nTmFtZSgpLCBnZXRUb1N0cmluZ1RlbXBsYXRlKCkpOwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdEV2ZW50VGFy
Z2V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RF
dmVudFRhcmdldC5jcHAKaW5kZXggYjdmMWE0OWY4OWIwYjM5MWVlOGU5MWM0ZmU4MzU4MmVmZThi
MTY4OS4uY2QyMDc2YzQwZGIyMGY2MjdlNmNmZDE4YzA4YzJhMjVmNWUxZTlmNiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdEV2ZW50VGFy
Z2V0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgvVjhU
ZXN0RXZlbnRUYXJnZXQuY3BwCkBAIC0xMzEsNyArMTMxLDcgQEAgc3RhdGljIHY4OjpQZXJzaXN0
ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBDb25maWd1cmVWOFRlc3RFdmVudFRhcmdldFRlbXBs
YXRlKHYKICAgICBjb25zdCBpbnQgZGlzcGF0Y2hFdmVudEFyZ2MgPSAxOwogICAgIHY4OjpIYW5k
bGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRpc3BhdGNoRXZlbnRBcmd2W2Rpc3BhdGNoRXZlbnRB
cmdjXSA9IHsgVjhFdmVudDo6R2V0UmF3VGVtcGxhdGUoKSB9OwogICAgIHY4OjpIYW5kbGU8djg6
OlNpZ25hdHVyZT4gZGlzcGF0Y2hFdmVudFNpZ25hdHVyZSA9IHY4OjpTaWduYXR1cmU6Ok5ldyhk
ZXNjLCBkaXNwYXRjaEV2ZW50QXJnYywgZGlzcGF0Y2hFdmVudEFyZ3YpOwotICAgIHByb3RvLT5T
ZXQodjg6OlN0cmluZzo6TmV3KCJkaXNwYXRjaEV2ZW50IiksIHY4OjpGdW5jdGlvblRlbXBsYXRl
OjpOZXcoVGVzdEV2ZW50VGFyZ2V0VjhJbnRlcm5hbDo6ZGlzcGF0Y2hFdmVudENhbGxiYWNrLCB2
OFVuZGVmaW5lZCgpLCBkaXNwYXRjaEV2ZW50U2lnbmF0dXJlKSk7CisgICAgcHJvdG8tPlNldCh2
ODo6U3RyaW5nOjpOZXdTeW1ib2woImRpc3BhdGNoRXZlbnQiKSwgdjg6OkZ1bmN0aW9uVGVtcGxh
dGU6Ok5ldyhUZXN0RXZlbnRUYXJnZXRWOEludGVybmFsOjpkaXNwYXRjaEV2ZW50Q2FsbGJhY2ss
IHY4VW5kZWZpbmVkKCksIGRpc3BhdGNoRXZlbnRTaWduYXR1cmUpKTsKIAogICAgIC8vIEN1c3Rv
bSB0b1N0cmluZyB0ZW1wbGF0ZQogICAgIGRlc2MtPlNldChnZXRUb1N0cmluZ05hbWUoKSwgZ2V0
VG9TdHJpbmdUZW1wbGF0ZSgpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdz
L3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RJbnRlcmZhY2UuY3BwIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdEludGVyZmFjZS5jcHAKaW5kZXggYzY5MzRkN2M0
YTM1MDIwMTMyODBmZWM3NzNkNTM1ZmMxMzRiYTdlZi4uYWFhY2M4MWMxYmIzZTBkNjBjMTIzOThk
Zjc3N2M4YTY2ZWYxZTk2MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2Ny
aXB0cy90ZXN0L1Y4L1Y4VGVzdEludGVyZmFjZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdEludGVyZmFjZS5jcHAKQEAgLTI5NSwxMCArMjk1
LDEwIEBAIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gQ29uZmln
dXJlVjhUZXN0SW50ZXJmYWNlVGVtcGxhdGUodjg6CiAgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rp
b25UZW1wbGF0ZT4gc3VwcGxlbWVudGFsTWV0aG9kMkFyZ3Zbc3VwcGxlbWVudGFsTWV0aG9kMkFy
Z2NdID0geyB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPigpLCBWOFRlc3RPYmo6Okdl
dFJhd1RlbXBsYXRlKCkgfTsKICAgICB2ODo6SGFuZGxlPHY4OjpTaWduYXR1cmU+IHN1cHBsZW1l
bnRhbE1ldGhvZDJTaWduYXR1cmUgPSB2ODo6U2lnbmF0dXJlOjpOZXcoZGVzYywgc3VwcGxlbWVu
dGFsTWV0aG9kMkFyZ2MsIHN1cHBsZW1lbnRhbE1ldGhvZDJBcmd2KTsKICNpZiBFTkFCTEUoQ29u
ZGl0aW9uMTEpIHx8IEVOQUJMRShDb25kaXRpb24xMikKLSAgICBwcm90by0+U2V0KHY4OjpTdHJp
bmc6Ok5ldygic3VwcGxlbWVudGFsTWV0aG9kMiIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3
KFRlc3RJbnRlcmZhY2VWOEludGVybmFsOjpzdXBwbGVtZW50YWxNZXRob2QyQ2FsbGJhY2ssIHY4
VW5kZWZpbmVkKCksIHN1cHBsZW1lbnRhbE1ldGhvZDJTaWduYXR1cmUpKTsKKyAgICBwcm90by0+
U2V0KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgic3VwcGxlbWVudGFsTWV0aG9kMiIpLCB2ODo6RnVu
Y3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RJbnRlcmZhY2VWOEludGVybmFsOjpzdXBwbGVtZW50YWxN
ZXRob2QyQ2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIHN1cHBsZW1lbnRhbE1ldGhvZDJTaWduYXR1
cmUpKTsKICNlbmRpZiAvLyBFTkFCTEUoQ29uZGl0aW9uMTEpIHx8IEVOQUJMRShDb25kaXRpb24x
MikKICNpZiBFTkFCTEUoQ29uZGl0aW9uMTEpIHx8IEVOQUJMRShDb25kaXRpb24xMikKLSAgICBk
ZXNjLT5TZXQodjg6OlN0cmluZzo6TmV3KCJzdXBwbGVtZW50YWxNZXRob2Q0IiksIHY4OjpGdW5j
dGlvblRlbXBsYXRlOjpOZXcoVGVzdEludGVyZmFjZVY4SW50ZXJuYWw6OnN1cHBsZW1lbnRhbE1l
dGhvZDRDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgdjg6OkxvY2FsPHY4OjpTaWduYXR1cmU+KCkp
KTsKKyAgICBkZXNjLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJzdXBwbGVtZW50YWxNZXRo
b2Q0IiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdEludGVyZmFjZVY4SW50ZXJuYWw6
OnN1cHBsZW1lbnRhbE1ldGhvZDRDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgdjg6OkxvY2FsPHY4
OjpTaWduYXR1cmU+KCkpKTsKICNlbmRpZiAvLyBFTkFCTEUoQ29uZGl0aW9uMTEpIHx8IEVOQUJM
RShDb25kaXRpb24xMikKICAgICBWOERPTUNvbmZpZ3VyYXRpb246OmJhdGNoQ29uZmlndXJlQ29u
c3RhbnRzKGRlc2MsIHByb3RvLCBUZXN0SW50ZXJmYWNlQ29uc3RzLCBXVEZfQVJSQVlfTEVOR1RI
KFRlc3RJbnRlcmZhY2VDb25zdHMpKTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdE5hbWVkQ29uc3RydWN0b3IuY3BwIGIvU291cmNl
L1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdE5hbWVkQ29uc3RydWN0b3Iu
Y3BwCmluZGV4IDZmOGQzNTY0YmE2MTZhNGUwOTQwZDg5MzkyM2QyMmU5NWM4MDIyOWUuLjc4YmQ4
ZDU5MjdlZWFmYmNmNDBhMzdlOWU1NzA0ZjQ5ODkwOGQyOWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3ROYW1lZENvbnN0cnVjdG9yLmNw
cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgvVjhUZXN0TmFt
ZWRDb25zdHJ1Y3Rvci5jcHAKQEAgLTk1LDcgKzk1LDcgQEAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1
bmN0aW9uVGVtcGxhdGU+IFY4VGVzdE5hbWVkQ29uc3RydWN0b3JDb25zdHJ1Y3Rvcjo6R2V0VGVt
cGwKIAogICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGluc3RhbmNlID0gcmVzdWx0
LT5JbnN0YW5jZVRlbXBsYXRlKCk7CiAgICAgaW5zdGFuY2UtPlNldEludGVybmFsRmllbGRDb3Vu
dChWOFRlc3ROYW1lZENvbnN0cnVjdG9yOjppbnRlcm5hbEZpZWxkQ291bnQpOwotICAgIHJlc3Vs
dC0+U2V0Q2xhc3NOYW1lKHY4OjpTdHJpbmc6Ok5ldygiVGVzdE5hbWVkQ29uc3RydWN0b3IiKSk7
CisgICAgcmVzdWx0LT5TZXRDbGFzc05hbWUodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJUZXN0TmFt
ZWRDb25zdHJ1Y3RvciIpKTsKICAgICByZXN1bHQtPkluaGVyaXQoVjhUZXN0TmFtZWRDb25zdHJ1
Y3Rvcjo6R2V0VGVtcGxhdGUoKSk7CiAKICAgICBjYWNoZWRUZW1wbGF0ZSA9IHY4OjpQZXJzaXN0
ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHJlc3VsdCk7CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgvVjhUZXN0T2JqLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RPYmouY3BwCmluZGV4IDgx
ZjM0YTA0NTRjMDQ4ODFlMzlmZTY0OTAyMjVlZGE3YjQ5MWQ4NjAuLmVkY2U5N2U3YWZjMzIxODgz
MTk2OWRlNWZmM2MyZDBkMDEzNzIwYmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RPYmouY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Jp
bmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RPYmouY3BwCkBAIC0yMTkyLDY1ICsyMTkyLDY1
IEBAIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gQ29uZmlndXJl
VjhUZXN0T2JqVGVtcGxhdGUodjg6OlBlcnNpCiAgICAgY29uc3QgaW50IHZvaWRNZXRob2RXaXRo
QXJnc0FyZ2MgPSAzOwogICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IHZvaWRN
ZXRob2RXaXRoQXJnc0FyZ3Zbdm9pZE1ldGhvZFdpdGhBcmdzQXJnY10gPSB7IHY4OjpIYW5kbGU8
djg6OkZ1bmN0aW9uVGVtcGxhdGU+KCksIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
KCksIFY4VGVzdE9iajo6R2V0UmF3VGVtcGxhdGUoKSB9OwogICAgIHY4OjpIYW5kbGU8djg6OlNp
Z25hdHVyZT4gdm9pZE1ldGhvZFdpdGhBcmdzU2lnbmF0dXJlID0gdjg6OlNpZ25hdHVyZTo6TmV3
KGRlc2MsIHZvaWRNZXRob2RXaXRoQXJnc0FyZ2MsIHZvaWRNZXRob2RXaXRoQXJnc0FyZ3YpOwot
ICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3KCJ2b2lkTWV0aG9kV2l0aEFyZ3MiKSwgdjg6
OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6dm9pZE1ldGhvZFdpdGhB
cmdzQ2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIHZvaWRNZXRob2RXaXRoQXJnc1NpZ25hdHVyZSkp
OworICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJ2b2lkTWV0aG9kV2l0aEFy
Z3MiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6dm9pZE1l
dGhvZFdpdGhBcmdzQ2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIHZvaWRNZXRob2RXaXRoQXJnc1Np
Z25hdHVyZSkpOwogCiAgICAgLy8gQ3VzdG9tIFNpZ25hdHVyZSAnTWV0aG9kV2l0aEFyZ3MnCiAg
ICAgY29uc3QgaW50IE1ldGhvZFdpdGhBcmdzQXJnYyA9IDM7CiAgICAgdjg6OkhhbmRsZTx2ODo6
RnVuY3Rpb25UZW1wbGF0ZT4gTWV0aG9kV2l0aEFyZ3NBcmd2W01ldGhvZFdpdGhBcmdzQXJnY10g
PSB7IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+KCksIHY4OjpIYW5kbGU8djg6OkZ1
bmN0aW9uVGVtcGxhdGU+KCksIFY4VGVzdE9iajo6R2V0UmF3VGVtcGxhdGUoKSB9OwogICAgIHY4
OjpIYW5kbGU8djg6OlNpZ25hdHVyZT4gTWV0aG9kV2l0aEFyZ3NTaWduYXR1cmUgPSB2ODo6U2ln
bmF0dXJlOjpOZXcoZGVzYywgTWV0aG9kV2l0aEFyZ3NBcmdjLCBNZXRob2RXaXRoQXJnc0FyZ3Yp
OwotICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3KCJNZXRob2RXaXRoQXJncyIpLCB2ODo6
RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjpNZXRob2RXaXRoQXJnc0Nh
bGxiYWNrLCB2OFVuZGVmaW5lZCgpLCBNZXRob2RXaXRoQXJnc1NpZ25hdHVyZSkpOworICAgIHBy
b3RvLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJNZXRob2RXaXRoQXJncyIpLCB2ODo6RnVu
Y3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjpNZXRob2RXaXRoQXJnc0NhbGxi
YWNrLCB2OFVuZGVmaW5lZCgpLCBNZXRob2RXaXRoQXJnc1NpZ25hdHVyZSkpOwogCiAgICAgLy8g
Q3VzdG9tIFNpZ25hdHVyZSAnb2JqTWV0aG9kV2l0aEFyZ3MnCiAgICAgY29uc3QgaW50IG9iak1l
dGhvZFdpdGhBcmdzQXJnYyA9IDM7CiAgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0
ZT4gb2JqTWV0aG9kV2l0aEFyZ3NBcmd2W29iak1ldGhvZFdpdGhBcmdzQXJnY10gPSB7IHY4OjpI
YW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+KCksIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVt
cGxhdGU+KCksIFY4VGVzdE9iajo6R2V0UmF3VGVtcGxhdGUoKSB9OwogICAgIHY4OjpIYW5kbGU8
djg6OlNpZ25hdHVyZT4gb2JqTWV0aG9kV2l0aEFyZ3NTaWduYXR1cmUgPSB2ODo6U2lnbmF0dXJl
OjpOZXcoZGVzYywgb2JqTWV0aG9kV2l0aEFyZ3NBcmdjLCBvYmpNZXRob2RXaXRoQXJnc0FyZ3Yp
OwotICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3KCJvYmpNZXRob2RXaXRoQXJncyIpLCB2
ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjpvYmpNZXRob2RXaXRo
QXJnc0NhbGxiYWNrLCB2OFVuZGVmaW5lZCgpLCBvYmpNZXRob2RXaXRoQXJnc1NpZ25hdHVyZSkp
OworICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJvYmpNZXRob2RXaXRoQXJn
cyIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjpvYmpNZXRo
b2RXaXRoQXJnc0NhbGxiYWNrLCB2OFVuZGVmaW5lZCgpLCBvYmpNZXRob2RXaXRoQXJnc1NpZ25h
dHVyZSkpOwogCiAgICAgLy8gQ3VzdG9tIFNpZ25hdHVyZSAnbWV0aG9kV2l0aFNlcXVlbmNlQXJn
JwogICAgIGNvbnN0IGludCBtZXRob2RXaXRoU2VxdWVuY2VBcmdBcmdjID0gMTsKICAgICB2ODo6
SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBtZXRob2RXaXRoU2VxdWVuY2VBcmdBcmd2W21l
dGhvZFdpdGhTZXF1ZW5jZUFyZ0FyZ2NdID0geyBWOHNlcXVlbmNlPFNjcmlwdFByb2ZpbGU+OjpH
ZXRSYXdUZW1wbGF0ZSgpIH07CiAgICAgdjg6OkhhbmRsZTx2ODo6U2lnbmF0dXJlPiBtZXRob2RX
aXRoU2VxdWVuY2VBcmdTaWduYXR1cmUgPSB2ODo6U2lnbmF0dXJlOjpOZXcoZGVzYywgbWV0aG9k
V2l0aFNlcXVlbmNlQXJnQXJnYywgbWV0aG9kV2l0aFNlcXVlbmNlQXJnQXJndik7Ci0gICAgcHJv
dG8tPlNldCh2ODo6U3RyaW5nOjpOZXcoIm1ldGhvZFdpdGhTZXF1ZW5jZUFyZyIpLCB2ODo6RnVu
Y3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjptZXRob2RXaXRoU2VxdWVuY2VB
cmdDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgbWV0aG9kV2l0aFNlcXVlbmNlQXJnU2lnbmF0dXJl
KSk7CisgICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woIm1ldGhvZFdpdGhTZXF1
ZW5jZUFyZyIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjpt
ZXRob2RXaXRoU2VxdWVuY2VBcmdDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgbWV0aG9kV2l0aFNl
cXVlbmNlQXJnU2lnbmF0dXJlKSk7CiAKICAgICAvLyBDdXN0b20gU2lnbmF0dXJlICdtZXRob2RU
aGF0UmVxdWlyZXNBbGxBcmdzQW5kVGhyb3dzJwogICAgIGNvbnN0IGludCBtZXRob2RUaGF0UmVx
dWlyZXNBbGxBcmdzQW5kVGhyb3dzQXJnYyA9IDI7CiAgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rp
b25UZW1wbGF0ZT4gbWV0aG9kVGhhdFJlcXVpcmVzQWxsQXJnc0FuZFRocm93c0FyZ3ZbbWV0aG9k
VGhhdFJlcXVpcmVzQWxsQXJnc0FuZFRocm93c0FyZ2NdID0geyB2ODo6SGFuZGxlPHY4OjpGdW5j
dGlvblRlbXBsYXRlPigpLCBWOFRlc3RPYmo6OkdldFJhd1RlbXBsYXRlKCkgfTsKICAgICB2ODo6
SGFuZGxlPHY4OjpTaWduYXR1cmU+IG1ldGhvZFRoYXRSZXF1aXJlc0FsbEFyZ3NBbmRUaHJvd3NT
aWduYXR1cmUgPSB2ODo6U2lnbmF0dXJlOjpOZXcoZGVzYywgbWV0aG9kVGhhdFJlcXVpcmVzQWxs
QXJnc0FuZFRocm93c0FyZ2MsIG1ldGhvZFRoYXRSZXF1aXJlc0FsbEFyZ3NBbmRUaHJvd3NBcmd2
KTsKLSAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ldygibWV0aG9kVGhhdFJlcXVpcmVzQWxs
QXJnc0FuZFRocm93cyIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVy
bmFsOjptZXRob2RUaGF0UmVxdWlyZXNBbGxBcmdzQW5kVGhyb3dzQ2FsbGJhY2ssIHY4VW5kZWZp
bmVkKCksIG1ldGhvZFRoYXRSZXF1aXJlc0FsbEFyZ3NBbmRUaHJvd3NTaWduYXR1cmUpKTsKLSAg
ICBkZXNjLT5TZXQodjg6OlN0cmluZzo6TmV3KCJjbGFzc01ldGhvZCIpLCB2ODo6RnVuY3Rpb25U
ZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjpjbGFzc01ldGhvZENhbGxiYWNrLCB2OFVu
ZGVmaW5lZCgpLCB2ODo6TG9jYWw8djg6OlNpZ25hdHVyZT4oKSkpOwotICAgIGRlc2MtPlNldCh2
ODo6U3RyaW5nOjpOZXcoImNsYXNzTWV0aG9kV2l0aE9wdGlvbmFsIiksIHY4OjpGdW5jdGlvblRl
bXBsYXRlOjpOZXcoVGVzdE9ialY4SW50ZXJuYWw6OmNsYXNzTWV0aG9kV2l0aE9wdGlvbmFsQ2Fs
bGJhY2ssIHY4VW5kZWZpbmVkKCksIHY4OjpMb2NhbDx2ODo6U2lnbmF0dXJlPigpKSk7Ci0gICAg
ZGVzYy0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiY2xhc3NNZXRob2QyIiksIHY4OjpGdW5jdGlvblRl
bXBsYXRlOjpOZXcoVjhUZXN0T2JqOjpjbGFzc01ldGhvZDJDYWxsYmFjaywgdjhVbmRlZmluZWQo
KSwgdjg6OkxvY2FsPHY4OjpTaWduYXR1cmU+KCkpKTsKKyAgICBwcm90by0+U2V0KHY4OjpTdHJp
bmc6Ok5ld1N5bWJvbCgibWV0aG9kVGhhdFJlcXVpcmVzQWxsQXJnc0FuZFRocm93cyIpLCB2ODo6
RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjptZXRob2RUaGF0UmVxdWly
ZXNBbGxBcmdzQW5kVGhyb3dzQ2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIG1ldGhvZFRoYXRSZXF1
aXJlc0FsbEFyZ3NBbmRUaHJvd3NTaWduYXR1cmUpKTsKKyAgICBkZXNjLT5TZXQodjg6OlN0cmlu
Zzo6TmV3U3ltYm9sKCJjbGFzc01ldGhvZCIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRl
c3RPYmpWOEludGVybmFsOjpjbGFzc01ldGhvZENhbGxiYWNrLCB2OFVuZGVmaW5lZCgpLCB2ODo6
TG9jYWw8djg6OlNpZ25hdHVyZT4oKSkpOworICAgIGRlc2MtPlNldCh2ODo6U3RyaW5nOjpOZXdT
eW1ib2woImNsYXNzTWV0aG9kV2l0aE9wdGlvbmFsIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpO
ZXcoVGVzdE9ialY4SW50ZXJuYWw6OmNsYXNzTWV0aG9kV2l0aE9wdGlvbmFsQ2FsbGJhY2ssIHY4
VW5kZWZpbmVkKCksIHY4OjpMb2NhbDx2ODo6U2lnbmF0dXJlPigpKSk7CisgICAgZGVzYy0+U2V0
KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiY2xhc3NNZXRob2QyIiksIHY4OjpGdW5jdGlvblRlbXBs
YXRlOjpOZXcoVjhUZXN0T2JqOjpjbGFzc01ldGhvZDJDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwg
djg6OkxvY2FsPHY4OjpTaWduYXR1cmU+KCkpKTsKICNpZiBFTkFCTEUoQ29uZGl0aW9uMSkKLSAg
ICBkZXNjLT5TZXQodjg6OlN0cmluZzo6TmV3KCJvdmVybG9hZGVkTWV0aG9kMSIpLCB2ODo6RnVu
Y3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjpvdmVybG9hZGVkTWV0aG9kMUNh
bGxiYWNrLCB2OFVuZGVmaW5lZCgpLCB2ODo6TG9jYWw8djg6OlNpZ25hdHVyZT4oKSkpOworICAg
IGRlc2MtPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woIm92ZXJsb2FkZWRNZXRob2QxIiksIHY4
OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdE9ialY4SW50ZXJuYWw6Om92ZXJsb2FkZWRNZXRo
b2QxQ2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIHY4OjpMb2NhbDx2ODo6U2lnbmF0dXJlPigpKSk7
CiAjZW5kaWYgLy8gRU5BQkxFKENvbmRpdGlvbjEpCiAgICAgaWYgKFJ1bnRpbWVFbmFibGVkRmVh
dHVyZXM6OmVuYWJsZWRBdFJ1bnRpbWVNZXRob2QxRW5hYmxlZCgpKQotICAgICAgICBwcm90by0+
U2V0KHY4OjpTdHJpbmc6Ok5ldygiZW5hYmxlZEF0UnVudGltZU1ldGhvZDEiKSwgdjg6OkZ1bmN0
aW9uVGVtcGxhdGU6Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6ZW5hYmxlZEF0UnVudGltZU1ldGhv
ZDFDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgZGVmYXVsdFNpZ25hdHVyZSkpOworICAgICAgICBw
cm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiZW5hYmxlZEF0UnVudGltZU1ldGhvZDEi
KSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6ZW5hYmxlZEF0
UnVudGltZU1ldGhvZDFDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgZGVmYXVsdFNpZ25hdHVyZSkp
OwogICAgIGlmIChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpmZWF0dXJlTmFtZUVuYWJsZWQoKSkK
LSAgICAgICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXcoImVuYWJsZWRBdFJ1bnRpbWVNZXRo
b2QyIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdE9ialY4SW50ZXJuYWw6OmVuYWJs
ZWRBdFJ1bnRpbWVNZXRob2QyQ2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIGRlZmF1bHRTaWduYXR1
cmUpKTsKKyAgICAgICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woImVuYWJsZWRB
dFJ1bnRpbWVNZXRob2QyIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdE9ialY4SW50
ZXJuYWw6OmVuYWJsZWRBdFJ1bnRpbWVNZXRob2QyQ2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIGRl
ZmF1bHRTaWduYXR1cmUpKTsKIAogICAgIC8vIEN1c3RvbSBTaWduYXR1cmUgJ2NvbnZlcnQxJwog
ICAgIGNvbnN0IGludCBjb252ZXJ0MUFyZ2MgPSAxOwogICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0
aW9uVGVtcGxhdGU+IGNvbnZlcnQxQXJndltjb252ZXJ0MUFyZ2NdID0geyBWOGE6OkdldFJhd1Rl
bXBsYXRlKCkgfTsKICAgICB2ODo6SGFuZGxlPHY4OjpTaWduYXR1cmU+IGNvbnZlcnQxU2lnbmF0
dXJlID0gdjg6OlNpZ25hdHVyZTo6TmV3KGRlc2MsIGNvbnZlcnQxQXJnYywgY29udmVydDFBcmd2
KTsKLSAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiY29udmVydDEiKSwgdjg6OkZ1bmN0
aW9uVGVtcGxhdGU6Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6Y29udmVydDFDYWxsYmFjaywgdjhV
bmRlZmluZWQoKSwgY29udmVydDFTaWduYXR1cmUpKTsKKyAgICBwcm90by0+U2V0KHY4OjpTdHJp
bmc6Ok5ld1N5bWJvbCgiY29udmVydDEiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0
T2JqVjhJbnRlcm5hbDo6Y29udmVydDFDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgY29udmVydDFT
aWduYXR1cmUpKTsKIAogICAgIC8vIEN1c3RvbSBTaWduYXR1cmUgJ2NvbnZlcnQyJwogICAgIGNv
bnN0IGludCBjb252ZXJ0MkFyZ2MgPSAxOwogICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVt
cGxhdGU+IGNvbnZlcnQyQXJndltjb252ZXJ0MkFyZ2NdID0geyBWOGI6OkdldFJhd1RlbXBsYXRl
KCkgfTsKICAgICB2ODo6SGFuZGxlPHY4OjpTaWduYXR1cmU+IGNvbnZlcnQyU2lnbmF0dXJlID0g
djg6OlNpZ25hdHVyZTo6TmV3KGRlc2MsIGNvbnZlcnQyQXJnYywgY29udmVydDJBcmd2KTsKLSAg
ICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiY29udmVydDIiKSwgdjg6OkZ1bmN0aW9uVGVt
cGxhdGU6Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6Y29udmVydDJDYWxsYmFjaywgdjhVbmRlZmlu
ZWQoKSwgY29udmVydDJTaWduYXR1cmUpKTsKKyAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5l
d1N5bWJvbCgiY29udmVydDIiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0T2JqVjhJ
bnRlcm5hbDo6Y29udmVydDJDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgY29udmVydDJTaWduYXR1
cmUpKTsKIAogICAgIC8vIEN1c3RvbSBTaWduYXR1cmUgJ2NvbnZlcnQ0JwogICAgIGNvbnN0IGlu
dCBjb252ZXJ0NEFyZ2MgPSAxOwogICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
IGNvbnZlcnQ0QXJndltjb252ZXJ0NEFyZ2NdID0geyBWOGQ6OkdldFJhd1RlbXBsYXRlKCkgfTsK
ICAgICB2ODo6SGFuZGxlPHY4OjpTaWduYXR1cmU+IGNvbnZlcnQ0U2lnbmF0dXJlID0gdjg6OlNp
Z25hdHVyZTo6TmV3KGRlc2MsIGNvbnZlcnQ0QXJnYywgY29udmVydDRBcmd2KTsKLSAgICBwcm90
by0+U2V0KHY4OjpTdHJpbmc6Ok5ldygiY29udmVydDQiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6
Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6Y29udmVydDRDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwg
Y29udmVydDRTaWduYXR1cmUpKTsKKyAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ld1N5bWJv
bCgiY29udmVydDQiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0T2JqVjhJbnRlcm5h
bDo6Y29udmVydDRDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgY29udmVydDRTaWduYXR1cmUpKTsK
IAogICAgIC8vIEN1c3RvbSBTaWduYXR1cmUgJ2NvbnZlcnQ1JwogICAgIGNvbnN0IGludCBjb252
ZXJ0NUFyZ2MgPSAxOwogICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGNvbnZl
cnQ1QXJndltjb252ZXJ0NUFyZ2NdID0geyBWOGU6OkdldFJhd1RlbXBsYXRlKCkgfTsKICAgICB2
ODo6SGFuZGxlPHY4OjpTaWduYXR1cmU+IGNvbnZlcnQ1U2lnbmF0dXJlID0gdjg6OlNpZ25hdHVy
ZTo6TmV3KGRlc2MsIGNvbnZlcnQ1QXJnYywgY29udmVydDVBcmd2KTsKLSAgICBwcm90by0+U2V0
KHY4OjpTdHJpbmc6Ok5ldygiY29udmVydDUiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhU
ZXN0T2JqVjhJbnRlcm5hbDo6Y29udmVydDVDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgY29udmVy
dDVTaWduYXR1cmUpKTsKKyAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiY29u
dmVydDUiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6Y29u
dmVydDVDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgY29udmVydDVTaWduYXR1cmUpKTsKICAgICBW
OERPTUNvbmZpZ3VyYXRpb246OmJhdGNoQ29uZmlndXJlQ29uc3RhbnRzKGRlc2MsIHByb3RvLCBU
ZXN0T2JqQ29uc3RzLCBXVEZfQVJSQVlfTEVOR1RIKFRlc3RPYmpDb25zdHMpKTsKIAogICAgIC8v
IEN1c3RvbSB0b1N0cmluZyB0ZW1wbGF0ZQpAQCAtMjMxMCwxMCArMjMxMCwxMCBAQCB2b2lkIFY4
VGVzdE9iajo6aW5zdGFsbFBlckNvbnRleHRQcm9wZXJ0aWVzKHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gaW5zdGFuY2UsIFRlcwogICAgIHY4OjpMb2NhbDx2ODo6U2lnbmF0dXJlPiBkZWZhdWx0U2ln
bmF0dXJlID0gdjg6OlNpZ25hdHVyZTo6TmV3KEdldFRlbXBsYXRlKCkpOwogICAgIFVOVVNFRF9Q
QVJBTShkZWZhdWx0U2lnbmF0dXJlKTsgLy8gSW4gc29tZSBjYXNlcywgaXQgd2lsbCBub3QgYmUg
dXNlZC4KICAgICBpZiAoQ29udGV4dEZlYXR1cmVzOjplbmFibGVkUGVyQ29udGV4dE1ldGhvZDFF
bmFibGVkKGltcGwtPmRvY3VtZW50KCkpKSB7Ci0gICAgICAgIHByb3RvLT5TZXQodjg6OlN0cmlu
Zzo6TmV3KCJlbmFibGVkUGVyQ29udGV4dE1ldGhvZDEiKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6
Ok5ldyhUZXN0T2JqVjhJbnRlcm5hbDo6ZW5hYmxlZFBlckNvbnRleHRNZXRob2QxQ2FsbGJhY2ss
IHY4VW5kZWZpbmVkKCksIGRlZmF1bHRTaWduYXR1cmUpLT5HZXRGdW5jdGlvbigpKTsKKyAgICAg
ICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woImVuYWJsZWRQZXJDb250ZXh0TWV0
aG9kMSIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjplbmFi
bGVkUGVyQ29udGV4dE1ldGhvZDFDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgZGVmYXVsdFNpZ25h
dHVyZSktPkdldEZ1bmN0aW9uKCkpOwogICAgIH0KICAgICBpZiAoQ29udGV4dEZlYXR1cmVzOjpm
ZWF0dXJlTmFtZUVuYWJsZWQoaW1wbC0+ZG9jdW1lbnQoKSkpIHsKLSAgICAgICAgcHJvdG8tPlNl
dCh2ODo6U3RyaW5nOjpOZXcoImVuYWJsZWRQZXJDb250ZXh0TWV0aG9kMiIpLCB2ODo6RnVuY3Rp
b25UZW1wbGF0ZTo6TmV3KFRlc3RPYmpWOEludGVybmFsOjplbmFibGVkUGVyQ29udGV4dE1ldGhv
ZDJDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgZGVmYXVsdFNpZ25hdHVyZSktPkdldEZ1bmN0aW9u
KCkpOworICAgICAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiZW5hYmxlZFBl
ckNvbnRleHRNZXRob2QyIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdE9ialY4SW50
ZXJuYWw6OmVuYWJsZWRQZXJDb250ZXh0TWV0aG9kMkNhbGxiYWNrLCB2OFVuZGVmaW5lZCgpLCBk
ZWZhdWx0U2lnbmF0dXJlKS0+R2V0RnVuY3Rpb24oKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTUNvbmZpZ3VyYXRpb24uY3BwIGIvU291
cmNlL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhET01Db25maWd1cmF0aW9uLmNwcAppbmRleCA2ZjA4
NTRmODhjNDU2ZGJlMGE5NjFhNTkzNjJhZmIwYzM3YTE1ZDMwLi5kNmRhMzI5N2FmYzY1ZTBlNjAw
MGE4ODJmZjAxNGU0MWYzODFmYzgxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5n
cy92OC9WOERPTUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4RE9NQ29uZmlndXJhdGlvbi5jcHAKQEAgLTQ5LDggKzQ5LDggQEAgdm9pZCBWOERPTUNv
bmZpZ3VyYXRpb246OmJhdGNoQ29uZmlndXJlQ29uc3RhbnRzKHY4OjpIYW5kbGU8djg6OkZ1bmN0
aW9uVGVtcGxhdGUKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnN0YW50Q291bnQ7
ICsraSkgewogICAgICAgICBjb25zdCBCYXRjaGVkQ29uc3RhbnQqIGNvbnN0YW50ID0gJmNvbnN0
YW50c1tpXTsKLSAgICAgICAgZnVuY3Rpb25EZXNjcmlwdG9yLT5TZXQodjg6OlN0cmluZzo6TmV3
KGNvbnN0YW50LT5uYW1lKSwgdjhJbnRlZ2VyKGNvbnN0YW50LT52YWx1ZSksIHY4OjpSZWFkT25s
eSk7Ci0gICAgICAgIHByb3RvdHlwZS0+U2V0KHY4OjpTdHJpbmc6Ok5ldyhjb25zdGFudC0+bmFt
ZSksIHY4SW50ZWdlcihjb25zdGFudC0+dmFsdWUpLCB2ODo6UmVhZE9ubHkpOworICAgICAgICBm
dW5jdGlvbkRlc2NyaXB0b3ItPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woY29uc3RhbnQtPm5h
bWUpLCB2OEludGVnZXIoY29uc3RhbnQtPnZhbHVlKSwgdjg6OlJlYWRPbmx5KTsKKyAgICAgICAg
cHJvdG90eXBlLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKGNvbnN0YW50LT5uYW1lKSwgdjhJ
bnRlZ2VyKGNvbnN0YW50LT52YWx1ZSksIHY4OjpSZWFkT25seSk7CiAgICAgfQogfQogCkBAIC02
MSw3ICs2MSw3IEBAIHZvaWQgVjhET01Db25maWd1cmF0aW9uOjpiYXRjaENvbmZpZ3VyZUNhbGxi
YWNrcyh2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2FsbGJhY2tDb3VudCkKIHsKICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrQ291bnQ7ICsraSkKLSAgICAgICAgcHJv
dG90eXBlLT5TZXQodjg6OlN0cmluZzo6TmV3KGNhbGxiYWNrc1tpXS5uYW1lKSwgdjg6OkZ1bmN0
aW9uVGVtcGxhdGU6Ok5ldyhjYWxsYmFja3NbaV0uY2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIHNp
Z25hdHVyZSksIGF0dHJpYnV0ZXMpOworICAgICAgICBwcm90b3R5cGUtPlNldCh2ODo6U3RyaW5n
OjpOZXdTeW1ib2woY2FsbGJhY2tzW2ldLm5hbWUpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3
KGNhbGxiYWNrc1tpXS5jYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgc2lnbmF0dXJlKSwgYXR0cmli
dXRlcyk7CiB9CiAKIHY4OjpMb2NhbDx2ODo6U2lnbmF0dXJlPiBWOERPTUNvbmZpZ3VyYXRpb246
OmNvbmZpZ3VyZVRlbXBsYXRlKHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBm
dW5jdGlvbkRlc2NyaXB0b3IsCkBAIC03Myw3ICs3Myw3IEBAIHY4OjpMb2NhbDx2ODo6U2lnbmF0
dXJlPiBWOERPTUNvbmZpZ3VyYXRpb246OmNvbmZpZ3VyZVRlbXBsYXRlKHY4OjpQZXJzaXN0ZW50
PHY4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBCYXRjaGVkQ2FsbGJhY2sqIGNhbGxiYWNrcywKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVf
dCBjYWxsYmFja0NvdW50KQogewotICAgIGZ1bmN0aW9uRGVzY3JpcHRvci0+U2V0Q2xhc3NOYW1l
KHY4OjpTdHJpbmc6Ok5ldyhpbnRlcmZhY2VOYW1lKSk7CisgICAgZnVuY3Rpb25EZXNjcmlwdG9y
LT5TZXRDbGFzc05hbWUodjg6OlN0cmluZzo6TmV3U3ltYm9sKGludGVyZmFjZU5hbWUpKTsKICAg
ICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBpbnN0YW5jZSA9IGZ1bmN0aW9uRGVzY3Jp
cHRvci0+SW5zdGFuY2VUZW1wbGF0ZSgpOwogICAgIGluc3RhbmNlLT5TZXRJbnRlcm5hbEZpZWxk
Q291bnQoZmllbGRDb3VudCk7CiAgICAgaWYgKCFwYXJlbnRDbGFzcy5Jc0VtcHR5KCkpCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTUNvbmZpZ3VyYXRpb24uaCBi
L1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4RE9NQ29uZmlndXJhdGlvbi5oCmluZGV4IGMz
N2U2OTdmZTBlYjBmMGQ1MzVhZDU3MDhkYjRhNDcxOGZlZTM3ODkuLjZmYjVmNWU3NzQxNzkyNDA3
M2U3YWU5ZmIwNTcyYjYzMDBkOGM0OWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3Y4L1Y4RE9NQ29uZmlndXJhdGlvbi5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4RE9NQ29uZmlndXJhdGlvbi5oCkBAIC02Myw3ICs2Myw3IEBAIHB1YmxpYzoKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpIYW5kbGU8T2JqZWN0T3JU
ZW1wbGF0ZT4gcHJvdG90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgQmF0Y2hlZEF0dHJpYnV0ZSYgYXR0cmlidXRlKQogICAgIHsKLSAgICAgICAg
KGF0dHJpYnV0ZS5vblByb3RvdHlwZSA/IHByb3RvdHlwZSA6IGluc3RhbmNlKS0+U2V0QWNjZXNz
b3Iodjg6OlN0cmluZzo6TmV3KGF0dHJpYnV0ZS5uYW1lKSwKKyAgICAgICAgKGF0dHJpYnV0ZS5v
blByb3RvdHlwZSA/IHByb3RvdHlwZSA6IGluc3RhbmNlKS0+U2V0QWNjZXNzb3Iodjg6OlN0cmlu
Zzo6TmV3U3ltYm9sKGF0dHJpYnV0ZS5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmdldHRl
ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldHRlciwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkV4dGVybmFs
OjpXcmFwKGF0dHJpYnV0ZS5kYXRhKSwK
</data>

          </attachment>
      

    </bug>

</bugzilla>