<?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>77289</bug_id>
          
          <creation_ts>2012-01-28 14:33:48 -0800</creation_ts>
          <short_desc>Web Inspector: CodeGeneratorInspector.py: reimplement generated array types</short_desc>
          <delta_ts>2012-01-31 07:35:30 -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>
          
          <blocked>72861</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Peter Rybin">prybin</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>apavlov</cc>
    
    <cc>bweinstein</cc>
    
    <cc>caseq</cc>
    
    <cc>joepeck</cc>
    
    <cc>keishi</cc>
    
    <cc>loislo</cc>
    
    <cc>pfeldman</cc>
    
    <cc>pmuellr</cc>
    
    <cc>prybin</cc>
    
    <cc>rik</cc>
    
    <cc>timothy</cc>
    
    <cc>vsevik</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>544694</commentid>
    <comment_count>0</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-28 14:33:48 -0800</bug_when>
    <thetext>Array type should be rendered more of a helper kind, rather than the current first class citizen kind (when it gets its name from parameter name and incapsulates more important item type).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>544695</commentid>
    <comment_count>1</comment_count>
      <attachid>124452</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-28 14:48:48 -0800</bug_when>
    <thetext>Created attachment 124452
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>544696</commentid>
    <comment_count>2</comment_count>
      <attachid>124453</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-28 15:04:47 -0800</bug_when>
    <thetext>Created attachment 124453
Original InspectorFrontend.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>544697</commentid>
    <comment_count>3</comment_count>
      <attachid>124454</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-28 15:05:17 -0800</bug_when>
    <thetext>Created attachment 124454
Original InspectorFrontend.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>544698</commentid>
    <comment_count>4</comment_count>
      <attachid>124455</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-28 15:06:04 -0800</bug_when>
    <thetext>Created attachment 124455
New InspectorFrontend.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>544699</commentid>
    <comment_count>5</comment_count>
      <attachid>124456</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-28 15:06:34 -0800</bug_when>
    <thetext>Created attachment 124456
New InspectorFrontend.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545184</commentid>
    <comment_count>6</comment_count>
      <attachid>124452</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2012-01-30 10:10:04 -0800</bug_when>
    <thetext>Comment on attachment 124452
Patch

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

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1580
&gt; +template&lt;typename T&gt;
&gt; +class ArrayItemHelper {
&gt; +public:
&gt; +    typedef typename T::ItemTraits Traits;
&gt; +};

Why not use T::ItemTraits directly?

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1583
&gt; +class ArrayOf : public InspectorArray {

We don&apos;t normally use Of in container type names, e.g. it&apos;s map or vector, not mapOf or VectorOf.

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1609
&gt; +class StructItemTraits {
&gt; +public:

just struct?

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1610
&gt; +    static void pushRefPtr(InspectorArray* array, PassRefPtr&lt;InspectorObject&gt; value)

why do we need to include type into method name, i.e. why not just push()?

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1618
&gt; +    template&lt;typename T&gt;
&gt; +    static void assertCorrectValue(InspectorValue* value) {
&gt; +        T::assertCorrectValue(value);
&gt; +    }

Why do we need this wrapper?

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1625
&gt; +class ArrayItemHelper&lt;String&gt; {
&gt; +public:
&gt; +    class Traits {
&gt; +    public:

just struct?

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1626
&gt; +        static void pushRaw(InspectorArray* array, const String&amp; value)

just push()?

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1637
&gt; +class ArrayItemHelper&lt;InspectorObject&gt; {
&gt; +public:
&gt; +    class Traits {
&gt; +    public:

ditto

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:2115
&gt; +        ArrayItemHelper&lt;T&gt;::Traits::template assertCorrectValue&lt;T&gt;(array-&gt;get(i).get());

Does this compile?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545454</commentid>
    <comment_count>7</comment_count>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-30 15:11:36 -0800</bug_when>
    <thetext>&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1580
&gt; &gt; +template&lt;typename T&gt;
&gt; &gt; +class ArrayItemHelper {
&gt; &gt; +public:
&gt; &gt; +    typedef typename T::ItemTraits Traits;
&gt; &gt; +};
&gt; Why not use T::ItemTraits directly?

This template type is a point where C++ specialization takes part. This class is only a default implementation.
I added a comment.

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1583
&gt; &gt; +class ArrayOf : public InspectorArray {

&gt; We don&apos;t normally use Of in container type names, e.g. it&apos;s map or vector, not mapOf or VectorOf.

Get rid of &quot;of&quot;? It&apos;s cleaner? Thanks Sean! :)

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1609
&gt; &gt; +class StructItemTraits {
&gt; &gt; +public:
&gt; just struct?
Done

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1610
&gt; &gt; +    static void pushRefPtr(InspectorArray* array, PassRefPtr&lt;InspectorObject&gt; value)
&gt; why do we need to include type into method name, i.e. why not just push()?

There is a template/specialization machinery with &quot;T&quot;/&quot;RefPtr&lt;T&gt;&quot; method overloading here, plus the entire code is generated. I would prefer to at least dismiss internal method overloading in favor of keeping it cleaner. So I have 2 explicitly named methods. This is not user-facing.

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1618
&gt; &gt; +    template&lt;typename T&gt;
&gt; &gt; +    static void assertCorrectValue(InspectorValue* value) {
&gt; &gt; +        T::assertCorrectValue(value);
&gt; &gt; +    }

&gt; Why do we need this wrapper?
&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1625
&gt; &gt; +class ArrayItemHelper&lt;String&gt; {
&gt; &gt; +public:
&gt; &gt; +    class Traits {
&gt; &gt; +    public:
&gt; just struct?

Done

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1626
&gt; &gt; +        static void pushRaw(InspectorArray* array, const String&amp; value)
&gt; just push()?

See above.

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1637
&gt; &gt; +class ArrayItemHelper&lt;InspectorObject&gt; {
&gt; &gt; +public:
&gt; &gt; +    class Traits {
&gt; &gt; +    public:
&gt; ditto

Done

&gt; &gt; Source/WebCore/inspector/CodeGeneratorInspector.py:2115
&gt; &gt; +        ArrayItemHelper&lt;T&gt;::Traits::template assertCorrectValue&lt;T&gt;(array-&gt;get(i).get());
&gt; Does this compile?
Yes. Why?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545503</commentid>
    <comment_count>8</comment_count>
      <attachid>124614</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-30 15:41:20 -0800</bug_when>
    <thetext>Created attachment 124614
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545507</commentid>
    <comment_count>9</comment_count>
      <attachid>124615</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-30 15:43:06 -0800</bug_when>
    <thetext>Created attachment 124615
New InspectorFrontend.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545508</commentid>
    <comment_count>10</comment_count>
      <attachid>124616</attachid>
    <who name="Peter Rybin">prybin</who>
    <bug_when>2012-01-30 15:44:06 -0800</bug_when>
    <thetext>Created attachment 124616
New InspectorFrontend.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545986</commentid>
    <comment_count>11</comment_count>
      <attachid>124614</attachid>
    <who name="Andrey Kosyakov">caseq</who>
    <bug_when>2012-01-31 06:11:14 -0800</bug_when>
    <thetext>Comment on attachment 124614
Patch

LGTM</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546016</commentid>
    <comment_count>12</comment_count>
      <attachid>124614</attachid>
    <who name="Vsevolod Vlasov">vsevik</who>
    <bug_when>2012-01-31 06:59:38 -0800</bug_when>
    <thetext>Comment on attachment 124614
Patch

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

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:1712
&gt; +

Extra line.

&gt; Source/WebCore/inspector/CodeGeneratorInspector.py:2204
&gt; +    for (unsigned i = 0; i &lt; array-&gt;length(); i++) {

Please remove braces.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546044</commentid>
    <comment_count>13</comment_count>
    <who name="Vsevolod Vlasov">vsevik</who>
    <bug_when>2012-01-31 07:35:30 -0800</bug_when>
    <thetext>Committed r106360: &lt;http://trac.webkit.org/changeset/106360&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124452</attachid>
            <date>2012-01-28 14:48:48 -0800</date>
            <delta_ts>2012-01-30 15:41:07 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77289-20120129024846.patch</filename>
            <type>text/plain</type>
            <size>23808</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA1OTE1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYzUzMDJhMzQ4OWFjOWIx
Nzg2NDNjOGU3ODlhNDY3MjZkYzFiZGVhOS4uODE5MzE1NGNlZjBmYzRlMWRkNjUyNGZiYTE1MmIx
ZjFlNWQ1MGEzZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY1IEBACisyMDEyLTAxLTI4ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5OiByZWltcGxlbWVudCBnZW5lcmF0ZWQgYXJyYXkg
dHlwZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc3
Mjg5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQXJy
YXlzIGFyZSBub3cgcmVuZGVyZWQgYXMgYSBzaW5nbGUgdGVtcGxhdGUgY2xhc3MuIEl0cyB0eXBl
LXNwZWNpZmljCisgICAgICAgIGRldGFpbHMgYXJlIHByb3ZpZGVkIGJ5IGFuIGFkZGl0aW9uYWwg
QXJyYXlJdGVtSGVscGVyIGNsYXNzIHRoYXQgaXMKKyAgICAgICAgZGVmaW5lZCB1c2luZyBDKysg
c3BlY2lhbGl6YXRpb24gdGVjaG5pcXVlLgorCisgICAgICAgICogaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHk6CisgICAgICAgIChSYXdUeXBlcy5TdHJpbmcpOgorICAgICAgICAo
UmF3VHlwZXMuU3RyaW5nLmdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCk6CisgICAgICAg
IChSYXdUeXBlcy5JbnQpOgorICAgICAgICAoUmF3VHlwZXMuSW50LmdldF9hcnJheV9pdGVtX3Jh
d19jX3R5cGVfdGV4dCk6CisgICAgICAgIChSYXdUeXBlcy5OdW1iZXIpOgorICAgICAgICAoUmF3
VHlwZXMuTnVtYmVyLmdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCk6CisgICAgICAgIChS
YXdUeXBlcy5Cb29sKToKKyAgICAgICAgKFJhd1R5cGVzLkJvb2wuZ2V0X2FycmF5X2l0ZW1fcmF3
X2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFJhd1R5cGVzLk9iamVjdCk6CisgICAgICAgIChSYXdU
eXBlcy5PYmplY3QuZ2V0X2FycmF5X2l0ZW1fcmF3X2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFJh
d1R5cGVzLkFueSk6CisgICAgICAgIChSYXdUeXBlcy5BbnkuZ2V0X2FycmF5X2l0ZW1fcmF3X2Nf
dHlwZV90ZXh0KToKKyAgICAgICAgKFJhd1R5cGVzLkFycmF5KToKKyAgICAgICAgKFJhd1R5cGVz
LkFycmF5LmdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCk6CisgICAgICAgIChSYXdUeXBl
cyk6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLkVudW1C
aW5kaW5nKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNsYXJhdGlvbl8u
RW51bUJpbmRpbmcuZ2V0X2FycmF5X2l0ZW1fY190eXBlX3RleHQpOgorICAgICAgICAoVHlwZUJp
bmRpbmdzLmNyZWF0ZV90eXBlX2RlY2xhcmF0aW9uXy5QbGFpblN0cmluZyk6CisgICAgICAgIChU
eXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLlBsYWluU3RyaW5nLmdldF9hcnJh
eV9pdGVtX2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9k
ZWNsYXJhdGlvbl8uVHlwZWRlZlN0cmluZyk6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRl
X3R5cGVfZGVjbGFyYXRpb25fLlR5cGVkZWZTdHJpbmcuZ2V0X2FycmF5X2l0ZW1fY190eXBlX3Rl
eHQpOgorICAgICAgICAoU3RydWN0SXRlbVRyYWl0cyk6CisgICAgICAgIChnZXRfYXJyYXlfaXRl
bV9jX3R5cGVfdGV4dCk6CisgICAgICAgIChQbGFpbk9iamVjdEJpbmRpbmcpOgorICAgICAgICAo
UGxhaW5PYmplY3RCaW5kaW5nLmdldF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KToKKyAgICAgICAg
KEFkSG9jVHlwZUNvbnRleHQpOgorICAgICAgICAoQWRIb2NUeXBlQ29udGV4dC5nZXRfdHlwZV9u
YW1lX2ZpeCk6CisgICAgICAgIChBZEhvY1R5cGVDb250ZXh0LmFkZF90eXBlKToKKyAgICAgICAg
KEFycmF5QmluZGluZyk6CisgICAgICAgIChBcnJheUJpbmRpbmcucmVzb2x2ZV9pbm5lcik6Cisg
ICAgICAgIChBcnJheUJpbmRpbmcucmVzb2x2ZV9pbm5lci5SZXNvbHZlRGF0YSk6CisgICAgICAg
IChBcnJheUJpbmRpbmcucmVxdWVzdF91c2VyX3J1bnRpbWVfY2FzdCk6CisgICAgICAgIChBcnJh
eUJpbmRpbmcucmVxdWVzdF9pbnRlcm5hbF9ydW50aW1lX2Nhc3QpOgorICAgICAgICAoQXJyYXlC
aW5kaW5nLmdldF9jb2RlX2dlbmVyYXRvcik6CisgICAgICAgIChBcnJheUJpbmRpbmcuZ2V0X2Nv
ZGVfZ2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IpOgorICAgICAgICAoQXJyYXlCaW5kaW5nLmdldF9j
b2RlX2dlbmVyYXRvci5Db2RlR2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAg
ICAgIChBcnJheUJpbmRpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IuZ2VuZXJh
dGVfZm9yd2FyZF9kZWNsYXJhdGlvbik6CisgICAgICAgIChBcnJheUJpbmRpbmcuZ2V0X2NvZGVf
Z2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IucmVnaXN0ZXJfdXNlKToKKyAgICAgICAgKEFycmF5Qmlu
ZGluZy5nZXRfY29kZV9nZW5lcmF0b3IuQ29kZUdlbmVyYXRvci5nZXRfZ2VuZXJhdGVfcGFzc19p
ZCk6CisgICAgICAgIChBcnJheUJpbmRpbmcuZ2V0X3ZhbGlkYXRvcl9jYWxsX3RleHQpOgorICAg
ICAgICAoQXJyYXlCaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dCk6CisgICAgICAgIChBcnJheUJp
bmRpbmcuZ2V0X2FycmF5X2l0ZW1fY190eXBlX3RleHQpOgorICAgICAgICAoQXJyYXlCaW5kaW5n
LmdldF9zZXR0ZXJfdmFsdWVfZXhwcmVzc2lvbl9wYXR0ZXJuKToKKyAgICAgICAgKEFycmF5Qmlu
ZGluZy5yZWR1Y2VfdG9fcmF3X3R5cGUpOgorICAgICAgICAoUmF3VHlwZUJpbmRpbmcuZ2V0X2Fy
cmF5X2l0ZW1fY190eXBlX3RleHQpOgorICAgICAgICAoQXJyYXlJdGVtSGVscGVyKToKKyAgICAg
ICAgKHR5cGVuYW1lKToKKyAgICAgICAgKEFycmF5T2YpOgorICAgICAgICAoVHJhaXRzKToKKwog
MjAxMi0wMS0yNSAgU2hlcmlmZiBCb3QgIDx3ZWJraXQucmV2aWV3LmJvdEBnbWFpbC5jb20+CiAK
ICAgICAgICAgVW5yZXZpZXdlZCwgcm9sbGluZyBvdXQgcjEwNTgyOC4KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2luc3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5IGIvU291cmNl
L1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHkKaW5kZXggNmQ1ZWEy
YzNhNzU4NmRiOTNhY2E0OTQ0M2NmNmJkZDFmNTFiNTlkYy4uMzQ5NzA5NDEzYzdkOTk0ZTBlMjlm
NWQ1OWQ4MjI2ZjRlYWJkODJkNSAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9y
L0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHkKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9y
L0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHkKQEAgLTI5Myw2ICsyOTMsMTAgQEAgY2xhc3MgUmF3
VHlwZXMob2JqZWN0KToKICAgICAgICAgICAgICAgICBhc19tZXRob2RfbmFtZSA9ICJTdHJpbmci
CiAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGVNZXRob2RQYXJhbXMKIAorICAgICAgICBAc3Rh
dGljbWV0aG9kCisgICAgICAgIGRlZiBnZXRfYXJyYXlfaXRlbV9yYXdfY190eXBlX3RleHQoKToK
KyAgICAgICAgICAgIHJldHVybiAiU3RyaW5nIgorCiAgICAgICAgIF9wbGFpbl9jX3R5cGUgPSBD
UGFyYW1UeXBlKCJTdHJpbmciKQogICAgICAgICBfcmVmX2NfdHlwZSA9IENQYXJhbVR5cGUoImNv
bnN0IFN0cmluZyYiKQogCkBAIC0zMjEsNiArMzI1LDEwIEBAIGNsYXNzIFJhd1R5cGVzKG9iamVj
dCk6CiAgICAgICAgICAgICAgICAgYXNfbWV0aG9kX25hbWUgPSAiTnVtYmVyIgogICAgICAgICAg
ICAgcmV0dXJuIFZhbGlkYXRlTWV0aG9kUGFyYW1zCiAKKyAgICAgICAgQHN0YXRpY21ldGhvZAor
ICAgICAgICBkZWYgZ2V0X2FycmF5X2l0ZW1fcmF3X2NfdHlwZV90ZXh0KCk6CisgICAgICAgICAg
ICByZXR1cm4gImludCIKKwogICAgICAgICBkZWZhdWx0X2NfcGFyYW1fdHlwZSA9IENQYXJhbVR5
cGUoImludCIpCiAKICAgICBjbGFzcyBOdW1iZXIoQmFzZVR5cGUpOgpAQCAtMzQ0LDYgKzM1Miwx
MCBAQCBjbGFzcyBSYXdUeXBlcyhvYmplY3QpOgogICAgICAgICBkZWYgZ2V0X3ZhbGlkYXRlX21l
dGhvZF9wYXJhbXMoKToKICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVE9ETyIpCiAKKyAg
ICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgZ2V0X2FycmF5X2l0ZW1fcmF3X2NfdHlw
ZV90ZXh0KCk6CisgICAgICAgICAgICByZXR1cm4gImRvdWJsZSIKKwogICAgICAgICBkZWZhdWx0
X2NfcGFyYW1fdHlwZSA9IENQYXJhbVR5cGUoImRvdWJsZSIpCiAKICAgICBjbGFzcyBCb29sKEJh
c2VUeXBlKToKQEAgLTM3OSw2ICszOTEsMTAgQEAgY2xhc3MgUmF3VHlwZXMob2JqZWN0KToKICAg
ICAgICAgZGVmIGdldF92YWxpZGF0ZV9tZXRob2RfcGFyYW1zKCk6CiAgICAgICAgICAgICByYWlz
ZSBFeGNlcHRpb24oIlRPRE8iKQogCisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVm
IGdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCgpOgorICAgICAgICAgICAgcmV0dXJuICJi
b29sIgorCiAgICAgICAgIF9wbGFpbl9jX3R5cGUgPSBDUGFyYW1UeXBlKCJib29sIikKICAgICAg
ICAgX3JlZl9jX3R5cGUgPSBDUGFyYW1UeXBlKCJjb25zdCBib29sKiBjb25zdCIsICIqJXMiKQog
CkBAIC00MTYsNiArNDMyLDEwIEBAIGNsYXNzIFJhd1R5cGVzKG9iamVjdCk6CiAgICAgICAgIGRl
ZiBnZXRfdmFsaWRhdGVfbWV0aG9kX3BhcmFtcygpOgogICAgICAgICAgICAgcmFpc2UgRXhjZXB0
aW9uKCJUT0RPIikKIAorICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiBnZXRfYXJy
YXlfaXRlbV9yYXdfY190eXBlX3RleHQoKToKKyAgICAgICAgICAgIHJldHVybiAiSW5zcGVjdG9y
T2JqZWN0IgorCiAgICAgICAgIF9wbGFpbl9jX3R5cGUgPSBDUGFyYW1UeXBlKCJSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiIpCiAgICAgICAgIF9yZWZfY190eXBlID0gQ1BhcmFtVHlwZSgiUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IikKIApAQCAtNDU2LDYgKzQ3NiwxMCBAQCBjbGFzcyBSYXdU
eXBlcyhvYmplY3QpOgogICAgICAgICBkZWYgZ2V0X3Jhd192YWxpZGF0b3JfY2FsbF90ZXh0KCk6
CiAgICAgICAgICAgICByZXR1cm4gImFzc2VydEFueSIKIAorICAgICAgICBAc3RhdGljbWV0aG9k
CisgICAgICAgIGRlZiBnZXRfYXJyYXlfaXRlbV9yYXdfY190eXBlX3RleHQoKToKKyAgICAgICAg
ICAgIHJldHVybiAiSW5zcGVjdG9yVmFsdWUiCisKICAgICAgICAgX3BsYWluX2NfdHlwZSA9IENQ
YXJhbVR5cGUoIlJlZlB0cjxJbnNwZWN0b3JWYWx1ZT4iKQogICAgICAgICBfcmVmX2NfdHlwZSA9
IENQYXJhbVR5cGUoIlBhc3NSZWZQdHI8SW5zcGVjdG9yVmFsdWU+IikKIApAQCAtNDk1LDYgKzUx
OSwxMCBAQCBjbGFzcyBSYXdUeXBlcyhvYmplY3QpOgogICAgICAgICBkZWYgZ2V0X3ZhbGlkYXRl
X21ldGhvZF9wYXJhbXMoKToKICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVE9ETyIpCiAK
KyAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgZ2V0X2FycmF5X2l0ZW1fcmF3X2Nf
dHlwZV90ZXh0KCk6CisgICAgICAgICAgICByZXR1cm4gIkluc3BlY3RvckFycmF5IgorCiAgICAg
ICAgIF9wbGFpbl9jX3R5cGUgPSBDUGFyYW1UeXBlKCJSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IikK
ICAgICAgICAgX3JlZl9jX3R5cGUgPSBDUGFyYW1UeXBlKCJQYXNzUmVmUHRyPEluc3BlY3RvckFy
cmF5PiIpCiAKQEAgLTczOCw2ICs3NjYsMTAgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAg
ICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNscywgb3B0aW9uYWwpOgogICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5mdWxsX25hbWVfcHJlZml4X2Zvcl91
c2UgKyBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSArICI6OkVudW0iCiAKKyAgICAgICAgICAg
ICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfYXJyYXlf
aXRlbV9jX3R5cGVfdGV4dChjbHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNs
cy5nZXRfaW5fY190eXBlX3RleHQoRmFsc2UpCisKICAgICAgICAgICAgICAgICAgICAgQHN0YXRp
Y21ldGhvZAogICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X3NldHRlcl92YWx1ZV9leHByZXNz
aW9uX3BhdHRlcm4oKToKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZ2V0RW51bUNv
bnN0YW50VmFsdWUoJXMpIgpAQCAtNzgzLDYgKzgxNSwxMCBAQCBjbGFzcyBUeXBlQmluZGluZ3M6
CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNscywgb3B0
aW9uYWwpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMucmVkdWNlX3Rv
X3Jhd190eXBlKCkuZ2V0X2NfcGFyYW1fdHlwZShQYXJhbVR5cGUuRVZFTlQsIG9wdGlvbmFsKS5n
ZXRfdGV4dCgpCiAKKyAgICAgICAgICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAg
ICAgICAgICAgICAgICAgICAgZGVmIGdldF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KGNscyk6Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5yZWR1Y2VfdG9fcmF3X3R5cGUo
KS5nZXRfYXJyYXlfaXRlbV9yYXdfY190eXBlX3RleHQoKQorCiAgICAgICAgICAgICAgICAgICAg
IHJldHVybiBQbGFpblN0cmluZwogCiAgICAgICAgICAgICAgICAgZWxzZToKQEAgLTgzNyw2ICs4
NzMsMTAgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICAgICAgZGVm
IGdldF9pbl9jX3R5cGVfdGV4dChjbHMsIG9wdGlvbmFsKToKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gImNvbnN0ICVzJXMmIiAlIChoZWxwZXIuZnVsbF9uYW1lX3ByZWZpeF9m
b3JfdXNlLCBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSkKIAorICAgICAgICAgICAgICAgICAg
ICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2FycmF5
X2l0ZW1fY190eXBlX3RleHQoY2xzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gY2xzLmdldF9pbl9jX3R5cGVfdGV4dChGYWxzZSkKKwogICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gVHlwZWRlZlN0cmluZwogCiAgICAgICAgIGVsaWYganNvbl90eXBhYmxlWyJ0eXBlIl0g
PT0gIm9iamVjdCI6CkBAIC0xMDE3LDYgKzEwNTcsOCBAQCBjbGFzcyBUeXBlQmluZGluZ3M6CiAg
ICAgfQogIiIiICUgY2xhc3NfbmFtZSkKIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3cml0ZXIubmV3bGluZSgiICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRz
O1xuIikKKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvcF9kYXRhIGlu
IHJlc29sdmVfZGF0YS5vcHRpb25hbF9wcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcHJvcF9uYW1lID0gcHJvcF9kYXRhLnBbIm5hbWUiXQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fdHlwZV9iaW5kaW5nID0gcHJvcF9kYXRh
LnBhcmFtX3R5cGVfYmluZGluZwpAQCAtMTEwNSw2ICsxMTQ3LDEwIEBAIGNsYXNzIFR5cGVCaW5k
aW5nczoKICAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9pbl9jX3R5cGVfdGV4dChjbHMsIG9w
dGlvbmFsKToKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFzc1JlZlB0cjwiICsg
aGVscGVyLmZ1bGxfbmFtZV9wcmVmaXhfZm9yX3VzZSArIGZpeGVkX3R5cGVfbmFtZS5jbGFzc19u
YW1lICsgIj4iCiAKKyAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAg
ICAgICAgICAgIGRlZiBnZXRfYXJyYXlfaXRlbV9jX3R5cGVfdGV4dChjbHMpOgorICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5mdWxsX25hbWVfcHJlZml4X2Zvcl91c2UgKyBm
aXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZQorCiAgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNt
ZXRob2QKICAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9zZXR0ZXJfdmFsdWVfZXhwcmVzc2lv
bl9wYXR0ZXJuKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQpAQCAtMTE2
Miw2ICsxMjA4LDEwIEBAIGNsYXNzIFR5cGVCaW5kaW5nczoKICAgICAgICAgICAgICAgICAgICAg
ZGVmIGdldF9pbl9jX3R5cGVfdGV4dChjbHMsIG9wdGlvbmFsKToKICAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBjbHMucmVkdWNlX3RvX3Jhd190eXBlKCkuZ2V0X2NfcGFyYW1fdHlwZShQ
YXJhbVR5cGUuRVZFTlQsIG9wdGlvbmFsKS5nZXRfdGV4dCgpCiAKKyAgICAgICAgICAgICAgICAg
ICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfYXJyYXlfaXRlbV9j
X3R5cGVfdGV4dChjbHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5yZWR1
Y2VfdG9fcmF3X3R5cGUoKS5nZXRfYXJyYXlfaXRlbV9yYXdfY190eXBlX3RleHQoKQorCiAgICAg
ICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKICAgICAgICAgICAgICAgICAgICAgZGVmIGdl
dF9zZXR0ZXJfdmFsdWVfZXhwcmVzc2lvbl9wYXR0ZXJuKCk6CiAgICAgICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gTm9uZQpAQCAtMTE3MiwxNTYgKzEyMjIsMTA1IEBAIGNsYXNzIFR5cGVCaW5k
aW5nczoKIAogICAgICAgICAgICAgICAgIHJldHVybiBQbGFpbk9iamVjdEJpbmRpbmcKICAgICAg
ICAgZWxpZiBqc29uX3R5cGFibGVbInR5cGUiXSA9PSAiYXJyYXkiOgorICAgICAgICAgICAgaWYg
Iml0ZW1zIiBpbiBqc29uX3R5cGFibGU6CiAKLSAgICAgICAgICAgIGNsYXNzIEFycmF5QmluZGlu
ZzoKLSAgICAgICAgICAgICAgICByZXNvbHZlX2RhdGFfID0gTm9uZQotICAgICAgICAgICAgICAg
IG5lZWRfaW50ZXJuYWxfcnVudGltZV9jYXN0XyA9IEZhbHNlCisgICAgICAgICAgICAgICAgYWRf
aG9jX3R5cGVzID0gW10KIAotICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZAotICAgICAgICAg
ICAgICAgIGRlZiByZXNvbHZlX2lubmVyKGNscywgcmVzb2x2ZV9jb250ZXh0KToKLSAgICAgICAg
ICAgICAgICAgICAgaWYgY2xzLnJlc29sdmVfZGF0YV86Ci0gICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4KKyAgICAgICAgICAgICAgICBjbGFzcyBBZEhvY1R5cGVDb250ZXh0OgorICAgICAg
ICAgICAgICAgICAgICBjb250YWluZXJfZnVsbF9uYW1lX3ByZWZpeCA9ICI8bm90IHlldCBkZWZp
bmVkPiIKIAotICAgICAgICAgICAgICAgICAgICBhZF9ob2NfdHlwZXMgPSBbXQotICAgICAgICAg
ICAgICAgICAgICBpZiAiaXRlbXMiIGluIGpzb25fdHlwYWJsZToKKyAgICAgICAgICAgICAgICAg
ICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X3R5cGVfbmFtZV9m
aXgoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXhlZF90eXBlX25hbWUKIAot
ICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQWRIb2NUeXBlQ29udGV4dDoKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfZnVsbF9uYW1lX3ByZWZpeCA9ICI8bm90IHll
dCBkZWZpbmVkPiIKKyAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAg
ICAgICAgICAgICBkZWYgYWRkX3R5cGUoYmluZGluZyk6CisgICAgICAgICAgICAgICAgICAgICAg
ICBhZF9ob2NfdHlwZXMuYXBwZW5kKGJpbmRpbmcpCiAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGdldF90
eXBlX25hbWVfZml4KCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIE5h
bWVGaXg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lID0g
Ikl0ZW0iCisgICAgICAgICAgICAgICAgaXRlbV9iaW5kaW5nID0gcmVzb2x2ZV9wYXJhbV90eXBl
KGpzb25fdHlwYWJsZVsiaXRlbXMiXSwgY29udGV4dF9kb21haW5fbmFtZSwgQWRIb2NUeXBlQ29u
dGV4dCkKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhv
ZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIG91dHB1dF9jb21tZW50
KHdyaXRlcik6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwor
ICAgICAgICAgICAgICAgIGNsYXNzIEFycmF5QmluZGluZzoKKyAgICAgICAgICAgICAgICAgICAg
cmVzb2x2ZV9kYXRhXyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgbmVlZF9pbnRlcm5hbF9y
dW50aW1lX2Nhc3RfID0gRmFsc2UKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gTmFtZUZpeAorICAgICAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAg
ICAgICAgICAgICAgZGVmIHJlc29sdmVfaW5uZXIoY2xzLCByZXNvbHZlX2NvbnRleHQpOgorICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgY2xzLnJlc29sdmVfZGF0YV86CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc3Rh
dGljbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGFkZF90eXBlKGJpbmRp
bmcpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZF9ob2NfdHlwZXMuYXBwZW5k
KGJpbmRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBSZXNvbHZlRGF0YToKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX3R5cGVfYmluZGluZyA9IGl0ZW1fYmluZGlu
ZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkX2hvY190eXBlX2xpc3QgPSBhZF9ob2Nf
dHlwZXMKIAotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9iaW5kaW5nID0gcmVzb2x2ZV9w
YXJhbV90eXBlKGpzb25fdHlwYWJsZVsiaXRlbXMiXSwgY29udGV4dF9kb21haW5fbmFtZSwgQWRI
b2NUeXBlQ29udGV4dCkKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGl0ZW1fYmluZGluZyA9IFJhd1R5cGVCaW5kaW5nKFJhd1R5cGVzLkFueSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNscy5yZXNvbHZlX2RhdGFfID0gUmVzb2x2ZURhdGEKIAot
ICAgICAgICAgICAgICAgICAgICBjb2RlX2dlbmVyYXRvciA9IGl0ZW1fYmluZGluZy5nZXRfY29k
ZV9nZW5lcmF0b3IoKQotICAgICAgICAgICAgICAgICAgICBpZiBjb2RlX2dlbmVyYXRvcjoKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yLnJlZ2lzdGVyX3VzZShyZXNvbHZl
X2NvbnRleHQuZm9yd2FyZF9saXN0ZW5lcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0
IGluIGFkX2hvY190eXBlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnJlc29sdmVf
aW5uZXIocmVzb2x2ZV9jb250ZXh0KQogCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzIFJlc29s
dmVEYXRhOgotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV90eXBlX2JpbmRpbmcgPSBpdGVt
X2JpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkX2hvY190eXBlX2xpc3QgPSBhZF9o
b2NfdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAg
ICAgICAgIGRlZiByZXF1ZXN0X3VzZXJfcnVudGltZV9jYXN0KGNscywgcmVxdWVzdCk6CisgICAg
ICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQi
KQogCi0gICAgICAgICAgICAgICAgICAgIGNscy5yZXNvbHZlX2RhdGFfID0gUmVzb2x2ZURhdGEK
KyAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRl
ZiByZXF1ZXN0X2ludGVybmFsX3J1bnRpbWVfY2FzdChjbHMpOgorICAgICAgICAgICAgICAgICAg
ICAgICAgY2xzLm5lZWRfaW50ZXJuYWxfcnVudGltZV9jYXN0XyA9IFRydWUKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGNscy5yZXNvbHZlX2RhdGFfLml0ZW1fdHlwZV9iaW5kaW5nLnJlcXVlc3Rf
aW50ZXJuYWxfcnVudGltZV9jYXN0KCkKIAotICAgICAgICAgICAgICAgICAgICBmb3IgdCBpbiBh
ZF9ob2NfdHlwZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LnJlc29sdmVfaW5uZXIocmVz
b2x2ZV9jb250ZXh0KQorICAgICAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAg
ICAgICAgICAgICAgZGVmIGdldF9jb2RlX2dlbmVyYXRvcihhcnJheV9iaW5kaW5nX2Nscyk6CiAK
LSAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKLSAgICAgICAgICAgICAgICBkZWYgcmVxdWVz
dF91c2VyX3J1bnRpbWVfY2FzdChjbHMsIHJlcXVlc3QpOgotICAgICAgICAgICAgICAgICAgICBy
YWlzZSBFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKQorICAgICAgICAgICAgICAgICAg
ICAgICAgY2xhc3MgQ29kZUdlbmVyYXRvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBA
c3RhdGljbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGdlbmVyYXRlX3R5
cGVfYnVpbGRlcih3cml0ZXIsIGdlbmVyYXRlX2NvbnRleHQpOgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBhZF9ob2NfdHlwZV93cml0ZXIgPSB3cml0ZXIKIAotICAgICAgICAgICAg
ICAgIEBjbGFzc21ldGhvZAotICAgICAgICAgICAgICAgIGRlZiByZXF1ZXN0X2ludGVybmFsX3J1
bnRpbWVfY2FzdChjbHMpOgotICAgICAgICAgICAgICAgICAgICBjbHMubmVlZF9pbnRlcm5hbF9y
dW50aW1lX2Nhc3RfID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICBjbHMucmVzb2x2ZV9kYXRh
Xy5pdGVtX3R5cGVfYmluZGluZy5yZXF1ZXN0X2ludGVybmFsX3J1bnRpbWVfY2FzdCgpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVfZGF0YSA9IGFycmF5X2JpbmRpbmdf
Y2xzLnJlc29sdmVfZGF0YV8KIAotICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZAotICAgICAg
ICAgICAgICAgIGRlZiBnZXRfY29kZV9nZW5lcmF0b3IoYXJyYXlfYmluZGluZ19jbHMpOgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWRfaG9jX3R5cGUgaW4gcmVzb2x2ZV9k
YXRhLmFkX2hvY190eXBlX2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb2RlX2dlbmVyYXRvciA9IGFkX2hvY190eXBlLmdldF9jb2RlX2dlbmVyYXRvcigpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb2RlX2dlbmVyYXRvcjoKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2dlbmVyYXRvci5nZW5lcmF0
ZV90eXBlX2J1aWxkZXIoYWRfaG9jX3R5cGVfd3JpdGVyLCBnZW5lcmF0ZV9jb250ZXh0KQogCi0g
ICAgICAgICAgICAgICAgICAgIGNsYXNzIENvZGVHZW5lcmF0b3I6Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJh
dGVfdHlwZV9idWlsZGVyKHdyaXRlciwgZ2VuZXJhdGVfY29udGV4dCk6Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaGVscGVyLndyaXRlX2RvYyh3cml0ZXIpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2xhc3NfbmFtZSA9IGZpeGVkX3R5cGVfbmFtZS5jbGFzc19uYW1lCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdHlwZV9uYW1lLm91dHB1dF9jb21tZW50KHdy
aXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgiY2xhc3Mg
IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGNsYXNzX25hbWUp
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiIDogcHVibGljIElu
c3BlY3RvckFycmF5IHtcbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5l
d2xpbmUoInByaXZhdGU6XG4iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5u
ZXdsaW5lKCIgICAgJXMoKSB7IH1cbiIgJSBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCJcbiIpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoInB1YmxpYzpcbiIpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYWRfaG9jX3R5cGVfd3JpdGVyID0gd3JpdGVyLmluc2VydF93cml0
ZXIoIiAgICAiKQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZV9kYXRhID0g
YXJyYXlfYmluZGluZ19jbHMucmVzb2x2ZV9kYXRhXwotCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgZm9yIGFkX2hvY190eXBlIGluIHJlc29sdmVfZGF0YS5hZF9ob2NfdHlwZV9saXN0Ogot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2dlbmVyYXRvciA9IGFkX2hvY190
eXBlLmdldF9jb2RlX2dlbmVyYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGlmIGNvZGVfZ2VuZXJhdG9yOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29kZV9nZW5lcmF0b3IuZ2VuZXJhdGVfdHlwZV9idWlsZGVyKGFkX2hvY190eXBlX3dyaXRlciwg
Z2VuZXJhdGVfY29udGV4dCkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fdHlw
ZV9iaW5kaW5nID0gcmVzb2x2ZV9kYXRhLml0ZW1fdHlwZV9iaW5kaW5nCi0KLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmb3IgaXRlbV90eXBlX29wdCBpbiBNZXRob2RHZW5lcmF0ZU1vZGVz
LmdldF9tb2RlcyhpdGVtX3R5cGVfYmluZGluZyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAgdm9pZCBhZGRJdGVtIikKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiKCVzIHZhbHVlKVxuIiAlIGl0ZW1fdHlw
ZV9vcHQuZ2V0X2NfcGFyYW1fdHlwZV90ZXh0KGl0ZW1fdHlwZV9iaW5kaW5nKSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICB7XG4iKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgiICAgICAgICB0aGlzLT5w
dXNoJXMoJXMpO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoaXRl
bV90eXBlX2JpbmRpbmcucmVkdWNlX3RvX3Jhd190eXBlKCkuZ2V0X3NldHRlcl9uYW1lKCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX3R5cGVfb3B0LmdldF9z
ZXR0ZXJfdmFsdWVfZXhwcmVzc2lvbihpdGVtX3R5cGVfYmluZGluZywgInZhbHVlIikpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgiICAgIH1cbiIpCi0K
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCJcbiIpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICBzdGF0aWMgUGFzc1JlZlB0
cjwlcz4gY3JlYXRlKCkge1xuIiAlIGZpeGVkX3R5cGVfbmFtZS5jbGFzc19uYW1lKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAgICAgIHJldHVybiBhZG9w
dFJlZihuZXcgJXMoKSk7XG4iICUgZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICB9XG4iKQotCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgYXJyYXlfYmluZGluZ19jbHMubmVlZF9pbnRlcm5hbF9y
dW50aW1lX2Nhc3RfOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBw
ZW5kKCIjaWYgJXNcbiIgJSBWQUxJREFUT1JfSUZERUZfTkFNRSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICBzdGF0aWMgdm9pZCBhc3NlcnRDb3Jy
ZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKTtcbiIpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIiNlbmRpZiAgLy8gJXNcbiIgJSBWQUxJREFUT1Jf
SUZERUZfTkFNRSkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3Jf
d3JpdGVyID0gZ2VuZXJhdGVfY29udGV4dC52YWxpZGF0b3Jfd3JpdGVyCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcl93cml0ZXIubmV3bGluZSgidm9pZCAlcyVzOjph
c3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKVxuIiAlIChoZWxwZXIuZnVs
bF9uYW1lX3ByZWZpeF9mb3JfaW1wbCwgY2xhc3NfbmFtZSkpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHZhbGlkYXRvcl93cml0ZXIubmV3bGluZSgie1xuIikKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yX3dyaXRlci5uZXdsaW5lKCIgICAgUmVmUHRy
PEluc3BlY3RvckFycmF5PiBhcnJheTtcbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHZhbGlkYXRvcl93cml0ZXIubmV3bGluZSgiICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5h
c0FycmF5KCZhcnJheSk7XG4iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxp
ZGF0b3Jfd3JpdGVyLm5ld2xpbmUoIiAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMp
O1xuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yX3dyaXRlci5u
ZXdsaW5lKCIgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGFycmF5LT5sZW5ndGgoKTsgKytp
KSB7XG4iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3Jfd3JpdGVy
Lm5ld2xpbmUoIiAgICAgICAgJXMoYXJyYXktPmdldChpKS5nZXQoKSk7XG4iICUgcmVzb2x2ZV9k
YXRhLml0ZW1fdHlwZV9iaW5kaW5nLmdldF92YWxpZGF0b3JfY2FsbF90ZXh0KCkpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcl93cml0ZXIubmV3bGluZSgiICAgIH1c
biIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcl93cml0ZXIubmV3
bGluZSgifVxuXG5cbiIpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3
bGluZSgifTtcblxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9k
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFy
YXRpb24od3JpdGVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogCi0g
ICAgICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAgICAgICAgICAg
ICAgICBkZWYgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih3cml0ZXIpOgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWUgPSBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFt
ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCJjbGFzcyAiKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoY2xhc3NfbmFtZSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI7XG4iKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkZWYgcmVnaXN0ZXJfdXNlKGZvcndhcmRfbGlzdGVuZXIpOgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpdGVtX2NvZGVfZ2VuZXJhdG9yID0gaXRlbV9iaW5kaW5nLmdldF9j
b2RlX2dlbmVyYXRvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0ZW1f
Y29kZV9nZW5lcmF0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVt
X2NvZGVfZ2VuZXJhdG9yLnJlZ2lzdGVyX3VzZShmb3J3YXJkX2xpc3RlbmVyKQogCi0gICAgICAg
ICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICBk
ZWYgcmVnaXN0ZXJfdXNlKGZvcndhcmRfbGlzdGVuZXIpOgotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGhlbHBlci5hZGRfdG9fZm9yd2FyZF9saXN0ZW5lcihmb3J3YXJkX2xpc3RlbmVyKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkZWYgZ2V0X2dlbmVyYXRlX3Bhc3NfaWQoKToKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVCdWlsZGVyUGFzcy5NQUlOCiAKLSAgICAgICAg
ICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgIGRl
ZiBnZXRfZ2VuZXJhdGVfcGFzc19pZCgpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBUeXBlQnVpbGRlclBhc3MuTUFJTgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IENvZGVHZW5lcmF0b3IKIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZUdlbmVyYXRv
cgorICAgICAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgICAgICAgICAg
ZGVmIGdldF92YWxpZGF0b3JfY2FsbF90ZXh0KGNscyk6CisgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gY2xzLmdldF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KCkgKyAiOjphc3NlcnRDb3Jy
ZWN0VmFsdWUiCiAKLSAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAgICAg
ICAgZGVmIGdldF92YWxpZGF0b3JfY2FsbF90ZXh0KCk6Ci0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiBoZWxwZXIuZnVsbF9uYW1lX3ByZWZpeF9mb3JfdXNlICsgZml4ZWRfdHlwZV9uYW1lLmNs
YXNzX25hbWUgKyAiOjphc3NlcnRDb3JyZWN0VmFsdWUiCisgICAgICAgICAgICAgICAgICAgIEBj
bGFzc21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNs
cywgb3B0aW9uYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXNzUmVmUHRy
PFR5cGVCdWlsZGVyOjpBcnJheU9mPCVzID4gPiIgJSBjbHMucmVzb2x2ZV9kYXRhXy5pdGVtX3R5
cGVfYmluZGluZy5nZXRfYXJyYXlfaXRlbV9jX3R5cGVfdGV4dCgpCiAKLSAgICAgICAgICAgICAg
ICBAY2xhc3NtZXRob2QKLSAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNs
cywgb3B0aW9uYWwpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhc3NSZWZQdHI8JXMl
cz4iICUgKGhlbHBlci5mdWxsX25hbWVfcHJlZml4X2Zvcl91c2UsIGZpeGVkX3R5cGVfbmFtZS5j
bGFzc19uYW1lKQorICAgICAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAg
ICAgICAgICAgZGVmIGdldF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KGNscyk6CisgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gIlR5cGVCdWlsZGVyOjpBcnJheU9mPCVzID4iICUgY2xzLnJl
c29sdmVfZGF0YV8uaXRlbV90eXBlX2JpbmRpbmcuZ2V0X2FycmF5X2l0ZW1fY190eXBlX3RleHQo
KQogCi0gICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAotICAgICAgICAgICAgICAgIGRlZiBn
ZXRfc2V0dGVyX3ZhbHVlX2V4cHJlc3Npb25fcGF0dGVybigpOgotICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAg
ICAgICAgICAgICAgIGRlZiBnZXRfc2V0dGVyX3ZhbHVlX2V4cHJlc3Npb25fcGF0dGVybigpOgor
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAotICAgICAgICAgICAgICAgIEBz
dGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6Ci0g
ICAgICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlcy5BcnJheQorICAgICAgICAgICAgICAg
ICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiByZWR1Y2VfdG9fcmF3
X3R5cGUoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYXdUeXBlcy5BcnJheQog
Ci0gICAgICAgICAgICByZXR1cm4gQXJyYXlCaW5kaW5nCisgICAgICAgICAgICAgICAgcmV0dXJu
IEFycmF5QmluZGluZworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEZhbGwt
dGhyb3VnaCB0byByYXcgdHlwZS4KKyAgICAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgcmF3
X3R5cGUgPSBSYXdUeXBlcy5nZXQoanNvbl90eXBhYmxlWyJ0eXBlIl0pCiAKQEAgLTEzNTAsNiAr
MTM0OSw5IEBAIGNsYXNzIFJhd1R5cGVCaW5kaW5nOgogICAgIGRlZiBnZXRfaW5fY190eXBlX3Rl
eHQoc2VsZiwgb3B0aW9uYWwpOgogICAgICAgICByZXR1cm4gc2VsZi5yYXdfdHlwZV8uZ2V0X2Nf
cGFyYW1fdHlwZShQYXJhbVR5cGUuRVZFTlQsIG9wdGlvbmFsKS5nZXRfdGV4dCgpCiAKKyAgICBk
ZWYgZ2V0X2FycmF5X2l0ZW1fY190eXBlX3RleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
LnJhd190eXBlXy5nZXRfYXJyYXlfaXRlbV9yYXdfY190eXBlX3RleHQoKQorCiAgICAgZGVmIGdl
dF9zZXR0ZXJfdmFsdWVfZXhwcmVzc2lvbl9wYXR0ZXJuKHNlbGYpOgogICAgICAgICByZXR1cm4g
Tm9uZQogCkBAIC0xNTcwLDYgKzE1NzIsNzcgQEAgdHlwZWRlZiBTdHJpbmcgRXJyb3JTdHJpbmc7
CiAjaWYgRU5BQkxFKElOU1BFQ1RPUikKIAogbmFtZXNwYWNlIFR5cGVCdWlsZGVyIHsKKwordGVt
cGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEFycmF5SXRlbUhlbHBlciB7CitwdWJsaWM6CisgICAg
dHlwZWRlZiB0eXBlbmFtZSBUOjpJdGVtVHJhaXRzIFRyYWl0czsKK307CisKK3RlbXBsYXRlPHR5
cGVuYW1lIFQ+CitjbGFzcyBBcnJheU9mIDogcHVibGljIEluc3BlY3RvckFycmF5IHsKK3ByaXZh
dGU6CisgICAgQXJyYXlPZigpIHsgfQorCitwdWJsaWM6CisgICAgdm9pZCBhZGRJdGVtKFBhc3NS
ZWZQdHI8VD4gdmFsdWUpCisgICAgeworICAgICAgICBBcnJheUl0ZW1IZWxwZXI8VD46OlRyYWl0
czo6cHVzaFJlZlB0cih0aGlzLCB2YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCBhZGRJdGVtKFQg
dmFsdWUpCisgICAgeworICAgICAgICBBcnJheUl0ZW1IZWxwZXI8VD46OlRyYWl0czo6cHVzaFJh
dyh0aGlzLCB2YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIFBhc3NSZWZQdHI8QXJyYXlPZjxU
PiA+IGNyZWF0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IEFycmF5T2Y8
VD4oKSk7CisgICAgfQorCisjaWYgIiIiICsgVkFMSURBVE9SX0lGREVGX05BTUUgKyAiIiIKKyAg
ICBzdGF0aWMgdm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKTsK
KyNlbmRpZiAvLyAiIiIgKyBWQUxJREFUT1JfSUZERUZfTkFNRSArICIiIgorfTsKKworY2xhc3Mg
U3RydWN0SXRlbVRyYWl0cyB7CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgcHVzaFJlZlB0cihJ
bnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkK
KyAgICB7CisgICAgICAgIGFycmF5LT5wdXNoT2JqZWN0KHZhbHVlKTsKKyAgICB9CisKKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJ
bnNwZWN0b3JWYWx1ZSogdmFsdWUpIHsKKyAgICAgICAgVDo6YXNzZXJ0Q29ycmVjdFZhbHVlKHZh
bHVlKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitjbGFzcyBBcnJheUl0ZW1IZWxwZXI8U3Ry
aW5nPiB7CitwdWJsaWM6CisgICAgY2xhc3MgVHJhaXRzIHsKKyAgICBwdWJsaWM6CisgICAgICAg
IHN0YXRpYyB2b2lkIHB1c2hSYXcoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBjb25zdCBTdHJpbmcm
IHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBhcnJheS0+cHVzaFN0cmluZyh2YWx1ZSk7
CisgICAgICAgIH0KKyAgICB9OworfTsKKwordGVtcGxhdGU8PgorY2xhc3MgQXJyYXlJdGVtSGVs
cGVyPEluc3BlY3Rvck9iamVjdD4geworcHVibGljOgorICAgIGNsYXNzIFRyYWl0cyB7CisgICAg
cHVibGljOgorICAgICAgICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRyKEluc3BlY3RvckFycmF5KiBh
cnJheSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQorICAgICAgICB7CisgICAg
ICAgICAgICBhcnJheS0+cHVzaE9iamVjdCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9OworfTsK
KworCiAke2ZvcndhcmRzfQogCiBTdHJpbmcgZ2V0RW51bUNvbnN0YW50VmFsdWUoaW50IGNvZGUp
OwpAQCAtMjAzMSw3ICsyMTA0LDIwIEBAIFN0cmluZyBnZXRFbnVtQ29uc3RhbnRWYWx1ZShpbnQg
Y29kZSkgewogfSAvLyBuYW1lc3BhY2UgVHlwZUJ1aWxkZXIKIAogI2lmICIiIiArIFZBTElEQVRP
Ul9JRkRFRl9OQU1FICsgIiIiCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIFR5cGVCdWls
ZGVyOjpBcnJheU9mPFQ+Ojphc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVl
KQoreworICAgIFJlZlB0cjxJbnNwZWN0b3JBcnJheT4gYXJyYXk7CisgICAgYm9vbCBjYXN0UmVz
ID0gdmFsdWUtPmFzQXJyYXkoJmFycmF5KTsKKyAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNh
c3RSZXMpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBhcnJheS0+bGVuZ3RoKCk7IGkr
KykgeworICAgICAgICBBcnJheUl0ZW1IZWxwZXI8VD46OlRyYWl0czo6dGVtcGxhdGUgYXNzZXJ0
Q29ycmVjdFZhbHVlPFQ+KGFycmF5LT5nZXQoaSkuZ2V0KCkpOworICAgIH0KK30KKwogJHZhbGlk
YXRvckNvZGUKKwogI2VuZGlmIC8vICIiIiArIFZBTElEQVRPUl9JRkRFRl9OQU1FICsgIiIiCiAK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKQEAgLTIwNDEsOCArMjEyNyw4IEBAICR2YWxpZGF0b3JD
b2RlCiAKICAgICB0eXBlYnVpbGRlcl9oID0gc3RyaW5nLlRlbXBsYXRlKGZpbGVfaGVhZGVyXyAr
CiAiIiIKLSNpZm5kZWYgSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJfaAotI2RlZmluZSBJbnNw
ZWN0b3JCYWNrZW5kRGlzcGF0Y2hlcl9oCisjaWZuZGVmIEluc3BlY3RvclR5cGVCdWlsZGVyX2gK
KyNkZWZpbmUgSW5zcGVjdG9yVHlwZUJ1aWxkZXJfaAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
QEAgLTIwNTIsNyArMjEzOCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGV4dGVybiBib29sIHR5
cGVCdWlsZGVyVGVzdFZhcmlhYmxlOwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0jZW5kaWYg
Ly8gIWRlZmluZWQoSW5zcGVjdG9yQmFja2VuZERpc3BhdGNoZXJfaCkKKyNlbmRpZiAvLyAhZGVm
aW5lZChJbnNwZWN0b3JUeXBlQnVpbGRlcl9oKQogCiAiIiIpCiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>124453</attachid>
            <date>2012-01-28 15:04:47 -0800</date>
            <delta_ts>2012-01-28 15:04:47 -0800</delta_ts>
            <desc>Original InspectorFrontend.h</desc>
            <filename>InspectorFrontend.base.h</filename>
            <type>text/plain</type>
            <size>171656</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgojaWZuZGVmIEluc3BlY3RvckZyb250ZW5kX2gKI2RlZmluZSBJbnNw
ZWN0b3JGcm9udGVuZF9oCgojaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1aWxkZXIuaCIKI2luY2x1
ZGUgIkluc3BlY3RvclZhbHVlcy5oIgojaW5jbHVkZSA8UGxhdGZvcm1TdHJpbmcuaD4KI2luY2x1
ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CgpuYW1lc3BhY2UgV2ViQ29yZSB7CgpjbGFzcyBJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWw7CgovLyBCb3RoIEluc3BlY3Rvck9iamVjdCBhbmQgSW5zcGVjdG9y
QXJyYXkgbWF5IG9yIG1heSBub3QgYmUgZGVjbGFyZWQgYXQgdGhpcyBwb2ludCBhcyBkZWZpbmVk
IGJ5IEVOQUJMRURfSU5TUEVDVE9SLgovLyBEb3VibGUtY2hlY2sgd2UgaGF2ZSB0aGVtIGF0IGxl
YXN0IGFzIGZvcndhcmQgZGVjbGFyYXRpb24uCmNsYXNzIEluc3BlY3RvckFycmF5OwpjbGFzcyBJ
bnNwZWN0b3JPYmplY3Q7Cgp0eXBlZGVmIFN0cmluZyBFcnJvclN0cmluZzsKCiNpZiBFTkFCTEUo
SU5TUEVDVE9SKQoKbmFtZXNwYWNlIFR5cGVCdWlsZGVyIHsKLy8gRm9yd2FyZCBkZWNsYXJhdGlv
bnMuCm5hbWVzcGFjZSBDb25zb2xlIHsKY2xhc3MgU3RhY2tUcmFjZTsKfSAvLyBDb25zb2xlCgoj
aWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCm5hbWVzcGFjZSBJbmRleGVkREIgewpjbGFzcyBP
YmplY3RTdG9yZTsKY2xhc3MgT2JqZWN0U3RvcmVJbmRleDsKfSAvLyBJbmRleGVkREIKCiNlbmRp
ZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKbmFtZXNwYWNlIENTUyB7CmNsYXNzIENTU1J1
bGU7CmNsYXNzIFNvdXJjZVJhbmdlOwpjbGFzcyBDU1NTdHlsZTsKY2xhc3MgQ1NTUHJvcGVydHk7
CmNsYXNzIENTU01lZGlhOwp9IC8vIENTUwoKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VS
KQpuYW1lc3BhY2UgRGVidWdnZXIgewpjbGFzcyBMb2NhdGlvbjsKY2xhc3MgU2NvcGU7Cn0gLy8g
RGVidWdnZXIKCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKLy8gRW5kIG9m
IGZvcndhcmQgZGVjbGFyYXRpb25zLgoKLy8gVHlwZWRlZnMuCm5hbWVzcGFjZSBQYWdlIHsKLyog
VW5pcXVlIHNjcmlwdCBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBTY3JpcHRJZGVudGlm
aWVyOwoKfSAvLyBQYWdlCgpuYW1lc3BhY2UgUnVudGltZSB7Ci8qIFVuaXF1ZSBvYmplY3QgaWRl
bnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgUmVtb3RlT2JqZWN0SWQ7Cgp9IC8vIFJ1bnRpbWUK
Cm5hbWVzcGFjZSBOZXR3b3JrIHsKLyogVW5pcXVlIGxvYWRlciBpZGVudGlmaWVyLiAqLwp0eXBl
ZGVmIFN0cmluZyBMb2FkZXJJZDsKCi8qIFVuaXF1ZSBmcmFtZSBpZGVudGlmaWVyLiAqLwp0eXBl
ZGVmIFN0cmluZyBGcmFtZUlkOwoKLyogVW5pcXVlIHJlcXVlc3QgaWRlbnRpZmllci4gKi8KdHlw
ZWRlZiBTdHJpbmcgUmVxdWVzdElkOwoKfSAvLyBOZXR3b3JrCgojaWYgRU5BQkxFKEpBVkFTQ1JJ
UFRfREVCVUdHRVIpCm5hbWVzcGFjZSBEZWJ1Z2dlciB7Ci8qIEJyZWFrcG9pbnQgaWRlbnRpZmll
ci4gKi8KdHlwZWRlZiBTdHJpbmcgQnJlYWtwb2ludElkOwoKLyogVW5pcXVlIHNjcmlwdCBpZGVu
dGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBTY3JpcHRJZDsKCi8qIENhbGwgZnJhbWUgaWRlbnRp
Zmllci4gKi8KdHlwZWRlZiBTdHJpbmcgQ2FsbEZyYW1lSWQ7Cgp9IC8vIERlYnVnZ2VyCgojZW5k
aWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCi8vIEVuZCBvZiB0eXBlZGVmcy4KCgoK
U3RyaW5nIGdldEVudW1Db25zdGFudFZhbHVlKGludCBjb2RlKTsKCm5hbWVzcGFjZSBNZW1vcnkg
ewovKiBOdW1iZXIgb2Ygbm9kZXMgd2l0aCBnaXZlbiBuYW1lLiAqLwpjbGFzcyBOb2RlQ291bnQg
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9G
aWVsZHNTZXQgPSAwLAogICAgICAgIE5vZGVOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIENvdW50
U2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChOb2RlTmFtZVNldCB8IENvdW50
U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsK
ICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7Cgog
ICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0
ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRl
cjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NS
ZWZQdHI8Tm9kZUNvdW50PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBOb2RlQ291bnQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOb2Rl
TmFtZVNldD4mIHNldE5vZGVOYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZU5hbWVTZXQpLCBwcm9wZXJ0eV9u
b2RlTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5v
ZGVOYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5vZGVOYW1lU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENvdW50U2V0PiYgc2V0Q291
bnQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIENvdW50U2V0KSwgcHJvcGVydHlfY291bnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJjb3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxDb3VudFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxO
b2RlQ291bnQ+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxOb2RlQ291bnQ+Kj4oJm1fcmVzdWx0KTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Tm9kZUNvdW50PiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxOb2RlQ291bnQ+KCp0aGlzKTsKICAgICAgICB9CiAg
ICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8
Tm9kZUNvdW50PiByZXN1bHQgPSBOb2RlQ291bnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldE5v
ZGVOYW1lKC4uLikKICAgICAqICAgICAuc2V0Q291bnQoLi4uKTsKICAgICAqLwogICAgc3RhdGlj
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBOb2RlQ291bnQoKSkpOwogICAgfQp9OwoKLyog
TnVtYmVyIG9mIEpTIGV2ZW50IGxpc3RlbmVycyBieSBldmVudCB0eXBlLiAqLwpjbGFzcyBMaXN0
ZW5lckNvdW50IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewog
ICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAwLAogICAgICAg
IENvdW50U2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0IHwgQ291
bnRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIg
ewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
CiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0
YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWls
ZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFz
c1JlZlB0cjxMaXN0ZW5lckNvdW50PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBMaXN0ZW5lckNvdW50OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlw
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDb3VudFNldD4mIHNldENvdW50KGludCB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDb3VudFNldCks
IHByb3BlcnR5X2NvdW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51
bWJlcigiY291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q291bnRT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8TGlzdGVuZXJDb3VudD4m
ICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVs
ZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPExpc3RlbmVyQ291bnQ+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8TGlzdGVuZXJDb3VudD4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8TGlzdGVuZXJDb3VudD4oKnRoaXMpOwogICAgICAgIH0K
ICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0
cjxMaXN0ZW5lckNvdW50PiByZXN1bHQgPSBMaXN0ZW5lckNvdW50OjpjcmVhdGUoKQogICAgICog
ICAgIC5zZXRUeXBlKC4uLikKICAgICAqICAgICAuc2V0Q291bnQoLi4uKTsKICAgICAqLwogICAg
c3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJu
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBMaXN0ZW5lckNvdW50KCkpKTsKICAg
IH0KfTsKCi8qIENoYXJhY3RlciBkYXRhIHN0YXRpc3RpY3MgZm9yIHRoZSBwYWdlLiAqLwpjbGFz
cyBTdHJpbmdTdGF0aXN0aWNzIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBEb21TZXQgPSAxIDw8IDAs
CiAgICAgICAgSnNTZXQgPSAxIDw8IDEsCiAgICAgICAgU2hhcmVkU2V0ID0gMSA8PCAyLAogICAg
ICAgIEFsbEZpZWxkc1NldCA9IChEb21TZXQgfCBKc1NldCB8IFNoYXJlZFNldCkKICAgIH07Cgog
ICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0
ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
Pio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFN0cmluZ1N0
YXRpc3RpY3M+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFN0
cmluZ1N0YXRpc3RpY3M7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEb21T
ZXQ+JiBzZXREb20oaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIERvbVNldCksIHByb3BlcnR5X2RvbV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImRvbSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxEb21TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
SnNTZXQ+JiBzZXRKcyhpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgSnNTZXQpLCBwcm9wZXJ0eV9qc19hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImpzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPEpzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNo
YXJlZFNldD4mIHNldFNoYXJlZChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgU2hhcmVkU2V0KSwgcHJvcGVydHlfc2hhcmVkX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2hhcmVkIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNoYXJlZFNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxTdHJpbmdTdGF0aXN0aWNzPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U3Ry
aW5nU3RhdGlzdGljcz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxTdHJpbmdTdGF0aXN0aWNzPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuIFJlZlB0cjxTdHJpbmdTdGF0aXN0aWNzPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAg
ICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFN0cmluZ1N0
YXRpc3RpY3M+IHJlc3VsdCA9IFN0cmluZ1N0YXRpc3RpY3M6OmNyZWF0ZSgpCiAgICAgKiAgICAg
LnNldERvbSguLi4pCiAgICAgKiAgICAgLnNldEpzKC4uLikKICAgICAqICAgICAuc2V0U2hhcmVk
KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQog
ICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgU3Ry
aW5nU3RhdGlzdGljcygpKSk7CiAgICB9Cn07CgpjbGFzcyBET01Hcm91cCA6IHB1YmxpYyBJbnNw
ZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdu
b2RlQ291bnQnIHdoaWxlIGdlbmVyYXRpbmcgRE9NR3JvdXAuCiAgICBjbGFzcyBOb2RlQ291bnQg
OiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgcHJpdmF0ZToKICAgICAgICBOb2RlQ291bnQo
KSB7IH0KCiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBhZGRJdGVtKC8qUGFzc1JlZlB0cjxUeXBl
QnVpbGRlcjo6TWVtb3J5OjpOb2RlQ291bnQ+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy0+cHVzaE9iamVjdCh2YWx1ZSk7CiAg
ICAgICAgfQoKICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxOb2RlQ291bnQ+IGNyZWF0ZSgpIHsK
ICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBOb2RlQ291bnQoKSk7CiAgICAgICAgfQog
ICAgfTsKCiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdsaXN0ZW5lckNvdW50JyB3
aGlsZSBnZW5lcmF0aW5nIERPTUdyb3VwLgogICAgY2xhc3MgTGlzdGVuZXJDb3VudCA6IHB1Ymxp
YyBJbnNwZWN0b3JBcnJheSB7CiAgICBwcml2YXRlOgogICAgICAgIExpc3RlbmVyQ291bnQoKSB7
IH0KCiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBhZGRJdGVtKC8qUGFzc1JlZlB0cjxUeXBlQnVp
bGRlcjo6TWVtb3J5OjpMaXN0ZW5lckNvdW50PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMtPnB1c2hPYmplY3QodmFsdWUpOwog
ICAgICAgIH0KCiAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8TGlzdGVuZXJDb3VudD4gY3JlYXRl
KCkgewogICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IExpc3RlbmVyQ291bnQoKSk7CiAg
ICAgICAgfQogICAgfTsKCiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAg
ICAgU2l6ZVNldCA9IDEgPDwgMCwKICAgICAgICBUaXRsZVNldCA9IDEgPDwgMSwKICAgICAgICBO
b2RlQ291bnRTZXQgPSAxIDw8IDIsCiAgICAgICAgTGlzdGVuZXJDb3VudFNldCA9IDEgPDwgMywK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU2l6ZVNldCB8IFRpdGxlU2V0IHwgTm9kZUNvdW50U2V0
IHwgTGlzdGVuZXJDb3VudFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAg
Y2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8
IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcihQYXNzUmVmUHRyPERPTUdyb3VwPiBwdHIpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2lu
X25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQog
ICAgICAgIGZyaWVuZCBjbGFzcyBET01Hcm91cDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFNpemVTZXQ+JiBzZXRTaXplKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTaXplU2V0KSwgcHJvcGVydHlfc2l6ZV9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNpemUiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2l6ZVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBUaXRsZVNldD4mIHNldFRpdGxlKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVGl0bGVT
ZXQpLCBwcm9wZXJ0eV90aXRsZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRTdHJpbmcoInRpdGxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRp
dGxlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5vZGVDb3VudFNl
dD4mIHNldE5vZGVDb3VudCgvKlBhc3NSZWZQdHI8Tm9kZUNvdW50PiovIFBhc3NSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIE5vZGVDb3VudFNldCksIHByb3BlcnR5X25vZGVDb3VudF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgibm9kZUNvdW50IiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5vZGVDb3VudFNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBMaXN0ZW5lckNvdW50U2V0PiYgc2V0TGlzdGVuZXJDb3VudCgv
KlBhc3NSZWZQdHI8TGlzdGVuZXJDb3VudD4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMaXN0
ZW5lckNvdW50U2V0KSwgcHJvcGVydHlfbGlzdGVuZXJDb3VudF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgibGlzdGVuZXJDb3VudCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMaXN0ZW5lckNvdW50U2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPERPTUdyb3VwPiYgKCkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFk
eSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RE9NR3JvdXA+
Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RE9N
R3JvdXA+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPERPTUdyb3VwPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPERPTUdyb3VwPiByZXN1bHQgPSBET01Hcm91cDo6Y3JlYXRlKCkK
ICAgICAqICAgICAuc2V0U2l6ZSguLi4pCiAgICAgKiAgICAgLnNldFRpdGxlKC4uLikKICAgICAq
ICAgICAuc2V0Tm9kZUNvdW50KC4uLikKICAgICAqICAgICAuc2V0TGlzdGVuZXJDb3VudCguLi4p
OwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IERPTUdyb3Vw
KCkpKTsKICAgIH0KCiAgICB2b2lkIHNldERvY3VtZW50VVJJKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkb2N1bWVudFVSSSIsIHZhbHVlKTsKICAg
IH0KfTsKCn0gLy8gTWVtb3J5CgpuYW1lc3BhY2UgUGFnZSB7Ci8qIFJlc291cmNlIHR5cGUgYXMg
aXQgd2FzIHBlcmNlaXZlZCBieSB0aGUgcmVuZGVyaW5nIGVuZ2luZS4gKi8Kc3RydWN0IFJlc291
cmNlVHlwZSB7CiAgICBlbnVtIEVudW0gewogICAgICAgIERvY3VtZW50ID0gMCwKICAgICAgICBT
dHlsZXNoZWV0ID0gMSwKICAgICAgICBJbWFnZSA9IDIsCiAgICAgICAgRm9udCA9IDMsCiAgICAg
ICAgU2NyaXB0ID0gNCwKICAgICAgICBYSFIgPSA1LAogICAgICAgIFdlYlNvY2tldCA9IDYsCiAg
ICAgICAgT3RoZXIgPSA3LAogICAgfTsKfTsgLy8gc3RydWN0IFJlc291cmNlVHlwZQoKLyogSW5m
b3JtYXRpb24gYWJvdXQgdGhlIEZyYW1lIG9uIHRoZSBwYWdlLiAqLwpjbGFzcyBGcmFtZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxk
c1NldCA9IDAsCiAgICAgICAgSWRTZXQgPSAxIDw8IDAsCiAgICAgICAgTG9hZGVySWRTZXQgPSAx
IDw8IDEsCiAgICAgICAgVXJsU2V0ID0gMSA8PCAyLAogICAgICAgIE1pbWVUeXBlU2V0ID0gMSA8
PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChJZFNldCB8IExvYWRlcklkU2V0IHwgVXJsU2V0
IHwgTWltZVR5cGVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNz
IEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBt
X3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
PiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXIoUGFzc1JlZlB0cjxGcmFtZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgRnJhbWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJ
ZFNldD4mIHNldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgSWRTZXQpLCBwcm9wZXJ0eV9pZF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImlkIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPElkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IExvYWRlcklkU2V0PiYgc2V0TG9hZGVySWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0
d29yazo6TG9hZGVySWQmKi8gY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMb2FkZXJJZFNldCksIHByb3BlcnR5X2xvYWRl
cklkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibG9hZGVy
SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TG9hZGVySWRTZXQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNaW1lVHlw
ZVNldD4mIHNldE1pbWVUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTWltZVR5cGVTZXQpLCBwcm9wZXJ0eV9taW1l
VHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1pbWVU
eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1pbWVUeXBlU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEZyYW1lPiYgKCkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8RnJhbWU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8RnJhbWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEZyYW1l
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPEZyYW1lPiByZXN1bHQgPSBGcmFtZTo6Y3JlYXRlKCkKICAg
ICAqICAgICAuc2V0SWQoLi4uKQogICAgICogICAgIC5zZXRMb2FkZXJJZCguLi4pCiAgICAgKiAg
ICAgLnNldFVybCguLi4pCiAgICAgKiAgICAgLnNldE1pbWVUeXBlKC4uLik7CiAgICAgKi8KICAg
IHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVy
biBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRnJhbWUoKSkpOwogICAgfQoKICAg
IHZvaWQgc2V0UGFyZW50SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlz
LT5zZXRTdHJpbmcoInBhcmVudElkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TmFtZShj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygibmFtZSIs
IHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNlY3VyaXR5T3JpZ2luKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzZWN1cml0eU9yaWdpbiIsIHZh
bHVlKTsKICAgIH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBGcmFtZSBoaWVyYXJjaHkg
YWxvbmcgd2l0aCB0aGVpciBjYWNoZWQgcmVzb3VyY2VzLiAqLwpjbGFzcyBGcmFtZVJlc291cmNl
VHJlZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRl
ciBwcm9wZXJ0eSBuYW1lICdjaGlsZEZyYW1lcycgd2hpbGUgZ2VuZXJhdGluZyBGcmFtZVJlc291
cmNlVHJlZS4KICAgIGNsYXNzIENoaWxkRnJhbWVzIDogcHVibGljIEluc3BlY3RvckFycmF5IHsK
ICAgIHByaXZhdGU6CiAgICAgICAgQ2hpbGRGcmFtZXMoKSB7IH0KCiAgICBwdWJsaWM6CiAgICAg
ICAgdm9pZCBhZGRJdGVtKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UGFnZTo6RnJhbWVSZXNv
dXJjZVRyZWU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgdGhpcy0+cHVzaE9iamVjdCh2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBz
dGF0aWMgUGFzc1JlZlB0cjxDaGlsZEZyYW1lcz4gY3JlYXRlKCkgewogICAgICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IENoaWxkRnJhbWVzKCkpOwogICAgICAgIH0KICAgIH07CgogICAgLy8g
TmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAncmVzb3VyY2VzJyB3aGlsZSBnZW5lcmF0aW5nIEZy
YW1lUmVzb3VyY2VUcmVlLgogICAgY2xhc3MgUmVzb3VyY2VzIDogcHVibGljIEluc3BlY3RvckFy
cmF5IHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVzb3VyY2VzKCkgeyB9CgogICAgcHVibGljOgog
ICAgICAgIGNsYXNzIEl0ZW0gOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKICAgICAgICBwdWJs
aWM6CiAgICAgICAgICAgIGVudW0gewogICAgICAgICAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAog
ICAgICAgICAgICAgICAgVXJsU2V0ID0gMSA8PCAwLAogICAgICAgICAgICAgICAgVHlwZVNldCA9
IDEgPDwgMSwKICAgICAgICAgICAgICAgIE1pbWVUeXBlU2V0ID0gMSA8PCAyLAogICAgICAgICAg
ICAgICAgQWxsRmllbGRzU2V0ID0gKFVybFNldCB8IFR5cGVTZXQgfCBNaW1lVHlwZVNldCkKICAg
ICAgICAgICAgfTsKCiAgICAgICAgICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgICAgICAgICAg
Y2xhc3MgQnVpbGRlciB7CiAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxp
bnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgICAgICAg
ICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVy
PFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAg
ICBCdWlsZGVyKFBhc3NSZWZQdHI8SXRlbT4gcHRyKQogICAgICAgICAgICAgICAgewogICAgICAg
ICAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVy
X2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICAgICAgICAgIG1fcmVzdWx0
ID0gcHRyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEl0
ZW07CiAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAKICAgICAgICAgICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICAgICAg
ICAgIHsKICAgICAgICAgICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0
KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxVcmxTZXQ+KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoVHlwZUJ1aWxkZXI6OlBhZ2U6
OlJlc291cmNlVHlwZTo6RW51bSB2YWx1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5
cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgICAgICAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAKICAg
ICAgICAgICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgICAg
ICAgICB9CiAgICAgICAgCiAgICAgICAgICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWltZVR5cGVT
ZXQ+JiBzZXRNaW1lVHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgICAgICAgICAgewog
ICAgICAgICAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNaW1lVHlwZVNldCks
IHByb3BlcnR5X21pbWVUeXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJtaW1lVHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPE1pbWVUeXBlU2V0PigpOwogICAgICAgICAgICAgICAgfQogICAgICAg
IAogICAgICAgICAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEl0ZW0+JiAoKQogICAgICAgICAgICAg
ICAgewogICAgICAgICAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxk
c1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PFJlZlB0cjxJdGVtPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgICAgICAg
ICB9CgogICAgICAgICAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxJdGVtPiAoKQogICAgICAg
ICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZQdHI8SXRlbT4oKnRoaXMp
OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLyoKICAgICAg
ICAgICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICAgICAgICAgKiBSZWZQdHI8SXRl
bT4gcmVzdWx0ID0gSXRlbTo6Y3JlYXRlKCkKICAgICAgICAgICAgICogICAgIC5zZXRVcmwoLi4u
KQogICAgICAgICAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICAgICAgICAgKiAgICAgLnNl
dE1pbWVUeXBlKC4uLik7CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdGF0aWMgQnVpbGRl
cjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBJdGVtKCkpKTsKICAgICAgICAg
ICAgfQogICAgICAgIH07CgogICAgICAgIHZvaWQgYWRkSXRlbSgvKlBhc3NSZWZQdHI8SXRlbT4q
LyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICB0aGlzLT5wdXNoT2JqZWN0KHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBQYXNz
UmVmUHRyPFJlc291cmNlcz4gY3JlYXRlKCkgewogICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFJlc291cmNlcygpKTsKICAgICAgICB9CiAgICB9OwoKICAgIGVudW0gewogICAgICAgIE5v
RmllbGRzU2V0ID0gMCwKICAgICAgICBGcmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBSZXNvdXJj
ZXNTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKEZyYW1lU2V0IHwgUmVzb3Vy
Y2VzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVy
IHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RT
dGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVp
bGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBh
c3NSZWZQdHI8RnJhbWVSZXNvdXJjZVRyZWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIEZyYW1lUmVzb3VyY2VUcmVlOwogICAgcHVibGljOgoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgRnJhbWVTZXQ+JiBzZXRGcmFtZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxk
ZXI6OlBhZ2U6OkZyYW1lPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGcmFtZVNldCksIHBy
b3BlcnR5X2ZyYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVj
dCgiZnJhbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnJhbWVTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUmVzb3VyY2VzU2V0PiYgc2V0
UmVzb3VyY2VzKC8qUGFzc1JlZlB0cjxSZXNvdXJjZXM+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JB
cnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgUmVzb3VyY2VzU2V0KSwgcHJvcGVydHlfcmVzb3VyY2VzX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJyZXNvdXJjZXMiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8UmVzb3VyY2VzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFk
eSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RnJhbWVSZXNv
dXJjZVRyZWU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8RnJhbWVSZXNvdXJjZVRyZWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
UmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEZyYW1lUmVzb3Vy
Y2VUcmVlPiByZXN1bHQgPSBGcmFtZVJlc291cmNlVHJlZTo6Y3JlYXRlKCkKICAgICAqICAgICAu
c2V0RnJhbWUoLi4uKQogICAgICogICAgIC5zZXRSZXNvdXJjZXMoLi4uKTsKICAgICAqLwogICAg
c3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJu
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBGcmFtZVJlc291cmNlVHJlZSgpKSk7
CiAgICB9CgogICAgdm9pZCBzZXRDaGlsZEZyYW1lcygvKlBhc3NSZWZQdHI8Q2hpbGRGcmFtZXM+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0QXJyYXkoImNoaWxkRnJhbWVzIiwgdmFsdWUpOwogICAgfQp9OwoKLyogU2VhcmNoIG1hdGNo
IGZvciByZXNvdXJjZS4gKi8KY2xhc3MgU2VhcmNoTWF0Y2ggOiBwdWJsaWMgSW5zcGVjdG9yT2Jq
ZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAg
IExpbmVOdW1iZXJTZXQgPSAxIDw8IDAsCiAgICAgICAgTGluZUNvbnRlbnRTZXQgPSAxIDw8IDEs
CiAgICAgICAgQWxsRmllbGRzU2V0ID0gKExpbmVOdW1iZXJTZXQgfCBMaW5lQ29udGVudFNldCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PFNlYXJjaE1hdGNoPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBTZWFyY2hNYXRjaDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExpbmVO
dW1iZXJTZXQ+JiBzZXRMaW5lTnVtYmVyKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMaW5lTnVtYmVyU2V0KSwgcHJvcGVydHlfbGlu
ZU51bWJlcl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImxp
bmVOdW1iZXIiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGluZU51bWJl
clNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMaW5lQ29udGVudFNl
dD4mIHNldExpbmVDb250ZW50KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTGluZUNvbnRlbnRTZXQpLCBwcm9wZXJ0eV9s
aW5lQ29udGVudF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmco
ImxpbmVDb250ZW50IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExpbmVD
b250ZW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNlYXJjaE1h
dGNoPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFs
bEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxSZWZQdHI8U2VhcmNoTWF0Y2g+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U2VhcmNoTWF0Y2g+ICgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNlYXJjaE1hdGNoPigqdGhpcyk7CiAgICAgICAgfQog
ICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRy
PFNlYXJjaE1hdGNoPiByZXN1bHQgPSBTZWFyY2hNYXRjaDo6Y3JlYXRlKCkKICAgICAqICAgICAu
c2V0TGluZU51bWJlciguLi4pCiAgICAgKiAgICAgLnNldExpbmVDb250ZW50KC4uLik7CiAgICAg
Ki8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAg
IHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgU2VhcmNoTWF0Y2goKSkp
OwogICAgfQp9OwoKLyogU2VhcmNoIHJlc3VsdCBmb3IgcmVzb3VyY2UuICovCmNsYXNzIFNlYXJj
aFJlc3VsdCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAg
ICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVXJsU2V0ID0gMSA8PCAwLAogICAgICAgIEZy
YW1lSWRTZXQgPSAxIDw8IDEsCiAgICAgICAgTWF0Y2hlc0NvdW50U2V0ID0gMSA8PCAyLAogICAg
ICAgIEFsbEZpZWxkc1NldCA9IChVcmxTZXQgfCBGcmFtZUlkU2V0IHwgTWF0Y2hlc0NvdW50U2V0
KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAg
IHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAg
ICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxT
VEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQ
dHI8U2VhcmNoUmVzdWx0PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBTZWFyY2hSZXN1bHQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBV
cmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXJsU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IEZyYW1lSWRTZXQ+JiBzZXRGcmFtZUlkKC8qY29uc3QgVHlwZUJ1aWxkZXI6
Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGcmFtZUlkU2V0KSwgcHJvcGVydHlfZnJh
bWVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZyYW1l
SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnJhbWVJZFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNYXRjaGVzQ291bnRTZXQ+JiBzZXRN
YXRjaGVzQ291bnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE1hdGNoZXNDb3VudFNldCksIHByb3BlcnR5X21hdGNoZXNDb3VudF9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm1hdGNoZXNDb3Vu
dCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNYXRjaGVzQ291bnRTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U2VhcmNoUmVzdWx0PiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8U2VhcmNoUmVzdWx0Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAg
ICBvcGVyYXRvciBQYXNzUmVmUHRyPFNlYXJjaFJlc3VsdD4gKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiBSZWZQdHI8U2VhcmNoUmVzdWx0PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsK
CiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFNlYXJj
aFJlc3VsdD4gcmVzdWx0ID0gU2VhcmNoUmVzdWx0OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRV
cmwoLi4uKQogICAgICogICAgIC5zZXRGcmFtZUlkKC4uLikKICAgICAqICAgICAuc2V0TWF0Y2hl
c0NvdW50KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVh
dGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihu
ZXcgU2VhcmNoUmVzdWx0KCkpKTsKICAgIH0KfTsKCi8qIENvb2tpZSBvYmplY3QgKi8KY2xhc3Mg
Q29va2llIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAg
ICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFZh
bHVlU2V0ID0gMSA8PCAxLAogICAgICAgIERvbWFpblNldCA9IDEgPDwgMiwKICAgICAgICBQYXRo
U2V0ID0gMSA8PCAzLAogICAgICAgIEV4cGlyZXNTZXQgPSAxIDw8IDQsCiAgICAgICAgU2l6ZVNl
dCA9IDEgPDwgNSwKICAgICAgICBIdHRwT25seVNldCA9IDEgPDwgNiwKICAgICAgICBTZWN1cmVT
ZXQgPSAxIDw8IDcsCiAgICAgICAgU2Vzc2lvblNldCA9IDEgPDwgOCwKICAgICAgICBBbGxGaWVs
ZHNTZXQgPSAoTmFtZVNldCB8IFZhbHVlU2V0IHwgRG9tYWluU2V0IHwgUGF0aFNldCB8IEV4cGly
ZXNTZXQgfCBTaXplU2V0IHwgSHR0cE9ubHlTZXQgfCBTZWN1cmVTZXQgfCBTZXNzaW9uU2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
Q29va2llPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDb29r
aWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFt
ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFZhbHVlU2V0PiYgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWYWx1ZVNldCksIHByb3BlcnR5X3Zh
bHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidmFsdWUi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmFsdWVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRG9tYWluU2V0PiYgc2V0RG9tYWluKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgRG9tYWluU2V0KSwgcHJvcGVydHlfZG9tYWluX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygiZG9tYWluIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPERvbWFpblNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBQYXRoU2V0PiYgc2V0UGF0aChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFBhdGhTZXQpLCBwcm9wZXJ0eV9wYXRo
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygicGF0aCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxQYXRoU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEV4cGlyZXNTZXQ+JiBzZXRFeHBpcmVzKGludCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBFeHBpcmVz
U2V0KSwgcHJvcGVydHlfZXhwaXJlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoImV4cGlyZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8RXhwaXJlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaXpl
U2V0PiYgc2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgU2l6ZVNldCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFNpemVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgSHR0cE9ubHlTZXQ+JiBzZXRIdHRwT25seShib29sIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEh0dHBPbmx5U2V0KSwgcHJvcGVydHlf
aHR0cE9ubHlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigi
aHR0cE9ubHkiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SHR0cE9ubHlT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2VjdXJlU2V0PiYgc2V0
U2VjdXJlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgU2VjdXJlU2V0KSwgcHJvcGVydHlfc2VjdXJlX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oInNlY3VyZSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxTZWN1cmVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU2Vzc2lvblNldD4mIHNldFNlc3Npb24oYm9vbCB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTZXNzaW9uU2V0KSwgcHJvcGVydHlf
c2Vzc2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJz
ZXNzaW9uIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNlc3Npb25TZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q29va2llPiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8Q29va2llPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQ
YXNzUmVmUHRyPENvb2tpZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
Q29va2llPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENvb2tpZT4gcmVzdWx0ID0gQ29va2llOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFsdWUoLi4uKQog
ICAgICogICAgIC5zZXREb21haW4oLi4uKQogICAgICogICAgIC5zZXRQYXRoKC4uLikKICAgICAq
ICAgICAuc2V0RXhwaXJlcyguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAg
IC5zZXRIdHRwT25seSguLi4pCiAgICAgKiAgICAgLnNldFNlY3VyZSguLi4pCiAgICAgKiAgICAg
LnNldFNlc3Npb24oLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0
UmVmKG5ldyBDb29raWUoKSkpOwogICAgfQp9OwoKfSAvLyBQYWdlCgpuYW1lc3BhY2UgUnVudGlt
ZSB7Ci8qIE1pcnJvciBvYmplY3QgcmVmZXJlbmNpbmcgb3JpZ2luYWwgSmF2YVNjcmlwdCBvYmpl
Y3QuICovCmNsYXNzIFJlbW90ZU9iamVjdCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJs
aWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICd0eXBlJyB3aGlsZSBnZW5lcmF0
aW5nIFJlbW90ZU9iamVjdC4KICAgIHN0cnVjdCBUeXBlIHsKICAgICAgICBlbnVtIEVudW0gewog
ICAgICAgICAgICBPYmplY3QgPSA4LAogICAgICAgICAgICBGdW5jdGlvbiA9IDksCiAgICAgICAg
ICAgIFVuZGVmaW5lZCA9IDEwLAogICAgICAgICAgICBTdHJpbmcgPSAxMSwKICAgICAgICAgICAg
TnVtYmVyID0gMTIsCiAgICAgICAgICAgIEJvb2xlYW4gPSAxMywKICAgICAgICB9OwogICAgfTsg
Ly8gc3RydWN0IFR5cGUKCiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdzdWJ0eXBl
JyB3aGlsZSBnZW5lcmF0aW5nIFJlbW90ZU9iamVjdC4KICAgIHN0cnVjdCBTdWJ0eXBlIHsKICAg
ICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBBcnJheSA9IDE0LAogICAgICAgICAgICBOdWxs
ID0gMTUsCiAgICAgICAgICAgIE5vZGUgPSAxNiwKICAgICAgICAgICAgUmVnZXhwID0gMTcsCiAg
ICAgICAgICAgIERhdGUgPSAxOCwKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IFN1YnR5cGUK
CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVHlwZVNldCA9IDEg
PDwgMCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVHlwZVNldCkKICAgIH07CgogICAgdGVtcGxh
dGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RF
UD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFJlbW90ZU9iamVjdD4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUmVtb3RlT2JqZWN0Owog
ICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoVHlw
ZTo6RW51bSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwg
cHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJp
bmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4o
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZW1vdGVPYmplY3Q+JiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0
LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PFJlZlB0cjxSZW1vdGVPYmplY3Q+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFBhc3NSZWZQdHI8UmVtb3RlT2JqZWN0PiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuIFJlZlB0cjxSZW1vdGVPYmplY3Q+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8UmVtb3Rl
T2JqZWN0PiByZXN1bHQgPSBSZW1vdGVPYmplY3Q6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5
cGUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgp
CiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBS
ZW1vdGVPYmplY3QoKSkpOwogICAgfQoKICAgIHZvaWQgc2V0U3VidHlwZShTdWJ0eXBlOjpFbnVt
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic3VidHlwZSIsIGdldEVudW1D
b25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICB9CgogICAgdm9pZCBzZXRTdWJ0eXBlKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdWJ0eXBlIiwgdmFs
dWUpOwogICAgfQoKICAgIHZvaWQgc2V0Q2xhc3NOYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJjbGFzc05hbWUiLCB2YWx1ZSk7CiAgICB9Cgog
ICAgdm9pZCBzZXRWYWx1ZShQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRWYWx1ZSgidmFsdWUiLCB2YWx1ZSk7CiAgICB9CiAgICB1c2luZyBJ
bnNwZWN0b3JPYmplY3Q6OnNldFZhbHVlOwoKCiAgICB2b2lkIHNldERlc2NyaXB0aW9uKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkZXNjcmlwdGlv
biIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE9iamVjdElkKC8qY29uc3QgVHlwZUJ1aWxk
ZXI6OlJ1bnRpbWU6OlJlbW90ZU9iamVjdElkJiovIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJvYmplY3RJZCIsIHZhbHVlKTsKICAgIH0KfTsKCi8q
IE9iamVjdCBwcm9wZXJ0eSBkZXNjcmlwdG9yLiAqLwpjbGFzcyBQcm9wZXJ0eURlc2NyaXB0b3Ig
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9G
aWVsZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgV3JpdGFibGVT
ZXQgPSAxIDw8IDEsCiAgICAgICAgQ29uZmlndXJhYmxlU2V0ID0gMSA8PCAyLAogICAgICAgIEVu
dW1lcmFibGVTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVTZXQgfCBX
cml0YWJsZVNldCB8IENvbmZpZ3VyYWJsZVNldCB8IEVudW1lcmFibGVTZXQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxQcm9wZXJ0eURl
c2NyaXB0b3I+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFBy
b3BlcnR5RGVzY3JpcHRvcjsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5h
bWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgV3JpdGFibGVTZXQ+JiBzZXRXcml0YWJsZShib29sIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFdyaXRhYmxlU2V0
KSwgcHJvcGVydHlfd3JpdGFibGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0Qm9vbGVhbigid3JpdGFibGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8V3JpdGFibGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ29u
ZmlndXJhYmxlU2V0PiYgc2V0Q29uZmlndXJhYmxlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ29uZmlndXJhYmxlU2V0KSwgcHJvcGVy
dHlfY29uZmlndXJhYmxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJv
b2xlYW4oImNvbmZpZ3VyYWJsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxDb25maWd1cmFibGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
RW51bWVyYWJsZVNldD4mIHNldEVudW1lcmFibGUoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBFbnVtZXJhYmxlU2V0KSwgcHJvcGVydHlf
ZW51bWVyYWJsZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFu
KCJlbnVtZXJhYmxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEVudW1l
cmFibGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UHJvcGVydHlE
ZXNjcmlwdG9yPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9yPio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFByb3BlcnR5RGVzY3Jp
cHRvcj4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UHJvcGVydHlEZXNj
cmlwdG9yPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4gcmVzdWx0ID0g
UHJvcGVydHlEZXNjcmlwdG9yOjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAg
ICAqICAgICAuc2V0V3JpdGFibGUoLi4uKQogICAgICogICAgIC5zZXRDb25maWd1cmFibGUoLi4u
KQogICAgICogICAgIC5zZXRFbnVtZXJhYmxlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgUHJvcGVydHlEZXNjcmlwdG9yKCkpKTsKICAgIH0KCiAg
ICB2b2lkIHNldFZhbHVlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3Rl
T2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRPYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVj
dG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXRHZXQoLypQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiZ2V0IiwgdmFsdWUpOwog
ICAgfQoKICAgIHZvaWQgc2V0U2V0KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6
UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRPYmplY3QoInNldCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNl
dFdhc1Rocm93bihib29sIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEJvb2xlYW4oIndh
c1Rocm93biIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIFJlcHJlc2VudHMgZnVuY3Rpb24gY2FsbCBh
cmd1bWVudC4gRWl0aGVyIHJlbW90ZSBvYmplY3QgaWQgPGNvZGU+b2JqZWN0SWQ8L2NvZGU+IG9y
IHByaW1pdGl2ZSA8Y29kZT52YWx1ZTwvY29kZT4gb3IgbmVpdGhlciBvZiAoZm9yIHVuZGVmaW5l
ZCkgdGhlbSBzaG91bGQgYmUgc3BlY2lmaWVkLiAqLwpjbGFzcyBDYWxsQXJndW1lbnQgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNT
ZXQgPSAwLAogICAgICAgIEFsbEZpZWxkc1NldCA9IDAKICAgIH07CgogICAgdGVtcGxhdGU8aW50
IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVp
bGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENhbGxBcmd1bWVudD4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ2FsbEFyZ3VtZW50OwogICAgcHVi
bGljOgoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q2FsbEFyZ3VtZW50PiYgKCkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8Q2FsbEFyZ3VtZW50Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBQYXNzUmVmUHRyPENhbGxBcmd1bWVudD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biBSZWZQdHI8Q2FsbEFyZ3VtZW50PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgog
ICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENhbGxBcmd1bWVudD4g
cmVzdWx0ID0gQ2FsbEFyZ3VtZW50OjpjcmVhdGUoKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDYWxsQXJndW1lbnQoKSkpOwogICAgfQoKICAgIHZvaWQg
c2V0VmFsdWUoUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0VmFsdWUoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9y
T2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXRPYmplY3RJZCgvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90ZU9iamVjdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJvYmplY3RJZCIsIHZh
bHVlKTsKICAgIH0KfTsKCn0gLy8gUnVudGltZQoKbmFtZXNwYWNlIENvbnNvbGUgewovKiBDb25z
b2xlIG1lc3NhZ2UuICovCmNsYXNzIENvbnNvbGVNZXNzYWdlIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3NvdXJjZScg
d2hpbGUgZ2VuZXJhdGluZyBDb25zb2xlTWVzc2FnZS4KICAgIHN0cnVjdCBTb3VyY2UgewogICAg
ICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIEh0bWwgPSAxOSwKICAgICAgICAgICAgV21sID0g
MjAsCiAgICAgICAgICAgIFhtbCA9IDIxLAogICAgICAgICAgICBKYXZhc2NyaXB0ID0gMjIsCiAg
ICAgICAgICAgIE5ldHdvcmsgPSAyMywKICAgICAgICAgICAgQ29uc29sZV9hcGkgPSAyNCwKICAg
ICAgICAgICAgT3RoZXIgPSAyNSwKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IFNvdXJjZQoK
ICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ2xldmVsJyB3aGlsZSBnZW5lcmF0aW5n
IENvbnNvbGVNZXNzYWdlLgogICAgc3RydWN0IExldmVsIHsKICAgICAgICBlbnVtIEVudW0gewog
ICAgICAgICAgICBUaXAgPSAyNiwKICAgICAgICAgICAgTG9nID0gMjcsCiAgICAgICAgICAgIFdh
cm5pbmcgPSAyOCwKICAgICAgICAgICAgRXJyb3IgPSAyOSwKICAgICAgICAgICAgRGVidWcgPSAz
MCwKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IExldmVsCgogICAgLy8gTmFtZWQgYWZ0ZXIg
cHJvcGVydHkgbmFtZSAndHlwZScgd2hpbGUgZ2VuZXJhdGluZyBDb25zb2xlTWVzc2FnZS4KICAg
IHN0cnVjdCBUeXBlIHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBMb2cgPSAyNywK
ICAgICAgICAgICAgRGlyID0gMzEsCiAgICAgICAgICAgIERpcnhtbCA9IDMyLAogICAgICAgICAg
ICBUcmFjZSA9IDMzLAogICAgICAgICAgICBTdGFydEdyb3VwID0gMzQsCiAgICAgICAgICAgIFN0
YXJ0R3JvdXBDb2xsYXBzZWQgPSAzNSwKICAgICAgICAgICAgRW5kR3JvdXAgPSAzNiwKICAgICAg
ICAgICAgQXNzZXJ0ID0gMzcsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBUeXBlCgogICAg
Ly8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAncGFyYW1ldGVycycgd2hpbGUgZ2VuZXJhdGlu
ZyBDb25zb2xlTWVzc2FnZS4KICAgIGNsYXNzIFBhcmFtZXRlcnMgOiBwdWJsaWMgSW5zcGVjdG9y
QXJyYXkgewogICAgcHJpdmF0ZToKICAgICAgICBQYXJhbWV0ZXJzKCkgeyB9CgogICAgcHVibGlj
OgogICAgICAgIHZvaWQgYWRkSXRlbSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1bnRpbWU6
OlJlbW90ZU9iamVjdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICB0aGlzLT5wdXNoT2JqZWN0KHZhbHVlKTsKICAgICAgICB9CgogICAg
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFBhcmFtZXRlcnM+IGNyZWF0ZSgpIHsKICAgICAgICAgICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyBQYXJhbWV0ZXJzKCkpOwogICAgICAgIH0KICAgIH07CgogICAg
ZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFNvdXJjZVNldCA9IDEgPDwg
MCwKICAgICAgICBMZXZlbFNldCA9IDEgPDwgMSwKICAgICAgICBUZXh0U2V0ID0gMSA8PCAyLAog
ICAgICAgIEFsbEZpZWxkc1NldCA9IChTb3VyY2VTZXQgfCBMZXZlbFNldCB8IFRleHRTZXQpCiAg
ICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJp
dmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAg
dGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRF
IHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxD
b25zb2xlTWVzc2FnZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7
CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xh
c3MgQ29uc29sZU1lc3NhZ2U7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBT
b3VyY2VTZXQ+JiBzZXRTb3VyY2UoU291cmNlOjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNvdXJjZVNldCksIHByb3BlcnR5X3NvdXJj
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNvdXJjZSIs
IGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8U291cmNlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJj
ZVNldD4mIHNldFNvdXJjZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNvdXJjZVNldCksIHByb3BlcnR5X3NvdXJjZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNvdXJjZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGV2ZWxTZXQ+JiBzZXRMZXZlbChMZXZlbDo6RW51
bSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBM
ZXZlbFNldCksIHByb3BlcnR5X2xldmVsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygibGV2ZWwiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExldmVsU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IExldmVsU2V0PiYgc2V0TGV2ZWwoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMZXZlbFNldCks
IHByb3BlcnR5X2xldmVsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0
cmluZygibGV2ZWwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGV2ZWxT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVGV4dFNldD4mIHNldFRl
eHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBUZXh0U2V0KSwgcHJvcGVydHlfdGV4dF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInRleHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8VGV4dFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxDb25zb2xlTWVzc2FnZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENvbnNvbGVNZXNzYWdlPio+KCZt
X3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENvbnNvbGVN
ZXNzYWdlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDb25zb2xlTWVz
c2FnZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBj
b25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDb25zb2xlTWVzc2FnZT4gcmVzdWx0ID0gQ29uc29s
ZU1lc3NhZ2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFNvdXJjZSguLi4pCiAgICAgKiAgICAg
LnNldExldmVsKC4uLikKICAgICAqICAgICAuc2V0VGV4dCguLi4pOwogICAgICovCiAgICBzdGF0
aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVp
bGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENvbnNvbGVNZXNzYWdlKCkpKTsKICAgIH0K
CiAgICB2b2lkIHNldFR5cGUoVHlwZTo6RW51bSB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRTdHJpbmcoInR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgfQoKICAg
IHZvaWQgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFVybChjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwog
ICAgfQoKICAgIHZvaWQgc2V0TGluZShpbnQgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
TnVtYmVyKCJsaW5lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UmVwZWF0Q291bnQoaW50
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigicmVwZWF0Q291bnQiLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBzZXRQYXJhbWV0ZXJzKC8qUGFzc1JlZlB0cjxQYXJhbWV0ZXJz
PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMt
PnNldEFycmF5KCJwYXJhbWV0ZXJzIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U3RhY2tU
cmFjZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNvbnNvbGU6OlN0YWNrVHJhY2U+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJy
YXkoInN0YWNrVHJhY2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXROZXR3b3JrUmVxdWVz
dElkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygibmV0d29ya1JlcXVlc3RJ
ZCIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIFN0YWNrIGVudHJ5IGZvciBjb25zb2xlIGVycm9ycyBh
bmQgYXNzZXJ0aW9ucy4gKi8KY2xhc3MgQ2FsbEZyYW1lIDogcHVibGljIEluc3BlY3Rvck9iamVj
dCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBG
dW5jdGlvbk5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgVXJsU2V0ID0gMSA8PCAxLAogICAgICAg
IExpbmVOdW1iZXJTZXQgPSAxIDw8IDIsCiAgICAgICAgQ29sdW1uTnVtYmVyU2V0ID0gMSA8PCAz
LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChGdW5jdGlvbk5hbWVTZXQgfCBVcmxTZXQgfCBMaW5l
TnVtYmVyU2V0IHwgQ29sdW1uTnVtYmVyU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RB
VEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVy
PFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q2FsbEZyYW1lPiBwdHIpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9j
cmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAg
ICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDYWxsRnJhbWU7CiAgICBwdWJsaWM6CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBGdW5jdGlvbk5hbWVTZXQ+JiBzZXRGdW5jdGlvbk5hbWUoY29u
c3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBGdW5jdGlvbk5hbWVTZXQpLCBwcm9wZXJ0eV9mdW5jdGlvbk5hbWVfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmdW5jdGlvbk5hbWUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnVuY3Rpb25OYW1lU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVybFNldD4mIHNldFVybChjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFVybFNldCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxV
cmxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51bWJlclNl
dD4mIHNldExpbmVOdW1iZXIoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIExpbmVOdW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5lTnVtYmVyX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibGluZU51bWJlciIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVyU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENvbHVtbk51bWJlclNldD4mIHNldENv
bHVtbk51bWJlcihpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgQ29sdW1uTnVtYmVyU2V0KSwgcHJvcGVydHlfY29sdW1uTnVtYmVyX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY29sdW1uTnVtYmVyIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENvbHVtbk51bWJlclNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDYWxsRnJhbWU+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1
bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJl
ZlB0cjxDYWxsRnJhbWU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFBhc3NSZWZQdHI8Q2FsbEZyYW1lPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJl
ZlB0cjxDYWxsRnJhbWU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBT
eW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q2FsbEZyYW1lPiByZXN1bHQgPSBD
YWxsRnJhbWU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldEZ1bmN0aW9uTmFtZSguLi4pCiAgICAg
KiAgICAgLnNldFVybCguLi4pCiAgICAgKiAgICAgLnNldExpbmVOdW1iZXIoLi4uKQogICAgICog
ICAgIC5zZXRDb2x1bW5OdW1iZXIoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+KGFkb3B0UmVmKG5ldyBDYWxsRnJhbWUoKSkpOwogICAgfQp9OwoKLyogQ2FsbCBmcmFtZXMg
Zm9yIGFzc2VydGlvbnMgb3IgZXJyb3IgbWVzc2FnZXMuICovCmNsYXNzIFN0YWNrVHJhY2UgOiBw
dWJsaWMgSW5zcGVjdG9yQXJyYXkgewpwcml2YXRlOgogICAgU3RhY2tUcmFjZSgpIHsgfQoKcHVi
bGljOgogICAgdm9pZCBhZGRJdGVtKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q29uc29sZTo6
Q2FsbEZyYW1lPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5wdXNoT2JqZWN0KHZhbHVlKTsKICAgIH0KCiAgICBzdGF0aWMgUGFzc1JlZlB0
cjxTdGFja1RyYWNlPiBjcmVhdGUoKSB7CiAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdGFj
a1RyYWNlKCkpOwogICAgfQp9OwoKfSAvLyBDb25zb2xlCgpuYW1lc3BhY2UgTmV0d29yayB7Ci8q
IFRpbWluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QuICovCmNsYXNzIFJlc291cmNlVGlt
aW5nIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAg
IE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBSZXF1ZXN0VGltZVNldCA9IDEgPDwgMCwKICAgICAg
ICBQcm94eVN0YXJ0U2V0ID0gMSA8PCAxLAogICAgICAgIFByb3h5RW5kU2V0ID0gMSA8PCAyLAog
ICAgICAgIERuc1N0YXJ0U2V0ID0gMSA8PCAzLAogICAgICAgIERuc0VuZFNldCA9IDEgPDwgNCwK
ICAgICAgICBDb25uZWN0U3RhcnRTZXQgPSAxIDw8IDUsCiAgICAgICAgQ29ubmVjdEVuZFNldCA9
IDEgPDwgNiwKICAgICAgICBTc2xTdGFydFNldCA9IDEgPDwgNywKICAgICAgICBTc2xFbmRTZXQg
PSAxIDw8IDgsCiAgICAgICAgU2VuZFN0YXJ0U2V0ID0gMSA8PCA5LAogICAgICAgIFNlbmRFbmRT
ZXQgPSAxIDw8IDEwLAogICAgICAgIFJlY2VpdmVIZWFkZXJzRW5kU2V0ID0gMSA8PCAxMSwKICAg
ICAgICBBbGxGaWVsZHNTZXQgPSAoUmVxdWVzdFRpbWVTZXQgfCBQcm94eVN0YXJ0U2V0IHwgUHJv
eHlFbmRTZXQgfCBEbnNTdGFydFNldCB8IERuc0VuZFNldCB8IENvbm5lY3RTdGFydFNldCB8IENv
bm5lY3RFbmRTZXQgfCBTc2xTdGFydFNldCB8IFNzbEVuZFNldCB8IFNlbmRTdGFydFNldCB8IFNl
bmRFbmRTZXQgfCBSZWNlaXZlSGVhZGVyc0VuZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50
IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVp
bGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFJlc291cmNlVGltaW5nPiBwdHIpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwg
YnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQg
PSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZXNvdXJjZVRpbWluZzsKICAg
IHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJlcXVlc3RUaW1lU2V0PiYgc2V0UmVx
dWVzdFRpbWUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFJlcXVlc3RUaW1lU2V0KSwgcHJvcGVydHlfcmVxdWVzdFRpbWVfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJyZXF1ZXN0VGltZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSZXF1ZXN0VGltZVNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBQcm94eVN0YXJ0U2V0PiYgc2V0UHJveHlT
dGFydChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgUHJveHlTdGFydFNldCksIHByb3BlcnR5X3Byb3h5U3RhcnRfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJwcm94eVN0YXJ0IiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFByb3h5U3RhcnRTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUHJveHlFbmRTZXQ+JiBzZXRQcm94eUVuZChkb3VibGUg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUHJv
eHlFbmRTZXQpLCBwcm9wZXJ0eV9wcm94eUVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoInByb3h5RW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPFByb3h5RW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IERuc1N0YXJ0U2V0PiYgc2V0RG5zU3RhcnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIERuc1N0YXJ0U2V0KSwgcHJvcGVydHlf
ZG5zU3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJk
bnNTdGFydCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxEbnNTdGFydFNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEbnNFbmRTZXQ+JiBzZXRE
bnNFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIERuc0VuZFNldCksIHByb3BlcnR5X2Ruc0VuZF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImRuc0VuZCIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxEbnNFbmRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgQ29ubmVjdFN0YXJ0U2V0PiYgc2V0Q29ubmVjdFN0YXJ0KGRvdWJsZSB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDb25uZWN0U3Rh
cnRTZXQpLCBwcm9wZXJ0eV9jb25uZWN0U3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJjb25uZWN0U3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8Q29ubmVjdFN0YXJ0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IENvbm5lY3RFbmRTZXQ+JiBzZXRDb25uZWN0RW5kKGRvdWJsZSB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDb25uZWN0RW5k
U2V0KSwgcHJvcGVydHlfY29ubmVjdEVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXROdW1iZXIoImNvbm5lY3RFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8Q29ubmVjdEVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBTc2xTdGFydFNldD4mIHNldFNzbFN0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTc2xTdGFydFNldCksIHByb3BlcnR5
X3NzbFN0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigi
c3NsU3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3NsU3RhcnRT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3NsRW5kU2V0PiYgc2V0
U3NsRW5kKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBTc2xFbmRTZXQpLCBwcm9wZXJ0eV9zc2xFbmRfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzc2xFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8U3NsRW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFNlbmRTdGFydFNldD4mIHNldFNlbmRTdGFydChkb3VibGUgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2VuZFN0YXJ0U2V0KSwg
cHJvcGVydHlfc2VuZFN0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dE51bWJlcigic2VuZFN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFNlbmRTdGFydFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZW5k
RW5kU2V0PiYgc2V0U2VuZEVuZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2VuZEVuZFNldCksIHByb3BlcnR5X3NlbmRFbmRfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzZW5kRW5kIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNlbmRFbmRTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUmVjZWl2ZUhlYWRlcnNFbmRTZXQ+JiBzZXRSZWNl
aXZlSGVhZGVyc0VuZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgUmVjZWl2ZUhlYWRlcnNFbmRTZXQpLCBwcm9wZXJ0eV9yZWNlaXZl
SGVhZGVyc0VuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
InJlY2VpdmVIZWFkZXJzRW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFJlY2VpdmVIZWFkZXJzRW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPFJlc291cmNlVGltaW5nPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UmVzb3VyY2VUaW1pbmc+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmVzb3VyY2VU
aW1pbmc+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJlc291cmNlVGlt
aW5nPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPFJlc291cmNlVGltaW5nPiByZXN1bHQgPSBSZXNvdXJj
ZVRpbWluZzo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0UmVxdWVzdFRpbWUoLi4uKQogICAgICog
ICAgIC5zZXRQcm94eVN0YXJ0KC4uLikKICAgICAqICAgICAuc2V0UHJveHlFbmQoLi4uKQogICAg
ICogICAgIC5zZXREbnNTdGFydCguLi4pCiAgICAgKiAgICAgLnNldERuc0VuZCguLi4pCiAgICAg
KiAgICAgLnNldENvbm5lY3RTdGFydCguLi4pCiAgICAgKiAgICAgLnNldENvbm5lY3RFbmQoLi4u
KQogICAgICogICAgIC5zZXRTc2xTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFNzbEVuZCguLi4p
CiAgICAgKiAgICAgLnNldFNlbmRTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFNlbmRFbmQoLi4u
KQogICAgICogICAgIC5zZXRSZWNlaXZlSGVhZGVyc0VuZCguLi4pOwogICAgICovCiAgICBzdGF0
aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVp
bGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFJlc291cmNlVGltaW5nKCkpKTsKICAgIH0K
fTsKCi8qIEhUVFAgcmVxdWVzdCBkYXRhLiAqLwpjbGFzcyBSZXF1ZXN0IDogcHVibGljIEluc3Bl
Y3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwK
ICAgICAgICBVcmxTZXQgPSAxIDw8IDAsCiAgICAgICAgTWV0aG9kU2V0ID0gMSA8PCAxLAogICAg
ICAgIEhlYWRlcnNTZXQgPSAxIDw8IDIsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFVybFNldCB8
IE1ldGhvZFNldCB8IEhlYWRlcnNTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4K
ICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZXF1ZXN0PiBwdHIpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVk
X2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAg
fQogICAgICAgIGZyaWVuZCBjbGFzcyBSZXF1ZXN0OwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlf
dXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNZXRob2RTZXQ+JiBzZXRNZXRob2QoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBNZXRob2RTZXQpLCBwcm9wZXJ0eV9tZXRob2RfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJtZXRob2QiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8TWV0aG9kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IEhlYWRlcnNTZXQ+JiBzZXRIZWFkZXJzKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIZWFkZXJz
U2V0KSwgcHJvcGVydHlfaGVhZGVyc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8SGVhZGVyc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZXF1
ZXN0PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFs
bEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxSZWZQdHI8UmVxdWVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxSZXF1ZXN0PiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuIFJlZlB0cjxSZXF1ZXN0PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFJlcXVlc3Q+IHJl
c3VsdCA9IFJlcXVlc3Q6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAg
ICAgLnNldE1ldGhvZCguLi4pCiAgICAgKiAgICAgLnNldEhlYWRlcnMoLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBSZXF1ZXN0KCkpKTsKICAgIH0K
CiAgICB2b2lkIHNldFBvc3REYXRhKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0U3RyaW5nKCJwb3N0RGF0YSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIEhUVFAgcmVz
cG9uc2UgZGF0YS4gKi8KY2xhc3MgUmVzcG9uc2UgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFVybFNl
dCA9IDEgPDwgMCwKICAgICAgICBTdGF0dXNTZXQgPSAxIDw8IDEsCiAgICAgICAgU3RhdHVzVGV4
dFNldCA9IDEgPDwgMiwKICAgICAgICBIZWFkZXJzU2V0ID0gMSA8PCAzLAogICAgICAgIE1pbWVU
eXBlU2V0ID0gMSA8PCA0LAogICAgICAgIENvbm5lY3Rpb25SZXVzZWRTZXQgPSAxIDw8IDUsCiAg
ICAgICAgQ29ubmVjdGlvbklkU2V0ID0gMSA8PCA2LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChV
cmxTZXQgfCBTdGF0dXNTZXQgfCBTdGF0dXNUZXh0U2V0IHwgSGVhZGVyc1NldCB8IE1pbWVUeXBl
U2V0IHwgQ29ubmVjdGlvblJldXNlZFNldCB8IENvbm5lY3Rpb25JZFNldCkKICAgIH07CgogICAg
dGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAg
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxp
bnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+
KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFJlc3BvbnNlPiBw
dHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxk
c1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9y
ZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZXNwb25zZTsKICAg
IHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVybFNldD4mIHNldFVybChjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFVybFNldCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxVcmxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhdHVzU2V0
PiYgc2V0U3RhdHVzKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBTdGF0dXNTZXQpLCBwcm9wZXJ0eV9zdGF0dXNfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzdGF0dXMiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3RhdHVzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IFN0YXR1c1RleHRTZXQ+JiBzZXRTdGF0dXNUZXh0KGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
U3RhdHVzVGV4dFNldCksIHByb3BlcnR5X3N0YXR1c1RleHRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdGF0dXNUZXh0IiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFN0YXR1c1RleHRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgSGVhZGVyc1NldD4mIHNldEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIEhlYWRlcnNTZXQpLCBwcm9wZXJ0eV9oZWFkZXJzX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxIZWFkZXJzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IE1pbWVUeXBlU2V0PiYgc2V0TWltZVR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNaW1lVHlwZVNl
dCksIHByb3BlcnR5X21pbWVUeXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygibWltZVR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8TWltZVR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ29u
bmVjdGlvblJldXNlZFNldD4mIHNldENvbm5lY3Rpb25SZXVzZWQoYm9vbCB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDb25uZWN0aW9uUmV1c2Vk
U2V0KSwgcHJvcGVydHlfY29ubmVjdGlvblJldXNlZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRCb29sZWFuKCJjb25uZWN0aW9uUmV1c2VkIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPENvbm5lY3Rpb25SZXVzZWRTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ29ubmVjdGlvbklkU2V0PiYgc2V0Q29ubmVjdGlvbklk
KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBDb25uZWN0aW9uSWRTZXQpLCBwcm9wZXJ0eV9jb25uZWN0aW9uSWRfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJjb25uZWN0aW9uSWQiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29ubmVjdGlvbklkU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFJlc3BvbnNlPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UmVz
cG9uc2U+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8UmVzcG9uc2U+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJlc3Bv
bnNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPFJlc3BvbnNlPiByZXN1bHQgPSBSZXNwb25zZTo6Y3Jl
YXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0U3RhdHVzKC4uLikK
ICAgICAqICAgICAuc2V0U3RhdHVzVGV4dCguLi4pCiAgICAgKiAgICAgLnNldEhlYWRlcnMoLi4u
KQogICAgICogICAgIC5zZXRNaW1lVHlwZSguLi4pCiAgICAgKiAgICAgLnNldENvbm5lY3Rpb25S
ZXVzZWQoLi4uKQogICAgICogICAgIC5zZXRDb25uZWN0aW9uSWQoLi4uKTsKICAgICAqLwogICAg
c3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJu
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBSZXNwb25zZSgpKSk7CiAgICB9Cgog
ICAgdm9pZCBzZXRIZWFkZXJzVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldFN0cmluZygiaGVhZGVyc1RleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBz
ZXRSZXF1ZXN0SGVhZGVycyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJyZXF1ZXN0SGVhZGVycyIsIHZhbHVlKTsKICAgIH0K
CiAgICB2b2lkIHNldFJlcXVlc3RIZWFkZXJzVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldFN0cmluZygicmVxdWVzdEhlYWRlcnNUZXh0IiwgdmFsdWUpOwog
ICAgfQoKICAgIHZvaWQgc2V0RnJvbURpc2tDYWNoZShib29sIHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldEJvb2xlYW4oImZyb21EaXNrQ2FjaGUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9p
ZCBzZXRUaW1pbmcoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXNvdXJjZVRp
bWluZz4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0T2JqZWN0KCJ0aW1pbmciLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBXZWJTb2NrZXQg
cmVxdWVzdCBkYXRhLiAqLwpjbGFzcyBXZWJTb2NrZXRSZXF1ZXN0IDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAg
ICAgICBSZXF1ZXN0S2V5M1NldCA9IDEgPDwgMCwKICAgICAgICBIZWFkZXJzU2V0ID0gMSA8PCAx
LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChSZXF1ZXN0S2V5M1NldCB8IEhlYWRlcnNTZXQpCiAg
ICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJp
dmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAg
dGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRF
IHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxX
ZWJTb2NrZXRSZXF1ZXN0PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBXZWJTb2NrZXRSZXF1ZXN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgUmVxdWVzdEtleTNTZXQ+JiBzZXRSZXF1ZXN0S2V5Myhjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJlcXVlc3RLZXkz
U2V0KSwgcHJvcGVydHlfcmVxdWVzdEtleTNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJyZXF1ZXN0S2V5MyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxSZXF1ZXN0S2V5M1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBIZWFkZXJzU2V0PiYgc2V0SGVhZGVycyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
SGVhZGVyc1NldCksIHByb3BlcnR5X2hlYWRlcnNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0T2JqZWN0KCJoZWFkZXJzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPEhlYWRlcnNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8V2ViU29ja2V0UmVxdWVzdD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFdlYlNvY2tldFJlcXVlc3Q+Kj4o
Jm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8V2ViU29j
a2V0UmVxdWVzdD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8V2ViU29j
a2V0UmVxdWVzdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PiByZXN1bHQg
PSBXZWJTb2NrZXRSZXF1ZXN0OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRSZXF1ZXN0S2V5Mygu
Li4pCiAgICAgKiAgICAgLnNldEhlYWRlcnMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBXZWJTb2NrZXRSZXF1ZXN0KCkpKTsKICAgIH0KfTsKCi8q
IFdlYlNvY2tldCByZXNwb25zZSBkYXRhLiAqLwpjbGFzcyBXZWJTb2NrZXRSZXNwb25zZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxk
c1NldCA9IDAsCiAgICAgICAgU3RhdHVzU2V0ID0gMSA8PCAwLAogICAgICAgIFN0YXR1c1RleHRT
ZXQgPSAxIDw8IDEsCiAgICAgICAgSGVhZGVyc1NldCA9IDEgPDwgMiwKICAgICAgICBDaGFsbGVu
Z2VSZXNwb25zZVNldCA9IDEgPDwgMywKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU3RhdHVzU2V0
IHwgU3RhdHVzVGV4dFNldCB8IEhlYWRlcnNTZXQgfCBDaGFsbGVuZ2VSZXNwb25zZVNldCkKICAg
IH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2
YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0
ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFdl
YlNvY2tldFJlc3BvbnNlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBXZWJTb2NrZXRSZXNwb25zZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFN0YXR1c1NldD4mIHNldFN0YXR1cyhkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3RhdHVzU2V0KSwgcHJvcGVydHlfc3RhdHVz
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic3RhdHVzIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0YXR1c1NldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTdGF0dXNUZXh0U2V0PiYgc2V0U3RhdHVzVGV4
dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFN0YXR1c1RleHRTZXQpLCBwcm9wZXJ0eV9zdGF0dXNUZXh0X2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3RhdHVzVGV4dCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGF0dXNUZXh0U2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhlYWRlcnNTZXQ+JiBzZXRIZWFkZXJzKFBhc3NS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBIZWFkZXJzU2V0KSwgcHJvcGVydHlfaGVhZGVyc19hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SGVhZGVyc1NldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDaGFsbGVuZ2VSZXNwb25zZVNldD4mIHNldENoYWxsZW5n
ZVJlc3BvbnNlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgQ2hhbGxlbmdlUmVzcG9uc2VTZXQpLCBwcm9wZXJ0eV9jaGFs
bGVuZ2VSZXNwb25zZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJp
bmcoImNoYWxsZW5nZVJlc3BvbnNlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPENoYWxsZW5nZVJlc3BvbnNlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UmVmUHRyPFdlYlNvY2tldFJlc3BvbnNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8V2ViU29ja2V0UmVzcG9u
c2U+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8
V2ViU29ja2V0UmVzcG9uc2U+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRy
PFdlYlNvY2tldFJlc3BvbnNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAg
ICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFdlYlNvY2tldFJlc3BvbnNl
PiByZXN1bHQgPSBXZWJTb2NrZXRSZXNwb25zZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3Rh
dHVzKC4uLikKICAgICAqICAgICAuc2V0U3RhdHVzVGV4dCguLi4pCiAgICAgKiAgICAgLnNldEhl
YWRlcnMoLi4uKQogICAgICogICAgIC5zZXRDaGFsbGVuZ2VSZXNwb25zZSguLi4pOwogICAgICov
CiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICBy
ZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFdlYlNvY2tldFJlc3BvbnNl
KCkpKTsKICAgIH0KfTsKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjYWNoZWQgcmVzb3VyY2Uu
ICovCmNsYXNzIENhY2hlZFJlc291cmNlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1Ymxp
YzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBVcmxTZXQgPSAx
IDw8IDAsCiAgICAgICAgVHlwZVNldCA9IDEgPDwgMSwKICAgICAgICBCb2R5U2l6ZVNldCA9IDEg
PDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVXJsU2V0IHwgVHlwZVNldCB8IEJvZHlTaXpl
U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsK
ICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7Cgog
ICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0
ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRl
cjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NS
ZWZQdHI8Q2FjaGVkUmVzb3VyY2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRf
c3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJp
ZW5kIGNsYXNzIENhY2hlZFJlc291cmNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShUeXBlQnVpbGRlcjo6UGFnZTo6
UmVzb3VyY2VUeXBlOjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIGdldEVudW1Db25zdGFudFZhbHVl
KHZhbHVlKSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEJvZHlTaXpl
U2V0PiYgc2V0Qm9keVNpemUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIEJvZHlTaXplU2V0KSwgcHJvcGVydHlfYm9keVNpemVfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJib2R5U2l6ZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxCb2R5U2l6ZVNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDYWNoZWRSZXNvdXJjZT4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPENhY2hlZFJlc291cmNlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVy
YXRvciBQYXNzUmVmUHRyPENhY2hlZFJlc291cmNlPiAoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuIFJlZlB0cjxDYWNoZWRSZXNvdXJjZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07Cgog
ICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDYWNoZWRS
ZXNvdXJjZT4gcmVzdWx0ID0gQ2FjaGVkUmVzb3VyY2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNl
dFVybCguLi4pCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXRCb2R5U2l6
ZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkK
ICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENh
Y2hlZFJlc291cmNlKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFJlc3BvbnNlKC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVzcG9uc2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicmVzcG9uc2UiLCB2
YWx1ZSk7CiAgICB9Cn07CgovKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdCBpbml0aWF0
b3IuICovCmNsYXNzIEluaXRpYXRvciA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6
CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICd0eXBlJyB3aGlsZSBnZW5lcmF0aW5n
IEluaXRpYXRvci4KICAgIHN0cnVjdCBUeXBlIHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAg
ICAgICBQYXJzZXIgPSAzOCwKICAgICAgICAgICAgU2NyaXB0ID0gMzksCiAgICAgICAgICAgIE90
aGVyID0gMjUsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBUeXBlCgogICAgZW51bSB7CiAg
ICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFR5cGVTZXQgPSAxIDw8IDAsCiAgICAgICAg
QWxsRmllbGRzU2V0ID0gKFR5cGVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4K
ICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxJbml0aWF0b3I+IHB0cikKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0
ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAg
ICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEluaXRpYXRvcjsKICAgIHB1YmxpYzoKCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKFR5cGU6OkVudW0gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3Bl
cnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0
eXBlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5
cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBvcGVyYXRvciBSZWZQdHI8SW5pdGlhdG9yPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8SW5pdGlhdG9yPio+
KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEluaXRp
YXRvcj4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8SW5pdGlhdG9yPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPEluaXRpYXRvcj4gcmVzdWx0ID0gSW5pdGlhdG9yOjpjcmVhdGUo
KQogICAgICogICAgIC5zZXRUeXBlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5v
RmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgSW5pdGlhdG9yKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldFN0YWNr
VHJhY2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDb25zb2xlOjpTdGFja1RyYWNlPiovIFBh
c3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFy
cmF5KCJzdGFja1RyYWNlIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0VXJsKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRMaW5lTnVtYmVyKGRvdWJsZSB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIE5l
dHdvcmsKCiNpZiBFTkFCTEUoU1FMX0RBVEFCQVNFKQpuYW1lc3BhY2UgRGF0YWJhc2UgewovKiBE
YXRhYmFzZSBvYmplY3QuICovCmNsYXNzIERhdGFiYXNlIDogcHVibGljIEluc3BlY3Rvck9iamVj
dCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBJ
ZFNldCA9IDEgPDwgMCwKICAgICAgICBEb21haW5TZXQgPSAxIDw8IDEsCiAgICAgICAgTmFtZVNl
dCA9IDEgPDwgMiwKICAgICAgICBWZXJzaW9uU2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxk
c1NldCA9IChJZFNldCB8IERvbWFpblNldCB8IE5hbWVTZXQgfCBWZXJzaW9uU2V0KQogICAgfTsK
CiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6
CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBs
YXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNU
RVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RGF0YWJh
c2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5v
RmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAg
ICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIERhdGFiYXNl
OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSWRTZXQ+JiBzZXRJZChjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIElkU2V0KSwgcHJvcGVydHlfaWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEb21haW5TZXQ+
JiBzZXREb21haW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEb21haW5TZXQpLCBwcm9wZXJ0eV9kb21haW5fYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJkb21haW4iLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RG9tYWluU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNl
dCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVmVyc2lvblNldD4mIHNl
dFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBWZXJzaW9uU2V0KSwgcHJvcGVydHlfdmVyc2lvbl9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZlcnNpb24iLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmVyc2lvblNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFJlZlB0cjxEYXRhYmFzZT4mICgpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPERhdGFiYXNl
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPERh
dGFiYXNlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxEYXRhYmFzZT4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxEYXRhYmFzZT4gcmVzdWx0ID0gRGF0YWJhc2U6OmNyZWF0ZSgp
CiAgICAgKiAgICAgLnNldElkKC4uLikKICAgICAqICAgICAuc2V0RG9tYWluKC4uLikKICAgICAq
ICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFZlcnNpb24oLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBEYXRhYmFzZSgpKSk7CiAgICB9
Cn07Cgp9IC8vIERhdGFiYXNlCgojZW5kaWYgLy8gRU5BQkxFKFNRTF9EQVRBQkFTRSkKI2lmIEVO
QUJMRShJTkRFWEVEX0RBVEFCQVNFKQpuYW1lc3BhY2UgSW5kZXhlZERCIHsKLyogU2VjdXJpdHkg
b3JpZ2luIHdpdGggZGF0YWJhc2UgbmFtZXMuICovCmNsYXNzIFNlY3VyaXR5T3JpZ2luV2l0aERh
dGFiYXNlTmFtZXMgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFt
ZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnZGF0YWJhc2VOYW1lcycgd2hpbGUgZ2VuZXJhdGluZyBT
ZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzLgogICAgY2xhc3MgRGF0YWJhc2VOYW1lcyA6
IHB1YmxpYyBJbnNwZWN0b3JBcnJheSB7CiAgICBwcml2YXRlOgogICAgICAgIERhdGFiYXNlTmFt
ZXMoKSB7IH0KCiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBhZGRJdGVtKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLT5wdXNoU3RyaW5nKHZhbHVlKTsKICAg
ICAgICB9CgogICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPERhdGFiYXNlTmFtZXM+IGNyZWF0ZSgp
IHsKICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBEYXRhYmFzZU5hbWVzKCkpOwogICAg
ICAgIH0KICAgIH07CgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAg
IFNlY3VyaXR5T3JpZ2luU2V0ID0gMSA8PCAwLAogICAgICAgIERhdGFiYXNlTmFtZXNTZXQgPSAx
IDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFNlY3VyaXR5T3JpZ2luU2V0IHwgRGF0YWJh
c2VOYW1lc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPFNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXM+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNlY3VyaXR5T3JpZ2luV2l0aERhdGFi
YXNlTmFtZXM7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZWN1cml0eU9y
aWdpblNldD4mIHNldFNlY3VyaXR5T3JpZ2luKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2VjdXJpdHlPcmlnaW5TZXQp
LCBwcm9wZXJ0eV9zZWN1cml0eU9yaWdpbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoInNlY3VyaXR5T3JpZ2luIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFNlY3VyaXR5T3JpZ2luU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IERhdGFiYXNlTmFtZXNTZXQ+JiBzZXREYXRhYmFzZU5hbWVzKC8qUGFzc1Jl
ZlB0cjxEYXRhYmFzZU5hbWVzPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIERhdGFiYXNlTmFt
ZXNTZXQpLCBwcm9wZXJ0eV9kYXRhYmFzZU5hbWVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldEFycmF5KCJkYXRhYmFzZU5hbWVzIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPERhdGFiYXNlTmFtZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBSZWZQdHI8U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4mICgpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJl
c3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
UmVmUHRyPFNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXM+Kj4oJm1fcmVzdWx0KTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U2VjdXJpdHlPcmlnaW5XaXRoRGF0
YWJhc2VOYW1lcz4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8U2VjdXJp
dHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWN1cml0eU9y
aWdpbldpdGhEYXRhYmFzZU5hbWVzPiByZXN1bHQgPSBTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFz
ZU5hbWVzOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTZWN1cml0eU9yaWdpbiguLi4pCiAgICAg
KiAgICAgLnNldERhdGFiYXNlTmFtZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+KGFkb3B0UmVmKG5ldyBTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzKCkpKTsK
ICAgIH0KfTsKCi8qIERhdGFiYXNlIHdpdGggYW4gYXJyYXkgb2Ygb2JqZWN0IHN0b3Jlcy4gKi8K
Y2xhc3MgRGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ29iamVjdFN0b3Jlcycg
d2hpbGUgZ2VuZXJhdGluZyBEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXMuCiAgICBjbGFzcyBPYmpl
Y3RTdG9yZXMgOiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgcHJpdmF0ZToKICAgICAgICBP
YmplY3RTdG9yZXMoKSB7IH0KCiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBhZGRJdGVtKC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6SW5kZXhlZERCOjpPYmplY3RTdG9yZT4qLyBQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLT5wdXNo
T2JqZWN0KHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPE9iamVj
dFN0b3Jlcz4gY3JlYXRlKCkgewogICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IE9iamVj
dFN0b3JlcygpKTsKICAgICAgICB9CiAgICB9OwoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRz
U2V0ID0gMCwKICAgICAgICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFZlcnNpb25TZXQgPSAx
IDw8IDEsCiAgICAgICAgT2JqZWN0U3RvcmVzU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxk
c1NldCA9IChOYW1lU2V0IHwgVmVyc2lvblNldCB8IE9iamVjdFN0b3Jlc1NldCkKICAgIH07Cgog
ICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0
ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
Pio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPERhdGFiYXNl
V2l0aE9iamVjdFN0b3Jlcz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0
ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQg
Y2xhc3MgRGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzOwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgTmFtZVNldD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVy
dHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5h
bWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWZXJzaW9uU2V0PiYgc2V0VmVyc2lvbihj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFZlcnNpb25TZXQpLCBwcm9wZXJ0eV92ZXJzaW9uX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidmVyc2lvbiIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxWZXJzaW9uU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE9iamVjdFN0b3Jlc1NldD4mIHNldE9iamVjdFN0b3JlcygvKlBhc3NSZWZQ
dHI8T2JqZWN0U3RvcmVzPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE9iamVjdFN0b3Jlc1Nl
dCksIHByb3BlcnR5X29iamVjdFN0b3Jlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRBcnJheSgib2JqZWN0U3RvcmVzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPE9iamVjdFN0b3Jlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFJlZlB0cjxEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+JiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3Jl
YWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxEYXRhYmFz
ZVdpdGhPYmplY3RTdG9yZXM+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFBhc3NSZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+KCp0aGlzKTsK
ICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAg
ICAgKiBSZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzPiByZXN1bHQgPSBEYXRhYmFzZVdp
dGhPYmplY3RTdG9yZXM6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldE5hbWUoLi4uKQogICAgICog
ICAgIC5zZXRWZXJzaW9uKC4uLikKICAgICAqICAgICAuc2V0T2JqZWN0U3RvcmVzKC4uLik7CiAg
ICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAg
ICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRGF0YWJhc2VXaXRo
T2JqZWN0U3RvcmVzKCkpKTsKICAgIH0KfTsKCi8qIE9iamVjdCBzdG9yZS4gKi8KY2xhc3MgT2Jq
ZWN0U3RvcmUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQg
YWZ0ZXIgcHJvcGVydHkgbmFtZSAnaW5kZXhlcycgd2hpbGUgZ2VuZXJhdGluZyBPYmplY3RTdG9y
ZS4KICAgIGNsYXNzIEluZGV4ZXMgOiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgcHJpdmF0
ZToKICAgICAgICBJbmRleGVzKCkgeyB9CgogICAgcHVibGljOgogICAgICAgIHZvaWQgYWRkSXRl
bSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkluZGV4ZWREQjo6T2JqZWN0U3RvcmVJbmRleD4q
LyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICB0aGlzLT5wdXNoT2JqZWN0KHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBQYXNz
UmVmUHRyPEluZGV4ZXM+IGNyZWF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBJbmRleGVzKCkpOwogICAgICAgIH0KICAgIH07CgogICAgZW51bSB7CiAgICAgICAgTm9GaWVs
ZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgS2V5UGF0aFNldCA9
IDEgPDwgMSwKICAgICAgICBJbmRleGVzU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1Nl
dCA9IChOYW1lU2V0IHwgS2V5UGF0aFNldCB8IEluZGV4ZXNTZXQpCiAgICB9OwoKICAgIHRlbXBs
YXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNU
RVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlz
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxPYmplY3RTdG9yZT4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgT2JqZWN0U3RvcmU7CiAg
ICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEtl
eVBhdGhTZXQ+JiBzZXRLZXlQYXRoKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgS2V5UGF0aFNldCksIHByb3BlcnR5X2tl
eVBhdGhfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJrZXlQ
YXRoIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEtleVBhdGhTZXQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSW5kZXhlc1NldD4mIHNldEluZGV4
ZXMoLypQYXNzUmVmUHRyPEluZGV4ZXM+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSW5kZXhl
c1NldCksIHByb3BlcnR5X2luZGV4ZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0QXJyYXkoImluZGV4ZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8SW5kZXhlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxPYmpl
Y3RTdG9yZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPE9iamVjdFN0b3JlPio+KCZtX3Jlc3VsdCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPE9iamVjdFN0b3JlPiAoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxPYmplY3RTdG9yZT4oKnRoaXMpOwogICAgICAg
IH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJl
ZlB0cjxPYmplY3RTdG9yZT4gcmVzdWx0ID0gT2JqZWN0U3RvcmU6OmNyZWF0ZSgpCiAgICAgKiAg
ICAgLnNldE5hbWUoLi4uKQogICAgICogICAgIC5zZXRLZXlQYXRoKC4uLikKICAgICAqICAgICAu
c2V0SW5kZXhlcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4g
Y3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRS
ZWYobmV3IE9iamVjdFN0b3JlKCkpKTsKICAgIH0KfTsKCi8qIE9iamVjdCBzdG9yZSBpbmRleC4g
Ki8KY2xhc3MgT2JqZWN0U3RvcmVJbmRleCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJs
aWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9
IDEgPDwgMCwKICAgICAgICBLZXlQYXRoU2V0ID0gMSA8PCAxLAogICAgICAgIFVuaXF1ZVNldCA9
IDEgPDwgMiwKICAgICAgICBNdWx0aUVudHJ5U2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxk
c1NldCA9IChOYW1lU2V0IHwgS2V5UGF0aFNldCB8IFVuaXF1ZVNldCB8IE11bHRpRW50cnlTZXQp
CiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAg
cHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAg
ICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNU
QVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0
cjxPYmplY3RTdG9yZUluZGV4PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0
YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVu
ZCBjbGFzcyBPYmplY3RTdG9yZUluZGV4OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgTmFtZVNldD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFt
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBLZXlQYXRoU2V0PiYgc2V0S2V5UGF0aChjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIEtleVBhdGhTZXQpLCBwcm9wZXJ0eV9rZXlQYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygia2V5UGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxLZXlQYXRoU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IFVuaXF1ZVNldD4mIHNldFVuaXF1ZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVuaXF1ZVNldCksIHByb3BlcnR5X3VuaXF1
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJ1bmlxdWUi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VW5pcXVlU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE11bHRpRW50cnlTZXQ+JiBzZXRNdWx0aUVu
dHJ5KGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgTXVsdGlFbnRyeVNldCksIHByb3BlcnR5X211bHRpRW50cnlfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigibXVsdGlFbnRyeSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNdWx0aUVudHJ5U2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPE9iamVjdFN0b3JlSW5kZXg+JiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNf
bm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxP
YmplY3RTdG9yZUluZGV4Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBQYXNzUmVmUHRyPE9iamVjdFN0b3JlSW5kZXg+ICgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gUmVmUHRyPE9iamVjdFN0b3JlSW5kZXg+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8T2JqZWN0
U3RvcmVJbmRleD4gcmVzdWx0ID0gT2JqZWN0U3RvcmVJbmRleDo6Y3JlYXRlKCkKICAgICAqICAg
ICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldEtleVBhdGgoLi4uKQogICAgICogICAgIC5z
ZXRVbmlxdWUoLi4uKQogICAgICogICAgIC5zZXRNdWx0aUVudHJ5KC4uLik7CiAgICAgKi8KICAg
IHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVy
biBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVJbmRleCgpKSk7
CiAgICB9Cn07Cgp9IC8vIEluZGV4ZWREQgoKI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFC
QVNFKQpuYW1lc3BhY2UgRE9NU3RvcmFnZSB7Ci8qIERPTSBTdG9yYWdlIGVudHJ5LiAqLwpjbGFz
cyBFbnRyeSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAg
ICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgSG9zdFNldCA9IDEgPDwgMCwKICAgICAgICBJ
c0xvY2FsU3RvcmFnZVNldCA9IDEgPDwgMSwKICAgICAgICBJZFNldCA9IDEgPDwgMiwKICAgICAg
ICBBbGxGaWVsZHNTZXQgPSAoSG9zdFNldCB8IElzTG9jYWxTdG9yYWdlU2V0IHwgSWRTZXQpCiAg
ICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJp
dmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAg
dGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRF
IHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxF
bnRyeT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
Tm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAg
ICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRW50cnk7
CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIb3N0U2V0PiYgc2V0SG9zdChj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIEhvc3RTZXQpLCBwcm9wZXJ0eV9ob3N0X2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygiaG9zdCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxIb3N0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IElzTG9jYWxTdG9yYWdlU2V0PiYgc2V0SXNMb2NhbFN0b3JhZ2UoYm9vbCB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBJc0xvY2FsU3RvcmFnZVNl
dCksIHByb3BlcnR5X2lzTG9jYWxTdG9yYWdlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldEJvb2xlYW4oImlzTG9jYWxTdG9yYWdlIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPElzTG9jYWxTdG9yYWdlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IElkU2V0PiYgc2V0SWQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIElkU2V0KSwgcHJvcGVydHlfaWRfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJpZCIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJZFNldD4oKTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFJlZlB0cjxFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEVudHJ5Pio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEVudHJ5PiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxFbnRyeT4oKnRoaXMpOwogICAgICAgIH0K
ICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0
cjxFbnRyeT4gcmVzdWx0ID0gRW50cnk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldEhvc3QoLi4u
KQogICAgICogICAgIC5zZXRJc0xvY2FsU3RvcmFnZSguLi4pCiAgICAgKiAgICAgLnNldElkKC4u
Lik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAg
ewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRW50cnko
KSkpOwogICAgfQp9OwoKfSAvLyBET01TdG9yYWdlCgpuYW1lc3BhY2UgQXBwbGljYXRpb25DYWNo
ZSB7Ci8qIERldGFpbGVkIGFwcGxpY2F0aW9uIGNhY2hlIHJlc291cmNlIGluZm9ybWF0aW9uLiAq
LwpjbGFzcyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFVy
bFNldCA9IDEgPDwgMCwKICAgICAgICBTaXplU2V0ID0gMSA8PCAxLAogICAgICAgIFR5cGVTZXQg
PSAxIDw8IDIsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFVybFNldCB8IFNpemVTZXQgfCBUeXBl
U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsK
ICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7Cgog
ICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0
ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRl
cjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NS
ZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPiBwdHIpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2lu
X25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQog
ICAgICAgIGZyaWVuZCBjbGFzcyBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U7CiAgICBwdWJsaWM6
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxT
ZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXJsU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNpemVTZXQ+JiBzZXRTaXpl
KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBTaXplU2V0KSwgcHJvcGVydHlfc2l6ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXROdW1iZXIoInNpemUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8U2l6ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0
PiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4mICgpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19u
b3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEFw
cGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+ICgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4oKnRo
aXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3Rv
cjoKICAgICAqIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+IHJlc3VsdCA9IEFwcGxp
Y2F0aW9uQ2FjaGVSZXNvdXJjZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAg
ICAqICAgICAuc2V0U2l6ZSguLi4pCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBBcHBsaWNhdGlvbkNhY2hlUmVz
b3VyY2UoKSkpOwogICAgfQp9OwoKLyogRGV0YWlsZWQgYXBwbGljYXRpb24gY2FjaGUgaW5mb3Jt
YXRpb24uICovCmNsYXNzIEFwcGxpY2F0aW9uQ2FjaGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAncmVzb3VyY2VzJyB3
aGlsZSBnZW5lcmF0aW5nIEFwcGxpY2F0aW9uQ2FjaGUuCiAgICBjbGFzcyBSZXNvdXJjZXMgOiBw
dWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgcHJpdmF0ZToKICAgICAgICBSZXNvdXJjZXMoKSB7
IH0KCiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBhZGRJdGVtKC8qUGFzc1JlZlB0cjxUeXBlQnVp
bGRlcjo6QXBwbGljYXRpb25DYWNoZTo6QXBwbGljYXRpb25DYWNoZVJlc291cmNlPiovIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMt
PnB1c2hPYmplY3QodmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8
UmVzb3VyY2VzPiBjcmVhdGUoKSB7CiAgICAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVz
b3VyY2VzKCkpOwogICAgICAgIH0KICAgIH07CgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNT
ZXQgPSAwLAogICAgICAgIE1hbmlmZXN0VVJMU2V0ID0gMSA8PCAwLAogICAgICAgIFNpemVTZXQg
PSAxIDw8IDEsCiAgICAgICAgQ3JlYXRpb25UaW1lU2V0ID0gMSA8PCAyLAogICAgICAgIFVwZGF0
ZVRpbWVTZXQgPSAxIDw8IDMsCiAgICAgICAgUmVzb3VyY2VzU2V0ID0gMSA8PCA0LAogICAgICAg
IEFsbEZpZWxkc1NldCA9IChNYW5pZmVzdFVSTFNldCB8IFNpemVTZXQgfCBDcmVhdGlvblRpbWVT
ZXQgfCBVcGRhdGVUaW1lU2V0IHwgUmVzb3VyY2VzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxp
bnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBC
dWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQXBwbGljYXRpb25DYWNo
ZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE1hbmlmZXN0VVJMU2V0PiYg
c2V0TWFuaWZlc3RVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYW5pZmVzdFVSTFNldCksIHByb3BlcnR5X21hbmlm
ZXN0VVJMX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibWFu
aWZlc3RVUkwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWFuaWZlc3RV
UkxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2l6ZVNldD4mIHNl
dFNpemUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFNpemVTZXQpLCBwcm9wZXJ0eV9zaXplX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxTaXplU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IENyZWF0aW9uVGltZVNldD4mIHNldENyZWF0aW9uVGltZShkb3VibGUgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ3JlYXRpb25UaW1lU2V0KSwg
cHJvcGVydHlfY3JlYXRpb25UaW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldE51bWJlcigiY3JlYXRpb25UaW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPENyZWF0aW9uVGltZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBVcGRhdGVUaW1lU2V0PiYgc2V0VXBkYXRlVGltZShkb3VibGUgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXBkYXRlVGltZVNldCksIHBy
b3BlcnR5X3VwZGF0ZVRpbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
TnVtYmVyKCJ1cGRhdGVUaW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFVwZGF0ZVRpbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUmVz
b3VyY2VzU2V0PiYgc2V0UmVzb3VyY2VzKC8qUGFzc1JlZlB0cjxSZXNvdXJjZXM+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgUmVzb3VyY2VzU2V0KSwgcHJvcGVydHlfcmVzb3VyY2VzX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJyZXNvdXJjZXMiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UmVzb3VyY2VzU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGU+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1
bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJl
ZlB0cjxBcHBsaWNhdGlvbkNhY2hlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGU+ICgpCiAgICAgICAgewogICAgICAg
ICAgICByZXR1cm4gUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGU+KCp0aGlzKTsKICAgICAgICB9CiAg
ICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8
QXBwbGljYXRpb25DYWNoZT4gcmVzdWx0ID0gQXBwbGljYXRpb25DYWNoZTo6Y3JlYXRlKCkKICAg
ICAqICAgICAuc2V0TWFuaWZlc3RVUkwoLi4uKQogICAgICogICAgIC5zZXRTaXplKC4uLikKICAg
ICAqICAgICAuc2V0Q3JlYXRpb25UaW1lKC4uLikKICAgICAqICAgICAuc2V0VXBkYXRlVGltZSgu
Li4pCiAgICAgKiAgICAgLnNldFJlc291cmNlcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVp
bGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
b0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEFwcGxpY2F0aW9uQ2FjaGUoKSkpOwogICAgfQp9OwoK
LyogRnJhbWUgaWRlbnRpZmllciAtIG1hbmlmZXN0IFVSTCBwYWlyLiAqLwpjbGFzcyBGcmFtZVdp
dGhNYW5pZmVzdCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgRnJhbWVJZFNldCA9IDEgPDwgMCwKICAg
ICAgICBNYW5pZmVzdFVSTFNldCA9IDEgPDwgMSwKICAgICAgICBTdGF0dXNTZXQgPSAxIDw8IDIs
CiAgICAgICAgQWxsRmllbGRzU2V0ID0gKEZyYW1lSWRTZXQgfCBNYW5pZmVzdFVSTFNldCB8IFN0
YXR1c1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBGcmFtZVdpdGhNYW5pZmVzdDsKICAgIHB1YmxpYzoKCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IEZyYW1lSWRTZXQ+JiBzZXRGcmFtZUlkKC8qY29uc3QgVHlwZUJ1aWxk
ZXI6Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGcmFtZUlkU2V0KSwgcHJvcGVydHlf
ZnJhbWVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZy
YW1lSWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnJhbWVJZFNldD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNYW5pZmVzdFVSTFNldD4mIHNl
dE1hbmlmZXN0VVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgTWFuaWZlc3RVUkxTZXQpLCBwcm9wZXJ0eV9tYW5pZmVz
dFVSTF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1hbmlm
ZXN0VVJMIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE1hbmlmZXN0VVJM
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFN0YXR1c1NldD4mIHNl
dFN0YXR1cyhpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgU3RhdHVzU2V0KSwgcHJvcGVydHlfc3RhdHVzX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic3RhdHVzIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFN0YXR1c1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFJlZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEZyYW1lV2l0aE1hbmlm
ZXN0Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PEZyYW1lV2l0aE1hbmlmZXN0PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0
cjxGcmFtZVdpdGhNYW5pZmVzdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAg
ICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxGcmFtZVdpdGhNYW5pZmVz
dD4gcmVzdWx0ID0gRnJhbWVXaXRoTWFuaWZlc3Q6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldEZy
YW1lSWQoLi4uKQogICAgICogICAgIC5zZXRNYW5pZmVzdFVSTCguLi4pCiAgICAgKiAgICAgLnNl
dFN0YXR1cyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3Jl
YXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYo
bmV3IEZyYW1lV2l0aE1hbmlmZXN0KCkpKTsKICAgIH0KfTsKCn0gLy8gQXBwbGljYXRpb25DYWNo
ZQoKbmFtZXNwYWNlIERPTSB7Ci8qIERPTSBpbnRlcmFjdGlvbiBpcyBpbXBsZW1lbnRlZCBpbiB0
ZXJtcyBvZiBtaXJyb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgYWN0dWFsIERPTSBub2Rl
cy4gRE9NTm9kZSBpcyBhIGJhc2Ugbm9kZSBtaXJyb3IgdHlwZS4gKi8KY2xhc3MgTm9kZSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0
eSBuYW1lICdjaGlsZHJlbicgd2hpbGUgZ2VuZXJhdGluZyBOb2RlLgogICAgY2xhc3MgQ2hpbGRy
ZW4gOiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgcHJpdmF0ZToKICAgICAgICBDaGlsZHJl
bigpIHsgfQoKICAgIHB1YmxpYzoKICAgICAgICB2b2lkIGFkZEl0ZW0oLypQYXNzUmVmUHRyPFR5
cGVCdWlsZGVyOjpET006Ok5vZGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy0+cHVzaE9iamVjdCh2YWx1ZSk7CiAgICAgICAg
fQoKICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxDaGlsZHJlbj4gY3JlYXRlKCkgewogICAgICAg
ICAgICByZXR1cm4gYWRvcHRSZWYobmV3IENoaWxkcmVuKCkpOwogICAgICAgIH0KICAgIH07Cgog
ICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnYXR0cmlidXRlcycgd2hpbGUgZ2VuZXJh
dGluZyBOb2RlLgogICAgY2xhc3MgQXR0cmlidXRlcyA6IHB1YmxpYyBJbnNwZWN0b3JBcnJheSB7
CiAgICBwcml2YXRlOgogICAgICAgIEF0dHJpYnV0ZXMoKSB7IH0KCiAgICBwdWJsaWM6CiAgICAg
ICAgdm9pZCBhZGRJdGVtKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICB0aGlzLT5wdXNoU3RyaW5nKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBQYXNz
UmVmUHRyPEF0dHJpYnV0ZXM+IGNyZWF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVm
KG5ldyBBdHRyaWJ1dGVzKCkpOwogICAgICAgIH0KICAgIH07CgogICAgZW51bSB7CiAgICAgICAg
Tm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5vZGVJZFNldCA9IDEgPDwgMCwKICAgICAgICBOb2Rl
VHlwZVNldCA9IDEgPDwgMSwKICAgICAgICBOb2RlTmFtZVNldCA9IDEgPDwgMiwKICAgICAgICBM
b2NhbE5hbWVTZXQgPSAxIDw8IDMsCiAgICAgICAgTm9kZVZhbHVlU2V0ID0gMSA8PCA0LAogICAg
ICAgIEFsbEZpZWxkc1NldCA9IChOb2RlSWRTZXQgfCBOb2RlVHlwZVNldCB8IE5vZGVOYW1lU2V0
IHwgTG9jYWxOYW1lU2V0IHwgTm9kZVZhbHVlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQg
U1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWls
ZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Tm9kZT4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3Jl
YXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAg
ICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgTm9kZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE5vZGVJZFNldD4mIHNldE5vZGVJZChpbnQgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZUlkU2V0KSwgcHJvcGVydHlf
bm9kZUlkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibm9k
ZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5vZGVJZFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOb2RlVHlwZVNldD4mIHNldE5vZGVU
eXBlKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBOb2RlVHlwZVNldCksIHByb3BlcnR5X25vZGVUeXBlX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibm9kZVR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8Tm9kZVR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgTm9kZU5hbWVTZXQ+JiBzZXROb2RlTmFtZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5vZGVOYW1l
U2V0KSwgcHJvcGVydHlfbm9kZU5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJub2RlTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxOb2RlTmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBM
b2NhbE5hbWVTZXQ+JiBzZXRMb2NhbE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMb2NhbE5hbWVTZXQpLCBwcm9w
ZXJ0eV9sb2NhbE5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJsb2NhbE5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TG9j
YWxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5vZGVWYWx1
ZVNldD4mIHNldE5vZGVWYWx1ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5vZGVWYWx1ZVNldCksIHByb3BlcnR5X25v
ZGVWYWx1ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5v
ZGVWYWx1ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlVmFsdWVT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Tm9kZT4mICgpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJl
c3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
UmVmUHRyPE5vZGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBh
c3NSZWZQdHI8Tm9kZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Tm9k
ZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxOb2RlPiByZXN1bHQgPSBOb2RlOjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXROb2RlSWQoLi4uKQogICAgICogICAgIC5zZXROb2RlVHlwZSguLi4pCiAgICAg
KiAgICAgLnNldE5vZGVOYW1lKC4uLikKICAgICAqICAgICAuc2V0TG9jYWxOYW1lKC4uLikKICAg
ICAqICAgICAuc2V0Tm9kZVZhbHVlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5v
RmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgTm9kZSgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRDaGlsZE5vZGVD
b3VudChpbnQgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJjaGlsZE5vZGVD
b3VudCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldENoaWxkcmVuKC8qUGFzc1JlZlB0cjxD
aGlsZHJlbj4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRBcnJheSgiY2hpbGRyZW4iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRB
dHRyaWJ1dGVzKC8qUGFzc1JlZlB0cjxBdHRyaWJ1dGVzPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJhdHRyaWJ1dGVzIiwg
dmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0RG9jdW1lbnRVUkwoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImRvY3VtZW50VVJMIiwgdmFsdWUpOwog
ICAgfQoKICAgIHZvaWQgc2V0UHVibGljSWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXRTdHJpbmcoInB1YmxpY0lkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQg
c2V0U3lzdGVtSWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRT
dHJpbmcoInN5c3RlbUlkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0SW50ZXJuYWxTdWJz
ZXQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImlu
dGVybmFsU3Vic2V0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0WG1sVmVyc2lvbihjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygieG1sVmVyc2lv
biIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICB9CgogICAg
dm9pZCBzZXRWYWx1ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICB9CiAgICB1c2luZyBJbnNwZWN0b3JPYmplY3Q6
OnNldFZhbHVlOwoKCiAgICB2b2lkIHNldENvbnRlbnREb2N1bWVudCgvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6OkRPTTo6Tm9kZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJjb250ZW50RG9jdW1lbnQiLCB2YWx1ZSk7
CiAgICB9Cn07CgovKiBET00gaW50ZXJhY3Rpb24gaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Yg
bWlycm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIGFjdHVhbCBET00gbm9kZXMuIERPTU5v
ZGUgaXMgYSBiYXNlIG5vZGUgbWlycm9yIHR5cGUuICovCmNsYXNzIEV2ZW50TGlzdGVuZXIgOiBw
dWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVs
ZHNTZXQgPSAwLAogICAgICAgIFR5cGVTZXQgPSAxIDw8IDAsCiAgICAgICAgVXNlQ2FwdHVyZVNl
dCA9IDEgPDwgMSwKICAgICAgICBJc0F0dHJpYnV0ZVNldCA9IDEgPDwgMiwKICAgICAgICBOb2Rl
SWRTZXQgPSAxIDw8IDMsCiAgICAgICAgSGFuZGxlckJvZHlTZXQgPSAxIDw8IDQsCiAgICAgICAg
QWxsRmllbGRzU2V0ID0gKFR5cGVTZXQgfCBVc2VDYXB0dXJlU2V0IHwgSXNBdHRyaWJ1dGVTZXQg
fCBOb2RlSWRTZXQgfCBIYW5kbGVyQm9keVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNU
QVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRl
cjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEV2ZW50TGlzdGVuZXI+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEV2ZW50TGlzdGVuZXI7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVzZUNhcHR1
cmVTZXQ+JiBzZXRVc2VDYXB0dXJlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXNlQ2FwdHVyZVNldCksIHByb3BlcnR5X3VzZUNhcHR1
cmVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigidXNlQ2Fw
dHVyZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVc2VDYXB0dXJlU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IElzQXR0cmlidXRlU2V0PiYg
c2V0SXNBdHRyaWJ1dGUoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBJc0F0dHJpYnV0ZVNldCksIHByb3BlcnR5X2lzQXR0cmlidXRlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImlzQXR0cmlidXRl
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPElzQXR0cmlidXRlU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5vZGVJZFNldD4mIHNldE5vZGVJ
ZChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgTm9kZUlkU2V0KSwgcHJvcGVydHlfbm9kZUlkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldE51bWJlcigibm9kZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPE5vZGVJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBIYW5kbGVyQm9keVNldD4mIHNldEhhbmRsZXJCb2R5KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSGFuZGxlckJvZHlT
ZXQpLCBwcm9wZXJ0eV9oYW5kbGVyQm9keV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoImhhbmRsZXJCb2R5IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPEhhbmRsZXJCb2R5U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UmVmUHRyPEV2ZW50TGlzdGVuZXI+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxFdmVudExpc3RlbmVyPio+KCZt
X3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEV2ZW50TGlz
dGVuZXI+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEV2ZW50TGlzdGVu
ZXI+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29u
c3RydWN0b3I6CiAgICAgKiBSZWZQdHI8RXZlbnRMaXN0ZW5lcj4gcmVzdWx0ID0gRXZlbnRMaXN0
ZW5lcjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VHlwZSguLi4pCiAgICAgKiAgICAgLnNldFVz
ZUNhcHR1cmUoLi4uKQogICAgICogICAgIC5zZXRJc0F0dHJpYnV0ZSguLi4pCiAgICAgKiAgICAg
LnNldE5vZGVJZCguLi4pCiAgICAgKiAgICAgLnNldEhhbmRsZXJCb2R5KC4uLik7CiAgICAgKi8K
ICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRXZlbnRMaXN0ZW5lcigpKSk7
CiAgICB9CgogICAgdm9pZCBzZXRMb2NhdGlvbigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRl
YnVnZ2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJsb2NhdGlvbiIsIHZhbHVlKTsKICAgIH0KfTsK
Ci8qIEEgc3RydWN0dXJlIGhvbGRpbmcgYW4gUkdCQSBjb2xvci4gKi8KLy8gVHlwZSBvcmlnaW5h
bGx5IHdhcyBuYW1lZCAnUkdCQScuCmNsYXNzIFJnYmEgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFJT
ZXQgPSAxIDw8IDAsCiAgICAgICAgR1NldCA9IDEgPDwgMSwKICAgICAgICBCU2V0ID0gMSA8PCAy
LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChSU2V0IHwgR1NldCB8IEJTZXQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZ2JhPiBwdHIp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1Nl
dCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1
bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZ2JhOwogICAgcHVibGlj
OgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUlNldD4mIHNldFIoaW50IHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJTZXQpLCBwcm9wZXJ0eV9y
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiciIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IEdTZXQ+JiBzZXRHKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBHU2V0KSwgcHJvcGVydHlfZ19hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImciLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8R1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBCU2V0PiYgc2V0QihpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgQlNldCksIHByb3BlcnR5X2JfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJiIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPEJTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8UmdiYT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJnYmE+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmdiYT4gKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiBSZWZQdHI8UmdiYT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAg
ICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxSZ2JhPiByZXN1bHQgPSBS
Z2JhOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRSKC4uLikKICAgICAqICAgICAuc2V0RyguLi4p
CiAgICAgKiAgICAgLnNldEIoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
KGFkb3B0UmVmKG5ldyBSZ2JhKCkpKTsKICAgIH0KCiAgICB2b2lkIHNldEEoZG91YmxlIHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigiYSIsIHZhbHVlKTsKICAgIH0KfTsKCi8q
IENvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIGhpZ2hsaWdodGluZyBvZiBwYWdlIGVsZW1lbnRz
LiAqLwpjbGFzcyBIaWdobGlnaHRDb25maWcgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVi
bGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIEFsbEZpZWxk
c1NldCA9IDAKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPEhpZ2hsaWdodENvbmZpZz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgSGlnaGxpZ2h0Q29uZmlnOwogICAgcHVibGljOgoKICAgICAgICBvcGVy
YXRvciBSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8SGlnaGxpZ2h0Q29u
ZmlnPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PEhpZ2hsaWdodENvbmZpZz4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
SGlnaGxpZ2h0Q29uZmlnPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEhpZ2hsaWdodENvbmZpZz4gcmVz
dWx0ID0gSGlnaGxpZ2h0Q29uZmlnOjpjcmVhdGUoKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBIaWdobGlnaHRDb25maWcoKSkpOwogICAgfQoKICAgIHZv
aWQgc2V0U2hvd0luZm8oYm9vbCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRCb29sZWFu
KCJzaG93SW5mbyIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldENvbnRlbnRDb2xvcigvKlBh
c3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRPTTo6UmdiYT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJjb250ZW50Q29sb3Ii
LCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRQYWRkaW5nQ29sb3IoLypQYXNzUmVmUHRyPFR5
cGVCdWlsZGVyOjpET006OlJnYmE+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicGFkZGluZ0NvbG9yIiwgdmFsdWUpOwog
ICAgfQoKICAgIHZvaWQgc2V0Qm9yZGVyQ29sb3IoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpE
T006OlJnYmE+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAg
ICAgIHRoaXMtPnNldE9iamVjdCgiYm9yZGVyQ29sb3IiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9p
ZCBzZXRNYXJnaW5Db2xvcigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRPTTo6UmdiYT4qLyBQ
YXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
T2JqZWN0KCJtYXJnaW5Db2xvciIsIHZhbHVlKTsKICAgIH0KfTsKCn0gLy8gRE9NCgpuYW1lc3Bh
Y2UgQ1NTIHsKLyogVGhpcyBvYmplY3QgaWRlbnRpZmllcyBhIENTUyBzdHlsZSBpbiBhIHVuaXF1
ZSB3YXkuICovCmNsYXNzIENTU1N0eWxlSWQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVi
bGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFN0eWxlU2hl
ZXRJZFNldCA9IDEgPDwgMCwKICAgICAgICBPcmRpbmFsU2V0ID0gMSA8PCAxLAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChTdHlsZVNoZWV0SWRTZXQgfCBPcmRpbmFsU2V0KQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVJZD4g
cHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVs
ZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGVJZDsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFN0eWxlU2hlZXRJZFNldD4mIHNl
dFN0eWxlU2hlZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxlU2hlZXRJZFNldCksIHByb3BlcnR5X3N0eWxl
U2hlZXRJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0
eWxlU2hlZXRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdHlsZVNo
ZWV0SWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgT3JkaW5hbFNl
dD4mIHNldE9yZGluYWwoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE9yZGluYWxTZXQpLCBwcm9wZXJ0eV9vcmRpbmFsX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigib3JkaW5hbCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPcmRpbmFsU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlSWQ+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NTdHlsZUlk
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENT
U1N0eWxlSWQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1N0eWxl
SWQ+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29u
c3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTU3R5bGVJZD4gcmVzdWx0ID0gQ1NTU3R5bGVJZDo6
Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3R5bGVTaGVldElkKC4uLikKICAgICAqICAgICAuc2V0
T3JkaW5hbCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3Jl
YXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYo
bmV3IENTU1N0eWxlSWQoKSkpOwogICAgfQp9OwoKLyogVGhpcyBvYmplY3QgaWRlbnRpZmllcyBh
IENTUyBydWxlIGluIGEgdW5pcXVlIHdheS4gKi8KY2xhc3MgQ1NTUnVsZUlkIDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0g
MCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgT3JkaW5hbFNldCA9
IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU3R5bGVTaGVldElkU2V0IHwgT3JkaW5h
bFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPENTU1J1bGVJZD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0
ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQg
Y2xhc3MgQ1NTUnVsZUlkOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5
bGVTaGVldElkU2V0PiYgc2V0U3R5bGVTaGVldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3R5bGVTaGVldElkU2V0
KSwgcHJvcGVydHlfc3R5bGVTaGVldElkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygic3R5bGVTaGVldElkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPFN0eWxlU2hlZXRJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBPcmRpbmFsU2V0PiYgc2V0T3JkaW5hbChpbnQgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgT3JkaW5hbFNldCksIHByb3BlcnR5X29y
ZGluYWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJvcmRp
bmFsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE9yZGluYWxTZXQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTUnVsZUlkPiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8Q1NTUnVsZUlkPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBQYXNzUmVmUHRyPENTU1J1bGVJZD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBS
ZWZQdHI8Q1NTUnVsZUlkPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1J1bGVJZD4gcmVzdWx0ID0g
Q1NTUnVsZUlkOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdHlsZVNoZWV0SWQoLi4uKQogICAg
ICogICAgIC5zZXRPcmRpbmFsKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmll
bGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0
PihhZG9wdFJlZihuZXcgQ1NTUnVsZUlkKCkpKTsKICAgIH0KfTsKCi8qIENTUyBydWxlIGNvbGxl
Y3Rpb24gZm9yIGEgc2luZ2xlIHBzZXVkbyBzdHlsZS4gKi8KY2xhc3MgUHNldWRvSWRSdWxlcyA6
IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9w
ZXJ0eSBuYW1lICdydWxlcycgd2hpbGUgZ2VuZXJhdGluZyBQc2V1ZG9JZFJ1bGVzLgogICAgY2xh
c3MgUnVsZXMgOiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgcHJpdmF0ZToKICAgICAgICBS
dWxlcygpIHsgfQoKICAgIHB1YmxpYzoKICAgICAgICB2b2lkIGFkZEl0ZW0oLypQYXNzUmVmUHRy
PFR5cGVCdWlsZGVyOjpDU1M6OkNTU1J1bGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy0+cHVzaE9iamVjdCh2YWx1ZSk7CiAg
ICAgICAgfQoKICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxSdWxlcz4gY3JlYXRlKCkgewogICAg
ICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJ1bGVzKCkpOwogICAgICAgIH0KICAgIH07Cgog
ICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFBzZXVkb0lkU2V0ID0g
MSA8PCAwLAogICAgICAgIFJ1bGVzU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9
IChQc2V1ZG9JZFNldCB8IFJ1bGVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+
CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNU
QVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8UHNldWRvSWRSdWxlcz4gcHRyKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJf
Y3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwog
ICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUHNldWRvSWRSdWxlczsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFBzZXVkb0lkU2V0PiYgc2V0UHNldWRvSWQoaW50IHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFBzZXVk
b0lkU2V0KSwgcHJvcGVydHlfcHNldWRvSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0TnVtYmVyKCJwc2V1ZG9JZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxQc2V1ZG9JZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBSdWxlc1NldD4mIHNldFJ1bGVzKC8qUGFzc1JlZlB0cjxSdWxlcz4qLyBQYXNzUmVmUHRyPElu
c3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBSdWxlc1NldCksIHByb3BlcnR5X3J1bGVzX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJydWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxSdWxlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxQc2V1ZG9JZFJ1bGVzPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAg
ICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UHNldWRvSWRSdWxlcz4qPigmbV9y
ZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxQc2V1ZG9JZFJ1
bGVzPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxQc2V1ZG9JZFJ1bGVz
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPFBzZXVkb0lkUnVsZXM+IHJlc3VsdCA9IFBzZXVkb0lkUnVs
ZXM6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFBzZXVkb0lkKC4uLikKICAgICAqICAgICAuc2V0
UnVsZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0
ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5l
dyBQc2V1ZG9JZFJ1bGVzKCkpKTsKICAgIH0KfTsKCi8qIENTUyBydWxlIGNvbGxlY3Rpb24gZm9y
IGEgc2luZ2xlIHBzZXVkbyBzdHlsZS4gKi8KY2xhc3MgSW5oZXJpdGVkU3R5bGVFbnRyeSA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0
eSBuYW1lICdtYXRjaGVkQ1NTUnVsZXMnIHdoaWxlIGdlbmVyYXRpbmcgSW5oZXJpdGVkU3R5bGVF
bnRyeS4KICAgIGNsYXNzIE1hdGNoZWRDU1NSdWxlcyA6IHB1YmxpYyBJbnNwZWN0b3JBcnJheSB7
CiAgICBwcml2YXRlOgogICAgICAgIE1hdGNoZWRDU1NSdWxlcygpIHsgfQoKICAgIHB1YmxpYzoK
ICAgICAgICB2b2lkIGFkZEl0ZW0oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OkNTU1J1
bGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgdGhpcy0+cHVzaE9iamVjdCh2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMg
UGFzc1JlZlB0cjxNYXRjaGVkQ1NTUnVsZXM+IGNyZWF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBNYXRjaGVkQ1NTUnVsZXMoKSk7CiAgICAgICAgfQogICAgfTsKCiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTWF0Y2hlZENTU1J1bGVzU2V0
ID0gMSA8PCAwLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChNYXRjaGVkQ1NTUnVsZXNTZXQpCiAg
ICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJp
dmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAg
dGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRF
IHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxJ
bmhlcml0ZWRTdHlsZUVudHJ5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0
YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVu
ZCBjbGFzcyBJbmhlcml0ZWRTdHlsZUVudHJ5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgTWF0Y2hlZENTU1J1bGVzU2V0PiYgc2V0TWF0Y2hlZENTU1J1bGVzKC8qUGFzc1Jl
ZlB0cjxNYXRjaGVkQ1NTUnVsZXM+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTWF0Y2hlZENT
U1J1bGVzU2V0KSwgcHJvcGVydHlfbWF0Y2hlZENTU1J1bGVzX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJtYXRjaGVkQ1NTUnVsZXMiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWF0Y2hlZENTU1J1bGVzU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1
bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJl
ZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAg
ICBvcGVyYXRvciBQYXNzUmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+ICgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gUmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+KCp0aGlzKTsKICAg
ICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAg
KiBSZWZQdHI8SW5oZXJpdGVkU3R5bGVFbnRyeT4gcmVzdWx0ID0gSW5oZXJpdGVkU3R5bGVFbnRy
eTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TWF0Y2hlZENTU1J1bGVzKC4uLik7CiAgICAgKi8K
ICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgSW5oZXJpdGVkU3R5bGVFbnRy
eSgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRJbmxpbmVTdHlsZSgvKlBhc3NSZWZQdHI8VHlwZUJ1
aWxkZXI6OkNTUzo6Q1NTU3R5bGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiaW5saW5lU3R5bGUiLCB2YWx1ZSk7CiAg
ICB9Cn07CgovKiBDU1Mgc3R5bGUgaW5mb3JtYXRpb24gZm9yIGEgRE9NIHN0eWxlIGF0dHJpYnV0
ZS4gKi8KY2xhc3MgQ1NTU3R5bGVBdHRyaWJ1dGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5hbWVT
ZXQgPSAxIDw8IDAsCiAgICAgICAgU3R5bGVTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRz
U2V0ID0gKE5hbWVTZXQgfCBTdHlsZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRF
PgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxT
VEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0eWxlQXR0cmlidXRlPiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVp
bGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBw
dHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDU1NTdHlsZUF0dHJpYnV0ZTsKICAg
IHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5
bGVTZXQ+JiBzZXRTdHlsZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTU3R5bGU+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxlU2V0KSwgcHJvcGVydHlfc3R5bGVfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJzdHlsZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdHlsZVNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4mICgpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRy
PENTU1N0eWxlQXR0cmlidXRlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVy
YXRvciBQYXNzUmVmUHRyPENTU1N0eWxlQXR0cmlidXRlPiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4oKnRoaXMpOwogICAgICAgIH0KICAg
IH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxD
U1NTdHlsZUF0dHJpYnV0ZT4gcmVzdWx0ID0gQ1NTU3R5bGVBdHRyaWJ1dGU6OmNyZWF0ZSgpCiAg
ICAgKiAgICAgLnNldE5hbWUoLi4uKQogICAgICogICAgIC5zZXRTdHlsZSguLi4pOwogICAgICov
CiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICBy
ZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENTU1N0eWxlQXR0cmlidXRl
KCkpKTsKICAgIH0KfTsKCi8qIENTUyBzdHlsZXNoZWV0IG1ldGFpbmZvcm1hdGlvbi4gKi8KY2xh
c3MgQ1NTU3R5bGVTaGVldEhlYWRlciA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6
CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU3R5bGVTaGVldElk
U2V0ID0gMSA8PCAwLAogICAgICAgIFNvdXJjZVVSTFNldCA9IDEgPDwgMSwKICAgICAgICBUaXRs
ZVNldCA9IDEgPDwgMiwKICAgICAgICBEaXNhYmxlZFNldCA9IDEgPDwgMywKICAgICAgICBBbGxG
aWVsZHNTZXQgPSAoU3R5bGVTaGVldElkU2V0IHwgU291cmNlVVJMU2V0IHwgVGl0bGVTZXQgfCBE
aXNhYmxlZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+IHB0cikKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRf
aW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9
CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2hlZXRIZWFkZXI7CiAgICBwdWJsaWM6Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTdHlsZVNoZWV0SWRTZXQ+JiBzZXRTdHlsZVNoZWV0SWQo
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBTdHlsZVNoZWV0SWRTZXQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5bGVTaGVldElkU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZVVSTFNldD4mIHNldFNvdXJj
ZVVSTChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFNvdXJjZVVSTFNldCksIHByb3BlcnR5X3NvdXJjZVVSTF9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNvdXJjZVVSTCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VVUkxTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVGl0bGVTZXQ+JiBzZXRUaXRsZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFRpdGxlU2V0KSwgcHJvcGVydHlfdGl0bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJ0aXRsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxUaXRsZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEaXNh
YmxlZFNldD4mIHNldERpc2FibGVkKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgRGlzYWJsZWRTZXQpLCBwcm9wZXJ0eV9kaXNhYmxlZF9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJkaXNhYmxlZCIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxEaXNhYmxlZFNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiAoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+IHJlc3VsdCA9IENTU1N0eWxlU2hl
ZXRIZWFkZXI6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAg
KiAgICAgLnNldFNvdXJjZVVSTCguLi4pCiAgICAgKiAgICAgLnNldFRpdGxlKC4uLikKICAgICAq
ICAgICAuc2V0RGlzYWJsZWQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
KGFkb3B0UmVmKG5ldyBDU1NTdHlsZVNoZWV0SGVhZGVyKCkpKTsKICAgIH0KfTsKCi8qIENTUyBz
dHlsZXNoZWV0IGNvbnRlbnRzLiAqLwpjbGFzcyBDU1NTdHlsZVNoZWV0Qm9keSA6IHB1YmxpYyBJ
bnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1l
ICdydWxlcycgd2hpbGUgZ2VuZXJhdGluZyBDU1NTdHlsZVNoZWV0Qm9keS4KICAgIGNsYXNzIFJ1
bGVzIDogcHVibGljIEluc3BlY3RvckFycmF5IHsKICAgIHByaXZhdGU6CiAgICAgICAgUnVsZXMo
KSB7IH0KCiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBhZGRJdGVtKC8qUGFzc1JlZlB0cjxUeXBl
QnVpbGRlcjo6Q1NTOjpDU1NSdWxlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMtPnB1c2hPYmplY3QodmFsdWUpOwogICAgICAg
IH0KCiAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8UnVsZXM+IGNyZWF0ZSgpIHsKICAgICAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBSdWxlcygpKTsKICAgICAgICB9CiAgICB9OwoKICAgIGVu
dW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQgPSAx
IDw8IDAsCiAgICAgICAgUnVsZXNTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0g
KFN0eWxlU2hlZXRJZFNldCB8IFJ1bGVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RB
VEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVy
PFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEJvZHk+IHB0cikKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2hlZXRCb2R5Owog
ICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTaGVldElkU2V0PiYgc2V0
U3R5bGVTaGVldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3R5bGVTaGVldElkU2V0KSwgcHJvcGVydHlfc3R5bGVT
aGVldElkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3R5
bGVTaGVldElkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0eWxlU2hl
ZXRJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSdWxlc1NldD4m
IHNldFJ1bGVzKC8qUGFzc1JlZlB0cjxSdWxlcz4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5
PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBS
dWxlc1NldCksIHByb3BlcnR5X3J1bGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldEFycmF5KCJydWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxSdWxlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHls
ZVNoZWV0Qm9keT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5Pio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRC
b2R5PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0
Qm9keT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBj
b25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4gcmVzdWx0ID0gQ1NT
U3R5bGVTaGVldEJvZHk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4p
CiAgICAgKiAgICAgLnNldFJ1bGVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5v
RmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRz
U2V0PihhZG9wdFJlZihuZXcgQ1NTU3R5bGVTaGVldEJvZHkoKSkpOwogICAgfQoKICAgIHZvaWQg
c2V0VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmlu
ZygidGV4dCIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIENTUyBydWxlIHJlcHJlc2VudGF0aW9uLiAq
LwpjbGFzcyBDU1NSdWxlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIC8v
IE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ29yaWdpbicgd2hpbGUgZ2VuZXJhdGluZyBDU1NS
dWxlLgogICAgc3RydWN0IE9yaWdpbiB7CiAgICAgICAgZW51bSBFbnVtIHsKICAgICAgICAgICAg
VXNlciA9IDQwLAogICAgICAgICAgICBVc2VyX2FnZW50ID0gNDEsCiAgICAgICAgICAgIEluc3Bl
Y3RvciA9IDQyLAogICAgICAgICAgICBSZWd1bGFyID0gNDMsCiAgICAgICAgfTsKICAgIH07IC8v
IHN0cnVjdCBPcmlnaW4KCiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdtZWRpYScg
d2hpbGUgZ2VuZXJhdGluZyBDU1NSdWxlLgogICAgY2xhc3MgTWVkaWEgOiBwdWJsaWMgSW5zcGVj
dG9yQXJyYXkgewogICAgcHJpdmF0ZToKICAgICAgICBNZWRpYSgpIHsgfQoKICAgIHB1YmxpYzoK
ICAgICAgICB2b2lkIGFkZEl0ZW0oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OkNTU01l
ZGlhPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIHRoaXMtPnB1c2hPYmplY3QodmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgc3RhdGlj
IFBhc3NSZWZQdHI8TWVkaWE+IGNyZWF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkb3B0UmVm
KG5ldyBNZWRpYSgpKTsKICAgICAgICB9CiAgICB9OwoKICAgIGVudW0gewogICAgICAgIE5vRmll
bGRzU2V0ID0gMCwKICAgICAgICBTZWxlY3RvclRleHRTZXQgPSAxIDw8IDAsCiAgICAgICAgU291
cmNlTGluZVNldCA9IDEgPDwgMSwKICAgICAgICBPcmlnaW5TZXQgPSAxIDw8IDIsCiAgICAgICAg
U3R5bGVTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFNlbGVjdG9yVGV4dFNl
dCB8IFNvdXJjZUxpbmVTZXQgfCBPcmlnaW5TZXQgfCBTdHlsZVNldCkKICAgIH07CgogICAgdGVt
cGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQg
U1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRo
aXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1J1bGU+IHB0cikK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0
LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3Vs
dCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1J1bGU7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZWxlY3RvclRleHRTZXQ+JiBzZXRTZWxlY3Rv
clRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBTZWxlY3RvclRleHRTZXQpLCBwcm9wZXJ0eV9zZWxlY3RvclRleHRf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzZWxlY3RvclRl
eHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2VsZWN0b3JUZXh0U2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZUxpbmVTZXQ+JiBz
ZXRTb3VyY2VMaW5lKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBTb3VyY2VMaW5lU2V0KSwgcHJvcGVydHlfc291cmNlTGluZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNvdXJjZUxpbmUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U291cmNlTGluZVNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPcmlnaW5TZXQ+JiBzZXRPcmlnaW4oT3JpZ2lu
OjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIE9yaWdpblNldCksIHByb3BlcnR5X29yaWdpbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIsIGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVl
KSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T3JpZ2luU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE9yaWdpblNldD4mIHNldE9yaWdpbihjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IE9yaWdpblNldCksIHByb3BlcnR5X29yaWdpbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxPcmlnaW5TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
U3R5bGVTZXQ+JiBzZXRTdHlsZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTU3R5
bGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxlU2V0KSwgcHJvcGVydHlfc3R5bGVf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJzdHlsZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdHlsZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NSdWxlPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9y
ZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTUnVs
ZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxD
U1NSdWxlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NSdWxlPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPENTU1J1bGU+IHJlc3VsdCA9IENTU1J1bGU6OmNyZWF0ZSgpCiAg
ICAgKiAgICAgLnNldFNlbGVjdG9yVGV4dCguLi4pCiAgICAgKiAgICAgLnNldFNvdXJjZUxpbmUo
Li4uKQogICAgICogICAgIC5zZXRPcmlnaW4oLi4uKQogICAgICogICAgIC5zZXRTdHlsZSguLi4p
OwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENTU1J1bGUo
KSkpOwogICAgfQoKICAgIHZvaWQgc2V0UnVsZUlkKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
Q1NTOjpDU1NSdWxlSWQ+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicnVsZUlkIiwgdmFsdWUpOwogICAgfQoKICAgIHZv
aWQgc2V0U291cmNlVVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJzb3VyY2VVUkwiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTZWxlY3Rv
clJhbmdlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpTb3VyY2VSYW5nZT4qLyBQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2Jq
ZWN0KCJzZWxlY3RvclJhbmdlIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TWVkaWEoLypQ
YXNzUmVmUHRyPE1lZGlhPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldEFycmF5KCJtZWRpYSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIFRl
eHQgcmFuZ2Ugd2l0aGluIGEgcmVzb3VyY2UuICovCmNsYXNzIFNvdXJjZVJhbmdlIDogcHVibGlj
IEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0
ID0gMCwKICAgICAgICBTdGFydFNldCA9IDEgPDwgMCwKICAgICAgICBFbmRTZXQgPSAxIDw8IDEs
CiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFN0YXJ0U2V0IHwgRW5kU2V0KQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U291cmNlUmFuZ2U+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNvdXJjZVJhbmdl
OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhcnRTZXQ+JiBzZXRTdGFy
dChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgU3RhcnRTZXQpLCBwcm9wZXJ0eV9zdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoInN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPFN0YXJ0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEVu
ZFNldD4mIHNldEVuZChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgRW5kU2V0KSwgcHJvcGVydHlfZW5kX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiZW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPEVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0
cjxTb3VyY2VSYW5nZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNvdXJjZVJhbmdlPio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFNvdXJjZVJhbmdlPiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxTb3VyY2VSYW5nZT4oKnRoaXMpOwog
ICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAg
ICAqIFJlZlB0cjxTb3VyY2VSYW5nZT4gcmVzdWx0ID0gU291cmNlUmFuZ2U6OmNyZWF0ZSgpCiAg
ICAgKiAgICAgLnNldFN0YXJ0KC4uLikKICAgICAqICAgICAuc2V0RW5kKC4uLik7CiAgICAgKi8K
ICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgU291cmNlUmFuZ2UoKSkpOwog
ICAgfQp9OwoKY2xhc3MgQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5IDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAg
ICAgICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFZhbHVlU2V0ID0gMSA8PCAxLAogICAgICAg
IEFsbEZpZWxkc1NldCA9IChOYW1lU2V0IHwgVmFsdWVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRl
PGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+
IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJv
cGVydHk+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAg
ICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU0Nv
bXB1dGVkU3R5bGVQcm9wZXJ0eTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgVmFsdWVTZXQ+JiBzZXRWYWx1ZShjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFZhbHVl
U2V0KSwgcHJvcGVydHlfdmFsdWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxW
YWx1ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NDb21wdXRl
ZFN0eWxlUHJvcGVydHk+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+
Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q1NT
Q29tcHV0ZWRTdHlsZVByb3BlcnR5PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJl
ZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTQ29t
cHV0ZWRTdHlsZVByb3BlcnR5PiByZXN1bHQgPSBDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk6OmNy
ZWF0ZSgpCiAgICAgKiAgICAgLnNldE5hbWUoLi4uKQogICAgICogICAgIC5zZXRWYWx1ZSguLi4p
OwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENTU0NvbXB1
dGVkU3R5bGVQcm9wZXJ0eSgpKSk7CiAgICB9Cn07CgovKiBDU1Mgc3R5bGUgcmVwcmVzZW50YXRp
b24uICovCmNsYXNzIENTU1N0eWxlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoK
ICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ2Nzc1Byb3BlcnRpZXMnIHdoaWxlIGdl
bmVyYXRpbmcgQ1NTU3R5bGUuCiAgICBjbGFzcyBDc3NQcm9wZXJ0aWVzIDogcHVibGljIEluc3Bl
Y3RvckFycmF5IHsKICAgIHByaXZhdGU6CiAgICAgICAgQ3NzUHJvcGVydGllcygpIHsgfQoKICAg
IHB1YmxpYzoKICAgICAgICB2b2lkIGFkZEl0ZW0oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpD
U1M6OkNTU1Byb3BlcnR5PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIHRoaXMtPnB1c2hPYmplY3QodmFsdWUpOwogICAgICAgIH0KCiAg
ICAgICAgc3RhdGljIFBhc3NSZWZQdHI8Q3NzUHJvcGVydGllcz4gY3JlYXRlKCkgewogICAgICAg
ICAgICByZXR1cm4gYWRvcHRSZWYobmV3IENzc1Byb3BlcnRpZXMoKSk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdzaG9ydGhhbmRFbnRyaWVzJyB3
aGlsZSBnZW5lcmF0aW5nIENTU1N0eWxlLgogICAgY2xhc3MgU2hvcnRoYW5kRW50cmllcyA6IHB1
YmxpYyBJbnNwZWN0b3JBcnJheSB7CiAgICBwcml2YXRlOgogICAgICAgIFNob3J0aGFuZEVudHJp
ZXMoKSB7IH0KCiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBhZGRJdGVtKFBhc3NSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMtPnB1c2hPYmpl
Y3QodmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U2hvcnRoYW5k
RW50cmllcz4gY3JlYXRlKCkgewogICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNob3J0
aGFuZEVudHJpZXMoKSk7CiAgICAgICAgfQogICAgfTsKCiAgICBlbnVtIHsKICAgICAgICBOb0Zp
ZWxkc1NldCA9IDAsCiAgICAgICAgQ3NzUHJvcGVydGllc1NldCA9IDEgPDwgMCwKICAgICAgICBT
aG9ydGhhbmRFbnRyaWVzU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChDc3NQ
cm9wZXJ0aWVzU2V0IHwgU2hvcnRoYW5kRW50cmllc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8
aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4g
QnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0eWxlPiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVp
bGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBw
dHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDU1NTdHlsZTsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENzc1Byb3BlcnRpZXNTZXQ+JiBzZXRDc3NQcm9wZXJ0
aWVzKC8qUGFzc1JlZlB0cjxDc3NQcm9wZXJ0aWVzPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJy
YXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IENzc1Byb3BlcnRpZXNTZXQpLCBwcm9wZXJ0eV9jc3NQcm9wZXJ0aWVzX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJjc3NQcm9wZXJ0aWVzIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENzc1Byb3BlcnRpZXNTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2hvcnRoYW5kRW50cmllc1NldD4mIHNldFNob3J0
aGFuZEVudHJpZXMoLypQYXNzUmVmUHRyPFNob3J0aGFuZEVudHJpZXM+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgU2hvcnRoYW5kRW50cmllc1NldCksIHByb3BlcnR5X3Nob3J0aGFuZEVudHJp
ZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInNob3J0aGFu
ZEVudHJpZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2hvcnRoYW5k
RW50cmllc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHls
ZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxG
aWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlPiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NTdHlsZT4g
cmVzdWx0ID0gQ1NTU3R5bGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldENzc1Byb3BlcnRpZXMo
Li4uKQogICAgICogICAgIC5zZXRTaG9ydGhhbmRFbnRyaWVzKC4uLik7CiAgICAgKi8KICAgIHN0
YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBC
dWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ1NTU3R5bGUoKSkpOwogICAgfQoKICAg
IHZvaWQgc2V0U3R5bGVJZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTU3R5bGVJ
ZD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0T2JqZWN0KCJzdHlsZUlkIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0Q3NzVGV4
dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygiY3Nz
VGV4dCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJhbmdlKC8qUGFzc1JlZlB0cjxUeXBl
QnVpbGRlcjo6Q1NTOjpTb3VyY2VSYW5nZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJyYW5nZSIsIHZhbHVlKTsKICAg
IH0KCiAgICB2b2lkIHNldFdpZHRoKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0U3RyaW5nKCJ3aWR0aCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldEhlaWdo
dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygiaGVp
Z2h0IiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NTIHN0eWxlIGVmZmVjdGl2ZSB2aXN1YWwgZGlt
ZW5zaW9ucyBhbmQgc291cmNlIG9mZnNldHMuICovCmNsYXNzIENTU1Byb3BlcnR5IDogcHVibGlj
IEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5h
bWUgJ3N0YXR1cycgd2hpbGUgZ2VuZXJhdGluZyBDU1NQcm9wZXJ0eS4KICAgIHN0cnVjdCBTdGF0
dXMgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIEFjdGl2ZSA9IDQ0LAogICAgICAg
ICAgICBJbmFjdGl2ZSA9IDQ1LAogICAgICAgICAgICBEaXNhYmxlZCA9IDQ2LAogICAgICAgICAg
ICBTdHlsZSA9IDQ3LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgU3RhdHVzCgogICAgZW51
bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAg
ICAgICAgVmFsdWVTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVTZXQg
fCBWYWx1ZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPENTU1Byb3BlcnR5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9p
bml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAg
IGZyaWVuZCBjbGFzcyBDU1NQcm9wZXJ0eTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5X25h
bWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVmFsdWVTZXQ+JiBzZXRWYWx1ZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFZhbHVlU2V0KSwgcHJvcGVydHlfdmFsdWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxWYWx1ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NQ
cm9wZXJ0eT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1Byb3BlcnR5Pio+KCZtX3Jlc3VsdCk7CiAgICAg
ICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1Byb3BlcnR5PiAoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NQcm9wZXJ0eT4oKnRoaXMpOwogICAgICAg
IH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJl
ZlB0cjxDU1NQcm9wZXJ0eT4gcmVzdWx0ID0gQ1NTUHJvcGVydHk6OmNyZWF0ZSgpCiAgICAgKiAg
ICAgLnNldE5hbWUoLi4uKQogICAgICogICAgIC5zZXRWYWx1ZSguLi4pOwogICAgICovCiAgICBz
dGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IENTU1Byb3BlcnR5KCkpKTsKICAgIH0K
CiAgICB2b2lkIHNldFByaW9yaXR5KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0U3RyaW5nKCJwcmlvcml0eSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldElt
cGxpY2l0KGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigiaW1wbGlj
aXQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgfQoKICAg
IHZvaWQgc2V0UGFyc2VkT2soYm9vbCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRCb29s
ZWFuKCJwYXJzZWRPayIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFN0YXR1cyhTdGF0dXM6
OkVudW0gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMiLCBnZXRF
bnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgfQoKICAgIHZvaWQgc2V0U3RhdHVzKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMiLCB2
YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTaG9ydGhhbmROYW1lKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzaG9ydGhhbmROYW1lIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0UmFuZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6
OlNvdXJjZVJhbmdlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJhbmdlIiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NT
IG1lZGlhIHF1ZXJ5IGRlc2NyaXB0b3IuICovCmNsYXNzIENTU01lZGlhIDogcHVibGljIEluc3Bl
Y3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3Nv
dXJjZScgd2hpbGUgZ2VuZXJhdGluZyBDU1NNZWRpYS4KICAgIHN0cnVjdCBTb3VyY2UgewogICAg
ICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIE1lZGlhUnVsZSA9IDQ4LAogICAgICAgICAgICBJ
bXBvcnRSdWxlID0gNDksCiAgICAgICAgICAgIExpbmtlZFNoZWV0ID0gNTAsCiAgICAgICAgICAg
IElubGluZVNoZWV0ID0gNTEsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBTb3VyY2UKCiAg
ICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVGV4dFNldCA9IDEgPDwg
MCwKICAgICAgICBTb3VyY2VTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFRl
eHRTZXQgfCBTb3VyY2VTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNs
YXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NNZWRpYT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9u
b25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAg
ICAgICBmcmllbmQgY2xhc3MgQ1NTTWVkaWE7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBUZXh0U2V0PiYgc2V0VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRleHRTZXQpLCBwcm9wZXJ0eV90
ZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidGV4dCIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUZXh0U2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZVNldD4mIHNldFNvdXJjZShTb3VyY2U6
OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUp
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU291cmNlU2V0PiYgc2V0U291cmNlKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
U291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPFNvdXJjZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxD
U1NNZWRpYT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU01lZGlhPio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU01lZGlhPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NNZWRpYT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NN
ZWRpYT4gcmVzdWx0ID0gQ1NTTWVkaWE6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFRleHQoLi4u
KQogICAgICogICAgIC5zZXRTb3VyY2UoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NNZWRpYSgpKSk7CiAgICB9CgogICAgdm9pZCBzZXRTb3Vy
Y2VVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmco
InNvdXJjZVVSTCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNvdXJjZUxpbmUoaW50IHZh
bHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigic291cmNlTGluZSIsIHZhbHVlKTsK
ICAgIH0KfTsKCi8qIENTUyBzZWxlY3RvciBwcm9maWxlIGVudHJ5LiAqLwpjbGFzcyBTZWxlY3Rv
clByb2ZpbGVFbnRyeSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU2VsZWN0b3JTZXQgPSAxIDw8IDAs
CiAgICAgICAgVXJsU2V0ID0gMSA8PCAxLAogICAgICAgIExpbmVOdW1iZXJTZXQgPSAxIDw8IDIs
CiAgICAgICAgVGltZVNldCA9IDEgPDwgMywKICAgICAgICBIaXRDb3VudFNldCA9IDEgPDwgNCwK
ICAgICAgICBNYXRjaENvdW50U2V0ID0gMSA8PCA1LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChT
ZWxlY3RvclNldCB8IFVybFNldCB8IExpbmVOdW1iZXJTZXQgfCBUaW1lU2V0IHwgSGl0Q291bnRT
ZXQgfCBNYXRjaENvdW50U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBj
bGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwg
U1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyKFBhc3NSZWZQdHI8U2VsZWN0b3JQcm9maWxlRW50cnk+IHB0cikKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVy
X2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsK
ICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNlbGVjdG9yUHJvZmlsZUVudHJ5OwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2VsZWN0b3JTZXQ+JiBzZXRTZWxlY3Rv
cihjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFNlbGVjdG9yU2V0KSwgcHJvcGVydHlfc2VsZWN0b3JfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzZWxlY3RvciIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTZWxlY3RvclNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBw
cm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXJsU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExpbmVOdW1iZXJTZXQ+JiBzZXRMaW5l
TnVtYmVyKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEo
U1RBVEUgJiBMaW5lTnVtYmVyU2V0KSwgcHJvcGVydHlfbGluZU51bWJlcl9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGluZU51bWJlclNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUaW1lU2V0PiYgc2V0VGltZShkb3VibGUgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVGltZVNldCksIHBy
b3BlcnR5X3RpbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVy
KCJ0aW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRpbWVTZXQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSGl0Q291bnRTZXQ+JiBzZXRIaXRD
b3VudChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgSGl0Q291bnRTZXQpLCBwcm9wZXJ0eV9oaXRDb3VudF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImhpdENvdW50IiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPEhpdENvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE1hdGNoQ291bnRTZXQ+JiBzZXRNYXRjaENvdW50KGludCB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYXRjaENvdW50U2V0
KSwgcHJvcGVydHlfbWF0Y2hDb3VudF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoIm1hdGNoQ291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8TWF0Y2hDb3VudFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0
cjxTZWxlY3RvclByb2ZpbGVFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVu
dHJ5Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PFNlbGVjdG9yUHJvZmlsZUVudHJ5PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJl
ZlB0cjxTZWxlY3RvclByb2ZpbGVFbnRyeT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWxlY3RvclBy
b2ZpbGVFbnRyeT4gcmVzdWx0ID0gU2VsZWN0b3JQcm9maWxlRW50cnk6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldFNlbGVjdG9yKC4uLikKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAg
ICAuc2V0TGluZU51bWJlciguLi4pCiAgICAgKiAgICAgLnNldFRpbWUoLi4uKQogICAgICogICAg
IC5zZXRIaXRDb3VudCguLi4pCiAgICAgKiAgICAgLnNldE1hdGNoQ291bnQoLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAg
cmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBTZWxlY3RvclByb2ZpbGVF
bnRyeSgpKSk7CiAgICB9Cn07CgpjbGFzcyBTZWxlY3RvclByb2ZpbGUgOiBwdWJsaWMgSW5zcGVj
dG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnZGF0
YScgd2hpbGUgZ2VuZXJhdGluZyBTZWxlY3RvclByb2ZpbGUuCiAgICBjbGFzcyBEYXRhIDogcHVi
bGljIEluc3BlY3RvckFycmF5IHsKICAgIHByaXZhdGU6CiAgICAgICAgRGF0YSgpIHsgfQoKICAg
IHB1YmxpYzoKICAgICAgICB2b2lkIGFkZEl0ZW0oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpD
U1M6OlNlbGVjdG9yUHJvZmlsZUVudHJ5PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMtPnB1c2hPYmplY3QodmFsdWUpOwogICAg
ICAgIH0KCiAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8RGF0YT4gY3JlYXRlKCkgewogICAgICAg
ICAgICByZXR1cm4gYWRvcHRSZWYobmV3IERhdGEoKSk7CiAgICAgICAgfQogICAgfTsKCiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVG90YWxUaW1lU2V0ID0gMSA8
PCAwLAogICAgICAgIERhdGFTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFRv
dGFsVGltZVNldCB8IERhdGFTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAg
IGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTZWxlY3RvclByb2ZpbGU+IHB0cikKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2Ny
ZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAg
ICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNlbGVjdG9yUHJvZmlsZTsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRvdGFsVGltZVNldD4mIHNldFRvdGFsVGltZShkb3Vi
bGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
VG90YWxUaW1lU2V0KSwgcHJvcGVydHlfdG90YWxUaW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldE51bWJlcigidG90YWxUaW1lIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFRvdGFsVGltZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBEYXRhU2V0PiYgc2V0RGF0YSgvKlBhc3NSZWZQdHI8RGF0YT4qLyBQYXNzUmVm
UHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBEYXRhU2V0KSwgcHJvcGVydHlfZGF0YV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgiZGF0YSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxEYXRhU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UmVmUHRyPFNlbGVjdG9yUHJvZmlsZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlbGVjdG9yUHJvZmlsZT4q
PigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTZWxl
Y3RvclByb2ZpbGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNlbGVj
dG9yUHJvZmlsZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWxlY3RvclByb2ZpbGU+IHJlc3VsdCA9
IFNlbGVjdG9yUHJvZmlsZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VG90YWxUaW1lKC4uLikK
ICAgICAqICAgICAuc2V0RGF0YSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0Zp
ZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4oYWRvcHRSZWYobmV3IFNlbGVjdG9yUHJvZmlsZSgpKSk7CiAgICB9Cn07Cgp9IC8vIENTUwoK
bmFtZXNwYWNlIFRpbWVsaW5lIHsKLyogVGltZWxpbmUgcmVjb3JkIGNvbnRhaW5zIGluZm9ybWF0
aW9uIGFib3V0IHRoZSByZWNvcmRlZCBhY3Rpdml0eS4gKi8KY2xhc3MgVGltZWxpbmVFdmVudCA6
IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9w
ZXJ0eSBuYW1lICdjaGlsZHJlbicgd2hpbGUgZ2VuZXJhdGluZyBUaW1lbGluZUV2ZW50LgogICAg
Y2xhc3MgQ2hpbGRyZW4gOiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgcHJpdmF0ZToKICAg
ICAgICBDaGlsZHJlbigpIHsgfQoKICAgIHB1YmxpYzoKICAgICAgICB2b2lkIGFkZEl0ZW0oLypQ
YXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpUaW1lbGluZTo6VGltZWxpbmVFdmVudD4qLyBQYXNzUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLT5w
dXNoT2JqZWN0KHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPENo
aWxkcmVuPiBjcmVhdGUoKSB7CiAgICAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2hpbGRy
ZW4oKSk7CiAgICAgICAgfQogICAgfTsKCiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9
IDAsCiAgICAgICAgVHlwZVNldCA9IDEgPDwgMCwKICAgICAgICBEYXRhU2V0ID0gMSA8PCAxLAog
ICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0IHwgRGF0YVNldCkKICAgIH07CgogICAgdGVt
cGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQg
U1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRo
aXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFRpbWVsaW5lRXZlbnQ+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFRpbWVsaW5lRXZl
bnQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlw
ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IERhdGFTZXQ+JiBzZXREYXRhKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEYXRhU2V0KSwg
cHJvcGVydHlfZGF0YV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmpl
Y3QoImRhdGEiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RGF0YVNldD4o
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxUaW1lbGluZUV2ZW50PiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8VGltZWxpbmVFdmVudD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxUaW1lbGluZUV2ZW50PiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxUaW1lbGluZUV2ZW50PigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFRp
bWVsaW5lRXZlbnQ+IHJlc3VsdCA9IFRpbWVsaW5lRXZlbnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAg
LnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXREYXRhKC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgVGltZWxpbmVFdmVudCgpKSk7CiAgICB9Cgog
ICAgdm9pZCBzZXRDaGlsZHJlbigvKlBhc3NSZWZQdHI8Q2hpbGRyZW4+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoImNoaWxk
cmVuIiwgdmFsdWUpOwogICAgfQp9OwoKfSAvLyBUaW1lbGluZQoKI2lmIEVOQUJMRShKQVZBU0NS
SVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgRGVidWdnZXIgewovKiBMb2NhdGlvbiBpbiB0aGUgc291
cmNlIGNvZGUuICovCmNsYXNzIExvY2F0aW9uIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1
YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTY3JpcHRJ
ZFNldCA9IDEgPDwgMCwKICAgICAgICBMaW5lTnVtYmVyU2V0ID0gMSA8PCAxLAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChTY3JpcHRJZFNldCB8IExpbmVOdW1iZXJTZXQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxMb2NhdGlvbj4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgTG9jYXRpb247CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTY3JpcHRJZFNldD4mIHNldFNjcmlwdElk
KC8qY29uc3QgVHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpTY3JpcHRJZCYqLyBjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNj
cmlwdElkU2V0KSwgcHJvcGVydHlfc2NyaXB0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJzY3JpcHRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxTY3JpcHRJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBMaW5lTnVtYmVyU2V0PiYgc2V0TGluZU51bWJlcihpbnQgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTGluZU51bWJlclNldCksIHByb3Bl
cnR5X2xpbmVOdW1iZXJfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJsaW5lTnVtYmVyIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExp
bmVOdW1iZXJTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8TG9jYXRp
b24+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxs
RmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PFJlZlB0cjxMb2NhdGlvbj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxMb2NhdGlvbj4gKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiBSZWZQdHI8TG9jYXRpb24+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAg
IC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8TG9jYXRpb24+
IHJlc3VsdCA9IExvY2F0aW9uOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTY3JpcHRJZCguLi4p
CiAgICAgKiAgICAgLnNldExpbmVOdW1iZXIoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBMb2NhdGlvbigpKSk7CiAgICB9CgogICAgdm9pZCBzZXRD
b2x1bW5OdW1iZXIoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigiY29s
dW1uTnVtYmVyIiwgdmFsdWUpOwogICAgfQp9OwoKLyogSmF2YVNjcmlwdCBjYWxsIGZyYW1lLiBB
cnJheSBvZiBjYWxsIGZyYW1lcyBmb3JtIHRoZSBjYWxsIHN0YWNrLiAqLwpjbGFzcyBDYWxsRnJh
bWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIg
cHJvcGVydHkgbmFtZSAnc2NvcGVDaGFpbicgd2hpbGUgZ2VuZXJhdGluZyBDYWxsRnJhbWUuCiAg
ICBjbGFzcyBTY29wZUNoYWluIDogcHVibGljIEluc3BlY3RvckFycmF5IHsKICAgIHByaXZhdGU6
CiAgICAgICAgU2NvcGVDaGFpbigpIHsgfQoKICAgIHB1YmxpYzoKICAgICAgICB2b2lkIGFkZEl0
ZW0oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6U2NvcGU+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy0+cHVz
aE9iamVjdCh2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTY29w
ZUNoYWluPiBjcmVhdGUoKSB7CiAgICAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgU2NvcGVD
aGFpbigpKTsKICAgICAgICB9CiAgICB9OwoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0
ID0gMCwKICAgICAgICBDYWxsRnJhbWVJZFNldCA9IDEgPDwgMCwKICAgICAgICBGdW5jdGlvbk5h
bWVTZXQgPSAxIDw8IDEsCiAgICAgICAgTG9jYXRpb25TZXQgPSAxIDw8IDIsCiAgICAgICAgU2Nv
cGVDaGFpblNldCA9IDEgPDwgMywKICAgICAgICBUaGlzU2V0ID0gMSA8PCA0LAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChDYWxsRnJhbWVJZFNldCB8IEZ1bmN0aW9uTmFtZVNldCB8IExvY2F0aW9u
U2V0IHwgU2NvcGVDaGFpblNldCB8IFRoaXNTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBT
VEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDYWxsRnJhbWU+IHB0cikKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVy
X2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsK
ICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENhbGxGcmFtZTsKICAgIHB1YmxpYzoKCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IENhbGxGcmFtZUlkU2V0PiYgc2V0Q2FsbEZyYW1lSWQoLypj
b25zdCBUeXBlQnVpbGRlcjo6RGVidWdnZXI6OkNhbGxGcmFtZUlkJiovIGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ2Fs
bEZyYW1lSWRTZXQpLCBwcm9wZXJ0eV9jYWxsRnJhbWVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImNhbGxGcmFtZUlkIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPENhbGxGcmFtZUlkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IEZ1bmN0aW9uTmFtZVNldD4mIHNldEZ1bmN0aW9uTmFtZShjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIEZ1bmN0aW9uTmFtZVNldCksIHByb3BlcnR5X2Z1bmN0aW9uTmFtZV9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZ1bmN0aW9uTmFtZSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxGdW5jdGlvbk5hbWVTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTG9jYXRpb25TZXQ+JiBzZXRMb2NhdGlvbigvKlBh
c3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgTG9jYXRpb25TZXQpLCBwcm9wZXJ0eV9sb2NhdGlvbl9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImxvY2F0aW9uIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExvY2F0aW9uU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFNjb3BlQ2hhaW5TZXQ+JiBzZXRTY29wZUNoYWluKC8qUGFzc1Jl
ZlB0cjxTY29wZUNoYWluPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNjb3BlQ2hhaW5TZXQp
LCBwcm9wZXJ0eV9zY29wZUNoYWluX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldEFycmF5KCJzY29wZUNoYWluIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPFNjb3BlQ2hhaW5TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
VGhpc1NldD4mIHNldFRoaXMoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1v
dGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRoaXNTZXQpLCBwcm9wZXJ0eV90
aGlzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgidGhpcyIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUaGlzU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENhbGxGcmFtZT4mICgpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19u
b3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENh
bGxGcmFtZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxDYWxsRnJhbWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENh
bGxGcmFtZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDYWxsRnJhbWU+IHJlc3VsdCA9IENhbGxGcmFt
ZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0Q2FsbEZyYW1lSWQoLi4uKQogICAgICogICAgIC5z
ZXRGdW5jdGlvbk5hbWUoLi4uKQogICAgICogICAgIC5zZXRMb2NhdGlvbiguLi4pCiAgICAgKiAg
ICAgLnNldFNjb3BlQ2hhaW4oLi4uKQogICAgICogICAgIC5zZXRUaGlzKC4uLik7CiAgICAgKi8K
ICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ2FsbEZyYW1lKCkpKTsKICAg
IH0KfTsKCi8qIFNjb3BlIGRlc2NyaXB0aW9uLiAqLwpjbGFzcyBTY29wZSA6IHB1YmxpYyBJbnNw
ZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICd0
eXBlJyB3aGlsZSBnZW5lcmF0aW5nIFNjb3BlLgogICAgc3RydWN0IFR5cGUgewogICAgICAgIGVu
dW0gRW51bSB7CiAgICAgICAgICAgIEdsb2JhbCA9IDUyLAogICAgICAgICAgICBMb2NhbCA9IDUz
LAogICAgICAgICAgICBXaXRoID0gNTQsCiAgICAgICAgICAgIENsb3N1cmUgPSA1NSwKICAgICAg
ICAgICAgQ2F0Y2ggPSA1NiwKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IFR5cGUKCiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVHlwZVNldCA9IDEgPDwgMCwK
ICAgICAgICBPYmplY3RTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFR5cGVT
ZXQgfCBPYmplY3RTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNz
IEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBt
X3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
PiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXIoUGFzc1JlZlB0cjxTY29wZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgU2NvcGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBU
eXBlU2V0PiYgc2V0VHlwZShUeXBlOjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIGdldEVudW1Db25z
dGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4o
KTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IE9iamVjdFNldD4mIHNldE9iamVjdCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1bnRpbWU6
OlJlbW90ZU9iamVjdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgT2JqZWN0U2V0KSwgcHJv
cGVydHlfb2JqZWN0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVj
dCgib2JqZWN0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE9iamVjdFNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxTY29wZT4mICgpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJl
c3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
UmVmUHRyPFNjb3BlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQ
YXNzUmVmUHRyPFNjb3BlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxT
Y29wZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBj
b25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTY29wZT4gcmVzdWx0ID0gU2NvcGU6OmNyZWF0ZSgp
CiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXRPYmplY3QoLi4uKTsKICAg
ICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAg
ICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBTY29wZSgpKSk7CiAg
ICB9Cn07Cgp9IC8vIERlYnVnZ2VyCgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdH
RVIpCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKbmFtZXNwYWNlIERPTURlYnVnZ2Vy
IHsKLyogRE9NIGJyZWFrcG9pbnQgdHlwZS4gKi8Kc3RydWN0IERPTUJyZWFrcG9pbnRUeXBlIHsK
ICAgIGVudW0gRW51bSB7CiAgICAgICAgU3VidHJlZV9tb2RpZmllZCA9IDU3LAogICAgICAgIEF0
dHJpYnV0ZV9tb2RpZmllZCA9IDU4LAogICAgICAgIE5vZGVfcmVtb3ZlZCA9IDU5LAogICAgfTsK
fTsgLy8gc3RydWN0IERPTUJyZWFrcG9pbnRUeXBlCgp9IC8vIERPTURlYnVnZ2VyCgojZW5kaWYg
Ly8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCgp9IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRl
cgoKY2xhc3MgSW5zcGVjdG9yRnJvbnRlbmQgewpwdWJsaWM6CiAgICBJbnNwZWN0b3JGcm9udGVu
ZChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqKTsKCgogICAgY2xhc3MgSW5zcGVjdG9yIHsKICAg
IHB1YmxpYzoKICAgICAgICBJbnNwZWN0b3IoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGV2YWx1YXRlRm9yVGVzdEluRnJv
bnRlbmQoaW50IHRlc3RDYWxsSWQsIGNvbnN0IFN0cmluZyYgc2NyaXB0KTsKICAgICAgICB2b2lk
IGluc3BlY3QoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdCwgUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IGhpbnRzKTsKICAgICAgICB2b2lkIGRpZENyZWF0ZVdvcmtlcihpbnQgaWQsIGNv
bnN0IFN0cmluZyYgdXJsLCBib29sIGlzU2hhcmVkKTsKICAgICAgICB2b2lkIGRpZERlc3Ryb3lX
b3JrZXIoaW50IGlkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAg
ICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAg
ICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsKICAgIH07CgogICAgSW5zcGVjdG9yKiBpbnNwZWN0b3IoKSB7IHJldHVybiAmbV9pbnNwZWN0
b3I7IH0KCiAgICBjbGFzcyBNZW1vcnkgewogICAgcHVibGljOgogICAgICAgIE1lbW9yeShJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAg
IHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
ID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBNZW1vcnkq
IG1lbW9yeSgpIHsgcmV0dXJuICZtX21lbW9yeTsgfQoKICAgIGNsYXNzIFBhZ2UgewogICAgcHVi
bGljOgogICAgICAgIFBhZ2UoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGRvbUNvbnRlbnRFdmVudEZpcmVkKGRvdWJsZSB0
aW1lc3RhbXApOwogICAgICAgIHZvaWQgbG9hZEV2ZW50RmlyZWQoZG91YmxlIHRpbWVzdGFtcCk7
CiAgICAgICAgdm9pZCBmcmFtZU5hdmlnYXRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlBh
Z2U6OkZyYW1lPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBmcmFtZSk7CiAgICAgICAg
dm9pZCBmcmFtZURldGFjaGVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkZyYW1lSWQm
Ki8gY29uc3QgU3RyaW5nJiBmcmFtZUlkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAg
IHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgUGFnZSogcGFnZSgpIHsgcmV0dXJuICZtX3BhZ2U7
IH0KCiAgICBjbGFzcyBSdW50aW1lIHsKICAgIHB1YmxpYzoKICAgICAgICBSdW50aW1lKEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAg
dm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwg
PSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFJ1bnRpbWUq
IHJ1bnRpbWUoKSB7IHJldHVybiAmbV9ydW50aW1lOyB9CgogICAgY2xhc3MgQ29uc29sZSB7CiAg
ICBwdWJsaWM6CiAgICAgICAgQ29uc29sZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgbWVzc2FnZUFkZGVkKC8qUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6Q29uc29sZTo6Q29uc29sZU1lc3NhZ2U+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2UpOwogICAgICAgIHZvaWQgbWVzc2FnZVJlcGVhdENvdW50
VXBkYXRlZChpbnQgY291bnQpOwogICAgICAgIHZvaWQgbWVzc2FnZXNDbGVhcmVkKCk7CiAgICAg
ICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIENvbnNv
bGUqIGNvbnNvbGUoKSB7IHJldHVybiAmbV9jb25zb2xlOyB9CgogICAgY2xhc3MgTmV0d29yayB7
CiAgICBwdWJsaWM6CiAgICAgICAgTmV0d29yayhJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgcmVxdWVzdFdpbGxCZVNlbnQo
Lypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYg
cmVxdWVzdElkLCAvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlkJiovIGNvbnN0
IFN0cmluZyYgZnJhbWVJZCwgLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6TG9hZGVySWQm
Ki8gY29uc3QgU3RyaW5nJiBsb2FkZXJJZCwgY29uc3QgU3RyaW5nJiBkb2N1bWVudFVSTCwgLypQ
YXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0PiovIFBhc3NSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiByZXF1ZXN0LCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6Ok5ldHdvcms6OkluaXRpYXRvcj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gaW5pdGlhdG9yLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNvbnNvbGU6OlN0YWNrVHJh
Y2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gc3RhY2tUcmFjZSwgLypQYXNzUmVmUHRy
PFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXNwb25zZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gcmVkaXJlY3RSZXNwb25zZSk7CiAgICAgICAgdm9pZCByZXF1ZXN0U2VydmVkRnJvbUNh
Y2hlKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJp
bmcmIHJlcXVlc3RJZCk7CiAgICAgICAgdm9pZCByZXNwb25zZVJlY2VpdmVkKC8qY29uc3QgVHlw
ZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwg
Lypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZy
YW1lSWQsIC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkxvYWRlcklkJiovIGNvbnN0IFN0
cmluZyYgbG9hZGVySWQsIGRvdWJsZSB0aW1lc3RhbXAsIC8qVHlwZUJ1aWxkZXI6OlBhZ2U6OlJl
c291cmNlVHlwZTo6RW51bSovIGNvbnN0IFN0cmluZyYgdHlwZSwgLypQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpOZXR3b3JrOjpSZXNwb25zZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cmVzcG9uc2UpOwogICAgICAgIHZvaWQgZGF0YVJlY2VpdmVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6
Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRp
bWVzdGFtcCwgaW50IGRhdGFMZW5ndGgsIGludCBlbmNvZGVkRGF0YUxlbmd0aCk7CiAgICAgICAg
dm9pZCBsb2FkaW5nRmluaXNoZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVz
dElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wKTsKICAgICAg
ICB2b2lkIGxvYWRpbmdGYWlsZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVz
dElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wLCBjb25zdCBT
dHJpbmcmIGVycm9yVGV4dCwgY29uc3QgYm9vbCogY29uc3QgY2FuY2VsZWQpOwogICAgICAgIHZv
aWQgcmVxdWVzdFNlcnZlZEZyb21NZW1vcnlDYWNoZSgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3
b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIC8qY29uc3QgVHlwZUJ1
aWxkZXI6Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCAvKmNvbnN0
IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpMb2FkZXJJZCYqLyBjb25zdCBTdHJpbmcmIGxvYWRlcklk
LCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkluaXRpYXRvcj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gaW5pdGlhdG9yLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkNh
Y2hlZFJlc291cmNlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNvdXJjZSk7CiAg
ICAgICAgdm9pZCB3ZWJTb2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3QoLypjb25zdCBUeXBl
QnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBk
b3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OldlYlNv
Y2tldFJlcXVlc3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcXVlc3QpOwogICAg
ICAgIHZvaWQgd2ViU29ja2V0SGFuZHNoYWtlUmVzcG9uc2VSZWNlaXZlZCgvKmNvbnN0IFR5cGVC
dWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRv
dWJsZSB0aW1lc3RhbXAsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6V2ViU29j
a2V0UmVzcG9uc2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlKTsKICAg
ICAgICB2b2lkIHdlYlNvY2tldENyZWF0ZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6
UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBjb25zdCBTdHJpbmcmIHVybCk7
CiAgICAgICAgdm9pZCB3ZWJTb2NrZXRDbG9zZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29y
azo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1w
KTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4g
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07Cgog
ICAgTmV0d29yayogbmV0d29yaygpIHsgcmV0dXJuICZtX25ldHdvcms7IH0KCiNpZiBFTkFCTEUo
U1FMX0RBVEFCQVNFKQogICAgY2xhc3MgRGF0YWJhc2UgewogICAgcHVibGljOgogICAgICAgIERh
dGFiYXNlKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkg
eyB9CiAgICAgICAgdm9pZCBhZGREYXRhYmFzZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRh
dGFiYXNlOjpEYXRhYmFzZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YWJhc2Up
OwogICAgICAgIC8vIE5hbWVkIGFmdGVyIHBhcmFtZXRlciBuYW1lICdjb2x1bW5OYW1lcycgd2hp
bGUgZ2VuZXJhdGluZyBldmVudCBzcWxUcmFuc2FjdGlvblN1Y2NlZWRlZC4KICAgICAgICBjbGFz
cyBDb2x1bW5OYW1lcyA6IHB1YmxpYyBJbnNwZWN0b3JBcnJheSB7CiAgICAgICAgcHJpdmF0ZToK
ICAgICAgICAgICAgQ29sdW1uTmFtZXMoKSB7IH0KCiAgICAgICAgcHVibGljOgogICAgICAgICAg
ICB2b2lkIGFkZEl0ZW0oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAg
ICAgICAgICAgdGhpcy0+cHVzaFN0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAg
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPENvbHVtbk5hbWVzPiBjcmVhdGUoKSB7CiAgICAgICAgICAg
ICAgICByZXR1cm4gYWRvcHRSZWYobmV3IENvbHVtbk5hbWVzKCkpOwogICAgICAgICAgICB9CiAg
ICAgICAgfTsKCiAgICAgICAgLy8gTmFtZWQgYWZ0ZXIgcGFyYW1ldGVyIG5hbWUgJ3ZhbHVlcycg
d2hpbGUgZ2VuZXJhdGluZyBldmVudCBzcWxUcmFuc2FjdGlvblN1Y2NlZWRlZC4KICAgICAgICBj
bGFzcyBWYWx1ZXMgOiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgICAgIHByaXZhdGU6CiAg
ICAgICAgICAgIFZhbHVlcygpIHsgfQoKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgIHZvaWQg
YWRkSXRlbShQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKICAgICAgICAgICAgewog
ICAgICAgICAgICAgICAgdGhpcy0+cHVzaFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgfQoKICAg
ICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8VmFsdWVzPiBjcmVhdGUoKSB7CiAgICAgICAgICAg
ICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFZhbHVlcygpKTsKICAgICAgICAgICAgfQogICAgICAg
IH07CgogICAgICAgIHZvaWQgc3FsVHJhbnNhY3Rpb25TdWNjZWVkZWQoaW50IHRyYW5zYWN0aW9u
SWQsIC8qUGFzc1JlZlB0cjxDb2x1bW5OYW1lcz4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5
PiBjb2x1bW5OYW1lcywgLypQYXNzUmVmUHRyPFZhbHVlcz4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiB2YWx1ZXMpOwogICAgICAgIHZvaWQgc3FsVHJhbnNhY3Rpb25GYWlsZWQoaW50IHRy
YW5zYWN0aW9uSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBzcWxFcnJvcik7CiAgICAg
ICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIERhdGFi
YXNlKiBkYXRhYmFzZSgpIHsgcmV0dXJuICZtX2RhdGFiYXNlOyB9CgojZW5kaWYgLy8gRU5BQkxF
KFNRTF9EQVRBQkFTRSkKI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQogICAgY2xhc3MgSW5k
ZXhlZERCIHsKICAgIHB1YmxpYzoKICAgICAgICBJbmRleGVkREIoSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGRhdGFiYXNl
TmFtZXNMb2FkZWQoZG91YmxlIHJlcXVlc3RJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpJ
bmRleGVkREI6OlNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXM+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXMpOwogICAgICAg
IHZvaWQgZGF0YWJhc2VMb2FkZWQoaW50IHJlcXVlc3RJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWls
ZGVyOjpJbmRleGVkREI6OkRhdGFiYXNlV2l0aE9iamVjdFN0b3Jlcz4qLyBQYXNzUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gZGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzKTsKICAgICAgICB2b2lkIHNl
dEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCog
Z2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgSW5kZXhlZERCKiBpbmRl
eGVkZGIoKSB7IHJldHVybiAmbV9pbmRleGVkZGI7IH0KCiNlbmRpZiAvLyBFTkFCTEUoSU5ERVhF
RF9EQVRBQkFTRSkKICAgIGNsYXNzIERPTVN0b3JhZ2UgewogICAgcHVibGljOgogICAgICAgIERP
TVN0b3JhZ2UoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KSB7IH0KICAgICAgICB2b2lkIGFkZERPTVN0b3JhZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVy
OjpET01TdG9yYWdlOjpFbnRyeT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc3RvcmFn
ZSk7CiAgICAgICAgdm9pZCB1cGRhdGVET01TdG9yYWdlKGludCBzdG9yYWdlSWQpOwogICAgICAg
IHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
ID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBET01TdG9y
YWdlKiBkb21zdG9yYWdlKCkgeyByZXR1cm4gJm1fZG9tc3RvcmFnZTsgfQoKICAgIGNsYXNzIEFw
cGxpY2F0aW9uQ2FjaGUgewogICAgcHVibGljOgogICAgICAgIEFwcGxpY2F0aW9uQ2FjaGUoSW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAg
ICB2b2lkIGFwcGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6
Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCBjb25zdCBTdHJpbmcm
IG1hbmlmZXN0VVJMLCBpbnQgc3RhdHVzKTsKICAgICAgICB2b2lkIG5ldHdvcmtTdGF0ZVVwZGF0
ZWQoYm9vbCBpc05vd09ubGluZSk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
IHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2
YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7CiAgICB9OwoKICAgIEFwcGxpY2F0aW9uQ2FjaGUqIGFwcGxpY2F0aW9uY2FjaGUo
KSB7IHJldHVybiAmbV9hcHBsaWNhdGlvbmNhY2hlOyB9CgojaWYgRU5BQkxFKEZJTEVfU1lTVEVN
KQogICAgY2xhc3MgRmlsZVN5c3RlbSB7CiAgICBwdWJsaWM6CiAgICAgICAgRmlsZVN5c3RlbShJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAg
ICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBGaWxl
U3lzdGVtKiBmaWxlc3lzdGVtKCkgeyByZXR1cm4gJm1fZmlsZXN5c3RlbTsgfQoKI2VuZGlmIC8v
IEVOQUJMRShGSUxFX1NZU1RFTSkKICAgIGNsYXNzIERPTSB7CiAgICBwdWJsaWM6CiAgICAgICAg
RE9NKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9
CiAgICAgICAgdm9pZCBkb2N1bWVudFVwZGF0ZWQoKTsKICAgICAgICAvLyBOYW1lZCBhZnRlciBw
YXJhbWV0ZXIgbmFtZSAnbm9kZXMnIHdoaWxlIGdlbmVyYXRpbmcgZXZlbnQgc2V0Q2hpbGROb2Rl
cy4KICAgICAgICBjbGFzcyBOb2RlcyA6IHB1YmxpYyBJbnNwZWN0b3JBcnJheSB7CiAgICAgICAg
cHJpdmF0ZToKICAgICAgICAgICAgTm9kZXMoKSB7IH0KCiAgICAgICAgcHVibGljOgogICAgICAg
ICAgICB2b2lkIGFkZEl0ZW0oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006Ok5vZGU+Ki8g
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAg
ICAgICAgICB0aGlzLT5wdXNoT2JqZWN0KHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAg
ICAgc3RhdGljIFBhc3NSZWZQdHI8Tm9kZXM+IGNyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgTm9kZXMoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAg
ICAgICB2b2lkIHNldENoaWxkTm9kZXMoaW50IHBhcmVudElkLCAvKlBhc3NSZWZQdHI8Tm9kZXM+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gbm9kZXMpOwogICAgICAgIHZvaWQgYXR0cmli
dXRlTW9kaWZpZWQoaW50IG5vZGVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IHZhbHVlKTsKICAgICAgICB2b2lkIGF0dHJpYnV0ZVJlbW92ZWQoaW50IG5vZGVJZCwgY29uc3Qg
U3RyaW5nJiBuYW1lKTsKICAgICAgICAvLyBOYW1lZCBhZnRlciBwYXJhbWV0ZXIgbmFtZSAnbm9k
ZUlkcycgd2hpbGUgZ2VuZXJhdGluZyBldmVudCBpbmxpbmVTdHlsZUludmFsaWRhdGVkLgogICAg
ICAgIGNsYXNzIE5vZGVJZHMgOiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkgewogICAgICAgIHByaXZh
dGU6CiAgICAgICAgICAgIE5vZGVJZHMoKSB7IH0KCiAgICAgICAgcHVibGljOgogICAgICAgICAg
ICB2b2lkIGFkZEl0ZW0oaW50IHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0
aGlzLT5wdXNoTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdGlj
IFBhc3NSZWZQdHI8Tm9kZUlkcz4gY3JlYXRlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBOb2RlSWRzKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAg
dm9pZCBpbmxpbmVTdHlsZUludmFsaWRhdGVkKC8qUGFzc1JlZlB0cjxOb2RlSWRzPiovIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yQXJyYXk+IG5vZGVJZHMpOwogICAgICAgIHZvaWQgY2hhcmFjdGVyRGF0
YU1vZGlmaWVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgY2hhcmFjdGVyRGF0YSk7CiAgICAg
ICAgdm9pZCBjaGlsZE5vZGVDb3VudFVwZGF0ZWQoaW50IG5vZGVJZCwgaW50IGNoaWxkTm9kZUNv
dW50KTsKICAgICAgICB2b2lkIGNoaWxkTm9kZUluc2VydGVkKGludCBwYXJlbnROb2RlSWQsIGlu
dCBwcmV2aW91c05vZGVJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006Ok5vZGU+Ki8g
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG5vZGUpOwogICAgICAgIHZvaWQgY2hpbGROb2Rl
UmVtb3ZlZChpbnQgcGFyZW50Tm9kZUlkLCBpbnQgbm9kZUlkKTsKICAgICAgICB2b2lkIHNldElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBt
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgRE9NKiBkb20oKSB7IHJldHVy
biAmbV9kb207IH0KCiAgICBjbGFzcyBDU1MgewogICAgcHVibGljOgogICAgICAgIENTUyhJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAg
IHZvaWQgbWVkaWFRdWVyeVJlc3VsdENoYW5nZWQoKTsKICAgICAgICB2b2lkIHNldEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgQ1NTKiBjc3MoKSB7IHJldHVybiAmbV9j
c3M7IH0KCiAgICBjbGFzcyBUaW1lbGluZSB7CiAgICBwdWJsaWM6CiAgICAgICAgVGltZWxpbmUo
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAg
ICAgICB2b2lkIGV2ZW50UmVjb3JkZWQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpUaW1lbGlu
ZTo6VGltZWxpbmVFdmVudD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVjb3JkKTsK
ICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAg
VGltZWxpbmUqIHRpbWVsaW5lKCkgeyByZXR1cm4gJm1fdGltZWxpbmU7IH0KCiNpZiBFTkFCTEUo
SkFWQVNDUklQVF9ERUJVR0dFUikKICAgIGNsYXNzIERlYnVnZ2VyIHsKICAgIHB1YmxpYzoKICAg
ICAgICBEZWJ1Z2dlcihJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwpIHsgfQogICAgICAgIHZvaWQgZ2xvYmFsT2JqZWN0Q2xlYXJlZCgpOwogICAgICAgIHZv
aWQgc2NyaXB0UGFyc2VkKC8qY29uc3QgVHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpTY3JpcHRJZCYq
LyBjb25zdCBTdHJpbmcmIHNjcmlwdElkLCBjb25zdCBTdHJpbmcmIHVybCwgaW50IHN0YXJ0TGlu
ZSwgaW50IHN0YXJ0Q29sdW1uLCBpbnQgZW5kTGluZSwgaW50IGVuZENvbHVtbiwgY29uc3QgYm9v
bCogY29uc3QgaXNDb250ZW50U2NyaXB0LCBjb25zdCBTdHJpbmcmIHNvdXJjZU1hcFVSTCk7CiAg
ICAgICAgdm9pZCBzY3JpcHRGYWlsZWRUb1BhcnNlKGNvbnN0IFN0cmluZyYgdXJsLCBjb25zdCBT
dHJpbmcmIHNjcmlwdFNvdXJjZSwgaW50IHN0YXJ0TGluZSwgaW50IGVycm9yTGluZSwgY29uc3Qg
U3RyaW5nJiBlcnJvck1lc3NhZ2UpOwogICAgICAgIHZvaWQgYnJlYWtwb2ludFJlc29sdmVkKC8q
Y29uc3QgVHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpCcmVha3BvaW50SWQmKi8gY29uc3QgU3RyaW5n
JiBicmVha3BvaW50SWQsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RGVidWdnZXI6OkxvY2F0
aW9uPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBsb2NhdGlvbik7CiAgICAgICAgLy8g
TmFtZWQgYWZ0ZXIgcGFyYW1ldGVyIG5hbWUgJ2NhbGxGcmFtZXMnIHdoaWxlIGdlbmVyYXRpbmcg
ZXZlbnQgcGF1c2VkLgogICAgICAgIGNsYXNzIENhbGxGcmFtZXMgOiBwdWJsaWMgSW5zcGVjdG9y
QXJyYXkgewogICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgIENhbGxGcmFtZXMoKSB7IH0KCiAg
ICAgICAgcHVibGljOgogICAgICAgICAgICB2b2lkIGFkZEl0ZW0oLypQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpEZWJ1Z2dlcjo6Q2FsbEZyYW1lPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhpcy0+cHVzaE9iamVjdCh2
YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPENhbGxG
cmFtZXM+IGNyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2Fs
bEZyYW1lcygpKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIC8vIE5hbWVkIGFm
dGVyIHBhcmFtZXRlciBuYW1lICdyZWFzb24nIHdoaWxlIGdlbmVyYXRpbmcgZXZlbnQgcGF1c2Vk
LgogICAgICAgIHN0cnVjdCBSZWFzb24gewogICAgICAgICAgICBlbnVtIEVudW0gewogICAgICAg
ICAgICAgICAgWEhSID0gNSwKICAgICAgICAgICAgICAgIERPTSA9IDYwLAogICAgICAgICAgICAg
ICAgRXZlbnRMaXN0ZW5lciA9IDYxLAogICAgICAgICAgICAgICAgRXhjZXB0aW9uID0gNjIsCiAg
ICAgICAgICAgICAgICBPdGhlciA9IDI1LAogICAgICAgICAgICB9OwogICAgICAgIH07IC8vIHN0
cnVjdCBSZWFzb24KCiAgICAgICAgdm9pZCBwYXVzZWQoLypQYXNzUmVmUHRyPENhbGxGcmFtZXM+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gY2FsbEZyYW1lcywgLypSZWFzb246OkVudW0q
LyBjb25zdCBTdHJpbmcmIHJlYXNvbiwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRhdGEp
OwogICAgICAgIHZvaWQgcmVzdW1lZCgpOwogICAgICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAg
cHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBEZWJ1Z2dlciogZGVidWdnZXIoKSB7IHJldHVybiAm
bV9kZWJ1Z2dlcjsgfQoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQojaWYg
RU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBjbGFzcyBET01EZWJ1Z2dlciB7CiAgICBw
dWJsaWM6CiAgICAgICAgRE9NRGVidWdnZXIoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHBy
aXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgRE9NRGVidWdnZXIqIGRvbWRlYnVnZ2VyKCkgeyByZXR1
cm4gJm1fZG9tZGVidWdnZXI7IH0KCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dF
UikKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQogICAgY2xhc3MgUHJvZmlsZXIgewog
ICAgcHVibGljOgogICAgICAgIFByb2ZpbGVyKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBhZGRQcm9maWxlSGVhZGVyKFBh
c3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBoZWFkZXIpOwogICAgICAgIHZvaWQgYWRkSGVhcFNu
YXBzaG90Q2h1bmsoaW50IHVpZCwgY29uc3QgU3RyaW5nJiBjaHVuayk7CiAgICAgICAgdm9pZCBm
aW5pc2hIZWFwU25hcHNob3QoaW50IHVpZCk7CiAgICAgICAgdm9pZCBzZXRSZWNvcmRpbmdQcm9m
aWxlKGJvb2wgaXNQcm9maWxpbmcpOwogICAgICAgIHZvaWQgcmVzZXRQcm9maWxlcygpOwogICAg
ICAgIHZvaWQgcmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3MoaW50IGRvbmUsIGludCB0b3RhbCk7
CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAg
IFByb2ZpbGVyKiBwcm9maWxlcigpIHsgcmV0dXJuICZtX3Byb2ZpbGVyOyB9CgojZW5kaWYgLy8g
RU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNpZiBFTkFCTEUoV09SS0VSUykKICAgIGNsYXNz
IFdvcmtlciB7CiAgICBwdWJsaWM6CiAgICAgICAgV29ya2VyKEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCB3b3JrZXJDcmVh
dGVkKGludCB3b3JrZXJJZCwgY29uc3QgU3RyaW5nJiB1cmwsIGJvb2wgaW5zcGVjdG9yQ29ubmVj
dGVkKTsKICAgICAgICB2b2lkIHdvcmtlclRlcm1pbmF0ZWQoaW50IHdvcmtlcklkKTsKICAgICAg
ICB2b2lkIGRpc3BhdGNoTWVzc2FnZUZyb21Xb3JrZXIoaW50IHdvcmtlcklkLCBQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gbWVzc2FnZSk7CiAgICAgICAgdm9pZCBkaXNjb25uZWN0ZWRGcm9t
V29ya2VyKCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsg
cmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAg
IEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAg
ICB9OwoKICAgIFdvcmtlciogd29ya2VyKCkgeyByZXR1cm4gJm1fd29ya2VyOyB9CgojZW5kaWYg
Ly8gRU5BQkxFKFdPUktFUlMpCgpwcml2YXRlOgogICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIEluc3BlY3RvciBtX2luc3BlY3RvcjsK
ICAgIE1lbW9yeSBtX21lbW9yeTsKICAgIFBhZ2UgbV9wYWdlOwogICAgUnVudGltZSBtX3J1bnRp
bWU7CiAgICBDb25zb2xlIG1fY29uc29sZTsKICAgIE5ldHdvcmsgbV9uZXR3b3JrOwojaWYgRU5B
QkxFKFNRTF9EQVRBQkFTRSkKICAgIERhdGFiYXNlIG1fZGF0YWJhc2U7CiNlbmRpZiAvLyBFTkFC
TEUoU1FMX0RBVEFCQVNFKQojaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCiAgICBJbmRleGVk
REIgbV9pbmRleGVkZGI7CiNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKICAgIERP
TVN0b3JhZ2UgbV9kb21zdG9yYWdlOwogICAgQXBwbGljYXRpb25DYWNoZSBtX2FwcGxpY2F0aW9u
Y2FjaGU7CiNpZiBFTkFCTEUoRklMRV9TWVNURU0pCiAgICBGaWxlU3lzdGVtIG1fZmlsZXN5c3Rl
bTsKI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgIERPTSBtX2RvbTsKICAgIENTUyBt
X2NzczsKICAgIFRpbWVsaW5lIG1fdGltZWxpbmU7CiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJV
R0dFUikKICAgIERlYnVnZ2VyIG1fZGVidWdnZXI7CiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQ
VF9ERUJVR0dFUikKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQogICAgRE9NRGVidWdn
ZXIgbV9kb21kZWJ1Z2dlcjsKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQoj
aWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBQcm9maWxlciBtX3Byb2ZpbGVyOwoj
ZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNpZiBFTkFCTEUoV09SS0VSUykK
ICAgIFdvcmtlciBtX3dvcmtlcjsKI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJTKQp9OwoKI2VuZGlm
IC8vIEVOQUJMRShJTlNQRUNUT1IpCgp9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiNlbmRpZiAvLyAh
ZGVmaW5lZChJbnNwZWN0b3JGcm9udGVuZF9oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>124454</attachid>
            <date>2012-01-28 15:05:17 -0800</date>
            <delta_ts>2012-01-28 15:05:17 -0800</delta_ts>
            <desc>Original InspectorFrontend.cpp</desc>
            <filename>InspectorFrontend.base.cpp</filename>
            <type>text/plain</type>
            <size>42846</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgoKCiNpbmNsdWRlICJjb25maWcuaCIKI2lmIEVOQUJMRShJTlNQRUNU
T1IpCgojaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKI2luY2x1ZGUgPHd0Zi90ZXh0L1dU
RlN0cmluZy5oPgojaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgoKI2luY2x1ZGUgIkluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbC5oIgojaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCiNpbmNs
dWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KCm5hbWVzcGFjZSBXZWJDb3JlIHsKCkluc3BlY3Rv
ckZyb250ZW5kOjpJbnNwZWN0b3JGcm9udGVuZChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwo
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgLCBtX2luc3BlY3RvcihpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAsIG1fbWVtb3J5KGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAg
ICwgbV9wYWdlKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICwgbV9ydW50aW1lKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICwgbV9jb25zb2xlKGluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkKICAgICwgbV9uZXR3b3JrKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKI2lmIEVOQUJM
RShTUUxfREFUQUJBU0UpCiAgICAsIG1fZGF0YWJhc2UoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KQojZW5kaWYgLy8gRU5BQkxFKFNRTF9EQVRBQkFTRSkKI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFC
QVNFKQogICAgLCBtX2luZGV4ZWRkYihpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiNlbmRpZiAv
LyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKICAgICwgbV9kb21zdG9yYWdlKGluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCkKICAgICwgbV9hcHBsaWNhdGlvbmNhY2hlKGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgICwgbV9maWxlc3lzdGVtKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkKI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgICwg
bV9kb20oaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgLCBtX2NzcyhpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAsIG1fdGltZWxpbmUoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQoj
aWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICAsIG1fZGVidWdnZXIoaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKQojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNp
ZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgICwgbV9kb21kZWJ1Z2dlcihpbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikK
I2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQogICAgLCBtX3Byb2ZpbGVyKGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQoj
aWYgRU5BQkxFKFdPUktFUlMpCiAgICAsIG1fd29ya2VyKGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkKI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJTKQp7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6
Okluc3BlY3Rvcjo6ZXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZChpbnQgdGVzdENhbGxJZCwgY29u
c3QgU3RyaW5nJiBzY3JpcHQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGV2YWx1YXRl
Rm9yVGVzdEluRnJvbnRlbmRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IGV2YWx1YXRlRm9yVGVzdEluRnJvbnRlbmRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJJ
bnNwZWN0b3IuZXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZCIpOwogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBh
cmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0ZXN0Q2FsbElkIiwgdGVzdENhbGxJZCk7CiAgICBwYXJh
bXNPYmplY3QtPnNldFN0cmluZygic2NyaXB0Iiwgc2NyaXB0KTsKICAgIGV2YWx1YXRlRm9yVGVz
dEluRnJvbnRlbmRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChldmFsdWF0ZUZvclRlc3RJbkZyb250
ZW5kTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpJ
bnNwZWN0b3I6Omluc3BlY3QoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1v
dGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdCwgUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGhpbnRzKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBp
bnNwZWN0TWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBpbnNwZWN0TWVz
c2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiSW5zcGVjdG9yLmluc3BlY3QiKTsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgib2JqZWN0Iiwgb2JqZWN0KTsKICAgIHBh
cmFtc09iamVjdC0+c2V0T2JqZWN0KCJoaW50cyIsIGhpbnRzKTsKICAgIGluc3BlY3RNZXNzYWdl
LT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRN
ZXNzYWdlVG9Gcm9udGVuZChpbnNwZWN0TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lk
IEluc3BlY3RvckZyb250ZW5kOjpJbnNwZWN0b3I6OmRpZENyZWF0ZVdvcmtlcihpbnQgaWQsIGNv
bnN0IFN0cmluZyYgdXJsLCBib29sIGlzU2hhcmVkKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBkaWRDcmVhdGVXb3JrZXJNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIGRpZENyZWF0ZVdvcmtlck1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkluc3BlY3Rv
ci5kaWRDcmVhdGVXb3JrZXIiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09i
amVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51
bWJlcigiaWQiLCBpZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygidXJsIiwgdXJsKTsK
ICAgIHBhcmFtc09iamVjdC0+c2V0Qm9vbGVhbigiaXNTaGFyZWQiLCBpc1NoYXJlZCk7CiAgICBk
aWRDcmVhdGVXb3JrZXJNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7
CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChkaWRDcmVhdGVXb3JrZXJNZXNz
YWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Okluc3BlY3Rv
cjo6ZGlkRGVzdHJveVdvcmtlcihpbnQgaWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJJbnNwZWN0b3Iu
ZGlkRGVzdHJveVdvcmtlciIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2Jq
ZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVt
YmVyKCJpZCIsIGlkKTsKICAgIGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlLT5zZXRPYmplY3QoInBh
cmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
CiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVu
ZChkaWREZXN0cm95V29ya2VyTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3Bl
Y3RvckZyb250ZW5kOjpQYWdlOjpkb21Db250ZW50RXZlbnRGaXJlZChkb3VibGUgdGltZXN0YW1w
KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBkb21Db250ZW50RXZlbnRGaXJlZE1lc3Nh
Z2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgZG9tQ29udGVudEV2ZW50RmlyZWRN
ZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJQYWdlLmRvbUNvbnRlbnRFdmVudEZpcmVkIik7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIsIHRp
bWVzdGFtcCk7CiAgICBkb21Db250ZW50RXZlbnRGaXJlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFy
YW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkK
ICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5k
KGRvbUNvbnRlbnRFdmVudEZpcmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIElu
c3BlY3RvckZyb250ZW5kOjpQYWdlOjpsb2FkRXZlbnRGaXJlZChkb3VibGUgdGltZXN0YW1wKQp7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBsb2FkRXZlbnRGaXJlZE1lc3NhZ2UgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgbG9hZEV2ZW50RmlyZWRNZXNzYWdlLT5zZXRTdHJp
bmcoIm1ldGhvZCIsICJQYWdlLmxvYWRFdmVudEZpcmVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAgICBsb2FkRXZl
bnRGaXJlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlm
IChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGxvYWRFdmVudEZpcmVkTWVzc2FnZS0+dG9K
U09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpQYWdlOjpmcmFtZU5hdmln
YXRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlBhZ2U6OkZyYW1lPiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBmcmFtZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZnJh
bWVOYXZpZ2F0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGZyYW1l
TmF2aWdhdGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiUGFnZS5mcmFtZU5hdmlnYXRl
ZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9y
T2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJmcmFtZSIsIGZy
YW1lKTsKICAgIGZyYW1lTmF2aWdhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJh
bXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZnJhbWVOYXZp
Z2F0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6
OlBhZ2U6OmZyYW1lRGV0YWNoZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJ
ZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGZyYW1lRGV0YWNoZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGZy
YW1lRGV0YWNoZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJQYWdlLmZyYW1lRGV0YWNo
ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygiZnJhbWVJZCIs
IGZyYW1lSWQpOwogICAgZnJhbWVEZXRhY2hlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwg
cGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAg
ICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGZyYW1l
RGV0YWNoZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRl
bmQ6OkNvbnNvbGU6Om1lc3NhZ2VBZGRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNvbnNv
bGU6OkNvbnNvbGVNZXNzYWdlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdl
KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlQWRkZWRNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIG1lc3NhZ2VBZGRlZE1lc3NhZ2UtPnNldFN0cmlu
ZygibWV0aG9kIiwgIkNvbnNvbGUubWVzc2FnZUFkZGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXRPYmplY3QoIm1lc3NhZ2UiLCBtZXNzYWdlKTsKICAgIG1lc3NhZ2VBZGRl
ZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKG1lc3NhZ2VBZGRlZE1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6Q29uc29sZTo6bWVzc2FnZVJlcGVhdENv
dW50VXBkYXRlZChpbnQgY291bnQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3Nh
Z2VSZXBlYXRDb3VudFVwZGF0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIG1lc3NhZ2VSZXBlYXRDb3VudFVwZGF0ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIs
ICJDb25zb2xlLm1lc3NhZ2VSZXBlYXRDb3VudFVwZGF0ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBw
YXJhbXNPYmplY3QtPnNldE51bWJlcigiY291bnQiLCBjb3VudCk7CiAgICBtZXNzYWdlUmVwZWF0
Q291bnRVcGRhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwog
ICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobWVzc2FnZVJlcGVhdENvdW50VXBk
YXRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6
Q29uc29sZTo6bWVzc2FnZXNDbGVhcmVkKCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bWVzc2FnZXNDbGVhcmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBt
ZXNzYWdlc0NsZWFyZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJDb25zb2xlLm1lc3Nh
Z2VzQ2xlYXJlZCIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAg
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobWVzc2Fn
ZXNDbGVhcmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250
ZW5kOjpOZXR3b3JrOjpyZXF1ZXN0V2lsbEJlU2VudCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3
b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIC8qY29uc3QgVHlwZUJ1
aWxkZXI6Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCAvKmNvbnN0
IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpMb2FkZXJJZCYqLyBjb25zdCBTdHJpbmcmIGxvYWRlcklk
LCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5l
dHdvcms6OlJlcXVlc3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcXVlc3QsIGRv
dWJsZSB0aW1lc3RhbXAsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6SW5pdGlh
dG9yPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBpbml0aWF0b3IsIC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6Q29uc29sZTo6U3RhY2tUcmFjZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiBzdGFja1RyYWNlLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJl
c3BvbnNlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZWRpcmVjdFJlc3BvbnNlKQp7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXF1ZXN0V2lsbEJlU2VudE1lc3NhZ2UgPSBJ
bnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcmVxdWVzdFdpbGxCZVNlbnRNZXNzYWdlLT5z
ZXRTdHJpbmcoIm1ldGhvZCIsICJOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50Iik7CiAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7
CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygiZnJhbWVJZCIsIGZyYW1lSWQpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXRTdHJpbmcoImxvYWRlcklkIiwgbG9hZGVySWQpOwogICAgcGFyYW1zT2Jq
ZWN0LT5zZXRTdHJpbmcoImRvY3VtZW50VVJMIiwgZG9jdW1lbnRVUkwpOwogICAgcGFyYW1zT2Jq
ZWN0LT5zZXRPYmplY3QoInJlcXVlc3QiLCByZXF1ZXN0KTsKICAgIHBhcmFtc09iamVjdC0+c2V0
TnVtYmVyKCJ0aW1lc3RhbXAiLCB0aW1lc3RhbXApOwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmpl
Y3QoImluaXRpYXRvciIsIGluaXRpYXRvcik7CiAgICBpZiAoc3RhY2tUcmFjZSkKICAgICAgICBw
YXJhbXNPYmplY3QtPnNldEFycmF5KCJzdGFja1RyYWNlIiwgc3RhY2tUcmFjZSk7CiAgICBpZiAo
cmVkaXJlY3RSZXNwb25zZSkKICAgICAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgicmVkaXJl
Y3RSZXNwb25zZSIsIHJlZGlyZWN0UmVzcG9uc2UpOwogICAgcmVxdWVzdFdpbGxCZVNlbnRNZXNz
YWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNl
bmRNZXNzYWdlVG9Gcm9udGVuZChyZXF1ZXN0V2lsbEJlU2VudE1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0d29yazo6cmVxdWVzdFNlcnZlZEZy
b21DYWNoZSgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3Qg
U3RyaW5nJiByZXF1ZXN0SWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcXVlc3RT
ZXJ2ZWRGcm9tQ2FjaGVNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHJl
cXVlc3RTZXJ2ZWRGcm9tQ2FjaGVNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJOZXR3b3Jr
LnJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBh
cmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3Qt
PnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElkKTsKICAgIHJlcXVlc3RTZXJ2ZWRGcm9t
Q2FjaGVNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAo
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXF1ZXN0U2VydmVkRnJvbUNhY2hlTWVzc2Fn
ZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpOZXR3b3JrOjpy
ZXNwb25zZVJlY2VpdmVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYq
LyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6
RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQsIC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5l
dHdvcms6OkxvYWRlcklkJiovIGNvbnN0IFN0cmluZyYgbG9hZGVySWQsIGRvdWJsZSB0aW1lc3Rh
bXAsIC8qVHlwZUJ1aWxkZXI6OlBhZ2U6OlJlc291cmNlVHlwZTo6RW51bSovIGNvbnN0IFN0cmlu
ZyYgdHlwZSwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXNwb25zZT4qLyBQ
YXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2UpCnsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHJlc3BvbnNlUmVjZWl2ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHJlc3BvbnNlUmVjZWl2ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJO
ZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBh
cmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3Qt
PnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0
U3RyaW5nKCJmcmFtZUlkIiwgZnJhbWVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygi
bG9hZGVySWQiLCBsb2FkZXJJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigidGltZXN0
YW1wIiwgdGltZXN0YW1wKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdHlw
ZSk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgicmVzcG9uc2UiLCByZXNwb25zZSk7CiAg
ICByZXNwb25zZVJlY2VpdmVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmpl
Y3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVzcG9uc2VSZWNlaXZl
ZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0
d29yazo6ZGF0YVJlY2VpdmVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJ
ZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRpbWVzdGFtcCwgaW50IGRhdGFM
ZW5ndGgsIGludCBlbmNvZGVkRGF0YUxlbmd0aCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gZGF0YVJlY2VpdmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBk
YXRhUmVjZWl2ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJOZXR3b3JrLmRhdGFSZWNl
aXZlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVj
dG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJyZXF1ZXN0
SWQiLCByZXF1ZXN0SWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIs
IHRpbWVzdGFtcCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigiZGF0YUxlbmd0aCIsIGRh
dGFMZW5ndGgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoImVuY29kZWREYXRhTGVuZ3Ro
IiwgZW5jb2RlZERhdGFMZW5ndGgpOwogICAgZGF0YVJlY2VpdmVkTWVzc2FnZS0+c2V0T2JqZWN0
KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJv
bnRlbmQoZGF0YVJlY2VpdmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3Bl
Y3RvckZyb250ZW5kOjpOZXR3b3JrOjpsb2FkaW5nRmluaXNoZWQoLypjb25zdCBUeXBlQnVpbGRl
cjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUg
dGltZXN0YW1wKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBsb2FkaW5nRmluaXNoZWRN
ZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGxvYWRpbmdGaW5pc2hlZE1l
c3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIk5ldHdvcmsubG9hZGluZ0ZpbmlzaGVkIik7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6
OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlcXVlc3RJZCIsIHJlcXVl
c3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigidGltZXN0YW1wIiwgdGltZXN0YW1w
KTsKICAgIGxvYWRpbmdGaW5pc2hlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1z
T2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGxvYWRpbmdGaW5p
c2hlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6
TmV0d29yazo6bG9hZGluZ0ZhaWxlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1
ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXAsIGNvbnN0
IFN0cmluZyYgZXJyb3JUZXh0LCBjb25zdCBib29sKiBjb25zdCBjYW5jZWxlZCkKewogICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gbG9hZGluZ0ZhaWxlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgbG9hZGluZ0ZhaWxlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9k
IiwgIk5ldHdvcmsubG9hZGluZ0ZhaWxlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVj
dC0+c2V0U3RyaW5nKCJyZXF1ZXN0SWQiLCByZXF1ZXN0SWQpOwogICAgcGFyYW1zT2JqZWN0LT5z
ZXROdW1iZXIoInRpbWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0
cmluZygiZXJyb3JUZXh0IiwgZXJyb3JUZXh0KTsKICAgIGlmIChjYW5jZWxlZCkKICAgICAgICBw
YXJhbXNPYmplY3QtPnNldEJvb2xlYW4oImNhbmNlbGVkIiwgKmNhbmNlbGVkKTsKICAgIGxvYWRp
bmdGYWlsZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBp
ZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChsb2FkaW5nRmFpbGVkTWVzc2FnZS0+dG9K
U09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpOZXR3b3JrOjpyZXF1ZXN0
U2VydmVkRnJvbU1lbW9yeUNhY2hlKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVl
c3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0
d29yazo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQsIC8qY29uc3QgVHlwZUJ1aWxk
ZXI6Ok5ldHdvcms6OkxvYWRlcklkJiovIGNvbnN0IFN0cmluZyYgbG9hZGVySWQsIGNvbnN0IFN0
cmluZyYgZG9jdW1lbnRVUkwsIGRvdWJsZSB0aW1lc3RhbXAsIC8qUGFzc1JlZlB0cjxUeXBlQnVp
bGRlcjo6TmV0d29yazo6SW5pdGlhdG9yPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBp
bml0aWF0b3IsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6Q2FjaGVkUmVzb3Vy
Y2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc291cmNlKQp7CiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiByZXF1ZXN0U2VydmVkRnJvbU1lbW9yeUNhY2hlTWVzc2FnZSA9IElu
c3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICByZXF1ZXN0U2VydmVkRnJvbU1lbW9yeUNhY2hl
TWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbU1l
bW9yeUNhY2hlIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJ
bnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJl
cXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygiZnJhbWVJ
ZCIsIGZyYW1lSWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoImxvYWRlcklkIiwgbG9h
ZGVySWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoImRvY3VtZW50VVJMIiwgZG9jdW1l
bnRVUkwpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIsIHRpbWVzdGFt
cCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgiaW5pdGlhdG9yIiwgaW5pdGlhdG9yKTsK
ICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJyZXNvdXJjZSIsIHJlc291cmNlKTsKICAgIHJl
cXVlc3RTZXJ2ZWRGcm9tTWVtb3J5Q2FjaGVNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBh
cmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXF1ZXN0
U2VydmVkRnJvbU1lbW9yeUNhY2hlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIElu
c3BlY3RvckZyb250ZW5kOjpOZXR3b3JrOjp3ZWJTb2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVl
c3QoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmlu
ZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
Ok5ldHdvcms6OldlYlNvY2tldFJlcXVlc3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHJlcXVlc3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHdlYlNvY2tldFdpbGxTZW5k
SGFuZHNoYWtlUmVxdWVzdE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
d2ViU29ja2V0V2lsbFNlbmRIYW5kc2hha2VSZXF1ZXN0TWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRo
b2QiLCAiTmV0d29yay53ZWJTb2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3QiKTsKICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElk
KTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0aW1lc3RhbXAiLCB0aW1lc3RhbXApOwog
ICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoInJlcXVlc3QiLCByZXF1ZXN0KTsKICAgIHdlYlNv
Y2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwg
cGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAg
ICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHdlYlNv
Y2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoK
dm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0d29yazo6d2ViU29ja2V0SGFuZHNoYWtlUmVzcG9u
c2VSZWNlaXZlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29u
c3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXAsIC8qUGFzc1JlZlB0cjxUeXBl
QnVpbGRlcjo6TmV0d29yazo6V2ViU29ja2V0UmVzcG9uc2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHJlc3BvbnNlKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB3ZWJTb2Nr
ZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICB3ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkTWVzc2FnZS0+c2V0
U3RyaW5nKCJtZXRob2QiLCAiTmV0d29yay53ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2Vp
dmVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0
b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlcXVlc3RJ
ZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigidGltZXN0YW1wIiwg
dGltZXN0YW1wKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJyZXNwb25zZSIsIHJlc3Bv
bnNlKTsKICAgIHdlYlNvY2tldEhhbmRzaGFrZVJlc3BvbnNlUmVjZWl2ZWRNZXNzYWdlLT5zZXRP
YmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdl
VG9Gcm9udGVuZCh3ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkTWVzc2FnZS0+dG9K
U09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpOZXR3b3JrOjp3ZWJTb2Nr
ZXRDcmVhdGVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25z
dCBTdHJpbmcmIHJlcXVlc3RJZCwgY29uc3QgU3RyaW5nJiB1cmwpCnsKICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHdlYlNvY2tldENyZWF0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0Ojpj
cmVhdGUoKTsKICAgIHdlYlNvY2tldENyZWF0ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIs
ICJOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmpl
Y3QtPnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElkKTsKICAgIHBhcmFtc09iamVjdC0+
c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwogICAgd2ViU29ja2V0Q3JlYXRlZE1lc3NhZ2UtPnNldE9i
amVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKHdlYlNvY2tldENyZWF0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZv
aWQgSW5zcGVjdG9yRnJvbnRlbmQ6Ok5ldHdvcms6OndlYlNvY2tldENsb3NlZCgvKmNvbnN0IFR5
cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQs
IGRvdWJsZSB0aW1lc3RhbXApCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHdlYlNvY2tl
dENsb3NlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgd2ViU29ja2V0
Q2xvc2VkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiTmV0d29yay53ZWJTb2NrZXRDbG9z
ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygicmVxdWVzdElk
IiwgcmVxdWVzdElkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0aW1lc3RhbXAiLCB0
aW1lc3RhbXApOwogICAgd2ViU29ja2V0Q2xvc2VkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMi
LCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAg
ICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQod2Vi
U29ja2V0Q2xvc2VkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9CgojaWYgRU5BQkxFKFNRTF9E
QVRBQkFTRSkKCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRhdGFiYXNlOjphZGREYXRhYmFzZSgv
KlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRhdGFiYXNlOjpEYXRhYmFzZT4qLyBQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gZGF0YWJhc2UpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGFkZERhdGFiYXNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBhZGRE
YXRhYmFzZU1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRhdGFiYXNlLmFkZERhdGFiYXNl
Iik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoImRhdGFiYXNlIiwg
ZGF0YWJhc2UpOwogICAgYWRkRGF0YWJhc2VNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBh
cmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChhZGREYXRh
YmFzZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6
RGF0YWJhc2U6OnNxbFRyYW5zYWN0aW9uU3VjY2VlZGVkKGludCB0cmFuc2FjdGlvbklkLCAvKlBh
c3NSZWZQdHI8Q29sdW1uTmFtZXM+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gY29sdW1u
TmFtZXMsIC8qUGFzc1JlZlB0cjxWYWx1ZXM+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4g
dmFsdWVzKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBzcWxUcmFuc2FjdGlvblN1Y2Nl
ZWRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgc3FsVHJhbnNhY3Rp
b25TdWNjZWVkZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJEYXRhYmFzZS5zcWxUcmFu
c2FjdGlvblN1Y2NlZWRlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2Jq
ZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVt
YmVyKCJ0cmFuc2FjdGlvbklkIiwgdHJhbnNhY3Rpb25JZCk7CiAgICBwYXJhbXNPYmplY3QtPnNl
dEFycmF5KCJjb2x1bW5OYW1lcyIsIGNvbHVtbk5hbWVzKTsKICAgIHBhcmFtc09iamVjdC0+c2V0
QXJyYXkoInZhbHVlcyIsIHZhbHVlcyk7CiAgICBzcWxUcmFuc2FjdGlvblN1Y2NlZWRlZE1lc3Nh
Z2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2Vu
ZE1lc3NhZ2VUb0Zyb250ZW5kKHNxbFRyYW5zYWN0aW9uU3VjY2VlZGVkTWVzc2FnZS0+dG9KU09O
U3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpEYXRhYmFzZTo6c3FsVHJhbnNh
Y3Rpb25GYWlsZWQoaW50IHRyYW5zYWN0aW9uSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBzcWxFcnJvcikKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc3FsVHJhbnNhY3Rpb25G
YWlsZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHNxbFRyYW5zYWN0
aW9uRmFpbGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRGF0YWJhc2Uuc3FsVHJhbnNh
Y3Rpb25GYWlsZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigi
dHJhbnNhY3Rpb25JZCIsIHRyYW5zYWN0aW9uSWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmpl
Y3QoInNxbEVycm9yIiwgc3FsRXJyb3IpOwogICAgc3FsVHJhbnNhY3Rpb25GYWlsZWRNZXNzYWdl
LT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRN
ZXNzYWdlVG9Gcm9udGVuZChzcWxUcmFuc2FjdGlvbkZhaWxlZE1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKfQoKI2VuZGlmIC8vIEVOQUJMRShTUUxfREFUQUJBU0UpCgojaWYgRU5BQkxFKElOREVY
RURfREFUQUJBU0UpCgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpJbmRleGVkREI6OmRhdGFiYXNl
TmFtZXNMb2FkZWQoZG91YmxlIHJlcXVlc3RJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpJ
bmRleGVkREI6OlNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXM+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXMpCnsKICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRhdGFiYXNlTmFtZXNMb2FkZWRNZXNzYWdlID0gSW5zcGVj
dG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGRhdGFiYXNlTmFtZXNMb2FkZWRNZXNzYWdlLT5zZXRT
dHJpbmcoIm1ldGhvZCIsICJJbmRleGVkREIuZGF0YWJhc2VOYW1lc0xvYWRlZCIpOwogICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJyZXF1ZXN0SWQiLCByZXF1ZXN0SWQp
OwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoInNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNl
TmFtZXMiLCBzZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzKTsKICAgIGRhdGFiYXNlTmFt
ZXNMb2FkZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBp
ZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChkYXRhYmFzZU5hbWVzTG9hZGVkTWVzc2Fn
ZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpJbmRleGVkREI6
OmRhdGFiYXNlTG9hZGVkKGludCByZXF1ZXN0SWQsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
SW5kZXhlZERCOjpEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IGRhdGFiYXNlV2l0aE9iamVjdFN0b3JlcykKewogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gZGF0YWJhc2VMb2FkZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUo
KTsKICAgIGRhdGFiYXNlTG9hZGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiSW5kZXhl
ZERCLmRhdGFiYXNlTG9hZGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNP
YmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRO
dW1iZXIoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVj
dCgiZGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzIiwgZGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzKTsK
ICAgIGRhdGFiYXNlTG9hZGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmpl
Y3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZGF0YWJhc2VMb2FkZWRN
ZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCiNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRB
QkFTRSkKCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRPTVN0b3JhZ2U6OmFkZERPTVN0b3JhZ2Uo
LypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET01TdG9yYWdlOjpFbnRyeT4qLyBQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gc3RvcmFnZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
YWRkRE9NU3RvcmFnZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgYWRk
RE9NU3RvcmFnZU1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRPTVN0b3JhZ2UuYWRkRE9N
U3RvcmFnZSIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJzdG9y
YWdlIiwgc3RvcmFnZSk7CiAgICBhZGRET01TdG9yYWdlTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJh
bXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQog
ICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQo
YWRkRE9NU3RvcmFnZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JG
cm9udGVuZDo6RE9NU3RvcmFnZTo6dXBkYXRlRE9NU3RvcmFnZShpbnQgc3RvcmFnZUlkKQp7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB1cGRhdGVET01TdG9yYWdlTWVzc2FnZSA9IEluc3Bl
Y3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICB1cGRhdGVET01TdG9yYWdlTWVzc2FnZS0+c2V0U3Ry
aW5nKCJtZXRob2QiLCAiRE9NU3RvcmFnZS51cGRhdGVET01TdG9yYWdlIik7CiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInN0b3JhZ2VJZCIsIHN0b3JhZ2VJZCk7CiAg
ICB1cGRhdGVET01TdG9yYWdlTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmpl
Y3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQodXBkYXRlRE9NU3RvcmFn
ZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6QXBw
bGljYXRpb25DYWNoZTo6YXBwbGljYXRpb25DYWNoZVN0YXR1c1VwZGF0ZWQoLypjb25zdCBUeXBl
QnVpbGRlcjo6TmV0d29yazo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQsIGNvbnN0
IFN0cmluZyYgbWFuaWZlc3RVUkwsIGludCBzdGF0dXMpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IGFwcGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkTWVzc2FnZSA9IEluc3BlY3Rvck9i
amVjdDo6Y3JlYXRlKCk7CiAgICBhcHBsaWNhdGlvbkNhY2hlU3RhdHVzVXBkYXRlZE1lc3NhZ2Ut
PnNldFN0cmluZygibWV0aG9kIiwgIkFwcGxpY2F0aW9uQ2FjaGUuYXBwbGljYXRpb25DYWNoZVN0
YXR1c1VwZGF0ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygi
ZnJhbWVJZCIsIGZyYW1lSWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoIm1hbmlmZXN0
VVJMIiwgbWFuaWZlc3RVUkwpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInN0YXR1cyIs
IHN0YXR1cyk7CiAgICBhcHBsaWNhdGlvbkNhY2hlU3RhdHVzVXBkYXRlZE1lc3NhZ2UtPnNldE9i
amVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKGFwcGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkTWVzc2FnZS0+dG9KU09OU3Ry
aW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpBcHBsaWNhdGlvbkNhY2hlOjpuZXR3
b3JrU3RhdGVVcGRhdGVkKGJvb2wgaXNOb3dPbmxpbmUpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG5ldHdvcmtTdGF0ZVVwZGF0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIG5ldHdvcmtTdGF0ZVVwZGF0ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIs
ICJBcHBsaWNhdGlvbkNhY2hlLm5ldHdvcmtTdGF0ZVVwZGF0ZWQiKTsKICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAg
ICBwYXJhbXNPYmplY3QtPnNldEJvb2xlYW4oImlzTm93T25saW5lIiwgaXNOb3dPbmxpbmUpOwog
ICAgbmV0d29ya1N0YXRlVXBkYXRlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1z
T2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKG5ldHdvcmtTdGF0
ZVVwZGF0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCiNpZiBFTkFCTEUoRklMRV9TWVNU
RU0pCgojZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQoKdm9pZCBJbnNwZWN0b3JGcm9udGVu
ZDo6RE9NOjpkb2N1bWVudFVwZGF0ZWQoKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBk
b2N1bWVudFVwZGF0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGRv
Y3VtZW50VXBkYXRlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRPTS5kb2N1bWVudFVw
ZGF0ZWQiKTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGRvY3VtZW50VXBk
YXRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6
RE9NOjpzZXRDaGlsZE5vZGVzKGludCBwYXJlbnRJZCwgLypQYXNzUmVmUHRyPE5vZGVzPiovIFBh
c3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IG5vZGVzKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBzZXRDaGlsZE5vZGVzTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAg
ICBzZXRDaGlsZE5vZGVzTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NLnNldENoaWxk
Tm9kZXMiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3Bl
Y3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigicGFyZW50
SWQiLCBwYXJlbnRJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldEFycmF5KCJub2RlcyIsIG5vZGVz
KTsKICAgIHNldENoaWxkTm9kZXNNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09i
amVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChzZXRDaGlsZE5vZGVz
TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpET006
OmF0dHJpYnV0ZU1vZGlmaWVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXR0cmlidXRlTW9k
aWZpZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGF0dHJpYnV0ZU1v
ZGlmaWVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NLmF0dHJpYnV0ZU1vZGlmaWVk
Iik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoIm5vZGVJZCIsIG5v
ZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygibmFtZSIsIG5hbWUpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwogICAgYXR0cmlidXRlTW9kaWZp
ZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChhdHRyaWJ1dGVNb2RpZmllZE1lc3NhZ2UtPnRvSlNP
TlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6RE9NOjphdHRyaWJ1dGVSZW1v
dmVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSkKewogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gYXR0cmlidXRlUmVtb3ZlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgYXR0cmlidXRlUmVtb3ZlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRP
TS5hdHRyaWJ1dGVSZW1vdmVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNP
YmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRO
dW1iZXIoIm5vZGVJZCIsIG5vZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygibmFt
ZSIsIG5hbWUpOwogICAgYXR0cmlidXRlUmVtb3ZlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1z
IiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAg
ICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGF0
dHJpYnV0ZVJlbW92ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9y
RnJvbnRlbmQ6OkRPTTo6aW5saW5lU3R5bGVJbnZhbGlkYXRlZCgvKlBhc3NSZWZQdHI8Tm9kZUlk
cz4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBub2RlSWRzKQp7CiAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBpbmxpbmVTdHlsZUludmFsaWRhdGVkTWVzc2FnZSA9IEluc3BlY3Rvck9i
amVjdDo6Y3JlYXRlKCk7CiAgICBpbmxpbmVTdHlsZUludmFsaWRhdGVkTWVzc2FnZS0+c2V0U3Ry
aW5nKCJtZXRob2QiLCAiRE9NLmlubGluZVN0eWxlSW52YWxpZGF0ZWQiKTsKICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7
CiAgICBwYXJhbXNPYmplY3QtPnNldEFycmF5KCJub2RlSWRzIiwgbm9kZUlkcyk7CiAgICBpbmxp
bmVTdHlsZUludmFsaWRhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmpl
Y3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoaW5saW5lU3R5bGVJbnZh
bGlkYXRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVu
ZDo6RE9NOjpjaGFyYWN0ZXJEYXRhTW9kaWZpZWQoaW50IG5vZGVJZCwgY29uc3QgU3RyaW5nJiBj
aGFyYWN0ZXJEYXRhKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBjaGFyYWN0ZXJEYXRh
TW9kaWZpZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGNoYXJhY3Rl
ckRhdGFNb2RpZmllZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRPTS5jaGFyYWN0ZXJE
YXRhTW9kaWZpZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigi
bm9kZUlkIiwgbm9kZUlkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJjaGFyYWN0ZXJE
YXRhIiwgY2hhcmFjdGVyRGF0YSk7CiAgICBjaGFyYWN0ZXJEYXRhTW9kaWZpZWRNZXNzYWdlLT5z
ZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNz
YWdlVG9Gcm9udGVuZChjaGFyYWN0ZXJEYXRhTW9kaWZpZWRNZXNzYWdlLT50b0pTT05TdHJpbmco
KSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRPTTo6Y2hpbGROb2RlQ291bnRVcGRhdGVk
KGludCBub2RlSWQsIGludCBjaGlsZE5vZGVDb3VudCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gY2hpbGROb2RlQ291bnRVcGRhdGVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICBjaGlsZE5vZGVDb3VudFVwZGF0ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhv
ZCIsICJET00uY2hpbGROb2RlQ291bnRVcGRhdGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1z
T2JqZWN0LT5zZXROdW1iZXIoIm5vZGVJZCIsIG5vZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNl
dE51bWJlcigiY2hpbGROb2RlQ291bnQiLCBjaGlsZE5vZGVDb3VudCk7CiAgICBjaGlsZE5vZGVD
b3VudFVwZGF0ZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChjaGlsZE5vZGVDb3VudFVwZGF0ZWRN
ZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRPTTo6
Y2hpbGROb2RlSW5zZXJ0ZWQoaW50IHBhcmVudE5vZGVJZCwgaW50IHByZXZpb3VzTm9kZUlkLCAv
KlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRPTTo6Tm9kZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gbm9kZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gY2hpbGROb2RlSW5z
ZXJ0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGNoaWxkTm9kZUlu
c2VydGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NLmNoaWxkTm9kZUluc2VydGVk
Iik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInBhcmVudE5vZGVJ
ZCIsIHBhcmVudE5vZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigicHJldmlvdXNO
b2RlSWQiLCBwcmV2aW91c05vZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgibm9k
ZSIsIG5vZGUpOwogICAgY2hpbGROb2RlSW5zZXJ0ZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFt
cyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAg
ICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChj
aGlsZE5vZGVJbnNlcnRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0
b3JGcm9udGVuZDo6RE9NOjpjaGlsZE5vZGVSZW1vdmVkKGludCBwYXJlbnROb2RlSWQsIGludCBu
b2RlSWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGNoaWxkTm9kZVJlbW92ZWRNZXNz
YWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGNoaWxkTm9kZVJlbW92ZWRNZXNz
YWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJET00uY2hpbGROb2RlUmVtb3ZlZCIpOwogICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJwYXJlbnROb2RlSWQiLCBwYXJlbnRO
b2RlSWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoIm5vZGVJZCIsIG5vZGVJZCk7CiAg
ICBjaGlsZE5vZGVSZW1vdmVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmpl
Y3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoY2hpbGROb2RlUmVtb3Zl
ZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6Q1NT
OjptZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZCgpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IG1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBtZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9k
IiwgIkNTUy5tZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZCIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVz
c2FnZVRvRnJvbnRlbmQobWVkaWFRdWVyeVJlc3VsdENoYW5nZWRNZXNzYWdlLT50b0pTT05TdHJp
bmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OlRpbWVsaW5lOjpldmVudFJlY29yZGVk
KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6VGltZWxpbmU6OlRpbWVsaW5lRXZlbnQ+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlY29yZCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gZXZlbnRSZWNvcmRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgZXZlbnRSZWNvcmRlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIlRpbWVsaW5lLmV2
ZW50UmVjb3JkZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgi
cmVjb3JkIiwgcmVjb3JkKTsKICAgIGV2ZW50UmVjb3JkZWRNZXNzYWdlLT5zZXRPYmplY3QoInBh
cmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
CiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVu
ZChldmVudFJlY29yZGVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9CgojaWYgRU5BQkxFKEpB
VkFTQ1JJUFRfREVCVUdHRVIpCgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpEZWJ1Z2dlcjo6Z2xv
YmFsT2JqZWN0Q2xlYXJlZCgpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGdsb2JhbE9i
amVjdENsZWFyZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGdsb2Jh
bE9iamVjdENsZWFyZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJEZWJ1Z2dlci5nbG9i
YWxPYmplY3RDbGVhcmVkIik7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAg
ICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChn
bG9iYWxPYmplY3RDbGVhcmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3Bl
Y3RvckZyb250ZW5kOjpEZWJ1Z2dlcjo6c2NyaXB0UGFyc2VkKC8qY29uc3QgVHlwZUJ1aWxkZXI6
OkRlYnVnZ2VyOjpTY3JpcHRJZCYqLyBjb25zdCBTdHJpbmcmIHNjcmlwdElkLCBjb25zdCBTdHJp
bmcmIHVybCwgaW50IHN0YXJ0TGluZSwgaW50IHN0YXJ0Q29sdW1uLCBpbnQgZW5kTGluZSwgaW50
IGVuZENvbHVtbiwgY29uc3QgYm9vbCogY29uc3QgaXNDb250ZW50U2NyaXB0LCBjb25zdCBTdHJp
bmcmIHNvdXJjZU1hcFVSTCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc2NyaXB0UGFy
c2VkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBzY3JpcHRQYXJzZWRN
ZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJEZWJ1Z2dlci5zY3JpcHRQYXJzZWQiKTsKICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygic2NyaXB0SWQiLCBzY3JpcHRJ
ZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygidXJsIiwgdXJsKTsKICAgIHBhcmFtc09i
amVjdC0+c2V0TnVtYmVyKCJzdGFydExpbmUiLCBzdGFydExpbmUpOwogICAgcGFyYW1zT2JqZWN0
LT5zZXROdW1iZXIoInN0YXJ0Q29sdW1uIiwgc3RhcnRDb2x1bW4pOwogICAgcGFyYW1zT2JqZWN0
LT5zZXROdW1iZXIoImVuZExpbmUiLCBlbmRMaW5lKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVt
YmVyKCJlbmRDb2x1bW4iLCBlbmRDb2x1bW4pOwogICAgaWYgKGlzQ29udGVudFNjcmlwdCkKICAg
ICAgICBwYXJhbXNPYmplY3QtPnNldEJvb2xlYW4oImlzQ29udGVudFNjcmlwdCIsICppc0NvbnRl
bnRTY3JpcHQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInNvdXJjZU1hcFVSTCIsIHNv
dXJjZU1hcFVSTCk7CiAgICBzY3JpcHRQYXJzZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIs
IHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAg
ICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChzY3Jp
cHRQYXJzZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRl
bmQ6OkRlYnVnZ2VyOjpzY3JpcHRGYWlsZWRUb1BhcnNlKGNvbnN0IFN0cmluZyYgdXJsLCBjb25z
dCBTdHJpbmcmIHNjcmlwdFNvdXJjZSwgaW50IHN0YXJ0TGluZSwgaW50IGVycm9yTGluZSwgY29u
c3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHNj
cmlwdEZhaWxlZFRvUGFyc2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IHNjcmlwdEZhaWxlZFRvUGFyc2VNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJEZWJ1Z2dl
ci5zY3JpcHRGYWlsZWRUb1BhcnNlIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJh
bXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5z
ZXRTdHJpbmcoInVybCIsIHVybCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygic2NyaXB0
U291cmNlIiwgc2NyaXB0U291cmNlKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJzdGFy
dExpbmUiLCBzdGFydExpbmUpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoImVycm9yTGlu
ZSIsIGVycm9yTGluZSk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygiZXJyb3JNZXNzYWdl
IiwgZXJyb3JNZXNzYWdlKTsKICAgIHNjcmlwdEZhaWxlZFRvUGFyc2VNZXNzYWdlLT5zZXRPYmpl
Y3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9G
cm9udGVuZChzY3JpcHRGYWlsZWRUb1BhcnNlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2
b2lkIEluc3BlY3RvckZyb250ZW5kOjpEZWJ1Z2dlcjo6YnJlYWtwb2ludFJlc29sdmVkKC8qY29u
c3QgVHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpCcmVha3BvaW50SWQmKi8gY29uc3QgU3RyaW5nJiBi
cmVha3BvaW50SWQsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RGVidWdnZXI6OkxvY2F0aW9u
PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBsb2NhdGlvbikKewogICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gYnJlYWtwb2ludFJlc29sdmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVj
dDo6Y3JlYXRlKCk7CiAgICBicmVha3BvaW50UmVzb2x2ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1l
dGhvZCIsICJEZWJ1Z2dlci5icmVha3BvaW50UmVzb2x2ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBw
YXJhbXNPYmplY3QtPnNldFN0cmluZygiYnJlYWtwb2ludElkIiwgYnJlYWtwb2ludElkKTsKICAg
IHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJsb2NhdGlvbiIsIGxvY2F0aW9uKTsKICAgIGJyZWFr
cG9pbnRSZXNvbHZlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsK
ICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGJyZWFrcG9pbnRSZXNvbHZlZE1l
c3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6RGVidWdn
ZXI6OnBhdXNlZCgvKlBhc3NSZWZQdHI8Q2FsbEZyYW1lcz4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiBjYWxsRnJhbWVzLCAvKlJlYXNvbjo6RW51bSovIGNvbnN0IFN0cmluZyYgcmVhc29u
LCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YSkKewogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcGF1c2VkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBw
YXVzZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJEZWJ1Z2dlci5wYXVzZWQiKTsKICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldEFycmF5KCJjYWxsRnJhbWVzIiwgY2FsbEZy
YW1lcyk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygicmVhc29uIiwgcmVhc29uKTsKICAg
IGlmIChkYXRhKQogICAgICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJkYXRhIiwgZGF0YSk7
CiAgICBwYXVzZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChwYXVzZWRNZXNzYWdlLT50b0pTT05T
dHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRlYnVnZ2VyOjpyZXN1bWVkKCkK
ewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzdW1lZE1lc3NhZ2UgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgcmVzdW1lZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwg
IkRlYnVnZ2VyLnJlc3VtZWQiKTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkK
ICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5k
KHJlc3VtZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCiNlbmRpZiAvLyBFTkFCTEUoSkFW
QVNDUklQVF9ERUJVR0dFUikKCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKCiNlbmRp
ZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9E
RUJVR0dFUikKCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OlByb2ZpbGVyOjphZGRQcm9maWxlSGVh
ZGVyKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBoZWFkZXIpCnsKICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IGFkZFByb2ZpbGVIZWFkZXJNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0Ojpj
cmVhdGUoKTsKICAgIGFkZFByb2ZpbGVIZWFkZXJNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIs
ICJQcm9maWxlci5hZGRQcm9maWxlSGVhZGVyIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2Jq
ZWN0LT5zZXRPYmplY3QoImhlYWRlciIsIGhlYWRlcik7CiAgICBhZGRQcm9maWxlSGVhZGVyTWVz
c2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5z
ZW5kTWVzc2FnZVRvRnJvbnRlbmQoYWRkUHJvZmlsZUhlYWRlck1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6UHJvZmlsZXI6OmFkZEhlYXBTbmFwc2hv
dENodW5rKGludCB1aWQsIGNvbnN0IFN0cmluZyYgY2h1bmspCnsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IGFkZEhlYXBTbmFwc2hvdENodW5rTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICBhZGRIZWFwU25hcHNob3RDaHVua01lc3NhZ2UtPnNldFN0cmluZygibWV0
aG9kIiwgIlByb2ZpbGVyLmFkZEhlYXBTbmFwc2hvdENodW5rIik7CiAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
cGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInVpZCIsIHVpZCk7CiAgICBwYXJhbXNPYmplY3QtPnNl
dFN0cmluZygiY2h1bmsiLCBjaHVuayk7CiAgICBhZGRIZWFwU25hcHNob3RDaHVua01lc3NhZ2Ut
PnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1l
c3NhZ2VUb0Zyb250ZW5kKGFkZEhlYXBTbmFwc2hvdENodW5rTWVzc2FnZS0+dG9KU09OU3RyaW5n
KCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpQcm9maWxlcjo6ZmluaXNoSGVhcFNuYXBz
aG90KGludCB1aWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGZpbmlzaEhlYXBTbmFw
c2hvdE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgZmluaXNoSGVhcFNu
YXBzaG90TWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiUHJvZmlsZXIuZmluaXNoSGVhcFNu
YXBzaG90Iik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInVpZCIs
IHVpZCk7CiAgICBmaW5pc2hIZWFwU25hcHNob3RNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIs
IHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAg
ICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChmaW5p
c2hIZWFwU25hcHNob3RNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9y
RnJvbnRlbmQ6OlByb2ZpbGVyOjpzZXRSZWNvcmRpbmdQcm9maWxlKGJvb2wgaXNQcm9maWxpbmcp
CnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHNldFJlY29yZGluZ1Byb2ZpbGVNZXNzYWdl
ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHNldFJlY29yZGluZ1Byb2ZpbGVNZXNz
YWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJQcm9maWxlci5zZXRSZWNvcmRpbmdQcm9maWxlIik7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRCb29sZWFuKCJpc1Byb2ZpbGluZyIs
IGlzUHJvZmlsaW5nKTsKICAgIHNldFJlY29yZGluZ1Byb2ZpbGVNZXNzYWdlLT5zZXRPYmplY3Qo
InBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9u
dGVuZChzZXRSZWNvcmRpbmdQcm9maWxlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lk
IEluc3BlY3RvckZyb250ZW5kOjpQcm9maWxlcjo6cmVzZXRQcm9maWxlcygpCnsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHJlc2V0UHJvZmlsZXNNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0
OjpjcmVhdGUoKTsKICAgIHJlc2V0UHJvZmlsZXNNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIs
ICJQcm9maWxlci5yZXNldFByb2ZpbGVzIik7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9G
cm9udGVuZChyZXNldFByb2ZpbGVzTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIElu
c3BlY3RvckZyb250ZW5kOjpQcm9maWxlcjo6cmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3MoaW50
IGRvbmUsIGludCB0b3RhbCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVwb3J0SGVh
cFNuYXBzaG90UHJvZ3Jlc3NNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IHJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAi
UHJvZmlsZXIucmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3MiKTsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBw
YXJhbXNPYmplY3QtPnNldE51bWJlcigiZG9uZSIsIGRvbmUpOwogICAgcGFyYW1zT2JqZWN0LT5z
ZXROdW1iZXIoInRvdGFsIiwgdG90YWwpOwogICAgcmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3NN
ZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwt
PnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXBvcnRIZWFwU25hcHNob3RQcm9ncmVzc01lc3NhZ2Ut
PnRvSlNPTlN0cmluZygpKTsKfQoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VS
KQoKI2lmIEVOQUJMRShXT1JLRVJTKQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6V29ya2VyOjp3
b3JrZXJDcmVhdGVkKGludCB3b3JrZXJJZCwgY29uc3QgU3RyaW5nJiB1cmwsIGJvb2wgaW5zcGVj
dG9yQ29ubmVjdGVkKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB3b3JrZXJDcmVhdGVk
TWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICB3b3JrZXJDcmVhdGVkTWVz
c2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiV29ya2VyLndvcmtlckNyZWF0ZWQiKTsKICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigid29ya2VySWQiLCB3b3JrZXJJZCk7
CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygidXJsIiwgdXJsKTsKICAgIHBhcmFtc09iamVj
dC0+c2V0Qm9vbGVhbigiaW5zcGVjdG9yQ29ubmVjdGVkIiwgaW5zcGVjdG9yQ29ubmVjdGVkKTsK
ICAgIHdvcmtlckNyZWF0ZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVj
dCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZCh3b3JrZXJDcmVhdGVkTWVz
c2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpXb3JrZXI6
OndvcmtlclRlcm1pbmF0ZWQoaW50IHdvcmtlcklkKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiB3b3JrZXJUZXJtaW5hdGVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7
CiAgICB3b3JrZXJUZXJtaW5hdGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiV29ya2Vy
LndvcmtlclRlcm1pbmF0ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09i
amVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51
bWJlcigid29ya2VySWQiLCB3b3JrZXJJZCk7CiAgICB3b3JrZXJUZXJtaW5hdGVkTWVzc2FnZS0+
c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVz
c2FnZVRvRnJvbnRlbmQod29ya2VyVGVybWluYXRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsK
fQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6V29ya2VyOjpkaXNwYXRjaE1lc3NhZ2VGcm9tV29y
a2VyKGludCB3b3JrZXJJZCwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2UpCnsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRpc3BhdGNoTWVzc2FnZUZyb21Xb3JrZXJNZXNz
YWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGRpc3BhdGNoTWVzc2FnZUZyb21X
b3JrZXJNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJXb3JrZXIuZGlzcGF0Y2hNZXNzYWdl
RnJvbVdvcmtlciIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ3
b3JrZXJJZCIsIHdvcmtlcklkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJtZXNzYWdl
IiwgbWVzc2FnZSk7CiAgICBkaXNwYXRjaE1lc3NhZ2VGcm9tV29ya2VyTWVzc2FnZS0+c2V0T2Jq
ZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRv
RnJvbnRlbmQoZGlzcGF0Y2hNZXNzYWdlRnJvbVdvcmtlck1lc3NhZ2UtPnRvSlNPTlN0cmluZygp
KTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6V29ya2VyOjpkaXNjb25uZWN0ZWRGcm9tV29y
a2VyKCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZGlzY29ubmVjdGVkRnJvbVdvcmtl
ck1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgZGlzY29ubmVjdGVkRnJv
bVdvcmtlck1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIldvcmtlci5kaXNjb25uZWN0ZWRG
cm9tV29ya2VyIik7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChkaXNjb25u
ZWN0ZWRGcm9tV29ya2VyTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9CgojZW5kaWYgLy8gRU5B
QkxFKFdPUktFUlMpCgoKbmFtZXNwYWNlIFR5cGVCdWlsZGVyIHsKCmNvbnN0IGNoYXIqIGNvbnN0
IGVudW1fY29uc3RhbnRfdmFsdWVzW10gPSB7CiAgICAiRG9jdW1lbnQiLAogICAgIlN0eWxlc2hl
ZXQiLAogICAgIkltYWdlIiwKICAgICJGb250IiwKICAgICJTY3JpcHQiLAogICAgIlhIUiIsCiAg
ICAiV2ViU29ja2V0IiwKICAgICJPdGhlciIsCiAgICAib2JqZWN0IiwKICAgICJmdW5jdGlvbiIs
CiAgICAidW5kZWZpbmVkIiwKICAgICJzdHJpbmciLAogICAgIm51bWJlciIsCiAgICAiYm9vbGVh
biIsCiAgICAiYXJyYXkiLAogICAgIm51bGwiLAogICAgIm5vZGUiLAogICAgInJlZ2V4cCIsCiAg
ICAiZGF0ZSIsCiAgICAiaHRtbCIsCiAgICAid21sIiwKICAgICJ4bWwiLAogICAgImphdmFzY3Jp
cHQiLAogICAgIm5ldHdvcmsiLAogICAgImNvbnNvbGUtYXBpIiwKICAgICJvdGhlciIsCiAgICAi
dGlwIiwKICAgICJsb2ciLAogICAgIndhcm5pbmciLAogICAgImVycm9yIiwKICAgICJkZWJ1ZyIs
CiAgICAiZGlyIiwKICAgICJkaXJ4bWwiLAogICAgInRyYWNlIiwKICAgICJzdGFydEdyb3VwIiwK
ICAgICJzdGFydEdyb3VwQ29sbGFwc2VkIiwKICAgICJlbmRHcm91cCIsCiAgICAiYXNzZXJ0IiwK
ICAgICJwYXJzZXIiLAogICAgInNjcmlwdCIsCiAgICAidXNlciIsCiAgICAidXNlci1hZ2VudCIs
CiAgICAiaW5zcGVjdG9yIiwKICAgICJyZWd1bGFyIiwKICAgICJhY3RpdmUiLAogICAgImluYWN0
aXZlIiwKICAgICJkaXNhYmxlZCIsCiAgICAic3R5bGUiLAogICAgIm1lZGlhUnVsZSIsCiAgICAi
aW1wb3J0UnVsZSIsCiAgICAibGlua2VkU2hlZXQiLAogICAgImlubGluZVNoZWV0IiwKICAgICJn
bG9iYWwiLAogICAgImxvY2FsIiwKICAgICJ3aXRoIiwKICAgICJjbG9zdXJlIiwKICAgICJjYXRj
aCIsCiAgICAic3VidHJlZS1tb2RpZmllZCIsCiAgICAiYXR0cmlidXRlLW1vZGlmaWVkIiwKICAg
ICJub2RlLXJlbW92ZWQiLAogICAgIkRPTSIsCiAgICAiRXZlbnRMaXN0ZW5lciIsCiAgICAiZXhj
ZXB0aW9uIgp9OwoKU3RyaW5nIGdldEVudW1Db25zdGFudFZhbHVlKGludCBjb2RlKSB7CiAgICAv
LyBUZXN0IHZhcmlhYmxlIGZyb20gZ2VuZXJhdGVkIHNvdXJjZXMsIGRlY2xhcmVkIGluIEluc3Bl
Y3RvclR5cGVCdWlsZGVyLmggYW5kIGRlZmluZWQgaW4gSW5zcGVjdG9yVHlwZUJ1aWxkZXIuY3Bw
CiAgICBBU1NFUlQodHlwZUJ1aWxkZXJUZXN0VmFyaWFibGUpOwogICAgcmV0dXJuIGVudW1fY29u
c3RhbnRfdmFsdWVzW2NvZGVdOwp9Cgp9IC8vIG5hbWVzcGFjZSBUeXBlQnVpbGRlcgoKI2lmICFB
U1NFUlRfRElTQUJMRUQKCiNlbmRpZiAvLyAhQVNTRVJUX0RJU0FCTEVECgp9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCgojZW5kaWYgLy8gRU5BQkxFKElOU1BFQ1RPUikK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>124455</attachid>
            <date>2012-01-28 15:06:04 -0800</date>
            <delta_ts>2012-01-30 15:43:06 -0800</delta_ts>
            <desc>New InspectorFrontend.h</desc>
            <filename>InspectorFrontend.h</filename>
            <type>text/plain</type>
            <size>164264</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgojaWZuZGVmIEluc3BlY3RvckZyb250ZW5kX2gKI2RlZmluZSBJbnNw
ZWN0b3JGcm9udGVuZF9oCgojaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1aWxkZXIuaCIKI2luY2x1
ZGUgIkluc3BlY3RvclZhbHVlcy5oIgojaW5jbHVkZSA8UGxhdGZvcm1TdHJpbmcuaD4KI2luY2x1
ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CgpuYW1lc3BhY2UgV2ViQ29yZSB7CgpjbGFzcyBJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWw7CgovLyBCb3RoIEluc3BlY3Rvck9iamVjdCBhbmQgSW5zcGVjdG9y
QXJyYXkgbWF5IG9yIG1heSBub3QgYmUgZGVjbGFyZWQgYXQgdGhpcyBwb2ludCBhcyBkZWZpbmVk
IGJ5IEVOQUJMRURfSU5TUEVDVE9SLgovLyBEb3VibGUtY2hlY2sgd2UgaGF2ZSB0aGVtIGF0IGxl
YXN0IGFzIGZvcndhcmQgZGVjbGFyYXRpb24uCmNsYXNzIEluc3BlY3RvckFycmF5OwpjbGFzcyBJ
bnNwZWN0b3JPYmplY3Q7Cgp0eXBlZGVmIFN0cmluZyBFcnJvclN0cmluZzsKCiNpZiBFTkFCTEUo
SU5TUEVDVE9SKQoKbmFtZXNwYWNlIFR5cGVCdWlsZGVyIHsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+
CmNsYXNzIEFycmF5SXRlbUhlbHBlciB7CnB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZW5hbWUgVDo6
SXRlbVRyYWl0cyBUcmFpdHM7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBBcnJheU9m
IDogcHVibGljIEluc3BlY3RvckFycmF5IHsKcHJpdmF0ZToKICAgIEFycmF5T2YoKSB7IH0KCnB1
YmxpYzoKICAgIHZvaWQgYWRkSXRlbShQYXNzUmVmUHRyPFQ+IHZhbHVlKQogICAgewogICAgICAg
IEFycmF5SXRlbUhlbHBlcjxUPjo6VHJhaXRzOjpwdXNoUmVmUHRyKHRoaXMsIHZhbHVlKTsKICAg
IH0KCiAgICB2b2lkIGFkZEl0ZW0oVCB2YWx1ZSkKICAgIHsKICAgICAgICBBcnJheUl0ZW1IZWxw
ZXI8VD46OlRyYWl0czo6cHVzaFJhdyh0aGlzLCB2YWx1ZSk7CiAgICB9CgogICAgc3RhdGljIFBh
c3NSZWZQdHI8QXJyYXlPZjxUPiA+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBBcnJheU9mPFQ+KCkpOwogICAgfQoKI2lmICFBU1NFUlRfRElTQUJMRUQKICAgIHN0
YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpOwojZW5k
aWYgLy8gIUFTU0VSVF9ESVNBQkxFRAp9OwoKY2xhc3MgU3RydWN0SXRlbVRyYWl0cyB7CnB1Ymxp
YzoKICAgIHN0YXRpYyB2b2lkIHB1c2hSZWZQdHIoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgYXJyYXktPnB1c2hP
YmplY3QodmFsdWUpOwogICAgfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBzdGF0aWMg
dm9pZCBhc3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKSB7CiAgICAgICAg
VDo6YXNzZXJ0Q29ycmVjdFZhbHVlKHZhbHVlKTsKICAgIH0KfTsKCnRlbXBsYXRlPD4KY2xhc3Mg
QXJyYXlJdGVtSGVscGVyPFN0cmluZz4gewpwdWJsaWM6CiAgICBjbGFzcyBUcmFpdHMgewogICAg
cHVibGljOgogICAgICAgIHN0YXRpYyB2b2lkIHB1c2hSYXcoSW5zcGVjdG9yQXJyYXkqIGFycmF5
LCBjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgYXJyYXktPnB1c2hT
dHJpbmcodmFsdWUpOwogICAgICAgIH0KICAgIH07Cn07Cgp0ZW1wbGF0ZTw+CmNsYXNzIEFycmF5
SXRlbUhlbHBlcjxJbnNwZWN0b3JPYmplY3Q+IHsKcHVibGljOgogICAgY2xhc3MgVHJhaXRzIHsK
ICAgIHB1YmxpYzoKICAgICAgICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRyKEluc3BlY3RvckFycmF5
KiBhcnJheSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgYXJyYXktPnB1c2hPYmplY3QodmFsdWUpOwogICAgICAgIH0KICAgIH07Cn07CgoK
Ly8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCm5hbWVzcGFjZSBDb25zb2xlIHsKY2xhc3MgQ2FsbEZy
YW1lOwp9IC8vIENvbnNvbGUKCiNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKbmFtZXNwYWNl
IEluZGV4ZWREQiB7CmNsYXNzIE9iamVjdFN0b3JlOwpjbGFzcyBPYmplY3RTdG9yZUluZGV4Owp9
IC8vIEluZGV4ZWREQgoKI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpuYW1lc3Bh
Y2UgQ1NTIHsKY2xhc3MgQ1NTUnVsZTsKY2xhc3MgU291cmNlUmFuZ2U7CmNsYXNzIENTU1N0eWxl
OwpjbGFzcyBDU1NQcm9wZXJ0eTsKY2xhc3MgQ1NTTWVkaWE7Cn0gLy8gQ1NTCgojaWYgRU5BQkxF
KEpBVkFTQ1JJUFRfREVCVUdHRVIpCm5hbWVzcGFjZSBEZWJ1Z2dlciB7CmNsYXNzIExvY2F0aW9u
OwpjbGFzcyBTY29wZTsKfSAvLyBEZWJ1Z2dlcgoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBU
X0RFQlVHR0VSKQovLyBFbmQgb2YgZm9yd2FyZCBkZWNsYXJhdGlvbnMuCgovLyBUeXBlZGVmcy4K
bmFtZXNwYWNlIFBhZ2UgewovKiBVbmlxdWUgc2NyaXB0IGlkZW50aWZpZXIuICovCnR5cGVkZWYg
U3RyaW5nIFNjcmlwdElkZW50aWZpZXI7Cgp9IC8vIFBhZ2UKCm5hbWVzcGFjZSBSdW50aW1lIHsK
LyogVW5pcXVlIG9iamVjdCBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBSZW1vdGVPYmpl
Y3RJZDsKCn0gLy8gUnVudGltZQoKbmFtZXNwYWNlIE5ldHdvcmsgewovKiBVbmlxdWUgbG9hZGVy
IGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIExvYWRlcklkOwoKLyogVW5pcXVlIGZyYW1l
IGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIEZyYW1lSWQ7CgovKiBVbmlxdWUgcmVxdWVz
dCBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBSZXF1ZXN0SWQ7Cgp9IC8vIE5ldHdvcmsK
CiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKbmFtZXNwYWNlIERlYnVnZ2VyIHsKLyog
QnJlYWtwb2ludCBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBCcmVha3BvaW50SWQ7Cgov
KiBVbmlxdWUgc2NyaXB0IGlkZW50aWZpZXIuICovCnR5cGVkZWYgU3RyaW5nIFNjcmlwdElkOwoK
LyogQ2FsbCBmcmFtZSBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBDYWxsRnJhbWVJZDsK
Cn0gLy8gRGVidWdnZXIKCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKLy8g
RW5kIG9mIHR5cGVkZWZzLgoKCgpTdHJpbmcgZ2V0RW51bUNvbnN0YW50VmFsdWUoaW50IGNvZGUp
OwoKbmFtZXNwYWNlIE1lbW9yeSB7Ci8qIE51bWJlciBvZiBub2RlcyB3aXRoIGdpdmVuIG5hbWUu
ICovCmNsYXNzIE5vZGVDb3VudCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAg
ICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTm9kZU5hbWVTZXQgPSAx
IDw8IDAsCiAgICAgICAgQ291bnRTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0g
KE5vZGVOYW1lU2V0IHwgQ291bnRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4K
ICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxOb2RlQ291bnQ+IHB0cikKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0
ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAg
ICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIE5vZGVDb3VudDsKICAgIHB1YmxpYzoKCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IE5vZGVOYW1lU2V0PiYgc2V0Tm9kZU5hbWUoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOb2Rl
TmFtZVNldCksIHByb3BlcnR5X25vZGVOYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygibm9kZU5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8Tm9kZU5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgQ291bnRTZXQ+JiBzZXRDb3VudChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ291bnRTZXQpLCBwcm9wZXJ0eV9jb3VudF9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvdW50IiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPE5vZGVDb3VudD4mICgpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkp
OwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPE5vZGVDb3VudD4q
PigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxOb2Rl
Q291bnQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPE5vZGVDb3VudD4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxOb2RlQ291bnQ+IHJlc3VsdCA9IE5vZGVDb3VudDo6Y3JlYXRl
KCkKICAgICAqICAgICAuc2V0Tm9kZU5hbWUoLi4uKQogICAgICogICAgIC5zZXRDb3VudCguLi4p
OwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IE5vZGVDb3Vu
dCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsK
Ci8qIE51bWJlciBvZiBKUyBldmVudCBsaXN0ZW5lcnMgYnkgZXZlbnQgdHlwZS4gKi8KY2xhc3Mg
TGlzdGVuZXJDb3VudCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVHlwZVNldCA9IDEgPDwgMCwKICAg
ICAgICBDb3VudFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVHlwZVNldCB8
IENvdW50U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8TGlzdGVuZXJDb3VudD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgTGlzdGVuZXJDb3VudDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5
X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBl
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgQ291bnRTZXQ+JiBzZXRDb3VudChpbnQgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ291bnRT
ZXQpLCBwcm9wZXJ0eV9jb3VudF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXROdW1iZXIoImNvdW50IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENv
dW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPExpc3RlbmVyQ291
bnQ+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxs
RmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PFJlZlB0cjxMaXN0ZW5lckNvdW50Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPExpc3RlbmVyQ291bnQ+ICgpCiAgICAgICAg
ewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPExpc3RlbmVyQ291bnQ+KCp0aGlzKTsKICAgICAg
ICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBS
ZWZQdHI8TGlzdGVuZXJDb3VudD4gcmVzdWx0ID0gTGlzdGVuZXJDb3VudDo6Y3JlYXRlKCkKICAg
ICAqICAgICAuc2V0VHlwZSguLi4pCiAgICAgKiAgICAgLnNldENvdW50KC4uLik7CiAgICAgKi8K
ICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgTGlzdGVuZXJDb3VudCgpKSk7
CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIENo
YXJhY3RlciBkYXRhIHN0YXRpc3RpY3MgZm9yIHRoZSBwYWdlLiAqLwpjbGFzcyBTdHJpbmdTdGF0
aXN0aWNzIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAg
ICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBEb21TZXQgPSAxIDw8IDAsCiAgICAgICAgSnNT
ZXQgPSAxIDw8IDEsCiAgICAgICAgU2hhcmVkU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxk
c1NldCA9IChEb21TZXQgfCBKc1NldCB8IFNoYXJlZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8
aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4g
QnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFN0cmluZ1N0YXRpc3RpY3M+IHB0
cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRz
U2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jl
c3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFN0cmluZ1N0YXRpc3Rp
Y3M7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEb21TZXQ+JiBzZXREb20o
aW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IERvbVNldCksIHByb3BlcnR5X2RvbV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoImRvbSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxE
b21TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSnNTZXQ+JiBzZXRK
cyhpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgSnNTZXQpLCBwcm9wZXJ0eV9qc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoImpzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEpz
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNoYXJlZFNldD4mIHNl
dFNoYXJlZChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgU2hhcmVkU2V0KSwgcHJvcGVydHlfc2hhcmVkX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2hhcmVkIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFNoYXJlZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFJlZlB0cjxTdHJpbmdTdGF0aXN0aWNzPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U3RyaW5nU3RhdGlzdGlj
cz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxT
dHJpbmdTdGF0aXN0aWNzPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxT
dHJpbmdTdGF0aXN0aWNzPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFN0cmluZ1N0YXRpc3RpY3M+IHJl
c3VsdCA9IFN0cmluZ1N0YXRpc3RpY3M6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldERvbSguLi4p
CiAgICAgKiAgICAgLnNldEpzKC4uLikKICAgICAqICAgICAuc2V0U2hhcmVkKC4uLik7CiAgICAg
Ki8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAg
IHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgU3RyaW5nU3RhdGlzdGlj
cygpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsK
CmNsYXNzIERPTUdyb3VwIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVu
dW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTaXplU2V0ID0gMSA8PCAwLAog
ICAgICAgIFRpdGxlU2V0ID0gMSA8PCAxLAogICAgICAgIE5vZGVDb3VudFNldCA9IDEgPDwgMiwK
ICAgICAgICBMaXN0ZW5lckNvdW50U2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9
IChTaXplU2V0IHwgVGl0bGVTZXQgfCBOb2RlQ291bnRTZXQgfCBMaXN0ZW5lckNvdW50U2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
RE9NR3JvdXA+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIERP
TUdyb3VwOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2l6ZVNldD4mIHNl
dFNpemUoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFNpemVTZXQpLCBwcm9wZXJ0eV9zaXplX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxTaXplU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRp
dGxlU2V0PiYgc2V0VGl0bGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUaXRsZVNldCksIHByb3BlcnR5X3RpdGxlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidGl0bGUiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VGl0bGVTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTm9kZUNvdW50U2V0PiYgc2V0Tm9kZUNvdW50KC8qUGFz
c1JlZlB0cjxBcnJheU9mPFR5cGVCdWlsZGVyOjpNZW1vcnk6Ok5vZGVDb3VudCA+ID4qLyBQYXNz
UmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBOb2RlQ291bnRTZXQpLCBwcm9wZXJ0eV9ub2RlQ291bnRfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoIm5vZGVDb3VudCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlQ291bnRTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGlzdGVuZXJDb3VudFNldD4mIHNldExpc3Rl
bmVyQ291bnQoLypQYXNzUmVmUHRyPEFycmF5T2Y8VHlwZUJ1aWxkZXI6Ok1lbW9yeTo6TGlzdGVu
ZXJDb3VudCA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMaXN0ZW5lckNvdW50U2V0KSwg
cHJvcGVydHlfbGlzdGVuZXJDb3VudF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRBcnJheSgibGlzdGVuZXJDb3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxMaXN0ZW5lckNvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UmVmUHRyPERPTUdyb3VwPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RE9NR3JvdXA+Kj4oJm1fcmVzdWx0KTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RE9NR3JvdXA+ICgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPERPTUdyb3VwPigqdGhpcyk7CiAgICAgICAg
fQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVm
UHRyPERPTUdyb3VwPiByZXN1bHQgPSBET01Hcm91cDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0
U2l6ZSguLi4pCiAgICAgKiAgICAgLnNldFRpdGxlKC4uLikKICAgICAqICAgICAuc2V0Tm9kZUNv
dW50KC4uLikKICAgICAqICAgICAuc2V0TGlzdGVuZXJDb3VudCguLi4pOwogICAgICovCiAgICBz
dGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IERPTUdyb3VwKCkpKTsKICAgIH0KICAg
IHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0RG9jdW1l
bnRVUkkoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmco
ImRvY3VtZW50VVJJIiwgdmFsdWUpOwogICAgfQp9OwoKfSAvLyBNZW1vcnkKCm5hbWVzcGFjZSBQ
YWdlIHsKLyogUmVzb3VyY2UgdHlwZSBhcyBpdCB3YXMgcGVyY2VpdmVkIGJ5IHRoZSByZW5kZXJp
bmcgZW5naW5lLiAqLwpzdHJ1Y3QgUmVzb3VyY2VUeXBlIHsKICAgIGVudW0gRW51bSB7CiAgICAg
ICAgRG9jdW1lbnQgPSAwLAogICAgICAgIFN0eWxlc2hlZXQgPSAxLAogICAgICAgIEltYWdlID0g
MiwKICAgICAgICBGb250ID0gMywKICAgICAgICBTY3JpcHQgPSA0LAogICAgICAgIFhIUiA9IDUs
CiAgICAgICAgV2ViU29ja2V0ID0gNiwKICAgICAgICBPdGhlciA9IDcsCiAgICB9Owp9OyAvLyBz
dHJ1Y3QgUmVzb3VyY2VUeXBlCgovKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgRnJhbWUgb24gdGhl
IHBhZ2UuICovCmNsYXNzIEZyYW1lIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoK
ICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBJZFNldCA9IDEgPDwg
MCwKICAgICAgICBMb2FkZXJJZFNldCA9IDEgPDwgMSwKICAgICAgICBVcmxTZXQgPSAxIDw8IDIs
CiAgICAgICAgTWltZVR5cGVTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKElk
U2V0IHwgTG9hZGVySWRTZXQgfCBVcmxTZXQgfCBNaW1lVHlwZVNldCkKICAgIH07CgogICAgdGVt
cGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQg
U1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRo
aXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEZyYW1lPiBwdHIpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwg
YnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQg
PSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBGcmFtZTsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IElkU2V0PiYgc2V0SWQoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBJZFNldCks
IHByb3BlcnR5X2lkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
ZygiaWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SWRTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTG9hZGVySWRTZXQ+JiBzZXRMb2FkZXJJ
ZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpMb2FkZXJJZCYqLyBjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExv
YWRlcklkU2V0KSwgcHJvcGVydHlfbG9hZGVySWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJsb2FkZXJJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxMb2FkZXJJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9wZXJ0eV91cmxfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXJsU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IE1pbWVUeXBlU2V0PiYgc2V0TWltZVR5cGUoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBN
aW1lVHlwZVNldCksIHByb3BlcnR5X21pbWVUeXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygibWltZVR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8TWltZVR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8RnJhbWU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxGcmFtZT4qPigmbV9yZXN1bHQpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxGcmFtZT4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8RnJhbWU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAg
IC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8RnJhbWU+IHJl
c3VsdCA9IEZyYW1lOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRJZCguLi4pCiAgICAgKiAgICAg
LnNldExvYWRlcklkKC4uLikKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0
TWltZVR5cGUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNy
ZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVm
KG5ldyBGcmFtZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKCiAgICB2b2lkIHNldFBhcmVudElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwYXJlbnRJZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lk
IHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoIm5hbWUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTZWN1cml0eU9yaWdpbihjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic2VjdXJpdHlP
cmlnaW4iLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgRnJhbWUg
aGllcmFyY2h5IGFsb25nIHdpdGggdGhlaXIgY2FjaGVkIHJlc291cmNlcy4gKi8KY2xhc3MgRnJh
bWVSZXNvdXJjZVRyZWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8g
TmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAncmVzb3VyY2VzJyB3aGlsZSBnZW5lcmF0aW5nIEZy
YW1lUmVzb3VyY2VUcmVlLgogICAgY2xhc3MgUmVzb3VyY2VzIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CiAgICBwdWJsaWM6CiAgICAgICAgZW51bSB7CiAgICAgICAgICAgIE5vRmllbGRzU2V0
ID0gMCwKICAgICAgICAgICAgVXJsU2V0ID0gMSA8PCAwLAogICAgICAgICAgICBUeXBlU2V0ID0g
MSA8PCAxLAogICAgICAgICAgICBNaW1lVHlwZVNldCA9IDEgPDwgMiwKICAgICAgICAgICAgQWxs
RmllbGRzU2V0ID0gKFVybFNldCB8IFR5cGVTZXQgfCBNaW1lVHlwZVNldCkKICAgICAgICB9OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICAgICAgY2xhc3MgQnVpbGRlciB7CiAgICAg
ICAgcHJpdmF0ZToKICAgICAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CgogICAgICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgICAgIH0KCiAg
ICAgICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZXNvdXJjZXM+IHB0cikKICAgICAgICAgICAg
ewogICAgICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgICAgICBtX3Jlc3Vs
dCA9IHB0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmllbmQgY2xhc3MgUmVzb3VyY2Vz
OwogICAgICAgIHB1YmxpYzoKICAgIAogICAgICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0
PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUp
OwogICAgICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVcmxTZXQ+KCk7CiAgICAgICAgICAg
IH0KICAgIAogICAgICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoVHlw
ZUJ1aWxkZXI6OlBhZ2U6OlJlc291cmNlVHlwZTo6RW51bSB2YWx1ZSkKICAgICAgICAgICAgewog
ICAgICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0
eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmco
InR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAg
QnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBl
U2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxUeXBlU2V0PigpOwogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgQnVpbGRlcjxT
VEFURSB8IE1pbWVUeXBlU2V0PiYgc2V0TWltZVR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
ICAgICAgICAgewogICAgICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1pbWVU
eXBlU2V0KSwgcHJvcGVydHlfbWltZVR5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygibWltZVR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPE1pbWVUeXBlU2V0PigpOwogICAgICAgICAgICB9CiAgICAKICAgICAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPFJlc291cmNlcz4mICgpCiAgICAgICAgICAgIHsKICAgICAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7CiAgICAgICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPFJlc291cmNlcz4qPigmbV9yZXN1bHQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPFJlc291cmNlcz4gKCkKICAgICAgICAgICAgewogICAgICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxSZXNvdXJjZXM+KCp0aGlzKTsKICAgICAgICAgICAgfQogICAg
ICAgIH07CgogICAgICAgIC8qCiAgICAgICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAg
ICAgICAqIFJlZlB0cjxSZXNvdXJjZXM+IHJlc3VsdCA9IFJlc291cmNlczo6Y3JlYXRlKCkKICAg
ICAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgICAgICogICAgIC5zZXRUeXBlKC4uLikKICAg
ICAgICAgKiAgICAgLnNldE1pbWVUeXBlKC4uLik7CiAgICAgICAgICovCiAgICAgICAgc3RhdGlj
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFJlc291cmNlcygpKSk7CiAgICAg
ICAgfQogICAgICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwogICAgfTsK
CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgRnJhbWVTZXQgPSAx
IDw8IDAsCiAgICAgICAgUmVzb3VyY2VzU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1Nl
dCA9IChGcmFtZVNldCB8IFJlc291cmNlc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNU
QVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRl
cjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPiBwdHIpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwg
YnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQg
PSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBGcmFtZVJlc291cmNlVHJlZTsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEZyYW1lU2V0PiYgc2V0RnJhbWUo
LypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpQYWdlOjpGcmFtZT4qLyBQYXNzUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgRnJhbWVTZXQpLCBwcm9wZXJ0eV9mcmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImZyYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPEZyYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFJlc291cmNlc1NldD4mIHNldFJlc291cmNlcygvKlBhc3NSZWZQdHI8QXJyYXlPZjxSZXNv
dXJjZXMgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUmVzb3VyY2VzU2V0KSwgcHJvcGVy
dHlfcmVzb3VyY2VzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5
KCJyZXNvdXJjZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UmVzb3Vy
Y2VzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEZyYW1lUmVzb3Vy
Y2VUcmVlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RnJhbWVSZXNvdXJjZVRyZWU+Kj4oJm1fcmVzdWx0KTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RnJhbWVSZXNvdXJjZVRyZWU+
ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVl
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPiByZXN1bHQgPSBGcmFtZVJl
c291cmNlVHJlZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0RnJhbWUoLi4uKQogICAgICogICAg
IC5zZXRSZXNvdXJjZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFk
b3B0UmVmKG5ldyBGcmFtZVJlc291cmNlVHJlZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVj
dEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldENoaWxkRnJhbWVzKC8qUGFzc1Jl
ZlB0cjxBcnJheU9mPFR5cGVCdWlsZGVyOjpQYWdlOjpGcmFtZVJlc291cmNlVHJlZSA+ID4qLyBQ
YXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRB
cnJheSgiY2hpbGRGcmFtZXMiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBTZWFyY2ggbWF0Y2ggZm9y
IHJlc291cmNlLiAqLwpjbGFzcyBTZWFyY2hNYXRjaCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qg
ewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTGlu
ZU51bWJlclNldCA9IDEgPDwgMCwKICAgICAgICBMaW5lQ29udGVudFNldCA9IDEgPDwgMSwKICAg
ICAgICBBbGxGaWVsZHNTZXQgPSAoTGluZU51bWJlclNldCB8IExpbmVDb250ZW50U2V0KQogICAg
fTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZh
dGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRl
bXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8
IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2Vh
cmNoTWF0Y2g+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNl
YXJjaE1hdGNoOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51bWJl
clNldD4mIHNldExpbmVOdW1iZXIoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIExpbmVOdW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5lTnVt
YmVyX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibGluZU51
bWJlciIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVyU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExpbmVDb250ZW50U2V0PiYg
c2V0TGluZUNvbnRlbnQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMaW5lQ29udGVudFNldCksIHByb3BlcnR5X2xpbmVD
b250ZW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibGlu
ZUNvbnRlbnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGluZUNvbnRl
bnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U2VhcmNoTWF0Y2g+
JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmll
bGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PFJlZlB0cjxTZWFyY2hNYXRjaD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTZWFyY2hNYXRjaD4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8U2VhcmNoTWF0Y2g+KCp0aGlzKTsKICAgICAgICB9CiAgICB9
OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2Vh
cmNoTWF0Y2g+IHJlc3VsdCA9IFNlYXJjaE1hdGNoOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRM
aW5lTnVtYmVyKC4uLikKICAgICAqICAgICAuc2V0TGluZUNvbnRlbnQoLi4uKTsKICAgICAqLwog
ICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0
dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBTZWFyY2hNYXRjaCgpKSk7CiAg
ICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIFNlYXJj
aCByZXN1bHQgZm9yIHJlc291cmNlLiAqLwpjbGFzcyBTZWFyY2hSZXN1bHQgOiBwdWJsaWMgSW5z
cGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAw
LAogICAgICAgIFVybFNldCA9IDEgPDwgMCwKICAgICAgICBGcmFtZUlkU2V0ID0gMSA8PCAxLAog
ICAgICAgIE1hdGNoZXNDb3VudFNldCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAo
VXJsU2V0IHwgRnJhbWVJZFNldCB8IE1hdGNoZXNDb3VudFNldCkKICAgIH07CgogICAgdGVtcGxh
dGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RF
UD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNlYXJjaFJlc3VsdD4gcHRy
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNT
ZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVz
dWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VhcmNoUmVzdWx0Owog
ICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGcmFtZUlk
U2V0PiYgc2V0RnJhbWVJZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlkJiov
IGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgRnJhbWVJZFNldCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPEZyYW1lSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgTWF0Y2hlc0NvdW50U2V0PiYgc2V0TWF0Y2hlc0NvdW50KGRvdWJsZSB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYXRj
aGVzQ291bnRTZXQpLCBwcm9wZXJ0eV9tYXRjaGVzQ291bnRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJtYXRjaGVzQ291bnQiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8TWF0Y2hlc0NvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPFNlYXJjaFJlc3VsdD4mICgpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlYXJjaFJl
c3VsdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0
cjxTZWFyY2hSZXN1bHQ+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNl
YXJjaFJlc3VsdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTZWFyY2hSZXN1bHQ+IHJlc3VsdCA9IFNl
YXJjaFJlc3VsdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAu
c2V0RnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldE1hdGNoZXNDb3VudCguLi4pOwogICAgICov
CiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICBy
ZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNlYXJjaFJlc3VsdCgpKSk7
CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIENv
b2tpZSBvYmplY3QgKi8KY2xhc3MgQ29va2llIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1
YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOYW1lU2V0
ID0gMSA8PCAwLAogICAgICAgIFZhbHVlU2V0ID0gMSA8PCAxLAogICAgICAgIERvbWFpblNldCA9
IDEgPDwgMiwKICAgICAgICBQYXRoU2V0ID0gMSA8PCAzLAogICAgICAgIEV4cGlyZXNTZXQgPSAx
IDw8IDQsCiAgICAgICAgU2l6ZVNldCA9IDEgPDwgNSwKICAgICAgICBIdHRwT25seVNldCA9IDEg
PDwgNiwKICAgICAgICBTZWN1cmVTZXQgPSAxIDw8IDcsCiAgICAgICAgU2Vzc2lvblNldCA9IDEg
PDwgOCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoTmFtZVNldCB8IFZhbHVlU2V0IHwgRG9tYWlu
U2V0IHwgUGF0aFNldCB8IEV4cGlyZXNTZXQgfCBTaXplU2V0IHwgSHR0cE9ubHlTZXQgfCBTZWN1
cmVTZXQgfCBTZXNzaW9uU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBj
bGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwg
U1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyKFBhc3NSZWZQdHI8Q29va2llPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBDb29raWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1l
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFZhbHVlU2V0PiYgc2V0VmFsdWUoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBW
YWx1ZVNldCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8VmFsdWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRG9tYWlu
U2V0PiYgc2V0RG9tYWluKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRG9tYWluU2V0KSwgcHJvcGVydHlfZG9tYWluX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygiZG9tYWluIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERvbWFpblNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBQYXRoU2V0PiYgc2V0UGF0aChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFBh
dGhTZXQpLCBwcm9wZXJ0eV9wYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygicGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxQ
YXRoU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEV4cGlyZXNTZXQ+
JiBzZXRFeHBpcmVzKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBFeHBpcmVzU2V0KSwgcHJvcGVydHlfZXhwaXJlc19hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImV4cGlyZXMiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8RXhwaXJlc1NldD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBTaXplU2V0PiYgc2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2l6ZVNldCksIHByb3BlcnR5X3Np
emVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzaXplIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNpemVTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSHR0cE9ubHlTZXQ+JiBzZXRIdHRwT25seShib29s
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEh0
dHBPbmx5U2V0KSwgcHJvcGVydHlfaHR0cE9ubHlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0Qm9vbGVhbigiaHR0cE9ubHkiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8SHR0cE9ubHlTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgU2VjdXJlU2V0PiYgc2V0U2VjdXJlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2VjdXJlU2V0KSwgcHJvcGVydHlfc2VjdXJl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oInNlY3VyZSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTZWN1cmVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2Vzc2lvblNldD4mIHNldFNlc3Npb24oYm9v
bCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBT
ZXNzaW9uU2V0KSwgcHJvcGVydHlfc2Vzc2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRCb29sZWFuKCJzZXNzaW9uIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPFNlc3Npb25TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8Q29va2llPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q29va2llPio+KCZtX3Jlc3VsdCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENvb2tpZT4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8Q29va2llPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAg
ICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENvb2tpZT4g
cmVzdWx0ID0gQ29va2llOjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAq
ICAgICAuc2V0VmFsdWUoLi4uKQogICAgICogICAgIC5zZXREb21haW4oLi4uKQogICAgICogICAg
IC5zZXRQYXRoKC4uLikKICAgICAqICAgICAuc2V0RXhwaXJlcyguLi4pCiAgICAgKiAgICAgLnNl
dFNpemUoLi4uKQogICAgICogICAgIC5zZXRIdHRwT25seSguLi4pCiAgICAgKiAgICAgLnNldFNl
Y3VyZSguLi4pCiAgICAgKiAgICAgLnNldFNlc3Npb24oLi4uKTsKICAgICAqLwogICAgc3RhdGlj
IEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDb29raWUoKSkpOwogICAgfQogICAgdHlwZWRl
ZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07Cgp9IC8vIFBhZ2UKCm5hbWVzcGFjZSBS
dW50aW1lIHsKLyogTWlycm9yIG9iamVjdCByZWZlcmVuY2luZyBvcmlnaW5hbCBKYXZhU2NyaXB0
IG9iamVjdC4gKi8KY2xhc3MgUmVtb3RlT2JqZWN0IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3R5cGUnIHdoaWxlIGdl
bmVyYXRpbmcgUmVtb3RlT2JqZWN0LgogICAgc3RydWN0IFR5cGUgewogICAgICAgIGVudW0gRW51
bSB7CiAgICAgICAgICAgIE9iamVjdCA9IDgsCiAgICAgICAgICAgIEZ1bmN0aW9uID0gOSwKICAg
ICAgICAgICAgVW5kZWZpbmVkID0gMTAsCiAgICAgICAgICAgIFN0cmluZyA9IDExLAogICAgICAg
ICAgICBOdW1iZXIgPSAxMiwKICAgICAgICAgICAgQm9vbGVhbiA9IDEzLAogICAgICAgIH07CiAg
ICB9OyAvLyBzdHJ1Y3QgVHlwZQoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3N1
YnR5cGUnIHdoaWxlIGdlbmVyYXRpbmcgUmVtb3RlT2JqZWN0LgogICAgc3RydWN0IFN1YnR5cGUg
ewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIEFycmF5ID0gMTQsCiAgICAgICAgICAg
IE51bGwgPSAxNSwKICAgICAgICAgICAgTm9kZSA9IDE2LAogICAgICAgICAgICBSZWdleHAgPSAx
NywKICAgICAgICAgICAgRGF0ZSA9IDE4LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgU3Vi
dHlwZQoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0
ID0gMSA8PCAwLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0KQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8UmVtb3RlT2JqZWN0
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0Zp
ZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZW1vdGVPYmpl
Y3Q7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlw
ZShUeXBlOjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVl
KSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVT
ZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBl
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFJlbW90ZU9iamVjdD4m
ICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVs
ZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPFJlbW90ZU9iamVjdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxSZW1vdGVPYmplY3Q+ICgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gUmVmUHRyPFJlbW90ZU9iamVjdD4oKnRoaXMpOwogICAgICAgIH0KICAg
IH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxS
ZW1vdGVPYmplY3Q+IHJlc3VsdCA9IFJlbW90ZU9iamVjdDo6Y3JlYXRlKCkKICAgICAqICAgICAu
c2V0VHlwZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3Jl
YXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYo
bmV3IFJlbW90ZU9iamVjdCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMg
SXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFN1YnR5cGUoU3VidHlwZTo6RW51bSB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInN1YnR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1
ZSh2YWx1ZSkpOwogICAgfQoKICAgIHZvaWQgc2V0U3VidHlwZShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic3VidHlwZSIsIHZhbHVlKTsKICAgIH0K
CiAgICB2b2lkIHNldENsYXNzTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldFN0cmluZygiY2xhc3NOYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0
VmFsdWUoUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0VmFsdWUoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2Jq
ZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXREZXNjcmlwdGlvbihjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygiZGVzY3JpcHRpb24iLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRPYmplY3RJZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpSdW50aW1l
OjpSZW1vdGVPYmplY3RJZCYqLyBjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldFN0cmluZygib2JqZWN0SWQiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBPYmplY3QgcHJv
cGVydHkgZGVzY3JpcHRvci4gKi8KY2xhc3MgUHJvcGVydHlEZXNjcmlwdG9yIDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0g
MCwKICAgICAgICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFdyaXRhYmxlU2V0ID0gMSA8PCAx
LAogICAgICAgIENvbmZpZ3VyYWJsZVNldCA9IDEgPDwgMiwKICAgICAgICBFbnVtZXJhYmxlU2V0
ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChOYW1lU2V0IHwgV3JpdGFibGVTZXQg
fCBDb25maWd1cmFibGVTZXQgfCBFbnVtZXJhYmxlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxp
bnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBC
dWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9yPiBw
dHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxk
c1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9y
ZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBQcm9wZXJ0eURlc2Ny
aXB0b3I7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0
TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IFdyaXRhYmxlU2V0PiYgc2V0V3JpdGFibGUoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBXcml0YWJsZVNldCksIHByb3BlcnR5
X3dyaXRhYmxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4o
IndyaXRhYmxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFdyaXRhYmxl
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENvbmZpZ3VyYWJsZVNl
dD4mIHNldENvbmZpZ3VyYWJsZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIENvbmZpZ3VyYWJsZVNldCksIHByb3BlcnR5X2NvbmZpZ3Vy
YWJsZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJjb25m
aWd1cmFibGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29uZmlndXJh
YmxlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEVudW1lcmFibGVT
ZXQ+JiBzZXRFbnVtZXJhYmxlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgRW51bWVyYWJsZVNldCksIHByb3BlcnR5X2VudW1lcmFibGVf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiZW51bWVyYWJs
ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxFbnVtZXJhYmxlU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4m
ICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVs
ZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8UmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4qPigmbV9yZXN1bHQpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+ICgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4oKnRo
aXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3Rv
cjoKICAgICAqIFJlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+IHJlc3VsdCA9IFByb3BlcnR5RGVz
Y3JpcHRvcjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNl
dFdyaXRhYmxlKC4uLikKICAgICAqICAgICAuc2V0Q29uZmlndXJhYmxlKC4uLikKICAgICAqICAg
ICAuc2V0RW51bWVyYWJsZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxk
c1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4o
YWRvcHRSZWYobmV3IFByb3BlcnR5RGVzY3JpcHRvcigpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0
cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFZhbHVlKC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInZhbHVlIiwg
dmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAg
dm9pZCBzZXRHZXQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmpl
Y3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldE9iamVjdCgiZ2V0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U2V0KC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInNl
dCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFdhc1Rocm93bihib29sIHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldEJvb2xlYW4oIndhc1Rocm93biIsIHZhbHVlKTsKICAgIH0KfTsK
Ci8qIFJlcHJlc2VudHMgZnVuY3Rpb24gY2FsbCBhcmd1bWVudC4gRWl0aGVyIHJlbW90ZSBvYmpl
Y3QgaWQgPGNvZGU+b2JqZWN0SWQ8L2NvZGU+IG9yIHByaW1pdGl2ZSA8Y29kZT52YWx1ZTwvY29k
ZT4gb3IgbmVpdGhlciBvZiAoZm9yIHVuZGVmaW5lZCkgdGhlbSBzaG91bGQgYmUgc3BlY2lmaWVk
LiAqLwpjbGFzcyBDYWxsQXJndW1lbnQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGlj
OgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIEFsbEZpZWxkc1Nl
dCA9IDAKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPENhbGxBcmd1bWVudD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9z
dGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmll
bmQgY2xhc3MgQ2FsbEFyZ3VtZW50OwogICAgcHVibGljOgoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8Q2FsbEFyZ3VtZW50PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEFyZ3VtZW50Pio+KCZtX3Jlc3Vs
dCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENhbGxBcmd1bWVudD4g
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEFyZ3VtZW50PigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPENhbGxBcmd1bWVudD4gcmVzdWx0ID0gQ2FsbEFyZ3VtZW50OjpjcmVh
dGUoKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDYWxs
QXJndW1lbnQoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFp
dHM7CgogICAgdm9pZCBzZXRWYWx1ZShQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkK
ICAgIHsKICAgICAgICB0aGlzLT5zZXRWYWx1ZSgidmFsdWUiLCB2YWx1ZSk7CiAgICB9CiAgICB1
c2luZyBJbnNwZWN0b3JPYmplY3Q6OnNldFZhbHVlOwoKCiAgICB2b2lkIHNldE9iamVjdElkKC8q
UGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3Qo
Im9iamVjdElkIiwgdmFsdWUpOwogICAgfQp9OwoKfSAvLyBSdW50aW1lCgpuYW1lc3BhY2UgQ29u
c29sZSB7Ci8qIENvbnNvbGUgbWVzc2FnZS4gKi8KY2xhc3MgQ29uc29sZU1lc3NhZ2UgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkg
bmFtZSAnc291cmNlJyB3aGlsZSBnZW5lcmF0aW5nIENvbnNvbGVNZXNzYWdlLgogICAgc3RydWN0
IFNvdXJjZSB7CiAgICAgICAgZW51bSBFbnVtIHsKICAgICAgICAgICAgSHRtbCA9IDE5LAogICAg
ICAgICAgICBXbWwgPSAyMCwKICAgICAgICAgICAgWG1sID0gMjEsCiAgICAgICAgICAgIEphdmFz
Y3JpcHQgPSAyMiwKICAgICAgICAgICAgTmV0d29yayA9IDIzLAogICAgICAgICAgICBDb25zb2xl
X2FwaSA9IDI0LAogICAgICAgICAgICBPdGhlciA9IDI1LAogICAgICAgIH07CiAgICB9OyAvLyBz
dHJ1Y3QgU291cmNlCgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnbGV2ZWwnIHdo
aWxlIGdlbmVyYXRpbmcgQ29uc29sZU1lc3NhZ2UuCiAgICBzdHJ1Y3QgTGV2ZWwgewogICAgICAg
IGVudW0gRW51bSB7CiAgICAgICAgICAgIFRpcCA9IDI2LAogICAgICAgICAgICBMb2cgPSAyNywK
ICAgICAgICAgICAgV2FybmluZyA9IDI4LAogICAgICAgICAgICBFcnJvciA9IDI5LAogICAgICAg
ICAgICBEZWJ1ZyA9IDMwLAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgTGV2ZWwKCiAgICAv
LyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICd0eXBlJyB3aGlsZSBnZW5lcmF0aW5nIENvbnNv
bGVNZXNzYWdlLgogICAgc3RydWN0IFR5cGUgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAg
ICAgIExvZyA9IDI3LAogICAgICAgICAgICBEaXIgPSAzMSwKICAgICAgICAgICAgRGlyeG1sID0g
MzIsCiAgICAgICAgICAgIFRyYWNlID0gMzMsCiAgICAgICAgICAgIFN0YXJ0R3JvdXAgPSAzNCwK
ICAgICAgICAgICAgU3RhcnRHcm91cENvbGxhcHNlZCA9IDM1LAogICAgICAgICAgICBFbmRHcm91
cCA9IDM2LAogICAgICAgICAgICBBc3NlcnQgPSAzNywKICAgICAgICB9OwogICAgfTsgLy8gc3Ry
dWN0IFR5cGUKCiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU291
cmNlU2V0ID0gMSA8PCAwLAogICAgICAgIExldmVsU2V0ID0gMSA8PCAxLAogICAgICAgIFRleHRT
ZXQgPSAxIDw8IDIsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFNvdXJjZVNldCB8IExldmVsU2V0
IHwgVGV4dFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPENvbnNvbGVNZXNzYWdlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBDb25zb2xlTWVzc2FnZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFNvdXJjZVNldD4mIHNldFNvdXJjZShTb3VyY2U6OkVudW0gdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlU2V0KSwg
cHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0
cmluZygic291cmNlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU291cmNlU2V0PiYgc2V0U291cmNlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlU2V0KSwgcHJv
cGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
Zygic291cmNlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNvdXJjZVNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMZXZlbFNldD4mIHNldExl
dmVsKExldmVsOjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIExldmVsU2V0KSwgcHJvcGVydHlfbGV2ZWxfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJsZXZlbCIsIGdldEVudW1Db25zdGFudFZhbHVl
KHZhbHVlKSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGV2ZWxTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGV2ZWxTZXQ+JiBzZXRMZXZlbChjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIExldmVsU2V0KSwgcHJvcGVydHlfbGV2ZWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJsZXZlbCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxMZXZlbFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBU
ZXh0U2V0PiYgc2V0VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRleHRTZXQpLCBwcm9wZXJ0eV90ZXh0X2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidGV4dCIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPENvbnNvbGVNZXNzYWdlPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9y
ZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q29uc29s
ZU1lc3NhZ2U+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8Q29uc29sZU1lc3NhZ2U+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPENvbnNvbGVNZXNzYWdlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAg
ICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENvbnNvbGVNZXNzYWdlPiBy
ZXN1bHQgPSBDb25zb2xlTWVzc2FnZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U291cmNlKC4u
LikKICAgICAqICAgICAuc2V0TGV2ZWwoLi4uKQogICAgICogICAgIC5zZXRUZXh0KC4uLik7CiAg
ICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAg
ICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ29uc29sZU1lc3Nh
Z2UoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cgog
ICAgdm9pZCBzZXRUeXBlKFR5cGU6OkVudW0gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
U3RyaW5nKCJ0eXBlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgIH0KCiAgICB2
b2lkIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRT
dHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRVcmwoY29uc3QgU3RyaW5n
JiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAg
IH0KCiAgICB2b2lkIHNldExpbmUoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51
bWJlcigibGluZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFJlcGVhdENvdW50KGludCB2
YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoInJlcGVhdENvdW50IiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0UGFyYW1ldGVycygvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBl
QnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJwYXJhbWV0ZXJzIiwg
dmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U3RhY2tUcmFjZSgvKlBhc3NSZWZQdHI8QXJyYXlP
ZjxUeXBlQnVpbGRlcjo6Q29uc29sZTo6Q2FsbEZyYW1lID4gPiovIFBhc3NSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEFycmF5KCJzdGFja1RyYWNl
IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TmV0d29ya1JlcXVlc3RJZCgvKmNvbnN0IFR5
cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoIm5ldHdvcmtSZXF1ZXN0SWQiLCB2YWx1ZSk7CiAg
ICB9Cn07CgovKiBTdGFjayBlbnRyeSBmb3IgY29uc29sZSBlcnJvcnMgYW5kIGFzc2VydGlvbnMu
ICovCmNsYXNzIENhbGxGcmFtZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAg
ICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgRnVuY3Rpb25OYW1lU2V0
ID0gMSA8PCAwLAogICAgICAgIFVybFNldCA9IDEgPDwgMSwKICAgICAgICBMaW5lTnVtYmVyU2V0
ID0gMSA8PCAyLAogICAgICAgIENvbHVtbk51bWJlclNldCA9IDEgPDwgMywKICAgICAgICBBbGxG
aWVsZHNTZXQgPSAoRnVuY3Rpb25OYW1lU2V0IHwgVXJsU2V0IHwgTGluZU51bWJlclNldCB8IENv
bHVtbk51bWJlclNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPENhbGxGcmFtZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgQ2FsbEZyYW1lOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgRnVuY3Rpb25OYW1lU2V0PiYgc2V0RnVuY3Rpb25OYW1lKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRnVuY3Rp
b25OYW1lU2V0KSwgcHJvcGVydHlfZnVuY3Rpb25OYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygiZnVuY3Rpb25OYW1lIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPEZ1bmN0aW9uTmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9w
ZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1
cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VXJsU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExpbmVOdW1iZXJTZXQ+JiBzZXRMaW5lTnVt
YmVyKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBMaW5lTnVtYmVyU2V0KSwgcHJvcGVydHlfbGluZU51bWJlcl9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGluZU51bWJlclNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBDb2x1bW5OdW1iZXJTZXQ+JiBzZXRDb2x1bW5OdW1iZXIoaW50
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENv
bHVtbk51bWJlclNldCksIHByb3BlcnR5X2NvbHVtbk51bWJlcl9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvbHVtbk51bWJlciIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb2x1bW5OdW1iZXJTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBSZWZQdHI8Q2FsbEZyYW1lPiYgKCkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFk
eSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEZyYW1l
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENh
bGxGcmFtZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEZyYW1l
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPENhbGxGcmFtZT4gcmVzdWx0ID0gQ2FsbEZyYW1lOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXRGdW5jdGlvbk5hbWUoLi4uKQogICAgICogICAgIC5zZXRVcmwo
Li4uKQogICAgICogICAgIC5zZXRMaW5lTnVtYmVyKC4uLikKICAgICAqICAgICAuc2V0Q29sdW1u
TnVtYmVyKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVh
dGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihu
ZXcgQ2FsbEZyYW1lKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVt
VHJhaXRzOwp9OwoKfSAvLyBDb25zb2xlCgpuYW1lc3BhY2UgTmV0d29yayB7Ci8qIFRpbWluZyBp
bmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QuICovCmNsYXNzIFJlc291cmNlVGltaW5nIDogcHVi
bGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRz
U2V0ID0gMCwKICAgICAgICBSZXF1ZXN0VGltZVNldCA9IDEgPDwgMCwKICAgICAgICBQcm94eVN0
YXJ0U2V0ID0gMSA8PCAxLAogICAgICAgIFByb3h5RW5kU2V0ID0gMSA8PCAyLAogICAgICAgIERu
c1N0YXJ0U2V0ID0gMSA8PCAzLAogICAgICAgIERuc0VuZFNldCA9IDEgPDwgNCwKICAgICAgICBD
b25uZWN0U3RhcnRTZXQgPSAxIDw8IDUsCiAgICAgICAgQ29ubmVjdEVuZFNldCA9IDEgPDwgNiwK
ICAgICAgICBTc2xTdGFydFNldCA9IDEgPDwgNywKICAgICAgICBTc2xFbmRTZXQgPSAxIDw8IDgs
CiAgICAgICAgU2VuZFN0YXJ0U2V0ID0gMSA8PCA5LAogICAgICAgIFNlbmRFbmRTZXQgPSAxIDw8
IDEwLAogICAgICAgIFJlY2VpdmVIZWFkZXJzRW5kU2V0ID0gMSA8PCAxMSwKICAgICAgICBBbGxG
aWVsZHNTZXQgPSAoUmVxdWVzdFRpbWVTZXQgfCBQcm94eVN0YXJ0U2V0IHwgUHJveHlFbmRTZXQg
fCBEbnNTdGFydFNldCB8IERuc0VuZFNldCB8IENvbm5lY3RTdGFydFNldCB8IENvbm5lY3RFbmRT
ZXQgfCBTc2xTdGFydFNldCB8IFNzbEVuZFNldCB8IFNlbmRTdGFydFNldCB8IFNlbmRFbmRTZXQg
fCBSZWNlaXZlSGVhZGVyc0VuZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgog
ICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFU
RSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFJlc291cmNlVGltaW5nPiBwdHIpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9j
cmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAg
ICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZXNvdXJjZVRpbWluZzsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFJlcXVlc3RUaW1lU2V0PiYgc2V0UmVxdWVzdFRpbWUo
ZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFJlcXVlc3RUaW1lU2V0KSwgcHJvcGVydHlfcmVxdWVzdFRpbWVfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJyZXF1ZXN0VGltZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSZXF1ZXN0VGltZVNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBQcm94eVN0YXJ0U2V0PiYgc2V0UHJveHlTdGFydChkb3Vi
bGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
UHJveHlTdGFydFNldCksIHByb3BlcnR5X3Byb3h5U3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJwcm94eVN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFByb3h5U3RhcnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgUHJveHlFbmRTZXQ+JiBzZXRQcm94eUVuZChkb3VibGUgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUHJveHlFbmRTZXQp
LCBwcm9wZXJ0eV9wcm94eUVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXROdW1iZXIoInByb3h5RW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFByb3h5RW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERuc1N0
YXJ0U2V0PiYgc2V0RG5zU3RhcnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIERuc1N0YXJ0U2V0KSwgcHJvcGVydHlfZG5zU3RhcnRf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJkbnNTdGFydCIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxEbnNTdGFydFNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEbnNFbmRTZXQ+JiBzZXREbnNFbmQoZG91
YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IERuc0VuZFNldCksIHByb3BlcnR5X2Ruc0VuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoImRuc0VuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxEbnNFbmRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
Q29ubmVjdFN0YXJ0U2V0PiYgc2V0Q29ubmVjdFN0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDb25uZWN0U3RhcnRTZXQpLCBw
cm9wZXJ0eV9jb25uZWN0U3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0TnVtYmVyKCJjb25uZWN0U3RhcnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8Q29ubmVjdFN0YXJ0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IENvbm5lY3RFbmRTZXQ+JiBzZXRDb25uZWN0RW5kKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBDb25uZWN0RW5kU2V0KSwgcHJv
cGVydHlfY29ubmVjdEVuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoImNvbm5lY3RFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
Q29ubmVjdEVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTc2xT
dGFydFNldD4mIHNldFNzbFN0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTc2xTdGFydFNldCksIHByb3BlcnR5X3NzbFN0YXJ0
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic3NsU3RhcnQi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3NsU3RhcnRTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3NsRW5kU2V0PiYgc2V0U3NsRW5kKGRv
dWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBTc2xFbmRTZXQpLCBwcm9wZXJ0eV9zc2xFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJzc2xFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8U3NsRW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IFNlbmRTdGFydFNldD4mIHNldFNlbmRTdGFydChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2VuZFN0YXJ0U2V0KSwgcHJvcGVydHlf
c2VuZFN0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigi
c2VuZFN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNlbmRTdGFy
dFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZW5kRW5kU2V0PiYg
c2V0U2VuZEVuZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgU2VuZEVuZFNldCksIHByb3BlcnR5X3NlbmRFbmRfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzZW5kRW5kIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNlbmRFbmRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgUmVjZWl2ZUhlYWRlcnNFbmRTZXQ+JiBzZXRSZWNlaXZlSGVhZGVy
c0VuZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgUmVjZWl2ZUhlYWRlcnNFbmRTZXQpLCBwcm9wZXJ0eV9yZWNlaXZlSGVhZGVyc0Vu
ZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInJlY2VpdmVI
ZWFkZXJzRW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFJlY2VpdmVI
ZWFkZXJzRW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFJlc291
cmNlVGltaW5nPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UmVzb3VyY2VUaW1pbmc+Kj4oJm1fcmVzdWx0KTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmVzb3VyY2VUaW1pbmc+ICgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJlc291cmNlVGltaW5nPigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPFJlc291cmNlVGltaW5nPiByZXN1bHQgPSBSZXNvdXJjZVRpbWluZzo6
Y3JlYXRlKCkKICAgICAqICAgICAuc2V0UmVxdWVzdFRpbWUoLi4uKQogICAgICogICAgIC5zZXRQ
cm94eVN0YXJ0KC4uLikKICAgICAqICAgICAuc2V0UHJveHlFbmQoLi4uKQogICAgICogICAgIC5z
ZXREbnNTdGFydCguLi4pCiAgICAgKiAgICAgLnNldERuc0VuZCguLi4pCiAgICAgKiAgICAgLnNl
dENvbm5lY3RTdGFydCguLi4pCiAgICAgKiAgICAgLnNldENvbm5lY3RFbmQoLi4uKQogICAgICog
ICAgIC5zZXRTc2xTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFNzbEVuZCguLi4pCiAgICAgKiAg
ICAgLnNldFNlbmRTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFNlbmRFbmQoLi4uKQogICAgICog
ICAgIC5zZXRSZWNlaXZlSGVhZGVyc0VuZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0Zp
ZWxkc1NldD4oYWRvcHRSZWYobmV3IFJlc291cmNlVGltaW5nKCkpKTsKICAgIH0KICAgIHR5cGVk
ZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogSFRUUCByZXF1ZXN0IGRhdGEu
ICovCmNsYXNzIFJlcXVlc3QgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAg
ZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFVybFNldCA9IDEgPDwgMCwK
ICAgICAgICBNZXRob2RTZXQgPSAxIDw8IDEsCiAgICAgICAgSGVhZGVyc1NldCA9IDEgPDwgMiwK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVXJsU2V0IHwgTWV0aG9kU2V0IHwgSGVhZGVyc1NldCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PFJlcXVlc3Q+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFJl
cXVlc3Q7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRV
cmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8VXJsU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IE1ldGhvZFNldD4mIHNldE1ldGhvZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1ldGhvZFNldCksIHByb3BlcnR5X21l
dGhvZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1ldGhv
ZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNZXRob2RTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSGVhZGVyc1NldD4mIHNldEhlYWRlcnMo
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIEhlYWRlcnNTZXQpLCBwcm9wZXJ0eV9oZWFkZXJzX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIZWFkZXJzU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFJlcXVlc3Q+JiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxSZXF1
ZXN0Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PFJlcXVlc3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJlcXVlc3Q+
KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3Ry
dWN0b3I6CiAgICAgKiBSZWZQdHI8UmVxdWVzdD4gcmVzdWx0ID0gUmVxdWVzdDo6Y3JlYXRlKCkK
ICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0TWV0aG9kKC4uLikKICAgICAq
ICAgICAuc2V0SGVhZGVycyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxk
c1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4o
YWRvcHRSZWYobmV3IFJlcXVlc3QoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJh
aXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRQb3N0RGF0YShjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygicG9zdERhdGEiLCB2YWx1ZSk7CiAgICB9
Cn07CgovKiBIVFRQIHJlc3BvbnNlIGRhdGEuICovCmNsYXNzIFJlc3BvbnNlIDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0g
MCwKICAgICAgICBVcmxTZXQgPSAxIDw8IDAsCiAgICAgICAgU3RhdHVzU2V0ID0gMSA8PCAxLAog
ICAgICAgIFN0YXR1c1RleHRTZXQgPSAxIDw8IDIsCiAgICAgICAgSGVhZGVyc1NldCA9IDEgPDwg
MywKICAgICAgICBNaW1lVHlwZVNldCA9IDEgPDwgNCwKICAgICAgICBDb25uZWN0aW9uUmV1c2Vk
U2V0ID0gMSA8PCA1LAogICAgICAgIENvbm5lY3Rpb25JZFNldCA9IDEgPDwgNiwKICAgICAgICBB
bGxGaWVsZHNTZXQgPSAoVXJsU2V0IHwgU3RhdHVzU2V0IHwgU3RhdHVzVGV4dFNldCB8IEhlYWRl
cnNTZXQgfCBNaW1lVHlwZVNldCB8IENvbm5lY3Rpb25SZXVzZWRTZXQgfCBDb25uZWN0aW9uSWRT
ZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewog
ICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAg
ICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRl
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVy
PFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1Jl
ZlB0cjxSZXNwb25zZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7
CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xh
c3MgUmVzcG9uc2U7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+
JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBVcmxTZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8VXJsU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IFN0YXR1c1NldD4mIHNldFN0YXR1cyhkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3RhdHVzU2V0KSwgcHJvcGVydHlfc3Rh
dHVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic3RhdHVz
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0YXR1c1NldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTdGF0dXNUZXh0U2V0PiYgc2V0U3RhdHVz
VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFN0YXR1c1RleHRTZXQpLCBwcm9wZXJ0eV9zdGF0dXNUZXh0X2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3RhdHVzVGV4dCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGF0dXNUZXh0U2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhlYWRlcnNTZXQ+JiBzZXRIZWFkZXJzKFBh
c3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIZWFkZXJzU2V0KSwgcHJvcGVydHlfaGVhZGVyc19hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SGVhZGVyc1NldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBNaW1lVHlwZVNldD4mIHNldE1pbWVUeXBlKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgTWltZVR5cGVTZXQpLCBwcm9wZXJ0eV9taW1lVHlwZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm1pbWVUeXBlIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPE1pbWVUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IENvbm5lY3Rpb25SZXVzZWRTZXQ+JiBzZXRDb25uZWN0aW9uUmV1c2VkKGJv
b2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
Q29ubmVjdGlvblJldXNlZFNldCksIHByb3BlcnR5X2Nvbm5lY3Rpb25SZXVzZWRfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiY29ubmVjdGlvblJldXNlZCIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb25uZWN0aW9uUmV1c2VkU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENvbm5lY3Rpb25JZFNldD4m
IHNldENvbm5lY3Rpb25JZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgQ29ubmVjdGlvbklkU2V0KSwgcHJvcGVydHlfY29ubmVjdGlv
bklkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY29ubmVj
dGlvbklkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENvbm5lY3Rpb25J
ZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZXNwb25zZT4mICgp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNT
ZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8UmVmUHRyPFJlc3BvbnNlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPFJlc3BvbnNlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuIFJlZlB0cjxSZXNwb25zZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAg
ICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxSZXNwb25zZT4gcmVzdWx0
ID0gUmVzcG9uc2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAgICAg
LnNldFN0YXR1cyguLi4pCiAgICAgKiAgICAgLnNldFN0YXR1c1RleHQoLi4uKQogICAgICogICAg
IC5zZXRIZWFkZXJzKC4uLikKICAgICAqICAgICAuc2V0TWltZVR5cGUoLi4uKQogICAgICogICAg
IC5zZXRDb25uZWN0aW9uUmV1c2VkKC4uLikKICAgICAqICAgICAuc2V0Q29ubmVjdGlvbklkKC4u
Lik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAg
ewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgUmVzcG9u
c2UoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cgog
ICAgdm9pZCBzZXRIZWFkZXJzVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldFN0cmluZygiaGVhZGVyc1RleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBz
ZXRSZXF1ZXN0SGVhZGVycyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJyZXF1ZXN0SGVhZGVycyIsIHZhbHVlKTsKICAgIH0K
CiAgICB2b2lkIHNldFJlcXVlc3RIZWFkZXJzVGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldFN0cmluZygicmVxdWVzdEhlYWRlcnNUZXh0IiwgdmFsdWUpOwog
ICAgfQoKICAgIHZvaWQgc2V0RnJvbURpc2tDYWNoZShib29sIHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldEJvb2xlYW4oImZyb21EaXNrQ2FjaGUiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9p
ZCBzZXRUaW1pbmcoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXNvdXJjZVRp
bWluZz4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAg
dGhpcy0+c2V0T2JqZWN0KCJ0aW1pbmciLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBXZWJTb2NrZXQg
cmVxdWVzdCBkYXRhLiAqLwpjbGFzcyBXZWJTb2NrZXRSZXF1ZXN0IDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAg
ICAgICBSZXF1ZXN0S2V5M1NldCA9IDEgPDwgMCwKICAgICAgICBIZWFkZXJzU2V0ID0gMSA8PCAx
LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChSZXF1ZXN0S2V5M1NldCB8IEhlYWRlcnNTZXQpCiAg
ICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJp
dmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAg
dGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRF
IHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxX
ZWJTb2NrZXRSZXF1ZXN0PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRl
KTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBj
bGFzcyBXZWJTb2NrZXRSZXF1ZXN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgUmVxdWVzdEtleTNTZXQ+JiBzZXRSZXF1ZXN0S2V5Myhjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJlcXVlc3RLZXkz
U2V0KSwgcHJvcGVydHlfcmVxdWVzdEtleTNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJyZXF1ZXN0S2V5MyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxSZXF1ZXN0S2V5M1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBIZWFkZXJzU2V0PiYgc2V0SGVhZGVycyhQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
SGVhZGVyc1NldCksIHByb3BlcnR5X2hlYWRlcnNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0T2JqZWN0KCJoZWFkZXJzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPEhlYWRlcnNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQ
dHI8V2ViU29ja2V0UmVxdWVzdD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFdlYlNvY2tldFJlcXVlc3Q+Kj4o
Jm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8V2ViU29j
a2V0UmVxdWVzdD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8V2ViU29j
a2V0UmVxdWVzdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRo
ZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0PiByZXN1bHQg
PSBXZWJTb2NrZXRSZXF1ZXN0OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRSZXF1ZXN0S2V5Mygu
Li4pCiAgICAgKiAgICAgLnNldEhlYWRlcnMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBXZWJTb2NrZXRSZXF1ZXN0KCkpKTsKICAgIH0KICAgIHR5
cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogV2ViU29ja2V0IHJlc3Bv
bnNlIGRhdGEuICovCmNsYXNzIFdlYlNvY2tldFJlc3BvbnNlIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAg
ICBTdGF0dXNTZXQgPSAxIDw8IDAsCiAgICAgICAgU3RhdHVzVGV4dFNldCA9IDEgPDwgMSwKICAg
ICAgICBIZWFkZXJzU2V0ID0gMSA8PCAyLAogICAgICAgIENoYWxsZW5nZVJlc3BvbnNlU2V0ID0g
MSA8PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChTdGF0dXNTZXQgfCBTdGF0dXNUZXh0U2V0
IHwgSGVhZGVyc1NldCB8IENoYWxsZW5nZVJlc3BvbnNlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0
ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQ
PiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFdlYlNvY2tldFJl
c3BvbnNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhdHVzU2V0PiYg
c2V0U3RhdHVzKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBTdGF0dXNTZXQpLCBwcm9wZXJ0eV9zdGF0dXNfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzdGF0dXMiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8U3RhdHVzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFN0YXR1c1RleHRTZXQ+JiBzZXRTdGF0dXNUZXh0KGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3Rh
dHVzVGV4dFNldCksIHByb3BlcnR5X3N0YXR1c1RleHRfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdGF0dXNUZXh0IiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFN0YXR1c1RleHRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgSGVhZGVyc1NldD4mIHNldEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIEhlYWRlcnNTZXQpLCBwcm9wZXJ0eV9oZWFkZXJzX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxIZWFkZXJzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IENoYWxsZW5nZVJlc3BvbnNlU2V0PiYgc2V0Q2hhbGxlbmdlUmVzcG9uc2UoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBDaGFsbGVuZ2VSZXNwb25zZVNldCksIHByb3BlcnR5X2NoYWxsZW5nZVJlc3BvbnNlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygiY2hhbGxlbmdlUmVz
cG9uc2UiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q2hhbGxlbmdlUmVz
cG9uc2VTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8V2ViU29ja2V0
UmVzcG9uc2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxXZWJTb2NrZXRSZXNwb25zZT4qPigmbV9yZXN1bHQp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxXZWJTb2NrZXRSZXNwb25z
ZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8V2ViU29ja2V0UmVzcG9u
c2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29u
c3RydWN0b3I6CiAgICAgKiBSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+IHJlc3VsdCA9IFdlYlNv
Y2tldFJlc3BvbnNlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdGF0dXMoLi4uKQogICAgICog
ICAgIC5zZXRTdGF0dXNUZXh0KC4uLikKICAgICAqICAgICAuc2V0SGVhZGVycyguLi4pCiAgICAg
KiAgICAgLnNldENoYWxsZW5nZVJlc3BvbnNlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgV2ViU29ja2V0UmVzcG9uc2UoKSkpOwogICAgfQogICAg
dHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBJbmZvcm1hdGlvbiBh
Ym91dCB0aGUgY2FjaGVkIHJlc291cmNlLiAqLwpjbGFzcyBDYWNoZWRSZXNvdXJjZSA6IHB1Ymxp
YyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1Nl
dCA9IDAsCiAgICAgICAgVXJsU2V0ID0gMSA8PCAwLAogICAgICAgIFR5cGVTZXQgPSAxIDw8IDEs
CiAgICAgICAgQm9keVNpemVTZXQgPSAxIDw8IDIsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFVy
bFNldCB8IFR5cGVTZXQgfCBCb2R5U2l6ZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNU
QVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRl
cjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENhY2hlZFJlc291cmNlPiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVp
bGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBw
dHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDYWNoZWRSZXNvdXJjZTsKICAgIHB1
YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVybFNldD4mIHNldFVybChjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFVybFNldCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxV
cmxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNl
dFR5cGUoVHlwZUJ1aWxkZXI6OlBhZ2U6OlJlc291cmNlVHlwZTo6RW51bSB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVy
dHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5
cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlw
ZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBCb2R5U2l6ZVNldD4mIHNldEJvZHlTaXplKGRvdWJsZSB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBCb2R5U2l6ZVNl
dCksIHByb3BlcnR5X2JvZHlTaXplX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldE51bWJlcigiYm9keVNpemUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8Qm9keVNpemVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q2Fj
aGVkUmVzb3VyY2U+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDYWNoZWRSZXNvdXJjZT4qPigmbV9yZXN1bHQp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDYWNoZWRSZXNvdXJjZT4g
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+KCp0
aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0
b3I6CiAgICAgKiBSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+IHJlc3VsdCA9IENhY2hlZFJlc291cmNl
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRUeXBlKC4u
LikKICAgICAqICAgICAuc2V0Qm9keVNpemUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDYWNoZWRSZXNvdXJjZSgpKSk7CiAgICB9CiAgICB0eXBl
ZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFJlc3BvbnNlKC8q
UGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVzcG9uc2U+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicmVz
cG9uc2UiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVz
dCBpbml0aWF0b3IuICovCmNsYXNzIEluaXRpYXRvciA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qg
ewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICd0eXBlJyB3aGlsZSBn
ZW5lcmF0aW5nIEluaXRpYXRvci4KICAgIHN0cnVjdCBUeXBlIHsKICAgICAgICBlbnVtIEVudW0g
ewogICAgICAgICAgICBQYXJzZXIgPSAzOCwKICAgICAgICAgICAgU2NyaXB0ID0gMzksCiAgICAg
ICAgICAgIE90aGVyID0gMjUsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBUeXBlCgogICAg
ZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFR5cGVTZXQgPSAxIDw8IDAs
CiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFR5cGVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxJbml0aWF0b3I+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEluaXRpYXRvcjsKICAgIHB1YmxpYzoK
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKFR5cGU6OkVudW0gdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNl
dCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJ0eXBlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5
cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8SW5pdGlhdG9yPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8SW5p
dGlhdG9yPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVm
UHRyPEluaXRpYXRvcj4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8SW5p
dGlhdG9yPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEluaXRpYXRvcj4gcmVzdWx0ID0gSW5pdGlhdG9y
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRUeXBlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVy
PE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgSW5pdGlhdG9yKCkpKTsKICAgIH0KICAgIHR5cGVk
ZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0U3RhY2tUcmFjZSgv
KlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6Q29uc29sZTo6Q2FsbEZyYW1lID4gPiov
IFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dEFycmF5KCJzdGFja1RyYWNlIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0VXJsKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1
ZSk7CiAgICB9CgogICAgdm9pZCBzZXRMaW5lTnVtYmVyKGRvdWJsZSB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8v
IE5ldHdvcmsKCiNpZiBFTkFCTEUoU1FMX0RBVEFCQVNFKQpuYW1lc3BhY2UgRGF0YWJhc2Ugewov
KiBEYXRhYmFzZSBvYmplY3QuICovCmNsYXNzIERhdGFiYXNlIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAg
ICBJZFNldCA9IDEgPDwgMCwKICAgICAgICBEb21haW5TZXQgPSAxIDw8IDEsCiAgICAgICAgTmFt
ZVNldCA9IDEgPDwgMiwKICAgICAgICBWZXJzaW9uU2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZp
ZWxkc1NldCA9IChJZFNldCB8IERvbWFpblNldCB8IE5hbWVTZXQgfCBWZXJzaW9uU2V0KQogICAg
fTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZh
dGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRl
bXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAg
ICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8
IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RGF0
YWJhc2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAg
ICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIERhdGFi
YXNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSWRTZXQ+JiBzZXRJZChj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIElkU2V0KSwgcHJvcGVydHlfaWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEb21haW5T
ZXQ+JiBzZXREb21haW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEb21haW5TZXQpLCBwcm9wZXJ0eV9kb21haW5fYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJkb21haW4iLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RG9tYWluU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFt
ZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5h
bWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVmVyc2lvblNldD4m
IHNldFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWZXJzaW9uU2V0KSwgcHJvcGVydHlfdmVyc2lvbl9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZlcnNpb24iLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmVyc2lvblNldD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxEYXRhYmFzZT4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPERhdGFi
YXNlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PERhdGFiYXNlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxEYXRhYmFz
ZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxEYXRhYmFzZT4gcmVzdWx0ID0gRGF0YWJhc2U6OmNyZWF0
ZSgpCiAgICAgKiAgICAgLnNldElkKC4uLikKICAgICAqICAgICAuc2V0RG9tYWluKC4uLikKICAg
ICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFZlcnNpb24oLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAg
cmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBEYXRhYmFzZSgpKSk7CiAg
ICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gRGF0
YWJhc2UKCiNlbmRpZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQojaWYgRU5BQkxFKElOREVYRURf
REFUQUJBU0UpCm5hbWVzcGFjZSBJbmRleGVkREIgewovKiBTZWN1cml0eSBvcmlnaW4gd2l0aCBk
YXRhYmFzZSBuYW1lcy4gKi8KY2xhc3MgU2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcyA6
IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0Zp
ZWxkc1NldCA9IDAsCiAgICAgICAgU2VjdXJpdHlPcmlnaW5TZXQgPSAxIDw8IDAsCiAgICAgICAg
RGF0YWJhc2VOYW1lc1NldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU2VjdXJp
dHlPcmlnaW5TZXQgfCBEYXRhYmFzZU5hbWVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQg
U1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWls
ZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJh
c2VOYW1lcz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2Vj
dXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lczsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFNlY3VyaXR5T3JpZ2luU2V0PiYgc2V0U2VjdXJpdHlPcmlnaW4oY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBTZWN1cml0eU9yaWdpblNldCksIHByb3BlcnR5X3NlY3VyaXR5T3JpZ2luX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic2VjdXJpdHlPcmlnaW4iLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2VjdXJpdHlPcmlnaW5TZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRGF0YWJhc2VOYW1lc1NldD4mIHNldERh
dGFiYXNlTmFtZXMoLypQYXNzUmVmUHRyPEFycmF5T2Y8U3RyaW5nID4gPiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIERhdGFiYXNlTmFtZXNTZXQpLCBwcm9wZXJ0eV9kYXRhYmFzZU5hbWVzX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJkYXRhYmFzZU5hbWVz
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERhdGFiYXNlTmFtZXNTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U2VjdXJpdHlPcmlnaW5XaXRo
RGF0YWJhc2VOYW1lcz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNl
TmFtZXM+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4gKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiBSZWZQdHI8U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4oKnRoaXMp
OwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoK
ICAgICAqIFJlZlB0cjxTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzPiByZXN1bHQgPSBT
ZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRT
ZWN1cml0eU9yaWdpbiguLi4pCiAgICAgKiAgICAgLnNldERhdGFiYXNlTmFtZXMoLi4uKTsKICAg
ICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAg
ICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBTZWN1cml0eU9yaWdp
bldpdGhEYXRhYmFzZU5hbWVzKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0
cyBJdGVtVHJhaXRzOwp9OwoKLyogRGF0YWJhc2Ugd2l0aCBhbiBhcnJheSBvZiBvYmplY3Qgc3Rv
cmVzLiAqLwpjbGFzcyBEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXMgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAg
ICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgVmVyc2lvblNldCA9IDEgPDwgMSwKICAgICAg
ICBPYmplY3RTdG9yZXNTZXQgPSAxIDw8IDIsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVT
ZXQgfCBWZXJzaW9uU2V0IHwgT2JqZWN0U3RvcmVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxp
bnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBC
dWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3Rv
cmVzPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBO
b0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAg
ICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBEYXRhYmFz
ZVdpdGhPYmplY3RTdG9yZXM7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBO
YW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFZlcnNpb25TZXQ+JiBzZXRWZXJzaW9uKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVmVy
c2lvblNldCksIHByb3BlcnR5X3ZlcnNpb25fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJ2ZXJzaW9uIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPFZlcnNpb25TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
T2JqZWN0U3RvcmVzU2V0PiYgc2V0T2JqZWN0U3RvcmVzKC8qUGFzc1JlZlB0cjxBcnJheU9mPFR5
cGVCdWlsZGVyOjpJbmRleGVkREI6Ok9iamVjdFN0b3JlID4gPiovIFBhc3NSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIE9iamVjdFN0b3Jlc1NldCksIHByb3BlcnR5X29iamVjdFN0b3Jlc19hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgib2JqZWN0U3RvcmVzIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE9iamVjdFN0b3Jlc1NldD4oKTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+JiAo
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRz
U2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PFJlZlB0cjxEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+Kj4oJm1fcmVzdWx0KTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3Rv
cmVzPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxEYXRhYmFzZVdpdGhP
YmplY3RTdG9yZXM+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50
aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVz
PiByZXN1bHQgPSBEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM6OmNyZWF0ZSgpCiAgICAgKiAgICAg
LnNldE5hbWUoLi4uKQogICAgICogICAgIC5zZXRWZXJzaW9uKC4uLikKICAgICAqICAgICAuc2V0
T2JqZWN0U3RvcmVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0
PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9w
dFJlZihuZXcgRGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzKCkpKTsKICAgIH0KICAgIHR5cGVkZWYg
U3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogT2JqZWN0IHN0b3JlLiAqLwpjbGFz
cyBPYmplY3RTdG9yZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwKICAg
ICAgICBLZXlQYXRoU2V0ID0gMSA8PCAxLAogICAgICAgIEluZGV4ZXNTZXQgPSAxIDw8IDIsCiAg
ICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVTZXQgfCBLZXlQYXRoU2V0IHwgSW5kZXhlc1NldCkK
ICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBw
cml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAg
ICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRy
PE9iamVjdFN0b3JlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBPYmplY3RTdG9yZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVT
ZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9z
ZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgS2V5UGF0aFNldD4mIHNldEtleVBhdGgoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBLZXlQYXRo
U2V0KSwgcHJvcGVydHlfa2V5UGF0aF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXRTdHJpbmcoImtleVBhdGgiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8S2V5UGF0aFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJbmRl
eGVzU2V0PiYgc2V0SW5kZXhlcygvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6SW5k
ZXhlZERCOjpPYmplY3RTdG9yZUluZGV4ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIElu
ZGV4ZXNTZXQpLCBwcm9wZXJ0eV9pbmRleGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldEFycmF5KCJpbmRleGVzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPEluZGV4ZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8
T2JqZWN0U3RvcmU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RB
VEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxPYmplY3RTdG9yZT4qPigmbV9yZXN1bHQpOwog
ICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxPYmplY3RTdG9yZT4gKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8T2JqZWN0U3RvcmU+KCp0aGlzKTsKICAg
ICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAg
KiBSZWZQdHI8T2JqZWN0U3RvcmU+IHJlc3VsdCA9IE9iamVjdFN0b3JlOjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0S2V5UGF0aCguLi4pCiAgICAgKiAg
ICAgLnNldEluZGV4ZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFk
b3B0UmVmKG5ldyBPYmplY3RTdG9yZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1U
cmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIE9iamVjdCBzdG9yZSBpbmRleC4gKi8KY2xhc3MgT2Jq
ZWN0U3RvcmVJbmRleCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVt
IHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwKICAg
ICAgICBLZXlQYXRoU2V0ID0gMSA8PCAxLAogICAgICAgIFVuaXF1ZVNldCA9IDEgPDwgMiwKICAg
ICAgICBNdWx0aUVudHJ5U2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChOYW1l
U2V0IHwgS2V5UGF0aFNldCB8IFVuaXF1ZVNldCB8IE11bHRpRW50cnlTZXQpCiAgICB9OwoKICAg
IHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAg
ICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8
aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4q
Pih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxPYmplY3RTdG9y
ZUluZGV4PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBPYmpl
Y3RTdG9yZUluZGV4OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTmFtZVNl
dD4mIHNldE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBLZXlQYXRoU2V0PiYgc2V0S2V5UGF0aChjb25zdCBTdHJpbmcmIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEtleVBhdGhT
ZXQpLCBwcm9wZXJ0eV9rZXlQYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldFN0cmluZygia2V5UGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxLZXlQYXRoU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVuaXF1
ZVNldD4mIHNldFVuaXF1ZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIFVuaXF1ZVNldCksIHByb3BlcnR5X3VuaXF1ZV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJ1bmlxdWUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VW5pcXVlU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IE11bHRpRW50cnlTZXQ+JiBzZXRNdWx0aUVudHJ5KGJvb2wgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTXVsdGlF
bnRyeVNldCksIHByb3BlcnR5X211bHRpRW50cnlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0Qm9vbGVhbigibXVsdGlFbnRyeSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxNdWx0aUVudHJ5U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUmVmUHRyPE9iamVjdFN0b3JlSW5kZXg+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxPYmplY3RTdG9yZUlu
ZGV4Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRy
PE9iamVjdFN0b3JlSW5kZXg+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRy
PE9iamVjdFN0b3JlSW5kZXg+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAg
KiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8T2JqZWN0U3RvcmVJbmRleD4g
cmVzdWx0ID0gT2JqZWN0U3RvcmVJbmRleDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSgu
Li4pCiAgICAgKiAgICAgLnNldEtleVBhdGgoLi4uKQogICAgICogICAgIC5zZXRVbmlxdWUoLi4u
KQogICAgICogICAgIC5zZXRNdWx0aUVudHJ5KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVJbmRleCgpKSk7CiAgICB9CiAgICB0
eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gSW5kZXhlZERCCgoj
ZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCm5hbWVzcGFjZSBET01TdG9yYWdlIHsK
LyogRE9NIFN0b3JhZ2UgZW50cnkuICovCmNsYXNzIEVudHJ5IDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAg
ICBIb3N0U2V0ID0gMSA8PCAwLAogICAgICAgIElzTG9jYWxTdG9yYWdlU2V0ID0gMSA8PCAxLAog
ICAgICAgIElkU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChIb3N0U2V0IHwg
SXNMb2NhbFN0b3JhZ2VTZXQgfCBJZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRF
PgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxT
VEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpy
ZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPEVudHJ5PiBwdHIpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVk
X2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAg
fQogICAgICAgIGZyaWVuZCBjbGFzcyBFbnRyeTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IEhvc3RTZXQ+JiBzZXRIb3N0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSG9zdFNldCksIHByb3BlcnR5
X2hvc3RfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJob3N0
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhvc3RTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSXNMb2NhbFN0b3JhZ2VTZXQ+JiBzZXRJc0xv
Y2FsU3RvcmFnZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIElzTG9jYWxTdG9yYWdlU2V0KSwgcHJvcGVydHlfaXNMb2NhbFN0b3JhZ2Vf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiaXNMb2NhbFN0
b3JhZ2UiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SXNMb2NhbFN0b3Jh
Z2VTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSWRTZXQ+JiBzZXRJ
ZChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgSWRTZXQpLCBwcm9wZXJ0eV9pZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXROdW1iZXIoImlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PElkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEVudHJ5PiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8RW50cnk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFBhc3NSZWZQdHI8RW50cnk+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVm
UHRyPEVudHJ5PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhl
dGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEVudHJ5PiByZXN1bHQgPSBFbnRyeTo6Y3Jl
YXRlKCkKICAgICAqICAgICAuc2V0SG9zdCguLi4pCiAgICAgKiAgICAgLnNldElzTG9jYWxTdG9y
YWdlKC4uLikKICAgICAqICAgICAuc2V0SWQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBFbnRyeSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVj
dEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gRE9NU3RvcmFnZQoKbmFtZXNwYWNlIEFw
cGxpY2F0aW9uQ2FjaGUgewovKiBEZXRhaWxlZCBhcHBsaWNhdGlvbiBjYWNoZSByZXNvdXJjZSBp
bmZvcm1hdGlvbi4gKi8KY2xhc3MgQXBwbGljYXRpb25DYWNoZVJlc291cmNlIDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0g
MCwKICAgICAgICBVcmxTZXQgPSAxIDw8IDAsCiAgICAgICAgU2l6ZVNldCA9IDEgPDwgMSwKICAg
ICAgICBUeXBlU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChVcmxTZXQgfCBT
aXplU2V0IHwgVHlwZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xh
c3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNU
RVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcihQYXNzUmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxk
ZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRy
OwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQXBwbGljYXRpb25DYWNoZVJlc291cmNl
OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaXpl
U2V0PiYgc2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgU2l6ZVNldCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFNpemVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlw
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+JiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0
LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+Kj4oJm1fcmVzdWx0KTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNl
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hl
UmVzb3VyY2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0
aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPiBy
ZXN1bHQgPSBBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNl
dFVybCguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRUeXBlKC4u
Lik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAg
ewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQXBwbGlj
YXRpb25DYWNoZVJlc291cmNlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0
cyBJdGVtVHJhaXRzOwp9OwoKLyogRGV0YWlsZWQgYXBwbGljYXRpb24gY2FjaGUgaW5mb3JtYXRp
b24uICovCmNsYXNzIEFwcGxpY2F0aW9uQ2FjaGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE1hbmlm
ZXN0VVJMU2V0ID0gMSA8PCAwLAogICAgICAgIFNpemVTZXQgPSAxIDw8IDEsCiAgICAgICAgQ3Jl
YXRpb25UaW1lU2V0ID0gMSA8PCAyLAogICAgICAgIFVwZGF0ZVRpbWVTZXQgPSAxIDw8IDMsCiAg
ICAgICAgUmVzb3VyY2VzU2V0ID0gMSA8PCA0LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChNYW5p
ZmVzdFVSTFNldCB8IFNpemVTZXQgfCBDcmVhdGlvblRpbWVTZXQgfCBVcGRhdGVUaW1lU2V0IHwg
UmVzb3VyY2VzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBC
dWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9y
ZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4m
IGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyKFBhc3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4gcHRyKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9p
bl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0K
ICAgICAgICBmcmllbmQgY2xhc3MgQXBwbGljYXRpb25DYWNoZTsKICAgIHB1YmxpYzoKCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IE1hbmlmZXN0VVJMU2V0PiYgc2V0TWFuaWZlc3RVUkwoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBNYW5pZmVzdFVSTFNldCksIHByb3BlcnR5X21hbmlmZXN0VVJMX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibWFuaWZlc3RVUkwiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWFuaWZlc3RVUkxTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2l6ZVNldD4mIHNldFNpemUoZG91YmxlIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNpemVTZXQpLCBw
cm9wZXJ0eV9zaXplX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJl
cigic2l6ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaXplU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENyZWF0aW9uVGltZVNldD4mIHNl
dENyZWF0aW9uVGltZShkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgQ3JlYXRpb25UaW1lU2V0KSwgcHJvcGVydHlfY3JlYXRpb25UaW1l
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY3JlYXRpb25U
aW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENyZWF0aW9uVGltZVNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcGRhdGVUaW1lU2V0PiYg
c2V0VXBkYXRlVGltZShkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgVXBkYXRlVGltZVNldCksIHByb3BlcnR5X3VwZGF0ZVRpbWVfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJ1cGRhdGVUaW1lIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVwZGF0ZVRpbWVTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUmVzb3VyY2VzU2V0PiYgc2V0UmVzb3Vy
Y2VzKC8qUGFzc1JlZlB0cjxBcnJheU9mPFR5cGVCdWlsZGVyOjpBcHBsaWNhdGlvbkNhY2hlOjpB
cHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4g
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUmVz
b3VyY2VzU2V0KSwgcHJvcGVydHlfcmVzb3VyY2VzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldEFycmF5KCJyZXNvdXJjZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8UmVzb3VyY2VzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAg
ICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hl
Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEFw
cGxpY2F0aW9uQ2FjaGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEFw
cGxpY2F0aW9uQ2FjaGU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBT
eW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8QXBwbGljYXRpb25DYWNoZT4gcmVz
dWx0ID0gQXBwbGljYXRpb25DYWNoZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TWFuaWZlc3RV
UkwoLi4uKQogICAgICogICAgIC5zZXRTaXplKC4uLikKICAgICAqICAgICAuc2V0Q3JlYXRpb25U
aW1lKC4uLikKICAgICAqICAgICAuc2V0VXBkYXRlVGltZSguLi4pCiAgICAgKiAgICAgLnNldFJl
c291cmNlcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3Jl
YXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYo
bmV3IEFwcGxpY2F0aW9uQ2FjaGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJh
aXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBGcmFtZSBpZGVudGlmaWVyIC0gbWFuaWZlc3QgVVJMIHBh
aXIuICovCmNsYXNzIEZyYW1lV2l0aE1hbmlmZXN0IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBGcmFt
ZUlkU2V0ID0gMSA8PCAwLAogICAgICAgIE1hbmlmZXN0VVJMU2V0ID0gMSA8PCAxLAogICAgICAg
IFN0YXR1c1NldCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoRnJhbWVJZFNldCB8
IE1hbmlmZXN0VVJMU2V0IHwgU3RhdHVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RB
VEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVy
PFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+IHB0cikKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEZyYW1lV2l0aE1hbmlmZXN0Owog
ICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRnJhbWVJZFNldD4mIHNldEZyYW1l
SWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEZy
YW1lSWRTZXQpLCBwcm9wZXJ0eV9mcmFtZUlkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygiZnJhbWVJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxGcmFtZUlkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IE1hbmlmZXN0VVJMU2V0PiYgc2V0TWFuaWZlc3RVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYW5pZmVzdFVSTFNl
dCksIHByb3BlcnR5X21hbmlmZXN0VVJMX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygibWFuaWZlc3RVUkwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8TWFuaWZlc3RVUkxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgU3RhdHVzU2V0PiYgc2V0U3RhdHVzKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdGF0dXNTZXQpLCBwcm9wZXJ0eV9zdGF0dXNf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzdGF0dXMiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3RhdHVzU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFBhc3NSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+ICgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gUmVmUHRyPEZyYW1lV2l0aE1hbmlmZXN0PigqdGhpcyk7CiAgICAgICAg
fQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVm
UHRyPEZyYW1lV2l0aE1hbmlmZXN0PiByZXN1bHQgPSBGcmFtZVdpdGhNYW5pZmVzdDo6Y3JlYXRl
KCkKICAgICAqICAgICAuc2V0RnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldE1hbmlmZXN0VVJM
KC4uLikKICAgICAqICAgICAuc2V0U3RhdHVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgRnJhbWVXaXRoTWFuaWZlc3QoKSkpOwogICAgfQogICAg
dHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07Cgp9IC8vIEFwcGxpY2F0aW9u
Q2FjaGUKCm5hbWVzcGFjZSBET00gewovKiBET00gaW50ZXJhY3Rpb24gaXMgaW1wbGVtZW50ZWQg
aW4gdGVybXMgb2YgbWlycm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIGFjdHVhbCBET00g
bm9kZXMuIERPTU5vZGUgaXMgYSBiYXNlIG5vZGUgbWlycm9yIHR5cGUuICovCmNsYXNzIE5vZGUg
OiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9G
aWVsZHNTZXQgPSAwLAogICAgICAgIE5vZGVJZFNldCA9IDEgPDwgMCwKICAgICAgICBOb2RlVHlw
ZVNldCA9IDEgPDwgMSwKICAgICAgICBOb2RlTmFtZVNldCA9IDEgPDwgMiwKICAgICAgICBMb2Nh
bE5hbWVTZXQgPSAxIDw8IDMsCiAgICAgICAgTm9kZVZhbHVlU2V0ID0gMSA8PCA0LAogICAgICAg
IEFsbEZpZWxkc1NldCA9IChOb2RlSWRTZXQgfCBOb2RlVHlwZVNldCB8IE5vZGVOYW1lU2V0IHwg
TG9jYWxOYW1lU2V0IHwgTm9kZVZhbHVlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RB
VEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVy
PFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Tm9kZT4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRl
ZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAg
IH0KICAgICAgICBmcmllbmQgY2xhc3MgTm9kZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IE5vZGVJZFNldD4mIHNldE5vZGVJZChpbnQgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZUlkU2V0KSwgcHJvcGVydHlfbm9k
ZUlkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibm9kZUlk
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5vZGVJZFNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOb2RlVHlwZVNldD4mIHNldE5vZGVUeXBl
KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBOb2RlVHlwZVNldCksIHByb3BlcnR5X25vZGVUeXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldE51bWJlcigibm9kZVR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8Tm9kZVR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgTm9kZU5hbWVTZXQ+JiBzZXROb2RlTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5vZGVOYW1lU2V0
KSwgcHJvcGVydHlfbm9kZU5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJub2RlTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxOb2RlTmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMb2Nh
bE5hbWVTZXQ+JiBzZXRMb2NhbE5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBMb2NhbE5hbWVTZXQpLCBwcm9wZXJ0
eV9sb2NhbE5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJsb2NhbE5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TG9jYWxO
YW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5vZGVWYWx1ZVNl
dD4mIHNldE5vZGVWYWx1ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5vZGVWYWx1ZVNldCksIHByb3BlcnR5X25vZGVW
YWx1ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5vZGVW
YWx1ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlVmFsdWVTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Tm9kZT4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPE5vZGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8Tm9kZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Tm9kZT4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxOb2RlPiByZXN1bHQgPSBOb2RlOjpjcmVhdGUoKQogICAgICog
ICAgIC5zZXROb2RlSWQoLi4uKQogICAgICogICAgIC5zZXROb2RlVHlwZSguLi4pCiAgICAgKiAg
ICAgLnNldE5vZGVOYW1lKC4uLikKICAgICAqICAgICAuc2V0TG9jYWxOYW1lKC4uLikKICAgICAq
ICAgICAuc2V0Tm9kZVZhbHVlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmll
bGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0
PihhZG9wdFJlZihuZXcgTm9kZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFp
dHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldENoaWxkTm9kZUNvdW50KGludCB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoImNoaWxkTm9kZUNvdW50IiwgdmFsdWUpOwogICAg
fQoKICAgIHZvaWQgc2V0Q2hpbGRyZW4oLypQYXNzUmVmUHRyPEFycmF5T2Y8VHlwZUJ1aWxkZXI6
OkRPTTo6Tm9kZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRBcnJheSgiY2hpbGRyZW4iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9p
ZCBzZXRBdHRyaWJ1dGVzKC8qUGFzc1JlZlB0cjxBcnJheU9mPFN0cmluZyA+ID4qLyBQYXNzUmVm
UHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgi
YXR0cmlidXRlcyIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldERvY3VtZW50VVJMKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJkb2N1bWVudFVS
TCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFB1YmxpY0lkKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwdWJsaWNJZCIsIHZhbHVlKTsKICAg
IH0KCiAgICB2b2lkIHNldFN5c3RlbUlkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0U3RyaW5nKCJzeXN0ZW1JZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNl
dEludGVybmFsU3Vic2V0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJpbnRlcm5hbFN1YnNldCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFht
bFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJp
bmcoInhtbFZlcnNpb24iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUp
OwogICAgfQoKICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5z
cGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXRDb250ZW50RG9jdW1lbnQoLypQ
YXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006Ok5vZGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiY29udGVudERvY3Vt
ZW50IiwgdmFsdWUpOwogICAgfQp9OwoKLyogRE9NIGludGVyYWN0aW9uIGlzIGltcGxlbWVudGVk
IGluIHRlcm1zIG9mIG1pcnJvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHRoZSBhY3R1YWwgRE9N
IG5vZGVzLiBET01Ob2RlIGlzIGEgYmFzZSBub2RlIG1pcnJvciB0eXBlLiAqLwpjbGFzcyBFdmVu
dExpc3RlbmVyIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewog
ICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAwLAogICAgICAg
IFVzZUNhcHR1cmVTZXQgPSAxIDw8IDEsCiAgICAgICAgSXNBdHRyaWJ1dGVTZXQgPSAxIDw8IDIs
CiAgICAgICAgTm9kZUlkU2V0ID0gMSA8PCAzLAogICAgICAgIEhhbmRsZXJCb2R5U2V0ID0gMSA8
PCA0LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0IHwgVXNlQ2FwdHVyZVNldCB8IElz
QXR0cmlidXRlU2V0IHwgTm9kZUlkU2V0IHwgSGFuZGxlckJvZHlTZXQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxFdmVudExpc3RlbmVy
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0Zp
ZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBFdmVudExpc3Rl
bmVyOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5
cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBVc2VDYXB0dXJlU2V0PiYgc2V0VXNlQ2FwdHVyZShib29sIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVzZUNhcHR1cmVTZXQpLCBwcm9w
ZXJ0eV91c2VDYXB0dXJlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJv
b2xlYW4oInVzZUNhcHR1cmUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
VXNlQ2FwdHVyZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBJc0F0
dHJpYnV0ZVNldD4mIHNldElzQXR0cmlidXRlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSXNBdHRyaWJ1dGVTZXQpLCBwcm9wZXJ0eV9p
c0F0dHJpYnV0ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFu
KCJpc0F0dHJpYnV0ZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxJc0F0
dHJpYnV0ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOb2RlSWRT
ZXQ+JiBzZXROb2RlSWQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE5vZGVJZFNldCksIHByb3BlcnR5X25vZGVJZF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm5vZGVJZCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgSGFuZGxlckJvZHlTZXQ+JiBzZXRIYW5kbGVyQm9keShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IEhhbmRsZXJCb2R5U2V0KSwgcHJvcGVydHlfaGFuZGxlckJvZHlfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJoYW5kbGVyQm9keSIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIYW5kbGVyQm9keVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxFdmVudExpc3RlbmVyPiYgKCkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9y
ZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RXZlbnRM
aXN0ZW5lcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxFdmVudExpc3RlbmVyPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0
cjxFdmVudExpc3RlbmVyPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEV2ZW50TGlzdGVuZXI+IHJlc3Vs
dCA9IEV2ZW50TGlzdGVuZXI6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUoLi4uKQogICAg
ICogICAgIC5zZXRVc2VDYXB0dXJlKC4uLikKICAgICAqICAgICAuc2V0SXNBdHRyaWJ1dGUoLi4u
KQogICAgICogICAgIC5zZXROb2RlSWQoLi4uKQogICAgICogICAgIC5zZXRIYW5kbGVyQm9keSgu
Li4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAg
IHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEV2ZW50
TGlzdGVuZXIoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFp
dHM7CgogICAgdm9pZCBzZXRMb2NhdGlvbigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRlYnVn
Z2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJsb2NhdGlvbiIsIHZhbHVlKTsKICAgIH0KfTsKCi8q
IEEgc3RydWN0dXJlIGhvbGRpbmcgYW4gUkdCQSBjb2xvci4gKi8KLy8gVHlwZSBvcmlnaW5hbGx5
IHdhcyBuYW1lZCAnUkdCQScuCmNsYXNzIFJnYmEgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFJTZXQg
PSAxIDw8IDAsCiAgICAgICAgR1NldCA9IDEgPDwgMSwKICAgICAgICBCU2V0ID0gMSA8PCAyLAog
ICAgICAgIEFsbEZpZWxkc1NldCA9IChSU2V0IHwgR1NldCB8IEJTZXQpCiAgICB9OwoKICAgIHRl
bXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50
IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0
aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZ2JhPiBwdHIpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwg
YnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQg
PSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZ2JhOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUlNldD4mIHNldFIoaW50IHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFJTZXQpLCBwcm9wZXJ0eV9yX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiciIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IEdTZXQ+JiBzZXRHKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBHU2V0KSwgcHJvcGVydHlfZ19hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImciLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8R1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBCU2V0PiYgc2V0QihpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgQlNldCksIHByb3BlcnR5X2JfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJiIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPEJTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8
UmdiYT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBB
bGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJnYmE+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmdiYT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiBSZWZQdHI8UmdiYT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAq
IFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxSZ2JhPiByZXN1bHQgPSBSZ2Jh
OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRSKC4uLikKICAgICAqICAgICAuc2V0RyguLi4pCiAg
ICAgKiAgICAgLnNldEIoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFk
b3B0UmVmKG5ldyBSZ2JhKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJ
dGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0QShkb3VibGUgdmFsdWUpCiAgICB7CiAgICAgICAgdGhp
cy0+c2V0TnVtYmVyKCJhIiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ29uZmlndXJhdGlvbiBkYXRh
IGZvciB0aGUgaGlnaGxpZ2h0aW5nIG9mIHBhZ2UgZWxlbWVudHMuICovCmNsYXNzIEhpZ2hsaWdo
dENvbmZpZyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAg
ICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gMAogICAgfTsKCiAg
ICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAg
ICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRl
PGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+
Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8SGlnaGxpZ2h0
Q29uZmlnPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBIaWdo
bGlnaHRDb25maWc7CiAgICBwdWJsaWM6CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxIaWdobGln
aHRDb25maWc+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxIaWdobGlnaHRDb25maWc+Kj4oJm1fcmVzdWx0KTsK
ICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiAo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxIaWdobGlnaHRDb25maWc+KCp0
aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0
b3I6CiAgICAgKiBSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiByZXN1bHQgPSBIaWdobGlnaHRDb25m
aWc6OmNyZWF0ZSgpOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3Jl
YXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYo
bmV3IEhpZ2hsaWdodENvbmZpZygpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFp
dHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFNob3dJbmZvKGJvb2wgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0Qm9vbGVhbigic2hvd0luZm8iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9p
ZCBzZXRDb250ZW50Q29sb3IoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006OlJnYmE+Ki8g
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dE9iamVjdCgiY29udGVudENvbG9yIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UGFkZGlu
Z0NvbG9yKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9NOjpSZ2JhPiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInBh
ZGRpbmdDb2xvciIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldEJvcmRlckNvbG9yKC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9NOjpSZ2JhPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoImJvcmRlckNvbG9yIiwg
dmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TWFyZ2luQ29sb3IoLypQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpET006OlJnYmE+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQog
ICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgibWFyZ2luQ29sb3IiLCB2YWx1ZSk7CiAgICB9
Cn07Cgp9IC8vIERPTQoKbmFtZXNwYWNlIENTUyB7Ci8qIFRoaXMgb2JqZWN0IGlkZW50aWZpZXMg
YSBDU1Mgc3R5bGUgaW4gYSB1bmlxdWUgd2F5LiAqLwpjbGFzcyBDU1NTdHlsZUlkIDogcHVibGlj
IEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0
ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgT3JkaW5hbFNl
dCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU3R5bGVTaGVldElkU2V0IHwgT3Jk
aW5hbFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPENTU1N0eWxlSWQ+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRf
c3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJp
ZW5kIGNsYXNzIENTU1N0eWxlSWQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBTdHlsZVNoZWV0SWRTZXQ+JiBzZXRTdHlsZVNoZWV0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdHlsZVNoZWV0
SWRTZXQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8U3R5bGVTaGVldElkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IE9yZGluYWxTZXQ+JiBzZXRPcmRpbmFsKGludCB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPcmRpbmFsU2V0KSwgcHJvcGVy
dHlfb3JkaW5hbF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
Im9yZGluYWwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T3JkaW5hbFNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZUlkPiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q1NTU3R5bGVJZD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZUlkPiAoKQogICAgICAgIHsKICAgICAgICAgICAg
cmV0dXJuIFJlZlB0cjxDU1NTdHlsZUlkPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1N0eWxlSWQ+
IHJlc3VsdCA9IENTU1N0eWxlSWQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJ
ZCguLi4pCiAgICAgKiAgICAgLnNldE9yZGluYWwoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1
aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZUlkKCkpKTsKICAgIH0KICAgIHR5cGVk
ZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogVGhpcyBvYmplY3QgaWRlbnRp
ZmllcyBhIENTUyBydWxlIGluIGEgdW5pcXVlIHdheS4gKi8KY2xhc3MgQ1NTUnVsZUlkIDogcHVi
bGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRz
U2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgT3JkaW5h
bFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU3R5bGVTaGVldElkU2V0IHwg
T3JkaW5hbFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVp
bGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVz
dWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBj
YXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0
PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cihQYXNzUmVmUHRyPENTU1J1bGVJZD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5p
dF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBm
cmllbmQgY2xhc3MgQ1NTUnVsZUlkOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgU3R5bGVTaGVldElkU2V0PiYgc2V0U3R5bGVTaGVldElkKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3R5bGVTaGVl
dElkU2V0KSwgcHJvcGVydHlfc3R5bGVTaGVldElkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygic3R5bGVTaGVldElkIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFN0eWxlU2hlZXRJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBPcmRpbmFsU2V0PiYgc2V0T3JkaW5hbChpbnQgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgT3JkaW5hbFNldCksIHByb3Bl
cnR5X29yZGluYWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVy
KCJvcmRpbmFsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE9yZGluYWxT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTUnVsZUlkPiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q1NTUnVsZUlkPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBv
cGVyYXRvciBQYXNzUmVmUHRyPENTU1J1bGVJZD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiBSZWZQdHI8Q1NTUnVsZUlkPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgog
ICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1J1bGVJZD4gcmVz
dWx0ID0gQ1NTUnVsZUlkOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdHlsZVNoZWV0SWQoLi4u
KQogICAgICogICAgIC5zZXRPcmRpbmFsKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVy
PE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmll
bGRzU2V0PihhZG9wdFJlZihuZXcgQ1NTUnVsZUlkKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3Ry
dWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogQ1NTIHJ1bGUgY29sbGVjdGlvbiBmb3Ig
YSBzaW5nbGUgcHNldWRvIHN0eWxlLiAqLwpjbGFzcyBQc2V1ZG9JZFJ1bGVzIDogcHVibGljIElu
c3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0g
MCwKICAgICAgICBQc2V1ZG9JZFNldCA9IDEgPDwgMCwKICAgICAgICBSdWxlc1NldCA9IDEgPDwg
MSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoUHNldWRvSWRTZXQgfCBSdWxlc1NldCkKICAgIH07
CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRl
OgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1w
bGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFBzZXVk
b0lkUnVsZXM+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAg
ICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFBz
ZXVkb0lkUnVsZXM7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBQc2V1ZG9J
ZFNldD4mIHNldFBzZXVkb0lkKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBQc2V1ZG9JZFNldCksIHByb3BlcnR5X3BzZXVkb0lkX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicHNldWRvSWQiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UHNldWRvSWRTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUnVsZXNTZXQ+JiBzZXRSdWxlcygvKlBhc3NSZWZQ
dHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6Q1NTOjpDU1NSdWxlID4gPiovIFBhc3NSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFJ1bGVzU2V0KSwgcHJvcGVydHlfcnVsZXNfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInJ1bGVzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFJ1bGVzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPFBzZXVkb0lkUnVsZXM+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAg
ICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxQc2V1ZG9JZFJ1bGVzPio+KCZtX3Jl
c3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFBzZXVkb0lkUnVs
ZXM+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFBzZXVkb0lkUnVsZXM+
KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3Ry
dWN0b3I6CiAgICAgKiBSZWZQdHI8UHNldWRvSWRSdWxlcz4gcmVzdWx0ID0gUHNldWRvSWRSdWxl
czo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0UHNldWRvSWQoLi4uKQogICAgICogICAgIC5zZXRS
dWxlcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3
IFBzZXVkb0lkUnVsZXMoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0
ZW1UcmFpdHM7Cn07CgovKiBDU1MgcnVsZSBjb2xsZWN0aW9uIGZvciBhIHNpbmdsZSBwc2V1ZG8g
c3R5bGUuICovCmNsYXNzIEluaGVyaXRlZFN0eWxlRW50cnkgOiBwdWJsaWMgSW5zcGVjdG9yT2Jq
ZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAg
IE1hdGNoZWRDU1NSdWxlc1NldCA9IDEgPDwgMCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoTWF0
Y2hlZENTU1J1bGVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFz
cyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RF
UD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyKFBhc3NSZWZQdHI8SW5oZXJpdGVkU3R5bGVFbnRyeT4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3Jl
YXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAg
ICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgSW5oZXJpdGVkU3R5bGVFbnRyeTsKICAgIHB1Ymxp
YzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE1hdGNoZWRDU1NSdWxlc1NldD4mIHNldE1hdGNo
ZWRDU1NSdWxlcygvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6Q1NTOjpDU1NSdWxl
ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1hdGNoZWRDU1NSdWxlc1NldCksIHByb3Bl
cnR5X21hdGNoZWRDU1NSdWxlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRBcnJheSgibWF0Y2hlZENTU1J1bGVzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPE1hdGNoZWRDU1NSdWxlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9y
IFJlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8SW5oZXJpdGVkU3R5
bGVFbnRyeT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
IFJlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAg
ICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPEluaGVyaXRl
ZFN0eWxlRW50cnk+IHJlc3VsdCA9IEluaGVyaXRlZFN0eWxlRW50cnk6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldE1hdGNoZWRDU1NSdWxlcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0Zp
ZWxkc1NldD4oYWRvcHRSZWYobmV3IEluaGVyaXRlZFN0eWxlRW50cnkoKSkpOwogICAgfQogICAg
dHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRJbmxpbmVT
dHlsZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTU3R5bGU+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgi
aW5saW5lU3R5bGUiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBDU1Mgc3R5bGUgaW5mb3JtYXRpb24g
Zm9yIGEgRE9NIHN0eWxlIGF0dHJpYnV0ZS4gKi8KY2xhc3MgQ1NTU3R5bGVBdHRyaWJ1dGUgOiBw
dWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVs
ZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgU3R5bGVTZXQgPSAx
IDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVTZXQgfCBTdHlsZVNldCkKICAgIH07
CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRl
OgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1w
bGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBT
VEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0
eWxlQXR0cmlidXRlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBDU1NTdHlsZUF0dHJpYnV0ZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTZXQ+JiBzZXRTdHlsZSgvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6OkNTUzo6Q1NTU3R5bGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxl
U2V0KSwgcHJvcGVydHlfc3R5bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0T2JqZWN0KCJzdHlsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxT
dHlsZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZUF0
dHJpYnV0ZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlQXR0cmlidXRlPio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlQXR0cmlidXRl
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZUF0dHJpYnV0
ZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4gcmVzdWx0ID0gQ1NTU3R5
bGVBdHRyaWJ1dGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldE5hbWUoLi4uKQogICAgICogICAg
IC5zZXRTdHlsZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4g
Y3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRS
ZWYobmV3IENTU1N0eWxlQXR0cmlidXRlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRl
bVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogQ1NTIHN0eWxlc2hlZXQgbWV0YWluZm9ybWF0aW9u
LiAqLwpjbGFzcyBDU1NTdHlsZVNoZWV0SGVhZGVyIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHls
ZVNoZWV0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgU291cmNlVVJMU2V0ID0gMSA8PCAxLAogICAg
ICAgIFRpdGxlU2V0ID0gMSA8PCAyLAogICAgICAgIERpc2FibGVkU2V0ID0gMSA8PCAzLAogICAg
ICAgIEFsbEZpZWxkc1NldCA9IChTdHlsZVNoZWV0SWRTZXQgfCBTb3VyY2VVUkxTZXQgfCBUaXRs
ZVNldCB8IERpc2FibGVkU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBj
bGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwg
U1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJw
cmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4gcHRyKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJf
Y3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwog
ICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGVTaGVldEhlYWRlcjsKICAgIHB1
YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFN0eWxlU2hlZXRJZFNldD4mIHNldFN0eWxl
U2hlZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIFN0eWxlU2hlZXRJZFNldCksIHByb3BlcnR5X3N0eWxlU2hlZXRJ
ZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0eWxlU2hl
ZXRJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdHlsZVNoZWV0SWRT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU291cmNlVVJMU2V0PiYg
c2V0U291cmNlVVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlVVJMU2V0KSwgcHJvcGVydHlfc291cmNlVVJM
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlVVJM
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNvdXJjZVVSTFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUaXRsZVNldD4mIHNldFRpdGxlKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgVGl0bGVTZXQpLCBwcm9wZXJ0eV90aXRsZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInRpdGxlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFRpdGxlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IERpc2FibGVkU2V0PiYgc2V0RGlzYWJsZWQoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEaXNhYmxlZFNldCksIHByb3BlcnR5X2Rp
c2FibGVkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImRp
c2FibGVkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERpc2FibGVkU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFk
ZXI+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxs
RmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPio+KCZtX3Jlc3VsdCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+
ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFk
ZXI+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29u
c3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4gcmVzdWx0ID0gQ1NT
U3R5bGVTaGVldEhlYWRlcjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3R5bGVTaGVldElkKC4u
LikKICAgICAqICAgICAuc2V0U291cmNlVVJMKC4uLikKICAgICAqICAgICAuc2V0VGl0bGUoLi4u
KQogICAgICogICAgIC5zZXREaXNhYmxlZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRl
cjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0Zp
ZWxkc1NldD4oYWRvcHRSZWYobmV3IENTU1N0eWxlU2hlZXRIZWFkZXIoKSkpOwogICAgfQogICAg
dHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBDU1Mgc3R5bGVzaGVl
dCBjb250ZW50cy4gKi8KY2xhc3MgQ1NTU3R5bGVTaGVldEJvZHkgOiBwdWJsaWMgSW5zcGVjdG9y
T2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAg
ICAgIFN0eWxlU2hlZXRJZFNldCA9IDEgPDwgMCwKICAgICAgICBSdWxlc1NldCA9IDEgPDwgMSwK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU3R5bGVTaGVldElkU2V0IHwgUnVsZXNTZXQpCiAgICB9
OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0
ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVt
cGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAg
ICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwg
U1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NT
dHlsZVNoZWV0Qm9keT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7
CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xh
c3MgQ1NTU3R5bGVTaGVldEJvZHk7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBTdHlsZVNoZWV0SWRTZXQ+JiBzZXRTdHlsZVNoZWV0SWQoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdHlsZVNoZWV0
SWRTZXQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8U3R5bGVTaGVldElkU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFJ1bGVzU2V0PiYgc2V0UnVsZXMoLypQYXNzUmVmUHRyPEFycmF5T2Y8VHlw
ZUJ1aWxkZXI6OkNTUzo6Q1NTUnVsZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSdWxl
c1NldCksIHByb3BlcnR5X3J1bGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldEFycmF5KCJydWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxS
dWxlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZVNo
ZWV0Qm9keT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4g
KnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5Pio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9k
eT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4gcmVzdWx0ID0gQ1NTU3R5
bGVTaGVldEJvZHk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAg
ICAgKiAgICAgLnNldFJ1bGVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmll
bGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0
PihhZG9wdFJlZihuZXcgQ1NTU3R5bGVTaGVldEJvZHkoKSkpOwogICAgfQogICAgdHlwZWRlZiBT
dHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwog
ICAgfQp9OwoKLyogQ1NTIHJ1bGUgcmVwcmVzZW50YXRpb24uICovCmNsYXNzIENTU1J1bGUgOiBw
dWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVy
dHkgbmFtZSAnb3JpZ2luJyB3aGlsZSBnZW5lcmF0aW5nIENTU1J1bGUuCiAgICBzdHJ1Y3QgT3Jp
Z2luIHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBVc2VyID0gNDAsCiAgICAgICAg
ICAgIFVzZXJfYWdlbnQgPSA0MSwKICAgICAgICAgICAgSW5zcGVjdG9yID0gNDIsCiAgICAgICAg
ICAgIFJlZ3VsYXIgPSA0MywKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IE9yaWdpbgoKICAg
IGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTZWxlY3RvclRleHRTZXQg
PSAxIDw8IDAsCiAgICAgICAgU291cmNlTGluZVNldCA9IDEgPDwgMSwKICAgICAgICBPcmlnaW5T
ZXQgPSAxIDw8IDIsCiAgICAgICAgU3R5bGVTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRz
U2V0ID0gKFNlbGVjdG9yVGV4dFNldCB8IFNvdXJjZUxpbmVTZXQgfCBPcmlnaW5TZXQgfCBTdHls
ZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPENTU1J1bGU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUp
OwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNs
YXNzIENTU1J1bGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZWxlY3Rv
clRleHRTZXQ+JiBzZXRTZWxlY3RvclRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTZWxlY3RvclRleHRTZXQpLCBw
cm9wZXJ0eV9zZWxlY3RvclRleHRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJzZWxlY3RvclRleHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8U2VsZWN0b3JUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFNvdXJjZUxpbmVTZXQ+JiBzZXRTb3VyY2VMaW5lKGludCB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTb3VyY2VMaW5lU2V0KSwgcHJvcGVy
dHlfc291cmNlTGluZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1i
ZXIoInNvdXJjZUxpbmUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U291
cmNlTGluZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPcmlnaW5T
ZXQ+JiBzZXRPcmlnaW4oT3JpZ2luOjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIE9yaWdpblNldCksIHByb3BlcnR5X29yaWdpbl9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIsIGdldEVu
dW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T3Jp
Z2luU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE9yaWdpblNldD4m
IHNldE9yaWdpbihjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIE9yaWdpblNldCksIHByb3BlcnR5X29yaWdpbl9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPcmlnaW5TZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTZXQ+JiBzZXRTdHlsZSgvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6OkNTUzo6Q1NTU3R5bGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxl
U2V0KSwgcHJvcGVydHlfc3R5bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0T2JqZWN0KCJzdHlsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxT
dHlsZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NSdWxlPiYg
KCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxk
c1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxSZWZQdHI8Q1NTUnVsZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NSdWxlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuIFJlZlB0cjxDU1NSdWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAg
ICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1J1bGU+IHJlc3VsdCA9
IENTU1J1bGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFNlbGVjdG9yVGV4dCguLi4pCiAgICAg
KiAgICAgLnNldFNvdXJjZUxpbmUoLi4uKQogICAgICogICAgIC5zZXRPcmlnaW4oLi4uKQogICAg
ICogICAgIC5zZXRTdHlsZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxk
c1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4o
YWRvcHRSZWYobmV3IENTU1J1bGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJh
aXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRSdWxlSWQoLypQYXNzUmVmUHRyPFR5cGVCdWls
ZGVyOjpDU1M6OkNTU1J1bGVJZD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJydWxlSWQiLCB2YWx1ZSk7CiAgICB9Cgog
ICAgdm9pZCBzZXRTb3VyY2VVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0
aGlzLT5zZXRTdHJpbmcoInNvdXJjZVVSTCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNl
bGVjdG9yUmFuZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OlNvdXJjZVJhbmdlPiov
IFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRPYmplY3QoInNlbGVjdG9yUmFuZ2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRNZWRp
YSgvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6Q1NTOjpDU1NNZWRpYSA+ID4qLyBQ
YXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRB
cnJheSgibWVkaWEiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBUZXh0IHJhbmdlIHdpdGhpbiBhIHJl
c291cmNlLiAqLwpjbGFzcyBTb3VyY2VSYW5nZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qgewpw
dWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU3RhcnRT
ZXQgPSAxIDw8IDAsCiAgICAgICAgRW5kU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1Nl
dCA9IChTdGFydFNldCB8IEVuZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgog
ICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFU
RSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWlu
dGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNvdXJjZVJhbmdlPiBwdHIpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVh
dGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAg
ICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBTb3VyY2VSYW5nZTsKICAgIHB1YmxpYzoKCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFN0YXJ0U2V0PiYgc2V0U3RhcnQoaW50IHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0YXJ0U2V0KSwgcHJvcGVy
dHlfc3RhcnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJz
dGFydCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGFydFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBFbmRTZXQ+JiBzZXRFbmQoaW50IHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEVuZFNl
dCksIHByb3BlcnR5X2VuZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoImVuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxFbmRTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8U291cmNlUmFuZ2U+JiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0
LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PFJlZlB0cjxTb3VyY2VSYW5nZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxTb3VyY2VSYW5nZT4gKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiBSZWZQdHI8U291cmNlUmFuZ2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAg
IC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U291cmNlUmFu
Z2U+IHJlc3VsdCA9IFNvdXJjZVJhbmdlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRTdGFydCgu
Li4pCiAgICAgKiAgICAgLnNldEVuZCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxO
b0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxk
c1NldD4oYWRvcHRSZWYobmV3IFNvdXJjZVJhbmdlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3Ry
dWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKY2xhc3MgQ1NTQ29tcHV0ZWRTdHlsZVByb3Bl
cnR5IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAg
IE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFZhbHVl
U2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChOYW1lU2V0IHwgVmFsdWVTZXQp
CiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAg
cHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAg
ICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNU
QVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0
cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eTsKICAgIHB1YmxpYzoKCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNl
dCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVmFsdWVTZXQ+JiBzZXRW
YWx1ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFZhbHVlU2V0KSwgcHJvcGVydHlfdmFsdWVfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ2YWx1ZSIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxWYWx1ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFJlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+JiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1ND
b21wdXRlZFN0eWxlUHJvcGVydHk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFBhc3NSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5PiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+KCp0aGlz
KTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6
CiAgICAgKiBSZWZQdHI8Q1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5PiByZXN1bHQgPSBDU1NDb21w
dXRlZFN0eWxlUHJvcGVydHk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldE5hbWUoLi4uKQogICAg
ICogICAgIC5zZXRWYWx1ZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxk
c1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4o
YWRvcHRSZWYobmV3IENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eSgpKSk7CiAgICB9CiAgICB0eXBl
ZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIENTUyBzdHlsZSByZXByZXNl
bnRhdGlvbi4gKi8KY2xhc3MgQ1NTU3R5bGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVi
bGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIENzc1Byb3Bl
cnRpZXNTZXQgPSAxIDw8IDAsCiAgICAgICAgU2hvcnRoYW5kRW50cmllc1NldCA9IDEgPDwgMSwK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoQ3NzUHJvcGVydGllc1NldCB8IFNob3J0aGFuZEVudHJp
ZXNTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIg
ewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
CiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0
YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWls
ZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFz
c1JlZlB0cjxDU1NTdHlsZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0
ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQg
Y2xhc3MgQ1NTU3R5bGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDc3NQ
cm9wZXJ0aWVzU2V0PiYgc2V0Q3NzUHJvcGVydGllcygvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBl
QnVpbGRlcjo6Q1NTOjpDU1NQcm9wZXJ0eSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5
PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBD
c3NQcm9wZXJ0aWVzU2V0KSwgcHJvcGVydHlfY3NzUHJvcGVydGllc19hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgiY3NzUHJvcGVydGllcyIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDc3NQcm9wZXJ0aWVzU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNob3J0aGFuZEVudHJpZXNTZXQ+JiBzZXRTaG9ydGhh
bmRFbnRyaWVzKC8qUGFzc1JlZlB0cjxBcnJheU9mPEluc3BlY3Rvck9iamVjdCA+ID4qLyBQYXNz
UmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBTaG9ydGhhbmRFbnRyaWVzU2V0KSwgcHJvcGVydHlfc2hvcnRo
YW5kRW50cmllc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgi
c2hvcnRoYW5kRW50cmllcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxT
aG9ydGhhbmRFbnRyaWVzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRy
PENTU1N0eWxlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTU3R5bGU+Kj4oJm1fcmVzdWx0KTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q1NTU3R5bGU+ICgpCiAgICAgICAgewog
ICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU1N0eWxlPigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENT
U1N0eWxlPiByZXN1bHQgPSBDU1NTdHlsZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0Q3NzUHJv
cGVydGllcyguLi4pCiAgICAgKiAgICAgLnNldFNob3J0aGFuZEVudHJpZXMoLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAg
cmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZSgpKSk7CiAg
ICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNl
dFN0eWxlSWQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OkNTU1N0eWxlSWQ+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9i
amVjdCgic3R5bGVJZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldENzc1RleHQoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImNzc1RleHQiLCB2
YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRSYW5nZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
OkNTUzo6U291cmNlUmFuZ2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQog
ICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicmFuZ2UiLCB2YWx1ZSk7CiAgICB9CgogICAg
dm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dFN0cmluZygid2lkdGgiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRIZWlnaHQoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImhlaWdodCIsIHZh
bHVlKTsKICAgIH0KfTsKCi8qIENTUyBzdHlsZSBlZmZlY3RpdmUgdmlzdWFsIGRpbWVuc2lvbnMg
YW5kIHNvdXJjZSBvZmZzZXRzLiAqLwpjbGFzcyBDU1NQcm9wZXJ0eSA6IHB1YmxpYyBJbnNwZWN0
b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdzdGF0
dXMnIHdoaWxlIGdlbmVyYXRpbmcgQ1NTUHJvcGVydHkuCiAgICBzdHJ1Y3QgU3RhdHVzIHsKICAg
ICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBBY3RpdmUgPSA0NCwKICAgICAgICAgICAgSW5h
Y3RpdmUgPSA0NSwKICAgICAgICAgICAgRGlzYWJsZWQgPSA0NiwKICAgICAgICAgICAgU3R5bGUg
PSA0NywKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IFN0YXR1cwoKICAgIGVudW0gewogICAg
ICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFZh
bHVlU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChOYW1lU2V0IHwgVmFsdWVT
ZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewog
ICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAg
ICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRl
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVy
PFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1Jl
ZlB0cjxDU1NQcm9wZXJ0eT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0
ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQg
Y2xhc3MgQ1NTUHJvcGVydHk7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBO
YW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFZhbHVlU2V0PiYgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWYWx1ZVNl
dCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmFs
dWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTUHJvcGVydHk+
JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmll
bGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PFJlZlB0cjxDU1NQcm9wZXJ0eT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NQcm9wZXJ0eT4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8Q1NTUHJvcGVydHk+KCp0aGlzKTsKICAgICAgICB9CiAgICB9
OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NT
UHJvcGVydHk+IHJlc3VsdCA9IENTU1Byb3BlcnR5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRO
YW1lKC4uLikKICAgICAqICAgICAuc2V0VmFsdWUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1
aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NQcm9wZXJ0eSgpKSk7CiAgICB9CiAgICB0eXBl
ZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFByaW9yaXR5KGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwcmlvcml0
eSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldEltcGxpY2l0KGJvb2wgdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigiaW1wbGljaXQiLCB2YWx1ZSk7CiAgICB9CgogICAg
dm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UGFyc2VkT2soYm9vbCB2
YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRCb29sZWFuKCJwYXJzZWRPayIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldFN0YXR1cyhTdGF0dXM6OkVudW0gdmFsdWUpCiAgICB7CiAgICAg
ICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkp
OwogICAgfQoKICAgIHZvaWQgc2V0U3RhdHVzKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBz
ZXRTaG9ydGhhbmROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJzaG9ydGhhbmROYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UmFu
Z2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OlNvdXJjZVJhbmdlPiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3Qo
InJhbmdlIiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NTIG1lZGlhIHF1ZXJ5IGRlc2NyaXB0b3Iu
ICovCmNsYXNzIENTU01lZGlhIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3NvdXJjZScgd2hpbGUgZ2VuZXJhdGluZyBD
U1NNZWRpYS4KICAgIHN0cnVjdCBTb3VyY2UgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAg
ICAgIE1lZGlhUnVsZSA9IDQ4LAogICAgICAgICAgICBJbXBvcnRSdWxlID0gNDksCiAgICAgICAg
ICAgIExpbmtlZFNoZWV0ID0gNTAsCiAgICAgICAgICAgIElubGluZVNoZWV0ID0gNTEsCiAgICAg
ICAgfTsKICAgIH07IC8vIHN0cnVjdCBTb3VyY2UKCiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxk
c1NldCA9IDAsCiAgICAgICAgVGV4dFNldCA9IDEgPDwgMCwKICAgICAgICBTb3VyY2VTZXQgPSAx
IDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFRleHRTZXQgfCBTb3VyY2VTZXQpCiAgICB9
OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0
ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVt
cGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAg
ICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwg
U1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NN
ZWRpYT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0g
Tm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAg
ICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTTWVk
aWE7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUZXh0U2V0PiYgc2V0VGV4
dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIFRleHRTZXQpLCBwcm9wZXJ0eV90ZXh0X2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidGV4dCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFNvdXJjZVNldD4mIHNldFNvdXJjZShTb3VyY2U6OkVudW0gdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlf
c291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291
cmNlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxTb3VyY2VTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
U291cmNlU2V0PiYgc2V0U291cmNlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291
cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNl
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNvdXJjZVNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NNZWRpYT4mICgpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9p
c19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRy
PENTU01lZGlhPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNz
UmVmUHRyPENTU01lZGlhPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxD
U1NNZWRpYT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NNZWRpYT4gcmVzdWx0ID0gQ1NTTWVkaWE6
OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFRleHQoLi4uKQogICAgICogICAgIC5zZXRTb3VyY2Uo
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NN
ZWRpYSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsK
CiAgICB2b2lkIHNldFNvdXJjZVVSTChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldFN0cmluZygic291cmNlVVJMIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0
U291cmNlTGluZShpbnQgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJzb3Vy
Y2VMaW5lIiwgdmFsdWUpOwogICAgfQp9OwoKLyogQ1NTIHNlbGVjdG9yIHByb2ZpbGUgZW50cnku
ICovCmNsYXNzIFNlbGVjdG9yUHJvZmlsZUVudHJ5IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTZWxl
Y3RvclNldCA9IDEgPDwgMCwKICAgICAgICBVcmxTZXQgPSAxIDw8IDEsCiAgICAgICAgTGluZU51
bWJlclNldCA9IDEgPDwgMiwKICAgICAgICBUaW1lU2V0ID0gMSA8PCAzLAogICAgICAgIEhpdENv
dW50U2V0ID0gMSA8PCA0LAogICAgICAgIE1hdGNoQ291bnRTZXQgPSAxIDw8IDUsCiAgICAgICAg
QWxsRmllbGRzU2V0ID0gKFNlbGVjdG9yU2V0IHwgVXJsU2V0IHwgTGluZU51bWJlclNldCB8IFRp
bWVTZXQgfCBIaXRDb3VudFNldCB8IE1hdGNoQ291bnRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRl
PGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+
IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTZWxlY3RvclByb2ZpbGVFbnRy
eT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9G
aWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAg
IG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VsZWN0b3JQ
cm9maWxlRW50cnk7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZWxlY3Rv
clNldD4mIHNldFNlbGVjdG9yKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2VsZWN0b3JTZXQpLCBwcm9wZXJ0eV9zZWxl
Y3Rvcl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNlbGVj
dG9yIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNlbGVjdG9yU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVybFNldD4mIHNldFVybChjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFVybFNldCksIHByb3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxVcmxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51
bWJlclNldD4mIHNldExpbmVOdW1iZXIoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoIShTVEFURSAmIExpbmVOdW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5lTnVt
YmVyX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibGluZU51
bWJlciIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVyU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFRpbWVTZXQ+JiBzZXRUaW1l
KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBUaW1lU2V0KSwgcHJvcGVydHlfdGltZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoInRpbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8VGltZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIaXRD
b3VudFNldD4mIHNldEhpdENvdW50KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIaXRDb3VudFNldCksIHByb3BlcnR5X2hpdENvdW50X2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiaGl0Q291bnQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SGl0Q291bnRTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWF0Y2hDb3VudFNldD4mIHNldE1hdGNoQ291
bnQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIE1hdGNoQ291bnRTZXQpLCBwcm9wZXJ0eV9tYXRjaENvdW50X2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibWF0Y2hDb3VudCIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNYXRjaENvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5PiYgKCkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8
U2VsZWN0b3JQcm9maWxlRW50cnk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFBhc3NSZWZQdHI8U2VsZWN0b3JQcm9maWxlRW50cnk+ICgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gUmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5PigqdGhpcyk7CiAgICAg
ICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICog
UmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5PiByZXN1bHQgPSBTZWxlY3RvclByb2ZpbGVFbnRy
eTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U2VsZWN0b3IoLi4uKQogICAgICogICAgIC5zZXRV
cmwoLi4uKQogICAgICogICAgIC5zZXRMaW5lTnVtYmVyKC4uLikKICAgICAqICAgICAuc2V0VGlt
ZSguLi4pCiAgICAgKiAgICAgLnNldEhpdENvdW50KC4uLikKICAgICAqICAgICAuc2V0TWF0Y2hD
b3VudCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRl
KCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3
IFNlbGVjdG9yUHJvZmlsZUVudHJ5KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRy
YWl0cyBJdGVtVHJhaXRzOwp9OwoKY2xhc3MgU2VsZWN0b3JQcm9maWxlIDogcHVibGljIEluc3Bl
Y3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwK
ICAgICAgICBUb3RhbFRpbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgRGF0YVNldCA9IDEgPDwgMSwK
ICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVG90YWxUaW1lU2V0IHwgRGF0YVNldCkKICAgIH07Cgog
ICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0
ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
Pio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNlbGVjdG9y
UHJvZmlsZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUg
PT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2Vs
ZWN0b3JQcm9maWxlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVG90YWxU
aW1lU2V0PiYgc2V0VG90YWxUaW1lKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUb3RhbFRpbWVTZXQpLCBwcm9wZXJ0eV90b3RhbFRp
bWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJ0b3RhbFRp
bWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VG90YWxUaW1lU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERhdGFTZXQ+JiBzZXREYXRhKC8q
UGFzc1JlZlB0cjxBcnJheU9mPFR5cGVCdWlsZGVyOjpDU1M6OlNlbGVjdG9yUHJvZmlsZUVudHJ5
ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIERhdGFTZXQpLCBwcm9wZXJ0eV9kYXRhX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJkYXRhIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERhdGFTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBSZWZQdHI8U2VsZWN0b3JQcm9maWxlPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U2Vs
ZWN0b3JQcm9maWxlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQ
YXNzUmVmUHRyPFNlbGVjdG9yUHJvZmlsZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biBSZWZQdHI8U2VsZWN0b3JQcm9maWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFNlbGVjdG9yUHJv
ZmlsZT4gcmVzdWx0ID0gU2VsZWN0b3JQcm9maWxlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRU
b3RhbFRpbWUoLi4uKQogICAgICogICAgIC5zZXREYXRhKC4uLik7CiAgICAgKi8KICAgIHN0YXRp
YyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWls
ZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgU2VsZWN0b3JQcm9maWxlKCkpKTsKICAgIH0K
ICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKfSAvLyBDU1MKCm5h
bWVzcGFjZSBUaW1lbGluZSB7Ci8qIFRpbWVsaW5lIHJlY29yZCBjb250YWlucyBpbmZvcm1hdGlv
biBhYm91dCB0aGUgcmVjb3JkZWQgYWN0aXZpdHkuICovCmNsYXNzIFRpbWVsaW5lRXZlbnQgOiBw
dWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVs
ZHNTZXQgPSAwLAogICAgICAgIFR5cGVTZXQgPSAxIDw8IDAsCiAgICAgICAgRGF0YVNldCA9IDEg
PDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVHlwZVNldCB8IERhdGFTZXQpCiAgICB9OwoK
ICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToK
ICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxh
dGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RF
UD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxUaW1lbGlu
ZUV2ZW50PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBUaW1l
bGluZUV2ZW50OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4m
IHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxk
ZXI8U1RBVEUgfCBEYXRhU2V0PiYgc2V0RGF0YShQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRGF0
YVNldCksIHByb3BlcnR5X2RhdGFfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0T2JqZWN0KCJkYXRhIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPERh
dGFTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8VGltZWxpbmVFdmVu
dD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxG
aWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPFRpbWVsaW5lRXZlbnQ+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8VGltZWxpbmVFdmVudD4gKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8VGltZWxpbmVFdmVudD4oKnRoaXMpOwogICAgICAg
IH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJl
ZlB0cjxUaW1lbGluZUV2ZW50PiByZXN1bHQgPSBUaW1lbGluZUV2ZW50OjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXRUeXBlKC4uLikKICAgICAqICAgICAuc2V0RGF0YSguLi4pOwogICAgICovCiAg
ICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1
cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFRpbWVsaW5lRXZlbnQoKSkpOwog
ICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBz
ZXRDaGlsZHJlbigvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6VGltZWxpbmU6OlRp
bWVsaW5lRXZlbnQgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoImNoaWxkcmVuIiwgdmFsdWUpOwogICAgfQp9OwoKfSAv
LyBUaW1lbGluZQoKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgRGVi
dWdnZXIgewovKiBMb2NhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuICovCmNsYXNzIExvY2F0aW9u
IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5v
RmllbGRzU2V0ID0gMCwKICAgICAgICBTY3JpcHRJZFNldCA9IDEgPDwgMCwKICAgICAgICBMaW5l
TnVtYmVyU2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChTY3JpcHRJZFNldCB8
IExpbmVOdW1iZXJTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNz
IEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBt
X3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
PiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXIoUGFzc1JlZlB0cjxMb2NhdGlvbj4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgTG9jYXRpb247CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBTY3JpcHRJZFNldD4mIHNldFNjcmlwdElkKC8qY29uc3QgVHlwZUJ1aWxkZXI6OkRlYnVn
Z2VyOjpTY3JpcHRJZCYqLyBjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNjcmlwdElkU2V0KSwgcHJvcGVydHlfc2NyaXB0
SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzY3JpcHRJ
ZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTY3JpcHRJZFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMaW5lTnVtYmVyU2V0PiYgc2V0TGlu
ZU51bWJlcihpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgTGluZU51bWJlclNldCksIHByb3BlcnR5X2xpbmVOdW1iZXJfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJsaW5lTnVtYmVyIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExpbmVOdW1iZXJTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBSZWZQdHI8TG9jYXRpb24+JiAoKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3Jl
YWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxMb2NhdGlv
bj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxM
b2NhdGlvbj4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8TG9jYXRpb24+
KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3Ry
dWN0b3I6CiAgICAgKiBSZWZQdHI8TG9jYXRpb24+IHJlc3VsdCA9IExvY2F0aW9uOjpjcmVhdGUo
KQogICAgICogICAgIC5zZXRTY3JpcHRJZCguLi4pCiAgICAgKiAgICAgLnNldExpbmVOdW1iZXIo
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBMb2Nh
dGlvbigpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsK
CiAgICB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0TnVtYmVyKCJjb2x1bW5OdW1iZXIiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBKYXZhU2NyaXB0
IGNhbGwgZnJhbWUuIEFycmF5IG9mIGNhbGwgZnJhbWVzIGZvcm0gdGhlIGNhbGwgc3RhY2suICov
CmNsYXNzIENhbGxGcmFtZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgQ2FsbEZyYW1lSWRTZXQgPSAx
IDw8IDAsCiAgICAgICAgRnVuY3Rpb25OYW1lU2V0ID0gMSA8PCAxLAogICAgICAgIExvY2F0aW9u
U2V0ID0gMSA8PCAyLAogICAgICAgIFNjb3BlQ2hhaW5TZXQgPSAxIDw8IDMsCiAgICAgICAgVGhp
c1NldCA9IDEgPDwgNCwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoQ2FsbEZyYW1lSWRTZXQgfCBG
dW5jdGlvbk5hbWVTZXQgfCBMb2NhdGlvblNldCB8IFNjb3BlQ2hhaW5TZXQgfCBUaGlzU2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
Q2FsbEZyYW1lPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBD
YWxsRnJhbWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDYWxsRnJhbWVJ
ZFNldD4mIHNldENhbGxGcmFtZUlkKC8qY29uc3QgVHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpDYWxs
RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIENhbGxGcmFtZUlkU2V0KSwgcHJvcGVydHlfY2FsbEZyYW1l
SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJjYWxsRnJh
bWVJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDYWxsRnJhbWVJZFNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGdW5jdGlvbk5hbWVTZXQ+
JiBzZXRGdW5jdGlvbk5hbWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGdW5jdGlvbk5hbWVTZXQpLCBwcm9wZXJ0eV9m
dW5jdGlvbk5hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJmdW5jdGlvbk5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnVu
Y3Rpb25OYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExvY2F0
aW9uU2V0PiYgc2V0TG9jYXRpb24oLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6
TG9jYXRpb24+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExvY2F0aW9uU2V0KSwgcHJvcGVy
dHlfbG9jYXRpb25fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0
KCJsb2NhdGlvbiIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMb2NhdGlv
blNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTY29wZUNoYWluU2V0
PiYgc2V0U2NvcGVDaGFpbigvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6RGVidWdn
ZXI6OlNjb3BlID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNjb3BlQ2hhaW5TZXQpLCBw
cm9wZXJ0eV9zY29wZUNoYWluX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dEFycmF5KCJzY29wZUNoYWluIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFNjb3BlQ2hhaW5TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVGhp
c1NldD4mIHNldFRoaXMoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVP
YmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRoaXNTZXQpLCBwcm9wZXJ0eV90aGlz
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgidGhpcyIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUaGlzU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENhbGxGcmFtZT4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENhbGxG
cmFtZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0
cjxDYWxsRnJhbWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENhbGxG
cmFtZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBj
b25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDYWxsRnJhbWU+IHJlc3VsdCA9IENhbGxGcmFtZTo6
Y3JlYXRlKCkKICAgICAqICAgICAuc2V0Q2FsbEZyYW1lSWQoLi4uKQogICAgICogICAgIC5zZXRG
dW5jdGlvbk5hbWUoLi4uKQogICAgICogICAgIC5zZXRMb2NhdGlvbiguLi4pCiAgICAgKiAgICAg
LnNldFNjb3BlQ2hhaW4oLi4uKQogICAgICogICAgIC5zZXRUaGlzKC4uLik7CiAgICAgKi8KICAg
IHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVy
biBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ2FsbEZyYW1lKCkpKTsKICAgIH0K
ICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogU2NvcGUgZGVz
Y3JpcHRpb24uICovCmNsYXNzIFNjb3BlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1Ymxp
YzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3R5cGUnIHdoaWxlIGdlbmVyYXRp
bmcgU2NvcGUuCiAgICBzdHJ1Y3QgVHlwZSB7CiAgICAgICAgZW51bSBFbnVtIHsKICAgICAgICAg
ICAgR2xvYmFsID0gNTIsCiAgICAgICAgICAgIExvY2FsID0gNTMsCiAgICAgICAgICAgIFdpdGgg
PSA1NCwKICAgICAgICAgICAgQ2xvc3VyZSA9IDU1LAogICAgICAgICAgICBDYXRjaCA9IDU2LAog
ICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgVHlwZQoKICAgIGVudW0gewogICAgICAgIE5vRmll
bGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAwLAogICAgICAgIE9iamVjdFNldCA9
IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVHlwZVNldCB8IE9iamVjdFNldCkKICAg
IH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2
YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0
ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAg
ICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUg
fCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFNj
b3BlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBO
b0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAg
ICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBTY29wZTsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKFR5
cGU6OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCks
IHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3Ry
aW5nKCJ0eXBlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgT2JqZWN0U2V0PiYgc2V0T2Jq
ZWN0KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBh
c3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPYmplY3RTZXQpLCBwcm9wZXJ0eV9vYmplY3RfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJvYmplY3QiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T2JqZWN0U2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPFNjb3BlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U2NvcGU+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U2NvcGU+ICgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNjb3BlPigqdGhpcyk7CiAgICAg
ICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICog
UmVmUHRyPFNjb3BlPiByZXN1bHQgPSBTY29wZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VHlw
ZSguLi4pCiAgICAgKiAgICAgLnNldE9iamVjdCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVp
bGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
b0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNjb3BlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3Ry
dWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKfSAvLyBEZWJ1Z2dlcgoKI2VuZGlmIC8vIEVO
QUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIp
Cm5hbWVzcGFjZSBET01EZWJ1Z2dlciB7Ci8qIERPTSBicmVha3BvaW50IHR5cGUuICovCnN0cnVj
dCBET01CcmVha3BvaW50VHlwZSB7CiAgICBlbnVtIEVudW0gewogICAgICAgIFN1YnRyZWVfbW9k
aWZpZWQgPSA1NywKICAgICAgICBBdHRyaWJ1dGVfbW9kaWZpZWQgPSA1OCwKICAgICAgICBOb2Rl
X3JlbW92ZWQgPSA1OSwKICAgIH07Cn07IC8vIHN0cnVjdCBET01CcmVha3BvaW50VHlwZQoKfSAv
LyBET01EZWJ1Z2dlcgoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQoKfSAv
LyBuYW1lc3BhY2UgVHlwZUJ1aWxkZXIKCmNsYXNzIEluc3BlY3RvckZyb250ZW5kIHsKcHVibGlj
OgogICAgSW5zcGVjdG9yRnJvbnRlbmQoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKik7CgoKICAg
IGNsYXNzIEluc3BlY3RvciB7CiAgICBwdWJsaWM6CiAgICAgICAgSW5zcGVjdG9yKEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9p
ZCBldmFsdWF0ZUZvclRlc3RJbkZyb250ZW5kKGludCB0ZXN0Q2FsbElkLCBjb25zdCBTdHJpbmcm
IHNjcmlwdCk7CiAgICAgICAgdm9pZCBpbnNwZWN0KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBvYmpl
Y3QsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBoaW50cyk7CiAgICAgICAgdm9pZCBkaWRD
cmVhdGVXb3JrZXIoaW50IGlkLCBjb25zdCBTdHJpbmcmIHVybCwgYm9vbCBpc1NoYXJlZCk7CiAg
ICAgICAgdm9pZCBkaWREZXN0cm95V29ya2VyKGludCBpZCk7CiAgICAgICAgdm9pZCBzZXRJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JG
cm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIEluc3BlY3RvciogaW5zcGVjdG9y
KCkgeyByZXR1cm4gJm1faW5zcGVjdG9yOyB9CgogICAgY2xhc3MgTWVtb3J5IHsKICAgIHB1Ymxp
YzoKICAgICAgICBNZW1vcnkoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAg
ICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAg
ICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsKICAgIH07CgogICAgTWVtb3J5KiBtZW1vcnkoKSB7IHJldHVybiAmbV9tZW1vcnk7IH0KCiAg
ICBjbGFzcyBQYWdlIHsKICAgIHB1YmxpYzoKICAgICAgICBQYWdlKEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBkb21Db250
ZW50RXZlbnRGaXJlZChkb3VibGUgdGltZXN0YW1wKTsKICAgICAgICB2b2lkIGxvYWRFdmVudEZp
cmVkKGRvdWJsZSB0aW1lc3RhbXApOwogICAgICAgIHZvaWQgZnJhbWVOYXZpZ2F0ZWQoLypQYXNz
UmVmUHRyPFR5cGVCdWlsZGVyOjpQYWdlOjpGcmFtZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gZnJhbWUpOwogICAgICAgIHZvaWQgZnJhbWVEZXRhY2hlZCgvKmNvbnN0IFR5cGVCdWls
ZGVyOjpOZXR3b3JrOjpGcmFtZUlkJiovIGNvbnN0IFN0cmluZyYgZnJhbWVJZCk7CiAgICAgICAg
dm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwg
PSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFBhZ2UqIHBh
Z2UoKSB7IHJldHVybiAmbV9wYWdlOyB9CgogICAgY2xhc3MgUnVudGltZSB7CiAgICBwdWJsaWM6
CiAgICAgICAgUnVudGltZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAg
ICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwo
KSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAg
ICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
OwogICAgfTsKCiAgICBSdW50aW1lKiBydW50aW1lKCkgeyByZXR1cm4gJm1fcnVudGltZTsgfQoK
ICAgIGNsYXNzIENvbnNvbGUgewogICAgcHVibGljOgogICAgICAgIENvbnNvbGUoSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lk
IG1lc3NhZ2VBZGRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNvbnNvbGU6OkNvbnNvbGVN
ZXNzYWdlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlKTsKICAgICAgICB2
b2lkIG1lc3NhZ2VSZXBlYXRDb3VudFVwZGF0ZWQoaW50IGNvdW50KTsKICAgICAgICB2b2lkIG1l
c3NhZ2VzQ2xlYXJlZCgpOwogICAgICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAg
ICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToK
ICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsOwogICAgfTsKCiAgICBDb25zb2xlKiBjb25zb2xlKCkgeyByZXR1cm4gJm1fY29uc29sZTsg
fQoKICAgIGNsYXNzIE5ldHdvcmsgewogICAgcHVibGljOgogICAgICAgIE5ldHdvcmsoSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2
b2lkIHJlcXVlc3RXaWxsQmVTZW50KC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVl
c3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0
d29yazo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQsIC8qY29uc3QgVHlwZUJ1aWxk
ZXI6Ok5ldHdvcms6OkxvYWRlcklkJiovIGNvbnN0IFN0cmluZyYgbG9hZGVySWQsIGNvbnN0IFN0
cmluZyYgZG9jdW1lbnRVUkwsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVx
dWVzdD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVxdWVzdCwgZG91YmxlIHRpbWVz
dGFtcCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpJbml0aWF0b3I+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGluaXRpYXRvciwgLypQYXNzUmVmUHRyPEFycmF5T2Y8
VHlwZUJ1aWxkZXI6OkNvbnNvbGU6OkNhbGxGcmFtZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiBzdGFja1RyYWNlLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJl
c3BvbnNlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZWRpcmVjdFJlc3BvbnNlKTsK
ICAgICAgICB2b2lkIHJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUoLypjb25zdCBUeXBlQnVpbGRlcjo6
TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkKTsKICAgICAgICB2
b2lkIHJlc3BvbnNlUmVjZWl2ZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVz
dElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCAvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3
b3JrOjpGcmFtZUlkJiovIGNvbnN0IFN0cmluZyYgZnJhbWVJZCwgLypjb25zdCBUeXBlQnVpbGRl
cjo6TmV0d29yazo6TG9hZGVySWQmKi8gY29uc3QgU3RyaW5nJiBsb2FkZXJJZCwgZG91YmxlIHRp
bWVzdGFtcCwgLypUeXBlQnVpbGRlcjo6UGFnZTo6UmVzb3VyY2VUeXBlOjpFbnVtKi8gY29uc3Qg
U3RyaW5nJiB0eXBlLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlc3BvbnNl
PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZSk7CiAgICAgICAgdm9pZCBk
YXRhUmVjZWl2ZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNv
bnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wLCBpbnQgZGF0YUxlbmd0aCwg
aW50IGVuY29kZWREYXRhTGVuZ3RoKTsKICAgICAgICB2b2lkIGxvYWRpbmdGaW5pc2hlZCgvKmNv
bnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1
ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXApOwogICAgICAgIHZvaWQgbG9hZGluZ0ZhaWxlZCgvKmNv
bnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1
ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXAsIGNvbnN0IFN0cmluZyYgZXJyb3JUZXh0LCBjb25zdCBi
b29sKiBjb25zdCBjYW5jZWxlZCk7CiAgICAgICAgdm9pZCByZXF1ZXN0U2VydmVkRnJvbU1lbW9y
eUNhY2hlKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBT
dHJpbmcmIHJlcXVlc3RJZCwgLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJZCYq
LyBjb25zdCBTdHJpbmcmIGZyYW1lSWQsIC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6Okxv
YWRlcklkJiovIGNvbnN0IFN0cmluZyYgbG9hZGVySWQsIGNvbnN0IFN0cmluZyYgZG9jdW1lbnRV
UkwsIGRvdWJsZSB0aW1lc3RhbXAsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6
SW5pdGlhdG9yPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBpbml0aWF0b3IsIC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6Q2FjaGVkUmVzb3VyY2U+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHJlc291cmNlKTsKICAgICAgICB2b2lkIHdlYlNvY2tldFdpbGxT
ZW5kSGFuZHNoYWtlUmVxdWVzdCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0
SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXAsIC8qUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6V2ViU29ja2V0UmVxdWVzdD4qLyBQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gcmVxdWVzdCk7CiAgICAgICAgdm9pZCB3ZWJTb2NrZXRIYW5kc2hh
a2VSZXNwb25zZVJlY2VpdmVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJ
ZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRpbWVzdGFtcCwgLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpXZWJTb2NrZXRSZXNwb25zZT4qLyBQYXNzUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2UpOwogICAgICAgIHZvaWQgd2ViU29ja2V0Q3JlYXRl
ZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5n
JiByZXF1ZXN0SWQsIGNvbnN0IFN0cmluZyYgdXJsKTsKICAgICAgICB2b2lkIHdlYlNvY2tldENs
b3NlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3Ry
aW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXApOwogICAgICAgIHZvaWQgc2V0SW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBOZXR3b3JrKiBuZXR3b3JrKCkgeyBy
ZXR1cm4gJm1fbmV0d29yazsgfQoKI2lmIEVOQUJMRShTUUxfREFUQUJBU0UpCiAgICBjbGFzcyBE
YXRhYmFzZSB7CiAgICBwdWJsaWM6CiAgICAgICAgRGF0YWJhc2UoSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGFkZERhdGFi
YXNlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RGF0YWJhc2U6OkRhdGFiYXNlPiovIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBkYXRhYmFzZSk7CiAgICAgICAgdm9pZCBzcWxUcmFuc2Fj
dGlvblN1Y2NlZWRlZChpbnQgdHJhbnNhY3Rpb25JZCwgLypQYXNzUmVmUHRyPEFycmF5T2Y8U3Ry
aW5nID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGNvbHVtbk5hbWVzLCAvKlBhc3NS
ZWZQdHI8QXJyYXlPZjxJbnNwZWN0b3JWYWx1ZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFy
cmF5PiB2YWx1ZXMpOwogICAgICAgIHZvaWQgc3FsVHJhbnNhY3Rpb25GYWlsZWQoaW50IHRyYW5z
YWN0aW9uSWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBzcWxFcnJvcik7CiAgICAgICAg
dm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwg
PSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIERhdGFiYXNl
KiBkYXRhYmFzZSgpIHsgcmV0dXJuICZtX2RhdGFiYXNlOyB9CgojZW5kaWYgLy8gRU5BQkxFKFNR
TF9EQVRBQkFTRSkKI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQogICAgY2xhc3MgSW5kZXhl
ZERCIHsKICAgIHB1YmxpYzoKICAgICAgICBJbmRleGVkREIoSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGRhdGFiYXNlTmFt
ZXNMb2FkZWQoZG91YmxlIHJlcXVlc3RJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpJbmRl
eGVkREI6OlNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXM+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXMpOwogICAgICAgIHZv
aWQgZGF0YWJhc2VMb2FkZWQoaW50IHJlcXVlc3RJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVy
OjpJbmRleGVkREI6OkRhdGFiYXNlV2l0aE9iamVjdFN0b3Jlcz4qLyBQYXNzUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gZGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzKTsKICAgICAgICB2b2lkIHNldElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBt
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgSW5kZXhlZERCKiBpbmRleGVk
ZGIoKSB7IHJldHVybiAmbV9pbmRleGVkZGI7IH0KCiNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9E
QVRBQkFTRSkKICAgIGNsYXNzIERPTVN0b3JhZ2UgewogICAgcHVibGljOgogICAgICAgIERPTVN0
b3JhZ2UoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
IDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7
IH0KICAgICAgICB2b2lkIGFkZERPTVN0b3JhZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpE
T01TdG9yYWdlOjpFbnRyeT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc3RvcmFnZSk7
CiAgICAgICAgdm9pZCB1cGRhdGVET01TdG9yYWdlKGludCBzdG9yYWdlSWQpOwogICAgICAgIHZv
aWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCog
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0g
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBET01TdG9yYWdl
KiBkb21zdG9yYWdlKCkgeyByZXR1cm4gJm1fZG9tc3RvcmFnZTsgfQoKICAgIGNsYXNzIEFwcGxp
Y2F0aW9uQ2FjaGUgewogICAgcHVibGljOgogICAgICAgIEFwcGxpY2F0aW9uQ2FjaGUoSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2
b2lkIGFwcGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5l
dHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCBjb25zdCBTdHJpbmcmIG1h
bmlmZXN0VVJMLCBpbnQgc3RhdHVzKTsKICAgICAgICB2b2lkIG5ldHdvcmtTdGF0ZVVwZGF0ZWQo
Ym9vbCBpc05vd09ubGluZSk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0K
ICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRl
OgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7CiAgICB9OwoKICAgIEFwcGxpY2F0aW9uQ2FjaGUqIGFwcGxpY2F0aW9uY2FjaGUoKSB7
IHJldHVybiAmbV9hcHBsaWNhdGlvbmNhY2hlOyB9CgojaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQog
ICAgY2xhc3MgRmlsZVN5c3RlbSB7CiAgICBwdWJsaWM6CiAgICAgICAgRmlsZVN5c3RlbShJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAg
IHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
ID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBGaWxlU3lz
dGVtKiBmaWxlc3lzdGVtKCkgeyByZXR1cm4gJm1fZmlsZXN5c3RlbTsgfQoKI2VuZGlmIC8vIEVO
QUJMRShGSUxFX1NZU1RFTSkKICAgIGNsYXNzIERPTSB7CiAgICBwdWJsaWM6CiAgICAgICAgRE9N
KEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAg
ICAgICAgdm9pZCBkb2N1bWVudFVwZGF0ZWQoKTsKICAgICAgICB2b2lkIHNldENoaWxkTm9kZXMo
aW50IHBhcmVudElkLCAvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6RE9NOjpOb2Rl
ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IG5vZGVzKTsKICAgICAgICB2b2lkIGF0
dHJpYnV0ZU1vZGlmaWVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSk7CiAgICAgICAgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKGludCBub2RlSWQsIGNv
bnN0IFN0cmluZyYgbmFtZSk7CiAgICAgICAgdm9pZCBpbmxpbmVTdHlsZUludmFsaWRhdGVkKC8q
UGFzc1JlZlB0cjxBcnJheU9mPGludCA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBu
b2RlSWRzKTsKICAgICAgICB2b2lkIGNoYXJhY3RlckRhdGFNb2RpZmllZChpbnQgbm9kZUlkLCBj
b25zdCBTdHJpbmcmIGNoYXJhY3RlckRhdGEpOwogICAgICAgIHZvaWQgY2hpbGROb2RlQ291bnRV
cGRhdGVkKGludCBub2RlSWQsIGludCBjaGlsZE5vZGVDb3VudCk7CiAgICAgICAgdm9pZCBjaGls
ZE5vZGVJbnNlcnRlZChpbnQgcGFyZW50Tm9kZUlkLCBpbnQgcHJldmlvdXNOb2RlSWQsIC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9NOjpOb2RlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBub2RlKTsKICAgICAgICB2b2lkIGNoaWxkTm9kZVJlbW92ZWQoaW50IHBhcmVudE5vZGVJ
ZCwgaW50IG5vZGVJZCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwo
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAg
ICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgog
ICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWw7CiAgICB9OwoKICAgIERPTSogZG9tKCkgeyByZXR1cm4gJm1fZG9tOyB9CgogICAgY2xhc3Mg
Q1NTIHsKICAgIHB1YmxpYzoKICAgICAgICBDU1MoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBp
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIG1lZGlhUXVlcnlSZXN1bHRD
aGFuZ2VkKCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsg
cmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAg
IEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAg
ICB9OwoKICAgIENTUyogY3NzKCkgeyByZXR1cm4gJm1fY3NzOyB9CgogICAgY2xhc3MgVGltZWxp
bmUgewogICAgcHVibGljOgogICAgICAgIFRpbWVsaW5lKEluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBldmVudFJlY29yZGVk
KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6VGltZWxpbmU6OlRpbWVsaW5lRXZlbnQ+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlY29yZCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
OyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFRpbWVsaW5lKiB0aW1lbGluZSgpIHsg
cmV0dXJuICZtX3RpbWVsaW5lOyB9CgojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAg
ICBjbGFzcyBEZWJ1Z2dlciB7CiAgICBwdWJsaWM6CiAgICAgICAgRGVidWdnZXIoSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lk
IGdsb2JhbE9iamVjdENsZWFyZWQoKTsKICAgICAgICB2b2lkIHNjcmlwdFBhcnNlZCgvKmNvbnN0
IFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6U2NyaXB0SWQmKi8gY29uc3QgU3RyaW5nJiBzY3JpcHRJ
ZCwgY29uc3QgU3RyaW5nJiB1cmwsIGludCBzdGFydExpbmUsIGludCBzdGFydENvbHVtbiwgaW50
IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIGNvbnN0IGJvb2wqIGNvbnN0IGlzQ29udGVudFNjcmlw
dCwgY29uc3QgU3RyaW5nJiBzb3VyY2VNYXBVUkwpOwogICAgICAgIHZvaWQgc2NyaXB0RmFpbGVk
VG9QYXJzZShjb25zdCBTdHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiBzY3JpcHRTb3VyY2UsIGlu
dCBzdGFydExpbmUsIGludCBlcnJvckxpbmUsIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKTsK
ICAgICAgICB2b2lkIGJyZWFrcG9pbnRSZXNvbHZlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpEZWJ1
Z2dlcjo6QnJlYWtwb2ludElkJiovIGNvbnN0IFN0cmluZyYgYnJlYWtwb2ludElkLCAvKlBhc3NS
ZWZQdHI8VHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbG9jYXRpb24pOwogICAgICAgIC8vIE5hbWVkIGFmdGVyIHBhcmFtZXRlciBu
YW1lICdyZWFzb24nIHdoaWxlIGdlbmVyYXRpbmcgZXZlbnQgcGF1c2VkLgogICAgICAgIHN0cnVj
dCBSZWFzb24gewogICAgICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICAgICAgWEhSID0g
NSwKICAgICAgICAgICAgICAgIERPTSA9IDYwLAogICAgICAgICAgICAgICAgRXZlbnRMaXN0ZW5l
ciA9IDYxLAogICAgICAgICAgICAgICAgRXhjZXB0aW9uID0gNjIsCiAgICAgICAgICAgICAgICBP
dGhlciA9IDI1LAogICAgICAgICAgICB9OwogICAgICAgIH07IC8vIHN0cnVjdCBSZWFzb24KCiAg
ICAgICAgdm9pZCBwYXVzZWQoLypQYXNzUmVmUHRyPEFycmF5T2Y8VHlwZUJ1aWxkZXI6OkRlYnVn
Z2VyOjpDYWxsRnJhbWUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gY2FsbEZyYW1l
cywgLypSZWFzb246OkVudW0qLyBjb25zdCBTdHJpbmcmIHJlYXNvbiwgUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IGRhdGEpOwogICAgICAgIHZvaWQgcmVzdW1lZCgpOwogICAgICAgIHZvaWQg
c2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBEZWJ1Z2dlciogZGVi
dWdnZXIoKSB7IHJldHVybiAmbV9kZWJ1Z2dlcjsgfQoKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NS
SVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBjbGFzcyBE
T01EZWJ1Z2dlciB7CiAgICBwdWJsaWM6CiAgICAgICAgRE9NRGVidWdnZXIoSW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIHNl
dEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCog
Z2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgRE9NRGVidWdnZXIqIGRv
bWRlYnVnZ2VyKCkgeyByZXR1cm4gJm1fZG9tZGVidWdnZXI7IH0KCiNlbmRpZiAvLyBFTkFCTEUo
SkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQogICAg
Y2xhc3MgUHJvZmlsZXIgewogICAgcHVibGljOgogICAgICAgIFByb2ZpbGVyKEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBh
ZGRQcm9maWxlSGVhZGVyKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBoZWFkZXIpOwogICAg
ICAgIHZvaWQgYWRkSGVhcFNuYXBzaG90Q2h1bmsoaW50IHVpZCwgY29uc3QgU3RyaW5nJiBjaHVu
ayk7CiAgICAgICAgdm9pZCBmaW5pc2hIZWFwU25hcHNob3QoaW50IHVpZCk7CiAgICAgICAgdm9p
ZCBzZXRSZWNvcmRpbmdQcm9maWxlKGJvb2wgaXNQcm9maWxpbmcpOwogICAgICAgIHZvaWQgcmVz
ZXRQcm9maWxlcygpOwogICAgICAgIHZvaWQgcmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3MoaW50
IGRvbmUsIGludCB0b3RhbCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0K
ICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRl
OgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7CiAgICB9OwoKICAgIFByb2ZpbGVyKiBwcm9maWxlcigpIHsgcmV0dXJuICZtX3Byb2Zp
bGVyOyB9CgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNpZiBFTkFCTEUo
V09SS0VSUykKICAgIGNsYXNzIFdvcmtlciB7CiAgICBwdWJsaWM6CiAgICAgICAgV29ya2VyKElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAg
ICAgdm9pZCB3b3JrZXJDcmVhdGVkKGludCB3b3JrZXJJZCwgY29uc3QgU3RyaW5nJiB1cmwsIGJv
b2wgaW5zcGVjdG9yQ29ubmVjdGVkKTsKICAgICAgICB2b2lkIHdvcmtlclRlcm1pbmF0ZWQoaW50
IHdvcmtlcklkKTsKICAgICAgICB2b2lkIGRpc3BhdGNoTWVzc2FnZUZyb21Xb3JrZXIoaW50IHdv
cmtlcklkLCBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbWVzc2FnZSk7CiAgICAgICAgdm9p
ZCBkaXNjb25uZWN0ZWRGcm9tV29ya2VyKCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAg
ICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIFdvcmtlciogd29ya2VyKCkgeyByZXR1cm4gJm1f
d29ya2VyOyB9CgojZW5kaWYgLy8gRU5BQkxFKFdPUktFUlMpCgpwcml2YXRlOgogICAgSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIEluc3Bl
Y3RvciBtX2luc3BlY3RvcjsKICAgIE1lbW9yeSBtX21lbW9yeTsKICAgIFBhZ2UgbV9wYWdlOwog
ICAgUnVudGltZSBtX3J1bnRpbWU7CiAgICBDb25zb2xlIG1fY29uc29sZTsKICAgIE5ldHdvcmsg
bV9uZXR3b3JrOwojaWYgRU5BQkxFKFNRTF9EQVRBQkFTRSkKICAgIERhdGFiYXNlIG1fZGF0YWJh
c2U7CiNlbmRpZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQojaWYgRU5BQkxFKElOREVYRURfREFU
QUJBU0UpCiAgICBJbmRleGVkREIgbV9pbmRleGVkZGI7CiNlbmRpZiAvLyBFTkFCTEUoSU5ERVhF
RF9EQVRBQkFTRSkKICAgIERPTVN0b3JhZ2UgbV9kb21zdG9yYWdlOwogICAgQXBwbGljYXRpb25D
YWNoZSBtX2FwcGxpY2F0aW9uY2FjaGU7CiNpZiBFTkFCTEUoRklMRV9TWVNURU0pCiAgICBGaWxl
U3lzdGVtIG1fZmlsZXN5c3RlbTsKI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgIERP
TSBtX2RvbTsKICAgIENTUyBtX2NzczsKICAgIFRpbWVsaW5lIG1fdGltZWxpbmU7CiNpZiBFTkFC
TEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgIERlYnVnZ2VyIG1fZGVidWdnZXI7CiNlbmRpZiAv
LyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVH
R0VSKQogICAgRE9NRGVidWdnZXIgbV9kb21kZWJ1Z2dlcjsKI2VuZGlmIC8vIEVOQUJMRShKQVZB
U0NSSVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBQcm9m
aWxlciBtX3Byb2ZpbGVyOwojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNp
ZiBFTkFCTEUoV09SS0VSUykKICAgIFdvcmtlciBtX3dvcmtlcjsKI2VuZGlmIC8vIEVOQUJMRShX
T1JLRVJTKQp9OwoKI2VuZGlmIC8vIEVOQUJMRShJTlNQRUNUT1IpCgp9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCiNlbmRpZiAvLyAhZGVmaW5lZChJbnNwZWN0b3JGcm9udGVuZF9oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>124456</attachid>
            <date>2012-01-28 15:06:34 -0800</date>
            <delta_ts>2012-01-30 15:44:06 -0800</delta_ts>
            <desc>New InspectorFrontend.cpp</desc>
            <filename>InspectorFrontend.cpp</filename>
            <type>text/plain</type>
            <size>43311</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgoKCiNpbmNsdWRlICJjb25maWcuaCIKI2lmIEVOQUJMRShJTlNQRUNU
T1IpCgojaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKI2luY2x1ZGUgPHd0Zi90ZXh0L1dU
RlN0cmluZy5oPgojaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgoKI2luY2x1ZGUgIkluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbC5oIgojaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCiNpbmNs
dWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KCm5hbWVzcGFjZSBXZWJDb3JlIHsKCkluc3BlY3Rv
ckZyb250ZW5kOjpJbnNwZWN0b3JGcm9udGVuZChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwo
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgLCBtX2luc3BlY3RvcihpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAsIG1fbWVtb3J5KGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAg
ICwgbV9wYWdlKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICwgbV9ydW50aW1lKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICwgbV9jb25zb2xlKGluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkKICAgICwgbV9uZXR3b3JrKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKI2lmIEVOQUJM
RShTUUxfREFUQUJBU0UpCiAgICAsIG1fZGF0YWJhc2UoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KQojZW5kaWYgLy8gRU5BQkxFKFNRTF9EQVRBQkFTRSkKI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFC
QVNFKQogICAgLCBtX2luZGV4ZWRkYihpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiNlbmRpZiAv
LyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKICAgICwgbV9kb21zdG9yYWdlKGluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCkKICAgICwgbV9hcHBsaWNhdGlvbmNhY2hlKGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgICwgbV9maWxlc3lzdGVtKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkKI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgICwg
bV9kb20oaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgLCBtX2NzcyhpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAsIG1fdGltZWxpbmUoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQoj
aWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICAsIG1fZGVidWdnZXIoaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKQojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNp
ZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgICwgbV9kb21kZWJ1Z2dlcihpbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikK
I2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQogICAgLCBtX3Byb2ZpbGVyKGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQoj
aWYgRU5BQkxFKFdPUktFUlMpCiAgICAsIG1fd29ya2VyKGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkKI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJTKQp7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6
Okluc3BlY3Rvcjo6ZXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZChpbnQgdGVzdENhbGxJZCwgY29u
c3QgU3RyaW5nJiBzY3JpcHQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGV2YWx1YXRl
Rm9yVGVzdEluRnJvbnRlbmRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IGV2YWx1YXRlRm9yVGVzdEluRnJvbnRlbmRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJJ
bnNwZWN0b3IuZXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZCIpOwogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBh
cmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0ZXN0Q2FsbElkIiwgdGVzdENhbGxJZCk7CiAgICBwYXJh
bXNPYmplY3QtPnNldFN0cmluZygic2NyaXB0Iiwgc2NyaXB0KTsKICAgIGV2YWx1YXRlRm9yVGVz
dEluRnJvbnRlbmRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChldmFsdWF0ZUZvclRlc3RJbkZyb250
ZW5kTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpJ
bnNwZWN0b3I6Omluc3BlY3QoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1v
dGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdCwgUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGhpbnRzKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBp
bnNwZWN0TWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBpbnNwZWN0TWVz
c2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiSW5zcGVjdG9yLmluc3BlY3QiKTsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgib2JqZWN0Iiwgb2JqZWN0KTsKICAgIHBh
cmFtc09iamVjdC0+c2V0T2JqZWN0KCJoaW50cyIsIGhpbnRzKTsKICAgIGluc3BlY3RNZXNzYWdl
LT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRN
ZXNzYWdlVG9Gcm9udGVuZChpbnNwZWN0TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lk
IEluc3BlY3RvckZyb250ZW5kOjpJbnNwZWN0b3I6OmRpZENyZWF0ZVdvcmtlcihpbnQgaWQsIGNv
bnN0IFN0cmluZyYgdXJsLCBib29sIGlzU2hhcmVkKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBkaWRDcmVhdGVXb3JrZXJNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIGRpZENyZWF0ZVdvcmtlck1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkluc3BlY3Rv
ci5kaWRDcmVhdGVXb3JrZXIiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09i
amVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51
bWJlcigiaWQiLCBpZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygidXJsIiwgdXJsKTsK
ICAgIHBhcmFtc09iamVjdC0+c2V0Qm9vbGVhbigiaXNTaGFyZWQiLCBpc1NoYXJlZCk7CiAgICBk
aWRDcmVhdGVXb3JrZXJNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7
CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChkaWRDcmVhdGVXb3JrZXJNZXNz
YWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Okluc3BlY3Rv
cjo6ZGlkRGVzdHJveVdvcmtlcihpbnQgaWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJJbnNwZWN0b3Iu
ZGlkRGVzdHJveVdvcmtlciIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2Jq
ZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVt
YmVyKCJpZCIsIGlkKTsKICAgIGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlLT5zZXRPYmplY3QoInBh
cmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
CiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVu
ZChkaWREZXN0cm95V29ya2VyTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3Bl
Y3RvckZyb250ZW5kOjpQYWdlOjpkb21Db250ZW50RXZlbnRGaXJlZChkb3VibGUgdGltZXN0YW1w
KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBkb21Db250ZW50RXZlbnRGaXJlZE1lc3Nh
Z2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgZG9tQ29udGVudEV2ZW50RmlyZWRN
ZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJQYWdlLmRvbUNvbnRlbnRFdmVudEZpcmVkIik7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIsIHRp
bWVzdGFtcCk7CiAgICBkb21Db250ZW50RXZlbnRGaXJlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFy
YW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkK
ICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5k
KGRvbUNvbnRlbnRFdmVudEZpcmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIElu
c3BlY3RvckZyb250ZW5kOjpQYWdlOjpsb2FkRXZlbnRGaXJlZChkb3VibGUgdGltZXN0YW1wKQp7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBsb2FkRXZlbnRGaXJlZE1lc3NhZ2UgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgbG9hZEV2ZW50RmlyZWRNZXNzYWdlLT5zZXRTdHJp
bmcoIm1ldGhvZCIsICJQYWdlLmxvYWRFdmVudEZpcmVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAgICBsb2FkRXZl
bnRGaXJlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlm
IChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGxvYWRFdmVudEZpcmVkTWVzc2FnZS0+dG9K
U09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpQYWdlOjpmcmFtZU5hdmln
YXRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlBhZ2U6OkZyYW1lPiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBmcmFtZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZnJh
bWVOYXZpZ2F0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGZyYW1l
TmF2aWdhdGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiUGFnZS5mcmFtZU5hdmlnYXRl
ZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9y
T2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJmcmFtZSIsIGZy
YW1lKTsKICAgIGZyYW1lTmF2aWdhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJh
bXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZnJhbWVOYXZp
Z2F0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6
OlBhZ2U6OmZyYW1lRGV0YWNoZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJ
ZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGZyYW1lRGV0YWNoZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGZy
YW1lRGV0YWNoZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJQYWdlLmZyYW1lRGV0YWNo
ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygiZnJhbWVJZCIs
IGZyYW1lSWQpOwogICAgZnJhbWVEZXRhY2hlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwg
cGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAg
ICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGZyYW1l
RGV0YWNoZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRl
bmQ6OkNvbnNvbGU6Om1lc3NhZ2VBZGRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNvbnNv
bGU6OkNvbnNvbGVNZXNzYWdlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdl
KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlQWRkZWRNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIG1lc3NhZ2VBZGRlZE1lc3NhZ2UtPnNldFN0cmlu
ZygibWV0aG9kIiwgIkNvbnNvbGUubWVzc2FnZUFkZGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXRPYmplY3QoIm1lc3NhZ2UiLCBtZXNzYWdlKTsKICAgIG1lc3NhZ2VBZGRl
ZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKG1lc3NhZ2VBZGRlZE1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6Q29uc29sZTo6bWVzc2FnZVJlcGVhdENv
dW50VXBkYXRlZChpbnQgY291bnQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3Nh
Z2VSZXBlYXRDb3VudFVwZGF0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIG1lc3NhZ2VSZXBlYXRDb3VudFVwZGF0ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIs
ICJDb25zb2xlLm1lc3NhZ2VSZXBlYXRDb3VudFVwZGF0ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBw
YXJhbXNPYmplY3QtPnNldE51bWJlcigiY291bnQiLCBjb3VudCk7CiAgICBtZXNzYWdlUmVwZWF0
Q291bnRVcGRhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwog
ICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobWVzc2FnZVJlcGVhdENvdW50VXBk
YXRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6
Q29uc29sZTo6bWVzc2FnZXNDbGVhcmVkKCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bWVzc2FnZXNDbGVhcmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBt
ZXNzYWdlc0NsZWFyZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJDb25zb2xlLm1lc3Nh
Z2VzQ2xlYXJlZCIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAg
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobWVzc2Fn
ZXNDbGVhcmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250
ZW5kOjpOZXR3b3JrOjpyZXF1ZXN0V2lsbEJlU2VudCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3
b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIC8qY29uc3QgVHlwZUJ1
aWxkZXI6Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCAvKmNvbnN0
IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpMb2FkZXJJZCYqLyBjb25zdCBTdHJpbmcmIGxvYWRlcklk
LCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5l
dHdvcms6OlJlcXVlc3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcXVlc3QsIGRv
dWJsZSB0aW1lc3RhbXAsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6SW5pdGlh
dG9yPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBpbml0aWF0b3IsIC8qUGFzc1JlZlB0
cjxBcnJheU9mPFR5cGVCdWlsZGVyOjpDb25zb2xlOjpDYWxsRnJhbWUgPiA+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JBcnJheT4gc3RhY2tUcmFjZSwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpO
ZXR3b3JrOjpSZXNwb25zZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVkaXJlY3RS
ZXNwb25zZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVxdWVzdFdpbGxCZVNlbnRN
ZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHJlcXVlc3RXaWxsQmVTZW50
TWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudCIp
OwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJyZXF1ZXN0SWQiLCBy
ZXF1ZXN0SWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoImZyYW1lSWQiLCBmcmFtZUlk
KTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJsb2FkZXJJZCIsIGxvYWRlcklkKTsKICAg
IHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJkb2N1bWVudFVSTCIsIGRvY3VtZW50VVJMKTsKICAg
IHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJyZXF1ZXN0IiwgcmVxdWVzdCk7CiAgICBwYXJhbXNP
YmplY3QtPnNldE51bWJlcigidGltZXN0YW1wIiwgdGltZXN0YW1wKTsKICAgIHBhcmFtc09iamVj
dC0+c2V0T2JqZWN0KCJpbml0aWF0b3IiLCBpbml0aWF0b3IpOwogICAgaWYgKHN0YWNrVHJhY2Up
CiAgICAgICAgcGFyYW1zT2JqZWN0LT5zZXRBcnJheSgic3RhY2tUcmFjZSIsIHN0YWNrVHJhY2Up
OwogICAgaWYgKHJlZGlyZWN0UmVzcG9uc2UpCiAgICAgICAgcGFyYW1zT2JqZWN0LT5zZXRPYmpl
Y3QoInJlZGlyZWN0UmVzcG9uc2UiLCByZWRpcmVjdFJlc3BvbnNlKTsKICAgIHJlcXVlc3RXaWxs
QmVTZW50TWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYg
KG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVxdWVzdFdpbGxCZVNlbnRNZXNzYWdlLT50
b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Ok5ldHdvcms6OnJlcXVl
c3RTZXJ2ZWRGcm9tQ2FjaGUoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElk
JiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiByZXF1ZXN0U2VydmVkRnJvbUNhY2hlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICByZXF1ZXN0U2VydmVkRnJvbUNhY2hlTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2Qi
LCAiTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICByZXF1ZXN0
U2VydmVkRnJvbUNhY2hlTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3Qp
OwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVxdWVzdFNlcnZlZEZyb21D
YWNoZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6
TmV0d29yazo6cmVzcG9uc2VSZWNlaXZlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpS
ZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIC8qY29uc3QgVHlwZUJ1aWxkZXI6
Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCAvKmNvbnN0IFR5cGVC
dWlsZGVyOjpOZXR3b3JrOjpMb2FkZXJJZCYqLyBjb25zdCBTdHJpbmcmIGxvYWRlcklkLCBkb3Vi
bGUgdGltZXN0YW1wLCAvKlR5cGVCdWlsZGVyOjpQYWdlOjpSZXNvdXJjZVR5cGU6OkVudW0qLyBj
b25zdCBTdHJpbmcmIHR5cGUsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVz
cG9uc2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlKQp7CiAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZVJlY2VpdmVkTWVzc2FnZSA9IEluc3BlY3Rvck9i
amVjdDo6Y3JlYXRlKCk7CiAgICByZXNwb25zZVJlY2VpdmVkTWVzc2FnZS0+c2V0U3RyaW5nKCJt
ZXRob2QiLCAiTmV0d29yay5yZXNwb25zZVJlY2VpdmVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNP
YmplY3QtPnNldFN0cmluZygiZnJhbWVJZCIsIGZyYW1lSWQpOwogICAgcGFyYW1zT2JqZWN0LT5z
ZXRTdHJpbmcoImxvYWRlcklkIiwgbG9hZGVySWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1i
ZXIoInRpbWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygi
dHlwZSIsIHR5cGUpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoInJlc3BvbnNlIiwgcmVz
cG9uc2UpOwogICAgcmVzcG9uc2VSZWNlaXZlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwg
cGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAg
ICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHJlc3Bv
bnNlUmVjZWl2ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJv
bnRlbmQ6Ok5ldHdvcms6OmRhdGFSZWNlaXZlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3Jr
OjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXAs
IGludCBkYXRhTGVuZ3RoLCBpbnQgZW5jb2RlZERhdGFMZW5ndGgpCnsKICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IGRhdGFSZWNlaXZlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgZGF0YVJlY2VpdmVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiTmV0d29y
ay5kYXRhUmVjZWl2ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVj
dCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmlu
ZygicmVxdWVzdElkIiwgcmVxdWVzdElkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0
aW1lc3RhbXAiLCB0aW1lc3RhbXApOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoImRhdGFM
ZW5ndGgiLCBkYXRhTGVuZ3RoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJlbmNvZGVk
RGF0YUxlbmd0aCIsIGVuY29kZWREYXRhTGVuZ3RoKTsKICAgIGRhdGFSZWNlaXZlZE1lc3NhZ2Ut
PnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1l
c3NhZ2VUb0Zyb250ZW5kKGRhdGFSZWNlaXZlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoK
dm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0d29yazo6bG9hZGluZ0ZpbmlzaGVkKC8qY29uc3Qg
VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJ
ZCwgZG91YmxlIHRpbWVzdGFtcCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbG9hZGlu
Z0ZpbmlzaGVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBsb2FkaW5n
RmluaXNoZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJOZXR3b3JrLmxvYWRpbmdGaW5p
c2hlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVj
dG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJyZXF1ZXN0
SWQiLCByZXF1ZXN0SWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIs
IHRpbWVzdGFtcCk7CiAgICBsb2FkaW5nRmluaXNoZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFt
cyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAg
ICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChs
b2FkaW5nRmluaXNoZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9y
RnJvbnRlbmQ6Ok5ldHdvcms6OmxvYWRpbmdGYWlsZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0
d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0
YW1wLCBjb25zdCBTdHJpbmcmIGVycm9yVGV4dCwgY29uc3QgYm9vbCogY29uc3QgY2FuY2VsZWQp
CnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGxvYWRpbmdGYWlsZWRNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGxvYWRpbmdGYWlsZWRNZXNzYWdlLT5zZXRTdHJp
bmcoIm1ldGhvZCIsICJOZXR3b3JrLmxvYWRpbmdGYWlsZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBw
YXJhbXNPYmplY3QtPnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElkKTsKICAgIHBhcmFt
c09iamVjdC0+c2V0TnVtYmVyKCJ0aW1lc3RhbXAiLCB0aW1lc3RhbXApOwogICAgcGFyYW1zT2Jq
ZWN0LT5zZXRTdHJpbmcoImVycm9yVGV4dCIsIGVycm9yVGV4dCk7CiAgICBpZiAoY2FuY2VsZWQp
CiAgICAgICAgcGFyYW1zT2JqZWN0LT5zZXRCb29sZWFuKCJjYW5jZWxlZCIsICpjYW5jZWxlZCk7
CiAgICBsb2FkaW5nRmFpbGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmpl
Y3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobG9hZGluZ0ZhaWxlZE1l
c3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0d29y
azo6cmVxdWVzdFNlcnZlZEZyb21NZW1vcnlDYWNoZSgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3
b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIC8qY29uc3QgVHlwZUJ1
aWxkZXI6Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCAvKmNvbnN0
IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpMb2FkZXJJZCYqLyBjb25zdCBTdHJpbmcmIGxvYWRlcklk
LCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkluaXRpYXRvcj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gaW5pdGlhdG9yLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkNh
Y2hlZFJlc291cmNlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXNvdXJjZSkKewog
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVxdWVzdFNlcnZlZEZyb21NZW1vcnlDYWNoZU1l
c3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcmVxdWVzdFNlcnZlZEZyb21N
ZW1vcnlDYWNoZU1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIk5ldHdvcmsucmVxdWVzdFNl
cnZlZEZyb21NZW1vcnlDYWNoZSIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1z
T2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0
U3RyaW5nKCJyZXF1ZXN0SWQiLCByZXF1ZXN0SWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJp
bmcoImZyYW1lSWQiLCBmcmFtZUlkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJsb2Fk
ZXJJZCIsIGxvYWRlcklkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJkb2N1bWVudFVS
TCIsIGRvY3VtZW50VVJMKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0aW1lc3RhbXAi
LCB0aW1lc3RhbXApOwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoImluaXRpYXRvciIsIGlu
aXRpYXRvcik7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgicmVzb3VyY2UiLCByZXNvdXJj
ZSk7CiAgICByZXF1ZXN0U2VydmVkRnJvbU1lbW9yeUNhY2hlTWVzc2FnZS0+c2V0T2JqZWN0KCJw
YXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRl
bmQocmVxdWVzdFNlcnZlZEZyb21NZW1vcnlDYWNoZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsK
fQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0d29yazo6d2ViU29ja2V0V2lsbFNlbmRIYW5k
c2hha2VSZXF1ZXN0KC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBj
b25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRpbWVzdGFtcCwgLypQYXNzUmVmUHRyPFR5
cGVCdWlsZGVyOjpOZXR3b3JrOjpXZWJTb2NrZXRSZXF1ZXN0PiovIFBhc3NSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiByZXF1ZXN0KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB3ZWJTb2Nr
ZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3RNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHdlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdE1lc3NhZ2UtPnNldFN0
cmluZygibWV0aG9kIiwgIk5ldHdvcmsud2ViU29ja2V0V2lsbFNlbmRIYW5kc2hha2VSZXF1ZXN0
Iik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlcXVlc3RJZCIs
IHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigidGltZXN0YW1wIiwgdGlt
ZXN0YW1wKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJyZXF1ZXN0IiwgcmVxdWVzdCk7
CiAgICB3ZWJTb2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3RNZXNzYWdlLT5zZXRPYmplY3Qo
InBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9u
dGVuZCh3ZWJTb2NrZXRXaWxsU2VuZEhhbmRzaGFrZVJlcXVlc3RNZXNzYWdlLT50b0pTT05TdHJp
bmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Ok5ldHdvcms6OndlYlNvY2tldEhhbmRz
aGFrZVJlc3BvbnNlUmVjZWl2ZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVz
dElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NS
ZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OldlYlNvY2tldFJlc3BvbnNlPiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiByZXNwb25zZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gd2ViU29ja2V0SGFuZHNoYWtlUmVzcG9uc2VSZWNlaXZlZE1lc3NhZ2UgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgd2ViU29ja2V0SGFuZHNoYWtlUmVzcG9uc2VSZWNlaXZlZE1l
c3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIk5ldHdvcmsud2ViU29ja2V0SGFuZHNoYWtlUmVz
cG9uc2VSZWNlaXZlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0
ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5n
KCJyZXF1ZXN0SWQiLCByZXF1ZXN0SWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRp
bWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgicmVzcG9u
c2UiLCByZXNwb25zZSk7CiAgICB3ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkTWVz
c2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5z
ZW5kTWVzc2FnZVRvRnJvbnRlbmQod2ViU29ja2V0SGFuZHNoYWtlUmVzcG9uc2VSZWNlaXZlZE1l
c3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0d29y
azo6d2ViU29ja2V0Q3JlYXRlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0
SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGNvbnN0IFN0cmluZyYgdXJsKQp7CiAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB3ZWJTb2NrZXRDcmVhdGVkTWVzc2FnZSA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICB3ZWJTb2NrZXRDcmVhdGVkTWVzc2FnZS0+c2V0U3RyaW5n
KCJtZXRob2QiLCAiTmV0d29yay53ZWJTb2NrZXRDcmVhdGVkIik7CiAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
cGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJh
bXNPYmplY3QtPnNldFN0cmluZygidXJsIiwgdXJsKTsKICAgIHdlYlNvY2tldENyZWF0ZWRNZXNz
YWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNl
bmRNZXNzYWdlVG9Gcm9udGVuZCh3ZWJTb2NrZXRDcmVhdGVkTWVzc2FnZS0+dG9KU09OU3RyaW5n
KCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpOZXR3b3JrOjp3ZWJTb2NrZXRDbG9zZWQo
Lypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYg
cmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiB3ZWJTb2NrZXRDbG9zZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IHdlYlNvY2tldENsb3NlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIk5ldHdvcmsud2Vi
U29ja2V0Q2xvc2VkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3Qg
PSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmco
InJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigidGlt
ZXN0YW1wIiwgdGltZXN0YW1wKTsKICAgIHdlYlNvY2tldENsb3NlZE1lc3NhZ2UtPnNldE9iamVj
dCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zy
b250ZW5kKHdlYlNvY2tldENsb3NlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKI2lmIEVO
QUJMRShTUUxfREFUQUJBU0UpCgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpEYXRhYmFzZTo6YWRk
RGF0YWJhc2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEYXRhYmFzZTo6RGF0YWJhc2U+Ki8g
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRhdGFiYXNlKQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBhZGREYXRhYmFzZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgYWRkRGF0YWJhc2VNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJEYXRhYmFzZS5h
ZGREYXRhYmFzZSIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJk
YXRhYmFzZSIsIGRhdGFiYXNlKTsKICAgIGFkZERhdGFiYXNlTWVzc2FnZS0+c2V0T2JqZWN0KCJw
YXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRl
bmQoYWRkRGF0YWJhc2VNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9y
RnJvbnRlbmQ6OkRhdGFiYXNlOjpzcWxUcmFuc2FjdGlvblN1Y2NlZWRlZChpbnQgdHJhbnNhY3Rp
b25JZCwgLypQYXNzUmVmUHRyPEFycmF5T2Y8U3RyaW5nID4gPiovIFBhc3NSZWZQdHI8SW5zcGVj
dG9yQXJyYXk+IGNvbHVtbk5hbWVzLCAvKlBhc3NSZWZQdHI8QXJyYXlPZjxJbnNwZWN0b3JWYWx1
ZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZXMpCnsKICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHNxbFRyYW5zYWN0aW9uU3VjY2VlZGVkTWVzc2FnZSA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICBzcWxUcmFuc2FjdGlvblN1Y2NlZWRlZE1lc3NhZ2UtPnNl
dFN0cmluZygibWV0aG9kIiwgIkRhdGFiYXNlLnNxbFRyYW5zYWN0aW9uU3VjY2VlZGVkIik7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6
OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRyYW5zYWN0aW9uSWQiLCB0
cmFuc2FjdGlvbklkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0QXJyYXkoImNvbHVtbk5hbWVzIiwg
Y29sdW1uTmFtZXMpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRBcnJheSgidmFsdWVzIiwgdmFsdWVz
KTsKICAgIHNxbFRyYW5zYWN0aW9uU3VjY2VlZGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMi
LCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAg
ICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoc3Fs
VHJhbnNhY3Rpb25TdWNjZWVkZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5z
cGVjdG9yRnJvbnRlbmQ6OkRhdGFiYXNlOjpzcWxUcmFuc2FjdGlvbkZhaWxlZChpbnQgdHJhbnNh
Y3Rpb25JZCwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHNxbEVycm9yKQp7CiAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBzcWxUcmFuc2FjdGlvbkZhaWxlZE1lc3NhZ2UgPSBJbnNwZWN0
b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgc3FsVHJhbnNhY3Rpb25GYWlsZWRNZXNzYWdlLT5zZXRT
dHJpbmcoIm1ldGhvZCIsICJEYXRhYmFzZS5zcWxUcmFuc2FjdGlvbkZhaWxlZCIpOwogICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0cmFuc2FjdGlvbklkIiwgdHJhbnNh
Y3Rpb25JZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgic3FsRXJyb3IiLCBzcWxFcnJv
cik7CiAgICBzcWxUcmFuc2FjdGlvbkZhaWxlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwg
cGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAg
ICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHNxbFRy
YW5zYWN0aW9uRmFpbGVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9CgojZW5kaWYgLy8gRU5B
QkxFKFNRTF9EQVRBQkFTRSkKCiNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKCnZvaWQgSW5z
cGVjdG9yRnJvbnRlbmQ6OkluZGV4ZWREQjo6ZGF0YWJhc2VOYW1lc0xvYWRlZChkb3VibGUgcmVx
dWVzdElkLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkluZGV4ZWREQjo6U2VjdXJpdHlPcmln
aW5XaXRoRGF0YWJhc2VOYW1lcz4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc2VjdXJp
dHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcykKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
ZGF0YWJhc2VOYW1lc0xvYWRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgZGF0YWJhc2VOYW1lc0xvYWRlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkluZGV4
ZWREQi5kYXRhYmFzZU5hbWVzTG9hZGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBw
YXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0
LT5zZXROdW1iZXIoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNl
dE9iamVjdCgic2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcyIsIHNlY3VyaXR5T3JpZ2lu
V2l0aERhdGFiYXNlTmFtZXMpOwogICAgZGF0YWJhc2VOYW1lc0xvYWRlZE1lc3NhZ2UtPnNldE9i
amVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKGRhdGFiYXNlTmFtZXNMb2FkZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0K
CnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkluZGV4ZWREQjo6ZGF0YWJhc2VMb2FkZWQoaW50IHJl
cXVlc3RJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpJbmRleGVkREI6OkRhdGFiYXNlV2l0
aE9iamVjdFN0b3Jlcz4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YWJhc2VXaXRo
T2JqZWN0U3RvcmVzKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBkYXRhYmFzZUxvYWRl
ZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgZGF0YWJhc2VMb2FkZWRN
ZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJJbmRleGVkREIuZGF0YWJhc2VMb2FkZWQiKTsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVj
dDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigicmVxdWVzdElkIiwgcmVx
dWVzdElkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJkYXRhYmFzZVdpdGhPYmplY3RT
dG9yZXMiLCBkYXRhYmFzZVdpdGhPYmplY3RTdG9yZXMpOwogICAgZGF0YWJhc2VMb2FkZWRNZXNz
YWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNl
bmRNZXNzYWdlVG9Gcm9udGVuZChkYXRhYmFzZUxvYWRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygp
KTsKfQoKI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQoKdm9pZCBJbnNwZWN0b3JG
cm9udGVuZDo6RE9NU3RvcmFnZTo6YWRkRE9NU3RvcmFnZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxk
ZXI6OkRPTVN0b3JhZ2U6OkVudHJ5PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBzdG9y
YWdlKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhZGRET01TdG9yYWdlTWVzc2FnZSA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBhZGRET01TdG9yYWdlTWVzc2FnZS0+c2V0
U3RyaW5nKCJtZXRob2QiLCAiRE9NU3RvcmFnZS5hZGRET01TdG9yYWdlIik7CiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoInN0b3JhZ2UiLCBzdG9yYWdlKTsKICAgIGFk
ZERPTVN0b3JhZ2VNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChhZGRET01TdG9yYWdlTWVzc2FnZS0+
dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpET01TdG9yYWdlOjp1
cGRhdGVET01TdG9yYWdlKGludCBzdG9yYWdlSWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHVwZGF0ZURPTVN0b3JhZ2VNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIHVwZGF0ZURPTVN0b3JhZ2VNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJET01TdG9y
YWdlLnVwZGF0ZURPTVN0b3JhZ2UiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFt
c09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNl
dE51bWJlcigic3RvcmFnZUlkIiwgc3RvcmFnZUlkKTsKICAgIHVwZGF0ZURPTVN0b3JhZ2VNZXNz
YWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNl
bmRNZXNzYWdlVG9Gcm9udGVuZCh1cGRhdGVET01TdG9yYWdlTWVzc2FnZS0+dG9KU09OU3RyaW5n
KCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpBcHBsaWNhdGlvbkNhY2hlOjphcHBsaWNh
dGlvbkNhY2hlU3RhdHVzVXBkYXRlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFt
ZUlkJiovIGNvbnN0IFN0cmluZyYgZnJhbWVJZCwgY29uc3QgU3RyaW5nJiBtYW5pZmVzdFVSTCwg
aW50IHN0YXR1cykKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXBwbGljYXRpb25DYWNo
ZVN0YXR1c1VwZGF0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGFw
cGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAi
QXBwbGljYXRpb25DYWNoZS5hcHBsaWNhdGlvbkNhY2hlU3RhdHVzVXBkYXRlZCIpOwogICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgZnJhbWVJZCk7CiAg
ICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygibWFuaWZlc3RVUkwiLCBtYW5pZmVzdFVSTCk7CiAg
ICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigic3RhdHVzIiwgc3RhdHVzKTsKICAgIGFwcGxpY2F0
aW9uQ2FjaGVTdGF0dXNVcGRhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNP
YmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoYXBwbGljYXRpb25D
YWNoZVN0YXR1c1VwZGF0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVj
dG9yRnJvbnRlbmQ6OkFwcGxpY2F0aW9uQ2FjaGU6Om5ldHdvcmtTdGF0ZVVwZGF0ZWQoYm9vbCBp
c05vd09ubGluZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbmV0d29ya1N0YXRlVXBk
YXRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgbmV0d29ya1N0YXRl
VXBkYXRlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkFwcGxpY2F0aW9uQ2FjaGUubmV0
d29ya1N0YXRlVXBkYXRlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2Jq
ZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0Qm9v
bGVhbigiaXNOb3dPbmxpbmUiLCBpc05vd09ubGluZSk7CiAgICBuZXR3b3JrU3RhdGVVcGRhdGVk
TWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
LT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobmV0d29ya1N0YXRlVXBkYXRlZE1lc3NhZ2UtPnRvSlNP
TlN0cmluZygpKTsKfQoKI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKCiNlbmRpZiAvLyBFTkFCTEUo
RklMRV9TWVNURU0pCgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpET006OmRvY3VtZW50VXBkYXRl
ZCgpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRvY3VtZW50VXBkYXRlZE1lc3NhZ2Ug
PSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgZG9jdW1lbnRVcGRhdGVkTWVzc2FnZS0+
c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NLmRvY3VtZW50VXBkYXRlZCIpOwogICAgaWYgKG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
LT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZG9jdW1lbnRVcGRhdGVkTWVzc2FnZS0+dG9KU09OU3Ry
aW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpET006OnNldENoaWxkTm9kZXMoaW50
IHBhcmVudElkLCAvKlBhc3NSZWZQdHI8QXJyYXlPZjxUeXBlQnVpbGRlcjo6RE9NOjpOb2RlID4g
PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IG5vZGVzKQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBzZXRDaGlsZE5vZGVzTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBzZXRDaGlsZE5vZGVzTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NLnNl
dENoaWxkTm9kZXMiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigi
cGFyZW50SWQiLCBwYXJlbnRJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldEFycmF5KCJub2RlcyIs
IG5vZGVzKTsKICAgIHNldENoaWxkTm9kZXNNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBh
cmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChzZXRDaGls
ZE5vZGVzTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5k
OjpET006OmF0dHJpYnV0ZU1vZGlmaWVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSwg
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gYXR0cmli
dXRlTW9kaWZpZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGF0dHJp
YnV0ZU1vZGlmaWVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NLmF0dHJpYnV0ZU1v
ZGlmaWVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoIm5vZGVJ
ZCIsIG5vZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygibmFtZSIsIG5hbWUpOwog
ICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwogICAgYXR0cmlidXRl
TW9kaWZpZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBp
ZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChhdHRyaWJ1dGVNb2RpZmllZE1lc3NhZ2Ut
PnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6RE9NOjphdHRyaWJ1
dGVSZW1vdmVkKGludCBub2RlSWQsIGNvbnN0IFN0cmluZyYgbmFtZSkKewogICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gYXR0cmlidXRlUmVtb3ZlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6
OmNyZWF0ZSgpOwogICAgYXR0cmlidXRlUmVtb3ZlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9k
IiwgIkRPTS5hdHRyaWJ1dGVSZW1vdmVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBw
YXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0
LT5zZXROdW1iZXIoIm5vZGVJZCIsIG5vZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmlu
ZygibmFtZSIsIG5hbWUpOwogICAgYXR0cmlidXRlUmVtb3ZlZE1lc3NhZ2UtPnNldE9iamVjdCgi
cGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250
ZW5kKGF0dHJpYnV0ZVJlbW92ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5z
cGVjdG9yRnJvbnRlbmQ6OkRPTTo6aW5saW5lU3R5bGVJbnZhbGlkYXRlZCgvKlBhc3NSZWZQdHI8
QXJyYXlPZjxpbnQgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gbm9kZUlkcykKewog
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gaW5saW5lU3R5bGVJbnZhbGlkYXRlZE1lc3NhZ2Ug
PSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgaW5saW5lU3R5bGVJbnZhbGlkYXRlZE1l
c3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRPTS5pbmxpbmVTdHlsZUludmFsaWRhdGVkIik7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRBcnJheSgibm9kZUlkcyIsIG5vZGVJ
ZHMpOwogICAgaW5saW5lU3R5bGVJbnZhbGlkYXRlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1z
IiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAg
ICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGlu
bGluZVN0eWxlSW52YWxpZGF0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5z
cGVjdG9yRnJvbnRlbmQ6OkRPTTo6Y2hhcmFjdGVyRGF0YU1vZGlmaWVkKGludCBub2RlSWQsIGNv
bnN0IFN0cmluZyYgY2hhcmFjdGVyRGF0YSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
Y2hhcmFjdGVyRGF0YU1vZGlmaWVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7
CiAgICBjaGFyYWN0ZXJEYXRhTW9kaWZpZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJE
T00uY2hhcmFjdGVyRGF0YU1vZGlmaWVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBw
YXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0
LT5zZXROdW1iZXIoIm5vZGVJZCIsIG5vZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmlu
ZygiY2hhcmFjdGVyRGF0YSIsIGNoYXJhY3RlckRhdGEpOwogICAgY2hhcmFjdGVyRGF0YU1vZGlm
aWVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoY2hhcmFjdGVyRGF0YU1vZGlmaWVkTWVzc2FnZS0+
dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpET006OmNoaWxkTm9k
ZUNvdW50VXBkYXRlZChpbnQgbm9kZUlkLCBpbnQgY2hpbGROb2RlQ291bnQpCnsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGNoaWxkTm9kZUNvdW50VXBkYXRlZE1lc3NhZ2UgPSBJbnNwZWN0
b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgY2hpbGROb2RlQ291bnRVcGRhdGVkTWVzc2FnZS0+c2V0
U3RyaW5nKCJtZXRob2QiLCAiRE9NLmNoaWxkTm9kZUNvdW50VXBkYXRlZCIpOwogICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUo
KTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJub2RlSWQiLCBub2RlSWQpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXROdW1iZXIoImNoaWxkTm9kZUNvdW50IiwgY2hpbGROb2RlQ291bnQpOwog
ICAgY2hpbGROb2RlQ291bnRVcGRhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJh
bXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoY2hpbGROb2Rl
Q291bnRVcGRhdGVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZy
b250ZW5kOjpET006OmNoaWxkTm9kZUluc2VydGVkKGludCBwYXJlbnROb2RlSWQsIGludCBwcmV2
aW91c05vZGVJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006Ok5vZGU+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG5vZGUpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGNoaWxkTm9kZUluc2VydGVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAg
ICBjaGlsZE5vZGVJbnNlcnRlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRPTS5jaGls
ZE5vZGVJbnNlcnRlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0
ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVy
KCJwYXJlbnROb2RlSWQiLCBwYXJlbnROb2RlSWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1i
ZXIoInByZXZpb3VzTm9kZUlkIiwgcHJldmlvdXNOb2RlSWQpOwogICAgcGFyYW1zT2JqZWN0LT5z
ZXRPYmplY3QoIm5vZGUiLCBub2RlKTsKICAgIGNoaWxkTm9kZUluc2VydGVkTWVzc2FnZS0+c2V0
T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2Fn
ZVRvRnJvbnRlbmQoY2hpbGROb2RlSW5zZXJ0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0K
CnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRPTTo6Y2hpbGROb2RlUmVtb3ZlZChpbnQgcGFyZW50
Tm9kZUlkLCBpbnQgbm9kZUlkKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBjaGlsZE5v
ZGVSZW1vdmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBjaGlsZE5v
ZGVSZW1vdmVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NLmNoaWxkTm9kZVJlbW92
ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigicGFyZW50Tm9k
ZUlkIiwgcGFyZW50Tm9kZUlkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJub2RlSWQi
LCBub2RlSWQpOwogICAgY2hpbGROb2RlUmVtb3ZlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1z
IiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAg
ICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGNo
aWxkTm9kZVJlbW92ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9y
RnJvbnRlbmQ6OkNTUzo6bWVkaWFRdWVyeVJlc3VsdENoYW5nZWQoKQp7CiAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZE1lc3NhZ2UgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgbWVkaWFRdWVyeVJlc3VsdENoYW5nZWRNZXNzYWdlLT5zZXRT
dHJpbmcoIm1ldGhvZCIsICJDU1MubWVkaWFRdWVyeVJlc3VsdENoYW5nZWQiKTsKICAgIGlmICht
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKG1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkTWVzc2Fn
ZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpUaW1lbGluZTo6
ZXZlbnRSZWNvcmRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlRpbWVsaW5lOjpUaW1lbGlu
ZUV2ZW50PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZWNvcmQpCnsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGV2ZW50UmVjb3JkZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0
OjpjcmVhdGUoKTsKICAgIGV2ZW50UmVjb3JkZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIs
ICJUaW1lbGluZS5ldmVudFJlY29yZGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBw
YXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0
LT5zZXRPYmplY3QoInJlY29yZCIsIHJlY29yZCk7CiAgICBldmVudFJlY29yZGVkTWVzc2FnZS0+
c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVz
c2FnZVRvRnJvbnRlbmQoZXZlbnRSZWNvcmRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoK
I2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6
RGVidWdnZXI6Omdsb2JhbE9iamVjdENsZWFyZWQoKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBnbG9iYWxPYmplY3RDbGVhcmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBnbG9iYWxPYmplY3RDbGVhcmVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAi
RGVidWdnZXIuZ2xvYmFsT2JqZWN0Q2xlYXJlZCIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2Fn
ZVRvRnJvbnRlbmQoZ2xvYmFsT2JqZWN0Q2xlYXJlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsK
fQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6RGVidWdnZXI6OnNjcmlwdFBhcnNlZCgvKmNvbnN0
IFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6U2NyaXB0SWQmKi8gY29uc3QgU3RyaW5nJiBzY3JpcHRJ
ZCwgY29uc3QgU3RyaW5nJiB1cmwsIGludCBzdGFydExpbmUsIGludCBzdGFydENvbHVtbiwgaW50
IGVuZExpbmUsIGludCBlbmRDb2x1bW4sIGNvbnN0IGJvb2wqIGNvbnN0IGlzQ29udGVudFNjcmlw
dCwgY29uc3QgU3RyaW5nJiBzb3VyY2VNYXBVUkwpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHNjcmlwdFBhcnNlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
c2NyaXB0UGFyc2VkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRGVidWdnZXIuc2NyaXB0
UGFyc2VkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInNjcmlw
dElkIiwgc2NyaXB0SWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInVybCIsIHVybCk7
CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigic3RhcnRMaW5lIiwgc3RhcnRMaW5lKTsKICAg
IHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJzdGFydENvbHVtbiIsIHN0YXJ0Q29sdW1uKTsKICAg
IHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJlbmRMaW5lIiwgZW5kTGluZSk7CiAgICBwYXJhbXNP
YmplY3QtPnNldE51bWJlcigiZW5kQ29sdW1uIiwgZW5kQ29sdW1uKTsKICAgIGlmIChpc0NvbnRl
bnRTY3JpcHQpCiAgICAgICAgcGFyYW1zT2JqZWN0LT5zZXRCb29sZWFuKCJpc0NvbnRlbnRTY3Jp
cHQiLCAqaXNDb250ZW50U2NyaXB0KTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJzb3Vy
Y2VNYXBVUkwiLCBzb3VyY2VNYXBVUkwpOwogICAgc2NyaXB0UGFyc2VkTWVzc2FnZS0+c2V0T2Jq
ZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRv
RnJvbnRlbmQoc2NyaXB0UGFyc2VkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIElu
c3BlY3RvckZyb250ZW5kOjpEZWJ1Z2dlcjo6c2NyaXB0RmFpbGVkVG9QYXJzZShjb25zdCBTdHJp
bmcmIHVybCwgY29uc3QgU3RyaW5nJiBzY3JpcHRTb3VyY2UsIGludCBzdGFydExpbmUsIGludCBl
cnJvckxpbmUsIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBzY3JpcHRGYWlsZWRUb1BhcnNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICBzY3JpcHRGYWlsZWRUb1BhcnNlTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRo
b2QiLCAiRGVidWdnZXIuc2NyaXB0RmFpbGVkVG9QYXJzZSIpOwogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBh
cmFtc09iamVjdC0+c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRT
dHJpbmcoInNjcmlwdFNvdXJjZSIsIHNjcmlwdFNvdXJjZSk7CiAgICBwYXJhbXNPYmplY3QtPnNl
dE51bWJlcigic3RhcnRMaW5lIiwgc3RhcnRMaW5lKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVt
YmVyKCJlcnJvckxpbmUiLCBlcnJvckxpbmUpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmco
ImVycm9yTWVzc2FnZSIsIGVycm9yTWVzc2FnZSk7CiAgICBzY3JpcHRGYWlsZWRUb1BhcnNlTWVz
c2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5z
ZW5kTWVzc2FnZVRvRnJvbnRlbmQoc2NyaXB0RmFpbGVkVG9QYXJzZU1lc3NhZ2UtPnRvSlNPTlN0
cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6RGVidWdnZXI6OmJyZWFrcG9pbnRS
ZXNvbHZlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6QnJlYWtwb2ludElkJiovIGNv
bnN0IFN0cmluZyYgYnJlYWtwb2ludElkLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRlYnVn
Z2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbG9jYXRpb24pCnsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGJyZWFrcG9pbnRSZXNvbHZlZE1lc3NhZ2UgPSBJ
bnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgYnJlYWtwb2ludFJlc29sdmVkTWVzc2FnZS0+
c2V0U3RyaW5nKCJtZXRob2QiLCAiRGVidWdnZXIuYnJlYWtwb2ludFJlc29sdmVkIik7CiAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoImJyZWFrcG9pbnRJZCIsIGJyZWFr
cG9pbnRJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgibG9jYXRpb24iLCBsb2NhdGlv
bik7CiAgICBicmVha3BvaW50UmVzb2x2ZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBh
cmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChicmVha3Bv
aW50UmVzb2x2ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJv
bnRlbmQ6OkRlYnVnZ2VyOjpwYXVzZWQoLypQYXNzUmVmUHRyPEFycmF5T2Y8VHlwZUJ1aWxkZXI6
OkRlYnVnZ2VyOjpDYWxsRnJhbWUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gY2Fs
bEZyYW1lcywgLypSZWFzb246OkVudW0qLyBjb25zdCBTdHJpbmcmIHJlYXNvbiwgUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGRhdGEpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBh
dXNlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGF1c2VkTWVzc2Fn
ZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRGVidWdnZXIucGF1c2VkIik7CiAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgcGFyYW1zT2JqZWN0LT5zZXRBcnJheSgiY2FsbEZyYW1lcyIsIGNhbGxGcmFtZXMpOwogICAg
cGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlYXNvbiIsIHJlYXNvbik7CiAgICBpZiAoZGF0YSkK
ICAgICAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgiZGF0YSIsIGRhdGEpOwogICAgcGF1c2Vk
TWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
LT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocGF1c2VkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9
Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpEZWJ1Z2dlcjo6cmVzdW1lZCgpCnsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3VtZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHJlc3VtZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJEZWJ1Z2dlci5y
ZXN1bWVkIik7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXN1bWVkTWVz
c2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9CgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVC
VUdHRVIpCgojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCgojZW5kaWYgLy8gRU5BQkxF
KEpBVkFTQ1JJUFRfREVCVUdHRVIpCgojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCgp2
b2lkIEluc3BlY3RvckZyb250ZW5kOjpQcm9maWxlcjo6YWRkUHJvZmlsZUhlYWRlcihQYXNzUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gaGVhZGVyKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBhZGRQcm9maWxlSGVhZGVyTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAg
ICBhZGRQcm9maWxlSGVhZGVyTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiUHJvZmlsZXIu
YWRkUHJvZmlsZUhlYWRlciIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2Jq
ZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2Jq
ZWN0KCJoZWFkZXIiLCBoZWFkZXIpOwogICAgYWRkUHJvZmlsZUhlYWRlck1lc3NhZ2UtPnNldE9i
amVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKGFkZFByb2ZpbGVIZWFkZXJNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZv
aWQgSW5zcGVjdG9yRnJvbnRlbmQ6OlByb2ZpbGVyOjphZGRIZWFwU25hcHNob3RDaHVuayhpbnQg
dWlkLCBjb25zdCBTdHJpbmcmIGNodW5rKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBh
ZGRIZWFwU25hcHNob3RDaHVua01lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgYWRkSGVhcFNuYXBzaG90Q2h1bmtNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJQcm9m
aWxlci5hZGRIZWFwU25hcHNob3RDaHVuayIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVj
dC0+c2V0TnVtYmVyKCJ1aWQiLCB1aWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoImNo
dW5rIiwgY2h1bmspOwogICAgYWRkSGVhcFNuYXBzaG90Q2h1bmtNZXNzYWdlLT5zZXRPYmplY3Qo
InBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9u
dGVuZChhZGRIZWFwU25hcHNob3RDaHVua01lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9p
ZCBJbnNwZWN0b3JGcm9udGVuZDo6UHJvZmlsZXI6OmZpbmlzaEhlYXBTbmFwc2hvdChpbnQgdWlk
KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBmaW5pc2hIZWFwU25hcHNob3RNZXNzYWdl
ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGZpbmlzaEhlYXBTbmFwc2hvdE1lc3Nh
Z2UtPnNldFN0cmluZygibWV0aG9kIiwgIlByb2ZpbGVyLmZpbmlzaEhlYXBTbmFwc2hvdCIpOwog
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0
OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ1aWQiLCB1aWQpOwogICAg
ZmluaXNoSGVhcFNuYXBzaG90TWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmpl
Y3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZmluaXNoSGVhcFNuYXBz
aG90TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpQ
cm9maWxlcjo6c2V0UmVjb3JkaW5nUHJvZmlsZShib29sIGlzUHJvZmlsaW5nKQp7CiAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBzZXRSZWNvcmRpbmdQcm9maWxlTWVzc2FnZSA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICBzZXRSZWNvcmRpbmdQcm9maWxlTWVzc2FnZS0+c2V0U3Ry
aW5nKCJtZXRob2QiLCAiUHJvZmlsZXIuc2V0UmVjb3JkaW5nUHJvZmlsZSIpOwogICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUo
KTsKICAgIHBhcmFtc09iamVjdC0+c2V0Qm9vbGVhbigiaXNQcm9maWxpbmciLCBpc1Byb2ZpbGlu
Zyk7CiAgICBzZXRSZWNvcmRpbmdQcm9maWxlTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBw
YXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAg
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoc2V0UmVj
b3JkaW5nUHJvZmlsZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JG
cm9udGVuZDo6UHJvZmlsZXI6OnJlc2V0UHJvZmlsZXMoKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiByZXNldFByb2ZpbGVzTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7
CiAgICByZXNldFByb2ZpbGVzTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiUHJvZmlsZXIu
cmVzZXRQcm9maWxlcyIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAg
ICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVz
ZXRQcm9maWxlc01lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9u
dGVuZDo6UHJvZmlsZXI6OnJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzKGludCBkb25lLCBpbnQg
dG90YWwpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcG9ydEhlYXBTbmFwc2hvdFBy
b2dyZXNzTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICByZXBvcnRIZWFw
U25hcHNob3RQcm9ncmVzc01lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIlByb2ZpbGVyLnJl
cG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBw
YXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0
LT5zZXROdW1iZXIoImRvbmUiLCBkb25lKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0
b3RhbCIsIHRvdGFsKTsKICAgIHJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzTWVzc2FnZS0+c2V0
T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2Fn
ZVRvRnJvbnRlbmQocmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3NNZXNzYWdlLT50b0pTT05TdHJp
bmcoKSk7Cn0KCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKCiNpZiBFTkFC
TEUoV09SS0VSUykKCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Oldvcmtlcjo6d29ya2VyQ3JlYXRl
ZChpbnQgd29ya2VySWQsIGNvbnN0IFN0cmluZyYgdXJsLCBib29sIGluc3BlY3RvckNvbm5lY3Rl
ZCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gd29ya2VyQ3JlYXRlZE1lc3NhZ2UgPSBJ
bnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgd29ya2VyQ3JlYXRlZE1lc3NhZ2UtPnNldFN0
cmluZygibWV0aG9kIiwgIldvcmtlci53b3JrZXJDcmVhdGVkIik7CiAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
cGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoIndvcmtlcklkIiwgd29ya2VySWQpOwogICAgcGFyYW1z
T2JqZWN0LT5zZXRTdHJpbmcoInVybCIsIHVybCk7CiAgICBwYXJhbXNPYmplY3QtPnNldEJvb2xl
YW4oImluc3BlY3RvckNvbm5lY3RlZCIsIGluc3BlY3RvckNvbm5lY3RlZCk7CiAgICB3b3JrZXJD
cmVhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYg
KG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQod29ya2VyQ3JlYXRlZE1lc3NhZ2UtPnRvSlNP
TlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6V29ya2VyOjp3b3JrZXJUZXJt
aW5hdGVkKGludCB3b3JrZXJJZCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gd29ya2Vy
VGVybWluYXRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgd29ya2Vy
VGVybWluYXRlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIldvcmtlci53b3JrZXJUZXJt
aW5hdGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoIndvcmtl
cklkIiwgd29ya2VySWQpOwogICAgd29ya2VyVGVybWluYXRlZE1lc3NhZ2UtPnNldE9iamVjdCgi
cGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250
ZW5kKHdvcmtlclRlcm1pbmF0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5z
cGVjdG9yRnJvbnRlbmQ6Oldvcmtlcjo6ZGlzcGF0Y2hNZXNzYWdlRnJvbVdvcmtlcihpbnQgd29y
a2VySWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlKQp7CiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBkaXNwYXRjaE1lc3NhZ2VGcm9tV29ya2VyTWVzc2FnZSA9IEluc3Bl
Y3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBkaXNwYXRjaE1lc3NhZ2VGcm9tV29ya2VyTWVzc2Fn
ZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiV29ya2VyLmRpc3BhdGNoTWVzc2FnZUZyb21Xb3JrZXIi
KTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9i
amVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigid29ya2VySWQiLCB3
b3JrZXJJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgibWVzc2FnZSIsIG1lc3NhZ2Up
OwogICAgZGlzcGF0Y2hNZXNzYWdlRnJvbVdvcmtlck1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1z
IiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAg
ICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGRp
c3BhdGNoTWVzc2FnZUZyb21Xb3JrZXJNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQg
SW5zcGVjdG9yRnJvbnRlbmQ6Oldvcmtlcjo6ZGlzY29ubmVjdGVkRnJvbVdvcmtlcigpCnsKICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRpc2Nvbm5lY3RlZEZyb21Xb3JrZXJNZXNzYWdlID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGRpc2Nvbm5lY3RlZEZyb21Xb3JrZXJNZXNz
YWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJXb3JrZXIuZGlzY29ubmVjdGVkRnJvbVdvcmtlciIp
OwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZGlzY29ubmVjdGVkRnJvbVdv
cmtlck1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJT
KQoKCm5hbWVzcGFjZSBUeXBlQnVpbGRlciB7Cgpjb25zdCBjaGFyKiBjb25zdCBlbnVtX2NvbnN0
YW50X3ZhbHVlc1tdID0gewogICAgIkRvY3VtZW50IiwKICAgICJTdHlsZXNoZWV0IiwKICAgICJJ
bWFnZSIsCiAgICAiRm9udCIsCiAgICAiU2NyaXB0IiwKICAgICJYSFIiLAogICAgIldlYlNvY2tl
dCIsCiAgICAiT3RoZXIiLAogICAgIm9iamVjdCIsCiAgICAiZnVuY3Rpb24iLAogICAgInVuZGVm
aW5lZCIsCiAgICAic3RyaW5nIiwKICAgICJudW1iZXIiLAogICAgImJvb2xlYW4iLAogICAgImFy
cmF5IiwKICAgICJudWxsIiwKICAgICJub2RlIiwKICAgICJyZWdleHAiLAogICAgImRhdGUiLAog
ICAgImh0bWwiLAogICAgIndtbCIsCiAgICAieG1sIiwKICAgICJqYXZhc2NyaXB0IiwKICAgICJu
ZXR3b3JrIiwKICAgICJjb25zb2xlLWFwaSIsCiAgICAib3RoZXIiLAogICAgInRpcCIsCiAgICAi
bG9nIiwKICAgICJ3YXJuaW5nIiwKICAgICJlcnJvciIsCiAgICAiZGVidWciLAogICAgImRpciIs
CiAgICAiZGlyeG1sIiwKICAgICJ0cmFjZSIsCiAgICAic3RhcnRHcm91cCIsCiAgICAic3RhcnRH
cm91cENvbGxhcHNlZCIsCiAgICAiZW5kR3JvdXAiLAogICAgImFzc2VydCIsCiAgICAicGFyc2Vy
IiwKICAgICJzY3JpcHQiLAogICAgInVzZXIiLAogICAgInVzZXItYWdlbnQiLAogICAgImluc3Bl
Y3RvciIsCiAgICAicmVndWxhciIsCiAgICAiYWN0aXZlIiwKICAgICJpbmFjdGl2ZSIsCiAgICAi
ZGlzYWJsZWQiLAogICAgInN0eWxlIiwKICAgICJtZWRpYVJ1bGUiLAogICAgImltcG9ydFJ1bGUi
LAogICAgImxpbmtlZFNoZWV0IiwKICAgICJpbmxpbmVTaGVldCIsCiAgICAiZ2xvYmFsIiwKICAg
ICJsb2NhbCIsCiAgICAid2l0aCIsCiAgICAiY2xvc3VyZSIsCiAgICAiY2F0Y2giLAogICAgInN1
YnRyZWUtbW9kaWZpZWQiLAogICAgImF0dHJpYnV0ZS1tb2RpZmllZCIsCiAgICAibm9kZS1yZW1v
dmVkIiwKICAgICJET00iLAogICAgIkV2ZW50TGlzdGVuZXIiLAogICAgImV4Y2VwdGlvbiIKfTsK
ClN0cmluZyBnZXRFbnVtQ29uc3RhbnRWYWx1ZShpbnQgY29kZSkgewogICAgLy8gVGVzdCB2YXJp
YWJsZSBmcm9tIGdlbmVyYXRlZCBzb3VyY2VzLCBkZWNsYXJlZCBpbiBJbnNwZWN0b3JUeXBlQnVp
bGRlci5oIGFuZCBkZWZpbmVkIGluIEluc3BlY3RvclR5cGVCdWlsZGVyLmNwcAogICAgQVNTRVJU
KHR5cGVCdWlsZGVyVGVzdFZhcmlhYmxlKTsKICAgIHJldHVybiBlbnVtX2NvbnN0YW50X3ZhbHVl
c1tjb2RlXTsKfQoKfSAvLyBuYW1lc3BhY2UgVHlwZUJ1aWxkZXIKCiNpZiAhQVNTRVJUX0RJU0FC
TEVECgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIFR5cGVCdWlsZGVyOjpBcnJheU9mPFQ+Ojph
c3NlcnRDb3JyZWN0VmFsdWUoSW5zcGVjdG9yVmFsdWUqIHZhbHVlKQp7CiAgICBSZWZQdHI8SW5z
cGVjdG9yQXJyYXk+IGFycmF5OwogICAgYm9vbCBjYXN0UmVzID0gdmFsdWUtPmFzQXJyYXkoJmFy
cmF5KTsKICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7CiAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgYXJyYXktPmxlbmd0aCgpOyBpKyspIHsKICAgICAgICBBcnJheUl0ZW1I
ZWxwZXI8VD46OlRyYWl0czo6dGVtcGxhdGUgYXNzZXJ0Q29ycmVjdFZhbHVlPFQ+KGFycmF5LT5n
ZXQoaSkuZ2V0KCkpOwogICAgfQp9CgoKCiNlbmRpZiAvLyAhQVNTRVJUX0RJU0FCTEVECgp9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCgojZW5kaWYgLy8gRU5BQkxFKElOU1BFQ1RPUikK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124614</attachid>
            <date>2012-01-30 15:41:20 -0800</date>
            <delta_ts>2012-01-31 06:59:38 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77289-20120131034117.patch</filename>
            <type>text/plain</type>
            <size>23303</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2Mjg2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDBlOTdjMTU3OTllZmZl
N2JjNWVmMDg3YTgzODM5ZTcxMjRlNzJjMi4uMDAzYzA5NWZkODQ2ZGJjZTFmZTcwMjI3NDgzM2Ni
NzUwNzY2Mjg1NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDY1IEBACisyMDEyLTAxLTI4ICBQZXRl
ciBSeWJpbiAgPHBldGVyLnJ5YmluQGdtYWlsLmNvbT4KKworICAgICAgICBXZWIgSW5zcGVjdG9y
OiBDb2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5OiByZWltcGxlbWVudCBnZW5lcmF0ZWQgYXJyYXkg
dHlwZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc3
Mjg5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQXJy
YXlzIGFyZSBub3cgcmVuZGVyZWQgYXMgYSBzaW5nbGUgdGVtcGxhdGUgY2xhc3MuIEl0cyB0eXBl
LXNwZWNpZmljCisgICAgICAgIGRldGFpbHMgYXJlIHByb3ZpZGVkIGJ5IGFuIGFkZGl0aW9uYWwg
QXJyYXlJdGVtSGVscGVyIGNsYXNzIHRoYXQgaXMKKyAgICAgICAgZGVmaW5lZCB1c2luZyBDKysg
c3BlY2lhbGl6YXRpb24gdGVjaG5pcXVlLgorCisgICAgICAgICogaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHk6CisgICAgICAgIChSYXdUeXBlcy5TdHJpbmcpOgorICAgICAgICAo
UmF3VHlwZXMuU3RyaW5nLmdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCk6CisgICAgICAg
IChSYXdUeXBlcy5JbnQpOgorICAgICAgICAoUmF3VHlwZXMuSW50LmdldF9hcnJheV9pdGVtX3Jh
d19jX3R5cGVfdGV4dCk6CisgICAgICAgIChSYXdUeXBlcy5OdW1iZXIpOgorICAgICAgICAoUmF3
VHlwZXMuTnVtYmVyLmdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCk6CisgICAgICAgIChS
YXdUeXBlcy5Cb29sKToKKyAgICAgICAgKFJhd1R5cGVzLkJvb2wuZ2V0X2FycmF5X2l0ZW1fcmF3
X2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFJhd1R5cGVzLk9iamVjdCk6CisgICAgICAgIChSYXdU
eXBlcy5PYmplY3QuZ2V0X2FycmF5X2l0ZW1fcmF3X2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFJh
d1R5cGVzLkFueSk6CisgICAgICAgIChSYXdUeXBlcy5BbnkuZ2V0X2FycmF5X2l0ZW1fcmF3X2Nf
dHlwZV90ZXh0KToKKyAgICAgICAgKFJhd1R5cGVzLkFycmF5KToKKyAgICAgICAgKFJhd1R5cGVz
LkFycmF5LmdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCk6CisgICAgICAgIChSYXdUeXBl
cyk6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLkVudW1C
aW5kaW5nKToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9kZWNsYXJhdGlvbl8u
RW51bUJpbmRpbmcuZ2V0X2FycmF5X2l0ZW1fY190eXBlX3RleHQpOgorICAgICAgICAoVHlwZUJp
bmRpbmdzLmNyZWF0ZV90eXBlX2RlY2xhcmF0aW9uXy5QbGFpblN0cmluZyk6CisgICAgICAgIChU
eXBlQmluZGluZ3MuY3JlYXRlX3R5cGVfZGVjbGFyYXRpb25fLlBsYWluU3RyaW5nLmdldF9hcnJh
eV9pdGVtX2NfdHlwZV90ZXh0KToKKyAgICAgICAgKFR5cGVCaW5kaW5ncy5jcmVhdGVfdHlwZV9k
ZWNsYXJhdGlvbl8uVHlwZWRlZlN0cmluZyk6CisgICAgICAgIChUeXBlQmluZGluZ3MuY3JlYXRl
X3R5cGVfZGVjbGFyYXRpb25fLlR5cGVkZWZTdHJpbmcuZ2V0X2FycmF5X2l0ZW1fY190eXBlX3Rl
eHQpOgorICAgICAgICAoU3RydWN0SXRlbVRyYWl0cyk6CisgICAgICAgIChnZXRfYXJyYXlfaXRl
bV9jX3R5cGVfdGV4dCk6CisgICAgICAgIChQbGFpbk9iamVjdEJpbmRpbmcpOgorICAgICAgICAo
UGxhaW5PYmplY3RCaW5kaW5nLmdldF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KToKKyAgICAgICAg
KEFkSG9jVHlwZUNvbnRleHQpOgorICAgICAgICAoQWRIb2NUeXBlQ29udGV4dC5nZXRfdHlwZV9u
YW1lX2ZpeCk6CisgICAgICAgIChBZEhvY1R5cGVDb250ZXh0LmFkZF90eXBlKToKKyAgICAgICAg
KEFycmF5QmluZGluZyk6CisgICAgICAgIChBcnJheUJpbmRpbmcucmVzb2x2ZV9pbm5lcik6Cisg
ICAgICAgIChBcnJheUJpbmRpbmcucmVzb2x2ZV9pbm5lci5SZXNvbHZlRGF0YSk6CisgICAgICAg
IChBcnJheUJpbmRpbmcucmVxdWVzdF91c2VyX3J1bnRpbWVfY2FzdCk6CisgICAgICAgIChBcnJh
eUJpbmRpbmcucmVxdWVzdF9pbnRlcm5hbF9ydW50aW1lX2Nhc3QpOgorICAgICAgICAoQXJyYXlC
aW5kaW5nLmdldF9jb2RlX2dlbmVyYXRvcik6CisgICAgICAgIChBcnJheUJpbmRpbmcuZ2V0X2Nv
ZGVfZ2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IpOgorICAgICAgICAoQXJyYXlCaW5kaW5nLmdldF9j
b2RlX2dlbmVyYXRvci5Db2RlR2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVpbGRlcik6CisgICAg
ICAgIChBcnJheUJpbmRpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IuZ2VuZXJh
dGVfZm9yd2FyZF9kZWNsYXJhdGlvbik6CisgICAgICAgIChBcnJheUJpbmRpbmcuZ2V0X2NvZGVf
Z2VuZXJhdG9yLkNvZGVHZW5lcmF0b3IucmVnaXN0ZXJfdXNlKToKKyAgICAgICAgKEFycmF5Qmlu
ZGluZy5nZXRfY29kZV9nZW5lcmF0b3IuQ29kZUdlbmVyYXRvci5nZXRfZ2VuZXJhdGVfcGFzc19p
ZCk6CisgICAgICAgIChBcnJheUJpbmRpbmcuZ2V0X3ZhbGlkYXRvcl9jYWxsX3RleHQpOgorICAg
ICAgICAoQXJyYXlCaW5kaW5nLmdldF9pbl9jX3R5cGVfdGV4dCk6CisgICAgICAgIChBcnJheUJp
bmRpbmcuZ2V0X2FycmF5X2l0ZW1fY190eXBlX3RleHQpOgorICAgICAgICAoQXJyYXlCaW5kaW5n
LmdldF9zZXR0ZXJfdmFsdWVfZXhwcmVzc2lvbl9wYXR0ZXJuKToKKyAgICAgICAgKEFycmF5Qmlu
ZGluZy5yZWR1Y2VfdG9fcmF3X3R5cGUpOgorICAgICAgICAoUmF3VHlwZUJpbmRpbmcuZ2V0X2Fy
cmF5X2l0ZW1fY190eXBlX3RleHQpOgorICAgICAgICAoQXJyYXlJdGVtSGVscGVyKToKKyAgICAg
ICAgKHR5cGVuYW1lKToKKyAgICAgICAgKEFycmF5T2YpOgorICAgICAgICAoVHJhaXRzKToKKwog
MjAxMi0wMS0zMCAgQmV0aCBEYWtpbiAgPGJkYWtpbkBhcHBsZS5jb20+CiAKICAgICAgICAgU3Bl
Y3VsYXRpdmUgMzItYml0IGJ1aWxkLWZpeC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2lu
c3BlY3Rvci9Db2RlR2VuZXJhdG9ySW5zcGVjdG9yLnB5IGIvU291cmNlL1dlYkNvcmUvaW5zcGVj
dG9yL0NvZGVHZW5lcmF0b3JJbnNwZWN0b3IucHkKaW5kZXggNGQ0ZDY1NDMxY2UzY2UzZWQzOGFk
YmExODA3ZGVlMTViNjg0Nzg4My4uNGQ4ZGNkN2EwMDBiZTc3NzE0ZmYyNWVhNzM1MTA5OTk4Zjlk
ZmJmMCAxMDA3NTUKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJ
bnNwZWN0b3IucHkKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5lcmF0b3JJ
bnNwZWN0b3IucHkKQEAgLTMxNyw2ICszMTcsMTAgQEAgY2xhc3MgUmF3VHlwZXMob2JqZWN0KToK
ICAgICAgICAgZGVmIGlzX2hlYXZ5X3ZhbHVlKCk6CiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQog
CisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVmIGdldF9hcnJheV9pdGVtX3Jhd19j
X3R5cGVfdGV4dCgpOgorICAgICAgICAgICAgcmV0dXJuICJTdHJpbmciCisKICAgICAgICAgX3Bs
YWluX2NfdHlwZSA9IENQYXJhbVR5cGUoIlN0cmluZyIpCiAgICAgICAgIF9yZWZfY190eXBlID0g
Q1BhcmFtVHlwZSgiY29uc3QgU3RyaW5nJiIpCiAKQEAgLTM1Myw2ICszNTcsMTAgQEAgY2xhc3Mg
UmF3VHlwZXMob2JqZWN0KToKICAgICAgICAgZGVmIGlzX2hlYXZ5X3ZhbHVlKCk6CiAgICAgICAg
ICAgICByZXR1cm4gRmFsc2UKIAorICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiBn
ZXRfYXJyYXlfaXRlbV9yYXdfY190eXBlX3RleHQoKToKKyAgICAgICAgICAgIHJldHVybiAiaW50
IgorCiAgICAgICAgIGRlZmF1bHRfY19wYXJhbV90eXBlID0gQ1BhcmFtVHlwZSgiaW50IikKIAog
ICAgIGNsYXNzIE51bWJlcihCYXNlVHlwZSk6CkBAIC0zODQsNiArMzkyLDEwIEBAIGNsYXNzIFJh
d1R5cGVzKG9iamVjdCk6CiAgICAgICAgIGRlZiBpc19oZWF2eV92YWx1ZSgpOgogICAgICAgICAg
ICAgcmV0dXJuIEZhbHNlCiAKKyAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgZ2V0
X2FycmF5X2l0ZW1fcmF3X2NfdHlwZV90ZXh0KCk6CisgICAgICAgICAgICByZXR1cm4gImRvdWJs
ZSIKKwogICAgICAgICBkZWZhdWx0X2NfcGFyYW1fdHlwZSA9IENQYXJhbVR5cGUoImRvdWJsZSIp
CiAKICAgICBjbGFzcyBCb29sKEJhc2VUeXBlKToKQEAgLTQyNyw2ICs0MzksMTAgQEAgY2xhc3Mg
UmF3VHlwZXMob2JqZWN0KToKICAgICAgICAgZGVmIGlzX2hlYXZ5X3ZhbHVlKCk6CiAgICAgICAg
ICAgICByZXR1cm4gRmFsc2UKIAorICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiBn
ZXRfYXJyYXlfaXRlbV9yYXdfY190eXBlX3RleHQoKToKKyAgICAgICAgICAgIHJldHVybiAiYm9v
bCIKKwogICAgICAgICBfcGxhaW5fY190eXBlID0gQ1BhcmFtVHlwZSgiYm9vbCIpCiAgICAgICAg
IF9yZWZfY190eXBlID0gQ1BhcmFtVHlwZSgiY29uc3QgYm9vbCogY29uc3QiLCAiKiVzIikKIApA
QCAtNDcyLDYgKzQ4OCwxMCBAQCBjbGFzcyBSYXdUeXBlcyhvYmplY3QpOgogICAgICAgICBkZWYg
aXNfaGVhdnlfdmFsdWUoKToKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKKyAgICAgICAgQHN0
YXRpY21ldGhvZAorICAgICAgICBkZWYgZ2V0X2FycmF5X2l0ZW1fcmF3X2NfdHlwZV90ZXh0KCk6
CisgICAgICAgICAgICByZXR1cm4gIkluc3BlY3Rvck9iamVjdCIKKwogICAgICAgICBfcGxhaW5f
Y190eXBlID0gQ1BhcmFtVHlwZSgiUmVmUHRyPEluc3BlY3Rvck9iamVjdD4iKQogICAgICAgICBf
cmVmX2NfdHlwZSA9IENQYXJhbVR5cGUoIlBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiIpCiAK
QEAgLTUyMCw2ICs1NDAsMTAgQEAgY2xhc3MgUmF3VHlwZXMob2JqZWN0KToKICAgICAgICAgZGVm
IGlzX2hlYXZ5X3ZhbHVlKCk6CiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogCisgICAgICAgIEBz
dGF0aWNtZXRob2QKKyAgICAgICAgZGVmIGdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCgp
OgorICAgICAgICAgICAgcmV0dXJuICJJbnNwZWN0b3JWYWx1ZSIKKwogICAgICAgICBfcGxhaW5f
Y190eXBlID0gQ1BhcmFtVHlwZSgiUmVmUHRyPEluc3BlY3RvclZhbHVlPiIpCiAgICAgICAgIF9y
ZWZfY190eXBlID0gQ1BhcmFtVHlwZSgiUGFzc1JlZlB0cjxJbnNwZWN0b3JWYWx1ZT4iKQogCkBA
IC01NjcsNiArNTkxLDEwIEBAIGNsYXNzIFJhd1R5cGVzKG9iamVjdCk6CiAgICAgICAgIGRlZiBp
c19oZWF2eV92YWx1ZSgpOgogICAgICAgICAgICAgcmV0dXJuIFRydWUKIAorICAgICAgICBAc3Rh
dGljbWV0aG9kCisgICAgICAgIGRlZiBnZXRfYXJyYXlfaXRlbV9yYXdfY190eXBlX3RleHQoKToK
KyAgICAgICAgICAgIHJldHVybiAiSW5zcGVjdG9yQXJyYXkiCisKICAgICAgICAgX3BsYWluX2Nf
dHlwZSA9IENQYXJhbVR5cGUoIlJlZlB0cjxJbnNwZWN0b3JBcnJheT4iKQogICAgICAgICBfcmVm
X2NfdHlwZSA9IENQYXJhbVR5cGUoIlBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IikKIApAQCAt
ODEwLDYgKzgzOCwxMCBAQCBjbGFzcyBUeXBlQmluZGluZ3M6CiAgICAgICAgICAgICAgICAgICAg
IGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6CiAgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gaGVscGVyLmZ1bGxfbmFtZV9wcmVmaXhfZm9yX3VzZSArIGZpeGVkX3R5
cGVfbmFtZS5jbGFzc19uYW1lICsgIjo6RW51bSIKIAorICAgICAgICAgICAgICAgICAgICBAY2xh
c3NtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9hcnJheV9pdGVtX2NfdHlwZV90
ZXh0KGNscyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLmdldF9pbl9jX3R5
cGVfdGV4dChGYWxzZSkKKwogICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAg
ICAgICAgICAgICAgICAgIGRlZiBnZXRfc2V0dGVyX3ZhbHVlX2V4cHJlc3Npb25fcGF0dGVybigp
OgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJnZXRFbnVtQ29uc3RhbnRWYWx1ZSgl
cykiCkBAIC04NTUsNiArODg3LDEwIEBAIGNsYXNzIFR5cGVCaW5kaW5nczoKICAgICAgICAgICAg
ICAgICAgICAgICAgIGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6CiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5n
ZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVOVCwgb3B0aW9uYWwpLmdldF90ZXh0KCkKIAor
ICAgICAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgICAg
ICAgICBkZWYgZ2V0X2FycmF5X2l0ZW1fY190eXBlX3RleHQoY2xzKToKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gY2xzLnJlZHVjZV90b19yYXdfdHlwZSgpLmdldF9hcnJheV9p
dGVtX3Jhd19jX3R5cGVfdGV4dCgpCisKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsYWlu
U3RyaW5nCiAKICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtOTA5LDYgKzk0NSwxMCBAQCBjbGFz
cyBUeXBlQmluZGluZ3M6CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlw
ZV90ZXh0KGNscywgb3B0aW9uYWwpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biAiY29uc3QgJXMlcyYiICUgKGhlbHBlci5mdWxsX25hbWVfcHJlZml4X2Zvcl91c2UsIGZpeGVk
X3R5cGVfbmFtZS5jbGFzc19uYW1lKQogCisgICAgICAgICAgICAgICAgICAgICAgICBAY2xhc3Nt
ZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfYXJyYXlfaXRlbV9jX3R5cGVf
dGV4dChjbHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMuZ2V0X2lu
X2NfdHlwZV90ZXh0KEZhbHNlKQorCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUeXBlZGVm
U3RyaW5nCiAKICAgICAgICAgZWxpZiBqc29uX3R5cGFibGVbInR5cGUiXSA9PSAib2JqZWN0IjoK
QEAgLTEwODksNiArMTEyOSw4IEBAIGNsYXNzIFR5cGVCaW5kaW5nczoKICAgICB9CiAiIiIgJSBj
bGFzc19uYW1lKQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXds
aW5lKCIgICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7XG4iKQorCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcm9wX2RhdGEgaW4gcmVzb2x2ZV9kYXRh
Lm9wdGlvbmFsX3Byb3BlcnRpZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwcm9wX25hbWUgPSBwcm9wX2RhdGEucFsibmFtZSJdCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBwYXJhbV90eXBlX2JpbmRpbmcgPSBwcm9wX2RhdGEucGFyYW1fdHlwZV9i
aW5kaW5nCkBAIC0xMTc3LDYgKzEyMTksMTAgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAg
ICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNscywgb3B0aW9uYWwpOgogICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXNzUmVmUHRyPCIgKyBoZWxwZXIuZnVsbF9u
YW1lX3ByZWZpeF9mb3JfdXNlICsgZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUgKyAiPiIKIAor
ICAgICAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVm
IGdldF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KGNscyk6CisgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gaGVscGVyLmZ1bGxfbmFtZV9wcmVmaXhfZm9yX3VzZSArIGZpeGVkX3R5cGVfbmFt
ZS5jbGFzc19uYW1lCisKICAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAogICAgICAg
ICAgICAgICAgICAgICBkZWYgZ2V0X3NldHRlcl92YWx1ZV9leHByZXNzaW9uX3BhdHRlcm4oKToK
ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCkBAIC0xMjM0LDYgKzEyODAsMTAg
QEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2Nf
dHlwZV90ZXh0KGNscywgb3B0aW9uYWwpOgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGNscy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRfY19wYXJhbV90eXBlKFBhcmFtVHlwZS5FVkVO
VCwgb3B0aW9uYWwpLmdldF90ZXh0KCkKIAorICAgICAgICAgICAgICAgICAgICBAY2xhc3NtZXRo
b2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KGNs
cyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLnJlZHVjZV90b19yYXdfdHlw
ZSgpLmdldF9hcnJheV9pdGVtX3Jhd19jX3R5cGVfdGV4dCgpCisKICAgICAgICAgICAgICAgICAg
ICAgQHN0YXRpY21ldGhvZAogICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X3NldHRlcl92YWx1
ZV9leHByZXNzaW9uX3BhdHRlcm4oKToKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBO
b25lCkBAIC0xMjQ0LDE1NiArMTI5NCwxMDUgQEAgY2xhc3MgVHlwZUJpbmRpbmdzOgogCiAgICAg
ICAgICAgICAgICAgcmV0dXJuIFBsYWluT2JqZWN0QmluZGluZwogICAgICAgICBlbGlmIGpzb25f
dHlwYWJsZVsidHlwZSJdID09ICJhcnJheSI6CisgICAgICAgICAgICBpZiAiaXRlbXMiIGluIGpz
b25fdHlwYWJsZToKIAotICAgICAgICAgICAgY2xhc3MgQXJyYXlCaW5kaW5nOgotICAgICAgICAg
ICAgICAgIHJlc29sdmVfZGF0YV8gPSBOb25lCi0gICAgICAgICAgICAgICAgbmVlZF9pbnRlcm5h
bF9ydW50aW1lX2Nhc3RfID0gRmFsc2UKKyAgICAgICAgICAgICAgICBhZF9ob2NfdHlwZXMgPSBb
XQogCi0gICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCi0gICAgICAgICAgICAgICAgZGVmIHJl
c29sdmVfaW5uZXIoY2xzLCByZXNvbHZlX2NvbnRleHQpOgotICAgICAgICAgICAgICAgICAgICBp
ZiBjbHMucmVzb2x2ZV9kYXRhXzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAg
ICAgICAgICAgICAgIGNsYXNzIEFkSG9jVHlwZUNvbnRleHQ6CisgICAgICAgICAgICAgICAgICAg
IGNvbnRhaW5lcl9mdWxsX25hbWVfcHJlZml4ID0gIjxub3QgeWV0IGRlZmluZWQ+IgogCi0gICAg
ICAgICAgICAgICAgICAgIGFkX2hvY190eXBlcyA9IFtdCi0gICAgICAgICAgICAgICAgICAgIGlm
ICJpdGVtcyIgaW4ganNvbl90eXBhYmxlOgorICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0
aG9kCisgICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfdHlwZV9uYW1lX2ZpeCgpOgorICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpeGVkX3R5cGVfbmFtZQogCi0gICAgICAgICAgICAg
ICAgICAgICAgICBjbGFzcyBBZEhvY1R5cGVDb250ZXh0OgotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnRhaW5lcl9mdWxsX25hbWVfcHJlZml4ID0gIjxub3QgeWV0IGRlZmluZWQ+Igor
ICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIGRl
ZiBhZGRfdHlwZShiaW5kaW5nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkX2hvY190eXBl
cy5hcHBlbmQoYmluZGluZykKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNt
ZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X3R5cGVfbmFtZV9maXgo
KToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgTmFtZUZpeDoKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWUgPSAiSXRlbSIKKyAgICAg
ICAgICAgICAgICBpdGVtX2JpbmRpbmcgPSByZXNvbHZlX3BhcmFtX3R5cGUoanNvbl90eXBhYmxl
WyJpdGVtcyJdLCBjb250ZXh0X2RvbWFpbl9uYW1lLCBBZEhvY1R5cGVDb250ZXh0KQogCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgb3V0cHV0X2NvbW1lbnQod3JpdGVyKToKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAg
ICAgY2xhc3MgQXJyYXlCaW5kaW5nOgorICAgICAgICAgICAgICAgICAgICByZXNvbHZlX2RhdGFf
ID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBuZWVkX2ludGVybmFsX3J1bnRpbWVfY2FzdF8g
PSBGYWxzZQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYW1lRml4
CisgICAgICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgICAgICAgICBk
ZWYgcmVzb2x2ZV9pbm5lcihjbHMsIHJlc29sdmVfY29udGV4dCk6CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiBjbHMucmVzb2x2ZV9kYXRhXzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgYWRkX3R5cGUoYmluZGluZyk6Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGFkX2hvY190eXBlcy5hcHBlbmQoYmluZGluZykKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIFJlc29sdmVEYXRhOgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGl0ZW1fdHlwZV9iaW5kaW5nID0gaXRlbV9iaW5kaW5nCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYWRfaG9jX3R5cGVfbGlzdCA9IGFkX2hvY190eXBlcwogCi0gICAg
ICAgICAgICAgICAgICAgICAgICBpdGVtX2JpbmRpbmcgPSByZXNvbHZlX3BhcmFtX3R5cGUoanNv
bl90eXBhYmxlWyJpdGVtcyJdLCBjb250ZXh0X2RvbWFpbl9uYW1lLCBBZEhvY1R5cGVDb250ZXh0
KQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgaXRl
bV9iaW5kaW5nID0gUmF3VHlwZUJpbmRpbmcoUmF3VHlwZXMuQW55KQorICAgICAgICAgICAgICAg
ICAgICAgICAgY2xzLnJlc29sdmVfZGF0YV8gPSBSZXNvbHZlRGF0YQogCi0gICAgICAgICAgICAg
ICAgICAgIGNvZGVfZ2VuZXJhdG9yID0gaXRlbV9iaW5kaW5nLmdldF9jb2RlX2dlbmVyYXRvcigp
Ci0gICAgICAgICAgICAgICAgICAgIGlmIGNvZGVfZ2VuZXJhdG9yOgotICAgICAgICAgICAgICAg
ICAgICAgICAgY29kZV9nZW5lcmF0b3IucmVnaXN0ZXJfdXNlKHJlc29sdmVfY29udGV4dC5mb3J3
YXJkX2xpc3RlbmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHQgaW4gYWRfaG9jX3R5
cGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVzb2x2ZV9pbm5lcihyZXNvbHZl
X2NvbnRleHQpCiAKLSAgICAgICAgICAgICAgICAgICAgY2xhc3MgUmVzb2x2ZURhdGE6Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBpdGVtX3R5cGVfYmluZGluZyA9IGl0ZW1fYmluZGluZwotICAg
ICAgICAgICAgICAgICAgICAgICAgYWRfaG9jX3R5cGVfbGlzdCA9IGFkX2hvY190eXBlcworICAg
ICAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJl
cXVlc3RfdXNlcl9ydW50aW1lX2Nhc3QoY2xzLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIHlldCIpCiAKLSAgICAgICAg
ICAgICAgICAgICAgY2xzLnJlc29sdmVfZGF0YV8gPSBSZXNvbHZlRGF0YQorICAgICAgICAgICAg
ICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJlcXVlc3RfaW50
ZXJuYWxfcnVudGltZV9jYXN0KGNscyk6CisgICAgICAgICAgICAgICAgICAgICAgICBjbHMubmVl
ZF9pbnRlcm5hbF9ydW50aW1lX2Nhc3RfID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAg
Y2xzLnJlc29sdmVfZGF0YV8uaXRlbV90eXBlX2JpbmRpbmcucmVxdWVzdF9pbnRlcm5hbF9ydW50
aW1lX2Nhc3QoKQogCi0gICAgICAgICAgICAgICAgICAgIGZvciB0IGluIGFkX2hvY190eXBlczoK
LSAgICAgICAgICAgICAgICAgICAgICAgIHQucmVzb2x2ZV9pbm5lcihyZXNvbHZlX2NvbnRleHQp
CisgICAgICAgICAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgICAgICAgICBk
ZWYgZ2V0X2NvZGVfZ2VuZXJhdG9yKGFycmF5X2JpbmRpbmdfY2xzKToKIAotICAgICAgICAgICAg
ICAgIEBjbGFzc21ldGhvZAotICAgICAgICAgICAgICAgIGRlZiByZXF1ZXN0X3VzZXJfcnVudGlt
ZV9jYXN0KGNscywgcmVxdWVzdCk6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlv
bigiTm90IGltcGxlbWVudGVkIHlldCIpCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBD
b2RlR2VuZXJhdG9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfdHlwZV9idWlsZGVyKHdy
aXRlciwgZ2VuZXJhdGVfY29udGV4dCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGFkX2hvY190eXBlX3dyaXRlciA9IHdyaXRlcgogCi0gICAgICAgICAgICAgICAgQGNsYXNzbWV0
aG9kCi0gICAgICAgICAgICAgICAgZGVmIHJlcXVlc3RfaW50ZXJuYWxfcnVudGltZV9jYXN0KGNs
cyk6Ci0gICAgICAgICAgICAgICAgICAgIGNscy5uZWVkX2ludGVybmFsX3J1bnRpbWVfY2FzdF8g
PSBUcnVlCi0gICAgICAgICAgICAgICAgICAgIGNscy5yZXNvbHZlX2RhdGFfLml0ZW1fdHlwZV9i
aW5kaW5nLnJlcXVlc3RfaW50ZXJuYWxfcnVudGltZV9jYXN0KCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmVzb2x2ZV9kYXRhID0gYXJyYXlfYmluZGluZ19jbHMucmVzb2x2ZV9k
YXRhXwogCi0gICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCi0gICAgICAgICAgICAgICAgZGVm
IGdldF9jb2RlX2dlbmVyYXRvcihhcnJheV9iaW5kaW5nX2Nscyk6CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZvciBhZF9ob2NfdHlwZSBpbiByZXNvbHZlX2RhdGEuYWRfaG9jX3R5
cGVfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJh
dG9yID0gYWRfaG9jX3R5cGUuZ2V0X2NvZGVfZ2VuZXJhdG9yKCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIGNvZGVfZ2VuZXJhdG9yOgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yLmdlbmVyYXRlX3R5cGVfYnVpbGRl
cihhZF9ob2NfdHlwZV93cml0ZXIsIGdlbmVyYXRlX2NvbnRleHQpCiAKLSAgICAgICAgICAgICAg
ICAgICAgY2xhc3MgQ29kZUdlbmVyYXRvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIEBzdGF0
aWNtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBnZW5lcmF0ZV90eXBlX2J1aWxk
ZXIod3JpdGVyLCBnZW5lcmF0ZV9jb250ZXh0KToKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBoZWxwZXIud3JpdGVfZG9jKHdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
bGFzc19uYW1lID0gZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBmaXhlZF90eXBlX25hbWUub3V0cHV0X2NvbW1lbnQod3JpdGVyKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCJjbGFzcyAiKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoY2xhc3NfbmFtZSkKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCIgOiBwdWJsaWMgSW5zcGVjdG9yQXJyYXkg
e1xuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIubmV3bGluZSgicHJpdmF0
ZTpcbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICAl
cygpIHsgfVxuIiAlIGZpeGVkX3R5cGVfbmFtZS5jbGFzc19uYW1lKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIlxuIikKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB3cml0ZXIubmV3bGluZSgicHVibGljOlxuIikKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBhZF9ob2NfdHlwZV93cml0ZXIgPSB3cml0ZXIuaW5zZXJ0X3dyaXRlcigiICAgICIpCi0K
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlX2RhdGEgPSBhcnJheV9iaW5kaW5n
X2Nscy5yZXNvbHZlX2RhdGFfCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWRf
aG9jX3R5cGUgaW4gcmVzb2x2ZV9kYXRhLmFkX2hvY190eXBlX2xpc3Q6Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvZGVfZ2VuZXJhdG9yID0gYWRfaG9jX3R5cGUuZ2V0X2NvZGVf
Z2VuZXJhdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29kZV9nZW5l
cmF0b3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2dlbmVyYXRv
ci5nZW5lcmF0ZV90eXBlX2J1aWxkZXIoYWRfaG9jX3R5cGVfd3JpdGVyLCBnZW5lcmF0ZV9jb250
ZXh0KQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV90eXBlX2JpbmRpbmcgPSBy
ZXNvbHZlX2RhdGEuaXRlbV90eXBlX2JpbmRpbmcKLQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZvciBpdGVtX3R5cGVfb3B0IGluIE1ldGhvZEdlbmVyYXRlTW9kZXMuZ2V0X21vZGVzKGl0
ZW1fdHlwZV9iaW5kaW5nKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVy
Lm5ld2xpbmUoIiAgICB2b2lkIGFkZEl0ZW0iKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB3cml0ZXIuYXBwZW5kKCIoJXMgdmFsdWUpXG4iICUgaXRlbV90eXBlX29wdC5nZXRfY19w
YXJhbV90eXBlX3RleHQoaXRlbV90eXBlX2JpbmRpbmcpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB3cml0ZXIubmV3bGluZSgiICAgIHtcbiIpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAgICAgIHRoaXMtPnB1c2glcyglcyk7XG4i
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChpdGVtX3R5cGVfYmluZGlu
Zy5yZWR1Y2VfdG9fcmF3X3R5cGUoKS5nZXRfc2V0dGVyX25hbWUoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fdHlwZV9vcHQuZ2V0X3NldHRlcl92YWx1ZV9l
eHByZXNzaW9uKGl0ZW1fdHlwZV9iaW5kaW5nLCAidmFsdWUiKSkpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCIgICAgfVxuIikKLQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIlxuIikKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB3cml0ZXIubmV3bGluZSgiICAgIHN0YXRpYyBQYXNzUmVmUHRyPCVzPiBjcmVhdGUo
KSB7XG4iICUgZml4ZWRfdHlwZV9uYW1lLmNsYXNzX25hbWUpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgd3JpdGVyLm5ld2xpbmUoIiAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyAlcygp
KTtcbiIgJSBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB3cml0ZXIubmV3bGluZSgiICAgIH1cbiIpCi0KLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiBhcnJheV9iaW5kaW5nX2Nscy5uZWVkX2ludGVybmFsX3J1bnRpbWVfY2FzdF86
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIiNpZiAlc1xu
IiAlIFZBTElEQVRPUl9JRkRFRl9OQU1FKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3cml0ZXIubmV3bGluZSgiICAgIHN0YXRpYyB2b2lkIGFzc2VydENvcnJlY3RWYWx1ZShJbnNw
ZWN0b3JWYWx1ZSogdmFsdWUpO1xuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
d3JpdGVyLmFwcGVuZCgiI2VuZGlmICAvLyAlc1xuIiAlIFZBTElEQVRPUl9JRkRFRl9OQU1FKQot
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcl93cml0ZXIgPSBnZW5l
cmF0ZV9jb250ZXh0LnZhbGlkYXRvcl93cml0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdmFsaWRhdG9yX3dyaXRlci5uZXdsaW5lKCJ2b2lkICVzJXM6OmFzc2VydENvcnJlY3RW
YWx1ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpXG4iICUgKGhlbHBlci5mdWxsX25hbWVfcHJlZml4
X2Zvcl9pbXBsLCBjbGFzc19uYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dmFsaWRhdG9yX3dyaXRlci5uZXdsaW5lKCJ7XG4iKQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB2YWxpZGF0b3Jfd3JpdGVyLm5ld2xpbmUoIiAgICBSZWZQdHI8SW5zcGVjdG9yQXJy
YXk+IGFycmF5O1xuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9y
X3dyaXRlci5uZXdsaW5lKCIgICAgYm9vbCBjYXN0UmVzID0gdmFsdWUtPmFzQXJyYXkoJmFycmF5
KTtcbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcl93cml0ZXIu
bmV3bGluZSgiICAgIEFTU0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7XG4iKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3Jfd3JpdGVyLm5ld2xpbmUoIiAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXJyYXktPmxlbmd0aCgpOyArK2kpIHtcbiIpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcl93cml0ZXIubmV3bGluZSgiICAg
ICAgICAlcyhhcnJheS0+Z2V0KGkpLmdldCgpKTtcbiIgJSByZXNvbHZlX2RhdGEuaXRlbV90eXBl
X2JpbmRpbmcuZ2V0X3ZhbGlkYXRvcl9jYWxsX3RleHQoKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdmFsaWRhdG9yX3dyaXRlci5uZXdsaW5lKCIgICAgfVxuIikKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yX3dyaXRlci5uZXdsaW5lKCJ9XG5cblxu
IikKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5uZXdsaW5lKCJ9O1xuXG4i
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkZWYgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih3cml0ZXIp
OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAKLSAgICAgICAgICAgICAg
ICAgICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBnZW5l
cmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHdyaXRlcik6Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2xhc3NfbmFtZSA9IGZpeGVkX3R5cGVfbmFtZS5jbGFzc19uYW1lCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld2xpbmUoImNsYXNzICIpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChjbGFzc19uYW1lKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIjtcbiIpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiByZWdp
c3Rlcl91c2UoZm9yd2FyZF9saXN0ZW5lcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGl0ZW1fY29kZV9nZW5lcmF0b3IgPSBpdGVtX2JpbmRpbmcuZ2V0X2NvZGVfZ2VuZXJhdG9y
KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXRlbV9jb2RlX2dlbmVyYXRv
cjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fY29kZV9nZW5lcmF0
b3IucmVnaXN0ZXJfdXNlKGZvcndhcmRfbGlzdGVuZXIpCiAKLSAgICAgICAgICAgICAgICAgICAg
ICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZiByZWdpc3Rlcl91
c2UoZm9yd2FyZF9saXN0ZW5lcik6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGVy
LmFkZF90b19mb3J3YXJkX2xpc3RlbmVyKGZvcndhcmRfbGlzdGVuZXIpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlZiBnZXRfZ2VuZXJhdGVfcGFzc19pZCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gVHlwZUJ1aWxkZXJQYXNzLk1BSU4KIAotICAgICAgICAgICAgICAgICAgICAg
ICAgQHN0YXRpY21ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9nZW5lcmF0
ZV9wYXNzX2lkKCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVCdWls
ZGVyUGFzcy5NQUlOCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZUdlbmVyYXRv
cgogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2RlR2VuZXJhdG9yCisgICAgICAgICAg
ICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYgZ2V0X3ZhbGlk
YXRvcl9jYWxsX3RleHQoY2xzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHMu
Z2V0X2FycmF5X2l0ZW1fY190eXBlX3RleHQoKSArICI6OmFzc2VydENvcnJlY3RWYWx1ZSIKIAot
ICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICBkZWYgZ2V0X3Zh
bGlkYXRvcl9jYWxsX3RleHQoKToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5m
dWxsX25hbWVfcHJlZml4X2Zvcl91c2UgKyBmaXhlZF90eXBlX25hbWUuY2xhc3NfbmFtZSArICI6
OmFzc2VydENvcnJlY3RWYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisg
ICAgICAgICAgICAgICAgICAgIGRlZiBnZXRfaW5fY190eXBlX3RleHQoY2xzLCBvcHRpb25hbCk6
CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6
OkFycmF5PCVzID4gPiIgJSBjbHMucmVzb2x2ZV9kYXRhXy5pdGVtX3R5cGVfYmluZGluZy5nZXRf
YXJyYXlfaXRlbV9jX3R5cGVfdGV4dCgpCiAKLSAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QK
LSAgICAgICAgICAgICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KGNscywgb3B0aW9uYWwpOgot
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhc3NSZWZQdHI8JXMlcz4iICUgKGhlbHBlci5m
dWxsX25hbWVfcHJlZml4X2Zvcl91c2UsIGZpeGVkX3R5cGVfbmFtZS5jbGFzc19uYW1lKQorICAg
ICAgICAgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgZGVmIGdl
dF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KGNscyk6CisgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gIlR5cGVCdWlsZGVyOjpBcnJheTwlcyA+IiAlIGNscy5yZXNvbHZlX2RhdGFfLml0ZW1f
dHlwZV9iaW5kaW5nLmdldF9hcnJheV9pdGVtX2NfdHlwZV90ZXh0KCkKIAotICAgICAgICAgICAg
ICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgICAgICAgICBkZWYgZ2V0X3NldHRlcl92YWx1ZV9l
eHByZXNzaW9uX3BhdHRlcm4oKToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAg
ICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgICAgICAgICBkZWYg
Z2V0X3NldHRlcl92YWx1ZV9leHByZXNzaW9uX3BhdHRlcm4oKToKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBOb25lCiAKLSAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCi0gICAg
ICAgICAgICAgICAgZGVmIHJlZHVjZV90b19yYXdfdHlwZSgpOgotICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gUmF3VHlwZXMuQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgQHN0YXRpY21ldGhv
ZAorICAgICAgICAgICAgICAgICAgICBkZWYgcmVkdWNlX3RvX3Jhd190eXBlKCk6CisgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gUmF3VHlwZXMuQXJyYXkKIAotICAgICAgICAgICAgcmV0
dXJuIEFycmF5QmluZGluZworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheUJpbmRpbmcKKyAg
ICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBGYWxsLXRocm91Z2ggdG8gcmF3IHR5
cGUuCisgICAgICAgICAgICAgICAgcGFzcwogCiAgICAgICAgIHJhd190eXBlID0gUmF3VHlwZXMu
Z2V0KGpzb25fdHlwYWJsZVsidHlwZSJdKQogCkBAIC0xNDIyLDYgKzE0MjEsOSBAQCBjbGFzcyBS
YXdUeXBlQmluZGluZzoKICAgICBkZWYgZ2V0X2luX2NfdHlwZV90ZXh0KHNlbGYsIG9wdGlvbmFs
KToKICAgICAgICAgcmV0dXJuIHNlbGYucmF3X3R5cGVfLmdldF9jX3BhcmFtX3R5cGUoUGFyYW1U
eXBlLkVWRU5ULCBvcHRpb25hbCkuZ2V0X3RleHQoKQogCisgICAgZGVmIGdldF9hcnJheV9pdGVt
X2NfdHlwZV90ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yYXdfdHlwZV8uZ2V0X2Fy
cmF5X2l0ZW1fcmF3X2NfdHlwZV90ZXh0KCkKKwogICAgIGRlZiBnZXRfc2V0dGVyX3ZhbHVlX2V4
cHJlc3Npb25fcGF0dGVybihzZWxmKToKICAgICAgICAgcmV0dXJuIE5vbmUKIApAQCAtMTY0Miw2
ICsxNjQ0LDczIEBAIHR5cGVkZWYgU3RyaW5nIEVycm9yU3RyaW5nOwogI2lmIEVOQUJMRShJTlNQ
RUNUT1IpCiAKIG5hbWVzcGFjZSBUeXBlQnVpbGRlciB7CisKKy8vIFRoaXMgY2xhc3MgcHJvdmlk
ZXMgIlRyYWl0cyIgdHlwZSBmb3IgdGhlIGlucHV0IHR5cGUgVC4gSXQgaXMgcHJvZ3JhbW1lZCB1
c2luZyBDKysgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24KKy8vIHRlY2huaXF1ZS4gQnkgZGVmYXVs
dCBpdCBzaW1wbHkgdGFrZXMgIkl0ZW1UcmFpdHMiIHR5cGUgZnJvbSBULCBidXQgaXQgZG9lc24n
dCB3b3JrIHdpdGggdGhlIGJhc2UgdHlwZXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0
IEFycmF5SXRlbUhlbHBlciB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBUOjpJdGVtVHJhaXRzIFRy
YWl0czsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBBcnJheSA6IHB1YmxpYyBJ
bnNwZWN0b3JBcnJheSB7Citwcml2YXRlOgorICAgIEFycmF5KCkgeyB9CisKK3B1YmxpYzoKKyAg
ICB2b2lkIGFkZEl0ZW0oUGFzc1JlZlB0cjxUPiB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFycmF5
SXRlbUhlbHBlcjxUPjo6VHJhaXRzOjpwdXNoUmVmUHRyKHRoaXMsIHZhbHVlKTsKKyAgICB9CisK
KyAgICB2b2lkIGFkZEl0ZW0oVCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEFycmF5SXRlbUhlbHBl
cjxUPjo6VHJhaXRzOjpwdXNoUmF3KHRoaXMsIHZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxBcnJheTxUPiA+IGNyZWF0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IEFycmF5PFQ+KCkpOworICAgIH0KKworI2lmICIiIiArIFZBTElEQVRPUl9JRkRF
Rl9OQU1FICsgIiIiCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3Rv
clZhbHVlKiB2YWx1ZSk7CisjZW5kaWYgLy8gIiIiICsgVkFMSURBVE9SX0lGREVGX05BTUUgKyAi
IiIKK307CisKK3N0cnVjdCBTdHJ1Y3RJdGVtVHJhaXRzIHsKKyAgICBzdGF0aWMgdm9pZCBwdXNo
UmVmUHRyKEluc3BlY3RvckFycmF5KiBhcnJheSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHZhbHVlKQorICAgIHsKKyAgICAgICAgYXJyYXktPnB1c2hPYmplY3QodmFsdWUpOworICAgIH0K
KworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVj
dFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkgeworICAgICAgICBUOjphc3NlcnRDb3JyZWN0
VmFsdWUodmFsdWUpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBBcnJheUl0ZW1I
ZWxwZXI8U3RyaW5nPiB7CisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIHN0YXRpYyB2b2lk
IHB1c2hSYXcoSW5zcGVjdG9yQXJyYXkqIGFycmF5LCBjb25zdCBTdHJpbmcmIHZhbHVlKQorICAg
ICAgICB7CisgICAgICAgICAgICBhcnJheS0+cHVzaFN0cmluZyh2YWx1ZSk7CisgICAgICAgIH0K
KyAgICB9OworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEFycmF5SXRlbUhlbHBlcjxJbnNwZWN0
b3JPYmplY3Q+IHsKKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAgICAgICAgc3RhdGljIHZvaWQgcHVz
aFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXksIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXJyYXktPnB1c2hPYmplY3QodmFsdWUp
OworICAgICAgICB9CisgICAgfTsKK307CisKKwogJHtmb3J3YXJkc30KIAogU3RyaW5nIGdldEVu
dW1Db25zdGFudFZhbHVlKGludCBjb2RlKTsKQEAgLTIxMjUsNyArMjE5NCwyMCBAQCBTdHJpbmcg
Z2V0RW51bUNvbnN0YW50VmFsdWUoaW50IGNvZGUpIHsKIH0gLy8gbmFtZXNwYWNlIFR5cGVCdWls
ZGVyCiAKICNpZiAiIiIgKyBWQUxJREFUT1JfSUZERUZfTkFNRSArICIiIgorCit0ZW1wbGF0ZTx0
eXBlbmFtZSBUPgordm9pZCBUeXBlQnVpbGRlcjo6QXJyYXk8VD46OmFzc2VydENvcnJlY3RWYWx1
ZShJbnNwZWN0b3JWYWx1ZSogdmFsdWUpCit7CisgICAgUmVmUHRyPEluc3BlY3RvckFycmF5PiBh
cnJheTsKKyAgICBib29sIGNhc3RSZXMgPSB2YWx1ZS0+YXNBcnJheSgmYXJyYXkpOworICAgIEFT
U0VSVF9VTlVTRUQoY2FzdFJlcywgY2FzdFJlcyk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGFycmF5LT5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIEFycmF5SXRlbUhlbHBlcjxUPjo6
VHJhaXRzOjp0ZW1wbGF0ZSBhc3NlcnRDb3JyZWN0VmFsdWU8VD4oYXJyYXktPmdldChpKS5nZXQo
KSk7CisgICAgfQorfQorCiAkdmFsaWRhdG9yQ29kZQorCiAjZW5kaWYgLy8gIiIiICsgVkFMSURB
VE9SX0lGREVGX05BTUUgKyAiIiIKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>
<flag name="review"
          id="125921"
          type_id="1"
          status="+"
          setter="vsevik"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>124615</attachid>
            <date>2012-01-30 15:43:06 -0800</date>
            <delta_ts>2012-01-30 15:43:06 -0800</delta_ts>
            <desc>New InspectorFrontend.h</desc>
            <filename>InspectorFrontend.h</filename>
            <type>text/plain</type>
            <size>166711</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgojaWZuZGVmIEluc3BlY3RvckZyb250ZW5kX2gKI2RlZmluZSBJbnNw
ZWN0b3JGcm9udGVuZF9oCgojaW5jbHVkZSAiSW5zcGVjdG9yVHlwZUJ1aWxkZXIuaCIKI2luY2x1
ZGUgIkluc3BlY3RvclZhbHVlcy5oIgojaW5jbHVkZSA8UGxhdGZvcm1TdHJpbmcuaD4KI2luY2x1
ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CgpuYW1lc3BhY2UgV2ViQ29yZSB7CgpjbGFzcyBJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWw7CgovLyBCb3RoIEluc3BlY3Rvck9iamVjdCBhbmQgSW5zcGVjdG9y
QXJyYXkgbWF5IG9yIG1heSBub3QgYmUgZGVjbGFyZWQgYXQgdGhpcyBwb2ludCBhcyBkZWZpbmVk
IGJ5IEVOQUJMRURfSU5TUEVDVE9SLgovLyBEb3VibGUtY2hlY2sgd2UgaGF2ZSB0aGVtIGF0IGxl
YXN0IGFzIGZvcndhcmQgZGVjbGFyYXRpb24uCmNsYXNzIEluc3BlY3RvckFycmF5OwpjbGFzcyBJ
bnNwZWN0b3JPYmplY3Q7Cgp0eXBlZGVmIFN0cmluZyBFcnJvclN0cmluZzsKCiNpZiBFTkFCTEUo
SU5TUEVDVE9SKQoKbmFtZXNwYWNlIFR5cGVCdWlsZGVyIHsKCi8vIFRoaXMgY2xhc3MgcHJvdmlk
ZXMgIlRyYWl0cyIgdHlwZSBmb3IgdGhlIGlucHV0IHR5cGUgVC4gSXQgaXMgcHJvZ3JhbW1lZCB1
c2luZyBDKysgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24KLy8gdGVjaG5pcXVlLiBCeSBkZWZhdWx0
IGl0IHNpbXBseSB0YWtlcyAiSXRlbVRyYWl0cyIgdHlwZSBmcm9tIFQsIGJ1dCBpdCBkb2Vzbid0
IHdvcmsgd2l0aCB0aGUgYmFzZSB0eXBlcy4gICAKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0
IEFycmF5SXRlbUhlbHBlciB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIFQ6Okl0ZW1UcmFpdHMgVHJh
aXRzOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgQXJyYXkgOiBwdWJsaWMgSW5zcGVj
dG9yQXJyYXkgewpwcml2YXRlOgogICAgQXJyYXkoKSB7IH0KCnB1YmxpYzoKICAgIHZvaWQgYWRk
SXRlbShQYXNzUmVmUHRyPFQ+IHZhbHVlKQogICAgewogICAgICAgIEFycmF5SXRlbUhlbHBlcjxU
Pjo6VHJhaXRzOjpwdXNoUmVmUHRyKHRoaXMsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIGFkZEl0
ZW0oVCB2YWx1ZSkKICAgIHsKICAgICAgICBBcnJheUl0ZW1IZWxwZXI8VD46OlRyYWl0czo6cHVz
aFJhdyh0aGlzLCB2YWx1ZSk7CiAgICB9CgogICAgc3RhdGljIFBhc3NSZWZQdHI8QXJyYXk8VD4g
PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQXJyYXk8VD4oKSk7
CiAgICB9CgojaWYgIUFTU0VSVF9ESVNBQkxFRAogICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVj
dFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSk7CiNlbmRpZiAvLyAhQVNTRVJUX0RJU0FCTEVE
Cn07CgpzdHJ1Y3QgU3RydWN0SXRlbVRyYWl0cyB7CiAgICBzdGF0aWMgdm9pZCBwdXNoUmVmUHRy
KEluc3BlY3RvckFycmF5KiBhcnJheSwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVl
KQogICAgewogICAgICAgIGFycmF5LT5wdXNoT2JqZWN0KHZhbHVlKTsKICAgIH0KCiAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBUPgogICAgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdFZhbHVlKEluc3Bl
Y3RvclZhbHVlKiB2YWx1ZSkgewogICAgICAgIFQ6OmFzc2VydENvcnJlY3RWYWx1ZSh2YWx1ZSk7
CiAgICB9Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBBcnJheUl0ZW1IZWxwZXI8U3RyaW5nPiB7CiAg
ICBzdHJ1Y3QgVHJhaXRzIHsKICAgICAgICBzdGF0aWMgdm9pZCBwdXNoUmF3KEluc3BlY3RvckFy
cmF5KiBhcnJheSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGFy
cmF5LT5wdXNoU3RyaW5nKHZhbHVlKTsKICAgICAgICB9CiAgICB9Owp9OwoKdGVtcGxhdGU8Pgpz
dHJ1Y3QgQXJyYXlJdGVtSGVscGVyPEluc3BlY3Rvck9iamVjdD4gewogICAgc3RydWN0IFRyYWl0
cyB7CiAgICAgICAgc3RhdGljIHZvaWQgcHVzaFJlZlB0cihJbnNwZWN0b3JBcnJheSogYXJyYXks
IFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IGFycmF5LT5wdXNoT2JqZWN0KHZhbHVlKTsKICAgICAgICB9CiAgICB9Owp9OwoKCi8vIEZvcndh
cmQgZGVjbGFyYXRpb25zLgpuYW1lc3BhY2UgQ29uc29sZSB7CmNsYXNzIENhbGxGcmFtZTsKfSAv
LyBDb25zb2xlCgojaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCm5hbWVzcGFjZSBJbmRleGVk
REIgewpjbGFzcyBPYmplY3RTdG9yZTsKY2xhc3MgT2JqZWN0U3RvcmVJbmRleDsKfSAvLyBJbmRl
eGVkREIKCiNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKbmFtZXNwYWNlIENTUyB7
CmNsYXNzIENTU1J1bGU7CmNsYXNzIFNvdXJjZVJhbmdlOwpjbGFzcyBDU1NTdHlsZTsKY2xhc3Mg
Q1NTUHJvcGVydHk7CmNsYXNzIENTU01lZGlhOwp9IC8vIENTUwoKI2lmIEVOQUJMRShKQVZBU0NS
SVBUX0RFQlVHR0VSKQpuYW1lc3BhY2UgRGVidWdnZXIgewpjbGFzcyBMb2NhdGlvbjsKY2xhc3Mg
U2NvcGU7Cn0gLy8gRGVidWdnZXIKCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dF
UikKLy8gRW5kIG9mIGZvcndhcmQgZGVjbGFyYXRpb25zLgoKLy8gVHlwZWRlZnMuCm5hbWVzcGFj
ZSBQYWdlIHsKLyogVW5pcXVlIHNjcmlwdCBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBT
Y3JpcHRJZGVudGlmaWVyOwoKfSAvLyBQYWdlCgpuYW1lc3BhY2UgUnVudGltZSB7Ci8qIFVuaXF1
ZSBvYmplY3QgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgUmVtb3RlT2JqZWN0SWQ7Cgp9
IC8vIFJ1bnRpbWUKCm5hbWVzcGFjZSBOZXR3b3JrIHsKLyogVW5pcXVlIGxvYWRlciBpZGVudGlm
aWVyLiAqLwp0eXBlZGVmIFN0cmluZyBMb2FkZXJJZDsKCi8qIFVuaXF1ZSBmcmFtZSBpZGVudGlm
aWVyLiAqLwp0eXBlZGVmIFN0cmluZyBGcmFtZUlkOwoKLyogVW5pcXVlIHJlcXVlc3QgaWRlbnRp
Zmllci4gKi8KdHlwZWRlZiBTdHJpbmcgUmVxdWVzdElkOwoKfSAvLyBOZXR3b3JrCgojaWYgRU5B
QkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCm5hbWVzcGFjZSBEZWJ1Z2dlciB7Ci8qIEJyZWFrcG9p
bnQgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgQnJlYWtwb2ludElkOwoKLyogVW5pcXVl
IHNjcmlwdCBpZGVudGlmaWVyLiAqLwp0eXBlZGVmIFN0cmluZyBTY3JpcHRJZDsKCi8qIENhbGwg
ZnJhbWUgaWRlbnRpZmllci4gKi8KdHlwZWRlZiBTdHJpbmcgQ2FsbEZyYW1lSWQ7Cgp9IC8vIERl
YnVnZ2VyCgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCi8vIEVuZCBvZiB0
eXBlZGVmcy4KCgoKU3RyaW5nIGdldEVudW1Db25zdGFudFZhbHVlKGludCBjb2RlKTsKCm5hbWVz
cGFjZSBNZW1vcnkgewovKiBOdW1iZXIgb2Ygbm9kZXMgd2l0aCBnaXZlbiBuYW1lLiAqLwpjbGFz
cyBOb2RlQ291bnQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7
CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5vZGVOYW1lU2V0ID0gMSA8PCAwLAog
ICAgICAgIENvdW50U2V0ID0gMSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChOb2RlTmFt
ZVNldCB8IENvdW50U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFz
cyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RF
UD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0
X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBC
dWlsZGVyKFBhc3NSZWZQdHI8Tm9kZUNvdW50PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBOb2RlQ291bnQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBOb2RlTmFtZVNldD4mIHNldE5vZGVOYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZU5hbWVTZXQp
LCBwcm9wZXJ0eV9ub2RlTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRTdHJpbmcoIm5vZGVOYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PE5vZGVOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENvdW50
U2V0PiYgc2V0Q291bnQoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIENvdW50U2V0KSwgcHJvcGVydHlfY291bnRfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJjb3VudCIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxDb3VudFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJh
dG9yIFJlZlB0cjxOb2RlQ291bnQ+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxOb2RlQ291bnQ+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Tm9kZUNvdW50PiAo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxOb2RlQ291bnQ+KCp0aGlzKTsK
ICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAg
ICAgKiBSZWZQdHI8Tm9kZUNvdW50PiByZXN1bHQgPSBOb2RlQ291bnQ6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldE5vZGVOYW1lKC4uLikKICAgICAqICAgICAuc2V0Q291bnQoLi4uKTsKICAgICAq
LwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAg
cmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBOb2RlQ291bnQoKSkpOwog
ICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBOdW1i
ZXIgb2YgSlMgZXZlbnQgbGlzdGVuZXJzIGJ5IGV2ZW50IHR5cGUuICovCmNsYXNzIExpc3RlbmVy
Q291bnQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAg
ICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFR5cGVTZXQgPSAxIDw8IDAsCiAgICAgICAgQ291
bnRTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFR5cGVTZXQgfCBDb3VudFNl
dCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAg
ICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAg
ICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVm
UHRyPExpc3RlbmVyQ291bnQ+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3Rh
dGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5k
IGNsYXNzIExpc3RlbmVyQ291bnQ7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IENvdW50U2V0PiYgc2V0Q291bnQoaW50IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENvdW50U2V0KSwgcHJv
cGVydHlfY291bnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVy
KCJjb3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb3VudFNldD4o
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxMaXN0ZW5lckNvdW50PiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8TGlzdGVuZXJDb3VudD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxMaXN0ZW5lckNvdW50PiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuIFJlZlB0cjxMaXN0ZW5lckNvdW50PigqdGhpcyk7CiAgICAgICAgfQogICAg
fTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPExp
c3RlbmVyQ291bnQ+IHJlc3VsdCA9IExpc3RlbmVyQ291bnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAg
LnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXRDb3VudCguLi4pOwogICAgICovCiAgICBzdGF0
aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVp
bGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IExpc3RlbmVyQ291bnQoKSkpOwogICAgfQog
ICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBDaGFyYWN0ZXIg
ZGF0YSBzdGF0aXN0aWNzIGZvciB0aGUgcGFnZS4gKi8KY2xhc3MgU3RyaW5nU3RhdGlzdGljcyA6
IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0Zp
ZWxkc1NldCA9IDAsCiAgICAgICAgRG9tU2V0ID0gMSA8PCAwLAogICAgICAgIEpzU2V0ID0gMSA8
PCAxLAogICAgICAgIFNoYXJlZFNldCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAo
RG9tU2V0IHwgSnNTZXQgfCBTaGFyZWRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFU
RT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxTdHJpbmdTdGF0aXN0aWNzPiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVp
bGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBw
dHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBTdHJpbmdTdGF0aXN0aWNzOwogICAg
cHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRG9tU2V0PiYgc2V0RG9tKGludCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEb21TZXQp
LCBwcm9wZXJ0eV9kb21fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJkb20iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RG9tU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEpzU2V0PiYgc2V0SnMoaW50IHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEpzU2V0
KSwgcHJvcGVydHlfanNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJqcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxKc1NldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaGFyZWRTZXQ+JiBzZXRTaGFyZWQo
aW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFNoYXJlZFNldCksIHByb3BlcnR5X3NoYXJlZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXROdW1iZXIoInNoYXJlZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxTaGFyZWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8
U3RyaW5nU3RhdGlzdGljcz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFN0cmluZ1N0YXRpc3RpY3M+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U3RyaW5nU3Rh
dGlzdGljcz4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8U3RyaW5nU3Rh
dGlzdGljcz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxTdHJpbmdTdGF0aXN0aWNzPiByZXN1bHQgPSBT
dHJpbmdTdGF0aXN0aWNzOjpjcmVhdGUoKQogICAgICogICAgIC5zZXREb20oLi4uKQogICAgICog
ICAgIC5zZXRKcyguLi4pCiAgICAgKiAgICAgLnNldFNoYXJlZCguLi4pOwogICAgICovCiAgICBz
dGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4g
QnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFN0cmluZ1N0YXRpc3RpY3MoKSkpOwog
ICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgpjbGFzcyBE
T01Hcm91cCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAg
ICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU2l6ZVNldCA9IDEgPDwgMCwKICAgICAgICBU
aXRsZVNldCA9IDEgPDwgMSwKICAgICAgICBOb2RlQ291bnRTZXQgPSAxIDw8IDIsCiAgICAgICAg
TGlzdGVuZXJDb3VudFNldCA9IDEgPDwgMywKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU2l6ZVNl
dCB8IFRpdGxlU2V0IHwgTm9kZUNvdW50U2V0IHwgTGlzdGVuZXJDb3VudFNldCkKICAgIH07Cgog
ICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0
ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
Pio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPERPTUdyb3Vw
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0Zp
ZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBET01Hcm91cDsK
ICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNpemVTZXQ+JiBzZXRTaXplKGlu
dCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBT
aXplU2V0KSwgcHJvcGVydHlfc2l6ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoInNpemUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
U2l6ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUaXRsZVNldD4m
IHNldFRpdGxlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVGl0bGVTZXQpLCBwcm9wZXJ0eV90aXRsZV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInRpdGxlIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFRpdGxlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IE5vZGVDb3VudFNldD4mIHNldE5vZGVDb3VudCgvKlBhc3NSZWZQdHI8
VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpNZW1vcnk6Ok5vZGVDb3VudCA+ID4qLyBQ
YXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOb2RlQ291bnRTZXQpLCBwcm9wZXJ0eV9ub2RlQ291bnRf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoIm5vZGVDb3VudCIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlQ291bnRTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGlzdGVuZXJDb3VudFNldD4mIHNldExp
c3RlbmVyQ291bnQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6
TWVtb3J5OjpMaXN0ZW5lckNvdW50ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExpc3Rl
bmVyQ291bnRTZXQpLCBwcm9wZXJ0eV9saXN0ZW5lckNvdW50X2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldEFycmF5KCJsaXN0ZW5lckNvdW50IiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPExpc3RlbmVyQ291bnRTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBSZWZQdHI8RE9NR3JvdXA+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxET01Hcm91cD4q
PigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxET01H
cm91cD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8RE9NR3JvdXA+KCp0
aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0
b3I6CiAgICAgKiBSZWZQdHI8RE9NR3JvdXA+IHJlc3VsdCA9IERPTUdyb3VwOjpjcmVhdGUoKQog
ICAgICogICAgIC5zZXRTaXplKC4uLikKICAgICAqICAgICAuc2V0VGl0bGUoLi4uKQogICAgICog
ICAgIC5zZXROb2RlQ291bnQoLi4uKQogICAgICogICAgIC5zZXRMaXN0ZW5lckNvdW50KC4uLik7
CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewog
ICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRE9NR3JvdXAo
KSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAg
dm9pZCBzZXREb2N1bWVudFVSSShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldFN0cmluZygiZG9jdW1lbnRVUkkiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIE1lbW9y
eQoKbmFtZXNwYWNlIFBhZ2UgewovKiBSZXNvdXJjZSB0eXBlIGFzIGl0IHdhcyBwZXJjZWl2ZWQg
YnkgdGhlIHJlbmRlcmluZyBlbmdpbmUuICovCnN0cnVjdCBSZXNvdXJjZVR5cGUgewogICAgZW51
bSBFbnVtIHsKICAgICAgICBEb2N1bWVudCA9IDAsCiAgICAgICAgU3R5bGVzaGVldCA9IDEsCiAg
ICAgICAgSW1hZ2UgPSAyLAogICAgICAgIEZvbnQgPSAzLAogICAgICAgIFNjcmlwdCA9IDQsCiAg
ICAgICAgWEhSID0gNSwKICAgICAgICBXZWJTb2NrZXQgPSA2LAogICAgICAgIE90aGVyID0gNywK
ICAgIH07Cn07IC8vIHN0cnVjdCBSZXNvdXJjZVR5cGUKCi8qIEluZm9ybWF0aW9uIGFib3V0IHRo
ZSBGcmFtZSBvbiB0aGUgcGFnZS4gKi8KY2xhc3MgRnJhbWUgOiBwdWJsaWMgSW5zcGVjdG9yT2Jq
ZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAg
IElkU2V0ID0gMSA8PCAwLAogICAgICAgIExvYWRlcklkU2V0ID0gMSA8PCAxLAogICAgICAgIFVy
bFNldCA9IDEgPDwgMiwKICAgICAgICBNaW1lVHlwZVNldCA9IDEgPDwgMywKICAgICAgICBBbGxG
aWVsZHNTZXQgPSAoSWRTZXQgfCBMb2FkZXJJZFNldCB8IFVybFNldCB8IE1pbWVUeXBlU2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
RnJhbWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAg
ICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEZyYW1l
OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSWRTZXQ+JiBzZXRJZChjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIElkU2V0KSwgcHJvcGVydHlfaWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMb2FkZXJJZFNl
dD4mIHNldExvYWRlcklkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkxvYWRlcklkJiov
IGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgTG9hZGVySWRTZXQpLCBwcm9wZXJ0eV9sb2FkZXJJZF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImxvYWRlcklkIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExvYWRlcklkU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFVybFNldD4mIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVybFNldCksIHBy
b3BlcnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmco
InVybCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVcmxTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWltZVR5cGVTZXQ+JiBzZXRNaW1lVHlw
ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIE1pbWVUeXBlU2V0KSwgcHJvcGVydHlfbWltZVR5cGVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJtaW1lVHlwZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNaW1lVHlwZVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIG9wZXJhdG9yIFJlZlB0cjxGcmFtZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEZyYW1lPio+KCZtX3Jl
c3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPEZyYW1lPiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxGcmFtZT4oKnRoaXMpOwogICAgICAg
IH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJl
ZlB0cjxGcmFtZT4gcmVzdWx0ID0gRnJhbWU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldElkKC4u
LikKICAgICAqICAgICAuc2V0TG9hZGVySWQoLi4uKQogICAgICogICAgIC5zZXRVcmwoLi4uKQog
ICAgICogICAgIC5zZXRNaW1lVHlwZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxO
b0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxk
c1NldD4oYWRvcHRSZWYobmV3IEZyYW1lKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRl
bVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0UGFyZW50SWQoY29uc3QgU3RyaW5nJiB2
YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInBhcmVudElkIiwgdmFsdWUpOwog
ICAgfQoKICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNlY3Vy
aXR5T3JpZ2luKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3Ry
aW5nKCJzZWN1cml0eU9yaWdpbiIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIEluZm9ybWF0aW9uIGFi
b3V0IHRoZSBGcmFtZSBoaWVyYXJjaHkgYWxvbmcgd2l0aCB0aGVpciBjYWNoZWQgcmVzb3VyY2Vz
LiAqLwpjbGFzcyBGcmFtZVJlc291cmNlVHJlZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qgewpw
dWJsaWM6CiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdyZXNvdXJjZXMnIHdoaWxl
IGdlbmVyYXRpbmcgRnJhbWVSZXNvdXJjZVRyZWUuCiAgICBjbGFzcyBSZXNvdXJjZXMgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKICAgIHB1YmxpYzoKICAgICAgICBlbnVtIHsKICAgICAgICAg
ICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgICAgICBVcmxTZXQgPSAxIDw8IDAsCiAgICAgICAg
ICAgIFR5cGVTZXQgPSAxIDw8IDEsCiAgICAgICAgICAgIE1pbWVUeXBlU2V0ID0gMSA8PCAyLAog
ICAgICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVXJsU2V0IHwgVHlwZVNldCB8IE1pbWVUeXBlU2V0
KQogICAgICAgIH07CgogICAgICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgICAgICBjbGFzcyBC
dWlsZGVyIHsKICAgICAgICBwcml2YXRlOgogICAgICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNU
QVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICAgICAgfQoKICAgICAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFJlc291cmNlcz4gcHRy
KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBO
b0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAg
ICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyaWVuZCBj
bGFzcyBSZXNvdXJjZXM7CiAgICAgICAgcHVibGljOgogICAgCiAgICAgICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICAgICAg
ewogICAgICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVybFNldCksIHByb3Bl
cnR5X3VybF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5n
KCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4o
KTsKICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0
PiYgc2V0VHlwZShUeXBlQnVpbGRlcjo6UGFnZTo6UmVzb3VyY2VUeXBlOjpFbnVtIHZhbHVlKQog
ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlw
ZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygidHlwZSIsIGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAg
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgICAgIH0KICAg
IAogICAgICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAgICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgICAgIH0KICAgIAogICAgICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgTWltZVR5cGVTZXQ+JiBzZXRNaW1lVHlwZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgTWltZVR5cGVTZXQpLCBwcm9wZXJ0eV9taW1lVHlwZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJtaW1lVHlwZSIsIHZhbHVlKTsKICAg
ICAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWltZVR5cGVTZXQ+KCk7CiAgICAgICAgICAg
IH0KICAgIAogICAgICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmVzb3VyY2VzPiYgKCkKICAgICAg
ICAgICAgewogICAgICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRz
U2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgICAgIHJldHVybiAqcmVpbnRl
cnByZXRfY2FzdDxSZWZQdHI8UmVzb3VyY2VzPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgICAgIH0K
CiAgICAgICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmVzb3VyY2VzPiAoKQogICAgICAgICAg
ICB7CiAgICAgICAgICAgICAgICByZXR1cm4gUmVmUHRyPFJlc291cmNlcz4oKnRoaXMpOwogICAg
ICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLyoKICAgICAgICAgKiBTeW50aGV0aWMgY29u
c3RydWN0b3I6CiAgICAgICAgICogUmVmUHRyPFJlc291cmNlcz4gcmVzdWx0ID0gUmVzb3VyY2Vz
OjpjcmVhdGUoKQogICAgICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAgICAgKiAgICAgLnNl
dFR5cGUoLi4uKQogICAgICAgICAqICAgICAuc2V0TWltZVR5cGUoLi4uKTsKICAgICAgICAgKi8K
ICAgICAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgUmVzb3Vy
Y2VzKCkpKTsKICAgICAgICB9CiAgICAgICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1U
cmFpdHM7CiAgICB9OwoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAg
ICBGcmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBSZXNvdXJjZXNTZXQgPSAxIDw8IDEsCiAgICAg
ICAgQWxsRmllbGRzU2V0ID0gKEZyYW1lU2V0IHwgUmVzb3VyY2VzU2V0KQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8RnJhbWVSZXNvdXJj
ZVRyZWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09
IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAg
ICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIEZyYW1l
UmVzb3VyY2VUcmVlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRnJhbWVT
ZXQ+JiBzZXRGcmFtZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlBhZ2U6OkZyYW1lPiovIFBh
c3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBGcmFtZVNldCksIHByb3BlcnR5X2ZyYW1lX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgiZnJhbWUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnJhbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgUmVzb3VyY2VzU2V0PiYgc2V0UmVzb3VyY2VzKC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6QXJyYXk8UmVzb3VyY2VzID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9y
QXJyYXk+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFJlc291cmNlc1NldCksIHByb3BlcnR5X3Jlc291cmNlc19hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgicmVzb3VyY2VzIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFJlc291cmNlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4mICgpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEZyYW1lUmVz
b3VyY2VUcmVlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNz
UmVmUHRyPEZyYW1lUmVzb3VyY2VUcmVlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
IFJlZlB0cjxGcmFtZVJlc291cmNlVHJlZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAg
LyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxGcmFtZVJlc291
cmNlVHJlZT4gcmVzdWx0ID0gRnJhbWVSZXNvdXJjZVRyZWU6OmNyZWF0ZSgpCiAgICAgKiAgICAg
LnNldEZyYW1lKC4uLikKICAgICAqICAgICAuc2V0UmVzb3VyY2VzKC4uLik7CiAgICAgKi8KICAg
IHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVy
biBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgRnJhbWVSZXNvdXJjZVRyZWUoKSkp
OwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9p
ZCBzZXRDaGlsZEZyYW1lcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWls
ZGVyOjpQYWdlOjpGcmFtZVJlc291cmNlVHJlZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFy
cmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgiY2hpbGRGcmFtZXMiLCB2
YWx1ZSk7CiAgICB9Cn07CgovKiBTZWFyY2ggbWF0Y2ggZm9yIHJlc291cmNlLiAqLwpjbGFzcyBT
ZWFyY2hNYXRjaCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTGluZU51bWJlclNldCA9IDEgPDwgMCwK
ICAgICAgICBMaW5lQ29udGVudFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAo
TGluZU51bWJlclNldCB8IExpbmVDb250ZW50U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQg
U1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWls
ZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2VhcmNoTWF0Y2g+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNlYXJjaE1hdGNoOwogICAgcHVibGlj
OgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51bWJlclNldD4mIHNldExpbmVOdW1iZXIo
ZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIExpbmVOdW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5lTnVtYmVyX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibGluZU51bWJlciIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVyU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IExpbmVDb250ZW50U2V0PiYgc2V0TGluZUNvbnRlbnQoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBMaW5lQ29udGVudFNldCksIHByb3BlcnR5X2xpbmVDb250ZW50X2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibGluZUNvbnRlbnQiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TGluZUNvbnRlbnRTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBSZWZQdHI8U2VhcmNoTWF0Y2g+JiAoKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90
X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxTZWFy
Y2hNYXRjaD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxTZWFyY2hNYXRjaD4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
U2VhcmNoTWF0Y2g+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50
aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2VhcmNoTWF0Y2g+IHJlc3VsdCA9IFNl
YXJjaE1hdGNoOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRMaW5lTnVtYmVyKC4uLikKICAgICAq
ICAgICAuc2V0TGluZUNvbnRlbnQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+KGFkb3B0UmVmKG5ldyBTZWFyY2hNYXRjaCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVj
dEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIFNlYXJjaCByZXN1bHQgZm9yIHJlc291cmNl
LiAqLwpjbGFzcyBTZWFyY2hSZXN1bHQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGlj
OgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIFVybFNldCA9IDEg
PDwgMCwKICAgICAgICBGcmFtZUlkU2V0ID0gMSA8PCAxLAogICAgICAgIE1hdGNoZXNDb3VudFNl
dCA9IDEgPDwgMiwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVXJsU2V0IHwgRnJhbWVJZFNldCB8
IE1hdGNoZXNDb3VudFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xh
c3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNU
RVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcihQYXNzUmVmUHRyPFNlYXJjaFJlc3VsdD4gcHRyKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9p
bl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0K
ICAgICAgICBmcmllbmQgY2xhc3MgU2VhcmNoUmVzdWx0OwogICAgcHVibGljOgoKICAgICAgICBC
dWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVy
dHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJs
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGcmFtZUlkU2V0PiYgc2V0RnJhbWVJZCgvKmNv
bnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlkJiovIGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRnJhbWVJZFNl
dCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PEZyYW1lSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWF0Y2hl
c0NvdW50U2V0PiYgc2V0TWF0Y2hlc0NvdW50KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYXRjaGVzQ291bnRTZXQpLCBwcm9wZXJ0
eV9tYXRjaGVzQ291bnRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVt
YmVyKCJtYXRjaGVzQ291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
TWF0Y2hlc0NvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNl
YXJjaFJlc3VsdD4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNlYXJjaFJlc3VsdD4qPigmbV9yZXN1bHQpOwog
ICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTZWFyY2hSZXN1bHQ+ICgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNlYXJjaFJlc3VsdD4oKnRoaXMpOwog
ICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAg
ICAqIFJlZlB0cjxTZWFyY2hSZXN1bHQ+IHJlc3VsdCA9IFNlYXJjaFJlc3VsdDo6Y3JlYXRlKCkK
ICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0RnJhbWVJZCguLi4pCiAgICAg
KiAgICAgLnNldE1hdGNoZXNDb3VudCguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxO
b0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxk
c1NldD4oYWRvcHRSZWYobmV3IFNlYXJjaFJlc3VsdCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0
cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIENvb2tpZSBvYmplY3QgKi8KY2xhc3Mg
Q29va2llIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAg
ICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFZh
bHVlU2V0ID0gMSA8PCAxLAogICAgICAgIERvbWFpblNldCA9IDEgPDwgMiwKICAgICAgICBQYXRo
U2V0ID0gMSA8PCAzLAogICAgICAgIEV4cGlyZXNTZXQgPSAxIDw8IDQsCiAgICAgICAgU2l6ZVNl
dCA9IDEgPDwgNSwKICAgICAgICBIdHRwT25seVNldCA9IDEgPDwgNiwKICAgICAgICBTZWN1cmVT
ZXQgPSAxIDw8IDcsCiAgICAgICAgU2Vzc2lvblNldCA9IDEgPDwgOCwKICAgICAgICBBbGxGaWVs
ZHNTZXQgPSAoTmFtZVNldCB8IFZhbHVlU2V0IHwgRG9tYWluU2V0IHwgUGF0aFNldCB8IEV4cGly
ZXNTZXQgfCBTaXplU2V0IHwgSHR0cE9ubHlTZXQgfCBTZWN1cmVTZXQgfCBTZXNzaW9uU2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
Q29va2llPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDb29r
aWU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFt
ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFZhbHVlU2V0PiYgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWYWx1ZVNldCksIHByb3BlcnR5X3Zh
bHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidmFsdWUi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmFsdWVTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRG9tYWluU2V0PiYgc2V0RG9tYWluKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgRG9tYWluU2V0KSwgcHJvcGVydHlfZG9tYWluX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygiZG9tYWluIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPERvbWFpblNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBQYXRoU2V0PiYgc2V0UGF0aChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFBhdGhTZXQpLCBwcm9wZXJ0eV9wYXRo
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygicGF0aCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxQYXRoU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEV4cGlyZXNTZXQ+JiBzZXRFeHBpcmVzKGludCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBFeHBpcmVz
U2V0KSwgcHJvcGVydHlfZXhwaXJlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoImV4cGlyZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8RXhwaXJlc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaXpl
U2V0PiYgc2V0U2l6ZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgU2l6ZVNldCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFNpemVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgSHR0cE9ubHlTZXQ+JiBzZXRIdHRwT25seShib29sIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEh0dHBPbmx5U2V0KSwgcHJvcGVydHlf
aHR0cE9ubHlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigi
aHR0cE9ubHkiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SHR0cE9ubHlT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2VjdXJlU2V0PiYgc2V0
U2VjdXJlKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgU2VjdXJlU2V0KSwgcHJvcGVydHlfc2VjdXJlX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oInNlY3VyZSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxTZWN1cmVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgU2Vzc2lvblNldD4mIHNldFNlc3Npb24oYm9vbCB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTZXNzaW9uU2V0KSwgcHJvcGVydHlf
c2Vzc2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJz
ZXNzaW9uIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNlc3Npb25TZXQ+
KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q29va2llPiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8Q29va2llPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQ
YXNzUmVmUHRyPENvb2tpZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8
Q29va2llPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENvb2tpZT4gcmVzdWx0ID0gQ29va2llOjpjcmVh
dGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFsdWUoLi4uKQog
ICAgICogICAgIC5zZXREb21haW4oLi4uKQogICAgICogICAgIC5zZXRQYXRoKC4uLikKICAgICAq
ICAgICAuc2V0RXhwaXJlcyguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAg
IC5zZXRIdHRwT25seSguLi4pCiAgICAgKiAgICAgLnNldFNlY3VyZSguLi4pCiAgICAgKiAgICAg
LnNldFNlc3Npb24oLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0
UmVmKG5ldyBDb29raWUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0
ZW1UcmFpdHM7Cn07Cgp9IC8vIFBhZ2UKCm5hbWVzcGFjZSBSdW50aW1lIHsKLyogTWlycm9yIG9i
amVjdCByZWZlcmVuY2luZyBvcmlnaW5hbCBKYXZhU2NyaXB0IG9iamVjdC4gKi8KY2xhc3MgUmVt
b3RlT2JqZWN0IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVk
IGFmdGVyIHByb3BlcnR5IG5hbWUgJ3R5cGUnIHdoaWxlIGdlbmVyYXRpbmcgUmVtb3RlT2JqZWN0
LgogICAgc3RydWN0IFR5cGUgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIE9iamVj
dCA9IDgsCiAgICAgICAgICAgIEZ1bmN0aW9uID0gOSwKICAgICAgICAgICAgVW5kZWZpbmVkID0g
MTAsCiAgICAgICAgICAgIFN0cmluZyA9IDExLAogICAgICAgICAgICBOdW1iZXIgPSAxMiwKICAg
ICAgICAgICAgQm9vbGVhbiA9IDEzLAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgVHlwZQoK
ICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5hbWUgJ3N1YnR5cGUnIHdoaWxlIGdlbmVyYXRp
bmcgUmVtb3RlT2JqZWN0LgogICAgc3RydWN0IFN1YnR5cGUgewogICAgICAgIGVudW0gRW51bSB7
CiAgICAgICAgICAgIEFycmF5ID0gMTQsCiAgICAgICAgICAgIE51bGwgPSAxNSwKICAgICAgICAg
ICAgTm9kZSA9IDE2LAogICAgICAgICAgICBSZWdleHAgPSAxNywKICAgICAgICAgICAgRGF0ZSA9
IDE4LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgU3VidHlwZQoKICAgIGVudW0gewogICAg
ICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAwLAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChUeXBlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAg
ICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9i
amVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRF
IHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8UmVtb3RlT2JqZWN0PiBwdHIpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVh
dGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAg
ICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBSZW1vdGVPYmplY3Q7CiAgICBwdWJsaWM6CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShUeXBlOjpFbnVtIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBw
cm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmlu
ZygidHlwZSIsIGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPFJlbW90ZU9iamVjdD4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJlbW90
ZU9iamVjdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxSZW1vdGVPYmplY3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRy
PFJlbW90ZU9iamVjdD4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxSZW1vdGVPYmplY3Q+IHJlc3VsdCA9
IFJlbW90ZU9iamVjdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VHlwZSguLi4pOwogICAgICov
CiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICBy
ZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFJlbW90ZU9iamVjdCgpKSk7
CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lk
IHNldFN1YnR5cGUoU3VidHlwZTo6RW51bSB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRT
dHJpbmcoInN1YnR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgfQoKICAg
IHZvaWQgc2V0U3VidHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMt
PnNldFN0cmluZygic3VidHlwZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldENsYXNzTmFt
ZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygiY2xh
c3NOYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0VmFsdWUoUGFzc1JlZlB0cjxJbnNw
ZWN0b3JWYWx1ZT4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0VmFsdWUoInZhbHVlIiwg
dmFsdWUpOwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAg
dm9pZCBzZXREZXNjcmlwdGlvbihjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldFN0cmluZygiZGVzY3JpcHRpb24iLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRP
YmplY3RJZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3RJZCYqLyBj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygib2JqZWN0
SWQiLCB2YWx1ZSk7CiAgICB9Cn07CgovKiBPYmplY3QgcHJvcGVydHkgZGVzY3JpcHRvci4gKi8K
Y2xhc3MgUHJvcGVydHlEZXNjcmlwdG9yIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1Ymxp
YzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBOYW1lU2V0ID0g
MSA8PCAwLAogICAgICAgIFdyaXRhYmxlU2V0ID0gMSA8PCAxLAogICAgICAgIENvbmZpZ3VyYWJs
ZVNldCA9IDEgPDwgMiwKICAgICAgICBFbnVtZXJhYmxlU2V0ID0gMSA8PCAzLAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChOYW1lU2V0IHwgV3JpdGFibGVTZXQgfCBDb25maWd1cmFibGVTZXQgfCBF
bnVtZXJhYmxlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBC
dWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9y
ZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4m
IGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyKFBhc3NSZWZQdHI8UHJvcGVydHlEZXNjcmlwdG9yPiBwdHIpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVk
X2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAg
fQogICAgICAgIGZyaWVuZCBjbGFzcyBQcm9wZXJ0eURlc2NyaXB0b3I7CiAgICBwdWJsaWM6Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5hbWVT
ZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOYW1l
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFdyaXRhYmxlU2V0PiYg
c2V0V3JpdGFibGUoYm9vbCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBXcml0YWJsZVNldCksIHByb3BlcnR5X3dyaXRhYmxlX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oIndyaXRhYmxlIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFdyaXRhYmxlU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IENvbmZpZ3VyYWJsZVNldD4mIHNldENvbmZpZ3VyYWJsZShi
b29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IENvbmZpZ3VyYWJsZVNldCksIHByb3BlcnR5X2NvbmZpZ3VyYWJsZV9hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJjb25maWd1cmFibGUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29uZmlndXJhYmxlU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEVudW1lcmFibGVTZXQ+JiBzZXRFbnVtZXJhYmxlKGJv
b2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYg
RW51bWVyYWJsZVNldCksIHByb3BlcnR5X2VudW1lcmFibGVfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiZW51bWVyYWJsZSIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxFbnVtZXJhYmxlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4mICgpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3Rf
cmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFByb3Bl
cnR5RGVzY3JpcHRvcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3Ig
UGFzc1JlZlB0cjxQcm9wZXJ0eURlc2NyaXB0b3I+ICgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gUmVmUHRyPFByb3BlcnR5RGVzY3JpcHRvcj4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxQcm9w
ZXJ0eURlc2NyaXB0b3I+IHJlc3VsdCA9IFByb3BlcnR5RGVzY3JpcHRvcjo6Y3JlYXRlKCkKICAg
ICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFdyaXRhYmxlKC4uLikKICAgICAq
ICAgICAuc2V0Q29uZmlndXJhYmxlKC4uLikKICAgICAqICAgICAuc2V0RW51bWVyYWJsZSguLi4p
OwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsK
ICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFByb3BlcnR5
RGVzY3JpcHRvcigpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKCiAgICB2b2lkIHNldFZhbHVlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6UnVudGlt
ZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInZhbHVlIiwgdmFsdWUpOwogICAgfQogICAgdXNp
bmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBzZXRHZXQoLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiZ2V0Iiwg
dmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U2V0KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInNldCIsIHZhbHVlKTsKICAgIH0KCiAg
ICB2b2lkIHNldFdhc1Rocm93bihib29sIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldEJv
b2xlYW4oIndhc1Rocm93biIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIFJlcHJlc2VudHMgZnVuY3Rp
b24gY2FsbCBhcmd1bWVudC4gRWl0aGVyIHJlbW90ZSBvYmplY3QgaWQgPGNvZGU+b2JqZWN0SWQ8
L2NvZGU+IG9yIHByaW1pdGl2ZSA8Y29kZT52YWx1ZTwvY29kZT4gb3IgbmVpdGhlciBvZiAoZm9y
IHVuZGVmaW5lZCkgdGhlbSBzaG91bGQgYmUgc3BlY2lmaWVkLiAqLwpjbGFzcyBDYWxsQXJndW1l
bnQgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAg
Tm9GaWVsZHNTZXQgPSAwLAogICAgICAgIEFsbEZpZWxkc1NldCA9IDAKICAgIH07CgogICAgdGVt
cGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQg
U1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRo
aXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENhbGxBcmd1bWVudD4g
cHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVs
ZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ2FsbEFyZ3VtZW50
OwogICAgcHVibGljOgoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q2FsbEFyZ3VtZW50PiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q2FsbEFyZ3VtZW50Pio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAg
ICBvcGVyYXRvciBQYXNzUmVmUHRyPENhbGxBcmd1bWVudD4gKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiBSZWZQdHI8Q2FsbEFyZ3VtZW50PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsK
CiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENhbGxB
cmd1bWVudD4gcmVzdWx0ID0gQ2FsbEFyZ3VtZW50OjpjcmVhdGUoKTsKICAgICAqLwogICAgc3Rh
dGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1
aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDYWxsQXJndW1lbnQoKSkpOwogICAgfQog
ICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRWYWx1
ZShQYXNzUmVmUHRyPEluc3BlY3RvclZhbHVlPiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRWYWx1ZSgidmFsdWUiLCB2YWx1ZSk7CiAgICB9CiAgICB1c2luZyBJbnNwZWN0b3JPYmplY3Q6
OnNldFZhbHVlOwoKCiAgICB2b2lkIHNldE9iamVjdElkKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRl
cjo6UnVudGltZTo6UmVtb3RlT2JqZWN0PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2
YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoIm9iamVjdElkIiwgdmFsdWUpOwog
ICAgfQp9OwoKfSAvLyBSdW50aW1lCgpuYW1lc3BhY2UgQ29uc29sZSB7Ci8qIENvbnNvbGUgbWVz
c2FnZS4gKi8KY2xhc3MgQ29uc29sZU1lc3NhZ2UgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnc291cmNlJyB3aGlsZSBn
ZW5lcmF0aW5nIENvbnNvbGVNZXNzYWdlLgogICAgc3RydWN0IFNvdXJjZSB7CiAgICAgICAgZW51
bSBFbnVtIHsKICAgICAgICAgICAgSHRtbCA9IDE5LAogICAgICAgICAgICBXbWwgPSAyMCwKICAg
ICAgICAgICAgWG1sID0gMjEsCiAgICAgICAgICAgIEphdmFzY3JpcHQgPSAyMiwKICAgICAgICAg
ICAgTmV0d29yayA9IDIzLAogICAgICAgICAgICBDb25zb2xlX2FwaSA9IDI0LAogICAgICAgICAg
ICBPdGhlciA9IDI1LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgU291cmNlCgogICAgLy8g
TmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAnbGV2ZWwnIHdoaWxlIGdlbmVyYXRpbmcgQ29uc29s
ZU1lc3NhZ2UuCiAgICBzdHJ1Y3QgTGV2ZWwgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAg
ICAgIFRpcCA9IDI2LAogICAgICAgICAgICBMb2cgPSAyNywKICAgICAgICAgICAgV2FybmluZyA9
IDI4LAogICAgICAgICAgICBFcnJvciA9IDI5LAogICAgICAgICAgICBEZWJ1ZyA9IDMwLAogICAg
ICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgTGV2ZWwKCiAgICAvLyBOYW1lZCBhZnRlciBwcm9wZXJ0
eSBuYW1lICd0eXBlJyB3aGlsZSBnZW5lcmF0aW5nIENvbnNvbGVNZXNzYWdlLgogICAgc3RydWN0
IFR5cGUgewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIExvZyA9IDI3LAogICAgICAg
ICAgICBEaXIgPSAzMSwKICAgICAgICAgICAgRGlyeG1sID0gMzIsCiAgICAgICAgICAgIFRyYWNl
ID0gMzMsCiAgICAgICAgICAgIFN0YXJ0R3JvdXAgPSAzNCwKICAgICAgICAgICAgU3RhcnRHcm91
cENvbGxhcHNlZCA9IDM1LAogICAgICAgICAgICBFbmRHcm91cCA9IDM2LAogICAgICAgICAgICBB
c3NlcnQgPSAzNywKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IFR5cGUKCiAgICBlbnVtIHsK
ICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU291cmNlU2V0ID0gMSA8PCAwLAogICAg
ICAgIExldmVsU2V0ID0gMSA8PCAxLAogICAgICAgIFRleHRTZXQgPSAxIDw8IDIsCiAgICAgICAg
QWxsRmllbGRzU2V0ID0gKFNvdXJjZVNldCB8IExldmVsU2V0IHwgVGV4dFNldCkKICAgIH07Cgog
ICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgog
ICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0
ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
Pio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENvbnNvbGVN
ZXNzYWdlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9
PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAg
ICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDb25z
b2xlTWVzc2FnZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZVNl
dD4mIHNldFNvdXJjZShTb3VyY2U6OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgZ2V0RW51
bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3Vy
Y2VTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU291cmNlU2V0PiYg
c2V0U291cmNlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNvdXJjZVNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBMZXZlbFNldD4mIHNldExldmVsKExldmVsOjpFbnVtIHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExldmVsU2V0
KSwgcHJvcGVydHlfbGV2ZWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJsZXZlbCIsIGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8TGV2ZWxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgTGV2ZWxTZXQ+JiBzZXRMZXZlbChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExldmVsU2V0KSwgcHJvcGVy
dHlfbGV2ZWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJs
ZXZlbCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMZXZlbFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUZXh0U2V0PiYgc2V0VGV4dChjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFRleHRTZXQpLCBwcm9wZXJ0eV90ZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygidGV4dCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENv
bnNvbGVNZXNzYWdlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNU
QVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q29uc29sZU1lc3NhZ2U+Kj4oJm1fcmVzdWx0
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q29uc29sZU1lc3NhZ2U+
ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENvbnNvbGVNZXNzYWdlPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPENvbnNvbGVNZXNzYWdlPiByZXN1bHQgPSBDb25zb2xlTWVzc2Fn
ZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U291cmNlKC4uLikKICAgICAqICAgICAuc2V0TGV2
ZWwoLi4uKQogICAgICogICAgIC5zZXRUZXh0KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ29uc29sZU1lc3NhZ2UoKSkpOwogICAgfQogICAgdHlw
ZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRUeXBlKFR5cGU6
OkVudW0gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0eXBlIiwgZ2V0RW51
bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgIH0KCiAgICB2b2lkIHNldFR5cGUoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7
CiAgICB9CgogICAgdm9pZCBzZXRVcmwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRTdHJpbmcoInVybCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldExpbmUo
aW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51bWJlcigibGluZSIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldFJlcGVhdENvdW50KGludCB2YWx1ZSkKICAgIHsKICAgICAgICB0
aGlzLT5zZXROdW1iZXIoInJlcGVhdENvdW50IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0
UGFyYW1ldGVycygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpS
dW50aW1lOjpSZW1vdGVPYmplY3QgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoInBhcmFtZXRlcnMiLCB2YWx1ZSk7CiAg
ICB9CgogICAgdm9pZCBzZXRTdGFja1RyYWNlKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJy
YXk8VHlwZUJ1aWxkZXI6OkNvbnNvbGU6OkNhbGxGcmFtZSA+ID4qLyBQYXNzUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRBcnJheSgic3RhY2tUcmFj
ZSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldE5ldHdvcmtSZXF1ZXN0SWQoLypjb25zdCBU
eXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJuZXR3b3JrUmVxdWVzdElkIiwgdmFsdWUpOwog
ICAgfQp9OwoKLyogU3RhY2sgZW50cnkgZm9yIGNvbnNvbGUgZXJyb3JzIGFuZCBhc3NlcnRpb25z
LiAqLwpjbGFzcyBDYWxsRnJhbWUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgog
ICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIEZ1bmN0aW9uTmFtZVNl
dCA9IDEgPDwgMCwKICAgICAgICBVcmxTZXQgPSAxIDw8IDEsCiAgICAgICAgTGluZU51bWJlclNl
dCA9IDEgPDwgMiwKICAgICAgICBDb2x1bW5OdW1iZXJTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxs
RmllbGRzU2V0ID0gKEZ1bmN0aW9uTmFtZVNldCB8IFVybFNldCB8IExpbmVOdW1iZXJTZXQgfCBD
b2x1bW5OdW1iZXJTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNz
IEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBt
X3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQ
PiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXIoUGFzc1JlZlB0cjxDYWxsRnJhbWU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIENhbGxGcmFtZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IEZ1bmN0aW9uTmFtZVNldD4mIHNldEZ1bmN0aW9uTmFtZShjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEZ1bmN0
aW9uTmFtZVNldCksIHByb3BlcnR5X2Z1bmN0aW9uTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImZ1bmN0aW9uTmFtZSIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxGdW5jdGlvbk5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJv
cGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
dXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBMaW5lTnVtYmVyU2V0PiYgc2V0TGluZU51
bWJlcihpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgTGluZU51bWJlclNldCksIHByb3BlcnR5X2xpbmVOdW1iZXJfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJsaW5lTnVtYmVyIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPExpbmVOdW1iZXJTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgQ29sdW1uTnVtYmVyU2V0PiYgc2V0Q29sdW1uTnVtYmVyKGlu
dCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBD
b2x1bW5OdW1iZXJTZXQpLCBwcm9wZXJ0eV9jb2x1bW5OdW1iZXJfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJjb2x1bW5OdW1iZXIiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29sdW1uTnVtYmVyU2V0PigpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUmVmUHRyPENhbGxGcmFtZT4mICgpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVh
ZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENhbGxGcmFt
ZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxD
YWxsRnJhbWU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENhbGxGcmFt
ZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDYWxsRnJhbWU+IHJlc3VsdCA9IENhbGxGcmFtZTo6Y3Jl
YXRlKCkKICAgICAqICAgICAuc2V0RnVuY3Rpb25OYW1lKC4uLikKICAgICAqICAgICAuc2V0VXJs
KC4uLikKICAgICAqICAgICAuc2V0TGluZU51bWJlciguLi4pCiAgICAgKiAgICAgLnNldENvbHVt
bk51bWJlciguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3Jl
YXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYo
bmV3IENhbGxGcmFtZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRl
bVRyYWl0czsKfTsKCn0gLy8gQ29uc29sZQoKbmFtZXNwYWNlIE5ldHdvcmsgewovKiBUaW1pbmcg
aW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0LiAqLwpjbGFzcyBSZXNvdXJjZVRpbWluZyA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxk
c1NldCA9IDAsCiAgICAgICAgUmVxdWVzdFRpbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgUHJveHlT
dGFydFNldCA9IDEgPDwgMSwKICAgICAgICBQcm94eUVuZFNldCA9IDEgPDwgMiwKICAgICAgICBE
bnNTdGFydFNldCA9IDEgPDwgMywKICAgICAgICBEbnNFbmRTZXQgPSAxIDw8IDQsCiAgICAgICAg
Q29ubmVjdFN0YXJ0U2V0ID0gMSA8PCA1LAogICAgICAgIENvbm5lY3RFbmRTZXQgPSAxIDw8IDYs
CiAgICAgICAgU3NsU3RhcnRTZXQgPSAxIDw8IDcsCiAgICAgICAgU3NsRW5kU2V0ID0gMSA8PCA4
LAogICAgICAgIFNlbmRTdGFydFNldCA9IDEgPDwgOSwKICAgICAgICBTZW5kRW5kU2V0ID0gMSA8
PCAxMCwKICAgICAgICBSZWNlaXZlSGVhZGVyc0VuZFNldCA9IDEgPDwgMTEsCiAgICAgICAgQWxs
RmllbGRzU2V0ID0gKFJlcXVlc3RUaW1lU2V0IHwgUHJveHlTdGFydFNldCB8IFByb3h5RW5kU2V0
IHwgRG5zU3RhcnRTZXQgfCBEbnNFbmRTZXQgfCBDb25uZWN0U3RhcnRTZXQgfCBDb25uZWN0RW5k
U2V0IHwgU3NsU3RhcnRTZXQgfCBTc2xFbmRTZXQgfCBTZW5kU3RhcnRTZXQgfCBTZW5kRW5kU2V0
IHwgUmVjZWl2ZUhlYWRlcnNFbmRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4K
ICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxSZXNvdXJjZVRpbWluZz4gcHRyKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJf
Y3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwog
ICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgUmVzb3VyY2VUaW1pbmc7CiAgICBwdWJsaWM6
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBSZXF1ZXN0VGltZVNldD4mIHNldFJlcXVlc3RUaW1l
KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBSZXF1ZXN0VGltZVNldCksIHByb3BlcnR5X3JlcXVlc3RUaW1lX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicmVxdWVzdFRpbWUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UmVxdWVzdFRpbWVTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUHJveHlTdGFydFNldD4mIHNldFByb3h5U3RhcnQoZG91
YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFByb3h5U3RhcnRTZXQpLCBwcm9wZXJ0eV9wcm94eVN0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigicHJveHlTdGFydCIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxQcm94eVN0YXJ0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAg
QnVpbGRlcjxTVEFURSB8IFByb3h5RW5kU2V0PiYgc2V0UHJveHlFbmQoZG91YmxlIHZhbHVlKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFByb3h5RW5kU2V0
KSwgcHJvcGVydHlfcHJveHlFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0TnVtYmVyKCJwcm94eUVuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxQcm94eUVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEbnNT
dGFydFNldD4mIHNldERuc1N0YXJ0KGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEbnNTdGFydFNldCksIHByb3BlcnR5X2Ruc1N0YXJ0
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiZG5zU3RhcnQi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RG5zU3RhcnRTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRG5zRW5kU2V0PiYgc2V0RG5zRW5kKGRv
dWJsZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBEbnNFbmRTZXQpLCBwcm9wZXJ0eV9kbnNFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0TnVtYmVyKCJkbnNFbmQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8RG5zRW5kU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IENvbm5lY3RTdGFydFNldD4mIHNldENvbm5lY3RTdGFydChkb3VibGUgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ29ubmVjdFN0YXJ0U2V0KSwg
cHJvcGVydHlfY29ubmVjdFN0YXJ0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQt
PnNldE51bWJlcigiY29ubmVjdFN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPENvbm5lY3RTdGFydFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBDb25uZWN0RW5kU2V0PiYgc2V0Q29ubmVjdEVuZChkb3VibGUgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQ29ubmVjdEVuZFNldCksIHBy
b3BlcnR5X2Nvbm5lY3RFbmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
TnVtYmVyKCJjb25uZWN0RW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PENvbm5lY3RFbmRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3Ns
U3RhcnRTZXQ+JiBzZXRTc2xTdGFydChkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3NsU3RhcnRTZXQpLCBwcm9wZXJ0eV9zc2xTdGFy
dF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInNzbFN0YXJ0
IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFNzbFN0YXJ0U2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNzbEVuZFNldD4mIHNldFNzbEVuZChk
b3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgU3NsRW5kU2V0KSwgcHJvcGVydHlfc3NsRW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldE51bWJlcigic3NsRW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPFNzbEVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBTZW5kU3RhcnRTZXQ+JiBzZXRTZW5kU3RhcnQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNlbmRTdGFydFNldCksIHByb3BlcnR5
X3NlbmRTdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
InNlbmRTdGFydCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTZW5kU3Rh
cnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU2VuZEVuZFNldD4m
IHNldFNlbmRFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIFNlbmRFbmRTZXQpLCBwcm9wZXJ0eV9zZW5kRW5kX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2VuZEVuZCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTZW5kRW5kU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcjxTVEFURSB8IFJlY2VpdmVIZWFkZXJzRW5kU2V0PiYgc2V0UmVjZWl2ZUhlYWRl
cnNFbmQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFJlY2VpdmVIZWFkZXJzRW5kU2V0KSwgcHJvcGVydHlfcmVjZWl2ZUhlYWRlcnNF
bmRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJyZWNlaXZl
SGVhZGVyc0VuZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSZWNlaXZl
SGVhZGVyc0VuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZXNv
dXJjZVRpbWluZz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJlc291cmNlVGltaW5nPio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFJlc291cmNlVGltaW5nPiAo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxSZXNvdXJjZVRpbWluZz4oKnRo
aXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3Rv
cjoKICAgICAqIFJlZlB0cjxSZXNvdXJjZVRpbWluZz4gcmVzdWx0ID0gUmVzb3VyY2VUaW1pbmc6
OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFJlcXVlc3RUaW1lKC4uLikKICAgICAqICAgICAuc2V0
UHJveHlTdGFydCguLi4pCiAgICAgKiAgICAgLnNldFByb3h5RW5kKC4uLikKICAgICAqICAgICAu
c2V0RG5zU3RhcnQoLi4uKQogICAgICogICAgIC5zZXREbnNFbmQoLi4uKQogICAgICogICAgIC5z
ZXRDb25uZWN0U3RhcnQoLi4uKQogICAgICogICAgIC5zZXRDb25uZWN0RW5kKC4uLikKICAgICAq
ICAgICAuc2V0U3NsU3RhcnQoLi4uKQogICAgICogICAgIC5zZXRTc2xFbmQoLi4uKQogICAgICog
ICAgIC5zZXRTZW5kU3RhcnQoLi4uKQogICAgICogICAgIC5zZXRTZW5kRW5kKC4uLikKICAgICAq
ICAgICAuc2V0UmVjZWl2ZUhlYWRlcnNFbmQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBSZXNvdXJjZVRpbWluZygpKSk7CiAgICB9CiAgICB0eXBl
ZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIEhUVFAgcmVxdWVzdCBkYXRh
LiAqLwpjbGFzcyBSZXF1ZXN0IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAg
IGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBVcmxTZXQgPSAxIDw8IDAs
CiAgICAgICAgTWV0aG9kU2V0ID0gMSA8PCAxLAogICAgICAgIEhlYWRlcnNTZXQgPSAxIDw8IDIs
CiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFVybFNldCB8IE1ldGhvZFNldCB8IEhlYWRlcnNTZXQp
CiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAg
cHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAg
ICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNU
QVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0
cjxSZXF1ZXN0PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFU
RSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAg
ICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBS
ZXF1ZXN0OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0
VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBNZXRob2RTZXQ+JiBzZXRNZXRob2QoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNZXRob2RTZXQpLCBwcm9wZXJ0eV9t
ZXRob2RfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJtZXRo
b2QiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8TWV0aG9kU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhlYWRlcnNTZXQ+JiBzZXRIZWFkZXJz
KFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIZWFkZXJzU2V0KSwgcHJvcGVydHlfaGVhZGVyc19h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SGVhZGVyc1NldD4oKTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxSZXF1ZXN0PiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8UmVx
dWVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0
cjxSZXF1ZXN0PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxSZXF1ZXN0
PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0
cnVjdG9yOgogICAgICogUmVmUHRyPFJlcXVlc3Q+IHJlc3VsdCA9IFJlcXVlc3Q6OmNyZWF0ZSgp
CiAgICAgKiAgICAgLnNldFVybCguLi4pCiAgICAgKiAgICAgLnNldE1ldGhvZCguLi4pCiAgICAg
KiAgICAgLnNldEhlYWRlcnMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
KGFkb3B0UmVmKG5ldyBSZXF1ZXN0KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRy
YWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0UG9zdERhdGEoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInBvc3REYXRhIiwgdmFsdWUpOwogICAg
fQp9OwoKLyogSFRUUCByZXNwb25zZSBkYXRhLiAqLwpjbGFzcyBSZXNwb25zZSA6IHB1YmxpYyBJ
bnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9
IDAsCiAgICAgICAgVXJsU2V0ID0gMSA8PCAwLAogICAgICAgIFN0YXR1c1NldCA9IDEgPDwgMSwK
ICAgICAgICBTdGF0dXNUZXh0U2V0ID0gMSA8PCAyLAogICAgICAgIEhlYWRlcnNTZXQgPSAxIDw8
IDMsCiAgICAgICAgTWltZVR5cGVTZXQgPSAxIDw8IDQsCiAgICAgICAgQ29ubmVjdGlvblJldXNl
ZFNldCA9IDEgPDwgNSwKICAgICAgICBDb25uZWN0aW9uSWRTZXQgPSAxIDw8IDYsCiAgICAgICAg
QWxsRmllbGRzU2V0ID0gKFVybFNldCB8IFN0YXR1c1NldCB8IFN0YXR1c1RleHRTZXQgfCBIZWFk
ZXJzU2V0IHwgTWltZVR5cGVTZXQgfCBDb25uZWN0aW9uUmV1c2VkU2V0IHwgQ29ubmVjdGlvbklk
U2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsK
ICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7Cgog
ICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0
ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRl
cjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NS
ZWZQdHI8UmVzcG9uc2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUp
OwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNs
YXNzIFJlc3BvbnNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0
PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVXJsU2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAg
ICByZXR1cm4gY2FzdFN0YXRlPFVybFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBTdGF0dXNTZXQ+JiBzZXRTdGF0dXMoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0YXR1c1NldCksIHByb3BlcnR5X3N0
YXR1c19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInN0YXR1
cyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGF0dXNTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhdHVzVGV4dFNldD4mIHNldFN0YXR1
c1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBTdGF0dXNUZXh0U2V0KSwgcHJvcGVydHlfc3RhdHVzVGV4dF9hbHJl
YWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInN0YXR1c1RleHQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3RhdHVzVGV4dFNldD4oKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIZWFkZXJzU2V0PiYgc2V0SGVhZGVycyhQ
YXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgSGVhZGVyc1NldCksIHByb3BlcnR5X2hlYWRlcnNfYWxy
ZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJoZWFkZXJzIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhlYWRlcnNTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTWltZVR5cGVTZXQ+JiBzZXRNaW1lVHlwZShjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIE1pbWVUeXBlU2V0KSwgcHJvcGVydHlfbWltZVR5cGVfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJtaW1lVHlwZSIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxNaW1lVHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBDb25uZWN0aW9uUmV1c2VkU2V0PiYgc2V0Q29ubmVjdGlvblJldXNlZChi
b29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IENvbm5lY3Rpb25SZXVzZWRTZXQpLCBwcm9wZXJ0eV9jb25uZWN0aW9uUmV1c2VkX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oImNvbm5lY3Rpb25SZXVzZWQi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q29ubmVjdGlvblJldXNlZFNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDb25uZWN0aW9uSWRTZXQ+
JiBzZXRDb25uZWN0aW9uSWQoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIENvbm5lY3Rpb25JZFNldCksIHByb3BlcnR5X2Nvbm5lY3Rp
b25JZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoImNvbm5l
Y3Rpb25JZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxDb25uZWN0aW9u
SWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UmVzcG9uc2U+JiAo
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRz
U2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJl
dF9jYXN0PFJlZlB0cjxSZXNwb25zZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxSZXNwb25zZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiBSZWZQdHI8UmVzcG9uc2U+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAg
ICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8UmVzcG9uc2U+IHJlc3Vs
dCA9IFJlc3BvbnNlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAg
IC5zZXRTdGF0dXMoLi4uKQogICAgICogICAgIC5zZXRTdGF0dXNUZXh0KC4uLikKICAgICAqICAg
ICAuc2V0SGVhZGVycyguLi4pCiAgICAgKiAgICAgLnNldE1pbWVUeXBlKC4uLikKICAgICAqICAg
ICAuc2V0Q29ubmVjdGlvblJldXNlZCguLi4pCiAgICAgKiAgICAgLnNldENvbm5lY3Rpb25JZCgu
Li4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAg
IHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFJlc3Bv
bnNlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoK
ICAgIHZvaWQgc2V0SGVhZGVyc1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRTdHJpbmcoImhlYWRlcnNUZXh0IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQg
c2V0UmVxdWVzdEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldE9iamVjdCgicmVxdWVzdEhlYWRlcnMiLCB2YWx1ZSk7CiAgICB9
CgogICAgdm9pZCBzZXRSZXF1ZXN0SGVhZGVyc1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAg
IHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInJlcXVlc3RIZWFkZXJzVGV4dCIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldEZyb21EaXNrQ2FjaGUoYm9vbCB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRCb29sZWFuKCJmcm9tRGlza0NhY2hlIiwgdmFsdWUpOwogICAgfQoKICAgIHZv
aWQgc2V0VGltaW5nKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVzb3VyY2VU
aW1pbmc+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAg
IHRoaXMtPnNldE9iamVjdCgidGltaW5nIiwgdmFsdWUpOwogICAgfQp9OwoKLyogV2ViU29ja2V0
IHJlcXVlc3QgZGF0YS4gKi8KY2xhc3MgV2ViU29ja2V0UmVxdWVzdCA6IHB1YmxpYyBJbnNwZWN0
b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAg
ICAgICAgUmVxdWVzdEtleTNTZXQgPSAxIDw8IDAsCiAgICAgICAgSGVhZGVyc1NldCA9IDEgPDwg
MSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoUmVxdWVzdEtleTNTZXQgfCBIZWFkZXJzU2V0KQog
ICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHBy
aXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAg
IHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFU
RSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8
V2ViU29ja2V0UmVxdWVzdD4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0
ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQg
Y2xhc3MgV2ViU29ja2V0UmVxdWVzdDsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IFJlcXVlc3RLZXkzU2V0PiYgc2V0UmVxdWVzdEtleTMoY29uc3QgU3RyaW5nJiB2YWx1ZSkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSZXF1ZXN0S2V5
M1NldCksIHByb3BlcnR5X3JlcXVlc3RLZXkzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygicmVxdWVzdEtleTMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8UmVxdWVzdEtleTNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgSGVhZGVyc1NldD4mIHNldEhlYWRlcnMoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IEhlYWRlcnNTZXQpLCBwcm9wZXJ0eV9oZWFkZXJzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldE9iamVjdCgiaGVhZGVycyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxIZWFkZXJzU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPFdlYlNvY2tldFJlcXVlc3Q+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxXZWJTb2NrZXRSZXF1ZXN0Pio+
KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFdlYlNv
Y2tldFJlcXVlc3Q+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFdlYlNv
Y2tldFJlcXVlc3Q+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50
aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8V2ViU29ja2V0UmVxdWVzdD4gcmVzdWx0
ID0gV2ViU29ja2V0UmVxdWVzdDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0UmVxdWVzdEtleTMo
Li4uKQogICAgICogICAgIC5zZXRIZWFkZXJzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgV2ViU29ja2V0UmVxdWVzdCgpKSk7CiAgICB9CiAgICB0
eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIFdlYlNvY2tldCByZXNw
b25zZSBkYXRhLiAqLwpjbGFzcyBXZWJTb2NrZXRSZXNwb25zZSA6IHB1YmxpYyBJbnNwZWN0b3JP
YmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAg
ICAgU3RhdHVzU2V0ID0gMSA8PCAwLAogICAgICAgIFN0YXR1c1RleHRTZXQgPSAxIDw8IDEsCiAg
ICAgICAgSGVhZGVyc1NldCA9IDEgPDwgMiwKICAgICAgICBDaGFsbGVuZ2VSZXNwb25zZVNldCA9
IDEgPDwgMywKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU3RhdHVzU2V0IHwgU3RhdHVzVGV4dFNl
dCB8IEhlYWRlcnNTZXQgfCBDaGFsbGVuZ2VSZXNwb25zZVNldCkKICAgIH07CgogICAgdGVtcGxh
dGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RF
UD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAg
ICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFdlYlNvY2tldFJlc3BvbnNl
PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0Zp
ZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAg
bV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBXZWJTb2NrZXRS
ZXNwb25zZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFN0YXR1c1NldD4m
IHNldFN0YXR1cyhkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgU3RhdHVzU2V0KSwgcHJvcGVydHlfc3RhdHVzX2FscmVhZHlfc2V0KTsK
ICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic3RhdHVzIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPFN0YXR1c1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBTdGF0dXNUZXh0U2V0PiYgc2V0U3RhdHVzVGV4dChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0
YXR1c1RleHRTZXQpLCBwcm9wZXJ0eV9zdGF0dXNUZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygic3RhdHVzVGV4dCIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxTdGF0dXNUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IEhlYWRlcnNTZXQ+JiBzZXRIZWFkZXJzKFBhc3NSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBIZWFkZXJzU2V0KSwgcHJvcGVydHlfaGVhZGVyc19hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImhlYWRlcnMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8SGVhZGVyc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBDaGFsbGVuZ2VSZXNwb25zZVNldD4mIHNldENoYWxsZW5nZVJlc3BvbnNlKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgQ2hhbGxlbmdlUmVzcG9uc2VTZXQpLCBwcm9wZXJ0eV9jaGFsbGVuZ2VSZXNwb25zZV9h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoImNoYWxsZW5nZVJl
c3BvbnNlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENoYWxsZW5nZVJl
c3BvbnNlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFdlYlNvY2tl
dFJlc3BvbnNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRF
ID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8V2ViU29ja2V0UmVzcG9uc2U+Kj4oJm1fcmVzdWx0
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8V2ViU29ja2V0UmVzcG9u
c2U+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFdlYlNvY2tldFJlc3Bv
bnNlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNv
bnN0cnVjdG9yOgogICAgICogUmVmUHRyPFdlYlNvY2tldFJlc3BvbnNlPiByZXN1bHQgPSBXZWJT
b2NrZXRSZXNwb25zZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0U3RhdHVzKC4uLikKICAgICAq
ICAgICAuc2V0U3RhdHVzVGV4dCguLi4pCiAgICAgKiAgICAgLnNldEhlYWRlcnMoLi4uKQogICAg
ICogICAgIC5zZXRDaGFsbGVuZ2VSZXNwb25zZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVp
bGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
b0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFdlYlNvY2tldFJlc3BvbnNlKCkpKTsKICAgIH0KICAg
IHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogSW5mb3JtYXRpb24g
YWJvdXQgdGhlIGNhY2hlZCByZXNvdXJjZS4gKi8KY2xhc3MgQ2FjaGVkUmVzb3VyY2UgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNT
ZXQgPSAwLAogICAgICAgIFVybFNldCA9IDEgPDwgMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAx
LAogICAgICAgIEJvZHlTaXplU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChV
cmxTZXQgfCBUeXBlU2V0IHwgQm9keVNpemVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBT
VEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVy
biAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDYWNoZWRSZXNvdXJjZT4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ2FjaGVkUmVzb3VyY2U7CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcmxTZXQ+JiBzZXRVcmwoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBVcmxTZXQpLCBwcm9wZXJ0eV91cmxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJ1cmwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8
VXJsU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5cGVTZXQ+JiBz
ZXRUeXBlKFR5cGVCdWlsZGVyOjpQYWdlOjpSZXNvdXJjZVR5cGU6OkVudW0gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3Bl
cnR5X3R5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0
eXBlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUodmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFR5
cGVTZXQ+JiBzZXRUeXBlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVHlwZVNldCksIHByb3BlcnR5X3R5cGVfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJ0eXBlIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgQm9keVNpemVTZXQ+JiBzZXRCb2R5U2l6ZShkb3VibGUgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQm9keVNpemVT
ZXQpLCBwcm9wZXJ0eV9ib2R5U2l6ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0
LT5zZXROdW1iZXIoImJvZHlTaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPEJvZHlTaXplU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENh
Y2hlZFJlc291cmNlPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNU
QVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+Kj4oJm1fcmVzdWx0
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8Q2FjaGVkUmVzb3VyY2U+
ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENhY2hlZFJlc291cmNlPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPENhY2hlZFJlc291cmNlPiByZXN1bHQgPSBDYWNoZWRSZXNvdXJj
ZTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VXJsKC4uLikKICAgICAqICAgICAuc2V0VHlwZSgu
Li4pCiAgICAgKiAgICAgLnNldEJvZHlTaXplKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWls
ZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5v
RmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ2FjaGVkUmVzb3VyY2UoKSkpOwogICAgfQogICAgdHlw
ZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRSZXNwb25zZSgv
KlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlc3BvbnNlPiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJl
c3BvbnNlIiwgdmFsdWUpOwogICAgfQp9OwoKLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVl
c3QgaW5pdGlhdG9yLiAqLwpjbGFzcyBJbml0aWF0b3IgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0
IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAndHlwZScgd2hpbGUg
Z2VuZXJhdGluZyBJbml0aWF0b3IuCiAgICBzdHJ1Y3QgVHlwZSB7CiAgICAgICAgZW51bSBFbnVt
IHsKICAgICAgICAgICAgUGFyc2VyID0gMzgsCiAgICAgICAgICAgIFNjcmlwdCA9IDM5LAogICAg
ICAgICAgICBPdGhlciA9IDI1LAogICAgICAgIH07CiAgICB9OyAvLyBzdHJ1Y3QgVHlwZQoKICAg
IGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBlU2V0ID0gMSA8PCAw
LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxp
bnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBC
dWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8SW5pdGlhdG9yPiBwdHIpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVp
bGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBw
dHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBJbml0aWF0b3I7CiAgICBwdWJsaWM6
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShUeXBlOjpFbnVtIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVT
ZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dFN0cmluZygidHlwZSIsIGdldEVudW1Db25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAg
IHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90
eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidHlwZSIs
IHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUeXBlU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEluaXRpYXRvcj4mICgpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19u
b3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPElu
aXRpYXRvcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxJbml0aWF0b3I+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPElu
aXRpYXRvcj4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxJbml0aWF0b3I+IHJlc3VsdCA9IEluaXRpYXRv
cjo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0VHlwZSguLi4pOwogICAgICovCiAgICBzdGF0aWMg
QnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRl
cjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEluaXRpYXRvcigpKSk7CiAgICB9CiAgICB0eXBl
ZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFN0YWNrVHJhY2Uo
LypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6Q29uc29sZTo6Q2Fs
bEZyYW1lID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAg
ICAgIHRoaXMtPnNldEFycmF5KCJzdGFja1RyYWNlIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQg
c2V0VXJsKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5n
KCJ1cmwiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRMaW5lTnVtYmVyKGRvdWJsZSB2YWx1
ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXROdW1iZXIoImxpbmVOdW1iZXIiLCB2YWx1ZSk7CiAg
ICB9Cn07Cgp9IC8vIE5ldHdvcmsKCiNpZiBFTkFCTEUoU1FMX0RBVEFCQVNFKQpuYW1lc3BhY2Ug
RGF0YWJhc2UgewovKiBEYXRhYmFzZSBvYmplY3QuICovCmNsYXNzIERhdGFiYXNlIDogcHVibGlj
IEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0
ID0gMCwKICAgICAgICBJZFNldCA9IDEgPDwgMCwKICAgICAgICBEb21haW5TZXQgPSAxIDw8IDEs
CiAgICAgICAgTmFtZVNldCA9IDEgPDwgMiwKICAgICAgICBWZXJzaW9uU2V0ID0gMSA8PCAzLAog
ICAgICAgIEFsbEZpZWxkc1NldCA9IChJZFNldCB8IERvbWFpblNldCB8IE5hbWVTZXQgfCBWZXJz
aW9uU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVy
IHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7
CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RT
dGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVp
bGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBh
c3NSZWZQdHI8RGF0YWJhc2U+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3Rh
dGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5k
IGNsYXNzIERhdGFiYXNlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSWRT
ZXQ+JiBzZXRJZChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIElkU2V0KSwgcHJvcGVydHlfaWRfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJpZCIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBEb21haW5TZXQ+JiBzZXREb21haW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEb21haW5TZXQpLCBwcm9wZXJ0
eV9kb21haW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJk
b21haW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RG9tYWluU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNv
bnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgTmFtZVNldCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPE5hbWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
VmVyc2lvblNldD4mIHNldFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWZXJzaW9uU2V0KSwgcHJvcGVydHlf
dmVyc2lvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZl
cnNpb24iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmVyc2lvblNldD4o
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxEYXRhYmFzZT4mICgpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJl
c3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
UmVmUHRyPERhdGFiYXNlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBQYXNzUmVmUHRyPERhdGFiYXNlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJl
ZlB0cjxEYXRhYmFzZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxEYXRhYmFzZT4gcmVzdWx0ID0gRGF0
YWJhc2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldElkKC4uLikKICAgICAqICAgICAuc2V0RG9t
YWluKC4uLikKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAgICAgLnNldFZlcnNpb24o
Li4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAg
ICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBEYXRh
YmFzZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsK
fTsKCn0gLy8gRGF0YWJhc2UKCiNlbmRpZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQojaWYgRU5B
QkxFKElOREVYRURfREFUQUJBU0UpCm5hbWVzcGFjZSBJbmRleGVkREIgewovKiBTZWN1cml0eSBv
cmlnaW4gd2l0aCBkYXRhYmFzZSBuYW1lcy4gKi8KY2xhc3MgU2VjdXJpdHlPcmlnaW5XaXRoRGF0
YWJhc2VOYW1lcyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU2VjdXJpdHlPcmlnaW5TZXQgPSAxIDw8
IDAsCiAgICAgICAgRGF0YWJhc2VOYW1lc1NldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNT
ZXQgPSAoU2VjdXJpdHlPcmlnaW5TZXQgfCBEYXRhYmFzZU5hbWVzU2V0KQogICAgfTsKCiAgICB0
ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAg
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGlu
dCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4o
dGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2VjdXJpdHlPcmln
aW5XaXRoRGF0YWJhc2VOYW1lcz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9z
dGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmll
bmQgY2xhc3MgU2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lczsKICAgIHB1YmxpYzoKCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IFNlY3VyaXR5T3JpZ2luU2V0PiYgc2V0U2VjdXJpdHlPcmln
aW4oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKCEoU1RBVEUgJiBTZWN1cml0eU9yaWdpblNldCksIHByb3BlcnR5X3NlY3VyaXR5T3JpZ2lu
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic2VjdXJpdHlP
cmlnaW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2VjdXJpdHlPcmln
aW5TZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgRGF0YWJhc2VOYW1l
c1NldD4mIHNldERhdGFiYXNlTmFtZXMoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxT
dHJpbmcgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewog
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRGF0YWJhc2VOYW1lc1NldCksIHBy
b3BlcnR5X2RhdGFiYXNlTmFtZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0QXJyYXkoImRhdGFiYXNlTmFtZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0
U3RhdGU8RGF0YWJhc2VOYW1lc1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVzPiYgKCkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25v
dF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U2Vj
dXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTZWN1cml0eU9yaWdpbldpdGhEYXRhYmFzZU5hbWVz
PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxTZWN1cml0eU9yaWdpbldp
dGhEYXRhYmFzZU5hbWVzPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFNlY3VyaXR5T3JpZ2luV2l0aERh
dGFiYXNlTmFtZXM+IHJlc3VsdCA9IFNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXM6OmNy
ZWF0ZSgpCiAgICAgKiAgICAgLnNldFNlY3VyaXR5T3JpZ2luKC4uLikKICAgICAqICAgICAuc2V0
RGF0YWJhc2VOYW1lcyguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRv
cHRSZWYobmV3IFNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXMoKSkpOwogICAgfQogICAg
dHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBEYXRhYmFzZSB3aXRo
IGFuIGFycmF5IG9mIG9iamVjdCBzdG9yZXMuICovCmNsYXNzIERhdGFiYXNlV2l0aE9iamVjdFN0
b3JlcyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAg
ICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBWZXJz
aW9uU2V0ID0gMSA8PCAxLAogICAgICAgIE9iamVjdFN0b3Jlc1NldCA9IDEgPDwgMiwKICAgICAg
ICBBbGxGaWVsZHNTZXQgPSAoTmFtZVNldCB8IFZlcnNpb25TZXQgfCBPYmplY3RTdG9yZXNTZXQp
CiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAg
cHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAg
ICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkK
ICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNU
QVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0
cjxEYXRhYmFzZVdpdGhPYmplY3RTdG9yZXM+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIERhdGFiYXNlV2l0aE9iamVjdFN0b3JlczsKICAgIHB1YmxpYzoKCiAg
ICAgICAgQnVpbGRlcjxTVEFURSB8IE5hbWVTZXQ+JiBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTmFtZVNl
dCksIHByb3BlcnR5X25hbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5hbWVT
ZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVmVyc2lvblNldD4mIHNl
dFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJ
TEVfQVNTRVJUKCEoU1RBVEUgJiBWZXJzaW9uU2V0KSwgcHJvcGVydHlfdmVyc2lvbl9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZlcnNpb24iLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmVyc2lvblNldD4oKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPYmplY3RTdG9yZXNTZXQ+JiBzZXRPYmplY3RTdG9yZXMo
LypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6SW5kZXhlZERCOjpP
YmplY3RTdG9yZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBPYmplY3RTdG9yZXNTZXQp
LCBwcm9wZXJ0eV9vYmplY3RTdG9yZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0QXJyYXkoIm9iamVjdFN0b3JlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxPYmplY3RTdG9yZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzPiYgKCkKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFk
eSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8RGF0YWJhc2VX
aXRoT2JqZWN0U3RvcmVzPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBQYXNzUmVmUHRyPERhdGFiYXNlV2l0aE9iamVjdFN0b3Jlcz4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8RGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzPigqdGhpcyk7CiAg
ICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAg
ICogUmVmUHRyPERhdGFiYXNlV2l0aE9iamVjdFN0b3Jlcz4gcmVzdWx0ID0gRGF0YWJhc2VXaXRo
T2JqZWN0U3RvcmVzOjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAg
ICAuc2V0VmVyc2lvbiguLi4pCiAgICAgKiAgICAgLnNldE9iamVjdFN0b3JlcyguLi4pOwogICAg
ICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAg
ICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IERhdGFiYXNlV2l0aE9i
amVjdFN0b3JlcygpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKfTsKCi8qIE9iamVjdCBzdG9yZS4gKi8KY2xhc3MgT2JqZWN0U3RvcmUgOiBwdWJsaWMg
SW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQg
PSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAgICAgS2V5UGF0aFNldCA9IDEgPDwg
MSwKICAgICAgICBJbmRleGVzU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChO
YW1lU2V0IHwgS2V5UGF0aFNldCB8IEluZGV4ZXNTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxPYmplY3RTdG9yZT4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgT2JqZWN0U3RvcmU7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEtleVBhdGhT
ZXQ+JiBzZXRLZXlQYXRoKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgS2V5UGF0aFNldCksIHByb3BlcnR5X2tleVBhdGhf
YWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJrZXlQYXRoIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEtleVBhdGhTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSW5kZXhlc1NldD4mIHNldEluZGV4ZXMoLypQ
YXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6SW5kZXhlZERCOjpPYmpl
Y3RTdG9yZUluZGV4ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEluZGV4ZXNTZXQpLCBw
cm9wZXJ0eV9pbmRleGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldEFy
cmF5KCJpbmRleGVzIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEluZGV4
ZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8T2JqZWN0U3RvcmU+
JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmll
bGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PFJlZlB0cjxPYmplY3RTdG9yZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxPYmplY3RTdG9yZT4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8T2JqZWN0U3RvcmU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9
OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8T2Jq
ZWN0U3RvcmU+IHJlc3VsdCA9IE9iamVjdFN0b3JlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRO
YW1lKC4uLikKICAgICAqICAgICAuc2V0S2V5UGF0aCguLi4pCiAgICAgKiAgICAgLnNldEluZGV4
ZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgp
CiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBP
YmplY3RTdG9yZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKfTsKCi8qIE9iamVjdCBzdG9yZSBpbmRleC4gKi8KY2xhc3MgT2JqZWN0U3RvcmVJbmRl
eCA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBO
b0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTmFtZVNldCA9IDEgPDwgMCwKICAgICAgICBLZXlQYXRo
U2V0ID0gMSA8PCAxLAogICAgICAgIFVuaXF1ZVNldCA9IDEgPDwgMiwKICAgICAgICBNdWx0aUVu
dHJ5U2V0ID0gMSA8PCAzLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChOYW1lU2V0IHwgS2V5UGF0
aFNldCB8IFVuaXF1ZVNldCB8IE11bHRpRW50cnlTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxPYmplY3RTdG9yZUluZGV4PiBwdHIp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1Nl
dCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1
bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBPYmplY3RTdG9yZUluZGV4
OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTmFtZVNldD4mIHNldE5hbWUo
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8TmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUg
fCBLZXlQYXRoU2V0PiYgc2V0S2V5UGF0aChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIEtleVBhdGhTZXQpLCBwcm9wZXJ0
eV9rZXlQYXRoX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
a2V5UGF0aCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxLZXlQYXRoU2V0
PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFVuaXF1ZVNldD4mIHNldFVu
aXF1ZShib29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShT
VEFURSAmIFVuaXF1ZVNldCksIHByb3BlcnR5X3VuaXF1ZV9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJ1bmlxdWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8VW5pcXVlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IE11bHRpRW50cnlTZXQ+JiBzZXRNdWx0aUVudHJ5KGJvb2wgdmFsdWUpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTXVsdGlFbnRyeVNldCksIHBy
b3BlcnR5X211bHRpRW50cnlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
Qm9vbGVhbigibXVsdGlFbnRyeSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxNdWx0aUVudHJ5U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPE9i
amVjdFN0b3JlSW5kZXg+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxPYmplY3RTdG9yZUluZGV4Pio+KCZtX3Jl
c3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPE9iamVjdFN0b3Jl
SW5kZXg+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPE9iamVjdFN0b3Jl
SW5kZXg+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8T2JqZWN0U3RvcmVJbmRleD4gcmVzdWx0ID0gT2Jq
ZWN0U3RvcmVJbmRleDo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSguLi4pCiAgICAgKiAg
ICAgLnNldEtleVBhdGgoLi4uKQogICAgICogICAgIC5zZXRVbmlxdWUoLi4uKQogICAgICogICAg
IC5zZXRNdWx0aUVudHJ5KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRz
U2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0Pihh
ZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVJbmRleCgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVj
dEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gSW5kZXhlZERCCgojZW5kaWYgLy8gRU5B
QkxFKElOREVYRURfREFUQUJBU0UpCm5hbWVzcGFjZSBET01TdG9yYWdlIHsKLyogRE9NIFN0b3Jh
Z2UgZW50cnkuICovCmNsYXNzIEVudHJ5IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1Ymxp
YzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBIb3N0U2V0ID0g
MSA8PCAwLAogICAgICAgIElzTG9jYWxTdG9yYWdlU2V0ID0gMSA8PCAxLAogICAgICAgIElkU2V0
ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChIb3N0U2V0IHwgSXNMb2NhbFN0b3Jh
Z2VTZXQgfCBJZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPEVudHJ5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBFbnRyeTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEhv
c3RTZXQ+JiBzZXRIb3N0KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSG9zdFNldCksIHByb3BlcnR5X2hvc3RfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJob3N0IiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEhvc3RTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgSXNMb2NhbFN0b3JhZ2VTZXQ+JiBzZXRJc0xvY2FsU3RvcmFnZShi
b29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IElzTG9jYWxTdG9yYWdlU2V0KSwgcHJvcGVydHlfaXNMb2NhbFN0b3JhZ2VfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0Qm9vbGVhbigiaXNMb2NhbFN0b3JhZ2UiLCB2YWx1
ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8SXNMb2NhbFN0b3JhZ2VTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSWRTZXQ+JiBzZXRJZChkb3VibGUgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSWRTZXQp
LCBwcm9wZXJ0eV9pZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1i
ZXIoImlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPElkU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPEVudHJ5PiYgKCkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8
RW50cnk+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8RW50cnk+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEVudHJ5Pigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPEVudHJ5PiByZXN1bHQgPSBFbnRyeTo6Y3JlYXRlKCkKICAgICAq
ICAgICAuc2V0SG9zdCguLi4pCiAgICAgKiAgICAgLnNldElzTG9jYWxTdG9yYWdlKC4uLikKICAg
ICAqICAgICAuc2V0SWQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNT
ZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFk
b3B0UmVmKG5ldyBFbnRyeSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMg
SXRlbVRyYWl0czsKfTsKCn0gLy8gRE9NU3RvcmFnZQoKbmFtZXNwYWNlIEFwcGxpY2F0aW9uQ2Fj
aGUgewovKiBEZXRhaWxlZCBhcHBsaWNhdGlvbiBjYWNoZSByZXNvdXJjZSBpbmZvcm1hdGlvbi4g
Ki8KY2xhc3MgQXBwbGljYXRpb25DYWNoZVJlc291cmNlIDogcHVibGljIEluc3BlY3Rvck9iamVj
dCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBV
cmxTZXQgPSAxIDw8IDAsCiAgICAgICAgU2l6ZVNldCA9IDEgPDwgMSwKICAgICAgICBUeXBlU2V0
ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChVcmxTZXQgfCBTaXplU2V0IHwgVHlw
ZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGVSZXNvdXJjZT4gcHRyKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9p
bl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0K
ICAgICAgICBmcmllbmQgY2xhc3MgQXBwbGljYXRpb25DYWNoZVJlc291cmNlOwogICAgcHVibGlj
OgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVXJsU2V0PiYgc2V0VXJsKGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgVXJs
U2V0KSwgcHJvcGVydHlfdXJsX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dFN0cmluZygidXJsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVybFNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaXplU2V0PiYgc2V0U2l6
ZShpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgU2l6ZVNldCksIHByb3BlcnR5X3NpemVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0TnVtYmVyKCJzaXplIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0
YXRlPFNpemVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNl
dD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2YWx1ZSk7CiAgICAg
ICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9w
ZXJhdG9yIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+JiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNf
bm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxB
cHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFBhc3NSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPiAoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2U+KCp0
aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0
b3I6CiAgICAgKiBSZWZQdHI8QXBwbGljYXRpb25DYWNoZVJlc291cmNlPiByZXN1bHQgPSBBcHBs
aWNhdGlvbkNhY2hlUmVzb3VyY2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFVybCguLi4pCiAg
ICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRUeXBlKC4uLik7CiAgICAgKi8K
ICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJl
dHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQXBwbGljYXRpb25DYWNoZVJl
c291cmNlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRz
Owp9OwoKLyogRGV0YWlsZWQgYXBwbGljYXRpb24gY2FjaGUgaW5mb3JtYXRpb24uICovCmNsYXNz
IEFwcGxpY2F0aW9uQ2FjaGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAg
ZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE1hbmlmZXN0VVJMU2V0ID0g
MSA8PCAwLAogICAgICAgIFNpemVTZXQgPSAxIDw8IDEsCiAgICAgICAgQ3JlYXRpb25UaW1lU2V0
ID0gMSA8PCAyLAogICAgICAgIFVwZGF0ZVRpbWVTZXQgPSAxIDw8IDMsCiAgICAgICAgUmVzb3Vy
Y2VzU2V0ID0gMSA8PCA0LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChNYW5pZmVzdFVSTFNldCB8
IFNpemVTZXQgfCBDcmVhdGlvblRpbWVTZXQgfCBVcGRhdGVUaW1lU2V0IHwgUmVzb3VyY2VzU2V0
KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAg
IHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAg
ICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgp
CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxT
VEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQ
dHI8QXBwbGljYXRpb25DYWNoZT4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9z
dGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmll
bmQgY2xhc3MgQXBwbGljYXRpb25DYWNoZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IE1hbmlmZXN0VVJMU2V0PiYgc2V0TWFuaWZlc3RVUkwoY29uc3QgU3RyaW5nJiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBNYW5pZmVz
dFVSTFNldCksIHByb3BlcnR5X21hbmlmZXN0VVJMX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAg
bV9yZXN1bHQtPnNldFN0cmluZygibWFuaWZlc3RVUkwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8TWFuaWZlc3RVUkxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgU2l6ZVNldD4mIHNldFNpemUoZG91YmxlIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFNpemVTZXQpLCBwcm9wZXJ0eV9zaXpl
X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigic2l6ZSIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaXplU2V0PigpOwogICAgICAgIH0K
CiAgICAgICAgQnVpbGRlcjxTVEFURSB8IENyZWF0aW9uVGltZVNldD4mIHNldENyZWF0aW9uVGlt
ZShkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgQ3JlYXRpb25UaW1lU2V0KSwgcHJvcGVydHlfY3JlYXRpb25UaW1lX2FscmVhZHlfc2V0
KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigiY3JlYXRpb25UaW1lIiwgdmFsdWUp
OwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPENyZWF0aW9uVGltZVNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVcGRhdGVUaW1lU2V0PiYgc2V0VXBkYXRlVGlt
ZShkb3VibGUgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgVXBkYXRlVGltZVNldCksIHByb3BlcnR5X3VwZGF0ZVRpbWVfYWxyZWFkeV9zZXQpOwog
ICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJ1cGRhdGVUaW1lIiwgdmFsdWUpOwogICAg
ICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFVwZGF0ZVRpbWVTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgUmVzb3VyY2VzU2V0PiYgc2V0UmVzb3VyY2VzKC8qUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkFwcGxpY2F0aW9uQ2FjaGU6OkFw
cGxpY2F0aW9uQ2FjaGVSZXNvdXJjZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSZXNv
dXJjZXNTZXQpLCBwcm9wZXJ0eV9yZXNvdXJjZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBt
X3Jlc3VsdC0+c2V0QXJyYXkoInJlc291cmNlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJu
IGNhc3RTdGF0ZTxSZXNvdXJjZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8QXBwbGljYXRpb25DYWNoZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAg
ICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEFwcGxpY2F0aW9uQ2FjaGU+
Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8QXBw
bGljYXRpb25DYWNoZT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8QXBw
bGljYXRpb25DYWNoZT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxBcHBsaWNhdGlvbkNhY2hlPiByZXN1
bHQgPSBBcHBsaWNhdGlvbkNhY2hlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRNYW5pZmVzdFVS
TCguLi4pCiAgICAgKiAgICAgLnNldFNpemUoLi4uKQogICAgICogICAgIC5zZXRDcmVhdGlvblRp
bWUoLi4uKQogICAgICogICAgIC5zZXRVcGRhdGVUaW1lKC4uLikKICAgICAqICAgICAuc2V0UmVz
b3VyY2VzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVh
dGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihu
ZXcgQXBwbGljYXRpb25DYWNoZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFp
dHMgSXRlbVRyYWl0czsKfTsKCi8qIEZyYW1lIGlkZW50aWZpZXIgLSBtYW5pZmVzdCBVUkwgcGFp
ci4gKi8KY2xhc3MgRnJhbWVXaXRoTWFuaWZlc3QgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsK
cHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIEZyYW1l
SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgTWFuaWZlc3RVUkxTZXQgPSAxIDw8IDEsCiAgICAgICAg
U3RhdHVzU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChGcmFtZUlkU2V0IHwg
TWFuaWZlc3RVUkxTZXQgfCBTdGF0dXNTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFU
RT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgRnJhbWVXaXRoTWFuaWZlc3Q7CiAg
ICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBGcmFtZUlkU2V0PiYgc2V0RnJhbWVJ
ZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlkJiovIGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgRnJh
bWVJZFNldCksIHByb3BlcnR5X2ZyYW1lSWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jl
c3VsdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2Fz
dFN0YXRlPEZyYW1lSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
TWFuaWZlc3RVUkxTZXQ+JiBzZXRNYW5pZmVzdFVSTChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1hbmlmZXN0VVJMU2V0
KSwgcHJvcGVydHlfbWFuaWZlc3RVUkxfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3Vs
dC0+c2V0U3RyaW5nKCJtYW5pZmVzdFVSTCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNh
c3RTdGF0ZTxNYW5pZmVzdFVSTFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RB
VEUgfCBTdGF0dXNTZXQ+JiBzZXRTdGF0dXMoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0YXR1c1NldCksIHByb3BlcnR5X3N0YXR1c19h
bHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInN0YXR1cyIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdGF0dXNTZXQ+KCk7CiAgICAgICAg
fQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+JiAoKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1
bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJl
ZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAg
b3BlcmF0b3IgUGFzc1JlZlB0cjxGcmFtZVdpdGhNYW5pZmVzdD4gKCkKICAgICAgICB7CiAgICAg
ICAgICAgIHJldHVybiBSZWZQdHI8RnJhbWVXaXRoTWFuaWZlc3Q+KCp0aGlzKTsKICAgICAgICB9
CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQ
dHI8RnJhbWVXaXRoTWFuaWZlc3Q+IHJlc3VsdCA9IEZyYW1lV2l0aE1hbmlmZXN0OjpjcmVhdGUo
KQogICAgICogICAgIC5zZXRGcmFtZUlkKC4uLikKICAgICAqICAgICAuc2V0TWFuaWZlc3RVUkwo
Li4uKQogICAgICogICAgIC5zZXRTdGF0dXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBGcmFtZVdpdGhNYW5pZmVzdCgpKSk7CiAgICB9CiAgICB0
eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCn0gLy8gQXBwbGljYXRpb25D
YWNoZQoKbmFtZXNwYWNlIERPTSB7Ci8qIERPTSBpbnRlcmFjdGlvbiBpcyBpbXBsZW1lbnRlZCBp
biB0ZXJtcyBvZiBtaXJyb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCB0aGUgYWN0dWFsIERPTSBu
b2Rlcy4gRE9NTm9kZSBpcyBhIGJhc2Ugbm9kZSBtaXJyb3IgdHlwZS4gKi8KY2xhc3MgTm9kZSA6
IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0Zp
ZWxkc1NldCA9IDAsCiAgICAgICAgTm9kZUlkU2V0ID0gMSA8PCAwLAogICAgICAgIE5vZGVUeXBl
U2V0ID0gMSA8PCAxLAogICAgICAgIE5vZGVOYW1lU2V0ID0gMSA8PCAyLAogICAgICAgIExvY2Fs
TmFtZVNldCA9IDEgPDwgMywKICAgICAgICBOb2RlVmFsdWVTZXQgPSAxIDw8IDQsCiAgICAgICAg
QWxsRmllbGRzU2V0ID0gKE5vZGVJZFNldCB8IE5vZGVUeXBlU2V0IHwgTm9kZU5hbWVTZXQgfCBM
b2NhbE5hbWVTZXQgfCBOb2RlVmFsdWVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFU
RT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAq
cmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxOb2RlPiBwdHIpCiAgICAgICAgewogICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVk
X2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAg
fQogICAgICAgIGZyaWVuZCBjbGFzcyBOb2RlOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVy
PFNUQVRFIHwgTm9kZUlkU2V0PiYgc2V0Tm9kZUlkKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBOb2RlSWRTZXQpLCBwcm9wZXJ0eV9ub2Rl
SWRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJub2RlSWQi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Tm9kZUlkU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE5vZGVUeXBlU2V0PiYgc2V0Tm9kZVR5cGUo
aW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IE5vZGVUeXBlU2V0KSwgcHJvcGVydHlfbm9kZVR5cGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJub2RlVHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0
dXJuIGNhc3RTdGF0ZTxOb2RlVHlwZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8
U1RBVEUgfCBOb2RlTmFtZVNldD4mIHNldE5vZGVOYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZU5hbWVTZXQp
LCBwcm9wZXJ0eV9ub2RlTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5z
ZXRTdHJpbmcoIm5vZGVOYW1lIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PE5vZGVOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExvY2Fs
TmFtZVNldD4mIHNldExvY2FsTmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExvY2FsTmFtZVNldCksIHByb3BlcnR5
X2xvY2FsTmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmco
ImxvY2FsTmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMb2NhbE5h
bWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTm9kZVZhbHVlU2V0
PiYgc2V0Tm9kZVZhbHVlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTm9kZVZhbHVlU2V0KSwgcHJvcGVydHlfbm9kZVZh
bHVlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibm9kZVZh
bHVlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPE5vZGVWYWx1ZVNldD4o
KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxOb2RlPiYgKCkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8Tm9kZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1Jl
ZlB0cjxOb2RlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxOb2RlPigq
dGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVj
dG9yOgogICAgICogUmVmUHRyPE5vZGU+IHJlc3VsdCA9IE5vZGU6OmNyZWF0ZSgpCiAgICAgKiAg
ICAgLnNldE5vZGVJZCguLi4pCiAgICAgKiAgICAgLnNldE5vZGVUeXBlKC4uLikKICAgICAqICAg
ICAuc2V0Tm9kZU5hbWUoLi4uKQogICAgICogICAgIC5zZXRMb2NhbE5hbWUoLi4uKQogICAgICog
ICAgIC5zZXROb2RlVmFsdWUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
KGFkb3B0UmVmKG5ldyBOb2RlKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0
cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0Q2hpbGROb2RlQ291bnQoaW50IHZhbHVlKQogICAg
ewogICAgICAgIHRoaXMtPnNldE51bWJlcigiY2hpbGROb2RlQ291bnQiLCB2YWx1ZSk7CiAgICB9
CgogICAgdm9pZCBzZXRDaGlsZHJlbigvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5
cGVCdWlsZGVyOjpET006Ok5vZGUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0QXJyYXkoImNoaWxkcmVuIiwgdmFsdWUpOwogICAg
fQoKICAgIHZvaWQgc2V0QXR0cmlidXRlcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5
PFN0cmluZyA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgIHsKICAg
ICAgICB0aGlzLT5zZXRBcnJheSgiYXR0cmlidXRlcyIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lk
IHNldERvY3VtZW50VVJMKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJkb2N1bWVudFVSTCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFB1Ymxp
Y0lkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJw
dWJsaWNJZCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFN5c3RlbUlkKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzeXN0ZW1JZCIsIHZhbHVl
KTsKICAgIH0KCiAgICB2b2lkIHNldEludGVybmFsU3Vic2V0KGNvbnN0IFN0cmluZyYgdmFsdWUp
CiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJpbnRlcm5hbFN1YnNldCIsIHZhbHVlKTsK
ICAgIH0KCiAgICB2b2lkIHNldFhtbFZlcnNpb24oY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsK
ICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInhtbFZlcnNpb24iLCB2YWx1ZSk7CiAgICB9CgogICAg
dm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0
U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0VmFsdWUoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUp
OwogICAgfQogICAgdXNpbmcgSW5zcGVjdG9yT2JqZWN0OjpzZXRWYWx1ZTsKCgogICAgdm9pZCBz
ZXRDb250ZW50RG9jdW1lbnQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006Ok5vZGU+Ki8g
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNl
dE9iamVjdCgiY29udGVudERvY3VtZW50IiwgdmFsdWUpOwogICAgfQp9OwoKLyogRE9NIGludGVy
YWN0aW9uIGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIG1pcnJvciBvYmplY3RzIHRoYXQgcmVw
cmVzZW50IHRoZSBhY3R1YWwgRE9NIG5vZGVzLiBET01Ob2RlIGlzIGEgYmFzZSBub2RlIG1pcnJv
ciB0eXBlLiAqLwpjbGFzcyBFdmVudExpc3RlbmVyIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7
CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUeXBl
U2V0ID0gMSA8PCAwLAogICAgICAgIFVzZUNhcHR1cmVTZXQgPSAxIDw8IDEsCiAgICAgICAgSXNB
dHRyaWJ1dGVTZXQgPSAxIDw8IDIsCiAgICAgICAgTm9kZUlkU2V0ID0gMSA8PCAzLAogICAgICAg
IEhhbmRsZXJCb2R5U2V0ID0gMSA8PCA0LAogICAgICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0
IHwgVXNlQ2FwdHVyZVNldCB8IElzQXR0cmlidXRlU2V0IHwgTm9kZUlkU2V0IHwgSGFuZGxlckJv
ZHlTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIg
ewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
CiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0
YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWls
ZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFz
c1JlZlB0cjxFdmVudExpc3RlbmVyPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0
X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZy
aWVuZCBjbGFzcyBFdmVudExpc3RlbmVyOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlw
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBVc2VDYXB0dXJlU2V0PiYgc2V0VXNlQ2FwdHVyZShi
b29sIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFVzZUNhcHR1cmVTZXQpLCBwcm9wZXJ0eV91c2VDYXB0dXJlX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldEJvb2xlYW4oInVzZUNhcHR1cmUiLCB2YWx1ZSk7CiAgICAgICAg
ICAgIHJldHVybiBjYXN0U3RhdGU8VXNlQ2FwdHVyZVNldD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBJc0F0dHJpYnV0ZVNldD4mIHNldElzQXR0cmlidXRlKGJvb2wgdmFs
dWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgSXNBdHRy
aWJ1dGVTZXQpLCBwcm9wZXJ0eV9pc0F0dHJpYnV0ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXRCb29sZWFuKCJpc0F0dHJpYnV0ZSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxJc0F0dHJpYnV0ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBOb2RlSWRTZXQ+JiBzZXROb2RlSWQoaW50IHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE5vZGVJZFNldCksIHByb3BlcnR5
X25vZGVJZF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoIm5v
ZGVJZCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxOb2RlSWRTZXQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgSGFuZGxlckJvZHlTZXQ+JiBzZXRI
YW5kbGVyQm9keShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIEhhbmRsZXJCb2R5U2V0KSwgcHJvcGVydHlfaGFuZGxlckJv
ZHlfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJoYW5kbGVy
Qm9keSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxIYW5kbGVyQm9keVNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxFdmVudExpc3RlbmVyPiYg
KCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxk
c1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnBy
ZXRfY2FzdDxSZWZQdHI8RXZlbnRMaXN0ZW5lcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxFdmVudExpc3RlbmVyPigqdGhpcyk7CiAgICAgICAgfQog
ICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRy
PEV2ZW50TGlzdGVuZXI+IHJlc3VsdCA9IEV2ZW50TGlzdGVuZXI6OmNyZWF0ZSgpCiAgICAgKiAg
ICAgLnNldFR5cGUoLi4uKQogICAgICogICAgIC5zZXRVc2VDYXB0dXJlKC4uLikKICAgICAqICAg
ICAuc2V0SXNBdHRyaWJ1dGUoLi4uKQogICAgICogICAgIC5zZXROb2RlSWQoLi4uKQogICAgICog
ICAgIC5zZXRIYW5kbGVyQm9keSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0Zp
ZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4oYWRvcHRSZWYobmV3IEV2ZW50TGlzdGVuZXIoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1
Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRMb2NhdGlvbigvKlBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJsb2NhdGlvbiIs
IHZhbHVlKTsKICAgIH0KfTsKCi8qIEEgc3RydWN0dXJlIGhvbGRpbmcgYW4gUkdCQSBjb2xvci4g
Ki8KLy8gVHlwZSBvcmlnaW5hbGx5IHdhcyBuYW1lZCAnUkdCQScuCmNsYXNzIFJnYmEgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNT
ZXQgPSAwLAogICAgICAgIFJTZXQgPSAxIDw8IDAsCiAgICAgICAgR1NldCA9IDEgPDwgMSwKICAg
ICAgICBCU2V0ID0gMSA8PCAyLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChSU2V0IHwgR1NldCB8
IEJTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIg
ewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsK
CiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0
YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWls
ZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFz
c1JlZlB0cjxSZ2JhPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBSZ2JhOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUlNldD4mIHNldFIo
aW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IFJTZXQpLCBwcm9wZXJ0eV9yX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dE51bWJlcigiciIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSU2V0Pigp
OwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEdTZXQ+JiBzZXRHKGludCB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBHU2V0KSwg
cHJvcGVydHlfZ19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
ImciLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8R1NldD4oKTsKICAgICAg
ICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBCU2V0PiYgc2V0QihpbnQgdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgQlNldCksIHByb3BlcnR5
X2JfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJiIiwgdmFs
dWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPEJTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBvcGVyYXRvciBSZWZQdHI8UmdiYT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwog
ICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPFJnYmE+Kj4oJm1fcmVz
dWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8UmdiYT4gKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8UmdiYT4oKnRoaXMpOwogICAgICAgIH0K
ICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0
cjxSZ2JhPiByZXN1bHQgPSBSZ2JhOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRSKC4uLikKICAg
ICAqICAgICAuc2V0RyguLi4pCiAgICAgKiAgICAgLnNldEIoLi4uKTsKICAgICAqLwogICAgc3Rh
dGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1
aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBSZ2JhKCkpKTsKICAgIH0KICAgIHR5cGVk
ZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0QShkb3VibGUgdmFs
dWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJhIiwgdmFsdWUpOwogICAgfQp9OwoK
LyogQ29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgaGlnaGxpZ2h0aW5nIG9mIHBhZ2UgZWxlbWVu
dHMuICovCmNsYXNzIEhpZ2hsaWdodENvbmZpZyA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3Qgewpw
dWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgQWxsRmll
bGRzU2V0ID0gMAogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25v
bl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAg
ICAgIGZyaWVuZCBjbGFzcyBIaWdobGlnaHRDb25maWc7CiAgICBwdWJsaWM6CgogICAgICAgIG9w
ZXJhdG9yIFJlZlB0cjxIaWdobGlnaHRDb25maWc+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxIaWdobGlnaHRD
b25maWc+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQ
dHI8SGlnaGxpZ2h0Q29uZmlnPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0
cjxIaWdobGlnaHRDb25maWc+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAg
KiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8SGlnaGxpZ2h0Q29uZmlnPiBy
ZXN1bHQgPSBIaWdobGlnaHRDb25maWc6OmNyZWF0ZSgpOwogICAgICovCiAgICBzdGF0aWMgQnVp
bGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxO
b0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IEhpZ2hsaWdodENvbmZpZygpKSk7CiAgICB9CiAgICB0
eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFNob3dJbmZv
KGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigic2hvd0luZm8iLCB2
YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRDb250ZW50Q29sb3IoLypQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpET006OlJnYmE+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQog
ICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgiY29udGVudENvbG9yIiwgdmFsdWUpOwogICAg
fQoKICAgIHZvaWQgc2V0UGFkZGluZ0NvbG9yKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9N
OjpSZ2JhPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRPYmplY3QoInBhZGRpbmdDb2xvciIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lk
IHNldEJvcmRlckNvbG9yKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9NOjpSZ2JhPiovIFBh
c3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRP
YmplY3QoImJvcmRlckNvbG9yIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0TWFyZ2luQ29s
b3IoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpET006OlJnYmE+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgibWFyZ2lu
Q29sb3IiLCB2YWx1ZSk7CiAgICB9Cn07Cgp9IC8vIERPTQoKbmFtZXNwYWNlIENTUyB7Ci8qIFRo
aXMgb2JqZWN0IGlkZW50aWZpZXMgYSBDU1Mgc3R5bGUgaW4gYSB1bmlxdWUgd2F5LiAqLwpjbGFz
cyBDU1NTdHlsZUlkIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0g
ewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQgPSAxIDw8
IDAsCiAgICAgICAgT3JkaW5hbFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAo
U3R5bGVTaGVldElkU2V0IHwgT3JkaW5hbFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNU
QVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRl
cjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
ICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1N0eWxlSWQ+IHB0cikKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVy
X2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsK
ICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlSWQ7CiAgICBwdWJsaWM6Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTdHlsZVNoZWV0SWRTZXQ+JiBzZXRTdHlsZVNoZWV0SWQo
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KCEoU1RBVEUgJiBTdHlsZVNoZWV0SWRTZXQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFk
eV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5bGVTaGVldElkU2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE9yZGluYWxTZXQ+JiBzZXRPcmRpbmFs
KGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBPcmRpbmFsU2V0KSwgcHJvcGVydHlfb3JkaW5hbF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAg
IG1fcmVzdWx0LT5zZXROdW1iZXIoIm9yZGluYWwiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVy
biBjYXN0U3RhdGU8T3JkaW5hbFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxDU1NTdHlsZUlkPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTU3R5bGVJZD4qPigmbV9yZXN1bHQp
OwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZUlkPiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZUlkPigqdGhpcyk7CiAg
ICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAg
ICogUmVmUHRyPENTU1N0eWxlSWQ+IHJlc3VsdCA9IENTU1N0eWxlSWQ6OmNyZWF0ZSgpCiAgICAg
KiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAgKiAgICAgLnNldE9yZGluYWwoLi4uKTsK
ICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAg
ICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NTdHlsZUlk
KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoK
LyogVGhpcyBvYmplY3QgaWRlbnRpZmllcyBhIENTUyBydWxlIGluIGEgdW5pcXVlIHdheS4gKi8K
Y2xhc3MgQ1NTUnVsZUlkIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVu
dW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0SWRTZXQgPSAx
IDw8IDAsCiAgICAgICAgT3JkaW5hbFNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQg
PSAoU3R5bGVTaGVldElkU2V0IHwgT3JkaW5hbFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50
IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVp
bGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPENTU1J1bGVJZD4gcHRyKQogICAgICAg
IHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxk
ZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRy
OwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTUnVsZUlkOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTaGVldElkU2V0PiYgc2V0U3R5bGVTaGVldElk
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VS
VCghKFNUQVRFICYgU3R5bGVTaGVldElkU2V0KSwgcHJvcGVydHlfc3R5bGVTaGVldElkX2FscmVh
ZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic3R5bGVTaGVldElkIiwg
dmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0eWxlU2hlZXRJZFNldD4oKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPcmRpbmFsU2V0PiYgc2V0T3JkaW5h
bChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgT3JkaW5hbFNldCksIHByb3BlcnR5X29yZGluYWxfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJvcmRpbmFsIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPE9yZGluYWxTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBS
ZWZQdHI8Q1NTUnVsZUlkPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q1NTUnVsZUlkPio+KCZtX3Jlc3VsdCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1J1bGVJZD4gKCkKICAg
ICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTUnVsZUlkPigqdGhpcyk7CiAgICAg
ICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICog
UmVmUHRyPENTU1J1bGVJZD4gcmVzdWx0ID0gQ1NTUnVsZUlkOjpjcmVhdGUoKQogICAgICogICAg
IC5zZXRTdHlsZVNoZWV0SWQoLi4uKQogICAgICogICAgIC5zZXRPcmRpbmFsKC4uLik7CiAgICAg
Ki8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAg
IHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgQ1NTUnVsZUlkKCkpKTsK
ICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogQ1NT
IHJ1bGUgY29sbGVjdGlvbiBmb3IgYSBzaW5nbGUgcHNldWRvIHN0eWxlLiAqLwpjbGFzcyBQc2V1
ZG9JZFJ1bGVzIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewog
ICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBQc2V1ZG9JZFNldCA9IDEgPDwgMCwKICAg
ICAgICBSdWxlc1NldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoUHNldWRvSWRT
ZXQgfCBSdWxlc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPFBzZXVkb0lkUnVsZXM+IHB0cikKICAgICAgICB7CiAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5f
bm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAg
ICAgICAgZnJpZW5kIGNsYXNzIFBzZXVkb0lkUnVsZXM7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBQc2V1ZG9JZFNldD4mIHNldFBzZXVkb0lkKGludCB2YWx1ZSkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBQc2V1ZG9JZFNldCksIHBy
b3BlcnR5X3BzZXVkb0lkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51
bWJlcigicHNldWRvSWQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UHNl
dWRvSWRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgUnVsZXNTZXQ+
JiBzZXRSdWxlcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpD
U1M6OkNTU1J1bGUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAg
ICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgUnVsZXNTZXQpLCBwcm9w
ZXJ0eV9ydWxlc19hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgi
cnVsZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8UnVsZXNTZXQ+KCk7
CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8UHNldWRvSWRSdWxlcz4mICgpCiAg
ICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQs
IHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nh
c3Q8UmVmUHRyPFBzZXVkb0lkUnVsZXM+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAg
IG9wZXJhdG9yIFBhc3NSZWZQdHI8UHNldWRvSWRSdWxlcz4gKCkKICAgICAgICB7CiAgICAgICAg
ICAgIHJldHVybiBSZWZQdHI8UHNldWRvSWRSdWxlcz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07
CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxQc2V1
ZG9JZFJ1bGVzPiByZXN1bHQgPSBQc2V1ZG9JZFJ1bGVzOjpjcmVhdGUoKQogICAgICogICAgIC5z
ZXRQc2V1ZG9JZCguLi4pCiAgICAgKiAgICAgLnNldFJ1bGVzKC4uLik7CiAgICAgKi8KICAgIHN0
YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBC
dWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgUHNldWRvSWRSdWxlcygpKSk7CiAgICB9
CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKfTsKCi8qIENTUyBydWxl
IGNvbGxlY3Rpb24gZm9yIGEgc2luZ2xlIHBzZXVkbyBzdHlsZS4gKi8KY2xhc3MgSW5oZXJpdGVk
U3R5bGVFbnRyeSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsK
ICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgTWF0Y2hlZENTU1J1bGVzU2V0ID0gMSA8
PCAwLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChNYXRjaGVkQ1NTUnVsZXNTZXQpCiAgICB9OwoK
ICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToK
ICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxh
dGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RF
UD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxJbmhlcml0
ZWRTdHlsZUVudHJ5PiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsK
ICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFz
cyBJbmhlcml0ZWRTdHlsZUVudHJ5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgTWF0Y2hlZENTU1J1bGVzU2V0PiYgc2V0TWF0Y2hlZENTU1J1bGVzKC8qUGFzc1JlZlB0cjxU
eXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTUnVsZSA+ID4qLyBQYXNzUmVm
UHRyPEluc3BlY3RvckFycmF5PiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKCEoU1RBVEUgJiBNYXRjaGVkQ1NTUnVsZXNTZXQpLCBwcm9wZXJ0eV9tYXRjaGVkQ1NT
UnVsZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoIm1hdGNo
ZWRDU1NSdWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNYXRjaGVk
Q1NTUnVsZXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8SW5oZXJp
dGVkU3R5bGVFbnRyeT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEluaGVyaXRlZFN0eWxlRW50cnk+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8SW5oZXJpdGVk
U3R5bGVFbnRyeT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8SW5oZXJp
dGVkU3R5bGVFbnRyeT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5
bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxJbmhlcml0ZWRTdHlsZUVudHJ5PiBy
ZXN1bHQgPSBJbmhlcml0ZWRTdHlsZUVudHJ5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXRNYXRj
aGVkQ1NTUnVsZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0
UmVmKG5ldyBJbmhlcml0ZWRTdHlsZUVudHJ5KCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0
SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwoKICAgIHZvaWQgc2V0SW5saW5lU3R5bGUoLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpDU1M6OkNTU1N0eWxlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoImlubGluZVN0eWxlIiwg
dmFsdWUpOwogICAgfQp9OwoKLyogQ1NTIHN0eWxlIGluZm9ybWF0aW9uIGZvciBhIERPTSBzdHls
ZSBhdHRyaWJ1dGUuICovCmNsYXNzIENTU1N0eWxlQXR0cmlidXRlIDogcHVibGljIEluc3BlY3Rv
ck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAg
ICAgICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFN0eWxlU2V0ID0gMSA8PCAxLAogICAgICAg
IEFsbEZpZWxkc1NldCA9IChOYW1lU2V0IHwgU3R5bGVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRl
PGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+
IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAg
IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsK
ICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4g
cHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVs
ZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1f
cmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTU3R5bGVBdHRy
aWJ1dGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0
TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoIShTVEFURSAmIE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxT
VEFURSB8IFN0eWxlU2V0PiYgc2V0U3R5bGUoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6
OkNTU1N0eWxlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTdHlsZVNldCksIHByb3BlcnR5
X3N0eWxlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE9iamVjdCgic3R5
bGUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5bGVTZXQ+KCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+JiAoKQog
ICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0
LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PFJlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZUF0dHJpYnV0ZT4gKCkKICAgICAgICB7
CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+KCp0aGlzKTsKICAg
ICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAg
KiBSZWZQdHI8Q1NTU3R5bGVBdHRyaWJ1dGU+IHJlc3VsdCA9IENTU1N0eWxlQXR0cmlidXRlOjpj
cmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0U3R5bGUoLi4u
KTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7
CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NTdHls
ZUF0dHJpYnV0ZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKfTsKCi8qIENTUyBzdHlsZXNoZWV0IG1ldGFpbmZvcm1hdGlvbi4gKi8KY2xhc3MgQ1NT
U3R5bGVTaGVldEhlYWRlciA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBl
bnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgU3R5bGVTaGVldElkU2V0ID0g
MSA8PCAwLAogICAgICAgIFNvdXJjZVVSTFNldCA9IDEgPDwgMSwKICAgICAgICBUaXRsZVNldCA9
IDEgPDwgMiwKICAgICAgICBEaXNhYmxlZFNldCA9IDEgPDwgMywKICAgICAgICBBbGxGaWVsZHNT
ZXQgPSAoU3R5bGVTaGVldElkU2V0IHwgU291cmNlVVJMU2V0IHwgVGl0bGVTZXQgfCBEaXNhYmxl
ZFNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7
CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoK
ICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3Rh
dGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxk
ZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNz
UmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9u
X2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAg
ICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2hlZXRIZWFkZXI7CiAgICBwdWJsaWM6CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBTdHlsZVNoZWV0SWRTZXQ+JiBzZXRTdHlsZVNoZWV0SWQoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBTdHlsZVNoZWV0SWRTZXQpLCBwcm9wZXJ0eV9zdHlsZVNoZWV0SWRfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJzdHlsZVNoZWV0SWQiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U3R5bGVTaGVldElkU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZVVSTFNldD4mIHNldFNvdXJjZVVSTChj
b25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIFNvdXJjZVVSTFNldCksIHByb3BlcnR5X3NvdXJjZVVSTF9hbHJlYWR5X3NldCk7
CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNvdXJjZVVSTCIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VVUkxTZXQ+KCk7CiAgICAgICAgfQoKICAg
ICAgICBCdWlsZGVyPFNUQVRFIHwgVGl0bGVTZXQ+JiBzZXRUaXRsZShjb25zdCBTdHJpbmcmIHZh
bHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRpdGxl
U2V0KSwgcHJvcGVydHlfdGl0bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+
c2V0U3RyaW5nKCJ0aXRsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxU
aXRsZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBEaXNhYmxlZFNl
dD4mIHNldERpc2FibGVkKGJvb2wgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgRGlzYWJsZWRTZXQpLCBwcm9wZXJ0eV9kaXNhYmxlZF9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRCb29sZWFuKCJkaXNhYmxlZCIsIHZhbHVl
KTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxEaXNhYmxlZFNldD4oKTsKICAgICAgICB9
CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiYgKCkKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVz
dWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxS
ZWZQdHI8Q1NTU3R5bGVTaGVldEhlYWRlcj4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPiAoKQogICAgICAgIHsK
ICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0SGVhZGVyPigqdGhpcyk7CiAg
ICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAg
ICogUmVmUHRyPENTU1N0eWxlU2hlZXRIZWFkZXI+IHJlc3VsdCA9IENTU1N0eWxlU2hlZXRIZWFk
ZXI6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAgKiAgICAg
LnNldFNvdXJjZVVSTCguLi4pCiAgICAgKiAgICAgLnNldFRpdGxlKC4uLikKICAgICAqICAgICAu
c2V0RGlzYWJsZWQoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0
UmVmKG5ldyBDU1NTdHlsZVNoZWV0SGVhZGVyKCkpKTsKICAgIH0KICAgIHR5cGVkZWYgU3RydWN0
SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogQ1NTIHN0eWxlc2hlZXQgY29udGVudHMuICov
CmNsYXNzIENTU1N0eWxlU2hlZXRCb2R5IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1Ymxp
YzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTdHlsZVNoZWV0
SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgUnVsZXNTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmll
bGRzU2V0ID0gKFN0eWxlU2hlZXRJZFNldCB8IFJ1bGVzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0
ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQ
PiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAg
ICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7
CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q1NTU3R5bGVTaGVldEJvZHk+
IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmll
bGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBt
X3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIENTU1N0eWxlU2hl
ZXRCb2R5OwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTaGVldElk
U2V0PiYgc2V0U3R5bGVTaGVldElkKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3R5bGVTaGVldElkU2V0KSwgcHJvcGVy
dHlfc3R5bGVTaGVldElkX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0
cmluZygic3R5bGVTaGVldElkIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PFN0eWxlU2hlZXRJZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBS
dWxlc1NldD4mIHNldFJ1bGVzKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1
aWxkZXI6OkNTUzo6Q1NTUnVsZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBSdWxlc1Nl
dCksIHByb3BlcnR5X3J1bGVzX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNl
dEFycmF5KCJydWxlcyIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxSdWxl
c1NldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NTdHlsZVNoZWV0
Qm9keT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBB
bGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJl
aW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5Pio+KCZtX3Jlc3VsdCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU1N0eWxlU2hlZXRCb2R5PiAo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4o
KnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1
Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NTdHlsZVNoZWV0Qm9keT4gcmVzdWx0ID0gQ1NTU3R5bGVT
aGVldEJvZHk6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFN0eWxlU2hlZXRJZCguLi4pCiAgICAg
KiAgICAgLnNldFJ1bGVzKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRz
U2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0Pihh
ZG9wdFJlZihuZXcgQ1NTU3R5bGVTaGVldEJvZHkoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1
Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAg
fQp9OwoKLyogQ1NTIHJ1bGUgcmVwcmVzZW50YXRpb24uICovCmNsYXNzIENTU1J1bGUgOiBwdWJs
aWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFtZWQgYWZ0ZXIgcHJvcGVydHkg
bmFtZSAnb3JpZ2luJyB3aGlsZSBnZW5lcmF0aW5nIENTU1J1bGUuCiAgICBzdHJ1Y3QgT3JpZ2lu
IHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBVc2VyID0gNDAsCiAgICAgICAgICAg
IFVzZXJfYWdlbnQgPSA0MSwKICAgICAgICAgICAgSW5zcGVjdG9yID0gNDIsCiAgICAgICAgICAg
IFJlZ3VsYXIgPSA0MywKICAgICAgICB9OwogICAgfTsgLy8gc3RydWN0IE9yaWdpbgoKICAgIGVu
dW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTZWxlY3RvclRleHRTZXQgPSAx
IDw8IDAsCiAgICAgICAgU291cmNlTGluZVNldCA9IDEgPDwgMSwKICAgICAgICBPcmlnaW5TZXQg
PSAxIDw8IDIsCiAgICAgICAgU3R5bGVTZXQgPSAxIDw8IDMsCiAgICAgICAgQWxsRmllbGRzU2V0
ID0gKFNlbGVjdG9yVGV4dFNldCB8IFNvdXJjZUxpbmVTZXQgfCBPcmlnaW5TZXQgfCBTdHlsZVNl
dCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAg
ICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAg
ICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUo
KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8
U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVm
UHRyPENTU1J1bGU+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNU
QVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwog
ICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNz
IENTU1J1bGU7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZWxlY3RvclRl
eHRTZXQ+JiBzZXRTZWxlY3RvclRleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTZWxlY3RvclRleHRTZXQpLCBwcm9w
ZXJ0eV9zZWxlY3RvclRleHRfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
U3RyaW5nKCJzZWxlY3RvclRleHQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8U2VsZWN0b3JUZXh0U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8
IFNvdXJjZUxpbmVTZXQ+JiBzZXRTb3VyY2VMaW5lKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTb3VyY2VMaW5lU2V0KSwgcHJvcGVydHlf
c291cmNlTGluZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIo
InNvdXJjZUxpbmUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U291cmNl
TGluZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPcmlnaW5TZXQ+
JiBzZXRPcmlnaW4oT3JpZ2luOjpFbnVtIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoIShTVEFURSAmIE9yaWdpblNldCksIHByb3BlcnR5X29yaWdpbl9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIsIGdldEVudW1D
b25zdGFudFZhbHVlKHZhbHVlKSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8T3JpZ2lu
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IE9yaWdpblNldD4mIHNl
dE9yaWdpbihjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElM
RV9BU1NFUlQoIShTVEFURSAmIE9yaWdpblNldCksIHByb3BlcnR5X29yaWdpbl9hbHJlYWR5X3Nl
dCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoIm9yaWdpbiIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxPcmlnaW5TZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBCdWlsZGVyPFNUQVRFIHwgU3R5bGVTZXQ+JiBzZXRTdHlsZSgvKlBhc3NSZWZQdHI8VHlwZUJ1
aWxkZXI6OkNTUzo6Q1NTU3R5bGU+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVl
KQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFN0eWxlU2V0
KSwgcHJvcGVydHlfc3R5bGVfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0
T2JqZWN0KCJzdHlsZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTdHls
ZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxDU1NSdWxlPiYgKCkK
ICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1Nl
dCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRf
Y2FzdDxSZWZQdHI8Q1NTUnVsZT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3Bl
cmF0b3IgUGFzc1JlZlB0cjxDU1NSdWxlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJu
IFJlZlB0cjxDU1NSdWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1J1bGU+IHJlc3VsdCA9IENT
U1J1bGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFNlbGVjdG9yVGV4dCguLi4pCiAgICAgKiAg
ICAgLnNldFNvdXJjZUxpbmUoLi4uKQogICAgICogICAgIC5zZXRPcmlnaW4oLi4uKQogICAgICog
ICAgIC5zZXRTdHlsZSguLi4pOwogICAgICovCiAgICBzdGF0aWMgQnVpbGRlcjxOb0ZpZWxkc1Nl
dD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVpbGRlcjxOb0ZpZWxkc1NldD4oYWRv
cHRSZWYobmV3IENTU1J1bGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRz
IEl0ZW1UcmFpdHM7CgogICAgdm9pZCBzZXRSdWxlSWQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVy
OjpDU1M6OkNTU1J1bGVJZD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAg
ICB7CiAgICAgICAgdGhpcy0+c2V0T2JqZWN0KCJydWxlSWQiLCB2YWx1ZSk7CiAgICB9CgogICAg
dm9pZCBzZXRTb3VyY2VVUkwoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlz
LT5zZXRTdHJpbmcoInNvdXJjZVVSTCIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFNlbGVj
dG9yUmFuZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OlNvdXJjZVJhbmdlPiovIFBh
c3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRP
YmplY3QoInNlbGVjdG9yUmFuZ2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRNZWRpYSgv
KlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpDU1M6OkNTU01lZGlh
ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAgICAgIHRo
aXMtPnNldEFycmF5KCJtZWRpYSIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIFRleHQgcmFuZ2Ugd2l0
aGluIGEgcmVzb3VyY2UuICovCmNsYXNzIFNvdXJjZVJhbmdlIDogcHVibGljIEluc3BlY3Rvck9i
amVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAg
ICBTdGFydFNldCA9IDEgPDwgMCwKICAgICAgICBFbmRTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxs
RmllbGRzU2V0ID0gKFN0YXJ0U2V0IHwgRW5kU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQg
U1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWls
ZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U291cmNlUmFuZ2U+IHB0cikKICAgICAg
ICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWls
ZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0
cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNvdXJjZVJhbmdlOwogICAgcHVibGlj
OgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU3RhcnRTZXQ+JiBzZXRTdGFydChpbnQgdmFsdWUp
CiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU3RhcnRTZXQp
LCBwcm9wZXJ0eV9zdGFydF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRO
dW1iZXIoInN0YXJ0IiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFN0YXJ0
U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IEVuZFNldD4mIHNldEVu
ZChpbnQgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgRW5kU2V0KSwgcHJvcGVydHlfZW5kX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldE51bWJlcigiZW5kIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRl
PEVuZFNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxTb3VyY2VSYW5n
ZT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxG
aWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50
ZXJwcmV0X2Nhc3Q8UmVmUHRyPFNvdXJjZVJhbmdlPio+KCZtX3Jlc3VsdCk7CiAgICAgICAgfQoK
ICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPFNvdXJjZVJhbmdlPiAoKQogICAgICAgIHsKICAg
ICAgICAgICAgcmV0dXJuIFJlZlB0cjxTb3VyY2VSYW5nZT4oKnRoaXMpOwogICAgICAgIH0KICAg
IH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxT
b3VyY2VSYW5nZT4gcmVzdWx0ID0gU291cmNlUmFuZ2U6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNl
dFN0YXJ0KC4uLikKICAgICAqICAgICAuc2V0RW5kKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBC
dWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVy
PE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgU291cmNlUmFuZ2UoKSkpOwogICAgfQogICAgdHlw
ZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgpjbGFzcyBDU1NDb21wdXRlZFN0
eWxlUHJvcGVydHkgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7
CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAogICAgICAgIE5hbWVTZXQgPSAxIDw8IDAsCiAgICAg
ICAgVmFsdWVTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKE5hbWVTZXQgfCBW
YWx1ZVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRl
ZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAg
IH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5OwogICAgcHVi
bGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTmFtZVNldD4mIHNldE5hbWUoY29uc3QgU3Ry
aW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUg
JiBOYW1lU2V0KSwgcHJvcGVydHlfbmFtZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVz
dWx0LT5zZXRTdHJpbmcoIm5hbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3Rh
dGU8TmFtZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBWYWx1ZVNl
dD4mIHNldFZhbHVlKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBD
T01QSUxFX0FTU0VSVCghKFNUQVRFICYgVmFsdWVTZXQpLCBwcm9wZXJ0eV92YWx1ZV9hbHJlYWR5
X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInZhbHVlIiwgdmFsdWUpOwog
ICAgICAgICAgICByZXR1cm4gY2FzdFN0YXRlPFZhbHVlU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4mICgpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3Vs
dF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVm
UHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAg
ICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+ICgpCiAg
ICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0
eT4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25z
dHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxDU1NDb21wdXRlZFN0eWxlUHJvcGVydHk+IHJlc3VsdCA9
IENTU0NvbXB1dGVkU3R5bGVQcm9wZXJ0eTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TmFtZSgu
Li4pCiAgICAgKiAgICAgLnNldFZhbHVlKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVy
PE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmll
bGRzU2V0PihhZG9wdFJlZihuZXcgQ1NTQ29tcHV0ZWRTdHlsZVByb3BlcnR5KCkpKTsKICAgIH0K
ICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKLyogQ1NTIHN0eWxl
IHJlcHJlc2VudGF0aW9uLiAqLwpjbGFzcyBDU1NTdHlsZSA6IHB1YmxpYyBJbnNwZWN0b3JPYmpl
Y3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAg
Q3NzUHJvcGVydGllc1NldCA9IDEgPDwgMCwKICAgICAgICBTaG9ydGhhbmRFbnRyaWVzU2V0ID0g
MSA8PCAxLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChDc3NQcm9wZXJ0aWVzU2V0IHwgU2hvcnRo
YW5kRW50cmllc1NldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3Mg
QnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1f
cmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+
JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9j
YXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcihQYXNzUmVmUHRyPENTU1N0eWxlPiBwdHIpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRlcl9jcmVhdGVkX2luX25vbl9p
bml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7CiAgICAgICAgfQogICAgICAg
IGZyaWVuZCBjbGFzcyBDU1NTdHlsZTsKICAgIHB1YmxpYzoKCiAgICAgICAgQnVpbGRlcjxTVEFU
RSB8IENzc1Byb3BlcnRpZXNTZXQ+JiBzZXRDc3NQcm9wZXJ0aWVzKC8qUGFzc1JlZlB0cjxUeXBl
QnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNTUzo6Q1NTUHJvcGVydHkgPiA+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxF
X0FTU0VSVCghKFNUQVRFICYgQ3NzUHJvcGVydGllc1NldCksIHByb3BlcnR5X2Nzc1Byb3BlcnRp
ZXNfYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoImNzc1Byb3Bl
cnRpZXMiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8Q3NzUHJvcGVydGll
c1NldD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTaG9ydGhhbmRFbnRy
aWVzU2V0PiYgc2V0U2hvcnRoYW5kRW50cmllcygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFy
cmF5PEluc3BlY3Rvck9iamVjdCA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTaG9ydGhh
bmRFbnRyaWVzU2V0KSwgcHJvcGVydHlfc2hvcnRoYW5kRW50cmllc19hbHJlYWR5X3NldCk7CiAg
ICAgICAgICAgIG1fcmVzdWx0LT5zZXRBcnJheSgic2hvcnRoYW5kRW50cmllcyIsIHZhbHVlKTsK
ICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTaG9ydGhhbmRFbnRyaWVzU2V0PigpOwogICAg
ICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPENTU1N0eWxlPiYgKCkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lz
X25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8
Q1NTU3R5bGU+Kj4oJm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NS
ZWZQdHI8Q1NTU3R5bGU+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPENT
U1N0eWxlPigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGlj
IGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPENTU1N0eWxlPiByZXN1bHQgPSBDU1NTdHlsZTo6
Y3JlYXRlKCkKICAgICAqICAgICAuc2V0Q3NzUHJvcGVydGllcyguLi4pCiAgICAgKiAgICAgLnNl
dFNob3J0aGFuZEVudHJpZXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
KGFkb3B0UmVmKG5ldyBDU1NTdHlsZSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1U
cmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFN0eWxlSWQoLypQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpDU1M6OkNTU1N0eWxlSWQ+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZh
bHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVjdCgic3R5bGVJZCIsIHZhbHVlKTsKICAg
IH0KCiAgICB2b2lkIHNldENzc1RleHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRTdHJpbmcoImNzc1RleHQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRS
YW5nZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6U291cmNlUmFuZ2U+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE9iamVj
dCgicmFuZ2UiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRXaWR0aChjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygid2lkdGgiLCB2YWx1ZSk7CiAg
ICB9CgogICAgdm9pZCBzZXRIZWlnaHQoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAg
ICB0aGlzLT5zZXRTdHJpbmcoImhlaWdodCIsIHZhbHVlKTsKICAgIH0KfTsKCi8qIENTUyBzdHls
ZSBlZmZlY3RpdmUgdmlzdWFsIGRpbWVuc2lvbnMgYW5kIHNvdXJjZSBvZmZzZXRzLiAqLwpjbGFz
cyBDU1NQcm9wZXJ0eSA6IHB1YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICAvLyBO
YW1lZCBhZnRlciBwcm9wZXJ0eSBuYW1lICdzdGF0dXMnIHdoaWxlIGdlbmVyYXRpbmcgQ1NTUHJv
cGVydHkuCiAgICBzdHJ1Y3QgU3RhdHVzIHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAg
ICBBY3RpdmUgPSA0NCwKICAgICAgICAgICAgSW5hY3RpdmUgPSA0NSwKICAgICAgICAgICAgRGlz
YWJsZWQgPSA0NiwKICAgICAgICAgICAgU3R5bGUgPSA0NywKICAgICAgICB9OwogICAgfTsgLy8g
c3RydWN0IFN0YXR1cwoKICAgIGVudW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAg
ICBOYW1lU2V0ID0gMSA8PCAwLAogICAgICAgIFZhbHVlU2V0ID0gMSA8PCAxLAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChOYW1lU2V0IHwgVmFsdWVTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGlu
dCBTVEFURT4KICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAg
ICAgICB9CgogICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NQcm9wZXJ0eT4gcHRyKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1
aWxkZXJfY3JlYXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0g
cHRyOwogICAgICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTUHJvcGVydHk7CiAgICBwdWJs
aWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBOYW1lU2V0PiYgc2V0TmFtZShjb25zdCBTdHJp
bmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAm
IE5hbWVTZXQpLCBwcm9wZXJ0eV9uYW1lX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1
bHQtPnNldFN0cmluZygibmFtZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0
ZTxOYW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFZhbHVlU2V0
PiYgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBWYWx1ZVNldCksIHByb3BlcnR5X3ZhbHVlX2FscmVhZHlf
c2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAg
ICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VmFsdWVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAg
ICBvcGVyYXRvciBSZWZQdHI8Q1NTUHJvcGVydHk+JiAoKQogICAgICAgIHsKICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5
KTsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxDU1NQcm9wZXJ0
eT4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxD
U1NQcm9wZXJ0eT4gKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q1NTUHJv
cGVydHk+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0aWMg
Y29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8Q1NTUHJvcGVydHk+IHJlc3VsdCA9IENTU1Byb3Bl
cnR5OjpjcmVhdGUoKQogICAgICogICAgIC5zZXROYW1lKC4uLikKICAgICAqICAgICAuc2V0VmFs
dWUoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgp
CiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBD
U1NQcm9wZXJ0eSgpKSk7CiAgICB9CiAgICB0eXBlZGVmIFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRy
YWl0czsKCiAgICB2b2lkIHNldFByaW9yaXR5KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAg
ICAgICAgdGhpcy0+c2V0U3RyaW5nKCJwcmlvcml0eSIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lk
IHNldEltcGxpY2l0KGJvb2wgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0Qm9vbGVhbigi
aW1wbGljaXQiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYg
dmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJ0ZXh0IiwgdmFsdWUpOwogICAg
fQoKICAgIHZvaWQgc2V0UGFyc2VkT2soYm9vbCB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5z
ZXRCb29sZWFuKCJwYXJzZWRPayIsIHZhbHVlKTsKICAgIH0KCiAgICB2b2lkIHNldFN0YXR1cyhT
dGF0dXM6OkVudW0gdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0dXMi
LCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgfQoKICAgIHZvaWQgc2V0U3RhdHVz
KGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzdGF0
dXMiLCB2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBzZXRTaG9ydGhhbmROYW1lKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJzaG9ydGhhbmROYW1lIiwg
dmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0UmFuZ2UoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVy
OjpDU1M6OlNvdXJjZVJhbmdlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkK
ICAgIHsKICAgICAgICB0aGlzLT5zZXRPYmplY3QoInJhbmdlIiwgdmFsdWUpOwogICAgfQp9OwoK
LyogQ1NTIG1lZGlhIHF1ZXJ5IGRlc2NyaXB0b3IuICovCmNsYXNzIENTU01lZGlhIDogcHVibGlj
IEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIC8vIE5hbWVkIGFmdGVyIHByb3BlcnR5IG5h
bWUgJ3NvdXJjZScgd2hpbGUgZ2VuZXJhdGluZyBDU1NNZWRpYS4KICAgIHN0cnVjdCBTb3VyY2Ug
ewogICAgICAgIGVudW0gRW51bSB7CiAgICAgICAgICAgIE1lZGlhUnVsZSA9IDQ4LAogICAgICAg
ICAgICBJbXBvcnRSdWxlID0gNDksCiAgICAgICAgICAgIExpbmtlZFNoZWV0ID0gNTAsCiAgICAg
ICAgICAgIElubGluZVNoZWV0ID0gNTEsCiAgICAgICAgfTsKICAgIH07IC8vIHN0cnVjdCBTb3Vy
Y2UKCiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAgICAgVGV4dFNldCA9
IDEgPDwgMCwKICAgICAgICBTb3VyY2VTZXQgPSAxIDw8IDEsCiAgICAgICAgQWxsRmllbGRzU2V0
ID0gKFRleHRTZXQgfCBTb3VyY2VTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4K
ICAgIGNsYXNzIEJ1aWxkZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBtX3Jlc3VsdDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RB
VEUgfCBTVEVQPiYgY2FzdFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVp
bnRlcnByZXRfY2FzdDxCdWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9Cgog
ICAgICAgIEJ1aWxkZXIoUGFzc1JlZlB0cjxDU1NNZWRpYT4gcHRyKQogICAgICAgIHsKICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRl
ZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAg
IH0KICAgICAgICBmcmllbmQgY2xhc3MgQ1NTTWVkaWE7CiAgICBwdWJsaWM6CgogICAgICAgIEJ1
aWxkZXI8U1RBVEUgfCBUZXh0U2V0PiYgc2V0VGV4dChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAg
ICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFRleHRTZXQpLCBwcm9w
ZXJ0eV90ZXh0X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygi
dGV4dCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxUZXh0U2V0PigpOwog
ICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IFNvdXJjZVNldD4mIHNldFNvdXJjZShT
b3VyY2U6OkVudW0gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCgh
KFNUQVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAg
ICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgZ2V0RW51bUNvbnN0YW50VmFsdWUo
dmFsdWUpKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxTb3VyY2VTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgU291cmNlU2V0PiYgc2V0U291cmNlKGNvbnN0
IFN0cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNU
QVRFICYgU291cmNlU2V0KSwgcHJvcGVydHlfc291cmNlX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldFN0cmluZygic291cmNlIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1
cm4gY2FzdFN0YXRlPFNvdXJjZVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxDU1NNZWRpYT4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChT
VEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAgICAgICBy
ZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPENTU01lZGlhPio+KCZtX3Jlc3VsdCk7CiAg
ICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENTU01lZGlhPiAoKQogICAgICAg
IHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxDU1NNZWRpYT4oKnRoaXMpOwogICAgICAgIH0K
ICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRpYyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0
cjxDU1NNZWRpYT4gcmVzdWx0ID0gQ1NTTWVkaWE6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFRl
eHQoLi4uKQogICAgICogICAgIC5zZXRTb3VyY2UoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1
aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8
Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDU1NNZWRpYSgpKSk7CiAgICB9CiAgICB0eXBlZGVm
IFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldFNvdXJjZVVSTChjb25z
dCBTdHJpbmcmIHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldFN0cmluZygic291cmNlVVJM
IiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0U291cmNlTGluZShpbnQgdmFsdWUpCiAgICB7
CiAgICAgICAgdGhpcy0+c2V0TnVtYmVyKCJzb3VyY2VMaW5lIiwgdmFsdWUpOwogICAgfQp9OwoK
LyogQ1NTIHNlbGVjdG9yIHByb2ZpbGUgZW50cnkuICovCmNsYXNzIFNlbGVjdG9yUHJvZmlsZUVu
dHJ5IDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVudW0gewogICAgICAg
IE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBTZWxlY3RvclNldCA9IDEgPDwgMCwKICAgICAgICBV
cmxTZXQgPSAxIDw8IDEsCiAgICAgICAgTGluZU51bWJlclNldCA9IDEgPDwgMiwKICAgICAgICBU
aW1lU2V0ID0gMSA8PCAzLAogICAgICAgIEhpdENvdW50U2V0ID0gMSA8PCA0LAogICAgICAgIE1h
dGNoQ291bnRTZXQgPSAxIDw8IDUsCiAgICAgICAgQWxsRmllbGRzU2V0ID0gKFNlbGVjdG9yU2V0
IHwgVXJsU2V0IHwgTGluZU51bWJlclNldCB8IFRpbWVTZXQgfCBIaXRDb3VudFNldCB8IE1hdGNo
Q291bnRTZXQpCiAgICB9OwoKICAgIHRlbXBsYXRlPGludCBTVEFURT4KICAgIGNsYXNzIEJ1aWxk
ZXIgewogICAgcHJpdmF0ZToKICAgICAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtX3Jlc3Vs
dDsKCiAgICAgICAgdGVtcGxhdGU8aW50IFNURVA+IEJ1aWxkZXI8U1RBVEUgfCBTVEVQPiYgY2Fz
dFN0YXRlKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxC
dWlsZGVyPFNUQVRFIHwgU1RFUD4qPih0aGlzKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXIo
UGFzc1JlZlB0cjxTZWxlY3RvclByb2ZpbGVFbnRyeT4gcHRyKQogICAgICAgIHsKICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9p
bl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0K
ICAgICAgICBmcmllbmQgY2xhc3MgU2VsZWN0b3JQcm9maWxlRW50cnk7CiAgICBwdWJsaWM6Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBTZWxlY3RvclNldD4mIHNldFNlbGVjdG9yKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRF
ICYgU2VsZWN0b3JTZXQpLCBwcm9wZXJ0eV9zZWxlY3Rvcl9hbHJlYWR5X3NldCk7CiAgICAgICAg
ICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInNlbGVjdG9yIiwgdmFsdWUpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFNlbGVjdG9yU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IFVybFNldD4mIHNldFVybChjb25zdCBTdHJpbmcmIHZhbHVlKQogICAgICAgIHsK
ICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIFVybFNldCksIHByb3BlcnR5X3Vy
bF9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInVybCIsIHZh
bHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxVcmxTZXQ+KCk7CiAgICAgICAgfQoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51bWJlclNldD4mIHNldExpbmVOdW1iZXIoaW50
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIExp
bmVOdW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5lTnVtYmVyX2FscmVhZHlfc2V0KTsKICAgICAgICAg
ICAgbV9yZXN1bHQtPnNldE51bWJlcigibGluZU51bWJlciIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVyU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVp
bGRlcjxTVEFURSB8IFRpbWVTZXQ+JiBzZXRUaW1lKGRvdWJsZSB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUaW1lU2V0KSwgcHJvcGVydHlfdGlt
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXROdW1iZXIoInRpbWUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VGltZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBIaXRDb3VudFNldD4mIHNldEhpdENvdW50KGludCB2
YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBIaXRD
b3VudFNldCksIHByb3BlcnR5X2hpdENvdW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldE51bWJlcigiaGl0Q291bnQiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBj
YXN0U3RhdGU8SGl0Q291bnRTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRF
IHwgTWF0Y2hDb3VudFNldD4mIHNldE1hdGNoQ291bnQoaW50IHZhbHVlKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIE1hdGNoQ291bnRTZXQpLCBwcm9wZXJ0
eV9tYXRjaENvdW50X2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJl
cigibWF0Y2hDb3VudCIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxNYXRj
aENvdW50U2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVmUHRyPFNlbGVjdG9y
UHJvZmlsZUVudHJ5PiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNU
QVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJl
dHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8U2VsZWN0b3JQcm9maWxlRW50cnk+Kj4oJm1f
cmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U2VsZWN0b3JQ
cm9maWxlRW50cnk+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPFNlbGVj
dG9yUHJvZmlsZUVudHJ5PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICog
U3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFNlbGVjdG9yUHJvZmlsZUVudHJ5
PiByZXN1bHQgPSBTZWxlY3RvclByb2ZpbGVFbnRyeTo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0
U2VsZWN0b3IoLi4uKQogICAgICogICAgIC5zZXRVcmwoLi4uKQogICAgICogICAgIC5zZXRMaW5l
TnVtYmVyKC4uLikKICAgICAqICAgICAuc2V0VGltZSguLi4pCiAgICAgKiAgICAgLnNldEhpdENv
dW50KC4uLikKICAgICAqICAgICAuc2V0TWF0Y2hDb3VudCguLi4pOwogICAgICovCiAgICBzdGF0
aWMgQnVpbGRlcjxOb0ZpZWxkc1NldD4gY3JlYXRlKCkKICAgIHsKICAgICAgICByZXR1cm4gQnVp
bGRlcjxOb0ZpZWxkc1NldD4oYWRvcHRSZWYobmV3IFNlbGVjdG9yUHJvZmlsZUVudHJ5KCkpKTsK
ICAgIH0KICAgIHR5cGVkZWYgU3RydWN0SXRlbVRyYWl0cyBJdGVtVHJhaXRzOwp9OwoKY2xhc3Mg
U2VsZWN0b3JQcm9maWxlIDogcHVibGljIEluc3BlY3Rvck9iamVjdCB7CnB1YmxpYzoKICAgIGVu
dW0gewogICAgICAgIE5vRmllbGRzU2V0ID0gMCwKICAgICAgICBUb3RhbFRpbWVTZXQgPSAxIDw8
IDAsCiAgICAgICAgRGF0YVNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoVG90
YWxUaW1lU2V0IHwgRGF0YVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAg
Y2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8
IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVy
cHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAg
ICAgQnVpbGRlcihQYXNzUmVmUHRyPFNlbGVjdG9yUHJvZmlsZT4gcHRyKQogICAgICAgIHsKICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3Jl
YXRlZF9pbl9ub25faW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAg
ICAgIH0KICAgICAgICBmcmllbmQgY2xhc3MgU2VsZWN0b3JQcm9maWxlOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVG90YWxUaW1lU2V0PiYgc2V0VG90YWxUaW1lKGRvdWJs
ZSB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBU
b3RhbFRpbWVTZXQpLCBwcm9wZXJ0eV90b3RhbFRpbWVfYWxyZWFkeV9zZXQpOwogICAgICAgICAg
ICBtX3Jlc3VsdC0+c2V0TnVtYmVyKCJ0b3RhbFRpbWUiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8VG90YWxUaW1lU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRl
cjxTVEFURSB8IERhdGFTZXQ+JiBzZXREYXRhKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJy
YXk8VHlwZUJ1aWxkZXI6OkNTUzo6U2VsZWN0b3JQcm9maWxlRW50cnkgPiA+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVCghKFNUQVRFICYgRGF0YVNldCksIHByb3BlcnR5X2RhdGFfYWxyZWFkeV9zZXQpOwogICAg
ICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoImRhdGEiLCB2YWx1ZSk7CiAgICAgICAgICAgIHJl
dHVybiBjYXN0U3RhdGU8RGF0YVNldD4oKTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFJl
ZlB0cjxTZWxlY3RvclByb2ZpbGU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoU1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAg
ICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxTZWxlY3RvclByb2ZpbGU+Kj4o
Jm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8U2VsZWN0
b3JQcm9maWxlPiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFJlZlB0cjxTZWxlY3Rv
clByb2ZpbGU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qCiAgICAgKiBTeW50aGV0
aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2VsZWN0b3JQcm9maWxlPiByZXN1bHQgPSBT
ZWxlY3RvclByb2ZpbGU6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFRvdGFsVGltZSguLi4pCiAg
ICAgKiAgICAgLnNldERhdGEoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVs
ZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+
KGFkb3B0UmVmKG5ldyBTZWxlY3RvclByb2ZpbGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1
Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07Cgp9IC8vIENTUwoKbmFtZXNwYWNlIFRpbWVsaW5l
IHsKLyogVGltZWxpbmUgcmVjb3JkIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNv
cmRlZCBhY3Rpdml0eS4gKi8KY2xhc3MgVGltZWxpbmVFdmVudCA6IHB1YmxpYyBJbnNwZWN0b3JP
YmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1NldCA9IDAsCiAgICAg
ICAgVHlwZVNldCA9IDEgPDwgMCwKICAgICAgICBEYXRhU2V0ID0gMSA8PCAxLAogICAgICAgIEFs
bEZpZWxkc1NldCA9IChUeXBlU2V0IHwgRGF0YVNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50
IFNUQVRFPgogICAgY2xhc3MgQnVpbGRlciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVp
bGRlcjxTVEFURSB8IFNURVA+JiBjYXN0U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuICpyZWludGVycHJldF9jYXN0PEJ1aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAg
ICAgIH0KCiAgICAgICAgQnVpbGRlcihQYXNzUmVmUHRyPFRpbWVsaW5lRXZlbnQ+IHB0cikKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFRpbWVsaW5lRXZlbnQ7CiAgICBw
dWJsaWM6CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUeXBlU2V0PiYgc2V0VHlwZShjb25zdCBT
dHJpbmcmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIFR5cGVTZXQpLCBwcm9wZXJ0eV90eXBlX2FscmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9y
ZXN1bHQtPnNldFN0cmluZygidHlwZSIsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGNhc3RT
dGF0ZTxUeXBlU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IERhdGFT
ZXQ+JiBzZXREYXRhKFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiB2YWx1ZSkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBEYXRhU2V0KSwgcHJvcGVydHlf
ZGF0YV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoImRhdGEi
LCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RGF0YVNldD4oKTsKICAgICAg
ICB9CgogICAgICAgIG9wZXJhdG9yIFJlZlB0cjxUaW1lbGluZUV2ZW50PiYgKCkKICAgICAgICB7
CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0
X2lzX25vdF9yZWFkeSk7CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQ
dHI8VGltZWxpbmVFdmVudD4qPigmbV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0
b3IgUGFzc1JlZlB0cjxUaW1lbGluZUV2ZW50PiAoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0
dXJuIFJlZlB0cjxUaW1lbGluZUV2ZW50PigqdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICAv
KgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgogICAgICogUmVmUHRyPFRpbWVsaW5lRXZl
bnQ+IHJlc3VsdCA9IFRpbWVsaW5lRXZlbnQ6OmNyZWF0ZSgpCiAgICAgKiAgICAgLnNldFR5cGUo
Li4uKQogICAgICogICAgIC5zZXREYXRhKC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVy
PE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmll
bGRzU2V0PihhZG9wdFJlZihuZXcgVGltZWxpbmVFdmVudCgpKSk7CiAgICB9CiAgICB0eXBlZGVm
IFN0cnVjdEl0ZW1UcmFpdHMgSXRlbVRyYWl0czsKCiAgICB2b2lkIHNldENoaWxkcmVuKC8qUGFz
c1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OlRpbWVsaW5lOjpUaW1lbGlu
ZUV2ZW50ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlKQogICAgewogICAg
ICAgIHRoaXMtPnNldEFycmF5KCJjaGlsZHJlbiIsIHZhbHVlKTsKICAgIH0KfTsKCn0gLy8gVGlt
ZWxpbmUKCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKbmFtZXNwYWNlIERlYnVnZ2Vy
IHsKLyogTG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLiAqLwpjbGFzcyBMb2NhdGlvbiA6IHB1
YmxpYyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxk
c1NldCA9IDAsCiAgICAgICAgU2NyaXB0SWRTZXQgPSAxIDw8IDAsCiAgICAgICAgTGluZU51bWJl
clNldCA9IDEgPDwgMSwKICAgICAgICBBbGxGaWVsZHNTZXQgPSAoU2NyaXB0SWRTZXQgfCBMaW5l
TnVtYmVyU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWls
ZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1
bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNh
c3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8
QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVy
KFBhc3NSZWZQdHI8TG9jYXRpb24+IHB0cikKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBidWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRf
c3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJp
ZW5kIGNsYXNzIExvY2F0aW9uOwogICAgcHVibGljOgoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwg
U2NyaXB0SWRTZXQ+JiBzZXRTY3JpcHRJZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6
U2NyaXB0SWQmKi8gY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBTY3JpcHRJZFNldCksIHByb3BlcnR5X3NjcmlwdElkX2Fs
cmVhZHlfc2V0KTsKICAgICAgICAgICAgbV9yZXN1bHQtPnNldFN0cmluZygic2NyaXB0SWQiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2NyaXB0SWRTZXQ+KCk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyPFNUQVRFIHwgTGluZU51bWJlclNldD4mIHNldExpbmVOdW1i
ZXIoaW50IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFU
RSAmIExpbmVOdW1iZXJTZXQpLCBwcm9wZXJ0eV9saW5lTnVtYmVyX2FscmVhZHlfc2V0KTsKICAg
ICAgICAgICAgbV9yZXN1bHQtPnNldE51bWJlcigibGluZU51bWJlciIsIHZhbHVlKTsKICAgICAg
ICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMaW5lTnVtYmVyU2V0PigpOwogICAgICAgIH0KCiAgICAg
ICAgb3BlcmF0b3IgUmVmUHRyPExvY2F0aW9uPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENP
TVBJTEVfQVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7
CiAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8TG9jYXRpb24+Kj4o
Jm1fcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIG9wZXJhdG9yIFBhc3NSZWZQdHI8TG9jYXRp
b24+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPExvY2F0aW9uPigqdGhp
cyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9y
OgogICAgICogUmVmUHRyPExvY2F0aW9uPiByZXN1bHQgPSBMb2NhdGlvbjo6Y3JlYXRlKCkKICAg
ICAqICAgICAuc2V0U2NyaXB0SWQoLi4uKQogICAgICogICAgIC5zZXRMaW5lTnVtYmVyKC4uLik7
CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRzU2V0PiBjcmVhdGUoKQogICAgewog
ICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0PihhZG9wdFJlZihuZXcgTG9jYXRpb24o
KSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7CgogICAg
dm9pZCBzZXRDb2x1bW5OdW1iZXIoaW50IHZhbHVlKQogICAgewogICAgICAgIHRoaXMtPnNldE51
bWJlcigiY29sdW1uTnVtYmVyIiwgdmFsdWUpOwogICAgfQp9OwoKLyogSW5mb3JtYXRpb24gYWJv
dXQgdGhlIGZ1bmN0aW9uLiAqLwpjbGFzcyBGdW5jdGlvbkRldGFpbHMgOiBwdWJsaWMgSW5zcGVj
dG9yT2JqZWN0IHsKcHVibGljOgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAog
ICAgICAgIExvY2F0aW9uU2V0ID0gMSA8PCAwLAogICAgICAgIEFsbEZpZWxkc1NldCA9IChMb2Nh
dGlvblNldCkKICAgIH07CgogICAgdGVtcGxhdGU8aW50IFNUQVRFPgogICAgY2xhc3MgQnVpbGRl
ciB7CiAgICBwcml2YXRlOgogICAgICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1fcmVzdWx0
OwoKICAgICAgICB0ZW1wbGF0ZTxpbnQgU1RFUD4gQnVpbGRlcjxTVEFURSB8IFNURVA+JiBjYXN0
U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1
aWxkZXI8U1RBVEUgfCBTVEVQPio+KHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgQnVpbGRlcihQ
YXNzUmVmUHRyPEZ1bmN0aW9uRGV0YWlscz4gcHRyKQogICAgICAgIHsKICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoU1RBVEUgPT0gTm9GaWVsZHNTZXQsIGJ1aWxkZXJfY3JlYXRlZF9pbl9ub25f
aW5pdF9zdGF0ZSk7CiAgICAgICAgICAgIG1fcmVzdWx0ID0gcHRyOwogICAgICAgIH0KICAgICAg
ICBmcmllbmQgY2xhc3MgRnVuY3Rpb25EZXRhaWxzOwogICAgcHVibGljOgoKICAgICAgICBCdWls
ZGVyPFNUQVRFIHwgTG9jYXRpb25TZXQ+JiBzZXRMb2NhdGlvbigvKlBhc3NSZWZQdHI8VHlwZUJ1
aWxkZXI6OkRlYnVnZ2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
dmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgTG9j
YXRpb25TZXQpLCBwcm9wZXJ0eV9sb2NhdGlvbl9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1f
cmVzdWx0LT5zZXRPYmplY3QoImxvY2F0aW9uIiwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4g
Y2FzdFN0YXRlPExvY2F0aW9uU2V0PigpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUmVm
UHRyPEZ1bmN0aW9uRGV0YWlscz4mICgpCiAgICAgICAgewogICAgICAgICAgICBDT01QSUxFX0FT
U0VSVChTVEFURSA9PSBBbGxGaWVsZHNTZXQsIHJlc3VsdF9pc19ub3RfcmVhZHkpOwogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8UmVmUHRyPEZ1bmN0aW9uRGV0YWlscz4qPigm
bV9yZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxGdW5jdGlv
bkRldGFpbHM+ICgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gUmVmUHRyPEZ1bmN0aW9u
RGV0YWlscz4oKnRoaXMpOwogICAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIFN5bnRoZXRp
YyBjb25zdHJ1Y3RvcjoKICAgICAqIFJlZlB0cjxGdW5jdGlvbkRldGFpbHM+IHJlc3VsdCA9IEZ1
bmN0aW9uRGV0YWlsczo6Y3JlYXRlKCkKICAgICAqICAgICAuc2V0TG9jYXRpb24oLi4uKTsKICAg
ICAqLwogICAgc3RhdGljIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAg
ICAgcmV0dXJuIEJ1aWxkZXI8Tm9GaWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBGdW5jdGlvbkRldGFp
bHMoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cgog
ICAgdm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+
c2V0U3RyaW5nKCJuYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0RGlzcGxheU5hbWUo
Y29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgIHsKICAgICAgICB0aGlzLT5zZXRTdHJpbmcoImRpc3Bs
YXlOYW1lIiwgdmFsdWUpOwogICAgfQoKICAgIHZvaWQgc2V0SW5mZXJyZWROYW1lKGNvbnN0IFN0
cmluZyYgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy0+c2V0U3RyaW5nKCJpbmZlcnJlZE5hbWUi
LCB2YWx1ZSk7CiAgICB9Cn07CgovKiBKYXZhU2NyaXB0IGNhbGwgZnJhbWUuIEFycmF5IG9mIGNh
bGwgZnJhbWVzIGZvcm0gdGhlIGNhbGwgc3RhY2suICovCmNsYXNzIENhbGxGcmFtZSA6IHB1Ymxp
YyBJbnNwZWN0b3JPYmplY3QgewpwdWJsaWM6CiAgICBlbnVtIHsKICAgICAgICBOb0ZpZWxkc1Nl
dCA9IDAsCiAgICAgICAgQ2FsbEZyYW1lSWRTZXQgPSAxIDw8IDAsCiAgICAgICAgRnVuY3Rpb25O
YW1lU2V0ID0gMSA8PCAxLAogICAgICAgIExvY2F0aW9uU2V0ID0gMSA8PCAyLAogICAgICAgIFNj
b3BlQ2hhaW5TZXQgPSAxIDw8IDMsCiAgICAgICAgVGhpc1NldCA9IDEgPDwgNCwKICAgICAgICBB
bGxGaWVsZHNTZXQgPSAoQ2FsbEZyYW1lSWRTZXQgfCBGdW5jdGlvbk5hbWVTZXQgfCBMb2NhdGlv
blNldCB8IFNjb3BlQ2hhaW5TZXQgfCBUaGlzU2V0KQogICAgfTsKCiAgICB0ZW1wbGF0ZTxpbnQg
U1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAgUmVmUHRyPElu
c3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBTVEVQPiBCdWls
ZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAgICAgICByZXR1
cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhpcyk7CiAgICAg
ICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8Q2FsbEZyYW1lPiBwdHIpCiAgICAgICAg
ewogICAgICAgICAgICBDT01QSUxFX0FTU0VSVChTVEFURSA9PSBOb0ZpZWxkc1NldCwgYnVpbGRl
cl9jcmVhdGVkX2luX25vbl9pbml0X3N0YXRlKTsKICAgICAgICAgICAgbV9yZXN1bHQgPSBwdHI7
CiAgICAgICAgfQogICAgICAgIGZyaWVuZCBjbGFzcyBDYWxsRnJhbWU7CiAgICBwdWJsaWM6Cgog
ICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBDYWxsRnJhbWVJZFNldD4mIHNldENhbGxGcmFtZUlkKC8q
Y29uc3QgVHlwZUJ1aWxkZXI6OkRlYnVnZ2VyOjpDYWxsRnJhbWVJZCYqLyBjb25zdCBTdHJpbmcm
IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoIShTVEFURSAmIENh
bGxGcmFtZUlkU2V0KSwgcHJvcGVydHlfY2FsbEZyYW1lSWRfYWxyZWFkeV9zZXQpOwogICAgICAg
ICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJjYWxsRnJhbWVJZCIsIHZhbHVlKTsKICAgICAgICAg
ICAgcmV0dXJuIGNhc3RTdGF0ZTxDYWxsRnJhbWVJZFNldD4oKTsKICAgICAgICB9CgogICAgICAg
IEJ1aWxkZXI8U1RBVEUgfCBGdW5jdGlvbk5hbWVTZXQ+JiBzZXRGdW5jdGlvbk5hbWUoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RB
VEUgJiBGdW5jdGlvbk5hbWVTZXQpLCBwcm9wZXJ0eV9mdW5jdGlvbk5hbWVfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0U3RyaW5nKCJmdW5jdGlvbk5hbWUiLCB2YWx1ZSk7
CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8RnVuY3Rpb25OYW1lU2V0PigpOwogICAgICAg
IH0KCiAgICAgICAgQnVpbGRlcjxTVEFURSB8IExvY2F0aW9uU2V0PiYgc2V0TG9jYXRpb24oLypQ
YXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6TG9jYXRpb24+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoIShTVEFURSAmIExvY2F0aW9uU2V0KSwgcHJvcGVydHlfbG9jYXRpb25fYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJsb2NhdGlvbiIsIHZhbHVlKTsKICAg
ICAgICAgICAgcmV0dXJuIGNhc3RTdGF0ZTxMb2NhdGlvblNldD4oKTsKICAgICAgICB9CgogICAg
ICAgIEJ1aWxkZXI8U1RBVEUgfCBTY29wZUNoYWluU2V0PiYgc2V0U2NvcGVDaGFpbigvKlBhc3NS
ZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6U2NvcGUgPiA+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JBcnJheT4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVCghKFNUQVRFICYgU2NvcGVDaGFpblNldCksIHByb3BlcnR5X3Njb3Bl
Q2hhaW5fYWxyZWFkeV9zZXQpOwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0QXJyYXkoInNjb3Bl
Q2hhaW4iLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8U2NvcGVDaGFpblNl
dD4oKTsKICAgICAgICB9CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBUaGlzU2V0PiYgc2V0VGhp
cygvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlJ1bnRpbWU6OlJlbW90ZU9iamVjdD4qLyBQYXNz
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gdmFsdWUpCiAgICAgICAgewogICAgICAgICAgICBDT01Q
SUxFX0FTU0VSVCghKFNUQVRFICYgVGhpc1NldCksIHByb3BlcnR5X3RoaXNfYWxyZWFkeV9zZXQp
OwogICAgICAgICAgICBtX3Jlc3VsdC0+c2V0T2JqZWN0KCJ0aGlzIiwgdmFsdWUpOwogICAgICAg
ICAgICByZXR1cm4gY2FzdFN0YXRlPFRoaXNTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVy
YXRvciBSZWZQdHI8Q2FsbEZyYW1lPiYgKCkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKFNUQVRFID09IEFsbEZpZWxkc1NldCwgcmVzdWx0X2lzX25vdF9yZWFkeSk7CiAgICAg
ICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxSZWZQdHI8Q2FsbEZyYW1lPio+KCZtX3Jl
c3VsdCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRvciBQYXNzUmVmUHRyPENhbGxGcmFtZT4g
KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBSZWZQdHI8Q2FsbEZyYW1lPigqdGhpcyk7
CiAgICAgICAgfQogICAgfTsKCiAgICAvKgogICAgICogU3ludGhldGljIGNvbnN0cnVjdG9yOgog
ICAgICogUmVmUHRyPENhbGxGcmFtZT4gcmVzdWx0ID0gQ2FsbEZyYW1lOjpjcmVhdGUoKQogICAg
ICogICAgIC5zZXRDYWxsRnJhbWVJZCguLi4pCiAgICAgKiAgICAgLnNldEZ1bmN0aW9uTmFtZSgu
Li4pCiAgICAgKiAgICAgLnNldExvY2F0aW9uKC4uLikKICAgICAqICAgICAuc2V0U2NvcGVDaGFp
biguLi4pCiAgICAgKiAgICAgLnNldFRoaXMoLi4uKTsKICAgICAqLwogICAgc3RhdGljIEJ1aWxk
ZXI8Tm9GaWVsZHNTZXQ+IGNyZWF0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEJ1aWxkZXI8Tm9G
aWVsZHNTZXQ+KGFkb3B0UmVmKG5ldyBDYWxsRnJhbWUoKSkpOwogICAgfQogICAgdHlwZWRlZiBT
dHJ1Y3RJdGVtVHJhaXRzIEl0ZW1UcmFpdHM7Cn07CgovKiBTY29wZSBkZXNjcmlwdGlvbi4gKi8K
Y2xhc3MgU2NvcGUgOiBwdWJsaWMgSW5zcGVjdG9yT2JqZWN0IHsKcHVibGljOgogICAgLy8gTmFt
ZWQgYWZ0ZXIgcHJvcGVydHkgbmFtZSAndHlwZScgd2hpbGUgZ2VuZXJhdGluZyBTY29wZS4KICAg
IHN0cnVjdCBUeXBlIHsKICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICBHbG9iYWwgPSA1
MiwKICAgICAgICAgICAgTG9jYWwgPSA1MywKICAgICAgICAgICAgV2l0aCA9IDU0LAogICAgICAg
ICAgICBDbG9zdXJlID0gNTUsCiAgICAgICAgICAgIENhdGNoID0gNTYsCiAgICAgICAgfTsKICAg
IH07IC8vIHN0cnVjdCBUeXBlCgogICAgZW51bSB7CiAgICAgICAgTm9GaWVsZHNTZXQgPSAwLAog
ICAgICAgIFR5cGVTZXQgPSAxIDw8IDAsCiAgICAgICAgT2JqZWN0U2V0ID0gMSA8PCAxLAogICAg
ICAgIEFsbEZpZWxkc1NldCA9IChUeXBlU2V0IHwgT2JqZWN0U2V0KQogICAgfTsKCiAgICB0ZW1w
bGF0ZTxpbnQgU1RBVEU+CiAgICBjbGFzcyBCdWlsZGVyIHsKICAgIHByaXZhdGU6CiAgICAgICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbV9yZXN1bHQ7CgogICAgICAgIHRlbXBsYXRlPGludCBT
VEVQPiBCdWlsZGVyPFNUQVRFIHwgU1RFUD4mIGNhc3RTdGF0ZSgpCiAgICAgICAgewogICAgICAg
ICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QnVpbGRlcjxTVEFURSB8IFNURVA+Kj4odGhp
cyk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyKFBhc3NSZWZQdHI8U2NvcGU+IHB0cikKICAg
ICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKFNUQVRFID09IE5vRmllbGRzU2V0LCBi
dWlsZGVyX2NyZWF0ZWRfaW5fbm9uX2luaXRfc3RhdGUpOwogICAgICAgICAgICBtX3Jlc3VsdCA9
IHB0cjsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIGNsYXNzIFNjb3BlOwogICAgcHVibGljOgoK
ICAgICAgICBCdWlsZGVyPFNUQVRFIHwgVHlwZVNldD4mIHNldFR5cGUoVHlwZTo6RW51bSB2YWx1
ZSkKICAgICAgICB7CiAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0
KSwgcHJvcGVydHlfdHlwZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRT
dHJpbmcoInR5cGUiLCBnZXRFbnVtQ29uc3RhbnRWYWx1ZSh2YWx1ZSkpOwogICAgICAgICAgICBy
ZXR1cm4gY2FzdFN0YXRlPFR5cGVTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBCdWlsZGVyPFNU
QVRFIHwgVHlwZVNldD4mIHNldFR5cGUoY29uc3QgU3RyaW5nJiB2YWx1ZSkKICAgICAgICB7CiAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKCEoU1RBVEUgJiBUeXBlU2V0KSwgcHJvcGVydHlfdHlw
ZV9hbHJlYWR5X3NldCk7CiAgICAgICAgICAgIG1fcmVzdWx0LT5zZXRTdHJpbmcoInR5cGUiLCB2
YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBjYXN0U3RhdGU8VHlwZVNldD4oKTsKICAgICAgICB9
CgogICAgICAgIEJ1aWxkZXI8U1RBVEUgfCBPYmplY3RTZXQ+JiBzZXRPYmplY3QoLypQYXNzUmVm
UHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1vdGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
IShTVEFURSAmIE9iamVjdFNldCksIHByb3BlcnR5X29iamVjdF9hbHJlYWR5X3NldCk7CiAgICAg
ICAgICAgIG1fcmVzdWx0LT5zZXRPYmplY3QoIm9iamVjdCIsIHZhbHVlKTsKICAgICAgICAgICAg
cmV0dXJuIGNhc3RTdGF0ZTxPYmplY3RTZXQ+KCk7CiAgICAgICAgfQoKICAgICAgICBvcGVyYXRv
ciBSZWZQdHI8U2NvcGU+JiAoKQogICAgICAgIHsKICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
U1RBVEUgPT0gQWxsRmllbGRzU2V0LCByZXN1bHRfaXNfbm90X3JlYWR5KTsKICAgICAgICAgICAg
cmV0dXJuICpyZWludGVycHJldF9jYXN0PFJlZlB0cjxTY29wZT4qPigmbV9yZXN1bHQpOwogICAg
ICAgIH0KCiAgICAgICAgb3BlcmF0b3IgUGFzc1JlZlB0cjxTY29wZT4gKCkKICAgICAgICB7CiAg
ICAgICAgICAgIHJldHVybiBSZWZQdHI8U2NvcGU+KCp0aGlzKTsKICAgICAgICB9CiAgICB9OwoK
ICAgIC8qCiAgICAgKiBTeW50aGV0aWMgY29uc3RydWN0b3I6CiAgICAgKiBSZWZQdHI8U2NvcGU+
IHJlc3VsdCA9IFNjb3BlOjpjcmVhdGUoKQogICAgICogICAgIC5zZXRUeXBlKC4uLikKICAgICAq
ICAgICAuc2V0T2JqZWN0KC4uLik7CiAgICAgKi8KICAgIHN0YXRpYyBCdWlsZGVyPE5vRmllbGRz
U2V0PiBjcmVhdGUoKQogICAgewogICAgICAgIHJldHVybiBCdWlsZGVyPE5vRmllbGRzU2V0Pihh
ZG9wdFJlZihuZXcgU2NvcGUoKSkpOwogICAgfQogICAgdHlwZWRlZiBTdHJ1Y3RJdGVtVHJhaXRz
IEl0ZW1UcmFpdHM7Cn07Cgp9IC8vIERlYnVnZ2VyCgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJ
UFRfREVCVUdHRVIpCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKbmFtZXNwYWNlIERP
TURlYnVnZ2VyIHsKLyogRE9NIGJyZWFrcG9pbnQgdHlwZS4gKi8Kc3RydWN0IERPTUJyZWFrcG9p
bnRUeXBlIHsKICAgIGVudW0gRW51bSB7CiAgICAgICAgU3VidHJlZV9tb2RpZmllZCA9IDU3LAog
ICAgICAgIEF0dHJpYnV0ZV9tb2RpZmllZCA9IDU4LAogICAgICAgIE5vZGVfcmVtb3ZlZCA9IDU5
LAogICAgfTsKfTsgLy8gc3RydWN0IERPTUJyZWFrcG9pbnRUeXBlCgp9IC8vIERPTURlYnVnZ2Vy
CgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCgp9IC8vIG5hbWVzcGFjZSBU
eXBlQnVpbGRlcgoKY2xhc3MgSW5zcGVjdG9yRnJvbnRlbmQgewpwdWJsaWM6CiAgICBJbnNwZWN0
b3JGcm9udGVuZChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqKTsKCgogICAgY2xhc3MgSW5zcGVj
dG9yIHsKICAgIHB1YmxpYzoKICAgICAgICBJbnNwZWN0b3IoSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGV2YWx1YXRlRm9y
VGVzdEluRnJvbnRlbmQoaW50IHRlc3RDYWxsSWQsIGNvbnN0IFN0cmluZyYgc2NyaXB0KTsKICAg
ICAgICB2b2lkIGluc3BlY3QoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1v
dGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdCwgUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGhpbnRzKTsKICAgICAgICB2b2lkIGRpZENyZWF0ZVdvcmtlcihp
bnQgaWQsIGNvbnN0IFN0cmluZyYgdXJsLCBib29sIGlzU2hhcmVkKTsKICAgICAgICB2b2lkIGRp
ZERlc3Ryb3lXb3JrZXIoaW50IGlkKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHBy
aXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgSW5zcGVjdG9yKiBpbnNwZWN0b3IoKSB7IHJldHVybiAm
bV9pbnNwZWN0b3I7IH0KCiAgICBjbGFzcyBNZW1vcnkgewogICAgcHVibGljOgogICAgICAgIE1l
bW9yeShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkg
OiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
fQogICAgICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBt
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAg
ICBNZW1vcnkqIG1lbW9yeSgpIHsgcmV0dXJuICZtX21lbW9yeTsgfQoKICAgIGNsYXNzIFBhZ2Ug
ewogICAgcHVibGljOgogICAgICAgIFBhZ2UoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGRvbUNvbnRlbnRFdmVudEZpcmVk
KGRvdWJsZSB0aW1lc3RhbXApOwogICAgICAgIHZvaWQgbG9hZEV2ZW50RmlyZWQoZG91YmxlIHRp
bWVzdGFtcCk7CiAgICAgICAgdm9pZCBmcmFtZU5hdmlnYXRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1
aWxkZXI6OlBhZ2U6OkZyYW1lPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBmcmFtZSk7
CiAgICAgICAgdm9pZCBmcmFtZURldGFjaGVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6
OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkKTsKICAgICAgICB2b2lkIHNldEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgUGFnZSogcGFnZSgpIHsgcmV0dXJu
ICZtX3BhZ2U7IH0KCiAgICBjbGFzcyBSdW50aW1lIHsKICAgIHB1YmxpYzoKICAgICAgICBSdW50
aW1lKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9
CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAg
IFJ1bnRpbWUqIHJ1bnRpbWUoKSB7IHJldHVybiAmbV9ydW50aW1lOyB9CgogICAgY2xhc3MgQ29u
c29sZSB7CiAgICBwdWJsaWM6CiAgICAgICAgQ29uc29sZShJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgbWVzc2FnZUFkZGVk
KC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q29uc29sZTo6Q29uc29sZU1lc3NhZ2U+Ki8gUGFz
c1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3NhZ2UpOwogICAgICAgIHZvaWQgbWVzc2FnZVJl
cGVhdENvdW50VXBkYXRlZChpbnQgY291bnQpOwogICAgICAgIHZvaWQgbWVzc2FnZXNDbGVhcmVk
KCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJu
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoK
ICAgIENvbnNvbGUqIGNvbnNvbGUoKSB7IHJldHVybiAmbV9jb25zb2xlOyB9CgogICAgY2xhc3Mg
TmV0d29yayB7CiAgICBwdWJsaWM6CiAgICAgICAgTmV0d29yayhJbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgcmVxdWVzdFdp
bGxCZVNlbnQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0
IFN0cmluZyYgcmVxdWVzdElkLCAvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlk
JiovIGNvbnN0IFN0cmluZyYgZnJhbWVJZCwgLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6
TG9hZGVySWQmKi8gY29uc3QgU3RyaW5nJiBsb2FkZXJJZCwgY29uc3QgU3RyaW5nJiBkb2N1bWVu
dFVSTCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0PiovIFBhc3NS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXF1ZXN0LCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NS
ZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkluaXRpYXRvcj4qLyBQYXNzUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gaW5pdGlhdG9yLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFR5
cGVCdWlsZGVyOjpDb25zb2xlOjpDYWxsRnJhbWUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JB
cnJheT4gc3RhY2tUcmFjZSwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXNw
b25zZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVkaXJlY3RSZXNwb25zZSk7CiAg
ICAgICAgdm9pZCByZXF1ZXN0U2VydmVkRnJvbUNhY2hlKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5l
dHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCk7CiAgICAgICAgdm9p
ZCByZXNwb25zZVJlY2VpdmVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJ
ZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29y
azo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQsIC8qY29uc3QgVHlwZUJ1aWxkZXI6
Ok5ldHdvcms6OkxvYWRlcklkJiovIGNvbnN0IFN0cmluZyYgbG9hZGVySWQsIGRvdWJsZSB0aW1l
c3RhbXAsIC8qVHlwZUJ1aWxkZXI6OlBhZ2U6OlJlc291cmNlVHlwZTo6RW51bSovIGNvbnN0IFN0
cmluZyYgdHlwZSwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXNwb25zZT4q
LyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2UpOwogICAgICAgIHZvaWQgZGF0
YVJlY2VpdmVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25z
dCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91YmxlIHRpbWVzdGFtcCwgaW50IGRhdGFMZW5ndGgsIGlu
dCBlbmNvZGVkRGF0YUxlbmd0aCk7CiAgICAgICAgdm9pZCBsb2FkaW5nRmluaXNoZWQoLypjb25z
dCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVz
dElkLCBkb3VibGUgdGltZXN0YW1wKTsKICAgICAgICB2b2lkIGxvYWRpbmdGYWlsZWQoLypjb25z
dCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVz
dElkLCBkb3VibGUgdGltZXN0YW1wLCBjb25zdCBTdHJpbmcmIGVycm9yVGV4dCwgY29uc3QgYm9v
bCogY29uc3QgY2FuY2VsZWQpOwogICAgICAgIHZvaWQgcmVxdWVzdFNlcnZlZEZyb21NZW1vcnlD
YWNoZSgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3Ry
aW5nJiByZXF1ZXN0SWQsIC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkZyYW1lSWQmKi8g
Y29uc3QgU3RyaW5nJiBmcmFtZUlkLCAvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpMb2Fk
ZXJJZCYqLyBjb25zdCBTdHJpbmcmIGxvYWRlcklkLCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJM
LCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6Oklu
aXRpYXRvcj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gaW5pdGlhdG9yLCAvKlBhc3NS
ZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkNhY2hlZFJlc291cmNlPiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiByZXNvdXJjZSk7CiAgICAgICAgdm9pZCB3ZWJTb2NrZXRXaWxsU2Vu
ZEhhbmRzaGFrZVJlcXVlc3QoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElk
JiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wLCAvKlBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OldlYlNvY2tldFJlcXVlc3Q+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHJlcXVlc3QpOwogICAgICAgIHZvaWQgd2ViU29ja2V0SGFuZHNoYWtl
UmVzcG9uc2VSZWNlaXZlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQm
Ki8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXAsIC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6V2ViU29ja2V0UmVzcG9uc2U+Ki8gUGFzc1JlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlKTsKICAgICAgICB2b2lkIHdlYlNvY2tldENyZWF0ZWQo
Lypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmluZyYg
cmVxdWVzdElkLCBjb25zdCBTdHJpbmcmIHVybCk7CiAgICAgICAgdm9pZCB3ZWJTb2NrZXRDbG9z
ZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmlu
ZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wKTsKICAgICAgICB2b2lkIHNldEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgTmV0d29yayogbmV0d29yaygpIHsgcmV0
dXJuICZtX25ldHdvcms7IH0KCiNpZiBFTkFCTEUoU1FMX0RBVEFCQVNFKQogICAgY2xhc3MgRGF0
YWJhc2UgewogICAgcHVibGljOgogICAgICAgIERhdGFiYXNlKEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBhZGREYXRhYmFz
ZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRhdGFiYXNlOjpEYXRhYmFzZT4qLyBQYXNzUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YWJhc2UpOwogICAgICAgIHZvaWQgc3FsVHJhbnNhY3Rp
b25TdWNjZWVkZWQoaW50IHRyYW5zYWN0aW9uSWQsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
QXJyYXk8U3RyaW5nID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IGNvbHVtbk5hbWVz
LCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PEluc3BlY3RvclZhbHVlID4gPiovIFBh
c3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IHZhbHVlcyk7CiAgICAgICAgdm9pZCBzcWxUcmFuc2Fj
dGlvbkZhaWxlZChpbnQgdHJhbnNhY3Rpb25JZCwgUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IHNxbEVycm9yKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAg
IEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkg
eyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAg
ICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsK
ICAgIH07CgogICAgRGF0YWJhc2UqIGRhdGFiYXNlKCkgeyByZXR1cm4gJm1fZGF0YWJhc2U7IH0K
CiNlbmRpZiAvLyBFTkFCTEUoU1FMX0RBVEFCQVNFKQojaWYgRU5BQkxFKElOREVYRURfREFUQUJB
U0UpCiAgICBjbGFzcyBJbmRleGVkREIgewogICAgcHVibGljOgogICAgICAgIEluZGV4ZWREQihJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAg
ICAgIHZvaWQgZGF0YWJhc2VOYW1lc0xvYWRlZChkb3VibGUgcmVxdWVzdElkLCAvKlBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6OkluZGV4ZWREQjo6U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1l
cz4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJh
c2VOYW1lcyk7CiAgICAgICAgdm9pZCBkYXRhYmFzZUxvYWRlZChpbnQgcmVxdWVzdElkLCAvKlBh
c3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkluZGV4ZWREQjo6RGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVz
PiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBkYXRhYmFzZVdpdGhPYmplY3RTdG9yZXMp
OwogICAgICAgIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsID0gaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKiBnZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBt
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAg
ICBJbmRleGVkREIqIGluZGV4ZWRkYigpIHsgcmV0dXJuICZtX2luZGV4ZWRkYjsgfQoKI2VuZGlm
IC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQogICAgY2xhc3MgRE9NU3RvcmFnZSB7CiAgICBw
dWJsaWM6CiAgICAgICAgRE9NU3RvcmFnZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgYWRkRE9NU3RvcmFnZSgvKlBhc3NS
ZWZQdHI8VHlwZUJ1aWxkZXI6OkRPTVN0b3JhZ2U6OkVudHJ5PiovIFBhc3NSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBzdG9yYWdlKTsKICAgICAgICB2b2lkIHVwZGF0ZURPTVN0b3JhZ2UoaW50IHN0
b3JhZ2VJZCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsg
cmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAg
IEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAg
ICB9OwoKICAgIERPTVN0b3JhZ2UqIGRvbXN0b3JhZ2UoKSB7IHJldHVybiAmbV9kb21zdG9yYWdl
OyB9CgogICAgY2xhc3MgQXBwbGljYXRpb25DYWNoZSB7CiAgICBwdWJsaWM6CiAgICAgICAgQXBw
bGljYXRpb25DYWNoZShJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENo
YW5uZWwpIHsgfQogICAgICAgIHZvaWQgYXBwbGljYXRpb25DYWNoZVN0YXR1c1VwZGF0ZWQoLypj
b25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1l
SWQsIGNvbnN0IFN0cmluZyYgbWFuaWZlc3RVUkwsIGludCBzdGF0dXMpOwogICAgICAgIHZvaWQg
bmV0d29ya1N0YXRlVXBkYXRlZChib29sIGlzTm93T25saW5lKTsKICAgICAgICB2b2lkIHNldElu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0
SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7IH0KICAgIHByaXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBt
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgQXBwbGljYXRpb25DYWNoZSog
YXBwbGljYXRpb25jYWNoZSgpIHsgcmV0dXJuICZtX2FwcGxpY2F0aW9uY2FjaGU7IH0KCiNpZiBF
TkFCTEUoRklMRV9TWVNURU0pCiAgICBjbGFzcyBGaWxlU3lzdGVtIHsKICAgIHB1YmxpYzoKICAg
ICAgICBGaWxlU3lzdGVtKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNw
ZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAg
ICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgp
IHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAg
ICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7
CiAgICB9OwoKICAgIEZpbGVTeXN0ZW0qIGZpbGVzeXN0ZW0oKSB7IHJldHVybiAmbV9maWxlc3lz
dGVtOyB9CgojZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQogICAgY2xhc3MgRE9NIHsKICAg
IHB1YmxpYzoKICAgICAgICBET00oSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGRvY3VtZW50VXBkYXRlZCgpOwogICAgICAg
IHZvaWQgc2V0Q2hpbGROb2RlcyhpbnQgcGFyZW50SWQsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRl
cjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkRPTTo6Tm9kZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3Rv
ckFycmF5PiBub2Rlcyk7CiAgICAgICAgdm9pZCBhdHRyaWJ1dGVNb2RpZmllZChpbnQgbm9kZUlk
LCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUpOwogICAgICAgIHZvaWQg
YXR0cmlidXRlUmVtb3ZlZChpbnQgbm9kZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUpOwogICAgICAg
IHZvaWQgaW5saW5lU3R5bGVJbnZhbGlkYXRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFy
cmF5PGludCA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBub2RlSWRzKTsKICAgICAg
ICB2b2lkIGNoYXJhY3RlckRhdGFNb2RpZmllZChpbnQgbm9kZUlkLCBjb25zdCBTdHJpbmcmIGNo
YXJhY3RlckRhdGEpOwogICAgICAgIHZvaWQgY2hpbGROb2RlQ291bnRVcGRhdGVkKGludCBub2Rl
SWQsIGludCBjaGlsZE5vZGVDb3VudCk7CiAgICAgICAgdm9pZCBjaGlsZE5vZGVJbnNlcnRlZChp
bnQgcGFyZW50Tm9kZUlkLCBpbnQgcHJldmlvdXNOb2RlSWQsIC8qUGFzc1JlZlB0cjxUeXBlQnVp
bGRlcjo6RE9NOjpOb2RlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBub2RlKTsKICAg
ICAgICB2b2lkIGNoaWxkTm9kZVJlbW92ZWQoaW50IHBhcmVudE5vZGVJZCwgaW50IG5vZGVJZCk7
CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAg
IERPTSogZG9tKCkgeyByZXR1cm4gJm1fZG9tOyB9CgogICAgY2xhc3MgQ1NTIHsKICAgIHB1Ymxp
YzoKICAgICAgICBDU1MoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsKSB7IH0KICAgICAgICB2b2lkIG1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkKCk7CiAgICAg
ICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIENTUyog
Y3NzKCkgeyByZXR1cm4gJm1fY3NzOyB9CgogICAgY2xhc3MgVGltZWxpbmUgewogICAgcHVibGlj
OgogICAgICAgIFRpbWVsaW5lKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsKSA6IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKGluc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCkgeyB9CiAgICAgICAgdm9pZCBldmVudFJlY29yZGVkKC8qUGFzc1JlZlB0cjxU
eXBlQnVpbGRlcjo6VGltZWxpbmU6OlRpbWVsaW5lRXZlbnQ+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHJlY29yZCk7CiAgICAgICAgdm9pZCBzZXRJbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0K
ICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdldEluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOyB9CiAgICBwcml2YXRl
OgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogbV9pbnNwZWN0b3JGcm9udGVuZENo
YW5uZWw7CiAgICB9OwoKICAgIFRpbWVsaW5lKiB0aW1lbGluZSgpIHsgcmV0dXJuICZtX3RpbWVs
aW5lOyB9CgojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBjbGFzcyBEZWJ1Z2dl
ciB7CiAgICBwdWJsaWM6CiAgICAgICAgRGVidWdnZXIoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwo
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGdsb2JhbE9iamVjdENs
ZWFyZWQoKTsKICAgICAgICB2b2lkIHNjcmlwdFBhcnNlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpE
ZWJ1Z2dlcjo6U2NyaXB0SWQmKi8gY29uc3QgU3RyaW5nJiBzY3JpcHRJZCwgY29uc3QgU3RyaW5n
JiB1cmwsIGludCBzdGFydExpbmUsIGludCBzdGFydENvbHVtbiwgaW50IGVuZExpbmUsIGludCBl
bmRDb2x1bW4sIGNvbnN0IGJvb2wqIGNvbnN0IGlzQ29udGVudFNjcmlwdCwgY29uc3QgU3RyaW5n
JiBzb3VyY2VNYXBVUkwpOwogICAgICAgIHZvaWQgc2NyaXB0RmFpbGVkVG9QYXJzZShjb25zdCBT
dHJpbmcmIHVybCwgY29uc3QgU3RyaW5nJiBzY3JpcHRTb3VyY2UsIGludCBzdGFydExpbmUsIGlu
dCBlcnJvckxpbmUsIGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlKTsKICAgICAgICB2b2lkIGJy
ZWFrcG9pbnRSZXNvbHZlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpEZWJ1Z2dlcjo6QnJlYWtwb2lu
dElkJiovIGNvbnN0IFN0cmluZyYgYnJlYWtwb2ludElkLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxk
ZXI6OkRlYnVnZ2VyOjpMb2NhdGlvbj4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbG9j
YXRpb24pOwogICAgICAgIC8vIE5hbWVkIGFmdGVyIHBhcmFtZXRlciBuYW1lICdyZWFzb24nIHdo
aWxlIGdlbmVyYXRpbmcgZXZlbnQgcGF1c2VkLgogICAgICAgIHN0cnVjdCBSZWFzb24gewogICAg
ICAgICAgICBlbnVtIEVudW0gewogICAgICAgICAgICAgICAgWEhSID0gNSwKICAgICAgICAgICAg
ICAgIERPTSA9IDYwLAogICAgICAgICAgICAgICAgRXZlbnRMaXN0ZW5lciA9IDYxLAogICAgICAg
ICAgICAgICAgRXhjZXB0aW9uID0gNjIsCiAgICAgICAgICAgICAgICBPdGhlciA9IDI1LAogICAg
ICAgICAgICB9OwogICAgICAgIH07IC8vIHN0cnVjdCBSZWFzb24KCiAgICAgICAgdm9pZCBwYXVz
ZWQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpBcnJheTxUeXBlQnVpbGRlcjo6RGVidWdnZXI6
OkNhbGxGcmFtZSA+ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBjYWxsRnJhbWVzLCAv
KlJlYXNvbjo6RW51bSovIGNvbnN0IFN0cmluZyYgcmVhc29uLCBQYXNzUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gZGF0YSk7CiAgICAgICAgdm9pZCByZXN1bWVkKCk7CiAgICAgICAgdm9pZCBzZXRJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwoSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpIHsgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwgPSBpbnNwZWN0
b3JGcm9udGVuZENoYW5uZWw7IH0KICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGdl
dEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCgpIHsgcmV0dXJuIG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsOyB9CiAgICBwcml2YXRlOgogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCog
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7CiAgICB9OwoKICAgIERlYnVnZ2VyKiBkZWJ1Z2dl
cigpIHsgcmV0dXJuICZtX2RlYnVnZ2VyOyB9CgojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRf
REVCVUdHRVIpCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgIGNsYXNzIERPTURl
YnVnZ2VyIHsKICAgIHB1YmxpYzoKICAgICAgICBET01EZWJ1Z2dlcihJbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgOiBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbChpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIHsgfQogICAgICAgIHZvaWQgc2V0SW5z
cGVjdG9yRnJvbnRlbmRDaGFubmVsKEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKSB7IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsID0gaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsOyB9CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBnZXRJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwoKSB7IHJldHVybiBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbDsgfQogICAgcHJpdmF0ZToKICAgICAgICBJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgfTsKCiAgICBET01EZWJ1Z2dlciogZG9tZGVi
dWdnZXIoKSB7IHJldHVybiAmbV9kb21kZWJ1Z2dlcjsgfQoKI2VuZGlmIC8vIEVOQUJMRShKQVZB
U0NSSVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICBjbGFz
cyBQcm9maWxlciB7CiAgICBwdWJsaWM6CiAgICAgICAgUHJvZmlsZXIoSW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2b2lkIGFkZFBy
b2ZpbGVIZWFkZXIoUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGhlYWRlcik7CiAgICAgICAg
dm9pZCBhZGRIZWFwU25hcHNob3RDaHVuayhpbnQgdWlkLCBjb25zdCBTdHJpbmcmIGNodW5rKTsK
ICAgICAgICB2b2lkIGZpbmlzaEhlYXBTbmFwc2hvdChpbnQgdWlkKTsKICAgICAgICB2b2lkIHNl
dFJlY29yZGluZ1Byb2ZpbGUoYm9vbCBpc1Byb2ZpbGluZyk7CiAgICAgICAgdm9pZCByZXNldFBy
b2ZpbGVzKCk7CiAgICAgICAgdm9pZCByZXBvcnRIZWFwU25hcHNob3RQcm9ncmVzcyhpbnQgZG9u
ZSwgaW50IHRvdGFsKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbChJ
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkgeyBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbDsgfQogICAg
ICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHByaXZhdGU6CiAg
ICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsKICAgIH07CgogICAgUHJvZmlsZXIqIHByb2ZpbGVyKCkgeyByZXR1cm4gJm1fcHJvZmlsZXI7
IH0KCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVOQUJMRShXT1JL
RVJTKQogICAgY2xhc3MgV29ya2VyIHsKICAgIHB1YmxpYzoKICAgICAgICBXb3JrZXIoSW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKiBpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpIDogbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKSB7IH0KICAgICAgICB2
b2lkIHdvcmtlckNyZWF0ZWQoaW50IHdvcmtlcklkLCBjb25zdCBTdHJpbmcmIHVybCwgYm9vbCBp
bnNwZWN0b3JDb25uZWN0ZWQpOwogICAgICAgIHZvaWQgd29ya2VyVGVybWluYXRlZChpbnQgd29y
a2VySWQpOwogICAgICAgIHZvaWQgZGlzcGF0Y2hNZXNzYWdlRnJvbVdvcmtlcihpbnQgd29ya2Vy
SWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlKTsKICAgICAgICB2b2lkIGRp
c2Nvbm5lY3RlZEZyb21Xb3JrZXIoKTsKICAgICAgICB2b2lkIHNldEluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkgeyBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCA9IGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bDsgfQogICAgICAgIEluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCogZ2V0SW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWw7IH0KICAgIHBy
aXZhdGU6CiAgICAgICAgSW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKiBtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbDsKICAgIH07CgogICAgV29ya2VyKiB3b3JrZXIoKSB7IHJldHVybiAmbV93b3Jr
ZXI7IH0KCiNlbmRpZiAvLyBFTkFCTEUoV09SS0VSUykKCnByaXZhdGU6CiAgICBJbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwqIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsOwogICAgSW5zcGVjdG9y
IG1faW5zcGVjdG9yOwogICAgTWVtb3J5IG1fbWVtb3J5OwogICAgUGFnZSBtX3BhZ2U7CiAgICBS
dW50aW1lIG1fcnVudGltZTsKICAgIENvbnNvbGUgbV9jb25zb2xlOwogICAgTmV0d29yayBtX25l
dHdvcms7CiNpZiBFTkFCTEUoU1FMX0RBVEFCQVNFKQogICAgRGF0YWJhc2UgbV9kYXRhYmFzZTsK
I2VuZGlmIC8vIEVOQUJMRShTUUxfREFUQUJBU0UpCiNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFT
RSkKICAgIEluZGV4ZWREQiBtX2luZGV4ZWRkYjsKI2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RB
VEFCQVNFKQogICAgRE9NU3RvcmFnZSBtX2RvbXN0b3JhZ2U7CiAgICBBcHBsaWNhdGlvbkNhY2hl
IG1fYXBwbGljYXRpb25jYWNoZTsKI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgIEZpbGVTeXN0
ZW0gbV9maWxlc3lzdGVtOwojZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQogICAgRE9NIG1f
ZG9tOwogICAgQ1NTIG1fY3NzOwogICAgVGltZWxpbmUgbV90aW1lbGluZTsKI2lmIEVOQUJMRShK
QVZBU0NSSVBUX0RFQlVHR0VSKQogICAgRGVidWdnZXIgbV9kZWJ1Z2dlcjsKI2VuZGlmIC8vIEVO
QUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIp
CiAgICBET01EZWJ1Z2dlciBtX2RvbWRlYnVnZ2VyOwojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJ
UFRfREVCVUdHRVIpCiNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgIFByb2ZpbGVy
IG1fcHJvZmlsZXI7CiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKI2lmIEVO
QUJMRShXT1JLRVJTKQogICAgV29ya2VyIG1fd29ya2VyOwojZW5kaWYgLy8gRU5BQkxFKFdPUktF
UlMpCn07CgojZW5kaWYgLy8gRU5BQkxFKElOU1BFQ1RPUikKCn0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvckZyb250ZW5kX2gpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>124616</attachid>
            <date>2012-01-30 15:44:06 -0800</date>
            <delta_ts>2012-01-30 15:44:06 -0800</delta_ts>
            <desc>New InspectorFrontend.cpp</desc>
            <filename>InspectorFrontend.cpp</filename>
            <type>text/plain</type>
            <size>43375</size>
            <attacher name="Peter Rybin">prybin</attacher>
            
              <data encoding="base64">Ly8gRmlsZSBpcyBnZW5lcmF0ZWQgYnkgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0NvZGVHZW5l
cmF0b3JJbnNwZWN0b3IucHkKCi8vIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0
aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMg
Z292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0
aGUgTElDRU5TRSBmaWxlLgoKCiNpbmNsdWRlICJjb25maWcuaCIKI2lmIEVOQUJMRShJTlNQRUNU
T1IpCgojaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKI2luY2x1ZGUgPHd0Zi90ZXh0L1dU
RlN0cmluZy5oPgojaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgoKI2luY2x1ZGUgIkluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbC5oIgojaW5jbHVkZSAiSW5zcGVjdG9yVmFsdWVzLmgiCiNpbmNs
dWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KCm5hbWVzcGFjZSBXZWJDb3JlIHsKCkluc3BlY3Rv
ckZyb250ZW5kOjpJbnNwZWN0b3JGcm9udGVuZChJbnNwZWN0b3JGcm9udGVuZENoYW5uZWwqIGlu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgIDogbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwo
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgLCBtX2luc3BlY3RvcihpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAsIG1fbWVtb3J5KGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAg
ICwgbV9wYWdlKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICwgbV9ydW50aW1lKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICwgbV9jb25zb2xlKGluc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkKICAgICwgbV9uZXR3b3JrKGluc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKI2lmIEVOQUJM
RShTUUxfREFUQUJBU0UpCiAgICAsIG1fZGF0YWJhc2UoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KQojZW5kaWYgLy8gRU5BQkxFKFNRTF9EQVRBQkFTRSkKI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFC
QVNFKQogICAgLCBtX2luZGV4ZWRkYihpbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiNlbmRpZiAv
LyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKICAgICwgbV9kb21zdG9yYWdlKGluc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCkKICAgICwgbV9hcHBsaWNhdGlvbmNhY2hlKGluc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgICwgbV9maWxlc3lzdGVtKGluc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbCkKI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkKICAgICwg
bV9kb20oaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgLCBtX2NzcyhpbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAsIG1fdGltZWxpbmUoaW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQoj
aWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICAsIG1fZGVidWdnZXIoaW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKQojZW5kaWYgLy8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiNp
ZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKICAgICwgbV9kb21kZWJ1Z2dlcihpbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwpCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikK
I2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQogICAgLCBtX3Byb2ZpbGVyKGluc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkKI2VuZGlmIC8vIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQoj
aWYgRU5BQkxFKFdPUktFUlMpCiAgICAsIG1fd29ya2VyKGluc3BlY3RvckZyb250ZW5kQ2hhbm5l
bCkKI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJTKQp7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6
Okluc3BlY3Rvcjo6ZXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZChpbnQgdGVzdENhbGxJZCwgY29u
c3QgU3RyaW5nJiBzY3JpcHQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGV2YWx1YXRl
Rm9yVGVzdEluRnJvbnRlbmRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IGV2YWx1YXRlRm9yVGVzdEluRnJvbnRlbmRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJJ
bnNwZWN0b3IuZXZhbHVhdGVGb3JUZXN0SW5Gcm9udGVuZCIpOwogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBh
cmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0ZXN0Q2FsbElkIiwgdGVzdENhbGxJZCk7CiAgICBwYXJh
bXNPYmplY3QtPnNldFN0cmluZygic2NyaXB0Iiwgc2NyaXB0KTsKICAgIGV2YWx1YXRlRm9yVGVz
dEluRnJvbnRlbmRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAg
ICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChldmFsdWF0ZUZvclRlc3RJbkZyb250
ZW5kTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpJ
bnNwZWN0b3I6Omluc3BlY3QoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpSdW50aW1lOjpSZW1v
dGVPYmplY3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG9iamVjdCwgUGFzc1JlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IGhpbnRzKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBp
bnNwZWN0TWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBpbnNwZWN0TWVz
c2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiSW5zcGVjdG9yLmluc3BlY3QiKTsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgib2JqZWN0Iiwgb2JqZWN0KTsKICAgIHBh
cmFtc09iamVjdC0+c2V0T2JqZWN0KCJoaW50cyIsIGhpbnRzKTsKICAgIGluc3BlY3RNZXNzYWdl
LT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRN
ZXNzYWdlVG9Gcm9udGVuZChpbnNwZWN0TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lk
IEluc3BlY3RvckZyb250ZW5kOjpJbnNwZWN0b3I6OmRpZENyZWF0ZVdvcmtlcihpbnQgaWQsIGNv
bnN0IFN0cmluZyYgdXJsLCBib29sIGlzU2hhcmVkKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBkaWRDcmVhdGVXb3JrZXJNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIGRpZENyZWF0ZVdvcmtlck1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkluc3BlY3Rv
ci5kaWRDcmVhdGVXb3JrZXIiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09i
amVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51
bWJlcigiaWQiLCBpZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygidXJsIiwgdXJsKTsK
ICAgIHBhcmFtc09iamVjdC0+c2V0Qm9vbGVhbigiaXNTaGFyZWQiLCBpc1NoYXJlZCk7CiAgICBk
aWRDcmVhdGVXb3JrZXJNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7
CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JG
cm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChkaWRDcmVhdGVXb3JrZXJNZXNz
YWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Okluc3BlY3Rv
cjo6ZGlkRGVzdHJveVdvcmtlcihpbnQgaWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAg
IGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJJbnNwZWN0b3Iu
ZGlkRGVzdHJveVdvcmtlciIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2Jq
ZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVt
YmVyKCJpZCIsIGlkKTsKICAgIGRpZERlc3Ryb3lXb3JrZXJNZXNzYWdlLT5zZXRPYmplY3QoInBh
cmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwp
CiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVu
ZChkaWREZXN0cm95V29ya2VyTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3Bl
Y3RvckZyb250ZW5kOjpQYWdlOjpkb21Db250ZW50RXZlbnRGaXJlZChkb3VibGUgdGltZXN0YW1w
KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBkb21Db250ZW50RXZlbnRGaXJlZE1lc3Nh
Z2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgZG9tQ29udGVudEV2ZW50RmlyZWRN
ZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJQYWdlLmRvbUNvbnRlbnRFdmVudEZpcmVkIik7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIsIHRp
bWVzdGFtcCk7CiAgICBkb21Db250ZW50RXZlbnRGaXJlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFy
YW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkK
ICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5k
KGRvbUNvbnRlbnRFdmVudEZpcmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIElu
c3BlY3RvckZyb250ZW5kOjpQYWdlOjpsb2FkRXZlbnRGaXJlZChkb3VibGUgdGltZXN0YW1wKQp7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBsb2FkRXZlbnRGaXJlZE1lc3NhZ2UgPSBJbnNw
ZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgbG9hZEV2ZW50RmlyZWRNZXNzYWdlLT5zZXRTdHJp
bmcoIm1ldGhvZCIsICJQYWdlLmxvYWRFdmVudEZpcmVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAgICBsb2FkRXZl
bnRGaXJlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlm
IChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGxvYWRFdmVudEZpcmVkTWVzc2FnZS0+dG9K
U09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpQYWdlOjpmcmFtZU5hdmln
YXRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OlBhZ2U6OkZyYW1lPiovIFBhc3NSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBmcmFtZSkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZnJh
bWVOYXZpZ2F0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGZyYW1l
TmF2aWdhdGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiUGFnZS5mcmFtZU5hdmlnYXRl
ZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9y
T2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJmcmFtZSIsIGZy
YW1lKTsKICAgIGZyYW1lTmF2aWdhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJh
bXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZnJhbWVOYXZp
Z2F0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6
OlBhZ2U6OmZyYW1lRGV0YWNoZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJ
ZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+
IGZyYW1lRGV0YWNoZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGZy
YW1lRGV0YWNoZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJQYWdlLmZyYW1lRGV0YWNo
ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rv
ck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygiZnJhbWVJZCIs
IGZyYW1lSWQpOwogICAgZnJhbWVEZXRhY2hlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwg
cGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAg
ICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGZyYW1l
RGV0YWNoZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRl
bmQ6OkNvbnNvbGU6Om1lc3NhZ2VBZGRlZCgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNvbnNv
bGU6OkNvbnNvbGVNZXNzYWdlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdl
KQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlQWRkZWRNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIG1lc3NhZ2VBZGRlZE1lc3NhZ2UtPnNldFN0cmlu
ZygibWV0aG9kIiwgIkNvbnNvbGUubWVzc2FnZUFkZGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXRPYmplY3QoIm1lc3NhZ2UiLCBtZXNzYWdlKTsKICAgIG1lc3NhZ2VBZGRl
ZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKG1lc3NhZ2VBZGRlZE1lc3NhZ2UtPnRvSlNPTlN0cmlu
ZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6Q29uc29sZTo6bWVzc2FnZVJlcGVhdENv
dW50VXBkYXRlZChpbnQgY291bnQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IG1lc3Nh
Z2VSZXBlYXRDb3VudFVwZGF0ZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIG1lc3NhZ2VSZXBlYXRDb3VudFVwZGF0ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIs
ICJDb25zb2xlLm1lc3NhZ2VSZXBlYXRDb3VudFVwZGF0ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBw
YXJhbXNPYmplY3QtPnNldE51bWJlcigiY291bnQiLCBjb3VudCk7CiAgICBtZXNzYWdlUmVwZWF0
Q291bnRVcGRhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwog
ICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJv
bnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobWVzc2FnZVJlcGVhdENvdW50VXBk
YXRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6
Q29uc29sZTo6bWVzc2FnZXNDbGVhcmVkKCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
bWVzc2FnZXNDbGVhcmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBt
ZXNzYWdlc0NsZWFyZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJDb25zb2xlLm1lc3Nh
Z2VzQ2xlYXJlZCIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAg
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQobWVzc2Fn
ZXNDbGVhcmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250
ZW5kOjpOZXR3b3JrOjpyZXF1ZXN0V2lsbEJlU2VudCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3
b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIC8qY29uc3QgVHlwZUJ1
aWxkZXI6Ok5ldHdvcms6OkZyYW1lSWQmKi8gY29uc3QgU3RyaW5nJiBmcmFtZUlkLCAvKmNvbnN0
IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpMb2FkZXJJZCYqLyBjb25zdCBTdHJpbmcmIGxvYWRlcklk
LCBjb25zdCBTdHJpbmcmIGRvY3VtZW50VVJMLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5l
dHdvcms6OlJlcXVlc3Q+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcXVlc3QsIGRv
dWJsZSB0aW1lc3RhbXAsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6SW5pdGlh
dG9yPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBpbml0aWF0b3IsIC8qUGFzc1JlZlB0
cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlwZUJ1aWxkZXI6OkNvbnNvbGU6OkNhbGxGcmFtZSA+ID4q
LyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBzdGFja1RyYWNlLCAvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6Ok5ldHdvcms6OlJlc3BvbnNlPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiByZWRpcmVjdFJlc3BvbnNlKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXF1ZXN0
V2lsbEJlU2VudE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcmVxdWVz
dFdpbGxCZVNlbnRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJOZXR3b3JrLnJlcXVlc3RX
aWxsQmVTZW50Iik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJ
bnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJl
cXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygiZnJhbWVJ
ZCIsIGZyYW1lSWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoImxvYWRlcklkIiwgbG9h
ZGVySWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoImRvY3VtZW50VVJMIiwgZG9jdW1l
bnRVUkwpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoInJlcXVlc3QiLCByZXF1ZXN0KTsK
ICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0aW1lc3RhbXAiLCB0aW1lc3RhbXApOwogICAg
cGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoImluaXRpYXRvciIsIGluaXRpYXRvcik7CiAgICBpZiAo
c3RhY2tUcmFjZSkKICAgICAgICBwYXJhbXNPYmplY3QtPnNldEFycmF5KCJzdGFja1RyYWNlIiwg
c3RhY2tUcmFjZSk7CiAgICBpZiAocmVkaXJlY3RSZXNwb25zZSkKICAgICAgICBwYXJhbXNPYmpl
Y3QtPnNldE9iamVjdCgicmVkaXJlY3RSZXNwb25zZSIsIHJlZGlyZWN0UmVzcG9uc2UpOwogICAg
cmVxdWVzdFdpbGxCZVNlbnRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVj
dCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0
b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXF1ZXN0V2lsbEJlU2Vu
dE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0
d29yazo6cmVxdWVzdFNlcnZlZEZyb21DYWNoZSgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3Jr
OjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQpCnsKICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGVNZXNzYWdlID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgIHJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGVNZXNzYWdlLT5zZXRTdHJp
bmcoIm1ldGhvZCIsICJOZXR3b3JrLnJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUiKTsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElkKTsK
ICAgIHJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGVNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBh
cmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAg
bV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChyZXF1ZXN0
U2VydmVkRnJvbUNhY2hlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3Rv
ckZyb250ZW5kOjpOZXR3b3JrOjpyZXNwb25zZVJlY2VpdmVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6
Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgLypjb25zdCBU
eXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1lSWQsIC8q
Y29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkxvYWRlcklkJiovIGNvbnN0IFN0cmluZyYgbG9h
ZGVySWQsIGRvdWJsZSB0aW1lc3RhbXAsIC8qVHlwZUJ1aWxkZXI6OlBhZ2U6OlJlc291cmNlVHlw
ZTo6RW51bSovIGNvbnN0IFN0cmluZyYgdHlwZSwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpO
ZXR3b3JrOjpSZXNwb25zZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVzcG9uc2Up
CnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlUmVjZWl2ZWRNZXNzYWdlID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHJlc3BvbnNlUmVjZWl2ZWRNZXNzYWdlLT5z
ZXRTdHJpbmcoIm1ldGhvZCIsICJOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQiKTsKICAgIFJlZlB0
cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElkKTsK
ICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJmcmFtZUlkIiwgZnJhbWVJZCk7CiAgICBwYXJh
bXNPYmplY3QtPnNldFN0cmluZygibG9hZGVySWQiLCBsb2FkZXJJZCk7CiAgICBwYXJhbXNPYmpl
Y3QtPnNldE51bWJlcigidGltZXN0YW1wIiwgdGltZXN0YW1wKTsKICAgIHBhcmFtc09iamVjdC0+
c2V0U3RyaW5nKCJ0eXBlIiwgdHlwZSk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgicmVz
cG9uc2UiLCByZXNwb25zZSk7CiAgICByZXNwb25zZVJlY2VpdmVkTWVzc2FnZS0+c2V0T2JqZWN0
KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJv
bnRlbmQocmVzcG9uc2VSZWNlaXZlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJ
bnNwZWN0b3JGcm9udGVuZDo6TmV0d29yazo6ZGF0YVJlY2VpdmVkKC8qY29uc3QgVHlwZUJ1aWxk
ZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgZG91Ymxl
IHRpbWVzdGFtcCwgaW50IGRhdGFMZW5ndGgsIGludCBlbmNvZGVkRGF0YUxlbmd0aCkKewogICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YVJlY2VpdmVkTWVzc2FnZSA9IEluc3BlY3Rvck9i
amVjdDo6Y3JlYXRlKCk7CiAgICBkYXRhUmVjZWl2ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhv
ZCIsICJOZXR3b3JrLmRhdGFSZWNlaXZlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVj
dC0+c2V0U3RyaW5nKCJyZXF1ZXN0SWQiLCByZXF1ZXN0SWQpOwogICAgcGFyYW1zT2JqZWN0LT5z
ZXROdW1iZXIoInRpbWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51
bWJlcigiZGF0YUxlbmd0aCIsIGRhdGFMZW5ndGgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1i
ZXIoImVuY29kZWREYXRhTGVuZ3RoIiwgZW5jb2RlZERhdGFMZW5ndGgpOwogICAgZGF0YVJlY2Vp
dmVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZGF0YVJlY2VpdmVkTWVzc2FnZS0+dG9KU09OU3Ry
aW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpOZXR3b3JrOjpsb2FkaW5nRmluaXNo
ZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVxdWVzdElkJiovIGNvbnN0IFN0cmlu
ZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBsb2FkaW5nRmluaXNoZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsK
ICAgIGxvYWRpbmdGaW5pc2hlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIk5ldHdvcmsu
bG9hZGluZ0ZpbmlzaGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmpl
Y3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJp
bmcoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigi
dGltZXN0YW1wIiwgdGltZXN0YW1wKTsKICAgIGxvYWRpbmdGaW5pc2hlZE1lc3NhZ2UtPnNldE9i
amVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKGxvYWRpbmdGaW5pc2hlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9p
ZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0d29yazo6bG9hZGluZ0ZhaWxlZCgvKmNvbnN0IFR5cGVC
dWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRv
dWJsZSB0aW1lc3RhbXAsIGNvbnN0IFN0cmluZyYgZXJyb3JUZXh0LCBjb25zdCBib29sKiBjb25z
dCBjYW5jZWxlZCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gbG9hZGluZ0ZhaWxlZE1l
c3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgbG9hZGluZ0ZhaWxlZE1lc3Nh
Z2UtPnNldFN0cmluZygibWV0aG9kIiwgIk5ldHdvcmsubG9hZGluZ0ZhaWxlZCIpOwogICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJyZXF1ZXN0SWQiLCByZXF1ZXN0SWQp
OwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInRpbWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAg
ICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygiZXJyb3JUZXh0IiwgZXJyb3JUZXh0KTsKICAgIGlm
IChjYW5jZWxlZCkKICAgICAgICBwYXJhbXNPYmplY3QtPnNldEJvb2xlYW4oImNhbmNlbGVkIiwg
KmNhbmNlbGVkKTsKICAgIGxvYWRpbmdGYWlsZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIs
IHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAg
ICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChsb2Fk
aW5nRmFpbGVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250
ZW5kOjpOZXR3b3JrOjpyZXF1ZXN0U2VydmVkRnJvbU1lbW9yeUNhY2hlKC8qY29uc3QgVHlwZUJ1
aWxkZXI6Ok5ldHdvcms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgLypj
b25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6RnJhbWVJZCYqLyBjb25zdCBTdHJpbmcmIGZyYW1l
SWQsIC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdvcms6OkxvYWRlcklkJiovIGNvbnN0IFN0cmlu
ZyYgbG9hZGVySWQsIGNvbnN0IFN0cmluZyYgZG9jdW1lbnRVUkwsIGRvdWJsZSB0aW1lc3RhbXAs
IC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6SW5pdGlhdG9yPiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBpbml0aWF0b3IsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
TmV0d29yazo6Q2FjaGVkUmVzb3VyY2U+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJl
c291cmNlKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiByZXF1ZXN0U2VydmVkRnJvbU1l
bW9yeUNhY2hlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICByZXF1ZXN0
U2VydmVkRnJvbU1lbW9yeUNhY2hlTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiTmV0d29y
ay5yZXF1ZXN0U2VydmVkRnJvbU1lbW9yeUNhY2hlIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2Jq
ZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1z
T2JqZWN0LT5zZXRTdHJpbmcoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmpl
Y3QtPnNldFN0cmluZygiZnJhbWVJZCIsIGZyYW1lSWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRT
dHJpbmcoImxvYWRlcklkIiwgbG9hZGVySWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmco
ImRvY3VtZW50VVJMIiwgZG9jdW1lbnRVUkwpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIo
InRpbWVzdGFtcCIsIHRpbWVzdGFtcCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgiaW5p
dGlhdG9yIiwgaW5pdGlhdG9yKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2JqZWN0KCJyZXNvdXJj
ZSIsIHJlc291cmNlKTsKICAgIHJlcXVlc3RTZXJ2ZWRGcm9tTWVtb3J5Q2FjaGVNZXNzYWdlLT5z
ZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNz
YWdlVG9Gcm9udGVuZChyZXF1ZXN0U2VydmVkRnJvbU1lbW9yeUNhY2hlTWVzc2FnZS0+dG9KU09O
U3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpOZXR3b3JrOjp3ZWJTb2NrZXRX
aWxsU2VuZEhhbmRzaGFrZVJlcXVlc3QoLypjb25zdCBUeXBlQnVpbGRlcjo6TmV0d29yazo6UmVx
dWVzdElkJiovIGNvbnN0IFN0cmluZyYgcmVxdWVzdElkLCBkb3VibGUgdGltZXN0YW1wLCAvKlBh
c3NSZWZQdHI8VHlwZUJ1aWxkZXI6Ok5ldHdvcms6OldlYlNvY2tldFJlcXVlc3Q+Ki8gUGFzc1Jl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcXVlc3QpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHdlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdE1lc3NhZ2UgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgd2ViU29ja2V0V2lsbFNlbmRIYW5kc2hha2VSZXF1ZXN0TWVz
c2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiTmV0d29yay53ZWJTb2NrZXRXaWxsU2VuZEhhbmRz
aGFrZVJlcXVlc3QiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygi
cmVxdWVzdElkIiwgcmVxdWVzdElkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ0aW1l
c3RhbXAiLCB0aW1lc3RhbXApOwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoInJlcXVlc3Qi
LCByZXF1ZXN0KTsKICAgIHdlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdE1lc3NhZ2Ut
PnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1l
c3NhZ2VUb0Zyb250ZW5kKHdlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdE1lc3NhZ2Ut
PnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6TmV0d29yazo6d2Vi
U29ja2V0SGFuZHNoYWtlUmVzcG9uc2VSZWNlaXZlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3
b3JrOjpSZXF1ZXN0SWQmKi8gY29uc3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3Rh
bXAsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6TmV0d29yazo6V2ViU29ja2V0UmVzcG9uc2U+
Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3BvbnNlKQp7CiAgICBSZWZQdHI8SW5z
cGVjdG9yT2JqZWN0PiB3ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkTWVzc2FnZSA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICB3ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25z
ZVJlY2VpdmVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiTmV0d29yay53ZWJTb2NrZXRI
YW5kc2hha2VSZXNwb25zZVJlY2VpdmVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBw
YXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0
LT5zZXRTdHJpbmcoInJlcXVlc3RJZCIsIHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNl
dE51bWJlcigidGltZXN0YW1wIiwgdGltZXN0YW1wKTsKICAgIHBhcmFtc09iamVjdC0+c2V0T2Jq
ZWN0KCJyZXNwb25zZSIsIHJlc3BvbnNlKTsKICAgIHdlYlNvY2tldEhhbmRzaGFrZVJlc3BvbnNl
UmVjZWl2ZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBp
ZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZCh3ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25z
ZVJlY2VpdmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250
ZW5kOjpOZXR3b3JrOjp3ZWJTb2NrZXRDcmVhdGVkKC8qY29uc3QgVHlwZUJ1aWxkZXI6Ok5ldHdv
cms6OlJlcXVlc3RJZCYqLyBjb25zdCBTdHJpbmcmIHJlcXVlc3RJZCwgY29uc3QgU3RyaW5nJiB1
cmwpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHdlYlNvY2tldENyZWF0ZWRNZXNzYWdl
ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHdlYlNvY2tldENyZWF0ZWRNZXNzYWdl
LT5zZXRTdHJpbmcoIm1ldGhvZCIsICJOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQiKTsKICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElk
KTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwogICAgd2ViU29ja2V0
Q3JlYXRlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlm
IChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHdlYlNvY2tldENyZWF0ZWRNZXNzYWdlLT50
b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Ok5ldHdvcms6OndlYlNv
Y2tldENsb3NlZCgvKmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpSZXF1ZXN0SWQmKi8gY29u
c3QgU3RyaW5nJiByZXF1ZXN0SWQsIGRvdWJsZSB0aW1lc3RhbXApCnsKICAgIFJlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHdlYlNvY2tldENsb3NlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgd2ViU29ja2V0Q2xvc2VkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAi
TmV0d29yay53ZWJTb2NrZXRDbG9zZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBh
cmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3Qt
PnNldFN0cmluZygicmVxdWVzdElkIiwgcmVxdWVzdElkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0
TnVtYmVyKCJ0aW1lc3RhbXAiLCB0aW1lc3RhbXApOwogICAgd2ViU29ja2V0Q2xvc2VkTWVzc2Fn
ZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5k
TWVzc2FnZVRvRnJvbnRlbmQod2ViU29ja2V0Q2xvc2VkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkp
Owp9CgojaWYgRU5BQkxFKFNRTF9EQVRBQkFTRSkKCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRh
dGFiYXNlOjphZGREYXRhYmFzZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRhdGFiYXNlOjpE
YXRhYmFzZT4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YWJhc2UpCnsKICAgIFJl
ZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGFkZERhdGFiYXNlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVj
dDo6Y3JlYXRlKCk7CiAgICBhZGREYXRhYmFzZU1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwg
IkRhdGFiYXNlLmFkZERhdGFiYXNlIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJh
bXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5z
ZXRPYmplY3QoImRhdGFiYXNlIiwgZGF0YWJhc2UpOwogICAgYWRkRGF0YWJhc2VNZXNzYWdlLT5z
ZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNz
YWdlVG9Gcm9udGVuZChhZGREYXRhYmFzZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9p
ZCBJbnNwZWN0b3JGcm9udGVuZDo6RGF0YWJhc2U6OnNxbFRyYW5zYWN0aW9uU3VjY2VlZGVkKGlu
dCB0cmFuc2FjdGlvbklkLCAvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkFycmF5PFN0cmluZyA+
ID4qLyBQYXNzUmVmUHRyPEluc3BlY3RvckFycmF5PiBjb2x1bW5OYW1lcywgLypQYXNzUmVmUHRy
PFR5cGVCdWlsZGVyOjpBcnJheTxJbnNwZWN0b3JWYWx1ZSA+ID4qLyBQYXNzUmVmUHRyPEluc3Bl
Y3RvckFycmF5PiB2YWx1ZXMpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHNxbFRyYW5z
YWN0aW9uU3VjY2VlZGVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBz
cWxUcmFuc2FjdGlvblN1Y2NlZWRlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRhdGFi
YXNlLnNxbFRyYW5zYWN0aW9uU3VjY2VlZGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2Jq
ZWN0LT5zZXROdW1iZXIoInRyYW5zYWN0aW9uSWQiLCB0cmFuc2FjdGlvbklkKTsKICAgIHBhcmFt
c09iamVjdC0+c2V0QXJyYXkoImNvbHVtbk5hbWVzIiwgY29sdW1uTmFtZXMpOwogICAgcGFyYW1z
T2JqZWN0LT5zZXRBcnJheSgidmFsdWVzIiwgdmFsdWVzKTsKICAgIHNxbFRyYW5zYWN0aW9uU3Vj
Y2VlZGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYg
KG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRD
aGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoc3FsVHJhbnNhY3Rpb25TdWNjZWVkZWRNZXNz
YWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRhdGFiYXNl
OjpzcWxUcmFuc2FjdGlvbkZhaWxlZChpbnQgdHJhbnNhY3Rpb25JZCwgUGFzc1JlZlB0cjxJbnNw
ZWN0b3JPYmplY3Q+IHNxbEVycm9yKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBzcWxU
cmFuc2FjdGlvbkZhaWxlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
c3FsVHJhbnNhY3Rpb25GYWlsZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJEYXRhYmFz
ZS5zcWxUcmFuc2FjdGlvbkZhaWxlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFy
YW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+
c2V0TnVtYmVyKCJ0cmFuc2FjdGlvbklkIiwgdHJhbnNhY3Rpb25JZCk7CiAgICBwYXJhbXNPYmpl
Y3QtPnNldE9iamVjdCgic3FsRXJyb3IiLCBzcWxFcnJvcik7CiAgICBzcWxUcmFuc2FjdGlvbkZh
aWxlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmICht
X2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHNxbFRyYW5zYWN0aW9uRmFpbGVkTWVzc2FnZS0+
dG9KU09OU3RyaW5nKCkpOwp9CgojZW5kaWYgLy8gRU5BQkxFKFNRTF9EQVRBQkFTRSkKCiNpZiBF
TkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkluZGV4ZWRE
Qjo6ZGF0YWJhc2VOYW1lc0xvYWRlZChkb3VibGUgcmVxdWVzdElkLCAvKlBhc3NSZWZQdHI8VHlw
ZUJ1aWxkZXI6OkluZGV4ZWREQjo6U2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1lcz4qLyBQ
YXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gc2VjdXJpdHlPcmlnaW5XaXRoRGF0YWJhc2VOYW1l
cykKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YWJhc2VOYW1lc0xvYWRlZE1lc3Nh
Z2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgZGF0YWJhc2VOYW1lc0xvYWRlZE1l
c3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkluZGV4ZWREQi5kYXRhYmFzZU5hbWVzTG9hZGVk
Iik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInJlcXVlc3RJZCIs
IHJlcXVlc3RJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgic2VjdXJpdHlPcmlnaW5X
aXRoRGF0YWJhc2VOYW1lcyIsIHNlY3VyaXR5T3JpZ2luV2l0aERhdGFiYXNlTmFtZXMpOwogICAg
ZGF0YWJhc2VOYW1lc0xvYWRlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2Jq
ZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3Bl
Y3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGRhdGFiYXNlTmFtZXNM
b2FkZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6
OkluZGV4ZWREQjo6ZGF0YWJhc2VMb2FkZWQoaW50IHJlcXVlc3RJZCwgLypQYXNzUmVmUHRyPFR5
cGVCdWlsZGVyOjpJbmRleGVkREI6OkRhdGFiYXNlV2l0aE9iamVjdFN0b3Jlcz4qLyBQYXNzUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gZGF0YWJhc2VXaXRoT2JqZWN0U3RvcmVzKQp7CiAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBkYXRhYmFzZUxvYWRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmpl
Y3Q6OmNyZWF0ZSgpOwogICAgZGF0YWJhc2VMb2FkZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhv
ZCIsICJJbmRleGVkREIuZGF0YWJhc2VMb2FkZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmpl
Y3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNP
YmplY3QtPnNldE51bWJlcigicmVxdWVzdElkIiwgcmVxdWVzdElkKTsKICAgIHBhcmFtc09iamVj
dC0+c2V0T2JqZWN0KCJkYXRhYmFzZVdpdGhPYmplY3RTdG9yZXMiLCBkYXRhYmFzZVdpdGhPYmpl
Y3RTdG9yZXMpOwogICAgZGF0YWJhc2VMb2FkZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIs
IHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAg
ICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChkYXRh
YmFzZUxvYWRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKI2VuZGlmIC8vIEVOQUJMRShJ
TkRFWEVEX0RBVEFCQVNFKQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6RE9NU3RvcmFnZTo6YWRk
RE9NU3RvcmFnZSgvKlBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkRPTVN0b3JhZ2U6OkVudHJ5Piov
IFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBzdG9yYWdlKQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBhZGRET01TdG9yYWdlTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRl
KCk7CiAgICBhZGRET01TdG9yYWdlTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NU3Rv
cmFnZS5hZGRET01TdG9yYWdlIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNP
YmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRP
YmplY3QoInN0b3JhZ2UiLCBzdG9yYWdlKTsKICAgIGFkZERPTVN0b3JhZ2VNZXNzYWdlLT5zZXRP
YmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVu
ZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdl
VG9Gcm9udGVuZChhZGRET01TdG9yYWdlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lk
IEluc3BlY3RvckZyb250ZW5kOjpET01TdG9yYWdlOjp1cGRhdGVET01TdG9yYWdlKGludCBzdG9y
YWdlSWQpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHVwZGF0ZURPTVN0b3JhZ2VNZXNz
YWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHVwZGF0ZURPTVN0b3JhZ2VNZXNz
YWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJET01TdG9yYWdlLnVwZGF0ZURPTVN0b3JhZ2UiKTsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVj
dDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigic3RvcmFnZUlkIiwgc3Rv
cmFnZUlkKTsKICAgIHVwZGF0ZURPTVN0b3JhZ2VNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIs
IHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAg
ICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZCh1cGRh
dGVET01TdG9yYWdlTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZy
b250ZW5kOjpBcHBsaWNhdGlvbkNhY2hlOjphcHBsaWNhdGlvbkNhY2hlU3RhdHVzVXBkYXRlZCgv
KmNvbnN0IFR5cGVCdWlsZGVyOjpOZXR3b3JrOjpGcmFtZUlkJiovIGNvbnN0IFN0cmluZyYgZnJh
bWVJZCwgY29uc3QgU3RyaW5nJiBtYW5pZmVzdFVSTCwgaW50IHN0YXR1cykKewogICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gYXBwbGljYXRpb25DYWNoZVN0YXR1c1VwZGF0ZWRNZXNzYWdlID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGFwcGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRh
dGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiQXBwbGljYXRpb25DYWNoZS5hcHBsaWNh
dGlvbkNhY2hlU3RhdHVzVXBkYXRlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFy
YW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+
c2V0U3RyaW5nKCJmcmFtZUlkIiwgZnJhbWVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmlu
ZygibWFuaWZlc3RVUkwiLCBtYW5pZmVzdFVSTCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJl
cigic3RhdHVzIiwgc3RhdHVzKTsKICAgIGFwcGxpY2F0aW9uQ2FjaGVTdGF0dXNVcGRhdGVkTWVz
c2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5z
ZW5kTWVzc2FnZVRvRnJvbnRlbmQoYXBwbGljYXRpb25DYWNoZVN0YXR1c1VwZGF0ZWRNZXNzYWdl
LT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkFwcGxpY2F0aW9u
Q2FjaGU6Om5ldHdvcmtTdGF0ZVVwZGF0ZWQoYm9vbCBpc05vd09ubGluZSkKewogICAgUmVmUHRy
PEluc3BlY3Rvck9iamVjdD4gbmV0d29ya1N0YXRlVXBkYXRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgbmV0d29ya1N0YXRlVXBkYXRlZE1lc3NhZ2UtPnNldFN0cmlu
ZygibWV0aG9kIiwgIkFwcGxpY2F0aW9uQ2FjaGUubmV0d29ya1N0YXRlVXBkYXRlZCIpOwogICAg
UmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0Ojpj
cmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0Qm9vbGVhbigiaXNOb3dPbmxpbmUiLCBpc05v
d09ubGluZSk7CiAgICBuZXR3b3JrU3RhdGVVcGRhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJh
bXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQog
ICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQo
bmV0d29ya1N0YXRlVXBkYXRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKI2lmIEVOQUJM
RShGSUxFX1NZU1RFTSkKCiNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCgp2b2lkIEluc3Bl
Y3RvckZyb250ZW5kOjpET006OmRvY3VtZW50VXBkYXRlZCgpCnsKICAgIFJlZlB0cjxJbnNwZWN0
b3JPYmplY3Q+IGRvY3VtZW50VXBkYXRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgZG9jdW1lbnRVcGRhdGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9N
LmRvY3VtZW50VXBkYXRlZCIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQog
ICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQo
ZG9jdW1lbnRVcGRhdGVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3Rv
ckZyb250ZW5kOjpET006OnNldENoaWxkTm9kZXMoaW50IHBhcmVudElkLCAvKlBhc3NSZWZQdHI8
VHlwZUJ1aWxkZXI6OkFycmF5PFR5cGVCdWlsZGVyOjpET006Ok5vZGUgPiA+Ki8gUGFzc1JlZlB0
cjxJbnNwZWN0b3JBcnJheT4gbm9kZXMpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHNl
dENoaWxkTm9kZXNNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHNldENo
aWxkTm9kZXNNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJET00uc2V0Q2hpbGROb2RlcyIp
OwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJwYXJlbnRJZCIsIHBh
cmVudElkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0QXJyYXkoIm5vZGVzIiwgbm9kZXMpOwogICAg
c2V0Q2hpbGROb2Rlc01lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsK
ICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZy
b250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKHNldENoaWxkTm9kZXNNZXNzYWdl
LT50b0pTT05TdHJpbmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRPTTo6YXR0cmli
dXRlTW9kaWZpZWQoaW50IG5vZGVJZCwgY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcm
IHZhbHVlKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBhdHRyaWJ1dGVNb2RpZmllZE1l
c3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgYXR0cmlidXRlTW9kaWZpZWRN
ZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJET00uYXR0cmlidXRlTW9kaWZpZWQiKTsKICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigibm9kZUlkIiwgbm9kZUlkKTsK
ICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJuYW1lIiwgbmFtZSk7CiAgICBwYXJhbXNPYmpl
Y3QtPnNldFN0cmluZygidmFsdWUiLCB2YWx1ZSk7CiAgICBhdHRyaWJ1dGVNb2RpZmllZE1lc3Nh
Z2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2Vu
ZE1lc3NhZ2VUb0Zyb250ZW5kKGF0dHJpYnV0ZU1vZGlmaWVkTWVzc2FnZS0+dG9KU09OU3RyaW5n
KCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpET006OmF0dHJpYnV0ZVJlbW92ZWQoaW50
IG5vZGVJZCwgY29uc3QgU3RyaW5nJiBuYW1lKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBhdHRyaWJ1dGVSZW1vdmVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAg
ICBhdHRyaWJ1dGVSZW1vdmVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9NLmF0dHJp
YnV0ZVJlbW92ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigi
bm9kZUlkIiwgbm9kZUlkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJuYW1lIiwgbmFt
ZSk7CiAgICBhdHRyaWJ1dGVSZW1vdmVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJh
bXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoYXR0cmlidXRl
UmVtb3ZlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVu
ZDo6RE9NOjppbmxpbmVTdHlsZUludmFsaWRhdGVkKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6
QXJyYXk8aW50ID4gPiovIFBhc3NSZWZQdHI8SW5zcGVjdG9yQXJyYXk+IG5vZGVJZHMpCnsKICAg
IFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGlubGluZVN0eWxlSW52YWxpZGF0ZWRNZXNzYWdlID0g
SW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGlubGluZVN0eWxlSW52YWxpZGF0ZWRNZXNz
YWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJET00uaW5saW5lU3R5bGVJbnZhbGlkYXRlZCIpOwog
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0
OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0QXJyYXkoIm5vZGVJZHMiLCBub2RlSWRz
KTsKICAgIGlubGluZVN0eWxlSW52YWxpZGF0ZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIs
IHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAg
ICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChpbmxp
bmVTdHlsZUludmFsaWRhdGVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3Bl
Y3RvckZyb250ZW5kOjpET006OmNoYXJhY3RlckRhdGFNb2RpZmllZChpbnQgbm9kZUlkLCBjb25z
dCBTdHJpbmcmIGNoYXJhY3RlckRhdGEpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGNo
YXJhY3RlckRhdGFNb2RpZmllZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgY2hhcmFjdGVyRGF0YU1vZGlmaWVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRE9N
LmNoYXJhY3RlckRhdGFNb2RpZmllZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFy
YW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+
c2V0TnVtYmVyKCJub2RlSWQiLCBub2RlSWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmco
ImNoYXJhY3RlckRhdGEiLCBjaGFyYWN0ZXJEYXRhKTsKICAgIGNoYXJhY3RlckRhdGFNb2RpZmll
ZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5l
bC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGNoYXJhY3RlckRhdGFNb2RpZmllZE1lc3NhZ2UtPnRv
SlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6RE9NOjpjaGlsZE5vZGVD
b3VudFVwZGF0ZWQoaW50IG5vZGVJZCwgaW50IGNoaWxkTm9kZUNvdW50KQp7CiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBjaGlsZE5vZGVDb3VudFVwZGF0ZWRNZXNzYWdlID0gSW5zcGVjdG9y
T2JqZWN0OjpjcmVhdGUoKTsKICAgIGNoaWxkTm9kZUNvdW50VXBkYXRlZE1lc3NhZ2UtPnNldFN0
cmluZygibWV0aG9kIiwgIkRPTS5jaGlsZE5vZGVDb3VudFVwZGF0ZWQiKTsKICAgIFJlZlB0cjxJ
bnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7
CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigibm9kZUlkIiwgbm9kZUlkKTsKICAgIHBhcmFt
c09iamVjdC0+c2V0TnVtYmVyKCJjaGlsZE5vZGVDb3VudCIsIGNoaWxkTm9kZUNvdW50KTsKICAg
IGNoaWxkTm9kZUNvdW50VXBkYXRlZE1lc3NhZ2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1z
T2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2lu
c3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zyb250ZW5kKGNoaWxkTm9kZUNv
dW50VXBkYXRlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9u
dGVuZDo6RE9NOjpjaGlsZE5vZGVJbnNlcnRlZChpbnQgcGFyZW50Tm9kZUlkLCBpbnQgcHJldmlv
dXNOb2RlSWQsIC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6RE9NOjpOb2RlPiovIFBhc3NSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBub2RlKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBj
aGlsZE5vZGVJbnNlcnRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAg
Y2hpbGROb2RlSW5zZXJ0ZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJET00uY2hpbGRO
b2RlSW5zZXJ0ZWQiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigi
cGFyZW50Tm9kZUlkIiwgcGFyZW50Tm9kZUlkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVy
KCJwcmV2aW91c05vZGVJZCIsIHByZXZpb3VzTm9kZUlkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0
T2JqZWN0KCJub2RlIiwgbm9kZSk7CiAgICBjaGlsZE5vZGVJbnNlcnRlZE1lc3NhZ2UtPnNldE9i
amVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKGNoaWxkTm9kZUluc2VydGVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2
b2lkIEluc3BlY3RvckZyb250ZW5kOjpET006OmNoaWxkTm9kZVJlbW92ZWQoaW50IHBhcmVudE5v
ZGVJZCwgaW50IG5vZGVJZCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gY2hpbGROb2Rl
UmVtb3ZlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgY2hpbGROb2Rl
UmVtb3ZlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRPTS5jaGlsZE5vZGVSZW1vdmVk
Iik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JP
YmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInBhcmVudE5vZGVJ
ZCIsIHBhcmVudE5vZGVJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigibm9kZUlkIiwg
bm9kZUlkKTsKICAgIGNoaWxkTm9kZVJlbW92ZWRNZXNzYWdlLT5zZXRPYmplY3QoInBhcmFtcyIs
IHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAg
ICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChjaGls
ZE5vZGVSZW1vdmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZy
b250ZW5kOjpDU1M6Om1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkKCkKewogICAgUmVmUHRyPEluc3Bl
Y3Rvck9iamVjdD4gbWVkaWFRdWVyeVJlc3VsdENoYW5nZWRNZXNzYWdlID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgIG1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkTWVzc2FnZS0+c2V0U3Ry
aW5nKCJtZXRob2QiLCAiQ1NTLm1lZGlhUXVlcnlSZXN1bHRDaGFuZ2VkIik7CiAgICBpZiAobV9p
bnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5u
ZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChtZWRpYVF1ZXJ5UmVzdWx0Q2hhbmdlZE1lc3NhZ2Ut
PnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6VGltZWxpbmU6OmV2
ZW50UmVjb3JkZWQoLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpUaW1lbGluZTo6VGltZWxpbmVF
dmVudD4qLyBQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcmVjb3JkKQp7CiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiBldmVudFJlY29yZGVkTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICBldmVudFJlY29yZGVkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAi
VGltZWxpbmUuZXZlbnRSZWNvcmRlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFy
YW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+
c2V0T2JqZWN0KCJyZWNvcmQiLCByZWNvcmQpOwogICAgZXZlbnRSZWNvcmRlZE1lc3NhZ2UtPnNl
dE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3Nh
Z2VUb0Zyb250ZW5kKGV2ZW50UmVjb3JkZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0KCiNp
ZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRl
YnVnZ2VyOjpnbG9iYWxPYmplY3RDbGVhcmVkKCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gZ2xvYmFsT2JqZWN0Q2xlYXJlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgp
OwogICAgZ2xvYmFsT2JqZWN0Q2xlYXJlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRl
YnVnZ2VyLmdsb2JhbE9iamVjdENsZWFyZWQiKTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5k
Q2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VU
b0Zyb250ZW5kKGdsb2JhbE9iamVjdENsZWFyZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0K
CnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRlYnVnZ2VyOjpzY3JpcHRQYXJzZWQoLypjb25zdCBU
eXBlQnVpbGRlcjo6RGVidWdnZXI6OlNjcmlwdElkJiovIGNvbnN0IFN0cmluZyYgc2NyaXB0SWQs
IGNvbnN0IFN0cmluZyYgdXJsLCBpbnQgc3RhcnRMaW5lLCBpbnQgc3RhcnRDb2x1bW4sIGludCBl
bmRMaW5lLCBpbnQgZW5kQ29sdW1uLCBjb25zdCBib29sKiBjb25zdCBpc0NvbnRlbnRTY3JpcHQs
IGNvbnN0IFN0cmluZyYgc291cmNlTWFwVVJMKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0
PiBzY3JpcHRQYXJzZWRNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHNj
cmlwdFBhcnNlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIkRlYnVnZ2VyLnNjcmlwdFBh
cnNlZCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVj
dG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJzY3JpcHRJ
ZCIsIHNjcmlwdElkKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwog
ICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoInN0YXJ0TGluZSIsIHN0YXJ0TGluZSk7CiAgICBw
YXJhbXNPYmplY3QtPnNldE51bWJlcigic3RhcnRDb2x1bW4iLCBzdGFydENvbHVtbik7CiAgICBw
YXJhbXNPYmplY3QtPnNldE51bWJlcigiZW5kTGluZSIsIGVuZExpbmUpOwogICAgcGFyYW1zT2Jq
ZWN0LT5zZXROdW1iZXIoImVuZENvbHVtbiIsIGVuZENvbHVtbik7CiAgICBpZiAoaXNDb250ZW50
U2NyaXB0KQogICAgICAgIHBhcmFtc09iamVjdC0+c2V0Qm9vbGVhbigiaXNDb250ZW50U2NyaXB0
IiwgKmlzQ29udGVudFNjcmlwdCk7CiAgICBwYXJhbXNPYmplY3QtPnNldFN0cmluZygic291cmNl
TWFwVVJMIiwgc291cmNlTWFwVVJMKTsKICAgIHNjcmlwdFBhcnNlZE1lc3NhZ2UtPnNldE9iamVj
dCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zy
b250ZW5kKHNjcmlwdFBhcnNlZE1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNw
ZWN0b3JGcm9udGVuZDo6RGVidWdnZXI6OnNjcmlwdEZhaWxlZFRvUGFyc2UoY29uc3QgU3RyaW5n
JiB1cmwsIGNvbnN0IFN0cmluZyYgc2NyaXB0U291cmNlLCBpbnQgc3RhcnRMaW5lLCBpbnQgZXJy
b3JMaW5lLCBjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSkKewogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gc2NyaXB0RmFpbGVkVG9QYXJzZU1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgc2NyaXB0RmFpbGVkVG9QYXJzZU1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9k
IiwgIkRlYnVnZ2VyLnNjcmlwdEZhaWxlZFRvUGFyc2UiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHBhcmFtc09iamVjdCA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJh
bXNPYmplY3QtPnNldFN0cmluZygidXJsIiwgdXJsKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3Ry
aW5nKCJzY3JpcHRTb3VyY2UiLCBzY3JpcHRTb3VyY2UpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRO
dW1iZXIoInN0YXJ0TGluZSIsIHN0YXJ0TGluZSk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJl
cigiZXJyb3JMaW5lIiwgZXJyb3JMaW5lKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJl
cnJvck1lc3NhZ2UiLCBlcnJvck1lc3NhZ2UpOwogICAgc2NyaXB0RmFpbGVkVG9QYXJzZU1lc3Nh
Z2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2Vu
ZE1lc3NhZ2VUb0Zyb250ZW5kKHNjcmlwdEZhaWxlZFRvUGFyc2VNZXNzYWdlLT50b0pTT05TdHJp
bmcoKSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OkRlYnVnZ2VyOjpicmVha3BvaW50UmVz
b2x2ZWQoLypjb25zdCBUeXBlQnVpbGRlcjo6RGVidWdnZXI6OkJyZWFrcG9pbnRJZCYqLyBjb25z
dCBTdHJpbmcmIGJyZWFrcG9pbnRJZCwgLypQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpEZWJ1Z2dl
cjo6TG9jYXRpb24+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGxvY2F0aW9uKQp7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBicmVha3BvaW50UmVzb2x2ZWRNZXNzYWdlID0gSW5z
cGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGJyZWFrcG9pbnRSZXNvbHZlZE1lc3NhZ2UtPnNl
dFN0cmluZygibWV0aG9kIiwgIkRlYnVnZ2VyLmJyZWFrcG9pbnRSZXNvbHZlZCIpOwogICAgUmVm
UHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVh
dGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0U3RyaW5nKCJicmVha3BvaW50SWQiLCBicmVha3Bv
aW50SWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRPYmplY3QoImxvY2F0aW9uIiwgbG9jYXRpb24p
OwogICAgYnJlYWtwb2ludFJlc29sdmVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJh
bXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoYnJlYWtwb2lu
dFJlc29sdmVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250
ZW5kOjpEZWJ1Z2dlcjo6cGF1c2VkKC8qUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6QXJyYXk8VHlw
ZUJ1aWxkZXI6OkRlYnVnZ2VyOjpDYWxsRnJhbWUgPiA+Ki8gUGFzc1JlZlB0cjxJbnNwZWN0b3JB
cnJheT4gY2FsbEZyYW1lcywgLypSZWFzb246OkVudW0qLyBjb25zdCBTdHJpbmcmIHJlYXNvbiwg
UGFzc1JlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRhdGEpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JP
YmplY3Q+IHBhdXNlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGF1
c2VkTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiRGVidWdnZXIucGF1c2VkIik7CiAgICBS
ZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRBcnJheSgiY2FsbEZyYW1lcyIsIGNhbGxGcmFt
ZXMpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInJlYXNvbiIsIHJlYXNvbik7CiAgICBp
ZiAoZGF0YSkKICAgICAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgiZGF0YSIsIGRhdGEpOwog
ICAgcGF1c2VkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAg
aWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRl
bmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQocGF1c2VkTWVzc2FnZS0+dG9KU09OU3Ry
aW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpEZWJ1Z2dlcjo6cmVzdW1lZCgpCnsK
ICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlc3VtZWRNZXNzYWdlID0gSW5zcGVjdG9yT2Jq
ZWN0OjpjcmVhdGUoKTsKICAgIHJlc3VtZWRNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJE
ZWJ1Z2dlci5yZXN1bWVkIik7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwpCiAg
ICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNzYWdlVG9Gcm9udGVuZChy
ZXN1bWVkTWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9CgojZW5kaWYgLy8gRU5BQkxFKEpBVkFT
Q1JJUFRfREVCVUdHRVIpCgojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCgojZW5kaWYg
Ly8gRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCgojaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVC
VUdHRVIpCgp2b2lkIEluc3BlY3RvckZyb250ZW5kOjpQcm9maWxlcjo6YWRkUHJvZmlsZUhlYWRl
cihQYXNzUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gaGVhZGVyKQp7CiAgICBSZWZQdHI8SW5zcGVj
dG9yT2JqZWN0PiBhZGRQcm9maWxlSGVhZGVyTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3Jl
YXRlKCk7CiAgICBhZGRQcm9maWxlSGVhZGVyTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAi
UHJvZmlsZXIuYWRkUHJvZmlsZUhlYWRlciIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4g
cGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVj
dC0+c2V0T2JqZWN0KCJoZWFkZXIiLCBoZWFkZXIpOwogICAgYWRkUHJvZmlsZUhlYWRlck1lc3Nh
Z2UtPnNldE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3Rv
ckZyb250ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2Vu
ZE1lc3NhZ2VUb0Zyb250ZW5kKGFkZFByb2ZpbGVIZWFkZXJNZXNzYWdlLT50b0pTT05TdHJpbmco
KSk7Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OlByb2ZpbGVyOjphZGRIZWFwU25hcHNob3RD
aHVuayhpbnQgdWlkLCBjb25zdCBTdHJpbmcmIGNodW5rKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBhZGRIZWFwU25hcHNob3RDaHVua01lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNy
ZWF0ZSgpOwogICAgYWRkSGVhcFNuYXBzaG90Q2h1bmtNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhv
ZCIsICJQcm9maWxlci5hZGRIZWFwU25hcHNob3RDaHVuayIpOwogICAgUmVmUHRyPEluc3BlY3Rv
ck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBh
cmFtc09iamVjdC0+c2V0TnVtYmVyKCJ1aWQiLCB1aWQpOwogICAgcGFyYW1zT2JqZWN0LT5zZXRT
dHJpbmcoImNodW5rIiwgY2h1bmspOwogICAgYWRkSGVhcFNuYXBzaG90Q2h1bmtNZXNzYWdlLT5z
ZXRPYmplY3QoInBhcmFtcyIsIHBhcmFtc09iamVjdCk7CiAgICBpZiAobV9pbnNwZWN0b3JGcm9u
dGVuZENoYW5uZWwpCiAgICAgICAgbV9pbnNwZWN0b3JGcm9udGVuZENoYW5uZWwtPnNlbmRNZXNz
YWdlVG9Gcm9udGVuZChhZGRIZWFwU25hcHNob3RDaHVua01lc3NhZ2UtPnRvSlNPTlN0cmluZygp
KTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6UHJvZmlsZXI6OmZpbmlzaEhlYXBTbmFwc2hv
dChpbnQgdWlkKQp7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBmaW5pc2hIZWFwU25hcHNo
b3RNZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGZpbmlzaEhlYXBTbmFw
c2hvdE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIlByb2ZpbGVyLmZpbmlzaEhlYXBTbmFw
c2hvdCIpOwogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVj
dG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0TnVtYmVyKCJ1aWQiLCB1
aWQpOwogICAgZmluaXNoSGVhcFNuYXBzaG90TWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBw
YXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAg
IG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZmluaXNo
SGVhcFNuYXBzaG90TWVzc2FnZS0+dG9KU09OU3RyaW5nKCkpOwp9Cgp2b2lkIEluc3BlY3RvckZy
b250ZW5kOjpQcm9maWxlcjo6c2V0UmVjb3JkaW5nUHJvZmlsZShib29sIGlzUHJvZmlsaW5nKQp7
CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBzZXRSZWNvcmRpbmdQcm9maWxlTWVzc2FnZSA9
IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBzZXRSZWNvcmRpbmdQcm9maWxlTWVzc2Fn
ZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiUHJvZmlsZXIuc2V0UmVjb3JkaW5nUHJvZmlsZSIpOwog
ICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gcGFyYW1zT2JqZWN0ID0gSW5zcGVjdG9yT2JqZWN0
OjpjcmVhdGUoKTsKICAgIHBhcmFtc09iamVjdC0+c2V0Qm9vbGVhbigiaXNQcm9maWxpbmciLCBp
c1Byb2ZpbGluZyk7CiAgICBzZXRSZWNvcmRpbmdQcm9maWxlTWVzc2FnZS0+c2V0T2JqZWN0KCJw
YXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVs
KQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRl
bmQoc2V0UmVjb3JkaW5nUHJvZmlsZU1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJ
bnNwZWN0b3JGcm9udGVuZDo6UHJvZmlsZXI6OnJlc2V0UHJvZmlsZXMoKQp7CiAgICBSZWZQdHI8
SW5zcGVjdG9yT2JqZWN0PiByZXNldFByb2ZpbGVzTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6
Y3JlYXRlKCk7CiAgICByZXNldFByb2ZpbGVzTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAi
UHJvZmlsZXIucmVzZXRQcm9maWxlcyIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFu
bmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJv
bnRlbmQocmVzZXRQcm9maWxlc01lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNw
ZWN0b3JGcm9udGVuZDo6UHJvZmlsZXI6OnJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzKGludCBk
b25lLCBpbnQgdG90YWwpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHJlcG9ydEhlYXBT
bmFwc2hvdFByb2dyZXNzTWVzc2FnZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBy
ZXBvcnRIZWFwU25hcHNob3RQcm9ncmVzc01lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIlBy
b2ZpbGVyLnJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzIik7CiAgICBSZWZQdHI8SW5zcGVjdG9y
T2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFy
YW1zT2JqZWN0LT5zZXROdW1iZXIoImRvbmUiLCBkb25lKTsKICAgIHBhcmFtc09iamVjdC0+c2V0
TnVtYmVyKCJ0b3RhbCIsIHRvdGFsKTsKICAgIHJlcG9ydEhlYXBTbmFwc2hvdFByb2dyZXNzTWVz
c2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3QpOwogICAgaWYgKG1faW5zcGVj
dG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5z
ZW5kTWVzc2FnZVRvRnJvbnRlbmQocmVwb3J0SGVhcFNuYXBzaG90UHJvZ3Jlc3NNZXNzYWdlLT50
b0pTT05TdHJpbmcoKSk7Cn0KCiNlbmRpZiAvLyBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikK
CiNpZiBFTkFCTEUoV09SS0VSUykKCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Oldvcmtlcjo6d29y
a2VyQ3JlYXRlZChpbnQgd29ya2VySWQsIGNvbnN0IFN0cmluZyYgdXJsLCBib29sIGluc3BlY3Rv
ckNvbm5lY3RlZCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVjdD4gd29ya2VyQ3JlYXRlZE1l
c3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgd29ya2VyQ3JlYXRlZE1lc3Nh
Z2UtPnNldFN0cmluZygibWV0aG9kIiwgIldvcmtlci53b3JrZXJDcmVhdGVkIik7CiAgICBSZWZQ
dHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmplY3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0
ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1iZXIoIndvcmtlcklkIiwgd29ya2VySWQpOwog
ICAgcGFyYW1zT2JqZWN0LT5zZXRTdHJpbmcoInVybCIsIHVybCk7CiAgICBwYXJhbXNPYmplY3Qt
PnNldEJvb2xlYW4oImluc3BlY3RvckNvbm5lY3RlZCIsIGluc3BlY3RvckNvbm5lY3RlZCk7CiAg
ICB3b3JrZXJDcmVhdGVkTWVzc2FnZS0+c2V0T2JqZWN0KCJwYXJhbXMiLCBwYXJhbXNPYmplY3Qp
OwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1faW5zcGVjdG9y
RnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQod29ya2VyQ3JlYXRlZE1lc3Nh
Z2UtPnRvSlNPTlN0cmluZygpKTsKfQoKdm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6V29ya2VyOjp3
b3JrZXJUZXJtaW5hdGVkKGludCB3b3JrZXJJZCkKewogICAgUmVmUHRyPEluc3BlY3Rvck9iamVj
dD4gd29ya2VyVGVybWluYXRlZE1lc3NhZ2UgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwog
ICAgd29ya2VyVGVybWluYXRlZE1lc3NhZ2UtPnNldFN0cmluZygibWV0aG9kIiwgIldvcmtlci53
b3JrZXJUZXJtaW5hdGVkIik7CiAgICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBwYXJhbXNPYmpl
Y3QgPSBJbnNwZWN0b3JPYmplY3Q6OmNyZWF0ZSgpOwogICAgcGFyYW1zT2JqZWN0LT5zZXROdW1i
ZXIoIndvcmtlcklkIiwgd29ya2VySWQpOwogICAgd29ya2VyVGVybWluYXRlZE1lc3NhZ2UtPnNl
dE9iamVjdCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250
ZW5kQ2hhbm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3Nh
Z2VUb0Zyb250ZW5kKHdvcmtlclRlcm1pbmF0ZWRNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7Cn0K
CnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Oldvcmtlcjo6ZGlzcGF0Y2hNZXNzYWdlRnJvbVdvcmtl
cihpbnQgd29ya2VySWQsIFBhc3NSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBtZXNzYWdlKQp7CiAg
ICBSZWZQdHI8SW5zcGVjdG9yT2JqZWN0PiBkaXNwYXRjaE1lc3NhZ2VGcm9tV29ya2VyTWVzc2Fn
ZSA9IEluc3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBkaXNwYXRjaE1lc3NhZ2VGcm9tV29y
a2VyTWVzc2FnZS0+c2V0U3RyaW5nKCJtZXRob2QiLCAiV29ya2VyLmRpc3BhdGNoTWVzc2FnZUZy
b21Xb3JrZXIiKTsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IHBhcmFtc09iamVjdCA9IElu
c3BlY3Rvck9iamVjdDo6Y3JlYXRlKCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE51bWJlcigid29y
a2VySWQiLCB3b3JrZXJJZCk7CiAgICBwYXJhbXNPYmplY3QtPnNldE9iamVjdCgibWVzc2FnZSIs
IG1lc3NhZ2UpOwogICAgZGlzcGF0Y2hNZXNzYWdlRnJvbVdvcmtlck1lc3NhZ2UtPnNldE9iamVj
dCgicGFyYW1zIiwgcGFyYW1zT2JqZWN0KTsKICAgIGlmIChtX2luc3BlY3RvckZyb250ZW5kQ2hh
bm5lbCkKICAgICAgICBtX2luc3BlY3RvckZyb250ZW5kQ2hhbm5lbC0+c2VuZE1lc3NhZ2VUb0Zy
b250ZW5kKGRpc3BhdGNoTWVzc2FnZUZyb21Xb3JrZXJNZXNzYWdlLT50b0pTT05TdHJpbmcoKSk7
Cn0KCnZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Oldvcmtlcjo6ZGlzY29ubmVjdGVkRnJvbVdvcmtl
cigpCnsKICAgIFJlZlB0cjxJbnNwZWN0b3JPYmplY3Q+IGRpc2Nvbm5lY3RlZEZyb21Xb3JrZXJN
ZXNzYWdlID0gSW5zcGVjdG9yT2JqZWN0OjpjcmVhdGUoKTsKICAgIGRpc2Nvbm5lY3RlZEZyb21X
b3JrZXJNZXNzYWdlLT5zZXRTdHJpbmcoIm1ldGhvZCIsICJXb3JrZXIuZGlzY29ubmVjdGVkRnJv
bVdvcmtlciIpOwogICAgaWYgKG1faW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsKQogICAgICAgIG1f
aW5zcGVjdG9yRnJvbnRlbmRDaGFubmVsLT5zZW5kTWVzc2FnZVRvRnJvbnRlbmQoZGlzY29ubmVj
dGVkRnJvbVdvcmtlck1lc3NhZ2UtPnRvSlNPTlN0cmluZygpKTsKfQoKI2VuZGlmIC8vIEVOQUJM
RShXT1JLRVJTKQoKCm5hbWVzcGFjZSBUeXBlQnVpbGRlciB7Cgpjb25zdCBjaGFyKiBjb25zdCBl
bnVtX2NvbnN0YW50X3ZhbHVlc1tdID0gewogICAgIkRvY3VtZW50IiwKICAgICJTdHlsZXNoZWV0
IiwKICAgICJJbWFnZSIsCiAgICAiRm9udCIsCiAgICAiU2NyaXB0IiwKICAgICJYSFIiLAogICAg
IldlYlNvY2tldCIsCiAgICAiT3RoZXIiLAogICAgIm9iamVjdCIsCiAgICAiZnVuY3Rpb24iLAog
ICAgInVuZGVmaW5lZCIsCiAgICAic3RyaW5nIiwKICAgICJudW1iZXIiLAogICAgImJvb2xlYW4i
LAogICAgImFycmF5IiwKICAgICJudWxsIiwKICAgICJub2RlIiwKICAgICJyZWdleHAiLAogICAg
ImRhdGUiLAogICAgImh0bWwiLAogICAgIndtbCIsCiAgICAieG1sIiwKICAgICJqYXZhc2NyaXB0
IiwKICAgICJuZXR3b3JrIiwKICAgICJjb25zb2xlLWFwaSIsCiAgICAib3RoZXIiLAogICAgInRp
cCIsCiAgICAibG9nIiwKICAgICJ3YXJuaW5nIiwKICAgICJlcnJvciIsCiAgICAiZGVidWciLAog
ICAgImRpciIsCiAgICAiZGlyeG1sIiwKICAgICJ0cmFjZSIsCiAgICAic3RhcnRHcm91cCIsCiAg
ICAic3RhcnRHcm91cENvbGxhcHNlZCIsCiAgICAiZW5kR3JvdXAiLAogICAgImFzc2VydCIsCiAg
ICAicGFyc2VyIiwKICAgICJzY3JpcHQiLAogICAgInVzZXIiLAogICAgInVzZXItYWdlbnQiLAog
ICAgImluc3BlY3RvciIsCiAgICAicmVndWxhciIsCiAgICAiYWN0aXZlIiwKICAgICJpbmFjdGl2
ZSIsCiAgICAiZGlzYWJsZWQiLAogICAgInN0eWxlIiwKICAgICJtZWRpYVJ1bGUiLAogICAgImlt
cG9ydFJ1bGUiLAogICAgImxpbmtlZFNoZWV0IiwKICAgICJpbmxpbmVTaGVldCIsCiAgICAiZ2xv
YmFsIiwKICAgICJsb2NhbCIsCiAgICAid2l0aCIsCiAgICAiY2xvc3VyZSIsCiAgICAiY2F0Y2gi
LAogICAgInN1YnRyZWUtbW9kaWZpZWQiLAogICAgImF0dHJpYnV0ZS1tb2RpZmllZCIsCiAgICAi
bm9kZS1yZW1vdmVkIiwKICAgICJET00iLAogICAgIkV2ZW50TGlzdGVuZXIiLAogICAgImV4Y2Vw
dGlvbiIKfTsKClN0cmluZyBnZXRFbnVtQ29uc3RhbnRWYWx1ZShpbnQgY29kZSkgewogICAgLy8g
VGVzdCB2YXJpYWJsZSBmcm9tIGdlbmVyYXRlZCBzb3VyY2VzLCBkZWNsYXJlZCBpbiBJbnNwZWN0
b3JUeXBlQnVpbGRlci5oIGFuZCBkZWZpbmVkIGluIEluc3BlY3RvclR5cGVCdWlsZGVyLmNwcAog
ICAgQVNTRVJUKHR5cGVCdWlsZGVyVGVzdFZhcmlhYmxlKTsKICAgIHJldHVybiBlbnVtX2NvbnN0
YW50X3ZhbHVlc1tjb2RlXTsKfQoKfSAvLyBuYW1lc3BhY2UgVHlwZUJ1aWxkZXIKCiNpZiAhQVNT
RVJUX0RJU0FCTEVECgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIFR5cGVCdWlsZGVyOjpBcnJh
eTxUPjo6YXNzZXJ0Q29ycmVjdFZhbHVlKEluc3BlY3RvclZhbHVlKiB2YWx1ZSkKewogICAgUmVm
UHRyPEluc3BlY3RvckFycmF5PiBhcnJheTsKICAgIGJvb2wgY2FzdFJlcyA9IHZhbHVlLT5hc0Fy
cmF5KCZhcnJheSk7CiAgICBBU1NFUlRfVU5VU0VEKGNhc3RSZXMsIGNhc3RSZXMpOwogICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IGFycmF5LT5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgQXJy
YXlJdGVtSGVscGVyPFQ+OjpUcmFpdHM6OnRlbXBsYXRlIGFzc2VydENvcnJlY3RWYWx1ZTxUPihh
cnJheS0+Z2V0KGkpLmdldCgpKTsKICAgIH0KfQoKCgojZW5kaWYgLy8gIUFTU0VSVF9ESVNBQkxF
RAoKfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQoKI2VuZGlmIC8vIEVOQUJMRShJTlNQRUNUT1IpCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>