<?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>195771</bug_id>
          
          <creation_ts>2019-03-14 15:19:41 -0700</creation_ts>
          <short_desc>[WHLSL] Implement zero-filling of types</short_desc>
          <delta_ts>2019-06-19 12:54:39 -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>WebGPU</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>198433</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>198426</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Myles C. Maxfield">mmaxfield</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>antonydoniya58</cc>
    
    <cc>jonlee</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1516691</commentid>
    <comment_count>0</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-03-14 15:19:41 -0700</bug_when>
    <thetext>Implement zero-filling of types</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1535881</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2019-05-13 17:07:45 -0700</bug_when>
    <thetext>&lt;rdar://problem/50746291&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1539212</commentid>
    <comment_count>2</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-05-25 09:46:38 -0700</bug_when>
    <thetext>We should also consider how to zero-fill unused inputs/outputs of entry points.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1540680</commentid>
    <comment_count>3</comment_count>
      <attachid>371047</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-05-31 02:34:39 -0700</bug_when>
    <thetext>Created attachment 371047
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1540681</commentid>
    <comment_count>4</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-05-31 02:35:35 -0700</bug_when>
    <thetext>(In reply to Myles C. Maxfield from comment #2)
&gt; We should also consider how to zero-fill unused inputs/outputs of entry
&gt; points.

I didn&apos;t do anything here. I should figure out what needs to be done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1542045</commentid>
    <comment_count>5</comment_count>
      <attachid>371047</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-06-05 10:01:44 -0700</bug_when>
    <thetext>Comment on attachment 371047
patch

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

Does the Metal compiler still produce warnings now? GPURenderPipelineMetal.mm has a FIXME with a link to this bug.

&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLAutoInitializeVariables.cpp:54
&gt; +        // Skip argument declarations.

Cool.

&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLAutoInitializeVariables.cpp:66
&gt; +        printStream.print(TypeDumper(*type));

🤔 This seems unwise, though I do understand how it isn&apos;t observable. Are you confident this is a good idea?

&gt; Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp:-360
&gt; -        auto* overload = resolveFunctionOverloadImpl(*getterFuncs, argumentTypeReferences, nullptr);

Excellent.

&gt; Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLVariableDeclaration.h:73
&gt; +    void setInitializer(UniqueRef&lt;Expression&gt; expression)

Doesn&apos;t this need to take an rvalue reference? UniqueRef is move-only (I think???)

&gt; Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp:453
&gt;          m_stringBuilder.append(makeString(m_typeNamer.mangledNameForType(*variableDeclaration.type()), &apos; &apos;, variableName, &quot;;\n&quot;));

Is this dead code now?

&gt; Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp:110
&gt; +            stringBuilder.append(makeString(&quot;    for (size_t i = 0; i &lt; sizeof(&quot;, metalReturnName, &quot;); ++i) {\n&quot;));
&gt; +            stringBuilder.append(&quot;        ptr[i] = 0;\n&quot;);
&gt; +            stringBuilder.append(&quot;    }\n&quot;);

Can we remove the { } and pull it up into one line?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1542048</commentid>
    <comment_count>6</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-06-05 10:02:05 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #4)
&gt; (In reply to Myles C. Maxfield from comment #2)
&gt; &gt; We should also consider how to zero-fill unused inputs/outputs of entry
&gt; &gt; points.
&gt; 
&gt; I didn&apos;t do anything here. I should figure out what needs to be done.

Is there another bug filed for this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1542055</commentid>
    <comment_count>7</comment_count>
      <attachid>371047</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2019-06-05 10:05:26 -0700</bug_when>
    <thetext>Comment on attachment 371047
patch

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

&gt; Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp:109
&gt; +            stringBuilder.append(&quot;        ptr[i] = 0;\n&quot;);

I think this &quot;memset&quot; is going to be needed for the follow-up task (of inputs and outputs). Can we pull this out into a standalone metal function?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1542315</commentid>
    <comment_count>8</comment_count>
      <attachid>371047</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-06-05 23:29:00 -0700</bug_when>
    <thetext>Comment on attachment 371047
patch

I should have obsoleted this patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1543400</commentid>
    <comment_count>10</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-06-10 11:36:30 -0700</bug_when>
    <thetext>(In reply to Myles C. Maxfield from comment #7)
&gt; Comment on attachment 371047 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=371047&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLNativeFunctionWriter.cpp:109
&gt; &gt; +            stringBuilder.append(&quot;        ptr[i] = 0;\n&quot;);
&gt; 
&gt; I think this &quot;memset&quot; is going to be needed for the follow-up task (of
&gt; inputs and outputs). Can we pull this out into a standalone metal function?

I think we should do this when it&apos;s needed, as it has added complexity. I also think there is a chance it&apos;s not needed, depending on if we define things to be a compile time error or not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1546200</commentid>
    <comment_count>11</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-06-19 12:54:36 -0700</bug_when>
    <thetext>All that&apos;s left here is:
https://bugs.webkit.org/show_bug.cgi?id=198433

So marking as a dupe</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1546201</commentid>
    <comment_count>12</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-06-19 12:54:39 -0700</bug_when>
    <thetext>

*** This bug has been marked as a duplicate of bug 198433 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>371047</attachid>
            <date>2019-05-31 02:34:39 -0700</date>
            <delta_ts>2019-06-05 23:29:00 -0700</delta_ts>
            <desc>patch</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>41391</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI0NTk1NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU3IEBACisyMDE5LTA1LTMxICBTYWFtIEJh
cmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIFtXSExTTF0gSW1wbGVtZW50IHpl
cm8tZmlsbGluZyBvZiB0eXBlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTk1NzcxCisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS81MDc0NjI5MT4KKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNo
IGltcGxlbWVudHMgemVyby1maWxsaW5nIGluIHR3byBwYXJ0czoKKyAgICAgICAgMS4gV2UgYWRk
IGEgbmV3IHBhc3MsIGF1dG9Jbml0aWFsaXplVmFyaWFibGVzLCB3aGljaCBtYWtlcyBhbnkgdmFy
aWFibGUgZGVjbGFyYXRpb24KKyAgICAgICAgd2l0aG91dCBhbiBpbml0aWFsaXplciBjYWxsIHRo
ZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgdmFyaWFibGUncyB0eXBlLgorICAgICAgICBT
aW5jZSB3ZSBhdXRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBpdCdzIGEgbmF0
aXZlIGZ1bmN0aW9uIHdob3NlCisgICAgICAgIGltcGxlbWVudGF0aW9uIHdlIGNvbnRyb2wuCisg
ICAgICAgIAorICAgICAgICAyLiBFYWNoIG5hdGl2ZSBjb25zdHJ1Y3RvciBpcyBpbXBsZW1lbnRl
ZCBhcyBhIG1lbXNldCgmdmFsdWUsIHNpemVvZih2YWx1ZSksIDApLgorICAgICAgICBUaGlzIG1l
bXNldCBpcyBhbiBpbmxpbmVkIGxvb3AgaW4gZWFjaCBjb25zdHJ1Y3Rvci4gVGhlIHJlYXNvbiB0
aGlzIHR1cm5zCisgICAgICAgIGV2ZXJ5dGhpbmcgaW50byB6ZXJvIGlzIHRoYXQgZm9yIGV2ZXJ5
IHByaW1pdGl2ZSB0eXBlLCB0aGUgInplcm8iIHZhbHVlIGlzCisgICAgICAgIHJlcHJlc2VudGVk
IGFzIGFsbCB6ZXJvZXMgaW4gbWVtb3J5OiBmbG9hdCwgaW50LCBwb2ludGVycywgZXRjLgorICAg
ICAgICAKKyAgICAgICAgU2luY2Ugb3VyIGFiaWxpdHkgdG8gdGVzdCBzb21lIG9mIHRoaXMgaXMg
bGltaXRlZCwgSSBvcGVuZWQgYSBmb2xsb3ctdXAgYnVnIHRvCisgICAgICAgIHRlc3QgdGhpcyBt
b3JlOgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk4
NDEzCisKKyAgICAgICAgVGVzdHM6IHdlYmdwdS93aGxzbC16ZXJvLWluaXRpYWxpemUtdmFsdWVz
LTIuaHRtbAorICAgICAgICAgICAgICAgd2ViZ3B1L3dobHNsLXplcm8taW5pdGlhbGl6ZS12YWx1
ZXMuaHRtbAorCisgICAgICAgICogTW9kdWxlcy93ZWJncHUvV0hMU0wvQVNUL1dITFNMVmFyaWFi
bGVEZWNsYXJhdGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OkFTVDo6VmFyaWFibGVE
ZWNsYXJhdGlvbjo6c2V0SW5pdGlhbGl6ZXIpOgorICAgICAgICAqIE1vZHVsZXMvd2ViZ3B1L1dI
TFNML01ldGFsL1dITFNMRnVuY3Rpb25Xcml0ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V0hM
U0w6Ok1ldGFsOjpGdW5jdGlvbkRlZmluaXRpb25Xcml0ZXI6OnZpc2l0KToKKyAgICAgICAgKiBN
b2R1bGVzL3dlYmdwdS9XSExTTC9NZXRhbC9XSExTTE5hdGl2ZUZ1bmN0aW9uV3JpdGVyLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OldITFNMOjpNZXRhbDo6d3JpdGVOYXRpdmVGdW5jdGlvbik6Cisg
ICAgICAgICogTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xBU1REdW1wZXIuaDoKKyAgICAgICAg
KiBNb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTEF1dG9Jbml0aWFsaXplVmFyaWFibGVzLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpXSExTTDo6QXV0b0luaXRpYWxpemU6OkF1dG9Jbml0
aWFsaXplKToKKyAgICAgICAgKFdlYkNvcmU6OldITFNMOjpBdXRvSW5pdGlhbGl6ZTo6dmlzaXQp
OgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OmF1dG9Jbml0aWFsaXplVmFyaWFibGVzKToKKyAg
ICAgICAgKiBNb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTEF1dG9Jbml0aWFsaXplVmFyaWFibGVz
Lmg6IEFkZGVkLgorICAgICAgICAqIE1vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMQ2hlY2tlci5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpXSExTTDo6Y2hlY2tPcGVyYXRvck92ZXJsb2FkKToKKyAg
ICAgICAgKFdlYkNvcmU6OldITFNMOjpDaGVja2VyOjp2aXNpdCk6CisgICAgICAgICogTW9kdWxl
cy93ZWJncHUvV0hMU0wvV0hMU0xJbmZlclR5cGVzLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldI
TFNMOjppbmZlclR5cGVzRm9yQ2FsbEltcGwpOgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6Omlu
ZmVyVHlwZXNGb3JDYWxsKToKKyAgICAgICAgKiBNb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTElu
ZmVyVHlwZXMuaDoKKyAgICAgICAgKiBNb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTFByZXBhcmUu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6V0hMU0w6OnByZXBhcmVTaGFyZWQpOgorICAgICAgICAq
IE1vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMUmVzb2x2ZU92ZXJsb2FkSW1wbC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpXSExTTDo6cmVzb2x2ZUZ1bmN0aW9uT3ZlcmxvYWRJbXBsKToKKyAgICAg
ICAgKFdlYkNvcmU6OldITFNMOjpyZXNvbHZlRnVuY3Rpb25PdmVybG9hZCk6CisgICAgICAgICog
TW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xSZXNvbHZlT3ZlcmxvYWRJbXBsLmg6CisgICAgICAg
ICogU291cmNlcy50eHQ6CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qOgorCiAyMDE5LTA1LTMwICBaYW4gRG9iZXJzZWsgIDx6ZG9iZXJzZWtAaWdhbGlhLmNvbT4K
IAogICAgICAgICBVbnJldmlld2VkLiBTdXBwcmVzcyAtV3VudXNlZC12YXJpYWJsZSB3YXJuaW5n
cyBmb3IgdGhlIHVudXNlZCBzdGF0aWMKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CShyZXZpc2lvbiAyNDU5
NTEpCisrKyBTb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMzA3
LDYgKzMwNyw3IEBAIE1vZHVsZXMvd2Vic29ja2V0cy9Xb3JrZXJUaHJlYWRhYmxlV2ViU28KIE1v
ZHVsZXMvd2ViZ3B1L0dQVUNhbnZhc0NvbnRleHQuY3BwCiBNb2R1bGVzL3dlYmdwdS9OYXZpZ2F0
b3JHUFUuY3BwCiBNb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTEFTVER1bXBlci5jcHAKK01vZHVs
ZXMvd2ViZ3B1L1dITFNML1dITFNMQXV0b0luaXRpYWxpemVWYXJpYWJsZXMuY3BwCiBNb2R1bGVz
L3dlYmdwdS9XSExTTC9XSExTTEluZmVyVHlwZXMuY3BwCiBNb2R1bGVzL3dlYmdwdS9XSExTTC9X
SExTTExleGVyLmNwcAogTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xQYXJzZXIuY3BwCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTEFTVER1bXBlci5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMQVNU
RHVtcGVyLmgJKHJldmlzaW9uIDI0NTk1MSkKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vi
Z3B1L1dITFNML1dITFNMQVNURHVtcGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTE0Miw2ICsxNDIs
NyBAQCBNQUtFX1BSSU5UX0FEQVBUT1IoU3RhdGVtZW50RHVtcGVyLCBBU1Q6CiBNQUtFX1BSSU5U
X0FEQVBUT1IoUHJvZ3JhbUR1bXBlciwgUHJvZ3JhbSYsIGR1bXBBU1ROb2RlKTsKIE1BS0VfUFJJ
TlRfQURBUFRPUihTdHJ1Y3R1cmVEZWZpbml0aW9uRHVtcGVyLCBBU1Q6OlN0cnVjdHVyZURlZmlu
aXRpb24mLCBkdW1wQVNUTm9kZSk7CiBNQUtFX1BSSU5UX0FEQVBUT1IoRnVuY3Rpb25EZWZpbml0
aW9uRHVtcGVyLCBBU1Q6OkZ1bmN0aW9uRGVmaW5pdGlvbiYsIGR1bXBBU1ROb2RlKTsKK01BS0Vf
UFJJTlRfQURBUFRPUihUeXBlRHVtcGVyLCBBU1Q6OlVubmFtZWRUeXBlJiwgZHVtcEFTVE5vZGUp
OwogCiAKIHN0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgZHVtcEFTVChQcm9ncmFtJiBwcm9ncmFt
KQpJbmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xBdXRvSW5p
dGlhbGl6ZVZhcmlhYmxlcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvTW9kdWxl
cy93ZWJncHUvV0hMU0wvV0hMU0xBdXRvSW5pdGlhbGl6ZVZhcmlhYmxlcy5jcHAJKG5vbmV4aXN0
ZW50KQorKysgU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xBdXRvSW5p
dGlhbGl6ZVZhcmlhYmxlcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5MyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXSExTTEF1dG9Jbml0aWFs
aXplVmFyaWFibGVzLmgiCisKKyNpZiBFTkFCTEUoV0VCR1BVKQorCisjaW5jbHVkZSAiV0hMU0xB
U1QuaCIKKyNpbmNsdWRlICJXSExTTEFTVER1bXBlci5oIgorI2luY2x1ZGUgIldITFNMTmFtZUNv
bnRleHQuaCIKKyNpbmNsdWRlICJXSExTTFJlc29sdmVPdmVybG9hZEltcGwuaCIKKyNpbmNsdWRl
ICJXSExTTFJlc29sdmluZ1R5cGUuaCIKKyNpbmNsdWRlICJXSExTTFZpc2l0b3IuaCIKKyNpbmNs
dWRlIDx3dGYvU3RyaW5nUHJpbnRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitu
YW1lc3BhY2UgV0hMU0wgeworCitjbGFzcyBBdXRvSW5pdGlhbGl6ZSA6IHB1YmxpYyBWaXNpdG9y
IHsKKyAgICB1c2luZyBCYXNlID0gVmlzaXRvcjsKK3B1YmxpYzoKKyAgICBBdXRvSW5pdGlhbGl6
ZShOYW1lQ29udGV4dCYgbmFtZUNvbnRleHQpCisgICAgICAgIDogbV9uYW1lQ29udGV4dChuYW1l
Q29udGV4dCkKKyAgICAgICAgLCBtX2Nhc3RGdW5jdGlvbnMoKm1fbmFtZUNvbnRleHQuZ2V0RnVu
Y3Rpb25zKCJvcGVyYXRvciBjYXN0Il9zdHIpKQorICAgIHsgfQorCitwcml2YXRlOgorICAgIHZv
aWQgdmlzaXQoQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uJikKKyAgICB7CisgICAgICAgIC8vIFNr
aXAgYXJndW1lbnQgZGVjbGFyYXRpb25zLgorICAgIH0KKworICAgIHZvaWQgdmlzaXQoQVNUOjpW
YXJpYWJsZURlY2xhcmF0aW9uJiB2YXJpYWJsZURlY2xhcmF0aW9uKQorICAgIHsKKyAgICAgICAg
aWYgKHZhcmlhYmxlRGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIoKSkKKyAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICBBU1Q6OlVubmFtZWRUeXBlKiB0eXBlID0gdmFyaWFibGVEZWNsYXJhdGlv
bi50eXBlKCk7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKHR5cGUpOworCisgICAgICAgIFN0cmlu
Z1ByaW50U3RyZWFtIHByaW50U3RyZWFtOworICAgICAgICBwcmludFN0cmVhbS5wcmludChUeXBl
RHVtcGVyKCp0eXBlKSk7CisgICAgICAgIGF1dG8gY2FsbEV4cHJlc3Npb24gPSBtYWtlVW5pcXVl
UmVmPEFTVDo6Q2FsbEV4cHJlc3Npb24+KHZhcmlhYmxlRGVjbGFyYXRpb24ub3JpZ2luKCksIHBy
aW50U3RyZWFtLnRvU3RyaW5nKCksIFZlY3RvcjxVbmlxdWVSZWY8QVNUOjpFeHByZXNzaW9uPj4o
KSk7CisgICAgICAgIGNhbGxFeHByZXNzaW9uLT5zZXRUeXBlKHR5cGUtPmNsb25lKCkpOworICAg
ICAgICBjYWxsRXhwcmVzc2lvbi0+c2V0VHlwZUFubm90YXRpb24oQVNUOjpSaWdodFZhbHVlKCkp
OworICAgICAgICBjYWxsRXhwcmVzc2lvbi0+c2V0T3ZlcmxvYWRzKG1fY2FzdEZ1bmN0aW9ucyk7
CisgICAgICAgIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiBh
cmd1bWVudFR5cGVzOworICAgICAgICBhdXRvKiBmdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbk92
ZXJsb2FkKCpjYWxsRXhwcmVzc2lvbi0+b3ZlcmxvYWRzKCksIGFyZ3VtZW50VHlwZXMsIHR5cGUp
OworICAgICAgICBSRUxFQVNFX0FTU0VSVChmdW5jdGlvbik7CisgICAgICAgIGNhbGxFeHByZXNz
aW9uLT5zZXRGdW5jdGlvbigqZnVuY3Rpb24pOworCisgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRp
b24uc2V0SW5pdGlhbGl6ZXIoV1RGTW92ZShjYWxsRXhwcmVzc2lvbikpOworICAgIH0KKworICAg
IE5hbWVDb250ZXh0JiBtX25hbWVDb250ZXh0OworICAgIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93
cmFwcGVyPEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbj4sIDE+JiBtX2Nhc3RGdW5jdGlvbnM7Cit9
OworCit2b2lkIGF1dG9Jbml0aWFsaXplVmFyaWFibGVzKFByb2dyYW0mIHByb2dyYW0pCit7Cisg
ICAgQXV0b0luaXRpYWxpemUgYXV0b0luaXRpYWxpemUocHJvZ3JhbS5uYW1lQ29udGV4dCgpKTsK
KyAgICBhdXRvSW5pdGlhbGl6ZS5WaXNpdG9yOjp2aXNpdChwcm9ncmFtKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV0hMU0wKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5B
QkxFKFdFQkdQVSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dI
TFNMQXV0b0luaXRpYWxpemVWYXJpYWJsZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTEF1dG9Jbml0aWFsaXplVmFyaWFibGVzLmgJKG5v
bmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xB
dXRvSW5pdGlhbGl6ZVZhcmlhYmxlcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIEVOQUJMRShXRUJHUFUpCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIFdITFNMIHsKKworY2xhc3MgUHJvZ3JhbTsKKwor
dm9pZCBhdXRvSW5pdGlhbGl6ZVZhcmlhYmxlcyhQcm9ncmFtJik7CisKK30KKworfQorCisjZW5k
aWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMQ2hlY2tl
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wv
V0hMU0xDaGVja2VyLmNwcAkocmV2aXNpb24gMjQ1OTUxKQorKysgU291cmNlL1dlYkNvcmUvTW9k
dWxlcy93ZWJncHUvV0hMU0wvV0hMU0xDaGVja2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzU3
LDcgKzM1Nyw3IEBAIHN0YXRpYyBib29sIGNoZWNrT3BlcmF0b3JPdmVybG9hZChjb25zdCAKICAg
ICAgICAgICAgIGFyZ3VtZW50VHlwZXMuYXBwZW5kKCgqZnVuY3Rpb25EZWZpbml0aW9uLnBhcmFt
ZXRlcnMoKVswXS0+dHlwZSgpKS0+Y2xvbmUoKSk7CiAgICAgICAgIGZvciAoYXV0byYgYXJndW1l
bnRUeXBlIDogYXJndW1lbnRUeXBlcykKICAgICAgICAgICAgIGFyZ3VtZW50VHlwZVJlZmVyZW5j
ZXMuYXBwZW5kKGFyZ3VtZW50VHlwZSk7Ci0gICAgICAgIGF1dG8qIG92ZXJsb2FkID0gcmVzb2x2
ZUZ1bmN0aW9uT3ZlcmxvYWRJbXBsKCpnZXR0ZXJGdW5jcywgYXJndW1lbnRUeXBlUmVmZXJlbmNl
cywgbnVsbHB0cik7CisgICAgICAgIGF1dG8qIG92ZXJsb2FkID0gcmVzb2x2ZUZ1bmN0aW9uT3Zl
cmxvYWQoKmdldHRlckZ1bmNzLCBhcmd1bWVudFR5cGVSZWZlcmVuY2VzKTsKICAgICAgICAgaWYg
KCFvdmVybG9hZCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgYXV0byYgcmVz
dWx0VHlwZSA9IG92ZXJsb2FkLT50eXBlKCk7CkBAIC05NzksNyArOTc5LDcgQEAgdm9pZCBDaGVj
a2VyOjp2aXNpdChBU1Q6OkRvdEV4cHJlc3Npb24mIAogICAgIEFTVDo6VW5uYW1lZFR5cGUqIGdl
dHRlclJldHVyblR5cGUgPSBudWxscHRyOwogICAgIHsKICAgICAgICAgVmVjdG9yPHN0ZDo6cmVm
ZXJlbmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+IGdldHRlckFyZ3VtZW50VHlwZXMgeyBiYXNl
SW5mby0+cmVzb2x2aW5nVHlwZSB9OwotICAgICAgICBnZXR0ZXJGdW5jdGlvbiA9IHJlc29sdmVG
dW5jdGlvbk92ZXJsb2FkSW1wbChkb3RFeHByZXNzaW9uLnBvc3NpYmxlR2V0dGVyT3ZlcmxvYWRz
KCksIGdldHRlckFyZ3VtZW50VHlwZXMsIG51bGxwdHIpOworICAgICAgICBnZXR0ZXJGdW5jdGlv
biA9IHJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKGRvdEV4cHJlc3Npb24ucG9zc2libGVHZXR0ZXJP
dmVybG9hZHMoKSwgZ2V0dGVyQXJndW1lbnRUeXBlcyk7CiAgICAgICAgIGlmIChnZXR0ZXJGdW5j
dGlvbikKICAgICAgICAgICAgIGdldHRlclJldHVyblR5cGUgPSAmZ2V0dGVyRnVuY3Rpb24tPnR5
cGUoKTsKICAgICB9CkBAIC05ODksNyArOTg5LDcgQEAgdm9pZCBDaGVja2VyOjp2aXNpdChBU1Q6
OkRvdEV4cHJlc3Npb24mIAogICAgIGlmIChhdXRvIGxlZnRBZGRyZXNzU3BhY2UgPSBiYXNlSW5m
by0+dHlwZUFubm90YXRpb24ubGVmdEFkZHJlc3NTcGFjZSgpKSB7CiAgICAgICAgIGF1dG8gYXJn
dW1lbnRUeXBlID0gbWFrZVVuaXF1ZVJlZjxBU1Q6OlBvaW50ZXJUeXBlPihMZXhlcjo6VG9rZW4o
ZG90RXhwcmVzc2lvbi5vcmlnaW4oKSksICpsZWZ0QWRkcmVzc1NwYWNlLCBiYXNlVW5uYW1lZFR5
cGUtPmdldCgpLmNsb25lKCkpOwogICAgICAgICBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBl
cjxSZXNvbHZpbmdUeXBlPj4gYW5kZXJBcmd1bWVudFR5cGVzIHsgYmFzZUluZm8tPnJlc29sdmlu
Z1R5cGUgfTsKLSAgICAgICAgYW5kZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbk92ZXJsb2Fk
SW1wbChkb3RFeHByZXNzaW9uLnBvc3NpYmxlQW5kZXJPdmVybG9hZHMoKSwgYW5kZXJBcmd1bWVu
dFR5cGVzLCBudWxscHRyKTsKKyAgICAgICAgYW5kZXJGdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlv
bk92ZXJsb2FkKGRvdEV4cHJlc3Npb24ucG9zc2libGVBbmRlck92ZXJsb2FkcygpLCBhbmRlckFy
Z3VtZW50VHlwZXMpOwogICAgICAgICBpZiAoYW5kZXJGdW5jdGlvbikKICAgICAgICAgICAgIGFu
ZGVyUmV0dXJuVHlwZSA9ICZkb3duY2FzdDxBU1Q6OlBvaW50ZXJUeXBlPihhbmRlckZ1bmN0aW9u
LT50eXBlKCkpLmVsZW1lbnRUeXBlKCk7IC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MTY0IEVuZm9yY2UgdGhlIHJldHVybiBvZiBhbmRlcnMgd2ls
bCBhbHdheXMgYmUgYSBwb2ludGVyCiAgICAgfQpAQCAtOTk5LDcgKzk5OSw3IEBAIHZvaWQgQ2hl
Y2tlcjo6dmlzaXQoQVNUOjpEb3RFeHByZXNzaW9uJiAKICAgICB7CiAgICAgICAgIGF1dG8gYXJn
dW1lbnRUeXBlID0gbWFrZVVuaXF1ZVJlZjxBU1Q6OlBvaW50ZXJUeXBlPihMZXhlcjo6VG9rZW4o
ZG90RXhwcmVzc2lvbi5vcmlnaW4oKSksIEFTVDo6QWRkcmVzc1NwYWNlOjpUaHJlYWQsIGJhc2VV
bm5hbWVkVHlwZS0+Z2V0KCkuY2xvbmUoKSk7CiAgICAgICAgIFZlY3RvcjxzdGQ6OnJlZmVyZW5j
ZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiB0aHJlYWRBbmRlckFyZ3VtZW50VHlwZXMgeyBiYXNl
SW5mby0+cmVzb2x2aW5nVHlwZSB9OwotICAgICAgICB0aHJlYWRBbmRlckZ1bmN0aW9uID0gcmVz
b2x2ZUZ1bmN0aW9uT3ZlcmxvYWRJbXBsKGRvdEV4cHJlc3Npb24ucG9zc2libGVBbmRlck92ZXJs
b2FkcygpLCB0aHJlYWRBbmRlckFyZ3VtZW50VHlwZXMsIG51bGxwdHIpOworICAgICAgICB0aHJl
YWRBbmRlckZ1bmN0aW9uID0gcmVzb2x2ZUZ1bmN0aW9uT3ZlcmxvYWQoZG90RXhwcmVzc2lvbi5w
b3NzaWJsZUFuZGVyT3ZlcmxvYWRzKCksIHRocmVhZEFuZGVyQXJndW1lbnRUeXBlcyk7CiAgICAg
ICAgIGlmICh0aHJlYWRBbmRlckZ1bmN0aW9uKQogICAgICAgICAgICAgdGhyZWFkQW5kZXJSZXR1
cm5UeXBlID0gJmRvd25jYXN0PEFTVDo6UG9pbnRlclR5cGU+KHRocmVhZEFuZGVyRnVuY3Rpb24t
PnR5cGUoKSkuZWxlbWVudFR5cGUoKTsgLy8gRklYTUU6IGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xOTgxNjQgRW5mb3JjZSB0aGUgcmV0dXJuIG9mIGFuZGVycyB3aWxs
IGFsd2F5cyBiZSBhIHBvaW50ZXIKICAgICB9CkBAIC0xMDI0LDcgKzEwMjQsNyBAQCB2b2lkIENo
ZWNrZXI6OnZpc2l0KEFTVDo6RG90RXhwcmVzc2lvbiYgCiAgICAgewogICAgICAgICBSZXNvbHZp
bmdUeXBlIGZpZWxkUmVzb2x2aW5nVHlwZShmaWVsZFR5cGUtPmNsb25lKCkpOwogICAgICAgICBW
ZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZXNvbHZpbmdUeXBlPj4gc2V0dGVyQXJndW1l
bnRUeXBlcyB7IGJhc2VJbmZvLT5yZXNvbHZpbmdUeXBlLCBmaWVsZFJlc29sdmluZ1R5cGUgfTsK
LSAgICAgICAgc2V0dGVyRnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb25PdmVybG9hZEltcGwoZG90
RXhwcmVzc2lvbi5wb3NzaWJsZVNldHRlck92ZXJsb2FkcygpLCBzZXR0ZXJBcmd1bWVudFR5cGVz
LCBudWxscHRyKTsKKyAgICAgICAgc2V0dGVyRnVuY3Rpb24gPSByZXNvbHZlRnVuY3Rpb25PdmVy
bG9hZChkb3RFeHByZXNzaW9uLnBvc3NpYmxlU2V0dGVyT3ZlcmxvYWRzKCksIHNldHRlckFyZ3Vt
ZW50VHlwZXMpOwogICAgICAgICBpZiAoc2V0dGVyRnVuY3Rpb24pCiAgICAgICAgICAgICBzZXR0
ZXJSZXR1cm5UeXBlID0gJnNldHRlckZ1bmN0aW9uLT50eXBlKCk7CiAgICAgfQpAQCAtMTM5Nyw3
ICsxMzk3LDcgQEAgdm9pZCBDaGVja2VyOjp2aXNpdChBU1Q6OkNhbGxFeHByZXNzaW9uJgogICAg
IC8vIFdlIGRvbid0IHdhbnQgdG8gcmVjdXJzZSB0byB0aGUgc2FtZSBub2RlIHR3aWNlLgogCiAg
ICAgQVNTRVJUKGNhbGxFeHByZXNzaW9uLmhhc092ZXJsb2FkcygpKTsKLSAgICBhdXRvKiBmdW5j
dGlvbiA9IHJlc29sdmVGdW5jdGlvbk92ZXJsb2FkSW1wbCgqY2FsbEV4cHJlc3Npb24ub3Zlcmxv
YWRzKCksIHR5cGVzLCBjYWxsRXhwcmVzc2lvbi5jYXN0UmV0dXJuVHlwZSgpKTsKKyAgICBhdXRv
KiBmdW5jdGlvbiA9IHJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKCpjYWxsRXhwcmVzc2lvbi5vdmVy
bG9hZHMoKSwgdHlwZXMsIGNhbGxFeHByZXNzaW9uLmNhc3RSZXR1cm5UeXBlKCkpOwogICAgIGlm
ICghZnVuY3Rpb24pIHsKICAgICAgICAgaWYgKGF1dG8gbmV3RnVuY3Rpb24gPSByZXNvbHZlQnlJ
bnN0YW50aWF0aW9uKGNhbGxFeHByZXNzaW9uLCB0eXBlcywgbV9pbnRyaW5zaWNzKSkgewogICAg
ICAgICAgICAgbV9wcm9ncmFtLmFwcGVuZChXVEZNb3ZlKCpuZXdGdW5jdGlvbikpOwpJbmRleDog
U291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvV0hMU0xJbmZlclR5cGVzLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTElu
ZmVyVHlwZXMuY3BwCShyZXZpc2lvbiAyNDU5NTEpCisrKyBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L3dlYmdwdS9XSExTTC9XSExTTEluZmVyVHlwZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjEs
NyArMjIxLDggQEAgYm9vbCBpbmZlclR5cGVzRm9yVHlwZUFyZ3VtZW50cyhBU1Q6Ok5hbQogICAg
IHJldHVybiB0cnVlOwogfQogCi1ib29sIGluZmVyVHlwZXNGb3JDYWxsKEFTVDo6RnVuY3Rpb25E
ZWNsYXJhdGlvbiYgcG9zc2libGVGdW5jdGlvbiwgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBw
ZXI8UmVzb2x2aW5nVHlwZT4+JiBhcmd1bWVudFR5cGVzLCBjb25zdCBBU1Q6Ok5hbWVkVHlwZSog
Y2FzdFJldHVyblR5cGUpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUtpbmQ+CitBTFdBWVNfSU5M
SU5FIGJvb2wgaW5mZXJUeXBlc0ZvckNhbGxJbXBsKEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiYg
cG9zc2libGVGdW5jdGlvbiwgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVzb2x2aW5n
VHlwZT4+JiBhcmd1bWVudFR5cGVzLCBjb25zdCBUeXBlS2luZCogY2FzdFJldHVyblR5cGUpCiB7
CiAgICAgaWYgKHBvc3NpYmxlRnVuY3Rpb24ucGFyYW1ldGVycygpLnNpemUoKSAhPSBhcmd1bWVu
dFR5cGVzLnNpemUoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjM5LDYgKzI0MCwxNiBA
QCBib29sIGluZmVyVHlwZXNGb3JDYWxsKEFTVDo6RnVuY3Rpb25EZWNsCiAgICAgcmV0dXJuIHRy
dWU7CiB9CiAKK2Jvb2wgaW5mZXJUeXBlc0ZvckNhbGwoQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9u
JiBwb3NzaWJsZUZ1bmN0aW9uLCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZXNvbHZp
bmdUeXBlPj4mIGFyZ3VtZW50VHlwZXMsIGNvbnN0IEFTVDo6TmFtZWRUeXBlKiBjYXN0UmV0dXJu
VHlwZSkKK3sKKyAgICByZXR1cm4gaW5mZXJUeXBlc0ZvckNhbGxJbXBsKHBvc3NpYmxlRnVuY3Rp
b24sIGFyZ3VtZW50VHlwZXMsIGNhc3RSZXR1cm5UeXBlKTsKK30KKworYm9vbCBpbmZlclR5cGVz
Rm9yQ2FsbChBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24mIHBvc3NpYmxlRnVuY3Rpb24sIFZlY3Rv
cjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiYgYXJndW1lbnRUeXBlcywg
Y29uc3QgQVNUOjpVbm5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUpCit7CisgICAgcmV0dXJuIGlu
ZmVyVHlwZXNGb3JDYWxsSW1wbChwb3NzaWJsZUZ1bmN0aW9uLCBhcmd1bWVudFR5cGVzLCBjYXN0
UmV0dXJuVHlwZSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdITFNMCiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNM
SW5mZXJUeXBlcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1
L1dITFNML1dITFNMSW5mZXJUeXBlcy5oCShyZXZpc2lvbiAyNDU5NTEpCisrKyBTb3VyY2UvV2Vi
Q29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTEluZmVyVHlwZXMuaAkod29ya2luZyBjb3B5
KQpAQCAtNTQsNiArNTQsNyBAQCBPcHRpb25hbDxVbmlxdWVSZWY8QVNUOjpVbm5hbWVkVHlwZT4+
IG1hCiBPcHRpb25hbDxVbmlxdWVSZWY8QVNUOjpVbm5hbWVkVHlwZT4+IGNvbW1pdChBU1Q6OlJl
c29sdmFibGVUeXBlJik7CiBib29sIGluZmVyVHlwZXNGb3JUeXBlQXJndW1lbnRzKEFTVDo6TmFt
ZWRUeXBlJiBwb3NzaWJsZVR5cGUsIEFTVDo6VHlwZUFyZ3VtZW50cyYpOwogYm9vbCBpbmZlclR5
cGVzRm9yQ2FsbChBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24mIHBvc3NpYmxlRnVuY3Rpb24sIFZl
Y3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiYgYXJndW1lbnRUeXBl
cywgY29uc3QgQVNUOjpOYW1lZFR5cGUqIGNhc3RSZXR1cm5UeXBlKTsKK2Jvb2wgaW5mZXJUeXBl
c0ZvckNhbGwoQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uJiBwb3NzaWJsZUZ1bmN0aW9uLCBWZWN0
b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZXNvbHZpbmdUeXBlPj4mIGFyZ3VtZW50VHlwZXMs
IGNvbnN0IEFTVDo6VW5uYW1lZFR5cGUqIGNhc3RSZXR1cm5UeXBlKTsKIAogfQogCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTFByZXBhcmUuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMUHJlcGFy
ZS5jcHAJKHJldmlzaW9uIDI0NTk1MSkKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1
L1dITFNML1dITFNMUHJlcGFyZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAK
ICNpZiBFTkFCTEUoV0VCR1BVKQogCiAjaW5jbHVkZSAiV0hMU0xBU1REdW1wZXIuaCIKKyNpbmNs
dWRlICJXSExTTEF1dG9Jbml0aWFsaXplVmFyaWFibGVzLmgiCiAjaW5jbHVkZSAiV0hMU0xDaGVj
a0R1cGxpY2F0ZUZ1bmN0aW9ucy5oIgogI2luY2x1ZGUgIldITFNMQ2hlY2tlci5oIgogI2luY2x1
ZGUgIldITFNMRnVuY3Rpb25TdGFnZUNoZWNrZXIuaCIKQEAgLTU3LDcgKzU4LDcgQEAgbmFtZXNw
YWNlIFdITFNMIHsKIAogc3RhdGljIGNvbnN0ZXhwciBib29sIGR1bXBBU1RCZWZvcmVFYWNoUGFz
cyA9IGZhbHNlOwogc3RhdGljIGNvbnN0ZXhwciBib29sIGR1bXBBU1RBZnRlclBhcnNpbmcgPSBm
YWxzZTsKLXN0YXRpYyBjb25zdGV4cHIgYm9vbCBkdW1wQVNUQXRFbmQgPSB0cnVlOworc3RhdGlj
IGNvbnN0ZXhwciBib29sIGR1bXBBU1RBdEVuZCA9IGZhbHNlOwogc3RhdGljIGNvbnN0ZXhwciBi
b29sIGFsd2F5c0R1bXBQYXNzRmFpbHVyZXMgPSBmYWxzZTsKIHN0YXRpYyBjb25zdGV4cHIgYm9v
bCBkdW1wUGFzc0ZhaWx1cmUgPSBkdW1wQVNUQmVmb3JlRWFjaFBhc3MgfHwgZHVtcEFTVEFmdGVy
UGFyc2luZyB8fCBkdW1wQVNUQXRFbmQgfHwgYWx3YXlzRHVtcFBhc3NGYWlsdXJlczsKIApAQCAt
MTI0LDYgKzEyNSw3IEBAIHN0YXRpYyBPcHRpb25hbDxQcm9ncmFtPiBwcmVwYXJlU2hhcmVkKFMK
ICAgICBSVU5fUEFTUyhjaGVjaywgcHJvZ3JhbSk7CiAKICAgICBjaGVja0xpdGVyYWxUeXBlcyhw
cm9ncmFtKTsKKyAgICBhdXRvSW5pdGlhbGl6ZVZhcmlhYmxlcyhwcm9ncmFtKTsKICAgICByZXNv
bHZlUHJvcGVydGllcyhwcm9ncmFtKTsKICAgICBmaW5kSGlnaFpvbWJpZXMocHJvZ3JhbSk7CiAg
ICAgUlVOX1BBU1MoY2hlY2tTdGF0ZW1lbnRCZWhhdmlvciwgcHJvZ3JhbSk7CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTFJlc29sdmVPdmVybG9hZEltcGwu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dI
TFNMUmVzb2x2ZU92ZXJsb2FkSW1wbC5jcHAJKHJldmlzaW9uIDI0NTk1MSkKKysrIFNvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML1dITFNMUmVzb2x2ZU92ZXJsb2FkSW1wbC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTUxLDcgKzUxLDggQEAgc3RhdGljIHVuc2lnbmVkIGNvbnZlcnNp
b25Db3N0KEFTVDo6RnVuYwogICAgIHJldHVybiBjb252ZXJzaW9uQ29zdDsKIH0KIAotQVNUOjpG
dW5jdGlvbkRlY2xhcmF0aW9uKiByZXNvbHZlRnVuY3Rpb25PdmVybG9hZEltcGwoVmVjdG9yPHN0
ZDo6cmVmZXJlbmNlX3dyYXBwZXI8QVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uPiwgMT4mIHBvc3Np
YmxlRnVuY3Rpb25zLCBWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxSZXNvbHZpbmdUeXBl
Pj4mIGFyZ3VtZW50VHlwZXMsIEFTVDo6TmFtZWRUeXBlKiBjYXN0UmV0dXJuVHlwZSkKK3RlbXBs
YXRlIDx0eXBlbmFtZSBUeXBlS2luZD4KK0FTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogcmVzb2x2
ZUZ1bmN0aW9uT3ZlcmxvYWRJbXBsKFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6
RnVuY3Rpb25EZWNsYXJhdGlvbj4sIDE+JiBwb3NzaWJsZUZ1bmN0aW9ucywgVmVjdG9yPHN0ZDo6
cmVmZXJlbmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+JiBhcmd1bWVudFR5cGVzLCBUeXBlS2lu
ZCogY2FzdFJldHVyblR5cGUpCiB7CiAgICAgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8
QVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uPiwgMT4gY2FuZGlkYXRlczsKICAgICBmb3IgKGF1dG8m
IHBvc3NpYmxlRnVuY3Rpb24gOiBwb3NzaWJsZUZ1bmN0aW9ucykgewpAQCAtNzYsNiArNzcsMjEg
QEAgQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uKiByZXNvbHZlRnVuY3RpbwogICAgIHJldHVybiBu
dWxscHRyOwogfQogCitBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24qIHJlc29sdmVGdW5jdGlvbk92
ZXJsb2FkKFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6RnVuY3Rpb25EZWNsYXJh
dGlvbj4sIDE+JiBwb3NzaWJsZUZ1bmN0aW9ucywgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBw
ZXI8UmVzb2x2aW5nVHlwZT4+JiBhcmd1bWVudFR5cGVzKQoreworICAgIHJldHVybiByZXNvbHZl
RnVuY3Rpb25PdmVybG9hZEltcGwocG9zc2libGVGdW5jdGlvbnMsIGFyZ3VtZW50VHlwZXMsIHN0
YXRpY19jYXN0PEFTVDo6TmFtZWRUeXBlKj4obnVsbHB0cikpOworfQorCitBU1Q6OkZ1bmN0aW9u
RGVjbGFyYXRpb24qIHJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKFZlY3RvcjxzdGQ6OnJlZmVyZW5j
ZV93cmFwcGVyPEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbj4sIDE+JiBwb3NzaWJsZUZ1bmN0aW9u
cywgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+JiBhcmd1bWVu
dFR5cGVzLCBBU1Q6Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUpCit7CisgICAgcmV0dXJuIHJl
c29sdmVGdW5jdGlvbk92ZXJsb2FkSW1wbChwb3NzaWJsZUZ1bmN0aW9ucywgYXJndW1lbnRUeXBl
cywgY2FzdFJldHVyblR5cGUpOworfQorCitBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24qIHJlc29s
dmVGdW5jdGlvbk92ZXJsb2FkKFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6RnVu
Y3Rpb25EZWNsYXJhdGlvbj4sIDE+JiBwb3NzaWJsZUZ1bmN0aW9ucywgVmVjdG9yPHN0ZDo6cmVm
ZXJlbmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+JiBhcmd1bWVudFR5cGVzLCBBU1Q6OlVubmFt
ZWRUeXBlKiBjYXN0UmV0dXJuVHlwZSkKK3sKKyAgICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uT3Zl
cmxvYWRJbXBsKHBvc3NpYmxlRnVuY3Rpb25zLCBhcmd1bWVudFR5cGVzLCBjYXN0UmV0dXJuVHlw
ZSk7Cit9CisKIEFTVDo6TmFtZWRUeXBlKiByZXNvbHZlVHlwZU92ZXJsb2FkSW1wbChWZWN0b3I8
c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBU1Q6Ok5hbWVkVHlwZT4sIDE+JiBwb3NzaWJsZVR5cGVz
LCBBU1Q6OlR5cGVBcmd1bWVudHMmIHR5cGVBcmd1bWVudHMpCiB7CiAgICAgQVNUOjpOYW1lZFR5
cGUqIHJlc3VsdCA9IG51bGxwdHI7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmdw
dS9XSExTTC9XSExTTFJlc29sdmVPdmVybG9hZEltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9Nb2R1bGVzL3dlYmdwdS9XSExTTC9XSExTTFJlc29sdmVPdmVybG9hZEltcGwuaAko
cmV2aXNpb24gMjQ1OTUxKQorKysgU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wv
V0hMU0xSZXNvbHZlT3ZlcmxvYWRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTQzLDcgKzQzLDkg
QEAgY2xhc3MgTmFtZWRUeXBlOwogCiB9CiAKLUFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbiogcmVz
b2x2ZUZ1bmN0aW9uT3ZlcmxvYWRJbXBsKFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPEFT
VDo6RnVuY3Rpb25EZWNsYXJhdGlvbj4sIDE+JiBwb3NzaWJsZUZ1bmN0aW9ucywgVmVjdG9yPHN0
ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+JiBhcmd1bWVudFR5cGVzLCBBU1Q6
Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUpOworQVNUOjpGdW5jdGlvbkRlY2xhcmF0aW9uKiBy
ZXNvbHZlRnVuY3Rpb25PdmVybG9hZChWZWN0b3I8c3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxBU1Q6
OkZ1bmN0aW9uRGVjbGFyYXRpb24+LCAxPiYgcG9zc2libGVGdW5jdGlvbnMsIFZlY3RvcjxzdGQ6
OnJlZmVyZW5jZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiYgYXJndW1lbnRUeXBlcyk7CitBU1Q6
OkZ1bmN0aW9uRGVjbGFyYXRpb24qIHJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKFZlY3RvcjxzdGQ6
OnJlZmVyZW5jZV93cmFwcGVyPEFTVDo6RnVuY3Rpb25EZWNsYXJhdGlvbj4sIDE+JiBwb3NzaWJs
ZUZ1bmN0aW9ucywgVmVjdG9yPHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8UmVzb2x2aW5nVHlwZT4+
JiBhcmd1bWVudFR5cGVzLCBBU1Q6Ok5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUpOworQVNUOjpG
dW5jdGlvbkRlY2xhcmF0aW9uKiByZXNvbHZlRnVuY3Rpb25PdmVybG9hZChWZWN0b3I8c3RkOjpy
ZWZlcmVuY2Vfd3JhcHBlcjxBU1Q6OkZ1bmN0aW9uRGVjbGFyYXRpb24+LCAxPiYgcG9zc2libGVG
dW5jdGlvbnMsIFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPFJlc29sdmluZ1R5cGU+PiYg
YXJndW1lbnRUeXBlcywgQVNUOjpVbm5hbWVkVHlwZSogY2FzdFJldHVyblR5cGUpOwogQVNUOjpO
YW1lZFR5cGUqIHJlc29sdmVUeXBlT3ZlcmxvYWRJbXBsKFZlY3RvcjxzdGQ6OnJlZmVyZW5jZV93
cmFwcGVyPEFTVDo6TmFtZWRUeXBlPiwgMT4mLCBBU1Q6OlR5cGVBcmd1bWVudHMmKTsKIAogfQpJ
bmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvQVNUL1dITFNMVmFyaWFi
bGVEZWNsYXJhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2Vi
Z3B1L1dITFNML0FTVC9XSExTTFZhcmlhYmxlRGVjbGFyYXRpb24uaAkocmV2aXNpb24gMjQ1OTUx
KQorKysgU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvQVNUL1dITFNMVmFyaWFi
bGVEZWNsYXJhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC03MCw2ICs3MCwxMSBAQCBwdWJsaWM6
CiAgICAgRXhwcmVzc2lvbiogaW5pdGlhbGl6ZXIoKSB7IHJldHVybiBtX2luaXRpYWxpemVyID8g
JiptX2luaXRpYWxpemVyIDogbnVsbHB0cjsgfQogICAgIGJvb2wgaXNBbm9ueW1vdXMoKSBjb25z
dCB7IHJldHVybiBtX25hbWUuaXNOdWxsKCk7IH0KICAgICBPcHRpb25hbDxVbmlxdWVSZWY8RXhw
cmVzc2lvbj4+IHRha2VJbml0aWFsaXplcigpIHsgcmV0dXJuIFdURk1vdmUobV9pbml0aWFsaXpl
cik7IH0KKyAgICB2b2lkIHNldEluaXRpYWxpemVyKFVuaXF1ZVJlZjxFeHByZXNzaW9uPiBleHBy
ZXNzaW9uKQorICAgIHsKKyAgICAgICAgQVNTRVJUKCFpbml0aWFsaXplcigpKTsKKyAgICAgICAg
bV9pbml0aWFsaXplciA9IFdURk1vdmUoZXhwcmVzc2lvbik7CisgICAgfQogCiBwcml2YXRlOgog
ICAgIFF1YWxpZmllcnMgbV9xdWFsaWZpZXJzOwpJbmRleDogU291cmNlL1dlYkNvcmUvTW9kdWxl
cy93ZWJncHUvV0hMU0wvTWV0YWwvV0hMU0xGdW5jdGlvbldyaXRlci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvTWV0YWwvV0hMU0xGdW5jdGlv
bldyaXRlci5jcHAJKHJldmlzaW9uIDI0NTk1MSkKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMv
d2ViZ3B1L1dITFNML01ldGFsL1dITFNMRnVuY3Rpb25Xcml0ZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00NDksMTAgKzQ0OSw4IEBAIHZvaWQgRnVuY3Rpb25EZWZpbml0aW9uV3JpdGVyOjp2aXNp
dChBU1QKICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbi5pbml0aWFsaXplcigpKSB7CiAgICAg
ICAgIGNoZWNrRXJyb3JBbmRWaXNpdCgqdmFyaWFibGVEZWNsYXJhdGlvbi5pbml0aWFsaXplcigp
KTsKICAgICAgICAgbV9zdHJpbmdCdWlsZGVyLmFwcGVuZChtYWtlU3RyaW5nKG1fdHlwZU5hbWVy
Lm1hbmdsZWROYW1lRm9yVHlwZSgqdmFyaWFibGVEZWNsYXJhdGlvbi50eXBlKCkpLCAnICcsIHZh
cmlhYmxlTmFtZSwgIiA9ICIsIG1fc3RhY2sudGFrZUxhc3QoKSwgIjtcbiIpKTsKLSAgICB9IGVs
c2UgewotICAgICAgICAvLyBGSVhNRTogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTE5NTc3MSBaZXJvLWZpbGwgdGhlIHZhcmlhYmxlLgorICAgIH0gZWxzZQogICAgICAg
ICBtX3N0cmluZ0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcobV90eXBlTmFtZXIubWFuZ2xlZE5h
bWVGb3JUeXBlKCp2YXJpYWJsZURlY2xhcmF0aW9uLnR5cGUoKSksICcgJywgdmFyaWFibGVOYW1l
LCAiO1xuIikpOwotICAgIH0KIH0KIAogdm9pZCBGdW5jdGlvbkRlZmluaXRpb25Xcml0ZXI6OnZp
c2l0KEFTVDo6QXNzaWdubWVudEV4cHJlc3Npb24mIGFzc2lnbm1lbnRFeHByZXNzaW9uKQpJbmRl
eDogU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJncHUvV0hMU0wvTWV0YWwvV0hMU0xOYXRpdmVG
dW5jdGlvbldyaXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvTW9kdWxlcy93
ZWJncHUvV0hMU0wvTWV0YWwvV0hMU0xOYXRpdmVGdW5jdGlvbldyaXRlci5jcHAJKHJldmlzaW9u
IDI0NTk1MSkKKysrIFNvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViZ3B1L1dITFNML01ldGFsL1dI
TFNMTmF0aXZlRnVuY3Rpb25Xcml0ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQsNyArMTA0
LDEwIEBAIFN0cmluZyB3cml0ZU5hdGl2ZUZ1bmN0aW9uKEFTVDo6TmF0aXZlRnUKICAgICAgICAg
aWYgKCFuYXRpdmVGdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKS5zaXplKCkpIHsKICAg
ICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcobWV0YWxSZXR1cm5OYW1l
LCAnICcsIG91dHB1dEZ1bmN0aW9uTmFtZSwgIigpIHtcbiIpKTsKICAgICAgICAgICAgIHN0cmlu
Z0J1aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcoIiAgICAiLCBtZXRhbFJldHVybk5hbWUsICIgeDtc
biIpKTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTk1NzcxIFplcm8tZmlsbAorICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5h
cHBlbmQoIiAgICB0aHJlYWQgY2hhciogcHRyID0gc3RhdGljX2Nhc3Q8dGhyZWFkIGNoYXIqPihz
dGF0aWNfY2FzdDx0aHJlYWQgdm9pZCo+KCZ4KSk7XG4iKTsKKyAgICAgICAgICAgIHN0cmluZ0J1
aWxkZXIuYXBwZW5kKG1ha2VTdHJpbmcoIiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVv
ZigiLCBtZXRhbFJldHVybk5hbWUsICIpOyArK2kpIHtcbiIpKTsKKyAgICAgICAgICAgIHN0cmlu
Z0J1aWxkZXIuYXBwZW5kKCIgICAgICAgIHB0cltpXSA9IDA7XG4iKTsKKyAgICAgICAgICAgIHN0
cmluZ0J1aWxkZXIuYXBwZW5kKCIgICAgfVxuIik7CiAgICAgICAgICAgICBzdHJpbmdCdWlsZGVy
LmFwcGVuZCgiICAgIHJldHVybiB4O1xuIik7CiAgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFw
cGVuZCgifVxuIik7CiAgICAgICAgICAgICByZXR1cm4gc3RyaW5nQnVpbGRlci50b1N0cmluZygp
OwpJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagkocmV2aXNpb24gMjQ1OTUxKQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC04MzQ1LDYgKzgzNDUsOCBA
QAogCQk1MkIwRDRCRDFDNTdGRDFFMDA3N0NFNTMgLyogUGxhdGZvcm1WaWV3LmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBsYXRmb3JtVmlldy5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQk1MkIwRDRCRjFDNTdGRDY2MDA3N0NFNTMgLyogVmlkZW9GdWxsc2NyZWVu
Q2hhbmdlT2JzZXJ2ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVmlkZW9G
dWxsc2NyZWVuQ2hhbmdlT2JzZXJ2ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
NTJCMEQ0QzExQzU3RkY5MTAwNzdDRTUzIC8qIFZpZGVvRnVsbHNjcmVlbkludGVyZmFjZU1hYy5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBWaWRlb0Z1bGxzY3JlZW5JbnRlcmZh
Y2VNYWMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNTJCMzQzNDkyMkEwNzUyMjAw
RTQ5Mzg5IC8qIFdITFNMQXV0b0luaXRpYWxpemVWYXJpYWJsZXMuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
V0hMU0xBdXRvSW5pdGlhbGl6ZVZhcmlhYmxlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQk1MkIzNDM0QjIyQTA3NTIzMDBFNDkzODkgLyogV0hMU0xBdXRvSW5pdGlhbGl6ZVZhcmlh
Ymxlcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXSExTTEF1dG9Jbml0aWFsaXplVmFyaWFibGVz
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNTJENUExOEQxQzU0NTkwMzAwREUz
NEEzIC8qIFZpZGVvRnVsbHNjcmVlbkxheWVyTWFuYWdlck9iakMubW0gKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBWaWRlb0Z1bGxzY3JlZW5MYXllck1hbmFnZXJPYmpD
Lm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk1MkQ1QTE4RTFDNTQ1OTAzMDBERTM0
QTMgLyogVmlkZW9GdWxsc2NyZWVuTGF5ZXJNYW5hZ2VyT2JqQy5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBWaWRlb0Z1bGxzY3JlZW5MYXllck1hbmFnZXJPYmpDLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTUyRDVBMUE0MUM1NzQ4ODkwMERFMzRBMyAvKiBWaWRl
b0Z1bGxzY3JlZW5Nb2RlbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBWaWRl
b0Z1bGxzY3JlZW5Nb2RlbC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjU0MzQs
NiArMjU0MzYsOCBAQAogCQkJCTFDRUNCM0FEMjFGMkI5NjQwMEY0NDU0MiAvKiBNZXRhbCAqLywK
IAkJCQlDMjBGODhBQTIyOTY2QjBFMDBENjEwRkEgLyogV0hMU0xBU1REdW1wZXIuY3BwICovLAog
CQkJCUMyMEY4OEFDMjI5NjZCMEYwMEQ2MTBGQSAvKiBXSExTTEFTVER1bXBlci5oICovLAorCQkJ
CTUyQjM0MzRCMjJBMDc1MjMwMEU0OTM4OSAvKiBXSExTTEF1dG9Jbml0aWFsaXplVmFyaWFibGVz
LmNwcCAqLywKKwkJCQk1MkIzNDM0OTIyQTA3NTIyMDBFNDkzODkgLyogV0hMU0xBdXRvSW5pdGlh
bGl6ZVZhcmlhYmxlcy5oICovLAogCQkJCUMyMzRBOUIyMjFFOTJDMUYwMDNDOTg0RCAvKiBXSExT
TENoZWNrRHVwbGljYXRlRnVuY3Rpb25zLmNwcCAqLywKIAkJCQlDMjM0QTlBRTIxRTkyQzFBMDAz
Qzk4NEQgLyogV0hMU0xDaGVja0R1cGxpY2F0ZUZ1bmN0aW9ucy5oICovLAogCQkJCTFDODQwQjlC
MjFFQzQwMDkwMEQwNTAwRCAvKiBXSExTTENoZWNrZXIuY3BwICovLApJbmRleDogTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNp
b24gMjQ1OTUxKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDMgKzEsMTYgQEAKKzIwMTktMDUtMzEgIFNhYW0gQmFyYXRpICA8c2JhcmF0aUBhcHBsZS5jb20+
CisKKyAgICAgICAgW1dITFNMXSBJbXBsZW1lbnQgemVyby1maWxsaW5nIG9mIHR5cGVzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTU3NzEKKyAgICAg
ICAgPHJkYXI6Ly9wcm9ibGVtLzUwNzQ2MjkxPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgICogd2ViZ3B1L3dobHNsLXplcm8taW5pdGlhbGl6ZS12YWx1
ZXMtMi1leHBlY3RlZC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiB3ZWJncHUvd2hsc2wtemVyby1p
bml0aWFsaXplLXZhbHVlcy0yLmh0bWw6IEFkZGVkLgorICAgICAgICAqIHdlYmdwdS93aGxzbC16
ZXJvLWluaXRpYWxpemUtdmFsdWVzLWV4cGVjdGVkLmh0bWw6IEFkZGVkLgorICAgICAgICAqIHdl
YmdwdS93aGxzbC16ZXJvLWluaXRpYWxpemUtdmFsdWVzLmh0bWw6IEFkZGVkLgorCiAyMDE5LTA1
LTMwICBKZXIgTm9ibGUgIDxqZXIubm9ibGVAYXBwbGUuY29tPgogCiAgICAgICAgIFZpZGVvIHBs
YXliYWNrIGluIFNhZmFyaSBzaG91bGQgY29udGludWUgd2hlbiBDYXJQbGF5IGlzIHBsdWdnZWQg
aW4KSW5kZXg6IExheW91dFRlc3RzL3dlYmdwdS93aGxzbC16ZXJvLWluaXRpYWxpemUtdmFsdWVz
LTItZXhwZWN0ZWQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy93ZWJncHUvd2hsc2wt
emVyby1pbml0aWFsaXplLXZhbHVlcy0yLWV4cGVjdGVkLmh0bWwJKG5vbmV4aXN0ZW50KQorKysg
TGF5b3V0VGVzdHMvd2ViZ3B1L3dobHNsLXplcm8taW5pdGlhbGl6ZS12YWx1ZXMtMi1leHBlY3Rl
ZC5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTkgQEAKKzwhRE9DVFlQRSBodG1sPgor
PGh0bWw+Cis8aGVhZD4KKzwvaGVhZD4KKzxib2R5PgorPGNhbnZhcyBpZD0iY2FudmFzIiB3aWR0
aD0iNDAwIiBoZWlnaHQ9IjQwMCI+PC9jYW52YXM+Cis8c2NyaXB0PgorYXN5bmMgZnVuY3Rpb24g
c3RhcnQoKSB7CisgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNh
bnZhcyIpOworICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKKyAg
ICBjb250ZXh0LmZpbGxTdHlsZSA9ICJibHVlIjsKKyAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAs
IDQwMCwgNDAwKTsKKyAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICJibGFjayI7CisgICAgY29udGV4
dC5maWxsUmVjdCgxMDAsIDEwMCwgMjAwLCAyMDApOworfQord2luZG93LmFkZEV2ZW50TGlzdGVu
ZXIoImxvYWQiLCBzdGFydCk7Cis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IExh
eW91dFRlc3RzL3dlYmdwdS93aGxzbC16ZXJvLWluaXRpYWxpemUtdmFsdWVzLTIuaHRtbAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBMYXlvdXRUZXN0cy93ZWJncHUvd2hsc2wtemVyby1pbml0aWFsaXplLXZhbHVl
cy0yLmh0bWwJKG5vbmV4aXN0ZW50KQorKysgTGF5b3V0VGVzdHMvd2ViZ3B1L3dobHNsLXplcm8t
aW5pdGlhbGl6ZS12YWx1ZXMtMi5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTUyIEBA
Cis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxjYW52
YXMgaWQ9ImNhbnZhcyIgd2lkdGg9IjQwMCIgaGVpZ2h0PSI0MDAiPjwvY2FudmFzPgorPHNjcmlw
dD4KK2NvbnN0IHNoYWRlclNvdXJjZSA9IGAKK3N0cnVjdCBWZXJ0ZXhPdXQgeworICAgIGZsb2F0
NCBwb3NpdGlvbiA6IFNWX1Bvc2l0aW9uOworICAgIGZsb2F0IHNoYWRlIDogYXR0cmlidXRlKDAp
OworfQorCitzdHJ1Y3QgQmFyIHsKKyAgICBmbG9hdCB5OworICAgIGZsb2F0IHkxOworICAgIGZs
b2F0IHkyOworICAgIGZsb2F0IHkzOworICAgIGZsb2F0IHk0OworICAgIGZsb2F0IHk1OworICAg
IGZsb2F0IHk2OworICAgIGZsb2F0IHk3OworICAgIGZsb2F0IHk4OworICAgIGZsb2F0IHk5Owor
ICAgIGZsb2F0IHkxMDsKKyAgICBmbG9hdCB5MTE7CisgICAgZmxvYXQgeTEyOworICAgIGZsb2F0
IHkxMzsKKyAgICBmbG9hdCB5MTQ7CisgICAgZmxvYXQgeTE1OworICAgIGZsb2F0IHkxNjsKKyAg
ICBmbG9hdCB5MTc7CisgICAgZmxvYXQgeTE4OworICAgIGZsb2F0IHkxOTsKKyAgICBmbG9hdCB5
MjA7Cit9CisKK3ZlcnRleCBWZXJ0ZXhPdXQgdmVydGV4U2hhZGVyKGZsb2F0NCBwb3NpdGlvbiA6
IGF0dHJpYnV0ZSgwKSwgZmxvYXQgc2hhZGUgOiBhdHRyaWJ1dGUoMSkpIHsKKyAgICBWZXJ0ZXhP
dXQgcmVzdWx0OworCisgICAgQmFyIGJhcjsKKworICAgIHJlc3VsdC5wb3NpdGlvbiA9IHBvc2l0
aW9uOworICAgIHJlc3VsdC5zaGFkZSA9IGJhci55MjA7CisKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCitmcmFnbWVudCBmbG9hdDQgZnJhZ21lbnRTaGFkZXIoZmxvYXQgc2hhZGUgOiBhdHRyaWJ1
dGUoMCkpIDogU1ZfVGFyZ2V0IDAgeworICAgIHJldHVybiBmbG9hdDQoc2hhZGUsIHNoYWRlLCBz
aGFkZSwgMS4wKTsKK30KK2A7Cithc3luYyBmdW5jdGlvbiBzdGFydCgpIHsKKyAgICBjb25zdCBh
ZGFwdGVyID0gYXdhaXQgbmF2aWdhdG9yLmdwdS5yZXF1ZXN0QWRhcHRlcigpOworICAgIGNvbnN0
IGRldmljZSA9IGF3YWl0IGFkYXB0ZXIucmVxdWVzdERldmljZSgpOworCisgICAgY29uc3Qgc2hh
ZGVyTW9kdWxlID0gZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7Y29kZTogc2hhZGVyU291cmNl
LCBpc1dITFNMOiB0cnVlfSk7CisgICAgY29uc3QgdmVydGV4U3RhZ2UgPSB7bW9kdWxlOiBzaGFk
ZXJNb2R1bGUsIGVudHJ5UG9pbnQ6ICJ2ZXJ0ZXhTaGFkZXIifTsKKyAgICBjb25zdCBmcmFnbWVu
dFN0YWdlID0ge21vZHVsZTogc2hhZGVyTW9kdWxlLCBlbnRyeVBvaW50OiAiZnJhZ21lbnRTaGFk
ZXIifTsKKyAgICBjb25zdCBwcmltaXRpdmVUb3BvbG9neSA9ICJ0cmlhbmdsZS1zdHJpcCI7Cisg
ICAgY29uc3QgcmFzdGVyaXphdGlvblN0YXRlID0ge2Zyb250RmFjZTogImN3IiwgY3VsbE1vZGU6
ICJub25lIn07CisgICAgY29uc3QgYWxwaGFCbGVuZCA9IHt9OworICAgIGNvbnN0IGNvbG9yQmxl
bmQgPSB7fTsKKyAgICBjb25zdCBjb2xvclN0YXRlcyA9IFt7Zm9ybWF0OiAicmdiYTh1bm9ybSIs
IGFscGhhQmxlbmQsIGNvbG9yQmxlbmQsIHdyaXRlTWFzazogMTV9XTsgLy8gR1BVQ29sb3JXcml0
ZUJpdHMuQUxMCisgICAgY29uc3QgZGVwdGhTdGVuY2lsU3RhdGUgPSBudWxsOworCisgICAgY29u
c3QgYXR0cmlidXRlMCA9IHtzaGFkZXJMb2NhdGlvbjogMCwgZm9ybWF0OiAiZmxvYXQ0Iiwgb2Zm
c2V0OiAwfTsKKyAgICBjb25zdCBhdHRyaWJ1dGUxID0ge3NoYWRlckxvY2F0aW9uOiAxLCBmb3Jt
YXQ6ICJmbG9hdCIsIG9mZnNldDogMTZ9OworICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbYXR0cmli
dXRlMCwgYXR0cmlidXRlMV07CisgICAgY29uc3QgaW5wdXQwID0ge3N0cmlkZTogMjAsIGF0dHJp
YnV0ZVNldDogYXR0cmlidXRlc307CisgICAgY29uc3QgaW5wdXRzID0gW2lucHV0MF07CisgICAg
Y29uc3QgdmVydGV4SW5wdXQgPSB7dmVydGV4QnVmZmVyczogaW5wdXRzfTsKKworICAgIGNvbnN0
IGJpbmRHcm91cExheW91dERlc2NyaXB0b3IgPSB7YmluZGluZ3M6IFt7YmluZGluZzogMCwgdmlz
aWJpbGl0eTogNywgdHlwZTogInVuaWZvcm0tYnVmZmVyIn1dfTsKKyAgICBjb25zdCBiaW5kR3Jv
dXBMYXlvdXQgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwTGF5b3V0KGJpbmRHcm91cExheW91dERl
c2NyaXB0b3IpOworICAgIGNvbnN0IHBpcGVsaW5lTGF5b3V0RGVzY3JpcHRvciA9IHtiaW5kR3Jv
dXBMYXlvdXRzOiBbYmluZEdyb3VwTGF5b3V0XX07CisgICAgY29uc3QgcGlwZWxpbmVMYXlvdXQg
PSBkZXZpY2UuY3JlYXRlUGlwZWxpbmVMYXlvdXQocGlwZWxpbmVMYXlvdXREZXNjcmlwdG9yKTsK
KworICAgIGNvbnN0IHJlbmRlclBpcGVsaW5lRGVzY3JpcHRvciA9IHt2ZXJ0ZXhTdGFnZSwgZnJh
Z21lbnRTdGFnZSwgcHJpbWl0aXZlVG9wb2xvZ3ksIHJhc3Rlcml6YXRpb25TdGF0ZSwgY29sb3JT
dGF0ZXMsIGRlcHRoU3RlbmNpbFN0YXRlLCB2ZXJ0ZXhJbnB1dCwgc2FtcGxlQ291bnQ6IDEsIGxh
eW91dDogcGlwZWxpbmVMYXlvdXR9OworICAgIGNvbnN0IHJlbmRlclBpcGVsaW5lID0gZGV2aWNl
LmNyZWF0ZVJlbmRlclBpcGVsaW5lKHJlbmRlclBpcGVsaW5lRGVzY3JpcHRvcik7CisKKyAgICBj
b25zdCB2ZXJ0ZXhCdWZmZXIwRGVzY3JpcHRvciA9IHtzaXplOiBGbG9hdDMyQXJyYXkuQllURVNf
UEVSX0VMRU1FTlQgKiA1ICogNCwgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlZFUlRFWCB8IEdQVUJ1
ZmZlclVzYWdlLk1BUF9XUklURX07CisgICAgY29uc3QgdmVydGV4QnVmZmVyMCA9IGRldmljZS5j
cmVhdGVCdWZmZXIodmVydGV4QnVmZmVyMERlc2NyaXB0b3IpOworICAgIGNvbnN0IHZlcnRleEJ1
ZmZlcjBBcnJheUJ1ZmZlciA9IGF3YWl0IHZlcnRleEJ1ZmZlcjAubWFwV3JpdGVBc3luYygpOwor
ICAgIGNvbnN0IHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHZl
cnRleEJ1ZmZlcjBBcnJheUJ1ZmZlcik7CisgICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVsw
XSA9IC0wLjU7CisgICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVsxXSA9IC0wLjU7CisgICAg
dmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVsyXSA9IDEuMDsKKyAgICB2ZXJ0ZXhCdWZmZXIwRmxv
YXQzMkFycmF5WzNdID0gMS4wOworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbNF0gPSAx
LjA7CisKKyAgICB2ZXJ0ZXhCdWZmZXIwRmxvYXQzMkFycmF5WzVdID0gLTAuNTsKKyAgICB2ZXJ0
ZXhCdWZmZXIwRmxvYXQzMkFycmF5WzZdID0gMC41OworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMy
QXJyYXlbN10gPSAxLjA7CisgICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVs4XSA9IDEuMDsK
KyAgICB2ZXJ0ZXhCdWZmZXIwRmxvYXQzMkFycmF5WzldID0gMS4wOworCisgICAgdmVydGV4QnVm
ZmVyMEZsb2F0MzJBcnJheVsxMF0gPSAwLjU7CisgICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJh
eVsxMV0gPSAtMC41OworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbMTJdID0gMS4wOwor
ICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbMTNdID0gMS4wOworICAgIHZlcnRleEJ1ZmZl
cjBGbG9hdDMyQXJyYXlbMTRdID0gMS4wOworCisgICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJh
eVsxNV0gPSAwLjU7CisgICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVsxNl0gPSAwLjU7Cisg
ICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVsxN10gPSAxLjA7CisgICAgdmVydGV4QnVmZmVy
MEZsb2F0MzJBcnJheVsxOF0gPSAxLjA7CisgICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVsx
OV0gPSAxLjA7CisgICAgdmVydGV4QnVmZmVyMC51bm1hcCgpOworCisgICAgY29uc3QgcmVzb3Vy
Y2VCdWZmZXJEZXNjcmlwdG9yID0ge3NpemU6IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVO
VCwgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlVOSUZPUk0gfCBHUFVCdWZmZXJVc2FnZS5NQVBfV1JJ
VEV9OworICAgIGNvbnN0IHJlc291cmNlQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcihyZXNv
dXJjZUJ1ZmZlckRlc2NyaXB0b3IpOworICAgIGNvbnN0IHJlc291cmNlQnVmZmVyQXJyYXlCdWZm
ZXIgPSBhd2FpdCByZXNvdXJjZUJ1ZmZlci5tYXBXcml0ZUFzeW5jKCk7CisgICAgY29uc3QgcmVz
b3VyY2VCdWZmZXJGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHJlc291cmNlQnVmZmVy
QXJyYXlCdWZmZXIpOworICAgIHJlc291cmNlQnVmZmVyRmxvYXQzMkFycmF5WzBdID0gMTsKKyAg
ICByZXNvdXJjZUJ1ZmZlci51bm1hcCgpOworCisgICAgY29uc3QgYnVmZmVyQmluZGluZyA9IHti
dWZmZXI6IHJlc291cmNlQnVmZmVyLCBzaXplOiA0fTsKKyAgICBjb25zdCBiaW5kR3JvdXBCaW5k
aW5nID0ge2JpbmRpbmc6IDAsIHJlc291cmNlOiBidWZmZXJCaW5kaW5nfTsKKyAgICBjb25zdCBi
aW5kR3JvdXBEZXNjcmlwdG9yID0ge2xheW91dDogYmluZEdyb3VwTGF5b3V0LCBiaW5kaW5nczog
W2JpbmRHcm91cEJpbmRpbmddfTsKKyAgICBjb25zdCBiaW5kR3JvdXAgPSBkZXZpY2UuY3JlYXRl
QmluZEdyb3VwKGJpbmRHcm91cERlc2NyaXB0b3IpOworCisgICAgY29uc3QgY2FudmFzID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbnZhcyIpOworICAgIGNvbnN0IGNvbnRleHQgPSBjYW52
YXMuZ2V0Q29udGV4dCgiZ3B1Iik7CisgICAgY29uc3Qgc3dhcENoYWluRGVzY3JpcHRvciA9IHtk
ZXZpY2UsIGZvcm1hdDogImJncmE4dW5vcm0ifTsKKyAgICBjb25zdCBzd2FwQ2hhaW4gPSBjb250
ZXh0LmNvbmZpZ3VyZVN3YXBDaGFpbihzd2FwQ2hhaW5EZXNjcmlwdG9yKTsKKyAgICBjb25zdCBv
dXRwdXRUZXh0dXJlID0gc3dhcENoYWluLmdldEN1cnJlbnRUZXh0dXJlKCk7CisgICAgY29uc3Qg
b3V0cHV0VGV4dHVyZVZpZXcgPSBvdXRwdXRUZXh0dXJlLmNyZWF0ZURlZmF1bHRWaWV3KCk7CisK
KyAgICBjb25zdCBjb21tYW5kRW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcigp
OyAvLyB7fQorICAgIGNvbnN0IHJlZCA9IHtyOiAwLCBnOiAwLCBiOiAxLCBhOiAxfTsKKyAgICBj
b25zdCBjb2xvckF0dGFjaG1lbnRzID0gW3thdHRhY2htZW50OiBvdXRwdXRUZXh0dXJlVmlldywg
cmVzb2x2ZVRhcmdldDogbnVsbCwgbG9hZE9wOiAiY2xlYXIiLCBzdG9yZU9wOiAic3RvcmUiLCBj
bGVhckNvbG9yOiByZWR9XTsKKyAgICBjb25zdCBkZXB0aFN0ZW5jaWxBdHRhY2htZW50ID0gbnVs
bDsKKyAgICBjb25zdCByZW5kZXJQYXNzRGVzY3JpcHRvciA9IHtjb2xvckF0dGFjaG1lbnRzLCBk
ZXB0aFN0ZW5jaWxBdHRhY2htZW50fTsKKyAgICBjb25zdCByZW5kZXJQYXNzRW5jb2RlciA9IGNv
bW1hbmRFbmNvZGVyLmJlZ2luUmVuZGVyUGFzcyhyZW5kZXJQYXNzRGVzY3JpcHRvcik7CisgICAg
cmVuZGVyUGFzc0VuY29kZXIuc2V0UGlwZWxpbmUocmVuZGVyUGlwZWxpbmUpOworICAgIHJlbmRl
clBhc3NFbmNvZGVyLnNldEJpbmRHcm91cCgwLCBiaW5kR3JvdXApOworICAgIHJlbmRlclBhc3NF
bmNvZGVyLnNldFZlcnRleEJ1ZmZlcnMoMCwgW3ZlcnRleEJ1ZmZlcjBdLCBbMF0pOworICAgIHJl
bmRlclBhc3NFbmNvZGVyLmRyYXcoNCwgMSwgMCwgMCk7CisgICAgcmVuZGVyUGFzc0VuY29kZXIu
ZW5kUGFzcygpOworICAgIGNvbnN0IGNvbW1hbmRCdWZmZXIgPSBjb21tYW5kRW5jb2Rlci5maW5p
c2goKTsKKyAgICBkZXZpY2UuZ2V0UXVldWUoKS5zdWJtaXQoW2NvbW1hbmRCdWZmZXJdKTsKKwor
ICAgIGlmICh3aW5kb3cudGVzdFJ1bm5lcikKKyAgICAgICAgdGVzdFJ1bm5lci5ub3RpZnlEb25l
KCk7Cit9CitpZiAod2luZG93LnRlc3RSdW5uZXIpCisgICAgdGVzdFJ1bm5lci53YWl0VW50aWxE
b25lKCk7Cit3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIHN0YXJ0KTsKKzwvc2NyaXB0
PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvd2ViZ3B1L3dobHNsLXplcm8t
aW5pdGlhbGl6ZS12YWx1ZXMtZXhwZWN0ZWQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy93ZWJncHUvd2hsc2wtemVyby1pbml0aWFsaXplLXZhbHVlcy1leHBlY3RlZC5odG1sCShub25l
eGlzdGVudCkKKysrIExheW91dFRlc3RzL3dlYmdwdS93aGxzbC16ZXJvLWluaXRpYWxpemUtdmFs
dWVzLWV4cGVjdGVkLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxOSBAQAorPCFET0NU
WVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorPC9oZWFkPgorPGJvZHk+Cis8Y2FudmFzIGlkPSJj
YW52YXMiIHdpZHRoPSI0MDAiIGhlaWdodD0iNDAwIj48L2NhbnZhcz4KKzxzY3JpcHQ+Cithc3lu
YyBmdW5jdGlvbiBzdGFydCgpIHsKKyAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgiY2FudmFzIik7CisgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0
KCIyZCIpOworICAgIGNvbnRleHQuZmlsbFN0eWxlID0gImJsdWUiOworICAgIGNvbnRleHQuZmls
bFJlY3QoMCwgMCwgNDAwLCA0MDApOworICAgIGNvbnRleHQuZmlsbFN0eWxlID0gImJsYWNrIjsK
KyAgICBjb250ZXh0LmZpbGxSZWN0KDEwMCwgMTAwLCAyMDAsIDIwMCk7Cit9Cit3aW5kb3cuYWRk
RXZlbnRMaXN0ZW5lcigibG9hZCIsIHN0YXJ0KTsKKzwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1s
PgpJbmRleDogTGF5b3V0VGVzdHMvd2ViZ3B1L3dobHNsLXplcm8taW5pdGlhbGl6ZS12YWx1ZXMu
aHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy93ZWJncHUvd2hsc2wtemVyby1pbml0aWFs
aXplLXZhbHVlcy5odG1sCShub25leGlzdGVudCkKKysrIExheW91dFRlc3RzL3dlYmdwdS93aGxz
bC16ZXJvLWluaXRpYWxpemUtdmFsdWVzLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MzUgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzwvaGVhZD4KKzxib2R5Pgor
PGNhbnZhcyBpZD0iY2FudmFzIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQwMCI+PC9jYW52YXM+Cis8
c2NyaXB0PgorY29uc3Qgc2hhZGVyU291cmNlID0gYAorc3RydWN0IFZlcnRleE91dCB7CisgICAg
ZmxvYXQ0IHBvc2l0aW9uIDogU1ZfUG9zaXRpb247CisgICAgZmxvYXQgc2hhZGUgOiBhdHRyaWJ1
dGUoMCk7Cit9CisKK3RocmVhZCBmbG9hdCogcHRyKCkgeworICAgIGZsb2F0IGxvY2FsOworICAg
IHJldHVybiAmbG9jYWw7Cit9CisKK3ZlcnRleCBWZXJ0ZXhPdXQgdmVydGV4U2hhZGVyKGZsb2F0
NCBwb3NpdGlvbiA6IGF0dHJpYnV0ZSgwKSwgZmxvYXQgc2hhZGUgOiBhdHRyaWJ1dGUoMSkpIHsK
KyAgICBWZXJ0ZXhPdXQgcmVzdWx0OworCisgICAgdGhyZWFkIGZsb2F0KiBwID0gcHRyKCk7Cisg
ICAgKnAgPSAxLjA7CisgICAgZmxvYXQgdmFsdWUgPSAqcHRyKCk7IC8vIGNhbGxpbmcgcHRyKCkg
emVybyBpbml0aWFsaXplcy4KKworICAgIHJlc3VsdC5wb3NpdGlvbiA9IHBvc2l0aW9uOworICAg
IHJlc3VsdC5zaGFkZSA9IHZhbHVlOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworZnJhZ21l
bnQgZmxvYXQ0IGZyYWdtZW50U2hhZGVyKGZsb2F0IHNoYWRlIDogYXR0cmlidXRlKDApKSA6IFNW
X1RhcmdldCAwIHsKKyAgICByZXR1cm4gZmxvYXQ0KHNoYWRlLCBzaGFkZSwgc2hhZGUsIDEuMCk7
Cit9CitgOworYXN5bmMgZnVuY3Rpb24gc3RhcnQoKSB7CisgICAgY29uc3QgYWRhcHRlciA9IGF3
YWl0IG5hdmlnYXRvci5ncHUucmVxdWVzdEFkYXB0ZXIoKTsKKyAgICBjb25zdCBkZXZpY2UgPSBh
d2FpdCBhZGFwdGVyLnJlcXVlc3REZXZpY2UoKTsKKworICAgIGNvbnN0IHNoYWRlck1vZHVsZSA9
IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe2NvZGU6IHNoYWRlclNvdXJjZSwgaXNXSExTTDog
dHJ1ZX0pOworICAgIGNvbnN0IHZlcnRleFN0YWdlID0ge21vZHVsZTogc2hhZGVyTW9kdWxlLCBl
bnRyeVBvaW50OiAidmVydGV4U2hhZGVyIn07CisgICAgY29uc3QgZnJhZ21lbnRTdGFnZSA9IHtt
b2R1bGU6IHNoYWRlck1vZHVsZSwgZW50cnlQb2ludDogImZyYWdtZW50U2hhZGVyIn07CisgICAg
Y29uc3QgcHJpbWl0aXZlVG9wb2xvZ3kgPSAidHJpYW5nbGUtc3RyaXAiOworICAgIGNvbnN0IHJh
c3Rlcml6YXRpb25TdGF0ZSA9IHtmcm9udEZhY2U6ICJjdyIsIGN1bGxNb2RlOiAibm9uZSJ9Owor
ICAgIGNvbnN0IGFscGhhQmxlbmQgPSB7fTsKKyAgICBjb25zdCBjb2xvckJsZW5kID0ge307Cisg
ICAgY29uc3QgY29sb3JTdGF0ZXMgPSBbe2Zvcm1hdDogInJnYmE4dW5vcm0iLCBhbHBoYUJsZW5k
LCBjb2xvckJsZW5kLCB3cml0ZU1hc2s6IDE1fV07IC8vIEdQVUNvbG9yV3JpdGVCaXRzLkFMTAor
ICAgIGNvbnN0IGRlcHRoU3RlbmNpbFN0YXRlID0gbnVsbDsKKworICAgIGNvbnN0IGF0dHJpYnV0
ZTAgPSB7c2hhZGVyTG9jYXRpb246IDAsIGZvcm1hdDogImZsb2F0NCIsIG9mZnNldDogMH07Cisg
ICAgY29uc3QgYXR0cmlidXRlMSA9IHtzaGFkZXJMb2NhdGlvbjogMSwgZm9ybWF0OiAiZmxvYXQi
LCBvZmZzZXQ6IDE2fTsKKyAgICBjb25zdCBhdHRyaWJ1dGVzID0gW2F0dHJpYnV0ZTAsIGF0dHJp
YnV0ZTFdOworICAgIGNvbnN0IGlucHV0MCA9IHtzdHJpZGU6IDIwLCBhdHRyaWJ1dGVTZXQ6IGF0
dHJpYnV0ZXN9OworICAgIGNvbnN0IGlucHV0cyA9IFtpbnB1dDBdOworICAgIGNvbnN0IHZlcnRl
eElucHV0ID0ge3ZlcnRleEJ1ZmZlcnM6IGlucHV0c307CisKKyAgICBjb25zdCBiaW5kR3JvdXBM
YXlvdXREZXNjcmlwdG9yID0ge2JpbmRpbmdzOiBbe2JpbmRpbmc6IDAsIHZpc2liaWxpdHk6IDcs
IHR5cGU6ICJ1bmlmb3JtLWJ1ZmZlciJ9XX07CisgICAgY29uc3QgYmluZEdyb3VwTGF5b3V0ID0g
ZGV2aWNlLmNyZWF0ZUJpbmRHcm91cExheW91dChiaW5kR3JvdXBMYXlvdXREZXNjcmlwdG9yKTsK
KyAgICBjb25zdCBwaXBlbGluZUxheW91dERlc2NyaXB0b3IgPSB7YmluZEdyb3VwTGF5b3V0czog
W2JpbmRHcm91cExheW91dF19OworICAgIGNvbnN0IHBpcGVsaW5lTGF5b3V0ID0gZGV2aWNlLmNy
ZWF0ZVBpcGVsaW5lTGF5b3V0KHBpcGVsaW5lTGF5b3V0RGVzY3JpcHRvcik7CisKKyAgICBjb25z
dCByZW5kZXJQaXBlbGluZURlc2NyaXB0b3IgPSB7dmVydGV4U3RhZ2UsIGZyYWdtZW50U3RhZ2Us
IHByaW1pdGl2ZVRvcG9sb2d5LCByYXN0ZXJpemF0aW9uU3RhdGUsIGNvbG9yU3RhdGVzLCBkZXB0
aFN0ZW5jaWxTdGF0ZSwgdmVydGV4SW5wdXQsIHNhbXBsZUNvdW50OiAxLCBsYXlvdXQ6IHBpcGVs
aW5lTGF5b3V0fTsKKyAgICBjb25zdCByZW5kZXJQaXBlbGluZSA9IGRldmljZS5jcmVhdGVSZW5k
ZXJQaXBlbGluZShyZW5kZXJQaXBlbGluZURlc2NyaXB0b3IpOworCisgICAgY29uc3QgdmVydGV4
QnVmZmVyMERlc2NyaXB0b3IgPSB7c2l6ZTogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5U
ICogNSAqIDQsIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5WRVJURVggfCBHUFVCdWZmZXJVc2FnZS5N
QVBfV1JJVEV9OworICAgIGNvbnN0IHZlcnRleEJ1ZmZlcjAgPSBkZXZpY2UuY3JlYXRlQnVmZmVy
KHZlcnRleEJ1ZmZlcjBEZXNjcmlwdG9yKTsKKyAgICBjb25zdCB2ZXJ0ZXhCdWZmZXIwQXJyYXlC
dWZmZXIgPSBhd2FpdCB2ZXJ0ZXhCdWZmZXIwLm1hcFdyaXRlQXN5bmMoKTsKKyAgICBjb25zdCB2
ZXJ0ZXhCdWZmZXIwRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0ZXhCdWZmZXIw
QXJyYXlCdWZmZXIpOworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbMF0gPSAtMC41Owor
ICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbMV0gPSAtMC41OworICAgIHZlcnRleEJ1ZmZl
cjBGbG9hdDMyQXJyYXlbMl0gPSAxLjA7CisgICAgdmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVsz
XSA9IDEuMDsKKyAgICB2ZXJ0ZXhCdWZmZXIwRmxvYXQzMkFycmF5WzRdID0gMS4wOworCisgICAg
dmVydGV4QnVmZmVyMEZsb2F0MzJBcnJheVs1XSA9IC0wLjU7CisgICAgdmVydGV4QnVmZmVyMEZs
b2F0MzJBcnJheVs2XSA9IDAuNTsKKyAgICB2ZXJ0ZXhCdWZmZXIwRmxvYXQzMkFycmF5WzddID0g
MS4wOworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbOF0gPSAxLjA7CisgICAgdmVydGV4
QnVmZmVyMEZsb2F0MzJBcnJheVs5XSA9IDEuMDsKKworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMy
QXJyYXlbMTBdID0gMC41OworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbMTFdID0gLTAu
NTsKKyAgICB2ZXJ0ZXhCdWZmZXIwRmxvYXQzMkFycmF5WzEyXSA9IDEuMDsKKyAgICB2ZXJ0ZXhC
dWZmZXIwRmxvYXQzMkFycmF5WzEzXSA9IDEuMDsKKyAgICB2ZXJ0ZXhCdWZmZXIwRmxvYXQzMkFy
cmF5WzE0XSA9IDEuMDsKKworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbMTVdID0gMC41
OworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbMTZdID0gMC41OworICAgIHZlcnRleEJ1
ZmZlcjBGbG9hdDMyQXJyYXlbMTddID0gMS4wOworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJy
YXlbMThdID0gMS4wOworICAgIHZlcnRleEJ1ZmZlcjBGbG9hdDMyQXJyYXlbMTldID0gMS4wOwor
ICAgIHZlcnRleEJ1ZmZlcjAudW5tYXAoKTsKKworICAgIGNvbnN0IHJlc291cmNlQnVmZmVyRGVz
Y3JpcHRvciA9IHtzaXplOiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHVzYWdlOiBH
UFVCdWZmZXJVc2FnZS5VTklGT1JNIHwgR1BVQnVmZmVyVXNhZ2UuTUFQX1dSSVRFfTsKKyAgICBj
b25zdCByZXNvdXJjZUJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIocmVzb3VyY2VCdWZmZXJE
ZXNjcmlwdG9yKTsKKyAgICBjb25zdCByZXNvdXJjZUJ1ZmZlckFycmF5QnVmZmVyID0gYXdhaXQg
cmVzb3VyY2VCdWZmZXIubWFwV3JpdGVBc3luYygpOworICAgIGNvbnN0IHJlc291cmNlQnVmZmVy
RmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShyZXNvdXJjZUJ1ZmZlckFycmF5QnVmZmVy
KTsKKyAgICByZXNvdXJjZUJ1ZmZlckZsb2F0MzJBcnJheVswXSA9IDE7CisgICAgcmVzb3VyY2VC
dWZmZXIudW5tYXAoKTsKKworICAgIGNvbnN0IGJ1ZmZlckJpbmRpbmcgPSB7YnVmZmVyOiByZXNv
dXJjZUJ1ZmZlciwgc2l6ZTogNH07CisgICAgY29uc3QgYmluZEdyb3VwQmluZGluZyA9IHtiaW5k
aW5nOiAwLCByZXNvdXJjZTogYnVmZmVyQmluZGluZ307CisgICAgY29uc3QgYmluZEdyb3VwRGVz
Y3JpcHRvciA9IHtsYXlvdXQ6IGJpbmRHcm91cExheW91dCwgYmluZGluZ3M6IFtiaW5kR3JvdXBC
aW5kaW5nXX07CisgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cChi
aW5kR3JvdXBEZXNjcmlwdG9yKTsKKworICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmdldEVs
ZW1lbnRCeUlkKCJjYW52YXMiKTsKKyAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRl
eHQoImdwdSIpOworICAgIGNvbnN0IHN3YXBDaGFpbkRlc2NyaXB0b3IgPSB7ZGV2aWNlLCBmb3Jt
YXQ6ICJiZ3JhOHVub3JtIn07CisgICAgY29uc3Qgc3dhcENoYWluID0gY29udGV4dC5jb25maWd1
cmVTd2FwQ2hhaW4oc3dhcENoYWluRGVzY3JpcHRvcik7CisgICAgY29uc3Qgb3V0cHV0VGV4dHVy
ZSA9IHN3YXBDaGFpbi5nZXRDdXJyZW50VGV4dHVyZSgpOworICAgIGNvbnN0IG91dHB1dFRleHR1
cmVWaWV3ID0gb3V0cHV0VGV4dHVyZS5jcmVhdGVEZWZhdWx0VmlldygpOworCisgICAgY29uc3Qg
Y29tbWFuZEVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoKTsgLy8ge30KKyAg
ICBjb25zdCByZWQgPSB7cjogMCwgZzogMCwgYjogMSwgYTogMX07CisgICAgY29uc3QgY29sb3JB
dHRhY2htZW50cyA9IFt7YXR0YWNobWVudDogb3V0cHV0VGV4dHVyZVZpZXcsIHJlc29sdmVUYXJn
ZXQ6IG51bGwsIGxvYWRPcDogImNsZWFyIiwgc3RvcmVPcDogInN0b3JlIiwgY2xlYXJDb2xvcjog
cmVkfV07CisgICAgY29uc3QgZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IG51bGw7CisgICAgY29u
c3QgcmVuZGVyUGFzc0Rlc2NyaXB0b3IgPSB7Y29sb3JBdHRhY2htZW50cywgZGVwdGhTdGVuY2ls
QXR0YWNobWVudH07CisgICAgY29uc3QgcmVuZGVyUGFzc0VuY29kZXIgPSBjb21tYW5kRW5jb2Rl
ci5iZWdpblJlbmRlclBhc3MocmVuZGVyUGFzc0Rlc2NyaXB0b3IpOworICAgIHJlbmRlclBhc3NF
bmNvZGVyLnNldFBpcGVsaW5lKHJlbmRlclBpcGVsaW5lKTsKKyAgICByZW5kZXJQYXNzRW5jb2Rl
ci5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTsKKyAgICByZW5kZXJQYXNzRW5jb2Rlci5zZXRW
ZXJ0ZXhCdWZmZXJzKDAsIFt2ZXJ0ZXhCdWZmZXIwXSwgWzBdKTsKKyAgICByZW5kZXJQYXNzRW5j
b2Rlci5kcmF3KDQsIDEsIDAsIDApOworICAgIHJlbmRlclBhc3NFbmNvZGVyLmVuZFBhc3MoKTsK
KyAgICBjb25zdCBjb21tYW5kQnVmZmVyID0gY29tbWFuZEVuY29kZXIuZmluaXNoKCk7CisgICAg
ZGV2aWNlLmdldFF1ZXVlKCkuc3VibWl0KFtjb21tYW5kQnVmZmVyXSk7CisKKyAgICBpZiAod2lu
ZG93LnRlc3RSdW5uZXIpCisgICAgICAgIHRlc3RSdW5uZXIubm90aWZ5RG9uZSgpOworfQoraWYg
KHdpbmRvdy50ZXN0UnVubmVyKQorICAgIHRlc3RSdW5uZXIud2FpdFVudGlsRG9uZSgpOword2lu
ZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBzdGFydCk7Cis8L3NjcmlwdD4KKzwvYm9keT4K
KzwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>