<?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>150131</bug_id>
          
          <creation_ts>2015-10-14 11:41:43 -0700</creation_ts>
          <short_desc>Implement Object.values / Object.entries</short_desc>
          <delta_ts>2017-03-13 12:49:37 -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>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>160410</dup_id>
          
          <bug_file_loc>https://github.com/ljharb/proposal-object-values-entries</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jordan Harband">ljharb</reporter>
          <assigned_to name="Jordan Harband">ljharb</assigned_to>
          <cc>darin</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>jfbastien</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>ticaiolima</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1133199</commentid>
    <comment_count>0</comment_count>
    <who name="Jordan Harband">ljharb</who>
    <bug_when>2015-10-14 11:41:43 -0700</bug_when>
    <thetext>My spec proposal for Object.values and Object.entries is at stage 2. It&apos;s about to be implemented in Firefox Nightly.

My intention is to move it to stage 3 next month at TC39 - with a target of stage 4 in January. The requirement for stage 4 is that it be implemented in at least 2 browsers. The sooner this gets into WebKit Nightly, the better for the proposal :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1133201</commentid>
    <comment_count>1</comment_count>
      <attachid>263093</attachid>
    <who name="Jordan Harband">ljharb</who>
    <bug_when>2015-10-14 11:44:19 -0700</bug_when>
    <thetext>Created attachment 263093
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1133202</commentid>
    <comment_count>2</comment_count>
    <who name="Jordan Harband">ljharb</who>
    <bug_when>2015-10-14 11:45:31 -0700</bug_when>
    <thetext>Firefox PR: https://bugzilla.mozilla.org/show_bug.cgi?id=1208464</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1133493</commentid>
    <comment_count>3</comment_count>
      <attachid>263093</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-10-15 09:46:55 -0700</bug_when>
    <thetext>Comment on attachment 263093
Patch

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

Generally looks like good work. Worth tuning a little more to use our best practices to give us increased chance for great performance out of the gate.

review- because because the patch doesn’t include a test for Object.entries, and because Object.entries was implemented incorrectly (see comment about the incorrect use of constructEmptyArray).

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:657
&gt; +    Vector&lt;Identifier&gt; propertyStrings;
&gt; +    Vector&lt;Identifier, 16&gt; propertySymbols;

We should have an inline capacity for propertyStrings like the one just below it for propertySymbols. We don’t want to do a heap allocation for the vector’s storage unless there is an unusually large number of strings and symbols.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:663
&gt;          for (size_t i = 0; i &lt; numProperties; i++) {
&gt;              const auto&amp; identifier = properties[i];

Should use a modern for loop:

    for (auto&amp; identifier : properties) {

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:665
&gt; +            propertyStrings.append(identifier);

We can get better performance by using reserveInitialCapacity and uncheckedAppend rather than just doing append, since we know exactly how many properties are going to be added.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:673
&gt;              const auto&amp; identifier = properties[i];

Should use a modern for loop:

    for (auto&amp; identifier : properties) {

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:676
&gt; +                propertySymbols.append(identifier);

We can get better performance by using reserveInitialCapacity and uncheckedAppend rather than just doing append, since we have an upper bound on how many symbols are going to be added.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:684
&gt;          size_t numProperties = properties.size();
&gt;          for (size_t i = 0; i &lt; numProperties; i++) {
&gt;              const auto&amp; identifier = properties[i];

Should use a modern for loop:

    for (auto&amp; identifier : properties) {

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:687
&gt;                      propertySymbols.append(identifier);

We can get better performance by using reserveInitialCapacity and uncheckedAppend rather than just doing append, since we have an upper bound on how many symbols are going to be added.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:689
&gt; +                propertyStrings.append(identifier);

We can get better performance by using reserveInitialCapacity and uncheckedAppend rather than just doing append, since we have an upper bound on how many strings are going to be added.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:696
&gt; +    JSArray* results = constructEmptyArray(exec, 0);

If we can know exactly how many elements we plan to put in the array before creating it, it might be even more efficient to use a length and putDirectIndex rather than the repeated calls to push that this function originally had. It’s not very important to share this array between the three different cases in the switch statement.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:703
&gt; +            results-&gt;push(exec, Symbol::create(exec-&gt;vm(), static_cast&lt;SymbolImpl&amp;&gt;(*identifier.impl())));

I don’t think static_cast&lt;SymbolImpl&amp;&gt;(*identifier.impl()) is the ideal way to write this. Maybe someone else on the project knows the better approach.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:707
&gt; +        Vector&lt;Identifier&gt; properties;

Should use inline capacity here to avoid heap allocation.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:709
&gt; +            properties.append(identifier);

We can get better performance by using reserveInitialCapacity and uncheckedAppend rather than just doing append, since we know how many properties we are going to add.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:714
&gt; +        for (const auto&amp; identifier : properties) {

I don’t think it’s good to allocate memory and concatenate the two vectors into a single vector just so we can iterate both with a single for loop. Instead we should refactor this so the work is done by a helper function and we can iterate two different vectors. Another, more complex, refactoring option would be to write a wrapper class that makes it possible to iterate two vectors with a for loop without copying the vectors. Either way, we want a version that doesn’t allocate another copy of the two vectors.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:715
&gt; +            PropertyDescriptor desc;

Please don’t use abbreviations in names for new WebKit code. The name “descriptor” would be fine here.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:721
&gt; +            results-&gt;push(exec, value);

Do we have a guarantee that push does not raise an exception?

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:726
&gt; +        Vector&lt;Identifier&gt; properties;

Should use inline capacity here to avoid heap allocation.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:728
&gt; +            properties.append(identifier);

We can get better performance by using reserveInitialCapacity and uncheckedAppend rather than just doing append, since we know how many properties we are going to add.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:733
&gt; +        for (const auto&amp; identifier : properties) {

I don’t think it’s good to allocate memory and concatenate the two vectors into a single vector just so we can iterate both with a single for loop. Instead we should refactor this so the work is done by a helper function and we can iterate two different vectors. Another, more complex, refactoring option would be to write a wrapper class that makes it possible to iterate two vectors with a for loop without copying the vectors. Either way, we want a version that doesn’t allocate another copy of the two vectors.

&gt; Source/JavaScriptCore/runtime/ObjectConstructor.cpp:740
&gt; +            JSArray* entry = constructEmptyArray(exec, 0, 2);

Second argument should be nullptr, not 0.

Do tests cover this code path? I am pretty sure that constructing an array of size 2 and then calling push twice on it will give us an array of length 4. If you look at other code using constructEmptyArray, it uses putDirectIndex to fill in values, not push.

It would be more efficient to use the version of constructArray that takes a pointer to the values and length rather than calling push or putDirectIndex twice. We can simply create the two JSValues first and then call constructArray. Don’t even need a local variable for the array.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1133530</commentid>
    <comment_count>4</comment_count>
    <who name="Jordan Harband">ljharb</who>
    <bug_when>2015-10-15 11:06:58 -0700</bug_when>
    <thetext>Oops! I have all the Object.entries tests locally but I must have forgotten to `git add` them :-) I&apos;ll include them, and also do my best to incorporate your feedback. Thanks!!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1143016</commentid>
    <comment_count>5</comment_count>
    <who name="Jordan Harband">ljharb</who>
    <bug_when>2015-11-18 15:19:24 -0800</bug_when>
    <thetext>This proposal is approved for stage 3 as of yesterday - I&apos;ll be resuming the work on this shortly. Thanks again for the thorough review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1280943</commentid>
    <comment_count>6</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2017-02-24 17:18:59 -0800</bug_when>
    <thetext>Jordan: I was wondering if you&apos;d had time to look into this? I was just about to use it and realized we didn&apos;t support it yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1281269</commentid>
    <comment_count>7</comment_count>
    <who name="Jordan Harband">ljharb</who>
    <bug_when>2017-02-26 22:04:22 -0800</bug_when>
    <thetext>No, I&apos;m afraid I haven&apos;t, and won&apos;t for the medium term. The patch attached to this bug is the latest I&apos;ve got; I&apos;d be delighted if someone took it and ran with it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1286938</commentid>
    <comment_count>8</comment_count>
    <who name="GSkachkov">gskachkov</who>
    <bug_when>2017-03-12 12:29:19 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Jordan: I was wondering if you&apos;d had time to look into this? I was just
&gt; about to use it and realized we didn&apos;t support it yet.

Hmm, sound weird. It was implemented in following patch  https://bugs.webkit.org/show_bug.cgi?id=160410
Could you please provide script that we do no support? I&apos;ll take a look</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1287183</commentid>
    <comment_count>9</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2017-03-13 09:10:51 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #6)
&gt; &gt; Jordan: I was wondering if you&apos;d had time to look into this? I was just
&gt; &gt; about to use it and realized we didn&apos;t support it yet.
&gt; 
&gt; Hmm, sound weird. It was implemented in following patch 
&gt; https://bugs.webkit.org/show_bug.cgi?id=160410
&gt; Could you please provide script that we do no support? I&apos;ll take a look

Oh ignore me! I was going on MDN&apos;s browser support table:
  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries

It links to this bug, not the new one, and I figured bugs don&apos;t lie (they do).

I&apos;ll close this one as dupe, thanks!

*** This bug has been marked as a duplicate of bug 160410 ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1287300</commentid>
    <comment_count>10</comment_count>
    <who name="GSkachkov">gskachkov</who>
    <bug_when>2017-03-13 12:49:37 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #8)
&gt; &gt; (In reply to comment #6)
&gt; &gt; &gt; Jordan: I was wondering if you&apos;d had time to look into this? I was just
&gt; &gt; &gt; about to use it and realized we didn&apos;t support it yet.
&gt; &gt; 
&gt; &gt; Hmm, sound weird. It was implemented in following patch 
&gt; &gt; https://bugs.webkit.org/show_bug.cgi?id=160410
&gt; &gt; Could you please provide script that we do no support? I&apos;ll take a look
&gt; 
&gt; Oh ignore me! I was going on MDN&apos;s browser support table:
&gt;  
&gt; https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
&gt; Global_Objects/Object/entries
&gt; 
&gt; It links to this bug, not the new one, and I figured bugs don&apos;t lie (they
&gt; do).
&gt; 
&gt; I&apos;ll close this one as dupe, thanks!
&gt; 
&gt; *** This bug has been marked as a duplicate of bug 160410 ***

Ohh, ok I&apos;ll try fix documentation on MDN. 
To check implementation of statuses ES6/ES7 features I prefer to use kangax table http://kangax.github.io/compat-table/es2016plus/#test-Object_static_methods_Object.values.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>263093</attachid>
            <date>2015-10-14 11:44:19 -0700</date>
            <delta_ts>2015-10-15 09:46:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-150131-20151014114341.patch</filename>
            <type>text/plain</type>
            <size>22395</size>
            <attacher name="Jordan Harband">ljharb</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTkxMDQ5CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBi
MzY3NDU2ZTlmOTUzYjY2MTFlYTM3MGQ0M2E5MzcyY2YwY2Q5ODEzLi5iNDc4YTQ1ZDQwMjE1ZDYy
ZmUyMzUyY2MyNjM1ZDEyMmZiNDIxOGIzIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyNiBAQAorMjAxNS0xMC0xNCAgSm9yZGFuIEhhcmJhbmQgIDxsamhhcmJAZ21haWwuY29t
PgorCisgICAgICAgIEltcGxlbWVudCBPYmplY3QudmFsdWVzIC8gT2JqZWN0LmVudHJpZXMKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1MDEzMQorICAg
ICAgICBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50
cmllcworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICog
cnVudGltZS9FbnVtZXJhdGlvbk1vZGUuaDoKKyAgICAgICAgKiBydW50aW1lL09iamVjdENvbnN0
cnVjdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6b2JqZWN0Q29uc3RydWN0b3JHZXRPd25Qcm9wZXJ0
eURlc2NyaXB0b3IpOgorICAgICAgICAoSlNDOjpvYmplY3RDb25zdHJ1Y3RvckdldE93blByb3Bl
cnR5TmFtZXMpOgorICAgICAgICAoSlNDOjpvYmplY3RDb25zdHJ1Y3RvckdldE93blByb3BlcnR5
U3ltYm9scyk6CisgICAgICAgIChKU0M6Om9iamVjdENvbnN0cnVjdG9yS2V5cyk6CisgICAgICAg
IChKU0M6Om9iamVjdENvbnN0cnVjdG9yRW50cmllcyk6CisgICAgICAgIChKU0M6Om9iamVjdENv
bnN0cnVjdG9yVmFsdWVzKToKKyAgICAgICAgKEpTQzo6b3duRW51bWVyYWJsZVByb3BlcnR5S2V5
cyk6CisgICAgICAgIChKU0M6Om93blByb3BlcnRpZXMpOgorICAgICAgICAoSlNDOjpvd25Qcm9w
ZXJ0eUtleXMpOiBEZWxldGVkLgorICAgICAgICAqIHJ1bnRpbWUvT2JqZWN0Q29uc3RydWN0b3Iu
aDoKKyAgICAgICAgKiBydW50aW1lL1JlZmxlY3RPYmplY3QuY3BwOgorICAgICAgICAoSlNDOjpy
ZWZsZWN0T2JqZWN0T3duS2V5cyk6CisKIDIwMTUtMTAtMTQgIE1hcmsgTGFtICA8bWFyay5sYW1A
YXBwbGUuY29tPgogCiAgICAgICAgIFNwZWN1bGF0aXZlIGJ1aWxkIGZpeDogdGhlIENhbGxTaXRl
SW5kZXggY29uc3RydWN0b3IgaXMgZXhwbGljaXQgYW5kIHJlcXVpcmVzIGFuIHVpbnQzMl90Lgpk
aWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvRW51bWVyYXRpb25Nb2Rl
LmggYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FbnVtZXJhdGlvbk1vZGUuaAppbmRl
eCA4NmQ1M2UwNDlhOTgzZDlmMDBiYzExZGM3ZWQ4YTYzM2UyMmI5N2UxLi43ZjI3NWExNTU0MzAw
MDNmOGEzYjI4YjMzZWIxODQ1NGQ0NjU1YWIyIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvcnVudGltZS9FbnVtZXJhdGlvbk1vZGUuaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9FbnVtZXJhdGlvbk1vZGUuaApAQCAtMzQsNiArMzQsMTIgQEAgZW51bSBjbGFz
cyBQcm9wZXJ0eU5hbWVNb2RlIHsKICAgICBTdHJpbmdzQW5kU3ltYm9scyA9IFN5bWJvbHMgfCBT
dHJpbmdzLAogfTsKIAorZW51bSBjbGFzcyBPd25Qcm9wZXJ0eUtpbmQgeworICAgIEtleXMgPSAx
IDw8IDAsCisgICAgVmFsdWVzID0gMSA8PCAxLAorICAgIEVudHJpZXMgPSBLZXlzIHwgVmFsdWVz
LAorfTsKKwogZW51bSBjbGFzcyBEb250RW51bVByb3BlcnRpZXNNb2RlIHsKICAgICBJbmNsdWRl
LAogICAgIEV4Y2x1ZGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L09iamVjdENvbnN0cnVjdG9yLmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09i
amVjdENvbnN0cnVjdG9yLmNwcAppbmRleCBiYzg2MjVhYzI3MGI2NDRkNzM5YTA0ZjZiNWMyMzIw
NjY2ZWFmZWU1Li5kYzAxZjBhMWUyZGRkZjgxYWJlYjQ3OGUxNjNlYjVhMDEyYzE3YzNjIDEwMDY0
NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9PYmplY3RDb25zdHJ1Y3Rvci5j
cHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT2JqZWN0Q29uc3RydWN0b3Iu
Y3BwCkBAIC03MCw2ICs3MCw4IEBAIGNvbnN0IENsYXNzSW5mbyBPYmplY3RDb25zdHJ1Y3Rvcjo6
c19pbmZvID0geyAiRnVuY3Rpb24iLCAmSW50ZXJuYWxGdW5jdGlvbjo6c19pCiAgIGdldE93blBy
b3BlcnR5RGVzY3JpcHRvciAgb2JqZWN0Q29uc3RydWN0b3JHZXRPd25Qcm9wZXJ0eURlc2NyaXB0
b3IgICBEb250RW51bXxGdW5jdGlvbiAyCiAgIGdldE93blByb3BlcnR5TmFtZXMgICAgICAgb2Jq
ZWN0Q29uc3RydWN0b3JHZXRPd25Qcm9wZXJ0eU5hbWVzICAgICAgICBEb250RW51bXxGdW5jdGlv
biAxCiAgIGtleXMgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q29uc3RydWN0b3JLZXlzICAg
ICAgICAgICAgICAgICAgICAgICBEb250RW51bXxGdW5jdGlvbiAxCisgIGVudHJpZXMgICAgICAg
ICAgICAgICAgICAgb2JqZWN0Q29uc3RydWN0b3JFbnRyaWVzICAgICAgICAgICAgICAgICAgICBE
b250RW51bXxGdW5jdGlvbiAxCisgIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q29u
c3RydWN0b3JWYWx1ZXMgICAgICAgICAgICAgICAgICAgICBEb250RW51bXxGdW5jdGlvbiAxCiAg
IGRlZmluZVByb3BlcnR5ICAgICAgICAgICAgb2JqZWN0Q29uc3RydWN0b3JEZWZpbmVQcm9wZXJ0
eSAgICAgICAgICAgICBEb250RW51bXxGdW5jdGlvbiAzCiAgIGRlZmluZVByb3BlcnRpZXMgICAg
ICAgICAgb2JqZWN0Q29uc3RydWN0b3JEZWZpbmVQcm9wZXJ0aWVzICAgICAgICAgICBEb250RW51
bXxGdW5jdGlvbiAyCiAgIGNyZWF0ZSAgICAgICAgICAgICAgICAgICAgb2JqZWN0Q29uc3RydWN0
b3JDcmVhdGUgICAgICAgICAgICAgICAgICAgICBEb250RW51bXxGdW5jdGlvbiAyCkBAIC0yNDAs
NyArMjQyLDcgQEAgSlNWYWx1ZSBvYmplY3RDb25zdHJ1Y3RvckdldE93blByb3BlcnR5RGVzY3Jp
cHRvcihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiBvYmoKICAgICAgICAgZGVzY3JpcHRpb24t
PnB1dERpcmVjdChleGVjLT52bSgpLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkuZ2V0LCBkZXNjcmlw
dG9yLmdldHRlcigpLCAwKTsKICAgICAgICAgZGVzY3JpcHRpb24tPnB1dERpcmVjdChleGVjLT52
bSgpLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkuc2V0LCBkZXNjcmlwdG9yLnNldHRlcigpLCAwKTsK
ICAgICB9Ci0gICAgCisKICAgICBkZXNjcmlwdGlvbi0+cHV0RGlyZWN0KGV4ZWMtPnZtKCksIGV4
ZWMtPnByb3BlcnR5TmFtZXMoKS5lbnVtZXJhYmxlLCBqc0Jvb2xlYW4oZGVzY3JpcHRvci5lbnVt
ZXJhYmxlKCkpLCAwKTsKICAgICBkZXNjcmlwdGlvbi0+cHV0RGlyZWN0KGV4ZWMtPnZtKCksIGV4
ZWMtPnByb3BlcnR5TmFtZXMoKS5jb25maWd1cmFibGUsIGpzQm9vbGVhbihkZXNjcmlwdG9yLmNv
bmZpZ3VyYWJsZSgpKSwgMCk7CiAKQEAgLTI2NCw3ICsyNjYsNyBAQCBFbmNvZGVkSlNWYWx1ZSBK
U0NfSE9TVF9DQUxMIG9iamVjdENvbnN0cnVjdG9yR2V0T3duUHJvcGVydHlOYW1lcyhFeGVjU3Rh
dGUqIGV4ZQogICAgIEpTT2JqZWN0KiBvYmplY3QgPSBleGVjLT5hcmd1bWVudCgwKS50b09iamVj
dChleGVjKTsKICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCiAgICAgICAgIHJldHVybiBK
U1ZhbHVlOjplbmNvZGUoanNOdWxsKCkpOwotICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUob3du
UHJvcGVydHlLZXlzKGV4ZWMsIG9iamVjdCwgUHJvcGVydHlOYW1lTW9kZTo6U3RyaW5ncywgRG9u
dEVudW1Qcm9wZXJ0aWVzTW9kZTo6SW5jbHVkZSkpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNv
ZGUob3duUHJvcGVydGllcyhleGVjLCBvYmplY3QsIFByb3BlcnR5TmFtZU1vZGU6OlN0cmluZ3Ms
IERvbnRFbnVtUHJvcGVydGllc01vZGU6OkluY2x1ZGUsIE93blByb3BlcnR5S2luZDo6S2V5cykp
OwogfQogCiAvLyBGSVhNRTogVXNlIHRoZSBlbnVtZXJhdGlvbiBjYWNoZS4KQEAgLTI3Myw3ICsy
NzUsNyBAQCBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIG9iamVjdENvbnN0cnVjdG9yR2V0
T3duUHJvcGVydHlTeW1ib2xzKEV4ZWNTdGF0ZSogZQogICAgIEpTT2JqZWN0KiBvYmplY3QgPSBl
eGVjLT5hcmd1bWVudCgwKS50b09iamVjdChleGVjKTsKICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0
aW9uKCkpCiAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNOdWxsKCkpOwotICAgIHJl
dHVybiBKU1ZhbHVlOjplbmNvZGUob3duUHJvcGVydHlLZXlzKGV4ZWMsIG9iamVjdCwgUHJvcGVy
dHlOYW1lTW9kZTo6U3ltYm9scywgRG9udEVudW1Qcm9wZXJ0aWVzTW9kZTo6SW5jbHVkZSkpOwor
ICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUob3duUHJvcGVydGllcyhleGVjLCBvYmplY3QsIFBy
b3BlcnR5TmFtZU1vZGU6OlN5bWJvbHMsIERvbnRFbnVtUHJvcGVydGllc01vZGU6OkluY2x1ZGUs
IE93blByb3BlcnR5S2luZDo6S2V5cykpOwogfQogCiAvLyBGSVhNRTogVXNlIHRoZSBlbnVtZXJh
dGlvbiBjYWNoZS4KQEAgLTI4Miw3ICsyODQsMjUgQEAgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBvYmplY3RDb25zdHJ1Y3RvcktleXMoRXhlY1N0YXRlKiBleGVjKQogICAgIEpTT2JqZWN0
KiBvYmplY3QgPSBleGVjLT5hcmd1bWVudCgwKS50b09iamVjdChleGVjKTsKICAgICBpZiAoZXhl
Yy0+aGFkRXhjZXB0aW9uKCkpCiAgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNOdWxs
KCkpOwotICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUob3duUHJvcGVydHlLZXlzKGV4ZWMsIG9i
amVjdCwgUHJvcGVydHlOYW1lTW9kZTo6U3RyaW5ncywgRG9udEVudW1Qcm9wZXJ0aWVzTW9kZTo6
RXhjbHVkZSkpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUob3duUHJvcGVydGllcyhleGVj
LCBvYmplY3QsIFByb3BlcnR5TmFtZU1vZGU6OlN0cmluZ3MsIERvbnRFbnVtUHJvcGVydGllc01v
ZGU6OkV4Y2x1ZGUsIE93blByb3BlcnR5S2luZDo6S2V5cykpOworfQorCisvLyBGSVhNRTogVXNl
IHRoZSBlbnVtZXJhdGlvbiBjYWNoZS4KK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgb2Jq
ZWN0Q29uc3RydWN0b3JFbnRyaWVzKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBKU09iamVjdCog
b2JqZWN0ID0gZXhlYy0+YXJndW1lbnQoMCkudG9PYmplY3QoZXhlYyk7CisgICAgaWYgKGV4ZWMt
PmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzTnVsbCgp
KTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKG93blByb3BlcnRpZXMoZXhlYywgb2JqZWN0
LCBQcm9wZXJ0eU5hbWVNb2RlOjpTdHJpbmdzLCBEb250RW51bVByb3BlcnRpZXNNb2RlOjpFeGNs
dWRlLCBPd25Qcm9wZXJ0eUtpbmQ6OkVudHJpZXMpKTsKK30KKworLy8gRklYTUU6IFVzZSB0aGUg
ZW51bWVyYXRpb24gY2FjaGUuCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIG9iamVjdENv
bnN0cnVjdG9yVmFsdWVzKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBKU09iamVjdCogb2JqZWN0
ID0gZXhlYy0+YXJndW1lbnQoMCkudG9PYmplY3QoZXhlYyk7CisgICAgaWYgKGV4ZWMtPmhhZEV4
Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzTnVsbCgpKTsKKyAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKG93blByb3BlcnRpZXMoZXhlYywgb2JqZWN0LCBQcm9w
ZXJ0eU5hbWVNb2RlOjpTdHJpbmdzLCBEb250RW51bVByb3BlcnRpZXNNb2RlOjpFeGNsdWRlLCBP
d25Qcm9wZXJ0eUtpbmQ6OlZhbHVlcykpOwogfQogCiBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIG93bkVudW1lcmFibGVQcm9wZXJ0eUtleXMoRXhlY1N0YXRlKiBleGVjKQpAQCAtMjkwLDcg
KzMxMCw3IEBAIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgb3duRW51bWVyYWJsZVByb3Bl
cnR5S2V5cyhFeGVjU3RhdGUqIGV4ZWMpCiAgICAgSlNPYmplY3QqIG9iamVjdCA9IGV4ZWMtPmFy
Z3VtZW50KDApLnRvT2JqZWN0KGV4ZWMpOwogICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkK
ICAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc051bGwoKSk7Ci0gICAgcmV0dXJuIEpT
VmFsdWU6OmVuY29kZShvd25Qcm9wZXJ0eUtleXMoZXhlYywgb2JqZWN0LCBQcm9wZXJ0eU5hbWVN
b2RlOjpTdHJpbmdzQW5kU3ltYm9scywgRG9udEVudW1Qcm9wZXJ0aWVzTW9kZTo6RXhjbHVkZSkp
OworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUob3duUHJvcGVydGllcyhleGVjLCBvYmplY3Qs
IFByb3BlcnR5TmFtZU1vZGU6OlN0cmluZ3NBbmRTeW1ib2xzLCBEb250RW51bVByb3BlcnRpZXNN
b2RlOjpFeGNsdWRlLCBPd25Qcm9wZXJ0eUtpbmQ6OktleXMpKTsKIH0KIAogLy8gRVM1IDguMTAu
NSBUb1Byb3BlcnR5RGVzY3JpcHRvcgpAQCAtNjI4LDEyICs2NDgsMTMgQEAgRW5jb2RlZEpTVmFs
dWUgSlNDX0hPU1RfQ0FMTCBvYmplY3RDb25zdHJ1Y3RvcklzKEV4ZWNTdGF0ZSogZXhlYykKIH0K
IAogLy8gRklYTUU6IFVzZSB0aGUgZW51bWVyYXRpb24gY2FjaGUuCi1KU0FycmF5KiBvd25Qcm9w
ZXJ0eUtleXMoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogb2JqZWN0LCBQcm9wZXJ0eU5hbWVN
b2RlIHByb3BlcnR5TmFtZU1vZGUsIERvbnRFbnVtUHJvcGVydGllc01vZGUgZG9udEVudW1Qcm9w
ZXJ0aWVzTW9kZSkKK0pTQXJyYXkqIG93blByb3BlcnRpZXMoRXhlY1N0YXRlKiBleGVjLCBKU09i
amVjdCogb2JqZWN0LCBQcm9wZXJ0eU5hbWVNb2RlIHByb3BlcnR5TmFtZU1vZGUsIERvbnRFbnVt
UHJvcGVydGllc01vZGUgZG9udEVudW1Qcm9wZXJ0aWVzTW9kZSwgT3duUHJvcGVydHlLaW5kIG93
blByb3BlcnR5S2luZCkKIHsKICAgICBQcm9wZXJ0eU5hbWVBcnJheSBwcm9wZXJ0aWVzKGV4ZWMs
IHByb3BlcnR5TmFtZU1vZGUpOwogICAgIG9iamVjdC0+bWV0aG9kVGFibGUoZXhlYy0+dm0oKSkt
PmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0LCBleGVjLCBwcm9wZXJ0aWVzLCBFbnVtZXJhdGlv
bk1vZGUoZG9udEVudW1Qcm9wZXJ0aWVzTW9kZSkpOwogCi0gICAgSlNBcnJheSoga2V5cyA9IGNv
bnN0cnVjdEVtcHR5QXJyYXkoZXhlYywgMCk7CisgICAgVmVjdG9yPElkZW50aWZpZXI+IHByb3Bl
cnR5U3RyaW5nczsKKyAgICBWZWN0b3I8SWRlbnRpZmllciwgMTY+IHByb3BlcnR5U3ltYm9sczsK
IAogICAgIHN3aXRjaCAocHJvcGVydHlOYW1lTW9kZSkgewogICAgIGNhc2UgUHJvcGVydHlOYW1l
TW9kZTo6U3RyaW5nczogewpAQCAtNjQxLDcgKzY2Miw3IEBAIEpTQXJyYXkqIG93blByb3BlcnR5
S2V5cyhFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiBvYmplY3QsIFByb3BlcnR5TmFtZU1vZGUg
cHJvCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJvcGVydGllczsgaSsrKSB7
CiAgICAgICAgICAgICBjb25zdCBhdXRvJiBpZGVudGlmaWVyID0gcHJvcGVydGllc1tpXTsKICAg
ICAgICAgICAgIEFTU0VSVCghaWRlbnRpZmllci5pc1N5bWJvbCgpKTsKLSAgICAgICAgICAgIGtl
eXMtPnB1c2goZXhlYywganNPd25lZFN0cmluZyhleGVjLCBpZGVudGlmaWVyLnN0cmluZygpKSk7
CisgICAgICAgICAgICBwcm9wZXJ0eVN0cmluZ3MuYXBwZW5kKGlkZW50aWZpZXIpOwogICAgICAg
ICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTY1MiwxMyArNjczLDEyIEBAIEpTQXJyYXkq
IG93blByb3BlcnR5S2V5cyhFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiBvYmplY3QsIFByb3Bl
cnR5TmFtZU1vZGUgcHJvCiAgICAgICAgICAgICBjb25zdCBhdXRvJiBpZGVudGlmaWVyID0gcHJv
cGVydGllc1tpXTsKICAgICAgICAgICAgIEFTU0VSVChpZGVudGlmaWVyLmlzU3ltYm9sKCkpOwog
ICAgICAgICAgICAgaWYgKCFleGVjLT5wcm9wZXJ0eU5hbWVzKCkuaXNQcml2YXRlTmFtZShpZGVu
dGlmaWVyKSkKLSAgICAgICAgICAgICAgICBrZXlzLT5wdXNoKGV4ZWMsIFN5bWJvbDo6Y3JlYXRl
KGV4ZWMtPnZtKCksIHN0YXRpY19jYXN0PFN5bWJvbEltcGwmPigqaWRlbnRpZmllci5pbXBsKCkp
KSk7CisgICAgICAgICAgICAgICAgcHJvcGVydHlTeW1ib2xzLmFwcGVuZChpZGVudGlmaWVyKTsK
ICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBjYXNlIFByb3BlcnR5TmFt
ZU1vZGU6OlN0cmluZ3NBbmRTeW1ib2xzOiB7Ci0gICAgICAgIFZlY3RvcjxJZGVudGlmaWVyLCAx
Nj4gcHJvcGVydHlTeW1ib2xzOwogICAgICAgICBzaXplX3QgbnVtUHJvcGVydGllcyA9IHByb3Bl
cnRpZXMuc2l6ZSgpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVByb3BlcnRp
ZXM7IGkrKykgewogICAgICAgICAgICAgY29uc3QgYXV0byYgaWRlbnRpZmllciA9IHByb3BlcnRp
ZXNbaV07CkBAIC02NjYsMTggKzY4Niw3MCBAQCBKU0FycmF5KiBvd25Qcm9wZXJ0eUtleXMoRXhl
Y1N0YXRlKiBleGVjLCBKU09iamVjdCogb2JqZWN0LCBQcm9wZXJ0eU5hbWVNb2RlIHBybwogICAg
ICAgICAgICAgICAgIGlmICghZXhlYy0+cHJvcGVydHlOYW1lcygpLmlzUHJpdmF0ZU5hbWUoaWRl
bnRpZmllcikpCiAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3ltYm9scy5hcHBlbmQoaWRl
bnRpZmllcik7CiAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBrZXlzLT5wdXNo
KGV4ZWMsIGpzT3duZWRTdHJpbmcoZXhlYywgaWRlbnRpZmllci5zdHJpbmcoKSkpOworICAgICAg
ICAgICAgICAgIHByb3BlcnR5U3RyaW5ncy5hcHBlbmQoaWRlbnRpZmllcik7CiAgICAgICAgIH0K
IAorICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgSlNBcnJheSogcmVzdWx0cyA9
IGNvbnN0cnVjdEVtcHR5QXJyYXkoZXhlYywgMCk7CisgICAgc3dpdGNoIChvd25Qcm9wZXJ0eUtp
bmQpIHsKKyAgICBjYXNlIE93blByb3BlcnR5S2luZDo6S2V5czogeworICAgICAgICBmb3IgKGNv
bnN0IGF1dG8mIGlkZW50aWZpZXIgOiBwcm9wZXJ0eVN0cmluZ3MpCisgICAgICAgICAgICByZXN1
bHRzLT5wdXNoKGV4ZWMsIGpzT3duZWRTdHJpbmcoZXhlYywgaWRlbnRpZmllci5zdHJpbmcoKSkp
OworICAgICAgICAvLyBUbyBlbnN1cmUgdGhlIG9yZGVyIGRlZmluZWQgaW4gdGhlIHNwZWMgKDku
MS4xMiksIHdlIGFwcGVuZCBzeW1ib2xzIGF0IHRoZSBsYXN0IGVsZW1lbnRzIG9mIGtleXMuCisg
ICAgICAgIGZvciAoY29uc3QgYXV0byYgaWRlbnRpZmllciA6IHByb3BlcnR5U3ltYm9scykKKyAg
ICAgICAgICAgIHJlc3VsdHMtPnB1c2goZXhlYywgU3ltYm9sOjpjcmVhdGUoZXhlYy0+dm0oKSwg
c3RhdGljX2Nhc3Q8U3ltYm9sSW1wbCY+KCppZGVudGlmaWVyLmltcGwoKSkpKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICAgIGNhc2UgT3duUHJvcGVydHlLaW5kOjpWYWx1ZXM6IHsKKyAgICAg
ICAgVmVjdG9yPElkZW50aWZpZXI+IHByb3BlcnRpZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0
byYgaWRlbnRpZmllciA6IHByb3BlcnR5U3RyaW5ncykKKyAgICAgICAgICAgIHByb3BlcnRpZXMu
YXBwZW5kKGlkZW50aWZpZXIpOwogICAgICAgICAvLyBUbyBlbnN1cmUgdGhlIG9yZGVyIGRlZmlu
ZWQgaW4gdGhlIHNwZWMgKDkuMS4xMiksIHdlIGFwcGVuZCBzeW1ib2xzIGF0IHRoZSBsYXN0IGVs
ZW1lbnRzIG9mIGtleXMuCiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaWRlbnRpZmllciA6IHBy
b3BlcnR5U3ltYm9scykKLSAgICAgICAgICAgIGtleXMtPnB1c2goZXhlYywgU3ltYm9sOjpjcmVh
dGUoZXhlYy0+dm0oKSwgc3RhdGljX2Nhc3Q8U3ltYm9sSW1wbCY+KCppZGVudGlmaWVyLmltcGwo
KSkpKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuYXBwZW5kKGlkZW50aWZpZXIpOwogCisgICAg
ICAgIGZvciAoY29uc3QgYXV0byYgaWRlbnRpZmllciA6IHByb3BlcnRpZXMpIHsKKyAgICAgICAg
ICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjOworICAgICAgICAgICAgaWYgKCFvYmplY3QtPmdl
dE93blByb3BlcnR5RGVzY3JpcHRvcihleGVjLCBpZGVudGlmaWVyLCBkZXNjKSB8fCAhZGVzYy5l
bnVtZXJhYmxlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBKU1Zh
bHVlIHZhbHVlID0gb2JqZWN0LT5nZXQoZXhlYywgaWRlbnRpZmllcik7CisgICAgICAgICAgICBp
ZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7
CisgICAgICAgICAgICByZXN1bHRzLT5wdXNoKGV4ZWMsIHZhbHVlKTsKKyAgICAgICAgfQorICAg
ICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPd25Qcm9wZXJ0eUtpbmQ6OkVudHJpZXM6IHsK
KyAgICAgICAgVmVjdG9yPElkZW50aWZpZXI+IHByb3BlcnRpZXM7CisgICAgICAgIGZvciAoY29u
c3QgYXV0byYgaWRlbnRpZmllciA6IHByb3BlcnR5U3RyaW5ncykKKyAgICAgICAgICAgIHByb3Bl
cnRpZXMuYXBwZW5kKGlkZW50aWZpZXIpOworICAgICAgICAvLyBUbyBlbnN1cmUgdGhlIG9yZGVy
IGRlZmluZWQgaW4gdGhlIHNwZWMgKDkuMS4xMiksIHdlIGFwcGVuZCBzeW1ib2xzIGF0IHRoZSBs
YXN0IGVsZW1lbnRzIG9mIGtleXMuCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaWRlbnRpZmll
ciA6IHByb3BlcnR5U3ltYm9scykKKyAgICAgICAgICAgIHByb3BlcnRpZXMuYXBwZW5kKGlkZW50
aWZpZXIpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaWRlbnRpZmllciA6IHByb3BlcnRp
ZXMpIHsKKyAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjOworICAgICAgICAgICAg
aWYgKCFvYmplY3QtPmdldE93blByb3BlcnR5RGVzY3JpcHRvcihleGVjLCBpZGVudGlmaWVyLCBk
ZXNjKSB8fCAhZGVzYy5lbnVtZXJhYmxlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICBKU1ZhbHVlIHZhbHVlID0gb2JqZWN0LT5nZXQoZXhlYywgaWRlbnRpZmllcik7
CisgICAgICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIHJlc3VsdHM7CisgICAgICAgICAgICBKU0FycmF5KiBlbnRyeSA9IGNvbnN0cnVjdEVt
cHR5QXJyYXkoZXhlYywgMCwgMik7CisgICAgICAgICAgICBpZiAoaWRlbnRpZmllci5pc1N5bWJv
bCgpKQorICAgICAgICAgICAgICAgIGVudHJ5LT5wdXNoKGV4ZWMsIFN5bWJvbDo6Y3JlYXRlKGV4
ZWMtPnZtKCksIHN0YXRpY19jYXN0PFN5bWJvbEltcGwmPigqaWRlbnRpZmllci5pbXBsKCkpKSk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZW50cnktPnB1c2goZXhlYywganNP
d25lZFN0cmluZyhleGVjLCBpZGVudGlmaWVyLnN0cmluZygpKSk7CisgICAgICAgICAgICBlbnRy
eS0+cHVzaChleGVjLCB2YWx1ZSk7CisgICAgICAgICAgICByZXN1bHRzLT5wdXNoKGV4ZWMsIGVu
dHJ5KTsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CiAgICAgfQogCi0gICAgcmV0
dXJuIGtleXM7CisgICAgcmV0dXJuIHJlc3VsdHM7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIEpTQwpk
aWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvT2JqZWN0Q29uc3RydWN0
b3IuaCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL09iamVjdENvbnN0cnVjdG9yLmgK
aW5kZXggNWRiNzhiYTE2M2ZlNWM3NzZiZWUwMjEzNzQxZDZjMWUzZjY3ZmU0My4uOWZmMzEyZWI2
MjZjNjk4ZjlhMDExZDlmNGNkMTg4NDEyZTc1OGVlOCAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvT2JqZWN0Q29uc3RydWN0b3IuaAorKysgYi9Tb3VyY2UvSmF2YVNj
cmlwdENvcmUvcnVudGltZS9PYmplY3RDb25zdHJ1Y3Rvci5oCkBAIC0yOSw3ICsyOSw5IEBAIG5h
bWVzcGFjZSBKU0MgewogCiBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIG9iamVjdENvbnN0
cnVjdG9yR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4ZWNTdGF0ZSopOwogRW5jb2RlZEpTVmFs
dWUgSlNDX0hPU1RfQ0FMTCBvYmplY3RDb25zdHJ1Y3RvckdldE93blByb3BlcnR5U3ltYm9scyhF
eGVjU3RhdGUqKTsKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgb2JqZWN0Q29uc3RydWN0
b3JFbnRyaWVzKEV4ZWNTdGF0ZSopOwogRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBvYmpl
Y3RDb25zdHJ1Y3RvcktleXMoRXhlY1N0YXRlKik7CitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIG9iamVjdENvbnN0cnVjdG9yVmFsdWVzKEV4ZWNTdGF0ZSopOwogRW5jb2RlZEpTVmFsdWUg
SlNDX0hPU1RfQ0FMTCBvd25FbnVtZXJhYmxlUHJvcGVydHlLZXlzKEV4ZWNTdGF0ZSopOwogCiBj
bGFzcyBPYmplY3RQcm90b3R5cGU7CkBAIC05Myw3ICs5NSw3IEBAIGlubGluZSBKU09iamVjdCog
Y29uc3RydWN0RW1wdHlPYmplY3QoRXhlY1N0YXRlKiBleGVjKQogSlNPYmplY3QqIG9iamVjdENv
bnN0cnVjdG9yRnJlZXplKEV4ZWNTdGF0ZSosIEpTT2JqZWN0Kik7CiBKU1ZhbHVlIG9iamVjdENv
bnN0cnVjdG9yR2V0UHJvdG90eXBlT2YoRXhlY1N0YXRlKiwgSlNPYmplY3QqKTsKIEpTVmFsdWUg
b2JqZWN0Q29uc3RydWN0b3JHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhlY1N0YXRlKiwgSlNP
YmplY3QqLCBjb25zdCBJZGVudGlmaWVyJik7Ci1KU0FycmF5KiBvd25Qcm9wZXJ0eUtleXMoRXhl
Y1N0YXRlKiwgSlNPYmplY3QqLCBQcm9wZXJ0eU5hbWVNb2RlLCBEb250RW51bVByb3BlcnRpZXNN
b2RlKTsKK0pTQXJyYXkqIG93blByb3BlcnRpZXMoRXhlY1N0YXRlKiwgSlNPYmplY3QqLCBQcm9w
ZXJ0eU5hbWVNb2RlLCBEb250RW51bVByb3BlcnRpZXNNb2RlLCBPd25Qcm9wZXJ0eUtpbmQpOwog
Ym9vbCB0b1Byb3BlcnR5RGVzY3JpcHRvcihFeGVjU3RhdGUqLCBKU1ZhbHVlLCBQcm9wZXJ0eURl
c2NyaXB0b3ImKTsKIAogfSAvLyBuYW1lc3BhY2UgSlNDCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9SZWZsZWN0T2JqZWN0LmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL1JlZmxlY3RPYmplY3QuY3BwCmluZGV4IDlmOWE5N2VjY2Y0Y2E2Mzk1OGQ3
YTgwODFiNzRlMzg3YmM0NjMwZjcuLjM0OTlkNjBlNzc3NWQ1ZjNhMzNhNjRkZmFlMjNjMjM4MDE4
OTdmZWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1JlZmxlY3RP
YmplY3QuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1JlZmxlY3RPYmpl
Y3QuY3BwCkBAIC0xNzcsNyArMTc3LDcgQEAgRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBy
ZWZsZWN0T2JqZWN0T3duS2V5cyhFeGVjU3RhdGUqIGV4ZWMpCiAgICAgSlNWYWx1ZSB0YXJnZXQg
PSBleGVjLT5hcmd1bWVudCgwKTsKICAgICBpZiAoIXRhcmdldC5pc09iamVjdCgpKQogICAgICAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHRocm93VHlwZUVycm9yKGV4ZWMsIEFTQ0lJTGl0ZXJh
bCgiUmVmbGVjdC5vd25LZXlzIHJlcXVpcmVzIHRoZSBmaXJzdCBhcmd1bWVudCBiZSBhbiBvYmpl
Y3QiKSkpOwotICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUob3duUHJvcGVydHlLZXlzKGV4ZWMs
IGpzQ2FzdDxKU09iamVjdCo+KHRhcmdldCksIFByb3BlcnR5TmFtZU1vZGU6OlN0cmluZ3NBbmRT
eW1ib2xzLCBEb250RW51bVByb3BlcnRpZXNNb2RlOjpJbmNsdWRlKSk7CisgICAgcmV0dXJuIEpT
VmFsdWU6OmVuY29kZShvd25Qcm9wZXJ0aWVzKGV4ZWMsIGpzQ2FzdDxKU09iamVjdCo+KHRhcmdl
dCksIFByb3BlcnR5TmFtZU1vZGU6OlN0cmluZ3NBbmRTeW1ib2xzLCBEb250RW51bVByb3BlcnRp
ZXNNb2RlOjpJbmNsdWRlLCBPd25Qcm9wZXJ0eUtpbmQ6OktleXMpKTsKIH0KIAogLy8gaHR0cDov
L3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXJlZmxlY3QucHJl
dmVudGV4dGVuc2lvbnMKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91
dFRlc3RzL0NoYW5nZUxvZwppbmRleCAzNWFhNWNhM2UyMmFmMGRhNWYxNGFhMmU1M2Q3ZmQ4MGY5
NjBjMTUxLi42NmM0ZTQ4MDQ3MTI5NGNhZjJkZDY2YWZmZmU5ODdmYmMwMWE5N2E3IDEwMDY0NAot
LS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMTUtMTAtMTQgIEpvcmRhbiBIYXJiYW5kICA8bGpoYXJiQGdtYWls
LmNvbT4KKworICAgICAgICBJbXBsZW1lbnQgcHJvcG9zZWQgT2JqZWN0LnZhbHVlcyAvIE9iamVj
dC5lbnRyaWVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNTAxMzEKKyAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9wcm9wb3NhbC1vYmpl
Y3QtdmFsdWVzLWVudHJpZXMKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICAqIGpzL09iamVjdC1nZXRPd25Qcm9wZXJ0eU5hbWVzLWV4cGVjdGVkLnR4dDoK
KyAgICAgICAgKiBqcy9PYmplY3QtdmFsdWVzLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAg
ICoganMvT2JqZWN0LXZhbHVlcy5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBqcy9zY3JpcHQtdGVz
dHMvT2JqZWN0LWdldE93blByb3BlcnR5TmFtZXMuanM6CisgICAgICAgICoganMvc2NyaXB0LXRl
c3RzL09iamVjdC12YWx1ZXMuanM6IEFkZGVkLgorICAgICAgICAoU3ltYm9sKToKKyAgICAgICAg
KGdldCBPYmplY3QpOgorCiAyMDE1LTEwLTE0ICBTYWlkIEFib3UtSGFsbGF3YSAgPHNhYm91aGFs
bGF3YUBhcHBsZS5jb20+CiAKICAgICAgICAgUkVHUkVTU0lPTihyNTMzMTgpOiBiYWNrZ3JvdW5k
LXJlcGVhdDogc3BhY2Ugd2l0aCBncmFkaWVudHMgZG9lc24ndCByZW5kZXIgY29ycmVjdGx5CmRp
ZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9qcy9PYmplY3QtZ2V0T3duUHJvcGVydHlOYW1lcy1leHBl
Y3RlZC50eHQgYi9MYXlvdXRUZXN0cy9qcy9PYmplY3QtZ2V0T3duUHJvcGVydHlOYW1lcy1leHBl
Y3RlZC50eHQKaW5kZXggYjA1NDRjZWZmNDk4ZTBkYjdlMmZjNjIyNDA4ZTVkMGZiNWVhMWYwOC4u
ZjlmNzE3N2U0MjFhN2ZiOTM4Nzc0NmE0ZDdjNDE1OGQxMmVjMjBkNSAxMDA2NDQKLS0tIGEvTGF5
b3V0VGVzdHMvanMvT2JqZWN0LWdldE93blByb3BlcnR5TmFtZXMtZXhwZWN0ZWQudHh0CisrKyBi
L0xheW91dFRlc3RzL2pzL09iamVjdC1nZXRPd25Qcm9wZXJ0eU5hbWVzLWV4cGVjdGVkLnR4dApA
QCAtNDEsNyArNDEsNyBAQCBQQVNTIGdldFNvcnRlZE93blByb3BlcnR5TmFtZXMoZGVjb2RlVVJJ
KSBpcyBbJ2xlbmd0aCcsICduYW1lJ10KIFBBU1MgZ2V0U29ydGVkT3duUHJvcGVydHlOYW1lcyhk
ZWNvZGVVUklDb21wb25lbnQpIGlzIFsnbGVuZ3RoJywgJ25hbWUnXQogUEFTUyBnZXRTb3J0ZWRP
d25Qcm9wZXJ0eU5hbWVzKGVuY29kZVVSSSkgaXMgWydsZW5ndGgnLCAnbmFtZSddCiBQQVNTIGdl
dFNvcnRlZE93blByb3BlcnR5TmFtZXMoZW5jb2RlVVJJQ29tcG9uZW50KSBpcyBbJ2xlbmd0aCcs
ICduYW1lJ10KLVBBU1MgZ2V0U29ydGVkT3duUHJvcGVydHlOYW1lcyhPYmplY3QpIGlzIFsnYXNz
aWduJywgJ2NyZWF0ZScsICdkZWZpbmVQcm9wZXJ0aWVzJywgJ2RlZmluZVByb3BlcnR5JywgJ2Zy
ZWV6ZScsICdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCAnZ2V0T3duUHJvcGVydHlOYW1lcycs
ICdnZXRPd25Qcm9wZXJ0eVN5bWJvbHMnLCAnZ2V0UHJvdG90eXBlT2YnLCAnaXMnLCAnaXNFeHRl
bnNpYmxlJywgJ2lzRnJvemVuJywgJ2lzU2VhbGVkJywgJ2tleXMnLCAnbGVuZ3RoJywgJ25hbWUn
LCAncHJldmVudEV4dGVuc2lvbnMnLCAncHJvdG90eXBlJywgJ3NlYWwnLCAnc2V0UHJvdG90eXBl
T2YnXQorUEFTUyBnZXRTb3J0ZWRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdCkgaXMgWydhc3NpZ24n
LCAnY3JlYXRlJywgJ2RlZmluZVByb3BlcnRpZXMnLCAnZGVmaW5lUHJvcGVydHknLCAnZW50cmll
cycsICdmcmVlemUnLCAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJywgJ2dldE93blByb3BlcnR5
TmFtZXMnLCAnZ2V0T3duUHJvcGVydHlTeW1ib2xzJywgJ2dldFByb3RvdHlwZU9mJywgJ2lzJywg
J2lzRXh0ZW5zaWJsZScsICdpc0Zyb3plbicsICdpc1NlYWxlZCcsICdrZXlzJywgJ2xlbmd0aCcs
ICduYW1lJywgJ3ByZXZlbnRFeHRlbnNpb25zJywgJ3Byb3RvdHlwZScsICdzZWFsJywgJ3NldFBy
b3RvdHlwZU9mJywgJ3ZhbHVlcyddCiBQQVNTIGdldFNvcnRlZE93blByb3BlcnR5TmFtZXMoT2Jq
ZWN0LnByb3RvdHlwZSkgaXMgWydfX2RlZmluZUdldHRlcl9fJywgJ19fZGVmaW5lU2V0dGVyX18n
LCAnX19sb29rdXBHZXR0ZXJfXycsICdfX2xvb2t1cFNldHRlcl9fJywgJ19fcHJvdG9fXycsICdj
b25zdHJ1Y3RvcicsICdoYXNPd25Qcm9wZXJ0eScsICdpc1Byb3RvdHlwZU9mJywgJ3Byb3BlcnR5
SXNFbnVtZXJhYmxlJywgJ3RvTG9jYWxlU3RyaW5nJywgJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXQog
UEFTUyBnZXRTb3J0ZWRPd25Qcm9wZXJ0eU5hbWVzKEZ1bmN0aW9uKSBpcyBbJ2xlbmd0aCcsICdu
YW1lJywgJ3Byb3RvdHlwZSddCiBQQVNTIGdldFNvcnRlZE93blByb3BlcnR5TmFtZXMoRnVuY3Rp
b24ucHJvdG90eXBlKSBpcyBbJ2FwcGx5JywgJ2JpbmQnLCAnY2FsbCcsICdjb25zdHJ1Y3Rvcics
ICdsZW5ndGgnLCAnbmFtZScsICd0b1N0cmluZyddCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9q
cy9PYmplY3QtdmFsdWVzLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL2pzL09iamVjdC12YWx1
ZXMtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmZlNzVlZjk1ZTVkN2IyZWM1YmMxMWNkYTc3ZjA2
ZWY1ZmU1NTg1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9qcy9PYmplY3QtdmFs
dWVzLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDI1IEBACitUZXN0IHRvIGVuc3VyZSBjb3JyZWN0
IGJlaGF2aW91ciBvZiBPYmplY3QudmFsdWVzCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBh
IHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4K
KworCitQQVNTIE9iamVjdC52YWx1ZXMoe30pIGlzIFtdCitQQVNTIE9iamVjdC52YWx1ZXMoe2E6
J0EnfSkgaXMgWydBJ10KK1BBU1MgT2JqZWN0LnZhbHVlcyh7YTonQScsIGI6J0InfSkgaXMgWydB
JywgJ0InXQorUEFTUyBPYmplY3QudmFsdWVzKHtiOidCJywgYTonQSd9KSBpcyBbJ0InLCAnQSdd
CitQQVNTIE9iamVjdC52YWx1ZXMoW10pIGlzIFtdCitQQVNTIE9iamVjdC52YWx1ZXMoWzFdKSBp
cyBbMV0KK1BBU1MgT2JqZWN0LnZhbHVlcyhbMSwyXSkgaXMgWzEsMl0KK1BBU1MgT2JqZWN0LnZh
bHVlcyhbMSwyLCwsLDZdKSBpcyBbMSwyLDZdCitQQVNTIE9iamVjdC52YWx1ZXMoe19fcHJvdG9f
Xzp7YTpudWxsfX0pIGlzIFtdCitQQVNTIE9iamVjdC52YWx1ZXMoe19fcHJvdG9fXzpbMSwyLDNd
fSkgaXMgW10KK1BBU1MgdmFyIHggPSBbXTsgeC5fX3Byb3RvX18gPSBbMSwyLDNdOyBPYmplY3Qu
dmFsdWVzKHgpIGlzIFtdCitQQVNTIHZhciBvYmogPSB7YjonQicsIGE6J0EnfTsgT2JqZWN0Lmtl
eXMob2JqKS5jb25jYXQoT2JqZWN0LnZhbHVlcyhvYmopKSBpcyBbJ2InLCAnYScsICdCJywgJ0En
XQorUEFTUyB2YXIgb2JqID0ge2E6ICdBJ307IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosICdi
JywgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6ICdCJyB9KTsgT2JqZWN0LnZhbHVlcyhvYmop
IGlzIFsnQSddCitQQVNTIE9iamVjdC52YWx1ZXMob2JqV2l0aFN5bWJvbHMpIGlzIFsnQScsIHN5
bV0KK1BBU1MgT2JqZWN0LnZhbHVlcyhvYmpXaXRoRGVsZXRpbmdHZXR0ZXIpIGlzIFsxLCAzXQor
UEFTUyBPYmplY3QudmFsdWVzKG9ialdpdGhOb25FbnVtaW5nR2V0dGVyKSBpcyBbJ0EnXQorUEFT
UyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKZGlmZiAtLWdp
dCBhL0xheW91dFRlc3RzL2pzL09iamVjdC12YWx1ZXMuaHRtbCBiL0xheW91dFRlc3RzL2pzL09i
amVjdC12YWx1ZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wNGU0MDMwZTViYTI5Mzk3N2U4OTE4Y2FjOTg0
NTIzODJiZjIwODU1Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvanMvT2JqZWN0LXZh
bHVlcy5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVU
Ri8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vcmVzb3Vy
Y2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHNjcmlwdCBz
cmM9InNjcmlwdC10ZXN0cy9PYmplY3QtdmFsdWVzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3Jj
PSIuLi9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRt
bD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2pzL3NjcmlwdC10ZXN0cy9PYmplY3QtZ2V0T3du
UHJvcGVydHlOYW1lcy5qcyBiL0xheW91dFRlc3RzL2pzL3NjcmlwdC10ZXN0cy9PYmplY3QtZ2V0
T3duUHJvcGVydHlOYW1lcy5qcwppbmRleCBmNzlkZmFiNmE2YWY4MjhjNDgzMDJkMGE3YWU1YTRi
NWNlOWQ5OTI4Li4yOTI5NDFkZGViNzQzZmFiZmU1YjhiZjBkMDBmNTRjYmJmMjNiYjUyIDEwMDY0
NAotLS0gYS9MYXlvdXRUZXN0cy9qcy9zY3JpcHQtdGVzdHMvT2JqZWN0LWdldE93blByb3BlcnR5
TmFtZXMuanMKKysrIGIvTGF5b3V0VGVzdHMvanMvc2NyaXB0LXRlc3RzL09iamVjdC1nZXRPd25Q
cm9wZXJ0eU5hbWVzLmpzCkBAIC01MCw3ICs1MCw3IEBAIHZhciBleHBlY3RlZFByb3BlcnR5TmFt
ZXNTZXQgPSB7CiAgICAgImVuY29kZVVSSSI6ICJbJ2xlbmd0aCcsICduYW1lJ10iLAogICAgICJl
bmNvZGVVUklDb21wb25lbnQiOiAiWydsZW5ndGgnLCAnbmFtZSddIiwKIC8vIEJ1aWx0LWluIEVD
TUEgb2JqZWN0cwotICAgICJPYmplY3QiOiAiWydhc3NpZ24nLCAnY3JlYXRlJywgJ2RlZmluZVBy
b3BlcnRpZXMnLCAnZGVmaW5lUHJvcGVydHknLCAnZnJlZXplJywgJ2dldE93blByb3BlcnR5RGVz
Y3JpcHRvcicsICdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgJ2dldE93blByb3BlcnR5U3ltYm9scycs
ICdnZXRQcm90b3R5cGVPZicsICdpcycsICdpc0V4dGVuc2libGUnLCAnaXNGcm96ZW4nLCAnaXNT
ZWFsZWQnLCAna2V5cycsICdsZW5ndGgnLCAnbmFtZScsICdwcmV2ZW50RXh0ZW5zaW9ucycsICdw
cm90b3R5cGUnLCAnc2VhbCcsICdzZXRQcm90b3R5cGVPZiddIiwKKyAgICAiT2JqZWN0IjogIlsn
YXNzaWduJywgJ2NyZWF0ZScsICdkZWZpbmVQcm9wZXJ0aWVzJywgJ2RlZmluZVByb3BlcnR5Jywg
J2VudHJpZXMnLCAnZnJlZXplJywgJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsICdnZXRPd25Q
cm9wZXJ0eU5hbWVzJywgJ2dldE93blByb3BlcnR5U3ltYm9scycsICdnZXRQcm90b3R5cGVPZics
ICdpcycsICdpc0V4dGVuc2libGUnLCAnaXNGcm96ZW4nLCAnaXNTZWFsZWQnLCAna2V5cycsICds
ZW5ndGgnLCAnbmFtZScsICdwcmV2ZW50RXh0ZW5zaW9ucycsICdwcm90b3R5cGUnLCAnc2VhbCcs
ICdzZXRQcm90b3R5cGVPZicsICd2YWx1ZXMnXSIsCiAgICAgIk9iamVjdC5wcm90b3R5cGUiOiAi
WydfX2RlZmluZUdldHRlcl9fJywgJ19fZGVmaW5lU2V0dGVyX18nLCAnX19sb29rdXBHZXR0ZXJf
XycsICdfX2xvb2t1cFNldHRlcl9fJywgJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdoYXNP
d25Qcm9wZXJ0eScsICdpc1Byb3RvdHlwZU9mJywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJ3Rv
TG9jYWxlU3RyaW5nJywgJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXSIsCiAgICAgIkZ1bmN0aW9uIjog
IlsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJ10iLAogICAgICJGdW5jdGlvbi5wcm90b3R5
cGUiOiAiWydhcHBseScsICdiaW5kJywgJ2NhbGwnLCAnY29uc3RydWN0b3InLCAnbGVuZ3RoJywg
J25hbWUnLCAndG9TdHJpbmcnXSIsCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9qcy9zY3JpcHQt
dGVzdHMvT2JqZWN0LXZhbHVlcy5qcyBiL0xheW91dFRlc3RzL2pzL3NjcmlwdC10ZXN0cy9PYmpl
Y3QtdmFsdWVzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ5ZmYxMWQ1ODRhZTAzMDExMjkyZTRmMmM0ZmE1NWQ5
MzY1N2IxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9qcy9zY3JpcHQtdGVzdHMv
T2JqZWN0LXZhbHVlcy5qcwpAQCAtMCwwICsxLDUwIEBACitkZXNjcmlwdGlvbigiVGVzdCB0byBl
bnN1cmUgY29ycmVjdCBiZWhhdmlvdXIgb2YgT2JqZWN0LnZhbHVlcyIpOworCitzaG91bGRCZSgi
T2JqZWN0LnZhbHVlcyh7fSkiLCAiW10iKTsKK3Nob3VsZEJlKCJPYmplY3QudmFsdWVzKHthOidB
J30pIiwgIlsnQSddIik7CitzaG91bGRCZSgiT2JqZWN0LnZhbHVlcyh7YTonQScsIGI6J0InfSki
LCAiWydBJywgJ0InXSIpOworc2hvdWxkQmUoIk9iamVjdC52YWx1ZXMoe2I6J0InLCBhOidBJ30p
IiwgIlsnQicsICdBJ10iKTsKK3Nob3VsZEJlKCJPYmplY3QudmFsdWVzKFtdKSIsICJbXSIpOwor
c2hvdWxkQmUoIk9iamVjdC52YWx1ZXMoWzFdKSIsICJbMV0iKTsKK3Nob3VsZEJlKCJPYmplY3Qu
dmFsdWVzKFsxLDJdKSIsICJbMSwyXSIpOworc2hvdWxkQmUoIk9iamVjdC52YWx1ZXMoWzEsMiws
LCw2XSkiLCAiWzEsMiw2XSIpOworc2hvdWxkQmUoIk9iamVjdC52YWx1ZXMoe19fcHJvdG9fXzp7
YTpudWxsfX0pIiwgIltdIik7CitzaG91bGRCZSgiT2JqZWN0LnZhbHVlcyh7X19wcm90b19fOlsx
LDIsM119KSIsICJbXSIpOworc2hvdWxkQmUoInZhciB4ID0gW107IHguX19wcm90b19fID0gWzEs
MiwzXTsgT2JqZWN0LnZhbHVlcyh4KSIsICJbXSIpOworCitzaG91bGRCZSgidmFyIG9iaiA9IHti
OidCJywgYTonQSd9OyBPYmplY3Qua2V5cyhvYmopLmNvbmNhdChPYmplY3QudmFsdWVzKG9iaikp
IiwgIlsnYicsICdhJywgJ0InLCAnQSddIik7CitzaG91bGRCZSgidmFyIG9iaiA9IHthOiAnQSd9
OyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAnYicsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZh
bHVlOiAnQicgfSk7IE9iamVjdC52YWx1ZXMob2JqKSIsICJbJ0EnXSIpOworCit2YXIgc3ltID0g
U3ltYm9sKCk7Cit2YXIgb2JqV2l0aFN5bWJvbHMgPSB7YTogJ0EnLCBbU3ltYm9sKCldOiAnZW51
bScsIGI6IHN5bSB9OworT2JqZWN0LmRlZmluZVByb3BlcnR5KG9ialdpdGhTeW1ib2xzLCBTeW1i
b2woKSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6ICdub25lbnVtJyB9KTsKK3Nob3VsZEJl
KCJPYmplY3QudmFsdWVzKG9ialdpdGhTeW1ib2xzKSIsICJbJ0EnLCBzeW1dIik7CisKK3ZhciBv
YmpXaXRoRGVsZXRpbmdHZXR0ZXIgPSB7fTsKK09iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmpXaXRo
RGVsZXRpbmdHZXR0ZXIsICdhJywgeworICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0
aW9uICgpIHsKKyAgICBkZWxldGUgdGhpcy5iOworICAgIHJldHVybiAxOworICB9Cit9KTsKK29i
aldpdGhEZWxldGluZ0dldHRlci5iID0gMjsKK29ialdpdGhEZWxldGluZ0dldHRlci5jID0gMzsK
K3Nob3VsZEJlKCJPYmplY3QudmFsdWVzKG9ialdpdGhEZWxldGluZ0dldHRlcikiLCAiWzEsIDNd
Iik7CisKK3ZhciBvYmpXaXRoTm9uRW51bWluZ0dldHRlciA9IHt9OworT2JqZWN0LmRlZmluZVBy
b3BlcnR5KG9ialdpdGhOb25FbnVtaW5nR2V0dGVyLCAnYScsIHsKKyAgY29uZmlndXJhYmxlOiB0
cnVlLAorICBlbnVtZXJhYmxlOiB0cnVlLAorICBnZXQ6IGZ1bmN0aW9uICgpIHsKKyAgICBPYmpl
Y3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2InLCB7IGVudW1lcmFibGU6IGZhbHNlIH0pOworICAg
IHJldHVybiAnQSc7CisgIH0KK30pOworT2JqZWN0LmRlZmluZVByb3BlcnR5KG9ialdpdGhOb25F
bnVtaW5nR2V0dGVyLCAnYicsIHsKKyAgY29uZmlndXJhYmxlOiB0cnVlLAorICBlbnVtZXJhYmxl
OiB0cnVlLAorICB2YWx1ZTogJ0InLAorICB3cml0YWJsZTogdHJ1ZQorfSk7CitzaG91bGRCZSgi
T2JqZWN0LnZhbHVlcyhvYmpXaXRoTm9uRW51bWluZ0dldHRlcikiLCAiWydBJ10iKTsK
</data>
<flag name="review"
          id="288283"
          type_id="1"
          status="-"
          setter="darin"
    />
    <flag name="commit-queue"
          id="288284"
          type_id="3"
          status="-"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>