<?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>27685</bug_id>
          
          <creation_ts>2009-07-25 16:56:17 -0700</creation_ts>
          <short_desc>[V8] Split up V8DOMMap.cpp by class</short_desc>
          <delta_ts>2009-07-27 23:05:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Adam Barth">abarth</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>134784</commentid>
    <comment_count>0</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-07-25 16:56:17 -0700</bug_when>
    <thetext>This file has too many classes.  Let&apos;s break them up into separate files.  I don&apos;t plan to change the interface at all.  Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134785</commentid>
    <comment_count>1</comment_count>
      <attachid>33499</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-07-25 16:59:22 -0700</bug_when>
    <thetext>Created attachment 33499
Patch (just copy/paste)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134786</commentid>
    <comment_count>2</comment_count>
      <attachid>33500</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-07-25 17:03:05 -0700</bug_when>
    <thetext>Created attachment 33500
Patch (just copy/paste)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134929</commentid>
    <comment_count>3</comment_count>
      <attachid>33500</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-27 09:16:13 -0700</bug_when>
    <thetext>Comment on attachment 33500
Patch (just copy/paste)

Just a few things that can be fixed up on landing.  

If the changes are substantial or you&apos;d like me to review the &quot;thread safe&quot; comments or fixes, feel free to put up for review again.


&gt; Index: WebCore/ChangeLog
&gt; +        * bindings/v8/DOMDataStore.cpp: Added.
&gt; +        (WebCore::DOMDataStore::DOMDataStore):
&gt; +        (WebCore::DOMDataStore::~DOMDataStore):
&gt; +        (WebCore::DOMDataStore::allStores):
&gt; +        (WebCore::DOMDataStore::allStoresMutex):
&gt; +        (WebCore::DOMDataStore::getDOMWrapperMap):
&gt; +        (WebCore::::forget):

Would be nice to fix this function definition: &quot;WebCore::::forget&quot;


&gt; Index: WebCore/WebCore.gypi
&gt;              &apos;bindings/js/StringSourceProvider.h&apos;,
&gt;              &apos;bindings/js/WorkerScriptController.cpp&apos;,
&gt;              &apos;bindings/js/WorkerScriptController.h&apos;,
&gt; +            &apos;bindings/v8/ChildThreadDOMData.h&apos;,
&gt; +            &apos;bindings/v8/ChildThreadDOMData.cpp&apos;,

For all changes in gypi, put foo.h after foo.cpp (sorting).

&gt; Index: WebCore/bindings/v8/DOMData.cpp

&gt; +
&gt; +DOMData* DOMData::getCurrent()
&gt; +{
&gt; +    if (WTF::isMainThread())
&gt; +        return getCurrentMainThread();
&gt; +
&gt; +    DEFINE_STATIC_LOCAL(WTF::ThreadSpecific&lt;ChildThreadDOMData&gt;, childThreadDOMData, ());

This looks like it has race conditions.  Please add a comment about why it isn&apos;t or consider switching to using AtomicallyInitializedStatic (from wtf/Threading.h).

&gt;
&gt; +void DOMData::ensureDeref(V8ClassIndex::V8WrapperType type, void* domObject)
&gt; +{
&gt; +    if (m_owningThread == WTF::currentThread()) {
&gt; +        // No need to delay the work.  We can deref right now.

Nice to change to single space after .


&gt; Index: WebCore/bindings/v8/DOMData.h
&gt; ===================================================================
&gt;
&gt; +    class DOMData: public Noncopyable {
Add space before &quot;:&quot;

&gt; +    public:
&gt; +        DOMData();
&gt; +
&gt; +        static DOMData* getCurrent();
&gt; +        static DOMData* getCurrentMainThread(); // Caller must be on the main thread.
&gt; +        virtual DOMDataStore&amp; getStore() = 0;
&gt; +
&gt; +        template&lt;typename T&gt;
&gt; +        static void handleWeakObject(DOMDataStore::DOMWrapperMapType mapType, v8::Handle&lt;v8::Object&gt; v8Object, T* domObject);
Remove redundant parameter names &quot;mapType&quot; and possibly &quot;v8Object&quot;.


&gt; +
&gt; +        void forgetDelayedObject(void* object) { m_delayedObjectMap.take(object); }
&gt; +
&gt; +        // This is to ensure that we will deref DOM objects from the owning thread,
&gt; +        // not the GC thread.  The helper function will be scheduled by the GC

Nice to change to single space after .

&gt; Index: WebCore/bindings/v8/DOMDataStore.cpp


&gt; +WTF::Mutex&amp; DOMDataStore::allStoresMutex()
&gt; +{
&gt; +    DEFINE_STATIC_LOCAL(WTF::Mutex, staticDOMDataListMutex, ());

This looks like it has race conditions.  Please add a comment about why it isn&apos;t or consider switching to using AtomicallyInitializedStatic (from wtf/Threading.h).



&gt; Index: WebCore/bindings/v8/DOMDataStore.h
&gt; ===================================================================

&gt; +
&gt; +#include &lt;wtf/HashMap.h&gt;
&gt; +#include &lt;wtf/MainThread.h&gt;
&gt; +#include &lt;wtf/Noncopyable.h&gt;
&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; +#include &lt;wtf/StdLibExtras.h&gt;
&gt; +#include &lt;wtf/Threading.h&gt;
&gt; +#include &lt;wtf/ThreadSpecific.h&gt;
&gt; +#include &lt;wtf/Vector.h&gt;
&gt; +#include &lt;v8.h&gt;

I would put v8.h before the wtf based on sorting.


&gt; +
&gt; +        template &lt;class KeyType&gt;
&gt; +        class InternalDOMWrapperMap : public DOMWrapperMap&lt;KeyType&gt; {
&gt; +        public:
&gt; +            InternalDOMWrapperMap(DOMData* domData, v8::WeakReferenceCallback callback)
&gt; +                : DOMWrapperMap&lt;KeyType&gt;(callback) , m_domData(domData) { }

Bad spacing before the ,

Actually, I would just format the code like this:
            InternalDOMWrapperMap(DOMData* domData, v8::WeakReferenceCallback callback)
                : DOMWrapperMap&lt;KeyType&gt;(callback)
                , m_domData(domData)
            {
            }


&gt; +        DOMDataStore(DOMData* domData);

Remove parameter name.



&gt; Index: WebCore/bindings/v8/ScopedDOMDataStore.cpp
&gt; +ScopedDOMDataStore::ScopedDOMDataStore(DOMData* domData) : DOMDataStore(domData)

Put &quot;: DOMDataStore(domData)&quot; on the next line.


&gt; Index: WebCore/bindings/v8/ScopedDOMDataStore.h
&gt; +    class ScopedDOMDataStore : public DOMDataStore {
&gt; +    public:
&gt; +        ScopedDOMDataStore(DOMData* domData);

Remove parameter name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134957</commentid>
    <comment_count>4</comment_count>
      <attachid>33558</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-07-27 11:24:36 -0700</bug_when>
    <thetext>Created attachment 33558
Patch with style feedback addressed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135127</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-07-27 23:05:52 -0700</bug_when>
    <thetext>Sending        WebCore/ChangeLog
Sending        WebCore/WebCore.gypi
Adding         WebCore/bindings/v8/ChildThreadDOMData.cpp
Adding         WebCore/bindings/v8/ChildThreadDOMData.h
Adding         WebCore/bindings/v8/DOMData.cpp
Adding         WebCore/bindings/v8/DOMData.h
Adding         WebCore/bindings/v8/DOMDataStore.cpp
Adding         WebCore/bindings/v8/DOMDataStore.h
Adding         WebCore/bindings/v8/MainThreadDOMData.cpp
Adding         WebCore/bindings/v8/MainThreadDOMData.h
Adding         WebCore/bindings/v8/ScopedDOMDataStore.cpp
Adding         WebCore/bindings/v8/ScopedDOMDataStore.h
Adding         WebCore/bindings/v8/StaticDOMDataStore.cpp
Adding         WebCore/bindings/v8/StaticDOMDataStore.h
Sending        WebCore/bindings/v8/V8DOMMap.cpp
Sending        WebCore/bindings/v8/V8DOMMap.h
Sending        WebCore/bindings/v8/V8GCController.cpp
Transmitting file data .................
Committed revision 46459.
http://trac.webkit.org/changeset/46459</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33499</attachid>
            <date>2009-07-25 16:59:22 -0700</date>
            <delta_ts>2009-07-25 17:02:56 -0700</delta_ts>
            <desc>Patch (just copy/paste)</desc>
            <filename>bug-27685-20090725165922.patch</filename>
            <type>text/plain</type>
            <size>70001</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NjQwMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjQgQEAKKzIwMDktMDctMjUgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbVjhd
IFNwbGl0IHVwIFY4RE9NTWFwLmNwcCBieSBjbGFzcworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2ODUKKworICAgICAgICBObyBiZWhhdmlvciBjaGFu
Z2UuICBKdXN0IGNvcHktYW5kLXBhc3RlLgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAg
ICAgICAqIGJpbmRpbmdzL3Y4L0NoaWxkVGhyZWFkRE9NRGF0YS5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6Q2hpbGRUaHJlYWRET01EYXRhOjpDaGlsZFRocmVhZERPTURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6Q2hpbGRUaHJlYWRET01EYXRhOjpnZXRTdG9yZSk6CisgICAgICAgICog
YmluZGluZ3MvdjgvQ2hpbGRUaHJlYWRET01EYXRhLmg6IEFkZGVkLgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L0RPTURhdGEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OkRP
TURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YTo6Z2V0Q3VycmVudCk6CisgICAgICAg
IChXZWJDb3JlOjpET01EYXRhOjpnZXRDdXJyZW50TWFpblRocmVhZCk6CisgICAgICAgIChXZWJD
b3JlOjpET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURh
dGE6OmVuc3VyZURlcmVmKToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OmRlcmVmT2JqZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OmRlcmVmRGVsYXllZE9iamVjdHMpOgorICAg
ICAgICAoV2ViQ29yZTo6RE9NRGF0YTo6ZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVh
ZCk6CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhOjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJN
YXApOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RPTURhdGEuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjopOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RPTURhdGFTdG9yZS5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpET01EYXRhU3RvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjp+RE9NRGF0YVN0b3JlKToKKyAgICAgICAgKFdlYkNv
cmU6OkRPTURhdGFTdG9yZTo6YWxsU3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGFT
dG9yZTo6YWxsU3RvcmVzTXV0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpn
ZXRET01XcmFwcGVyTWFwKToKKyAgICAgICAgKFdlYkNvcmU6Ojo6Zm9yZ2V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6d2Vha0RPTU9iamVjdENhbGxiYWNrKToKKyAgICAgICAg
KFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6d2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6d2Vha05vZGVDYWxsYmFjayk6CisgICAgICAg
IChXZWJDb3JlOjpET01EYXRhU3RvcmU6OndlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayk6
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OndlYWtTVkdPYmplY3RXaXRoQ29udGV4
dENhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9ET01EYXRhU3RvcmUuaDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpE
T01EYXRhU3RvcmU6OkludGVybmFsRE9NV3JhcHBlck1hcDo6SW50ZXJuYWxET01XcmFwcGVyTWFw
KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6SW50ZXJuYWxET01XcmFwcGVyTWFw
Ojpmb3JnZXRPbmx5KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6ZG9tRGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OmRvbU5vZGVNYXApOgorICAgICAgICAo
V2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpkb21PYmplY3RNYXApOgorICAgICAgICAoV2ViQ29yZTo6
RE9NRGF0YVN0b3JlOjphY3RpdmVEb21PYmplY3RNYXApOgorICAgICAgICAoV2ViQ29yZTo6RE9N
RGF0YVN0b3JlOjpkb21TdmdFbGVtZW50SW5zdGFuY2VNYXApOgorICAgICAgICAoV2ViQ29yZTo6
RE9NRGF0YVN0b3JlOjpkb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCk6CisgICAgICAgICogYmlu
ZGluZ3MvdjgvTWFpblRocmVhZERPTURhdGEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
Ok1haW5UaHJlYWRET01EYXRhOjpNYWluVGhyZWFkRE9NRGF0YSk6CisgICAgICAgIChXZWJDb3Jl
OjpNYWluVGhyZWFkRE9NRGF0YTo6Z2V0U3RvcmUpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L01h
aW5UaHJlYWRET01EYXRhLmg6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Njb3BlZERP
TURhdGFTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U2NvcGVkRE9NRGF0YVN0
b3JlOjpTY29wZWRET01EYXRhU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U2NvcGVkRE9NRGF0
YVN0b3JlOjp+U2NvcGVkRE9NRGF0YVN0b3JlKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TY29w
ZWRET01EYXRhU3RvcmUuaDogQWRkZWQuCisgICAgICAgICogYmluZGluZ3MvdjgvU3RhdGljRE9N
RGF0YVN0b3JlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTdGF0aWNET01EYXRhU3Rv
cmU6OlN0YXRpY0RPTURhdGFTdG9yZSk6CisgICAgICAgICogYmluZGluZ3MvdjgvU3RhdGljRE9N
RGF0YVN0b3JlLmg6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4RE9NTWFwLmNwcDoK
KwogMjAwOS0wNy0xNiAgU2hpbmljaGlybyBIYW1hamkgIDxoYW1hamlAY2hyb21pdW0ub3JnPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IE9saXZlciBIdW50LgpJbmRleDogV2ViQ29yZS9XZWJDb3Jl
Lmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDQ2MjM1
KQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTU4Miw2ICs1ODIs
OCBAQAogICAgICAgICAgICAgJ2JpbmRpbmdzL2pzL1N0cmluZ1NvdXJjZVByb3ZpZGVyLmgnLAog
ICAgICAgICAgICAgJ2JpbmRpbmdzL2pzL1dvcmtlclNjcmlwdENvbnRyb2xsZXIuY3BwJywKICAg
ICAgICAgICAgICdiaW5kaW5ncy9qcy9Xb3JrZXJTY3JpcHRDb250cm9sbGVyLmgnLAorICAgICAg
ICAgICAgJ2JpbmRpbmdzL3Y4L0NoaWxkVGhyZWFkRE9NRGF0YS5oJywKKyAgICAgICAgICAgICdi
aW5kaW5ncy92OC9DaGlsZFRocmVhZERPTURhdGEuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9jdXN0b20vVjhBYnN0cmFjdFdvcmtlckN1c3RvbS5jcHAnLAogICAgICAgICAgICAgJ2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOEF0dHJDdXN0b20uY3BwJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9jdXN0b20vVjhDYW52YXNQaXhlbEFycmF5Q3VzdG9tLmNwcCcsCkBAIC02NjAsMTEgKzY2
MiwxOSBAQAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhNTFNlcmlhbGl6ZXJD
b25zdHJ1Y3Rvci5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhQYXRo
RXZhbHVhdG9yQ29uc3RydWN0b3IuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9jdXN0
b20vVjhYU0xUUHJvY2Vzc29yQ3VzdG9tLmNwcCcsCisgICAgICAgICAgICAnYmluZGluZ3Mvdjgv
RE9NRGF0YS5oJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9ET01EYXRhLmNwcCcsCisgICAg
ICAgICAgICAnYmluZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmgnLAorICAgICAgICAgICAgJ2JpbmRp
bmdzL3Y4L0RPTURhdGFTdG9yZS5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L0RPTU9i
amVjdHNJbmNsdWRlLmgnLAorICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01E
YXRhLmgnLAorICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmNwcCcs
CiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvTlBWOE9iamVjdC5jcHAnLAogICAgICAgICAgICAg
J2JpbmRpbmdzL3Y4L05QVjhPYmplY3QuaCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2No
ZWR1bGVkQWN0aW9uLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2NoZWR1bGVkQWN0
aW9uLmgnLAorICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L1Njb3BlZERPTURhdGFTdG9yZS5oJywK
KyAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY29wZWRET01EYXRhU3RvcmUuY3BwJywKICAgICAg
ICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRDYWNoZWRGcmFtZURhdGEuaCcsCiAgICAgICAgICAg
ICAnYmluZGluZ3MvdjgvU2NyaXB0Q2FsbEZyYW1lLmNwcCcsCiAgICAgICAgICAgICAnYmluZGlu
Z3MvdjgvU2NyaXB0Q2FsbEZyYW1lLmgnLApAQCAtNjkwLDYgKzcwMCw4IEBACiAgICAgICAgICAg
ICAnYmluZGluZ3MvdjgvU2NyaXB0U3RyaW5nLmgnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4
L1NjcmlwdFZhbHVlLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2NyaXB0VmFsdWUu
aCcsCisgICAgICAgICAgICAnYmluZGluZ3MvdjgvU3RhdGljRE9NRGF0YVN0b3JlLmgnLAorICAg
ICAgICAgICAgJ2JpbmRpbmdzL3Y4L1N0YXRpY0RPTURhdGFTdG9yZS5jcHAnLAogICAgICAgICAg
ICAgJ2JpbmRpbmdzL3Y4L1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyLmNwcCcsCiAgICAgICAgICAg
ICAnYmluZGluZ3MvdjgvVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuaCcsCiAgICAgICAgICAgICAn
YmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcCcsCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L0No
aWxkVGhyZWFkRE9NRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9D
aGlsZFRocmVhZERPTURhdGEuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9DaGlsZFRocmVhZERPTURhdGEuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAq
IGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisg
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNoaWxkVGhyZWFkRE9NRGF0YS5oIgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK0NoaWxkVGhyZWFkRE9NRGF0YTo6Q2hpbGRUaHJlYWRET01EYXRh
KCkKKyAgICA6IG1fZGVmYXVsdFN0b3JlKHRoaXMpCit7Cit9CisKK0RPTURhdGFTdG9yZSYgQ2hp
bGRUaHJlYWRET01EYXRhOjpnZXRTdG9yZSgpCit7CisgICAgQVNTRVJUKCFXVEY6OmlzTWFpblRo
cmVhZCgpKTsKKyAgICAvLyBDdXJyZW50bHksIGNoaWxkIHRocmVhZHMgaGF2ZSBvbmx5IG9uZSB3
b3JsZC4KKyAgICByZXR1cm4gbV9kZWZhdWx0U3RvcmU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvQ2hpbGRUaHJlYWRET01EYXRhLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9DaGlsZFRocmVhZERPTURhdGEuaAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvQ2hpbGRUaHJlYWRET01EYXRhLmgJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
ICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENoaWxkVGhyZWFkRE9NRGF0YV9oCisj
ZGVmaW5lIENoaWxkVGhyZWFkRE9NRGF0YV9oCisKKyNpbmNsdWRlICJET01EYXRhLmgiCisjaW5j
bHVkZSAiU2NvcGVkRE9NRGF0YVN0b3JlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAg
IGNsYXNzIENoaWxkVGhyZWFkRE9NRGF0YSA6IHB1YmxpYyBET01EYXRhIHsKKyAgICBwdWJsaWM6
CisgICAgICAgIENoaWxkVGhyZWFkRE9NRGF0YSgpOworICAgICAgICBET01EYXRhU3RvcmUmIGdl
dFN0b3JlKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBTY29wZWRET01EYXRhU3RvcmUgbV9k
ZWZhdWx0U3RvcmU7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gQ2hpbGRUaHJlYWRET01EYXRhX2gKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0
YS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YS5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRPTURhdGEu
aCIKKworI2luY2x1ZGUgIkNoaWxkVGhyZWFkRE9NRGF0YS5oIgorI2luY2x1ZGUgIk1haW5UaHJl
YWRET01EYXRhLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworRE9NRGF0YTo6RE9NRGF0YSgp
CisgICAgOiBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkKGZhbHNlKQorICAgICwgbV9pc01h
aW5UaHJlYWQoV1RGOjppc01haW5UaHJlYWQoKSkKKyAgICAsIG1fb3duaW5nVGhyZWFkKFdURjo6
Y3VycmVudFRocmVhZCgpKQoreworfQorCitET01EYXRhKiBET01EYXRhOjpnZXRDdXJyZW50KCkK
K3sKKyAgICBpZiAoV1RGOjppc01haW5UaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGdldEN1cnJl
bnRNYWluVGhyZWFkKCk7CisKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFdURjo6VGhyZWFkU3Bl
Y2lmaWM8Q2hpbGRUaHJlYWRET01EYXRhPiwgY2hpbGRUaHJlYWRET01EYXRhLCAoKSk7CisgICAg
cmV0dXJuIGNoaWxkVGhyZWFkRE9NRGF0YTsKK30KKworRE9NRGF0YSogRE9NRGF0YTo6Z2V0Q3Vy
cmVudE1haW5UaHJlYWQoKQoreworICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKKyAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKE1haW5UaHJlYWRET01EYXRhLCBtYWluVGhyZWFkRE9NRGF0
YSwgKCkpOworICAgIHJldHVybiAmbWFpblRocmVhZERPTURhdGE7Cit9CisKKy8vIENhbGxlZCB3
aGVuIHRoZSBkZWFkIG9iamVjdCBpcyBub3QgaW4gR0MgdGhyZWFkJ3MgbWFwLiBHbyB0aHJvdWdo
IGFsbCB0aHJlYWQgbWFwcyB0byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyBpdC4KKy8vIFRoZW4g
Y2xlYXIgdGhlIEpTIHJlZmVyZW5jZSBhbmQgcHVzaCB0aGUgRE9NIG9iamVjdCBpbnRvIHRoZSBk
ZWxheWVkIHF1ZXVlIGZvciBpdCB0byBiZSBkZXJlZi1lZCBhdCBsYXRlciB0aW1lIGZyb20gdGhl
IG93bmluZyB0aHJlYWQuCisvLyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIEdDIHRocmVhZCBp
cyBub3QgdGhlIG93bmluZyB0aHJlYWQuCisvLyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBhbnkg
dGhyZWFkIHRoYXQgaGFzIEdDIHJ1bm5pbmcuCisvLyAqIE9ubHkgb25lIFY4IGluc3RhbmNlIGlz
IHJ1bm5pbmcgYXQgYSB0aW1lIGR1ZSB0byBWODo6TG9ja2VyLiBTbyB3ZSBkb24ndCBuZWVkIHRv
IHdvcnJ5IGFib3V0IGNvbmN1cnJlbmN5LgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgRE9N
RGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTVdyYXBwZXJNYXBUeXBlIG1h
cFR5cGUsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhPYmplY3QsIFQqIGRvbU9iamVjdCkKK3sK
KworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0
ZXgoKSk7CisgICAgRE9NRGF0YUxpc3QmIGxpc3QgPSBET01EYXRhU3RvcmU6OmFsbFN0b3Jlcygp
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7ICsraSkgeworICAgICAg
ICBET01EYXRhU3RvcmUqIHN0b3JlID0gbGlzdFtpXTsKKworICAgICAgICBET01EYXRhU3RvcmU6
OkludGVybmFsRE9NV3JhcHBlck1hcDxUPiogZG9tTWFwID0gc3RhdGljX2Nhc3Q8RE9NRGF0YVN0
b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8VD4qPihzdG9yZS0+Z2V0RE9NV3JhcHBlck1hcCht
YXBUeXBlKSk7CisKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZG9t
TWFwLT5nZXQoZG9tT2JqZWN0KTsKKyAgICAgICAgaWYgKCp3cmFwcGVyID09ICp2OE9iamVjdCkg
eworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIEpTIHJlZmVyZW5jZS4KKyAgICAgICAgICAgIGRv
bU1hcC0+Zm9yZ2V0T25seShkb21PYmplY3QpOworICAgICAgICAgICAgc3RvcmUtPmRvbURhdGEo
KS0+ZW5zdXJlRGVyZWYoVjhET01XcmFwcGVyOjpkb21XcmFwcGVyVHlwZSh2OE9iamVjdCksIGRv
bU9iamVjdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRE9NRGF0YTo6ZW5zdXJlRGVy
ZWYoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCkKK3sK
KyAgICBpZiAobV9vd25pbmdUaHJlYWQgPT0gV1RGOjpjdXJyZW50VGhyZWFkKCkpIHsKKyAgICAg
ICAgLy8gTm8gbmVlZCB0byBkZWxheSB0aGUgd29yay4gIFdlIGNhbiBkZXJlZiByaWdodCBub3cu
CisgICAgICAgIGRlcmVmT2JqZWN0KHR5cGUsIGRvbU9iamVjdCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIGRvIHRoZSBkZXJlZiBvbiB0aGUgY29ycmVjdCB0
aHJlYWQuCisgICAgbV9kZWxheWVkT2JqZWN0TWFwLnNldChkb21PYmplY3QsIHR5cGUpOworCisg
ICAgLy8gUG9zdCBhIHRhc2sgdG8gdGhlIG93bmluZyB0aHJlYWQgaW4gb3JkZXIgdG8gcHJvY2Vz
cyB0aGUgZGVsYXllZCBxdWV1ZS4KKyAgICAvLyBGSVhNRTogRm9yIG5vdywgd2UgY2FuIG9ubHkg
cG9zdCB0byBtYWluIHRocmVhZCBkdWUgdG8gV1RGIHRhc2sgcG9zdGluZyBsaW1pdGF0aW9uLiBX
ZSB3aWxsIGZpeCB0aGlzIHdoZW4gd2Ugd29yayBvbiBuZXN0ZWQgd29ya2VyLgorICAgIGlmICgh
bV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZCkgeworICAgICAgICBtX2RlbGF5ZWRQcm9jZXNz
aW5nU2NoZWR1bGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGlzTWFpblRocmVhZCgpKQorICAgICAg
ICAgICAgV1RGOjpjYWxsT25NYWluVGhyZWFkKCZkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50
VGhyZWFkLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgRE9NRGF0YTo6ZGVyZWZPYmplY3QoVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICBzd2l0
Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Tk9ERToKKyAgICAgICAgc3RhdGlj
X2Nhc3Q8Tm9kZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7CisgICAgICAgIGJyZWFrOworCisjZGVm
aW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgXAorICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
dHlwZTogc3RhdGljX2Nhc3Q8bmFtZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7IGJyZWFrOworICAg
IERPTV9PQkpFQ1RfVFlQRVMoTWFrZUNhc2UpICAgLy8gVGhpcyBpbmNsdWRlcyBib3RoIGFjdGl2
ZSBhbmQgbm9uLWFjdGl2ZS4KKyN1bmRlZiBNYWtlQ2FzZQorCisjaWYgRU5BQkxFKFNWRykKKyNk
ZWZpbmUgTWFrZUNhc2UodHlwZSwgbmFtZSkgICAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsK
KyAgICBTVkdfT0JKRUNUX1RZUEVTKE1ha2VDYXNlKSAgIC8vIFRoaXMgYWxzbyBpbmNsdWRlcyBT
VkdFbGVtZW50SW5zdGFuY2UuCisjdW5kZWYgTWFrZUNhc2UKKworI2RlZmluZSBNYWtlQ2FzZSh0
eXBlLCBuYW1lKSAgICAgXAorICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6dHlwZTogICAgXAor
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxuYW1lPio+KGRvbU9i
amVjdCktPmRlcmVmKCk7IGJyZWFrOworICAgIFNWR19QT0RfTkFUSVZFX1RZUEVTKE1ha2VDYXNl
KQorI3VuZGVmIE1ha2VDYXNlCisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgRE9NRGF0
YTo6ZGVyZWZEZWxheWVkT2JqZWN0cygpCit7CisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIo
RE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsKKworICAgIG1fZGVsYXllZFByb2Nlc3Np
bmdTY2hlZHVsZWQgPSBmYWxzZTsKKworICAgIGZvciAoRGVsYXllZE9iamVjdE1hcDo6aXRlcmF0
b3IgaXRlcihtX2RlbGF5ZWRPYmplY3RNYXAuYmVnaW4oKSk7IGl0ZXIgIT0gbV9kZWxheWVkT2Jq
ZWN0TWFwLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGRlcmVmT2JqZWN0KGl0ZXItPnNlY29uZCwg
aXRlci0+Zmlyc3QpOworCisgICAgbV9kZWxheWVkT2JqZWN0TWFwLmNsZWFyKCk7Cit9CisKK3Zv
aWQgRE9NRGF0YTo6ZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVhZCh2b2lkKikKK3sK
KyAgICBnZXRDdXJyZW50KCktPmRlcmVmRGVsYXllZE9iamVjdHMoKTsKK30KKwordGVtcGxhdGU8
dHlwZW5hbWUgVD4KK3ZvaWQgRE9NRGF0YTo6cmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwKERP
TVdyYXBwZXJNYXA8VD4mIGRvbU1hcCkKK3sKKyAgICBmb3IgKHR5cGVuYW1lIFdURjo6SGFzaE1h
cDxUKiwgdjg6Ok9iamVjdCo+OjppdGVyYXRvciBpdGVyKGRvbU1hcC5pbXBsKCkuYmVnaW4oKSk7
IGl0ZXIgIT0gZG9tTWFwLmltcGwoKS5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgIFQqIGRvbU9i
amVjdCA9IHN0YXRpY19jYXN0PFQqPihpdGVyLT5maXJzdCk7CisgICAgICAgIHY4OjpQZXJzaXN0
ZW50PHY4OjpPYmplY3Q+IHY4T2JqZWN0KGl0ZXItPnNlY29uZCk7CisKKyAgICAgICAgVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOERPTVdyYXBwZXI6OmRvbVdyYXBwZXJUeXBl
KHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpKTsKKworICAgICAgICAvLyBE
ZXJlZiB0aGUgRE9NIG9iamVjdC4KKyAgICAgICAgZGVyZWZPYmplY3QodHlwZSwgZG9tT2JqZWN0
KTsKKworICAgICAgICAvLyBDbGVhciB0aGUgSlMgd3JhcHBlci4KKyAgICAgICAgdjhPYmplY3Qu
RGlzcG9zZSgpOworICAgIH0KKyAgICBkb21NYXAuaW1wbCgpLmNsZWFyKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YS5oCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBET01EYXRhX2gKKyNkZWZpbmUgRE9NRGF0YV9oCisKKyNpbmNsdWRlICJE
T01EYXRhU3RvcmUuaCIKKworI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3Rm
L01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3
dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0
Zi9UaHJlYWRpbmcuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkU3BlY2lmaWMuaD4KKyNpbmNsdWRl
IDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8djguaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CisgICAgdHlwZWRlZiBXVEY6OlZlY3RvcjxET01EYXRhU3RvcmUqPiBET01EYXRhTGlzdDsKKwor
ICAgIC8vIERPTURhdGEKKyAgICAvLworICAgIC8vIERPTURhdGEgcmVwcmVzZW50cyB0aGUgYWxs
IHRoZSBET00gd3JhcHBlcnMgZm9yIGEgZ2l2ZW4gdGhyZWFkLiAgSW4KKyAgICAvLyBwYXJ0aWN1
bGFyLCBET01EYXRhIGhvbGRzIHdyYXBwZXJzIGZvciBhbGwgdGhlIGlzb2xhdGVkIHdvcmxkcyBp
biB0aGUKKyAgICAvLyB0aHJlYWQuICBUaGUgRE9NRGF0YSBmb3IgdGhlIG1haW4gdGhyZWFkIGFu
ZCB0aGUgRE9NRGF0YSBmb3IgY2hpbGQgdGhyZWFkcworICAgIC8vIHVzZSBkaWZmZXJlbnQgc3Vi
Y2xhc3Nlcy4KKyAgICAvLworICAgIGNsYXNzIERPTURhdGE6IHB1YmxpYyBOb25jb3B5YWJsZSB7
CisgICAgcHVibGljOgorICAgICAgICBET01EYXRhKCk7CisKKyAgICAgICAgc3RhdGljIERPTURh
dGEqIGdldEN1cnJlbnQoKTsKKyAgICAgICAgc3RhdGljIERPTURhdGEqIGdldEN1cnJlbnRNYWlu
VGhyZWFkKCk7IC8vIENhbGxlciBtdXN0IGJlIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAg
dmlydHVhbCBET01EYXRhU3RvcmUmIGdldFN0b3JlKCkgPSAwOworCisgICAgICAgIHRlbXBsYXRl
PHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyB2b2lkIGhhbmRsZVdlYWtPYmplY3QoRE9NRGF0
YVN0b3JlOjpET01XcmFwcGVyTWFwVHlwZSBtYXBUeXBlLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
IHY4T2JqZWN0LCBUKiBkb21PYmplY3QpOworCisgICAgICAgIHZvaWQgZm9yZ2V0RGVsYXllZE9i
amVjdCh2b2lkKiBvYmplY3QpIHsgbV9kZWxheWVkT2JqZWN0TWFwLnRha2Uob2JqZWN0KTsgfQor
CisgICAgICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgd2Ugd2lsbCBkZXJlZiBET00gb2Jq
ZWN0cyBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLAorICAgICAgICAvLyBub3QgdGhlIEdDIHRocmVh
ZC4gIFRoZSBoZWxwZXIgZnVuY3Rpb24gd2lsbCBiZSBzY2hlZHVsZWQgYnkgdGhlIEdDCisgICAg
ICAgIC8vIHRocmVhZCB0byBnZXQgY2FsbGVkIGZyb20gdGhlIG93bmluZyB0aHJlYWQuCisgICAg
ICAgIHN0YXRpYyB2b2lkIGRlcmVmRGVsYXllZE9iamVjdHNJbkN1cnJlbnRUaHJlYWQodm9pZCop
OworICAgICAgICB2b2lkIGRlcmVmRGVsYXllZE9iamVjdHMoKTsKKworICAgICAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgdm9pZCByZW1vdmVPYmplY3RzRnJvbVdyYXBw
ZXJNYXAoRE9NV3JhcHBlck1hcDxUPiYgZG9tTWFwKTsKKworICAgICAgICBUaHJlYWRJZGVudGlm
aWVyIG93bmluZ1RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1fb3duaW5nVGhyZWFkOyB9CisKKyAg
ICBwcml2YXRlOgorICAgICAgICB0eXBlZGVmIFdURjo6SGFzaE1hcDx2b2lkKiwgVjhDbGFzc0lu
ZGV4OjpWOFdyYXBwZXJUeXBlPiBEZWxheWVkT2JqZWN0TWFwOworCisgICAgICAgIHZvaWQgZW5z
dXJlRGVyZWYoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVj
dCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGRlcmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFw
cGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpOworCisgICAgICAgIC8vIFN0b3JlcyBhbGwg
dGhlIERPTSBvYmplY3RzIHRoYXQgYXJlIGRlbGF5ZWQgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gdGhl
CisgICAgICAgIC8vIG93bmluZyB0aHJlYWQgZ2FpbnMgY29udHJvbC4KKyAgICAgICAgRGVsYXll
ZE9iamVjdE1hcCBtX2RlbGF5ZWRPYmplY3RNYXA7CisKKyAgICAgICAgLy8gVGhlIGZsYWcgdG8g
aW5kaWNhdGUgaWYgdGhlIHRhc2sgdG8gZG8gdGhlIGRlbGF5ZWQgcHJvY2VzcyBoYXMKKyAgICAg
ICAgLy8gYWxyZWFkeSBiZWVuIHBvc3RlZC4KKyAgICAgICAgYm9vbCBtX2RlbGF5ZWRQcm9jZXNz
aW5nU2NoZWR1bGVkOworCisgICAgICAgIGJvb2wgbV9pc01haW5UaHJlYWQ7CisgICAgICAgIFRo
cmVhZElkZW50aWZpZXIgbV9vd25pbmdUaHJlYWQ7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gRE9NRGF0YV9oCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4
L0RPTURhdGFTdG9yZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9ET01E
YXRhU3RvcmUuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRh
U3RvcmUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJET01EYXRhU3RvcmUuaCIKKworI2luY2x1ZGUgIkRPTURhdGEuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBET00gYmluZGluZyBhbGdvcml0aG06CisvLworLy8g
VGhlcmUgYXJlIHR3byBraW5kcyBvZiBET00gb2JqZWN0czoKKy8vIDEuIERPTSB0cmVlIG5vZGVz
LCBzdWNoIGFzIERvY3VtZW50LCBIVE1MRWxlbWVudCwgLi4uCisvLyAgICB0aGVyZSBjbGFzc2Vz
IGltcGxlbWVudCBUcmVlU2hhcmVkPFQ+IGludGVyZmFjZTsKKy8vIDIuIE5vbi1ub2RlIERPTSBv
YmplY3RzLCBzdWNoIGFzIENTU1J1bGUsIExvY2F0aW9uLCBldGMuCisvLyAgICB0aGVzZSBjbGFz
c2VzIGltcGxlbWVudCBhIHJlZi1jb3VudGVkIHNjaGVtZS4KKy8vCisvLyBBIERPTSBvYmplY3Qg
bWF5IGhhdmUgYSBKUyB3cmFwcGVyIG9iamVjdC4gSWYgYSB0cmVlIG5vZGUKKy8vIGlzIGFsaXZl
LCBpdHMgSlMgd3JhcHBlciBtdXN0IGJlIGtlcHQgYWxpdmUgZXZlbiBpdCBpcyBub3QKKy8vIHJl
YWNoYWJsZSBmcm9tIEpTIHJvb3RzLgorLy8gSG93ZXZlciwgSlMgd3JhcHBlcnMgb2Ygbm9uLW5v
ZGUgb2JqZWN0cyBjYW4gZ28gYXdheSBpZgorLy8gbm90IHJlYWNoYWJsZSBmcm9tIG90aGVyIEpT
IG9iamVjdHMuIEl0IHdvcmtzIGxpa2UgYSBjYWNoZS4KKy8vCisvLyBET00gb2JqZWN0cyBhcmUg
cmVmLWNvdW50ZWQsIGFuZCBKUyBvYmplY3RzIGFyZSB0cmFjZWQgZnJvbQorLy8gYSBzZXQgb2Yg
cm9vdCBvYmplY3RzLiBUaGV5IGNhbiBjcmVhdGUgYSBjeWNsZS4gVG8gYnJlYWsKKy8vIGN5Y2xl
cywgd2UgZG8gZm9sbG93aW5nOgorLy8gICBIYW5kbGVzIGZyb20gRE9NIG9iamVjdHMgdG8gSlMg
d3JhcHBlcnMgYXJlIGFsd2F5cyB3ZWFrLAorLy8gc28gSlMgd3JhcHBlcnMgb2Ygbm9uLW5vZGUg
b2JqZWN0IGNhbm5vdCBjcmVhdGUgYSBjeWNsZS4KKy8vICAgQmVmb3JlIHN0YXJ0aW5nIGEgZ2xv
YmFsIEdDLCB3ZSBjcmVhdGUgYSB2aXJ0dWFsIGNvbm5lY3Rpb24KKy8vIGJldHdlZW4gbm9kZXMg
aW4gdGhlIHNhbWUgdHJlZSBpbiB0aGUgSlMgaGVhcC4gSWYgdGhlIHdyYXBwZXIKKy8vIG9mIG9u
ZSBub2RlIGluIGEgdHJlZSBpcyBhbGl2ZSwgd3JhcHBlcnMgb2YgYWxsIG5vZGVzIGluCisvLyB0
aGUgc2FtZSB0cmVlIGFyZSBjb25zaWRlcmVkIGFsaXZlLiBUaGlzIGlzIGRvbmUgYnkgY3JlYXRp
bmcKKy8vIG9iamVjdCBncm91cHMgaW4gR0MgcHJvbG9ndWUgY2FsbGJhY2tzLiBUaGUgbWFyay1j
b21wYWN0CisvLyBjb2xsZWN0b3Igd2lsbCByZW1vdmUgdGhlc2UgZ3JvdXBzIGFmdGVyIGVhY2gg
R0MuCisvLworLy8gRE9NIG9iamVjdHMgc2hvdWxkIGJlIGRlcmVmLWVkIGZyb20gdGhlIG93bmlu
ZyB0aHJlYWQsIG5vdCB0aGUgR0MgdGhyZWFkCisvLyB0aGF0IGRvZXMgbm90IG93biB0aGVtLiBJ
biBWOCwgR0MgY2FuIGtpY2sgaW4gZnJvbSBhbnkgdGhyZWFkLiBUbyBlbnN1cmUKKy8vIHRoYXQg
RE9NIG9iamVjdHMgYXJlIGFsd2F5cyBkZXJlZi1lZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkIHdo
ZW4gcnVubmluZworLy8gVjggaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50LCB3ZSBkbyBm
b2xsb3dpbmc6CisvLyAxLiBNYWludGFpbiBhIHRocmVhZCBzcGVjaWZpYyBET00gd3JhcHBlciBt
YXAgZm9yIGVhY2ggb2JqZWN0IG1hcC4KKy8vICAgIChXZSdyZSB1c2luZyBUTFMgc3VwcG9ydCBm
cm9tIFdURiBpbnN0ZWFkIG9mIGJhc2Ugc2luY2UgVjhCaW5kaW5ncworLy8gICAgIGRvZXMgbm90
IGRlcGVuZCBvbiBiYXNlLiBXZSBmdXJ0aGVyIGFzc3VtZSB0aGF0IGFsbCBjaGlsZCB0aHJlYWRz
CisvLyAgICAgcnVubmluZyBWOCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYnkgV1RGIGFuZCB0aHVz
IGEgZGVzdHJ1Y3RvciB3aWxsCisvLyAgICAgYmUgY2FsbGVkIHRvIGNsZWFuIHVwIGFsbCB0aHJl
YWQgc3BlY2lmaWMgZGF0YS4pCisvLyAyLiBXaGVuIEdDIGhhcHBlbnM6CisvLyAgICAyLjEuIElm
IHRoZSBkZWFkIG9iamVjdCBpcyBpbiBHQyB0aHJlYWQncyBtYXAsIHJlbW92ZSB0aGUgSlMgcmVm
ZXJlbmNlCisvLyAgICAgICAgIGFuZCBkZXJlZiB0aGUgRE9NIG9iamVjdC4KKy8vICAgIDIuMi4g
T3RoZXJ3aXNlLCBnbyB0aHJvdWdoIGFsbCB0aHJlYWQgbWFwcyB0byBmaW5kIHRoZSBvd25pbmcg
dGhyZWFkLgorLy8gICAgICAgICBSZW1vdmUgdGhlIEpTIHJlZmVyZW5jZSBmcm9tIHRoZSBvd25p
bmcgdGhyZWFkJ3MgbWFwIGFuZCBtb3ZlIHRoZQorLy8gICAgICAgICBET00gb2JqZWN0IHRvIGEg
ZGVsYXllZCBxdWV1ZS4gUG9zdCBhIHRhc2sgdG8gdGhlIG93bmluZyB0aHJlYWQKKy8vICAgICAg
ICAgdG8gaGF2ZSBpdCBkZXJlZi1lZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkIGF0IGxhdGVyIHRp
bWUuCisvLyAzLiBXaGVuIGEgdGhyZWFkIGlzIHRlYXJpbmcgZG93biwgaW52b2tlIGEgY2xlYW51
cCByb3V0aW5lIHRvIGdvIHRocm91Z2gKKy8vICAgIGFsbCBvYmplY3RzIGluIHRoZSBkZWxheWVk
IHF1ZXVlIGFuZCB0aGUgdGhyZWFkIG1hcCBhbmQgZGVyZWYgYWxsIG9mCisvLyAgICB0aGVtLgor
CisKK0RPTURhdGFTdG9yZTo6RE9NRGF0YVN0b3JlKERPTURhdGEqIGRvbURhdGEpCisgICAgOiBt
X2RvbU5vZGVNYXAoMCkKKyAgICAsIG1fZG9tT2JqZWN0TWFwKDApCisgICAgLCBtX2FjdGl2ZURv
bU9iamVjdE1hcCgwKQorI2lmIEVOQUJMRShTVkcpCisgICAgLCBtX2RvbVN2Z0VsZW1lbnRJbnN0
YW5jZU1hcCgwKQorICAgICwgbV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCgwKQorI2VuZGlm
CisgICAgLCBtX2RvbURhdGEoZG9tRGF0YSkKK3sKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tl
cihET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOworICAgIERPTURhdGFTdG9yZTo6YWxs
U3RvcmVzKCkuYXBwZW5kKHRoaXMpOworfQorCitET01EYXRhU3RvcmU6On5ET01EYXRhU3RvcmUo
KQoreworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVz
TXV0ZXgoKSk7CisgICAgRE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKS5yZW1vdmUoRE9NRGF0YVN0
b3JlOjphbGxTdG9yZXMoKS5maW5kKHRoaXMpKTsKK30KKworRE9NRGF0YUxpc3QmIERPTURhdGFT
dG9yZTo6YWxsU3RvcmVzKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERPTURhdGFMaXN0
LCBzdGF0aWNET01EYXRhTGlzdCwgKCkpOworICAgIHJldHVybiBzdGF0aWNET01EYXRhTGlzdDsK
K30KKworV1RGOjpNdXRleCYgRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpCit7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChXVEY6Ok11dGV4LCBzdGF0aWNET01EYXRhTGlzdE11dGV4LCAo
KSk7CisgICAgcmV0dXJuIHN0YXRpY0RPTURhdGFMaXN0TXV0ZXg7Cit9CisKK3ZvaWQqIERPTURh
dGFTdG9yZTo6Z2V0RE9NV3JhcHBlck1hcChET01XcmFwcGVyTWFwVHlwZSB0eXBlKQoreworICAg
IHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRE9NTm9kZU1hcDoKKyAgICAgICAgcmV0dXJuIG1f
ZG9tTm9kZU1hcDsKKyAgICBjYXNlIERPTU9iamVjdE1hcDoKKyAgICAgICAgcmV0dXJuIG1fZG9t
T2JqZWN0TWFwOworICAgIGNhc2UgQWN0aXZlRE9NT2JqZWN0TWFwOgorICAgICAgICByZXR1cm4g
bV9hY3RpdmVEb21PYmplY3RNYXA7CisjaWYgRU5BQkxFKFNWRykKKyAgICBjYXNlIERPTVNWR0Vs
ZW1lbnRJbnN0YW5jZU1hcDoKKyAgICAgICAgcmV0dXJuIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNl
TWFwOworICAgIGNhc2UgRE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXA6CisgICAgICAgIHJldHVy
biBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOworI2VuZGlmCisgICAgfQorCisgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBL
ZXlUeXBlPgordm9pZCBET01EYXRhU3RvcmU6OkludGVybmFsRE9NV3JhcHBlck1hcDxLZXlUeXBl
Pjo6Zm9yZ2V0KEtleVR5cGUqIG9iamVjdCkKK3sKKyAgICBET01XcmFwcGVyTWFwPEtleVR5cGU+
Ojpmb3JnZXQob2JqZWN0KTsKKyAgICBtX2RvbURhdGEtPmZvcmdldERlbGF5ZWRPYmplY3Qob2Jq
ZWN0KTsKK30KKworLy8gQ2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBuZWFyIGRlYXRoIChub3Qg
cmVhY2hhYmxlIGZyb20gSlMgcm9vdHMpLgorLy8gSXQgaXMgdGltZSB0byByZW1vdmUgdGhlIGVu
dHJ5IGZyb20gdGhlIHRhYmxlIGFuZCBkaXNwb3NlIHRoZSBoYW5kbGUuCit2b2lkIERPTURhdGFT
dG9yZTo6d2Vha0RPTU9iamVjdENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhP
YmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7Cisg
ICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKKyAgICBET01EYXRhOjpoYW5kbGVXZWFr
T2JqZWN0KERPTURhdGFTdG9yZTo6RE9NT2JqZWN0TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
OjpDYXN0KHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsKK30KKwordm9pZCBET01EYXRhU3RvcmU6Ondl
YWtBY3RpdmVET01PYmplY3RDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2Jq
ZWN0LCB2b2lkKiBkb21PYmplY3QpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAg
IEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09i
amVjdChET01EYXRhU3RvcmU6OkFjdGl2ZURPTU9iamVjdE1hcCwgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdCh2OE9iamVjdCksIGRvbU9iamVjdCk7Cit9CisKK3ZvaWQgRE9NRGF0YVN0b3Jl
Ojp3ZWFrTm9kZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZv
aWQqIGRvbU9iamVjdCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJU
KHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKKyAgICBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0PE5v
ZGU+KERPTURhdGFTdG9yZTo6RE9NTm9kZU1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2Fz
dCh2OE9iamVjdCksIHN0YXRpY19jYXN0PE5vZGUqPihkb21PYmplY3QpKTsKK30KKworI2lmIEVO
QUJMRShTVkcpCisKK3ZvaWQgRE9NRGF0YVN0b3JlOjp3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2Fs
bGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0
KQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICBBU1NFUlQodjhPYmplY3QtPklz
T2JqZWN0KCkpOworICAgIERPTURhdGE6OmhhbmRsZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpE
T01TVkdFbGVtZW50SW5zdGFuY2VNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhP
YmplY3QpLCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50SW5zdGFuY2UqPihkb21PYmplY3QpKTsKK30K
Kwordm9pZCBET01EYXRhU3RvcmU6OndlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKHY4
OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAg
ICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgp
KTsKKyAgICBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6RE9NU1ZHT2Jq
ZWN0V2l0aENvbnRleHRNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3Qp
LCBkb21PYmplY3QpOworfQorCisjZW5kaWYgIC8vIEVOQUJMRShTVkcpCisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhU3RvcmUuaAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmgJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisg
KiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5h
bWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisg
KiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBET01EYXRhU3RvcmVfaAorI2RlZmluZSBET01EYXRhU3Rv
cmVfaAorCisjaW5jbHVkZSAiRE9NT2JqZWN0c0luY2x1ZGUuaCIKKworI2luY2x1ZGUgPHd0Zi9I
YXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3dGYvTm9u
Y29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExp
YkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKyNpbmNsdWRlIDx3dGYvVGhy
ZWFkU3BlY2lmaWMuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8djguaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgRE9NRGF0YTsKKworICAgIHR5cGVk
ZWYgV1RGOjpWZWN0b3I8RE9NRGF0YVN0b3JlKj4gRE9NRGF0YUxpc3Q7CisKKyAgICAvLyBET01E
YXRhU3RvcmUKKyAgICAvLworICAgIC8vIERPTURhdGFTdG9yZSBpcyB0aGUgYmFja2luZyBzdG9y
ZSB0aGF0IGhvbGRzIHRoZSBtYXBzIGJldHdlZW4gRE9NIG9iamVjdHMKKyAgICAvLyBhbmQgSmF2
YVNjcmlwdCBvYmplY3RzLiAgSW4gZ2VuZXJhbCwgZWFjaCB0aHJlYWQgY2FuIGhhdmUgbXVsdGlw
bGUgYmFja2luZworICAgIC8vIHN0b3Jlcywgb25lIHBlciBpc29sYXRlZCB3b3JsZC4KKyAgICAv
LworICAgIC8vIFRoaXMgY2xhc3MgZG9lc24ndCBtYW5hZ2UgdGhlIGxpZmV0aW1lIG9mIHRoZSBz
dG9yZS4gIFRoZSBkYXRhIHN0b3JlCisgICAgLy8gbGlmZXRpbWUgaXMgbWFuYWdlZCBieSBzdWJj
bGFzc2VzLgorICAgIC8vCisgICAgY2xhc3MgRE9NRGF0YVN0b3JlIDogcHVibGljIE5vbmNvcHlh
YmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gRE9NV3JhcHBlck1hcFR5cGUgeworICAg
ICAgICAgICAgRE9NTm9kZU1hcCwKKyAgICAgICAgICAgIERPTU9iamVjdE1hcCwKKyAgICAgICAg
ICAgIEFjdGl2ZURPTU9iamVjdE1hcCwKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAgICAgRE9N
U1ZHRWxlbWVudEluc3RhbmNlTWFwLAorICAgICAgICAgICAgRE9NU1ZHT2JqZWN0V2l0aENvbnRl
eHRNYXAKKyNlbmRpZgorICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBLZXlU
eXBlPgorICAgICAgICBjbGFzcyBJbnRlcm5hbERPTVdyYXBwZXJNYXAgOiBwdWJsaWMgRE9NV3Jh
cHBlck1hcDxLZXlUeXBlPiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEludGVybmFs
RE9NV3JhcHBlck1hcChET01EYXRhKiBkb21EYXRhLCB2ODo6V2Vha1JlZmVyZW5jZUNhbGxiYWNr
IGNhbGxiYWNrKQorICAgICAgICAgICAgICAgIDogRE9NV3JhcHBlck1hcDxLZXlUeXBlPihjYWxs
YmFjaykgLCBtX2RvbURhdGEoZG9tRGF0YSkgeyB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9p
ZCBmb3JnZXQoS2V5VHlwZSopOworICAgICAgICAgICAgdm9pZCBmb3JnZXRPbmx5KEtleVR5cGUq
IG9iamVjdCkgeyBET01XcmFwcGVyTWFwPEtleVR5cGU+Ojpmb3JnZXQob2JqZWN0KTsgfQorCisg
ICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBET01EYXRhKiBtX2RvbURhdGE7CisgICAgICAg
IH07CisKKyAgICAgICAgRE9NRGF0YVN0b3JlKERPTURhdGEqIGRvbURhdGEpOworICAgICAgICB2
aXJ0dWFsIH5ET01EYXRhU3RvcmUoKTsKKworICAgICAgICAvLyBBIGxpc3Qgb2YgYWxsIERPTURh
dGFTdG9yZSBvYmplY3RzLiAgVHJhdmVyc2VkIGR1cmluZyBHQyB0byBmaW5kIGEgdGhyZWFkLXNw
ZWNpZmljIG1hcCB0aGF0CisgICAgICAgIC8vIGNvbnRhaW5zIHRoZSBvYmplY3QgLSBzbyB3ZSBj
YW4gc2NoZWR1bGUgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkIG9uIHRoZSB0aHJlYWQgd2hpY2gg
Y3JlYXRlZCBpdC4KKyAgICAgICAgc3RhdGljIERPTURhdGFMaXN0JiBhbGxTdG9yZXMoKTsKKyAg
ICAgICAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIG9mIERP
TURhdGFMaXN0LgorICAgICAgICBzdGF0aWMgV1RGOjpNdXRleCYgYWxsU3RvcmVzTXV0ZXgoKTsK
KworICAgICAgICBET01EYXRhKiBkb21EYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kb21EYXRhOyB9
CisKKyAgICAgICAgdm9pZCogZ2V0RE9NV3JhcHBlck1hcChET01XcmFwcGVyTWFwVHlwZSB0eXBl
KTsKKworICAgICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8Tm9kZT4mIGRvbU5vZGVNYXAoKSB7
IHJldHVybiAqbV9kb21Ob2RlTWFwOyB9CisgICAgICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2
b2lkPiYgZG9tT2JqZWN0TWFwKCkgeyByZXR1cm4gKm1fZG9tT2JqZWN0TWFwOyB9CisgICAgICAg
IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgYWN0aXZlRG9tT2JqZWN0TWFwKCkgeyByZXR1
cm4gKm1fYWN0aXZlRG9tT2JqZWN0TWFwOyB9CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgSW50
ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4mIGRvbVN2Z0VsZW1lbnRJbnN0
YW5jZU1hcCgpIHsgcmV0dXJuICptX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcDsgfQorICAgICAg
ICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIGRvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFw
KCkgeyByZXR1cm4gKm1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7IH0KKyNlbmRpZgorCisg
ICAgcHJvdGVjdGVkOgorICAgICAgICBzdGF0aWMgdm9pZCB3ZWFrTm9kZUNhbGxiYWNrKHY4OjpQ
ZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7CisgICAgICAg
IHN0YXRpYyB2b2lkIHdlYWtET01PYmplY3RDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFs
dWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOworICAgICAgICBzdGF0aWMgdm9pZCB3ZWFr
QWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVj
dCwgdm9pZCogZG9tT2JqZWN0KTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBzdGF0aWMgdm9p
ZCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVl
PiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKKyAgICAgICAgLy8gU1ZHIG5vbi1ub2RlIGVs
ZW1lbnRzIG1heSBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgY29udGV4dCBub2RlIHdoaWNoIHNob3Vs
ZCBiZSBub3RpZmllZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNoYW5nZS4KKyAgICAgICAgc3RhdGlj
IHZvaWQgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6
OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKKyNlbmRpZgorICAgICAgICAKKyAg
ICAgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+KiBtX2RvbU5vZGVNYXA7CisgICAgICAg
IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiogbV9kb21PYmplY3RNYXA7CisgICAgICAgIElu
dGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiogbV9hY3RpdmVEb21PYmplY3RNYXA7CisjaWYgRU5B
QkxFKFNWRykKKyAgICAgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5j
ZT4qIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOworICAgICAgICBJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4qIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CisjZW5kaWYKKworICAg
IHByaXZhdGU6CisgICAgICAgIC8vIEEgYmFjay1wb2ludGVyIHRvIHRoZSBET01EYXRhIHRvIHdo
aWNoIHdlIGJlbG9uZy4KKyAgICAgICAgRE9NRGF0YSogbV9kb21EYXRhOworICAgIH07CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIERPTURhdGFTdG9yZV9oCkluZGV4OiBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmNwcAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvYmluZGluZ3MvdjgvTWFpblRocmVhZERPTURhdGEuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisg
KiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5h
bWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisg
KiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIk1haW5UaHJlYWRE
T01EYXRhLmgiCisKKyNpbmNsdWRlICJWOElzb2xhdGVkV29ybGQuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitNYWluVGhyZWFkRE9NRGF0YTo6TWFpblRocmVhZERPTURhdGEoKQorICAgIDog
bV9kZWZhdWx0U3RvcmUodGhpcykKK3sKK30KKworRE9NRGF0YVN0b3JlJiBNYWluVGhyZWFkRE9N
RGF0YTo6Z2V0U3RvcmUoKQoreworICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKKyAg
ICBWOElzb2xhdGVkV29ybGQqIHdvcmxkID0gVjhJc29sYXRlZFdvcmxkOjpnZXRFbnRlcmVkKCk7
CisgICAgaWYgKHdvcmxkKQorICAgICAgICByZXR1cm4gKndvcmxkLT5nZXRET01EYXRhU3RvcmUo
KTsKKyAgICByZXR1cm4gbV9kZWZhdWx0U3RvcmU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvTWFpblRocmVhZERPTURhdGEuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmgJKHJldmlzaW9u
IDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIE1haW5UaHJlYWRET01EYXRhX2gKKyNkZWZpbmUg
TWFpblRocmVhZERPTURhdGFfaAorCisjaW5jbHVkZSAiRE9NRGF0YS5oIgorI2luY2x1ZGUgIlN0
YXRpY0RPTURhdGFTdG9yZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBN
YWluVGhyZWFkRE9NRGF0YSA6IHB1YmxpYyBET01EYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAg
IE1haW5UaHJlYWRET01EYXRhKCk7CisgICAgICAgIERPTURhdGFTdG9yZSYgZ2V0U3RvcmUoKTsK
KworICAgIHByaXZhdGU6CisgICAgICAgIFN0YXRpY0RPTURhdGFTdG9yZSBtX2RlZmF1bHRTdG9y
ZTsKKyAgICAgICAgLy8gTm90ZTogVGhlIERPTURhdGFTdG9yZXMgZm9yIGlzb2xhdGVkIHdvcmxk
IGFyZSBvd25lZCBieSB0aGUgd29ybGQgb2JqZWN0LgorICAgIH07CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIE1haW5UaHJlYWRET01EYXRhX2gKSW5kZXg6IFdlYkNvcmUv
YmluZGluZ3MvdjgvU2NvcGVkRE9NRGF0YVN0b3JlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1Njb3BlZERPTURhdGFTdG9yZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJD
b3JlL2JpbmRpbmdzL3Y4L1Njb3BlZERPTURhdGFTdG9yZS5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2NvcGVkRE9NRGF0YVN0
b3JlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU2NvcGVkRE9NRGF0YVN0b3JlOjpTY29w
ZWRET01EYXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSkgOiBET01EYXRhU3RvcmUoZG9tRGF0YSkK
K3sKKyAgICBtX2RvbU5vZGVNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+KGRv
bURhdGEsICZET01EYXRhU3RvcmU6OndlYWtOb2RlQ2FsbGJhY2spOworICAgIG1fZG9tT2JqZWN0
TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPihkb21EYXRhLCAmRE9NRGF0YVN0
b3JlOjp3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spOworICAgIG1fYWN0aXZlRG9tT2JqZWN0TWFwID0g
bmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPihkb21EYXRhLCAmRE9NRGF0YVN0b3JlOjp3
ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spOworI2lmIEVOQUJMRShTVkcpCisgICAgbV9kb21T
dmdFbGVtZW50SW5zdGFuY2VNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1l
bnRJbnN0YW5jZT4oZG9tRGF0YSwgJkRPTURhdGFTdG9yZTo6d2Vha1NWR0VsZW1lbnRJbnN0YW5j
ZUNhbGxiYWNrKTsKKyAgICBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwID0gbmV3IEludGVy
bmFsRE9NV3JhcHBlck1hcDx2b2lkPihkb21EYXRhLCAmRE9NRGF0YVN0b3JlOjp3ZWFrU1ZHT2Jq
ZWN0V2l0aENvbnRleHRDYWxsYmFjayk7CisjZW5kaWYKK30KKworU2NvcGVkRE9NRGF0YVN0b3Jl
Ojp+U2NvcGVkRE9NRGF0YVN0b3JlKCkKK3sKKyAgICBkZWxldGUgbV9kb21Ob2RlTWFwOworICAg
IGRlbGV0ZSBtX2RvbU9iamVjdE1hcDsKKyAgICBkZWxldGUgbV9hY3RpdmVEb21PYmplY3RNYXA7
CisjaWYgRU5BQkxFKFNWRykKKyAgICBkZWxldGUgbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXA7
CisgICAgZGVsZXRlIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CisjZW5kaWYKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9TY29wZWRE
T01EYXRhU3RvcmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Njb3BlZERP
TURhdGFTdG9yZS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TY29wZWRE
T01EYXRhU3RvcmUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRp
b24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMg
SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisg
KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgU2NvcGVk
RE9NRGF0YVN0b3JlX2gKKyNkZWZpbmUgU2NvcGVkRE9NRGF0YVN0b3JlX2gKKworI2luY2x1ZGUg
IkRPTURhdGFTdG9yZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICAvLyBTY29wZWRE
T01EYXRhU3RvcmUKKyAgICAvLworICAgIC8vIFNjb3BlZERPTURhdGFTdG9yZSBpcyBhIERPTURh
dGFTdG9yZSB0aGF0IGNvbnRyb2xzIGxpbWl0cyB0aGUgbGlmZXRpbWUgb2YKKyAgICAvLyB0aGUg
c3RvcmUgdG8gdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3QgaXRzZWxmLiAgSW4gb3RoZXIgd29y
ZHMsIHdoZW4gdGhlCisgICAgLy8gU2NvcGVkRE9NRGF0YVN0b3JlIG9iamVjdCBpcyBkZWFsbG9j
YXRlZCwgdGhlIG1hcHMgdGhhdCBiZWxvbmcgdG8gdGhlIHN0b3JlCisgICAgLy8gYXJlIGRlYWxs
b2NhdGVkIGFzIHdlbGwuCisgICAgLy8KKyAgICBjbGFzcyBTY29wZWRET01EYXRhU3RvcmUgOiBw
dWJsaWMgRE9NRGF0YVN0b3JlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNjb3BlZERPTURhdGFT
dG9yZShET01EYXRhKiBkb21EYXRhKTsKKworICAgICAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQg
d2hlbiBXVEYgdGhyZWFkIGlzIHRlYXJpbmcgZG93bi4KKyAgICAgICAgLy8gV2UgYXNzdW1lIHRo
YXQgYWxsIGNoaWxkIHRocmVhZHMgcnVubmluZyBWOCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYnkg
V1RGLgorICAgICAgICB2aXJ0dWFsIH5TY29wZWRET01EYXRhU3RvcmUoKTsKKyAgICB9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBTY29wZWRET01EYXRhU3RvcmVfaApJ
bmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3RvcmUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvU3RhdGljRE9NRGF0YVN0b3JlLmNwcAkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvU3RhdGljRE9NRGF0YVN0b3JlLmNwcAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisg
KiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZ
UklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJT
dGF0aWNET01EYXRhU3RvcmUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitTdGF0aWNET01E
YXRhU3RvcmU6OlN0YXRpY0RPTURhdGFTdG9yZShET01EYXRhKiBkb21EYXRhKQorICAgIDogRE9N
RGF0YVN0b3JlKGRvbURhdGEpCisgICAgLCBtX3N0YXRpY0RvbU5vZGVNYXAoZG9tRGF0YSwgJkRP
TURhdGFTdG9yZTo6d2Vha05vZGVDYWxsYmFjaykKKyAgICAsIG1fc3RhdGljRG9tT2JqZWN0TWFw
KGRvbURhdGEsICZET01EYXRhU3RvcmU6OndlYWtET01PYmplY3RDYWxsYmFjaykKKyAgICAsIG1f
c3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwKGRvbURhdGEsICZET01EYXRhU3RvcmU6OndlYWtBY3Rp
dmVET01PYmplY3RDYWxsYmFjaykKKyNpZiBFTkFCTEUoU1ZHKQorICAgICwgbV9zdGF0aWNEb21T
dmdFbGVtZW50SW5zdGFuY2VNYXAoZG9tRGF0YSwgJkRPTURhdGFTdG9yZTo6d2Vha1NWR0VsZW1l
bnRJbnN0YW5jZUNhbGxiYWNrKQorICAgICwgbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4
dE1hcChkb21EYXRhLCAmRE9NRGF0YVN0b3JlOjp3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxs
YmFjaykKKyNlbmRpZgoreworICAgIG1fZG9tTm9kZU1hcCA9ICZtX3N0YXRpY0RvbU5vZGVNYXA7
CisgICAgbV9kb21PYmplY3RNYXAgPSAmbV9zdGF0aWNEb21PYmplY3RNYXA7CisgICAgbV9hY3Rp
dmVEb21PYmplY3RNYXAgPSAmbV9zdGF0aWNBY3RpdmVEb21PYmplY3RNYXA7CisjaWYgRU5BQkxF
KFNWRykKKyAgICBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCA9ICZtX3N0YXRpY0RvbVN2Z0Vs
ZW1lbnRJbnN0YW5jZU1hcDsKKyAgICBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwID0gJm1f
c3RhdGljRG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CisjZW5kaWYKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3Rv
cmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1N0YXRpY0RPTURhdGFTdG9y
ZS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3Rv
cmUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAg
ICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRz
CisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgU3RhdGljRE9NRGF0YVN0
b3JlX2gKKyNkZWZpbmUgU3RhdGljRE9NRGF0YVN0b3JlX2gKKworI2luY2x1ZGUgIkRPTURhdGFT
dG9yZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFN0YXRpY0RPTURhdGFTdG9yZQor
Ly8KKy8vIFN0YXRpY0RPTURhdGFTdG9yZSBpcyBhIERPTURhdGFTdG9yZSB0aGF0IG1hbmFnZXMg
dGhlIGxpZmV0aW1lIG9mIHRoZSBzdG9yZQorLy8gc3RhdGljYWxseS4gIFRoaXMgZW5jYXBzdWxh
dGVzIHRocmVhZC1zcGVjaWZpYyBET00gZGF0YSBmb3IgdGhlIG1haW4KKy8vIHRocmVhZC4gIEFs
bCB0aGUgbWFwcyBpbiBpdCBhcmUgc3RhdGljLiAgVGhpcyBpcyBiZWNhdXNlIHdlIGFyZSB1bmFi
bGUgdG8KKy8vIHJlbHkgb24gV1RGOjpUaHJlYWRTcGVjaWZpY1RocmVhZEV4aXQgdG8gZG8gdGhl
IGNsZWFudXAgc2luY2UgdGhlIHBsYWNlIHRoYXQKKy8vIHRlYXJzIGRvd24gdGhlIG1haW4gdGhy
ZWFkIGNhbiBub3QgY2FsbCBhbnkgV1RGIGZ1bmN0aW9ucy4KKy8vCitjbGFzcyBTdGF0aWNET01E
YXRhU3RvcmUgOiBwdWJsaWMgRE9NRGF0YVN0b3JlIHsKK3B1YmxpYzoKKyAgICBTdGF0aWNET01E
YXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSk7CisKK3ByaXZhdGU6CisgICAgSW50ZXJuYWxET01X
cmFwcGVyTWFwPE5vZGU+IG1fc3RhdGljRG9tTm9kZU1hcDsKKyAgICBJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4gbV9zdGF0aWNEb21PYmplY3RNYXA7CisgICAgSW50ZXJuYWxET01XcmFwcGVy
TWFwPHZvaWQ+IG1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwOworI2lmIEVOQUJMRShTVkcpCisg
ICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4gbV9zdGF0aWNEb21T
dmdFbGVtZW50SW5zdGFuY2VNYXA7CisgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+IG1f
c3RhdGljRG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CisjZW5kaWYKK307CisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFN0YXRpY0RPTURhdGFTdG9yZV9oCisKSW5kZXg6
IFdlYkNvcmUvYmluZGluZ3MvdjgvVjhET01NYXAuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
YmluZGluZ3MvdjgvVjhET01NYXAuY3BwCShyZXZpc2lvbiA0NjQwMSkKKysrIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvVjhET01NYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSwzNTkgKzMxLDEzIEBA
CiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiVjhET01NYXAuaCIKIAorI2luY2x1ZGUg
IkRPTURhdGEuaCIKKyNpbmNsdWRlICJET01EYXRhU3RvcmUuaCIKICNpbmNsdWRlICJET01PYmpl
Y3RzSW5jbHVkZS5oIgotCi0jaW5jbHVkZSA8djguaD4KLQotI2luY2x1ZGUgPHd0Zi9IYXNoTWFw
Lmg+Ci0jaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KLSNpbmNsdWRlIDx3dGYvTm9uY29weWFi
bGUuaD4KLSNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL1RocmVh
ZGluZy5oPgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRTcGVjaWZpYy5oPgotI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KLQotI2luY2x1ZGUgIlY4SXNvbGF0ZWRXb3JsZC5oIgorI2luY2x1ZGUgIlNjb3Bl
ZERPTURhdGFTdG9yZS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLS8vIERPTSBiaW5kaW5n
IGFsZ29yaXRobToKLS8vCi0vLyBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIERPTSBvYmplY3RzOgot
Ly8gMS4gRE9NIHRyZWUgbm9kZXMsIHN1Y2ggYXMgRG9jdW1lbnQsIEhUTUxFbGVtZW50LCAuLi4K
LS8vICAgIHRoZXJlIGNsYXNzZXMgaW1wbGVtZW50IFRyZWVTaGFyZWQ8VD4gaW50ZXJmYWNlOwot
Ly8gMi4gTm9uLW5vZGUgRE9NIG9iamVjdHMsIHN1Y2ggYXMgQ1NTUnVsZSwgTG9jYXRpb24sIGV0
Yy4KLS8vICAgIHRoZXNlIGNsYXNzZXMgaW1wbGVtZW50IGEgcmVmLWNvdW50ZWQgc2NoZW1lLgot
Ly8KLS8vIEEgRE9NIG9iamVjdCBtYXkgaGF2ZSBhIEpTIHdyYXBwZXIgb2JqZWN0LiBJZiBhIHRy
ZWUgbm9kZQotLy8gaXMgYWxpdmUsIGl0cyBKUyB3cmFwcGVyIG11c3QgYmUga2VwdCBhbGl2ZSBl
dmVuIGl0IGlzIG5vdAotLy8gcmVhY2hhYmxlIGZyb20gSlMgcm9vdHMuCi0vLyBIb3dldmVyLCBK
UyB3cmFwcGVycyBvZiBub24tbm9kZSBvYmplY3RzIGNhbiBnbyBhd2F5IGlmCi0vLyBub3QgcmVh
Y2hhYmxlIGZyb20gb3RoZXIgSlMgb2JqZWN0cy4gSXQgd29ya3MgbGlrZSBhIGNhY2hlLgotLy8K
LS8vIERPTSBvYmplY3RzIGFyZSByZWYtY291bnRlZCwgYW5kIEpTIG9iamVjdHMgYXJlIHRyYWNl
ZCBmcm9tCi0vLyBhIHNldCBvZiByb290IG9iamVjdHMuIFRoZXkgY2FuIGNyZWF0ZSBhIGN5Y2xl
LiBUbyBicmVhawotLy8gY3ljbGVzLCB3ZSBkbyBmb2xsb3dpbmc6Ci0vLyAgIEhhbmRsZXMgZnJv
bSBET00gb2JqZWN0cyB0byBKUyB3cmFwcGVycyBhcmUgYWx3YXlzIHdlYWssCi0vLyBzbyBKUyB3
cmFwcGVycyBvZiBub24tbm9kZSBvYmplY3QgY2Fubm90IGNyZWF0ZSBhIGN5Y2xlLgotLy8gICBC
ZWZvcmUgc3RhcnRpbmcgYSBnbG9iYWwgR0MsIHdlIGNyZWF0ZSBhIHZpcnR1YWwgY29ubmVjdGlv
bgotLy8gYmV0d2VlbiBub2RlcyBpbiB0aGUgc2FtZSB0cmVlIGluIHRoZSBKUyBoZWFwLiBJZiB0
aGUgd3JhcHBlcgotLy8gb2Ygb25lIG5vZGUgaW4gYSB0cmVlIGlzIGFsaXZlLCB3cmFwcGVycyBv
ZiBhbGwgbm9kZXMgaW4KLS8vIHRoZSBzYW1lIHRyZWUgYXJlIGNvbnNpZGVyZWQgYWxpdmUuIFRo
aXMgaXMgZG9uZSBieSBjcmVhdGluZwotLy8gb2JqZWN0IGdyb3VwcyBpbiBHQyBwcm9sb2d1ZSBj
YWxsYmFja3MuIFRoZSBtYXJrLWNvbXBhY3QKLS8vIGNvbGxlY3RvciB3aWxsIHJlbW92ZSB0aGVz
ZSBncm91cHMgYWZ0ZXIgZWFjaCBHQy4KLS8vCi0vLyBET00gb2JqZWN0cyBzaG91bGQgYmUgZGVy
ZWYtZWQgZnJvbSB0aGUgb3duaW5nIHRocmVhZCwgbm90IHRoZSBHQyB0aHJlYWQKLS8vIHRoYXQg
ZG9lcyBub3Qgb3duIHRoZW0uIEluIFY4LCBHQyBjYW4ga2ljayBpbiBmcm9tIGFueSB0aHJlYWQu
IFRvIGVuc3VyZQotLy8gdGhhdCBET00gb2JqZWN0cyBhcmUgYWx3YXlzIGRlcmVmLWVkIGZyb20g
dGhlIG93bmluZyB0aHJlYWQgd2hlbiBydW5uaW5nCi0vLyBWOCBpbiBtdWx0aS10aHJlYWRpbmcg
ZW52aXJvbm1lbnQsIHdlIGRvIGZvbGxvd2luZzoKLS8vIDEuIE1haW50YWluIGEgdGhyZWFkIHNw
ZWNpZmljIERPTSB3cmFwcGVyIG1hcCBmb3IgZWFjaCBvYmplY3QgbWFwLgotLy8gICAgKFdlJ3Jl
IHVzaW5nIFRMUyBzdXBwb3J0IGZyb20gV1RGIGluc3RlYWQgb2YgYmFzZSBzaW5jZSBWOEJpbmRp
bmdzCi0vLyAgICAgZG9lcyBub3QgZGVwZW5kIG9uIGJhc2UuIFdlIGZ1cnRoZXIgYXNzdW1lIHRo
YXQgYWxsIGNoaWxkIHRocmVhZHMKLS8vICAgICBydW5uaW5nIFY4IGluc3RhbmNlcyBhcmUgY3Jl
YXRlZCBieSBXVEYgYW5kIHRodXMgYSBkZXN0cnVjdG9yIHdpbGwKLS8vICAgICBiZSBjYWxsZWQg
dG8gY2xlYW4gdXAgYWxsIHRocmVhZCBzcGVjaWZpYyBkYXRhLikKLS8vIDIuIFdoZW4gR0MgaGFw
cGVuczoKLS8vICAgIDIuMS4gSWYgdGhlIGRlYWQgb2JqZWN0IGlzIGluIEdDIHRocmVhZCdzIG1h
cCwgcmVtb3ZlIHRoZSBKUyByZWZlcmVuY2UKLS8vICAgICAgICAgYW5kIGRlcmVmIHRoZSBET00g
b2JqZWN0LgotLy8gICAgMi4yLiBPdGhlcndpc2UsIGdvIHRocm91Z2ggYWxsIHRocmVhZCBtYXBz
IHRvIGZpbmQgdGhlIG93bmluZyB0aHJlYWQuCi0vLyAgICAgICAgIFJlbW92ZSB0aGUgSlMgcmVm
ZXJlbmNlIGZyb20gdGhlIG93bmluZyB0aHJlYWQncyBtYXAgYW5kIG1vdmUgdGhlCi0vLyAgICAg
ICAgIERPTSBvYmplY3QgdG8gYSBkZWxheWVkIHF1ZXVlLiBQb3N0IGEgdGFzayB0byB0aGUgb3du
aW5nIHRocmVhZAotLy8gICAgICAgICB0byBoYXZlIGl0IGRlcmVmLWVkIGZyb20gdGhlIG93bmlu
ZyB0aHJlYWQgYXQgbGF0ZXIgdGltZS4KLS8vIDMuIFdoZW4gYSB0aHJlYWQgaXMgdGVhcmluZyBk
b3duLCBpbnZva2UgYSBjbGVhbnVwIHJvdXRpbmUgdG8gZ28gdGhyb3VnaAotLy8gICAgYWxsIG9i
amVjdHMgaW4gdGhlIGRlbGF5ZWQgcXVldWUgYW5kIHRoZSB0aHJlYWQgbWFwIGFuZCBkZXJlZiBh
bGwgb2YKLS8vICAgIHRoZW0uCi0KLXN0YXRpYyB2b2lkIHdlYWtOb2RlQ2FsbGJhY2sodjg6OlBl
cnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKLXN0YXRpYyB2
b2lkIHdlYWtET01PYmplY3RDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2Jq
ZWN0LCB2b2lkKiBkb21PYmplY3QpOwotdm9pZCB3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2so
djg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKLSNp
ZiBFTkFCTEUoU1ZHKQotc3RhdGljIHZvaWQgd2Vha1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNr
KHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7Ci0v
LyBTVkcgbm9uLW5vZGUgZWxlbWVudHMgbWF5IGhhdmUgYSByZWZlcmVuY2UgdG8gYSBjb250ZXh0
IG5vZGUgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgY2hhbmdl
Lgotc3RhdGljIHZvaWQgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2sodjg6OlBlcnNp
c3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKLSNlbmRpZgotCi1j
bGFzcyBET01EYXRhOwotY2xhc3MgRE9NRGF0YVN0b3JlOwotdHlwZWRlZiBXVEY6OlZlY3RvcjxE
T01EYXRhU3RvcmUqPiBET01EYXRhTGlzdDsKLQotLy8gRE9NRGF0YVN0b3JlCi0vLwotLy8gRE9N
RGF0YVN0b3JlIGlzIHRoZSBiYWNraW5nIHN0b3JlIHRoYXQgaG9sZHMgdGhlIG1hcHMgYmV0d2Vl
biBET00gb2JqZWN0cwotLy8gYW5kIEphdmFTY3JpcHQgb2JqZWN0cy4gIEluIGdlbmVyYWwsIGVh
Y2ggdGhyZWFkIGNhbiBoYXZlIG11bHRpcGxlIGJhY2tpbmcKLS8vIHN0b3Jlcywgb25lIHBlciBp
c29sYXRlZCB3b3JsZC4KLS8vCi0vLyBUaGlzIGNsYXNzIGRvZXNuJ3QgbWFuYWdlIHRoZSBsaWZl
dGltZSBvZiB0aGUgc3RvcmUuICBUaGUgZGF0YSBzdG9yZQotLy8gbGlmZXRpbWUgaXMgbWFuYWdl
ZCBieSBzdWJjbGFzc2VzLgotLy8KLWNsYXNzIERPTURhdGFTdG9yZSA6IHB1YmxpYyBOb25jb3B5
YWJsZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSBET01XcmFwcGVyTWFwVHlwZSB7Ci0gICAgICAgIERP
TU5vZGVNYXAsCi0gICAgICAgIERPTU9iamVjdE1hcCwKLSAgICAgICAgQWN0aXZlRE9NT2JqZWN0
TWFwLAotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgIERPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCwK
LSAgICAgICAgRE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAKLSNlbmRpZgotICAgIH07Ci0KLSAg
ICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZT4KLSAgICBjbGFzcyBJbnRlcm5hbERPTVdyYXBwZXJN
YXAgOiBwdWJsaWMgRE9NV3JhcHBlck1hcDxLZXlUeXBlPiB7Ci0gICAgcHVibGljOgotICAgICAg
ICBJbnRlcm5hbERPTVdyYXBwZXJNYXAoRE9NRGF0YSogZG9tRGF0YSwgdjg6OldlYWtSZWZlcmVu
Y2VDYWxsYmFjayBjYWxsYmFjaykKLSAgICAgICAgICAgIDogRE9NV3JhcHBlck1hcDxLZXlUeXBl
PihjYWxsYmFjaykKLSAgICAgICAgICAgICwgbV9kb21EYXRhKGRvbURhdGEpIHsgfQotCi0gICAg
ICAgIHZpcnR1YWwgdm9pZCBmb3JnZXQoS2V5VHlwZSopOwotCi0gICAgICAgIHZvaWQgZm9yZ2V0
T25seShLZXlUeXBlKiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERPTVdyYXBwZXJN
YXA8S2V5VHlwZT46OmZvcmdldChvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgot
ICAgICAgICBET01EYXRhKiBtX2RvbURhdGE7Ci0gICAgfTsKLQotICAgIC8vIEEgbGlzdCBvZiBh
bGwgRE9NRGF0YVN0b3JlIG9iamVjdHMuICBUcmF2ZXJzZWQgZHVyaW5nIEdDIHRvIGZpbmQgYSB0
aHJlYWQtc3BlY2lmaWMgbWFwIHRoYXQKLSAgICAvLyBjb250YWlucyB0aGUgb2JqZWN0IC0gc28g
d2UgY2FuIHNjaGVkdWxlIHRoZSBvYmplY3QgdG8gYmUgZGVsZXRlZCBvbiB0aGUgdGhyZWFkIHdo
aWNoIGNyZWF0ZWQgaXQuCi0gICAgc3RhdGljIERPTURhdGFMaXN0JiBhbGxTdG9yZXMoKQotICAg
IHsKLSAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChET01EYXRhTGlzdCwgc3RhdGljRE9NRGF0
YUxpc3QsICgpKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY0RPTURhdGFMaXN0OwotICAgIH0KLQot
ICAgIC8vIE11dGV4IHRvIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBvZiBET01E
YXRhTGlzdC4KLSAgICBzdGF0aWMgV1RGOjpNdXRleCYgYWxsU3RvcmVzTXV0ZXgoKQotICAgIHsK
LSAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChXVEY6Ok11dGV4LCBzdGF0aWNET01EYXRhTGlz
dE11dGV4LCAoKSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNET01EYXRhTGlzdE11dGV4OwotICAg
IH0KLQotICAgIERPTURhdGFTdG9yZShET01EYXRhKiBkb21EYXRhKTsKLSAgICB2aXJ0dWFsIH5E
T01EYXRhU3RvcmUoKTsKLQotICAgIERPTURhdGEqIGRvbURhdGEoKSBjb25zdCB7IHJldHVybiBt
X2RvbURhdGE7IH0KLQotICAgIHZvaWQqIGdldERPTVdyYXBwZXJNYXAoRE9NV3JhcHBlck1hcFR5
cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIERP
TU5vZGVNYXA6Ci0gICAgICAgICAgICByZXR1cm4gbV9kb21Ob2RlTWFwOwotICAgICAgICBjYXNl
IERPTU9iamVjdE1hcDoKLSAgICAgICAgICAgIHJldHVybiBtX2RvbU9iamVjdE1hcDsKLSAgICAg
ICAgY2FzZSBBY3RpdmVET01PYmplY3RNYXA6Ci0gICAgICAgICAgICByZXR1cm4gbV9hY3RpdmVE
b21PYmplY3RNYXA7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgY2FzZSBET01TVkdFbGVtZW50
SW5zdGFuY2VNYXA6Ci0gICAgICAgICAgICByZXR1cm4gbV9kb21TdmdFbGVtZW50SW5zdGFuY2VN
YXA7Ci0gICAgICAgIGNhc2UgRE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXA6Ci0gICAgICAgICAg
ICByZXR1cm4gbV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcDsKLSNlbmRpZgotICAgICAgICB9
Ci0KLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAg
IH0KLQotICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiYgZG9tTm9kZU1hcCgpIHsgcmV0
dXJuICptX2RvbU5vZGVNYXA7IH0KLSAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIGRv
bU9iamVjdE1hcCgpIHsgcmV0dXJuICptX2RvbU9iamVjdE1hcDsgfQotICAgIEludGVybmFsRE9N
V3JhcHBlck1hcDx2b2lkPiYgYWN0aXZlRG9tT2JqZWN0TWFwKCkgeyByZXR1cm4gKm1fYWN0aXZl
RG9tT2JqZWN0TWFwOyB9Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBJbnRlcm5hbERPTVdyYXBwZXJN
YXA8U1ZHRWxlbWVudEluc3RhbmNlPiYgZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwKCkgeyByZXR1
cm4gKm1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOyB9Ci0gICAgSW50ZXJuYWxET01XcmFwcGVy
TWFwPHZvaWQ+JiBkb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCgpIHsgcmV0dXJuICptX2RvbVN2
Z09iamVjdFdpdGhDb250ZXh0TWFwOyB9Ci0jZW5kaWYKLQotcHJvdGVjdGVkOgotICAgIEludGVy
bmFsRE9NV3JhcHBlck1hcDxOb2RlPiogbV9kb21Ob2RlTWFwOwotICAgIEludGVybmFsRE9NV3Jh
cHBlck1hcDx2b2lkPiogbV9kb21PYmplY3RNYXA7Ci0gICAgSW50ZXJuYWxET01XcmFwcGVyTWFw
PHZvaWQ+KiBtX2FjdGl2ZURvbU9iamVjdE1hcDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIEludGVy
bmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+KiBtX2RvbVN2Z0VsZW1lbnRJbnN0
YW5jZU1hcDsKLSAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4qIG1fZG9tU3ZnT2JqZWN0
V2l0aENvbnRleHRNYXA7Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgICAvLyBBIGJhY2stcG9pbnRl
ciB0byB0aGUgRE9NRGF0YSB0byB3aGljaCB3ZSBiZWxvbmcuCi0gICAgRE9NRGF0YSogbV9kb21E
YXRhOwotfTsKLQotLy8gU2NvcGVkRE9NRGF0YVN0b3JlCi0vLwotLy8gU2NvcGVkRE9NRGF0YVN0
b3JlIGlzIGEgRE9NRGF0YVN0b3JlIHRoYXQgY29udHJvbHMgbGltaXRzIHRoZSBsaWZldGltZSBv
ZgotLy8gdGhlIHN0b3JlIHRvIHRoZSBsaWZldGltZSBvZiB0aGUgb2JqZWN0IGl0c2VsZi4gIElu
IG90aGVyIHdvcmRzLCB3aGVuIHRoZQotLy8gU2NvcGVkRE9NRGF0YVN0b3JlIG9iamVjdCBpcyBk
ZWFsbG9jYXRlZCwgdGhlIG1hcHMgdGhhdCBiZWxvbmcgdG8gdGhlIHN0b3JlCi0vLyBhcmUgZGVh
bGxvY2F0ZWQgYXMgd2VsbC4KLS8vCi1jbGFzcyBTY29wZWRET01EYXRhU3RvcmUgOiBwdWJsaWMg
RE9NRGF0YVN0b3JlIHsKLXB1YmxpYzoKLSAgICBTY29wZWRET01EYXRhU3RvcmUoRE9NRGF0YSog
ZG9tRGF0YSkgOiBET01EYXRhU3RvcmUoZG9tRGF0YSkKLSAgICB7Ci0gICAgICAgIG1fZG9tTm9k
ZU1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8Tm9kZT4oZG9tRGF0YSwgd2Vha05vZGVD
YWxsYmFjayk7Ci0gICAgICAgIG1fZG9tT2JqZWN0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBl
ck1hcDx2b2lkPihkb21EYXRhLCB3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spOwotICAgICAgICBtX2Fj
dGl2ZURvbU9iamVjdE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4oZG9tRGF0
YSwgd2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKTsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAg
ICBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8
U1ZHRWxlbWVudEluc3RhbmNlPihkb21EYXRhLCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJh
Y2spOwotICAgICAgICBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwID0gbmV3IEludGVybmFs
RE9NV3JhcHBlck1hcDx2b2lkPihkb21EYXRhLCB3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxs
YmFjayk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGNhbiBiZSBjYWxsZWQgd2hlbiBX
VEYgdGhyZWFkIGlzIHRlYXJpbmcgZG93bi4KLSAgICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgY2hp
bGQgdGhyZWFkcyBydW5uaW5nIFY4IGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBXVEYuCi0gICAg
dmlydHVhbCB+U2NvcGVkRE9NRGF0YVN0b3JlKCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSBtX2Rv
bU5vZGVNYXA7Ci0gICAgICAgIGRlbGV0ZSBtX2RvbU9iamVjdE1hcDsKLSAgICAgICAgZGVsZXRl
IG1fYWN0aXZlRG9tT2JqZWN0TWFwOwotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgIGRlbGV0ZSBt
X2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcDsKLSAgICAgICAgZGVsZXRlIG1fZG9tU3ZnT2JqZWN0
V2l0aENvbnRleHRNYXA7Ci0jZW5kaWYKLSAgICB9Ci19OwotCi0vLyBTdGF0aWNET01EYXRhU3Rv
cmUKLS8vCi0vLyBTdGF0aWNET01EYXRhU3RvcmUgaXMgYSBET01EYXRhU3RvcmUgdGhhdCBtYW5h
Z2VzIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUKLS8vIHN0YXRpY2FsbHkuICBUaGlzIGVuY2Fw
c3VsYXRlcyB0aHJlYWQtc3BlY2lmaWMgRE9NIGRhdGEgZm9yIHRoZSBtYWluCi0vLyB0aHJlYWQu
ICBBbGwgdGhlIG1hcHMgaW4gaXQgYXJlIHN0YXRpYy4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBhcmUg
dW5hYmxlIHRvCi0vLyByZWx5IG9uIFdURjo6VGhyZWFkU3BlY2lmaWNUaHJlYWRFeGl0IHRvIGRv
IHRoZSBjbGVhbnVwIHNpbmNlIHRoZSBwbGFjZSB0aGF0Ci0vLyB0ZWFycyBkb3duIHRoZSBtYWlu
IHRocmVhZCBjYW4gbm90IGNhbGwgYW55IFdURiBmdW5jdGlvbnMuCi1jbGFzcyBTdGF0aWNET01E
YXRhU3RvcmUgOiBwdWJsaWMgRE9NRGF0YVN0b3JlIHsKLXB1YmxpYzoKLSAgICBTdGF0aWNET01E
YXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSkKLSAgICAgICAgOiBET01EYXRhU3RvcmUoZG9tRGF0
YSkKLSAgICAgICAgLCBtX3N0YXRpY0RvbU5vZGVNYXAoZG9tRGF0YSwgd2Vha05vZGVDYWxsYmFj
aykKLSAgICAgICAgLCBtX3N0YXRpY0RvbU9iamVjdE1hcChkb21EYXRhLCB3ZWFrRE9NT2JqZWN0
Q2FsbGJhY2spCi0gICAgICAgICwgbV9zdGF0aWNBY3RpdmVEb21PYmplY3RNYXAoZG9tRGF0YSwg
d2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKQotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgICwg
bV9zdGF0aWNEb21TdmdFbGVtZW50SW5zdGFuY2VNYXAoZG9tRGF0YSwgd2Vha1NWR0VsZW1lbnRJ
bnN0YW5jZUNhbGxiYWNrKQotICAgICAgICAsIG1fc3RhdGljRG9tU3ZnT2JqZWN0V2l0aENvbnRl
eHRNYXAoZG9tRGF0YSwgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2spCi0jZW5kaWYK
LSAgICB7Ci0gICAgICAgIG1fZG9tTm9kZU1hcCA9ICZtX3N0YXRpY0RvbU5vZGVNYXA7Ci0gICAg
ICAgIG1fZG9tT2JqZWN0TWFwID0gJm1fc3RhdGljRG9tT2JqZWN0TWFwOwotICAgICAgICBtX2Fj
dGl2ZURvbU9iamVjdE1hcCA9ICZtX3N0YXRpY0FjdGl2ZURvbU9iamVjdE1hcDsKLSNpZiBFTkFC
TEUoU1ZHKQotICAgICAgICBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCA9ICZtX3N0YXRpY0Rv
bVN2Z0VsZW1lbnRJbnN0YW5jZU1hcDsKLSAgICAgICAgbV9kb21TdmdPYmplY3RXaXRoQ29udGV4
dE1hcCA9ICZtX3N0YXRpY0RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOwotI2VuZGlmCi0gICAg
fQotCi1wcml2YXRlOgotICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiBtX3N0YXRpY0Rv
bU5vZGVNYXA7Ci0gICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+IG1fc3RhdGljRG9tT2Jq
ZWN0TWFwOwotICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiBtX3N0YXRpY0FjdGl2ZURv
bU9iamVjdE1hcDsKLSAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNl
PiBtX3N0YXRpY0RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcDsKLSAgICBJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4gbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcDsKLX07Ci0KLXR5
cGVkZWYgV1RGOjpWZWN0b3I8RE9NRGF0YVN0b3JlKj4gRE9NRGF0YVN0b3JlTGlzdDsKLQotLy8g
RE9NRGF0YQotLy8KLS8vIERPTURhdGEgcmVwcmVzZW50cyB0aGUgYWxsIHRoZSBET00gd3JhcHBl
cnMgZm9yIGEgZ2l2ZW4gdGhyZWFkLiAgSW4KLS8vIHBhcnRpY3VsYXIsIERPTURhdGEgaG9sZHMg
d3JhcHBlcnMgZm9yIGFsbCB0aGUgaXNvbGF0ZWQgd29ybGRzIGluIHRoZQotLy8gdGhyZWFkLiAg
VGhlIERPTURhdGEgZm9yIHRoZSBtYWluIHRocmVhZCBhbmQgdGhlIERPTURhdGEgZm9yIGNoaWxk
IHRocmVhZHMKLS8vIHVzZSBkaWZmZXJlbnQgc3ViY2xhc3Nlcy4KLS8vCi1jbGFzcyBET01EYXRh
OiBwdWJsaWMgTm9uY29weWFibGUgewotcHVibGljOgotICAgIERPTURhdGEoKQotICAgICAgICA6
IG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQoZmFsc2UpCi0gICAgICAgICwgbV9pc01haW5U
aHJlYWQoV1RGOjppc01haW5UaHJlYWQoKSkKLSAgICAgICAgLCBtX293bmluZ1RocmVhZChXVEY6
OmN1cnJlbnRUaHJlYWQoKSkKLSAgICB7Ci0gICAgfQotCi0gICAgc3RhdGljIERPTURhdGEqIGdl
dEN1cnJlbnQoKTsKLSAgICBzdGF0aWMgRE9NRGF0YSogZ2V0Q3VycmVudE1haW5UaHJlYWQoKTsg
Ly8gQ2FsbGVyIG11c3QgYmUgb24gdGhlIG1haW4gdGhyZWFkLgotICAgIHZpcnR1YWwgRE9NRGF0
YVN0b3JlJiBnZXRTdG9yZSgpID0gMDsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAg
c3RhdGljIHZvaWQgaGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTVdyYXBwZXJNYXBU
eXBlIG1hcFR5cGUsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhPYmplY3QsIFQqIGRvbU9iamVj
dCk7Ci0KLSAgICB2b2lkIGZvcmdldERlbGF5ZWRPYmplY3Qodm9pZCogb2JqZWN0KSB7IG1fZGVs
YXllZE9iamVjdE1hcC50YWtlKG9iamVjdCk7IH0KLQotICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJl
IHRoYXQgd2Ugd2lsbCBkZXJlZiBET00gb2JqZWN0cyBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLAot
ICAgIC8vIG5vdCB0aGUgR0MgdGhyZWFkLiAgVGhlIGhlbHBlciBmdW5jdGlvbiB3aWxsIGJlIHNj
aGVkdWxlZCBieSB0aGUgR0MKLSAgICAvLyB0aHJlYWQgdG8gZ2V0IGNhbGxlZCBmcm9tIHRoZSBv
d25pbmcgdGhyZWFkLgotICAgIHN0YXRpYyB2b2lkIGRlcmVmRGVsYXllZE9iamVjdHNJbkN1cnJl
bnRUaHJlYWQodm9pZCopOwotICAgIHZvaWQgZGVyZWZEZWxheWVkT2JqZWN0cygpOwotCi0gICAg
dGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0aWMgdm9pZCByZW1vdmVPYmplY3RzRnJvbVdy
YXBwZXJNYXAoRE9NV3JhcHBlck1hcDxUPiYgZG9tTWFwKTsKLQotICAgIFRocmVhZElkZW50aWZp
ZXIgb3duaW5nVGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbV9vd25pbmdUaHJlYWQ7IH0KLQotcHJp
dmF0ZToKLSAgICB0eXBlZGVmIFdURjo6SGFzaE1hcDx2b2lkKiwgVjhDbGFzc0luZGV4OjpWOFdy
YXBwZXJUeXBlPiBEZWxheWVkT2JqZWN0TWFwOwotCi0gICAgdm9pZCBlbnN1cmVEZXJlZihWOENs
YXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdm9pZCogZG9tT2JqZWN0KTsKLSAgICBzdGF0
aWMgdm9pZCBkZXJlZk9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdm9p
ZCogZG9tT2JqZWN0KTsKLQotICAgIC8vIFN0b3JlcyBhbGwgdGhlIERPTSBvYmplY3RzIHRoYXQg
YXJlIGRlbGF5ZWQgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gdGhlIG93bmluZyB0aHJlYWQgZ2FpbnMg
Y29udHJvbC4KLSAgICBEZWxheWVkT2JqZWN0TWFwIG1fZGVsYXllZE9iamVjdE1hcDsKLQotICAg
IC8vIFRoZSBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSB0YXNrIHRvIGRvIHRoZSBkZWxheWVkIHBy
b2Nlc3MgaGFzIGFscmVhZHkgYmVlbiBwb3N0ZWQuCi0gICAgYm9vbCBtX2RlbGF5ZWRQcm9jZXNz
aW5nU2NoZWR1bGVkOwotCi0gICAgYm9vbCBtX2lzTWFpblRocmVhZDsKLSAgICBUaHJlYWRJZGVu
dGlmaWVyIG1fb3duaW5nVGhyZWFkOwotfTsKLQotY2xhc3MgTWFpblRocmVhZERPTURhdGEgOiBw
dWJsaWMgRE9NRGF0YSB7Ci1wdWJsaWM6Ci0gICAgTWFpblRocmVhZERPTURhdGEoKSA6IG1fZGVm
YXVsdFN0b3JlKHRoaXMpIHsgfQotCi0gICAgRE9NRGF0YVN0b3JlJiBnZXRTdG9yZSgpCi0gICAg
ewotICAgICAgICBBU1NFUlQoV1RGOjppc01haW5UaHJlYWQoKSk7Ci0gICAgICAgIFY4SXNvbGF0
ZWRXb3JsZCogd29ybGQgPSBWOElzb2xhdGVkV29ybGQ6OmdldEVudGVyZWQoKTsKLSAgICAgICAg
aWYgKHdvcmxkKQotICAgICAgICAgICAgcmV0dXJuICp3b3JsZC0+Z2V0RE9NRGF0YVN0b3JlKCk7
Ci0gICAgICAgIHJldHVybiBtX2RlZmF1bHRTdG9yZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAg
U3RhdGljRE9NRGF0YVN0b3JlIG1fZGVmYXVsdFN0b3JlOwotICAgIC8vIE5vdGU6IFRoZSBET01E
YXRhU3RvcmVzIGZvciBpc29sYXRlZCB3b3JsZCBhcmUgb3duZWQgYnkgdGhlIHdvcmxkIG9iamVj
dC4KLX07Ci0KLWNsYXNzIENoaWxkVGhyZWFkRE9NRGF0YSA6IHB1YmxpYyBET01EYXRhIHsKLXB1
YmxpYzoKLSAgICBDaGlsZFRocmVhZERPTURhdGEoKSA6IG1fZGVmYXVsdFN0b3JlKHRoaXMpIHsg
fQotCi0gICAgRE9NRGF0YVN0b3JlJiBnZXRTdG9yZSgpIHsKLSAgICAgICAgQVNTRVJUKCFXVEY6
OmlzTWFpblRocmVhZCgpKTsKLSAgICAgICAgLy8gQ3VycmVudGx5LCBjaGlsZCB0aHJlYWRzIGhh
dmUgb25seSBvbmUgd29ybGQuCi0gICAgICAgIHJldHVybiBtX2RlZmF1bHRTdG9yZTsKLSAgICB9
Ci0KLXByaXZhdGU6Ci0gICAgU2NvcGVkRE9NRGF0YVN0b3JlIG1fZGVmYXVsdFN0b3JlOwotfTsK
LQotRE9NRGF0YVN0b3JlOjpET01EYXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSkKLSAgICA6IG1f
ZG9tTm9kZU1hcCgwKQotICAgICwgbV9kb21PYmplY3RNYXAoMCkKLSAgICAsIG1fYWN0aXZlRG9t
T2JqZWN0TWFwKDApCi0jaWYgRU5BQkxFKFNWRykKLSAgICAsIG1fZG9tU3ZnRWxlbWVudEluc3Rh
bmNlTWFwKDApCi0gICAgLCBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwKDApCi0jZW5kaWYK
LSAgICAsIG1fZG9tRGF0YShkb21EYXRhKQotewotICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2Vy
KERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7Ci0gICAgRE9NRGF0YVN0b3JlOjphbGxT
dG9yZXMoKS5hcHBlbmQodGhpcyk7Ci19Ci0KLURPTURhdGFTdG9yZTo6fkRPTURhdGFTdG9yZSgp
Ci17Ci0gICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNN
dXRleCgpKTsKLSAgICBET01EYXRhU3RvcmU6OmFsbFN0b3JlcygpLnJlbW92ZShET01EYXRhU3Rv
cmU6OmFsbFN0b3JlcygpLmZpbmQodGhpcykpOwotfQotCiBET01EYXRhU3RvcmVIYW5kbGU6OkRP
TURhdGFTdG9yZUhhbmRsZSgpCiAgICAgOiBtX3N0b3JlKG5ldyBTY29wZWRET01EYXRhU3RvcmUo
RE9NRGF0YTo6Z2V0Q3VycmVudCgpKSkKIHsKQEAgLTM5MywxMyArNDcsNiBAQCBET01EYXRhU3Rv
cmVIYW5kbGU6On5ET01EYXRhU3RvcmVIYW5kbGUoCiB7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBL
ZXlUeXBlPgotdm9pZCBET01EYXRhU3RvcmU6OkludGVybmFsRE9NV3JhcHBlck1hcDxLZXlUeXBl
Pjo6Zm9yZ2V0KEtleVR5cGUqIG9iamVjdCkKLXsKLSAgICBET01XcmFwcGVyTWFwPEtleVR5cGU+
Ojpmb3JnZXQob2JqZWN0KTsKLSAgICBtX2RvbURhdGEtPmZvcmdldERlbGF5ZWRPYmplY3Qob2Jq
ZWN0KTsKLX0KLQogRE9NV3JhcHBlck1hcDxOb2RlPiYgZ2V0RE9NTm9kZU1hcCgpCiB7CiAgICAg
Ly8gTm9kZXMgb25seSBleGlzdCBvbiB0aGUgbWFpbiB0aHJlYWQuCkBAIC00MzEsMTc0ICs3OCw2
IEBAIERPTVdyYXBwZXJNYXA8dm9pZD4mIGdldERPTVNWR09iamVjdFdpdGgKIAogI2VuZGlmIC8v
IEVOQUJMRShTVkcpCiAKLURPTURhdGEqIERPTURhdGE6OmdldEN1cnJlbnQoKQotewotICAgIGlm
IChXVEY6OmlzTWFpblRocmVhZCgpKQotICAgICAgICByZXR1cm4gZ2V0Q3VycmVudE1haW5UaHJl
YWQoKTsKLQotICAgIERFRklORV9TVEFUSUNfTE9DQUwoV1RGOjpUaHJlYWRTcGVjaWZpYzxDaGls
ZFRocmVhZERPTURhdGE+LCBjaGlsZFRocmVhZERPTURhdGEsICgpKTsKLSAgICByZXR1cm4gY2hp
bGRUaHJlYWRET01EYXRhOwotfQotCi1ET01EYXRhKiBET01EYXRhOjpnZXRDdXJyZW50TWFpblRo
cmVhZCgpCi17Ci0gICAgQVNTRVJUKFdURjo6aXNNYWluVGhyZWFkKCkpOwotICAgIERFRklORV9T
VEFUSUNfTE9DQUwoTWFpblRocmVhZERPTURhdGEsIG1haW5UaHJlYWRET01EYXRhLCAoKSk7Ci0g
ICAgcmV0dXJuICZtYWluVGhyZWFkRE9NRGF0YTsKLX0KLQotLy8gQ2FsbGVkIHdoZW4gdGhlIGRl
YWQgb2JqZWN0IGlzIG5vdCBpbiBHQyB0aHJlYWQncyBtYXAuIEdvIHRocm91Z2ggYWxsIHRocmVh
ZCBtYXBzIHRvIGZpbmQgdGhlIG9uZSBjb250YWluaW5nIGl0LgotLy8gVGhlbiBjbGVhciB0aGUg
SlMgcmVmZXJlbmNlIGFuZCBwdXNoIHRoZSBET00gb2JqZWN0IGludG8gdGhlIGRlbGF5ZWQgcXVl
dWUgZm9yIGl0IHRvIGJlIGRlcmVmLWVkIGF0IGxhdGVyIHRpbWUgZnJvbSB0aGUgb3duaW5nIHRo
cmVhZC4KLS8vICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgR0MgdGhyZWFkIGlzIG5vdCB0aGUg
b3duaW5nIHRocmVhZC4KLS8vICogVGhpcyBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQgdGhh
dCBoYXMgR0MgcnVubmluZy4KLS8vICogT25seSBvbmUgVjggaW5zdGFuY2UgaXMgcnVubmluZyBh
dCBhIHRpbWUgZHVlIHRvIFY4OjpMb2NrZXIuIFNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJv
dXQgY29uY3VycmVuY3kuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCBET01EYXRhOjpoYW5k
bGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6RE9NV3JhcHBlck1hcFR5cGUgbWFwVHlwZSwgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiB2OE9iamVjdCwgVCogZG9tT2JqZWN0KQotewotCi0gICAgV1RG
OjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsKLSAg
ICBET01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCk7Ci0gICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIERPTURhdGFT
dG9yZSogc3RvcmUgPSBsaXN0W2ldOwotCi0gICAgICAgIERPTURhdGFTdG9yZTo6SW50ZXJuYWxE
T01XcmFwcGVyTWFwPFQ+KiBkb21NYXAgPSBzdGF0aWNfY2FzdDxET01EYXRhU3RvcmU6OkludGVy
bmFsRE9NV3JhcHBlck1hcDxUPio+KHN0b3JlLT5nZXRET01XcmFwcGVyTWFwKG1hcFR5cGUpKTsK
LQotICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBkb21NYXAtPmdldChk
b21PYmplY3QpOwotICAgICAgICBpZiAoKndyYXBwZXIgPT0gKnY4T2JqZWN0KSB7Ci0gICAgICAg
ICAgICAvLyBDbGVhciB0aGUgSlMgcmVmZXJlbmNlLgotICAgICAgICAgICAgZG9tTWFwLT5mb3Jn
ZXRPbmx5KGRvbU9iamVjdCk7Ci0gICAgICAgICAgICBzdG9yZS0+ZG9tRGF0YSgpLT5lbnN1cmVE
ZXJlZihWOERPTVdyYXBwZXI6OmRvbVdyYXBwZXJUeXBlKHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsK
LSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBET01EYXRhOjplbnN1cmVEZXJlZihWOENsYXNz
SW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdm9pZCogZG9tT2JqZWN0KQotewotICAgIGlmICht
X293bmluZ1RocmVhZCA9PSBXVEY6OmN1cnJlbnRUaHJlYWQoKSkgewotICAgICAgICAvLyBObyBu
ZWVkIHRvIGRlbGF5IHRoZSB3b3JrLiAgV2UgY2FuIGRlcmVmIHJpZ2h0IG5vdy4KLSAgICAgICAg
ZGVyZWZPYmplY3QodHlwZSwgZG9tT2JqZWN0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhlIGRlcmVmIG9uIHRoZSBjb3JyZWN0IHRocmVhZC4KLSAg
ICBtX2RlbGF5ZWRPYmplY3RNYXAuc2V0KGRvbU9iamVjdCwgdHlwZSk7Ci0KLSAgICAvLyBQb3N0
IGEgdGFzayB0byB0aGUgb3duaW5nIHRocmVhZCBpbiBvcmRlciB0byBwcm9jZXNzIHRoZSBkZWxh
eWVkIHF1ZXVlLgotICAgIC8vIEZJWE1FOiBGb3Igbm93LCB3ZSBjYW4gb25seSBwb3N0IHRvIG1h
aW4gdGhyZWFkIGR1ZSB0byBXVEYgdGFzayBwb3N0aW5nIGxpbWl0YXRpb24uIFdlIHdpbGwgZml4
IHRoaXMgd2hlbiB3ZSB3b3JrIG9uIG5lc3RlZCB3b3JrZXIuCi0gICAgaWYgKCFtX2RlbGF5ZWRQ
cm9jZXNzaW5nU2NoZWR1bGVkKSB7Ci0gICAgICAgIG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVs
ZWQgPSB0cnVlOwotICAgICAgICBpZiAoaXNNYWluVGhyZWFkKCkpCi0gICAgICAgICAgICBXVEY6
OmNhbGxPbk1haW5UaHJlYWQoJmRlcmVmRGVsYXllZE9iamVjdHNJbkN1cnJlbnRUaHJlYWQsIDAp
OwotICAgIH0KLX0KLQotLy8gQ2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBuZWFyIGRlYXRoIChu
b3QgcmVhY2hhYmxlIGZyb20gSlMgcm9vdHMpLgotLy8gSXQgaXMgdGltZSB0byByZW1vdmUgdGhl
IGVudHJ5IGZyb20gdGhlIHRhYmxlIGFuZCBkaXNwb3NlIHRoZSBoYW5kbGUuCi1zdGF0aWMgdm9p
ZCB3ZWFrRE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVj
dCwgdm9pZCogZG9tT2JqZWN0KQotewotICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKLSAgICBB
U1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwotICAgIERPTURhdGE6OmhhbmRsZVdlYWtPYmpl
Y3QoRE9NRGF0YVN0b3JlOjpET01PYmplY3RNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNh
c3QodjhPYmplY3QpLCBkb21PYmplY3QpOwotfQotCi12b2lkIHdlYWtBY3RpdmVET01PYmplY3RD
YWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmpl
Y3QpCi17Ci0gICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwotICAgIEFTU0VSVCh2OE9iamVjdC0+
SXNPYmplY3QoKSk7Ci0gICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6
OkFjdGl2ZURPTU9iamVjdE1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVj
dCksIGRvbU9iamVjdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdlYWtOb2RlQ2FsbGJhY2sodjg6OlBl
cnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQotewotICAgIHY4
OjpIYW5kbGVTY29wZSBzY29wZTsKLSAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwot
ICAgIERPTURhdGE6OmhhbmRsZVdlYWtPYmplY3Q8Tm9kZT4oRE9NRGF0YVN0b3JlOjpET01Ob2Rl
TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgc3RhdGljX2Nhc3Q8
Tm9kZSo+KGRvbU9iamVjdCkpOwotfQotCi0jaWYgRU5BQkxFKFNWRykKLQotc3RhdGljIHZvaWQg
d2Vha1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4g
djhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKLXsKLSAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7
Ci0gICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKLSAgICBET01EYXRhOjpoYW5kbGVX
ZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwLCB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudElu
c3RhbmNlKj4oZG9tT2JqZWN0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdlYWtTVkdPYmplY3RXaXRo
Q29udGV4dENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQq
IGRvbU9iamVjdCkKLXsKLSAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7Ci0gICAgQVNTRVJUKHY4
T2JqZWN0LT5Jc09iamVjdCgpKTsKLSAgICBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURh
dGFTdG9yZTo6RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD46OkNhc3QodjhPYmplY3QpLCBkb21PYmplY3QpOwotfQotCi0jZW5kaWYgIC8vIEVOQUJMRShT
VkcpCi0KLXZvaWQgRE9NRGF0YTo6ZGVyZWZPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBj
YXNlIFY4Q2xhc3NJbmRleDo6Tk9ERToKLSAgICAgICAgc3RhdGljX2Nhc3Q8Tm9kZSo+KGRvbU9i
amVjdCktPmRlcmVmKCk7Ci0gICAgICAgIGJyZWFrOwotCi0jZGVmaW5lIE1ha2VDYXNlKHR5cGUs
IG5hbWUpICAgXAotICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6dHlwZTogc3RhdGljX2Nhc3Q8
bmFtZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7IGJyZWFrOwotICAgIERPTV9PQkpFQ1RfVFlQRVMo
TWFrZUNhc2UpICAgLy8gVGhpcyBpbmNsdWRlcyBib3RoIGFjdGl2ZSBhbmQgbm9uLWFjdGl2ZS4K
LSN1bmRlZiBNYWtlQ2FzZQotCi0jaWYgRU5BQkxFKFNWRykKLSNkZWZpbmUgTWFrZUNhc2UodHlw
ZSwgbmFtZSkgICAgIFwKLSAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6IHN0YXRpY19j
YXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKLSAgICBTVkdfT0JKRUNUX1RZ
UEVTKE1ha2VDYXNlKSAgIC8vIFRoaXMgYWxzbyBpbmNsdWRlcyBTVkdFbGVtZW50SW5zdGFuY2Uu
Ci0jdW5kZWYgTWFrZUNhc2UKLQotI2RlZmluZSBNYWtlQ2FzZSh0eXBlLCBuYW1lKSAgICAgXAot
ICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6dHlwZTogICAgXAotICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxuYW1lPio+KGRvbU9iamVjdCktPmRlcmVmKCk7IGJy
ZWFrOwotICAgIFNWR19QT0RfTkFUSVZFX1RZUEVTKE1ha2VDYXNlKQotI3VuZGVmIE1ha2VDYXNl
Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgRE9NRGF0YTo6ZGVyZWZEZWxheWVkT2Jq
ZWN0cygpCi17Ci0gICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxT
dG9yZXNNdXRleCgpKTsKLQotICAgIG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQgPSBmYWxz
ZTsKLQotICAgIGZvciAoRGVsYXllZE9iamVjdE1hcDo6aXRlcmF0b3IgaXRlcihtX2RlbGF5ZWRP
YmplY3RNYXAuYmVnaW4oKSk7IGl0ZXIgIT0gbV9kZWxheWVkT2JqZWN0TWFwLmVuZCgpOyArK2l0
ZXIpCi0gICAgICAgIGRlcmVmT2JqZWN0KGl0ZXItPnNlY29uZCwgaXRlci0+Zmlyc3QpOwotCi0g
ICAgbV9kZWxheWVkT2JqZWN0TWFwLmNsZWFyKCk7Ci19Ci0KLXZvaWQgRE9NRGF0YTo6ZGVyZWZE
ZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVhZCh2b2lkKikKLXsKLSAgICBnZXRDdXJyZW50KCkt
PmRlcmVmRGVsYXllZE9iamVjdHMoKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQg
RE9NRGF0YTo6cmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwKERPTVdyYXBwZXJNYXA8VD4mIGRv
bU1hcCkKLXsKLSAgICBmb3IgKHR5cGVuYW1lIFdURjo6SGFzaE1hcDxUKiwgdjg6Ok9iamVjdCo+
OjppdGVyYXRvciBpdGVyKGRvbU1hcC5pbXBsKCkuYmVnaW4oKSk7IGl0ZXIgIT0gZG9tTWFwLmlt
cGwoKS5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICAgIFQqIGRvbU9iamVjdCA9IHN0YXRpY19jYXN0
PFQqPihpdGVyLT5maXJzdCk7Ci0gICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHY4
T2JqZWN0KGl0ZXItPnNlY29uZCk7Ci0KLSAgICAgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGUgPSBWOERPTVdyYXBwZXI6OmRvbVdyYXBwZXJUeXBlKHY4OjpIYW5kbGU8djg6Ok9i
amVjdD46OkNhc3QodjhPYmplY3QpKTsKLQotICAgICAgICAvLyBEZXJlZiB0aGUgRE9NIG9iamVj
dC4KLSAgICAgICAgZGVyZWZPYmplY3QodHlwZSwgZG9tT2JqZWN0KTsKLQotICAgICAgICAvLyBD
bGVhciB0aGUgSlMgd3JhcHBlci4KLSAgICAgICAgdjhPYmplY3QuRGlzcG9zZSgpOwotICAgIH0K
LSAgICBkb21NYXAuaW1wbCgpLmNsZWFyKCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHJlbW92ZUFsbERP
TU9iamVjdHNJbkN1cnJlbnRUaHJlYWRIZWxwZXIoKQogewogICAgIHY4OjpIYW5kbGVTY29wZSBz
Y29wZTs=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33500</attachid>
            <date>2009-07-25 17:03:05 -0700</date>
            <delta_ts>2009-07-27 11:24:16 -0700</delta_ts>
            <desc>Patch (just copy/paste)</desc>
            <filename>bug-27685-20090725170304.patch</filename>
            <type>text/plain</type>
            <size>69699</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NjQwMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjQgQEAKKzIwMDktMDctMjUgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbVjhd
IFNwbGl0IHVwIFY4RE9NTWFwLmNwcCBieSBjbGFzcworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2ODUKKworICAgICAgICBObyBiZWhhdmlvciBjaGFu
Z2UuICBKdXN0IGNvcHktYW5kLXBhc3RlLgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAg
ICAgICAqIGJpbmRpbmdzL3Y4L0NoaWxkVGhyZWFkRE9NRGF0YS5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6Q2hpbGRUaHJlYWRET01EYXRhOjpDaGlsZFRocmVhZERPTURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6Q2hpbGRUaHJlYWRET01EYXRhOjpnZXRTdG9yZSk6CisgICAgICAgICog
YmluZGluZ3MvdjgvQ2hpbGRUaHJlYWRET01EYXRhLmg6IEFkZGVkLgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L0RPTURhdGEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OkRP
TURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YTo6Z2V0Q3VycmVudCk6CisgICAgICAg
IChXZWJDb3JlOjpET01EYXRhOjpnZXRDdXJyZW50TWFpblRocmVhZCk6CisgICAgICAgIChXZWJD
b3JlOjpET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURh
dGE6OmVuc3VyZURlcmVmKToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OmRlcmVmT2JqZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OmRlcmVmRGVsYXllZE9iamVjdHMpOgorICAg
ICAgICAoV2ViQ29yZTo6RE9NRGF0YTo6ZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVh
ZCk6CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhOjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJN
YXApOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RPTURhdGEuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjopOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RPTURhdGFTdG9yZS5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpET01EYXRhU3RvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjp+RE9NRGF0YVN0b3JlKToKKyAgICAgICAgKFdlYkNv
cmU6OkRPTURhdGFTdG9yZTo6YWxsU3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGFT
dG9yZTo6YWxsU3RvcmVzTXV0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpn
ZXRET01XcmFwcGVyTWFwKToKKyAgICAgICAgKFdlYkNvcmU6Ojo6Zm9yZ2V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6d2Vha0RPTU9iamVjdENhbGxiYWNrKToKKyAgICAgICAg
KFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6d2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6d2Vha05vZGVDYWxsYmFjayk6CisgICAgICAg
IChXZWJDb3JlOjpET01EYXRhU3RvcmU6OndlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayk6
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OndlYWtTVkdPYmplY3RXaXRoQ29udGV4
dENhbGxiYWNrKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9ET01EYXRhU3RvcmUuaDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpE
T01EYXRhU3RvcmU6OkludGVybmFsRE9NV3JhcHBlck1hcDo6SW50ZXJuYWxET01XcmFwcGVyTWFw
KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6SW50ZXJuYWxET01XcmFwcGVyTWFw
Ojpmb3JnZXRPbmx5KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGFTdG9yZTo6ZG9tRGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OmRvbU5vZGVNYXApOgorICAgICAgICAo
V2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpkb21PYmplY3RNYXApOgorICAgICAgICAoV2ViQ29yZTo6
RE9NRGF0YVN0b3JlOjphY3RpdmVEb21PYmplY3RNYXApOgorICAgICAgICAoV2ViQ29yZTo6RE9N
RGF0YVN0b3JlOjpkb21TdmdFbGVtZW50SW5zdGFuY2VNYXApOgorICAgICAgICAoV2ViQ29yZTo6
RE9NRGF0YVN0b3JlOjpkb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCk6CisgICAgICAgICogYmlu
ZGluZ3MvdjgvTWFpblRocmVhZERPTURhdGEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
Ok1haW5UaHJlYWRET01EYXRhOjpNYWluVGhyZWFkRE9NRGF0YSk6CisgICAgICAgIChXZWJDb3Jl
OjpNYWluVGhyZWFkRE9NRGF0YTo6Z2V0U3RvcmUpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L01h
aW5UaHJlYWRET01EYXRhLmg6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Njb3BlZERP
TURhdGFTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U2NvcGVkRE9NRGF0YVN0
b3JlOjpTY29wZWRET01EYXRhU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U2NvcGVkRE9NRGF0
YVN0b3JlOjp+U2NvcGVkRE9NRGF0YVN0b3JlKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9TY29w
ZWRET01EYXRhU3RvcmUuaDogQWRkZWQuCisgICAgICAgICogYmluZGluZ3MvdjgvU3RhdGljRE9N
RGF0YVN0b3JlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTdGF0aWNET01EYXRhU3Rv
cmU6OlN0YXRpY0RPTURhdGFTdG9yZSk6CisgICAgICAgICogYmluZGluZ3MvdjgvU3RhdGljRE9N
RGF0YVN0b3JlLmg6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4RE9NTWFwLmNwcDoK
KwogMjAwOS0wNy0xNiAgU2hpbmljaGlybyBIYW1hamkgIDxoYW1hamlAY2hyb21pdW0ub3JnPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IE9saXZlciBIdW50LgpJbmRleDogV2ViQ29yZS9XZWJDb3Jl
Lmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDQ2MjM1
KQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTU4Miw2ICs1ODIs
OCBAQAogICAgICAgICAgICAgJ2JpbmRpbmdzL2pzL1N0cmluZ1NvdXJjZVByb3ZpZGVyLmgnLAog
ICAgICAgICAgICAgJ2JpbmRpbmdzL2pzL1dvcmtlclNjcmlwdENvbnRyb2xsZXIuY3BwJywKICAg
ICAgICAgICAgICdiaW5kaW5ncy9qcy9Xb3JrZXJTY3JpcHRDb250cm9sbGVyLmgnLAorICAgICAg
ICAgICAgJ2JpbmRpbmdzL3Y4L0NoaWxkVGhyZWFkRE9NRGF0YS5oJywKKyAgICAgICAgICAgICdi
aW5kaW5ncy92OC9DaGlsZFRocmVhZERPTURhdGEuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9jdXN0b20vVjhBYnN0cmFjdFdvcmtlckN1c3RvbS5jcHAnLAogICAgICAgICAgICAgJ2Jp
bmRpbmdzL3Y4L2N1c3RvbS9WOEF0dHJDdXN0b20uY3BwJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9jdXN0b20vVjhDYW52YXNQaXhlbEFycmF5Q3VzdG9tLmNwcCcsCkBAIC02NjAsMTEgKzY2
MiwxOSBAQAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhNTFNlcmlhbGl6ZXJD
b25zdHJ1Y3Rvci5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFhQYXRo
RXZhbHVhdG9yQ29uc3RydWN0b3IuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9jdXN0
b20vVjhYU0xUUHJvY2Vzc29yQ3VzdG9tLmNwcCcsCisgICAgICAgICAgICAnYmluZGluZ3Mvdjgv
RE9NRGF0YS5oJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9ET01EYXRhLmNwcCcsCisgICAg
ICAgICAgICAnYmluZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmgnLAorICAgICAgICAgICAgJ2JpbmRp
bmdzL3Y4L0RPTURhdGFTdG9yZS5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L0RPTU9i
amVjdHNJbmNsdWRlLmgnLAorICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01E
YXRhLmgnLAorICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmNwcCcs
CiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvTlBWOE9iamVjdC5jcHAnLAogICAgICAgICAgICAg
J2JpbmRpbmdzL3Y4L05QVjhPYmplY3QuaCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2No
ZWR1bGVkQWN0aW9uLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2NoZWR1bGVkQWN0
aW9uLmgnLAorICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L1Njb3BlZERPTURhdGFTdG9yZS5oJywK
KyAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY29wZWRET01EYXRhU3RvcmUuY3BwJywKICAgICAg
ICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRDYWNoZWRGcmFtZURhdGEuaCcsCiAgICAgICAgICAg
ICAnYmluZGluZ3MvdjgvU2NyaXB0Q2FsbEZyYW1lLmNwcCcsCiAgICAgICAgICAgICAnYmluZGlu
Z3MvdjgvU2NyaXB0Q2FsbEZyYW1lLmgnLApAQCAtNjkwLDYgKzcwMCw4IEBACiAgICAgICAgICAg
ICAnYmluZGluZ3MvdjgvU2NyaXB0U3RyaW5nLmgnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4
L1NjcmlwdFZhbHVlLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2NyaXB0VmFsdWUu
aCcsCisgICAgICAgICAgICAnYmluZGluZ3MvdjgvU3RhdGljRE9NRGF0YVN0b3JlLmgnLAorICAg
ICAgICAgICAgJ2JpbmRpbmdzL3Y4L1N0YXRpY0RPTURhdGFTdG9yZS5jcHAnLAogICAgICAgICAg
ICAgJ2JpbmRpbmdzL3Y4L1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyLmNwcCcsCiAgICAgICAgICAg
ICAnYmluZGluZ3MvdjgvVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuaCcsCiAgICAgICAgICAgICAn
YmluZGluZ3MvdjgvVjhCaW5kaW5nLmNwcCcsCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L0No
aWxkVGhyZWFkRE9NRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9D
aGlsZFRocmVhZERPTURhdGEuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92
OC9DaGlsZFRocmVhZERPTURhdGEuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAq
IGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisg
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNoaWxkVGhyZWFkRE9NRGF0YS5oIgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK0NoaWxkVGhyZWFkRE9NRGF0YTo6Q2hpbGRUaHJlYWRET01EYXRh
KCkKKyAgICA6IG1fZGVmYXVsdFN0b3JlKHRoaXMpCit7Cit9CisKK0RPTURhdGFTdG9yZSYgQ2hp
bGRUaHJlYWRET01EYXRhOjpnZXRTdG9yZSgpCit7CisgICAgQVNTRVJUKCFXVEY6OmlzTWFpblRo
cmVhZCgpKTsKKyAgICAvLyBDdXJyZW50bHksIGNoaWxkIHRocmVhZHMgaGF2ZSBvbmx5IG9uZSB3
b3JsZC4KKyAgICByZXR1cm4gbV9kZWZhdWx0U3RvcmU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvQ2hpbGRUaHJlYWRET01EYXRhLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9DaGlsZFRocmVhZERPTURhdGEuaAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvQ2hpbGRUaHJlYWRET01EYXRhLmgJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
ICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENoaWxkVGhyZWFkRE9NRGF0YV9oCisj
ZGVmaW5lIENoaWxkVGhyZWFkRE9NRGF0YV9oCisKKyNpbmNsdWRlICJET01EYXRhLmgiCisjaW5j
bHVkZSAiU2NvcGVkRE9NRGF0YVN0b3JlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAg
IGNsYXNzIENoaWxkVGhyZWFkRE9NRGF0YSA6IHB1YmxpYyBET01EYXRhIHsKKyAgICBwdWJsaWM6
CisgICAgICAgIENoaWxkVGhyZWFkRE9NRGF0YSgpOworICAgICAgICBET01EYXRhU3RvcmUmIGdl
dFN0b3JlKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBTY29wZWRET01EYXRhU3RvcmUgbV9k
ZWZhdWx0U3RvcmU7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gQ2hpbGRUaHJlYWRET01EYXRhX2gKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0
YS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YS5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRPTURhdGEu
aCIKKworI2luY2x1ZGUgIkNoaWxkVGhyZWFkRE9NRGF0YS5oIgorI2luY2x1ZGUgIk1haW5UaHJl
YWRET01EYXRhLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworRE9NRGF0YTo6RE9NRGF0YSgp
CisgICAgOiBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkKGZhbHNlKQorICAgICwgbV9pc01h
aW5UaHJlYWQoV1RGOjppc01haW5UaHJlYWQoKSkKKyAgICAsIG1fb3duaW5nVGhyZWFkKFdURjo6
Y3VycmVudFRocmVhZCgpKQoreworfQorCitET01EYXRhKiBET01EYXRhOjpnZXRDdXJyZW50KCkK
K3sKKyAgICBpZiAoV1RGOjppc01haW5UaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGdldEN1cnJl
bnRNYWluVGhyZWFkKCk7CisKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFdURjo6VGhyZWFkU3Bl
Y2lmaWM8Q2hpbGRUaHJlYWRET01EYXRhPiwgY2hpbGRUaHJlYWRET01EYXRhLCAoKSk7CisgICAg
cmV0dXJuIGNoaWxkVGhyZWFkRE9NRGF0YTsKK30KKworRE9NRGF0YSogRE9NRGF0YTo6Z2V0Q3Vy
cmVudE1haW5UaHJlYWQoKQoreworICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKKyAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKE1haW5UaHJlYWRET01EYXRhLCBtYWluVGhyZWFkRE9NRGF0
YSwgKCkpOworICAgIHJldHVybiAmbWFpblRocmVhZERPTURhdGE7Cit9CisKKy8vIENhbGxlZCB3
aGVuIHRoZSBkZWFkIG9iamVjdCBpcyBub3QgaW4gR0MgdGhyZWFkJ3MgbWFwLiBHbyB0aHJvdWdo
IGFsbCB0aHJlYWQgbWFwcyB0byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyBpdC4KKy8vIFRoZW4g
Y2xlYXIgdGhlIEpTIHJlZmVyZW5jZSBhbmQgcHVzaCB0aGUgRE9NIG9iamVjdCBpbnRvIHRoZSBk
ZWxheWVkIHF1ZXVlIGZvciBpdCB0byBiZSBkZXJlZi1lZCBhdCBsYXRlciB0aW1lIGZyb20gdGhl
IG93bmluZyB0aHJlYWQuCisvLyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIEdDIHRocmVhZCBp
cyBub3QgdGhlIG93bmluZyB0aHJlYWQuCisvLyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBhbnkg
dGhyZWFkIHRoYXQgaGFzIEdDIHJ1bm5pbmcuCisvLyAqIE9ubHkgb25lIFY4IGluc3RhbmNlIGlz
IHJ1bm5pbmcgYXQgYSB0aW1lIGR1ZSB0byBWODo6TG9ja2VyLiBTbyB3ZSBkb24ndCBuZWVkIHRv
IHdvcnJ5IGFib3V0IGNvbmN1cnJlbmN5LgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgRE9N
RGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTVdyYXBwZXJNYXBUeXBlIG1h
cFR5cGUsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhPYmplY3QsIFQqIGRvbU9iamVjdCkKK3sK
KworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0
ZXgoKSk7CisgICAgRE9NRGF0YUxpc3QmIGxpc3QgPSBET01EYXRhU3RvcmU6OmFsbFN0b3Jlcygp
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7ICsraSkgeworICAgICAg
ICBET01EYXRhU3RvcmUqIHN0b3JlID0gbGlzdFtpXTsKKworICAgICAgICBET01EYXRhU3RvcmU6
OkludGVybmFsRE9NV3JhcHBlck1hcDxUPiogZG9tTWFwID0gc3RhdGljX2Nhc3Q8RE9NRGF0YVN0
b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8VD4qPihzdG9yZS0+Z2V0RE9NV3JhcHBlck1hcCht
YXBUeXBlKSk7CisKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZG9t
TWFwLT5nZXQoZG9tT2JqZWN0KTsKKyAgICAgICAgaWYgKCp3cmFwcGVyID09ICp2OE9iamVjdCkg
eworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIEpTIHJlZmVyZW5jZS4KKyAgICAgICAgICAgIGRv
bU1hcC0+Zm9yZ2V0T25seShkb21PYmplY3QpOworICAgICAgICAgICAgc3RvcmUtPmRvbURhdGEo
KS0+ZW5zdXJlRGVyZWYoVjhET01XcmFwcGVyOjpkb21XcmFwcGVyVHlwZSh2OE9iamVjdCksIGRv
bU9iamVjdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRE9NRGF0YTo6ZW5zdXJlRGVy
ZWYoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCkKK3sK
KyAgICBpZiAobV9vd25pbmdUaHJlYWQgPT0gV1RGOjpjdXJyZW50VGhyZWFkKCkpIHsKKyAgICAg
ICAgLy8gTm8gbmVlZCB0byBkZWxheSB0aGUgd29yay4gIFdlIGNhbiBkZXJlZiByaWdodCBub3cu
CisgICAgICAgIGRlcmVmT2JqZWN0KHR5cGUsIGRvbU9iamVjdCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIGRvIHRoZSBkZXJlZiBvbiB0aGUgY29ycmVjdCB0
aHJlYWQuCisgICAgbV9kZWxheWVkT2JqZWN0TWFwLnNldChkb21PYmplY3QsIHR5cGUpOworCisg
ICAgLy8gUG9zdCBhIHRhc2sgdG8gdGhlIG93bmluZyB0aHJlYWQgaW4gb3JkZXIgdG8gcHJvY2Vz
cyB0aGUgZGVsYXllZCBxdWV1ZS4KKyAgICAvLyBGSVhNRTogRm9yIG5vdywgd2UgY2FuIG9ubHkg
cG9zdCB0byBtYWluIHRocmVhZCBkdWUgdG8gV1RGIHRhc2sgcG9zdGluZyBsaW1pdGF0aW9uLiBX
ZSB3aWxsIGZpeCB0aGlzIHdoZW4gd2Ugd29yayBvbiBuZXN0ZWQgd29ya2VyLgorICAgIGlmICgh
bV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZCkgeworICAgICAgICBtX2RlbGF5ZWRQcm9jZXNz
aW5nU2NoZWR1bGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGlzTWFpblRocmVhZCgpKQorICAgICAg
ICAgICAgV1RGOjpjYWxsT25NYWluVGhyZWFkKCZkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50
VGhyZWFkLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgRE9NRGF0YTo6ZGVyZWZPYmplY3QoVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICBzd2l0
Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFY4Q2xhc3NJbmRleDo6Tk9ERToKKyAgICAgICAgc3RhdGlj
X2Nhc3Q8Tm9kZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7CisgICAgICAgIGJyZWFrOworCisjZGVm
aW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgXAorICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6
dHlwZTogc3RhdGljX2Nhc3Q8bmFtZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7IGJyZWFrOworICAg
IERPTV9PQkpFQ1RfVFlQRVMoTWFrZUNhc2UpICAgLy8gVGhpcyBpbmNsdWRlcyBib3RoIGFjdGl2
ZSBhbmQgbm9uLWFjdGl2ZS4KKyN1bmRlZiBNYWtlQ2FzZQorCisjaWYgRU5BQkxFKFNWRykKKyNk
ZWZpbmUgTWFrZUNhc2UodHlwZSwgbmFtZSkgICAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsK
KyAgICBTVkdfT0JKRUNUX1RZUEVTKE1ha2VDYXNlKSAgIC8vIFRoaXMgYWxzbyBpbmNsdWRlcyBT
VkdFbGVtZW50SW5zdGFuY2UuCisjdW5kZWYgTWFrZUNhc2UKKworI2RlZmluZSBNYWtlQ2FzZSh0
eXBlLCBuYW1lKSAgICAgXAorICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6dHlwZTogICAgXAor
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VjhTVkdQT0RUeXBlV3JhcHBlcjxuYW1lPio+KGRvbU9i
amVjdCktPmRlcmVmKCk7IGJyZWFrOworICAgIFNWR19QT0RfTkFUSVZFX1RZUEVTKE1ha2VDYXNl
KQorI3VuZGVmIE1ha2VDYXNlCisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgRE9NRGF0
YTo6ZGVyZWZEZWxheWVkT2JqZWN0cygpCit7CisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIo
RE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsKKworICAgIG1fZGVsYXllZFByb2Nlc3Np
bmdTY2hlZHVsZWQgPSBmYWxzZTsKKworICAgIGZvciAoRGVsYXllZE9iamVjdE1hcDo6aXRlcmF0
b3IgaXRlcihtX2RlbGF5ZWRPYmplY3RNYXAuYmVnaW4oKSk7IGl0ZXIgIT0gbV9kZWxheWVkT2Jq
ZWN0TWFwLmVuZCgpOyArK2l0ZXIpCisgICAgICAgIGRlcmVmT2JqZWN0KGl0ZXItPnNlY29uZCwg
aXRlci0+Zmlyc3QpOworCisgICAgbV9kZWxheWVkT2JqZWN0TWFwLmNsZWFyKCk7Cit9CisKK3Zv
aWQgRE9NRGF0YTo6ZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVhZCh2b2lkKikKK3sK
KyAgICBnZXRDdXJyZW50KCktPmRlcmVmRGVsYXllZE9iamVjdHMoKTsKK30KKwordGVtcGxhdGU8
dHlwZW5hbWUgVD4KK3ZvaWQgRE9NRGF0YTo6cmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwKERP
TVdyYXBwZXJNYXA8VD4mIGRvbU1hcCkKK3sKKyAgICBmb3IgKHR5cGVuYW1lIFdURjo6SGFzaE1h
cDxUKiwgdjg6Ok9iamVjdCo+OjppdGVyYXRvciBpdGVyKGRvbU1hcC5pbXBsKCkuYmVnaW4oKSk7
IGl0ZXIgIT0gZG9tTWFwLmltcGwoKS5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgIFQqIGRvbU9i
amVjdCA9IHN0YXRpY19jYXN0PFQqPihpdGVyLT5maXJzdCk7CisgICAgICAgIHY4OjpQZXJzaXN0
ZW50PHY4OjpPYmplY3Q+IHY4T2JqZWN0KGl0ZXItPnNlY29uZCk7CisKKyAgICAgICAgVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOERPTVdyYXBwZXI6OmRvbVdyYXBwZXJUeXBl
KHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpKTsKKworICAgICAgICAvLyBE
ZXJlZiB0aGUgRE9NIG9iamVjdC4KKyAgICAgICAgZGVyZWZPYmplY3QodHlwZSwgZG9tT2JqZWN0
KTsKKworICAgICAgICAvLyBDbGVhciB0aGUgSlMgd3JhcHBlci4KKyAgICAgICAgdjhPYmplY3Qu
RGlzcG9zZSgpOworICAgIH0KKyAgICBkb21NYXAuaW1wbCgpLmNsZWFyKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YS5oCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIERPTURhdGFfaAorI2RlZmluZSBET01EYXRhX2gKKworI2luY2x1ZGUgIkRP
TURhdGFTdG9yZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICAvLyBET01EYXRhCisg
ICAgLy8KKyAgICAvLyBET01EYXRhIHJlcHJlc2VudHMgdGhlIGFsbCB0aGUgRE9NIHdyYXBwZXJz
IGZvciBhIGdpdmVuIHRocmVhZC4gIEluCisgICAgLy8gcGFydGljdWxhciwgRE9NRGF0YSBob2xk
cyB3cmFwcGVycyBmb3IgYWxsIHRoZSBpc29sYXRlZCB3b3JsZHMgaW4gdGhlCisgICAgLy8gdGhy
ZWFkLiAgVGhlIERPTURhdGEgZm9yIHRoZSBtYWluIHRocmVhZCBhbmQgdGhlIERPTURhdGEgZm9y
IGNoaWxkIHRocmVhZHMKKyAgICAvLyB1c2UgZGlmZmVyZW50IHN1YmNsYXNzZXMuCisgICAgLy8K
KyAgICBjbGFzcyBET01EYXRhOiBwdWJsaWMgTm9uY29weWFibGUgeworICAgIHB1YmxpYzoKKyAg
ICAgICAgRE9NRGF0YSgpOworCisgICAgICAgIHN0YXRpYyBET01EYXRhKiBnZXRDdXJyZW50KCk7
CisgICAgICAgIHN0YXRpYyBET01EYXRhKiBnZXRDdXJyZW50TWFpblRocmVhZCgpOyAvLyBDYWxs
ZXIgbXVzdCBiZSBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICAgIHZpcnR1YWwgRE9NRGF0YVN0
b3JlJiBnZXRTdG9yZSgpID0gMDsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAg
ICAgICBzdGF0aWMgdm9pZCBoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6RE9NV3JhcHBl
ck1hcFR5cGUgbWFwVHlwZSwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB2OE9iamVjdCwgVCogZG9t
T2JqZWN0KTsKKworICAgICAgICB2b2lkIGZvcmdldERlbGF5ZWRPYmplY3Qodm9pZCogb2JqZWN0
KSB7IG1fZGVsYXllZE9iamVjdE1hcC50YWtlKG9iamVjdCk7IH0KKworICAgICAgICAvLyBUaGlz
IGlzIHRvIGVuc3VyZSB0aGF0IHdlIHdpbGwgZGVyZWYgRE9NIG9iamVjdHMgZnJvbSB0aGUgb3du
aW5nIHRocmVhZCwKKyAgICAgICAgLy8gbm90IHRoZSBHQyB0aHJlYWQuICBUaGUgaGVscGVyIGZ1
bmN0aW9uIHdpbGwgYmUgc2NoZWR1bGVkIGJ5IHRoZSBHQworICAgICAgICAvLyB0aHJlYWQgdG8g
Z2V0IGNhbGxlZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLgorICAgICAgICBzdGF0aWMgdm9pZCBk
ZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkKHZvaWQqKTsKKyAgICAgICAgdm9pZCBk
ZXJlZkRlbGF5ZWRPYmplY3RzKCk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAg
ICAgICAgc3RhdGljIHZvaWQgcmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwKERPTVdyYXBwZXJN
YXA8VD4mIGRvbU1hcCk7CisKKyAgICAgICAgVGhyZWFkSWRlbnRpZmllciBvd25pbmdUaHJlYWQo
KSBjb25zdCB7IHJldHVybiBtX293bmluZ1RocmVhZDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAg
ICAgdHlwZWRlZiBXVEY6Okhhc2hNYXA8dm9pZCosIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZT4gRGVsYXllZE9iamVjdE1hcDsKKworICAgICAgICB2b2lkIGVuc3VyZURlcmVmKFY4Q2xhc3NJ
bmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpOworICAgICAgICBzdGF0
aWMgdm9pZCBkZXJlZk9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdm9p
ZCogZG9tT2JqZWN0KTsKKworICAgICAgICAvLyBTdG9yZXMgYWxsIHRoZSBET00gb2JqZWN0cyB0
aGF0IGFyZSBkZWxheWVkIHRvIGJlIHByb2Nlc3NlZCB3aGVuIHRoZQorICAgICAgICAvLyBvd25p
bmcgdGhyZWFkIGdhaW5zIGNvbnRyb2wuCisgICAgICAgIERlbGF5ZWRPYmplY3RNYXAgbV9kZWxh
eWVkT2JqZWN0TWFwOworCisgICAgICAgIC8vIFRoZSBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSB0
YXNrIHRvIGRvIHRoZSBkZWxheWVkIHByb2Nlc3MgaGFzCisgICAgICAgIC8vIGFscmVhZHkgYmVl
biBwb3N0ZWQuCisgICAgICAgIGJvb2wgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZDsKKwor
ICAgICAgICBib29sIG1faXNNYWluVGhyZWFkOworICAgICAgICBUaHJlYWRJZGVudGlmaWVyIG1f
b3duaW5nVGhyZWFkOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlm
IC8vIERPTURhdGFfaApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhU3RvcmUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICog
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
IGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRE9N
RGF0YVN0b3JlLmgiCisKKyNpbmNsdWRlICJET01EYXRhLmgiCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworLy8gRE9NIGJpbmRpbmcgYWxnb3JpdGhtOgorLy8KKy8vIFRoZXJlIGFyZSB0d28ga2lu
ZHMgb2YgRE9NIG9iamVjdHM6CisvLyAxLiBET00gdHJlZSBub2Rlcywgc3VjaCBhcyBEb2N1bWVu
dCwgSFRNTEVsZW1lbnQsIC4uLgorLy8gICAgdGhlcmUgY2xhc3NlcyBpbXBsZW1lbnQgVHJlZVNo
YXJlZDxUPiBpbnRlcmZhY2U7CisvLyAyLiBOb24tbm9kZSBET00gb2JqZWN0cywgc3VjaCBhcyBD
U1NSdWxlLCBMb2NhdGlvbiwgZXRjLgorLy8gICAgdGhlc2UgY2xhc3NlcyBpbXBsZW1lbnQgYSBy
ZWYtY291bnRlZCBzY2hlbWUuCisvLworLy8gQSBET00gb2JqZWN0IG1heSBoYXZlIGEgSlMgd3Jh
cHBlciBvYmplY3QuIElmIGEgdHJlZSBub2RlCisvLyBpcyBhbGl2ZSwgaXRzIEpTIHdyYXBwZXIg
bXVzdCBiZSBrZXB0IGFsaXZlIGV2ZW4gaXQgaXMgbm90CisvLyByZWFjaGFibGUgZnJvbSBKUyBy
b290cy4KKy8vIEhvd2V2ZXIsIEpTIHdyYXBwZXJzIG9mIG5vbi1ub2RlIG9iamVjdHMgY2FuIGdv
IGF3YXkgaWYKKy8vIG5vdCByZWFjaGFibGUgZnJvbSBvdGhlciBKUyBvYmplY3RzLiBJdCB3b3Jr
cyBsaWtlIGEgY2FjaGUuCisvLworLy8gRE9NIG9iamVjdHMgYXJlIHJlZi1jb3VudGVkLCBhbmQg
SlMgb2JqZWN0cyBhcmUgdHJhY2VkIGZyb20KKy8vIGEgc2V0IG9mIHJvb3Qgb2JqZWN0cy4gVGhl
eSBjYW4gY3JlYXRlIGEgY3ljbGUuIFRvIGJyZWFrCisvLyBjeWNsZXMsIHdlIGRvIGZvbGxvd2lu
ZzoKKy8vICAgSGFuZGxlcyBmcm9tIERPTSBvYmplY3RzIHRvIEpTIHdyYXBwZXJzIGFyZSBhbHdh
eXMgd2VhaywKKy8vIHNvIEpTIHdyYXBwZXJzIG9mIG5vbi1ub2RlIG9iamVjdCBjYW5ub3QgY3Jl
YXRlIGEgY3ljbGUuCisvLyAgIEJlZm9yZSBzdGFydGluZyBhIGdsb2JhbCBHQywgd2UgY3JlYXRl
IGEgdmlydHVhbCBjb25uZWN0aW9uCisvLyBiZXR3ZWVuIG5vZGVzIGluIHRoZSBzYW1lIHRyZWUg
aW4gdGhlIEpTIGhlYXAuIElmIHRoZSB3cmFwcGVyCisvLyBvZiBvbmUgbm9kZSBpbiBhIHRyZWUg
aXMgYWxpdmUsIHdyYXBwZXJzIG9mIGFsbCBub2RlcyBpbgorLy8gdGhlIHNhbWUgdHJlZSBhcmUg
Y29uc2lkZXJlZCBhbGl2ZS4gVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nCisvLyBvYmplY3QgZ3Jv
dXBzIGluIEdDIHByb2xvZ3VlIGNhbGxiYWNrcy4gVGhlIG1hcmstY29tcGFjdAorLy8gY29sbGVj
dG9yIHdpbGwgcmVtb3ZlIHRoZXNlIGdyb3VwcyBhZnRlciBlYWNoIEdDLgorLy8KKy8vIERPTSBv
YmplY3RzIHNob3VsZCBiZSBkZXJlZi1lZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLCBub3QgdGhl
IEdDIHRocmVhZAorLy8gdGhhdCBkb2VzIG5vdCBvd24gdGhlbS4gSW4gVjgsIEdDIGNhbiBraWNr
IGluIGZyb20gYW55IHRocmVhZC4gVG8gZW5zdXJlCisvLyB0aGF0IERPTSBvYmplY3RzIGFyZSBh
bHdheXMgZGVyZWYtZWQgZnJvbSB0aGUgb3duaW5nIHRocmVhZCB3aGVuIHJ1bm5pbmcKKy8vIFY4
IGluIG11bHRpLXRocmVhZGluZyBlbnZpcm9ubWVudCwgd2UgZG8gZm9sbG93aW5nOgorLy8gMS4g
TWFpbnRhaW4gYSB0aHJlYWQgc3BlY2lmaWMgRE9NIHdyYXBwZXIgbWFwIGZvciBlYWNoIG9iamVj
dCBtYXAuCisvLyAgICAoV2UncmUgdXNpbmcgVExTIHN1cHBvcnQgZnJvbSBXVEYgaW5zdGVhZCBv
ZiBiYXNlIHNpbmNlIFY4QmluZGluZ3MKKy8vICAgICBkb2VzIG5vdCBkZXBlbmQgb24gYmFzZS4g
V2UgZnVydGhlciBhc3N1bWUgdGhhdCBhbGwgY2hpbGQgdGhyZWFkcworLy8gICAgIHJ1bm5pbmcg
VjggaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGJ5IFdURiBhbmQgdGh1cyBhIGRlc3RydWN0b3Igd2ls
bAorLy8gICAgIGJlIGNhbGxlZCB0byBjbGVhbiB1cCBhbGwgdGhyZWFkIHNwZWNpZmljIGRhdGEu
KQorLy8gMi4gV2hlbiBHQyBoYXBwZW5zOgorLy8gICAgMi4xLiBJZiB0aGUgZGVhZCBvYmplY3Qg
aXMgaW4gR0MgdGhyZWFkJ3MgbWFwLCByZW1vdmUgdGhlIEpTIHJlZmVyZW5jZQorLy8gICAgICAg
ICBhbmQgZGVyZWYgdGhlIERPTSBvYmplY3QuCisvLyAgICAyLjIuIE90aGVyd2lzZSwgZ28gdGhy
b3VnaCBhbGwgdGhyZWFkIG1hcHMgdG8gZmluZCB0aGUgb3duaW5nIHRocmVhZC4KKy8vICAgICAg
ICAgUmVtb3ZlIHRoZSBKUyByZWZlcmVuY2UgZnJvbSB0aGUgb3duaW5nIHRocmVhZCdzIG1hcCBh
bmQgbW92ZSB0aGUKKy8vICAgICAgICAgRE9NIG9iamVjdCB0byBhIGRlbGF5ZWQgcXVldWUuIFBv
c3QgYSB0YXNrIHRvIHRoZSBvd25pbmcgdGhyZWFkCisvLyAgICAgICAgIHRvIGhhdmUgaXQgZGVy
ZWYtZWQgZnJvbSB0aGUgb3duaW5nIHRocmVhZCBhdCBsYXRlciB0aW1lLgorLy8gMy4gV2hlbiBh
IHRocmVhZCBpcyB0ZWFyaW5nIGRvd24sIGludm9rZSBhIGNsZWFudXAgcm91dGluZSB0byBnbyB0
aHJvdWdoCisvLyAgICBhbGwgb2JqZWN0cyBpbiB0aGUgZGVsYXllZCBxdWV1ZSBhbmQgdGhlIHRo
cmVhZCBtYXAgYW5kIGRlcmVmIGFsbCBvZgorLy8gICAgdGhlbS4KKworCitET01EYXRhU3RvcmU6
OkRPTURhdGFTdG9yZShET01EYXRhKiBkb21EYXRhKQorICAgIDogbV9kb21Ob2RlTWFwKDApCisg
ICAgLCBtX2RvbU9iamVjdE1hcCgwKQorICAgICwgbV9hY3RpdmVEb21PYmplY3RNYXAoMCkKKyNp
ZiBFTkFCTEUoU1ZHKQorICAgICwgbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXAoMCkKKyAgICAs
IG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoMCkKKyNlbmRpZgorICAgICwgbV9kb21EYXRh
KGRvbURhdGEpCit7CisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjph
bGxTdG9yZXNNdXRleCgpKTsKKyAgICBET01EYXRhU3RvcmU6OmFsbFN0b3JlcygpLmFwcGVuZCh0
aGlzKTsKK30KKworRE9NRGF0YVN0b3JlOjp+RE9NRGF0YVN0b3JlKCkKK3sKKyAgICBXVEY6Ok11
dGV4TG9ja2VyIGxvY2tlcihET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOworICAgIERP
TURhdGFTdG9yZTo6YWxsU3RvcmVzKCkucmVtb3ZlKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCku
ZmluZCh0aGlzKSk7Cit9CisKK0RPTURhdGFMaXN0JiBET01EYXRhU3RvcmU6OmFsbFN0b3Jlcygp
Cit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChET01EYXRhTGlzdCwgc3RhdGljRE9NRGF0YUxp
c3QsICgpKTsKKyAgICByZXR1cm4gc3RhdGljRE9NRGF0YUxpc3Q7Cit9CisKK1dURjo6TXV0ZXgm
IERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKQoreworICAgIERFRklORV9TVEFUSUNfTE9D
QUwoV1RGOjpNdXRleCwgc3RhdGljRE9NRGF0YUxpc3RNdXRleCwgKCkpOworICAgIHJldHVybiBz
dGF0aWNET01EYXRhTGlzdE11dGV4OworfQorCit2b2lkKiBET01EYXRhU3RvcmU6OmdldERPTVdy
YXBwZXJNYXAoRE9NV3JhcHBlck1hcFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsK
KyAgICBjYXNlIERPTU5vZGVNYXA6CisgICAgICAgIHJldHVybiBtX2RvbU5vZGVNYXA7CisgICAg
Y2FzZSBET01PYmplY3RNYXA6CisgICAgICAgIHJldHVybiBtX2RvbU9iamVjdE1hcDsKKyAgICBj
YXNlIEFjdGl2ZURPTU9iamVjdE1hcDoKKyAgICAgICAgcmV0dXJuIG1fYWN0aXZlRG9tT2JqZWN0
TWFwOworI2lmIEVOQUJMRShTVkcpCisgICAgY2FzZSBET01TVkdFbGVtZW50SW5zdGFuY2VNYXA6
CisgICAgICAgIHJldHVybiBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcDsKKyAgICBjYXNlIERP
TVNWR09iamVjdFdpdGhDb250ZXh0TWFwOgorICAgICAgICByZXR1cm4gbV9kb21TdmdPYmplY3RX
aXRoQ29udGV4dE1hcDsKKyNlbmRpZgorICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZT4KK3ZvaWQgRE9N
RGF0YVN0b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8S2V5VHlwZT46OmZvcmdldChLZXlUeXBl
KiBvYmplY3QpCit7CisgICAgRE9NV3JhcHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7
CisgICAgbV9kb21EYXRhLT5mb3JnZXREZWxheWVkT2JqZWN0KG9iamVjdCk7Cit9CisKKy8vIENh
bGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgbmVhciBkZWF0aCAobm90IHJlYWNoYWJsZSBmcm9tIEpT
IHJvb3RzKS4KKy8vIEl0IGlzIHRpbWUgdG8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJs
ZSBhbmQgZGlzcG9zZSB0aGUgaGFuZGxlLgordm9pZCBET01EYXRhU3RvcmU6OndlYWtET01PYmpl
Y3RDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21P
YmplY3QpCit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVj
dC0+SXNPYmplY3QoKSk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3Rv
cmU6OkRPTU9iamVjdE1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCks
IGRvbU9iamVjdCk7Cit9CisKK3ZvaWQgRE9NRGF0YVN0b3JlOjp3ZWFrQWN0aXZlRE9NT2JqZWN0
Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2Jq
ZWN0KQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKKyAgICBBU1NFUlQodjhPYmplY3Qt
PklzT2JqZWN0KCkpOworICAgIERPTURhdGE6OmhhbmRsZVdlYWtPYmplY3QoRE9NRGF0YVN0b3Jl
OjpBY3RpdmVET01PYmplY3RNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmpl
Y3QpLCBkb21PYmplY3QpOworfQorCit2b2lkIERPTURhdGFTdG9yZTo6d2Vha05vZGVDYWxsYmFj
ayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCit7
CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmpl
Y3QoKSk7CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdDxOb2RlPihET01EYXRhU3RvcmU6
OkRPTU5vZGVNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBzdGF0
aWNfY2FzdDxOb2RlKj4oZG9tT2JqZWN0KSk7Cit9CisKKyNpZiBFTkFCTEUoU1ZHKQorCit2b2lk
IERPTURhdGFTdG9yZTo6d2Vha1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNrKHY4OjpQZXJzaXN0
ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICB2ODo6SGFu
ZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKKyAgICBE
T01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6RE9NU1ZHRWxlbWVudEluc3Rh
bmNlTWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgc3RhdGljX2Nh
c3Q8U1ZHRWxlbWVudEluc3RhbmNlKj4oZG9tT2JqZWN0KSk7Cit9CisKK3ZvaWQgRE9NRGF0YVN0
b3JlOjp3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6
VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCit7CisgICAgdjg6OkhhbmRsZVNjb3Bl
IHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7CisgICAgRE9NRGF0YTo6
aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTVNWR09iamVjdFdpdGhDb250ZXh0TWFw
LCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsKK30K
KworI2VuZGlmICAvLyBFTkFCTEUoU1ZHKQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RPTURhdGFTdG9yZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvYmluZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L0RPTURhdGFTdG9yZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEzMiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgRE9NRGF0YVN0b3JlX2gKKyNkZWZpbmUgRE9NRGF0YVN0b3JlX2gKKworI2luY2x1ZGUg
IkRPTU9iamVjdHNJbmNsdWRlLmgiCisKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1
ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5j
bHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbmNs
dWRlIDx3dGYvVGhyZWFkaW5nLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZFNwZWNpZmljLmg+Cisj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHY4Lmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworICAgIGNsYXNzIERPTURhdGE7CisKKyAgICB0eXBlZGVmIFdURjo6VmVjdG9yPERP
TURhdGFTdG9yZSo+IERPTURhdGFMaXN0OworCisgICAgLy8gRE9NRGF0YVN0b3JlCisgICAgLy8K
KyAgICAvLyBET01EYXRhU3RvcmUgaXMgdGhlIGJhY2tpbmcgc3RvcmUgdGhhdCBob2xkcyB0aGUg
bWFwcyBiZXR3ZWVuIERPTSBvYmplY3RzCisgICAgLy8gYW5kIEphdmFTY3JpcHQgb2JqZWN0cy4g
IEluIGdlbmVyYWwsIGVhY2ggdGhyZWFkIGNhbiBoYXZlIG11bHRpcGxlIGJhY2tpbmcKKyAgICAv
LyBzdG9yZXMsIG9uZSBwZXIgaXNvbGF0ZWQgd29ybGQuCisgICAgLy8KKyAgICAvLyBUaGlzIGNs
YXNzIGRvZXNuJ3QgbWFuYWdlIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUuICBUaGUgZGF0YSBz
dG9yZQorICAgIC8vIGxpZmV0aW1lIGlzIG1hbmFnZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAvLwor
ICAgIGNsYXNzIERPTURhdGFTdG9yZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAgcHVibGlj
OgorICAgICAgICBlbnVtIERPTVdyYXBwZXJNYXBUeXBlIHsKKyAgICAgICAgICAgIERPTU5vZGVN
YXAsCisgICAgICAgICAgICBET01PYmplY3RNYXAsCisgICAgICAgICAgICBBY3RpdmVET01PYmpl
Y3RNYXAsCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgICAgIERPTVNWR0VsZW1lbnRJbnN0YW5j
ZU1hcCwKKyAgICAgICAgICAgIERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwCisjZW5kaWYKKyAg
ICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZT4KKyAgICAgICAgY2xh
c3MgSW50ZXJuYWxET01XcmFwcGVyTWFwIDogcHVibGljIERPTVdyYXBwZXJNYXA8S2V5VHlwZT4g
eworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXAoRE9N
RGF0YSogZG9tRGF0YSwgdjg6OldlYWtSZWZlcmVuY2VDYWxsYmFjayBjYWxsYmFjaykKKyAgICAg
ICAgICAgICAgICA6IERPTVdyYXBwZXJNYXA8S2V5VHlwZT4oY2FsbGJhY2spICwgbV9kb21EYXRh
KGRvbURhdGEpIHsgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9yZ2V0KEtleVR5cGUq
KTsKKyAgICAgICAgICAgIHZvaWQgZm9yZ2V0T25seShLZXlUeXBlKiBvYmplY3QpIHsgRE9NV3Jh
cHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7IH0KKworICAgICAgICBwcml2YXRlOgor
ICAgICAgICAgICAgRE9NRGF0YSogbV9kb21EYXRhOworICAgICAgICB9OworCisgICAgICAgIERP
TURhdGFTdG9yZShET01EYXRhKiBkb21EYXRhKTsKKyAgICAgICAgdmlydHVhbCB+RE9NRGF0YVN0
b3JlKCk7CisKKyAgICAgICAgLy8gQSBsaXN0IG9mIGFsbCBET01EYXRhU3RvcmUgb2JqZWN0cy4g
IFRyYXZlcnNlZCBkdXJpbmcgR0MgdG8gZmluZCBhIHRocmVhZC1zcGVjaWZpYyBtYXAgdGhhdAor
ICAgICAgICAvLyBjb250YWlucyB0aGUgb2JqZWN0IC0gc28gd2UgY2FuIHNjaGVkdWxlIHRoZSBv
YmplY3QgdG8gYmUgZGVsZXRlZCBvbiB0aGUgdGhyZWFkIHdoaWNoIGNyZWF0ZWQgaXQuCisgICAg
ICAgIHN0YXRpYyBET01EYXRhTGlzdCYgYWxsU3RvcmVzKCk7CisgICAgICAgIC8vIE11dGV4IHRv
IHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBvZiBET01EYXRhTGlzdC4KKyAgICAg
ICAgc3RhdGljIFdURjo6TXV0ZXgmIGFsbFN0b3Jlc011dGV4KCk7CisKKyAgICAgICAgRE9NRGF0
YSogZG9tRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZG9tRGF0YTsgfQorCisgICAgICAgIHZvaWQq
IGdldERPTVdyYXBwZXJNYXAoRE9NV3JhcHBlck1hcFR5cGUgdHlwZSk7CisKKyAgICAgICAgSW50
ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+JiBkb21Ob2RlTWFwKCkgeyByZXR1cm4gKm1fZG9tTm9k
ZU1hcDsgfQorICAgICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIGRvbU9iamVjdE1h
cCgpIHsgcmV0dXJuICptX2RvbU9iamVjdE1hcDsgfQorICAgICAgICBJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4mIGFjdGl2ZURvbU9iamVjdE1hcCgpIHsgcmV0dXJuICptX2FjdGl2ZURvbU9i
amVjdE1hcDsgfQorI2lmIEVOQUJMRShTVkcpCisgICAgICAgIEludGVybmFsRE9NV3JhcHBlck1h
cDxTVkdFbGVtZW50SW5zdGFuY2U+JiBkb21TdmdFbGVtZW50SW5zdGFuY2VNYXAoKSB7IHJldHVy
biAqbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXA7IH0KKyAgICAgICAgSW50ZXJuYWxET01XcmFw
cGVyTWFwPHZvaWQ+JiBkb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCgpIHsgcmV0dXJuICptX2Rv
bVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOyB9CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKyAg
ICAgICAgc3RhdGljIHZvaWQgd2Vha05vZGVDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFs
dWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOworICAgICAgICBzdGF0aWMgdm9pZCB3ZWFr
RE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9p
ZCogZG9tT2JqZWN0KTsKKyAgICAgICAgc3RhdGljIHZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENh
bGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVj
dCk7CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgc3RhdGljIHZvaWQgd2Vha1NWR0VsZW1lbnRJ
bnN0YW5jZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQq
IGRvbU9iamVjdCk7CisgICAgICAgIC8vIFNWRyBub24tbm9kZSBlbGVtZW50cyBtYXkgaGF2ZSBh
IHJlZmVyZW5jZSB0byBhIGNvbnRleHQgbm9kZSB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgd2hl
biB0aGUgZWxlbWVudCBpcyBjaGFuZ2UuCisgICAgICAgIHN0YXRpYyB2b2lkIHdlYWtTVkdPYmpl
Y3RXaXRoQ29udGV4dENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3Qs
IHZvaWQqIGRvbU9iamVjdCk7CisjZW5kaWYKKyAgICAgICAgCisgICAgICAgIEludGVybmFsRE9N
V3JhcHBlck1hcDxOb2RlPiogbV9kb21Ob2RlTWFwOworICAgICAgICBJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4qIG1fZG9tT2JqZWN0TWFwOworICAgICAgICBJbnRlcm5hbERPTVdyYXBwZXJN
YXA8dm9pZD4qIG1fYWN0aXZlRG9tT2JqZWN0TWFwOworI2lmIEVOQUJMRShTVkcpCisgICAgICAg
IEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+KiBtX2RvbVN2Z0VsZW1l
bnRJbnN0YW5jZU1hcDsKKyAgICAgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KiBtX2Rv
bVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOworI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAg
ICAvLyBBIGJhY2stcG9pbnRlciB0byB0aGUgRE9NRGF0YSB0byB3aGljaCB3ZSBiZWxvbmcuCisg
ICAgICAgIERPTURhdGEqIG1fZG9tRGF0YTsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBET01EYXRhU3RvcmVfaApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92
OC9NYWluVGhyZWFkRE9NRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9NYWluVGhyZWFkRE9NRGF0YS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdz
L3Y4L01haW5UaHJlYWRET01EYXRhLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1MiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNYWluVGhyZWFkRE9NRGF0YS5oIgorCisjaW5j
bHVkZSAiVjhJc29sYXRlZFdvcmxkLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworTWFpblRo
cmVhZERPTURhdGE6Ok1haW5UaHJlYWRET01EYXRhKCkKKyAgICA6IG1fZGVmYXVsdFN0b3JlKHRo
aXMpCit7Cit9CisKK0RPTURhdGFTdG9yZSYgTWFpblRocmVhZERPTURhdGE6OmdldFN0b3JlKCkK
K3sKKyAgICBBU1NFUlQoV1RGOjppc01haW5UaHJlYWQoKSk7CisgICAgVjhJc29sYXRlZFdvcmxk
KiB3b3JsZCA9IFY4SXNvbGF0ZWRXb3JsZDo6Z2V0RW50ZXJlZCgpOworICAgIGlmICh3b3JsZCkK
KyAgICAgICAgcmV0dXJuICp3b3JsZC0+Z2V0RE9NRGF0YVN0b3JlKCk7CisgICAgcmV0dXJuIG1f
ZGVmYXVsdFN0b3JlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9i
aW5kaW5ncy92OC9NYWluVGhyZWFkRE9NRGF0YS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9NYWluVGhyZWFkRE9NRGF0YS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2lmbmRlZiBNYWluVGhyZWFkRE9NRGF0YV9oCisjZGVmaW5lIE1haW5UaHJlYWRET01EYXRh
X2gKKworI2luY2x1ZGUgIkRPTURhdGEuaCIKKyNpbmNsdWRlICJTdGF0aWNET01EYXRhU3RvcmUu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgTWFpblRocmVhZERPTURhdGEg
OiBwdWJsaWMgRE9NRGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBNYWluVGhyZWFkRE9NRGF0
YSgpOworICAgICAgICBET01EYXRhU3RvcmUmIGdldFN0b3JlKCk7CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBTdGF0aWNET01EYXRhU3RvcmUgbV9kZWZhdWx0U3RvcmU7CisgICAgICAgIC8vIE5v
dGU6IFRoZSBET01EYXRhU3RvcmVzIGZvciBpc29sYXRlZCB3b3JsZCBhcmUgb3duZWQgYnkgdGhl
IHdvcmxkIG9iamVjdC4KKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBNYWluVGhyZWFkRE9NRGF0YV9oCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Njb3Bl
ZERPTURhdGFTdG9yZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9TY29w
ZWRET01EYXRhU3RvcmUuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9T
Y29wZWRET01EYXRhU3RvcmUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRp
c3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
KyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNjb3BlZERPTURhdGFTdG9yZS5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK1Njb3BlZERPTURhdGFTdG9yZTo6U2NvcGVkRE9NRGF0YVN0b3JlKERP
TURhdGEqIGRvbURhdGEpIDogRE9NRGF0YVN0b3JlKGRvbURhdGEpCit7CisgICAgbV9kb21Ob2Rl
TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPihkb21EYXRhLCAmRE9NRGF0YVN0
b3JlOjp3ZWFrTm9kZUNhbGxiYWNrKTsKKyAgICBtX2RvbU9iamVjdE1hcCA9IG5ldyBJbnRlcm5h
bERPTVdyYXBwZXJNYXA8dm9pZD4oZG9tRGF0YSwgJkRPTURhdGFTdG9yZTo6d2Vha0RPTU9iamVj
dENhbGxiYWNrKTsKKyAgICBtX2FjdGl2ZURvbU9iamVjdE1hcCA9IG5ldyBJbnRlcm5hbERPTVdy
YXBwZXJNYXA8dm9pZD4oZG9tRGF0YSwgJkRPTURhdGFTdG9yZTo6d2Vha0FjdGl2ZURPTU9iamVj
dENhbGxiYWNrKTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNl
TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+KGRvbURh
dGEsICZET01EYXRhU3RvcmU6OndlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayk7CisgICAg
bV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8
dm9pZD4oZG9tRGF0YSwgJkRPTURhdGFTdG9yZTo6d2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2Fs
bGJhY2spOworI2VuZGlmCit9CisKK1Njb3BlZERPTURhdGFTdG9yZTo6flNjb3BlZERPTURhdGFT
dG9yZSgpCit7CisgICAgZGVsZXRlIG1fZG9tTm9kZU1hcDsKKyAgICBkZWxldGUgbV9kb21PYmpl
Y3RNYXA7CisgICAgZGVsZXRlIG1fYWN0aXZlRG9tT2JqZWN0TWFwOworI2lmIEVOQUJMRShTVkcp
CisgICAgZGVsZXRlIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOworICAgIGRlbGV0ZSBtX2Rv
bVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOworI2VuZGlmCit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU2NvcGVkRE9NRGF0YVN0b3JlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9TY29wZWRET01EYXRhU3RvcmUuaAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvU2NvcGVkRE9NRGF0YVN0b3JlLmgJKHJl
dmlzaW9uIDApCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
ICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFNjb3BlZERPTURhdGFTdG9yZV9oCisj
ZGVmaW5lIFNjb3BlZERPTURhdGFTdG9yZV9oCisKKyNpbmNsdWRlICJET01EYXRhU3RvcmUuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgLy8gU2NvcGVkRE9NRGF0YVN0b3JlCisgICAg
Ly8KKyAgICAvLyBTY29wZWRET01EYXRhU3RvcmUgaXMgYSBET01EYXRhU3RvcmUgdGhhdCBjb250
cm9scyBsaW1pdHMgdGhlIGxpZmV0aW1lIG9mCisgICAgLy8gdGhlIHN0b3JlIHRvIHRoZSBsaWZl
dGltZSBvZiB0aGUgb2JqZWN0IGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCB3aGVuIHRoZQorICAg
IC8vIFNjb3BlZERPTURhdGFTdG9yZSBvYmplY3QgaXMgZGVhbGxvY2F0ZWQsIHRoZSBtYXBzIHRo
YXQgYmVsb25nIHRvIHRoZSBzdG9yZQorICAgIC8vIGFyZSBkZWFsbG9jYXRlZCBhcyB3ZWxsLgor
ICAgIC8vCisgICAgY2xhc3MgU2NvcGVkRE9NRGF0YVN0b3JlIDogcHVibGljIERPTURhdGFTdG9y
ZSB7CisgICAgcHVibGljOgorICAgICAgICBTY29wZWRET01EYXRhU3RvcmUoRE9NRGF0YSogZG9t
RGF0YSk7CisKKyAgICAgICAgLy8gVGhpcyBjYW4gYmUgY2FsbGVkIHdoZW4gV1RGIHRocmVhZCBp
cyB0ZWFyaW5nIGRvd24uCisgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCBjaGlsZCB0aHJl
YWRzIHJ1bm5pbmcgVjggaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGJ5IFdURi4KKyAgICAgICAgdmly
dHVhbCB+U2NvcGVkRE9NRGF0YVN0b3JlKCk7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYgLy8gU2NvcGVkRE9NRGF0YVN0b3JlX2gKSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvdjgvU3RhdGljRE9NRGF0YVN0b3JlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1N0YXRpY0RPTURhdGFTdG9yZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L1N0YXRpY0RPTURhdGFTdG9yZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3RhdGljRE9NRGF0YVN0b3Jl
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU3RhdGljRE9NRGF0YVN0b3JlOjpTdGF0aWNE
T01EYXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSkKKyAgICA6IERPTURhdGFTdG9yZShkb21EYXRh
KQorICAgICwgbV9zdGF0aWNEb21Ob2RlTWFwKGRvbURhdGEsICZET01EYXRhU3RvcmU6OndlYWtO
b2RlQ2FsbGJhY2spCisgICAgLCBtX3N0YXRpY0RvbU9iamVjdE1hcChkb21EYXRhLCAmRE9NRGF0
YVN0b3JlOjp3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spCisgICAgLCBtX3N0YXRpY0FjdGl2ZURvbU9i
amVjdE1hcChkb21EYXRhLCAmRE9NRGF0YVN0b3JlOjp3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJh
Y2spCisjaWYgRU5BQkxFKFNWRykKKyAgICAsIG1fc3RhdGljRG9tU3ZnRWxlbWVudEluc3RhbmNl
TWFwKGRvbURhdGEsICZET01EYXRhU3RvcmU6OndlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFj
aykKKyAgICAsIG1fc3RhdGljRG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoZG9tRGF0YSwgJkRP
TURhdGFTdG9yZTo6d2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2spCisjZW5kaWYKK3sK
KyAgICBtX2RvbU5vZGVNYXAgPSAmbV9zdGF0aWNEb21Ob2RlTWFwOworICAgIG1fZG9tT2JqZWN0
TWFwID0gJm1fc3RhdGljRG9tT2JqZWN0TWFwOworICAgIG1fYWN0aXZlRG9tT2JqZWN0TWFwID0g
Jm1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwOworI2lmIEVOQUJMRShTVkcpCisgICAgbV9kb21T
dmdFbGVtZW50SW5zdGFuY2VNYXAgPSAmbV9zdGF0aWNEb21TdmdFbGVtZW50SW5zdGFuY2VNYXA7
CisgICAgbV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCA9ICZtX3N0YXRpY0RvbVN2Z09iamVj
dFdpdGhDb250ZXh0TWFwOworI2VuZGlmCit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU3RhdGljRE9NRGF0YVN0b3JlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3RvcmUuaAkocmV2aXNpb24gMCkK
KysrIFdlYkNvcmUvYmluZGluZ3MvdjgvU3RhdGljRE9NRGF0YVN0b3JlLmgJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUg
bmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20K
KyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhP
TERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICog
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRI
RSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
CisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIFN0YXRpY0RPTURhdGFTdG9yZV9oCisjZGVmaW5lIFN0
YXRpY0RPTURhdGFTdG9yZV9oCisKKyNpbmNsdWRlICJET01EYXRhU3RvcmUuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCisvLyBTdGF0aWNET01EYXRhU3RvcmUKKy8vCisvLyBTdGF0aWNET01E
YXRhU3RvcmUgaXMgYSBET01EYXRhU3RvcmUgdGhhdCBtYW5hZ2VzIHRoZSBsaWZldGltZSBvZiB0
aGUgc3RvcmUKKy8vIHN0YXRpY2FsbHkuICBUaGlzIGVuY2Fwc3VsYXRlcyB0aHJlYWQtc3BlY2lm
aWMgRE9NIGRhdGEgZm9yIHRoZSBtYWluCisvLyB0aHJlYWQuICBBbGwgdGhlIG1hcHMgaW4gaXQg
YXJlIHN0YXRpYy4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBhcmUgdW5hYmxlIHRvCisvLyByZWx5IG9u
IFdURjo6VGhyZWFkU3BlY2lmaWNUaHJlYWRFeGl0IHRvIGRvIHRoZSBjbGVhbnVwIHNpbmNlIHRo
ZSBwbGFjZSB0aGF0CisvLyB0ZWFycyBkb3duIHRoZSBtYWluIHRocmVhZCBjYW4gbm90IGNhbGwg
YW55IFdURiBmdW5jdGlvbnMuCisvLworY2xhc3MgU3RhdGljRE9NRGF0YVN0b3JlIDogcHVibGlj
IERPTURhdGFTdG9yZSB7CitwdWJsaWM6CisgICAgU3RhdGljRE9NRGF0YVN0b3JlKERPTURhdGEq
IGRvbURhdGEpOworCitwcml2YXRlOgorICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiBt
X3N0YXRpY0RvbU5vZGVNYXA7CisgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+IG1fc3Rh
dGljRG9tT2JqZWN0TWFwOworICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiBtX3N0YXRp
Y0FjdGl2ZURvbU9iamVjdE1hcDsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIEludGVybmFsRE9NV3Jh
cHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+IG1fc3RhdGljRG9tU3ZnRWxlbWVudEluc3RhbmNl
TWFwOworICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiBtX3N0YXRpY0RvbVN2Z09iamVj
dFdpdGhDb250ZXh0TWFwOworI2VuZGlmCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBTdGF0aWNET01EYXRhU3RvcmVfaAorCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4RE9NTWFwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4RE9N
TWFwLmNwcAkocmV2aXNpb24gNDY0MDEpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4RE9NTWFw
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEsMzU5ICszMSwxMyBAQAogI2luY2x1ZGUgImNvbmZp
Zy5oIgogI2luY2x1ZGUgIlY4RE9NTWFwLmgiCiAKKyNpbmNsdWRlICJET01EYXRhLmgiCisjaW5j
bHVkZSAiRE9NRGF0YVN0b3JlLmgiCiAjaW5jbHVkZSAiRE9NT2JqZWN0c0luY2x1ZGUuaCIKLQot
I2luY2x1ZGUgPHY4Lmg+Ci0KLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0
Zi9NYWluVGhyZWFkLmg+Ci0jaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+Ci0jaW5jbHVkZSA8
d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KLSNpbmNsdWRl
IDx3dGYvVGhyZWFkU3BlY2lmaWMuaD4KLSNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+Ci0KLSNpbmNs
dWRlICJWOElzb2xhdGVkV29ybGQuaCIKKyNpbmNsdWRlICJTY29wZWRET01EYXRhU3RvcmUuaCIK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi0vLyBET00gYmluZGluZyBhbGdvcml0aG06Ci0vLwot
Ly8gVGhlcmUgYXJlIHR3byBraW5kcyBvZiBET00gb2JqZWN0czoKLS8vIDEuIERPTSB0cmVlIG5v
ZGVzLCBzdWNoIGFzIERvY3VtZW50LCBIVE1MRWxlbWVudCwgLi4uCi0vLyAgICB0aGVyZSBjbGFz
c2VzIGltcGxlbWVudCBUcmVlU2hhcmVkPFQ+IGludGVyZmFjZTsKLS8vIDIuIE5vbi1ub2RlIERP
TSBvYmplY3RzLCBzdWNoIGFzIENTU1J1bGUsIExvY2F0aW9uLCBldGMuCi0vLyAgICB0aGVzZSBj
bGFzc2VzIGltcGxlbWVudCBhIHJlZi1jb3VudGVkIHNjaGVtZS4KLS8vCi0vLyBBIERPTSBvYmpl
Y3QgbWF5IGhhdmUgYSBKUyB3cmFwcGVyIG9iamVjdC4gSWYgYSB0cmVlIG5vZGUKLS8vIGlzIGFs
aXZlLCBpdHMgSlMgd3JhcHBlciBtdXN0IGJlIGtlcHQgYWxpdmUgZXZlbiBpdCBpcyBub3QKLS8v
IHJlYWNoYWJsZSBmcm9tIEpTIHJvb3RzLgotLy8gSG93ZXZlciwgSlMgd3JhcHBlcnMgb2Ygbm9u
LW5vZGUgb2JqZWN0cyBjYW4gZ28gYXdheSBpZgotLy8gbm90IHJlYWNoYWJsZSBmcm9tIG90aGVy
IEpTIG9iamVjdHMuIEl0IHdvcmtzIGxpa2UgYSBjYWNoZS4KLS8vCi0vLyBET00gb2JqZWN0cyBh
cmUgcmVmLWNvdW50ZWQsIGFuZCBKUyBvYmplY3RzIGFyZSB0cmFjZWQgZnJvbQotLy8gYSBzZXQg
b2Ygcm9vdCBvYmplY3RzLiBUaGV5IGNhbiBjcmVhdGUgYSBjeWNsZS4gVG8gYnJlYWsKLS8vIGN5
Y2xlcywgd2UgZG8gZm9sbG93aW5nOgotLy8gICBIYW5kbGVzIGZyb20gRE9NIG9iamVjdHMgdG8g
SlMgd3JhcHBlcnMgYXJlIGFsd2F5cyB3ZWFrLAotLy8gc28gSlMgd3JhcHBlcnMgb2Ygbm9uLW5v
ZGUgb2JqZWN0IGNhbm5vdCBjcmVhdGUgYSBjeWNsZS4KLS8vICAgQmVmb3JlIHN0YXJ0aW5nIGEg
Z2xvYmFsIEdDLCB3ZSBjcmVhdGUgYSB2aXJ0dWFsIGNvbm5lY3Rpb24KLS8vIGJldHdlZW4gbm9k
ZXMgaW4gdGhlIHNhbWUgdHJlZSBpbiB0aGUgSlMgaGVhcC4gSWYgdGhlIHdyYXBwZXIKLS8vIG9m
IG9uZSBub2RlIGluIGEgdHJlZSBpcyBhbGl2ZSwgd3JhcHBlcnMgb2YgYWxsIG5vZGVzIGluCi0v
LyB0aGUgc2FtZSB0cmVlIGFyZSBjb25zaWRlcmVkIGFsaXZlLiBUaGlzIGlzIGRvbmUgYnkgY3Jl
YXRpbmcKLS8vIG9iamVjdCBncm91cHMgaW4gR0MgcHJvbG9ndWUgY2FsbGJhY2tzLiBUaGUgbWFy
ay1jb21wYWN0Ci0vLyBjb2xsZWN0b3Igd2lsbCByZW1vdmUgdGhlc2UgZ3JvdXBzIGFmdGVyIGVh
Y2ggR0MuCi0vLwotLy8gRE9NIG9iamVjdHMgc2hvdWxkIGJlIGRlcmVmLWVkIGZyb20gdGhlIG93
bmluZyB0aHJlYWQsIG5vdCB0aGUgR0MgdGhyZWFkCi0vLyB0aGF0IGRvZXMgbm90IG93biB0aGVt
LiBJbiBWOCwgR0MgY2FuIGtpY2sgaW4gZnJvbSBhbnkgdGhyZWFkLiBUbyBlbnN1cmUKLS8vIHRo
YXQgRE9NIG9iamVjdHMgYXJlIGFsd2F5cyBkZXJlZi1lZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFk
IHdoZW4gcnVubmluZwotLy8gVjggaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50LCB3ZSBk
byBmb2xsb3dpbmc6Ci0vLyAxLiBNYWludGFpbiBhIHRocmVhZCBzcGVjaWZpYyBET00gd3JhcHBl
ciBtYXAgZm9yIGVhY2ggb2JqZWN0IG1hcC4KLS8vICAgIChXZSdyZSB1c2luZyBUTFMgc3VwcG9y
dCBmcm9tIFdURiBpbnN0ZWFkIG9mIGJhc2Ugc2luY2UgVjhCaW5kaW5ncwotLy8gICAgIGRvZXMg
bm90IGRlcGVuZCBvbiBiYXNlLiBXZSBmdXJ0aGVyIGFzc3VtZSB0aGF0IGFsbCBjaGlsZCB0aHJl
YWRzCi0vLyAgICAgcnVubmluZyBWOCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYnkgV1RGIGFuZCB0
aHVzIGEgZGVzdHJ1Y3RvciB3aWxsCi0vLyAgICAgYmUgY2FsbGVkIHRvIGNsZWFuIHVwIGFsbCB0
aHJlYWQgc3BlY2lmaWMgZGF0YS4pCi0vLyAyLiBXaGVuIEdDIGhhcHBlbnM6Ci0vLyAgICAyLjEu
IElmIHRoZSBkZWFkIG9iamVjdCBpcyBpbiBHQyB0aHJlYWQncyBtYXAsIHJlbW92ZSB0aGUgSlMg
cmVmZXJlbmNlCi0vLyAgICAgICAgIGFuZCBkZXJlZiB0aGUgRE9NIG9iamVjdC4KLS8vICAgIDIu
Mi4gT3RoZXJ3aXNlLCBnbyB0aHJvdWdoIGFsbCB0aHJlYWQgbWFwcyB0byBmaW5kIHRoZSBvd25p
bmcgdGhyZWFkLgotLy8gICAgICAgICBSZW1vdmUgdGhlIEpTIHJlZmVyZW5jZSBmcm9tIHRoZSBv
d25pbmcgdGhyZWFkJ3MgbWFwIGFuZCBtb3ZlIHRoZQotLy8gICAgICAgICBET00gb2JqZWN0IHRv
IGEgZGVsYXllZCBxdWV1ZS4gUG9zdCBhIHRhc2sgdG8gdGhlIG93bmluZyB0aHJlYWQKLS8vICAg
ICAgICAgdG8gaGF2ZSBpdCBkZXJlZi1lZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkIGF0IGxhdGVy
IHRpbWUuCi0vLyAzLiBXaGVuIGEgdGhyZWFkIGlzIHRlYXJpbmcgZG93biwgaW52b2tlIGEgY2xl
YW51cCByb3V0aW5lIHRvIGdvIHRocm91Z2gKLS8vICAgIGFsbCBvYmplY3RzIGluIHRoZSBkZWxh
eWVkIHF1ZXVlIGFuZCB0aGUgdGhyZWFkIG1hcCBhbmQgZGVyZWYgYWxsIG9mCi0vLyAgICB0aGVt
LgotCi1zdGF0aWMgdm9pZCB3ZWFrTm9kZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1
ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7Ci1zdGF0aWMgdm9pZCB3ZWFrRE9NT2JqZWN0
Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2Jq
ZWN0KTsKLXZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4
OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7Ci0jaWYgRU5BQkxFKFNWRykKLXN0
YXRpYyB2b2lkIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2
ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwotLy8gU1ZHIG5vbi1ub2RlIGVs
ZW1lbnRzIG1heSBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgY29udGV4dCBub2RlIHdoaWNoIHNob3Vs
ZCBiZSBub3RpZmllZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNoYW5nZS4KLXN0YXRpYyB2b2lkIHdl
YWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4g
djhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7Ci0jZW5kaWYKLQotY2xhc3MgRE9NRGF0YTsKLWNs
YXNzIERPTURhdGFTdG9yZTsKLXR5cGVkZWYgV1RGOjpWZWN0b3I8RE9NRGF0YVN0b3JlKj4gRE9N
RGF0YUxpc3Q7Ci0KLS8vIERPTURhdGFTdG9yZQotLy8KLS8vIERPTURhdGFTdG9yZSBpcyB0aGUg
YmFja2luZyBzdG9yZSB0aGF0IGhvbGRzIHRoZSBtYXBzIGJldHdlZW4gRE9NIG9iamVjdHMKLS8v
IGFuZCBKYXZhU2NyaXB0IG9iamVjdHMuICBJbiBnZW5lcmFsLCBlYWNoIHRocmVhZCBjYW4gaGF2
ZSBtdWx0aXBsZSBiYWNraW5nCi0vLyBzdG9yZXMsIG9uZSBwZXIgaXNvbGF0ZWQgd29ybGQuCi0v
LwotLy8gVGhpcyBjbGFzcyBkb2Vzbid0IG1hbmFnZSB0aGUgbGlmZXRpbWUgb2YgdGhlIHN0b3Jl
LiAgVGhlIGRhdGEgc3RvcmUKLS8vIGxpZmV0aW1lIGlzIG1hbmFnZWQgYnkgc3ViY2xhc3Nlcy4K
LS8vCi1jbGFzcyBET01EYXRhU3RvcmUgOiBwdWJsaWMgTm9uY29weWFibGUgewotcHVibGljOgot
ICAgIGVudW0gRE9NV3JhcHBlck1hcFR5cGUgewotICAgICAgICBET01Ob2RlTWFwLAotICAgICAg
ICBET01PYmplY3RNYXAsCi0gICAgICAgIEFjdGl2ZURPTU9iamVjdE1hcCwKLSNpZiBFTkFCTEUo
U1ZHKQotICAgICAgICBET01TVkdFbGVtZW50SW5zdGFuY2VNYXAsCi0gICAgICAgIERPTVNWR09i
amVjdFdpdGhDb250ZXh0TWFwCi0jZW5kaWYKLSAgICB9OwotCi0gICAgdGVtcGxhdGUgPGNsYXNz
IEtleVR5cGU+Ci0gICAgY2xhc3MgSW50ZXJuYWxET01XcmFwcGVyTWFwIDogcHVibGljIERPTVdy
YXBwZXJNYXA8S2V5VHlwZT4gewotICAgIHB1YmxpYzoKLSAgICAgICAgSW50ZXJuYWxET01XcmFw
cGVyTWFwKERPTURhdGEqIGRvbURhdGEsIHY4OjpXZWFrUmVmZXJlbmNlQ2FsbGJhY2sgY2FsbGJh
Y2spCi0gICAgICAgICAgICA6IERPTVdyYXBwZXJNYXA8S2V5VHlwZT4oY2FsbGJhY2spCi0gICAg
ICAgICAgICAsIG1fZG9tRGF0YShkb21EYXRhKSB7IH0KLQotICAgICAgICB2aXJ0dWFsIHZvaWQg
Zm9yZ2V0KEtleVR5cGUqKTsKLQotICAgICAgICB2b2lkIGZvcmdldE9ubHkoS2V5VHlwZSogb2Jq
ZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBET01XcmFwcGVyTWFwPEtleVR5cGU+Ojpmb3Jn
ZXQob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgRE9NRGF0YSog
bV9kb21EYXRhOwotICAgIH07Ci0KLSAgICAvLyBBIGxpc3Qgb2YgYWxsIERPTURhdGFTdG9yZSBv
YmplY3RzLiAgVHJhdmVyc2VkIGR1cmluZyBHQyB0byBmaW5kIGEgdGhyZWFkLXNwZWNpZmljIG1h
cCB0aGF0Ci0gICAgLy8gY29udGFpbnMgdGhlIG9iamVjdCAtIHNvIHdlIGNhbiBzY2hlZHVsZSB0
aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWQgb24gdGhlIHRocmVhZCB3aGljaCBjcmVhdGVkIGl0Lgot
ICAgIHN0YXRpYyBET01EYXRhTGlzdCYgYWxsU3RvcmVzKCkKLSAgICB7Ci0gICAgICAgIERFRklO
RV9TVEFUSUNfTE9DQUwoRE9NRGF0YUxpc3QsIHN0YXRpY0RPTURhdGFMaXN0LCAoKSk7Ci0gICAg
ICAgIHJldHVybiBzdGF0aWNET01EYXRhTGlzdDsKLSAgICB9Ci0KLSAgICAvLyBNdXRleCB0byBw
cm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3Mgb2YgRE9NRGF0YUxpc3QuCi0gICAgc3Rh
dGljIFdURjo6TXV0ZXgmIGFsbFN0b3Jlc011dGV4KCkKLSAgICB7Ci0gICAgICAgIERFRklORV9T
VEFUSUNfTE9DQUwoV1RGOjpNdXRleCwgc3RhdGljRE9NRGF0YUxpc3RNdXRleCwgKCkpOwotICAg
ICAgICByZXR1cm4gc3RhdGljRE9NRGF0YUxpc3RNdXRleDsKLSAgICB9Ci0KLSAgICBET01EYXRh
U3RvcmUoRE9NRGF0YSogZG9tRGF0YSk7Ci0gICAgdmlydHVhbCB+RE9NRGF0YVN0b3JlKCk7Ci0K
LSAgICBET01EYXRhKiBkb21EYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kb21EYXRhOyB9Ci0KLSAg
ICB2b2lkKiBnZXRET01XcmFwcGVyTWFwKERPTVdyYXBwZXJNYXBUeXBlIHR5cGUpCi0gICAgewot
ICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBET01Ob2RlTWFwOgotICAgICAg
ICAgICAgcmV0dXJuIG1fZG9tTm9kZU1hcDsKLSAgICAgICAgY2FzZSBET01PYmplY3RNYXA6Ci0g
ICAgICAgICAgICByZXR1cm4gbV9kb21PYmplY3RNYXA7Ci0gICAgICAgIGNhc2UgQWN0aXZlRE9N
T2JqZWN0TWFwOgotICAgICAgICAgICAgcmV0dXJuIG1fYWN0aXZlRG9tT2JqZWN0TWFwOwotI2lm
IEVOQUJMRShTVkcpCi0gICAgICAgIGNhc2UgRE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwOgotICAg
ICAgICAgICAgcmV0dXJuIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOwotICAgICAgICBjYXNl
IERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwOgotICAgICAgICAgICAgcmV0dXJuIG1fZG9tU3Zn
T2JqZWN0V2l0aENvbnRleHRNYXA7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBJbnRlcm5h
bERPTVdyYXBwZXJNYXA8Tm9kZT4mIGRvbU5vZGVNYXAoKSB7IHJldHVybiAqbV9kb21Ob2RlTWFw
OyB9Ci0gICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+JiBkb21PYmplY3RNYXAoKSB7IHJl
dHVybiAqbV9kb21PYmplY3RNYXA7IH0KLSAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4m
IGFjdGl2ZURvbU9iamVjdE1hcCgpIHsgcmV0dXJuICptX2FjdGl2ZURvbU9iamVjdE1hcDsgfQot
I2lmIEVOQUJMRShTVkcpCi0gICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0
YW5jZT4mIGRvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgpIHsgcmV0dXJuICptX2RvbVN2Z0VsZW1l
bnRJbnN0YW5jZU1hcDsgfQotICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgZG9tU3Zn
T2JqZWN0V2l0aENvbnRleHRNYXAoKSB7IHJldHVybiAqbV9kb21TdmdPYmplY3RXaXRoQ29udGV4
dE1hcDsgfQotI2VuZGlmCi0KLXByb3RlY3RlZDoKLSAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8
Tm9kZT4qIG1fZG9tTm9kZU1hcDsKLSAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4qIG1f
ZG9tT2JqZWN0TWFwOwotICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiogbV9hY3RpdmVE
b21PYmplY3RNYXA7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8
U1ZHRWxlbWVudEluc3RhbmNlPiogbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXA7Ci0gICAgSW50
ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KiBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOwot
I2VuZGlmCi0KLXByaXZhdGU6Ci0gICAgLy8gQSBiYWNrLXBvaW50ZXIgdG8gdGhlIERPTURhdGEg
dG8gd2hpY2ggd2UgYmVsb25nLgotICAgIERPTURhdGEqIG1fZG9tRGF0YTsKLX07Ci0KLS8vIFNj
b3BlZERPTURhdGFTdG9yZQotLy8KLS8vIFNjb3BlZERPTURhdGFTdG9yZSBpcyBhIERPTURhdGFT
dG9yZSB0aGF0IGNvbnRyb2xzIGxpbWl0cyB0aGUgbGlmZXRpbWUgb2YKLS8vIHRoZSBzdG9yZSB0
byB0aGUgbGlmZXRpbWUgb2YgdGhlIG9iamVjdCBpdHNlbGYuICBJbiBvdGhlciB3b3Jkcywgd2hl
biB0aGUKLS8vIFNjb3BlZERPTURhdGFTdG9yZSBvYmplY3QgaXMgZGVhbGxvY2F0ZWQsIHRoZSBt
YXBzIHRoYXQgYmVsb25nIHRvIHRoZSBzdG9yZQotLy8gYXJlIGRlYWxsb2NhdGVkIGFzIHdlbGwu
Ci0vLwotY2xhc3MgU2NvcGVkRE9NRGF0YVN0b3JlIDogcHVibGljIERPTURhdGFTdG9yZSB7Ci1w
dWJsaWM6Ci0gICAgU2NvcGVkRE9NRGF0YVN0b3JlKERPTURhdGEqIGRvbURhdGEpIDogRE9NRGF0
YVN0b3JlKGRvbURhdGEpCi0gICAgewotICAgICAgICBtX2RvbU5vZGVNYXAgPSBuZXcgSW50ZXJu
YWxET01XcmFwcGVyTWFwPE5vZGU+KGRvbURhdGEsIHdlYWtOb2RlQ2FsbGJhY2spOwotICAgICAg
ICBtX2RvbU9iamVjdE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4oZG9tRGF0
YSwgd2Vha0RPTU9iamVjdENhbGxiYWNrKTsKLSAgICAgICAgbV9hY3RpdmVEb21PYmplY3RNYXAg
PSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KGRvbURhdGEsIHdlYWtBY3RpdmVET01P
YmplY3RDYWxsYmFjayk7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgbV9kb21TdmdFbGVtZW50
SW5zdGFuY2VNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5j
ZT4oZG9tRGF0YSwgd2Vha1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNrKTsKLSAgICAgICAgbV9k
b21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9p
ZD4oZG9tRGF0YSwgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2spOwotI2VuZGlmCi0g
ICAgfQotCi0gICAgLy8gVGhpcyBjYW4gYmUgY2FsbGVkIHdoZW4gV1RGIHRocmVhZCBpcyB0ZWFy
aW5nIGRvd24uCi0gICAgLy8gV2UgYXNzdW1lIHRoYXQgYWxsIGNoaWxkIHRocmVhZHMgcnVubmlu
ZyBWOCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYnkgV1RGLgotICAgIHZpcnR1YWwgflNjb3BlZERP
TURhdGFTdG9yZSgpCi0gICAgewotICAgICAgICBkZWxldGUgbV9kb21Ob2RlTWFwOwotICAgICAg
ICBkZWxldGUgbV9kb21PYmplY3RNYXA7Ci0gICAgICAgIGRlbGV0ZSBtX2FjdGl2ZURvbU9iamVj
dE1hcDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICBkZWxldGUgbV9kb21TdmdFbGVtZW50SW5z
dGFuY2VNYXA7Ci0gICAgICAgIGRlbGV0ZSBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOwot
I2VuZGlmCi0gICAgfQotfTsKLQotLy8gU3RhdGljRE9NRGF0YVN0b3JlCi0vLwotLy8gU3RhdGlj
RE9NRGF0YVN0b3JlIGlzIGEgRE9NRGF0YVN0b3JlIHRoYXQgbWFuYWdlcyB0aGUgbGlmZXRpbWUg
b2YgdGhlIHN0b3JlCi0vLyBzdGF0aWNhbGx5LiAgVGhpcyBlbmNhcHN1bGF0ZXMgdGhyZWFkLXNw
ZWNpZmljIERPTSBkYXRhIGZvciB0aGUgbWFpbgotLy8gdGhyZWFkLiAgQWxsIHRoZSBtYXBzIGlu
IGl0IGFyZSBzdGF0aWMuICBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIHVuYWJsZSB0bwotLy8gcmVs
eSBvbiBXVEY6OlRocmVhZFNwZWNpZmljVGhyZWFkRXhpdCB0byBkbyB0aGUgY2xlYW51cCBzaW5j
ZSB0aGUgcGxhY2UgdGhhdAotLy8gdGVhcnMgZG93biB0aGUgbWFpbiB0aHJlYWQgY2FuIG5vdCBj
YWxsIGFueSBXVEYgZnVuY3Rpb25zLgotY2xhc3MgU3RhdGljRE9NRGF0YVN0b3JlIDogcHVibGlj
IERPTURhdGFTdG9yZSB7Ci1wdWJsaWM6Ci0gICAgU3RhdGljRE9NRGF0YVN0b3JlKERPTURhdGEq
IGRvbURhdGEpCi0gICAgICAgIDogRE9NRGF0YVN0b3JlKGRvbURhdGEpCi0gICAgICAgICwgbV9z
dGF0aWNEb21Ob2RlTWFwKGRvbURhdGEsIHdlYWtOb2RlQ2FsbGJhY2spCi0gICAgICAgICwgbV9z
dGF0aWNEb21PYmplY3RNYXAoZG9tRGF0YSwgd2Vha0RPTU9iamVjdENhbGxiYWNrKQotICAgICAg
ICAsIG1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwKGRvbURhdGEsIHdlYWtBY3RpdmVET01PYmpl
Y3RDYWxsYmFjaykKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAsIG1fc3RhdGljRG9tU3ZnRWxl
bWVudEluc3RhbmNlTWFwKGRvbURhdGEsIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjaykK
LSAgICAgICAgLCBtX3N0YXRpY0RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwKGRvbURhdGEsIHdl
YWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKQotI2VuZGlmCi0gICAgewotICAgICAgICBt
X2RvbU5vZGVNYXAgPSAmbV9zdGF0aWNEb21Ob2RlTWFwOwotICAgICAgICBtX2RvbU9iamVjdE1h
cCA9ICZtX3N0YXRpY0RvbU9iamVjdE1hcDsKLSAgICAgICAgbV9hY3RpdmVEb21PYmplY3RNYXAg
PSAmbV9zdGF0aWNBY3RpdmVEb21PYmplY3RNYXA7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAg
bV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXAgPSAmbV9zdGF0aWNEb21TdmdFbGVtZW50SW5zdGFu
Y2VNYXA7Ci0gICAgICAgIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAgPSAmbV9zdGF0aWNE
b21TdmdPYmplY3RXaXRoQ29udGV4dE1hcDsKLSNlbmRpZgotICAgIH0KLQotcHJpdmF0ZToKLSAg
ICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8Tm9kZT4gbV9zdGF0aWNEb21Ob2RlTWFwOwotICAgIElu
dGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiBtX3N0YXRpY0RvbU9iamVjdE1hcDsKLSAgICBJbnRl
cm5hbERPTVdyYXBwZXJNYXA8dm9pZD4gbV9zdGF0aWNBY3RpdmVEb21PYmplY3RNYXA7Ci0gICAg
SW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4gbV9zdGF0aWNEb21TdmdF
bGVtZW50SW5zdGFuY2VNYXA7Ci0gICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+IG1fc3Rh
dGljRG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7Ci19OwotCi10eXBlZGVmIFdURjo6VmVjdG9y
PERPTURhdGFTdG9yZSo+IERPTURhdGFTdG9yZUxpc3Q7Ci0KLS8vIERPTURhdGEKLS8vCi0vLyBE
T01EYXRhIHJlcHJlc2VudHMgdGhlIGFsbCB0aGUgRE9NIHdyYXBwZXJzIGZvciBhIGdpdmVuIHRo
cmVhZC4gIEluCi0vLyBwYXJ0aWN1bGFyLCBET01EYXRhIGhvbGRzIHdyYXBwZXJzIGZvciBhbGwg
dGhlIGlzb2xhdGVkIHdvcmxkcyBpbiB0aGUKLS8vIHRocmVhZC4gIFRoZSBET01EYXRhIGZvciB0
aGUgbWFpbiB0aHJlYWQgYW5kIHRoZSBET01EYXRhIGZvciBjaGlsZCB0aHJlYWRzCi0vLyB1c2Ug
ZGlmZmVyZW50IHN1YmNsYXNzZXMuCi0vLwotY2xhc3MgRE9NRGF0YTogcHVibGljIE5vbmNvcHlh
YmxlIHsKLXB1YmxpYzoKLSAgICBET01EYXRhKCkKLSAgICAgICAgOiBtX2RlbGF5ZWRQcm9jZXNz
aW5nU2NoZWR1bGVkKGZhbHNlKQotICAgICAgICAsIG1faXNNYWluVGhyZWFkKFdURjo6aXNNYWlu
VGhyZWFkKCkpCi0gICAgICAgICwgbV9vd25pbmdUaHJlYWQoV1RGOjpjdXJyZW50VGhyZWFkKCkp
Ci0gICAgewotICAgIH0KLQotICAgIHN0YXRpYyBET01EYXRhKiBnZXRDdXJyZW50KCk7Ci0gICAg
c3RhdGljIERPTURhdGEqIGdldEN1cnJlbnRNYWluVGhyZWFkKCk7IC8vIENhbGxlciBtdXN0IGJl
IG9uIHRoZSBtYWluIHRocmVhZC4KLSAgICB2aXJ0dWFsIERPTURhdGFTdG9yZSYgZ2V0U3RvcmUo
KSA9IDA7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXRpYyB2b2lkIGhhbmRs
ZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpET01XcmFwcGVyTWFwVHlwZSBtYXBUeXBlLCB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IHY4T2JqZWN0LCBUKiBkb21PYmplY3QpOwotCi0gICAgdm9pZCBm
b3JnZXREZWxheWVkT2JqZWN0KHZvaWQqIG9iamVjdCkgeyBtX2RlbGF5ZWRPYmplY3RNYXAudGFr
ZShvYmplY3QpOyB9Ci0KLSAgICAvLyBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHdlIHdpbGwgZGVy
ZWYgRE9NIG9iamVjdHMgZnJvbSB0aGUgb3duaW5nIHRocmVhZCwKLSAgICAvLyBub3QgdGhlIEdD
IHRocmVhZC4gIFRoZSBoZWxwZXIgZnVuY3Rpb24gd2lsbCBiZSBzY2hlZHVsZWQgYnkgdGhlIEdD
Ci0gICAgLy8gdGhyZWFkIHRvIGdldCBjYWxsZWQgZnJvbSB0aGUgb3duaW5nIHRocmVhZC4KLSAg
ICBzdGF0aWMgdm9pZCBkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkKHZvaWQqKTsK
LSAgICB2b2lkIGRlcmVmRGVsYXllZE9iamVjdHMoKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1l
IFQ+Ci0gICAgc3RhdGljIHZvaWQgcmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFwKERPTVdyYXBw
ZXJNYXA8VD4mIGRvbU1hcCk7Ci0KLSAgICBUaHJlYWRJZGVudGlmaWVyIG93bmluZ1RocmVhZCgp
IGNvbnN0IHsgcmV0dXJuIG1fb3duaW5nVGhyZWFkOyB9Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRl
ZiBXVEY6Okhhc2hNYXA8dm9pZCosIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZT4gRGVsYXll
ZE9iamVjdE1hcDsKLQotICAgIHZvaWQgZW5zdXJlRGVyZWYoVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCk7Ci0gICAgc3RhdGljIHZvaWQgZGVyZWZPYmpl
Y3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCk7Ci0K
LSAgICAvLyBTdG9yZXMgYWxsIHRoZSBET00gb2JqZWN0cyB0aGF0IGFyZSBkZWxheWVkIHRvIGJl
IHByb2Nlc3NlZCB3aGVuIHRoZSBvd25pbmcgdGhyZWFkIGdhaW5zIGNvbnRyb2wuCi0gICAgRGVs
YXllZE9iamVjdE1hcCBtX2RlbGF5ZWRPYmplY3RNYXA7Ci0KLSAgICAvLyBUaGUgZmxhZyB0byBp
bmRpY2F0ZSBpZiB0aGUgdGFzayB0byBkbyB0aGUgZGVsYXllZCBwcm9jZXNzIGhhcyBhbHJlYWR5
IGJlZW4gcG9zdGVkLgotICAgIGJvb2wgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZDsKLQot
ICAgIGJvb2wgbV9pc01haW5UaHJlYWQ7Ci0gICAgVGhyZWFkSWRlbnRpZmllciBtX293bmluZ1Ro
cmVhZDsKLX07Ci0KLWNsYXNzIE1haW5UaHJlYWRET01EYXRhIDogcHVibGljIERPTURhdGEgewot
cHVibGljOgotICAgIE1haW5UaHJlYWRET01EYXRhKCkgOiBtX2RlZmF1bHRTdG9yZSh0aGlzKSB7
IH0KLQotICAgIERPTURhdGFTdG9yZSYgZ2V0U3RvcmUoKQotICAgIHsKLSAgICAgICAgQVNTRVJU
KFdURjo6aXNNYWluVGhyZWFkKCkpOwotICAgICAgICBWOElzb2xhdGVkV29ybGQqIHdvcmxkID0g
VjhJc29sYXRlZFdvcmxkOjpnZXRFbnRlcmVkKCk7Ci0gICAgICAgIGlmICh3b3JsZCkKLSAgICAg
ICAgICAgIHJldHVybiAqd29ybGQtPmdldERPTURhdGFTdG9yZSgpOwotICAgICAgICByZXR1cm4g
bV9kZWZhdWx0U3RvcmU7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFN0YXRpY0RPTURhdGFTdG9y
ZSBtX2RlZmF1bHRTdG9yZTsKLSAgICAvLyBOb3RlOiBUaGUgRE9NRGF0YVN0b3JlcyBmb3IgaXNv
bGF0ZWQgd29ybGQgYXJlIG93bmVkIGJ5IHRoZSB3b3JsZCBvYmplY3QuCi19OwotCi1jbGFzcyBD
aGlsZFRocmVhZERPTURhdGEgOiBwdWJsaWMgRE9NRGF0YSB7Ci1wdWJsaWM6Ci0gICAgQ2hpbGRU
aHJlYWRET01EYXRhKCkgOiBtX2RlZmF1bHRTdG9yZSh0aGlzKSB7IH0KLQotICAgIERPTURhdGFT
dG9yZSYgZ2V0U3RvcmUoKSB7Ci0gICAgICAgIEFTU0VSVCghV1RGOjppc01haW5UaHJlYWQoKSk7
Ci0gICAgICAgIC8vIEN1cnJlbnRseSwgY2hpbGQgdGhyZWFkcyBoYXZlIG9ubHkgb25lIHdvcmxk
LgotICAgICAgICByZXR1cm4gbV9kZWZhdWx0U3RvcmU7Ci0gICAgfQotCi1wcml2YXRlOgotICAg
IFNjb3BlZERPTURhdGFTdG9yZSBtX2RlZmF1bHRTdG9yZTsKLX07Ci0KLURPTURhdGFTdG9yZTo6
RE9NRGF0YVN0b3JlKERPTURhdGEqIGRvbURhdGEpCi0gICAgOiBtX2RvbU5vZGVNYXAoMCkKLSAg
ICAsIG1fZG9tT2JqZWN0TWFwKDApCi0gICAgLCBtX2FjdGl2ZURvbU9iamVjdE1hcCgwKQotI2lm
IEVOQUJMRShTVkcpCi0gICAgLCBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgwKQotICAgICwg
bV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCgwKQotI2VuZGlmCi0gICAgLCBtX2RvbURhdGEo
ZG9tRGF0YSkKLXsKLSAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihET01EYXRhU3RvcmU6OmFs
bFN0b3Jlc011dGV4KCkpOwotICAgIERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCkuYXBwZW5kKHRo
aXMpOwotfQotCi1ET01EYXRhU3RvcmU6On5ET01EYXRhU3RvcmUoKQotewotICAgIFdURjo6TXV0
ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7Ci0gICAgRE9N
RGF0YVN0b3JlOjphbGxTdG9yZXMoKS5yZW1vdmUoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKS5m
aW5kKHRoaXMpKTsKLX0KLQogRE9NRGF0YVN0b3JlSGFuZGxlOjpET01EYXRhU3RvcmVIYW5kbGUo
KQogICAgIDogbV9zdG9yZShuZXcgU2NvcGVkRE9NRGF0YVN0b3JlKERPTURhdGE6OmdldEN1cnJl
bnQoKSkpCiB7CkBAIC0zOTMsMTMgKzQ3LDYgQEAgRE9NRGF0YVN0b3JlSGFuZGxlOjp+RE9NRGF0
YVN0b3JlSGFuZGxlKAogewogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZT4KLXZvaWQgRE9N
RGF0YVN0b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8S2V5VHlwZT46OmZvcmdldChLZXlUeXBl
KiBvYmplY3QpCi17Ci0gICAgRE9NV3JhcHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7
Ci0gICAgbV9kb21EYXRhLT5mb3JnZXREZWxheWVkT2JqZWN0KG9iamVjdCk7Ci19Ci0KIERPTVdy
YXBwZXJNYXA8Tm9kZT4mIGdldERPTU5vZGVNYXAoKQogewogICAgIC8vIE5vZGVzIG9ubHkgZXhp
c3Qgb24gdGhlIG1haW4gdGhyZWFkLgpAQCAtNDMxLDE3NCArNzgsNiBAQCBET01XcmFwcGVyTWFw
PHZvaWQ+JiBnZXRET01TVkdPYmplY3RXaXRoCiAKICNlbmRpZiAvLyBFTkFCTEUoU1ZHKQogCi1E
T01EYXRhKiBET01EYXRhOjpnZXRDdXJyZW50KCkKLXsKLSAgICBpZiAoV1RGOjppc01haW5UaHJl
YWQoKSkKLSAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRNYWluVGhyZWFkKCk7Ci0KLSAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKFdURjo6VGhyZWFkU3BlY2lmaWM8Q2hpbGRUaHJlYWRET01EYXRhPiwg
Y2hpbGRUaHJlYWRET01EYXRhLCAoKSk7Ci0gICAgcmV0dXJuIGNoaWxkVGhyZWFkRE9NRGF0YTsK
LX0KLQotRE9NRGF0YSogRE9NRGF0YTo6Z2V0Q3VycmVudE1haW5UaHJlYWQoKQotewotICAgIEFT
U0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKE1haW5U
aHJlYWRET01EYXRhLCBtYWluVGhyZWFkRE9NRGF0YSwgKCkpOwotICAgIHJldHVybiAmbWFpblRo
cmVhZERPTURhdGE7Ci19Ci0KLS8vIENhbGxlZCB3aGVuIHRoZSBkZWFkIG9iamVjdCBpcyBub3Qg
aW4gR0MgdGhyZWFkJ3MgbWFwLiBHbyB0aHJvdWdoIGFsbCB0aHJlYWQgbWFwcyB0byBmaW5kIHRo
ZSBvbmUgY29udGFpbmluZyBpdC4KLS8vIFRoZW4gY2xlYXIgdGhlIEpTIHJlZmVyZW5jZSBhbmQg
cHVzaCB0aGUgRE9NIG9iamVjdCBpbnRvIHRoZSBkZWxheWVkIHF1ZXVlIGZvciBpdCB0byBiZSBk
ZXJlZi1lZCBhdCBsYXRlciB0aW1lIGZyb20gdGhlIG93bmluZyB0aHJlYWQuCi0vLyAqIFRoaXMg
aXMgY2FsbGVkIHdoZW4gdGhlIEdDIHRocmVhZCBpcyBub3QgdGhlIG93bmluZyB0aHJlYWQuCi0v
LyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkIHRoYXQgaGFzIEdDIHJ1bm5pbmcu
Ci0vLyAqIE9ubHkgb25lIFY4IGluc3RhbmNlIGlzIHJ1bm5pbmcgYXQgYSB0aW1lIGR1ZSB0byBW
ODo6TG9ja2VyLiBTbyB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGNvbmN1cnJlbmN5Lgot
dGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01E
YXRhU3RvcmU6OkRPTVdyYXBwZXJNYXBUeXBlIG1hcFR5cGUsIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gdjhPYmplY3QsIFQqIGRvbU9iamVjdCkKLXsKLQotICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9j
a2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7Ci0gICAgRE9NRGF0YUxpc3QmIGxp
c3QgPSBET01EYXRhU3RvcmU6OmFsbFN0b3JlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbGlzdC5zaXplKCk7ICsraSkgewotICAgICAgICBET01EYXRhU3RvcmUqIHN0b3JlID0gbGlz
dFtpXTsKLQotICAgICAgICBET01EYXRhU3RvcmU6OkludGVybmFsRE9NV3JhcHBlck1hcDxUPiog
ZG9tTWFwID0gc3RhdGljX2Nhc3Q8RE9NRGF0YVN0b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8
VD4qPihzdG9yZS0+Z2V0RE9NV3JhcHBlck1hcChtYXBUeXBlKSk7Ci0KLSAgICAgICAgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gZG9tTWFwLT5nZXQoZG9tT2JqZWN0KTsKLSAgICAg
ICAgaWYgKCp3cmFwcGVyID09ICp2OE9iamVjdCkgewotICAgICAgICAgICAgLy8gQ2xlYXIgdGhl
IEpTIHJlZmVyZW5jZS4KLSAgICAgICAgICAgIGRvbU1hcC0+Zm9yZ2V0T25seShkb21PYmplY3Qp
OwotICAgICAgICAgICAgc3RvcmUtPmRvbURhdGEoKS0+ZW5zdXJlRGVyZWYoVjhET01XcmFwcGVy
Ojpkb21XcmFwcGVyVHlwZSh2OE9iamVjdCksIGRvbU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9
Ci19Ci0KLXZvaWQgRE9NRGF0YTo6ZW5zdXJlRGVyZWYoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJU
eXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCkKLXsKLSAgICBpZiAobV9vd25pbmdUaHJlYWQgPT0g
V1RGOjpjdXJyZW50VGhyZWFkKCkpIHsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBkZWxheSB0aGUg
d29yay4gIFdlIGNhbiBkZXJlZiByaWdodCBub3cuCi0gICAgICAgIGRlcmVmT2JqZWN0KHR5cGUs
IGRvbU9iamVjdCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBXZSBuZWVkIHRv
IGRvIHRoZSBkZXJlZiBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCi0gICAgbV9kZWxheWVkT2JqZWN0
TWFwLnNldChkb21PYmplY3QsIHR5cGUpOwotCi0gICAgLy8gUG9zdCBhIHRhc2sgdG8gdGhlIG93
bmluZyB0aHJlYWQgaW4gb3JkZXIgdG8gcHJvY2VzcyB0aGUgZGVsYXllZCBxdWV1ZS4KLSAgICAv
LyBGSVhNRTogRm9yIG5vdywgd2UgY2FuIG9ubHkgcG9zdCB0byBtYWluIHRocmVhZCBkdWUgdG8g
V1RGIHRhc2sgcG9zdGluZyBsaW1pdGF0aW9uLiBXZSB3aWxsIGZpeCB0aGlzIHdoZW4gd2Ugd29y
ayBvbiBuZXN0ZWQgd29ya2VyLgotICAgIGlmICghbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxl
ZCkgewotICAgICAgICBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkID0gdHJ1ZTsKLSAgICAg
ICAgaWYgKGlzTWFpblRocmVhZCgpKQotICAgICAgICAgICAgV1RGOjpjYWxsT25NYWluVGhyZWFk
KCZkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkLCAwKTsKLSAgICB9Ci19Ci0KLS8v
IENhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgbmVhciBkZWF0aCAobm90IHJlYWNoYWJsZSBmcm9t
IEpTIHJvb3RzKS4KLS8vIEl0IGlzIHRpbWUgdG8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0
YWJsZSBhbmQgZGlzcG9zZSB0aGUgaGFuZGxlLgotc3RhdGljIHZvaWQgd2Vha0RPTU9iamVjdENh
bGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVj
dCkKLXsKLSAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7Ci0gICAgQVNTRVJUKHY4T2JqZWN0LT5J
c09iamVjdCgpKTsKLSAgICBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6
RE9NT2JqZWN0TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgZG9t
T2JqZWN0KTsKLX0KLQotdm9pZCB3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBlcnNp
c3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQotewotICAgIHY4OjpI
YW5kbGVTY29wZSBzY29wZTsKLSAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwotICAg
IERPTURhdGE6OmhhbmRsZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpBY3RpdmVET01PYmplY3RN
YXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBkb21PYmplY3QpOwot
fQotCi1zdGF0aWMgdm9pZCB3ZWFrTm9kZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1
ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKLXsKLSAgICB2ODo6SGFuZGxlU2NvcGUgc2Nv
cGU7Ci0gICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKLSAgICBET01EYXRhOjpoYW5k
bGVXZWFrT2JqZWN0PE5vZGU+KERPTURhdGFTdG9yZTo6RE9NTm9kZU1hcCwgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCksIHN0YXRpY19jYXN0PE5vZGUqPihkb21PYmplY3Qp
KTsKLX0KLQotI2lmIEVOQUJMRShTVkcpCi0KLXN0YXRpYyB2b2lkIHdlYWtTVkdFbGVtZW50SW5z
dGFuY2VDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBk
b21PYmplY3QpCi17Ci0gICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwotICAgIEFTU0VSVCh2OE9i
amVjdC0+SXNPYmplY3QoKSk7Ci0gICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRh
U3RvcmU6OkRPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6
Q2FzdCh2OE9iamVjdCksIHN0YXRpY19jYXN0PFNWR0VsZW1lbnRJbnN0YW5jZSo+KGRvbU9iamVj
dCkpOwotfQotCi1zdGF0aWMgdm9pZCB3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjayh2
ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCi17Ci0g
ICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwotICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3Qo
KSk7Ci0gICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkRPTVNWR09i
amVjdFdpdGhDb250ZXh0TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0
KSwgZG9tT2JqZWN0KTsKLX0KLQotI2VuZGlmICAvLyBFTkFCTEUoU1ZHKQotCi12b2lkIERPTURh
dGE6OmRlcmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBk
b21PYmplY3QpCi17Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBWOENsYXNzSW5kZXg6
Ok5PREU6Ci0gICAgICAgIHN0YXRpY19jYXN0PE5vZGUqPihkb21PYmplY3QpLT5kZXJlZigpOwot
ICAgICAgICBicmVhazsKLQotI2RlZmluZSBNYWtlQ2FzZSh0eXBlLCBuYW1lKSAgIFwKLSAgICAg
ICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3Qp
LT5kZXJlZigpOyBicmVhazsKLSAgICBET01fT0JKRUNUX1RZUEVTKE1ha2VDYXNlKSAgIC8vIFRo
aXMgaW5jbHVkZXMgYm90aCBhY3RpdmUgYW5kIG5vbi1hY3RpdmUuCi0jdW5kZWYgTWFrZUNhc2UK
LQotI2lmIEVOQUJMRShTVkcpCi0jZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgICBcCi0g
ICAgICAgIGNhc2UgVjhDbGFzc0luZGV4Ojp0eXBlOiBzdGF0aWNfY2FzdDxuYW1lKj4oZG9tT2Jq
ZWN0KS0+ZGVyZWYoKTsgYnJlYWs7Ci0gICAgU1ZHX09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkgICAv
LyBUaGlzIGFsc28gaW5jbHVkZXMgU1ZHRWxlbWVudEluc3RhbmNlLgotI3VuZGVmIE1ha2VDYXNl
Ci0KLSNkZWZpbmUgTWFrZUNhc2UodHlwZSwgbmFtZSkgICAgIFwKLSAgICAgICAgY2FzZSBWOENs
YXNzSW5kZXg6OnR5cGU6ICAgIFwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFY4U1ZHUE9EVHlw
ZVdyYXBwZXI8bmFtZT4qPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKLSAgICBTVkdfUE9E
X05BVElWRV9UWVBFUyhNYWtlQ2FzZSkKLSN1bmRlZiBNYWtlQ2FzZQotI2VuZGlmCi0KLSAgICBk
ZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgfQotfQotCi12b2lkIERPTURhdGE6OmRlcmVmRGVsYXllZE9iamVjdHMoKQotewotICAgIFdU
Rjo6TXV0ZXhMb2NrZXIgbG9ja2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7Ci0K
LSAgICBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkID0gZmFsc2U7Ci0KLSAgICBmb3IgKERl
bGF5ZWRPYmplY3RNYXA6Oml0ZXJhdG9yIGl0ZXIobV9kZWxheWVkT2JqZWN0TWFwLmJlZ2luKCkp
OyBpdGVyICE9IG1fZGVsYXllZE9iamVjdE1hcC5lbmQoKTsgKytpdGVyKQotICAgICAgICBkZXJl
Zk9iamVjdChpdGVyLT5zZWNvbmQsIGl0ZXItPmZpcnN0KTsKLQotICAgIG1fZGVsYXllZE9iamVj
dE1hcC5jbGVhcigpOwotfQotCi12b2lkIERPTURhdGE6OmRlcmVmRGVsYXllZE9iamVjdHNJbkN1
cnJlbnRUaHJlYWQodm9pZCopCi17Ci0gICAgZ2V0Q3VycmVudCgpLT5kZXJlZkRlbGF5ZWRPYmpl
Y3RzKCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIERPTURhdGE6OnJlbW92ZU9i
amVjdHNGcm9tV3JhcHBlck1hcChET01XcmFwcGVyTWFwPFQ+JiBkb21NYXApCi17Ci0gICAgZm9y
ICh0eXBlbmFtZSBXVEY6Okhhc2hNYXA8VCosIHY4OjpPYmplY3QqPjo6aXRlcmF0b3IgaXRlcihk
b21NYXAuaW1wbCgpLmJlZ2luKCkpOyBpdGVyICE9IGRvbU1hcC5pbXBsKCkuZW5kKCk7ICsraXRl
cikgewotICAgICAgICBUKiBkb21PYmplY3QgPSBzdGF0aWNfY2FzdDxUKj4oaXRlci0+Zmlyc3Qp
OwotICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB2OE9iamVjdChpdGVyLT5zZWNv
bmQpOwotCi0gICAgICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhET01X
cmFwcGVyOjpkb21XcmFwcGVyVHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2Jq
ZWN0KSk7Ci0KLSAgICAgICAgLy8gRGVyZWYgdGhlIERPTSBvYmplY3QuCi0gICAgICAgIGRlcmVm
T2JqZWN0KHR5cGUsIGRvbU9iamVjdCk7Ci0KLSAgICAgICAgLy8gQ2xlYXIgdGhlIEpTIHdyYXBw
ZXIuCi0gICAgICAgIHY4T2JqZWN0LkRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgZG9tTWFwLmltcGwo
KS5jbGVhcigpOwotfQotCiBzdGF0aWMgdm9pZCByZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50
VGhyZWFkSGVscGVyKCkKIHsKICAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33558</attachid>
            <date>2009-07-27 11:24:36 -0700</date>
            <delta_ts>2009-07-27 11:24:36 -0700</delta_ts>
            <desc>Patch with style feedback addressed</desc>
            <filename>bug-27685-20090727112434.patch</filename>
            <type>text/plain</type>
            <size>70003</size>
            <attacher name="Adam Barth">abarth</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0NjQxOSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjQgQEAKKzIwMDktMDctMjUgIEFkYW0gQmFydGggIDxhYmFydGhAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbVjhd
IFNwbGl0IHVwIFY4RE9NTWFwLmNwcCBieSBjbGFzcworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2ODUKKworICAgICAgICBObyBiZWhhdmlvciBjaGFu
Z2UuICBKdXN0IGNvcHktYW5kLXBhc3RlLgorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAg
ICAgICAqIGJpbmRpbmdzL3Y4L0NoaWxkVGhyZWFkRE9NRGF0YS5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6Q2hpbGRUaHJlYWRET01EYXRhOjpDaGlsZFRocmVhZERPTURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6Q2hpbGRUaHJlYWRET01EYXRhOjpnZXRTdG9yZSk6CisgICAgICAgICog
YmluZGluZ3MvdjgvQ2hpbGRUaHJlYWRET01EYXRhLmg6IEFkZGVkLgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L0RPTURhdGEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OkRP
TURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YTo6Z2V0Q3VycmVudCk6CisgICAgICAg
IChXZWJDb3JlOjpET01EYXRhOjpnZXRDdXJyZW50TWFpblRocmVhZCk6CisgICAgICAgIChXZWJD
b3JlOjpET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURh
dGE6OmVuc3VyZURlcmVmKToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OmRlcmVmT2JqZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGE6OmRlcmVmRGVsYXllZE9iamVjdHMpOgorICAg
ICAgICAoV2ViQ29yZTo6RE9NRGF0YTo6ZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVh
ZCk6CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhOjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJN
YXApOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RPTURhdGEuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjopOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L0RPTURhdGFTdG9yZS5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpET01EYXRhU3RvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjp+RE9NRGF0YVN0b3JlKToKKyAgICAgICAgKFdlYkNv
cmU6OkRPTURhdGFTdG9yZTo6YWxsU3RvcmVzKToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURhdGFT
dG9yZTo6YWxsU3RvcmVzTXV0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpn
ZXRET01XcmFwcGVyTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OmZvcmdldCk6CisgICAgICAgIChX
ZWJDb3JlOjpET01EYXRhU3RvcmU6OndlYWtET01PYmplY3RDYWxsYmFjayk6CisgICAgICAgIChX
ZWJDb3JlOjpET01EYXRhU3RvcmU6OndlYWtBY3RpdmVET01PYmplY3RDYWxsYmFjayk6CisgICAg
ICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OndlYWtOb2RlQ2FsbGJhY2spOgorICAgICAgICAo
V2ViQ29yZTo6RE9NRGF0YVN0b3JlOjp3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2spOgor
ICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjp3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRD
YWxsYmFjayk6CisgICAgICAgICogYmluZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmg6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6RE9N
RGF0YVN0b3JlOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA6OkludGVybmFsRE9NV3JhcHBlck1hcCk6
CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OkludGVybmFsRE9NV3JhcHBlck1hcDo6
Zm9yZ2V0T25seSk6CisgICAgICAgIChXZWJDb3JlOjpET01EYXRhU3RvcmU6OmRvbURhdGEpOgor
ICAgICAgICAoV2ViQ29yZTo6RE9NRGF0YVN0b3JlOjpkb21Ob2RlTWFwKToKKyAgICAgICAgKFdl
YkNvcmU6OkRPTURhdGFTdG9yZTo6ZG9tT2JqZWN0TWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkRP
TURhdGFTdG9yZTo6YWN0aXZlRG9tT2JqZWN0TWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkRPTURh
dGFTdG9yZTo6ZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkRP
TURhdGFTdG9yZTo6ZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXApOgorICAgICAgICAqIGJpbmRp
bmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpN
YWluVGhyZWFkRE9NRGF0YTo6TWFpblRocmVhZERPTURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6
TWFpblRocmVhZERPTURhdGE6OmdldFN0b3JlKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9NYWlu
VGhyZWFkRE9NRGF0YS5oOiBBZGRlZC4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9TY29wZWRET01E
YXRhU3RvcmUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlNjb3BlZERPTURhdGFTdG9y
ZTo6U2NvcGVkRE9NRGF0YVN0b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlNjb3BlZERPTURhdGFT
dG9yZTo6flNjb3BlZERPTURhdGFTdG9yZSk6CisgICAgICAgICogYmluZGluZ3MvdjgvU2NvcGVk
RE9NRGF0YVN0b3JlLmg6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1N0YXRpY0RPTURh
dGFTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U3RhdGljRE9NRGF0YVN0b3Jl
OjpTdGF0aWNET01EYXRhU3RvcmUpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1N0YXRpY0RPTURh
dGFTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9WOERPTU1hcC5jcHA6CisK
IDIwMDktMDctMjcgIEppYW4gTGkgIDxqaWFubGlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IERhdmlkIExldmluLgpAQCAtMTM5MjAsNyArMTM5ODEsNyBAQAogICAgICAgICAo
V2ViQ29yZTo6RE9NRGF0YVN0b3JlOjp+RE9NRGF0YVN0b3JlKToKICAgICAgICAgKFdlYkNvcmU6
OkRPTURhdGFTdG9yZUhhbmRsZTo6RE9NRGF0YVN0b3JlSGFuZGxlKToKICAgICAgICAgKFdlYkNv
cmU6OkRPTURhdGFTdG9yZUhhbmRsZTo6fkRPTURhdGFTdG9yZUhhbmRsZSk6Ci0gICAgICAgIChX
ZWJDb3JlOjo6OmZvcmdldCk6CisgICAgICAgIChXZWJDb3JlOjpmb3JnZXQpOgogICAgICAgICAo
V2ViQ29yZTo6Z2V0RE9NTm9kZU1hcCk6CiAgICAgICAgIChXZWJDb3JlOjpnZXRET01PYmplY3RN
YXApOgogICAgICAgICAoV2ViQ29yZTo6Z2V0QWN0aXZlRE9NT2JqZWN0TWFwKToKSW5kZXg6IFdl
YkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5neXBpCShy
ZXZpc2lvbiA0NjQxOSkKKysrIFdlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBA
IC01ODYsNiArNTg2LDggQEAKICAgICAgICAgICAgICdiaW5kaW5ncy9qcy9TdHJpbmdTb3VyY2VQ
cm92aWRlci5oJywKICAgICAgICAgICAgICdiaW5kaW5ncy9qcy9Xb3JrZXJTY3JpcHRDb250cm9s
bGVyLmNwcCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvanMvV29ya2VyU2NyaXB0Q29udHJvbGxl
ci5oJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9DaGlsZFRocmVhZERPTURhdGEuY3BwJywK
KyAgICAgICAgICAgICdiaW5kaW5ncy92OC9DaGlsZFRocmVhZERPTURhdGEuaCcsCiAgICAgICAg
ICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4QWJzdHJhY3RXb3JrZXJDdXN0b20uY3BwJywKICAg
ICAgICAgICAgICdiaW5kaW5ncy92OC9jdXN0b20vVjhBdHRyQ3VzdG9tLmNwcCcsCiAgICAgICAg
ICAgICAnYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFzUGl4ZWxBcnJheUN1c3RvbS5jcHAnLApA
QCAtNjY2LDExICs2NjgsMTkgQEAKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9jdXN0b20vVjhY
TUxTZXJpYWxpemVyQ29uc3RydWN0b3IuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9j
dXN0b20vVjhYUGF0aEV2YWx1YXRvckNvbnN0cnVjdG9yLmNwcCcsCiAgICAgICAgICAgICAnYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4WFNMVFByb2Nlc3NvckN1c3RvbS5jcHAnLAorICAgICAgICAgICAg
J2JpbmRpbmdzL3Y4L0RPTURhdGEuY3BwJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9ET01E
YXRhLmgnLAorICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L0RPTURhdGFTdG9yZS5jcHAnLAorICAg
ICAgICAgICAgJ2JpbmRpbmdzL3Y4L0RPTURhdGFTdG9yZS5oJywKICAgICAgICAgICAgICdiaW5k
aW5ncy92OC9ET01PYmplY3RzSW5jbHVkZS5oJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9N
YWluVGhyZWFkRE9NRGF0YS5jcHAnLAorICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L01haW5UaHJl
YWRET01EYXRhLmgnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4L05QVjhPYmplY3QuY3BwJywK
ICAgICAgICAgICAgICdiaW5kaW5ncy92OC9OUFY4T2JqZWN0LmgnLAogICAgICAgICAgICAgJ2Jp
bmRpbmdzL3Y4L1NjaGVkdWxlZEFjdGlvbi5jcHAnLAogICAgICAgICAgICAgJ2JpbmRpbmdzL3Y4
L1NjaGVkdWxlZEFjdGlvbi5oJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY29wZWRET01E
YXRhU3RvcmUuY3BwJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY29wZWRET01EYXRhU3Rv
cmUuaCcsCiAgICAgICAgICAgICAnYmluZGluZ3MvdjgvU2NyaXB0QXJyYXkuY3BwJywKICAgICAg
ICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRBcnJheS5oJywKICAgICAgICAgICAgICdiaW5kaW5n
cy92OC9TY3JpcHRDYWNoZWRGcmFtZURhdGEuaCcsCkBAIC02OTgsNiArNzA4LDggQEAKICAgICAg
ICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRTdHJpbmcuaCcsCiAgICAgICAgICAgICAnYmluZGlu
Z3MvdjgvU2NyaXB0VmFsdWUuY3BwJywKICAgICAgICAgICAgICdiaW5kaW5ncy92OC9TY3JpcHRW
YWx1ZS5oJywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3RvcmUuY3Bw
JywKKyAgICAgICAgICAgICdiaW5kaW5ncy92OC9TdGF0aWNET01EYXRhU3RvcmUuaCcsCiAgICAg
ICAgICAgICAnYmluZGluZ3MvdjgvVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuY3BwJywKICAgICAg
ICAgICAgICdiaW5kaW5ncy92OC9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5oJywKICAgICAgICAg
ICAgICdiaW5kaW5ncy92OC9WOEJpbmRpbmcuY3BwJywKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mv
djgvQ2hpbGRUaHJlYWRET01EYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdz
L3Y4L0NoaWxkVGhyZWFkRE9NRGF0YS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRp
bmdzL3Y4L0NoaWxkVGhyZWFkRE9NRGF0YS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ2hpbGRUaHJlYWRET01EYXRhLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ2hpbGRUaHJlYWRET01EYXRhOjpDaGlsZFRocmVhZERP
TURhdGEoKQorICAgIDogbV9kZWZhdWx0U3RvcmUodGhpcykKK3sKK30KKworRE9NRGF0YVN0b3Jl
JiBDaGlsZFRocmVhZERPTURhdGE6OmdldFN0b3JlKCkKK3sKKyAgICBBU1NFUlQoIVdURjo6aXNN
YWluVGhyZWFkKCkpOworICAgIC8vIEN1cnJlbnRseSwgY2hpbGQgdGhyZWFkcyBoYXZlIG9ubHkg
b25lIHdvcmxkLgorICAgIHJldHVybiBtX2RlZmF1bHRTdG9yZTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9DaGlsZFRocmVhZERPTURhdGEu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L0NoaWxkVGhyZWFkRE9NRGF0YS5o
CShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9DaGlsZFRocmVhZERPTURhdGEu
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAg
KiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisg
KiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ2hpbGRUaHJlYWRET01EYXRh
X2gKKyNkZWZpbmUgQ2hpbGRUaHJlYWRET01EYXRhX2gKKworI2luY2x1ZGUgIkRPTURhdGEuaCIK
KyNpbmNsdWRlICJTY29wZWRET01EYXRhU3RvcmUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CisgICAgY2xhc3MgQ2hpbGRUaHJlYWRET01EYXRhIDogcHVibGljIERPTURhdGEgeworICAgIHB1
YmxpYzoKKyAgICAgICAgQ2hpbGRUaHJlYWRET01EYXRhKCk7CisgICAgICAgIERPTURhdGFTdG9y
ZSYgZ2V0U3RvcmUoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNjb3BlZERPTURhdGFTdG9y
ZSBtX2RlZmF1bHRTdG9yZTsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBDaGlsZFRocmVhZERPTURhdGFfaApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9E
T01EYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RPTURhdGEuY3Bw
CShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICog
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
IGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRE9N
RGF0YS5oIgorCisjaW5jbHVkZSAiQ2hpbGRUaHJlYWRET01EYXRhLmgiCisjaW5jbHVkZSAiTWFp
blRocmVhZERPTURhdGEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitET01EYXRhOjpET01E
YXRhKCkKKyAgICA6IG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQoZmFsc2UpCisgICAgLCBt
X2lzTWFpblRocmVhZChXVEY6OmlzTWFpblRocmVhZCgpKQorICAgICwgbV9vd25pbmdUaHJlYWQo
V1RGOjpjdXJyZW50VGhyZWFkKCkpCit7Cit9CisKK0RPTURhdGEqIERPTURhdGE6OmdldEN1cnJl
bnQoKQoreworICAgIGlmIChXVEY6OmlzTWFpblRocmVhZCgpKQorICAgICAgICByZXR1cm4gZ2V0
Q3VycmVudE1haW5UaHJlYWQoKTsKKworICAgIERFRklORV9TVEFUSUNfTE9DQUwoV1RGOjpUaHJl
YWRTcGVjaWZpYzxDaGlsZFRocmVhZERPTURhdGE+LCBjaGlsZFRocmVhZERPTURhdGEsICgpKTsK
KyAgICByZXR1cm4gY2hpbGRUaHJlYWRET01EYXRhOworfQorCitET01EYXRhKiBET01EYXRhOjpn
ZXRDdXJyZW50TWFpblRocmVhZCgpCit7CisgICAgQVNTRVJUKFdURjo6aXNNYWluVGhyZWFkKCkp
OworICAgIERFRklORV9TVEFUSUNfTE9DQUwoTWFpblRocmVhZERPTURhdGEsIG1haW5UaHJlYWRE
T01EYXRhLCAoKSk7CisgICAgcmV0dXJuICZtYWluVGhyZWFkRE9NRGF0YTsKK30KKworLy8gQ2Fs
bGVkIHdoZW4gdGhlIGRlYWQgb2JqZWN0IGlzIG5vdCBpbiBHQyB0aHJlYWQncyBtYXAuIEdvIHRo
cm91Z2ggYWxsIHRocmVhZCBtYXBzIHRvIGZpbmQgdGhlIG9uZSBjb250YWluaW5nIGl0LgorLy8g
VGhlbiBjbGVhciB0aGUgSlMgcmVmZXJlbmNlIGFuZCBwdXNoIHRoZSBET00gb2JqZWN0IGludG8g
dGhlIGRlbGF5ZWQgcXVldWUgZm9yIGl0IHRvIGJlIGRlcmVmLWVkIGF0IGxhdGVyIHRpbWUgZnJv
bSB0aGUgb3duaW5nIHRocmVhZC4KKy8vICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgR0MgdGhy
ZWFkIGlzIG5vdCB0aGUgb3duaW5nIHRocmVhZC4KKy8vICogVGhpcyBjYW4gYmUgY2FsbGVkIG9u
IGFueSB0aHJlYWQgdGhhdCBoYXMgR0MgcnVubmluZy4KKy8vICogT25seSBvbmUgVjggaW5zdGFu
Y2UgaXMgcnVubmluZyBhdCBhIHRpbWUgZHVlIHRvIFY4OjpMb2NrZXIuIFNvIHdlIGRvbid0IG5l
ZWQgdG8gd29ycnkgYWJvdXQgY29uY3VycmVuY3kuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9p
ZCBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6RE9NV3JhcHBlck1hcFR5
cGUgbWFwVHlwZSwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB2OE9iamVjdCwgVCogZG9tT2JqZWN0
KQoreworCisgICAgV1RGOjpNdXRleExvY2tlciBsb2NrZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9y
ZXNNdXRleCgpKTsKKyAgICBET01EYXRhTGlzdCYgbGlzdCA9IERPTURhdGFTdG9yZTo6YWxsU3Rv
cmVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgKytpKSB7Cisg
ICAgICAgIERPTURhdGFTdG9yZSogc3RvcmUgPSBsaXN0W2ldOworCisgICAgICAgIERPTURhdGFT
dG9yZTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPFQ+KiBkb21NYXAgPSBzdGF0aWNfY2FzdDxET01E
YXRhU3RvcmU6OkludGVybmFsRE9NV3JhcHBlck1hcDxUPio+KHN0b3JlLT5nZXRET01XcmFwcGVy
TWFwKG1hcFR5cGUpKTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIg
PSBkb21NYXAtPmdldChkb21PYmplY3QpOworICAgICAgICBpZiAoKndyYXBwZXIgPT0gKnY4T2Jq
ZWN0KSB7CisgICAgICAgICAgICAvLyBDbGVhciB0aGUgSlMgcmVmZXJlbmNlLgorICAgICAgICAg
ICAgZG9tTWFwLT5mb3JnZXRPbmx5KGRvbU9iamVjdCk7CisgICAgICAgICAgICBzdG9yZS0+ZG9t
RGF0YSgpLT5lbnN1cmVEZXJlZihWOERPTVdyYXBwZXI6OmRvbVdyYXBwZXJUeXBlKHY4T2JqZWN0
KSwgZG9tT2JqZWN0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBET01EYXRhOjplbnN1
cmVEZXJlZihWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSwgdm9pZCogZG9tT2JqZWN0
KQoreworICAgIGlmIChtX293bmluZ1RocmVhZCA9PSBXVEY6OmN1cnJlbnRUaHJlYWQoKSkgewor
ICAgICAgICAvLyBObyBuZWVkIHRvIGRlbGF5IHRoZSB3b3JrLiBXZSBjYW4gZGVyZWYgcmlnaHQg
bm93LgorICAgICAgICBkZXJlZk9iamVjdCh0eXBlLCBkb21PYmplY3QpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgLy8gV2UgbmVlZCB0byBkbyB0aGUgZGVyZWYgb24gdGhlIGNvcnJl
Y3QgdGhyZWFkLgorICAgIG1fZGVsYXllZE9iamVjdE1hcC5zZXQoZG9tT2JqZWN0LCB0eXBlKTsK
KworICAgIC8vIFBvc3QgYSB0YXNrIHRvIHRoZSBvd25pbmcgdGhyZWFkIGluIG9yZGVyIHRvIHBy
b2Nlc3MgdGhlIGRlbGF5ZWQgcXVldWUuCisgICAgLy8gRklYTUU6IEZvciBub3csIHdlIGNhbiBv
bmx5IHBvc3QgdG8gbWFpbiB0aHJlYWQgZHVlIHRvIFdURiB0YXNrIHBvc3RpbmcgbGltaXRhdGlv
bi4gV2Ugd2lsbCBmaXggdGhpcyB3aGVuIHdlIHdvcmsgb24gbmVzdGVkIHdvcmtlci4KKyAgICBp
ZiAoIW1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQpIHsKKyAgICAgICAgbV9kZWxheWVkUHJv
Y2Vzc2luZ1NjaGVkdWxlZCA9IHRydWU7CisgICAgICAgIGlmIChpc01haW5UaHJlYWQoKSkKKyAg
ICAgICAgICAgIFdURjo6Y2FsbE9uTWFpblRocmVhZCgmZGVyZWZEZWxheWVkT2JqZWN0c0luQ3Vy
cmVudFRocmVhZCwgMCk7CisgICAgfQorfQorCit2b2lkIERPTURhdGE6OmRlcmVmT2JqZWN0KFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpCit7CisgICAg
c3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok5PREU6CisgICAgICAgIHN0
YXRpY19jYXN0PE5vZGUqPihkb21PYmplY3QpLT5kZXJlZigpOworICAgICAgICBicmVhazsKKwor
I2RlZmluZSBNYWtlQ2FzZSh0eXBlLCBuYW1lKSAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsK
KyAgICBET01fT0JKRUNUX1RZUEVTKE1ha2VDYXNlKSAgIC8vIFRoaXMgaW5jbHVkZXMgYm90aCBh
Y3RpdmUgYW5kIG5vbi1hY3RpdmUuCisjdW5kZWYgTWFrZUNhc2UKKworI2lmIEVOQUJMRShTVkcp
CisjZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgICBcCisgICAgICAgIGNhc2UgVjhDbGFz
c0luZGV4Ojp0eXBlOiBzdGF0aWNfY2FzdDxuYW1lKj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJl
YWs7CisgICAgU1ZHX09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkgICAvLyBUaGlzIGFsc28gaW5jbHVk
ZXMgU1ZHRWxlbWVudEluc3RhbmNlLgorI3VuZGVmIE1ha2VDYXNlCisKKyNkZWZpbmUgTWFrZUNh
c2UodHlwZSwgbmFtZSkgICAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6ICAg
IFwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8bmFtZT4qPihk
b21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKKyAgICBTVkdfUE9EX05BVElWRV9UWVBFUyhNYWtl
Q2FzZSkKKyN1bmRlZiBNYWtlQ2FzZQorI2VuZGlmCisKKyAgICBkZWZhdWx0OgorICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIERP
TURhdGE6OmRlcmVmRGVsYXllZE9iamVjdHMoKQoreworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9j
a2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7CisKKyAgICBtX2RlbGF5ZWRQcm9j
ZXNzaW5nU2NoZWR1bGVkID0gZmFsc2U7CisKKyAgICBmb3IgKERlbGF5ZWRPYmplY3RNYXA6Oml0
ZXJhdG9yIGl0ZXIobV9kZWxheWVkT2JqZWN0TWFwLmJlZ2luKCkpOyBpdGVyICE9IG1fZGVsYXll
ZE9iamVjdE1hcC5lbmQoKTsgKytpdGVyKQorICAgICAgICBkZXJlZk9iamVjdChpdGVyLT5zZWNv
bmQsIGl0ZXItPmZpcnN0KTsKKworICAgIG1fZGVsYXllZE9iamVjdE1hcC5jbGVhcigpOworfQor
Cit2b2lkIERPTURhdGE6OmRlcmVmRGVsYXllZE9iamVjdHNJbkN1cnJlbnRUaHJlYWQodm9pZCop
Cit7CisgICAgZ2V0Q3VycmVudCgpLT5kZXJlZkRlbGF5ZWRPYmplY3RzKCk7Cit9CisKK3RlbXBs
YXRlPHR5cGVuYW1lIFQ+Cit2b2lkIERPTURhdGE6OnJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1h
cChET01XcmFwcGVyTWFwPFQ+JiBkb21NYXApCit7CisgICAgZm9yICh0eXBlbmFtZSBXVEY6Okhh
c2hNYXA8VCosIHY4OjpPYmplY3QqPjo6aXRlcmF0b3IgaXRlcihkb21NYXAuaW1wbCgpLmJlZ2lu
KCkpOyBpdGVyICE9IGRvbU1hcC5pbXBsKCkuZW5kKCk7ICsraXRlcikgeworICAgICAgICBUKiBk
b21PYmplY3QgPSBzdGF0aWNfY2FzdDxUKj4oaXRlci0+Zmlyc3QpOworICAgICAgICB2ODo6UGVy
c2lzdGVudDx2ODo6T2JqZWN0PiB2OE9iamVjdChpdGVyLT5zZWNvbmQpOworCisgICAgICAgIFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhET01XcmFwcGVyOjpkb21XcmFwcGVy
VHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisKKyAgICAgICAg
Ly8gRGVyZWYgdGhlIERPTSBvYmplY3QuCisgICAgICAgIGRlcmVmT2JqZWN0KHR5cGUsIGRvbU9i
amVjdCk7CisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIEpTIHdyYXBwZXIuCisgICAgICAgIHY4T2Jq
ZWN0LkRpc3Bvc2UoKTsKKyAgICB9CisgICAgZG9tTWFwLmltcGwoKS5jbGVhcigpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RPTURhdGEu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RPTURhdGEuaAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9NRGF0YS5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6
CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBET01EYXRhX2gKKyNkZWZpbmUgRE9NRGF0YV9oCisKKyNpbmNsdWRl
ICJET01EYXRhU3RvcmUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgLy8gRE9NRGF0
YQorICAgIC8vCisgICAgLy8gRE9NRGF0YSByZXByZXNlbnRzIHRoZSBhbGwgdGhlIERPTSB3cmFw
cGVycyBmb3IgYSBnaXZlbiB0aHJlYWQuICBJbgorICAgIC8vIHBhcnRpY3VsYXIsIERPTURhdGEg
aG9sZHMgd3JhcHBlcnMgZm9yIGFsbCB0aGUgaXNvbGF0ZWQgd29ybGRzIGluIHRoZQorICAgIC8v
IHRocmVhZC4gIFRoZSBET01EYXRhIGZvciB0aGUgbWFpbiB0aHJlYWQgYW5kIHRoZSBET01EYXRh
IGZvciBjaGlsZCB0aHJlYWRzCisgICAgLy8gdXNlIGRpZmZlcmVudCBzdWJjbGFzc2VzLgorICAg
IC8vCisgICAgY2xhc3MgRE9NRGF0YSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAgcHVibGlj
OgorICAgICAgICBET01EYXRhKCk7CisKKyAgICAgICAgc3RhdGljIERPTURhdGEqIGdldEN1cnJl
bnQoKTsKKyAgICAgICAgc3RhdGljIERPTURhdGEqIGdldEN1cnJlbnRNYWluVGhyZWFkKCk7IC8v
IENhbGxlciBtdXN0IGJlIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgdmlydHVhbCBET01E
YXRhU3RvcmUmIGdldFN0b3JlKCkgPSAwOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+
CisgICAgICAgIHN0YXRpYyB2b2lkIGhhbmRsZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpET01X
cmFwcGVyTWFwVHlwZSwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiwgVCogZG9tT2JqZWN0KTsKKwor
ICAgICAgICB2b2lkIGZvcmdldERlbGF5ZWRPYmplY3Qodm9pZCogb2JqZWN0KSB7IG1fZGVsYXll
ZE9iamVjdE1hcC50YWtlKG9iamVjdCk7IH0KKworICAgICAgICAvLyBUaGlzIGlzIHRvIGVuc3Vy
ZSB0aGF0IHdlIHdpbGwgZGVyZWYgRE9NIG9iamVjdHMgZnJvbSB0aGUgb3duaW5nIHRocmVhZCwK
KyAgICAgICAgLy8gbm90IHRoZSBHQyB0aHJlYWQuIFRoZSBoZWxwZXIgZnVuY3Rpb24gd2lsbCBi
ZSBzY2hlZHVsZWQgYnkgdGhlIEdDCisgICAgICAgIC8vIHRocmVhZCB0byBnZXQgY2FsbGVkIGZy
b20gdGhlIG93bmluZyB0aHJlYWQuCisgICAgICAgIHN0YXRpYyB2b2lkIGRlcmVmRGVsYXllZE9i
amVjdHNJbkN1cnJlbnRUaHJlYWQodm9pZCopOworICAgICAgICB2b2lkIGRlcmVmRGVsYXllZE9i
amVjdHMoKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMg
dm9pZCByZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXAoRE9NV3JhcHBlck1hcDxUPiYgZG9tTWFw
KTsKKworICAgICAgICBUaHJlYWRJZGVudGlmaWVyIG93bmluZ1RocmVhZCgpIGNvbnN0IHsgcmV0
dXJuIG1fb3duaW5nVGhyZWFkOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB0eXBlZGVmIFdU
Rjo6SGFzaE1hcDx2b2lkKiwgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlPiBEZWxheWVkT2Jq
ZWN0TWFwOworCisgICAgICAgIHZvaWQgZW5zdXJlRGVyZWYoVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHR5cGUsIHZvaWQqIGRvbU9iamVjdCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGRlcmVm
T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3Qp
OworCisgICAgICAgIC8vIFN0b3JlcyBhbGwgdGhlIERPTSBvYmplY3RzIHRoYXQgYXJlIGRlbGF5
ZWQgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gdGhlCisgICAgICAgIC8vIG93bmluZyB0aHJlYWQgZ2Fp
bnMgY29udHJvbC4KKyAgICAgICAgRGVsYXllZE9iamVjdE1hcCBtX2RlbGF5ZWRPYmplY3RNYXA7
CisKKyAgICAgICAgLy8gVGhlIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHRhc2sgdG8gZG8gdGhl
IGRlbGF5ZWQgcHJvY2VzcyBoYXMKKyAgICAgICAgLy8gYWxyZWFkeSBiZWVuIHBvc3RlZC4KKyAg
ICAgICAgYm9vbCBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkOworCisgICAgICAgIGJvb2wg
bV9pc01haW5UaHJlYWQ7CisgICAgICAgIFRocmVhZElkZW50aWZpZXIgbV9vd25pbmdUaHJlYWQ7
CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRE9NRGF0YV9o
CkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L0RPTURhdGFTdG9yZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhU3RvcmUuY3BwCShyZXZpc2lvbiAwKQorKysg
V2ViQ29yZS9iaW5kaW5ncy92OC9ET01EYXRhU3RvcmUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0
OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJET01EYXRhU3RvcmUuaCIK
KworI2luY2x1ZGUgIkRPTURhdGEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBET00g
YmluZGluZyBhbGdvcml0aG06CisvLworLy8gVGhlcmUgYXJlIHR3byBraW5kcyBvZiBET00gb2Jq
ZWN0czoKKy8vIDEuIERPTSB0cmVlIG5vZGVzLCBzdWNoIGFzIERvY3VtZW50LCBIVE1MRWxlbWVu
dCwgLi4uCisvLyAgICB0aGVyZSBjbGFzc2VzIGltcGxlbWVudCBUcmVlU2hhcmVkPFQ+IGludGVy
ZmFjZTsKKy8vIDIuIE5vbi1ub2RlIERPTSBvYmplY3RzLCBzdWNoIGFzIENTU1J1bGUsIExvY2F0
aW9uLCBldGMuCisvLyAgICB0aGVzZSBjbGFzc2VzIGltcGxlbWVudCBhIHJlZi1jb3VudGVkIHNj
aGVtZS4KKy8vCisvLyBBIERPTSBvYmplY3QgbWF5IGhhdmUgYSBKUyB3cmFwcGVyIG9iamVjdC4g
SWYgYSB0cmVlIG5vZGUKKy8vIGlzIGFsaXZlLCBpdHMgSlMgd3JhcHBlciBtdXN0IGJlIGtlcHQg
YWxpdmUgZXZlbiBpdCBpcyBub3QKKy8vIHJlYWNoYWJsZSBmcm9tIEpTIHJvb3RzLgorLy8gSG93
ZXZlciwgSlMgd3JhcHBlcnMgb2Ygbm9uLW5vZGUgb2JqZWN0cyBjYW4gZ28gYXdheSBpZgorLy8g
bm90IHJlYWNoYWJsZSBmcm9tIG90aGVyIEpTIG9iamVjdHMuIEl0IHdvcmtzIGxpa2UgYSBjYWNo
ZS4KKy8vCisvLyBET00gb2JqZWN0cyBhcmUgcmVmLWNvdW50ZWQsIGFuZCBKUyBvYmplY3RzIGFy
ZSB0cmFjZWQgZnJvbQorLy8gYSBzZXQgb2Ygcm9vdCBvYmplY3RzLiBUaGV5IGNhbiBjcmVhdGUg
YSBjeWNsZS4gVG8gYnJlYWsKKy8vIGN5Y2xlcywgd2UgZG8gZm9sbG93aW5nOgorLy8gICBIYW5k
bGVzIGZyb20gRE9NIG9iamVjdHMgdG8gSlMgd3JhcHBlcnMgYXJlIGFsd2F5cyB3ZWFrLAorLy8g
c28gSlMgd3JhcHBlcnMgb2Ygbm9uLW5vZGUgb2JqZWN0IGNhbm5vdCBjcmVhdGUgYSBjeWNsZS4K
Ky8vICAgQmVmb3JlIHN0YXJ0aW5nIGEgZ2xvYmFsIEdDLCB3ZSBjcmVhdGUgYSB2aXJ0dWFsIGNv
bm5lY3Rpb24KKy8vIGJldHdlZW4gbm9kZXMgaW4gdGhlIHNhbWUgdHJlZSBpbiB0aGUgSlMgaGVh
cC4gSWYgdGhlIHdyYXBwZXIKKy8vIG9mIG9uZSBub2RlIGluIGEgdHJlZSBpcyBhbGl2ZSwgd3Jh
cHBlcnMgb2YgYWxsIG5vZGVzIGluCisvLyB0aGUgc2FtZSB0cmVlIGFyZSBjb25zaWRlcmVkIGFs
aXZlLiBUaGlzIGlzIGRvbmUgYnkgY3JlYXRpbmcKKy8vIG9iamVjdCBncm91cHMgaW4gR0MgcHJv
bG9ndWUgY2FsbGJhY2tzLiBUaGUgbWFyay1jb21wYWN0CisvLyBjb2xsZWN0b3Igd2lsbCByZW1v
dmUgdGhlc2UgZ3JvdXBzIGFmdGVyIGVhY2ggR0MuCisvLworLy8gRE9NIG9iamVjdHMgc2hvdWxk
IGJlIGRlcmVmLWVkIGZyb20gdGhlIG93bmluZyB0aHJlYWQsIG5vdCB0aGUgR0MgdGhyZWFkCisv
LyB0aGF0IGRvZXMgbm90IG93biB0aGVtLiBJbiBWOCwgR0MgY2FuIGtpY2sgaW4gZnJvbSBhbnkg
dGhyZWFkLiBUbyBlbnN1cmUKKy8vIHRoYXQgRE9NIG9iamVjdHMgYXJlIGFsd2F5cyBkZXJlZi1l
ZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkIHdoZW4gcnVubmluZworLy8gVjggaW4gbXVsdGktdGhy
ZWFkaW5nIGVudmlyb25tZW50LCB3ZSBkbyBmb2xsb3dpbmc6CisvLyAxLiBNYWludGFpbiBhIHRo
cmVhZCBzcGVjaWZpYyBET00gd3JhcHBlciBtYXAgZm9yIGVhY2ggb2JqZWN0IG1hcC4KKy8vICAg
IChXZSdyZSB1c2luZyBUTFMgc3VwcG9ydCBmcm9tIFdURiBpbnN0ZWFkIG9mIGJhc2Ugc2luY2Ug
VjhCaW5kaW5ncworLy8gICAgIGRvZXMgbm90IGRlcGVuZCBvbiBiYXNlLiBXZSBmdXJ0aGVyIGFz
c3VtZSB0aGF0IGFsbCBjaGlsZCB0aHJlYWRzCisvLyAgICAgcnVubmluZyBWOCBpbnN0YW5jZXMg
YXJlIGNyZWF0ZWQgYnkgV1RGIGFuZCB0aHVzIGEgZGVzdHJ1Y3RvciB3aWxsCisvLyAgICAgYmUg
Y2FsbGVkIHRvIGNsZWFuIHVwIGFsbCB0aHJlYWQgc3BlY2lmaWMgZGF0YS4pCisvLyAyLiBXaGVu
IEdDIGhhcHBlbnM6CisvLyAgICAyLjEuIElmIHRoZSBkZWFkIG9iamVjdCBpcyBpbiBHQyB0aHJl
YWQncyBtYXAsIHJlbW92ZSB0aGUgSlMgcmVmZXJlbmNlCisvLyAgICAgICAgIGFuZCBkZXJlZiB0
aGUgRE9NIG9iamVjdC4KKy8vICAgIDIuMi4gT3RoZXJ3aXNlLCBnbyB0aHJvdWdoIGFsbCB0aHJl
YWQgbWFwcyB0byBmaW5kIHRoZSBvd25pbmcgdGhyZWFkLgorLy8gICAgICAgICBSZW1vdmUgdGhl
IEpTIHJlZmVyZW5jZSBmcm9tIHRoZSBvd25pbmcgdGhyZWFkJ3MgbWFwIGFuZCBtb3ZlIHRoZQor
Ly8gICAgICAgICBET00gb2JqZWN0IHRvIGEgZGVsYXllZCBxdWV1ZS4gUG9zdCBhIHRhc2sgdG8g
dGhlIG93bmluZyB0aHJlYWQKKy8vICAgICAgICAgdG8gaGF2ZSBpdCBkZXJlZi1lZCBmcm9tIHRo
ZSBvd25pbmcgdGhyZWFkIGF0IGxhdGVyIHRpbWUuCisvLyAzLiBXaGVuIGEgdGhyZWFkIGlzIHRl
YXJpbmcgZG93biwgaW52b2tlIGEgY2xlYW51cCByb3V0aW5lIHRvIGdvIHRocm91Z2gKKy8vICAg
IGFsbCBvYmplY3RzIGluIHRoZSBkZWxheWVkIHF1ZXVlIGFuZCB0aGUgdGhyZWFkIG1hcCBhbmQg
ZGVyZWYgYWxsIG9mCisvLyAgICB0aGVtLgorCisKK0RPTURhdGFTdG9yZTo6RE9NRGF0YVN0b3Jl
KERPTURhdGEqIGRvbURhdGEpCisgICAgOiBtX2RvbU5vZGVNYXAoMCkKKyAgICAsIG1fZG9tT2Jq
ZWN0TWFwKDApCisgICAgLCBtX2FjdGl2ZURvbU9iamVjdE1hcCgwKQorI2lmIEVOQUJMRShTVkcp
CisgICAgLCBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgwKQorICAgICwgbV9kb21TdmdPYmpl
Y3RXaXRoQ29udGV4dE1hcCgwKQorI2VuZGlmCisgICAgLCBtX2RvbURhdGEoZG9tRGF0YSkKK3sK
KyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4
KCkpOworICAgIERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCkuYXBwZW5kKHRoaXMpOworfQorCitE
T01EYXRhU3RvcmU6On5ET01EYXRhU3RvcmUoKQoreworICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9j
a2VyKERPTURhdGFTdG9yZTo6YWxsU3RvcmVzTXV0ZXgoKSk7CisgICAgRE9NRGF0YVN0b3JlOjph
bGxTdG9yZXMoKS5yZW1vdmUoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKS5maW5kKHRoaXMpKTsK
K30KKworRE9NRGF0YUxpc3QmIERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCkKK3sKKyAgICBERUZJ
TkVfU1RBVElDX0xPQ0FMKERPTURhdGFMaXN0LCBzdGF0aWNET01EYXRhTGlzdCwgKCkpOworICAg
IHJldHVybiBzdGF0aWNET01EYXRhTGlzdDsKK30KKworV1RGOjpNdXRleCYgRE9NRGF0YVN0b3Jl
OjphbGxTdG9yZXNNdXRleCgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChXVEY6Ok11dGV4
LCBzdGF0aWNET01EYXRhTGlzdE11dGV4LCAoKSk7CisgICAgcmV0dXJuIHN0YXRpY0RPTURhdGFM
aXN0TXV0ZXg7Cit9CisKK3ZvaWQqIERPTURhdGFTdG9yZTo6Z2V0RE9NV3JhcHBlck1hcChET01X
cmFwcGVyTWFwVHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRE9N
Tm9kZU1hcDoKKyAgICAgICAgcmV0dXJuIG1fZG9tTm9kZU1hcDsKKyAgICBjYXNlIERPTU9iamVj
dE1hcDoKKyAgICAgICAgcmV0dXJuIG1fZG9tT2JqZWN0TWFwOworICAgIGNhc2UgQWN0aXZlRE9N
T2JqZWN0TWFwOgorICAgICAgICByZXR1cm4gbV9hY3RpdmVEb21PYmplY3RNYXA7CisjaWYgRU5B
QkxFKFNWRykKKyAgICBjYXNlIERPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcDoKKyAgICAgICAgcmV0
dXJuIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOworICAgIGNhc2UgRE9NU1ZHT2JqZWN0V2l0
aENvbnRleHRNYXA6CisgICAgICAgIHJldHVybiBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFw
OworI2VuZGlmCisgICAgfQorCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJu
IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBLZXlUeXBlPgordm9pZCBET01EYXRhU3RvcmU6Oklu
dGVybmFsRE9NV3JhcHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KEtleVR5cGUqIG9iamVjdCkKK3sK
KyAgICBET01XcmFwcGVyTWFwPEtleVR5cGU+Ojpmb3JnZXQob2JqZWN0KTsKKyAgICBtX2RvbURh
dGEtPmZvcmdldERlbGF5ZWRPYmplY3Qob2JqZWN0KTsKK30KKworLy8gQ2FsbGVkIHdoZW4gdGhl
IG9iamVjdCBpcyBuZWFyIGRlYXRoIChub3QgcmVhY2hhYmxlIGZyb20gSlMgcm9vdHMpLgorLy8g
SXQgaXMgdGltZSB0byByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlIGFuZCBkaXNwb3Nl
IHRoZSBoYW5kbGUuCit2b2lkIERPTURhdGFTdG9yZTo6d2Vha0RPTU9iamVjdENhbGxiYWNrKHY4
OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAg
ICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgp
KTsKKyAgICBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6RE9NT2JqZWN0
TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSwgZG9tT2JqZWN0KTsK
K30KKwordm9pZCBET01EYXRhU3RvcmU6OndlYWtBY3RpdmVET01PYmplY3RDYWxsYmFjayh2ODo6
UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCit7CisgICAg
djg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7
CisgICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdChET01EYXRhU3RvcmU6OkFjdGl2ZURPTU9i
amVjdE1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCksIGRvbU9iamVj
dCk7Cit9CisKK3ZvaWQgRE9NRGF0YVN0b3JlOjp3ZWFrTm9kZUNhbGxiYWNrKHY4OjpQZXJzaXN0
ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICB2ODo6SGFu
ZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKKyAgICBE
T01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0PE5vZGU+KERPTURhdGFTdG9yZTo6RE9NTm9kZU1hcCwg
djg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCksIHN0YXRpY19jYXN0PE5vZGUq
Pihkb21PYmplY3QpKTsKK30KKworI2lmIEVOQUJMRShTVkcpCisKK3ZvaWQgRE9NRGF0YVN0b3Jl
Ojp3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVl
PiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQoreworICAgIHY4OjpIYW5kbGVTY29wZSBzY29w
ZTsKKyAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOworICAgIERPTURhdGE6OmhhbmRs
ZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpET01TVkdFbGVtZW50SW5zdGFuY2VNYXAsIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50
SW5zdGFuY2UqPihkb21PYmplY3QpKTsKK30KKwordm9pZCBET01EYXRhU3RvcmU6OndlYWtTVkdP
YmplY3RXaXRoQ29udGV4dENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmpl
Y3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAg
QVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsKKyAgICBET01EYXRhOjpoYW5kbGVXZWFrT2Jq
ZWN0KERPTURhdGFTdG9yZTo6RE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAsIHY4OjpIYW5kbGU8
djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBkb21PYmplY3QpOworfQorCisjZW5kaWYgIC8v
IEVOQUJMRShTVkcpCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmlu
ZGluZ3MvdjgvRE9NRGF0YVN0b3JlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92
OC9ET01EYXRhU3RvcmUuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvRE9N
RGF0YVN0b3JlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlv
bi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBET01EYXRh
U3RvcmVfaAorI2RlZmluZSBET01EYXRhU3RvcmVfaAorCisjaW5jbHVkZSAiRE9NT2JqZWN0c0lu
Y2x1ZGUuaCIKKworI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNp
bmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgor
I2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+Cisj
aW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTcGVjaWZpYy5o
PgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAg
Y2xhc3MgRE9NRGF0YTsKKworICAgIHR5cGVkZWYgV1RGOjpWZWN0b3I8RE9NRGF0YVN0b3JlKj4g
RE9NRGF0YUxpc3Q7CisKKyAgICAvLyBET01EYXRhU3RvcmUKKyAgICAvLworICAgIC8vIERPTURh
dGFTdG9yZSBpcyB0aGUgYmFja2luZyBzdG9yZSB0aGF0IGhvbGRzIHRoZSBtYXBzIGJldHdlZW4g
RE9NIG9iamVjdHMKKyAgICAvLyBhbmQgSmF2YVNjcmlwdCBvYmplY3RzLiAgSW4gZ2VuZXJhbCwg
ZWFjaCB0aHJlYWQgY2FuIGhhdmUgbXVsdGlwbGUgYmFja2luZworICAgIC8vIHN0b3Jlcywgb25l
IHBlciBpc29sYXRlZCB3b3JsZC4KKyAgICAvLworICAgIC8vIFRoaXMgY2xhc3MgZG9lc24ndCBt
YW5hZ2UgdGhlIGxpZmV0aW1lIG9mIHRoZSBzdG9yZS4gIFRoZSBkYXRhIHN0b3JlCisgICAgLy8g
bGlmZXRpbWUgaXMgbWFuYWdlZCBieSBzdWJjbGFzc2VzLgorICAgIC8vCisgICAgY2xhc3MgRE9N
RGF0YVN0b3JlIDogcHVibGljIE5vbmNvcHlhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVu
dW0gRE9NV3JhcHBlck1hcFR5cGUgeworICAgICAgICAgICAgRE9NTm9kZU1hcCwKKyAgICAgICAg
ICAgIERPTU9iamVjdE1hcCwKKyAgICAgICAgICAgIEFjdGl2ZURPTU9iamVjdE1hcCwKKyNpZiBF
TkFCTEUoU1ZHKQorICAgICAgICAgICAgRE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwLAorICAgICAg
ICAgICAgRE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXAKKyNlbmRpZgorICAgICAgICB9OworCisg
ICAgICAgIHRlbXBsYXRlIDxjbGFzcyBLZXlUeXBlPgorICAgICAgICBjbGFzcyBJbnRlcm5hbERP
TVdyYXBwZXJNYXAgOiBwdWJsaWMgRE9NV3JhcHBlck1hcDxLZXlUeXBlPiB7CisgICAgICAgIHB1
YmxpYzoKKyAgICAgICAgICAgIEludGVybmFsRE9NV3JhcHBlck1hcChET01EYXRhKiBkb21EYXRh
LCB2ODo6V2Vha1JlZmVyZW5jZUNhbGxiYWNrIGNhbGxiYWNrKQorICAgICAgICAgICAgICAgIDog
RE9NV3JhcHBlck1hcDxLZXlUeXBlPihjYWxsYmFjayksIG1fZG9tRGF0YShkb21EYXRhKSB7IH0K
KworICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvcmdldChLZXlUeXBlKik7CisgICAgICAgICAg
ICB2b2lkIGZvcmdldE9ubHkoS2V5VHlwZSogb2JqZWN0KSB7IERPTVdyYXBwZXJNYXA8S2V5VHlw
ZT46OmZvcmdldChvYmplY3QpOyB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIERP
TURhdGEqIG1fZG9tRGF0YTsKKyAgICAgICAgfTsKKworICAgICAgICBET01EYXRhU3RvcmUoRE9N
RGF0YSopOworICAgICAgICB2aXJ0dWFsIH5ET01EYXRhU3RvcmUoKTsKKworICAgICAgICAvLyBB
IGxpc3Qgb2YgYWxsIERPTURhdGFTdG9yZSBvYmplY3RzLiAgVHJhdmVyc2VkIGR1cmluZyBHQyB0
byBmaW5kIGEgdGhyZWFkLXNwZWNpZmljIG1hcCB0aGF0CisgICAgICAgIC8vIGNvbnRhaW5zIHRo
ZSBvYmplY3QgLSBzbyB3ZSBjYW4gc2NoZWR1bGUgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkIG9u
IHRoZSB0aHJlYWQgd2hpY2ggY3JlYXRlZCBpdC4KKyAgICAgICAgc3RhdGljIERPTURhdGFMaXN0
JiBhbGxTdG9yZXMoKTsKKyAgICAgICAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1
cnJlbnQgYWNjZXNzIG9mIERPTURhdGFMaXN0LgorICAgICAgICBzdGF0aWMgV1RGOjpNdXRleCYg
YWxsU3RvcmVzTXV0ZXgoKTsKKworICAgICAgICBET01EYXRhKiBkb21EYXRhKCkgY29uc3QgeyBy
ZXR1cm4gbV9kb21EYXRhOyB9CisKKyAgICAgICAgdm9pZCogZ2V0RE9NV3JhcHBlck1hcChET01X
cmFwcGVyTWFwVHlwZSk7CisKKyAgICAgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+JiBk
b21Ob2RlTWFwKCkgeyByZXR1cm4gKm1fZG9tTm9kZU1hcDsgfQorICAgICAgICBJbnRlcm5hbERP
TVdyYXBwZXJNYXA8dm9pZD4mIGRvbU9iamVjdE1hcCgpIHsgcmV0dXJuICptX2RvbU9iamVjdE1h
cDsgfQorICAgICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIGFjdGl2ZURvbU9iamVj
dE1hcCgpIHsgcmV0dXJuICptX2FjdGl2ZURvbU9iamVjdE1hcDsgfQorI2lmIEVOQUJMRShTVkcp
CisgICAgICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+JiBkb21T
dmdFbGVtZW50SW5zdGFuY2VNYXAoKSB7IHJldHVybiAqbV9kb21TdmdFbGVtZW50SW5zdGFuY2VN
YXA7IH0KKyAgICAgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+JiBkb21TdmdPYmplY3RX
aXRoQ29udGV4dE1hcCgpIHsgcmV0dXJuICptX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOyB9
CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RhdGljIHZvaWQgd2Vha05vZGVD
YWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmpl
Y3QpOworICAgICAgICBzdGF0aWMgdm9pZCB3ZWFrRE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBlcnNp
c3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKKyAgICAgICAgc3Rh
dGljIHZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpW
YWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7CisjaWYgRU5BQkxFKFNWRykKKyAgICAg
ICAgc3RhdGljIHZvaWQgd2Vha1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNrKHY4OjpQZXJzaXN0
ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7CisgICAgICAgIC8vIFNW
RyBub24tbm9kZSBlbGVtZW50cyBtYXkgaGF2ZSBhIHJlZmVyZW5jZSB0byBhIGNvbnRleHQgbm9k
ZSB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjaGFuZ2UuCisg
ICAgICAgIHN0YXRpYyB2b2lkIHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNrKHY4OjpQ
ZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7CisjZW5kaWYK
KyAgICAgICAgCisgICAgICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiogbV9kb21Ob2Rl
TWFwOworICAgICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4qIG1fZG9tT2JqZWN0TWFw
OworICAgICAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4qIG1fYWN0aXZlRG9tT2JqZWN0
TWFwOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdF
bGVtZW50SW5zdGFuY2U+KiBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcDsKKyAgICAgICAgSW50
ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KiBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOwor
I2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBBIGJhY2stcG9pbnRlciB0byB0aGUg
RE9NRGF0YSB0byB3aGljaCB3ZSBiZWxvbmcuCisgICAgICAgIERPTURhdGEqIG1fZG9tRGF0YTsK
KyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBET01EYXRhU3Rv
cmVfaApJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9NYWluVGhyZWFkRE9NRGF0YS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9NYWluVGhyZWFkRE9NRGF0YS5jcHAJKHJl
dmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01EYXRhLmNwcAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJNYWluVGhyZWFkRE9NRGF0YS5oIgorCisjaW5jbHVkZSAiVjhJc29sYXRlZFdvcmxkLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworTWFpblRocmVhZERPTURhdGE6Ok1haW5UaHJlYWRET01E
YXRhKCkKKyAgICA6IG1fZGVmYXVsdFN0b3JlKHRoaXMpCit7Cit9CisKK0RPTURhdGFTdG9yZSYg
TWFpblRocmVhZERPTURhdGE6OmdldFN0b3JlKCkKK3sKKyAgICBBU1NFUlQoV1RGOjppc01haW5U
aHJlYWQoKSk7CisgICAgVjhJc29sYXRlZFdvcmxkKiB3b3JsZCA9IFY4SXNvbGF0ZWRXb3JsZDo6
Z2V0RW50ZXJlZCgpOworICAgIGlmICh3b3JsZCkKKyAgICAgICAgcmV0dXJuICp3b3JsZC0+Z2V0
RE9NRGF0YVN0b3JlKCk7CisgICAgcmV0dXJuIG1fZGVmYXVsdFN0b3JlOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L01haW5UaHJlYWRET01E
YXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9NYWluVGhyZWFkRE9NRGF0
YS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9NYWluVGhyZWFkRE9NRGF0
YS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBNYWluVGhyZWFkRE9NRGF0
YV9oCisjZGVmaW5lIE1haW5UaHJlYWRET01EYXRhX2gKKworI2luY2x1ZGUgIkRPTURhdGEuaCIK
KyNpbmNsdWRlICJTdGF0aWNET01EYXRhU3RvcmUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CisgICAgY2xhc3MgTWFpblRocmVhZERPTURhdGEgOiBwdWJsaWMgRE9NRGF0YSB7CisgICAgcHVi
bGljOgorICAgICAgICBNYWluVGhyZWFkRE9NRGF0YSgpOworICAgICAgICBET01EYXRhU3RvcmUm
IGdldFN0b3JlKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBTdGF0aWNET01EYXRhU3RvcmUg
bV9kZWZhdWx0U3RvcmU7CisgICAgICAgIC8vIE5vdGU6IFRoZSBET01EYXRhU3RvcmVzIGZvciBp
c29sYXRlZCB3b3JsZCBhcmUgb3duZWQgYnkgdGhlIHdvcmxkIG9iamVjdC4KKyAgICB9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBNYWluVGhyZWFkRE9NRGF0YV9oCklu
ZGV4OiBXZWJDb3JlL2JpbmRpbmdzL3Y4L1Njb3BlZERPTURhdGFTdG9yZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9TY29wZWRET01EYXRhU3RvcmUuY3BwCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9iaW5kaW5ncy92OC9TY29wZWRET01EYXRhU3RvcmUuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNj
b3BlZERPTURhdGFTdG9yZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Njb3BlZERPTURh
dGFTdG9yZTo6U2NvcGVkRE9NRGF0YVN0b3JlKERPTURhdGEqIGRvbURhdGEpCisgICAgOiBET01E
YXRhU3RvcmUoZG9tRGF0YSkKK3sKKyAgICBtX2RvbU5vZGVNYXAgPSBuZXcgSW50ZXJuYWxET01X
cmFwcGVyTWFwPE5vZGU+KGRvbURhdGEsICZET01EYXRhU3RvcmU6OndlYWtOb2RlQ2FsbGJhY2sp
OworICAgIG1fZG9tT2JqZWN0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPihk
b21EYXRhLCAmRE9NRGF0YVN0b3JlOjp3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spOworICAgIG1fYWN0
aXZlRG9tT2JqZWN0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPihkb21EYXRh
LCAmRE9NRGF0YVN0b3JlOjp3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spOworI2lmIEVOQUJM
RShTVkcpCisgICAgbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXAgPSBuZXcgSW50ZXJuYWxET01X
cmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4oZG9tRGF0YSwgJkRPTURhdGFTdG9yZTo6d2Vh
a1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNrKTsKKyAgICBtX2RvbVN2Z09iamVjdFdpdGhDb250
ZXh0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPihkb21EYXRhLCAmRE9NRGF0
YVN0b3JlOjp3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjayk7CisjZW5kaWYKK30KKwor
U2NvcGVkRE9NRGF0YVN0b3JlOjp+U2NvcGVkRE9NRGF0YVN0b3JlKCkKK3sKKyAgICBkZWxldGUg
bV9kb21Ob2RlTWFwOworICAgIGRlbGV0ZSBtX2RvbU9iamVjdE1hcDsKKyAgICBkZWxldGUgbV9h
Y3RpdmVEb21PYmplY3RNYXA7CisjaWYgRU5BQkxFKFNWRykKKyAgICBkZWxldGUgbV9kb21TdmdF
bGVtZW50SW5zdGFuY2VNYXA7CisgICAgZGVsZXRlIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRN
YXA7CisjZW5kaWYKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9i
aW5kaW5ncy92OC9TY29wZWRET01EYXRhU3RvcmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2Jp
bmRpbmdzL3Y4L1Njb3BlZERPTURhdGFTdG9yZS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9TY29wZWRET01EYXRhU3RvcmUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAor
ICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgU2NvcGVkRE9NRGF0YVN0b3JlX2gKKyNkZWZpbmUgU2NvcGVkRE9NRGF0YVN0
b3JlX2gKKworI2luY2x1ZGUgIkRPTURhdGFTdG9yZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKKyAgICAvLyBTY29wZWRET01EYXRhU3RvcmUKKyAgICAvLworICAgIC8vIFNjb3BlZERPTURh
dGFTdG9yZSBpcyBhIERPTURhdGFTdG9yZSB0aGF0IGNvbnRyb2xzIGxpbWl0cyB0aGUgbGlmZXRp
bWUgb2YKKyAgICAvLyB0aGUgc3RvcmUgdG8gdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3QgaXRz
ZWxmLiAgSW4gb3RoZXIgd29yZHMsIHdoZW4gdGhlCisgICAgLy8gU2NvcGVkRE9NRGF0YVN0b3Jl
IG9iamVjdCBpcyBkZWFsbG9jYXRlZCwgdGhlIG1hcHMgdGhhdCBiZWxvbmcgdG8gdGhlIHN0b3Jl
CisgICAgLy8gYXJlIGRlYWxsb2NhdGVkIGFzIHdlbGwuCisgICAgLy8KKyAgICBjbGFzcyBTY29w
ZWRET01EYXRhU3RvcmUgOiBwdWJsaWMgRE9NRGF0YVN0b3JlIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIFNjb3BlZERPTURhdGFTdG9yZShET01EYXRhKik7CisKKyAgICAgICAgLy8gVGhpcyBjYW4g
YmUgY2FsbGVkIHdoZW4gV1RGIHRocmVhZCBpcyB0ZWFyaW5nIGRvd24uCisgICAgICAgIC8vIFdl
IGFzc3VtZSB0aGF0IGFsbCBjaGlsZCB0aHJlYWRzIHJ1bm5pbmcgVjggaW5zdGFuY2VzIGFyZSBj
cmVhdGVkIGJ5IFdURi4KKyAgICAgICAgdmlydHVhbCB+U2NvcGVkRE9NRGF0YVN0b3JlKCk7Cisg
ICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU2NvcGVkRE9NRGF0
YVN0b3JlX2gKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU3RhdGljRE9NRGF0YVN0b3JlLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2JpbmRpbmdzL3Y4L1N0YXRpY0RPTURhdGFTdG9yZS5j
cHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L1N0YXRpY0RPTURhdGFTdG9y
ZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiU3RhdGljRE9NRGF0YVN0b3JlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
U3RhdGljRE9NRGF0YVN0b3JlOjpTdGF0aWNET01EYXRhU3RvcmUoRE9NRGF0YSogZG9tRGF0YSkK
KyAgICA6IERPTURhdGFTdG9yZShkb21EYXRhKQorICAgICwgbV9zdGF0aWNEb21Ob2RlTWFwKGRv
bURhdGEsICZET01EYXRhU3RvcmU6OndlYWtOb2RlQ2FsbGJhY2spCisgICAgLCBtX3N0YXRpY0Rv
bU9iamVjdE1hcChkb21EYXRhLCAmRE9NRGF0YVN0b3JlOjp3ZWFrRE9NT2JqZWN0Q2FsbGJhY2sp
CisgICAgLCBtX3N0YXRpY0FjdGl2ZURvbU9iamVjdE1hcChkb21EYXRhLCAmRE9NRGF0YVN0b3Jl
Ojp3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spCisjaWYgRU5BQkxFKFNWRykKKyAgICAsIG1f
c3RhdGljRG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwKGRvbURhdGEsICZET01EYXRhU3RvcmU6Ondl
YWtTVkdFbGVtZW50SW5zdGFuY2VDYWxsYmFjaykKKyAgICAsIG1fc3RhdGljRG9tU3ZnT2JqZWN0
V2l0aENvbnRleHRNYXAoZG9tRGF0YSwgJkRPTURhdGFTdG9yZTo6d2Vha1NWR09iamVjdFdpdGhD
b250ZXh0Q2FsbGJhY2spCisjZW5kaWYKK3sKKyAgICBtX2RvbU5vZGVNYXAgPSAmbV9zdGF0aWNE
b21Ob2RlTWFwOworICAgIG1fZG9tT2JqZWN0TWFwID0gJm1fc3RhdGljRG9tT2JqZWN0TWFwOwor
ICAgIG1fYWN0aXZlRG9tT2JqZWN0TWFwID0gJm1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwOwor
I2lmIEVOQUJMRShTVkcpCisgICAgbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXAgPSAmbV9zdGF0
aWNEb21TdmdFbGVtZW50SW5zdGFuY2VNYXA7CisgICAgbV9kb21TdmdPYmplY3RXaXRoQ29udGV4
dE1hcCA9ICZtX3N0YXRpY0RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOworI2VuZGlmCit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvYmluZGluZ3MvdjgvU3RhdGlj
RE9NRGF0YVN0b3JlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5ncy92OC9TdGF0aWNE
T01EYXRhU3RvcmUuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvYmluZGluZ3MvdjgvU3RhdGlj
RE9NRGF0YVN0b3JlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFN0YXRp
Y0RPTURhdGFTdG9yZV9oCisjZGVmaW5lIFN0YXRpY0RPTURhdGFTdG9yZV9oCisKKyNpbmNsdWRl
ICJET01EYXRhU3RvcmUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBTdGF0aWNET01E
YXRhU3RvcmUKKy8vCisvLyBTdGF0aWNET01EYXRhU3RvcmUgaXMgYSBET01EYXRhU3RvcmUgdGhh
dCBtYW5hZ2VzIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUKKy8vIHN0YXRpY2FsbHkuICBUaGlz
IGVuY2Fwc3VsYXRlcyB0aHJlYWQtc3BlY2lmaWMgRE9NIGRhdGEgZm9yIHRoZSBtYWluCisvLyB0
aHJlYWQuICBBbGwgdGhlIG1hcHMgaW4gaXQgYXJlIHN0YXRpYy4gIFRoaXMgaXMgYmVjYXVzZSB3
ZSBhcmUgdW5hYmxlIHRvCisvLyByZWx5IG9uIFdURjo6VGhyZWFkU3BlY2lmaWNUaHJlYWRFeGl0
IHRvIGRvIHRoZSBjbGVhbnVwIHNpbmNlIHRoZSBwbGFjZSB0aGF0CisvLyB0ZWFycyBkb3duIHRo
ZSBtYWluIHRocmVhZCBjYW4gbm90IGNhbGwgYW55IFdURiBmdW5jdGlvbnMuCisvLworY2xhc3Mg
U3RhdGljRE9NRGF0YVN0b3JlIDogcHVibGljIERPTURhdGFTdG9yZSB7CitwdWJsaWM6CisgICAg
U3RhdGljRE9NRGF0YVN0b3JlKERPTURhdGEqKTsKKworcHJpdmF0ZToKKyAgICBJbnRlcm5hbERP
TVdyYXBwZXJNYXA8Tm9kZT4gbV9zdGF0aWNEb21Ob2RlTWFwOworICAgIEludGVybmFsRE9NV3Jh
cHBlck1hcDx2b2lkPiBtX3N0YXRpY0RvbU9iamVjdE1hcDsKKyAgICBJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4gbV9zdGF0aWNBY3RpdmVEb21PYmplY3RNYXA7CisjaWYgRU5BQkxFKFNWRykK
KyAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPiBtX3N0YXRpY0Rv
bVN2Z0VsZW1lbnRJbnN0YW5jZU1hcDsKKyAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4g
bV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcDsKKyNlbmRpZgorfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU3RhdGljRE9NRGF0YVN0b3JlX2gKKwpJbmRl
eDogV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAJKHJldmlzaW9uIDQ2NDE5KQorKysgV2ViQ29yZS9i
aW5kaW5ncy92OC9WOERPTU1hcC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDM1OSArMzEsMTMg
QEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJWOERPTU1hcC5oIgogCisjaW5jbHVk
ZSAiRE9NRGF0YS5oIgorI2luY2x1ZGUgIkRPTURhdGFTdG9yZS5oIgogI2luY2x1ZGUgIkRPTU9i
amVjdHNJbmNsdWRlLmgiCi0KLSNpbmNsdWRlIDx2OC5oPgotCi0jaW5jbHVkZSA8d3RmL0hhc2hN
YXAuaD4KLSNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgotI2luY2x1ZGUgPHd0Zi9Ob25jb3B5
YWJsZS5oPgotI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KLSNpbmNsdWRlIDx3dGYvVGhy
ZWFkaW5nLmg+Ci0jaW5jbHVkZSA8d3RmL1RocmVhZFNwZWNpZmljLmg+Ci0jaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgotCi0jaW5jbHVkZSAiVjhJc29sYXRlZFdvcmxkLmgiCisjaW5jbHVkZSAiU2Nv
cGVkRE9NRGF0YVN0b3JlLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotLy8gRE9NIGJpbmRp
bmcgYWxnb3JpdGhtOgotLy8KLS8vIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgRE9NIG9iamVjdHM6
Ci0vLyAxLiBET00gdHJlZSBub2Rlcywgc3VjaCBhcyBEb2N1bWVudCwgSFRNTEVsZW1lbnQsIC4u
LgotLy8gICAgdGhlcmUgY2xhc3NlcyBpbXBsZW1lbnQgVHJlZVNoYXJlZDxUPiBpbnRlcmZhY2U7
Ci0vLyAyLiBOb24tbm9kZSBET00gb2JqZWN0cywgc3VjaCBhcyBDU1NSdWxlLCBMb2NhdGlvbiwg
ZXRjLgotLy8gICAgdGhlc2UgY2xhc3NlcyBpbXBsZW1lbnQgYSByZWYtY291bnRlZCBzY2hlbWUu
Ci0vLwotLy8gQSBET00gb2JqZWN0IG1heSBoYXZlIGEgSlMgd3JhcHBlciBvYmplY3QuIElmIGEg
dHJlZSBub2RlCi0vLyBpcyBhbGl2ZSwgaXRzIEpTIHdyYXBwZXIgbXVzdCBiZSBrZXB0IGFsaXZl
IGV2ZW4gaXQgaXMgbm90Ci0vLyByZWFjaGFibGUgZnJvbSBKUyByb290cy4KLS8vIEhvd2V2ZXIs
IEpTIHdyYXBwZXJzIG9mIG5vbi1ub2RlIG9iamVjdHMgY2FuIGdvIGF3YXkgaWYKLS8vIG5vdCBy
ZWFjaGFibGUgZnJvbSBvdGhlciBKUyBvYmplY3RzLiBJdCB3b3JrcyBsaWtlIGEgY2FjaGUuCi0v
LwotLy8gRE9NIG9iamVjdHMgYXJlIHJlZi1jb3VudGVkLCBhbmQgSlMgb2JqZWN0cyBhcmUgdHJh
Y2VkIGZyb20KLS8vIGEgc2V0IG9mIHJvb3Qgb2JqZWN0cy4gVGhleSBjYW4gY3JlYXRlIGEgY3lj
bGUuIFRvIGJyZWFrCi0vLyBjeWNsZXMsIHdlIGRvIGZvbGxvd2luZzoKLS8vICAgSGFuZGxlcyBm
cm9tIERPTSBvYmplY3RzIHRvIEpTIHdyYXBwZXJzIGFyZSBhbHdheXMgd2VhaywKLS8vIHNvIEpT
IHdyYXBwZXJzIG9mIG5vbi1ub2RlIG9iamVjdCBjYW5ub3QgY3JlYXRlIGEgY3ljbGUuCi0vLyAg
IEJlZm9yZSBzdGFydGluZyBhIGdsb2JhbCBHQywgd2UgY3JlYXRlIGEgdmlydHVhbCBjb25uZWN0
aW9uCi0vLyBiZXR3ZWVuIG5vZGVzIGluIHRoZSBzYW1lIHRyZWUgaW4gdGhlIEpTIGhlYXAuIElm
IHRoZSB3cmFwcGVyCi0vLyBvZiBvbmUgbm9kZSBpbiBhIHRyZWUgaXMgYWxpdmUsIHdyYXBwZXJz
IG9mIGFsbCBub2RlcyBpbgotLy8gdGhlIHNhbWUgdHJlZSBhcmUgY29uc2lkZXJlZCBhbGl2ZS4g
VGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nCi0vLyBvYmplY3QgZ3JvdXBzIGluIEdDIHByb2xvZ3Vl
IGNhbGxiYWNrcy4gVGhlIG1hcmstY29tcGFjdAotLy8gY29sbGVjdG9yIHdpbGwgcmVtb3ZlIHRo
ZXNlIGdyb3VwcyBhZnRlciBlYWNoIEdDLgotLy8KLS8vIERPTSBvYmplY3RzIHNob3VsZCBiZSBk
ZXJlZi1lZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLCBub3QgdGhlIEdDIHRocmVhZAotLy8gdGhh
dCBkb2VzIG5vdCBvd24gdGhlbS4gSW4gVjgsIEdDIGNhbiBraWNrIGluIGZyb20gYW55IHRocmVh
ZC4gVG8gZW5zdXJlCi0vLyB0aGF0IERPTSBvYmplY3RzIGFyZSBhbHdheXMgZGVyZWYtZWQgZnJv
bSB0aGUgb3duaW5nIHRocmVhZCB3aGVuIHJ1bm5pbmcKLS8vIFY4IGluIG11bHRpLXRocmVhZGlu
ZyBlbnZpcm9ubWVudCwgd2UgZG8gZm9sbG93aW5nOgotLy8gMS4gTWFpbnRhaW4gYSB0aHJlYWQg
c3BlY2lmaWMgRE9NIHdyYXBwZXIgbWFwIGZvciBlYWNoIG9iamVjdCBtYXAuCi0vLyAgICAoV2Un
cmUgdXNpbmcgVExTIHN1cHBvcnQgZnJvbSBXVEYgaW5zdGVhZCBvZiBiYXNlIHNpbmNlIFY4Qmlu
ZGluZ3MKLS8vICAgICBkb2VzIG5vdCBkZXBlbmQgb24gYmFzZS4gV2UgZnVydGhlciBhc3N1bWUg
dGhhdCBhbGwgY2hpbGQgdGhyZWFkcwotLy8gICAgIHJ1bm5pbmcgVjggaW5zdGFuY2VzIGFyZSBj
cmVhdGVkIGJ5IFdURiBhbmQgdGh1cyBhIGRlc3RydWN0b3Igd2lsbAotLy8gICAgIGJlIGNhbGxl
ZCB0byBjbGVhbiB1cCBhbGwgdGhyZWFkIHNwZWNpZmljIGRhdGEuKQotLy8gMi4gV2hlbiBHQyBo
YXBwZW5zOgotLy8gICAgMi4xLiBJZiB0aGUgZGVhZCBvYmplY3QgaXMgaW4gR0MgdGhyZWFkJ3Mg
bWFwLCByZW1vdmUgdGhlIEpTIHJlZmVyZW5jZQotLy8gICAgICAgICBhbmQgZGVyZWYgdGhlIERP
TSBvYmplY3QuCi0vLyAgICAyLjIuIE90aGVyd2lzZSwgZ28gdGhyb3VnaCBhbGwgdGhyZWFkIG1h
cHMgdG8gZmluZCB0aGUgb3duaW5nIHRocmVhZC4KLS8vICAgICAgICAgUmVtb3ZlIHRoZSBKUyBy
ZWZlcmVuY2UgZnJvbSB0aGUgb3duaW5nIHRocmVhZCdzIG1hcCBhbmQgbW92ZSB0aGUKLS8vICAg
ICAgICAgRE9NIG9iamVjdCB0byBhIGRlbGF5ZWQgcXVldWUuIFBvc3QgYSB0YXNrIHRvIHRoZSBv
d25pbmcgdGhyZWFkCi0vLyAgICAgICAgIHRvIGhhdmUgaXQgZGVyZWYtZWQgZnJvbSB0aGUgb3du
aW5nIHRocmVhZCBhdCBsYXRlciB0aW1lLgotLy8gMy4gV2hlbiBhIHRocmVhZCBpcyB0ZWFyaW5n
IGRvd24sIGludm9rZSBhIGNsZWFudXAgcm91dGluZSB0byBnbyB0aHJvdWdoCi0vLyAgICBhbGwg
b2JqZWN0cyBpbiB0aGUgZGVsYXllZCBxdWV1ZSBhbmQgdGhlIHRocmVhZCBtYXAgYW5kIGRlcmVm
IGFsbCBvZgotLy8gICAgdGhlbS4KLQotc3RhdGljIHZvaWQgd2Vha05vZGVDYWxsYmFjayh2ODo6
UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwotc3RhdGlj
IHZvaWQgd2Vha0RPTU9iamVjdENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhP
YmplY3QsIHZvaWQqIGRvbU9iamVjdCk7Ci12b2lkIHdlYWtBY3RpdmVET01PYmplY3RDYWxsYmFj
ayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwot
I2lmIEVOQUJMRShTVkcpCi1zdGF0aWMgdm9pZCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJh
Y2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsK
LS8vIFNWRyBub24tbm9kZSBlbGVtZW50cyBtYXkgaGF2ZSBhIHJlZmVyZW5jZSB0byBhIGNvbnRl
eHQgbm9kZSB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjaGFu
Z2UuCi1zdGF0aWMgdm9pZCB3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjayh2ODo6UGVy
c2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOwotI2VuZGlmCi0K
LWNsYXNzIERPTURhdGE7Ci1jbGFzcyBET01EYXRhU3RvcmU7Ci10eXBlZGVmIFdURjo6VmVjdG9y
PERPTURhdGFTdG9yZSo+IERPTURhdGFMaXN0OwotCi0vLyBET01EYXRhU3RvcmUKLS8vCi0vLyBE
T01EYXRhU3RvcmUgaXMgdGhlIGJhY2tpbmcgc3RvcmUgdGhhdCBob2xkcyB0aGUgbWFwcyBiZXR3
ZWVuIERPTSBvYmplY3RzCi0vLyBhbmQgSmF2YVNjcmlwdCBvYmplY3RzLiAgSW4gZ2VuZXJhbCwg
ZWFjaCB0aHJlYWQgY2FuIGhhdmUgbXVsdGlwbGUgYmFja2luZwotLy8gc3RvcmVzLCBvbmUgcGVy
IGlzb2xhdGVkIHdvcmxkLgotLy8KLS8vIFRoaXMgY2xhc3MgZG9lc24ndCBtYW5hZ2UgdGhlIGxp
ZmV0aW1lIG9mIHRoZSBzdG9yZS4gIFRoZSBkYXRhIHN0b3JlCi0vLyBsaWZldGltZSBpcyBtYW5h
Z2VkIGJ5IHN1YmNsYXNzZXMuCi0vLwotY2xhc3MgRE9NRGF0YVN0b3JlIDogcHVibGljIE5vbmNv
cHlhYmxlIHsKLXB1YmxpYzoKLSAgICBlbnVtIERPTVdyYXBwZXJNYXBUeXBlIHsKLSAgICAgICAg
RE9NTm9kZU1hcCwKLSAgICAgICAgRE9NT2JqZWN0TWFwLAotICAgICAgICBBY3RpdmVET01PYmpl
Y3RNYXAsCi0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgRE9NU1ZHRWxlbWVudEluc3RhbmNlTWFw
LAotICAgICAgICBET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcAotI2VuZGlmCi0gICAgfTsKLQot
ICAgIHRlbXBsYXRlIDxjbGFzcyBLZXlUeXBlPgotICAgIGNsYXNzIEludGVybmFsRE9NV3JhcHBl
ck1hcCA6IHB1YmxpYyBET01XcmFwcGVyTWFwPEtleVR5cGU+IHsKLSAgICBwdWJsaWM6Ci0gICAg
ICAgIEludGVybmFsRE9NV3JhcHBlck1hcChET01EYXRhKiBkb21EYXRhLCB2ODo6V2Vha1JlZmVy
ZW5jZUNhbGxiYWNrIGNhbGxiYWNrKQotICAgICAgICAgICAgOiBET01XcmFwcGVyTWFwPEtleVR5
cGU+KGNhbGxiYWNrKQotICAgICAgICAgICAgLCBtX2RvbURhdGEoZG9tRGF0YSkgeyB9Ci0KLSAg
ICAgICAgdmlydHVhbCB2b2lkIGZvcmdldChLZXlUeXBlKik7Ci0KLSAgICAgICAgdm9pZCBmb3Jn
ZXRPbmx5KEtleVR5cGUqIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgICAgRE9NV3JhcHBl
ck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6
Ci0gICAgICAgIERPTURhdGEqIG1fZG9tRGF0YTsKLSAgICB9OwotCi0gICAgLy8gQSBsaXN0IG9m
IGFsbCBET01EYXRhU3RvcmUgb2JqZWN0cy4gIFRyYXZlcnNlZCBkdXJpbmcgR0MgdG8gZmluZCBh
IHRocmVhZC1zcGVjaWZpYyBtYXAgdGhhdAotICAgIC8vIGNvbnRhaW5zIHRoZSBvYmplY3QgLSBz
byB3ZSBjYW4gc2NoZWR1bGUgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkIG9uIHRoZSB0aHJlYWQg
d2hpY2ggY3JlYXRlZCBpdC4KLSAgICBzdGF0aWMgRE9NRGF0YUxpc3QmIGFsbFN0b3JlcygpCi0g
ICAgewotICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERPTURhdGFMaXN0LCBzdGF0aWNET01E
YXRhTGlzdCwgKCkpOwotICAgICAgICByZXR1cm4gc3RhdGljRE9NRGF0YUxpc3Q7Ci0gICAgfQot
Ci0gICAgLy8gTXV0ZXggdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIG9mIERP
TURhdGFMaXN0LgotICAgIHN0YXRpYyBXVEY6Ok11dGV4JiBhbGxTdG9yZXNNdXRleCgpCi0gICAg
ewotICAgICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFdURjo6TXV0ZXgsIHN0YXRpY0RPTURhdGFM
aXN0TXV0ZXgsICgpKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY0RPTURhdGFMaXN0TXV0ZXg7Ci0g
ICAgfQotCi0gICAgRE9NRGF0YVN0b3JlKERPTURhdGEqIGRvbURhdGEpOwotICAgIHZpcnR1YWwg
fkRPTURhdGFTdG9yZSgpOwotCi0gICAgRE9NRGF0YSogZG9tRGF0YSgpIGNvbnN0IHsgcmV0dXJu
IG1fZG9tRGF0YTsgfQotCi0gICAgdm9pZCogZ2V0RE9NV3JhcHBlck1hcChET01XcmFwcGVyTWFw
VHlwZSB0eXBlKQotICAgIHsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2Ug
RE9NTm9kZU1hcDoKLSAgICAgICAgICAgIHJldHVybiBtX2RvbU5vZGVNYXA7Ci0gICAgICAgIGNh
c2UgRE9NT2JqZWN0TWFwOgotICAgICAgICAgICAgcmV0dXJuIG1fZG9tT2JqZWN0TWFwOwotICAg
ICAgICBjYXNlIEFjdGl2ZURPTU9iamVjdE1hcDoKLSAgICAgICAgICAgIHJldHVybiBtX2FjdGl2
ZURvbU9iamVjdE1hcDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICBjYXNlIERPTVNWR0VsZW1l
bnRJbnN0YW5jZU1hcDoKLSAgICAgICAgICAgIHJldHVybiBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5j
ZU1hcDsKLSAgICAgICAgY2FzZSBET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcDoKLSAgICAgICAg
ICAgIHJldHVybiBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOwotI2VuZGlmCi0gICAgICAg
IH0KLQotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotCi0gICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+JiBkb21Ob2RlTWFwKCkgeyBy
ZXR1cm4gKm1fZG9tTm9kZU1hcDsgfQotICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYg
ZG9tT2JqZWN0TWFwKCkgeyByZXR1cm4gKm1fZG9tT2JqZWN0TWFwOyB9Ci0gICAgSW50ZXJuYWxE
T01XcmFwcGVyTWFwPHZvaWQ+JiBhY3RpdmVEb21PYmplY3RNYXAoKSB7IHJldHVybiAqbV9hY3Rp
dmVEb21PYmplY3RNYXA7IH0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIEludGVybmFsRE9NV3JhcHBl
ck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+JiBkb21TdmdFbGVtZW50SW5zdGFuY2VNYXAoKSB7IHJl
dHVybiAqbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXA7IH0KLSAgICBJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8dm9pZD4mIGRvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwKCkgeyByZXR1cm4gKm1fZG9t
U3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7IH0KLSNlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0gICAgSW50
ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+KiBtX2RvbU5vZGVNYXA7Ci0gICAgSW50ZXJuYWxET01X
cmFwcGVyTWFwPHZvaWQ+KiBtX2RvbU9iamVjdE1hcDsKLSAgICBJbnRlcm5hbERPTVdyYXBwZXJN
YXA8dm9pZD4qIG1fYWN0aXZlRG9tT2JqZWN0TWFwOwotI2lmIEVOQUJMRShTVkcpCi0gICAgSW50
ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4qIG1fZG9tU3ZnRWxlbWVudElu
c3RhbmNlTWFwOwotICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiogbV9kb21TdmdPYmpl
Y3RXaXRoQ29udGV4dE1hcDsKLSNlbmRpZgotCi1wcml2YXRlOgotICAgIC8vIEEgYmFjay1wb2lu
dGVyIHRvIHRoZSBET01EYXRhIHRvIHdoaWNoIHdlIGJlbG9uZy4KLSAgICBET01EYXRhKiBtX2Rv
bURhdGE7Ci19OwotCi0vLyBTY29wZWRET01EYXRhU3RvcmUKLS8vCi0vLyBTY29wZWRET01EYXRh
U3RvcmUgaXMgYSBET01EYXRhU3RvcmUgdGhhdCBjb250cm9scyBsaW1pdHMgdGhlIGxpZmV0aW1l
IG9mCi0vLyB0aGUgc3RvcmUgdG8gdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3QgaXRzZWxmLiAg
SW4gb3RoZXIgd29yZHMsIHdoZW4gdGhlCi0vLyBTY29wZWRET01EYXRhU3RvcmUgb2JqZWN0IGlz
IGRlYWxsb2NhdGVkLCB0aGUgbWFwcyB0aGF0IGJlbG9uZyB0byB0aGUgc3RvcmUKLS8vIGFyZSBk
ZWFsbG9jYXRlZCBhcyB3ZWxsLgotLy8KLWNsYXNzIFNjb3BlZERPTURhdGFTdG9yZSA6IHB1Ymxp
YyBET01EYXRhU3RvcmUgewotcHVibGljOgotICAgIFNjb3BlZERPTURhdGFTdG9yZShET01EYXRh
KiBkb21EYXRhKSA6IERPTURhdGFTdG9yZShkb21EYXRhKQotICAgIHsKLSAgICAgICAgbV9kb21O
b2RlTWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPihkb21EYXRhLCB3ZWFrTm9k
ZUNhbGxiYWNrKTsKLSAgICAgICAgbV9kb21PYmplY3RNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFw
cGVyTWFwPHZvaWQ+KGRvbURhdGEsIHdlYWtET01PYmplY3RDYWxsYmFjayk7Ci0gICAgICAgIG1f
YWN0aXZlRG9tT2JqZWN0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPihkb21E
YXRhLCB3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spOwotI2lmIEVOQUJMRShTVkcpCi0gICAg
ICAgIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1h
cDxTVkdFbGVtZW50SW5zdGFuY2U+KGRvbURhdGEsIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VDYWxs
YmFjayk7Ci0gICAgICAgIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAgPSBuZXcgSW50ZXJu
YWxET01XcmFwcGVyTWFwPHZvaWQ+KGRvbURhdGEsIHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENh
bGxiYWNrKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCB3aGVu
IFdURiB0aHJlYWQgaXMgdGVhcmluZyBkb3duLgotICAgIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCBj
aGlsZCB0aHJlYWRzIHJ1bm5pbmcgVjggaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGJ5IFdURi4KLSAg
ICB2aXJ0dWFsIH5TY29wZWRET01EYXRhU3RvcmUoKQotICAgIHsKLSAgICAgICAgZGVsZXRlIG1f
ZG9tTm9kZU1hcDsKLSAgICAgICAgZGVsZXRlIG1fZG9tT2JqZWN0TWFwOwotICAgICAgICBkZWxl
dGUgbV9hY3RpdmVEb21PYmplY3RNYXA7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgZGVsZXRl
IG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOwotICAgICAgICBkZWxldGUgbV9kb21TdmdPYmpl
Y3RXaXRoQ29udGV4dE1hcDsKLSNlbmRpZgotICAgIH0KLX07Ci0KLS8vIFN0YXRpY0RPTURhdGFT
dG9yZQotLy8KLS8vIFN0YXRpY0RPTURhdGFTdG9yZSBpcyBhIERPTURhdGFTdG9yZSB0aGF0IG1h
bmFnZXMgdGhlIGxpZmV0aW1lIG9mIHRoZSBzdG9yZQotLy8gc3RhdGljYWxseS4gIFRoaXMgZW5j
YXBzdWxhdGVzIHRocmVhZC1zcGVjaWZpYyBET00gZGF0YSBmb3IgdGhlIG1haW4KLS8vIHRocmVh
ZC4gIEFsbCB0aGUgbWFwcyBpbiBpdCBhcmUgc3RhdGljLiAgVGhpcyBpcyBiZWNhdXNlIHdlIGFy
ZSB1bmFibGUgdG8KLS8vIHJlbHkgb24gV1RGOjpUaHJlYWRTcGVjaWZpY1RocmVhZEV4aXQgdG8g
ZG8gdGhlIGNsZWFudXAgc2luY2UgdGhlIHBsYWNlIHRoYXQKLS8vIHRlYXJzIGRvd24gdGhlIG1h
aW4gdGhyZWFkIGNhbiBub3QgY2FsbCBhbnkgV1RGIGZ1bmN0aW9ucy4KLWNsYXNzIFN0YXRpY0RP
TURhdGFTdG9yZSA6IHB1YmxpYyBET01EYXRhU3RvcmUgewotcHVibGljOgotICAgIFN0YXRpY0RP
TURhdGFTdG9yZShET01EYXRhKiBkb21EYXRhKQotICAgICAgICA6IERPTURhdGFTdG9yZShkb21E
YXRhKQotICAgICAgICAsIG1fc3RhdGljRG9tTm9kZU1hcChkb21EYXRhLCB3ZWFrTm9kZUNhbGxi
YWNrKQotICAgICAgICAsIG1fc3RhdGljRG9tT2JqZWN0TWFwKGRvbURhdGEsIHdlYWtET01PYmpl
Y3RDYWxsYmFjaykKLSAgICAgICAgLCBtX3N0YXRpY0FjdGl2ZURvbU9iamVjdE1hcChkb21EYXRh
LCB3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spCi0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAg
LCBtX3N0YXRpY0RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcChkb21EYXRhLCB3ZWFrU1ZHRWxlbWVu
dEluc3RhbmNlQ2FsbGJhY2spCi0gICAgICAgICwgbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29u
dGV4dE1hcChkb21EYXRhLCB3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjaykKLSNlbmRp
ZgotICAgIHsKLSAgICAgICAgbV9kb21Ob2RlTWFwID0gJm1fc3RhdGljRG9tTm9kZU1hcDsKLSAg
ICAgICAgbV9kb21PYmplY3RNYXAgPSAmbV9zdGF0aWNEb21PYmplY3RNYXA7Ci0gICAgICAgIG1f
YWN0aXZlRG9tT2JqZWN0TWFwID0gJm1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwOwotI2lmIEVO
QUJMRShTVkcpCi0gICAgICAgIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwID0gJm1fc3RhdGlj
RG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOwotICAgICAgICBtX2RvbVN2Z09iamVjdFdpdGhDb250
ZXh0TWFwID0gJm1fc3RhdGljRG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7Ci0jZW5kaWYKLSAg
ICB9Ci0KLXByaXZhdGU6Ci0gICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+IG1fc3RhdGlj
RG9tTm9kZU1hcDsKLSAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4gbV9zdGF0aWNEb21P
YmplY3RNYXA7Ci0gICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+IG1fc3RhdGljQWN0aXZl
RG9tT2JqZWN0TWFwOwotICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFu
Y2U+IG1fc3RhdGljRG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOwotICAgIEludGVybmFsRE9NV3Jh
cHBlck1hcDx2b2lkPiBtX3N0YXRpY0RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOwotfTsKLQot
dHlwZWRlZiBXVEY6OlZlY3RvcjxET01EYXRhU3RvcmUqPiBET01EYXRhU3RvcmVMaXN0OwotCi0v
LyBET01EYXRhCi0vLwotLy8gRE9NRGF0YSByZXByZXNlbnRzIHRoZSBhbGwgdGhlIERPTSB3cmFw
cGVycyBmb3IgYSBnaXZlbiB0aHJlYWQuICBJbgotLy8gcGFydGljdWxhciwgRE9NRGF0YSBob2xk
cyB3cmFwcGVycyBmb3IgYWxsIHRoZSBpc29sYXRlZCB3b3JsZHMgaW4gdGhlCi0vLyB0aHJlYWQu
ICBUaGUgRE9NRGF0YSBmb3IgdGhlIG1haW4gdGhyZWFkIGFuZCB0aGUgRE9NRGF0YSBmb3IgY2hp
bGQgdGhyZWFkcwotLy8gdXNlIGRpZmZlcmVudCBzdWJjbGFzc2VzLgotLy8KLWNsYXNzIERPTURh
dGE6IHB1YmxpYyBOb25jb3B5YWJsZSB7Ci1wdWJsaWM6Ci0gICAgRE9NRGF0YSgpCi0gICAgICAg
IDogbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZChmYWxzZSkKLSAgICAgICAgLCBtX2lzTWFp
blRocmVhZChXVEY6OmlzTWFpblRocmVhZCgpKQotICAgICAgICAsIG1fb3duaW5nVGhyZWFkKFdU
Rjo6Y3VycmVudFRocmVhZCgpKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRE9NRGF0YSog
Z2V0Q3VycmVudCgpOwotICAgIHN0YXRpYyBET01EYXRhKiBnZXRDdXJyZW50TWFpblRocmVhZCgp
OyAvLyBDYWxsZXIgbXVzdCBiZSBvbiB0aGUgbWFpbiB0aHJlYWQuCi0gICAgdmlydHVhbCBET01E
YXRhU3RvcmUmIGdldFN0b3JlKCkgPSAwOwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAg
ICBzdGF0aWMgdm9pZCBoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9yZTo6RE9NV3JhcHBlck1h
cFR5cGUgbWFwVHlwZSwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiB2OE9iamVjdCwgVCogZG9tT2Jq
ZWN0KTsKLQotICAgIHZvaWQgZm9yZ2V0RGVsYXllZE9iamVjdCh2b2lkKiBvYmplY3QpIHsgbV9k
ZWxheWVkT2JqZWN0TWFwLnRha2Uob2JqZWN0KTsgfQotCi0gICAgLy8gVGhpcyBpcyB0byBlbnN1
cmUgdGhhdCB3ZSB3aWxsIGRlcmVmIERPTSBvYmplY3RzIGZyb20gdGhlIG93bmluZyB0aHJlYWQs
Ci0gICAgLy8gbm90IHRoZSBHQyB0aHJlYWQuICBUaGUgaGVscGVyIGZ1bmN0aW9uIHdpbGwgYmUg
c2NoZWR1bGVkIGJ5IHRoZSBHQwotICAgIC8vIHRocmVhZCB0byBnZXQgY2FsbGVkIGZyb20gdGhl
IG93bmluZyB0aHJlYWQuCi0gICAgc3RhdGljIHZvaWQgZGVyZWZEZWxheWVkT2JqZWN0c0luQ3Vy
cmVudFRocmVhZCh2b2lkKik7Ci0gICAgdm9pZCBkZXJlZkRlbGF5ZWRPYmplY3RzKCk7Ci0KLSAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXRpYyB2b2lkIHJlbW92ZU9iamVjdHNGcm9t
V3JhcHBlck1hcChET01XcmFwcGVyTWFwPFQ+JiBkb21NYXApOwotCi0gICAgVGhyZWFkSWRlbnRp
ZmllciBvd25pbmdUaHJlYWQoKSBjb25zdCB7IHJldHVybiBtX293bmluZ1RocmVhZDsgfQotCi1w
cml2YXRlOgotICAgIHR5cGVkZWYgV1RGOjpIYXNoTWFwPHZvaWQqLCBWOENsYXNzSW5kZXg6OlY4
V3JhcHBlclR5cGU+IERlbGF5ZWRPYmplY3RNYXA7Ci0KLSAgICB2b2lkIGVuc3VyZURlcmVmKFY4
Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpOwotICAgIHN0
YXRpYyB2b2lkIGRlcmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2
b2lkKiBkb21PYmplY3QpOwotCi0gICAgLy8gU3RvcmVzIGFsbCB0aGUgRE9NIG9iamVjdHMgdGhh
dCBhcmUgZGVsYXllZCB0byBiZSBwcm9jZXNzZWQgd2hlbiB0aGUgb3duaW5nIHRocmVhZCBnYWlu
cyBjb250cm9sLgotICAgIERlbGF5ZWRPYmplY3RNYXAgbV9kZWxheWVkT2JqZWN0TWFwOwotCi0g
ICAgLy8gVGhlIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHRhc2sgdG8gZG8gdGhlIGRlbGF5ZWQg
cHJvY2VzcyBoYXMgYWxyZWFkeSBiZWVuIHBvc3RlZC4KLSAgICBib29sIG1fZGVsYXllZFByb2Nl
c3NpbmdTY2hlZHVsZWQ7Ci0KLSAgICBib29sIG1faXNNYWluVGhyZWFkOwotICAgIFRocmVhZElk
ZW50aWZpZXIgbV9vd25pbmdUaHJlYWQ7Ci19OwotCi1jbGFzcyBNYWluVGhyZWFkRE9NRGF0YSA6
IHB1YmxpYyBET01EYXRhIHsKLXB1YmxpYzoKLSAgICBNYWluVGhyZWFkRE9NRGF0YSgpIDogbV9k
ZWZhdWx0U3RvcmUodGhpcykgeyB9Ci0KLSAgICBET01EYXRhU3RvcmUmIGdldFN0b3JlKCkKLSAg
ICB7Ci0gICAgICAgIEFTU0VSVChXVEY6OmlzTWFpblRocmVhZCgpKTsKLSAgICAgICAgVjhJc29s
YXRlZFdvcmxkKiB3b3JsZCA9IFY4SXNvbGF0ZWRXb3JsZDo6Z2V0RW50ZXJlZCgpOwotICAgICAg
ICBpZiAod29ybGQpCi0gICAgICAgICAgICByZXR1cm4gKndvcmxkLT5nZXRET01EYXRhU3RvcmUo
KTsKLSAgICAgICAgcmV0dXJuIG1fZGVmYXVsdFN0b3JlOwotICAgIH0KLQotcHJpdmF0ZToKLSAg
ICBTdGF0aWNET01EYXRhU3RvcmUgbV9kZWZhdWx0U3RvcmU7Ci0gICAgLy8gTm90ZTogVGhlIERP
TURhdGFTdG9yZXMgZm9yIGlzb2xhdGVkIHdvcmxkIGFyZSBvd25lZCBieSB0aGUgd29ybGQgb2Jq
ZWN0LgotfTsKLQotY2xhc3MgQ2hpbGRUaHJlYWRET01EYXRhIDogcHVibGljIERPTURhdGEgewot
cHVibGljOgotICAgIENoaWxkVGhyZWFkRE9NRGF0YSgpIDogbV9kZWZhdWx0U3RvcmUodGhpcykg
eyB9Ci0KLSAgICBET01EYXRhU3RvcmUmIGdldFN0b3JlKCkgewotICAgICAgICBBU1NFUlQoIVdU
Rjo6aXNNYWluVGhyZWFkKCkpOwotICAgICAgICAvLyBDdXJyZW50bHksIGNoaWxkIHRocmVhZHMg
aGF2ZSBvbmx5IG9uZSB3b3JsZC4KLSAgICAgICAgcmV0dXJuIG1fZGVmYXVsdFN0b3JlOwotICAg
IH0KLQotcHJpdmF0ZToKLSAgICBTY29wZWRET01EYXRhU3RvcmUgbV9kZWZhdWx0U3RvcmU7Ci19
OwotCi1ET01EYXRhU3RvcmU6OkRPTURhdGFTdG9yZShET01EYXRhKiBkb21EYXRhKQotICAgIDog
bV9kb21Ob2RlTWFwKDApCi0gICAgLCBtX2RvbU9iamVjdE1hcCgwKQotICAgICwgbV9hY3RpdmVE
b21PYmplY3RNYXAoMCkKLSNpZiBFTkFCTEUoU1ZHKQotICAgICwgbV9kb21TdmdFbGVtZW50SW5z
dGFuY2VNYXAoMCkKLSAgICAsIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoMCkKLSNlbmRp
ZgotICAgICwgbV9kb21EYXRhKGRvbURhdGEpCi17Ci0gICAgV1RGOjpNdXRleExvY2tlciBsb2Nr
ZXIoRE9NRGF0YVN0b3JlOjphbGxTdG9yZXNNdXRleCgpKTsKLSAgICBET01EYXRhU3RvcmU6OmFs
bFN0b3JlcygpLmFwcGVuZCh0aGlzKTsKLX0KLQotRE9NRGF0YVN0b3JlOjp+RE9NRGF0YVN0b3Jl
KCkKLXsKLSAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihET01EYXRhU3RvcmU6OmFsbFN0b3Jl
c011dGV4KCkpOwotICAgIERPTURhdGFTdG9yZTo6YWxsU3RvcmVzKCkucmVtb3ZlKERPTURhdGFT
dG9yZTo6YWxsU3RvcmVzKCkuZmluZCh0aGlzKSk7Ci19Ci0KIERPTURhdGFTdG9yZUhhbmRsZTo6
RE9NRGF0YVN0b3JlSGFuZGxlKCkKICAgICA6IG1fc3RvcmUobmV3IFNjb3BlZERPTURhdGFTdG9y
ZShET01EYXRhOjpnZXRDdXJyZW50KCkpKQogewpAQCAtMzkzLDEzICs0Nyw2IEBAIERPTURhdGFT
dG9yZUhhbmRsZTo6fkRPTURhdGFTdG9yZUhhbmRsZSgKIHsKIH0KIAotdGVtcGxhdGUgPGNsYXNz
IEtleVR5cGU+Ci12b2lkIERPTURhdGFTdG9yZTo6SW50ZXJuYWxET01XcmFwcGVyTWFwPEtleVR5
cGU+Ojpmb3JnZXQoS2V5VHlwZSogb2JqZWN0KQotewotICAgIERPTVdyYXBwZXJNYXA8S2V5VHlw
ZT46OmZvcmdldChvYmplY3QpOwotICAgIG1fZG9tRGF0YS0+Zm9yZ2V0RGVsYXllZE9iamVjdChv
YmplY3QpOwotfQotCiBET01XcmFwcGVyTWFwPE5vZGU+JiBnZXRET01Ob2RlTWFwKCkKIHsKICAg
ICAvLyBOb2RlcyBvbmx5IGV4aXN0IG9uIHRoZSBtYWluIHRocmVhZC4KQEAgLTQzMSwxNzQgKzc4
LDYgQEAgRE9NV3JhcHBlck1hcDx2b2lkPiYgZ2V0RE9NU1ZHT2JqZWN0V2l0aAogCiAjZW5kaWYg
Ly8gRU5BQkxFKFNWRykKIAotRE9NRGF0YSogRE9NRGF0YTo6Z2V0Q3VycmVudCgpCi17Ci0gICAg
aWYgKFdURjo6aXNNYWluVGhyZWFkKCkpCi0gICAgICAgIHJldHVybiBnZXRDdXJyZW50TWFpblRo
cmVhZCgpOwotCi0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChXVEY6OlRocmVhZFNwZWNpZmljPENo
aWxkVGhyZWFkRE9NRGF0YT4sIGNoaWxkVGhyZWFkRE9NRGF0YSwgKCkpOwotICAgIHJldHVybiBj
aGlsZFRocmVhZERPTURhdGE7Ci19Ci0KLURPTURhdGEqIERPTURhdGE6OmdldEN1cnJlbnRNYWlu
VGhyZWFkKCkKLXsKLSAgICBBU1NFUlQoV1RGOjppc01haW5UaHJlYWQoKSk7Ci0gICAgREVGSU5F
X1NUQVRJQ19MT0NBTChNYWluVGhyZWFkRE9NRGF0YSwgbWFpblRocmVhZERPTURhdGEsICgpKTsK
LSAgICByZXR1cm4gJm1haW5UaHJlYWRET01EYXRhOwotfQotCi0vLyBDYWxsZWQgd2hlbiB0aGUg
ZGVhZCBvYmplY3QgaXMgbm90IGluIEdDIHRocmVhZCdzIG1hcC4gR28gdGhyb3VnaCBhbGwgdGhy
ZWFkIG1hcHMgdG8gZmluZCB0aGUgb25lIGNvbnRhaW5pbmcgaXQuCi0vLyBUaGVuIGNsZWFyIHRo
ZSBKUyByZWZlcmVuY2UgYW5kIHB1c2ggdGhlIERPTSBvYmplY3QgaW50byB0aGUgZGVsYXllZCBx
dWV1ZSBmb3IgaXQgdG8gYmUgZGVyZWYtZWQgYXQgbGF0ZXIgdGltZSBmcm9tIHRoZSBvd25pbmcg
dGhyZWFkLgotLy8gKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBHQyB0aHJlYWQgaXMgbm90IHRo
ZSBvd25pbmcgdGhyZWFkLgotLy8gKiBUaGlzIGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZCB0
aGF0IGhhcyBHQyBydW5uaW5nLgotLy8gKiBPbmx5IG9uZSBWOCBpbnN0YW5jZSBpcyBydW5uaW5n
IGF0IGEgdGltZSBkdWUgdG8gVjg6OkxvY2tlci4gU28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBh
Ym91dCBjb25jdXJyZW5jeS4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIERPTURhdGE6Omhh
bmRsZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpET01XcmFwcGVyTWFwVHlwZSBtYXBUeXBlLCB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHY4T2JqZWN0LCBUKiBkb21PYmplY3QpCi17Ci0KLSAgICBX
VEY6Ok11dGV4TG9ja2VyIGxvY2tlcihET01EYXRhU3RvcmU6OmFsbFN0b3Jlc011dGV4KCkpOwot
ICAgIERPTURhdGFMaXN0JiBsaXN0ID0gRE9NRGF0YVN0b3JlOjphbGxTdG9yZXMoKTsKLSAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgRE9NRGF0
YVN0b3JlKiBzdG9yZSA9IGxpc3RbaV07Ci0KLSAgICAgICAgRE9NRGF0YVN0b3JlOjpJbnRlcm5h
bERPTVdyYXBwZXJNYXA8VD4qIGRvbU1hcCA9IHN0YXRpY19jYXN0PERPTURhdGFTdG9yZTo6SW50
ZXJuYWxET01XcmFwcGVyTWFwPFQ+Kj4oc3RvcmUtPmdldERPTVdyYXBwZXJNYXAobWFwVHlwZSkp
OwotCi0gICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGRvbU1hcC0+Z2V0
KGRvbU9iamVjdCk7Ci0gICAgICAgIGlmICgqd3JhcHBlciA9PSAqdjhPYmplY3QpIHsKLSAgICAg
ICAgICAgIC8vIENsZWFyIHRoZSBKUyByZWZlcmVuY2UuCi0gICAgICAgICAgICBkb21NYXAtPmZv
cmdldE9ubHkoZG9tT2JqZWN0KTsKLSAgICAgICAgICAgIHN0b3JlLT5kb21EYXRhKCktPmVuc3Vy
ZURlcmVmKFY4RE9NV3JhcHBlcjo6ZG9tV3JhcHBlclR5cGUodjhPYmplY3QpLCBkb21PYmplY3Qp
OwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIERPTURhdGE6OmVuc3VyZURlcmVmKFY4Q2xh
c3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpCi17Ci0gICAgaWYg
KG1fb3duaW5nVGhyZWFkID09IFdURjo6Y3VycmVudFRocmVhZCgpKSB7Ci0gICAgICAgIC8vIE5v
IG5lZWQgdG8gZGVsYXkgdGhlIHdvcmsuICBXZSBjYW4gZGVyZWYgcmlnaHQgbm93LgotICAgICAg
ICBkZXJlZk9iamVjdCh0eXBlLCBkb21PYmplY3QpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgLy8gV2UgbmVlZCB0byBkbyB0aGUgZGVyZWYgb24gdGhlIGNvcnJlY3QgdGhyZWFkLgot
ICAgIG1fZGVsYXllZE9iamVjdE1hcC5zZXQoZG9tT2JqZWN0LCB0eXBlKTsKLQotICAgIC8vIFBv
c3QgYSB0YXNrIHRvIHRoZSBvd25pbmcgdGhyZWFkIGluIG9yZGVyIHRvIHByb2Nlc3MgdGhlIGRl
bGF5ZWQgcXVldWUuCi0gICAgLy8gRklYTUU6IEZvciBub3csIHdlIGNhbiBvbmx5IHBvc3QgdG8g
bWFpbiB0aHJlYWQgZHVlIHRvIFdURiB0YXNrIHBvc3RpbmcgbGltaXRhdGlvbi4gV2Ugd2lsbCBm
aXggdGhpcyB3aGVuIHdlIHdvcmsgb24gbmVzdGVkIHdvcmtlci4KLSAgICBpZiAoIW1fZGVsYXll
ZFByb2Nlc3NpbmdTY2hlZHVsZWQpIHsKLSAgICAgICAgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVk
dWxlZCA9IHRydWU7Ci0gICAgICAgIGlmIChpc01haW5UaHJlYWQoKSkKLSAgICAgICAgICAgIFdU
Rjo6Y2FsbE9uTWFpblRocmVhZCgmZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVhZCwg
MCk7Ci0gICAgfQotfQotCi0vLyBDYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIG5lYXIgZGVhdGgg
KG5vdCByZWFjaGFibGUgZnJvbSBKUyByb290cykuCi0vLyBJdCBpcyB0aW1lIHRvIHJlbW92ZSB0
aGUgZW50cnkgZnJvbSB0aGUgdGFibGUgYW5kIGRpc3Bvc2UgdGhlIGhhbmRsZS4KLXN0YXRpYyB2
b2lkIHdlYWtET01PYmplY3RDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2Jq
ZWN0LCB2b2lkKiBkb21PYmplY3QpCi17Ci0gICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOwotICAg
IEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7Ci0gICAgRE9NRGF0YTo6aGFuZGxlV2Vha09i
amVjdChET01EYXRhU3RvcmU6OkRPTU9iamVjdE1hcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6
Q2FzdCh2OE9iamVjdCksIGRvbU9iamVjdCk7Ci19Ci0KLXZvaWQgd2Vha0FjdGl2ZURPTU9iamVj
dENhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9i
amVjdCkKLXsKLSAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7Ci0gICAgQVNTRVJUKHY4T2JqZWN0
LT5Jc09iamVjdCgpKTsKLSAgICBET01EYXRhOjpoYW5kbGVXZWFrT2JqZWN0KERPTURhdGFTdG9y
ZTo6QWN0aXZlRE9NT2JqZWN0TWFwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2Jq
ZWN0KSwgZG9tT2JqZWN0KTsKLX0KLQotc3RhdGljIHZvaWQgd2Vha05vZGVDYWxsYmFjayh2ODo6
UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpCi17Ci0gICAg
djg6OkhhbmRsZVNjb3BlIHNjb3BlOwotICAgIEFTU0VSVCh2OE9iamVjdC0+SXNPYmplY3QoKSk7
Ci0gICAgRE9NRGF0YTo6aGFuZGxlV2Vha09iamVjdDxOb2RlPihET01EYXRhU3RvcmU6OkRPTU5v
ZGVNYXAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBzdGF0aWNfY2Fz
dDxOb2RlKj4oZG9tT2JqZWN0KSk7Ci19Ci0KLSNpZiBFTkFCTEUoU1ZHKQotCi1zdGF0aWMgdm9p
ZCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVl
PiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQotewotICAgIHY4OjpIYW5kbGVTY29wZSBzY29w
ZTsKLSAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOwotICAgIERPTURhdGE6OmhhbmRs
ZVdlYWtPYmplY3QoRE9NRGF0YVN0b3JlOjpET01TVkdFbGVtZW50SW5zdGFuY2VNYXAsIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD46OkNhc3QodjhPYmplY3QpLCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50
SW5zdGFuY2UqPihkb21PYmplY3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd2Vha1NWR09iamVjdFdp
dGhDb250ZXh0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9p
ZCogZG9tT2JqZWN0KQotewotICAgIHY4OjpIYW5kbGVTY29wZSBzY29wZTsKLSAgICBBU1NFUlQo
djhPYmplY3QtPklzT2JqZWN0KCkpOwotICAgIERPTURhdGE6OmhhbmRsZVdlYWtPYmplY3QoRE9N
RGF0YVN0b3JlOjpET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCwgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0Pjo6Q2FzdCh2OE9iamVjdCksIGRvbU9iamVjdCk7Ci19Ci0KLSNlbmRpZiAgLy8gRU5BQkxF
KFNWRykKLQotdm9pZCBET01EYXRhOjpkZXJlZk9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZSwgdm9pZCogZG9tT2JqZWN0KQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAg
IGNhc2UgVjhDbGFzc0luZGV4OjpOT0RFOgotICAgICAgICBzdGF0aWNfY2FzdDxOb2RlKj4oZG9t
T2JqZWN0KS0+ZGVyZWYoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSNkZWZpbmUgTWFrZUNhc2UodHlw
ZSwgbmFtZSkgICBcCi0gICAgICAgIGNhc2UgVjhDbGFzc0luZGV4Ojp0eXBlOiBzdGF0aWNfY2Fz
dDxuYW1lKj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJlYWs7Ci0gICAgRE9NX09CSkVDVF9UWVBF
UyhNYWtlQ2FzZSkgICAvLyBUaGlzIGluY2x1ZGVzIGJvdGggYWN0aXZlIGFuZCBub24tYWN0aXZl
LgotI3VuZGVmIE1ha2VDYXNlCi0KLSNpZiBFTkFCTEUoU1ZHKQotI2RlZmluZSBNYWtlQ2FzZSh0
eXBlLCBuYW1lKSAgICAgXAotICAgICAgICBjYXNlIFY4Q2xhc3NJbmRleDo6dHlwZTogc3RhdGlj
X2Nhc3Q8bmFtZSo+KGRvbU9iamVjdCktPmRlcmVmKCk7IGJyZWFrOwotICAgIFNWR19PQkpFQ1Rf
VFlQRVMoTWFrZUNhc2UpICAgLy8gVGhpcyBhbHNvIGluY2x1ZGVzIFNWR0VsZW1lbnRJbnN0YW5j
ZS4KLSN1bmRlZiBNYWtlQ2FzZQotCi0jZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgICBc
Ci0gICAgICAgIGNhc2UgVjhDbGFzc0luZGV4Ojp0eXBlOiAgICBcCi0gICAgICAgICAgICBzdGF0
aWNfY2FzdDxWOFNWR1BPRFR5cGVXcmFwcGVyPG5hbWU+Kj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsg
YnJlYWs7Ci0gICAgU1ZHX1BPRF9OQVRJVkVfVFlQRVMoTWFrZUNhc2UpCi0jdW5kZWYgTWFrZUNh
c2UKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBET01EYXRhOjpkZXJlZkRlbGF5ZWRP
YmplY3RzKCkKLXsKLSAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihET01EYXRhU3RvcmU6OmFs
bFN0b3Jlc011dGV4KCkpOwotCi0gICAgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZCA9IGZh
bHNlOwotCi0gICAgZm9yIChEZWxheWVkT2JqZWN0TWFwOjppdGVyYXRvciBpdGVyKG1fZGVsYXll
ZE9iamVjdE1hcC5iZWdpbigpKTsgaXRlciAhPSBtX2RlbGF5ZWRPYmplY3RNYXAuZW5kKCk7ICsr
aXRlcikKLSAgICAgICAgZGVyZWZPYmplY3QoaXRlci0+c2Vjb25kLCBpdGVyLT5maXJzdCk7Ci0K
LSAgICBtX2RlbGF5ZWRPYmplY3RNYXAuY2xlYXIoKTsKLX0KLQotdm9pZCBET01EYXRhOjpkZXJl
ZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkKHZvaWQqKQotewotICAgIGdldEN1cnJlbnQo
KS0+ZGVyZWZEZWxheWVkT2JqZWN0cygpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9p
ZCBET01EYXRhOjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXAoRE9NV3JhcHBlck1hcDxUPiYg
ZG9tTWFwKQotewotICAgIGZvciAodHlwZW5hbWUgV1RGOjpIYXNoTWFwPFQqLCB2ODo6T2JqZWN0
Kj46Oml0ZXJhdG9yIGl0ZXIoZG9tTWFwLmltcGwoKS5iZWdpbigpKTsgaXRlciAhPSBkb21NYXAu
aW1wbCgpLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgICAgVCogZG9tT2JqZWN0ID0gc3RhdGljX2Nh
c3Q8VCo+KGl0ZXItPmZpcnN0KTsKLSAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4g
djhPYmplY3QoaXRlci0+c2Vjb25kKTsKLQotICAgICAgICBWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZSA9IFY4RE9NV3JhcHBlcjo6ZG9tV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6
T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwotCi0gICAgICAgIC8vIERlcmVmIHRoZSBET00gb2Jq
ZWN0LgotICAgICAgICBkZXJlZk9iamVjdCh0eXBlLCBkb21PYmplY3QpOwotCi0gICAgICAgIC8v
IENsZWFyIHRoZSBKUyB3cmFwcGVyLgotICAgICAgICB2OE9iamVjdC5EaXNwb3NlKCk7Ci0gICAg
fQotICAgIGRvbU1hcC5pbXBsKCkuY2xlYXIoKTsKLX0KLQogc3RhdGljIHZvaWQgcmVtb3ZlQWxs
RE9NT2JqZWN0c0luQ3VycmVudFRocmVhZEhlbHBlcigpCiB7CiAgICAgdjg6OkhhbmRsZVNjb3Bl
IHNjb3BlOw==
</data>

          </attachment>
      

    </bug>

</bugzilla>