<?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>110159</bug_id>
          
          <creation_ts>2013-02-18 15:10:48 -0800</creation_ts>
          <short_desc>Web Inspector: take large strings out of CodeGeneratorInspector.py</short_desc>
          <delta_ts>2013-02-21 04:39:34 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector (Deprecated)</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Peter Rybin">prybin</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>apavlov</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>vsevik</cc>
    
    <cc>web-inspector-bugs</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>835778</commentid>
    <comment_count>0</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2013-02-18 15:10:48 -0800</bug_when>
    <thetext>CodeGeneratorInspector.py largely contains multiline string literals.
Those should be taken away into a separate file to keep code and string resources better separated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>835789</commentid>
    <comment_count>1</comment_count>
      <attachid>188951</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2013-02-18 15:24:12 -0800</bug_when>
    <thetext>Created attachment 188951
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>836136</commentid>
    <comment_count>2</comment_count>
      <attachid>188951</attachid>
    <who name="Yury Semikhatsky">yurys</who>
    <bug_when>2013-02-19 01:55:00 -0800</bug_when>
    <thetext>Comment on attachment 188951
Patch

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

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:40
&gt; +import CodeGeneratorInspectorStrings

Maybe CodeGeneratorInspectorTemplates?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>836149</commentid>
    <comment_count>3</comment_count>
    <who name="Ilya Tikhonovsky">loislo</who>
    <bug_when>2013-02-19 02:09:20 -0800</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=188951&amp;action=review

What do you think about further splitting of this file. I&apos;d expect to see one template file per one result file.

&gt; Source/WebCore/inspector/CodeGeneratorInspectorStrings.py:701
&gt; +#endif  // !ASSERT_DISABLED

Wrong comment here and in many other places like that.

&gt; Source/WebCore/inspector/CodeGeneratorInspectorStrings.py:922
&gt; +class_binding_builder_part_1 = (
&gt; +&quot;&quot;&quot;        AllFieldsSet = %s
&gt; +    };
&gt; +
&gt; +    template&lt;int STATE&gt;
&gt; +    class Builder {
&gt; +    private:
&gt; +        RefPtr&lt;InspectorObject&gt; m_result;
&gt; +
&gt; +        template&lt;int STEP&gt; Builder&lt;STATE | STEP&gt;&amp; castState()
&gt; +        {
&gt; +            return *reinterpret_cast&lt;Builder&lt;STATE | STEP&gt;*&gt;(this);
&gt; +        }
&gt; +
&gt; +        Builder(PassRefPtr&lt;/*%s*/InspectorObject&gt; ptr)
&gt; +        {
&gt; +            COMPILE_ASSERT(STATE == NoFieldsSet, builder_created_in_non_init_state);
&gt; +            m_result = ptr;
&gt; +        }
&gt; +        friend class %s;
&gt; +    public:
&gt; +&quot;&quot;&quot;)

I think that it would be more declarative and less error prone if you convert it to a function with named argument instead of a string.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>836716</commentid>
    <comment_count>4</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2013-02-19 13:26:20 -0800</bug_when>
    <thetext>&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:40
&gt; &gt; +import CodeGeneratorInspectorStrings
&gt; Maybe CodeGeneratorInspectorTemplates?

Please write how positive you are about this change, because I&apos;m 50/50.

The reason why I chose &quot;strings&quot; is because I meant this file as plain storage for multiline strings. I don&apos;t care whether they are templates or what.

Multiline string is the only thing you cannot take with you into type-safe language if you ever want to.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>836738</commentid>
    <comment_count>5</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2013-02-19 13:45:31 -0800</bug_when>
    <thetext>&gt; What do you think about further splitting of this file. I&apos;d expect to see one template file per one result file.

That would bring more strange files into repository, but I don&apos;t see a clear benefit from this. You are not going to get a real general-purpose template engine anyway. Current code structure is very traceable. For example, all generated scripts declare the path to the generator file. 

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspectorStrings.py:701
&gt; &gt; +#endif  // !ASSERT_DISABLED
&gt; Wrong comment here and in many other places like that.

Thanks.

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspectorStrings.py:922
&gt; &gt; +class_binding_builder_part_1 = (
&gt; &gt; +&quot;&quot;&quot;        AllFieldsSet = %s
&gt; &gt; +    };
&gt; &gt; +
&gt; &gt; +    template&lt;int STATE&gt;
&gt; &gt; +    class Builder {
&gt; &gt; +    private:
&gt; &gt; +        RefPtr&lt;InspectorObject&gt; m_result;
&gt; &gt; +
&gt; &gt; +        template&lt;int STEP&gt; Builder&lt;STATE | STEP&gt;&amp; castState()
&gt; &gt; +        {
&gt; &gt; +            return *reinterpret_cast&lt;Builder&lt;STATE | STEP&gt;*&gt;(this);
&gt; &gt; +        }
&gt; &gt; +
&gt; &gt; +        Builder(PassRefPtr&lt;/*%s*/InspectorObject&gt; ptr)
&gt; &gt; +        {
&gt; &gt; +            COMPILE_ASSERT(STATE == NoFieldsSet, builder_created_in_non_init_state);
&gt; &gt; +            m_result = ptr;
&gt; &gt; +        }
&gt; &gt; +        friend class %s;
&gt; &gt; +    public:
&gt; &gt; +&quot;&quot;&quot;)
&gt; 
&gt; I think that it would be more declarative and less error prone if you convert it to a function with named argument instead of a string.

Unfortunately that&apos;s not what I planned to do. I see at as a collection of multiline string resources, no code or any other mark-up. If I ever were to switch script to type-safe language, I would need multiline strings separate. In this form as I suggest, I would be able to write a really simple RegExp-based parser to easily read this strings. This is basically a pseudo-python similar to like JSON is a pseuod-JavaScript.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>836785</commentid>
    <comment_count>6</comment_count>
      <attachid>189164</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2013-02-19 14:28:50 -0800</bug_when>
    <thetext>Created attachment 189164
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>837277</commentid>
    <comment_count>7</comment_count>
    <who name="Yury Semikhatsky">yurys</who>
    <bug_when>2013-02-20 02:03:28 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; &gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:40
&gt; &gt; &gt; +import CodeGeneratorInspectorStrings
&gt; &gt; Maybe CodeGeneratorInspectorTemplates?
&gt; 
&gt; Please write how positive you are about this change, because I&apos;m 50/50.
&gt; 
&gt; The reason why I chose &quot;strings&quot; is because I meant this file as plain storage for multiline strings. I don&apos;t care whether they are templates or what.
&gt; 
&gt; Multiline string is the only thing you cannot take with you into type-safe language if you ever want to.

Ok, that makes sense.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>838335</commentid>
    <comment_count>8</comment_count>
      <attachid>189164</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-02-21 04:39:31 -0800</bug_when>
    <thetext>Comment on attachment 189164
Patch

Clearing flags on attachment: 189164

Committed r143586: &lt;http://trac.webkit.org/changeset/143586&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>838336</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-02-21 04:39:34 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>188951</attachid>
            <date>2013-02-18 15:24:12 -0800</date>
            <delta_ts>2013-02-19 14:28:43 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-110159-20130219032034.patch</filename>
            <type>text/plain</type>
            <size>67375</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQzMDMxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOWJlMTMzNzg4NGI2ZTYy
NGYwY2FmZDNkOTI4YWQ5NzQ3ZWE1Mzc0MC4uZGRiMWM1MTZjNGYzNWMzOTc2ZGIzNzAyZmI3Mjc5
YTJjZDYxMTViMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM1IEBACisyMDEzLTAyLTE4ICBQZXRl
ciBSeWJpbiAgPHByeWJpbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgV2ViIEluc3BlY3Rvcjog
dGFrZSBsYXJnZSBzdHJpbmdzIG91dCBvZiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5CisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTAxNTkKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBQeXRob24gc2NyaXB0
IGlzIHJlZmFjdG9yZWQuCisKKyAgICAgICAgKiBpbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3Bl
Y3Rvci5weToKKyAgICAgICAgKiBpbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmlu
Z3MucHk6IEFkZGVkLgorICAgICAgICAoSW5zcGVjdG9yRnJvbnRlbmRfaCk6CisgICAgICAgIChJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwpOgorICAgICAgICAoSW5zcGVjdG9yQXJyYXkpOgorICAg
ICAgICAoSW5zcGVjdG9yT2JqZWN0KToKKyAgICAgICAgKFN0cmluZyk6CisgICAgICAgIChJbnNw
ZWN0b3JGcm9udGVuZCk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcl9oKToK
KyAgICAgICAgKEluc3BlY3RvckFnZW50KToKKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVySW1wbCk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcik6CisgICAg
ICAgIChDYWxsYmFja0Jhc2UpOgorICAgICAgICAodm9pZCk6CisgICAgICAgIChIYXNoTWFwKToK
KyAgICAgICAgKE9wdE91dHB1dCk6CisgICAgICAgIChFeGFjdGx5SW50KToKKyAgICAgICAgKFJ1
bnRpbWVDYXN0SGVscGVyKToKKyAgICAgICAgKHByb3ZpZGVzKToKKyAgICAgICAgKHR5cGVuYW1l
KToKKyAgICAgICAgKEFycmF5KToKKyAgICAgICAgKEJ1aWxkZXIpOgorCiAyMDEzLTAyLTE1ICBB
bmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBsZS5jb20+CiAKICAgICAgICAgUmVtb3ZlIGNv
bnN0IGZyb20gYSBidW5jaCBvZiBTdG9yYWdlQXJlYSBtZW1iZXIgZnVuY3Rpb25zCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5weSBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5CmluZGV4
IDYyOWZhMDM5MGVjODEzNTBlOTgwMzU0ODA5MDQ0MWZkY2Q1ZjRlNGEuLmE0MGE1NzU3M2FhNWE0
ZmRmYjRiNGQ1MGY1ZmMwOTZhNjg0ODc3MWUgMTAwNzU1Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2lu
c3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5CisrKyBiL1NvdXJjZS9XZWJDb3JlL2lu
c3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5CkBAIC0zNyw2ICszNyw4IEBAIHRyeToK
IGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBpbXBvcnQgc2ltcGxlanNvbiBhcyBqc29uCiAKK2lt
cG9ydCBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yU3RyaW5ncworCiAKIERPTUFJTl9ERUZJTkVfTkFN
RV9NQVAgPSB7CiAgICAgIkRhdGFiYXNlIjogIlNRTF9EQVRBQkFTRSIsCkBAIC0xMTgzLDI4ICsx
MTg1LDggQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ZpZWxk
c19zZXRfdmFsdWUgPSAiMCIKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0
ZXIubmV3bGluZV9tdWx0aWxpbmUoCi0iIiIgICAgICAgIEFsbEZpZWxkc1NldCA9ICVzCi0gICAg
fTsKLQotICAgIHRlbXBsYXRlPGludCBTVEFURT4KLSAgICBjbGFzcyBCdWlsZGVyIHsKLSAgICBw
cml2YXRlOgotICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKLQotICAg
ICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUo
KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRl
cjxTVEFURSB8IFNURVA+Kj4odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBCdWlsZGVyKFBh
c3NSZWZQdHI8LyolcyovSW5zcGVjdG9yT2JqZWN0PiBwdHIpCi0gICAgICAgIHsKLSAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRf
aW5fbm9uX2luaXRfc3RhdGUpOwotICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7Ci0gICAgICAg
IH0KLSAgICAgICAgZnJpZW5kIGNsYXNzICVzOwotICAgIHB1YmxpYzoKLSIiIiAlIChhbGxfZmll
bGRzX3NldF92YWx1ZSwgY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lX211bHRpbGluZShDb2RlR2VuZXJhdG9ySW5z
cGVjdG9yU3RyaW5ncy5jbGFzc19iaW5kaW5nX2J1aWxkZXJfcGFydF8xCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChhbGxfZmllbGRz
X3NldF92YWx1ZSwgY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkpCiAKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcG9zID0gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm
b3IgcHJvcF9kYXRhIGluIHJlc29sdmVfZGF0YS5tYWluX3Byb3BlcnRpZXM6CkBAIC0xMjEzLDQw
ICsxMTk1LDE5IEBAIGNsYXNzIFR5cGVCaW5kaW5nczoKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHBhcmFtX3R5cGVfYmluZGluZyA9IHByb3BfZGF0YS5wYXJhbV90eXBlX2Jp
bmRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3Jhd190eXBl
ID0gcGFyYW1fdHlwZV9iaW5kaW5nLnJlZHVjZV90b19yYXdfdHlwZSgpCiAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lX211bHRpbGluZSgiIiIKLSAg
ICAgICAgQnVpbGRlcjxTVEFURSB8ICVzPiYgc2V0JXMoJXMgdmFsdWUpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiAlcyksIHByb3BlcnR5XyVzX2FscmVh
ZHlfc2V0KTsKLSAgICAgICAgICAgIG1fcmVzdWx0LT5zZXQlcygiJXMiLCAlcyk7Ci0gICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPCVzPigpOwotICAgICAgICB9Ci0iIiIKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICUgKHN0YXRlX2VudW1faXRlbXNbcG9zXSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcGl0YWxpemVyLmxvd2VyX2NhbWVs
X2Nhc2VfdG9fdXBwZXIocHJvcF9uYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHBhcmFtX3R5cGVfYmluZGluZy5nZXRfdHlwZV9tb2RlbCgpLmdldF9pbnB1dF9w
YXJhbV90eXBlX3RleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRlX2VudW1faXRlbXNbcG9zXSwgcHJvcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcGFyYW1fcmF3X3R5cGUuZ2V0X3NldHRlcl9uYW1lKCksIHByb3Bf
bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zZXR0
ZXJfdmFsdWVfZXhwcmVzc2lvbihwYXJhbV90eXBlX2JpbmRpbmcsICJ2YWx1ZSIpLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfZW51bV9pdGVtc1twb3NdKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lX211bHRp
bGluZShDb2RlR2VuZXJhdG9ySW5zcGVjdG9yU3RyaW5ncy5jbGFzc19iaW5kaW5nX2J1aWxkZXJf
cGFydF8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc3RhdGVf
ZW51bV9pdGVtc1twb3NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIENhcGl0YWxpemVyLmxvd2VyX2NhbWVsX2Nhc2VfdG9fdXBwZXIocHJvcF9uYW1lKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV90eXBlX2JpbmRp
bmcuZ2V0X3R5cGVfbW9kZWwoKS5nZXRfaW5wdXRfcGFyYW1fdHlwZV90ZXh0KCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfZW51bV9pdGVtc1twb3Nd
LCBwcm9wX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cGFyYW1fcmF3X3R5cGUuZ2V0X3NldHRlcl9uYW1lKCksIHByb3BfbmFtZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc2V0dGVyX3ZhbHVlX2V4cHJl
c3Npb24ocGFyYW1fdHlwZV9iaW5kaW5nLCAidmFsdWUiKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9lbnVtX2l0ZW1zW3Bvc10pKQogCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMQogCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lX211bHRpbGluZSgiIiIKLSAgICAgICAgb3Bl
cmF0b3IgUmVmUHRyPCVzPiYgKCkKLSAgICAgICAgewotICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKLSAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZiglcykgPT0gc2l6ZW9mKEluc3BlY3Rvck9iamVjdCks
IGNhbm5vdF9jYXN0KTsKLSAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8JXM+Kj4oJm1fcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhc3NSZWZQdHI8JXM+
IHJlbGVhc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUmVmUHRyPCVzPigqdGhp
cykucmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotIiIiCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICUgKGNsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNs
YXNzX25hbWUsIGNsYXNzX25hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3
cml0ZXIubmV3bGluZV9tdWx0aWxpbmUoQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MuY2xh
c3NfYmluZGluZ19idWlsZGVyX3BhcnRfMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSwgY2xh
c3NfbmFtZSwgY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkpCiAKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICAvKlxuIikKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0
b3I6XG4iKQpAQCAtMTI1NSwxMiArMTIxNiw3IEBAIGNsYXNzIFR5cGVCaW5kaW5nczoKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmRfbXVsdGlsaW5lKCJc
biAgICAgKiAgICAgLnNldCVzKC4uLikiICUgQ2FwaXRhbGl6ZXIubG93ZXJfY2FtZWxfY2FzZV90
b191cHBlcihwcm9wX2RhdGEucFsibmFtZSJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd3JpdGVyLmFwcGVuZF9tdWx0aWxpbmUoIjtcbiAgICAgKi9cbiIpCiAKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmVfbXVsdGlsaW5lKAotIiIiICAg
IHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCkpOwotICAg
IH0KLSIiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmVf
bXVsdGlsaW5lKENvZGVHZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdzLmNsYXNzX2JpbmRpbmdfYnVp
bGRlcl9wYXJ0XzQpCiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5l
d2xpbmUoIiAgICB0eXBlZGVmIFR5cGVCdWlsZGVyOjpTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFp
dHM7XG4iKQogCkBAIC0xNzUwLDg3NiArMTcwNiwyMSBAQCBjbGFzcyBUZW1wbGF0ZXM6CiAvLyBm
b3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogIiIiKQogCisgICAgZnJvbnRlbmRfZG9tYWluX2Ns
YXNzID0gc3RyaW5nLlRlbXBsYXRlKENvZGVHZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdzLmZyb250
ZW5kX2RvbWFpbl9jbGFzcykKKyAgICBiYWNrZW5kX21ldGhvZCA9IHN0cmluZy5UZW1wbGF0ZShD
b2RlR2VuZXJhdG9ySW5zcGVjdG9yU3RyaW5ncy5iYWNrZW5kX21ldGhvZCkKKyAgICBmcm9udGVu
ZF9tZXRob2QgPSBzdHJpbmcuVGVtcGxhdGUoQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3Mu
ZnJvbnRlbmRfbWV0aG9kKQorICAgIGNhbGxiYWNrX21ldGhvZCA9IHN0cmluZy5UZW1wbGF0ZShD
b2RlR2VuZXJhdG9ySW5zcGVjdG9yU3RyaW5ncy5jYWxsYmFja19tZXRob2QpCisgICAgZnJvbnRl
bmRfaCA9IHN0cmluZy5UZW1wbGF0ZShmaWxlX2hlYWRlcl8gKyBDb2RlR2VuZXJhdG9ySW5zcGVj
dG9yU3RyaW5ncy5mcm9udGVuZF9oKQorICAgIGJhY2tlbmRfaCA9IHN0cmluZy5UZW1wbGF0ZShm
aWxlX2hlYWRlcl8gKyBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yU3RyaW5ncy5iYWNrZW5kX2gpCisg
ICAgYmFja2VuZF9jcHAgPSBzdHJpbmcuVGVtcGxhdGUoZmlsZV9oZWFkZXJfICsgQ29kZUdlbmVy
YXRvckluc3BlY3RvclN0cmluZ3MuYmFja2VuZF9jcHApCisgICAgZnJvbnRlbmRfY3BwID0gc3Ry
aW5nLlRlbXBsYXRlKGZpbGVfaGVhZGVyXyArIENvZGVHZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdz
LmZyb250ZW5kX2NwcCkKKyAgICB0eXBlYnVpbGRlcl9oID0gc3RyaW5nLlRlbXBsYXRlKGZpbGVf
aGVhZGVyXyArIENvZGVHZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdzLnR5cGVidWlsZGVyX2gpCisg
ICAgdHlwZWJ1aWxkZXJfY3BwID0gc3RyaW5nLlRlbXBsYXRlKGZpbGVfaGVhZGVyXyArIENvZGVH
ZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdzLnR5cGVidWlsZGVyX2NwcCkKKyAgICBiYWNrZW5kX2pz
ID0gc3RyaW5nLlRlbXBsYXRlKGZpbGVfaGVhZGVyXyArIENvZGVHZW5lcmF0b3JJbnNwZWN0b3JT
dHJpbmdzLmJhY2tlbmRfanMpCisgICAgcGFyYW1fY29udGFpbmVyX2FjY2Vzc19jb2RlID0gQ29k
ZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MucGFyYW1fY29udGFpbmVyX2FjY2Vzc19jb2RlCiAK
IAotICAgIGZyb250ZW5kX2RvbWFpbl9jbGFzcyA9IHN0cmluZy5UZW1wbGF0ZSgKLSIiIiAgICBj
bGFzcyAkZG9tYWluQ2xhc3NOYW1lIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgICRkb21haW5DbGFz
c05hbWUoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
IDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7
IH0KLSR7ZnJvbnRlbmREb21haW5NZXRob2REZWNsYXJhdGlvbnN9ICAgICAgICB2b2lkIHNldElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQotICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdl
dEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsOyB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKLSAgICB9OwotCi0gICAgJGRvbWFpbkNsYXNz
TmFtZSogJGRvbWFpbkZpZWxkTmFtZSgpIHsgcmV0dXJuICZtXyRkb21haW5GaWVsZE5hbWU7IH0K
LQotIiIiKQotCi0gICAgYmFja2VuZF9tZXRob2QgPSBzdHJpbmcuVGVtcGxhdGUoCi0iIiJ2b2lk
IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6JHtkb21haW5OYW1lfV8kbWV0aG9kTmFt
ZShsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiRyZXF1ZXN0TWVzc2FnZU9iamVjdCkKLXsK
LSAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzID0gSW5zcGVjdG9yQXJy
YXk6OmNyZWF0ZSgpOwotCi0gICAgaWYgKCEkYWdlbnRGaWVsZCkKLSAgICAgICAgcHJvdG9jb2xF
cnJvcnMtPnB1c2hTdHJpbmcoIiR7ZG9tYWluTmFtZX0gaGFuZGxlciBpcyBub3QgYXZhaWxhYmxl
LiIpOwotJG1ldGhvZE91dENvZGUKLSRtZXRob2RJbkNvZGUKLSAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiByZXN1bHQgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwotICAgIEVycm9yU3Ry
aW5nIGVycm9yOwotICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSB7Ci0gICAgICAg
ICRhZ2VudEZpZWxkLT4kbWV0aG9kTmFtZSgmZXJyb3IkYWdlbnRDYWxsUGFyYW1zKTsKLQotJHty
ZXNwb25zZUNvb2t9Ci0gICAgfQotICAgIHNlbmRSZXNwb25zZShjYWxsSWQsIHJlc3VsdCwgY29t
bWFuZE5hbWVzWyRjb21tYW5kTmFtZUluZGV4XSwgcHJvdG9jb2xFcnJvcnMsIGVycm9yKTsKLX0K
LSIiIikKLQotICAgIGZyb250ZW5kX21ldGhvZCA9IHN0cmluZy5UZW1wbGF0ZSgiIiJ2b2lkIElu
c3BlY3RvckZyb250ZW5kOjokZG9tYWluTmFtZTo6JGV2ZW50TmFtZSgkcGFyYW1ldGVycykKLXsK
LSAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBqc29uTWVzc2FnZSA9IEluc3BlY3Rvck9iamVj
dDo6Y3JlYXRlKCk7Ci0gICAganNvbk1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIiRkb21h
aW5OYW1lLiRldmVudE5hbWUiKTsKLSRjb2RlICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkKLSAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9G
cm9udGVuZChqc29uTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwotfQotIiIiKQotCi0gICAgY2Fs
bGJhY2tfbWV0aG9kID0gc3RyaW5nLlRlbXBsYXRlKAotIiIiSW5zcGVjdG9yQmFja2VuZERpc3Bh
dGNoZXI6OiRhZ2VudE5hbWU6OiRjYWxsYmFja05hbWU6OiRjYWxsYmFja05hbWUoUGFzc1JlZlB0
cjxJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw+IGJhY2tlbmRJbXBsLCBpbnQgaWQpIDog
Q2FsbGJhY2tCYXNlKGJhY2tlbmRJbXBsLCBpZCkge30KLQotdm9pZCBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlcjo6JGFnZW50TmFtZTo6JGNhbGxiYWNrTmFtZTo6c2VuZFN1Y2Nlc3MoJHBhcmFt
ZXRlcnMpCi17Ci0gICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4ganNvbk1lc3NhZ2UgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwotJGNvZGUgICAgc2VuZElmQWN0aXZlKGpzb25NZXNzYWdl
LCBFcnJvclN0cmluZygpKTsKLX0KLSIiIikKLQotICAgIGZyb250ZW5kX2ggPSBzdHJpbmcuVGVt
cGxhdGUoZmlsZV9oZWFkZXJfICsKLSIiIiNpZm5kZWYgSW5zcGVjdG9yRnJvbnRlbmRfaAotI2Rl
ZmluZSBJbnNwZWN0b3JGcm9udGVuZF9oCi0KLSNpbmNsdWRlICJJbnNwZWN0b3JUeXBlQnVpbGRl
ci5oIgotI2luY2x1ZGUgIkluc3BlY3RvclZhbHVlcy5oIgotI2luY2x1ZGUgPHd0Zi9QYXNzUmVm
UHRyLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBXZWJD
b3JlIHsKLQotY2xhc3MgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwotCi0vLyBCb3RoIEluc3Bl
Y3Rvck9iamVjdCBhbmQgSW5zcGVjdG9yQXJyYXkgbWF5IG9yIG1heSBub3QgYmUgZGVjbGFyZWQg
YXQgdGhpcyBwb2ludCBhcyBkZWZpbmVkIGJ5IEVOQUJMRURfSU5TUEVDVE9SLgotLy8gRG91Ymxl
LWNoZWNrIHdlIGhhdmUgdGhlbSBhdCBsZWFzdCBhcyBmb3J3YXJkIGRlY2xhcmF0aW9uLgotY2xh
c3MgSW5zcGVjdG9yQXJyYXk7Ci1jbGFzcyBJbnNwZWN0b3JPYmplY3Q7Ci0KLXR5cGVkZWYgU3Ry
aW5nIEVycm9yU3RyaW5nOwotCi0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLQotY2xhc3MgSW5zcGVj
dG9yRnJvbnRlbmQgewotcHVibGljOgotICAgIEluc3BlY3RvckZyb250ZW5kKEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCopOwotCi0KLSRkb21haW5DbGFzc0xpc3QKLXByaXZhdGU6Ci0ke2ZpZWxk
RGVjbGFyYXRpb25zfX07Ci0KLSNlbmRpZiAvLyBFTkFCTEUoSU5TUEVDVE9SKQotCi19IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCi0jZW5kaWYgLy8gIWRlZmluZWQoSW5zcGVjdG9yRnJvbnRlbmRfaCkK
LSIiIikKLQotICAgIGJhY2tlbmRfaCA9IHN0cmluZy5UZW1wbGF0ZShmaWxlX2hlYWRlcl8gKwot
IiIiI2lmbmRlZiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcl9oCi0jZGVmaW5lIEluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyX2gKLQotI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+Ci0jaW5j
bHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4K
LSNpbmNsdWRlICJJbnNwZWN0b3JUeXBlQnVpbGRlci5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7
Ci0KLWNsYXNzIEluc3BlY3RvckFnZW50OwotY2xhc3MgSW5zcGVjdG9yT2JqZWN0OwotY2xhc3Mg
SW5zcGVjdG9yQXJyYXk7Ci1jbGFzcyBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7Ci0KLXR5cGVk
ZWYgU3RyaW5nIEVycm9yU3RyaW5nOwotCi1jbGFzcyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
ckltcGw7Ci0KLWNsYXNzIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOiBwdWJsaWMgUmVmQ291
bnRlZDxJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcj4gewotcHVibGljOgotICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyPiBjcmVhdGUoSW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpOwotICAgIHZpcnR1YWwgfklu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVyKCkgeyB9Ci0KLSAgICBjbGFzcyBDYWxsYmFja0Jhc2U6
IHB1YmxpYyBSZWZDb3VudGVkPENhbGxiYWNrQmFzZT4gewotICAgIHB1YmxpYzoKLSAgICAgICAg
Q2FsbGJhY2tCYXNlKFBhc3NSZWZQdHI8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsPiBi
YWNrZW5kSW1wbCwgaW50IGlkKTsKLSAgICAgICAgdmlydHVhbCB+Q2FsbGJhY2tCYXNlKCk7Ci0g
ICAgICAgIHZvaWQgc2VuZEZhaWx1cmUoY29uc3QgRXJyb3JTdHJpbmcmKTsKLSAgICAgICAgYm9v
bCBpc0FjdGl2ZSgpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2b2lkIHNlbmRJZkFjdGl2
ZShQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFydGlhbE1lc3NhZ2UsIGNvbnN0IEVycm9y
U3RyaW5nJiBpbnZvY2F0aW9uRXJyb3IpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdm9pZCBk
aXNhYmxlKCkgeyBtX2FscmVhZHlTZW50ID0gdHJ1ZTsgfQotCi0gICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw+IG1fYmFja2VuZEltcGw7Ci0gICAgICAgIGludCBt
X2lkOwotICAgICAgICBib29sIG1fYWxyZWFkeVNlbnQ7Ci0KLSAgICAgICAgZnJpZW5kIGNsYXNz
IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDsKLSAgICB9OwotCi0kYWdlbnRJbnRlcmZh
Y2VzCi0kdmlydHVhbFNldHRlcnMKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckZyb250ZW5kKCkg
PSAwOwotCi0gICAgZW51bSBDb21tb25FcnJvckNvZGUgewotICAgICAgICBQYXJzZUVycm9yID0g
MCwKLSAgICAgICAgSW52YWxpZFJlcXVlc3QsCi0gICAgICAgIE1ldGhvZE5vdEZvdW5kLAotICAg
ICAgICBJbnZhbGlkUGFyYW1zLAotICAgICAgICBJbnRlcm5hbEVycm9yLAotICAgICAgICBTZXJ2
ZXJFcnJvciwKLSAgICAgICAgTGFzdEVudHJ5LAotICAgIH07Ci0KLSAgICB2b2lkIHJlcG9ydFBy
b3RvY29sRXJyb3IoY29uc3QgbG9uZyogY29uc3QgY2FsbElkLCBDb21tb25FcnJvckNvZGUsIGNv
bnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVwb3J0
UHJvdG9jb2xFcnJvcihjb25zdCBsb25nKiBjb25zdCBjYWxsSWQsIENvbW1vbkVycm9yQ29kZSwg
Y29uc3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UsIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGRh
dGEpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2goY29uc3QgU3RyaW5nJiBt
ZXNzYWdlKSA9IDA7Ci0gICAgc3RhdGljIGJvb2wgZ2V0Q29tbWFuZE5hbWUoY29uc3QgU3RyaW5n
JiBtZXNzYWdlLCBTdHJpbmcqIHJlc3VsdCk7Ci0KLSAgICBlbnVtIE1ldGhvZE5hbWVzIHsKLSRt
ZXRob2ROYW1lc0VudW1Db250ZW50Ci0KLSAgICAgICAga01ldGhvZE5hbWVzRW51bVNpemUKLSAg
ICB9OwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbW1hbmROYW1lc1tdOwotfTsKLQotfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQotI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvckJhY2tlbmRE
aXNwYXRjaGVyX2gpCi0KLQotIiIiKQotCi0gICAgYmFja2VuZF9jcHAgPSBzdHJpbmcuVGVtcGxh
dGUoZmlsZV9oZWFkZXJfICsKLSIiIgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZiBFTkFC
TEUoSU5TUEVDVE9SKQotCi0jaW5jbHVkZSAiSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXIuaCIK
LSNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3Ry
aW5nLmg+Ci0KLSNpbmNsdWRlICJJbnNwZWN0b3JBZ2VudC5oIgotI2luY2x1ZGUgIkluc3BlY3Rv
clZhbHVlcy5oIgotI2luY2x1ZGUgIkluc3BlY3RvckZyb250ZW5kQ2hhbm5lbC5oIgotI2luY2x1
ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNvbnN0
IGNoYXIqIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpjb21tYW5kTmFtZXNbXSA9IHsKLSRt
ZXRob2ROYW1lRGVjbGFyYXRpb25zCi19OwotCi0KLWNsYXNzIEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVySW1wbCA6IHB1YmxpYyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlciB7Ci1wdWJsaWM6
Ci0gICAgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsKEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQotICAgICAgICA6IG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKLSRjb25zdHJ1Y3RvckluaXQK
LSAgICB7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckZyb250ZW5kKCkgeyBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCA9IDA7IH0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2goY29uc3Qg
U3RyaW5nJiBtZXNzYWdlKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVwb3J0UHJvdG9jb2xFcnJvcihj
b25zdCBsb25nKiBjb25zdCBjYWxsSWQsIENvbW1vbkVycm9yQ29kZSwgY29uc3QgU3RyaW5nJiBl
cnJvck1lc3NhZ2UsIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGRhdGEpIGNvbnN0OwotICAg
IHVzaW5nIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZXBvcnRQcm90b2NvbEVycm9yOwot
Ci0gICAgdm9pZCBzZW5kUmVzcG9uc2UobG9uZyBjYWxsSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiByZXN1bHQsIGNvbnN0IEVycm9yU3RyaW5nJiBpbnZvY2F0aW9uRXJyb3IpOwotICAg
IGJvb2wgaXNBY3RpdmUoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQot
Ci0kc2V0dGVycwotcHJpdmF0ZToKLSRtZXRob2REZWNsYXJhdGlvbnMKLQotICAgIEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7Ci0kZmllbGREZWNs
YXJhdGlvbnMKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFYsIHR5cGVuYW1l
IFYwPgotICAgIHN0YXRpYyBSIGdldFByb3BlcnR5VmFsdWVJbXBsKEluc3BlY3Rvck9iamVjdCog
b2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFy
cmF5KiBwcm90b2NvbEVycm9ycywgVjAgaW5pdGlhbF92YWx1ZSwgYm9vbCAoKmFzX21ldGhvZCko
SW5zcGVjdG9yVmFsdWUqLCBWKiksIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSk7Ci0KLSAgICBzdGF0
aWMgaW50IGdldEludChJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1l
LCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpOwotICAg
IHN0YXRpYyBkb3VibGUgZ2V0RG91YmxlKEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBT
dHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVy
cm9ycyk7Ci0gICAgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoSW5zcGVjdG9yT2JqZWN0KiBvYmpl
Y3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkq
IHByb3RvY29sRXJyb3JzKTsKLSAgICBzdGF0aWMgYm9vbCBnZXRCb29sZWFuKEluc3BlY3Rvck9i
amVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3Bl
Y3RvckFycmF5KiBwcm90b2NvbEVycm9ycyk7Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBnZXRPYmplY3QoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmlu
ZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3Jz
KTsKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gZ2V0QXJyYXkoSW5zcGVj
dG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwg
SW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKTsKLQotICAgIHZvaWQgc2VuZFJlc3BvbnNl
KGxvbmcgY2FsbElkLCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzdWx0LCBjb25zdCBj
aGFyKiBjb21tYW5kTmFtZSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJv
cnMsIEVycm9yU3RyaW5nIGludm9jYXRpb25FcnJvcik7Ci0KLX07Ci0KLSRtZXRob2RzCi0KLVBh
c3NSZWZQdHI8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI+IEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVyOjpjcmVhdGUoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlckltcGwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSk7Ci19Ci0KLQotdm9pZCBJbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw6OmRpc3BhdGNoKGNvbnN0IFN0cmluZyYgbWVzc2Fn
ZSkKLXsKLSAgICBSZWZQdHI8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI+IHByb3RlY3QgPSB0
aGlzOwotICAgIHR5cGVkZWYgdm9pZCAoSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjoq
Q2FsbEhhbmRsZXIpKGxvbmcgY2FsbElkLCBJbnNwZWN0b3JPYmplY3QqIG1lc3NhZ2VPYmplY3Qp
OwotICAgIHR5cGVkZWYgSGFzaE1hcDxTdHJpbmcsIENhbGxIYW5kbGVyPiBEaXNwYXRjaE1hcDsK
LSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERpc3BhdGNoTWFwLCBkaXNwYXRjaE1hcCwgKTsKLSAg
ICBsb25nIGNhbGxJZCA9IDA7Ci0KLSAgICBpZiAoZGlzcGF0Y2hNYXAuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgIHN0YXRpYyBDYWxsSGFuZGxlciBoYW5kbGVyc1tdID0gewotJG1lc3NhZ2VIYW5kbGVy
cwotICAgICAgICB9OwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gV1RGX0FSUkFZX0xFTkdUSChj
b21tYW5kTmFtZXMpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytp
KQotICAgICAgICAgICAgZGlzcGF0Y2hNYXAuYWRkKGNvbW1hbmROYW1lc1tpXSwgaGFuZGxlcnNb
aV0pOwotICAgIH0KLQotICAgIFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gcGFyc2VkTWVzc2FnZSA9
IEluc3BlY3RvclZhbHVlOjpwYXJzZUpTT04obWVzc2FnZSk7Ci0gICAgaWYgKCFwYXJzZWRNZXNz
YWdlKSB7Ci0gICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoMCwgUGFyc2VFcnJvciwgIk1lc3Nh
Z2UgbXVzdCBiZSBpbiBKU09OIGZvcm1hdCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbWVzc2FnZU9iamVjdCA9IHBhcnNlZE1lc3NhZ2Ut
PmFzT2JqZWN0KCk7Ci0gICAgaWYgKCFtZXNzYWdlT2JqZWN0KSB7Ci0gICAgICAgIHJlcG9ydFBy
b3RvY29sRXJyb3IoMCwgSW52YWxpZFJlcXVlc3QsICJNZXNzYWdlIG11c3QgYmUgYSBKU09OaWZp
ZWQgb2JqZWN0Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBSZWZQdHI8SW5zcGVj
dG9yVmFsdWU+IGNhbGxJZFZhbHVlID0gbWVzc2FnZU9iamVjdC0+Z2V0KCJpZCIpOwotICAgIGlm
ICghY2FsbElkVmFsdWUpIHsKLSAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcigwLCBJbnZhbGlk
UmVxdWVzdCwgIidpZCcgcHJvcGVydHkgd2FzIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgaWYgKCFjYWxsSWRWYWx1ZS0+YXNOdW1iZXIoJmNhbGxJZCkpIHsKLSAg
ICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcigwLCBJbnZhbGlkUmVxdWVzdCwgIlRoZSB0eXBlIG9m
ICdpZCcgcHJvcGVydHkgbXVzdCBiZSBudW1iZXIiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gbWV0aG9kVmFsdWUgPSBtZXNzYWdlT2JqZWN0
LT5nZXQoIm1ldGhvZCIpOwotICAgIGlmICghbWV0aG9kVmFsdWUpIHsKLSAgICAgICAgcmVwb3J0
UHJvdG9jb2xFcnJvcigmY2FsbElkLCBJbnZhbGlkUmVxdWVzdCwgIidtZXRob2QnIHByb3BlcnR5
IHdhc24ndCBmb3VuZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU3RyaW5nIG1l
dGhvZDsKLSAgICBpZiAoIW1ldGhvZFZhbHVlLT5hc1N0cmluZygmbWV0aG9kKSkgewotICAgICAg
ICByZXBvcnRQcm90b2NvbEVycm9yKCZjYWxsSWQsIEludmFsaWRSZXF1ZXN0LCAiVGhlIHR5cGUg
b2YgJ21ldGhvZCcgcHJvcGVydHkgbXVzdCBiZSBzdHJpbmciKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIEhhc2hNYXA8U3RyaW5nLCBDYWxsSGFuZGxlcj46Oml0ZXJhdG9yIGl0ID0g
ZGlzcGF0Y2hNYXAuZmluZChtZXRob2QpOwotICAgIGlmIChpdCA9PSBkaXNwYXRjaE1hcC5lbmQo
KSkgewotICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKCZjYWxsSWQsIE1ldGhvZE5vdEZvdW5k
LCAiJyIgKyBtZXRob2QgKyAiJyB3YXNuJ3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgICgoKnRoaXMpLippdC0+dmFsdWUpKGNhbGxJZCwgbWVzc2FnZU9iamVjdC5nZXQo
KSk7Ci19Ci0KLXZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpzZW5kUmVzcG9u
c2UobG9uZyBjYWxsSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXN1bHQsIGNvbnN0
IGNoYXIqIGNvbW1hbmROYW1lLCBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2NvbEVy
cm9ycywgRXJyb3JTdHJpbmcgaW52b2NhdGlvbkVycm9yKQotewotICAgIGlmIChwcm90b2NvbEVy
cm9ycy0+bGVuZ3RoKCkpIHsKLSAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFN0cmluZzo6
Zm9ybWF0KCJTb21lIGFyZ3VtZW50cyBvZiBtZXRob2QgJyVzJyBjYW4ndCBiZSBwcm9jZXNzZWQi
LCBjb21tYW5kTmFtZSk7Ci0gICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoJmNhbGxJZCwgSW52
YWxpZFBhcmFtcywgZXJyb3JNZXNzYWdlLCBwcm90b2NvbEVycm9ycyk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgc2VuZFJlc3BvbnNlKGNhbGxJZCwgcmVzdWx0LCBpbnZvY2F0aW9uRXJy
b3IpOwotfQotCi12b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6c2VuZFJlc3Bv
bnNlKGxvbmcgY2FsbElkLCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzdWx0LCBjb25z
dCBFcnJvclN0cmluZyYgaW52b2NhdGlvbkVycm9yKQotewotICAgIGlmIChpbnZvY2F0aW9uRXJy
b3IubGVuZ3RoKCkpIHsKLSAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcigmY2FsbElkLCBTZXJ2
ZXJFcnJvciwgaW52b2NhdGlvbkVycm9yKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVj
dDo6Y3JlYXRlKCk7Ci0gICAgcmVzcG9uc2VNZXNzYWdlLT5zZXRPYmplY3QoInJlc3VsdCIsIHJl
c3VsdCk7Ci0gICAgcmVzcG9uc2VNZXNzYWdlLT5zZXROdW1iZXIoImlkIiwgY2FsbElkKTsKLSAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCi0gICAgICAgIG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VNZXNzYWdlLT50b0pT
T05TdHJpbmcoKSk7Ci19Ci0KLXZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJlcG9y
dFByb3RvY29sRXJyb3IoY29uc3QgbG9uZyogY29uc3QgY2FsbElkLCBDb21tb25FcnJvckNvZGUg
Y29kZSwgY29uc3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UpIGNvbnN0Ci17Ci0gICAgcmVwb3J0UHJv
dG9jb2xFcnJvcihjYWxsSWQsIGNvZGUsIGVycm9yTWVzc2FnZSwgMCk7Ci19Ci0KLXZvaWQgSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpyZXBvcnRQcm90b2NvbEVycm9yKGNvbnN0IGxv
bmcqIGNvbnN0IGNhbGxJZCwgQ29tbW9uRXJyb3JDb2RlIGNvZGUsIGNvbnN0IFN0cmluZyYgZXJy
b3JNZXNzYWdlLCBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBkYXRhKSBjb25zdAotewotICAg
IERFRklORV9TVEFUSUNfTE9DQUwoVmVjdG9yPGludD4sc19jb21tb25FcnJvcnMsKTsKLSAgICBp
ZiAoIXNfY29tbW9uRXJyb3JzLnNpemUoKSkgewotICAgICAgICBzX2NvbW1vbkVycm9ycy5pbnNl
cnQoUGFyc2VFcnJvciwgLTMyNzAwKTsKLSAgICAgICAgc19jb21tb25FcnJvcnMuaW5zZXJ0KElu
dmFsaWRSZXF1ZXN0LCAtMzI2MDApOwotICAgICAgICBzX2NvbW1vbkVycm9ycy5pbnNlcnQoTWV0
aG9kTm90Rm91bmQsIC0zMjYwMSk7Ci0gICAgICAgIHNfY29tbW9uRXJyb3JzLmluc2VydChJbnZh
bGlkUGFyYW1zLCAtMzI2MDIpOwotICAgICAgICBzX2NvbW1vbkVycm9ycy5pbnNlcnQoSW50ZXJu
YWxFcnJvciwgLTMyNjAzKTsKLSAgICAgICAgc19jb21tb25FcnJvcnMuaW5zZXJ0KFNlcnZlckVy
cm9yLCAtMzIwMDApOwotICAgIH0KLSAgICBBU1NFUlQoY29kZSA+PTApOwotICAgIEFTU0VSVCgo
dW5zaWduZWQpY29kZSA8IHNfY29tbW9uRXJyb3JzLnNpemUoKSk7Ci0gICAgQVNTRVJUKHNfY29t
bW9uRXJyb3JzW2NvZGVdKTsKLSAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBlcnJvciA9IElu
c3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7Ci0gICAgZXJyb3ItPnNldE51bWJlcigiY29kZSIsIHNf
Y29tbW9uRXJyb3JzW2NvZGVdKTsKLSAgICBlcnJvci0+c2V0U3RyaW5nKCJtZXNzYWdlIiwgZXJy
b3JNZXNzYWdlKTsKLSAgICBBU1NFUlQoZXJyb3IpOwotICAgIGlmIChkYXRhKQotICAgICAgICBl
cnJvci0+c2V0QXJyYXkoImRhdGEiLCBkYXRhKTsKLSAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKLSAgICBtZXNzYWdlLT5zZXRP
YmplY3QoImVycm9yIiwgZXJyb3IpOwotICAgIGlmIChjYWxsSWQpCi0gICAgICAgIG1lc3NhZ2Ut
PnNldE51bWJlcigiaWQiLCAqY2FsbElkKTsKLSAgICBlbHNlCi0gICAgICAgIG1lc3NhZ2UtPnNl
dFZhbHVlKCJpZCIsIEluc3BlY3RvclZhbHVlOjpudWxsKCkpOwotICAgIGlmIChtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkKLSAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNl
bmRNZXNzYWdlVG9Gcm9udGVuZChtZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Ci19Ci0KLXRlbXBs
YXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFYsIHR5cGVuYW1lIFYwPgotUiBJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlckltcGw6OmdldFByb3BlcnR5VmFsdWVJbXBsKEluc3BlY3Rvck9iamVjdCog
b2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFy
cmF5KiBwcm90b2NvbEVycm9ycywgVjAgaW5pdGlhbF92YWx1ZSwgYm9vbCAoKmFzX21ldGhvZCko
SW5zcGVjdG9yVmFsdWUqLCBWKiksIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSkKLXsKLSAgICBBU1NF
UlQocHJvdG9jb2xFcnJvcnMpOwotCi0gICAgaWYgKHZhbHVlRm91bmQpCi0gICAgICAgICp2YWx1
ZUZvdW5kID0gZmFsc2U7Ci0KLSAgICBWIHZhbHVlID0gaW5pdGlhbF92YWx1ZTsKLQotICAgIGlm
ICghb2JqZWN0KSB7Ci0gICAgICAgIGlmICghdmFsdWVGb3VuZCkgewotICAgICAgICAgICAgLy8g
UmVxdWlyZWQgcGFyYW1ldGVyIGluIG1pc3NpbmcgcGFyYW1zIGNvbnRhaW5lci4KLSAgICAgICAg
ICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6Zm9ybWF0KCIncGFyYW1zJyBv
YmplY3QgbXVzdCBjb250YWluIHJlcXVpcmVkIHBhcmFtZXRlciAnJXMnIHdpdGggdHlwZSAnJXMn
LiIsIG5hbWUudXRmOCgpLmRhdGEoKSwgdHlwZV9uYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAg
cmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIEluc3BlY3Rvck9iamVjdDo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gb2JqZWN0LT5lbmQoKTsKLSAgICBJbnNwZWN0b3JPYmplY3Q6OmNvbnN0X2l0ZXJh
dG9yIHZhbHVlSXRlcmF0b3IgPSBvYmplY3QtPmZpbmQobmFtZSk7Ci0KLSAgICBpZiAodmFsdWVJ
dGVyYXRvciA9PSBlbmQpIHsKLSAgICAgICAgaWYgKCF2YWx1ZUZvdW5kKQotICAgICAgICAgICAg
cHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQoIlBhcmFtZXRlciAnJXMn
IHdpdGggdHlwZSAnJXMnIHdhcyBub3QgZm91bmQuIiwgbmFtZS51dGY4KCkuZGF0YSgpLCB0eXBl
X25hbWUpKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIGlmICghYXNfbWV0
aG9kKHZhbHVlSXRlcmF0b3ItPnZhbHVlLmdldCgpLCAmdmFsdWUpKQotICAgICAgICBwcm90b2Nv
bEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZvcm1hdCgiUGFyYW1ldGVyICclcycgaGFzIHdy
b25nIHR5cGUuIEl0IG11c3QgYmUgJyVzJy4iLCBuYW1lLnV0ZjgoKS5kYXRhKCksIHR5cGVfbmFt
ZSkpOwotICAgIGVsc2UKLSAgICAgICAgaWYgKHZhbHVlRm91bmQpCi0gICAgICAgICAgICAqdmFs
dWVGb3VuZCA9IHRydWU7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1zdHJ1Y3QgQXNNZXRob2RC
cmlkZ2VzIHsKLSAgICBzdGF0aWMgYm9vbCBhc0ludChJbnNwZWN0b3JWYWx1ZSogdmFsdWUsIGlu
dCogb3V0cHV0KSB7IHJldHVybiB2YWx1ZS0+YXNOdW1iZXIob3V0cHV0KTsgfQotICAgIHN0YXRp
YyBib29sIGFzRG91YmxlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSwgZG91YmxlKiBvdXRwdXQpIHsg
cmV0dXJuIHZhbHVlLT5hc051bWJlcihvdXRwdXQpOyB9Ci0gICAgc3RhdGljIGJvb2wgYXNTdHJp
bmcoSW5zcGVjdG9yVmFsdWUqIHZhbHVlLCBTdHJpbmcqIG91dHB1dCkgeyByZXR1cm4gdmFsdWUt
PmFzU3RyaW5nKG91dHB1dCk7IH0KLSAgICBzdGF0aWMgYm9vbCBhc0Jvb2xlYW4oSW5zcGVjdG9y
VmFsdWUqIHZhbHVlLCBib29sKiBvdXRwdXQpIHsgcmV0dXJuIHZhbHVlLT5hc0Jvb2xlYW4ob3V0
cHV0KTsgfQotICAgIHN0YXRpYyBib29sIGFzT2JqZWN0KEluc3BlY3RvclZhbHVlKiB2YWx1ZSwg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4qIG91dHB1dCkgeyByZXR1cm4gdmFsdWUtPmFzT2JqZWN0
KG91dHB1dCk7IH0KLSAgICBzdGF0aWMgYm9vbCBhc0FycmF5KEluc3BlY3RvclZhbHVlKiB2YWx1
ZSwgUmVmUHRyPEluc3BlY3RvckFycmF5Piogb3V0cHV0KSB7IHJldHVybiB2YWx1ZS0+YXNBcnJh
eShvdXRwdXQpOyB9Ci19OwotCi1pbnQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpn
ZXRJbnQoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCog
dmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKQotewotICAgIHJldHVy
biBnZXRQcm9wZXJ0eVZhbHVlSW1wbDxpbnQsIGludCwgaW50PihvYmplY3QsIG5hbWUsIHZhbHVl
Rm91bmQsIHByb3RvY29sRXJyb3JzLCAwLCBBc01ldGhvZEJyaWRnZXM6OmFzSW50LCAiTnVtYmVy
Iik7Ci19Ci0KLWRvdWJsZSBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw6OmdldERvdWJs
ZShJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1
ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpCi17Ci0gICAgcmV0dXJuIGdl
dFByb3BlcnR5VmFsdWVJbXBsPGRvdWJsZSwgZG91YmxlLCBkb3VibGU+KG9iamVjdCwgbmFtZSwg
dmFsdWVGb3VuZCwgcHJvdG9jb2xFcnJvcnMsIDAsIEFzTWV0aG9kQnJpZGdlczo6YXNEb3VibGUs
ICJOdW1iZXIiKTsKLX0KLQotU3RyaW5nIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6
Z2V0U3RyaW5nKEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJv
b2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycykKLXsKLSAgICBy
ZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZUltcGw8U3RyaW5nLCBTdHJpbmcsIFN0cmluZz4ob2JqZWN0
LCBuYW1lLCB2YWx1ZUZvdW5kLCBwcm90b2NvbEVycm9ycywgIiIsIEFzTWV0aG9kQnJpZGdlczo6
YXNTdHJpbmcsICJTdHJpbmciKTsKLX0KLQotYm9vbCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
ckltcGw6OmdldEJvb2xlYW4oSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYg
bmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKQot
ewotICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlSW1wbDxib29sLCBib29sLCBib29sPihvYmpl
Y3QsIG5hbWUsIHZhbHVlRm91bmQsIHByb3RvY29sRXJyb3JzLCBmYWxzZSwgQXNNZXRob2RCcmlk
Z2VzOjphc0Jvb2xlYW4sICJCb29sZWFuIik7Ci19Ci0KLVBhc3NSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw6OmdldE9iamVjdChJbnNwZWN0b3JP
YmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNw
ZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpCi17Ci0gICAgcmV0dXJuIGdldFByb3BlcnR5VmFs
dWVJbXBsPFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiwgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4sIEluc3BlY3Rvck9iamVjdCo+KG9iamVjdCwgbmFtZSwgdmFsdWVGb3VuZCwgcHJvdG9jb2xF
cnJvcnMsIDAsIEFzTWV0aG9kQnJpZGdlczo6YXNPYmplY3QsICJPYmplY3QiKTsKLX0KLQotUGFz
c1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpn
ZXRBcnJheShJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29s
KiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpCi17Ci0gICAgcmV0
dXJuIGdldFByb3BlcnR5VmFsdWVJbXBsPFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+LCBSZWZQ
dHI8SW5zcGVjdG9yQXJyYXk+LCBJbnNwZWN0b3JBcnJheSo+KG9iamVjdCwgbmFtZSwgdmFsdWVG
b3VuZCwgcHJvdG9jb2xFcnJvcnMsIDAsIEFzTWV0aG9kQnJpZGdlczo6YXNBcnJheSwgIkFycmF5
Iik7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmdldENvbW1hbmROYW1l
KGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgU3RyaW5nKiByZXN1bHQpCi17Ci0gICAgUmVmUHRyPElu
c3BlY3RvclZhbHVlPiB2YWx1ZSA9IEluc3BlY3RvclZhbHVlOjpwYXJzZUpTT04obWVzc2FnZSk7
Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gb2JqZWN0ID0gdmFsdWUtPmFzT2JqZWN0KCk7Ci0gICAgaWYgKCFvYmpl
Y3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghb2JqZWN0LT5nZXRTdHJpbmco
Im1ldGhvZCIsIHJlc3VsdCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0
cnVlOwotfQotCi1JbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Q2FsbGJhY2tCYXNlOjpDYWxs
YmFja0Jhc2UoUGFzc1JlZlB0cjxJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw+IGJhY2tl
bmRJbXBsLCBpbnQgaWQpCi0gICAgOiBtX2JhY2tlbmRJbXBsKGJhY2tlbmRJbXBsKSwgbV9pZChp
ZCksIG1fYWxyZWFkeVNlbnQoZmFsc2UpIHt9Ci0KLUluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjpDYWxsYmFja0Jhc2U6On5DYWxsYmFja0Jhc2UoKSB7fQotCi12b2lkIEluc3BlY3RvckJhY2tl
bmREaXNwYXRjaGVyOjpDYWxsYmFja0Jhc2U6OnNlbmRGYWlsdXJlKGNvbnN0IEVycm9yU3RyaW5n
JiBlcnJvcikKLXsKLSAgICBBU1NFUlQoZXJyb3IubGVuZ3RoKCkpOwotICAgIHNlbmRJZkFjdGl2
ZSgwLCBlcnJvcik7Ci19Ci0KLWJvb2wgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OkNhbGxi
YWNrQmFzZTo6aXNBY3RpdmUoKQotewotICAgIHJldHVybiAhbV9hbHJlYWR5U2VudCAmJiBtX2Jh
Y2tlbmRJbXBsLT5pc0FjdGl2ZSgpOwotfQotCi12b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRj
aGVyOjpDYWxsYmFja0Jhc2U6OnNlbmRJZkFjdGl2ZShQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gcGFydGlhbE1lc3NhZ2UsIGNvbnN0IEVycm9yU3RyaW5nJiBpbnZvY2F0aW9uRXJyb3IpCi17
Ci0gICAgaWYgKG1fYWxyZWFkeVNlbnQpCi0gICAgICAgIHJldHVybjsKLSAgICBtX2JhY2tlbmRJ
bXBsLT5zZW5kUmVzcG9uc2UobV9pZCwgcGFydGlhbE1lc3NhZ2UsIGludm9jYXRpb25FcnJvcik7
Ci0gICAgbV9hbHJlYWR5U2VudCA9IHRydWU7Ci19Ci0KLUNPTVBJTEVfQVNTRVJUKHN0YXRpY19j
YXN0PGludD4oSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmtNZXRob2ROYW1lc0VudW1TaXpl
KSA9PSBXVEZfQVJSQVlfTEVOR1RIKEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpjb21tYW5k
TmFtZXMpLCBjb21tYW5kX25hbWVfYXJyYXlfcHJvYmxlbSk7Ci0KLX0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKLQotI2VuZGlmIC8vIEVOQUJMRShJTlNQRUNUT1IpCi0iIiIpCi0KLSAgICBmcm9udGVu
ZF9jcHAgPSBzdHJpbmcuVGVtcGxhdGUoZmlsZV9oZWFkZXJfICsKLSIiIgotCi0jaW5jbHVkZSAi
Y29uZmlnLmgiCi0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLQotI2luY2x1ZGUgIkluc3BlY3RvckZy
b250ZW5kLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0jaW5jbHVkZSA8d3Rm
L3RleHQvQ1N0cmluZy5oPgotCi0jaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLmgi
Ci0jaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3Ry
aW5nLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotSW5zcGVjdG9yRnJvbnRlbmQ6Okluc3Bl
Y3RvckZyb250ZW5kKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKQotICAgIDogJGNvbnN0cnVjdG9ySW5pdHsKLX0KLQotJG1ldGhvZHMKLQotfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQotCi0jZW5kaWYgLy8gRU5BQkxFKElOU1BFQ1RPUikKLSIiIikKLQot
ICAgIHR5cGVidWlsZGVyX2ggPSBzdHJpbmcuVGVtcGxhdGUoZmlsZV9oZWFkZXJfICsKLSIiIgot
I2lmbmRlZiBJbnNwZWN0b3JUeXBlQnVpbGRlcl9oCi0jZGVmaW5lIEluc3BlY3RvclR5cGVCdWls
ZGVyX2gKLQotI2lmIEVOQUJMRShJTlNQRUNUT1IpCi0KLSNpbmNsdWRlICJJbnNwZWN0b3JWYWx1
ZXMuaCIKLSNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgotI2luY2x1ZGUgPHd0Zi9QYXNzUmVm
UHRyLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotbmFtZXNwYWNlIFR5cGVCdWlsZGVyIHsK
LQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNsYXNzIE9wdE91dHB1dCB7Ci1wdWJsaWM6Ci0gICAg
T3B0T3V0cHV0KCkgOiBtX2Fzc2lnbmVkKGZhbHNlKSB7IH0KLQotICAgIHZvaWQgb3BlcmF0b3I9
KFQgdmFsdWUpCi0gICAgewotICAgICAgICBtX3ZhbHVlID0gdmFsdWU7Ci0gICAgICAgIG1fYXNz
aWduZWQgPSB0cnVlOwotICAgIH0KLQotICAgIGJvb2wgaXNBc3NpZ25lZCgpIHsgcmV0dXJuIG1f
YXNzaWduZWQ7IH0KLQotICAgIFQgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgICAgQVNTRVJUKGlz
QXNzaWduZWQoKSk7Ci0gICAgICAgIHJldHVybiBtX3ZhbHVlOwotICAgIH0KLQotcHJpdmF0ZToK
LSAgICBUIG1fdmFsdWU7Ci0gICAgYm9vbCBtX2Fzc2lnbmVkOwotCi0gICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoT3B0T3V0cHV0KTsKLX07Ci0KLQotLy8gQSBzbWFsbCB0cmFuc2llbnQgd3JhcHBl
ciBhcm91bmQgaW50IHR5cGUsIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmdW5jaXRvbiBwYXJhbWV0
ZXIgdHlwZQotLy8gY2xldmVybHkgZGlzYWxsb3dpbmcgQysrIGltcGxpY2l0IGNhc3RzIGZyb20g
ZmxvYXQgb3IgZG91YmxlLgotY2xhc3MgRXhhY3RseUludCB7Ci1wdWJsaWM6Ci0gICAgdGVtcGxh
dGU8dHlwZW5hbWUgVD4KLSAgICBFeGFjdGx5SW50KFQgdCkgOiBtX3ZhbHVlKGNhc3RfdG9faW50
PFQ+KHQpKSB7fQotCi0gICAgRXhhY3RseUludCgpIHt9Ci0KLSAgICBvcGVyYXRvciBpbnQoKSB7
IHJldHVybiBtX3ZhbHVlOyB9Ci1wcml2YXRlOgotICAgIGludCBtX3ZhbHVlOwotCi0gICAgdGVt
cGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0aWMgaW50IGNhc3RfdG9faW50KFQpIHsgcmV0dXJu
IFQ6OmRlZmF1bHRfY2FzZV9jYXN0X2lzX25vdF9zdXBwb3J0ZWQoKTsgfQotfTsKLQotdGVtcGxh
dGU8PgotaW5saW5lIGludCBFeGFjdGx5SW50OjpjYXN0X3RvX2ludDxpbnQ+KGludCBpKSB7IHJl
dHVybiBpOyB9Ci0KLXRlbXBsYXRlPD4KLWlubGluZSBpbnQgRXhhY3RseUludDo6Y2FzdF90b19p
bnQ8dW5zaWduZWQgaW50Pih1bnNpZ25lZCBpbnQgaSkgeyByZXR1cm4gaTsgfQotCi1jbGFzcyBS
dW50aW1lQ2FzdEhlbHBlciB7Ci1wdWJsaWM6Ci0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgIHRl
bXBsYXRlPEluc3BlY3RvclZhbHVlOjpUeXBlIFRZUEU+Ci0gICAgc3RhdGljIHZvaWQgYXNzZXJ0
VHlwZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpCi0gICAgewotICAgICAgICBBU1NFUlQodmFsdWUt
PnR5cGUoKSA9PSBUWVBFKTsKLSAgICB9Ci0gICAgc3RhdGljIHZvaWQgYXNzZXJ0QW55KEluc3Bl
Y3RvclZhbHVlKik7Ci0gICAgc3RhdGljIHZvaWQgYXNzZXJ0SW50KEluc3BlY3RvclZhbHVlKiB2
YWx1ZSk7Ci0jZW5kaWYKLX07Ci0KLQotLy8gVGhpcyBjbGFzcyBwcm92aWRlcyAiVHJhaXRzIiB0
eXBlIGZvciB0aGUgaW5wdXQgdHlwZSBULiBJdCBpcyBwcm9ncmFtbWVkIHVzaW5nIEMrKyB0ZW1w
bGF0ZSBzcGVjaWFsaXphdGlvbgotLy8gdGVjaG5pcXVlLiBCeSBkZWZhdWx0IGl0IHNpbXBseSB0
YWtlcyAiSXRlbVRyYWl0cyIgdHlwZSBmcm9tIFQsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgd2l0aCB0
aGUgYmFzZSB0eXBlcy4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQXJyYXlJdGVtSGVs
cGVyIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIFQ6Okl0ZW1UcmFpdHMgVHJhaXRzOwotfTsKLQot
dGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNsYXNzIEFycmF5IDogcHVibGljIEluc3BlY3RvckFycmF5
QmFzZSB7Ci1wcml2YXRlOgotICAgIEFycmF5KCkgeyB9Ci0KLSAgICBJbnNwZWN0b3JBcnJheSog
b3BlbkFjY2Vzc29ycygpIHsKLSAgICAgICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKEluc3BlY3Rv
ckFycmF5KSA9PSBzaXplb2YoQXJyYXk8VD4pLCBjYW5ub3RfY2FzdCk7Ci0gICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxJbnNwZWN0b3JBcnJheSo+KHN0YXRpY19jYXN0PEluc3BlY3RvckFycmF5
QmFzZSo+KHRoaXMpKTsKLSAgICB9Ci0KLXB1YmxpYzoKLSAgICB2b2lkIGFkZEl0ZW0oUGFzc1Jl
ZlB0cjxUPiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIEFycmF5SXRlbUhlbHBlcjxUPjo6VHJhaXRz
OjpwdXNoUmVmUHRyKHRoaXMtPm9wZW5BY2Nlc3NvcnMoKSwgdmFsdWUpOwotICAgIH0KLQotICAg
IHZvaWQgYWRkSXRlbShUIHZhbHVlKQotICAgIHsKLSAgICAgICAgQXJyYXlJdGVtSGVscGVyPFQ+
OjpUcmFpdHM6OnB1c2hSYXcodGhpcy0+b3BlbkFjY2Vzc29ycygpLCB2YWx1ZSk7Ci0gICAgfQot
Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8QXJyYXk8VD4gPiBjcmVhdGUoKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBBcnJheTxUPigpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMg
UGFzc1JlZlB0cjxBcnJheTxUPiA+IHJ1bnRpbWVDYXN0KFBhc3NSZWZQdHI8SW5zcGVjdG9yVmFs
dWU+IHZhbHVlKQotICAgIHsKLSAgICAgICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBhcnJheTsK
LSAgICAgICAgYm9vbCBjYXN0UmVzID0gdmFsdWUtPmFzQXJyYXkoJmFycmF5KTsKLSAgICAgICAg
QVNTRVJUX1VOVVNFRChjYXN0UmVzLCBjYXN0UmVzKTsKLSNpZiAhQVNTRVJUX0RJU0FCTEVECi0g
ICAgICAgIGFzc2VydENvcnJlY3RWYWx1ZShhcnJheS5nZXQoKSk7Ci0jZW5kaWYgIC8vICFBU1NF
UlRfRElTQUJMRUQKLSAgICAgICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKEFycmF5PFQ+KSA9PSBz
aXplb2YoSW5zcGVjdG9yQXJyYXkpLCB0eXBlX2Nhc3RfcHJvYmxlbSk7Ci0gICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxBcnJheTxUPio+KHN0YXRpY19jYXN0PEluc3BlY3RvckFycmF5QmFzZSo+
KGFycmF5LmdldCgpKSk7Ci0gICAgfQotCi0jaWYgIiIiICsgVkFMSURBVE9SX0lGREVGX05BTUUg
KyAiIiIKLSAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUq
IHZhbHVlKQotICAgIHsKLSAgICAgICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBhcnJheTsKLSAg
ICAgICAgYm9vbCBjYXN0UmVzID0gdmFsdWUtPmFzQXJyYXkoJmFycmF5KTsKLSAgICAgICAgQVNT
RVJUX1VOVVNFRChjYXN0UmVzLCBjYXN0UmVzKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGFycmF5LT5sZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgQXJyYXlJdGVtSGVscGVy
PFQ+OjpUcmFpdHM6OnRlbXBsYXRlIGFzc2VydENvcnJlY3RWYWx1ZTxUPihhcnJheS0+Z2V0KGkp
LmdldCgpKTsKLSAgICB9Ci0KLSNlbmRpZiAvLyAiIiIgKyBWQUxJREFUT1JfSUZERUZfTkFNRSAr
ICIiIgotfTsKLQotc3RydWN0IFN0cnVjdEl0ZW1UcmFpdHMgewotICAgIHN0YXRpYyB2b2lkIHB1
c2hSZWZQdHIoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVl
PiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGFycmF5LT5wdXNoVmFsdWUodmFsdWUpOwotICAgIH0K
LQotI2lmICIiIiArIFZBTElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCi0gICAgdGVtcGxhdGU8dHlw
ZW5hbWUgVD4KLSAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFs
dWUqIHZhbHVlKSB7Ci0gICAgICAgIFQ6OmFzc2VydENvcnJlY3RWYWx1ZSh2YWx1ZSk7Ci0gICAg
fQotI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVECi19OwotCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3Qg
QXJyYXlJdGVtSGVscGVyPFN0cmluZz4gewotICAgIHN0cnVjdCBUcmFpdHMgewotICAgICAgICBz
dGF0aWMgdm9pZCBwdXNoUmF3KEluc3BlY3RvckFycmF5KiBhcnJheSwgY29uc3QgU3RyaW5nJiB2
YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJyYXktPnB1c2hTdHJpbmcodmFsdWUpOwot
ICAgICAgICB9Ci0KLSNpZiAiIiIgKyBWQUxJREFUT1JfSUZERUZfTkFNRSArICIiIgotICAgICAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0
VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKSB7Ci0gICAgICAgICAgICBSdW50aW1lQ2FzdEhl
bHBlcjo6YXNzZXJ0VHlwZTxJbnNwZWN0b3JWYWx1ZTo6VHlwZVN0cmluZz4odmFsdWUpOwotICAg
ICAgICB9Ci0jZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKLSAgICB9OwotfTsKLQotdGVtcGxh
dGU8Pgotc3RydWN0IEFycmF5SXRlbUhlbHBlcjxpbnQ+IHsKLSAgICBzdHJ1Y3QgVHJhaXRzIHsK
LSAgICAgICAgc3RhdGljIHZvaWQgcHVzaFJhdyhJbnNwZWN0b3JBcnJheSogYXJyYXksIGludCB2
YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJyYXktPnB1c2hJbnQodmFsdWUpOwotICAg
ICAgICB9Ci0KLSNpZiAiIiIgKyBWQUxJREFUT1JfSUZERUZfTkFNRSArICIiIgotICAgICAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFs
dWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKSB7Ci0gICAgICAgICAgICBSdW50aW1lQ2FzdEhlbHBl
cjo6YXNzZXJ0SW50KHZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FC
TEVECi0gICAgfTsKLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBBcnJheUl0ZW1IZWxwZXI8ZG91
YmxlPiB7Ci0gICAgc3RydWN0IFRyYWl0cyB7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSYXco
SW5zcGVjdG9yQXJyYXkqIGFycmF5LCBkb3VibGUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAg
ICAgIGFycmF5LT5wdXNoTnVtYmVyKHZhbHVlKTsKLSAgICAgICAgfQotCi0jaWYgIiIiICsgVkFM
SURBVE9SX0lGREVGX05BTUUgKyAiIiIKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAg
ICAgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1
ZSkgewotICAgICAgICAgICAgUnVudGltZUNhc3RIZWxwZXI6OmFzc2VydFR5cGU8SW5zcGVjdG9y
VmFsdWU6OlR5cGVOdW1iZXI+KHZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmICAvLyAhQVNTRVJU
X0RJU0FCTEVECi0gICAgfTsKLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBBcnJheUl0ZW1IZWxw
ZXI8Ym9vbD4gewotICAgIHN0cnVjdCBUcmFpdHMgewotICAgICAgICBzdGF0aWMgdm9pZCBwdXNo
UmF3KEluc3BlY3RvckFycmF5KiBhcnJheSwgYm9vbCB2YWx1ZSkKLSAgICAgICAgewotICAgICAg
ICAgICAgYXJyYXktPnB1c2hCb29sZWFuKHZhbHVlKTsKLSAgICAgICAgfQotCi0jaWYgIiIiICsg
VkFMSURBVE9SX0lGREVGX05BTUUgKyAiIiIKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4K
LSAgICAgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2
YWx1ZSkgewotICAgICAgICAgICAgUnVudGltZUNhc3RIZWxwZXI6OmFzc2VydFR5cGU8SW5zcGVj
dG9yVmFsdWU6OlR5cGVCb29sZWFuPih2YWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAgLy8gIUFT
U0VSVF9ESVNBQkxFRAotICAgIH07Ci19OwotCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3QgQXJyYXlJdGVt
SGVscGVyPEluc3BlY3RvclZhbHVlPiB7Ci0gICAgc3RydWN0IFRyYWl0cyB7Ci0gICAgICAgIHN0
YXRpYyB2b2lkIHB1c2hSZWZQdHIoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBQYXNzUmVmUHRyPElu
c3BlY3RvclZhbHVlPiB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJyYXktPnB1c2hW
YWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotI2lmICIiIiArIFZBTElEQVRPUl9JRkRFRl9OQU1F
ICsgIiIiCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHN0YXRpYyB2b2lk
IGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKLSAgICAgICAgICAg
IFJ1bnRpbWVDYXN0SGVscGVyOjphc3NlcnRBbnkodmFsdWUpOwotICAgICAgICB9Ci0jZW5kaWYg
IC8vICFBU1NFUlRfRElTQUJMRUQKLSAgICB9OwotfTsKLQotdGVtcGxhdGU8Pgotc3RydWN0IEFy
cmF5SXRlbUhlbHBlcjxJbnNwZWN0b3JPYmplY3Q+IHsKLSAgICBzdHJ1Y3QgVHJhaXRzIHsKLSAg
ICAgICAgc3RhdGljIHZvaWQgcHVzaFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcnJh
eS0+cHVzaFZhbHVlKHZhbHVlKTsKLSAgICAgICAgfQotCi0jaWYgIiIiICsgVkFMSURBVE9SX0lG
REVGX05BTUUgKyAiIiIKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgc3Rh
dGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgewotICAg
ICAgICAgICAgUnVudGltZUNhc3RIZWxwZXI6OmFzc2VydFR5cGU8SW5zcGVjdG9yVmFsdWU6OlR5
cGVPYmplY3Q+KHZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVE
Ci0gICAgfTsKLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBBcnJheUl0ZW1IZWxwZXI8SW5zcGVj
dG9yQXJyYXk+IHsKLSAgICBzdHJ1Y3QgVHJhaXRzIHsKLSAgICAgICAgc3RhdGljIHZvaWQgcHVz
aFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+
IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcnJheS0+cHVzaEFycmF5KHZhbHVlKTsK
LSAgICAgICAgfQotCi0jaWYgIiIiICsgVkFMSURBVE9SX0lGREVGX05BTUUgKyAiIiIKLSAgICAg
ICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVj
dFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgewotICAgICAgICAgICAgUnVudGltZUNhc3RI
ZWxwZXI6OmFzc2VydFR5cGU8SW5zcGVjdG9yVmFsdWU6OlR5cGVBcnJheT4odmFsdWUpOwotICAg
ICAgICB9Ci0jZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKLSAgICB9OwotfTsKLQotdGVtcGxh
dGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBBcnJheUl0ZW1IZWxwZXI8VHlwZUJ1aWxkZXI6OkFycmF5
PFQ+ID4gewotICAgIHN0cnVjdCBUcmFpdHMgewotICAgICAgICBzdGF0aWMgdm9pZCBwdXNoUmVm
UHRyKEluc3BlY3RvckFycmF5KiBhcnJheSwgUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8
VD4gPiB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJyYXktPnB1c2hWYWx1ZSh2YWx1
ZSk7Ci0gICAgICAgIH0KLQotI2lmICIiIiArIFZBTElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCi0g
ICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+Ci0gICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENv
cnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKLSAgICAgICAgICAgIFM6OmFzc2Vy
dENvcnJlY3RWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAgLy8gIUFTU0VSVF9ESVNB
QkxFRAotICAgIH07Ci19OwotCi0ke2ZvcndhcmRzfQotCi1TdHJpbmcgZ2V0RW51bUNvbnN0YW50
VmFsdWUoaW50IGNvZGUpOwotCi0ke3R5cGVCdWlsZGVyc30KLX0gLy8gbmFtZXNwYWNlIFR5cGVC
dWlsZGVyCi0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQotCi0jZW5kaWYgLy8gRU5BQkxFKElO
U1BFQ1RPUikKLQotI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvclR5cGVCdWlsZGVyX2gpCi0K
LSIiIikKLQotICAgIHR5cGVidWlsZGVyX2NwcCA9IHN0cmluZy5UZW1wbGF0ZShmaWxlX2hlYWRl
cl8gKwotIiIiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpZiBFTkFCTEUoSU5TUEVDVE9SKQot
Ci0jaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1aWxkZXIuaCIKLSNpbmNsdWRlIDx3dGYvdGV4dC9D
U3RyaW5nLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotbmFtZXNwYWNlIFR5cGVCdWlsZGVy
IHsKLQotY29uc3QgY2hhciogY29uc3QgZW51bV9jb25zdGFudF92YWx1ZXNbXSA9IHsKLSRlbnVt
Q29uc3RhbnRWYWx1ZXN9OwotCi1TdHJpbmcgZ2V0RW51bUNvbnN0YW50VmFsdWUoaW50IGNvZGUp
IHsKLSAgICByZXR1cm4gZW51bV9jb25zdGFudF92YWx1ZXNbY29kZV07Ci19Ci0KLX0gLy8gbmFt
ZXNwYWNlIFR5cGVCdWlsZGVyCi0KLSRpbXBsQ29kZQotCi0jaWYgIiIiICsgVkFMSURBVE9SX0lG
REVGX05BTUUgKyAiIiIKLQotdm9pZCBUeXBlQnVpbGRlcjo6UnVudGltZUNhc3RIZWxwZXI6OmFz
c2VydEFueShJbnNwZWN0b3JWYWx1ZSopCi17Ci0gICAgLy8gTm8tb3AuCi19Ci0KLQotdm9pZCBU
eXBlQnVpbGRlcjo6UnVudGltZUNhc3RIZWxwZXI6OmFzc2VydEludChJbnNwZWN0b3JWYWx1ZSog
dmFsdWUpCi17Ci0gICAgZG91YmxlIHY7Ci0gICAgYm9vbCBjYXN0UmVzID0gdmFsdWUtPmFzTnVt
YmVyKCZ2KTsKLSAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOwotICAgIEFTU0VS
VChzdGF0aWNfY2FzdDxkb3VibGU+KHN0YXRpY19jYXN0PGludD4odikpID09IHYpOwotfQotCi0k
dmFsaWRhdG9yQ29kZQotCi0jZW5kaWYgLy8gIiIiICsgVkFMSURBVE9SX0lGREVGX05BTUUgKyAi
IiIKLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQotCi0jZW5kaWYgLy8gRU5BQkxFKElOU1BFQ1RP
UikKLSIiIikKLQotICAgIGJhY2tlbmRfanMgPSBzdHJpbmcuVGVtcGxhdGUoZmlsZV9oZWFkZXJf
ICsKLSIiIgotCi0kZG9tYWluSW5pdGlhbGl6ZXJzCi0iIiIpCiAKLSAgICBwYXJhbV9jb250YWlu
ZXJfYWNjZXNzX2NvZGUgPSAiIiIKLSAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXND
b250YWluZXIgPSByZXF1ZXN0TWVzc2FnZU9iamVjdC0+Z2V0T2JqZWN0KCJwYXJhbXMiKTsKLSAg
ICBJbnNwZWN0b3JPYmplY3QqIHBhcmFtc0NvbnRhaW5lclB0ciA9IHBhcmFtc0NvbnRhaW5lci5n
ZXQoKTsKLSAgICBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnNQdHIgPSBwcm90b2NvbEVy
cm9ycy5nZXQoKTsKLSIiIgogCiAKIHR5cGVfbWFwID0gVHlwZU1hcChqc29uX2FwaSkKQEAgLTMy
NTQsMTIgKzIzNTUsMTQgQEAgZnJvbnRlbmRfY3BwX2ZpbGUud3JpdGUoVGVtcGxhdGVzLmZyb250
ZW5kX2NwcC5zdWJzdGl0dXRlKE5vbmUsCiAKIHR5cGVidWlsZGVyX2hfZmlsZS53cml0ZShUZW1w
bGF0ZXMudHlwZWJ1aWxkZXJfaC5zdWJzdGl0dXRlKE5vbmUsCiAgICAgdHlwZUJ1aWxkZXJzPSIi
LmpvaW4oZmxhdHRlbl9saXN0KEdlbmVyYXRvci50eXBlX2J1aWxkZXJfZnJhZ21lbnRzKSksCi0g
ICAgZm9yd2FyZHM9IiIuam9pbihHZW5lcmF0b3IudHlwZV9idWlsZGVyX2ZvcndhcmRzKSkpCisg
ICAgZm9yd2FyZHM9IiIuam9pbihHZW5lcmF0b3IudHlwZV9idWlsZGVyX2ZvcndhcmRzKSwKKyAg
ICB2YWxpZGF0b3JJZmRlZk5hbWU9VkFMSURBVE9SX0lGREVGX05BTUUpKQogCiB0eXBlYnVpbGRl
cl9jcHBfZmlsZS53cml0ZShUZW1wbGF0ZXMudHlwZWJ1aWxkZXJfY3BwLnN1YnN0aXR1dGUoTm9u
ZSwKICAgICBlbnVtQ29uc3RhbnRWYWx1ZXM9RW51bUNvbnN0YW50cy5nZXRfZW51bV9jb25zdGFu
dF9jb2RlKCksCiAgICAgaW1wbENvZGU9IiIuam9pbihmbGF0dGVuX2xpc3QoR2VuZXJhdG9yLnR5
cGVfYnVpbGRlcl9pbXBsX2xpc3QpKSwKLSAgICB2YWxpZGF0b3JDb2RlPSIiLmpvaW4oZmxhdHRl
bl9saXN0KEdlbmVyYXRvci52YWxpZGF0b3JfaW1wbF9saXN0KSkpKQorICAgIHZhbGlkYXRvckNv
ZGU9IiIuam9pbihmbGF0dGVuX2xpc3QoR2VuZXJhdG9yLnZhbGlkYXRvcl9pbXBsX2xpc3QpKSwK
KyAgICB2YWxpZGF0b3JJZmRlZk5hbWU9VkFMSURBVE9SX0lGREVGX05BTUUpKQogCiBiYWNrZW5k
X2pzX2ZpbGUud3JpdGUoVGVtcGxhdGVzLmJhY2tlbmRfanMuc3Vic3RpdHV0ZShOb25lLAogICAg
IGRvbWFpbkluaXRpYWxpemVycz0iIi5qb2luKEdlbmVyYXRvci5iYWNrZW5kX2pzX2RvbWFpbl9p
bml0aWFsaXplcl9saXN0KSkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3Iv
Q29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MucHkgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0
b3IvQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uM2EyYzVlZDRm
YjUwODk1OGY0N2E1ZGRlMGE1ZjdhMGE1MDU0ZjkyZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yU3RyaW5ncy5weQpAQCAt
MCwwICsxLDk1NCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTMgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIwor
IyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisj
IGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisj
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyMgVEhpcyBmaWxlIGNvbnRhaW5zIHN0
cmluZyByZXNvdXJjZXMgZm9yIENvZGVHZW5lcmF0b3JJbnNwZWN0b3IuCisjIEl0cyBzeW50YXgg
aXMgYSBQeXRob24gc3ludGF4IHN1YnNldCwgc3VpdGFibGUgZm9yIG1hbnVhbCBwYXJzaW5nLgor
Citmcm9udGVuZF9kb21haW5fY2xhc3MgPSAoCisiIiIgICAgY2xhc3MgJGRvbWFpbkNsYXNzTmFt
ZSB7CisgICAgcHVibGljOgorICAgICAgICAkZG9tYWluQ2xhc3NOYW1lKEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9Ciske2Zyb250ZW5kRG9tYWlu
TWV0aG9kRGVjbGFyYXRpb25zfSAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0K
KyAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQorICAgIHByaXZh
dGU6CisgICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7CisgICAgfTsKKworICAgICRkb21haW5DbGFzc05hbWUqICRkb21haW5GaWVsZE5h
bWUoKSB7IHJldHVybiAmbV8kZG9tYWluRmllbGROYW1lOyB9CisKKyIiIikKKworYmFja2VuZF9t
ZXRob2QgPSAoCisiIiJ2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6JHtkb21h
aW5OYW1lfV8kbWV0aG9kTmFtZShsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiRyZXF1ZXN0
TWVzc2FnZU9iamVjdCkKK3sKKyAgICBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJy
b3JzID0gSW5zcGVjdG9yQXJyYXk6OmNyZWF0ZSgpOworCisgICAgaWYgKCEkYWdlbnRGaWVsZCkK
KyAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoIiR7ZG9tYWluTmFtZX0gaGFuZGxl
ciBpcyBub3QgYXZhaWxhYmxlLiIpOworJG1ldGhvZE91dENvZGUKKyRtZXRob2RJbkNvZGUKKyAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXN1bHQgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOworICAgIEVycm9yU3RyaW5nIGVycm9yOworICAgIGlmICghcHJvdG9jb2xFcnJvcnMtPmxl
bmd0aCgpKSB7CisgICAgICAgICRhZ2VudEZpZWxkLT4kbWV0aG9kTmFtZSgmZXJyb3IkYWdlbnRD
YWxsUGFyYW1zKTsKKworJHtyZXNwb25zZUNvb2t9CisgICAgfQorICAgIHNlbmRSZXNwb25zZShj
YWxsSWQsIHJlc3VsdCwgY29tbWFuZE5hbWVzWyRjb21tYW5kTmFtZUluZGV4XSwgcHJvdG9jb2xF
cnJvcnMsIGVycm9yKTsKK30KKyIiIikKKworZnJvbnRlbmRfbWV0aG9kID0gKCIiInZvaWQgSW5z
cGVjdG9yRnJvbnRlbmQ6OiRkb21haW5OYW1lOjokZXZlbnROYW1lKCRwYXJhbWV0ZXJzKQorewor
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGpzb25NZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0
OjpjcmVhdGUoKTsKKyAgICBqc29uTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiJGRvbWFp
bk5hbWUuJGV2ZW50TmFtZSIpOworJGNvZGUgICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKQorICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zy
b250ZW5kKGpzb25NZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cit9CisiIiIpCisKK2NhbGxiYWNr
X21ldGhvZCA9ICgKKyIiIkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjokYWdlbnROYW1lOjok
Y2FsbGJhY2tOYW1lOjokY2FsbGJhY2tOYW1lKFBhc3NSZWZQdHI8SW5zcGVjdG9yQmFja2VuZERp
c3BhdGNoZXJJbXBsPiBiYWNrZW5kSW1wbCwgaW50IGlkKSA6IENhbGxiYWNrQmFzZShiYWNrZW5k
SW1wbCwgaWQpIHt9CisKK3ZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OiRhZ2VudE5h
bWU6OiRjYWxsYmFja05hbWU6OnNlbmRTdWNjZXNzKCRwYXJhbWV0ZXJzKQoreworICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGpzb25NZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUo
KTsKKyRjb2RlICAgIHNlbmRJZkFjdGl2ZShqc29uTWVzc2FnZSwgRXJyb3JTdHJpbmcoKSk7Cit9
CisiIiIpCisKK2Zyb250ZW5kX2ggPSAoCisiIiIjaWZuZGVmIEluc3BlY3RvckZyb250ZW5kX2gK
KyNkZWZpbmUgSW5zcGVjdG9yRnJvbnRlbmRfaAorCisjaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1
aWxkZXIuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JWYWx1ZXMuaCIKKyNpbmNsdWRlIDx3dGYvUGFz
c1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKKworLy8gQm90aCBJ
bnNwZWN0b3JPYmplY3QgYW5kIEluc3BlY3RvckFycmF5IG1heSBvciBtYXkgbm90IGJlIGRlY2xh
cmVkIGF0IHRoaXMgcG9pbnQgYXMgZGVmaW5lZCBieSBFTkFCTEVEX0lOU1BFQ1RPUi4KKy8vIERv
dWJsZS1jaGVjayB3ZSBoYXZlIHRoZW0gYXQgbGVhc3QgYXMgZm9yd2FyZCBkZWNsYXJhdGlvbi4K
K2NsYXNzIEluc3BlY3RvckFycmF5OworY2xhc3MgSW5zcGVjdG9yT2JqZWN0OworCit0eXBlZGVm
IFN0cmluZyBFcnJvclN0cmluZzsKKworI2lmIEVOQUJMRShJTlNQRUNUT1IpCisKK2NsYXNzIElu
c3BlY3RvckZyb250ZW5kIHsKK3B1YmxpYzoKKyAgICBJbnNwZWN0b3JGcm9udGVuZChJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwqKTsKKworCiskZG9tYWluQ2xhc3NMaXN0Citwcml2YXRlOgorJHtm
aWVsZERlY2xhcmF0aW9uc319OworCisjZW5kaWYgLy8gRU5BQkxFKElOU1BFQ1RPUikKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvckZyb250ZW5k
X2gpCisiIiIpCisKK2JhY2tlbmRfaCA9ICgKKyIiIiNpZm5kZWYgSW5zcGVjdG9yQmFja2VuZERp
c3BhdGNoZXJfaAorI2RlZmluZSBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcl9oCisKKyNpbmNs
dWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5j
bHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisjaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1aWxk
ZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBJbnNwZWN0b3JBZ2VudDsKK2Ns
YXNzIEluc3BlY3Rvck9iamVjdDsKK2NsYXNzIEluc3BlY3RvckFycmF5OworY2xhc3MgSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsOworCit0eXBlZGVmIFN0cmluZyBFcnJvclN0cmluZzsKKworY2xh
c3MgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOworCitjbGFzcyBJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjogcHVibGljIFJlZkNvdW50ZWQ8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNo
ZXI+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlcj4gY3JlYXRlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKTsKKyAgICB2aXJ0dWFsIH5JbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcigpIHsg
fQorCisgICAgY2xhc3MgQ2FsbGJhY2tCYXNlOiBwdWJsaWMgUmVmQ291bnRlZDxDYWxsYmFja0Jh
c2U+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIENhbGxiYWNrQmFzZShQYXNzUmVmUHRyPEluc3Bl
Y3RvckJhY2tlbmREaXNwYXRjaGVySW1wbD4gYmFja2VuZEltcGwsIGludCBpZCk7CisgICAgICAg
IHZpcnR1YWwgfkNhbGxiYWNrQmFzZSgpOworICAgICAgICB2b2lkIHNlbmRGYWlsdXJlKGNvbnN0
IEVycm9yU3RyaW5nJik7CisgICAgICAgIGJvb2wgaXNBY3RpdmUoKTsKKworICAgIHByb3RlY3Rl
ZDoKKyAgICAgICAgdm9pZCBzZW5kSWZBY3RpdmUoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHBhcnRpYWxNZXNzYWdlLCBjb25zdCBFcnJvclN0cmluZyYgaW52b2NhdGlvbkVycm9yKTsKKwor
ICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgZGlzYWJsZSgpIHsgbV9hbHJlYWR5U2VudCA9IHRy
dWU7IH0KKworICAgICAgICBSZWZQdHI8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsPiBt
X2JhY2tlbmRJbXBsOworICAgICAgICBpbnQgbV9pZDsKKyAgICAgICAgYm9vbCBtX2FscmVhZHlT
ZW50OworCisgICAgICAgIGZyaWVuZCBjbGFzcyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcklt
cGw7CisgICAgfTsKKworJGFnZW50SW50ZXJmYWNlcworJHZpcnR1YWxTZXR0ZXJzCisKKyAgICB2
aXJ0dWFsIHZvaWQgY2xlYXJGcm9udGVuZCgpID0gMDsKKworICAgIGVudW0gQ29tbW9uRXJyb3JD
b2RlIHsKKyAgICAgICAgUGFyc2VFcnJvciA9IDAsCisgICAgICAgIEludmFsaWRSZXF1ZXN0LAor
ICAgICAgICBNZXRob2ROb3RGb3VuZCwKKyAgICAgICAgSW52YWxpZFBhcmFtcywKKyAgICAgICAg
SW50ZXJuYWxFcnJvciwKKyAgICAgICAgU2VydmVyRXJyb3IsCisgICAgICAgIExhc3RFbnRyeSwK
KyAgICB9OworCisgICAgdm9pZCByZXBvcnRQcm90b2NvbEVycm9yKGNvbnN0IGxvbmcqIGNvbnN0
IGNhbGxJZCwgQ29tbW9uRXJyb3JDb2RlLCBjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSkgY29u
c3Q7CisgICAgdmlydHVhbCB2b2lkIHJlcG9ydFByb3RvY29sRXJyb3IoY29uc3QgbG9uZyogY29u
c3QgY2FsbElkLCBDb21tb25FcnJvckNvZGUsIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBQ
YXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBkYXRhKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2
b2lkIGRpc3BhdGNoKGNvbnN0IFN0cmluZyYgbWVzc2FnZSkgPSAwOworICAgIHN0YXRpYyBib29s
IGdldENvbW1hbmROYW1lKGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgU3RyaW5nKiByZXN1bHQpOwor
CisgICAgZW51bSBNZXRob2ROYW1lcyB7CiskbWV0aG9kTmFtZXNFbnVtQ29udGVudAorCisgICAg
ICAgIGtNZXRob2ROYW1lc0VudW1TaXplCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFy
KiBjb21tYW5kTmFtZXNbXTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKyNlbmRpZiAv
LyAhZGVmaW5lZChJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcl9oKQorCisKKyIiIikKKworYmFj
a2VuZF9jcHAgPSAoCisiIiIKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKElO
U1BFQ1RPUikKKworI2luY2x1ZGUgIkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyLmgiCisjaW5j
bHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5o
PgorCisjaW5jbHVkZSAiSW5zcGVjdG9yQWdlbnQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JWYWx1
ZXMuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwuaCIKKyNpbmNsdWRlIDx3
dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCBjaGFy
KiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Y29tbWFuZE5hbWVzW10gPSB7CiskbWV0aG9k
TmFtZURlY2xhcmF0aW9ucworfTsKKworCitjbGFzcyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
ckltcGwgOiBwdWJsaWMgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXIgeworcHVibGljOgorICAg
IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwq
IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKKyAgICAgICAgOiBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiskY29uc3RydWN0b3JJbml0CisgICAg
eyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJGcm9udGVuZCgpIHsgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwgPSAwOyB9CisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoKGNvbnN0IFN0cmlu
ZyYgbWVzc2FnZSk7CisgICAgdmlydHVhbCB2b2lkIHJlcG9ydFByb3RvY29sRXJyb3IoY29uc3Qg
bG9uZyogY29uc3QgY2FsbElkLCBDb21tb25FcnJvckNvZGUsIGNvbnN0IFN0cmluZyYgZXJyb3JN
ZXNzYWdlLCBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBkYXRhKSBjb25zdDsKKyAgICB1c2lu
ZyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6cmVwb3J0UHJvdG9jb2xFcnJvcjsKKworICAg
IHZvaWQgc2VuZFJlc3BvbnNlKGxvbmcgY2FsbElkLCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gcmVzdWx0LCBjb25zdCBFcnJvclN0cmluZyYgaW52b2NhdGlvbkVycm9yKTsKKyAgICBib29s
IGlzQWN0aXZlKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KKworJHNl
dHRlcnMKK3ByaXZhdGU6CiskbWV0aG9kRGVjbGFyYXRpb25zCisKKyAgICBJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOworJGZpZWxkRGVjbGFyYXRp
b25zCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBWMD4K
KyAgICBzdGF0aWMgUiBnZXRQcm9wZXJ0eVZhbHVlSW1wbChJbnNwZWN0b3JPYmplY3QqIG9iamVj
dCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSog
cHJvdG9jb2xFcnJvcnMsIFYwIGluaXRpYWxfdmFsdWUsIGJvb2wgKCphc19tZXRob2QpKEluc3Bl
Y3RvclZhbHVlKiwgViopLCBjb25zdCBjaGFyKiB0eXBlX25hbWUpOworCisgICAgc3RhdGljIGlu
dCBnZXRJbnQoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9v
bCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKTsKKyAgICBzdGF0
aWMgZG91YmxlIGdldERvdWJsZShJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5n
JiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMp
OworICAgIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBj
b25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90
b2NvbEVycm9ycyk7CisgICAgc3RhdGljIGJvb2wgZ2V0Qm9vbGVhbihJbnNwZWN0b3JPYmplY3Qq
IG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JB
cnJheSogcHJvdG9jb2xFcnJvcnMpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gZ2V0T2JqZWN0KEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5h
bWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycyk7Cisg
ICAgc3RhdGljIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGdldEFycmF5KEluc3BlY3Rvck9i
amVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3Bl
Y3RvckFycmF5KiBwcm90b2NvbEVycm9ycyk7CisKKyAgICB2b2lkIHNlbmRSZXNwb25zZShsb25n
IGNhbGxJZCwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3VsdCwgY29uc3QgY2hhciog
Y29tbWFuZE5hbWUsIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHByb3RvY29sRXJyb3JzLCBF
cnJvclN0cmluZyBpbnZvY2F0aW9uRXJyb3IpOworCit9OworCiskbWV0aG9kcworCitQYXNzUmVm
UHRyPEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyPiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
cjo6Y3JlYXRlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNo
ZXJJbXBsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkpOworfQorCisKK3ZvaWQgSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXJJbXBsOjpkaXNwYXRjaChjb25zdCBTdHJpbmcmIG1lc3NhZ2UpCit7
CisgICAgUmVmUHRyPEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyPiBwcm90ZWN0ID0gdGhpczsK
KyAgICB0eXBlZGVmIHZvaWQgKEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6KkNhbGxI
YW5kbGVyKShsb25nIGNhbGxJZCwgSW5zcGVjdG9yT2JqZWN0KiBtZXNzYWdlT2JqZWN0KTsKKyAg
ICB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBDYWxsSGFuZGxlcj4gRGlzcGF0Y2hNYXA7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChEaXNwYXRjaE1hcCwgZGlzcGF0Y2hNYXAsICk7CisgICAgbG9u
ZyBjYWxsSWQgPSAwOworCisgICAgaWYgKGRpc3BhdGNoTWFwLmlzRW1wdHkoKSkgeworICAgICAg
ICBzdGF0aWMgQ2FsbEhhbmRsZXIgaGFuZGxlcnNbXSA9IHsKKyRtZXNzYWdlSGFuZGxlcnMKKyAg
ICAgICAgfTsKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFdURl9BUlJBWV9MRU5HVEgoY29tbWFu
ZE5hbWVzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAg
ICAgICAgICAgIGRpc3BhdGNoTWFwLmFkZChjb21tYW5kTmFtZXNbaV0sIGhhbmRsZXJzW2ldKTsK
KyAgICB9CisKKyAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHBhcnNlZE1lc3NhZ2UgPSBJbnNw
ZWN0b3JWYWx1ZTo6cGFyc2VKU09OKG1lc3NhZ2UpOworICAgIGlmICghcGFyc2VkTWVzc2FnZSkg
eworICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKDAsIFBhcnNlRXJyb3IsICJNZXNzYWdlIG11
c3QgYmUgaW4gSlNPTiBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2VPYmplY3QgPSBwYXJzZWRNZXNzYWdlLT5hc09i
amVjdCgpOworICAgIGlmICghbWVzc2FnZU9iamVjdCkgeworICAgICAgICByZXBvcnRQcm90b2Nv
bEVycm9yKDAsIEludmFsaWRSZXF1ZXN0LCAiTWVzc2FnZSBtdXN0IGJlIGEgSlNPTmlmaWVkIG9i
amVjdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUmVmUHRyPEluc3BlY3RvclZh
bHVlPiBjYWxsSWRWYWx1ZSA9IG1lc3NhZ2VPYmplY3QtPmdldCgiaWQiKTsKKyAgICBpZiAoIWNh
bGxJZFZhbHVlKSB7CisgICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoMCwgSW52YWxpZFJlcXVl
c3QsICInaWQnIHByb3BlcnR5IHdhcyBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGlmICghY2FsbElkVmFsdWUtPmFzTnVtYmVyKCZjYWxsSWQpKSB7CisgICAgICAg
IHJlcG9ydFByb3RvY29sRXJyb3IoMCwgSW52YWxpZFJlcXVlc3QsICJUaGUgdHlwZSBvZiAnaWQn
IHByb3BlcnR5IG11c3QgYmUgbnVtYmVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IG1ldGhvZFZhbHVlID0gbWVzc2FnZU9iamVjdC0+Z2V0
KCJtZXRob2QiKTsKKyAgICBpZiAoIW1ldGhvZFZhbHVlKSB7CisgICAgICAgIHJlcG9ydFByb3Rv
Y29sRXJyb3IoJmNhbGxJZCwgSW52YWxpZFJlcXVlc3QsICInbWV0aG9kJyBwcm9wZXJ0eSB3YXNu
J3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZyBtZXRob2Q7
CisgICAgaWYgKCFtZXRob2RWYWx1ZS0+YXNTdHJpbmcoJm1ldGhvZCkpIHsKKyAgICAgICAgcmVw
b3J0UHJvdG9jb2xFcnJvcigmY2FsbElkLCBJbnZhbGlkUmVxdWVzdCwgIlRoZSB0eXBlIG9mICdt
ZXRob2QnIHByb3BlcnR5IG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBIYXNoTWFwPFN0cmluZywgQ2FsbEhhbmRsZXI+OjppdGVyYXRvciBpdCA9IGRpc3Bh
dGNoTWFwLmZpbmQobWV0aG9kKTsKKyAgICBpZiAoaXQgPT0gZGlzcGF0Y2hNYXAuZW5kKCkpIHsK
KyAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcigmY2FsbElkLCBNZXRob2ROb3RGb3VuZCwgIici
ICsgbWV0aG9kICsgIicgd2Fzbid0IGZvdW5kIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICAoKCp0aGlzKS4qaXQtPnZhbHVlKShjYWxsSWQsIG1lc3NhZ2VPYmplY3QuZ2V0KCkpOwor
fQorCit2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6c2VuZFJlc3BvbnNlKGxv
bmcgY2FsbElkLCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzdWx0LCBjb25zdCBjaGFy
KiBjb21tYW5kTmFtZSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMs
IEVycm9yU3RyaW5nIGludm9jYXRpb25FcnJvcikKK3sKKyAgICBpZiAocHJvdG9jb2xFcnJvcnMt
Pmxlbmd0aCgpKSB7CisgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBTdHJpbmc6OmZvcm1h
dCgiU29tZSBhcmd1bWVudHMgb2YgbWV0aG9kICclcycgY2FuJ3QgYmUgcHJvY2Vzc2VkIiwgY29t
bWFuZE5hbWUpOworICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKCZjYWxsSWQsIEludmFsaWRQ
YXJhbXMsIGVycm9yTWVzc2FnZSwgcHJvdG9jb2xFcnJvcnMpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorICAgIHNlbmRSZXNwb25zZShjYWxsSWQsIHJlc3VsdCwgaW52b2NhdGlvbkVycm9yKTsK
K30KKwordm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw6OnNlbmRSZXNwb25zZShs
b25nIGNhbGxJZCwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3VsdCwgY29uc3QgRXJy
b3JTdHJpbmcmIGludm9jYXRpb25FcnJvcikKK3sKKyAgICBpZiAoaW52b2NhdGlvbkVycm9yLmxl
bmd0aCgpKSB7CisgICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoJmNhbGxJZCwgU2VydmVyRXJy
b3IsIGludm9jYXRpb25FcnJvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOworICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0T2JqZWN0KCJyZXN1bHQiLCByZXN1bHQp
OworICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVtYmVyKCJpZCIsIGNhbGxJZCk7CisgICAgaWYg
KG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQorICAgICAgICBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3Ry
aW5nKCkpOworfQorCit2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpyZXBvcnRQcm90
b2NvbEVycm9yKGNvbnN0IGxvbmcqIGNvbnN0IGNhbGxJZCwgQ29tbW9uRXJyb3JDb2RlIGNvZGUs
IGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKSBjb25zdAoreworICAgIHJlcG9ydFByb3RvY29s
RXJyb3IoY2FsbElkLCBjb2RlLCBlcnJvck1lc3NhZ2UsIDApOworfQorCit2b2lkIEluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVySW1wbDo6cmVwb3J0UHJvdG9jb2xFcnJvcihjb25zdCBsb25nKiBj
b25zdCBjYWxsSWQsIENvbW1vbkVycm9yQ29kZSBjb2RlLCBjb25zdCBTdHJpbmcmIGVycm9yTWVz
c2FnZSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gZGF0YSkgY29uc3QKK3sKKyAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKFZlY3RvcjxpbnQ+LHNfY29tbW9uRXJyb3JzLCk7CisgICAgaWYgKCFz
X2NvbW1vbkVycm9ycy5zaXplKCkpIHsKKyAgICAgICAgc19jb21tb25FcnJvcnMuaW5zZXJ0KFBh
cnNlRXJyb3IsIC0zMjcwMCk7CisgICAgICAgIHNfY29tbW9uRXJyb3JzLmluc2VydChJbnZhbGlk
UmVxdWVzdCwgLTMyNjAwKTsKKyAgICAgICAgc19jb21tb25FcnJvcnMuaW5zZXJ0KE1ldGhvZE5v
dEZvdW5kLCAtMzI2MDEpOworICAgICAgICBzX2NvbW1vbkVycm9ycy5pbnNlcnQoSW52YWxpZFBh
cmFtcywgLTMyNjAyKTsKKyAgICAgICAgc19jb21tb25FcnJvcnMuaW5zZXJ0KEludGVybmFsRXJy
b3IsIC0zMjYwMyk7CisgICAgICAgIHNfY29tbW9uRXJyb3JzLmluc2VydChTZXJ2ZXJFcnJvciwg
LTMyMDAwKTsKKyAgICB9CisgICAgQVNTRVJUKGNvZGUgPj0wKTsKKyAgICBBU1NFUlQoKHVuc2ln
bmVkKWNvZGUgPCBzX2NvbW1vbkVycm9ycy5zaXplKCkpOworICAgIEFTU0VSVChzX2NvbW1vbkVy
cm9yc1tjb2RlXSk7CisgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZXJyb3IgPSBJbnNwZWN0
b3JPYmplY3Q6OmNyZWF0ZSgpOworICAgIGVycm9yLT5zZXROdW1iZXIoImNvZGUiLCBzX2NvbW1v
bkVycm9yc1tjb2RlXSk7CisgICAgZXJyb3ItPnNldFN0cmluZygibWVzc2FnZSIsIGVycm9yTWVz
c2FnZSk7CisgICAgQVNTRVJUKGVycm9yKTsKKyAgICBpZiAoZGF0YSkKKyAgICAgICAgZXJyb3It
PnNldEFycmF5KCJkYXRhIiwgZGF0YSk7CisgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbWVz
c2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CisgICAgbWVzc2FnZS0+c2V0T2JqZWN0
KCJlcnJvciIsIGVycm9yKTsKKyAgICBpZiAoY2FsbElkKQorICAgICAgICBtZXNzYWdlLT5zZXRO
dW1iZXIoImlkIiwgKmNhbGxJZCk7CisgICAgZWxzZQorICAgICAgICBtZXNzYWdlLT5zZXRWYWx1
ZSgiaWQiLCBJbnNwZWN0b3JWYWx1ZTo6bnVsbCgpKTsKKyAgICBpZiAobV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCisgICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVz
c2FnZVRvRnJvbnRlbmQobWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOworfQorCit0ZW1wbGF0ZTx0
eXBlbmFtZSBSLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBWMD4KK1IgSW5zcGVjdG9yQmFja2VuZERp
c3BhdGNoZXJJbXBsOjpnZXRQcm9wZXJ0eVZhbHVlSW1wbChJbnNwZWN0b3JPYmplY3QqIG9iamVj
dCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSog
cHJvdG9jb2xFcnJvcnMsIFYwIGluaXRpYWxfdmFsdWUsIGJvb2wgKCphc19tZXRob2QpKEluc3Bl
Y3RvclZhbHVlKiwgViopLCBjb25zdCBjaGFyKiB0eXBlX25hbWUpCit7CisgICAgQVNTRVJUKHBy
b3RvY29sRXJyb3JzKTsKKworICAgIGlmICh2YWx1ZUZvdW5kKQorICAgICAgICAqdmFsdWVGb3Vu
ZCA9IGZhbHNlOworCisgICAgViB2YWx1ZSA9IGluaXRpYWxfdmFsdWU7CisKKyAgICBpZiAoIW9i
amVjdCkgeworICAgICAgICBpZiAoIXZhbHVlRm91bmQpIHsKKyAgICAgICAgICAgIC8vIFJlcXVp
cmVkIHBhcmFtZXRlciBpbiBtaXNzaW5nIHBhcmFtcyBjb250YWluZXIuCisgICAgICAgICAgICBw
cm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZvcm1hdCgiJ3BhcmFtcycgb2JqZWN0
IG11c3QgY29udGFpbiByZXF1aXJlZCBwYXJhbWV0ZXIgJyVzJyB3aXRoIHR5cGUgJyVzJy4iLCBu
YW1lLnV0ZjgoKS5kYXRhKCksIHR5cGVfbmFtZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVy
biB2YWx1ZTsKKyAgICB9CisKKyAgICBJbnNwZWN0b3JPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVu
ZCA9IG9iamVjdC0+ZW5kKCk7CisgICAgSW5zcGVjdG9yT2JqZWN0Ojpjb25zdF9pdGVyYXRvciB2
YWx1ZUl0ZXJhdG9yID0gb2JqZWN0LT5maW5kKG5hbWUpOworCisgICAgaWYgKHZhbHVlSXRlcmF0
b3IgPT0gZW5kKSB7CisgICAgICAgIGlmICghdmFsdWVGb3VuZCkKKyAgICAgICAgICAgIHByb3Rv
Y29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6Zm9ybWF0KCJQYXJhbWV0ZXIgJyVzJyB3aXRo
IHR5cGUgJyVzJyB3YXMgbm90IGZvdW5kLiIsIG5hbWUudXRmOCgpLmRhdGEoKSwgdHlwZV9uYW1l
KSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBpZiAoIWFzX21ldGhvZCh2
YWx1ZUl0ZXJhdG9yLT52YWx1ZS5nZXQoKSwgJnZhbHVlKSkKKyAgICAgICAgcHJvdG9jb2xFcnJv
cnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQoIlBhcmFtZXRlciAnJXMnIGhhcyB3cm9uZyB0
eXBlLiBJdCBtdXN0IGJlICclcycuIiwgbmFtZS51dGY4KCkuZGF0YSgpLCB0eXBlX25hbWUpKTsK
KyAgICBlbHNlCisgICAgICAgIGlmICh2YWx1ZUZvdW5kKQorICAgICAgICAgICAgKnZhbHVlRm91
bmQgPSB0cnVlOworICAgIHJldHVybiB2YWx1ZTsKK30KKworc3RydWN0IEFzTWV0aG9kQnJpZGdl
cyB7CisgICAgc3RhdGljIGJvb2wgYXNJbnQoSW5zcGVjdG9yVmFsdWUqIHZhbHVlLCBpbnQqIG91
dHB1dCkgeyByZXR1cm4gdmFsdWUtPmFzTnVtYmVyKG91dHB1dCk7IH0KKyAgICBzdGF0aWMgYm9v
bCBhc0RvdWJsZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUsIGRvdWJsZSogb3V0cHV0KSB7IHJldHVy
biB2YWx1ZS0+YXNOdW1iZXIob3V0cHV0KTsgfQorICAgIHN0YXRpYyBib29sIGFzU3RyaW5nKElu
c3BlY3RvclZhbHVlKiB2YWx1ZSwgU3RyaW5nKiBvdXRwdXQpIHsgcmV0dXJuIHZhbHVlLT5hc1N0
cmluZyhvdXRwdXQpOyB9CisgICAgc3RhdGljIGJvb2wgYXNCb29sZWFuKEluc3BlY3RvclZhbHVl
KiB2YWx1ZSwgYm9vbCogb3V0cHV0KSB7IHJldHVybiB2YWx1ZS0+YXNCb29sZWFuKG91dHB1dCk7
IH0KKyAgICBzdGF0aWMgYm9vbCBhc09iamVjdChJbnNwZWN0b3JWYWx1ZSogdmFsdWUsIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+KiBvdXRwdXQpIHsgcmV0dXJuIHZhbHVlLT5hc09iamVjdChvdXRw
dXQpOyB9CisgICAgc3RhdGljIGJvb2wgYXNBcnJheShJbnNwZWN0b3JWYWx1ZSogdmFsdWUsIFJl
ZlB0cjxJbnNwZWN0b3JBcnJheT4qIG91dHB1dCkgeyByZXR1cm4gdmFsdWUtPmFzQXJyYXkob3V0
cHV0KTsgfQorfTsKKworaW50IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6Z2V0SW50
KEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVl
Rm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycykKK3sKKyAgICByZXR1cm4gZ2V0
UHJvcGVydHlWYWx1ZUltcGw8aW50LCBpbnQsIGludD4ob2JqZWN0LCBuYW1lLCB2YWx1ZUZvdW5k
LCBwcm90b2NvbEVycm9ycywgMCwgQXNNZXRob2RCcmlkZ2VzOjphc0ludCwgIk51bWJlciIpOwor
fQorCitkb3VibGUgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpnZXREb3VibGUoSW5z
cGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3Vu
ZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKQoreworICAgIHJldHVybiBnZXRQcm9w
ZXJ0eVZhbHVlSW1wbDxkb3VibGUsIGRvdWJsZSwgZG91YmxlPihvYmplY3QsIG5hbWUsIHZhbHVl
Rm91bmQsIHByb3RvY29sRXJyb3JzLCAwLCBBc01ldGhvZEJyaWRnZXM6OmFzRG91YmxlLCAiTnVt
YmVyIik7Cit9CisKK1N0cmluZyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw6OmdldFN0
cmluZyhJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2
YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpCit7CisgICAgcmV0dXJu
IGdldFByb3BlcnR5VmFsdWVJbXBsPFN0cmluZywgU3RyaW5nLCBTdHJpbmc+KG9iamVjdCwgbmFt
ZSwgdmFsdWVGb3VuZCwgcHJvdG9jb2xFcnJvcnMsICIiLCBBc01ldGhvZEJyaWRnZXM6OmFzU3Ry
aW5nLCAiU3RyaW5nIik7Cit9CisKK2Jvb2wgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBs
OjpnZXRCb29sZWFuKEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUs
IGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycykKK3sKKyAg
ICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZUltcGw8Ym9vbCwgYm9vbCwgYm9vbD4ob2JqZWN0LCBu
YW1lLCB2YWx1ZUZvdW5kLCBwcm90b2NvbEVycm9ycywgZmFsc2UsIEFzTWV0aG9kQnJpZGdlczo6
YXNCb29sZWFuLCAiQm9vbGVhbiIpOworfQorCitQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpnZXRPYmplY3QoSW5zcGVjdG9yT2JqZWN0
KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9y
QXJyYXkqIHByb3RvY29sRXJyb3JzKQoreworICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlSW1w
bDxQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4sIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+LCBJ
bnNwZWN0b3JPYmplY3QqPihvYmplY3QsIG5hbWUsIHZhbHVlRm91bmQsIHByb3RvY29sRXJyb3Jz
LCAwLCBBc01ldGhvZEJyaWRnZXM6OmFzT2JqZWN0LCAiT2JqZWN0Iik7Cit9CisKK1Bhc3NSZWZQ
dHI8SW5zcGVjdG9yQXJyYXk+IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6Z2V0QXJy
YXkoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFs
dWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKQoreworICAgIHJldHVybiBn
ZXRQcm9wZXJ0eVZhbHVlSW1wbDxQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiwgUmVmUHRyPElu
c3BlY3RvckFycmF5PiwgSW5zcGVjdG9yQXJyYXkqPihvYmplY3QsIG5hbWUsIHZhbHVlRm91bmQs
IHByb3RvY29sRXJyb3JzLCAwLCBBc01ldGhvZEJyaWRnZXM6OmFzQXJyYXksICJBcnJheSIpOwor
fQorCitib29sIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpnZXRDb21tYW5kTmFtZShjb25z
dCBTdHJpbmcmIG1lc3NhZ2UsIFN0cmluZyogcmVzdWx0KQoreworICAgIFJlZlB0cjxJbnNwZWN0
b3JWYWx1ZT4gdmFsdWUgPSBJbnNwZWN0b3JWYWx1ZTo6cGFyc2VKU09OKG1lc3NhZ2UpOworICAg
IGlmICghdmFsdWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IG9iamVjdCA9IHZhbHVlLT5hc09iamVjdCgpOworICAgIGlmICghb2JqZWN0KQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIW9iamVjdC0+Z2V0U3RyaW5nKCJtZXRo
b2QiLCByZXN1bHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OkNhbGxiYWNrQmFzZTo6Q2FsbGJhY2tC
YXNlKFBhc3NSZWZQdHI8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsPiBiYWNrZW5kSW1w
bCwgaW50IGlkKQorICAgIDogbV9iYWNrZW5kSW1wbChiYWNrZW5kSW1wbCksIG1faWQoaWQpLCBt
X2FscmVhZHlTZW50KGZhbHNlKSB7fQorCitJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Q2Fs
bGJhY2tCYXNlOjp+Q2FsbGJhY2tCYXNlKCkge30KKwordm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlcjo6Q2FsbGJhY2tCYXNlOjpzZW5kRmFpbHVyZShjb25zdCBFcnJvclN0cmluZyYgZXJy
b3IpCit7CisgICAgQVNTRVJUKGVycm9yLmxlbmd0aCgpKTsKKyAgICBzZW5kSWZBY3RpdmUoMCwg
ZXJyb3IpOworfQorCitib29sIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpDYWxsYmFja0Jh
c2U6OmlzQWN0aXZlKCkKK3sKKyAgICByZXR1cm4gIW1fYWxyZWFkeVNlbnQgJiYgbV9iYWNrZW5k
SW1wbC0+aXNBY3RpdmUoKTsKK30KKwordm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
Q2FsbGJhY2tCYXNlOjpzZW5kSWZBY3RpdmUoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBh
cnRpYWxNZXNzYWdlLCBjb25zdCBFcnJvclN0cmluZyYgaW52b2NhdGlvbkVycm9yKQoreworICAg
IGlmIChtX2FscmVhZHlTZW50KQorICAgICAgICByZXR1cm47CisgICAgbV9iYWNrZW5kSW1wbC0+
c2VuZFJlc3BvbnNlKG1faWQsIHBhcnRpYWxNZXNzYWdlLCBpbnZvY2F0aW9uRXJyb3IpOworICAg
IG1fYWxyZWFkeVNlbnQgPSB0cnVlOworfQorCitDT01QSUxFX0FTU0VSVChzdGF0aWNfY2FzdDxp
bnQ+KEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjprTWV0aG9kTmFtZXNFbnVtU2l6ZSkgPT0g
V1RGX0FSUkFZX0xFTkdUSChJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Y29tbWFuZE5hbWVz
KSwgY29tbWFuZF9uYW1lX2FycmF5X3Byb2JsZW0pOworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZiAvLyBFTkFCTEUoSU5TUEVDVE9SKQorIiIiKQorCitmcm9udGVuZF9jcHAgPSAo
CisiIiIKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIEVOQUJMRShJTlNQRUNUT1IpCisKKyNp
bmNsdWRlICJJbnNwZWN0b3JGcm9udGVuZC5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmlu
Zy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworI2luY2x1ZGUgIkluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbC5oIgorI2luY2x1ZGUgIkluc3BlY3RvclZhbHVlcy5oIgorI2luY2x1
ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0luc3Bl
Y3RvckZyb250ZW5kOjpJbnNwZWN0b3JGcm9udGVuZChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwq
IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKKyAgICA6ICRjb25zdHJ1Y3RvckluaXR7Cit9CisK
KyRtZXRob2RzCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShJ
TlNQRUNUT1IpCisiIiIpCisKK3R5cGVidWlsZGVyX2ggPSAoCisiIiIKKyNpZm5kZWYgSW5zcGVj
dG9yVHlwZUJ1aWxkZXJfaAorI2RlZmluZSBJbnNwZWN0b3JUeXBlQnVpbGRlcl9oCisKKyNpZiBF
TkFCTEUoSU5TUEVDVE9SKQorCisjaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCisjaW5jbHVk
ZSA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK25hbWVzcGFjZSBUeXBlQnVpbGRlciB7CisKK3RlbXBsYXRlPHR5
cGVuYW1lIFQ+CitjbGFzcyBPcHRPdXRwdXQgeworcHVibGljOgorICAgIE9wdE91dHB1dCgpIDog
bV9hc3NpZ25lZChmYWxzZSkgeyB9CisKKyAgICB2b2lkIG9wZXJhdG9yPShUIHZhbHVlKQorICAg
IHsKKyAgICAgICAgbV92YWx1ZSA9IHZhbHVlOworICAgICAgICBtX2Fzc2lnbmVkID0gdHJ1ZTsK
KyAgICB9CisKKyAgICBib29sIGlzQXNzaWduZWQoKSB7IHJldHVybiBtX2Fzc2lnbmVkOyB9CisK
KyAgICBUIGdldFZhbHVlKCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpc0Fzc2lnbmVkKCkpOwor
ICAgICAgICByZXR1cm4gbV92YWx1ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVCBtX3ZhbHVl
OworICAgIGJvb2wgbV9hc3NpZ25lZDsKKworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKE9wdE91
dHB1dCk7Cit9OworCisKKy8vIEEgc21hbGwgdHJhbnNpZW50IHdyYXBwZXIgYXJvdW5kIGludCB0
eXBlLCB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZnVuY2l0b24gcGFyYW1ldGVyIHR5cGUKKy8vIGNs
ZXZlcmx5IGRpc2FsbG93aW5nIEMrKyBpbXBsaWNpdCBjYXN0cyBmcm9tIGZsb2F0IG9yIGRvdWJs
ZS4KK2NsYXNzIEV4YWN0bHlJbnQgeworcHVibGljOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+
CisgICAgRXhhY3RseUludChUIHQpIDogbV92YWx1ZShjYXN0X3RvX2ludDxUPih0KSkge30KKwor
ICAgIEV4YWN0bHlJbnQoKSB7fQorCisgICAgb3BlcmF0b3IgaW50KCkgeyByZXR1cm4gbV92YWx1
ZTsgfQorcHJpdmF0ZToKKyAgICBpbnQgbV92YWx1ZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1l
IFQ+CisgICAgc3RhdGljIGludCBjYXN0X3RvX2ludChUKSB7IHJldHVybiBUOjpkZWZhdWx0X2Nh
c2VfY2FzdF9pc19ub3Rfc3VwcG9ydGVkKCk7IH0KK307CisKK3RlbXBsYXRlPD4KK2lubGluZSBp
bnQgRXhhY3RseUludDo6Y2FzdF90b19pbnQ8aW50PihpbnQgaSkgeyByZXR1cm4gaTsgfQorCit0
ZW1wbGF0ZTw+CitpbmxpbmUgaW50IEV4YWN0bHlJbnQ6OmNhc3RfdG9faW50PHVuc2lnbmVkIGlu
dD4odW5zaWduZWQgaW50IGkpIHsgcmV0dXJuIGk7IH0KKworY2xhc3MgUnVudGltZUNhc3RIZWxw
ZXIgeworcHVibGljOgorI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICB0ZW1wbGF0ZTxJbnNwZWN0
b3JWYWx1ZTo6VHlwZSBUWVBFPgorICAgIHN0YXRpYyB2b2lkIGFzc2VydFR5cGUoSW5zcGVjdG9y
VmFsdWUqIHZhbHVlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKHZhbHVlLT50eXBlKCkgPT0gVFlQ
RSk7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIGFzc2VydEFueShJbnNwZWN0b3JWYWx1ZSopOwor
ICAgIHN0YXRpYyB2b2lkIGFzc2VydEludChJbnNwZWN0b3JWYWx1ZSogdmFsdWUpOworI2VuZGlm
Cit9OworCisKKy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgIlRyYWl0cyIgdHlwZSBmb3IgdGhlIGlu
cHV0IHR5cGUgVC4gSXQgaXMgcHJvZ3JhbW1lZCB1c2luZyBDKysgdGVtcGxhdGUgc3BlY2lhbGl6
YXRpb24KKy8vIHRlY2huaXF1ZS4gQnkgZGVmYXVsdCBpdCBzaW1wbHkgdGFrZXMgIkl0ZW1UcmFp
dHMiIHR5cGUgZnJvbSBULCBidXQgaXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGJhc2UgdHlwZXMu
Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEFycmF5SXRlbUhlbHBlciB7CisgICAgdHlw
ZWRlZiB0eXBlbmFtZSBUOjpJdGVtVHJhaXRzIFRyYWl0czsKK307CisKK3RlbXBsYXRlPHR5cGVu
YW1lIFQ+CitjbGFzcyBBcnJheSA6IHB1YmxpYyBJbnNwZWN0b3JBcnJheUJhc2UgeworcHJpdmF0
ZToKKyAgICBBcnJheSgpIHsgfQorCisgICAgSW5zcGVjdG9yQXJyYXkqIG9wZW5BY2Nlc3NvcnMo
KSB7CisgICAgICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihJbnNwZWN0b3JBcnJheSkgPT0gc2l6
ZW9mKEFycmF5PFQ+KSwgY2Fubm90X2Nhc3QpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
SW5zcGVjdG9yQXJyYXkqPihzdGF0aWNfY2FzdDxJbnNwZWN0b3JBcnJheUJhc2UqPih0aGlzKSk7
CisgICAgfQorCitwdWJsaWM6CisgICAgdm9pZCBhZGRJdGVtKFBhc3NSZWZQdHI8VD4gdmFsdWUp
CisgICAgeworICAgICAgICBBcnJheUl0ZW1IZWxwZXI8VD46OlRyYWl0czo6cHVzaFJlZlB0cih0
aGlzLT5vcGVuQWNjZXNzb3JzKCksIHZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEl0ZW0o
VCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFycmF5SXRlbUhlbHBlcjxUPjo6VHJhaXRzOjpwdXNo
UmF3KHRoaXMtPm9wZW5BY2Nlc3NvcnMoKSwgdmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPEFycmF5PFQ+ID4gY3JlYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9w
dFJlZihuZXcgQXJyYXk8VD4oKSk7CisgICAgfQorCisgICAgc3RhdGljIFBhc3NSZWZQdHI8QXJy
YXk8VD4gPiBydW50aW1lQ2FzdChQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKKyAg
ICB7CisgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gYXJyYXk7CisgICAgICAgIGJvb2wg
Y2FzdFJlcyA9IHZhbHVlLT5hc0FycmF5KCZhcnJheSk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQo
Y2FzdFJlcywgY2FzdFJlcyk7CisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgICAgICBhc3NlcnRD
b3JyZWN0VmFsdWUoYXJyYXkuZ2V0KCkpOworI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVECisg
ICAgICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihBcnJheTxUPikgPT0gc2l6ZW9mKEluc3BlY3Rv
ckFycmF5KSwgdHlwZV9jYXN0X3Byb2JsZW0pOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
QXJyYXk8VD4qPihzdGF0aWNfY2FzdDxJbnNwZWN0b3JBcnJheUJhc2UqPihhcnJheS5nZXQoKSkp
OworICAgIH0KKworI2lmICR2YWxpZGF0b3JJZmRlZk5hbWUKKyAgICBzdGF0aWMgdm9pZCBhc3Nl
cnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQorICAgIHsKKyAgICAgICAgUmVm
UHRyPEluc3BlY3RvckFycmF5PiBhcnJheTsKKyAgICAgICAgYm9vbCBjYXN0UmVzID0gdmFsdWUt
PmFzQXJyYXkoJmFycmF5KTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChjYXN0UmVzLCBjYXN0UmVz
KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGFycmF5LT5sZW5ndGgoKTsgaSsr
KQorICAgICAgICAgICAgQXJyYXlJdGVtSGVscGVyPFQ+OjpUcmFpdHM6OnRlbXBsYXRlIGFzc2Vy
dENvcnJlY3RWYWx1ZTxUPihhcnJheS0+Z2V0KGkpLmdldCgpKTsKKyAgICB9CisKKyNlbmRpZiAv
LyAkdmFsaWRhdG9ySWZkZWZOYW1lCit9OworCitzdHJ1Y3QgU3RydWN0SXRlbVRyYWl0cyB7Cisg
ICAgc3RhdGljIHZvaWQgcHVzaFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yVmFsdWU+IHZhbHVlKQorICAgIHsKKyAgICAgICAgYXJyYXktPnB1c2hWYWx1
ZSh2YWx1ZSk7CisgICAgfQorCisjaWYgJHZhbGlkYXRvcklmZGVmTmFtZQorICAgIHRlbXBsYXRl
PHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3Rv
clZhbHVlKiB2YWx1ZSkgeworICAgICAgICBUOjphc3NlcnRDb3JyZWN0VmFsdWUodmFsdWUpOwor
ICAgIH0KKyNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAorfTsKKwordGVtcGxhdGU8Pgorc3Ry
dWN0IEFycmF5SXRlbUhlbHBlcjxTdHJpbmc+IHsKKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAgICAg
ICAgc3RhdGljIHZvaWQgcHVzaFJhdyhJbnNwZWN0b3JBcnJheSogYXJyYXksIGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFycmF5LT5wdXNoU3RyaW5nKHZhbHVl
KTsKKyAgICAgICAgfQorCisjaWYgJHZhbGlkYXRvcklmZGVmTmFtZQorICAgICAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5z
cGVjdG9yVmFsdWUqIHZhbHVlKSB7CisgICAgICAgICAgICBSdW50aW1lQ2FzdEhlbHBlcjo6YXNz
ZXJ0VHlwZTxJbnNwZWN0b3JWYWx1ZTo6VHlwZVN0cmluZz4odmFsdWUpOworICAgICAgICB9Cisj
ZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKKyAgICB9OworfTsKKwordGVtcGxhdGU8Pgorc3Ry
dWN0IEFycmF5SXRlbUhlbHBlcjxpbnQ+IHsKKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAgICAgICAg
c3RhdGljIHZvaWQgcHVzaFJhdyhJbnNwZWN0b3JBcnJheSogYXJyYXksIGludCB2YWx1ZSkKKyAg
ICAgICAgeworICAgICAgICAgICAgYXJyYXktPnB1c2hJbnQodmFsdWUpOworICAgICAgICB9CisK
KyNpZiAkdmFsaWRhdG9ySWZkZWZOYW1lCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Cisg
ICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFs
dWUpIHsKKyAgICAgICAgICAgIFJ1bnRpbWVDYXN0SGVscGVyOjphc3NlcnRJbnQodmFsdWUpOwor
ICAgICAgICB9CisjZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKKyAgICB9OworfTsKKwordGVt
cGxhdGU8Pgorc3RydWN0IEFycmF5SXRlbUhlbHBlcjxkb3VibGU+IHsKKyAgICBzdHJ1Y3QgVHJh
aXRzIHsKKyAgICAgICAgc3RhdGljIHZvaWQgcHVzaFJhdyhJbnNwZWN0b3JBcnJheSogYXJyYXks
IGRvdWJsZSB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJyYXktPnB1c2hOdW1iZXIo
dmFsdWUpOworICAgICAgICB9CisKKyNpZiAkdmFsaWRhdG9ySWZkZWZOYW1lCisgICAgICAgIHRl
bXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1
ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKKyAgICAgICAgICAgIFJ1bnRpbWVDYXN0SGVscGVy
Ojphc3NlcnRUeXBlPEluc3BlY3RvclZhbHVlOjpUeXBlTnVtYmVyPih2YWx1ZSk7CisgICAgICAg
IH0KKyNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAorICAgIH07Cit9OworCit0ZW1wbGF0ZTw+
CitzdHJ1Y3QgQXJyYXlJdGVtSGVscGVyPGJvb2w+IHsKKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAg
ICAgICAgc3RhdGljIHZvaWQgcHVzaFJhdyhJbnNwZWN0b3JBcnJheSogYXJyYXksIGJvb2wgdmFs
dWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFycmF5LT5wdXNoQm9vbGVhbih2YWx1ZSk7Cisg
ICAgICAgIH0KKworI2lmICR2YWxpZGF0b3JJZmRlZk5hbWUKKyAgICAgICAgdGVtcGxhdGU8dHlw
ZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3Rv
clZhbHVlKiB2YWx1ZSkgeworICAgICAgICAgICAgUnVudGltZUNhc3RIZWxwZXI6OmFzc2VydFR5
cGU8SW5zcGVjdG9yVmFsdWU6OlR5cGVCb29sZWFuPih2YWx1ZSk7CisgICAgICAgIH0KKyNlbmRp
ZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAorICAgIH07Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3Qg
QXJyYXlJdGVtSGVscGVyPEluc3BlY3RvclZhbHVlPiB7CisgICAgc3RydWN0IFRyYWl0cyB7Cisg
ICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSZWZQdHIoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBQYXNz
UmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJy
YXktPnB1c2hWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKworI2lmICR2YWxpZGF0b3JJZmRlZk5h
bWUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHZvaWQgYXNz
ZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgeworICAgICAgICAgICAgUnVu
dGltZUNhc3RIZWxwZXI6OmFzc2VydEFueSh2YWx1ZSk7CisgICAgICAgIH0KKyNlbmRpZiAgLy8g
IUFTU0VSVF9ESVNBQkxFRAorICAgIH07Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQXJyYXlJ
dGVtSGVscGVyPEluc3BlY3Rvck9iamVjdD4geworICAgIHN0cnVjdCBUcmFpdHMgeworICAgICAg
ICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRyKEluc3BlY3RvckFycmF5KiBhcnJheSwgUGFzc1JlZlB0
cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFycmF5LT5w
dXNoVmFsdWUodmFsdWUpOworICAgICAgICB9CisKKyNpZiAkdmFsaWRhdG9ySWZkZWZOYW1lCisg
ICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENv
cnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKKyAgICAgICAgICAgIFJ1bnRpbWVD
YXN0SGVscGVyOjphc3NlcnRUeXBlPEluc3BlY3RvclZhbHVlOjpUeXBlT2JqZWN0Pih2YWx1ZSk7
CisgICAgICAgIH0KKyNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAorICAgIH07Cit9OworCit0
ZW1wbGF0ZTw+CitzdHJ1Y3QgQXJyYXlJdGVtSGVscGVyPEluc3BlY3RvckFycmF5PiB7CisgICAg
c3RydWN0IFRyYWl0cyB7CisgICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSZWZQdHIoSW5zcGVjdG9y
QXJyYXkqIGFycmF5LCBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKKyAgICAgICAg
eworICAgICAgICAgICAgYXJyYXktPnB1c2hBcnJheSh2YWx1ZSk7CisgICAgICAgIH0KKworI2lm
ICR2YWxpZGF0b3JJZmRlZk5hbWUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAg
ICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkg
eworICAgICAgICAgICAgUnVudGltZUNhc3RIZWxwZXI6OmFzc2VydFR5cGU8SW5zcGVjdG9yVmFs
dWU6OlR5cGVBcnJheT4odmFsdWUpOworICAgICAgICB9CisjZW5kaWYgIC8vICFBU1NFUlRfRElT
QUJMRUQKKyAgICB9OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBBcnJheUl0
ZW1IZWxwZXI8VHlwZUJ1aWxkZXI6OkFycmF5PFQ+ID4geworICAgIHN0cnVjdCBUcmFpdHMgewor
ICAgICAgICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRyKEluc3BlY3RvckFycmF5KiBhcnJheSwgUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VD4gPiB2YWx1ZSkKKyAgICAgICAgeworICAgICAg
ICAgICAgYXJyYXktPnB1c2hWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKworI2lmICR2YWxpZGF0
b3JJZmRlZk5hbWUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgc3RhdGlj
IHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgeworICAgICAg
ICAgICAgUzo6YXNzZXJ0Q29ycmVjdFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorI2VuZGlmICAv
LyAhQVNTRVJUX0RJU0FCTEVECisgICAgfTsKK307CisKKyR7Zm9yd2FyZHN9CisKK1N0cmluZyBn
ZXRFbnVtQ29uc3RhbnRWYWx1ZShpbnQgY29kZSk7CisKKyR7dHlwZUJ1aWxkZXJzfQorfSAvLyBu
YW1lc3BhY2UgVHlwZUJ1aWxkZXIKKworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBFTkFCTEUoSU5TUEVDVE9SKQorCisjZW5kaWYgLy8gIWRlZmluZWQoSW5zcGVjdG9yVHlw
ZUJ1aWxkZXJfaCkKKworIiIiKQorCit0eXBlYnVpbGRlcl9jcHAgPSAoCisiIiIKKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2lmIEVOQUJMRShJTlNQRUNUT1IpCisKKyNpbmNsdWRlICJJbnNwZWN0
b3JUeXBlQnVpbGRlci5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCituYW1lc3BhY2UgVHlwZUJ1aWxkZXIgeworCitjb25zdCBjaGFyKiBj
b25zdCBlbnVtX2NvbnN0YW50X3ZhbHVlc1tdID0geworJGVudW1Db25zdGFudFZhbHVlc307CisK
K1N0cmluZyBnZXRFbnVtQ29uc3RhbnRWYWx1ZShpbnQgY29kZSkgeworICAgIHJldHVybiBlbnVt
X2NvbnN0YW50X3ZhbHVlc1tjb2RlXTsKK30KKworfSAvLyBuYW1lc3BhY2UgVHlwZUJ1aWxkZXIK
KworJGltcGxDb2RlCisKKyNpZiAkdmFsaWRhdG9ySWZkZWZOYW1lCisKK3ZvaWQgVHlwZUJ1aWxk
ZXI6OlJ1bnRpbWVDYXN0SGVscGVyOjphc3NlcnRBbnkoSW5zcGVjdG9yVmFsdWUqKQoreworICAg
IC8vIE5vLW9wLgorfQorCisKK3ZvaWQgVHlwZUJ1aWxkZXI6OlJ1bnRpbWVDYXN0SGVscGVyOjph
c3NlcnRJbnQoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQoreworICAgIGRvdWJsZSB2OworICAgIGJv
b2wgY2FzdFJlcyA9IHZhbHVlLT5hc051bWJlcigmdik7CisgICAgQVNTRVJUX1VOVVNFRChjYXN0
UmVzLCBjYXN0UmVzKTsKKyAgICBBU1NFUlQoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGF0aWNfY2Fz
dDxpbnQ+KHYpKSA9PSB2KTsKK30KKworJHZhbGlkYXRvckNvZGUKKworI2VuZGlmIC8vICR2YWxp
ZGF0b3JJZmRlZk5hbWUKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5B
QkxFKElOU1BFQ1RPUikKKyIiIikKKworYmFja2VuZF9qcyA9ICgKKyIiIgorCiskZG9tYWluSW5p
dGlhbGl6ZXJzCisiIiIpCisKK3BhcmFtX2NvbnRhaW5lcl9hY2Nlc3NfY29kZSA9ICIiIgorICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc0NvbnRhaW5lciA9IHJlcXVlc3RNZXNzYWdl
T2JqZWN0LT5nZXRPYmplY3QoInBhcmFtcyIpOworICAgIEluc3BlY3Rvck9iamVjdCogcGFyYW1z
Q29udGFpbmVyUHRyID0gcGFyYW1zQ29udGFpbmVyLmdldCgpOworICAgIEluc3BlY3RvckFycmF5
KiBwcm90b2NvbEVycm9yc1B0ciA9IHByb3RvY29sRXJyb3JzLmdldCgpOworIiIiCisKK2NsYXNz
X2JpbmRpbmdfYnVpbGRlcl9wYXJ0XzEgPSAoCisiIiIgICAgICAgIEFsbEZpZWxkc1NldCA9ICVz
CisgICAgfTsKKworICAgIHRlbXBsYXRlPGludCBTVEFURT4KKyAgICBjbGFzcyBCdWlsZGVyIHsK
KyAgICBwcml2YXRlOgorICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
KworICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBCdWls
ZGVyKFBhc3NSZWZQdHI8LyolcyovSW5zcGVjdG9yT2JqZWN0PiBwdHIpCisgICAgICAgIHsKKyAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2Ny
ZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOworICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7Cisg
ICAgICAgIH0KKyAgICAgICAgZnJpZW5kIGNsYXNzICVzOworICAgIHB1YmxpYzoKKyIiIikKKwor
Y2xhc3NfYmluZGluZ19idWlsZGVyX3BhcnRfMiA9ICgiIiIKKyAgICAgICAgQnVpbGRlcjxTVEFU
RSB8ICVzPiYgc2V0JXMoJXMgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiAlcyksIHByb3BlcnR5XyVzX2FscmVhZHlfc2V0KTsKKyAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXQlcygiJXMiLCAlcyk7CisgICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPCVzPigpOworICAgICAgICB9CisiIiIpCisKK2NsYXNzX2JpbmRpbmdfYnVpbGRlcl9wYXJ0
XzMgPSAoIiIiCisgICAgICAgIG9wZXJhdG9yIFJlZlB0cjwlcz4mICgpCisgICAgICAgIHsKKyAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7CisgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChzaXplb2YoJXMpID09IHNp
emVvZihJbnNwZWN0b3JPYmplY3QpLCBjYW5ub3RfY2FzdCk7CisgICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPCVzPio+KCZtX3Jlc3VsdCk7CisgICAgICAgIH0KKwor
ICAgICAgICBQYXNzUmVmUHRyPCVzPiByZWxlYXNlKCkKKyAgICAgICAgeworICAgICAgICAgICAg
cmV0dXJuIFJlZlB0cjwlcz4oKnRoaXMpLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH07CisK
KyIiIikKKworY2xhc3NfYmluZGluZ19idWlsZGVyX3BhcnRfNCA9ICgKKyIiIiAgICBzdGF0aWMg
QnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpKTsKKyAgICB9CisiIiIp
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>189164</attachid>
            <date>2013-02-19 14:28:50 -0800</date>
            <delta_ts>2013-02-21 04:39:30 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-110159-20130220022512.patch</filename>
            <type>text/plain</type>
            <size>67376</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQzMjcwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTA5YjlhNTNmYjBjOWNk
NzVhOGJkNjZlM2UyYTk1MWQyY2I5NDVhZC4uM2RhYTc2YThmMThjZDUyNzNjZGI4MDJmZTQ4YTBh
NjFhZTE0YTRkMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM1IEBACisyMDEzLTAyLTE4ICBQZXRl
ciBSeWJpbiAgPHByeWJpbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgV2ViIEluc3BlY3Rvcjog
dGFrZSBsYXJnZSBzdHJpbmdzIG91dCBvZiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5CisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTAxNTkKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBQeXRob24gc2NyaXB0
IGlzIHJlZmFjdG9yZWQuCisKKyAgICAgICAgKiBpbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3Bl
Y3Rvci5weToKKyAgICAgICAgKiBpbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmlu
Z3MucHk6IEFkZGVkLgorICAgICAgICAoSW5zcGVjdG9yRnJvbnRlbmRfaCk6CisgICAgICAgIChJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwpOgorICAgICAgICAoSW5zcGVjdG9yQXJyYXkpOgorICAg
ICAgICAoSW5zcGVjdG9yT2JqZWN0KToKKyAgICAgICAgKFN0cmluZyk6CisgICAgICAgIChJbnNw
ZWN0b3JGcm9udGVuZCk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcl9oKToK
KyAgICAgICAgKEluc3BlY3RvckFnZW50KToKKyAgICAgICAgKEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVySW1wbCk6CisgICAgICAgIChJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcik6CisgICAg
ICAgIChDYWxsYmFja0Jhc2UpOgorICAgICAgICAodm9pZCk6CisgICAgICAgIChIYXNoTWFwKToK
KyAgICAgICAgKE9wdE91dHB1dCk6CisgICAgICAgIChFeGFjdGx5SW50KToKKyAgICAgICAgKFJ1
bnRpbWVDYXN0SGVscGVyKToKKyAgICAgICAgKHByb3ZpZGVzKToKKyAgICAgICAgKHR5cGVuYW1l
KToKKyAgICAgICAgKEFycmF5KToKKyAgICAgICAgKEJ1aWxkZXIpOgorCiAyMDEzLTAyLTE4ICBE
YXZpZCBLaWx6ZXIgIDxkZGtpbHplckBhcHBsZS5jb20+CiAKICAgICAgICAgRml4IFdlYkNvcmUg
WGNvZGUgcHJvamVjdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVH
ZW5lcmF0b3JJbnNwZWN0b3IucHkgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVy
YXRvckluc3BlY3Rvci5weQppbmRleCA2MjlmYTAzOTBlYzgxMzUwZTk4MDM1NDgwOTA0NDFmZGNk
NWY0ZTRhLi5hNDBhNTc1NzNhYTVhNGZkZmI0YjRkNTBmNWZjMDk2YTY4NDg3NzFlIDEwMDc1NQot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5weQor
KysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRvckluc3BlY3Rvci5weQpA
QCAtMzcsNiArMzcsOCBAQCB0cnk6CiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgaW1wb3J0IHNp
bXBsZWpzb24gYXMganNvbgogCitpbXBvcnQgQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MK
KwogCiBET01BSU5fREVGSU5FX05BTUVfTUFQID0gewogICAgICJEYXRhYmFzZSI6ICJTUUxfREFU
QUJBU0UiLApAQCAtMTE4MywyOCArMTE4NSw4IEBAIGNsYXNzIFR5cGVCaW5kaW5nczoKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGFsbF9maWVsZHNfc2V0X3ZhbHVlID0gIjAiCiAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmVfbXVsdGlsaW5lKAotIiIiICAgICAgICBB
bGxGaWVsZHNTZXQgPSAlcwotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+Ci0gICAg
Y2xhc3MgQnVpbGRlciB7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gbV9yZXN1bHQ7Ci0KLSAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwotICAgICAgICB9
Ci0KLSAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPC8qJXMqL0luc3BlY3Rvck9iamVjdD4gcHRy
KQotICAgICAgICB7Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxk
c1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKLSAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwotICAgICAgICB9Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAlczsKLSAgICBw
dWJsaWM6Ci0iIiIgJSAoYWxsX2ZpZWxkc19zZXRfdmFsdWUsIGNsYXNzX25hbWUsIGNsYXNzX25h
bWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZV9tdWx0
aWxpbmUoQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MuY2xhc3NfYmluZGluZ19idWlsZGVy
X3BhcnRfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJSAoYWxsX2ZpZWxkc19zZXRfdmFsdWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUp
KQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IDAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZm9yIHByb3BfZGF0YSBpbiByZXNvbHZlX2RhdGEubWFpbl9w
cm9wZXJ0aWVzOgpAQCAtMTIxMyw0MCArMTE5NSwxOSBAQCBjbGFzcyBUeXBlQmluZGluZ3M6CiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV90eXBlX2JpbmRpbmcgPSBw
cm9wX2RhdGEucGFyYW1fdHlwZV9iaW5kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBwYXJhbV9yYXdfdHlwZSA9IHBhcmFtX3R5cGVfYmluZGluZy5yZWR1Y2VfdG9fcmF3
X3R5cGUoKQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3
bGluZV9tdWx0aWxpbmUoIiIiCi0gICAgICAgIEJ1aWxkZXI8U1RBVEUgfCAlcz4mIHNldCVzKCVz
IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
JXMpLCBwcm9wZXJ0eV8lc19hbHJlYWR5X3NldCk7Ci0gICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
JXMoIiVzIiwgJXMpOwotICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTwlcz4oKTsKLSAgICAg
ICAgfQotIiIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzdGF0ZV9l
bnVtX2l0ZW1zW3Bvc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBD
YXBpdGFsaXplci5sb3dlcl9jYW1lbF9jYXNlX3RvX3VwcGVyKHByb3BfbmFtZSksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV90eXBlX2JpbmRpbmcuZ2V0X3R5
cGVfbW9kZWwoKS5nZXRfaW5wdXRfcGFyYW1fdHlwZV90ZXh0KCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9lbnVtX2l0ZW1zW3Bvc10sIHByb3BfbmFtZSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3Jhd190eXBlLmdl
dF9zZXR0ZXJfbmFtZSgpLCBwcm9wX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmb3JtYXRfc2V0dGVyX3ZhbHVlX2V4cHJlc3Npb24ocGFyYW1fdHlwZV9iaW5k
aW5nLCAidmFsdWUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRlX2VudW1faXRlbXNbcG9zXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3cml0ZXIubmV3bGluZV9tdWx0aWxpbmUoQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3Mu
Y2xhc3NfYmluZGluZ19idWlsZGVyX3BhcnRfMgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICUgKHN0YXRlX2VudW1faXRlbXNbcG9zXSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBpdGFsaXplci5sb3dlcl9jYW1lbF9jYXNlX3Rv
X3VwcGVyKHByb3BfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcGFyYW1fdHlwZV9iaW5kaW5nLmdldF90eXBlX21vZGVsKCkuZ2V0X2lucHV0X3BhcmFt
X3R5cGVfdGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRlX2VudW1faXRlbXNbcG9zXSwgcHJvcF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3Jhd190eXBlLmdldF9zZXR0ZXJfbmFtZSgpLCBw
cm9wX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9y
bWF0X3NldHRlcl92YWx1ZV9leHByZXNzaW9uKHBhcmFtX3R5cGVfYmluZGluZywgInZhbHVlIiks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfZW51bV9p
dGVtc1twb3NdKSkKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9
IDEKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZV9tdWx0
aWxpbmUoIiIiCi0gICAgICAgIG9wZXJhdG9yIFJlZlB0cjwlcz4mICgpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChzaXplb2YoJXMpID09IHNp
emVvZihJbnNwZWN0b3JPYmplY3QpLCBjYW5ub3RfY2FzdCk7Ci0gICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPCVzPio+KCZtX3Jlc3VsdCk7Ci0gICAgICAgIH0KLQot
ICAgICAgICBQYXNzUmVmUHRyPCVzPiByZWxlYXNlKCkKLSAgICAgICAgewotICAgICAgICAgICAg
cmV0dXJuIFJlZlB0cjwlcz4oKnRoaXMpLnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH07Ci0K
LSIiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChjbGFzc19uYW1lLCBjbGFz
c19uYW1lLCBjbGFzc19uYW1lLCBjbGFzc19uYW1lLCBjbGFzc19uYW1lKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmVfbXVsdGlsaW5lKENvZGVHZW5lcmF0
b3JJbnNwZWN0b3JTdHJpbmdzLmNsYXNzX2JpbmRpbmdfYnVpbGRlcl9wYXJ0XzMKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGNsYXNz
X25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUsIGNsYXNzX25hbWUpKQog
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAgLypc
biIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAg
ICogU3ludGhldGljIGNvbnN0cnVjdG9yOlxuIikKQEAgLTEyNTUsMTIgKzEyMTYsNyBAQCBjbGFz
cyBUeXBlQmluZGluZ3M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0
ZXIuYXBwZW5kX211bHRpbGluZSgiXG4gICAgICogICAgIC5zZXQlcyguLi4pIiAlIENhcGl0YWxp
emVyLmxvd2VyX2NhbWVsX2Nhc2VfdG9fdXBwZXIocHJvcF9kYXRhLnBbIm5hbWUiXSkpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmRfbXVsdGlsaW5lKCI7XG4g
ICAgICovXG4iKQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXds
aW5lX211bHRpbGluZSgKLSIiIiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRl
KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpKTsKLSAgICB9Ci0iIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHdyaXRlci5uZXdsaW5lX211bHRpbGluZShDb2RlR2VuZXJhdG9ySW5zcGVjdG9yU3Ry
aW5ncy5jbGFzc19iaW5kaW5nX2J1aWxkZXJfcGFydF80KQogCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAgdHlwZWRlZiBUeXBlQnVpbGRlcjo6U3Ry
dWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzO1xuIikKIApAQCAtMTc1MCw4NzYgKzE3MDYsMjEgQEAg
Y2xhc3MgVGVtcGxhdGVzOgogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KICIiIikKIAor
ICAgIGZyb250ZW5kX2RvbWFpbl9jbGFzcyA9IHN0cmluZy5UZW1wbGF0ZShDb2RlR2VuZXJhdG9y
SW5zcGVjdG9yU3RyaW5ncy5mcm9udGVuZF9kb21haW5fY2xhc3MpCisgICAgYmFja2VuZF9tZXRo
b2QgPSBzdHJpbmcuVGVtcGxhdGUoQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MuYmFja2Vu
ZF9tZXRob2QpCisgICAgZnJvbnRlbmRfbWV0aG9kID0gc3RyaW5nLlRlbXBsYXRlKENvZGVHZW5l
cmF0b3JJbnNwZWN0b3JTdHJpbmdzLmZyb250ZW5kX21ldGhvZCkKKyAgICBjYWxsYmFja19tZXRo
b2QgPSBzdHJpbmcuVGVtcGxhdGUoQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MuY2FsbGJh
Y2tfbWV0aG9kKQorICAgIGZyb250ZW5kX2ggPSBzdHJpbmcuVGVtcGxhdGUoZmlsZV9oZWFkZXJf
ICsgQ29kZUdlbmVyYXRvckluc3BlY3RvclN0cmluZ3MuZnJvbnRlbmRfaCkKKyAgICBiYWNrZW5k
X2ggPSBzdHJpbmcuVGVtcGxhdGUoZmlsZV9oZWFkZXJfICsgQ29kZUdlbmVyYXRvckluc3BlY3Rv
clN0cmluZ3MuYmFja2VuZF9oKQorICAgIGJhY2tlbmRfY3BwID0gc3RyaW5nLlRlbXBsYXRlKGZp
bGVfaGVhZGVyXyArIENvZGVHZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdzLmJhY2tlbmRfY3BwKQor
ICAgIGZyb250ZW5kX2NwcCA9IHN0cmluZy5UZW1wbGF0ZShmaWxlX2hlYWRlcl8gKyBDb2RlR2Vu
ZXJhdG9ySW5zcGVjdG9yU3RyaW5ncy5mcm9udGVuZF9jcHApCisgICAgdHlwZWJ1aWxkZXJfaCA9
IHN0cmluZy5UZW1wbGF0ZShmaWxlX2hlYWRlcl8gKyBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yU3Ry
aW5ncy50eXBlYnVpbGRlcl9oKQorICAgIHR5cGVidWlsZGVyX2NwcCA9IHN0cmluZy5UZW1wbGF0
ZShmaWxlX2hlYWRlcl8gKyBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yU3RyaW5ncy50eXBlYnVpbGRl
cl9jcHApCisgICAgYmFja2VuZF9qcyA9IHN0cmluZy5UZW1wbGF0ZShmaWxlX2hlYWRlcl8gKyBD
b2RlR2VuZXJhdG9ySW5zcGVjdG9yU3RyaW5ncy5iYWNrZW5kX2pzKQorICAgIHBhcmFtX2NvbnRh
aW5lcl9hY2Nlc3NfY29kZSA9IENvZGVHZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdzLnBhcmFtX2Nv
bnRhaW5lcl9hY2Nlc3NfY29kZQogCiAKLSAgICBmcm9udGVuZF9kb21haW5fY2xhc3MgPSBzdHJp
bmcuVGVtcGxhdGUoCi0iIiIgICAgY2xhc3MgJGRvbWFpbkNsYXNzTmFtZSB7Ci0gICAgcHVibGlj
OgotICAgICAgICAkZG9tYWluQ2xhc3NOYW1lKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9Ci0ke2Zyb250ZW5kRG9tYWluTWV0aG9kRGVjbGFyYXRp
b25zfSAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KLSAgICAgICAgSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVy
biBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7Ci0gICAg
fTsKLQotICAgICRkb21haW5DbGFzc05hbWUqICRkb21haW5GaWVsZE5hbWUoKSB7IHJldHVybiAm
bV8kZG9tYWluRmllbGROYW1lOyB9Ci0KLSIiIikKLQotICAgIGJhY2tlbmRfbWV0aG9kID0gc3Ry
aW5nLlRlbXBsYXRlKAotIiIidm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw6OiR7
ZG9tYWluTmFtZX1fJG1ldGhvZE5hbWUobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVjdCokcmVx
dWVzdE1lc3NhZ2VPYmplY3QpCi17Ci0gICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBwcm90b2Nv
bEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKLQotICAgIGlmICghJGFnZW50Rmll
bGQpCi0gICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKCIke2RvbWFpbk5hbWV9IGhh
bmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKLSRtZXRob2RPdXRDb2RlCi0kbWV0aG9kSW5Db2Rl
Ci0gICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzdWx0ID0gSW5zcGVjdG9yT2JqZWN0Ojpj
cmVhdGUoKTsKLSAgICBFcnJvclN0cmluZyBlcnJvcjsKLSAgICBpZiAoIXByb3RvY29sRXJyb3Jz
LT5sZW5ndGgoKSkgewotICAgICAgICAkYWdlbnRGaWVsZC0+JG1ldGhvZE5hbWUoJmVycm9yJGFn
ZW50Q2FsbFBhcmFtcyk7Ci0KLSR7cmVzcG9uc2VDb29rfQotICAgIH0KLSAgICBzZW5kUmVzcG9u
c2UoY2FsbElkLCByZXN1bHQsIGNvbW1hbmROYW1lc1skY29tbWFuZE5hbWVJbmRleF0sIHByb3Rv
Y29sRXJyb3JzLCBlcnJvcik7Ci19Ci0iIiIpCi0KLSAgICBmcm9udGVuZF9tZXRob2QgPSBzdHJp
bmcuVGVtcGxhdGUoIiIidm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6JGRvbWFpbk5hbWU6OiRldmVu
dE5hbWUoJHBhcmFtZXRlcnMpCi17Ci0gICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4ganNvbk1l
c3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwotICAgIGpzb25NZXNzYWdlLT5zZXRT
dHJpbmcoIm1ldGhvZCIsICIkZG9tYWluTmFtZS4kZXZlbnROYW1lIik7Ci0kY29kZSAgICBpZiAo
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCi0gICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoanNvbk1lc3NhZ2UtPnRvSlNPTlN0cmluZygp
KTsKLX0KLSIiIikKLQotICAgIGNhbGxiYWNrX21ldGhvZCA9IHN0cmluZy5UZW1wbGF0ZSgKLSIi
Ikluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjokYWdlbnROYW1lOjokY2FsbGJhY2tOYW1lOjok
Y2FsbGJhY2tOYW1lKFBhc3NSZWZQdHI8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsPiBi
YWNrZW5kSW1wbCwgaW50IGlkKSA6IENhbGxiYWNrQmFzZShiYWNrZW5kSW1wbCwgaWQpIHt9Ci0K
LXZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OiRhZ2VudE5hbWU6OiRjYWxsYmFja05h
bWU6OnNlbmRTdWNjZXNzKCRwYXJhbWV0ZXJzKQotewotICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IGpzb25NZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKLSRjb2RlICAgIHNl
bmRJZkFjdGl2ZShqc29uTWVzc2FnZSwgRXJyb3JTdHJpbmcoKSk7Ci19Ci0iIiIpCi0KLSAgICBm
cm9udGVuZF9oID0gc3RyaW5nLlRlbXBsYXRlKGZpbGVfaGVhZGVyXyArCi0iIiIjaWZuZGVmIElu
c3BlY3RvckZyb250ZW5kX2gKLSNkZWZpbmUgSW5zcGVjdG9yRnJvbnRlbmRfaAotCi0jaW5jbHVk
ZSAiSW5zcGVjdG9yVHlwZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JWYWx1ZXMuaCIK
LSNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmlu
Zy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbDsKLQotLy8gQm90aCBJbnNwZWN0b3JPYmplY3QgYW5kIEluc3BlY3RvckFycmF5IG1heSBv
ciBtYXkgbm90IGJlIGRlY2xhcmVkIGF0IHRoaXMgcG9pbnQgYXMgZGVmaW5lZCBieSBFTkFCTEVE
X0lOU1BFQ1RPUi4KLS8vIERvdWJsZS1jaGVjayB3ZSBoYXZlIHRoZW0gYXQgbGVhc3QgYXMgZm9y
d2FyZCBkZWNsYXJhdGlvbi4KLWNsYXNzIEluc3BlY3RvckFycmF5OwotY2xhc3MgSW5zcGVjdG9y
T2JqZWN0OwotCi10eXBlZGVmIFN0cmluZyBFcnJvclN0cmluZzsKLQotI2lmIEVOQUJMRShJTlNQ
RUNUT1IpCi0KLWNsYXNzIEluc3BlY3RvckZyb250ZW5kIHsKLXB1YmxpYzoKLSAgICBJbnNwZWN0
b3JGcm9udGVuZChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqKTsKLQotCi0kZG9tYWluQ2xhc3NM
aXN0Ci1wcml2YXRlOgotJHtmaWVsZERlY2xhcmF0aW9uc319OwotCi0jZW5kaWYgLy8gRU5BQkxF
KElOU1BFQ1RPUikKLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQotI2VuZGlmIC8vICFkZWZpbmVk
KEluc3BlY3RvckZyb250ZW5kX2gpCi0iIiIpCi0KLSAgICBiYWNrZW5kX2ggPSBzdHJpbmcuVGVt
cGxhdGUoZmlsZV9oZWFkZXJfICsKLSIiIiNpZm5kZWYgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNo
ZXJfaAotI2RlZmluZSBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcl9oCi0KLSNpbmNsdWRlIDx3
dGYvUGFzc1JlZlB0ci5oPgotI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+Ci0jaW5jbHVkZSA8
d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0jaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1aWxkZXIuaCIK
LQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBJbnNwZWN0b3JBZ2VudDsKLWNsYXNzIElu
c3BlY3Rvck9iamVjdDsKLWNsYXNzIEluc3BlY3RvckFycmF5OwotY2xhc3MgSW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsOwotCi10eXBlZGVmIFN0cmluZyBFcnJvclN0cmluZzsKLQotY2xhc3MgSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOwotCi1jbGFzcyBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlcjogcHVibGljIFJlZkNvdW50ZWQ8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI+IHsK
LXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
cj4gY3JlYXRlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKTsKLSAgICB2aXJ0dWFsIH5JbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcigpIHsgfQotCi0g
ICAgY2xhc3MgQ2FsbGJhY2tCYXNlOiBwdWJsaWMgUmVmQ291bnRlZDxDYWxsYmFja0Jhc2U+IHsK
LSAgICBwdWJsaWM6Ci0gICAgICAgIENhbGxiYWNrQmFzZShQYXNzUmVmUHRyPEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVySW1wbD4gYmFja2VuZEltcGwsIGludCBpZCk7Ci0gICAgICAgIHZpcnR1
YWwgfkNhbGxiYWNrQmFzZSgpOwotICAgICAgICB2b2lkIHNlbmRGYWlsdXJlKGNvbnN0IEVycm9y
U3RyaW5nJik7Ci0gICAgICAgIGJvb2wgaXNBY3RpdmUoKTsKLQotICAgIHByb3RlY3RlZDoKLSAg
ICAgICAgdm9pZCBzZW5kSWZBY3RpdmUoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcnRp
YWxNZXNzYWdlLCBjb25zdCBFcnJvclN0cmluZyYgaW52b2NhdGlvbkVycm9yKTsKLQotICAgIHBy
aXZhdGU6Ci0gICAgICAgIHZvaWQgZGlzYWJsZSgpIHsgbV9hbHJlYWR5U2VudCA9IHRydWU7IH0K
LQotICAgICAgICBSZWZQdHI8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsPiBtX2JhY2tl
bmRJbXBsOwotICAgICAgICBpbnQgbV9pZDsKLSAgICAgICAgYm9vbCBtX2FscmVhZHlTZW50Owot
Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw7Ci0g
ICAgfTsKLQotJGFnZW50SW50ZXJmYWNlcwotJHZpcnR1YWxTZXR0ZXJzCi0KLSAgICB2aXJ0dWFs
IHZvaWQgY2xlYXJGcm9udGVuZCgpID0gMDsKLQotICAgIGVudW0gQ29tbW9uRXJyb3JDb2RlIHsK
LSAgICAgICAgUGFyc2VFcnJvciA9IDAsCi0gICAgICAgIEludmFsaWRSZXF1ZXN0LAotICAgICAg
ICBNZXRob2ROb3RGb3VuZCwKLSAgICAgICAgSW52YWxpZFBhcmFtcywKLSAgICAgICAgSW50ZXJu
YWxFcnJvciwKLSAgICAgICAgU2VydmVyRXJyb3IsCi0gICAgICAgIExhc3RFbnRyeSwKLSAgICB9
OwotCi0gICAgdm9pZCByZXBvcnRQcm90b2NvbEVycm9yKGNvbnN0IGxvbmcqIGNvbnN0IGNhbGxJ
ZCwgQ29tbW9uRXJyb3JDb2RlLCBjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSkgY29uc3Q7Ci0g
ICAgdmlydHVhbCB2b2lkIHJlcG9ydFByb3RvY29sRXJyb3IoY29uc3QgbG9uZyogY29uc3QgY2Fs
bElkLCBDb21tb25FcnJvckNvZGUsIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBQYXNzUmVm
UHRyPEluc3BlY3RvckFycmF5PiBkYXRhKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGRp
c3BhdGNoKGNvbnN0IFN0cmluZyYgbWVzc2FnZSkgPSAwOwotICAgIHN0YXRpYyBib29sIGdldENv
bW1hbmROYW1lKGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgU3RyaW5nKiByZXN1bHQpOwotCi0gICAg
ZW51bSBNZXRob2ROYW1lcyB7Ci0kbWV0aG9kTmFtZXNFbnVtQ29udGVudAotCi0gICAgICAgIGtN
ZXRob2ROYW1lc0VudW1TaXplCi0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb21t
YW5kTmFtZXNbXTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLSNlbmRpZiAvLyAhZGVm
aW5lZChJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcl9oKQotCi0KLSIiIikKLQotICAgIGJhY2tl
bmRfY3BwID0gc3RyaW5nLlRlbXBsYXRlKGZpbGVfaGVhZGVyXyArCi0iIiIKLQotI2luY2x1ZGUg
ImNvbmZpZy5oIgotCi0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLQotI2luY2x1ZGUgIkluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVyLmgiCi0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0j
aW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgotCi0jaW5jbHVkZSAiSW5zcGVjdG9yQWdlbnQu
aCIKLSNpbmNsdWRlICJJbnNwZWN0b3JWYWx1ZXMuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwuaCIKLSNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KLQotbmFtZXNw
YWNlIFdlYkNvcmUgewotCi1jb25zdCBjaGFyKiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
Y29tbWFuZE5hbWVzW10gPSB7Ci0kbWV0aG9kTmFtZURlY2xhcmF0aW9ucwotfTsKLQotCi1jbGFz
cyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGwgOiBwdWJsaWMgSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXIgewotcHVibGljOgotICAgIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1w
bChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKLSAg
ICAgICAgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwpCi0kY29uc3RydWN0b3JJbml0Ci0gICAgeyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJG
cm9udGVuZCgpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSAwOyB9Ci0gICAgdmlydHVh
bCB2b2lkIGRpc3BhdGNoKGNvbnN0IFN0cmluZyYgbWVzc2FnZSk7Ci0gICAgdmlydHVhbCB2b2lk
IHJlcG9ydFByb3RvY29sRXJyb3IoY29uc3QgbG9uZyogY29uc3QgY2FsbElkLCBDb21tb25FcnJv
ckNvZGUsIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBQYXNzUmVmUHRyPEluc3BlY3RvckFy
cmF5PiBkYXRhKSBjb25zdDsKLSAgICB1c2luZyBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6
cmVwb3J0UHJvdG9jb2xFcnJvcjsKLQotICAgIHZvaWQgc2VuZFJlc3BvbnNlKGxvbmcgY2FsbElk
LCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzdWx0LCBjb25zdCBFcnJvclN0cmluZyYg
aW52b2NhdGlvbkVycm9yKTsKLSAgICBib29sIGlzQWN0aXZlKCkgeyByZXR1cm4gbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWw7IH0KLQotJHNldHRlcnMKLXByaXZhdGU6Ci0kbWV0aG9kRGVjbGFy
YXRpb25zCi0KLSAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsOwotJGZpZWxkRGVjbGFyYXRpb25zCi0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBS
LCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBWMD4KLSAgICBzdGF0aWMgUiBnZXRQcm9wZXJ0eVZhbHVl
SW1wbChJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2
YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMsIFYwIGluaXRpYWxfdmFs
dWUsIGJvb2wgKCphc19tZXRob2QpKEluc3BlY3RvclZhbHVlKiwgViopLCBjb25zdCBjaGFyKiB0
eXBlX25hbWUpOwotCi0gICAgc3RhdGljIGludCBnZXRJbnQoSW5zcGVjdG9yT2JqZWN0KiBvYmpl
Y3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkq
IHByb3RvY29sRXJyb3JzKTsKLSAgICBzdGF0aWMgZG91YmxlIGdldERvdWJsZShJbnNwZWN0b3JP
YmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNw
ZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpOwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5n
KEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVl
Rm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycyk7Ci0gICAgc3RhdGljIGJvb2wg
Z2V0Qm9vbGVhbihJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBi
b29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpOwotICAgIHN0
YXRpYyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZ2V0T2JqZWN0KEluc3BlY3Rvck9iamVj
dCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3Rv
ckFycmF5KiBwcm90b2NvbEVycm9ycyk7Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IGdldEFycmF5KEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5h
bWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycyk7Ci0K
LSAgICB2b2lkIHNlbmRSZXNwb25zZShsb25nIGNhbGxJZCwgUGFzc1JlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHJlc3VsdCwgY29uc3QgY2hhciogY29tbWFuZE5hbWUsIFBhc3NSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHByb3RvY29sRXJyb3JzLCBFcnJvclN0cmluZyBpbnZvY2F0aW9uRXJyb3IpOwot
Ci19OwotCi0kbWV0aG9kcwotCi1QYXNzUmVmUHRyPEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
PiBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Y3JlYXRlKEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQotewotICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkpOwotfQotCi0KLXZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpkaXNwYXRj
aChjb25zdCBTdHJpbmcmIG1lc3NhZ2UpCi17Ci0gICAgUmVmUHRyPEluc3BlY3RvckJhY2tlbmRE
aXNwYXRjaGVyPiBwcm90ZWN0ID0gdGhpczsKLSAgICB0eXBlZGVmIHZvaWQgKEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVySW1wbDo6KkNhbGxIYW5kbGVyKShsb25nIGNhbGxJZCwgSW5zcGVjdG9y
T2JqZWN0KiBtZXNzYWdlT2JqZWN0KTsKLSAgICB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBDYWxs
SGFuZGxlcj4gRGlzcGF0Y2hNYXA7Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChEaXNwYXRjaE1h
cCwgZGlzcGF0Y2hNYXAsICk7Ci0gICAgbG9uZyBjYWxsSWQgPSAwOwotCi0gICAgaWYgKGRpc3Bh
dGNoTWFwLmlzRW1wdHkoKSkgewotICAgICAgICBzdGF0aWMgQ2FsbEhhbmRsZXIgaGFuZGxlcnNb
XSA9IHsKLSRtZXNzYWdlSGFuZGxlcnMKLSAgICAgICAgfTsKLSAgICAgICAgc2l6ZV90IGxlbmd0
aCA9IFdURl9BUlJBWV9MRU5HVEgoY29tbWFuZE5hbWVzKTsKLSAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKLSAgICAgICAgICAgIGRpc3BhdGNoTWFwLmFkZChjb21t
YW5kTmFtZXNbaV0sIGhhbmRsZXJzW2ldKTsKLSAgICB9Ci0KLSAgICBSZWZQdHI8SW5zcGVjdG9y
VmFsdWU+IHBhcnNlZE1lc3NhZ2UgPSBJbnNwZWN0b3JWYWx1ZTo6cGFyc2VKU09OKG1lc3NhZ2Up
OwotICAgIGlmICghcGFyc2VkTWVzc2FnZSkgewotICAgICAgICByZXBvcnRQcm90b2NvbEVycm9y
KDAsIFBhcnNlRXJyb3IsICJNZXNzYWdlIG11c3QgYmUgaW4gSlNPTiBmb3JtYXQiKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2VP
YmplY3QgPSBwYXJzZWRNZXNzYWdlLT5hc09iamVjdCgpOwotICAgIGlmICghbWVzc2FnZU9iamVj
dCkgewotICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKDAsIEludmFsaWRSZXF1ZXN0LCAiTWVz
c2FnZSBtdXN0IGJlIGEgSlNPTmlmaWVkIG9iamVjdCIpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiBjYWxsSWRWYWx1ZSA9IG1lc3NhZ2VPYmpl
Y3QtPmdldCgiaWQiKTsKLSAgICBpZiAoIWNhbGxJZFZhbHVlKSB7Ci0gICAgICAgIHJlcG9ydFBy
b3RvY29sRXJyb3IoMCwgSW52YWxpZFJlcXVlc3QsICInaWQnIHByb3BlcnR5IHdhcyBub3QgZm91
bmQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghY2FsbElkVmFsdWUtPmFz
TnVtYmVyKCZjYWxsSWQpKSB7Ci0gICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoMCwgSW52YWxp
ZFJlcXVlc3QsICJUaGUgdHlwZSBvZiAnaWQnIHByb3BlcnR5IG11c3QgYmUgbnVtYmVyIik7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IG1ldGhv
ZFZhbHVlID0gbWVzc2FnZU9iamVjdC0+Z2V0KCJtZXRob2QiKTsKLSAgICBpZiAoIW1ldGhvZFZh
bHVlKSB7Ci0gICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoJmNhbGxJZCwgSW52YWxpZFJlcXVl
c3QsICInbWV0aG9kJyBwcm9wZXJ0eSB3YXNuJ3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIFN0cmluZyBtZXRob2Q7Ci0gICAgaWYgKCFtZXRob2RWYWx1ZS0+YXNTdHJp
bmcoJm1ldGhvZCkpIHsKLSAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcigmY2FsbElkLCBJbnZh
bGlkUmVxdWVzdCwgIlRoZSB0eXBlIG9mICdtZXRob2QnIHByb3BlcnR5IG11c3QgYmUgc3RyaW5n
Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBIYXNoTWFwPFN0cmluZywgQ2FsbEhh
bmRsZXI+OjppdGVyYXRvciBpdCA9IGRpc3BhdGNoTWFwLmZpbmQobWV0aG9kKTsKLSAgICBpZiAo
aXQgPT0gZGlzcGF0Y2hNYXAuZW5kKCkpIHsKLSAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcigm
Y2FsbElkLCBNZXRob2ROb3RGb3VuZCwgIiciICsgbWV0aG9kICsgIicgd2Fzbid0IGZvdW5kIik7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAoKCp0aGlzKS4qaXQtPnZhbHVlKShjYWxs
SWQsIG1lc3NhZ2VPYmplY3QuZ2V0KCkpOwotfQotCi12b2lkIEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVySW1wbDo6c2VuZFJlc3BvbnNlKGxvbmcgY2FsbElkLCBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcmVzdWx0LCBjb25zdCBjaGFyKiBjb21tYW5kTmFtZSwgUGFzc1JlZlB0cjxJbnNw
ZWN0b3JBcnJheT4gcHJvdG9jb2xFcnJvcnMsIEVycm9yU3RyaW5nIGludm9jYXRpb25FcnJvcikK
LXsKLSAgICBpZiAocHJvdG9jb2xFcnJvcnMtPmxlbmd0aCgpKSB7Ci0gICAgICAgIFN0cmluZyBl
cnJvck1lc3NhZ2UgPSBTdHJpbmc6OmZvcm1hdCgiU29tZSBhcmd1bWVudHMgb2YgbWV0aG9kICcl
cycgY2FuJ3QgYmUgcHJvY2Vzc2VkIiwgY29tbWFuZE5hbWUpOwotICAgICAgICByZXBvcnRQcm90
b2NvbEVycm9yKCZjYWxsSWQsIEludmFsaWRQYXJhbXMsIGVycm9yTWVzc2FnZSwgcHJvdG9jb2xF
cnJvcnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNlbmRSZXNwb25zZShjYWxsSWQs
IHJlc3VsdCwgaW52b2NhdGlvbkVycm9yKTsKLX0KLQotdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlckltcGw6OnNlbmRSZXNwb25zZShsb25nIGNhbGxJZCwgUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHJlc3VsdCwgY29uc3QgRXJyb3JTdHJpbmcmIGludm9jYXRpb25FcnJvcikKLXsK
LSAgICBpZiAoaW52b2NhdGlvbkVycm9yLmxlbmd0aCgpKSB7Ci0gICAgICAgIHJlcG9ydFByb3Rv
Y29sRXJyb3IoJmNhbGxJZCwgU2VydmVyRXJyb3IsIGludm9jYXRpb25FcnJvcik7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZU1l
c3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwotICAgIHJlc3BvbnNlTWVzc2FnZS0+
c2V0T2JqZWN0KCJyZXN1bHQiLCByZXN1bHQpOwotICAgIHJlc3BvbnNlTWVzc2FnZS0+c2V0TnVt
YmVyKCJpZCIsIGNhbGxJZCk7Ci0gICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQot
ICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5k
KHJlc3BvbnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwotfQotCi12b2lkIEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVyOjpyZXBvcnRQcm90b2NvbEVycm9yKGNvbnN0IGxvbmcqIGNvbnN0IGNh
bGxJZCwgQ29tbW9uRXJyb3JDb2RlIGNvZGUsIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKSBj
b25zdAotewotICAgIHJlcG9ydFByb3RvY29sRXJyb3IoY2FsbElkLCBjb2RlLCBlcnJvck1lc3Nh
Z2UsIDApOwotfQotCi12b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6cmVwb3J0
UHJvdG9jb2xFcnJvcihjb25zdCBsb25nKiBjb25zdCBjYWxsSWQsIENvbW1vbkVycm9yQ29kZSBj
b2RlLCBjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJh
eT4gZGF0YSkgY29uc3QKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFZlY3RvcjxpbnQ+LHNf
Y29tbW9uRXJyb3JzLCk7Ci0gICAgaWYgKCFzX2NvbW1vbkVycm9ycy5zaXplKCkpIHsKLSAgICAg
ICAgc19jb21tb25FcnJvcnMuaW5zZXJ0KFBhcnNlRXJyb3IsIC0zMjcwMCk7Ci0gICAgICAgIHNf
Y29tbW9uRXJyb3JzLmluc2VydChJbnZhbGlkUmVxdWVzdCwgLTMyNjAwKTsKLSAgICAgICAgc19j
b21tb25FcnJvcnMuaW5zZXJ0KE1ldGhvZE5vdEZvdW5kLCAtMzI2MDEpOwotICAgICAgICBzX2Nv
bW1vbkVycm9ycy5pbnNlcnQoSW52YWxpZFBhcmFtcywgLTMyNjAyKTsKLSAgICAgICAgc19jb21t
b25FcnJvcnMuaW5zZXJ0KEludGVybmFsRXJyb3IsIC0zMjYwMyk7Ci0gICAgICAgIHNfY29tbW9u
RXJyb3JzLmluc2VydChTZXJ2ZXJFcnJvciwgLTMyMDAwKTsKLSAgICB9Ci0gICAgQVNTRVJUKGNv
ZGUgPj0wKTsKLSAgICBBU1NFUlQoKHVuc2lnbmVkKWNvZGUgPCBzX2NvbW1vbkVycm9ycy5zaXpl
KCkpOwotICAgIEFTU0VSVChzX2NvbW1vbkVycm9yc1tjb2RlXSk7Ci0gICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gZXJyb3IgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwotICAgIGVycm9y
LT5zZXROdW1iZXIoImNvZGUiLCBzX2NvbW1vbkVycm9yc1tjb2RlXSk7Ci0gICAgZXJyb3ItPnNl
dFN0cmluZygibWVzc2FnZSIsIGVycm9yTWVzc2FnZSk7Ci0gICAgQVNTRVJUKGVycm9yKTsKLSAg
ICBpZiAoZGF0YSkKLSAgICAgICAgZXJyb3ItPnNldEFycmF5KCJkYXRhIiwgZGF0YSk7Ci0gICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7Ci0gICAgbWVzc2FnZS0+c2V0T2JqZWN0KCJlcnJvciIsIGVycm9yKTsKLSAgICBpZiAoY2Fs
bElkKQotICAgICAgICBtZXNzYWdlLT5zZXROdW1iZXIoImlkIiwgKmNhbGxJZCk7Ci0gICAgZWxz
ZQotICAgICAgICBtZXNzYWdlLT5zZXRWYWx1ZSgiaWQiLCBJbnNwZWN0b3JWYWx1ZTo6bnVsbCgp
KTsKLSAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCi0gICAgICAgIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobWVzc2FnZS0+dG9KU09O
U3RyaW5nKCkpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBWLCB0eXBlbmFt
ZSBWMD4KLVIgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpnZXRQcm9wZXJ0eVZhbHVl
SW1wbChJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2
YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMsIFYwIGluaXRpYWxfdmFs
dWUsIGJvb2wgKCphc19tZXRob2QpKEluc3BlY3RvclZhbHVlKiwgViopLCBjb25zdCBjaGFyKiB0
eXBlX25hbWUpCi17Ci0gICAgQVNTRVJUKHByb3RvY29sRXJyb3JzKTsKLQotICAgIGlmICh2YWx1
ZUZvdW5kKQotICAgICAgICAqdmFsdWVGb3VuZCA9IGZhbHNlOwotCi0gICAgViB2YWx1ZSA9IGlu
aXRpYWxfdmFsdWU7Ci0KLSAgICBpZiAoIW9iamVjdCkgewotICAgICAgICBpZiAoIXZhbHVlRm91
bmQpIHsKLSAgICAgICAgICAgIC8vIFJlcXVpcmVkIHBhcmFtZXRlciBpbiBtaXNzaW5nIHBhcmFt
cyBjb250YWluZXIuCi0gICAgICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJp
bmc6OmZvcm1hdCgiJ3BhcmFtcycgb2JqZWN0IG11c3QgY29udGFpbiByZXF1aXJlZCBwYXJhbWV0
ZXIgJyVzJyB3aXRoIHR5cGUgJyVzJy4iLCBuYW1lLnV0ZjgoKS5kYXRhKCksIHR5cGVfbmFtZSkp
OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBJbnNwZWN0
b3JPYmplY3Q6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG9iamVjdC0+ZW5kKCk7Ci0gICAgSW5zcGVj
dG9yT2JqZWN0Ojpjb25zdF9pdGVyYXRvciB2YWx1ZUl0ZXJhdG9yID0gb2JqZWN0LT5maW5kKG5h
bWUpOwotCi0gICAgaWYgKHZhbHVlSXRlcmF0b3IgPT0gZW5kKSB7Ci0gICAgICAgIGlmICghdmFs
dWVGb3VuZCkKLSAgICAgICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6
Zm9ybWF0KCJQYXJhbWV0ZXIgJyVzJyB3aXRoIHR5cGUgJyVzJyB3YXMgbm90IGZvdW5kLiIsIG5h
bWUudXRmOCgpLmRhdGEoKSwgdHlwZV9uYW1lKSk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAg
ICB9Ci0KLSAgICBpZiAoIWFzX21ldGhvZCh2YWx1ZUl0ZXJhdG9yLT52YWx1ZS5nZXQoKSwgJnZh
bHVlKSkKLSAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpmb3JtYXQo
IlBhcmFtZXRlciAnJXMnIGhhcyB3cm9uZyB0eXBlLiBJdCBtdXN0IGJlICclcycuIiwgbmFtZS51
dGY4KCkuZGF0YSgpLCB0eXBlX25hbWUpKTsKLSAgICBlbHNlCi0gICAgICAgIGlmICh2YWx1ZUZv
dW5kKQotICAgICAgICAgICAgKnZhbHVlRm91bmQgPSB0cnVlOwotICAgIHJldHVybiB2YWx1ZTsK
LX0KLQotc3RydWN0IEFzTWV0aG9kQnJpZGdlcyB7Ci0gICAgc3RhdGljIGJvb2wgYXNJbnQoSW5z
cGVjdG9yVmFsdWUqIHZhbHVlLCBpbnQqIG91dHB1dCkgeyByZXR1cm4gdmFsdWUtPmFzTnVtYmVy
KG91dHB1dCk7IH0KLSAgICBzdGF0aWMgYm9vbCBhc0RvdWJsZShJbnNwZWN0b3JWYWx1ZSogdmFs
dWUsIGRvdWJsZSogb3V0cHV0KSB7IHJldHVybiB2YWx1ZS0+YXNOdW1iZXIob3V0cHV0KTsgfQot
ICAgIHN0YXRpYyBib29sIGFzU3RyaW5nKEluc3BlY3RvclZhbHVlKiB2YWx1ZSwgU3RyaW5nKiBv
dXRwdXQpIHsgcmV0dXJuIHZhbHVlLT5hc1N0cmluZyhvdXRwdXQpOyB9Ci0gICAgc3RhdGljIGJv
b2wgYXNCb29sZWFuKEluc3BlY3RvclZhbHVlKiB2YWx1ZSwgYm9vbCogb3V0cHV0KSB7IHJldHVy
biB2YWx1ZS0+YXNCb29sZWFuKG91dHB1dCk7IH0KLSAgICBzdGF0aWMgYm9vbCBhc09iamVjdChJ
bnNwZWN0b3JWYWx1ZSogdmFsdWUsIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+KiBvdXRwdXQpIHsg
cmV0dXJuIHZhbHVlLT5hc09iamVjdChvdXRwdXQpOyB9Ci0gICAgc3RhdGljIGJvb2wgYXNBcnJh
eShJbnNwZWN0b3JWYWx1ZSogdmFsdWUsIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4qIG91dHB1dCkg
eyByZXR1cm4gdmFsdWUtPmFzQXJyYXkob3V0cHV0KTsgfQotfTsKLQotaW50IEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVySW1wbDo6Z2V0SW50KEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25z
dCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2Nv
bEVycm9ycykKLXsKLSAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZUltcGw8aW50LCBpbnQsIGlu
dD4ob2JqZWN0LCBuYW1lLCB2YWx1ZUZvdW5kLCBwcm90b2NvbEVycm9ycywgMCwgQXNNZXRob2RC
cmlkZ2VzOjphc0ludCwgIk51bWJlciIpOwotfQotCi1kb3VibGUgSW5zcGVjdG9yQmFja2VuZERp
c3BhdGNoZXJJbXBsOjpnZXREb3VibGUoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0
cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJy
b3JzKQotewotICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlSW1wbDxkb3VibGUsIGRvdWJsZSwg
ZG91YmxlPihvYmplY3QsIG5hbWUsIHZhbHVlRm91bmQsIHByb3RvY29sRXJyb3JzLCAwLCBBc01l
dGhvZEJyaWRnZXM6OmFzRG91YmxlLCAiTnVtYmVyIik7Ci19Ci0KLVN0cmluZyBJbnNwZWN0b3JC
YWNrZW5kRGlzcGF0Y2hlckltcGw6OmdldFN0cmluZyhJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwg
Y29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJv
dG9jb2xFcnJvcnMpCi17Ci0gICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWVJbXBsPFN0cmluZywg
U3RyaW5nLCBTdHJpbmc+KG9iamVjdCwgbmFtZSwgdmFsdWVGb3VuZCwgcHJvdG9jb2xFcnJvcnMs
ICIiLCBBc01ldGhvZEJyaWRnZXM6OmFzU3RyaW5nLCAiU3RyaW5nIik7Ci19Ci0KLWJvb2wgSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOjpnZXRCb29sZWFuKEluc3BlY3Rvck9iamVjdCog
b2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFy
cmF5KiBwcm90b2NvbEVycm9ycykKLXsKLSAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZUltcGw8
Ym9vbCwgYm9vbCwgYm9vbD4ob2JqZWN0LCBuYW1lLCB2YWx1ZUZvdW5kLCBwcm90b2NvbEVycm9y
cywgZmFsc2UsIEFzTWV0aG9kQnJpZGdlczo6YXNCb29sZWFuLCAiQm9vbGVhbiIpOwotfQotCi1Q
YXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBs
OjpnZXRPYmplY3QoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwg
Ym9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKQotewotICAg
IHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlSW1wbDxQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4s
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+LCBJbnNwZWN0b3JPYmplY3QqPihvYmplY3QsIG5hbWUs
IHZhbHVlRm91bmQsIHByb3RvY29sRXJyb3JzLCAwLCBBc01ldGhvZEJyaWRnZXM6OmFzT2JqZWN0
LCAiT2JqZWN0Iik7Ci19Ci0KLVBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVySW1wbDo6Z2V0QXJyYXkoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNv
bnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3Rv
Y29sRXJyb3JzKQotewotICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlSW1wbDxQYXNzUmVmUHRy
PEluc3BlY3RvckFycmF5PiwgUmVmUHRyPEluc3BlY3RvckFycmF5PiwgSW5zcGVjdG9yQXJyYXkq
PihvYmplY3QsIG5hbWUsIHZhbHVlRm91bmQsIHByb3RvY29sRXJyb3JzLCAwLCBBc01ldGhvZEJy
aWRnZXM6OmFzQXJyYXksICJBcnJheSIpOwotfQotCi1ib29sIEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVyOjpnZXRDb21tYW5kTmFtZShjb25zdCBTdHJpbmcmIG1lc3NhZ2UsIFN0cmluZyogcmVz
dWx0KQotewotICAgIFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUgPSBJbnNwZWN0b3JWYWx1
ZTo6cGFyc2VKU09OKG1lc3NhZ2UpOwotICAgIGlmICghdmFsdWUpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdCA9IHZhbHVlLT5hc09i
amVjdCgpOwotICAgIGlmICghb2JqZWN0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBp
ZiAoIW9iamVjdC0+Z2V0U3RyaW5nKCJtZXRob2QiLCByZXN1bHQpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotSW5zcGVjdG9yQmFja2VuZERpc3BhdGNo
ZXI6OkNhbGxiYWNrQmFzZTo6Q2FsbGJhY2tCYXNlKFBhc3NSZWZQdHI8SW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXJJbXBsPiBiYWNrZW5kSW1wbCwgaW50IGlkKQotICAgIDogbV9iYWNrZW5kSW1w
bChiYWNrZW5kSW1wbCksIG1faWQoaWQpLCBtX2FscmVhZHlTZW50KGZhbHNlKSB7fQotCi1JbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Q2FsbGJhY2tCYXNlOjp+Q2FsbGJhY2tCYXNlKCkge30K
LQotdm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Q2FsbGJhY2tCYXNlOjpzZW5kRmFp
bHVyZShjb25zdCBFcnJvclN0cmluZyYgZXJyb3IpCi17Ci0gICAgQVNTRVJUKGVycm9yLmxlbmd0
aCgpKTsKLSAgICBzZW5kSWZBY3RpdmUoMCwgZXJyb3IpOwotfQotCi1ib29sIEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVyOjpDYWxsYmFja0Jhc2U6OmlzQWN0aXZlKCkKLXsKLSAgICByZXR1cm4g
IW1fYWxyZWFkeVNlbnQgJiYgbV9iYWNrZW5kSW1wbC0+aXNBY3RpdmUoKTsKLX0KLQotdm9pZCBJ
bnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6Q2FsbGJhY2tCYXNlOjpzZW5kSWZBY3RpdmUoUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcnRpYWxNZXNzYWdlLCBjb25zdCBFcnJvclN0cmlu
ZyYgaW52b2NhdGlvbkVycm9yKQotewotICAgIGlmIChtX2FscmVhZHlTZW50KQotICAgICAgICBy
ZXR1cm47Ci0gICAgbV9iYWNrZW5kSW1wbC0+c2VuZFJlc3BvbnNlKG1faWQsIHBhcnRpYWxNZXNz
YWdlLCBpbnZvY2F0aW9uRXJyb3IpOwotICAgIG1fYWxyZWFkeVNlbnQgPSB0cnVlOwotfQotCi1D
T01QSUxFX0FTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVy
OjprTWV0aG9kTmFtZXNFbnVtU2l6ZSkgPT0gV1RGX0FSUkFZX0xFTkdUSChJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlcjo6Y29tbWFuZE5hbWVzKSwgY29tbWFuZF9uYW1lX2FycmF5X3Byb2JsZW0p
OwotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0KLSNlbmRpZiAvLyBFTkFCTEUoSU5TUEVDVE9S
KQotIiIiKQotCi0gICAgZnJvbnRlbmRfY3BwID0gc3RyaW5nLlRlbXBsYXRlKGZpbGVfaGVhZGVy
XyArCi0iIiIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2lmIEVOQUJMRShJTlNQRUNUT1IpCi0K
LSNpbmNsdWRlICJJbnNwZWN0b3JGcm9udGVuZC5oIgotI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0
cmluZy5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLQotI2luY2x1ZGUgIkluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbC5oIgotI2luY2x1ZGUgIkluc3BlY3RvclZhbHVlcy5oIgotI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLUlu
c3BlY3RvckZyb250ZW5kOjpJbnNwZWN0b3JGcm9udGVuZChJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKLSAgICA6ICRjb25zdHJ1Y3RvckluaXR7Ci19
Ci0KLSRtZXRob2RzCi0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2VuZGlmIC8vIEVOQUJM
RShJTlNQRUNUT1IpCi0iIiIpCi0KLSAgICB0eXBlYnVpbGRlcl9oID0gc3RyaW5nLlRlbXBsYXRl
KGZpbGVfaGVhZGVyXyArCi0iIiIKLSNpZm5kZWYgSW5zcGVjdG9yVHlwZUJ1aWxkZXJfaAotI2Rl
ZmluZSBJbnNwZWN0b3JUeXBlQnVpbGRlcl9oCi0KLSNpZiBFTkFCTEUoSU5TUEVDVE9SKQotCi0j
aW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCi0jaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4K
LSNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLW5h
bWVzcGFjZSBUeXBlQnVpbGRlciB7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBPcHRP
dXRwdXQgewotcHVibGljOgotICAgIE9wdE91dHB1dCgpIDogbV9hc3NpZ25lZChmYWxzZSkgeyB9
Ci0KLSAgICB2b2lkIG9wZXJhdG9yPShUIHZhbHVlKQotICAgIHsKLSAgICAgICAgbV92YWx1ZSA9
IHZhbHVlOwotICAgICAgICBtX2Fzc2lnbmVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBib29sIGlz
QXNzaWduZWQoKSB7IHJldHVybiBtX2Fzc2lnbmVkOyB9Ci0KLSAgICBUIGdldFZhbHVlKCkKLSAg
ICB7Ci0gICAgICAgIEFTU0VSVChpc0Fzc2lnbmVkKCkpOwotICAgICAgICByZXR1cm4gbV92YWx1
ZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgVCBtX3ZhbHVlOwotICAgIGJvb2wgbV9hc3NpZ25l
ZDsKLQotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKE9wdE91dHB1dCk7Ci19OwotCi0KLS8vIEEg
c21hbGwgdHJhbnNpZW50IHdyYXBwZXIgYXJvdW5kIGludCB0eXBlLCB0aGF0IGNhbiBiZSB1c2Vk
IGFzIGEgZnVuY2l0b24gcGFyYW1ldGVyIHR5cGUKLS8vIGNsZXZlcmx5IGRpc2FsbG93aW5nIEMr
KyBpbXBsaWNpdCBjYXN0cyBmcm9tIGZsb2F0IG9yIGRvdWJsZS4KLWNsYXNzIEV4YWN0bHlJbnQg
ewotcHVibGljOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgRXhhY3RseUludChUIHQp
IDogbV92YWx1ZShjYXN0X3RvX2ludDxUPih0KSkge30KLQotICAgIEV4YWN0bHlJbnQoKSB7fQot
Ci0gICAgb3BlcmF0b3IgaW50KCkgeyByZXR1cm4gbV92YWx1ZTsgfQotcHJpdmF0ZToKLSAgICBp
bnQgbV92YWx1ZTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdGljIGludCBj
YXN0X3RvX2ludChUKSB7IHJldHVybiBUOjpkZWZhdWx0X2Nhc2VfY2FzdF9pc19ub3Rfc3VwcG9y
dGVkKCk7IH0KLX07Ci0KLXRlbXBsYXRlPD4KLWlubGluZSBpbnQgRXhhY3RseUludDo6Y2FzdF90
b19pbnQ8aW50PihpbnQgaSkgeyByZXR1cm4gaTsgfQotCi10ZW1wbGF0ZTw+Ci1pbmxpbmUgaW50
IEV4YWN0bHlJbnQ6OmNhc3RfdG9faW50PHVuc2lnbmVkIGludD4odW5zaWduZWQgaW50IGkpIHsg
cmV0dXJuIGk7IH0KLQotY2xhc3MgUnVudGltZUNhc3RIZWxwZXIgewotcHVibGljOgotI2lmICFB
U1NFUlRfRElTQUJMRUQKLSAgICB0ZW1wbGF0ZTxJbnNwZWN0b3JWYWx1ZTo6VHlwZSBUWVBFPgot
ICAgIHN0YXRpYyB2b2lkIGFzc2VydFR5cGUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQotICAgIHsK
LSAgICAgICAgQVNTRVJUKHZhbHVlLT50eXBlKCkgPT0gVFlQRSk7Ci0gICAgfQotICAgIHN0YXRp
YyB2b2lkIGFzc2VydEFueShJbnNwZWN0b3JWYWx1ZSopOwotICAgIHN0YXRpYyB2b2lkIGFzc2Vy
dEludChJbnNwZWN0b3JWYWx1ZSogdmFsdWUpOwotI2VuZGlmCi19OwotCi0KLS8vIFRoaXMgY2xh
c3MgcHJvdmlkZXMgIlRyYWl0cyIgdHlwZSBmb3IgdGhlIGlucHV0IHR5cGUgVC4gSXQgaXMgcHJv
Z3JhbW1lZCB1c2luZyBDKysgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24KLS8vIHRlY2huaXF1ZS4g
QnkgZGVmYXVsdCBpdCBzaW1wbHkgdGFrZXMgIkl0ZW1UcmFpdHMiIHR5cGUgZnJvbSBULCBidXQg
aXQgZG9lc24ndCB3b3JrIHdpdGggdGhlIGJhc2UgdHlwZXMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBU
Pgotc3RydWN0IEFycmF5SXRlbUhlbHBlciB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBUOjpJdGVt
VHJhaXRzIFRyYWl0czsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBBcnJheSA6
IHB1YmxpYyBJbnNwZWN0b3JBcnJheUJhc2UgewotcHJpdmF0ZToKLSAgICBBcnJheSgpIHsgfQot
Ci0gICAgSW5zcGVjdG9yQXJyYXkqIG9wZW5BY2Nlc3NvcnMoKSB7Ci0gICAgICAgIENPTVBJTEVf
QVNTRVJUKHNpemVvZihJbnNwZWN0b3JBcnJheSkgPT0gc2l6ZW9mKEFycmF5PFQ+KSwgY2Fubm90
X2Nhc3QpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW5zcGVjdG9yQXJyYXkqPihzdGF0
aWNfY2FzdDxJbnNwZWN0b3JBcnJheUJhc2UqPih0aGlzKSk7Ci0gICAgfQotCi1wdWJsaWM6Ci0g
ICAgdm9pZCBhZGRJdGVtKFBhc3NSZWZQdHI8VD4gdmFsdWUpCi0gICAgewotICAgICAgICBBcnJh
eUl0ZW1IZWxwZXI8VD46OlRyYWl0czo6cHVzaFJlZlB0cih0aGlzLT5vcGVuQWNjZXNzb3JzKCks
IHZhbHVlKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEl0ZW0oVCB2YWx1ZSkKLSAgICB7Ci0gICAg
ICAgIEFycmF5SXRlbUhlbHBlcjxUPjo6VHJhaXRzOjpwdXNoUmF3KHRoaXMtPm9wZW5BY2Nlc3Nv
cnMoKSwgdmFsdWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPEFycmF5PFQ+ID4g
Y3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQXJyYXk8VD4oKSk7
Ci0gICAgfQotCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8QXJyYXk8VD4gPiBydW50aW1lQ2FzdChQ
YXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JBcnJheT4gYXJyYXk7Ci0gICAgICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc0Fy
cmF5KCZhcnJheSk7Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7Ci0j
aWYgIUFTU0VSVF9ESVNBQkxFRAotICAgICAgICBhc3NlcnRDb3JyZWN0VmFsdWUoYXJyYXkuZ2V0
KCkpOwotI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVECi0gICAgICAgIENPTVBJTEVfQVNTRVJU
KHNpemVvZihBcnJheTxUPikgPT0gc2l6ZW9mKEluc3BlY3RvckFycmF5KSwgdHlwZV9jYXN0X3By
b2JsZW0pOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXJyYXk8VD4qPihzdGF0aWNfY2Fz
dDxJbnNwZWN0b3JBcnJheUJhc2UqPihhcnJheS5nZXQoKSkpOwotICAgIH0KLQotI2lmICIiIiAr
IFZBTElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCi0gICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVj
dFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JBcnJheT4gYXJyYXk7Ci0gICAgICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc0FycmF5
KCZhcnJheSk7Ci0gICAgICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7Ci0gICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhcnJheS0+bGVuZ3RoKCk7IGkrKykKLSAgICAg
ICAgICAgIEFycmF5SXRlbUhlbHBlcjxUPjo6VHJhaXRzOjp0ZW1wbGF0ZSBhc3NlcnRDb3JyZWN0
VmFsdWU8VD4oYXJyYXktPmdldChpKS5nZXQoKSk7Ci0gICAgfQotCi0jZW5kaWYgLy8gIiIiICsg
VkFMSURBVE9SX0lGREVGX05BTUUgKyAiIiIKLX07Ci0KLXN0cnVjdCBTdHJ1Y3RJdGVtVHJhaXRz
IHsKLSAgICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRyKEluc3BlY3RvckFycmF5KiBhcnJheSwgUGFz
c1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCi0gICAgewotICAgICAgICBhcnJheS0+cHVz
aFZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSNpZiAiIiIgKyBWQUxJREFUT1JfSUZERUZfTkFNRSAr
ICIiIgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29y
cmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgewotICAgICAgICBUOjphc3NlcnRDb3Jy
ZWN0VmFsdWUodmFsdWUpOwotICAgIH0KLSNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAotfTsK
LQotdGVtcGxhdGU8Pgotc3RydWN0IEFycmF5SXRlbUhlbHBlcjxTdHJpbmc+IHsKLSAgICBzdHJ1
Y3QgVHJhaXRzIHsKLSAgICAgICAgc3RhdGljIHZvaWQgcHVzaFJhdyhJbnNwZWN0b3JBcnJheSog
YXJyYXksIGNvbnN0IFN0cmluZyYgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFycmF5
LT5wdXNoU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgfQotCi0jaWYgIiIiICsgVkFMSURBVE9SX0lG
REVGX05BTUUgKyAiIiIKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgc3Rh
dGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgewotICAg
ICAgICAgICAgUnVudGltZUNhc3RIZWxwZXI6OmFzc2VydFR5cGU8SW5zcGVjdG9yVmFsdWU6OlR5
cGVTdHJpbmc+KHZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVE
Ci0gICAgfTsKLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBBcnJheUl0ZW1IZWxwZXI8aW50PiB7
Ci0gICAgc3RydWN0IFRyYWl0cyB7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSYXcoSW5zcGVj
dG9yQXJyYXkqIGFycmF5LCBpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFycmF5
LT5wdXNoSW50KHZhbHVlKTsKLSAgICAgICAgfQotCi0jaWYgIiIiICsgVkFMSURBVE9SX0lGREVG
X05BTUUgKyAiIiIKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgc3RhdGlj
IHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgewotICAgICAg
ICAgICAgUnVudGltZUNhc3RIZWxwZXI6OmFzc2VydEludCh2YWx1ZSk7Ci0gICAgICAgIH0KLSNl
bmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAotICAgIH07Ci19OwotCi10ZW1wbGF0ZTw+Ci1zdHJ1
Y3QgQXJyYXlJdGVtSGVscGVyPGRvdWJsZT4gewotICAgIHN0cnVjdCBUcmFpdHMgewotICAgICAg
ICBzdGF0aWMgdm9pZCBwdXNoUmF3KEluc3BlY3RvckFycmF5KiBhcnJheSwgZG91YmxlIHZhbHVl
KQotICAgICAgICB7Ci0gICAgICAgICAgICBhcnJheS0+cHVzaE51bWJlcih2YWx1ZSk7Ci0gICAg
ICAgIH0KLQotI2lmICIiIiArIFZBTElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCi0gICAgICAgIHRl
bXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1
ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKLSAgICAgICAgICAgIFJ1bnRpbWVDYXN0SGVscGVy
Ojphc3NlcnRUeXBlPEluc3BlY3RvclZhbHVlOjpUeXBlTnVtYmVyPih2YWx1ZSk7Ci0gICAgICAg
IH0KLSNlbmRpZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAotICAgIH07Ci19OwotCi10ZW1wbGF0ZTw+
Ci1zdHJ1Y3QgQXJyYXlJdGVtSGVscGVyPGJvb2w+IHsKLSAgICBzdHJ1Y3QgVHJhaXRzIHsKLSAg
ICAgICAgc3RhdGljIHZvaWQgcHVzaFJhdyhJbnNwZWN0b3JBcnJheSogYXJyYXksIGJvb2wgdmFs
dWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFycmF5LT5wdXNoQm9vbGVhbih2YWx1ZSk7Ci0g
ICAgICAgIH0KLQotI2lmICIiIiArIFZBTElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCi0gICAgICAg
IHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RW
YWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKLSAgICAgICAgICAgIFJ1bnRpbWVDYXN0SGVs
cGVyOjphc3NlcnRUeXBlPEluc3BlY3RvclZhbHVlOjpUeXBlQm9vbGVhbj4odmFsdWUpOwotICAg
ICAgICB9Ci0jZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKLSAgICB9OwotfTsKLQotdGVtcGxh
dGU8Pgotc3RydWN0IEFycmF5SXRlbUhlbHBlcjxJbnNwZWN0b3JWYWx1ZT4gewotICAgIHN0cnVj
dCBUcmFpdHMgewotICAgICAgICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRyKEluc3BlY3RvckFycmF5
KiBhcnJheSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIGFycmF5LT5wdXNoVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSNpZiAiIiIg
KyBWQUxJREFUT1JfSUZERUZfTkFNRSArICIiIgotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU
PgotICAgICAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUq
IHZhbHVlKSB7Ci0gICAgICAgICAgICBSdW50aW1lQ2FzdEhlbHBlcjo6YXNzZXJ0QW55KHZhbHVl
KTsKLSAgICAgICAgfQotI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVECi0gICAgfTsKLX07Ci0K
LXRlbXBsYXRlPD4KLXN0cnVjdCBBcnJheUl0ZW1IZWxwZXI8SW5zcGVjdG9yT2JqZWN0PiB7Ci0g
ICAgc3RydWN0IFRyYWl0cyB7Ci0gICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSZWZQdHIoSW5zcGVj
dG9yQXJyYXkqIGFycmF5LCBQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKLSAgICAg
ICAgewotICAgICAgICAgICAgYXJyYXktPnB1c2hWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQot
I2lmICIiIiArIFZBTElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCi0gICAgICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFQ+Ci0gICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0
b3JWYWx1ZSogdmFsdWUpIHsKLSAgICAgICAgICAgIFJ1bnRpbWVDYXN0SGVscGVyOjphc3NlcnRU
eXBlPEluc3BlY3RvclZhbHVlOjpUeXBlT2JqZWN0Pih2YWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRp
ZiAgLy8gIUFTU0VSVF9ESVNBQkxFRAotICAgIH07Ci19OwotCi10ZW1wbGF0ZTw+Ci1zdHJ1Y3Qg
QXJyYXlJdGVtSGVscGVyPEluc3BlY3RvckFycmF5PiB7Ci0gICAgc3RydWN0IFRyYWl0cyB7Ci0g
ICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSZWZQdHIoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBQYXNz
UmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYXJy
YXktPnB1c2hBcnJheSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotI2lmICIiIiArIFZBTElEQVRPUl9J
RkRFRl9OQU1FICsgIiIiCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHN0
YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKLSAg
ICAgICAgICAgIFJ1bnRpbWVDYXN0SGVscGVyOjphc3NlcnRUeXBlPEluc3BlY3RvclZhbHVlOjpU
eXBlQXJyYXk+KHZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmICAvLyAhQVNTRVJUX0RJU0FCTEVE
Ci0gICAgfTsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQXJyYXlJdGVtSGVs
cGVyPFR5cGVCdWlsZGVyOjpBcnJheTxUPiA+IHsKLSAgICBzdHJ1Y3QgVHJhaXRzIHsKLSAgICAg
ICAgc3RhdGljIHZvaWQgcHVzaFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6OkFycmF5PFQ+ID4gdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAg
IGFycmF5LT5wdXNoVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0KLSNpZiAiIiIgKyBWQUxJREFU
T1JfSUZERUZfTkFNRSArICIiIgotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgotICAgICAg
ICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKSB7
Ci0gICAgICAgICAgICBTOjphc3NlcnRDb3JyZWN0VmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0j
ZW5kaWYgIC8vICFBU1NFUlRfRElTQUJMRUQKLSAgICB9OwotfTsKLQotJHtmb3J3YXJkc30KLQot
U3RyaW5nIGdldEVudW1Db25zdGFudFZhbHVlKGludCBjb2RlKTsKLQotJHt0eXBlQnVpbGRlcnN9
Ci19IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRlcgotCi0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
LQotI2VuZGlmIC8vIEVOQUJMRShJTlNQRUNUT1IpCi0KLSNlbmRpZiAvLyAhZGVmaW5lZChJbnNw
ZWN0b3JUeXBlQnVpbGRlcl9oKQotCi0iIiIpCi0KLSAgICB0eXBlYnVpbGRlcl9jcHAgPSBzdHJp
bmcuVGVtcGxhdGUoZmlsZV9oZWFkZXJfICsKLSIiIgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0j
aWYgRU5BQkxFKElOU1BFQ1RPUikKLQotI2luY2x1ZGUgIkluc3BlY3RvclR5cGVCdWlsZGVyLmgi
Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0K
LW5hbWVzcGFjZSBUeXBlQnVpbGRlciB7Ci0KLWNvbnN0IGNoYXIqIGNvbnN0IGVudW1fY29uc3Rh
bnRfdmFsdWVzW10gPSB7Ci0kZW51bUNvbnN0YW50VmFsdWVzfTsKLQotU3RyaW5nIGdldEVudW1D
b25zdGFudFZhbHVlKGludCBjb2RlKSB7Ci0gICAgcmV0dXJuIGVudW1fY29uc3RhbnRfdmFsdWVz
W2NvZGVdOwotfQotCi19IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRlcgotCi0kaW1wbENvZGUKLQot
I2lmICIiIiArIFZBTElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCi0KLXZvaWQgVHlwZUJ1aWxkZXI6
OlJ1bnRpbWVDYXN0SGVscGVyOjphc3NlcnRBbnkoSW5zcGVjdG9yVmFsdWUqKQotewotICAgIC8v
IE5vLW9wLgotfQotCi0KLXZvaWQgVHlwZUJ1aWxkZXI6OlJ1bnRpbWVDYXN0SGVscGVyOjphc3Nl
cnRJbnQoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQotewotICAgIGRvdWJsZSB2OwotICAgIGJvb2wg
Y2FzdFJlcyA9IHZhbHVlLT5hc051bWJlcigmdik7Ci0gICAgQVNTRVJUX1VOVVNFRChjYXN0UmVz
LCBjYXN0UmVzKTsKLSAgICBBU1NFUlQoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGF0aWNfY2FzdDxp
bnQ+KHYpKSA9PSB2KTsKLX0KLQotJHZhbGlkYXRvckNvZGUKLQotI2VuZGlmIC8vICIiIiArIFZB
TElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCi0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKLQotI2Vu
ZGlmIC8vIEVOQUJMRShJTlNQRUNUT1IpCi0iIiIpCi0KLSAgICBiYWNrZW5kX2pzID0gc3RyaW5n
LlRlbXBsYXRlKGZpbGVfaGVhZGVyXyArCi0iIiIKLQotJGRvbWFpbkluaXRpYWxpemVycwotIiIi
KQogCi0gICAgcGFyYW1fY29udGFpbmVyX2FjY2Vzc19jb2RlID0gIiIiCi0gICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gcGFyYW1zQ29udGFpbmVyID0gcmVxdWVzdE1lc3NhZ2VPYmplY3QtPmdl
dE9iamVjdCgicGFyYW1zIik7Ci0gICAgSW5zcGVjdG9yT2JqZWN0KiBwYXJhbXNDb250YWluZXJQ
dHIgPSBwYXJhbXNDb250YWluZXIuZ2V0KCk7Ci0gICAgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29s
RXJyb3JzUHRyID0gcHJvdG9jb2xFcnJvcnMuZ2V0KCk7Ci0iIiIKIAogCiB0eXBlX21hcCA9IFR5
cGVNYXAoanNvbl9hcGkpCkBAIC0zMjU0LDEyICsyMzU1LDE0IEBAIGZyb250ZW5kX2NwcF9maWxl
LndyaXRlKFRlbXBsYXRlcy5mcm9udGVuZF9jcHAuc3Vic3RpdHV0ZShOb25lLAogCiB0eXBlYnVp
bGRlcl9oX2ZpbGUud3JpdGUoVGVtcGxhdGVzLnR5cGVidWlsZGVyX2guc3Vic3RpdHV0ZShOb25l
LAogICAgIHR5cGVCdWlsZGVycz0iIi5qb2luKGZsYXR0ZW5fbGlzdChHZW5lcmF0b3IudHlwZV9i
dWlsZGVyX2ZyYWdtZW50cykpLAotICAgIGZvcndhcmRzPSIiLmpvaW4oR2VuZXJhdG9yLnR5cGVf
YnVpbGRlcl9mb3J3YXJkcykpKQorICAgIGZvcndhcmRzPSIiLmpvaW4oR2VuZXJhdG9yLnR5cGVf
YnVpbGRlcl9mb3J3YXJkcyksCisgICAgdmFsaWRhdG9ySWZkZWZOYW1lPVZBTElEQVRPUl9JRkRF
Rl9OQU1FKSkKIAogdHlwZWJ1aWxkZXJfY3BwX2ZpbGUud3JpdGUoVGVtcGxhdGVzLnR5cGVidWls
ZGVyX2NwcC5zdWJzdGl0dXRlKE5vbmUsCiAgICAgZW51bUNvbnN0YW50VmFsdWVzPUVudW1Db25z
dGFudHMuZ2V0X2VudW1fY29uc3RhbnRfY29kZSgpLAogICAgIGltcGxDb2RlPSIiLmpvaW4oZmxh
dHRlbl9saXN0KEdlbmVyYXRvci50eXBlX2J1aWxkZXJfaW1wbF9saXN0KSksCi0gICAgdmFsaWRh
dG9yQ29kZT0iIi5qb2luKGZsYXR0ZW5fbGlzdChHZW5lcmF0b3IudmFsaWRhdG9yX2ltcGxfbGlz
dCkpKSkKKyAgICB2YWxpZGF0b3JDb2RlPSIiLmpvaW4oZmxhdHRlbl9saXN0KEdlbmVyYXRvci52
YWxpZGF0b3JfaW1wbF9saXN0KSksCisgICAgdmFsaWRhdG9ySWZkZWZOYW1lPVZBTElEQVRPUl9J
RkRFRl9OQU1FKSkKIAogYmFja2VuZF9qc19maWxlLndyaXRlKFRlbXBsYXRlcy5iYWNrZW5kX2pz
LnN1YnN0aXR1dGUoTm9uZSwKICAgICBkb21haW5Jbml0aWFsaXplcnM9IiIuam9pbihHZW5lcmF0
b3IuYmFja2VuZF9qc19kb21haW5faW5pdGlhbGl6ZXJfbGlzdCkpKQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdzLnB5IGIv
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3JTdHJpbmdzLnB5
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmY3MjA0ZDFhM2FmMzc2NWE5MDA3N2Y3YzJkOTQyZjFhNDNiNjE1NDYKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvQ29kZUdlbmVyYXRvcklu
c3BlY3RvclN0cmluZ3MucHkKQEAgLTAsMCArMSw5NTQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEz
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisj
IFRIaXMgZmlsZSBjb250YWlucyBzdHJpbmcgcmVzb3VyY2VzIGZvciBDb2RlR2VuZXJhdG9ySW5z
cGVjdG9yLgorIyBJdHMgc3ludGF4IGlzIGEgUHl0aG9uIHN5bnRheCBzdWJzZXQsIHN1aXRhYmxl
IGZvciBtYW51YWwgcGFyc2luZy4KKworZnJvbnRlbmRfZG9tYWluX2NsYXNzID0gKAorIiIiICAg
IGNsYXNzICRkb21haW5DbGFzc05hbWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgJGRvbWFpbkNs
YXNzTmFtZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
IHsgfQorJHtmcm9udGVuZERvbWFpbk1ldGhvZERlY2xhcmF0aW9uc30gICAgICAgIHZvaWQgc2V0
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsOyB9CisgICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCog
Z2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7IH0KKyAgICBwcml2YXRlOgorICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOworICAgIH07CisKKyAgICAkZG9tYWluQ2xh
c3NOYW1lKiAkZG9tYWluRmllbGROYW1lKCkgeyByZXR1cm4gJm1fJGRvbWFpbkZpZWxkTmFtZTsg
fQorCisiIiIpCisKK2JhY2tlbmRfbWV0aG9kID0gKAorIiIidm9pZCBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlckltcGw6OiR7ZG9tYWluTmFtZX1fJG1ldGhvZE5hbWUobG9uZyBjYWxsSWQsIElu
c3BlY3Rvck9iamVjdCokcmVxdWVzdE1lc3NhZ2VPYmplY3QpCit7CisgICAgUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiBwcm90b2NvbEVycm9ycyA9IEluc3BlY3RvckFycmF5OjpjcmVhdGUoKTsKKwor
ICAgIGlmICghJGFnZW50RmllbGQpCisgICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5n
KCIke2RvbWFpbk5hbWV9IGhhbmRsZXIgaXMgbm90IGF2YWlsYWJsZS4iKTsKKyRtZXRob2RPdXRD
b2RlCiskbWV0aG9kSW5Db2RlCisgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzdWx0ID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKKyAgICBFcnJvclN0cmluZyBlcnJvcjsKKyAgICBp
ZiAoIXByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgeworICAgICAgICAkYWdlbnRGaWVsZC0+JG1l
dGhvZE5hbWUoJmVycm9yJGFnZW50Q2FsbFBhcmFtcyk7CisKKyR7cmVzcG9uc2VDb29rfQorICAg
IH0KKyAgICBzZW5kUmVzcG9uc2UoY2FsbElkLCByZXN1bHQsIGNvbW1hbmROYW1lc1skY29tbWFu
ZE5hbWVJbmRleF0sIHByb3RvY29sRXJyb3JzLCBlcnJvcik7Cit9CisiIiIpCisKK2Zyb250ZW5k
X21ldGhvZCA9ICgiIiJ2b2lkIEluc3BlY3RvckZyb250ZW5kOjokZG9tYWluTmFtZTo6JGV2ZW50
TmFtZSgkcGFyYW1ldGVycykKK3sKKyAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBqc29uTWVz
c2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CisgICAganNvbk1lc3NhZ2UtPnNldFN0
cmluZygibWV0aG9kIiwgIiRkb21haW5OYW1lLiRldmVudE5hbWUiKTsKKyRjb2RlICAgIGlmICht
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKKyAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChqc29uTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkp
OworfQorIiIiKQorCitjYWxsYmFja19tZXRob2QgPSAoCisiIiJJbnNwZWN0b3JCYWNrZW5kRGlz
cGF0Y2hlcjo6JGFnZW50TmFtZTo6JGNhbGxiYWNrTmFtZTo6JGNhbGxiYWNrTmFtZShQYXNzUmVm
UHRyPEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbD4gYmFja2VuZEltcGwsIGludCBpZCkg
OiBDYWxsYmFja0Jhc2UoYmFja2VuZEltcGwsIGlkKSB7fQorCit2b2lkIEluc3BlY3RvckJhY2tl
bmREaXNwYXRjaGVyOjokYWdlbnROYW1lOjokY2FsbGJhY2tOYW1lOjpzZW5kU3VjY2VzcygkcGFy
YW1ldGVycykKK3sKKyAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBqc29uTWVzc2FnZSA9IElu
c3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiskY29kZSAgICBzZW5kSWZBY3RpdmUoanNvbk1lc3Nh
Z2UsIEVycm9yU3RyaW5nKCkpOworfQorIiIiKQorCitmcm9udGVuZF9oID0gKAorIiIiI2lmbmRl
ZiBJbnNwZWN0b3JGcm9udGVuZF9oCisjZGVmaW5lIEluc3BlY3RvckZyb250ZW5kX2gKKworI2lu
Y2x1ZGUgIkluc3BlY3RvclR5cGVCdWlsZGVyLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVz
LmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZT
dHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7CisKKy8vIEJvdGggSW5zcGVjdG9yT2JqZWN0IGFuZCBJbnNwZWN0b3JBcnJheSBt
YXkgb3IgbWF5IG5vdCBiZSBkZWNsYXJlZCBhdCB0aGlzIHBvaW50IGFzIGRlZmluZWQgYnkgRU5B
QkxFRF9JTlNQRUNUT1IuCisvLyBEb3VibGUtY2hlY2sgd2UgaGF2ZSB0aGVtIGF0IGxlYXN0IGFz
IGZvcndhcmQgZGVjbGFyYXRpb24uCitjbGFzcyBJbnNwZWN0b3JBcnJheTsKK2NsYXNzIEluc3Bl
Y3Rvck9iamVjdDsKKwordHlwZWRlZiBTdHJpbmcgRXJyb3JTdHJpbmc7CisKKyNpZiBFTkFCTEUo
SU5TUEVDVE9SKQorCitjbGFzcyBJbnNwZWN0b3JGcm9udGVuZCB7CitwdWJsaWM6CisgICAgSW5z
cGVjdG9yRnJvbnRlbmQoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKik7CisKKworJGRvbWFpbkNs
YXNzTGlzdAorcHJpdmF0ZToKKyR7ZmllbGREZWNsYXJhdGlvbnN9fTsKKworI2VuZGlmIC8vIEVO
QUJMRShJTlNQRUNUT1IpCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKyNlbmRpZiAvLyAhZGVm
aW5lZChJbnNwZWN0b3JGcm9udGVuZF9oKQorIiIiKQorCitiYWNrZW5kX2ggPSAoCisiIiIjaWZu
ZGVmIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyX2gKKyNkZWZpbmUgSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXJfaAorCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3
dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorI2luY2x1
ZGUgIkluc3BlY3RvclR5cGVCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xh
c3MgSW5zcGVjdG9yQWdlbnQ7CitjbGFzcyBJbnNwZWN0b3JPYmplY3Q7CitjbGFzcyBJbnNwZWN0
b3JBcnJheTsKK2NsYXNzIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKKwordHlwZWRlZiBTdHJp
bmcgRXJyb3JTdHJpbmc7CisKK2NsYXNzIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDsK
KworY2xhc3MgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6IHB1YmxpYyBSZWZDb3VudGVkPElu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVyPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI+IGNyZWF0ZShJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCk7CisgICAgdmlydHVhbCB+SW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXIoKSB7IH0KKworICAgIGNsYXNzIENhbGxiYWNrQmFzZTogcHVibGlj
IFJlZkNvdW50ZWQ8Q2FsbGJhY2tCYXNlPiB7CisgICAgcHVibGljOgorICAgICAgICBDYWxsYmFj
a0Jhc2UoUGFzc1JlZlB0cjxJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw+IGJhY2tlbmRJ
bXBsLCBpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIH5DYWxsYmFja0Jhc2UoKTsKKyAgICAgICAg
dm9pZCBzZW5kRmFpbHVyZShjb25zdCBFcnJvclN0cmluZyYpOworICAgICAgICBib29sIGlzQWN0
aXZlKCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgc2VuZElmQWN0aXZlKFBhc3NS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJ0aWFsTWVzc2FnZSwgY29uc3QgRXJyb3JTdHJpbmcm
IGludm9jYXRpb25FcnJvcik7CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIGRpc2FibGUo
KSB7IG1fYWxyZWFkeVNlbnQgPSB0cnVlOyB9CisKKyAgICAgICAgUmVmUHRyPEluc3BlY3RvckJh
Y2tlbmREaXNwYXRjaGVySW1wbD4gbV9iYWNrZW5kSW1wbDsKKyAgICAgICAgaW50IG1faWQ7Cisg
ICAgICAgIGJvb2wgbV9hbHJlYWR5U2VudDsKKworICAgICAgICBmcmllbmQgY2xhc3MgSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXJJbXBsOworICAgIH07CisKKyRhZ2VudEludGVyZmFjZXMKKyR2
aXJ0dWFsU2V0dGVycworCisgICAgdmlydHVhbCB2b2lkIGNsZWFyRnJvbnRlbmQoKSA9IDA7CisK
KyAgICBlbnVtIENvbW1vbkVycm9yQ29kZSB7CisgICAgICAgIFBhcnNlRXJyb3IgPSAwLAorICAg
ICAgICBJbnZhbGlkUmVxdWVzdCwKKyAgICAgICAgTWV0aG9kTm90Rm91bmQsCisgICAgICAgIElu
dmFsaWRQYXJhbXMsCisgICAgICAgIEludGVybmFsRXJyb3IsCisgICAgICAgIFNlcnZlckVycm9y
LAorICAgICAgICBMYXN0RW50cnksCisgICAgfTsKKworICAgIHZvaWQgcmVwb3J0UHJvdG9jb2xF
cnJvcihjb25zdCBsb25nKiBjb25zdCBjYWxsSWQsIENvbW1vbkVycm9yQ29kZSwgY29uc3QgU3Ry
aW5nJiBlcnJvck1lc3NhZ2UpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCByZXBvcnRQcm90b2Nv
bEVycm9yKGNvbnN0IGxvbmcqIGNvbnN0IGNhbGxJZCwgQ29tbW9uRXJyb3JDb2RlLCBjb25zdCBT
dHJpbmcmIGVycm9yTWVzc2FnZSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gZGF0YSkgY29u
c3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaChjb25zdCBTdHJpbmcmIG1lc3NhZ2Up
ID0gMDsKKyAgICBzdGF0aWMgYm9vbCBnZXRDb21tYW5kTmFtZShjb25zdCBTdHJpbmcmIG1lc3Nh
Z2UsIFN0cmluZyogcmVzdWx0KTsKKworICAgIGVudW0gTWV0aG9kTmFtZXMgeworJG1ldGhvZE5h
bWVzRW51bUNvbnRlbnQKKworICAgICAgICBrTWV0aG9kTmFtZXNFbnVtU2l6ZQorICAgIH07CisK
KyAgICBzdGF0aWMgY29uc3QgY2hhciogY29tbWFuZE5hbWVzW107Cit9OworCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisjZW5kaWYgLy8gIWRlZmluZWQoSW5zcGVjdG9yQmFja2VuZERpc3BhdGNo
ZXJfaCkKKworCisiIiIpCisKK2JhY2tlbmRfY3BwID0gKAorIiIiCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKworI2lmIEVOQUJMRShJTlNQRUNUT1IpCisKKyNpbmNsdWRlICJJbnNwZWN0b3JCYWNr
ZW5kRGlzcGF0Y2hlci5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorI2luY2x1
ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworI2luY2x1ZGUgIkluc3BlY3RvckFnZW50LmgiCisj
aW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworY29uc3QgY2hhciogSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmNvbW1h
bmROYW1lc1tdID0geworJG1ldGhvZE5hbWVEZWNsYXJhdGlvbnMKK307CisKKworY2xhc3MgSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXJJbXBsIDogcHVibGljIEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVyIHsKK3B1YmxpYzoKKyAgICBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGwoSW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCisgICAgICAg
IDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQor
JGNvbnN0cnVjdG9ySW5pdAorICAgIHsgfQorCisgICAgdmlydHVhbCB2b2lkIGNsZWFyRnJvbnRl
bmQoKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gMDsgfQorICAgIHZpcnR1YWwgdm9p
ZCBkaXNwYXRjaChjb25zdCBTdHJpbmcmIG1lc3NhZ2UpOworICAgIHZpcnR1YWwgdm9pZCByZXBv
cnRQcm90b2NvbEVycm9yKGNvbnN0IGxvbmcqIGNvbnN0IGNhbGxJZCwgQ29tbW9uRXJyb3JDb2Rl
LCBjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4g
ZGF0YSkgY29uc3Q7CisgICAgdXNpbmcgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OnJlcG9y
dFByb3RvY29sRXJyb3I7CisKKyAgICB2b2lkIHNlbmRSZXNwb25zZShsb25nIGNhbGxJZCwgUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3VsdCwgY29uc3QgRXJyb3JTdHJpbmcmIGludm9j
YXRpb25FcnJvcik7CisgICAgYm9vbCBpc0FjdGl2ZSgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsOyB9CisKKyRzZXR0ZXJzCitwcml2YXRlOgorJG1ldGhvZERlY2xhcmF0aW9u
cworCisgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbDsKKyRmaWVsZERlY2xhcmF0aW9ucworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlw
ZW5hbWUgViwgdHlwZW5hbWUgVjA+CisgICAgc3RhdGljIFIgZ2V0UHJvcGVydHlWYWx1ZUltcGwo
SW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVG
b3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzLCBWMCBpbml0aWFsX3ZhbHVlLCBi
b29sICgqYXNfbWV0aG9kKShJbnNwZWN0b3JWYWx1ZSosIFYqKSwgY29uc3QgY2hhciogdHlwZV9u
YW1lKTsKKworICAgIHN0YXRpYyBpbnQgZ2V0SW50KEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBj
b25zdCBTdHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90
b2NvbEVycm9ycyk7CisgICAgc3RhdGljIGRvdWJsZSBnZXREb3VibGUoSW5zcGVjdG9yT2JqZWN0
KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9y
QXJyYXkqIHByb3RvY29sRXJyb3JzKTsKKyAgICBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhJbnNw
ZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5k
LCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpOworICAgIHN0YXRpYyBib29sIGdldEJv
b2xlYW4oSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCog
dmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzKTsKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGdldE9iamVjdChJbnNwZWN0b3JPYmplY3QqIG9i
amVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJh
eSogcHJvdG9jb2xFcnJvcnMpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5
PiBnZXRBcnJheShJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3RyaW5nJiBuYW1lLCBi
b29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJvcnMpOworCisgICAg
dm9pZCBzZW5kUmVzcG9uc2UobG9uZyBjYWxsSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiByZXN1bHQsIGNvbnN0IGNoYXIqIGNvbW1hbmROYW1lLCBQYXNzUmVmUHRyPEluc3BlY3RvckFy
cmF5PiBwcm90b2NvbEVycm9ycywgRXJyb3JTdHJpbmcgaW52b2NhdGlvbkVycm9yKTsKKworfTsK
KworJG1ldGhvZHMKKworUGFzc1JlZlB0cjxJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcj4gSW5z
cGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OmNyZWF0ZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwq
IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IElu
c3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpKTsK
K30KKworCit2b2lkIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6ZGlzcGF0Y2goY29u
c3QgU3RyaW5nJiBtZXNzYWdlKQoreworICAgIFJlZlB0cjxJbnNwZWN0b3JCYWNrZW5kRGlzcGF0
Y2hlcj4gcHJvdGVjdCA9IHRoaXM7CisgICAgdHlwZWRlZiB2b2lkIChJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlckltcGw6OipDYWxsSGFuZGxlcikobG9uZyBjYWxsSWQsIEluc3BlY3Rvck9iamVj
dCogbWVzc2FnZU9iamVjdCk7CisgICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgQ2FsbEhhbmRs
ZXI+IERpc3BhdGNoTWFwOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoRGlzcGF0Y2hNYXAsIGRp
c3BhdGNoTWFwLCApOworICAgIGxvbmcgY2FsbElkID0gMDsKKworICAgIGlmIChkaXNwYXRjaE1h
cC5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3RhdGljIENhbGxIYW5kbGVyIGhhbmRsZXJzW10gPSB7
CiskbWVzc2FnZUhhbmRsZXJzCisgICAgICAgIH07CisgICAgICAgIHNpemVfdCBsZW5ndGggPSBX
VEZfQVJSQVlfTEVOR1RIKGNvbW1hbmROYW1lcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICBkaXNwYXRjaE1hcC5hZGQoY29tbWFuZE5h
bWVzW2ldLCBoYW5kbGVyc1tpXSk7CisgICAgfQorCisgICAgUmVmUHRyPEluc3BlY3RvclZhbHVl
PiBwYXJzZWRNZXNzYWdlID0gSW5zcGVjdG9yVmFsdWU6OnBhcnNlSlNPTihtZXNzYWdlKTsKKyAg
ICBpZiAoIXBhcnNlZE1lc3NhZ2UpIHsKKyAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcigwLCBQ
YXJzZUVycm9yLCAiTWVzc2FnZSBtdXN0IGJlIGluIEpTT04gZm9ybWF0Iik7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlT2JqZWN0
ID0gcGFyc2VkTWVzc2FnZS0+YXNPYmplY3QoKTsKKyAgICBpZiAoIW1lc3NhZ2VPYmplY3QpIHsK
KyAgICAgICAgcmVwb3J0UHJvdG9jb2xFcnJvcigwLCBJbnZhbGlkUmVxdWVzdCwgIk1lc3NhZ2Ug
bXVzdCBiZSBhIEpTT05pZmllZCBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIFJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gY2FsbElkVmFsdWUgPSBtZXNzYWdlT2JqZWN0LT5n
ZXQoImlkIik7CisgICAgaWYgKCFjYWxsSWRWYWx1ZSkgeworICAgICAgICByZXBvcnRQcm90b2Nv
bEVycm9yKDAsIEludmFsaWRSZXF1ZXN0LCAiJ2lkJyBwcm9wZXJ0eSB3YXMgbm90IGZvdW5kIik7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWNhbGxJZFZhbHVlLT5hc051bWJl
cigmY2FsbElkKSkgeworICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKDAsIEludmFsaWRSZXF1
ZXN0LCAiVGhlIHR5cGUgb2YgJ2lkJyBwcm9wZXJ0eSBtdXN0IGJlIG51bWJlciIpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgUmVmUHRyPEluc3BlY3RvclZhbHVlPiBtZXRob2RWYWx1
ZSA9IG1lc3NhZ2VPYmplY3QtPmdldCgibWV0aG9kIik7CisgICAgaWYgKCFtZXRob2RWYWx1ZSkg
eworICAgICAgICByZXBvcnRQcm90b2NvbEVycm9yKCZjYWxsSWQsIEludmFsaWRSZXF1ZXN0LCAi
J21ldGhvZCcgcHJvcGVydHkgd2Fzbid0IGZvdW5kIik7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBTdHJpbmcgbWV0aG9kOworICAgIGlmICghbWV0aG9kVmFsdWUtPmFzU3RyaW5nKCZt
ZXRob2QpKSB7CisgICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoJmNhbGxJZCwgSW52YWxpZFJl
cXVlc3QsICJUaGUgdHlwZSBvZiAnbWV0aG9kJyBwcm9wZXJ0eSBtdXN0IGJlIHN0cmluZyIpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSGFzaE1hcDxTdHJpbmcsIENhbGxIYW5kbGVy
Pjo6aXRlcmF0b3IgaXQgPSBkaXNwYXRjaE1hcC5maW5kKG1ldGhvZCk7CisgICAgaWYgKGl0ID09
IGRpc3BhdGNoTWFwLmVuZCgpKSB7CisgICAgICAgIHJlcG9ydFByb3RvY29sRXJyb3IoJmNhbGxJ
ZCwgTWV0aG9kTm90Rm91bmQsICInIiArIG1ldGhvZCArICInIHdhc24ndCBmb3VuZCIpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgKCgqdGhpcykuKml0LT52YWx1ZSkoY2FsbElkLCBt
ZXNzYWdlT2JqZWN0LmdldCgpKTsKK30KKwordm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
ckltcGw6OnNlbmRSZXNwb25zZShsb25nIGNhbGxJZCwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHJlc3VsdCwgY29uc3QgY2hhciogY29tbWFuZE5hbWUsIFBhc3NSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IHByb3RvY29sRXJyb3JzLCBFcnJvclN0cmluZyBpbnZvY2F0aW9uRXJyb3IpCit7Cisg
ICAgaWYgKHByb3RvY29sRXJyb3JzLT5sZW5ndGgoKSkgeworICAgICAgICBTdHJpbmcgZXJyb3JN
ZXNzYWdlID0gU3RyaW5nOjpmb3JtYXQoIlNvbWUgYXJndW1lbnRzIG9mIG1ldGhvZCAnJXMnIGNh
bid0IGJlIHByb2Nlc3NlZCIsIGNvbW1hbmROYW1lKTsKKyAgICAgICAgcmVwb3J0UHJvdG9jb2xF
cnJvcigmY2FsbElkLCBJbnZhbGlkUGFyYW1zLCBlcnJvck1lc3NhZ2UsIHByb3RvY29sRXJyb3Jz
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZW5kUmVzcG9uc2UoY2FsbElkLCByZXN1
bHQsIGludm9jYXRpb25FcnJvcik7Cit9CisKK3ZvaWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNo
ZXJJbXBsOjpzZW5kUmVzcG9uc2UobG9uZyBjYWxsSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiByZXN1bHQsIGNvbnN0IEVycm9yU3RyaW5nJiBpbnZvY2F0aW9uRXJyb3IpCit7CisgICAg
aWYgKGludm9jYXRpb25FcnJvci5sZW5ndGgoKSkgeworICAgICAgICByZXBvcnRQcm90b2NvbEVy
cm9yKCZjYWxsSWQsIFNlcnZlckVycm9yLCBpbnZvY2F0aW9uRXJyb3IpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2VNZXNzYWdl
ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKKyAgICByZXNwb25zZU1lc3NhZ2UtPnNldE9i
amVjdCgicmVzdWx0IiwgcmVzdWx0KTsKKyAgICByZXNwb25zZU1lc3NhZ2UtPnNldE51bWJlcigi
aWQiLCBjYWxsSWQpOworICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKKyAgICAg
ICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXNw
b25zZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKK30KKwordm9pZCBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlcjo6cmVwb3J0UHJvdG9jb2xFcnJvcihjb25zdCBsb25nKiBjb25zdCBjYWxsSWQs
IENvbW1vbkVycm9yQ29kZSBjb2RlLCBjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSkgY29uc3QK
K3sKKyAgICByZXBvcnRQcm90b2NvbEVycm9yKGNhbGxJZCwgY29kZSwgZXJyb3JNZXNzYWdlLCAw
KTsKK30KKwordm9pZCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlckltcGw6OnJlcG9ydFByb3Rv
Y29sRXJyb3IoY29uc3QgbG9uZyogY29uc3QgY2FsbElkLCBDb21tb25FcnJvckNvZGUgY29kZSwg
Y29uc3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UsIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGRh
dGEpIGNvbnN0Cit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChWZWN0b3I8aW50PixzX2NvbW1v
bkVycm9ycywpOworICAgIGlmICghc19jb21tb25FcnJvcnMuc2l6ZSgpKSB7CisgICAgICAgIHNf
Y29tbW9uRXJyb3JzLmluc2VydChQYXJzZUVycm9yLCAtMzI3MDApOworICAgICAgICBzX2NvbW1v
bkVycm9ycy5pbnNlcnQoSW52YWxpZFJlcXVlc3QsIC0zMjYwMCk7CisgICAgICAgIHNfY29tbW9u
RXJyb3JzLmluc2VydChNZXRob2ROb3RGb3VuZCwgLTMyNjAxKTsKKyAgICAgICAgc19jb21tb25F
cnJvcnMuaW5zZXJ0KEludmFsaWRQYXJhbXMsIC0zMjYwMik7CisgICAgICAgIHNfY29tbW9uRXJy
b3JzLmluc2VydChJbnRlcm5hbEVycm9yLCAtMzI2MDMpOworICAgICAgICBzX2NvbW1vbkVycm9y
cy5pbnNlcnQoU2VydmVyRXJyb3IsIC0zMjAwMCk7CisgICAgfQorICAgIEFTU0VSVChjb2RlID49
MCk7CisgICAgQVNTRVJUKCh1bnNpZ25lZCljb2RlIDwgc19jb21tb25FcnJvcnMuc2l6ZSgpKTsK
KyAgICBBU1NFUlQoc19jb21tb25FcnJvcnNbY29kZV0pOworICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IGVycm9yID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKKyAgICBlcnJvci0+c2V0
TnVtYmVyKCJjb2RlIiwgc19jb21tb25FcnJvcnNbY29kZV0pOworICAgIGVycm9yLT5zZXRTdHJp
bmcoIm1lc3NhZ2UiLCBlcnJvck1lc3NhZ2UpOworICAgIEFTU0VSVChlcnJvcik7CisgICAgaWYg
KGRhdGEpCisgICAgICAgIGVycm9yLT5zZXRBcnJheSgiZGF0YSIsIGRhdGEpOworICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwor
ICAgIG1lc3NhZ2UtPnNldE9iamVjdCgiZXJyb3IiLCBlcnJvcik7CisgICAgaWYgKGNhbGxJZCkK
KyAgICAgICAgbWVzc2FnZS0+c2V0TnVtYmVyKCJpZCIsICpjYWxsSWQpOworICAgIGVsc2UKKyAg
ICAgICAgbWVzc2FnZS0+c2V0VmFsdWUoImlkIiwgSW5zcGVjdG9yVmFsdWU6Om51bGwoKSk7Cisg
ICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQorICAgICAgICBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKG1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgViwgdHlwZW5hbWUgVjA+
CitSIEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6Z2V0UHJvcGVydHlWYWx1ZUltcGwo
SW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVG
b3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29sRXJyb3JzLCBWMCBpbml0aWFsX3ZhbHVlLCBi
b29sICgqYXNfbWV0aG9kKShJbnNwZWN0b3JWYWx1ZSosIFYqKSwgY29uc3QgY2hhciogdHlwZV9u
YW1lKQoreworICAgIEFTU0VSVChwcm90b2NvbEVycm9ycyk7CisKKyAgICBpZiAodmFsdWVGb3Vu
ZCkKKyAgICAgICAgKnZhbHVlRm91bmQgPSBmYWxzZTsKKworICAgIFYgdmFsdWUgPSBpbml0aWFs
X3ZhbHVlOworCisgICAgaWYgKCFvYmplY3QpIHsKKyAgICAgICAgaWYgKCF2YWx1ZUZvdW5kKSB7
CisgICAgICAgICAgICAvLyBSZXF1aXJlZCBwYXJhbWV0ZXIgaW4gbWlzc2luZyBwYXJhbXMgY29u
dGFpbmVyLgorICAgICAgICAgICAgcHJvdG9jb2xFcnJvcnMtPnB1c2hTdHJpbmcoU3RyaW5nOjpm
b3JtYXQoIidwYXJhbXMnIG9iamVjdCBtdXN0IGNvbnRhaW4gcmVxdWlyZWQgcGFyYW1ldGVyICcl
cycgd2l0aCB0eXBlICclcycuIiwgbmFtZS51dGY4KCkuZGF0YSgpLCB0eXBlX25hbWUpKTsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgSW5zcGVjdG9yT2Jq
ZWN0Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBvYmplY3QtPmVuZCgpOworICAgIEluc3BlY3Rvck9i
amVjdDo6Y29uc3RfaXRlcmF0b3IgdmFsdWVJdGVyYXRvciA9IG9iamVjdC0+ZmluZChuYW1lKTsK
KworICAgIGlmICh2YWx1ZUl0ZXJhdG9yID09IGVuZCkgeworICAgICAgICBpZiAoIXZhbHVlRm91
bmQpCisgICAgICAgICAgICBwcm90b2NvbEVycm9ycy0+cHVzaFN0cmluZyhTdHJpbmc6OmZvcm1h
dCgiUGFyYW1ldGVyICclcycgd2l0aCB0eXBlICclcycgd2FzIG5vdCBmb3VuZC4iLCBuYW1lLnV0
ZjgoKS5kYXRhKCksIHR5cGVfbmFtZSkpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQor
CisgICAgaWYgKCFhc19tZXRob2QodmFsdWVJdGVyYXRvci0+dmFsdWUuZ2V0KCksICZ2YWx1ZSkp
CisgICAgICAgIHByb3RvY29sRXJyb3JzLT5wdXNoU3RyaW5nKFN0cmluZzo6Zm9ybWF0KCJQYXJh
bWV0ZXIgJyVzJyBoYXMgd3JvbmcgdHlwZS4gSXQgbXVzdCBiZSAnJXMnLiIsIG5hbWUudXRmOCgp
LmRhdGEoKSwgdHlwZV9uYW1lKSk7CisgICAgZWxzZQorICAgICAgICBpZiAodmFsdWVGb3VuZCkK
KyAgICAgICAgICAgICp2YWx1ZUZvdW5kID0gdHJ1ZTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisK
K3N0cnVjdCBBc01ldGhvZEJyaWRnZXMgeworICAgIHN0YXRpYyBib29sIGFzSW50KEluc3BlY3Rv
clZhbHVlKiB2YWx1ZSwgaW50KiBvdXRwdXQpIHsgcmV0dXJuIHZhbHVlLT5hc051bWJlcihvdXRw
dXQpOyB9CisgICAgc3RhdGljIGJvb2wgYXNEb3VibGUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlLCBk
b3VibGUqIG91dHB1dCkgeyByZXR1cm4gdmFsdWUtPmFzTnVtYmVyKG91dHB1dCk7IH0KKyAgICBz
dGF0aWMgYm9vbCBhc1N0cmluZyhJbnNwZWN0b3JWYWx1ZSogdmFsdWUsIFN0cmluZyogb3V0cHV0
KSB7IHJldHVybiB2YWx1ZS0+YXNTdHJpbmcob3V0cHV0KTsgfQorICAgIHN0YXRpYyBib29sIGFz
Qm9vbGVhbihJbnNwZWN0b3JWYWx1ZSogdmFsdWUsIGJvb2wqIG91dHB1dCkgeyByZXR1cm4gdmFs
dWUtPmFzQm9vbGVhbihvdXRwdXQpOyB9CisgICAgc3RhdGljIGJvb2wgYXNPYmplY3QoSW5zcGVj
dG9yVmFsdWUqIHZhbHVlLCBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0Piogb3V0cHV0KSB7IHJldHVy
biB2YWx1ZS0+YXNPYmplY3Qob3V0cHV0KTsgfQorICAgIHN0YXRpYyBib29sIGFzQXJyYXkoSW5z
cGVjdG9yVmFsdWUqIHZhbHVlLCBSZWZQdHI8SW5zcGVjdG9yQXJyYXk+KiBvdXRwdXQpIHsgcmV0
dXJuIHZhbHVlLT5hc0FycmF5KG91dHB1dCk7IH0KK307CisKK2ludCBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlckltcGw6OmdldEludChJbnNwZWN0b3JPYmplY3QqIG9iamVjdCwgY29uc3QgU3Ry
aW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSogcHJvdG9jb2xFcnJv
cnMpCit7CisgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWVJbXBsPGludCwgaW50LCBpbnQ+KG9i
amVjdCwgbmFtZSwgdmFsdWVGb3VuZCwgcHJvdG9jb2xFcnJvcnMsIDAsIEFzTWV0aG9kQnJpZGdl
czo6YXNJbnQsICJOdW1iZXIiKTsKK30KKworZG91YmxlIEluc3BlY3RvckJhY2tlbmREaXNwYXRj
aGVySW1wbDo6Z2V0RG91YmxlKEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcm
IG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycykK
K3sKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZUltcGw8ZG91YmxlLCBkb3VibGUsIGRvdWJs
ZT4ob2JqZWN0LCBuYW1lLCB2YWx1ZUZvdW5kLCBwcm90b2NvbEVycm9ycywgMCwgQXNNZXRob2RC
cmlkZ2VzOjphc0RvdWJsZSwgIk51bWJlciIpOworfQorCitTdHJpbmcgSW5zcGVjdG9yQmFja2Vu
ZERpc3BhdGNoZXJJbXBsOjpnZXRTdHJpbmcoSW5zcGVjdG9yT2JqZWN0KiBvYmplY3QsIGNvbnN0
IFN0cmluZyYgbmFtZSwgYm9vbCogdmFsdWVGb3VuZCwgSW5zcGVjdG9yQXJyYXkqIHByb3RvY29s
RXJyb3JzKQoreworICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlSW1wbDxTdHJpbmcsIFN0cmlu
ZywgU3RyaW5nPihvYmplY3QsIG5hbWUsIHZhbHVlRm91bmQsIHByb3RvY29sRXJyb3JzLCAiIiwg
QXNNZXRob2RCcmlkZ2VzOjphc1N0cmluZywgIlN0cmluZyIpOworfQorCitib29sIEluc3BlY3Rv
ckJhY2tlbmREaXNwYXRjaGVySW1wbDo6Z2V0Qm9vbGVhbihJbnNwZWN0b3JPYmplY3QqIG9iamVj
dCwgY29uc3QgU3RyaW5nJiBuYW1lLCBib29sKiB2YWx1ZUZvdW5kLCBJbnNwZWN0b3JBcnJheSog
cHJvdG9jb2xFcnJvcnMpCit7CisgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWVJbXBsPGJvb2ws
IGJvb2wsIGJvb2w+KG9iamVjdCwgbmFtZSwgdmFsdWVGb3VuZCwgcHJvdG9jb2xFcnJvcnMsIGZh
bHNlLCBBc01ldGhvZEJyaWRnZXM6OmFzQm9vbGVhbiwgIkJvb2xlYW4iKTsKK30KKworUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IEluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVySW1wbDo6Z2V0
T2JqZWN0KEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wq
IHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVycm9ycykKK3sKKyAgICByZXR1
cm4gZ2V0UHJvcGVydHlWYWx1ZUltcGw8UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+LCBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiwgSW5zcGVjdG9yT2JqZWN0Kj4ob2JqZWN0LCBuYW1lLCB2YWx1
ZUZvdW5kLCBwcm90b2NvbEVycm9ycywgMCwgQXNNZXRob2RCcmlkZ2VzOjphc09iamVjdCwgIk9i
amVjdCIpOworfQorCitQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlckltcGw6OmdldEFycmF5KEluc3BlY3Rvck9iamVjdCogb2JqZWN0LCBjb25zdCBT
dHJpbmcmIG5hbWUsIGJvb2wqIHZhbHVlRm91bmQsIEluc3BlY3RvckFycmF5KiBwcm90b2NvbEVy
cm9ycykKK3sKKyAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZUltcGw8UGFzc1JlZlB0cjxJbnNw
ZWN0b3JBcnJheT4sIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4sIEluc3BlY3RvckFycmF5Kj4ob2Jq
ZWN0LCBuYW1lLCB2YWx1ZUZvdW5kLCBwcm90b2NvbEVycm9ycywgMCwgQXNNZXRob2RCcmlkZ2Vz
Ojphc0FycmF5LCAiQXJyYXkiKTsKK30KKworYm9vbCBJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hl
cjo6Z2V0Q29tbWFuZE5hbWUoY29uc3QgU3RyaW5nJiBtZXNzYWdlLCBTdHJpbmcqIHJlc3VsdCkK
K3sKKyAgICBSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IHZhbHVlID0gSW5zcGVjdG9yVmFsdWU6OnBh
cnNlSlNPTihtZXNzYWdlKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBvYmplY3QgPSB2YWx1ZS0+YXNPYmplY3Qo
KTsKKyAgICBpZiAoIW9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFv
YmplY3QtPmdldFN0cmluZygibWV0aG9kIiwgcmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0luc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyOjpD
YWxsYmFja0Jhc2U6OkNhbGxiYWNrQmFzZShQYXNzUmVmUHRyPEluc3BlY3RvckJhY2tlbmREaXNw
YXRjaGVySW1wbD4gYmFja2VuZEltcGwsIGludCBpZCkKKyAgICA6IG1fYmFja2VuZEltcGwoYmFj
a2VuZEltcGwpLCBtX2lkKGlkKSwgbV9hbHJlYWR5U2VudChmYWxzZSkge30KKworSW5zcGVjdG9y
QmFja2VuZERpc3BhdGNoZXI6OkNhbGxiYWNrQmFzZTo6fkNhbGxiYWNrQmFzZSgpIHt9CisKK3Zv
aWQgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXI6OkNhbGxiYWNrQmFzZTo6c2VuZEZhaWx1cmUo
Y29uc3QgRXJyb3JTdHJpbmcmIGVycm9yKQoreworICAgIEFTU0VSVChlcnJvci5sZW5ndGgoKSk7
CisgICAgc2VuZElmQWN0aXZlKDAsIGVycm9yKTsKK30KKworYm9vbCBJbnNwZWN0b3JCYWNrZW5k
RGlzcGF0Y2hlcjo6Q2FsbGJhY2tCYXNlOjppc0FjdGl2ZSgpCit7CisgICAgcmV0dXJuICFtX2Fs
cmVhZHlTZW50ICYmIG1fYmFja2VuZEltcGwtPmlzQWN0aXZlKCk7Cit9CisKK3ZvaWQgSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXI6OkNhbGxiYWNrQmFzZTo6c2VuZElmQWN0aXZlKFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJ0aWFsTWVzc2FnZSwgY29uc3QgRXJyb3JTdHJpbmcmIGlu
dm9jYXRpb25FcnJvcikKK3sKKyAgICBpZiAobV9hbHJlYWR5U2VudCkKKyAgICAgICAgcmV0dXJu
OworICAgIG1fYmFja2VuZEltcGwtPnNlbmRSZXNwb25zZShtX2lkLCBwYXJ0aWFsTWVzc2FnZSwg
aW52b2NhdGlvbkVycm9yKTsKKyAgICBtX2FscmVhZHlTZW50ID0gdHJ1ZTsKK30KKworQ09NUElM
RV9BU1NFUlQoc3RhdGljX2Nhc3Q8aW50PihJbnNwZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcjo6a01l
dGhvZE5hbWVzRW51bVNpemUpID09IFdURl9BUlJBWV9MRU5HVEgoSW5zcGVjdG9yQmFja2VuZERp
c3BhdGNoZXI6OmNvbW1hbmROYW1lcyksIGNvbW1hbmRfbmFtZV9hcnJheV9wcm9ibGVtKTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKElOU1BFQ1RPUikKKyIi
IikKKworZnJvbnRlbmRfY3BwID0gKAorIiIiCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBF
TkFCTEUoSU5TUEVDVE9SKQorCisjaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKKyNpbmNs
dWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+
CisKKyNpbmNsdWRlICJJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwuaCIKKyNpbmNsdWRlICJJbnNw
ZWN0b3JWYWx1ZXMuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitJbnNwZWN0b3JGcm9udGVuZDo6SW5zcGVjdG9yRnJvbnRlbmQoSW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCisgICAgOiAk
Y29uc3RydWN0b3JJbml0eworfQorCiskbWV0aG9kcworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZiAvLyBFTkFCTEUoSU5TUEVDVE9SKQorIiIiKQorCit0eXBlYnVpbGRlcl9oID0g
KAorIiIiCisjaWZuZGVmIEluc3BlY3RvclR5cGVCdWlsZGVyX2gKKyNkZWZpbmUgSW5zcGVjdG9y
VHlwZUJ1aWxkZXJfaAorCisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKworI2luY2x1ZGUgIkluc3Bl
Y3RvclZhbHVlcy5oIgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3Rm
L1Bhc3NSZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCituYW1lc3BhY2UgVHlwZUJ1
aWxkZXIgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgT3B0T3V0cHV0IHsKK3B1Ymxp
YzoKKyAgICBPcHRPdXRwdXQoKSA6IG1fYXNzaWduZWQoZmFsc2UpIHsgfQorCisgICAgdm9pZCBv
cGVyYXRvcj0oVCB2YWx1ZSkKKyAgICB7CisgICAgICAgIG1fdmFsdWUgPSB2YWx1ZTsKKyAgICAg
ICAgbV9hc3NpZ25lZCA9IHRydWU7CisgICAgfQorCisgICAgYm9vbCBpc0Fzc2lnbmVkKCkgeyBy
ZXR1cm4gbV9hc3NpZ25lZDsgfQorCisgICAgVCBnZXRWYWx1ZSgpCisgICAgeworICAgICAgICBB
U1NFUlQoaXNBc3NpZ25lZCgpKTsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWU7CisgICAgfQorCitw
cml2YXRlOgorICAgIFQgbV92YWx1ZTsKKyAgICBib29sIG1fYXNzaWduZWQ7CisKKyAgICBXVEZf
TUFLRV9OT05DT1BZQUJMRShPcHRPdXRwdXQpOworfTsKKworCisvLyBBIHNtYWxsIHRyYW5zaWVu
dCB3cmFwcGVyIGFyb3VuZCBpbnQgdHlwZSwgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZ1bmNpdG9u
IHBhcmFtZXRlciB0eXBlCisvLyBjbGV2ZXJseSBkaXNhbGxvd2luZyBDKysgaW1wbGljaXQgY2Fz
dHMgZnJvbSBmbG9hdCBvciBkb3VibGUuCitjbGFzcyBFeGFjdGx5SW50IHsKK3B1YmxpYzoKKyAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEV4YWN0bHlJbnQoVCB0KSA6IG1fdmFsdWUoY2Fz
dF90b19pbnQ8VD4odCkpIHt9CisKKyAgICBFeGFjdGx5SW50KCkge30KKworICAgIG9wZXJhdG9y
IGludCgpIHsgcmV0dXJuIG1fdmFsdWU7IH0KK3ByaXZhdGU6CisgICAgaW50IG1fdmFsdWU7CisK
KyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBpbnQgY2FzdF90b19pbnQoVCkg
eyByZXR1cm4gVDo6ZGVmYXVsdF9jYXNlX2Nhc3RfaXNfbm90X3N1cHBvcnRlZCgpOyB9Cit9Owor
Cit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50IEV4YWN0bHlJbnQ6OmNhc3RfdG9faW50PGludD4oaW50
IGkpIHsgcmV0dXJuIGk7IH0KKwordGVtcGxhdGU8PgoraW5saW5lIGludCBFeGFjdGx5SW50Ojpj
YXN0X3RvX2ludDx1bnNpZ25lZCBpbnQ+KHVuc2lnbmVkIGludCBpKSB7IHJldHVybiBpOyB9CisK
K2NsYXNzIFJ1bnRpbWVDYXN0SGVscGVyIHsKK3B1YmxpYzoKKyNpZiAkdmFsaWRhdG9ySWZkZWZO
YW1lCisgICAgdGVtcGxhdGU8SW5zcGVjdG9yVmFsdWU6OlR5cGUgVFlQRT4KKyAgICBzdGF0aWMg
dm9pZCBhc3NlcnRUeXBlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFT
U0VSVCh2YWx1ZS0+dHlwZSgpID09IFRZUEUpOworICAgIH0KKyAgICBzdGF0aWMgdm9pZCBhc3Nl
cnRBbnkoSW5zcGVjdG9yVmFsdWUqKTsKKyAgICBzdGF0aWMgdm9pZCBhc3NlcnRJbnQoSW5zcGVj
dG9yVmFsdWUqIHZhbHVlKTsKKyNlbmRpZgorfTsKKworCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVz
ICJUcmFpdHMiIHR5cGUgZm9yIHRoZSBpbnB1dCB0eXBlIFQuIEl0IGlzIHByb2dyYW1tZWQgdXNp
bmcgQysrIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uCisvLyB0ZWNobmlxdWUuIEJ5IGRlZmF1bHQg
aXQgc2ltcGx5IHRha2VzICJJdGVtVHJhaXRzIiB0eXBlIGZyb20gVCwgYnV0IGl0IGRvZXNuJ3Qg
d29yayB3aXRoIHRoZSBiYXNlIHR5cGVzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBB
cnJheUl0ZW1IZWxwZXIgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6SXRlbVRyYWl0cyBUcmFp
dHM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQXJyYXkgOiBwdWJsaWMgSW5z
cGVjdG9yQXJyYXlCYXNlIHsKK3ByaXZhdGU6CisgICAgQXJyYXkoKSB7IH0KKworICAgIEluc3Bl
Y3RvckFycmF5KiBvcGVuQWNjZXNzb3JzKCkgeworICAgICAgICBDT01QSUxFX0FTU0VSVChzaXpl
b2YoSW5zcGVjdG9yQXJyYXkpID09IHNpemVvZihBcnJheTxUPiksIGNhbm5vdF9jYXN0KTsKKyAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEluc3BlY3RvckFycmF5Kj4oc3RhdGljX2Nhc3Q8SW5z
cGVjdG9yQXJyYXlCYXNlKj4odGhpcykpOworICAgIH0KKworcHVibGljOgorICAgIHZvaWQgYWRk
SXRlbShQYXNzUmVmUHRyPFQ+IHZhbHVlKQorICAgIHsKKyAgICAgICAgQXJyYXlJdGVtSGVscGVy
PFQ+OjpUcmFpdHM6OnB1c2hSZWZQdHIodGhpcy0+b3BlbkFjY2Vzc29ycygpLCB2YWx1ZSk7Cisg
ICAgfQorCisgICAgdm9pZCBhZGRJdGVtKFQgdmFsdWUpCisgICAgeworICAgICAgICBBcnJheUl0
ZW1IZWxwZXI8VD46OlRyYWl0czo6cHVzaFJhdyh0aGlzLT5vcGVuQWNjZXNzb3JzKCksIHZhbHVl
KTsKKyAgICB9CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxBcnJheTxUPiA+IGNyZWF0ZSgpCisg
ICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEFycmF5PFQ+KCkpOworICAgIH0KKwor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPEFycmF5PFQ+ID4gcnVudGltZUNhc3QoUGFzc1JlZlB0cjxJ
bnNwZWN0b3JWYWx1ZT4gdmFsdWUpCisgICAgeworICAgICAgICBSZWZQdHI8SW5zcGVjdG9yQXJy
YXk+IGFycmF5OworICAgICAgICBib29sIGNhc3RSZXMgPSB2YWx1ZS0+YXNBcnJheSgmYXJyYXkp
OworICAgICAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOworI2lmICR2YWxpZGF0
b3JJZmRlZk5hbWUKKyAgICAgICAgYXNzZXJ0Q29ycmVjdFZhbHVlKGFycmF5LmdldCgpKTsKKyNl
bmRpZiAgLy8gJHZhbGlkYXRvcklmZGVmTmFtZQorICAgICAgICBDT01QSUxFX0FTU0VSVChzaXpl
b2YoQXJyYXk8VD4pID09IHNpemVvZihJbnNwZWN0b3JBcnJheSksIHR5cGVfY2FzdF9wcm9ibGVt
KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEFycmF5PFQ+Kj4oc3RhdGljX2Nhc3Q8SW5z
cGVjdG9yQXJyYXlCYXNlKj4oYXJyYXkuZ2V0KCkpKTsKKyAgICB9CisKKyNpZiAkdmFsaWRhdG9y
SWZkZWZOYW1lCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZh
bHVlKiB2YWx1ZSkKKyAgICB7CisgICAgICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gYXJyYXk7
CisgICAgICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc0FycmF5KCZhcnJheSk7CisgICAgICAg
IEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7CisgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBhcnJheS0+bGVuZ3RoKCk7IGkrKykKKyAgICAgICAgICAgIEFycmF5SXRlbUhl
bHBlcjxUPjo6VHJhaXRzOjp0ZW1wbGF0ZSBhc3NlcnRDb3JyZWN0VmFsdWU8VD4oYXJyYXktPmdl
dChpKS5nZXQoKSk7CisgICAgfQorCisjZW5kaWYgLy8gJHZhbGlkYXRvcklmZGVmTmFtZQorfTsK
Kworc3RydWN0IFN0cnVjdEl0ZW1UcmFpdHMgeworICAgIHN0YXRpYyB2b2lkIHB1c2hSZWZQdHIo
SW5zcGVjdG9yQXJyYXkqIGFycmF5LCBQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkK
KyAgICB7CisgICAgICAgIGFycmF5LT5wdXNoVmFsdWUodmFsdWUpOworICAgIH0KKworI2lmICR2
YWxpZGF0b3JJZmRlZk5hbWUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2
b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKKyAgICAgICAg
VDo6YXNzZXJ0Q29ycmVjdFZhbHVlKHZhbHVlKTsKKyAgICB9CisjZW5kaWYgIC8vICR2YWxpZGF0
b3JJZmRlZk5hbWUKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBBcnJheUl0ZW1IZWxwZXI8U3Ry
aW5nPiB7CisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSYXco
SW5zcGVjdG9yQXJyYXkqIGFycmF5LCBjb25zdCBTdHJpbmcmIHZhbHVlKQorICAgICAgICB7Cisg
ICAgICAgICAgICBhcnJheS0+cHVzaFN0cmluZyh2YWx1ZSk7CisgICAgICAgIH0KKworI2lmICR2
YWxpZGF0b3JJZmRlZk5hbWUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAg
c3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgewor
ICAgICAgICAgICAgUnVudGltZUNhc3RIZWxwZXI6OmFzc2VydFR5cGU8SW5zcGVjdG9yVmFsdWU6
OlR5cGVTdHJpbmc+KHZhbHVlKTsKKyAgICAgICAgfQorI2VuZGlmICAvLyAkdmFsaWRhdG9ySWZk
ZWZOYW1lCisgICAgfTsKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBBcnJheUl0ZW1IZWxwZXI8
aW50PiB7CisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSYXco
SW5zcGVjdG9yQXJyYXkqIGFycmF5LCBpbnQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAg
IGFycmF5LT5wdXNoSW50KHZhbHVlKTsKKyAgICAgICAgfQorCisjaWYgJHZhbGlkYXRvcklmZGVm
TmFtZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgdm9pZCBh
c3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKSB7CisgICAgICAgICAgICBS
dW50aW1lQ2FzdEhlbHBlcjo6YXNzZXJ0SW50KHZhbHVlKTsKKyAgICAgICAgfQorI2VuZGlmICAv
LyAkdmFsaWRhdG9ySWZkZWZOYW1lCisgICAgfTsKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBB
cnJheUl0ZW1IZWxwZXI8ZG91YmxlPiB7CisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIHN0
YXRpYyB2b2lkIHB1c2hSYXcoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBkb3VibGUgdmFsdWUpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIGFycmF5LT5wdXNoTnVtYmVyKHZhbHVlKTsKKyAgICAgICAg
fQorCisjaWYgJHZhbGlkYXRvcklmZGVmTmFtZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBU
PgorICAgICAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUq
IHZhbHVlKSB7CisgICAgICAgICAgICBSdW50aW1lQ2FzdEhlbHBlcjo6YXNzZXJ0VHlwZTxJbnNw
ZWN0b3JWYWx1ZTo6VHlwZU51bWJlcj4odmFsdWUpOworICAgICAgICB9CisjZW5kaWYgIC8vICR2
YWxpZGF0b3JJZmRlZk5hbWUKKyAgICB9OworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEFycmF5
SXRlbUhlbHBlcjxib29sPiB7CisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIHN0YXRpYyB2
b2lkIHB1c2hSYXcoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBib29sIHZhbHVlKQorICAgICAgICB7
CisgICAgICAgICAgICBhcnJheS0+cHVzaEJvb2xlYW4odmFsdWUpOworICAgICAgICB9CisKKyNp
ZiAkdmFsaWRhdG9ySWZkZWZOYW1lCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAg
ICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUp
IHsKKyAgICAgICAgICAgIFJ1bnRpbWVDYXN0SGVscGVyOjphc3NlcnRUeXBlPEluc3BlY3RvclZh
bHVlOjpUeXBlQm9vbGVhbj4odmFsdWUpOworICAgICAgICB9CisjZW5kaWYgIC8vICR2YWxpZGF0
b3JJZmRlZk5hbWUKKyAgICB9OworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEFycmF5SXRlbUhl
bHBlcjxJbnNwZWN0b3JWYWx1ZT4geworICAgIHN0cnVjdCBUcmFpdHMgeworICAgICAgICBzdGF0
aWMgdm9pZCBwdXNoUmVmUHRyKEluc3BlY3RvckFycmF5KiBhcnJheSwgUGFzc1JlZlB0cjxJbnNw
ZWN0b3JWYWx1ZT4gdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFycmF5LT5wdXNoVmFs
dWUodmFsdWUpOworICAgICAgICB9CisKKyNpZiAkdmFsaWRhdG9ySWZkZWZOYW1lCisgICAgICAg
IHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RW
YWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKKyAgICAgICAgICAgIFJ1bnRpbWVDYXN0SGVs
cGVyOjphc3NlcnRBbnkodmFsdWUpOworICAgICAgICB9CisjZW5kaWYgIC8vICR2YWxpZGF0b3JJ
ZmRlZk5hbWUKKyAgICB9OworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEFycmF5SXRlbUhlbHBl
cjxJbnNwZWN0b3JPYmplY3Q+IHsKKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAgICAgICAgc3RhdGlj
IHZvaWQgcHVzaFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NSZWZQdHI8SW5zcGVj
dG9yVmFsdWU+IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBhcnJheS0+cHVzaFZhbHVl
KHZhbHVlKTsKKyAgICAgICAgfQorCisjaWYgJHZhbGlkYXRvcklmZGVmTmFtZQorICAgICAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFs
dWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKSB7CisgICAgICAgICAgICBSdW50aW1lQ2FzdEhlbHBl
cjo6YXNzZXJ0VHlwZTxJbnNwZWN0b3JWYWx1ZTo6VHlwZU9iamVjdD4odmFsdWUpOworICAgICAg
ICB9CisjZW5kaWYgIC8vICR2YWxpZGF0b3JJZmRlZk5hbWUKKyAgICB9OworfTsKKwordGVtcGxh
dGU8Pgorc3RydWN0IEFycmF5SXRlbUhlbHBlcjxJbnNwZWN0b3JBcnJheT4geworICAgIHN0cnVj
dCBUcmFpdHMgeworICAgICAgICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRyKEluc3BlY3RvckFycmF5
KiBhcnJheSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCisgICAgICAgIHsKKyAg
ICAgICAgICAgIGFycmF5LT5wdXNoQXJyYXkodmFsdWUpOworICAgICAgICB9CisKKyNpZiAkdmFs
aWRhdG9ySWZkZWZOYW1lCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0
YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKKyAg
ICAgICAgICAgIFJ1bnRpbWVDYXN0SGVscGVyOjphc3NlcnRUeXBlPEluc3BlY3RvclZhbHVlOjpU
eXBlQXJyYXk+KHZhbHVlKTsKKyAgICAgICAgfQorI2VuZGlmICAvLyAkdmFsaWRhdG9ySWZkZWZO
YW1lCisgICAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQXJyYXlJdGVt
SGVscGVyPFR5cGVCdWlsZGVyOjpBcnJheTxUPiA+IHsKKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAg
ICAgICAgc3RhdGljIHZvaWQgcHVzaFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NS
ZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFQ+ID4gdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAg
ICAgIGFycmF5LT5wdXNoVmFsdWUodmFsdWUpOworICAgICAgICB9CisKKyNpZiAkdmFsaWRhdG9y
SWZkZWZOYW1lCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIHN0YXRpYyB2
b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKKyAgICAgICAg
ICAgIFM6OmFzc2VydENvcnJlY3RWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKyNlbmRpZiAgLy8g
JHZhbGlkYXRvcklmZGVmTmFtZQorICAgIH07Cit9OworCiske2ZvcndhcmRzfQorCitTdHJpbmcg
Z2V0RW51bUNvbnN0YW50VmFsdWUoaW50IGNvZGUpOworCiske3R5cGVCdWlsZGVyc30KK30gLy8g
bmFtZXNwYWNlIFR5cGVCdWlsZGVyCisKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5k
aWYgLy8gRU5BQkxFKElOU1BFQ1RPUikKKworI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvclR5
cGVCdWlsZGVyX2gpCisKKyIiIikKKwordHlwZWJ1aWxkZXJfY3BwID0gKAorIiIiCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpZiBFTkFCTEUoSU5TUEVDVE9SKQorCisjaW5jbHVkZSAiSW5zcGVj
dG9yVHlwZUJ1aWxkZXIuaCIKKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIFR5cGVCdWlsZGVyIHsKKworY29uc3QgY2hhciog
Y29uc3QgZW51bV9jb25zdGFudF92YWx1ZXNbXSA9IHsKKyRlbnVtQ29uc3RhbnRWYWx1ZXN9Owor
CitTdHJpbmcgZ2V0RW51bUNvbnN0YW50VmFsdWUoaW50IGNvZGUpIHsKKyAgICByZXR1cm4gZW51
bV9jb25zdGFudF92YWx1ZXNbY29kZV07Cit9CisKK30gLy8gbmFtZXNwYWNlIFR5cGVCdWlsZGVy
CisKKyRpbXBsQ29kZQorCisjaWYgJHZhbGlkYXRvcklmZGVmTmFtZQorCit2b2lkIFR5cGVCdWls
ZGVyOjpSdW50aW1lQ2FzdEhlbHBlcjo6YXNzZXJ0QW55KEluc3BlY3RvclZhbHVlKikKK3sKKyAg
ICAvLyBOby1vcC4KK30KKworCit2b2lkIFR5cGVCdWlsZGVyOjpSdW50aW1lQ2FzdEhlbHBlcjo6
YXNzZXJ0SW50KEluc3BlY3RvclZhbHVlKiB2YWx1ZSkKK3sKKyAgICBkb3VibGUgdjsKKyAgICBi
b29sIGNhc3RSZXMgPSB2YWx1ZS0+YXNOdW1iZXIoJnYpOworICAgIEFTU0VSVF9VTlVTRUQoY2Fz
dFJlcywgY2FzdFJlcyk7CisgICAgQVNTRVJUKHN0YXRpY19jYXN0PGRvdWJsZT4oc3RhdGljX2Nh
c3Q8aW50Pih2KSkgPT0gdik7Cit9CisKKyR2YWxpZGF0b3JDb2RlCisKKyNlbmRpZiAvLyAkdmFs
aWRhdG9ySWZkZWZOYW1lCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVO
QUJMRShJTlNQRUNUT1IpCisiIiIpCisKK2JhY2tlbmRfanMgPSAoCisiIiIKKworJGRvbWFpbklu
aXRpYWxpemVycworIiIiKQorCitwYXJhbV9jb250YWluZXJfYWNjZXNzX2NvZGUgPSAiIiIKKyAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNDb250YWluZXIgPSByZXF1ZXN0TWVzc2Fn
ZU9iamVjdC0+Z2V0T2JqZWN0KCJwYXJhbXMiKTsKKyAgICBJbnNwZWN0b3JPYmplY3QqIHBhcmFt
c0NvbnRhaW5lclB0ciA9IHBhcmFtc0NvbnRhaW5lci5nZXQoKTsKKyAgICBJbnNwZWN0b3JBcnJh
eSogcHJvdG9jb2xFcnJvcnNQdHIgPSBwcm90b2NvbEVycm9ycy5nZXQoKTsKKyIiIgorCitjbGFz
c19iaW5kaW5nX2J1aWxkZXJfcGFydF8xID0gKAorIiIiICAgICAgICBBbGxGaWVsZHNTZXQgPSAl
cworICAgIH07CisKKyAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CisgICAgY2xhc3MgQnVpbGRlciB7
CisgICAgcHJpdmF0ZToKKyAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CisKKyAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPC8qJXMqL0luc3BlY3Rvck9iamVjdD4gcHRyKQorICAgICAgICB7Cisg
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9j
cmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKKyAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwor
ICAgICAgICB9CisgICAgICAgIGZyaWVuZCBjbGFzcyAlczsKKyAgICBwdWJsaWM6CisiIiIpCisK
K2NsYXNzX2JpbmRpbmdfYnVpbGRlcl9wYXJ0XzIgPSAoIiIiCisgICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCAlcz4mIHNldCVzKCVzIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgJXMpLCBwcm9wZXJ0eV8lc19hbHJlYWR5X3NldCk7CisgICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0JXMoIiVzIiwgJXMpOworICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTwlcz4oKTsKKyAgICAgICAgfQorIiIiKQorCitjbGFzc19iaW5kaW5nX2J1aWxkZXJfcGFy
dF8zID0gKCIiIgorICAgICAgICBvcGVyYXRvciBSZWZQdHI8JXM+JiAoKQorICAgICAgICB7Cisg
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOworICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKCVzKSA9PSBz
aXplb2YoSW5zcGVjdG9yT2JqZWN0KSwgY2Fubm90X2Nhc3QpOworICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PFJlZlB0cjwlcz4qPigmbV9yZXN1bHQpOworICAgICAgICB9CisK
KyAgICAgICAgUGFzc1JlZlB0cjwlcz4gcmVsZWFzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAg
IHJldHVybiBSZWZQdHI8JXM+KCp0aGlzKS5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9Owor
CisiIiIpCisKK2NsYXNzX2JpbmRpbmdfYnVpbGRlcl9wYXJ0XzQgPSAoCisiIiIgICAgc3RhdGlj
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gQnVp
bGRlcjxOb0ZpZWxkc1NldD4oSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKSk7CisgICAgfQorIiIi
KQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>