<?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>93496</bug_id>
          
          <creation_ts>2012-08-08 10:45:26 -0700</creation_ts>
          <short_desc>[BlackBerry] Add RSS content handling support</short_desc>
          <delta_ts>2012-08-22 08:31:29 -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>WebKit BlackBerry</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</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="Lyon Chen">liachen</reporter>
          <assigned_to name="Rob Buis">rwlbuis</assigned_to>
          <cc>gyuyoung.kim</cc>
    
    <cc>joenotcharles</cc>
    
    <cc>mifenton</cc>
    
    <cc>rakuco</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yong.li.webkit</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>690498</commentid>
    <comment_count>0</comment_count>
    <who name="Lyon Chen">liachen</who>
    <bug_when>2012-08-08 10:45:26 -0700</bug_when>
    <thetext>Righ now the RSS handling in WebKit BlackBerry portal is handled in platform level, but it should be in WebKit layer, so it can use the TextEncoding codes of WebKit, thus avoid inconsistency of text encoding handling.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699629</commentid>
    <comment_count>1</comment_count>
      <attachid>159465</attachid>
    <who name="Lyon Chen">liachen</who>
    <bug_when>2012-08-20 10:13:19 -0700</bug_when>
    <thetext>Created attachment 159465
patch for 93496.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699631</commentid>
    <comment_count>2</comment_count>
    <who name="Lyon Chen">liachen</who>
    <bug_when>2012-08-20 10:16:10 -0700</bug_when>
    <thetext>+Yong, Rob, Joe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699650</commentid>
    <comment_count>3</comment_count>
      <attachid>159465</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-08-20 10:31:44 -0700</bug_when>
    <thetext>Comment on attachment 159465
patch for 93496.

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

Some minor issues so far and you need a ChangeLog.

&gt; Source/WebCore/platform/network/blackberry/rss/RSSGenerator.h:22
&gt; +#include &lt;wtf/text/WTFString.h&gt;

It does not seem like you need this include.

&gt; Source/WebCore/platform/network/blackberry/rss/RSSParserBase.cpp:113
&gt; +    WTF::String text;

You do not need this WTF:: prefix for String.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699708</commentid>
    <comment_count>4</comment_count>
    <who name="Lyon Chen">liachen</who>
    <bug_when>2012-08-20 11:14:12 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Some minor issues so far and you need a ChangeLog.

Will add ChangeLog.

&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/rss/RSSParserBase.cpp:113
&gt; &gt; +    WTF::String text;
&gt; 
&gt; You do not need this WTF:: prefix for String.

Will change accordingly.

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700377</commentid>
    <comment_count>5</comment_count>
      <attachid>159596</attachid>
    <who name="Lyon Chen">liachen</who>
    <bug_when>2012-08-20 19:55:11 -0700</bug_when>
    <thetext>Created attachment 159596
Updated patch based on rob&apos;s comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700787</commentid>
    <comment_count>6</comment_count>
      <attachid>159596</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-08-21 08:21:36 -0700</bug_when>
    <thetext>Comment on attachment 159596
Updated patch based on rob&apos;s comment.

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

Looks good, can do with some more cleanup.

&gt; Source/WebCore/platform/network/blackberry/NetworkJob.cpp:37
&gt; +#include &quot;rss/RSSFilterStream.h&quot;

I am not sure that you need to do this, the PlatformBlackBerry.cmake change suggests you can leave the rss/ off.

&gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:62
&gt; +static inline bool isControlCharacter(int data)

I wonder if there is a stdlib function for this.

&gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:67
&gt; +static int isspaceSafe(int ch)

What is meant here by &quot;Safe&quot;?

&gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:117
&gt; +    for (size_t start = 0, delimiter = 0;delimiter != std::string::npos; start = delimiter + 1) {

Fix spacing please ; delimiter

&gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:326
&gt; +        || (!strcasecmp(language, &quot;en-US&quot;)))

No need to wrap this line.

&gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:667
&gt; +        // make sure the headers are never sent twice

Please try to make all comments end with a period and start with a capital. Right now it is a bit inconsistent.

&gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.h:32
&gt; +        TYPE_UNKNOWN = 0,

The = 0 is not strictly needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700860</commentid>
    <comment_count>7</comment_count>
    <who name="Lyon Chen">liachen</who>
    <bug_when>2012-08-21 09:58:16 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; I am not sure that you need to do this, the PlatformBlackBerry.cmake change suggests you can leave the rss/ off.

Yes, forgot this.

&gt; &gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:62
&gt; &gt; +static inline bool isControlCharacter(int data)
&gt; 
&gt; I wonder if there is a stdlib function for this.

Somehow I forgot to remove it as it is not used now, I use isASCIIPrintable() in where it was used.

&gt; &gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:67
&gt; &gt; +static int isspaceSafe(int ch)
&gt; 
&gt; What is meant here by &quot;Safe&quot;?

The &quot;Safe&quot; means just the lowest byte is checked. But I agree it is not very descriptive and I am open to better names.

&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:117
&gt; &gt; +    for (size_t start = 0, delimiter = 0;delimiter != std::string::npos; start = delimiter + 1) {
&gt; 
&gt; Fix spacing please ; delimiter

Will change.

&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:326
&gt; &gt; +        || (!strcasecmp(language, &quot;en-US&quot;)))
&gt; 
&gt; No need to wrap this line.

Will change.

&gt; Please try to make all comments end with a period and start with a capital. Right now it is a bit inconsistent.

Will change.

&gt; 
&gt; &gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.h:32
&gt; &gt; +        TYPE_UNKNOWN = 0,
&gt; 
&gt; The = 0 is not strictly needed.

It seems quite some enum in WebKit has the first value = 0 style. And in all my codes I use this style. So I am not sure whether I should change it. But if you feel remove this &quot;= 0,&quot; is desired, I can remove it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700876</commentid>
    <comment_count>8</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-08-21 10:18:40 -0700</bug_when>
    <thetext>&gt; &gt; &gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.cpp:67
&gt; &gt; &gt; +static int isspaceSafe(int ch)
&gt; &gt; 
&gt; &gt; What is meant here by &quot;Safe&quot;?
&gt; 
&gt; The &quot;Safe&quot; means just the lowest byte is checked. But I agree it is not very descriptive and I am open to better names.

Something like isASCIISpaceLowerByte would be better.

&gt; &gt; &gt; Source/WebCore/platform/network/blackberry/rss/RSSFilterStream.h:32
&gt; &gt; &gt; +        TYPE_UNKNOWN = 0,
&gt; &gt; 
&gt; &gt; The = 0 is not strictly needed.
&gt; 
&gt; It seems quite some enum in WebKit has the first value = 0 style. And in all my codes I use this style. So I am not sure whether I should change it. But if you feel remove this &quot;= 0,&quot; is desired, I can remove it.

Yes please remove the = 0, also use camelCase for enum values.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700918</commentid>
    <comment_count>9</comment_count>
      <attachid>159723</attachid>
    <who name="Lyon Chen">liachen</who>
    <bug_when>2012-08-21 10:50:23 -0700</bug_when>
    <thetext>Created attachment 159723
Update patch based on rwlbuis&apos; comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700940</commentid>
    <comment_count>10</comment_count>
      <attachid>159723</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-08-21 11:11:46 -0700</bug_when>
    <thetext>Comment on attachment 159723
Update patch based on rwlbuis&apos; comments.

Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>701342</commentid>
    <comment_count>11</comment_count>
      <attachid>159723</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-21 17:14:21 -0700</bug_when>
    <thetext>Comment on attachment 159723
Update patch based on rwlbuis&apos; comments.

Clearing flags on attachment: 159723

Committed r126230: &lt;http://trac.webkit.org/changeset/126230&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>701343</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-21 17:14:25 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>701919</commentid>
    <comment_count>13</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-08-22 08:09:59 -0700</bug_when>
    <thetext>Reopening, I found some cleanup possibilities.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>701923</commentid>
    <comment_count>14</comment_count>
      <attachid>159936</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-08-22 08:12:30 -0700</bug_when>
    <thetext>Created attachment 159936
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>701943</commentid>
    <comment_count>15</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-08-22 08:31:29 -0700</bug_when>
    <thetext>Committed r126303: &lt;http://trac.webkit.org/changeset/126303&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>159465</attachid>
            <date>2012-08-20 10:13:19 -0700</date>
            <delta_ts>2012-08-20 19:55:11 -0700</delta_ts>
            <desc>patch for 93496.</desc>
            <filename>93496.patch</filename>
            <type>text/plain</type>
            <size>72235</size>
            <attacher name="Lyon Chen">liachen</attacher>
            
              <data encoding="base64">Y29tbWl0IDVkMGU5ZmE1NWFiNWU4ZTgxNTA4MGRlZmRiM2NiMzE5ZDAxYWM2ZWEKQXV0aG9yOiBM
aWFuZ2h1aSBDaGVuIDxsaWFjaGVuQHJpbS5jb20+CkRhdGU6ICAgRnJpIEF1ZyAxNyAwMDo1Mzoy
OSAyMDEyIC0wNDAwCgogICAgMjAxMi0wOC0xNiAgTGlhbmdodWkgQ2hlbiAgPGxpYWNoZW5Acmlt
LmNvbT4KICAgIAogICAgICAgICAgICBNb3ZlIFJTU0ZpbHRlclN0cmVhbSBpbnRvIFdlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy4KICAgIAogICAgICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KICAgIAogICAgICAgICAgICBObyBuZXcgdGVzdHMuIChPT1BT
ISkKICAgIAogICAgICAgICAgICAqIFBsYXRmb3JtQmxhY2tCZXJyeS5jbWFrZToKICAgICAgICAg
ICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5jcHA6CiAgICAgICAg
ICAgIChXZWJDb3JlOjpOZXR3b3JrSm9iOjppbml0aWFsaXplKToKICAgICAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzEwUGFyc2VyLmNwcDogQWRkZWQuCiAgICAg
ICAgICAgIChXZWJDb3JlKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTUzEwUGFyc2VyOjpSU1Mx
MFBhcnNlcik6CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1MxMFBhcnNlcjo6cGFyc2VCdWZmZXIp
OgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTMTBQYXJzZXI6OnBhcnNlWG1sRG9jKToKICAgICAg
ICAgICAgKFdlYkNvcmU6OlJTUzEwUGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKToKICAg
ICAgICAgICAgKFdlYkNvcmU6OlJTUzEwUGFyc2VyOjpwYXJzZUl0ZW0pOgogICAgICAgICAgICAo
V2ViQ29yZTo6UlNTMTBQYXJzZXI6OnBhcnNlRmVlZCk6CiAgICAgICAgICAgICogcGxhdGZvcm0v
bmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBhcnNlci5oOiBBZGRlZC4KICAgICAgICAgICAg
KFdlYkNvcmUpOgogICAgICAgICAgICAoUlNTMTBQYXJzZXIpOgogICAgICAgICAgICAqIHBsYXRm
b3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMjBQYXJzZXIuY3BwOiBBZGRlZC4KICAgICAg
ICAgICAgKFdlYkNvcmUpOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTMjBQYXJzZXI6OlJTUzIw
UGFyc2VyKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTUzIwUGFyc2VyOjpwYXJzZUJ1ZmZlcik6
CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1MyMFBhcnNlcjo6cGFyc2VYbWxEb2MpOgogICAgICAg
ICAgICAoV2ViQ29yZTo6UlNTMjBQYXJzZXI6OnBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUpOgogICAg
ICAgICAgICAoV2ViQ29yZTo6UlNTMjBQYXJzZXI6OnBhcnNlSXRlbSk6CiAgICAgICAgICAgIChX
ZWJDb3JlOjpSU1MyMFBhcnNlcjo6cGFyc2VGZWVkKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJT
UzIwUGFyc2VyOjpwYXJzZUVuY2xvc3VyZSk6CiAgICAgICAgICAgICogcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5L3Jzcy9SU1MyMFBhcnNlci5oOiBBZGRlZC4KICAgICAgICAgICAgKFdlYkNv
cmUpOgogICAgICAgICAgICAoUlNTMjBQYXJzZXIpOgogICAgICAgICAgICAqIHBsYXRmb3JtL25l
dHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTQXRvbVBhcnNlci5jcHA6IEFkZGVkLgogICAgICAgICAg
ICAoV2ViQ29yZSk6CiAgICAgICAgICAgIChXZWJDb3JlOjppc1JlbGF0aXZlUGF0aCk6CiAgICAg
ICAgICAgIChXZWJDb3JlOjpSU1NBdG9tTGluazo6cmVsVHlwZSk6CiAgICAgICAgICAgIChXZWJD
b3JlOjpSU1NBdG9tUGFyc2VyOjpSU1NBdG9tUGFyc2VyKToKICAgICAgICAgICAgKFdlYkNvcmU6
OlJTU0F0b21QYXJzZXI6OnBhcnNlQnVmZmVyKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTU0F0
b21QYXJzZXI6OnBhcnNlWG1sRG9jKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJz
ZXI6OnBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUpOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTQXRv
bVBhcnNlcjo6cGFyc2VJdGVtKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6
OnBhcnNlRmVlZCk6CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUxp
bmspOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTQXRvbVBhcnNlcjo6ZW5jbG9zdXJlRnJvbUxp
bmspOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTQXRvbVBhcnNlcjo6cGFyc2VDb250ZW50KToK
ICAgICAgICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6OnBhcnNlQXV0aG9yKToKICAgICAg
ICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6OnBhcnNlQ2F0ZWdvcnkpOgogICAgICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTQXRvbVBhcnNlci5oOiBBZGRl
ZC4KICAgICAgICAgICAgKFdlYkNvcmUpOgogICAgICAgICAgICAoUlNTQXRvbUxpbmspOgogICAg
ICAgICAgICAoV2ViQ29yZTo6UlNTQXRvbUxpbms6OlJTU0F0b21MaW5rKToKICAgICAgICAgICAg
KFJTU0F0b21QYXJzZXIpOgogICAgICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9yc3MvUlNTRmlsdGVyU3RyZWFtLmNwcDogQWRkZWQuCiAgICAgICAgICAgIChXZWJDb3JlKToK
ICAgICAgICAgICAgKFdlYkNvcmU6OmlzQ29udHJvbENoYXJhY3Rlcik6CiAgICAgICAgICAgIChX
ZWJDb3JlOjppc3NwYWNlX3NhZmUpOgogICAgICAgICAgICAoV2ViQ29yZTo6c3RyaXBXaGl0ZVNw
YWNlKToKICAgICAgICAgICAgKFdlYkNvcmU6OmVxdWFsSWdub3JpbmdDYXNlKToKICAgICAgICAg
ICAgKFdlYkNvcmU6OmlzQXRvbU1JTUVUeXBlKToKICAgICAgICAgICAgKFdlYkNvcmU6OmlzUlNT
TUlNRVR5cGUpOgogICAgICAgICAgICAoV2ViQ29yZTo6aXNQb3RlbnRpYWxSU1NNSU1FVHlwZSk6
CiAgICAgICAgICAgIChXZWJDb3JlOjppc1JTU0NvbnRlbnQpOgogICAgICAgICAgICAoV2ViQ29y
ZTo6UlNTVHlwZUZyb21Db250ZW50VHlwZSk6CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1NUeXBl
RnJvbUNvbnRlbnQpOgogICAgICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlUGFyc2VyKToKICAgICAg
ICAgICAgKFdlYkNvcmU6OmZpbmRYTUxFbmNvZGluZ1Bvc2l0aW9uKToKICAgICAgICAgICAgKFdl
YkNvcmU6OmZpbmRYTUxMYW5ndWFnZVBvc2l0aW9uKToKICAgICAgICAgICAgKFdlYkNvcmU6OmRl
ZmF1bHRFbmNvZGluZ0Zvckxhbmd1YWdlKToKICAgICAgICAgICAgKFdlYkNvcmU6OmlzVHJhbnNj
b2RpbmdOZWVkZWQpOgogICAgICAgICAgICAoV2ViQ29yZTo6dHJhbnNjb2RlKToKICAgICAgICAg
ICAgKFdlYkNvcmU6OnRyYW5zY29kZUNvbnRlbnQpOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNT
RmlsdGVyU3RyZWFtOjpSU1NGaWx0ZXJTdHJlYW0pOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNT
RmlsdGVyU3RyZWFtOjpub3RpZnlTdGF0dXNSZWNlaXZlZCk6CiAgICAgICAgICAgIChXZWJDb3Jl
OjpSU1NGaWx0ZXJTdHJlYW06Om5vdGlmeUhlYWRlcnNSZWNlaXZlZCk6CiAgICAgICAgICAgIChX
ZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06Om5vdGlmeURhdGFSZWNlaXZlZCk6CiAgICAgICAgICAg
IChXZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06Om5vdGlmeUNsb3NlKToKICAgICAgICAgICAgKFdl
YkNvcmU6OlJTU0ZpbHRlclN0cmVhbTo6Y29udmVydENvbnRlbnRUb0h0bWwpOgogICAgICAgICAg
ICAoV2ViQ29yZTo6UlNTRmlsdGVyU3RyZWFtOjpoYW5kbGVSU1NDb250ZW50KToKICAgICAgICAg
ICAgKFdlYkNvcmU6OlJTU0ZpbHRlclN0cmVhbTo6Y2hhcnNldCk6CiAgICAgICAgICAgIChXZWJD
b3JlOjpSU1NGaWx0ZXJTdHJlYW06OmVuY29kaW5nKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJT
U0ZpbHRlclN0cmVhbTo6c2F2ZUhlYWRlcnMpOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTRmls
dGVyU3RyZWFtOjpyZW1vdmVIZWFkZXIpOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTRmlsdGVy
U3RyZWFtOjp1cGRhdGVIZWFkZXIpOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTRmlsdGVyU3Ry
ZWFtOjp1cGRhdGVSU1NIZWFkZXJzKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTU0ZpbHRlclN0
cmVhbTo6c2VuZFNhdmVkSGVhZGVycyk6CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1NGaWx0ZXJT
dHJlYW06OmFwcGVuZERhdGEpOgogICAgICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2ti
ZXJyeS9yc3MvUlNTRmlsdGVyU3RyZWFtLmg6IEFkZGVkLgogICAgICAgICAgICAoV2ViQ29yZSk6
CiAgICAgICAgICAgIChSU1NGaWx0ZXJTdHJlYW0pOgogICAgICAgICAgICAqIHBsYXRmb3JtL25l
dHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmNwcDogQWRkZWQuCiAgICAgICAgICAg
IChXZWJDb3JlKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTU0dlbmVyYXRvcjo6UlNTR2VuZXJh
dG9yKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTU0dlbmVyYXRvcjo6flJTU0dlbmVyYXRvcik6
CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1NHZW5lcmF0b3I6OmdlbmVyYXRlSHRtbCk6CiAgICAg
ICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NHZW5lcmF0b3IuaDog
QWRkZWQuCiAgICAgICAgICAgIChXZWJDb3JlKToKICAgICAgICAgICAgKFJTU0dlbmVyYXRvcik6
CiAgICAgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NQYXJzZXJC
YXNlLmNwcDogQWRkZWQuCiAgICAgICAgICAgIChXZWJDb3JlKToKICAgICAgICAgICAgKFdlYkNv
cmU6OlJTU0VuY2xvc3VyZTo6UlNTRW5jbG9zdXJlKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJT
U0VuY2xvc3VyZTo6dHlwZUluRW51bSk6CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1NFbmNsb3N1
cmU6OnN1Z2dlc3RlZE5hbWUpOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNTRmVlZDo6UlNTRmVl
ZCk6CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1NGZWVkOjp+UlNTRmVlZCk6CiAgICAgICAgICAg
IChXZWJDb3JlOjpSU1NGZWVkOjpjbGVhcik6CiAgICAgICAgICAgIChXZWJDb3JlOjpSU1NJdGVt
OjpSU1NJdGVtKToKICAgICAgICAgICAgKFdlYkNvcmU6OlJTU0l0ZW06On5SU1NJdGVtKToKICAg
ICAgICAgICAgKFdlYkNvcmU6OlJTU0l0ZW06OmNsZWFyKToKICAgICAgICAgICAgKFdlYkNvcmU6
OlJTU1BhcnNlckJhc2U6OlJTU1BhcnNlckJhc2UpOgogICAgICAgICAgICAoV2ViQ29yZTo6UlNT
UGFyc2VyQmFzZTo6flJTU1BhcnNlckJhc2UpOgogICAgICAgICAgICAoV2ViQ29yZTo6dGV4dEZy
b21YTUxBdHRyKToKICAgICAgICAgICAgKFdlYkNvcmU6OnRleHRGcm9tWE1MTm9kZSk6CiAgICAg
ICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NQYXJzZXJCYXNlLmg6
IEFkZGVkLgogICAgICAgICAgICAoV2ViQ29yZSk6CiAgICAgICAgICAgIChSU1NFbmNsb3N1cmUp
OgogICAgICAgICAgICAoUlNTSXRlbUJhc2UpOgogICAgICAgICAgICAoUlNTUGFyc2VyQmFzZSk6
CgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvUGxhdGZvcm1CbGFja0JlcnJ5LmNtYWtlIGIv
U291cmNlL1dlYkNvcmUvUGxhdGZvcm1CbGFja0JlcnJ5LmNtYWtlCmluZGV4IDQwNWFkOGEuLjE2
ZDIxZmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1BsYXRmb3JtQmxhY2tCZXJyeS5jbWFr
ZQorKysgYi9Tb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUJsYWNrQmVycnkuY21ha2UKQEAgLTUsNyAr
NSw2IEBAIExJU1QoSU5TRVJUIFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RPUklFUyAwCiAKIExJU1Qo
QVBQRU5EIFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RPUklFUwogICAgICIke1dFQkNPUkVfRElSfS9w
bGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlIgotICAgICIke1dF
QkNPUkVfRElSfS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkiCiAgICAgIiR7V0VCQ09SRV9E
SVJ9L3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvc2tpYSIKICAgICAiJHtXRUJDT1JFX0RJ
Un0vcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0iICMgRm9yIGZvbnQgc3Vic3lzdGVtCiAgICAg
IiR7V0VCQ09SRV9ESVJ9L3BsYXRmb3JtL2dyYXBoaWNzL2dwdSIKQEAgLTE0LDYgKzEzLDggQEAg
TElTVChBUFBFTkQgV2ViQ29yZV9JTkNMVURFX0RJUkVDVE9SSUVTCiAgICAgIiR7V0VCQ09SRV9E
SVJ9L3BsYXRmb3JtL2dyYXBoaWNzL3NraWEiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L3BsYXRmb3Jt
L2ltYWdlLWRlY29kZXJzL3NraWEiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L3BsYXRmb3JtL2ltYWdl
LWVuY29kZXJzL3NraWEiCisgICAgIiR7V0VCQ09SRV9ESVJ9L3BsYXRmb3JtL25ldHdvcmsvYmxh
Y2tiZXJyeSIKKyAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5
L3JzcyIKICkKIAogIyBJbnRlcm5hbHMgc291cmNlcwpAQCAtMTA4LDYgKzEwOSwxMiBAQCBMSVNU
KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
UmVzb3VyY2VSZXF1ZXN0QmxhY2tCZXJyeS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvUmVzb3VyY2VSZXNwb25zZUJsYWNrQmVycnkuY3BwCiAgICAgcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5L1NvY2tldFN0cmVhbUhhbmRsZUJsYWNrQmVycnkuY3BwCisgICAgcGxhdGZv
cm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NBdG9tUGFyc2VyLmNwcAorICAgIHBsYXRmb3Jt
L25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMTBQYXJzZXIuY3BwCisgICAgcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MyMFBhcnNlci5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVhbS5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvcnNzL1JTU0dlbmVyYXRvci5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2Js
YWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuY3BwCiApCiAKIExJU1QoQVBQRU5EIFdlYkNvcmVf
VVNFUl9BR0VOVF9TVFlMRV9TSEVFVFMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmNwcAppbmRleCA2NjE3NzZmLi5j
MGUxMjRlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvTmV0d29ya0pvYi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuY3BwCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAi
UmVzb3VyY2VIYW5kbGVDbGllbnQuaCIKICNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUludGVybmFs
LmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VSZXF1ZXN0LmgiCisjaW5jbHVkZSAicnNzL1JTU0ZpbHRl
clN0cmVhbS5oIgogCiAjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtQ2xpZW50Lmg+CiAjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTG9nLmg+CkBAIC0xMzQsNiArMTM1LDE2IEBAIGJvb2wg
TmV0d29ya0pvYjo6aW5pdGlhbGl6ZShpbnQgcGxheWVySWQsCiAgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkZpbHRlclN0cmVhbSogd3JhcHBlZFN0cmVhbSA9IG1fc3RyZWFtRmFjdG9yeS0+Y3Jl
YXRlTmV0d29ya1N0cmVhbShyZXF1ZXN0LCBtX3BsYXllcklkKTsKICAgICBpZiAoIXdyYXBwZWRT
dHJlYW0pCiAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpOZXR3b3JrUmVxdWVzdDo6VGFyZ2V0VHlwZSB0YXJnZXRUeXBlID0gcmVxdWVzdC5nZXRUYXJn
ZXRUeXBlKCk7CisgICAgaWYgKCh0YXJnZXRUeXBlID09IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpO
ZXR3b3JrUmVxdWVzdDo6VGFyZ2V0SXNNYWluRnJhbWUKKyAgICAgICAgIHx8IHRhcmdldFR5cGUg
PT0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpUYXJnZXRJc1N1YmZyYW1l
KQorICAgICAgICAgICAgJiYgIW1faXNPdmVycmlkZUNvbnRlbnRUeXBlKSB7CisgICAgICAgIFJT
U0ZpbHRlclN0cmVhbSogZmlsdGVyID0gbmV3IFJTU0ZpbHRlclN0cmVhbSgpOworICAgICAgICBm
aWx0ZXItPnNldFdyYXBwZWRTdHJlYW0od3JhcHBlZFN0cmVhbSk7CisgICAgICAgIHdyYXBwZWRT
dHJlYW0gPSBmaWx0ZXI7CisgICAgfQorCiAgICAgc2V0V3JhcHBlZFN0cmVhbSh3cmFwcGVkU3Ry
ZWFtKTsKIAogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBhcnNlci5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzEwUGFyc2VyLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkyMzMwCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBh
cnNlci5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIw
MTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICog
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9u
LCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlJTUzEwUGFyc2VyLmgiCisKKyNpbmNsdWRlICJCbGFja0JlcnJ5UGxhdGZvcm1Bc3NlcnQu
aCIKKyNpbmNsdWRlICJsaWJ4bWwvcGFyc2VyLmgiCisjaW5jbHVkZSAibGlieG1sL3htbHdyaXRl
ci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JTUzEwUGFyc2VyOjpSU1MxMFBhcnNlcigp
Cit7Cit9CisKK2Jvb2wgUlNTMTBQYXJzZXI6OnBhcnNlQnVmZmVyKGNvbnN0IGNoYXIqIGJ1ZmZl
ciwgaW50IGxlbmd0aCwgY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBlbmNvZGluZykKK3sK
KyAgICByZXR1cm4gcGFyc2VYbWxEb2MoeG1sUmVhZE1lbW9yeShidWZmZXIsIGxlbmd0aCwgdXJs
LCBlbmNvZGluZywgWE1MX1BBUlNFX05PQkxBTktTIHwgWE1MX1BBUlNFX05PTkVUKSk7Cit9CisK
K2Jvb2wgUlNTMTBQYXJzZXI6OnBhcnNlWG1sRG9jKHhtbERvY1B0ciBkb2MpCit7CisgICAgaWYg
KCFkb2MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHhtbE5vZGUqIG5vZGUgPSB4bWxE
b2NHZXRSb290RWxlbWVudChkb2MpOworICAgIGlmICghbm9kZSkgeworICAgICAgICB4bWxGcmVl
RG9jKGRvYyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKDsgbm9k
ZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFtZSkpOworCisgICAgICAgIGlmIChuYW1lID09ICJS
REYiKSB7CisgICAgICAgICAgICB4bWxOb2RlKiBjaGlsZG5vZGUgPSBub2RlLT5jaGlsZHJlbjsK
KyAgICAgICAgICAgIGZvciAoOyBjaGlsZG5vZGU7IGNoaWxkbm9kZSA9IGNoaWxkbm9kZS0+bmV4
dCkgeworICAgICAgICAgICAgICAgIGlmIChjaGlsZG5vZGUtPnR5cGUgPT0gWE1MX0VMRU1FTlRf
Tk9ERSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gU3RyaW5nKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgY2hhcio+KGNoaWxkbm9kZS0+bmFtZSkpOworICAgICAgICAgICAgICAgICAgICBu
YW1lLm1ha2VMb3dlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAiY2hhbm5l
bCIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJMQUNLQkVSUllfQVNTRVJUKCFtX3Jvb3Qp
OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3Jvb3QpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV9yb290ID0gcGFyc2VGZWVkKGNoaWxkbm9kZS0+Y2hpbGRyZW4pOworICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIml0ZW0iKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBCTEFDS0JFUlJZX0FTU0VSVChtX3Jvb3QpOworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKG1fcm9vdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTU0l0
ZW0qIGl0ZW0gPSBwYXJzZUl0ZW0oY2hpbGRub2RlLT5jaGlsZHJlbik7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1fcm9vdC0+bV9pdGVtcy5hcHBlbmQoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICB9CisKKyAgICB4bWxGcmVlRG9jKGRvYyk7CisKKyAgICByZXR1cm4g
bV9yb290OworfQorCitib29sIFJTUzEwUGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKFJT
U0l0ZW1CYXNlKiBpdGVtLCBjb25zdCBTdHJpbmcmIG5hbWUsIHhtbE5vZGUqIG5vZGUpCit7Cisg
ICAgaWYgKG5hbWUgPT0gImxpbmsiKQorICAgICAgICBpdGVtLT5tX2xpbmsgPSB0ZXh0RnJvbVhN
TE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAobmFtZSA9PSAidGl0bGUiKQorICAgICAgICBpdGVt
LT5tX3RpdGxlID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UgaWYgKG5hbWUgPT0g
ImRlc2NyaXB0aW9uIikKKyAgICAgICAgaXRlbS0+bV9kZXNjcmlwdGlvbiA9IHRleHRGcm9tWE1M
Tm9kZShub2RlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biB0cnVlOworfQorCitSU1NJdGVtKiBSU1MxMFBhcnNlcjo6cGFyc2VJdGVtKHhtbE5vZGUqIG5v
ZGUpCit7CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQobm9kZSk7CisKKyAgICBSU1NJdGVtKiBpdGVt
ID0gbmV3IFJTU0l0ZW0oKTsKKworICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkg
eworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihub2Rl
LT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAgICAgICAgcGFyc2VJdGVt
QmFzZUF0dHJpYnV0ZShpdGVtLCBuYW1lLCBub2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gaXRl
bTsKK30KKworUlNTRmVlZCogUlNTMTBQYXJzZXI6OnBhcnNlRmVlZCh4bWxOb2RlKiBub2RlKQor
eworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNTRmVlZCogZmVlZCA9IG5l
dyBSU1NGZWVkKCk7CisKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAg
ICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFt
ZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dlcigpOworCisgICAgICAgIHBhcnNlSXRlbUJhc2VB
dHRyaWJ1dGUoZmVlZCwgbmFtZSwgbm9kZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZlZWQ7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMTBQYXJzZXIuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMTBQYXJzZXIuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY2NDFkCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBhcnNl
ci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIw
MTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSU1MxMFBhcnNlcl9oCisjZGVmaW5lIFJT
UzEwUGFyc2VyX2gKKworI2luY2x1ZGUgIlJTU1BhcnNlckJhc2UuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBSU1MxMFBhcnNlciA6IHB1YmxpYyBSU1NQYXJzZXJCYXNlIHsKK3B1
YmxpYzoKKyAgICBSU1MxMFBhcnNlcigpOworCisgICAgYm9vbCBwYXJzZUJ1ZmZlcihjb25zdCBj
aGFyKiBidWZmZXIsIGludCBsZW5ndGgsIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogZW5j
b2RpbmcpOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VYbWxEb2MoeG1sRG9jUHRyKTsKKyAg
ICBib29sIHBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoUlNTSXRlbUJhc2UqLCBjb25zdCBTdHJpbmcm
IG5hbWUsIHhtbE5vZGUqKTsKKyAgICBSU1NJdGVtKiBwYXJzZUl0ZW0oeG1sTm9kZSopOworICAg
IFJTU0ZlZWQqIHBhcnNlRmVlZCh4bWxOb2RlKik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBSU1MxMFBhcnNlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzIwUGFyc2VyLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMjBQYXJzZXIuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGU0ZGMKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JT
UzIwUGFyc2VyLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUlNTMjBQYXJzZXIuaCIKKworI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybUFz
c2VydC5oIgorI2luY2x1ZGUgImxpYnhtbC9wYXJzZXIuaCIKKyNpbmNsdWRlICJsaWJ4bWwveG1s
d3JpdGVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUlNTMjBQYXJzZXI6OlJTUzIwUGFy
c2VyKCkKK3sKK30KKworYm9vbCBSU1MyMFBhcnNlcjo6cGFyc2VCdWZmZXIoY29uc3QgY2hhciog
YnVmZmVyLCBpbnQgbGVuZ3RoLCBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIGVuY29kaW5n
KQoreworICAgIHJldHVybiBwYXJzZVhtbERvYyh4bWxSZWFkTWVtb3J5KGJ1ZmZlciwgbGVuZ3Ro
LCB1cmwsIGVuY29kaW5nLCBYTUxfUEFSU0VfTk9CTEFOS1MgfCBYTUxfUEFSU0VfTk9ORVQpKTsK
K30KKworYm9vbCBSU1MyMFBhcnNlcjo6cGFyc2VYbWxEb2MoeG1sRG9jUHRyIGRvYykKK3sKKyAg
ICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgeG1sTm9kZSogbm9kZSA9
IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CisgICAgaWYgKCFub2RlKSB7CisgICAgICAgIHht
bEZyZWVEb2MoZG9jKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAo
OyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVy
cHJldF9jYXN0PGNvbnN0IGNoYXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxv
d2VyKCk7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gInJzcyIpIHsKKyAgICAgICAgICAgIHhtbE5v
ZGUqIGNoYW5uZWwgPSBub2RlLT5jaGlsZHJlbjsKKyAgICAgICAgICAgIGlmIChjaGFubmVsLT50
eXBlID09IFhNTF9FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gcmVpbnRl
cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oY2hhbm5lbC0+bmFtZSk7CisgICAgICAgICAgICAgICAg
bmFtZS5tYWtlTG93ZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAiY2hhbm5lbCIp
CisgICAgICAgICAgICAgICAgICAgIG1fcm9vdCA9IHBhcnNlRmVlZChjaGFubmVsLT5jaGlsZHJl
bik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHhtbEZyZWVEb2MoZG9jKTsKKworICAgIHJldHVybiBtX3Jvb3Q7Cit9CisKK2Jvb2wg
UlNTMjBQYXJzZXI6OnBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoUlNTSXRlbUJhc2UqIGl0ZW0sIGNv
bnN0IFN0cmluZyYgbmFtZSwgeG1sTm9kZSogbm9kZSkKK3sKKyAgICBpZiAobmFtZSA9PSAibGlu
ayIpCisgICAgICAgIGl0ZW0tPm1fbGluayA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAgICBl
bHNlIGlmIChuYW1lID09ICJ0aXRsZSIpCisgICAgICAgIGl0ZW0tPm1fdGl0bGUgPSB0ZXh0RnJv
bVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAobmFtZSA9PSAiZGVzY3JpcHRpb24iKQorICAg
ICAgICBpdGVtLT5tX2Rlc2NyaXB0aW9uID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVs
c2UgaWYgKG5hbWUgPT0gInB1YmRhdGUiKQorICAgICAgICBpdGVtLT5tX3B1YkRhdGUgPSB0ZXh0
RnJvbVhNTE5vZGUobm9kZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworUlNTSXRlbSogUlNTMjBQYXJzZXI6OnBhcnNlSXRlbSh4bWxO
b2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNTSXRl
bSogaXRlbSA9IG5ldyBSU1NJdGVtKCk7CisKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUt
Pm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFy
Kj4obm9kZS0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dlcigpOworCisgICAgICAgIGlm
IChwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKGl0ZW0sIG5hbWUsIG5vZGUpKQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gImF1dGhvciIpCisgICAgICAgICAgICBp
dGVtLT5tX2F1dGhvciA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAgICAgICAgZWxzZSBpZiAo
bmFtZSA9PSAiY3JlYXRvciIpIHsKKyAgICAgICAgICAgIGlmIChpdGVtLT5tX2F1dGhvci5pc0Vt
cHR5KCkpCisgICAgICAgICAgICAgICAgaXRlbS0+bV9hdXRob3IgPSB0ZXh0RnJvbVhNTE5vZGUo
bm9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiY2F0ZWdvcnkiKQorICAgICAgICAg
ICAgaXRlbS0+bV9jYXRlZ29yaWVzLmFwcGVuZCh0ZXh0RnJvbVhNTE5vZGUobm9kZSkpOworICAg
ICAgICBlbHNlIGlmIChuYW1lID09ICJjb21tZW50cyIpCisgICAgICAgICAgICBpdGVtLT5tX2Nv
bW1lbnRzID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgICAgICBlbHNlIGlmIChuYW1lID09
ICJlbmNsb3N1cmUiKSB7CisgICAgICAgICAgICAvLyBSaWdodCBub3cgd2UgYXNzdW1lIHRoZXJl
IGlzIG9ubHkgb25lIGVuY2xvc3VyZSBwZXIgaXRlbSwgYW5kIHdlIGhhbmRsZSBvbmx5CisgICAg
ICAgICAgICAvLyB0aGUgZmlyc3QgZW5jbG9zdXJlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBvbmVz
LgorICAgICAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwOi8vd3d3LnJzc2JvYXJkLm9yZy9yc3Mt
cHJvZmlsZSNlbGVtZW50LWNoYW5uZWwtaXRlbS1lbmNsb3N1cmUKKyAgICAgICAgICAgIGlmICgh
aXRlbS0+bV9lbmNsb3N1cmUpCisgICAgICAgICAgICAgICAgaXRlbS0+bV9lbmNsb3N1cmUgPSBw
YXJzZUVuY2xvc3VyZShub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpdGVt
OworfQorCitSU1NGZWVkKiBSU1MyMFBhcnNlcjo6cGFyc2VGZWVkKHhtbE5vZGUqIG5vZGUpCit7
CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQobm9kZSk7CisKKyAgICBSU1NGZWVkKiBmZWVkID0gbmV3
IFJTU0ZlZWQoKTsKKworICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAg
ICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihub2RlLT5uYW1l
KSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAgICAgICAgaWYgKHBhcnNlSXRlbUJh
c2VBdHRyaWJ1dGUoZmVlZCwgbmFtZSwgbm9kZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICBpZiAobmFtZSA9PSAiaXRlbSIpCisgICAgICAgICAgICBmZWVkLT5tX2l0ZW1zLmFw
cGVuZChwYXJzZUl0ZW0obm9kZS0+Y2hpbGRyZW4pKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9
PSAibGFuZ3VhZ2UiKQorICAgICAgICAgICAgZmVlZC0+bV9sYW5ndWFnZSA9IHRleHRGcm9tWE1M
Tm9kZShub2RlKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAidHRsIikKKyAgICAgICAgICAg
IGZlZWQtPm1fdHRsID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIH0KKworICAgIHJldHVy
biBmZWVkOworfQorCitSU1NFbmNsb3N1cmUqIFJTUzIwUGFyc2VyOjpwYXJzZUVuY2xvc3VyZSh4
bWxOb2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNT
RW5jbG9zdXJlKiBlbmNsb3N1cmUgPSBuZXcgUlNTRW5jbG9zdXJlKCk7CisKKyAgICBmb3IgKHht
bEF0dHIqIGF0dHIgPSBub2RlLT5wcm9wZXJ0aWVzOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkg
eworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRy
LT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAgICAgICAgaWYgKG5hbWUg
PT0gInVybCIpCisgICAgICAgICAgICBlbmNsb3N1cmUtPm1fdXJsID0gdGV4dEZyb21YTUxBdHRy
KGF0dHIpOworICAgICAgICBlbHNlIGlmIChuYW1lID09ICJ0eXBlIikKKyAgICAgICAgICAgIGVu
Y2xvc3VyZS0+bV90eXBlID0gdGV4dEZyb21YTUxBdHRyKGF0dHIpOworICAgICAgICBlbHNlIGlm
IChuYW1lID09ICJsZW5ndGgiKQorICAgICAgICAgICAgZW5jbG9zdXJlLT5tX2xlbmd0aCA9IHRl
eHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZW5jbG9zdXJlOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzIwUGFyc2VyLmggYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzIwUGFyc2VyLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkYWQxOAotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMjBQYXJzZXIu
aApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgUlNTMjBQYXJzZXJfaAorI2RlZmluZSBSU1My
MFBhcnNlcl9oCisKKyNpbmNsdWRlICJSU1NQYXJzZXJCYXNlLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgUlNTMjBQYXJzZXIgOiBwdWJsaWMgUlNTUGFyc2VyQmFzZSB7CitwdWJs
aWM6CisgICAgUlNTMjBQYXJzZXIoKTsKKworICAgIGJvb2wgcGFyc2VCdWZmZXIoY29uc3QgY2hh
ciogYnVmZmVyLCBpbnQgbGVuZ3RoLCBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIGVuY29k
aW5nKTsKKworcHJpdmF0ZToKKyAgICBib29sIHBhcnNlWG1sRG9jKHhtbERvY1B0cik7CisgICAg
Ym9vbCBwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKFJTU0l0ZW1CYXNlKiwgY29uc3QgU3RyaW5nJiBu
YW1lLCB4bWxOb2RlKik7CisgICAgUlNTSXRlbSogcGFyc2VJdGVtKHhtbE5vZGUqKTsKKyAgICBS
U1NGZWVkKiBwYXJzZUZlZWQoeG1sTm9kZSopOworICAgIFJTU0VuY2xvc3VyZSogcGFyc2VFbmNs
b3N1cmUoeG1sTm9kZSopOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gUlNTMjBQYXJzZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NBdG9tUGFyc2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTQXRvbVBhcnNlci5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0MzA4ZQotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTQXRvbVBhcnNl
ci5jcHAKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAs
IDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlJTU0F0b21QYXJzZXIuaCIKKworI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybUFzc2VydC5o
IgorI2luY2x1ZGUgImxpYnhtbC9wYXJzZXIuaCIKKyNpbmNsdWRlICJsaWJ4bWwveG1sd3JpdGVy
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGlubGluZSBib29sIGlzUmVsYXRp
dmVQYXRoKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICByZXR1cm4gIShwYXRoLnN0YXJ0c1dp
dGgoIi8iKSB8fCBwYXRoLmZpbmQoIjovIikgIT0gV1RGOjpub3RGb3VuZCk7Cit9CisKK1JTU0F0
b21MaW5rOjpUeXBlIFJTU0F0b21MaW5rOjpyZWxUeXBlKCkKK3sKKyAgICBpZiAobV90eXBlSW5F
bnVtICE9IFR5cGVVbmtub3duKQorICAgICAgICByZXR1cm4gbV90eXBlSW5FbnVtOworCisgICAg
aWYgKG1fcmVsLmlzRW1wdHkoKSkKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUFsdGVybmF0
ZTsKKyAgICBlbHNlIHsKKyAgICAgICAgU3RyaW5nIGxvd3JlbCA9IG1fcmVsLmxvd2VyKCk7Cisg
ICAgICAgIGlmIChsb3dyZWwgPT0gImFsdGVybmF0ZSIpCisgICAgICAgICAgICBtX3R5cGVJbkVu
dW0gPSBUeXBlQWx0ZXJuYXRlOworICAgICAgICBlbHNlIGlmIChsb3dyZWwgPT0gImVuY2xvc3Vy
ZSIpCisgICAgICAgICAgICBtX3R5cGVJbkVudW0gPSBUeXBlRW5jbG9zdXJlOworICAgICAgICBl
bHNlIGlmIChsb3dyZWwgPT0gInJlbGF0ZWQiKQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0g
VHlwZVJlbGF0ZWQ7CisgICAgICAgIGVsc2UgaWYgKGxvd3JlbCA9PSAic2VsZiIpCisgICAgICAg
ICAgICBtX3R5cGVJbkVudW0gPSBUeXBlU2VsZjsKKyAgICAgICAgZWxzZSBpZiAobG93cmVsID09
ICJ2aWEiKQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVZpYTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVVuc3VwcG9ydGVkOworICAgIH0KKwor
ICAgIHJldHVybiBtX3R5cGVJbkVudW07Cit9CisKK1JTU0F0b21QYXJzZXI6OlJTU0F0b21QYXJz
ZXIoKQoreworfQorCitib29sIFJTU0F0b21QYXJzZXI6OnBhcnNlQnVmZmVyKGNvbnN0IGNoYXIq
IGJ1ZmZlciwgaW50IGxlbmd0aCwgY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBlbmNvZGlu
ZykKK3sKKyAgICBtX3VybCA9IEtVUkwoYmxhbmtVUkwoKSwgdXJsKTsKKyAgICByZXR1cm4gcGFy
c2VYbWxEb2MoeG1sUmVhZE1lbW9yeShidWZmZXIsIGxlbmd0aCwgdXJsLCBlbmNvZGluZywgWE1M
X1BBUlNFX05PQkxBTktTIHwgWE1MX1BBUlNFX05PTkVUKSk7Cit9CisKK2Jvb2wgUlNTQXRvbVBh
cnNlcjo6cGFyc2VYbWxEb2MoeG1sRG9jUHRyIGRvYykKK3sKKyAgICBpZiAoIWRvYykKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgeG1sTm9kZSogbm9kZSA9IHhtbERvY0dldFJvb3RFbGVt
ZW50KGRvYyk7CisgICAgaWYgKCFub2RlKSB7CisgICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9k
ZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNo
YXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAgICAgICAg
aWYgKG5hbWUgPT0gImZlZWQiKSB7CisgICAgICAgICAgICBtX3Jvb3QgPSBwYXJzZUZlZWQobm9k
ZS0+Y2hpbGRyZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICB4bWxGcmVlRG9jKGRvYyk7CisgICAgcmV0dXJuIG1fcm9vdDsKK30KKworYm9vbCBSU1NBdG9t
UGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKFJTU0l0ZW1CYXNlKiBpdGVtLCBjb25zdCBT
dHJpbmcmIG5hbWUsIHhtbE5vZGUqIG5vZGUsIGNvbnN0IFN0cmluZyYgYmFzZSkKK3sKKyAgICBp
ZiAobmFtZSA9PSAidGl0bGUiKQorICAgICAgICBpdGVtLT5tX3RpdGxlID0gdGV4dEZyb21YTUxO
b2RlKG5vZGUpOworICAgIGVsc2UgaWYgKG5hbWUgPT0gImlkIikKKyAgICAgICAgaXRlbS0+bV9p
ZCA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAgICBlbHNlIGlmIChuYW1lID09ICJhdXRob3Ii
KQorICAgICAgICBpdGVtLT5tX2F1dGhvciA9IHBhcnNlQXV0aG9yKG5vZGUpOworICAgIGVsc2Ug
aWYgKG5hbWUgPT0gInVwZGF0ZWQiKQorICAgICAgICBpdGVtLT5tX3VwZGF0ZWQgPSB0ZXh0RnJv
bVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAobmFtZSA9PSAiY29udGVudCIpCisgICAgICAg
IGl0ZW0tPm1fZGVzY3JpcHRpb24gPSBwYXJzZUNvbnRlbnQoYmFzZSwgbm9kZSk7CisgICAgZWxz
ZSBpZiAobmFtZSA9PSAicHVibGlzaGVkIikKKyAgICAgICAgaXRlbS0+bV9wdWJEYXRlID0gdGV4
dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK1JTU0l0ZW0qIFJTU0F0b21QYXJzZXI6OnBhcnNlSXRlbSh4
bWxOb2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNT
SXRlbSogaXRlbSA9IG5ldyBSU1NJdGVtKCk7CisKKyAgICBTdHJpbmcgYmFzZTsKKyAgICBmb3Ig
KHhtbEF0dHIqIGF0dHIgPSBub2RlLT5wcm9wZXJ0aWVzOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4
dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihh
dHRyLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisgICAgICAgIGlmIChuYW1l
ID09ICJiYXNlIikKKyAgICAgICAgICAgIGJhc2UgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7Cisg
ICAgfQorCisgICAgbm9kZSA9IG5vZGUtPmNoaWxkcmVuOworICAgIGZvciAoOyBub2RlOyBub2Rl
ID0gbm9kZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNv
bnN0IGNoYXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAg
ICAgICAgaWYgKHBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoaXRlbSwgbmFtZSwgbm9kZSwgYmFzZSkp
CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAobmFtZSA9PSAibGluayIpIHsK
KyAgICAgICAgICAgIFJTU0F0b21MaW5rKiBsaW5rID0gcGFyc2VMaW5rKG5vZGUpOworICAgICAg
ICAgICAgaWYgKGlzUmVsYXRpdmVQYXRoKGxpbmstPm1faHJlZikpCisgICAgICAgICAgICAgICAg
bGluay0+bV9ocmVmID0gYmFzZSArICIvIiArIGxpbmstPm1faHJlZjsKKworICAgICAgICAgICAg
c3dpdGNoIChsaW5rLT5yZWxUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUlNTQXRvbUxpbms6
OlR5cGVBbHRlcm5hdGU6CisgICAgICAgICAgICAgICAgaXRlbS0+bV9saW5rID0gbGluay0+bV9o
cmVmOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU1NBdG9tTGlu
azo6VHlwZUVuY2xvc3VyZToKKyAgICAgICAgICAgICAgICBCTEFDS0JFUlJZX0FTU0VSVCghaXRl
bS0+bV9lbmNsb3N1cmUpOworICAgICAgICAgICAgICAgIGlmICghaXRlbS0+bV9lbmNsb3N1cmUp
CisgICAgICAgICAgICAgICAgICAgIGl0ZW0tPm1fZW5jbG9zdXJlID0gZW5jbG9zdXJlRnJvbUxp
bmsobGluayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRl
IGxpbms7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiY2F0ZWdvcnkiKQorICAgICAgICAg
ICAgaXRlbS0+bV9jYXRlZ29yaWVzLmFwcGVuZChwYXJzZUNhdGVnb3J5KG5vZGUpKTsKKyAgICB9
CisKKyAgICByZXR1cm4gaXRlbTsKK30KKworUlNTRmVlZCogUlNTQXRvbVBhcnNlcjo6cGFyc2VG
ZWVkKHhtbE5vZGUqIG5vZGUpCit7CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQobm9kZSk7CisKKyAg
ICBSU1NGZWVkKiBmZWVkID0gbmV3IFJTU0ZlZWQoKTsKKworICAgIGZvciAoOyBub2RlOyBub2Rl
ID0gbm9kZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNv
bnN0IGNoYXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAg
ICAgICAgaWYgKHBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoZmVlZCwgbmFtZSwgbm9kZSwgZW1wdHlT
dHJpbmcoKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAobmFtZSA9PSAi
ZW50cnkiKQorICAgICAgICAgICAgZmVlZC0+bV9pdGVtcy5hcHBlbmQocGFyc2VJdGVtKG5vZGUp
KTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAibGluayIpIHsKKyAgICAgICAgICAgIFJTU0F0
b21MaW5rKiBsaW5rID0gcGFyc2VMaW5rKG5vZGUpOworICAgICAgICAgICAgaWYgKGxpbmstPnJl
bFR5cGUoKSA9PSBSU1NBdG9tTGluazo6VHlwZUFsdGVybmF0ZSkKKyAgICAgICAgICAgICAgICBm
ZWVkLT5tX2xpbmsgPSBsaW5rLT5tX2hyZWY7CisgICAgICAgICAgICBkZWxldGUgbGluazsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmZWVkOworfQorCitSU1NBdG9tTGluayogUlNT
QXRvbVBhcnNlcjo6cGFyc2VMaW5rKHhtbE5vZGUqIG5vZGUpCit7CisgICAgQkxBQ0tCRVJSWV9B
U1NFUlQobm9kZSk7CisKKyAgICBSU1NBdG9tTGluayogbGluayA9IG5ldyBSU1NBdG9tTGluaygp
OworCisgICAgZm9yICh4bWxBdHRyKiBhdHRyID0gbm9kZS0+cHJvcGVydGllczsgYXR0cjsgYXR0
ciA9IGF0dHItPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRfY2FzdDxj
b25zdCBjaGFyKj4oYXR0ci0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dlcigpOworCisg
ICAgICAgIGlmIChuYW1lID09ICJocmVmIikKKyAgICAgICAgICAgIGxpbmstPm1faHJlZiA9IHRl
eHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAicmVsIikKKyAg
ICAgICAgICAgIGxpbmstPm1fcmVsID0gdGV4dEZyb21YTUxBdHRyKGF0dHIpOworICAgICAgICBl
bHNlIGlmIChuYW1lID09ICJ0eXBlIikKKyAgICAgICAgICAgIGxpbmstPm1fdHlwZSA9IHRleHRG
cm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAiaHJlZmxhbmciKQor
ICAgICAgICAgICAgbGluay0+bV9ocmVmbGFuZyA9IHRleHRGcm9tWE1MQXR0cihhdHRyKTsKKyAg
ICAgICAgZWxzZSBpZiAobmFtZSA9PSAidGl0bGUiKQorICAgICAgICAgICAgbGluay0+bV90aXRs
ZSA9IHRleHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAibGVu
Z3RoIikKKyAgICAgICAgICAgIGxpbmstPm1fbGVuZ3RoID0gdGV4dEZyb21YTUxBdHRyKGF0dHIp
OworICAgIH0KKworICAgIHJldHVybiBsaW5rOworfQorCitSU1NFbmNsb3N1cmUqIFJTU0F0b21Q
YXJzZXI6OmVuY2xvc3VyZUZyb21MaW5rKFJTU0F0b21MaW5rKiBsaW5rKQoreworICAgIEJMQUNL
QkVSUllfQVNTRVJUKGxpbmspOworICAgIEJMQUNLQkVSUllfQVNTRVJUKGxpbmstPnJlbFR5cGUo
KSA9PSBSU1NBdG9tTGluazo6VHlwZUVuY2xvc3VyZSk7CisKKyAgICBSU1NFbmNsb3N1cmUqIGVu
Y2xvc3VyZSA9IG5ldyBSU1NFbmNsb3N1cmUoKTsKKworICAgIGVuY2xvc3VyZS0+bV91cmwgPSBs
aW5rLT5tX2hyZWY7CisgICAgZW5jbG9zdXJlLT5tX3R5cGUgPSBsaW5rLT5tX3R5cGU7CisgICAg
ZW5jbG9zdXJlLT5tX2xlbmd0aCA9IGxpbmstPm1fbGVuZ3RoOworCisgICAgcmV0dXJuIGVuY2xv
c3VyZTsKK30KKworU3RyaW5nIFJTU0F0b21QYXJzZXI6OnBhcnNlQ29udGVudChjb25zdCBTdHJp
bmcmIGJhc2UsIHhtbE5vZGUqIG5vZGUpCit7CisgICAgLy8gU2VlOiBodHRwOi8vdG9vbHMuaWV0
Zi5vcmcvaHRtbC9yZmM0Mjg3I3BhZ2UtMTYKKworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUp
OworICAgIFN0cmluZyBjb250ZW50OworICAgIFN0cmluZyB0eXBlID0gImRlZmF1bHQiOworICAg
IFN0cmluZyBzcmM7CisgICAgZm9yICh4bWxBdHRyKiBhdHRyID0gbm9kZS0+cHJvcGVydGllczsg
YXR0cjsgYXR0ciA9IGF0dHItPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4oYXR0ci0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dl
cigpOworCisgICAgICAgIGlmIChuYW1lID09ICJ0eXBlIikKKyAgICAgICAgICAgIHR5cGUgPSB0
ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gInNyYyIpCisg
ICAgICAgICAgICBzcmMgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgfQorCisgICAgaWYg
KCFzcmMuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChpc1JlbGF0aXZlUGF0aChzcmMpKQorICAg
ICAgICAgICAgc3JjID0gYmFzZSArICIvIiArIHNyYzsKKyAgICAgICAgY29udGVudCArPSAiPGEg
aHJlZj1cIiI7CisgICAgICAgIGNvbnRlbnQgKz0gc3JjICsgIlwiPiIgKyBzcmMgKyAiPC9hPiI7
CisgICAgICAgIHJldHVybiBjb250ZW50OworICAgIH0KKworICAgIGlmICh0eXBlID09ICJ0ZXh0
IiB8fCB0eXBlLnN0YXJ0c1dpdGgoInRleHQvIikpCisgICAgICAgIGNvbnRlbnQgPSB0ZXh0RnJv
bVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAodHlwZSA9PSAiaHRtbCIpCisgICAgICAgIGNv
bnRlbnQgPSB0ZXh0RnJvbVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAodHlwZSA9PSAieGh0
bWwiKSB7CisgICAgICAgIHhtbEJ1ZmZlclB0ciBidWZmZXIgPSB4bWxCdWZmZXJDcmVhdGUoKTsK
KyAgICAgICAgeG1sTm9kZSAqIGN1ciA9IG5vZGUtPmNoaWxkcmVuOworICAgICAgICBpZiAoY3Vy
ICYmIGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB7CisgICAgICAgICAgICAvLyBFbmNv
ZGluZyBvZiBidWZmZXIgaXMgdXRmLTguCisgICAgICAgICAgICB4bWxOb2RlRHVtcChidWZmZXIs
IGN1ci0+ZG9jLCBjdXIsIDAsIDApOworICAgICAgICAgICAgaWYgKCFiYXNlLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gIjxiYXNlIGhyZWY9JyI7CisgICAgICAgICAg
ICAgICAgY29udGVudCArPSBtX3VybC5iYXNlQXNTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBj
b250ZW50ICs9ICIvIjsKKyAgICAgICAgICAgICAgICBjb250ZW50ICs9IGJhc2U7CisgICAgICAg
ICAgICAgICAgY29udGVudCArPSAiLycgLz4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
Y29udGVudCArPSAoY29uc3QgY2hhciopeG1sQnVmZmVyQ29udGVudChidWZmZXIpOworICAgICAg
ICB9CisgICAgICAgIHhtbEJ1ZmZlckZyZWUoYnVmZmVyKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUu
ZW5kc1dpdGgoIit4bWwiKSB8fCB0eXBlLmVuZHNXaXRoKCIveG1sIikpCisgICAgICAgIC8vIEZJ
WE1FOiBzZWUgYXRvbSBzcGVjIDQuMS4zLjMuNC4KKyAgICAgICAgY29udGVudCA9IHRleHRGcm9t
WE1MTm9kZShub2RlKTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRlbnQgPSB0ZXh0RnJvbVhNTE5v
ZGUobm9kZSk7CisKKyAgICByZXR1cm4gY29udGVudDsKK30KKworU3RyaW5nIFJTU0F0b21QYXJz
ZXI6OnBhcnNlQXV0aG9yKHhtbE5vZGUqIG5vZGUpCit7CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQo
bm9kZSk7CisKKyAgICBTdHJpbmcgdXNlcm5hbWU7CisgICAgU3RyaW5nIGVtYWlsOworCisgICAg
Zm9yIChub2RlID0gbm9kZS0+Y2hpbGRyZW47IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7Cisg
ICAgICAgIFN0cmluZyBuYW1lKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5vZGUtPm5h
bWUpKTsKKyAgICAgICAgbmFtZS5tYWtlTG93ZXIoKTsKKworICAgICAgICBpZiAobmFtZSA9PSAi
bmFtZSIpCisgICAgICAgICAgICB1c2VybmFtZSA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAg
ICAgICAgZWxzZSBpZiAobmFtZSA9PSAiZW1haWwiKQorICAgICAgICAgICAgZW1haWwgPSB0ZXh0
RnJvbVhNTE5vZGUobm9kZSk7CisgICAgICAgIC8vIGVsc2UgaWYgKG5hbWUgPT0gInVyaSIpCisg
ICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdXJpIGluZm8uCisgICAgfQorCisgICAgaWYgKCFlbWFp
bC5pc0VtcHR5KCkpIHsKKyAgICAgICAgdXNlcm5hbWUgKz0gIiAoIjsKKyAgICAgICAgdXNlcm5h
bWUgKz0gZW1haWw7CisgICAgICAgIHVzZXJuYW1lICs9ICIpIjsKKyAgICB9CisKKyAgICByZXR1
cm4gdXNlcm5hbWU7Cit9CisKK1N0cmluZyBSU1NBdG9tUGFyc2VyOjpwYXJzZUNhdGVnb3J5KHht
bE5vZGUqIG5vZGUpCit7CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQobm9kZSk7CisKKyAgICBTdHJp
bmcgY2F0ZWdvcnk7CisKKyAgICBmb3IgKHhtbEF0dHIqIGF0dHIgPSBub2RlLT5wcm9wZXJ0aWVz
OyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVy
cHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRyLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxv
d2VyKCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUncyBhIGxhYmVsLCB3ZSB1c2UgaXQsIGlmIG5v
dCwgdXNlIHRlcm0gYXR0cmlidXRlLgorICAgICAgICAvLyBBcyBsYWJlbCBpcyBvcHRpb25hbCwg
YnV0IHRlcm0gaXMgbWFuZGF0b3J5LgorICAgICAgICBpZiAobmFtZSA9PSAibGFiZWwiKSB7Cisg
ICAgICAgICAgICBjYXRlZ29yeSA9IHRleHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgPT0gInRlcm0iKQorICAgICAg
ICAgICAgY2F0ZWdvcnkgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgfQorCisgICAgcmV0
dXJuIGNhdGVnb3J5OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0F0b21QYXJz
ZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNT
QXRvbVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NWY1MGYK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvcnNzL1JTU0F0b21QYXJzZXIuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy
ZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgUlNT
QXRvbVBhcnNlcl9oCisjZGVmaW5lIFJTU0F0b21QYXJzZXJfaAorCisjaW5jbHVkZSAiS1VSTC5o
IgorI2luY2x1ZGUgIlJTU1BhcnNlckJhc2UuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBSU1NBdG9tTGluayB7CitwdWJsaWM6CisgICAgZW51bSBUeXBlIHsKKyAgICAgICAgVHlw
ZVVua25vd24sCisgICAgICAgIFR5cGVBbHRlcm5hdGUsCisgICAgICAgIFR5cGVSZWxhdGVkLAor
ICAgICAgICBUeXBlU2VsZiwKKyAgICAgICAgVHlwZUVuY2xvc3VyZSwKKyAgICAgICAgVHlwZVZp
YSwKKyAgICAgICAgVHlwZVVuc3VwcG9ydGVkCisgICAgfTsKKworICAgIFJTU0F0b21MaW5rKCkK
KyAgICAgICAgOiBtX3R5cGVJbkVudW0oVHlwZVVua25vd24pCisgICAgeyB9CisKKyAgICBUeXBl
IHJlbFR5cGUoKTsKKworICAgIFN0cmluZyBtX3JlbDsKKyAgICBTdHJpbmcgbV9ocmVmOworICAg
IFN0cmluZyBtX2hyZWZsYW5nOworICAgIFN0cmluZyBtX3R5cGU7CisgICAgU3RyaW5nIG1fdGl0
bGU7CisgICAgU3RyaW5nIG1fbGVuZ3RoOworCitwcml2YXRlOgorICAgIFR5cGUgbV90eXBlSW5F
bnVtOworfTsKKworY2xhc3MgUlNTQXRvbVBhcnNlciA6IHB1YmxpYyBSU1NQYXJzZXJCYXNlIHsK
K3B1YmxpYzoKKyAgICBSU1NBdG9tUGFyc2VyKCk7CisKKyAgICBib29sIHBhcnNlQnVmZmVyKGNv
bnN0IGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0aCwgY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFy
KiBlbmNvZGluZyk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBwYXJzZVhtbERvYyh4bWxEb2NQdHIp
OworICAgIGJvb2wgcGFyc2VJdGVtQmFzZUF0dHJpYnV0ZShSU1NJdGVtQmFzZSosIGNvbnN0IFN0
cmluZyYgbmFtZSwgeG1sTm9kZSosIGNvbnN0IFN0cmluZyYgYmFzZSk7CisgICAgUlNTSXRlbSog
cGFyc2VJdGVtKHhtbE5vZGUqKTsKKyAgICBSU1NGZWVkKiBwYXJzZUZlZWQoeG1sTm9kZSopOwor
ICAgIFJTU0F0b21MaW5rKiBwYXJzZUxpbmsoeG1sTm9kZSopOworICAgIFJTU0VuY2xvc3VyZSog
ZW5jbG9zdXJlRnJvbUxpbmsoUlNTQXRvbUxpbmsqKTsKKworICAgIFN0cmluZyBwYXJzZUNvbnRl
bnQoY29uc3QgU3RyaW5nJiBiYXNlLCB4bWxOb2RlKik7CisgICAgU3RyaW5nIHBhcnNlQXV0aG9y
KHhtbE5vZGUqKTsKKyAgICBTdHJpbmcgcGFyc2VDYXRlZ29yeSh4bWxOb2RlKik7CisgICAgS1VS
TCBtX3VybDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJTU0F0
b21QYXJzZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9i
bGFja2JlcnJ5L3Jzcy9SU1NGaWx0ZXJTdHJlYW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NGaWx0ZXJTdHJlYW0uY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDdmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVh
bS5jcHAKQEAgLTAsMCArMSw2NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAs
IDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlJTU0ZpbHRlclN0cmVhbS5oIgorCisjaW5jbHVkZSAiUlNTMTBQYXJzZXIuaCIKKyNpbmNsdWRl
ICJSU1MyMFBhcnNlci5oIgorI2luY2x1ZGUgIlJTU0F0b21QYXJzZXIuaCIKKyNpbmNsdWRlICJS
U1NHZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJUZXh0Q29kZWNJQ1UuaCIKKworI2luY2x1ZGUgPEJs
YWNrQmVycnlQbGF0Zm9ybUFzc2VydC5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxv
Zy5oPgorI2luY2x1ZGUgPFNjb3BlUG9pbnRlci5oPgorI2luY2x1ZGUgPG5ldHdvcmsvTmV0d29y
a1JlcXVlc3QuaD4KKyNpbmNsdWRlIDx3dGYvQVNDSUlDVHlwZS5oPgorI2luY2x1ZGUgPHd0Zi9P
d25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKwordXNpbmcgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWw7Cit1c2luZyBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6TG9nTGV2ZWxJbmZvOwordXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xl
dmVsV2FybjsKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc191dGY4RW5j
b2RpbmdOYW1lID0gIlVURi04IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2xhdGluMUVu
Y29kaW5nTmFtZSA9ICJJU08tODg1OS0xIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2di
a0VuY29kaW5nTmFtZSA9ICJHQksiOworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc19jb250
ZW50RW5jb2RpbmdIZWFkZXJLZXkgPSAiQ29udGVudC1FbmNvZGluZyI7CitzdGF0aWMgY29uc3Qg
Y2hhciogY29uc3Qgc19jb250ZW50TGVuZ3RoSGVhZGVyS2V5ID0gIkNvbnRlbnQtTGVuZ3RoIjsK
K3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2NvbnRlbnRUeXBlSGVhZGVyS2V5ID0gIkNvbnRl
bnQtVHlwZSI7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2F0b20xMFZlcnNpb25LZXkg
PSAieG1sbnMiOworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHNfYXRvbTEwVmVyc2lvblZhbHVl
ID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSI7CitzdGF0aWMgY29uc3QgY2hhciogY29u
c3Qgc19yc3MxMFZlcnNpb25LZXkgPSAieG1sbnMiOworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0
IHNfcnNzMTBWZXJzaW9uVmFsdWUgPSAiaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvIjsKK3N0YXRp
YyBjb25zdCBjaGFyKiBjb25zdCBzX3JzczIwVmVyc2lvbktleSA9ICJ2ZXJzaW9uIjsKK3N0YXRp
YyBjb25zdCBjaGFyKiBjb25zdCBzX3JzczIwVmVyc2lvblZhbHVlID0gIjIuMCI7CitzdGF0aWMg
Y29uc3QgY2hhciogY29uc3Qgc19yc3NYbWxWZXJzaW9uS2V5ID0gInZlcnNpb24iOworc3RhdGlj
IGNvbnN0IGNoYXIqIGNvbnN0IHNfcnNzWG1sVmVyc2lvblZhbHVlID0gIjEuMCI7CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBpc0NvbnRyb2xDaGFyYWN0ZXIoaW50IGRhdGEpCit7CisgICAgcmV0dXJu
IGRhdGEgPCAweDIwIHx8IGRhdGEgPT0gMHg3ZjsKK30KKworc3RhdGljIGludCBpc3NwYWNlU2Fm
ZShpbnQgY2gpCit7CisgICAgcmV0dXJuIGlzQVNDSUlTcGFjZTxpbnQ+KGNoICYgMHhmZik7Cit9
CisKK3N0YXRpYyBzdGQ6OnN0cmluZyYgc3RyaXBXaGl0ZVNwYWNlKHN0ZDo6c3RyaW5nJiBzdHIp
Cit7CisgICAgc3RyLmVyYXNlKHN0ci5iZWdpbigpLCBzdGQ6OmZpbmRfaWYoc3RyLmJlZ2luKCks
IHN0ci5lbmQoKSwgc3RkOjpub3QxKHN0ZDo6cHRyX2Z1bjxpbnQsIGludD4oaXNzcGFjZVNhZmUp
KSkpOworICAgIHN0ci5lcmFzZShzdGQ6OmZpbmRfaWYoc3RyLnJiZWdpbigpLCBzdHIucmVuZCgp
LCBzdGQ6Om5vdDEoc3RkOjpwdHJfZnVuPGludCwgaW50Pihpc3NwYWNlU2FmZSkpKS5iYXNlKCks
IHN0ci5lbmQoKSk7CisgICAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGlubGluZSBib29sIGVx
dWFsSWdub3JpbmdDYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaXJzdCwgY29uc3QgY2hhciogc2Vj
b25kKQoreworICAgIHJldHVybiAhc3RyY2FzZWNtcChmaXJzdC5jX3N0cigpLCBzZWNvbmQpOwor
fQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdG9tTUlNRVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcm
IG1pbWVUeXBlKQoreworICAgIHJldHVybiBlcXVhbElnbm9yaW5nQ2FzZShtaW1lVHlwZSwgImFw
cGxpY2F0aW9uL2F0b20reG1sIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1JTU01JTUVU
eXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSkKK3sKKyAgICByZXR1cm4gZXF1YWxJZ25v
cmluZ0Nhc2UobWltZVR5cGUsICJhcHBsaWNhdGlvbi9yc3MreG1sIik7Cit9CisKK3N0YXRpYyBp
bmxpbmUgYm9vbCBpc1BvdGVudGlhbFJTU01JTUVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1l
VHlwZSkKK3sKKyAgICByZXR1cm4gIXN0cm5jbXAobWltZVR5cGUuZGF0YSgpLCAidGV4dC94bWwi
LCA4KSB8fCAhc3RybmNtcChtaW1lVHlwZS5kYXRhKCksICJhcHBsaWNhdGlvbi94bWwiLCAxNSk7
Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1JTU0NvbnRlbnQoUlNTRmlsdGVyU3RyZWFtOjpS
ZXNvdXJjZVR5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gdHlwZSA9PSBSU1NGaWx0ZXJTdHJlYW06
OlRZUEVfUlNTMTBfQ09OVEVOVAorICAgICAgICAgICAgfHwgdHlwZSA9PSBSU1NGaWx0ZXJTdHJl
YW06OlRZUEVfUlNTMjBfQ09OVEVOVAorICAgICAgICAgICAgfHwgdHlwZSA9PSBSU1NGaWx0ZXJT
dHJlYW06OlRZUEVfQVRPTV9DT05URU5UOworfQorCitzdGF0aWMgUlNTRmlsdGVyU3RyZWFtOjpS
ZXNvdXJjZVR5cGUgUlNTVHlwZUZyb21Db250ZW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyYgY29u
dGVudFR5cGUpCit7CisgICAgaWYgKGNvbnRlbnRUeXBlLmVtcHR5KCkpCisgICAgICAgIHJldHVy
biBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9XTjsKKworICAgIHN0ZDo6c3RyaW5nIG1pbWVU
eXBlOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb247CisgICAgYm9vbCBpc1JTUyA9IGZhbHNlOwor
CisgICAgLy8gVGhlIGNvbnRlbnRUeXBlIGNhbiBjb250YWluIGJvdGggYSBtaW1lIHR5cGUgYW5k
IHZlcnNpb24gYXR0cmlidXRlcworICAgIC8vIElmIHdlIGFscmVhZHkga25vdyB0aGUgdHlwZSBp
cyBBdG9tLCB3ZSBkb24ndCBuZWVkIGVpdGhlciBvZiB0aGVzZSwgc28gc2tpcCBpdAorICAgIGZv
ciAoc2l6ZV90IHN0YXJ0ID0gMCwgZGVsaW1pdGVyID0gMDtkZWxpbWl0ZXIgIT0gc3RkOjpzdHJp
bmc6Om5wb3M7IHN0YXJ0ID0gZGVsaW1pdGVyICsgMSkgeworICAgICAgICBkZWxpbWl0ZXIgPSBj
b250ZW50VHlwZS5maW5kKCc7Jywgc3RhcnQpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXBv
bmVudCA9IGNvbnRlbnRUeXBlLnN1YnN0cihzdGFydCwgZGVsaW1pdGVyID09IHN0ZDo6c3RyaW5n
OjpucG9zID8gZGVsaW1pdGVyIDogZGVsaW1pdGVyIC0gc3RhcnQpOworCisgICAgICAgIGlmICht
aW1lVHlwZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoaXNBdG9tTUlNRVR5cGUoY29tcG9u
ZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUWVBFX0FUT01f
Q09OVEVOVDsKKworICAgICAgICAgICAgaWYgKGlzUlNTTUlNRVR5cGUoY29tcG9uZW50KSkgewor
ICAgICAgICAgICAgICAgIC8vIGRlZmluaXRlbHkgbm90IGEgdmVyc2lvbiBhdHRyaWJ1dGUsIHNr
aXAgdG8gbmV4dCB0b2tlbgorICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gY29tcG9uZW50Owor
ICAgICAgICAgICAgICAgIGlzUlNTID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBlcXVhbHNpZ24gPSBj
b21wb25lbnQuZmluZCgnPScpOworICAgICAgICBpZiAoZXF1YWxzaWduICE9IHN0ZDo6c3RyaW5n
OjpucG9zICYmIGVxdWFsSWdub3JpbmdDYXNlKGNvbXBvbmVudC5zdWJzdHIoMCwgZXF1YWxzaWdu
KSwgInZlcnNpb24iKSkKKyAgICAgICAgICAgIHZlcnNpb24gPSBjb21wb25lbnQuc3Vic3RyKGVx
dWFsc2lnbiArIDEpOworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIG5vdyBoYXZlIGZvdW5kIGJv
dGggTUlNRSB0eXBlIGFuZCB2ZXJzaW9uCisgICAgICAgIGlmICghbWltZVR5cGUuZW1wdHkoKSAm
JiAhdmVyc2lvbi5lbXB0eSgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYg
KGlzUlNTKSB7CisgICAgICAgIGlmICghdmVyc2lvbi5jb21wYXJlKCIxLjAiKSkKKyAgICAgICAg
ICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfUlNTMTBfQ09OVEVOVDsKKworICAgICAg
ICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUWVBFX1JTUzIwX0NPTlRFTlQ7CisgICAgfQorCisg
ICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9VTktOT1dOOworfQorCitzdGF0aWMgUlNT
RmlsdGVyU3RyZWFtOjpSZXNvdXJjZVR5cGUgUlNTVHlwZUZyb21Db250ZW50KGNvbnN0IGNoYXIq
IHN0ciwgaW50IHN0ckxlbikKK3sKKyAgICAvLyBMb2NhdGUgeG1sIHNpZ25hdHVyZS4KKyAgICBj
b25zdCBjaGFyKiBwb3MgPSBzdHI7CisKKyAgICAvLyBMb2NhdGUgdGhlIFJTUyB0YWdzCisgICAg
d2hpbGUgKHRydWUpIHsKKyAgICAgICAgcG9zID0gc3RyY2hyKHBvcywgJzwnKTsKKyAgICAgICAg
aWYgKCFwb3MgfHwgKHBvcyAtIHN0ciA+PSBzdHJMZW4pKSB7CisgICAgICAgICAgICBCQkxPRyhM
b2dMZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogY2FuIG5vdCBmaW5kIGFueSBzdGFy
dCB0YWciKTsKKyAgICAgICAgICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9X
TjsKKyAgICAgICAgfQorCisgICAgICAgICsrcG9zOworCisgICAgICAgIGlmICghc3RybmNhc2Vj
bXAocG9zLCAicnNzIiwgMykpIHsKKyAgICAgICAgICAgIGlmIChpc1NwYWNlT3JOZXdsaW5lKCoo
cG9zICsgMykpKSB7CisgICAgICAgICAgICAgICAgQkJMT0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlw
ZUZyb21Db250ZW50KCk6IGZvdW5kIFJTUyAyLjAgdGFnIik7CisgICAgICAgICAgICAgICAgcmV0
dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9SU1MyMF9DT05URU5UOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTog
d3JvbmcgUlNTIDIuMCB0YWc6ICUuKnMiLCAzMiwgcG9zKTsKKyAgICAgICAgICAgIHJldHVybiBS
U1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgh
c3RybmNhc2VjbXAocG9zLCAiZmVlZCIsIDQpKSB7CisgICAgICAgICAgICBpZiAoaXNTcGFjZU9y
TmV3bGluZSgqKHBvcyArIDQpKSkgeworICAgICAgICAgICAgICAgIEJCTE9HKExvZ0xldmVsSW5m
bywgIlJTU1R5cGVGcm9tQ29udGVudCgpOiBmb3VuZCBBdG9tIDEuMCB0YWciKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUWVBFX0FUT01fQ09OVEVOVDsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgQkJMT0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlwZUZyb21D
b250ZW50KCk6IHdyb25nIEF0b20gMS4wIHRhZzogJS4qcyIsIDMyLCBwb3MpOworICAgICAgICAg
ICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9VTktOT1dOOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCFzdHJuY2FzZWNtcChwb3MsICJyZGY6UkRGIiwgNykpIHsKKyAgICAgICAgICAg
IGlmIChpc1NwYWNlT3JOZXdsaW5lKCoocG9zICsgNykpKSB7CisgICAgICAgICAgICAgICAgQkJM
T0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlwZUZyb21Db250ZW50KCk6IGZvdW5kIFJTUyAxLjAgdGFn
Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9SU1MxMF9D
T05URU5UOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8s
ICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogd3JvbmcgUlNTIDEuMCB0YWc6ICUuKnMiLCAzMiwgcG9z
KTsKKyAgICAgICAgICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9XTjsKKyAg
ICAgICAgfQorCisgICAgICAgIGlmICghc3RybmNhc2VjbXAocG9zLCAiP3htbCIsIDQpKSB7Cisg
ICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogZm91
bmQgYW5vdGhlciB4bWwgdGFnIik7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGFub3RoZXIgeG1s
IGluZm8sIHNraXAgaXQuCisgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgIHBvcyA9
IHN0cnN0cihwb3MsICI/PiIpOworCisgICAgICAgICAgICBpZiAoIXBvcyB8fCAocG9zIC0gc3Ry
ID49IHN0ckxlbikpIHsKKyAgICAgICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8sICJSU1NU
eXBlRnJvbUNvbnRlbnQoKTogZXh0cmEgeG1sIHRhZyB0b28gbG9uZyIpOworICAgICAgICAgICAg
ICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmICghc3RybmNhc2VjbXAocG9zLCAiIS0tIiwgMykpIHsKKyAgICAgICAg
ICAgIEJCTE9HKExvZ0xldmVsSW5mbywgIlJTU1R5cGVGcm9tQ29udGVudCgpOiBmb3VuZCBjb21t
ZW50cyIpOworICAgICAgICAgICAgLy8gVGhpcyBpcyBjb21tZW50cywgc2tpcCBpdC4KKyAgICAg
ICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgcG9zID0gc3Ryc3RyKHBvcywgIi0tPiIpOwor
CisgICAgICAgICAgICBpZiAoIXBvcyB8fCAocG9zIC0gc3RyID49IHN0ckxlbikpIHsKKyAgICAg
ICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogY29t
bWVudHMgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFt
OjpUWVBFX1VOS05PV047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvcyArPSAzOwor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBCQkxPRyhMb2dMZXZl
bEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogbm9uIHJzcyB0eXBlICglLipzKSBmb3VuZCIs
IDMyLCBwb3MpOworICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUWVBFX1VOS05PV047
CisgICAgfQorCisgICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9VTktOT1dOOworfQor
CitzdGF0aWMgUGFzc093blB0cjxSU1NQYXJzZXJCYXNlPiBjcmVhdGVQYXJzZXIoUlNTRmlsdGVy
U3RyZWFtOjpSZXNvdXJjZVR5cGUgdHlwZSkKK3sKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChpc1JT
U0NvbnRlbnQodHlwZSkpOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBSU1NGaWx0
ZXJTdHJlYW06OlRZUEVfQVRPTV9DT05URU5UOgorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3
IFJTU0F0b21QYXJzZXIoKSk7CisgICAgY2FzZSBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfUlNTMTBf
Q09OVEVOVDoKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBSU1MxMFBhcnNlcigpKTsKKyAg
ICBjYXNlIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9SU1MyMF9DT05URU5UOgorICAgICAgICByZXR1
cm4gYWRvcHRQdHIobmV3IFJTUzIwUGFyc2VyKCkpOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8v
IFRoZSBmb2xsb3dpbmcgY29kZSBpcyBqdXN0IGZvciBjb21waWxlciwgaXQgc2hvdWxkIG5ldmVy
IHJlYWNoIGhlcmUuCisgICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgUlNTMjBQYXJzZXIoKSk7
CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBmaW5kWE1MRW5jb2RpbmdQb3NpdGlvbihjb25zdCBj
aGFyKiBzdHIsIGNvbnN0IGNoYXIqJiBlbmNvZGluZ1N0YXJ0LCBjb25zdCBjaGFyKiYgZW5jb2Rp
bmdFbmQpCit7CisgICAgZW5jb2RpbmdTdGFydCA9IHN0cnN0cihzdHIsICI8P3htbCAiKTsKKyAg
ICBpZiAoIWVuY29kaW5nU3RhcnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGVuY29k
aW5nU3RhcnQgKz0gNjsgLy8gbGVuZ3RoIG9mICI8P3htbCAiCisgICAgY2hhciogZW5kUG9zID0g
c3Ryc3RyKGNvbnN0X2Nhc3Q8Y2hhcio+KGVuY29kaW5nU3RhcnQpLCAiPz4iKTsKKyAgICBpZiAo
IWVuZFBvcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZW5jb2RpbmdTdGFydCA9IHN0
cnN0cihjb25zdF9jYXN0PGNoYXIqPihlbmNvZGluZ1N0YXJ0KSwgImVuY29kaW5nIik7CisKKyAg
ICBpZiAoIWVuY29kaW5nU3RhcnQgfHwgZW5jb2RpbmdTdGFydCA+IGVuZFBvcykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgZW5jb2RpbmdTdGFydCArPSA4OworCisgICAgd2hpbGUgKGVu
Y29kaW5nU3RhcnQgPCBlbmRQb3MgJiYgKmVuY29kaW5nU3RhcnQgPD0gJyAnKQorICAgICAgICAr
K2VuY29kaW5nU3RhcnQ7CisKKyAgICBpZiAoZW5jb2RpbmdTdGFydCA9PSBlbmRQb3MgfHwgKmVu
Y29kaW5nU3RhcnQgIT0gJz0nKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICArK2VuY29k
aW5nU3RhcnQ7CisKKyAgICB3aGlsZSAoZW5jb2RpbmdTdGFydCA8IGVuZFBvcyAmJiAqZW5jb2Rp
bmdTdGFydCA8PSAnICcpCisgICAgICAgICsrZW5jb2RpbmdTdGFydDsKKworICAgIGlmIChlbmNv
ZGluZ1N0YXJ0ID09IGVuZFBvcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2hhciBx
dW90ZSA9ICplbmNvZGluZ1N0YXJ0OworICAgIGlmIChxdW90ZSAhPSAnXCInICYmIHF1b3RlICE9
ICdcJycpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICsrZW5jb2RpbmdTdGFydDsKKyAg
ICBlbmNvZGluZ0VuZCA9IHN0cmNocihjb25zdF9jYXN0PGNoYXIqPihlbmNvZGluZ1N0YXJ0KSwg
cXVvdGUpOworCisgICAgaWYgKCFlbmNvZGluZ0VuZCB8fCBlbmNvZGluZ0VuZCA9PSBlbmNvZGlu
Z1N0YXJ0IHx8IGVuY29kaW5nRW5kID4gZW5kUG9zKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZmluZFhNTExhbmd1YWdlUG9zaXRp
b24oY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiYgbGFuZ1N0YXJ0LCBjb25zdCBjaGFyKiYg
bGFuZ0VuZCkKK3sKKyAgICBsYW5nU3RhcnQgPSBzdHJzdHIoY29uc3RfY2FzdDxjaGFyKj4oc3Ry
KSwgIjxsYW5ndWFnZT4iKTsKKyAgICBpZiAoIWxhbmdTdGFydCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgbGFuZ1N0YXJ0ICs9IDEwOyAvLyBsZW5ndGggb2YgIjxsYW5ndWFnZT4iCisg
ICAgY2hhciogZW5kUG9zID0gc3Ryc3RyKGNvbnN0X2Nhc3Q8Y2hhcio+KGxhbmdTdGFydCksICI8
L2xhbmd1YWdlPiIpOworICAgIGlmICghZW5kUG9zKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICB3aGlsZSAobGFuZ1N0YXJ0IDwgZW5kUG9zICYmICpsYW5nU3RhcnQgPD0gJyAnKQorICAg
ICAgICArK2xhbmdTdGFydDsKKworICAgIGlmIChsYW5nU3RhcnQgPT0gZW5kUG9zKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBsYW5nRW5kID0gZW5kUG9zIC0gMTsKKworICAgIHdoaWxl
IChsYW5nRW5kID4gbGFuZ1N0YXJ0ICYmICpsYW5nRW5kIDw9ICcgJykKKyAgICAgICAgLS1sYW5n
RW5kOworCisgICAgKytsYW5nRW5kOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgY29u
c3QgY2hhciogZGVmYXVsdEVuY29kaW5nRm9yTGFuZ3VhZ2UoY29uc3QgY2hhciogbGFuZ3VhZ2Up
Cit7CisgICAgaWYgKCghc3RyY2FzZWNtcChsYW5ndWFnZSwgImVuIikpCisgICAgICAgIHx8ICgh
c3RyY2FzZWNtcChsYW5ndWFnZSwgImVuLVVTIikpKQorICAgICAgICByZXR1cm4gc19sYXRpbjFF
bmNvZGluZ05hbWU7CisgICAgaWYgKCFzdHJjYXNlY21wKGxhbmd1YWdlLCAiemgtY24iKSkKKyAg
ICAgICAgcmV0dXJuIHNfZ2JrRW5jb2RpbmdOYW1lOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0
YXRpYyBib29sIGlzVHJhbnNjb2RpbmdOZWVkZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5n
KQoreworICAgIC8vIFdoZW4gdGhlcmUncyBubyBlbmNvZGluZyBpbmZvcm1hdGlvbiwgb3IgdGhl
IGVuY29kaW5nIGNhbiBub3QgYmUgZm91bmQgaW4gYWxsIGVuY29kaW5ncworICAgIC8vIHN1cHBv
cnRlZCBpbiBvdXIgcGhvbmUsIHdlIHdpbGwgdHJ5IHRvIHRyYW5zY29kZSB0aGUgY29udGVudCBh
bnl3YXksIHN1cHBvc2VkIHRvIEFTQ0lJLgorCisgICAgaWYgKGVuY29kaW5nLmVtcHR5KCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIFRleHRFbmNvZGluZyhzX3V0ZjhFbmNv
ZGluZ05hbWUpICE9IFRleHRFbmNvZGluZyhlbmNvZGluZy5jX3N0cigpKTsKK30KKworZW51bSBU
cmFuc2NvZGVSZXN1bHQgeworICAgIFN1Y2Nlc3MsCisgICAgU291cmNlRW5jb2RpbmdVbnN1cHBv
cnRlZCwKKyAgICBTb3VyY2VCcm9rZW4sCisgICAgVGFyZ2V0RW5jb2RpbmdVbnN1cHBvcnRlZCwK
KyAgICBUYXJnZXRCdWZmZXJJbnN1ZmZpY2llbnQKK307CisKK3N0YXRpYyBUcmFuc2NvZGVSZXN1
bHQgdHJhbnNjb2RlKGNvbnN0IGNoYXIqIHNvdXJjZUVuY29kaW5nLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0RW5jb2RpbmcsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiYgc291cmNlU3RhcnQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY2hhciomIHRhcmdldFN0YXJ0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdldExlbmd0aCkKK3sKKyAgICBUZXh0
RW5jb2RpbmcgdGV4dEVuY29kaW5nU291cmNlKHNvdXJjZUVuY29kaW5nKTsKKyAgICBpZiAoIXRl
eHRFbmNvZGluZ1NvdXJjZS5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBTb3VyY2VFbmNvZGlu
Z1Vuc3VwcG9ydGVkOworCisgICAgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ1RhcmdldCh0YXJn
ZXRFbmNvZGluZyk7CisgICAgaWYgKCF0ZXh0RW5jb2RpbmdUYXJnZXQuaXNWYWxpZCgpKQorICAg
ICAgICByZXR1cm4gVGFyZ2V0RW5jb2RpbmdVbnN1cHBvcnRlZDsKKworICAgIGJvb2wgc2F3RXJy
b3IgPSBmYWxzZTsKKyAgICBTdHJpbmcgdWNzMiA9IFRleHRDb2RlY0lDVSh0ZXh0RW5jb2RpbmdT
b3VyY2UpLmRlY29kZShzb3VyY2VTdGFydCwgc291cmNlTGVuZ3RoLCB0cnVlLCB0cnVlLCBzYXdF
cnJvcik7CisKKyAgICBpZiAoc2F3RXJyb3IpCisgICAgICAgIHJldHVybiBTb3VyY2VCcm9rZW47
CisKKyAgICBDU3RyaW5nIGVuY29kZWQgPSBUZXh0Q29kZWNJQ1UodGV4dEVuY29kaW5nVGFyZ2V0
KS5lbmNvZGUodWNzMi5jaGFyYWN0ZXJzKCksIHVjczIubGVuZ3RoKCksIFdlYkNvcmU6OkVudGl0
aWVzRm9yVW5lbmNvZGFibGVzKTsKKyAgICBpZiAoZW5jb2RlZC5sZW5ndGgoKSA+IHRhcmdldExl
bmd0aCkKKyAgICAgICAgcmV0dXJuIFRhcmdldEJ1ZmZlckluc3VmZmljaWVudDsKKworICAgIHN0
cm5jcHkodGFyZ2V0U3RhcnQsIGVuY29kZWQuZGF0YSgpLCBlbmNvZGVkLmxlbmd0aCgpKTsKKyAg
ICB0YXJnZXRTdGFydCArPSBlbmNvZGVkLmxlbmd0aCgpOworCisgICAgcmV0dXJuIFN1Y2Nlc3M7
Cit9CisKK3N0YXRpYyBib29sIHRyYW5zY29kZUNvbnRlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGNv
bnRlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGluZywgc3RkOjpzdHJpbmcmIHJlc3VsdCkK
K3sKKyAgICB1bnNpZ25lZCB1dGY4bGVuZ3RoID0gY29udGVudC5zaXplKCkgKiAzIC8gMjsgLy8g
VXNlIG1heGltdW0gbnVtYmVyIHV0Zi04IGxlbmd0aC4KKyAgICBTY29wZUFycmF5PGNoYXI+IGJ1
ZmZlcihuZXcgY2hhclt1dGY4bGVuZ3RoICsgMV0pOworCisgICAgc3RkOjpzdHJpbmcgeG1sSGVh
ZGVyU3RyaW5nOworCisgICAgY29uc3QgY2hhciogc3RhcnQgPSBjb250ZW50LmNfc3RyKCk7Cisg
ICAgY29uc3QgY2hhciogeG1sU3RhcnQgPSBzdHJzdHIoc3RhcnQsICI8P3htbCAiKTsKKyAgICBj
b25zdCBjaGFyKiB4bWxFbmQ7CisgICAgaWYgKHhtbFN0YXJ0KSB7CisgICAgICAgIHhtbEVuZCA9
IHN0cnN0cih4bWxTdGFydCwgIj8+Iik7CisgICAgICAgIGlmICgheG1sRW5kKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB4bWxFbmQgKz0gMjsgLy8gbGVuZ3RoIG9mICI/PiIK
KworICAgICAgICBjb25zdCBjaGFyKiBlbmNvZGluZ1N0YXJ0OworICAgICAgICBjb25zdCBjaGFy
KiBlbmNvZGluZ0VuZDsKKyAgICAgICAgaWYgKGZpbmRYTUxFbmNvZGluZ1Bvc2l0aW9uKHN0YXJ0
LCBlbmNvZGluZ1N0YXJ0LCBlbmNvZGluZ0VuZCkpIHsKKyAgICAgICAgICAgIHhtbEhlYWRlclN0
cmluZy5hc3NpZ24oc3RhcnQsIGVuY29kaW5nU3RhcnQgLSBzdGFydCk7CisgICAgICAgICAgICB4
bWxIZWFkZXJTdHJpbmcuYXBwZW5kKHNfdXRmOEVuY29kaW5nTmFtZSk7CisgICAgICAgICAgICB4
bWxIZWFkZXJTdHJpbmcuYXBwZW5kKGVuY29kaW5nRW5kLCB4bWxFbmQgLSBlbmNvZGluZ0VuZCk7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4bWxIZWFkZXJTdHJpbmcuYXNzaWduKHN0
YXJ0LCAoeG1sRW5kIC0gMikgLSBzdGFydCk7CisgICAgICAgICAgICB4bWxIZWFkZXJTdHJpbmcu
YXBwZW5kKCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7
CisgICAgICAgIHhtbEVuZCA9IHN0YXJ0OworICAgICAgICB4bWxIZWFkZXJTdHJpbmcgPSAiPD94
bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IjsKKyAgICB9CisKKyAgICBj
b25zdCBjaGFyKiBjb250ZW50U3RhcnQgPSB4bWxFbmQ7CisgICAgY2hhciogYnVmZmVyU3RhcnQg
PSAmYnVmZmVyWzBdOworCisgICAgVHJhbnNjb2RlUmVzdWx0IHRyYW5zY29kZVJlc3VsdCA9IHRy
YW5zY29kZShlbmNvZGluZy5jX3N0cigpLCBzX3V0ZjhFbmNvZGluZ05hbWUsIGNvbnRlbnRTdGFy
dCwgY29udGVudC5sZW5ndGgoKSAtICh4bWxFbmQgLSB4bWxTdGFydCksIGJ1ZmZlclN0YXJ0LCB1
dGY4bGVuZ3RoKTsKKworICAgIC8vIElmIHRoZSBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLCBv
ciBpZiB3ZSBmYWlsZWQgdG8gdHJhbnNjb2RlIHRoZSBjb250ZW50LCB3ZSB3aWxsIGp1c3QKKyAg
ICAvLyBlbmNvZGUgdGhlIGNvbnRlbnQgdG8gQVNDSUkgY29udGVudCwgYW5kIHJlcGxhY2luZyBh
bnkgbm9uLUFTQ0lJIGNoYXJhY3RlciB3aXRoIGEgcXVlc3Rpb24KKyAgICAvLyBtYXJrLiBUaGlz
IHdpbGwgYmUgYmV0dGVyIHRoYW4gZGlzcGxheWluZyB0aGUgcmF3IHRleHQsIGFzIHRoZSByYXcg
dGV4dCBjYW4gbm90IGJlIGRpc3BsYXllZAorICAgIC8vIGNvcnJlY3RseSBhbnl3YXksIGFzIHRo
ZWlyIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisKKyAgICBpZiAoU3VjY2VzcyAhPSB0cmFu
c2NvZGVSZXN1bHQpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDsgY29udGVu
dFN0YXJ0IDwgc3RhcnQgKyBjb250ZW50LnNpemUoKSA7ICsrY29udGVudFN0YXJ0LCArK2kpIHsK
KyAgICAgICAgICAgIGlmIChpc0FTQ0lJUHJpbnRhYmxlKCpjb250ZW50U3RhcnQpKQorICAgICAg
ICAgICAgICAgIGJ1ZmZlcltpXSA9ICpjb250ZW50U3RhcnQ7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gJz8nOworICAgICAgICB9CisKKyAgICAgICAgYnVm
ZmVyW2ldID0gMDsKKyAgICB9IGVsc2UKKyAgICAgICAgKmJ1ZmZlclN0YXJ0ID0gMDsKKworICAg
IHJlc3VsdC5hc3NpZ24oeG1sSGVhZGVyU3RyaW5nKTsKKyAgICByZXN1bHQuYXBwZW5kKCZidWZm
ZXJbMF0pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1JTU0ZpbHRlclN0cmVhbTo6UlNTRmls
dGVyU3RyZWFtKCkKKyAgICA6IEZpbHRlclN0cmVhbSgpCisgICAgLCBtX3Jlc291cmNlVHlwZShU
WVBFX1VOS05PV04pCisgICAgLCBtX2NvbnRlbnRUeXBlSW5kZXgoLTEpCisgICAgLCBtX2NoYXJz
ZXRDaGVja2VkKGZhbHNlKQorICAgICwgbV9lbmNvZGluZ0NoZWNrZWQoZmFsc2UpCit7Cit9CisK
K3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpub3RpZnlTdGF0dXNSZWNlaXZlZChpbnQgc3RhdHVzLCBj
b25zdCBjaGFyKiBtZXNzYWdlKQoreworICAgIC8vIG5vbi1IVFRQIGVycm9ycyBoYXZlIG5vIGRh
dGEgdG8gZGlzcGxheSwgYW5kIHJlZGlyZWN0cyB3aWxsIG5ldmVyIGJlIGRpc3BsYXllZCwKKyAg
ICAvLyBzbyBubyBuZWVkIHRvIGNoZWNrIGlmIHRoZXkgaGF2ZSBSU1MgZGF0YQorICAgIC8vIEhU
VFAgZXJyb3JzIG1heSBoYXZlIGRhdGEsIGFuZCBpbiB0aGVvcnkgaXQgY291bGQgYmUgUlNTIGRh
dGEgKGFsdGhvdWdoIGl0J3MgaGlnaGx5IHVubGlrZWx5KSBzbyBiZXR0ZXIgdG8ga2VlcCBjaGVj
a2luZyB0aGVtCisgICAgaWYgKHN0YXR1cyA8IDAgfHwgKDMwMCA8PSBzdGF0dXMgJiYgc3RhdHVz
IDwgNDAwICYmIHN0YXR1cyAhPSAzMDQpKSB7CisgICAgICAgIG1fcmVzb3VyY2VUeXBlID0gVFlQ
RV9OT1RfUlNTOworICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB3ZSB3aWxsIGdldCAyIHN0YXR1
cyBjb2RlLgorICAgICAgICBzZW5kU2F2ZWRIZWFkZXJzKCk7CisgICAgfQorCisgICAgRmlsdGVy
U3RyZWFtOjpub3RpZnlTdGF0dXNSZWNlaXZlZChzdGF0dXMsIG1lc3NhZ2UpOworfQorCit2b2lk
IFJTU0ZpbHRlclN0cmVhbTo6bm90aWZ5SGVhZGVyc1JlY2VpdmVkKE5ldHdvcmtSZXF1ZXN0OjpI
ZWFkZXJMaXN0JiBoZWFkZXJzKQoreworICAgIGlmICghaXNSU1NDb250ZW50KG1fcmVzb3VyY2VU
eXBlKSkgeworICAgICAgICBOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdDo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gaGVhZGVycy5lbmQoKTsKKyAgICAgICAgTmV0d29ya1JlcXVlc3Q6OkhlYWRlckxp
c3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBoZWFkZXJzLmJlZ2luKCk7CisgICAgICAgIGZvciAo
OyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nh
c2UoaXRlci0+Zmlyc3QsIHNfY29udGVudFR5cGVIZWFkZXJLZXkpKSB7CisgICAgICAgICAgICAg
ICAgaWYgKGl0ZXItPnNlY29uZC5maW5kKCJ4bWwiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewor
ICAgICAgICAgICAgICAgICAgICBtX2NvbnRlbnRUeXBlSW5kZXggPSBzdGQ6OmRpc3RhbmNlKE5l
dHdvcmtSZXF1ZXN0OjpIZWFkZXJMaXN0Ojpjb25zdF9pdGVyYXRvcihoZWFkZXJzLmJlZ2luKCkp
LCBpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlIHR5cGUgPSBSU1NUeXBl
RnJvbUNvbnRlbnRUeXBlKGl0ZXItPnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChp
c1JTU0NvbnRlbnQodHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBtX3Jlc291cmNlVHlw
ZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc1BvdGVudGlhbFJTU01J
TUVUeXBlKGl0ZXItPnNlY29uZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBtX3Jlc291cmNl
VHlwZSA9IFRZUEVfTk9UX1JTUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9jb250
ZW50VHlwZUluZGV4IDwgMCkKKyAgICAgICAgbV9yZXNvdXJjZVR5cGUgPSBUWVBFX05PVF9SU1M7
CisKKyAgICBpZiAobV9yZXNvdXJjZVR5cGUgPT0gVFlQRV9OT1RfUlNTKSB7CisgICAgICAgIHNl
bmRTYXZlZEhlYWRlcnMoKTsKKyAgICAgICAgRmlsdGVyU3RyZWFtOjpub3RpZnlIZWFkZXJzUmVj
ZWl2ZWQoaGVhZGVycyk7CisgICAgfSBlbHNlCisgICAgICAgIHNhdmVIZWFkZXJzKGhlYWRlcnMp
OworfQorCit2b2lkIFJTU0ZpbHRlclN0cmVhbTo6bm90aWZ5RGF0YVJlY2VpdmVkKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpOZXR3b3JrQnVmZmVyKiBidWZmZXIpCit7CisgICAgLy8gSGVyZSB3ZSBh
c3N1bWUgdGhlIGZpcnN0IHBhY2tldCBvZiBkYXRhIGlzIGVub3VnaCBmb3IgdXMgdG8gc25pZmYg
dGhlIGNvbnRlbnQgdHlwZS4KKyAgICAvLyBJZiBzb21lZGF5IHNvbWUgZGVjZW50IHJlYWwgbGlm
ZSB3ZWIgc2l0ZSB2b2lkIHRoaXMgYXNzdW1wdGlvbiwgd2Ugc2hvdWxkIHJlLWltcGxlbWVudAor
ICAgIC8vIHRoaXMgY29kZS4gQnV0IGZvciBub3cgaXQgc2hvdWxkIGJlIGp1c3QgZmluZS4KKyAg
ICBpZiAobV9yZXNvdXJjZVR5cGUgPT0gVFlQRV9VTktOT1dOKQorICAgICAgICBtX3Jlc291cmNl
VHlwZSA9IFJTU1R5cGVGcm9tQ29udGVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bmV0d29ya0J1
ZmZlckRhdGEoYnVmZmVyKSwgQmxhY2tCZXJyeTo6UGxhdGZvcm06Om5ldHdvcmtCdWZmZXJEYXRh
TGVuZ3RoKGJ1ZmZlcikpOworCisgICAgLy8gSWYgd2UgZG9uJ3Qga25vdyB0aGUgcmVzb3VyY2Ug
dHlwZSBhdCB0aGlzIHN0YWdlLCB0aGVuIGl0IGlzIG5vdCBhCisgICAgLy8gUlNTIGNvbnRlbnQu
CisgICAgaWYgKG1fcmVzb3VyY2VUeXBlID09IFRZUEVfVU5LTk9XTikKKyAgICAgICAgbV9yZXNv
dXJjZVR5cGUgPSBUWVBFX05PVF9SU1M7CisKKyAgICBpZiAoaXNSU1NDb250ZW50KG1fcmVzb3Vy
Y2VUeXBlKSkKKyAgICAgICAgYXBwZW5kRGF0YShidWZmZXIpOworICAgIGVsc2UgeworICAgICAg
ICBzZW5kU2F2ZWRIZWFkZXJzKCk7CisgICAgICAgIEZpbHRlclN0cmVhbTo6bm90aWZ5RGF0YVJl
Y2VpdmVkKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIFJTU0ZpbHRlclN0cmVhbTo6bm90aWZ5
Q2xvc2UoaW50IHN0YXR1cykKK3sKKyAgICBpZiAoaXNSU1NDb250ZW50KG1fcmVzb3VyY2VUeXBl
KSkKKyAgICAgICAgaGFuZGxlUlNTQ29udGVudCgpOworICAgIGVsc2UKKyAgICAgICAgRmlsdGVy
U3RyZWFtOjpub3RpZnlDbG9zZShzdGF0dXMpOworfQorCitib29sIFJTU0ZpbHRlclN0cmVhbTo6
Y29udmVydENvbnRlbnRUb0h0bWwoc3RkOjpzdHJpbmcmIHJlc3VsdCkKK3sKKyAgICBib29sIHN1
Y2Nlc3MgPSBmYWxzZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZSA9IHVybCgpOworICAg
IGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmMgPSBlbmNvZGluZygpOworCisgICAgT3duUHRyPFJTU1Bh
cnNlckJhc2U+IHBhcnNlciA9IGNyZWF0ZVBhcnNlcihtX3Jlc291cmNlVHlwZSk7CisKKyAgICBp
ZiAoaXNUcmFuc2NvZGluZ05lZWRlZChlbmMpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRyYW5z
Y29kZWRDb250ZW50OworICAgICAgICBpZiAodHJhbnNjb2RlQ29udGVudChtX2NvbnRlbnQsIGVu
YywgdHJhbnNjb2RlZENvbnRlbnQpKQorICAgICAgICAgICAgc3VjY2VzcyA9IHBhcnNlci0+cGFy
c2VCdWZmZXIodHJhbnNjb2RlZENvbnRlbnQuZGF0YSgpLCB0cmFuc2NvZGVkQ29udGVudC5sZW5n
dGgoKSwgYmFzZS5jX3N0cigpLCBzX3V0ZjhFbmNvZGluZ05hbWUpOworICAgIH0gZWxzZQorICAg
ICAgICBzdWNjZXNzID0gcGFyc2VyLT5wYXJzZUJ1ZmZlcihtX2NvbnRlbnQuZGF0YSgpLCBtX2Nv
bnRlbnQubGVuZ3RoKCksIGJhc2UuY19zdHIoKSwgc191dGY4RW5jb2RpbmdOYW1lKTsKKworICAg
IGlmICghc3VjY2VzcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgT3duUHRyPFJTU0dl
bmVyYXRvcj4gZ2VuZXJhdG9yID0gYWRvcHRQdHIobmV3IFJTU0dlbmVyYXRvcigpKTsKKyAgICBT
dHJpbmcgaHRtbCA9IGdlbmVyYXRvci0+Z2VuZXJhdGVIdG1sKHBhcnNlci0+bV9yb290KTsKKyAg
ICByZXN1bHQgPSBodG1sLnV0ZjgodHJ1ZSkuZGF0YSgpOworCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpoYW5kbGVSU1NDb250ZW50KCkKK3sKKyAgICBCTEFD
S0JFUlJZX0FTU0VSVChpc1JTU0NvbnRlbnQobV9yZXNvdXJjZVR5cGUpKTsKKworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrQnVmZmVyKiBidWZmZXI7CisgICAgc3RkOjpzdHJpbmcg
aHRtbDsKKyAgICBpZiAoIWNvbnZlcnRDb250ZW50VG9IdG1sKGh0bWwpKQorICAgICAgICBidWZm
ZXIgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTmV0d29ya0J1ZmZlcldpdGhEYXRhKG1f
Y29udGVudC5jX3N0cigpLCBtX2NvbnRlbnQuc2l6ZSgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAg
dXBkYXRlUlNTSGVhZGVycyhodG1sLnNpemUoKSk7CisgICAgICAgIGJ1ZmZlciA9IEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpjcmVhdGVOZXR3b3JrQnVmZmVyV2l0aERhdGEoaHRtbC5jX3N0cigpLCBo
dG1sLnNpemUoKSk7CisgICAgfQorCisgICAgc2VuZFNhdmVkSGVhZGVycygpOworICAgIEZpbHRl
clN0cmVhbTo6bm90aWZ5RGF0YVJlY2VpdmVkKGJ1ZmZlcik7CisgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OnJlbGVhc2VOZXR3b3JrQnVmZmVyKGJ1ZmZlcik7CisgICAgRmlsdGVyU3RyZWFtOjpu
b3RpZnlDbG9zZShGaWx0ZXJTdHJlYW06OlN0YXR1c1N1Y2Nlc3MpOworfQorCitjb25zdCBzdGQ6
OnN0cmluZyYgUlNTRmlsdGVyU3RyZWFtOjpjaGFyc2V0KCkKK3sKKyAgICBCTEFDS0JFUlJZX0FT
U0VSVChtX2NvbnRlbnRUeXBlSW5kZXggPj0gMCk7CisKKyAgICBpZiAobV9jaGFyc2V0Q2hlY2tl
ZCkKKyAgICAgICAgcmV0dXJuIG1fY2hhcnNldDsKKworICAgIG1fY2hhcnNldENoZWNrZWQgPSB0
cnVlOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNoYXJzZXRQcmVmaXggPSAiY2hhcnNldD0i
OworICAgIHN0YXRpYyBjb25zdCBpbnQgY2hhcnNldFByZWZpeExlbiA9IHN0cmxlbihjaGFyc2V0
UHJlZml4KTsKKyAgICBzaXplX3QgcG9zID0gKG1faGVhZGVycy5hdChtX2NvbnRlbnRUeXBlSW5k
ZXgpLnNlY29uZCkuZmluZChjaGFyc2V0UHJlZml4KTsKKyAgICBpZiAocG9zICE9IHN0ZDo6c3Ry
aW5nOjpucG9zKSB7CisgICAgICAgIG1fY2hhcnNldCA9IG1faGVhZGVycy5hdChtX2NvbnRlbnRU
eXBlSW5kZXgpLnNlY29uZC5zdWJzdHIocG9zICsgY2hhcnNldFByZWZpeExlbik7CisgICAgICAg
IHN0cmlwV2hpdGVTcGFjZShtX2NoYXJzZXQpOworICAgIH0KKworICAgIHJldHVybiBtX2NoYXJz
ZXQ7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBSU1NGaWx0ZXJTdHJlYW06OmVuY29kaW5nKCkK
K3sKKyAgICBpZiAobV9lbmNvZGluZ0NoZWNrZWQpCisgICAgICAgIHJldHVybiBtX2VuY29kaW5n
OworCisgICAgbV9lbmNvZGluZ0NoZWNrZWQgPSB0cnVlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5n
JiBzdHIgPSBjaGFyc2V0KCk7CisKKyAgICBpZiAoIXN0ci5lbXB0eSgpKSB7CisgICAgICAgIG1f
ZW5jb2RpbmcgPSBzdHI7CisgICAgICAgIHJldHVybiBtX2VuY29kaW5nOworICAgIH0KKworICAg
IGNvbnN0IGNoYXIqIHN0YXJ0ID0gbV9jb250ZW50LmNfc3RyKCk7CisgICAgY29uc3QgY2hhciog
ZW5jb2RpbmdTdGFydCA9IDA7CisgICAgY29uc3QgY2hhciogZW5jb2RpbmdFbmQgPSAwOworICAg
IGlmIChmaW5kWE1MRW5jb2RpbmdQb3NpdGlvbihzdGFydCwgZW5jb2RpbmdTdGFydCwgZW5jb2Rp
bmdFbmQpKSB7CisgICAgICAgIG1fZW5jb2RpbmcgPSBzdGQ6OnN0cmluZyhlbmNvZGluZ1N0YXJ0
LCBlbmNvZGluZ0VuZCAtIGVuY29kaW5nU3RhcnQpOworICAgICAgICByZXR1cm4gbV9lbmNvZGlu
ZzsKKyAgICB9CisKKyAgICBpZiAoZmluZFhNTExhbmd1YWdlUG9zaXRpb24oc3RhcnQsIGVuY29k
aW5nU3RhcnQsIGVuY29kaW5nRW5kKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBsYW5ndWFnZVN0
cmluZyhlbmNvZGluZ1N0YXJ0LCBlbmNvZGluZ0VuZCAtIGVuY29kaW5nU3RhcnQpOworICAgICAg
ICBjb25zdCBjaGFyKiBkZWZhdWx0RW5jb2RpbmcgPSBkZWZhdWx0RW5jb2RpbmdGb3JMYW5ndWFn
ZShsYW5ndWFnZVN0cmluZy5jX3N0cigpKTsKKyAgICAgICAgaWYgKGRlZmF1bHRFbmNvZGluZykg
eworICAgICAgICAgICAgbV9lbmNvZGluZyA9IGRlZmF1bHRFbmNvZGluZzsKKyAgICAgICAgICAg
IHJldHVybiBtX2VuY29kaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1fZW5j
b2Rpbmc7Cit9CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpzYXZlSGVhZGVycyhjb25zdCBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkhlYWRlckxpc3QmIGhlYWRlcnMpCit7
CisgICAgbV9oZWFkZXJzID0gaGVhZGVyczsKK30KKwordm9pZCBSU1NGaWx0ZXJTdHJlYW06OnJl
bW92ZUhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5KQoreworICAgIE5ldHdvcmtSZXF1ZXN0
OjpIZWFkZXJMaXN0OjppdGVyYXRvciBlbmQgPSBtX2hlYWRlcnMuZW5kKCk7CisgICAgZm9yIChO
ZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdDo6aXRlcmF0b3IgaXRlciA9IG1faGVhZGVycy5iZWdp
bigpOyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgIGlmICghc3RyY2FzZWNtcChpdGVy
LT5maXJzdC5jX3N0cigpLCBrZXkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIG1faGVhZGVycy5l
cmFzZShpdGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwor
dm9pZCBSU1NGaWx0ZXJTdHJlYW06OnVwZGF0ZUhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5
LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpCit7CisgICAgTmV0d29ya1JlcXVlc3Q6OkhlYWRl
ckxpc3Q6Oml0ZXJhdG9yIGl0ZXIgPSBtX2hlYWRlcnMuYmVnaW4oKTsKKyAgICBOZXR3b3JrUmVx
dWVzdDo6SGVhZGVyTGlzdDo6aXRlcmF0b3IgZW5kID0gbV9oZWFkZXJzLmVuZCgpOworICAgIGZv
ciAoOyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgIGlmICghc3RyY2FzZWNtcChpdGVy
LT5maXJzdC5jX3N0cigpLCBrZXkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIGl0ZXItPnNlY29u
ZCA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAg
bV9oZWFkZXJzLmluc2VydChpdGVyLCBzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlKSk7Cit9CisK
K3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjp1cGRhdGVSU1NIZWFkZXJzKHNpemVfdCBzaXplKQorewor
ICAgIHJlbW92ZUhlYWRlcihzX2NvbnRlbnRFbmNvZGluZ0hlYWRlcktleSk7CisgICAgdXBkYXRl
SGVhZGVyKHNfY29udGVudFR5cGVIZWFkZXJLZXksICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgi
KTsKKworICAgIGNoYXIgYnVmZmVyWzE2XTsKKyAgICBzbnByaW50ZihidWZmZXIsIDE2LCAiJWQi
LCBzaXplKTsKKyAgICB1cGRhdGVIZWFkZXIoc19jb250ZW50TGVuZ3RoSGVhZGVyS2V5LCBzdGQ6
OnN0cmluZyhidWZmZXIsIDE2KSk7Cit9CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpzZW5kU2F2
ZWRIZWFkZXJzKCkKK3sKKyAgICBpZiAoIW1faGVhZGVycy5lbXB0eSgpKSB7CisgICAgICAgIEZp
bHRlclN0cmVhbTo6bm90aWZ5SGVhZGVyc1JlY2VpdmVkKG1faGVhZGVycyk7CisgICAgICAgIC8v
IG1ha2Ugc3VyZSB0aGUgaGVhZGVycyBhcmUgbmV2ZXIgc2VudCB0d2ljZQorICAgICAgICBtX2Nv
bnRlbnRUeXBlSW5kZXggPSAtMTsKKyAgICAgICAgbV9oZWFkZXJzLmNsZWFyKCk7CisgICAgfQor
fQorCit2b2lkIFJTU0ZpbHRlclN0cmVhbTo6YXBwZW5kRGF0YShCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6TmV0d29ya0J1ZmZlciogYnVmZmVyKQoreworICAgIG1fY29udGVudC5hcHBlbmQobmV0d29y
a0J1ZmZlckRhdGEoYnVmZmVyKSwgbmV0d29ya0J1ZmZlckRhdGFMZW5ndGgoYnVmZmVyKSk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTRmlsdGVyU3RyZWFtLmggYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVhbS5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2QxZjYKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JT
U0ZpbHRlclN0cmVhbS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwg
Qm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSU1NGaWx0ZXJTdHJl
YW1faAorI2RlZmluZSBSU1NGaWx0ZXJTdHJlYW1faAorCisjaW5jbHVkZSA8bmV0d29yay9GaWx0
ZXJTdHJlYW0uaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQv
V1RGU3RyaW5nLmg+CisKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSU1NGaWx0ZXJT
dHJlYW0gOiBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbSB7CitwdWJs
aWM6CisgICAgZW51bSBSZXNvdXJjZVR5cGUgeworICAgICAgICBUWVBFX1VOS05PV04gPSAwLAor
ICAgICAgICBUWVBFX05PVF9SU1MsCisgICAgICAgIFRZUEVfUlNTMTBfQ09OVEVOVCwKKyAgICAg
ICAgVFlQRV9SU1MyMF9DT05URU5ULAorICAgICAgICBUWVBFX0FUT01fQ09OVEVOVAorICAgIH07
CisKKyAgICBSU1NGaWx0ZXJTdHJlYW0oKTsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTdGF0
dXNSZWNlaXZlZChpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKTsKKyAgICB2aXJ0dWFs
IHZvaWQgbm90aWZ5SGVhZGVyc1JlY2VpdmVkKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3Jr
UmVxdWVzdDo6SGVhZGVyTGlzdCYpOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlEYXRhUmVjZWl2
ZWQoQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtCdWZmZXIqKTsKKyAgICB2aXJ0dWFsIHZv
aWQgbm90aWZ5Q2xvc2UoaW50IHN0YXR1cyk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBjb252ZXJ0
Q29udGVudFRvSHRtbChzdGQ6OnN0cmluZyYgcmVzdWx0KTsKKyAgICB2b2lkIGhhbmRsZVJTU0Nv
bnRlbnQoKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGFyc2V0KCk7CisgICAgY29uc3Qg
c3RkOjpzdHJpbmcmIGVuY29kaW5nKCk7CisKKyAgICB2b2lkIHNhdmVIZWFkZXJzKGNvbnN0IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdCYpOworICAgIHZv
aWQgcmVtb3ZlSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOworICAgIHZvaWQgdXBkYXRl
SGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7
CisgICAgdm9pZCB1cGRhdGVSU1NIZWFkZXJzKHNpemVfdCk7CisgICAgdm9pZCBzZW5kU2F2ZWRI
ZWFkZXJzKCk7CisKKyAgICB2b2lkIGFwcGVuZERhdGEoQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5l
dHdvcmtCdWZmZXIqKTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVz
dDo6SGVhZGVyTGlzdCBtX2hlYWRlcnM7CisgICAgc3RkOjpzdHJpbmcgbV9jb250ZW50OworICAg
IHN0ZDo6c3RyaW5nIG1fY2hhcnNldDsKKyAgICBzdGQ6OnN0cmluZyBtX2VuY29kaW5nOworCisg
ICAgUmVzb3VyY2VUeXBlIG1fcmVzb3VyY2VUeXBlOworICAgIGludCBtX2NvbnRlbnRUeXBlSW5k
ZXg7CisKKyAgICBib29sIG1fY2hhcnNldENoZWNrZWQ7CisgICAgYm9vbCBtX2VuY29kaW5nQ2hl
Y2tlZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJTU0ZpbHRl
clN0cmVhbV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2Js
YWNrYmVycnkvcnNzL1JTU0dlbmVyYXRvci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0dlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uNmYxZjg0MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmNwcApAQCAt
MCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwgMjAx
MiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0x
MzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUlNTR2VuZXJh
dG9yLmgiCisKKyNpbmNsdWRlICJMb2NhbGl6ZVJlc291cmNlLmgiCisjaW5jbHVkZSAiUlNTUGFy
c2VyQmFzZS5oIgorCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBzX2RlZmF1bHRGZWVkVGl0bGUgPSBpMThu
KCJVbnRpdGxlZCBGZWVkIik7CitzdGF0aWMgY29uc3QgY2hhciogc19kZWZhdWx0RW50cnlUaXRs
ZSA9IGkxOG4oIlVudGl0bGVkIEVudHJ5Iik7CisKK1JTU0dlbmVyYXRvcjo6UlNTR2VuZXJhdG9y
KCkKK3sKK30KKworUlNTR2VuZXJhdG9yOjp+UlNTR2VuZXJhdG9yKCkKK3sKK30KKworU3RyaW5n
IFJTU0dlbmVyYXRvcjo6Z2VuZXJhdGVIdG1sKFJTU0ZlZWQqIGZlZWQpCit7CisgICAgU3RyaW5n
IHJjOworICAgIHJjICs9ICI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1U
eXBlXCIgY29udGVudD1cInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04XCIgLz4iOworICAgIHJjICs9
ICI8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwiaW5pdGlhbC1zY2FsZT0xLjAsIHVz
ZXItc2NhbGFibGU9IG5vXCI+IjsKKyAgICByYyArPSAiPHRpdGxlPiI7CisKKyAgICBpZiAoIWZl
ZWQtPm1fdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICByYyArPSBmZWVkLT5tX3RpdGxlOworICAg
IGVsc2UgaWYgKCFmZWVkLT5tX2xpbmsuaXNFbXB0eSgpKQorICAgICAgICByYyArPSBmZWVkLT5t
X2xpbms7CisgICAgZWxzZQorICAgICAgICByYyArPSBzX2RlZmF1bHRGZWVkVGl0bGU7CisKKyAg
ICByYyArPSAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IjsKKworICAgIHJjICs9ICI8aDI+IjsKKyAg
ICBpZiAoIWZlZWQtPm1fbGluay5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmMgKz0gIjxhIGhyZWY9
XCIiOworICAgICAgICByYyArPSBmZWVkLT5tX2xpbms7CisgICAgICAgIHJjICs9ICJcIj4iOwor
ICAgIH0KKyAgICBpZiAoIWZlZWQtPm1fdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICByYyArPSBm
ZWVkLT5tX3RpdGxlOworICAgIGVsc2UKKyAgICAgICAgcmMgKz0gc19kZWZhdWx0RmVlZFRpdGxl
OworCisgICAgaWYgKCFmZWVkLT5tX2xpbmsuaXNFbXB0eSgpKQorICAgICAgICByYyArPSAiPC9h
PiI7CisKKyAgICByYyArPSAiPC9oMj4iOworCisgICAgaWYgKCFmZWVkLT5tX2Rlc2NyaXB0aW9u
LmlzRW1wdHkoKSkgeworICAgICAgICByYyArPSAiPHA+IjsKKyAgICAgICAgcmMgKz0gZmVlZC0+
bV9kZXNjcmlwdGlvbjsKKyAgICAgICAgcmMgKz0gIjwvcD4iOworICAgIH0KKworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBmZWVkLT5tX2l0ZW1zLnNpemUoKTsgKytpKSB7CisgICAgICAg
IFJTU0l0ZW0qIGl0ZW0gPSBmZWVkLT5tX2l0ZW1zW2ldOworICAgICAgICBTdHJpbmcgYXJ0aWNs
ZU5hbWU7CisgICAgICAgIHJjICs9ICI8ZGl2IGlkPVwiIjsKKyAgICAgICAgcmMgKz0gYXJ0aWNs
ZU5hbWU7CisgICAgICAgIHJjICs9ICJcIiBjbGFzcz1cImFydGljbGVcIj5cbjxhIGhyZWY9XCIi
OworICAgICAgICBpZiAoIWl0ZW0tPm1fbGluay5pc0VtcHR5KCkpCisgICAgICAgICAgICByYyAr
PSAgaXRlbS0+bV9saW5rLnV0ZjgodHJ1ZSkuZGF0YSgpOworICAgICAgICByYyArPSAiXCI+PGI+
IjsKKyAgICAgICAgaWYgKCFpdGVtLT5tX3RpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJj
ICs9ICBpdGVtLT5tX3RpdGxlLnV0ZjgodHJ1ZSkuZGF0YSgpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICByYyArPSBzX2RlZmF1bHRFbnRyeVRpdGxlOworICAgICAgICByYyArPSAiPC9iPjwv
YT5cbjxiciAvPiI7CisKKyAgICAgICAgaWYgKCFpdGVtLT5tX2F1dGhvci5pc0VtcHR5KCkpIHsK
KyAgICAgICAgICAgIHJjICs9IGkxOG4oIkJ5Iik7CisgICAgICAgICAgICByYyArPSAiIDxiPiI7
CisgICAgICAgICAgICByYyArPSBpdGVtLT5tX2F1dGhvci51dGY4KHRydWUpLmRhdGEoKTsKKyAg
ICAgICAgICAgIHJjICs9ICI8L2I+ICI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBp
ZiAoIWZlZWQtPm1fYXV0aG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJjICs9IGkx
OG4oIkJ5Iik7CisgICAgICAgICAgICAgICAgcmMgKz0gIiA8Yj4iOworICAgICAgICAgICAgICAg
IHJjICs9IGZlZWQtPm1fYXV0aG9yLnV0ZjgodHJ1ZSkuZGF0YSgpOworICAgICAgICAgICAgICAg
IHJjICs9ICI8L2I+ICI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAo
IWl0ZW0tPm1fY2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmICghaXRlbS0+
bV9hdXRob3IuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJjICs9IGkxOG4oInVuZGVyICIp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJjICs9IGkxOG4oIlVuZGVyICIp
OworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbS0+bV9jYXRlZ29y
aWVzLnNpemUoKSA7ICsraSkgeworICAgICAgICAgICAgICAgIHJjICs9ICI8Yj4iOworICAgICAg
ICAgICAgICAgIHJjICs9IGl0ZW0tPm1fY2F0ZWdvcmllc1tpXS51dGY4KHRydWUpLmRhdGEoKTsK
KyAgICAgICAgICAgICAgICByYyArPSAiPC9iPiI7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA8
IGl0ZW0tPm1fY2F0ZWdvcmllcy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICByYyAr
PSAiLCAiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmMgKz0gIjxiciAv
PiI7CisgICAgICAgIGlmICghaXRlbS0+bV9wdWJEYXRlLmlzRW1wdHkoKSkKKyAgICAgICAgICAg
IHJjICs9IGl0ZW0tPm1fcHViRGF0ZS51dGY4KHRydWUpLmRhdGEoKTsKKworICAgICAgICByYyAr
PSAiPGJyIC8+IjsKKyAgICAgICAgaWYgKCFpdGVtLT5tX2Rlc2NyaXB0aW9uLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIHJjICs9IGl0ZW0tPm1fZGVzY3JpcHRpb24udXRmOCh0cnVlKS5kYXRhKCk7
CisgICAgICAgIHJjICs9ICI8YnIgLz4iOworCisgICAgICAgIGlmIChpdGVtLT5tX2VuY2xvc3Vy
ZSkgeworICAgICAgICAgICAgcmMgKz0gIjxiciAvPiI7CisgICAgICAgICAgICByYyArPSAiPGEg
aHJlZj1cIiI7CisgICAgICAgICAgICByYyArPSBpdGVtLT5tX2VuY2xvc3VyZS0+bV91cmw7Cisg
ICAgICAgICAgICByYyArPSAiXCI+IjsKKyAgICAgICAgICAgIHJjICs9IGkxOG4oIkVtYmVkZGVk
ICIpOworCisgICAgICAgICAgICBSU1NFbmNsb3N1cmU6OlR5cGUgdHlwZSA9IGl0ZW0tPm1fZW5j
bG9zdXJlLT50eXBlSW5FbnVtKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAg
ICAgICAgIGNhc2UgUlNTRW5jbG9zdXJlOjpUeXBlSW1hZ2U6CisgICAgICAgICAgICAgICAgcmMg
Kz0gaTE4bigiSW1hZ2UiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNh
c2UgUlNTRW5jbG9zdXJlOjpUeXBlQXVkaW86CisgICAgICAgICAgICAgICAgcmMgKz0gaTE4bigi
QXVkaW8iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNTRW5j
bG9zdXJlOjpUeXBlVmlkZW86CisgICAgICAgICAgICAgICAgcmMgKz0gaTE4bigiVmlkZW8iKTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNTRW5jbG9zdXJlOjpU
eXBlQXBwbGljYXRpb246CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJj
ICs9IGkxOG4oIlVua25vd24gQ29udGVudCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByYyArPSBpMThuKCIgU291cmNlOiAiKTsKKyAgICAg
ICAgICAgIHJjICs9IGl0ZW0tPm1fZW5jbG9zdXJlLT5zdWdnZXN0ZWROYW1lKCk7CisgICAgICAg
ICAgICByYyArPSAiPC9hPjxiciAvPjxiciAvPiI7CisgICAgICAgIH0KKworICAgICAgICByYyAr
PSAiPGJyIC8+PC9kaXY+XG4iOworICAgIH0KKworICAgIHJjICs9ICI8L2JvZHk+PC9odG1sPlxu
IjsKKworICAgIHJldHVybiByYzsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NH
ZW5lcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9y
c3MvUlNTR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4
NjI1YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGlt
aXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2Vy
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRo
ZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVm
IFJTU0dlbmVyYXRvcl9oCisjZGVmaW5lIFJTU0dlbmVyYXRvcl9oCisKKyNpbmNsdWRlIDx3dGYv
dGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSU1NGZWVk
OworCitjbGFzcyBSU1NHZW5lcmF0b3IgeworcHVibGljOgorICAgIFJTU0dlbmVyYXRvcigpOwor
ICAgIH5SU1NHZW5lcmF0b3IoKTsKKworICAgIFN0cmluZyBnZW5lcmF0ZUh0bWwoUlNTRmVlZCop
OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUlNTR2VuZXJhdG9y
X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9yc3MvUlNTUGFyc2VyQmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjU3ODlkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuY3BwCkBAIC0wLDAg
KzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSU1NQYXJzZXJCYXNl
LmgiCisKKyNpbmNsdWRlICJsaWJ4bWwvcGFyc2VyLmgiCisjaW5jbHVkZSAibGlieG1sL3htbHdy
aXRlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JTU0VuY2xvc3VyZTo6UlNTRW5jbG9z
dXJlKCkKKyAgICA6IG1fdHlwZUluRW51bShUeXBlVW5rbm93bikKK3sgfQorCitSU1NFbmNsb3N1
cmU6OlR5cGUgUlNTRW5jbG9zdXJlOjp0eXBlSW5FbnVtKCkKK3sKKyAgICBpZiAoVHlwZVVua25v
d24gIT0gbV90eXBlSW5FbnVtKQorICAgICAgICByZXR1cm4gbV90eXBlSW5FbnVtOworCisgICAg
c2l6ZV90IGRpdiA9IG1fdHlwZS5maW5kKCcvJyk7CisgICAgaWYgKFdURjo6bm90Rm91bmQgPT0g
ZGl2IHx8ICFkaXYpIHsKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVVuc3VwcG9ydGVkOwor
ICAgICAgICByZXR1cm4gbV90eXBlSW5FbnVtOworICAgIH0KKworICAgIFN0cmluZyBiYXNlID0g
bV90eXBlLnN1YnN0cmluZygwLCBkaXYpLmxvd2VyKCk7CisgICAgaWYgKGJhc2UgPT0gImltYWdl
IikKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUltYWdlOworICAgIGVsc2UgaWYgKGJhc2Ug
PT0gImF1ZGlvIikKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUF1ZGlvOworICAgIGVsc2Ug
aWYgKGJhc2UgPT0gInZpZGVvIikKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVZpZGVvOwor
ICAgIGVsc2UgaWYgKGJhc2UgPT0gImFwcGxpY2F0aW9uIikKKyAgICAgICAgbV90eXBlSW5FbnVt
ID0gVHlwZUFwcGxpY2F0aW9uOworICAgIGVsc2UKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlw
ZVVuc3VwcG9ydGVkOworCisgICAgcmV0dXJuIG1fdHlwZUluRW51bTsKK30KKworU3RyaW5nIFJT
U0VuY2xvc3VyZTo6c3VnZ2VzdGVkTmFtZSgpIGNvbnN0Cit7CisgICAgc2l6ZV90IHN0YXJ0ID0g
bV91cmwucmV2ZXJzZUZpbmQoJy8nKTsKKyAgICBpZiAoV1RGOjpub3RGb3VuZCA9PSBzdGFydCkK
KyAgICAgICAgc3RhcnQgPSAwOworICAgIGVsc2UKKyAgICAgICAgKytzdGFydDsKKworICAgIHJl
dHVybiBtX3VybC5zdWJzdHJpbmcoc3RhcnQpOworfQorCitSU1NGZWVkOjpSU1NGZWVkKCkKK3sK
K30KKworUlNTRmVlZDo6flJTU0ZlZWQoKQoreworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgUlNT
RmVlZDo6Y2xlYXIoKQoreworICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2l0ZW1zKTsKKyAgICBtX2l0
ZW1zLmNsZWFyKCk7Cit9CisKK1JTU0l0ZW06OlJTU0l0ZW0oKQorICAgIDogbV9lbmNsb3N1cmUo
MCkKK3sKK30KKworUlNTSXRlbTo6flJTU0l0ZW0oKQoreworICAgIGNsZWFyKCk7Cit9CisKK3Zv
aWQgUlNTSXRlbTo6Y2xlYXIoKQoreworICAgIGRlbGV0ZSBtX2VuY2xvc3VyZTsKK30KKworUlNT
UGFyc2VyQmFzZTo6UlNTUGFyc2VyQmFzZSgpCisgICAgOiBtX3Jvb3QoMCkKK3sKK30KKworUlNT
UGFyc2VyQmFzZTo6flJTU1BhcnNlckJhc2UoKQoreworICAgIGRlbGV0ZSBtX3Jvb3Q7Cit9CisK
K1N0cmluZyB0ZXh0RnJvbVhNTEF0dHIoeG1sQXR0ciogYXR0cikKK3sKKyAgICBpZiAoIWF0dHIp
CisgICAgICAgIHJldHVybiBXVEY6OmVtcHR5U3RyaW5nKCk7CisKKyAgICBXVEY6OlN0cmluZyB0
ZXh0OworCisgICAgZm9yICh4bWxOb2RlKiBub2RlID0gYXR0ci0+Y2hpbGRyZW47IG5vZGU7IG5v
ZGUgPSBub2RlLT5uZXh0KSB7CisgICAgICAgIGlmIChub2RlLT50eXBlID09IFhNTF9URVhUX05P
REUpCisgICAgICAgICAgICB0ZXh0ICs9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5v
ZGUtPmNvbnRlbnQpOworICAgIH0KKworICAgIHJldHVybiB0ZXh0LnN0cmlwV2hpdGVTcGFjZSgp
OworfQorCitTdHJpbmcgdGV4dEZyb21YTUxOb2RlKHhtbE5vZGUqIG5vZGUpCit7CisgICAgaWYg
KCFub2RlKQorICAgICAgICByZXR1cm4gV1RGOjplbXB0eVN0cmluZygpOworCisgICAgV1RGOjpT
dHJpbmcgdGV4dDsKKworICAgIGZvciAobm9kZSA9IG5vZGUtPmNoaWxkcmVuOyBub2RlOyBub2Rl
ID0gbm9kZS0+bmV4dCkgeworICAgICAgICBpZiAoKG5vZGUtPnR5cGUgPT0gWE1MX1RFWFRfTk9E
RSkgfHwgKG5vZGUtPnR5cGUgPT0gWE1MX0NEQVRBX1NFQ1RJT05fTk9ERSkpCisgICAgICAgICAg
ICB0ZXh0ICs9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5vZGUtPmNvbnRlbnQpOwor
ICAgIH0KKworICAgIHJldHVybiB0ZXh0LnN0cmlwV2hpdGVTcGFjZSgpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTUGFyc2VyQmFzZS5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYjVhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuaApA
QCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwg
MjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2Vy
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx
MC0xMzAxICBVU0EKKyAqLworCisKKyNpZm5kZWYgUlNTUGFyc2VyQmFzZV9oCisjZGVmaW5lIFJT
U1BhcnNlckJhc2VfaAorCisjaW5jbHVkZSA8bGlieG1sL3RyZWUuaD4KKyNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworY2xhc3MgUlNTSXRlbTsKKworY2xhc3MgUlNTRW5jbG9zdXJlIHsKK3B1Ymxp
YzoKKyAgICBlbnVtIFR5cGUgeworICAgICAgICBUeXBlVW5rbm93biwKKyAgICAgICAgVHlwZUlt
YWdlLAorICAgICAgICBUeXBlQXVkaW8sCisgICAgICAgIFR5cGVWaWRlbywKKyAgICAgICAgVHlw
ZUFwcGxpY2F0aW9uLAorICAgICAgICBUeXBlVW5zdXBwb3J0ZWQKKyAgICB9OworCisgICAgUlNT
RW5jbG9zdXJlKCk7CisKKyAgICBUeXBlIHR5cGVJbkVudW0oKTsKKyAgICBTdHJpbmcgc3VnZ2Vz
dGVkTmFtZSgpIGNvbnN0OworCisgICAgU3RyaW5nIG1fdXJsOworICAgIFN0cmluZyBtX3R5cGU7
CisgICAgU3RyaW5nIG1fbGVuZ3RoOworCitwcml2YXRlOgorICAgIFR5cGUgbV90eXBlSW5FbnVt
OworfTsKKworY2xhc3MgUlNTSXRlbUJhc2UgeworcHVibGljOgorICAgIFN0cmluZyBtX3RpdGxl
OworICAgIFN0cmluZyBtX2xpbms7CisgICAgU3RyaW5nIG1fZGVzY3JpcHRpb247CisgICAgU3Ry
aW5nIG1fdXBkYXRlZDsKKyAgICBTdHJpbmcgbV9hdXRob3I7CisgICAgU3RyaW5nIG1fcHViRGF0
ZTsKKyAgICBTdHJpbmcgbV9pZDsKK307CisKK2NsYXNzIFJTU0ZlZWQ6IHB1YmxpYyBSU1NJdGVt
QmFzZSB7CitwdWJsaWM6CisgICAgUlNTRmVlZCgpOworICAgIH5SU1NGZWVkKCk7CisKKyAgICB2
b2lkIGNsZWFyKCk7CisKKyAgICBTdHJpbmcgbV9sYW5ndWFnZTsKKyAgICBTdHJpbmcgbV90dGw7
CisKKyAgICBWZWN0b3I8UlNTSXRlbSo+IG1faXRlbXM7Cit9OworCitjbGFzcyBSU1NJdGVtOiBw
dWJsaWMgUlNTSXRlbUJhc2UgeworcHVibGljOgorICAgIFJTU0l0ZW0oKTsKKyAgICB+UlNTSXRl
bSgpOworCisgICAgdm9pZCBjbGVhcigpOworCisgICAgU3RyaW5nIG1fY29tbWVudHM7CisgICAg
VmVjdG9yPFN0cmluZz4gbV9jYXRlZ29yaWVzOworICAgIFJTU0VuY2xvc3VyZSogbV9lbmNsb3N1
cmU7Cit9OworCitjbGFzcyBSU1NQYXJzZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBSU1NQYXJzZXJC
YXNlKCk7CisgICAgdmlydHVhbCB+UlNTUGFyc2VyQmFzZSgpOworCisgICAgdmlydHVhbCBib29s
IHBhcnNlQnVmZmVyKGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0aCwgY29uc3QgY2hhciog
dXJsLCBjb25zdCBjaGFyKiBlbmNvZGluZykgPSAwOworCisgICAgUlNTRmVlZCogbV9yb290Owor
fTsKKworU3RyaW5nIHRleHRGcm9tWE1MQXR0cih4bWxBdHRyKik7CitTdHJpbmcgdGV4dEZyb21Y
TUxOb2RlKHhtbE5vZGUqKTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
UlNTUGFyc2VyQmFzZV9oCg==
</data>
<flag name="review"
          id="169779"
          type_id="1"
          status="-"
          setter="rwlbuis"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>159596</attachid>
            <date>2012-08-20 19:55:11 -0700</date>
            <delta_ts>2012-08-21 10:50:23 -0700</delta_ts>
            <desc>Updated patch based on rob&apos;s comment.</desc>
            <filename>93496.patch</filename>
            <type>text/plain</type>
            <size>72728</size>
            <attacher name="Lyon Chen">liachen</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA2ZWIxMDY2Li44NmYwNGM4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTM4
IEBACisyMDEyLTA4LTIwICBMaWFuZ2h1aSBDaGVuICA8bGlhY2hlbkByaW0uY29tPgorCisgICAg
ICAgIFtCbGFja0JlcnJ5XSBBZGQgUlNTIGNvbnRlbnQgaGFuZGxpbmcgc3VwcG9ydAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTM0OTYKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgY29kZSB0byBmaWx0
ZXIgUlNTIGNvbnRlbnQsIGFuZCBwcm9wZXJseSBjb252ZXJ0IHRoZW0gdG8gSFRNTAorICAgICAg
ICBjb250ZW50IHNvIHRoZXkgY2FuIGRpc3BsYXkgbmljZWx5LCBpbnN0ZWFkIG9mIGFzIHBsYWlu
IHRleHQuCisKKyAgICAgICAgRm9sbG93aW5nIG1vZHVsZXMgYXJlIGluY2x1ZGVkOgorCisgICAg
ICAgIFJTU0ZpbHRlclN0cmVhbTogdGhlIGNvZGUgZm9yIGRldGVjdGluZyBSU1MgY29udGVudCwg
YW5kIGNvbnRyb2xsaW5nCisgICAgICAgIHRoZSBoYW5kbGluZyBvZiB0aGVzZSBjb250ZW50Lgor
CisgICAgICAgIFJTU1BhcnNlckJhc2U6IHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgZm9sbG93aW5n
IDMgUlNTIHBhcnNlci4KKyAgICAgICAgUlNTMTBQYXJzZXI6IHRoZSBjb2RlIGZvciBkZWNvZGlu
ZyBSU1MgMS4wIGNvbnRlbnQuCisgICAgICAgIFJTUzIwUGFyc2VyOiB0aGUgY29kZSBmb3IgZGVj
b2RpbmcgUlNTIDIuMCBjb250ZW50LgorICAgICAgICBSU1NBdG9tUGFyc2VyOiB0aGUgY29kZSBm
b3IgZGVjb2RpbmcgQXRvbSBmb3JtYXQgUlNTIGNvbnRlbnQuCisgICAgICAgIFJTU0dlbmVyYXRv
cjogdGhlIGNvZGUgZm9yIGdlbmVyYXRpbmcgSFRNTCBjb250ZW50IGJhc2VkIG9uIFJTUyBmZWVk
LgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBhcyBpdCdzIG5vdCBjaGFuZ2luZyBob3cgSFRNTCBj
b250ZW50IGlzIGhhbmRsZWQuCisKKyAgICAgICAgKiBQbGF0Zm9ybUJsYWNrQmVycnkuY21ha2U6
CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aW5pdGlhbGl6ZSk6CisgICAgICAgICogcGxh
dGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBhcnNlci5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpSU1MxMFBhcnNlcjo6UlNTMTBQYXJz
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UlNTMTBQYXJzZXI6OnBhcnNlQnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJTUzEwUGFyc2VyOjpwYXJzZVhtbERvYyk6CisgICAgICAgIChXZWJDb3Jl
OjpSU1MxMFBhcnNlcjo6cGFyc2VJdGVtQmFzZUF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSU1MxMFBhcnNlcjo6cGFyc2VJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OlJTUzEwUGFyc2Vy
OjpwYXJzZUZlZWQpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3Mv
UlNTMTBQYXJzZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFJTUzEw
UGFyc2VyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzIw
UGFyc2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OlJTUzIwUGFyc2VyOjpSU1MyMFBhcnNlcik6CisgICAgICAgIChXZWJDb3JlOjpSU1MyMFBhcnNl
cjo6cGFyc2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6UlNTMjBQYXJzZXI6OnBhcnNlWG1s
RG9jKToKKyAgICAgICAgKFdlYkNvcmU6OlJTUzIwUGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmli
dXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJTUzIwUGFyc2VyOjpwYXJzZUl0ZW0pOgorICAgICAg
ICAoV2ViQ29yZTo6UlNTMjBQYXJzZXI6OnBhcnNlRmVlZCk6CisgICAgICAgIChXZWJDb3JlOjpS
U1MyMFBhcnNlcjo6cGFyc2VFbmNsb3N1cmUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9yc3MvUlNTMjBQYXJzZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFJTUzIwUGFyc2VyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvcnNzL1JTU0F0b21QYXJzZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6aXNSZWxhdGl2ZVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UlNT
QXRvbUxpbms6OnJlbFR5cGUpOgorICAgICAgICAoV2ViQ29yZTo6UlNTQXRvbVBhcnNlcjo6UlNT
QXRvbVBhcnNlcik6CisgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUJ1ZmZl
cik6CisgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZVhtbERvYyk6CisgICAg
ICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6OnBhcnNlSXRlbSk6CisgICAgICAgIChXZWJD
b3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUZlZWQpOgorICAgICAgICAoV2ViQ29yZTo6UlNTQXRv
bVBhcnNlcjo6cGFyc2VMaW5rKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6OmVu
Y2xvc3VyZUZyb21MaW5rKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6OnBhcnNl
Q29udGVudCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUF1dGhvcik6
CisgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUNhdGVnb3J5KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0F0b21QYXJzZXIuaDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFJTU0F0b21MaW5rKToKKyAgICAgICAg
KFdlYkNvcmU6OlJTU0F0b21MaW5rOjpSU1NBdG9tTGluayk6CisgICAgICAgIChSU1NBdG9tUGFy
c2VyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRl
clN0cmVhbS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
Ojppc0NvbnRyb2xDaGFyYWN0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6aXNzcGFjZVNhZmUpOgor
ICAgICAgICAoV2ViQ29yZTo6c3RyaXBXaGl0ZVNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OmVx
dWFsSWdub3JpbmdDYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OmlzQXRvbU1JTUVUeXBlKToKKyAg
ICAgICAgKFdlYkNvcmU6OmlzUlNTTUlNRVR5cGUpOgorICAgICAgICAoV2ViQ29yZTo6aXNQb3Rl
bnRpYWxSU1NNSU1FVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjppc1JTU0NvbnRlbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6UlNTVHlwZUZyb21Db250ZW50VHlwZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSU1NUeXBlRnJvbUNvbnRlbnQpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlUGFyc2VyKToK
KyAgICAgICAgKFdlYkNvcmU6OmZpbmRYTUxFbmNvZGluZ1Bvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OmZpbmRYTUxMYW5ndWFnZVBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OmRlZmF1
bHRFbmNvZGluZ0Zvckxhbmd1YWdlKToKKyAgICAgICAgKFdlYkNvcmU6OmlzVHJhbnNjb2RpbmdO
ZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6dHJhbnNjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6
OnRyYW5zY29kZUNvbnRlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UlNTRmlsdGVyU3RyZWFtOjpS
U1NGaWx0ZXJTdHJlYW0pOgorICAgICAgICAoV2ViQ29yZTo6UlNTRmlsdGVyU3RyZWFtOjpub3Rp
ZnlTdGF0dXNSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06Om5v
dGlmeUhlYWRlcnNSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06
Om5vdGlmeURhdGFSZWNlaXZlZCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06
Om5vdGlmeUNsb3NlKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0ZpbHRlclN0cmVhbTo6Y29udmVy
dENvbnRlbnRUb0h0bWwpOgorICAgICAgICAoV2ViQ29yZTo6UlNTRmlsdGVyU3RyZWFtOjpoYW5k
bGVSU1NDb250ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0ZpbHRlclN0cmVhbTo6Y2hhcnNl
dCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06OmVuY29kaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJTU0ZpbHRlclN0cmVhbTo6c2F2ZUhlYWRlcnMpOgorICAgICAgICAoV2Vi
Q29yZTo6UlNTRmlsdGVyU3RyZWFtOjpyZW1vdmVIZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6
UlNTRmlsdGVyU3RyZWFtOjp1cGRhdGVIZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UlNTRmls
dGVyU3RyZWFtOjp1cGRhdGVSU1NIZWFkZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0ZpbHRl
clN0cmVhbTo6c2VuZFNhdmVkSGVhZGVycyk6CisgICAgICAgIChXZWJDb3JlOjpSU1NGaWx0ZXJT
dHJlYW06OmFwcGVuZERhdGEpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9yc3MvUlNTRmlsdGVyU3RyZWFtLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAg
ICAgIChSU1NGaWx0ZXJTdHJlYW0pOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2ti
ZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJTU0dlbmVyYXRvcjo6UlNTR2VuZXJhdG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OlJTU0dlbmVyYXRvcjo6flJTU0dlbmVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpS
U1NHZW5lcmF0b3I6OmdlbmVyYXRlSHRtbCk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9i
bGFja2JlcnJ5L3Jzcy9SU1NHZW5lcmF0b3IuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFJTU0dlbmVyYXRvcik6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFj
a2JlcnJ5L3Jzcy9SU1NQYXJzZXJCYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFdlYkNvcmU6OlJTU0VuY2xvc3VyZTo6UlNTRW5jbG9zdXJlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJTU0VuY2xvc3VyZTo6dHlwZUluRW51bSk6CisgICAgICAgIChXZWJDb3JlOjpS
U1NFbmNsb3N1cmU6OnN1Z2dlc3RlZE5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6UlNTRmVlZDo6
UlNTRmVlZCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NGZWVkOjp+UlNTRmVlZCk6CisgICAgICAg
IChXZWJDb3JlOjpSU1NGZWVkOjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSU1NJdGVtOjpS
U1NJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0l0ZW06On5SU1NJdGVtKToKKyAgICAgICAg
KFdlYkNvcmU6OlJTU0l0ZW06OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU1BhcnNlckJh
c2U6OlJTU1BhcnNlckJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6UlNTUGFyc2VyQmFzZTo6flJT
U1BhcnNlckJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6dGV4dEZyb21YTUxBdHRyKToKKyAgICAg
ICAgKFdlYkNvcmU6OnRleHRGcm9tWE1MTm9kZSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5L3Jzcy9SU1NQYXJzZXJCYXNlLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZSk6CisgICAgICAgIChSU1NFbmNsb3N1cmUpOgorICAgICAgICAoUlNTSXRlbUJhc2UpOgorICAg
ICAgICAoUlNTUGFyc2VyQmFzZSk6CisKIDIwMTItMDgtMjAgIFRvbSBTZXBleiAgPHRzZXBlekBj
aHJvbWl1bS5vcmc+CiAKICAgICAgICAgWFNTQXVkaXRvciB0b28gdG9sZXJhbnQgb2YgaW5qZWN0
ZWQgZGF0YTogVVJMcyBmcm9tIG90aGVyICJob3N0bGVzcyIgc2NoZW1lcy4KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL1BsYXRmb3JtQmxhY2tCZXJyeS5jbWFrZSBiL1NvdXJjZS9XZWJDb3Jl
L1BsYXRmb3JtQmxhY2tCZXJyeS5jbWFrZQppbmRleCBmNDVlNTAxLi5lNGM5N2Y4IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUJsYWNrQmVycnkuY21ha2UKKysrIGIvU291cmNl
L1dlYkNvcmUvUGxhdGZvcm1CbGFja0JlcnJ5LmNtYWtlCkBAIC02LDEzICs2LDE0IEBAIExJU1Qo
SU5TRVJUIFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RPUklFUyAwCiBMSVNUKEFQUEVORCBXZWJDb3Jl
X0lOQ0xVREVfRElSRUNUT1JJRVMKICAgICAiJHtXRUJDT1JFX0RJUn0vYmluZGluZ3MvY3BwIgog
ICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9ibGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNlQmFj
a2luZ1N0b3JlIgotICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVy
cnkiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvc2tp
YSIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vZ3JhcGhpY3MvaGFyZmJ1enoiCiAgICAg
IiR7V0VCQ09SRV9ESVJ9L3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlLyIKICAgICAiJHtXRUJD
T1JFX0RJUn0vcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYSIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxh
dGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYSIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0v
aW1hZ2UtZW5jb2RlcnMvc2tpYSIKKyAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5IgorICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvcnNzIgogKQogCiAjIFNraWEgc291cmNlcwpAQCAtMTAyLDYgKzEwMywxMiBAQCBMSVNU
KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
UmVzb3VyY2VSZXF1ZXN0QmxhY2tCZXJyeS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvUmVzb3VyY2VSZXNwb25zZUJsYWNrQmVycnkuY3BwCiAgICAgcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5L1NvY2tldFN0cmVhbUhhbmRsZUJsYWNrQmVycnkuY3BwCisgICAgcGxhdGZv
cm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NBdG9tUGFyc2VyLmNwcAorICAgIHBsYXRmb3Jt
L25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMTBQYXJzZXIuY3BwCisgICAgcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MyMFBhcnNlci5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVhbS5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvcnNzL1JTU0dlbmVyYXRvci5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2Js
YWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuY3BwCiApCiAKIExJU1QoQVBQRU5EIFdlYkNvcmVf
VVNFUl9BR0VOVF9TVFlMRV9TSEVFVFMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3JrSm9iLmNwcAppbmRleCAzZDgwM2EyLi41
NTBiYWI3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvTmV0d29ya0pvYi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuY3BwCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAi
UmVzb3VyY2VIYW5kbGVDbGllbnQuaCIKICNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUludGVybmFs
LmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VSZXF1ZXN0LmgiCisjaW5jbHVkZSAicnNzL1JTU0ZpbHRl
clN0cmVhbS5oIgogCiAjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtQ2xpZW50Lmg+CiAjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTG9nLmg+CkBAIC0xMzMsNiArMTM0LDE2IEBAIGJvb2wg
TmV0d29ya0pvYjo6aW5pdGlhbGl6ZShpbnQgcGxheWVySWQsCiAgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkZpbHRlclN0cmVhbSogd3JhcHBlZFN0cmVhbSA9IG1fc3RyZWFtRmFjdG9yeS0+Y3Jl
YXRlTmV0d29ya1N0cmVhbShyZXF1ZXN0LCBtX3BsYXllcklkKTsKICAgICBpZiAoIXdyYXBwZWRT
dHJlYW0pCiAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpOZXR3b3JrUmVxdWVzdDo6VGFyZ2V0VHlwZSB0YXJnZXRUeXBlID0gcmVxdWVzdC5nZXRUYXJn
ZXRUeXBlKCk7CisgICAgaWYgKCh0YXJnZXRUeXBlID09IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpO
ZXR3b3JrUmVxdWVzdDo6VGFyZ2V0SXNNYWluRnJhbWUKKyAgICAgICAgIHx8IHRhcmdldFR5cGUg
PT0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpUYXJnZXRJc1N1YmZyYW1l
KQorICAgICAgICAgICAgJiYgIW1faXNPdmVycmlkZUNvbnRlbnRUeXBlKSB7CisgICAgICAgIFJT
U0ZpbHRlclN0cmVhbSogZmlsdGVyID0gbmV3IFJTU0ZpbHRlclN0cmVhbSgpOworICAgICAgICBm
aWx0ZXItPnNldFdyYXBwZWRTdHJlYW0od3JhcHBlZFN0cmVhbSk7CisgICAgICAgIHdyYXBwZWRT
dHJlYW0gPSBmaWx0ZXI7CisgICAgfQorCiAgICAgc2V0V3JhcHBlZFN0cmVhbSh3cmFwcGVkU3Ry
ZWFtKTsKIAogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBhcnNlci5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzEwUGFyc2VyLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkyMzMwCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBh
cnNlci5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIw
MTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICog
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9u
LCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlJTUzEwUGFyc2VyLmgiCisKKyNpbmNsdWRlICJCbGFja0JlcnJ5UGxhdGZvcm1Bc3NlcnQu
aCIKKyNpbmNsdWRlICJsaWJ4bWwvcGFyc2VyLmgiCisjaW5jbHVkZSAibGlieG1sL3htbHdyaXRl
ci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JTUzEwUGFyc2VyOjpSU1MxMFBhcnNlcigp
Cit7Cit9CisKK2Jvb2wgUlNTMTBQYXJzZXI6OnBhcnNlQnVmZmVyKGNvbnN0IGNoYXIqIGJ1ZmZl
ciwgaW50IGxlbmd0aCwgY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBlbmNvZGluZykKK3sK
KyAgICByZXR1cm4gcGFyc2VYbWxEb2MoeG1sUmVhZE1lbW9yeShidWZmZXIsIGxlbmd0aCwgdXJs
LCBlbmNvZGluZywgWE1MX1BBUlNFX05PQkxBTktTIHwgWE1MX1BBUlNFX05PTkVUKSk7Cit9CisK
K2Jvb2wgUlNTMTBQYXJzZXI6OnBhcnNlWG1sRG9jKHhtbERvY1B0ciBkb2MpCit7CisgICAgaWYg
KCFkb2MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHhtbE5vZGUqIG5vZGUgPSB4bWxE
b2NHZXRSb290RWxlbWVudChkb2MpOworICAgIGlmICghbm9kZSkgeworICAgICAgICB4bWxGcmVl
RG9jKGRvYyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKDsgbm9k
ZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFtZSkpOworCisgICAgICAgIGlmIChuYW1lID09ICJS
REYiKSB7CisgICAgICAgICAgICB4bWxOb2RlKiBjaGlsZG5vZGUgPSBub2RlLT5jaGlsZHJlbjsK
KyAgICAgICAgICAgIGZvciAoOyBjaGlsZG5vZGU7IGNoaWxkbm9kZSA9IGNoaWxkbm9kZS0+bmV4
dCkgeworICAgICAgICAgICAgICAgIGlmIChjaGlsZG5vZGUtPnR5cGUgPT0gWE1MX0VMRU1FTlRf
Tk9ERSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gU3RyaW5nKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgY2hhcio+KGNoaWxkbm9kZS0+bmFtZSkpOworICAgICAgICAgICAgICAgICAgICBu
YW1lLm1ha2VMb3dlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAiY2hhbm5l
bCIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJMQUNLQkVSUllfQVNTRVJUKCFtX3Jvb3Qp
OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3Jvb3QpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV9yb290ID0gcGFyc2VGZWVkKGNoaWxkbm9kZS0+Y2hpbGRyZW4pOworICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIml0ZW0iKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBCTEFDS0JFUlJZX0FTU0VSVChtX3Jvb3QpOworICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKG1fcm9vdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTU0l0
ZW0qIGl0ZW0gPSBwYXJzZUl0ZW0oY2hpbGRub2RlLT5jaGlsZHJlbik7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1fcm9vdC0+bV9pdGVtcy5hcHBlbmQoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICB9CisKKyAgICB4bWxGcmVlRG9jKGRvYyk7CisKKyAgICByZXR1cm4g
bV9yb290OworfQorCitib29sIFJTUzEwUGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKFJT
U0l0ZW1CYXNlKiBpdGVtLCBjb25zdCBTdHJpbmcmIG5hbWUsIHhtbE5vZGUqIG5vZGUpCit7Cisg
ICAgaWYgKG5hbWUgPT0gImxpbmsiKQorICAgICAgICBpdGVtLT5tX2xpbmsgPSB0ZXh0RnJvbVhN
TE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAobmFtZSA9PSAidGl0bGUiKQorICAgICAgICBpdGVt
LT5tX3RpdGxlID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UgaWYgKG5hbWUgPT0g
ImRlc2NyaXB0aW9uIikKKyAgICAgICAgaXRlbS0+bV9kZXNjcmlwdGlvbiA9IHRleHRGcm9tWE1M
Tm9kZShub2RlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVy
biB0cnVlOworfQorCitSU1NJdGVtKiBSU1MxMFBhcnNlcjo6cGFyc2VJdGVtKHhtbE5vZGUqIG5v
ZGUpCit7CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQobm9kZSk7CisKKyAgICBSU1NJdGVtKiBpdGVt
ID0gbmV3IFJTU0l0ZW0oKTsKKworICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkg
eworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihub2Rl
LT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAgICAgICAgcGFyc2VJdGVt
QmFzZUF0dHJpYnV0ZShpdGVtLCBuYW1lLCBub2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gaXRl
bTsKK30KKworUlNTRmVlZCogUlNTMTBQYXJzZXI6OnBhcnNlRmVlZCh4bWxOb2RlKiBub2RlKQor
eworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNTRmVlZCogZmVlZCA9IG5l
dyBSU1NGZWVkKCk7CisKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAg
ICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFt
ZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dlcigpOworCisgICAgICAgIHBhcnNlSXRlbUJhc2VB
dHRyaWJ1dGUoZmVlZCwgbmFtZSwgbm9kZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZlZWQ7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMTBQYXJzZXIuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMTBQYXJzZXIuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY2NDFkCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBhcnNl
ci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIw
MTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSU1MxMFBhcnNlcl9oCisjZGVmaW5lIFJT
UzEwUGFyc2VyX2gKKworI2luY2x1ZGUgIlJTU1BhcnNlckJhc2UuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBSU1MxMFBhcnNlciA6IHB1YmxpYyBSU1NQYXJzZXJCYXNlIHsKK3B1
YmxpYzoKKyAgICBSU1MxMFBhcnNlcigpOworCisgICAgYm9vbCBwYXJzZUJ1ZmZlcihjb25zdCBj
aGFyKiBidWZmZXIsIGludCBsZW5ndGgsIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogZW5j
b2RpbmcpOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VYbWxEb2MoeG1sRG9jUHRyKTsKKyAg
ICBib29sIHBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoUlNTSXRlbUJhc2UqLCBjb25zdCBTdHJpbmcm
IG5hbWUsIHhtbE5vZGUqKTsKKyAgICBSU1NJdGVtKiBwYXJzZUl0ZW0oeG1sTm9kZSopOworICAg
IFJTU0ZlZWQqIHBhcnNlRmVlZCh4bWxOb2RlKik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBSU1MxMFBhcnNlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzIwUGFyc2VyLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMjBQYXJzZXIuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGU0ZGMKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JT
UzIwUGFyc2VyLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUlNTMjBQYXJzZXIuaCIKKworI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybUFz
c2VydC5oIgorI2luY2x1ZGUgImxpYnhtbC9wYXJzZXIuaCIKKyNpbmNsdWRlICJsaWJ4bWwveG1s
d3JpdGVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUlNTMjBQYXJzZXI6OlJTUzIwUGFy
c2VyKCkKK3sKK30KKworYm9vbCBSU1MyMFBhcnNlcjo6cGFyc2VCdWZmZXIoY29uc3QgY2hhciog
YnVmZmVyLCBpbnQgbGVuZ3RoLCBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIGVuY29kaW5n
KQoreworICAgIHJldHVybiBwYXJzZVhtbERvYyh4bWxSZWFkTWVtb3J5KGJ1ZmZlciwgbGVuZ3Ro
LCB1cmwsIGVuY29kaW5nLCBYTUxfUEFSU0VfTk9CTEFOS1MgfCBYTUxfUEFSU0VfTk9ORVQpKTsK
K30KKworYm9vbCBSU1MyMFBhcnNlcjo6cGFyc2VYbWxEb2MoeG1sRG9jUHRyIGRvYykKK3sKKyAg
ICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgeG1sTm9kZSogbm9kZSA9
IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CisgICAgaWYgKCFub2RlKSB7CisgICAgICAgIHht
bEZyZWVEb2MoZG9jKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAo
OyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVy
cHJldF9jYXN0PGNvbnN0IGNoYXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxv
d2VyKCk7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gInJzcyIpIHsKKyAgICAgICAgICAgIHhtbE5v
ZGUqIGNoYW5uZWwgPSBub2RlLT5jaGlsZHJlbjsKKyAgICAgICAgICAgIGlmIChjaGFubmVsLT50
eXBlID09IFhNTF9FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gcmVpbnRl
cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oY2hhbm5lbC0+bmFtZSk7CisgICAgICAgICAgICAgICAg
bmFtZS5tYWtlTG93ZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSAiY2hhbm5lbCIp
CisgICAgICAgICAgICAgICAgICAgIG1fcm9vdCA9IHBhcnNlRmVlZChjaGFubmVsLT5jaGlsZHJl
bik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHhtbEZyZWVEb2MoZG9jKTsKKworICAgIHJldHVybiBtX3Jvb3Q7Cit9CisKK2Jvb2wg
UlNTMjBQYXJzZXI6OnBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoUlNTSXRlbUJhc2UqIGl0ZW0sIGNv
bnN0IFN0cmluZyYgbmFtZSwgeG1sTm9kZSogbm9kZSkKK3sKKyAgICBpZiAobmFtZSA9PSAibGlu
ayIpCisgICAgICAgIGl0ZW0tPm1fbGluayA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAgICBl
bHNlIGlmIChuYW1lID09ICJ0aXRsZSIpCisgICAgICAgIGl0ZW0tPm1fdGl0bGUgPSB0ZXh0RnJv
bVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAobmFtZSA9PSAiZGVzY3JpcHRpb24iKQorICAg
ICAgICBpdGVtLT5tX2Rlc2NyaXB0aW9uID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVs
c2UgaWYgKG5hbWUgPT0gInB1YmRhdGUiKQorICAgICAgICBpdGVtLT5tX3B1YkRhdGUgPSB0ZXh0
RnJvbVhNTE5vZGUobm9kZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworUlNTSXRlbSogUlNTMjBQYXJzZXI6OnBhcnNlSXRlbSh4bWxO
b2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNTSXRl
bSogaXRlbSA9IG5ldyBSU1NJdGVtKCk7CisKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUt
Pm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFy
Kj4obm9kZS0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dlcigpOworCisgICAgICAgIGlm
IChwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKGl0ZW0sIG5hbWUsIG5vZGUpKQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gImF1dGhvciIpCisgICAgICAgICAgICBp
dGVtLT5tX2F1dGhvciA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAgICAgICAgZWxzZSBpZiAo
bmFtZSA9PSAiY3JlYXRvciIpIHsKKyAgICAgICAgICAgIGlmIChpdGVtLT5tX2F1dGhvci5pc0Vt
cHR5KCkpCisgICAgICAgICAgICAgICAgaXRlbS0+bV9hdXRob3IgPSB0ZXh0RnJvbVhNTE5vZGUo
bm9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiY2F0ZWdvcnkiKQorICAgICAgICAg
ICAgaXRlbS0+bV9jYXRlZ29yaWVzLmFwcGVuZCh0ZXh0RnJvbVhNTE5vZGUobm9kZSkpOworICAg
ICAgICBlbHNlIGlmIChuYW1lID09ICJjb21tZW50cyIpCisgICAgICAgICAgICBpdGVtLT5tX2Nv
bW1lbnRzID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgICAgICBlbHNlIGlmIChuYW1lID09
ICJlbmNsb3N1cmUiKSB7CisgICAgICAgICAgICAvLyBSaWdodCBub3cgd2UgYXNzdW1lIHRoZXJl
IGlzIG9ubHkgb25lIGVuY2xvc3VyZSBwZXIgaXRlbSwgYW5kIHdlIGhhbmRsZSBvbmx5CisgICAg
ICAgICAgICAvLyB0aGUgZmlyc3QgZW5jbG9zdXJlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBvbmVz
LgorICAgICAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwOi8vd3d3LnJzc2JvYXJkLm9yZy9yc3Mt
cHJvZmlsZSNlbGVtZW50LWNoYW5uZWwtaXRlbS1lbmNsb3N1cmUKKyAgICAgICAgICAgIGlmICgh
aXRlbS0+bV9lbmNsb3N1cmUpCisgICAgICAgICAgICAgICAgaXRlbS0+bV9lbmNsb3N1cmUgPSBw
YXJzZUVuY2xvc3VyZShub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpdGVt
OworfQorCitSU1NGZWVkKiBSU1MyMFBhcnNlcjo6cGFyc2VGZWVkKHhtbE5vZGUqIG5vZGUpCit7
CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQobm9kZSk7CisKKyAgICBSU1NGZWVkKiBmZWVkID0gbmV3
IFJTU0ZlZWQoKTsKKworICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgeworICAg
ICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihub2RlLT5uYW1l
KSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAgICAgICAgaWYgKHBhcnNlSXRlbUJh
c2VBdHRyaWJ1dGUoZmVlZCwgbmFtZSwgbm9kZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICBpZiAobmFtZSA9PSAiaXRlbSIpCisgICAgICAgICAgICBmZWVkLT5tX2l0ZW1zLmFw
cGVuZChwYXJzZUl0ZW0obm9kZS0+Y2hpbGRyZW4pKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9
PSAibGFuZ3VhZ2UiKQorICAgICAgICAgICAgZmVlZC0+bV9sYW5ndWFnZSA9IHRleHRGcm9tWE1M
Tm9kZShub2RlKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAidHRsIikKKyAgICAgICAgICAg
IGZlZWQtPm1fdHRsID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIH0KKworICAgIHJldHVy
biBmZWVkOworfQorCitSU1NFbmNsb3N1cmUqIFJTUzIwUGFyc2VyOjpwYXJzZUVuY2xvc3VyZSh4
bWxOb2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNT
RW5jbG9zdXJlKiBlbmNsb3N1cmUgPSBuZXcgUlNTRW5jbG9zdXJlKCk7CisKKyAgICBmb3IgKHht
bEF0dHIqIGF0dHIgPSBub2RlLT5wcm9wZXJ0aWVzOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkg
eworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRy
LT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAgICAgICAgaWYgKG5hbWUg
PT0gInVybCIpCisgICAgICAgICAgICBlbmNsb3N1cmUtPm1fdXJsID0gdGV4dEZyb21YTUxBdHRy
KGF0dHIpOworICAgICAgICBlbHNlIGlmIChuYW1lID09ICJ0eXBlIikKKyAgICAgICAgICAgIGVu
Y2xvc3VyZS0+bV90eXBlID0gdGV4dEZyb21YTUxBdHRyKGF0dHIpOworICAgICAgICBlbHNlIGlm
IChuYW1lID09ICJsZW5ndGgiKQorICAgICAgICAgICAgZW5jbG9zdXJlLT5tX2xlbmd0aCA9IHRl
eHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZW5jbG9zdXJlOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzIwUGFyc2VyLmggYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzIwUGFyc2VyLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkYWQxOAotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMjBQYXJzZXIu
aApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgUlNTMjBQYXJzZXJfaAorI2RlZmluZSBSU1My
MFBhcnNlcl9oCisKKyNpbmNsdWRlICJSU1NQYXJzZXJCYXNlLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgUlNTMjBQYXJzZXIgOiBwdWJsaWMgUlNTUGFyc2VyQmFzZSB7CitwdWJs
aWM6CisgICAgUlNTMjBQYXJzZXIoKTsKKworICAgIGJvb2wgcGFyc2VCdWZmZXIoY29uc3QgY2hh
ciogYnVmZmVyLCBpbnQgbGVuZ3RoLCBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIGVuY29k
aW5nKTsKKworcHJpdmF0ZToKKyAgICBib29sIHBhcnNlWG1sRG9jKHhtbERvY1B0cik7CisgICAg
Ym9vbCBwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKFJTU0l0ZW1CYXNlKiwgY29uc3QgU3RyaW5nJiBu
YW1lLCB4bWxOb2RlKik7CisgICAgUlNTSXRlbSogcGFyc2VJdGVtKHhtbE5vZGUqKTsKKyAgICBS
U1NGZWVkKiBwYXJzZUZlZWQoeG1sTm9kZSopOworICAgIFJTU0VuY2xvc3VyZSogcGFyc2VFbmNs
b3N1cmUoeG1sTm9kZSopOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gUlNTMjBQYXJzZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NBdG9tUGFyc2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTQXRvbVBhcnNlci5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0MzA4ZQotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTQXRvbVBhcnNl
ci5jcHAKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAs
IDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlJTU0F0b21QYXJzZXIuaCIKKworI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybUFzc2VydC5o
IgorI2luY2x1ZGUgImxpYnhtbC9wYXJzZXIuaCIKKyNpbmNsdWRlICJsaWJ4bWwveG1sd3JpdGVy
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGlubGluZSBib29sIGlzUmVsYXRp
dmVQYXRoKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICByZXR1cm4gIShwYXRoLnN0YXJ0c1dp
dGgoIi8iKSB8fCBwYXRoLmZpbmQoIjovIikgIT0gV1RGOjpub3RGb3VuZCk7Cit9CisKK1JTU0F0
b21MaW5rOjpUeXBlIFJTU0F0b21MaW5rOjpyZWxUeXBlKCkKK3sKKyAgICBpZiAobV90eXBlSW5F
bnVtICE9IFR5cGVVbmtub3duKQorICAgICAgICByZXR1cm4gbV90eXBlSW5FbnVtOworCisgICAg
aWYgKG1fcmVsLmlzRW1wdHkoKSkKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUFsdGVybmF0
ZTsKKyAgICBlbHNlIHsKKyAgICAgICAgU3RyaW5nIGxvd3JlbCA9IG1fcmVsLmxvd2VyKCk7Cisg
ICAgICAgIGlmIChsb3dyZWwgPT0gImFsdGVybmF0ZSIpCisgICAgICAgICAgICBtX3R5cGVJbkVu
dW0gPSBUeXBlQWx0ZXJuYXRlOworICAgICAgICBlbHNlIGlmIChsb3dyZWwgPT0gImVuY2xvc3Vy
ZSIpCisgICAgICAgICAgICBtX3R5cGVJbkVudW0gPSBUeXBlRW5jbG9zdXJlOworICAgICAgICBl
bHNlIGlmIChsb3dyZWwgPT0gInJlbGF0ZWQiKQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0g
VHlwZVJlbGF0ZWQ7CisgICAgICAgIGVsc2UgaWYgKGxvd3JlbCA9PSAic2VsZiIpCisgICAgICAg
ICAgICBtX3R5cGVJbkVudW0gPSBUeXBlU2VsZjsKKyAgICAgICAgZWxzZSBpZiAobG93cmVsID09
ICJ2aWEiKQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVZpYTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVVuc3VwcG9ydGVkOworICAgIH0KKwor
ICAgIHJldHVybiBtX3R5cGVJbkVudW07Cit9CisKK1JTU0F0b21QYXJzZXI6OlJTU0F0b21QYXJz
ZXIoKQoreworfQorCitib29sIFJTU0F0b21QYXJzZXI6OnBhcnNlQnVmZmVyKGNvbnN0IGNoYXIq
IGJ1ZmZlciwgaW50IGxlbmd0aCwgY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBlbmNvZGlu
ZykKK3sKKyAgICBtX3VybCA9IEtVUkwoYmxhbmtVUkwoKSwgdXJsKTsKKyAgICByZXR1cm4gcGFy
c2VYbWxEb2MoeG1sUmVhZE1lbW9yeShidWZmZXIsIGxlbmd0aCwgdXJsLCBlbmNvZGluZywgWE1M
X1BBUlNFX05PQkxBTktTIHwgWE1MX1BBUlNFX05PTkVUKSk7Cit9CisKK2Jvb2wgUlNTQXRvbVBh
cnNlcjo6cGFyc2VYbWxEb2MoeG1sRG9jUHRyIGRvYykKK3sKKyAgICBpZiAoIWRvYykKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgeG1sTm9kZSogbm9kZSA9IHhtbERvY0dldFJvb3RFbGVt
ZW50KGRvYyk7CisgICAgaWYgKCFub2RlKSB7CisgICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9k
ZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNo
YXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAgICAgICAg
aWYgKG5hbWUgPT0gImZlZWQiKSB7CisgICAgICAgICAgICBtX3Jvb3QgPSBwYXJzZUZlZWQobm9k
ZS0+Y2hpbGRyZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICB4bWxGcmVlRG9jKGRvYyk7CisgICAgcmV0dXJuIG1fcm9vdDsKK30KKworYm9vbCBSU1NBdG9t
UGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKFJTU0l0ZW1CYXNlKiBpdGVtLCBjb25zdCBT
dHJpbmcmIG5hbWUsIHhtbE5vZGUqIG5vZGUsIGNvbnN0IFN0cmluZyYgYmFzZSkKK3sKKyAgICBp
ZiAobmFtZSA9PSAidGl0bGUiKQorICAgICAgICBpdGVtLT5tX3RpdGxlID0gdGV4dEZyb21YTUxO
b2RlKG5vZGUpOworICAgIGVsc2UgaWYgKG5hbWUgPT0gImlkIikKKyAgICAgICAgaXRlbS0+bV9p
ZCA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAgICBlbHNlIGlmIChuYW1lID09ICJhdXRob3Ii
KQorICAgICAgICBpdGVtLT5tX2F1dGhvciA9IHBhcnNlQXV0aG9yKG5vZGUpOworICAgIGVsc2Ug
aWYgKG5hbWUgPT0gInVwZGF0ZWQiKQorICAgICAgICBpdGVtLT5tX3VwZGF0ZWQgPSB0ZXh0RnJv
bVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAobmFtZSA9PSAiY29udGVudCIpCisgICAgICAg
IGl0ZW0tPm1fZGVzY3JpcHRpb24gPSBwYXJzZUNvbnRlbnQoYmFzZSwgbm9kZSk7CisgICAgZWxz
ZSBpZiAobmFtZSA9PSAicHVibGlzaGVkIikKKyAgICAgICAgaXRlbS0+bV9wdWJEYXRlID0gdGV4
dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK1JTU0l0ZW0qIFJTU0F0b21QYXJzZXI6OnBhcnNlSXRlbSh4
bWxOb2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNT
SXRlbSogaXRlbSA9IG5ldyBSU1NJdGVtKCk7CisKKyAgICBTdHJpbmcgYmFzZTsKKyAgICBmb3Ig
KHhtbEF0dHIqIGF0dHIgPSBub2RlLT5wcm9wZXJ0aWVzOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4
dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihh
dHRyLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisgICAgICAgIGlmIChuYW1l
ID09ICJiYXNlIikKKyAgICAgICAgICAgIGJhc2UgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7Cisg
ICAgfQorCisgICAgbm9kZSA9IG5vZGUtPmNoaWxkcmVuOworICAgIGZvciAoOyBub2RlOyBub2Rl
ID0gbm9kZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNv
bnN0IGNoYXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAg
ICAgICAgaWYgKHBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoaXRlbSwgbmFtZSwgbm9kZSwgYmFzZSkp
CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAobmFtZSA9PSAibGluayIpIHsK
KyAgICAgICAgICAgIFJTU0F0b21MaW5rKiBsaW5rID0gcGFyc2VMaW5rKG5vZGUpOworICAgICAg
ICAgICAgaWYgKGlzUmVsYXRpdmVQYXRoKGxpbmstPm1faHJlZikpCisgICAgICAgICAgICAgICAg
bGluay0+bV9ocmVmID0gYmFzZSArICIvIiArIGxpbmstPm1faHJlZjsKKworICAgICAgICAgICAg
c3dpdGNoIChsaW5rLT5yZWxUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUlNTQXRvbUxpbms6
OlR5cGVBbHRlcm5hdGU6CisgICAgICAgICAgICAgICAgaXRlbS0+bV9saW5rID0gbGluay0+bV9o
cmVmOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU1NBdG9tTGlu
azo6VHlwZUVuY2xvc3VyZToKKyAgICAgICAgICAgICAgICBCTEFDS0JFUlJZX0FTU0VSVCghaXRl
bS0+bV9lbmNsb3N1cmUpOworICAgICAgICAgICAgICAgIGlmICghaXRlbS0+bV9lbmNsb3N1cmUp
CisgICAgICAgICAgICAgICAgICAgIGl0ZW0tPm1fZW5jbG9zdXJlID0gZW5jbG9zdXJlRnJvbUxp
bmsobGluayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRl
IGxpbms7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiY2F0ZWdvcnkiKQorICAgICAgICAg
ICAgaXRlbS0+bV9jYXRlZ29yaWVzLmFwcGVuZChwYXJzZUNhdGVnb3J5KG5vZGUpKTsKKyAgICB9
CisKKyAgICByZXR1cm4gaXRlbTsKK30KKworUlNTRmVlZCogUlNTQXRvbVBhcnNlcjo6cGFyc2VG
ZWVkKHhtbE5vZGUqIG5vZGUpCit7CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQobm9kZSk7CisKKyAg
ICBSU1NGZWVkKiBmZWVkID0gbmV3IFJTU0ZlZWQoKTsKKworICAgIGZvciAoOyBub2RlOyBub2Rl
ID0gbm9kZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9jYXN0PGNv
bnN0IGNoYXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisKKyAg
ICAgICAgaWYgKHBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoZmVlZCwgbmFtZSwgbm9kZSwgZW1wdHlT
dHJpbmcoKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAobmFtZSA9PSAi
ZW50cnkiKQorICAgICAgICAgICAgZmVlZC0+bV9pdGVtcy5hcHBlbmQocGFyc2VJdGVtKG5vZGUp
KTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAibGluayIpIHsKKyAgICAgICAgICAgIFJTU0F0
b21MaW5rKiBsaW5rID0gcGFyc2VMaW5rKG5vZGUpOworICAgICAgICAgICAgaWYgKGxpbmstPnJl
bFR5cGUoKSA9PSBSU1NBdG9tTGluazo6VHlwZUFsdGVybmF0ZSkKKyAgICAgICAgICAgICAgICBm
ZWVkLT5tX2xpbmsgPSBsaW5rLT5tX2hyZWY7CisgICAgICAgICAgICBkZWxldGUgbGluazsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmZWVkOworfQorCitSU1NBdG9tTGluayogUlNT
QXRvbVBhcnNlcjo6cGFyc2VMaW5rKHhtbE5vZGUqIG5vZGUpCit7CisgICAgQkxBQ0tCRVJSWV9B
U1NFUlQobm9kZSk7CisKKyAgICBSU1NBdG9tTGluayogbGluayA9IG5ldyBSU1NBdG9tTGluaygp
OworCisgICAgZm9yICh4bWxBdHRyKiBhdHRyID0gbm9kZS0+cHJvcGVydGllczsgYXR0cjsgYXR0
ciA9IGF0dHItPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRfY2FzdDxj
b25zdCBjaGFyKj4oYXR0ci0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dlcigpOworCisg
ICAgICAgIGlmIChuYW1lID09ICJocmVmIikKKyAgICAgICAgICAgIGxpbmstPm1faHJlZiA9IHRl
eHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAicmVsIikKKyAg
ICAgICAgICAgIGxpbmstPm1fcmVsID0gdGV4dEZyb21YTUxBdHRyKGF0dHIpOworICAgICAgICBl
bHNlIGlmIChuYW1lID09ICJ0eXBlIikKKyAgICAgICAgICAgIGxpbmstPm1fdHlwZSA9IHRleHRG
cm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAiaHJlZmxhbmciKQor
ICAgICAgICAgICAgbGluay0+bV9ocmVmbGFuZyA9IHRleHRGcm9tWE1MQXR0cihhdHRyKTsKKyAg
ICAgICAgZWxzZSBpZiAobmFtZSA9PSAidGl0bGUiKQorICAgICAgICAgICAgbGluay0+bV90aXRs
ZSA9IHRleHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAibGVu
Z3RoIikKKyAgICAgICAgICAgIGxpbmstPm1fbGVuZ3RoID0gdGV4dEZyb21YTUxBdHRyKGF0dHIp
OworICAgIH0KKworICAgIHJldHVybiBsaW5rOworfQorCitSU1NFbmNsb3N1cmUqIFJTU0F0b21Q
YXJzZXI6OmVuY2xvc3VyZUZyb21MaW5rKFJTU0F0b21MaW5rKiBsaW5rKQoreworICAgIEJMQUNL
QkVSUllfQVNTRVJUKGxpbmspOworICAgIEJMQUNLQkVSUllfQVNTRVJUKGxpbmstPnJlbFR5cGUo
KSA9PSBSU1NBdG9tTGluazo6VHlwZUVuY2xvc3VyZSk7CisKKyAgICBSU1NFbmNsb3N1cmUqIGVu
Y2xvc3VyZSA9IG5ldyBSU1NFbmNsb3N1cmUoKTsKKworICAgIGVuY2xvc3VyZS0+bV91cmwgPSBs
aW5rLT5tX2hyZWY7CisgICAgZW5jbG9zdXJlLT5tX3R5cGUgPSBsaW5rLT5tX3R5cGU7CisgICAg
ZW5jbG9zdXJlLT5tX2xlbmd0aCA9IGxpbmstPm1fbGVuZ3RoOworCisgICAgcmV0dXJuIGVuY2xv
c3VyZTsKK30KKworU3RyaW5nIFJTU0F0b21QYXJzZXI6OnBhcnNlQ29udGVudChjb25zdCBTdHJp
bmcmIGJhc2UsIHhtbE5vZGUqIG5vZGUpCit7CisgICAgLy8gU2VlOiBodHRwOi8vdG9vbHMuaWV0
Zi5vcmcvaHRtbC9yZmM0Mjg3I3BhZ2UtMTYKKworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUp
OworICAgIFN0cmluZyBjb250ZW50OworICAgIFN0cmluZyB0eXBlID0gImRlZmF1bHQiOworICAg
IFN0cmluZyBzcmM7CisgICAgZm9yICh4bWxBdHRyKiBhdHRyID0gbm9kZS0+cHJvcGVydGllczsg
YXR0cjsgYXR0ciA9IGF0dHItPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4oYXR0ci0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dl
cigpOworCisgICAgICAgIGlmIChuYW1lID09ICJ0eXBlIikKKyAgICAgICAgICAgIHR5cGUgPSB0
ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gInNyYyIpCisg
ICAgICAgICAgICBzcmMgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgfQorCisgICAgaWYg
KCFzcmMuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChpc1JlbGF0aXZlUGF0aChzcmMpKQorICAg
ICAgICAgICAgc3JjID0gYmFzZSArICIvIiArIHNyYzsKKyAgICAgICAgY29udGVudCArPSAiPGEg
aHJlZj1cIiI7CisgICAgICAgIGNvbnRlbnQgKz0gc3JjICsgIlwiPiIgKyBzcmMgKyAiPC9hPiI7
CisgICAgICAgIHJldHVybiBjb250ZW50OworICAgIH0KKworICAgIGlmICh0eXBlID09ICJ0ZXh0
IiB8fCB0eXBlLnN0YXJ0c1dpdGgoInRleHQvIikpCisgICAgICAgIGNvbnRlbnQgPSB0ZXh0RnJv
bVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAodHlwZSA9PSAiaHRtbCIpCisgICAgICAgIGNv
bnRlbnQgPSB0ZXh0RnJvbVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAodHlwZSA9PSAieGh0
bWwiKSB7CisgICAgICAgIHhtbEJ1ZmZlclB0ciBidWZmZXIgPSB4bWxCdWZmZXJDcmVhdGUoKTsK
KyAgICAgICAgeG1sTm9kZSAqIGN1ciA9IG5vZGUtPmNoaWxkcmVuOworICAgICAgICBpZiAoY3Vy
ICYmIGN1ci0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB7CisgICAgICAgICAgICAvLyBFbmNv
ZGluZyBvZiBidWZmZXIgaXMgdXRmLTguCisgICAgICAgICAgICB4bWxOb2RlRHVtcChidWZmZXIs
IGN1ci0+ZG9jLCBjdXIsIDAsIDApOworICAgICAgICAgICAgaWYgKCFiYXNlLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gIjxiYXNlIGhyZWY9JyI7CisgICAgICAgICAg
ICAgICAgY29udGVudCArPSBtX3VybC5iYXNlQXNTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBj
b250ZW50ICs9ICIvIjsKKyAgICAgICAgICAgICAgICBjb250ZW50ICs9IGJhc2U7CisgICAgICAg
ICAgICAgICAgY29udGVudCArPSAiLycgLz4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
Y29udGVudCArPSAoY29uc3QgY2hhciopeG1sQnVmZmVyQ29udGVudChidWZmZXIpOworICAgICAg
ICB9CisgICAgICAgIHhtbEJ1ZmZlckZyZWUoYnVmZmVyKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUu
ZW5kc1dpdGgoIit4bWwiKSB8fCB0eXBlLmVuZHNXaXRoKCIveG1sIikpCisgICAgICAgIC8vIEZJ
WE1FOiBzZWUgYXRvbSBzcGVjIDQuMS4zLjMuNC4KKyAgICAgICAgY29udGVudCA9IHRleHRGcm9t
WE1MTm9kZShub2RlKTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRlbnQgPSB0ZXh0RnJvbVhNTE5v
ZGUobm9kZSk7CisKKyAgICByZXR1cm4gY29udGVudDsKK30KKworU3RyaW5nIFJTU0F0b21QYXJz
ZXI6OnBhcnNlQXV0aG9yKHhtbE5vZGUqIG5vZGUpCit7CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQo
bm9kZSk7CisKKyAgICBTdHJpbmcgdXNlcm5hbWU7CisgICAgU3RyaW5nIGVtYWlsOworCisgICAg
Zm9yIChub2RlID0gbm9kZS0+Y2hpbGRyZW47IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7Cisg
ICAgICAgIFN0cmluZyBuYW1lKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5vZGUtPm5h
bWUpKTsKKyAgICAgICAgbmFtZS5tYWtlTG93ZXIoKTsKKworICAgICAgICBpZiAobmFtZSA9PSAi
bmFtZSIpCisgICAgICAgICAgICB1c2VybmFtZSA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAg
ICAgICAgZWxzZSBpZiAobmFtZSA9PSAiZW1haWwiKQorICAgICAgICAgICAgZW1haWwgPSB0ZXh0
RnJvbVhNTE5vZGUobm9kZSk7CisgICAgICAgIC8vIGVsc2UgaWYgKG5hbWUgPT0gInVyaSIpCisg
ICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdXJpIGluZm8uCisgICAgfQorCisgICAgaWYgKCFlbWFp
bC5pc0VtcHR5KCkpIHsKKyAgICAgICAgdXNlcm5hbWUgKz0gIiAoIjsKKyAgICAgICAgdXNlcm5h
bWUgKz0gZW1haWw7CisgICAgICAgIHVzZXJuYW1lICs9ICIpIjsKKyAgICB9CisKKyAgICByZXR1
cm4gdXNlcm5hbWU7Cit9CisKK1N0cmluZyBSU1NBdG9tUGFyc2VyOjpwYXJzZUNhdGVnb3J5KHht
bE5vZGUqIG5vZGUpCit7CisgICAgQkxBQ0tCRVJSWV9BU1NFUlQobm9kZSk7CisKKyAgICBTdHJp
bmcgY2F0ZWdvcnk7CisKKyAgICBmb3IgKHhtbEF0dHIqIGF0dHIgPSBub2RlLT5wcm9wZXJ0aWVz
OyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVy
cHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRyLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxv
d2VyKCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUncyBhIGxhYmVsLCB3ZSB1c2UgaXQsIGlmIG5v
dCwgdXNlIHRlcm0gYXR0cmlidXRlLgorICAgICAgICAvLyBBcyBsYWJlbCBpcyBvcHRpb25hbCwg
YnV0IHRlcm0gaXMgbWFuZGF0b3J5LgorICAgICAgICBpZiAobmFtZSA9PSAibGFiZWwiKSB7Cisg
ICAgICAgICAgICBjYXRlZ29yeSA9IHRleHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgPT0gInRlcm0iKQorICAgICAg
ICAgICAgY2F0ZWdvcnkgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgfQorCisgICAgcmV0
dXJuIGNhdGVnb3J5OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0F0b21QYXJz
ZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNT
QXRvbVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NWY1MGYK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvcnNzL1JTU0F0b21QYXJzZXIuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZy
ZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgUlNT
QXRvbVBhcnNlcl9oCisjZGVmaW5lIFJTU0F0b21QYXJzZXJfaAorCisjaW5jbHVkZSAiS1VSTC5o
IgorI2luY2x1ZGUgIlJTU1BhcnNlckJhc2UuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBSU1NBdG9tTGluayB7CitwdWJsaWM6CisgICAgZW51bSBUeXBlIHsKKyAgICAgICAgVHlw
ZVVua25vd24sCisgICAgICAgIFR5cGVBbHRlcm5hdGUsCisgICAgICAgIFR5cGVSZWxhdGVkLAor
ICAgICAgICBUeXBlU2VsZiwKKyAgICAgICAgVHlwZUVuY2xvc3VyZSwKKyAgICAgICAgVHlwZVZp
YSwKKyAgICAgICAgVHlwZVVuc3VwcG9ydGVkCisgICAgfTsKKworICAgIFJTU0F0b21MaW5rKCkK
KyAgICAgICAgOiBtX3R5cGVJbkVudW0oVHlwZVVua25vd24pCisgICAgeyB9CisKKyAgICBUeXBl
IHJlbFR5cGUoKTsKKworICAgIFN0cmluZyBtX3JlbDsKKyAgICBTdHJpbmcgbV9ocmVmOworICAg
IFN0cmluZyBtX2hyZWZsYW5nOworICAgIFN0cmluZyBtX3R5cGU7CisgICAgU3RyaW5nIG1fdGl0
bGU7CisgICAgU3RyaW5nIG1fbGVuZ3RoOworCitwcml2YXRlOgorICAgIFR5cGUgbV90eXBlSW5F
bnVtOworfTsKKworY2xhc3MgUlNTQXRvbVBhcnNlciA6IHB1YmxpYyBSU1NQYXJzZXJCYXNlIHsK
K3B1YmxpYzoKKyAgICBSU1NBdG9tUGFyc2VyKCk7CisKKyAgICBib29sIHBhcnNlQnVmZmVyKGNv
bnN0IGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0aCwgY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFy
KiBlbmNvZGluZyk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBwYXJzZVhtbERvYyh4bWxEb2NQdHIp
OworICAgIGJvb2wgcGFyc2VJdGVtQmFzZUF0dHJpYnV0ZShSU1NJdGVtQmFzZSosIGNvbnN0IFN0
cmluZyYgbmFtZSwgeG1sTm9kZSosIGNvbnN0IFN0cmluZyYgYmFzZSk7CisgICAgUlNTSXRlbSog
cGFyc2VJdGVtKHhtbE5vZGUqKTsKKyAgICBSU1NGZWVkKiBwYXJzZUZlZWQoeG1sTm9kZSopOwor
ICAgIFJTU0F0b21MaW5rKiBwYXJzZUxpbmsoeG1sTm9kZSopOworICAgIFJTU0VuY2xvc3VyZSog
ZW5jbG9zdXJlRnJvbUxpbmsoUlNTQXRvbUxpbmsqKTsKKworICAgIFN0cmluZyBwYXJzZUNvbnRl
bnQoY29uc3QgU3RyaW5nJiBiYXNlLCB4bWxOb2RlKik7CisgICAgU3RyaW5nIHBhcnNlQXV0aG9y
KHhtbE5vZGUqKTsKKyAgICBTdHJpbmcgcGFyc2VDYXRlZ29yeSh4bWxOb2RlKik7CisgICAgS1VS
TCBtX3VybDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJTU0F0
b21QYXJzZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9i
bGFja2JlcnJ5L3Jzcy9SU1NGaWx0ZXJTdHJlYW0uY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NGaWx0ZXJTdHJlYW0uY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDdmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVh
bS5jcHAKQEAgLTAsMCArMSw2NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAs
IDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlJTU0ZpbHRlclN0cmVhbS5oIgorCisjaW5jbHVkZSAiUlNTMTBQYXJzZXIuaCIKKyNpbmNsdWRl
ICJSU1MyMFBhcnNlci5oIgorI2luY2x1ZGUgIlJTU0F0b21QYXJzZXIuaCIKKyNpbmNsdWRlICJS
U1NHZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJUZXh0Q29kZWNJQ1UuaCIKKworI2luY2x1ZGUgPEJs
YWNrQmVycnlQbGF0Zm9ybUFzc2VydC5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUxv
Zy5oPgorI2luY2x1ZGUgPFNjb3BlUG9pbnRlci5oPgorI2luY2x1ZGUgPG5ldHdvcmsvTmV0d29y
a1JlcXVlc3QuaD4KKyNpbmNsdWRlIDx3dGYvQVNDSUlDVHlwZS5oPgorI2luY2x1ZGUgPHd0Zi9P
d25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0
L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKwordXNpbmcgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWw7Cit1c2luZyBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6TG9nTGV2ZWxJbmZvOwordXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xl
dmVsV2FybjsKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc191dGY4RW5j
b2RpbmdOYW1lID0gIlVURi04IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2xhdGluMUVu
Y29kaW5nTmFtZSA9ICJJU08tODg1OS0xIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2di
a0VuY29kaW5nTmFtZSA9ICJHQksiOworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc19jb250
ZW50RW5jb2RpbmdIZWFkZXJLZXkgPSAiQ29udGVudC1FbmNvZGluZyI7CitzdGF0aWMgY29uc3Qg
Y2hhciogY29uc3Qgc19jb250ZW50TGVuZ3RoSGVhZGVyS2V5ID0gIkNvbnRlbnQtTGVuZ3RoIjsK
K3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2NvbnRlbnRUeXBlSGVhZGVyS2V5ID0gIkNvbnRl
bnQtVHlwZSI7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2F0b20xMFZlcnNpb25LZXkg
PSAieG1sbnMiOworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHNfYXRvbTEwVmVyc2lvblZhbHVl
ID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSI7CitzdGF0aWMgY29uc3QgY2hhciogY29u
c3Qgc19yc3MxMFZlcnNpb25LZXkgPSAieG1sbnMiOworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0
IHNfcnNzMTBWZXJzaW9uVmFsdWUgPSAiaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvIjsKK3N0YXRp
YyBjb25zdCBjaGFyKiBjb25zdCBzX3JzczIwVmVyc2lvbktleSA9ICJ2ZXJzaW9uIjsKK3N0YXRp
YyBjb25zdCBjaGFyKiBjb25zdCBzX3JzczIwVmVyc2lvblZhbHVlID0gIjIuMCI7CitzdGF0aWMg
Y29uc3QgY2hhciogY29uc3Qgc19yc3NYbWxWZXJzaW9uS2V5ID0gInZlcnNpb24iOworc3RhdGlj
IGNvbnN0IGNoYXIqIGNvbnN0IHNfcnNzWG1sVmVyc2lvblZhbHVlID0gIjEuMCI7CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBpc0NvbnRyb2xDaGFyYWN0ZXIoaW50IGRhdGEpCit7CisgICAgcmV0dXJu
IGRhdGEgPCAweDIwIHx8IGRhdGEgPT0gMHg3ZjsKK30KKworc3RhdGljIGludCBpc3NwYWNlU2Fm
ZShpbnQgY2gpCit7CisgICAgcmV0dXJuIGlzQVNDSUlTcGFjZTxpbnQ+KGNoICYgMHhmZik7Cit9
CisKK3N0YXRpYyBzdGQ6OnN0cmluZyYgc3RyaXBXaGl0ZVNwYWNlKHN0ZDo6c3RyaW5nJiBzdHIp
Cit7CisgICAgc3RyLmVyYXNlKHN0ci5iZWdpbigpLCBzdGQ6OmZpbmRfaWYoc3RyLmJlZ2luKCks
IHN0ci5lbmQoKSwgc3RkOjpub3QxKHN0ZDo6cHRyX2Z1bjxpbnQsIGludD4oaXNzcGFjZVNhZmUp
KSkpOworICAgIHN0ci5lcmFzZShzdGQ6OmZpbmRfaWYoc3RyLnJiZWdpbigpLCBzdHIucmVuZCgp
LCBzdGQ6Om5vdDEoc3RkOjpwdHJfZnVuPGludCwgaW50Pihpc3NwYWNlU2FmZSkpKS5iYXNlKCks
IHN0ci5lbmQoKSk7CisgICAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIGlubGluZSBib29sIGVx
dWFsSWdub3JpbmdDYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaXJzdCwgY29uc3QgY2hhciogc2Vj
b25kKQoreworICAgIHJldHVybiAhc3RyY2FzZWNtcChmaXJzdC5jX3N0cigpLCBzZWNvbmQpOwor
fQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdG9tTUlNRVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcm
IG1pbWVUeXBlKQoreworICAgIHJldHVybiBlcXVhbElnbm9yaW5nQ2FzZShtaW1lVHlwZSwgImFw
cGxpY2F0aW9uL2F0b20reG1sIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1JTU01JTUVU
eXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSkKK3sKKyAgICByZXR1cm4gZXF1YWxJZ25v
cmluZ0Nhc2UobWltZVR5cGUsICJhcHBsaWNhdGlvbi9yc3MreG1sIik7Cit9CisKK3N0YXRpYyBp
bmxpbmUgYm9vbCBpc1BvdGVudGlhbFJTU01JTUVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1l
VHlwZSkKK3sKKyAgICByZXR1cm4gIXN0cm5jbXAobWltZVR5cGUuZGF0YSgpLCAidGV4dC94bWwi
LCA4KSB8fCAhc3RybmNtcChtaW1lVHlwZS5kYXRhKCksICJhcHBsaWNhdGlvbi94bWwiLCAxNSk7
Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1JTU0NvbnRlbnQoUlNTRmlsdGVyU3RyZWFtOjpS
ZXNvdXJjZVR5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gdHlwZSA9PSBSU1NGaWx0ZXJTdHJlYW06
OlRZUEVfUlNTMTBfQ09OVEVOVAorICAgICAgICAgICAgfHwgdHlwZSA9PSBSU1NGaWx0ZXJTdHJl
YW06OlRZUEVfUlNTMjBfQ09OVEVOVAorICAgICAgICAgICAgfHwgdHlwZSA9PSBSU1NGaWx0ZXJT
dHJlYW06OlRZUEVfQVRPTV9DT05URU5UOworfQorCitzdGF0aWMgUlNTRmlsdGVyU3RyZWFtOjpS
ZXNvdXJjZVR5cGUgUlNTVHlwZUZyb21Db250ZW50VHlwZShjb25zdCBzdGQ6OnN0cmluZyYgY29u
dGVudFR5cGUpCit7CisgICAgaWYgKGNvbnRlbnRUeXBlLmVtcHR5KCkpCisgICAgICAgIHJldHVy
biBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9XTjsKKworICAgIHN0ZDo6c3RyaW5nIG1pbWVU
eXBlOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb247CisgICAgYm9vbCBpc1JTUyA9IGZhbHNlOwor
CisgICAgLy8gVGhlIGNvbnRlbnRUeXBlIGNhbiBjb250YWluIGJvdGggYSBtaW1lIHR5cGUgYW5k
IHZlcnNpb24gYXR0cmlidXRlcworICAgIC8vIElmIHdlIGFscmVhZHkga25vdyB0aGUgdHlwZSBp
cyBBdG9tLCB3ZSBkb24ndCBuZWVkIGVpdGhlciBvZiB0aGVzZSwgc28gc2tpcCBpdAorICAgIGZv
ciAoc2l6ZV90IHN0YXJ0ID0gMCwgZGVsaW1pdGVyID0gMDtkZWxpbWl0ZXIgIT0gc3RkOjpzdHJp
bmc6Om5wb3M7IHN0YXJ0ID0gZGVsaW1pdGVyICsgMSkgeworICAgICAgICBkZWxpbWl0ZXIgPSBj
b250ZW50VHlwZS5maW5kKCc7Jywgc3RhcnQpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXBv
bmVudCA9IGNvbnRlbnRUeXBlLnN1YnN0cihzdGFydCwgZGVsaW1pdGVyID09IHN0ZDo6c3RyaW5n
OjpucG9zID8gZGVsaW1pdGVyIDogZGVsaW1pdGVyIC0gc3RhcnQpOworCisgICAgICAgIGlmICht
aW1lVHlwZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoaXNBdG9tTUlNRVR5cGUoY29tcG9u
ZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUWVBFX0FUT01f
Q09OVEVOVDsKKworICAgICAgICAgICAgaWYgKGlzUlNTTUlNRVR5cGUoY29tcG9uZW50KSkgewor
ICAgICAgICAgICAgICAgIC8vIGRlZmluaXRlbHkgbm90IGEgdmVyc2lvbiBhdHRyaWJ1dGUsIHNr
aXAgdG8gbmV4dCB0b2tlbgorICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gY29tcG9uZW50Owor
ICAgICAgICAgICAgICAgIGlzUlNTID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBlcXVhbHNpZ24gPSBj
b21wb25lbnQuZmluZCgnPScpOworICAgICAgICBpZiAoZXF1YWxzaWduICE9IHN0ZDo6c3RyaW5n
OjpucG9zICYmIGVxdWFsSWdub3JpbmdDYXNlKGNvbXBvbmVudC5zdWJzdHIoMCwgZXF1YWxzaWdu
KSwgInZlcnNpb24iKSkKKyAgICAgICAgICAgIHZlcnNpb24gPSBjb21wb25lbnQuc3Vic3RyKGVx
dWFsc2lnbiArIDEpOworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIG5vdyBoYXZlIGZvdW5kIGJv
dGggTUlNRSB0eXBlIGFuZCB2ZXJzaW9uCisgICAgICAgIGlmICghbWltZVR5cGUuZW1wdHkoKSAm
JiAhdmVyc2lvbi5lbXB0eSgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYg
KGlzUlNTKSB7CisgICAgICAgIGlmICghdmVyc2lvbi5jb21wYXJlKCIxLjAiKSkKKyAgICAgICAg
ICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfUlNTMTBfQ09OVEVOVDsKKworICAgICAg
ICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUWVBFX1JTUzIwX0NPTlRFTlQ7CisgICAgfQorCisg
ICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9VTktOT1dOOworfQorCitzdGF0aWMgUlNT
RmlsdGVyU3RyZWFtOjpSZXNvdXJjZVR5cGUgUlNTVHlwZUZyb21Db250ZW50KGNvbnN0IGNoYXIq
IHN0ciwgaW50IHN0ckxlbikKK3sKKyAgICAvLyBMb2NhdGUgeG1sIHNpZ25hdHVyZS4KKyAgICBj
b25zdCBjaGFyKiBwb3MgPSBzdHI7CisKKyAgICAvLyBMb2NhdGUgdGhlIFJTUyB0YWdzCisgICAg
d2hpbGUgKHRydWUpIHsKKyAgICAgICAgcG9zID0gc3RyY2hyKHBvcywgJzwnKTsKKyAgICAgICAg
aWYgKCFwb3MgfHwgKHBvcyAtIHN0ciA+PSBzdHJMZW4pKSB7CisgICAgICAgICAgICBCQkxPRyhM
b2dMZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogY2FuIG5vdCBmaW5kIGFueSBzdGFy
dCB0YWciKTsKKyAgICAgICAgICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9X
TjsKKyAgICAgICAgfQorCisgICAgICAgICsrcG9zOworCisgICAgICAgIGlmICghc3RybmNhc2Vj
bXAocG9zLCAicnNzIiwgMykpIHsKKyAgICAgICAgICAgIGlmIChpc1NwYWNlT3JOZXdsaW5lKCoo
cG9zICsgMykpKSB7CisgICAgICAgICAgICAgICAgQkJMT0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlw
ZUZyb21Db250ZW50KCk6IGZvdW5kIFJTUyAyLjAgdGFnIik7CisgICAgICAgICAgICAgICAgcmV0
dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9SU1MyMF9DT05URU5UOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTog
d3JvbmcgUlNTIDIuMCB0YWc6ICUuKnMiLCAzMiwgcG9zKTsKKyAgICAgICAgICAgIHJldHVybiBS
U1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgh
c3RybmNhc2VjbXAocG9zLCAiZmVlZCIsIDQpKSB7CisgICAgICAgICAgICBpZiAoaXNTcGFjZU9y
TmV3bGluZSgqKHBvcyArIDQpKSkgeworICAgICAgICAgICAgICAgIEJCTE9HKExvZ0xldmVsSW5m
bywgIlJTU1R5cGVGcm9tQ29udGVudCgpOiBmb3VuZCBBdG9tIDEuMCB0YWciKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUWVBFX0FUT01fQ09OVEVOVDsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgQkJMT0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlwZUZyb21D
b250ZW50KCk6IHdyb25nIEF0b20gMS4wIHRhZzogJS4qcyIsIDMyLCBwb3MpOworICAgICAgICAg
ICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9VTktOT1dOOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCFzdHJuY2FzZWNtcChwb3MsICJyZGY6UkRGIiwgNykpIHsKKyAgICAgICAgICAg
IGlmIChpc1NwYWNlT3JOZXdsaW5lKCoocG9zICsgNykpKSB7CisgICAgICAgICAgICAgICAgQkJM
T0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlwZUZyb21Db250ZW50KCk6IGZvdW5kIFJTUyAxLjAgdGFn
Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9SU1MxMF9D
T05URU5UOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8s
ICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogd3JvbmcgUlNTIDEuMCB0YWc6ICUuKnMiLCAzMiwgcG9z
KTsKKyAgICAgICAgICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9XTjsKKyAg
ICAgICAgfQorCisgICAgICAgIGlmICghc3RybmNhc2VjbXAocG9zLCAiP3htbCIsIDQpKSB7Cisg
ICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogZm91
bmQgYW5vdGhlciB4bWwgdGFnIik7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGFub3RoZXIgeG1s
IGluZm8sIHNraXAgaXQuCisgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgIHBvcyA9
IHN0cnN0cihwb3MsICI/PiIpOworCisgICAgICAgICAgICBpZiAoIXBvcyB8fCAocG9zIC0gc3Ry
ID49IHN0ckxlbikpIHsKKyAgICAgICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8sICJSU1NU
eXBlRnJvbUNvbnRlbnQoKTogZXh0cmEgeG1sIHRhZyB0b28gbG9uZyIpOworICAgICAgICAgICAg
ICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmICghc3RybmNhc2VjbXAocG9zLCAiIS0tIiwgMykpIHsKKyAgICAgICAg
ICAgIEJCTE9HKExvZ0xldmVsSW5mbywgIlJTU1R5cGVGcm9tQ29udGVudCgpOiBmb3VuZCBjb21t
ZW50cyIpOworICAgICAgICAgICAgLy8gVGhpcyBpcyBjb21tZW50cywgc2tpcCBpdC4KKyAgICAg
ICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgcG9zID0gc3Ryc3RyKHBvcywgIi0tPiIpOwor
CisgICAgICAgICAgICBpZiAoIXBvcyB8fCAocG9zIC0gc3RyID49IHN0ckxlbikpIHsKKyAgICAg
ICAgICAgICAgICBCQkxPRyhMb2dMZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogY29t
bWVudHMgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFt
OjpUWVBFX1VOS05PV047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvcyArPSAzOwor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBCQkxPRyhMb2dMZXZl
bEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogbm9uIHJzcyB0eXBlICglLipzKSBmb3VuZCIs
IDMyLCBwb3MpOworICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUWVBFX1VOS05PV047
CisgICAgfQorCisgICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9VTktOT1dOOworfQor
CitzdGF0aWMgUGFzc093blB0cjxSU1NQYXJzZXJCYXNlPiBjcmVhdGVQYXJzZXIoUlNTRmlsdGVy
U3RyZWFtOjpSZXNvdXJjZVR5cGUgdHlwZSkKK3sKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChpc1JT
U0NvbnRlbnQodHlwZSkpOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBSU1NGaWx0
ZXJTdHJlYW06OlRZUEVfQVRPTV9DT05URU5UOgorICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3
IFJTU0F0b21QYXJzZXIoKSk7CisgICAgY2FzZSBSU1NGaWx0ZXJTdHJlYW06OlRZUEVfUlNTMTBf
Q09OVEVOVDoKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBSU1MxMFBhcnNlcigpKTsKKyAg
ICBjYXNlIFJTU0ZpbHRlclN0cmVhbTo6VFlQRV9SU1MyMF9DT05URU5UOgorICAgICAgICByZXR1
cm4gYWRvcHRQdHIobmV3IFJTUzIwUGFyc2VyKCkpOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8v
IFRoZSBmb2xsb3dpbmcgY29kZSBpcyBqdXN0IGZvciBjb21waWxlciwgaXQgc2hvdWxkIG5ldmVy
IHJlYWNoIGhlcmUuCisgICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgUlNTMjBQYXJzZXIoKSk7
CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBmaW5kWE1MRW5jb2RpbmdQb3NpdGlvbihjb25zdCBj
aGFyKiBzdHIsIGNvbnN0IGNoYXIqJiBlbmNvZGluZ1N0YXJ0LCBjb25zdCBjaGFyKiYgZW5jb2Rp
bmdFbmQpCit7CisgICAgZW5jb2RpbmdTdGFydCA9IHN0cnN0cihzdHIsICI8P3htbCAiKTsKKyAg
ICBpZiAoIWVuY29kaW5nU3RhcnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGVuY29k
aW5nU3RhcnQgKz0gNjsgLy8gbGVuZ3RoIG9mICI8P3htbCAiCisgICAgY2hhciogZW5kUG9zID0g
c3Ryc3RyKGNvbnN0X2Nhc3Q8Y2hhcio+KGVuY29kaW5nU3RhcnQpLCAiPz4iKTsKKyAgICBpZiAo
IWVuZFBvcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZW5jb2RpbmdTdGFydCA9IHN0
cnN0cihjb25zdF9jYXN0PGNoYXIqPihlbmNvZGluZ1N0YXJ0KSwgImVuY29kaW5nIik7CisKKyAg
ICBpZiAoIWVuY29kaW5nU3RhcnQgfHwgZW5jb2RpbmdTdGFydCA+IGVuZFBvcykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgZW5jb2RpbmdTdGFydCArPSA4OworCisgICAgd2hpbGUgKGVu
Y29kaW5nU3RhcnQgPCBlbmRQb3MgJiYgKmVuY29kaW5nU3RhcnQgPD0gJyAnKQorICAgICAgICAr
K2VuY29kaW5nU3RhcnQ7CisKKyAgICBpZiAoZW5jb2RpbmdTdGFydCA9PSBlbmRQb3MgfHwgKmVu
Y29kaW5nU3RhcnQgIT0gJz0nKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICArK2VuY29k
aW5nU3RhcnQ7CisKKyAgICB3aGlsZSAoZW5jb2RpbmdTdGFydCA8IGVuZFBvcyAmJiAqZW5jb2Rp
bmdTdGFydCA8PSAnICcpCisgICAgICAgICsrZW5jb2RpbmdTdGFydDsKKworICAgIGlmIChlbmNv
ZGluZ1N0YXJ0ID09IGVuZFBvcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2hhciBx
dW90ZSA9ICplbmNvZGluZ1N0YXJ0OworICAgIGlmIChxdW90ZSAhPSAnXCInICYmIHF1b3RlICE9
ICdcJycpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICsrZW5jb2RpbmdTdGFydDsKKyAg
ICBlbmNvZGluZ0VuZCA9IHN0cmNocihjb25zdF9jYXN0PGNoYXIqPihlbmNvZGluZ1N0YXJ0KSwg
cXVvdGUpOworCisgICAgaWYgKCFlbmNvZGluZ0VuZCB8fCBlbmNvZGluZ0VuZCA9PSBlbmNvZGlu
Z1N0YXJ0IHx8IGVuY29kaW5nRW5kID4gZW5kUG9zKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZmluZFhNTExhbmd1YWdlUG9zaXRp
b24oY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiYgbGFuZ1N0YXJ0LCBjb25zdCBjaGFyKiYg
bGFuZ0VuZCkKK3sKKyAgICBsYW5nU3RhcnQgPSBzdHJzdHIoY29uc3RfY2FzdDxjaGFyKj4oc3Ry
KSwgIjxsYW5ndWFnZT4iKTsKKyAgICBpZiAoIWxhbmdTdGFydCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgbGFuZ1N0YXJ0ICs9IDEwOyAvLyBsZW5ndGggb2YgIjxsYW5ndWFnZT4iCisg
ICAgY2hhciogZW5kUG9zID0gc3Ryc3RyKGNvbnN0X2Nhc3Q8Y2hhcio+KGxhbmdTdGFydCksICI8
L2xhbmd1YWdlPiIpOworICAgIGlmICghZW5kUG9zKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICB3aGlsZSAobGFuZ1N0YXJ0IDwgZW5kUG9zICYmICpsYW5nU3RhcnQgPD0gJyAnKQorICAg
ICAgICArK2xhbmdTdGFydDsKKworICAgIGlmIChsYW5nU3RhcnQgPT0gZW5kUG9zKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBsYW5nRW5kID0gZW5kUG9zIC0gMTsKKworICAgIHdoaWxl
IChsYW5nRW5kID4gbGFuZ1N0YXJ0ICYmICpsYW5nRW5kIDw9ICcgJykKKyAgICAgICAgLS1sYW5n
RW5kOworCisgICAgKytsYW5nRW5kOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgY29u
c3QgY2hhciogZGVmYXVsdEVuY29kaW5nRm9yTGFuZ3VhZ2UoY29uc3QgY2hhciogbGFuZ3VhZ2Up
Cit7CisgICAgaWYgKCghc3RyY2FzZWNtcChsYW5ndWFnZSwgImVuIikpCisgICAgICAgIHx8ICgh
c3RyY2FzZWNtcChsYW5ndWFnZSwgImVuLVVTIikpKQorICAgICAgICByZXR1cm4gc19sYXRpbjFF
bmNvZGluZ05hbWU7CisgICAgaWYgKCFzdHJjYXNlY21wKGxhbmd1YWdlLCAiemgtY24iKSkKKyAg
ICAgICAgcmV0dXJuIHNfZ2JrRW5jb2RpbmdOYW1lOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0
YXRpYyBib29sIGlzVHJhbnNjb2RpbmdOZWVkZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5n
KQoreworICAgIC8vIFdoZW4gdGhlcmUncyBubyBlbmNvZGluZyBpbmZvcm1hdGlvbiwgb3IgdGhl
IGVuY29kaW5nIGNhbiBub3QgYmUgZm91bmQgaW4gYWxsIGVuY29kaW5ncworICAgIC8vIHN1cHBv
cnRlZCBpbiBvdXIgcGhvbmUsIHdlIHdpbGwgdHJ5IHRvIHRyYW5zY29kZSB0aGUgY29udGVudCBh
bnl3YXksIHN1cHBvc2VkIHRvIEFTQ0lJLgorCisgICAgaWYgKGVuY29kaW5nLmVtcHR5KCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIFRleHRFbmNvZGluZyhzX3V0ZjhFbmNv
ZGluZ05hbWUpICE9IFRleHRFbmNvZGluZyhlbmNvZGluZy5jX3N0cigpKTsKK30KKworZW51bSBU
cmFuc2NvZGVSZXN1bHQgeworICAgIFN1Y2Nlc3MsCisgICAgU291cmNlRW5jb2RpbmdVbnN1cHBv
cnRlZCwKKyAgICBTb3VyY2VCcm9rZW4sCisgICAgVGFyZ2V0RW5jb2RpbmdVbnN1cHBvcnRlZCwK
KyAgICBUYXJnZXRCdWZmZXJJbnN1ZmZpY2llbnQKK307CisKK3N0YXRpYyBUcmFuc2NvZGVSZXN1
bHQgdHJhbnNjb2RlKGNvbnN0IGNoYXIqIHNvdXJjZUVuY29kaW5nLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0RW5jb2RpbmcsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiYgc291cmNlU3RhcnQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlTGVuZ3RoLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY2hhciomIHRhcmdldFN0YXJ0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdldExlbmd0aCkKK3sKKyAgICBUZXh0
RW5jb2RpbmcgdGV4dEVuY29kaW5nU291cmNlKHNvdXJjZUVuY29kaW5nKTsKKyAgICBpZiAoIXRl
eHRFbmNvZGluZ1NvdXJjZS5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBTb3VyY2VFbmNvZGlu
Z1Vuc3VwcG9ydGVkOworCisgICAgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ1RhcmdldCh0YXJn
ZXRFbmNvZGluZyk7CisgICAgaWYgKCF0ZXh0RW5jb2RpbmdUYXJnZXQuaXNWYWxpZCgpKQorICAg
ICAgICByZXR1cm4gVGFyZ2V0RW5jb2RpbmdVbnN1cHBvcnRlZDsKKworICAgIGJvb2wgc2F3RXJy
b3IgPSBmYWxzZTsKKyAgICBTdHJpbmcgdWNzMiA9IFRleHRDb2RlY0lDVSh0ZXh0RW5jb2RpbmdT
b3VyY2UpLmRlY29kZShzb3VyY2VTdGFydCwgc291cmNlTGVuZ3RoLCB0cnVlLCB0cnVlLCBzYXdF
cnJvcik7CisKKyAgICBpZiAoc2F3RXJyb3IpCisgICAgICAgIHJldHVybiBTb3VyY2VCcm9rZW47
CisKKyAgICBDU3RyaW5nIGVuY29kZWQgPSBUZXh0Q29kZWNJQ1UodGV4dEVuY29kaW5nVGFyZ2V0
KS5lbmNvZGUodWNzMi5jaGFyYWN0ZXJzKCksIHVjczIubGVuZ3RoKCksIFdlYkNvcmU6OkVudGl0
aWVzRm9yVW5lbmNvZGFibGVzKTsKKyAgICBpZiAoZW5jb2RlZC5sZW5ndGgoKSA+IHRhcmdldExl
bmd0aCkKKyAgICAgICAgcmV0dXJuIFRhcmdldEJ1ZmZlckluc3VmZmljaWVudDsKKworICAgIHN0
cm5jcHkodGFyZ2V0U3RhcnQsIGVuY29kZWQuZGF0YSgpLCBlbmNvZGVkLmxlbmd0aCgpKTsKKyAg
ICB0YXJnZXRTdGFydCArPSBlbmNvZGVkLmxlbmd0aCgpOworCisgICAgcmV0dXJuIFN1Y2Nlc3M7
Cit9CisKK3N0YXRpYyBib29sIHRyYW5zY29kZUNvbnRlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGNv
bnRlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGluZywgc3RkOjpzdHJpbmcmIHJlc3VsdCkK
K3sKKyAgICB1bnNpZ25lZCB1dGY4bGVuZ3RoID0gY29udGVudC5zaXplKCkgKiAzIC8gMjsgLy8g
VXNlIG1heGltdW0gbnVtYmVyIHV0Zi04IGxlbmd0aC4KKyAgICBTY29wZUFycmF5PGNoYXI+IGJ1
ZmZlcihuZXcgY2hhclt1dGY4bGVuZ3RoICsgMV0pOworCisgICAgc3RkOjpzdHJpbmcgeG1sSGVh
ZGVyU3RyaW5nOworCisgICAgY29uc3QgY2hhciogc3RhcnQgPSBjb250ZW50LmNfc3RyKCk7Cisg
ICAgY29uc3QgY2hhciogeG1sU3RhcnQgPSBzdHJzdHIoc3RhcnQsICI8P3htbCAiKTsKKyAgICBj
b25zdCBjaGFyKiB4bWxFbmQ7CisgICAgaWYgKHhtbFN0YXJ0KSB7CisgICAgICAgIHhtbEVuZCA9
IHN0cnN0cih4bWxTdGFydCwgIj8+Iik7CisgICAgICAgIGlmICgheG1sRW5kKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB4bWxFbmQgKz0gMjsgLy8gbGVuZ3RoIG9mICI/PiIK
KworICAgICAgICBjb25zdCBjaGFyKiBlbmNvZGluZ1N0YXJ0OworICAgICAgICBjb25zdCBjaGFy
KiBlbmNvZGluZ0VuZDsKKyAgICAgICAgaWYgKGZpbmRYTUxFbmNvZGluZ1Bvc2l0aW9uKHN0YXJ0
LCBlbmNvZGluZ1N0YXJ0LCBlbmNvZGluZ0VuZCkpIHsKKyAgICAgICAgICAgIHhtbEhlYWRlclN0
cmluZy5hc3NpZ24oc3RhcnQsIGVuY29kaW5nU3RhcnQgLSBzdGFydCk7CisgICAgICAgICAgICB4
bWxIZWFkZXJTdHJpbmcuYXBwZW5kKHNfdXRmOEVuY29kaW5nTmFtZSk7CisgICAgICAgICAgICB4
bWxIZWFkZXJTdHJpbmcuYXBwZW5kKGVuY29kaW5nRW5kLCB4bWxFbmQgLSBlbmNvZGluZ0VuZCk7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4bWxIZWFkZXJTdHJpbmcuYXNzaWduKHN0
YXJ0LCAoeG1sRW5kIC0gMikgLSBzdGFydCk7CisgICAgICAgICAgICB4bWxIZWFkZXJTdHJpbmcu
YXBwZW5kKCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7
CisgICAgICAgIHhtbEVuZCA9IHN0YXJ0OworICAgICAgICB4bWxIZWFkZXJTdHJpbmcgPSAiPD94
bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IjsKKyAgICB9CisKKyAgICBj
b25zdCBjaGFyKiBjb250ZW50U3RhcnQgPSB4bWxFbmQ7CisgICAgY2hhciogYnVmZmVyU3RhcnQg
PSAmYnVmZmVyWzBdOworCisgICAgVHJhbnNjb2RlUmVzdWx0IHRyYW5zY29kZVJlc3VsdCA9IHRy
YW5zY29kZShlbmNvZGluZy5jX3N0cigpLCBzX3V0ZjhFbmNvZGluZ05hbWUsIGNvbnRlbnRTdGFy
dCwgY29udGVudC5sZW5ndGgoKSAtICh4bWxFbmQgLSB4bWxTdGFydCksIGJ1ZmZlclN0YXJ0LCB1
dGY4bGVuZ3RoKTsKKworICAgIC8vIElmIHRoZSBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLCBv
ciBpZiB3ZSBmYWlsZWQgdG8gdHJhbnNjb2RlIHRoZSBjb250ZW50LCB3ZSB3aWxsIGp1c3QKKyAg
ICAvLyBlbmNvZGUgdGhlIGNvbnRlbnQgdG8gQVNDSUkgY29udGVudCwgYW5kIHJlcGxhY2luZyBh
bnkgbm9uLUFTQ0lJIGNoYXJhY3RlciB3aXRoIGEgcXVlc3Rpb24KKyAgICAvLyBtYXJrLiBUaGlz
IHdpbGwgYmUgYmV0dGVyIHRoYW4gZGlzcGxheWluZyB0aGUgcmF3IHRleHQsIGFzIHRoZSByYXcg
dGV4dCBjYW4gbm90IGJlIGRpc3BsYXllZAorICAgIC8vIGNvcnJlY3RseSBhbnl3YXksIGFzIHRo
ZWlyIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisKKyAgICBpZiAoU3VjY2VzcyAhPSB0cmFu
c2NvZGVSZXN1bHQpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDsgY29udGVu
dFN0YXJ0IDwgc3RhcnQgKyBjb250ZW50LnNpemUoKSA7ICsrY29udGVudFN0YXJ0LCArK2kpIHsK
KyAgICAgICAgICAgIGlmIChpc0FTQ0lJUHJpbnRhYmxlKCpjb250ZW50U3RhcnQpKQorICAgICAg
ICAgICAgICAgIGJ1ZmZlcltpXSA9ICpjb250ZW50U3RhcnQ7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gJz8nOworICAgICAgICB9CisKKyAgICAgICAgYnVm
ZmVyW2ldID0gMDsKKyAgICB9IGVsc2UKKyAgICAgICAgKmJ1ZmZlclN0YXJ0ID0gMDsKKworICAg
IHJlc3VsdC5hc3NpZ24oeG1sSGVhZGVyU3RyaW5nKTsKKyAgICByZXN1bHQuYXBwZW5kKCZidWZm
ZXJbMF0pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1JTU0ZpbHRlclN0cmVhbTo6UlNTRmls
dGVyU3RyZWFtKCkKKyAgICA6IEZpbHRlclN0cmVhbSgpCisgICAgLCBtX3Jlc291cmNlVHlwZShU
WVBFX1VOS05PV04pCisgICAgLCBtX2NvbnRlbnRUeXBlSW5kZXgoLTEpCisgICAgLCBtX2NoYXJz
ZXRDaGVja2VkKGZhbHNlKQorICAgICwgbV9lbmNvZGluZ0NoZWNrZWQoZmFsc2UpCit7Cit9CisK
K3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpub3RpZnlTdGF0dXNSZWNlaXZlZChpbnQgc3RhdHVzLCBj
b25zdCBjaGFyKiBtZXNzYWdlKQoreworICAgIC8vIG5vbi1IVFRQIGVycm9ycyBoYXZlIG5vIGRh
dGEgdG8gZGlzcGxheSwgYW5kIHJlZGlyZWN0cyB3aWxsIG5ldmVyIGJlIGRpc3BsYXllZCwKKyAg
ICAvLyBzbyBubyBuZWVkIHRvIGNoZWNrIGlmIHRoZXkgaGF2ZSBSU1MgZGF0YQorICAgIC8vIEhU
VFAgZXJyb3JzIG1heSBoYXZlIGRhdGEsIGFuZCBpbiB0aGVvcnkgaXQgY291bGQgYmUgUlNTIGRh
dGEgKGFsdGhvdWdoIGl0J3MgaGlnaGx5IHVubGlrZWx5KSBzbyBiZXR0ZXIgdG8ga2VlcCBjaGVj
a2luZyB0aGVtCisgICAgaWYgKHN0YXR1cyA8IDAgfHwgKDMwMCA8PSBzdGF0dXMgJiYgc3RhdHVz
IDwgNDAwICYmIHN0YXR1cyAhPSAzMDQpKSB7CisgICAgICAgIG1fcmVzb3VyY2VUeXBlID0gVFlQ
RV9OT1RfUlNTOworICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB3ZSB3aWxsIGdldCAyIHN0YXR1
cyBjb2RlLgorICAgICAgICBzZW5kU2F2ZWRIZWFkZXJzKCk7CisgICAgfQorCisgICAgRmlsdGVy
U3RyZWFtOjpub3RpZnlTdGF0dXNSZWNlaXZlZChzdGF0dXMsIG1lc3NhZ2UpOworfQorCit2b2lk
IFJTU0ZpbHRlclN0cmVhbTo6bm90aWZ5SGVhZGVyc1JlY2VpdmVkKE5ldHdvcmtSZXF1ZXN0OjpI
ZWFkZXJMaXN0JiBoZWFkZXJzKQoreworICAgIGlmICghaXNSU1NDb250ZW50KG1fcmVzb3VyY2VU
eXBlKSkgeworICAgICAgICBOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdDo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gaGVhZGVycy5lbmQoKTsKKyAgICAgICAgTmV0d29ya1JlcXVlc3Q6OkhlYWRlckxp
c3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBoZWFkZXJzLmJlZ2luKCk7CisgICAgICAgIGZvciAo
OyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nh
c2UoaXRlci0+Zmlyc3QsIHNfY29udGVudFR5cGVIZWFkZXJLZXkpKSB7CisgICAgICAgICAgICAg
ICAgaWYgKGl0ZXItPnNlY29uZC5maW5kKCJ4bWwiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewor
ICAgICAgICAgICAgICAgICAgICBtX2NvbnRlbnRUeXBlSW5kZXggPSBzdGQ6OmRpc3RhbmNlKE5l
dHdvcmtSZXF1ZXN0OjpIZWFkZXJMaXN0Ojpjb25zdF9pdGVyYXRvcihoZWFkZXJzLmJlZ2luKCkp
LCBpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlIHR5cGUgPSBSU1NUeXBl
RnJvbUNvbnRlbnRUeXBlKGl0ZXItPnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChp
c1JTU0NvbnRlbnQodHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBtX3Jlc291cmNlVHlw
ZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc1BvdGVudGlhbFJTU01J
TUVUeXBlKGl0ZXItPnNlY29uZCkpCisgICAgICAgICAgICAgICAgICAgICAgICBtX3Jlc291cmNl
VHlwZSA9IFRZUEVfTk9UX1JTUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9jb250
ZW50VHlwZUluZGV4IDwgMCkKKyAgICAgICAgbV9yZXNvdXJjZVR5cGUgPSBUWVBFX05PVF9SU1M7
CisKKyAgICBpZiAobV9yZXNvdXJjZVR5cGUgPT0gVFlQRV9OT1RfUlNTKSB7CisgICAgICAgIHNl
bmRTYXZlZEhlYWRlcnMoKTsKKyAgICAgICAgRmlsdGVyU3RyZWFtOjpub3RpZnlIZWFkZXJzUmVj
ZWl2ZWQoaGVhZGVycyk7CisgICAgfSBlbHNlCisgICAgICAgIHNhdmVIZWFkZXJzKGhlYWRlcnMp
OworfQorCit2b2lkIFJTU0ZpbHRlclN0cmVhbTo6bm90aWZ5RGF0YVJlY2VpdmVkKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpOZXR3b3JrQnVmZmVyKiBidWZmZXIpCit7CisgICAgLy8gSGVyZSB3ZSBh
c3N1bWUgdGhlIGZpcnN0IHBhY2tldCBvZiBkYXRhIGlzIGVub3VnaCBmb3IgdXMgdG8gc25pZmYg
dGhlIGNvbnRlbnQgdHlwZS4KKyAgICAvLyBJZiBzb21lZGF5IHNvbWUgZGVjZW50IHJlYWwgbGlm
ZSB3ZWIgc2l0ZSB2b2lkIHRoaXMgYXNzdW1wdGlvbiwgd2Ugc2hvdWxkIHJlLWltcGxlbWVudAor
ICAgIC8vIHRoaXMgY29kZS4gQnV0IGZvciBub3cgaXQgc2hvdWxkIGJlIGp1c3QgZmluZS4KKyAg
ICBpZiAobV9yZXNvdXJjZVR5cGUgPT0gVFlQRV9VTktOT1dOKQorICAgICAgICBtX3Jlc291cmNl
VHlwZSA9IFJTU1R5cGVGcm9tQ29udGVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bmV0d29ya0J1
ZmZlckRhdGEoYnVmZmVyKSwgQmxhY2tCZXJyeTo6UGxhdGZvcm06Om5ldHdvcmtCdWZmZXJEYXRh
TGVuZ3RoKGJ1ZmZlcikpOworCisgICAgLy8gSWYgd2UgZG9uJ3Qga25vdyB0aGUgcmVzb3VyY2Ug
dHlwZSBhdCB0aGlzIHN0YWdlLCB0aGVuIGl0IGlzIG5vdCBhCisgICAgLy8gUlNTIGNvbnRlbnQu
CisgICAgaWYgKG1fcmVzb3VyY2VUeXBlID09IFRZUEVfVU5LTk9XTikKKyAgICAgICAgbV9yZXNv
dXJjZVR5cGUgPSBUWVBFX05PVF9SU1M7CisKKyAgICBpZiAoaXNSU1NDb250ZW50KG1fcmVzb3Vy
Y2VUeXBlKSkKKyAgICAgICAgYXBwZW5kRGF0YShidWZmZXIpOworICAgIGVsc2UgeworICAgICAg
ICBzZW5kU2F2ZWRIZWFkZXJzKCk7CisgICAgICAgIEZpbHRlclN0cmVhbTo6bm90aWZ5RGF0YVJl
Y2VpdmVkKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIFJTU0ZpbHRlclN0cmVhbTo6bm90aWZ5
Q2xvc2UoaW50IHN0YXR1cykKK3sKKyAgICBpZiAoaXNSU1NDb250ZW50KG1fcmVzb3VyY2VUeXBl
KSkKKyAgICAgICAgaGFuZGxlUlNTQ29udGVudCgpOworICAgIGVsc2UKKyAgICAgICAgRmlsdGVy
U3RyZWFtOjpub3RpZnlDbG9zZShzdGF0dXMpOworfQorCitib29sIFJTU0ZpbHRlclN0cmVhbTo6
Y29udmVydENvbnRlbnRUb0h0bWwoc3RkOjpzdHJpbmcmIHJlc3VsdCkKK3sKKyAgICBib29sIHN1
Y2Nlc3MgPSBmYWxzZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZSA9IHVybCgpOworICAg
IGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmMgPSBlbmNvZGluZygpOworCisgICAgT3duUHRyPFJTU1Bh
cnNlckJhc2U+IHBhcnNlciA9IGNyZWF0ZVBhcnNlcihtX3Jlc291cmNlVHlwZSk7CisKKyAgICBp
ZiAoaXNUcmFuc2NvZGluZ05lZWRlZChlbmMpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRyYW5z
Y29kZWRDb250ZW50OworICAgICAgICBpZiAodHJhbnNjb2RlQ29udGVudChtX2NvbnRlbnQsIGVu
YywgdHJhbnNjb2RlZENvbnRlbnQpKQorICAgICAgICAgICAgc3VjY2VzcyA9IHBhcnNlci0+cGFy
c2VCdWZmZXIodHJhbnNjb2RlZENvbnRlbnQuZGF0YSgpLCB0cmFuc2NvZGVkQ29udGVudC5sZW5n
dGgoKSwgYmFzZS5jX3N0cigpLCBzX3V0ZjhFbmNvZGluZ05hbWUpOworICAgIH0gZWxzZQorICAg
ICAgICBzdWNjZXNzID0gcGFyc2VyLT5wYXJzZUJ1ZmZlcihtX2NvbnRlbnQuZGF0YSgpLCBtX2Nv
bnRlbnQubGVuZ3RoKCksIGJhc2UuY19zdHIoKSwgc191dGY4RW5jb2RpbmdOYW1lKTsKKworICAg
IGlmICghc3VjY2VzcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgT3duUHRyPFJTU0dl
bmVyYXRvcj4gZ2VuZXJhdG9yID0gYWRvcHRQdHIobmV3IFJTU0dlbmVyYXRvcigpKTsKKyAgICBT
dHJpbmcgaHRtbCA9IGdlbmVyYXRvci0+Z2VuZXJhdGVIdG1sKHBhcnNlci0+bV9yb290KTsKKyAg
ICByZXN1bHQgPSBodG1sLnV0ZjgodHJ1ZSkuZGF0YSgpOworCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpoYW5kbGVSU1NDb250ZW50KCkKK3sKKyAgICBCTEFD
S0JFUlJZX0FTU0VSVChpc1JTU0NvbnRlbnQobV9yZXNvdXJjZVR5cGUpKTsKKworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrQnVmZmVyKiBidWZmZXI7CisgICAgc3RkOjpzdHJpbmcg
aHRtbDsKKyAgICBpZiAoIWNvbnZlcnRDb250ZW50VG9IdG1sKGh0bWwpKQorICAgICAgICBidWZm
ZXIgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTmV0d29ya0J1ZmZlcldpdGhEYXRhKG1f
Y29udGVudC5jX3N0cigpLCBtX2NvbnRlbnQuc2l6ZSgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAg
dXBkYXRlUlNTSGVhZGVycyhodG1sLnNpemUoKSk7CisgICAgICAgIGJ1ZmZlciA9IEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpjcmVhdGVOZXR3b3JrQnVmZmVyV2l0aERhdGEoaHRtbC5jX3N0cigpLCBo
dG1sLnNpemUoKSk7CisgICAgfQorCisgICAgc2VuZFNhdmVkSGVhZGVycygpOworICAgIEZpbHRl
clN0cmVhbTo6bm90aWZ5RGF0YVJlY2VpdmVkKGJ1ZmZlcik7CisgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OnJlbGVhc2VOZXR3b3JrQnVmZmVyKGJ1ZmZlcik7CisgICAgRmlsdGVyU3RyZWFtOjpu
b3RpZnlDbG9zZShGaWx0ZXJTdHJlYW06OlN0YXR1c1N1Y2Nlc3MpOworfQorCitjb25zdCBzdGQ6
OnN0cmluZyYgUlNTRmlsdGVyU3RyZWFtOjpjaGFyc2V0KCkKK3sKKyAgICBCTEFDS0JFUlJZX0FT
U0VSVChtX2NvbnRlbnRUeXBlSW5kZXggPj0gMCk7CisKKyAgICBpZiAobV9jaGFyc2V0Q2hlY2tl
ZCkKKyAgICAgICAgcmV0dXJuIG1fY2hhcnNldDsKKworICAgIG1fY2hhcnNldENoZWNrZWQgPSB0
cnVlOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNoYXJzZXRQcmVmaXggPSAiY2hhcnNldD0i
OworICAgIHN0YXRpYyBjb25zdCBpbnQgY2hhcnNldFByZWZpeExlbiA9IHN0cmxlbihjaGFyc2V0
UHJlZml4KTsKKyAgICBzaXplX3QgcG9zID0gKG1faGVhZGVycy5hdChtX2NvbnRlbnRUeXBlSW5k
ZXgpLnNlY29uZCkuZmluZChjaGFyc2V0UHJlZml4KTsKKyAgICBpZiAocG9zICE9IHN0ZDo6c3Ry
aW5nOjpucG9zKSB7CisgICAgICAgIG1fY2hhcnNldCA9IG1faGVhZGVycy5hdChtX2NvbnRlbnRU
eXBlSW5kZXgpLnNlY29uZC5zdWJzdHIocG9zICsgY2hhcnNldFByZWZpeExlbik7CisgICAgICAg
IHN0cmlwV2hpdGVTcGFjZShtX2NoYXJzZXQpOworICAgIH0KKworICAgIHJldHVybiBtX2NoYXJz
ZXQ7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBSU1NGaWx0ZXJTdHJlYW06OmVuY29kaW5nKCkK
K3sKKyAgICBpZiAobV9lbmNvZGluZ0NoZWNrZWQpCisgICAgICAgIHJldHVybiBtX2VuY29kaW5n
OworCisgICAgbV9lbmNvZGluZ0NoZWNrZWQgPSB0cnVlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5n
JiBzdHIgPSBjaGFyc2V0KCk7CisKKyAgICBpZiAoIXN0ci5lbXB0eSgpKSB7CisgICAgICAgIG1f
ZW5jb2RpbmcgPSBzdHI7CisgICAgICAgIHJldHVybiBtX2VuY29kaW5nOworICAgIH0KKworICAg
IGNvbnN0IGNoYXIqIHN0YXJ0ID0gbV9jb250ZW50LmNfc3RyKCk7CisgICAgY29uc3QgY2hhciog
ZW5jb2RpbmdTdGFydCA9IDA7CisgICAgY29uc3QgY2hhciogZW5jb2RpbmdFbmQgPSAwOworICAg
IGlmIChmaW5kWE1MRW5jb2RpbmdQb3NpdGlvbihzdGFydCwgZW5jb2RpbmdTdGFydCwgZW5jb2Rp
bmdFbmQpKSB7CisgICAgICAgIG1fZW5jb2RpbmcgPSBzdGQ6OnN0cmluZyhlbmNvZGluZ1N0YXJ0
LCBlbmNvZGluZ0VuZCAtIGVuY29kaW5nU3RhcnQpOworICAgICAgICByZXR1cm4gbV9lbmNvZGlu
ZzsKKyAgICB9CisKKyAgICBpZiAoZmluZFhNTExhbmd1YWdlUG9zaXRpb24oc3RhcnQsIGVuY29k
aW5nU3RhcnQsIGVuY29kaW5nRW5kKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBsYW5ndWFnZVN0
cmluZyhlbmNvZGluZ1N0YXJ0LCBlbmNvZGluZ0VuZCAtIGVuY29kaW5nU3RhcnQpOworICAgICAg
ICBjb25zdCBjaGFyKiBkZWZhdWx0RW5jb2RpbmcgPSBkZWZhdWx0RW5jb2RpbmdGb3JMYW5ndWFn
ZShsYW5ndWFnZVN0cmluZy5jX3N0cigpKTsKKyAgICAgICAgaWYgKGRlZmF1bHRFbmNvZGluZykg
eworICAgICAgICAgICAgbV9lbmNvZGluZyA9IGRlZmF1bHRFbmNvZGluZzsKKyAgICAgICAgICAg
IHJldHVybiBtX2VuY29kaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1fZW5j
b2Rpbmc7Cit9CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpzYXZlSGVhZGVycyhjb25zdCBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkhlYWRlckxpc3QmIGhlYWRlcnMpCit7
CisgICAgbV9oZWFkZXJzID0gaGVhZGVyczsKK30KKwordm9pZCBSU1NGaWx0ZXJTdHJlYW06OnJl
bW92ZUhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5KQoreworICAgIE5ldHdvcmtSZXF1ZXN0
OjpIZWFkZXJMaXN0OjppdGVyYXRvciBlbmQgPSBtX2hlYWRlcnMuZW5kKCk7CisgICAgZm9yIChO
ZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdDo6aXRlcmF0b3IgaXRlciA9IG1faGVhZGVycy5iZWdp
bigpOyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgIGlmICghc3RyY2FzZWNtcChpdGVy
LT5maXJzdC5jX3N0cigpLCBrZXkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIG1faGVhZGVycy5l
cmFzZShpdGVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwor
dm9pZCBSU1NGaWx0ZXJTdHJlYW06OnVwZGF0ZUhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5
LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpCit7CisgICAgTmV0d29ya1JlcXVlc3Q6OkhlYWRl
ckxpc3Q6Oml0ZXJhdG9yIGl0ZXIgPSBtX2hlYWRlcnMuYmVnaW4oKTsKKyAgICBOZXR3b3JrUmVx
dWVzdDo6SGVhZGVyTGlzdDo6aXRlcmF0b3IgZW5kID0gbV9oZWFkZXJzLmVuZCgpOworICAgIGZv
ciAoOyBpdGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgIGlmICghc3RyY2FzZWNtcChpdGVy
LT5maXJzdC5jX3N0cigpLCBrZXkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIGl0ZXItPnNlY29u
ZCA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAg
bV9oZWFkZXJzLmluc2VydChpdGVyLCBzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlKSk7Cit9CisK
K3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjp1cGRhdGVSU1NIZWFkZXJzKHNpemVfdCBzaXplKQorewor
ICAgIHJlbW92ZUhlYWRlcihzX2NvbnRlbnRFbmNvZGluZ0hlYWRlcktleSk7CisgICAgdXBkYXRl
SGVhZGVyKHNfY29udGVudFR5cGVIZWFkZXJLZXksICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgi
KTsKKworICAgIGNoYXIgYnVmZmVyWzE2XTsKKyAgICBzbnByaW50ZihidWZmZXIsIDE2LCAiJWQi
LCBzaXplKTsKKyAgICB1cGRhdGVIZWFkZXIoc19jb250ZW50TGVuZ3RoSGVhZGVyS2V5LCBzdGQ6
OnN0cmluZyhidWZmZXIsIDE2KSk7Cit9CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpzZW5kU2F2
ZWRIZWFkZXJzKCkKK3sKKyAgICBpZiAoIW1faGVhZGVycy5lbXB0eSgpKSB7CisgICAgICAgIEZp
bHRlclN0cmVhbTo6bm90aWZ5SGVhZGVyc1JlY2VpdmVkKG1faGVhZGVycyk7CisgICAgICAgIC8v
IG1ha2Ugc3VyZSB0aGUgaGVhZGVycyBhcmUgbmV2ZXIgc2VudCB0d2ljZQorICAgICAgICBtX2Nv
bnRlbnRUeXBlSW5kZXggPSAtMTsKKyAgICAgICAgbV9oZWFkZXJzLmNsZWFyKCk7CisgICAgfQor
fQorCit2b2lkIFJTU0ZpbHRlclN0cmVhbTo6YXBwZW5kRGF0YShCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6TmV0d29ya0J1ZmZlciogYnVmZmVyKQoreworICAgIG1fY29udGVudC5hcHBlbmQobmV0d29y
a0J1ZmZlckRhdGEoYnVmZmVyKSwgbmV0d29ya0J1ZmZlckRhdGFMZW5ndGgoYnVmZmVyKSk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTRmlsdGVyU3RyZWFtLmggYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVhbS5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2QxZjYKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JT
U0ZpbHRlclN0cmVhbS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwg
Qm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBSU1NGaWx0ZXJTdHJl
YW1faAorI2RlZmluZSBSU1NGaWx0ZXJTdHJlYW1faAorCisjaW5jbHVkZSA8bmV0d29yay9GaWx0
ZXJTdHJlYW0uaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL3RleHQv
V1RGU3RyaW5nLmg+CisKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSU1NGaWx0ZXJT
dHJlYW0gOiBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZpbHRlclN0cmVhbSB7CitwdWJs
aWM6CisgICAgZW51bSBSZXNvdXJjZVR5cGUgeworICAgICAgICBUWVBFX1VOS05PV04gPSAwLAor
ICAgICAgICBUWVBFX05PVF9SU1MsCisgICAgICAgIFRZUEVfUlNTMTBfQ09OVEVOVCwKKyAgICAg
ICAgVFlQRV9SU1MyMF9DT05URU5ULAorICAgICAgICBUWVBFX0FUT01fQ09OVEVOVAorICAgIH07
CisKKyAgICBSU1NGaWx0ZXJTdHJlYW0oKTsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTdGF0
dXNSZWNlaXZlZChpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtZXNzYWdlKTsKKyAgICB2aXJ0dWFs
IHZvaWQgbm90aWZ5SGVhZGVyc1JlY2VpdmVkKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3Jr
UmVxdWVzdDo6SGVhZGVyTGlzdCYpOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlEYXRhUmVjZWl2
ZWQoQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtCdWZmZXIqKTsKKyAgICB2aXJ0dWFsIHZv
aWQgbm90aWZ5Q2xvc2UoaW50IHN0YXR1cyk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBjb252ZXJ0
Q29udGVudFRvSHRtbChzdGQ6OnN0cmluZyYgcmVzdWx0KTsKKyAgICB2b2lkIGhhbmRsZVJTU0Nv
bnRlbnQoKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGFyc2V0KCk7CisgICAgY29uc3Qg
c3RkOjpzdHJpbmcmIGVuY29kaW5nKCk7CisKKyAgICB2b2lkIHNhdmVIZWFkZXJzKGNvbnN0IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdCYpOworICAgIHZv
aWQgcmVtb3ZlSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOworICAgIHZvaWQgdXBkYXRl
SGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7
CisgICAgdm9pZCB1cGRhdGVSU1NIZWFkZXJzKHNpemVfdCk7CisgICAgdm9pZCBzZW5kU2F2ZWRI
ZWFkZXJzKCk7CisKKyAgICB2b2lkIGFwcGVuZERhdGEoQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5l
dHdvcmtCdWZmZXIqKTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVz
dDo6SGVhZGVyTGlzdCBtX2hlYWRlcnM7CisgICAgc3RkOjpzdHJpbmcgbV9jb250ZW50OworICAg
IHN0ZDo6c3RyaW5nIG1fY2hhcnNldDsKKyAgICBzdGQ6OnN0cmluZyBtX2VuY29kaW5nOworCisg
ICAgUmVzb3VyY2VUeXBlIG1fcmVzb3VyY2VUeXBlOworICAgIGludCBtX2NvbnRlbnRUeXBlSW5k
ZXg7CisKKyAgICBib29sIG1fY2hhcnNldENoZWNrZWQ7CisgICAgYm9vbCBtX2VuY29kaW5nQ2hl
Y2tlZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJTU0ZpbHRl
clN0cmVhbV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2Js
YWNrYmVycnkvcnNzL1JTU0dlbmVyYXRvci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0dlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uNmYxZjg0MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmNwcApAQCAt
MCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwgMjAx
MiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0x
MzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUlNTR2VuZXJh
dG9yLmgiCisKKyNpbmNsdWRlICJMb2NhbGl6ZVJlc291cmNlLmgiCisjaW5jbHVkZSAiUlNTUGFy
c2VyQmFzZS5oIgorCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBzX2RlZmF1bHRGZWVkVGl0bGUgPSBpMThu
KCJVbnRpdGxlZCBGZWVkIik7CitzdGF0aWMgY29uc3QgY2hhciogc19kZWZhdWx0RW50cnlUaXRs
ZSA9IGkxOG4oIlVudGl0bGVkIEVudHJ5Iik7CisKK1JTU0dlbmVyYXRvcjo6UlNTR2VuZXJhdG9y
KCkKK3sKK30KKworUlNTR2VuZXJhdG9yOjp+UlNTR2VuZXJhdG9yKCkKK3sKK30KKworU3RyaW5n
IFJTU0dlbmVyYXRvcjo6Z2VuZXJhdGVIdG1sKFJTU0ZlZWQqIGZlZWQpCit7CisgICAgU3RyaW5n
IHJjOworICAgIHJjICs9ICI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1U
eXBlXCIgY29udGVudD1cInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04XCIgLz4iOworICAgIHJjICs9
ICI8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwiaW5pdGlhbC1zY2FsZT0xLjAsIHVz
ZXItc2NhbGFibGU9IG5vXCI+IjsKKyAgICByYyArPSAiPHRpdGxlPiI7CisKKyAgICBpZiAoIWZl
ZWQtPm1fdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICByYyArPSBmZWVkLT5tX3RpdGxlOworICAg
IGVsc2UgaWYgKCFmZWVkLT5tX2xpbmsuaXNFbXB0eSgpKQorICAgICAgICByYyArPSBmZWVkLT5t
X2xpbms7CisgICAgZWxzZQorICAgICAgICByYyArPSBzX2RlZmF1bHRGZWVkVGl0bGU7CisKKyAg
ICByYyArPSAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IjsKKworICAgIHJjICs9ICI8aDI+IjsKKyAg
ICBpZiAoIWZlZWQtPm1fbGluay5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmMgKz0gIjxhIGhyZWY9
XCIiOworICAgICAgICByYyArPSBmZWVkLT5tX2xpbms7CisgICAgICAgIHJjICs9ICJcIj4iOwor
ICAgIH0KKyAgICBpZiAoIWZlZWQtPm1fdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICByYyArPSBm
ZWVkLT5tX3RpdGxlOworICAgIGVsc2UKKyAgICAgICAgcmMgKz0gc19kZWZhdWx0RmVlZFRpdGxl
OworCisgICAgaWYgKCFmZWVkLT5tX2xpbmsuaXNFbXB0eSgpKQorICAgICAgICByYyArPSAiPC9h
PiI7CisKKyAgICByYyArPSAiPC9oMj4iOworCisgICAgaWYgKCFmZWVkLT5tX2Rlc2NyaXB0aW9u
LmlzRW1wdHkoKSkgeworICAgICAgICByYyArPSAiPHA+IjsKKyAgICAgICAgcmMgKz0gZmVlZC0+
bV9kZXNjcmlwdGlvbjsKKyAgICAgICAgcmMgKz0gIjwvcD4iOworICAgIH0KKworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBmZWVkLT5tX2l0ZW1zLnNpemUoKTsgKytpKSB7CisgICAgICAg
IFJTU0l0ZW0qIGl0ZW0gPSBmZWVkLT5tX2l0ZW1zW2ldOworICAgICAgICBTdHJpbmcgYXJ0aWNs
ZU5hbWU7CisgICAgICAgIHJjICs9ICI8ZGl2IGlkPVwiIjsKKyAgICAgICAgcmMgKz0gYXJ0aWNs
ZU5hbWU7CisgICAgICAgIHJjICs9ICJcIiBjbGFzcz1cImFydGljbGVcIj5cbjxhIGhyZWY9XCIi
OworICAgICAgICBpZiAoIWl0ZW0tPm1fbGluay5pc0VtcHR5KCkpCisgICAgICAgICAgICByYyAr
PSAgaXRlbS0+bV9saW5rLnV0ZjgodHJ1ZSkuZGF0YSgpOworICAgICAgICByYyArPSAiXCI+PGI+
IjsKKyAgICAgICAgaWYgKCFpdGVtLT5tX3RpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJj
ICs9ICBpdGVtLT5tX3RpdGxlLnV0ZjgodHJ1ZSkuZGF0YSgpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICByYyArPSBzX2RlZmF1bHRFbnRyeVRpdGxlOworICAgICAgICByYyArPSAiPC9iPjwv
YT5cbjxiciAvPiI7CisKKyAgICAgICAgaWYgKCFpdGVtLT5tX2F1dGhvci5pc0VtcHR5KCkpIHsK
KyAgICAgICAgICAgIHJjICs9IGkxOG4oIkJ5Iik7CisgICAgICAgICAgICByYyArPSAiIDxiPiI7
CisgICAgICAgICAgICByYyArPSBpdGVtLT5tX2F1dGhvci51dGY4KHRydWUpLmRhdGEoKTsKKyAg
ICAgICAgICAgIHJjICs9ICI8L2I+ICI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBp
ZiAoIWZlZWQtPm1fYXV0aG9yLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJjICs9IGkx
OG4oIkJ5Iik7CisgICAgICAgICAgICAgICAgcmMgKz0gIiA8Yj4iOworICAgICAgICAgICAgICAg
IHJjICs9IGZlZWQtPm1fYXV0aG9yLnV0ZjgodHJ1ZSkuZGF0YSgpOworICAgICAgICAgICAgICAg
IHJjICs9ICI8L2I+ICI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAo
IWl0ZW0tPm1fY2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmICghaXRlbS0+
bV9hdXRob3IuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJjICs9IGkxOG4oInVuZGVyICIp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJjICs9IGkxOG4oIlVuZGVyICIp
OworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaXRlbS0+bV9jYXRlZ29y
aWVzLnNpemUoKSA7ICsraSkgeworICAgICAgICAgICAgICAgIHJjICs9ICI8Yj4iOworICAgICAg
ICAgICAgICAgIHJjICs9IGl0ZW0tPm1fY2F0ZWdvcmllc1tpXS51dGY4KHRydWUpLmRhdGEoKTsK
KyAgICAgICAgICAgICAgICByYyArPSAiPC9iPiI7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA8
IGl0ZW0tPm1fY2F0ZWdvcmllcy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICByYyAr
PSAiLCAiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmMgKz0gIjxiciAv
PiI7CisgICAgICAgIGlmICghaXRlbS0+bV9wdWJEYXRlLmlzRW1wdHkoKSkKKyAgICAgICAgICAg
IHJjICs9IGl0ZW0tPm1fcHViRGF0ZS51dGY4KHRydWUpLmRhdGEoKTsKKworICAgICAgICByYyAr
PSAiPGJyIC8+IjsKKyAgICAgICAgaWYgKCFpdGVtLT5tX2Rlc2NyaXB0aW9uLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIHJjICs9IGl0ZW0tPm1fZGVzY3JpcHRpb24udXRmOCh0cnVlKS5kYXRhKCk7
CisgICAgICAgIHJjICs9ICI8YnIgLz4iOworCisgICAgICAgIGlmIChpdGVtLT5tX2VuY2xvc3Vy
ZSkgeworICAgICAgICAgICAgcmMgKz0gIjxiciAvPiI7CisgICAgICAgICAgICByYyArPSAiPGEg
aHJlZj1cIiI7CisgICAgICAgICAgICByYyArPSBpdGVtLT5tX2VuY2xvc3VyZS0+bV91cmw7Cisg
ICAgICAgICAgICByYyArPSAiXCI+IjsKKyAgICAgICAgICAgIHJjICs9IGkxOG4oIkVtYmVkZGVk
ICIpOworCisgICAgICAgICAgICBSU1NFbmNsb3N1cmU6OlR5cGUgdHlwZSA9IGl0ZW0tPm1fZW5j
bG9zdXJlLT50eXBlSW5FbnVtKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAg
ICAgICAgIGNhc2UgUlNTRW5jbG9zdXJlOjpUeXBlSW1hZ2U6CisgICAgICAgICAgICAgICAgcmMg
Kz0gaTE4bigiSW1hZ2UiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNh
c2UgUlNTRW5jbG9zdXJlOjpUeXBlQXVkaW86CisgICAgICAgICAgICAgICAgcmMgKz0gaTE4bigi
QXVkaW8iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNTRW5j
bG9zdXJlOjpUeXBlVmlkZW86CisgICAgICAgICAgICAgICAgcmMgKz0gaTE4bigiVmlkZW8iKTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNTRW5jbG9zdXJlOjpU
eXBlQXBwbGljYXRpb246CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJj
ICs9IGkxOG4oIlVua25vd24gQ29udGVudCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByYyArPSBpMThuKCIgU291cmNlOiAiKTsKKyAgICAg
ICAgICAgIHJjICs9IGl0ZW0tPm1fZW5jbG9zdXJlLT5zdWdnZXN0ZWROYW1lKCk7CisgICAgICAg
ICAgICByYyArPSAiPC9hPjxiciAvPjxiciAvPiI7CisgICAgICAgIH0KKworICAgICAgICByYyAr
PSAiPGJyIC8+PC9kaXY+XG4iOworICAgIH0KKworICAgIHJjICs9ICI8L2JvZHk+PC9odG1sPlxu
IjsKKworICAgIHJldHVybiByYzsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NH
ZW5lcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9y
c3MvUlNTR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4
NjI1YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGlt
aXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2Vy
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRo
ZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVm
IFJTU0dlbmVyYXRvcl9oCisjZGVmaW5lIFJTU0dlbmVyYXRvcl9oCisKKyNpbmNsdWRlIDx3dGYv
dGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSU1NGZWVk
OworCitjbGFzcyBSU1NHZW5lcmF0b3IgeworcHVibGljOgorICAgIFJTU0dlbmVyYXRvcigpOwor
ICAgIH5SU1NHZW5lcmF0b3IoKTsKKworICAgIFN0cmluZyBnZW5lcmF0ZUh0bWwoUlNTRmVlZCop
OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUlNTR2VuZXJhdG9y
X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJy
eS9yc3MvUlNTUGFyc2VyQmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLmUwYTlkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuY3BwCkBAIC0wLDAg
KzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEg
IFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSU1NQYXJzZXJCYXNl
LmgiCisKKyNpbmNsdWRlICJsaWJ4bWwvcGFyc2VyLmgiCisjaW5jbHVkZSAibGlieG1sL3htbHdy
aXRlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JTU0VuY2xvc3VyZTo6UlNTRW5jbG9z
dXJlKCkKKyAgICA6IG1fdHlwZUluRW51bShUeXBlVW5rbm93bikKK3sgfQorCitSU1NFbmNsb3N1
cmU6OlR5cGUgUlNTRW5jbG9zdXJlOjp0eXBlSW5FbnVtKCkKK3sKKyAgICBpZiAoVHlwZVVua25v
d24gIT0gbV90eXBlSW5FbnVtKQorICAgICAgICByZXR1cm4gbV90eXBlSW5FbnVtOworCisgICAg
c2l6ZV90IGRpdiA9IG1fdHlwZS5maW5kKCcvJyk7CisgICAgaWYgKFdURjo6bm90Rm91bmQgPT0g
ZGl2IHx8ICFkaXYpIHsKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVVuc3VwcG9ydGVkOwor
ICAgICAgICByZXR1cm4gbV90eXBlSW5FbnVtOworICAgIH0KKworICAgIFN0cmluZyBiYXNlID0g
bV90eXBlLnN1YnN0cmluZygwLCBkaXYpLmxvd2VyKCk7CisgICAgaWYgKGJhc2UgPT0gImltYWdl
IikKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUltYWdlOworICAgIGVsc2UgaWYgKGJhc2Ug
PT0gImF1ZGlvIikKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUF1ZGlvOworICAgIGVsc2Ug
aWYgKGJhc2UgPT0gInZpZGVvIikKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVZpZGVvOwor
ICAgIGVsc2UgaWYgKGJhc2UgPT0gImFwcGxpY2F0aW9uIikKKyAgICAgICAgbV90eXBlSW5FbnVt
ID0gVHlwZUFwcGxpY2F0aW9uOworICAgIGVsc2UKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlw
ZVVuc3VwcG9ydGVkOworCisgICAgcmV0dXJuIG1fdHlwZUluRW51bTsKK30KKworU3RyaW5nIFJT
U0VuY2xvc3VyZTo6c3VnZ2VzdGVkTmFtZSgpIGNvbnN0Cit7CisgICAgc2l6ZV90IHN0YXJ0ID0g
bV91cmwucmV2ZXJzZUZpbmQoJy8nKTsKKyAgICBpZiAoV1RGOjpub3RGb3VuZCA9PSBzdGFydCkK
KyAgICAgICAgc3RhcnQgPSAwOworICAgIGVsc2UKKyAgICAgICAgKytzdGFydDsKKworICAgIHJl
dHVybiBtX3VybC5zdWJzdHJpbmcoc3RhcnQpOworfQorCitSU1NGZWVkOjpSU1NGZWVkKCkKK3sK
K30KKworUlNTRmVlZDo6flJTU0ZlZWQoKQoreworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgUlNT
RmVlZDo6Y2xlYXIoKQoreworICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2l0ZW1zKTsKKyAgICBtX2l0
ZW1zLmNsZWFyKCk7Cit9CisKK1JTU0l0ZW06OlJTU0l0ZW0oKQorICAgIDogbV9lbmNsb3N1cmUo
MCkKK3sKK30KKworUlNTSXRlbTo6flJTU0l0ZW0oKQoreworICAgIGNsZWFyKCk7Cit9CisKK3Zv
aWQgUlNTSXRlbTo6Y2xlYXIoKQoreworICAgIGRlbGV0ZSBtX2VuY2xvc3VyZTsKK30KKworUlNT
UGFyc2VyQmFzZTo6UlNTUGFyc2VyQmFzZSgpCisgICAgOiBtX3Jvb3QoMCkKK3sKK30KKworUlNT
UGFyc2VyQmFzZTo6flJTU1BhcnNlckJhc2UoKQoreworICAgIGRlbGV0ZSBtX3Jvb3Q7Cit9CisK
K1N0cmluZyB0ZXh0RnJvbVhNTEF0dHIoeG1sQXR0ciogYXR0cikKK3sKKyAgICBpZiAoIWF0dHIp
CisgICAgICAgIHJldHVybiBlbXB0eVN0cmluZygpOworCisgICAgU3RyaW5nIHRleHQ7CisKKyAg
ICBmb3IgKHhtbE5vZGUqIG5vZGUgPSBhdHRyLT5jaGlsZHJlbjsgbm9kZTsgbm9kZSA9IG5vZGUt
Pm5leHQpIHsKKyAgICAgICAgaWYgKG5vZGUtPnR5cGUgPT0gWE1MX1RFWFRfTk9ERSkKKyAgICAg
ICAgICAgIHRleHQgKz0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obm9kZS0+Y29udGVu
dCk7CisgICAgfQorCisgICAgcmV0dXJuIHRleHQuc3RyaXBXaGl0ZVNwYWNlKCk7Cit9CisKK1N0
cmluZyB0ZXh0RnJvbVhNTE5vZGUoeG1sTm9kZSogbm9kZSkKK3sKKyAgICBpZiAoIW5vZGUpCisg
ICAgICAgIHJldHVybiBlbXB0eVN0cmluZygpOworCisgICAgU3RyaW5nIHRleHQ7CisKKyAgICBm
b3IgKG5vZGUgPSBub2RlLT5jaGlsZHJlbjsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAg
ICAgICAgaWYgKChub2RlLT50eXBlID09IFhNTF9URVhUX05PREUpIHx8IChub2RlLT50eXBlID09
IFhNTF9DREFUQV9TRUNUSU9OX05PREUpKQorICAgICAgICAgICAgdGV4dCArPSByZWludGVycHJl
dF9jYXN0PGNvbnN0IGNoYXIqPihub2RlLT5jb250ZW50KTsKKyAgICB9CisKKyAgICByZXR1cm4g
dGV4dC5zdHJpcFdoaXRlU3BhY2UoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9S
U1NQYXJzZXJCYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVy
cnkvcnNzL1JTU1BhcnNlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li5mY2I1YWRjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NQYXJzZXJCYXNlLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90
aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKwor
CisjaWZuZGVmIFJTU1BhcnNlckJhc2VfaAorI2RlZmluZSBSU1NQYXJzZXJCYXNlX2gKKworI2lu
Y2x1ZGUgPGxpYnhtbC90cmVlLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFJT
U0l0ZW07CisKK2NsYXNzIFJTU0VuY2xvc3VyZSB7CitwdWJsaWM6CisgICAgZW51bSBUeXBlIHsK
KyAgICAgICAgVHlwZVVua25vd24sCisgICAgICAgIFR5cGVJbWFnZSwKKyAgICAgICAgVHlwZUF1
ZGlvLAorICAgICAgICBUeXBlVmlkZW8sCisgICAgICAgIFR5cGVBcHBsaWNhdGlvbiwKKyAgICAg
ICAgVHlwZVVuc3VwcG9ydGVkCisgICAgfTsKKworICAgIFJTU0VuY2xvc3VyZSgpOworCisgICAg
VHlwZSB0eXBlSW5FbnVtKCk7CisgICAgU3RyaW5nIHN1Z2dlc3RlZE5hbWUoKSBjb25zdDsKKwor
ICAgIFN0cmluZyBtX3VybDsKKyAgICBTdHJpbmcgbV90eXBlOworICAgIFN0cmluZyBtX2xlbmd0
aDsKKworcHJpdmF0ZToKKyAgICBUeXBlIG1fdHlwZUluRW51bTsKK307CisKK2NsYXNzIFJTU0l0
ZW1CYXNlIHsKK3B1YmxpYzoKKyAgICBTdHJpbmcgbV90aXRsZTsKKyAgICBTdHJpbmcgbV9saW5r
OworICAgIFN0cmluZyBtX2Rlc2NyaXB0aW9uOworICAgIFN0cmluZyBtX3VwZGF0ZWQ7CisgICAg
U3RyaW5nIG1fYXV0aG9yOworICAgIFN0cmluZyBtX3B1YkRhdGU7CisgICAgU3RyaW5nIG1faWQ7
Cit9OworCitjbGFzcyBSU1NGZWVkOiBwdWJsaWMgUlNTSXRlbUJhc2UgeworcHVibGljOgorICAg
IFJTU0ZlZWQoKTsKKyAgICB+UlNTRmVlZCgpOworCisgICAgdm9pZCBjbGVhcigpOworCisgICAg
U3RyaW5nIG1fbGFuZ3VhZ2U7CisgICAgU3RyaW5nIG1fdHRsOworCisgICAgVmVjdG9yPFJTU0l0
ZW0qPiBtX2l0ZW1zOworfTsKKworY2xhc3MgUlNTSXRlbTogcHVibGljIFJTU0l0ZW1CYXNlIHsK
K3B1YmxpYzoKKyAgICBSU1NJdGVtKCk7CisgICAgflJTU0l0ZW0oKTsKKworICAgIHZvaWQgY2xl
YXIoKTsKKworICAgIFN0cmluZyBtX2NvbW1lbnRzOworICAgIFZlY3RvcjxTdHJpbmc+IG1fY2F0
ZWdvcmllczsKKyAgICBSU1NFbmNsb3N1cmUqIG1fZW5jbG9zdXJlOworfTsKKworY2xhc3MgUlNT
UGFyc2VyQmFzZSB7CitwdWJsaWM6CisgICAgUlNTUGFyc2VyQmFzZSgpOworICAgIHZpcnR1YWwg
flJTU1BhcnNlckJhc2UoKTsKKworICAgIHZpcnR1YWwgYm9vbCBwYXJzZUJ1ZmZlcihjb25zdCBj
aGFyKiBidWZmZXIsIGludCBsZW5ndGgsIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogZW5j
b2RpbmcpID0gMDsKKworICAgIFJTU0ZlZWQqIG1fcm9vdDsKK307CisKK1N0cmluZyB0ZXh0RnJv
bVhNTEF0dHIoeG1sQXR0ciopOworU3RyaW5nIHRleHRGcm9tWE1MTm9kZSh4bWxOb2RlKik7CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJTU1BhcnNlckJhc2VfaAo=
</data>
<flag name="review"
          id="169958"
          type_id="1"
          status="-"
          setter="rwlbuis"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>159723</attachid>
            <date>2012-08-21 10:50:23 -0700</date>
            <delta_ts>2012-08-22 08:12:14 -0700</delta_ts>
            <desc>Update patch based on rwlbuis&apos; comments.</desc>
            <filename>93496-2.patch</filename>
            <type>text/plain</type>
            <size>72353</size>
            <attacher name="Lyon Chen">liachen</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA2ZWIxMDY2Li43MDQyODZmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTM3
IEBACisyMDEyLTA4LTIxICBMaWFuZ2h1aSBDaGVuICA8bGlhY2hlbkByaW0uY29tPgorCisgICAg
ICAgIFtCbGFja0JlcnJ5XSBBZGQgUlNTIGNvbnRlbnQgaGFuZGxpbmcgc3VwcG9ydAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTM0OTYKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgY29kZSB0byBmaWx0
ZXIgUlNTIGNvbnRlbnQsIGFuZCBwcm9wZXJseSBjb252ZXJ0IHRoZW0gdG8gSFRNTAorICAgICAg
ICBjb250ZW50IHNvIHRoZXkgY2FuIGRpc3BsYXkgbmljZWx5LCBpbnN0ZWFkIG9mIGFzIHBsYWlu
IHRleHQuCisKKyAgICAgICAgRm9sbG93aW5nIG1vZHVsZXMgYXJlIGluY2x1ZGVkOgorCisgICAg
ICAgIFJTU0ZpbHRlclN0cmVhbTogdGhlIGNvZGUgZm9yIGRldGVjdGluZyBSU1MgY29udGVudCwg
YW5kIGNvbnRyb2xsaW5nCisgICAgICAgIHRoZSBoYW5kbGluZyBvZiB0aGVzZSBjb250ZW50Lgor
CisgICAgICAgIFJTU1BhcnNlckJhc2U6IHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgZm9sbG93aW5n
IDMgUlNTIHBhcnNlci4KKyAgICAgICAgUlNTMTBQYXJzZXI6IHRoZSBjb2RlIGZvciBkZWNvZGlu
ZyBSU1MgMS4wIGNvbnRlbnQuCisgICAgICAgIFJTUzIwUGFyc2VyOiB0aGUgY29kZSBmb3IgZGVj
b2RpbmcgUlNTIDIuMCBjb250ZW50LgorICAgICAgICBSU1NBdG9tUGFyc2VyOiB0aGUgY29kZSBm
b3IgZGVjb2RpbmcgQXRvbSBmb3JtYXQgUlNTIGNvbnRlbnQuCisgICAgICAgIFJTU0dlbmVyYXRv
cjogdGhlIGNvZGUgZm9yIGdlbmVyYXRpbmcgSFRNTCBjb250ZW50IGJhc2VkIG9uIFJTUyBmZWVk
LgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBhcyBpdCdzIG5vdCBjaGFuZ2luZyBob3cgSFRNTCBj
b250ZW50IGlzIGhhbmRsZWQuCisKKyAgICAgICAgKiBQbGF0Zm9ybUJsYWNrQmVycnkuY21ha2U6
CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6TmV0d29ya0pvYjo6aW5pdGlhbGl6ZSk6CisgICAgICAgICogcGxh
dGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MxMFBhcnNlci5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpSU1MxMFBhcnNlcjo6UlNTMTBQYXJz
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UlNTMTBQYXJzZXI6OnBhcnNlQnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJTUzEwUGFyc2VyOjpwYXJzZVhtbERvYyk6CisgICAgICAgIChXZWJDb3Jl
OjpSU1MxMFBhcnNlcjo6cGFyc2VJdGVtQmFzZUF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSU1MxMFBhcnNlcjo6cGFyc2VJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OlJTUzEwUGFyc2Vy
OjpwYXJzZUZlZWQpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3Mv
UlNTMTBQYXJzZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFJTUzEw
UGFyc2VyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTUzIw
UGFyc2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6
OlJTUzIwUGFyc2VyOjpSU1MyMFBhcnNlcik6CisgICAgICAgIChXZWJDb3JlOjpSU1MyMFBhcnNl
cjo6cGFyc2VCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6UlNTMjBQYXJzZXI6OnBhcnNlWG1s
RG9jKToKKyAgICAgICAgKFdlYkNvcmU6OlJTUzIwUGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmli
dXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJTUzIwUGFyc2VyOjpwYXJzZUl0ZW0pOgorICAgICAg
ICAoV2ViQ29yZTo6UlNTMjBQYXJzZXI6OnBhcnNlRmVlZCk6CisgICAgICAgIChXZWJDb3JlOjpS
U1MyMFBhcnNlcjo6cGFyc2VFbmNsb3N1cmUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9yc3MvUlNTMjBQYXJzZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFJTUzIwUGFyc2VyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvcnNzL1JTU0F0b21QYXJzZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6aXNSZWxhdGl2ZVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UlNT
QXRvbUxpbms6OnJlbFR5cGUpOgorICAgICAgICAoV2ViQ29yZTo6UlNTQXRvbVBhcnNlcjo6UlNT
QXRvbVBhcnNlcik6CisgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUJ1ZmZl
cik6CisgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZVhtbERvYyk6CisgICAg
ICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6OnBhcnNlSXRlbSk6CisgICAgICAgIChXZWJD
b3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUZlZWQpOgorICAgICAgICAoV2ViQ29yZTo6UlNTQXRv
bVBhcnNlcjo6cGFyc2VMaW5rKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6OmVu
Y2xvc3VyZUZyb21MaW5rKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0F0b21QYXJzZXI6OnBhcnNl
Q29udGVudCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUF1dGhvcik6
CisgICAgICAgIChXZWJDb3JlOjpSU1NBdG9tUGFyc2VyOjpwYXJzZUNhdGVnb3J5KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0F0b21QYXJzZXIuaDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFJTU0F0b21MaW5rKToKKyAgICAgICAg
KFdlYkNvcmU6OlJTU0F0b21MaW5rOjpSU1NBdG9tTGluayk6CisgICAgICAgIChSU1NBdG9tUGFy
c2VyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRl
clN0cmVhbS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
Ojppc0FTQ0lJU3BhY2VMb3dlckJ5dGUpOgorICAgICAgICAoV2ViQ29yZTo6c3RyaXBXaGl0ZVNw
YWNlKToKKyAgICAgICAgKFdlYkNvcmU6OmVxdWFsSWdub3JpbmdDYXNlKToKKyAgICAgICAgKFdl
YkNvcmU6OmlzQXRvbU1JTUVUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OmlzUlNTTUlNRVR5cGUp
OgorICAgICAgICAoV2ViQ29yZTo6aXNQb3RlbnRpYWxSU1NNSU1FVHlwZSk6CisgICAgICAgIChX
ZWJDb3JlOjppc1JTU0NvbnRlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UlNTVHlwZUZyb21Db250
ZW50VHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpSU1NUeXBlRnJvbUNvbnRlbnQpOgorICAgICAg
ICAoV2ViQ29yZTo6Y3JlYXRlUGFyc2VyKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRYTUxFbmNv
ZGluZ1Bvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbmRYTUxMYW5ndWFnZVBvc2l0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OmRlZmF1bHRFbmNvZGluZ0Zvckxhbmd1YWdlKToKKyAgICAg
ICAgKFdlYkNvcmU6OmlzVHJhbnNjb2RpbmdOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6dHJh
bnNjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OnRyYW5zY29kZUNvbnRlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6UlNTRmlsdGVyU3RyZWFtOjpSU1NGaWx0ZXJTdHJlYW0pOgorICAgICAgICAoV2Vi
Q29yZTo6UlNTRmlsdGVyU3RyZWFtOjpub3RpZnlTdGF0dXNSZWNlaXZlZCk6CisgICAgICAgIChX
ZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06Om5vdGlmeUhlYWRlcnNSZWNlaXZlZCk6CisgICAgICAg
IChXZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06Om5vdGlmeURhdGFSZWNlaXZlZCk6CisgICAgICAg
IChXZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06Om5vdGlmeUNsb3NlKToKKyAgICAgICAgKFdlYkNv
cmU6OlJTU0ZpbHRlclN0cmVhbTo6Y29udmVydENvbnRlbnRUb0h0bWwpOgorICAgICAgICAoV2Vi
Q29yZTo6UlNTRmlsdGVyU3RyZWFtOjpoYW5kbGVSU1NDb250ZW50KToKKyAgICAgICAgKFdlYkNv
cmU6OlJTU0ZpbHRlclN0cmVhbTo6Y2hhcnNldCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NGaWx0
ZXJTdHJlYW06OmVuY29kaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0ZpbHRlclN0cmVhbTo6
c2F2ZUhlYWRlcnMpOgorICAgICAgICAoV2ViQ29yZTo6UlNTRmlsdGVyU3RyZWFtOjpyZW1vdmVI
ZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UlNTRmlsdGVyU3RyZWFtOjp1cGRhdGVIZWFkZXIp
OgorICAgICAgICAoV2ViQ29yZTo6UlNTRmlsdGVyU3RyZWFtOjp1cGRhdGVSU1NIZWFkZXJzKToK
KyAgICAgICAgKFdlYkNvcmU6OlJTU0ZpbHRlclN0cmVhbTo6c2VuZFNhdmVkSGVhZGVycyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSU1NGaWx0ZXJTdHJlYW06OmFwcGVuZERhdGEpOgorICAgICAgICAq
IHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTRmlsdGVyU3RyZWFtLmg6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChSU1NGaWx0ZXJTdHJlYW0pOgorICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0dlbmVyYXRvcjo6
UlNTR2VuZXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0dlbmVyYXRvcjo6flJTU0dlbmVy
YXRvcik6CisgICAgICAgIChXZWJDb3JlOjpSU1NHZW5lcmF0b3I6OmdlbmVyYXRlSHRtbCk6Cisg
ICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NHZW5lcmF0b3IuaDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFJTU0dlbmVyYXRvcik6CisgICAg
ICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NQYXJzZXJCYXNlLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0VuY2xvc3Vy
ZTo6UlNTRW5jbG9zdXJlKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0VuY2xvc3VyZTo6dHlwZUlu
RW51bSk6CisgICAgICAgIChXZWJDb3JlOjpSU1NFbmNsb3N1cmU6OnN1Z2dlc3RlZE5hbWUpOgor
ICAgICAgICAoV2ViQ29yZTo6UlNTRmVlZDo6UlNTRmVlZCk6CisgICAgICAgIChXZWJDb3JlOjpS
U1NGZWVkOjp+UlNTRmVlZCk6CisgICAgICAgIChXZWJDb3JlOjpSU1NGZWVkOjpjbGVhcik6Cisg
ICAgICAgIChXZWJDb3JlOjpSU1NJdGVtOjpSU1NJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OlJT
U0l0ZW06On5SU1NJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OlJTU0l0ZW06OmNsZWFyKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJTU1BhcnNlckJhc2U6OlJTU1BhcnNlckJhc2UpOgorICAgICAgICAo
V2ViQ29yZTo6UlNTUGFyc2VyQmFzZTo6flJTU1BhcnNlckJhc2UpOgorICAgICAgICAoV2ViQ29y
ZTo6dGV4dEZyb21YTUxBdHRyKToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRGcm9tWE1MTm9kZSk6
CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NQYXJzZXJCYXNl
Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChSU1NFbmNsb3N1cmUpOgor
ICAgICAgICAoUlNTSXRlbUJhc2UpOgorICAgICAgICAoUlNTUGFyc2VyQmFzZSk6CisKIDIwMTIt
MDgtMjAgIFRvbSBTZXBleiAgPHRzZXBlekBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgWFNTQXVk
aXRvciB0b28gdG9sZXJhbnQgb2YgaW5qZWN0ZWQgZGF0YTogVVJMcyBmcm9tIG90aGVyICJob3N0
bGVzcyIgc2NoZW1lcy4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1BsYXRmb3JtQmxhY2tC
ZXJyeS5jbWFrZSBiL1NvdXJjZS9XZWJDb3JlL1BsYXRmb3JtQmxhY2tCZXJyeS5jbWFrZQppbmRl
eCBmNDVlNTAxLi5lNGM5N2Y4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9QbGF0Zm9ybUJs
YWNrQmVycnkuY21ha2UKKysrIGIvU291cmNlL1dlYkNvcmUvUGxhdGZvcm1CbGFja0JlcnJ5LmNt
YWtlCkBAIC02LDEzICs2LDE0IEBAIExJU1QoSU5TRVJUIFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RP
UklFUyAwCiBMSVNUKEFQUEVORCBXZWJDb3JlX0lOQ0xVREVfRElSRUNUT1JJRVMKICAgICAiJHtX
RUJDT1JFX0RJUn0vYmluZGluZ3MvY3BwIgogICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS9i
bGFja2JlcnJ5L0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlIgotICAgICIke1dFQkNPUkVfRElS
fS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L3BsYXRm
b3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvc2tpYSIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZv
cm0vZ3JhcGhpY3MvaGFyZmJ1enoiCiAgICAgIiR7V0VCQ09SRV9ESVJ9L3BsYXRmb3JtL2dyYXBo
aWNzL29wZW50eXBlLyIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vZ3JhcGhpY3Mvc2tp
YSIKICAgICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvc2tpYSIKICAg
ICAiJHtXRUJDT1JFX0RJUn0vcGxhdGZvcm0vaW1hZ2UtZW5jb2RlcnMvc2tpYSIKKyAgICAiJHtX
RUJDT1JFX0RJUn0vcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5IgorICAgICIke1dFQkNPUkVf
RElSfS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzIgogKQogCiAjIFNraWEgc291cmNl
cwpAQCAtMTAyLDYgKzEwMywxMiBAQCBMSVNUKEFQUEVORCBXZWJDb3JlX1NPVVJDRVMKICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvUmVzb3VyY2VSZXF1ZXN0QmxhY2tCZXJyeS5jcHAK
ICAgICBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvUmVzb3VyY2VSZXNwb25zZUJsYWNrQmVy
cnkuY3BwCiAgICAgcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L1NvY2tldFN0cmVhbUhhbmRs
ZUJsYWNrQmVycnkuY3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NB
dG9tUGFyc2VyLmNwcAorICAgIHBsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTMTBQ
YXJzZXIuY3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MyMFBhcnNl
ci5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVh
bS5jcHAKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0dlbmVyYXRvci5j
cHAKKyAgICBwbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuY3Bw
CiApCiAKIExJU1QoQVBQRU5EIFdlYkNvcmVfVVNFUl9BR0VOVF9TVFlMRV9TSEVFVFMKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3b3Jr
Sm9iLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9OZXR3
b3JrSm9iLmNwcAppbmRleCAzZDgwM2EyLi40NWFlOGFmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvTmV0d29ya0pvYi5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L05ldHdvcmtKb2IuY3BwCkBA
IC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgogI2luY2x1ZGUg
Ik5ldHdvcmtNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlJTU0ZpbHRl
clN0cmVhbS5oIgogI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlQ2xpZW50LmgiCiAjaW5jbHVkZSAi
UmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgogI2luY2x1ZGUgIlJlc291cmNlUmVxdWVzdC5oIgpA
QCAtMTMzLDYgKzEzNCwxNiBAQCBib29sIE5ldHdvcmtKb2I6OmluaXRpYWxpemUoaW50IHBsYXll
cklkLAogICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW0qIHdyYXBwZWRTdHJl
YW0gPSBtX3N0cmVhbUZhY3RvcnktPmNyZWF0ZU5ldHdvcmtTdHJlYW0ocmVxdWVzdCwgbV9wbGF5
ZXJJZCk7CiAgICAgaWYgKCF3cmFwcGVkU3RyZWFtKQogICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlRhcmdldFR5cGUgdGFy
Z2V0VHlwZSA9IHJlcXVlc3QuZ2V0VGFyZ2V0VHlwZSgpOworICAgIGlmICgodGFyZ2V0VHlwZSA9
PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlRhcmdldElzTWFpbkZyYW1l
CisgICAgICAgICB8fCB0YXJnZXRUeXBlID09IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3Jr
UmVxdWVzdDo6VGFyZ2V0SXNTdWJmcmFtZSkKKyAgICAgICAgICAgICYmICFtX2lzT3ZlcnJpZGVD
b250ZW50VHlwZSkgeworICAgICAgICBSU1NGaWx0ZXJTdHJlYW0qIGZpbHRlciA9IG5ldyBSU1NG
aWx0ZXJTdHJlYW0oKTsKKyAgICAgICAgZmlsdGVyLT5zZXRXcmFwcGVkU3RyZWFtKHdyYXBwZWRT
dHJlYW0pOworICAgICAgICB3cmFwcGVkU3RyZWFtID0gZmlsdGVyOworICAgIH0KKwogICAgIHNl
dFdyYXBwZWRTdHJlYW0od3JhcHBlZFN0cmVhbSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNT
MTBQYXJzZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5
L3Jzcy9SU1MxMFBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
NTM5MjMzMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvYmxhY2tiZXJyeS9yc3MvUlNTMTBQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTI1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlv
biBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUg
dG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSU1MxMFBhcnNlci5oIgorCisjaW5jbHVkZSAi
QmxhY2tCZXJyeVBsYXRmb3JtQXNzZXJ0LmgiCisjaW5jbHVkZSAibGlieG1sL3BhcnNlci5oIgor
I2luY2x1ZGUgImxpYnhtbC94bWx3cml0ZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitS
U1MxMFBhcnNlcjo6UlNTMTBQYXJzZXIoKQoreworfQorCitib29sIFJTUzEwUGFyc2VyOjpwYXJz
ZUJ1ZmZlcihjb25zdCBjaGFyKiBidWZmZXIsIGludCBsZW5ndGgsIGNvbnN0IGNoYXIqIHVybCwg
Y29uc3QgY2hhciogZW5jb2RpbmcpCit7CisgICAgcmV0dXJuIHBhcnNlWG1sRG9jKHhtbFJlYWRN
ZW1vcnkoYnVmZmVyLCBsZW5ndGgsIHVybCwgZW5jb2RpbmcsIFhNTF9QQVJTRV9OT0JMQU5LUyB8
IFhNTF9QQVJTRV9OT05FVCkpOworfQorCitib29sIFJTUzEwUGFyc2VyOjpwYXJzZVhtbERvYyh4
bWxEb2NQdHIgZG9jKQoreworICAgIGlmICghZG9jKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICB4bWxOb2RlKiBub2RlID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBpZiAo
IW5vZGUpIHsKKyAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgICAg
IFN0cmluZyBuYW1lKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5vZGUtPm5hbWUpKTsK
KworICAgICAgICBpZiAobmFtZSA9PSAiUkRGIikgeworICAgICAgICAgICAgeG1sTm9kZSogY2hp
bGRub2RlID0gbm9kZS0+Y2hpbGRyZW47CisgICAgICAgICAgICBmb3IgKDsgY2hpbGRub2RlOyBj
aGlsZG5vZGUgPSBjaGlsZG5vZGUtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRu
b2RlLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFt
ZSA9IFN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihjaGlsZG5vZGUtPm5hbWUp
KTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZS5tYWtlTG93ZXIoKTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKG5hbWUgPT0gImNoYW5uZWwiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBC
TEFDS0JFUlJZX0FTU0VSVCghbV9yb290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgh
bV9yb290KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcm9vdCA9IHBhcnNlRmVlZChj
aGlsZG5vZGUtPmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1l
ID09ICJpdGVtIikgeworICAgICAgICAgICAgICAgICAgICAgICAgQkxBQ0tCRVJSWV9BU1NFUlQo
bV9yb290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3Jvb3QpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBSU1NJdGVtKiBpdGVtID0gcGFyc2VJdGVtKGNoaWxkbm9kZS0+
Y2hpbGRyZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Jvb3QtPm1faXRlbXMuYXBwZW5kKGl0ZW0pOwor
ICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeG1sRnJl
ZURvYyhkb2MpOworCisgICAgcmV0dXJuIG1fcm9vdDsKK30KKworYm9vbCBSU1MxMFBhcnNlcjo6
cGFyc2VJdGVtQmFzZUF0dHJpYnV0ZShSU1NJdGVtQmFzZSogaXRlbSwgY29uc3QgU3RyaW5nJiBu
YW1lLCB4bWxOb2RlKiBub2RlKQoreworICAgIGlmIChuYW1lID09ICJsaW5rIikKKyAgICAgICAg
aXRlbS0+bV9saW5rID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UgaWYgKG5hbWUg
PT0gInRpdGxlIikKKyAgICAgICAgaXRlbS0+bV90aXRsZSA9IHRleHRGcm9tWE1MTm9kZShub2Rl
KTsKKyAgICBlbHNlIGlmIChuYW1lID09ICJkZXNjcmlwdGlvbiIpCisgICAgICAgIGl0ZW0tPm1f
ZGVzY3JpcHRpb24gPSB0ZXh0RnJvbVhNTE5vZGUobm9kZSk7CisgICAgZWxzZQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUlNTSXRlbSogUlNTMTBQYXJz
ZXI6OnBhcnNlSXRlbSh4bWxOb2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5v
ZGUpOworCisgICAgUlNTSXRlbSogaXRlbSA9IG5ldyBSU1NJdGVtKCk7CisKKyAgICBmb3IgKDsg
bm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dl
cigpOworCisgICAgICAgIHBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoaXRlbSwgbmFtZSwgbm9kZSk7
CisgICAgfQorCisgICAgcmV0dXJuIGl0ZW07Cit9CisKK1JTU0ZlZWQqIFJTUzEwUGFyc2VyOjpw
YXJzZUZlZWQoeG1sTm9kZSogbm9kZSkKK3sKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChub2RlKTsK
KworICAgIFJTU0ZlZWQqIGZlZWQgPSBuZXcgUlNTRmVlZCgpOworCisgICAgZm9yICg7IG5vZGU7
IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgICAgIFN0cmluZyBuYW1lKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgY2hhcio+KG5vZGUtPm5hbWUpKTsKKyAgICAgICAgbmFtZS5tYWtlTG93ZXIoKTsK
KworICAgICAgICBwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKGZlZWQsIG5hbWUsIG5vZGUpOworICAg
IH0KKworICAgIHJldHVybiBmZWVkOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JT
UzEwUGFyc2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
cnNzL1JTUzEwUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2
NjQxZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
YmxhY2tiZXJyeS9yc3MvUlNTMTBQYXJzZXIuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYg
UlNTMTBQYXJzZXJfaAorI2RlZmluZSBSU1MxMFBhcnNlcl9oCisKKyNpbmNsdWRlICJSU1NQYXJz
ZXJCYXNlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUlNTMTBQYXJzZXIgOiBw
dWJsaWMgUlNTUGFyc2VyQmFzZSB7CitwdWJsaWM6CisgICAgUlNTMTBQYXJzZXIoKTsKKworICAg
IGJvb2wgcGFyc2VCdWZmZXIoY29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuZ3RoLCBjb25zdCBj
aGFyKiB1cmwsIGNvbnN0IGNoYXIqIGVuY29kaW5nKTsKKworcHJpdmF0ZToKKyAgICBib29sIHBh
cnNlWG1sRG9jKHhtbERvY1B0cik7CisgICAgYm9vbCBwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKFJT
U0l0ZW1CYXNlKiwgY29uc3QgU3RyaW5nJiBuYW1lLCB4bWxOb2RlKik7CisgICAgUlNTSXRlbSog
cGFyc2VJdGVtKHhtbE5vZGUqKTsKKyAgICBSU1NGZWVkKiBwYXJzZUZlZWQoeG1sTm9kZSopOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUlNTMTBQYXJzZXJfaApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jz
cy9SU1MyMFBhcnNlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNr
YmVycnkvcnNzL1JTUzIwUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi43NzhlNGRjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1MyMFBhcnNlci5jcHAKQEAgLTAsMCArMSwxNjQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4g
TW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3
cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJTUzIwUGFyc2VyLmgiCisKKyNpbmNs
dWRlICJCbGFja0JlcnJ5UGxhdGZvcm1Bc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJ4bWwvcGFyc2Vy
LmgiCisjaW5jbHVkZSAibGlieG1sL3htbHdyaXRlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK1JTUzIwUGFyc2VyOjpSU1MyMFBhcnNlcigpCit7Cit9CisKK2Jvb2wgUlNTMjBQYXJzZXI6
OnBhcnNlQnVmZmVyKGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0aCwgY29uc3QgY2hhciog
dXJsLCBjb25zdCBjaGFyKiBlbmNvZGluZykKK3sKKyAgICByZXR1cm4gcGFyc2VYbWxEb2MoeG1s
UmVhZE1lbW9yeShidWZmZXIsIGxlbmd0aCwgdXJsLCBlbmNvZGluZywgWE1MX1BBUlNFX05PQkxB
TktTIHwgWE1MX1BBUlNFX05PTkVUKSk7Cit9CisKK2Jvb2wgUlNTMjBQYXJzZXI6OnBhcnNlWG1s
RG9jKHhtbERvY1B0ciBkb2MpCit7CisgICAgaWYgKCFkb2MpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIHhtbE5vZGUqIG5vZGUgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOworICAg
IGlmICghbm9kZSkgeworICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAg
ICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFt
ZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dlcigpOworCisgICAgICAgIGlmIChuYW1lID09ICJy
c3MiKSB7CisgICAgICAgICAgICB4bWxOb2RlKiBjaGFubmVsID0gbm9kZS0+Y2hpbGRyZW47Cisg
ICAgICAgICAgICBpZiAoY2hhbm5lbC0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB7CisgICAg
ICAgICAgICAgICAgbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGNoYW5uZWwt
Pm5hbWUpOworICAgICAgICAgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7CisgICAgICAgICAgICAg
ICAgaWYgKG5hbWUgPT0gImNoYW5uZWwiKQorICAgICAgICAgICAgICAgICAgICBtX3Jvb3QgPSBw
YXJzZUZlZWQoY2hhbm5lbC0+Y2hpbGRyZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB4bWxGcmVlRG9jKGRvYyk7CisKKyAgICBy
ZXR1cm4gbV9yb290OworfQorCitib29sIFJTUzIwUGFyc2VyOjpwYXJzZUl0ZW1CYXNlQXR0cmli
dXRlKFJTU0l0ZW1CYXNlKiBpdGVtLCBjb25zdCBTdHJpbmcmIG5hbWUsIHhtbE5vZGUqIG5vZGUp
Cit7CisgICAgaWYgKG5hbWUgPT0gImxpbmsiKQorICAgICAgICBpdGVtLT5tX2xpbmsgPSB0ZXh0
RnJvbVhNTE5vZGUobm9kZSk7CisgICAgZWxzZSBpZiAobmFtZSA9PSAidGl0bGUiKQorICAgICAg
ICBpdGVtLT5tX3RpdGxlID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UgaWYgKG5h
bWUgPT0gImRlc2NyaXB0aW9uIikKKyAgICAgICAgaXRlbS0+bV9kZXNjcmlwdGlvbiA9IHRleHRG
cm9tWE1MTm9kZShub2RlKTsKKyAgICBlbHNlIGlmIChuYW1lID09ICJwdWJkYXRlIikKKyAgICAg
ICAgaXRlbS0+bV9wdWJEYXRlID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1JTU0l0ZW0qIFJT
UzIwUGFyc2VyOjpwYXJzZUl0ZW0oeG1sTm9kZSogbm9kZSkKK3sKKyAgICBCTEFDS0JFUlJZX0FT
U0VSVChub2RlKTsKKworICAgIFJTU0l0ZW0qIGl0ZW0gPSBuZXcgUlNTSXRlbSgpOworCisgICAg
Zm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgICAgIFN0cmluZyBuYW1lKHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5vZGUtPm5hbWUpKTsKKyAgICAgICAgbmFtZS5t
YWtlTG93ZXIoKTsKKworICAgICAgICBpZiAocGFyc2VJdGVtQmFzZUF0dHJpYnV0ZShpdGVtLCBu
YW1lLCBub2RlKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChuYW1lID09
ICJhdXRob3IiKQorICAgICAgICAgICAgaXRlbS0+bV9hdXRob3IgPSB0ZXh0RnJvbVhNTE5vZGUo
bm9kZSk7CisgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gImNyZWF0b3IiKSB7CisgICAgICAgICAg
ICBpZiAoaXRlbS0+bV9hdXRob3IuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGl0ZW0tPm1f
YXV0aG9yID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUg
PT0gImNhdGVnb3J5IikKKyAgICAgICAgICAgIGl0ZW0tPm1fY2F0ZWdvcmllcy5hcHBlbmQodGV4
dEZyb21YTUxOb2RlKG5vZGUpKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAiY29tbWVudHMi
KQorICAgICAgICAgICAgaXRlbS0+bV9jb21tZW50cyA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsK
KyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAiZW5jbG9zdXJlIikgeworICAgICAgICAgICAgLy8g
UmlnaHQgbm93IHdlIGFzc3VtZSB0aGVyZSBpcyBvbmx5IG9uZSBlbmNsb3N1cmUgcGVyIGl0ZW0s
IGFuZCB3ZSBoYW5kbGUgb25seQorICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGVuY2xvc3VyZSBp
ZiB0aGVyZSBhcmUgbXVsdGlwbGUgb25lcy4KKyAgICAgICAgICAgIC8vIFJlZmVyZW5jZTogaHR0
cDovL3d3dy5yc3Nib2FyZC5vcmcvcnNzLXByb2ZpbGUjZWxlbWVudC1jaGFubmVsLWl0ZW0tZW5j
bG9zdXJlCisgICAgICAgICAgICBpZiAoIWl0ZW0tPm1fZW5jbG9zdXJlKQorICAgICAgICAgICAg
ICAgIGl0ZW0tPm1fZW5jbG9zdXJlID0gcGFyc2VFbmNsb3N1cmUobm9kZSk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICByZXR1cm4gaXRlbTsKK30KKworUlNTRmVlZCogUlNTMjBQYXJzZXI6OnBh
cnNlRmVlZCh4bWxOb2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOwor
CisgICAgUlNTRmVlZCogZmVlZCA9IG5ldyBSU1NGZWVkKCk7CisKKyAgICBmb3IgKDsgbm9kZTsg
bm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnByZXRfY2Fz
dDxjb25zdCBjaGFyKj4obm9kZS0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dlcigpOwor
CisgICAgICAgIGlmIChwYXJzZUl0ZW1CYXNlQXR0cmlidXRlKGZlZWQsIG5hbWUsIG5vZGUpKQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gIml0ZW0iKQorICAg
ICAgICAgICAgZmVlZC0+bV9pdGVtcy5hcHBlbmQocGFyc2VJdGVtKG5vZGUtPmNoaWxkcmVuKSk7
CisgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gImxhbmd1YWdlIikKKyAgICAgICAgICAgIGZlZWQt
Pm1fbGFuZ3VhZ2UgPSB0ZXh0RnJvbVhNTE5vZGUobm9kZSk7CisgICAgICAgIGVsc2UgaWYgKG5h
bWUgPT0gInR0bCIpCisgICAgICAgICAgICBmZWVkLT5tX3R0bCA9IHRleHRGcm9tWE1MTm9kZShu
b2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmVlZDsKK30KKworUlNTRW5jbG9zdXJlKiBSU1My
MFBhcnNlcjo6cGFyc2VFbmNsb3N1cmUoeG1sTm9kZSogbm9kZSkKK3sKKyAgICBCTEFDS0JFUlJZ
X0FTU0VSVChub2RlKTsKKworICAgIFJTU0VuY2xvc3VyZSogZW5jbG9zdXJlID0gbmV3IFJTU0Vu
Y2xvc3VyZSgpOworCisgICAgZm9yICh4bWxBdHRyKiBhdHRyID0gbm9kZS0+cHJvcGVydGllczsg
YXR0cjsgYXR0ciA9IGF0dHItPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4oYXR0ci0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VMb3dl
cigpOworCisgICAgICAgIGlmIChuYW1lID09ICJ1cmwiKQorICAgICAgICAgICAgZW5jbG9zdXJl
LT5tX3VybCA9IHRleHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9
PSAidHlwZSIpCisgICAgICAgICAgICBlbmNsb3N1cmUtPm1fdHlwZSA9IHRleHRGcm9tWE1MQXR0
cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAibGVuZ3RoIikKKyAgICAgICAgICAg
IGVuY2xvc3VyZS0+bV9sZW5ndGggPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgfQorCisg
ICAgcmV0dXJuIGVuY2xvc3VyZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1My
MFBhcnNlci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jz
cy9SU1MyMFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGFk
MTgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2Js
YWNrYmVycnkvcnNzL1JTUzIwUGFyc2VyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG
cmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFJT
UzIwUGFyc2VyX2gKKyNkZWZpbmUgUlNTMjBQYXJzZXJfaAorCisjaW5jbHVkZSAiUlNTUGFyc2Vy
QmFzZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFJTUzIwUGFyc2VyIDogcHVi
bGljIFJTU1BhcnNlckJhc2UgeworcHVibGljOgorICAgIFJTUzIwUGFyc2VyKCk7CisKKyAgICBi
b29sIHBhcnNlQnVmZmVyKGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50IGxlbmd0aCwgY29uc3QgY2hh
ciogdXJsLCBjb25zdCBjaGFyKiBlbmNvZGluZyk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBwYXJz
ZVhtbERvYyh4bWxEb2NQdHIpOworICAgIGJvb2wgcGFyc2VJdGVtQmFzZUF0dHJpYnV0ZShSU1NJ
dGVtQmFzZSosIGNvbnN0IFN0cmluZyYgbmFtZSwgeG1sTm9kZSopOworICAgIFJTU0l0ZW0qIHBh
cnNlSXRlbSh4bWxOb2RlKik7CisgICAgUlNTRmVlZCogcGFyc2VGZWVkKHhtbE5vZGUqKTsKKyAg
ICBSU1NFbmNsb3N1cmUqIHBhcnNlRW5jbG9zdXJlKHhtbE5vZGUqKTsKK307CisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJTUzIwUGFyc2VyX2gKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTQXRvbVBhcnNl
ci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JT
U0F0b21QYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjZi
YzQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2Js
YWNrYmVycnkvcnNzL1JTU0F0b21QYXJzZXIuY3BwCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBM
aW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8g
dGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSU1NBdG9tUGFyc2VyLmgiCisKKyNpbmNsdWRlICJC
bGFja0JlcnJ5UGxhdGZvcm1Bc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJ4bWwvcGFyc2VyLmgiCisj
aW5jbHVkZSAibGlieG1sL3htbHdyaXRlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
YXRpYyBpbmxpbmUgYm9vbCBpc1JlbGF0aXZlUGF0aChjb25zdCBTdHJpbmcmIHBhdGgpCit7Cisg
ICAgcmV0dXJuICEocGF0aC5zdGFydHNXaXRoKCIvIikgfHwgcGF0aC5maW5kKCI6LyIpICE9IFdU
Rjo6bm90Rm91bmQpOworfQorCitSU1NBdG9tTGluazo6VHlwZSBSU1NBdG9tTGluazo6cmVsVHlw
ZSgpCit7CisgICAgaWYgKG1fdHlwZUluRW51bSAhPSBUeXBlVW5rbm93bikKKyAgICAgICAgcmV0
dXJuIG1fdHlwZUluRW51bTsKKworICAgIGlmIChtX3JlbC5pc0VtcHR5KCkpCisgICAgICAgIG1f
dHlwZUluRW51bSA9IFR5cGVBbHRlcm5hdGU7CisgICAgZWxzZSB7CisgICAgICAgIFN0cmluZyBs
b3dyZWwgPSBtX3JlbC5sb3dlcigpOworICAgICAgICBpZiAobG93cmVsID09ICJhbHRlcm5hdGUi
KQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUFsdGVybmF0ZTsKKyAgICAgICAgZWxz
ZSBpZiAobG93cmVsID09ICJlbmNsb3N1cmUiKQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0g
VHlwZUVuY2xvc3VyZTsKKyAgICAgICAgZWxzZSBpZiAobG93cmVsID09ICJyZWxhdGVkIikKKyAg
ICAgICAgICAgIG1fdHlwZUluRW51bSA9IFR5cGVSZWxhdGVkOworICAgICAgICBlbHNlIGlmIChs
b3dyZWwgPT0gInNlbGYiKQorICAgICAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVNlbGY7Cisg
ICAgICAgIGVsc2UgaWYgKGxvd3JlbCA9PSAidmlhIikKKyAgICAgICAgICAgIG1fdHlwZUluRW51
bSA9IFR5cGVWaWE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fdHlwZUluRW51bSA9IFR5
cGVVbnN1cHBvcnRlZDsKKyAgICB9CisKKyAgICByZXR1cm4gbV90eXBlSW5FbnVtOworfQorCitS
U1NBdG9tUGFyc2VyOjpSU1NBdG9tUGFyc2VyKCkKK3sKK30KKworYm9vbCBSU1NBdG9tUGFyc2Vy
OjpwYXJzZUJ1ZmZlcihjb25zdCBjaGFyKiBidWZmZXIsIGludCBsZW5ndGgsIGNvbnN0IGNoYXIq
IHVybCwgY29uc3QgY2hhciogZW5jb2RpbmcpCit7CisgICAgbV91cmwgPSBLVVJMKGJsYW5rVVJM
KCksIHVybCk7CisgICAgcmV0dXJuIHBhcnNlWG1sRG9jKHhtbFJlYWRNZW1vcnkoYnVmZmVyLCBs
ZW5ndGgsIHVybCwgZW5jb2RpbmcsIFhNTF9QQVJTRV9OT0JMQU5LUyB8IFhNTF9QQVJTRV9OT05F
VCkpOworfQorCitib29sIFJTU0F0b21QYXJzZXI6OnBhcnNlWG1sRG9jKHhtbERvY1B0ciBkb2Mp
Cit7CisgICAgaWYgKCFkb2MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHhtbE5vZGUq
IG5vZGUgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOworICAgIGlmICghbm9kZSkgeworICAg
ICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUo
cmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFtZSkpOworICAgICAgICBuYW1l
Lm1ha2VMb3dlcigpOworCisgICAgICAgIGlmIChuYW1lID09ICJmZWVkIikgeworICAgICAgICAg
ICAgbV9yb290ID0gcGFyc2VGZWVkKG5vZGUtPmNoaWxkcmVuKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorCisgICAgeG1sRnJlZURvYyhkb2MpOworICAgIHJldHVybiBt
X3Jvb3Q7Cit9CisKK2Jvb2wgUlNTQXRvbVBhcnNlcjo6cGFyc2VJdGVtQmFzZUF0dHJpYnV0ZShS
U1NJdGVtQmFzZSogaXRlbSwgY29uc3QgU3RyaW5nJiBuYW1lLCB4bWxOb2RlKiBub2RlLCBjb25z
dCBTdHJpbmcmIGJhc2UpCit7CisgICAgaWYgKG5hbWUgPT0gInRpdGxlIikKKyAgICAgICAgaXRl
bS0+bV90aXRsZSA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAgICBlbHNlIGlmIChuYW1lID09
ICJpZCIpCisgICAgICAgIGl0ZW0tPm1faWQgPSB0ZXh0RnJvbVhNTE5vZGUobm9kZSk7CisgICAg
ZWxzZSBpZiAobmFtZSA9PSAiYXV0aG9yIikKKyAgICAgICAgaXRlbS0+bV9hdXRob3IgPSBwYXJz
ZUF1dGhvcihub2RlKTsKKyAgICBlbHNlIGlmIChuYW1lID09ICJ1cGRhdGVkIikKKyAgICAgICAg
aXRlbS0+bV91cGRhdGVkID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UgaWYgKG5h
bWUgPT0gImNvbnRlbnQiKQorICAgICAgICBpdGVtLT5tX2Rlc2NyaXB0aW9uID0gcGFyc2VDb250
ZW50KGJhc2UsIG5vZGUpOworICAgIGVsc2UgaWYgKG5hbWUgPT0gInB1Ymxpc2hlZCIpCisgICAg
ICAgIGl0ZW0tPm1fcHViRGF0ZSA9IHRleHRGcm9tWE1MTm9kZShub2RlKTsKKyAgICBlbHNlCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitSU1NJdGVtKiBS
U1NBdG9tUGFyc2VyOjpwYXJzZUl0ZW0oeG1sTm9kZSogbm9kZSkKK3sKKyAgICBCTEFDS0JFUlJZ
X0FTU0VSVChub2RlKTsKKworICAgIFJTU0l0ZW0qIGl0ZW0gPSBuZXcgUlNTSXRlbSgpOworCisg
ICAgU3RyaW5nIGJhc2U7CisgICAgZm9yICh4bWxBdHRyKiBhdHRyID0gbm9kZS0+cHJvcGVydGll
czsgYXR0cjsgYXR0ciA9IGF0dHItPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUocmVpbnRl
cnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYXR0ci0+bmFtZSkpOworICAgICAgICBuYW1lLm1ha2VM
b3dlcigpOworICAgICAgICBpZiAobmFtZSA9PSAiYmFzZSIpCisgICAgICAgICAgICBiYXNlID0g
dGV4dEZyb21YTUxBdHRyKGF0dHIpOworICAgIH0KKworICAgIG5vZGUgPSBub2RlLT5jaGlsZHJl
bjsKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgU3RyaW5n
IG5hbWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFtZSkpOworICAgICAg
ICBuYW1lLm1ha2VMb3dlcigpOworCisgICAgICAgIGlmIChwYXJzZUl0ZW1CYXNlQXR0cmlidXRl
KGl0ZW0sIG5hbWUsIG5vZGUsIGJhc2UpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgaWYgKG5hbWUgPT0gImxpbmsiKSB7CisgICAgICAgICAgICBSU1NBdG9tTGluayogbGluayA9
IHBhcnNlTGluayhub2RlKTsKKyAgICAgICAgICAgIGlmIChpc1JlbGF0aXZlUGF0aChsaW5rLT5t
X2hyZWYpKQorICAgICAgICAgICAgICAgIGxpbmstPm1faHJlZiA9IGJhc2UgKyAiLyIgKyBsaW5r
LT5tX2hyZWY7CisKKyAgICAgICAgICAgIHN3aXRjaCAobGluay0+cmVsVHlwZSgpKSB7CisgICAg
ICAgICAgICBjYXNlIFJTU0F0b21MaW5rOjpUeXBlQWx0ZXJuYXRlOgorICAgICAgICAgICAgICAg
IGl0ZW0tPm1fbGluayA9IGxpbmstPm1faHJlZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGNhc2UgUlNTQXRvbUxpbms6OlR5cGVFbmNsb3N1cmU6CisgICAgICAgICAgICAg
ICAgQkxBQ0tCRVJSWV9BU1NFUlQoIWl0ZW0tPm1fZW5jbG9zdXJlKTsKKyAgICAgICAgICAgICAg
ICBpZiAoIWl0ZW0tPm1fZW5jbG9zdXJlKQorICAgICAgICAgICAgICAgICAgICBpdGVtLT5tX2Vu
Y2xvc3VyZSA9IGVuY2xvc3VyZUZyb21MaW5rKGxpbmspOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZSBsaW5rOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUg
PT0gImNhdGVnb3J5IikKKyAgICAgICAgICAgIGl0ZW0tPm1fY2F0ZWdvcmllcy5hcHBlbmQocGFy
c2VDYXRlZ29yeShub2RlKSk7CisgICAgfQorCisgICAgcmV0dXJuIGl0ZW07Cit9CisKK1JTU0Zl
ZWQqIFJTU0F0b21QYXJzZXI6OnBhcnNlRmVlZCh4bWxOb2RlKiBub2RlKQoreworICAgIEJMQUNL
QkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNTRmVlZCogZmVlZCA9IG5ldyBSU1NGZWVkKCk7
CisKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgU3RyaW5n
IG5hbWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obm9kZS0+bmFtZSkpOworICAgICAg
ICBuYW1lLm1ha2VMb3dlcigpOworCisgICAgICAgIGlmIChwYXJzZUl0ZW1CYXNlQXR0cmlidXRl
KGZlZWQsIG5hbWUsIG5vZGUsIGVtcHR5U3RyaW5nKCkpKQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgaWYgKG5hbWUgPT0gImVudHJ5IikKKyAgICAgICAgICAgIGZlZWQtPm1faXRl
bXMuYXBwZW5kKHBhcnNlSXRlbShub2RlKSk7CisgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gImxp
bmsiKSB7CisgICAgICAgICAgICBSU1NBdG9tTGluayogbGluayA9IHBhcnNlTGluayhub2RlKTsK
KyAgICAgICAgICAgIGlmIChsaW5rLT5yZWxUeXBlKCkgPT0gUlNTQXRvbUxpbms6OlR5cGVBbHRl
cm5hdGUpCisgICAgICAgICAgICAgICAgZmVlZC0+bV9saW5rID0gbGluay0+bV9ocmVmOworICAg
ICAgICAgICAgZGVsZXRlIGxpbms7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmVl
ZDsKK30KKworUlNTQXRvbUxpbmsqIFJTU0F0b21QYXJzZXI6OnBhcnNlTGluayh4bWxOb2RlKiBu
b2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgUlNTQXRvbUxpbmsq
IGxpbmsgPSBuZXcgUlNTQXRvbUxpbmsoKTsKKworICAgIGZvciAoeG1sQXR0ciogYXR0ciA9IG5v
ZGUtPnByb3BlcnRpZXM7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KSB7CisgICAgICAgIFN0cmlu
ZyBuYW1lKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGF0dHItPm5hbWUpKTsKKyAgICAg
ICAgbmFtZS5tYWtlTG93ZXIoKTsKKworICAgICAgICBpZiAobmFtZSA9PSAiaHJlZiIpCisgICAg
ICAgICAgICBsaW5rLT5tX2hyZWYgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgICAgIGVs
c2UgaWYgKG5hbWUgPT0gInJlbCIpCisgICAgICAgICAgICBsaW5rLT5tX3JlbCA9IHRleHRGcm9t
WE1MQXR0cihhdHRyKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSA9PSAidHlwZSIpCisgICAgICAg
ICAgICBsaW5rLT5tX3R5cGUgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgICAgIGVsc2Ug
aWYgKG5hbWUgPT0gImhyZWZsYW5nIikKKyAgICAgICAgICAgIGxpbmstPm1faHJlZmxhbmcgPSB0
ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gInRpdGxlIikK
KyAgICAgICAgICAgIGxpbmstPm1fdGl0bGUgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7CisgICAg
ICAgIGVsc2UgaWYgKG5hbWUgPT0gImxlbmd0aCIpCisgICAgICAgICAgICBsaW5rLT5tX2xlbmd0
aCA9IHRleHRGcm9tWE1MQXR0cihhdHRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30K
KworUlNTRW5jbG9zdXJlKiBSU1NBdG9tUGFyc2VyOjplbmNsb3N1cmVGcm9tTGluayhSU1NBdG9t
TGluayogbGluaykKK3sKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChsaW5rKTsKKyAgICBCTEFDS0JF
UlJZX0FTU0VSVChsaW5rLT5yZWxUeXBlKCkgPT0gUlNTQXRvbUxpbms6OlR5cGVFbmNsb3N1cmUp
OworCisgICAgUlNTRW5jbG9zdXJlKiBlbmNsb3N1cmUgPSBuZXcgUlNTRW5jbG9zdXJlKCk7CisK
KyAgICBlbmNsb3N1cmUtPm1fdXJsID0gbGluay0+bV9ocmVmOworICAgIGVuY2xvc3VyZS0+bV90
eXBlID0gbGluay0+bV90eXBlOworICAgIGVuY2xvc3VyZS0+bV9sZW5ndGggPSBsaW5rLT5tX2xl
bmd0aDsKKworICAgIHJldHVybiBlbmNsb3N1cmU7Cit9CisKK1N0cmluZyBSU1NBdG9tUGFyc2Vy
OjpwYXJzZUNvbnRlbnQoY29uc3QgU3RyaW5nJiBiYXNlLCB4bWxOb2RlKiBub2RlKQoreworICAg
IC8vIFNlZTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDI4NyNwYWdlLTE2CisKKyAg
ICBCTEFDS0JFUlJZX0FTU0VSVChub2RlKTsKKyAgICBTdHJpbmcgY29udGVudDsKKyAgICBTdHJp
bmcgdHlwZSA9ICJkZWZhdWx0IjsKKyAgICBTdHJpbmcgc3JjOworICAgIGZvciAoeG1sQXR0ciog
YXR0ciA9IG5vZGUtPnByb3BlcnRpZXM7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KSB7CisgICAg
ICAgIFN0cmluZyBuYW1lKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGF0dHItPm5hbWUp
KTsKKyAgICAgICAgbmFtZS5tYWtlTG93ZXIoKTsKKworICAgICAgICBpZiAobmFtZSA9PSAidHlw
ZSIpCisgICAgICAgICAgICB0eXBlID0gdGV4dEZyb21YTUxBdHRyKGF0dHIpOworICAgICAgICBl
bHNlIGlmIChuYW1lID09ICJzcmMiKQorICAgICAgICAgICAgc3JjID0gdGV4dEZyb21YTUxBdHRy
KGF0dHIpOworICAgIH0KKworICAgIGlmICghc3JjLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAo
aXNSZWxhdGl2ZVBhdGgoc3JjKSkKKyAgICAgICAgICAgIHNyYyA9IGJhc2UgKyAiLyIgKyBzcmM7
CisgICAgICAgIGNvbnRlbnQgKz0gIjxhIGhyZWY9XCIiOworICAgICAgICBjb250ZW50ICs9IHNy
YyArICJcIj4iICsgc3JjICsgIjwvYT4iOworICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICB9
CisKKyAgICBpZiAodHlwZSA9PSAidGV4dCIgfHwgdHlwZS5zdGFydHNXaXRoKCJ0ZXh0LyIpKQor
ICAgICAgICBjb250ZW50ID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIGVsc2UgaWYgKHR5
cGUgPT0gImh0bWwiKQorICAgICAgICBjb250ZW50ID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOwor
ICAgIGVsc2UgaWYgKHR5cGUgPT0gInhodG1sIikgeworICAgICAgICB4bWxCdWZmZXJQdHIgYnVm
ZmVyID0geG1sQnVmZmVyQ3JlYXRlKCk7CisgICAgICAgIHhtbE5vZGUgKiBjdXIgPSBub2RlLT5j
aGlsZHJlbjsKKyAgICAgICAgaWYgKGN1ciAmJiBjdXItPnR5cGUgPT0gWE1MX0VMRU1FTlRfTk9E
RSkgeworICAgICAgICAgICAgLy8gRW5jb2Rpbmcgb2YgYnVmZmVyIGlzIHV0Zi04LgorICAgICAg
ICAgICAgeG1sTm9kZUR1bXAoYnVmZmVyLCBjdXItPmRvYywgY3VyLCAwLCAwKTsKKyAgICAgICAg
ICAgIGlmICghYmFzZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjb250ZW50ICs9ICI8
YmFzZSBocmVmPSciOworICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gbV91cmwuYmFzZUFzU3Ry
aW5nKCk7CisgICAgICAgICAgICAgICAgY29udGVudCArPSAiLyI7CisgICAgICAgICAgICAgICAg
Y29udGVudCArPSBiYXNlOworICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gIi8nIC8+IjsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRlbnQgKz0gKGNvbnN0IGNoYXIqKXhtbEJ1ZmZl
ckNvbnRlbnQoYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICB4bWxCdWZmZXJGcmVlKGJ1ZmZl
cik7CisgICAgfSBlbHNlIGlmICh0eXBlLmVuZHNXaXRoKCIreG1sIikgfHwgdHlwZS5lbmRzV2l0
aCgiL3htbCIpKQorICAgICAgICAvLyBGSVhNRTogc2VlIGF0b20gc3BlYyA0LjEuMy4zLjQuCisg
ICAgICAgIGNvbnRlbnQgPSB0ZXh0RnJvbVhNTE5vZGUobm9kZSk7CisgICAgZWxzZQorICAgICAg
ICBjb250ZW50ID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworCisgICAgcmV0dXJuIGNvbnRlbnQ7
Cit9CisKK1N0cmluZyBSU1NBdG9tUGFyc2VyOjpwYXJzZUF1dGhvcih4bWxOb2RlKiBub2RlKQor
eworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOworCisgICAgU3RyaW5nIHVzZXJuYW1lOwor
ICAgIFN0cmluZyBlbWFpbDsKKworICAgIGZvciAobm9kZSA9IG5vZGUtPmNoaWxkcmVuOyBub2Rl
OyBub2RlID0gbm9kZS0+bmV4dCkgeworICAgICAgICBTdHJpbmcgbmFtZShyZWludGVycHJldF9j
YXN0PGNvbnN0IGNoYXIqPihub2RlLT5uYW1lKSk7CisgICAgICAgIG5hbWUubWFrZUxvd2VyKCk7
CisKKyAgICAgICAgaWYgKG5hbWUgPT0gIm5hbWUiKQorICAgICAgICAgICAgdXNlcm5hbWUgPSB0
ZXh0RnJvbVhNTE5vZGUobm9kZSk7CisgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gImVtYWlsIikK
KyAgICAgICAgICAgIGVtYWlsID0gdGV4dEZyb21YTUxOb2RlKG5vZGUpOworICAgIH0KKworICAg
IGlmICghZW1haWwuaXNFbXB0eSgpKSB7CisgICAgICAgIHVzZXJuYW1lICs9ICIgKCI7CisgICAg
ICAgIHVzZXJuYW1lICs9IGVtYWlsOworICAgICAgICB1c2VybmFtZSArPSAiKSI7CisgICAgfQor
CisgICAgcmV0dXJuIHVzZXJuYW1lOworfQorCitTdHJpbmcgUlNTQXRvbVBhcnNlcjo6cGFyc2VD
YXRlZ29yeSh4bWxOb2RlKiBub2RlKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJUKG5vZGUpOwor
CisgICAgU3RyaW5nIGNhdGVnb3J5OworCisgICAgZm9yICh4bWxBdHRyKiBhdHRyID0gbm9kZS0+
cHJvcGVydGllczsgYXR0cjsgYXR0ciA9IGF0dHItPm5leHQpIHsKKyAgICAgICAgU3RyaW5nIG5h
bWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYXR0ci0+bmFtZSkpOworICAgICAgICBu
YW1lLm1ha2VMb3dlcigpOworCisgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBsYWJlbCwgd2UgdXNl
IGl0LCBpZiBub3QsIHVzZSB0ZXJtIGF0dHJpYnV0ZSwgYXMgbGFiZWwgaXMKKyAgICAgICAgLy8g
b3B0aW9uYWwsIGJ1dCB0ZXJtIGlzIG1hbmRhdG9yeS4KKyAgICAgICAgaWYgKG5hbWUgPT0gImxh
YmVsIikgeworICAgICAgICAgICAgY2F0ZWdvcnkgPSB0ZXh0RnJvbVhNTEF0dHIoYXR0cik7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09ICJ0ZXJt
IikKKyAgICAgICAgICAgIGNhdGVnb3J5ID0gdGV4dEZyb21YTUxBdHRyKGF0dHIpOworICAgIH0K
KworICAgIHJldHVybiBjYXRlZ29yeTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9S
U1NBdG9tUGFyc2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVy
cnkvcnNzL1JTU0F0b21QYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li44NjVmNTBmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NBdG9tUGFyc2VyLmgKQEAgLTAsMCArMSw3OCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
TGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRl
IHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisj
aWZuZGVmIFJTU0F0b21QYXJzZXJfaAorI2RlZmluZSBSU1NBdG9tUGFyc2VyX2gKKworI2luY2x1
ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJSU1NQYXJzZXJCYXNlLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgUlNTQXRvbUxpbmsgeworcHVibGljOgorICAgIGVudW0gVHlwZSB7Cisg
ICAgICAgIFR5cGVVbmtub3duLAorICAgICAgICBUeXBlQWx0ZXJuYXRlLAorICAgICAgICBUeXBl
UmVsYXRlZCwKKyAgICAgICAgVHlwZVNlbGYsCisgICAgICAgIFR5cGVFbmNsb3N1cmUsCisgICAg
ICAgIFR5cGVWaWEsCisgICAgICAgIFR5cGVVbnN1cHBvcnRlZAorICAgIH07CisKKyAgICBSU1NB
dG9tTGluaygpCisgICAgICAgIDogbV90eXBlSW5FbnVtKFR5cGVVbmtub3duKQorICAgIHsgfQor
CisgICAgVHlwZSByZWxUeXBlKCk7CisKKyAgICBTdHJpbmcgbV9yZWw7CisgICAgU3RyaW5nIG1f
aHJlZjsKKyAgICBTdHJpbmcgbV9ocmVmbGFuZzsKKyAgICBTdHJpbmcgbV90eXBlOworICAgIFN0
cmluZyBtX3RpdGxlOworICAgIFN0cmluZyBtX2xlbmd0aDsKKworcHJpdmF0ZToKKyAgICBUeXBl
IG1fdHlwZUluRW51bTsKK307CisKK2NsYXNzIFJTU0F0b21QYXJzZXIgOiBwdWJsaWMgUlNTUGFy
c2VyQmFzZSB7CitwdWJsaWM6CisgICAgUlNTQXRvbVBhcnNlcigpOworCisgICAgYm9vbCBwYXJz
ZUJ1ZmZlcihjb25zdCBjaGFyKiBidWZmZXIsIGludCBsZW5ndGgsIGNvbnN0IGNoYXIqIHVybCwg
Y29uc3QgY2hhciogZW5jb2RpbmcpOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VYbWxEb2Mo
eG1sRG9jUHRyKTsKKyAgICBib29sIHBhcnNlSXRlbUJhc2VBdHRyaWJ1dGUoUlNTSXRlbUJhc2Uq
LCBjb25zdCBTdHJpbmcmIG5hbWUsIHhtbE5vZGUqLCBjb25zdCBTdHJpbmcmIGJhc2UpOworICAg
IFJTU0l0ZW0qIHBhcnNlSXRlbSh4bWxOb2RlKik7CisgICAgUlNTRmVlZCogcGFyc2VGZWVkKHht
bE5vZGUqKTsKKyAgICBSU1NBdG9tTGluayogcGFyc2VMaW5rKHhtbE5vZGUqKTsKKyAgICBSU1NF
bmNsb3N1cmUqIGVuY2xvc3VyZUZyb21MaW5rKFJTU0F0b21MaW5rKik7CisKKyAgICBTdHJpbmcg
cGFyc2VDb250ZW50KGNvbnN0IFN0cmluZyYgYmFzZSwgeG1sTm9kZSopOworICAgIFN0cmluZyBw
YXJzZUF1dGhvcih4bWxOb2RlKik7CisgICAgU3RyaW5nIHBhcnNlQ2F0ZWdvcnkoeG1sTm9kZSop
OworICAgIEtVUkwgbV91cmw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBSU1NBdG9tUGFyc2VyX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTRmlsdGVyU3RyZWFtLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTRmlsdGVyU3RyZWFtLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODkxNWJkCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NG
aWx0ZXJTdHJlYW0uY3BwCkBAIC0wLDAgKzEsNjcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh
cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJSU1NGaWx0ZXJTdHJlYW0uaCIKKworI2luY2x1ZGUgIlJTUzEwUGFyc2VyLmgi
CisjaW5jbHVkZSAiUlNTMjBQYXJzZXIuaCIKKyNpbmNsdWRlICJSU1NBdG9tUGFyc2VyLmgiCisj
aW5jbHVkZSAiUlNTR2VuZXJhdG9yLmgiCisjaW5jbHVkZSAiVGV4dENvZGVjSUNVLmgiCisKKyNp
bmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1Bc3NlcnQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5
UGxhdGZvcm1Mb2cuaD4KKyNpbmNsdWRlIDxTY29wZVBvaW50ZXIuaD4KKyNpbmNsdWRlIDxuZXR3
b3JrL05ldHdvcmtSZXF1ZXN0Lmg+CisjaW5jbHVkZSA8d3RmL0FTQ0lJQ1R5cGUuaD4KKyNpbmNs
dWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisK
K3VzaW5nIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsOwordXNpbmcgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbzsKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpMb2dMZXZlbFdhcm47Cit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TmV0d29ya1Jl
cXVlc3Q7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0
IHNfdXRmOEVuY29kaW5nTmFtZSA9ICJVVEYtOCI7CitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qg
c19sYXRpbjFFbmNvZGluZ05hbWUgPSAiSVNPLTg4NTktMSI7CitzdGF0aWMgY29uc3QgY2hhciog
Y29uc3Qgc19nYmtFbmNvZGluZ05hbWUgPSAiR0JLIjsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNv
bnN0IHNfY29udGVudEVuY29kaW5nSGVhZGVyS2V5ID0gIkNvbnRlbnQtRW5jb2RpbmciOworc3Rh
dGljIGNvbnN0IGNoYXIqIGNvbnN0IHNfY29udGVudExlbmd0aEhlYWRlcktleSA9ICJDb250ZW50
LUxlbmd0aCI7CitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc19jb250ZW50VHlwZUhlYWRlcktl
eSA9ICJDb250ZW50LVR5cGUiOworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc19hdG9tMTBW
ZXJzaW9uS2V5ID0gInhtbG5zIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2F0b20xMFZl
cnNpb25WYWx1ZSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iOworc3RhdGljIGNvbnN0
IGNoYXIqIGNvbnN0IHNfcnNzMTBWZXJzaW9uS2V5ID0gInhtbG5zIjsKK3N0YXRpYyBjb25zdCBj
aGFyKiBjb25zdCBzX3JzczEwVmVyc2lvblZhbHVlID0gImh0dHA6Ly9wdXJsLm9yZy9yc3MvMS4w
LyI7CitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc19yc3MyMFZlcnNpb25LZXkgPSAidmVyc2lv
biI7CitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qgc19yc3MyMFZlcnNpb25WYWx1ZSA9ICIyLjAi
Oworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHNfcnNzWG1sVmVyc2lvbktleSA9ICJ2ZXJzaW9u
IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX3Jzc1htbFZlcnNpb25WYWx1ZSA9ICIxLjAi
OworCitzdGF0aWMgaW50IGlzQVNDSUlTcGFjZUxvd2VyQnl0ZShpbnQgY2gpCit7CisgICAgcmV0
dXJuIGlzQVNDSUlTcGFjZTxpbnQ+KGNoICYgMHhmZik7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmlu
ZyYgc3RyaXBXaGl0ZVNwYWNlKHN0ZDo6c3RyaW5nJiBzdHIpCit7CisgICAgc3RyLmVyYXNlKHN0
ci5iZWdpbigpLCBzdGQ6OmZpbmRfaWYoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgc3RkOjpub3Qx
KHN0ZDo6cHRyX2Z1bjxpbnQsIGludD4oaXNBU0NJSVNwYWNlTG93ZXJCeXRlKSkpKTsKKyAgICBz
dHIuZXJhc2Uoc3RkOjpmaW5kX2lmKHN0ci5yYmVnaW4oKSwgc3RyLnJlbmQoKSwgc3RkOjpub3Qx
KHN0ZDo6cHRyX2Z1bjxpbnQsIGludD4oaXNBU0NJSVNwYWNlTG93ZXJCeXRlKSkpLmJhc2UoKSwg
c3RyLmVuZCgpKTsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZXF1
YWxJZ25vcmluZ0Nhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZpcnN0LCBjb25zdCBjaGFyKiBzZWNv
bmQpCit7CisgICAgcmV0dXJuICFzdHJjYXNlY21wKGZpcnN0LmNfc3RyKCksIHNlY29uZCk7Cit9
CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F0b21NSU1FVHlwZShjb25zdCBzdGQ6OnN0cmluZyYg
bWltZVR5cGUpCit7CisgICAgcmV0dXJuIGVxdWFsSWdub3JpbmdDYXNlKG1pbWVUeXBlLCAiYXBw
bGljYXRpb24vYXRvbSt4bWwiKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzUlNTTUlNRVR5
cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlKQoreworICAgIHJldHVybiBlcXVhbElnbm9y
aW5nQ2FzZShtaW1lVHlwZSwgImFwcGxpY2F0aW9uL3Jzcyt4bWwiKTsKK30KKworc3RhdGljIGlu
bGluZSBib29sIGlzUG90ZW50aWFsUlNTTUlNRVR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVU
eXBlKQoreworICAgIHJldHVybiAhc3RybmNtcChtaW1lVHlwZS5kYXRhKCksICJ0ZXh0L3htbCIs
IDgpIHx8ICFzdHJuY21wKG1pbWVUeXBlLmRhdGEoKSwgImFwcGxpY2F0aW9uL3htbCIsIDE1KTsK
K30KKworc3RhdGljIGlubGluZSBib29sIGlzUlNTQ29udGVudChSU1NGaWx0ZXJTdHJlYW06OlJl
c291cmNlVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0eXBlID09IFJTU0ZpbHRlclN0cmVhbTo6
VHlwZVJTUzEwCisgICAgICAgICAgICB8fCB0eXBlID09IFJTU0ZpbHRlclN0cmVhbTo6VHlwZVJT
UzIwCisgICAgICAgICAgICB8fCB0eXBlID09IFJTU0ZpbHRlclN0cmVhbTo6VHlwZVJTU0F0b207
Cit9CisKK3N0YXRpYyBSU1NGaWx0ZXJTdHJlYW06OlJlc291cmNlVHlwZSBSU1NUeXBlRnJvbUNv
bnRlbnRUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50VHlwZSkKK3sKKyAgICBpZiAoY29u
dGVudFR5cGUuZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VHlwZVVu
a25vd247CisKKyAgICBzdGQ6OnN0cmluZyBtaW1lVHlwZTsKKyAgICBzdGQ6OnN0cmluZyB2ZXJz
aW9uOworICAgIGJvb2wgaXNSU1MgPSBmYWxzZTsKKworICAgIC8vIFRoZSBjb250ZW50VHlwZSBj
YW4gY29udGFpbiBib3RoIGEgbWltZSB0eXBlIGFuZCB2ZXJzaW9uIGF0dHJpYnV0ZXMKKyAgICAv
LyBJZiB3ZSBhbHJlYWR5IGtub3cgdGhlIHR5cGUgaXMgQXRvbSwgd2UgZG9uJ3QgbmVlZCBlaXRo
ZXIgb2YgdGhlc2UsIHNvIHNraXAgaXQKKyAgICBmb3IgKHNpemVfdCBzdGFydCA9IDAsIGRlbGlt
aXRlciA9IDA7IGRlbGltaXRlciAhPSBzdGQ6OnN0cmluZzo6bnBvczsgc3RhcnQgPSBkZWxpbWl0
ZXIgKyAxKSB7CisgICAgICAgIGRlbGltaXRlciA9IGNvbnRlbnRUeXBlLmZpbmQoJzsnLCBzdGFy
dCk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcG9uZW50ID0gY29udGVudFR5cGUuc3Vic3Ry
KHN0YXJ0LCBkZWxpbWl0ZXIgPT0gc3RkOjpzdHJpbmc6Om5wb3MgPyBkZWxpbWl0ZXIgOiBkZWxp
bWl0ZXIgLSBzdGFydCk7CisKKyAgICAgICAgaWYgKG1pbWVUeXBlLmVtcHR5KCkpIHsKKyAgICAg
ICAgICAgIGlmIChpc0F0b21NSU1FVHlwZShjb21wb25lbnQpKQorICAgICAgICAgICAgICAgIHJl
dHVybiBSU1NGaWx0ZXJTdHJlYW06OlR5cGVSU1NBdG9tOworCisgICAgICAgICAgICBpZiAoaXNS
U1NNSU1FVHlwZShjb21wb25lbnQpKSB7CisgICAgICAgICAgICAgICAgLy8gZGVmaW5pdGVseSBu
b3QgYSB2ZXJzaW9uIGF0dHJpYnV0ZSwgc2tpcCB0byBuZXh0IHRva2VuCisgICAgICAgICAgICAg
ICAgbWltZVR5cGUgPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgaXNSU1MgPSB0cnVlOwor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgc2l6ZV90IGVxdWFsc2lnbiA9IGNvbXBvbmVudC5maW5kKCc9Jyk7CisgICAgICAgIGlm
IChlcXVhbHNpZ24gIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgZXF1YWxJZ25vcmluZ0Nhc2UoY29t
cG9uZW50LnN1YnN0cigwLCBlcXVhbHNpZ24pLCAidmVyc2lvbiIpKQorICAgICAgICAgICAgdmVy
c2lvbiA9IGNvbXBvbmVudC5zdWJzdHIoZXF1YWxzaWduICsgMSk7CisKKyAgICAgICAgLy8gQ2hl
Y2sgaWYgd2Ugbm93IGhhdmUgZm91bmQgYm90aCBNSU1FIHR5cGUgYW5kIHZlcnNpb24KKyAgICAg
ICAgaWYgKCFtaW1lVHlwZS5lbXB0eSgpICYmICF2ZXJzaW9uLmVtcHR5KCkpCisgICAgICAgICAg
ICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaXNSU1MpIHsKKyAgICAgICAgaWYgKCF2ZXJzaW9u
LmNvbXBhcmUoIjEuMCIpKQorICAgICAgICAgICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VHlw
ZVJTUzEwOworCisgICAgICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlR5cGVSU1MyMDsKKyAg
ICB9CisKKyAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUeXBlVW5rbm93bjsKK30KKworc3Rh
dGljIFJTU0ZpbHRlclN0cmVhbTo6UmVzb3VyY2VUeXBlIFJTU1R5cGVGcm9tQ29udGVudChjb25z
dCBjaGFyKiBzdHIsIGludCBzdHJMZW4pCit7CisgICAgLy8gTG9jYXRlIHhtbCBzaWduYXR1cmUu
CisgICAgY29uc3QgY2hhciogcG9zID0gc3RyOworCisgICAgLy8gTG9jYXRlIHRoZSBSU1MgdGFn
cy4KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBwb3MgPSBzdHJjaHIocG9zLCAnPCcpOwor
ICAgICAgICBpZiAoIXBvcyB8fCAocG9zIC0gc3RyID49IHN0ckxlbikpIHsKKyAgICAgICAgICAg
IEJCTE9HKExvZ0xldmVsSW5mbywgIlJTU1R5cGVGcm9tQ29udGVudCgpOiBjYW4gbm90IGZpbmQg
YW55IHN0YXJ0IHRhZyIpOworICAgICAgICAgICAgcmV0dXJuIFJTU0ZpbHRlclN0cmVhbTo6VHlw
ZVVua25vd247CisgICAgICAgIH0KKworICAgICAgICArK3BvczsKKworICAgICAgICBpZiAoIXN0
cm5jYXNlY21wKHBvcywgInJzcyIsIDMpKSB7CisgICAgICAgICAgICBpZiAoaXNTcGFjZU9yTmV3
bGluZSgqKHBvcyArIDMpKSkgeworICAgICAgICAgICAgICAgIEJCTE9HKExvZ0xldmVsSW5mbywg
IlJTU1R5cGVGcm9tQ29udGVudCgpOiBmb3VuZCBSU1MgMi4wIHRhZyIpOworICAgICAgICAgICAg
ICAgIHJldHVybiBSU1NGaWx0ZXJTdHJlYW06OlR5cGVSU1MyMDsKKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgQkJMT0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlwZUZyb21Db250ZW50KCk6IHdy
b25nIFJTUyAyLjAgdGFnOiAlLipzIiwgMzIsIHBvcyk7CisgICAgICAgICAgICByZXR1cm4gUlNT
RmlsdGVyU3RyZWFtOjpUeXBlVW5rbm93bjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3Ry
bmNhc2VjbXAocG9zLCAiZmVlZCIsIDQpKSB7CisgICAgICAgICAgICBpZiAoaXNTcGFjZU9yTmV3
bGluZSgqKHBvcyArIDQpKSkgeworICAgICAgICAgICAgICAgIEJCTE9HKExvZ0xldmVsSW5mbywg
IlJTU1R5cGVGcm9tQ29udGVudCgpOiBmb3VuZCBBdG9tIDEuMCB0YWciKTsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUeXBlUlNTQXRvbTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgQkJMT0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlwZUZyb21Db250ZW50KCk6
IHdyb25nIEF0b20gMS4wIHRhZzogJS4qcyIsIDMyLCBwb3MpOworICAgICAgICAgICAgcmV0dXJu
IFJTU0ZpbHRlclN0cmVhbTo6VHlwZVVua25vd247CisgICAgICAgIH0KKworICAgICAgICBpZiAo
IXN0cm5jYXNlY21wKHBvcywgInJkZjpSREYiLCA3KSkgeworICAgICAgICAgICAgaWYgKGlzU3Bh
Y2VPck5ld2xpbmUoKihwb3MgKyA3KSkpIHsKKyAgICAgICAgICAgICAgICBCQkxPRyhMb2dMZXZl
bEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogZm91bmQgUlNTIDEuMCB0YWciKTsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUeXBlUlNTMTA7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIEJCTE9HKExvZ0xldmVsSW5mbywgIlJTU1R5cGVGcm9tQ29udGVu
dCgpOiB3cm9uZyBSU1MgMS4wIHRhZzogJS4qcyIsIDMyLCBwb3MpOworICAgICAgICAgICAgcmV0
dXJuIFJTU0ZpbHRlclN0cmVhbTo6VHlwZVVua25vd247CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIXN0cm5jYXNlY21wKHBvcywgIj94bWwiLCA0KSkgeworICAgICAgICAgICAgQkJMT0coTG9n
TGV2ZWxJbmZvLCAiUlNTVHlwZUZyb21Db250ZW50KCk6IGZvdW5kIGFub3RoZXIgeG1sIHRhZyIp
OworICAgICAgICAgICAgLy8gVGhpcyBpcyBhbm90aGVyIHhtbCBpbmZvLCBza2lwIGl0LgorICAg
ICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICBwb3MgPSBzdHJzdHIocG9zLCAiPz4iKTsK
KworICAgICAgICAgICAgaWYgKCFwb3MgfHwgKHBvcyAtIHN0ciA+PSBzdHJMZW4pKSB7CisgICAg
ICAgICAgICAgICAgQkJMT0coTG9nTGV2ZWxJbmZvLCAiUlNTVHlwZUZyb21Db250ZW50KCk6IGV4
dHJhIHhtbCB0YWcgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUlNTRmlsdGVy
U3RyZWFtOjpUeXBlVW5rbm93bjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9zICs9
IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3Ry
bmNhc2VjbXAocG9zLCAiIS0tIiwgMykpIHsKKyAgICAgICAgICAgIEJCTE9HKExvZ0xldmVsSW5m
bywgIlJTU1R5cGVGcm9tQ29udGVudCgpOiBmb3VuZCBjb21tZW50cyIpOworICAgICAgICAgICAg
Ly8gVGhpcyBpcyBjb21tZW50cywgc2tpcCBpdC4KKyAgICAgICAgICAgIHBvcyArPSAzOworICAg
ICAgICAgICAgcG9zID0gc3Ryc3RyKHBvcywgIi0tPiIpOworCisgICAgICAgICAgICBpZiAoIXBv
cyB8fCAocG9zIC0gc3RyID49IHN0ckxlbikpIHsKKyAgICAgICAgICAgICAgICBCQkxPRyhMb2dM
ZXZlbEluZm8sICJSU1NUeXBlRnJvbUNvbnRlbnQoKTogY29tbWVudHMgdG9vIGxvbmciKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gUlNTRmlsdGVyU3RyZWFtOjpUeXBlVW5rbm93bjsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgcG9zICs9IDM7CisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgfQorCisgICAgICAgIEJCTE9HKExvZ0xldmVsSW5mbywgIlJTU1R5cGVGcm9tQ29u
dGVudCgpOiBub24gcnNzIHR5cGUgKCUuKnMpIGZvdW5kIiwgMzIsIHBvcyk7CisgICAgICAgIHJl
dHVybiBSU1NGaWx0ZXJTdHJlYW06OlR5cGVVbmtub3duOworICAgIH0KKworICAgIHJldHVybiBS
U1NGaWx0ZXJTdHJlYW06OlR5cGVVbmtub3duOworfQorCitzdGF0aWMgUGFzc093blB0cjxSU1NQ
YXJzZXJCYXNlPiBjcmVhdGVQYXJzZXIoUlNTRmlsdGVyU3RyZWFtOjpSZXNvdXJjZVR5cGUgdHlw
ZSkKK3sKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChpc1JTU0NvbnRlbnQodHlwZSkpOworCisgICAg
c3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBSU1NGaWx0ZXJTdHJlYW06OlR5cGVSU1NBdG9tOgor
ICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFJTU0F0b21QYXJzZXIoKSk7CisgICAgY2FzZSBS
U1NGaWx0ZXJTdHJlYW06OlR5cGVSU1MxMDoKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBS
U1MxMFBhcnNlcigpKTsKKyAgICBjYXNlIFJTU0ZpbHRlclN0cmVhbTo6VHlwZVJTUzIwOgorICAg
ICAgICByZXR1cm4gYWRvcHRQdHIobmV3IFJTUzIwUGFyc2VyKCkpOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBqdXN0IGZvciBjb21waWxlciwgaXQgc2hv
dWxkIG5ldmVyIHJlYWNoIGhlcmUuCisgICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgUlNTMjBQ
YXJzZXIoKSk7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBmaW5kWE1MRW5jb2RpbmdQb3NpdGlv
bihjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqJiBlbmNvZGluZ1N0YXJ0LCBjb25zdCBjaGFy
KiYgZW5jb2RpbmdFbmQpCit7CisgICAgZW5jb2RpbmdTdGFydCA9IHN0cnN0cihzdHIsICI8P3ht
bCAiKTsKKyAgICBpZiAoIWVuY29kaW5nU3RhcnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGVuY29kaW5nU3RhcnQgKz0gNjsgLy8gTGVuZ3RoIG9mICI8P3htbCAiLgorICAgIGNoYXIq
IGVuZFBvcyA9IHN0cnN0cihjb25zdF9jYXN0PGNoYXIqPihlbmNvZGluZ1N0YXJ0KSwgIj8+Iik7
CisgICAgaWYgKCFlbmRQb3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGVuY29kaW5n
U3RhcnQgPSBzdHJzdHIoY29uc3RfY2FzdDxjaGFyKj4oZW5jb2RpbmdTdGFydCksICJlbmNvZGlu
ZyIpOworCisgICAgaWYgKCFlbmNvZGluZ1N0YXJ0IHx8IGVuY29kaW5nU3RhcnQgPiBlbmRQb3Mp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGVuY29kaW5nU3RhcnQgKz0gODsKKworICAg
IHdoaWxlIChlbmNvZGluZ1N0YXJ0IDwgZW5kUG9zICYmICplbmNvZGluZ1N0YXJ0IDw9ICcgJykK
KyAgICAgICAgKytlbmNvZGluZ1N0YXJ0OworCisgICAgaWYgKGVuY29kaW5nU3RhcnQgPT0gZW5k
UG9zIHx8ICplbmNvZGluZ1N0YXJ0ICE9ICc9JykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgKytlbmNvZGluZ1N0YXJ0OworCisgICAgd2hpbGUgKGVuY29kaW5nU3RhcnQgPCBlbmRQb3Mg
JiYgKmVuY29kaW5nU3RhcnQgPD0gJyAnKQorICAgICAgICArK2VuY29kaW5nU3RhcnQ7CisKKyAg
ICBpZiAoZW5jb2RpbmdTdGFydCA9PSBlbmRQb3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGNoYXIgcXVvdGUgPSAqZW5jb2RpbmdTdGFydDsKKyAgICBpZiAocXVvdGUgIT0gJ1wiJyAm
JiBxdW90ZSAhPSAnXCcnKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICArK2VuY29kaW5n
U3RhcnQ7CisgICAgZW5jb2RpbmdFbmQgPSBzdHJjaHIoY29uc3RfY2FzdDxjaGFyKj4oZW5jb2Rp
bmdTdGFydCksIHF1b3RlKTsKKworICAgIGlmICghZW5jb2RpbmdFbmQgfHwgZW5jb2RpbmdFbmQg
PT0gZW5jb2RpbmdTdGFydCB8fCBlbmNvZGluZ0VuZCA+IGVuZFBvcykKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGZpbmRYTUxMYW5n
dWFnZVBvc2l0aW9uKGNvbnN0IGNoYXIqIHN0ciwgY29uc3QgY2hhciomIGxhbmdTdGFydCwgY29u
c3QgY2hhciomIGxhbmdFbmQpCit7CisgICAgbGFuZ1N0YXJ0ID0gc3Ryc3RyKGNvbnN0X2Nhc3Q8
Y2hhcio+KHN0ciksICI8bGFuZ3VhZ2U+Iik7CisgICAgaWYgKCFsYW5nU3RhcnQpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGxhbmdTdGFydCArPSAxMDsgLy8gTGVuZ3RoIG9mICI8bGFu
Z3VhZ2U+Ii4KKyAgICBjaGFyKiBlbmRQb3MgPSBzdHJzdHIoY29uc3RfY2FzdDxjaGFyKj4obGFu
Z1N0YXJ0KSwgIjwvbGFuZ3VhZ2U+Iik7CisgICAgaWYgKCFlbmRQb3MpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHdoaWxlIChsYW5nU3RhcnQgPCBlbmRQb3MgJiYgKmxhbmdTdGFydCA8
PSAnICcpCisgICAgICAgICsrbGFuZ1N0YXJ0OworCisgICAgaWYgKGxhbmdTdGFydCA9PSBlbmRQ
b3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGxhbmdFbmQgPSBlbmRQb3MgLSAxOwor
CisgICAgd2hpbGUgKGxhbmdFbmQgPiBsYW5nU3RhcnQgJiYgKmxhbmdFbmQgPD0gJyAnKQorICAg
ICAgICAtLWxhbmdFbmQ7CisKKyAgICArK2xhbmdFbmQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K3N0YXRpYyBjb25zdCBjaGFyKiBkZWZhdWx0RW5jb2RpbmdGb3JMYW5ndWFnZShjb25zdCBjaGFy
KiBsYW5ndWFnZSkKK3sKKyAgICBpZiAoIXN0cmNhc2VjbXAobGFuZ3VhZ2UsICJlbiIpCisgICAg
ICAgIHx8ICFzdHJjYXNlY21wKGxhbmd1YWdlLCAiZW4tVVMiKSkKKyAgICAgICAgcmV0dXJuIHNf
bGF0aW4xRW5jb2RpbmdOYW1lOworICAgIGlmICghc3RyY2FzZWNtcChsYW5ndWFnZSwgInpoLWNu
IikpCisgICAgICAgIHJldHVybiBzX2dia0VuY29kaW5nTmFtZTsKKworICAgIHJldHVybiAwOwor
fQorCitzdGF0aWMgYm9vbCBpc1RyYW5zY29kaW5nTmVlZGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBl
bmNvZGluZykKK3sKKyAgICAvLyBXaGVuIHRoZXJlJ3Mgbm8gZW5jb2RpbmcgaW5mb3JtYXRpb24s
IG9yIHRoZSBlbmNvZGluZyBjYW4gbm90IGJlIGZvdW5kIGluIGFsbCBlbmNvZGluZ3MKKyAgICAv
LyBzdXBwb3J0ZWQgaW4gb3VyIHBob25lLCB3ZSB3aWxsIHRyeSB0byB0cmFuc2NvZGUgdGhlIGNv
bnRlbnQgYW55d2F5LCBzdXBwb3NlZCB0byBBU0NJSS4KKworICAgIGlmIChlbmNvZGluZy5lbXB0
eSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBUZXh0RW5jb2Rpbmcoc191
dGY4RW5jb2RpbmdOYW1lKSAhPSBUZXh0RW5jb2RpbmcoZW5jb2RpbmcuY19zdHIoKSk7Cit9CisK
K2VudW0gVHJhbnNjb2RlUmVzdWx0IHsKKyAgICBTdWNjZXNzLAorICAgIFNvdXJjZUVuY29kaW5n
VW5zdXBwb3J0ZWQsCisgICAgU291cmNlQnJva2VuLAorICAgIFRhcmdldEVuY29kaW5nVW5zdXBw
b3J0ZWQsCisgICAgVGFyZ2V0QnVmZmVySW5zdWZmaWNpZW50Cit9OworCitzdGF0aWMgVHJhbnNj
b2RlUmVzdWx0IHRyYW5zY29kZShjb25zdCBjaGFyKiBzb3VyY2VFbmNvZGluZywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRhcmdldEVuY29kaW5nLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciomIHNvdXJjZVN0YXJ0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUxlbmd0aCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqJiB0YXJnZXRTdGFydCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRMZW5ndGgpCit7Cisg
ICAgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ1NvdXJjZShzb3VyY2VFbmNvZGluZyk7CisgICAg
aWYgKCF0ZXh0RW5jb2RpbmdTb3VyY2UuaXNWYWxpZCgpKQorICAgICAgICByZXR1cm4gU291cmNl
RW5jb2RpbmdVbnN1cHBvcnRlZDsKKworICAgIFRleHRFbmNvZGluZyB0ZXh0RW5jb2RpbmdUYXJn
ZXQodGFyZ2V0RW5jb2RpbmcpOworICAgIGlmICghdGV4dEVuY29kaW5nVGFyZ2V0LmlzVmFsaWQo
KSkKKyAgICAgICAgcmV0dXJuIFRhcmdldEVuY29kaW5nVW5zdXBwb3J0ZWQ7CisKKyAgICBib29s
IHNhd0Vycm9yID0gZmFsc2U7CisgICAgU3RyaW5nIHVjczIgPSBUZXh0Q29kZWNJQ1UodGV4dEVu
Y29kaW5nU291cmNlKS5kZWNvZGUoc291cmNlU3RhcnQsIHNvdXJjZUxlbmd0aCwgdHJ1ZSwgdHJ1
ZSwgc2F3RXJyb3IpOworCisgICAgaWYgKHNhd0Vycm9yKQorICAgICAgICByZXR1cm4gU291cmNl
QnJva2VuOworCisgICAgQ1N0cmluZyBlbmNvZGVkID0gVGV4dENvZGVjSUNVKHRleHRFbmNvZGlu
Z1RhcmdldCkuZW5jb2RlKHVjczIuY2hhcmFjdGVycygpLCB1Y3MyLmxlbmd0aCgpLCBXZWJDb3Jl
OjpFbnRpdGllc0ZvclVuZW5jb2RhYmxlcyk7CisgICAgaWYgKGVuY29kZWQubGVuZ3RoKCkgPiB0
YXJnZXRMZW5ndGgpCisgICAgICAgIHJldHVybiBUYXJnZXRCdWZmZXJJbnN1ZmZpY2llbnQ7CisK
KyAgICBzdHJuY3B5KHRhcmdldFN0YXJ0LCBlbmNvZGVkLmRhdGEoKSwgZW5jb2RlZC5sZW5ndGgo
KSk7CisgICAgdGFyZ2V0U3RhcnQgKz0gZW5jb2RlZC5sZW5ndGgoKTsKKworICAgIHJldHVybiBT
dWNjZXNzOworfQorCitzdGF0aWMgYm9vbCB0cmFuc2NvZGVDb250ZW50KGNvbnN0IHN0ZDo6c3Ry
aW5nJiBjb250ZW50LCBjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RpbmcsIHN0ZDo6c3RyaW5nJiBy
ZXN1bHQpCit7CisgICAgdW5zaWduZWQgdXRmOGxlbmd0aCA9IGNvbnRlbnQuc2l6ZSgpICogMyAv
IDI7IC8vIFVzZSBtYXhpbXVtIG51bWJlciB1dGYtOCBsZW5ndGguCisgICAgU2NvcGVBcnJheTxj
aGFyPiBidWZmZXIobmV3IGNoYXJbdXRmOGxlbmd0aCArIDFdKTsKKworICAgIHN0ZDo6c3RyaW5n
IHhtbEhlYWRlclN0cmluZzsKKworICAgIGNvbnN0IGNoYXIqIHN0YXJ0ID0gY29udGVudC5jX3N0
cigpOworICAgIGNvbnN0IGNoYXIqIHhtbFN0YXJ0ID0gc3Ryc3RyKHN0YXJ0LCAiPD94bWwgIik7
CisgICAgY29uc3QgY2hhciogeG1sRW5kOworICAgIGlmICh4bWxTdGFydCkgeworICAgICAgICB4
bWxFbmQgPSBzdHJzdHIoeG1sU3RhcnQsICI/PiIpOworICAgICAgICBpZiAoIXhtbEVuZCkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgeG1sRW5kICs9IDI7IC8vIExlbmd0aCBv
ZiAiPz4iLgorCisgICAgICAgIGNvbnN0IGNoYXIqIGVuY29kaW5nU3RhcnQ7CisgICAgICAgIGNv
bnN0IGNoYXIqIGVuY29kaW5nRW5kOworICAgICAgICBpZiAoZmluZFhNTEVuY29kaW5nUG9zaXRp
b24oc3RhcnQsIGVuY29kaW5nU3RhcnQsIGVuY29kaW5nRW5kKSkgeworICAgICAgICAgICAgeG1s
SGVhZGVyU3RyaW5nLmFzc2lnbihzdGFydCwgZW5jb2RpbmdTdGFydCAtIHN0YXJ0KTsKKyAgICAg
ICAgICAgIHhtbEhlYWRlclN0cmluZy5hcHBlbmQoc191dGY4RW5jb2RpbmdOYW1lKTsKKyAgICAg
ICAgICAgIHhtbEhlYWRlclN0cmluZy5hcHBlbmQoZW5jb2RpbmdFbmQsIHhtbEVuZCAtIGVuY29k
aW5nRW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHhtbEhlYWRlclN0cmluZy5h
c3NpZ24oc3RhcnQsICh4bWxFbmQgLSAyKSAtIHN0YXJ0KTsKKyAgICAgICAgICAgIHhtbEhlYWRl
clN0cmluZy5hcHBlbmQoIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOworICAgICAgICB9CisgICAg
fSBlbHNlIHsKKyAgICAgICAgeG1sRW5kID0gc3RhcnQ7CisgICAgICAgIHhtbEhlYWRlclN0cmlu
ZyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iOworICAgIH0K
KworICAgIGNvbnN0IGNoYXIqIGNvbnRlbnRTdGFydCA9IHhtbEVuZDsKKyAgICBjaGFyKiBidWZm
ZXJTdGFydCA9ICZidWZmZXJbMF07CisKKyAgICBUcmFuc2NvZGVSZXN1bHQgdHJhbnNjb2RlUmVz
dWx0ID0gdHJhbnNjb2RlKGVuY29kaW5nLmNfc3RyKCksIHNfdXRmOEVuY29kaW5nTmFtZSwgY29u
dGVudFN0YXJ0LCBjb250ZW50Lmxlbmd0aCgpIC0gKHhtbEVuZCAtIHhtbFN0YXJ0KSwgYnVmZmVy
U3RhcnQsIHV0ZjhsZW5ndGgpOworCisgICAgLy8gSWYgdGhlIGVuY29kaW5nIGlzIG5vdCBzdXBw
b3J0ZWQsIG9yIGlmIHdlIGZhaWxlZCB0byB0cmFuc2NvZGUgdGhlIGNvbnRlbnQsIHdlIHdpbGwg
anVzdAorICAgIC8vIGVuY29kZSB0aGUgY29udGVudCB0byBBU0NJSSBjb250ZW50LCBhbmQgcmVw
bGFjaW5nIGFueSBub24tQVNDSUkgY2hhcmFjdGVyIHdpdGggYSBxdWVzdGlvbgorICAgIC8vIG1h
cmsuIFRoaXMgd2lsbCBiZSBiZXR0ZXIgdGhhbiBkaXNwbGF5aW5nIHRoZSByYXcgdGV4dCwgYXMg
dGhlIHJhdyB0ZXh0IGNhbiBub3QgYmUgZGlzcGxheWVkCisgICAgLy8gY29ycmVjdGx5IGFueXdh
eSwgYXMgdGhlaXIgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZC4KKworICAgIGlmIChTdWNjZXNz
ICE9IHRyYW5zY29kZVJlc3VsdCkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAo
OyBjb250ZW50U3RhcnQgPCBzdGFydCArIGNvbnRlbnQuc2l6ZSgpIDsgKytjb250ZW50U3RhcnQs
ICsraSkgeworICAgICAgICAgICAgaWYgKGlzQVNDSUlQcmludGFibGUoKmNvbnRlbnRTdGFydCkp
CisgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gKmNvbnRlbnRTdGFydDsKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAnPyc7CisgICAgICAgIH0KKworICAg
ICAgICBidWZmZXJbaV0gPSAwOworICAgIH0gZWxzZQorICAgICAgICAqYnVmZmVyU3RhcnQgPSAw
OworCisgICAgcmVzdWx0LmFzc2lnbih4bWxIZWFkZXJTdHJpbmcpOworICAgIHJlc3VsdC5hcHBl
bmQoJmJ1ZmZlclswXSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUlNTRmlsdGVyU3RyZWFt
OjpSU1NGaWx0ZXJTdHJlYW0oKQorICAgIDogRmlsdGVyU3RyZWFtKCkKKyAgICAsIG1fcmVzb3Vy
Y2VUeXBlKFR5cGVVbmtub3duKQorICAgICwgbV9jb250ZW50VHlwZUluZGV4KC0xKQorICAgICwg
bV9jaGFyc2V0Q2hlY2tlZChmYWxzZSkKKyAgICAsIG1fZW5jb2RpbmdDaGVja2VkKGZhbHNlKQor
eworfQorCit2b2lkIFJTU0ZpbHRlclN0cmVhbTo6bm90aWZ5U3RhdHVzUmVjZWl2ZWQoaW50IHN0
YXR1cywgY29uc3QgY2hhciogbWVzc2FnZSkKK3sKKyAgICAvLyBOb24tSFRUUCBlcnJvcnMgaGF2
ZSBubyBkYXRhIHRvIGRpc3BsYXksIGFuZCByZWRpcmVjdHMgd2lsbCBuZXZlciBiZSBkaXNwbGF5
ZWQsCisgICAgLy8gc28gbm8gbmVlZCB0byBjaGVjayBpZiB0aGV5IGhhdmUgUlNTIGRhdGEKKyAg
ICAvLyBIVFRQIGVycm9ycyBtYXkgaGF2ZSBkYXRhLCBhbmQgaW4gdGhlb3J5IGl0IGNvdWxkIGJl
IFJTUyBkYXRhIChhbHRob3VnaCBpdCdzIGhpZ2hseQorICAgIC8vIHVubGlrZWx5KSBzbyBiZXR0
ZXIgdG8ga2VlcCBjaGVja2luZyB0aGVtLgorICAgIGlmIChzdGF0dXMgPCAwIHx8ICgzMDAgPD0g
c3RhdHVzICYmIHN0YXR1cyA8IDQwMCAmJiBzdGF0dXMgIT0gMzA0KSkgeworICAgICAgICBtX3Jl
c291cmNlVHlwZSA9IFR5cGVOb3RSU1M7CisgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHdlIHdp
bGwgZ2V0IDIgc3RhdHVzIGNvZGUuCisgICAgICAgIHNlbmRTYXZlZEhlYWRlcnMoKTsKKyAgICB9
CisKKyAgICBGaWx0ZXJTdHJlYW06Om5vdGlmeVN0YXR1c1JlY2VpdmVkKHN0YXR1cywgbWVzc2Fn
ZSk7Cit9CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpub3RpZnlIZWFkZXJzUmVjZWl2ZWQoTmV0
d29ya1JlcXVlc3Q6OkhlYWRlckxpc3QmIGhlYWRlcnMpCit7CisgICAgaWYgKCFpc1JTU0NvbnRl
bnQobV9yZXNvdXJjZVR5cGUpKSB7CisgICAgICAgIE5ldHdvcmtSZXF1ZXN0OjpIZWFkZXJMaXN0
Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBoZWFkZXJzLmVuZCgpOworICAgICAgICBOZXR3b3JrUmVx
dWVzdDo6SGVhZGVyTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGhlYWRlcnMuYmVnaW4oKTsK
KyAgICAgICAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKKyAgICAgICAgICAgIGlmIChl
cXVhbElnbm9yaW5nQ2FzZShpdGVyLT5maXJzdCwgc19jb250ZW50VHlwZUhlYWRlcktleSkpIHsK
KyAgICAgICAgICAgICAgICBpZiAoaXRlci0+c2Vjb25kLmZpbmQoInhtbCIpICE9IHN0ZDo6c3Ry
aW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgICAgIG1fY29udGVudFR5cGVJbmRleCA9IHN0
ZDo6ZGlzdGFuY2UoTmV0d29ya1JlcXVlc3Q6OkhlYWRlckxpc3Q6OmNvbnN0X2l0ZXJhdG9yKGhl
YWRlcnMuYmVnaW4oKSksIGl0ZXIpOworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUg
dHlwZSA9IFJTU1R5cGVGcm9tQ29udGVudFR5cGUoaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKGlzUlNTQ29udGVudCh0eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IG1fcmVzb3VyY2VUeXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWlz
UG90ZW50aWFsUlNTTUlNRVR5cGUoaXRlci0+c2Vjb25kKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIG1fcmVzb3VyY2VUeXBlID0gVHlwZU5vdFJTUzsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBpZiAobV9jb250ZW50VHlwZUluZGV4IDwgMCkKKyAgICAgICAgbV9yZXNvdXJjZVR5cGUgPSBU
eXBlTm90UlNTOworCisgICAgaWYgKG1fcmVzb3VyY2VUeXBlID09IFR5cGVOb3RSU1MpIHsKKyAg
ICAgICAgc2VuZFNhdmVkSGVhZGVycygpOworICAgICAgICBGaWx0ZXJTdHJlYW06Om5vdGlmeUhl
YWRlcnNSZWNlaXZlZChoZWFkZXJzKTsKKyAgICB9IGVsc2UKKyAgICAgICAgc2F2ZUhlYWRlcnMo
aGVhZGVycyk7Cit9CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpub3RpZnlEYXRhUmVjZWl2ZWQo
QmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICAvLyBI
ZXJlIHdlIGFzc3VtZSB0aGUgZmlyc3QgcGFja2V0IG9mIGRhdGEgaXMgZW5vdWdoIGZvciB1cyB0
byBzbmlmZiB0aGUgY29udGVudCB0eXBlLgorICAgIC8vIElmIHNvbWVkYXkgc29tZSBkZWNlbnQg
cmVhbCBsaWZlIHdlYiBzaXRlIHZvaWQgdGhpcyBhc3N1bXB0aW9uLCB3ZSBzaG91bGQgcmUtaW1w
bGVtZW50CisgICAgLy8gdGhpcyBjb2RlLiBCdXQgZm9yIG5vdyBpdCBzaG91bGQgYmUganVzdCBm
aW5lLgorICAgIGlmIChtX3Jlc291cmNlVHlwZSA9PSBUeXBlVW5rbm93bikKKyAgICAgICAgbV9y
ZXNvdXJjZVR5cGUgPSBSU1NUeXBlRnJvbUNvbnRlbnQoQmxhY2tCZXJyeTo6UGxhdGZvcm06Om5l
dHdvcmtCdWZmZXJEYXRhKGJ1ZmZlciksIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpuZXR3b3JrQnVm
ZmVyRGF0YUxlbmd0aChidWZmZXIpKTsKKworICAgIC8vIElmIHdlIGRvbid0IGtub3cgdGhlIHJl
c291cmNlIHR5cGUgYXQgdGhpcyBzdGFnZSwgdGhlbiBpdCBpcyBub3QgYSBSU1MgY29udGVudC4K
KyAgICBpZiAobV9yZXNvdXJjZVR5cGUgPT0gVHlwZVVua25vd24pCisgICAgICAgIG1fcmVzb3Vy
Y2VUeXBlID0gVHlwZU5vdFJTUzsKKworICAgIGlmIChpc1JTU0NvbnRlbnQobV9yZXNvdXJjZVR5
cGUpKQorICAgICAgICBhcHBlbmREYXRhKGJ1ZmZlcik7CisgICAgZWxzZSB7CisgICAgICAgIHNl
bmRTYXZlZEhlYWRlcnMoKTsKKyAgICAgICAgRmlsdGVyU3RyZWFtOjpub3RpZnlEYXRhUmVjZWl2
ZWQoYnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgUlNTRmlsdGVyU3RyZWFtOjpub3RpZnlDbG9z
ZShpbnQgc3RhdHVzKQoreworICAgIGlmIChpc1JTU0NvbnRlbnQobV9yZXNvdXJjZVR5cGUpKQor
ICAgICAgICBoYW5kbGVSU1NDb250ZW50KCk7CisgICAgZWxzZQorICAgICAgICBGaWx0ZXJTdHJl
YW06Om5vdGlmeUNsb3NlKHN0YXR1cyk7Cit9CisKK2Jvb2wgUlNTRmlsdGVyU3RyZWFtOjpjb252
ZXJ0Q29udGVudFRvSHRtbChzdGQ6OnN0cmluZyYgcmVzdWx0KQoreworICAgIGJvb2wgc3VjY2Vz
cyA9IGZhbHNlOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlID0gdXJsKCk7CisgICAgY29u
c3Qgc3RkOjpzdHJpbmcmIGVuYyA9IGVuY29kaW5nKCk7CisKKyAgICBPd25QdHI8UlNTUGFyc2Vy
QmFzZT4gcGFyc2VyID0gY3JlYXRlUGFyc2VyKG1fcmVzb3VyY2VUeXBlKTsKKworICAgIGlmIChp
c1RyYW5zY29kaW5nTmVlZGVkKGVuYykpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJhbnNjb2Rl
ZENvbnRlbnQ7CisgICAgICAgIGlmICh0cmFuc2NvZGVDb250ZW50KG1fY29udGVudCwgZW5jLCB0
cmFuc2NvZGVkQ29udGVudCkpCisgICAgICAgICAgICBzdWNjZXNzID0gcGFyc2VyLT5wYXJzZUJ1
ZmZlcih0cmFuc2NvZGVkQ29udGVudC5kYXRhKCksIHRyYW5zY29kZWRDb250ZW50Lmxlbmd0aCgp
LCBiYXNlLmNfc3RyKCksIHNfdXRmOEVuY29kaW5nTmFtZSk7CisgICAgfSBlbHNlCisgICAgICAg
IHN1Y2Nlc3MgPSBwYXJzZXItPnBhcnNlQnVmZmVyKG1fY29udGVudC5kYXRhKCksIG1fY29udGVu
dC5sZW5ndGgoKSwgYmFzZS5jX3N0cigpLCBzX3V0ZjhFbmNvZGluZ05hbWUpOworCisgICAgaWYg
KCFzdWNjZXNzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBPd25QdHI8UlNTR2VuZXJh
dG9yPiBnZW5lcmF0b3IgPSBhZG9wdFB0cihuZXcgUlNTR2VuZXJhdG9yKCkpOworICAgIFN0cmlu
ZyBodG1sID0gZ2VuZXJhdG9yLT5nZW5lcmF0ZUh0bWwocGFyc2VyLT5tX3Jvb3QpOworICAgIHJl
c3VsdCA9IGh0bWwudXRmOCh0cnVlKS5kYXRhKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
dm9pZCBSU1NGaWx0ZXJTdHJlYW06OmhhbmRsZVJTU0NvbnRlbnQoKQoreworICAgIEJMQUNLQkVS
UllfQVNTRVJUKGlzUlNTQ29udGVudChtX3Jlc291cmNlVHlwZSkpOworCisgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06Ok5ldHdvcmtCdWZmZXIqIGJ1ZmZlcjsKKyAgICBzdGQ6OnN0cmluZyBodG1s
OworICAgIGlmICghY29udmVydENvbnRlbnRUb0h0bWwoaHRtbCkpCisgICAgICAgIGJ1ZmZlciA9
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpjcmVhdGVOZXR3b3JrQnVmZmVyV2l0aERhdGEobV9jb250
ZW50LmNfc3RyKCksIG1fY29udGVudC5zaXplKCkpOworICAgIGVsc2UgeworICAgICAgICB1cGRh
dGVSU1NIZWFkZXJzKGh0bWwuc2l6ZSgpKTsKKyAgICAgICAgYnVmZmVyID0gQmxhY2tCZXJyeTo6
UGxhdGZvcm06OmNyZWF0ZU5ldHdvcmtCdWZmZXJXaXRoRGF0YShodG1sLmNfc3RyKCksIGh0bWwu
c2l6ZSgpKTsKKyAgICB9CisKKyAgICBzZW5kU2F2ZWRIZWFkZXJzKCk7CisgICAgRmlsdGVyU3Ry
ZWFtOjpub3RpZnlEYXRhUmVjZWl2ZWQoYnVmZmVyKTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6cmVsZWFzZU5ldHdvcmtCdWZmZXIoYnVmZmVyKTsKKyAgICBGaWx0ZXJTdHJlYW06Om5vdGlm
eUNsb3NlKEZpbHRlclN0cmVhbTo6U3RhdHVzU3VjY2Vzcyk7Cit9CisKK2NvbnN0IHN0ZDo6c3Ry
aW5nJiBSU1NGaWx0ZXJTdHJlYW06OmNoYXJzZXQoKQoreworICAgIEJMQUNLQkVSUllfQVNTRVJU
KG1fY29udGVudFR5cGVJbmRleCA+PSAwKTsKKworICAgIGlmIChtX2NoYXJzZXRDaGVja2VkKQor
ICAgICAgICByZXR1cm4gbV9jaGFyc2V0OworCisgICAgbV9jaGFyc2V0Q2hlY2tlZCA9IHRydWU7
CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY2hhcnNldFByZWZpeCA9ICJjaGFyc2V0PSI7Cisg
ICAgc3RhdGljIGNvbnN0IGludCBjaGFyc2V0UHJlZml4TGVuID0gc3RybGVuKGNoYXJzZXRQcmVm
aXgpOworICAgIHNpemVfdCBwb3MgPSAobV9oZWFkZXJzLmF0KG1fY29udGVudFR5cGVJbmRleCku
c2Vjb25kKS5maW5kKGNoYXJzZXRQcmVmaXgpOworICAgIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6
Om5wb3MpIHsKKyAgICAgICAgbV9jaGFyc2V0ID0gbV9oZWFkZXJzLmF0KG1fY29udGVudFR5cGVJ
bmRleCkuc2Vjb25kLnN1YnN0cihwb3MgKyBjaGFyc2V0UHJlZml4TGVuKTsKKyAgICAgICAgc3Ry
aXBXaGl0ZVNwYWNlKG1fY2hhcnNldCk7CisgICAgfQorCisgICAgcmV0dXJuIG1fY2hhcnNldDsK
K30KKworY29uc3Qgc3RkOjpzdHJpbmcmIFJTU0ZpbHRlclN0cmVhbTo6ZW5jb2RpbmcoKQorewor
ICAgIGlmIChtX2VuY29kaW5nQ2hlY2tlZCkKKyAgICAgICAgcmV0dXJuIG1fZW5jb2Rpbmc7CisK
KyAgICBtX2VuY29kaW5nQ2hlY2tlZCA9IHRydWU7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0
ciA9IGNoYXJzZXQoKTsKKworICAgIGlmICghc3RyLmVtcHR5KCkpIHsKKyAgICAgICAgbV9lbmNv
ZGluZyA9IHN0cjsKKyAgICAgICAgcmV0dXJuIG1fZW5jb2Rpbmc7CisgICAgfQorCisgICAgY29u
c3QgY2hhciogc3RhcnQgPSBtX2NvbnRlbnQuY19zdHIoKTsKKyAgICBjb25zdCBjaGFyKiBlbmNv
ZGluZ1N0YXJ0ID0gMDsKKyAgICBjb25zdCBjaGFyKiBlbmNvZGluZ0VuZCA9IDA7CisgICAgaWYg
KGZpbmRYTUxFbmNvZGluZ1Bvc2l0aW9uKHN0YXJ0LCBlbmNvZGluZ1N0YXJ0LCBlbmNvZGluZ0Vu
ZCkpIHsKKyAgICAgICAgbV9lbmNvZGluZyA9IHN0ZDo6c3RyaW5nKGVuY29kaW5nU3RhcnQsIGVu
Y29kaW5nRW5kIC0gZW5jb2RpbmdTdGFydCk7CisgICAgICAgIHJldHVybiBtX2VuY29kaW5nOwor
ICAgIH0KKworICAgIGlmIChmaW5kWE1MTGFuZ3VhZ2VQb3NpdGlvbihzdGFydCwgZW5jb2RpbmdT
dGFydCwgZW5jb2RpbmdFbmQpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlU3RyaW5n
KGVuY29kaW5nU3RhcnQsIGVuY29kaW5nRW5kIC0gZW5jb2RpbmdTdGFydCk7CisgICAgICAgIGNv
bnN0IGNoYXIqIGRlZmF1bHRFbmNvZGluZyA9IGRlZmF1bHRFbmNvZGluZ0Zvckxhbmd1YWdlKGxh
bmd1YWdlU3RyaW5nLmNfc3RyKCkpOworICAgICAgICBpZiAoZGVmYXVsdEVuY29kaW5nKSB7Cisg
ICAgICAgICAgICBtX2VuY29kaW5nID0gZGVmYXVsdEVuY29kaW5nOworICAgICAgICAgICAgcmV0
dXJuIG1fZW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbV9lbmNvZGlu
ZzsKK30KKwordm9pZCBSU1NGaWx0ZXJTdHJlYW06OnNhdmVIZWFkZXJzKGNvbnN0IEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdCYgaGVhZGVycykKK3sKKyAg
ICBtX2hlYWRlcnMgPSBoZWFkZXJzOworfQorCit2b2lkIFJTU0ZpbHRlclN0cmVhbTo6cmVtb3Zl
SGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpCit7CisgICAgTmV0d29ya1JlcXVlc3Q6Okhl
YWRlckxpc3Q6Oml0ZXJhdG9yIGVuZCA9IG1faGVhZGVycy5lbmQoKTsKKyAgICBmb3IgKE5ldHdv
cmtSZXF1ZXN0OjpIZWFkZXJMaXN0OjppdGVyYXRvciBpdGVyID0gbV9oZWFkZXJzLmJlZ2luKCk7
IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZXItPmZp
cnN0LmNfc3RyKCksIGtleS5jX3N0cigpKSkgeworICAgICAgICAgICAgbV9oZWFkZXJzLmVyYXNl
KGl0ZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lk
IFJTU0ZpbHRlclN0cmVhbTo6dXBkYXRlSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlz
dDo6aXRlcmF0b3IgaXRlciA9IG1faGVhZGVycy5iZWdpbigpOworICAgIE5ldHdvcmtSZXF1ZXN0
OjpIZWFkZXJMaXN0OjppdGVyYXRvciBlbmQgPSBtX2hlYWRlcnMuZW5kKCk7CisgICAgZm9yICg7
IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZXItPmZp
cnN0LmNfc3RyKCksIGtleS5jX3N0cigpKSkgeworICAgICAgICAgICAgaXRlci0+c2Vjb25kID0g
dmFsdWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2hl
YWRlcnMuaW5zZXJ0KGl0ZXIsIHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWUpKTsKK30KKwordm9p
ZCBSU1NGaWx0ZXJTdHJlYW06OnVwZGF0ZVJTU0hlYWRlcnMoc2l6ZV90IHNpemUpCit7CisgICAg
cmVtb3ZlSGVhZGVyKHNfY29udGVudEVuY29kaW5nSGVhZGVyS2V5KTsKKyAgICB1cGRhdGVIZWFk
ZXIoc19jb250ZW50VHlwZUhlYWRlcktleSwgInRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIpOwor
CisgICAgY2hhciBidWZmZXJbMTZdOworICAgIHNucHJpbnRmKGJ1ZmZlciwgMTYsICIlZCIsIHNp
emUpOworICAgIHVwZGF0ZUhlYWRlcihzX2NvbnRlbnRMZW5ndGhIZWFkZXJLZXksIHN0ZDo6c3Ry
aW5nKGJ1ZmZlciwgMTYpKTsKK30KKwordm9pZCBSU1NGaWx0ZXJTdHJlYW06OnNlbmRTYXZlZEhl
YWRlcnMoKQoreworICAgIGlmICghbV9oZWFkZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgRmlsdGVy
U3RyZWFtOjpub3RpZnlIZWFkZXJzUmVjZWl2ZWQobV9oZWFkZXJzKTsKKyAgICAgICAgbV9jb250
ZW50VHlwZUluZGV4ID0gLTE7CisgICAgICAgIG1faGVhZGVycy5jbGVhcigpOworICAgIH0KK30K
Kwordm9pZCBSU1NGaWx0ZXJTdHJlYW06OmFwcGVuZERhdGEoQmxhY2tCZXJyeTo6UGxhdGZvcm06
Ok5ldHdvcmtCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBtX2NvbnRlbnQuYXBwZW5kKG5ldHdvcmtC
dWZmZXJEYXRhKGJ1ZmZlciksIG5ldHdvcmtCdWZmZXJEYXRhTGVuZ3RoKGJ1ZmZlcikpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVhbS5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NGaWx0ZXJTdHJlYW0uaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzNlODQ4Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NG
aWx0ZXJTdHJlYW0uaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv
c3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgUlNTRmlsdGVyU3RyZWFt
X2gKKyNkZWZpbmUgUlNTRmlsdGVyU3RyZWFtX2gKKworI2luY2x1ZGUgPG5ldHdvcmsvRmlsdGVy
U3RyZWFtLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dU
RlN0cmluZy5oPgorCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUlNTRmlsdGVyU3Ry
ZWFtIDogcHVibGljIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpGaWx0ZXJTdHJlYW0geworcHVibGlj
OgorICAgIGVudW0gUmVzb3VyY2VUeXBlIHsKKyAgICAgICAgVHlwZVVua25vd24sCisgICAgICAg
IFR5cGVOb3RSU1MsCisgICAgICAgIFR5cGVSU1MxMCwKKyAgICAgICAgVHlwZVJTUzIwLAorICAg
ICAgICBUeXBlUlNTQXRvbQorICAgIH07CisKKyAgICBSU1NGaWx0ZXJTdHJlYW0oKTsKKworICAg
IHZpcnR1YWwgdm9pZCBub3RpZnlTdGF0dXNSZWNlaXZlZChpbnQgc3RhdHVzLCBjb25zdCBjaGFy
KiBtZXNzYWdlKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SGVhZGVyc1JlY2VpdmVkKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdCYpOworICAgIHZpcnR1
YWwgdm9pZCBub3RpZnlEYXRhUmVjZWl2ZWQoQmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtC
dWZmZXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5Q2xvc2UoaW50IHN0YXR1cyk7CisKK3By
aXZhdGU6CisgICAgYm9vbCBjb252ZXJ0Q29udGVudFRvSHRtbChzdGQ6OnN0cmluZyYgcmVzdWx0
KTsKKyAgICB2b2lkIGhhbmRsZVJTU0NvbnRlbnQoKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5n
JiBjaGFyc2V0KCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kaW5nKCk7CisKKyAgICB2
b2lkIHNhdmVIZWFkZXJzKGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVz
dDo6SGVhZGVyTGlzdCYpOworICAgIHZvaWQgcmVtb3ZlSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5n
JiBrZXkpOworICAgIHZvaWQgdXBkYXRlSGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNv
bnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgICAgdm9pZCB1cGRhdGVSU1NIZWFkZXJzKHNpemVf
dCk7CisgICAgdm9pZCBzZW5kU2F2ZWRIZWFkZXJzKCk7CisKKyAgICB2b2lkIGFwcGVuZERhdGEo
QmxhY2tCZXJyeTo6UGxhdGZvcm06Ok5ldHdvcmtCdWZmZXIqKTsKKworICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6SGVhZGVyTGlzdCBtX2hlYWRlcnM7CisgICAgc3Rk
OjpzdHJpbmcgbV9jb250ZW50OworICAgIHN0ZDo6c3RyaW5nIG1fY2hhcnNldDsKKyAgICBzdGQ6
OnN0cmluZyBtX2VuY29kaW5nOworCisgICAgUmVzb3VyY2VUeXBlIG1fcmVzb3VyY2VUeXBlOwor
ICAgIGludCBtX2NvbnRlbnRUeXBlSW5kZXg7CisKKyAgICBib29sIG1fY2hhcnNldENoZWNrZWQ7
CisgICAgYm9vbCBtX2VuY29kaW5nQ2hlY2tlZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIFJTU0ZpbHRlclN0cmVhbV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0dlbmVyYXRvci5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU0dlbmVyYXRv
ci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxZjg0MgotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9y
c3MvUlNTR2VuZXJhdG9yLmNwcApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiUlNTR2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlICJMb2NhbGl6ZVJlc291
cmNlLmgiCisjaW5jbHVkZSAiUlNTUGFyc2VyQmFzZS5oIgorCisjaW5jbHVkZSA8d3RmL3RleHQv
Q1N0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBz
X2RlZmF1bHRGZWVkVGl0bGUgPSBpMThuKCJVbnRpdGxlZCBGZWVkIik7CitzdGF0aWMgY29uc3Qg
Y2hhciogc19kZWZhdWx0RW50cnlUaXRsZSA9IGkxOG4oIlVudGl0bGVkIEVudHJ5Iik7CisKK1JT
U0dlbmVyYXRvcjo6UlNTR2VuZXJhdG9yKCkKK3sKK30KKworUlNTR2VuZXJhdG9yOjp+UlNTR2Vu
ZXJhdG9yKCkKK3sKK30KKworU3RyaW5nIFJTU0dlbmVyYXRvcjo6Z2VuZXJhdGVIdG1sKFJTU0Zl
ZWQqIGZlZWQpCit7CisgICAgU3RyaW5nIHJjOworICAgIHJjICs9ICI8aHRtbD48aGVhZD48bWV0
YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDtjaGFyc2V0
PXV0Zi04XCIgLz4iOworICAgIHJjICs9ICI8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50
PVwiaW5pdGlhbC1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9IG5vXCI+IjsKKyAgICByYyArPSAi
PHRpdGxlPiI7CisKKyAgICBpZiAoIWZlZWQtPm1fdGl0bGUuaXNFbXB0eSgpKQorICAgICAgICBy
YyArPSBmZWVkLT5tX3RpdGxlOworICAgIGVsc2UgaWYgKCFmZWVkLT5tX2xpbmsuaXNFbXB0eSgp
KQorICAgICAgICByYyArPSBmZWVkLT5tX2xpbms7CisgICAgZWxzZQorICAgICAgICByYyArPSBz
X2RlZmF1bHRGZWVkVGl0bGU7CisKKyAgICByYyArPSAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IjsK
KworICAgIHJjICs9ICI8aDI+IjsKKyAgICBpZiAoIWZlZWQtPm1fbGluay5pc0VtcHR5KCkpIHsK
KyAgICAgICAgcmMgKz0gIjxhIGhyZWY9XCIiOworICAgICAgICByYyArPSBmZWVkLT5tX2xpbms7
CisgICAgICAgIHJjICs9ICJcIj4iOworICAgIH0KKyAgICBpZiAoIWZlZWQtPm1fdGl0bGUuaXNF
bXB0eSgpKQorICAgICAgICByYyArPSBmZWVkLT5tX3RpdGxlOworICAgIGVsc2UKKyAgICAgICAg
cmMgKz0gc19kZWZhdWx0RmVlZFRpdGxlOworCisgICAgaWYgKCFmZWVkLT5tX2xpbmsuaXNFbXB0
eSgpKQorICAgICAgICByYyArPSAiPC9hPiI7CisKKyAgICByYyArPSAiPC9oMj4iOworCisgICAg
aWYgKCFmZWVkLT5tX2Rlc2NyaXB0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICByYyArPSAiPHA+
IjsKKyAgICAgICAgcmMgKz0gZmVlZC0+bV9kZXNjcmlwdGlvbjsKKyAgICAgICAgcmMgKz0gIjwv
cD4iOworICAgIH0KKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmZWVkLT5tX2l0ZW1z
LnNpemUoKTsgKytpKSB7CisgICAgICAgIFJTU0l0ZW0qIGl0ZW0gPSBmZWVkLT5tX2l0ZW1zW2ld
OworICAgICAgICBTdHJpbmcgYXJ0aWNsZU5hbWU7CisgICAgICAgIHJjICs9ICI8ZGl2IGlkPVwi
IjsKKyAgICAgICAgcmMgKz0gYXJ0aWNsZU5hbWU7CisgICAgICAgIHJjICs9ICJcIiBjbGFzcz1c
ImFydGljbGVcIj5cbjxhIGhyZWY9XCIiOworICAgICAgICBpZiAoIWl0ZW0tPm1fbGluay5pc0Vt
cHR5KCkpCisgICAgICAgICAgICByYyArPSAgaXRlbS0+bV9saW5rLnV0ZjgodHJ1ZSkuZGF0YSgp
OworICAgICAgICByYyArPSAiXCI+PGI+IjsKKyAgICAgICAgaWYgKCFpdGVtLT5tX3RpdGxlLmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIHJjICs9ICBpdGVtLT5tX3RpdGxlLnV0ZjgodHJ1ZSkuZGF0
YSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByYyArPSBzX2RlZmF1bHRFbnRyeVRpdGxl
OworICAgICAgICByYyArPSAiPC9iPjwvYT5cbjxiciAvPiI7CisKKyAgICAgICAgaWYgKCFpdGVt
LT5tX2F1dGhvci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJjICs9IGkxOG4oIkJ5Iik7Cisg
ICAgICAgICAgICByYyArPSAiIDxiPiI7CisgICAgICAgICAgICByYyArPSBpdGVtLT5tX2F1dGhv
ci51dGY4KHRydWUpLmRhdGEoKTsKKyAgICAgICAgICAgIHJjICs9ICI8L2I+ICI7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWZlZWQtPm1fYXV0aG9yLmlzRW1wdHkoKSkgewor
ICAgICAgICAgICAgICAgIHJjICs9IGkxOG4oIkJ5Iik7CisgICAgICAgICAgICAgICAgcmMgKz0g
IiA8Yj4iOworICAgICAgICAgICAgICAgIHJjICs9IGZlZWQtPm1fYXV0aG9yLnV0ZjgodHJ1ZSku
ZGF0YSgpOworICAgICAgICAgICAgICAgIHJjICs9ICI8L2I+ICI7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIWl0ZW0tPm1fY2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsK
KyAgICAgICAgICAgIGlmICghaXRlbS0+bV9hdXRob3IuaXNFbXB0eSgpKQorICAgICAgICAgICAg
ICAgIHJjICs9IGkxOG4oInVuZGVyICIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIHJjICs9IGkxOG4oIlVuZGVyICIpOworCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgaXRlbS0+bV9jYXRlZ29yaWVzLnNpemUoKSA7ICsraSkgeworICAgICAgICAgICAg
ICAgIHJjICs9ICI8Yj4iOworICAgICAgICAgICAgICAgIHJjICs9IGl0ZW0tPm1fY2F0ZWdvcmll
c1tpXS51dGY4KHRydWUpLmRhdGEoKTsKKyAgICAgICAgICAgICAgICByYyArPSAiPC9iPiI7CisK
KyAgICAgICAgICAgICAgICBpZiAoaSA8IGl0ZW0tPm1fY2F0ZWdvcmllcy5zaXplKCkgLSAxKQor
ICAgICAgICAgICAgICAgICAgICByYyArPSAiLCAiOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgcmMgKz0gIjxiciAvPiI7CisgICAgICAgIGlmICghaXRlbS0+bV9wdWJEYXRl
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJjICs9IGl0ZW0tPm1fcHViRGF0ZS51dGY4KHRydWUp
LmRhdGEoKTsKKworICAgICAgICByYyArPSAiPGJyIC8+IjsKKyAgICAgICAgaWYgKCFpdGVtLT5t
X2Rlc2NyaXB0aW9uLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJjICs9IGl0ZW0tPm1fZGVzY3Jp
cHRpb24udXRmOCh0cnVlKS5kYXRhKCk7CisgICAgICAgIHJjICs9ICI8YnIgLz4iOworCisgICAg
ICAgIGlmIChpdGVtLT5tX2VuY2xvc3VyZSkgeworICAgICAgICAgICAgcmMgKz0gIjxiciAvPiI7
CisgICAgICAgICAgICByYyArPSAiPGEgaHJlZj1cIiI7CisgICAgICAgICAgICByYyArPSBpdGVt
LT5tX2VuY2xvc3VyZS0+bV91cmw7CisgICAgICAgICAgICByYyArPSAiXCI+IjsKKyAgICAgICAg
ICAgIHJjICs9IGkxOG4oIkVtYmVkZGVkICIpOworCisgICAgICAgICAgICBSU1NFbmNsb3N1cmU6
OlR5cGUgdHlwZSA9IGl0ZW0tPm1fZW5jbG9zdXJlLT50eXBlSW5FbnVtKCk7CisgICAgICAgICAg
ICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNTRW5jbG9zdXJlOjpUeXBlSW1h
Z2U6CisgICAgICAgICAgICAgICAgcmMgKz0gaTE4bigiSW1hZ2UiKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNTRW5jbG9zdXJlOjpUeXBlQXVkaW86CisgICAg
ICAgICAgICAgICAgcmMgKz0gaTE4bigiQXVkaW8iKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIGNhc2UgUlNTRW5jbG9zdXJlOjpUeXBlVmlkZW86CisgICAgICAgICAgICAg
ICAgcmMgKz0gaTE4bigiVmlkZW8iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGNhc2UgUlNTRW5jbG9zdXJlOjpUeXBlQXBwbGljYXRpb246CisgICAgICAgICAgICBkZWZh
dWx0OgorICAgICAgICAgICAgICAgIHJjICs9IGkxOG4oIlVua25vd24gQ29udGVudCIpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyArPSBp
MThuKCIgU291cmNlOiAiKTsKKyAgICAgICAgICAgIHJjICs9IGl0ZW0tPm1fZW5jbG9zdXJlLT5z
dWdnZXN0ZWROYW1lKCk7CisgICAgICAgICAgICByYyArPSAiPC9hPjxiciAvPjxiciAvPiI7Cisg
ICAgICAgIH0KKworICAgICAgICByYyArPSAiPGJyIC8+PC9kaXY+XG4iOworICAgIH0KKworICAg
IHJjICs9ICI8L2JvZHk+PC9odG1sPlxuIjsKKworICAgIHJldHVybiByYzsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NHZW5lcmF0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4NjI1YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTR2VuZXJhdG9yLmgKQEAg
LTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwgMjAx
MiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0x
MzAxICBVU0EKKyAqLworCisjaWZuZGVmIFJTU0dlbmVyYXRvcl9oCisjZGVmaW5lIFJTU0dlbmVy
YXRvcl9oCisKKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBSU1NGZWVkOworCitjbGFzcyBSU1NHZW5lcmF0b3IgeworcHVibGlj
OgorICAgIFJTU0dlbmVyYXRvcigpOworICAgIH5SU1NHZW5lcmF0b3IoKTsKKworICAgIFN0cmlu
ZyBnZW5lcmF0ZUh0bWwoUlNTRmVlZCopOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gUlNTR2VuZXJhdG9yX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTUGFyc2VyQmFzZS5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTlkMWEKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JT
U1BhcnNlckJhc2UuY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh
cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJSU1NQYXJzZXJCYXNlLmgiCisKKyNpbmNsdWRlICJsaWJ4bWwvcGFyc2VyLmgi
CisjaW5jbHVkZSAibGlieG1sL3htbHdyaXRlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K1JTU0VuY2xvc3VyZTo6UlNTRW5jbG9zdXJlKCkKKyAgICA6IG1fdHlwZUluRW51bShUeXBlVW5r
bm93bikKK3sgfQorCitSU1NFbmNsb3N1cmU6OlR5cGUgUlNTRW5jbG9zdXJlOjp0eXBlSW5FbnVt
KCkKK3sKKyAgICBpZiAoVHlwZVVua25vd24gIT0gbV90eXBlSW5FbnVtKQorICAgICAgICByZXR1
cm4gbV90eXBlSW5FbnVtOworCisgICAgc2l6ZV90IGRpdiA9IG1fdHlwZS5maW5kKCcvJyk7Cisg
ICAgaWYgKFdURjo6bm90Rm91bmQgPT0gZGl2IHx8ICFkaXYpIHsKKyAgICAgICAgbV90eXBlSW5F
bnVtID0gVHlwZVVuc3VwcG9ydGVkOworICAgICAgICByZXR1cm4gbV90eXBlSW5FbnVtOworICAg
IH0KKworICAgIFN0cmluZyBiYXNlID0gbV90eXBlLnN1YnN0cmluZygwLCBkaXYpLmxvd2VyKCk7
CisgICAgaWYgKGJhc2UgPT0gImltYWdlIikKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUlt
YWdlOworICAgIGVsc2UgaWYgKGJhc2UgPT0gImF1ZGlvIikKKyAgICAgICAgbV90eXBlSW5FbnVt
ID0gVHlwZUF1ZGlvOworICAgIGVsc2UgaWYgKGJhc2UgPT0gInZpZGVvIikKKyAgICAgICAgbV90
eXBlSW5FbnVtID0gVHlwZVZpZGVvOworICAgIGVsc2UgaWYgKGJhc2UgPT0gImFwcGxpY2F0aW9u
IikKKyAgICAgICAgbV90eXBlSW5FbnVtID0gVHlwZUFwcGxpY2F0aW9uOworICAgIGVsc2UKKyAg
ICAgICAgbV90eXBlSW5FbnVtID0gVHlwZVVuc3VwcG9ydGVkOworCisgICAgcmV0dXJuIG1fdHlw
ZUluRW51bTsKK30KKworU3RyaW5nIFJTU0VuY2xvc3VyZTo6c3VnZ2VzdGVkTmFtZSgpIGNvbnN0
Cit7CisgICAgc2l6ZV90IHN0YXJ0ID0gbV91cmwucmV2ZXJzZUZpbmQoJy8nKTsKKyAgICBpZiAo
V1RGOjpub3RGb3VuZCA9PSBzdGFydCkKKyAgICAgICAgc3RhcnQgPSAwOworICAgIGVsc2UKKyAg
ICAgICAgKytzdGFydDsKKworICAgIHJldHVybiBtX3VybC5zdWJzdHJpbmcoc3RhcnQpOworfQor
CitSU1NGZWVkOjpSU1NGZWVkKCkKK3sKK30KKworUlNTRmVlZDo6flJTU0ZlZWQoKQoreworICAg
IGNsZWFyKCk7Cit9CisKK3ZvaWQgUlNTRmVlZDo6Y2xlYXIoKQoreworICAgIGRlbGV0ZUFsbFZh
bHVlcyhtX2l0ZW1zKTsKKyAgICBtX2l0ZW1zLmNsZWFyKCk7Cit9CisKK1JTU0l0ZW06OlJTU0l0
ZW0oKQorICAgIDogbV9lbmNsb3N1cmUoMCkKK3sKK30KKworUlNTSXRlbTo6flJTU0l0ZW0oKQor
eworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgUlNTSXRlbTo6Y2xlYXIoKQoreworICAgIGRlbGV0
ZSBtX2VuY2xvc3VyZTsKK30KKworUlNTUGFyc2VyQmFzZTo6UlNTUGFyc2VyQmFzZSgpCisgICAg
OiBtX3Jvb3QoMCkKK3sKK30KKworUlNTUGFyc2VyQmFzZTo6flJTU1BhcnNlckJhc2UoKQorewor
ICAgIGRlbGV0ZSBtX3Jvb3Q7Cit9CisKK1N0cmluZyB0ZXh0RnJvbVhNTEF0dHIoeG1sQXR0ciog
YXR0cikKK3sKKyAgICBpZiAoIWF0dHIpCisgICAgICAgIHJldHVybiBlbXB0eVN0cmluZygpOwor
CisgICAgU3RyaW5nIHRleHQ7CisKKyAgICBmb3IgKHhtbE5vZGUqIG5vZGUgPSBhdHRyLT5jaGls
ZHJlbjsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgaWYgKG5vZGUtPnR5cGUg
PT0gWE1MX1RFWFRfTk9ERSkKKyAgICAgICAgICAgIHRleHQgKz0gcmVpbnRlcnByZXRfY2FzdDxj
b25zdCBjaGFyKj4obm9kZS0+Y29udGVudCk7CisgICAgfQorCisgICAgcmV0dXJuIHRleHQuc3Ry
aXBXaGl0ZVNwYWNlKCk7Cit9CisKK1N0cmluZyB0ZXh0RnJvbVhNTE5vZGUoeG1sTm9kZSogbm9k
ZSkKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBlbXB0eVN0cmluZygpOworCisg
ICAgU3RyaW5nIHRleHQ7CisKKyAgICBmb3IgKG5vZGUgPSBub2RlLT5jaGlsZHJlbjsgbm9kZTsg
bm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgaWYgKChub2RlLT50eXBlID09IFhNTF9URVhU
X05PREUpIHx8IChub2RlLT50eXBlID09IFhNTF9DREFUQV9TRUNUSU9OX05PREUpKQorICAgICAg
ICAgICAgdGV4dCArPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihub2RlLT5jb250ZW50
KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dC5zdHJpcFdoaXRlU3BhY2UoKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NQYXJzZXJCYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkvcnNzL1JTU1BhcnNlckJhc2UuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I1YWRjCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NQYXJzZXJCYXNl
LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIw
MTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKi8KKworCisjaWZuZGVmIFJTU1BhcnNlckJhc2VfaAorI2RlZmlu
ZSBSU1NQYXJzZXJCYXNlX2gKKworI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2NsYXNzIFJTU0l0ZW07CisKK2NsYXNzIFJTU0VuY2xvc3VyZSB7Citw
dWJsaWM6CisgICAgZW51bSBUeXBlIHsKKyAgICAgICAgVHlwZVVua25vd24sCisgICAgICAgIFR5
cGVJbWFnZSwKKyAgICAgICAgVHlwZUF1ZGlvLAorICAgICAgICBUeXBlVmlkZW8sCisgICAgICAg
IFR5cGVBcHBsaWNhdGlvbiwKKyAgICAgICAgVHlwZVVuc3VwcG9ydGVkCisgICAgfTsKKworICAg
IFJTU0VuY2xvc3VyZSgpOworCisgICAgVHlwZSB0eXBlSW5FbnVtKCk7CisgICAgU3RyaW5nIHN1
Z2dlc3RlZE5hbWUoKSBjb25zdDsKKworICAgIFN0cmluZyBtX3VybDsKKyAgICBTdHJpbmcgbV90
eXBlOworICAgIFN0cmluZyBtX2xlbmd0aDsKKworcHJpdmF0ZToKKyAgICBUeXBlIG1fdHlwZUlu
RW51bTsKK307CisKK2NsYXNzIFJTU0l0ZW1CYXNlIHsKK3B1YmxpYzoKKyAgICBTdHJpbmcgbV90
aXRsZTsKKyAgICBTdHJpbmcgbV9saW5rOworICAgIFN0cmluZyBtX2Rlc2NyaXB0aW9uOworICAg
IFN0cmluZyBtX3VwZGF0ZWQ7CisgICAgU3RyaW5nIG1fYXV0aG9yOworICAgIFN0cmluZyBtX3B1
YkRhdGU7CisgICAgU3RyaW5nIG1faWQ7Cit9OworCitjbGFzcyBSU1NGZWVkOiBwdWJsaWMgUlNT
SXRlbUJhc2UgeworcHVibGljOgorICAgIFJTU0ZlZWQoKTsKKyAgICB+UlNTRmVlZCgpOworCisg
ICAgdm9pZCBjbGVhcigpOworCisgICAgU3RyaW5nIG1fbGFuZ3VhZ2U7CisgICAgU3RyaW5nIG1f
dHRsOworCisgICAgVmVjdG9yPFJTU0l0ZW0qPiBtX2l0ZW1zOworfTsKKworY2xhc3MgUlNTSXRl
bTogcHVibGljIFJTU0l0ZW1CYXNlIHsKK3B1YmxpYzoKKyAgICBSU1NJdGVtKCk7CisgICAgflJT
U0l0ZW0oKTsKKworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIFN0cmluZyBtX2NvbW1lbnRzOwor
ICAgIFZlY3RvcjxTdHJpbmc+IG1fY2F0ZWdvcmllczsKKyAgICBSU1NFbmNsb3N1cmUqIG1fZW5j
bG9zdXJlOworfTsKKworY2xhc3MgUlNTUGFyc2VyQmFzZSB7CitwdWJsaWM6CisgICAgUlNTUGFy
c2VyQmFzZSgpOworICAgIHZpcnR1YWwgflJTU1BhcnNlckJhc2UoKTsKKworICAgIHZpcnR1YWwg
Ym9vbCBwYXJzZUJ1ZmZlcihjb25zdCBjaGFyKiBidWZmZXIsIGludCBsZW5ndGgsIGNvbnN0IGNo
YXIqIHVybCwgY29uc3QgY2hhciogZW5jb2RpbmcpID0gMDsKKworICAgIFJTU0ZlZWQqIG1fcm9v
dDsKK307CisKK1N0cmluZyB0ZXh0RnJvbVhNTEF0dHIoeG1sQXR0ciopOworU3RyaW5nIHRleHRG
cm9tWE1MTm9kZSh4bWxOb2RlKik7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlm
IC8vIFJTU1BhcnNlckJhc2VfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>159936</attachid>
            <date>2012-08-22 08:12:30 -0700</date>
            <delta_ts>2012-08-22 08:22:37 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-93496-20120822111457.patch</filename>
            <type>text/plain</type>
            <size>3141</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI2MzAxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggODgzZjRkNjkyMjFjMDk1
N2ZhZDVkNzhjYmRiNjJkYTQ0NmQzZGY2OS4uNjYzOGEwOGJhMzU1YzY0ZjRjZWUxMWEwNTAxNjQ2
MTJmMzUzMTcwMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4IEBACisyMDEyLTA4LTIyICBSb2Ig
QnVpcyAgPHJidWlzQHJpbS5jb20+CisKKyAgICAgICAgW0JsYWNrQmVycnldIEFkZCBSU1MgY29u
dGVudCBoYW5kbGluZyBzdXBwb3J0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD05MzQ5NgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIENsZWFudXAgc29tZSBtb3JlLgorCisgICAgICAgICogcGxhdGZvcm0vbmV0
d29yay9ibGFja2JlcnJ5L3Jzcy9SU1NGaWx0ZXJTdHJlYW0uY3BwOgorICAgICAgICAoV2ViQ29y
ZSk6CisgICAgICAgIChXZWJDb3JlOjpjcmVhdGVQYXJzZXIpOgorICAgICAgICAoV2ViQ29yZTo6
ZGVmYXVsdEVuY29kaW5nRm9yTGFuZ3VhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6aXNUcmFuc2Nv
ZGluZ05lZWRlZCk6CisKIDIwMTItMDgtMjIgIFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5i
b3RAZ21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHIxMjYyODcu
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2JsYWNrYmVycnkv
cnNzL1JTU0ZpbHRlclN0cmVhbS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2JsYWNrYmVycnkvcnNzL1JTU0ZpbHRlclN0cmVhbS5jcHAKaW5kZXggNTg5MTViZDEzZmY4ZjFk
MDlmM2I1MmVlODczYWJlYmIwYWZjNjdkMS4uYTdlNTA0NDZlZmYxZTQ3NTA5ODFmMjg2Njc0MDJk
NTgxMDAzYmJmMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9i
bGFja2JlcnJ5L3Jzcy9SU1NGaWx0ZXJTdHJlYW0uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvYmxhY2tiZXJyeS9yc3MvUlNTRmlsdGVyU3RyZWFtLmNwcApAQCAtNTAs
MTUgKzUwLDYgQEAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHNfY29udGVudEVuY29kaW5nSGVh
ZGVyS2V5ID0gIkNvbnRlbnQtRW5jb2RpbmciOwogc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHNf
Y29udGVudExlbmd0aEhlYWRlcktleSA9ICJDb250ZW50LUxlbmd0aCI7CiBzdGF0aWMgY29uc3Qg
Y2hhciogY29uc3Qgc19jb250ZW50VHlwZUhlYWRlcktleSA9ICJDb250ZW50LVR5cGUiOwogCi1z
dGF0aWMgY29uc3QgY2hhciogY29uc3Qgc19hdG9tMTBWZXJzaW9uS2V5ID0gInhtbG5zIjsKLXN0
YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX2F0b20xMFZlcnNpb25WYWx1ZSA9ICJodHRwOi8vd3d3
LnczLm9yZy8yMDA1L0F0b20iOwotc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IHNfcnNzMTBWZXJz
aW9uS2V5ID0gInhtbG5zIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBzX3JzczEwVmVyc2lv
blZhbHVlID0gImh0dHA6Ly9wdXJsLm9yZy9yc3MvMS4wLyI7Ci1zdGF0aWMgY29uc3QgY2hhciog
Y29uc3Qgc19yc3MyMFZlcnNpb25LZXkgPSAidmVyc2lvbiI7Ci1zdGF0aWMgY29uc3QgY2hhciog
Y29uc3Qgc19yc3MyMFZlcnNpb25WYWx1ZSA9ICIyLjAiOwotc3RhdGljIGNvbnN0IGNoYXIqIGNv
bnN0IHNfcnNzWG1sVmVyc2lvbktleSA9ICJ2ZXJzaW9uIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBj
b25zdCBzX3Jzc1htbFZlcnNpb25WYWx1ZSA9ICIxLjAiOwotCiBzdGF0aWMgaW50IGlzQVNDSUlT
cGFjZUxvd2VyQnl0ZShpbnQgY2gpCiB7CiAgICAgcmV0dXJuIGlzQVNDSUlTcGFjZTxpbnQ+KGNo
ICYgMHhmZik7CkBAIC0yMzksNyArMjMwLDcgQEAgc3RhdGljIFBhc3NPd25QdHI8UlNTUGFyc2Vy
QmFzZT4gY3JlYXRlUGFyc2VyKFJTU0ZpbHRlclN0cmVhbTo6UmVzb3VyY2VUeXBlIHR5cGUKICAg
ICBjYXNlIFJTU0ZpbHRlclN0cmVhbTo6VHlwZVJTUzIwOgogICAgICAgICByZXR1cm4gYWRvcHRQ
dHIobmV3IFJTUzIwUGFyc2VyKCkpOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIFRoZSBmb2xs
b3dpbmcgY29kZSBpcyBqdXN0IGZvciBjb21waWxlciwgaXQgc2hvdWxkIG5ldmVyIHJlYWNoIGhl
cmUuCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogICAgICAgICByZXR1cm4gYWRvcHRQ
dHIobmV3IFJTUzIwUGFyc2VyKCkpOwogICAgIH0KIH0KQEAgLTMxNyw4ICszMDgsNyBAQCBzdGF0
aWMgYm9vbCBmaW5kWE1MTGFuZ3VhZ2VQb3NpdGlvbihjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNo
YXIqJiBsYW5nU3RhcnQsIGNvbgogCiBzdGF0aWMgY29uc3QgY2hhciogZGVmYXVsdEVuY29kaW5n
Rm9yTGFuZ3VhZ2UoY29uc3QgY2hhciogbGFuZ3VhZ2UpCiB7Ci0gICAgaWYgKCFzdHJjYXNlY21w
KGxhbmd1YWdlLCAiZW4iKQotICAgICAgICB8fCAhc3RyY2FzZWNtcChsYW5ndWFnZSwgImVuLVVT
IikpCisgICAgaWYgKCFzdHJjYXNlY21wKGxhbmd1YWdlLCAiZW4iKSB8fCAhc3RyY2FzZWNtcChs
YW5ndWFnZSwgImVuLVVTIikpCiAgICAgICAgIHJldHVybiBzX2xhdGluMUVuY29kaW5nTmFtZTsK
ICAgICBpZiAoIXN0cmNhc2VjbXAobGFuZ3VhZ2UsICJ6aC1jbiIpKQogICAgICAgICByZXR1cm4g
c19nYmtFbmNvZGluZ05hbWU7CkBAIC0zMzAsNyArMzIwLDYgQEAgc3RhdGljIGJvb2wgaXNUcmFu
c2NvZGluZ05lZWRlZChjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RpbmcpCiB7CiAgICAgLy8gV2hl
biB0aGVyZSdzIG5vIGVuY29kaW5nIGluZm9ybWF0aW9uLCBvciB0aGUgZW5jb2RpbmcgY2FuIG5v
dCBiZSBmb3VuZCBpbiBhbGwgZW5jb2RpbmdzCiAgICAgLy8gc3VwcG9ydGVkIGluIG91ciBwaG9u
ZSwgd2Ugd2lsbCB0cnkgdG8gdHJhbnNjb2RlIHRoZSBjb250ZW50IGFueXdheSwgc3VwcG9zZWQg
dG8gQVNDSUkuCi0KICAgICBpZiAoZW5jb2RpbmcuZW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHRy
dWU7CiAK
</data>
<flag name="review"
          id="170363"
          type_id="1"
          status="+"
          setter="yong.li.webkit"
    />
          </attachment>
      

    </bug>

</bugzilla>