<?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>147046</bug_id>
          
          <creation_ts>2015-07-17 13:47:21 -0700</creation_ts>
          <short_desc>&quot;let&quot; scoping introduced incoherent story about symbol table cloning</short_desc>
          <delta_ts>2015-07-20 14:18:10 -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>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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>basile_clement</cc>
    
    <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mmirman</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1110197</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-07-17 13:47:21 -0700</bug_when>
    <thetext>We need to make sure we clone every symbol table that an op_create_lexical_environment or op_put_to_scope
may reference. Any operation that relies on a symbol table constant index needs to be certain that the symbol
table was cloned. We will ensure this property while linking a code block.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1110549</commentid>
    <comment_count>1</comment_count>
      <attachid>257071</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-07-19 18:35:30 -0700</bug_when>
    <thetext>Created attachment 257071
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1110550</commentid>
    <comment_count>2</comment_count>
      <attachid>257071</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-07-19 18:37:21 -0700</bug_when>
    <thetext>Comment on attachment 257071
patch

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

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1605
&gt; +        //ASSERT(!m_symbolTable || !m_symbolTable-&gt;contains(variable.ident().impl()) || resolveType() == Dynamic);

I wonder if it&apos;s worth re-creating a similar assert.
We would basically just be calling back into ::variable to get a Variable to assert properties about,
which is the function the Variable inside this function call comes from. I&apos;m not sure if it&apos;s worth it or not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1110551</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-07-19 18:38:39 -0700</bug_when>
    <thetext>Attachment 257071 did not pass style-queue:


ERROR: Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:522:  Missing space before {  [whitespace/braces] [5]
ERROR: Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1605:  Should have a space between // and comment  [whitespace/comments] [4]
Total errors found: 2 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1110557</commentid>
    <comment_count>4</comment_count>
      <attachid>257071</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2015-07-19 19:40:47 -0700</bug_when>
    <thetext>Comment on attachment 257071
patch

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

&gt; Source/JavaScriptCore/bytecode/CodeBlock.cpp:1779
&gt; +            if (!symbolTable-&gt;correspondsToLexicalScope())

It would be useful to add a comment that not being a lexical scope means that you are the outermost symbol table.

&gt; Source/JavaScriptCore/bytecode/CodeBlock.cpp:1780
&gt; +                m_symbolTableConstantIndex = i + FirstConstantRegisterIndex;

Would be useful to assert that this only gets set once.

&gt; Source/JavaScriptCore/bytecode/CodeBlock.cpp:1782
&gt; +            clonedConstantSymbolTables.add(i + FirstConstantRegisterIndex);

Would be good to assert that this never sees the same thing twice, ie that isNewEntry is always true.

&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:212
&gt; +    Strong&lt;SymbolTable&gt; functionSymbolTable(*m_vm, SymbolTable::create(*m_vm));

Is it necessary to use Strong here?  If a value is on the stack then it will already be strongly marked.

&gt;&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:1605
&gt;&gt; +        //ASSERT(!m_symbolTable || !m_symbolTable-&gt;contains(variable.ident().impl()) || resolveType() == Dynamic);
&gt; 
&gt; I wonder if it&apos;s worth re-creating a similar assert.
&gt; We would basically just be calling back into ::variable to get a Variable to assert properties about,
&gt; which is the function the Variable inside this function call comes from. I&apos;m not sure if it&apos;s worth it or not.

I think we should err on the side of just removing the assert if it takes Work to make it work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1110569</commentid>
    <comment_count>5</comment_count>
      <attachid>257071</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-07-19 23:27:12 -0700</bug_when>
    <thetext>Comment on attachment 257071
patch

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

&gt;&gt; Source/JavaScriptCore/bytecode/CodeBlock.cpp:1779
&gt;&gt; +            if (!symbolTable-&gt;correspondsToLexicalScope())
&gt; 
&gt; It would be useful to add a comment that not being a lexical scope means that you are the outermost symbol table.

Will do.

&gt;&gt; Source/JavaScriptCore/bytecode/CodeBlock.cpp:1780
&gt;&gt; +                m_symbolTableConstantIndex = i + FirstConstantRegisterIndex;
&gt; 
&gt; Would be useful to assert that this only gets set once.

Will do.

&gt;&gt; Source/JavaScriptCore/bytecode/CodeBlock.cpp:1782
&gt;&gt; +            clonedConstantSymbolTables.add(i + FirstConstantRegisterIndex);
&gt; 
&gt; Would be good to assert that this never sees the same thing twice, ie that isNewEntry is always true.

I think a better Assert here would be to have a Hashset&lt;SymbolTable*&gt; that
asserts it&apos;s always a new entry. These indices always have to be unique because
they&apos;re in the loop.

&gt;&gt; Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:212
&gt;&gt; +    Strong&lt;SymbolTable&gt; functionSymbolTable(*m_vm, SymbolTable::create(*m_vm));
&gt; 
&gt; Is it necessary to use Strong here?  If a value is on the stack then it will already be strongly marked.

No, it&apos;s not. It will be Strong in m_symbolTableStack and it will also be in the constant pool.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1110572</commentid>
    <comment_count>6</comment_count>
      <attachid>257071</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-07-19 23:51:34 -0700</bug_when>
    <thetext>Comment on attachment 257071
patch

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

&gt;&gt;&gt; Source/JavaScriptCore/bytecode/CodeBlock.cpp:1780
&gt;&gt;&gt; +                m_symbolTableConstantIndex = i + FirstConstantRegisterIndex;
&gt;&gt; 
&gt;&gt; Would be useful to assert that this only gets set once.
&gt; 
&gt; Will do.

Adding this assert made me realize that this code is stupid. There will be more than
one symbol table with where correspondsToLexicalScope() is false in a world with
catch scopes, function name scopes, etc. I think the correct solution here is to remove
this branch completely and rely on unlinked code block&apos;s symbolTableConstantIndex()
and then get rid of symbolTableConstantIndex() asap (I plan to write the necessary
type profiler patch tomorrow).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1110755</commentid>
    <comment_count>7</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-07-20 14:18:10 -0700</bug_when>
    <thetext>landed in:
http://trac.webkit.org/changeset/187033</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>257071</attachid>
            <date>2015-07-19 18:35:30 -0700</date>
            <delta_ts>2015-07-19 19:40:47 -0700</delta_ts>
            <desc>patch</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>35145</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTg3MDE0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU1IEBA
CisyMDE1LTA3LTE5ICBTYWFtIGJhcmF0aSAgPHNhYW1iYXJhdGkxQGdtYWlsLmNvbT4KKworICAg
ICAgICAibGV0IiBzY29waW5nIGludHJvZHVjZWQgaW5jb2hlcmVudCBzdG9yeSBhYm91dCBzeW1i
b2wgdGFibGUgY2xvbmluZworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MTQ3MDQ2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgVGhpcyBwYXRjaCBub3cgZXN0YWJsaXNoZXMgYSBjbGVhciBzZXQgb2YgcnVsZXMg
Zm9yIGhvdyBTeW1ib2xUYWJsZXMKKyAgICAgICAgYXJlIG93bmVkIGJ5IENvZGVCbG9jay4gRXZl
cnkgU3ltYm9sVGFibGUgdGhhdCBpcyB1c2VkIGJ5IGEgYnl0ZWNvZGUKKyAgICAgICAgaW5zdHJ1
Y3Rpb24gbXVzdCBsaXZlIGluIENvZGVCbG9jaydzIGNvbnN0YW50IHJlZ2lzdGVyIHBvb2wuIFdo
ZW4gQ29kZUJsb2NrCisgICAgICAgIGlzIGJlaW5nIGxpbmtlZCwgaXQgZW5zdXJlcyB0aGF0IGV2
ZXJ5IFN5bWJvbFRhYmxlIGluIHRoZSBjb25zdGFudCBwb29sIGlzIGNsb25lZC4gCisgICAgICAg
IFRoaXMgbGVhdmVzIG5vIHJvb20gZm9yIGFuIHVuLWNsb25lZCBzeW1ib2wgdGFibGUgdG8gYmUg
dXNlZCBieSBhIGJ5dGVjb2RlIGluc3RydWN0aW9uLiAKKyAgICAgICAgU29tZSBpbnN0cnVjdGlv
bnMgbWF5IHJlZmVyIHRvIFN5bWJvbFRhYmxlJ3MgaW5kaXJlY3RseSB0aHJvdWdoIGEgSlNMZXhp
Y2FsRW52aXJvbm1lbnQuIAorICAgICAgICBUaGlzIGlzIGZpbmUsIGFsbCBKU0xleGljYWxFbnZp
cm9ubWVudCdzIGFyZSBhbGxvY2F0ZWQgd2l0aCByZWZlcmVuY2VzIHRvIGNsb25lZCBzeW1ib2wg
dGFibGVzLgorCisgICAgICAgIEFub3RoZXIgZ29hbCBvZiB0aGlzIHBhdGNoIGlzIHRvIHJlbW92
ZSB0aGUgbm90aW9uIHRoYXQgYSBTeW1ib2xUYWJsZSBpcyAxIHRvIDEgCisgICAgICAgIHdpdGgg
YSBDb2RlQmxvY2suIFdpdGggbGV4aWNhbCBzY29waW5nLCB0aGlzIHZpZXcgb2YgdGhlIHdvcmxk
IGlzIG5vIGxvbmdlcgorICAgICAgICBjb3JyZWN0LiBUaGlzIHBhdGNoIGJlZ2lucyB0byByZW1v
dmUgdGhpcyBhc3N1bXB0aW9uIGJ5IG1ha2luZyBDb2RlQmxvY2sncworICAgICAgICBzeW1ib2xU
YWJsZSgpIGdldHRlciBtZXRob2QgcHJpdmF0ZS4gVGhlcmUgaXMgc3RpbGwgb25lIHBsYWNlIHdo
ZXJlIHdlIG5lZWQKKyAgICAgICAgdG8gcHVyZ2Ugb3VyIGNvZGViYXNlIG9mIHRoaXMgYXNzdW1w
dGlvbiBhbmQgdGhhdCBpcyB0aGUgdHlwZSBwcm9maWxlci4gSXQgCisgICAgICAgIGhhcyBub3Qg
YmVlbiB1cGRhdGVkIGZvciBsZXhpY2FsIHNjb3BpbmcuIEFmdGVyIGl0IGlzIHVwZGF0ZWQgaW4g
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDU0MzgK
KyAgICAgICAgd2Ugd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSBDb2RlQmxvY2sncyBzeW1ib2xUYWJs
ZSgpIGdldHRlciBlbnRpcmVseS4KKworICAgICAgICAqIGJ5dGVjb2RlL0NvZGVCbG9jay5jcHA6
CisgICAgICAgIChKU0M6OkNvZGVCbG9jazo6Q29kZUJsb2NrKToKKyAgICAgICAgKEpTQzo6Q29k
ZUJsb2NrOjpuYW1lRm9yUmVnaXN0ZXIpOgorICAgICAgICAqIGJ5dGVjb2RlL0NvZGVCbG9jay5o
OgorICAgICAgICAoSlNDOjpDb2RlQmxvY2s6OmFkZFN0cmluZ1N3aXRjaEp1bXBUYWJsZSk6Cisg
ICAgICAgIChKU0M6OkNvZGVCbG9jazo6c3RyaW5nU3dpdGNoSnVtcFRhYmxlKToKKyAgICAgICAg
KEpTQzo6Q29kZUJsb2NrOjpldmFsQ29kZUNhY2hlKToKKyAgICAgICAgKEpTQzo6Q29kZUJsb2Nr
OjpzeW1ib2xUYWJsZSk6CisgICAgICAgICogYnl0ZWNvZGUvVW5saW5rZWRDb2RlQmxvY2suaDoK
KyAgICAgICAgKiBieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwOgorICAgICAgICAo
SlNDOjpCeXRlY29kZUdlbmVyYXRvcjo6Qnl0ZWNvZGVHZW5lcmF0b3IpOgorICAgICAgICAoSlND
OjpCeXRlY29kZUdlbmVyYXRvcjo6cHVzaExleGljYWxTY29wZSk6CisgICAgICAgICogZGZnL0RG
R0dyYXBoLmg6CisgICAgICAgIChKU0M6OkRGRzo6R3JhcGg6OmJhc2VsaW5lQ29kZUJsb2NrRm9y
KToKKyAgICAgICAgKEpTQzo6REZHOjpHcmFwaDo6aXNTdHJpY3RNb2RlRm9yKToKKyAgICAgICAg
KEpTQzo6REZHOjpHcmFwaDo6c3ltYm9sVGFibGVGb3IpOiBEZWxldGVkLgorICAgICAgICAqIGpp
dC9Bc3NlbWJseUhlbHBlcnMuaDoKKyAgICAgICAgKEpTQzo6QXNzZW1ibHlIZWxwZXJzOjpiYXNl
bGluZUNvZGVCbG9jayk6CisgICAgICAgIChKU0M6OkFzc2VtYmx5SGVscGVyczo6YXJndW1lbnRz
U3RhcnQpOgorICAgICAgICAoSlNDOjpBc3NlbWJseUhlbHBlcnM6OnN5bWJvbFRhYmxlRm9yKTog
RGVsZXRlZC4KKyAgICAgICAgKiBydW50aW1lL0NvbW1vblNsb3dQYXRocy5jcHA6CisgICAgICAg
IChKU0M6OlNMT1dfUEFUSF9ERUNMKToKKyAgICAgICAgKiBydW50aW1lL0V4ZWN1dGFibGUuY3Bw
OgorICAgICAgICAoSlNDOjpGdW5jdGlvbkV4ZWN1dGFibGU6OnZpc2l0Q2hpbGRyZW4pOgorICAg
ICAgICAoSlNDOjpGdW5jdGlvbkV4ZWN1dGFibGU6OmNsZWFyVW5saW5rZWRDb2RlRm9yUmVjb21w
aWxhdGlvbik6CisgICAgICAgIChKU0M6OkZ1bmN0aW9uRXhlY3V0YWJsZTo6c3ltYm9sVGFibGUp
OiBEZWxldGVkLgorICAgICAgICAqIHJ1bnRpbWUvRXhlY3V0YWJsZS5oOgorCiAyMDE1LTA3LTE5
ICBTYWFtIGJhcmF0aSAgPHNhYW1iYXJhdGkxQGdtYWlsLmNvbT4KIAogICAgICAgICBQYXJzZXI6
OnBhcnNlRnVuY3Rpb25JbmZvIGhpdHMgUkVMRUFTRV9BU1NFUlQgZm9yIEFycm93IEZ1bmN0aW9u
cwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJ
KHJldmlzaW9uIDE4NzAxNCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2Rl
QmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNzUwLDggKzE3NTAsNiBAQCBDb2RlQmxvY2s6
OkNvZGVCbG9jayhTY3JpcHRFeGVjdXRhYmxlKiBvCiAgICAgQVNTRVJUKG1faGVhcC0+aXNEZWZl
cnJlZCgpKTsKICAgICBBU1NFUlQobV9zY29wZVJlZ2lzdGVyLmlzTG9jYWwoKSk7CiAKLSAgICBi
b29sIGRpZENsb25lU3ltYm9sVGFibGUgPSBmYWxzZTsKLSAgICAKICAgICBBU1NFUlQobV9zb3Vy
Y2UpOwogICAgIHNldE51bVBhcmFtZXRlcnModW5saW5rZWRDb2RlQmxvY2stPm51bVBhcmFtZXRl
cnMoKSk7CiAKQEAgLTE3NjcsMjQgKzE3NjUsMjMgQEAgQ29kZUJsb2NrOjpDb2RlQmxvY2soU2Ny
aXB0RXhlY3V0YWJsZSogbwogICAgICAgICBpZiAodW5zaWduZWQgcmVnaXN0ZXJJbmRleCA9IHVu
bGlua2VkQ29kZUJsb2NrLT5yZWdpc3RlckluZGV4Rm9yTGlua1RpbWVDb25zdGFudCh0eXBlKSkK
ICAgICAgICAgICAgIG1fY29uc3RhbnRSZWdpc3RlcnNbcmVnaXN0ZXJJbmRleF0uc2V0KCptX3Zt
LCBvd25lckV4ZWN1dGFibGUsIG1fZ2xvYmFsT2JqZWN0LT5qc0NlbGxGb3JMaW5rVGltZUNvbnN0
YW50KHR5cGUpKTsKICAgICB9Ci0gICAgCi0gICAgaWYgKFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJs
ZSA9IHVubGlua2VkQ29kZUJsb2NrLT5zeW1ib2xUYWJsZSgpKSB7Ci0gICAgICAgIGlmIChtX3Zt
LT50eXBlUHJvZmlsZXIoKSkgewotICAgICAgICAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2Nr
ZXIoc3ltYm9sVGFibGUtPm1fbG9jayk7Ci0gICAgICAgICAgICBzeW1ib2xUYWJsZS0+cHJlcGFy
ZUZvclR5cGVQcm9maWxpbmcobG9ja2VyKTsKLSAgICAgICAgfQogCi0gICAgICAgIFN5bWJvbFRh
YmxlKiBuZXdUYWJsZTsKLSAgICAgICAgaWYgKGNvZGVUeXBlKCkgPT0gRnVuY3Rpb25Db2RlICYm
IHN5bWJvbFRhYmxlLT5zY29wZVNpemUoKSkgewotICAgICAgICAgICAgbmV3VGFibGUgPSBzeW1i
b2xUYWJsZS0+Y2xvbmVTY29wZVBhcnQoKm1fdm0pOwotICAgICAgICAgICAgZGlkQ2xvbmVTeW1i
b2xUYWJsZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbmV3VGFibGUgPSBz
eW1ib2xUYWJsZTsKLQotICAgICAgICBtX3N5bWJvbFRhYmxlQ29uc3RhbnRJbmRleCA9IHVubGlu
a2VkQ29kZUJsb2NrLT5zeW1ib2xUYWJsZUNvbnN0YW50SW5kZXgoKTsKLSAgICAgICAgcmVwbGFj
ZUNvbnN0YW50KG1fc3ltYm9sVGFibGVDb25zdGFudEluZGV4LCBuZXdUYWJsZSk7Ci0gICAgfSBl
bHNlIAotICAgICAgICBtX3N5bWJvbFRhYmxlQ29uc3RhbnRJbmRleCA9IDA7CisgICAgSGFzaFNl
dDxpbnQsIFdURjo6SW50SGFzaDxpbnQ+LCBXVEY6OlVuc2lnbmVkV2l0aFplcm9LZXlIYXNoVHJh
aXRzPGludD4+IGNsb25lZENvbnN0YW50U3ltYm9sVGFibGVzOworICAgIG1fc3ltYm9sVGFibGVD
b25zdGFudEluZGV4ID0gdW5saW5rZWRDb2RlQmxvY2stPnN5bWJvbFRhYmxlQ29uc3RhbnRJbmRl
eCgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2NvbnN0YW50UmVnaXN0ZXJzLnNp
emUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtX2NvbnN0YW50UmVnaXN0ZXJzW2ldLmdldCgpLmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoU3ltYm9sVGFibGUq
IHN5bWJvbFRhYmxlID0ganNEeW5hbWljQ2FzdDxTeW1ib2xUYWJsZSo+KG1fY29uc3RhbnRSZWdp
c3RlcnNbaV0uZ2V0KCkpKSB7CisgICAgICAgICAgICBpZiAobV92bS0+dHlwZVByb2ZpbGVyKCkp
IHsKKyAgICAgICAgICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihzeW1ib2xUYWJs
ZS0+bV9sb2NrKTsKKyAgICAgICAgICAgICAgICBzeW1ib2xUYWJsZS0+cHJlcGFyZUZvclR5cGVQ
cm9maWxpbmcobG9ja2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3ltYm9s
VGFibGUtPmNvcnJlc3BvbmRzVG9MZXhpY2FsU2NvcGUoKSkKKyAgICAgICAgICAgICAgICBtX3N5
bWJvbFRhYmxlQ29uc3RhbnRJbmRleCA9IGkgKyBGaXJzdENvbnN0YW50UmVnaXN0ZXJJbmRleDsK
KyAgICAgICAgICAgIG1fY29uc3RhbnRSZWdpc3RlcnNbaV0uc2V0KCptX3ZtLCBvd25lckV4ZWN1
dGFibGUsIHN5bWJvbFRhYmxlLT5jbG9uZVNjb3BlUGFydCgqbV92bSkpOworICAgICAgICAgICAg
Y2xvbmVkQ29uc3RhbnRTeW1ib2xUYWJsZXMuYWRkKGkgKyBGaXJzdENvbnN0YW50UmVnaXN0ZXJJ
bmRleCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBtX2Z1bmN0aW9uRGVjbHMucmVzaXplVG9G
aXQodW5saW5rZWRDb2RlQmxvY2stPm51bWJlck9mRnVuY3Rpb25EZWNscygpKTsKICAgICBmb3Ig
KHNpemVfdCBjb3VudCA9IHVubGlua2VkQ29kZUJsb2NrLT5udW1iZXJPZkZ1bmN0aW9uRGVjbHMo
KSwgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CkBAIC0xODY4LDggKzE4NjUsNiBAQCBDb2RlQmxv
Y2s6OkNvZGVCbG9jayhTY3JpcHRFeGVjdXRhYmxlKiBvCiAKICAgICBWZWN0b3I8SW5zdHJ1Y3Rp
b24sIDAsIFVuc2FmZVZlY3Rvck92ZXJmbG93PiBpbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25Db3Vu
dCk7CiAKLSAgICBIYXNoU2V0PGludCwgV1RGOjpJbnRIYXNoPGludD4sIFdURjo6VW5zaWduZWRX
aXRoWmVyb0tleUhhc2hUcmFpdHM8aW50Pj4gY2xvbmVkQ29uc3RhbnRTeW1ib2xUYWJsZXM7Ci0K
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyAhaW5zdHJ1Y3Rpb25SZWFkZXIuYXRFbmQoKTsgKSB7
CiAgICAgICAgIGNvbnN0IFVubGlua2VkSW5zdHJ1Y3Rpb24qIHBjID0gaW5zdHJ1Y3Rpb25SZWFk
ZXIubmV4dCgpOwogCkBAIC0xOTYyLDYgKzE5NTcsMTIgQEAgQ29kZUJsb2NrOjpDb2RlQmxvY2so
U2NyaXB0RXhlY3V0YWJsZSogbwogICAgICAgICBjYXNlIG9wX2dldF9hcnJheV9sZW5ndGg6CiAg
ICAgICAgICAgICBDUkFTSCgpOwogCisgICAgICAgIGNhc2Ugb3BfY3JlYXRlX2xleGljYWxfZW52
aXJvbm1lbnQ6IHsKKyAgICAgICAgICAgIGludCBzeW1ib2xUYWJsZUluZGV4ID0gcGNbM10udS5v
cGVyYW5kOworICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoY2xvbmVkQ29uc3RhbnRTeW1ib2xU
YWJsZXMuY29udGFpbnMoc3ltYm9sVGFibGVJbmRleCkpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKwogICAgICAgICBjYXNlIG9wX3Jlc29sdmVfc2NvcGU6IHsKICAgICAgICAgICAg
IGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0gaWRlbnRpZmllcihwY1szXS51Lm9wZXJhbmQpOwog
ICAgICAgICAgICAgUmVzb2x2ZVR5cGUgdHlwZSA9IHN0YXRpY19jYXN0PFJlc29sdmVUeXBlPihw
Y1s0XS51Lm9wZXJhbmQpOwpAQCAtMjAxMywyOSArMjAxNCw4IEBAIENvZGVCbG9jazo6Q29kZUJs
b2NrKFNjcmlwdEV4ZWN1dGFibGUqIG8KICAgICAgICAgICAgIGlmIChtb2RlQW5kVHlwZS50eXBl
KCkgPT0gTG9jYWxDbG9zdXJlVmFyKSB7CiAgICAgICAgICAgICAgICAgLy8gT25seSBkbyB3YXRj
aGluZyBpZiB0aGUgcHJvcGVydHkgd2UncmUgcHV0dGluZyB0byBpcyBub3QgYW5vbnltb3VzLgog
ICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocGNbMl0udS5vcGVyYW5k
KSAhPSBVSU5UX01BWCkgewotICAgICAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgY3JlYXRl
X2xleGljYWxfZW52aXJvbm1lbnQgaW5zdHJ1Y3Rpb25zIG1heSByZWZlciB0byB0aGUgc2FtZSBz
eW1ib2wgdGFibGUuIAotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIEVT
NidzICdmb3InIGxvb3BzIGVhY2ggaGF2aW5nIGEgc2VwYXJhdGUgYWN0aXZhdGlvbi4gV2Ugd2ls
bCBlbWl0IHR3byAKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlX2xleGljYWxfZW52aXJv
bm1lbnQgaW5zdHJ1Y3Rpb25zIGZvciBhIGdpdmVuIGxvb3AgdG8gaW1wbGVtZW50IHRoaXMgZmVh
dHVyZSwgCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBib3RoIGluc3RydWN0aW9ucyBzaG91
bGQgcmVseSBvbiB0aGUgc2FtZSB1bmRlcmx5aW5nIHN5bWJvbCB0YWJsZSBzbyB0aGF0IHRoZSAK
LSAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCdzIHNjb3BlIGlzbid0IG1pc3Rha2VubHkgaW5m
ZXJyZWQgYXMgYSBzaW5nbGV0b24gc2NvcGUuCiAgICAgICAgICAgICAgICAgICAgIGludCBzeW1i
b2xUYWJsZUluZGV4ID0gcGNbNV0udS5vcGVyYW5kOwotICAgICAgICAgICAgICAgICAgICBhdXRv
IGFkZFJlc3VsdCA9IGNsb25lZENvbnN0YW50U3ltYm9sVGFibGVzLmFkZChzeW1ib2xUYWJsZUlu
ZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5KSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xUYWJsZSogdW5saW5rZWRUYWJsZSA9IGpzQ2Fz
dDxTeW1ib2xUYWJsZSo+KGdldENvbnN0YW50KHN5bWJvbFRhYmxlSW5kZXgpKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIFN5bWJvbFRhYmxlKiBsaW5rZWRUYWJsZTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICh1bmxpbmtlZFRhYmxlLT5jb3JyZXNwb25kc1RvTGV4aWNhbFNjb3BlKCkp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVCh1bmxpbmtlZFRh
YmxlLT5zY29wZVNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VkVGFi
bGUgPSB1bmxpbmtlZFRhYmxlLT5jbG9uZVNjb3BlUGFydCgqbV92bSk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJl
IGlzIG9ubHkgb25lIFN5bWJvbFRhYmxlIHBlciBmdW5jdGlvbiB0aGF0IGRvZXMgbm90IGNvcnJl
c3BvbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIGxleGljYWwgc2NvcGUg
YW5kIHRoYXQgaXMgdGhlIGZ1bmN0aW9uJ3MgdmFyIHN5bWJvbCB0YWJsZS4KLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IGNsb25lZCB0aGF0LgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGxpbmtlZFRhYmxlID0gc3ltYm9sVGFibGUoKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAobGlua2VkVGFibGUtPnNjb3BlU2l6ZSgpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChkaWRDbG9uZVN5bWJvbFRh
YmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAg
IHJlcGxhY2VDb25zdGFudChzeW1ib2xUYWJsZUluZGV4LCBsaW5rZWRUYWJsZSk7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoY2xvbmVk
Q29uc3RhbnRTeW1ib2xUYWJsZXMuY29udGFpbnMoc3ltYm9sVGFibGVJbmRleCkpOwogICAgICAg
ICAgICAgICAgICAgICBTeW1ib2xUYWJsZSogc3ltYm9sVGFibGUgPSBqc0Nhc3Q8U3ltYm9sVGFi
bGUqPihnZXRDb25zdGFudChzeW1ib2xUYWJsZUluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0gaWRlbnRpZmllcihwY1syXS51Lm9wZXJhbmQpOwog
ICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihzeW1ib2xUYWJs
ZS0+bV9sb2NrKTsKQEAgLTIxMDYsNiArMjA4NiwxMCBAQCBDb2RlQmxvY2s6OkNvZGVCbG9jayhT
Y3JpcHRFeGVjdXRhYmxlKiBvCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIFByb2Zp
bGVUeXBlQnl0ZWNvZGVQdXRUb0xvY2FsU2NvcGU6CiAgICAgICAgICAgICBjYXNlIFByb2ZpbGVU
eXBlQnl0ZWNvZGVHZXRGcm9tTG9jYWxTY29wZTogeworICAgICAgICAgICAgICAgIGlmICghbV9z
eW1ib2xUYWJsZUNvbnN0YW50SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVmFy
aWFibGVJRCA9IFR5cGVQcm9maWxlck5vR2xvYmFsSURFeGlzdHM7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb25zdCBJZGVu
dGlmaWVyJiBpZGVudCA9IGlkZW50aWZpZXIocGNbNF0udS5vcGVyYW5kKTsKICAgICAgICAgICAg
ICAgICBzeW1ib2xUYWJsZSA9IHRoaXMtPnN5bWJvbFRhYmxlKCk7CiAgICAgICAgICAgICAgICAg
Q29uY3VycmVudEpJVExvY2tlciBsb2NrZXIoc3ltYm9sVGFibGUtPm1fbG9jayk7CkBAIC0yMTE4
LDYgKzIxMDIsMTAgQEAgQ29kZUJsb2NrOjpDb2RlQmxvY2soU2NyaXB0RXhlY3V0YWJsZSogbwog
ICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlIFByb2ZpbGVUeXBlQnl0ZWNvZGVIYXNH
bG9iYWxJRDogeworICAgICAgICAgICAgICAgIGlmICghbV9zeW1ib2xUYWJsZUNvbnN0YW50SW5k
ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWFibGVJRCA9IFR5cGVQcm9maWxl
ck5vR2xvYmFsSURFeGlzdHM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgICAgICBzeW1ib2xUYWJsZSA9IHRoaXMtPnN5bWJvbFRhYmxl
KCk7CiAgICAgICAgICAgICAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2NrZXIoc3ltYm9sVGFi
bGUtPm1fbG9jayk7CiAgICAgICAgICAgICAgICAgZ2xvYmFsVmFyaWFibGVJRCA9IHN5bWJvbFRh
YmxlLT51bmlxdWVJREZvck9mZnNldChsb2NrZXIsIFZhck9mZnNldChwcm9maWxlUmVnaXN0ZXIp
LCAqdm0oKSk7CkBAIC0zODM5LDEzICszODI3LDE5IEBAIGJvb2wgQ29kZUJsb2NrOjp1c2VzT3Bj
b2RlKE9wY29kZUlEIG9wY28KIAogU3RyaW5nIENvZGVCbG9jazo6bmFtZUZvclJlZ2lzdGVyKFZp
cnR1YWxSZWdpc3RlciB2aXJ0dWFsUmVnaXN0ZXIpCiB7Ci0gICAgQ29uY3VycmVudEpJVExvY2tl
ciBsb2NrZXIoc3ltYm9sVGFibGUoKS0+bV9sb2NrKTsKLSAgICBTeW1ib2xUYWJsZTo6TWFwOjpp
dGVyYXRvciBlbmQgPSBzeW1ib2xUYWJsZSgpLT5lbmQobG9ja2VyKTsKLSAgICBmb3IgKFN5bWJv
bFRhYmxlOjpNYXA6Oml0ZXJhdG9yIHB0ciA9IHN5bWJvbFRhYmxlKCktPmJlZ2luKGxvY2tlcik7
IHB0ciAhPSBlbmQ7ICsrcHRyKSB7Ci0gICAgICAgIGlmIChwdHItPnZhbHVlLnZhck9mZnNldCgp
ID09IFZhck9mZnNldCh2aXJ0dWFsUmVnaXN0ZXIpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyB3b24ndCB3b3JrIGZyb20gdGhlIGNvbXBpbGF0aW9uIHRocmVhZC4KLSAgICAgICAgICAg
IC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUzMDAKLSAgICAg
ICAgICAgIHJldHVybiBwdHItPmtleS5nZXQoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbV9jb25zdGFudFJlZ2lzdGVycy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobV9jb25z
dGFudFJlZ2lzdGVyc1tpXS5nZXQoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgaWYgKFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSA9IGpzRHluYW1pY0Nhc3Q8U3lt
Ym9sVGFibGUqPihtX2NvbnN0YW50UmVnaXN0ZXJzW2ldLmdldCgpKSkgeworICAgICAgICAgICAg
Q29uY3VycmVudEpJVExvY2tlciBsb2NrZXIoc3ltYm9sVGFibGUtPm1fbG9jayk7CisgICAgICAg
ICAgICBhdXRvIGVuZCA9IHN5bWJvbFRhYmxlLT5lbmQobG9ja2VyKTsKKyAgICAgICAgICAgIGZv
ciAoYXV0byBwdHIgPSBzeW1ib2xUYWJsZS0+YmVnaW4obG9ja2VyKTsgcHRyICE9IGVuZDsgKytw
dHIpIHsKKyAgICAgICAgICAgICAgICBpZiAocHRyLT52YWx1ZS52YXJPZmZzZXQoKSA9PSBWYXJP
ZmZzZXQodmlydHVhbFJlZ2lzdGVyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyB3b24ndCB3b3JrIGZyb20gdGhlIGNvbXBpbGF0aW9uIHRocmVhZC4KKyAgICAgICAgICAg
ICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNTMw
MAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHRyLT5rZXkuZ2V0KCk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmICh2aXJ0dWFs
UmVnaXN0ZXIgPT0gdGhpc1JlZ2lzdGVyKCkpCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
Ynl0ZWNvZGUvQ29kZUJsb2NrLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L2J5dGVjb2RlL0NvZGVCbG9jay5oCShyZXZpc2lvbiAxODcwMTQpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYnl0ZWNvZGUvQ29kZUJsb2NrLmgJKHdvcmtpbmcgY29weSkKQEAgLTY2NCw4ICs2
NjQsNiBAQCBwdWJsaWM6CiAgICAgU3RyaW5nSnVtcFRhYmxlJiBhZGRTdHJpbmdTd2l0Y2hKdW1w
VGFibGUoKSB7IGNyZWF0ZVJhcmVEYXRhSWZOZWNlc3NhcnkoKTsgbV9yYXJlRGF0YS0+bV9zdHJp
bmdTd2l0Y2hKdW1wVGFibGVzLmFwcGVuZChTdHJpbmdKdW1wVGFibGUoKSk7IHJldHVybiBtX3Jh
cmVEYXRhLT5tX3N0cmluZ1N3aXRjaEp1bXBUYWJsZXMubGFzdCgpOyB9CiAgICAgU3RyaW5nSnVt
cFRhYmxlJiBzdHJpbmdTd2l0Y2hKdW1wVGFibGUoaW50IHRhYmxlSW5kZXgpIHsgUkVMRUFTRV9B
U1NFUlQobV9yYXJlRGF0YSk7IHJldHVybiBtX3JhcmVEYXRhLT5tX3N0cmluZ1N3aXRjaEp1bXBU
YWJsZXNbdGFibGVJbmRleF07IH0KIAotICAgIFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSgpIGNv
bnN0IHsgUkVMRUFTRV9BU1NFUlQobV9zeW1ib2xUYWJsZUNvbnN0YW50SW5kZXgpOyByZXR1cm4g
anNDYXN0PFN5bWJvbFRhYmxlKj4oZ2V0Q29uc3RhbnQobV9zeW1ib2xUYWJsZUNvbnN0YW50SW5k
ZXgpKTsgfQotCiAgICAgRXZhbENvZGVDYWNoZSYgZXZhbENvZGVDYWNoZSgpIHsgY3JlYXRlUmFy
ZURhdGFJZk5lY2Vzc2FyeSgpOyByZXR1cm4gbV9yYXJlRGF0YS0+bV9ldmFsQ29kZUNhY2hlOyB9
CiAKICAgICBlbnVtIFNocmlua01vZGUgewpAQCAtOTE4LDYgKzkxNiwxNSBAQCBwcm90ZWN0ZWQ6
CiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBDb2RlQmxvY2tTZXQ7CiAgICAgCisgICAgU3lt
Ym9sVGFibGUqIHN5bWJvbFRhYmxlKCkgY29uc3QgCisgICAgeyAKKyAgICAgICAgLy8gRklYTUU6
IEdldCByaWQgb2YgdGhpcyBmdW5jdGlvbiBvbmNlIHRoZSB0eXBlIHByb2ZpbGVyIGhhcyBhIG5v
dGlvbiBvZiB3aGF0CisgICAgICAgIC8vIHN5bWJvbCB0YWJsZSBpdCdzIHJlYWRpbmcgZnJvbS4K
KyAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NTQz
OAorICAgICAgICBSRUxFQVNFX0FTU0VSVChtX3N5bWJvbFRhYmxlQ29uc3RhbnRJbmRleCk7IAor
ICAgICAgICByZXR1cm4ganNDYXN0PFN5bWJvbFRhYmxlKj4oZ2V0Q29uc3RhbnQobV9zeW1ib2xU
YWJsZUNvbnN0YW50SW5kZXgpKTsKKyAgICB9CisKICAgICBDb2RlQmxvY2sqIHNwZWNpYWxPU1JF
bnRyeUJsb2NrT3JOdWxsKCk7CiAgICAgCiAgICAgdm9pZCBub3RpY2VJbmNvbWluZ0NhbGwoRXhl
Y1N0YXRlKiBjYWxsZXJGcmFtZSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNv
ZGUvVW5saW5rZWRDb2RlQmxvY2suY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29kZS9VbmxpbmtlZENvZGVCbG9jay5jcHAJKHJldmlzaW9uIDE4NzAxNCkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9VbmxpbmtlZENvZGVCbG9jay5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTExNiw4ICsxMTYsNiBAQCB2b2lkIFVubGlua2VkRnVuY3Rpb25FeGVj
dXRhYmxlOjp2aXNpdENoCiAgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fY29kZUJs
b2NrRm9yQ2FsbCk7CiAgICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fY29kZUJsb2Nr
Rm9yQ29uc3RydWN0KTsKICAgICB2aXNpdG9yLmFwcGVuZCgmdGhpc09iamVjdC0+bV9uYW1lVmFs
dWUpOwotICAgIHZpc2l0b3IuYXBwZW5kKCZ0aGlzT2JqZWN0LT5tX3N5bWJvbFRhYmxlRm9yQ2Fs
bCk7Ci0gICAgdmlzaXRvci5hcHBlbmQoJnRoaXNPYmplY3QtPm1fc3ltYm9sVGFibGVGb3JDb25z
dHJ1Y3QpOwogfQogCiBGdW5jdGlvbkV4ZWN1dGFibGUqIFVubGlua2VkRnVuY3Rpb25FeGVjdXRh
YmxlOjpsaW5rKFZNJiB2bSwgY29uc3QgU291cmNlQ29kZSYgb3duZXJTb3VyY2UsIGludCBvdmVy
cmlkZUxpbmVOdW1iZXIpCkBAIC0yMDksMTEgKzIwNyw5IEBAIFVubGlua2VkRnVuY3Rpb25Db2Rl
QmxvY2sqIFVubGlua2VkRnVuY3QKICAgICBzd2l0Y2ggKHNwZWNpYWxpemF0aW9uS2luZCkgewog
ICAgIGNhc2UgQ29kZUZvckNhbGw6CiAgICAgICAgIG1fY29kZUJsb2NrRm9yQ2FsbC5zZXQodm0s
IHRoaXMsIHJlc3VsdCk7Ci0gICAgICAgIG1fc3ltYm9sVGFibGVGb3JDYWxsLnNldCh2bSwgdGhp
cywgcmVzdWx0LT5zeW1ib2xUYWJsZSgpKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBDb2Rl
Rm9yQ29uc3RydWN0OgogICAgICAgICBtX2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5zZXQodm0sIHRo
aXMsIHJlc3VsdCk7Ci0gICAgICAgIG1fc3ltYm9sVGFibGVGb3JDb25zdHJ1Y3Quc2V0KHZtLCB0
aGlzLCByZXN1bHQtPnN5bWJvbFRhYmxlKCkpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAg
cmV0dXJuIHJlc3VsdDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Vbmxp
bmtlZENvZGVCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRl
Y29kZS9VbmxpbmtlZENvZGVCbG9jay5oCShyZXZpc2lvbiAxODcwMTQpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvYnl0ZWNvZGUvVW5saW5rZWRDb2RlQmxvY2suaAkod29ya2luZyBjb3B5KQpA
QCAtMTE4LDEwICsxMTgsNiBAQCBwdWJsaWM6CiAgICAgY29uc3QgSWRlbnRpZmllciYgbmFtZSgp
IGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQogICAgIGNvbnN0IElkZW50aWZpZXImIGluZmVycmVk
TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1faW5mZXJyZWROYW1lOyB9CiAgICAgSlNTdHJpbmcqIG5h
bWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZVZhbHVlLmdldCgpOyB9Ci0gICAgU3ltYm9s
VGFibGUqIHN5bWJvbFRhYmxlKENvZGVTcGVjaWFsaXphdGlvbktpbmQga2luZCkKLSAgICB7Ci0g
ICAgICAgIHJldHVybiAoa2luZCA9PSBDb2RlRm9yQ2FsbCkgPyBtX3N5bWJvbFRhYmxlRm9yQ2Fs
bC5nZXQoKSA6IG1fc3ltYm9sVGFibGVGb3JDb25zdHJ1Y3QuZ2V0KCk7Ci0gICAgfQogICAgIHVu
c2lnbmVkIHBhcmFtZXRlckNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9wYXJhbWV0ZXJDb3VudDsg
fTsKICAgICBGdW5jdGlvblBhcnNlTW9kZSBwYXJzZU1vZGUoKSBjb25zdCB7IHJldHVybiBtX3Bh
cnNlTW9kZTsgfTsKICAgICBib29sIGlzSW5TdHJpY3RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4g
bV9pc0luU3RyaWN0Q29udGV4dDsgfQpAQCAtMTQ5LDggKzE0NSw2IEBAIHB1YmxpYzoKIAogICAg
IHZvaWQgY2xlYXJDb2RlRm9yUmVjb21waWxhdGlvbigpCiAgICAgewotICAgICAgICBtX3N5bWJv
bFRhYmxlRm9yQ2FsbC5jbGVhcigpOwotICAgICAgICBtX3N5bWJvbFRhYmxlRm9yQ29uc3RydWN0
LmNsZWFyKCk7CiAgICAgICAgIG1fY29kZUJsb2NrRm9yQ2FsbC5jbGVhcigpOwogICAgICAgICBt
X2NvZGVCbG9ja0ZvckNvbnN0cnVjdC5jbGVhcigpOwogICAgIH0KQEAgLTE3OSw4ICsxNzMsNiBA
QCBwcml2YXRlOgogICAgIElkZW50aWZpZXIgbV9uYW1lOwogICAgIElkZW50aWZpZXIgbV9pbmZl
cnJlZE5hbWU7CiAgICAgV3JpdGVCYXJyaWVyPEpTU3RyaW5nPiBtX25hbWVWYWx1ZTsKLSAgICBX
cml0ZUJhcnJpZXI8U3ltYm9sVGFibGU+IG1fc3ltYm9sVGFibGVGb3JDYWxsOwotICAgIFdyaXRl
QmFycmllcjxTeW1ib2xUYWJsZT4gbV9zeW1ib2xUYWJsZUZvckNvbnN0cnVjdDsKICAgICBSZWZQ
dHI8U291cmNlUHJvdmlkZXI+IG1fc291cmNlT3ZlcnJpZGU7CiAgICAgVmFyaWFibGVFbnZpcm9u
bWVudCBtX3BhcmVudFNjb3BlVERaVmFyaWFibGVzOwogICAgIHVuc2lnbmVkIG1fZmlyc3RMaW5l
T2Zmc2V0OwpAQCAtNDIzLDggKzQxNSw2IEBAIHB1YmxpYzoKICAgICB2b2lkIGFkZEV4Y2VwdGlv
bkhhbmRsZXIoY29uc3QgVW5saW5rZWRIYW5kbGVySW5mbyYgaGFuZGxlcikgeyBjcmVhdGVSYXJl
RGF0YUlmTmVjZXNzYXJ5KCk7IHJldHVybiBtX3JhcmVEYXRhLT5tX2V4Y2VwdGlvbkhhbmRsZXJz
LmFwcGVuZChoYW5kbGVyKTsgfQogICAgIFVubGlua2VkSGFuZGxlckluZm8mIGV4Y2VwdGlvbkhh
bmRsZXIoaW50IGluZGV4KSB7IEFTU0VSVChtX3JhcmVEYXRhKTsgcmV0dXJuIG1fcmFyZURhdGEt
Pm1fZXhjZXB0aW9uSGFuZGxlcnNbaW5kZXhdOyB9CiAKLSAgICBTeW1ib2xUYWJsZSogc3ltYm9s
VGFibGUoKSBjb25zdCB7IHJldHVybiBtX3N5bWJvbFRhYmxlLmdldCgpOyB9Ci0gICAgdm9pZCBz
ZXRTeW1ib2xUYWJsZShTeW1ib2xUYWJsZSogdGFibGUpIHsgbV9zeW1ib2xUYWJsZS5zZXQoKm1f
dm0sIHRoaXMsIHRhYmxlKTsgfQogICAgIHZvaWQgc2V0U3ltYm9sVGFibGVDb25zdGFudEluZGV4
KGludCBpbmRleCkgeyBtX3N5bWJvbFRhYmxlQ29uc3RhbnRJbmRleCA9IGluZGV4OyB9CiAgICAg
aW50IHN5bWJvbFRhYmxlQ29uc3RhbnRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc3ltYm9sVGFi
bGVDb25zdGFudEluZGV4OyB9CiAKQEAgLTU3MCw3ICs1NjAsNyBAQCBwcml2YXRlOgogICAgIEZ1
bmN0aW9uRXhwcmVzc2lvblZlY3RvciBtX2Z1bmN0aW9uRXhwcnM7CiAKICAgICBXcml0ZUJhcnJp
ZXI8U3ltYm9sVGFibGU+IG1fc3ltYm9sVGFibGU7Ci0gICAgaW50IG1fc3ltYm9sVGFibGVDb25z
dGFudEluZGV4OworICAgIGludCBtX3N5bWJvbFRhYmxlQ29uc3RhbnRJbmRleCB7IDAgfTsKIAog
ICAgIFZlY3Rvcjx1bnNpZ25lZD4gbV9wcm9wZXJ0eUFjY2Vzc0luc3RydWN0aW9uczsKIApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9CeXRl
Y29kZUdlbmVyYXRvci5jcHAJKHJldmlzaW9uIDE4NzAxNCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xNTUsOSArMTU1LDYgQEAgUGFyc2VyRXJyb3IgQnl0ZWNvZGVHZW5lcmF0b3I6OmdlbmVyYXRl
KAogCiAgICAgbV9jb2RlQmxvY2stPnNocmlua1RvRml0KCk7CiAKLSAgICBpZiAobV9jb2RlQmxv
Y2stPnN5bWJvbFRhYmxlKCkgJiYgIW1fY29kZUJsb2NrLT52bSgpLT50eXBlUHJvZmlsZXIoKSkK
LSAgICAgICAgbV9jb2RlQmxvY2stPnNldFN5bWJvbFRhYmxlKG1fY29kZUJsb2NrLT5zeW1ib2xU
YWJsZSgpLT5jbG9uZVNjb3BlUGFydCgqbV9jb2RlQmxvY2stPnZtKCkpKTsKLQogICAgIGlmICht
X2V4cHJlc3Npb25Ub29EZWVwKQogICAgICAgICByZXR1cm4gUGFyc2VyRXJyb3IoUGFyc2VyRXJy
b3I6Ok91dE9mTWVtb3J5KTsKICAgICByZXR1cm4gUGFyc2VyRXJyb3IoUGFyc2VyRXJyb3I6OkVy
cm9yTm9uZSk7CkBAIC0xOTksMTIgKzE5NiwxMiBAQCBCeXRlY29kZUdlbmVyYXRvcjo6Qnl0ZWNv
ZGVHZW5lcmF0b3IoVk0mCiBCeXRlY29kZUdlbmVyYXRvcjo6Qnl0ZWNvZGVHZW5lcmF0b3IoVk0m
IHZtLCBGdW5jdGlvbk5vZGUqIGZ1bmN0aW9uTm9kZSwgVW5saW5rZWRGdW5jdGlvbkNvZGVCbG9j
ayogY29kZUJsb2NrLCBEZWJ1Z2dlck1vZGUgZGVidWdnZXJNb2RlLCBQcm9maWxlck1vZGUgcHJv
ZmlsZXJNb2RlLCBjb25zdCBWYXJpYWJsZUVudmlyb25tZW50KiBwYXJlbnRTY29wZVREWlZhcmlh
YmxlcykKICAgICA6IG1fc2hvdWxkRW1pdERlYnVnSG9va3MoT3B0aW9uczo6Zm9yY2VEZWJ1Z2dl
ckJ5dGVjb2RlR2VuZXJhdGlvbigpIHx8IGRlYnVnZ2VyTW9kZSA9PSBEZWJ1Z2dlck9uKQogICAg
ICwgbV9zaG91bGRFbWl0UHJvZmlsZUhvb2tzKE9wdGlvbnM6OmZvcmNlUHJvZmlsZXJCeXRlY29k
ZUdlbmVyYXRpb24oKSB8fCBwcm9maWxlck1vZGUgPT0gUHJvZmlsZXJPbikKLSAgICAsIG1fc3lt
Ym9sVGFibGUoY29kZUJsb2NrLT5zeW1ib2xUYWJsZSgpKQogICAgICwgbV9zY29wZU5vZGUoZnVu
Y3Rpb25Ob2RlKQogICAgICwgbV9jb2RlQmxvY2sodm0sIGNvZGVCbG9jaykKICAgICAsIG1fY29k
ZVR5cGUoRnVuY3Rpb25Db2RlKQogICAgICwgbV92bSgmdm0pCiAgICAgLCBtX2lzQnVpbHRpbkZ1
bmN0aW9uKGNvZGVCbG9jay0+aXNCdWlsdGluRnVuY3Rpb24oKSkKKyAgICAsIG1fdXNlc05vblN0
cmljdEV2YWwoY29kZUJsb2NrLT51c2VzRXZhbCgpICYmICFjb2RlQmxvY2stPmlzU3RyaWN0TW9k
ZSgpKQogewogICAgIGZvciAoYXV0byYgY29uc3RhbnRSZWdpc3RlciA6IG1fbGlua1RpbWVDb25z
dGFudFJlZ2lzdGVycykKICAgICAgICAgY29uc3RhbnRSZWdpc3RlciA9IG51bGxwdHI7CkBAIC0y
MTIsNyArMjA5LDkgQEAgQnl0ZWNvZGVHZW5lcmF0b3I6OkJ5dGVjb2RlR2VuZXJhdG9yKFZNJgog
ICAgIGlmIChtX2lzQnVpbHRpbkZ1bmN0aW9uKQogICAgICAgICBtX3Nob3VsZEVtaXREZWJ1Z0hv
b2tzID0gZmFsc2U7CiAgICAgCi0gICAgbV9zeW1ib2xUYWJsZS0+c2V0VXNlc05vblN0cmljdEV2
YWwoY29kZUJsb2NrLT51c2VzRXZhbCgpICYmICFjb2RlQmxvY2stPmlzU3RyaWN0TW9kZSgpKTsK
KyAgICBTdHJvbmc8U3ltYm9sVGFibGU+IGZ1bmN0aW9uU3ltYm9sVGFibGUoKm1fdm0sIFN5bWJv
bFRhYmxlOjpjcmVhdGUoKm1fdm0pKTsKKyAgICBmdW5jdGlvblN5bWJvbFRhYmxlLT5zZXRVc2Vz
Tm9uU3RyaWN0RXZhbChtX3VzZXNOb25TdHJpY3RFdmFsKTsKKwogICAgIFZlY3RvcjxJZGVudGlm
aWVyPiBib3VuZFBhcmFtZXRlclByb3BlcnRpZXM7CiAgICAgRnVuY3Rpb25QYXJhbWV0ZXJzJiBw
YXJhbWV0ZXJzID0gKmZ1bmN0aW9uTm9kZS0+cGFyYW1ldGVycygpOwogICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7IGkrKykgewpAQCAtMjYyLDcgKzI2MSw3IEBA
IEJ5dGVjb2RlR2VuZXJhdG9yOjpCeXRlY29kZUdlbmVyYXRvcihWTSYKICAgICAgICAgZW1pdFB1
c2hGdW5jdGlvbk5hbWVTY29wZShtX3Njb3BlUmVnaXN0ZXIsIGZ1bmN0aW9uTm9kZS0+aWRlbnQo
KSwgJm1fY2FsbGVlUmVnaXN0ZXIsIFJlYWRPbmx5IHwgRG9udERlbGV0ZSk7CiAgICAgfQogICAg
IAotICAgIGludCBzeW1ib2xUYWJsZUNvbnN0YW50SW5kZXggPSBhZGRDb25zdGFudFZhbHVlKG1f
c3ltYm9sVGFibGUpLT5pbmRleCgpOworICAgIGludCBzeW1ib2xUYWJsZUNvbnN0YW50SW5kZXgg
PSBhZGRDb25zdGFudFZhbHVlKGZ1bmN0aW9uU3ltYm9sVGFibGUuZ2V0KCkpLT5pbmRleCgpOwog
ICAgIG1fY29kZUJsb2NrLT5zZXRTeW1ib2xUYWJsZUNvbnN0YW50SW5kZXgoc3ltYm9sVGFibGVD
b25zdGFudEluZGV4KTsKICAgICBpZiAoc2hvdWxkQ2FwdHVyZVNvbWVPZlRoZVRoaW5ncykgewog
ICAgICAgICBtX2xleGljYWxFbnZpcm9ubWVudFJlZ2lzdGVyID0gYWRkVmFyKCk7CkBAIC0zMjcs
MTUgKzMyNiwxNSBAQCBCeXRlY29kZUdlbmVyYXRvcjo6Qnl0ZWNvZGVHZW5lcmF0b3IoVk0mCiAg
ICAgICAgIC8vIGFjdGl2YXRpb24uCiAgICAgICAgIAogICAgICAgICBpZiAoY2FwdHVyZXNBbnlB
cmd1bWVudEJ5TmFtZSkgewotICAgICAgICAgICAgbV9zeW1ib2xUYWJsZS0+c2V0QXJndW1lbnRz
TGVuZ3RoKHZtLCBwYXJhbWV0ZXJzLnNpemUoKSk7CisgICAgICAgICAgICBmdW5jdGlvblN5bWJv
bFRhYmxlLT5zZXRBcmd1bWVudHNMZW5ndGgodm0sIHBhcmFtZXRlcnMuc2l6ZSgpKTsKICAgICAg
ICAgICAgIAogICAgICAgICAgICAgLy8gRm9yIGVhY2ggcGFyYW1ldGVyLCB3ZSBoYXZlIHR3byBw
b3NzaWJpbGl0aWVzOgogICAgICAgICAgICAgLy8gRWl0aGVyIGl0J3MgYSBiaW5kaW5nIG5vZGUg
d2l0aCBubyBmdW5jdGlvbiBvdmVybGFwLCBpbiB3aGljaCBjYXNlIGl0IGdldHMgYSBuYW1lCiAg
ICAgICAgICAgICAvLyBpbiB0aGUgc3ltYm9sIHRhYmxlIC0gb3IgaXQganVzdCBnZXRzIHNwYWNl
IHJlc2VydmVkIGluIHRoZSBzeW1ib2wgdGFibGUuIEVpdGhlcgogICAgICAgICAgICAgLy8gd2F5
IHdlIGxpZnQgdGhlIHZhbHVlIGludG8gdGhlIHNjb3BlLgogICAgICAgICAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAg
ICBTY29wZU9mZnNldCBvZmZzZXQgPSBtX3N5bWJvbFRhYmxlLT50YWtlTmV4dFNjb3BlT2Zmc2V0
KCk7Ci0gICAgICAgICAgICAgICAgbV9zeW1ib2xUYWJsZS0+c2V0QXJndW1lbnRPZmZzZXQodm0s
IGksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgU2NvcGVPZmZzZXQgb2Zmc2V0ID0gZnVuY3Rp
b25TeW1ib2xUYWJsZS0+dGFrZU5leHRTY29wZU9mZnNldCgpOworICAgICAgICAgICAgICAgIGZ1
bmN0aW9uU3ltYm9sVGFibGUtPnNldEFyZ3VtZW50T2Zmc2V0KHZtLCBpLCBvZmZzZXQpOwogICAg
ICAgICAgICAgICAgIGlmIChVbmlxdWVkU3RyaW5nSW1wbCogbmFtZSA9IHZpc2libGVOYW1lRm9y
UGFyYW1ldGVyKHBhcmFtZXRlcnMuYXQoaSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIFZhck9m
ZnNldCB2YXJPZmZzZXQob2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgU3ltYm9sVGFibGVF
bnRyeSBlbnRyeSh2YXJPZmZzZXQpOwpAQCAtMzQ0LDcgKzM0Myw3IEBAIEJ5dGVjb2RlR2VuZXJh
dG9yOjpCeXRlY29kZUdlbmVyYXRvcihWTSYKICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1l
dGVycyB3aGVuICJhcmd1bWVudHMiIGlzIGluIHBsYXkgaXMgdW5saWtlbHkgdG8gYmUgc3VwZXIg
cHJvZml0YWJsZS4KICAgICAgICAgICAgICAgICAgICAgLy8gU28sIHdlIGp1c3QgZGlzYWJsZSBp
dC4KICAgICAgICAgICAgICAgICAgICAgZW50cnkuZGlzYWJsZVdhdGNoaW5nKCk7Ci0gICAgICAg
ICAgICAgICAgICAgIG1fc3ltYm9sVGFibGUtPnNldChuYW1lLCBlbnRyeSk7CisgICAgICAgICAg
ICAgICAgICAgIGZ1bmN0aW9uU3ltYm9sVGFibGUtPnNldChuYW1lLCBlbnRyeSk7CiAgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVtaXRPcGNvZGUob3BfcHV0X3RvX3Njb3BlKTsK
ICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQobV9sZXhpY2FsRW52aXJvbm1l
bnRSZWdpc3Rlci0+aW5kZXgoKSk7CkBAIC0zNjUsNyArMzY0LDcgQEAgQnl0ZWNvZGVHZW5lcmF0
b3I6OkJ5dGVjb2RlR2VuZXJhdG9yKFZNJgogICAgICAgICAgICAgLy8gdGhhdCB0aGUgc3ltYm9s
IHRhYmxlIGtub3dzIHRoYXQgdGhpcyBpcyBoYXBwZW5pbmcuCiAgICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAg
ICAgIGlmIChVbmlxdWVkU3RyaW5nSW1wbCogbmFtZSA9IHZpc2libGVOYW1lRm9yUGFyYW1ldGVy
KHBhcmFtZXRlcnMuYXQoaSkpKQotICAgICAgICAgICAgICAgICAgICBtX3N5bWJvbFRhYmxlLT5z
ZXQobmFtZSwgU3ltYm9sVGFibGVFbnRyeShWYXJPZmZzZXQoRGlyZWN0QXJndW1lbnRzT2Zmc2V0
KGkpKSkpOworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblN5bWJvbFRhYmxlLT5zZXQobmFt
ZSwgU3ltYm9sVGFibGVFbnRyeShWYXJPZmZzZXQoRGlyZWN0QXJndW1lbnRzT2Zmc2V0KGkpKSkp
OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBlbWl0T3Bjb2RlKG9w
X2NyZWF0ZV9kaXJlY3RfYXJndW1lbnRzKTsKQEAgLTM4MiwxNCArMzgxLDE0IEBAIEJ5dGVjb2Rl
R2VuZXJhdG9yOjpCeXRlY29kZUdlbmVyYXRvcihWTSYKICAgICAgICAgICAgIGlmICghY2FwdHVy
ZXMobmFtZSkpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBlYXN5IGNhc2UgLSBq
dXN0IHRlbGwgdGhlIHN5bWJvbCB0YWJsZSBhYm91dCB0aGUgYXJndW1lbnQuIEl0IHdpbGwKICAg
ICAgICAgICAgICAgICAvLyBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KLSAgICAgICAgICAgICAgICBt
X3N5bWJvbFRhYmxlLT5zZXQobmFtZSwgU3ltYm9sVGFibGVFbnRyeShWYXJPZmZzZXQodmlydHVh
bFJlZ2lzdGVyRm9yQXJndW1lbnQoMSArIGkpKSkpOworICAgICAgICAgICAgICAgIGZ1bmN0aW9u
U3ltYm9sVGFibGUtPnNldChuYW1lLCBTeW1ib2xUYWJsZUVudHJ5KFZhck9mZnNldCh2aXJ0dWFs
UmVnaXN0ZXJGb3JBcmd1bWVudCgxICsgaSkpKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7
CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIFNjb3BlT2Zmc2V0IG9m
ZnNldCA9IG1fc3ltYm9sVGFibGUtPnRha2VOZXh0U2NvcGVPZmZzZXQoKTsKKyAgICAgICAgICAg
IFNjb3BlT2Zmc2V0IG9mZnNldCA9IGZ1bmN0aW9uU3ltYm9sVGFibGUtPnRha2VOZXh0U2NvcGVP
ZmZzZXQoKTsKICAgICAgICAgICAgIGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0KICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCaW5kaW5nTm9kZSo+KHBhcmFtZXRlcnMuYXQoaSkp
LT5ib3VuZFByb3BlcnR5KCk7Ci0gICAgICAgICAgICBtX3N5bWJvbFRhYmxlLT5zZXQobmFtZSwg
U3ltYm9sVGFibGVFbnRyeShWYXJPZmZzZXQob2Zmc2V0KSkpOworICAgICAgICAgICAgZnVuY3Rp
b25TeW1ib2xUYWJsZS0+c2V0KG5hbWUsIFN5bWJvbFRhYmxlRW50cnkoVmFyT2Zmc2V0KG9mZnNl
dCkpKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgZW1pdE9wY29kZShvcF9wdXRfdG9fc2Nv
cGUpOwogICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKG1fbGV4aWNhbEVudmlyb25t
ZW50UmVnaXN0ZXItPmluZGV4KCkpOwpAQCAtNDA5LDEwICs0MDgsMTAgQEAgQnl0ZWNvZGVHZW5l
cmF0b3I6OkJ5dGVjb2RlR2VuZXJhdG9yKFZNJgogICAgIAogICAgIC8vIE5vdyBkZWNsYXJlIGFs
bCB2YXJpYWJsZXMuCiAgICAgZm9yIChjb25zdCBJZGVudGlmaWVyJiBpZGVudCA6IGJvdW5kUGFy
YW1ldGVyUHJvcGVydGllcykKLSAgICAgICAgY3JlYXRlVmFyaWFibGUoaWRlbnQsIHZhcktpbmQo
aWRlbnQuaW1wbCgpKSk7CisgICAgICAgIGNyZWF0ZVZhcmlhYmxlKGlkZW50LCB2YXJLaW5kKGlk
ZW50LmltcGwoKSksIGZ1bmN0aW9uU3ltYm9sVGFibGUuZ2V0KCkpOwogICAgIGZvciAoRnVuY3Rp
b25Cb2R5Tm9kZSogZnVuY3Rpb24gOiBmdW5jdGlvbk5vZGUtPmZ1bmN0aW9uU3RhY2soKSkgewog
ICAgICAgICBjb25zdCBJZGVudGlmaWVyJiBpZGVudCA9IGZ1bmN0aW9uLT5pZGVudCgpOwotICAg
ICAgICBjcmVhdGVWYXJpYWJsZShpZGVudCwgdmFyS2luZChpZGVudC5pbXBsKCkpKTsKKyAgICAg
ICAgY3JlYXRlVmFyaWFibGUoaWRlbnQsIHZhcktpbmQoaWRlbnQuaW1wbCgpKSwgZnVuY3Rpb25T
eW1ib2xUYWJsZS5nZXQoKSk7CiAgICAgICAgIG1fZnVuY3Rpb25zVG9Jbml0aWFsaXplLmFwcGVu
ZChzdGQ6Om1ha2VfcGFpcihmdW5jdGlvbiwgTm9ybWFsRnVuY3Rpb25WYXJpYWJsZSkpOwogICAg
IH0KICAgICBmb3IgKGF1dG8mIGVudHJ5IDogZnVuY3Rpb25Ob2RlLT52YXJEZWNsYXJhdGlvbnMo
KSkgewpAQCAtNDIwLDcgKzQxOSw3IEBAIEJ5dGVjb2RlR2VuZXJhdG9yOjpCeXRlY29kZUdlbmVy
YXRvcihWTSYKICAgICAgICAgaWYgKCFlbnRyeS52YWx1ZS5pc1ZhcigpKSAvLyBUaGlzIGlzIGVp
dGhlciBhIHBhcmFtZXRlciBvciBjYWxsZWUuCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAg
ICAgLy8gVmFyaWFibGVzIG5hbWVkICJhcmd1bWVudHMiIGFyZSBuZXZlciBjb25zdC4KLSAgICAg
ICAgY3JlYXRlVmFyaWFibGUoSWRlbnRpZmllcjo6ZnJvbVVpZChtX3ZtLCBlbnRyeS5rZXkuZ2V0
KCkpLCB2YXJLaW5kKGVudHJ5LmtleS5nZXQoKSksIElnbm9yZUV4aXN0aW5nKTsKKyAgICAgICAg
Y3JlYXRlVmFyaWFibGUoSWRlbnRpZmllcjo6ZnJvbVVpZChtX3ZtLCBlbnRyeS5rZXkuZ2V0KCkp
LCB2YXJLaW5kKGVudHJ5LmtleS5nZXQoKSksIGZ1bmN0aW9uU3ltYm9sVGFibGUuZ2V0KCksIEln
bm9yZUV4aXN0aW5nKTsKICAgICB9CiAgICAgCiAgICAgLy8gVGhlcmUgYXJlIHNvbWUgdmFyaWFi
bGVzIHRoYXQgbmVlZCB0byBiZSBwcmVpbml0aWFsaXplZCB0byBzb21ldGhpbmcgb3RoZXIgdGhh
biBVbmRlZmluZWQ6CkBAIC00NDksMTMgKzQ0OCwxMyBAQCBCeXRlY29kZUdlbmVyYXRvcjo6Qnl0
ZWNvZGVHZW5lcmF0b3IoVk0mCiAgICAgLy8gdG8gZG8gdGhpcyBiZWNhdXNlIHdlIGNhbiBqdXN0
IGNoZWNrIGlmIGl0J3MgaW4gdGhlIHN5bWJvbCB0YWJsZS4KICAgICBpZiAoZnVuY3Rpb25OYW1l
SXNJblNjb3BlKGZ1bmN0aW9uTm9kZS0+aWRlbnQoKSwgZnVuY3Rpb25Ob2RlLT5mdW5jdGlvbk1v
ZGUoKSkKICAgICAgICAgJiYgIWZ1bmN0aW9uTmFtZVNjb3BlSXNEeW5hbWljKGNvZGVCbG9jay0+
dXNlc0V2YWwoKSwgY29kZUJsb2NrLT5pc1N0cmljdE1vZGUoKSkKLSAgICAgICAgJiYgbV9zeW1i
b2xUYWJsZS0+Z2V0KGZ1bmN0aW9uTm9kZS0+aWRlbnQoKS5pbXBsKCkpLmlzTnVsbCgpKSB7Cisg
ICAgICAgICYmIGZ1bmN0aW9uU3ltYm9sVGFibGUtPmdldChmdW5jdGlvbk5vZGUtPmlkZW50KCku
aW1wbCgpKS5pc051bGwoKSkgewogICAgICAgICBpZiAoY2FwdHVyZXMoZnVuY3Rpb25Ob2RlLT5p
ZGVudCgpLmltcGwoKSkpIHsKICAgICAgICAgICAgIFNjb3BlT2Zmc2V0IG9mZnNldDsKICAgICAg
ICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihtX3N5
bWJvbFRhYmxlLT5tX2xvY2spOwotICAgICAgICAgICAgICAgIG9mZnNldCA9IG1fc3ltYm9sVGFi
bGUtPnRha2VOZXh0U2NvcGVPZmZzZXQobG9ja2VyKTsKLSAgICAgICAgICAgICAgICBtX3N5bWJv
bFRhYmxlLT5hZGQoCisgICAgICAgICAgICAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2NrZXIo
ZnVuY3Rpb25TeW1ib2xUYWJsZS0+bV9sb2NrKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBm
dW5jdGlvblN5bWJvbFRhYmxlLT50YWtlTmV4dFNjb3BlT2Zmc2V0KGxvY2tlcik7CisgICAgICAg
ICAgICAgICAgZnVuY3Rpb25TeW1ib2xUYWJsZS0+YWRkKAogICAgICAgICAgICAgICAgICAgICBs
b2NrZXIsIGZ1bmN0aW9uTm9kZS0+aWRlbnQoKS5pbXBsKCksCiAgICAgICAgICAgICAgICAgICAg
IFN5bWJvbFRhYmxlRW50cnkoVmFyT2Zmc2V0KG9mZnNldCksIFJlYWRPbmx5KSk7CiAgICAgICAg
ICAgICB9CkBAIC00NjgsNyArNDY3LDcgQEAgQnl0ZWNvZGVHZW5lcmF0b3I6OkJ5dGVjb2RlR2Vu
ZXJhdG9yKFZNJgogICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zKCkuYXBwZW5kKHN5bWJvbFRhYmxl
Q29uc3RhbnRJbmRleCk7CiAgICAgICAgICAgICBpbnN0cnVjdGlvbnMoKS5hcHBlbmQob2Zmc2V0
Lm9mZnNldCgpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fc3ltYm9sVGFibGUt
PmFkZCgKKyAgICAgICAgICAgIGZ1bmN0aW9uU3ltYm9sVGFibGUtPmFkZCgKICAgICAgICAgICAg
ICAgICBmdW5jdGlvbk5vZGUtPmlkZW50KCkuaW1wbCgpLAogICAgICAgICAgICAgICAgIFN5bWJv
bFRhYmxlRW50cnkoVmFyT2Zmc2V0KG1fY2FsbGVlUmVnaXN0ZXIudmlydHVhbFJlZ2lzdGVyKCkp
LCBSZWFkT25seSkpOwogICAgICAgICB9CkBAIC00OTYsNyArNDk1LDcgQEAgQnl0ZWNvZGVHZW5l
cmF0b3I6OkJ5dGVjb2RlR2VuZXJhdG9yKFZNJgogICAgICAgICAKICAgICAgICAgaWYgKCFoYXZl
UGFyYW1ldGVyTmFtZWRBcmd1bWVudHMpIHsKICAgICAgICAgICAgIGNyZWF0ZVZhcmlhYmxlKAot
ICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZXMoKS5hcmd1bWVudHMsIHZhcktpbmQocHJvcGVy
dHlOYW1lcygpLmFyZ3VtZW50cy5pbXBsKCkpKTsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eU5h
bWVzKCkuYXJndW1lbnRzLCB2YXJLaW5kKHByb3BlcnR5TmFtZXMoKS5hcmd1bWVudHMuaW1wbCgp
KSwgZnVuY3Rpb25TeW1ib2xUYWJsZS5nZXQoKSk7CiAgICAgICAgICAgICBtX25lZWRUb0luaXRp
YWxpemVBcmd1bWVudHMgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtNTIwLDI3ICs1MTks
MjQgQEAgQnl0ZWNvZGVHZW5lcmF0b3I6OkJ5dGVjb2RlR2VuZXJhdG9yKFZNJgogCiAgICAgaWYg
KG1fbGV4aWNhbEVudmlyb25tZW50UmVnaXN0ZXIpCiAgICAgICAgIHB1c2hTY29wZWRDb250cm9s
Rmxvd0NvbnRleHQoKTsKLSAgICBtX3N5bWJvbFRhYmxlU3RhY2suYXBwZW5kKFN5bWJvbFRhYmxl
U3RhY2tFbnRyeXsgU3Ryb25nPFN5bWJvbFRhYmxlPigqbV92bSwgbV9zeW1ib2xUYWJsZSksIG1f
bGV4aWNhbEVudmlyb25tZW50UmVnaXN0ZXIsIGZhbHNlLCBzeW1ib2xUYWJsZUNvbnN0YW50SW5k
ZXggfSk7CisgICAgbV9zeW1ib2xUYWJsZVN0YWNrLmFwcGVuZChTeW1ib2xUYWJsZVN0YWNrRW50
cnl7IGZ1bmN0aW9uU3ltYm9sVGFibGUsIG1fbGV4aWNhbEVudmlyb25tZW50UmVnaXN0ZXIsIGZh
bHNlLCBzeW1ib2xUYWJsZUNvbnN0YW50SW5kZXggfSk7CiAgICAgbV9URFpTdGFjay5hcHBlbmQo
c3RkOjptYWtlX3BhaXIoKnBhcmVudFNjb3BlVERaVmFyaWFibGVzLCBmYWxzZSkpOwogfQogCiBC
eXRlY29kZUdlbmVyYXRvcjo6Qnl0ZWNvZGVHZW5lcmF0b3IoVk0mIHZtLCBFdmFsTm9kZSogZXZh
bE5vZGUsIFVubGlua2VkRXZhbENvZGVCbG9jayogY29kZUJsb2NrLCBEZWJ1Z2dlck1vZGUgZGVi
dWdnZXJNb2RlLCBQcm9maWxlck1vZGUgcHJvZmlsZXJNb2RlLCBjb25zdCBWYXJpYWJsZUVudmly
b25tZW50KiBwYXJlbnRTY29wZVREWlZhcmlhYmxlcykKICAgICA6IG1fc2hvdWxkRW1pdERlYnVn
SG9va3MoT3B0aW9uczo6Zm9yY2VEZWJ1Z2dlckJ5dGVjb2RlR2VuZXJhdGlvbigpIHx8IGRlYnVn
Z2VyTW9kZSA9PSBEZWJ1Z2dlck9uKQogICAgICwgbV9zaG91bGRFbWl0UHJvZmlsZUhvb2tzKE9w
dGlvbnM6OmZvcmNlUHJvZmlsZXJCeXRlY29kZUdlbmVyYXRpb24oKSB8fCBwcm9maWxlck1vZGUg
PT0gUHJvZmlsZXJPbikKLSAgICAsIG1fc3ltYm9sVGFibGUoY29kZUJsb2NrLT5zeW1ib2xUYWJs
ZSgpKQogICAgICwgbV9zY29wZU5vZGUoZXZhbE5vZGUpCiAgICAgLCBtX2NvZGVCbG9jayh2bSwg
Y29kZUJsb2NrKQogICAgICwgbV90aGlzUmVnaXN0ZXIoQ2FsbEZyYW1lOjp0aGlzQXJndW1lbnRP
ZmZzZXQoKSkKICAgICAsIG1fY29kZVR5cGUoRXZhbENvZGUpCiAgICAgLCBtX3ZtKCZ2bSkKKyAg
ICAsIG1fdXNlc05vblN0cmljdEV2YWwoY29kZUJsb2NrLT51c2VzRXZhbCgpICYmICFjb2RlQmxv
Y2stPmlzU3RyaWN0TW9kZSgpKQogewogICAgIGZvciAoYXV0byYgY29uc3RhbnRSZWdpc3RlciA6
IG1fbGlua1RpbWVDb25zdGFudFJlZ2lzdGVycykKICAgICAgICAgY29uc3RhbnRSZWdpc3RlciA9
IG51bGxwdHI7CiAKLSAgICBtX3N5bWJvbFRhYmxlLT5zZXRVc2VzTm9uU3RyaWN0RXZhbChjb2Rl
QmxvY2stPnVzZXNFdmFsKCkgJiYgIWNvZGVCbG9jay0+aXNTdHJpY3RNb2RlKCkpOwogICAgIG1f
Y29kZUJsb2NrLT5zZXROdW1QYXJhbWV0ZXJzKDEpOwotICAgIGludCBzeW1ib2xUYWJsZUNvbnN0
YW50SW5kZXggPSBhZGRDb25zdGFudFZhbHVlKG1fc3ltYm9sVGFibGUpLT5pbmRleCgpOwotICAg
IG1fY29kZUJsb2NrLT5zZXRTeW1ib2xUYWJsZUNvbnN0YW50SW5kZXgoc3ltYm9sVGFibGVDb25z
dGFudEluZGV4KTsKIAogICAgIGVtaXRPcGNvZGUob3BfZW50ZXIpOwogCkBAIC0xMzA1LDcgKzEz
MDEsNyBAQCB2b2lkIEJ5dGVjb2RlR2VuZXJhdG9yOjpwdXNoTGV4aWNhbFNjb3BlCiAgICAgICAg
IG5ld1Njb3BlID0gbmV3QmxvY2tTY29wZVZhcmlhYmxlKCk7CiAgICAgICAgIG5ld1Njb3BlLT5y
ZWYoKTsKIAotICAgICAgICBSZWdpc3RlcklEKiBjb25zdGFudFN5bWJvbFRhYmxlID0gYWRkQ29u
c3RhbnRWYWx1ZShzeW1ib2xUYWJsZS0+Y2xvbmVTY29wZVBhcnQoKm1fdm0pKTsKKyAgICAgICAg
UmVnaXN0ZXJJRCogY29uc3RhbnRTeW1ib2xUYWJsZSA9IGFkZENvbnN0YW50VmFsdWUoIW1fY29k
ZUJsb2NrLT52bSgpLT50eXBlUHJvZmlsZXIoKSA/IHN5bWJvbFRhYmxlLT5jbG9uZVNjb3BlUGFy
dCgqbV92bSkgOiBzeW1ib2xUYWJsZS5nZXQoKSk7CiAgICAgICAgIHN5bWJvbFRhYmxlQ29uc3Rh
bnRJbmRleCA9IGNvbnN0YW50U3ltYm9sVGFibGUtPmluZGV4KCk7CiAgICAgICAgIGlmIChjb25z
dGFudFN5bWJvbFRhYmxlUmVzdWx0KQogICAgICAgICAgICAgKmNvbnN0YW50U3ltYm9sVGFibGVS
ZXN1bHQgPSBjb25zdGFudFN5bWJvbFRhYmxlOwpAQCAtMTUwNCwxMSArMTUwMCwxMSBAQCBWYXJp
YWJsZSBCeXRlY29kZUdlbmVyYXRvcjo6dmFyaWFibGVGb3JMCiB9CiAKIHZvaWQgQnl0ZWNvZGVH
ZW5lcmF0b3I6OmNyZWF0ZVZhcmlhYmxlKAotICAgIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5
LCBWYXJLaW5kIHZhcktpbmQsIEV4aXN0aW5nVmFyaWFibGVNb2RlIGV4aXN0aW5nVmFyaWFibGVN
b2RlKQorICAgIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5LCBWYXJLaW5kIHZhcktpbmQsIFN5
bWJvbFRhYmxlKiBzeW1ib2xUYWJsZSwgRXhpc3RpbmdWYXJpYWJsZU1vZGUgZXhpc3RpbmdWYXJp
YWJsZU1vZGUpCiB7CiAgICAgQVNTRVJUKHByb3BlcnR5ICE9IHByb3BlcnR5TmFtZXMoKS50aGlz
SWRlbnRpZmllcik7Ci0gICAgQ29uY3VycmVudEpJVExvY2tlciBsb2NrZXIoc3ltYm9sVGFibGUo
KS5tX2xvY2spOwotICAgIFN5bWJvbFRhYmxlRW50cnkgZW50cnkgPSBzeW1ib2xUYWJsZSgpLmdl
dChsb2NrZXIsIHByb3BlcnR5LmltcGwoKSk7CisgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2Nr
ZXIoc3ltYm9sVGFibGUtPm1fbG9jayk7CisgICAgU3ltYm9sVGFibGVFbnRyeSBlbnRyeSA9IHN5
bWJvbFRhYmxlLT5nZXQobG9ja2VyLCBwcm9wZXJ0eS5pbXBsKCkpOwogICAgIAogICAgIGlmICgh
ZW50cnkuaXNOdWxsKCkpIHsKICAgICAgICAgaWYgKGV4aXN0aW5nVmFyaWFibGVNb2RlID09IEln
bm9yZUV4aXN0aW5nKQpAQCAtMTUzMiwxMyArMTUyOCwxMyBAQCB2b2lkIEJ5dGVjb2RlR2VuZXJh
dG9yOjpjcmVhdGVWYXJpYWJsZSgKICAgICAKICAgICBWYXJPZmZzZXQgdmFyT2Zmc2V0OwogICAg
IGlmICh2YXJLaW5kID09IFZhcktpbmQ6OlNjb3BlKQotICAgICAgICB2YXJPZmZzZXQgPSBWYXJP
ZmZzZXQoc3ltYm9sVGFibGUoKS50YWtlTmV4dFNjb3BlT2Zmc2V0KGxvY2tlcikpOworICAgICAg
ICB2YXJPZmZzZXQgPSBWYXJPZmZzZXQoc3ltYm9sVGFibGUtPnRha2VOZXh0U2NvcGVPZmZzZXQo
bG9ja2VyKSk7CiAgICAgZWxzZSB7CiAgICAgICAgIEFTU0VSVCh2YXJLaW5kID09IFZhcktpbmQ6
OlN0YWNrKTsKICAgICAgICAgdmFyT2Zmc2V0ID0gVmFyT2Zmc2V0KHZpcnR1YWxSZWdpc3RlckZv
ckxvY2FsKG1fY2FsbGVlUmVnaXN0ZXJzLnNpemUoKSkpOwogICAgIH0KICAgICBTeW1ib2xUYWJs
ZUVudHJ5IG5ld0VudHJ5KHZhck9mZnNldCwgMCk7Ci0gICAgc3ltYm9sVGFibGUoKS5hZGQobG9j
a2VyLCBwcm9wZXJ0eS5pbXBsKCksIG5ld0VudHJ5KTsKKyAgICBzeW1ib2xUYWJsZS0+YWRkKGxv
Y2tlciwgcHJvcGVydHkuaW1wbCgpLCBuZXdFbnRyeSk7CiAgICAgCiAgICAgaWYgKHZhcktpbmQg
PT0gVmFyS2luZDo6U3RhY2spIHsKICAgICAgICAgUmVnaXN0ZXJJRCogbG9jYWwgPSBhZGRWYXIo
KTsKQEAgLTE1NjUsNyArMTU2MSw3IEBAIFJlc29sdmVUeXBlIEJ5dGVjb2RlR2VuZXJhdG9yOjpy
ZXNvbHZlVHkKICAgICAgICAgICAgIHJldHVybiBEeW5hbWljOwogICAgIH0KIAotICAgIGlmICht
X3N5bWJvbFRhYmxlICYmIG1fc3ltYm9sVGFibGUtPnVzZXNOb25TdHJpY3RFdmFsKCkpCisgICAg
aWYgKG1fdXNlc05vblN0cmljdEV2YWwpCiAgICAgICAgIHJldHVybiBHbG9iYWxQcm9wZXJ0eVdp
dGhWYXJJbmplY3Rpb25DaGVja3M7CiAgICAgcmV0dXJuIEdsb2JhbFByb3BlcnR5OwogfQpAQCAt
MTYwNiw3ICsxNjAyLDcgQEAgUmVnaXN0ZXJJRCogQnl0ZWNvZGVHZW5lcmF0b3I6OmVtaXRSZXNv
bAogICAgIGNhc2UgVmFyS2luZDo6SW52YWxpZDoKICAgICAgICAgLy8gSW5kaWNhdGVzIG5vbi1s
b2NhbCByZXNvbHV0aW9uLgogICAgICAgICAKLSAgICAgICAgQVNTRVJUKCFtX3N5bWJvbFRhYmxl
IHx8ICFtX3N5bWJvbFRhYmxlLT5jb250YWlucyh2YXJpYWJsZS5pZGVudCgpLmltcGwoKSkgfHwg
cmVzb2x2ZVR5cGUoKSA9PSBEeW5hbWljKTsKKyAgICAgICAgLy9BU1NFUlQoIW1fc3ltYm9sVGFi
bGUgfHwgIW1fc3ltYm9sVGFibGUtPmNvbnRhaW5zKHZhcmlhYmxlLmlkZW50KCkuaW1wbCgpKSB8
fCByZXNvbHZlVHlwZSgpID09IER5bmFtaWMpOwogICAgICAgICAKICAgICAgICAgbV9jb2RlQmxv
Y2stPmFkZFByb3BlcnR5QWNjZXNzSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKCkuc2l6ZSgpKTsK
ICAgICAgICAgCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVj
b2RlR2VuZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2J5dGVj
b21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oCShyZXZpc2lvbiAxODcwMTQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJhdG9yLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTI5Miw3ICsyOTIsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgVmFyaWFi
bGUgdmFyaWFibGUoY29uc3QgSWRlbnRpZmllciYpOwogICAgICAgICAKICAgICAgICAgZW51bSBF
eGlzdGluZ1ZhcmlhYmxlTW9kZSB7IFZlcmlmeUV4aXN0aW5nLCBJZ25vcmVFeGlzdGluZyB9Owot
ICAgICAgICB2b2lkIGNyZWF0ZVZhcmlhYmxlKGNvbnN0IElkZW50aWZpZXImLCBWYXJLaW5kLCBF
eGlzdGluZ1ZhcmlhYmxlTW9kZSA9IFZlcmlmeUV4aXN0aW5nKTsgLy8gQ3JlYXRlcyB0aGUgdmFy
aWFibGUsIG9yIGFzc2VydHMgdGhhdCB0aGUgYWxyZWFkeS1jcmVhdGVkIHZhcmlhYmxlIGlzIHN1
ZmZpY2llbnRseSBjb21wYXRpYmxlLgorICAgICAgICB2b2lkIGNyZWF0ZVZhcmlhYmxlKGNvbnN0
IElkZW50aWZpZXImLCBWYXJLaW5kLCBTeW1ib2xUYWJsZSosIEV4aXN0aW5nVmFyaWFibGVNb2Rl
ID0gVmVyaWZ5RXhpc3RpbmcpOyAvLyBDcmVhdGVzIHRoZSB2YXJpYWJsZSwgb3IgYXNzZXJ0cyB0
aGF0IHRoZSBhbHJlYWR5LWNyZWF0ZWQgdmFyaWFibGUgaXMgc3VmZmljaWVudGx5IGNvbXBhdGli
bGUuCiAgICAgICAgIAogICAgICAgICAvLyBSZXR1cm5zIHRoZSByZWdpc3RlciBzdG9yaW5nICJ0
aGlzIgogICAgICAgICBSZWdpc3RlcklEKiB0aGlzUmVnaXN0ZXIoKSB7IHJldHVybiAmbV90aGlz
UmVnaXN0ZXI7IH0KQEAgLTcxNSw4ICs3MTUsNiBAQCBuYW1lc3BhY2UgSlNDIHsKIAogICAgICAg
ICBWZWN0b3I8VW5saW5rZWRJbnN0cnVjdGlvbiwgMCwgVW5zYWZlVmVjdG9yT3ZlcmZsb3c+JiBp
bnN0cnVjdGlvbnMoKSB7IHJldHVybiBtX2luc3RydWN0aW9uczsgfQogCi0gICAgICAgIFN5bWJv
bFRhYmxlJiBzeW1ib2xUYWJsZSgpIHsgcmV0dXJuICptX3N5bWJvbFRhYmxlOyB9Ci0KICAgICAg
ICAgUmVnaXN0ZXJJRCogZW1pdFRocm93RXhwcmVzc2lvblRvb0RlZXBFeGNlcHRpb24oKTsKIAog
ICAgIHByaXZhdGU6CkBAIC03MjUsNyArNzIzLDYgQEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAg
IGJvb2wgbV9zaG91bGRFbWl0RGVidWdIb29rczsKICAgICAgICAgYm9vbCBtX3Nob3VsZEVtaXRQ
cm9maWxlSG9va3M7CiAKLSAgICAgICAgU3ltYm9sVGFibGUqIG1fc3ltYm9sVGFibGUgeyBudWxs
cHRyIH07CiAgICAgICAgIHN0cnVjdCBTeW1ib2xUYWJsZVN0YWNrRW50cnkgewogICAgICAgICAg
ICAgU3Ryb25nPFN5bWJvbFRhYmxlPiBtX3N5bWJvbFRhYmxlOwogICAgICAgICAgICAgUmVnaXN0
ZXJJRCogbV9zY29wZTsKQEAgLTgwMyw2ICs4MDAsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAg
ICAgYm9vbCBtX3VzZXNFeGNlcHRpb25zIHsgZmFsc2UgfTsKICAgICAgICAgYm9vbCBtX2V4cHJl
c3Npb25Ub29EZWVwIHsgZmFsc2UgfTsKICAgICAgICAgYm9vbCBtX2lzQnVpbHRpbkZ1bmN0aW9u
IHsgZmFsc2UgfTsKKyAgICAgICAgYm9vbCBtX3VzZXNOb25TdHJpY3RFdmFsIHsgZmFsc2UgfTsK
ICAgICB9OwogCiB9CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdHcmFwaC5oCShyZXZp
c2lvbiAxODcwMTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0dyYXBoLmgJKHdv
cmtpbmcgY29weSkKQEAgLTM2NSwxNiArMzY1LDYgQEAgcHVibGljOgogICAgICAgICByZXR1cm4g
YmFzZWxpbmVDb2RlQmxvY2tGb3JPcmlnaW5BbmRCYXNlbGluZUNvZGVCbG9jayhjb2RlT3JpZ2lu
LCBtX3Byb2ZpbGVkQmxvY2spOwogICAgIH0KICAgICAKLSAgICBTeW1ib2xUYWJsZSogc3ltYm9s
VGFibGVGb3IoSW5saW5lQ2FsbEZyYW1lKiBpbmxpbmVDYWxsRnJhbWUpCi0gICAgewotICAgICAg
ICByZXR1cm4gYmFzZWxpbmVDb2RlQmxvY2tGb3IoaW5saW5lQ2FsbEZyYW1lKS0+c3ltYm9sVGFi
bGUoKTsKLSAgICB9Ci0gICAgCi0gICAgU3ltYm9sVGFibGUqIHN5bWJvbFRhYmxlRm9yKGNvbnN0
IENvZGVPcmlnaW4mIGNvZGVPcmlnaW4pCi0gICAgewotICAgICAgICByZXR1cm4gc3ltYm9sVGFi
bGVGb3IoY29kZU9yaWdpbi5pbmxpbmVDYWxsRnJhbWUpOwotICAgIH0KLSAgICAKICAgICBib29s
IGlzU3RyaWN0TW9kZUZvcihDb2RlT3JpZ2luIGNvZGVPcmlnaW4pCiAgICAgewogICAgICAgICBp
ZiAoIWNvZGVPcmlnaW4uaW5saW5lQ2FsbEZyYW1lKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2ppdC9Bc3NlbWJseUhlbHBlcnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaml0L0Fzc2VtYmx5SGVscGVycy5oCShyZXZpc2lvbiAxODcwMTQpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaml0L0Fzc2VtYmx5SGVscGVycy5oCSh3b3JraW5nIGNvcHkpCkBAIC04
ODYsMTEgKzg4Niw2IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIG1fYmFzZWxpbmVDb2RlQmxv
Y2s7CiAgICAgfQogICAgIAotICAgIFN5bWJvbFRhYmxlKiBzeW1ib2xUYWJsZUZvcihjb25zdCBD
b2RlT3JpZ2luJiBjb2RlT3JpZ2luKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VsaW5lQ29k
ZUJsb2NrRm9yKGNvZGVPcmlnaW4pLT5zeW1ib2xUYWJsZSgpOwotICAgIH0KLQogICAgIHN0YXRp
YyBWaXJ0dWFsUmVnaXN0ZXIgYXJndW1lbnRzU3RhcnQoSW5saW5lQ2FsbEZyYW1lKiBpbmxpbmVD
YWxsRnJhbWUpCiAgICAgewogICAgICAgICBpZiAoIWlubGluZUNhbGxGcmFtZSkKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbW1vblNsb3dQYXRocy5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29tbW9uU2xvd1BhdGhzLmNwcAko
cmV2aXNpb24gMTg3MDE0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29tbW9u
U2xvd1BhdGhzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjE1LDcgKzIxNSw3IEBAIFNMT1dfUEFU
SF9ERUNMKHNsb3dfcGF0aF9jcmVhdGVfc2NvcGVkX2EKIHsKICAgICBCRUdJTigpOwogICAgIEpT
TGV4aWNhbEVudmlyb25tZW50KiBzY29wZSA9IGpzQ2FzdDxKU0xleGljYWxFbnZpcm9ubWVudCo+
KE9QKDIpLmpzVmFsdWUoKSk7Ci0gICAgU2NvcGVkQXJndW1lbnRzVGFibGUqIHRhYmxlID0gZXhl
Yy0+Y29kZUJsb2NrKCktPnN5bWJvbFRhYmxlKCktPmFyZ3VtZW50cygpOworICAgIFNjb3BlZEFy
Z3VtZW50c1RhYmxlKiB0YWJsZSA9IHNjb3BlLT5zeW1ib2xUYWJsZSgpLT5hcmd1bWVudHMoKTsK
ICAgICBSRVRVUk4oU2NvcGVkQXJndW1lbnRzOjpjcmVhdGVCeUNvcHlpbmcoZXhlYywgdGFibGUs
IHNjb3BlKSk7CiB9CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1
dGFibGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4
ZWN1dGFibGUuY3BwCShyZXZpc2lvbiAxODcwMTQpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9FeGVjdXRhYmxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTcyLDExICs1NzIsNiBA
QCB2b2lkIEZ1bmN0aW9uRXhlY3V0YWJsZTo6dmlzaXRDaGlsZHJlbihKCiAgICAgdmlzaXRvci5h
cHBlbmQoJnRoaXNPYmplY3QtPm1fc2luZ2xldG9uRnVuY3Rpb24pOwogfQogCi1TeW1ib2xUYWJs
ZSogRnVuY3Rpb25FeGVjdXRhYmxlOjpzeW1ib2xUYWJsZShDb2RlU3BlY2lhbGl6YXRpb25LaW5k
IGtpbmQpCi17Ci0gICAgcmV0dXJuIGNvZGVCbG9ja0ZvcihraW5kKS0+c3ltYm9sVGFibGUoKTsK
LX0KLQogdm9pZCBGdW5jdGlvbkV4ZWN1dGFibGU6OmNsZWFyVW5saW5rZWRDb2RlRm9yUmVjb21w
aWxhdGlvbigpCiB7CiAgICAgbV91bmxpbmtlZEV4ZWN1dGFibGUtPmNsZWFyQ29kZUZvclJlY29t
cGlsYXRpb24oKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0V4ZWN1dGFi
bGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9FeGVjdXRh
YmxlLmgJKHJldmlzaW9uIDE4NzAxNCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0V4ZWN1dGFibGUuaAkod29ya2luZyBjb3B5KQpAQCAtNjM1LDcgKzYzNSw2IEBAIHB1YmxpYzoK
ICAgICBjb25zdCBJZGVudGlmaWVyJiBpbmZlcnJlZE5hbWUoKSB7IHJldHVybiBtX3VubGlua2Vk
RXhlY3V0YWJsZS0+aW5mZXJyZWROYW1lKCk7IH0KICAgICBKU1N0cmluZyogbmFtZVZhbHVlKCkg
Y29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFibGUtPm5hbWVWYWx1ZSgpOyB9CiAgICAg
c2l6ZV90IHBhcmFtZXRlckNvdW50KCkgY29uc3QgeyByZXR1cm4gbV91bmxpbmtlZEV4ZWN1dGFi
bGUtPnBhcmFtZXRlckNvdW50KCk7IH0gLy8gRXhjbHVkaW5nICd0aGlzJyEKLSAgICBTeW1ib2xU
YWJsZSogc3ltYm9sVGFibGUoQ29kZVNwZWNpYWxpemF0aW9uS2luZCk7CiAKICAgICB2b2lkIGNs
ZWFyVW5saW5rZWRDb2RlRm9yUmVjb21waWxhdGlvbigpOwogICAgIHN0YXRpYyB2b2lkIHZpc2l0
Q2hpbGRyZW4oSlNDZWxsKiwgU2xvdFZpc2l0b3ImKTsK
</data>
<flag name="review"
          id="282190"
          type_id="1"
          status="+"
          setter="fpizlo"
    />
          </attachment>
      

    </bug>

</bugzilla>