<?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>24616</bug_id>
          
          <creation_ts>2009-03-16 07:17:44 -0700</creation_ts>
          <short_desc>Add custom V8 bindings for DOMWindow</short_desc>
          <delta_ts>2009-03-28 10:01:23 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</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="Mike Belshe">mbelshe</reporter>
          <assigned_to name="Mike Belshe">mbelshe</assigned_to>
          <cc>eric</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>113868</commentid>
    <comment_count>0</comment_count>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-16 07:17:44 -0700</bug_when>
    <thetext>Custom bindings for the DOMWindow under v8.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115199</commentid>
    <comment_count>1</comment_count>
      <attachid>28941</attachid>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-25 13:01:54 -0700</bug_when>
    <thetext>Created attachment 28941
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115242</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-03-25 16:04:41 -0700</bug_when>
    <thetext>Sam will likely be curious about this change too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115322</commentid>
    <comment_count>3</comment_count>
      <attachid>28941</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-26 07:38:42 -0700</bug_when>
    <thetext>Comment on attachment 28941
patch

These are all style-nits, obviously the code works and is good otherwise.

Bug URL in ChangeLog.

&gt; +    WindowSetLocation(imp, ToWebCoreString(value));

toWebCoreString

&gt; +        String eventType = ToWebCoreString(args[0]);

toWebCoreString


&gt; +        String eventType = ToWebCoreString(args[0]);

toWebCoreString


&gt; +    String message = ToWebCoreString(args[0]);

toWebCoreString

&gt; +    WindowFeatures wargs;

wargs -&gt; windowFeatures? No strong feelings here, just wargs sounds a bit overcondensed.

&gt; +            (!parseURL(urlString).startsWith(&quot;javascript:&quot;, false) ||
&gt; +             ScriptController::isSafeScript(frame))) {

|| goes on new line or you could just remove line break

&gt; +        return v8::Handle&lt;v8::Value&gt;();

notHandledByInterceptor() here and elsewhere in this method.

&gt; +    String propName = ToWebCoreString(name);

toWebCoreString

&gt; +    static HashMap&lt;String, String&gt; kLazyInitMap;

kLazyInitMap -&gt; lazyInitMap

&gt; +        if (context.IsEmpty()) return v8::Handle&lt;v8::Value&gt;();

return on new line.

&gt; +    if (!parseURL(v).startsWith(&quot;javascript:&quot;, false) ||

|| on new line or remove line break

&gt; +    int handle = ToInt32(args[0]);

toInt32</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115323</commentid>
    <comment_count>4</comment_count>
      <attachid>28941</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-26 07:39:07 -0700</bug_when>
    <thetext>Comment on attachment 28941
patch

Whoops, I meant r-.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115342</commentid>
    <comment_count>5</comment_count>
      <attachid>28972</attachid>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-26 10:05:01 -0700</bug_when>
    <thetext>Created attachment 28972
patch w/ Dimitri&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115386</commentid>
    <comment_count>6</comment_count>
      <attachid>28972</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-26 13:13:18 -0700</bug_when>
    <thetext>Comment on attachment 28972
patch w/ Dimitri&apos;s comments

Good enough. The following are nice, but not required.

&gt; +    return v8::Handle&lt;v8::Value&gt;();

notHandledByInterceptor()

&gt; +    if (!name-&gt;IsString())
&gt; +        return v8::Handle&lt;v8::Value&gt;();

notHandledByInterceptor()

&gt; +    if (holder.IsEmpty())
&gt; +        return v8::Handle&lt;v8::Value&gt;();

notHandledByInterceptor()


&gt; +    if (!window)
&gt; +        return v8::Handle&lt;v8::Value&gt;();

notHandledByInterceptor()


&gt; +    Frame* frame = window-&gt;frame();
&gt; +    // window is detached from a frame.
&gt; +    if (!frame)
&gt; +        return v8::Handle&lt;v8::Value&gt;();

notHandledByInterceptor()


&gt; +
&gt; +    return v8::Handle&lt;v8::Value&gt;();

notHandledByInterceptor()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115406</commentid>
    <comment_count>7</comment_count>
      <attachid>28983</attachid>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-26 13:59:43 -0700</bug_when>
    <thetext>Created attachment 28983
use notImplementedByInterceptor()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115674</commentid>
    <comment_count>8</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-28 09:49:19 -0700</bug_when>
    <thetext>Landed as http://trac.webkit.org/changeset/42071.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115675</commentid>
    <comment_count>9</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-28 09:50:29 -0700</bug_when>
    <thetext>Whoops, I just realized this file is in the wrong place. It should be in bindings/v8/custom.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115680</commentid>
    <comment_count>10</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-28 10:01:23 -0700</bug_when>
    <thetext>Fix landed in http://trac.webkit.org/changeset/42072.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28941</attachid>
            <date>2009-03-25 13:01:54 -0700</date>
            <delta_ts>2009-03-26 13:59:43 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bug24616.patch</filename>
            <type>text/plain</type>
            <size>26391</size>
            <attacher name="Mike Belshe">mbelshe</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTk2MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTAgQEAKKzIwMDktMDMtMjQgIE1pa2UgQmVsc2hlICA8bWlrZUBiZWxzaGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICBBZGQgVjgg
Y3VzdG9tIGJpbmRpbmdzIGZvciBET01XaW5kb3cuCisKKyAgICAgICAgKiBWOERPTVdpbmRvd0N1
c3RvbS5jcHAKKwogMjAwOS0wMy0yNCAgQWRhbSBMYW5nbGV5ICA8YWdsQGdvb2dsZS5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlzaGVyLgpJbmRleDogV2ViQ29yZS9iaW5kaW5n
cy92OC9WOERPTVdpbmRvd0N1c3RvbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9iaW5kaW5n
cy92OC9WOERPTVdpbmRvd0N1c3RvbS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2JpbmRp
bmdzL3Y4L1Y4RE9NV2luZG93Q3VzdG9tLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2OTcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRE9NV2luZG93LmgiCisKKyNpbmNs
dWRlICJWOEJpbmRpbmcuaCIKKyNpbmNsdWRlICJWOEN1c3RvbUJpbmRpbmcuaCIKKyNpbmNsdWRl
ICJWOEN1c3RvbUV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCisKKyNpbmNs
dWRlICJET01UaW1lci5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVMb2Fk
UmVxdWVzdC5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybVNjcmVlbi5oIgorI2luY2x1ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIK
KyNpbmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgIldpbmRvd0ZlYXR1cmVzLmgiCisKKwor
Ly8gSG9yaXpvbnRhbCBhbmQgdmVydGljYWwgb2Zmc2V0LCBmcm9tIHRoZSBwYXJlbnQgY29udGVu
dCBhcmVhLCBhcm91bmQgbmV3bHkKKy8vIG9wZW5lZCBwb3B1cHMgdGhhdCBkb24ndCBzcGVjaWZ5
IGEgbG9jYXRpb24uCitzdGF0aWMgY29uc3QgaW50IHBvcHVwVGlsZVBpeGVscyA9IDEwOworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK0FDQ0VTU09SX1NFVFRFUihET01XaW5kb3dMb2NhdGlvbikK
K3sKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERP
TVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygpKTsKKyAgICBpZiAo
aG9sZGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRE9NV2luZG93KiBpbXAg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lO
RE9XLCBob2xkZXIpOworICAgIFdpbmRvd1NldExvY2F0aW9uKGltcCwgVG9XZWJDb3JlU3RyaW5n
KHZhbHVlKSk7Cit9CisKKworQUNDRVNTT1JfU0VUVEVSKERPTVdpbmRvd09wZW5lcikKK3sKKyAg
ICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhD
bGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uSG9sZGVyKCkpOworCisgICAgaWYgKCFWOFByb3h5
OjpDYW5BY2Nlc3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAgICAgICByZXR1cm47Cisg
IAorICAgIC8vIE9wZW5lciBjYW4gYmUgc2hhZG93ZWQgaWYgaXQgaXMgaW4gdGhlIHNhbWUgZG9t
YWluLgorICAgIC8vIEhhdmUgYSBzcGVjaWFsIGhhbmRsaW5nIG9mIG51bGwgdmFsdWUgdG8gYmVo
YXZlCisgICAgLy8gbGlrZSBGaXJlZm94LiBTZWUgYnVnIGh0dHA6Ly9iLzEyMjQ4ODcgJiBodHRw
Oi8vYi83OTE3MDYuCisgICAgaWYgKHZhbHVlLT5Jc051bGwoKSkgeworICAgICAgICAvLyBpbXAt
PmZyYW1lKCkgY2Fubm90IGJlIG51bGwsCisgICAgICAgIC8vIG90aGVyd2lzZSwgU2FtZU9yaWdp
biBjaGVjayB3b3VsZCBoYXZlIGZhaWxlZC4KKyAgICAgICAgQVNTRVJUKGltcC0+ZnJhbWUoKSk7
CisgICAgICAgIGltcC0+ZnJhbWUoKS0+bG9hZGVyKCktPnNldE9wZW5lcigwKTsKKyAgICB9CisK
KyAgICAvLyBEZWxldGUgdGhlIGFjY2Vzc29yIGZyb20gdGhpcyBvYmplY3QuCisgICAgaW5mby5I
b2xkZXIoKS0+RGVsZXRlKG5hbWUpOworCisgICAgLy8gUHV0IHByb3BlcnR5IG9uIHRoZSBmcm9u
dCAodGhpcykgb2JqZWN0LgorICAgIGluZm8uVGhpcygpLT5TZXQobmFtZSwgdmFsdWUpOworfQor
CitDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93QWRkRXZlbnRMaXN0ZW5lcikKK3sKKyAgICBJ
TkNfU1RBVFMoIkRPTS5ET01XaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigpIik7CisgICAgRE9NV2lu
ZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRl
eDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKworICAgIGlmICghVjhQcm94eTo6Q2FuQWNj
ZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKKworICAgIGlmICghaW1wLT5mcmFtZSgpKQorICAgICAgICByZXR1cm4gdjg6OlVuZGVm
aW5lZCgpOyAgLy8gRE9NV2luZG93IGNvdWxkIGJlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBmcmFt
ZQorICAKKyAgICBEb2N1bWVudCogZG9jID0gaW1wLT5mcmFtZSgpLT5kb2N1bWVudCgpOworICAg
IGlmICghZG9jKQorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAgLy8gVE9E
TzogQ2hlY2sgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBhcmd1bWVudHMKKyAgICBWOFByb3h5KiBw
cm94eSA9IFY4UHJveHk6OnJldHJpZXZlKGltcC0+ZnJhbWUoKSk7CisgICAgaWYgKCFwcm94eSkK
KyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIFJlZlB0cjxFdmVudExpc3Rl
bmVyPiBsaXN0ZW5lciA9IHByb3h5LT5GaW5kT3JDcmVhdGVWOEV2ZW50TGlzdGVuZXIoYXJnc1sx
XSwgZmFsc2UpOworCisgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgIFN0cmluZyBldmVudFR5
cGUgPSBUb1dlYkNvcmVTdHJpbmcoYXJnc1swXSk7CisgICAgICAgIGJvb2wgdXNlQ2FwdHVyZSA9
IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgpOworICAgICAgICBkb2MtPmFkZFdpbmRvd0V2ZW50TGlz
dGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSk7CisgICAgfQorCisgICAgcmV0
dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKworCitDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93
UmVtb3ZlRXZlbnRMaXN0ZW5lcikKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cucmVt
b3ZlRXZlbnRMaXN0ZW5lcigpIik7CisgICAgRE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRl
cigpKTsKKworICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0
cnVlKSkKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIGlmICghaW1wLT5m
cmFtZSgpKQorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAgRG9jdW1lbnQq
IGRvYyA9IGltcC0+ZnJhbWUoKS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvYykKKyAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6
cmV0cmlldmUoaW1wLT5mcmFtZSgpKTsKKyAgICBpZiAoIXByb3h5KQorICAgICAgICByZXR1cm4g
djg6OlVuZGVmaW5lZCgpOworCisgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0g
cHJveHktPkZpbmRWOEV2ZW50TGlzdGVuZXIoYXJnc1sxXSwgZmFsc2UpOworCisgICAgaWYgKGxp
c3RlbmVyKSB7CisgICAgICAgIFN0cmluZyBldmVudFR5cGUgPSBUb1dlYkNvcmVTdHJpbmcoYXJn
c1swXSk7CisgICAgICAgIGJvb2wgdXNlQ2FwdHVyZSA9IGFyZ3NbMl0tPkJvb2xlYW5WYWx1ZSgp
OworICAgICAgICBkb2MtPnJlbW92ZVdpbmRvd0V2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0
ZW5lci5nZXQoKSwgdXNlQ2FwdHVyZSk7CisgICAgfQorCisgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsKK30KKworQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1Bvc3RNZXNzYWdlKQorewor
ICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5wb3N0TWVzc2FnZSgpIik7CisgICAgRE9NV2lu
ZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKworICAgIERPTVdpbmRvdyogc291cmNl
ID0gVjhQcm94eTo6cmV0cmlldmVBY3RpdmVGcmFtZSgpLT5kb21XaW5kb3coKTsKKyAgICBBU1NF
UlQoc291cmNlLT5mcmFtZSgpKTsKKworICAgIFN0cmluZyB1cmkgPSBzb3VyY2UtPmZyYW1lKCkt
PmxvYWRlcigpLT51cmwoKS5zdHJpbmcoKTsKKworICAgIHY4OjpUcnlDYXRjaCB0cnlDYXRjaDsK
KworICAgIFN0cmluZyBtZXNzYWdlID0gVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOworICAgIE1l
c3NhZ2VQb3J0KiBwb3J0ID0gMDsKKyAgICBTdHJpbmcgZG9tYWluOworCisgICAgLy8gVGhpcyBm
dW5jdGlvbiBoYXMgdmFyaWFibGUgYXJndW1lbnRzIGFuZCBjYW4gZWl0aGVyIGJlOgorICAgIC8v
ICAgcG9zdE1lc3NhZ2UobWVzc2FnZSwgcG9ydCwgZG9tYWluKTsKKyAgICAvLyBvcgorICAgIC8v
ICAgcG9zdE1lc3NhZ2UobWVzc2FnZSwgZG9tYWluKTsKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA+
IDIpIHsKKyAgICAgICAgaWYgKFY4UHJveHk6OklzV3JhcHBlck9mVHlwZShhcmdzWzFdLCBWOENs
YXNzSW5kZXg6Ok1FU1NBR0VQT1JUKSkKKyAgICAgICAgICAgIHBvcnQgPSBWOFByb3h5OjpUb05h
dGl2ZU9iamVjdDxNZXNzYWdlUG9ydD4oVjhDbGFzc0luZGV4OjpNRVNTQUdFUE9SVCwgYXJnc1sx
XSk7CisgICAgICAgIGRvbWFpbiA9IHZhbHVlVG9TdHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hl
Y2soYXJnc1syXSk7CisgICAgfSBlbHNlCisgICAgICAgIGRvbWFpbiA9IHZhbHVlVG9TdHJpbmdX
aXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soYXJnc1sxXSk7CisKKyAgICBpZiAodHJ5Q2F0Y2guSGFz
Q2F1Z2h0KCkpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBFeGNlcHRp
b25Db2RlIGVjID0gMDsKKyAgICB3aW5kb3ctPnBvc3RNZXNzYWdlKG1lc3NhZ2UsIHBvcnQsIGRv
bWFpbiwgc291cmNlLCBlYyk7CisgICAgaWYgKGVjKQorICAgICAgICBWOFByb3h5OjpTZXRET01F
eGNlcHRpb24oZWMpOworCisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKworCitzdGF0
aWMgYm9vbCBjYW5TaG93TW9kYWxEaWFsb2dOb3coY29uc3QgRnJhbWUqIGZyYW1lKQoreworICAg
IC8vIEEgZnJhbWUgY2FuIG91dCBsaXZlIGl0cyBwYWdlLiBTZWUgYnVnIDEyMTk2MTMuCisgICAg
aWYgKCFmcmFtZSB8fCAhZnJhbWUtPnBhZ2UoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IHJldHVybiBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2FuUnVuTW9kYWxOb3coKTsKK30KKwor
c3RhdGljIGJvb2wgYWxsb3dQb3BVcCgpCit7CisgICAgRnJhbWUqIGZyYW1lID0gVjhQcm94eTo6
cmV0cmlldmVBY3RpdmVGcmFtZSgpOworCisgICAgQVNTRVJUKGZyYW1lKTsKKyAgICBpZiAoZnJh
bWUtPnNjcmlwdCgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKSkKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZnJhbWUtPnNldHRpbmdzKCk7CisgICAgcmV0
dXJuIHNldHRpbmdzICYmIHNldHRpbmdzLT5KYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0
aWNhbGx5KCk7Cit9CisKK3N0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJzZU1vZGFs
RGlhbG9nRmVhdHVyZXMoY29uc3QgU3RyaW5nJiBmZWF0dXJlc0FyZykKK3sKKyAgICBIYXNoTWFw
PFN0cmluZywgU3RyaW5nPiBtYXA7CisKKyAgICBWZWN0b3I8U3RyaW5nPiBmZWF0dXJlczsKKyAg
ICBmZWF0dXJlc0FyZy5zcGxpdCgnOycsIGZlYXR1cmVzKTsKKyAgICBWZWN0b3I8U3RyaW5nPjo6
Y29uc3RfaXRlcmF0b3IgZW5kID0gZmVhdHVyZXMuZW5kKCk7CisgICAgZm9yIChWZWN0b3I8U3Ry
aW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmZWF0dXJlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKKyAgICAgICAgU3RyaW5nIGZlYXR1cmVTdHJpbmcgPSAqaXQ7CisgICAgICAgIGludCBw
b3MgPSBmZWF0dXJlU3RyaW5nLmZpbmQoJz0nKTsKKyAgICAgICAgaW50IGNvbG9uUG9zID0gZmVh
dHVyZVN0cmluZy5maW5kKCc6Jyk7CisgICAgICAgIGlmIChwb3MgPj0gMCAmJiBjb2xvblBvcyA+
PSAwKQorICAgICAgICAgICAgY29udGludWU7ICAvLyBpZ25vcmUgYW55IHN0cmluZ3MgdGhhdCBo
YXZlIGJvdGggPSBhbmQgOgorICAgICAgICBpZiAocG9zIDwgMCkKKyAgICAgICAgICAgIHBvcyA9
IGNvbG9uUG9zOworICAgICAgICBpZiAocG9zIDwgMCkgeworICAgICAgICAgICAgLy8gbnVsbCBz
dHJpbmcgZm9yIHZhbHVlIG1lYW5zIGtleSB3aXRob3V0IHZhbHVlCisgICAgICAgICAgICBtYXAu
c2V0KGZlYXR1cmVTdHJpbmcuc3RyaXBXaGl0ZVNwYWNlKCkubG93ZXIoKSwgU3RyaW5nKCkpOwor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IGZlYXR1cmVTdHJpbmcu
bGVmdChwb3MpLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCk7CisgICAgICAgICAgICBTdHJpbmcg
dmFsID0gZmVhdHVyZVN0cmluZy5zdWJzdHJpbmcocG9zICsgMSkuc3RyaXBXaGl0ZVNwYWNlKCku
bG93ZXIoKTsKKyAgICAgICAgICAgIGludCBzcGFjZVBvcyA9IHZhbC5maW5kKCcgJyk7CisgICAg
ICAgICAgICBpZiAoc3BhY2VQb3MgIT0gLTEpCisgICAgICAgICAgICAgICAgdmFsID0gdmFsLmxl
ZnQoc3BhY2VQb3MpOworICAgICAgICAgICAgbWFwLnNldChrZXksIHZhbCk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICByZXR1cm4gbWFwOworfQorCisKK3N0YXRpYyBGcmFtZSogY3JlYXRlV2lu
ZG93KEZyYW1lKiBvcGVuZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFN0cmluZyYgdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBm
cmFtZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaW5kb3dGZWF0dXJl
cyYgd2luZG93RmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8
djg6OlZhbHVlPiBkaWFsb2dBcmdzKQoreworICAgIEZyYW1lKiBhY3RpdmVGcmFtZSA9IFY4UHJv
eHk6OnJldHJpZXZlQWN0aXZlRnJhbWUoKTsKKworICAgIFJlc291cmNlUmVxdWVzdCByZXF1ZXN0
OworICAgIGlmIChhY3RpdmVGcmFtZSkKKyAgICAgICAgcmVxdWVzdC5zZXRIVFRQUmVmZXJyZXIo
YWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCkpOworICAgIEZyYW1lTG9h
ZFJlcXVlc3QgZnJhbWVSZXF1ZXN0KHJlcXVlc3QsIGZyYW1lTmFtZSk7CisKKyAgICAvLyBGSVhN
RTogSXQncyBtdWNoIGJldHRlciBmb3IgY2xpZW50IEFQSSBpZiBhIG5ldyB3aW5kb3cgc3RhcnRz
IHdpdGggYSBVUkwsCisgICAgLy8gaGVyZSB3aGVyZSB3ZSBrbm93IHdoYXQgVVJMIHdlIGFyZSBn
b2luZyB0byBvcGVuLiBVbmZvcnR1bmF0ZWx5LCB0aGlzCisgICAgLy8gY29kZSBwYXNzZXMgdGhl
IGVtcHR5IHN0cmluZyBmb3IgdGhlIFVSTCwgYnV0IHRoZXJlJ3MgYSByZWFzb24gZm9yIHRoYXQu
CisgICAgLy8gQmVmb3JlIGxvYWRpbmcgd2UgaGF2ZSB0byBzZXQgdXAgdGhlIG9wZW5lciwgb3Bl
bmVkQnlET00sCisgICAgLy8gYW5kIGRpYWxvZ0FyZ3VtZW50cyB2YWx1ZXMuIEFsc28sIHRvIGRl
Y2lkZSB3aGV0aGVyIHRvIHVzZSB0aGUgVVJMCisgICAgLy8gd2UgY3VycmVudGx5IGRvIGFuIGFs
bG93c0FjY2Vzc0Zyb20gY2FsbCB1c2luZyB0aGUgd2luZG93IHdlIGNyZWF0ZSwKKyAgICAvLyB3
aGljaCBjYW4ndCBiZSBkb25lIGJlZm9yZSBjcmVhdGluZyBpdC4gV2UnZCBoYXZlIHRvIHJlc29s
dmUgYWxsIHRob3NlCisgICAgLy8gaXNzdWVzIHRvIHBhc3MgdGhlIFVSTCBpbnN0ZWFkIG9mICIi
LgorCisgICAgYm9vbCBjcmVhdGVkOworICAgIC8vIFdlIHBhc3MgaW4gdGhlIG9wZW5lciBmcmFt
ZSBoZXJlIHNvIGl0IGNhbiBiZSB1c2VkIGZvciBsb29raW5nIHVwIHRoZQorICAgIC8vIGZyYW1l
IG5hbWUsIGluIGNhc2UgdGhlIGFjdGl2ZSBmcmFtZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3Bl
bmVyIGZyYW1lLAorICAgIC8vIGFuZCB0aGUgbmFtZSByZWZlcmVuY2VzIGEgZnJhbWUgcmVsYXRp
dmUgdG8gdGhlIG9wZW5lciBmcmFtZSwgZm9yIGV4YW1wbGUKKyAgICAvLyAiX3NlbGYiIG9yICJf
cGFyZW50Ii4KKyAgICBGcmFtZSogbmV3RnJhbWUgPSBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPmNy
ZWF0ZVdpbmRvdyhvcGVuZXJGcmFtZS0+bG9hZGVyKCksIGZyYW1lUmVxdWVzdCwgd2luZG93RmVh
dHVyZXMsIGNyZWF0ZWQpOworICAgIGlmICghbmV3RnJhbWUpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgbmV3RnJhbWUtPmxvYWRlcigpLT5zZXRPcGVuZXIob3BlbmVyRnJhbWUpOworICAgIG5l
d0ZyYW1lLT5sb2FkZXIoKS0+c2V0T3BlbmVkQnlET00oKTsKKworICAgIC8vIFNldCBkaWFsb2cg
YXJndW1lbnRzIG9uIHRoZSBnbG9iYWwgb2JqZWN0IG9mIHRoZSBuZXcgZnJhbWUuCisgICAgaWYg
KCFkaWFsb2dBcmdzLklzRW1wdHkoKSkgeworICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+
IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KG5ld0ZyYW1lKTsKKyAgICAgICAgaWYgKCFj
b250ZXh0LklzRW1wdHkoKSkgeworICAgICAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3Bl
KGNvbnRleHQpOworICAgICAgICAgICAgY29udGV4dC0+R2xvYmFsKCktPlNldCh2ODo6U3RyaW5n
OjpOZXcoImRpYWxvZ0FyZ3VtZW50cyIpLCBkaWFsb2dBcmdzKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIGlmICghcGFyc2VVUkwodXJsKS5zdGFydHNXaXRoKCJqYXZhc2NyaXB0OiIsIGZhbHNl
KSB8fAorICAgICAgICBTY3JpcHRDb250cm9sbGVyOjppc1NhZmVTY3JpcHQobmV3RnJhbWUpKSB7
CisgICAgICAgIEtVUkwgY29tcGxldGVkVXJsID0KKyAgICAgICAgICAgIHVybC5pc0VtcHR5KCkg
PyBLVVJMKCIiKSA6IGFjdGl2ZUZyYW1lLT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwpOwor
ICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0aXZlRnJhbWUtPnNjcmlwdCgpLT5wcm9jZXNz
aW5nVXNlckdlc3R1cmUoKTsKKworICAgICAgICBpZiAoY3JlYXRlZCkKKyAgICAgICAgICAgIG5l
d0ZyYW1lLT5sb2FkZXIoKS0+Y2hhbmdlTG9jYXRpb24oY29tcGxldGVkVXJsLCBhY3RpdmVGcmFt
ZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJyZXIoKSwgZmFsc2UsIGZhbHNlLCB1c2VyR2VzdHVy
ZSk7CisgICAgICAgIGVsc2UgaWYgKCF1cmwuaXNFbXB0eSgpKQorICAgICAgICAgICAgbmV3RnJh
bWUtPmxvYWRlcigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hhbmdlKGNvbXBsZXRlZFVybC5zdHJpbmco
KSwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCB1c2Vy
R2VzdHVyZSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ld0ZyYW1lOworfQorCisKKworQ0FMTEJB
Q0tfRlVOQ19ERUNMKERPTVdpbmRvd1Nob3dNb2RhbERpYWxvZykKK3sKKyAgICBJTkNfU1RBVFMo
IkRPTS5ET01XaW5kb3cuc2hvd01vZGFsRGlhbG9nKCkiKTsKKyAgICBET01XaW5kb3cqIHdpbmRv
dyA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oCisgICAgICAgIFY4Q2xhc3NJ
bmRleDo6RE9NV0lORE9XLCBhcmdzLkhvbGRlcigpKTsKKyAgICBGcmFtZSogZnJhbWUgPSB3aW5k
b3ctPmZyYW1lKCk7CisKKyAgICBpZiAoIWZyYW1lIHx8ICFWOFByb3h5OjpDYW5BY2Nlc3NGcmFt
ZShmcmFtZSwgdHJ1ZSkpIAorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAg
aWYgKCFjYW5TaG93TW9kYWxEaWFsb2dOb3coZnJhbWUpIHx8ICFhbGxvd1BvcFVwKCkpCisgICAg
ICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBTdHJpbmcgdXJsID0gdmFsdWVUb1N0
cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzBdKTsKKyAgICB2ODo6TG9jYWw8djg6
OlZhbHVlPiBkaWFsb2dBcmdzID0gYXJnc1sxXTsKKyAgICBTdHJpbmcgZmVhdHVyZUFyZ3MgPSB2
YWx1ZVRvU3RyaW5nV2l0aE51bGxPclVuZGVmaW5lZENoZWNrKGFyZ3NbMl0pOworCisgICAgY29u
c3QgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZmVhdHVyZXMgPSBwYXJzZU1vZGFsRGlhbG9nRmVh
dHVyZXMoZmVhdHVyZUFyZ3MpOworCisgICAgY29uc3QgYm9vbCB0cnVzdGVkID0gZmFsc2U7CisK
KyAgICBGbG9hdFJlY3Qgc2NyZWVuUmVjdCA9IHNjcmVlbkF2YWlsYWJsZVJlY3QoZnJhbWUtPnZp
ZXcoKSk7CisKKyAgICBXaW5kb3dGZWF0dXJlcyB3YXJnczsKKyAgICAvLyBkZWZhdWx0IGhlcmUg
Y2FtZSBmcm9tIGZyYW1lIHNpemUgb2YgZGlhbG9nIGluIE1hY0lFLgorICAgIHdhcmdzLndpZHRo
ID0gV2luZG93RmVhdHVyZXM6OmZsb2F0RmVhdHVyZShmZWF0dXJlcywgImRpYWxvZ3dpZHRoIiwg
MTAwLCBzY3JlZW5SZWN0LndpZHRoKCksIDYyMCk7CisgICAgd2FyZ3Mud2lkdGhTZXQgPSB0cnVl
OworICAgIC8vIGRlZmF1bHQgaGVyZSBjYW1lIGZyb20gZnJhbWUgc2l6ZSBvZiBkaWFsb2cgaW4g
TWFjSUUuCisgICAgd2FyZ3MuaGVpZ2h0ID0gV2luZG93RmVhdHVyZXM6OmZsb2F0RmVhdHVyZShm
ZWF0dXJlcywgImRpYWxvZ2hlaWdodCIsIDEwMCwgc2NyZWVuUmVjdC5oZWlnaHQoKSwgNDUwKTsK
KyAgICB3YXJncy5oZWlnaHRTZXQgPSB0cnVlOworICAKKyAgICB3YXJncy54ID0gV2luZG93RmVh
dHVyZXM6OmZsb2F0RmVhdHVyZShmZWF0dXJlcywgImRpYWxvZ2xlZnQiLCBzY3JlZW5SZWN0Lngo
KSwgc2NyZWVuUmVjdC5yaWdodCgpIC0gd2FyZ3Mud2lkdGgsIC0xKTsKKyAgICB3YXJncy54U2V0
ID0gd2FyZ3MueCA+IDA7CisgICAgd2FyZ3MueSA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1
cmUoZmVhdHVyZXMsICJkaWFsb2d0b3AiLCBzY3JlZW5SZWN0LnkoKSwgc2NyZWVuUmVjdC5ib3R0
b20oKSAtIHdhcmdzLmhlaWdodCwgLTEpOworICAgIHdhcmdzLnlTZXQgPSB3YXJncy55ID4gMDsK
KworICAgIGlmIChXaW5kb3dGZWF0dXJlczo6Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJjZW50ZXIi
LCB0cnVlKSkgeworICAgICAgICBpZiAoIXdhcmdzLnhTZXQpIHsKKyAgICAgICAgICAgIHdhcmdz
LnggPSBzY3JlZW5SZWN0LngoKSArIChzY3JlZW5SZWN0LndpZHRoKCkgLSB3YXJncy53aWR0aCkg
LyAyOworICAgICAgICAgICAgd2FyZ3MueFNldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAg
aWYgKCF3YXJncy55U2V0KSB7CisgICAgICAgICAgICB3YXJncy55ID0gc2NyZWVuUmVjdC55KCkg
KyAoc2NyZWVuUmVjdC5oZWlnaHQoKSAtIHdhcmdzLmhlaWdodCkgLyAyOworICAgICAgICAgICAg
d2FyZ3MueVNldCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3YXJncy5kaWFsb2cg
PSB0cnVlOworICAgIHdhcmdzLnJlc2l6YWJsZSA9IFdpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVy
ZShmZWF0dXJlcywgInJlc2l6YWJsZSIpOworICAgIHdhcmdzLnNjcm9sbGJhcnNWaXNpYmxlID0g
V2luZG93RmVhdHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVzLCAic2Nyb2xsIiwgdHJ1ZSk7Cisg
ICAgd2FyZ3Muc3RhdHVzQmFyVmlzaWJsZSA9IFdpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVyZShm
ZWF0dXJlcywgInN0YXR1cyIsICF0cnVzdGVkKTsKKyAgICB3YXJncy5tZW51QmFyVmlzaWJsZSA9
IGZhbHNlOworICAgIHdhcmdzLnRvb2xCYXJWaXNpYmxlID0gZmFsc2U7CisgICAgd2FyZ3MubG9j
YXRpb25CYXJWaXNpYmxlID0gZmFsc2U7CisgICAgd2FyZ3MuZnVsbHNjcmVlbiA9IGZhbHNlOwor
CisgICAgRnJhbWUqIGRpYWxvZ0ZyYW1lID0gY3JlYXRlV2luZG93KGZyYW1lLCB1cmwsICIiLCB3
YXJncywgZGlhbG9nQXJncyk7CisgICAgaWYgKCFkaWFsb2dGcmFtZSkKKyAgICAgICAgcmV0dXJu
IHY4OjpVbmRlZmluZWQoKTsKKworICAgIC8vIEhvbGQgb24gdG8gdGhlIGNvbnRleHQgb2YgdGhl
IGRpYWxvZyB3aW5kb3cgbG9uZyBlbm91Z2ggdG8gcmV0cmlldmUgdGhlCisgICAgLy8gdmFsdWUg
b2YgdGhlIHJldHVybiB2YWx1ZSBwcm9wZXJ0eS4KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+
IGNvbnRleHQgPSBWOFByb3h5OjpHZXRDb250ZXh0KGRpYWxvZ0ZyYW1lKTsKKworICAgIC8vIFJ1
biB0aGUgZGlhbG9nLgorICAgIGRpYWxvZ0ZyYW1lLT5wYWdlKCktPmNocm9tZSgpLT5ydW5Nb2Rh
bCgpOworCisgICAgLy8gRXh0cmFjdCB0aGUgcmV0dXJuIHZhbHVlIHByb3BlcnR5IGZyb20gdGhl
IGRpYWxvZyB3aW5kb3cuCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmV0dXJuVmFsdWU7Cisg
ICAgaWYgKCFjb250ZXh0LklzRW1wdHkoKSkgeworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUg
c2NvcGUoY29udGV4dCk7CisgICAgICAgIHJldHVyblZhbHVlID0gY29udGV4dC0+R2xvYmFsKCkt
PkdldCh2ODo6U3RyaW5nOjpOZXcoInJldHVyblZhbHVlIikpOworICAgIH0KKworICAgIGlmICgh
cmV0dXJuVmFsdWUuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisKKyAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQorCisKK0NBTExCQUNLX0ZVTkNfREVDTChET01X
aW5kb3dPcGVuKQoreworICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5vcGVuKCkiKTsKKyAg
ICBET01XaW5kb3cqIHBhcmVudCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4o
VjhDbGFzc0luZGV4OjpET01XSU5ET1csIGFyZ3MuSG9sZGVyKCkpOworICAgIEZyYW1lKiBmcmFt
ZSA9IHBhcmVudC0+ZnJhbWUoKTsKKworICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUo
ZnJhbWUsIHRydWUpKQorICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIEZyYW1l
KiBhY3RpdmVGcmFtZSA9IFY4UHJveHk6OnJldHJpZXZlQWN0aXZlRnJhbWUoKTsKKyAgICBpZiAo
IWFjdGl2ZUZyYW1lKQorICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIFBhZ2Uq
IHBhZ2UgPSBmcmFtZS0+cGFnZSgpOworICAgIGlmICghcGFnZSkKKyAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CisKKyAgICBTdHJpbmcgdXJsU3RyaW5nID0gdmFsdWVUb1N0cmluZ1dpdGhO
dWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzBdKTsKKyAgICBBdG9taWNTdHJpbmcgZnJhbWVOYW1l
ID0gKGFyZ3NbMV0tPklzVW5kZWZpbmVkKCkgfHwgYXJnc1sxXS0+SXNOdWxsKCkpID8gIl9ibGFu
ayIgOiBBdG9taWNTdHJpbmcoVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMV0pKTsKKworICAgIC8vIEJl
Y2F1c2UgRnJhbWVUcmVlOjpmaW5kKCkgcmV0dXJucyB0cnVlIGZvciBlbXB0eSBzdHJpbmdzLCB3
ZSBtdXN0IGNoZWNrCisgICAgLy8gZm9yIGVtcHR5IGZyYW1lbmFtZXMuIE90aGVyd2lzZSwgaWxs
ZWdpdGltYXRlIHdpbmRvdy5vcGVuKCkgY2FsbHMgd2l0aAorICAgIC8vIG5vIG5hbWUgd2lsbCBw
YXNzIHJpZ2h0IHRocm91Z2ggdGhlIHBvcHVwIGJsb2NrZXIuCisgICAgaWYgKCFhbGxvd1BvcFVw
KCkgJiYKKyAgICAgICAgKGZyYW1lTmFtZS5pc0VtcHR5KCkgfHwgIWZyYW1lLT50cmVlKCktPmZp
bmQoZnJhbWVOYW1lKSkpIHsKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKyAgICB9
CisKKyAgICAvLyBHZXQgdGhlIHRhcmdldCBmcmFtZSBmb3IgdGhlIHNwZWNpYWwgY2FzZXMgb2Yg
X3RvcCBhbmQgX3BhcmVudC4gIEluIHRob3NlCisgICAgLy8gY2FzZXMsIHdlIGNhbiBzY2hlZHVs
ZSBhIGxvY2F0aW9uIGNoYW5nZSByaWdodCBub3cgYW5kIHJldHVybiBlYXJseS4KKyAgICBib29s
IHRvcE9yUGFyZW50ID0gZmFsc2U7CisgICAgaWYgKGZyYW1lTmFtZSA9PSAiX3RvcCIpIHsKKyAg
ICAgICAgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50b3AoKTsKKyAgICAgICAgdG9wT3JQYXJlbnQg
PSB0cnVlOworICAgIH0gZWxzZSBpZiAoZnJhbWVOYW1lID09ICJfcGFyZW50IikgeworICAgICAg
ICBpZiAoRnJhbWUqIHBhcmVudCA9IGZyYW1lLT50cmVlKCktPnBhcmVudCgpKQorICAgICAgICAg
ICAgZnJhbWUgPSBwYXJlbnQ7CisgICAgICAgIHRvcE9yUGFyZW50ID0gdHJ1ZTsKKyAgICB9Cisg
ICAgaWYgKHRvcE9yUGFyZW50KSB7CisgICAgICAgIGlmICghYWN0aXZlRnJhbWUtPmxvYWRlcigp
LT5zaG91bGRBbGxvd05hdmlnYXRpb24oZnJhbWUpKQorICAgICAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKKyAgICAKKyAgICAgICAgU3RyaW5nIGNvbXBsZXRlZFVybDsKKyAgICAgICAg
aWYgKCF1cmxTdHJpbmcuaXNFbXB0eSgpKQorICAgICAgICAgICAgY29tcGxldGVkVXJsID0gYWN0
aXZlRnJhbWUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHVybFN0cmluZyk7CisgICAgCisgICAg
ICAgIGlmICghY29tcGxldGVkVXJsLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgKCFwYXJzZVVS
TCh1cmxTdHJpbmcpLnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpIHx8CisgICAgICAg
ICAgICAgU2NyaXB0Q29udHJvbGxlcjo6aXNTYWZlU2NyaXB0KGZyYW1lKSkpIHsKKyAgICAgICAg
ICAgIGJvb2wgdXNlckdlc3R1cmUgPSBhY3RpdmVGcmFtZS0+c2NyaXB0KCktPnByb2Nlc3NpbmdV
c2VyR2VzdHVyZSgpOworICAgICAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5zY2hlZHVsZUxvY2F0
aW9uQ2hhbmdlKGNvbXBsZXRlZFVybCwgYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1Jl
ZmVycmVyKCksIGZhbHNlLCB1c2VyR2VzdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGZyYW1lLT5kb21X
aW5kb3coKSk7CisgICAgfQorCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBuYW1lZCBmcmFtZSBv
ciBhIG5ldyB3aW5kb3csIHdlJ2xsIHVzZSB0aGUKKyAgICAvLyBjcmVhdGVXaW5kb3coKSBoZWxw
ZXIuCisKKyAgICAvLyBQYXJzZSB0aGUgdmFsdWVzLCBhbmQgdGhlbiB3b3JrIHdpdGggYSBjb3B5
IG9mIHRoZSBwYXJzZWQgdmFsdWVzCisgICAgLy8gc28gd2UgY2FuIHJlc3RvcmUgdGhlIHZhbHVl
cyB3ZSBtYXkgbm90IHdhbnQgdG8gb3ZlcndyaXRlIGFmdGVyCisgICAgLy8gd2UgZG8gdGhlIG11
bHRpcGxlIG1vbml0b3IgZml4ZXMuCisgICAgV2luZG93RmVhdHVyZXMgcmF3RmVhdHVyZXModmFs
dWVUb1N0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzJdKSk7CisgICAgV2luZG93
RmVhdHVyZXMgd2luZG93RmVhdHVyZXMocmF3RmVhdHVyZXMpOworICAgIEZsb2F0UmVjdCBzY3Jl
ZW5SZWN0ID0gc2NyZWVuQXZhaWxhYmxlUmVjdChwYWdlLT5tYWluRnJhbWUoKS0+dmlldygpKTsK
KworICAgIC8vIFNldCBkZWZhdWx0IHNpemUgYW5kIGxvY2F0aW9uIG5lYXIgcGFyZW50IHdpbmRv
dyBpZiBub25lIHdlcmUgc3BlY2lmaWVkLgorICAgIC8vIFRoZXNlIG1heSBiZSBmdXJ0aGVyIG1v
ZGlmaWVkIGJ5IGFkanVzdFdpbmRvd1JlY3QsIGJlbG93LgorICAgIGlmICghd2luZG93RmVhdHVy
ZXMueFNldCkgeworICAgICAgICB3aW5kb3dGZWF0dXJlcy54ID0gcGFyZW50LT5zY3JlZW5YKCkg
LSBzY3JlZW5SZWN0LngoKSArIHBvcHVwVGlsZVBpeGVsczsKKyAgICAgICAgd2luZG93RmVhdHVy
ZXMueFNldCA9IHRydWU7CisgICAgfQorICAgIGlmICghd2luZG93RmVhdHVyZXMueVNldCkgewor
ICAgICAgICB3aW5kb3dGZWF0dXJlcy55ID0gcGFyZW50LT5zY3JlZW5ZKCkgLSBzY3JlZW5SZWN0
LnkoKSArIHBvcHVwVGlsZVBpeGVsczsKKyAgICAgICAgd2luZG93RmVhdHVyZXMueVNldCA9IHRy
dWU7CisgICAgfQorICAgIGlmICghd2luZG93RmVhdHVyZXMud2lkdGhTZXQpIHsKKyAgICAgICAg
d2luZG93RmVhdHVyZXMud2lkdGggPSBwYXJlbnQtPmlubmVyV2lkdGgoKTsKKyAgICAgICAgd2lu
ZG93RmVhdHVyZXMud2lkdGhTZXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoIXdpbmRvd0ZlYXR1
cmVzLmhlaWdodFNldCkgeworICAgICAgICB3aW5kb3dGZWF0dXJlcy5oZWlnaHQgPSBwYXJlbnQt
PmlubmVySGVpZ2h0KCk7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVzLmhlaWdodFNldCA9IHRydWU7
CisgICAgfQorCisgICAgRmxvYXRSZWN0IHdpbmRvd1JlY3Qod2luZG93RmVhdHVyZXMueCwgd2lu
ZG93RmVhdHVyZXMueSwgd2luZG93RmVhdHVyZXMud2lkdGgsIHdpbmRvd0ZlYXR1cmVzLmhlaWdo
dCk7CisKKyAgICAvLyBUaGUgbmV3IHdpbmRvdydzIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGl0
cyBjdXJyZW50IHNjcmVlbiwgc28gc2hpZnQKKyAgICAvLyBpdCBpbiBjYXNlIGl0J3Mgb24gYSBz
ZWNvbmRhcnkgbW9uaXRvci4gU2VlIGh0dHA6Ly9iL3ZpZXdJc3N1ZT9pZD05Njc5MDUuCisgICAg
d2luZG93UmVjdC5tb3ZlKHNjcmVlblJlY3QueCgpLCBzY3JlZW5SZWN0LnkoKSk7CisgICAgV2Vi
Q29yZTo6RE9NV2luZG93OjphZGp1c3RXaW5kb3dSZWN0KHNjcmVlblJlY3QsIHdpbmRvd1JlY3Qs
IHdpbmRvd1JlY3QpOworCisgICAgd2luZG93RmVhdHVyZXMueCA9IHdpbmRvd1JlY3QueCgpOwor
ICAgIHdpbmRvd0ZlYXR1cmVzLnkgPSB3aW5kb3dSZWN0LnkoKTsKKyAgICB3aW5kb3dGZWF0dXJl
cy5oZWlnaHQgPSB3aW5kb3dSZWN0LmhlaWdodCgpOworICAgIHdpbmRvd0ZlYXR1cmVzLndpZHRo
ID0gd2luZG93UmVjdC53aWR0aCgpOworCisgICAgLy8gSWYgZWl0aGVyIG9mIHRoZSBvcmlnaW4g
Y29vcmRpbmF0ZXMgd2VyZW4ndCBzZXQgaW4gdGhlIG9yaWdpbmFsCisgICAgLy8gc3RyaW5nLCBt
YWtlIHN1cmUgdGhleSBhcmVuJ3Qgc2V0IG5vdy4KKyAgICBpZiAoIXJhd0ZlYXR1cmVzLnhTZXQp
IHsKKyAgICAgICAgd2luZG93RmVhdHVyZXMueCA9IDA7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVz
LnhTZXQgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFyYXdGZWF0dXJlcy55U2V0KSB7CisgICAg
ICAgIHdpbmRvd0ZlYXR1cmVzLnkgPSAwOworICAgICAgICB3aW5kb3dGZWF0dXJlcy55U2V0ID0g
ZmFsc2U7CisgICAgfQorCisgICAgZnJhbWUgPSBjcmVhdGVXaW5kb3coZnJhbWUsIHVybFN0cmlu
ZywgZnJhbWVOYW1lLCB3aW5kb3dGZWF0dXJlcywgdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSk7CisK
KyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAg
cmV0dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGZyYW1l
LT5kb21XaW5kb3coKSk7Cit9CisKKworSU5ERVhFRF9QUk9QRVJUWV9HRVRURVIoRE9NV2luZG93
KQoreworICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5JbmRleGVkUHJvcGVydHlHZXR0ZXIi
KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERP
TVdyYXBwZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygpKTsKKyAgICBpZiAo
aG9sZGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6OlZhbHVlPigp
OworCisgICAgRE9NV2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01X
aW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOworICAgIGlmICghd2luZG93
KQorICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CisKKyAgICBGcmFtZSog
ZnJhbWUgPSB3aW5kb3ctPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJu
IHY4OjpIYW5kbGU8djg6OlZhbHVlPigpOworCisgICAgRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRy
ZWUoKS0+Y2hpbGQoaW5kZXgpOworICAgIGlmIChjaGlsZCkKKyAgICAgICAgcmV0dXJuIFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGNoaWxkLT5kb21XaW5kb3co
KSk7CisKKyAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7Cit9CisKKworTkFNRURf
UFJPUEVSVFlfR0VUVEVSKERPTVdpbmRvdykKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5k
b3cuTmFtZWRQcm9wZXJ0eUdldHRlciIpOworICAgIC8vIFRoZSBrZXkgbXVzdCBiZSBhIHN0cmlu
Zy4KKyAgICBpZiAoIW5hbWUtPklzU3RyaW5nKCkpCisgICAgICAgIHJldHVybiB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4oKTsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gaG9sZGVyID0gVjhQ
cm94eTo6TG9va3VwRE9NV3JhcHBlcihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgaW5mby5UaGlz
KCkpOworICAgIGlmIChob2xkZXIuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+KCk7CisKKyAgICBET01XaW5kb3cqIHdpbmRvdyA9IFY4UHJveHk6OlRvTmF0
aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRlcik7Cisg
ICAgaWYgKCF3aW5kb3cpCisgICAgICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsK
KworICAgIFN0cmluZyBwcm9wTmFtZSA9IFRvV2ViQ29yZVN0cmluZyhuYW1lKTsKKworICAgIEZy
YW1lKiBmcmFtZSA9IHdpbmRvdy0+ZnJhbWUoKTsKKyAgICAvLyB3aW5kb3cgaXMgZGV0YWNoZWQg
ZnJvbSBhIGZyYW1lLgorICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4oKTsKKworICAgIC8vIFNlYXJjaCBzdWItZnJhbWVzLgorICAgIEZyYW1lKiBj
aGlsZCA9IGZyYW1lLT50cmVlKCktPmNoaWxkKHByb3BOYW1lKTsKKyAgICBpZiAoY2hpbGQpCisg
ICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9X
LCBjaGlsZC0+ZG9tV2luZG93KCkpOworCisgICAgLy8gU2VhcmNoIElETCBmdW5jdGlvbnMgZGVm
aW5lZCBpbiB0aGUgcHJvdG90eXBlCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJlc3VsdCA9
IGhvbGRlci0+R2V0UmVhbE5hbWVkUHJvcGVydHlJblByb3RvdHlwZUNoYWluKG5hbWUpOworICAg
IGlmICghcmVzdWx0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIC8v
IExhenkgaW5pdGlhbGl6YXRpb24gbWFwIGtlZXBzIGdsb2JhbCBwcm9wZXJ0aWVzIHRoYXQgY2Fu
IGJlIGxhemlseQorICAgIC8vIGluaXRpYWxpemVkLiBUaGUgdmFsdWUgaXMgdGhlIGNvZGUgdG8g
aW5zdGFudGlhdGUgdGhlIHByb3BlcnR5LgorICAgIC8vIEl0IG11c3QgcmV0dXJuIHRoZSB2YWx1
ZSBvZiBwcm9wZXJ0eSBhZnRlciBpbml0aWFsaXphdGlvbi4KKyAgICBzdGF0aWMgSGFzaE1hcDxT
dHJpbmcsIFN0cmluZz4ga0xhenlJbml0TWFwOworICAgIGlmIChrTGF6eUluaXRNYXAuaXNFbXB0
eSgpKSB7CisgICAgICAvLyAibmV3IEltYWdlKCkiIGRvZXMgbm90IGFwcGVhciB0byBiZSB3ZWxs
LWRlZmluZWQgaW4gYSBzcGVjLCBidXQgU2FmYXJpLAorICAgICAgLy8gT3BlcmEsIGFuZCBGaXJl
Zm94IGFsbCBjb25zaWRlciBpdCB0byBhbHdheXMgY3JlYXRlIGFuIEhUTUwgaW1hZ2UKKyAgICAg
IC8vIGVsZW1lbnQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgZG9jdHlwZS4KKyAgICAgIGtM
YXp5SW5pdE1hcC5zZXQoIkltYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9u
IEltYWdlKCkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5j
cmVhdGVFbGVtZW50TlMoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3
dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAg
fTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UiKTsKKyAgICAgIGtMYXp5SW5pdE1h
cC5zZXQoIk9wdGlvbiIsCisgICAgICAgICJmdW5jdGlvbiBPcHRpb24odGV4dCwgdmFsdWUsIGRl
ZmF1bHRTZWxlY3RlZCwgc2VsZWN0ZWQpIHsgXAorICAgICAgICAgICB2YXIgb3B0aW9uID0gZG9j
dW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7IFwKKyAgICAgICAgICAgaWYgKHRleHQgPT0g
bnVsbCkgcmV0dXJuIG9wdGlvbjsgXAorICAgICAgICAgICBvcHRpb24udGV4dCA9IHRleHQ7IFwK
KyAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBvcHRpb247IFwKKyAgICAgICAg
ICAgb3B0aW9uLnZhbHVlID0gdmFsdWU7IFwKKyAgICAgICAgICAgaWYgKGRlZmF1bHRTZWxlY3Rl
ZCA9PSBudWxsKSByZXR1cm4gb3B0aW9uOyBcCisgICAgICAgICAgIG9wdGlvbi5kZWZhdWx0U2Vs
ZWN0ZWQgPSBkZWZhdWx0U2VsZWN0ZWQ7IFwKKyAgICAgICAgICAgaWYgKHNlbGVjdGVkID09IG51
bGwpIHJldHVybiBvcHRpb247IFwKKyAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gc2VsZWN0
ZWQ7IFwKKyAgICAgICAgICAgcmV0dXJuIG9wdGlvbjsgXAorICAgICAgICAgfTsgXAorICAgICAg
ICAgT3B0aW9uIik7CisgICAgfQorCisgICAgU3RyaW5nIGNvZGUgPSBrTGF6eUluaXRNYXAuZ2V0
KHByb3BOYW1lKTsKKyAgICBpZiAoIWNvZGUuaXNFbXB0eSgpKSB7CisgICAgICAgIHY4OjpMb2Nh
bDx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQod2luZG93LT5mcmFt
ZSgpKTsKKyAgICAgICAgLy8gQmFpbCBvdXQgaWYgd2UgY2Fubm90IGdldCB0aGUgY29udGV4dCBm
b3IgdGhlIGZyYW1lLgorICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpIHJldHVybiB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4oKTsKKyAgCisgICAgICAgIC8vIHN3aXRjaCB0byB0aGUgdGFyZ2V0
IG9iamVjdCdzIGVudmlyb25tZW50LgorICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUo
Y29udGV4dCk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHVuZGVmaW5l
ZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgICAgICAgLy8gcHJvcGVydHkgZXhpc3RzLiAgVGhp
cyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGlzIGdldHRlcgorICAgICAgICAvLyBtaWdodCBiZSBj
YWxsZWQgd2hlbiBldmFsdWF0aW5nICd2YXIgUmFuZ2VFeGNlcHRpb24gPSB2YWx1ZScKKyAgICAg
ICAgLy8gdG8gZmlndXJlIG91dCBpZiB3ZSBoYXZlIGEgcHJvcGVydHkgbmFtZWQgJ1JhbmdlRXhj
ZXB0aW9uJyBiZWZvcmUKKyAgICAgICAgLy8gd2Ugc2V0IFJhbmdlRXhjZXB0aW9uIHRvIHRoZSBu
ZXcgdmFsdWUuICBJbiB0aGF0IGNhc2UsIHdlIHdpbGwKKyAgICAgICAgLy8gZXZhbHVhdGUgJ3Zh
ciBSYW5nZUV4Y2VwdGlvbiA9IHt9JyBhbmQgZW50ZXIgYW4gaW5maW5pdGUgbG9vcC4KKyAgICAg
ICAgLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgbmFtZSB0byB1bmRlZmluZWQgb24gdGhlIGdsb2Jh
bCBvYmplY3QKKyAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGRvIG5vdCBoYXZlIHRvIGFzayB0
aGlzIGdldHRlciB0byBmaWd1cmUgb3V0CisgICAgICAgIC8vIHRoYXQgd2UgaGF2ZSB0aGUgcHJv
cGVydHkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE8oYWdlcik6IFdlIHByb2JhYmx5IHNo
b3VsZCBpbXBsZW1lbnQgdGhlIEhhcyBtZXRob2QKKyAgICAgICAgLy8gZm9yIHRoZSBpbnRlcmNl
cHRvciBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBkZWZhdWx0IEhhcyBtZXRob2QKKyAgICAgICAgLy8g
dGhhdCBjYWxscyBHZXQuCisgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQodjhTdHJpbmco
cHJvcE5hbWUpLCB2ODo6VW5kZWZpbmVkKCkpOworICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4
UHJveHk6OnJldHJpZXZlKHdpbmRvdy0+ZnJhbWUoKSk7CisgICAgICAgIEFTU0VSVChwcm94eSk7
CisKKyAgICAgICAgcmV0dXJuIHByb3h5LT5ldmFsdWF0ZShXZWJDb3JlOjpTY3JpcHRTb3VyY2VD
b2RlKGNvZGUpLCAwKTsKKyAgICB9CisKKyAgICAvLyBTZWFyY2ggbmFtZWQgaXRlbXMgaW4gdGhl
IGRvY3VtZW50LgorICAgIERvY3VtZW50KiBkb2MgPSBmcmFtZS0+ZG9jdW1lbnQoKTsKKyAgICBp
ZiAoZG9jKSB7CisgICAgICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gaXRlbXMgPSBkb2MtPndp
bmRvd05hbWVkSXRlbXMocHJvcE5hbWUpOworICAgICAgICBpZiAoaXRlbXMtPmxlbmd0aCgpID49
IDEpIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy0+bGVuZ3RoKCkgPT0gMSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoaXRlbXMtPmZpcnN0SXRlbSgpKTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7Cit9CisKKwor
dm9pZCBWOEN1c3RvbTo6V2luZG93U2V0TG9jYXRpb24oRE9NV2luZG93KiB3aW5kb3csIGNvbnN0
IFN0cmluZyYgdikKK3sKKyAgICBpZiAoIXdpbmRvdy0+ZnJhbWUoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgRnJhbWUqIGFjdGl2ZUZyYW1lID0gU2NyaXB0Q29udHJvbGxlcjo6cmV0cmlldmVB
Y3RpdmVGcmFtZSgpOworICAgIGlmICghYWN0aXZlRnJhbWUpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmICghYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5zaG91bGRBbGxvd05hdmlnYXRpb24od2lu
ZG93LT5mcmFtZSgpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFwYXJzZVVSTCh2KS5z
dGFydHNXaXRoKCJqYXZhc2NyaXB0OiIsIGZhbHNlKSB8fAorICAgICAgICBTY3JpcHRDb250cm9s
bGVyOjppc1NhZmVTY3JpcHQod2luZG93LT5mcmFtZSgpKSkgeworICAgICAgICBTdHJpbmcgY29t
cGxldGVkVXJsID0gYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5jb21wbGV0ZVVSTCh2KS5zdHJpbmco
KTsKKyAgCisgICAgICAgIC8vIEZJWE1FOiBUaGUgSlNDIGJpbmRpbmdzIHBhc3MgIWFueVBhZ2VJ
c1Byb2Nlc3NpbmdVc2VyR2VzdHVyZSgpIGZvcgorICAgICAgICAvLyB0aGUgbG9ja0hpc3Rvcnkg
cGFyYW1ldGVyLiAgV2Ugc2hvdWxkIHByb2JhYmx5IGRvIHNvbWV0aGluZyBzaW1pbGFyLgorICAK
KyAgICAgICAgd2luZG93LT5mcmFtZSgpLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5n
ZShjb21wbGV0ZWRVcmwsCisgICAgICAgICAgICBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdv
aW5nUmVmZXJyZXIoKSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgYWN0aXZlRnJhbWUtPnNj
cmlwdCgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKSk7CisgICAgfQorfQorCisKK0NBTExCQUNL
X0ZVTkNfREVDTChET01XaW5kb3dTZXRUaW1lb3V0KQoreworICAgIElOQ19TVEFUUygiRE9NLkRP
TVdpbmRvdy5zZXRUaW1lb3V0KCkiKTsKKyAgICByZXR1cm4gV2luZG93U2V0VGltZW91dEltcGwo
YXJncywgdHJ1ZSk7Cit9CisKKworQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1NldEludGVy
dmFsKQoreworICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5zZXRJbnRlcnZhbCgpIik7Cisg
ICAgcmV0dXJuIFdpbmRvd1NldFRpbWVvdXRJbXBsKGFyZ3MsIGZhbHNlKTsKK30KKworCit2b2lk
IFY4Q3VzdG9tOjpDbGVhclRpbWVvdXRJbXBsKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7
CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7CisgICAg
RE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOworICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNz
RnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICAgICAgcmV0dXJuOworICAgIFNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRpb25Db250
ZXh0Kj4oaW1wLT5mcmFtZSgpLT5kb2N1bWVudCgpKTsKKyAgICBpbnQgaGFuZGxlID0gVG9JbnQz
MihhcmdzWzBdKTsKKyAgICBET01UaW1lcjo6cmVtb3ZlQnlJZChjb250ZXh0LCBoYW5kbGUpOwor
fQorCisKK0NBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dDbGVhclRpbWVvdXQpCit7CisgICAg
SU5DX1NUQVRTKCJET00uRE9NV2luZG93LmNsZWFyVGltZW91dCIpOworICAgIENsZWFyVGltZW91
dEltcGwoYXJncyk7CisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKworQ0FMTEJBQ0tf
RlVOQ19ERUNMKERPTVdpbmRvd0NsZWFySW50ZXJ2YWwpCit7CisgICAgSU5DX1NUQVRTKCJET00u
RE9NV2luZG93LmNsZWFySW50ZXJ2YWwiKTsKKyAgICBDbGVhclRpbWVvdXRJbXBsKGFyZ3MpOwor
ICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="14312"
          type_id="1"
          status="-"
          setter="dglazkov"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28972</attachid>
            <date>2009-03-26 10:05:01 -0700</date>
            <delta_ts>2009-03-26 13:59:43 -0700</delta_ts>
            <desc>patch w/ Dimitri&apos;s comments</desc>
            <filename>bug24616.patch</filename>
            <type>text/plain</type>
            <size>26550</size>
            <attacher name="Mike Belshe">mbelshe</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTk2MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTEgQEAKKzIwMDktMDMtMjQgIE1pa2UgQmVsc2hlICA8bWlrZUBiZWxzaGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICBBZGQgVjgg
Y3VzdG9tIGJpbmRpbmdzIGZvciBET01XaW5kb3cuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDYxNgorCisgICAgICAgICogVjhET01XaW5kb3dDdXN0
b20uY3BwCisKIDIwMDktMDMtMjQgIEFkYW0gTGFuZ2xleSAgPGFnbEBnb29nbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IERhcmluIEZpc2hlci4KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mv
djgvVjhET01XaW5kb3dDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvVjhET01XaW5kb3dDdXN0b20uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9WOERPTVdpbmRvd0N1c3RvbS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjk4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgorCisjaW5jbHVk
ZSAiVjhCaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAi
VjhDdXN0b21FdmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgorCisjaW5jbHVk
ZSAiRE9NVGltZXIuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZFJl
cXVlc3QuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1TY3JlZW4uaCIKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCisj
aW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJXaW5kb3dGZWF0dXJlcy5oIgorCisKKy8v
IEhvcml6b250YWwgYW5kIHZlcnRpY2FsIG9mZnNldCwgZnJvbSB0aGUgcGFyZW50IGNvbnRlbnQg
YXJlYSwgYXJvdW5kIG5ld2x5CisvLyBvcGVuZWQgcG9wdXBzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBh
IGxvY2F0aW9uLgorc3RhdGljIGNvbnN0IGludCBwb3B1cFRpbGVQaXhlbHMgPSAxMDsKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitBQ0NFU1NPUl9TRVRURVIoRE9NV2luZG93TG9jYXRpb24pCit7
CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01X
cmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CisgICAgaWYgKGhv
bGRlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIERPTVdpbmRvdyogaW1wID0g
VjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRP
VywgaG9sZGVyKTsKKyAgICBXaW5kb3dTZXRMb2NhdGlvbihpbXAsIHRvV2ViQ29yZVN0cmluZyh2
YWx1ZSkpOworfQorCisKK0FDQ0VTU09SX1NFVFRFUihET01XaW5kb3dPcGVuZXIpCit7CisgICAg
RE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLkhvbGRlcigpKTsKKworICAgIGlmICghVjhQcm94eTo6
Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICAgICAgcmV0dXJuOworICAK
KyAgICAvLyBPcGVuZXIgY2FuIGJlIHNoYWRvd2VkIGlmIGl0IGlzIGluIHRoZSBzYW1lIGRvbWFp
bi4KKyAgICAvLyBIYXZlIGEgc3BlY2lhbCBoYW5kbGluZyBvZiBudWxsIHZhbHVlIHRvIGJlaGF2
ZQorICAgIC8vIGxpa2UgRmlyZWZveC4gU2VlIGJ1ZyBodHRwOi8vYi8xMjI0ODg3ICYgaHR0cDov
L2IvNzkxNzA2LgorICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgICAgLy8gaW1wLT5m
cmFtZSgpIGNhbm5vdCBiZSBudWxsLAorICAgICAgICAvLyBvdGhlcndpc2UsIFNhbWVPcmlnaW4g
Y2hlY2sgd291bGQgaGF2ZSBmYWlsZWQuCisgICAgICAgIEFTU0VSVChpbXAtPmZyYW1lKCkpOwor
ICAgICAgICBpbXAtPmZyYW1lKCktPmxvYWRlcigpLT5zZXRPcGVuZXIoMCk7CisgICAgfQorCisg
ICAgLy8gRGVsZXRlIHRoZSBhY2Nlc3NvciBmcm9tIHRoaXMgb2JqZWN0LgorICAgIGluZm8uSG9s
ZGVyKCktPkRlbGV0ZShuYW1lKTsKKworICAgIC8vIFB1dCBwcm9wZXJ0eSBvbiB0aGUgZnJvbnQg
KHRoaXMpIG9iamVjdC4KKyAgICBpbmZvLlRoaXMoKS0+U2V0KG5hbWUsIHZhbHVlKTsKK30KKwor
Q0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd0FkZEV2ZW50TGlzdGVuZXIpCit7CisgICAgSU5D
X1NUQVRTKCJET00uRE9NV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoKSIpOworICAgIERPTVdpbmRv
dyogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6
OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CisKKyAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vz
c0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVk
KCk7CisKKyAgICBpZiAoIWltcC0+ZnJhbWUoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsgIC8vIERPTVdpbmRvdyBjb3VsZCBiZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgZnJhbWUK
KyAgCisgICAgRG9jdW1lbnQqIGRvYyA9IGltcC0+ZnJhbWUoKS0+ZG9jdW1lbnQoKTsKKyAgICBp
ZiAoIWRvYykKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIC8vIFRPRE86
IENoZWNrIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggYXJndW1lbnRzCisgICAgVjhQcm94eSogcHJv
eHkgPSBWOFByb3h5OjpyZXRyaWV2ZShpbXAtPmZyYW1lKCkpOworICAgIGlmICghcHJveHkpCisg
ICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5l
cj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0s
IGZhbHNlKTsKKworICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICBTdHJpbmcgZXZlbnRUeXBl
ID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOworICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBh
cmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKKyAgICAgICAgZG9jLT5hZGRXaW5kb3dFdmVudExpc3Rl
bmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOworICAgIH0KKworICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7Cit9CisKKworQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1Jl
bW92ZUV2ZW50TGlzdGVuZXIpCit7CisgICAgSU5DX1NUQVRTKCJET00uRE9NV2luZG93LnJlbW92
ZUV2ZW50TGlzdGVuZXIoKSIpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIo
KSk7CisKKyAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1
ZSkpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBpZiAoIWltcC0+ZnJh
bWUoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIERvY3VtZW50KiBk
b2MgPSBpbXAtPmZyYW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYgKCFkb2MpCisgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJl
dHJpZXZlKGltcC0+ZnJhbWUoKSk7CisgICAgaWYgKCFwcm94eSkKKyAgICAgICAgcmV0dXJuIHY4
OjpVbmRlZmluZWQoKTsKKworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHBy
b3h5LT5GaW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKKworICAgIGlmIChsaXN0
ZW5lcikgeworICAgICAgICBTdHJpbmcgZXZlbnRUeXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3Nb
MF0pOworICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsK
KyAgICAgICAgZG9jLT5yZW1vdmVXaW5kb3dFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVu
ZXIuZ2V0KCksIHVzZUNhcHR1cmUpOworICAgIH0KKworICAgIHJldHVybiB2ODo6VW5kZWZpbmVk
KCk7Cit9CisKK0NBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dQb3N0TWVzc2FnZSkKK3sKKyAg
ICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cucG9zdE1lc3NhZ2UoKSIpOworICAgIERPTVdpbmRv
dyogd2luZG93ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CisKKyAgICBET01XaW5kb3cqIHNvdXJjZSA9
IFY4UHJveHk6OnJldHJpZXZlQWN0aXZlRnJhbWUoKS0+ZG9tV2luZG93KCk7CisgICAgQVNTRVJU
KHNvdXJjZS0+ZnJhbWUoKSk7CisKKyAgICBTdHJpbmcgdXJpID0gc291cmNlLT5mcmFtZSgpLT5s
b2FkZXIoKS0+dXJsKCkuc3RyaW5nKCk7CisKKyAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CisK
KyAgICBTdHJpbmcgbWVzc2FnZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKKyAgICBNZXNz
YWdlUG9ydCogcG9ydCA9IDA7CisgICAgU3RyaW5nIGRvbWFpbjsKKworICAgIC8vIFRoaXMgZnVu
Y3Rpb24gaGFzIHZhcmlhYmxlIGFyZ3VtZW50cyBhbmQgY2FuIGVpdGhlciBiZToKKyAgICAvLyAg
IHBvc3RNZXNzYWdlKG1lc3NhZ2UsIHBvcnQsIGRvbWFpbik7CisgICAgLy8gb3IKKyAgICAvLyAg
IHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRvbWFpbik7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAy
KSB7CisgICAgICAgIGlmIChWOFByb3h5OjpJc1dyYXBwZXJPZlR5cGUoYXJnc1sxXSwgVjhDbGFz
c0luZGV4OjpNRVNTQUdFUE9SVCkpCisgICAgICAgICAgICBwb3J0ID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3NbMV0p
OworICAgICAgICBkb21haW4gPSB2YWx1ZVRvU3RyaW5nV2l0aE51bGxPclVuZGVmaW5lZENoZWNr
KGFyZ3NbMl0pOworICAgIH0gZWxzZQorICAgICAgICBkb21haW4gPSB2YWx1ZVRvU3RyaW5nV2l0
aE51bGxPclVuZGVmaW5lZENoZWNrKGFyZ3NbMV0pOworCisgICAgaWYgKHRyeUNhdGNoLkhhc0Nh
dWdodCgpKQorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgd2luZG93LT5wb3N0TWVzc2FnZShtZXNzYWdlLCBwb3J0LCBkb21h
aW4sIHNvdXJjZSwgZWMpOworICAgIGlmIChlYykKKyAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhj
ZXB0aW9uKGVjKTsKKworICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7Cit9CisKKworc3RhdGlj
IGJvb2wgY2FuU2hvd01vZGFsRGlhbG9nTm93KGNvbnN0IEZyYW1lKiBmcmFtZSkKK3sKKyAgICAv
LyBBIGZyYW1lIGNhbiBvdXQgbGl2ZSBpdHMgcGFnZS4gU2VlIGJ1ZyAxMjE5NjEzLgorICAgIGlm
ICghZnJhbWUgfHwgIWZyYW1lLT5wYWdlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBy
ZXR1cm4gZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNhblJ1bk1vZGFsTm93KCk7Cit9CisKK3N0
YXRpYyBib29sIGFsbG93UG9wVXAoKQoreworICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJl
dHJpZXZlQWN0aXZlRnJhbWUoKTsKKworICAgIEFTU0VSVChmcmFtZSk7CisgICAgaWYgKGZyYW1l
LT5zY3JpcHQoKS0+cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCkpCisgICAgICAgIHJldHVybiB0cnVl
OworICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGZyYW1lLT5zZXR0aW5ncygpOworICAgIHJldHVy
biBzZXR0aW5ncyAmJiBzZXR0aW5ncy0+SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGlj
YWxseSgpOworfQorCitzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyc2VNb2RhbERp
YWxvZ0ZlYXR1cmVzKGNvbnN0IFN0cmluZyYgZmVhdHVyZXNBcmcpCit7CisgICAgSGFzaE1hcDxT
dHJpbmcsIFN0cmluZz4gbWFwOworCisgICAgVmVjdG9yPFN0cmluZz4gZmVhdHVyZXM7CisgICAg
ZmVhdHVyZXNBcmcuc3BsaXQoJzsnLCBmZWF0dXJlcyk7CisgICAgVmVjdG9yPFN0cmluZz46OmNv
bnN0X2l0ZXJhdG9yIGVuZCA9IGZlYXR1cmVzLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFN0cmlu
Zz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgIFN0cmluZyBmZWF0dXJlU3RyaW5nID0gKml0OworICAgICAgICBpbnQgcG9z
ID0gZmVhdHVyZVN0cmluZy5maW5kKCc9Jyk7CisgICAgICAgIGludCBjb2xvblBvcyA9IGZlYXR1
cmVTdHJpbmcuZmluZCgnOicpOworICAgICAgICBpZiAocG9zID49IDAgJiYgY29sb25Qb3MgPj0g
MCkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgLy8gaWdub3JlIGFueSBzdHJpbmdzIHRoYXQgaGF2
ZSBib3RoID0gYW5kIDoKKyAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICBwb3MgPSBj
b2xvblBvczsKKyAgICAgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgICAgIC8vIG51bGwgc3Ry
aW5nIGZvciB2YWx1ZSBtZWFucyBrZXkgd2l0aG91dCB2YWx1ZQorICAgICAgICAgICAgbWFwLnNl
dChmZWF0dXJlU3RyaW5nLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCksIFN0cmluZygpKTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBmZWF0dXJlU3RyaW5nLmxl
ZnQocG9zKS5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigpOworICAgICAgICAgICAgU3RyaW5nIHZh
bCA9IGZlYXR1cmVTdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpLnN0cmlwV2hpdGVTcGFjZSgpLmxv
d2VyKCk7CisgICAgICAgICAgICBpbnQgc3BhY2VQb3MgPSB2YWwuZmluZCgnICcpOworICAgICAg
ICAgICAgaWYgKHNwYWNlUG9zICE9IC0xKQorICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5sZWZ0
KHNwYWNlUG9zKTsKKyAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWwpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgcmV0dXJuIG1hcDsKK30KKworCitzdGF0aWMgRnJhbWUqIGNyZWF0ZVdpbmRv
dyhGcmFtZSogb3BlbmVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBT
dHJpbmcmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgZnJh
bWVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2luZG93RmVhdHVyZXMm
IHdpbmRvd0ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gZGlhbG9nQXJncykKK3sKKyAgICBGcmFtZSogYWN0aXZlRnJhbWUgPSBWOFByb3h5
OjpyZXRyaWV2ZUFjdGl2ZUZyYW1lKCk7CisKKyAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdDsK
KyAgICBpZiAoYWN0aXZlRnJhbWUpCisgICAgICAgIHJlcXVlc3Quc2V0SFRUUFJlZmVycmVyKGFj
dGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpKTsKKyAgICBGcmFtZUxvYWRS
ZXF1ZXN0IGZyYW1lUmVxdWVzdChyZXF1ZXN0LCBmcmFtZU5hbWUpOworCisgICAgLy8gRklYTUU6
IEl0J3MgbXVjaCBiZXR0ZXIgZm9yIGNsaWVudCBBUEkgaWYgYSBuZXcgd2luZG93IHN0YXJ0cyB3
aXRoIGEgVVJMLAorICAgIC8vIGhlcmUgd2hlcmUgd2Uga25vdyB3aGF0IFVSTCB3ZSBhcmUgZ29p
bmcgdG8gb3Blbi4gVW5mb3J0dW5hdGVseSwgdGhpcworICAgIC8vIGNvZGUgcGFzc2VzIHRoZSBl
bXB0eSBzdHJpbmcgZm9yIHRoZSBVUkwsIGJ1dCB0aGVyZSdzIGEgcmVhc29uIGZvciB0aGF0Lgor
ICAgIC8vIEJlZm9yZSBsb2FkaW5nIHdlIGhhdmUgdG8gc2V0IHVwIHRoZSBvcGVuZXIsIG9wZW5l
ZEJ5RE9NLAorICAgIC8vIGFuZCBkaWFsb2dBcmd1bWVudHMgdmFsdWVzLiBBbHNvLCB0byBkZWNp
ZGUgd2hldGhlciB0byB1c2UgdGhlIFVSTAorICAgIC8vIHdlIGN1cnJlbnRseSBkbyBhbiBhbGxv
d3NBY2Nlc3NGcm9tIGNhbGwgdXNpbmcgdGhlIHdpbmRvdyB3ZSBjcmVhdGUsCisgICAgLy8gd2hp
Y2ggY2FuJ3QgYmUgZG9uZSBiZWZvcmUgY3JlYXRpbmcgaXQuIFdlJ2QgaGF2ZSB0byByZXNvbHZl
IGFsbCB0aG9zZQorICAgIC8vIGlzc3VlcyB0byBwYXNzIHRoZSBVUkwgaW5zdGVhZCBvZiAiIi4K
KworICAgIGJvb2wgY3JlYXRlZDsKKyAgICAvLyBXZSBwYXNzIGluIHRoZSBvcGVuZXIgZnJhbWUg
aGVyZSBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgbG9va2luZyB1cCB0aGUKKyAgICAvLyBmcmFtZSBu
YW1lLCBpbiBjYXNlIHRoZSBhY3RpdmUgZnJhbWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9wZW5l
ciBmcmFtZSwKKyAgICAvLyBhbmQgdGhlIG5hbWUgcmVmZXJlbmNlcyBhIGZyYW1lIHJlbGF0aXZl
IHRvIHRoZSBvcGVuZXIgZnJhbWUsIGZvciBleGFtcGxlCisgICAgLy8gIl9zZWxmIiBvciAiX3Bh
cmVudCIuCisgICAgRnJhbWUqIG5ld0ZyYW1lID0gYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5jcmVh
dGVXaW5kb3cob3BlbmVyRnJhbWUtPmxvYWRlcigpLCBmcmFtZVJlcXVlc3QsIHdpbmRvd0ZlYXR1
cmVzLCBjcmVhdGVkKTsKKyAgICBpZiAoIW5ld0ZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIG5ld0ZyYW1lLT5sb2FkZXIoKS0+c2V0T3BlbmVyKG9wZW5lckZyYW1lKTsKKyAgICBuZXdG
cmFtZS0+bG9hZGVyKCktPnNldE9wZW5lZEJ5RE9NKCk7CisKKyAgICAvLyBTZXQgZGlhbG9nIGFy
Z3VtZW50cyBvbiB0aGUgZ2xvYmFsIG9iamVjdCBvZiB0aGUgbmV3IGZyYW1lLgorICAgIGlmICgh
ZGlhbG9nQXJncy5Jc0VtcHR5KCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChuZXdGcmFtZSk7CisgICAgICAgIGlmICghY29u
dGV4dC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShj
b250ZXh0KTsKKyAgICAgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQodjg6OlN0cmluZzo6
TmV3KCJkaWFsb2dBcmd1bWVudHMiKSwgZGlhbG9nQXJncyk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoIXBhcnNlVVJMKHVybCkuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxzZSkK
KyAgICAgICAgfHwgU2NyaXB0Q29udHJvbGxlcjo6aXNTYWZlU2NyaXB0KG5ld0ZyYW1lKSkgewor
ICAgICAgICBLVVJMIGNvbXBsZXRlZFVybCA9CisgICAgICAgICAgICB1cmwuaXNFbXB0eSgpID8g
S1VSTCgiIikgOiBhY3RpdmVGcmFtZS0+ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKTsKKyAg
ICAgICAgYm9vbCB1c2VyR2VzdHVyZSA9IGFjdGl2ZUZyYW1lLT5zY3JpcHQoKS0+cHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKCk7CisKKyAgICAgICAgaWYgKGNyZWF0ZWQpCisgICAgICAgICAgICBuZXdG
cmFtZS0+bG9hZGVyKCktPmNoYW5nZUxvY2F0aW9uKGNvbXBsZXRlZFVybCwgYWN0aXZlRnJhbWUt
PmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCBmYWxzZSwgdXNlckdlc3R1cmUp
OworICAgICAgICBlbHNlIGlmICghdXJsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG5ld0ZyYW1l
LT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShjb21wbGV0ZWRVcmwuc3RyaW5nKCks
IGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdl
c3R1cmUpOworICAgIH0KKworICAgIHJldHVybiBuZXdGcmFtZTsKK30KKworCisKK0NBTExCQUNL
X0ZVTkNfREVDTChET01XaW5kb3dTaG93TW9kYWxEaWFsb2cpCit7CisgICAgSU5DX1NUQVRTKCJE
T00uRE9NV2luZG93LnNob3dNb2RhbERpYWxvZygpIik7CisgICAgRE9NV2luZG93KiB3aW5kb3cg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KAorICAgICAgICBWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CisgICAgRnJhbWUqIGZyYW1lID0gd2luZG93
LT5mcmFtZSgpOworCisgICAgaWYgKCFmcmFtZSB8fCAhVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUo
ZnJhbWUsIHRydWUpKSAKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIGlm
ICghY2FuU2hvd01vZGFsRGlhbG9nTm93KGZyYW1lKSB8fCAhYWxsb3dQb3BVcCgpKQorICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAgU3RyaW5nIHVybCA9IHZhbHVlVG9TdHJp
bmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soYXJnc1swXSk7CisgICAgdjg6OkxvY2FsPHY4OjpW
YWx1ZT4gZGlhbG9nQXJncyA9IGFyZ3NbMV07CisgICAgU3RyaW5nIGZlYXR1cmVBcmdzID0gdmFs
dWVUb1N0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzJdKTsKKworICAgIGNvbnN0
IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVzID0gcGFyc2VNb2RhbERpYWxvZ0ZlYXR1
cmVzKGZlYXR1cmVBcmdzKTsKKworICAgIGNvbnN0IGJvb2wgdHJ1c3RlZCA9IGZhbHNlOworCisg
ICAgRmxvYXRSZWN0IHNjcmVlblJlY3QgPSBzY3JlZW5BdmFpbGFibGVSZWN0KGZyYW1lLT52aWV3
KCkpOworCisgICAgV2luZG93RmVhdHVyZXMgZmVhdHVyZXM7CisgICAgLy8gZGVmYXVsdCBoZXJl
IGNhbWUgZnJvbSBmcmFtZSBzaXplIG9mIGRpYWxvZyBpbiBNYWNJRS4KKyAgICBmZWF0dXJlcy53
aWR0aCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2d3aWR0
aCIsIDEwMCwgc2NyZWVuUmVjdC53aWR0aCgpLCA2MjApOworICAgIGZlYXR1cmVzLndpZHRoU2V0
ID0gdHJ1ZTsKKyAgICAvLyBkZWZhdWx0IGhlcmUgY2FtZSBmcm9tIGZyYW1lIHNpemUgb2YgZGlh
bG9nIGluIE1hY0lFLgorICAgIGZlYXR1cmVzLmhlaWdodCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9h
dEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2doZWlnaHQiLCAxMDAsIHNjcmVlblJlY3QuaGVpZ2h0
KCksIDQ1MCk7CisgICAgZmVhdHVyZXMuaGVpZ2h0U2V0ID0gdHJ1ZTsKKyAgCisgICAgZmVhdHVy
ZXMueCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2dsZWZ0
Iiwgc2NyZWVuUmVjdC54KCksIHNjcmVlblJlY3QucmlnaHQoKSAtIGZlYXR1cmVzLndpZHRoLCAt
MSk7CisgICAgZmVhdHVyZXMueFNldCA9IGZlYXR1cmVzLnggPiAwOworICAgIGZlYXR1cmVzLnkg
PSBXaW5kb3dGZWF0dXJlczo6ZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlhbG9ndG9wIiwgc2Ny
ZWVuUmVjdC55KCksIHNjcmVlblJlY3QuYm90dG9tKCkgLSBmZWF0dXJlcy5oZWlnaHQsIC0xKTsK
KyAgICBmZWF0dXJlcy55U2V0ID0gZmVhdHVyZXMueSA+IDA7CisKKyAgICBpZiAoV2luZG93RmVh
dHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVzLCAiY2VudGVyIiwgdHJ1ZSkpIHsKKyAgICAgICAg
aWYgKCFmZWF0dXJlcy54U2V0KSB7CisgICAgICAgICAgICBmZWF0dXJlcy54ID0gc2NyZWVuUmVj
dC54KCkgKyAoc2NyZWVuUmVjdC53aWR0aCgpIC0gZmVhdHVyZXMud2lkdGgpIC8gMjsKKyAgICAg
ICAgICAgIGZlYXR1cmVzLnhTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghZmVh
dHVyZXMueVNldCkgeworICAgICAgICAgICAgZmVhdHVyZXMueSA9IHNjcmVlblJlY3QueSgpICsg
KHNjcmVlblJlY3QuaGVpZ2h0KCkgLSBmZWF0dXJlcy5oZWlnaHQpIC8gMjsKKyAgICAgICAgICAg
IGZlYXR1cmVzLnlTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgZmVhdHVyZXMu
ZGlhbG9nID0gdHJ1ZTsKKyAgICBmZWF0dXJlcy5yZXNpemFibGUgPSBXaW5kb3dGZWF0dXJlczo6
Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJyZXNpemFibGUiKTsKKyAgICBmZWF0dXJlcy5zY3JvbGxi
YXJzVmlzaWJsZSA9IFdpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgInNjcm9s
bCIsIHRydWUpOworICAgIGZlYXR1cmVzLnN0YXR1c0JhclZpc2libGUgPSBXaW5kb3dGZWF0dXJl
czo6Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJzdGF0dXMiLCAhdHJ1c3RlZCk7CisgICAgZmVhdHVy
ZXMubWVudUJhclZpc2libGUgPSBmYWxzZTsKKyAgICBmZWF0dXJlcy50b29sQmFyVmlzaWJsZSA9
IGZhbHNlOworICAgIGZlYXR1cmVzLmxvY2F0aW9uQmFyVmlzaWJsZSA9IGZhbHNlOworICAgIGZl
YXR1cmVzLmZ1bGxzY3JlZW4gPSBmYWxzZTsKKworICAgIEZyYW1lKiBkaWFsb2dGcmFtZSA9IGNy
ZWF0ZVdpbmRvdyhmcmFtZSwgdXJsLCAiIiwgZmVhdHVyZXMsIGRpYWxvZ0FyZ3MpOworICAgIGlm
ICghZGlhbG9nRnJhbWUpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICAv
LyBIb2xkIG9uIHRvIHRoZSBjb250ZXh0IG9mIHRoZSBkaWFsb2cgd2luZG93IGxvbmcgZW5vdWdo
IHRvIHJldHJpZXZlIHRoZQorICAgIC8vIHZhbHVlIG9mIHRoZSByZXR1cm4gdmFsdWUgcHJvcGVy
dHkuCisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29u
dGV4dChkaWFsb2dGcmFtZSk7CisKKyAgICAvLyBSdW4gdGhlIGRpYWxvZy4KKyAgICBkaWFsb2dG
cmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+cnVuTW9kYWwoKTsKKworICAgIC8vIEV4dHJhY3QgdGhl
IHJldHVybiB2YWx1ZSBwcm9wZXJ0eSBmcm9tIHRoZSBkaWFsb2cgd2luZG93LgorICAgIHY4OjpM
b2NhbDx2ODo6VmFsdWU+IHJldHVyblZhbHVlOworICAgIGlmICghY29udGV4dC5Jc0VtcHR5KCkp
IHsKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworICAgICAgICBy
ZXR1cm5WYWx1ZSA9IGNvbnRleHQtPkdsb2JhbCgpLT5HZXQodjg6OlN0cmluZzo6TmV3KCJyZXR1
cm5WYWx1ZSIpKTsKKyAgICB9CisKKyAgICBpZiAoIXJldHVyblZhbHVlLklzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworCisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
K30KKworCitDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93T3BlbikKK3sKKyAgICBJTkNfU1RB
VFMoIkRPTS5ET01XaW5kb3cub3BlbigpIik7CisgICAgRE9NV2luZG93KiBwYXJlbnQgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBGcmFtZSogZnJhbWUgPSBwYXJlbnQtPmZyYW1lKCk7CisKKyAg
ICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGZyYW1lLCB0cnVlKSkKKyAgICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBGcmFtZSogYWN0aXZlRnJhbWUgPSBWOFByb3h5Ojpy
ZXRyaWV2ZUFjdGl2ZUZyYW1lKCk7CisgICAgaWYgKCFhY3RpdmVGcmFtZSkKKyAgICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBQYWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAg
ICBpZiAoIXBhZ2UpCisgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAgU3RyaW5n
IHVybFN0cmluZyA9IHZhbHVlVG9TdHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soYXJnc1sw
XSk7CisgICAgQXRvbWljU3RyaW5nIGZyYW1lTmFtZSA9IChhcmdzWzFdLT5Jc1VuZGVmaW5lZCgp
IHx8IGFyZ3NbMV0tPklzTnVsbCgpKSA/ICJfYmxhbmsiIDogQXRvbWljU3RyaW5nKHRvV2ViQ29y
ZVN0cmluZyhhcmdzWzFdKSk7CisKKyAgICAvLyBCZWNhdXNlIEZyYW1lVHJlZTo6ZmluZCgpIHJl
dHVybnMgdHJ1ZSBmb3IgZW1wdHkgc3RyaW5ncywgd2UgbXVzdCBjaGVjaworICAgIC8vIGZvciBl
bXB0eSBmcmFtZW5hbWVzLiBPdGhlcndpc2UsIGlsbGVnaXRpbWF0ZSB3aW5kb3cub3BlbigpIGNh
bGxzIHdpdGgKKyAgICAvLyBubyBuYW1lIHdpbGwgcGFzcyByaWdodCB0aHJvdWdoIHRoZSBwb3B1
cCBibG9ja2VyLgorICAgIGlmICghYWxsb3dQb3BVcCgpICYmCisgICAgICAgIChmcmFtZU5hbWUu
aXNFbXB0eSgpIHx8ICFmcmFtZS0+dHJlZSgpLT5maW5kKGZyYW1lTmFtZSkpKSB7CisgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgfQorCisgICAgLy8gR2V0IHRoZSB0YXJnZXQg
ZnJhbWUgZm9yIHRoZSBzcGVjaWFsIGNhc2VzIG9mIF90b3AgYW5kIF9wYXJlbnQuICBJbiB0aG9z
ZQorICAgIC8vIGNhc2VzLCB3ZSBjYW4gc2NoZWR1bGUgYSBsb2NhdGlvbiBjaGFuZ2UgcmlnaHQg
bm93IGFuZCByZXR1cm4gZWFybHkuCisgICAgYm9vbCB0b3BPclBhcmVudCA9IGZhbHNlOworICAg
IGlmIChmcmFtZU5hbWUgPT0gIl90b3AiKSB7CisgICAgICAgIGZyYW1lID0gZnJhbWUtPnRyZWUo
KS0+dG9wKCk7CisgICAgICAgIHRvcE9yUGFyZW50ID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGZy
YW1lTmFtZSA9PSAiX3BhcmVudCIpIHsKKyAgICAgICAgaWYgKEZyYW1lKiBwYXJlbnQgPSBmcmFt
ZS0+dHJlZSgpLT5wYXJlbnQoKSkKKyAgICAgICAgICAgIGZyYW1lID0gcGFyZW50OworICAgICAg
ICB0b3BPclBhcmVudCA9IHRydWU7CisgICAgfQorICAgIGlmICh0b3BPclBhcmVudCkgeworICAg
ICAgICBpZiAoIWFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+c2hvdWxkQWxsb3dOYXZpZ2F0aW9uKGZy
YW1lKSkKKyAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgCisgICAgICAg
IFN0cmluZyBjb21wbGV0ZWRVcmw7CisgICAgICAgIGlmICghdXJsU3RyaW5nLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIGNvbXBsZXRlZFVybCA9IGFjdGl2ZUZyYW1lLT5kb2N1bWVudCgpLT5jb21w
bGV0ZVVSTCh1cmxTdHJpbmcpOworICAgIAorICAgICAgICBpZiAoIWNvbXBsZXRlZFVybC5pc0Vt
cHR5KCkgJiYKKyAgICAgICAgICAgICghcGFyc2VVUkwodXJsU3RyaW5nKS5zdGFydHNXaXRoKCJq
YXZhc2NyaXB0OiIsIGZhbHNlKQorICAgICAgICAgICAgIHx8IFNjcmlwdENvbnRyb2xsZXI6Omlz
U2FmZVNjcmlwdChmcmFtZSkpKSB7CisgICAgICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0
aXZlRnJhbWUtPnNjcmlwdCgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKTsKKyAgICAgICAgICAg
IGZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShjb21wbGV0ZWRVcmwsIGFj
dGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdlc3R1
cmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworICAgIH0KKworICAgIC8v
IEluIHRoZSBjYXNlIG9mIGEgbmFtZWQgZnJhbWUgb3IgYSBuZXcgd2luZG93LCB3ZSdsbCB1c2Ug
dGhlCisgICAgLy8gY3JlYXRlV2luZG93KCkgaGVscGVyLgorCisgICAgLy8gUGFyc2UgdGhlIHZh
bHVlcywgYW5kIHRoZW4gd29yayB3aXRoIGEgY29weSBvZiB0aGUgcGFyc2VkIHZhbHVlcworICAg
IC8vIHNvIHdlIGNhbiByZXN0b3JlIHRoZSB2YWx1ZXMgd2UgbWF5IG5vdCB3YW50IHRvIG92ZXJ3
cml0ZSBhZnRlcgorICAgIC8vIHdlIGRvIHRoZSBtdWx0aXBsZSBtb25pdG9yIGZpeGVzLgorICAg
IFdpbmRvd0ZlYXR1cmVzIHJhd0ZlYXR1cmVzKHZhbHVlVG9TdHJpbmdXaXRoTnVsbE9yVW5kZWZp
bmVkQ2hlY2soYXJnc1syXSkpOworICAgIFdpbmRvd0ZlYXR1cmVzIHdpbmRvd0ZlYXR1cmVzKHJh
d0ZlYXR1cmVzKTsKKyAgICBGbG9hdFJlY3Qgc2NyZWVuUmVjdCA9IHNjcmVlbkF2YWlsYWJsZVJl
Y3QocGFnZS0+bWFpbkZyYW1lKCktPnZpZXcoKSk7CisKKyAgICAvLyBTZXQgZGVmYXVsdCBzaXpl
IGFuZCBsb2NhdGlvbiBuZWFyIHBhcmVudCB3aW5kb3cgaWYgbm9uZSB3ZXJlIHNwZWNpZmllZC4K
KyAgICAvLyBUaGVzZSBtYXkgYmUgZnVydGhlciBtb2RpZmllZCBieSBhZGp1c3RXaW5kb3dSZWN0
LCBiZWxvdy4KKyAgICBpZiAoIXdpbmRvd0ZlYXR1cmVzLnhTZXQpIHsKKyAgICAgICAgd2luZG93
RmVhdHVyZXMueCA9IHBhcmVudC0+c2NyZWVuWCgpIC0gc2NyZWVuUmVjdC54KCkgKyBwb3B1cFRp
bGVQaXhlbHM7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVzLnhTZXQgPSB0cnVlOworICAgIH0KKyAg
ICBpZiAoIXdpbmRvd0ZlYXR1cmVzLnlTZXQpIHsKKyAgICAgICAgd2luZG93RmVhdHVyZXMueSA9
IHBhcmVudC0+c2NyZWVuWSgpIC0gc2NyZWVuUmVjdC55KCkgKyBwb3B1cFRpbGVQaXhlbHM7Cisg
ICAgICAgIHdpbmRvd0ZlYXR1cmVzLnlTZXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoIXdpbmRv
d0ZlYXR1cmVzLndpZHRoU2V0KSB7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVzLndpZHRoID0gcGFy
ZW50LT5pbm5lcldpZHRoKCk7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVzLndpZHRoU2V0ID0gdHJ1
ZTsKKyAgICB9CisgICAgaWYgKCF3aW5kb3dGZWF0dXJlcy5oZWlnaHRTZXQpIHsKKyAgICAgICAg
d2luZG93RmVhdHVyZXMuaGVpZ2h0ID0gcGFyZW50LT5pbm5lckhlaWdodCgpOworICAgICAgICB3
aW5kb3dGZWF0dXJlcy5oZWlnaHRTZXQgPSB0cnVlOworICAgIH0KKworICAgIEZsb2F0UmVjdCB3
aW5kb3dSZWN0KHdpbmRvd0ZlYXR1cmVzLngsIHdpbmRvd0ZlYXR1cmVzLnksIHdpbmRvd0ZlYXR1
cmVzLndpZHRoLCB3aW5kb3dGZWF0dXJlcy5oZWlnaHQpOworCisgICAgLy8gVGhlIG5ldyB3aW5k
b3cncyBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBpdHMgY3VycmVudCBzY3JlZW4sIHNvIHNoaWZ0
CisgICAgLy8gaXQgaW4gY2FzZSBpdCdzIG9uIGEgc2Vjb25kYXJ5IG1vbml0b3IuIFNlZSBodHRw
Oi8vYi92aWV3SXNzdWU/aWQ9OTY3OTA1LgorICAgIHdpbmRvd1JlY3QubW92ZShzY3JlZW5SZWN0
LngoKSwgc2NyZWVuUmVjdC55KCkpOworICAgIFdlYkNvcmU6OkRPTVdpbmRvdzo6YWRqdXN0V2lu
ZG93UmVjdChzY3JlZW5SZWN0LCB3aW5kb3dSZWN0LCB3aW5kb3dSZWN0KTsKKworICAgIHdpbmRv
d0ZlYXR1cmVzLnggPSB3aW5kb3dSZWN0LngoKTsKKyAgICB3aW5kb3dGZWF0dXJlcy55ID0gd2lu
ZG93UmVjdC55KCk7CisgICAgd2luZG93RmVhdHVyZXMuaGVpZ2h0ID0gd2luZG93UmVjdC5oZWln
aHQoKTsKKyAgICB3aW5kb3dGZWF0dXJlcy53aWR0aCA9IHdpbmRvd1JlY3Qud2lkdGgoKTsKKwor
ICAgIC8vIElmIGVpdGhlciBvZiB0aGUgb3JpZ2luIGNvb3JkaW5hdGVzIHdlcmVuJ3Qgc2V0IGlu
IHRoZSBvcmlnaW5hbAorICAgIC8vIHN0cmluZywgbWFrZSBzdXJlIHRoZXkgYXJlbid0IHNldCBu
b3cuCisgICAgaWYgKCFyYXdGZWF0dXJlcy54U2V0KSB7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVz
LnggPSAwOworICAgICAgICB3aW5kb3dGZWF0dXJlcy54U2V0ID0gZmFsc2U7CisgICAgfQorICAg
IGlmICghcmF3RmVhdHVyZXMueVNldCkgeworICAgICAgICB3aW5kb3dGZWF0dXJlcy55ID0gMDsK
KyAgICAgICAgd2luZG93RmVhdHVyZXMueVNldCA9IGZhbHNlOworICAgIH0KKworICAgIGZyYW1l
ID0gY3JlYXRlV2luZG93KGZyYW1lLCB1cmxTdHJpbmcsIGZyYW1lTmFtZSwgd2luZG93RmVhdHVy
ZXMsIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCkpOworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworfQorCisKK0lO
REVYRURfUFJPUEVSVFlfR0VUVEVSKERPTVdpbmRvdykKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5E
T01XaW5kb3cuSW5kZXhlZFByb3BlcnR5R2V0dGVyIik7CisgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBpbmZvLlRoaXMoKSk7CisgICAgaWYgKGhvbGRlci5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworCisgICAgRE9NV2luZG93KiB3aW5k
b3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBob2xkZXIpOworICAgIGlmICghd2luZG93KQorICAgICAgICByZXR1cm4gbm90SGFu
ZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKworICAgIEZyYW1lKiBmcmFtZSA9IHdpbmRvdy0+ZnJhbWUo
KTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0
b3IoKTsKKworICAgIEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVlKCktPmNoaWxkKGluZGV4KTsK
KyAgICBpZiAoY2hpbGQpCisgICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBjaGlsZC0+ZG9tV2luZG93KCkpOworCisgICAgcmV0dXJuIHY4
OjpIYW5kbGU8djg6OlZhbHVlPigpOworfQorCisKK05BTUVEX1BST1BFUlRZX0dFVFRFUihET01X
aW5kb3cpCit7CisgICAgSU5DX1NUQVRTKCJET00uRE9NV2luZG93Lk5hbWVkUHJvcGVydHlHZXR0
ZXIiKTsKKyAgICAvLyBUaGUga2V5IG11c3QgYmUgYSBzdHJpbmcuCisgICAgaWYgKCFuYW1lLT5J
c1N0cmluZygpKQorICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CisKKyAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGhvbGRlciA9IFY4UHJveHk6Okxvb2t1cERPTVdyYXBw
ZXIoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGluZm8uVGhpcygpKTsKKyAgICBpZiAoaG9sZGVy
LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpOworCisg
ICAgRE9NV2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOworICAgIGlmICghd2luZG93KQorICAg
ICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CisKKyAgICBTdHJpbmcgcHJvcE5h
bWUgPSB0b1dlYkNvcmVTdHJpbmcobmFtZSk7CisKKyAgICBGcmFtZSogZnJhbWUgPSB3aW5kb3ct
PmZyYW1lKCk7CisgICAgLy8gd2luZG93IGlzIGRldGFjaGVkIGZyb20gYSBmcmFtZS4KKyAgICBp
ZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7CisKKyAg
ICAvLyBTZWFyY2ggc3ViLWZyYW1lcy4KKyAgICBGcmFtZSogY2hpbGQgPSBmcmFtZS0+dHJlZSgp
LT5jaGlsZChwcm9wTmFtZSk7CisgICAgaWYgKGNoaWxkKQorICAgICAgICByZXR1cm4gVjhQcm94
eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgY2hpbGQtPmRvbVdpbmRvdygp
KTsKKworICAgIC8vIFNlYXJjaCBJREwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIHByb3RvdHlw
ZQorICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiByZXN1bHQgPSBob2xkZXItPkdldFJlYWxOYW1l
ZFByb3BlcnR5SW5Qcm90b3R5cGVDaGFpbihuYW1lKTsKKyAgICBpZiAoIXJlc3VsdC5Jc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAvLyBMYXp5IGluaXRpYWxpemF0aW9u
IG1hcCBrZWVwcyBnbG9iYWwgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBsYXppbHkKKyAgICAvLyBp
bml0aWFsaXplZC4gVGhlIHZhbHVlIGlzIHRoZSBjb2RlIHRvIGluc3RhbnRpYXRlIHRoZSBwcm9w
ZXJ0eS4KKyAgICAvLyBJdCBtdXN0IHJldHVybiB0aGUgdmFsdWUgb2YgcHJvcGVydHkgYWZ0ZXIg
aW5pdGlhbGl6YXRpb24uCisgICAgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGxhenlJ
bml0TWFwOworICAgIGlmIChsYXp5SW5pdE1hcC5pc0VtcHR5KCkpIHsKKyAgICAgIC8vICJuZXcg
SW1hZ2UoKSIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHdlbGwtZGVmaW5lZCBpbiBhIHNwZWMsIGJ1
dCBTYWZhcmksCisgICAgICAvLyBPcGVyYSwgYW5kIEZpcmVmb3ggYWxsIGNvbnNpZGVyIGl0IHRv
IGFsd2F5cyBjcmVhdGUgYW4gSFRNTCBpbWFnZQorICAgICAgLy8gZWxlbWVudCwgcmVnYXJkbGVz
cyBvZiB0aGUgY3VycmVudCBkb2N0eXBlLgorICAgICAgbGF6eUluaXRNYXAuc2V0KCJJbWFnZSIs
CisgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBJbWFnZSgpIHsgXAorICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCBcCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAn
aW1nJyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH07IFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIEltYWdlIik7CisgICAgICBsYXp5SW5pdE1hcC5zZXQoIk9wdGlvbiIsCisgICAgICAg
ICJmdW5jdGlvbiBPcHRpb24odGV4dCwgdmFsdWUsIGRlZmF1bHRTZWxlY3RlZCwgc2VsZWN0ZWQp
IHsgXAorICAgICAgICAgICB2YXIgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0
aW9uJyk7IFwKKyAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuIG9wdGlvbjsgXAor
ICAgICAgICAgICBvcHRpb24udGV4dCA9IHRleHQ7IFwKKyAgICAgICAgICAgaWYgKHZhbHVlID09
IG51bGwpIHJldHVybiBvcHRpb247IFwKKyAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gdmFsdWU7
IFwKKyAgICAgICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PSBudWxsKSByZXR1cm4gb3B0aW9u
OyBcCisgICAgICAgICAgIG9wdGlvbi5kZWZhdWx0U2VsZWN0ZWQgPSBkZWZhdWx0U2VsZWN0ZWQ7
IFwKKyAgICAgICAgICAgaWYgKHNlbGVjdGVkID09IG51bGwpIHJldHVybiBvcHRpb247IFwKKyAg
ICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gc2VsZWN0ZWQ7IFwKKyAgICAgICAgICAgcmV0dXJu
IG9wdGlvbjsgXAorICAgICAgICAgfTsgXAorICAgICAgICAgT3B0aW9uIik7CisgICAgfQorCisg
ICAgU3RyaW5nIGNvZGUgPSBsYXp5SW5pdE1hcC5nZXQocHJvcE5hbWUpOworICAgIGlmICghY29k
ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0g
VjhQcm94eTo6R2V0Q29udGV4dCh3aW5kb3ctPmZyYW1lKCkpOworICAgICAgICAvLyBCYWlsIG91
dCBpZiB3ZSBjYW5ub3QgZ2V0IHRoZSBjb250ZXh0IGZvciB0aGUgZnJhbWUuCisgICAgICAgIGlm
IChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4oKTsKKyAgCisgICAgICAgIC8vIHN3aXRjaCB0byB0aGUgdGFyZ2V0IG9iamVjdCdzIGVu
dmlyb25tZW50LgorICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisK
KyAgICAgICAgLy8gU2V0IHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHVuZGVmaW5lZCB0byBtYWtlIHN1
cmUgdGhhdCB0aGUKKyAgICAgICAgLy8gcHJvcGVydHkgZXhpc3RzLiAgVGhpcyBpcyBuZWNlc3Nh
cnkgYmVjYXVzZSB0aGlzIGdldHRlcgorICAgICAgICAvLyBtaWdodCBiZSBjYWxsZWQgd2hlbiBl
dmFsdWF0aW5nICd2YXIgUmFuZ2VFeGNlcHRpb24gPSB2YWx1ZScKKyAgICAgICAgLy8gdG8gZmln
dXJlIG91dCBpZiB3ZSBoYXZlIGEgcHJvcGVydHkgbmFtZWQgJ1JhbmdlRXhjZXB0aW9uJyBiZWZv
cmUKKyAgICAgICAgLy8gd2Ugc2V0IFJhbmdlRXhjZXB0aW9uIHRvIHRoZSBuZXcgdmFsdWUuICBJ
biB0aGF0IGNhc2UsIHdlIHdpbGwKKyAgICAgICAgLy8gZXZhbHVhdGUgJ3ZhciBSYW5nZUV4Y2Vw
dGlvbiA9IHt9JyBhbmQgZW50ZXIgYW4gaW5maW5pdGUgbG9vcC4KKyAgICAgICAgLy8gU2V0dGlu
ZyB0aGUgcHJvcGVydHkgbmFtZSB0byB1bmRlZmluZWQgb24gdGhlIGdsb2JhbCBvYmplY3QKKyAg
ICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGRvIG5vdCBoYXZlIHRvIGFzayB0aGlzIGdldHRlciB0
byBmaWd1cmUgb3V0CisgICAgICAgIC8vIHRoYXQgd2UgaGF2ZSB0aGUgcHJvcGVydHkuCisgICAg
ICAgIC8vCisgICAgICAgIC8vIFRPRE8oYWdlcik6IFdlIHByb2JhYmx5IHNob3VsZCBpbXBsZW1l
bnQgdGhlIEhhcyBtZXRob2QKKyAgICAgICAgLy8gZm9yIHRoZSBpbnRlcmNlcHRvciBpbnN0ZWFk
IG9mIHVzaW5nIHRoZSBkZWZhdWx0IEhhcyBtZXRob2QKKyAgICAgICAgLy8gdGhhdCBjYWxscyBH
ZXQuCisgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQodjhTdHJpbmcocHJvcE5hbWUpLCB2
ODo6VW5kZWZpbmVkKCkpOworICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJp
ZXZlKHdpbmRvdy0+ZnJhbWUoKSk7CisgICAgICAgIEFTU0VSVChwcm94eSk7CisKKyAgICAgICAg
cmV0dXJuIHByb3h5LT5ldmFsdWF0ZShXZWJDb3JlOjpTY3JpcHRTb3VyY2VDb2RlKGNvZGUpLCAw
KTsKKyAgICB9CisKKyAgICAvLyBTZWFyY2ggbmFtZWQgaXRlbXMgaW4gdGhlIGRvY3VtZW50Lgor
ICAgIERvY3VtZW50KiBkb2MgPSBmcmFtZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoZG9jKSB7Cisg
ICAgICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gaXRlbXMgPSBkb2MtPndpbmRvd05hbWVkSXRl
bXMocHJvcE5hbWUpOworICAgICAgICBpZiAoaXRlbXMtPmxlbmd0aCgpID49IDEpIHsKKyAgICAg
ICAgICAgIGlmIChpdGVtcy0+bGVuZ3RoKCkgPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
VjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoaXRlbXMtPmZpcnN0SXRlbSgpKTsKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9iamVjdChWOENsYXNz
SW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6VmFsdWU+KCk7Cit9CisKKwordm9pZCBWOEN1c3Rv
bTo6V2luZG93U2V0TG9jYXRpb24oRE9NV2luZG93KiB3aW5kb3csIGNvbnN0IFN0cmluZyYgdikK
K3sKKyAgICBpZiAoIXdpbmRvdy0+ZnJhbWUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJh
bWUqIGFjdGl2ZUZyYW1lID0gU2NyaXB0Q29udHJvbGxlcjo6cmV0cmlldmVBY3RpdmVGcmFtZSgp
OworICAgIGlmICghYWN0aXZlRnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghYWN0
aXZlRnJhbWUtPmxvYWRlcigpLT5zaG91bGRBbGxvd05hdmlnYXRpb24od2luZG93LT5mcmFtZSgp
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFwYXJzZVVSTCh2KS5zdGFydHNXaXRoKCJq
YXZhc2NyaXB0OiIsIGZhbHNlKQorICAgICAgICB8fCBTY3JpcHRDb250cm9sbGVyOjppc1NhZmVT
Y3JpcHQod2luZG93LT5mcmFtZSgpKSkgeworICAgICAgICBTdHJpbmcgY29tcGxldGVkVXJsID0g
YWN0aXZlRnJhbWUtPmxvYWRlcigpLT5jb21wbGV0ZVVSTCh2KS5zdHJpbmcoKTsKKyAgCisgICAg
ICAgIC8vIEZJWE1FOiBUaGUgSlNDIGJpbmRpbmdzIHBhc3MgIWFueVBhZ2VJc1Byb2Nlc3NpbmdV
c2VyR2VzdHVyZSgpIGZvcgorICAgICAgICAvLyB0aGUgbG9ja0hpc3RvcnkgcGFyYW1ldGVyLiAg
V2Ugc2hvdWxkIHByb2JhYmx5IGRvIHNvbWV0aGluZyBzaW1pbGFyLgorICAKKyAgICAgICAgd2lu
ZG93LT5mcmFtZSgpLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShjb21wbGV0ZWRV
cmwsCisgICAgICAgICAgICBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJyZXIo
KSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgYWN0aXZlRnJhbWUtPnNjcmlwdCgpLT5wcm9j
ZXNzaW5nVXNlckdlc3R1cmUoKSk7CisgICAgfQorfQorCisKK0NBTExCQUNLX0ZVTkNfREVDTChE
T01XaW5kb3dTZXRUaW1lb3V0KQoreworICAgIElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5zZXRU
aW1lb3V0KCkiKTsKKyAgICByZXR1cm4gV2luZG93U2V0VGltZW91dEltcGwoYXJncywgdHJ1ZSk7
Cit9CisKKworQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1NldEludGVydmFsKQoreworICAg
IElOQ19TVEFUUygiRE9NLkRPTVdpbmRvdy5zZXRJbnRlcnZhbCgpIik7CisgICAgcmV0dXJuIFdp
bmRvd1NldFRpbWVvdXRJbXBsKGFyZ3MsIGZhbHNlKTsKK30KKworCit2b2lkIFY4Q3VzdG9tOjpD
bGVhclRpbWVvdXRJbXBsKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IGhvbGRlciA9IGFyZ3MuSG9sZGVyKCk7CisgICAgRE9NV2luZG93KiBp
bXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBob2xkZXIpOworICAgIGlmICghVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUoaW1wLT5m
cmFtZSgpLCB0cnVlKSkKKyAgICAgICAgcmV0dXJuOworICAgIFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxTY3JpcHRFeGVjdXRpb25Db250ZXh0Kj4oaW1wLT5m
cmFtZSgpLT5kb2N1bWVudCgpKTsKKyAgICBpbnQgaGFuZGxlID0gdG9JbnQzMihhcmdzWzBdKTsK
KyAgICBET01UaW1lcjo6cmVtb3ZlQnlJZChjb250ZXh0LCBoYW5kbGUpOworfQorCisKK0NBTExC
QUNLX0ZVTkNfREVDTChET01XaW5kb3dDbGVhclRpbWVvdXQpCit7CisgICAgSU5DX1NUQVRTKCJE
T00uRE9NV2luZG93LmNsZWFyVGltZW91dCIpOworICAgIENsZWFyVGltZW91dEltcGwoYXJncyk7
CisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKworQ0FMTEJBQ0tfRlVOQ19ERUNMKERP
TVdpbmRvd0NsZWFySW50ZXJ2YWwpCit7CisgICAgSU5DX1NUQVRTKCJET00uRE9NV2luZG93LmNs
ZWFySW50ZXJ2YWwiKTsKKyAgICBDbGVhclRpbWVvdXRJbXBsKGFyZ3MpOworICAgIHJldHVybiB2
ODo6VW5kZWZpbmVkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="14334"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28983</attachid>
            <date>2009-03-26 13:59:43 -0700</date>
            <delta_ts>2009-03-28 09:29:44 -0700</delta_ts>
            <desc>use notImplementedByInterceptor()</desc>
            <filename>bug24616.patch</filename>
            <type>text/plain</type>
            <size>26564</size>
            <attacher name="Mike Belshe">mbelshe</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTk2MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTEgQEAKKzIwMDktMDMtMjQgIE1pa2UgQmVsc2hlICA8bWlrZUBiZWxzaGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICBBZGQgVjgg
Y3VzdG9tIGJpbmRpbmdzIGZvciBET01XaW5kb3cuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDYxNgorCisgICAgICAgICogVjhET01XaW5kb3dDdXN0
b20uY3BwCisKIDIwMDktMDMtMjQgIEFkYW0gTGFuZ2xleSAgPGFnbEBnb29nbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IERhcmluIEZpc2hlci4KSW5kZXg6IFdlYkNvcmUvYmluZGluZ3Mv
djgvVjhET01XaW5kb3dDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3Mv
djgvVjhET01XaW5kb3dDdXN0b20uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9iaW5kaW5n
cy92OC9WOERPTVdpbmRvd0N1c3RvbS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjk4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgorCisjaW5jbHVk
ZSAiVjhCaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAi
VjhDdXN0b21FdmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgorCisjaW5jbHVk
ZSAiRE9NVGltZXIuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZFJl
cXVlc3QuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1TY3JlZW4uaCIKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCisj
aW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJXaW5kb3dGZWF0dXJlcy5oIgorCisKKy8v
IEhvcml6b250YWwgYW5kIHZlcnRpY2FsIG9mZnNldCwgZnJvbSB0aGUgcGFyZW50IGNvbnRlbnQg
YXJlYSwgYXJvdW5kIG5ld2x5CisvLyBvcGVuZWQgcG9wdXBzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBh
IGxvY2F0aW9uLgorc3RhdGljIGNvbnN0IGludCBwb3B1cFRpbGVQaXhlbHMgPSAxMDsKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitBQ0NFU1NPUl9TRVRURVIoRE9NV2luZG93TG9jYXRpb24pCit7
CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01X
cmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CisgICAgaWYgKGhv
bGRlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIERPTVdpbmRvdyogaW1wID0g
VjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRP
VywgaG9sZGVyKTsKKyAgICBXaW5kb3dTZXRMb2NhdGlvbihpbXAsIHRvV2ViQ29yZVN0cmluZyh2
YWx1ZSkpOworfQorCisKK0FDQ0VTU09SX1NFVFRFUihET01XaW5kb3dPcGVuZXIpCit7CisgICAg
RE9NV2luZG93KiBpbXAgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLkhvbGRlcigpKTsKKworICAgIGlmICghVjhQcm94eTo6
Q2FuQWNjZXNzRnJhbWUoaW1wLT5mcmFtZSgpLCB0cnVlKSkKKyAgICAgICAgcmV0dXJuOworICAK
KyAgICAvLyBPcGVuZXIgY2FuIGJlIHNoYWRvd2VkIGlmIGl0IGlzIGluIHRoZSBzYW1lIGRvbWFp
bi4KKyAgICAvLyBIYXZlIGEgc3BlY2lhbCBoYW5kbGluZyBvZiBudWxsIHZhbHVlIHRvIGJlaGF2
ZQorICAgIC8vIGxpa2UgRmlyZWZveC4gU2VlIGJ1ZyBodHRwOi8vYi8xMjI0ODg3ICYgaHR0cDov
L2IvNzkxNzA2LgorICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgICAgLy8gaW1wLT5m
cmFtZSgpIGNhbm5vdCBiZSBudWxsLAorICAgICAgICAvLyBvdGhlcndpc2UsIFNhbWVPcmlnaW4g
Y2hlY2sgd291bGQgaGF2ZSBmYWlsZWQuCisgICAgICAgIEFTU0VSVChpbXAtPmZyYW1lKCkpOwor
ICAgICAgICBpbXAtPmZyYW1lKCktPmxvYWRlcigpLT5zZXRPcGVuZXIoMCk7CisgICAgfQorCisg
ICAgLy8gRGVsZXRlIHRoZSBhY2Nlc3NvciBmcm9tIHRoaXMgb2JqZWN0LgorICAgIGluZm8uSG9s
ZGVyKCktPkRlbGV0ZShuYW1lKTsKKworICAgIC8vIFB1dCBwcm9wZXJ0eSBvbiB0aGUgZnJvbnQg
KHRoaXMpIG9iamVjdC4KKyAgICBpbmZvLlRoaXMoKS0+U2V0KG5hbWUsIHZhbHVlKTsKK30KKwor
Q0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd0FkZEV2ZW50TGlzdGVuZXIpCit7CisgICAgSU5D
X1NUQVRTKCJET00uRE9NV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoKSIpOworICAgIERPTVdpbmRv
dyogaW1wID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6
OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CisKKyAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vz
c0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1ZSkpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVk
KCk7CisKKyAgICBpZiAoIWltcC0+ZnJhbWUoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmlu
ZWQoKTsgIC8vIERPTVdpbmRvdyBjb3VsZCBiZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgZnJhbWUK
KyAgCisgICAgRG9jdW1lbnQqIGRvYyA9IGltcC0+ZnJhbWUoKS0+ZG9jdW1lbnQoKTsKKyAgICBp
ZiAoIWRvYykKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIC8vIFRPRE86
IENoZWNrIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggYXJndW1lbnRzCisgICAgVjhQcm94eSogcHJv
eHkgPSBWOFByb3h5OjpyZXRyaWV2ZShpbXAtPmZyYW1lKCkpOworICAgIGlmICghcHJveHkpCisg
ICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBSZWZQdHI8RXZlbnRMaXN0ZW5l
cj4gbGlzdGVuZXIgPSBwcm94eS0+RmluZE9yQ3JlYXRlVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0s
IGZhbHNlKTsKKworICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICBTdHJpbmcgZXZlbnRUeXBl
ID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOworICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBh
cmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsKKyAgICAgICAgZG9jLT5hZGRXaW5kb3dFdmVudExpc3Rl
bmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOworICAgIH0KKworICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7Cit9CisKKworQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd1Jl
bW92ZUV2ZW50TGlzdGVuZXIpCit7CisgICAgSU5DX1NUQVRTKCJET00uRE9NV2luZG93LnJlbW92
ZUV2ZW50TGlzdGVuZXIoKSIpOworICAgIERPTVdpbmRvdyogaW1wID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5kZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIo
KSk7CisKKyAgICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGltcC0+ZnJhbWUoKSwgdHJ1
ZSkpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBpZiAoIWltcC0+ZnJh
bWUoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIERvY3VtZW50KiBk
b2MgPSBpbXAtPmZyYW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYgKCFkb2MpCisgICAgICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJl
dHJpZXZlKGltcC0+ZnJhbWUoKSk7CisgICAgaWYgKCFwcm94eSkKKyAgICAgICAgcmV0dXJuIHY4
OjpVbmRlZmluZWQoKTsKKworICAgIFJlZlB0cjxFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IHBy
b3h5LT5GaW5kVjhFdmVudExpc3RlbmVyKGFyZ3NbMV0sIGZhbHNlKTsKKworICAgIGlmIChsaXN0
ZW5lcikgeworICAgICAgICBTdHJpbmcgZXZlbnRUeXBlID0gdG9XZWJDb3JlU3RyaW5nKGFyZ3Nb
MF0pOworICAgICAgICBib29sIHVzZUNhcHR1cmUgPSBhcmdzWzJdLT5Cb29sZWFuVmFsdWUoKTsK
KyAgICAgICAgZG9jLT5yZW1vdmVXaW5kb3dFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVu
ZXIuZ2V0KCksIHVzZUNhcHR1cmUpOworICAgIH0KKworICAgIHJldHVybiB2ODo6VW5kZWZpbmVk
KCk7Cit9CisKK0NBTExCQUNLX0ZVTkNfREVDTChET01XaW5kb3dQb3N0TWVzc2FnZSkKK3sKKyAg
ICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cucG9zdE1lc3NhZ2UoKSIpOworICAgIERPTVdpbmRv
dyogd2luZG93ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8RE9NV2luZG93PihWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CisKKyAgICBET01XaW5kb3cqIHNvdXJjZSA9
IFY4UHJveHk6OnJldHJpZXZlQWN0aXZlRnJhbWUoKS0+ZG9tV2luZG93KCk7CisgICAgQVNTRVJU
KHNvdXJjZS0+ZnJhbWUoKSk7CisKKyAgICBTdHJpbmcgdXJpID0gc291cmNlLT5mcmFtZSgpLT5s
b2FkZXIoKS0+dXJsKCkuc3RyaW5nKCk7CisKKyAgICB2ODo6VHJ5Q2F0Y2ggdHJ5Q2F0Y2g7CisK
KyAgICBTdHJpbmcgbWVzc2FnZSA9IHRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKKyAgICBNZXNz
YWdlUG9ydCogcG9ydCA9IDA7CisgICAgU3RyaW5nIGRvbWFpbjsKKworICAgIC8vIFRoaXMgZnVu
Y3Rpb24gaGFzIHZhcmlhYmxlIGFyZ3VtZW50cyBhbmQgY2FuIGVpdGhlciBiZToKKyAgICAvLyAg
IHBvc3RNZXNzYWdlKG1lc3NhZ2UsIHBvcnQsIGRvbWFpbik7CisgICAgLy8gb3IKKyAgICAvLyAg
IHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRvbWFpbik7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAy
KSB7CisgICAgICAgIGlmIChWOFByb3h5OjpJc1dyYXBwZXJPZlR5cGUoYXJnc1sxXSwgVjhDbGFz
c0luZGV4OjpNRVNTQUdFUE9SVCkpCisgICAgICAgICAgICBwb3J0ID0gVjhQcm94eTo6VG9OYXRp
dmVPYmplY3Q8TWVzc2FnZVBvcnQ+KFY4Q2xhc3NJbmRleDo6TUVTU0FHRVBPUlQsIGFyZ3NbMV0p
OworICAgICAgICBkb21haW4gPSB2YWx1ZVRvU3RyaW5nV2l0aE51bGxPclVuZGVmaW5lZENoZWNr
KGFyZ3NbMl0pOworICAgIH0gZWxzZQorICAgICAgICBkb21haW4gPSB2YWx1ZVRvU3RyaW5nV2l0
aE51bGxPclVuZGVmaW5lZENoZWNrKGFyZ3NbMV0pOworCisgICAgaWYgKHRyeUNhdGNoLkhhc0Nh
dWdodCgpKQorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgd2luZG93LT5wb3N0TWVzc2FnZShtZXNzYWdlLCBwb3J0LCBkb21h
aW4sIHNvdXJjZSwgZWMpOworICAgIGlmIChlYykKKyAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhj
ZXB0aW9uKGVjKTsKKworICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7Cit9CisKKworc3RhdGlj
IGJvb2wgY2FuU2hvd01vZGFsRGlhbG9nTm93KGNvbnN0IEZyYW1lKiBmcmFtZSkKK3sKKyAgICAv
LyBBIGZyYW1lIGNhbiBvdXQgbGl2ZSBpdHMgcGFnZS4gU2VlIGJ1ZyAxMjE5NjEzLgorICAgIGlm
ICghZnJhbWUgfHwgIWZyYW1lLT5wYWdlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBy
ZXR1cm4gZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNhblJ1bk1vZGFsTm93KCk7Cit9CisKK3N0
YXRpYyBib29sIGFsbG93UG9wVXAoKQoreworICAgIEZyYW1lKiBmcmFtZSA9IFY4UHJveHk6OnJl
dHJpZXZlQWN0aXZlRnJhbWUoKTsKKworICAgIEFTU0VSVChmcmFtZSk7CisgICAgaWYgKGZyYW1l
LT5zY3JpcHQoKS0+cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCkpCisgICAgICAgIHJldHVybiB0cnVl
OworICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGZyYW1lLT5zZXR0aW5ncygpOworICAgIHJldHVy
biBzZXR0aW5ncyAmJiBzZXR0aW5ncy0+SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGlj
YWxseSgpOworfQorCitzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyc2VNb2RhbERp
YWxvZ0ZlYXR1cmVzKGNvbnN0IFN0cmluZyYgZmVhdHVyZXNBcmcpCit7CisgICAgSGFzaE1hcDxT
dHJpbmcsIFN0cmluZz4gbWFwOworCisgICAgVmVjdG9yPFN0cmluZz4gZmVhdHVyZXM7CisgICAg
ZmVhdHVyZXNBcmcuc3BsaXQoJzsnLCBmZWF0dXJlcyk7CisgICAgVmVjdG9yPFN0cmluZz46OmNv
bnN0X2l0ZXJhdG9yIGVuZCA9IGZlYXR1cmVzLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFN0cmlu
Zz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgIFN0cmluZyBmZWF0dXJlU3RyaW5nID0gKml0OworICAgICAgICBpbnQgcG9z
ID0gZmVhdHVyZVN0cmluZy5maW5kKCc9Jyk7CisgICAgICAgIGludCBjb2xvblBvcyA9IGZlYXR1
cmVTdHJpbmcuZmluZCgnOicpOworICAgICAgICBpZiAocG9zID49IDAgJiYgY29sb25Qb3MgPj0g
MCkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgLy8gaWdub3JlIGFueSBzdHJpbmdzIHRoYXQgaGF2
ZSBib3RoID0gYW5kIDoKKyAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICBwb3MgPSBj
b2xvblBvczsKKyAgICAgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgICAgIC8vIG51bGwgc3Ry
aW5nIGZvciB2YWx1ZSBtZWFucyBrZXkgd2l0aG91dCB2YWx1ZQorICAgICAgICAgICAgbWFwLnNl
dChmZWF0dXJlU3RyaW5nLnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCksIFN0cmluZygpKTsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBmZWF0dXJlU3RyaW5nLmxl
ZnQocG9zKS5zdHJpcFdoaXRlU3BhY2UoKS5sb3dlcigpOworICAgICAgICAgICAgU3RyaW5nIHZh
bCA9IGZlYXR1cmVTdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpLnN0cmlwV2hpdGVTcGFjZSgpLmxv
d2VyKCk7CisgICAgICAgICAgICBpbnQgc3BhY2VQb3MgPSB2YWwuZmluZCgnICcpOworICAgICAg
ICAgICAgaWYgKHNwYWNlUG9zICE9IC0xKQorICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5sZWZ0
KHNwYWNlUG9zKTsKKyAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWwpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgcmV0dXJuIG1hcDsKK30KKworCitzdGF0aWMgRnJhbWUqIGNyZWF0ZVdpbmRv
dyhGcmFtZSogb3BlbmVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBT
dHJpbmcmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgZnJh
bWVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2luZG93RmVhdHVyZXMm
IHdpbmRvd0ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gZGlhbG9nQXJncykKK3sKKyAgICBGcmFtZSogYWN0aXZlRnJhbWUgPSBWOFByb3h5
OjpyZXRyaWV2ZUFjdGl2ZUZyYW1lKCk7CisKKyAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdDsK
KyAgICBpZiAoYWN0aXZlRnJhbWUpCisgICAgICAgIHJlcXVlc3Quc2V0SFRUUFJlZmVycmVyKGFj
dGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpKTsKKyAgICBGcmFtZUxvYWRS
ZXF1ZXN0IGZyYW1lUmVxdWVzdChyZXF1ZXN0LCBmcmFtZU5hbWUpOworCisgICAgLy8gRklYTUU6
IEl0J3MgbXVjaCBiZXR0ZXIgZm9yIGNsaWVudCBBUEkgaWYgYSBuZXcgd2luZG93IHN0YXJ0cyB3
aXRoIGEgVVJMLAorICAgIC8vIGhlcmUgd2hlcmUgd2Uga25vdyB3aGF0IFVSTCB3ZSBhcmUgZ29p
bmcgdG8gb3Blbi4gVW5mb3J0dW5hdGVseSwgdGhpcworICAgIC8vIGNvZGUgcGFzc2VzIHRoZSBl
bXB0eSBzdHJpbmcgZm9yIHRoZSBVUkwsIGJ1dCB0aGVyZSdzIGEgcmVhc29uIGZvciB0aGF0Lgor
ICAgIC8vIEJlZm9yZSBsb2FkaW5nIHdlIGhhdmUgdG8gc2V0IHVwIHRoZSBvcGVuZXIsIG9wZW5l
ZEJ5RE9NLAorICAgIC8vIGFuZCBkaWFsb2dBcmd1bWVudHMgdmFsdWVzLiBBbHNvLCB0byBkZWNp
ZGUgd2hldGhlciB0byB1c2UgdGhlIFVSTAorICAgIC8vIHdlIGN1cnJlbnRseSBkbyBhbiBhbGxv
d3NBY2Nlc3NGcm9tIGNhbGwgdXNpbmcgdGhlIHdpbmRvdyB3ZSBjcmVhdGUsCisgICAgLy8gd2hp
Y2ggY2FuJ3QgYmUgZG9uZSBiZWZvcmUgY3JlYXRpbmcgaXQuIFdlJ2QgaGF2ZSB0byByZXNvbHZl
IGFsbCB0aG9zZQorICAgIC8vIGlzc3VlcyB0byBwYXNzIHRoZSBVUkwgaW5zdGVhZCBvZiAiIi4K
KworICAgIGJvb2wgY3JlYXRlZDsKKyAgICAvLyBXZSBwYXNzIGluIHRoZSBvcGVuZXIgZnJhbWUg
aGVyZSBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgbG9va2luZyB1cCB0aGUKKyAgICAvLyBmcmFtZSBu
YW1lLCBpbiBjYXNlIHRoZSBhY3RpdmUgZnJhbWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9wZW5l
ciBmcmFtZSwKKyAgICAvLyBhbmQgdGhlIG5hbWUgcmVmZXJlbmNlcyBhIGZyYW1lIHJlbGF0aXZl
IHRvIHRoZSBvcGVuZXIgZnJhbWUsIGZvciBleGFtcGxlCisgICAgLy8gIl9zZWxmIiBvciAiX3Bh
cmVudCIuCisgICAgRnJhbWUqIG5ld0ZyYW1lID0gYWN0aXZlRnJhbWUtPmxvYWRlcigpLT5jcmVh
dGVXaW5kb3cob3BlbmVyRnJhbWUtPmxvYWRlcigpLCBmcmFtZVJlcXVlc3QsIHdpbmRvd0ZlYXR1
cmVzLCBjcmVhdGVkKTsKKyAgICBpZiAoIW5ld0ZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIG5ld0ZyYW1lLT5sb2FkZXIoKS0+c2V0T3BlbmVyKG9wZW5lckZyYW1lKTsKKyAgICBuZXdG
cmFtZS0+bG9hZGVyKCktPnNldE9wZW5lZEJ5RE9NKCk7CisKKyAgICAvLyBTZXQgZGlhbG9nIGFy
Z3VtZW50cyBvbiB0aGUgZ2xvYmFsIG9iamVjdCBvZiB0aGUgbmV3IGZyYW1lLgorICAgIGlmICgh
ZGlhbG9nQXJncy5Jc0VtcHR5KCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChuZXdGcmFtZSk7CisgICAgICAgIGlmICghY29u
dGV4dC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShj
b250ZXh0KTsKKyAgICAgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQodjg6OlN0cmluZzo6
TmV3KCJkaWFsb2dBcmd1bWVudHMiKSwgZGlhbG9nQXJncyk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoIXBhcnNlVVJMKHVybCkuc3RhcnRzV2l0aCgiamF2YXNjcmlwdDoiLCBmYWxzZSkK
KyAgICAgICAgfHwgU2NyaXB0Q29udHJvbGxlcjo6aXNTYWZlU2NyaXB0KG5ld0ZyYW1lKSkgewor
ICAgICAgICBLVVJMIGNvbXBsZXRlZFVybCA9CisgICAgICAgICAgICB1cmwuaXNFbXB0eSgpID8g
S1VSTCgiIikgOiBhY3RpdmVGcmFtZS0+ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKTsKKyAg
ICAgICAgYm9vbCB1c2VyR2VzdHVyZSA9IGFjdGl2ZUZyYW1lLT5zY3JpcHQoKS0+cHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKCk7CisKKyAgICAgICAgaWYgKGNyZWF0ZWQpCisgICAgICAgICAgICBuZXdG
cmFtZS0+bG9hZGVyKCktPmNoYW5nZUxvY2F0aW9uKGNvbXBsZXRlZFVybCwgYWN0aXZlRnJhbWUt
PmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCksIGZhbHNlLCBmYWxzZSwgdXNlckdlc3R1cmUp
OworICAgICAgICBlbHNlIGlmICghdXJsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG5ld0ZyYW1l
LT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShjb21wbGV0ZWRVcmwuc3RyaW5nKCks
IGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdl
c3R1cmUpOworICAgIH0KKworICAgIHJldHVybiBuZXdGcmFtZTsKK30KKworCisKK0NBTExCQUNL
X0ZVTkNfREVDTChET01XaW5kb3dTaG93TW9kYWxEaWFsb2cpCit7CisgICAgSU5DX1NUQVRTKCJE
T00uRE9NV2luZG93LnNob3dNb2RhbERpYWxvZygpIik7CisgICAgRE9NV2luZG93KiB3aW5kb3cg
PSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KAorICAgICAgICBWOENsYXNzSW5k
ZXg6OkRPTVdJTkRPVywgYXJncy5Ib2xkZXIoKSk7CisgICAgRnJhbWUqIGZyYW1lID0gd2luZG93
LT5mcmFtZSgpOworCisgICAgaWYgKCFmcmFtZSB8fCAhVjhQcm94eTo6Q2FuQWNjZXNzRnJhbWUo
ZnJhbWUsIHRydWUpKSAKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIGlm
ICghY2FuU2hvd01vZGFsRGlhbG9nTm93KGZyYW1lKSB8fCAhYWxsb3dQb3BVcCgpKQorICAgICAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAgU3RyaW5nIHVybCA9IHZhbHVlVG9TdHJp
bmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soYXJnc1swXSk7CisgICAgdjg6OkxvY2FsPHY4OjpW
YWx1ZT4gZGlhbG9nQXJncyA9IGFyZ3NbMV07CisgICAgU3RyaW5nIGZlYXR1cmVBcmdzID0gdmFs
dWVUb1N0cmluZ1dpdGhOdWxsT3JVbmRlZmluZWRDaGVjayhhcmdzWzJdKTsKKworICAgIGNvbnN0
IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVzID0gcGFyc2VNb2RhbERpYWxvZ0ZlYXR1
cmVzKGZlYXR1cmVBcmdzKTsKKworICAgIGNvbnN0IGJvb2wgdHJ1c3RlZCA9IGZhbHNlOworCisg
ICAgRmxvYXRSZWN0IHNjcmVlblJlY3QgPSBzY3JlZW5BdmFpbGFibGVSZWN0KGZyYW1lLT52aWV3
KCkpOworCisgICAgV2luZG93RmVhdHVyZXMgZmVhdHVyZXM7CisgICAgLy8gZGVmYXVsdCBoZXJl
IGNhbWUgZnJvbSBmcmFtZSBzaXplIG9mIGRpYWxvZyBpbiBNYWNJRS4KKyAgICBmZWF0dXJlcy53
aWR0aCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2d3aWR0
aCIsIDEwMCwgc2NyZWVuUmVjdC53aWR0aCgpLCA2MjApOworICAgIGZlYXR1cmVzLndpZHRoU2V0
ID0gdHJ1ZTsKKyAgICAvLyBkZWZhdWx0IGhlcmUgY2FtZSBmcm9tIGZyYW1lIHNpemUgb2YgZGlh
bG9nIGluIE1hY0lFLgorICAgIGZlYXR1cmVzLmhlaWdodCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9h
dEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2doZWlnaHQiLCAxMDAsIHNjcmVlblJlY3QuaGVpZ2h0
KCksIDQ1MCk7CisgICAgZmVhdHVyZXMuaGVpZ2h0U2V0ID0gdHJ1ZTsKKyAgCisgICAgZmVhdHVy
ZXMueCA9IFdpbmRvd0ZlYXR1cmVzOjpmbG9hdEZlYXR1cmUoZmVhdHVyZXMsICJkaWFsb2dsZWZ0
Iiwgc2NyZWVuUmVjdC54KCksIHNjcmVlblJlY3QucmlnaHQoKSAtIGZlYXR1cmVzLndpZHRoLCAt
MSk7CisgICAgZmVhdHVyZXMueFNldCA9IGZlYXR1cmVzLnggPiAwOworICAgIGZlYXR1cmVzLnkg
PSBXaW5kb3dGZWF0dXJlczo6ZmxvYXRGZWF0dXJlKGZlYXR1cmVzLCAiZGlhbG9ndG9wIiwgc2Ny
ZWVuUmVjdC55KCksIHNjcmVlblJlY3QuYm90dG9tKCkgLSBmZWF0dXJlcy5oZWlnaHQsIC0xKTsK
KyAgICBmZWF0dXJlcy55U2V0ID0gZmVhdHVyZXMueSA+IDA7CisKKyAgICBpZiAoV2luZG93RmVh
dHVyZXM6OmJvb2xGZWF0dXJlKGZlYXR1cmVzLCAiY2VudGVyIiwgdHJ1ZSkpIHsKKyAgICAgICAg
aWYgKCFmZWF0dXJlcy54U2V0KSB7CisgICAgICAgICAgICBmZWF0dXJlcy54ID0gc2NyZWVuUmVj
dC54KCkgKyAoc2NyZWVuUmVjdC53aWR0aCgpIC0gZmVhdHVyZXMud2lkdGgpIC8gMjsKKyAgICAg
ICAgICAgIGZlYXR1cmVzLnhTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghZmVh
dHVyZXMueVNldCkgeworICAgICAgICAgICAgZmVhdHVyZXMueSA9IHNjcmVlblJlY3QueSgpICsg
KHNjcmVlblJlY3QuaGVpZ2h0KCkgLSBmZWF0dXJlcy5oZWlnaHQpIC8gMjsKKyAgICAgICAgICAg
IGZlYXR1cmVzLnlTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgZmVhdHVyZXMu
ZGlhbG9nID0gdHJ1ZTsKKyAgICBmZWF0dXJlcy5yZXNpemFibGUgPSBXaW5kb3dGZWF0dXJlczo6
Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJyZXNpemFibGUiKTsKKyAgICBmZWF0dXJlcy5zY3JvbGxi
YXJzVmlzaWJsZSA9IFdpbmRvd0ZlYXR1cmVzOjpib29sRmVhdHVyZShmZWF0dXJlcywgInNjcm9s
bCIsIHRydWUpOworICAgIGZlYXR1cmVzLnN0YXR1c0JhclZpc2libGUgPSBXaW5kb3dGZWF0dXJl
czo6Ym9vbEZlYXR1cmUoZmVhdHVyZXMsICJzdGF0dXMiLCAhdHJ1c3RlZCk7CisgICAgZmVhdHVy
ZXMubWVudUJhclZpc2libGUgPSBmYWxzZTsKKyAgICBmZWF0dXJlcy50b29sQmFyVmlzaWJsZSA9
IGZhbHNlOworICAgIGZlYXR1cmVzLmxvY2F0aW9uQmFyVmlzaWJsZSA9IGZhbHNlOworICAgIGZl
YXR1cmVzLmZ1bGxzY3JlZW4gPSBmYWxzZTsKKworICAgIEZyYW1lKiBkaWFsb2dGcmFtZSA9IGNy
ZWF0ZVdpbmRvdyhmcmFtZSwgdXJsLCAiIiwgZmVhdHVyZXMsIGRpYWxvZ0FyZ3MpOworICAgIGlm
ICghZGlhbG9nRnJhbWUpCisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICAv
LyBIb2xkIG9uIHRvIHRoZSBjb250ZXh0IG9mIHRoZSBkaWFsb2cgd2luZG93IGxvbmcgZW5vdWdo
IHRvIHJldHJpZXZlIHRoZQorICAgIC8vIHZhbHVlIG9mIHRoZSByZXR1cm4gdmFsdWUgcHJvcGVy
dHkuCisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29u
dGV4dChkaWFsb2dGcmFtZSk7CisKKyAgICAvLyBSdW4gdGhlIGRpYWxvZy4KKyAgICBkaWFsb2dG
cmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+cnVuTW9kYWwoKTsKKworICAgIC8vIEV4dHJhY3QgdGhl
IHJldHVybiB2YWx1ZSBwcm9wZXJ0eSBmcm9tIHRoZSBkaWFsb2cgd2luZG93LgorICAgIHY4OjpM
b2NhbDx2ODo6VmFsdWU+IHJldHVyblZhbHVlOworICAgIGlmICghY29udGV4dC5Jc0VtcHR5KCkp
IHsKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworICAgICAgICBy
ZXR1cm5WYWx1ZSA9IGNvbnRleHQtPkdsb2JhbCgpLT5HZXQodjg6OlN0cmluZzo6TmV3KCJyZXR1
cm5WYWx1ZSIpKTsKKyAgICB9CisKKyAgICBpZiAoIXJldHVyblZhbHVlLklzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworCisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
K30KKworCitDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93T3BlbikKK3sKKyAgICBJTkNfU1RB
VFMoIkRPTS5ET01XaW5kb3cub3BlbigpIik7CisgICAgRE9NV2luZG93KiBwYXJlbnQgPSBWOFBy
b3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBh
cmdzLkhvbGRlcigpKTsKKyAgICBGcmFtZSogZnJhbWUgPSBwYXJlbnQtPmZyYW1lKCk7CisKKyAg
ICBpZiAoIVY4UHJveHk6OkNhbkFjY2Vzc0ZyYW1lKGZyYW1lLCB0cnVlKSkKKyAgICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBGcmFtZSogYWN0aXZlRnJhbWUgPSBWOFByb3h5Ojpy
ZXRyaWV2ZUFjdGl2ZUZyYW1lKCk7CisgICAgaWYgKCFhY3RpdmVGcmFtZSkKKyAgICAgIHJldHVy
biB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICBQYWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAg
ICBpZiAoIXBhZ2UpCisgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworCisgICAgU3RyaW5n
IHVybFN0cmluZyA9IHZhbHVlVG9TdHJpbmdXaXRoTnVsbE9yVW5kZWZpbmVkQ2hlY2soYXJnc1sw
XSk7CisgICAgQXRvbWljU3RyaW5nIGZyYW1lTmFtZSA9IChhcmdzWzFdLT5Jc1VuZGVmaW5lZCgp
IHx8IGFyZ3NbMV0tPklzTnVsbCgpKSA/ICJfYmxhbmsiIDogQXRvbWljU3RyaW5nKHRvV2ViQ29y
ZVN0cmluZyhhcmdzWzFdKSk7CisKKyAgICAvLyBCZWNhdXNlIEZyYW1lVHJlZTo6ZmluZCgpIHJl
dHVybnMgdHJ1ZSBmb3IgZW1wdHkgc3RyaW5ncywgd2UgbXVzdCBjaGVjaworICAgIC8vIGZvciBl
bXB0eSBmcmFtZW5hbWVzLiBPdGhlcndpc2UsIGlsbGVnaXRpbWF0ZSB3aW5kb3cub3BlbigpIGNh
bGxzIHdpdGgKKyAgICAvLyBubyBuYW1lIHdpbGwgcGFzcyByaWdodCB0aHJvdWdoIHRoZSBwb3B1
cCBibG9ja2VyLgorICAgIGlmICghYWxsb3dQb3BVcCgpICYmCisgICAgICAgIChmcmFtZU5hbWUu
aXNFbXB0eSgpIHx8ICFmcmFtZS0+dHJlZSgpLT5maW5kKGZyYW1lTmFtZSkpKSB7CisgICAgICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgfQorCisgICAgLy8gR2V0IHRoZSB0YXJnZXQg
ZnJhbWUgZm9yIHRoZSBzcGVjaWFsIGNhc2VzIG9mIF90b3AgYW5kIF9wYXJlbnQuICBJbiB0aG9z
ZQorICAgIC8vIGNhc2VzLCB3ZSBjYW4gc2NoZWR1bGUgYSBsb2NhdGlvbiBjaGFuZ2UgcmlnaHQg
bm93IGFuZCByZXR1cm4gZWFybHkuCisgICAgYm9vbCB0b3BPclBhcmVudCA9IGZhbHNlOworICAg
IGlmIChmcmFtZU5hbWUgPT0gIl90b3AiKSB7CisgICAgICAgIGZyYW1lID0gZnJhbWUtPnRyZWUo
KS0+dG9wKCk7CisgICAgICAgIHRvcE9yUGFyZW50ID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGZy
YW1lTmFtZSA9PSAiX3BhcmVudCIpIHsKKyAgICAgICAgaWYgKEZyYW1lKiBwYXJlbnQgPSBmcmFt
ZS0+dHJlZSgpLT5wYXJlbnQoKSkKKyAgICAgICAgICAgIGZyYW1lID0gcGFyZW50OworICAgICAg
ICB0b3BPclBhcmVudCA9IHRydWU7CisgICAgfQorICAgIGlmICh0b3BPclBhcmVudCkgeworICAg
ICAgICBpZiAoIWFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+c2hvdWxkQWxsb3dOYXZpZ2F0aW9uKGZy
YW1lKSkKKyAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgCisgICAgICAg
IFN0cmluZyBjb21wbGV0ZWRVcmw7CisgICAgICAgIGlmICghdXJsU3RyaW5nLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIGNvbXBsZXRlZFVybCA9IGFjdGl2ZUZyYW1lLT5kb2N1bWVudCgpLT5jb21w
bGV0ZVVSTCh1cmxTdHJpbmcpOworICAgIAorICAgICAgICBpZiAoIWNvbXBsZXRlZFVybC5pc0Vt
cHR5KCkgJiYKKyAgICAgICAgICAgICghcGFyc2VVUkwodXJsU3RyaW5nKS5zdGFydHNXaXRoKCJq
YXZhc2NyaXB0OiIsIGZhbHNlKQorICAgICAgICAgICAgIHx8IFNjcmlwdENvbnRyb2xsZXI6Omlz
U2FmZVNjcmlwdChmcmFtZSkpKSB7CisgICAgICAgICAgICBib29sIHVzZXJHZXN0dXJlID0gYWN0
aXZlRnJhbWUtPnNjcmlwdCgpLT5wcm9jZXNzaW5nVXNlckdlc3R1cmUoKTsKKyAgICAgICAgICAg
IGZyYW1lLT5sb2FkZXIoKS0+c2NoZWR1bGVMb2NhdGlvbkNoYW5nZShjb21wbGV0ZWRVcmwsIGFj
dGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgdXNlckdlc3R1
cmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworICAgIH0KKworICAgIC8v
IEluIHRoZSBjYXNlIG9mIGEgbmFtZWQgZnJhbWUgb3IgYSBuZXcgd2luZG93LCB3ZSdsbCB1c2Ug
dGhlCisgICAgLy8gY3JlYXRlV2luZG93KCkgaGVscGVyLgorCisgICAgLy8gUGFyc2UgdGhlIHZh
bHVlcywgYW5kIHRoZW4gd29yayB3aXRoIGEgY29weSBvZiB0aGUgcGFyc2VkIHZhbHVlcworICAg
IC8vIHNvIHdlIGNhbiByZXN0b3JlIHRoZSB2YWx1ZXMgd2UgbWF5IG5vdCB3YW50IHRvIG92ZXJ3
cml0ZSBhZnRlcgorICAgIC8vIHdlIGRvIHRoZSBtdWx0aXBsZSBtb25pdG9yIGZpeGVzLgorICAg
IFdpbmRvd0ZlYXR1cmVzIHJhd0ZlYXR1cmVzKHZhbHVlVG9TdHJpbmdXaXRoTnVsbE9yVW5kZWZp
bmVkQ2hlY2soYXJnc1syXSkpOworICAgIFdpbmRvd0ZlYXR1cmVzIHdpbmRvd0ZlYXR1cmVzKHJh
d0ZlYXR1cmVzKTsKKyAgICBGbG9hdFJlY3Qgc2NyZWVuUmVjdCA9IHNjcmVlbkF2YWlsYWJsZVJl
Y3QocGFnZS0+bWFpbkZyYW1lKCktPnZpZXcoKSk7CisKKyAgICAvLyBTZXQgZGVmYXVsdCBzaXpl
IGFuZCBsb2NhdGlvbiBuZWFyIHBhcmVudCB3aW5kb3cgaWYgbm9uZSB3ZXJlIHNwZWNpZmllZC4K
KyAgICAvLyBUaGVzZSBtYXkgYmUgZnVydGhlciBtb2RpZmllZCBieSBhZGp1c3RXaW5kb3dSZWN0
LCBiZWxvdy4KKyAgICBpZiAoIXdpbmRvd0ZlYXR1cmVzLnhTZXQpIHsKKyAgICAgICAgd2luZG93
RmVhdHVyZXMueCA9IHBhcmVudC0+c2NyZWVuWCgpIC0gc2NyZWVuUmVjdC54KCkgKyBwb3B1cFRp
bGVQaXhlbHM7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVzLnhTZXQgPSB0cnVlOworICAgIH0KKyAg
ICBpZiAoIXdpbmRvd0ZlYXR1cmVzLnlTZXQpIHsKKyAgICAgICAgd2luZG93RmVhdHVyZXMueSA9
IHBhcmVudC0+c2NyZWVuWSgpIC0gc2NyZWVuUmVjdC55KCkgKyBwb3B1cFRpbGVQaXhlbHM7Cisg
ICAgICAgIHdpbmRvd0ZlYXR1cmVzLnlTZXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoIXdpbmRv
d0ZlYXR1cmVzLndpZHRoU2V0KSB7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVzLndpZHRoID0gcGFy
ZW50LT5pbm5lcldpZHRoKCk7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVzLndpZHRoU2V0ID0gdHJ1
ZTsKKyAgICB9CisgICAgaWYgKCF3aW5kb3dGZWF0dXJlcy5oZWlnaHRTZXQpIHsKKyAgICAgICAg
d2luZG93RmVhdHVyZXMuaGVpZ2h0ID0gcGFyZW50LT5pbm5lckhlaWdodCgpOworICAgICAgICB3
aW5kb3dGZWF0dXJlcy5oZWlnaHRTZXQgPSB0cnVlOworICAgIH0KKworICAgIEZsb2F0UmVjdCB3
aW5kb3dSZWN0KHdpbmRvd0ZlYXR1cmVzLngsIHdpbmRvd0ZlYXR1cmVzLnksIHdpbmRvd0ZlYXR1
cmVzLndpZHRoLCB3aW5kb3dGZWF0dXJlcy5oZWlnaHQpOworCisgICAgLy8gVGhlIG5ldyB3aW5k
b3cncyBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBpdHMgY3VycmVudCBzY3JlZW4sIHNvIHNoaWZ0
CisgICAgLy8gaXQgaW4gY2FzZSBpdCdzIG9uIGEgc2Vjb25kYXJ5IG1vbml0b3IuIFNlZSBodHRw
Oi8vYi92aWV3SXNzdWU/aWQ9OTY3OTA1LgorICAgIHdpbmRvd1JlY3QubW92ZShzY3JlZW5SZWN0
LngoKSwgc2NyZWVuUmVjdC55KCkpOworICAgIFdlYkNvcmU6OkRPTVdpbmRvdzo6YWRqdXN0V2lu
ZG93UmVjdChzY3JlZW5SZWN0LCB3aW5kb3dSZWN0LCB3aW5kb3dSZWN0KTsKKworICAgIHdpbmRv
d0ZlYXR1cmVzLnggPSB3aW5kb3dSZWN0LngoKTsKKyAgICB3aW5kb3dGZWF0dXJlcy55ID0gd2lu
ZG93UmVjdC55KCk7CisgICAgd2luZG93RmVhdHVyZXMuaGVpZ2h0ID0gd2luZG93UmVjdC5oZWln
aHQoKTsKKyAgICB3aW5kb3dGZWF0dXJlcy53aWR0aCA9IHdpbmRvd1JlY3Qud2lkdGgoKTsKKwor
ICAgIC8vIElmIGVpdGhlciBvZiB0aGUgb3JpZ2luIGNvb3JkaW5hdGVzIHdlcmVuJ3Qgc2V0IGlu
IHRoZSBvcmlnaW5hbAorICAgIC8vIHN0cmluZywgbWFrZSBzdXJlIHRoZXkgYXJlbid0IHNldCBu
b3cuCisgICAgaWYgKCFyYXdGZWF0dXJlcy54U2V0KSB7CisgICAgICAgIHdpbmRvd0ZlYXR1cmVz
LnggPSAwOworICAgICAgICB3aW5kb3dGZWF0dXJlcy54U2V0ID0gZmFsc2U7CisgICAgfQorICAg
IGlmICghcmF3RmVhdHVyZXMueVNldCkgeworICAgICAgICB3aW5kb3dGZWF0dXJlcy55ID0gMDsK
KyAgICAgICAgd2luZG93RmVhdHVyZXMueVNldCA9IGZhbHNlOworICAgIH0KKworICAgIGZyYW1l
ID0gY3JlYXRlV2luZG93KGZyYW1lLCB1cmxTdHJpbmcsIGZyYW1lTmFtZSwgd2luZG93RmVhdHVy
ZXMsIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCkpOworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAg
cmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0
KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBmcmFtZS0+ZG9tV2luZG93KCkpOworfQorCisKK0lO
REVYRURfUFJPUEVSVFlfR0VUVEVSKERPTVdpbmRvdykKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5E
T01XaW5kb3cuSW5kZXhlZFByb3BlcnR5R2V0dGVyIik7CisgICAgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBpbmZvLlRoaXMoKSk7CisgICAgaWYgKGhvbGRlci5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworCisgICAgRE9NV2luZG93KiB3aW5k
b3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01XaW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9N
V0lORE9XLCBob2xkZXIpOworICAgIGlmICghd2luZG93KQorICAgICAgICByZXR1cm4gbm90SGFu
ZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKworICAgIEZyYW1lKiBmcmFtZSA9IHdpbmRvdy0+ZnJhbWUo
KTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0
b3IoKTsKKworICAgIEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVlKCktPmNoaWxkKGluZGV4KTsK
KyAgICBpZiAoY2hpbGQpCisgICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4T2JqZWN0KFY4Q2xh
c3NJbmRleDo6RE9NV0lORE9XLCBjaGlsZC0+ZG9tV2luZG93KCkpOworCisgICAgcmV0dXJuIG5v
dEhhbmRsZWRCeUludGVyY2VwdG9yKCk7Cit9CisKKworTkFNRURfUFJPUEVSVFlfR0VUVEVSKERP
TVdpbmRvdykKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cuTmFtZWRQcm9wZXJ0eUdl
dHRlciIpOworICAgIC8vIFRoZSBrZXkgbXVzdCBiZSBhIHN0cmluZy4KKyAgICBpZiAoIW5hbWUt
PklzU3RyaW5nKCkpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOwor
CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBob2xkZXIgPSBWOFByb3h5OjpMb29rdXBET01X
cmFwcGVyKFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBpbmZvLlRoaXMoKSk7CisgICAgaWYgKGhv
bGRlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigp
OworCisgICAgRE9NV2luZG93KiB3aW5kb3cgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxET01X
aW5kb3c+KFY4Q2xhc3NJbmRleDo6RE9NV0lORE9XLCBob2xkZXIpOworICAgIGlmICghd2luZG93
KQorICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKworICAgIFN0cmlu
ZyBwcm9wTmFtZSA9IHRvV2ViQ29yZVN0cmluZyhuYW1lKTsKKworICAgIEZyYW1lKiBmcmFtZSA9
IHdpbmRvdy0+ZnJhbWUoKTsKKyAgICAvLyB3aW5kb3cgaXMgZGV0YWNoZWQgZnJvbSBhIGZyYW1l
LgorICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRv
cigpOworCisgICAgLy8gU2VhcmNoIHN1Yi1mcmFtZXMuCisgICAgRnJhbWUqIGNoaWxkID0gZnJh
bWUtPnRyZWUoKS0+Y2hpbGQocHJvcE5hbWUpOworICAgIGlmIChjaGlsZCkKKyAgICAgICAgcmV0
dXJuIFY4UHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpET01XSU5ET1csIGNoaWxkLT5k
b21XaW5kb3coKSk7CisKKyAgICAvLyBTZWFyY2ggSURMIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRo
ZSBwcm90b3R5cGUKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmVzdWx0ID0gaG9sZGVyLT5H
ZXRSZWFsTmFtZWRQcm9wZXJ0eUluUHJvdG90eXBlQ2hhaW4obmFtZSk7CisgICAgaWYgKCFyZXN1
bHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLy8gTGF6eSBpbml0
aWFsaXphdGlvbiBtYXAga2VlcHMgZ2xvYmFsIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgbGF6aWx5
CisgICAgLy8gaW5pdGlhbGl6ZWQuIFRoZSB2YWx1ZSBpcyB0aGUgY29kZSB0byBpbnN0YW50aWF0
ZSB0aGUgcHJvcGVydHkuCisgICAgLy8gSXQgbXVzdCByZXR1cm4gdGhlIHZhbHVlIG9mIHByb3Bl
cnR5IGFmdGVyIGluaXRpYWxpemF0aW9uLgorICAgIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3Ry
aW5nPiBsYXp5SW5pdE1hcDsKKyAgICBpZiAobGF6eUluaXRNYXAuaXNFbXB0eSgpKSB7CisgICAg
ICAvLyAibmV3IEltYWdlKCkiIGRvZXMgbm90IGFwcGVhciB0byBiZSB3ZWxsLWRlZmluZWQgaW4g
YSBzcGVjLCBidXQgU2FmYXJpLAorICAgICAgLy8gT3BlcmEsIGFuZCBGaXJlZm94IGFsbCBjb25z
aWRlciBpdCB0byBhbHdheXMgY3JlYXRlIGFuIEhUTUwgaW1hZ2UKKyAgICAgIC8vIGVsZW1lbnQs
IHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgZG9jdHlwZS4KKyAgICAgIGxhenlJbml0TWFwLnNl
dCgiSW1hZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gSW1hZ2UoKSB7IFwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnRO
UyggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy8xOTk5
L3hodG1sJywgJ2ltZycpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICB9OyBcCisgICAgICAg
ICAgICAgICAgICAgICAgICBJbWFnZSIpOworICAgICAgbGF6eUluaXRNYXAuc2V0KCJPcHRpb24i
LAorICAgICAgICAiZnVuY3Rpb24gT3B0aW9uKHRleHQsIHZhbHVlLCBkZWZhdWx0U2VsZWN0ZWQs
IHNlbGVjdGVkKSB7IFwKKyAgICAgICAgICAgdmFyIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoJ29wdGlvbicpOyBcCisgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHJldHVybiBv
cHRpb247IFwKKyAgICAgICAgICAgb3B0aW9uLnRleHQgPSB0ZXh0OyBcCisgICAgICAgICAgIGlm
ICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gb3B0aW9uOyBcCisgICAgICAgICAgIG9wdGlvbi52YWx1
ZSA9IHZhbHVlOyBcCisgICAgICAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgPT0gbnVsbCkgcmV0
dXJuIG9wdGlvbjsgXAorICAgICAgICAgICBvcHRpb24uZGVmYXVsdFNlbGVjdGVkID0gZGVmYXVs
dFNlbGVjdGVkOyBcCisgICAgICAgICAgIGlmIChzZWxlY3RlZCA9PSBudWxsKSByZXR1cm4gb3B0
aW9uOyBcCisgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHNlbGVjdGVkOyBcCisgICAgICAg
ICAgIHJldHVybiBvcHRpb247IFwKKyAgICAgICAgIH07IFwKKyAgICAgICAgIE9wdGlvbiIpOwor
ICAgIH0KKworICAgIFN0cmluZyBjb2RlID0gbGF6eUluaXRNYXAuZ2V0KHByb3BOYW1lKTsKKyAg
ICBpZiAoIWNvZGUuaXNFbXB0eSgpKSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4g
Y29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQod2luZG93LT5mcmFtZSgpKTsKKyAgICAgICAg
Ly8gQmFpbCBvdXQgaWYgd2UgY2Fubm90IGdldCB0aGUgY29udGV4dCBmb3IgdGhlIGZyYW1lLgor
ICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbm90SGFu
ZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKyAgCisgICAgICAgIC8vIHN3aXRjaCB0byB0aGUgdGFyZ2V0
IG9iamVjdCdzIGVudmlyb25tZW50LgorICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUo
Y29udGV4dCk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHVuZGVmaW5l
ZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgICAgICAgLy8gcHJvcGVydHkgZXhpc3RzLiAgVGhp
cyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGlzIGdldHRlcgorICAgICAgICAvLyBtaWdodCBiZSBj
YWxsZWQgd2hlbiBldmFsdWF0aW5nICd2YXIgUmFuZ2VFeGNlcHRpb24gPSB2YWx1ZScKKyAgICAg
ICAgLy8gdG8gZmlndXJlIG91dCBpZiB3ZSBoYXZlIGEgcHJvcGVydHkgbmFtZWQgJ1JhbmdlRXhj
ZXB0aW9uJyBiZWZvcmUKKyAgICAgICAgLy8gd2Ugc2V0IFJhbmdlRXhjZXB0aW9uIHRvIHRoZSBu
ZXcgdmFsdWUuICBJbiB0aGF0IGNhc2UsIHdlIHdpbGwKKyAgICAgICAgLy8gZXZhbHVhdGUgJ3Zh
ciBSYW5nZUV4Y2VwdGlvbiA9IHt9JyBhbmQgZW50ZXIgYW4gaW5maW5pdGUgbG9vcC4KKyAgICAg
ICAgLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgbmFtZSB0byB1bmRlZmluZWQgb24gdGhlIGdsb2Jh
bCBvYmplY3QKKyAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGRvIG5vdCBoYXZlIHRvIGFzayB0
aGlzIGdldHRlciB0byBmaWd1cmUgb3V0CisgICAgICAgIC8vIHRoYXQgd2UgaGF2ZSB0aGUgcHJv
cGVydHkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE8oYWdlcik6IFdlIHByb2JhYmx5IHNo
b3VsZCBpbXBsZW1lbnQgdGhlIEhhcyBtZXRob2QKKyAgICAgICAgLy8gZm9yIHRoZSBpbnRlcmNl
cHRvciBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBkZWZhdWx0IEhhcyBtZXRob2QKKyAgICAgICAgLy8g
dGhhdCBjYWxscyBHZXQuCisgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQodjhTdHJpbmco
cHJvcE5hbWUpLCB2ODo6VW5kZWZpbmVkKCkpOworICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4
UHJveHk6OnJldHJpZXZlKHdpbmRvdy0+ZnJhbWUoKSk7CisgICAgICAgIEFTU0VSVChwcm94eSk7
CisKKyAgICAgICAgcmV0dXJuIHByb3h5LT5ldmFsdWF0ZShXZWJDb3JlOjpTY3JpcHRTb3VyY2VD
b2RlKGNvZGUpLCAwKTsKKyAgICB9CisKKyAgICAvLyBTZWFyY2ggbmFtZWQgaXRlbXMgaW4gdGhl
IGRvY3VtZW50LgorICAgIERvY3VtZW50KiBkb2MgPSBmcmFtZS0+ZG9jdW1lbnQoKTsKKyAgICBp
ZiAoZG9jKSB7CisgICAgICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbj4gaXRlbXMgPSBkb2MtPndp
bmRvd05hbWVkSXRlbXMocHJvcE5hbWUpOworICAgICAgICBpZiAoaXRlbXMtPmxlbmd0aCgpID49
IDEpIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy0+bGVuZ3RoKCkgPT0gMSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gVjhQcm94eTo6Tm9kZVRvVjhPYmplY3QoaXRlbXMtPmZpcnN0SXRlbSgpKTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6VG9WOE9i
amVjdChWOENsYXNzSW5kZXg6OkhUTUxDT0xMRUNUSU9OLCBpdGVtcy5nZXQoKSk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKK30KKwor
Cit2b2lkIFY4Q3VzdG9tOjpXaW5kb3dTZXRMb2NhdGlvbihET01XaW5kb3cqIHdpbmRvdywgY29u
c3QgU3RyaW5nJiB2KQoreworICAgIGlmICghd2luZG93LT5mcmFtZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBGcmFtZSogYWN0aXZlRnJhbWUgPSBTY3JpcHRDb250cm9sbGVyOjpyZXRyaWV2
ZUFjdGl2ZUZyYW1lKCk7CisgICAgaWYgKCFhY3RpdmVGcmFtZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKCFhY3RpdmVGcmFtZS0+bG9hZGVyKCktPnNob3VsZEFsbG93TmF2aWdhdGlvbih3
aW5kb3ctPmZyYW1lKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIXBhcnNlVVJMKHYp
LnN0YXJ0c1dpdGgoImphdmFzY3JpcHQ6IiwgZmFsc2UpCisgICAgICAgIHx8IFNjcmlwdENvbnRy
b2xsZXI6OmlzU2FmZVNjcmlwdCh3aW5kb3ctPmZyYW1lKCkpKSB7CisgICAgICAgIFN0cmluZyBj
b21wbGV0ZWRVcmwgPSBhY3RpdmVGcmFtZS0+bG9hZGVyKCktPmNvbXBsZXRlVVJMKHYpLnN0cmlu
ZygpOworICAKKyAgICAgICAgLy8gRklYTUU6IFRoZSBKU0MgYmluZGluZ3MgcGFzcyAhYW55UGFn
ZUlzUHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCkgZm9yCisgICAgICAgIC8vIHRoZSBsb2NrSGlzdG9y
eSBwYXJhbWV0ZXIuICBXZSBzaG91bGQgcHJvYmFibHkgZG8gc29tZXRoaW5nIHNpbWlsYXIuCisg
IAorICAgICAgICB3aW5kb3ctPmZyYW1lKCktPmxvYWRlcigpLT5zY2hlZHVsZUxvY2F0aW9uQ2hh
bmdlKGNvbXBsZXRlZFVybCwKKyAgICAgICAgICAgIGFjdGl2ZUZyYW1lLT5sb2FkZXIoKS0+b3V0
Z29pbmdSZWZlcnJlcigpLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICBhY3RpdmVGcmFtZS0+
c2NyaXB0KCktPnByb2Nlc3NpbmdVc2VyR2VzdHVyZSgpKTsKKyAgICB9Cit9CisKKworQ0FMTEJB
Q0tfRlVOQ19ERUNMKERPTVdpbmRvd1NldFRpbWVvdXQpCit7CisgICAgSU5DX1NUQVRTKCJET00u
RE9NV2luZG93LnNldFRpbWVvdXQoKSIpOworICAgIHJldHVybiBXaW5kb3dTZXRUaW1lb3V0SW1w
bChhcmdzLCB0cnVlKTsKK30KKworCitDQUxMQkFDS19GVU5DX0RFQ0woRE9NV2luZG93U2V0SW50
ZXJ2YWwpCit7CisgICAgSU5DX1NUQVRTKCJET00uRE9NV2luZG93LnNldEludGVydmFsKCkiKTsK
KyAgICByZXR1cm4gV2luZG93U2V0VGltZW91dEltcGwoYXJncywgZmFsc2UpOworfQorCisKK3Zv
aWQgVjhDdXN0b206OkNsZWFyVGltZW91dEltcGwoY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykK
K3sKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaG9sZGVyID0gYXJncy5Ib2xkZXIoKTsKKyAg
ICBET01XaW5kb3cqIGltcCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PERPTVdpbmRvdz4oVjhD
bGFzc0luZGV4OjpET01XSU5ET1csIGhvbGRlcik7CisgICAgaWYgKCFWOFByb3h5OjpDYW5BY2Nl
c3NGcmFtZShpbXAtPmZyYW1lKCksIHRydWUpKQorICAgICAgICByZXR1cm47CisgICAgU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCA9IHN0YXRpY19jYXN0PFNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqPihpbXAtPmZyYW1lKCktPmRvY3VtZW50KCkpOworICAgIGludCBoYW5kbGUgPSB0b0lu
dDMyKGFyZ3NbMF0pOworICAgIERPTVRpbWVyOjpyZW1vdmVCeUlkKGNvbnRleHQsIGhhbmRsZSk7
Cit9CisKKworQ0FMTEJBQ0tfRlVOQ19ERUNMKERPTVdpbmRvd0NsZWFyVGltZW91dCkKK3sKKyAg
ICBJTkNfU1RBVFMoIkRPTS5ET01XaW5kb3cuY2xlYXJUaW1lb3V0Iik7CisgICAgQ2xlYXJUaW1l
b3V0SW1wbChhcmdzKTsKKyAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQorCitDQUxMQkFD
S19GVU5DX0RFQ0woRE9NV2luZG93Q2xlYXJJbnRlcnZhbCkKK3sKKyAgICBJTkNfU1RBVFMoIkRP
TS5ET01XaW5kb3cuY2xlYXJJbnRlcnZhbCIpOworICAgIENsZWFyVGltZW91dEltcGwoYXJncyk7
CisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQo=
</data>
<flag name="review"
          id="14342"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
      

    </bug>

</bugzilla>