<?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>26429</bug_id>
          
          <creation_ts>2009-06-15 21:54:41 -0700</creation_ts>
          <short_desc>Make JSON.stringify non-recursive so it can handle objects of arbitrary complexity</short_desc>
          <delta_ts>2009-06-18 12:22:11 -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>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</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="Darin Adler">darin</reporter>
          <assigned_to name="Darin Adler">darin</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>126132</commentid>
    <comment_count>0</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-15 21:54:41 -0700</bug_when>
    <thetext>Oliver asked me to make JSON.stringify non-recursive. I have done this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126143</commentid>
    <comment_count>1</comment_count>
      <attachid>31334</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-15 22:53:47 -0700</bug_when>
    <thetext>Created attachment 31334
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126149</commentid>
    <comment_count>2</comment_count>
      <attachid>31334</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2009-06-15 23:51:25 -0700</bug_when>
    <thetext>Comment on attachment 31334
patch

r- due to potential problems with arrays and GC.

The array issue may not be real, but in my first reading of this patch i became convinced that it would not correctly handle non-strict-JSArray instances like RegExpResultArray and runtime_array.  I&apos;ve reread the patch and am no longer sure that the behaviour is wrong, but i do think the tests need to actually include serialisation tests for these objects.  I will endeavour to write some up and get such landed tonight.

m_holdStack is not a safe way to reference the holders.  Due to the potential for arbitrary js code execution it is possible to create a scenario in which there would be no &quot;live&quot; references to an object that is actually live (according to the holder stack).  I recently updated BufferedArgList to give it isEmpty() and removeLast() functionality (i haven&apos;t yet broken it out or made it more generalised), so you should use that as an additional reference for the raw JSObjects that are currently active holders -- in the general case i don&apos;t believe it should be significantly slower to control this additional structure and in general (from my profiling) string concat, etc was the perf bottleneck anyway by a fairly large margin.

Other than these issues i think the patch is good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126150</commentid>
    <comment_count>3</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-16 00:00:50 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; The array issue may not be real, but in my first reading of this patch i became
&gt; convinced that it would not correctly handle non-strict-JSArray instances like
&gt; RegExpResultArray and runtime_array.

I do not think this problem is is real. The code only casts to JSArray* in one place, and I check before doing that using the isJSArray patch just as your original code did. The only thing I removed from the original code was the word &quot;Real&quot; in the name of the boolean, and I suspect that&apos;s why you were convinced it would not work. Look again!

&gt; m_holdStack is not a safe way to reference the holders.

Good point! Those need to be marked. I wonder why I didn&apos;t see any failures due to this.

&gt; (according to the holder stack).  I recently updated BufferedArgList to give it
&gt; isEmpty() and removeLast() functionality (i haven&apos;t yet broken it out or made
&gt; it more generalised), so you should use that as an additional reference for the
&gt; raw JSObjects that are currently active holders -- in the general case i don&apos;t
&gt; believe it should be significantly slower to control this additional structure
&gt; and in general (from my profiling) string concat, etc was the perf bottleneck
&gt; anyway by a fairly large margin.

Using MarkedArgumentBuffer sounds pretty unpleasant. Is it really better than calling gcProtect in Holder&apos;s constructor and gcUnprotect in Holder&apos;s destructor?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126217</commentid>
    <comment_count>4</comment_count>
      <attachid>31353</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-16 10:06:28 -0700</bug_when>
    <thetext>Created attachment 31353
work in progress</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126629</commentid>
    <comment_count>5</comment_count>
      <attachid>31479</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-17 18:08:22 -0700</bug_when>
    <thetext>Created attachment 31479
patch with GC marking issue fixed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>126747</commentid>
    <comment_count>6</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-06-18 12:22:11 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/44813</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31334</attachid>
            <date>2009-06-15 22:53:47 -0700</date>
            <delta_ts>2009-06-16 10:06:28 -0700</delta_ts>
            <desc>patch</desc>
            <filename>StringifyPatch.txt</filename>
            <type>text/plain</type>
            <size>37975</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDQ0NzExKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDkgQEAKKzIwMDktMDYtMTUgIERhcmluIEFk
bGVyICA8ZGFyaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEJ1ZyAyNjQyOTogTWFrZSBKU09OLnN0cmluZ2lmeSBub24tcmVjdXJz
aXZlIHNvIGl0IGNhbiBoYW5kbGUgb2JqZWN0cyBvZiBhcmJpdHJhcnkgY29tcGxleGl0eQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY0MjkKKworICAg
ICAgICAqIHJ1bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuY3BwOgorICAgICAgICAoSlNDOjpDb21t
b25JZGVudGlmaWVyczo6Q29tbW9uSWRlbnRpZmllcnMpOiBBZGRlZCBlbXB0eUlkZW50aWZpZXIu
CisgICAgICAgICogcnVudGltZS9Db21tb25JZGVudGlmaWVycy5oOiBEaXR0by4KKworICAgICAg
ICAqIHJ1bnRpbWUvSlNPTk9iamVjdC5jcHA6IEN1dCBkb3duIHRoZSBpbmNsdWRlcyB0byB0aGUg
bmVlZGVkIG9uZXMgb25seS4KKyAgICAgICAgKEpTQzo6dW53cmFwTnVtYmVyT3JTdHJpbmcpOiBB
ZGRlZC4gSGVscGVyIGZvciB1bndyYXBwaW5nIG51bWJlciBhbmQgc3RyaW5nCisgICAgICAgIG9i
amVjdHMgdG8gZ2V0IHRoZWlyIG51bWJlciBhbmQgc3RyaW5nIHZhbHVlcy4KKyAgICAgICAgKEpT
Qzo6UmVwbGFjZXJQcm9wZXJ0eU5hbWU6OlJlcGxhY2VyUHJvcGVydHlOYW1lKTogQWRkZWQuIFRo
ZSBjbGFzcyBpcyB1c2VkCisgICAgICAgIHRvIHdyYXAgYW4gaWRlbnRpZmllciBvciBpbnRlZ2Vy
IHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IHdvcmsgdW5sZXNzIHdlCisgICAgICAgIGFjdHVh
bGx5IGNhbGwgYSByZXBsYWNlci4KKyAgICAgICAgKEpTQzo6UmVwbGFjZXJQcm9wZXJ0eU5hbWU6
OnZhbHVlKTogQWRkZWQuCisgICAgICAgIChKU0M6OmdhcCk6IEFkZGVkLiBIZWxwZXIgZnVuY3Rp
b24gZm9yIHRoZSBTdHJpbmdpZmllciBjb25zdHJ1Y3Rvci4KKyAgICAgICAgKEpTQzo6UHJvcGVy
dHlOYW1lRm9yRnVuY3Rpb25DYWxsOjpQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwpOiBBZGRl
ZC4KKyAgICAgICAgVGhlIGNsYXNzIGlzIHVzZWQgdG8gd3JhcCBhbiBpZGVudGlmaWVyIG9yIGlu
dGVnZXIgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAgICAgICBhbGxvY2F0ZSBhIG51bWJlciBvciBz
dHJpbmcgdW50aWwgd2UgYWN0dWFsbHkgY2FsbCB0b0pTT04gb3IgYSByZXBsYWNlci4KKyAgICAg
ICAgKEpTQzo6UHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsOjphc0pTVmFsdWUpOiBBZGRlZC4K
KyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OlN0cmluZ2lmaWVyKTogVXBkYXRlZCBhbmQgbW92
ZWQgb3V0IG9mIHRoZSBjbGFzcworICAgICAgICBkZWZpbml0aW9uLgorICAgICAgICAoSlNDOjpT
dHJpbmdpZmllcjo6c3RyaW5naWZ5KTogVXBkYXRlZC4KKyAgICAgICAgKEpTQzo6U3RyaW5naWZp
ZXI6OmFwcGVuZFF1b3RlZFN0cmluZyk6IFR3ZWFrZWQgYW5kIHN0cmVhbWxpbmVkIGEgYml0Lgor
ICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6dG9KU09OKTogUmVuYW1lZCBmcm9tIHRvSlNPTlZh
bHVlLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6YXBwZW5kU3RyaW5naWZpZWRWYWx1ZSk6
IFJlbmFtZWQgZnJvbSBzdHJpbmdpZnkuCisgICAgICAgIEFkZGVkIGNvZGUgdG8gdXNlIHRoZSBt
X2hvbGRlclN0YWNrIHRvIGRvIG5vbi1yZWN1cnNpdmUgc3RyaW5naWZ5IG9mCisgICAgICAgIG9i
amVjdHMgYW5kIGFycmF5cy4gVGhpcyBjb2RlIGFsc28gdXNlcyB0aGUgdGltZW91dCBjaGVja2Vy
IHNpbmNlIGluCisgICAgICAgIHBhdGhvbG9naWNhbCBjYXNlcyBpdCBjb3VsZCBiZSBzbG93IGV2
ZW4gd2l0aG91dCBjYWxsaW5nIGludG8gdGhlCisgICAgICAgIEphdmFTY3JpcHQgdmlydHVhbCBt
YWNoaW5lLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6d2lsbEluZGVudCk6IEFkZGVkLgor
ICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6aW5kZW50KTogQWRkZWQuCisgICAgICAgIChKU0M6
OlN0cmluZ2lmaWVyOjp1bmluZGVudCk6IEFkZGVkLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmll
cjo6c3RhcnROZXdMaW5lKTogQWRkZWQuCisgICAgICAgIChKU0M6OlN0cmluZ2lmaWVyOjpIb2xk
ZXI6OkhvbGRlcik6IEFkZGVkLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6SG9sZGVyOjph
cHBlbmROZXh0UHJvcGVydHkpOiBBZGRlZC4gVGhpcyBpcyB0aGUKKyAgICAgICAgZnVuY3Rpb24g
dGhhdCBoYW5kbGVzIHRoZSBmb3JtYXQgb2YgYXJyYXlzIGFuZCBvYmplY3RzLgorICAgICAgICAo
SlNDOjpKU09OT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QpOiBNb3ZlZCB0aGlzIGRvd24gdG8g
dGhlIGJvdHRvbQorICAgICAgICBvZiB0aGUgZmlsZSBzbyB0aGUgSlNPTk9iamVjdCBjbGFzcyBp
cyBub3QgaW50ZXJsZWF2ZWQgd2l0aCB0aGUKKyAgICAgICAgU3RyaW5naWZpZXIgY2xhc3MuCisg
ICAgICAgIChKU0M6OkpTT05Qcm90b0Z1bmNTdHJpbmdpZnkpOiBTdHJlYW1saW5lZCB0aGUgY29k
ZSBoZXJlLiBUaGUgY29kZQorICAgICAgICB0byBjb21wdXRlIHRoZSBnYXAgc3RyaW5nIGlzIG5v
dyBhIHNlcGFyYXRlIGZ1bmN0aW9uLgorCiAyMDA5LTA2LTE1ICBHYXZpbiBCYXJyYWNsb3VnaCAg
PGJhcnJhY2xvdWdoQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0gV2Vpbmln
LgpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db21tb25JZGVudGlmaWVycy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db21tb25JZGVudGlmaWVycy5jcHAJ
KHJldmlzaW9uIDQ0NzExKQorKysgSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db21tb25JZGVudGlm
aWVycy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACiAvKgotICogIENvcHlyaWdo
dCAoQykgMjAwMywgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29w
eXJpZ2h0IChDKSAyMDAzLCAyMDA3LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KICAqCiAgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgogICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yMywxMiArMjMsMTMgQEAKIAogbmFtZXNwYWNl
IEpTQyB7CiAKLWNvbnN0IGNoYXIqIGNvbnN0IG51bGxDU3RyaW5nID0gMDsKK3N0YXRpYyBjb25z
dCBjaGFyKiBjb25zdCBudWxsQ1N0cmluZyA9IDA7CiAKICNkZWZpbmUgSU5JVElBTElaRV9QUk9Q
RVJUWV9OQU1FKG5hbWUpICwgbmFtZShnbG9iYWxEYXRhLCAjbmFtZSkKIAogQ29tbW9uSWRlbnRp
ZmllcnM6OkNvbW1vbklkZW50aWZpZXJzKEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSkKICAgICA6
IG51bGxJZGVudGlmaWVyKGdsb2JhbERhdGEsIG51bGxDU3RyaW5nKQorICAgICwgZW1wdHlJZGVu
dGlmaWVyKGdsb2JhbERhdGEsICIiKQogICAgICwgdW5kZXJzY29yZVByb3RvKGdsb2JhbERhdGEs
ICJfX3Byb3RvX18iKQogICAgICwgdGhpc0lkZW50aWZpZXIoZ2xvYmFsRGF0YSwgInRoaXMiKQog
ICAgIEpTQ19DT01NT05fSURFTlRJRklFUlNfRUFDSF9QUk9QRVJUWV9OQU1FKElOSVRJQUxJWkVf
UFJPUEVSVFlfTkFNRSkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29tbW9uSWRlbnRp
ZmllcnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbW1vbklkZW50
aWZpZXJzLmgJKHJldmlzaW9uIDQ0NzExKQorKysgSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db21t
b25JZGVudGlmaWVycy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBD
b3B5cmlnaHQgKEMpIDIwMDMsMjAwNyBBcHBsZSBDb21wdXRlciwgSW5jCisgKiAgQ29weXJpZ2h0
IChDKSAyMDAzLCAyMDA3LCAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAq
CiAgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgogICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCkBAIC03Niw2ICs3Niw3IEBAIG5hbWVzcGFjZSBKU0MgewogCiAg
ICAgcHVibGljOgogICAgICAgICBjb25zdCBJZGVudGlmaWVyIG51bGxJZGVudGlmaWVyOworICAg
ICAgICBjb25zdCBJZGVudGlmaWVyIGVtcHR5SWRlbnRpZmllcjsKICAgICAgICAgY29uc3QgSWRl
bnRpZmllciB1bmRlcnNjb3JlUHJvdG87CiAgICAgICAgIGNvbnN0IElkZW50aWZpZXIgdGhpc0lk
ZW50aWZpZXI7CiAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPTk9iamVjdC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU09OT2JqZWN0LmNwcAkocmV2
aXNpb24gNDQ3MTEpCisrKyBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT05PYmplY3QuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNiwyMCArMjYsMTIgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNp
bmNsdWRlICJKU09OT2JqZWN0LmgiCiAKKyNpbmNsdWRlICJFcnJvci5oIgogI2luY2x1ZGUgIkV4
Y2VwdGlvbkhlbHBlcnMuaCIKICNpbmNsdWRlICJKU0FycmF5LmgiCi0jaW5jbHVkZSAiSlNGdW5j
dGlvbi5oIgotI2luY2x1ZGUgIkxpdGVyYWxQYXJzZXIuaCIKLSNpbmNsdWRlICJOb2Rlcy5oIgog
I2luY2x1ZGUgIlByb3BlcnR5TmFtZUFycmF5LmgiCi0KLSNpbmNsdWRlICJPYmplY3RQcm90b3R5
cGUuaCIKLSNpbmNsdWRlICJPcGVyYXRpb25zLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1
ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CiAjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAotCiBu
YW1lc3BhY2UgSlNDIHsKIAogQVNTRVJUX0NMQVNTX0ZJVFNfSU5fQ0VMTChKU09OT2JqZWN0KTsK
QEAgLTUyLDQ0NyArNDQsNTI4IEBAIHN0YXRpYyBKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgSlNPTlBy
b3RvRnUKIAogbmFtZXNwYWNlIEpTQyB7CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSBKU09OT2JqZWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcm9w
ZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwgb2JqZWN0cyBtdXN0IGJlIG9uIHRoZSBzdGFjaywgc2lu
Y2UgdGhlIEpTVmFsdWUgdGhhdCB0aGV5IGNyZWF0ZSBpcyBub3QgbWFya2VkLgorY2xhc3MgUHJv
cGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsIHsKK3B1YmxpYzoKKyAgICBQcm9wZXJ0eU5hbWVGb3JG
dW5jdGlvbkNhbGwoKTsKKyAgICBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwoY29uc3QgSWRl
bnRpZmllciYpOworICAgIFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCk7CiAK
LWNvbnN0IENsYXNzSW5mbyBKU09OT2JqZWN0OjppbmZvID0geyAiSlNPTiIsIDAsIDAsIEV4ZWNT
dGF0ZTo6anNvblRhYmxlIH07CisgICAgSlNWYWx1ZSB2YWx1ZShFeGVjU3RhdGUqKSBjb25zdDsK
IAotLyogU291cmNlIGZvciBKU09OT2JqZWN0Lmx1dC5oCi1AYmVnaW4ganNvblRhYmxlCi0gIHN0
cmluZ2lmeSAgICAgSlNPTlByb3RvRnVuY1N0cmluZ2lmeSAgICAgICAgIERvbnRFbnVtfEZ1bmN0
aW9uIDEKLUBlbmQKLSovCitwcml2YXRlOgorICAgIGNvbnN0IElkZW50aWZpZXIqIG1faWRlbnRp
ZmllcjsKKyAgICB1bnNpZ25lZCBtX251bWJlcjsKKyAgICBtdXRhYmxlIEpTVmFsdWUgbV92YWx1
ZTsKK307CiAKLS8vIEVDTUEgMTUuOAorY2xhc3MgU3RyaW5naWZpZXIgeworcHVibGljOgorICAg
IFN0cmluZ2lmaWVyKEV4ZWNTdGF0ZSosIEpTVmFsdWUgcmVwbGFjZXIsIEpTVmFsdWUgc3BhY2Up
OworICAgIEpTVmFsdWUgc3RyaW5naWZ5KEpTVmFsdWUpOwogCi1ib29sIEpTT05PYmplY3Q6Omdl
dE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3Bl
cnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQotewotICAgIGNvbnN0IEhhc2hFbnRyeSogZW50
cnkgPSBFeGVjU3RhdGU6Ompzb25UYWJsZShleGVjKS0+ZW50cnkoZXhlYywgcHJvcGVydHlOYW1l
KTsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBVU3RyaW5nIFN0cmluZ0J1aWxkZXI7CiAKLSAgICBp
ZiAoIWVudHJ5KQotICAgICAgICByZXR1cm4gSlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChl
eGVjLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOworICAgIGNsYXNzIEhvbGRlciB7CisgICAgcHVibGlj
OgorICAgICAgICBIb2xkZXIoSlNPYmplY3QqKTsKIAotICAgIEFTU0VSVChlbnRyeS0+YXR0cmli
dXRlcygpICYgRnVuY3Rpb24pOwotICAgIHNldFVwU3RhdGljRnVuY3Rpb25TbG90KGV4ZWMsIGVu
dHJ5LCB0aGlzLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOwotICAgIHJldHVybiB0cnVlOworICAgICAg
ICBKU09iamVjdCogb2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3Q7IH0KKworICAgICAg
ICBib29sIGFwcGVuZE5leHRQcm9wZXJ0eShTdHJpbmdpZmllciYsIFN0cmluZ0J1aWxkZXImKTsK
KworICAgIHByaXZhdGU6CisgICAgICAgIEpTT2JqZWN0KiBjb25zdCBtX29iamVjdDsKKyAgICAg
ICAgY29uc3QgYm9vbCBtX2lzQXJyYXk7CisgICAgICAgIGJvb2wgbV9pc0pTQXJyYXk7CisgICAg
ICAgIHVuc2lnbmVkIG1faW5kZXg7CisgICAgICAgIHVuc2lnbmVkIG1fc2l6ZTsKKyAgICAgICAg
UmVmUHRyPFByb3BlcnR5TmFtZUFycmF5RGF0YT4gbV9wcm9wZXJ0eU5hbWVzOworICAgIH07CisK
KyAgICBmcmllbmQgY2xhc3MgSG9sZGVyOworCisgICAgc3RhdGljIHZvaWQgYXBwZW5kUXVvdGVk
U3RyaW5nKFN0cmluZ0J1aWxkZXImLCBjb25zdCBVU3RyaW5nJik7CisKKyAgICBKU1ZhbHVlIHRv
SlNPTihKU1ZhbHVlLCBjb25zdCBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwmKTsKKworICAg
IGVudW0gU3RyaW5naWZ5UmVzdWx0IHsgU3RyaW5naWZ5RmFpbGVkLCBTdHJpbmdpZnlTdWNjZWVk
ZWQsIFN0cmluZ2lmeUZhaWxlZER1ZVRvVW5kZWZpbmVkVmFsdWUgfTsKKyAgICBTdHJpbmdpZnlS
ZXN1bHQgYXBwZW5kU3RyaW5naWZpZWRWYWx1ZShTdHJpbmdCdWlsZGVyJiwgSlNWYWx1ZSwgSlNP
YmplY3QqIGhvbGRlciwgY29uc3QgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsJik7CisKKyAg
ICBib29sIHdpbGxJbmRlbnQoKSBjb25zdDsKKyAgICB2b2lkIGluZGVudCgpOworICAgIHZvaWQg
dW5pbmRlbnQoKTsKKyAgICB2b2lkIHN0YXJ0TmV3TGluZShTdHJpbmdCdWlsZGVyJikgY29uc3Q7
CisKKyAgICBFeGVjU3RhdGUqIGNvbnN0IG1fZXhlYzsKKyAgICBjb25zdCBKU1ZhbHVlIG1fcmVw
bGFjZXI7CisgICAgYm9vbCBtX3VzaW5nQXJyYXlSZXBsYWNlcjsKKyAgICBQcm9wZXJ0eU5hbWVB
cnJheSBtX2FycmF5UmVwbGFjZXJQcm9wZXJ0eU5hbWVzOworICAgIENhbGxUeXBlIG1fcmVwbGFj
ZXJDYWxsVHlwZTsKKyAgICBDYWxsRGF0YSBtX3JlcGxhY2VyQ2FsbERhdGE7CisgICAgY29uc3Qg
VVN0cmluZyBtX2dhcDsKKworICAgIEhhc2hTZXQ8SlNPYmplY3QqPiBtX2hvbGRlckN5Y2xlRGV0
ZWN0b3I7CisgICAgVmVjdG9yPEhvbGRlciwgMTY+IG1faG9sZGVyU3RhY2s7CisgICAgVVN0cmlu
ZyBtX3JlcGVhdGVkR2FwOworICAgIFVTdHJpbmcgbV9pbmRlbnQ7Cit9OworCisvLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVyIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW5saW5lIEpTVmFsdWUgdW53cmFwTnVtYmVyT3JT
dHJpbmcoSlNWYWx1ZSB2YWx1ZSkKK3sKKyAgICBpZiAoIXZhbHVlLmlzT2JqZWN0KCkpCisgICAg
ICAgIHJldHVybiB2YWx1ZTsKKyAgICBpZiAoIWFzT2JqZWN0KHZhbHVlKS0+aW5oZXJpdHMoJk51
bWJlck9iamVjdDo6aW5mbykgJiYgIWFzT2JqZWN0KHZhbHVlKS0+aW5oZXJpdHMoJlN0cmluZ09i
amVjdDo6aW5mbykpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8SlNXcmFwcGVyT2JqZWN0Kj4oYXNPYmplY3QodmFsdWUpKS0+aW50ZXJuYWxWYWx1ZSgpOwog
fQogCi1jbGFzcyBTdHJpbmdpZmllciB7Ci0gICAgdHlwZWRlZiBVU3RyaW5nIFN0cmluZ0J1aWxk
ZXI7Ci0gICAgLy8gPGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjI3
Nj4gYXJiaXRyYXJ5IGxpbWl0cyBmb3IgcmVjdXJzaW9uCi0gICAgLy8gYXJlIGJhZAotICAgIGVu
dW0geyBNYXhPYmplY3REZXB0aCA9IDUxMiB9OwotcHVibGljOgotICAgIFN0cmluZ2lmaWVyKEV4
ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSByZXBsYWNlciwgY29uc3QgVVN0cmluZyYgZ2FwKQotICAg
ICAgICA6IG1fZXhlYyhleGVjKQotICAgICAgICAsIG1fcmVwbGFjZXIocmVwbGFjZXIpCi0gICAg
ICAgICwgbV9nYXAoZ2FwKQotICAgICAgICAsIG1fYXJyYXlSZXBsYWNlclByb3BlcnR5TmFtZXMo
ZXhlYykKLSAgICAgICAgLCBtX3VzaW5nQXJyYXlSZXBsYWNlcihmYWxzZSkKLSAgICAgICAgLCBt
X3JlcGxhY2VyQ2FsbFR5cGUoQ2FsbFR5cGVOb25lKQotICAgIHsKLSAgICAgICAgaWYgKG1fcmVw
bGFjZXIuaXNPYmplY3QoKSkgewotICAgICAgICAgICAgaWYgKGFzT2JqZWN0KG1fcmVwbGFjZXIp
LT5pbmhlcml0cygmSlNBcnJheTo6aW5mbykpIHsKLSAgICAgICAgICAgICAgICBKU09iamVjdCog
YXJyYXkgPSBhc09iamVjdChtX3JlcGxhY2VyKTsKLSAgICAgICAgICAgICAgICBib29sIGlzUmVh
bEpTQXJyYXkgPSBpc0pTQXJyYXkoJm1fZXhlYy0+Z2xvYmFsRGF0YSgpLCBtX3JlcGxhY2VyKTsK
LSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBhcnJheS0+Z2V0KG1fZXhlYywgbV9l
eGVjLT5nbG9iYWxEYXRhKCkucHJvcGVydHlOYW1lcy0+bGVuZ3RoKS50b1VJbnQzMihtX2V4ZWMp
OwotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykg
ewotICAgICAgICAgICAgICAgICAgICBKU1ZhbHVlIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChpc1JlYWxKU0FycmF5ICYmIGFzQXJyYXkoYXJyYXkpLT5jYW5HZXRJbmRleChpKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhc0FycmF5KGFycmF5KS0+Z2V0SW5kZXgoaSk7
Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFt
ZSA9IGFycmF5LT5nZXQobV9leGVjLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChl
eGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaXNT
dHJpbmcoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAg
ICAgICAgICAgIFVTdHJpbmcgcHJvcGVydHlOYW1lID0gbmFtZS50b1N0cmluZyhtX2V4ZWMpOwot
ICAgICAgICAgICAgICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIG1fYXJyYXlSZXBsYWNl
clByb3BlcnR5TmFtZXMuYWRkKElkZW50aWZpZXIobV9leGVjLCBwcm9wZXJ0eU5hbWUpKTsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV91c2luZ0FycmF5UmVwbGFjZXIgPSB0
cnVlOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgbV9yZXBsYWNlckNhbGxU
eXBlID0gYXNPYmplY3QobV9yZXBsYWNlciktPmdldENhbGxEYXRhKG1fcmVwbGFjZXJDYWxsRGF0
YSk7Ci0gICAgICAgIH0KK3N0YXRpYyBpbmxpbmUgVVN0cmluZyBnYXAoSlNWYWx1ZSBzcGFjZSkK
K3sKKyAgICBzcGFjZSA9IHVud3JhcE51bWJlck9yU3RyaW5nKHNwYWNlKTsKKworICAgIC8vIElm
IHRoZSBzcGFjZSB2YWx1ZSBpcyBhIG51bWJlciwgY3JlYXRlIGEgZ2FwIHN0cmluZyB3aXRoIHRo
YXQgbnVtYmVyIG9mIHNwYWNlcy4KKyAgICBkb3VibGUgc3BhY2VDb3VudDsKKyAgICBpZiAoc3Bh
Y2UuZ2V0TnVtYmVyKHNwYWNlQ291bnQpKSB7CisgICAgICAgIGNvbnN0IGludCBtYXhTcGFjZUNv
dW50ID0gMTAwOworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIGlmIChzcGFjZUNvdW50ID4g
bWF4U3BhY2VDb3VudCkKKyAgICAgICAgICAgIGNvdW50ID0gbWF4U3BhY2VDb3VudDsKKyAgICAg
ICAgZWxzZSBpZiAoIShzcGFjZUNvdW50ID4gMCkpCisgICAgICAgICAgICBjb3VudCA9IDA7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvdW50ID0gc3RhdGljX2Nhc3Q8aW50PihzcGFjZUNv
dW50KTsKKyAgICAgICAgVUNoYXIgc3BhY2VzW21heFNwYWNlQ291bnRdOworICAgICAgICBmb3Ig
KGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgICAgICBzcGFjZXNbaV0gPSAnICc7
CisgICAgICAgIHJldHVybiBVU3RyaW5nKHNwYWNlcywgY291bnQpOwogICAgIH0KIAotICAgIEpT
VmFsdWUgc3RyaW5naWZ5KEpTVmFsdWUgdmFsdWUpCi0gICAgewotICAgICAgICBKU09iamVjdCog
b2JqID0gY29uc3RydWN0RW1wdHlPYmplY3QobV9leGVjKTsKLSAgICAgICAgaWYgKG1fZXhlYy0+
aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4ganNOdWxsKCk7CisgICAgLy8gSWYg
dGhlIHNwYWNlIHZhbHVlIGlzIGEgc3RyaW5nLCB1c2UgaXQgYXMgdGhlIGdhcCBzdHJpbmcsIG90
aGVyd2lzZSB1c2Ugbm8gZ2FwIHN0cmluZy4KKyAgICByZXR1cm4gc3BhY2UuZ2V0U3RyaW5nKCk7
Cit9CiAKLSAgICAgICAgSWRlbnRpZmllciBlbXB0eUlkZW50KG1fZXhlYywgIiIpOwotICAgICAg
ICBvYmotPnB1dERpcmVjdChlbXB0eUlkZW50LCB2YWx1ZSk7Ci0gICAgICAgIFN0cmluZ0tleUdl
bmVyYXRvciBrZXkoZW1wdHlJZGVudCk7Ci0gICAgICAgIHZhbHVlID0gdG9KU09OVmFsdWUoa2V5
LCB2YWx1ZSk7Ci0gICAgICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAg
ICAgcmV0dXJuIGpzTnVsbCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWls
ZGVyOwotICAgICAgICBpZiAoIXN0cmluZ2lmeShidWlsZGVyLCBvYmosIGtleSwgdmFsdWUpKQot
ICAgICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCiAKLSAgICAgICAgcmV0dXJuIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigp
KT8gbV9leGVjLT5leGNlcHRpb24oKSA6IGpzU3RyaW5nKG1fZXhlYywgYnVpbGRlcik7Ci0gICAg
fQoraW5saW5lIFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbDo6UHJvcGVydHlOYW1lRm9yRnVu
Y3Rpb25DYWxsKCkKK3sKK30KIAotcHJpdmF0ZToKLSAgICB2b2lkIGFwcGVuZFN0cmluZyhTdHJp
bmdCdWlsZGVyJiBidWlsZGVyLCBjb25zdCBVU3RyaW5nJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAg
IGludCBsZW5ndGggPSB2YWx1ZS5zaXplKCk7Ci0gICAgICAgIGNvbnN0IFVDaGFyKiBkYXRhID0g
dmFsdWUuZGF0YSgpOwotICAgICAgICBidWlsZGVyLnJlc2VydmVDYXBhY2l0eShidWlsZGVyLnNp
emUoKSArIGxlbmd0aCArIDIgKyA4KTsgLy8gKzIgZm9yICIncyArOCBmb3IgYSBidWZmZXIKLSAg
ICAgICAgYnVpbGRlci5hcHBlbmQoJ1wiJyk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAg
ICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gaW5k
ZXg7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgKGRhdGFbaW5kZXhdID4g
MHgxZiAmJiBkYXRhW2luZGV4XSAhPSAnIicgJiYgZGF0YVtpbmRleF0gIT0gJ1xcJykpCi0gICAg
ICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGRhdGEgKyBz
dGFydCwgaW5kZXggLSBzdGFydCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGgpIHsK
LSAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YVtpbmRleF0pewotICAgICAgICAgICAgICAgICAg
ICBjYXNlICdcdCc6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIHRhYltdID0geydc
XCcsJ3QnfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRhYiwgMik7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICBjYXNlICdccic6IHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IFVDaGFyIGNyW10gPSB7J1xcJywncid9OwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRl
ci5hcHBlbmQoY3IsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOiB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBVQ2hhciBubFtdID0geydcXCcsJ24nfTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5sLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
J1xmJzogewotICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgdGFiW10gPSB7J1xcJywnZid9
OyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRhYiwgMik7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICBjYXNlICdcYic6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFy
IGJzW10gPSB7J1xcJywnYid9OwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBl
bmQoYnMsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOiB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBVQ2hhciBxdW90ZVtdID0geydcXCcsJyInfTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKHF1b3RlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
J1xcJzogewotICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgc2xhc2hbXSA9IHsnXFwnLCAn
XFwnfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHNsYXNoLCAyKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQg
Y2ggPSAoaW50KWRhdGFbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNv
bnN0IGNoYXIqIGhleFN0ciA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIFVDaGFyIG9jdFtdID0geydcXCcsICd1JywgaGV4U3RyWyhjaCA+PiAxMikgJiAxNV0s
IGhleFN0clsoY2ggPj4gOCkgJiAxNV0sIGhleFN0clsoY2ggPj4gNCkgJiAxNV0sIGhleFN0clso
Y2ggPj4gMCkgJiAxNV19OwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQo
b2N0LCBzaXplb2Yob2N0KSAvIHNpemVvZihVQ2hhcikpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1wiJyk7Citp
bmxpbmUgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsOjpQcm9wZXJ0eU5hbWVGb3JGdW5jdGlv
bkNhbGwoY29uc3QgSWRlbnRpZmllciYgaWRlbnRpZmllcikKKyAgICA6IG1faWRlbnRpZmllcigm
aWRlbnRpZmllcikKK3sKK30KKworaW5saW5lIFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbDo6
UHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsKHVuc2lnbmVkIG51bWJlcikKKyAgICA6IG1faWRl
bnRpZmllcigwKQorICAgICwgbV9udW1iZXIobnVtYmVyKQoreworfQorCitKU1ZhbHVlIFByb3Bl
cnR5TmFtZUZvckZ1bmN0aW9uQ2FsbDo6dmFsdWUoRXhlY1N0YXRlKiBleGVjKSBjb25zdAorewor
ICAgIGlmICghbV92YWx1ZSkgeworICAgICAgICBpZiAobV9pZGVudGlmaWVyKQorICAgICAgICAg
ICAgbV92YWx1ZSA9IGpzU3RyaW5nKGV4ZWMsIG1faWRlbnRpZmllci0+dXN0cmluZygpKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgbV92YWx1ZSA9IGpzTnVtYmVyKGV4ZWMsIG1fbnVtYmVy
KTsKICAgICB9CisgICAgcmV0dXJuIG1fdmFsdWU7Cit9CiAKLSAgICBjbGFzcyBTdHJpbmdLZXlH
ZW5lcmF0b3IgewotICAgIHB1YmxpYzoKLSAgICAgICAgU3RyaW5nS2V5R2VuZXJhdG9yKGNvbnN0
IElkZW50aWZpZXImIHByb3BlcnR5KQotICAgICAgICAgICAgOiBtX3Byb3BlcnR5KHByb3BlcnR5
KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgSlNWYWx1ZSBnZXRLZXkoRXhlY1N0YXRl
KiBleGVjKSB7IGlmICghbV9rZXkpIG1fa2V5ID0ganNTdHJpbmcoZXhlYywgbV9wcm9wZXJ0eS51
c3RyaW5nKCkpOyByZXR1cm4gbV9rZXk7ICB9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gU3RyaW5naWZpZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAg
IHByaXZhdGU6Ci0gICAgICAgIElkZW50aWZpZXIgbV9wcm9wZXJ0eTsKLSAgICAgICAgSlNWYWx1
ZSBtX2tleTsKLSAgICB9OworU3RyaW5naWZpZXI6OlN0cmluZ2lmaWVyKEV4ZWNTdGF0ZSogZXhl
YywgSlNWYWx1ZSByZXBsYWNlciwgSlNWYWx1ZSBzcGFjZSkKKyAgICA6IG1fZXhlYyhleGVjKQor
ICAgICwgbV9yZXBsYWNlcihyZXBsYWNlcikKKyAgICAsIG1fdXNpbmdBcnJheVJlcGxhY2VyKGZh
bHNlKQorICAgICwgbV9hcnJheVJlcGxhY2VyUHJvcGVydHlOYW1lcyhleGVjKQorICAgICwgbV9y
ZXBsYWNlckNhbGxUeXBlKENhbGxUeXBlTm9uZSkKKyAgICAsIG1fZ2FwKGdhcChzcGFjZSkpCit7
CisgICAgaWYgKCFtX3JlcGxhY2VyLmlzT2JqZWN0KCkpCisgICAgICAgIHJldHVybjsKIAotICAg
IGNsYXNzIEludEtleUdlbmVyYXRvciB7Ci0gICAgcHVibGljOgotICAgICAgICBJbnRLZXlHZW5l
cmF0b3IodWludDMyX3QgcHJvcGVydHkpCi0gICAgICAgICAgICA6IG1fcHJvcGVydHkocHJvcGVy
dHkpCi0gICAgICAgIHsKKyAgICBpZiAoYXNPYmplY3QobV9yZXBsYWNlciktPmluaGVyaXRzKCZK
U0FycmF5OjppbmZvKSkgeworICAgICAgICBtX3VzaW5nQXJyYXlSZXBsYWNlciA9IHRydWU7Cisg
ICAgICAgIEpTT2JqZWN0KiBhcnJheSA9IGFzT2JqZWN0KG1fcmVwbGFjZXIpOworICAgICAgICB1
bnNpZ25lZCBsZW5ndGggPSBhcnJheS0+Z2V0KGV4ZWMsIGV4ZWMtPmdsb2JhbERhdGEoKS5wcm9w
ZXJ0eU5hbWVzLT5sZW5ndGgpLnRvVUludDMyKGV4ZWMpOworICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIEpTVmFsdWUgbmFtZSA9IGFy
cmF5LT5nZXQoZXhlYywgaSk7CisgICAgICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkp
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBVU3RyaW5nIHByb3BlcnR5TmFt
ZTsKKyAgICAgICAgICAgIGlmICghbmFtZS5nZXRTdHJpbmcocHJvcGVydHlOYW1lKSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24o
KSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBtX2FycmF5UmVwbGFjZXJQ
cm9wZXJ0eU5hbWVzLmFkZChJZGVudGlmaWVyKGV4ZWMsIHByb3BlcnR5TmFtZSkpOwogICAgICAg
ICB9Ci0gICAgICAgIEpTVmFsdWUgZ2V0S2V5KEV4ZWNTdGF0ZSogZXhlYykgeyBpZiAoIW1fa2V5
KSBtX2tleSA9IGpzTnVtYmVyKGV4ZWMsIG1fcHJvcGVydHkpOyByZXR1cm4gbV9rZXk7ICB9Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBwcml2YXRlOgotICAgICAgICB1aW50MzJfdCBt
X3Byb3BlcnR5OwotICAgICAgICBKU1ZhbHVlIG1fa2V5OwotICAgIH07CisgICAgbV9yZXBsYWNl
ckNhbGxUeXBlID0gYXNPYmplY3QobV9yZXBsYWNlciktPmdldENhbGxEYXRhKG1fcmVwbGFjZXJD
YWxsRGF0YSk7Cit9CiAKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5R2VuZXJhdG9yPiBKU1Zh
bHVlIHRvSlNPTlZhbHVlKEtleUdlbmVyYXRvciYganNLZXksIEpTVmFsdWUganNWYWx1ZSkKLSAg
ICB7Ci0gICAgICAgIEFTU0VSVCghbV9leGVjLT5oYWRFeGNlcHRpb24oKSk7Ci0gICAgICAgIGlm
ICghanNWYWx1ZS5pc09iamVjdCgpIHx8ICFhc09iamVjdChqc1ZhbHVlKS0+aGFzUHJvcGVydHko
bV9leGVjLCBtX2V4ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0eU5hbWVzLT50b0pTT04pKQotICAg
ICAgICAgICAgcmV0dXJuIGpzVmFsdWU7CitKU1ZhbHVlIFN0cmluZ2lmaWVyOjpzdHJpbmdpZnko
SlNWYWx1ZSB2YWx1ZSkKK3sKKyAgICBKU09iamVjdCogb2JqZWN0ID0gY29uc3RydWN0RW1wdHlP
YmplY3QobV9leGVjKTsKKyAgICBpZiAobV9leGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAg
cmV0dXJuIGpzTnVsbCgpOworCisgICAgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsIGVtcHR5
UHJvcGVydHlOYW1lKG1fZXhlYy0+Z2xvYmFsRGF0YSgpLnByb3BlcnR5TmFtZXMtPmVtcHR5SWRl
bnRpZmllcik7CisgICAgb2JqZWN0LT5wdXREaXJlY3QobV9leGVjLT5nbG9iYWxEYXRhKCkucHJv
cGVydHlOYW1lcy0+ZW1wdHlJZGVudGlmaWVyLCB2YWx1ZSk7CisKKyAgICBTdHJpbmdCdWlsZGVy
IHJlc3VsdDsKKyAgICBpZiAoYXBwZW5kU3RyaW5naWZpZWRWYWx1ZShyZXN1bHQsIHZhbHVlLCBv
YmplY3QsIGVtcHR5UHJvcGVydHlOYW1lKSAhPSBTdHJpbmdpZnlTdWNjZWVkZWQpCisgICAgICAg
IHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQor
ICAgICAgICByZXR1cm4ganNOdWxsKCk7CiAKLSAgICAgICAgSlNWYWx1ZSBqc1RvSlNPTiA9IGFz
T2JqZWN0KGpzVmFsdWUpLT5nZXQobV9leGVjLCBtX2V4ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0
eU5hbWVzLT50b0pTT04pOworICAgIHJldHVybiBqc1N0cmluZyhtX2V4ZWMsIHJlc3VsdCk7Cit9
CiAKLSAgICAgICAgaWYgKCFqc1RvSlNPTi5pc09iamVjdCgpKQotICAgICAgICAgICAgcmV0dXJu
IGpzVmFsdWU7Cit2b2lkIFN0cmluZ2lmaWVyOjphcHBlbmRRdW90ZWRTdHJpbmcoU3RyaW5nQnVp
bGRlciYgYnVpbGRlciwgY29uc3QgVVN0cmluZyYgdmFsdWUpCit7CisgICAgaW50IGxlbmd0aCA9
IHZhbHVlLnNpemUoKTsKIAotICAgICAgICBpZiAobV9leGVjLT5oYWRFeGNlcHRpb24oKSkKLSAg
ICAgICAgICAgIHJldHVybiBqc051bGwoKTsKKyAgICAvLyBTdHJpbmcgbGVuZ3RoIHBsdXMgMiBm
b3IgcXVvdGUgbWFya3MgcGx1cyA4IHNvIHdlIGNhbiBhY2NvbW9kYXRlIGEgZmV3IGVzY2FwZWQg
Y2hhcmFjdGVycy4KKyAgICBidWlsZGVyLnJlc2VydmVDYXBhY2l0eShidWlsZGVyLnNpemUoKSAr
IGxlbmd0aCArIDIgKyA4KTsKIAotICAgICAgICBKU09iamVjdCogb2JqZWN0ID0gYXNPYmplY3Qo
anNUb0pTT04pOwotICAgICAgICBDYWxsRGF0YSBjYWxsRGF0YTsKLSAgICAgICAgQ2FsbFR5cGUg
Y2FsbFR5cGUgPSBvYmplY3QtPmdldENhbGxEYXRhKGNhbGxEYXRhKTsKKyAgICBidWlsZGVyLmFw
cGVuZCgnIicpOwogCi0gICAgICAgIGlmIChjYWxsVHlwZSA9PSBDYWxsVHlwZU5vbmUpCi0gICAg
ICAgICAgICByZXR1cm4ganNWYWx1ZTsKKyAgICBjb25zdCBVQ2hhciogZGF0YSA9IHZhbHVlLmRh
dGEoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIGlu
dCBzdGFydCA9IGk7CisgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIChkYXRhW2ldID4gMHgx
RiAmJiBkYXRhW2ldICE9ICciJyAmJiBkYXRhW2ldICE9ICdcXCcpKQorICAgICAgICAgICAgKytp
OworICAgICAgICBidWlsZGVyLmFwcGVuZChkYXRhICsgc3RhcnQsIGkgLSBzdGFydCk7CisgICAg
ICAgIGlmIChpID49IGxlbmd0aCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2gg
KGRhdGFbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICBidWls
ZGVyLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgndCcpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBw
ZW5kKCdyJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcbic6
CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICAgICAg
YnVpbGRlci5hcHBlbmQoJ24nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXFwnKTsKKyAgICAg
ICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnZicpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdc
XCcpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdiJyk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBidWlsZGVy
LmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAg
ICAgIGJ1aWxkZXIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KCdcXCcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBoZXhEaWdpdHNbXSA9ICIwMTIzNDU2Nzg5
YWJjZGVmIjsKKyAgICAgICAgICAgICAgICBVQ2hhciBjaCA9IGRhdGFbaV07CisgICAgICAgICAg
ICAgICAgVUNoYXIgaGV4W10gPSB7ICdcXCcsICd1JywgaGV4RGlnaXRzWyhjaCA+PiAxMikgJiAw
eEZdLCBoZXhEaWdpdHNbKGNoID4+IDgpICYgMHhGXSwgaGV4RGlnaXRzWyhjaCA+PiA0KSAmIDB4
Rl0sIGhleERpZ2l0c1tjaCAmIDB4Rl0gfTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVu
ZChoZXgsIHNpemVvZihoZXgpIC8gc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgSlNWYWx1ZSBsaXN0W10gPSB7IGpzS2V5
LmdldEtleShtX2V4ZWMpIH07ICAgICAgICAKKyAgICBidWlsZGVyLmFwcGVuZCgnIicpOworfQor
CitpbmxpbmUgSlNWYWx1ZSBTdHJpbmdpZmllcjo6dG9KU09OKEpTVmFsdWUgdmFsdWUsIGNvbnN0
IFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbCYgcHJvcGVydHlOYW1lKQoreworICAgIEFTU0VS
VCghbV9leGVjLT5oYWRFeGNlcHRpb24oKSk7CisgICAgaWYgKCF2YWx1ZS5pc09iamVjdCgpIHx8
ICFhc09iamVjdCh2YWx1ZSktPmhhc1Byb3BlcnR5KG1fZXhlYywgbV9leGVjLT5nbG9iYWxEYXRh
KCkucHJvcGVydHlOYW1lcy0+dG9KU09OKSkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAg
SlNWYWx1ZSB0b0pTT05GdW5jdGlvbiA9IGFzT2JqZWN0KHZhbHVlKS0+Z2V0KG1fZXhlYywgbV9l
eGVjLT5nbG9iYWxEYXRhKCkucHJvcGVydHlOYW1lcy0+dG9KU09OKTsKKyAgICBpZiAobV9leGVj
LT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIGpzTnVsbCgpOworCisgICAgaWYgKCF0
b0pTT05GdW5jdGlvbi5pc09iamVjdCgpKQorICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICBK
U09iamVjdCogb2JqZWN0ID0gYXNPYmplY3QodG9KU09ORnVuY3Rpb24pOworICAgIENhbGxEYXRh
IGNhbGxEYXRhOworICAgIENhbGxUeXBlIGNhbGxUeXBlID0gb2JqZWN0LT5nZXRDYWxsRGF0YShj
YWxsRGF0YSk7CisgICAgaWYgKGNhbGxUeXBlID09IENhbGxUeXBlTm9uZSkKKyAgICAgICAgcmV0
dXJuIHZhbHVlOworCisgICAgSlNWYWx1ZSBsaXN0W10gPSB7IHByb3BlcnR5TmFtZS52YWx1ZSht
X2V4ZWMpIH07CisgICAgQXJnTGlzdCBhcmdzKGxpc3QsIHNpemVvZihsaXN0KSAvIHNpemVvZihK
U1ZhbHVlKSk7CisgICAgcmV0dXJuIGNhbGwobV9leGVjLCBvYmplY3QsIGNhbGxUeXBlLCBjYWxs
RGF0YSwgdmFsdWUsIGFyZ3MpOworfQorCitTdHJpbmdpZmllcjo6U3RyaW5naWZ5UmVzdWx0IFN0
cmluZ2lmaWVyOjphcHBlbmRTdHJpbmdpZmllZFZhbHVlKFN0cmluZ0J1aWxkZXImIGJ1aWxkZXIs
IEpTVmFsdWUgdmFsdWUsIEpTT2JqZWN0KiBob2xkZXIsIGNvbnN0IFByb3BlcnR5TmFtZUZvckZ1
bmN0aW9uQ2FsbCYgcHJvcGVydHlOYW1lKQoreworICAgIC8vIENhbGwgdGhlIHRvSlNPTiBmdW5j
dGlvbi4KKyAgICB2YWx1ZSA9IHRvSlNPTih2YWx1ZSwgcHJvcGVydHlOYW1lKTsKKyAgICBpZiAo
bV9leGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZ2lmeUZhaWxlZDsK
KyAgICBpZiAodmFsdWUuaXNVbmRlZmluZWQoKSAmJiAhYXNPYmplY3QoaG9sZGVyKS0+aW5oZXJp
dHMoJkpTQXJyYXk6OmluZm8pKQorICAgICAgICByZXR1cm4gU3RyaW5naWZ5RmFpbGVkRHVlVG9V
bmRlZmluZWRWYWx1ZTsKKworICAgIC8vIENhbGwgdGhlIHJlcGxhY2VyIGZ1bmN0aW9uLgorICAg
IGlmIChtX3JlcGxhY2VyQ2FsbFR5cGUgIT0gQ2FsbFR5cGVOb25lKSB7CisgICAgICAgIEpTVmFs
dWUgbGlzdFtdID0geyBwcm9wZXJ0eU5hbWUudmFsdWUobV9leGVjKSwgdmFsdWUgfTsKICAgICAg
ICAgQXJnTGlzdCBhcmdzKGxpc3QsIHNpemVvZihsaXN0KSAvIHNpemVvZihKU1ZhbHVlKSk7Ci0g
ICAgICAgIHJldHVybiBjYWxsKG1fZXhlYywgb2JqZWN0LCBjYWxsVHlwZSwgY2FsbERhdGEsIGpz
VmFsdWUsIGFyZ3MpOworICAgICAgICB2YWx1ZSA9IGNhbGwobV9leGVjLCBtX3JlcGxhY2VyLCBt
X3JlcGxhY2VyQ2FsbFR5cGUsIG1fcmVwbGFjZXJDYWxsRGF0YSwgaG9sZGVyLCBhcmdzKTsKKyAg
ICAgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICByZXR1cm4gU3Ry
aW5naWZ5RmFpbGVkOwogICAgIH0KIAotICAgIGJvb2wgc3RyaW5naWZ5QXJyYXkoU3RyaW5nQnVp
bGRlciYgYnVpbGRlciwgSlNBcnJheSogYXJyYXkpCi0gICAgewotICAgICAgICBpZiAobV9vYmpl
Y3RTdGFjay5jb250YWlucyhhcnJheSkpIHsKLSAgICAgICAgICAgIHRocm93RXJyb3IobV9leGVj
LCBUeXBlRXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAg
aWYgKHZhbHVlLmlzTnVsbCgpKSB7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJudWxsIik7Cisg
ICAgICAgIHJldHVybiBTdHJpbmdpZnlTdWNjZWVkZWQ7CisgICAgfQogCi0gICAgICAgIGlmICht
X29iamVjdFN0YWNrLnNpemUoKSA+IE1heE9iamVjdERlcHRoKSB7Ci0gICAgICAgICAgICBtX2V4
ZWMtPnNldEV4Y2VwdGlvbihjcmVhdGVTdGFja092ZXJmbG93RXJyb3IobV9leGVjKSk7Ci0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBpZiAodmFsdWUuaXNCb29sZWFu
KCkpIHsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWUuZ2V0Qm9vbGVhbigpID8gInRydWUi
IDogImZhbHNlIik7CisgICAgICAgIHJldHVybiBTdHJpbmdpZnlTdWNjZWVkZWQ7CisgICAgfQog
Ci0gICAgICAgIG1fb2JqZWN0U3RhY2suYWRkKGFycmF5KTsKLSAgICAgICAgVVN0cmluZyBzdGVw
QmFjayA9IG1faW5kZW50OwotICAgICAgICBtX2luZGVudC5hcHBlbmQobV9nYXApOwotICAgICAg
ICBWZWN0b3I8U3RyaW5nQnVpbGRlciwgMTY+IHBhcnRpYWw7Ci0gICAgICAgIHVuc2lnbmVkIGxl
biA9IGFycmF5LT5nZXQobV9leGVjLCBtX2V4ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0eU5hbWVz
LT5sZW5ndGgpLnRvVUludDMyKG1fZXhlYyk7Ci0gICAgICAgIGJvb2wgaXNSZWFsSlNBcnJheSA9
IGlzSlNBcnJheSgmbV9leGVjLT5nbG9iYWxEYXRhKCksIGFycmF5KTsKLSAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBKU1ZhbHVlIHZhbHVl
OwotICAgICAgICAgICAgaWYgKGlzUmVhbEpTQXJyYXkgJiYgYXJyYXktPmNhbkdldEluZGV4KGkp
KQotICAgICAgICAgICAgICAgIHZhbHVlID0gYXJyYXktPmdldEluZGV4KGkpOwotICAgICAgICAg
ICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBhcnJheS0+Z2V0KG1fZXhlYywgaSk7
Ci0gICAgICAgICAgICAgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmlu
Z0J1aWxkZXIgcmVzdWx0OwotICAgICAgICAgICAgSW50S2V5R2VuZXJhdG9yIGtleShpKTsKLSAg
ICAgICAgICAgIHZhbHVlID0gdG9KU09OVmFsdWUoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBp
ZiAocGFydGlhbC5zaXplKCkgJiYgbV9nYXAuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHBh
cnRpYWwubGFzdCgpLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgaWYgKCFzdHJpbmdpZnkocmVz
dWx0LCBhcnJheSwga2V5LCB2YWx1ZSkgJiYgIW1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAg
ICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgibnVsbCIpOwotICAgICAgICAgICAgZWxzZSBpZiAo
bV9leGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgICAgICBwYXJ0aWFsLmFwcGVuZChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICBpZiAocGFydGlhbC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVu
ZCgiW10iKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9nYXAuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1snKTsKLSAgICAgICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGFydGlhbC5zaXplKCk7IGkrKykKLSAgICAgICAg
ICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydGlhbFtpXSk7Ci0gICAgICAgICAgICAgICAg
YnVpbGRlci5hcHBlbmQoJ10nKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgVVN0cmluZyBzZXBhcmF0b3IoIixcbiIpOwotICAgICAgICAgICAgICAgIHNlcGFyYXRvci5h
cHBlbmQobV9pbmRlbnQpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJbXG4iKTsK
LSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChtX2luZGVudCk7Ci0gICAgICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHBhcnRpYWwuc2l6ZSgpOyBpKyspIHsKLSAgICAg
ICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydGlhbFtpXSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmIChpIDwgcGFydGlhbC5zaXplKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICAg
ICAgYnVpbGRlci5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQoc3RlcEJhY2spOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCddJyk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICB2YWx1ZSA9IHVud3JhcE51bWJlck9yU3RyaW5n
KHZhbHVlKTsKIAotICAgICAgICBtX2luZGVudCA9IHN0ZXBCYWNrOwotICAgICAgICBtX29iamVj
dFN0YWNrLnJlbW92ZShhcnJheSk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIFVTdHJpbmcg
c3RyaW5nVmFsdWU7CisgICAgaWYgKHZhbHVlLmdldFN0cmluZyhzdHJpbmdWYWx1ZSkpIHsKKyAg
ICAgICAgYXBwZW5kUXVvdGVkU3RyaW5nKGJ1aWxkZXIsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAg
cmV0dXJuIFN0cmluZ2lmeVN1Y2NlZWRlZDsKICAgICB9CiAKLSAgICBib29sIHN0cmluZ2lmeU9i
amVjdChTdHJpbmdCdWlsZGVyJiBidWlsZGVyLCBKU09iamVjdCogb2JqZWN0KQotICAgIHsKLSAg
ICAgICAgaWYgKG1fb2JqZWN0U3RhY2suY29udGFpbnMob2JqZWN0KSkgewotICAgICAgICAgICAg
dGhyb3dFcnJvcihtX2V4ZWMsIFR5cGVFcnJvcik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIH0KKyAgICBkb3VibGUgbnVtZXJpY1ZhbHVlOworICAgIGlmICh2YWx1ZS5nZXRO
dW1iZXIobnVtZXJpY1ZhbHVlKSkgeworICAgICAgICBpZiAoIWlzZmluaXRlKG51bWVyaWNWYWx1
ZSkpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgibnVsbCIpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBidWlsZGVyLmFwcGVuZChVU3RyaW5nOjpmcm9tKG51bWVyaWNWYWx1ZSkpOwor
ICAgICAgICByZXR1cm4gU3RyaW5naWZ5U3VjY2VlZGVkOworICAgIH0KIAotICAgICAgICBpZiAo
bV9vYmplY3RTdGFjay5zaXplKCkgPiBNYXhPYmplY3REZXB0aCkgewotICAgICAgICAgICAgbV9l
eGVjLT5zZXRFeGNlcHRpb24oY3JlYXRlU3RhY2tPdmVyZmxvd0Vycm9yKG1fZXhlYykpOwotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgaWYgKCF2YWx1ZS5pc09iamVj
dCgpKQorICAgICAgICByZXR1cm4gU3RyaW5naWZ5RmFpbGVkOworCisgICAgSlNPYmplY3QqIG9i
amVjdCA9IGFzT2JqZWN0KHZhbHVlKTsKIAotICAgICAgICBtX29iamVjdFN0YWNrLmFkZChvYmpl
Y3QpOwotICAgICAgICBVU3RyaW5nIHN0ZXBCYWNrID0gbV9pbmRlbnQ7Ci0gICAgICAgIG1faW5k
ZW50LmFwcGVuZChtX2dhcCk7Ci0gICAgICAgIFZlY3RvcjxTdHJpbmdCdWlsZGVyLCAxNj4gcGFy
dGlhbDsKLQotICAgICAgICBQcm9wZXJ0eU5hbWVBcnJheSBvYmplY3RQcm9wZXJ0eU5hbWVzKG1f
ZXhlYyk7Ci0gICAgICAgIFByb3BlcnR5TmFtZUFycmF5JiBzb3VyY2VQcm9wZXJ0eU5hbWVzKG1f
YXJyYXlSZXBsYWNlclByb3BlcnR5TmFtZXMpOwotICAgICAgICBpZiAoIW1fdXNpbmdBcnJheVJl
cGxhY2VyKSB7Ci0gICAgICAgICAgICBvYmplY3QtPmdldFByb3BlcnR5TmFtZXMobV9leGVjLCBv
YmplY3RQcm9wZXJ0eU5hbWVzKTsKLSAgICAgICAgICAgIHNvdXJjZVByb3BlcnR5TmFtZXMgPSBv
YmplY3RQcm9wZXJ0eU5hbWVzOworICAgIC8vIEhhbmRsZSBjeWNsZSBkZXRlY3Rpb24sIGFuZCBw
dXQgdGhlIGhvbGRlciBvbiB0aGUgc3RhY2suCisgICAgaWYgKCFtX2hvbGRlckN5Y2xlRGV0ZWN0
b3IuYWRkKG9iamVjdCkuc2Vjb25kKSB7CisgICAgICAgIHRocm93RXJyb3IobV9leGVjLCBUeXBl
RXJyb3IpOworICAgICAgICByZXR1cm4gU3RyaW5naWZ5RmFpbGVkOworICAgIH0KKyAgICBib29s
IGhvbGRlclN0YWNrV2FzRW1wdHkgPSBtX2hvbGRlclN0YWNrLmlzRW1wdHkoKTsKKyAgICBtX2hv
bGRlclN0YWNrLmFwcGVuZChvYmplY3QpOworICAgIGlmICghaG9sZGVyU3RhY2tXYXNFbXB0eSkK
KyAgICAgICAgcmV0dXJuIFN0cmluZ2lmeVN1Y2NlZWRlZDsKKworICAgIC8vIElmIHRoaXMgaXMg
dGhlIG91dGVybW9zdCBjYWxsLCB0aGVuIGxvb3AgdG8gaGFuZGxlIGV2ZXJ5dGhpbmcgb24gdGhl
IGhvbGRlciBzdGFjay4KKyAgICBkbyB7CisgICAgICAgIHVuc2lnbmVkIHRpY2tDb3VudCA9IG1f
ZXhlYy0+Z2xvYmFsRGF0YSgpLnRpbWVvdXRDaGVja2VyLnRpY2tzVW50aWxOZXh0Q2hlY2soKTsK
KyAgICAgICAgd2hpbGUgKG1faG9sZGVyU3RhY2subGFzdCgpLmFwcGVuZE5leHRQcm9wZXJ0eSgq
dGhpcywgYnVpbGRlcikpIHsKKyAgICAgICAgICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigp
KQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdpZnlGYWlsZWQ7CisgICAgICAgICAgICBp
ZiAoIS0tdGlja0NvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKG1fZXhlYy0+Z2xvYmFsRGF0
YSgpLnRpbWVvdXRDaGVja2VyLmRpZFRpbWVPdXQobV9leGVjKSkgeworICAgICAgICAgICAgICAg
ICAgICBtX2V4ZWMtPnNldEV4Y2VwdGlvbihjcmVhdGVJbnRlcnJ1cHRlZEV4ZWN1dGlvbkV4Y2Vw
dGlvbigmbV9leGVjLT5nbG9iYWxEYXRhKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IFN0cmluZ2lmeUZhaWxlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGlj
a0NvdW50ID0gbV9leGVjLT5nbG9iYWxEYXRhKCkudGltZW91dENoZWNrZXIudGlja3NVbnRpbE5l
eHRDaGVjaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIG1faG9sZGVyQ3lj
bGVEZXRlY3Rvci5yZW1vdmUobV9ob2xkZXJTdGFjay5sYXN0KCkub2JqZWN0KCkpOworICAgICAg
ICBtX2hvbGRlclN0YWNrLnJlbW92ZUxhc3QoKTsKKyAgICB9IHdoaWxlICghbV9ob2xkZXJTdGFj
ay5pc0VtcHR5KCkpOworICAgIHJldHVybiBTdHJpbmdpZnlTdWNjZWVkZWQ7Cit9CiAKLSAgICAg
ICAgUHJvcGVydHlOYW1lQXJyYXk6OmNvbnN0X2l0ZXJhdG9yIHByb3BFbmQgPSBzb3VyY2VQcm9w
ZXJ0eU5hbWVzLmVuZCgpOwotICAgICAgICBmb3IgKFByb3BlcnR5TmFtZUFycmF5Ojpjb25zdF9p
dGVyYXRvciBwcm9wSXRlciA9IHNvdXJjZVByb3BlcnR5TmFtZXMuYmVnaW4oKTsgcHJvcEl0ZXIg
IT0gcHJvcEVuZDsgcHJvcEl0ZXIrKykgewotICAgICAgICAgICAgaWYgKCFvYmplY3QtPmhhc093
blByb3BlcnR5KG1fZXhlYywgKnByb3BJdGVyKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsK
K2lubGluZSBib29sIFN0cmluZ2lmaWVyOjp3aWxsSW5kZW50KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gIW1fZ2FwLmlzRW1wdHkoKTsKK30KIAotICAgICAgICAgICAgSlNWYWx1ZSB2YWx1ZSA9IG9i
amVjdC0+Z2V0KG1fZXhlYywgKnByb3BJdGVyKTsKLSAgICAgICAgICAgIGlmIChtX2V4ZWMtPmhh
ZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKK2lubGluZSB2b2lk
IFN0cmluZ2lmaWVyOjppbmRlbnQoKQoreworICAgIC8vIFVzZSBhIHNpbmdsZSBzaGFyZWQgc3Ry
aW5nLCBtX3JlcGVhdGVkR2FwLCBzbyB3ZSBkb24ndCBrZWVwIGFsbG9jYXRpbmcgbmV3IG9uZXMg
YXMgd2UgaW5kZW50IGFuZCB1bmluZGVudC4KKyAgICBpbnQgbmV3U2l6ZSA9IG1faW5kZW50LnNp
emUoKSArIG1fZ2FwLnNpemUoKTsKKyAgICBpZiAobmV3U2l6ZSA+IG1fcmVwZWF0ZWRHYXAuc2l6
ZSgpKQorICAgICAgICBtX3JlcGVhdGVkR2FwLmFwcGVuZChtX2dhcCk7CisgICAgQVNTRVJUKG5l
d1NpemUgPD0gbV9yZXBlYXRlZEdhcC5zaXplKCkpOworICAgIG1faW5kZW50ID0gbV9yZXBlYXRl
ZEdhcC5zdWJzdHIoMCwgbmV3U2l6ZSk7Cit9CiAKLSAgICAgICAgICAgIGlmICh2YWx1ZS5pc1Vu
ZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworaW5saW5lIHZvaWQgU3RyaW5n
aWZpZXI6OnVuaW5kZW50KCkKK3sKKyAgICBBU1NFUlQobV9pbmRlbnQuc2l6ZSgpID49IG1fZ2Fw
LnNpemUoKSk7CisgICAgbV9pbmRlbnQgPSBtX3JlcGVhdGVkR2FwLnN1YnN0cigwLCBtX2luZGVu
dC5zaXplKCkgLSBtX2dhcC5zaXplKCkpOworfQogCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVy
IHJlc3VsdDsKLSAgICAgICAgICAgIGFwcGVuZFN0cmluZyhyZXN1bHQscHJvcEl0ZXItPnVzdHJp
bmcoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBpZiAo
IW1fZ2FwLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7Ci0g
ICAgICAgICAgICBTdHJpbmdLZXlHZW5lcmF0b3Iga2V5KCpwcm9wSXRlcik7Ci0gICAgICAgICAg
ICB2YWx1ZSA9IHRvSlNPTlZhbHVlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgaWYgKG1fZXhl
Yy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworaW5saW5l
IHZvaWQgU3RyaW5naWZpZXI6OnN0YXJ0TmV3TGluZShTdHJpbmdCdWlsZGVyJiBidWlsZGVyKSBj
b25zdAoreworICAgIGlmIChtX2dhcC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKyAgICBi
dWlsZGVyLmFwcGVuZCgnXG4nKTsKKyAgICBidWlsZGVyLmFwcGVuZChtX2luZGVudCk7Cit9CiAK
LSAgICAgICAgICAgIGlmICh2YWx1ZS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworaW5saW5lIFN0cmluZ2lmaWVyOjpIb2xkZXI6OkhvbGRlcihKU09iamVjdCogb2Jq
ZWN0KQorICAgIDogbV9vYmplY3Qob2JqZWN0KQorICAgICwgbV9pc0FycmF5KG9iamVjdC0+aW5o
ZXJpdHMoJkpTQXJyYXk6OmluZm8pKQorICAgICwgbV9pbmRleCgwKQoreworfQogCi0gICAgICAg
ICAgICBzdHJpbmdpZnkocmVzdWx0LCBvYmplY3QsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAg
cGFydGlhbC5hcHBlbmQocmVzdWx0KTsKLSAgICAgICAgfQorYm9vbCBTdHJpbmdpZmllcjo6SG9s
ZGVyOjphcHBlbmROZXh0UHJvcGVydHkoU3RyaW5naWZpZXImIHN0cmluZ2lmaWVyLCBTdHJpbmdC
dWlsZGVyJiBidWlsZGVyKQoreworICAgIEFTU0VSVChtX2luZGV4IDw9IG1fc2l6ZSk7CiAKLSAg
ICAgICAgaWYgKHBhcnRpYWwuaXNFbXB0eSgpKQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQo
Int9Iik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKG1fZ2FwLmlzRW1wdHkoKSkg
ewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCd7Jyk7Ci0gICAgICAgICAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHBhcnRpYWwuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQoJywnKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydGlhbFtp
XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCd9
Jyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFVTdHJpbmcgc2VwYXJh
dG9yKCIsXG4iKTsKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3IuYXBwZW5kKG1faW5kZW50KTsK
LSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgie1xuIik7Ci0gICAgICAgICAgICAgICAg
YnVpbGRlci5hcHBlbmQobV9pbmRlbnQpOwotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBwYXJ0aWFsLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1
aWxkZXIuYXBwZW5kKHBhcnRpYWxbaV0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHBh
cnRpYWwuc2l6ZSgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KHNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHN0ZXBCYWNrKTsK
LSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnfScpOwotICAgICAgICAgICAgfQorICAg
IEV4ZWNTdGF0ZSogZXhlYyA9IHN0cmluZ2lmaWVyLm1fZXhlYzsKIAorICAgIC8vIEZpcnN0IHRp
bWUgdGhyb3VnaCwgaW5pdGlhbGl6ZS4KKyAgICBpZiAoIW1faW5kZXgpIHsKKyAgICAgICAgaWYg
KG1faXNBcnJheSkgeworICAgICAgICAgICAgbV9pc0pTQXJyYXkgPSBpc0pTQXJyYXkoJmV4ZWMt
Pmdsb2JhbERhdGEoKSwgbV9vYmplY3QpOworICAgICAgICAgICAgbV9zaXplID0gbV9vYmplY3Qt
PmdldChleGVjLCBleGVjLT5nbG9iYWxEYXRhKCkucHJvcGVydHlOYW1lcy0+bGVuZ3RoKS50b1VJ
bnQzMihleGVjKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdbJyk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RyaW5naWZpZXIubV91c2luZ0FycmF5UmVwbGFjZXIp
CisgICAgICAgICAgICAgICAgbV9wcm9wZXJ0eU5hbWVzID0gc3RyaW5naWZpZXIubV9hcnJheVJl
cGxhY2VyUHJvcGVydHlOYW1lcy5kYXRhKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgICAgICBQcm9wZXJ0eU5hbWVBcnJheSBvYmplY3RQcm9wZXJ0eU5hbWVzKGV4ZWMpOworICAg
ICAgICAgICAgICAgIG1fb2JqZWN0LT5nZXRQcm9wZXJ0eU5hbWVzKGV4ZWMsIG9iamVjdFByb3Bl
cnR5TmFtZXMpOworICAgICAgICAgICAgICAgIG1fcHJvcGVydHlOYW1lcyA9IG9iamVjdFByb3Bl
cnR5TmFtZXMucmVsZWFzZURhdGEoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fc2l6
ZSA9IG1fcHJvcGVydHlOYW1lcy0+cHJvcGVydHlOYW1lVmVjdG9yKCkuc2l6ZSgpOworICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQoJ3snKTsKICAgICAgICAgfQorICAgICAgICBzdHJpbmdpZmll
ci5pbmRlbnQoKTsKKyAgICB9CiAKLSAgICAgICAgbV9pbmRlbnQgPSBzdGVwQmFjazsKLSAgICAg
ICAgbV9vYmplY3RTdGFjay5yZW1vdmUob2JqZWN0KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgfQotICAgIAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXlHZW5lcmF0b3I+IGJvb2wgc3Ry
aW5naWZ5KFN0cmluZ0J1aWxkZXImIGJ1aWxkZXIsIEpTVmFsdWUgaG9sZGVyLCBLZXlHZW5lcmF0
b3Iga2V5LCBKU1ZhbHVlIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKG1fcmVwbGFjZXJDYWxs
VHlwZSAhPSBDYWxsVHlwZU5vbmUpIHsKLSAgICAgICAgICAgIEpTVmFsdWUgbGlzdFtdID0ge2tl
eS5nZXRLZXkobV9leGVjKSwgdmFsdWV9OwotICAgICAgICAgICAgQXJnTGlzdCBhcmdzKGxpc3Qs
IHNpemVvZihsaXN0KSAvIHNpemVvZihKU1ZhbHVlKSk7Ci0gICAgICAgICAgICB2YWx1ZSA9IGNh
bGwobV9leGVjLCBtX3JlcGxhY2VyLCBtX3JlcGxhY2VyQ2FsbFR5cGUsIG1fcmVwbGFjZXJDYWxs
RGF0YSwgaG9sZGVyLCBhcmdzKTsKLSAgICAgICAgICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlv
bigpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgIC8vIExh
c3QgdGltZSB0aHJvdWdoLCBmaW5pc2ggdXAgYW5kIHJldHVybiBmYWxzZS4KKyAgICBpZiAobV9p
bmRleCA9PSBtX3NpemUpIHsKKyAgICAgICAgc3RyaW5naWZpZXIudW5pbmRlbnQoKTsKKyAgICAg
ICAgaWYgKG1fc2l6ZSAmJiBidWlsZGVyW2J1aWxkZXIuc2l6ZSgpIC0gMV0gIT0gJ3snKQorICAg
ICAgICAgICAgc3RyaW5naWZpZXIuc3RhcnROZXdMaW5lKGJ1aWxkZXIpOworICAgICAgICBidWls
ZGVyLmFwcGVuZChtX2lzQXJyYXkgPyAnXScgOiAnfScpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQogCi0gICAgICAgIGlmICh2YWx1ZS5pc051bGwoKSkgewotICAgICAgICAgICAgYnVp
bGRlci5hcHBlbmQoIm51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIEhh
bmRsZSBhIHNpbmdsZSBlbGVtZW50IG9mIHRoZSBhcnJheSBvciBvYmplY3QuCisgICAgdW5zaWdu
ZWQgaW5kZXggPSBtX2luZGV4Kys7CisgICAgdW5zaWduZWQgcm9sbEJhY2tQb2ludCA9IDA7Cisg
ICAgU3RyaW5naWZ5UmVzdWx0IHN0cmluZ2lmeVJlc3VsdDsKKyAgICBpZiAobV9pc0FycmF5KSB7
CisgICAgICAgIC8vIEdldCB0aGUgdmFsdWUuCisgICAgICAgIEpTVmFsdWUgdmFsdWU7CisgICAg
ICAgIGlmIChtX2lzSlNBcnJheSAmJiBhc0FycmF5KG1fb2JqZWN0KS0+Y2FuR2V0SW5kZXgoaW5k
ZXgpKQorICAgICAgICAgICAgdmFsdWUgPSBhc0FycmF5KG1fb2JqZWN0KS0+Z2V0SW5kZXgoaW5k
ZXgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFByb3BlcnR5U2xvdCBzbG90KG1fb2Jq
ZWN0KTsKKyAgICAgICAgICAgIGlmICghbV9vYmplY3QtPmdldE93blByb3BlcnR5U2xvdChleGVj
LCBpbmRleCwgc2xvdCkpCisgICAgICAgICAgICAgICAgc2xvdC5zZXRVbmRlZmluZWQoKTsKKyAg
ICAgICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICB2YWx1ZSA9IHNsb3QuZ2V0VmFsdWUoZXhlYywgaW5kZXgp
OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZhbHVlLmlzQm9vbGVhbigpKSB7Ci0gICAgICAg
ICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZS5nZXRCb29sZWFuKCkgPyAidHJ1ZSIgOiAiZmFsc2Ui
KTsKKyAgICAgICAgLy8gQXBwZW5kIHRoZSBzZXBhcmF0b3Igc3RyaW5nLgorICAgICAgICBpZiAo
aW5kZXgpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnLCcpOworICAgICAgICBzdHJpbmdp
Zmllci5zdGFydE5ld0xpbmUoYnVpbGRlcik7CisKKyAgICAgICAgLy8gQXBwZW5kIHRoZSBzdHJp
bmdpZmllZCB2YWx1ZS4KKyAgICAgICAgc3RyaW5naWZ5UmVzdWx0ID0gc3RyaW5naWZpZXIuYXBw
ZW5kU3RyaW5naWZpZWRWYWx1ZShidWlsZGVyLCB2YWx1ZSwgbV9vYmplY3QsIGluZGV4KTsKKyAg
ICB9IGVsc2UgeworICAgICAgICAvLyBHZXQgdGhlIHZhbHVlLgorICAgICAgICBQcm9wZXJ0eVNs
b3Qgc2xvdChtX29iamVjdCk7CisgICAgICAgIElkZW50aWZpZXImIHByb3BlcnR5TmFtZSA9IG1f
cHJvcGVydHlOYW1lcy0+cHJvcGVydHlOYW1lVmVjdG9yKClbaW5kZXhdOworICAgICAgICBpZiAo
IW1fb2JqZWN0LT5nZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90KSkK
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9CisgICAgICAgIEpTVmFsdWUgdmFs
dWUgPSBzbG90LmdldFZhbHVlKGV4ZWMsIHByb3BlcnR5TmFtZSk7CisgICAgICAgIGlmIChleGVj
LT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBp
ZiAodmFsdWUuaXNPYmplY3QoKSkgewotICAgICAgICAgICAgaWYgKGFzT2JqZWN0KHZhbHVlKS0+
aW5oZXJpdHMoJk51bWJlck9iamVjdDo6aW5mbykgfHwgYXNPYmplY3QodmFsdWUpLT5pbmhlcml0
cygmU3RyaW5nT2JqZWN0OjppbmZvKSkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0YXRpY19j
YXN0PEpTV3JhcHBlck9iamVjdCo+KGFzT2JqZWN0KHZhbHVlKSktPmludGVybmFsVmFsdWUoKTsK
LSAgICAgICAgfQorICAgICAgICByb2xsQmFja1BvaW50ID0gYnVpbGRlci5zaXplKCk7CiAKLSAg
ICAgICAgaWYgKHZhbHVlLmlzU3RyaW5nKCkpIHsKLSAgICAgICAgICAgIGFwcGVuZFN0cmluZyhi
dWlsZGVyLCB2YWx1ZS50b1N0cmluZyhtX2V4ZWMpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICB9CisgICAgICAgIC8vIEFwcGVuZCB0aGUgc2VwYXJhdG9yIHN0cmluZy4KKyAg
ICAgICAgaWYgKGJ1aWxkZXJbcm9sbEJhY2tQb2ludCAtIDFdICE9ICd7JykKKyAgICAgICAgICAg
IGJ1aWxkZXIuYXBwZW5kKCcsJyk7CisgICAgICAgIHN0cmluZ2lmaWVyLnN0YXJ0TmV3TGluZShi
dWlsZGVyKTsKKworICAgICAgICAvLyBBcHBlbmQgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICAg
IGFwcGVuZFF1b3RlZFN0cmluZyhidWlsZGVyLCBwcm9wZXJ0eU5hbWUudXN0cmluZygpKTsKKyAg
ICAgICAgYnVpbGRlci5hcHBlbmQoJzonKTsKKyAgICAgICAgaWYgKHN0cmluZ2lmaWVyLndpbGxJ
bmRlbnQoKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7CiAKLSAgICAgICAgaWYg
KHZhbHVlLmlzTnVtYmVyKCkpIHsKLSAgICAgICAgICAgIGRvdWJsZSB2ID0gdmFsdWUudG9OdW1i
ZXIobV9leGVjKTsKLSAgICAgICAgICAgIGlmICghaXNmaW5pdGUodikpCi0gICAgICAgICAgICAg
ICAgYnVpbGRlci5hcHBlbmQoIm51bGwiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAg
ICAgICBidWlsZGVyLmFwcGVuZChVU3RyaW5nOjpmcm9tKHYpKTsKLSAgICAgICAgICAgIHJldHVy
biB0cnVlOwotICAgICAgICB9CisgICAgICAgIC8vIEFwcGVuZCB0aGUgc3RyaW5naWZpZWQgdmFs
dWUuCisgICAgICAgIHN0cmluZ2lmeVJlc3VsdCA9IHN0cmluZ2lmaWVyLmFwcGVuZFN0cmluZ2lm
aWVkVmFsdWUoYnVpbGRlciwgdmFsdWUsIG1fb2JqZWN0LCBwcm9wZXJ0eU5hbWUpOworICAgIH0K
IAotICAgICAgICBpZiAodmFsdWUuaXNPYmplY3QoKSkgewotICAgICAgICAgICAgaWYgKGFzT2Jq
ZWN0KHZhbHVlKS0+aW5oZXJpdHMoJkpTQXJyYXk6OmluZm8pKQotICAgICAgICAgICAgICAgIHJl
dHVybiBzdHJpbmdpZnlBcnJheShidWlsZGVyLCBhc0FycmF5KHZhbHVlKSk7Ci0gICAgICAgICAg
ICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KGJ1aWxkZXIsIGFzT2JqZWN0KHZhbHVlKSk7Ci0gICAg
ICAgIH0KKyAgICAvLyBGcm9tIHRoaXMgcG9pbnQgb24sIG5vIGFjY2VzcyB0byB0aGUgdGhpcyBw
b2ludGVyIG9yIHRvIGFueSBtZW1iZXJzLCBiZWNhdXNlIHRoZQorICAgIC8vIEhvbGRlciBvYmpl
Y3QgbWF5IGhhdmUgbW92ZWQgaWYgdGhlIGNhbGwgdG8gc3RyaW5naWZ5IHB1c2hlZCBhIG5ldyBI
b2xkZXIgb250bworICAgIC8vIG1faG9sZGVyU3RhY2suCiAKLSAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIHN3aXRjaCAoc3RyaW5naWZ5UmVzdWx0KSB7CisgICAgICAgIGNhc2UgU3RyaW5naWZ5
RmFpbGVkOgorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIm51bGwiKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIFN0cmluZ2lmeVN1Y2NlZWRlZDoKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIFN0cmluZ2lmeUZhaWxlZER1ZVRvVW5kZWZpbmVkVmFsdWU6Cisg
ICAgICAgICAgICAvLyBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gZ2V0IGFuIHVuZGVmaW5lZCB2YWx1
ZSBmb3IgYW4gb2JqZWN0IHByb3BlcnR5LgorICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdl
IGRvbid0IHdhbnQgdGhlIHNlcGFyYXRvciBhbmQgcHJvcGVydHkgbmFtZSB0aGF0IHdlCisgICAg
ICAgICAgICAvLyBhbHJlYWR5IGFwcGVuZGVkLCBzbyByb2xsIGJhY2suCisgICAgICAgICAgICBi
dWlsZGVyID0gYnVpbGRlci5zdWJzdHIoMCwgcm9sbEJhY2tQb2ludCk7CisgICAgICAgICAgICBi
cmVhazsKICAgICB9Ci0gICAgRXhlY1N0YXRlKiBtX2V4ZWM7Ci0gICAgSlNWYWx1ZSBtX3JlcGxh
Y2VyOwotICAgIFVTdHJpbmcgbV9nYXA7Ci0gICAgVVN0cmluZyBtX2luZGVudDsKLSAgICBIYXNo
U2V0PEpTT2JqZWN0Kj4gbV9vYmplY3RTdGFjazsKLSAgICBQcm9wZXJ0eU5hbWVBcnJheSBtX2Fy
cmF5UmVwbGFjZXJQcm9wZXJ0eU5hbWVzOwotICAgIGJvb2wgbV91c2luZ0FycmF5UmVwbGFjZXI7
Ci0gICAgQ2FsbFR5cGUgbV9yZXBsYWNlckNhbGxUeXBlOwotICAgIENhbGxEYXRhIG1fcmVwbGFj
ZXJDYWxsRGF0YTsKLX07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tIEpTT05PYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KKworY29uc3QgQ2xhc3NJbmZvIEpTT05PYmplY3Q6OmluZm8gPSB7ICJKU09OIiwgMCwg
MCwgRXhlY1N0YXRlOjpqc29uVGFibGUgfTsKKworLyogU291cmNlIGZvciBKU09OT2JqZWN0Lmx1
dC5oCitAYmVnaW4ganNvblRhYmxlCisgIHN0cmluZ2lmeSAgICAgSlNPTlByb3RvRnVuY1N0cmlu
Z2lmeSAgICAgICAgIERvbnRFbnVtfEZ1bmN0aW9uIDEKK0BlbmQKKyovCisKKy8vIEVDTUEgMTUu
OAorCitib29sIEpTT05PYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4ZWMs
IGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQorewor
ICAgIGNvbnN0IEhhc2hFbnRyeSogZW50cnkgPSBFeGVjU3RhdGU6Ompzb25UYWJsZShleGVjKS0+
ZW50cnkoZXhlYywgcHJvcGVydHlOYW1lKTsKKyAgICBpZiAoIWVudHJ5KQorICAgICAgICByZXR1
cm4gSlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChleGVjLCBwcm9wZXJ0eU5hbWUsIHNsb3Qp
OworCisgICAgQVNTRVJUKGVudHJ5LT5hdHRyaWJ1dGVzKCkgJiBGdW5jdGlvbik7CisgICAgc2V0
VXBTdGF0aWNGdW5jdGlvblNsb3QoZXhlYywgZW50cnksIHRoaXMsIHByb3BlcnR5TmFtZSwgc2xv
dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CiAKIC8vIEVDTUEtMjYyIHY1IDE1LjEyLjMKIEpTVmFs
dWUgSlNDX0hPU1RfQ0FMTCBKU09OUHJvdG9GdW5jU3RyaW5naWZ5KEV4ZWNTdGF0ZSogZXhlYywg
SlNPYmplY3QqLCBKU1ZhbHVlLCBjb25zdCBBcmdMaXN0JiBhcmdzKQogewogICAgIGlmIChhcmdz
LmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgR2VuZXJhbEVycm9y
LCAiTm8gaW5wdXQgdG8gc3RyaW5naWZ5Iik7Ci0KICAgICBKU1ZhbHVlIHZhbHVlID0gYXJncy5h
dCgwKTsKICAgICBKU1ZhbHVlIHJlcGxhY2VyID0gYXJncy5hdCgxKTsKICAgICBKU1ZhbHVlIHNw
YWNlID0gYXJncy5hdCgyKTsKLQotICAgIFVTdHJpbmcgZ2FwOwotICAgIGlmIChzcGFjZS5pc09i
amVjdCgpKSB7Ci0gICAgICAgIGlmIChhc09iamVjdChzcGFjZSktPmluaGVyaXRzKCZOdW1iZXJP
YmplY3Q6OmluZm8pIHx8IGFzT2JqZWN0KHNwYWNlKS0+aW5oZXJpdHMoJlN0cmluZ09iamVjdDo6
aW5mbykpCi0gICAgICAgICAgICBzcGFjZSA9IHN0YXRpY19jYXN0PEpTV3JhcHBlck9iamVjdCo+
KGFzT2JqZWN0KHNwYWNlKSktPmludGVybmFsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKHNwYWNl
LmlzTnVtYmVyKCkpIHsKLSAgICAgICAgZG91YmxlIHYgPSBzcGFjZS50b051bWJlcihleGVjKTsK
LSAgICAgICAgaWYgKHYgPiAxMDApCi0gICAgICAgICAgICB2ID0gMTAwOwotICAgICAgICBpZiAo
ISh2ID4gMCkpCi0gICAgICAgICAgICB2ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCB2OyBpKyspCi0gICAgICAgICAgICBnYXAuYXBwZW5kKCcgJyk7Ci0gICAgfSBlbHNlIGlmIChz
cGFjZS5pc1N0cmluZygpKQotICAgICAgICBnYXAgPSBzcGFjZS50b1N0cmluZyhleGVjKTsKLQot
ICAgIFN0cmluZ2lmaWVyIHN0cmluZ2lmaWVyKGV4ZWMsIGFyZ3MuYXQoMSksIGdhcCk7Ci0gICAg
cmV0dXJuIHN0cmluZ2lmaWVyLnN0cmluZ2lmeSh2YWx1ZSk7CisgICAgcmV0dXJuIFN0cmluZ2lm
aWVyKGV4ZWMsIHJlcGxhY2VyLCBzcGFjZSkuc3RyaW5naWZ5KHZhbHVlKTsKIH0KIAogfSAvLyBu
YW1lc3BhY2UgSlNDCg==
</data>
<flag name="review"
          id="16012"
          type_id="1"
          status="-"
          setter="oliver"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31353</attachid>
            <date>2009-06-16 10:06:28 -0700</date>
            <delta_ts>2009-06-17 18:08:22 -0700</delta_ts>
            <desc>work in progress</desc>
            <filename>StringifyPatch.txt</filename>
            <type>text/plain</type>
            <size>42821</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDQ0NzIzKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xICsxLDY0IEBACisyMDA5LTA2LTE2ICBEYXJpbiBBZGxl
ciAgPGRhcmluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBCdWcgMjY0Mjk6IE1ha2UgSlNPTi5zdHJpbmdpZnkgbm9uLXJlY3Vyc2l2
ZSBzbyBpdCBjYW4gaGFuZGxlIG9iamVjdHMgb2YgYXJiaXRyYXJ5IGNvbXBsZXhpdHkKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2NDI5CisKKyAgICAg
ICAgRm9yIG1hcmtpbmcgSSBkZWNpZGVkIG5vdCB0byB1c2UgZ2NQcm90ZWN0LCBiZWNhdXNlIHRo
aXMgaXMgaW5zaWRlIHRoZSBlbmdpbmUKKyAgICAgICAgc28gaXQncyBlYXN5IGVub3VnaCB0byBq
dXN0IGRvIG1hcmtpbmcuIEFuZCB0aGF0IGRhcm5lZCBnY1Byb3RlY3QgZG9lcyBsb2NraW5nIQor
ICAgICAgICBPbGl2ZXIgdHJpZWQgdG8gY29udmluY2UgbWUgdG8gdXNlZCBNYXJrZWRBcmd1bWVu
dEJ1ZmZlciwgYnV0IHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICBmb3IgdGhhdCBjbGFzcyBzYXlz
ICJGSVhNRTogUmVtb3ZlIGFsbCBjbGllbnRzIG9mIHRoaXMgQVBJLCB0aGVuIHJlbW92ZSB0aGlz
IEFQSS4iCisKKyAgICAgICAgKiBydW50aW1lL0NvbGxlY3Rvci5jcHA6CisgICAgICAgIChKU0M6
OkhlYXA6OmNvbGxlY3QpOiBBZGQgYSBjYWxsIHRvIEpTT05PYmplY3Q6Om1hcmtTdHJpbmdpZmll
cnMuCisKKyAgICAgICAgKiBydW50aW1lL0NvbW1vbklkZW50aWZpZXJzLmNwcDoKKyAgICAgICAg
KEpTQzo6Q29tbW9uSWRlbnRpZmllcnM6OkNvbW1vbklkZW50aWZpZXJzKTogQWRkZWQgZW1wdHlJ
ZGVudGlmaWVyLgorICAgICAgICAqIHJ1bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuaDogRGl0dG8u
CisKKyAgICAgICAgKiBydW50aW1lL0pTR2xvYmFsRGF0YS5jcHA6CisgICAgICAgIChKU0M6OkpT
R2xvYmFsRGF0YTo6SlNHbG9iYWxEYXRhKTogSW5pdGlhbGl6ZSBmaXJzdFN0cmluZ2lmaWVyVG9N
YXJrIHRvIDAuCisgICAgICAgICogcnVudGltZS9KU0dsb2JhbERhdGEuaDogQWRkZWQgZmlyc3RT
dHJpbmdpZmllclRvTWFyay4KKworICAgICAgICAqIHJ1bnRpbWUvSlNPTk9iamVjdC5jcHA6IEN1
dCBkb3duIHRoZSBpbmNsdWRlcyB0byB0aGUgbmVlZGVkIG9uZXMgb25seS4KKyAgICAgICAgKEpT
Qzo6dW53cmFwTnVtYmVyT3JTdHJpbmcpOiBBZGRlZC4gSGVscGVyIGZvciB1bndyYXBwaW5nIG51
bWJlciBhbmQgc3RyaW5nCisgICAgICAgIG9iamVjdHMgdG8gZ2V0IHRoZWlyIG51bWJlciBhbmQg
c3RyaW5nIHZhbHVlcy4KKyAgICAgICAgKEpTQzo6UmVwbGFjZXJQcm9wZXJ0eU5hbWU6OlJlcGxh
Y2VyUHJvcGVydHlOYW1lKTogQWRkZWQuIFRoZSBjbGFzcyBpcyB1c2VkCisgICAgICAgIHRvIHdy
YXAgYW4gaWRlbnRpZmllciBvciBpbnRlZ2VyIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IHdv
cmsgdW5sZXNzIHdlCisgICAgICAgIGFjdHVhbGx5IGNhbGwgYSByZXBsYWNlci4KKyAgICAgICAg
KEpTQzo6UmVwbGFjZXJQcm9wZXJ0eU5hbWU6OnZhbHVlKTogQWRkZWQuCisgICAgICAgIChKU0M6
OmdhcCk6IEFkZGVkLiBIZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBTdHJpbmdpZmllciBjb25zdHJ1
Y3Rvci4KKyAgICAgICAgKEpTQzo6UHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsOjpQcm9wZXJ0
eU5hbWVGb3JGdW5jdGlvbkNhbGwpOiBBZGRlZC4KKyAgICAgICAgVGhlIGNsYXNzIGlzIHVzZWQg
dG8gd3JhcCBhbiBpZGVudGlmaWVyIG9yIGludGVnZXIgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAg
ICAgICBhbGxvY2F0ZSBhIG51bWJlciBvciBzdHJpbmcgdW50aWwgd2UgYWN0dWFsbHkgY2FsbCB0
b0pTT04gb3IgYSByZXBsYWNlci4KKyAgICAgICAgKEpTQzo6UHJvcGVydHlOYW1lRm9yRnVuY3Rp
b25DYWxsOjphc0pTVmFsdWUpOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OlN0
cmluZ2lmaWVyKTogVXBkYXRlZCBhbmQgbW92ZWQgb3V0IG9mIHRoZSBjbGFzcworICAgICAgICBk
ZWZpbml0aW9uLiBBZGRlZCBjb2RlIHRvIGhvb2sgdGhpcyBpbnRvIGEgc2luZ2x5IGxpbmtlZCBs
aXN0IGZvciBtYXJraW5nLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6flN0cmluZ2lmaWVy
KTogUmVtb3ZlIGZyb20gdGhlIHNpbmdseSBsaW5rZWQgbGlzdC4KKyAgICAgICAgKEpTQzo6U3Ry
aW5naWZpZXI6Om1hcmspOiBNYXJrIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgaG9sZGVyIHN0YWNr
cy4KKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OnN0cmluZ2lmeSk6IFVwZGF0ZWQuCisgICAg
ICAgIChKU0M6OlN0cmluZ2lmaWVyOjphcHBlbmRRdW90ZWRTdHJpbmcpOiBUd2Vha2VkIGFuZCBz
dHJlYW1saW5lZCBhIGJpdC4KKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OnRvSlNPTik6IFJl
bmFtZWQgZnJvbSB0b0pTT05WYWx1ZS4KKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OmFwcGVu
ZFN0cmluZ2lmaWVkVmFsdWUpOiBSZW5hbWVkIGZyb20gc3RyaW5naWZ5LgorICAgICAgICBBZGRl
ZCBjb2RlIHRvIHVzZSB0aGUgbV9ob2xkZXJTdGFjayB0byBkbyBub24tcmVjdXJzaXZlIHN0cmlu
Z2lmeSBvZgorICAgICAgICBvYmplY3RzIGFuZCBhcnJheXMuIFRoaXMgY29kZSBhbHNvIHVzZXMg
dGhlIHRpbWVvdXQgY2hlY2tlciBzaW5jZSBpbgorICAgICAgICBwYXRob2xvZ2ljYWwgY2FzZXMg
aXQgY291bGQgYmUgc2xvdyBldmVuIHdpdGhvdXQgY2FsbGluZyBpbnRvIHRoZQorICAgICAgICBK
YXZhU2NyaXB0IHZpcnR1YWwgbWFjaGluZS4KKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6Ondp
bGxJbmRlbnQpOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OmluZGVudCk6IEFk
ZGVkLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6dW5pbmRlbnQpOiBBZGRlZC4KKyAgICAg
ICAgKEpTQzo6U3RyaW5naWZpZXI6OnN0YXJ0TmV3TGluZSk6IEFkZGVkLgorICAgICAgICAoSlND
OjpTdHJpbmdpZmllcjo6SG9sZGVyOjpIb2xkZXIpOiBBZGRlZC4KKyAgICAgICAgKEpTQzo6U3Ry
aW5naWZpZXI6OkhvbGRlcjo6YXBwZW5kTmV4dFByb3BlcnR5KTogQWRkZWQuIFRoaXMgaXMgdGhl
CisgICAgICAgIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgZm9ybWF0IG9mIGFycmF5cyBhbmQg
b2JqZWN0cy4KKyAgICAgICAgKEpTQzo6SlNPTk9iamVjdDo6Z2V0T3duUHJvcGVydHlTbG90KTog
TW92ZWQgdGhpcyBkb3duIHRvIHRoZSBib3R0b20KKyAgICAgICAgb2YgdGhlIGZpbGUgc28gdGhl
IEpTT05PYmplY3QgY2xhc3MgaXMgbm90IGludGVybGVhdmVkIHdpdGggdGhlCisgICAgICAgIFN0
cmluZ2lmaWVyIGNsYXNzLgorICAgICAgICAoSlNDOjpKU09OT2JqZWN0OjptYXJrU3RyaW5naWZp
ZXJzKTogQWRkZWQuIENhbGxzIG1hcmsuCisgICAgICAgIChKU0M6OkpTT05Qcm90b0Z1bmNTdHJp
bmdpZnkpOiBTdHJlYW1saW5lZCB0aGUgY29kZSBoZXJlLiBUaGUgY29kZQorICAgICAgICB0byBj
b21wdXRlIHRoZSBnYXAgc3RyaW5nIGlzIG5vdyBhIHNlcGFyYXRlIGZ1bmN0aW9uLgorCisgICAg
ICAgICogcnVudGltZS9KU09OT2JqZWN0Lmg6IE1hZGUgZXZlcnl0aGluZyBwcml2YXRlLiBBZGRl
ZCBtYXJrU3RyaW5naWZpZXJzLgorCiA9PSBSb2xsZWQgb3ZlciB0byBDaGFuZ2VMb2ctMjAwOS0w
Ni0xNiA9PQpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db2xsZWN0b3IuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29sbGVjdG9yLmNwcAkocmV2aXNpb24g
NDQ3MjMpCisrKyBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbGxlY3Rvci5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJJbnRlcnByZXRlci5oIgogI2luY2x1
ZGUgIkpTR2xvYmFsT2JqZWN0LmgiCiAjaW5jbHVkZSAiSlNMb2NrLmgiCisjaW5jbHVkZSAiSlNP
Tk9iamVjdC5oIgogI2luY2x1ZGUgIkpTU3RyaW5nLmgiCiAjaW5jbHVkZSAiSlNWYWx1ZS5oIgog
I2luY2x1ZGUgIk5vZGVzLmgiCkBAIC05OTEsNiArOTkyLDggQEAgYm9vbCBIZWFwOjpjb2xsZWN0
KCkKICAgICBtX2dsb2JhbERhdGEtPnNtYWxsU3RyaW5ncy5tYXJrKCk7CiAgICAgaWYgKG1fZ2xv
YmFsRGF0YS0+c2NvcGVOb2RlQmVpbmdSZXBhcnNlZCkKICAgICAgICAgbV9nbG9iYWxEYXRhLT5z
Y29wZU5vZGVCZWluZ1JlcGFyc2VkLT5tYXJrKCk7CisgICAgaWYgKG1fZ2xvYmFsRGF0YS0+Zmly
c3RTdHJpbmdpZmllclRvTWFyaykKKyAgICAgICAgSlNPTk9iamVjdDo6bWFya1N0cmluZ2lmaWVy
cyhtX2dsb2JhbERhdGEtPmZpcnN0U3RyaW5naWZpZXJUb01hcmspOwogCiAgICAgSkFWQVNDUklQ
VENPUkVfR0NfTUFSS0VEKCk7CiAKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29tbW9u
SWRlbnRpZmllcnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29t
bW9uSWRlbnRpZmllcnMuY3BwCShyZXZpc2lvbiA0NDcyMykKKysrIEphdmFTY3JpcHRDb3JlL3J1
bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBA
QAogLyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogIENvcHlyaWdodCAoQykgMjAwMywgMjAwNywgMjAwOSBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjMsMTIgKzIz
LDEzIEBACiAKIG5hbWVzcGFjZSBKU0MgewogCi1jb25zdCBjaGFyKiBjb25zdCBudWxsQ1N0cmlu
ZyA9IDA7CitzdGF0aWMgY29uc3QgY2hhciogY29uc3QgbnVsbENTdHJpbmcgPSAwOwogCiAjZGVm
aW5lIElOSVRJQUxJWkVfUFJPUEVSVFlfTkFNRShuYW1lKSAsIG5hbWUoZ2xvYmFsRGF0YSwgI25h
bWUpCiAKIENvbW1vbklkZW50aWZpZXJzOjpDb21tb25JZGVudGlmaWVycyhKU0dsb2JhbERhdGEq
IGdsb2JhbERhdGEpCiAgICAgOiBudWxsSWRlbnRpZmllcihnbG9iYWxEYXRhLCBudWxsQ1N0cmlu
ZykKKyAgICAsIGVtcHR5SWRlbnRpZmllcihnbG9iYWxEYXRhLCAiIikKICAgICAsIHVuZGVyc2Nv
cmVQcm90byhnbG9iYWxEYXRhLCAiX19wcm90b19fIikKICAgICAsIHRoaXNJZGVudGlmaWVyKGds
b2JhbERhdGEsICJ0aGlzIikKICAgICBKU0NfQ09NTU9OX0lERU5USUZJRVJTX0VBQ0hfUFJPUEVS
VFlfTkFNRShJTklUSUFMSVpFX1BST1BFUlRZX05BTUUpCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0NvbW1vbklkZW50aWZpZXJzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUv
cnVudGltZS9Db21tb25JZGVudGlmaWVycy5oCShyZXZpc2lvbiA0NDcyMykKKysrIEphdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLDIwMDcgQXBwbGUgQ29tcHV0ZXIs
IEluYworICogIENvcHlyaWdodCAoQykgMjAwMywgMjAwNywgMjAwOSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCiAgKgogICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtNzYsNiArNzYsNyBAQCBu
YW1lc3BhY2UgSlNDIHsKIAogICAgIHB1YmxpYzoKICAgICAgICAgY29uc3QgSWRlbnRpZmllciBu
dWxsSWRlbnRpZmllcjsKKyAgICAgICAgY29uc3QgSWRlbnRpZmllciBlbXB0eUlkZW50aWZpZXI7
CiAgICAgICAgIGNvbnN0IElkZW50aWZpZXIgdW5kZXJzY29yZVByb3RvOwogICAgICAgICBjb25z
dCBJZGVudGlmaWVyIHRoaXNJZGVudGlmaWVyOwogCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0pTR2xvYmFsRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9KU0dsb2JhbERhdGEuY3BwCShyZXZpc2lvbiA0NDcyMykKKysrIEphdmFTY3JpcHRDb3JlL3J1
bnRpbWUvSlNHbG9iYWxEYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTM5LDYgKzEzOSw3IEBA
IEpTR2xvYmFsRGF0YTo6SlNHbG9iYWxEYXRhKGJvb2wgaXNTaGFyZWQKICAgICAsIGhlYWQoMCkK
ICAgICAsIGR5bmFtaWNHbG9iYWxPYmplY3QoMCkKICAgICAsIHNjb3BlTm9kZUJlaW5nUmVwYXJz
ZWQoMCkKKyAgICAsIGZpcnN0U3RyaW5naWZpZXJUb01hcmsoMCkKIHsKICNpZiBQTEFURk9STShN
QUMpCiAgICAgc3RhcnRQcm9maWxlclNlcnZlcklmTmVlZGVkKCk7CkluZGV4OiBKYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0pTR2xvYmFsRGF0YS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvSlNHbG9iYWxEYXRhLmgJKHJldmlzaW9uIDQ0NzIzKQorKysgSmF2YVNjcmlwdENv
cmUvcnVudGltZS9KU0dsb2JhbERhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtNTQsOCArNTQsMTAg
QEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgY2xhc3MgTGV4ZXI7CiAgICAgY2xhc3MgUGFyc2VyOwog
ICAgIGNsYXNzIFNjb3BlTm9kZTsKKyAgICBjbGFzcyBTdHJpbmdpZmllcjsKICAgICBjbGFzcyBT
dHJ1Y3R1cmU7CiAgICAgY2xhc3MgVVN0cmluZzsKKwogICAgIHN0cnVjdCBIYXNoVGFibGU7CiAg
ICAgc3RydWN0IFZQdHJTZXQ7CiAKQEAgLTE0Niw2ICsxNDgsNyBAQCBuYW1lc3BhY2UgSlNDIHsK
ICAgICAgICAgSGFzaFNldDxKU09iamVjdCo+IGFycmF5VmlzaXRlZEVsZW1lbnRzOwogCiAgICAg
ICAgIFNjb3BlTm9kZSogc2NvcGVOb2RlQmVpbmdSZXBhcnNlZDsKKyAgICAgICAgU3RyaW5naWZp
ZXIqIGZpcnN0U3RyaW5naWZpZXJUb01hcms7CiAKICAgICBwcml2YXRlOgogICAgICAgICBKU0ds
b2JhbERhdGEoYm9vbCBpc1NoYXJlZCwgY29uc3QgVlB0clNldCYpOwpJbmRleDogSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU09OT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0pTT05PYmplY3QuY3BwCShyZXZpc2lvbiA0NDcyMykKKysrIEphdmFTY3JpcHRD
b3JlL3J1bnRpbWUvSlNPTk9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDIwICsyNiwx
MiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkpTT05PYmplY3QuaCIKIAorI2lu
Y2x1ZGUgIkVycm9yLmgiCiAjaW5jbHVkZSAiRXhjZXB0aW9uSGVscGVycy5oIgogI2luY2x1ZGUg
IkpTQXJyYXkuaCIKLSNpbmNsdWRlICJKU0Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiTGl0ZXJhbFBh
cnNlci5oIgotI2luY2x1ZGUgIk5vZGVzLmgiCiAjaW5jbHVkZSAiUHJvcGVydHlOYW1lQXJyYXku
aCIKLQotI2luY2x1ZGUgIk9iamVjdFByb3RvdHlwZS5oIgotI2luY2x1ZGUgIk9wZXJhdGlvbnMu
aCIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KICNpbmNs
dWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCi0KIG5hbWVzcGFjZSBKU0MgewogCiBBU1NFUlRfQ0xB
U1NfRklUU19JTl9DRUxMKEpTT05PYmplY3QpOwpAQCAtNTIsNDQ3ICs0NCw1NTUgQEAgc3RhdGlj
IEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBKU09OUHJvdG9GdQogCiBuYW1lc3BhY2UgSlNDIHsKIAot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEpTT05PYmplY3QgLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbCBvYmpl
Y3RzIG11c3QgYmUgb24gdGhlIHN0YWNrLCBzaW5jZSB0aGUgSlNWYWx1ZSB0aGF0IHRoZXkgY3Jl
YXRlIGlzIG5vdCBtYXJrZWQuCitjbGFzcyBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwgewor
cHVibGljOgorICAgIFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbChjb25zdCBJZGVudGlmaWVy
Jik7CisgICAgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsKHVuc2lnbmVkKTsKIAotY29uc3Qg
Q2xhc3NJbmZvIEpTT05PYmplY3Q6OmluZm8gPSB7ICJKU09OIiwgMCwgMCwgRXhlY1N0YXRlOjpq
c29uVGFibGUgfTsKKyAgICBKU1ZhbHVlIHZhbHVlKEV4ZWNTdGF0ZSopIGNvbnN0OwogCi0vKiBT
b3VyY2UgZm9yIEpTT05PYmplY3QubHV0LmgKLUBiZWdpbiBqc29uVGFibGUKLSAgc3RyaW5naWZ5
ICAgICBKU09OUHJvdG9GdW5jU3RyaW5naWZ5ICAgICAgICAgRG9udEVudW18RnVuY3Rpb24gMQot
QGVuZAotKi8KK3ByaXZhdGU6CisgICAgY29uc3QgSWRlbnRpZmllciogbV9pZGVudGlmaWVyOwor
ICAgIHVuc2lnbmVkIG1fbnVtYmVyOworICAgIG11dGFibGUgSlNWYWx1ZSBtX3ZhbHVlOworfTsK
IAotLy8gRUNNQSAxNS44CitjbGFzcyBTdHJpbmdpZmllciA6IE5vbmNvcHlhYmxlIHsKK3B1Ymxp
YzoKKyAgICBTdHJpbmdpZmllcihFeGVjU3RhdGUqLCBKU1ZhbHVlIHJlcGxhY2VyLCBKU1ZhbHVl
IHNwYWNlKTsKKyAgICB+U3RyaW5naWZpZXIoKTsKKyAgICBKU1ZhbHVlIHN0cmluZ2lmeShKU1Zh
bHVlKTsKIAotYm9vbCBKU09OT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRlKiBl
eGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xvdCkK
LXsKLSAgICBjb25zdCBIYXNoRW50cnkqIGVudHJ5ID0gRXhlY1N0YXRlOjpqc29uVGFibGUoZXhl
YyktPmVudHJ5KGV4ZWMsIHByb3BlcnR5TmFtZSk7CisgICAgdm9pZCBtYXJrKCk7CiAKLSAgICBp
ZiAoIWVudHJ5KQotICAgICAgICByZXR1cm4gSlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChl
eGVjLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOworcHJpdmF0ZToKKyAgICB0eXBlZGVmIFVTdHJpbmcg
U3RyaW5nQnVpbGRlcjsKIAotICAgIEFTU0VSVChlbnRyeS0+YXR0cmlidXRlcygpICYgRnVuY3Rp
b24pOwotICAgIHNldFVwU3RhdGljRnVuY3Rpb25TbG90KGV4ZWMsIGVudHJ5LCB0aGlzLCBwcm9w
ZXJ0eU5hbWUsIHNsb3QpOwotICAgIHJldHVybiB0cnVlOworICAgIGNsYXNzIEhvbGRlciB7Cisg
ICAgcHVibGljOgorICAgICAgICBIb2xkZXIoSlNPYmplY3QqKTsKKworICAgICAgICBKU09iamVj
dCogb2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3Q7IH0KKworICAgICAgICBib29sIGFw
cGVuZE5leHRQcm9wZXJ0eShTdHJpbmdpZmllciYsIFN0cmluZ0J1aWxkZXImKTsKKworICAgIHBy
aXZhdGU6CisgICAgICAgIEpTT2JqZWN0KiBjb25zdCBtX29iamVjdDsKKyAgICAgICAgY29uc3Qg
Ym9vbCBtX2lzQXJyYXk7CisgICAgICAgIGJvb2wgbV9pc0pTQXJyYXk7CisgICAgICAgIHVuc2ln
bmVkIG1faW5kZXg7CisgICAgICAgIHVuc2lnbmVkIG1fc2l6ZTsKKyAgICAgICAgUmVmUHRyPFBy
b3BlcnR5TmFtZUFycmF5RGF0YT4gbV9wcm9wZXJ0eU5hbWVzOworICAgIH07CisKKyAgICBmcmll
bmQgY2xhc3MgSG9sZGVyOworCisgICAgc3RhdGljIHZvaWQgYXBwZW5kUXVvdGVkU3RyaW5nKFN0
cmluZ0J1aWxkZXImLCBjb25zdCBVU3RyaW5nJik7CisKKyAgICBKU1ZhbHVlIHRvSlNPTihKU1Zh
bHVlLCBjb25zdCBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwmKTsKKworICAgIGVudW0gU3Ry
aW5naWZ5UmVzdWx0IHsgU3RyaW5naWZ5RmFpbGVkLCBTdHJpbmdpZnlTdWNjZWVkZWQsIFN0cmlu
Z2lmeUZhaWxlZER1ZVRvVW5kZWZpbmVkVmFsdWUgfTsKKyAgICBTdHJpbmdpZnlSZXN1bHQgYXBw
ZW5kU3RyaW5naWZpZWRWYWx1ZShTdHJpbmdCdWlsZGVyJiwgSlNWYWx1ZSwgSlNPYmplY3QqIGhv
bGRlciwgY29uc3QgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsJik7CisKKyAgICBib29sIHdp
bGxJbmRlbnQoKSBjb25zdDsKKyAgICB2b2lkIGluZGVudCgpOworICAgIHZvaWQgdW5pbmRlbnQo
KTsKKyAgICB2b2lkIHN0YXJ0TmV3TGluZShTdHJpbmdCdWlsZGVyJikgY29uc3Q7CisKKyAgICBT
dHJpbmdpZmllciogY29uc3QgbV9uZXh0U3RyaW5naWZpZXJUb01hcms7CisgICAgRXhlY1N0YXRl
KiBjb25zdCBtX2V4ZWM7CisgICAgY29uc3QgSlNWYWx1ZSBtX3JlcGxhY2VyOworICAgIGJvb2wg
bV91c2luZ0FycmF5UmVwbGFjZXI7CisgICAgUHJvcGVydHlOYW1lQXJyYXkgbV9hcnJheVJlcGxh
Y2VyUHJvcGVydHlOYW1lczsKKyAgICBDYWxsVHlwZSBtX3JlcGxhY2VyQ2FsbFR5cGU7CisgICAg
Q2FsbERhdGEgbV9yZXBsYWNlckNhbGxEYXRhOworICAgIGNvbnN0IFVTdHJpbmcgbV9nYXA7CisK
KyAgICBIYXNoU2V0PEpTT2JqZWN0Kj4gbV9ob2xkZXJDeWNsZURldGVjdG9yOworICAgIFZlY3Rv
cjxIb2xkZXIsIDE2PiBtX2hvbGRlclN0YWNrOworICAgIFVTdHJpbmcgbV9yZXBlYXRlZEdhcDsK
KyAgICBVU3RyaW5nIG1faW5kZW50OworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIGhlbHBlciBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
Kworc3RhdGljIGlubGluZSBKU1ZhbHVlIHVud3JhcE51bWJlck9yU3RyaW5nKEpTVmFsdWUgdmFs
dWUpCit7CisgICAgaWYgKCF2YWx1ZS5pc09iamVjdCgpKQorICAgICAgICByZXR1cm4gdmFsdWU7
CisgICAgaWYgKCFhc09iamVjdCh2YWx1ZSktPmluaGVyaXRzKCZOdW1iZXJPYmplY3Q6OmluZm8p
ICYmICFhc09iamVjdCh2YWx1ZSktPmluaGVyaXRzKCZTdHJpbmdPYmplY3Q6OmluZm8pKQorICAg
ICAgICByZXR1cm4gdmFsdWU7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEpTV3JhcHBlck9iamVj
dCo+KGFzT2JqZWN0KHZhbHVlKSktPmludGVybmFsVmFsdWUoKTsKIH0KIAotY2xhc3MgU3RyaW5n
aWZpZXIgewotICAgIHR5cGVkZWYgVVN0cmluZyBTdHJpbmdCdWlsZGVyOwotICAgIC8vIDxodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjYyNzY+IGFyYml0cmFyeSBsaW1p
dHMgZm9yIHJlY3Vyc2lvbgotICAgIC8vIGFyZSBiYWQKLSAgICBlbnVtIHsgTWF4T2JqZWN0RGVw
dGggPSA1MTIgfTsKLXB1YmxpYzoKLSAgICBTdHJpbmdpZmllcihFeGVjU3RhdGUqIGV4ZWMsIEpT
VmFsdWUgcmVwbGFjZXIsIGNvbnN0IFVTdHJpbmcmIGdhcCkKLSAgICAgICAgOiBtX2V4ZWMoZXhl
YykKLSAgICAgICAgLCBtX3JlcGxhY2VyKHJlcGxhY2VyKQotICAgICAgICAsIG1fZ2FwKGdhcCkK
LSAgICAgICAgLCBtX2FycmF5UmVwbGFjZXJQcm9wZXJ0eU5hbWVzKGV4ZWMpCi0gICAgICAgICwg
bV91c2luZ0FycmF5UmVwbGFjZXIoZmFsc2UpCi0gICAgICAgICwgbV9yZXBsYWNlckNhbGxUeXBl
KENhbGxUeXBlTm9uZSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3JlcGxhY2VyLmlzT2JqZWN0KCkp
IHsKLSAgICAgICAgICAgIGlmIChhc09iamVjdChtX3JlcGxhY2VyKS0+aW5oZXJpdHMoJkpTQXJy
YXk6OmluZm8pKSB7Ci0gICAgICAgICAgICAgICAgSlNPYmplY3QqIGFycmF5ID0gYXNPYmplY3Qo
bV9yZXBsYWNlcik7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc1JlYWxKU0FycmF5ID0gaXNKU0Fy
cmF5KCZtX2V4ZWMtPmdsb2JhbERhdGEoKSwgbV9yZXBsYWNlcik7Ci0gICAgICAgICAgICAgICAg
dW5zaWduZWQgbGVuZ3RoID0gYXJyYXktPmdldChtX2V4ZWMsIG1fZXhlYy0+Z2xvYmFsRGF0YSgp
LnByb3BlcnR5TmFtZXMtPmxlbmd0aCkudG9VSW50MzIobV9leGVjKTsKLSAgICAgICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAg
ICAgICAgSlNWYWx1ZSBuYW1lOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZWFsSlNBcnJh
eSAmJiBhc0FycmF5KGFycmF5KS0+Y2FuR2V0SW5kZXgoaSkpCi0gICAgICAgICAgICAgICAgICAg
ICAgICBuYW1lID0gYXNBcnJheShhcnJheSktPmdldEluZGV4KGkpOwotICAgICAgICAgICAgICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBhcnJheS0+Z2V0KG1f
ZXhlYywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9u
KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmlzU3RyaW5nKCkpCi0gICAgICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICBVU3RyaW5n
IHByb3BlcnR5TmFtZSA9IG5hbWUudG9TdHJpbmcobV9leGVjKTsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgICAgICAgICAgICBtX2FycmF5UmVwbGFjZXJQcm9wZXJ0eU5hbWVzLmFk
ZChJZGVudGlmaWVyKG1fZXhlYywgcHJvcGVydHlOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIG1fdXNpbmdBcnJheVJlcGxhY2VyID0gdHJ1ZTsKLSAgICAgICAgICAg
IH0gZWxzZQotICAgICAgICAgICAgICAgIG1fcmVwbGFjZXJDYWxsVHlwZSA9IGFzT2JqZWN0KG1f
cmVwbGFjZXIpLT5nZXRDYWxsRGF0YShtX3JlcGxhY2VyQ2FsbERhdGEpOwotICAgICAgICB9Citz
dGF0aWMgaW5saW5lIFVTdHJpbmcgZ2FwKEpTVmFsdWUgc3BhY2UpCit7CisgICAgc3BhY2UgPSB1
bndyYXBOdW1iZXJPclN0cmluZyhzcGFjZSk7CisKKyAgICAvLyBJZiB0aGUgc3BhY2UgdmFsdWUg
aXMgYSBudW1iZXIsIGNyZWF0ZSBhIGdhcCBzdHJpbmcgd2l0aCB0aGF0IG51bWJlciBvZiBzcGFj
ZXMuCisgICAgZG91YmxlIHNwYWNlQ291bnQ7CisgICAgaWYgKHNwYWNlLmdldE51bWJlcihzcGFj
ZUNvdW50KSkgeworICAgICAgICBjb25zdCBpbnQgbWF4U3BhY2VDb3VudCA9IDEwMDsKKyAgICAg
ICAgaW50IGNvdW50OworICAgICAgICBpZiAoc3BhY2VDb3VudCA+IG1heFNwYWNlQ291bnQpCisg
ICAgICAgICAgICBjb3VudCA9IG1heFNwYWNlQ291bnQ7CisgICAgICAgIGVsc2UgaWYgKCEoc3Bh
Y2VDb3VudCA+IDApKQorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBjb3VudCA9IHN0YXRpY19jYXN0PGludD4oc3BhY2VDb3VudCk7CisgICAgICAgIFVD
aGFyIHNwYWNlc1ttYXhTcGFjZUNvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBj
b3VudDsgKytpKQorICAgICAgICAgICAgc3BhY2VzW2ldID0gJyAnOworICAgICAgICByZXR1cm4g
VVN0cmluZyhzcGFjZXMsIGNvdW50KTsKICAgICB9CiAKLSAgICBKU1ZhbHVlIHN0cmluZ2lmeShK
U1ZhbHVlIHZhbHVlKQotICAgIHsKLSAgICAgICAgSlNPYmplY3QqIG9iaiA9IGNvbnN0cnVjdEVt
cHR5T2JqZWN0KG1fZXhlYyk7Ci0gICAgICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQot
ICAgICAgICAgICAgcmV0dXJuIGpzTnVsbCgpOworICAgIC8vIElmIHRoZSBzcGFjZSB2YWx1ZSBp
cyBhIHN0cmluZywgdXNlIGl0IGFzIHRoZSBnYXAgc3RyaW5nLCBvdGhlcndpc2UgdXNlIG5vIGdh
cCBzdHJpbmcuCisgICAgcmV0dXJuIHNwYWNlLmdldFN0cmluZygpOworfQogCi0gICAgICAgIElk
ZW50aWZpZXIgZW1wdHlJZGVudChtX2V4ZWMsICIiKTsKLSAgICAgICAgb2JqLT5wdXREaXJlY3Qo
ZW1wdHlJZGVudCwgdmFsdWUpOwotICAgICAgICBTdHJpbmdLZXlHZW5lcmF0b3Iga2V5KGVtcHR5
SWRlbnQpOwotICAgICAgICB2YWx1ZSA9IHRvSlNPTlZhbHVlKGtleSwgdmFsdWUpOwotICAgICAg
ICBpZiAobV9leGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgIHJldHVybiBqc051bGwo
KTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlcjsKLSAgICAgICAgaWYg
KCFzdHJpbmdpZnkoYnVpbGRlciwgb2JqLCBrZXksIHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3Bl
cnR5TmFtZUZvckZ1bmN0aW9uQ2FsbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog
Ci0gICAgICAgIHJldHVybiAobV9leGVjLT5oYWRFeGNlcHRpb24oKSk/IG1fZXhlYy0+ZXhjZXB0
aW9uKCkgOiBqc1N0cmluZyhtX2V4ZWMsIGJ1aWxkZXIpOworaW5saW5lIFByb3BlcnR5TmFtZUZv
ckZ1bmN0aW9uQ2FsbDo6UHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsKGNvbnN0IElkZW50aWZp
ZXImIGlkZW50aWZpZXIpCisgICAgOiBtX2lkZW50aWZpZXIoJmlkZW50aWZpZXIpCit7Cit9CisK
K2lubGluZSBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGw6OlByb3BlcnR5TmFtZUZvckZ1bmN0
aW9uQ2FsbCh1bnNpZ25lZCBudW1iZXIpCisgICAgOiBtX2lkZW50aWZpZXIoMCkKKyAgICAsIG1f
bnVtYmVyKG51bWJlcikKK3sKK30KKworSlNWYWx1ZSBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNh
bGw6OnZhbHVlKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QKK3sKKyAgICBpZiAoIW1fdmFsdWUpIHsK
KyAgICAgICAgaWYgKG1faWRlbnRpZmllcikKKyAgICAgICAgICAgIG1fdmFsdWUgPSBqc1N0cmlu
ZyhleGVjLCBtX2lkZW50aWZpZXItPnVzdHJpbmcoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIG1fdmFsdWUgPSBqc051bWJlcihleGVjLCBtX251bWJlcik7CiAgICAgfQorICAgIHJldHVy
biBtX3ZhbHVlOworfQogCi1wcml2YXRlOgotICAgIHZvaWQgYXBwZW5kU3RyaW5nKFN0cmluZ0J1
aWxkZXImIGJ1aWxkZXIsIGNvbnN0IFVTdHJpbmcmIHZhbHVlKQotICAgIHsKLSAgICAgICAgaW50
IGxlbmd0aCA9IHZhbHVlLnNpemUoKTsKLSAgICAgICAgY29uc3QgVUNoYXIqIGRhdGEgPSB2YWx1
ZS5kYXRhKCk7Ci0gICAgICAgIGJ1aWxkZXIucmVzZXJ2ZUNhcGFjaXR5KGJ1aWxkZXIuc2l6ZSgp
ICsgbGVuZ3RoICsgMiArIDgpOyAvLyArMiBmb3IgIidzICs4IGZvciBhIGJ1ZmZlcgotICAgICAg
ICBidWlsZGVyLmFwcGVuZCgnXCInKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAg
d2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBpbmRleDsK
LSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiAoZGF0YVtpbmRleF0gPiAweDFm
ICYmIGRhdGFbaW5kZXhdICE9ICciJyAmJiBkYXRhW2luZGV4XSAhPSAnXFwnKSkKLSAgICAgICAg
ICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZGF0YSArIHN0YXJ0
LCBpbmRleCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCkgewotICAg
ICAgICAgICAgICAgIHN3aXRjaChkYXRhW2luZGV4XSl7Ci0gICAgICAgICAgICAgICAgICAgIGNh
c2UgJ1x0JzogewotICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgdGFiW10gPSB7J1xcJywn
dCd9OwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodGFiLCAyKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzogewotICAgICAgICAgICAgICAgICAgICAgICAgVUNo
YXIgY3JbXSA9IHsnXFwnLCdyJ307Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFw
cGVuZChjciwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6IHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIFVDaGFyIG5sW10gPSB7J1xcJywnbid9OwotICAgICAgICAgICAgICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQobmwsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXGYn
OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciB0YWJbXSA9IHsnXFwnLCdmJ307IAot
ICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodGFiLCAyKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgICAgIGNhc2UgJ1xiJzogewotICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYnNb
XSA9IHsnXFwnLCdiJ307Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChi
cywgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6IHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIFVDaGFyIHF1b3RlW10gPSB7J1xcJywnIid9OwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnVpbGRlci5hcHBlbmQocXVvdGUsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwn
OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBzbGFzaFtdID0geydcXCcsICdcXCd9
OwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoc2xhc2gsIDIpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCA9
IChpbnQpZGF0YVtpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qg
Y2hhciogaGV4U3RyID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotICAgICAgICAgICAgICAgICAgICAg
ICAgVUNoYXIgb2N0W10gPSB7J1xcJywgJ3UnLCBoZXhTdHJbKGNoID4+IDEyKSAmIDE1XSwgaGV4
U3RyWyhjaCA+PiA4KSAmIDE1XSwgaGV4U3RyWyhjaCA+PiA0KSAmIDE1XSwgaGV4U3RyWyhjaCA+
PiAwKSAmIDE1XX07Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChvY3Qs
IHNpemVvZihvY3QpIC8gc2l6ZW9mKFVDaGFyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAg
ICAgICAgIH0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdHJpbmdpZmllciAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTdHJpbmdpZmllcjo6U3RyaW5naWZp
ZXIoRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIHJlcGxhY2VyLCBKU1ZhbHVlIHNwYWNlKQorICAg
IDogbV9uZXh0U3RyaW5naWZpZXJUb01hcmsoZXhlYy0+Z2xvYmFsRGF0YSgpLmZpcnN0U3RyaW5n
aWZpZXJUb01hcmspCisgICAgLCBtX2V4ZWMoZXhlYykKKyAgICAsIG1fcmVwbGFjZXIocmVwbGFj
ZXIpCisgICAgLCBtX3VzaW5nQXJyYXlSZXBsYWNlcihmYWxzZSkKKyAgICAsIG1fYXJyYXlSZXBs
YWNlclByb3BlcnR5TmFtZXMoZXhlYykKKyAgICAsIG1fcmVwbGFjZXJDYWxsVHlwZShDYWxsVHlw
ZU5vbmUpCisgICAgLCBtX2dhcChnYXAoc3BhY2UpKQoreworICAgIGV4ZWMtPmdsb2JhbERhdGEo
KS5maXJzdFN0cmluZ2lmaWVyVG9NYXJrID0gdGhpczsKKworICAgIGlmICghbV9yZXBsYWNlci5p
c09iamVjdCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoYXNPYmplY3QobV9yZXBsYWNl
ciktPmluaGVyaXRzKCZKU0FycmF5OjppbmZvKSkgeworICAgICAgICBtX3VzaW5nQXJyYXlSZXBs
YWNlciA9IHRydWU7CisgICAgICAgIEpTT2JqZWN0KiBhcnJheSA9IGFzT2JqZWN0KG1fcmVwbGFj
ZXIpOworICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBhcnJheS0+Z2V0KGV4ZWMsIGV4ZWMtPmds
b2JhbERhdGEoKS5wcm9wZXJ0eU5hbWVzLT5sZW5ndGgpLnRvVUludDMyKGV4ZWMpOworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIEpT
VmFsdWUgbmFtZSA9IGFycmF5LT5nZXQoZXhlYywgaSk7CisgICAgICAgICAgICBpZiAoZXhlYy0+
aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBVU3Ry
aW5nIHByb3BlcnR5TmFtZTsKKyAgICAgICAgICAgIGlmICghbmFtZS5nZXRTdHJpbmcocHJvcGVy
dHlOYW1lKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChleGVj
LT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBt
X2FycmF5UmVwbGFjZXJQcm9wZXJ0eU5hbWVzLmFkZChJZGVudGlmaWVyKGV4ZWMsIHByb3BlcnR5
TmFtZSkpOwogICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdcIicpOworICAgICAg
ICByZXR1cm47CiAgICAgfQogCi0gICAgY2xhc3MgU3RyaW5nS2V5R2VuZXJhdG9yIHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIFN0cmluZ0tleUdlbmVyYXRvcihjb25zdCBJZGVudGlmaWVyJiBwcm9w
ZXJ0eSkKLSAgICAgICAgICAgIDogbV9wcm9wZXJ0eShwcm9wZXJ0eSkKLSAgICAgICAgewotICAg
ICAgICB9Ci0gICAgICAgIEpTVmFsdWUgZ2V0S2V5KEV4ZWNTdGF0ZSogZXhlYykgeyBpZiAoIW1f
a2V5KSBtX2tleSA9IGpzU3RyaW5nKGV4ZWMsIG1fcHJvcGVydHkudXN0cmluZygpKTsgcmV0dXJu
IG1fa2V5OyAgfQorICAgIG1fcmVwbGFjZXJDYWxsVHlwZSA9IGFzT2JqZWN0KG1fcmVwbGFjZXIp
LT5nZXRDYWxsRGF0YShtX3JlcGxhY2VyQ2FsbERhdGEpOworfQogCi0gICAgcHJpdmF0ZToKLSAg
ICAgICAgSWRlbnRpZmllciBtX3Byb3BlcnR5OwotICAgICAgICBKU1ZhbHVlIG1fa2V5OwotICAg
IH07CitTdHJpbmdpZmllcjo6flN0cmluZ2lmaWVyKCkKK3sKKyAgICBBU1NFUlQobV9leGVjLT5n
bG9iYWxEYXRhKCkuZmlyc3RTdHJpbmdpZmllclRvTWFyayA9PSB0aGlzKTsKKyAgICBtX2V4ZWMt
Pmdsb2JhbERhdGEoKS5maXJzdFN0cmluZ2lmaWVyVG9NYXJrID0gbV9uZXh0U3RyaW5naWZpZXJU
b01hcms7Cit9CiAKLSAgICBjbGFzcyBJbnRLZXlHZW5lcmF0b3IgewotICAgIHB1YmxpYzoKLSAg
ICAgICAgSW50S2V5R2VuZXJhdG9yKHVpbnQzMl90IHByb3BlcnR5KQotICAgICAgICAgICAgOiBt
X3Byb3BlcnR5KHByb3BlcnR5KQotICAgICAgICB7Cit2b2lkIFN0cmluZ2lmaWVyOjptYXJrKCkK
K3sKKyAgICBmb3IgKFN0cmluZ2lmaWVyKiBzdHJpbmdpZmllciA9IHRoaXM7IHN0cmluZ2lmaWVy
OyBzdHJpbmdpZmllciA9IHN0cmluZ2lmaWVyLT5tX25leHRTdHJpbmdpZmllclRvTWFyaykgewor
ICAgICAgICBzaXplX3Qgc2l6ZSA9IG1faG9sZGVyU3RhY2suc2l6ZSgpOworICAgICAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgSlNPYmplY3QqIG9i
amVjdCA9IG1faG9sZGVyU3RhY2tbaV0ub2JqZWN0KCk7CisgICAgICAgICAgICBpZiAoIW9iamVj
dC0+bWFya2VkKCkpCisgICAgICAgICAgICAgICAgb2JqZWN0LT5tYXJrKCk7CiAgICAgICAgIH0K
LSAgICAgICAgSlNWYWx1ZSBnZXRLZXkoRXhlY1N0YXRlKiBleGVjKSB7IGlmICghbV9rZXkpIG1f
a2V5ID0ganNOdW1iZXIoZXhlYywgbV9wcm9wZXJ0eSk7IHJldHVybiBtX2tleTsgIH0KKyAgICB9
Cit9CiAKLSAgICBwcml2YXRlOgotICAgICAgICB1aW50MzJfdCBtX3Byb3BlcnR5OwotICAgICAg
ICBKU1ZhbHVlIG1fa2V5OwotICAgIH07CitKU1ZhbHVlIFN0cmluZ2lmaWVyOjpzdHJpbmdpZnko
SlNWYWx1ZSB2YWx1ZSkKK3sKKyAgICBKU09iamVjdCogb2JqZWN0ID0gY29uc3RydWN0RW1wdHlP
YmplY3QobV9leGVjKTsKKyAgICBpZiAobV9leGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAg
cmV0dXJuIGpzTnVsbCgpOworCisgICAgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsIGVtcHR5
UHJvcGVydHlOYW1lKG1fZXhlYy0+Z2xvYmFsRGF0YSgpLnByb3BlcnR5TmFtZXMtPmVtcHR5SWRl
bnRpZmllcik7CisgICAgb2JqZWN0LT5wdXREaXJlY3QobV9leGVjLT5nbG9iYWxEYXRhKCkucHJv
cGVydHlOYW1lcy0+ZW1wdHlJZGVudGlmaWVyLCB2YWx1ZSk7CisKKyAgICBTdHJpbmdCdWlsZGVy
IHJlc3VsdDsKKyAgICBpZiAoYXBwZW5kU3RyaW5naWZpZWRWYWx1ZShyZXN1bHQsIHZhbHVlLCBv
YmplY3QsIGVtcHR5UHJvcGVydHlOYW1lKSAhPSBTdHJpbmdpZnlTdWNjZWVkZWQpCisgICAgICAg
IHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQor
ICAgICAgICByZXR1cm4ganNOdWxsKCk7CiAKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5R2Vu
ZXJhdG9yPiBKU1ZhbHVlIHRvSlNPTlZhbHVlKEtleUdlbmVyYXRvciYganNLZXksIEpTVmFsdWUg
anNWYWx1ZSkKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9leGVjLT5oYWRFeGNlcHRpb24oKSk7
Ci0gICAgICAgIGlmICghanNWYWx1ZS5pc09iamVjdCgpIHx8ICFhc09iamVjdChqc1ZhbHVlKS0+
aGFzUHJvcGVydHkobV9leGVjLCBtX2V4ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0eU5hbWVzLT50
b0pTT04pKQotICAgICAgICAgICAgcmV0dXJuIGpzVmFsdWU7CisgICAgcmV0dXJuIGpzU3RyaW5n
KG1fZXhlYywgcmVzdWx0KTsKK30KIAotICAgICAgICBKU1ZhbHVlIGpzVG9KU09OID0gYXNPYmpl
Y3QoanNWYWx1ZSktPmdldChtX2V4ZWMsIG1fZXhlYy0+Z2xvYmFsRGF0YSgpLnByb3BlcnR5TmFt
ZXMtPnRvSlNPTik7Cit2b2lkIFN0cmluZ2lmaWVyOjphcHBlbmRRdW90ZWRTdHJpbmcoU3RyaW5n
QnVpbGRlciYgYnVpbGRlciwgY29uc3QgVVN0cmluZyYgdmFsdWUpCit7CisgICAgaW50IGxlbmd0
aCA9IHZhbHVlLnNpemUoKTsKIAotICAgICAgICBpZiAoIWpzVG9KU09OLmlzT2JqZWN0KCkpCi0g
ICAgICAgICAgICByZXR1cm4ganNWYWx1ZTsKKyAgICAvLyBTdHJpbmcgbGVuZ3RoIHBsdXMgMiBm
b3IgcXVvdGUgbWFya3MgcGx1cyA4IHNvIHdlIGNhbiBhY2NvbW9kYXRlIGEgZmV3IGVzY2FwZWQg
Y2hhcmFjdGVycy4KKyAgICBidWlsZGVyLnJlc2VydmVDYXBhY2l0eShidWlsZGVyLnNpemUoKSAr
IGxlbmd0aCArIDIgKyA4KTsKIAotICAgICAgICBpZiAobV9leGVjLT5oYWRFeGNlcHRpb24oKSkK
LSAgICAgICAgICAgIHJldHVybiBqc051bGwoKTsKKyAgICBidWlsZGVyLmFwcGVuZCgnIicpOwog
Ci0gICAgICAgIEpTT2JqZWN0KiBvYmplY3QgPSBhc09iamVjdChqc1RvSlNPTik7Ci0gICAgICAg
IENhbGxEYXRhIGNhbGxEYXRhOwotICAgICAgICBDYWxsVHlwZSBjYWxsVHlwZSA9IG9iamVjdC0+
Z2V0Q2FsbERhdGEoY2FsbERhdGEpOworICAgIGNvbnN0IFVDaGFyKiBkYXRhID0gdmFsdWUuZGF0
YSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaW50
IHN0YXJ0ID0gaTsKKyAgICAgICAgd2hpbGUgKGkgPCBsZW5ndGggJiYgKGRhdGFbaV0gPiAweDFG
ICYmIGRhdGFbaV0gIT0gJyInICYmIGRhdGFbaV0gIT0gJ1xcJykpCisgICAgICAgICAgICArK2k7
CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGRhdGEgKyBzdGFydCwgaSAtIHN0YXJ0KTsKKyAgICAg
ICAgaWYgKGkgPj0gbGVuZ3RoKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN3aXRjaCAo
ZGF0YVtpXSkgeworICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCd0Jyk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBl
bmQoJ3InKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoK
KyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICBi
dWlsZGVyLmFwcGVuZCgnbicpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Y2FzZSAnXGYnOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdcXCcpOworICAgICAg
ICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdmJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xc
Jyk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ2InKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7CisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAg
ICAgYnVpbGRlci5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQo
J1xcJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGhleERpZ2l0c1tdID0gIjAxMjM0NTY3ODlh
YmNkZWYiOworICAgICAgICAgICAgICAgIFVDaGFyIGNoID0gZGF0YVtpXTsKKyAgICAgICAgICAg
ICAgICBVQ2hhciBoZXhbXSA9IHsgJ1xcJywgJ3UnLCBoZXhEaWdpdHNbKGNoID4+IDEyKSAmIDB4
Rl0sIGhleERpZ2l0c1soY2ggPj4gOCkgJiAweEZdLCBoZXhEaWdpdHNbKGNoID4+IDQpICYgMHhG
XSwgaGV4RGlnaXRzW2NoICYgMHhGXSB9OworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KGhleCwgc2l6ZW9mKGhleCkgLyBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoY2FsbFR5cGUgPT0gQ2FsbFR5cGVO
b25lKQotICAgICAgICAgICAgcmV0dXJuIGpzVmFsdWU7CisgICAgYnVpbGRlci5hcHBlbmQoJyIn
KTsKK30KIAotICAgICAgICBKU1ZhbHVlIGxpc3RbXSA9IHsganNLZXkuZ2V0S2V5KG1fZXhlYykg
fTsgICAgICAgIAoraW5saW5lIEpTVmFsdWUgU3RyaW5naWZpZXI6OnRvSlNPTihKU1ZhbHVlIHZh
bHVlLCBjb25zdCBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwmIHByb3BlcnR5TmFtZSkKK3sK
KyAgICBBU1NFUlQoIW1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpOworICAgIGlmICghdmFsdWUuaXNP
YmplY3QoKSB8fCAhYXNPYmplY3QodmFsdWUpLT5oYXNQcm9wZXJ0eShtX2V4ZWMsIG1fZXhlYy0+
Z2xvYmFsRGF0YSgpLnByb3BlcnR5TmFtZXMtPnRvSlNPTikpCisgICAgICAgIHJldHVybiB2YWx1
ZTsKKworICAgIEpTVmFsdWUgdG9KU09ORnVuY3Rpb24gPSBhc09iamVjdCh2YWx1ZSktPmdldCht
X2V4ZWMsIG1fZXhlYy0+Z2xvYmFsRGF0YSgpLnByb3BlcnR5TmFtZXMtPnRvSlNPTik7CisgICAg
aWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBqc051bGwoKTsKKwor
ICAgIGlmICghdG9KU09ORnVuY3Rpb24uaXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIHZhbHVl
OworCisgICAgSlNPYmplY3QqIG9iamVjdCA9IGFzT2JqZWN0KHRvSlNPTkZ1bmN0aW9uKTsKKyAg
ICBDYWxsRGF0YSBjYWxsRGF0YTsKKyAgICBDYWxsVHlwZSBjYWxsVHlwZSA9IG9iamVjdC0+Z2V0
Q2FsbERhdGEoY2FsbERhdGEpOworICAgIGlmIChjYWxsVHlwZSA9PSBDYWxsVHlwZU5vbmUpCisg
ICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIEpTVmFsdWUgbGlzdFtdID0geyBwcm9wZXJ0eU5h
bWUudmFsdWUobV9leGVjKSB9OworICAgIEFyZ0xpc3QgYXJncyhsaXN0LCBzaXplb2YobGlzdCkg
LyBzaXplb2YoSlNWYWx1ZSkpOworICAgIHJldHVybiBjYWxsKG1fZXhlYywgb2JqZWN0LCBjYWxs
VHlwZSwgY2FsbERhdGEsIHZhbHVlLCBhcmdzKTsKK30KKworU3RyaW5naWZpZXI6OlN0cmluZ2lm
eVJlc3VsdCBTdHJpbmdpZmllcjo6YXBwZW5kU3RyaW5naWZpZWRWYWx1ZShTdHJpbmdCdWlsZGVy
JiBidWlsZGVyLCBKU1ZhbHVlIHZhbHVlLCBKU09iamVjdCogaG9sZGVyLCBjb25zdCBQcm9wZXJ0
eU5hbWVGb3JGdW5jdGlvbkNhbGwmIHByb3BlcnR5TmFtZSkKK3sKKyAgICAvLyBDYWxsIHRoZSB0
b0pTT04gZnVuY3Rpb24uCisgICAgdmFsdWUgPSB0b0pTT04odmFsdWUsIHByb3BlcnR5TmFtZSk7
CisgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBTdHJpbmdp
ZnlGYWlsZWQ7CisgICAgaWYgKHZhbHVlLmlzVW5kZWZpbmVkKCkgJiYgIWhvbGRlci0+aW5oZXJp
dHMoJkpTQXJyYXk6OmluZm8pKQorICAgICAgICByZXR1cm4gU3RyaW5naWZ5RmFpbGVkRHVlVG9V
bmRlZmluZWRWYWx1ZTsKKworICAgIC8vIENhbGwgdGhlIHJlcGxhY2VyIGZ1bmN0aW9uLgorICAg
IGlmIChtX3JlcGxhY2VyQ2FsbFR5cGUgIT0gQ2FsbFR5cGVOb25lKSB7CisgICAgICAgIEpTVmFs
dWUgbGlzdFtdID0geyBwcm9wZXJ0eU5hbWUudmFsdWUobV9leGVjKSwgdmFsdWUgfTsKICAgICAg
ICAgQXJnTGlzdCBhcmdzKGxpc3QsIHNpemVvZihsaXN0KSAvIHNpemVvZihKU1ZhbHVlKSk7Ci0g
ICAgICAgIHJldHVybiBjYWxsKG1fZXhlYywgb2JqZWN0LCBjYWxsVHlwZSwgY2FsbERhdGEsIGpz
VmFsdWUsIGFyZ3MpOworICAgICAgICB2YWx1ZSA9IGNhbGwobV9leGVjLCBtX3JlcGxhY2VyLCBt
X3JlcGxhY2VyQ2FsbFR5cGUsIG1fcmVwbGFjZXJDYWxsRGF0YSwgaG9sZGVyLCBhcmdzKTsKKyAg
ICAgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICByZXR1cm4gU3Ry
aW5naWZ5RmFpbGVkOwogICAgIH0KIAotICAgIGJvb2wgc3RyaW5naWZ5QXJyYXkoU3RyaW5nQnVp
bGRlciYgYnVpbGRlciwgSlNBcnJheSogYXJyYXkpCi0gICAgewotICAgICAgICBpZiAobV9vYmpl
Y3RTdGFjay5jb250YWlucyhhcnJheSkpIHsKLSAgICAgICAgICAgIHRocm93RXJyb3IobV9leGVj
LCBUeXBlRXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAg
aWYgKHZhbHVlLmlzTnVsbCgpKSB7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJudWxsIik7Cisg
ICAgICAgIHJldHVybiBTdHJpbmdpZnlTdWNjZWVkZWQ7CisgICAgfQogCi0gICAgICAgIGlmICht
X29iamVjdFN0YWNrLnNpemUoKSA+IE1heE9iamVjdERlcHRoKSB7Ci0gICAgICAgICAgICBtX2V4
ZWMtPnNldEV4Y2VwdGlvbihjcmVhdGVTdGFja092ZXJmbG93RXJyb3IobV9leGVjKSk7Ci0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBpZiAodmFsdWUuaXNCb29sZWFu
KCkpIHsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWUuZ2V0Qm9vbGVhbigpID8gInRydWUi
IDogImZhbHNlIik7CisgICAgICAgIHJldHVybiBTdHJpbmdpZnlTdWNjZWVkZWQ7CisgICAgfQog
Ci0gICAgICAgIG1fb2JqZWN0U3RhY2suYWRkKGFycmF5KTsKLSAgICAgICAgVVN0cmluZyBzdGVw
QmFjayA9IG1faW5kZW50OwotICAgICAgICBtX2luZGVudC5hcHBlbmQobV9nYXApOwotICAgICAg
ICBWZWN0b3I8U3RyaW5nQnVpbGRlciwgMTY+IHBhcnRpYWw7Ci0gICAgICAgIHVuc2lnbmVkIGxl
biA9IGFycmF5LT5nZXQobV9leGVjLCBtX2V4ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0eU5hbWVz
LT5sZW5ndGgpLnRvVUludDMyKG1fZXhlYyk7Ci0gICAgICAgIGJvb2wgaXNSZWFsSlNBcnJheSA9
IGlzSlNBcnJheSgmbV9leGVjLT5nbG9iYWxEYXRhKCksIGFycmF5KTsKLSAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBKU1ZhbHVlIHZhbHVl
OwotICAgICAgICAgICAgaWYgKGlzUmVhbEpTQXJyYXkgJiYgYXJyYXktPmNhbkdldEluZGV4KGkp
KQotICAgICAgICAgICAgICAgIHZhbHVlID0gYXJyYXktPmdldEluZGV4KGkpOwotICAgICAgICAg
ICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBhcnJheS0+Z2V0KG1fZXhlYywgaSk7
Ci0gICAgICAgICAgICAgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmlu
Z0J1aWxkZXIgcmVzdWx0OwotICAgICAgICAgICAgSW50S2V5R2VuZXJhdG9yIGtleShpKTsKLSAg
ICAgICAgICAgIHZhbHVlID0gdG9KU09OVmFsdWUoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBp
ZiAocGFydGlhbC5zaXplKCkgJiYgbV9nYXAuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIHBh
cnRpYWwubGFzdCgpLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgaWYgKCFzdHJpbmdpZnkocmVz
dWx0LCBhcnJheSwga2V5LCB2YWx1ZSkgJiYgIW1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAg
ICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgibnVsbCIpOwotICAgICAgICAgICAgZWxzZSBpZiAo
bV9leGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgICAgICBwYXJ0aWFsLmFwcGVuZChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIAot
ICAgICAgICBpZiAocGFydGlhbC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVu
ZCgiW10iKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9nYXAuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1snKTsKLSAgICAgICAgICAgICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGFydGlhbC5zaXplKCk7IGkrKykKLSAgICAgICAg
ICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydGlhbFtpXSk7Ci0gICAgICAgICAgICAgICAg
YnVpbGRlci5hcHBlbmQoJ10nKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgVVN0cmluZyBzZXBhcmF0b3IoIixcbiIpOwotICAgICAgICAgICAgICAgIHNlcGFyYXRvci5h
cHBlbmQobV9pbmRlbnQpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJbXG4iKTsK
LSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChtX2luZGVudCk7Ci0gICAgICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHBhcnRpYWwuc2l6ZSgpOyBpKyspIHsKLSAgICAg
ICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydGlhbFtpXSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmIChpIDwgcGFydGlhbC5zaXplKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICAg
ICAgYnVpbGRlci5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQoc3RlcEJhY2spOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCddJyk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICB2YWx1ZSA9IHVud3JhcE51bWJlck9yU3RyaW5n
KHZhbHVlKTsKIAotICAgICAgICBtX2luZGVudCA9IHN0ZXBCYWNrOwotICAgICAgICBtX29iamVj
dFN0YWNrLnJlbW92ZShhcnJheSk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIFVTdHJpbmcg
c3RyaW5nVmFsdWU7CisgICAgaWYgKHZhbHVlLmdldFN0cmluZyhzdHJpbmdWYWx1ZSkpIHsKKyAg
ICAgICAgYXBwZW5kUXVvdGVkU3RyaW5nKGJ1aWxkZXIsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAg
cmV0dXJuIFN0cmluZ2lmeVN1Y2NlZWRlZDsKICAgICB9CiAKLSAgICBib29sIHN0cmluZ2lmeU9i
amVjdChTdHJpbmdCdWlsZGVyJiBidWlsZGVyLCBKU09iamVjdCogb2JqZWN0KQotICAgIHsKLSAg
ICAgICAgaWYgKG1fb2JqZWN0U3RhY2suY29udGFpbnMob2JqZWN0KSkgewotICAgICAgICAgICAg
dGhyb3dFcnJvcihtX2V4ZWMsIFR5cGVFcnJvcik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIH0KKyAgICBkb3VibGUgbnVtZXJpY1ZhbHVlOworICAgIGlmICh2YWx1ZS5nZXRO
dW1iZXIobnVtZXJpY1ZhbHVlKSkgeworICAgICAgICBpZiAoIWlzZmluaXRlKG51bWVyaWNWYWx1
ZSkpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgibnVsbCIpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBidWlsZGVyLmFwcGVuZChVU3RyaW5nOjpmcm9tKG51bWVyaWNWYWx1ZSkpOwor
ICAgICAgICByZXR1cm4gU3RyaW5naWZ5U3VjY2VlZGVkOworICAgIH0KIAotICAgICAgICBpZiAo
bV9vYmplY3RTdGFjay5zaXplKCkgPiBNYXhPYmplY3REZXB0aCkgewotICAgICAgICAgICAgbV9l
eGVjLT5zZXRFeGNlcHRpb24oY3JlYXRlU3RhY2tPdmVyZmxvd0Vycm9yKG1fZXhlYykpOwotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgaWYgKCF2YWx1ZS5pc09iamVj
dCgpKQorICAgICAgICByZXR1cm4gU3RyaW5naWZ5RmFpbGVkOwogCi0gICAgICAgIG1fb2JqZWN0
U3RhY2suYWRkKG9iamVjdCk7Ci0gICAgICAgIFVTdHJpbmcgc3RlcEJhY2sgPSBtX2luZGVudDsK
LSAgICAgICAgbV9pbmRlbnQuYXBwZW5kKG1fZ2FwKTsKLSAgICAgICAgVmVjdG9yPFN0cmluZ0J1
aWxkZXIsIDE2PiBwYXJ0aWFsOwotCi0gICAgICAgIFByb3BlcnR5TmFtZUFycmF5IG9iamVjdFBy
b3BlcnR5TmFtZXMobV9leGVjKTsKLSAgICAgICAgUHJvcGVydHlOYW1lQXJyYXkmIHNvdXJjZVBy
b3BlcnR5TmFtZXMobV9hcnJheVJlcGxhY2VyUHJvcGVydHlOYW1lcyk7Ci0gICAgICAgIGlmICgh
bV91c2luZ0FycmF5UmVwbGFjZXIpIHsKLSAgICAgICAgICAgIG9iamVjdC0+Z2V0UHJvcGVydHlO
YW1lcyhtX2V4ZWMsIG9iamVjdFByb3BlcnR5TmFtZXMpOwotICAgICAgICAgICAgc291cmNlUHJv
cGVydHlOYW1lcyA9IG9iamVjdFByb3BlcnR5TmFtZXM7CisgICAgSlNPYmplY3QqIG9iamVjdCA9
IGFzT2JqZWN0KHZhbHVlKTsKKworICAgIC8vIEhhbmRsZSBjeWNsZSBkZXRlY3Rpb24sIGFuZCBw
dXQgdGhlIGhvbGRlciBvbiB0aGUgc3RhY2suCisgICAgaWYgKCFtX2hvbGRlckN5Y2xlRGV0ZWN0
b3IuYWRkKG9iamVjdCkuc2Vjb25kKSB7CisgICAgICAgIHRocm93RXJyb3IobV9leGVjLCBUeXBl
RXJyb3IpOworICAgICAgICByZXR1cm4gU3RyaW5naWZ5RmFpbGVkOworICAgIH0KKyAgICBib29s
IGhvbGRlclN0YWNrV2FzRW1wdHkgPSBtX2hvbGRlclN0YWNrLmlzRW1wdHkoKTsKKyAgICBtX2hv
bGRlclN0YWNrLmFwcGVuZChvYmplY3QpOworICAgIGlmICghaG9sZGVyU3RhY2tXYXNFbXB0eSkK
KyAgICAgICAgcmV0dXJuIFN0cmluZ2lmeVN1Y2NlZWRlZDsKKworICAgIC8vIElmIHRoaXMgaXMg
dGhlIG91dGVybW9zdCBjYWxsLCB0aGVuIGxvb3AgdG8gaGFuZGxlIGV2ZXJ5dGhpbmcgb24gdGhl
IGhvbGRlciBzdGFjay4KKyAgICBUaW1lb3V0Q2hlY2tlciBsb2NhbFRpbWVvdXRDaGVja2VyKG1f
ZXhlYy0+Z2xvYmFsRGF0YSgpLnRpbWVvdXRDaGVja2VyKTsKKyAgICBsb2NhbFRpbWVvdXRDaGVj
a2VyLnJlc2V0KCk7CisgICAgdW5zaWduZWQgdGlja0NvdW50ID0gbG9jYWxUaW1lb3V0Q2hlY2tl
ci50aWNrc1VudGlsTmV4dENoZWNrKCk7CisgICAgZG8geworICAgICAgICB3aGlsZSAobV9ob2xk
ZXJTdGFjay5sYXN0KCkuYXBwZW5kTmV4dFByb3BlcnR5KCp0aGlzLCBidWlsZGVyKSkgeworICAg
ICAgICAgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIFN0cmluZ2lmeUZhaWxlZDsKKyAgICAgICAgICAgIGlmICghLS10aWNrQ291bnQpIHsKKyAg
ICAgICAgICAgICAgICBpZiAobG9jYWxUaW1lb3V0Q2hlY2tlci5kaWRUaW1lT3V0KG1fZXhlYykp
IHsKKyAgICAgICAgICAgICAgICAgICAgbV9leGVjLT5zZXRFeGNlcHRpb24oY3JlYXRlSW50ZXJy
dXB0ZWRFeGVjdXRpb25FeGNlcHRpb24oJm1fZXhlYy0+Z2xvYmFsRGF0YSgpKSk7CisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBTdHJpbmdpZnlGYWlsZWQ7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIHRpY2tDb3VudCA9IGxvY2FsVGltZW91dENoZWNrZXIudGlja3NVbnRp
bE5leHRDaGVjaygpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIG1faG9sZGVy
Q3ljbGVEZXRlY3Rvci5yZW1vdmUobV9ob2xkZXJTdGFjay5sYXN0KCkub2JqZWN0KCkpOworICAg
ICAgICBtX2hvbGRlclN0YWNrLnJlbW92ZUxhc3QoKTsKKyAgICB9IHdoaWxlICghbV9ob2xkZXJT
dGFjay5pc0VtcHR5KCkpOworICAgIHJldHVybiBTdHJpbmdpZnlTdWNjZWVkZWQ7Cit9CiAKLSAg
ICAgICAgUHJvcGVydHlOYW1lQXJyYXk6OmNvbnN0X2l0ZXJhdG9yIHByb3BFbmQgPSBzb3VyY2VQ
cm9wZXJ0eU5hbWVzLmVuZCgpOwotICAgICAgICBmb3IgKFByb3BlcnR5TmFtZUFycmF5Ojpjb25z
dF9pdGVyYXRvciBwcm9wSXRlciA9IHNvdXJjZVByb3BlcnR5TmFtZXMuYmVnaW4oKTsgcHJvcEl0
ZXIgIT0gcHJvcEVuZDsgcHJvcEl0ZXIrKykgewotICAgICAgICAgICAgaWYgKCFvYmplY3QtPmhh
c093blByb3BlcnR5KG1fZXhlYywgKnByb3BJdGVyKSkKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKK2lubGluZSBib29sIFN0cmluZ2lmaWVyOjp3aWxsSW5kZW50KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gIW1fZ2FwLmlzRW1wdHkoKTsKK30KIAotICAgICAgICAgICAgSlNWYWx1ZSB2YWx1ZSA9
IG9iamVjdC0+Z2V0KG1fZXhlYywgKnByb3BJdGVyKTsKLSAgICAgICAgICAgIGlmIChtX2V4ZWMt
PmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKK2lubGluZSB2
b2lkIFN0cmluZ2lmaWVyOjppbmRlbnQoKQoreworICAgIC8vIFVzZSBhIHNpbmdsZSBzaGFyZWQg
c3RyaW5nLCBtX3JlcGVhdGVkR2FwLCBzbyB3ZSBkb24ndCBrZWVwIGFsbG9jYXRpbmcgbmV3IG9u
ZXMgYXMgd2UgaW5kZW50IGFuZCB1bmluZGVudC4KKyAgICBpbnQgbmV3U2l6ZSA9IG1faW5kZW50
LnNpemUoKSArIG1fZ2FwLnNpemUoKTsKKyAgICBpZiAobmV3U2l6ZSA+IG1fcmVwZWF0ZWRHYXAu
c2l6ZSgpKQorICAgICAgICBtX3JlcGVhdGVkR2FwLmFwcGVuZChtX2dhcCk7CisgICAgQVNTRVJU
KG5ld1NpemUgPD0gbV9yZXBlYXRlZEdhcC5zaXplKCkpOworICAgIG1faW5kZW50ID0gbV9yZXBl
YXRlZEdhcC5zdWJzdHIoMCwgbmV3U2l6ZSk7Cit9CiAKLSAgICAgICAgICAgIGlmICh2YWx1ZS5p
c1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworaW5saW5lIHZvaWQgU3Ry
aW5naWZpZXI6OnVuaW5kZW50KCkKK3sKKyAgICBBU1NFUlQobV9pbmRlbnQuc2l6ZSgpID49IG1f
Z2FwLnNpemUoKSk7CisgICAgbV9pbmRlbnQgPSBtX3JlcGVhdGVkR2FwLnN1YnN0cigwLCBtX2lu
ZGVudC5zaXplKCkgLSBtX2dhcC5zaXplKCkpOworfQogCi0gICAgICAgICAgICBTdHJpbmdCdWls
ZGVyIHJlc3VsdDsKLSAgICAgICAgICAgIGFwcGVuZFN0cmluZyhyZXN1bHQscHJvcEl0ZXItPnVz
dHJpbmcoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBp
ZiAoIW1fZ2FwLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7
Ci0gICAgICAgICAgICBTdHJpbmdLZXlHZW5lcmF0b3Iga2V5KCpwcm9wSXRlcik7Ci0gICAgICAg
ICAgICB2YWx1ZSA9IHRvSlNPTlZhbHVlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgaWYgKG1f
ZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworaW5s
aW5lIHZvaWQgU3RyaW5naWZpZXI6OnN0YXJ0TmV3TGluZShTdHJpbmdCdWlsZGVyJiBidWlsZGVy
KSBjb25zdAoreworICAgIGlmIChtX2dhcC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKyAg
ICBidWlsZGVyLmFwcGVuZCgnXG4nKTsKKyAgICBidWlsZGVyLmFwcGVuZChtX2luZGVudCk7Cit9
CiAKLSAgICAgICAgICAgIGlmICh2YWx1ZS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworaW5saW5lIFN0cmluZ2lmaWVyOjpIb2xkZXI6OkhvbGRlcihKU09iamVjdCog
b2JqZWN0KQorICAgIDogbV9vYmplY3Qob2JqZWN0KQorICAgICwgbV9pc0FycmF5KG9iamVjdC0+
aW5oZXJpdHMoJkpTQXJyYXk6OmluZm8pKQorICAgICwgbV9pbmRleCgwKQoreworfQogCi0gICAg
ICAgICAgICBzdHJpbmdpZnkocmVzdWx0LCBvYmplY3QsIGtleSwgdmFsdWUpOwotICAgICAgICAg
ICAgcGFydGlhbC5hcHBlbmQocmVzdWx0KTsKLSAgICAgICAgfQorYm9vbCBTdHJpbmdpZmllcjo6
SG9sZGVyOjphcHBlbmROZXh0UHJvcGVydHkoU3RyaW5naWZpZXImIHN0cmluZ2lmaWVyLCBTdHJp
bmdCdWlsZGVyJiBidWlsZGVyKQoreworICAgIEFTU0VSVChtX2luZGV4IDw9IG1fc2l6ZSk7CiAK
LSAgICAgICAgaWYgKHBhcnRpYWwuaXNFbXB0eSgpKQotICAgICAgICAgICAgYnVpbGRlci5hcHBl
bmQoInt9Iik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKG1fZ2FwLmlzRW1wdHko
KSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCd7Jyk7Ci0gICAgICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHBhcnRpYWwuc2l6ZSgpOyBpKyspIHsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRl
ci5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydGlh
bFtpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KCd9Jyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFVTdHJpbmcgc2Vw
YXJhdG9yKCIsXG4iKTsKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3IuYXBwZW5kKG1faW5kZW50
KTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgie1xuIik7Ci0gICAgICAgICAgICAg
ICAgYnVpbGRlci5hcHBlbmQobV9pbmRlbnQpOwotICAgICAgICAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBwYXJ0aWFsLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGJ1aWxkZXIuYXBwZW5kKHBhcnRpYWxbaV0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8
IHBhcnRpYWwuc2l6ZSgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBw
ZW5kKHNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHN0ZXBCYWNr
KTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnfScpOwotICAgICAgICAgICAgfQor
ICAgIEV4ZWNTdGF0ZSogZXhlYyA9IHN0cmluZ2lmaWVyLm1fZXhlYzsKIAorICAgIC8vIEZpcnN0
IHRpbWUgdGhyb3VnaCwgaW5pdGlhbGl6ZS4KKyAgICBpZiAoIW1faW5kZXgpIHsKKyAgICAgICAg
aWYgKG1faXNBcnJheSkgeworICAgICAgICAgICAgbV9pc0pTQXJyYXkgPSBpc0pTQXJyYXkoJmV4
ZWMtPmdsb2JhbERhdGEoKSwgbV9vYmplY3QpOworICAgICAgICAgICAgbV9zaXplID0gbV9vYmpl
Y3QtPmdldChleGVjLCBleGVjLT5nbG9iYWxEYXRhKCkucHJvcGVydHlOYW1lcy0+bGVuZ3RoKS50
b1VJbnQzMihleGVjKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdbJyk7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RyaW5naWZpZXIubV91c2luZ0FycmF5UmVwbGFj
ZXIpCisgICAgICAgICAgICAgICAgbV9wcm9wZXJ0eU5hbWVzID0gc3RyaW5naWZpZXIubV9hcnJh
eVJlcGxhY2VyUHJvcGVydHlOYW1lcy5kYXRhKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBQcm9wZXJ0eU5hbWVBcnJheSBvYmplY3RQcm9wZXJ0eU5hbWVzKGV4ZWMpOwor
ICAgICAgICAgICAgICAgIG1fb2JqZWN0LT5nZXRQcm9wZXJ0eU5hbWVzKGV4ZWMsIG9iamVjdFBy
b3BlcnR5TmFtZXMpOworICAgICAgICAgICAgICAgIG1fcHJvcGVydHlOYW1lcyA9IG9iamVjdFBy
b3BlcnR5TmFtZXMucmVsZWFzZURhdGEoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1f
c2l6ZSA9IG1fcHJvcGVydHlOYW1lcy0+cHJvcGVydHlOYW1lVmVjdG9yKCkuc2l6ZSgpOworICAg
ICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ3snKTsKICAgICAgICAgfQorICAgICAgICBzdHJpbmdp
Zmllci5pbmRlbnQoKTsKKyAgICB9CiAKLSAgICAgICAgbV9pbmRlbnQgPSBzdGVwQmFjazsKLSAg
ICAgICAgbV9vYmplY3RTdGFjay5yZW1vdmUob2JqZWN0KTsKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotICAgIAotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXlHZW5lcmF0b3I+IGJvb2wg
c3RyaW5naWZ5KFN0cmluZ0J1aWxkZXImIGJ1aWxkZXIsIEpTVmFsdWUgaG9sZGVyLCBLZXlHZW5l
cmF0b3Iga2V5LCBKU1ZhbHVlIHZhbHVlKQotICAgIHsKLSAgICAgICAgaWYgKG1fcmVwbGFjZXJD
YWxsVHlwZSAhPSBDYWxsVHlwZU5vbmUpIHsKLSAgICAgICAgICAgIEpTVmFsdWUgbGlzdFtdID0g
e2tleS5nZXRLZXkobV9leGVjKSwgdmFsdWV9OwotICAgICAgICAgICAgQXJnTGlzdCBhcmdzKGxp
c3QsIHNpemVvZihsaXN0KSAvIHNpemVvZihKU1ZhbHVlKSk7Ci0gICAgICAgICAgICB2YWx1ZSA9
IGNhbGwobV9leGVjLCBtX3JlcGxhY2VyLCBtX3JlcGxhY2VyQ2FsbFR5cGUsIG1fcmVwbGFjZXJD
YWxsRGF0YSwgaG9sZGVyLCBhcmdzKTsKLSAgICAgICAgICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2Vw
dGlvbigpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgIC8v
IExhc3QgdGltZSB0aHJvdWdoLCBmaW5pc2ggdXAgYW5kIHJldHVybiBmYWxzZS4KKyAgICBpZiAo
bV9pbmRleCA9PSBtX3NpemUpIHsKKyAgICAgICAgc3RyaW5naWZpZXIudW5pbmRlbnQoKTsKKyAg
ICAgICAgaWYgKG1fc2l6ZSAmJiBidWlsZGVyW2J1aWxkZXIuc2l6ZSgpIC0gMV0gIT0gJ3snKQor
ICAgICAgICAgICAgc3RyaW5naWZpZXIuc3RhcnROZXdMaW5lKGJ1aWxkZXIpOworICAgICAgICBi
dWlsZGVyLmFwcGVuZChtX2lzQXJyYXkgPyAnXScgOiAnfScpOworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQogCi0gICAgICAgIGlmICh2YWx1ZS5pc051bGwoKSkgewotICAgICAgICAgICAg
YnVpbGRlci5hcHBlbmQoIm51bGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIC8v
IEhhbmRsZSBhIHNpbmdsZSBlbGVtZW50IG9mIHRoZSBhcnJheSBvciBvYmplY3QuCisgICAgdW5z
aWduZWQgaW5kZXggPSBtX2luZGV4Kys7CisgICAgdW5zaWduZWQgcm9sbEJhY2tQb2ludCA9IDA7
CisgICAgU3RyaW5naWZ5UmVzdWx0IHN0cmluZ2lmeVJlc3VsdDsKKyAgICBpZiAobV9pc0FycmF5
KSB7CisgICAgICAgIC8vIEdldCB0aGUgdmFsdWUuCisgICAgICAgIEpTVmFsdWUgdmFsdWU7Cisg
ICAgICAgIGlmIChtX2lzSlNBcnJheSAmJiBhc0FycmF5KG1fb2JqZWN0KS0+Y2FuR2V0SW5kZXgo
aW5kZXgpKQorICAgICAgICAgICAgdmFsdWUgPSBhc0FycmF5KG1fb2JqZWN0KS0+Z2V0SW5kZXgo
aW5kZXgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFByb3BlcnR5U2xvdCBzbG90KG1f
b2JqZWN0KTsKKyAgICAgICAgICAgIGlmICghbV9vYmplY3QtPmdldE93blByb3BlcnR5U2xvdChl
eGVjLCBpbmRleCwgc2xvdCkpCisgICAgICAgICAgICAgICAgc2xvdC5zZXRVbmRlZmluZWQoKTsK
KyAgICAgICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB2YWx1ZSA9IHNsb3QuZ2V0VmFsdWUoZXhlYywgaW5k
ZXgpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZhbHVlLmlzQm9vbGVhbigpKSB7Ci0gICAg
ICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZS5nZXRCb29sZWFuKCkgPyAidHJ1ZSIgOiAiZmFs
c2UiKTsKKyAgICAgICAgLy8gQXBwZW5kIHRoZSBzZXBhcmF0b3Igc3RyaW5nLgorICAgICAgICBp
ZiAoaW5kZXgpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnLCcpOworICAgICAgICBzdHJp
bmdpZmllci5zdGFydE5ld0xpbmUoYnVpbGRlcik7CisKKyAgICAgICAgLy8gQXBwZW5kIHRoZSBz
dHJpbmdpZmllZCB2YWx1ZS4KKyAgICAgICAgc3RyaW5naWZ5UmVzdWx0ID0gc3RyaW5naWZpZXIu
YXBwZW5kU3RyaW5naWZpZWRWYWx1ZShidWlsZGVyLCB2YWx1ZSwgbV9vYmplY3QsIGluZGV4KTsK
KyAgICB9IGVsc2UgeworICAgICAgICAvLyBHZXQgdGhlIHZhbHVlLgorICAgICAgICBQcm9wZXJ0
eVNsb3Qgc2xvdChtX29iamVjdCk7CisgICAgICAgIElkZW50aWZpZXImIHByb3BlcnR5TmFtZSA9
IG1fcHJvcGVydHlOYW1lcy0+cHJvcGVydHlOYW1lVmVjdG9yKClbaW5kZXhdOworICAgICAgICBp
ZiAoIW1fb2JqZWN0LT5nZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90
KSkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9CisgICAgICAgIEpTVmFsdWUg
dmFsdWUgPSBzbG90LmdldFZhbHVlKGV4ZWMsIHByb3BlcnR5TmFtZSk7CisgICAgICAgIGlmIChl
eGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAg
ICBpZiAodmFsdWUuaXNPYmplY3QoKSkgewotICAgICAgICAgICAgaWYgKGFzT2JqZWN0KHZhbHVl
KS0+aW5oZXJpdHMoJk51bWJlck9iamVjdDo6aW5mbykgfHwgYXNPYmplY3QodmFsdWUpLT5pbmhl
cml0cygmU3RyaW5nT2JqZWN0OjppbmZvKSkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0YXRp
Y19jYXN0PEpTV3JhcHBlck9iamVjdCo+KGFzT2JqZWN0KHZhbHVlKSktPmludGVybmFsVmFsdWUo
KTsKLSAgICAgICAgfQorICAgICAgICByb2xsQmFja1BvaW50ID0gYnVpbGRlci5zaXplKCk7CiAK
LSAgICAgICAgaWYgKHZhbHVlLmlzU3RyaW5nKCkpIHsKLSAgICAgICAgICAgIGFwcGVuZFN0cmlu
ZyhidWlsZGVyLCB2YWx1ZS50b1N0cmluZyhtX2V4ZWMpKTsKLSAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgICAgICB9CisgICAgICAgIC8vIEFwcGVuZCB0aGUgc2VwYXJhdG9yIHN0cmluZy4K
KyAgICAgICAgaWYgKGJ1aWxkZXJbcm9sbEJhY2tQb2ludCAtIDFdICE9ICd7JykKKyAgICAgICAg
ICAgIGJ1aWxkZXIuYXBwZW5kKCcsJyk7CisgICAgICAgIHN0cmluZ2lmaWVyLnN0YXJ0TmV3TGlu
ZShidWlsZGVyKTsKKworICAgICAgICAvLyBBcHBlbmQgdGhlIHByb3BlcnR5IG5hbWUuCisgICAg
ICAgIGFwcGVuZFF1b3RlZFN0cmluZyhidWlsZGVyLCBwcm9wZXJ0eU5hbWUudXN0cmluZygpKTsK
KyAgICAgICAgYnVpbGRlci5hcHBlbmQoJzonKTsKKyAgICAgICAgaWYgKHN0cmluZ2lmaWVyLndp
bGxJbmRlbnQoKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7CiAKLSAgICAgICAg
aWYgKHZhbHVlLmlzTnVtYmVyKCkpIHsKLSAgICAgICAgICAgIGRvdWJsZSB2ID0gdmFsdWUudG9O
dW1iZXIobV9leGVjKTsKLSAgICAgICAgICAgIGlmICghaXNmaW5pdGUodikpCi0gICAgICAgICAg
ICAgICAgYnVpbGRlci5hcHBlbmQoIm51bGwiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICBidWlsZGVyLmFwcGVuZChVU3RyaW5nOjpmcm9tKHYpKTsKLSAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICB9CisgICAgICAgIC8vIEFwcGVuZCB0aGUgc3RyaW5naWZpZWQg
dmFsdWUuCisgICAgICAgIHN0cmluZ2lmeVJlc3VsdCA9IHN0cmluZ2lmaWVyLmFwcGVuZFN0cmlu
Z2lmaWVkVmFsdWUoYnVpbGRlciwgdmFsdWUsIG1fb2JqZWN0LCBwcm9wZXJ0eU5hbWUpOworICAg
IH0KIAotICAgICAgICBpZiAodmFsdWUuaXNPYmplY3QoKSkgewotICAgICAgICAgICAgaWYgKGFz
T2JqZWN0KHZhbHVlKS0+aW5oZXJpdHMoJkpTQXJyYXk6OmluZm8pKQotICAgICAgICAgICAgICAg
IHJldHVybiBzdHJpbmdpZnlBcnJheShidWlsZGVyLCBhc0FycmF5KHZhbHVlKSk7Ci0gICAgICAg
ICAgICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KGJ1aWxkZXIsIGFzT2JqZWN0KHZhbHVlKSk7Ci0g
ICAgICAgIH0KKyAgICAvLyBGcm9tIHRoaXMgcG9pbnQgb24sIG5vIGFjY2VzcyB0byB0aGUgdGhp
cyBwb2ludGVyIG9yIHRvIGFueSBtZW1iZXJzLCBiZWNhdXNlIHRoZQorICAgIC8vIEhvbGRlciBv
YmplY3QgbWF5IGhhdmUgbW92ZWQgaWYgdGhlIGNhbGwgdG8gc3RyaW5naWZ5IHB1c2hlZCBhIG5l
dyBIb2xkZXIgb250bworICAgIC8vIG1faG9sZGVyU3RhY2suCiAKLSAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIHN3aXRjaCAoc3RyaW5naWZ5UmVzdWx0KSB7CisgICAgICAgIGNhc2UgU3RyaW5n
aWZ5RmFpbGVkOgorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIm51bGwiKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0cmluZ2lmeVN1Y2NlZWRlZDoKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIFN0cmluZ2lmeUZhaWxlZER1ZVRvVW5kZWZpbmVkVmFsdWU6
CisgICAgICAgICAgICAvLyBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gZ2V0IGFuIHVuZGVmaW5lZCB2
YWx1ZSBmb3IgYW4gb2JqZWN0IHByb3BlcnR5LgorICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNl
IHdlIGRvbid0IHdhbnQgdGhlIHNlcGFyYXRvciBhbmQgcHJvcGVydHkgbmFtZSB0aGF0IHdlCisg
ICAgICAgICAgICAvLyBhbHJlYWR5IGFwcGVuZGVkLCBzbyByb2xsIGJhY2suCisgICAgICAgICAg
ICBidWlsZGVyID0gYnVpbGRlci5zdWJzdHIoMCwgcm9sbEJhY2tQb2ludCk7CisgICAgICAgICAg
ICBicmVhazsKICAgICB9Ci0gICAgRXhlY1N0YXRlKiBtX2V4ZWM7Ci0gICAgSlNWYWx1ZSBtX3Jl
cGxhY2VyOwotICAgIFVTdHJpbmcgbV9nYXA7Ci0gICAgVVN0cmluZyBtX2luZGVudDsKLSAgICBI
YXNoU2V0PEpTT2JqZWN0Kj4gbV9vYmplY3RTdGFjazsKLSAgICBQcm9wZXJ0eU5hbWVBcnJheSBt
X2FycmF5UmVwbGFjZXJQcm9wZXJ0eU5hbWVzOwotICAgIGJvb2wgbV91c2luZ0FycmF5UmVwbGFj
ZXI7Ci0gICAgQ2FsbFR5cGUgbV9yZXBsYWNlckNhbGxUeXBlOwotICAgIENhbGxEYXRhIG1fcmVw
bGFjZXJDYWxsRGF0YTsKLX07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tIEpTT05PYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KKworY29uc3QgQ2xhc3NJbmZvIEpTT05PYmplY3Q6OmluZm8gPSB7ICJKU09OIiwg
MCwgMCwgRXhlY1N0YXRlOjpqc29uVGFibGUgfTsKKworLyogU291cmNlIGZvciBKU09OT2JqZWN0
Lmx1dC5oCitAYmVnaW4ganNvblRhYmxlCisgIHN0cmluZ2lmeSAgICAgSlNPTlByb3RvRnVuY1N0
cmluZ2lmeSAgICAgICAgIERvbnRFbnVtfEZ1bmN0aW9uIDEKK0BlbmQKKyovCisKKy8vIEVDTUEg
MTUuOAorCitib29sIEpTT05PYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqIGV4
ZWMsIGNvbnN0IElkZW50aWZpZXImIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQor
eworICAgIGNvbnN0IEhhc2hFbnRyeSogZW50cnkgPSBFeGVjU3RhdGU6Ompzb25UYWJsZShleGVj
KS0+ZW50cnkoZXhlYywgcHJvcGVydHlOYW1lKTsKKyAgICBpZiAoIWVudHJ5KQorICAgICAgICBy
ZXR1cm4gSlNPYmplY3Q6OmdldE93blByb3BlcnR5U2xvdChleGVjLCBwcm9wZXJ0eU5hbWUsIHNs
b3QpOworCisgICAgQVNTRVJUKGVudHJ5LT5hdHRyaWJ1dGVzKCkgJiBGdW5jdGlvbik7CisgICAg
c2V0VXBTdGF0aWNGdW5jdGlvblNsb3QoZXhlYywgZW50cnksIHRoaXMsIHByb3BlcnR5TmFtZSwg
c2xvdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSlNPTk9iamVjdDo6bWFya1N0cmlu
Z2lmaWVycyhTdHJpbmdpZmllciogc3RyaW5naWZpZXIpCit7CisgICAgc3RyaW5naWZpZXItPm1h
cmsoKTsKK30KIAogLy8gRUNNQS0yNjIgdjUgMTUuMTIuMwogSlNWYWx1ZSBKU0NfSE9TVF9DQUxM
IEpTT05Qcm90b0Z1bmNTdHJpbmdpZnkoRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCosIEpTVmFs
dWUsIGNvbnN0IEFyZ0xpc3QmIGFyZ3MpCiB7CiAgICAgaWYgKGFyZ3MuaXNFbXB0eSgpKQogICAg
ICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBHZW5lcmFsRXJyb3IsICJObyBpbnB1dCB0byBz
dHJpbmdpZnkiKTsKLQogICAgIEpTVmFsdWUgdmFsdWUgPSBhcmdzLmF0KDApOwogICAgIEpTVmFs
dWUgcmVwbGFjZXIgPSBhcmdzLmF0KDEpOwogICAgIEpTVmFsdWUgc3BhY2UgPSBhcmdzLmF0KDIp
OwotCi0gICAgVVN0cmluZyBnYXA7Ci0gICAgaWYgKHNwYWNlLmlzT2JqZWN0KCkpIHsKLSAgICAg
ICAgaWYgKGFzT2JqZWN0KHNwYWNlKS0+aW5oZXJpdHMoJk51bWJlck9iamVjdDo6aW5mbykgfHwg
YXNPYmplY3Qoc3BhY2UpLT5pbmhlcml0cygmU3RyaW5nT2JqZWN0OjppbmZvKSkKLSAgICAgICAg
ICAgIHNwYWNlID0gc3RhdGljX2Nhc3Q8SlNXcmFwcGVyT2JqZWN0Kj4oYXNPYmplY3Qoc3BhY2Up
KS0+aW50ZXJuYWxWYWx1ZSgpOwotICAgIH0KLSAgICBpZiAoc3BhY2UuaXNOdW1iZXIoKSkgewot
ICAgICAgICBkb3VibGUgdiA9IHNwYWNlLnRvTnVtYmVyKGV4ZWMpOwotICAgICAgICBpZiAodiA+
IDEwMCkKLSAgICAgICAgICAgIHYgPSAxMDA7Ci0gICAgICAgIGlmICghKHYgPiAwKSkKLSAgICAg
ICAgICAgIHYgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHY7IGkrKykKLSAgICAg
ICAgICAgIGdhcC5hcHBlbmQoJyAnKTsKLSAgICB9IGVsc2UgaWYgKHNwYWNlLmlzU3RyaW5nKCkp
Ci0gICAgICAgIGdhcCA9IHNwYWNlLnRvU3RyaW5nKGV4ZWMpOwotCi0gICAgU3RyaW5naWZpZXIg
c3RyaW5naWZpZXIoZXhlYywgYXJncy5hdCgxKSwgZ2FwKTsKLSAgICByZXR1cm4gc3RyaW5naWZp
ZXIuc3RyaW5naWZ5KHZhbHVlKTsKKyAgICByZXR1cm4gU3RyaW5naWZpZXIoZXhlYywgcmVwbGFj
ZXIsIHNwYWNlKS5zdHJpbmdpZnkodmFsdWUpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPTk9iamVjdC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPTk9iamVjdC5oCShyZXZpc2lvbiA0NDcyMykKKysrIEph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNPTk9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMCwy
MiArMzAsMjcgQEAKIAogbmFtZXNwYWNlIEpTQyB7CiAKKyAgICBjbGFzcyBTdHJpbmdpZmllcjsK
KwogICAgIGNsYXNzIEpTT05PYmplY3QgOiBwdWJsaWMgSlNPYmplY3QgewogICAgIHB1YmxpYzoK
ICAgICAgICAgSlNPTk9iamVjdChQYXNzUmVmUHRyPFN0cnVjdHVyZT4gc3RydWN0dXJlKQotICAg
ICAgICAgICAgOkpTT2JqZWN0KHN0cnVjdHVyZSkKKyAgICAgICAgICAgIDogSlNPYmplY3Qoc3Ry
dWN0dXJlKQogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIGJvb2wgZ2V0
T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0ZSosIGNvbnN0IElkZW50aWZpZXImLCBQcm9wZXJ0eVNs
b3QmKTsKLQotICAgICAgICB2aXJ0dWFsIGNvbnN0IENsYXNzSW5mbyogY2xhc3NJbmZvKCkgY29u
c3QgeyByZXR1cm4gJmluZm87IH0KLSAgICAgICAgc3RhdGljIGNvbnN0IENsYXNzSW5mbyBpbmZv
OwotCiAgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFN0cnVjdHVyZT4gY3JlYXRlU3RydWN0dXJl
KEpTVmFsdWUgcHJvdG90eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gU3RydWN0
dXJlOjpjcmVhdGUocHJvdG90eXBlLCBUeXBlSW5mbyhPYmplY3RUeXBlKSk7CiAgICAgICAgIH0K
KworICAgICAgICBzdGF0aWMgdm9pZCBtYXJrU3RyaW5naWZpZXJzKFN0cmluZ2lmaWVyKik7CisK
KyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIGJvb2wgZ2V0T3duUHJvcGVydHlTbG90KEV4
ZWNTdGF0ZSosIGNvbnN0IElkZW50aWZpZXImLCBQcm9wZXJ0eVNsb3QmKTsKKworICAgICAgICB2
aXJ0dWFsIGNvbnN0IENsYXNzSW5mbyogY2xhc3NJbmZvKCkgY29uc3QgeyByZXR1cm4gJmluZm87
IH0KKyAgICAgICAgc3RhdGljIGNvbnN0IENsYXNzSW5mbyBpbmZvOwogICAgIH07CiAKIH0gLy8g
bmFtZXNwYWNlIEpTQwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31479</attachid>
            <date>2009-06-17 18:08:22 -0700</date>
            <delta_ts>2009-06-18 01:06:49 -0700</delta_ts>
            <desc>patch with GC marking issue fixed</desc>
            <filename>StringifyPatch.txt</filename>
            <type>text/plain</type>
            <size>48111</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDQ0NzgxKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjcgQEAKKzIwMDktMDYtMTcgIERhcmluIEFk
bGVyICA8ZGFyaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEJ1ZyAyNjQyOTogTWFrZSBKU09OLnN0cmluZ2lmeSBub24tcmVjdXJz
aXZlIHNvIGl0IGNhbiBoYW5kbGUgb2JqZWN0cworICAgICAgICBvZiBhcmJpdHJhcnkgY29tcGxl
eGl0eQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY0
MjkKKworICAgICAgICBGb3IgbWFya2luZyBJIGRlY2lkZWQgbm90IHRvIHVzZSBnY1Byb3RlY3Qs
IGJlY2F1c2UgdGhpcyBpcyBpbnNpZGUgdGhlIGVuZ2luZQorICAgICAgICBzbyBpdCdzIGVhc3kg
ZW5vdWdoIHRvIGp1c3QgZG8gbWFya2luZy4gQW5kIHRoYXQgZGFybmVkIGdjUHJvdGVjdCBkb2Vz
IGxvY2tpbmchCisgICAgICAgIE9saXZlciB0cmllZCB0byBjb252aW5jZSBtZSB0byB1c2VkIE1h
cmtlZEFyZ3VtZW50QnVmZmVyLCBidXQgdGhlIGNvbnN0cnVjdG9yCisgICAgICAgIGZvciB0aGF0
IGNsYXNzIHNheXMgIkZJWE1FOiBSZW1vdmUgYWxsIGNsaWVudHMgb2YgdGhpcyBBUEksIHRoZW4g
cmVtb3ZlIHRoaXMgQVBJLiIKKworICAgICAgICAqIHJ1bnRpbWUvQ29sbGVjdG9yLmNwcDoKKyAg
ICAgICAgKEpTQzo6SGVhcDo6Y29sbGVjdCk6IEFkZCBhIGNhbGwgdG8gSlNPTk9iamVjdDo6bWFy
a1N0cmluZ2lmaWVycy4KKworICAgICAgICAqIHJ1bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuY3Bw
OgorICAgICAgICAoSlNDOjpDb21tb25JZGVudGlmaWVyczo6Q29tbW9uSWRlbnRpZmllcnMpOiBB
ZGRlZCBlbXB0eUlkZW50aWZpZXIuCisgICAgICAgICogcnVudGltZS9Db21tb25JZGVudGlmaWVy
cy5oOiBEaXR0by4KKworICAgICAgICAqIHJ1bnRpbWUvSlNHbG9iYWxEYXRhLmNwcDoKKyAgICAg
ICAgKEpTQzo6SlNHbG9iYWxEYXRhOjpKU0dsb2JhbERhdGEpOiBJbml0aWFsaXplIGZpcnN0U3Ry
aW5naWZpZXJUb01hcmsgdG8gMC4KKyAgICAgICAgKiBydW50aW1lL0pTR2xvYmFsRGF0YS5oOiBB
ZGRlZCBmaXJzdFN0cmluZ2lmaWVyVG9NYXJrLgorCisgICAgICAgICogcnVudGltZS9KU09OT2Jq
ZWN0LmNwcDogQ3V0IGRvd24gdGhlIGluY2x1ZGVzIHRvIHRoZSBuZWVkZWQgb25lcyBvbmx5Lgor
ICAgICAgICAoSlNDOjp1bndyYXBOdW1iZXJPclN0cmluZyk6IEFkZGVkLiBIZWxwZXIgZm9yIHVu
d3JhcHBpbmcgbnVtYmVyIGFuZCBzdHJpbmcKKyAgICAgICAgb2JqZWN0cyB0byBnZXQgdGhlaXIg
bnVtYmVyIGFuZCBzdHJpbmcgdmFsdWVzLgorICAgICAgICAoSlNDOjpSZXBsYWNlclByb3BlcnR5
TmFtZTo6UmVwbGFjZXJQcm9wZXJ0eU5hbWUpOiBBZGRlZC4gVGhlIGNsYXNzIGlzIHVzZWQKKyAg
ICAgICAgdG8gd3JhcCBhbiBpZGVudGlmaWVyIG9yIGludGVnZXIgc28gd2UgZG9uJ3QgaGF2ZSB0
byBkbyBhbnkgd29yayB1bmxlc3Mgd2UKKyAgICAgICAgYWN0dWFsbHkgY2FsbCBhIHJlcGxhY2Vy
LgorICAgICAgICAoSlNDOjpSZXBsYWNlclByb3BlcnR5TmFtZTo6dmFsdWUpOiBBZGRlZC4KKyAg
ICAgICAgKEpTQzo6Z2FwKTogQWRkZWQuIEhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIFN0cmluZ2lm
aWVyIGNvbnN0cnVjdG9yLgorICAgICAgICAoSlNDOjpQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNh
bGw6OlByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbCk6IEFkZGVkLgorICAgICAgICBUaGUgY2xh
c3MgaXMgdXNlZCB0byB3cmFwIGFuIGlkZW50aWZpZXIgb3IgaW50ZWdlciBzbyB3ZSBkb24ndCBo
YXZlIHRvCisgICAgICAgIGFsbG9jYXRlIGEgbnVtYmVyIG9yIHN0cmluZyB1bnRpbCB3ZSBhY3R1
YWxseSBjYWxsIHRvSlNPTiBvciBhIHJlcGxhY2VyLgorICAgICAgICAoSlNDOjpQcm9wZXJ0eU5h
bWVGb3JGdW5jdGlvbkNhbGw6OmFzSlNWYWx1ZSk6IEFkZGVkLgorICAgICAgICAoSlNDOjpTdHJp
bmdpZmllcjo6U3RyaW5naWZpZXIpOiBVcGRhdGVkIGFuZCBtb3ZlZCBvdXQgb2YgdGhlIGNsYXNz
CisgICAgICAgIGRlZmluaXRpb24uIEFkZGVkIGNvZGUgdG8gaG9vayB0aGlzIGludG8gYSBzaW5n
bHkgbGlua2VkIGxpc3QgZm9yIG1hcmtpbmcuCisgICAgICAgIChKU0M6OlN0cmluZ2lmaWVyOjp+
U3RyaW5naWZpZXIpOiBSZW1vdmUgZnJvbSB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0LgorICAgICAg
ICAoSlNDOjpTdHJpbmdpZmllcjo6bWFyayk6IE1hcmsgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBo
b2xkZXIgc3RhY2tzLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6c3RyaW5naWZ5KTogVXBk
YXRlZC4KKyAgICAgICAgKEpTQzo6U3RyaW5naWZpZXI6OmFwcGVuZFF1b3RlZFN0cmluZyk6IFR3
ZWFrZWQgYW5kIHN0cmVhbWxpbmVkIGEgYml0LgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6
dG9KU09OKTogUmVuYW1lZCBmcm9tIHRvSlNPTlZhbHVlLgorICAgICAgICAoSlNDOjpTdHJpbmdp
Zmllcjo6YXBwZW5kU3RyaW5naWZpZWRWYWx1ZSk6IFJlbmFtZWQgZnJvbSBzdHJpbmdpZnkuCisg
ICAgICAgIEFkZGVkIGNvZGUgdG8gdXNlIHRoZSBtX2hvbGRlclN0YWNrIHRvIGRvIG5vbi1yZWN1
cnNpdmUgc3RyaW5naWZ5IG9mCisgICAgICAgIG9iamVjdHMgYW5kIGFycmF5cy4gVGhpcyBjb2Rl
IGFsc28gdXNlcyB0aGUgdGltZW91dCBjaGVja2VyIHNpbmNlIGluCisgICAgICAgIHBhdGhvbG9n
aWNhbCBjYXNlcyBpdCBjb3VsZCBiZSBzbG93IGV2ZW4gd2l0aG91dCBjYWxsaW5nIGludG8gdGhl
CisgICAgICAgIEphdmFTY3JpcHQgdmlydHVhbCBtYWNoaW5lLgorICAgICAgICAoSlNDOjpTdHJp
bmdpZmllcjo6d2lsbEluZGVudCk6IEFkZGVkLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6
aW5kZW50KTogQWRkZWQuCisgICAgICAgIChKU0M6OlN0cmluZ2lmaWVyOjp1bmluZGVudCk6IEFk
ZGVkLgorICAgICAgICAoSlNDOjpTdHJpbmdpZmllcjo6c3RhcnROZXdMaW5lKTogQWRkZWQuCisg
ICAgICAgIChKU0M6OlN0cmluZ2lmaWVyOjpIb2xkZXI6OkhvbGRlcik6IEFkZGVkLgorICAgICAg
ICAoSlNDOjpTdHJpbmdpZmllcjo6SG9sZGVyOjphcHBlbmROZXh0UHJvcGVydHkpOiBBZGRlZC4g
VGhpcyBpcyB0aGUKKyAgICAgICAgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIHRoZSBmb3JtYXQgb2Yg
YXJyYXlzIGFuZCBvYmplY3RzLgorICAgICAgICAoSlNDOjpKU09OT2JqZWN0OjpnZXRPd25Qcm9w
ZXJ0eVNsb3QpOiBNb3ZlZCB0aGlzIGRvd24gdG8gdGhlIGJvdHRvbQorICAgICAgICBvZiB0aGUg
ZmlsZSBzbyB0aGUgSlNPTk9iamVjdCBjbGFzcyBpcyBub3QgaW50ZXJsZWF2ZWQgd2l0aCB0aGUK
KyAgICAgICAgU3RyaW5naWZpZXIgY2xhc3MuCisgICAgICAgIChKU0M6OkpTT05PYmplY3Q6Om1h
cmtTdHJpbmdpZmllcnMpOiBBZGRlZC4gQ2FsbHMgbWFyay4KKyAgICAgICAgKEpTQzo6SlNPTlBy
b3RvRnVuY1N0cmluZ2lmeSk6IFN0cmVhbWxpbmVkIHRoZSBjb2RlIGhlcmUuIFRoZSBjb2RlCisg
ICAgICAgIHRvIGNvbXB1dGUgdGhlIGdhcCBzdHJpbmcgaXMgbm93IGEgc2VwYXJhdGUgZnVuY3Rp
b24uCisKKyAgICAgICAgKiBydW50aW1lL0pTT05PYmplY3QuaDogTWFkZSBldmVyeXRoaW5nIHBy
aXZhdGUuIEFkZGVkIG1hcmtTdHJpbmdpZmllcnMuCisKIDIwMDktMDYtMTcgIEFkYW0gVHJlYXQg
IDxhZGFtLnRyZWF0QHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBHZW9y
Z2UgU3RhaWtvcy4KSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29sbGVjdG9yLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbGxlY3Rvci5jcHAJKHJldmlz
aW9uIDQ0NzgxKQorKysgSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db2xsZWN0b3IuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiSW50ZXJwcmV0ZXIuaCIKICNp
bmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgogI2luY2x1ZGUgIkpTTG9jay5oIgorI2luY2x1ZGUg
IkpTT05PYmplY3QuaCIKICNpbmNsdWRlICJKU1N0cmluZy5oIgogI2luY2x1ZGUgIkpTVmFsdWUu
aCIKICNpbmNsdWRlICJOb2Rlcy5oIgpAQCAtOTkxLDYgKzk5Miw4IEBAIGJvb2wgSGVhcDo6Y29s
bGVjdCgpCiAgICAgbV9nbG9iYWxEYXRhLT5zbWFsbFN0cmluZ3MubWFyaygpOwogICAgIGlmICht
X2dsb2JhbERhdGEtPnNjb3BlTm9kZUJlaW5nUmVwYXJzZWQpCiAgICAgICAgIG1fZ2xvYmFsRGF0
YS0+c2NvcGVOb2RlQmVpbmdSZXBhcnNlZC0+bWFyaygpOworICAgIGlmIChtX2dsb2JhbERhdGEt
PmZpcnN0U3RyaW5naWZpZXJUb01hcmspCisgICAgICAgIEpTT05PYmplY3Q6Om1hcmtTdHJpbmdp
ZmllcnMobV9nbG9iYWxEYXRhLT5maXJzdFN0cmluZ2lmaWVyVG9NYXJrKTsKIAogICAgIEpBVkFT
Q1JJUFRDT1JFX0dDX01BUktFRCgpOwogCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0Nv
bW1vbklkZW50aWZpZXJzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50aW1l
L0NvbW1vbklkZW50aWZpZXJzLmNwcAkocmV2aXNpb24gNDQ3ODEpCisrKyBKYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0NvbW1vbklkZW50aWZpZXJzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsx
LDUgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDcsIDIwMDkgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIzLDEy
ICsyMywxMyBAQAogCiBuYW1lc3BhY2UgSlNDIHsKIAotY29uc3QgY2hhciogY29uc3QgbnVsbENT
dHJpbmcgPSAwOworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IG51bGxDU3RyaW5nID0gMDsKIAog
I2RlZmluZSBJTklUSUFMSVpFX1BST1BFUlRZX05BTUUobmFtZSkgLCBuYW1lKGdsb2JhbERhdGEs
ICNuYW1lKQogCiBDb21tb25JZGVudGlmaWVyczo6Q29tbW9uSWRlbnRpZmllcnMoSlNHbG9iYWxE
YXRhKiBnbG9iYWxEYXRhKQogICAgIDogbnVsbElkZW50aWZpZXIoZ2xvYmFsRGF0YSwgbnVsbENT
dHJpbmcpCisgICAgLCBlbXB0eUlkZW50aWZpZXIoZ2xvYmFsRGF0YSwgIiIpCiAgICAgLCB1bmRl
cnNjb3JlUHJvdG8oZ2xvYmFsRGF0YSwgIl9fcHJvdG9fXyIpCiAgICAgLCB0aGlzSWRlbnRpZmll
cihnbG9iYWxEYXRhLCAidGhpcyIpCiAgICAgSlNDX0NPTU1PTl9JREVOVElGSUVSU19FQUNIX1BS
T1BFUlRZX05BTUUoSU5JVElBTElaRV9QUk9QRVJUWV9OQU1FKQpJbmRleDogSmF2YVNjcmlwdENv
cmUvcnVudGltZS9Db21tb25JZGVudGlmaWVycy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRD
b3JlL3J1bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuaAkocmV2aXNpb24gNDQ3ODEpCisrKyBKYXZh
U2NyaXB0Q29yZS9ydW50aW1lL0NvbW1vbklkZW50aWZpZXJzLmgJKHdvcmtpbmcgY29weSkKQEAg
LTEsNSArMSw1IEBACiAvKgotICogIENvcHlyaWdodCAoQykgMjAwMywyMDA3IEFwcGxlIENvbXB1
dGVyLCBJbmMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDcsIDIwMDkgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiAgbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTc2LDYgKzc2LDcg
QEAgbmFtZXNwYWNlIEpTQyB7CiAKICAgICBwdWJsaWM6CiAgICAgICAgIGNvbnN0IElkZW50aWZp
ZXIgbnVsbElkZW50aWZpZXI7CisgICAgICAgIGNvbnN0IElkZW50aWZpZXIgZW1wdHlJZGVudGlm
aWVyOwogICAgICAgICBjb25zdCBJZGVudGlmaWVyIHVuZGVyc2NvcmVQcm90bzsKICAgICAgICAg
Y29uc3QgSWRlbnRpZmllciB0aGlzSWRlbnRpZmllcjsKIApJbmRleDogSmF2YVNjcmlwdENvcmUv
cnVudGltZS9KU0dsb2JhbERhdGEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3J1
bnRpbWUvSlNHbG9iYWxEYXRhLmNwcAkocmV2aXNpb24gNDQ3ODEpCisrKyBKYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0pTR2xvYmFsRGF0YS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzOSw2ICsxMzks
NyBAQCBKU0dsb2JhbERhdGE6OkpTR2xvYmFsRGF0YShib29sIGlzU2hhcmVkCiAgICAgLCBoZWFk
KDApCiAgICAgLCBkeW5hbWljR2xvYmFsT2JqZWN0KDApCiAgICAgLCBzY29wZU5vZGVCZWluZ1Jl
cGFyc2VkKDApCisgICAgLCBmaXJzdFN0cmluZ2lmaWVyVG9NYXJrKDApCiB7CiAjaWYgUExBVEZP
Uk0oTUFDKQogICAgIHN0YXJ0UHJvZmlsZXJTZXJ2ZXJJZk5lZWRlZCgpOwpJbmRleDogSmF2YVNj
cmlwdENvcmUvcnVudGltZS9KU0dsb2JhbERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0pTR2xvYmFsRGF0YS5oCShyZXZpc2lvbiA0NDc4MSkKKysrIEphdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxEYXRhLmgJKHdvcmtpbmcgY29weSkKQEAgLTU0LDggKzU0
LDEwIEBAIG5hbWVzcGFjZSBKU0MgewogICAgIGNsYXNzIExleGVyOwogICAgIGNsYXNzIFBhcnNl
cjsKICAgICBjbGFzcyBTY29wZU5vZGU7CisgICAgY2xhc3MgU3RyaW5naWZpZXI7CiAgICAgY2xh
c3MgU3RydWN0dXJlOwogICAgIGNsYXNzIFVTdHJpbmc7CisKICAgICBzdHJ1Y3QgSGFzaFRhYmxl
OwogICAgIHN0cnVjdCBWUHRyU2V0OwogCkBAIC0xNDYsNiArMTQ4LDcgQEAgbmFtZXNwYWNlIEpT
QyB7CiAgICAgICAgIEhhc2hTZXQ8SlNPYmplY3QqPiBhcnJheVZpc2l0ZWRFbGVtZW50czsKIAog
ICAgICAgICBTY29wZU5vZGUqIHNjb3BlTm9kZUJlaW5nUmVwYXJzZWQ7CisgICAgICAgIFN0cmlu
Z2lmaWVyKiBmaXJzdFN0cmluZ2lmaWVyVG9NYXJrOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAg
SlNHbG9iYWxEYXRhKGJvb2wgaXNTaGFyZWQsIGNvbnN0IFZQdHJTZXQmKTsKSW5kZXg6IEphdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNPTk9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlw
dENvcmUvcnVudGltZS9KU09OT2JqZWN0LmNwcAkocmV2aXNpb24gNDQ3ODEpCisrKyBKYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0pTT05PYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiwyMCAr
MjYsMTIgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJKU09OT2JqZWN0LmgiCiAK
KyNpbmNsdWRlICJFcnJvci5oIgogI2luY2x1ZGUgIkV4Y2VwdGlvbkhlbHBlcnMuaCIKICNpbmNs
dWRlICJKU0FycmF5LmgiCi0jaW5jbHVkZSAiSlNGdW5jdGlvbi5oIgotI2luY2x1ZGUgIkxpdGVy
YWxQYXJzZXIuaCIKLSNpbmNsdWRlICJOb2Rlcy5oIgogI2luY2x1ZGUgIlByb3BlcnR5TmFtZUFy
cmF5LmgiCi0KLSNpbmNsdWRlICJPYmplY3RQcm90b3R5cGUuaCIKLSNpbmNsdWRlICJPcGVyYXRp
b25zLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CiAj
aW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAotCiBuYW1lc3BhY2UgSlNDIHsKIAogQVNTRVJU
X0NMQVNTX0ZJVFNfSU5fQ0VMTChKU09OT2JqZWN0KTsKQEAgLTUyLDQ0NyArNDQsNTU1IEBAIHN0
YXRpYyBKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgSlNPTlByb3RvRnUKIAogbmFtZXNwYWNlIEpTQyB7
CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBKU09OT2JqZWN0IC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwg
b2JqZWN0cyBtdXN0IGJlIG9uIHRoZSBzdGFjaywgc2luY2UgdGhlIEpTVmFsdWUgdGhhdCB0aGV5
IGNyZWF0ZSBpcyBub3QgbWFya2VkLgorY2xhc3MgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxs
IHsKK3B1YmxpYzoKKyAgICBQcm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwoY29uc3QgSWRlbnRp
ZmllciYpOworICAgIFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCk7CiAKLWNv
bnN0IENsYXNzSW5mbyBKU09OT2JqZWN0OjppbmZvID0geyAiSlNPTiIsIDAsIDAsIEV4ZWNTdGF0
ZTo6anNvblRhYmxlIH07CisgICAgSlNWYWx1ZSB2YWx1ZShFeGVjU3RhdGUqKSBjb25zdDsKIAot
LyogU291cmNlIGZvciBKU09OT2JqZWN0Lmx1dC5oCi1AYmVnaW4ganNvblRhYmxlCi0gIHN0cmlu
Z2lmeSAgICAgSlNPTlByb3RvRnVuY1N0cmluZ2lmeSAgICAgICAgIERvbnRFbnVtfEZ1bmN0aW9u
IDEKLUBlbmQKLSovCitwcml2YXRlOgorICAgIGNvbnN0IElkZW50aWZpZXIqIG1faWRlbnRpZmll
cjsKKyAgICB1bnNpZ25lZCBtX251bWJlcjsKKyAgICBtdXRhYmxlIEpTVmFsdWUgbV92YWx1ZTsK
K307CiAKLS8vIEVDTUEgMTUuOAorY2xhc3MgU3RyaW5naWZpZXIgOiBOb25jb3B5YWJsZSB7Citw
dWJsaWM6CisgICAgU3RyaW5naWZpZXIoRXhlY1N0YXRlKiwgSlNWYWx1ZSByZXBsYWNlciwgSlNW
YWx1ZSBzcGFjZSk7CisgICAgflN0cmluZ2lmaWVyKCk7CisgICAgSlNWYWx1ZSBzdHJpbmdpZnko
SlNWYWx1ZSk7CiAKLWJvb2wgSlNPTk9iamVjdDo6Z2V0T3duUHJvcGVydHlTbG90KEV4ZWNTdGF0
ZSogZXhlYywgY29uc3QgSWRlbnRpZmllciYgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eVNsb3QmIHNs
b3QpCi17Ci0gICAgY29uc3QgSGFzaEVudHJ5KiBlbnRyeSA9IEV4ZWNTdGF0ZTo6anNvblRhYmxl
KGV4ZWMpLT5lbnRyeShleGVjLCBwcm9wZXJ0eU5hbWUpOworICAgIHZvaWQgbWFyaygpOwogCi0g
ICAgaWYgKCFlbnRyeSkKLSAgICAgICAgcmV0dXJuIEpTT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNs
b3QoZXhlYywgcHJvcGVydHlOYW1lLCBzbG90KTsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBVU3Ry
aW5nIFN0cmluZ0J1aWxkZXI7CiAKLSAgICBBU1NFUlQoZW50cnktPmF0dHJpYnV0ZXMoKSAmIEZ1
bmN0aW9uKTsKLSAgICBzZXRVcFN0YXRpY0Z1bmN0aW9uU2xvdChleGVjLCBlbnRyeSwgdGhpcywg
cHJvcGVydHlOYW1lLCBzbG90KTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBjbGFzcyBIb2xkZXIg
eworICAgIHB1YmxpYzoKKyAgICAgICAgSG9sZGVyKEpTT2JqZWN0Kik7CisKKyAgICAgICAgSlNP
YmplY3QqIG9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0OyB9CisKKyAgICAgICAgYm9v
bCBhcHBlbmROZXh0UHJvcGVydHkoU3RyaW5naWZpZXImLCBTdHJpbmdCdWlsZGVyJik7CisKKyAg
ICBwcml2YXRlOgorICAgICAgICBKU09iamVjdCogY29uc3QgbV9vYmplY3Q7CisgICAgICAgIGNv
bnN0IGJvb2wgbV9pc0FycmF5OworICAgICAgICBib29sIG1faXNKU0FycmF5OworICAgICAgICB1
bnNpZ25lZCBtX2luZGV4OworICAgICAgICB1bnNpZ25lZCBtX3NpemU7CisgICAgICAgIFJlZlB0
cjxQcm9wZXJ0eU5hbWVBcnJheURhdGE+IG1fcHJvcGVydHlOYW1lczsKKyAgICB9OworCisgICAg
ZnJpZW5kIGNsYXNzIEhvbGRlcjsKKworICAgIHN0YXRpYyB2b2lkIGFwcGVuZFF1b3RlZFN0cmlu
ZyhTdHJpbmdCdWlsZGVyJiwgY29uc3QgVVN0cmluZyYpOworCisgICAgSlNWYWx1ZSB0b0pTT04o
SlNWYWx1ZSwgY29uc3QgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsJik7CisKKyAgICBlbnVt
IFN0cmluZ2lmeVJlc3VsdCB7IFN0cmluZ2lmeUZhaWxlZCwgU3RyaW5naWZ5U3VjY2VlZGVkLCBT
dHJpbmdpZnlGYWlsZWREdWVUb1VuZGVmaW5lZFZhbHVlIH07CisgICAgU3RyaW5naWZ5UmVzdWx0
IGFwcGVuZFN0cmluZ2lmaWVkVmFsdWUoU3RyaW5nQnVpbGRlciYsIEpTVmFsdWUsIEpTT2JqZWN0
KiBob2xkZXIsIGNvbnN0IFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbCYpOworCisgICAgYm9v
bCB3aWxsSW5kZW50KCkgY29uc3Q7CisgICAgdm9pZCBpbmRlbnQoKTsKKyAgICB2b2lkIHVuaW5k
ZW50KCk7CisgICAgdm9pZCBzdGFydE5ld0xpbmUoU3RyaW5nQnVpbGRlciYpIGNvbnN0OworCisg
ICAgU3RyaW5naWZpZXIqIGNvbnN0IG1fbmV4dFN0cmluZ2lmaWVyVG9NYXJrOworICAgIEV4ZWNT
dGF0ZSogY29uc3QgbV9leGVjOworICAgIGNvbnN0IEpTVmFsdWUgbV9yZXBsYWNlcjsKKyAgICBi
b29sIG1fdXNpbmdBcnJheVJlcGxhY2VyOworICAgIFByb3BlcnR5TmFtZUFycmF5IG1fYXJyYXlS
ZXBsYWNlclByb3BlcnR5TmFtZXM7CisgICAgQ2FsbFR5cGUgbV9yZXBsYWNlckNhbGxUeXBlOwor
ICAgIENhbGxEYXRhIG1fcmVwbGFjZXJDYWxsRGF0YTsKKyAgICBjb25zdCBVU3RyaW5nIG1fZ2Fw
OworCisgICAgSGFzaFNldDxKU09iamVjdCo+IG1faG9sZGVyQ3ljbGVEZXRlY3RvcjsKKyAgICBW
ZWN0b3I8SG9sZGVyLCAxNj4gbV9ob2xkZXJTdGFjazsKKyAgICBVU3RyaW5nIG1fcmVwZWF0ZWRH
YXA7CisgICAgVVN0cmluZyBtX2luZGVudDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSBoZWxwZXIgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCisKK3N0YXRpYyBpbmxpbmUgSlNWYWx1ZSB1bndyYXBOdW1iZXJPclN0cmluZyhKU1ZhbHVl
IHZhbHVlKQoreworICAgIGlmICghdmFsdWUuaXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIHZh
bHVlOworICAgIGlmICghYXNPYmplY3QodmFsdWUpLT5pbmhlcml0cygmTnVtYmVyT2JqZWN0Ojpp
bmZvKSAmJiAhYXNPYmplY3QodmFsdWUpLT5pbmhlcml0cygmU3RyaW5nT2JqZWN0OjppbmZvKSkK
KyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxKU1dyYXBwZXJP
YmplY3QqPihhc09iamVjdCh2YWx1ZSkpLT5pbnRlcm5hbFZhbHVlKCk7CiB9CiAKLWNsYXNzIFN0
cmluZ2lmaWVyIHsKLSAgICB0eXBlZGVmIFVTdHJpbmcgU3RyaW5nQnVpbGRlcjsKLSAgICAvLyA8
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI2Mjc2PiBhcmJpdHJhcnkg
bGltaXRzIGZvciByZWN1cnNpb24KLSAgICAvLyBhcmUgYmFkCi0gICAgZW51bSB7IE1heE9iamVj
dERlcHRoID0gNTEyIH07Ci1wdWJsaWM6Ci0gICAgU3RyaW5naWZpZXIoRXhlY1N0YXRlKiBleGVj
LCBKU1ZhbHVlIHJlcGxhY2VyLCBjb25zdCBVU3RyaW5nJiBnYXApCi0gICAgICAgIDogbV9leGVj
KGV4ZWMpCi0gICAgICAgICwgbV9yZXBsYWNlcihyZXBsYWNlcikKLSAgICAgICAgLCBtX2dhcChn
YXApCi0gICAgICAgICwgbV9hcnJheVJlcGxhY2VyUHJvcGVydHlOYW1lcyhleGVjKQotICAgICAg
ICAsIG1fdXNpbmdBcnJheVJlcGxhY2VyKGZhbHNlKQotICAgICAgICAsIG1fcmVwbGFjZXJDYWxs
VHlwZShDYWxsVHlwZU5vbmUpCi0gICAgewotICAgICAgICBpZiAobV9yZXBsYWNlci5pc09iamVj
dCgpKSB7Ci0gICAgICAgICAgICBpZiAoYXNPYmplY3QobV9yZXBsYWNlciktPmluaGVyaXRzKCZK
U0FycmF5OjppbmZvKSkgewotICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBhcnJheSA9IGFzT2Jq
ZWN0KG1fcmVwbGFjZXIpOwotICAgICAgICAgICAgICAgIGJvb2wgaXNSZWFsSlNBcnJheSA9IGlz
SlNBcnJheSgmbV9leGVjLT5nbG9iYWxEYXRhKCksIG1fcmVwbGFjZXIpOwotICAgICAgICAgICAg
ICAgIHVuc2lnbmVkIGxlbmd0aCA9IGFycmF5LT5nZXQobV9leGVjLCBtX2V4ZWMtPmdsb2JhbERh
dGEoKS5wcm9wZXJ0eU5hbWVzLT5sZW5ndGgpLnRvVUludDMyKG1fZXhlYyk7Ci0gICAgICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIEpTVmFsdWUgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVhbEpT
QXJyYXkgJiYgYXNBcnJheShhcnJheSktPmNhbkdldEluZGV4KGkpKQotICAgICAgICAgICAgICAg
ICAgICAgICAgbmFtZSA9IGFzQXJyYXkoYXJyYXkpLT5nZXRJbmRleChpKTsKLSAgICAgICAgICAg
ICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXJyYXktPmdl
dChtX2V4ZWMsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWMtPmhhZEV4Y2Vw
dGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pc1N0cmluZygpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgVVN0
cmluZyBwcm9wZXJ0eU5hbWUgPSBuYW1lLnRvU3RyaW5nKG1fZXhlYyk7Ci0gICAgICAgICAgICAg
ICAgICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgbV9hcnJheVJlcGxhY2VyUHJvcGVydHlOYW1l
cy5hZGQoSWRlbnRpZmllcihtX2V4ZWMsIHByb3BlcnR5TmFtZSkpOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICBtX3VzaW5nQXJyYXlSZXBsYWNlciA9IHRydWU7Ci0gICAgICAg
ICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBtX3JlcGxhY2VyQ2FsbFR5cGUgPSBhc09iamVj
dChtX3JlcGxhY2VyKS0+Z2V0Q2FsbERhdGEobV9yZXBsYWNlckNhbGxEYXRhKTsKLSAgICAgICAg
fQorc3RhdGljIGlubGluZSBVU3RyaW5nIGdhcChKU1ZhbHVlIHNwYWNlKQoreworICAgIHNwYWNl
ID0gdW53cmFwTnVtYmVyT3JTdHJpbmcoc3BhY2UpOworCisgICAgLy8gSWYgdGhlIHNwYWNlIHZh
bHVlIGlzIGEgbnVtYmVyLCBjcmVhdGUgYSBnYXAgc3RyaW5nIHdpdGggdGhhdCBudW1iZXIgb2Yg
c3BhY2VzLgorICAgIGRvdWJsZSBzcGFjZUNvdW50OworICAgIGlmIChzcGFjZS5nZXROdW1iZXIo
c3BhY2VDb3VudCkpIHsKKyAgICAgICAgY29uc3QgaW50IG1heFNwYWNlQ291bnQgPSAxMDA7Cisg
ICAgICAgIGludCBjb3VudDsKKyAgICAgICAgaWYgKHNwYWNlQ291bnQgPiBtYXhTcGFjZUNvdW50
KQorICAgICAgICAgICAgY291bnQgPSBtYXhTcGFjZUNvdW50OworICAgICAgICBlbHNlIGlmICgh
KHNwYWNlQ291bnQgPiAwKSkKKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgY291bnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHNwYWNlQ291bnQpOworICAgICAg
ICBVQ2hhciBzcGFjZXNbbWF4U3BhY2VDb3VudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgY291bnQ7ICsraSkKKyAgICAgICAgICAgIHNwYWNlc1tpXSA9ICcgJzsKKyAgICAgICAgcmV0
dXJuIFVTdHJpbmcoc3BhY2VzLCBjb3VudCk7CiAgICAgfQogCi0gICAgSlNWYWx1ZSBzdHJpbmdp
ZnkoSlNWYWx1ZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIEpTT2JqZWN0KiBvYmogPSBjb25zdHJ1
Y3RFbXB0eU9iamVjdChtX2V4ZWMpOwotICAgICAgICBpZiAobV9leGVjLT5oYWRFeGNlcHRpb24o
KSkKLSAgICAgICAgICAgIHJldHVybiBqc051bGwoKTsKKyAgICAvLyBJZiB0aGUgc3BhY2UgdmFs
dWUgaXMgYSBzdHJpbmcsIHVzZSBpdCBhcyB0aGUgZ2FwIHN0cmluZywgb3RoZXJ3aXNlIHVzZSBu
byBnYXAgc3RyaW5nLgorICAgIHJldHVybiBzcGFjZS5nZXRTdHJpbmcoKTsKK30KIAotICAgICAg
ICBJZGVudGlmaWVyIGVtcHR5SWRlbnQobV9leGVjLCAiIik7Ci0gICAgICAgIG9iai0+cHV0RGly
ZWN0KGVtcHR5SWRlbnQsIHZhbHVlKTsKLSAgICAgICAgU3RyaW5nS2V5R2VuZXJhdG9yIGtleShl
bXB0eUlkZW50KTsKLSAgICAgICAgdmFsdWUgPSB0b0pTT05WYWx1ZShrZXksIHZhbHVlKTsKLSAg
ICAgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICByZXR1cm4ganNO
dWxsKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgICAg
IGlmICghc3RyaW5naWZ5KGJ1aWxkZXIsIG9iaiwga2V5LCB2YWx1ZSkpCi0gICAgICAgICAgICBy
ZXR1cm4ganNVbmRlZmluZWQoKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQ
cm9wZXJ0eU5hbWVGb3JGdW5jdGlvbkNhbGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KIAotICAgICAgICByZXR1cm4gKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpPyBtX2V4ZWMtPmV4
Y2VwdGlvbigpIDoganNTdHJpbmcobV9leGVjLCBidWlsZGVyKTsKK2lubGluZSBQcm9wZXJ0eU5h
bWVGb3JGdW5jdGlvbkNhbGw6OlByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbChjb25zdCBJZGVu
dGlmaWVyJiBpZGVudGlmaWVyKQorICAgIDogbV9pZGVudGlmaWVyKCZpZGVudGlmaWVyKQorewor
fQorCitpbmxpbmUgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsOjpQcm9wZXJ0eU5hbWVGb3JG
dW5jdGlvbkNhbGwodW5zaWduZWQgbnVtYmVyKQorICAgIDogbV9pZGVudGlmaWVyKDApCisgICAg
LCBtX251bWJlcihudW1iZXIpCit7Cit9CisKK0pTVmFsdWUgUHJvcGVydHlOYW1lRm9yRnVuY3Rp
b25DYWxsOjp2YWx1ZShFeGVjU3RhdGUqIGV4ZWMpIGNvbnN0Cit7CisgICAgaWYgKCFtX3ZhbHVl
KSB7CisgICAgICAgIGlmIChtX2lkZW50aWZpZXIpCisgICAgICAgICAgICBtX3ZhbHVlID0ganNT
dHJpbmcoZXhlYywgbV9pZGVudGlmaWVyLT51c3RyaW5nKCkpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBtX3ZhbHVlID0ganNOdW1iZXIoZXhlYywgbV9udW1iZXIpOwogICAgIH0KKyAgICBy
ZXR1cm4gbV92YWx1ZTsKK30KIAotcHJpdmF0ZToKLSAgICB2b2lkIGFwcGVuZFN0cmluZyhTdHJp
bmdCdWlsZGVyJiBidWlsZGVyLCBjb25zdCBVU3RyaW5nJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAg
IGludCBsZW5ndGggPSB2YWx1ZS5zaXplKCk7Ci0gICAgICAgIGNvbnN0IFVDaGFyKiBkYXRhID0g
dmFsdWUuZGF0YSgpOwotICAgICAgICBidWlsZGVyLnJlc2VydmVDYXBhY2l0eShidWlsZGVyLnNp
emUoKSArIGxlbmd0aCArIDIgKyA4KTsgLy8gKzIgZm9yICIncyArOCBmb3IgYSBidWZmZXIKLSAg
ICAgICAgYnVpbGRlci5hcHBlbmQoJ1wiJyk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAg
ICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gaW5k
ZXg7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgKGRhdGFbaW5kZXhdID4g
MHgxZiAmJiBkYXRhW2luZGV4XSAhPSAnIicgJiYgZGF0YVtpbmRleF0gIT0gJ1xcJykpCi0gICAg
ICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGRhdGEgKyBz
dGFydCwgaW5kZXggLSBzdGFydCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGgpIHsK
LSAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YVtpbmRleF0pewotICAgICAgICAgICAgICAgICAg
ICBjYXNlICdcdCc6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIHRhYltdID0geydc
XCcsJ3QnfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRhYiwgMik7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICBjYXNlICdccic6IHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IFVDaGFyIGNyW10gPSB7J1xcJywncid9OwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRl
ci5hcHBlbmQoY3IsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOiB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBVQ2hhciBubFtdID0geydcXCcsJ24nfTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5sLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
J1xmJzogewotICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgdGFiW10gPSB7J1xcJywnZid9
OyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRhYiwgMik7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICBjYXNlICdcYic6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFy
IGJzW10gPSB7J1xcJywnYid9OwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBl
bmQoYnMsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOiB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBVQ2hhciBxdW90ZVtdID0geydcXCcsJyInfTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKHF1b3RlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
J1xcJzogewotICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgc2xhc2hbXSA9IHsnXFwnLCAn
XFwnfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHNsYXNoLCAyKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQg
Y2ggPSAoaW50KWRhdGFbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNv
bnN0IGNoYXIqIGhleFN0ciA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIFVDaGFyIG9jdFtdID0geydcXCcsICd1JywgaGV4U3RyWyhjaCA+PiAxMikgJiAxNV0s
IGhleFN0clsoY2ggPj4gOCkgJiAxNV0sIGhleFN0clsoY2ggPj4gNCkgJiAxNV0sIGhleFN0clso
Y2ggPj4gMCkgJiAxNV19OwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQo
b2N0LCBzaXplb2Yob2N0KSAvIHNpemVvZihVQ2hhcikpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0g
ICAgICAgICAgICB9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RyaW5naWZp
ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3RyaW5naWZpZXI6OlN0cmlu
Z2lmaWVyKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSByZXBsYWNlciwgSlNWYWx1ZSBzcGFjZSkK
KyAgICA6IG1fbmV4dFN0cmluZ2lmaWVyVG9NYXJrKGV4ZWMtPmdsb2JhbERhdGEoKS5maXJzdFN0
cmluZ2lmaWVyVG9NYXJrKQorICAgICwgbV9leGVjKGV4ZWMpCisgICAgLCBtX3JlcGxhY2VyKHJl
cGxhY2VyKQorICAgICwgbV91c2luZ0FycmF5UmVwbGFjZXIoZmFsc2UpCisgICAgLCBtX2FycmF5
UmVwbGFjZXJQcm9wZXJ0eU5hbWVzKGV4ZWMpCisgICAgLCBtX3JlcGxhY2VyQ2FsbFR5cGUoQ2Fs
bFR5cGVOb25lKQorICAgICwgbV9nYXAoZ2FwKHNwYWNlKSkKK3sKKyAgICBleGVjLT5nbG9iYWxE
YXRhKCkuZmlyc3RTdHJpbmdpZmllclRvTWFyayA9IHRoaXM7CisKKyAgICBpZiAoIW1fcmVwbGFj
ZXIuaXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGFzT2JqZWN0KG1fcmVw
bGFjZXIpLT5pbmhlcml0cygmSlNBcnJheTo6aW5mbykpIHsKKyAgICAgICAgbV91c2luZ0FycmF5
UmVwbGFjZXIgPSB0cnVlOworICAgICAgICBKU09iamVjdCogYXJyYXkgPSBhc09iamVjdChtX3Jl
cGxhY2VyKTsKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gYXJyYXktPmdldChleGVjLCBleGVj
LT5nbG9iYWxEYXRhKCkucHJvcGVydHlOYW1lcy0+bGVuZ3RoKS50b1VJbnQzMihleGVjKTsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAg
ICBKU1ZhbHVlIG5hbWUgPSBhcnJheS0+Z2V0KGV4ZWMsIGkpOworICAgICAgICAgICAgaWYgKGV4
ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
VVN0cmluZyBwcm9wZXJ0eU5hbWU7CisgICAgICAgICAgICBpZiAoIW5hbWUuZ2V0U3RyaW5nKHBy
b3BlcnR5TmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAo
ZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgbV9hcnJheVJlcGxhY2VyUHJvcGVydHlOYW1lcy5hZGQoSWRlbnRpZmllcihleGVjLCBwcm9w
ZXJ0eU5hbWUpKTsKICAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFwcGVuZCgnXCInKTsKKyAg
ICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGNsYXNzIFN0cmluZ0tleUdlbmVyYXRvciB7Ci0g
ICAgcHVibGljOgotICAgICAgICBTdHJpbmdLZXlHZW5lcmF0b3IoY29uc3QgSWRlbnRpZmllciYg
cHJvcGVydHkpCi0gICAgICAgICAgICA6IG1fcHJvcGVydHkocHJvcGVydHkpCi0gICAgICAgIHsK
LSAgICAgICAgfQotICAgICAgICBKU1ZhbHVlIGdldEtleShFeGVjU3RhdGUqIGV4ZWMpIHsgaWYg
KCFtX2tleSkgbV9rZXkgPSBqc1N0cmluZyhleGVjLCBtX3Byb3BlcnR5LnVzdHJpbmcoKSk7IHJl
dHVybiBtX2tleTsgIH0KKyAgICBtX3JlcGxhY2VyQ2FsbFR5cGUgPSBhc09iamVjdChtX3JlcGxh
Y2VyKS0+Z2V0Q2FsbERhdGEobV9yZXBsYWNlckNhbGxEYXRhKTsKK30KIAotICAgIHByaXZhdGU6
Ci0gICAgICAgIElkZW50aWZpZXIgbV9wcm9wZXJ0eTsKLSAgICAgICAgSlNWYWx1ZSBtX2tleTsK
LSAgICB9OworU3RyaW5naWZpZXI6On5TdHJpbmdpZmllcigpCit7CisgICAgQVNTRVJUKG1fZXhl
Yy0+Z2xvYmFsRGF0YSgpLmZpcnN0U3RyaW5naWZpZXJUb01hcmsgPT0gdGhpcyk7CisgICAgbV9l
eGVjLT5nbG9iYWxEYXRhKCkuZmlyc3RTdHJpbmdpZmllclRvTWFyayA9IG1fbmV4dFN0cmluZ2lm
aWVyVG9NYXJrOworfQogCi0gICAgY2xhc3MgSW50S2V5R2VuZXJhdG9yIHsKLSAgICBwdWJsaWM6
Ci0gICAgICAgIEludEtleUdlbmVyYXRvcih1aW50MzJfdCBwcm9wZXJ0eSkKLSAgICAgICAgICAg
IDogbV9wcm9wZXJ0eShwcm9wZXJ0eSkKLSAgICAgICAgewordm9pZCBTdHJpbmdpZmllcjo6bWFy
aygpCit7CisgICAgZm9yIChTdHJpbmdpZmllciogc3RyaW5naWZpZXIgPSB0aGlzOyBzdHJpbmdp
Zmllcjsgc3RyaW5naWZpZXIgPSBzdHJpbmdpZmllci0+bV9uZXh0U3RyaW5naWZpZXJUb01hcmsp
IHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtX2hvbGRlclN0YWNrLnNpemUoKTsKKyAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIEpTT2JqZWN0
KiBvYmplY3QgPSBtX2hvbGRlclN0YWNrW2ldLm9iamVjdCgpOworICAgICAgICAgICAgaWYgKCFv
YmplY3QtPm1hcmtlZCgpKQorICAgICAgICAgICAgICAgIG9iamVjdC0+bWFyaygpOwogICAgICAg
ICB9Ci0gICAgICAgIEpTVmFsdWUgZ2V0S2V5KEV4ZWNTdGF0ZSogZXhlYykgeyBpZiAoIW1fa2V5
KSBtX2tleSA9IGpzTnVtYmVyKGV4ZWMsIG1fcHJvcGVydHkpOyByZXR1cm4gbV9rZXk7ICB9Cisg
ICAgfQorfQogCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdWludDMyX3QgbV9wcm9wZXJ0eTsKLSAg
ICAgICAgSlNWYWx1ZSBtX2tleTsKLSAgICB9OworSlNWYWx1ZSBTdHJpbmdpZmllcjo6c3RyaW5n
aWZ5KEpTVmFsdWUgdmFsdWUpCit7CisgICAgSlNPYmplY3QqIG9iamVjdCA9IGNvbnN0cnVjdEVt
cHR5T2JqZWN0KG1fZXhlYyk7CisgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAg
ICAgIHJldHVybiBqc051bGwoKTsKKworICAgIFByb3BlcnR5TmFtZUZvckZ1bmN0aW9uQ2FsbCBl
bXB0eVByb3BlcnR5TmFtZShtX2V4ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0eU5hbWVzLT5lbXB0
eUlkZW50aWZpZXIpOworICAgIG9iamVjdC0+cHV0RGlyZWN0KG1fZXhlYy0+Z2xvYmFsRGF0YSgp
LnByb3BlcnR5TmFtZXMtPmVtcHR5SWRlbnRpZmllciwgdmFsdWUpOworCisgICAgU3RyaW5nQnVp
bGRlciByZXN1bHQ7CisgICAgaWYgKGFwcGVuZFN0cmluZ2lmaWVkVmFsdWUocmVzdWx0LCB2YWx1
ZSwgb2JqZWN0LCBlbXB0eVByb3BlcnR5TmFtZSkgIT0gU3RyaW5naWZ5U3VjY2VlZGVkKQorICAg
ICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICBpZiAobV9leGVjLT5oYWRFeGNlcHRpb24o
KSkKKyAgICAgICAgcmV0dXJuIGpzTnVsbCgpOwogCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEtl
eUdlbmVyYXRvcj4gSlNWYWx1ZSB0b0pTT05WYWx1ZShLZXlHZW5lcmF0b3ImIGpzS2V5LCBKU1Zh
bHVlIGpzVmFsdWUpCi0gICAgewotICAgICAgICBBU1NFUlQoIW1fZXhlYy0+aGFkRXhjZXB0aW9u
KCkpOwotICAgICAgICBpZiAoIWpzVmFsdWUuaXNPYmplY3QoKSB8fCAhYXNPYmplY3QoanNWYWx1
ZSktPmhhc1Byb3BlcnR5KG1fZXhlYywgbV9leGVjLT5nbG9iYWxEYXRhKCkucHJvcGVydHlOYW1l
cy0+dG9KU09OKSkKLSAgICAgICAgICAgIHJldHVybiBqc1ZhbHVlOworICAgIHJldHVybiBqc1N0
cmluZyhtX2V4ZWMsIHJlc3VsdCk7Cit9CiAKLSAgICAgICAgSlNWYWx1ZSBqc1RvSlNPTiA9IGFz
T2JqZWN0KGpzVmFsdWUpLT5nZXQobV9leGVjLCBtX2V4ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0
eU5hbWVzLT50b0pTT04pOwordm9pZCBTdHJpbmdpZmllcjo6YXBwZW5kUXVvdGVkU3RyaW5nKFN0
cmluZ0J1aWxkZXImIGJ1aWxkZXIsIGNvbnN0IFVTdHJpbmcmIHZhbHVlKQoreworICAgIGludCBs
ZW5ndGggPSB2YWx1ZS5zaXplKCk7CiAKLSAgICAgICAgaWYgKCFqc1RvSlNPTi5pc09iamVjdCgp
KQotICAgICAgICAgICAgcmV0dXJuIGpzVmFsdWU7CisgICAgLy8gU3RyaW5nIGxlbmd0aCBwbHVz
IDIgZm9yIHF1b3RlIG1hcmtzIHBsdXMgOCBzbyB3ZSBjYW4gYWNjb21vZGF0ZSBhIGZldyBlc2Nh
cGVkIGNoYXJhY3RlcnMuCisgICAgYnVpbGRlci5yZXNlcnZlQ2FwYWNpdHkoYnVpbGRlci5zaXpl
KCkgKyBsZW5ndGggKyAyICsgOCk7CiAKLSAgICAgICAgaWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9u
KCkpCi0gICAgICAgICAgICByZXR1cm4ganNOdWxsKCk7CisgICAgYnVpbGRlci5hcHBlbmQoJyIn
KTsKIAotICAgICAgICBKU09iamVjdCogb2JqZWN0ID0gYXNPYmplY3QoanNUb0pTT04pOwotICAg
ICAgICBDYWxsRGF0YSBjYWxsRGF0YTsKLSAgICAgICAgQ2FsbFR5cGUgY2FsbFR5cGUgPSBvYmpl
Y3QtPmdldENhbGxEYXRhKGNhbGxEYXRhKTsKKyAgICBjb25zdCBVQ2hhciogZGF0YSA9IHZhbHVl
LmRhdGEoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAg
IGludCBzdGFydCA9IGk7CisgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIChkYXRhW2ldID4g
MHgxRiAmJiBkYXRhW2ldICE9ICciJyAmJiBkYXRhW2ldICE9ICdcXCcpKQorICAgICAgICAgICAg
KytpOworICAgICAgICBidWlsZGVyLmFwcGVuZChkYXRhICsgc3RhcnQsIGkgLSBzdGFydCk7Cisg
ICAgICAgIGlmIChpID49IGxlbmd0aCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0
Y2ggKGRhdGFbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICBi
dWlsZGVyLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgndCcp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAg
ICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKCdyJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdc
bic6CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xcJyk7CisgICAgICAgICAgICAg
ICAgYnVpbGRlci5hcHBlbmQoJ24nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXFwnKTsKKyAg
ICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnZicpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5k
KCdcXCcpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdiJyk7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBidWls
ZGVyLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBw
ZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBoZXhEaWdpdHNbXSA9ICIwMTIzNDU2
Nzg5YWJjZGVmIjsKKyAgICAgICAgICAgICAgICBVQ2hhciBjaCA9IGRhdGFbaV07CisgICAgICAg
ICAgICAgICAgVUNoYXIgaGV4W10gPSB7ICdcXCcsICd1JywgaGV4RGlnaXRzWyhjaCA+PiAxMikg
JiAweEZdLCBoZXhEaWdpdHNbKGNoID4+IDgpICYgMHhGXSwgaGV4RGlnaXRzWyhjaCA+PiA0KSAm
IDB4Rl0sIGhleERpZ2l0c1tjaCAmIDB4Rl0gfTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFw
cGVuZChoZXgsIHNpemVvZihoZXgpIC8gc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgaWYgKGNhbGxUeXBlID09IENhbGxU
eXBlTm9uZSkKLSAgICAgICAgICAgIHJldHVybiBqc1ZhbHVlOworICAgIGJ1aWxkZXIuYXBwZW5k
KCciJyk7Cit9CiAKLSAgICAgICAgSlNWYWx1ZSBsaXN0W10gPSB7IGpzS2V5LmdldEtleShtX2V4
ZWMpIH07ICAgICAgICAKK2lubGluZSBKU1ZhbHVlIFN0cmluZ2lmaWVyOjp0b0pTT04oSlNWYWx1
ZSB2YWx1ZSwgY29uc3QgUHJvcGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsJiBwcm9wZXJ0eU5hbWUp
Cit7CisgICAgQVNTRVJUKCFtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKTsKKyAgICBpZiAoIXZhbHVl
LmlzT2JqZWN0KCkgfHwgIWFzT2JqZWN0KHZhbHVlKS0+aGFzUHJvcGVydHkobV9leGVjLCBtX2V4
ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0eU5hbWVzLT50b0pTT04pKQorICAgICAgICByZXR1cm4g
dmFsdWU7CisKKyAgICBKU1ZhbHVlIHRvSlNPTkZ1bmN0aW9uID0gYXNPYmplY3QodmFsdWUpLT5n
ZXQobV9leGVjLCBtX2V4ZWMtPmdsb2JhbERhdGEoKS5wcm9wZXJ0eU5hbWVzLT50b0pTT04pOwor
ICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4ganNOdWxsKCk7
CisKKyAgICBpZiAoIXRvSlNPTkZ1bmN0aW9uLmlzT2JqZWN0KCkpCisgICAgICAgIHJldHVybiB2
YWx1ZTsKKworICAgIEpTT2JqZWN0KiBvYmplY3QgPSBhc09iamVjdCh0b0pTT05GdW5jdGlvbik7
CisgICAgQ2FsbERhdGEgY2FsbERhdGE7CisgICAgQ2FsbFR5cGUgY2FsbFR5cGUgPSBvYmplY3Qt
PmdldENhbGxEYXRhKGNhbGxEYXRhKTsKKyAgICBpZiAoY2FsbFR5cGUgPT0gQ2FsbFR5cGVOb25l
KQorICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICBKU1ZhbHVlIGxpc3RbXSA9IHsgcHJvcGVy
dHlOYW1lLnZhbHVlKG1fZXhlYykgfTsKKyAgICBBcmdMaXN0IGFyZ3MobGlzdCwgc2l6ZW9mKGxp
c3QpIC8gc2l6ZW9mKEpTVmFsdWUpKTsKKyAgICByZXR1cm4gY2FsbChtX2V4ZWMsIG9iamVjdCwg
Y2FsbFR5cGUsIGNhbGxEYXRhLCB2YWx1ZSwgYXJncyk7Cit9CisKK1N0cmluZ2lmaWVyOjpTdHJp
bmdpZnlSZXN1bHQgU3RyaW5naWZpZXI6OmFwcGVuZFN0cmluZ2lmaWVkVmFsdWUoU3RyaW5nQnVp
bGRlciYgYnVpbGRlciwgSlNWYWx1ZSB2YWx1ZSwgSlNPYmplY3QqIGhvbGRlciwgY29uc3QgUHJv
cGVydHlOYW1lRm9yRnVuY3Rpb25DYWxsJiBwcm9wZXJ0eU5hbWUpCit7CisgICAgLy8gQ2FsbCB0
aGUgdG9KU09OIGZ1bmN0aW9uLgorICAgIHZhbHVlID0gdG9KU09OKHZhbHVlLCBwcm9wZXJ0eU5h
bWUpOworICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gU3Ry
aW5naWZ5RmFpbGVkOworICAgIGlmICh2YWx1ZS5pc1VuZGVmaW5lZCgpICYmICFob2xkZXItPmlu
aGVyaXRzKCZKU0FycmF5OjppbmZvKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZ2lmeUZhaWxlZER1
ZVRvVW5kZWZpbmVkVmFsdWU7CisKKyAgICAvLyBDYWxsIHRoZSByZXBsYWNlciBmdW5jdGlvbi4K
KyAgICBpZiAobV9yZXBsYWNlckNhbGxUeXBlICE9IENhbGxUeXBlTm9uZSkgeworICAgICAgICBK
U1ZhbHVlIGxpc3RbXSA9IHsgcHJvcGVydHlOYW1lLnZhbHVlKG1fZXhlYyksIHZhbHVlIH07CiAg
ICAgICAgIEFyZ0xpc3QgYXJncyhsaXN0LCBzaXplb2YobGlzdCkgLyBzaXplb2YoSlNWYWx1ZSkp
OwotICAgICAgICByZXR1cm4gY2FsbChtX2V4ZWMsIG9iamVjdCwgY2FsbFR5cGUsIGNhbGxEYXRh
LCBqc1ZhbHVlLCBhcmdzKTsKKyAgICAgICAgdmFsdWUgPSBjYWxsKG1fZXhlYywgbV9yZXBsYWNl
ciwgbV9yZXBsYWNlckNhbGxUeXBlLCBtX3JlcGxhY2VyQ2FsbERhdGEsIGhvbGRlciwgYXJncyk7
CisgICAgICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAgICAgcmV0dXJu
IFN0cmluZ2lmeUZhaWxlZDsKICAgICB9CiAKLSAgICBib29sIHN0cmluZ2lmeUFycmF5KFN0cmlu
Z0J1aWxkZXImIGJ1aWxkZXIsIEpTQXJyYXkqIGFycmF5KQotICAgIHsKLSAgICAgICAgaWYgKG1f
b2JqZWN0U3RhY2suY29udGFpbnMoYXJyYXkpKSB7Ci0gICAgICAgICAgICB0aHJvd0Vycm9yKG1f
ZXhlYywgVHlwZUVycm9yKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQor
ICAgIGlmICh2YWx1ZS5pc051bGwoKSkgeworICAgICAgICBidWlsZGVyLmFwcGVuZCgibnVsbCIp
OworICAgICAgICByZXR1cm4gU3RyaW5naWZ5U3VjY2VlZGVkOworICAgIH0KIAotICAgICAgICBp
ZiAobV9vYmplY3RTdGFjay5zaXplKCkgPiBNYXhPYmplY3REZXB0aCkgewotICAgICAgICAgICAg
bV9leGVjLT5zZXRFeGNlcHRpb24oY3JlYXRlU3RhY2tPdmVyZmxvd0Vycm9yKG1fZXhlYykpOwot
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgaWYgKHZhbHVlLmlzQm9v
bGVhbigpKSB7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHZhbHVlLmdldEJvb2xlYW4oKSA/ICJ0
cnVlIiA6ICJmYWxzZSIpOworICAgICAgICByZXR1cm4gU3RyaW5naWZ5U3VjY2VlZGVkOworICAg
IH0KIAotICAgICAgICBtX29iamVjdFN0YWNrLmFkZChhcnJheSk7Ci0gICAgICAgIFVTdHJpbmcg
c3RlcEJhY2sgPSBtX2luZGVudDsKLSAgICAgICAgbV9pbmRlbnQuYXBwZW5kKG1fZ2FwKTsKLSAg
ICAgICAgVmVjdG9yPFN0cmluZ0J1aWxkZXIsIDE2PiBwYXJ0aWFsOwotICAgICAgICB1bnNpZ25l
ZCBsZW4gPSBhcnJheS0+Z2V0KG1fZXhlYywgbV9leGVjLT5nbG9iYWxEYXRhKCkucHJvcGVydHlO
YW1lcy0+bGVuZ3RoKS50b1VJbnQzMihtX2V4ZWMpOwotICAgICAgICBib29sIGlzUmVhbEpTQXJy
YXkgPSBpc0pTQXJyYXkoJm1fZXhlYy0+Z2xvYmFsRGF0YSgpLCBhcnJheSk7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgSlNWYWx1ZSB2
YWx1ZTsKLSAgICAgICAgICAgIGlmIChpc1JlYWxKU0FycmF5ICYmIGFycmF5LT5jYW5HZXRJbmRl
eChpKSkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGFycmF5LT5nZXRJbmRleChpKTsKLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlID0gYXJyYXktPmdldChtX2V4ZWMs
IGkpOwotICAgICAgICAgICAgICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBT
dHJpbmdCdWlsZGVyIHJlc3VsdDsKLSAgICAgICAgICAgIEludEtleUdlbmVyYXRvciBrZXkoaSk7
Ci0gICAgICAgICAgICB2YWx1ZSA9IHRvSlNPTlZhbHVlKGtleSwgdmFsdWUpOwotICAgICAgICAg
ICAgaWYgKHBhcnRpYWwuc2l6ZSgpICYmIG1fZ2FwLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAg
ICBwYXJ0aWFsLmxhc3QoKS5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIGlmICghc3RyaW5naWZ5
KHJlc3VsdCwgYXJyYXksIGtleSwgdmFsdWUpICYmICFtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQot
ICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIm51bGwiKTsKLSAgICAgICAgICAgIGVsc2Ug
aWYgKG1fZXhlYy0+aGFkRXhjZXB0aW9uKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAgICAgcGFydGlhbC5hcHBlbmQocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAg
ICAKLSAgICAgICAgaWYgKHBhcnRpYWwuaXNFbXB0eSgpKQotICAgICAgICAgICAgYnVpbGRlci5h
cHBlbmQoIltdIik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKG1fZ2FwLmlzRW1w
dHkoKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAg
ICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHBhcnRpYWwuc2l6ZSgpOyBpKyspCi0gICAg
ICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnRpYWxbaV0pOwotICAgICAgICAgICAg
ICAgIGJ1aWxkZXIuYXBwZW5kKCddJyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICAgIFVTdHJpbmcgc2VwYXJhdG9yKCIsXG4iKTsKLSAgICAgICAgICAgICAgICBzZXBhcmF0
b3IuYXBwZW5kKG1faW5kZW50KTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiW1xu
Iik7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobV9pbmRlbnQpOwotICAgICAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwYXJ0aWFsLnNpemUoKTsgaSsrKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnRpYWxbaV0pOwotICAgICAgICAg
ICAgICAgICAgICBpZiAoaSA8IHBhcnRpYWwuc2l6ZSgpIC0gMSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIGJ1aWxk
ZXIuYXBwZW5kKHN0ZXBCYWNrKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXScp
OwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgdmFsdWUgPSB1bndyYXBOdW1iZXJPclN0
cmluZyh2YWx1ZSk7CiAKLSAgICAgICAgbV9pbmRlbnQgPSBzdGVwQmFjazsKLSAgICAgICAgbV9v
YmplY3RTdGFjay5yZW1vdmUoYXJyYXkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBVU3Ry
aW5nIHN0cmluZ1ZhbHVlOworICAgIGlmICh2YWx1ZS5nZXRTdHJpbmcoc3RyaW5nVmFsdWUpKSB7
CisgICAgICAgIGFwcGVuZFF1b3RlZFN0cmluZyhidWlsZGVyLCBzdHJpbmdWYWx1ZSk7CisgICAg
ICAgIHJldHVybiBTdHJpbmdpZnlTdWNjZWVkZWQ7CiAgICAgfQogCi0gICAgYm9vbCBzdHJpbmdp
ZnlPYmplY3QoU3RyaW5nQnVpbGRlciYgYnVpbGRlciwgSlNPYmplY3QqIG9iamVjdCkKLSAgICB7
Ci0gICAgICAgIGlmIChtX29iamVjdFN0YWNrLmNvbnRhaW5zKG9iamVjdCkpIHsKLSAgICAgICAg
ICAgIHRocm93RXJyb3IobV9leGVjLCBUeXBlRXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICB9CisgICAgZG91YmxlIG51bWVyaWNWYWx1ZTsKKyAgICBpZiAodmFsdWUu
Z2V0TnVtYmVyKG51bWVyaWNWYWx1ZSkpIHsKKyAgICAgICAgaWYgKCFpc2Zpbml0ZShudW1lcmlj
VmFsdWUpKQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIm51bGwiKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVVN0cmluZzo6ZnJvbShudW1lcmljVmFsdWUp
KTsKKyAgICAgICAgcmV0dXJuIFN0cmluZ2lmeVN1Y2NlZWRlZDsKKyAgICB9CiAKLSAgICAgICAg
aWYgKG1fb2JqZWN0U3RhY2suc2l6ZSgpID4gTWF4T2JqZWN0RGVwdGgpIHsKLSAgICAgICAgICAg
IG1fZXhlYy0+c2V0RXhjZXB0aW9uKGNyZWF0ZVN0YWNrT3ZlcmZsb3dFcnJvcihtX2V4ZWMpKTsK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgIGlmICghdmFsdWUuaXNP
YmplY3QoKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZ2lmeUZhaWxlZDsKIAotICAgICAgICBtX29i
amVjdFN0YWNrLmFkZChvYmplY3QpOwotICAgICAgICBVU3RyaW5nIHN0ZXBCYWNrID0gbV9pbmRl
bnQ7Ci0gICAgICAgIG1faW5kZW50LmFwcGVuZChtX2dhcCk7Ci0gICAgICAgIFZlY3RvcjxTdHJp
bmdCdWlsZGVyLCAxNj4gcGFydGlhbDsKLQotICAgICAgICBQcm9wZXJ0eU5hbWVBcnJheSBvYmpl
Y3RQcm9wZXJ0eU5hbWVzKG1fZXhlYyk7Ci0gICAgICAgIFByb3BlcnR5TmFtZUFycmF5JiBzb3Vy
Y2VQcm9wZXJ0eU5hbWVzKG1fYXJyYXlSZXBsYWNlclByb3BlcnR5TmFtZXMpOwotICAgICAgICBp
ZiAoIW1fdXNpbmdBcnJheVJlcGxhY2VyKSB7Ci0gICAgICAgICAgICBvYmplY3QtPmdldFByb3Bl
cnR5TmFtZXMobV9leGVjLCBvYmplY3RQcm9wZXJ0eU5hbWVzKTsKLSAgICAgICAgICAgIHNvdXJj
ZVByb3BlcnR5TmFtZXMgPSBvYmplY3RQcm9wZXJ0eU5hbWVzOworICAgIEpTT2JqZWN0KiBvYmpl
Y3QgPSBhc09iamVjdCh2YWx1ZSk7CisKKyAgICAvLyBIYW5kbGUgY3ljbGUgZGV0ZWN0aW9uLCBh
bmQgcHV0IHRoZSBob2xkZXIgb24gdGhlIHN0YWNrLgorICAgIGlmICghbV9ob2xkZXJDeWNsZURl
dGVjdG9yLmFkZChvYmplY3QpLnNlY29uZCkgeworICAgICAgICB0aHJvd0Vycm9yKG1fZXhlYywg
VHlwZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZ2lmeUZhaWxlZDsKKyAgICB9CisgICAg
Ym9vbCBob2xkZXJTdGFja1dhc0VtcHR5ID0gbV9ob2xkZXJTdGFjay5pc0VtcHR5KCk7CisgICAg
bV9ob2xkZXJTdGFjay5hcHBlbmQob2JqZWN0KTsKKyAgICBpZiAoIWhvbGRlclN0YWNrV2FzRW1w
dHkpCisgICAgICAgIHJldHVybiBTdHJpbmdpZnlTdWNjZWVkZWQ7CisKKyAgICAvLyBJZiB0aGlz
IGlzIHRoZSBvdXRlcm1vc3QgY2FsbCwgdGhlbiBsb29wIHRvIGhhbmRsZSBldmVyeXRoaW5nIG9u
IHRoZSBob2xkZXIgc3RhY2suCisgICAgVGltZW91dENoZWNrZXIgbG9jYWxUaW1lb3V0Q2hlY2tl
cihtX2V4ZWMtPmdsb2JhbERhdGEoKS50aW1lb3V0Q2hlY2tlcik7CisgICAgbG9jYWxUaW1lb3V0
Q2hlY2tlci5yZXNldCgpOworICAgIHVuc2lnbmVkIHRpY2tDb3VudCA9IGxvY2FsVGltZW91dENo
ZWNrZXIudGlja3NVbnRpbE5leHRDaGVjaygpOworICAgIGRvIHsKKyAgICAgICAgd2hpbGUgKG1f
aG9sZGVyU3RhY2subGFzdCgpLmFwcGVuZE5leHRQcm9wZXJ0eSgqdGhpcywgYnVpbGRlcikpIHsK
KyAgICAgICAgICAgIGlmIChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICAgICAgICAg
IHJldHVybiBTdHJpbmdpZnlGYWlsZWQ7CisgICAgICAgICAgICBpZiAoIS0tdGlja0NvdW50KSB7
CisgICAgICAgICAgICAgICAgaWYgKGxvY2FsVGltZW91dENoZWNrZXIuZGlkVGltZU91dChtX2V4
ZWMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fZXhlYy0+c2V0RXhjZXB0aW9uKGNyZWF0ZUlu
dGVycnVwdGVkRXhlY3V0aW9uRXhjZXB0aW9uKCZtX2V4ZWMtPmdsb2JhbERhdGEoKSkpOworICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5naWZ5RmFpbGVkOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB0aWNrQ291bnQgPSBsb2NhbFRpbWVvdXRDaGVja2VyLnRpY2tz
VW50aWxOZXh0Q2hlY2soKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBtX2hv
bGRlckN5Y2xlRGV0ZWN0b3IucmVtb3ZlKG1faG9sZGVyU3RhY2subGFzdCgpLm9iamVjdCgpKTsK
KyAgICAgICAgbV9ob2xkZXJTdGFjay5yZW1vdmVMYXN0KCk7CisgICAgfSB3aGlsZSAoIW1faG9s
ZGVyU3RhY2suaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gU3RyaW5naWZ5U3VjY2VlZGVkOworfQog
Ci0gICAgICAgIFByb3BlcnR5TmFtZUFycmF5Ojpjb25zdF9pdGVyYXRvciBwcm9wRW5kID0gc291
cmNlUHJvcGVydHlOYW1lcy5lbmQoKTsKLSAgICAgICAgZm9yIChQcm9wZXJ0eU5hbWVBcnJheTo6
Y29uc3RfaXRlcmF0b3IgcHJvcEl0ZXIgPSBzb3VyY2VQcm9wZXJ0eU5hbWVzLmJlZ2luKCk7IHBy
b3BJdGVyICE9IHByb3BFbmQ7IHByb3BJdGVyKyspIHsKLSAgICAgICAgICAgIGlmICghb2JqZWN0
LT5oYXNPd25Qcm9wZXJ0eShtX2V4ZWMsICpwcm9wSXRlcikpCi0gICAgICAgICAgICAgICAgY29u
dGludWU7CitpbmxpbmUgYm9vbCBTdHJpbmdpZmllcjo6d2lsbEluZGVudCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuICFtX2dhcC5pc0VtcHR5KCk7Cit9CiAKLSAgICAgICAgICAgIEpTVmFsdWUgdmFs
dWUgPSBvYmplY3QtPmdldChtX2V4ZWMsICpwcm9wSXRlcik7Ci0gICAgICAgICAgICBpZiAobV9l
eGVjLT5oYWRFeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Citpbmxp
bmUgdm9pZCBTdHJpbmdpZmllcjo6aW5kZW50KCkKK3sKKyAgICAvLyBVc2UgYSBzaW5nbGUgc2hh
cmVkIHN0cmluZywgbV9yZXBlYXRlZEdhcCwgc28gd2UgZG9uJ3Qga2VlcCBhbGxvY2F0aW5nIG5l
dyBvbmVzIGFzIHdlIGluZGVudCBhbmQgdW5pbmRlbnQuCisgICAgaW50IG5ld1NpemUgPSBtX2lu
ZGVudC5zaXplKCkgKyBtX2dhcC5zaXplKCk7CisgICAgaWYgKG5ld1NpemUgPiBtX3JlcGVhdGVk
R2FwLnNpemUoKSkKKyAgICAgICAgbV9yZXBlYXRlZEdhcC5hcHBlbmQobV9nYXApOworICAgIEFT
U0VSVChuZXdTaXplIDw9IG1fcmVwZWF0ZWRHYXAuc2l6ZSgpKTsKKyAgICBtX2luZGVudCA9IG1f
cmVwZWF0ZWRHYXAuc3Vic3RyKDAsIG5ld1NpemUpOworfQogCi0gICAgICAgICAgICBpZiAodmFs
dWUuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKK2lubGluZSB2b2lk
IFN0cmluZ2lmaWVyOjp1bmluZGVudCgpCit7CisgICAgQVNTRVJUKG1faW5kZW50LnNpemUoKSA+
PSBtX2dhcC5zaXplKCkpOworICAgIG1faW5kZW50ID0gbV9yZXBlYXRlZEdhcC5zdWJzdHIoMCwg
bV9pbmRlbnQuc2l6ZSgpIC0gbV9nYXAuc2l6ZSgpKTsKK30KIAotICAgICAgICAgICAgU3RyaW5n
QnVpbGRlciByZXN1bHQ7Ci0gICAgICAgICAgICBhcHBlbmRTdHJpbmcocmVzdWx0LHByb3BJdGVy
LT51c3RyaW5nKCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnOicpOwotICAgICAgICAg
ICAgaWYgKCFtX2dhcC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgn
ICcpOwotICAgICAgICAgICAgU3RyaW5nS2V5R2VuZXJhdG9yIGtleSgqcHJvcEl0ZXIpOwotICAg
ICAgICAgICAgdmFsdWUgPSB0b0pTT05WYWx1ZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGlm
IChtX2V4ZWMtPmhhZEV4Y2VwdGlvbigpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
K2lubGluZSB2b2lkIFN0cmluZ2lmaWVyOjpzdGFydE5ld0xpbmUoU3RyaW5nQnVpbGRlciYgYnVp
bGRlcikgY29uc3QKK3sKKyAgICBpZiAobV9nYXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47
CisgICAgYnVpbGRlci5hcHBlbmQoJ1xuJyk7CisgICAgYnVpbGRlci5hcHBlbmQobV9pbmRlbnQp
OworfQogCi0gICAgICAgICAgICBpZiAodmFsdWUuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKK2lubGluZSBTdHJpbmdpZmllcjo6SG9sZGVyOjpIb2xkZXIoSlNPYmpl
Y3QqIG9iamVjdCkKKyAgICA6IG1fb2JqZWN0KG9iamVjdCkKKyAgICAsIG1faXNBcnJheShvYmpl
Y3QtPmluaGVyaXRzKCZKU0FycmF5OjppbmZvKSkKKyAgICAsIG1faW5kZXgoMCkKK3sKK30KIAot
ICAgICAgICAgICAgc3RyaW5naWZ5KHJlc3VsdCwgb2JqZWN0LCBrZXksIHZhbHVlKTsKLSAgICAg
ICAgICAgIHBhcnRpYWwuYXBwZW5kKHJlc3VsdCk7Ci0gICAgICAgIH0KK2Jvb2wgU3RyaW5naWZp
ZXI6OkhvbGRlcjo6YXBwZW5kTmV4dFByb3BlcnR5KFN0cmluZ2lmaWVyJiBzdHJpbmdpZmllciwg
U3RyaW5nQnVpbGRlciYgYnVpbGRlcikKK3sKKyAgICBBU1NFUlQobV9pbmRleCA8PSBtX3NpemUp
OwogCi0gICAgICAgIGlmIChwYXJ0aWFsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGJ1aWxkZXIu
YXBwZW5kKCJ7fSIpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX2dhcC5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgneycpOwotICAgICAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwYXJ0aWFsLnNpemUoKTsgaSsrKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1
aWxkZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBh
cnRpYWxbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFw
cGVuZCgnfScpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBVU3RyaW5n
IHNlcGFyYXRvcigiLFxuIik7Ci0gICAgICAgICAgICAgICAgc2VwYXJhdG9yLmFwcGVuZChtX2lu
ZGVudCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIntcbiIpOwotICAgICAgICAg
ICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1faW5kZW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcGFydGlhbC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAg
ICAgICBidWlsZGVyLmFwcGVuZChwYXJ0aWFsW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGkgPCBwYXJ0aWFsLnNpemUoKSAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVy
LmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBi
dWlsZGVyLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzdGVw
QmFjayk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ30nKTsKLSAgICAgICAgICAg
IH0KKyAgICBFeGVjU3RhdGUqIGV4ZWMgPSBzdHJpbmdpZmllci5tX2V4ZWM7CiAKKyAgICAvLyBG
aXJzdCB0aW1lIHRocm91Z2gsIGluaXRpYWxpemUuCisgICAgaWYgKCFtX2luZGV4KSB7CisgICAg
ICAgIGlmIChtX2lzQXJyYXkpIHsKKyAgICAgICAgICAgIG1faXNKU0FycmF5ID0gaXNKU0FycmF5
KCZleGVjLT5nbG9iYWxEYXRhKCksIG1fb2JqZWN0KTsKKyAgICAgICAgICAgIG1fc2l6ZSA9IG1f
b2JqZWN0LT5nZXQoZXhlYywgZXhlYy0+Z2xvYmFsRGF0YSgpLnByb3BlcnR5TmFtZXMtPmxlbmd0
aCkudG9VSW50MzIoZXhlYyk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnWycpOworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0cmluZ2lmaWVyLm1fdXNpbmdBcnJheVJl
cGxhY2VyKQorICAgICAgICAgICAgICAgIG1fcHJvcGVydHlOYW1lcyA9IHN0cmluZ2lmaWVyLm1f
YXJyYXlSZXBsYWNlclByb3BlcnR5TmFtZXMuZGF0YSgpOworICAgICAgICAgICAgZWxzZSB7Cisg
ICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lQXJyYXkgb2JqZWN0UHJvcGVydHlOYW1lcyhleGVj
KTsKKyAgICAgICAgICAgICAgICBtX29iamVjdC0+Z2V0UHJvcGVydHlOYW1lcyhleGVjLCBvYmpl
Y3RQcm9wZXJ0eU5hbWVzKTsKKyAgICAgICAgICAgICAgICBtX3Byb3BlcnR5TmFtZXMgPSBvYmpl
Y3RQcm9wZXJ0eU5hbWVzLnJlbGVhc2VEYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBtX3NpemUgPSBtX3Byb3BlcnR5TmFtZXMtPnByb3BlcnR5TmFtZVZlY3RvcigpLnNpemUoKTsK
KyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCd7Jyk7CiAgICAgICAgIH0KKyAgICAgICAgc3Ry
aW5naWZpZXIuaW5kZW50KCk7CisgICAgfQogCi0gICAgICAgIG1faW5kZW50ID0gc3RlcEJhY2s7
Ci0gICAgICAgIG1fb2JqZWN0U3RhY2sucmVtb3ZlKG9iamVjdCk7Ci0gICAgICAgIHJldHVybiB0
cnVlOwotICAgIH0KLSAgICAKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5R2VuZXJhdG9yPiBi
b29sIHN0cmluZ2lmeShTdHJpbmdCdWlsZGVyJiBidWlsZGVyLCBKU1ZhbHVlIGhvbGRlciwgS2V5
R2VuZXJhdG9yIGtleSwgSlNWYWx1ZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3JlcGxh
Y2VyQ2FsbFR5cGUgIT0gQ2FsbFR5cGVOb25lKSB7Ci0gICAgICAgICAgICBKU1ZhbHVlIGxpc3Rb
XSA9IHtrZXkuZ2V0S2V5KG1fZXhlYyksIHZhbHVlfTsKLSAgICAgICAgICAgIEFyZ0xpc3QgYXJn
cyhsaXN0LCBzaXplb2YobGlzdCkgLyBzaXplb2YoSlNWYWx1ZSkpOwotICAgICAgICAgICAgdmFs
dWUgPSBjYWxsKG1fZXhlYywgbV9yZXBsYWNlciwgbV9yZXBsYWNlckNhbGxUeXBlLCBtX3JlcGxh
Y2VyQ2FsbERhdGEsIGhvbGRlciwgYXJncyk7Ci0gICAgICAgICAgICBpZiAobV9leGVjLT5oYWRF
eGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAg
ICAvLyBMYXN0IHRpbWUgdGhyb3VnaCwgZmluaXNoIHVwIGFuZCByZXR1cm4gZmFsc2UuCisgICAg
aWYgKG1faW5kZXggPT0gbV9zaXplKSB7CisgICAgICAgIHN0cmluZ2lmaWVyLnVuaW5kZW50KCk7
CisgICAgICAgIGlmIChtX3NpemUgJiYgYnVpbGRlcltidWlsZGVyLnNpemUoKSAtIDFdICE9ICd7
JykKKyAgICAgICAgICAgIHN0cmluZ2lmaWVyLnN0YXJ0TmV3TGluZShidWlsZGVyKTsKKyAgICAg
ICAgYnVpbGRlci5hcHBlbmQobV9pc0FycmF5ID8gJ10nIDogJ30nKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KIAotICAgICAgICBpZiAodmFsdWUuaXNOdWxsKCkpIHsKLSAgICAgICAg
ICAgIGJ1aWxkZXIuYXBwZW5kKCJudWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAvLyBIYW5kbGUgYSBzaW5nbGUgZWxlbWVudCBvZiB0aGUgYXJyYXkgb3Igb2JqZWN0LgorICAg
IHVuc2lnbmVkIGluZGV4ID0gbV9pbmRleCsrOworICAgIHVuc2lnbmVkIHJvbGxCYWNrUG9pbnQg
PSAwOworICAgIFN0cmluZ2lmeVJlc3VsdCBzdHJpbmdpZnlSZXN1bHQ7CisgICAgaWYgKG1faXNB
cnJheSkgeworICAgICAgICAvLyBHZXQgdGhlIHZhbHVlLgorICAgICAgICBKU1ZhbHVlIHZhbHVl
OworICAgICAgICBpZiAobV9pc0pTQXJyYXkgJiYgYXNBcnJheShtX29iamVjdCktPmNhbkdldElu
ZGV4KGluZGV4KSkKKyAgICAgICAgICAgIHZhbHVlID0gYXNBcnJheShtX29iamVjdCktPmdldElu
ZGV4KGluZGV4KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQcm9wZXJ0eVNsb3Qgc2xv
dChtX29iamVjdCk7CisgICAgICAgICAgICBpZiAoIW1fb2JqZWN0LT5nZXRPd25Qcm9wZXJ0eVNs
b3QoZXhlYywgaW5kZXgsIHNsb3QpKQorICAgICAgICAgICAgICAgIHNsb3Quc2V0VW5kZWZpbmVk
KCk7CisgICAgICAgICAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdmFsdWUgPSBzbG90LmdldFZhbHVlKGV4ZWMs
IGluZGV4KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh2YWx1ZS5pc0Jvb2xlYW4oKSkgewot
ICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWUuZ2V0Qm9vbGVhbigpID8gInRydWUiIDog
ImZhbHNlIik7CisgICAgICAgIC8vIEFwcGVuZCB0aGUgc2VwYXJhdG9yIHN0cmluZy4KKyAgICAg
ICAgaWYgKGluZGV4KQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJywnKTsKKyAgICAgICAg
c3RyaW5naWZpZXIuc3RhcnROZXdMaW5lKGJ1aWxkZXIpOworCisgICAgICAgIC8vIEFwcGVuZCB0
aGUgc3RyaW5naWZpZWQgdmFsdWUuCisgICAgICAgIHN0cmluZ2lmeVJlc3VsdCA9IHN0cmluZ2lm
aWVyLmFwcGVuZFN0cmluZ2lmaWVkVmFsdWUoYnVpbGRlciwgdmFsdWUsIG1fb2JqZWN0LCBpbmRl
eCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZS4KKyAgICAgICAgUHJv
cGVydHlTbG90IHNsb3QobV9vYmplY3QpOworICAgICAgICBJZGVudGlmaWVyJiBwcm9wZXJ0eU5h
bWUgPSBtX3Byb3BlcnR5TmFtZXMtPnByb3BlcnR5TmFtZVZlY3RvcigpW2luZGV4XTsKKyAgICAg
ICAgaWYgKCFtX29iamVjdC0+Z2V0T3duUHJvcGVydHlTbG90KGV4ZWMsIHByb3BlcnR5TmFtZSwg
c2xvdCkpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICBKU1Zh
bHVlIHZhbHVlID0gc2xvdC5nZXRWYWx1ZShleGVjLCBwcm9wZXJ0eU5hbWUpOworICAgICAgICBp
ZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAg
ICAgICAgaWYgKHZhbHVlLmlzT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIGlmIChhc09iamVjdCh2
YWx1ZSktPmluaGVyaXRzKCZOdW1iZXJPYmplY3Q6OmluZm8pIHx8IGFzT2JqZWN0KHZhbHVlKS0+
aW5oZXJpdHMoJlN0cmluZ09iamVjdDo6aW5mbykpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBz
dGF0aWNfY2FzdDxKU1dyYXBwZXJPYmplY3QqPihhc09iamVjdCh2YWx1ZSkpLT5pbnRlcm5hbFZh
bHVlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcm9sbEJhY2tQb2ludCA9IGJ1aWxkZXIuc2l6ZSgp
OwogCi0gICAgICAgIGlmICh2YWx1ZS5pc1N0cmluZygpKSB7Ci0gICAgICAgICAgICBhcHBlbmRT
dHJpbmcoYnVpbGRlciwgdmFsdWUudG9TdHJpbmcobV9leGVjKSk7Ci0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICAvLyBBcHBlbmQgdGhlIHNlcGFyYXRvciBzdHJp
bmcuCisgICAgICAgIGlmIChidWlsZGVyW3JvbGxCYWNrUG9pbnQgLSAxXSAhPSAneycpCisgICAg
ICAgICAgICBidWlsZGVyLmFwcGVuZCgnLCcpOworICAgICAgICBzdHJpbmdpZmllci5zdGFydE5l
d0xpbmUoYnVpbGRlcik7CisKKyAgICAgICAgLy8gQXBwZW5kIHRoZSBwcm9wZXJ0eSBuYW1lLgor
ICAgICAgICBhcHBlbmRRdW90ZWRTdHJpbmcoYnVpbGRlciwgcHJvcGVydHlOYW1lLnVzdHJpbmco
KSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCc6Jyk7CisgICAgICAgIGlmIChzdHJpbmdpZmll
ci53aWxsSW5kZW50KCkpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwogCi0gICAg
ICAgIGlmICh2YWx1ZS5pc051bWJlcigpKSB7Ci0gICAgICAgICAgICBkb3VibGUgdiA9IHZhbHVl
LnRvTnVtYmVyKG1fZXhlYyk7Ci0gICAgICAgICAgICBpZiAoIWlzZmluaXRlKHYpKQotICAgICAg
ICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJudWxsIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVVN0cmluZzo6ZnJvbSh2KSk7Ci0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICAvLyBBcHBlbmQgdGhlIHN0cmluZ2lm
aWVkIHZhbHVlLgorICAgICAgICBzdHJpbmdpZnlSZXN1bHQgPSBzdHJpbmdpZmllci5hcHBlbmRT
dHJpbmdpZmllZFZhbHVlKGJ1aWxkZXIsIHZhbHVlLCBtX29iamVjdCwgcHJvcGVydHlOYW1lKTsK
KyAgICB9CiAKLSAgICAgICAgaWYgKHZhbHVlLmlzT2JqZWN0KCkpIHsKLSAgICAgICAgICAgIGlm
IChhc09iamVjdCh2YWx1ZSktPmluaGVyaXRzKCZKU0FycmF5OjppbmZvKSkKLSAgICAgICAgICAg
ICAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkoYnVpbGRlciwgYXNBcnJheSh2YWx1ZSkpOwotICAg
ICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeU9iamVjdChidWlsZGVyLCBhc09iamVjdCh2YWx1ZSkp
OwotICAgICAgICB9CisgICAgLy8gRnJvbSB0aGlzIHBvaW50IG9uLCBubyBhY2Nlc3MgdG8gdGhl
IHRoaXMgcG9pbnRlciBvciB0byBhbnkgbWVtYmVycywgYmVjYXVzZSB0aGUKKyAgICAvLyBIb2xk
ZXIgb2JqZWN0IG1heSBoYXZlIG1vdmVkIGlmIHRoZSBjYWxsIHRvIHN0cmluZ2lmeSBwdXNoZWQg
YSBuZXcgSG9sZGVyIG9udG8KKyAgICAvLyBtX2hvbGRlclN0YWNrLgogCi0gICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBzd2l0Y2ggKHN0cmluZ2lmeVJlc3VsdCkgeworICAgICAgICBjYXNlIFN0
cmluZ2lmeUZhaWxlZDoKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJudWxsIik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdHJpbmdpZnlTdWNjZWVkZWQ6CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdHJpbmdpZnlGYWlsZWREdWVUb1VuZGVmaW5lZFZh
bHVlOgorICAgICAgICAgICAgLy8gVGhpcyBvbmx5IG9jY3VycyB3aGVuIGdldCBhbiB1bmRlZmlu
ZWQgdmFsdWUgZm9yIGFuIG9iamVjdCBwcm9wZXJ0eS4KKyAgICAgICAgICAgIC8vIEluIHRoaXMg
Y2FzZSB3ZSBkb24ndCB3YW50IHRoZSBzZXBhcmF0b3IgYW5kIHByb3BlcnR5IG5hbWUgdGhhdCB3
ZQorICAgICAgICAgICAgLy8gYWxyZWFkeSBhcHBlbmRlZCwgc28gcm9sbCBiYWNrLgorICAgICAg
ICAgICAgYnVpbGRlciA9IGJ1aWxkZXIuc3Vic3RyKDAsIHJvbGxCYWNrUG9pbnQpOworICAgICAg
ICAgICAgYnJlYWs7CiAgICAgfQotICAgIEV4ZWNTdGF0ZSogbV9leGVjOwotICAgIEpTVmFsdWUg
bV9yZXBsYWNlcjsKLSAgICBVU3RyaW5nIG1fZ2FwOwotICAgIFVTdHJpbmcgbV9pbmRlbnQ7Ci0g
ICAgSGFzaFNldDxKU09iamVjdCo+IG1fb2JqZWN0U3RhY2s7Ci0gICAgUHJvcGVydHlOYW1lQXJy
YXkgbV9hcnJheVJlcGxhY2VyUHJvcGVydHlOYW1lczsKLSAgICBib29sIG1fdXNpbmdBcnJheVJl
cGxhY2VyOwotICAgIENhbGxUeXBlIG1fcmVwbGFjZXJDYWxsVHlwZTsKLSAgICBDYWxsRGF0YSBt
X3JlcGxhY2VyQ2FsbERhdGE7Ci19OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBKU09OT2JqZWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCisKK2NvbnN0IENsYXNzSW5mbyBKU09OT2JqZWN0OjppbmZvID0geyAiSlNP
TiIsIDAsIDAsIEV4ZWNTdGF0ZTo6anNvblRhYmxlIH07CisKKy8qIFNvdXJjZSBmb3IgSlNPTk9i
amVjdC5sdXQuaAorQGJlZ2luIGpzb25UYWJsZQorICBzdHJpbmdpZnkgICAgIEpTT05Qcm90b0Z1
bmNTdHJpbmdpZnkgICAgICAgICBEb250RW51bXxGdW5jdGlvbiAxCitAZW5kCisqLworCisvLyBF
Q01BIDE1LjgKKworYm9vbCBKU09OT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoRXhlY1N0YXRl
KiBleGVjLCBjb25zdCBJZGVudGlmaWVyJiBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xv
dCkKK3sKKyAgICBjb25zdCBIYXNoRW50cnkqIGVudHJ5ID0gRXhlY1N0YXRlOjpqc29uVGFibGUo
ZXhlYyktPmVudHJ5KGV4ZWMsIHByb3BlcnR5TmFtZSk7CisgICAgaWYgKCFlbnRyeSkKKyAgICAg
ICAgcmV0dXJuIEpTT2JqZWN0OjpnZXRPd25Qcm9wZXJ0eVNsb3QoZXhlYywgcHJvcGVydHlOYW1l
LCBzbG90KTsKKworICAgIEFTU0VSVChlbnRyeS0+YXR0cmlidXRlcygpICYgRnVuY3Rpb24pOwor
ICAgIHNldFVwU3RhdGljRnVuY3Rpb25TbG90KGV4ZWMsIGVudHJ5LCB0aGlzLCBwcm9wZXJ0eU5h
bWUsIHNsb3QpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEpTT05PYmplY3Q6Om1hcmtT
dHJpbmdpZmllcnMoU3RyaW5naWZpZXIqIHN0cmluZ2lmaWVyKQoreworICAgIHN0cmluZ2lmaWVy
LT5tYXJrKCk7Cit9CiAKIC8vIEVDTUEtMjYyIHY1IDE1LjEyLjMKIEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBKU09OUHJvdG9GdW5jU3RyaW5naWZ5KEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqLCBK
U1ZhbHVlLCBjb25zdCBBcmdMaXN0JiBhcmdzKQogewogICAgIGlmIChhcmdzLmlzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgR2VuZXJhbEVycm9yLCAiTm8gaW5wdXQg
dG8gc3RyaW5naWZ5Iik7Ci0KICAgICBKU1ZhbHVlIHZhbHVlID0gYXJncy5hdCgwKTsKICAgICBK
U1ZhbHVlIHJlcGxhY2VyID0gYXJncy5hdCgxKTsKICAgICBKU1ZhbHVlIHNwYWNlID0gYXJncy5h
dCgyKTsKLQotICAgIFVTdHJpbmcgZ2FwOwotICAgIGlmIChzcGFjZS5pc09iamVjdCgpKSB7Ci0g
ICAgICAgIGlmIChhc09iamVjdChzcGFjZSktPmluaGVyaXRzKCZOdW1iZXJPYmplY3Q6OmluZm8p
IHx8IGFzT2JqZWN0KHNwYWNlKS0+aW5oZXJpdHMoJlN0cmluZ09iamVjdDo6aW5mbykpCi0gICAg
ICAgICAgICBzcGFjZSA9IHN0YXRpY19jYXN0PEpTV3JhcHBlck9iamVjdCo+KGFzT2JqZWN0KHNw
YWNlKSktPmludGVybmFsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKHNwYWNlLmlzTnVtYmVyKCkp
IHsKLSAgICAgICAgZG91YmxlIHYgPSBzcGFjZS50b051bWJlcihleGVjKTsKLSAgICAgICAgaWYg
KHYgPiAxMDApCi0gICAgICAgICAgICB2ID0gMTAwOwotICAgICAgICBpZiAoISh2ID4gMCkpCi0g
ICAgICAgICAgICB2ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2OyBpKyspCi0g
ICAgICAgICAgICBnYXAuYXBwZW5kKCcgJyk7Ci0gICAgfSBlbHNlIGlmIChzcGFjZS5pc1N0cmlu
ZygpKQotICAgICAgICBnYXAgPSBzcGFjZS50b1N0cmluZyhleGVjKTsKLQotICAgIFN0cmluZ2lm
aWVyIHN0cmluZ2lmaWVyKGV4ZWMsIGFyZ3MuYXQoMSksIGdhcCk7Ci0gICAgcmV0dXJuIHN0cmlu
Z2lmaWVyLnN0cmluZ2lmeSh2YWx1ZSk7CisgICAgcmV0dXJuIFN0cmluZ2lmaWVyKGV4ZWMsIHJl
cGxhY2VyLCBzcGFjZSkuc3RyaW5naWZ5KHZhbHVlKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgSlND
CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT05PYmplY3QuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT05PYmplY3QuaAkocmV2aXNpb24gNDQ3ODEpCisr
KyBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTT05PYmplY3QuaAkod29ya2luZyBjb3B5KQpAQCAt
MzAsMjIgKzMwLDI3IEBACiAKIG5hbWVzcGFjZSBKU0MgewogCisgICAgY2xhc3MgU3RyaW5naWZp
ZXI7CisKICAgICBjbGFzcyBKU09OT2JqZWN0IDogcHVibGljIEpTT2JqZWN0IHsKICAgICBwdWJs
aWM6CiAgICAgICAgIEpTT05PYmplY3QoUGFzc1JlZlB0cjxTdHJ1Y3R1cmU+IHN0cnVjdHVyZSkK
LSAgICAgICAgICAgIDpKU09iamVjdChzdHJ1Y3R1cmUpCisgICAgICAgICAgICA6IEpTT2JqZWN0
KHN0cnVjdHVyZSkKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgdmlydHVhbCBib29s
IGdldE93blByb3BlcnR5U2xvdChFeGVjU3RhdGUqLCBjb25zdCBJZGVudGlmaWVyJiwgUHJvcGVy
dHlTbG90Jik7Ci0KLSAgICAgICAgdmlydHVhbCBjb25zdCBDbGFzc0luZm8qIGNsYXNzSW5mbygp
IGNvbnN0IHsgcmV0dXJuICZpbmZvOyB9Ci0gICAgICAgIHN0YXRpYyBjb25zdCBDbGFzc0luZm8g
aW5mbzsKLQogICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJ1Y3R1cmU+IGNyZWF0ZVN0cnVj
dHVyZShKU1ZhbHVlIHByb3RvdHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIFN0
cnVjdHVyZTo6Y3JlYXRlKHByb3RvdHlwZSwgVHlwZUluZm8oT2JqZWN0VHlwZSkpOwogICAgICAg
ICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgbWFya1N0cmluZ2lmaWVycyhTdHJpbmdpZmllciop
OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCBib29sIGdldE93blByb3BlcnR5U2xv
dChFeGVjU3RhdGUqLCBjb25zdCBJZGVudGlmaWVyJiwgUHJvcGVydHlTbG90Jik7CisKKyAgICAg
ICAgdmlydHVhbCBjb25zdCBDbGFzc0luZm8qIGNsYXNzSW5mbygpIGNvbnN0IHsgcmV0dXJuICZp
bmZvOyB9CisgICAgICAgIHN0YXRpYyBjb25zdCBDbGFzc0luZm8gaW5mbzsKICAgICB9OwogCiB9
IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDQ0NzkxKQorKysgTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTggQEAKKzIwMDktMDYtMTcg
IERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEJ1ZyAyNjQyOTogTWFrZSBKU09OLnN0cmluZ2lmeSBu
b24tcmVjdXJzaXZlIHNvIGl0IGNhbiBoYW5kbGUgb2JqZWN0cworICAgICAgICBvZiBhcmJpdHJh
cnkgY29tcGxleGl0eQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MjY0MjkKKworICAgICAgICAqIGZhc3QvanMvSlNPTi1zdHJpbmdpZnktZXhwZWN0ZWQu
dHh0OiBVcGRhdGVkLgorICAgICAgICAqIGZhc3QvanMvcmVzb3VyY2VzL0pTT04tc3RyaW5naWZ5
LmpzOiBDaGFuZ2VkIHRoZSBpbmZpbml0ZSBvYmplY3QgYW5kCisgICAgICAgIGluZmluaXRlIGFy
cmF5IHRlc3RzIHRvIGluc3RlYWQganVzdCB0ZXN0IHNvbWV0aGluZyBhIGZpeGVkIG51bWJlciBv
ZgorICAgICAgICBsZXZlbHMgZGVlcC4gT3RoZXJ3aXNlIHdlIGVuZCB1cCB3aXRoIGFuIGluZmlu
aXRlIGxvb3AgaW4gdGhlIHRlc3QsCisgICAgICAgIHdoaWNoIHdvdWxkIGxlYWQgdG8gdGhlIHNs
b3ctc2NyaXB0IGRpYWxvZyBpbiB0aGUgcHJvZHVjdGlvbiB3ZWIgYnJvd3Nlci4KKyAgICAgICAg
QWxzbyByYWlzZWQgdGhlIG51bWJlciBmcm9tIDUxMiB0byAyMDQ4IHNpbmNlIHRoZXJlJ3Mgbm8g
Zml4ZWQgbGltaXQgYW55IG1vcmUuCisKIDIwMDktMDYtMTcgIERhdmlkIEh5YXR0ICA8aHlhdHRA
YXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFuZGVycyBDYXJsc3Nvbi4KSW5kZXg6
IExheW91dFRlc3RzL2Zhc3QvanMvSlNPTi1zdHJpbmdpZnktZXhwZWN0ZWQudHh0Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvanMvSlNPTi1zdHJpbmdpZnktZXhwZWN0ZWQudHh0CShy
ZXZpc2lvbiA0NDc4MSkKKysrIExheW91dFRlc3RzL2Zhc3QvanMvSlNPTi1zdHJpbmdpZnktZXhw
ZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0yNTcsMzYgKzI1Nyw0MSBAQCBmdW5jdGlvbiAo
anNvbk9iamVjdCkgewogUEFTUyB0ZXN0c1tpXShuYXRpdmVKU09OKSBpcyB0ZXN0c1tpXShKU09O
KQogZnVuY3Rpb24gKGpzb25PYmplY3QpIHsKICAgICAgICAgdmFyIGRlZXBPYmplY3QgPSB7fTsK
LSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1MTI7IGkrKykKKyAgICAgICAgZm9yICh2YXIg
aSA9IDA7IGkgPCAyMDQ4OyBpKyspCiAgICAgICAgICAgICBkZWVwT2JqZWN0ID0ge25leHQ6ZGVl
cE9iamVjdH07CiAgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShkZWVwT2JqZWN0
KTsKICAgICB9CiBQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCiBm
dW5jdGlvbiAoanNvbk9iamVjdCkgewogICAgICAgICB2YXIgZGVlcEFycmF5ID0gW107Ci0gICAg
ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTEyOyBpKyspCisgICAgICAgIGZvciAodmFyIGkgPSAw
OyBpIDwgMjA0ODsgaSsrKQogICAgICAgICAgICAgZGVlcEFycmF5ID0gW2RlZXBBcnJheV07CiAg
ICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShkZWVwQXJyYXkpOwogICAgIH0KIFBB
U1MgdGVzdHNbaV0obmF0aXZlSlNPTikgaXMgdGVzdHNbaV0oSlNPTikKIGZ1bmN0aW9uIChqc29u
T2JqZWN0KSB7Ci0gICAgICAgIGZ1bmN0aW9uIHRvSW5maW5pdGVKU09OT2JqZWN0KCkgeworICAg
ICAgICB2YXIgZGVwdGggPSAwOworICAgICAgICBmdW5jdGlvbiB0b0RlZXBWaXJ0dWFsSlNPTk9i
amVjdCgpIHsKKyAgICAgICAgICAgIGlmICgrK2RlcHRoID49IDIwNDgpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgICAgIHIudG9K
U09OID0gdG9JbmZpbml0ZUpTT05PYmplY3Q7CisgICAgICAgICAgICByLnRvSlNPTiA9IHRvRGVl
cFZpcnR1YWxKU09OT2JqZWN0OwogICAgICAgICAgICAgcmV0dXJuIHtyZWN1cnNlOiByfTsKICAg
ICAgICAgfQotICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkodG9JbmZpbml0ZUpT
T05PYmplY3QoKSk7CisgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh0b0RlZXBW
aXJ0dWFsSlNPTk9iamVjdCgpKTsKICAgICB9Ci1QQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIHRo
cmV3IGV4Y2VwdGlvbiBSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRl
ZC4uCitQQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIGlzIHRlc3RzW2ldKEpTT04pCiBmdW5jdGlv
biAoanNvbk9iamVjdCkgewotICAgICAgICBmdW5jdGlvbiB0b0luZmluaXRlSlNPTkFycmF5KCkg
eworICAgICAgICB2YXIgZGVwdGggPSAwOworICAgICAgICBmdW5jdGlvbiB0b0RlZXBWaXJ0dWFs
SlNPTkFycmF5KCkgeworICAgICAgICAgICAgaWYgKCsrZGVwdGggPj0gMjA0OCkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICB2YXIgciA9IFtdOwotICAgICAgICAgICAg
ci50b0pTT04gPSB0b0luZmluaXRlSlNPTkFycmF5OworICAgICAgICAgICAgci50b0pTT04gPSB0
b0RlZXBKU09OQXJyYXk7CiAgICAgICAgICAgICByZXR1cm4gW3JdOwogICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh0b0luZmluaXRlSlNPTkFycmF5KCkpOwor
ICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkodG9EZWVwVmlydHVhbEpTT05BcnJh
eSgpKTsKICAgICB9Ci1QQVNTIHRlc3RzW2ldKG5hdGl2ZUpTT04pIHRocmV3IGV4Y2VwdGlvbiBS
YW5nZUVycm9yOiBNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZC4uCiBmdW5jdGlvbiAo
anNvbk9iamVjdCkgewogICAgICAgICByZXR1cm4ganNvbk9iamVjdC5zdHJpbmdpZnkoZnVsbENo
YXJzZXRTdHJpbmcpOwogICAgIH0KSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvanMvcmVzb3VyY2Vz
L0pTT04tc3RyaW5naWZ5LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvanMvcmVz
b3VyY2VzL0pTT04tc3RyaW5naWZ5LmpzCShyZXZpc2lvbiA0NDc4MSkKKysrIExheW91dFRlc3Rz
L2Zhc3QvanMvcmVzb3VyY2VzL0pTT04tc3RyaW5naWZ5LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0y
NDAsMzQgKzI0MCwzOCBAQCBmdW5jdGlvbiBjcmVhdGVUZXN0cygpIHsKICAgICB9KTsKICAgICBy
ZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsKICAgICAgICAgdmFyIGRlZXBPYmplY3Qg
PSB7fTsKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1MTI7IGkrKykKKyAgICAgICAgZm9y
ICh2YXIgaSA9IDA7IGkgPCAyMDQ4OyBpKyspCiAgICAgICAgICAgICBkZWVwT2JqZWN0ID0ge25l
eHQ6ZGVlcE9iamVjdH07CiAgICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeShkZWVw
T2JqZWN0KTsKICAgICB9KTsKICAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2JqZWN0KXsK
ICAgICAgICAgdmFyIGRlZXBBcnJheSA9IFtdOwotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8
IDUxMjsgaSsrKQorICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwNDg7IGkrKykKICAgICAg
ICAgICAgIGRlZXBBcnJheSA9IFtkZWVwQXJyYXldOwogICAgICAgICByZXR1cm4ganNvbk9iamVj
dC5zdHJpbmdpZnkoZGVlcEFycmF5KTsKICAgICB9KTsKICAgICByZXN1bHQucHVzaChmdW5jdGlv
bihqc29uT2JqZWN0KXsKLSAgICAgICAgZnVuY3Rpb24gdG9JbmZpbml0ZUpTT05PYmplY3QoKSB7
CisgICAgICAgIHZhciBkZXB0aCA9IDA7CisgICAgICAgIGZ1bmN0aW9uIHRvRGVlcFZpcnR1YWxK
U09OT2JqZWN0KCkgeworICAgICAgICAgICAgaWYgKCsrZGVwdGggPj0gMjA0OCkKKyAgICAgICAg
ICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICB2YXIgciA9IHt9OwotICAgICAgICAgICAg
ci50b0pTT04gPSB0b0luZmluaXRlSlNPTk9iamVjdDsKKyAgICAgICAgICAgIHIudG9KU09OID0g
dG9EZWVwVmlydHVhbEpTT05PYmplY3Q7CiAgICAgICAgICAgICByZXR1cm4ge3JlY3Vyc2U6IHJ9
OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqc29uT2JqZWN0LnN0cmluZ2lmeSh0b0luZmlu
aXRlSlNPTk9iamVjdCgpKTsKKyAgICAgICAgcmV0dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHRv
RGVlcFZpcnR1YWxKU09OT2JqZWN0KCkpOwogICAgIH0pOwotICAgIHJlc3VsdFtyZXN1bHQubGVu
Z3RoIC0gMV0udGhyb3dzID0gdHJ1ZTsKICAgICByZXN1bHQucHVzaChmdW5jdGlvbihqc29uT2Jq
ZWN0KXsKLSAgICAgICAgZnVuY3Rpb24gdG9JbmZpbml0ZUpTT05BcnJheSgpIHsKKyAgICAgICAg
dmFyIGRlcHRoID0gMDsKKyAgICAgICAgZnVuY3Rpb24gdG9EZWVwVmlydHVhbEpTT05BcnJheSgp
IHsKKyAgICAgICAgICAgIGlmICgrK2RlcHRoID49IDIwNDgpCisgICAgICAgICAgICAgICAgcmV0
dXJuIFtdOwogICAgICAgICAgICAgdmFyIHIgPSBbXTsKLSAgICAgICAgICAgIHIudG9KU09OID0g
dG9JbmZpbml0ZUpTT05BcnJheTsKKyAgICAgICAgICAgIHIudG9KU09OID0gdG9EZWVwSlNPTkFy
cmF5OwogICAgICAgICAgICAgcmV0dXJuIFtyXTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4g
anNvbk9iamVjdC5zdHJpbmdpZnkodG9JbmZpbml0ZUpTT05BcnJheSgpKTsKKyAgICAgICAgcmV0
dXJuIGpzb25PYmplY3Quc3RyaW5naWZ5KHRvRGVlcFZpcnR1YWxKU09OQXJyYXkoKSk7CiAgICAg
fSk7Ci0gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS50aHJvd3MgPSB0cnVlOwogICAgIHZh
ciBmdWxsQ2hhcnNldFN0cmluZyA9ICIiOwogICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjU1MzY7
IGkrKykKICAgICAgICAgZnVsbENoYXJzZXRTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShp
KTsK
</data>
<flag name="review"
          id="16133"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>