<?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>51956</bug_id>
          
          <creation_ts>2011-01-05 14:23:10 -0800</creation_ts>
          <short_desc>[chromium] refactor complex text on Linux</short_desc>
          <delta_ts>2011-01-05 15:17:42 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</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="Evan Martin">evan</reporter>
          <assigned_to name="Evan Martin">evan</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>evan</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>329789</commentid>
    <comment_count>0</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2011-01-05 14:23:10 -0800</bug_when>
    <thetext>[chromium] refactor complex text on Linux</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329791</commentid>
    <comment_count>1</comment_count>
      <attachid>78043</attachid>
    <who name="Evan Martin">evan</who>
    <bug_when>2011-01-05 14:24:57 -0800</bug_when>
    <thetext>Created attachment 78043
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329792</commentid>
    <comment_count>2</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2011-01-05 14:26:05 -0800</bug_when>
    <thetext>Note: please don&apos;t review the new code -- I don&apos;t want to make any changes to it, just relocate it.  But please do review the edges of the new file to verify I got the license header and #includes and namespaces right.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329796</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-05 14:31:31 -0800</bug_when>
    <thetext>Attachment 78043 did not build on chromium:
Build output: http://queues.webkit.org/results/7308381</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329798</commentid>
    <comment_count>4</comment_count>
      <attachid>78046</attachid>
    <who name="Evan Martin">evan</who>
    <bug_when>2011-01-05 14:35:16 -0800</bug_when>
    <thetext>Created attachment 78046
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329800</commentid>
    <comment_count>5</comment_count>
      <attachid>78046</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2011-01-05 14:39:25 -0800</bug_when>
    <thetext>Comment on attachment 78046
Patch

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

PLs consider addressing the nits noted.

&gt; WebCore/platform/graphics/chromium/ComplexTextControllerLinux.h:34
&gt; +#include &quot;Font.h&quot;

Can&apos;t you just get by with fwd decls for Font, FontPlatformData, SimpleFontData, TextRun?

&gt; WebCore/platform/graphics/chromium/ComplexTextControllerLinux.h:37
&gt; +#include &lt;wtf/OwnArrayPtr.h&gt;

missing include for OwnPtr.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329809</commentid>
    <comment_count>6</comment_count>
      <attachid>78050</attachid>
    <who name="Evan Martin">evan</who>
    <bug_when>2011-01-05 14:52:23 -0800</bug_when>
    <thetext>Created attachment 78050
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>329820</commentid>
    <comment_count>7</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2011-01-05 15:17:42 -0800</bug_when>
    <thetext>Committed r75108: &lt;http://trac.webkit.org/changeset/75108&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78043</attachid>
            <date>2011-01-05 14:24:57 -0800</date>
            <delta_ts>2011-01-05 14:35:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-51956-20110105142418.patch</filename>
            <type>text/plain</type>
            <size>60535</size>
            <attacher name="Evan Martin">evan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NjQxMmNjNWExYmJlN2FiYWY3ZDhlYWQ0NWNiNWY0MjJhMWYwYzcxYS4uOTBiZDU3NGY0YzMwNDI2
NThlNWRkZmZlNjg1MjE3OWMxMTU5YzY5YiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1OCBAQAorMjAxMS0wMS0wNSAgRXZh
biBNYXJ0aW4gIDxldmFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBbY2hyb21pdW1dIHJlZmFjdG9yIGNvbXBsZXggdGV4dCBv
biBMaW51eAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NTE5NTYKKworICAgICAgICBQdWxsIG91dCBUZXh0UnVuV2Fsa2VyIGZyb20gRm9udExpbnV4LmNw
cC4gIFB1dCBpdCBpbiBpdHMgb3duIGZpbGUuCisgICAgICAgIFJlbmFtZSBpdCB0byBDb21wbGV4
VGV4dENvbnRyb2xsZXIsIHRvIG1hdGNoIHBsYXRmb3JtL2dyYXBoaWNzL21hYworICAgICAgICBt
b3JlIGNsb3NlbHkuCisKKyAgICAgICAgTm8gdGVzdHMgYmVjYXVzZSB0aGUgY2hhbmdlIGlzIGp1
c3QgcmVuYW1pbmcgYSBjbGFzcy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lw
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJv
bGxlckxpbnV4LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRy
b2xsZXI6OkNvbXBsZXhUZXh0Q29udHJvbGxlcik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
VGV4dENvbnRyb2xsZXI6On5Db21wbGV4VGV4dENvbnRyb2xsZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppc1dvcmRCcmVhayk6CisgICAgICAgIChXZWJDb3Jl
OjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRldGVybWluZVdvcmRCcmVha1NwYWNpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXRQYWRkaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6cmVzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24pOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpuZXh0U2NyaXB0UnVuKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6d2lkdGhPZkZ1bGxSdW4pOgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXR1cEZvbnRGb3JTY3Jp
cHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjphbGxvY0hh
cmZidXp6Rm9udCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRl
bGV0ZUdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxl
cjo6Y3JlYXRlR2x5cGhBcnJheXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250
cm9sbGVyOjpyZXNldEdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0
Q29udHJvbGxlcjo6c2hhcGVHbHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRD
b250cm9sbGVyOjpzZXRHbHlwaFhQb3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxl
eFRleHRDb250cm9sbGVyOjpub3JtYWxpemVTcGFjZXNBbmRNaXJyb3JDaGFycyk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdldE5vcm1hbGl6ZWRUZXh0UnVuKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xs
ZXJMaW51eC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxl
cjo6c2V0V29yZFNwYWNpbmdBZGp1c3RtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhU
ZXh0Q29udHJvbGxlcjo6c2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpsZXR0ZXJTcGFjaW5nKToKKyAgICAgICAgKFdl
YkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2V0WE9mZnNldFRvWmVybyk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OnJ0bCk6CisgICAgICAgIChXZWJDb3Jl
OjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdseXBocyk6CisgICAgICAgIChXZWJDb3JlOjpDb21w
bGV4VGV4dENvbnRyb2xsZXI6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4
dENvbnRyb2xsZXI6OnhQb3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRD
b250cm9sbGVyOjphZHZhbmNlcyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRy
b2xsZXI6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6
bG9nQ2x1c3RlcnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpu
dW1Db2RlUG9pbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6
Zm9udFBsYXRmb3JtRGF0YUZvclNjcmlwdFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
VGV4dENvbnRyb2xsZXI6OmlzQ29kZXBvaW50U3BhY2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Ojpk
cmF3Q29tcGxleFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZmxvYXRXaWR0aEZvckNv
bXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OmdseXBoSW5kZXhGb3JYUG9zaXRpb25JblNj
cmlwdFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNv
bXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21w
bGV4VGV4dCk6CisKIDIwMTEtMDEtMDQgIFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5ib3RA
Z21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHI3NDk5Mi4KZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAgYi9XZWJDb3JlL1dlYkNv
cmUuZ3lwL1dlYkNvcmUuZ3lwCmluZGV4IDUwYmRiZjA3ZTA2NGQ2ODcwMmY3YzNkZDVhMjVmZWQz
OGZlNjZlYWIuLmM5MzY3OTMzMzcxZmE4NWJkMjhmMzRmZTU0MDVkZmU5YmY3NmJiMmQgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKKysrIGIvV2ViQ29yZS9XZWJD
b3JlLmd5cC9XZWJDb3JlLmd5cApAQCAtMTA5OSw2ICsxMDk5LDcgQEAKICAgICAgICAgICAnc291
cmNlcy8nOiBbCiAgICAgICAgICAgICAjIENoZXJyeS1waWNrIGZpbGVzIGV4Y2x1ZGVkIGJ5IHRo
ZSBicm9hZGVyIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYWJvdmUuCiAgICAgICAgICAgICBbJ2luY2x1
ZGUnLCAncGxhdGZvcm0vY2hyb21pdW0vS2V5Q29kZUNvbnZlcnNpb25HdGtcXC5jcHAkJ10sCisg
ICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxl
eFRleHRDb250cm9sbGVyTGludXhcXC5jcHAkJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUnLCAn
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlTGludXhcXC5jcHAkJ10sCiAgICAg
ICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4
XFwuY3BwJCddLAogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eFxcLmNwcCQnXSwKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXgu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRy
b2xsZXJMaW51eC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDdiZjJkNDEwYTEyYTgyNjc1MzcwYzBmNjQwMmQw
NzlhYTMxMjg2MQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguY3BwCkBAIC0wLDAgKzEsNDE2IEBA
CisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbXBsZXhUZXh0Q29udHJvbGxlci5oIgor
CisjaW5jbHVkZSAiRm9udC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NvbXBsZXhUZXh0
Q29udHJvbGxlcjo6Q29tcGxleFRleHRDb250cm9sbGVyKGNvbnN0IFRleHRSdW4mIHJ1biwgdW5z
aWduZWQgc3RhcnRpbmdYLCBjb25zdCBGb250KiBmb250KQorICAgIDogbV9mb250KGZvbnQpCisg
ICAgLCBtX3N0YXJ0aW5nWChzdGFydGluZ1gpCisgICAgLCBtX29mZnNldFgobV9zdGFydGluZ1gp
CisgICAgLCBtX3J1bihnZXROb3JtYWxpemVkVGV4dFJ1bihydW4sIG1fbm9ybWFsaXplZFJ1biwg
bV9ub3JtYWxpemVkQnVmZmVyKSkKKyAgICAsIG1faXRlcmF0ZUJhY2t3YXJkcyhtX3J1bi5ydGwo
KSkKKyAgICAsIG1fd29yZFNwYWNpbmdBZGp1c3RtZW50KDApCisgICAgLCBtX3BhZGRpbmcoMCkK
KyAgICAsIG1fcGFkUGVyV29yZEJyZWFrKDApCisgICAgLCBtX3BhZEVycm9yKDApCisgICAgLCBt
X2xldHRlclNwYWNpbmcoMCkKK3sKKyAgICAvLyBEbyBub3QgdXNlIHxydW58IGluc2lkZSB0aGlz
IGNvbnN0cnVjdG9yLiBVc2UgfG1fcnVufCBpbnN0ZWFkLgorCisgICAgbWVtc2V0KCZtX2l0ZW0s
IDAsIHNpemVvZihtX2l0ZW0pKTsKKyAgICAvLyBXZSBjYW5ub3Qga25vdywgYWhlYWQgb2YgdGlt
ZSwgaG93IG1hbnkgZ2x5cGhzIGEgZ2l2ZW4gc2NyaXB0IHJ1bgorICAgIC8vIHdpbGwgcHJvZHVj
ZS4gV2UgdGFrZSBhIGd1ZXNzIHRoYXQgc2NyaXB0IHJ1bnMgd2lsbCBub3QgcHJvZHVjZSBtb3Jl
CisgICAgLy8gdGhhbiB0d2ljZSBhcyBtYW55IGdseXBocyBhcyB0aGVyZSBhcmUgY29kZSBwb2lu
dHMgcGx1cyBhIGJpdCBvZgorICAgIC8vIHBhZGRpbmcgYW5kIGZhbGxiYWNrIGlmIHdlIGZpbmQg
dGhhdCB3ZSBhcmUgd3JvbmcuCisgICAgY3JlYXRlR2x5cGhBcnJheXMoKG1fcnVuLmxlbmd0aCgp
ICsgMikgKiAyKTsKKworICAgIG1faXRlbS5sb2dfY2x1c3RlcnMgPSBuZXcgdW5zaWduZWQgc2hv
cnRbbV9ydW4ubGVuZ3RoKCldOworCisgICAgbV9pdGVtLmZhY2UgPSAwOworICAgIG1faXRlbS5m
b250ID0gYWxsb2NIYXJmYnV6ekZvbnQoKTsKKworICAgIG1faXRlbS5pdGVtLmJpZGlMZXZlbCA9
IG1fcnVuLnJ0bCgpOworCisgICAgbV9pdGVtLnN0cmluZyA9IG1fcnVuLmNoYXJhY3RlcnMoKTsK
KyAgICBtX2l0ZW0uc3RyaW5nTGVuZ3RoID0gbV9ydW4ubGVuZ3RoKCk7CisKKyAgICByZXNldCgp
OworfQorCitDb21wbGV4VGV4dENvbnRyb2xsZXI6On5Db21wbGV4VGV4dENvbnRyb2xsZXIoKQor
eworICAgIGZhc3RGcmVlKG1faXRlbS5mb250KTsKKyAgICBkZWxldGVHbHlwaEFycmF5cygpOwor
ICAgIGRlbGV0ZVtdIG1faXRlbS5sb2dfY2x1c3RlcnM7Cit9CisKK2Jvb2wgQ29tcGxleFRleHRD
b250cm9sbGVyOjppc1dvcmRCcmVhayh1bnNpZ25lZCBpbmRleCkKK3sKKyAgICByZXR1cm4gaW5k
ZXggJiYgaXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3RyaW5nW2luZGV4XSkgJiYgIWlzQ29kZXBv
aW50U3BhY2UobV9pdGVtLnN0cmluZ1tpbmRleCAtIDFdKTsKK30KKworaW50IENvbXBsZXhUZXh0
Q29udHJvbGxlcjo6ZGV0ZXJtaW5lV29yZEJyZWFrU3BhY2luZyh1bnNpZ25lZCBsb2dDbHVzdGVy
c0luZGV4KQoreworICAgIGludCB3b3JkQnJlYWtTcGFjaW5nID0gMDsKKyAgICAvLyBUaGUgZmly
c3QgaGFsZiBvZiB0aGUgY29uanVuY3Rpb24gd29ya3MgYXJvdW5kIHRoZSBjYXNlIHdoZXJlCisg
ICAgLy8gb3V0cHV0IGdseXBocyBhcmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGFueSBjb2RlcG9pbnRz
IGJ5IHRoZQorICAgIC8vIGNsdXN0ZXJzIGxvZy4KKyAgICBpZiAobG9nQ2x1c3RlcnNJbmRleCA8
IG1faXRlbS5pdGVtLmxlbmd0aAorICAgICAgICAmJiBpc1dvcmRCcmVhayhtX2l0ZW0uaXRlbS5w
b3MgKyBsb2dDbHVzdGVyc0luZGV4KSkgeworICAgICAgICB3b3JkQnJlYWtTcGFjaW5nID0gbV93
b3JkU3BhY2luZ0FkanVzdG1lbnQ7CisKKyAgICAgICAgaWYgKG1fcGFkZGluZyA+IDApIHsKKyAg
ICAgICAgICAgIGludCB0b1BhZCA9IHJvdW5kZihtX3BhZFBlcldvcmRCcmVhayArIG1fcGFkRXJy
b3IpOworICAgICAgICAgICAgbV9wYWRFcnJvciArPSBtX3BhZFBlcldvcmRCcmVhayAtIHRvUGFk
OworCisgICAgICAgICAgICBpZiAobV9wYWRkaW5nIDwgdG9QYWQpCisgICAgICAgICAgICAgICAg
dG9QYWQgPSBtX3BhZGRpbmc7CisgICAgICAgICAgICBtX3BhZGRpbmcgLT0gdG9QYWQ7CisgICAg
ICAgICAgICB3b3JkQnJlYWtTcGFjaW5nICs9IHRvUGFkOworICAgICAgICB9CisgICAgfQorICAg
IHJldHVybiB3b3JkQnJlYWtTcGFjaW5nOworfQorCisvLyBzZXRQYWRkaW5nIHNldHMgYSBudW1i
ZXIgb2YgcGl4ZWxzIHRvIGJlIGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgVGV4dFJ1bi4KKy8vIFdl
YktpdCB1c2VzIHRoaXMgdG8ganVzdGlmeSB0ZXh0Lgordm9pZCBDb21wbGV4VGV4dENvbnRyb2xs
ZXI6OnNldFBhZGRpbmcoaW50IHBhZGRpbmcpCit7CisgICAgbV9wYWRkaW5nID0gcGFkZGluZzsK
KyAgICBpZiAoIW1fcGFkZGluZykKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgd2UgaGF2
ZSBwYWRkaW5nIHRvIGRpc3RyaWJ1dGUsIHRoZW4gd2UgdHJ5IHRvIGdpdmUgYW4gZXF1YWwKKyAg
ICAvLyBhbW91bnQgdG8gZWFjaCBzcGFjZS4gVGhlIGxhc3Qgc3BhY2UgZ2V0cyB0aGUgc21hbGxl
ciBhbW91bnQsIGlmCisgICAgLy8gYW55LgorICAgIHVuc2lnbmVkIG51bVdvcmRCcmVha3MgPSAw
OworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1faXRlbS5zdHJpbmdMZW5ndGg7IGkr
KykgeworICAgICAgICBpZiAoaXNXb3JkQnJlYWsoaSkpCisgICAgICAgICAgICBudW1Xb3JkQnJl
YWtzKys7CisgICAgfQorCisgICAgaWYgKG51bVdvcmRCcmVha3MpCisgICAgICAgIG1fcGFkUGVy
V29yZEJyZWFrID0gbV9wYWRkaW5nIC8gbnVtV29yZEJyZWFrczsKKyAgICBlbHNlCisgICAgICAg
IG1fcGFkUGVyV29yZEJyZWFrID0gMDsKK30KKwordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6
OnJlc2V0KCkKK3sKKyAgICBpZiAobV9pdGVyYXRlQmFja3dhcmRzKQorICAgICAgICBtX2luZGV4
T2ZOZXh0U2NyaXB0UnVuID0gbV9ydW4ubGVuZ3RoKCkgLSAxOworICAgIGVsc2UKKyAgICAgICAg
bV9pbmRleE9mTmV4dFNjcmlwdFJ1biA9IDA7CisgICAgbV9vZmZzZXRYID0gbV9zdGFydGluZ1g7
Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24o
Ym9vbCBpc0JhY2t3YXJkcykKK3sKKyAgICBtX2l0ZXJhdGVCYWNrd2FyZHMgPSBpc0JhY2t3YXJk
czsKKyAgICByZXNldCgpOworfQorCisvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHNjcmlwdCBydW4s
IHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQgb2YgdGhlCisvLyBUZXh0UnVuIGhhcyBiZWVu
IHJlYWNoZWQuCitib29sIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6bmV4dFNjcmlwdFJ1bigpCit7
CisgICAgaWYgKG1faXRlcmF0ZUJhY2t3YXJkcykgeworICAgICAgICAvLyBJbiByaWdodC10by1s
ZWZ0IG1vZGUgd2UgbmVlZCB0byByZW5kZXIgdGhlIHNoYXBlZCBnbHlwaCBiYWNrd2FyZHMgYW5k
CisgICAgICAgIC8vIGFsc28gcmVuZGVyIHRoZSBzY3JpcHQgcnVucyB0aGVtc2VsdmVzIGJhY2t3
YXJkcy4gU28gZ2l2ZW4gYSBUZXh0UnVuOgorICAgICAgICAvLyAgICBBQUFBQUFBQ1RUVFRUVFQg
ICAoQSA9IEFyYWJpYywgQyA9IENvbW1vbiwgVCA9IFRoYWkpCisgICAgICAgIC8vIHdlIHJlbmRl
cjoKKyAgICAgICAgLy8gICAgVFRUVFRUQ0FBQUFBQUEKKyAgICAgICAgLy8gKGFuZCB0aGUgZ2x5
cGhzIGluIGVhY2ggQSwgQyBhbmQgVCBzZWN0aW9uIGFyZSBiYWNrd2FyZHMgdG9vKQorICAgICAg
ICBpZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fcHJldigmbV9udW1Db2RlUG9pbnRzLCAmbV9pdGVt
Lml0ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0
U2NyaXB0UnVuKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbV9jdXJyZW50
Rm9udERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZvckNoYXJhY3RlcihtX2l0ZW0uc3RyaW5nW21f
aXRlbS5pdGVtLnBvc10sIGZhbHNlKS5mb250RGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBp
ZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fbmV4dCgmbV9udW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0
ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0U2Ny
aXB0UnVuKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBJdCBpcyBh
Y3R1YWxseSB3cm9uZyB0byBjb25zaWRlciBzY3JpcHQgcnVucyBhdCBhbGwgaW4gdGhpcyBjb2Rl
LgorICAgICAgICAvLyBPdGhlciBXZWJLaXQgY29kZSAoZS5nLiBNYWMpIHNlZ21lbnRzIGNvbXBs
ZXggdGV4dCBqdXN0IGJ5IGZpbmRpbmcKKyAgICAgICAgLy8gdGhlIGxvbmdlc3Qgc3BhbiBvZiB0
ZXh0IGNvdmVyZWQgYnkgYSBzaW5nbGUgZm9udC4KKyAgICAgICAgLy8gQnV0IHdlIGN1cnJlbnRs
eSBuZWVkIHRvIGNhbGwgaGJfdXRmMTZfc2NyaXB0X3J1bl9uZXh0IGFueXdheSB0byBmaWxsCisg
ICAgICAgIC8vIGluIHRoZSBoYXJmYnV6eiBkYXRhIHN0cnVjdHVyZXMgdG8gZS5nLiBwaWNrIHRo
ZSBjb3JyZWN0IHNjcmlwdCdzIHNoYXBlci4KKyAgICAgICAgLy8gU28gd2UgYWxsb3cgdGhhdCB0
byBydW4gZmlyc3QsIHRoZW4gZG8gYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSByYW5nZSBpdAorICAg
ICAgICAvLyBmb3VuZCBhbmQgdGFrZSB0aGUgbGFyZ2VzdCBzdWJyZWdpb24gdGhhdCBzdGF5cyB3
aXRoaW4gYSBzaW5nbGUgZm9udC4KKyAgICAgICAgbV9jdXJyZW50Rm9udERhdGEgPSBtX2ZvbnQt
PmdseXBoRGF0YUZvckNoYXJhY3RlcihtX2l0ZW0uc3RyaW5nW21faXRlbS5pdGVtLnBvc10sIGZh
bHNlKS5mb250RGF0YTsKKyAgICAgICAgdW5zaWduZWQgZW5kT2ZSdW47CisgICAgICAgIGZvciAo
ZW5kT2ZSdW4gPSAxOyBlbmRPZlJ1biA8IG1faXRlbS5pdGVtLmxlbmd0aDsgKytlbmRPZlJ1bikg
eworICAgICAgICAgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIG5leHRGb250RGF0YSA9IG1fZm9u
dC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKG1faXRlbS5zdHJpbmdbbV9pdGVtLml0ZW0ucG9zICsg
ZW5kT2ZSdW5dLCBmYWxzZSkuZm9udERhdGE7CisgICAgICAgICAgICBpZiAobmV4dEZvbnREYXRh
ICE9IG1fY3VycmVudEZvbnREYXRhKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIG1faXRlbS5pdGVtLmxlbmd0aCA9IGVuZE9mUnVuOworICAgICAgICBtX2luZGV4
T2ZOZXh0U2NyaXB0UnVuID0gbV9pdGVtLml0ZW0ucG9zICsgZW5kT2ZSdW47CisgICAgfQorCisg
ICAgc2V0dXBGb250Rm9yU2NyaXB0UnVuKCk7CisgICAgc2hhcGVHbHlwaHMoKTsKKyAgICBzZXRH
bHlwaFhQb3NpdGlvbnMocnRsKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Zsb2F0IENv
bXBsZXhUZXh0Q29udHJvbGxlcjo6d2lkdGhPZkZ1bGxSdW4oKQoreworICAgIGZsb2F0IHdpZHRo
U3VtID0gMDsKKyAgICB3aGlsZSAobmV4dFNjcmlwdFJ1bigpKQorICAgICAgICB3aWR0aFN1bSAr
PSB3aWR0aCgpOworCisgICAgcmV0dXJuIHdpZHRoU3VtOworfQorCit2b2lkIENvbXBsZXhUZXh0
Q29udHJvbGxlcjo6c2V0dXBGb250Rm9yU2NyaXB0UnVuKCkKK3sKKyAgICBjb25zdCBGb250RGF0
YSogZm9udERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZvckNoYXJhY3RlcihtX2l0ZW0uc3RyaW5n
W21faXRlbS5pdGVtLnBvc10sIGZhbHNlKS5mb250RGF0YTsKKyAgICBjb25zdCBGb250UGxhdGZv
cm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250RGF0YS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIoJyAn
KS0+cGxhdGZvcm1EYXRhKCk7CisgICAgbV9pdGVtLmZhY2UgPSBwbGF0Zm9ybURhdGEuaGFyZmJ1
enpGYWNlKCk7CisgICAgdm9pZCogb3BhcXVlUGxhdGZvcm1EYXRhID0gY29uc3RfY2FzdDxGb250
UGxhdGZvcm1EYXRhKj4oJnBsYXRmb3JtRGF0YSk7CisgICAgbV9pdGVtLmZvbnQtPnVzZXJEYXRh
ID0gb3BhcXVlUGxhdGZvcm1EYXRhOworfQorCitIQl9Gb250UmVjKiBDb21wbGV4VGV4dENvbnRy
b2xsZXI6OmFsbG9jSGFyZmJ1enpGb250KCkKK3sKKyAgICBIQl9Gb250UmVjKiBmb250ID0gcmVp
bnRlcnByZXRfY2FzdDxIQl9Gb250UmVjKj4oZmFzdE1hbGxvYyhzaXplb2YoSEJfRm9udFJlYykp
KTsKKyAgICBtZW1zZXQoZm9udCwgMCwgc2l6ZW9mKEhCX0ZvbnRSZWMpKTsKKyAgICBmb250LT5r
bGFzcyA9ICZoYXJmYnV6elNraWFDbGFzczsKKyAgICBmb250LT51c2VyRGF0YSA9IDA7CisgICAg
Ly8gVGhlIHZhbHVlcyB3aGljaCBoYXJmYnV6elNraWFDbGFzcyByZXR1cm5zIGFyZSBhbHJlYWR5
IHNjYWxlZCB0bworICAgIC8vIHBpeGVsIHVuaXRzLCBzbyB3ZSBqdXN0IHNldCBhbGwgdGhlc2Ug
dG8gb25lIHRvIGRpc2FibGUgZnVydGhlcgorICAgIC8vIHNjYWxpbmcuCisgICAgZm9udC0+eF9w
cGVtID0gMTsKKyAgICBmb250LT55X3BwZW0gPSAxOworICAgIGZvbnQtPnhfc2NhbGUgPSAxOwor
ICAgIGZvbnQtPnlfc2NhbGUgPSAxOworCisgICAgcmV0dXJuIGZvbnQ7Cit9CisKK3ZvaWQgQ29t
cGxleFRleHRDb250cm9sbGVyOjpkZWxldGVHbHlwaEFycmF5cygpCit7CisgICAgZGVsZXRlW10g
bV9pdGVtLmdseXBoczsKKyAgICBkZWxldGVbXSBtX2l0ZW0uYXR0cmlidXRlczsKKyAgICBkZWxl
dGVbXSBtX2l0ZW0uYWR2YW5jZXM7CisgICAgZGVsZXRlW10gbV9pdGVtLm9mZnNldHM7CisgICAg
ZGVsZXRlW10gbV9nbHlwaHMxNjsKKyAgICBkZWxldGVbXSBtX3hQb3NpdGlvbnM7Cit9CisKK3Zv
aWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpjcmVhdGVHbHlwaEFycmF5cyhpbnQgc2l6ZSkKK3sK
KyAgICBtX2l0ZW0uZ2x5cGhzID0gbmV3IEhCX0dseXBoW3NpemVdOworICAgIG1faXRlbS5hdHRy
aWJ1dGVzID0gbmV3IEhCX0dseXBoQXR0cmlidXRlc1tzaXplXTsKKyAgICBtX2l0ZW0uYWR2YW5j
ZXMgPSBuZXcgSEJfRml4ZWRbc2l6ZV07CisgICAgbV9pdGVtLm9mZnNldHMgPSBuZXcgSEJfRml4
ZWRQb2ludFtzaXplXTsKKworICAgIG1fZ2x5cGhzMTYgPSBuZXcgdWludDE2X3Rbc2l6ZV07Cisg
ICAgbV94UG9zaXRpb25zID0gbmV3IFNrU2NhbGFyW3NpemVdOworCisgICAgbV9pdGVtLm51bV9n
bHlwaHMgPSBzaXplOworICAgIG1fZ2x5cGhzQXJyYXlDYXBhY2l0eSA9IHNpemU7IC8vIFNhdmUg
dGhlIEdseXBoQXJyYXlzIHNpemUuCisgICAgcmVzZXRHbHlwaEFycmF5cygpOworfQorCit2b2lk
IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6cmVzZXRHbHlwaEFycmF5cygpCit7CisgICAgaW50IHNp
emUgPSBtX2l0ZW0ubnVtX2dseXBoczsKKyAgICAvLyBBbGwgdGhlIHR5cGVzIGhlcmUgZG9uJ3Qg
aGF2ZSBwb2ludGVycy4gSXQgaXMgc2FmZSB0byByZXNldCB0bworICAgIC8vIHplcm8gdW5sZXNz
IEhhcmZidXp6IGJyZWFrcyB0aGUgY29tcGF0aWJpbGl0eSBpbiB0aGUgZnV0dXJlLgorICAgIG1l
bXNldChtX2l0ZW0uZ2x5cGhzLCAwLCBzaXplICogc2l6ZW9mKEhCX0dseXBoKSk7CisgICAgbWVt
c2V0KG1faXRlbS5hdHRyaWJ1dGVzLCAwLCBzaXplICogc2l6ZW9mKEhCX0dseXBoQXR0cmlidXRl
cykpOworICAgIG1lbXNldChtX2l0ZW0uYWR2YW5jZXMsIDAsIHNpemUgKiBzaXplb2YoSEJfRml4
ZWQpKTsKKyAgICBtZW1zZXQobV9pdGVtLm9mZnNldHMsIDAsIHNpemUgKiBzaXplb2YoSEJfRml4
ZWRQb2ludCkpOworICAgIG1lbXNldChtX2dseXBoczE2LCAwLCBzaXplICogc2l6ZW9mKHVpbnQx
Nl90KSk7CisgICAgbWVtc2V0KG1feFBvc2l0aW9ucywgMCwgc2l6ZSAqIHNpemVvZihTa1NjYWxh
cikpOworfQorCit2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2hhcGVHbHlwaHMoKQorewor
ICAgIC8vIEhCX1NoYXBlSXRlbSgpIHJlc2V0cyBtX2l0ZW0ubnVtX2dseXBocy4gSWYgdGhlIHBy
ZXZpb3VzIGNhbGwgdG8KKyAgICAvLyBIQl9TaGFwZUl0ZW0oKSB1c2VkIGxlc3Mgc3BhY2UgdGhh
biB3YXMgYXZhaWxhYmxlLCB0aGUgY2FwYWNpdHkgb2YKKyAgICAvLyB0aGUgYXJyYXkgbWF5IGJl
IGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIG1faXRlbS5udW1fZ2x5cGhzLiAKKyAg
ICAvLyBTbywgd2UgbmVlZCB0byByZXNldCB0aGUgbnVtX2dseXBocyB0byB0aGUgY2FwYWNpdHkg
b2YgdGhlIGFycmF5LgorICAgIG1faXRlbS5udW1fZ2x5cGhzID0gbV9nbHlwaHNBcnJheUNhcGFj
aXR5OworICAgIHJlc2V0R2x5cGhBcnJheXMoKTsKKyAgICB3aGlsZSAoIUhCX1NoYXBlSXRlbSgm
bV9pdGVtKSkgeworICAgICAgICAvLyBXZSBvdmVyZmxvd2VkIG91ciBhcnJheXMuIFJlc2l6ZSBh
bmQgcmV0cnkuCisgICAgICAgIC8vIEhCX1NoYXBlSXRlbSBmaWxscyBpbiBtX2l0ZW0ubnVtX2ds
eXBocyB3aXRoIHRoZSBuZWVkZWQgc2l6ZS4KKyAgICAgICAgZGVsZXRlR2x5cGhBcnJheXMoKTsK
KyAgICAgICAgLy8gVGhlIHwrIDF8IGhlcmUgaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBI
YXJmYnV6ejogdGhlIEtobWVyCisgICAgICAgIC8vIHNoYXBlciAoYXQgbGVhc3QpIGNhbiBmYWls
IGJlY2F1c2Ugb2YgaW5zdWZmaWNpZW50IGdseXBoIGJ1ZmZlcnMKKyAgICAgICAgLy8gYW5kIHJl
cXVlc3QgMCBhZGRpdGlvbmFsIGdseXBoczogdGhyb3dpbmcgdXMgaW50byBhbiBpbmZpbml0ZQor
ICAgICAgICAvLyBsb29wLgorICAgICAgICBjcmVhdGVHbHlwaEFycmF5cyhtX2l0ZW0ubnVtX2ds
eXBocyArIDEpOworICAgIH0KK30KKwordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNldEds
eXBoWFBvc2l0aW9ucyhib29sIGlzUlRMKQoreworICAgIGRvdWJsZSBwb3NpdGlvbiA9IDA7Cisg
ICAgLy8gbG9nQ2x1c3RlcnNJbmRleCBpbmRleGVzIGxvZ0NsdXN0ZXJzIGZvciB0aGUgZmlyc3Qg
KG9yIGxhc3Qgd2hlbgorICAgIC8vIFJUTCkgY29kZXBvaW50IG9mIHRoZSBjdXJyZW50IGdseXBo
LiAgRWFjaCB0aW1lIHdlIGFkdmFuY2UgYSBnbHlwaCwKKyAgICAvLyB3ZSBza2lwIG92ZXIgYWxs
IHRoZSBjb2RlcG9pbnRzIHRoYXQgY29udHJpYnV0ZWQgdG8gdGhlIGN1cnJlbnQKKyAgICAvLyBn
bHlwaC4KKyAgICBpbnQgbG9nQ2x1c3RlcnNJbmRleCA9IDA7CisKKyAgICBpZiAoaXNSVEwpIHsK
KyAgICAgICAgbG9nQ2x1c3RlcnNJbmRleCA9IG1faXRlbS5udW1fZ2x5cGhzIC0gMTsKKworICAg
ICAgICAvLyBHbHlwaHMgYXJlIHN0b3JlZCBpbiBsb2dpY2FsIG9yZGVyLCBidXQgZm9yIGxheW91
dCBwdXJwb3NlcyB3ZQorICAgICAgICAvLyBhbHdheXMgZ28gbGVmdCB0byByaWdodC4KKyAgICAg
ICAgZm9yIChpbnQgaSA9IG1faXRlbS5udW1fZ2x5cGhzIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAg
ICAgICAgICAgIGlmICghbV9jdXJyZW50Rm9udERhdGEtPmlzWmVyb1dpZHRoU3BhY2VHbHlwaCht
X2dseXBoczE2W2ldKSkgeworICAgICAgICAgICAgICAgIC8vIFdoaXRlc3BhY2UgbXVzdCBiZSBs
YWlkIG91dCBpbiBsb2dpY2FsIG9yZGVyLCBzbyB3aGVuIGluc2VydGluZworICAgICAgICAgICAg
ICAgIC8vIHNwYWNlcyBpbiBSVEwgKGJ1dCBpdGVyYXRpbmcgaW4gTFRSIG9yZGVyKSB3ZSBtdXN0
IGluc2VydCBzcGFjZXMKKyAgICAgICAgICAgICAgICAvLyBfYmVmb3JlXyB0aGUgbmV4dCBnbHlw
aC4KKyAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGkgKyAxKSA+PSBt
X2l0ZW0ubnVtX2dseXBocyB8fCBtX2l0ZW0uYXR0cmlidXRlc1tpICsgMV0uY2x1c3RlclN0YXJ0
KQorICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBtX2xldHRlclNwYWNpbmc7CisKKyAg
ICAgICAgICAgICAgICBwb3NpdGlvbiArPSBkZXRlcm1pbmVXb3JkQnJlYWtTcGFjaW5nKGxvZ0Ns
dXN0ZXJzSW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX2dseXBoczE2W2ld
ID0gbV9pdGVtLmdseXBoc1tpXTsKKyAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gdHJ1bmNh
dGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1faXRlbS5vZmZzZXRzW2ldLngpOworICAgICAgICAgICAg
bV94UG9zaXRpb25zW2ldID0gbV9vZmZzZXRYICsgcG9zaXRpb24gKyBvZmZzZXRYOworCisgICAg
ICAgICAgICB3aGlsZSAobG9nQ2x1c3RlcnNJbmRleCA+IDAgJiYgbG9nQ2x1c3RlcnMoKVtsb2dD
bHVzdGVyc0luZGV4XSA9PSBpKQorICAgICAgICAgICAgICAgIGxvZ0NsdXN0ZXJzSW5kZXgtLTsK
KworICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRGb250RGF0YS0+aXNaZXJvV2lkdGhTcGFjZUds
eXBoKG1fZ2x5cGhzMTZbaV0pKQorICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHRydW5jYXRl
Rml4ZWRQb2ludFRvSW50ZWdlcihtX2l0ZW0uYWR2YW5jZXNbaV0pOworICAgICAgICB9CisgICAg
fSBlbHNlIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2l0ZW0ubnVtX2dseXBo
czsgKytpKSB7CisgICAgICAgICAgICBtX2dseXBoczE2W2ldID0gbV9pdGVtLmdseXBoc1tpXTsK
KyAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2Vy
KG1faXRlbS5vZmZzZXRzW2ldLngpOworICAgICAgICAgICAgbV94UG9zaXRpb25zW2ldID0gbV9v
ZmZzZXRYICsgcG9zaXRpb24gKyBvZmZzZXRYOworCisgICAgICAgICAgICBpZiAobV9jdXJyZW50
Rm9udERhdGEtPmlzWmVyb1dpZHRoU3BhY2VHbHlwaChtX2dseXBoczE2W2ldKSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgZG91YmxlIGFkdmFuY2UgPSB0cnVuY2F0
ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLmFkdmFuY2VzW2ldKTsKKworICAgICAgICAgICAg
YWR2YW5jZSArPSBkZXRlcm1pbmVXb3JkQnJlYWtTcGFjaW5nKGxvZ0NsdXN0ZXJzSW5kZXgpOwor
CisgICAgICAgICAgICBpZiAobV9pdGVtLmF0dHJpYnV0ZXNbaV0uY2x1c3RlclN0YXJ0KQorICAg
ICAgICAgICAgICAgIGFkdmFuY2UgKz0gbV9sZXR0ZXJTcGFjaW5nOworCisgICAgICAgICAgICB3
aGlsZSAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxvZ0NsdXN0ZXJzSW5kZXgpIDwgbV9pdGVtLml0
ZW0ubGVuZ3RoICYmIGxvZ0NsdXN0ZXJzKClbbG9nQ2x1c3RlcnNJbmRleF0gPT0gaSkKKyAgICAg
ICAgICAgICAgICBsb2dDbHVzdGVyc0luZGV4Kys7CisKKyAgICAgICAgICAgIHBvc2l0aW9uICs9
IGFkdmFuY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgbV9waXhlbFdpZHRoID0gc3RkOjptYXgo
cG9zaXRpb24sIDAuMCk7CisgICAgbV9vZmZzZXRYICs9IG1fcGl4ZWxXaWR0aDsKK30KKwordm9p
ZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6Om5vcm1hbGl6ZVNwYWNlc0FuZE1pcnJvckNoYXJzKGNv
bnN0IFVDaGFyKiBzb3VyY2UsIGJvb2wgcnRsLCBVQ2hhciogZGVzdGluYXRpb24sIGludCBsZW5n
dGgpCit7CisgICAgaW50IHBvc2l0aW9uID0gMDsKKyAgICBib29sIGVycm9yID0gZmFsc2U7Cisg
ICAgLy8gSXRlcmF0ZSBjaGFyYWN0ZXJzIGluIHNvdXJjZSBhbmQgbWlycm9yIGNoYXJhY3RlciBp
ZiBuZWVkZWQuCisgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7CisgICAgICAgIFVDaGFy
MzIgY2hhcmFjdGVyOworICAgICAgICBpbnQgbmV4dFBvc2l0aW9uID0gcG9zaXRpb247CisgICAg
ICAgIFUxNl9ORVhUKHNvdXJjZSwgbmV4dFBvc2l0aW9uLCBsZW5ndGgsIGNoYXJhY3Rlcik7Cisg
ICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3BhY2UoY2hhcmFjdGVyKSkKKyAgICAgICAgICAgIGNo
YXJhY3RlciA9ICcgJzsKKyAgICAgICAgZWxzZSBpZiAoRm9udDo6dHJlYXRBc1plcm9XaWR0aFNw
YWNlKGNoYXJhY3RlcikpCisgICAgICAgICAgICBjaGFyYWN0ZXIgPSB6ZXJvV2lkdGhTcGFjZTsK
KyAgICAgICAgZWxzZSBpZiAocnRsKQorICAgICAgICAgICAgY2hhcmFjdGVyID0gdV9jaGFyTWly
cm9yKGNoYXJhY3Rlcik7CisgICAgICAgIFUxNl9BUFBFTkQoZGVzdGluYXRpb24sIHBvc2l0aW9u
LCBsZW5ndGgsIGNoYXJhY3RlciwgZXJyb3IpOworICAgICAgICBBU1NFUlQoIWVycm9yKTsKKyAg
ICAgICAgcG9zaXRpb24gPSBuZXh0UG9zaXRpb247CisgICAgfQorfQorCitjb25zdCBUZXh0UnVu
JiBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdldE5vcm1hbGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRS
dW4mIG9yaWdpbmFsUnVuLCBPd25QdHI8VGV4dFJ1bj4mIG5vcm1hbGl6ZWRSdW4sIE93bkFycmF5
UHRyPFVDaGFyPiYgbm9ybWFsaXplZEJ1ZmZlcikKK3sKKyAgICAvLyBOb3JtYWxpemUgdGhlIHRl
eHQgcnVuIGluIHRocmVlIHdheXM6CisgICAgLy8gMSkgQ29udmVydCB0aGUgfG9yaWdpbmFsUnVu
fCB0byBORkMgbm9ybWFsaXplZCBmb3JtIGlmIGNvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcwor
ICAgIC8vIChVKzAzMDAuLikgYXJlIHVzZWQgaW4gdGhlIHJ1bi4gVGhpcyBjb252ZXJzaW9uIGlz
IG5lY2Vzc2FyeSBzaW5jZSBtb3N0IE9wZW5UeXBlCisgICAgLy8gZm9udHMgKGUuZy4sIEFyaWFs
KSBkb24ndCBoYXZlIHN1YnN0aXR1dGlvbiBydWxlcyBmb3IgdGhlIGRpYWNyaXRpY2FsIG1hcmtz
IGluCisgICAgLy8gdGhlaXIgR1NVQiB0YWJsZXMuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQg
d2UgZG9uJ3QgdXNlIHRoZSBpY3U6Ok5vcm1hbGl6ZXI6OmlzTm9ybWFsaXplZChVTk9STV9ORkMp
IEFQSSBoZXJlIHNpbmNlCisgICAgLy8gdGhlIEFQSSByZXR1cm5zIEZBTFNFICg9IG5vdCBub3Jt
YWxpemVkKSBmb3IgY29tcGxleCBydW5zIHRoYXQgZG9uJ3QgcmVxdWlyZSBORkMKKyAgICAvLyBu
b3JtYWxpemF0aW9uIChlLmcuLCBBcmFiaWMgdGV4dCkuIFVubGVzcyB0aGUgcnVuIGNvbnRhaW5z
IHRoZSBkaWFjcml0aWNhbCBtYXJrcywKKyAgICAvLyBIYXJmYnV6eiB3aWxsIGRvIHRoZSBzYW1l
IHRoaW5nIGZvciB1cyB1c2luZyB0aGUgR1NVQiB0YWJsZS4KKyAgICAvLyAyKSBDb252ZXJ0IHNw
YWNpbmcgY2hhcmFjdGVycyBpbnRvIHBsYWluIHNwYWNlcywgYXMgc29tZSBmb250cyB3aWxsIHBy
b3ZpZGUgZ2x5cGhzCisgICAgLy8gZm9yIGNoYXJhY3RlcnMgbGlrZSAnXG4nIG90aGVyd2lzZS4K
KyAgICAvLyAzKSBDb252ZXJ0IG1pcnJvcmVkIGNoYXJhY3RlcnMgc3VjaCBhcyBwYXJlbnRoZXNp
cyBmb3IgcnRsIHRleHQuCisKKyAgICAvLyBDb252ZXJ0IHRvIE5GQyBmb3JtIGlmIHRoZSB0ZXh0
IGhhcyBkaWFjcml0aWNhbCBtYXJrcy4KKyAgICBpY3U6OlVuaWNvZGVTdHJpbmcgbm9ybWFsaXpl
ZFN0cmluZzsKKyAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9aRVJPX0VSUk9SOworCisgICAgZm9y
IChpbnQxNl90IGkgPSAwOyBpIDwgb3JpZ2luYWxSdW4ubGVuZ3RoKCk7ICsraSkgeworICAgICAg
ICBVQ2hhciBjaCA9IG9yaWdpbmFsUnVuW2ldOworICAgICAgICBpZiAoOjp1YmxvY2tfZ2V0Q29k
ZShjaCkgPT0gVUJMT0NLX0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLUykgeworICAgICAgICAg
ICAgaWN1OjpOb3JtYWxpemVyOjpub3JtYWxpemUoaWN1OjpVbmljb2RlU3RyaW5nKG9yaWdpbmFs
UnVuLmNoYXJhY3RlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG9yaWdpbmFsUnVuLmxlbmd0aCgpKSwgVU5PUk1fTkZDLCAwIC8qIG5vIG9wdGlvbnMgKi8sCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkU3RyaW5nLCBl
cnJvcik7CisgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKGVycm9yKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gb3JpZ2luYWxSdW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIE5vcm1hbGl6ZSBzcGFjZSBhbmQgbWlycm9yIHBhcmVudGhlc2lzIGZvciBy
dGwgdGV4dC4KKyAgICBpbnQgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aDsKKyAgICBjb25zdCBVQ2hh
ciogc291cmNlVGV4dDsKKyAgICBpZiAobm9ybWFsaXplZFN0cmluZy5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCA9IG9yaWdpbmFsUnVuLmxlbmd0aCgpOworICAg
ICAgICBzb3VyY2VUZXh0ID0gb3JpZ2luYWxSdW4uY2hhcmFjdGVycygpOworICAgIH0gZWxzZSB7
CisgICAgICAgIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGggPSBub3JtYWxpemVkU3RyaW5nLmxlbmd0
aCgpOworICAgICAgICBzb3VyY2VUZXh0ID0gbm9ybWFsaXplZFN0cmluZy5nZXRCdWZmZXIoKTsK
KyAgICB9CisKKyAgICBub3JtYWxpemVkQnVmZmVyLnNldChuZXcgVUNoYXJbbm9ybWFsaXplZEJ1
ZmZlckxlbmd0aCArIDFdKTsKKworICAgIG5vcm1hbGl6ZVNwYWNlc0FuZE1pcnJvckNoYXJzKHNv
dXJjZVRleHQsIG9yaWdpbmFsUnVuLnJ0bCgpLCBub3JtYWxpemVkQnVmZmVyLmdldCgpLCBub3Jt
YWxpemVkQnVmZmVyTGVuZ3RoKTsKKworICAgIG5vcm1hbGl6ZWRSdW4uc2V0KG5ldyBUZXh0UnVu
KG9yaWdpbmFsUnVuKSk7CisgICAgbm9ybWFsaXplZFJ1bi0+c2V0VGV4dChub3JtYWxpemVkQnVm
ZmVyLmdldCgpLCBub3JtYWxpemVkQnVmZmVyTGVuZ3RoKTsKKyAgICByZXR1cm4gKm5vcm1hbGl6
ZWRSdW47Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguaCBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVy
TGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5lMDMwZGJiNDBhZTczMTIzNDU4NTFmNjc2MGVkMDIyYWNlMGZj
Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9Db21wbGV4VGV4dENvbnRyb2xsZXJMaW51eC5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICog
Q29weXJpZ2h0IChjKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBD
b21wbGV4VGV4dENvbnRyb2xsZXJMaW51eF9oCisjZGVmaW5lIENvbXBsZXhUZXh0Q29udHJvbGxl
ckxpbnV4X2gKKworI2luY2x1ZGUgIkhhcmZidXp6U2tpYS5oIgorCisjaW5jbHVkZSA8d3RmL093
bkFycmF5UHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQ29tcGxleFRleHRDb250
cm9sbGVyIHdhbGtzIGEgVGV4dFJ1biBhbmQgcHJlc2VudHMgZWFjaCBzY3JpcHQgcnVuIGluIHNl
cXVlbmNlLiBBCisvLyBUZXh0UnVuIGlzIGEgc2VxdWVuY2Ugb2YgY29kZS1wb2ludHMgd2l0aCB0
aGUgc2FtZSBlbWJlZGRpbmcgbGV2ZWwgKGkuZS4gdGhleQorLy8gYXJlIGFsbCBsZWZ0LXRvLXJp
Z2h0IG9yIHJpZ2h0LXRvLWxlZnQpLiBBIHNjcmlwdCBydW4gaXMgYSBzdWJzZXF1ZW5jZSB3aGVy
ZQorLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIGhhdmUgdGhlIHNhbWUgc2NyaXB0IChlLmcuIEFyYWJp
YywgVGhhaSBldGMpLiBTaGFwaW5nIGlzCisvLyBvbmx5IGV2ZXIgZG9uZSB3aXRoIHNjcmlwdCBy
dW5zIHNpbmNlIHRoZSBzaGFwZXJzIG9ubHkga25vdyBob3cgdG8gZGVhbCB3aXRoCisvLyBhIHNp
bmdsZSBzY3JpcHQuCisvLworLy8gQWZ0ZXIgY3JlYXRpbmcgaXQsIHRoZSBzY3JpcHQgcnVucyBh
cmUgZWl0aGVyIGl0ZXJhdGVkIGJhY2t3YXJkcyBvciBmb3J3YXJkcy4KKy8vIEl0IGRlZmF1bHRz
IHRvIGJhY2t3YXJkcyBmb3IgUlRMIGFuZCBmb3J3YXJkcyBvdGhlcndpc2UgKHdoaWNoIG1hdGNo
ZXMgdGhlCisvLyBwcmVzZW50YXRpb24gb3JkZXIpLCBob3dldmVyIHlvdSBjYW4gc2V0IGl0IHdp
dGggfHNldEJhY2t3YXJkc0l0ZXJhdGlvbnwuCisvLworLy8gT25jZSB5b3UgaGF2ZSBzZXR1cCB0
aGUgb2JqZWN0LCBjYWxsIHxuZXh0U2NyaXB0UnVufCB0byBnZXQgdGhlIGZpcnN0IHNjcmlwdAor
Ly8gcnVuLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGl0ZXJhdGlvbiBpcyBjb21w
bGV0ZS4gQXQgYW55IHRpbWUgeW91CisvLyBjYW4gY2FsbCB8cmVzZXR8IHRvIHN0YXJ0IG92ZXIg
YWdhaW4uCitjbGFzcyBDb21wbGV4VGV4dENvbnRyb2xsZXIgeworcHVibGljOgorICAgIENvbXBs
ZXhUZXh0Q29udHJvbGxlcihjb25zdCBUZXh0UnVuJiwgdW5zaWduZWQsIGNvbnN0IEZvbnQqKTsK
KyAgICB+Q29tcGxleFRleHRDb250cm9sbGVyKCk7CisKKyAgICBib29sIGlzV29yZEJyZWFrKHVu
c2lnbmVkKTsKKyAgICBpbnQgZGV0ZXJtaW5lV29yZEJyZWFrU3BhY2luZyh1bnNpZ25lZCk7Cisg
ICAgLy8gc2V0UGFkZGluZyBzZXRzIGEgbnVtYmVyIG9mIHBpeGVscyB0byBiZSBkaXN0cmlidXRl
ZCBhY3Jvc3MgdGhlIFRleHRSdW4uCisgICAgLy8gV2ViS2l0IHVzZXMgdGhpcyB0byBqdXN0aWZ5
IHRleHQuCisgICAgdm9pZCBzZXRQYWRkaW5nKGludCk7CisgICAgdm9pZCByZXNldCgpOworICAg
IHZvaWQgc2V0QmFja3dhcmRzSXRlcmF0aW9uKGJvb2wpOworICAgIC8vIEFkdmFuY2UgdG8gdGhl
IG5leHQgc2NyaXB0IHJ1biwgcmV0dXJuaW5nIGZhbHNlIHdoZW4gdGhlIGVuZCBvZiB0aGUKKyAg
ICAvLyBUZXh0UnVuIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgYm9vbCBuZXh0U2NyaXB0UnVuKCk7
CisgICAgZmxvYXQgd2lkdGhPZkZ1bGxSdW4oKTsKKworICAgIC8vIHNldFdvcmRTcGFjaW5nQWRq
dXN0bWVudCBzZXRzIGEgZGVsdGEgKGluIHBpeGVscykgd2hpY2ggaXMgYXBwbGllZCBhdAorICAg
IC8vIGVhY2ggd29yZCBicmVhayBpbiB0aGUgVGV4dFJ1bi4KKyAgICB2b2lkIHNldFdvcmRTcGFj
aW5nQWRqdXN0bWVudChpbnQgd29yZFNwYWNpbmdBZGp1c3RtZW50KSB7IG1fd29yZFNwYWNpbmdB
ZGp1c3RtZW50ID0gd29yZFNwYWNpbmdBZGp1c3RtZW50OyB9CisKKyAgICAvLyBzZXRMZXR0ZXJT
cGFjaW5nQWRqdXN0bWVudCBzZXRzIGFuIGFkZGl0aW9uYWwgbnVtYmVyIG9mIHBpeGVscyB0aGF0
IGlzCisgICAgLy8gYWRkZWQgdG8gdGhlIGFkdmFuY2UgYWZ0ZXIgZWFjaCBvdXRwdXQgY2x1c3Rl
ci4gVGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvdXIKKyAgICAvLyBvZiBXaWR0aEl0ZXJhdG9yOjph
ZHZhbmNlLgorICAgIHZvaWQgc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQoaW50IGxldHRlclNw
YWNpbmdBZGp1c3RtZW50KSB7IG1fbGV0dGVyU3BhY2luZyA9IGxldHRlclNwYWNpbmdBZGp1c3Rt
ZW50OyB9CisgICAgaW50IGxldHRlclNwYWNpbmcoKSBjb25zdCB7IHJldHVybiBtX2xldHRlclNw
YWNpbmc7IH0KKworICAgIC8vIFNldCB0aGUgeCBvZmZzZXQgZm9yIHRoZSBuZXh0IHNjcmlwdCBy
dW4uIFRoaXMgYWZmZWN0cyB0aGUgdmFsdWVzIGluCisgICAgLy8gfHhQb3NpdGlvbnN8CisgICAg
dm9pZCBzZXRYT2Zmc2V0VG9aZXJvKCkgeyBtX29mZnNldFggPSAwOyB9CisgICAgYm9vbCBydGwo
KSBjb25zdCB7IHJldHVybiBtX3J1bi5ydGwoKTsgfQorICAgIGNvbnN0IHVpbnQxNl90KiBnbHlw
aHMoKSBjb25zdCB7IHJldHVybiBtX2dseXBoczE2OyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGxl
bmd0aCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgfGdseXBoc3wKKyAgICBjb25zdCB1bnNpZ25l
ZCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2l0ZW0ubnVtX2dseXBoczsgfQorCisgICAgLy8g
UmV0dXJuIHRoZSB4IG9mZnNldCBmb3IgZWFjaCBvZiB0aGUgZ2x5cGhzLiBOb3RlIHRoYXQgdGhp
cyBpcyB0cmFuc2xhdGVkCisgICAgLy8gYnkgdGhlIGN1cnJlbnQgeCBvZmZzZXQgYW5kIHRoYXQg
dGhlIHggb2Zmc2V0IGlzIHVwZGF0ZWQgZm9yIGVhY2ggc2NyaXB0CisgICAgLy8gcnVuLgorICAg
IGNvbnN0IFNrU2NhbGFyKiB4UG9zaXRpb25zKCkgY29uc3QgeyByZXR1cm4gbV94UG9zaXRpb25z
OyB9CisKKyAgICAvLyBHZXQgdGhlIGFkdmFuY2VzICh3aWR0aHMpIGZvciBlYWNoIGdseXBoLgor
ICAgIGNvbnN0IEhCX0ZpeGVkKiBhZHZhbmNlcygpIGNvbnN0IHsgcmV0dXJuIG1faXRlbS5hZHZh
bmNlczsgfQorCisgICAgLy8gUmV0dXJuIHRoZSB3aWR0aCAoaW4gcHgpIG9mIHRoZSBjdXJyZW50
IHNjcmlwdCBydW4uCisgICAgY29uc3QgdW5zaWduZWQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBt
X3BpeGVsV2lkdGg7IH0KKworICAgIC8vIFJldHVybiB0aGUgY2x1c3RlciBsb2cgZm9yIHRoZSBj
dXJyZW50IHNjcmlwdCBydW4uIEZvciBleGFtcGxlOgorICAgIC8vICAgc2NyaXB0IHJ1bjogZiBp
IGEgbiBjIMOpICAoZmkgZ2V0cyBsaWdhdHVyZWQpCisgICAgLy8gICBsb2cgY2x1dHJzOiAwIDAg
MSAyIDMgNAorICAgIC8vIFNvLCBmb3IgZWFjaCBpbnB1dCBjb2RlIHBvaW50LCB0aGUgbG9nIHRl
bGxzIHlvdSB3aGljaCBvdXRwdXQgZ2x5cGggd2FzCisgICAgLy8gZ2VuZXJhdGVkIGZvciBpdC4K
KyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogbG9nQ2x1c3RlcnMoKSBjb25zdCB7IHJldHVybiBt
X2l0ZW0ubG9nX2NsdXN0ZXJzOyB9CisKKyAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiBjb2Rl
IHBvaW50cyBpbiB0aGUgY3VycmVudCBzY3JpcHQgcnVuCisgICAgY29uc3QgdW5zaWduZWQgbnVt
Q29kZVBvaW50cygpIGNvbnN0IHsgcmV0dXJuIG1fbnVtQ29kZVBvaW50czsgfQorCisgICAgY29u
c3QgRm9udFBsYXRmb3JtRGF0YSogZm9udFBsYXRmb3JtRGF0YUZvclNjcmlwdFJ1bigpIHsgcmV0
dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KG1faXRlbS5mb250LT51c2Vy
RGF0YSk7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHNldHVwRm9udEZvclNjcmlwdFJ1bigpOwor
ICAgIEhCX0ZvbnRSZWMqIGFsbG9jSGFyZmJ1enpGb250KCk7CisgICAgdm9pZCBkZWxldGVHbHlw
aEFycmF5cygpOworICAgIHZvaWQgY3JlYXRlR2x5cGhBcnJheXMoaW50KTsKKyAgICB2b2lkIHJl
c2V0R2x5cGhBcnJheXMoKTsKKyAgICB2b2lkIHNoYXBlR2x5cGhzKCk7CisgICAgdm9pZCBzZXRH
bHlwaFhQb3NpdGlvbnMoYm9vbCk7CisKKyAgICBzdGF0aWMgdm9pZCBub3JtYWxpemVTcGFjZXNB
bmRNaXJyb3JDaGFycyhjb25zdCBVQ2hhciogc291cmNlLCBib29sIHJ0bCwgVUNoYXIqIGRlc3Rp
bmF0aW9uLCBpbnQgbGVuZ3RoKTsKKyAgICBzdGF0aWMgY29uc3QgVGV4dFJ1biYgZ2V0Tm9ybWFs
aXplZFRleHRSdW4oY29uc3QgVGV4dFJ1biYgb3JpZ2luYWxSdW4sIE93blB0cjxUZXh0UnVuPiYg
bm9ybWFsaXplZFJ1biwgT3duQXJyYXlQdHI8VUNoYXI+JiBub3JtYWxpemVkQnVmZmVyKTsKKwor
ICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgbG9naWMgaW4gUmVuZGVyQmxvY2s6OmZpbmROZXh0TGlu
ZUJyZWFrCisgICAgc3RhdGljIGJvb2wgaXNDb2RlcG9pbnRTcGFjZShIQl9VQ2hhcjE2IGMpIHsg
cmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JzsgfQorCisgICAgY29uc3QgRm9udCogY29uc3Qg
bV9mb250OworICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBtX2N1cnJlbnRGb250RGF0YTsKKyAg
ICBIQl9TaGFwZXJJdGVtIG1faXRlbTsKKyAgICB1aW50MTZfdCogbV9nbHlwaHMxNjsgLy8gQSB2
ZWN0b3Igb2YgMTYtYml0IGdseXBoIGlkcy4KKyAgICBTa1NjYWxhciogbV94UG9zaXRpb25zOyAv
LyBBIHZlY3RvciBvZiB4IHBvc2l0aW9ucyBmb3IgZWFjaCBnbHlwaC4KKyAgICBzc2l6ZV90IG1f
aW5kZXhPZk5leHRTY3JpcHRSdW47IC8vIEluZGV4ZXMgdGhlIHNjcmlwdCBydW4gaW4gfG1fcnVu
fC4KKyAgICBjb25zdCB1bnNpZ25lZCBtX3N0YXJ0aW5nWDsgLy8gT2Zmc2V0IGluIHBpeGVscyBv
ZiB0aGUgZmlyc3Qgc2NyaXB0IHJ1bi4KKyAgICB1bnNpZ25lZCBtX29mZnNldFg7IC8vIE9mZnNl
dCBpbiBwaXhlbHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHNjcmlwdCBydW4uCisgICAgdW5z
aWduZWQgbV9waXhlbFdpZHRoOyAvLyBXaWR0aCAoaW4gcHgpIG9mIHRoZSBjdXJyZW50IHNjcmlw
dCBydW4uCisgICAgdW5zaWduZWQgbV9udW1Db2RlUG9pbnRzOyAvLyBDb2RlIHBvaW50cyBpbiBj
dXJyZW50IHNjcmlwdCBydW4uCisgICAgdW5zaWduZWQgbV9nbHlwaHNBcnJheUNhcGFjaXR5OyAv
LyBDdXJyZW50IHNpemUgb2YgYWxsIHRoZSBIYXJmYnV6eiBhcnJheXMuCisKKyAgICBPd25QdHI8
VGV4dFJ1bj4gbV9ub3JtYWxpemVkUnVuOworICAgIE93bkFycmF5UHRyPFVDaGFyPiBtX25vcm1h
bGl6ZWRCdWZmZXI7IC8vIEEgYnVmZmVyIGZvciBub3JtYWxpemVkIHJ1bi4KKyAgICBjb25zdCBU
ZXh0UnVuJiBtX3J1bjsKKyAgICBib29sIG1faXRlcmF0ZUJhY2t3YXJkczsKKyAgICBpbnQgbV93
b3JkU3BhY2luZ0FkanVzdG1lbnQ7IC8vIGRlbHRhIGFkanVzdG1lbnQgKHBpeGVscykgZm9yIGVh
Y2ggd29yZCBicmVhay4KKyAgICBmbG9hdCBtX3BhZGRpbmc7IC8vIHBpeGVscyB0byBiZSBkaXN0
cmlidXRlZCBvdmVyIHRoZSBsaW5lIGF0IHdvcmQgYnJlYWtzLgorICAgIGZsb2F0IG1fcGFkUGVy
V29yZEJyZWFrOyAvLyBwaXhlbHMgdG8gYmUgYWRkZWQgdG8gZWFjaCB3b3JkIGJyZWFrLgorICAg
IGZsb2F0IG1fcGFkRXJyb3I7IC8vIHxtX3BhZFBlcldvcmRCcmVha3wgbWlnaHQgaGF2ZSBhIGZy
YWN0aW9uYWwgY29tcG9uZW50LgorICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIG9u
bHkgYWRkIGEgd2hvbGUgbnVtYmVyIG9mIHBhZGRpbmcgcGl4ZWxzIGF0CisgICAgICAgICAgICAg
ICAgICAgICAgLy8gZWFjaCB3b3JkIGJyZWFrIHdlIGFjY3VtdWxhdGUgZXJyb3IuIFRoaXMgaXMg
dGhlCisgICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBpeGVscyB0aGF0IHdlIGFy
ZSBiZWhpbmQgc28gZmFyLgorICAgIGludCBtX2xldHRlclNwYWNpbmc7IC8vIHBpeGVscyB0byBi
ZSBhZGRlZCBhZnRlciBlYWNoIGdseXBoLgorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gQ29tcGxleFRleHRDb250cm9sbGVyTGludXhfaApkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXguY3BwCmluZGV4IDVlM2U1YjI4NTc0
NTEyYjEyZDhmMTczOWExZmQ4YmIxNWE1MDhmNjYuLmU3YjkyMDY1OTdhZTUwZDg2MWQ1MDg3OTc4
ODI4ZjgzZTI4MWNmMTcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vRm9udExpbnV4LmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0ZvbnRMaW51eC5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlICJGb250LmgiCiAKKyNpbmNsdWRlICJDb21wbGV4VGV4dENvbnRyb2xsZXJMaW51
eC5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkdseXBoQnVmZmVyLmgiCiAj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCkBAIC00Nyw3ICs0OCw2IEBACiAKICNpbmNsdWRl
IDx1bmljb2RlL25vcm1senIuaD4KICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+Ci0jaW5jbHVk
ZSA8d3RmL093bkFycmF5UHRyLmg+CiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgogI2luY2x1ZGUg
PHd0Zi91bmljb2RlL1VuaWNvZGUuaD4KIApAQCAtMTcyLDQ5OSArMTcyLDYgQEAgc3RhdGljIGlu
dCB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIoSEJfRml4ZWQgdmFsdWUpCiAgICAgcmV0dXJu
IHZhbHVlID4+IDY7CiB9CiAKLS8vIFRleHRSdW5XYWxrZXIgd2Fsa3MgYSBUZXh0UnVuIGFuZCBw
cmVzZW50cyBlYWNoIHNjcmlwdCBydW4gaW4gc2VxdWVuY2UuIEEKLS8vIFRleHRSdW4gaXMgYSBz
ZXF1ZW5jZSBvZiBjb2RlLXBvaW50cyB3aXRoIHRoZSBzYW1lIGVtYmVkZGluZyBsZXZlbCAoaS5l
LiB0aGV5Ci0vLyBhcmUgYWxsIGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkuIEEgc2Ny
aXB0IHJ1biBpcyBhIHN1YnNlcXVlbmNlIHdoZXJlCi0vLyBhbGwgdGhlIGNoYXJhY3RlcnMgaGF2
ZSB0aGUgc2FtZSBzY3JpcHQgKGUuZy4gQXJhYmljLCBUaGFpIGV0YykuIFNoYXBpbmcgaXMKLS8v
IG9ubHkgZXZlciBkb25lIHdpdGggc2NyaXB0IHJ1bnMgc2luY2UgdGhlIHNoYXBlcnMgb25seSBr
bm93IGhvdyB0byBkZWFsIHdpdGgKLS8vIGEgc2luZ2xlIHNjcmlwdC4KLS8vCi0vLyBBZnRlciBj
cmVhdGluZyBpdCwgdGhlIHNjcmlwdCBydW5zIGFyZSBlaXRoZXIgaXRlcmF0ZWQgYmFja3dhcmRz
IG9yIGZvcndhcmRzLgotLy8gSXQgZGVmYXVsdHMgdG8gYmFja3dhcmRzIGZvciBSVEwgYW5kIGZv
cndhcmRzIG90aGVyd2lzZSAod2hpY2ggbWF0Y2hlcyB0aGUKLS8vIHByZXNlbnRhdGlvbiBvcmRl
ciksIGhvd2V2ZXIgeW91IGNhbiBzZXQgaXQgd2l0aCB8c2V0QmFja3dhcmRzSXRlcmF0aW9ufC4K
LS8vCi0vLyBPbmNlIHlvdSBoYXZlIHNldHVwIHRoZSBvYmplY3QsIGNhbGwgfG5leHRTY3JpcHRS
dW58IHRvIGdldCB0aGUgZmlyc3Qgc2NyaXB0Ci0vLyBydW4uIFRoaXMgd2lsbCByZXR1cm4gZmFs
c2Ugd2hlbiB0aGUgaXRlcmF0aW9uIGlzIGNvbXBsZXRlLiBBdCBhbnkgdGltZSB5b3UKLS8vIGNh
biBjYWxsIHxyZXNldHwgdG8gc3RhcnQgb3ZlciBhZ2Fpbi4KLWNsYXNzIFRleHRSdW5XYWxrZXIg
ewotcHVibGljOgotICAgIFRleHRSdW5XYWxrZXIoY29uc3QgVGV4dFJ1biYsIHVuc2lnbmVkLCBj
b25zdCBGb250Kik7Ci0gICAgflRleHRSdW5XYWxrZXIoKTsKLQotICAgIGJvb2wgaXNXb3JkQnJl
YWsodW5zaWduZWQpOwotICAgIGludCBkZXRlcm1pbmVXb3JkQnJlYWtTcGFjaW5nKHVuc2lnbmVk
KTsKLSAgICAvLyBzZXRQYWRkaW5nIHNldHMgYSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGRpc3Ry
aWJ1dGVkIGFjcm9zcyB0aGUgVGV4dFJ1bi4KLSAgICAvLyBXZWJLaXQgdXNlcyB0aGlzIHRvIGp1
c3RpZnkgdGV4dC4KLSAgICB2b2lkIHNldFBhZGRpbmcoaW50KTsKLSAgICB2b2lkIHJlc2V0KCk7
Ci0gICAgdm9pZCBzZXRCYWNrd2FyZHNJdGVyYXRpb24oYm9vbCk7Ci0gICAgLy8gQWR2YW5jZSB0
byB0aGUgbmV4dCBzY3JpcHQgcnVuLCByZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGUgZW5kIG9mIHRo
ZQotICAgIC8vIFRleHRSdW4gaGFzIGJlZW4gcmVhY2hlZC4KLSAgICBib29sIG5leHRTY3JpcHRS
dW4oKTsKLSAgICBmbG9hdCB3aWR0aE9mRnVsbFJ1bigpOwotCi0gICAgLy8gc2V0V29yZFNwYWNp
bmdBZGp1c3RtZW50IHNldHMgYSBkZWx0YSAoaW4gcGl4ZWxzKSB3aGljaCBpcyBhcHBsaWVkIGF0
Ci0gICAgLy8gZWFjaCB3b3JkIGJyZWFrIGluIHRoZSBUZXh0UnVuLgotICAgIHZvaWQgc2V0V29y
ZFNwYWNpbmdBZGp1c3RtZW50KGludCB3b3JkU3BhY2luZ0FkanVzdG1lbnQpIHsgbV93b3JkU3Bh
Y2luZ0FkanVzdG1lbnQgPSB3b3JkU3BhY2luZ0FkanVzdG1lbnQ7IH0KLQotICAgIC8vIHNldExl
dHRlclNwYWNpbmdBZGp1c3RtZW50IHNldHMgYW4gYWRkaXRpb25hbCBudW1iZXIgb2YgcGl4ZWxz
IHRoYXQgaXMKLSAgICAvLyBhZGRlZCB0byB0aGUgYWR2YW5jZSBhZnRlciBlYWNoIG91dHB1dCBj
bHVzdGVyLiBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW91cgotICAgIC8vIG9mIFdpZHRoSXRlcmF0
b3I6OmFkdmFuY2UuCi0gICAgdm9pZCBzZXRMZXR0ZXJTcGFjaW5nQWRqdXN0bWVudChpbnQgbGV0
dGVyU3BhY2luZ0FkanVzdG1lbnQpIHsgbV9sZXR0ZXJTcGFjaW5nID0gbGV0dGVyU3BhY2luZ0Fk
anVzdG1lbnQ7IH0KLSAgICBpbnQgbGV0dGVyU3BhY2luZygpIGNvbnN0IHsgcmV0dXJuIG1fbGV0
dGVyU3BhY2luZzsgfQotCi0gICAgLy8gU2V0IHRoZSB4IG9mZnNldCBmb3IgdGhlIG5leHQgc2Ny
aXB0IHJ1bi4gVGhpcyBhZmZlY3RzIHRoZSB2YWx1ZXMgaW4KLSAgICAvLyB8eFBvc2l0aW9uc3wK
LSAgICB2b2lkIHNldFhPZmZzZXRUb1plcm8oKSB7IG1fb2Zmc2V0WCA9IDA7IH0KLSAgICBib29s
IHJ0bCgpIGNvbnN0IHsgcmV0dXJuIG1fcnVuLnJ0bCgpOyB9Ci0gICAgY29uc3QgdWludDE2X3Qq
IGdseXBocygpIGNvbnN0IHsgcmV0dXJuIG1fZ2x5cGhzMTY7IH0KLQotICAgIC8vIFJldHVybiB0
aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSByZXR1cm5lZCBieSB8Z2x5cGhzfAotICAgIGNvbnN0IHVu
c2lnbmVkIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1faXRlbS5udW1fZ2x5cGhzOyB9Ci0KLSAg
ICAvLyBSZXR1cm4gdGhlIHggb2Zmc2V0IGZvciBlYWNoIG9mIHRoZSBnbHlwaHMuIE5vdGUgdGhh
dCB0aGlzIGlzIHRyYW5zbGF0ZWQKLSAgICAvLyBieSB0aGUgY3VycmVudCB4IG9mZnNldCBhbmQg
dGhhdCB0aGUgeCBvZmZzZXQgaXMgdXBkYXRlZCBmb3IgZWFjaCBzY3JpcHQKLSAgICAvLyBydW4u
Ci0gICAgY29uc3QgU2tTY2FsYXIqIHhQb3NpdGlvbnMoKSBjb25zdCB7IHJldHVybiBtX3hQb3Np
dGlvbnM7IH0KLQotICAgIC8vIEdldCB0aGUgYWR2YW5jZXMgKHdpZHRocykgZm9yIGVhY2ggZ2x5
cGguCi0gICAgY29uc3QgSEJfRml4ZWQqIGFkdmFuY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pdGVt
LmFkdmFuY2VzOyB9Ci0KLSAgICAvLyBSZXR1cm4gdGhlIHdpZHRoIChpbiBweCkgb2YgdGhlIGN1
cnJlbnQgc2NyaXB0IHJ1bi4KLSAgICBjb25zdCB1bnNpZ25lZCB3aWR0aCgpIGNvbnN0IHsgcmV0
dXJuIG1fcGl4ZWxXaWR0aDsgfQotCi0gICAgLy8gUmV0dXJuIHRoZSBjbHVzdGVyIGxvZyBmb3Ig
dGhlIGN1cnJlbnQgc2NyaXB0IHJ1bi4gRm9yIGV4YW1wbGU6Ci0gICAgLy8gICBzY3JpcHQgcnVu
OiBmIGkgYSBuIGMgw6kgIChmaSBnZXRzIGxpZ2F0dXJlZCkKLSAgICAvLyAgIGxvZyBjbHV0cnM6
IDAgMCAxIDIgMyA0Ci0gICAgLy8gU28sIGZvciBlYWNoIGlucHV0IGNvZGUgcG9pbnQsIHRoZSBs
b2cgdGVsbHMgeW91IHdoaWNoIG91dHB1dCBnbHlwaCB3YXMKLSAgICAvLyBnZW5lcmF0ZWQgZm9y
IGl0LgotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBsb2dDbHVzdGVycygpIGNvbnN0IHsgcmV0
dXJuIG1faXRlbS5sb2dfY2x1c3RlcnM7IH0KLQotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9m
IGNvZGUgcG9pbnRzIGluIHRoZSBjdXJyZW50IHNjcmlwdCBydW4KLSAgICBjb25zdCB1bnNpZ25l
ZCBudW1Db2RlUG9pbnRzKCkgY29uc3QgeyByZXR1cm4gbV9udW1Db2RlUG9pbnRzOyB9Ci0KLSAg
ICBjb25zdCBGb250UGxhdGZvcm1EYXRhKiBmb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCkg
eyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGb250UGxhdGZvcm1EYXRhKj4obV9pdGVtLmZvbnQt
PnVzZXJEYXRhKTsgfQotCi1wcml2YXRlOgotICAgIHZvaWQgc2V0dXBGb250Rm9yU2NyaXB0UnVu
KCk7Ci0gICAgSEJfRm9udFJlYyogYWxsb2NIYXJmYnV6ekZvbnQoKTsKLSAgICB2b2lkIGRlbGV0
ZUdseXBoQXJyYXlzKCk7Ci0gICAgdm9pZCBjcmVhdGVHbHlwaEFycmF5cyhpbnQpOwotICAgIHZv
aWQgcmVzZXRHbHlwaEFycmF5cygpOwotICAgIHZvaWQgc2hhcGVHbHlwaHMoKTsKLSAgICB2b2lk
IHNldEdseXBoWFBvc2l0aW9ucyhib29sKTsKLQotICAgIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZVNw
YWNlc0FuZE1pcnJvckNoYXJzKGNvbnN0IFVDaGFyKiBzb3VyY2UsIGJvb2wgcnRsLCBVQ2hhciog
ZGVzdGluYXRpb24sIGludCBsZW5ndGgpOwotICAgIHN0YXRpYyBjb25zdCBUZXh0UnVuJiBnZXRO
b3JtYWxpemVkVGV4dFJ1bihjb25zdCBUZXh0UnVuJiBvcmlnaW5hbFJ1biwgT3duUHRyPFRleHRS
dW4+JiBub3JtYWxpemVkUnVuLCBPd25BcnJheVB0cjxVQ2hhcj4mIG5vcm1hbGl6ZWRCdWZmZXIp
OwotCi0gICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBsb2dpYyBpbiBSZW5kZXJCbG9jazo6ZmluZE5l
eHRMaW5lQnJlYWsKLSAgICBzdGF0aWMgYm9vbCBpc0NvZGVwb2ludFNwYWNlKEhCX1VDaGFyMTYg
YykgeyByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnOyB9Ci0KLSAgICBjb25zdCBGb250KiBj
b25zdCBtX2ZvbnQ7Ci0gICAgY29uc3QgU2ltcGxlRm9udERhdGEqIG1fY3VycmVudEZvbnREYXRh
OwotICAgIEhCX1NoYXBlckl0ZW0gbV9pdGVtOwotICAgIHVpbnQxNl90KiBtX2dseXBoczE2OyAv
LyBBIHZlY3RvciBvZiAxNi1iaXQgZ2x5cGggaWRzLgotICAgIFNrU2NhbGFyKiBtX3hQb3NpdGlv
bnM7IC8vIEEgdmVjdG9yIG9mIHggcG9zaXRpb25zIGZvciBlYWNoIGdseXBoLgotICAgIHNzaXpl
X3QgbV9pbmRleE9mTmV4dFNjcmlwdFJ1bjsgLy8gSW5kZXhlcyB0aGUgc2NyaXB0IHJ1biBpbiB8
bV9ydW58LgotICAgIGNvbnN0IHVuc2lnbmVkIG1fc3RhcnRpbmdYOyAvLyBPZmZzZXQgaW4gcGl4
ZWxzIG9mIHRoZSBmaXJzdCBzY3JpcHQgcnVuLgotICAgIHVuc2lnbmVkIG1fb2Zmc2V0WDsgLy8g
T2Zmc2V0IGluIHBpeGVscyB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc2NyaXB0IHJ1bi4KLSAg
ICB1bnNpZ25lZCBtX3BpeGVsV2lkdGg7IC8vIFdpZHRoIChpbiBweCkgb2YgdGhlIGN1cnJlbnQg
c2NyaXB0IHJ1bi4KLSAgICB1bnNpZ25lZCBtX251bUNvZGVQb2ludHM7IC8vIENvZGUgcG9pbnRz
IGluIGN1cnJlbnQgc2NyaXB0IHJ1bi4KLSAgICB1bnNpZ25lZCBtX2dseXBoc0FycmF5Q2FwYWNp
dHk7IC8vIEN1cnJlbnQgc2l6ZSBvZiBhbGwgdGhlIEhhcmZidXp6IGFycmF5cy4KLQotICAgIE93
blB0cjxUZXh0UnVuPiBtX25vcm1hbGl6ZWRSdW47Ci0gICAgT3duQXJyYXlQdHI8VUNoYXI+IG1f
bm9ybWFsaXplZEJ1ZmZlcjsgLy8gQSBidWZmZXIgZm9yIG5vcm1hbGl6ZWQgcnVuLgotICAgIGNv
bnN0IFRleHRSdW4mIG1fcnVuOwotICAgIGJvb2wgbV9pdGVyYXRlQmFja3dhcmRzOwotICAgIGlu
dCBtX3dvcmRTcGFjaW5nQWRqdXN0bWVudDsgLy8gZGVsdGEgYWRqdXN0bWVudCAocGl4ZWxzKSBm
b3IgZWFjaCB3b3JkIGJyZWFrLgotICAgIGZsb2F0IG1fcGFkZGluZzsgLy8gcGl4ZWxzIHRvIGJl
IGRpc3RyaWJ1dGVkIG92ZXIgdGhlIGxpbmUgYXQgd29yZCBicmVha3MuCi0gICAgZmxvYXQgbV9w
YWRQZXJXb3JkQnJlYWs7IC8vIHBpeGVscyB0byBiZSBhZGRlZCB0byBlYWNoIHdvcmQgYnJlYWsu
Ci0gICAgZmxvYXQgbV9wYWRFcnJvcjsgLy8gfG1fcGFkUGVyV29yZEJyZWFrfCBtaWdodCBoYXZl
IGEgZnJhY3Rpb25hbCBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ug
d2Ugb25seSBhZGQgYSB3aG9sZSBudW1iZXIgb2YgcGFkZGluZyBwaXhlbHMgYXQKLSAgICAgICAg
ICAgICAgICAgICAgICAvLyBlYWNoIHdvcmQgYnJlYWsgd2UgYWNjdW11bGF0ZSBlcnJvci4gVGhp
cyBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcGl4ZWxzIHRoYXQg
d2UgYXJlIGJlaGluZCBzbyBmYXIuCi0gICAgaW50IG1fbGV0dGVyU3BhY2luZzsgLy8gcGl4ZWxz
IHRvIGJlIGFkZGVkIGFmdGVyIGVhY2ggZ2x5cGguCi19OwotCi0KLVRleHRSdW5XYWxrZXI6OlRl
eHRSdW5XYWxrZXIoY29uc3QgVGV4dFJ1biYgcnVuLCB1bnNpZ25lZCBzdGFydGluZ1gsIGNvbnN0
IEZvbnQqIGZvbnQpCi0gICAgOiBtX2ZvbnQoZm9udCkKLSAgICAsIG1fc3RhcnRpbmdYKHN0YXJ0
aW5nWCkKLSAgICAsIG1fb2Zmc2V0WChtX3N0YXJ0aW5nWCkKLSAgICAsIG1fcnVuKGdldE5vcm1h
bGl6ZWRUZXh0UnVuKHJ1biwgbV9ub3JtYWxpemVkUnVuLCBtX25vcm1hbGl6ZWRCdWZmZXIpKQot
ICAgICwgbV9pdGVyYXRlQmFja3dhcmRzKG1fcnVuLnJ0bCgpKQotICAgICwgbV93b3JkU3BhY2lu
Z0FkanVzdG1lbnQoMCkKLSAgICAsIG1fcGFkZGluZygwKQotICAgICwgbV9wYWRQZXJXb3JkQnJl
YWsoMCkKLSAgICAsIG1fcGFkRXJyb3IoMCkKLSAgICAsIG1fbGV0dGVyU3BhY2luZygwKQotewot
ICAgIC8vIERvIG5vdCB1c2UgfHJ1bnwgaW5zaWRlIHRoaXMgY29uc3RydWN0b3IuIFVzZSB8bV9y
dW58IGluc3RlYWQuCi0KLSAgICBtZW1zZXQoJm1faXRlbSwgMCwgc2l6ZW9mKG1faXRlbSkpOwot
ICAgIC8vIFdlIGNhbm5vdCBrbm93LCBhaGVhZCBvZiB0aW1lLCBob3cgbWFueSBnbHlwaHMgYSBn
aXZlbiBzY3JpcHQgcnVuCi0gICAgLy8gd2lsbCBwcm9kdWNlLiBXZSB0YWtlIGEgZ3Vlc3MgdGhh
dCBzY3JpcHQgcnVucyB3aWxsIG5vdCBwcm9kdWNlIG1vcmUKLSAgICAvLyB0aGFuIHR3aWNlIGFz
IG1hbnkgZ2x5cGhzIGFzIHRoZXJlIGFyZSBjb2RlIHBvaW50cyBwbHVzIGEgYml0IG9mCi0gICAg
Ly8gcGFkZGluZyBhbmQgZmFsbGJhY2sgaWYgd2UgZmluZCB0aGF0IHdlIGFyZSB3cm9uZy4KLSAg
ICBjcmVhdGVHbHlwaEFycmF5cygobV9ydW4ubGVuZ3RoKCkgKyAyKSAqIDIpOwotCi0gICAgbV9p
dGVtLmxvZ19jbHVzdGVycyA9IG5ldyB1bnNpZ25lZCBzaG9ydFttX3J1bi5sZW5ndGgoKV07Ci0K
LSAgICBtX2l0ZW0uZmFjZSA9IDA7Ci0gICAgbV9pdGVtLmZvbnQgPSBhbGxvY0hhcmZidXp6Rm9u
dCgpOwotCi0gICAgbV9pdGVtLml0ZW0uYmlkaUxldmVsID0gbV9ydW4ucnRsKCk7Ci0KLSAgICBt
X2l0ZW0uc3RyaW5nID0gbV9ydW4uY2hhcmFjdGVycygpOwotICAgIG1faXRlbS5zdHJpbmdMZW5n
dGggPSBtX3J1bi5sZW5ndGgoKTsKLQotICAgIHJlc2V0KCk7Ci19Ci0KLVRleHRSdW5XYWxrZXI6
On5UZXh0UnVuV2Fsa2VyKCkKLXsKLSAgICBmYXN0RnJlZShtX2l0ZW0uZm9udCk7Ci0gICAgZGVs
ZXRlR2x5cGhBcnJheXMoKTsKLSAgICBkZWxldGVbXSBtX2l0ZW0ubG9nX2NsdXN0ZXJzOwotfQot
Ci1ib29sIFRleHRSdW5XYWxrZXI6OmlzV29yZEJyZWFrKHVuc2lnbmVkIGluZGV4KQotewotICAg
IHJldHVybiBpbmRleCAmJiBpc0NvZGVwb2ludFNwYWNlKG1faXRlbS5zdHJpbmdbaW5kZXhdKSAm
JiAhaXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3RyaW5nW2luZGV4IC0gMV0pOwotfQotCi1pbnQg
VGV4dFJ1bldhbGtlcjo6ZGV0ZXJtaW5lV29yZEJyZWFrU3BhY2luZyh1bnNpZ25lZCBsb2dDbHVz
dGVyc0luZGV4KQotewotICAgIGludCB3b3JkQnJlYWtTcGFjaW5nID0gMDsKLSAgICAvLyBUaGUg
Zmlyc3QgaGFsZiBvZiB0aGUgY29uanVuY3Rpb24gd29ya3MgYXJvdW5kIHRoZSBjYXNlIHdoZXJl
Ci0gICAgLy8gb3V0cHV0IGdseXBocyBhcmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGFueSBjb2RlcG9p
bnRzIGJ5IHRoZQotICAgIC8vIGNsdXN0ZXJzIGxvZy4KLSAgICBpZiAobG9nQ2x1c3RlcnNJbmRl
eCA8IG1faXRlbS5pdGVtLmxlbmd0aAotICAgICAgICAmJiBpc1dvcmRCcmVhayhtX2l0ZW0uaXRl
bS5wb3MgKyBsb2dDbHVzdGVyc0luZGV4KSkgewotICAgICAgICB3b3JkQnJlYWtTcGFjaW5nID0g
bV93b3JkU3BhY2luZ0FkanVzdG1lbnQ7Ci0KLSAgICAgICAgaWYgKG1fcGFkZGluZyA+IDApIHsK
LSAgICAgICAgICAgIGludCB0b1BhZCA9IHJvdW5kZihtX3BhZFBlcldvcmRCcmVhayArIG1fcGFk
RXJyb3IpOwotICAgICAgICAgICAgbV9wYWRFcnJvciArPSBtX3BhZFBlcldvcmRCcmVhayAtIHRv
UGFkOwotCi0gICAgICAgICAgICBpZiAobV9wYWRkaW5nIDwgdG9QYWQpCi0gICAgICAgICAgICAg
ICAgdG9QYWQgPSBtX3BhZGRpbmc7Ci0gICAgICAgICAgICBtX3BhZGRpbmcgLT0gdG9QYWQ7Ci0g
ICAgICAgICAgICB3b3JkQnJlYWtTcGFjaW5nICs9IHRvUGFkOwotICAgICAgICB9Ci0gICAgfQot
ICAgIHJldHVybiB3b3JkQnJlYWtTcGFjaW5nOwotfQotCi0vLyBzZXRQYWRkaW5nIHNldHMgYSBu
dW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgVGV4dFJ1bi4KLS8v
IFdlYktpdCB1c2VzIHRoaXMgdG8ganVzdGlmeSB0ZXh0Lgotdm9pZCBUZXh0UnVuV2Fsa2VyOjpz
ZXRQYWRkaW5nKGludCBwYWRkaW5nKQotewotICAgIG1fcGFkZGluZyA9IHBhZGRpbmc7Ci0gICAg
aWYgKCFtX3BhZGRpbmcpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIElmIHdlIGhhdmUgcGFk
ZGluZyB0byBkaXN0cmlidXRlLCB0aGVuIHdlIHRyeSB0byBnaXZlIGFuIGVxdWFsCi0gICAgLy8g
YW1vdW50IHRvIGVhY2ggc3BhY2UuIFRoZSBsYXN0IHNwYWNlIGdldHMgdGhlIHNtYWxsZXIgYW1v
dW50LCBpZgotICAgIC8vIGFueS4KLSAgICB1bnNpZ25lZCBudW1Xb3JkQnJlYWtzID0gMDsKLQot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX2l0ZW0uc3RyaW5nTGVuZ3RoOyBpKyspIHsK
LSAgICAgICAgaWYgKGlzV29yZEJyZWFrKGkpKQotICAgICAgICAgICAgbnVtV29yZEJyZWFrcysr
OwotICAgIH0KLQotICAgIGlmIChudW1Xb3JkQnJlYWtzKQotICAgICAgICBtX3BhZFBlcldvcmRC
cmVhayA9IG1fcGFkZGluZyAvIG51bVdvcmRCcmVha3M7Ci0gICAgZWxzZQotICAgICAgICBtX3Bh
ZFBlcldvcmRCcmVhayA9IDA7Ci19Ci0KLXZvaWQgVGV4dFJ1bldhbGtlcjo6cmVzZXQoKQotewot
ICAgIGlmIChtX2l0ZXJhdGVCYWNrd2FyZHMpCi0gICAgICAgIG1faW5kZXhPZk5leHRTY3JpcHRS
dW4gPSBtX3J1bi5sZW5ndGgoKSAtIDE7Ci0gICAgZWxzZQotICAgICAgICBtX2luZGV4T2ZOZXh0
U2NyaXB0UnVuID0gMDsKLSAgICBtX29mZnNldFggPSBtX3N0YXJ0aW5nWDsKLX0KLQotdm9pZCBU
ZXh0UnVuV2Fsa2VyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24oYm9vbCBpc0JhY2t3YXJkcykKLXsK
LSAgICBtX2l0ZXJhdGVCYWNrd2FyZHMgPSBpc0JhY2t3YXJkczsKLSAgICByZXNldCgpOwotfQot
Ci0vLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHNjcmlwdCBydW4sIHJldHVybmluZyBmYWxzZSB3aGVu
IHRoZSBlbmQgb2YgdGhlCi0vLyBUZXh0UnVuIGhhcyBiZWVuIHJlYWNoZWQuCi1ib29sIFRleHRS
dW5XYWxrZXI6Om5leHRTY3JpcHRSdW4oKQotewotICAgIGlmIChtX2l0ZXJhdGVCYWNrd2FyZHMp
IHsKLSAgICAgICAgLy8gSW4gcmlnaHQtdG8tbGVmdCBtb2RlIHdlIG5lZWQgdG8gcmVuZGVyIHRo
ZSBzaGFwZWQgZ2x5cGggYmFja3dhcmRzIGFuZAotICAgICAgICAvLyBhbHNvIHJlbmRlciB0aGUg
c2NyaXB0IHJ1bnMgdGhlbXNlbHZlcyBiYWNrd2FyZHMuIFNvIGdpdmVuIGEgVGV4dFJ1bjoKLSAg
ICAgICAgLy8gICAgQUFBQUFBQUNUVFRUVFRUICAgKEEgPSBBcmFiaWMsIEMgPSBDb21tb24sIFQg
PSBUaGFpKQotICAgICAgICAvLyB3ZSByZW5kZXI6Ci0gICAgICAgIC8vICAgIFRUVFRUVENBQUFB
QUFBCi0gICAgICAgIC8vIChhbmQgdGhlIGdseXBocyBpbiBlYWNoIEEsIEMgYW5kIFQgc2VjdGlv
biBhcmUgYmFja3dhcmRzIHRvbykKLSAgICAgICAgaWYgKCFoYl91dGYxNl9zY3JpcHRfcnVuX3By
ZXYoJm1fbnVtQ29kZVBvaW50cywgJm1faXRlbS5pdGVtLCBtX3J1bi5jaGFyYWN0ZXJzKCksIG1f
cnVuLmxlbmd0aCgpLCAmbV9pbmRleE9mTmV4dFNjcmlwdFJ1bikpCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIG1fY3VycmVudEZvbnREYXRhID0gbV9mb250LT5nbHlwaERhdGFG
b3JDaGFyYWN0ZXIobV9pdGVtLnN0cmluZ1ttX2l0ZW0uaXRlbS5wb3NdLCBmYWxzZSkuZm9udERh
dGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFoYl91dGYxNl9zY3JpcHRfcnVuX25leHQo
Jm1fbnVtQ29kZVBvaW50cywgJm1faXRlbS5pdGVtLCBtX3J1bi5jaGFyYWN0ZXJzKCksIG1fcnVu
Lmxlbmd0aCgpLCAmbV9pbmRleE9mTmV4dFNjcmlwdFJ1bikpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAgICAgLy8gSXQgaXMgYWN0dWFsbHkgd3JvbmcgdG8gY29uc2lkZXIgc2Ny
aXB0IHJ1bnMgYXQgYWxsIGluIHRoaXMgY29kZS4KLSAgICAgICAgLy8gT3RoZXIgV2ViS2l0IGNv
ZGUgKGUuZy4gTWFjKSBzZWdtZW50cyBjb21wbGV4IHRleHQganVzdCBieSBmaW5kaW5nCi0gICAg
ICAgIC8vIHRoZSBsb25nZXN0IHNwYW4gb2YgdGV4dCBjb3ZlcmVkIGJ5IGEgc2luZ2xlIGZvbnQu
Ci0gICAgICAgIC8vIEJ1dCB3ZSBjdXJyZW50bHkgbmVlZCB0byBjYWxsIGhiX3V0ZjE2X3Njcmlw
dF9ydW5fbmV4dCBhbnl3YXkgdG8gZmlsbAotICAgICAgICAvLyBpbiB0aGUgaGFyZmJ1enogZGF0
YSBzdHJ1Y3R1cmVzIHRvIGUuZy4gcGljayB0aGUgY29ycmVjdCBzY3JpcHQncyBzaGFwZXIuCi0g
ICAgICAgIC8vIFNvIHdlIGFsbG93IHRoYXQgdG8gcnVuIGZpcnN0LCB0aGVuIGRvIGEgc2Vjb25k
IHBhc3Mgb3ZlciB0aGUgcmFuZ2UgaXQKLSAgICAgICAgLy8gZm91bmQgYW5kIHRha2UgdGhlIGxh
cmdlc3Qgc3VicmVnaW9uIHRoYXQgc3RheXMgd2l0aGluIGEgc2luZ2xlIGZvbnQuCi0gICAgICAg
IG1fY3VycmVudEZvbnREYXRhID0gbV9mb250LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIobV9pdGVt
LnN0cmluZ1ttX2l0ZW0uaXRlbS5wb3NdLCBmYWxzZSkuZm9udERhdGE7Ci0gICAgICAgIHVuc2ln
bmVkIGVuZE9mUnVuOwotICAgICAgICBmb3IgKGVuZE9mUnVuID0gMTsgZW5kT2ZSdW4gPCBtX2l0
ZW0uaXRlbS5sZW5ndGg7ICsrZW5kT2ZSdW4pIHsKLSAgICAgICAgICAgIGNvbnN0IFNpbXBsZUZv
bnREYXRhKiBuZXh0Rm9udERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZvckNoYXJhY3RlcihtX2l0
ZW0uc3RyaW5nW21faXRlbS5pdGVtLnBvcyArIGVuZE9mUnVuXSwgZmFsc2UpLmZvbnREYXRhOwot
ICAgICAgICAgICAgaWYgKG5leHRGb250RGF0YSAhPSBtX2N1cnJlbnRGb250RGF0YSkKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtX2l0ZW0uaXRlbS5sZW5ndGgg
PSBlbmRPZlJ1bjsKLSAgICAgICAgbV9pbmRleE9mTmV4dFNjcmlwdFJ1biA9IG1faXRlbS5pdGVt
LnBvcyArIGVuZE9mUnVuOwotICAgIH0KLQotICAgIHNldHVwRm9udEZvclNjcmlwdFJ1bigpOwot
ICAgIHNoYXBlR2x5cGhzKCk7Ci0gICAgc2V0R2x5cGhYUG9zaXRpb25zKHJ0bCgpKTsKLQotICAg
IHJldHVybiB0cnVlOwotfQotCi1mbG9hdCBUZXh0UnVuV2Fsa2VyOjp3aWR0aE9mRnVsbFJ1bigp
Ci17Ci0gICAgZmxvYXQgd2lkdGhTdW0gPSAwOwotICAgIHdoaWxlIChuZXh0U2NyaXB0UnVuKCkp
Ci0gICAgICAgIHdpZHRoU3VtICs9IHdpZHRoKCk7Ci0KLSAgICByZXR1cm4gd2lkdGhTdW07Ci19
Ci0KLXZvaWQgVGV4dFJ1bldhbGtlcjo6c2V0dXBGb250Rm9yU2NyaXB0UnVuKCkKLXsKLSAgICBj
b25zdCBGb250RGF0YSogZm9udERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZvckNoYXJhY3Rlciht
X2l0ZW0uc3RyaW5nW21faXRlbS5pdGVtLnBvc10sIGZhbHNlKS5mb250RGF0YTsKLSAgICBjb25z
dCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250RGF0YS0+Zm9udERhdGFGb3JD
aGFyYWN0ZXIoJyAnKS0+cGxhdGZvcm1EYXRhKCk7Ci0gICAgbV9pdGVtLmZhY2UgPSBwbGF0Zm9y
bURhdGEuaGFyZmJ1enpGYWNlKCk7Ci0gICAgdm9pZCogb3BhcXVlUGxhdGZvcm1EYXRhID0gY29u
c3RfY2FzdDxGb250UGxhdGZvcm1EYXRhKj4oJnBsYXRmb3JtRGF0YSk7Ci0gICAgbV9pdGVtLmZv
bnQtPnVzZXJEYXRhID0gb3BhcXVlUGxhdGZvcm1EYXRhOwotfQotCi1IQl9Gb250UmVjKiBUZXh0
UnVuV2Fsa2VyOjphbGxvY0hhcmZidXp6Rm9udCgpCi17Ci0gICAgSEJfRm9udFJlYyogZm9udCA9
IHJlaW50ZXJwcmV0X2Nhc3Q8SEJfRm9udFJlYyo+KGZhc3RNYWxsb2Moc2l6ZW9mKEhCX0ZvbnRS
ZWMpKSk7Ci0gICAgbWVtc2V0KGZvbnQsIDAsIHNpemVvZihIQl9Gb250UmVjKSk7Ci0gICAgZm9u
dC0+a2xhc3MgPSAmaGFyZmJ1enpTa2lhQ2xhc3M7Ci0gICAgZm9udC0+dXNlckRhdGEgPSAwOwot
ICAgIC8vIFRoZSB2YWx1ZXMgd2hpY2ggaGFyZmJ1enpTa2lhQ2xhc3MgcmV0dXJucyBhcmUgYWxy
ZWFkeSBzY2FsZWQgdG8KLSAgICAvLyBwaXhlbCB1bml0cywgc28gd2UganVzdCBzZXQgYWxsIHRo
ZXNlIHRvIG9uZSB0byBkaXNhYmxlIGZ1cnRoZXIKLSAgICAvLyBzY2FsaW5nLgotICAgIGZvbnQt
PnhfcHBlbSA9IDE7Ci0gICAgZm9udC0+eV9wcGVtID0gMTsKLSAgICBmb250LT54X3NjYWxlID0g
MTsKLSAgICBmb250LT55X3NjYWxlID0gMTsKLQotICAgIHJldHVybiBmb250OwotfQotCi12b2lk
IFRleHRSdW5XYWxrZXI6OmRlbGV0ZUdseXBoQXJyYXlzKCkKLXsKLSAgICBkZWxldGVbXSBtX2l0
ZW0uZ2x5cGhzOwotICAgIGRlbGV0ZVtdIG1faXRlbS5hdHRyaWJ1dGVzOwotICAgIGRlbGV0ZVtd
IG1faXRlbS5hZHZhbmNlczsKLSAgICBkZWxldGVbXSBtX2l0ZW0ub2Zmc2V0czsKLSAgICBkZWxl
dGVbXSBtX2dseXBoczE2OwotICAgIGRlbGV0ZVtdIG1feFBvc2l0aW9uczsKLX0KLQotdm9pZCBU
ZXh0UnVuV2Fsa2VyOjpjcmVhdGVHbHlwaEFycmF5cyhpbnQgc2l6ZSkKLXsKLSAgICBtX2l0ZW0u
Z2x5cGhzID0gbmV3IEhCX0dseXBoW3NpemVdOwotICAgIG1faXRlbS5hdHRyaWJ1dGVzID0gbmV3
IEhCX0dseXBoQXR0cmlidXRlc1tzaXplXTsKLSAgICBtX2l0ZW0uYWR2YW5jZXMgPSBuZXcgSEJf
Rml4ZWRbc2l6ZV07Ci0gICAgbV9pdGVtLm9mZnNldHMgPSBuZXcgSEJfRml4ZWRQb2ludFtzaXpl
XTsKLQotICAgIG1fZ2x5cGhzMTYgPSBuZXcgdWludDE2X3Rbc2l6ZV07Ci0gICAgbV94UG9zaXRp
b25zID0gbmV3IFNrU2NhbGFyW3NpemVdOwotCi0gICAgbV9pdGVtLm51bV9nbHlwaHMgPSBzaXpl
OwotICAgIG1fZ2x5cGhzQXJyYXlDYXBhY2l0eSA9IHNpemU7IC8vIFNhdmUgdGhlIEdseXBoQXJy
YXlzIHNpemUuCi0gICAgcmVzZXRHbHlwaEFycmF5cygpOwotfQotCi12b2lkIFRleHRSdW5XYWxr
ZXI6OnJlc2V0R2x5cGhBcnJheXMoKQotewotICAgIGludCBzaXplID0gbV9pdGVtLm51bV9nbHlw
aHM7Ci0gICAgLy8gQWxsIHRoZSB0eXBlcyBoZXJlIGRvbid0IGhhdmUgcG9pbnRlcnMuIEl0IGlz
IHNhZmUgdG8gcmVzZXQgdG8KLSAgICAvLyB6ZXJvIHVubGVzcyBIYXJmYnV6eiBicmVha3MgdGhl
IGNvbXBhdGliaWxpdHkgaW4gdGhlIGZ1dHVyZS4KLSAgICBtZW1zZXQobV9pdGVtLmdseXBocywg
MCwgc2l6ZSAqIHNpemVvZihIQl9HbHlwaCkpOwotICAgIG1lbXNldChtX2l0ZW0uYXR0cmlidXRl
cywgMCwgc2l6ZSAqIHNpemVvZihIQl9HbHlwaEF0dHJpYnV0ZXMpKTsKLSAgICBtZW1zZXQobV9p
dGVtLmFkdmFuY2VzLCAwLCBzaXplICogc2l6ZW9mKEhCX0ZpeGVkKSk7Ci0gICAgbWVtc2V0KG1f
aXRlbS5vZmZzZXRzLCAwLCBzaXplICogc2l6ZW9mKEhCX0ZpeGVkUG9pbnQpKTsKLSAgICBtZW1z
ZXQobV9nbHlwaHMxNiwgMCwgc2l6ZSAqIHNpemVvZih1aW50MTZfdCkpOwotICAgIG1lbXNldCht
X3hQb3NpdGlvbnMsIDAsIHNpemUgKiBzaXplb2YoU2tTY2FsYXIpKTsKLX0KLQotdm9pZCBUZXh0
UnVuV2Fsa2VyOjpzaGFwZUdseXBocygpCi17Ci0gICAgLy8gSEJfU2hhcGVJdGVtKCkgcmVzZXRz
IG1faXRlbS5udW1fZ2x5cGhzLiBJZiB0aGUgcHJldmlvdXMgY2FsbCB0bwotICAgIC8vIEhCX1No
YXBlSXRlbSgpIHVzZWQgbGVzcyBzcGFjZSB0aGFuIHdhcyBhdmFpbGFibGUsIHRoZSBjYXBhY2l0
eSBvZgotICAgIC8vIHRoZSBhcnJheSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgdmFs
dWUgb2YgbV9pdGVtLm51bV9nbHlwaHMuIAotICAgIC8vIFNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRo
ZSBudW1fZ2x5cGhzIHRvIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXkuCi0gICAgbV9pdGVtLm51
bV9nbHlwaHMgPSBtX2dseXBoc0FycmF5Q2FwYWNpdHk7Ci0gICAgcmVzZXRHbHlwaEFycmF5cygp
OwotICAgIHdoaWxlICghSEJfU2hhcGVJdGVtKCZtX2l0ZW0pKSB7Ci0gICAgICAgIC8vIFdlIG92
ZXJmbG93ZWQgb3VyIGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4KLSAgICAgICAgLy8gSEJfU2hh
cGVJdGVtIGZpbGxzIGluIG1faXRlbS5udW1fZ2x5cGhzIHdpdGggdGhlIG5lZWRlZCBzaXplLgot
ICAgICAgICBkZWxldGVHbHlwaEFycmF5cygpOwotICAgICAgICAvLyBUaGUgfCsgMXwgaGVyZSBp
cyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEhhcmZidXp6OiB0aGUgS2htZXIKLSAgICAgICAg
Ly8gc2hhcGVyIChhdCBsZWFzdCkgY2FuIGZhaWwgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgZ2x5
cGggYnVmZmVycwotICAgICAgICAvLyBhbmQgcmVxdWVzdCAwIGFkZGl0aW9uYWwgZ2x5cGhzOiB0
aHJvd2luZyB1cyBpbnRvIGFuIGluZmluaXRlCi0gICAgICAgIC8vIGxvb3AuCi0gICAgICAgIGNy
ZWF0ZUdseXBoQXJyYXlzKG1faXRlbS5udW1fZ2x5cGhzICsgMSk7Ci0gICAgfQotfQotCi12b2lk
IFRleHRSdW5XYWxrZXI6OnNldEdseXBoWFBvc2l0aW9ucyhib29sIGlzUlRMKQotewotICAgIGRv
dWJsZSBwb3NpdGlvbiA9IDA7Ci0gICAgLy8gbG9nQ2x1c3RlcnNJbmRleCBpbmRleGVzIGxvZ0Ns
dXN0ZXJzIGZvciB0aGUgZmlyc3QgKG9yIGxhc3Qgd2hlbgotICAgIC8vIFJUTCkgY29kZXBvaW50
IG9mIHRoZSBjdXJyZW50IGdseXBoLiAgRWFjaCB0aW1lIHdlIGFkdmFuY2UgYSBnbHlwaCwKLSAg
ICAvLyB3ZSBza2lwIG92ZXIgYWxsIHRoZSBjb2RlcG9pbnRzIHRoYXQgY29udHJpYnV0ZWQgdG8g
dGhlIGN1cnJlbnQKLSAgICAvLyBnbHlwaC4KLSAgICBpbnQgbG9nQ2x1c3RlcnNJbmRleCA9IDA7
Ci0KLSAgICBpZiAoaXNSVEwpIHsKLSAgICAgICAgbG9nQ2x1c3RlcnNJbmRleCA9IG1faXRlbS5u
dW1fZ2x5cGhzIC0gMTsKLQotICAgICAgICAvLyBHbHlwaHMgYXJlIHN0b3JlZCBpbiBsb2dpY2Fs
IG9yZGVyLCBidXQgZm9yIGxheW91dCBwdXJwb3NlcyB3ZQotICAgICAgICAvLyBhbHdheXMgZ28g
bGVmdCB0byByaWdodC4KLSAgICAgICAgZm9yIChpbnQgaSA9IG1faXRlbS5udW1fZ2x5cGhzIC0g
MTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGlmICghbV9jdXJyZW50Rm9udERhdGEtPmlz
WmVyb1dpZHRoU3BhY2VHbHlwaChtX2dseXBoczE2W2ldKSkgewotICAgICAgICAgICAgICAgIC8v
IFdoaXRlc3BhY2UgbXVzdCBiZSBsYWlkIG91dCBpbiBsb2dpY2FsIG9yZGVyLCBzbyB3aGVuIGlu
c2VydGluZwotICAgICAgICAgICAgICAgIC8vIHNwYWNlcyBpbiBSVEwgKGJ1dCBpdGVyYXRpbmcg
aW4gTFRSIG9yZGVyKSB3ZSBtdXN0IGluc2VydCBzcGFjZXMKLSAgICAgICAgICAgICAgICAvLyBf
YmVmb3JlXyB0aGUgbmV4dCBnbHlwaC4KLSAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KGkgKyAxKSA+PSBtX2l0ZW0ubnVtX2dseXBocyB8fCBtX2l0ZW0uYXR0cmlidXRl
c1tpICsgMV0uY2x1c3RlclN0YXJ0KQotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBt
X2xldHRlclNwYWNpbmc7Ci0KLSAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBkZXRlcm1pbmVX
b3JkQnJlYWtTcGFjaW5nKGxvZ0NsdXN0ZXJzSW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBtX2dseXBoczE2W2ldID0gbV9pdGVtLmdseXBoc1tpXTsKLSAgICAgICAgICAgIGRv
dWJsZSBvZmZzZXRYID0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1faXRlbS5vZmZzZXRz
W2ldLngpOwotICAgICAgICAgICAgbV94UG9zaXRpb25zW2ldID0gbV9vZmZzZXRYICsgcG9zaXRp
b24gKyBvZmZzZXRYOwotCi0gICAgICAgICAgICB3aGlsZSAobG9nQ2x1c3RlcnNJbmRleCA+IDAg
JiYgbG9nQ2x1c3RlcnMoKVtsb2dDbHVzdGVyc0luZGV4XSA9PSBpKQotICAgICAgICAgICAgICAg
IGxvZ0NsdXN0ZXJzSW5kZXgtLTsKLQotICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRGb250RGF0
YS0+aXNaZXJvV2lkdGhTcGFjZUdseXBoKG1fZ2x5cGhzMTZbaV0pKQotICAgICAgICAgICAgICAg
IHBvc2l0aW9uICs9IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihtX2l0ZW0uYWR2YW5jZXNb
aV0pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX2l0ZW0ubnVtX2dseXBoczsgKytpKSB7Ci0gICAgICAgICAgICBtX2dseXBoczE2W2ld
ID0gbV9pdGVtLmdseXBoc1tpXTsKLSAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gdHJ1bmNh
dGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1faXRlbS5vZmZzZXRzW2ldLngpOwotICAgICAgICAgICAg
bV94UG9zaXRpb25zW2ldID0gbV9vZmZzZXRYICsgcG9zaXRpb24gKyBvZmZzZXRYOwotCi0gICAg
ICAgICAgICBpZiAobV9jdXJyZW50Rm9udERhdGEtPmlzWmVyb1dpZHRoU3BhY2VHbHlwaChtX2ds
eXBoczE2W2ldKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgZG91
YmxlIGFkdmFuY2UgPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLmFkdmFuY2Vz
W2ldKTsKLQotICAgICAgICAgICAgYWR2YW5jZSArPSBkZXRlcm1pbmVXb3JkQnJlYWtTcGFjaW5n
KGxvZ0NsdXN0ZXJzSW5kZXgpOwotCi0gICAgICAgICAgICBpZiAobV9pdGVtLmF0dHJpYnV0ZXNb
aV0uY2x1c3RlclN0YXJ0KQotICAgICAgICAgICAgICAgIGFkdmFuY2UgKz0gbV9sZXR0ZXJTcGFj
aW5nOwotCi0gICAgICAgICAgICB3aGlsZSAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxvZ0NsdXN0
ZXJzSW5kZXgpIDwgbV9pdGVtLml0ZW0ubGVuZ3RoICYmIGxvZ0NsdXN0ZXJzKClbbG9nQ2x1c3Rl
cnNJbmRleF0gPT0gaSkKLSAgICAgICAgICAgICAgICBsb2dDbHVzdGVyc0luZGV4Kys7Ci0KLSAg
ICAgICAgICAgIHBvc2l0aW9uICs9IGFkdmFuY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9w
aXhlbFdpZHRoID0gc3RkOjptYXgocG9zaXRpb24sIDAuMCk7Ci0gICAgbV9vZmZzZXRYICs9IG1f
cGl4ZWxXaWR0aDsKLX0KLQotdm9pZCBUZXh0UnVuV2Fsa2VyOjpub3JtYWxpemVTcGFjZXNBbmRN
aXJyb3JDaGFycyhjb25zdCBVQ2hhciogc291cmNlLCBib29sIHJ0bCwgVUNoYXIqIGRlc3RpbmF0
aW9uLCBpbnQgbGVuZ3RoKQotewotICAgIGludCBwb3NpdGlvbiA9IDA7Ci0gICAgYm9vbCBlcnJv
ciA9IGZhbHNlOwotICAgIC8vIEl0ZXJhdGUgY2hhcmFjdGVycyBpbiBzb3VyY2UgYW5kIG1pcnJv
ciBjaGFyYWN0ZXIgaWYgbmVlZGVkLgotICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkgewot
ICAgICAgICBVQ2hhcjMyIGNoYXJhY3RlcjsKLSAgICAgICAgaW50IG5leHRQb3NpdGlvbiA9IHBv
c2l0aW9uOwotICAgICAgICBVMTZfTkVYVChzb3VyY2UsIG5leHRQb3NpdGlvbiwgbGVuZ3RoLCBj
aGFyYWN0ZXIpOwotICAgICAgICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKGNoYXJhY3RlcikpCi0g
ICAgICAgICAgICBjaGFyYWN0ZXIgPSAnICc7Ci0gICAgICAgIGVsc2UgaWYgKEZvbnQ6OnRyZWF0
QXNaZXJvV2lkdGhTcGFjZShjaGFyYWN0ZXIpKQotICAgICAgICAgICAgY2hhcmFjdGVyID0gemVy
b1dpZHRoU3BhY2U7Ci0gICAgICAgIGVsc2UgaWYgKHJ0bCkKLSAgICAgICAgICAgIGNoYXJhY3Rl
ciA9IHVfY2hhck1pcnJvcihjaGFyYWN0ZXIpOwotICAgICAgICBVMTZfQVBQRU5EKGRlc3RpbmF0
aW9uLCBwb3NpdGlvbiwgbGVuZ3RoLCBjaGFyYWN0ZXIsIGVycm9yKTsKLSAgICAgICAgQVNTRVJU
KCFlcnJvcik7Ci0gICAgICAgIHBvc2l0aW9uID0gbmV4dFBvc2l0aW9uOwotICAgIH0KLX0KLQot
Y29uc3QgVGV4dFJ1biYgVGV4dFJ1bldhbGtlcjo6Z2V0Tm9ybWFsaXplZFRleHRSdW4oY29uc3Qg
VGV4dFJ1biYgb3JpZ2luYWxSdW4sIE93blB0cjxUZXh0UnVuPiYgbm9ybWFsaXplZFJ1biwgT3du
QXJyYXlQdHI8VUNoYXI+JiBub3JtYWxpemVkQnVmZmVyKQotewotICAgIC8vIE5vcm1hbGl6ZSB0
aGUgdGV4dCBydW4gaW4gdGhyZWUgd2F5czoKLSAgICAvLyAxKSBDb252ZXJ0IHRoZSB8b3JpZ2lu
YWxSdW58IHRvIE5GQyBub3JtYWxpemVkIGZvcm0gaWYgY29tYmluaW5nIGRpYWNyaXRpY2FsIG1h
cmtzCi0gICAgLy8gKFUrMDMwMC4uKSBhcmUgdXNlZCBpbiB0aGUgcnVuLiBUaGlzIGNvbnZlcnNp
b24gaXMgbmVjZXNzYXJ5IHNpbmNlIG1vc3QgT3BlblR5cGUKLSAgICAvLyBmb250cyAoZS5nLiwg
QXJpYWwpIGRvbid0IGhhdmUgc3Vic3RpdHV0aW9uIHJ1bGVzIGZvciB0aGUgZGlhY3JpdGljYWwg
bWFya3MgaW4KLSAgICAvLyB0aGVpciBHU1VCIHRhYmxlcy4KLSAgICAvLwotICAgIC8vIE5vdGUg
dGhhdCB3ZSBkb24ndCB1c2UgdGhlIGljdTo6Tm9ybWFsaXplcjo6aXNOb3JtYWxpemVkKFVOT1JN
X05GQykgQVBJIGhlcmUgc2luY2UKLSAgICAvLyB0aGUgQVBJIHJldHVybnMgRkFMU0UgKD0gbm90
IG5vcm1hbGl6ZWQpIGZvciBjb21wbGV4IHJ1bnMgdGhhdCBkb24ndCByZXF1aXJlIE5GQwotICAg
IC8vIG5vcm1hbGl6YXRpb24gKGUuZy4sIEFyYWJpYyB0ZXh0KS4gVW5sZXNzIHRoZSBydW4gY29u
dGFpbnMgdGhlIGRpYWNyaXRpY2FsIG1hcmtzLAotICAgIC8vIEhhcmZidXp6IHdpbGwgZG8gdGhl
IHNhbWUgdGhpbmcgZm9yIHVzIHVzaW5nIHRoZSBHU1VCIHRhYmxlLgotICAgIC8vIDIpIENvbnZl
cnQgc3BhY2luZyBjaGFyYWN0ZXJzIGludG8gcGxhaW4gc3BhY2VzLCBhcyBzb21lIGZvbnRzIHdp
bGwgcHJvdmlkZSBnbHlwaHMKLSAgICAvLyBmb3IgY2hhcmFjdGVycyBsaWtlICdcbicgb3RoZXJ3
aXNlLgotICAgIC8vIDMpIENvbnZlcnQgbWlycm9yZWQgY2hhcmFjdGVycyBzdWNoIGFzIHBhcmVu
dGhlc2lzIGZvciBydGwgdGV4dC4KLQotICAgIC8vIENvbnZlcnQgdG8gTkZDIGZvcm0gaWYgdGhl
IHRleHQgaGFzIGRpYWNyaXRpY2FsIG1hcmtzLgotICAgIGljdTo6VW5pY29kZVN0cmluZyBub3Jt
YWxpemVkU3RyaW5nOwotICAgIFVFcnJvckNvZGUgZXJyb3IgPSBVX1pFUk9fRVJST1I7Ci0KLSAg
ICBmb3IgKGludDE2X3QgaSA9IDA7IGkgPCBvcmlnaW5hbFJ1bi5sZW5ndGgoKTsgKytpKSB7Ci0g
ICAgICAgIFVDaGFyIGNoID0gb3JpZ2luYWxSdW5baV07Ci0gICAgICAgIGlmICg6OnVibG9ja19n
ZXRDb2RlKGNoKSA9PSBVQkxPQ0tfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTKSB7Ci0gICAg
ICAgICAgICBpY3U6Ok5vcm1hbGl6ZXI6Om5vcm1hbGl6ZShpY3U6OlVuaWNvZGVTdHJpbmcob3Jp
Z2luYWxSdW4uY2hhcmFjdGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb3JpZ2luYWxSdW4ubGVuZ3RoKCkpLCBVTk9STV9ORkMsIDAgLyogbm8gb3B0aW9ucyAq
LywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRTdHJp
bmcsIGVycm9yKTsKLSAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyb3IpKQotICAgICAgICAg
ICAgICAgIHJldHVybiBvcmlnaW5hbFJ1bjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgLy8gTm9ybWFsaXplIHNwYWNlIGFuZCBtaXJyb3IgcGFyZW50aGVzaXMg
Zm9yIHJ0bCB0ZXh0LgotICAgIGludCBub3JtYWxpemVkQnVmZmVyTGVuZ3RoOwotICAgIGNvbnN0
IFVDaGFyKiBzb3VyY2VUZXh0OwotICAgIGlmIChub3JtYWxpemVkU3RyaW5nLmlzRW1wdHkoKSkg
ewotICAgICAgICBub3JtYWxpemVkQnVmZmVyTGVuZ3RoID0gb3JpZ2luYWxSdW4ubGVuZ3RoKCk7
Ci0gICAgICAgIHNvdXJjZVRleHQgPSBvcmlnaW5hbFJ1bi5jaGFyYWN0ZXJzKCk7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCA9IG5vcm1hbGl6ZWRTdHJpbmcu
bGVuZ3RoKCk7Ci0gICAgICAgIHNvdXJjZVRleHQgPSBub3JtYWxpemVkU3RyaW5nLmdldEJ1ZmZl
cigpOwotICAgIH0KLQotICAgIG5vcm1hbGl6ZWRCdWZmZXIuc2V0KG5ldyBVQ2hhcltub3JtYWxp
emVkQnVmZmVyTGVuZ3RoICsgMV0pOwotCi0gICAgbm9ybWFsaXplU3BhY2VzQW5kTWlycm9yQ2hh
cnMoc291cmNlVGV4dCwgb3JpZ2luYWxSdW4ucnRsKCksIG5vcm1hbGl6ZWRCdWZmZXIuZ2V0KCks
IG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgpOwotCi0gICAgbm9ybWFsaXplZFJ1bi5zZXQobmV3IFRl
eHRSdW4ob3JpZ2luYWxSdW4pKTsKLSAgICBub3JtYWxpemVkUnVuLT5zZXRUZXh0KG5vcm1hbGl6
ZWRCdWZmZXIuZ2V0KCksIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgpOwotICAgIHJldHVybiAqbm9y
bWFsaXplZFJ1bjsKLX0KLQogc3RhdGljIHZvaWQgc2V0dXBGb3JUZXh0UGFpbnRpbmcoU2tQYWlu
dCogcGFpbnQsIFNrQ29sb3IgY29sb3IpCiB7CiAgICAgcGFpbnQtPnNldFRleHRFbmNvZGluZyhT
a1BhaW50OjprR2x5cGhJRF9UZXh0RW5jb2RpbmcpOwpAQCAtNjk3LDIyICsyMDQsMjIgQEAgdm9p
ZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgVGV4dFJ1
biYgcnVuLAogICAgICAgICBzZXR1cEZvclRleHRQYWludGluZygmc3Ryb2tlUGFpbnQsIGdjLT5z
dHJva2VDb2xvcigpLnJnYigpKTsKICAgICB9CiAKLSAgICBUZXh0UnVuV2Fsa2VyIHdhbGtlcihy
dW4sIHBvaW50LngoKSwgdGhpcyk7Ci0gICAgd2Fsa2VyLnNldFdvcmRTcGFjaW5nQWRqdXN0bWVu
dCh3b3JkU3BhY2luZygpKTsKLSAgICB3YWxrZXIuc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQo
bGV0dGVyU3BhY2luZygpKTsKLSAgICB3YWxrZXIuc2V0UGFkZGluZyhydW4ucGFkZGluZygpKTsK
KyAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIgY29udHJvbGxlcihydW4sIHBvaW50LngoKSwgdGhp
cyk7CisgICAgY29udHJvbGxlci5zZXRXb3JkU3BhY2luZ0FkanVzdG1lbnQod29yZFNwYWNpbmco
KSk7CisgICAgY29udHJvbGxlci5zZXRMZXR0ZXJTcGFjaW5nQWRqdXN0bWVudChsZXR0ZXJTcGFj
aW5nKCkpOworICAgIGNvbnRyb2xsZXIuc2V0UGFkZGluZyhydW4ucGFkZGluZygpKTsKIAotICAg
IHdoaWxlICh3YWxrZXIubmV4dFNjcmlwdFJ1bigpKSB7CisgICAgd2hpbGUgKGNvbnRyb2xsZXIu
bmV4dFNjcmlwdFJ1bigpKSB7CiAgICAgICAgIGlmIChmaWxsKSB7Ci0gICAgICAgICAgICB3YWxr
ZXIuZm9udFBsYXRmb3JtRGF0YUZvclNjcmlwdFJ1bigpLT5zZXR1cFBhaW50KCZmaWxsUGFpbnQp
OworICAgICAgICAgICAgY29udHJvbGxlci5mb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCkt
PnNldHVwUGFpbnQoJmZpbGxQYWludCk7CiAgICAgICAgICAgICBhZGp1c3RUZXh0UmVuZGVyTW9k
ZSgmZmlsbFBhaW50LCBnYy0+cGxhdGZvcm1Db250ZXh0KCkpOwotICAgICAgICAgICAgY2FudmFz
LT5kcmF3UG9zVGV4dEgod2Fsa2VyLmdseXBocygpLCB3YWxrZXIubGVuZ3RoKCkgPDwgMSwgd2Fs
a2VyLnhQb3NpdGlvbnMoKSwgcG9pbnQueSgpLCBmaWxsUGFpbnQpOworICAgICAgICAgICAgY2Fu
dmFzLT5kcmF3UG9zVGV4dEgoY29udHJvbGxlci5nbHlwaHMoKSwgY29udHJvbGxlci5sZW5ndGgo
KSA8PCAxLCBjb250cm9sbGVyLnhQb3NpdGlvbnMoKSwgcG9pbnQueSgpLCBmaWxsUGFpbnQpOwog
ICAgICAgICB9CiAKICAgICAgICAgaWYgKHN0cm9rZSkgewotICAgICAgICAgICAgd2Fsa2VyLmZv
bnRQbGF0Zm9ybURhdGFGb3JTY3JpcHRSdW4oKS0+c2V0dXBQYWludCgmc3Ryb2tlUGFpbnQpOwor
ICAgICAgICAgICAgY29udHJvbGxlci5mb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCktPnNl
dHVwUGFpbnQoJnN0cm9rZVBhaW50KTsKICAgICAgICAgICAgIGFkanVzdFRleHRSZW5kZXJNb2Rl
KCZzdHJva2VQYWludCwgZ2MtPnBsYXRmb3JtQ29udGV4dCgpKTsKLSAgICAgICAgICAgIGNhbnZh
cy0+ZHJhd1Bvc1RleHRIKHdhbGtlci5nbHlwaHMoKSwgd2Fsa2VyLmxlbmd0aCgpIDw8IDEsIHdh
bGtlci54UG9zaXRpb25zKCksIHBvaW50LnkoKSwgc3Ryb2tlUGFpbnQpOworICAgICAgICAgICAg
Y2FudmFzLT5kcmF3UG9zVGV4dEgoY29udHJvbGxlci5nbHlwaHMoKSwgY29udHJvbGxlci5sZW5n
dGgoKSA8PCAxLCBjb250cm9sbGVyLnhQb3NpdGlvbnMoKSwgcG9pbnQueSgpLCBzdHJva2VQYWlu
dCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC03MjQsMjcgKzIzMSwyNyBAQCB2b2lkIEZvbnQ6
OmRyYXdFbXBoYXNpc01hcmtzRm9yQ29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiAvKiBjb250
ZXh0ICovLCBjb25zdAogCiBmbG9hdCBGb250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIC8qIGZhbGxi
YWNrRm9udHMgKi8sIEdseXBoT3ZlcmZsb3cqIC8qIGdseXBoT3ZlcmZsb3cgKi8pIGNvbnN0CiB7
Ci0gICAgVGV4dFJ1bldhbGtlciB3YWxrZXIocnVuLCAwLCB0aGlzKTsKLSAgICB3YWxrZXIuc2V0
V29yZFNwYWNpbmdBZGp1c3RtZW50KHdvcmRTcGFjaW5nKCkpOwotICAgIHdhbGtlci5zZXRMZXR0
ZXJTcGFjaW5nQWRqdXN0bWVudChsZXR0ZXJTcGFjaW5nKCkpOwotICAgIHJldHVybiB3YWxrZXIu
d2lkdGhPZkZ1bGxSdW4oKTsKKyAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIgY29udHJvbGxlcihy
dW4sIDAsIHRoaXMpOworICAgIGNvbnRyb2xsZXIuc2V0V29yZFNwYWNpbmdBZGp1c3RtZW50KHdv
cmRTcGFjaW5nKCkpOworICAgIGNvbnRyb2xsZXIuc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQo
bGV0dGVyU3BhY2luZygpKTsKKyAgICByZXR1cm4gY29udHJvbGxlci53aWR0aE9mRnVsbFJ1bigp
OwogfQogCi1zdGF0aWMgaW50IGdseXBoSW5kZXhGb3JYUG9zaXRpb25JblNjcmlwdFJ1bihjb25z
dCBUZXh0UnVuV2Fsa2VyJiB3YWxrZXIsIGludCB4KQorc3RhdGljIGludCBnbHlwaEluZGV4Rm9y
WFBvc2l0aW9uSW5TY3JpcHRSdW4oY29uc3QgQ29tcGxleFRleHRDb250cm9sbGVyJiBjb250cm9s
bGVyLCBpbnQgeCkKIHsKLSAgICBjb25zdCBIQl9GaXhlZCogYWR2YW5jZXMgPSB3YWxrZXIuYWR2
YW5jZXMoKTsKLSAgICBpbnQgbGV0dGVyU3BhY2luZyA9IHdhbGtlci5sZXR0ZXJTcGFjaW5nKCk7
CisgICAgY29uc3QgSEJfRml4ZWQqIGFkdmFuY2VzID0gY29udHJvbGxlci5hZHZhbmNlcygpOwor
ICAgIGludCBsZXR0ZXJTcGFjaW5nID0gY29udHJvbGxlci5sZXR0ZXJTcGFjaW5nKCk7CiAgICAg
aW50IGdseXBoSW5kZXg7Ci0gICAgaWYgKHdhbGtlci5ydGwoKSkgewotICAgICAgICBmb3IgKGds
eXBoSW5kZXggPSB3YWxrZXIubGVuZ3RoKCkgLSAxOyBnbHlwaEluZGV4ID49IDA7IC0tZ2x5cGhJ
bmRleCkgeworICAgIGlmIChjb250cm9sbGVyLnJ0bCgpKSB7CisgICAgICAgIGZvciAoZ2x5cGhJ
bmRleCA9IGNvbnRyb2xsZXIubGVuZ3RoKCkgLSAxOyBnbHlwaEluZGV4ID49IDA7IC0tZ2x5cGhJ
bmRleCkgewogICAgICAgICAgICAgLy8gV2hlbiBpdGVyYXRpbmcgTFRSIG92ZXIgUlRMIHRleHQs
IHdlIG11c3QgaW5jbHVkZSB0aGUgd2hpdGVzcGFjZQogICAgICAgICAgICAgLy8gX2JlZm9yZV8g
dGhlIGdseXBoLCBzbyBubyArIDEgaGVyZS4KLSAgICAgICAgICAgIGlmICh4IDwgKHN0YXRpY19j
YXN0PGludD4od2Fsa2VyLmxlbmd0aCgpKSAtIGdseXBoSW5kZXgpICogbGV0dGVyU3BhY2luZyAr
IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihhZHZhbmNlc1tnbHlwaEluZGV4XSkpCisgICAg
ICAgICAgICBpZiAoeCA8IChzdGF0aWNfY2FzdDxpbnQ+KGNvbnRyb2xsZXIubGVuZ3RoKCkpIC0g
Z2x5cGhJbmRleCkgKiBsZXR0ZXJTcGFjaW5nICsgdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2Vy
KGFkdmFuY2VzW2dseXBoSW5kZXhdKSkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAg
ICAgIHggLT0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKGFkdmFuY2VzW2dseXBoSW5kZXhd
KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoZ2x5cGhJbmRleCA9IDA7
IHN0YXRpY19jYXN0PHVuc2lnbmVkPihnbHlwaEluZGV4KSA8IHdhbGtlci5sZW5ndGgoKTsgKytn
bHlwaEluZGV4KSB7CisgICAgICAgIGZvciAoZ2x5cGhJbmRleCA9IDA7IHN0YXRpY19jYXN0PHVu
c2lnbmVkPihnbHlwaEluZGV4KSA8IGNvbnRyb2xsZXIubGVuZ3RoKCk7ICsrZ2x5cGhJbmRleCkg
ewogICAgICAgICAgICAgaWYgKHggPCAoZ2x5cGhJbmRleCAqIGxldHRlclNwYWNpbmcgKyB0cnVu
Y2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIoYWR2YW5jZXNbZ2x5cGhJbmRleF0pKSkKICAgICAgICAg
ICAgICAgICBicmVhazsKICAgICAgICAgICAgIHggLT0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRl
Z2VyKGFkdmFuY2VzW2dseXBoSW5kZXhdKTsKQEAgLTc2NCw5ICsyNzEsOSBAQCBpbnQgRm9udDo6
b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0
IHhGbG9hdCwKIAogICAgIC8vIChNYWMgY29kZSBpZ25vcmVzIGluY2x1ZGVQYXJ0aWFsR2x5cGhz
LCBhbmQgdGhleSBkb24ndCBrbm93IHdoYXQgaXQncwogICAgIC8vIHN1cHBvc2VkIHRvIGRvLCBz
byB3ZSBqdXN0IGlnbm9yZSBpdCBhcyB3ZWxsLikKLSAgICBUZXh0UnVuV2Fsa2VyIHdhbGtlcihy
dW4sIDAsIHRoaXMpOwotICAgIHdhbGtlci5zZXRXb3JkU3BhY2luZ0FkanVzdG1lbnQod29yZFNw
YWNpbmcoKSk7Ci0gICAgd2Fsa2VyLnNldExldHRlclNwYWNpbmdBZGp1c3RtZW50KGxldHRlclNw
YWNpbmcoKSk7CisgICAgQ29tcGxleFRleHRDb250cm9sbGVyIGNvbnRyb2xsZXIocnVuLCAwLCB0
aGlzKTsKKyAgICBjb250cm9sbGVyLnNldFdvcmRTcGFjaW5nQWRqdXN0bWVudCh3b3JkU3BhY2lu
ZygpKTsKKyAgICBjb250cm9sbGVyLnNldExldHRlclNwYWNpbmdBZGp1c3RtZW50KGxldHRlclNw
YWNpbmcoKSk7CiAKICAgICAvLyBJZiB0aGlzIGlzIFJUTCB0ZXh0LCB0aGUgZmlyc3QgZ2x5cGgg
ZnJvbSB0aGUgbGVmdCBpcyBhY3R1YWxseSB0aGUgbGFzdAogICAgIC8vIGNvZGUgcG9pbnQuIFNv
IHdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBjb2RlIHBvaW50cyB0aGVyZSBhcmUgdG90YWwgaW4K
QEAgLTc3NSw3ICsyODIsNyBAQCBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4
VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHhGbG9hdCwKICAgICAvLyBJbiBMVFIgd2Ug
bGVhdmUgdGhpcyBhcyAwIHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvcgogICAg
IC8vIHxiYXNlUG9zaXRpb258LCBiZWxvdy4KICAgICB1bnNpZ25lZCB0b3RhbENvZGVQb2ludHMg
PSAwOwotICAgIGlmICh3YWxrZXIucnRsKCkpIHsKKyAgICBpZiAoY29udHJvbGxlci5ydGwoKSkg
ewogICAgICAgICBzc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBy
dW4ubGVuZ3RoKCkpIHsKICAgICAgICAgICAgIHV0ZjE2X3RvX2NvZGVfcG9pbnQocnVuLmNoYXJh
Y3RlcnMoKSwgcnVuLmxlbmd0aCgpLCAmb2Zmc2V0KTsKQEAgLTc5OCwxNSArMzA1LDE1IEBAIGlu
dCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1
biwgZmxvYXQgeEZsb2F0LAogICAgIC8vCiAgICAgLy8gRm9yIExUUiwgYmFzZVBvc2l0aW9uIGlz
IHplcm8gc28gaXQgYWxyZWFkeSBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZQogICAgIC8vIGZp
cnN0IHNjcmlwdCBydW4uCi0gICAgd2hpbGUgKHdhbGtlci5uZXh0U2NyaXB0UnVuKCkpIHsKLSAg
ICAgICAgaWYgKHdhbGtlci5ydGwoKSkKLSAgICAgICAgICAgIGJhc2VQb3NpdGlvbiAtPSB3YWxr
ZXIubnVtQ29kZVBvaW50cygpOworICAgIHdoaWxlIChjb250cm9sbGVyLm5leHRTY3JpcHRSdW4o
KSkgeworICAgICAgICBpZiAoY29udHJvbGxlci5ydGwoKSkKKyAgICAgICAgICAgIGJhc2VQb3Np
dGlvbiAtPSBjb250cm9sbGVyLm51bUNvZGVQb2ludHMoKTsKIAotICAgICAgICBpZiAoeCA+PSAw
ICYmIHN0YXRpY19jYXN0PHVuc2lnbmVkPih4KSA8IHdhbGtlci53aWR0aCgpKSB7CisgICAgICAg
IGlmICh4ID49IDAgJiYgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHgpIDwgY29udHJvbGxlci53aWR0
aCgpKSB7CiAgICAgICAgICAgICAvLyBUaGUgeCB2YWx1ZSBpbiBxdWVzdGlvbiBpcyB3aXRoaW4g
dGhpcyBzY3JpcHQgcnVuLiBXZSBjb25zaWRlcgogICAgICAgICAgICAgLy8gZWFjaCBnbHlwaCBp
biBwcmVzZW50YXRpb24gb3JkZXIgYW5kIHN0b3Agd2hlbiB3ZSBmaW5kIHRoZSBvbmUKICAgICAg
ICAgICAgIC8vIGNvdmVyaW5nIHRoaXMgcG9zaXRpb24uCi0gICAgICAgICAgICBjb25zdCBpbnQg
Z2x5cGhJbmRleCA9IGdseXBoSW5kZXhGb3JYUG9zaXRpb25JblNjcmlwdFJ1bih3YWxrZXIsIHgp
OworICAgICAgICAgICAgY29uc3QgaW50IGdseXBoSW5kZXggPSBnbHlwaEluZGV4Rm9yWFBvc2l0
aW9uSW5TY3JpcHRSdW4oY29udHJvbGxlciwgeCk7CiAKICAgICAgICAgICAgIC8vIE5vdyB0aGF0
IHdlIGhhdmUgYSBnbHlwaCBpbmRleCwgd2UgaGF2ZSB0byB0dXJuIHRoYXQgaW50byBhCiAgICAg
ICAgICAgICAvLyBjb2RlLXBvaW50IGluZGV4LiBCZWNhdXNlIG9mIGxpZ2F0dXJlcywgc2V2ZXJh
bCBjb2RlLXBvaW50cyBtYXkKQEAgLTgxOCwxOSArMzI1LDE5IEBAIGludCBGb250OjpvZmZzZXRG
b3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgeEZsb2F0
LAogICAgICAgICAgICAgLy8gdGhpcywgd2UgdGFrZSBhbnkgY29kZSBwb2ludCB3aGljaCBjb250
cmlidXRlZCB0byB0aGUgZ2x5cGggaW4KICAgICAgICAgICAgIC8vIHF1ZXN0aW9uLCBvciBhbnkg
c3Vic2VxdWVudCBnbHlwaC4gSWYgd2UgcnVuIG9mZiB0aGUgZW5kLCB0aGVuCiAgICAgICAgICAg
ICAvLyB3ZSB0YWtlIHRoZSBsYXN0IGNvZGUgcG9pbnQuCi0gICAgICAgICAgICBjb25zdCB1bnNp
Z25lZCBzaG9ydCogbG9nID0gd2Fsa2VyLmxvZ0NsdXN0ZXJzKCk7Ci0gICAgICAgICAgICBmb3Ig
KHVuc2lnbmVkIGogPSAwOyBqIDwgd2Fsa2VyLm51bUNvZGVQb2ludHMoKTsgKytqKSB7CisgICAg
ICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogbG9nID0gY29udHJvbGxlci5sb2dDbHVzdGVy
cygpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGNvbnRyb2xsZXIubnVt
Q29kZVBvaW50cygpOyArK2opIHsKICAgICAgICAgICAgICAgICBpZiAobG9nW2pdID49IGdseXBo
SW5kZXgpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlUG9zaXRpb24gKyBqOwogICAg
ICAgICAgICAgfQogCi0gICAgICAgICAgICByZXR1cm4gYmFzZVBvc2l0aW9uICsgd2Fsa2VyLm51
bUNvZGVQb2ludHMoKSAtIDE7CisgICAgICAgICAgICByZXR1cm4gYmFzZVBvc2l0aW9uICsgY29u
dHJvbGxlci5udW1Db2RlUG9pbnRzKCkgLSAxOwogICAgICAgICB9CiAKLSAgICAgICAgeCAtPSB3
YWxrZXIud2lkdGgoKTsKKyAgICAgICAgeCAtPSBjb250cm9sbGVyLndpZHRoKCk7CiAKLSAgICAg
ICAgaWYgKCF3YWxrZXIucnRsKCkpCi0gICAgICAgICAgICBiYXNlUG9zaXRpb24gKz0gd2Fsa2Vy
Lm51bUNvZGVQb2ludHMoKTsKKyAgICAgICAgaWYgKCFjb250cm9sbGVyLnJ0bCgpKQorICAgICAg
ICAgICAgYmFzZVBvc2l0aW9uICs9IGNvbnRyb2xsZXIubnVtQ29kZVBvaW50cygpOwogICAgIH0K
IAogICAgIHJldHVybiBiYXNlUG9zaXRpb247CkBAIC04NDIsNTQgKzM0OSw1NCBAQCBGbG9hdFJl
Y3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGlu
dCB0bykgY29uc3QKIHsKICAgICBpbnQgZnJvbVggPSAtMSwgdG9YID0gLTEsIGZyb21BZHZhbmNl
ID0gLTEsIHRvQWR2YW5jZSA9IC0xOwotICAgIFRleHRSdW5XYWxrZXIgd2Fsa2VyKHJ1biwgMCwg
dGhpcyk7Ci0gICAgd2Fsa2VyLnNldFdvcmRTcGFjaW5nQWRqdXN0bWVudCh3b3JkU3BhY2luZygp
KTsKLSAgICB3YWxrZXIuc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQobGV0dGVyU3BhY2luZygp
KTsKKyAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIgY29udHJvbGxlcihydW4sIDAsIHRoaXMpOwor
ICAgIGNvbnRyb2xsZXIuc2V0V29yZFNwYWNpbmdBZGp1c3RtZW50KHdvcmRTcGFjaW5nKCkpOwor
ICAgIGNvbnRyb2xsZXIuc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQobGV0dGVyU3BhY2luZygp
KTsKIAogICAgIC8vIEJhc2Ugd2lsbCBwb2ludCB0byB0aGUgeCBvZmZzZXQgZm9yIHRoZSBjdXJy
ZW50IHNjcmlwdCBydW4uIE5vdGUgdGhhdCwgaW4KICAgICAvLyB0aGUgTFRSIGNhc2UsIHdpZHRo
IHdpbGwgYmUgMC4KLSAgICBpbnQgYmFzZSA9IHdhbGtlci5ydGwoKSA/IHdhbGtlci53aWR0aE9m
RnVsbFJ1bigpIDogMDsKKyAgICBpbnQgYmFzZSA9IGNvbnRyb2xsZXIucnRsKCkgPyBjb250cm9s
bGVyLndpZHRoT2ZGdWxsUnVuKCkgOiAwOwogICAgIGNvbnN0IGludCBsZWZ0RWRnZSA9IGJhc2U7
CiAKICAgICAvLyBXZSB3YW50IHRvIGVudW1lcmF0ZSB0aGUgc2NyaXB0IHJ1bnMgaW4gY29kZSBw
b2ludCBvcmRlciBpbiB0aGUgZm9sbG93aW5nCi0gICAgLy8gY29kZS4gVGhpcyBjYWxsIGFsc28g
cmVzZXRzIHx3YWxrZXJ8LgotICAgIHdhbGtlci5zZXRCYWNrd2FyZHNJdGVyYXRpb24oZmFsc2Up
OworICAgIC8vIGNvZGUuIFRoaXMgY2FsbCBhbHNvIHJlc2V0cyB8Y29udHJvbGxlcnwuCisgICAg
Y29udHJvbGxlci5zZXRCYWNrd2FyZHNJdGVyYXRpb24oZmFsc2UpOwogCi0gICAgd2hpbGUgKHdh
bGtlci5uZXh0U2NyaXB0UnVuKCkgJiYgKGZyb21YID09IC0xIHx8IHRvWCA9PSAtMSkpIHsKLSAg
ICAgICAgLy8gVGV4dFJ1bldhbGtlciB3aWxsIGhlbHBmdWxseSBhY2N1bHVsYXRlIHRoZSB4IG9m
ZnNldHMgZm9yIGRpZmZlcmVudAorICAgIHdoaWxlIChjb250cm9sbGVyLm5leHRTY3JpcHRSdW4o
KSAmJiAoZnJvbVggPT0gLTEgfHwgdG9YID09IC0xKSkgeworICAgICAgICAvLyBDb21wbGV4VGV4
dENvbnRyb2xsZXIgd2lsbCBoZWxwZnVsbHkgYWNjdWx1bGF0ZSB0aGUgeCBvZmZzZXRzIGZvciBk
aWZmZXJlbnQKICAgICAgICAgLy8gc2NyaXB0IHJ1bnMgZm9yIHVzLiBGb3IgdGhpcyBjb2RlLCBo
b3dldmVyLCB3ZSBhbHdheXMgd2FudCB0aGUgeCBvZmZzZXRzCiAgICAgICAgIC8vIHRvIHN0YXJ0
IGZyb20gemVybyBzbyB3ZSBjYWxsIHRoaXMgYmVmb3JlIGVhY2ggc2NyaXB0IHJ1bi4KLSAgICAg
ICAgd2Fsa2VyLnNldFhPZmZzZXRUb1plcm8oKTsKKyAgICAgICAgY29udHJvbGxlci5zZXRYT2Zm
c2V0VG9aZXJvKCk7CiAKLSAgICAgICAgaWYgKHdhbGtlci5ydGwoKSkKLSAgICAgICAgICAgIGJh
c2UgLT0gd2Fsa2VyLndpZHRoKCk7CisgICAgICAgIGlmIChjb250cm9sbGVyLnJ0bCgpKQorICAg
ICAgICAgICAgYmFzZSAtPSBjb250cm9sbGVyLndpZHRoKCk7CiAKLSAgICAgICAgaWYgKGZyb21Y
ID09IC0xICYmIGZyb20gPj0gMCAmJiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZnJvbSkgPCB3YWxr
ZXIubnVtQ29kZVBvaW50cygpKSB7CisgICAgICAgIGlmIChmcm9tWCA9PSAtMSAmJiBmcm9tID49
IDAgJiYgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGZyb20pIDwgY29udHJvbGxlci5udW1Db2RlUG9p
bnRzKCkpIHsKICAgICAgICAgICAgIC8vIHxmcm9tfCBpcyB3aXRoaW4gdGhpcyBzY3JpcHQgcnVu
LiBTbyB3ZSBpbmRleCB0aGUgY2x1c3RlcnMgbG9nIHRvCiAgICAgICAgICAgICAvLyBmaW5kIHdo
aWNoIGdseXBoIHRoaXMgY29kZS1wb2ludCBjb250cmlidXRlZCB0byBhbmQgZmluZCBpdHMgeAog
ICAgICAgICAgICAgLy8gcG9zaXRpb24uCi0gICAgICAgICAgICBpbnQgZ2x5cGggPSB3YWxrZXIu
bG9nQ2x1c3RlcnMoKVtmcm9tXTsKLSAgICAgICAgICAgIGZyb21YID0gYmFzZSArIHdhbGtlci54
UG9zaXRpb25zKClbZ2x5cGhdOwotICAgICAgICAgICAgZnJvbUFkdmFuY2UgPSB3YWxrZXIuYWR2
YW5jZXMoKVtnbHlwaF07CisgICAgICAgICAgICBpbnQgZ2x5cGggPSBjb250cm9sbGVyLmxvZ0Ns
dXN0ZXJzKClbZnJvbV07CisgICAgICAgICAgICBmcm9tWCA9IGJhc2UgKyBjb250cm9sbGVyLnhQ
b3NpdGlvbnMoKVtnbHlwaF07CisgICAgICAgICAgICBmcm9tQWR2YW5jZSA9IGNvbnRyb2xsZXIu
YWR2YW5jZXMoKVtnbHlwaF07CiAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZnJvbSAtPSB3
YWxrZXIubnVtQ29kZVBvaW50cygpOworICAgICAgICAgICAgZnJvbSAtPSBjb250cm9sbGVyLm51
bUNvZGVQb2ludHMoKTsKIAotICAgICAgICBpZiAodG9YID09IC0xICYmIHRvID49IDAgJiYgc3Rh
dGljX2Nhc3Q8dW5zaWduZWQ+KHRvKSA8IHdhbGtlci5udW1Db2RlUG9pbnRzKCkpIHsKLSAgICAg
ICAgICAgIGludCBnbHlwaCA9IHdhbGtlci5sb2dDbHVzdGVycygpW3RvXTsKLSAgICAgICAgICAg
IHRvWCA9IGJhc2UgKyB3YWxrZXIueFBvc2l0aW9ucygpW2dseXBoXTsKLSAgICAgICAgICAgIHRv
QWR2YW5jZSA9IHdhbGtlci5hZHZhbmNlcygpW2dseXBoXTsKKyAgICAgICAgaWYgKHRvWCA9PSAt
MSAmJiB0byA+PSAwICYmIHN0YXRpY19jYXN0PHVuc2lnbmVkPih0bykgPCBjb250cm9sbGVyLm51
bUNvZGVQb2ludHMoKSkgeworICAgICAgICAgICAgaW50IGdseXBoID0gY29udHJvbGxlci5sb2dD
bHVzdGVycygpW3RvXTsKKyAgICAgICAgICAgIHRvWCA9IGJhc2UgKyBjb250cm9sbGVyLnhQb3Np
dGlvbnMoKVtnbHlwaF07CisgICAgICAgICAgICB0b0FkdmFuY2UgPSBjb250cm9sbGVyLmFkdmFu
Y2VzKClbZ2x5cGhdOwogICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHRvIC09IHdhbGtlci5u
dW1Db2RlUG9pbnRzKCk7CisgICAgICAgICAgICB0byAtPSBjb250cm9sbGVyLm51bUNvZGVQb2lu
dHMoKTsKIAotICAgICAgICBpZiAoIXdhbGtlci5ydGwoKSkKLSAgICAgICAgICAgIGJhc2UgKz0g
d2Fsa2VyLndpZHRoKCk7CisgICAgICAgIGlmICghY29udHJvbGxlci5ydGwoKSkKKyAgICAgICAg
ICAgIGJhc2UgKz0gY29udHJvbGxlci53aWR0aCgpOwogICAgIH0KIAogICAgIC8vIFRoZSBwb3Np
dGlvbiBpbiBxdWVzdGlvbiBtaWdodCBiZSBqdXN0IGFmdGVyIHRoZSB0ZXh0LgogICAgIGNvbnN0
IGludCByaWdodEVkZ2UgPSBiYXNlOwogICAgIGlmIChmcm9tWCA9PSAtMSAmJiAhZnJvbSkKICAg
ICAgICAgZnJvbVggPSBsZWZ0RWRnZTsKLSAgICBlbHNlIGlmICh3YWxrZXIucnRsKCkpCisgICAg
ZWxzZSBpZiAoY29udHJvbGxlci5ydGwoKSkKICAgICAgICBmcm9tWCArPSB0cnVuY2F0ZUZpeGVk
UG9pbnRUb0ludGVnZXIoZnJvbUFkdmFuY2UpOwogCiAgICAgaWYgKHRvWCA9PSAtMSAmJiAhdG8p
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78046</attachid>
            <date>2011-01-05 14:35:16 -0800</date>
            <delta_ts>2011-01-05 14:52:19 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-51956-20110105143514.patch</filename>
            <type>text/plain</type>
            <size>62164</size>
            <attacher name="Evan Martin">evan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NjQxMmNjNWExYmJlN2FiYWY3ZDhlYWQ0NWNiNWY0MjJhMWYwYzcxYS4uOTBiZDU3NGY0YzMwNDI2
NThlNWRkZmZlNjg1MjE3OWMxMTU5YzY5YiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1OCBAQAorMjAxMS0wMS0wNSAgRXZh
biBNYXJ0aW4gIDxldmFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBbY2hyb21pdW1dIHJlZmFjdG9yIGNvbXBsZXggdGV4dCBv
biBMaW51eAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NTE5NTYKKworICAgICAgICBQdWxsIG91dCBUZXh0UnVuV2Fsa2VyIGZyb20gRm9udExpbnV4LmNw
cC4gIFB1dCBpdCBpbiBpdHMgb3duIGZpbGUuCisgICAgICAgIFJlbmFtZSBpdCB0byBDb21wbGV4
VGV4dENvbnRyb2xsZXIsIHRvIG1hdGNoIHBsYXRmb3JtL2dyYXBoaWNzL21hYworICAgICAgICBt
b3JlIGNsb3NlbHkuCisKKyAgICAgICAgTm8gdGVzdHMgYmVjYXVzZSB0aGUgY2hhbmdlIGlzIGp1
c3QgcmVuYW1pbmcgYSBjbGFzcy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lw
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJv
bGxlckxpbnV4LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRy
b2xsZXI6OkNvbXBsZXhUZXh0Q29udHJvbGxlcik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
VGV4dENvbnRyb2xsZXI6On5Db21wbGV4VGV4dENvbnRyb2xsZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppc1dvcmRCcmVhayk6CisgICAgICAgIChXZWJDb3Jl
OjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRldGVybWluZVdvcmRCcmVha1NwYWNpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXRQYWRkaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6cmVzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24pOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpuZXh0U2NyaXB0UnVuKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6d2lkdGhPZkZ1bGxSdW4pOgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXR1cEZvbnRGb3JTY3Jp
cHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjphbGxvY0hh
cmZidXp6Rm9udCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRl
bGV0ZUdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxl
cjo6Y3JlYXRlR2x5cGhBcnJheXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250
cm9sbGVyOjpyZXNldEdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0
Q29udHJvbGxlcjo6c2hhcGVHbHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRD
b250cm9sbGVyOjpzZXRHbHlwaFhQb3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxl
eFRleHRDb250cm9sbGVyOjpub3JtYWxpemVTcGFjZXNBbmRNaXJyb3JDaGFycyk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdldE5vcm1hbGl6ZWRUZXh0UnVuKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xs
ZXJMaW51eC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxl
cjo6c2V0V29yZFNwYWNpbmdBZGp1c3RtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhU
ZXh0Q29udHJvbGxlcjo6c2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpsZXR0ZXJTcGFjaW5nKToKKyAgICAgICAgKFdl
YkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2V0WE9mZnNldFRvWmVybyk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OnJ0bCk6CisgICAgICAgIChXZWJDb3Jl
OjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdseXBocyk6CisgICAgICAgIChXZWJDb3JlOjpDb21w
bGV4VGV4dENvbnRyb2xsZXI6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4
dENvbnRyb2xsZXI6OnhQb3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRD
b250cm9sbGVyOjphZHZhbmNlcyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRy
b2xsZXI6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6
bG9nQ2x1c3RlcnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpu
dW1Db2RlUG9pbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6
Zm9udFBsYXRmb3JtRGF0YUZvclNjcmlwdFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
VGV4dENvbnRyb2xsZXI6OmlzQ29kZXBvaW50U3BhY2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Ojpk
cmF3Q29tcGxleFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZmxvYXRXaWR0aEZvckNv
bXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OmdseXBoSW5kZXhGb3JYUG9zaXRpb25JblNj
cmlwdFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNv
bXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21w
bGV4VGV4dCk6CisKIDIwMTEtMDEtMDQgIFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5ib3RA
Z21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHI3NDk5Mi4KZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAgYi9XZWJDb3JlL1dlYkNv
cmUuZ3lwL1dlYkNvcmUuZ3lwCmluZGV4IDUwYmRiZjA3ZTA2NGQ2ODcwMmY3YzNkZDVhMjVmZWQz
OGZlNjZlYWIuLmM5MzY3OTMzMzcxZmE4NWJkMjhmMzRmZTU0MDVkZmU5YmY3NmJiMmQgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKKysrIGIvV2ViQ29yZS9XZWJD
b3JlLmd5cC9XZWJDb3JlLmd5cApAQCAtMTA5OSw2ICsxMDk5LDcgQEAKICAgICAgICAgICAnc291
cmNlcy8nOiBbCiAgICAgICAgICAgICAjIENoZXJyeS1waWNrIGZpbGVzIGV4Y2x1ZGVkIGJ5IHRo
ZSBicm9hZGVyIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYWJvdmUuCiAgICAgICAgICAgICBbJ2luY2x1
ZGUnLCAncGxhdGZvcm0vY2hyb21pdW0vS2V5Q29kZUNvbnZlcnNpb25HdGtcXC5jcHAkJ10sCisg
ICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxl
eFRleHRDb250cm9sbGVyTGludXhcXC5jcHAkJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUnLCAn
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlTGludXhcXC5jcHAkJ10sCiAgICAg
ICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4
XFwuY3BwJCddLAogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eFxcLmNwcCQnXSwKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvV2ViQ29yZS5neXBpIGIvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggZGZiZjg2ZTY4ZjJh
Y2RhMDY4ZGJhYWIxYzAxNThhNzVhNGIyMmVmMC4uODA2YWI5NWEwNjMxYTYzYzMzZGQ2MjU5ZDY3
MTMzYzYwZDJmMzE3YiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkKQEAgLTI1NTUsMTIgKzI1NTUsMTMgQEAKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzTGF5ZXJDaHJvbWl1bS5j
cHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhc0xheWVy
Q2hyb21pdW0uaCcsCi0gICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRHJh
d2luZ0J1ZmZlckNocm9taXVtLmNwcCcsCi0gICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vRXh0ZW5zaW9uczNEQ2hyb21pdW0uaCcsCisgICAgICAgICAgICAncGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguY3BwJywKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db250ZW50TGF5ZXJDaHJvbWl1bS5j
cHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRlbnRMYXll
ckNocm9taXVtLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0Ny
b3NzUHJvY2Vzc0ZvbnRMb2FkaW5nLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0Nyb3NzUHJvY2Vzc0ZvbnRMb2FkaW5nLm1tJywKKyAgICAgICAgICAgICdwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9EcmF3aW5nQnVmZmVyQ2hyb21pdW0uY3BwJywKKyAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9FeHRlbnNpb25zM0RDaHJvbWl1bS5o
JywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250Q2FjaGVDaHJv
bWl1bVdpbi5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0Zv
bnRDYWNoZUxpbnV4LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vRm9udENocm9taXVtV2luLmNwcCcsCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4LmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjFiNmYwOTQxNDQxYmU1NzZkZjEyODUyNGU4NTQ4YjQ0OTQ1NDdmMGQKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBs
ZXhUZXh0Q29udHJvbGxlckxpbnV4LmNwcApAQCAtMCwwICsxLDQyNSBAQAorLyoKKyAqIENvcHly
aWdodCAoYykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRp
b24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMg
SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisg
KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJDb21wbGV4VGV4dENvbnRyb2xsZXJMaW51eC5oIgorCisjaW5jbHVk
ZSA8dW5pY29kZS9ub3JtbHpyLmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y2hhci5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKKy8vIEhhcmZidXp6IHVzZXMgMjYuNiBmaXhlZCBwb2ludCB2YWx1
ZXMgZm9yIHBpeGVsIG9mZnNldHMuIEhvd2V2ZXIsIHdlIGRvbid0CisvLyBoYW5kbGUgc3VicGl4
ZWwgcG9zaXRpb25pbmcgc28gdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRydW5jYXRlIEhhcmZi
dXp6CisvLyB2YWx1ZXMgdG8gYSBudW1iZXIgb2YgcGl4ZWxzLgorc3RhdGljIGludCB0cnVuY2F0
ZUZpeGVkUG9pbnRUb0ludGVnZXIoSEJfRml4ZWQgdmFsdWUpCit7CisgICAgcmV0dXJuIHZhbHVl
ID4+IDY7Cit9CisKK0NvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRDb250cm9sbGVy
KGNvbnN0IFRleHRSdW4mIHJ1biwgdW5zaWduZWQgc3RhcnRpbmdYLCBjb25zdCBGb250KiBmb250
KQorICAgIDogbV9mb250KGZvbnQpCisgICAgLCBtX3N0YXJ0aW5nWChzdGFydGluZ1gpCisgICAg
LCBtX29mZnNldFgobV9zdGFydGluZ1gpCisgICAgLCBtX3J1bihnZXROb3JtYWxpemVkVGV4dFJ1
bihydW4sIG1fbm9ybWFsaXplZFJ1biwgbV9ub3JtYWxpemVkQnVmZmVyKSkKKyAgICAsIG1faXRl
cmF0ZUJhY2t3YXJkcyhtX3J1bi5ydGwoKSkKKyAgICAsIG1fd29yZFNwYWNpbmdBZGp1c3RtZW50
KDApCisgICAgLCBtX3BhZGRpbmcoMCkKKyAgICAsIG1fcGFkUGVyV29yZEJyZWFrKDApCisgICAg
LCBtX3BhZEVycm9yKDApCisgICAgLCBtX2xldHRlclNwYWNpbmcoMCkKK3sKKyAgICAvLyBEbyBu
b3QgdXNlIHxydW58IGluc2lkZSB0aGlzIGNvbnN0cnVjdG9yLiBVc2UgfG1fcnVufCBpbnN0ZWFk
LgorCisgICAgbWVtc2V0KCZtX2l0ZW0sIDAsIHNpemVvZihtX2l0ZW0pKTsKKyAgICAvLyBXZSBj
YW5ub3Qga25vdywgYWhlYWQgb2YgdGltZSwgaG93IG1hbnkgZ2x5cGhzIGEgZ2l2ZW4gc2NyaXB0
IHJ1bgorICAgIC8vIHdpbGwgcHJvZHVjZS4gV2UgdGFrZSBhIGd1ZXNzIHRoYXQgc2NyaXB0IHJ1
bnMgd2lsbCBub3QgcHJvZHVjZSBtb3JlCisgICAgLy8gdGhhbiB0d2ljZSBhcyBtYW55IGdseXBo
cyBhcyB0aGVyZSBhcmUgY29kZSBwb2ludHMgcGx1cyBhIGJpdCBvZgorICAgIC8vIHBhZGRpbmcg
YW5kIGZhbGxiYWNrIGlmIHdlIGZpbmQgdGhhdCB3ZSBhcmUgd3JvbmcuCisgICAgY3JlYXRlR2x5
cGhBcnJheXMoKG1fcnVuLmxlbmd0aCgpICsgMikgKiAyKTsKKworICAgIG1faXRlbS5sb2dfY2x1
c3RlcnMgPSBuZXcgdW5zaWduZWQgc2hvcnRbbV9ydW4ubGVuZ3RoKCldOworCisgICAgbV9pdGVt
LmZhY2UgPSAwOworICAgIG1faXRlbS5mb250ID0gYWxsb2NIYXJmYnV6ekZvbnQoKTsKKworICAg
IG1faXRlbS5pdGVtLmJpZGlMZXZlbCA9IG1fcnVuLnJ0bCgpOworCisgICAgbV9pdGVtLnN0cmlu
ZyA9IG1fcnVuLmNoYXJhY3RlcnMoKTsKKyAgICBtX2l0ZW0uc3RyaW5nTGVuZ3RoID0gbV9ydW4u
bGVuZ3RoKCk7CisKKyAgICByZXNldCgpOworfQorCitDb21wbGV4VGV4dENvbnRyb2xsZXI6On5D
b21wbGV4VGV4dENvbnRyb2xsZXIoKQoreworICAgIGZhc3RGcmVlKG1faXRlbS5mb250KTsKKyAg
ICBkZWxldGVHbHlwaEFycmF5cygpOworICAgIGRlbGV0ZVtdIG1faXRlbS5sb2dfY2x1c3RlcnM7
Cit9CisKK2Jvb2wgQ29tcGxleFRleHRDb250cm9sbGVyOjppc1dvcmRCcmVhayh1bnNpZ25lZCBp
bmRleCkKK3sKKyAgICByZXR1cm4gaW5kZXggJiYgaXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3Ry
aW5nW2luZGV4XSkgJiYgIWlzQ29kZXBvaW50U3BhY2UobV9pdGVtLnN0cmluZ1tpbmRleCAtIDFd
KTsKK30KKworaW50IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6ZGV0ZXJtaW5lV29yZEJyZWFrU3Bh
Y2luZyh1bnNpZ25lZCBsb2dDbHVzdGVyc0luZGV4KQoreworICAgIGludCB3b3JkQnJlYWtTcGFj
aW5nID0gMDsKKyAgICAvLyBUaGUgZmlyc3QgaGFsZiBvZiB0aGUgY29uanVuY3Rpb24gd29ya3Mg
YXJvdW5kIHRoZSBjYXNlIHdoZXJlCisgICAgLy8gb3V0cHV0IGdseXBocyBhcmVuJ3QgYXNzb2Np
YXRlZCB3aXRoIGFueSBjb2RlcG9pbnRzIGJ5IHRoZQorICAgIC8vIGNsdXN0ZXJzIGxvZy4KKyAg
ICBpZiAobG9nQ2x1c3RlcnNJbmRleCA8IG1faXRlbS5pdGVtLmxlbmd0aAorICAgICAgICAmJiBp
c1dvcmRCcmVhayhtX2l0ZW0uaXRlbS5wb3MgKyBsb2dDbHVzdGVyc0luZGV4KSkgeworICAgICAg
ICB3b3JkQnJlYWtTcGFjaW5nID0gbV93b3JkU3BhY2luZ0FkanVzdG1lbnQ7CisKKyAgICAgICAg
aWYgKG1fcGFkZGluZyA+IDApIHsKKyAgICAgICAgICAgIGludCB0b1BhZCA9IHJvdW5kZihtX3Bh
ZFBlcldvcmRCcmVhayArIG1fcGFkRXJyb3IpOworICAgICAgICAgICAgbV9wYWRFcnJvciArPSBt
X3BhZFBlcldvcmRCcmVhayAtIHRvUGFkOworCisgICAgICAgICAgICBpZiAobV9wYWRkaW5nIDwg
dG9QYWQpCisgICAgICAgICAgICAgICAgdG9QYWQgPSBtX3BhZGRpbmc7CisgICAgICAgICAgICBt
X3BhZGRpbmcgLT0gdG9QYWQ7CisgICAgICAgICAgICB3b3JkQnJlYWtTcGFjaW5nICs9IHRvUGFk
OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB3b3JkQnJlYWtTcGFjaW5nOworfQorCisv
LyBzZXRQYWRkaW5nIHNldHMgYSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGRpc3RyaWJ1dGVkIGFj
cm9zcyB0aGUgVGV4dFJ1bi4KKy8vIFdlYktpdCB1c2VzIHRoaXMgdG8ganVzdGlmeSB0ZXh0Lgor
dm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNldFBhZGRpbmcoaW50IHBhZGRpbmcpCit7Cisg
ICAgbV9wYWRkaW5nID0gcGFkZGluZzsKKyAgICBpZiAoIW1fcGFkZGluZykKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gSWYgd2UgaGF2ZSBwYWRkaW5nIHRvIGRpc3RyaWJ1dGUsIHRoZW4gd2Ug
dHJ5IHRvIGdpdmUgYW4gZXF1YWwKKyAgICAvLyBhbW91bnQgdG8gZWFjaCBzcGFjZS4gVGhlIGxh
c3Qgc3BhY2UgZ2V0cyB0aGUgc21hbGxlciBhbW91bnQsIGlmCisgICAgLy8gYW55LgorICAgIHVu
c2lnbmVkIG51bVdvcmRCcmVha3MgPSAwOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG1faXRlbS5zdHJpbmdMZW5ndGg7IGkrKykgeworICAgICAgICBpZiAoaXNXb3JkQnJlYWsoaSkp
CisgICAgICAgICAgICBudW1Xb3JkQnJlYWtzKys7CisgICAgfQorCisgICAgaWYgKG51bVdvcmRC
cmVha3MpCisgICAgICAgIG1fcGFkUGVyV29yZEJyZWFrID0gbV9wYWRkaW5nIC8gbnVtV29yZEJy
ZWFrczsKKyAgICBlbHNlCisgICAgICAgIG1fcGFkUGVyV29yZEJyZWFrID0gMDsKK30KKwordm9p
ZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnJlc2V0KCkKK3sKKyAgICBpZiAobV9pdGVyYXRlQmFj
a3dhcmRzKQorICAgICAgICBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gbV9ydW4ubGVuZ3RoKCkg
LSAxOworICAgIGVsc2UKKyAgICAgICAgbV9pbmRleE9mTmV4dFNjcmlwdFJ1biA9IDA7CisgICAg
bV9vZmZzZXRYID0gbV9zdGFydGluZ1g7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVy
OjpzZXRCYWNrd2FyZHNJdGVyYXRpb24oYm9vbCBpc0JhY2t3YXJkcykKK3sKKyAgICBtX2l0ZXJh
dGVCYWNrd2FyZHMgPSBpc0JhY2t3YXJkczsKKyAgICByZXNldCgpOworfQorCisvLyBBZHZhbmNl
IHRvIHRoZSBuZXh0IHNjcmlwdCBydW4sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQgb2Yg
dGhlCisvLyBUZXh0UnVuIGhhcyBiZWVuIHJlYWNoZWQuCitib29sIENvbXBsZXhUZXh0Q29udHJv
bGxlcjo6bmV4dFNjcmlwdFJ1bigpCit7CisgICAgaWYgKG1faXRlcmF0ZUJhY2t3YXJkcykgewor
ICAgICAgICAvLyBJbiByaWdodC10by1sZWZ0IG1vZGUgd2UgbmVlZCB0byByZW5kZXIgdGhlIHNo
YXBlZCBnbHlwaCBiYWNrd2FyZHMgYW5kCisgICAgICAgIC8vIGFsc28gcmVuZGVyIHRoZSBzY3Jp
cHQgcnVucyB0aGVtc2VsdmVzIGJhY2t3YXJkcy4gU28gZ2l2ZW4gYSBUZXh0UnVuOgorICAgICAg
ICAvLyAgICBBQUFBQUFBQ1RUVFRUVFQgICAoQSA9IEFyYWJpYywgQyA9IENvbW1vbiwgVCA9IFRo
YWkpCisgICAgICAgIC8vIHdlIHJlbmRlcjoKKyAgICAgICAgLy8gICAgVFRUVFRUQ0FBQUFBQUEK
KyAgICAgICAgLy8gKGFuZCB0aGUgZ2x5cGhzIGluIGVhY2ggQSwgQyBhbmQgVCBzZWN0aW9uIGFy
ZSBiYWNrd2FyZHMgdG9vKQorICAgICAgICBpZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fcHJldigm
bV9udW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4u
bGVuZ3RoKCksICZtX2luZGV4T2ZOZXh0U2NyaXB0UnVuKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgbV9jdXJyZW50Rm9udERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZvckNo
YXJhY3RlcihtX2l0ZW0uc3RyaW5nW21faXRlbS5pdGVtLnBvc10sIGZhbHNlKS5mb250RGF0YTsK
KyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWhiX3V0ZjE2X3NjcmlwdF9ydW5fbmV4dCgmbV9u
dW1Db2RlUG9pbnRzLCAmbV9pdGVtLml0ZW0sIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVu
Z3RoKCksICZtX2luZGV4T2ZOZXh0U2NyaXB0UnVuKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICAvLyBJdCBpcyBhY3R1YWxseSB3cm9uZyB0byBjb25zaWRlciBzY3JpcHQg
cnVucyBhdCBhbGwgaW4gdGhpcyBjb2RlLgorICAgICAgICAvLyBPdGhlciBXZWJLaXQgY29kZSAo
ZS5nLiBNYWMpIHNlZ21lbnRzIGNvbXBsZXggdGV4dCBqdXN0IGJ5IGZpbmRpbmcKKyAgICAgICAg
Ly8gdGhlIGxvbmdlc3Qgc3BhbiBvZiB0ZXh0IGNvdmVyZWQgYnkgYSBzaW5nbGUgZm9udC4KKyAg
ICAgICAgLy8gQnV0IHdlIGN1cnJlbnRseSBuZWVkIHRvIGNhbGwgaGJfdXRmMTZfc2NyaXB0X3J1
bl9uZXh0IGFueXdheSB0byBmaWxsCisgICAgICAgIC8vIGluIHRoZSBoYXJmYnV6eiBkYXRhIHN0
cnVjdHVyZXMgdG8gZS5nLiBwaWNrIHRoZSBjb3JyZWN0IHNjcmlwdCdzIHNoYXBlci4KKyAgICAg
ICAgLy8gU28gd2UgYWxsb3cgdGhhdCB0byBydW4gZmlyc3QsIHRoZW4gZG8gYSBzZWNvbmQgcGFz
cyBvdmVyIHRoZSByYW5nZSBpdAorICAgICAgICAvLyBmb3VuZCBhbmQgdGFrZSB0aGUgbGFyZ2Vz
dCBzdWJyZWdpb24gdGhhdCBzdGF5cyB3aXRoaW4gYSBzaW5nbGUgZm9udC4KKyAgICAgICAgbV9j
dXJyZW50Rm9udERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZvckNoYXJhY3RlcihtX2l0ZW0uc3Ry
aW5nW21faXRlbS5pdGVtLnBvc10sIGZhbHNlKS5mb250RGF0YTsKKyAgICAgICAgdW5zaWduZWQg
ZW5kT2ZSdW47CisgICAgICAgIGZvciAoZW5kT2ZSdW4gPSAxOyBlbmRPZlJ1biA8IG1faXRlbS5p
dGVtLmxlbmd0aDsgKytlbmRPZlJ1bikgeworICAgICAgICAgICAgY29uc3QgU2ltcGxlRm9udERh
dGEqIG5leHRGb250RGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKG1faXRlbS5z
dHJpbmdbbV9pdGVtLml0ZW0ucG9zICsgZW5kT2ZSdW5dLCBmYWxzZSkuZm9udERhdGE7CisgICAg
ICAgICAgICBpZiAobmV4dEZvbnREYXRhICE9IG1fY3VycmVudEZvbnREYXRhKQorICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1faXRlbS5pdGVtLmxlbmd0aCA9IGVu
ZE9mUnVuOworICAgICAgICBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gbV9pdGVtLml0ZW0ucG9z
ICsgZW5kT2ZSdW47CisgICAgfQorCisgICAgc2V0dXBGb250Rm9yU2NyaXB0UnVuKCk7CisgICAg
c2hhcGVHbHlwaHMoKTsKKyAgICBzZXRHbHlwaFhQb3NpdGlvbnMocnRsKCkpOworCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Zsb2F0IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6d2lkdGhPZkZ1bGxS
dW4oKQoreworICAgIGZsb2F0IHdpZHRoU3VtID0gMDsKKyAgICB3aGlsZSAobmV4dFNjcmlwdFJ1
bigpKQorICAgICAgICB3aWR0aFN1bSArPSB3aWR0aCgpOworCisgICAgcmV0dXJuIHdpZHRoU3Vt
OworfQorCit2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2V0dXBGb250Rm9yU2NyaXB0UnVu
KCkKK3sKKyAgICBjb25zdCBGb250RGF0YSogZm9udERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZv
ckNoYXJhY3RlcihtX2l0ZW0uc3RyaW5nW21faXRlbS5pdGVtLnBvc10sIGZhbHNlKS5mb250RGF0
YTsKKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250RGF0YS0+
Zm9udERhdGFGb3JDaGFyYWN0ZXIoJyAnKS0+cGxhdGZvcm1EYXRhKCk7CisgICAgbV9pdGVtLmZh
Y2UgPSBwbGF0Zm9ybURhdGEuaGFyZmJ1enpGYWNlKCk7CisgICAgdm9pZCogb3BhcXVlUGxhdGZv
cm1EYXRhID0gY29uc3RfY2FzdDxGb250UGxhdGZvcm1EYXRhKj4oJnBsYXRmb3JtRGF0YSk7Cisg
ICAgbV9pdGVtLmZvbnQtPnVzZXJEYXRhID0gb3BhcXVlUGxhdGZvcm1EYXRhOworfQorCitIQl9G
b250UmVjKiBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmFsbG9jSGFyZmJ1enpGb250KCkKK3sKKyAg
ICBIQl9Gb250UmVjKiBmb250ID0gcmVpbnRlcnByZXRfY2FzdDxIQl9Gb250UmVjKj4oZmFzdE1h
bGxvYyhzaXplb2YoSEJfRm9udFJlYykpKTsKKyAgICBtZW1zZXQoZm9udCwgMCwgc2l6ZW9mKEhC
X0ZvbnRSZWMpKTsKKyAgICBmb250LT5rbGFzcyA9ICZoYXJmYnV6elNraWFDbGFzczsKKyAgICBm
b250LT51c2VyRGF0YSA9IDA7CisgICAgLy8gVGhlIHZhbHVlcyB3aGljaCBoYXJmYnV6elNraWFD
bGFzcyByZXR1cm5zIGFyZSBhbHJlYWR5IHNjYWxlZCB0bworICAgIC8vIHBpeGVsIHVuaXRzLCBz
byB3ZSBqdXN0IHNldCBhbGwgdGhlc2UgdG8gb25lIHRvIGRpc2FibGUgZnVydGhlcgorICAgIC8v
IHNjYWxpbmcuCisgICAgZm9udC0+eF9wcGVtID0gMTsKKyAgICBmb250LT55X3BwZW0gPSAxOwor
ICAgIGZvbnQtPnhfc2NhbGUgPSAxOworICAgIGZvbnQtPnlfc2NhbGUgPSAxOworCisgICAgcmV0
dXJuIGZvbnQ7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpkZWxldGVHbHlwaEFy
cmF5cygpCit7CisgICAgZGVsZXRlW10gbV9pdGVtLmdseXBoczsKKyAgICBkZWxldGVbXSBtX2l0
ZW0uYXR0cmlidXRlczsKKyAgICBkZWxldGVbXSBtX2l0ZW0uYWR2YW5jZXM7CisgICAgZGVsZXRl
W10gbV9pdGVtLm9mZnNldHM7CisgICAgZGVsZXRlW10gbV9nbHlwaHMxNjsKKyAgICBkZWxldGVb
XSBtX3hQb3NpdGlvbnM7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpjcmVhdGVH
bHlwaEFycmF5cyhpbnQgc2l6ZSkKK3sKKyAgICBtX2l0ZW0uZ2x5cGhzID0gbmV3IEhCX0dseXBo
W3NpemVdOworICAgIG1faXRlbS5hdHRyaWJ1dGVzID0gbmV3IEhCX0dseXBoQXR0cmlidXRlc1tz
aXplXTsKKyAgICBtX2l0ZW0uYWR2YW5jZXMgPSBuZXcgSEJfRml4ZWRbc2l6ZV07CisgICAgbV9p
dGVtLm9mZnNldHMgPSBuZXcgSEJfRml4ZWRQb2ludFtzaXplXTsKKworICAgIG1fZ2x5cGhzMTYg
PSBuZXcgdWludDE2X3Rbc2l6ZV07CisgICAgbV94UG9zaXRpb25zID0gbmV3IFNrU2NhbGFyW3Np
emVdOworCisgICAgbV9pdGVtLm51bV9nbHlwaHMgPSBzaXplOworICAgIG1fZ2x5cGhzQXJyYXlD
YXBhY2l0eSA9IHNpemU7IC8vIFNhdmUgdGhlIEdseXBoQXJyYXlzIHNpemUuCisgICAgcmVzZXRH
bHlwaEFycmF5cygpOworfQorCit2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6cmVzZXRHbHlw
aEFycmF5cygpCit7CisgICAgaW50IHNpemUgPSBtX2l0ZW0ubnVtX2dseXBoczsKKyAgICAvLyBB
bGwgdGhlIHR5cGVzIGhlcmUgZG9uJ3QgaGF2ZSBwb2ludGVycy4gSXQgaXMgc2FmZSB0byByZXNl
dCB0bworICAgIC8vIHplcm8gdW5sZXNzIEhhcmZidXp6IGJyZWFrcyB0aGUgY29tcGF0aWJpbGl0
eSBpbiB0aGUgZnV0dXJlLgorICAgIG1lbXNldChtX2l0ZW0uZ2x5cGhzLCAwLCBzaXplICogc2l6
ZW9mKEhCX0dseXBoKSk7CisgICAgbWVtc2V0KG1faXRlbS5hdHRyaWJ1dGVzLCAwLCBzaXplICog
c2l6ZW9mKEhCX0dseXBoQXR0cmlidXRlcykpOworICAgIG1lbXNldChtX2l0ZW0uYWR2YW5jZXMs
IDAsIHNpemUgKiBzaXplb2YoSEJfRml4ZWQpKTsKKyAgICBtZW1zZXQobV9pdGVtLm9mZnNldHMs
IDAsIHNpemUgKiBzaXplb2YoSEJfRml4ZWRQb2ludCkpOworICAgIG1lbXNldChtX2dseXBoczE2
LCAwLCBzaXplICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgbWVtc2V0KG1feFBvc2l0aW9ucywg
MCwgc2l6ZSAqIHNpemVvZihTa1NjYWxhcikpOworfQorCit2b2lkIENvbXBsZXhUZXh0Q29udHJv
bGxlcjo6c2hhcGVHbHlwaHMoKQoreworICAgIC8vIEhCX1NoYXBlSXRlbSgpIHJlc2V0cyBtX2l0
ZW0ubnVtX2dseXBocy4gSWYgdGhlIHByZXZpb3VzIGNhbGwgdG8KKyAgICAvLyBIQl9TaGFwZUl0
ZW0oKSB1c2VkIGxlc3Mgc3BhY2UgdGhhbiB3YXMgYXZhaWxhYmxlLCB0aGUgY2FwYWNpdHkgb2YK
KyAgICAvLyB0aGUgYXJyYXkgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9m
IG1faXRlbS5udW1fZ2x5cGhzLiAKKyAgICAvLyBTbywgd2UgbmVlZCB0byByZXNldCB0aGUgbnVt
X2dseXBocyB0byB0aGUgY2FwYWNpdHkgb2YgdGhlIGFycmF5LgorICAgIG1faXRlbS5udW1fZ2x5
cGhzID0gbV9nbHlwaHNBcnJheUNhcGFjaXR5OworICAgIHJlc2V0R2x5cGhBcnJheXMoKTsKKyAg
ICB3aGlsZSAoIUhCX1NoYXBlSXRlbSgmbV9pdGVtKSkgeworICAgICAgICAvLyBXZSBvdmVyZmxv
d2VkIG91ciBhcnJheXMuIFJlc2l6ZSBhbmQgcmV0cnkuCisgICAgICAgIC8vIEhCX1NoYXBlSXRl
bSBmaWxscyBpbiBtX2l0ZW0ubnVtX2dseXBocyB3aXRoIHRoZSBuZWVkZWQgc2l6ZS4KKyAgICAg
ICAgZGVsZXRlR2x5cGhBcnJheXMoKTsKKyAgICAgICAgLy8gVGhlIHwrIDF8IGhlcmUgaXMgYSB3
b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBIYXJmYnV6ejogdGhlIEtobWVyCisgICAgICAgIC8vIHNo
YXBlciAoYXQgbGVhc3QpIGNhbiBmYWlsIGJlY2F1c2Ugb2YgaW5zdWZmaWNpZW50IGdseXBoIGJ1
ZmZlcnMKKyAgICAgICAgLy8gYW5kIHJlcXVlc3QgMCBhZGRpdGlvbmFsIGdseXBoczogdGhyb3dp
bmcgdXMgaW50byBhbiBpbmZpbml0ZQorICAgICAgICAvLyBsb29wLgorICAgICAgICBjcmVhdGVH
bHlwaEFycmF5cyhtX2l0ZW0ubnVtX2dseXBocyArIDEpOworICAgIH0KK30KKwordm9pZCBDb21w
bGV4VGV4dENvbnRyb2xsZXI6OnNldEdseXBoWFBvc2l0aW9ucyhib29sIGlzUlRMKQoreworICAg
IGRvdWJsZSBwb3NpdGlvbiA9IDA7CisgICAgLy8gbG9nQ2x1c3RlcnNJbmRleCBpbmRleGVzIGxv
Z0NsdXN0ZXJzIGZvciB0aGUgZmlyc3QgKG9yIGxhc3Qgd2hlbgorICAgIC8vIFJUTCkgY29kZXBv
aW50IG9mIHRoZSBjdXJyZW50IGdseXBoLiAgRWFjaCB0aW1lIHdlIGFkdmFuY2UgYSBnbHlwaCwK
KyAgICAvLyB3ZSBza2lwIG92ZXIgYWxsIHRoZSBjb2RlcG9pbnRzIHRoYXQgY29udHJpYnV0ZWQg
dG8gdGhlIGN1cnJlbnQKKyAgICAvLyBnbHlwaC4KKyAgICBpbnQgbG9nQ2x1c3RlcnNJbmRleCA9
IDA7CisKKyAgICBpZiAoaXNSVEwpIHsKKyAgICAgICAgbG9nQ2x1c3RlcnNJbmRleCA9IG1faXRl
bS5udW1fZ2x5cGhzIC0gMTsKKworICAgICAgICAvLyBHbHlwaHMgYXJlIHN0b3JlZCBpbiBsb2dp
Y2FsIG9yZGVyLCBidXQgZm9yIGxheW91dCBwdXJwb3NlcyB3ZQorICAgICAgICAvLyBhbHdheXMg
Z28gbGVmdCB0byByaWdodC4KKyAgICAgICAgZm9yIChpbnQgaSA9IG1faXRlbS5udW1fZ2x5cGhz
IC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIGlmICghbV9jdXJyZW50Rm9udERhdGEt
PmlzWmVyb1dpZHRoU3BhY2VHbHlwaChtX2dseXBoczE2W2ldKSkgeworICAgICAgICAgICAgICAg
IC8vIFdoaXRlc3BhY2UgbXVzdCBiZSBsYWlkIG91dCBpbiBsb2dpY2FsIG9yZGVyLCBzbyB3aGVu
IGluc2VydGluZworICAgICAgICAgICAgICAgIC8vIHNwYWNlcyBpbiBSVEwgKGJ1dCBpdGVyYXRp
bmcgaW4gTFRSIG9yZGVyKSB3ZSBtdXN0IGluc2VydCBzcGFjZXMKKyAgICAgICAgICAgICAgICAv
LyBfYmVmb3JlXyB0aGUgbmV4dCBnbHlwaC4KKyAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KGkgKyAxKSA+PSBtX2l0ZW0ubnVtX2dseXBocyB8fCBtX2l0ZW0uYXR0cmli
dXRlc1tpICsgMV0uY2x1c3RlclN0YXJ0KQorICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiAr
PSBtX2xldHRlclNwYWNpbmc7CisKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBkZXRlcm1p
bmVXb3JkQnJlYWtTcGFjaW5nKGxvZ0NsdXN0ZXJzSW5kZXgpOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBtX2dseXBoczE2W2ldID0gbV9pdGVtLmdseXBoc1tpXTsKKyAgICAgICAgICAg
IGRvdWJsZSBvZmZzZXRYID0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1faXRlbS5vZmZz
ZXRzW2ldLngpOworICAgICAgICAgICAgbV94UG9zaXRpb25zW2ldID0gbV9vZmZzZXRYICsgcG9z
aXRpb24gKyBvZmZzZXRYOworCisgICAgICAgICAgICB3aGlsZSAobG9nQ2x1c3RlcnNJbmRleCA+
IDAgJiYgbG9nQ2x1c3RlcnMoKVtsb2dDbHVzdGVyc0luZGV4XSA9PSBpKQorICAgICAgICAgICAg
ICAgIGxvZ0NsdXN0ZXJzSW5kZXgtLTsKKworICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRGb250
RGF0YS0+aXNaZXJvV2lkdGhTcGFjZUdseXBoKG1fZ2x5cGhzMTZbaV0pKQorICAgICAgICAgICAg
ICAgIHBvc2l0aW9uICs9IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihtX2l0ZW0uYWR2YW5j
ZXNbaV0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBtX2l0ZW0ubnVtX2dseXBoczsgKytpKSB7CisgICAgICAgICAgICBtX2dseXBoczE2
W2ldID0gbV9pdGVtLmdseXBoc1tpXTsKKyAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gdHJ1
bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1faXRlbS5vZmZzZXRzW2ldLngpOworICAgICAgICAg
ICAgbV94UG9zaXRpb25zW2ldID0gbV9vZmZzZXRYICsgcG9zaXRpb24gKyBvZmZzZXRYOworCisg
ICAgICAgICAgICBpZiAobV9jdXJyZW50Rm9udERhdGEtPmlzWmVyb1dpZHRoU3BhY2VHbHlwaCht
X2dseXBoczE2W2ldKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAg
ZG91YmxlIGFkdmFuY2UgPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLmFkdmFu
Y2VzW2ldKTsKKworICAgICAgICAgICAgYWR2YW5jZSArPSBkZXRlcm1pbmVXb3JkQnJlYWtTcGFj
aW5nKGxvZ0NsdXN0ZXJzSW5kZXgpOworCisgICAgICAgICAgICBpZiAobV9pdGVtLmF0dHJpYnV0
ZXNbaV0uY2x1c3RlclN0YXJ0KQorICAgICAgICAgICAgICAgIGFkdmFuY2UgKz0gbV9sZXR0ZXJT
cGFjaW5nOworCisgICAgICAgICAgICB3aGlsZSAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxvZ0Ns
dXN0ZXJzSW5kZXgpIDwgbV9pdGVtLml0ZW0ubGVuZ3RoICYmIGxvZ0NsdXN0ZXJzKClbbG9nQ2x1
c3RlcnNJbmRleF0gPT0gaSkKKyAgICAgICAgICAgICAgICBsb2dDbHVzdGVyc0luZGV4Kys7CisK
KyAgICAgICAgICAgIHBvc2l0aW9uICs9IGFkdmFuY2U7CisgICAgICAgIH0KKyAgICB9CisgICAg
bV9waXhlbFdpZHRoID0gc3RkOjptYXgocG9zaXRpb24sIDAuMCk7CisgICAgbV9vZmZzZXRYICs9
IG1fcGl4ZWxXaWR0aDsKK30KKwordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6Om5vcm1hbGl6
ZVNwYWNlc0FuZE1pcnJvckNoYXJzKGNvbnN0IFVDaGFyKiBzb3VyY2UsIGJvb2wgcnRsLCBVQ2hh
ciogZGVzdGluYXRpb24sIGludCBsZW5ndGgpCit7CisgICAgaW50IHBvc2l0aW9uID0gMDsKKyAg
ICBib29sIGVycm9yID0gZmFsc2U7CisgICAgLy8gSXRlcmF0ZSBjaGFyYWN0ZXJzIGluIHNvdXJj
ZSBhbmQgbWlycm9yIGNoYXJhY3RlciBpZiBuZWVkZWQuCisgICAgd2hpbGUgKHBvc2l0aW9uIDwg
bGVuZ3RoKSB7CisgICAgICAgIFVDaGFyMzIgY2hhcmFjdGVyOworICAgICAgICBpbnQgbmV4dFBv
c2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIFUxNl9ORVhUKHNvdXJjZSwgbmV4dFBvc2l0aW9u
LCBsZW5ndGgsIGNoYXJhY3Rlcik7CisgICAgICAgIGlmIChGb250Ojp0cmVhdEFzU3BhY2UoY2hh
cmFjdGVyKSkKKyAgICAgICAgICAgIGNoYXJhY3RlciA9ICcgJzsKKyAgICAgICAgZWxzZSBpZiAo
Rm9udDo6dHJlYXRBc1plcm9XaWR0aFNwYWNlKGNoYXJhY3RlcikpCisgICAgICAgICAgICBjaGFy
YWN0ZXIgPSB6ZXJvV2lkdGhTcGFjZTsKKyAgICAgICAgZWxzZSBpZiAocnRsKQorICAgICAgICAg
ICAgY2hhcmFjdGVyID0gdV9jaGFyTWlycm9yKGNoYXJhY3Rlcik7CisgICAgICAgIFUxNl9BUFBF
TkQoZGVzdGluYXRpb24sIHBvc2l0aW9uLCBsZW5ndGgsIGNoYXJhY3RlciwgZXJyb3IpOworICAg
ICAgICBBU1NFUlQoIWVycm9yKTsKKyAgICAgICAgcG9zaXRpb24gPSBuZXh0UG9zaXRpb247Cisg
ICAgfQorfQorCitjb25zdCBUZXh0UnVuJiBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdldE5vcm1h
bGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9yaWdpbmFsUnVuLCBPd25QdHI8VGV4dFJ1bj4m
IG5vcm1hbGl6ZWRSdW4sIE93bkFycmF5UHRyPFVDaGFyPiYgbm9ybWFsaXplZEJ1ZmZlcikKK3sK
KyAgICAvLyBOb3JtYWxpemUgdGhlIHRleHQgcnVuIGluIHRocmVlIHdheXM6CisgICAgLy8gMSkg
Q29udmVydCB0aGUgfG9yaWdpbmFsUnVufCB0byBORkMgbm9ybWFsaXplZCBmb3JtIGlmIGNvbWJp
bmluZyBkaWFjcml0aWNhbCBtYXJrcworICAgIC8vIChVKzAzMDAuLikgYXJlIHVzZWQgaW4gdGhl
IHJ1bi4gVGhpcyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSBzaW5jZSBtb3N0IE9wZW5UeXBlCisg
ICAgLy8gZm9udHMgKGUuZy4sIEFyaWFsKSBkb24ndCBoYXZlIHN1YnN0aXR1dGlvbiBydWxlcyBm
b3IgdGhlIGRpYWNyaXRpY2FsIG1hcmtzIGluCisgICAgLy8gdGhlaXIgR1NVQiB0YWJsZXMuCisg
ICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBpY3U6Ok5vcm1hbGl6ZXI6
OmlzTm9ybWFsaXplZChVTk9STV9ORkMpIEFQSSBoZXJlIHNpbmNlCisgICAgLy8gdGhlIEFQSSBy
ZXR1cm5zIEZBTFNFICg9IG5vdCBub3JtYWxpemVkKSBmb3IgY29tcGxleCBydW5zIHRoYXQgZG9u
J3QgcmVxdWlyZSBORkMKKyAgICAvLyBub3JtYWxpemF0aW9uIChlLmcuLCBBcmFiaWMgdGV4dCku
IFVubGVzcyB0aGUgcnVuIGNvbnRhaW5zIHRoZSBkaWFjcml0aWNhbCBtYXJrcywKKyAgICAvLyBI
YXJmYnV6eiB3aWxsIGRvIHRoZSBzYW1lIHRoaW5nIGZvciB1cyB1c2luZyB0aGUgR1NVQiB0YWJs
ZS4KKyAgICAvLyAyKSBDb252ZXJ0IHNwYWNpbmcgY2hhcmFjdGVycyBpbnRvIHBsYWluIHNwYWNl
cywgYXMgc29tZSBmb250cyB3aWxsIHByb3ZpZGUgZ2x5cGhzCisgICAgLy8gZm9yIGNoYXJhY3Rl
cnMgbGlrZSAnXG4nIG90aGVyd2lzZS4KKyAgICAvLyAzKSBDb252ZXJ0IG1pcnJvcmVkIGNoYXJh
Y3RlcnMgc3VjaCBhcyBwYXJlbnRoZXNpcyBmb3IgcnRsIHRleHQuCisKKyAgICAvLyBDb252ZXJ0
IHRvIE5GQyBmb3JtIGlmIHRoZSB0ZXh0IGhhcyBkaWFjcml0aWNhbCBtYXJrcy4KKyAgICBpY3U6
OlVuaWNvZGVTdHJpbmcgbm9ybWFsaXplZFN0cmluZzsKKyAgICBVRXJyb3JDb2RlIGVycm9yID0g
VV9aRVJPX0VSUk9SOworCisgICAgZm9yIChpbnQxNl90IGkgPSAwOyBpIDwgb3JpZ2luYWxSdW4u
bGVuZ3RoKCk7ICsraSkgeworICAgICAgICBVQ2hhciBjaCA9IG9yaWdpbmFsUnVuW2ldOworICAg
ICAgICBpZiAoOjp1YmxvY2tfZ2V0Q29kZShjaCkgPT0gVUJMT0NLX0NPTUJJTklOR19ESUFDUklU
SUNBTF9NQVJLUykgeworICAgICAgICAgICAgaWN1OjpOb3JtYWxpemVyOjpub3JtYWxpemUoaWN1
OjpVbmljb2RlU3RyaW5nKG9yaWdpbmFsUnVuLmNoYXJhY3RlcnMoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUnVuLmxlbmd0aCgpKSwgVU5PUk1fTkZD
LCAwIC8qIG5vIG9wdGlvbnMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBub3JtYWxpemVkU3RyaW5nLCBlcnJvcik7CisgICAgICAgICAgICBpZiAoVV9GQUlMVVJF
KGVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSdW47CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vcm1hbGl6ZSBzcGFjZSBhbmQg
bWlycm9yIHBhcmVudGhlc2lzIGZvciBydGwgdGV4dC4KKyAgICBpbnQgbm9ybWFsaXplZEJ1ZmZl
ckxlbmd0aDsKKyAgICBjb25zdCBVQ2hhciogc291cmNlVGV4dDsKKyAgICBpZiAobm9ybWFsaXpl
ZFN0cmluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCA9IG9y
aWdpbmFsUnVuLmxlbmd0aCgpOworICAgICAgICBzb3VyY2VUZXh0ID0gb3JpZ2luYWxSdW4uY2hh
cmFjdGVycygpOworICAgIH0gZWxzZSB7CisgICAgICAgIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgg
PSBub3JtYWxpemVkU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBzb3VyY2VUZXh0ID0gbm9ybWFs
aXplZFN0cmluZy5nZXRCdWZmZXIoKTsKKyAgICB9CisKKyAgICBub3JtYWxpemVkQnVmZmVyLnNl
dChuZXcgVUNoYXJbbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCArIDFdKTsKKworICAgIG5vcm1hbGl6
ZVNwYWNlc0FuZE1pcnJvckNoYXJzKHNvdXJjZVRleHQsIG9yaWdpbmFsUnVuLnJ0bCgpLCBub3Jt
YWxpemVkQnVmZmVyLmdldCgpLCBub3JtYWxpemVkQnVmZmVyTGVuZ3RoKTsKKworICAgIG5vcm1h
bGl6ZWRSdW4uc2V0KG5ldyBUZXh0UnVuKG9yaWdpbmFsUnVuKSk7CisgICAgbm9ybWFsaXplZFJ1
bi0+c2V0VGV4dChub3JtYWxpemVkQnVmZmVyLmdldCgpLCBub3JtYWxpemVkQnVmZmVyTGVuZ3Ro
KTsKKyAgICByZXR1cm4gKm5vcm1hbGl6ZWRSdW47Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxl
eFRleHRDb250cm9sbGVyTGludXguaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wMTIwOWYxNjY2MGJh
OTQ1ZmVkOTRhM2JmM2E2ODljY2M4NDJjMjExCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xsZXJMaW51eC5oCkBA
IC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisg
KiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5h
bWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisg
KiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBDb21wbGV4VGV4dENvbnRyb2xsZXJMaW51eF9oCisjZGVm
aW5lIENvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4X2gKKworI2luY2x1ZGUgIkZvbnQuaCIKKyNp
bmNsdWRlICJIYXJmYnV6elNraWEuaCIKKworI2luY2x1ZGUgPHd0Zi9Pd25BcnJheVB0ci5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIENvbXBsZXhUZXh0Q29udHJvbGxlciB3YWxrcyBh
IFRleHRSdW4gYW5kIHByZXNlbnRzIGVhY2ggc2NyaXB0IHJ1biBpbiBzZXF1ZW5jZS4gQQorLy8g
VGV4dFJ1biBpcyBhIHNlcXVlbmNlIG9mIGNvZGUtcG9pbnRzIHdpdGggdGhlIHNhbWUgZW1iZWRk
aW5nIGxldmVsIChpLmUuIHRoZXkKKy8vIGFyZSBhbGwgbGVmdC10by1yaWdodCBvciByaWdodC10
by1sZWZ0KS4gQSBzY3JpcHQgcnVuIGlzIGEgc3Vic2VxdWVuY2Ugd2hlcmUKKy8vIGFsbCB0aGUg
Y2hhcmFjdGVycyBoYXZlIHRoZSBzYW1lIHNjcmlwdCAoZS5nLiBBcmFiaWMsIFRoYWkgZXRjKS4g
U2hhcGluZyBpcworLy8gb25seSBldmVyIGRvbmUgd2l0aCBzY3JpcHQgcnVucyBzaW5jZSB0aGUg
c2hhcGVycyBvbmx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAorLy8gYSBzaW5nbGUgc2NyaXB0Lgor
Ly8KKy8vIEFmdGVyIGNyZWF0aW5nIGl0LCB0aGUgc2NyaXB0IHJ1bnMgYXJlIGVpdGhlciBpdGVy
YXRlZCBiYWNrd2FyZHMgb3IgZm9yd2FyZHMuCisvLyBJdCBkZWZhdWx0cyB0byBiYWNrd2FyZHMg
Zm9yIFJUTCBhbmQgZm9yd2FyZHMgb3RoZXJ3aXNlICh3aGljaCBtYXRjaGVzIHRoZQorLy8gcHJl
c2VudGF0aW9uIG9yZGVyKSwgaG93ZXZlciB5b3UgY2FuIHNldCBpdCB3aXRoIHxzZXRCYWNrd2Fy
ZHNJdGVyYXRpb258LgorLy8KKy8vIE9uY2UgeW91IGhhdmUgc2V0dXAgdGhlIG9iamVjdCwgY2Fs
bCB8bmV4dFNjcmlwdFJ1bnwgdG8gZ2V0IHRoZSBmaXJzdCBzY3JpcHQKKy8vIHJ1bi4gVGhpcyB3
aWxsIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpdGVyYXRpb24gaXMgY29tcGxldGUuIEF0IGFueSB0
aW1lIHlvdQorLy8gY2FuIGNhbGwgfHJlc2V0fCB0byBzdGFydCBvdmVyIGFnYWluLgorY2xhc3Mg
Q29tcGxleFRleHRDb250cm9sbGVyIHsKK3B1YmxpYzoKKyAgICBDb21wbGV4VGV4dENvbnRyb2xs
ZXIoY29uc3QgVGV4dFJ1biYsIHVuc2lnbmVkLCBjb25zdCBGb250Kik7CisgICAgfkNvbXBsZXhU
ZXh0Q29udHJvbGxlcigpOworCisgICAgYm9vbCBpc1dvcmRCcmVhayh1bnNpZ25lZCk7CisgICAg
aW50IGRldGVybWluZVdvcmRCcmVha1NwYWNpbmcodW5zaWduZWQpOworICAgIC8vIHNldFBhZGRp
bmcgc2V0cyBhIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZGlzdHJpYnV0ZWQgYWNyb3NzIHRoZSBU
ZXh0UnVuLgorICAgIC8vIFdlYktpdCB1c2VzIHRoaXMgdG8ganVzdGlmeSB0ZXh0LgorICAgIHZv
aWQgc2V0UGFkZGluZyhpbnQpOworICAgIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHNldEJhY2t3
YXJkc0l0ZXJhdGlvbihib29sKTsKKyAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHNjcmlwdCBy
dW4sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQgb2YgdGhlCisgICAgLy8gVGV4dFJ1biBo
YXMgYmVlbiByZWFjaGVkLgorICAgIGJvb2wgbmV4dFNjcmlwdFJ1bigpOworICAgIGZsb2F0IHdp
ZHRoT2ZGdWxsUnVuKCk7CisKKyAgICAvLyBzZXRXb3JkU3BhY2luZ0FkanVzdG1lbnQgc2V0cyBh
IGRlbHRhIChpbiBwaXhlbHMpIHdoaWNoIGlzIGFwcGxpZWQgYXQKKyAgICAvLyBlYWNoIHdvcmQg
YnJlYWsgaW4gdGhlIFRleHRSdW4uCisgICAgdm9pZCBzZXRXb3JkU3BhY2luZ0FkanVzdG1lbnQo
aW50IHdvcmRTcGFjaW5nQWRqdXN0bWVudCkgeyBtX3dvcmRTcGFjaW5nQWRqdXN0bWVudCA9IHdv
cmRTcGFjaW5nQWRqdXN0bWVudDsgfQorCisgICAgLy8gc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1l
bnQgc2V0cyBhbiBhZGRpdGlvbmFsIG51bWJlciBvZiBwaXhlbHMgdGhhdCBpcworICAgIC8vIGFk
ZGVkIHRvIHRoZSBhZHZhbmNlIGFmdGVyIGVhY2ggb3V0cHV0IGNsdXN0ZXIuIFRoaXMgbWF0Y2hl
cyB0aGUgYmVoYXZpb3VyCisgICAgLy8gb2YgV2lkdGhJdGVyYXRvcjo6YWR2YW5jZS4KKyAgICB2
b2lkIHNldExldHRlclNwYWNpbmdBZGp1c3RtZW50KGludCBsZXR0ZXJTcGFjaW5nQWRqdXN0bWVu
dCkgeyBtX2xldHRlclNwYWNpbmcgPSBsZXR0ZXJTcGFjaW5nQWRqdXN0bWVudDsgfQorICAgIGlu
dCBsZXR0ZXJTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4gbV9sZXR0ZXJTcGFjaW5nOyB9CisKKyAg
ICAvLyBTZXQgdGhlIHggb2Zmc2V0IGZvciB0aGUgbmV4dCBzY3JpcHQgcnVuLiBUaGlzIGFmZmVj
dHMgdGhlIHZhbHVlcyBpbgorICAgIC8vIHx4UG9zaXRpb25zfAorICAgIHZvaWQgc2V0WE9mZnNl
dFRvWmVybygpIHsgbV9vZmZzZXRYID0gMDsgfQorICAgIGJvb2wgcnRsKCkgY29uc3QgeyByZXR1
cm4gbV9ydW4ucnRsKCk7IH0KKyAgICBjb25zdCB1aW50MTZfdCogZ2x5cGhzKCkgY29uc3QgeyBy
ZXR1cm4gbV9nbHlwaHMxNjsgfQorCisgICAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFy
cmF5IHJldHVybmVkIGJ5IHxnbHlwaHN8CisgICAgY29uc3QgdW5zaWduZWQgbGVuZ3RoKCkgY29u
c3QgeyByZXR1cm4gbV9pdGVtLm51bV9nbHlwaHM7IH0KKworICAgIC8vIFJldHVybiB0aGUgeCBv
ZmZzZXQgZm9yIGVhY2ggb2YgdGhlIGdseXBocy4gTm90ZSB0aGF0IHRoaXMgaXMgdHJhbnNsYXRl
ZAorICAgIC8vIGJ5IHRoZSBjdXJyZW50IHggb2Zmc2V0IGFuZCB0aGF0IHRoZSB4IG9mZnNldCBp
cyB1cGRhdGVkIGZvciBlYWNoIHNjcmlwdAorICAgIC8vIHJ1bi4KKyAgICBjb25zdCBTa1NjYWxh
ciogeFBvc2l0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1feFBvc2l0aW9uczsgfQorCisgICAgLy8g
R2V0IHRoZSBhZHZhbmNlcyAod2lkdGhzKSBmb3IgZWFjaCBnbHlwaC4KKyAgICBjb25zdCBIQl9G
aXhlZCogYWR2YW5jZXMoKSBjb25zdCB7IHJldHVybiBtX2l0ZW0uYWR2YW5jZXM7IH0KKworICAg
IC8vIFJldHVybiB0aGUgd2lkdGggKGluIHB4KSBvZiB0aGUgY3VycmVudCBzY3JpcHQgcnVuLgor
ICAgIGNvbnN0IHVuc2lnbmVkIHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9waXhlbFdpZHRoOyB9
CisKKyAgICAvLyBSZXR1cm4gdGhlIGNsdXN0ZXIgbG9nIGZvciB0aGUgY3VycmVudCBzY3JpcHQg
cnVuLiBGb3IgZXhhbXBsZToKKyAgICAvLyAgIHNjcmlwdCBydW46IGYgaSBhIG4gYyDDqSAgKGZp
IGdldHMgbGlnYXR1cmVkKQorICAgIC8vICAgbG9nIGNsdXRyczogMCAwIDEgMiAzIDQKKyAgICAv
LyBTbywgZm9yIGVhY2ggaW5wdXQgY29kZSBwb2ludCwgdGhlIGxvZyB0ZWxscyB5b3Ugd2hpY2gg
b3V0cHV0IGdseXBoIHdhcworICAgIC8vIGdlbmVyYXRlZCBmb3IgaXQuCisgICAgY29uc3QgdW5z
aWduZWQgc2hvcnQqIGxvZ0NsdXN0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9pdGVtLmxvZ19jbHVz
dGVyczsgfQorCisgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gdGhl
IGN1cnJlbnQgc2NyaXB0IHJ1bgorICAgIGNvbnN0IHVuc2lnbmVkIG51bUNvZGVQb2ludHMoKSBj
b25zdCB7IHJldHVybiBtX251bUNvZGVQb2ludHM7IH0KKworICAgIGNvbnN0IEZvbnRQbGF0Zm9y
bURhdGEqIGZvbnRQbGF0Zm9ybURhdGFGb3JTY3JpcHRSdW4oKSB7IHJldHVybiByZWludGVycHJl
dF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPihtX2l0ZW0uZm9udC0+dXNlckRhdGEpOyB9CisKK3By
aXZhdGU6CisgICAgdm9pZCBzZXR1cEZvbnRGb3JTY3JpcHRSdW4oKTsKKyAgICBIQl9Gb250UmVj
KiBhbGxvY0hhcmZidXp6Rm9udCgpOworICAgIHZvaWQgZGVsZXRlR2x5cGhBcnJheXMoKTsKKyAg
ICB2b2lkIGNyZWF0ZUdseXBoQXJyYXlzKGludCk7CisgICAgdm9pZCByZXNldEdseXBoQXJyYXlz
KCk7CisgICAgdm9pZCBzaGFwZUdseXBocygpOworICAgIHZvaWQgc2V0R2x5cGhYUG9zaXRpb25z
KGJvb2wpOworCisgICAgc3RhdGljIHZvaWQgbm9ybWFsaXplU3BhY2VzQW5kTWlycm9yQ2hhcnMo
Y29uc3QgVUNoYXIqIHNvdXJjZSwgYm9vbCBydGwsIFVDaGFyKiBkZXN0aW5hdGlvbiwgaW50IGxl
bmd0aCk7CisgICAgc3RhdGljIGNvbnN0IFRleHRSdW4mIGdldE5vcm1hbGl6ZWRUZXh0UnVuKGNv
bnN0IFRleHRSdW4mIG9yaWdpbmFsUnVuLCBPd25QdHI8VGV4dFJ1bj4mIG5vcm1hbGl6ZWRSdW4s
IE93bkFycmF5UHRyPFVDaGFyPiYgbm9ybWFsaXplZEJ1ZmZlcik7CisKKyAgICAvLyBUaGlzIG1h
dGNoZXMgdGhlIGxvZ2ljIGluIFJlbmRlckJsb2NrOjpmaW5kTmV4dExpbmVCcmVhaworICAgIHN0
YXRpYyBib29sIGlzQ29kZXBvaW50U3BhY2UoSEJfVUNoYXIxNiBjKSB7IHJldHVybiBjID09ICcg
JyB8fCBjID09ICdcdCc7IH0KKworICAgIGNvbnN0IEZvbnQqIGNvbnN0IG1fZm9udDsKKyAgICBj
b25zdCBTaW1wbGVGb250RGF0YSogbV9jdXJyZW50Rm9udERhdGE7CisgICAgSEJfU2hhcGVySXRl
bSBtX2l0ZW07CisgICAgdWludDE2X3QqIG1fZ2x5cGhzMTY7IC8vIEEgdmVjdG9yIG9mIDE2LWJp
dCBnbHlwaCBpZHMuCisgICAgU2tTY2FsYXIqIG1feFBvc2l0aW9uczsgLy8gQSB2ZWN0b3Igb2Yg
eCBwb3NpdGlvbnMgZm9yIGVhY2ggZ2x5cGguCisgICAgc3NpemVfdCBtX2luZGV4T2ZOZXh0U2Ny
aXB0UnVuOyAvLyBJbmRleGVzIHRoZSBzY3JpcHQgcnVuIGluIHxtX3J1bnwuCisgICAgY29uc3Qg
dW5zaWduZWQgbV9zdGFydGluZ1g7IC8vIE9mZnNldCBpbiBwaXhlbHMgb2YgdGhlIGZpcnN0IHNj
cmlwdCBydW4uCisgICAgdW5zaWduZWQgbV9vZmZzZXRYOyAvLyBPZmZzZXQgaW4gcGl4ZWxzIHRv
IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzY3JpcHQgcnVuLgorICAgIHVuc2lnbmVkIG1fcGl4ZWxX
aWR0aDsgLy8gV2lkdGggKGluIHB4KSBvZiB0aGUgY3VycmVudCBzY3JpcHQgcnVuLgorICAgIHVu
c2lnbmVkIG1fbnVtQ29kZVBvaW50czsgLy8gQ29kZSBwb2ludHMgaW4gY3VycmVudCBzY3JpcHQg
cnVuLgorICAgIHVuc2lnbmVkIG1fZ2x5cGhzQXJyYXlDYXBhY2l0eTsgLy8gQ3VycmVudCBzaXpl
IG9mIGFsbCB0aGUgSGFyZmJ1enogYXJyYXlzLgorCisgICAgT3duUHRyPFRleHRSdW4+IG1fbm9y
bWFsaXplZFJ1bjsKKyAgICBPd25BcnJheVB0cjxVQ2hhcj4gbV9ub3JtYWxpemVkQnVmZmVyOyAv
LyBBIGJ1ZmZlciBmb3Igbm9ybWFsaXplZCBydW4uCisgICAgY29uc3QgVGV4dFJ1biYgbV9ydW47
CisgICAgYm9vbCBtX2l0ZXJhdGVCYWNrd2FyZHM7CisgICAgaW50IG1fd29yZFNwYWNpbmdBZGp1
c3RtZW50OyAvLyBkZWx0YSBhZGp1c3RtZW50IChwaXhlbHMpIGZvciBlYWNoIHdvcmQgYnJlYWsu
CisgICAgZmxvYXQgbV9wYWRkaW5nOyAvLyBwaXhlbHMgdG8gYmUgZGlzdHJpYnV0ZWQgb3ZlciB0
aGUgbGluZSBhdCB3b3JkIGJyZWFrcy4KKyAgICBmbG9hdCBtX3BhZFBlcldvcmRCcmVhazsgLy8g
cGl4ZWxzIHRvIGJlIGFkZGVkIHRvIGVhY2ggd29yZCBicmVhay4KKyAgICBmbG9hdCBtX3BhZEVy
cm9yOyAvLyB8bV9wYWRQZXJXb3JkQnJlYWt8IG1pZ2h0IGhhdmUgYSBmcmFjdGlvbmFsIGNvbXBv
bmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBvbmx5IGFkZCBhIHdob2xl
IG51bWJlciBvZiBwYWRkaW5nIHBpeGVscyBhdAorICAgICAgICAgICAgICAgICAgICAgIC8vIGVh
Y2ggd29yZCBicmVhayB3ZSBhY2N1bXVsYXRlIGVycm9yLiBUaGlzIGlzIHRoZQorICAgICAgICAg
ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBwaXhlbHMgdGhhdCB3ZSBhcmUgYmVoaW5kIHNvIGZh
ci4KKyAgICBpbnQgbV9sZXR0ZXJTcGFjaW5nOyAvLyBwaXhlbHMgdG8gYmUgYWRkZWQgYWZ0ZXIg
ZWFjaCBnbHlwaC4KK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIENv
bXBsZXhUZXh0Q29udHJvbGxlckxpbnV4X2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vRm9udExpbnV4LmNwcAppbmRleCA1ZTNlNWIyODU3NDUxMmIxMmQ4ZjE3Mzlh
MWZkOGJiMTVhNTA4ZjY2Li4zNjY0MTg4NWJiMjRiZGExYzIyYWNjNGRjNDllYTBjN2FlOTEzYzc5
IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51
eC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250TGludXgu
Y3BwCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRm9u
dC5oIgogCisjaW5jbHVkZSAiQ29tcGxleFRleHRDb250cm9sbGVyTGludXguaCIKICNpbmNsdWRl
ICJGbG9hdFJlY3QuaCIKICNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgogI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgpAQCAtNDUsOSArNDYsNiBAQAogI2luY2x1ZGUgIlNrVHlwZWZhY2UuaCIK
ICNpbmNsdWRlICJTa1V0aWxzLmgiCiAKLSNpbmNsdWRlIDx1bmljb2RlL25vcm1senIuaD4KLSNp
bmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+Ci0jaW5jbHVkZSA8d3RmL093bkFycmF5UHRyLmg+CiAj
aW5jbHVkZSA8d3RmL093blB0ci5oPgogI2luY2x1ZGUgPHd0Zi91bmljb2RlL1VuaWNvZGUuaD4K
IApAQCAtMTcyLDQ5OSArMTcwLDYgQEAgc3RhdGljIGludCB0cnVuY2F0ZUZpeGVkUG9pbnRUb0lu
dGVnZXIoSEJfRml4ZWQgdmFsdWUpCiAgICAgcmV0dXJuIHZhbHVlID4+IDY7CiB9CiAKLS8vIFRl
eHRSdW5XYWxrZXIgd2Fsa3MgYSBUZXh0UnVuIGFuZCBwcmVzZW50cyBlYWNoIHNjcmlwdCBydW4g
aW4gc2VxdWVuY2UuIEEKLS8vIFRleHRSdW4gaXMgYSBzZXF1ZW5jZSBvZiBjb2RlLXBvaW50cyB3
aXRoIHRoZSBzYW1lIGVtYmVkZGluZyBsZXZlbCAoaS5lLiB0aGV5Ci0vLyBhcmUgYWxsIGxlZnQt
dG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkuIEEgc2NyaXB0IHJ1biBpcyBhIHN1YnNlcXVlbmNl
IHdoZXJlCi0vLyBhbGwgdGhlIGNoYXJhY3RlcnMgaGF2ZSB0aGUgc2FtZSBzY3JpcHQgKGUuZy4g
QXJhYmljLCBUaGFpIGV0YykuIFNoYXBpbmcgaXMKLS8vIG9ubHkgZXZlciBkb25lIHdpdGggc2Ny
aXB0IHJ1bnMgc2luY2UgdGhlIHNoYXBlcnMgb25seSBrbm93IGhvdyB0byBkZWFsIHdpdGgKLS8v
IGEgc2luZ2xlIHNjcmlwdC4KLS8vCi0vLyBBZnRlciBjcmVhdGluZyBpdCwgdGhlIHNjcmlwdCBy
dW5zIGFyZSBlaXRoZXIgaXRlcmF0ZWQgYmFja3dhcmRzIG9yIGZvcndhcmRzLgotLy8gSXQgZGVm
YXVsdHMgdG8gYmFja3dhcmRzIGZvciBSVEwgYW5kIGZvcndhcmRzIG90aGVyd2lzZSAod2hpY2gg
bWF0Y2hlcyB0aGUKLS8vIHByZXNlbnRhdGlvbiBvcmRlciksIGhvd2V2ZXIgeW91IGNhbiBzZXQg
aXQgd2l0aCB8c2V0QmFja3dhcmRzSXRlcmF0aW9ufC4KLS8vCi0vLyBPbmNlIHlvdSBoYXZlIHNl
dHVwIHRoZSBvYmplY3QsIGNhbGwgfG5leHRTY3JpcHRSdW58IHRvIGdldCB0aGUgZmlyc3Qgc2Ny
aXB0Ci0vLyBydW4uIFRoaXMgd2lsbCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgaXRlcmF0aW9uIGlz
IGNvbXBsZXRlLiBBdCBhbnkgdGltZSB5b3UKLS8vIGNhbiBjYWxsIHxyZXNldHwgdG8gc3RhcnQg
b3ZlciBhZ2Fpbi4KLWNsYXNzIFRleHRSdW5XYWxrZXIgewotcHVibGljOgotICAgIFRleHRSdW5X
YWxrZXIoY29uc3QgVGV4dFJ1biYsIHVuc2lnbmVkLCBjb25zdCBGb250Kik7Ci0gICAgflRleHRS
dW5XYWxrZXIoKTsKLQotICAgIGJvb2wgaXNXb3JkQnJlYWsodW5zaWduZWQpOwotICAgIGludCBk
ZXRlcm1pbmVXb3JkQnJlYWtTcGFjaW5nKHVuc2lnbmVkKTsKLSAgICAvLyBzZXRQYWRkaW5nIHNl
dHMgYSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgVGV4dFJ1
bi4KLSAgICAvLyBXZWJLaXQgdXNlcyB0aGlzIHRvIGp1c3RpZnkgdGV4dC4KLSAgICB2b2lkIHNl
dFBhZGRpbmcoaW50KTsKLSAgICB2b2lkIHJlc2V0KCk7Ci0gICAgdm9pZCBzZXRCYWNrd2FyZHNJ
dGVyYXRpb24oYm9vbCk7Ci0gICAgLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBzY3JpcHQgcnVuLCBy
ZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGUgZW5kIG9mIHRoZQotICAgIC8vIFRleHRSdW4gaGFzIGJl
ZW4gcmVhY2hlZC4KLSAgICBib29sIG5leHRTY3JpcHRSdW4oKTsKLSAgICBmbG9hdCB3aWR0aE9m
RnVsbFJ1bigpOwotCi0gICAgLy8gc2V0V29yZFNwYWNpbmdBZGp1c3RtZW50IHNldHMgYSBkZWx0
YSAoaW4gcGl4ZWxzKSB3aGljaCBpcyBhcHBsaWVkIGF0Ci0gICAgLy8gZWFjaCB3b3JkIGJyZWFr
IGluIHRoZSBUZXh0UnVuLgotICAgIHZvaWQgc2V0V29yZFNwYWNpbmdBZGp1c3RtZW50KGludCB3
b3JkU3BhY2luZ0FkanVzdG1lbnQpIHsgbV93b3JkU3BhY2luZ0FkanVzdG1lbnQgPSB3b3JkU3Bh
Y2luZ0FkanVzdG1lbnQ7IH0KLQotICAgIC8vIHNldExldHRlclNwYWNpbmdBZGp1c3RtZW50IHNl
dHMgYW4gYWRkaXRpb25hbCBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgaXMKLSAgICAvLyBhZGRlZCB0
byB0aGUgYWR2YW5jZSBhZnRlciBlYWNoIG91dHB1dCBjbHVzdGVyLiBUaGlzIG1hdGNoZXMgdGhl
IGJlaGF2aW91cgotICAgIC8vIG9mIFdpZHRoSXRlcmF0b3I6OmFkdmFuY2UuCi0gICAgdm9pZCBz
ZXRMZXR0ZXJTcGFjaW5nQWRqdXN0bWVudChpbnQgbGV0dGVyU3BhY2luZ0FkanVzdG1lbnQpIHsg
bV9sZXR0ZXJTcGFjaW5nID0gbGV0dGVyU3BhY2luZ0FkanVzdG1lbnQ7IH0KLSAgICBpbnQgbGV0
dGVyU3BhY2luZygpIGNvbnN0IHsgcmV0dXJuIG1fbGV0dGVyU3BhY2luZzsgfQotCi0gICAgLy8g
U2V0IHRoZSB4IG9mZnNldCBmb3IgdGhlIG5leHQgc2NyaXB0IHJ1bi4gVGhpcyBhZmZlY3RzIHRo
ZSB2YWx1ZXMgaW4KLSAgICAvLyB8eFBvc2l0aW9uc3wKLSAgICB2b2lkIHNldFhPZmZzZXRUb1pl
cm8oKSB7IG1fb2Zmc2V0WCA9IDA7IH0KLSAgICBib29sIHJ0bCgpIGNvbnN0IHsgcmV0dXJuIG1f
cnVuLnJ0bCgpOyB9Ci0gICAgY29uc3QgdWludDE2X3QqIGdseXBocygpIGNvbnN0IHsgcmV0dXJu
IG1fZ2x5cGhzMTY7IH0KLQotICAgIC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBy
ZXR1cm5lZCBieSB8Z2x5cGhzfAotICAgIGNvbnN0IHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0IHsg
cmV0dXJuIG1faXRlbS5udW1fZ2x5cGhzOyB9Ci0KLSAgICAvLyBSZXR1cm4gdGhlIHggb2Zmc2V0
IGZvciBlYWNoIG9mIHRoZSBnbHlwaHMuIE5vdGUgdGhhdCB0aGlzIGlzIHRyYW5zbGF0ZWQKLSAg
ICAvLyBieSB0aGUgY3VycmVudCB4IG9mZnNldCBhbmQgdGhhdCB0aGUgeCBvZmZzZXQgaXMgdXBk
YXRlZCBmb3IgZWFjaCBzY3JpcHQKLSAgICAvLyBydW4uCi0gICAgY29uc3QgU2tTY2FsYXIqIHhQ
b3NpdGlvbnMoKSBjb25zdCB7IHJldHVybiBtX3hQb3NpdGlvbnM7IH0KLQotICAgIC8vIEdldCB0
aGUgYWR2YW5jZXMgKHdpZHRocykgZm9yIGVhY2ggZ2x5cGguCi0gICAgY29uc3QgSEJfRml4ZWQq
IGFkdmFuY2VzKCkgY29uc3QgeyByZXR1cm4gbV9pdGVtLmFkdmFuY2VzOyB9Ci0KLSAgICAvLyBS
ZXR1cm4gdGhlIHdpZHRoIChpbiBweCkgb2YgdGhlIGN1cnJlbnQgc2NyaXB0IHJ1bi4KLSAgICBj
b25zdCB1bnNpZ25lZCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcGl4ZWxXaWR0aDsgfQotCi0g
ICAgLy8gUmV0dXJuIHRoZSBjbHVzdGVyIGxvZyBmb3IgdGhlIGN1cnJlbnQgc2NyaXB0IHJ1bi4g
Rm9yIGV4YW1wbGU6Ci0gICAgLy8gICBzY3JpcHQgcnVuOiBmIGkgYSBuIGMgw6kgIChmaSBnZXRz
IGxpZ2F0dXJlZCkKLSAgICAvLyAgIGxvZyBjbHV0cnM6IDAgMCAxIDIgMyA0Ci0gICAgLy8gU28s
IGZvciBlYWNoIGlucHV0IGNvZGUgcG9pbnQsIHRoZSBsb2cgdGVsbHMgeW91IHdoaWNoIG91dHB1
dCBnbHlwaCB3YXMKLSAgICAvLyBnZW5lcmF0ZWQgZm9yIGl0LgotICAgIGNvbnN0IHVuc2lnbmVk
IHNob3J0KiBsb2dDbHVzdGVycygpIGNvbnN0IHsgcmV0dXJuIG1faXRlbS5sb2dfY2x1c3RlcnM7
IH0KLQotICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIGluIHRoZSBjdXJy
ZW50IHNjcmlwdCBydW4KLSAgICBjb25zdCB1bnNpZ25lZCBudW1Db2RlUG9pbnRzKCkgY29uc3Qg
eyByZXR1cm4gbV9udW1Db2RlUG9pbnRzOyB9Ci0KLSAgICBjb25zdCBGb250UGxhdGZvcm1EYXRh
KiBmb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2Fz
dDxGb250UGxhdGZvcm1EYXRhKj4obV9pdGVtLmZvbnQtPnVzZXJEYXRhKTsgfQotCi1wcml2YXRl
OgotICAgIHZvaWQgc2V0dXBGb250Rm9yU2NyaXB0UnVuKCk7Ci0gICAgSEJfRm9udFJlYyogYWxs
b2NIYXJmYnV6ekZvbnQoKTsKLSAgICB2b2lkIGRlbGV0ZUdseXBoQXJyYXlzKCk7Ci0gICAgdm9p
ZCBjcmVhdGVHbHlwaEFycmF5cyhpbnQpOwotICAgIHZvaWQgcmVzZXRHbHlwaEFycmF5cygpOwot
ICAgIHZvaWQgc2hhcGVHbHlwaHMoKTsKLSAgICB2b2lkIHNldEdseXBoWFBvc2l0aW9ucyhib29s
KTsKLQotICAgIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZVNwYWNlc0FuZE1pcnJvckNoYXJzKGNvbnN0
IFVDaGFyKiBzb3VyY2UsIGJvb2wgcnRsLCBVQ2hhciogZGVzdGluYXRpb24sIGludCBsZW5ndGgp
OwotICAgIHN0YXRpYyBjb25zdCBUZXh0UnVuJiBnZXROb3JtYWxpemVkVGV4dFJ1bihjb25zdCBU
ZXh0UnVuJiBvcmlnaW5hbFJ1biwgT3duUHRyPFRleHRSdW4+JiBub3JtYWxpemVkUnVuLCBPd25B
cnJheVB0cjxVQ2hhcj4mIG5vcm1hbGl6ZWRCdWZmZXIpOwotCi0gICAgLy8gVGhpcyBtYXRjaGVz
IHRoZSBsb2dpYyBpbiBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lQnJlYWsKLSAgICBzdGF0aWMg
Ym9vbCBpc0NvZGVwb2ludFNwYWNlKEhCX1VDaGFyMTYgYykgeyByZXR1cm4gYyA9PSAnICcgfHwg
YyA9PSAnXHQnOyB9Ci0KLSAgICBjb25zdCBGb250KiBjb25zdCBtX2ZvbnQ7Ci0gICAgY29uc3Qg
U2ltcGxlRm9udERhdGEqIG1fY3VycmVudEZvbnREYXRhOwotICAgIEhCX1NoYXBlckl0ZW0gbV9p
dGVtOwotICAgIHVpbnQxNl90KiBtX2dseXBoczE2OyAvLyBBIHZlY3RvciBvZiAxNi1iaXQgZ2x5
cGggaWRzLgotICAgIFNrU2NhbGFyKiBtX3hQb3NpdGlvbnM7IC8vIEEgdmVjdG9yIG9mIHggcG9z
aXRpb25zIGZvciBlYWNoIGdseXBoLgotICAgIHNzaXplX3QgbV9pbmRleE9mTmV4dFNjcmlwdFJ1
bjsgLy8gSW5kZXhlcyB0aGUgc2NyaXB0IHJ1biBpbiB8bV9ydW58LgotICAgIGNvbnN0IHVuc2ln
bmVkIG1fc3RhcnRpbmdYOyAvLyBPZmZzZXQgaW4gcGl4ZWxzIG9mIHRoZSBmaXJzdCBzY3JpcHQg
cnVuLgotICAgIHVuc2lnbmVkIG1fb2Zmc2V0WDsgLy8gT2Zmc2V0IGluIHBpeGVscyB0byB0aGUg
c3RhcnQgb2YgdGhlIG5leHQgc2NyaXB0IHJ1bi4KLSAgICB1bnNpZ25lZCBtX3BpeGVsV2lkdGg7
IC8vIFdpZHRoIChpbiBweCkgb2YgdGhlIGN1cnJlbnQgc2NyaXB0IHJ1bi4KLSAgICB1bnNpZ25l
ZCBtX251bUNvZGVQb2ludHM7IC8vIENvZGUgcG9pbnRzIGluIGN1cnJlbnQgc2NyaXB0IHJ1bi4K
LSAgICB1bnNpZ25lZCBtX2dseXBoc0FycmF5Q2FwYWNpdHk7IC8vIEN1cnJlbnQgc2l6ZSBvZiBh
bGwgdGhlIEhhcmZidXp6IGFycmF5cy4KLQotICAgIE93blB0cjxUZXh0UnVuPiBtX25vcm1hbGl6
ZWRSdW47Ci0gICAgT3duQXJyYXlQdHI8VUNoYXI+IG1fbm9ybWFsaXplZEJ1ZmZlcjsgLy8gQSBi
dWZmZXIgZm9yIG5vcm1hbGl6ZWQgcnVuLgotICAgIGNvbnN0IFRleHRSdW4mIG1fcnVuOwotICAg
IGJvb2wgbV9pdGVyYXRlQmFja3dhcmRzOwotICAgIGludCBtX3dvcmRTcGFjaW5nQWRqdXN0bWVu
dDsgLy8gZGVsdGEgYWRqdXN0bWVudCAocGl4ZWxzKSBmb3IgZWFjaCB3b3JkIGJyZWFrLgotICAg
IGZsb2F0IG1fcGFkZGluZzsgLy8gcGl4ZWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG92ZXIgdGhlIGxp
bmUgYXQgd29yZCBicmVha3MuCi0gICAgZmxvYXQgbV9wYWRQZXJXb3JkQnJlYWs7IC8vIHBpeGVs
cyB0byBiZSBhZGRlZCB0byBlYWNoIHdvcmQgYnJlYWsuCi0gICAgZmxvYXQgbV9wYWRFcnJvcjsg
Ly8gfG1fcGFkUGVyV29yZEJyZWFrfCBtaWdodCBoYXZlIGEgZnJhY3Rpb25hbCBjb21wb25lbnQu
Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2Ugb25seSBhZGQgYSB3aG9sZSBudW1i
ZXIgb2YgcGFkZGluZyBwaXhlbHMgYXQKLSAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIHdv
cmQgYnJlYWsgd2UgYWNjdW11bGF0ZSBlcnJvci4gVGhpcyBpcyB0aGUKLSAgICAgICAgICAgICAg
ICAgICAgICAvLyBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgd2UgYXJlIGJlaGluZCBzbyBmYXIuCi0g
ICAgaW50IG1fbGV0dGVyU3BhY2luZzsgLy8gcGl4ZWxzIHRvIGJlIGFkZGVkIGFmdGVyIGVhY2gg
Z2x5cGguCi19OwotCi0KLVRleHRSdW5XYWxrZXI6OlRleHRSdW5XYWxrZXIoY29uc3QgVGV4dFJ1
biYgcnVuLCB1bnNpZ25lZCBzdGFydGluZ1gsIGNvbnN0IEZvbnQqIGZvbnQpCi0gICAgOiBtX2Zv
bnQoZm9udCkKLSAgICAsIG1fc3RhcnRpbmdYKHN0YXJ0aW5nWCkKLSAgICAsIG1fb2Zmc2V0WCht
X3N0YXJ0aW5nWCkKLSAgICAsIG1fcnVuKGdldE5vcm1hbGl6ZWRUZXh0UnVuKHJ1biwgbV9ub3Jt
YWxpemVkUnVuLCBtX25vcm1hbGl6ZWRCdWZmZXIpKQotICAgICwgbV9pdGVyYXRlQmFja3dhcmRz
KG1fcnVuLnJ0bCgpKQotICAgICwgbV93b3JkU3BhY2luZ0FkanVzdG1lbnQoMCkKLSAgICAsIG1f
cGFkZGluZygwKQotICAgICwgbV9wYWRQZXJXb3JkQnJlYWsoMCkKLSAgICAsIG1fcGFkRXJyb3Io
MCkKLSAgICAsIG1fbGV0dGVyU3BhY2luZygwKQotewotICAgIC8vIERvIG5vdCB1c2UgfHJ1bnwg
aW5zaWRlIHRoaXMgY29uc3RydWN0b3IuIFVzZSB8bV9ydW58IGluc3RlYWQuCi0KLSAgICBtZW1z
ZXQoJm1faXRlbSwgMCwgc2l6ZW9mKG1faXRlbSkpOwotICAgIC8vIFdlIGNhbm5vdCBrbm93LCBh
aGVhZCBvZiB0aW1lLCBob3cgbWFueSBnbHlwaHMgYSBnaXZlbiBzY3JpcHQgcnVuCi0gICAgLy8g
d2lsbCBwcm9kdWNlLiBXZSB0YWtlIGEgZ3Vlc3MgdGhhdCBzY3JpcHQgcnVucyB3aWxsIG5vdCBw
cm9kdWNlIG1vcmUKLSAgICAvLyB0aGFuIHR3aWNlIGFzIG1hbnkgZ2x5cGhzIGFzIHRoZXJlIGFy
ZSBjb2RlIHBvaW50cyBwbHVzIGEgYml0IG9mCi0gICAgLy8gcGFkZGluZyBhbmQgZmFsbGJhY2sg
aWYgd2UgZmluZCB0aGF0IHdlIGFyZSB3cm9uZy4KLSAgICBjcmVhdGVHbHlwaEFycmF5cygobV9y
dW4ubGVuZ3RoKCkgKyAyKSAqIDIpOwotCi0gICAgbV9pdGVtLmxvZ19jbHVzdGVycyA9IG5ldyB1
bnNpZ25lZCBzaG9ydFttX3J1bi5sZW5ndGgoKV07Ci0KLSAgICBtX2l0ZW0uZmFjZSA9IDA7Ci0g
ICAgbV9pdGVtLmZvbnQgPSBhbGxvY0hhcmZidXp6Rm9udCgpOwotCi0gICAgbV9pdGVtLml0ZW0u
YmlkaUxldmVsID0gbV9ydW4ucnRsKCk7Ci0KLSAgICBtX2l0ZW0uc3RyaW5nID0gbV9ydW4uY2hh
cmFjdGVycygpOwotICAgIG1faXRlbS5zdHJpbmdMZW5ndGggPSBtX3J1bi5sZW5ndGgoKTsKLQot
ICAgIHJlc2V0KCk7Ci19Ci0KLVRleHRSdW5XYWxrZXI6On5UZXh0UnVuV2Fsa2VyKCkKLXsKLSAg
ICBmYXN0RnJlZShtX2l0ZW0uZm9udCk7Ci0gICAgZGVsZXRlR2x5cGhBcnJheXMoKTsKLSAgICBk
ZWxldGVbXSBtX2l0ZW0ubG9nX2NsdXN0ZXJzOwotfQotCi1ib29sIFRleHRSdW5XYWxrZXI6Omlz
V29yZEJyZWFrKHVuc2lnbmVkIGluZGV4KQotewotICAgIHJldHVybiBpbmRleCAmJiBpc0NvZGVw
b2ludFNwYWNlKG1faXRlbS5zdHJpbmdbaW5kZXhdKSAmJiAhaXNDb2RlcG9pbnRTcGFjZShtX2l0
ZW0uc3RyaW5nW2luZGV4IC0gMV0pOwotfQotCi1pbnQgVGV4dFJ1bldhbGtlcjo6ZGV0ZXJtaW5l
V29yZEJyZWFrU3BhY2luZyh1bnNpZ25lZCBsb2dDbHVzdGVyc0luZGV4KQotewotICAgIGludCB3
b3JkQnJlYWtTcGFjaW5nID0gMDsKLSAgICAvLyBUaGUgZmlyc3QgaGFsZiBvZiB0aGUgY29uanVu
Y3Rpb24gd29ya3MgYXJvdW5kIHRoZSBjYXNlIHdoZXJlCi0gICAgLy8gb3V0cHV0IGdseXBocyBh
cmVuJ3QgYXNzb2NpYXRlZCB3aXRoIGFueSBjb2RlcG9pbnRzIGJ5IHRoZQotICAgIC8vIGNsdXN0
ZXJzIGxvZy4KLSAgICBpZiAobG9nQ2x1c3RlcnNJbmRleCA8IG1faXRlbS5pdGVtLmxlbmd0aAot
ICAgICAgICAmJiBpc1dvcmRCcmVhayhtX2l0ZW0uaXRlbS5wb3MgKyBsb2dDbHVzdGVyc0luZGV4
KSkgewotICAgICAgICB3b3JkQnJlYWtTcGFjaW5nID0gbV93b3JkU3BhY2luZ0FkanVzdG1lbnQ7
Ci0KLSAgICAgICAgaWYgKG1fcGFkZGluZyA+IDApIHsKLSAgICAgICAgICAgIGludCB0b1BhZCA9
IHJvdW5kZihtX3BhZFBlcldvcmRCcmVhayArIG1fcGFkRXJyb3IpOwotICAgICAgICAgICAgbV9w
YWRFcnJvciArPSBtX3BhZFBlcldvcmRCcmVhayAtIHRvUGFkOwotCi0gICAgICAgICAgICBpZiAo
bV9wYWRkaW5nIDwgdG9QYWQpCi0gICAgICAgICAgICAgICAgdG9QYWQgPSBtX3BhZGRpbmc7Ci0g
ICAgICAgICAgICBtX3BhZGRpbmcgLT0gdG9QYWQ7Ci0gICAgICAgICAgICB3b3JkQnJlYWtTcGFj
aW5nICs9IHRvUGFkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3b3JkQnJlYWtTcGFj
aW5nOwotfQotCi0vLyBzZXRQYWRkaW5nIHNldHMgYSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGRp
c3RyaWJ1dGVkIGFjcm9zcyB0aGUgVGV4dFJ1bi4KLS8vIFdlYktpdCB1c2VzIHRoaXMgdG8ganVz
dGlmeSB0ZXh0Lgotdm9pZCBUZXh0UnVuV2Fsa2VyOjpzZXRQYWRkaW5nKGludCBwYWRkaW5nKQot
ewotICAgIG1fcGFkZGluZyA9IHBhZGRpbmc7Ci0gICAgaWYgKCFtX3BhZGRpbmcpCi0gICAgICAg
IHJldHVybjsKLQotICAgIC8vIElmIHdlIGhhdmUgcGFkZGluZyB0byBkaXN0cmlidXRlLCB0aGVu
IHdlIHRyeSB0byBnaXZlIGFuIGVxdWFsCi0gICAgLy8gYW1vdW50IHRvIGVhY2ggc3BhY2UuIFRo
ZSBsYXN0IHNwYWNlIGdldHMgdGhlIHNtYWxsZXIgYW1vdW50LCBpZgotICAgIC8vIGFueS4KLSAg
ICB1bnNpZ25lZCBudW1Xb3JkQnJlYWtzID0gMDsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBtX2l0ZW0uc3RyaW5nTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKGlzV29yZEJyZWFr
KGkpKQotICAgICAgICAgICAgbnVtV29yZEJyZWFrcysrOwotICAgIH0KLQotICAgIGlmIChudW1X
b3JkQnJlYWtzKQotICAgICAgICBtX3BhZFBlcldvcmRCcmVhayA9IG1fcGFkZGluZyAvIG51bVdv
cmRCcmVha3M7Ci0gICAgZWxzZQotICAgICAgICBtX3BhZFBlcldvcmRCcmVhayA9IDA7Ci19Ci0K
LXZvaWQgVGV4dFJ1bldhbGtlcjo6cmVzZXQoKQotewotICAgIGlmIChtX2l0ZXJhdGVCYWNrd2Fy
ZHMpCi0gICAgICAgIG1faW5kZXhPZk5leHRTY3JpcHRSdW4gPSBtX3J1bi5sZW5ndGgoKSAtIDE7
Ci0gICAgZWxzZQotICAgICAgICBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gMDsKLSAgICBtX29m
ZnNldFggPSBtX3N0YXJ0aW5nWDsKLX0KLQotdm9pZCBUZXh0UnVuV2Fsa2VyOjpzZXRCYWNrd2Fy
ZHNJdGVyYXRpb24oYm9vbCBpc0JhY2t3YXJkcykKLXsKLSAgICBtX2l0ZXJhdGVCYWNrd2FyZHMg
PSBpc0JhY2t3YXJkczsKLSAgICByZXNldCgpOwotfQotCi0vLyBBZHZhbmNlIHRvIHRoZSBuZXh0
IHNjcmlwdCBydW4sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQgb2YgdGhlCi0vLyBUZXh0
UnVuIGhhcyBiZWVuIHJlYWNoZWQuCi1ib29sIFRleHRSdW5XYWxrZXI6Om5leHRTY3JpcHRSdW4o
KQotewotICAgIGlmIChtX2l0ZXJhdGVCYWNrd2FyZHMpIHsKLSAgICAgICAgLy8gSW4gcmlnaHQt
dG8tbGVmdCBtb2RlIHdlIG5lZWQgdG8gcmVuZGVyIHRoZSBzaGFwZWQgZ2x5cGggYmFja3dhcmRz
IGFuZAotICAgICAgICAvLyBhbHNvIHJlbmRlciB0aGUgc2NyaXB0IHJ1bnMgdGhlbXNlbHZlcyBi
YWNrd2FyZHMuIFNvIGdpdmVuIGEgVGV4dFJ1bjoKLSAgICAgICAgLy8gICAgQUFBQUFBQUNUVFRU
VFRUICAgKEEgPSBBcmFiaWMsIEMgPSBDb21tb24sIFQgPSBUaGFpKQotICAgICAgICAvLyB3ZSBy
ZW5kZXI6Ci0gICAgICAgIC8vICAgIFRUVFRUVENBQUFBQUFBCi0gICAgICAgIC8vIChhbmQgdGhl
IGdseXBocyBpbiBlYWNoIEEsIEMgYW5kIFQgc2VjdGlvbiBhcmUgYmFja3dhcmRzIHRvbykKLSAg
ICAgICAgaWYgKCFoYl91dGYxNl9zY3JpcHRfcnVuX3ByZXYoJm1fbnVtQ29kZVBvaW50cywgJm1f
aXRlbS5pdGVtLCBtX3J1bi5jaGFyYWN0ZXJzKCksIG1fcnVuLmxlbmd0aCgpLCAmbV9pbmRleE9m
TmV4dFNjcmlwdFJ1bikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIG1fY3Vy
cmVudEZvbnREYXRhID0gbV9mb250LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIobV9pdGVtLnN0cmlu
Z1ttX2l0ZW0uaXRlbS5wb3NdLCBmYWxzZSkuZm9udERhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAg
ICAgaWYgKCFoYl91dGYxNl9zY3JpcHRfcnVuX25leHQoJm1fbnVtQ29kZVBvaW50cywgJm1faXRl
bS5pdGVtLCBtX3J1bi5jaGFyYWN0ZXJzKCksIG1fcnVuLmxlbmd0aCgpLCAmbV9pbmRleE9mTmV4
dFNjcmlwdFJ1bikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gSXQg
aXMgYWN0dWFsbHkgd3JvbmcgdG8gY29uc2lkZXIgc2NyaXB0IHJ1bnMgYXQgYWxsIGluIHRoaXMg
Y29kZS4KLSAgICAgICAgLy8gT3RoZXIgV2ViS2l0IGNvZGUgKGUuZy4gTWFjKSBzZWdtZW50cyBj
b21wbGV4IHRleHQganVzdCBieSBmaW5kaW5nCi0gICAgICAgIC8vIHRoZSBsb25nZXN0IHNwYW4g
b2YgdGV4dCBjb3ZlcmVkIGJ5IGEgc2luZ2xlIGZvbnQuCi0gICAgICAgIC8vIEJ1dCB3ZSBjdXJy
ZW50bHkgbmVlZCB0byBjYWxsIGhiX3V0ZjE2X3NjcmlwdF9ydW5fbmV4dCBhbnl3YXkgdG8gZmls
bAotICAgICAgICAvLyBpbiB0aGUgaGFyZmJ1enogZGF0YSBzdHJ1Y3R1cmVzIHRvIGUuZy4gcGlj
ayB0aGUgY29ycmVjdCBzY3JpcHQncyBzaGFwZXIuCi0gICAgICAgIC8vIFNvIHdlIGFsbG93IHRo
YXQgdG8gcnVuIGZpcnN0LCB0aGVuIGRvIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgcmFuZ2UgaXQK
LSAgICAgICAgLy8gZm91bmQgYW5kIHRha2UgdGhlIGxhcmdlc3Qgc3VicmVnaW9uIHRoYXQgc3Rh
eXMgd2l0aGluIGEgc2luZ2xlIGZvbnQuCi0gICAgICAgIG1fY3VycmVudEZvbnREYXRhID0gbV9m
b250LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIobV9pdGVtLnN0cmluZ1ttX2l0ZW0uaXRlbS5wb3Nd
LCBmYWxzZSkuZm9udERhdGE7Ci0gICAgICAgIHVuc2lnbmVkIGVuZE9mUnVuOwotICAgICAgICBm
b3IgKGVuZE9mUnVuID0gMTsgZW5kT2ZSdW4gPCBtX2l0ZW0uaXRlbS5sZW5ndGg7ICsrZW5kT2ZS
dW4pIHsKLSAgICAgICAgICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBuZXh0Rm9udERhdGEgPSBt
X2ZvbnQtPmdseXBoRGF0YUZvckNoYXJhY3RlcihtX2l0ZW0uc3RyaW5nW21faXRlbS5pdGVtLnBv
cyArIGVuZE9mUnVuXSwgZmFsc2UpLmZvbnREYXRhOwotICAgICAgICAgICAgaWYgKG5leHRGb250
RGF0YSAhPSBtX2N1cnJlbnRGb250RGF0YSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgfQotICAgICAgICBtX2l0ZW0uaXRlbS5sZW5ndGggPSBlbmRPZlJ1bjsKLSAgICAgICAgbV9p
bmRleE9mTmV4dFNjcmlwdFJ1biA9IG1faXRlbS5pdGVtLnBvcyArIGVuZE9mUnVuOwotICAgIH0K
LQotICAgIHNldHVwRm9udEZvclNjcmlwdFJ1bigpOwotICAgIHNoYXBlR2x5cGhzKCk7Ci0gICAg
c2V0R2x5cGhYUG9zaXRpb25zKHJ0bCgpKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1mbG9h
dCBUZXh0UnVuV2Fsa2VyOjp3aWR0aE9mRnVsbFJ1bigpCi17Ci0gICAgZmxvYXQgd2lkdGhTdW0g
PSAwOwotICAgIHdoaWxlIChuZXh0U2NyaXB0UnVuKCkpCi0gICAgICAgIHdpZHRoU3VtICs9IHdp
ZHRoKCk7Ci0KLSAgICByZXR1cm4gd2lkdGhTdW07Ci19Ci0KLXZvaWQgVGV4dFJ1bldhbGtlcjo6
c2V0dXBGb250Rm9yU2NyaXB0UnVuKCkKLXsKLSAgICBjb25zdCBGb250RGF0YSogZm9udERhdGEg
PSBtX2ZvbnQtPmdseXBoRGF0YUZvckNoYXJhY3RlcihtX2l0ZW0uc3RyaW5nW21faXRlbS5pdGVt
LnBvc10sIGZhbHNlKS5mb250RGF0YTsKLSAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0
Zm9ybURhdGEgPSBmb250RGF0YS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIoJyAnKS0+cGxhdGZvcm1E
YXRhKCk7Ci0gICAgbV9pdGVtLmZhY2UgPSBwbGF0Zm9ybURhdGEuaGFyZmJ1enpGYWNlKCk7Ci0g
ICAgdm9pZCogb3BhcXVlUGxhdGZvcm1EYXRhID0gY29uc3RfY2FzdDxGb250UGxhdGZvcm1EYXRh
Kj4oJnBsYXRmb3JtRGF0YSk7Ci0gICAgbV9pdGVtLmZvbnQtPnVzZXJEYXRhID0gb3BhcXVlUGxh
dGZvcm1EYXRhOwotfQotCi1IQl9Gb250UmVjKiBUZXh0UnVuV2Fsa2VyOjphbGxvY0hhcmZidXp6
Rm9udCgpCi17Ci0gICAgSEJfRm9udFJlYyogZm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8SEJfRm9u
dFJlYyo+KGZhc3RNYWxsb2Moc2l6ZW9mKEhCX0ZvbnRSZWMpKSk7Ci0gICAgbWVtc2V0KGZvbnQs
IDAsIHNpemVvZihIQl9Gb250UmVjKSk7Ci0gICAgZm9udC0+a2xhc3MgPSAmaGFyZmJ1enpTa2lh
Q2xhc3M7Ci0gICAgZm9udC0+dXNlckRhdGEgPSAwOwotICAgIC8vIFRoZSB2YWx1ZXMgd2hpY2gg
aGFyZmJ1enpTa2lhQ2xhc3MgcmV0dXJucyBhcmUgYWxyZWFkeSBzY2FsZWQgdG8KLSAgICAvLyBw
aXhlbCB1bml0cywgc28gd2UganVzdCBzZXQgYWxsIHRoZXNlIHRvIG9uZSB0byBkaXNhYmxlIGZ1
cnRoZXIKLSAgICAvLyBzY2FsaW5nLgotICAgIGZvbnQtPnhfcHBlbSA9IDE7Ci0gICAgZm9udC0+
eV9wcGVtID0gMTsKLSAgICBmb250LT54X3NjYWxlID0gMTsKLSAgICBmb250LT55X3NjYWxlID0g
MTsKLQotICAgIHJldHVybiBmb250OwotfQotCi12b2lkIFRleHRSdW5XYWxrZXI6OmRlbGV0ZUds
eXBoQXJyYXlzKCkKLXsKLSAgICBkZWxldGVbXSBtX2l0ZW0uZ2x5cGhzOwotICAgIGRlbGV0ZVtd
IG1faXRlbS5hdHRyaWJ1dGVzOwotICAgIGRlbGV0ZVtdIG1faXRlbS5hZHZhbmNlczsKLSAgICBk
ZWxldGVbXSBtX2l0ZW0ub2Zmc2V0czsKLSAgICBkZWxldGVbXSBtX2dseXBoczE2OwotICAgIGRl
bGV0ZVtdIG1feFBvc2l0aW9uczsKLX0KLQotdm9pZCBUZXh0UnVuV2Fsa2VyOjpjcmVhdGVHbHlw
aEFycmF5cyhpbnQgc2l6ZSkKLXsKLSAgICBtX2l0ZW0uZ2x5cGhzID0gbmV3IEhCX0dseXBoW3Np
emVdOwotICAgIG1faXRlbS5hdHRyaWJ1dGVzID0gbmV3IEhCX0dseXBoQXR0cmlidXRlc1tzaXpl
XTsKLSAgICBtX2l0ZW0uYWR2YW5jZXMgPSBuZXcgSEJfRml4ZWRbc2l6ZV07Ci0gICAgbV9pdGVt
Lm9mZnNldHMgPSBuZXcgSEJfRml4ZWRQb2ludFtzaXplXTsKLQotICAgIG1fZ2x5cGhzMTYgPSBu
ZXcgdWludDE2X3Rbc2l6ZV07Ci0gICAgbV94UG9zaXRpb25zID0gbmV3IFNrU2NhbGFyW3NpemVd
OwotCi0gICAgbV9pdGVtLm51bV9nbHlwaHMgPSBzaXplOwotICAgIG1fZ2x5cGhzQXJyYXlDYXBh
Y2l0eSA9IHNpemU7IC8vIFNhdmUgdGhlIEdseXBoQXJyYXlzIHNpemUuCi0gICAgcmVzZXRHbHlw
aEFycmF5cygpOwotfQotCi12b2lkIFRleHRSdW5XYWxrZXI6OnJlc2V0R2x5cGhBcnJheXMoKQot
ewotICAgIGludCBzaXplID0gbV9pdGVtLm51bV9nbHlwaHM7Ci0gICAgLy8gQWxsIHRoZSB0eXBl
cyBoZXJlIGRvbid0IGhhdmUgcG9pbnRlcnMuIEl0IGlzIHNhZmUgdG8gcmVzZXQgdG8KLSAgICAv
LyB6ZXJvIHVubGVzcyBIYXJmYnV6eiBicmVha3MgdGhlIGNvbXBhdGliaWxpdHkgaW4gdGhlIGZ1
dHVyZS4KLSAgICBtZW1zZXQobV9pdGVtLmdseXBocywgMCwgc2l6ZSAqIHNpemVvZihIQl9HbHlw
aCkpOwotICAgIG1lbXNldChtX2l0ZW0uYXR0cmlidXRlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9H
bHlwaEF0dHJpYnV0ZXMpKTsKLSAgICBtZW1zZXQobV9pdGVtLmFkdmFuY2VzLCAwLCBzaXplICog
c2l6ZW9mKEhCX0ZpeGVkKSk7Ci0gICAgbWVtc2V0KG1faXRlbS5vZmZzZXRzLCAwLCBzaXplICog
c2l6ZW9mKEhCX0ZpeGVkUG9pbnQpKTsKLSAgICBtZW1zZXQobV9nbHlwaHMxNiwgMCwgc2l6ZSAq
IHNpemVvZih1aW50MTZfdCkpOwotICAgIG1lbXNldChtX3hQb3NpdGlvbnMsIDAsIHNpemUgKiBz
aXplb2YoU2tTY2FsYXIpKTsKLX0KLQotdm9pZCBUZXh0UnVuV2Fsa2VyOjpzaGFwZUdseXBocygp
Ci17Ci0gICAgLy8gSEJfU2hhcGVJdGVtKCkgcmVzZXRzIG1faXRlbS5udW1fZ2x5cGhzLiBJZiB0
aGUgcHJldmlvdXMgY2FsbCB0bwotICAgIC8vIEhCX1NoYXBlSXRlbSgpIHVzZWQgbGVzcyBzcGFj
ZSB0aGFuIHdhcyBhdmFpbGFibGUsIHRoZSBjYXBhY2l0eSBvZgotICAgIC8vIHRoZSBhcnJheSBt
YXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgbV9pdGVtLm51bV9nbHlwaHMu
IAotICAgIC8vIFNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBudW1fZ2x5cGhzIHRvIHRoZSBjYXBh
Y2l0eSBvZiB0aGUgYXJyYXkuCi0gICAgbV9pdGVtLm51bV9nbHlwaHMgPSBtX2dseXBoc0FycmF5
Q2FwYWNpdHk7Ci0gICAgcmVzZXRHbHlwaEFycmF5cygpOwotICAgIHdoaWxlICghSEJfU2hhcGVJ
dGVtKCZtX2l0ZW0pKSB7Ci0gICAgICAgIC8vIFdlIG92ZXJmbG93ZWQgb3VyIGFycmF5cy4gUmVz
aXplIGFuZCByZXRyeS4KLSAgICAgICAgLy8gSEJfU2hhcGVJdGVtIGZpbGxzIGluIG1faXRlbS5u
dW1fZ2x5cGhzIHdpdGggdGhlIG5lZWRlZCBzaXplLgotICAgICAgICBkZWxldGVHbHlwaEFycmF5
cygpOwotICAgICAgICAvLyBUaGUgfCsgMXwgaGVyZSBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVn
IGluIEhhcmZidXp6OiB0aGUgS2htZXIKLSAgICAgICAgLy8gc2hhcGVyIChhdCBsZWFzdCkgY2Fu
IGZhaWwgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgZ2x5cGggYnVmZmVycwotICAgICAgICAvLyBh
bmQgcmVxdWVzdCAwIGFkZGl0aW9uYWwgZ2x5cGhzOiB0aHJvd2luZyB1cyBpbnRvIGFuIGluZmlu
aXRlCi0gICAgICAgIC8vIGxvb3AuCi0gICAgICAgIGNyZWF0ZUdseXBoQXJyYXlzKG1faXRlbS5u
dW1fZ2x5cGhzICsgMSk7Ci0gICAgfQotfQotCi12b2lkIFRleHRSdW5XYWxrZXI6OnNldEdseXBo
WFBvc2l0aW9ucyhib29sIGlzUlRMKQotewotICAgIGRvdWJsZSBwb3NpdGlvbiA9IDA7Ci0gICAg
Ly8gbG9nQ2x1c3RlcnNJbmRleCBpbmRleGVzIGxvZ0NsdXN0ZXJzIGZvciB0aGUgZmlyc3QgKG9y
IGxhc3Qgd2hlbgotICAgIC8vIFJUTCkgY29kZXBvaW50IG9mIHRoZSBjdXJyZW50IGdseXBoLiAg
RWFjaCB0aW1lIHdlIGFkdmFuY2UgYSBnbHlwaCwKLSAgICAvLyB3ZSBza2lwIG92ZXIgYWxsIHRo
ZSBjb2RlcG9pbnRzIHRoYXQgY29udHJpYnV0ZWQgdG8gdGhlIGN1cnJlbnQKLSAgICAvLyBnbHlw
aC4KLSAgICBpbnQgbG9nQ2x1c3RlcnNJbmRleCA9IDA7Ci0KLSAgICBpZiAoaXNSVEwpIHsKLSAg
ICAgICAgbG9nQ2x1c3RlcnNJbmRleCA9IG1faXRlbS5udW1fZ2x5cGhzIC0gMTsKLQotICAgICAg
ICAvLyBHbHlwaHMgYXJlIHN0b3JlZCBpbiBsb2dpY2FsIG9yZGVyLCBidXQgZm9yIGxheW91dCBw
dXJwb3NlcyB3ZQotICAgICAgICAvLyBhbHdheXMgZ28gbGVmdCB0byByaWdodC4KLSAgICAgICAg
Zm9yIChpbnQgaSA9IG1faXRlbS5udW1fZ2x5cGhzIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAg
ICAgICAgIGlmICghbV9jdXJyZW50Rm9udERhdGEtPmlzWmVyb1dpZHRoU3BhY2VHbHlwaChtX2ds
eXBoczE2W2ldKSkgewotICAgICAgICAgICAgICAgIC8vIFdoaXRlc3BhY2UgbXVzdCBiZSBsYWlk
IG91dCBpbiBsb2dpY2FsIG9yZGVyLCBzbyB3aGVuIGluc2VydGluZwotICAgICAgICAgICAgICAg
IC8vIHNwYWNlcyBpbiBSVEwgKGJ1dCBpdGVyYXRpbmcgaW4gTFRSIG9yZGVyKSB3ZSBtdXN0IGlu
c2VydCBzcGFjZXMKLSAgICAgICAgICAgICAgICAvLyBfYmVmb3JlXyB0aGUgbmV4dCBnbHlwaC4K
LSAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGkgKyAxKSA+PSBtX2l0
ZW0ubnVtX2dseXBocyB8fCBtX2l0ZW0uYXR0cmlidXRlc1tpICsgMV0uY2x1c3RlclN0YXJ0KQot
ICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBtX2xldHRlclNwYWNpbmc7Ci0KLSAgICAg
ICAgICAgICAgICBwb3NpdGlvbiArPSBkZXRlcm1pbmVXb3JkQnJlYWtTcGFjaW5nKGxvZ0NsdXN0
ZXJzSW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX2dseXBoczE2W2ldID0g
bV9pdGVtLmdseXBoc1tpXTsKLSAgICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gdHJ1bmNhdGVG
aXhlZFBvaW50VG9JbnRlZ2VyKG1faXRlbS5vZmZzZXRzW2ldLngpOwotICAgICAgICAgICAgbV94
UG9zaXRpb25zW2ldID0gbV9vZmZzZXRYICsgcG9zaXRpb24gKyBvZmZzZXRYOwotCi0gICAgICAg
ICAgICB3aGlsZSAobG9nQ2x1c3RlcnNJbmRleCA+IDAgJiYgbG9nQ2x1c3RlcnMoKVtsb2dDbHVz
dGVyc0luZGV4XSA9PSBpKQotICAgICAgICAgICAgICAgIGxvZ0NsdXN0ZXJzSW5kZXgtLTsKLQot
ICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRGb250RGF0YS0+aXNaZXJvV2lkdGhTcGFjZUdseXBo
KG1fZ2x5cGhzMTZbaV0pKQotICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHRydW5jYXRlRml4
ZWRQb2ludFRvSW50ZWdlcihtX2l0ZW0uYWR2YW5jZXNbaV0pOwotICAgICAgICB9Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2l0ZW0ubnVtX2dseXBoczsg
KytpKSB7Ci0gICAgICAgICAgICBtX2dseXBoczE2W2ldID0gbV9pdGVtLmdseXBoc1tpXTsKLSAg
ICAgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1f
aXRlbS5vZmZzZXRzW2ldLngpOwotICAgICAgICAgICAgbV94UG9zaXRpb25zW2ldID0gbV9vZmZz
ZXRYICsgcG9zaXRpb24gKyBvZmZzZXRYOwotCi0gICAgICAgICAgICBpZiAobV9jdXJyZW50Rm9u
dERhdGEtPmlzWmVyb1dpZHRoU3BhY2VHbHlwaChtX2dseXBoczE2W2ldKSkKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgZG91YmxlIGFkdmFuY2UgPSB0cnVuY2F0ZUZp
eGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLmFkdmFuY2VzW2ldKTsKLQotICAgICAgICAgICAgYWR2
YW5jZSArPSBkZXRlcm1pbmVXb3JkQnJlYWtTcGFjaW5nKGxvZ0NsdXN0ZXJzSW5kZXgpOwotCi0g
ICAgICAgICAgICBpZiAobV9pdGVtLmF0dHJpYnV0ZXNbaV0uY2x1c3RlclN0YXJ0KQotICAgICAg
ICAgICAgICAgIGFkdmFuY2UgKz0gbV9sZXR0ZXJTcGFjaW5nOwotCi0gICAgICAgICAgICB3aGls
ZSAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxvZ0NsdXN0ZXJzSW5kZXgpIDwgbV9pdGVtLml0ZW0u
bGVuZ3RoICYmIGxvZ0NsdXN0ZXJzKClbbG9nQ2x1c3RlcnNJbmRleF0gPT0gaSkKLSAgICAgICAg
ICAgICAgICBsb2dDbHVzdGVyc0luZGV4Kys7Ci0KLSAgICAgICAgICAgIHBvc2l0aW9uICs9IGFk
dmFuY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9waXhlbFdpZHRoID0gc3RkOjptYXgocG9z
aXRpb24sIDAuMCk7Ci0gICAgbV9vZmZzZXRYICs9IG1fcGl4ZWxXaWR0aDsKLX0KLQotdm9pZCBU
ZXh0UnVuV2Fsa2VyOjpub3JtYWxpemVTcGFjZXNBbmRNaXJyb3JDaGFycyhjb25zdCBVQ2hhciog
c291cmNlLCBib29sIHJ0bCwgVUNoYXIqIGRlc3RpbmF0aW9uLCBpbnQgbGVuZ3RoKQotewotICAg
IGludCBwb3NpdGlvbiA9IDA7Ci0gICAgYm9vbCBlcnJvciA9IGZhbHNlOwotICAgIC8vIEl0ZXJh
dGUgY2hhcmFjdGVycyBpbiBzb3VyY2UgYW5kIG1pcnJvciBjaGFyYWN0ZXIgaWYgbmVlZGVkLgot
ICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkgewotICAgICAgICBVQ2hhcjMyIGNoYXJhY3Rl
cjsKLSAgICAgICAgaW50IG5leHRQb3NpdGlvbiA9IHBvc2l0aW9uOwotICAgICAgICBVMTZfTkVY
VChzb3VyY2UsIG5leHRQb3NpdGlvbiwgbGVuZ3RoLCBjaGFyYWN0ZXIpOwotICAgICAgICBpZiAo
Rm9udDo6dHJlYXRBc1NwYWNlKGNoYXJhY3RlcikpCi0gICAgICAgICAgICBjaGFyYWN0ZXIgPSAn
ICc7Ci0gICAgICAgIGVsc2UgaWYgKEZvbnQ6OnRyZWF0QXNaZXJvV2lkdGhTcGFjZShjaGFyYWN0
ZXIpKQotICAgICAgICAgICAgY2hhcmFjdGVyID0gemVyb1dpZHRoU3BhY2U7Ci0gICAgICAgIGVs
c2UgaWYgKHJ0bCkKLSAgICAgICAgICAgIGNoYXJhY3RlciA9IHVfY2hhck1pcnJvcihjaGFyYWN0
ZXIpOwotICAgICAgICBVMTZfQVBQRU5EKGRlc3RpbmF0aW9uLCBwb3NpdGlvbiwgbGVuZ3RoLCBj
aGFyYWN0ZXIsIGVycm9yKTsKLSAgICAgICAgQVNTRVJUKCFlcnJvcik7Ci0gICAgICAgIHBvc2l0
aW9uID0gbmV4dFBvc2l0aW9uOwotICAgIH0KLX0KLQotY29uc3QgVGV4dFJ1biYgVGV4dFJ1bldh
bGtlcjo6Z2V0Tm9ybWFsaXplZFRleHRSdW4oY29uc3QgVGV4dFJ1biYgb3JpZ2luYWxSdW4sIE93
blB0cjxUZXh0UnVuPiYgbm9ybWFsaXplZFJ1biwgT3duQXJyYXlQdHI8VUNoYXI+JiBub3JtYWxp
emVkQnVmZmVyKQotewotICAgIC8vIE5vcm1hbGl6ZSB0aGUgdGV4dCBydW4gaW4gdGhyZWUgd2F5
czoKLSAgICAvLyAxKSBDb252ZXJ0IHRoZSB8b3JpZ2luYWxSdW58IHRvIE5GQyBub3JtYWxpemVk
IGZvcm0gaWYgY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzCi0gICAgLy8gKFUrMDMwMC4uKSBh
cmUgdXNlZCBpbiB0aGUgcnVuLiBUaGlzIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIG1v
c3QgT3BlblR5cGUKLSAgICAvLyBmb250cyAoZS5nLiwgQXJpYWwpIGRvbid0IGhhdmUgc3Vic3Rp
dHV0aW9uIHJ1bGVzIGZvciB0aGUgZGlhY3JpdGljYWwgbWFya3MgaW4KLSAgICAvLyB0aGVpciBH
U1VCIHRhYmxlcy4KLSAgICAvLwotICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIGlj
dTo6Tm9ybWFsaXplcjo6aXNOb3JtYWxpemVkKFVOT1JNX05GQykgQVBJIGhlcmUgc2luY2UKLSAg
ICAvLyB0aGUgQVBJIHJldHVybnMgRkFMU0UgKD0gbm90IG5vcm1hbGl6ZWQpIGZvciBjb21wbGV4
IHJ1bnMgdGhhdCBkb24ndCByZXF1aXJlIE5GQwotICAgIC8vIG5vcm1hbGl6YXRpb24gKGUuZy4s
IEFyYWJpYyB0ZXh0KS4gVW5sZXNzIHRoZSBydW4gY29udGFpbnMgdGhlIGRpYWNyaXRpY2FsIG1h
cmtzLAotICAgIC8vIEhhcmZidXp6IHdpbGwgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIHVzIHVzaW5n
IHRoZSBHU1VCIHRhYmxlLgotICAgIC8vIDIpIENvbnZlcnQgc3BhY2luZyBjaGFyYWN0ZXJzIGlu
dG8gcGxhaW4gc3BhY2VzLCBhcyBzb21lIGZvbnRzIHdpbGwgcHJvdmlkZSBnbHlwaHMKLSAgICAv
LyBmb3IgY2hhcmFjdGVycyBsaWtlICdcbicgb3RoZXJ3aXNlLgotICAgIC8vIDMpIENvbnZlcnQg
bWlycm9yZWQgY2hhcmFjdGVycyBzdWNoIGFzIHBhcmVudGhlc2lzIGZvciBydGwgdGV4dC4KLQot
ICAgIC8vIENvbnZlcnQgdG8gTkZDIGZvcm0gaWYgdGhlIHRleHQgaGFzIGRpYWNyaXRpY2FsIG1h
cmtzLgotICAgIGljdTo6VW5pY29kZVN0cmluZyBub3JtYWxpemVkU3RyaW5nOwotICAgIFVFcnJv
ckNvZGUgZXJyb3IgPSBVX1pFUk9fRVJST1I7Ci0KLSAgICBmb3IgKGludDE2X3QgaSA9IDA7IGkg
PCBvcmlnaW5hbFJ1bi5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAgIFVDaGFyIGNoID0gb3JpZ2lu
YWxSdW5baV07Ci0gICAgICAgIGlmICg6OnVibG9ja19nZXRDb2RlKGNoKSA9PSBVQkxPQ0tfQ09N
QklOSU5HX0RJQUNSSVRJQ0FMX01BUktTKSB7Ci0gICAgICAgICAgICBpY3U6Ok5vcm1hbGl6ZXI6
Om5vcm1hbGl6ZShpY3U6OlVuaWNvZGVTdHJpbmcob3JpZ2luYWxSdW4uY2hhcmFjdGVycygpLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxSdW4ubGVuZ3Ro
KCkpLCBVTk9STV9ORkMsIDAgLyogbm8gb3B0aW9ucyAqLywKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRTdHJpbmcsIGVycm9yKTsKLSAgICAgICAgICAg
IGlmIChVX0ZBSUxVUkUoZXJyb3IpKQotICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFJ1
bjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm9ybWFs
aXplIHNwYWNlIGFuZCBtaXJyb3IgcGFyZW50aGVzaXMgZm9yIHJ0bCB0ZXh0LgotICAgIGludCBu
b3JtYWxpemVkQnVmZmVyTGVuZ3RoOwotICAgIGNvbnN0IFVDaGFyKiBzb3VyY2VUZXh0OwotICAg
IGlmIChub3JtYWxpemVkU3RyaW5nLmlzRW1wdHkoKSkgewotICAgICAgICBub3JtYWxpemVkQnVm
ZmVyTGVuZ3RoID0gb3JpZ2luYWxSdW4ubGVuZ3RoKCk7Ci0gICAgICAgIHNvdXJjZVRleHQgPSBv
cmlnaW5hbFJ1bi5jaGFyYWN0ZXJzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbm9ybWFsaXpl
ZEJ1ZmZlckxlbmd0aCA9IG5vcm1hbGl6ZWRTdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgIHNvdXJj
ZVRleHQgPSBub3JtYWxpemVkU3RyaW5nLmdldEJ1ZmZlcigpOwotICAgIH0KLQotICAgIG5vcm1h
bGl6ZWRCdWZmZXIuc2V0KG5ldyBVQ2hhcltub3JtYWxpemVkQnVmZmVyTGVuZ3RoICsgMV0pOwot
Ci0gICAgbm9ybWFsaXplU3BhY2VzQW5kTWlycm9yQ2hhcnMoc291cmNlVGV4dCwgb3JpZ2luYWxS
dW4ucnRsKCksIG5vcm1hbGl6ZWRCdWZmZXIuZ2V0KCksIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgp
OwotCi0gICAgbm9ybWFsaXplZFJ1bi5zZXQobmV3IFRleHRSdW4ob3JpZ2luYWxSdW4pKTsKLSAg
ICBub3JtYWxpemVkUnVuLT5zZXRUZXh0KG5vcm1hbGl6ZWRCdWZmZXIuZ2V0KCksIG5vcm1hbGl6
ZWRCdWZmZXJMZW5ndGgpOwotICAgIHJldHVybiAqbm9ybWFsaXplZFJ1bjsKLX0KLQogc3RhdGlj
IHZvaWQgc2V0dXBGb3JUZXh0UGFpbnRpbmcoU2tQYWludCogcGFpbnQsIFNrQ29sb3IgY29sb3Ip
CiB7CiAgICAgcGFpbnQtPnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5j
b2RpbmcpOwpAQCAtNjk3LDIyICsyMDIsMjIgQEAgdm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQo
R3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgVGV4dFJ1biYgcnVuLAogICAgICAgICBzZXR1cEZv
clRleHRQYWludGluZygmc3Ryb2tlUGFpbnQsIGdjLT5zdHJva2VDb2xvcigpLnJnYigpKTsKICAg
ICB9CiAKLSAgICBUZXh0UnVuV2Fsa2VyIHdhbGtlcihydW4sIHBvaW50LngoKSwgdGhpcyk7Ci0g
ICAgd2Fsa2VyLnNldFdvcmRTcGFjaW5nQWRqdXN0bWVudCh3b3JkU3BhY2luZygpKTsKLSAgICB3
YWxrZXIuc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQobGV0dGVyU3BhY2luZygpKTsKLSAgICB3
YWxrZXIuc2V0UGFkZGluZyhydW4ucGFkZGluZygpKTsKKyAgICBDb21wbGV4VGV4dENvbnRyb2xs
ZXIgY29udHJvbGxlcihydW4sIHBvaW50LngoKSwgdGhpcyk7CisgICAgY29udHJvbGxlci5zZXRX
b3JkU3BhY2luZ0FkanVzdG1lbnQod29yZFNwYWNpbmcoKSk7CisgICAgY29udHJvbGxlci5zZXRM
ZXR0ZXJTcGFjaW5nQWRqdXN0bWVudChsZXR0ZXJTcGFjaW5nKCkpOworICAgIGNvbnRyb2xsZXIu
c2V0UGFkZGluZyhydW4ucGFkZGluZygpKTsKIAotICAgIHdoaWxlICh3YWxrZXIubmV4dFNjcmlw
dFJ1bigpKSB7CisgICAgd2hpbGUgKGNvbnRyb2xsZXIubmV4dFNjcmlwdFJ1bigpKSB7CiAgICAg
ICAgIGlmIChmaWxsKSB7Ci0gICAgICAgICAgICB3YWxrZXIuZm9udFBsYXRmb3JtRGF0YUZvclNj
cmlwdFJ1bigpLT5zZXR1cFBhaW50KCZmaWxsUGFpbnQpOworICAgICAgICAgICAgY29udHJvbGxl
ci5mb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCktPnNldHVwUGFpbnQoJmZpbGxQYWludCk7
CiAgICAgICAgICAgICBhZGp1c3RUZXh0UmVuZGVyTW9kZSgmZmlsbFBhaW50LCBnYy0+cGxhdGZv
cm1Db250ZXh0KCkpOwotICAgICAgICAgICAgY2FudmFzLT5kcmF3UG9zVGV4dEgod2Fsa2VyLmds
eXBocygpLCB3YWxrZXIubGVuZ3RoKCkgPDwgMSwgd2Fsa2VyLnhQb3NpdGlvbnMoKSwgcG9pbnQu
eSgpLCBmaWxsUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLT5kcmF3UG9zVGV4dEgoY29udHJv
bGxlci5nbHlwaHMoKSwgY29udHJvbGxlci5sZW5ndGgoKSA8PCAxLCBjb250cm9sbGVyLnhQb3Np
dGlvbnMoKSwgcG9pbnQueSgpLCBmaWxsUGFpbnQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYg
KHN0cm9rZSkgewotICAgICAgICAgICAgd2Fsa2VyLmZvbnRQbGF0Zm9ybURhdGFGb3JTY3JpcHRS
dW4oKS0+c2V0dXBQYWludCgmc3Ryb2tlUGFpbnQpOworICAgICAgICAgICAgY29udHJvbGxlci5m
b250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCktPnNldHVwUGFpbnQoJnN0cm9rZVBhaW50KTsK
ICAgICAgICAgICAgIGFkanVzdFRleHRSZW5kZXJNb2RlKCZzdHJva2VQYWludCwgZ2MtPnBsYXRm
b3JtQ29udGV4dCgpKTsKLSAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1Bvc1RleHRIKHdhbGtlci5n
bHlwaHMoKSwgd2Fsa2VyLmxlbmd0aCgpIDw8IDEsIHdhbGtlci54UG9zaXRpb25zKCksIHBvaW50
LnkoKSwgc3Ryb2tlUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLT5kcmF3UG9zVGV4dEgoY29u
dHJvbGxlci5nbHlwaHMoKSwgY29udHJvbGxlci5sZW5ndGgoKSA8PCAxLCBjb250cm9sbGVyLnhQ
b3NpdGlvbnMoKSwgcG9pbnQueSgpLCBzdHJva2VQYWludCk7CiAgICAgICAgIH0KICAgICB9CiB9
CkBAIC03MjQsMjcgKzIyOSwyNyBAQCB2b2lkIEZvbnQ6OmRyYXdFbXBoYXNpc01hcmtzRm9yQ29t
cGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiAvKiBjb250ZXh0ICovLCBjb25zdAogCiBmbG9hdCBG
b250OjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBIYXNoU2V0
PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIC8qIGZhbGxiYWNrRm9udHMgKi8sIEdseXBoT3ZlcmZs
b3cqIC8qIGdseXBoT3ZlcmZsb3cgKi8pIGNvbnN0CiB7Ci0gICAgVGV4dFJ1bldhbGtlciB3YWxr
ZXIocnVuLCAwLCB0aGlzKTsKLSAgICB3YWxrZXIuc2V0V29yZFNwYWNpbmdBZGp1c3RtZW50KHdv
cmRTcGFjaW5nKCkpOwotICAgIHdhbGtlci5zZXRMZXR0ZXJTcGFjaW5nQWRqdXN0bWVudChsZXR0
ZXJTcGFjaW5nKCkpOwotICAgIHJldHVybiB3YWxrZXIud2lkdGhPZkZ1bGxSdW4oKTsKKyAgICBD
b21wbGV4VGV4dENvbnRyb2xsZXIgY29udHJvbGxlcihydW4sIDAsIHRoaXMpOworICAgIGNvbnRy
b2xsZXIuc2V0V29yZFNwYWNpbmdBZGp1c3RtZW50KHdvcmRTcGFjaW5nKCkpOworICAgIGNvbnRy
b2xsZXIuc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQobGV0dGVyU3BhY2luZygpKTsKKyAgICBy
ZXR1cm4gY29udHJvbGxlci53aWR0aE9mRnVsbFJ1bigpOwogfQogCi1zdGF0aWMgaW50IGdseXBo
SW5kZXhGb3JYUG9zaXRpb25JblNjcmlwdFJ1bihjb25zdCBUZXh0UnVuV2Fsa2VyJiB3YWxrZXIs
IGludCB4KQorc3RhdGljIGludCBnbHlwaEluZGV4Rm9yWFBvc2l0aW9uSW5TY3JpcHRSdW4oY29u
c3QgQ29tcGxleFRleHRDb250cm9sbGVyJiBjb250cm9sbGVyLCBpbnQgeCkKIHsKLSAgICBjb25z
dCBIQl9GaXhlZCogYWR2YW5jZXMgPSB3YWxrZXIuYWR2YW5jZXMoKTsKLSAgICBpbnQgbGV0dGVy
U3BhY2luZyA9IHdhbGtlci5sZXR0ZXJTcGFjaW5nKCk7CisgICAgY29uc3QgSEJfRml4ZWQqIGFk
dmFuY2VzID0gY29udHJvbGxlci5hZHZhbmNlcygpOworICAgIGludCBsZXR0ZXJTcGFjaW5nID0g
Y29udHJvbGxlci5sZXR0ZXJTcGFjaW5nKCk7CiAgICAgaW50IGdseXBoSW5kZXg7Ci0gICAgaWYg
KHdhbGtlci5ydGwoKSkgewotICAgICAgICBmb3IgKGdseXBoSW5kZXggPSB3YWxrZXIubGVuZ3Ro
KCkgLSAxOyBnbHlwaEluZGV4ID49IDA7IC0tZ2x5cGhJbmRleCkgeworICAgIGlmIChjb250cm9s
bGVyLnJ0bCgpKSB7CisgICAgICAgIGZvciAoZ2x5cGhJbmRleCA9IGNvbnRyb2xsZXIubGVuZ3Ro
KCkgLSAxOyBnbHlwaEluZGV4ID49IDA7IC0tZ2x5cGhJbmRleCkgewogICAgICAgICAgICAgLy8g
V2hlbiBpdGVyYXRpbmcgTFRSIG92ZXIgUlRMIHRleHQsIHdlIG11c3QgaW5jbHVkZSB0aGUgd2hp
dGVzcGFjZQogICAgICAgICAgICAgLy8gX2JlZm9yZV8gdGhlIGdseXBoLCBzbyBubyArIDEgaGVy
ZS4KLSAgICAgICAgICAgIGlmICh4IDwgKHN0YXRpY19jYXN0PGludD4od2Fsa2VyLmxlbmd0aCgp
KSAtIGdseXBoSW5kZXgpICogbGV0dGVyU3BhY2luZyArIHRydW5jYXRlRml4ZWRQb2ludFRvSW50
ZWdlcihhZHZhbmNlc1tnbHlwaEluZGV4XSkpCisgICAgICAgICAgICBpZiAoeCA8IChzdGF0aWNf
Y2FzdDxpbnQ+KGNvbnRyb2xsZXIubGVuZ3RoKCkpIC0gZ2x5cGhJbmRleCkgKiBsZXR0ZXJTcGFj
aW5nICsgdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKGFkdmFuY2VzW2dseXBoSW5kZXhdKSkK
ICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIHggLT0gdHJ1bmNhdGVGaXhlZFBv
aW50VG9JbnRlZ2VyKGFkdmFuY2VzW2dseXBoSW5kZXhdKTsKICAgICAgICAgfQogICAgIH0gZWxz
ZSB7Ci0gICAgICAgIGZvciAoZ2x5cGhJbmRleCA9IDA7IHN0YXRpY19jYXN0PHVuc2lnbmVkPihn
bHlwaEluZGV4KSA8IHdhbGtlci5sZW5ndGgoKTsgKytnbHlwaEluZGV4KSB7CisgICAgICAgIGZv
ciAoZ2x5cGhJbmRleCA9IDA7IHN0YXRpY19jYXN0PHVuc2lnbmVkPihnbHlwaEluZGV4KSA8IGNv
bnRyb2xsZXIubGVuZ3RoKCk7ICsrZ2x5cGhJbmRleCkgewogICAgICAgICAgICAgaWYgKHggPCAo
Z2x5cGhJbmRleCAqIGxldHRlclNwYWNpbmcgKyB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIo
YWR2YW5jZXNbZ2x5cGhJbmRleF0pKSkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAg
ICAgIHggLT0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKGFkdmFuY2VzW2dseXBoSW5kZXhd
KTsKQEAgLTc2NCw5ICsyNjksOSBAQCBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21w
bGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHhGbG9hdCwKIAogICAgIC8vIChNYWMg
Y29kZSBpZ25vcmVzIGluY2x1ZGVQYXJ0aWFsR2x5cGhzLCBhbmQgdGhleSBkb24ndCBrbm93IHdo
YXQgaXQncwogICAgIC8vIHN1cHBvc2VkIHRvIGRvLCBzbyB3ZSBqdXN0IGlnbm9yZSBpdCBhcyB3
ZWxsLikKLSAgICBUZXh0UnVuV2Fsa2VyIHdhbGtlcihydW4sIDAsIHRoaXMpOwotICAgIHdhbGtl
ci5zZXRXb3JkU3BhY2luZ0FkanVzdG1lbnQod29yZFNwYWNpbmcoKSk7Ci0gICAgd2Fsa2VyLnNl
dExldHRlclNwYWNpbmdBZGp1c3RtZW50KGxldHRlclNwYWNpbmcoKSk7CisgICAgQ29tcGxleFRl
eHRDb250cm9sbGVyIGNvbnRyb2xsZXIocnVuLCAwLCB0aGlzKTsKKyAgICBjb250cm9sbGVyLnNl
dFdvcmRTcGFjaW5nQWRqdXN0bWVudCh3b3JkU3BhY2luZygpKTsKKyAgICBjb250cm9sbGVyLnNl
dExldHRlclNwYWNpbmdBZGp1c3RtZW50KGxldHRlclNwYWNpbmcoKSk7CiAKICAgICAvLyBJZiB0
aGlzIGlzIFJUTCB0ZXh0LCB0aGUgZmlyc3QgZ2x5cGggZnJvbSB0aGUgbGVmdCBpcyBhY3R1YWxs
eSB0aGUgbGFzdAogICAgIC8vIGNvZGUgcG9pbnQuIFNvIHdlIG5lZWQgdG8ga25vdyBob3cgbWFu
eSBjb2RlIHBvaW50cyB0aGVyZSBhcmUgdG90YWwgaW4KQEAgLTc3NSw3ICsyODAsNyBAQCBpbnQg
Rm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IGZsb2F0IHhGbG9hdCwKICAgICAvLyBJbiBMVFIgd2UgbGVhdmUgdGhpcyBhcyAwIHNvIHRoYXQg
d2UgZ2V0IHRoZSBjb3JyZWN0IHZhbHVlIGZvcgogICAgIC8vIHxiYXNlUG9zaXRpb258LCBiZWxv
dy4KICAgICB1bnNpZ25lZCB0b3RhbENvZGVQb2ludHMgPSAwOwotICAgIGlmICh3YWxrZXIucnRs
KCkpIHsKKyAgICBpZiAoY29udHJvbGxlci5ydGwoKSkgewogICAgICAgICBzc2l6ZV90IG9mZnNl
dCA9IDA7CiAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBydW4ubGVuZ3RoKCkpIHsKICAgICAgICAg
ICAgIHV0ZjE2X3RvX2NvZGVfcG9pbnQocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpLCAm
b2Zmc2V0KTsKQEAgLTc5OCwxNSArMzAzLDE1IEBAIGludCBGb250OjpvZmZzZXRGb3JQb3NpdGlv
bkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgeEZsb2F0LAogICAgIC8v
CiAgICAgLy8gRm9yIExUUiwgYmFzZVBvc2l0aW9uIGlzIHplcm8gc28gaXQgYWxyZWFkeSBwb2lu
dHMgdG8gdGhlIHN0YXJ0IG9mIHRoZQogICAgIC8vIGZpcnN0IHNjcmlwdCBydW4uCi0gICAgd2hp
bGUgKHdhbGtlci5uZXh0U2NyaXB0UnVuKCkpIHsKLSAgICAgICAgaWYgKHdhbGtlci5ydGwoKSkK
LSAgICAgICAgICAgIGJhc2VQb3NpdGlvbiAtPSB3YWxrZXIubnVtQ29kZVBvaW50cygpOworICAg
IHdoaWxlIChjb250cm9sbGVyLm5leHRTY3JpcHRSdW4oKSkgeworICAgICAgICBpZiAoY29udHJv
bGxlci5ydGwoKSkKKyAgICAgICAgICAgIGJhc2VQb3NpdGlvbiAtPSBjb250cm9sbGVyLm51bUNv
ZGVQb2ludHMoKTsKIAotICAgICAgICBpZiAoeCA+PSAwICYmIHN0YXRpY19jYXN0PHVuc2lnbmVk
Pih4KSA8IHdhbGtlci53aWR0aCgpKSB7CisgICAgICAgIGlmICh4ID49IDAgJiYgc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KHgpIDwgY29udHJvbGxlci53aWR0aCgpKSB7CiAgICAgICAgICAgICAvLyBU
aGUgeCB2YWx1ZSBpbiBxdWVzdGlvbiBpcyB3aXRoaW4gdGhpcyBzY3JpcHQgcnVuLiBXZSBjb25z
aWRlcgogICAgICAgICAgICAgLy8gZWFjaCBnbHlwaCBpbiBwcmVzZW50YXRpb24gb3JkZXIgYW5k
IHN0b3Agd2hlbiB3ZSBmaW5kIHRoZSBvbmUKICAgICAgICAgICAgIC8vIGNvdmVyaW5nIHRoaXMg
cG9zaXRpb24uCi0gICAgICAgICAgICBjb25zdCBpbnQgZ2x5cGhJbmRleCA9IGdseXBoSW5kZXhG
b3JYUG9zaXRpb25JblNjcmlwdFJ1bih3YWxrZXIsIHgpOworICAgICAgICAgICAgY29uc3QgaW50
IGdseXBoSW5kZXggPSBnbHlwaEluZGV4Rm9yWFBvc2l0aW9uSW5TY3JpcHRSdW4oY29udHJvbGxl
ciwgeCk7CiAKICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBnbHlwaCBpbmRleCwg
d2UgaGF2ZSB0byB0dXJuIHRoYXQgaW50byBhCiAgICAgICAgICAgICAvLyBjb2RlLXBvaW50IGlu
ZGV4LiBCZWNhdXNlIG9mIGxpZ2F0dXJlcywgc2V2ZXJhbCBjb2RlLXBvaW50cyBtYXkKQEAgLTgx
OCwxOSArMzIzLDE5IEBAIGludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0
KGNvbnN0IFRleHRSdW4mIHJ1biwgZmxvYXQgeEZsb2F0LAogICAgICAgICAgICAgLy8gdGhpcywg
d2UgdGFrZSBhbnkgY29kZSBwb2ludCB3aGljaCBjb250cmlidXRlZCB0byB0aGUgZ2x5cGggaW4K
ICAgICAgICAgICAgIC8vIHF1ZXN0aW9uLCBvciBhbnkgc3Vic2VxdWVudCBnbHlwaC4gSWYgd2Ug
cnVuIG9mZiB0aGUgZW5kLCB0aGVuCiAgICAgICAgICAgICAvLyB3ZSB0YWtlIHRoZSBsYXN0IGNv
ZGUgcG9pbnQuCi0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogbG9nID0gd2Fsa2Vy
LmxvZ0NsdXN0ZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgd2Fs
a2VyLm51bUNvZGVQb2ludHMoKTsgKytqKSB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBz
aG9ydCogbG9nID0gY29udHJvbGxlci5sb2dDbHVzdGVycygpOworICAgICAgICAgICAgZm9yICh1
bnNpZ25lZCBqID0gMDsgaiA8IGNvbnRyb2xsZXIubnVtQ29kZVBvaW50cygpOyArK2opIHsKICAg
ICAgICAgICAgICAgICBpZiAobG9nW2pdID49IGdseXBoSW5kZXgpCiAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBiYXNlUG9zaXRpb24gKyBqOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAg
ICByZXR1cm4gYmFzZVBvc2l0aW9uICsgd2Fsa2VyLm51bUNvZGVQb2ludHMoKSAtIDE7CisgICAg
ICAgICAgICByZXR1cm4gYmFzZVBvc2l0aW9uICsgY29udHJvbGxlci5udW1Db2RlUG9pbnRzKCkg
LSAxOwogICAgICAgICB9CiAKLSAgICAgICAgeCAtPSB3YWxrZXIud2lkdGgoKTsKKyAgICAgICAg
eCAtPSBjb250cm9sbGVyLndpZHRoKCk7CiAKLSAgICAgICAgaWYgKCF3YWxrZXIucnRsKCkpCi0g
ICAgICAgICAgICBiYXNlUG9zaXRpb24gKz0gd2Fsa2VyLm51bUNvZGVQb2ludHMoKTsKKyAgICAg
ICAgaWYgKCFjb250cm9sbGVyLnJ0bCgpKQorICAgICAgICAgICAgYmFzZVBvc2l0aW9uICs9IGNv
bnRyb2xsZXIubnVtQ29kZVBvaW50cygpOwogICAgIH0KIAogICAgIHJldHVybiBiYXNlUG9zaXRp
b247CkBAIC04NDIsNTQgKzM0Nyw1NCBAQCBGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZv
ckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaW50IGZyb20sIGludCB0bykgY29uc3QKIHsKICAgICBpbnQg
ZnJvbVggPSAtMSwgdG9YID0gLTEsIGZyb21BZHZhbmNlID0gLTEsIHRvQWR2YW5jZSA9IC0xOwot
ICAgIFRleHRSdW5XYWxrZXIgd2Fsa2VyKHJ1biwgMCwgdGhpcyk7Ci0gICAgd2Fsa2VyLnNldFdv
cmRTcGFjaW5nQWRqdXN0bWVudCh3b3JkU3BhY2luZygpKTsKLSAgICB3YWxrZXIuc2V0TGV0dGVy
U3BhY2luZ0FkanVzdG1lbnQobGV0dGVyU3BhY2luZygpKTsKKyAgICBDb21wbGV4VGV4dENvbnRy
b2xsZXIgY29udHJvbGxlcihydW4sIDAsIHRoaXMpOworICAgIGNvbnRyb2xsZXIuc2V0V29yZFNw
YWNpbmdBZGp1c3RtZW50KHdvcmRTcGFjaW5nKCkpOworICAgIGNvbnRyb2xsZXIuc2V0TGV0dGVy
U3BhY2luZ0FkanVzdG1lbnQobGV0dGVyU3BhY2luZygpKTsKIAogICAgIC8vIEJhc2Ugd2lsbCBw
b2ludCB0byB0aGUgeCBvZmZzZXQgZm9yIHRoZSBjdXJyZW50IHNjcmlwdCBydW4uIE5vdGUgdGhh
dCwgaW4KICAgICAvLyB0aGUgTFRSIGNhc2UsIHdpZHRoIHdpbGwgYmUgMC4KLSAgICBpbnQgYmFz
ZSA9IHdhbGtlci5ydGwoKSA/IHdhbGtlci53aWR0aE9mRnVsbFJ1bigpIDogMDsKKyAgICBpbnQg
YmFzZSA9IGNvbnRyb2xsZXIucnRsKCkgPyBjb250cm9sbGVyLndpZHRoT2ZGdWxsUnVuKCkgOiAw
OwogICAgIGNvbnN0IGludCBsZWZ0RWRnZSA9IGJhc2U7CiAKICAgICAvLyBXZSB3YW50IHRvIGVu
dW1lcmF0ZSB0aGUgc2NyaXB0IHJ1bnMgaW4gY29kZSBwb2ludCBvcmRlciBpbiB0aGUgZm9sbG93
aW5nCi0gICAgLy8gY29kZS4gVGhpcyBjYWxsIGFsc28gcmVzZXRzIHx3YWxrZXJ8LgotICAgIHdh
bGtlci5zZXRCYWNrd2FyZHNJdGVyYXRpb24oZmFsc2UpOworICAgIC8vIGNvZGUuIFRoaXMgY2Fs
bCBhbHNvIHJlc2V0cyB8Y29udHJvbGxlcnwuCisgICAgY29udHJvbGxlci5zZXRCYWNrd2FyZHNJ
dGVyYXRpb24oZmFsc2UpOwogCi0gICAgd2hpbGUgKHdhbGtlci5uZXh0U2NyaXB0UnVuKCkgJiYg
KGZyb21YID09IC0xIHx8IHRvWCA9PSAtMSkpIHsKLSAgICAgICAgLy8gVGV4dFJ1bldhbGtlciB3
aWxsIGhlbHBmdWxseSBhY2N1bHVsYXRlIHRoZSB4IG9mZnNldHMgZm9yIGRpZmZlcmVudAorICAg
IHdoaWxlIChjb250cm9sbGVyLm5leHRTY3JpcHRSdW4oKSAmJiAoZnJvbVggPT0gLTEgfHwgdG9Y
ID09IC0xKSkgeworICAgICAgICAvLyBDb21wbGV4VGV4dENvbnRyb2xsZXIgd2lsbCBoZWxwZnVs
bHkgYWNjdWx1bGF0ZSB0aGUgeCBvZmZzZXRzIGZvciBkaWZmZXJlbnQKICAgICAgICAgLy8gc2Ny
aXB0IHJ1bnMgZm9yIHVzLiBGb3IgdGhpcyBjb2RlLCBob3dldmVyLCB3ZSBhbHdheXMgd2FudCB0
aGUgeCBvZmZzZXRzCiAgICAgICAgIC8vIHRvIHN0YXJ0IGZyb20gemVybyBzbyB3ZSBjYWxsIHRo
aXMgYmVmb3JlIGVhY2ggc2NyaXB0IHJ1bi4KLSAgICAgICAgd2Fsa2VyLnNldFhPZmZzZXRUb1pl
cm8oKTsKKyAgICAgICAgY29udHJvbGxlci5zZXRYT2Zmc2V0VG9aZXJvKCk7CiAKLSAgICAgICAg
aWYgKHdhbGtlci5ydGwoKSkKLSAgICAgICAgICAgIGJhc2UgLT0gd2Fsa2VyLndpZHRoKCk7Cisg
ICAgICAgIGlmIChjb250cm9sbGVyLnJ0bCgpKQorICAgICAgICAgICAgYmFzZSAtPSBjb250cm9s
bGVyLndpZHRoKCk7CiAKLSAgICAgICAgaWYgKGZyb21YID09IC0xICYmIGZyb20gPj0gMCAmJiBz
dGF0aWNfY2FzdDx1bnNpZ25lZD4oZnJvbSkgPCB3YWxrZXIubnVtQ29kZVBvaW50cygpKSB7Cisg
ICAgICAgIGlmIChmcm9tWCA9PSAtMSAmJiBmcm9tID49IDAgJiYgc3RhdGljX2Nhc3Q8dW5zaWdu
ZWQ+KGZyb20pIDwgY29udHJvbGxlci5udW1Db2RlUG9pbnRzKCkpIHsKICAgICAgICAgICAgIC8v
IHxmcm9tfCBpcyB3aXRoaW4gdGhpcyBzY3JpcHQgcnVuLiBTbyB3ZSBpbmRleCB0aGUgY2x1c3Rl
cnMgbG9nIHRvCiAgICAgICAgICAgICAvLyBmaW5kIHdoaWNoIGdseXBoIHRoaXMgY29kZS1wb2lu
dCBjb250cmlidXRlZCB0byBhbmQgZmluZCBpdHMgeAogICAgICAgICAgICAgLy8gcG9zaXRpb24u
Ci0gICAgICAgICAgICBpbnQgZ2x5cGggPSB3YWxrZXIubG9nQ2x1c3RlcnMoKVtmcm9tXTsKLSAg
ICAgICAgICAgIGZyb21YID0gYmFzZSArIHdhbGtlci54UG9zaXRpb25zKClbZ2x5cGhdOwotICAg
ICAgICAgICAgZnJvbUFkdmFuY2UgPSB3YWxrZXIuYWR2YW5jZXMoKVtnbHlwaF07CisgICAgICAg
ICAgICBpbnQgZ2x5cGggPSBjb250cm9sbGVyLmxvZ0NsdXN0ZXJzKClbZnJvbV07CisgICAgICAg
ICAgICBmcm9tWCA9IGJhc2UgKyBjb250cm9sbGVyLnhQb3NpdGlvbnMoKVtnbHlwaF07CisgICAg
ICAgICAgICBmcm9tQWR2YW5jZSA9IGNvbnRyb2xsZXIuYWR2YW5jZXMoKVtnbHlwaF07CiAgICAg
ICAgIH0gZWxzZQotICAgICAgICAgICAgZnJvbSAtPSB3YWxrZXIubnVtQ29kZVBvaW50cygpOwor
ICAgICAgICAgICAgZnJvbSAtPSBjb250cm9sbGVyLm51bUNvZGVQb2ludHMoKTsKIAotICAgICAg
ICBpZiAodG9YID09IC0xICYmIHRvID49IDAgJiYgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRvKSA8
IHdhbGtlci5udW1Db2RlUG9pbnRzKCkpIHsKLSAgICAgICAgICAgIGludCBnbHlwaCA9IHdhbGtl
ci5sb2dDbHVzdGVycygpW3RvXTsKLSAgICAgICAgICAgIHRvWCA9IGJhc2UgKyB3YWxrZXIueFBv
c2l0aW9ucygpW2dseXBoXTsKLSAgICAgICAgICAgIHRvQWR2YW5jZSA9IHdhbGtlci5hZHZhbmNl
cygpW2dseXBoXTsKKyAgICAgICAgaWYgKHRvWCA9PSAtMSAmJiB0byA+PSAwICYmIHN0YXRpY19j
YXN0PHVuc2lnbmVkPih0bykgPCBjb250cm9sbGVyLm51bUNvZGVQb2ludHMoKSkgeworICAgICAg
ICAgICAgaW50IGdseXBoID0gY29udHJvbGxlci5sb2dDbHVzdGVycygpW3RvXTsKKyAgICAgICAg
ICAgIHRvWCA9IGJhc2UgKyBjb250cm9sbGVyLnhQb3NpdGlvbnMoKVtnbHlwaF07CisgICAgICAg
ICAgICB0b0FkdmFuY2UgPSBjb250cm9sbGVyLmFkdmFuY2VzKClbZ2x5cGhdOwogICAgICAgICB9
IGVsc2UKLSAgICAgICAgICAgIHRvIC09IHdhbGtlci5udW1Db2RlUG9pbnRzKCk7CisgICAgICAg
ICAgICB0byAtPSBjb250cm9sbGVyLm51bUNvZGVQb2ludHMoKTsKIAotICAgICAgICBpZiAoIXdh
bGtlci5ydGwoKSkKLSAgICAgICAgICAgIGJhc2UgKz0gd2Fsa2VyLndpZHRoKCk7CisgICAgICAg
IGlmICghY29udHJvbGxlci5ydGwoKSkKKyAgICAgICAgICAgIGJhc2UgKz0gY29udHJvbGxlci53
aWR0aCgpOwogICAgIH0KIAogICAgIC8vIFRoZSBwb3NpdGlvbiBpbiBxdWVzdGlvbiBtaWdodCBi
ZSBqdXN0IGFmdGVyIHRoZSB0ZXh0LgogICAgIGNvbnN0IGludCByaWdodEVkZ2UgPSBiYXNlOwog
ICAgIGlmIChmcm9tWCA9PSAtMSAmJiAhZnJvbSkKICAgICAgICAgZnJvbVggPSBsZWZ0RWRnZTsK
LSAgICBlbHNlIGlmICh3YWxrZXIucnRsKCkpCisgICAgZWxzZSBpZiAoY29udHJvbGxlci5ydGwo
KSkKICAgICAgICBmcm9tWCArPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIoZnJvbUFkdmFu
Y2UpOwogCiAgICAgaWYgKHRvWCA9PSAtMSAmJiAhdG8pCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78050</attachid>
            <date>2011-01-05 14:52:23 -0800</date>
            <delta_ts>2011-01-05 14:55:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-51956-20110105145222.patch</filename>
            <type>text/plain</type>
            <size>62321</size>
            <attacher name="Evan Martin">evan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NjQxMmNjNWExYmJlN2FiYWY3ZDhlYWQ0NWNiNWY0MjJhMWYwYzcxYS4uOTBiZDU3NGY0YzMwNDI2
NThlNWRkZmZlNjg1MjE3OWMxMTU5YzY5YiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1OCBAQAorMjAxMS0wMS0wNSAgRXZh
biBNYXJ0aW4gIDxldmFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBbY2hyb21pdW1dIHJlZmFjdG9yIGNvbXBsZXggdGV4dCBv
biBMaW51eAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NTE5NTYKKworICAgICAgICBQdWxsIG91dCBUZXh0UnVuV2Fsa2VyIGZyb20gRm9udExpbnV4LmNw
cC4gIFB1dCBpdCBpbiBpdHMgb3duIGZpbGUuCisgICAgICAgIFJlbmFtZSBpdCB0byBDb21wbGV4
VGV4dENvbnRyb2xsZXIsIHRvIG1hdGNoIHBsYXRmb3JtL2dyYXBoaWNzL21hYworICAgICAgICBt
b3JlIGNsb3NlbHkuCisKKyAgICAgICAgTm8gdGVzdHMgYmVjYXVzZSB0aGUgY2hhbmdlIGlzIGp1
c3QgcmVuYW1pbmcgYSBjbGFzcy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwL1dlYkNvcmUuZ3lw
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJv
bGxlckxpbnV4LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRy
b2xsZXI6OkNvbXBsZXhUZXh0Q29udHJvbGxlcik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
VGV4dENvbnRyb2xsZXI6On5Db21wbGV4VGV4dENvbnRyb2xsZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjppc1dvcmRCcmVhayk6CisgICAgICAgIChXZWJDb3Jl
OjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRldGVybWluZVdvcmRCcmVha1NwYWNpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXRQYWRkaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6cmVzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXRCYWNrd2FyZHNJdGVyYXRpb24pOgorICAg
ICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpuZXh0U2NyaXB0UnVuKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6d2lkdGhPZkZ1bGxSdW4pOgor
ICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpzZXR1cEZvbnRGb3JTY3Jp
cHRSdW4pOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjphbGxvY0hh
cmZidXp6Rm9udCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRl
bGV0ZUdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxl
cjo6Y3JlYXRlR2x5cGhBcnJheXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250
cm9sbGVyOjpyZXNldEdseXBoQXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0
Q29udHJvbGxlcjo6c2hhcGVHbHlwaHMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRD
b250cm9sbGVyOjpzZXRHbHlwaFhQb3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxl
eFRleHRDb250cm9sbGVyOjpub3JtYWxpemVTcGFjZXNBbmRNaXJyb3JDaGFycyk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdldE5vcm1hbGl6ZWRUZXh0UnVuKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xs
ZXJMaW51eC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxl
cjo6c2V0V29yZFNwYWNpbmdBZGp1c3RtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhU
ZXh0Q29udHJvbGxlcjo6c2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpsZXR0ZXJTcGFjaW5nKToKKyAgICAgICAgKFdl
YkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2V0WE9mZnNldFRvWmVybyk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OnJ0bCk6CisgICAgICAgIChXZWJDb3Jl
OjpDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdseXBocyk6CisgICAgICAgIChXZWJDb3JlOjpDb21w
bGV4VGV4dENvbnRyb2xsZXI6Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4
dENvbnRyb2xsZXI6OnhQb3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRD
b250cm9sbGVyOjphZHZhbmNlcyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4VGV4dENvbnRy
b2xsZXI6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6
bG9nQ2x1c3RlcnMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGxleFRleHRDb250cm9sbGVyOjpu
dW1Db2RlUG9pbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBsZXhUZXh0Q29udHJvbGxlcjo6
Zm9udFBsYXRmb3JtRGF0YUZvclNjcmlwdFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpDb21wbGV4
VGV4dENvbnRyb2xsZXI6OmlzQ29kZXBvaW50U3BhY2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Ojpk
cmF3Q29tcGxleFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZmxvYXRXaWR0aEZvckNv
bXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OmdseXBoSW5kZXhGb3JYUG9zaXRpb25JblNj
cmlwdFJ1bik6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNv
bXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21w
bGV4VGV4dCk6CisKIDIwMTEtMDEtMDQgIFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5ib3RA
Z21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHI3NDk5Mi4KZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAgYi9XZWJDb3JlL1dlYkNv
cmUuZ3lwL1dlYkNvcmUuZ3lwCmluZGV4IDUwYmRiZjA3ZTA2NGQ2ODcwMmY3YzNkZDVhMjVmZWQz
OGZlNjZlYWIuLmM5MzY3OTMzMzcxZmE4NWJkMjhmMzRmZTU0MDVkZmU5YmY3NmJiMmQgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKKysrIGIvV2ViQ29yZS9XZWJD
b3JlLmd5cC9XZWJDb3JlLmd5cApAQCAtMTA5OSw2ICsxMDk5LDcgQEAKICAgICAgICAgICAnc291
cmNlcy8nOiBbCiAgICAgICAgICAgICAjIENoZXJyeS1waWNrIGZpbGVzIGV4Y2x1ZGVkIGJ5IHRo
ZSBicm9hZGVyIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYWJvdmUuCiAgICAgICAgICAgICBbJ2luY2x1
ZGUnLCAncGxhdGZvcm0vY2hyb21pdW0vS2V5Q29kZUNvbnZlcnNpb25HdGtcXC5jcHAkJ10sCisg
ICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxl
eFRleHRDb250cm9sbGVyTGludXhcXC5jcHAkJ10sCiAgICAgICAgICAgICBbJ2luY2x1ZGUnLCAn
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlTGludXhcXC5jcHAkJ10sCiAgICAg
ICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4
XFwuY3BwJCddLAogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eFxcLmNwcCQnXSwKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvV2ViQ29yZS5neXBpIGIvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggZGZiZjg2ZTY4ZjJh
Y2RhMDY4ZGJhYWIxYzAxNThhNzVhNGIyMmVmMC4uODA2YWI5NWEwNjMxYTYzYzMzZGQ2MjU5ZDY3
MTMzYzYwZDJmMzE3YiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkKQEAgLTI1NTUsMTIgKzI1NTUsMTMgQEAKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzTGF5ZXJDaHJvbWl1bS5j
cHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhc0xheWVy
Q2hyb21pdW0uaCcsCi0gICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRHJh
d2luZ0J1ZmZlckNocm9taXVtLmNwcCcsCi0gICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vRXh0ZW5zaW9uczNEQ2hyb21pdW0uaCcsCisgICAgICAgICAgICAncGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguY3BwJywKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db250ZW50TGF5ZXJDaHJvbWl1bS5j
cHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbnRlbnRMYXll
ckNocm9taXVtLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0Ny
b3NzUHJvY2Vzc0ZvbnRMb2FkaW5nLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0Nyb3NzUHJvY2Vzc0ZvbnRMb2FkaW5nLm1tJywKKyAgICAgICAgICAgICdwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9EcmF3aW5nQnVmZmVyQ2hyb21pdW0uY3BwJywKKyAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9FeHRlbnNpb25zM0RDaHJvbWl1bS5o
JywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250Q2FjaGVDaHJv
bWl1bVdpbi5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0Zv
bnRDYWNoZUxpbnV4LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vRm9udENocm9taXVtV2luLmNwcCcsCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4LmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmI1ZWRhOTMyNWFiNGY2NjU4MTJjNDhhYzExMDdiNmEzYWZjNTIzMzEKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBs
ZXhUZXh0Q29udHJvbGxlckxpbnV4LmNwcApAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqIENvcHly
aWdodCAoYykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRp
b24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMg
SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisg
KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJDb21wbGV4VGV4dENvbnRyb2xsZXJMaW51eC5oIgorCisjaW5jbHVk
ZSAiRm9udC5oIgorCisjaW5jbHVkZSA8dW5pY29kZS9ub3JtbHpyLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworLy8gSGFyZmJ1enogdXNlcyAyNi42IGZpeGVkIHBvaW50IHZhbHVlcyBmb3Ig
cGl4ZWwgb2Zmc2V0cy4gSG93ZXZlciwgd2UgZG9uJ3QKKy8vIGhhbmRsZSBzdWJwaXhlbCBwb3Np
dGlvbmluZyBzbyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdHJ1bmNhdGUgSGFyZmJ1enoKKy8v
IHZhbHVlcyB0byBhIG51bWJlciBvZiBwaXhlbHMuCitzdGF0aWMgaW50IHRydW5jYXRlRml4ZWRQ
b2ludFRvSW50ZWdlcihIQl9GaXhlZCB2YWx1ZSkKK3sKKyAgICByZXR1cm4gdmFsdWUgPj4gNjsK
K30KKworQ29tcGxleFRleHRDb250cm9sbGVyOjpDb21wbGV4VGV4dENvbnRyb2xsZXIoY29uc3Qg
VGV4dFJ1biYgcnVuLCB1bnNpZ25lZCBzdGFydGluZ1gsIGNvbnN0IEZvbnQqIGZvbnQpCisgICAg
OiBtX2ZvbnQoZm9udCkKKyAgICAsIG1fc3RhcnRpbmdYKHN0YXJ0aW5nWCkKKyAgICAsIG1fb2Zm
c2V0WChtX3N0YXJ0aW5nWCkKKyAgICAsIG1fcnVuKGdldE5vcm1hbGl6ZWRUZXh0UnVuKHJ1biwg
bV9ub3JtYWxpemVkUnVuLCBtX25vcm1hbGl6ZWRCdWZmZXIpKQorICAgICwgbV9pdGVyYXRlQmFj
a3dhcmRzKG1fcnVuLnJ0bCgpKQorICAgICwgbV93b3JkU3BhY2luZ0FkanVzdG1lbnQoMCkKKyAg
ICAsIG1fcGFkZGluZygwKQorICAgICwgbV9wYWRQZXJXb3JkQnJlYWsoMCkKKyAgICAsIG1fcGFk
RXJyb3IoMCkKKyAgICAsIG1fbGV0dGVyU3BhY2luZygwKQoreworICAgIC8vIERvIG5vdCB1c2Ug
fHJ1bnwgaW5zaWRlIHRoaXMgY29uc3RydWN0b3IuIFVzZSB8bV9ydW58IGluc3RlYWQuCisKKyAg
ICBtZW1zZXQoJm1faXRlbSwgMCwgc2l6ZW9mKG1faXRlbSkpOworICAgIC8vIFdlIGNhbm5vdCBr
bm93LCBhaGVhZCBvZiB0aW1lLCBob3cgbWFueSBnbHlwaHMgYSBnaXZlbiBzY3JpcHQgcnVuCisg
ICAgLy8gd2lsbCBwcm9kdWNlLiBXZSB0YWtlIGEgZ3Vlc3MgdGhhdCBzY3JpcHQgcnVucyB3aWxs
IG5vdCBwcm9kdWNlIG1vcmUKKyAgICAvLyB0aGFuIHR3aWNlIGFzIG1hbnkgZ2x5cGhzIGFzIHRo
ZXJlIGFyZSBjb2RlIHBvaW50cyBwbHVzIGEgYml0IG9mCisgICAgLy8gcGFkZGluZyBhbmQgZmFs
bGJhY2sgaWYgd2UgZmluZCB0aGF0IHdlIGFyZSB3cm9uZy4KKyAgICBjcmVhdGVHbHlwaEFycmF5
cygobV9ydW4ubGVuZ3RoKCkgKyAyKSAqIDIpOworCisgICAgbV9pdGVtLmxvZ19jbHVzdGVycyA9
IG5ldyB1bnNpZ25lZCBzaG9ydFttX3J1bi5sZW5ndGgoKV07CisKKyAgICBtX2l0ZW0uZmFjZSA9
IDA7CisgICAgbV9pdGVtLmZvbnQgPSBhbGxvY0hhcmZidXp6Rm9udCgpOworCisgICAgbV9pdGVt
Lml0ZW0uYmlkaUxldmVsID0gbV9ydW4ucnRsKCk7CisKKyAgICBtX2l0ZW0uc3RyaW5nID0gbV9y
dW4uY2hhcmFjdGVycygpOworICAgIG1faXRlbS5zdHJpbmdMZW5ndGggPSBtX3J1bi5sZW5ndGgo
KTsKKworICAgIHJlc2V0KCk7Cit9CisKK0NvbXBsZXhUZXh0Q29udHJvbGxlcjo6fkNvbXBsZXhU
ZXh0Q29udHJvbGxlcigpCit7CisgICAgZmFzdEZyZWUobV9pdGVtLmZvbnQpOworICAgIGRlbGV0
ZUdseXBoQXJyYXlzKCk7CisgICAgZGVsZXRlW10gbV9pdGVtLmxvZ19jbHVzdGVyczsKK30KKwor
Ym9vbCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmlzV29yZEJyZWFrKHVuc2lnbmVkIGluZGV4KQor
eworICAgIHJldHVybiBpbmRleCAmJiBpc0NvZGVwb2ludFNwYWNlKG1faXRlbS5zdHJpbmdbaW5k
ZXhdKSAmJiAhaXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3RyaW5nW2luZGV4IC0gMV0pOworfQor
CitpbnQgQ29tcGxleFRleHRDb250cm9sbGVyOjpkZXRlcm1pbmVXb3JkQnJlYWtTcGFjaW5nKHVu
c2lnbmVkIGxvZ0NsdXN0ZXJzSW5kZXgpCit7CisgICAgaW50IHdvcmRCcmVha1NwYWNpbmcgPSAw
OworICAgIC8vIFRoZSBmaXJzdCBoYWxmIG9mIHRoZSBjb25qdW5jdGlvbiB3b3JrcyBhcm91bmQg
dGhlIGNhc2Ugd2hlcmUKKyAgICAvLyBvdXRwdXQgZ2x5cGhzIGFyZW4ndCBhc3NvY2lhdGVkIHdp
dGggYW55IGNvZGVwb2ludHMgYnkgdGhlCisgICAgLy8gY2x1c3RlcnMgbG9nLgorICAgIGlmIChs
b2dDbHVzdGVyc0luZGV4IDwgbV9pdGVtLml0ZW0ubGVuZ3RoCisgICAgICAgICYmIGlzV29yZEJy
ZWFrKG1faXRlbS5pdGVtLnBvcyArIGxvZ0NsdXN0ZXJzSW5kZXgpKSB7CisgICAgICAgIHdvcmRC
cmVha1NwYWNpbmcgPSBtX3dvcmRTcGFjaW5nQWRqdXN0bWVudDsKKworICAgICAgICBpZiAobV9w
YWRkaW5nID4gMCkgeworICAgICAgICAgICAgaW50IHRvUGFkID0gcm91bmRmKG1fcGFkUGVyV29y
ZEJyZWFrICsgbV9wYWRFcnJvcik7CisgICAgICAgICAgICBtX3BhZEVycm9yICs9IG1fcGFkUGVy
V29yZEJyZWFrIC0gdG9QYWQ7CisKKyAgICAgICAgICAgIGlmIChtX3BhZGRpbmcgPCB0b1BhZCkK
KyAgICAgICAgICAgICAgICB0b1BhZCA9IG1fcGFkZGluZzsKKyAgICAgICAgICAgIG1fcGFkZGlu
ZyAtPSB0b1BhZDsKKyAgICAgICAgICAgIHdvcmRCcmVha1NwYWNpbmcgKz0gdG9QYWQ7CisgICAg
ICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHdvcmRCcmVha1NwYWNpbmc7Cit9CisKKy8vIHNldFBh
ZGRpbmcgc2V0cyBhIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZGlzdHJpYnV0ZWQgYWNyb3NzIHRo
ZSBUZXh0UnVuLgorLy8gV2ViS2l0IHVzZXMgdGhpcyB0byBqdXN0aWZ5IHRleHQuCit2b2lkIENv
bXBsZXhUZXh0Q29udHJvbGxlcjo6c2V0UGFkZGluZyhpbnQgcGFkZGluZykKK3sKKyAgICBtX3Bh
ZGRpbmcgPSBwYWRkaW5nOworICAgIGlmICghbV9wYWRkaW5nKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBJZiB3ZSBoYXZlIHBhZGRpbmcgdG8gZGlzdHJpYnV0ZSwgdGhlbiB3ZSB0cnkgdG8g
Z2l2ZSBhbiBlcXVhbAorICAgIC8vIGFtb3VudCB0byBlYWNoIHNwYWNlLiBUaGUgbGFzdCBzcGFj
ZSBnZXRzIHRoZSBzbWFsbGVyIGFtb3VudCwgaWYKKyAgICAvLyBhbnkuCisgICAgdW5zaWduZWQg
bnVtV29yZEJyZWFrcyA9IDA7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9pdGVt
LnN0cmluZ0xlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChpc1dvcmRCcmVhayhpKSkKKyAgICAg
ICAgICAgIG51bVdvcmRCcmVha3MrKzsKKyAgICB9CisKKyAgICBpZiAobnVtV29yZEJyZWFrcykK
KyAgICAgICAgbV9wYWRQZXJXb3JkQnJlYWsgPSBtX3BhZGRpbmcgLyBudW1Xb3JkQnJlYWtzOwor
ICAgIGVsc2UKKyAgICAgICAgbV9wYWRQZXJXb3JkQnJlYWsgPSAwOworfQorCit2b2lkIENvbXBs
ZXhUZXh0Q29udHJvbGxlcjo6cmVzZXQoKQoreworICAgIGlmIChtX2l0ZXJhdGVCYWNrd2FyZHMp
CisgICAgICAgIG1faW5kZXhPZk5leHRTY3JpcHRSdW4gPSBtX3J1bi5sZW5ndGgoKSAtIDE7Cisg
ICAgZWxzZQorICAgICAgICBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gMDsKKyAgICBtX29mZnNl
dFggPSBtX3N0YXJ0aW5nWDsKK30KKwordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNldEJh
Y2t3YXJkc0l0ZXJhdGlvbihib29sIGlzQmFja3dhcmRzKQoreworICAgIG1faXRlcmF0ZUJhY2t3
YXJkcyA9IGlzQmFja3dhcmRzOworICAgIHJlc2V0KCk7Cit9CisKKy8vIEFkdmFuY2UgdG8gdGhl
IG5leHQgc2NyaXB0IHJ1biwgcmV0dXJuaW5nIGZhbHNlIHdoZW4gdGhlIGVuZCBvZiB0aGUKKy8v
IFRleHRSdW4gaGFzIGJlZW4gcmVhY2hlZC4KK2Jvb2wgQ29tcGxleFRleHRDb250cm9sbGVyOjpu
ZXh0U2NyaXB0UnVuKCkKK3sKKyAgICBpZiAobV9pdGVyYXRlQmFja3dhcmRzKSB7CisgICAgICAg
IC8vIEluIHJpZ2h0LXRvLWxlZnQgbW9kZSB3ZSBuZWVkIHRvIHJlbmRlciB0aGUgc2hhcGVkIGds
eXBoIGJhY2t3YXJkcyBhbmQKKyAgICAgICAgLy8gYWxzbyByZW5kZXIgdGhlIHNjcmlwdCBydW5z
IHRoZW1zZWx2ZXMgYmFja3dhcmRzLiBTbyBnaXZlbiBhIFRleHRSdW46CisgICAgICAgIC8vICAg
IEFBQUFBQUFDVFRUVFRUVCAgIChBID0gQXJhYmljLCBDID0gQ29tbW9uLCBUID0gVGhhaSkKKyAg
ICAgICAgLy8gd2UgcmVuZGVyOgorICAgICAgICAvLyAgICBUVFRUVFRDQUFBQUFBQQorICAgICAg
ICAvLyAoYW5kIHRoZSBnbHlwaHMgaW4gZWFjaCBBLCBDIGFuZCBUIHNlY3Rpb24gYXJlIGJhY2t3
YXJkcyB0b28pCisgICAgICAgIGlmICghaGJfdXRmMTZfc2NyaXB0X3J1bl9wcmV2KCZtX251bUNv
ZGVQb2ludHMsICZtX2l0ZW0uaXRlbSwgbV9ydW4uY2hhcmFjdGVycygpLCBtX3J1bi5sZW5ndGgo
KSwgJm1faW5kZXhPZk5leHRTY3JpcHRSdW4pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBtX2N1cnJlbnRGb250RGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVy
KG1faXRlbS5zdHJpbmdbbV9pdGVtLml0ZW0ucG9zXSwgZmFsc2UpLmZvbnREYXRhOworICAgIH0g
ZWxzZSB7CisgICAgICAgIGlmICghaGJfdXRmMTZfc2NyaXB0X3J1bl9uZXh0KCZtX251bUNvZGVQ
b2ludHMsICZtX2l0ZW0uaXRlbSwgbV9ydW4uY2hhcmFjdGVycygpLCBtX3J1bi5sZW5ndGgoKSwg
Jm1faW5kZXhPZk5leHRTY3JpcHRSdW4pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgIC8vIEl0IGlzIGFjdHVhbGx5IHdyb25nIHRvIGNvbnNpZGVyIHNjcmlwdCBydW5zIGF0
IGFsbCBpbiB0aGlzIGNvZGUuCisgICAgICAgIC8vIE90aGVyIFdlYktpdCBjb2RlIChlLmcuIE1h
Yykgc2VnbWVudHMgY29tcGxleCB0ZXh0IGp1c3QgYnkgZmluZGluZworICAgICAgICAvLyB0aGUg
bG9uZ2VzdCBzcGFuIG9mIHRleHQgY292ZXJlZCBieSBhIHNpbmdsZSBmb250LgorICAgICAgICAv
LyBCdXQgd2UgY3VycmVudGx5IG5lZWQgdG8gY2FsbCBoYl91dGYxNl9zY3JpcHRfcnVuX25leHQg
YW55d2F5IHRvIGZpbGwKKyAgICAgICAgLy8gaW4gdGhlIGhhcmZidXp6IGRhdGEgc3RydWN0dXJl
cyB0byBlLmcuIHBpY2sgdGhlIGNvcnJlY3Qgc2NyaXB0J3Mgc2hhcGVyLgorICAgICAgICAvLyBT
byB3ZSBhbGxvdyB0aGF0IHRvIHJ1biBmaXJzdCwgdGhlbiBkbyBhIHNlY29uZCBwYXNzIG92ZXIg
dGhlIHJhbmdlIGl0CisgICAgICAgIC8vIGZvdW5kIGFuZCB0YWtlIHRoZSBsYXJnZXN0IHN1YnJl
Z2lvbiB0aGF0IHN0YXlzIHdpdGhpbiBhIHNpbmdsZSBmb250LgorICAgICAgICBtX2N1cnJlbnRG
b250RGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKG1faXRlbS5zdHJpbmdbbV9p
dGVtLml0ZW0ucG9zXSwgZmFsc2UpLmZvbnREYXRhOworICAgICAgICB1bnNpZ25lZCBlbmRPZlJ1
bjsKKyAgICAgICAgZm9yIChlbmRPZlJ1biA9IDE7IGVuZE9mUnVuIDwgbV9pdGVtLml0ZW0ubGVu
Z3RoOyArK2VuZE9mUnVuKSB7CisgICAgICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbmV4
dEZvbnREYXRhID0gbV9mb250LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIobV9pdGVtLnN0cmluZ1tt
X2l0ZW0uaXRlbS5wb3MgKyBlbmRPZlJ1bl0sIGZhbHNlKS5mb250RGF0YTsKKyAgICAgICAgICAg
IGlmIChuZXh0Rm9udERhdGEgIT0gbV9jdXJyZW50Rm9udERhdGEpCisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbV9pdGVtLml0ZW0ubGVuZ3RoID0gZW5kT2ZSdW47
CisgICAgICAgIG1faW5kZXhPZk5leHRTY3JpcHRSdW4gPSBtX2l0ZW0uaXRlbS5wb3MgKyBlbmRP
ZlJ1bjsKKyAgICB9CisKKyAgICBzZXR1cEZvbnRGb3JTY3JpcHRSdW4oKTsKKyAgICBzaGFwZUds
eXBocygpOworICAgIHNldEdseXBoWFBvc2l0aW9ucyhydGwoKSk7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworZmxvYXQgQ29tcGxleFRleHRDb250cm9sbGVyOjp3aWR0aE9mRnVsbFJ1bigpCit7
CisgICAgZmxvYXQgd2lkdGhTdW0gPSAwOworICAgIHdoaWxlIChuZXh0U2NyaXB0UnVuKCkpCisg
ICAgICAgIHdpZHRoU3VtICs9IHdpZHRoKCk7CisKKyAgICByZXR1cm4gd2lkdGhTdW07Cit9CisK
K3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpzZXR1cEZvbnRGb3JTY3JpcHRSdW4oKQorewor
ICAgIGNvbnN0IEZvbnREYXRhKiBmb250RGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFj
dGVyKG1faXRlbS5zdHJpbmdbbV9pdGVtLml0ZW0ucG9zXSwgZmFsc2UpLmZvbnREYXRhOworICAg
IGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZvbnREYXRhLT5mb250RGF0
YUZvckNoYXJhY3RlcignICcpLT5wbGF0Zm9ybURhdGEoKTsKKyAgICBtX2l0ZW0uZmFjZSA9IHBs
YXRmb3JtRGF0YS5oYXJmYnV6ekZhY2UoKTsKKyAgICB2b2lkKiBvcGFxdWVQbGF0Zm9ybURhdGEg
PSBjb25zdF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPigmcGxhdGZvcm1EYXRhKTsKKyAgICBtX2l0
ZW0uZm9udC0+dXNlckRhdGEgPSBvcGFxdWVQbGF0Zm9ybURhdGE7Cit9CisKK0hCX0ZvbnRSZWMq
IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6YWxsb2NIYXJmYnV6ekZvbnQoKQoreworICAgIEhCX0Zv
bnRSZWMqIGZvbnQgPSByZWludGVycHJldF9jYXN0PEhCX0ZvbnRSZWMqPihmYXN0TWFsbG9jKHNp
emVvZihIQl9Gb250UmVjKSkpOworICAgIG1lbXNldChmb250LCAwLCBzaXplb2YoSEJfRm9udFJl
YykpOworICAgIGZvbnQtPmtsYXNzID0gJmhhcmZidXp6U2tpYUNsYXNzOworICAgIGZvbnQtPnVz
ZXJEYXRhID0gMDsKKyAgICAvLyBUaGUgdmFsdWVzIHdoaWNoIGhhcmZidXp6U2tpYUNsYXNzIHJl
dHVybnMgYXJlIGFscmVhZHkgc2NhbGVkIHRvCisgICAgLy8gcGl4ZWwgdW5pdHMsIHNvIHdlIGp1
c3Qgc2V0IGFsbCB0aGVzZSB0byBvbmUgdG8gZGlzYWJsZSBmdXJ0aGVyCisgICAgLy8gc2NhbGlu
Zy4KKyAgICBmb250LT54X3BwZW0gPSAxOworICAgIGZvbnQtPnlfcHBlbSA9IDE7CisgICAgZm9u
dC0+eF9zY2FsZSA9IDE7CisgICAgZm9udC0+eV9zY2FsZSA9IDE7CisKKyAgICByZXR1cm4gZm9u
dDsKK30KKwordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRlbGV0ZUdseXBoQXJyYXlzKCkK
K3sKKyAgICBkZWxldGVbXSBtX2l0ZW0uZ2x5cGhzOworICAgIGRlbGV0ZVtdIG1faXRlbS5hdHRy
aWJ1dGVzOworICAgIGRlbGV0ZVtdIG1faXRlbS5hZHZhbmNlczsKKyAgICBkZWxldGVbXSBtX2l0
ZW0ub2Zmc2V0czsKKyAgICBkZWxldGVbXSBtX2dseXBoczE2OworICAgIGRlbGV0ZVtdIG1feFBv
c2l0aW9uczsKK30KKwordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmNyZWF0ZUdseXBoQXJy
YXlzKGludCBzaXplKQoreworICAgIG1faXRlbS5nbHlwaHMgPSBuZXcgSEJfR2x5cGhbc2l6ZV07
CisgICAgbV9pdGVtLmF0dHJpYnV0ZXMgPSBuZXcgSEJfR2x5cGhBdHRyaWJ1dGVzW3NpemVdOwor
ICAgIG1faXRlbS5hZHZhbmNlcyA9IG5ldyBIQl9GaXhlZFtzaXplXTsKKyAgICBtX2l0ZW0ub2Zm
c2V0cyA9IG5ldyBIQl9GaXhlZFBvaW50W3NpemVdOworCisgICAgbV9nbHlwaHMxNiA9IG5ldyB1
aW50MTZfdFtzaXplXTsKKyAgICBtX3hQb3NpdGlvbnMgPSBuZXcgU2tTY2FsYXJbc2l6ZV07CisK
KyAgICBtX2l0ZW0ubnVtX2dseXBocyA9IHNpemU7CisgICAgbV9nbHlwaHNBcnJheUNhcGFjaXR5
ID0gc2l6ZTsgLy8gU2F2ZSB0aGUgR2x5cGhBcnJheXMgc2l6ZS4KKyAgICByZXNldEdseXBoQXJy
YXlzKCk7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpyZXNldEdseXBoQXJyYXlz
KCkKK3sKKyAgICBpbnQgc2l6ZSA9IG1faXRlbS5udW1fZ2x5cGhzOworICAgIC8vIEFsbCB0aGUg
dHlwZXMgaGVyZSBkb24ndCBoYXZlIHBvaW50ZXJzLiBJdCBpcyBzYWZlIHRvIHJlc2V0IHRvCisg
ICAgLy8gemVybyB1bmxlc3MgSGFyZmJ1enogYnJlYWtzIHRoZSBjb21wYXRpYmlsaXR5IGluIHRo
ZSBmdXR1cmUuCisgICAgbWVtc2V0KG1faXRlbS5nbHlwaHMsIDAsIHNpemUgKiBzaXplb2YoSEJf
R2x5cGgpKTsKKyAgICBtZW1zZXQobV9pdGVtLmF0dHJpYnV0ZXMsIDAsIHNpemUgKiBzaXplb2Yo
SEJfR2x5cGhBdHRyaWJ1dGVzKSk7CisgICAgbWVtc2V0KG1faXRlbS5hZHZhbmNlcywgMCwgc2l6
ZSAqIHNpemVvZihIQl9GaXhlZCkpOworICAgIG1lbXNldChtX2l0ZW0ub2Zmc2V0cywgMCwgc2l6
ZSAqIHNpemVvZihIQl9GaXhlZFBvaW50KSk7CisgICAgbWVtc2V0KG1fZ2x5cGhzMTYsIDAsIHNp
emUgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICBtZW1zZXQobV94UG9zaXRpb25zLCAwLCBzaXpl
ICogc2l6ZW9mKFNrU2NhbGFyKSk7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpz
aGFwZUdseXBocygpCit7CisgICAgLy8gSEJfU2hhcGVJdGVtKCkgcmVzZXRzIG1faXRlbS5udW1f
Z2x5cGhzLiBJZiB0aGUgcHJldmlvdXMgY2FsbCB0bworICAgIC8vIEhCX1NoYXBlSXRlbSgpIHVz
ZWQgbGVzcyBzcGFjZSB0aGFuIHdhcyBhdmFpbGFibGUsIHRoZSBjYXBhY2l0eSBvZgorICAgIC8v
IHRoZSBhcnJheSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgbV9pdGVt
Lm51bV9nbHlwaHMuIAorICAgIC8vIFNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBudW1fZ2x5cGhz
IHRvIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXkuCisgICAgbV9pdGVtLm51bV9nbHlwaHMgPSBt
X2dseXBoc0FycmF5Q2FwYWNpdHk7CisgICAgcmVzZXRHbHlwaEFycmF5cygpOworICAgIHdoaWxl
ICghSEJfU2hhcGVJdGVtKCZtX2l0ZW0pKSB7CisgICAgICAgIC8vIFdlIG92ZXJmbG93ZWQgb3Vy
IGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4KKyAgICAgICAgLy8gSEJfU2hhcGVJdGVtIGZpbGxz
IGluIG1faXRlbS5udW1fZ2x5cGhzIHdpdGggdGhlIG5lZWRlZCBzaXplLgorICAgICAgICBkZWxl
dGVHbHlwaEFycmF5cygpOworICAgICAgICAvLyBUaGUgfCsgMXwgaGVyZSBpcyBhIHdvcmthcm91
bmQgZm9yIGEgYnVnIGluIEhhcmZidXp6OiB0aGUgS2htZXIKKyAgICAgICAgLy8gc2hhcGVyIChh
dCBsZWFzdCkgY2FuIGZhaWwgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgZ2x5cGggYnVmZmVycwor
ICAgICAgICAvLyBhbmQgcmVxdWVzdCAwIGFkZGl0aW9uYWwgZ2x5cGhzOiB0aHJvd2luZyB1cyBp
bnRvIGFuIGluZmluaXRlCisgICAgICAgIC8vIGxvb3AuCisgICAgICAgIGNyZWF0ZUdseXBoQXJy
YXlzKG1faXRlbS5udW1fZ2x5cGhzICsgMSk7CisgICAgfQorfQorCit2b2lkIENvbXBsZXhUZXh0
Q29udHJvbGxlcjo6c2V0R2x5cGhYUG9zaXRpb25zKGJvb2wgaXNSVEwpCit7CisgICAgZG91Ymxl
IHBvc2l0aW9uID0gMDsKKyAgICAvLyBsb2dDbHVzdGVyc0luZGV4IGluZGV4ZXMgbG9nQ2x1c3Rl
cnMgZm9yIHRoZSBmaXJzdCAob3IgbGFzdCB3aGVuCisgICAgLy8gUlRMKSBjb2RlcG9pbnQgb2Yg
dGhlIGN1cnJlbnQgZ2x5cGguICBFYWNoIHRpbWUgd2UgYWR2YW5jZSBhIGdseXBoLAorICAgIC8v
IHdlIHNraXAgb3ZlciBhbGwgdGhlIGNvZGVwb2ludHMgdGhhdCBjb250cmlidXRlZCB0byB0aGUg
Y3VycmVudAorICAgIC8vIGdseXBoLgorICAgIGludCBsb2dDbHVzdGVyc0luZGV4ID0gMDsKKwor
ICAgIGlmIChpc1JUTCkgeworICAgICAgICBsb2dDbHVzdGVyc0luZGV4ID0gbV9pdGVtLm51bV9n
bHlwaHMgLSAxOworCisgICAgICAgIC8vIEdseXBocyBhcmUgc3RvcmVkIGluIGxvZ2ljYWwgb3Jk
ZXIsIGJ1dCBmb3IgbGF5b3V0IHB1cnBvc2VzIHdlCisgICAgICAgIC8vIGFsd2F5cyBnbyBsZWZ0
IHRvIHJpZ2h0LgorICAgICAgICBmb3IgKGludCBpID0gbV9pdGVtLm51bV9nbHlwaHMgLSAxOyBp
ID49IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRGb250RGF0YS0+aXNaZXJv
V2lkdGhTcGFjZUdseXBoKG1fZ2x5cGhzMTZbaV0pKSB7CisgICAgICAgICAgICAgICAgLy8gV2hp
dGVzcGFjZSBtdXN0IGJlIGxhaWQgb3V0IGluIGxvZ2ljYWwgb3JkZXIsIHNvIHdoZW4gaW5zZXJ0
aW5nCisgICAgICAgICAgICAgICAgLy8gc3BhY2VzIGluIFJUTCAoYnV0IGl0ZXJhdGluZyBpbiBM
VFIgb3JkZXIpIHdlIG11c3QgaW5zZXJ0IHNwYWNlcworICAgICAgICAgICAgICAgIC8vIF9iZWZv
cmVfIHRoZSBuZXh0IGdseXBoLgorICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDx1bnNp
Z25lZD4oaSArIDEpID49IG1faXRlbS5udW1fZ2x5cGhzIHx8IG1faXRlbS5hdHRyaWJ1dGVzW2kg
KyAxXS5jbHVzdGVyU3RhcnQpCisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IG1fbGV0
dGVyU3BhY2luZzsKKworICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IGRldGVybWluZVdvcmRC
cmVha1NwYWNpbmcobG9nQ2x1c3RlcnNJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIG1fZ2x5cGhzMTZbaV0gPSBtX2l0ZW0uZ2x5cGhzW2ldOworICAgICAgICAgICAgZG91Ymxl
IG9mZnNldFggPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLm9mZnNldHNbaV0u
eCk7CisgICAgICAgICAgICBtX3hQb3NpdGlvbnNbaV0gPSBtX29mZnNldFggKyBwb3NpdGlvbiAr
IG9mZnNldFg7CisKKyAgICAgICAgICAgIHdoaWxlIChsb2dDbHVzdGVyc0luZGV4ID4gMCAmJiBs
b2dDbHVzdGVycygpW2xvZ0NsdXN0ZXJzSW5kZXhdID09IGkpCisgICAgICAgICAgICAgICAgbG9n
Q2x1c3RlcnNJbmRleC0tOworCisgICAgICAgICAgICBpZiAoIW1fY3VycmVudEZvbnREYXRhLT5p
c1plcm9XaWR0aFNwYWNlR2x5cGgobV9nbHlwaHMxNltpXSkpCisgICAgICAgICAgICAgICAgcG9z
aXRpb24gKz0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1faXRlbS5hZHZhbmNlc1tpXSk7
CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IG1faXRlbS5udW1fZ2x5cGhzOyArK2kpIHsKKyAgICAgICAgICAgIG1fZ2x5cGhzMTZbaV0gPSBt
X2l0ZW0uZ2x5cGhzW2ldOworICAgICAgICAgICAgZG91YmxlIG9mZnNldFggPSB0cnVuY2F0ZUZp
eGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLm9mZnNldHNbaV0ueCk7CisgICAgICAgICAgICBtX3hQ
b3NpdGlvbnNbaV0gPSBtX29mZnNldFggKyBwb3NpdGlvbiArIG9mZnNldFg7CisKKyAgICAgICAg
ICAgIGlmIChtX2N1cnJlbnRGb250RGF0YS0+aXNaZXJvV2lkdGhTcGFjZUdseXBoKG1fZ2x5cGhz
MTZbaV0pKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBkb3VibGUg
YWR2YW5jZSA9IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihtX2l0ZW0uYWR2YW5jZXNbaV0p
OworCisgICAgICAgICAgICBhZHZhbmNlICs9IGRldGVybWluZVdvcmRCcmVha1NwYWNpbmcobG9n
Q2x1c3RlcnNJbmRleCk7CisKKyAgICAgICAgICAgIGlmIChtX2l0ZW0uYXR0cmlidXRlc1tpXS5j
bHVzdGVyU3RhcnQpCisgICAgICAgICAgICAgICAgYWR2YW5jZSArPSBtX2xldHRlclNwYWNpbmc7
CisKKyAgICAgICAgICAgIHdoaWxlIChzdGF0aWNfY2FzdDx1bnNpZ25lZD4obG9nQ2x1c3RlcnNJ
bmRleCkgPCBtX2l0ZW0uaXRlbS5sZW5ndGggJiYgbG9nQ2x1c3RlcnMoKVtsb2dDbHVzdGVyc0lu
ZGV4XSA9PSBpKQorICAgICAgICAgICAgICAgIGxvZ0NsdXN0ZXJzSW5kZXgrKzsKKworICAgICAg
ICAgICAgcG9zaXRpb24gKz0gYWR2YW5jZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX3BpeGVs
V2lkdGggPSBzdGQ6Om1heChwb3NpdGlvbiwgMC4wKTsKKyAgICBtX29mZnNldFggKz0gbV9waXhl
bFdpZHRoOworfQorCit2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6bm9ybWFsaXplU3BhY2Vz
QW5kTWlycm9yQ2hhcnMoY29uc3QgVUNoYXIqIHNvdXJjZSwgYm9vbCBydGwsIFVDaGFyKiBkZXN0
aW5hdGlvbiwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgcG9zaXRpb24gPSAwOworICAgIGJvb2wg
ZXJyb3IgPSBmYWxzZTsKKyAgICAvLyBJdGVyYXRlIGNoYXJhY3RlcnMgaW4gc291cmNlIGFuZCBt
aXJyb3IgY2hhcmFjdGVyIGlmIG5lZWRlZC4KKyAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgp
IHsKKyAgICAgICAgVUNoYXIzMiBjaGFyYWN0ZXI7CisgICAgICAgIGludCBuZXh0UG9zaXRpb24g
PSBwb3NpdGlvbjsKKyAgICAgICAgVTE2X05FWFQoc291cmNlLCBuZXh0UG9zaXRpb24sIGxlbmd0
aCwgY2hhcmFjdGVyKTsKKyAgICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNTcGFjZShjaGFyYWN0ZXIp
KQorICAgICAgICAgICAgY2hhcmFjdGVyID0gJyAnOworICAgICAgICBlbHNlIGlmIChGb250Ojp0
cmVhdEFzWmVyb1dpZHRoU3BhY2UoY2hhcmFjdGVyKSkKKyAgICAgICAgICAgIGNoYXJhY3RlciA9
IHplcm9XaWR0aFNwYWNlOworICAgICAgICBlbHNlIGlmIChydGwpCisgICAgICAgICAgICBjaGFy
YWN0ZXIgPSB1X2NoYXJNaXJyb3IoY2hhcmFjdGVyKTsKKyAgICAgICAgVTE2X0FQUEVORChkZXN0
aW5hdGlvbiwgcG9zaXRpb24sIGxlbmd0aCwgY2hhcmFjdGVyLCBlcnJvcik7CisgICAgICAgIEFT
U0VSVCghZXJyb3IpOworICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKKyAgICB9Cit9
CisKK2NvbnN0IFRleHRSdW4mIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Z2V0Tm9ybWFsaXplZFRl
eHRSdW4oY29uc3QgVGV4dFJ1biYgb3JpZ2luYWxSdW4sIE93blB0cjxUZXh0UnVuPiYgbm9ybWFs
aXplZFJ1biwgT3duQXJyYXlQdHI8VUNoYXI+JiBub3JtYWxpemVkQnVmZmVyKQoreworICAgIC8v
IE5vcm1hbGl6ZSB0aGUgdGV4dCBydW4gaW4gdGhyZWUgd2F5czoKKyAgICAvLyAxKSBDb252ZXJ0
IHRoZSB8b3JpZ2luYWxSdW58IHRvIE5GQyBub3JtYWxpemVkIGZvcm0gaWYgY29tYmluaW5nIGRp
YWNyaXRpY2FsIG1hcmtzCisgICAgLy8gKFUrMDMwMC4uKSBhcmUgdXNlZCBpbiB0aGUgcnVuLiBU
aGlzIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIG1vc3QgT3BlblR5cGUKKyAgICAvLyBm
b250cyAoZS5nLiwgQXJpYWwpIGRvbid0IGhhdmUgc3Vic3RpdHV0aW9uIHJ1bGVzIGZvciB0aGUg
ZGlhY3JpdGljYWwgbWFya3MgaW4KKyAgICAvLyB0aGVpciBHU1VCIHRhYmxlcy4KKyAgICAvLwor
ICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIGljdTo6Tm9ybWFsaXplcjo6aXNOb3Jt
YWxpemVkKFVOT1JNX05GQykgQVBJIGhlcmUgc2luY2UKKyAgICAvLyB0aGUgQVBJIHJldHVybnMg
RkFMU0UgKD0gbm90IG5vcm1hbGl6ZWQpIGZvciBjb21wbGV4IHJ1bnMgdGhhdCBkb24ndCByZXF1
aXJlIE5GQworICAgIC8vIG5vcm1hbGl6YXRpb24gKGUuZy4sIEFyYWJpYyB0ZXh0KS4gVW5sZXNz
IHRoZSBydW4gY29udGFpbnMgdGhlIGRpYWNyaXRpY2FsIG1hcmtzLAorICAgIC8vIEhhcmZidXp6
IHdpbGwgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIHVzIHVzaW5nIHRoZSBHU1VCIHRhYmxlLgorICAg
IC8vIDIpIENvbnZlcnQgc3BhY2luZyBjaGFyYWN0ZXJzIGludG8gcGxhaW4gc3BhY2VzLCBhcyBz
b21lIGZvbnRzIHdpbGwgcHJvdmlkZSBnbHlwaHMKKyAgICAvLyBmb3IgY2hhcmFjdGVycyBsaWtl
ICdcbicgb3RoZXJ3aXNlLgorICAgIC8vIDMpIENvbnZlcnQgbWlycm9yZWQgY2hhcmFjdGVycyBz
dWNoIGFzIHBhcmVudGhlc2lzIGZvciBydGwgdGV4dC4KKworICAgIC8vIENvbnZlcnQgdG8gTkZD
IGZvcm0gaWYgdGhlIHRleHQgaGFzIGRpYWNyaXRpY2FsIG1hcmtzLgorICAgIGljdTo6VW5pY29k
ZVN0cmluZyBub3JtYWxpemVkU3RyaW5nOworICAgIFVFcnJvckNvZGUgZXJyb3IgPSBVX1pFUk9f
RVJST1I7CisKKyAgICBmb3IgKGludDE2X3QgaSA9IDA7IGkgPCBvcmlnaW5hbFJ1bi5sZW5ndGgo
KTsgKytpKSB7CisgICAgICAgIFVDaGFyIGNoID0gb3JpZ2luYWxSdW5baV07CisgICAgICAgIGlm
ICg6OnVibG9ja19nZXRDb2RlKGNoKSA9PSBVQkxPQ0tfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01B
UktTKSB7CisgICAgICAgICAgICBpY3U6Ok5vcm1hbGl6ZXI6Om5vcm1hbGl6ZShpY3U6OlVuaWNv
ZGVTdHJpbmcob3JpZ2luYWxSdW4uY2hhcmFjdGVycygpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgb3JpZ2luYWxSdW4ubGVuZ3RoKCkpLCBVTk9STV9ORkMsIDAgLyog
bm8gb3B0aW9ucyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5v
cm1hbGl6ZWRTdHJpbmcsIGVycm9yKTsKKyAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoZXJyb3Ip
KQorICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFJ1bjsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm9ybWFsaXplIHNwYWNlIGFuZCBtaXJyb3Ig
cGFyZW50aGVzaXMgZm9yIHJ0bCB0ZXh0LgorICAgIGludCBub3JtYWxpemVkQnVmZmVyTGVuZ3Ro
OworICAgIGNvbnN0IFVDaGFyKiBzb3VyY2VUZXh0OworICAgIGlmIChub3JtYWxpemVkU3RyaW5n
LmlzRW1wdHkoKSkgeworICAgICAgICBub3JtYWxpemVkQnVmZmVyTGVuZ3RoID0gb3JpZ2luYWxS
dW4ubGVuZ3RoKCk7CisgICAgICAgIHNvdXJjZVRleHQgPSBvcmlnaW5hbFJ1bi5jaGFyYWN0ZXJz
KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCA9IG5vcm1h
bGl6ZWRTdHJpbmcubGVuZ3RoKCk7CisgICAgICAgIHNvdXJjZVRleHQgPSBub3JtYWxpemVkU3Ry
aW5nLmdldEJ1ZmZlcigpOworICAgIH0KKworICAgIG5vcm1hbGl6ZWRCdWZmZXIuc2V0KG5ldyBV
Q2hhcltub3JtYWxpemVkQnVmZmVyTGVuZ3RoICsgMV0pOworCisgICAgbm9ybWFsaXplU3BhY2Vz
QW5kTWlycm9yQ2hhcnMoc291cmNlVGV4dCwgb3JpZ2luYWxSdW4ucnRsKCksIG5vcm1hbGl6ZWRC
dWZmZXIuZ2V0KCksIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgpOworCisgICAgbm9ybWFsaXplZFJ1
bi5zZXQobmV3IFRleHRSdW4ob3JpZ2luYWxSdW4pKTsKKyAgICBub3JtYWxpemVkUnVuLT5zZXRU
ZXh0KG5vcm1hbGl6ZWRCdWZmZXIuZ2V0KCksIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgpOworICAg
IHJldHVybiAqbm9ybWFsaXplZFJ1bjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENv
bnRyb2xsZXJMaW51eC5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21w
bGV4VGV4dENvbnRyb2xsZXJMaW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRlYmJkODk5ZDEzMjE0MWE4NzBj
MGI3YzRhZjgwMGJmY2M0NjIwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4LmgKQEAgLTAsMCAr
MSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIENvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4X2gKKyNkZWZpbmUgQ29t
cGxleFRleHRDb250cm9sbGVyTGludXhfaAorCisjaW5jbHVkZSAiSGFyZmJ1enpTa2lhLmgiCisj
aW5jbHVkZSAiU2tTY2FsYXIuaCIKKyNpbmNsdWRlICJUZXh0UnVuLmgiCisKKyNpbmNsdWRlIDx1
bmljb2RlL3VjaGFyLmg+CisjaW5jbHVkZSA8d3RmL093bkFycmF5UHRyLmg+CisjaW5jbHVkZSA8
d3RmL093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEZvbnQ7CitjbGFz
cyBGb250UGxhdGZvcm1EYXRhOworY2xhc3MgU2ltcGxlRm9udERhdGE7CisKKy8vIENvbXBsZXhU
ZXh0Q29udHJvbGxlciB3YWxrcyBhIFRleHRSdW4gYW5kIHByZXNlbnRzIGVhY2ggc2NyaXB0IHJ1
biBpbiBzZXF1ZW5jZS4gQQorLy8gVGV4dFJ1biBpcyBhIHNlcXVlbmNlIG9mIGNvZGUtcG9pbnRz
IHdpdGggdGhlIHNhbWUgZW1iZWRkaW5nIGxldmVsIChpLmUuIHRoZXkKKy8vIGFyZSBhbGwgbGVm
dC10by1yaWdodCBvciByaWdodC10by1sZWZ0KS4gQSBzY3JpcHQgcnVuIGlzIGEgc3Vic2VxdWVu
Y2Ugd2hlcmUKKy8vIGFsbCB0aGUgY2hhcmFjdGVycyBoYXZlIHRoZSBzYW1lIHNjcmlwdCAoZS5n
LiBBcmFiaWMsIFRoYWkgZXRjKS4gU2hhcGluZyBpcworLy8gb25seSBldmVyIGRvbmUgd2l0aCBz
Y3JpcHQgcnVucyBzaW5jZSB0aGUgc2hhcGVycyBvbmx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAor
Ly8gYSBzaW5nbGUgc2NyaXB0LgorLy8KKy8vIEFmdGVyIGNyZWF0aW5nIGl0LCB0aGUgc2NyaXB0
IHJ1bnMgYXJlIGVpdGhlciBpdGVyYXRlZCBiYWNrd2FyZHMgb3IgZm9yd2FyZHMuCisvLyBJdCBk
ZWZhdWx0cyB0byBiYWNrd2FyZHMgZm9yIFJUTCBhbmQgZm9yd2FyZHMgb3RoZXJ3aXNlICh3aGlj
aCBtYXRjaGVzIHRoZQorLy8gcHJlc2VudGF0aW9uIG9yZGVyKSwgaG93ZXZlciB5b3UgY2FuIHNl
dCBpdCB3aXRoIHxzZXRCYWNrd2FyZHNJdGVyYXRpb258LgorLy8KKy8vIE9uY2UgeW91IGhhdmUg
c2V0dXAgdGhlIG9iamVjdCwgY2FsbCB8bmV4dFNjcmlwdFJ1bnwgdG8gZ2V0IHRoZSBmaXJzdCBz
Y3JpcHQKKy8vIHJ1bi4gVGhpcyB3aWxsIHJldHVybiBmYWxzZSB3aGVuIHRoZSBpdGVyYXRpb24g
aXMgY29tcGxldGUuIEF0IGFueSB0aW1lIHlvdQorLy8gY2FuIGNhbGwgfHJlc2V0fCB0byBzdGFy
dCBvdmVyIGFnYWluLgorY2xhc3MgQ29tcGxleFRleHRDb250cm9sbGVyIHsKK3B1YmxpYzoKKyAg
ICBDb21wbGV4VGV4dENvbnRyb2xsZXIoY29uc3QgVGV4dFJ1biYsIHVuc2lnbmVkLCBjb25zdCBG
b250Kik7CisgICAgfkNvbXBsZXhUZXh0Q29udHJvbGxlcigpOworCisgICAgYm9vbCBpc1dvcmRC
cmVhayh1bnNpZ25lZCk7CisgICAgaW50IGRldGVybWluZVdvcmRCcmVha1NwYWNpbmcodW5zaWdu
ZWQpOworICAgIC8vIHNldFBhZGRpbmcgc2V0cyBhIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZGlz
dHJpYnV0ZWQgYWNyb3NzIHRoZSBUZXh0UnVuLgorICAgIC8vIFdlYktpdCB1c2VzIHRoaXMgdG8g
anVzdGlmeSB0ZXh0LgorICAgIHZvaWQgc2V0UGFkZGluZyhpbnQpOworICAgIHZvaWQgcmVzZXQo
KTsKKyAgICB2b2lkIHNldEJhY2t3YXJkc0l0ZXJhdGlvbihib29sKTsKKyAgICAvLyBBZHZhbmNl
IHRvIHRoZSBuZXh0IHNjcmlwdCBydW4sIHJldHVybmluZyBmYWxzZSB3aGVuIHRoZSBlbmQgb2Yg
dGhlCisgICAgLy8gVGV4dFJ1biBoYXMgYmVlbiByZWFjaGVkLgorICAgIGJvb2wgbmV4dFNjcmlw
dFJ1bigpOworICAgIGZsb2F0IHdpZHRoT2ZGdWxsUnVuKCk7CisKKyAgICAvLyBzZXRXb3JkU3Bh
Y2luZ0FkanVzdG1lbnQgc2V0cyBhIGRlbHRhIChpbiBwaXhlbHMpIHdoaWNoIGlzIGFwcGxpZWQg
YXQKKyAgICAvLyBlYWNoIHdvcmQgYnJlYWsgaW4gdGhlIFRleHRSdW4uCisgICAgdm9pZCBzZXRX
b3JkU3BhY2luZ0FkanVzdG1lbnQoaW50IHdvcmRTcGFjaW5nQWRqdXN0bWVudCkgeyBtX3dvcmRT
cGFjaW5nQWRqdXN0bWVudCA9IHdvcmRTcGFjaW5nQWRqdXN0bWVudDsgfQorCisgICAgLy8gc2V0
TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQgc2V0cyBhbiBhZGRpdGlvbmFsIG51bWJlciBvZiBwaXhl
bHMgdGhhdCBpcworICAgIC8vIGFkZGVkIHRvIHRoZSBhZHZhbmNlIGFmdGVyIGVhY2ggb3V0cHV0
IGNsdXN0ZXIuIFRoaXMgbWF0Y2hlcyB0aGUgYmVoYXZpb3VyCisgICAgLy8gb2YgV2lkdGhJdGVy
YXRvcjo6YWR2YW5jZS4KKyAgICB2b2lkIHNldExldHRlclNwYWNpbmdBZGp1c3RtZW50KGludCBs
ZXR0ZXJTcGFjaW5nQWRqdXN0bWVudCkgeyBtX2xldHRlclNwYWNpbmcgPSBsZXR0ZXJTcGFjaW5n
QWRqdXN0bWVudDsgfQorICAgIGludCBsZXR0ZXJTcGFjaW5nKCkgY29uc3QgeyByZXR1cm4gbV9s
ZXR0ZXJTcGFjaW5nOyB9CisKKyAgICAvLyBTZXQgdGhlIHggb2Zmc2V0IGZvciB0aGUgbmV4dCBz
Y3JpcHQgcnVuLiBUaGlzIGFmZmVjdHMgdGhlIHZhbHVlcyBpbgorICAgIC8vIHx4UG9zaXRpb25z
fAorICAgIHZvaWQgc2V0WE9mZnNldFRvWmVybygpIHsgbV9vZmZzZXRYID0gMDsgfQorICAgIGJv
b2wgcnRsKCkgY29uc3QgeyByZXR1cm4gbV9ydW4ucnRsKCk7IH0KKyAgICBjb25zdCB1aW50MTZf
dCogZ2x5cGhzKCkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHMxNjsgfQorCisgICAgLy8gUmV0dXJu
IHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHJldHVybmVkIGJ5IHxnbHlwaHN8CisgICAgY29uc3Qg
dW5zaWduZWQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9pdGVtLm51bV9nbHlwaHM7IH0KKwor
ICAgIC8vIFJldHVybiB0aGUgeCBvZmZzZXQgZm9yIGVhY2ggb2YgdGhlIGdseXBocy4gTm90ZSB0
aGF0IHRoaXMgaXMgdHJhbnNsYXRlZAorICAgIC8vIGJ5IHRoZSBjdXJyZW50IHggb2Zmc2V0IGFu
ZCB0aGF0IHRoZSB4IG9mZnNldCBpcyB1cGRhdGVkIGZvciBlYWNoIHNjcmlwdAorICAgIC8vIHJ1
bi4KKyAgICBjb25zdCBTa1NjYWxhciogeFBvc2l0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1feFBv
c2l0aW9uczsgfQorCisgICAgLy8gR2V0IHRoZSBhZHZhbmNlcyAod2lkdGhzKSBmb3IgZWFjaCBn
bHlwaC4KKyAgICBjb25zdCBIQl9GaXhlZCogYWR2YW5jZXMoKSBjb25zdCB7IHJldHVybiBtX2l0
ZW0uYWR2YW5jZXM7IH0KKworICAgIC8vIFJldHVybiB0aGUgd2lkdGggKGluIHB4KSBvZiB0aGUg
Y3VycmVudCBzY3JpcHQgcnVuLgorICAgIGNvbnN0IHVuc2lnbmVkIHdpZHRoKCkgY29uc3QgeyBy
ZXR1cm4gbV9waXhlbFdpZHRoOyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGNsdXN0ZXIgbG9nIGZv
ciB0aGUgY3VycmVudCBzY3JpcHQgcnVuLiBGb3IgZXhhbXBsZToKKyAgICAvLyAgIHNjcmlwdCBy
dW46IGYgaSBhIG4gYyDDqSAgKGZpIGdldHMgbGlnYXR1cmVkKQorICAgIC8vICAgbG9nIGNsdXRy
czogMCAwIDEgMiAzIDQKKyAgICAvLyBTbywgZm9yIGVhY2ggaW5wdXQgY29kZSBwb2ludCwgdGhl
IGxvZyB0ZWxscyB5b3Ugd2hpY2ggb3V0cHV0IGdseXBoIHdhcworICAgIC8vIGdlbmVyYXRlZCBm
b3IgaXQuCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIGxvZ0NsdXN0ZXJzKCkgY29uc3QgeyBy
ZXR1cm4gbV9pdGVtLmxvZ19jbHVzdGVyczsgfQorCisgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIg
b2YgY29kZSBwb2ludHMgaW4gdGhlIGN1cnJlbnQgc2NyaXB0IHJ1bgorICAgIGNvbnN0IHVuc2ln
bmVkIG51bUNvZGVQb2ludHMoKSBjb25zdCB7IHJldHVybiBtX251bUNvZGVQb2ludHM7IH0KKwor
ICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEqIGZvbnRQbGF0Zm9ybURhdGFGb3JTY3JpcHRSdW4o
KSB7IHJldHVybiByZWludGVycHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPihtX2l0ZW0uZm9u
dC0+dXNlckRhdGEpOyB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXR1cEZvbnRGb3JTY3JpcHRS
dW4oKTsKKyAgICBIQl9Gb250UmVjKiBhbGxvY0hhcmZidXp6Rm9udCgpOworICAgIHZvaWQgZGVs
ZXRlR2x5cGhBcnJheXMoKTsKKyAgICB2b2lkIGNyZWF0ZUdseXBoQXJyYXlzKGludCk7CisgICAg
dm9pZCByZXNldEdseXBoQXJyYXlzKCk7CisgICAgdm9pZCBzaGFwZUdseXBocygpOworICAgIHZv
aWQgc2V0R2x5cGhYUG9zaXRpb25zKGJvb2wpOworCisgICAgc3RhdGljIHZvaWQgbm9ybWFsaXpl
U3BhY2VzQW5kTWlycm9yQ2hhcnMoY29uc3QgVUNoYXIqIHNvdXJjZSwgYm9vbCBydGwsIFVDaGFy
KiBkZXN0aW5hdGlvbiwgaW50IGxlbmd0aCk7CisgICAgc3RhdGljIGNvbnN0IFRleHRSdW4mIGdl
dE5vcm1hbGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9yaWdpbmFsUnVuLCBPd25QdHI8VGV4
dFJ1bj4mIG5vcm1hbGl6ZWRSdW4sIE93bkFycmF5UHRyPFVDaGFyPiYgbm9ybWFsaXplZEJ1ZmZl
cik7CisKKyAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIGxvZ2ljIGluIFJlbmRlckJsb2NrOjpmaW5k
TmV4dExpbmVCcmVhaworICAgIHN0YXRpYyBib29sIGlzQ29kZXBvaW50U3BhY2UoSEJfVUNoYXIx
NiBjKSB7IHJldHVybiBjID09ICcgJyB8fCBjID09ICdcdCc7IH0KKworICAgIGNvbnN0IEZvbnQq
IGNvbnN0IG1fZm9udDsKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbV9jdXJyZW50Rm9udERh
dGE7CisgICAgSEJfU2hhcGVySXRlbSBtX2l0ZW07CisgICAgdWludDE2X3QqIG1fZ2x5cGhzMTY7
IC8vIEEgdmVjdG9yIG9mIDE2LWJpdCBnbHlwaCBpZHMuCisgICAgU2tTY2FsYXIqIG1feFBvc2l0
aW9uczsgLy8gQSB2ZWN0b3Igb2YgeCBwb3NpdGlvbnMgZm9yIGVhY2ggZ2x5cGguCisgICAgc3Np
emVfdCBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuOyAvLyBJbmRleGVzIHRoZSBzY3JpcHQgcnVuIGlu
IHxtX3J1bnwuCisgICAgY29uc3QgdW5zaWduZWQgbV9zdGFydGluZ1g7IC8vIE9mZnNldCBpbiBw
aXhlbHMgb2YgdGhlIGZpcnN0IHNjcmlwdCBydW4uCisgICAgdW5zaWduZWQgbV9vZmZzZXRYOyAv
LyBPZmZzZXQgaW4gcGl4ZWxzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzY3JpcHQgcnVuLgor
ICAgIHVuc2lnbmVkIG1fcGl4ZWxXaWR0aDsgLy8gV2lkdGggKGluIHB4KSBvZiB0aGUgY3VycmVu
dCBzY3JpcHQgcnVuLgorICAgIHVuc2lnbmVkIG1fbnVtQ29kZVBvaW50czsgLy8gQ29kZSBwb2lu
dHMgaW4gY3VycmVudCBzY3JpcHQgcnVuLgorICAgIHVuc2lnbmVkIG1fZ2x5cGhzQXJyYXlDYXBh
Y2l0eTsgLy8gQ3VycmVudCBzaXplIG9mIGFsbCB0aGUgSGFyZmJ1enogYXJyYXlzLgorCisgICAg
T3duUHRyPFRleHRSdW4+IG1fbm9ybWFsaXplZFJ1bjsKKyAgICBPd25BcnJheVB0cjxVQ2hhcj4g
bV9ub3JtYWxpemVkQnVmZmVyOyAvLyBBIGJ1ZmZlciBmb3Igbm9ybWFsaXplZCBydW4uCisgICAg
Y29uc3QgVGV4dFJ1biYgbV9ydW47CisgICAgYm9vbCBtX2l0ZXJhdGVCYWNrd2FyZHM7CisgICAg
aW50IG1fd29yZFNwYWNpbmdBZGp1c3RtZW50OyAvLyBkZWx0YSBhZGp1c3RtZW50IChwaXhlbHMp
IGZvciBlYWNoIHdvcmQgYnJlYWsuCisgICAgZmxvYXQgbV9wYWRkaW5nOyAvLyBwaXhlbHMgdG8g
YmUgZGlzdHJpYnV0ZWQgb3ZlciB0aGUgbGluZSBhdCB3b3JkIGJyZWFrcy4KKyAgICBmbG9hdCBt
X3BhZFBlcldvcmRCcmVhazsgLy8gcGl4ZWxzIHRvIGJlIGFkZGVkIHRvIGVhY2ggd29yZCBicmVh
ay4KKyAgICBmbG9hdCBtX3BhZEVycm9yOyAvLyB8bV9wYWRQZXJXb3JkQnJlYWt8IG1pZ2h0IGhh
dmUgYSBmcmFjdGlvbmFsIGNvbXBvbmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5j
ZSB3ZSBvbmx5IGFkZCBhIHdob2xlIG51bWJlciBvZiBwYWRkaW5nIHBpeGVscyBhdAorICAgICAg
ICAgICAgICAgICAgICAgIC8vIGVhY2ggd29yZCBicmVhayB3ZSBhY2N1bXVsYXRlIGVycm9yLiBU
aGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBwaXhlbHMgdGhh
dCB3ZSBhcmUgYmVoaW5kIHNvIGZhci4KKyAgICBpbnQgbV9sZXR0ZXJTcGFjaW5nOyAvLyBwaXhl
bHMgdG8gYmUgYWRkZWQgYWZ0ZXIgZWFjaCBnbHlwaC4KK307CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKKworI2VuZGlmIC8vIENvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4X2gKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4LmNwcAppbmRleCA1ZTNl
NWIyODU3NDUxMmIxMmQ4ZjE3MzlhMWZkOGJiMTVhNTA4ZjY2Li5iMjU2ZTcwZTIwYzU5Y2UyMDg5
YmM2MGUyYTk3ZWU2YmQxNDk2YmQzIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0ZvbnRMaW51eC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9Gb250TGludXguY3BwCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiY29u
ZmlnLmgiCiAjaW5jbHVkZSAiRm9udC5oIgogCisjaW5jbHVkZSAiQ29tcGxleFRleHRDb250cm9s
bGVyTGludXguaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRlICJHbHlwaEJ1ZmZl
ci5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgpAQCAtNDUsMTAgKzQ2LDYgQEAKICNp
bmNsdWRlICJTa1R5cGVmYWNlLmgiCiAjaW5jbHVkZSAiU2tVdGlscy5oIgogCi0jaW5jbHVkZSA8
dW5pY29kZS9ub3JtbHpyLmg+Ci0jaW5jbHVkZSA8dW5pY29kZS91Y2hhci5oPgotI2luY2x1ZGUg
PHd0Zi9Pd25BcnJheVB0ci5oPgotI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KICNpbmNsdWRlIDx3
dGYvdW5pY29kZS9Vbmljb2RlLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTE3Miw0OTkg
KzE2OSw2IEBAIHN0YXRpYyBpbnQgdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKEhCX0ZpeGVk
IHZhbHVlKQogICAgIHJldHVybiB2YWx1ZSA+PiA2OwogfQogCi0vLyBUZXh0UnVuV2Fsa2VyIHdh
bGtzIGEgVGV4dFJ1biBhbmQgcHJlc2VudHMgZWFjaCBzY3JpcHQgcnVuIGluIHNlcXVlbmNlLiBB
Ci0vLyBUZXh0UnVuIGlzIGEgc2VxdWVuY2Ugb2YgY29kZS1wb2ludHMgd2l0aCB0aGUgc2FtZSBl
bWJlZGRpbmcgbGV2ZWwgKGkuZS4gdGhleQotLy8gYXJlIGFsbCBsZWZ0LXRvLXJpZ2h0IG9yIHJp
Z2h0LXRvLWxlZnQpLiBBIHNjcmlwdCBydW4gaXMgYSBzdWJzZXF1ZW5jZSB3aGVyZQotLy8gYWxs
IHRoZSBjaGFyYWN0ZXJzIGhhdmUgdGhlIHNhbWUgc2NyaXB0IChlLmcuIEFyYWJpYywgVGhhaSBl
dGMpLiBTaGFwaW5nIGlzCi0vLyBvbmx5IGV2ZXIgZG9uZSB3aXRoIHNjcmlwdCBydW5zIHNpbmNl
IHRoZSBzaGFwZXJzIG9ubHkga25vdyBob3cgdG8gZGVhbCB3aXRoCi0vLyBhIHNpbmdsZSBzY3Jp
cHQuCi0vLwotLy8gQWZ0ZXIgY3JlYXRpbmcgaXQsIHRoZSBzY3JpcHQgcnVucyBhcmUgZWl0aGVy
IGl0ZXJhdGVkIGJhY2t3YXJkcyBvciBmb3J3YXJkcy4KLS8vIEl0IGRlZmF1bHRzIHRvIGJhY2t3
YXJkcyBmb3IgUlRMIGFuZCBmb3J3YXJkcyBvdGhlcndpc2UgKHdoaWNoIG1hdGNoZXMgdGhlCi0v
LyBwcmVzZW50YXRpb24gb3JkZXIpLCBob3dldmVyIHlvdSBjYW4gc2V0IGl0IHdpdGggfHNldEJh
Y2t3YXJkc0l0ZXJhdGlvbnwuCi0vLwotLy8gT25jZSB5b3UgaGF2ZSBzZXR1cCB0aGUgb2JqZWN0
LCBjYWxsIHxuZXh0U2NyaXB0UnVufCB0byBnZXQgdGhlIGZpcnN0IHNjcmlwdAotLy8gcnVuLiBU
aGlzIHdpbGwgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGl0ZXJhdGlvbiBpcyBjb21wbGV0ZS4gQXQg
YW55IHRpbWUgeW91Ci0vLyBjYW4gY2FsbCB8cmVzZXR8IHRvIHN0YXJ0IG92ZXIgYWdhaW4uCi1j
bGFzcyBUZXh0UnVuV2Fsa2VyIHsKLXB1YmxpYzoKLSAgICBUZXh0UnVuV2Fsa2VyKGNvbnN0IFRl
eHRSdW4mLCB1bnNpZ25lZCwgY29uc3QgRm9udCopOwotICAgIH5UZXh0UnVuV2Fsa2VyKCk7Ci0K
LSAgICBib29sIGlzV29yZEJyZWFrKHVuc2lnbmVkKTsKLSAgICBpbnQgZGV0ZXJtaW5lV29yZEJy
ZWFrU3BhY2luZyh1bnNpZ25lZCk7Ci0gICAgLy8gc2V0UGFkZGluZyBzZXRzIGEgbnVtYmVyIG9m
IHBpeGVscyB0byBiZSBkaXN0cmlidXRlZCBhY3Jvc3MgdGhlIFRleHRSdW4uCi0gICAgLy8gV2Vi
S2l0IHVzZXMgdGhpcyB0byBqdXN0aWZ5IHRleHQuCi0gICAgdm9pZCBzZXRQYWRkaW5nKGludCk7
Ci0gICAgdm9pZCByZXNldCgpOwotICAgIHZvaWQgc2V0QmFja3dhcmRzSXRlcmF0aW9uKGJvb2wp
OwotICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgc2NyaXB0IHJ1biwgcmV0dXJuaW5nIGZhbHNl
IHdoZW4gdGhlIGVuZCBvZiB0aGUKLSAgICAvLyBUZXh0UnVuIGhhcyBiZWVuIHJlYWNoZWQuCi0g
ICAgYm9vbCBuZXh0U2NyaXB0UnVuKCk7Ci0gICAgZmxvYXQgd2lkdGhPZkZ1bGxSdW4oKTsKLQot
ICAgIC8vIHNldFdvcmRTcGFjaW5nQWRqdXN0bWVudCBzZXRzIGEgZGVsdGEgKGluIHBpeGVscykg
d2hpY2ggaXMgYXBwbGllZCBhdAotICAgIC8vIGVhY2ggd29yZCBicmVhayBpbiB0aGUgVGV4dFJ1
bi4KLSAgICB2b2lkIHNldFdvcmRTcGFjaW5nQWRqdXN0bWVudChpbnQgd29yZFNwYWNpbmdBZGp1
c3RtZW50KSB7IG1fd29yZFNwYWNpbmdBZGp1c3RtZW50ID0gd29yZFNwYWNpbmdBZGp1c3RtZW50
OyB9Ci0KLSAgICAvLyBzZXRMZXR0ZXJTcGFjaW5nQWRqdXN0bWVudCBzZXRzIGFuIGFkZGl0aW9u
YWwgbnVtYmVyIG9mIHBpeGVscyB0aGF0IGlzCi0gICAgLy8gYWRkZWQgdG8gdGhlIGFkdmFuY2Ug
YWZ0ZXIgZWFjaCBvdXRwdXQgY2x1c3Rlci4gVGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvdXIKLSAg
ICAvLyBvZiBXaWR0aEl0ZXJhdG9yOjphZHZhbmNlLgotICAgIHZvaWQgc2V0TGV0dGVyU3BhY2lu
Z0FkanVzdG1lbnQoaW50IGxldHRlclNwYWNpbmdBZGp1c3RtZW50KSB7IG1fbGV0dGVyU3BhY2lu
ZyA9IGxldHRlclNwYWNpbmdBZGp1c3RtZW50OyB9Ci0gICAgaW50IGxldHRlclNwYWNpbmcoKSBj
b25zdCB7IHJldHVybiBtX2xldHRlclNwYWNpbmc7IH0KLQotICAgIC8vIFNldCB0aGUgeCBvZmZz
ZXQgZm9yIHRoZSBuZXh0IHNjcmlwdCBydW4uIFRoaXMgYWZmZWN0cyB0aGUgdmFsdWVzIGluCi0g
ICAgLy8gfHhQb3NpdGlvbnN8Ci0gICAgdm9pZCBzZXRYT2Zmc2V0VG9aZXJvKCkgeyBtX29mZnNl
dFggPSAwOyB9Ci0gICAgYm9vbCBydGwoKSBjb25zdCB7IHJldHVybiBtX3J1bi5ydGwoKTsgfQot
ICAgIGNvbnN0IHVpbnQxNl90KiBnbHlwaHMoKSBjb25zdCB7IHJldHVybiBtX2dseXBoczE2OyB9
Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgfGds
eXBoc3wKLSAgICBjb25zdCB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2l0ZW0u
bnVtX2dseXBoczsgfQotCi0gICAgLy8gUmV0dXJuIHRoZSB4IG9mZnNldCBmb3IgZWFjaCBvZiB0
aGUgZ2x5cGhzLiBOb3RlIHRoYXQgdGhpcyBpcyB0cmFuc2xhdGVkCi0gICAgLy8gYnkgdGhlIGN1
cnJlbnQgeCBvZmZzZXQgYW5kIHRoYXQgdGhlIHggb2Zmc2V0IGlzIHVwZGF0ZWQgZm9yIGVhY2gg
c2NyaXB0Ci0gICAgLy8gcnVuLgotICAgIGNvbnN0IFNrU2NhbGFyKiB4UG9zaXRpb25zKCkgY29u
c3QgeyByZXR1cm4gbV94UG9zaXRpb25zOyB9Ci0KLSAgICAvLyBHZXQgdGhlIGFkdmFuY2VzICh3
aWR0aHMpIGZvciBlYWNoIGdseXBoLgotICAgIGNvbnN0IEhCX0ZpeGVkKiBhZHZhbmNlcygpIGNv
bnN0IHsgcmV0dXJuIG1faXRlbS5hZHZhbmNlczsgfQotCi0gICAgLy8gUmV0dXJuIHRoZSB3aWR0
aCAoaW4gcHgpIG9mIHRoZSBjdXJyZW50IHNjcmlwdCBydW4uCi0gICAgY29uc3QgdW5zaWduZWQg
d2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3BpeGVsV2lkdGg7IH0KLQotICAgIC8vIFJldHVybiB0
aGUgY2x1c3RlciBsb2cgZm9yIHRoZSBjdXJyZW50IHNjcmlwdCBydW4uIEZvciBleGFtcGxlOgot
ICAgIC8vICAgc2NyaXB0IHJ1bjogZiBpIGEgbiBjIMOpICAoZmkgZ2V0cyBsaWdhdHVyZWQpCi0g
ICAgLy8gICBsb2cgY2x1dHJzOiAwIDAgMSAyIDMgNAotICAgIC8vIFNvLCBmb3IgZWFjaCBpbnB1
dCBjb2RlIHBvaW50LCB0aGUgbG9nIHRlbGxzIHlvdSB3aGljaCBvdXRwdXQgZ2x5cGggd2FzCi0g
ICAgLy8gZ2VuZXJhdGVkIGZvciBpdC4KLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogbG9nQ2x1
c3RlcnMoKSBjb25zdCB7IHJldHVybiBtX2l0ZW0ubG9nX2NsdXN0ZXJzOyB9Ci0KLSAgICAvLyBy
ZXR1cm4gdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiB0aGUgY3VycmVudCBzY3JpcHQgcnVu
Ci0gICAgY29uc3QgdW5zaWduZWQgbnVtQ29kZVBvaW50cygpIGNvbnN0IHsgcmV0dXJuIG1fbnVt
Q29kZVBvaW50czsgfQotCi0gICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSogZm9udFBsYXRmb3Jt
RGF0YUZvclNjcmlwdFJ1bigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRmb3Jt
RGF0YSo+KG1faXRlbS5mb250LT51c2VyRGF0YSk7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIHNl
dHVwRm9udEZvclNjcmlwdFJ1bigpOwotICAgIEhCX0ZvbnRSZWMqIGFsbG9jSGFyZmJ1enpGb250
KCk7Ci0gICAgdm9pZCBkZWxldGVHbHlwaEFycmF5cygpOwotICAgIHZvaWQgY3JlYXRlR2x5cGhB
cnJheXMoaW50KTsKLSAgICB2b2lkIHJlc2V0R2x5cGhBcnJheXMoKTsKLSAgICB2b2lkIHNoYXBl
R2x5cGhzKCk7Ci0gICAgdm9pZCBzZXRHbHlwaFhQb3NpdGlvbnMoYm9vbCk7Ci0KLSAgICBzdGF0
aWMgdm9pZCBub3JtYWxpemVTcGFjZXNBbmRNaXJyb3JDaGFycyhjb25zdCBVQ2hhciogc291cmNl
LCBib29sIHJ0bCwgVUNoYXIqIGRlc3RpbmF0aW9uLCBpbnQgbGVuZ3RoKTsKLSAgICBzdGF0aWMg
Y29uc3QgVGV4dFJ1biYgZ2V0Tm9ybWFsaXplZFRleHRSdW4oY29uc3QgVGV4dFJ1biYgb3JpZ2lu
YWxSdW4sIE93blB0cjxUZXh0UnVuPiYgbm9ybWFsaXplZFJ1biwgT3duQXJyYXlQdHI8VUNoYXI+
JiBub3JtYWxpemVkQnVmZmVyKTsKLQotICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgbG9naWMgaW4g
UmVuZGVyQmxvY2s6OmZpbmROZXh0TGluZUJyZWFrCi0gICAgc3RhdGljIGJvb2wgaXNDb2RlcG9p
bnRTcGFjZShIQl9VQ2hhcjE2IGMpIHsgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JzsgfQot
Ci0gICAgY29uc3QgRm9udCogY29uc3QgbV9mb250OwotICAgIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBtX2N1cnJlbnRGb250RGF0YTsKLSAgICBIQl9TaGFwZXJJdGVtIG1faXRlbTsKLSAgICB1aW50
MTZfdCogbV9nbHlwaHMxNjsgLy8gQSB2ZWN0b3Igb2YgMTYtYml0IGdseXBoIGlkcy4KLSAgICBT
a1NjYWxhciogbV94UG9zaXRpb25zOyAvLyBBIHZlY3RvciBvZiB4IHBvc2l0aW9ucyBmb3IgZWFj
aCBnbHlwaC4KLSAgICBzc2l6ZV90IG1faW5kZXhPZk5leHRTY3JpcHRSdW47IC8vIEluZGV4ZXMg
dGhlIHNjcmlwdCBydW4gaW4gfG1fcnVufC4KLSAgICBjb25zdCB1bnNpZ25lZCBtX3N0YXJ0aW5n
WDsgLy8gT2Zmc2V0IGluIHBpeGVscyBvZiB0aGUgZmlyc3Qgc2NyaXB0IHJ1bi4KLSAgICB1bnNp
Z25lZCBtX29mZnNldFg7IC8vIE9mZnNldCBpbiBwaXhlbHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBu
ZXh0IHNjcmlwdCBydW4uCi0gICAgdW5zaWduZWQgbV9waXhlbFdpZHRoOyAvLyBXaWR0aCAoaW4g
cHgpIG9mIHRoZSBjdXJyZW50IHNjcmlwdCBydW4uCi0gICAgdW5zaWduZWQgbV9udW1Db2RlUG9p
bnRzOyAvLyBDb2RlIHBvaW50cyBpbiBjdXJyZW50IHNjcmlwdCBydW4uCi0gICAgdW5zaWduZWQg
bV9nbHlwaHNBcnJheUNhcGFjaXR5OyAvLyBDdXJyZW50IHNpemUgb2YgYWxsIHRoZSBIYXJmYnV6
eiBhcnJheXMuCi0KLSAgICBPd25QdHI8VGV4dFJ1bj4gbV9ub3JtYWxpemVkUnVuOwotICAgIE93
bkFycmF5UHRyPFVDaGFyPiBtX25vcm1hbGl6ZWRCdWZmZXI7IC8vIEEgYnVmZmVyIGZvciBub3Jt
YWxpemVkIHJ1bi4KLSAgICBjb25zdCBUZXh0UnVuJiBtX3J1bjsKLSAgICBib29sIG1faXRlcmF0
ZUJhY2t3YXJkczsKLSAgICBpbnQgbV93b3JkU3BhY2luZ0FkanVzdG1lbnQ7IC8vIGRlbHRhIGFk
anVzdG1lbnQgKHBpeGVscykgZm9yIGVhY2ggd29yZCBicmVhay4KLSAgICBmbG9hdCBtX3BhZGRp
bmc7IC8vIHBpeGVscyB0byBiZSBkaXN0cmlidXRlZCBvdmVyIHRoZSBsaW5lIGF0IHdvcmQgYnJl
YWtzLgotICAgIGZsb2F0IG1fcGFkUGVyV29yZEJyZWFrOyAvLyBwaXhlbHMgdG8gYmUgYWRkZWQg
dG8gZWFjaCB3b3JkIGJyZWFrLgotICAgIGZsb2F0IG1fcGFkRXJyb3I7IC8vIHxtX3BhZFBlcldv
cmRCcmVha3wgbWlnaHQgaGF2ZSBhIGZyYWN0aW9uYWwgY29tcG9uZW50LgotICAgICAgICAgICAg
ICAgICAgICAgIC8vIFNpbmNlIHdlIG9ubHkgYWRkIGEgd2hvbGUgbnVtYmVyIG9mIHBhZGRpbmcg
cGl4ZWxzIGF0Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaCB3b3JkIGJyZWFrIHdlIGFj
Y3VtdWxhdGUgZXJyb3IuIFRoaXMgaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgLy8gbnVt
YmVyIG9mIHBpeGVscyB0aGF0IHdlIGFyZSBiZWhpbmQgc28gZmFyLgotICAgIGludCBtX2xldHRl
clNwYWNpbmc7IC8vIHBpeGVscyB0byBiZSBhZGRlZCBhZnRlciBlYWNoIGdseXBoLgotfTsKLQot
Ci1UZXh0UnVuV2Fsa2VyOjpUZXh0UnVuV2Fsa2VyKGNvbnN0IFRleHRSdW4mIHJ1biwgdW5zaWdu
ZWQgc3RhcnRpbmdYLCBjb25zdCBGb250KiBmb250KQotICAgIDogbV9mb250KGZvbnQpCi0gICAg
LCBtX3N0YXJ0aW5nWChzdGFydGluZ1gpCi0gICAgLCBtX29mZnNldFgobV9zdGFydGluZ1gpCi0g
ICAgLCBtX3J1bihnZXROb3JtYWxpemVkVGV4dFJ1bihydW4sIG1fbm9ybWFsaXplZFJ1biwgbV9u
b3JtYWxpemVkQnVmZmVyKSkKLSAgICAsIG1faXRlcmF0ZUJhY2t3YXJkcyhtX3J1bi5ydGwoKSkK
LSAgICAsIG1fd29yZFNwYWNpbmdBZGp1c3RtZW50KDApCi0gICAgLCBtX3BhZGRpbmcoMCkKLSAg
ICAsIG1fcGFkUGVyV29yZEJyZWFrKDApCi0gICAgLCBtX3BhZEVycm9yKDApCi0gICAgLCBtX2xl
dHRlclNwYWNpbmcoMCkKLXsKLSAgICAvLyBEbyBub3QgdXNlIHxydW58IGluc2lkZSB0aGlzIGNv
bnN0cnVjdG9yLiBVc2UgfG1fcnVufCBpbnN0ZWFkLgotCi0gICAgbWVtc2V0KCZtX2l0ZW0sIDAs
IHNpemVvZihtX2l0ZW0pKTsKLSAgICAvLyBXZSBjYW5ub3Qga25vdywgYWhlYWQgb2YgdGltZSwg
aG93IG1hbnkgZ2x5cGhzIGEgZ2l2ZW4gc2NyaXB0IHJ1bgotICAgIC8vIHdpbGwgcHJvZHVjZS4g
V2UgdGFrZSBhIGd1ZXNzIHRoYXQgc2NyaXB0IHJ1bnMgd2lsbCBub3QgcHJvZHVjZSBtb3JlCi0g
ICAgLy8gdGhhbiB0d2ljZSBhcyBtYW55IGdseXBocyBhcyB0aGVyZSBhcmUgY29kZSBwb2ludHMg
cGx1cyBhIGJpdCBvZgotICAgIC8vIHBhZGRpbmcgYW5kIGZhbGxiYWNrIGlmIHdlIGZpbmQgdGhh
dCB3ZSBhcmUgd3JvbmcuCi0gICAgY3JlYXRlR2x5cGhBcnJheXMoKG1fcnVuLmxlbmd0aCgpICsg
MikgKiAyKTsKLQotICAgIG1faXRlbS5sb2dfY2x1c3RlcnMgPSBuZXcgdW5zaWduZWQgc2hvcnRb
bV9ydW4ubGVuZ3RoKCldOwotCi0gICAgbV9pdGVtLmZhY2UgPSAwOwotICAgIG1faXRlbS5mb250
ID0gYWxsb2NIYXJmYnV6ekZvbnQoKTsKLQotICAgIG1faXRlbS5pdGVtLmJpZGlMZXZlbCA9IG1f
cnVuLnJ0bCgpOwotCi0gICAgbV9pdGVtLnN0cmluZyA9IG1fcnVuLmNoYXJhY3RlcnMoKTsKLSAg
ICBtX2l0ZW0uc3RyaW5nTGVuZ3RoID0gbV9ydW4ubGVuZ3RoKCk7Ci0KLSAgICByZXNldCgpOwot
fQotCi1UZXh0UnVuV2Fsa2VyOjp+VGV4dFJ1bldhbGtlcigpCi17Ci0gICAgZmFzdEZyZWUobV9p
dGVtLmZvbnQpOwotICAgIGRlbGV0ZUdseXBoQXJyYXlzKCk7Ci0gICAgZGVsZXRlW10gbV9pdGVt
LmxvZ19jbHVzdGVyczsKLX0KLQotYm9vbCBUZXh0UnVuV2Fsa2VyOjppc1dvcmRCcmVhayh1bnNp
Z25lZCBpbmRleCkKLXsKLSAgICByZXR1cm4gaW5kZXggJiYgaXNDb2RlcG9pbnRTcGFjZShtX2l0
ZW0uc3RyaW5nW2luZGV4XSkgJiYgIWlzQ29kZXBvaW50U3BhY2UobV9pdGVtLnN0cmluZ1tpbmRl
eCAtIDFdKTsKLX0KLQotaW50IFRleHRSdW5XYWxrZXI6OmRldGVybWluZVdvcmRCcmVha1NwYWNp
bmcodW5zaWduZWQgbG9nQ2x1c3RlcnNJbmRleCkKLXsKLSAgICBpbnQgd29yZEJyZWFrU3BhY2lu
ZyA9IDA7Ci0gICAgLy8gVGhlIGZpcnN0IGhhbGYgb2YgdGhlIGNvbmp1bmN0aW9uIHdvcmtzIGFy
b3VuZCB0aGUgY2FzZSB3aGVyZQotICAgIC8vIG91dHB1dCBnbHlwaHMgYXJlbid0IGFzc29jaWF0
ZWQgd2l0aCBhbnkgY29kZXBvaW50cyBieSB0aGUKLSAgICAvLyBjbHVzdGVycyBsb2cuCi0gICAg
aWYgKGxvZ0NsdXN0ZXJzSW5kZXggPCBtX2l0ZW0uaXRlbS5sZW5ndGgKLSAgICAgICAgJiYgaXNX
b3JkQnJlYWsobV9pdGVtLml0ZW0ucG9zICsgbG9nQ2x1c3RlcnNJbmRleCkpIHsKLSAgICAgICAg
d29yZEJyZWFrU3BhY2luZyA9IG1fd29yZFNwYWNpbmdBZGp1c3RtZW50OwotCi0gICAgICAgIGlm
IChtX3BhZGRpbmcgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgdG9QYWQgPSByb3VuZGYobV9wYWRQ
ZXJXb3JkQnJlYWsgKyBtX3BhZEVycm9yKTsKLSAgICAgICAgICAgIG1fcGFkRXJyb3IgKz0gbV9w
YWRQZXJXb3JkQnJlYWsgLSB0b1BhZDsKLQotICAgICAgICAgICAgaWYgKG1fcGFkZGluZyA8IHRv
UGFkKQotICAgICAgICAgICAgICAgIHRvUGFkID0gbV9wYWRkaW5nOwotICAgICAgICAgICAgbV9w
YWRkaW5nIC09IHRvUGFkOwotICAgICAgICAgICAgd29yZEJyZWFrU3BhY2luZyArPSB0b1BhZDsK
LSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd29yZEJyZWFrU3BhY2luZzsKLX0KLQotLy8g
c2V0UGFkZGluZyBzZXRzIGEgbnVtYmVyIG9mIHBpeGVscyB0byBiZSBkaXN0cmlidXRlZCBhY3Jv
c3MgdGhlIFRleHRSdW4uCi0vLyBXZWJLaXQgdXNlcyB0aGlzIHRvIGp1c3RpZnkgdGV4dC4KLXZv
aWQgVGV4dFJ1bldhbGtlcjo6c2V0UGFkZGluZyhpbnQgcGFkZGluZykKLXsKLSAgICBtX3BhZGRp
bmcgPSBwYWRkaW5nOwotICAgIGlmICghbV9wYWRkaW5nKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBJZiB3ZSBoYXZlIHBhZGRpbmcgdG8gZGlzdHJpYnV0ZSwgdGhlbiB3ZSB0cnkgdG8gZ2l2
ZSBhbiBlcXVhbAotICAgIC8vIGFtb3VudCB0byBlYWNoIHNwYWNlLiBUaGUgbGFzdCBzcGFjZSBn
ZXRzIHRoZSBzbWFsbGVyIGFtb3VudCwgaWYKLSAgICAvLyBhbnkuCi0gICAgdW5zaWduZWQgbnVt
V29yZEJyZWFrcyA9IDA7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9pdGVtLnN0
cmluZ0xlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChpc1dvcmRCcmVhayhpKSkKLSAgICAgICAg
ICAgIG51bVdvcmRCcmVha3MrKzsKLSAgICB9Ci0KLSAgICBpZiAobnVtV29yZEJyZWFrcykKLSAg
ICAgICAgbV9wYWRQZXJXb3JkQnJlYWsgPSBtX3BhZGRpbmcgLyBudW1Xb3JkQnJlYWtzOwotICAg
IGVsc2UKLSAgICAgICAgbV9wYWRQZXJXb3JkQnJlYWsgPSAwOwotfQotCi12b2lkIFRleHRSdW5X
YWxrZXI6OnJlc2V0KCkKLXsKLSAgICBpZiAobV9pdGVyYXRlQmFja3dhcmRzKQotICAgICAgICBt
X2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gbV9ydW4ubGVuZ3RoKCkgLSAxOwotICAgIGVsc2UKLSAg
ICAgICAgbV9pbmRleE9mTmV4dFNjcmlwdFJ1biA9IDA7Ci0gICAgbV9vZmZzZXRYID0gbV9zdGFy
dGluZ1g7Ci19Ci0KLXZvaWQgVGV4dFJ1bldhbGtlcjo6c2V0QmFja3dhcmRzSXRlcmF0aW9uKGJv
b2wgaXNCYWNrd2FyZHMpCi17Ci0gICAgbV9pdGVyYXRlQmFja3dhcmRzID0gaXNCYWNrd2FyZHM7
Ci0gICAgcmVzZXQoKTsKLX0KLQotLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBzY3JpcHQgcnVuLCBy
ZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGUgZW5kIG9mIHRoZQotLy8gVGV4dFJ1biBoYXMgYmVlbiBy
ZWFjaGVkLgotYm9vbCBUZXh0UnVuV2Fsa2VyOjpuZXh0U2NyaXB0UnVuKCkKLXsKLSAgICBpZiAo
bV9pdGVyYXRlQmFja3dhcmRzKSB7Ci0gICAgICAgIC8vIEluIHJpZ2h0LXRvLWxlZnQgbW9kZSB3
ZSBuZWVkIHRvIHJlbmRlciB0aGUgc2hhcGVkIGdseXBoIGJhY2t3YXJkcyBhbmQKLSAgICAgICAg
Ly8gYWxzbyByZW5kZXIgdGhlIHNjcmlwdCBydW5zIHRoZW1zZWx2ZXMgYmFja3dhcmRzLiBTbyBn
aXZlbiBhIFRleHRSdW46Ci0gICAgICAgIC8vICAgIEFBQUFBQUFDVFRUVFRUVCAgIChBID0gQXJh
YmljLCBDID0gQ29tbW9uLCBUID0gVGhhaSkKLSAgICAgICAgLy8gd2UgcmVuZGVyOgotICAgICAg
ICAvLyAgICBUVFRUVFRDQUFBQUFBQQotICAgICAgICAvLyAoYW5kIHRoZSBnbHlwaHMgaW4gZWFj
aCBBLCBDIGFuZCBUIHNlY3Rpb24gYXJlIGJhY2t3YXJkcyB0b28pCi0gICAgICAgIGlmICghaGJf
dXRmMTZfc2NyaXB0X3J1bl9wcmV2KCZtX251bUNvZGVQb2ludHMsICZtX2l0ZW0uaXRlbSwgbV9y
dW4uY2hhcmFjdGVycygpLCBtX3J1bi5sZW5ndGgoKSwgJm1faW5kZXhPZk5leHRTY3JpcHRSdW4p
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBtX2N1cnJlbnRGb250RGF0YSA9
IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKG1faXRlbS5zdHJpbmdbbV9pdGVtLml0ZW0u
cG9zXSwgZmFsc2UpLmZvbnREYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghaGJfdXRm
MTZfc2NyaXB0X3J1bl9uZXh0KCZtX251bUNvZGVQb2ludHMsICZtX2l0ZW0uaXRlbSwgbV9ydW4u
Y2hhcmFjdGVycygpLCBtX3J1bi5sZW5ndGgoKSwgJm1faW5kZXhPZk5leHRTY3JpcHRSdW4pKQot
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIEl0IGlzIGFjdHVhbGx5IHdy
b25nIHRvIGNvbnNpZGVyIHNjcmlwdCBydW5zIGF0IGFsbCBpbiB0aGlzIGNvZGUuCi0gICAgICAg
IC8vIE90aGVyIFdlYktpdCBjb2RlIChlLmcuIE1hYykgc2VnbWVudHMgY29tcGxleCB0ZXh0IGp1
c3QgYnkgZmluZGluZwotICAgICAgICAvLyB0aGUgbG9uZ2VzdCBzcGFuIG9mIHRleHQgY292ZXJl
ZCBieSBhIHNpbmdsZSBmb250LgotICAgICAgICAvLyBCdXQgd2UgY3VycmVudGx5IG5lZWQgdG8g
Y2FsbCBoYl91dGYxNl9zY3JpcHRfcnVuX25leHQgYW55d2F5IHRvIGZpbGwKLSAgICAgICAgLy8g
aW4gdGhlIGhhcmZidXp6IGRhdGEgc3RydWN0dXJlcyB0byBlLmcuIHBpY2sgdGhlIGNvcnJlY3Qg
c2NyaXB0J3Mgc2hhcGVyLgotICAgICAgICAvLyBTbyB3ZSBhbGxvdyB0aGF0IHRvIHJ1biBmaXJz
dCwgdGhlbiBkbyBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIHJhbmdlIGl0Ci0gICAgICAgIC8vIGZv
dW5kIGFuZCB0YWtlIHRoZSBsYXJnZXN0IHN1YnJlZ2lvbiB0aGF0IHN0YXlzIHdpdGhpbiBhIHNp
bmdsZSBmb250LgotICAgICAgICBtX2N1cnJlbnRGb250RGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRh
Rm9yQ2hhcmFjdGVyKG1faXRlbS5zdHJpbmdbbV9pdGVtLml0ZW0ucG9zXSwgZmFsc2UpLmZvbnRE
YXRhOwotICAgICAgICB1bnNpZ25lZCBlbmRPZlJ1bjsKLSAgICAgICAgZm9yIChlbmRPZlJ1biA9
IDE7IGVuZE9mUnVuIDwgbV9pdGVtLml0ZW0ubGVuZ3RoOyArK2VuZE9mUnVuKSB7Ci0gICAgICAg
ICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbmV4dEZvbnREYXRhID0gbV9mb250LT5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIobV9pdGVtLnN0cmluZ1ttX2l0ZW0uaXRlbS5wb3MgKyBlbmRPZlJ1bl0s
IGZhbHNlKS5mb250RGF0YTsKLSAgICAgICAgICAgIGlmIChuZXh0Rm9udERhdGEgIT0gbV9jdXJy
ZW50Rm9udERhdGEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
bV9pdGVtLml0ZW0ubGVuZ3RoID0gZW5kT2ZSdW47Ci0gICAgICAgIG1faW5kZXhPZk5leHRTY3Jp
cHRSdW4gPSBtX2l0ZW0uaXRlbS5wb3MgKyBlbmRPZlJ1bjsKLSAgICB9Ci0KLSAgICBzZXR1cEZv
bnRGb3JTY3JpcHRSdW4oKTsKLSAgICBzaGFwZUdseXBocygpOwotICAgIHNldEdseXBoWFBvc2l0
aW9ucyhydGwoKSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotZmxvYXQgVGV4dFJ1bldhbGtl
cjo6d2lkdGhPZkZ1bGxSdW4oKQotewotICAgIGZsb2F0IHdpZHRoU3VtID0gMDsKLSAgICB3aGls
ZSAobmV4dFNjcmlwdFJ1bigpKQotICAgICAgICB3aWR0aFN1bSArPSB3aWR0aCgpOwotCi0gICAg
cmV0dXJuIHdpZHRoU3VtOwotfQotCi12b2lkIFRleHRSdW5XYWxrZXI6OnNldHVwRm9udEZvclNj
cmlwdFJ1bigpCi17Ci0gICAgY29uc3QgRm9udERhdGEqIGZvbnREYXRhID0gbV9mb250LT5nbHlw
aERhdGFGb3JDaGFyYWN0ZXIobV9pdGVtLnN0cmluZ1ttX2l0ZW0uaXRlbS5wb3NdLCBmYWxzZSku
Zm9udERhdGE7Ci0gICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhID0gZm9u
dERhdGEtPmZvbnREYXRhRm9yQ2hhcmFjdGVyKCcgJyktPnBsYXRmb3JtRGF0YSgpOwotICAgIG1f
aXRlbS5mYWNlID0gcGxhdGZvcm1EYXRhLmhhcmZidXp6RmFjZSgpOwotICAgIHZvaWQqIG9wYXF1
ZVBsYXRmb3JtRGF0YSA9IGNvbnN0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KCZwbGF0Zm9ybURh
dGEpOwotICAgIG1faXRlbS5mb250LT51c2VyRGF0YSA9IG9wYXF1ZVBsYXRmb3JtRGF0YTsKLX0K
LQotSEJfRm9udFJlYyogVGV4dFJ1bldhbGtlcjo6YWxsb2NIYXJmYnV6ekZvbnQoKQotewotICAg
IEhCX0ZvbnRSZWMqIGZvbnQgPSByZWludGVycHJldF9jYXN0PEhCX0ZvbnRSZWMqPihmYXN0TWFs
bG9jKHNpemVvZihIQl9Gb250UmVjKSkpOwotICAgIG1lbXNldChmb250LCAwLCBzaXplb2YoSEJf
Rm9udFJlYykpOwotICAgIGZvbnQtPmtsYXNzID0gJmhhcmZidXp6U2tpYUNsYXNzOwotICAgIGZv
bnQtPnVzZXJEYXRhID0gMDsKLSAgICAvLyBUaGUgdmFsdWVzIHdoaWNoIGhhcmZidXp6U2tpYUNs
YXNzIHJldHVybnMgYXJlIGFscmVhZHkgc2NhbGVkIHRvCi0gICAgLy8gcGl4ZWwgdW5pdHMsIHNv
IHdlIGp1c3Qgc2V0IGFsbCB0aGVzZSB0byBvbmUgdG8gZGlzYWJsZSBmdXJ0aGVyCi0gICAgLy8g
c2NhbGluZy4KLSAgICBmb250LT54X3BwZW0gPSAxOwotICAgIGZvbnQtPnlfcHBlbSA9IDE7Ci0g
ICAgZm9udC0+eF9zY2FsZSA9IDE7Ci0gICAgZm9udC0+eV9zY2FsZSA9IDE7Ci0KLSAgICByZXR1
cm4gZm9udDsKLX0KLQotdm9pZCBUZXh0UnVuV2Fsa2VyOjpkZWxldGVHbHlwaEFycmF5cygpCi17
Ci0gICAgZGVsZXRlW10gbV9pdGVtLmdseXBoczsKLSAgICBkZWxldGVbXSBtX2l0ZW0uYXR0cmli
dXRlczsKLSAgICBkZWxldGVbXSBtX2l0ZW0uYWR2YW5jZXM7Ci0gICAgZGVsZXRlW10gbV9pdGVt
Lm9mZnNldHM7Ci0gICAgZGVsZXRlW10gbV9nbHlwaHMxNjsKLSAgICBkZWxldGVbXSBtX3hQb3Np
dGlvbnM7Ci19Ci0KLXZvaWQgVGV4dFJ1bldhbGtlcjo6Y3JlYXRlR2x5cGhBcnJheXMoaW50IHNp
emUpCi17Ci0gICAgbV9pdGVtLmdseXBocyA9IG5ldyBIQl9HbHlwaFtzaXplXTsKLSAgICBtX2l0
ZW0uYXR0cmlidXRlcyA9IG5ldyBIQl9HbHlwaEF0dHJpYnV0ZXNbc2l6ZV07Ci0gICAgbV9pdGVt
LmFkdmFuY2VzID0gbmV3IEhCX0ZpeGVkW3NpemVdOwotICAgIG1faXRlbS5vZmZzZXRzID0gbmV3
IEhCX0ZpeGVkUG9pbnRbc2l6ZV07Ci0KLSAgICBtX2dseXBoczE2ID0gbmV3IHVpbnQxNl90W3Np
emVdOwotICAgIG1feFBvc2l0aW9ucyA9IG5ldyBTa1NjYWxhcltzaXplXTsKLQotICAgIG1faXRl
bS5udW1fZ2x5cGhzID0gc2l6ZTsKLSAgICBtX2dseXBoc0FycmF5Q2FwYWNpdHkgPSBzaXplOyAv
LyBTYXZlIHRoZSBHbHlwaEFycmF5cyBzaXplLgotICAgIHJlc2V0R2x5cGhBcnJheXMoKTsKLX0K
LQotdm9pZCBUZXh0UnVuV2Fsa2VyOjpyZXNldEdseXBoQXJyYXlzKCkKLXsKLSAgICBpbnQgc2l6
ZSA9IG1faXRlbS5udW1fZ2x5cGhzOwotICAgIC8vIEFsbCB0aGUgdHlwZXMgaGVyZSBkb24ndCBo
YXZlIHBvaW50ZXJzLiBJdCBpcyBzYWZlIHRvIHJlc2V0IHRvCi0gICAgLy8gemVybyB1bmxlc3Mg
SGFyZmJ1enogYnJlYWtzIHRoZSBjb21wYXRpYmlsaXR5IGluIHRoZSBmdXR1cmUuCi0gICAgbWVt
c2V0KG1faXRlbS5nbHlwaHMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGgpKTsKLSAgICBtZW1z
ZXQobV9pdGVtLmF0dHJpYnV0ZXMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGhBdHRyaWJ1dGVz
KSk7Ci0gICAgbWVtc2V0KG1faXRlbS5hZHZhbmNlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9GaXhl
ZCkpOwotICAgIG1lbXNldChtX2l0ZW0ub2Zmc2V0cywgMCwgc2l6ZSAqIHNpemVvZihIQl9GaXhl
ZFBvaW50KSk7Ci0gICAgbWVtc2V0KG1fZ2x5cGhzMTYsIDAsIHNpemUgKiBzaXplb2YodWludDE2
X3QpKTsKLSAgICBtZW1zZXQobV94UG9zaXRpb25zLCAwLCBzaXplICogc2l6ZW9mKFNrU2NhbGFy
KSk7Ci19Ci0KLXZvaWQgVGV4dFJ1bldhbGtlcjo6c2hhcGVHbHlwaHMoKQotewotICAgIC8vIEhC
X1NoYXBlSXRlbSgpIHJlc2V0cyBtX2l0ZW0ubnVtX2dseXBocy4gSWYgdGhlIHByZXZpb3VzIGNh
bGwgdG8KLSAgICAvLyBIQl9TaGFwZUl0ZW0oKSB1c2VkIGxlc3Mgc3BhY2UgdGhhbiB3YXMgYXZh
aWxhYmxlLCB0aGUgY2FwYWNpdHkgb2YKLSAgICAvLyB0aGUgYXJyYXkgbWF5IGJlIGxhcmdlciB0
aGFuIHRoZSBjdXJyZW50IHZhbHVlIG9mIG1faXRlbS5udW1fZ2x5cGhzLiAKLSAgICAvLyBTbywg
d2UgbmVlZCB0byByZXNldCB0aGUgbnVtX2dseXBocyB0byB0aGUgY2FwYWNpdHkgb2YgdGhlIGFy
cmF5LgotICAgIG1faXRlbS5udW1fZ2x5cGhzID0gbV9nbHlwaHNBcnJheUNhcGFjaXR5OwotICAg
IHJlc2V0R2x5cGhBcnJheXMoKTsKLSAgICB3aGlsZSAoIUhCX1NoYXBlSXRlbSgmbV9pdGVtKSkg
ewotICAgICAgICAvLyBXZSBvdmVyZmxvd2VkIG91ciBhcnJheXMuIFJlc2l6ZSBhbmQgcmV0cnku
Ci0gICAgICAgIC8vIEhCX1NoYXBlSXRlbSBmaWxscyBpbiBtX2l0ZW0ubnVtX2dseXBocyB3aXRo
IHRoZSBuZWVkZWQgc2l6ZS4KLSAgICAgICAgZGVsZXRlR2x5cGhBcnJheXMoKTsKLSAgICAgICAg
Ly8gVGhlIHwrIDF8IGhlcmUgaXMgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBIYXJmYnV6ejog
dGhlIEtobWVyCi0gICAgICAgIC8vIHNoYXBlciAoYXQgbGVhc3QpIGNhbiBmYWlsIGJlY2F1c2Ug
b2YgaW5zdWZmaWNpZW50IGdseXBoIGJ1ZmZlcnMKLSAgICAgICAgLy8gYW5kIHJlcXVlc3QgMCBh
ZGRpdGlvbmFsIGdseXBoczogdGhyb3dpbmcgdXMgaW50byBhbiBpbmZpbml0ZQotICAgICAgICAv
LyBsb29wLgotICAgICAgICBjcmVhdGVHbHlwaEFycmF5cyhtX2l0ZW0ubnVtX2dseXBocyArIDEp
OwotICAgIH0KLX0KLQotdm9pZCBUZXh0UnVuV2Fsa2VyOjpzZXRHbHlwaFhQb3NpdGlvbnMoYm9v
bCBpc1JUTCkKLXsKLSAgICBkb3VibGUgcG9zaXRpb24gPSAwOwotICAgIC8vIGxvZ0NsdXN0ZXJz
SW5kZXggaW5kZXhlcyBsb2dDbHVzdGVycyBmb3IgdGhlIGZpcnN0IChvciBsYXN0IHdoZW4KLSAg
ICAvLyBSVEwpIGNvZGVwb2ludCBvZiB0aGUgY3VycmVudCBnbHlwaC4gIEVhY2ggdGltZSB3ZSBh
ZHZhbmNlIGEgZ2x5cGgsCi0gICAgLy8gd2Ugc2tpcCBvdmVyIGFsbCB0aGUgY29kZXBvaW50cyB0
aGF0IGNvbnRyaWJ1dGVkIHRvIHRoZSBjdXJyZW50Ci0gICAgLy8gZ2x5cGguCi0gICAgaW50IGxv
Z0NsdXN0ZXJzSW5kZXggPSAwOwotCi0gICAgaWYgKGlzUlRMKSB7Ci0gICAgICAgIGxvZ0NsdXN0
ZXJzSW5kZXggPSBtX2l0ZW0ubnVtX2dseXBocyAtIDE7Ci0KLSAgICAgICAgLy8gR2x5cGhzIGFy
ZSBzdG9yZWQgaW4gbG9naWNhbCBvcmRlciwgYnV0IGZvciBsYXlvdXQgcHVycG9zZXMgd2UKLSAg
ICAgICAgLy8gYWx3YXlzIGdvIGxlZnQgdG8gcmlnaHQuCi0gICAgICAgIGZvciAoaW50IGkgPSBt
X2l0ZW0ubnVtX2dseXBocyAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICBpZiAoIW1f
Y3VycmVudEZvbnREYXRhLT5pc1plcm9XaWR0aFNwYWNlR2x5cGgobV9nbHlwaHMxNltpXSkpIHsK
LSAgICAgICAgICAgICAgICAvLyBXaGl0ZXNwYWNlIG11c3QgYmUgbGFpZCBvdXQgaW4gbG9naWNh
bCBvcmRlciwgc28gd2hlbiBpbnNlcnRpbmcKLSAgICAgICAgICAgICAgICAvLyBzcGFjZXMgaW4g
UlRMIChidXQgaXRlcmF0aW5nIGluIExUUiBvcmRlcikgd2UgbXVzdCBpbnNlcnQgc3BhY2VzCi0g
ICAgICAgICAgICAgICAgLy8gX2JlZm9yZV8gdGhlIG5leHQgZ2x5cGguCi0gICAgICAgICAgICAg
ICAgaWYgKHN0YXRpY19jYXN0PHVuc2lnbmVkPihpICsgMSkgPj0gbV9pdGVtLm51bV9nbHlwaHMg
fHwgbV9pdGVtLmF0dHJpYnV0ZXNbaSArIDFdLmNsdXN0ZXJTdGFydCkKLSAgICAgICAgICAgICAg
ICAgICAgcG9zaXRpb24gKz0gbV9sZXR0ZXJTcGFjaW5nOwotCi0gICAgICAgICAgICAgICAgcG9z
aXRpb24gKz0gZGV0ZXJtaW5lV29yZEJyZWFrU3BhY2luZyhsb2dDbHVzdGVyc0luZGV4KTsKLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgbV9nbHlwaHMxNltpXSA9IG1faXRlbS5nbHlwaHNb
aV07Ci0gICAgICAgICAgICBkb3VibGUgb2Zmc2V0WCA9IHRydW5jYXRlRml4ZWRQb2ludFRvSW50
ZWdlcihtX2l0ZW0ub2Zmc2V0c1tpXS54KTsKLSAgICAgICAgICAgIG1feFBvc2l0aW9uc1tpXSA9
IG1fb2Zmc2V0WCArIHBvc2l0aW9uICsgb2Zmc2V0WDsKLQotICAgICAgICAgICAgd2hpbGUgKGxv
Z0NsdXN0ZXJzSW5kZXggPiAwICYmIGxvZ0NsdXN0ZXJzKClbbG9nQ2x1c3RlcnNJbmRleF0gPT0g
aSkKLSAgICAgICAgICAgICAgICBsb2dDbHVzdGVyc0luZGV4LS07Ci0KLSAgICAgICAgICAgIGlm
ICghbV9jdXJyZW50Rm9udERhdGEtPmlzWmVyb1dpZHRoU3BhY2VHbHlwaChtX2dseXBoczE2W2ld
KSkKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVn
ZXIobV9pdGVtLmFkdmFuY2VzW2ldKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9pdGVtLm51bV9nbHlwaHM7ICsraSkgewotICAgICAg
ICAgICAgbV9nbHlwaHMxNltpXSA9IG1faXRlbS5nbHlwaHNbaV07Ci0gICAgICAgICAgICBkb3Vi
bGUgb2Zmc2V0WCA9IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihtX2l0ZW0ub2Zmc2V0c1tp
XS54KTsKLSAgICAgICAgICAgIG1feFBvc2l0aW9uc1tpXSA9IG1fb2Zmc2V0WCArIHBvc2l0aW9u
ICsgb2Zmc2V0WDsKLQotICAgICAgICAgICAgaWYgKG1fY3VycmVudEZvbnREYXRhLT5pc1plcm9X
aWR0aFNwYWNlR2x5cGgobV9nbHlwaHMxNltpXSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7
Ci0KLSAgICAgICAgICAgIGRvdWJsZSBhZHZhbmNlID0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRl
Z2VyKG1faXRlbS5hZHZhbmNlc1tpXSk7Ci0KLSAgICAgICAgICAgIGFkdmFuY2UgKz0gZGV0ZXJt
aW5lV29yZEJyZWFrU3BhY2luZyhsb2dDbHVzdGVyc0luZGV4KTsKLQotICAgICAgICAgICAgaWYg
KG1faXRlbS5hdHRyaWJ1dGVzW2ldLmNsdXN0ZXJTdGFydCkKLSAgICAgICAgICAgICAgICBhZHZh
bmNlICs9IG1fbGV0dGVyU3BhY2luZzsKLQotICAgICAgICAgICAgd2hpbGUgKHN0YXRpY19jYXN0
PHVuc2lnbmVkPihsb2dDbHVzdGVyc0luZGV4KSA8IG1faXRlbS5pdGVtLmxlbmd0aCAmJiBsb2dD
bHVzdGVycygpW2xvZ0NsdXN0ZXJzSW5kZXhdID09IGkpCi0gICAgICAgICAgICAgICAgbG9nQ2x1
c3RlcnNJbmRleCsrOwotCi0gICAgICAgICAgICBwb3NpdGlvbiArPSBhZHZhbmNlOwotICAgICAg
ICB9Ci0gICAgfQotICAgIG1fcGl4ZWxXaWR0aCA9IHN0ZDo6bWF4KHBvc2l0aW9uLCAwLjApOwot
ICAgIG1fb2Zmc2V0WCArPSBtX3BpeGVsV2lkdGg7Ci19Ci0KLXZvaWQgVGV4dFJ1bldhbGtlcjo6
bm9ybWFsaXplU3BhY2VzQW5kTWlycm9yQ2hhcnMoY29uc3QgVUNoYXIqIHNvdXJjZSwgYm9vbCBy
dGwsIFVDaGFyKiBkZXN0aW5hdGlvbiwgaW50IGxlbmd0aCkKLXsKLSAgICBpbnQgcG9zaXRpb24g
PSAwOwotICAgIGJvb2wgZXJyb3IgPSBmYWxzZTsKLSAgICAvLyBJdGVyYXRlIGNoYXJhY3RlcnMg
aW4gc291cmNlIGFuZCBtaXJyb3IgY2hhcmFjdGVyIGlmIG5lZWRlZC4KLSAgICB3aGlsZSAocG9z
aXRpb24gPCBsZW5ndGgpIHsKLSAgICAgICAgVUNoYXIzMiBjaGFyYWN0ZXI7Ci0gICAgICAgIGlu
dCBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgVTE2X05FWFQoc291cmNlLCBuZXh0
UG9zaXRpb24sIGxlbmd0aCwgY2hhcmFjdGVyKTsKLSAgICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNT
cGFjZShjaGFyYWN0ZXIpKQotICAgICAgICAgICAgY2hhcmFjdGVyID0gJyAnOwotICAgICAgICBl
bHNlIGlmIChGb250Ojp0cmVhdEFzWmVyb1dpZHRoU3BhY2UoY2hhcmFjdGVyKSkKLSAgICAgICAg
ICAgIGNoYXJhY3RlciA9IHplcm9XaWR0aFNwYWNlOwotICAgICAgICBlbHNlIGlmIChydGwpCi0g
ICAgICAgICAgICBjaGFyYWN0ZXIgPSB1X2NoYXJNaXJyb3IoY2hhcmFjdGVyKTsKLSAgICAgICAg
VTE2X0FQUEVORChkZXN0aW5hdGlvbiwgcG9zaXRpb24sIGxlbmd0aCwgY2hhcmFjdGVyLCBlcnJv
cik7Ci0gICAgICAgIEFTU0VSVCghZXJyb3IpOwotICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3Np
dGlvbjsKLSAgICB9Ci19Ci0KLWNvbnN0IFRleHRSdW4mIFRleHRSdW5XYWxrZXI6OmdldE5vcm1h
bGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9yaWdpbmFsUnVuLCBPd25QdHI8VGV4dFJ1bj4m
IG5vcm1hbGl6ZWRSdW4sIE93bkFycmF5UHRyPFVDaGFyPiYgbm9ybWFsaXplZEJ1ZmZlcikKLXsK
LSAgICAvLyBOb3JtYWxpemUgdGhlIHRleHQgcnVuIGluIHRocmVlIHdheXM6Ci0gICAgLy8gMSkg
Q29udmVydCB0aGUgfG9yaWdpbmFsUnVufCB0byBORkMgbm9ybWFsaXplZCBmb3JtIGlmIGNvbWJp
bmluZyBkaWFjcml0aWNhbCBtYXJrcwotICAgIC8vIChVKzAzMDAuLikgYXJlIHVzZWQgaW4gdGhl
IHJ1bi4gVGhpcyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSBzaW5jZSBtb3N0IE9wZW5UeXBlCi0g
ICAgLy8gZm9udHMgKGUuZy4sIEFyaWFsKSBkb24ndCBoYXZlIHN1YnN0aXR1dGlvbiBydWxlcyBm
b3IgdGhlIGRpYWNyaXRpY2FsIG1hcmtzIGluCi0gICAgLy8gdGhlaXIgR1NVQiB0YWJsZXMuCi0g
ICAgLy8KLSAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZSBpY3U6Ok5vcm1hbGl6ZXI6
OmlzTm9ybWFsaXplZChVTk9STV9ORkMpIEFQSSBoZXJlIHNpbmNlCi0gICAgLy8gdGhlIEFQSSBy
ZXR1cm5zIEZBTFNFICg9IG5vdCBub3JtYWxpemVkKSBmb3IgY29tcGxleCBydW5zIHRoYXQgZG9u
J3QgcmVxdWlyZSBORkMKLSAgICAvLyBub3JtYWxpemF0aW9uIChlLmcuLCBBcmFiaWMgdGV4dCku
IFVubGVzcyB0aGUgcnVuIGNvbnRhaW5zIHRoZSBkaWFjcml0aWNhbCBtYXJrcywKLSAgICAvLyBI
YXJmYnV6eiB3aWxsIGRvIHRoZSBzYW1lIHRoaW5nIGZvciB1cyB1c2luZyB0aGUgR1NVQiB0YWJs
ZS4KLSAgICAvLyAyKSBDb252ZXJ0IHNwYWNpbmcgY2hhcmFjdGVycyBpbnRvIHBsYWluIHNwYWNl
cywgYXMgc29tZSBmb250cyB3aWxsIHByb3ZpZGUgZ2x5cGhzCi0gICAgLy8gZm9yIGNoYXJhY3Rl
cnMgbGlrZSAnXG4nIG90aGVyd2lzZS4KLSAgICAvLyAzKSBDb252ZXJ0IG1pcnJvcmVkIGNoYXJh
Y3RlcnMgc3VjaCBhcyBwYXJlbnRoZXNpcyBmb3IgcnRsIHRleHQuCi0KLSAgICAvLyBDb252ZXJ0
IHRvIE5GQyBmb3JtIGlmIHRoZSB0ZXh0IGhhcyBkaWFjcml0aWNhbCBtYXJrcy4KLSAgICBpY3U6
OlVuaWNvZGVTdHJpbmcgbm9ybWFsaXplZFN0cmluZzsKLSAgICBVRXJyb3JDb2RlIGVycm9yID0g
VV9aRVJPX0VSUk9SOwotCi0gICAgZm9yIChpbnQxNl90IGkgPSAwOyBpIDwgb3JpZ2luYWxSdW4u
bGVuZ3RoKCk7ICsraSkgewotICAgICAgICBVQ2hhciBjaCA9IG9yaWdpbmFsUnVuW2ldOwotICAg
ICAgICBpZiAoOjp1YmxvY2tfZ2V0Q29kZShjaCkgPT0gVUJMT0NLX0NPTUJJTklOR19ESUFDUklU
SUNBTF9NQVJLUykgewotICAgICAgICAgICAgaWN1OjpOb3JtYWxpemVyOjpub3JtYWxpemUoaWN1
OjpVbmljb2RlU3RyaW5nKG9yaWdpbmFsUnVuLmNoYXJhY3RlcnMoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUnVuLmxlbmd0aCgpKSwgVU5PUk1fTkZD
LCAwIC8qIG5vIG9wdGlvbnMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBub3JtYWxpemVkU3RyaW5nLCBlcnJvcik7Ci0gICAgICAgICAgICBpZiAoVV9GQUlMVVJF
KGVycm9yKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSdW47Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vcm1hbGl6ZSBzcGFjZSBhbmQg
bWlycm9yIHBhcmVudGhlc2lzIGZvciBydGwgdGV4dC4KLSAgICBpbnQgbm9ybWFsaXplZEJ1ZmZl
ckxlbmd0aDsKLSAgICBjb25zdCBVQ2hhciogc291cmNlVGV4dDsKLSAgICBpZiAobm9ybWFsaXpl
ZFN0cmluZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCA9IG9y
aWdpbmFsUnVuLmxlbmd0aCgpOwotICAgICAgICBzb3VyY2VUZXh0ID0gb3JpZ2luYWxSdW4uY2hh
cmFjdGVycygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgg
PSBub3JtYWxpemVkU3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBzb3VyY2VUZXh0ID0gbm9ybWFs
aXplZFN0cmluZy5nZXRCdWZmZXIoKTsKLSAgICB9Ci0KLSAgICBub3JtYWxpemVkQnVmZmVyLnNl
dChuZXcgVUNoYXJbbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCArIDFdKTsKLQotICAgIG5vcm1hbGl6
ZVNwYWNlc0FuZE1pcnJvckNoYXJzKHNvdXJjZVRleHQsIG9yaWdpbmFsUnVuLnJ0bCgpLCBub3Jt
YWxpemVkQnVmZmVyLmdldCgpLCBub3JtYWxpemVkQnVmZmVyTGVuZ3RoKTsKLQotICAgIG5vcm1h
bGl6ZWRSdW4uc2V0KG5ldyBUZXh0UnVuKG9yaWdpbmFsUnVuKSk7Ci0gICAgbm9ybWFsaXplZFJ1
bi0+c2V0VGV4dChub3JtYWxpemVkQnVmZmVyLmdldCgpLCBub3JtYWxpemVkQnVmZmVyTGVuZ3Ro
KTsKLSAgICByZXR1cm4gKm5vcm1hbGl6ZWRSdW47Ci19Ci0KIHN0YXRpYyB2b2lkIHNldHVwRm9y
VGV4dFBhaW50aW5nKFNrUGFpbnQqIHBhaW50LCBTa0NvbG9yIGNvbG9yKQogewogICAgIHBhaW50
LT5zZXRUZXh0RW5jb2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKQEAgLTY5
NywyMiArMjAxLDIyIEBAIHZvaWQgRm9udDo6ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4
dCogZ2MsIGNvbnN0IFRleHRSdW4mIHJ1biwKICAgICAgICAgc2V0dXBGb3JUZXh0UGFpbnRpbmco
JnN0cm9rZVBhaW50LCBnYy0+c3Ryb2tlQ29sb3IoKS5yZ2IoKSk7CiAgICAgfQogCi0gICAgVGV4
dFJ1bldhbGtlciB3YWxrZXIocnVuLCBwb2ludC54KCksIHRoaXMpOwotICAgIHdhbGtlci5zZXRX
b3JkU3BhY2luZ0FkanVzdG1lbnQod29yZFNwYWNpbmcoKSk7Ci0gICAgd2Fsa2VyLnNldExldHRl
clNwYWNpbmdBZGp1c3RtZW50KGxldHRlclNwYWNpbmcoKSk7Ci0gICAgd2Fsa2VyLnNldFBhZGRp
bmcocnVuLnBhZGRpbmcoKSk7CisgICAgQ29tcGxleFRleHRDb250cm9sbGVyIGNvbnRyb2xsZXIo
cnVuLCBwb2ludC54KCksIHRoaXMpOworICAgIGNvbnRyb2xsZXIuc2V0V29yZFNwYWNpbmdBZGp1
c3RtZW50KHdvcmRTcGFjaW5nKCkpOworICAgIGNvbnRyb2xsZXIuc2V0TGV0dGVyU3BhY2luZ0Fk
anVzdG1lbnQobGV0dGVyU3BhY2luZygpKTsKKyAgICBjb250cm9sbGVyLnNldFBhZGRpbmcocnVu
LnBhZGRpbmcoKSk7CiAKLSAgICB3aGlsZSAod2Fsa2VyLm5leHRTY3JpcHRSdW4oKSkgeworICAg
IHdoaWxlIChjb250cm9sbGVyLm5leHRTY3JpcHRSdW4oKSkgewogICAgICAgICBpZiAoZmlsbCkg
ewotICAgICAgICAgICAgd2Fsa2VyLmZvbnRQbGF0Zm9ybURhdGFGb3JTY3JpcHRSdW4oKS0+c2V0
dXBQYWludCgmZmlsbFBhaW50KTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFBsYXRmb3Jt
RGF0YUZvclNjcmlwdFJ1bigpLT5zZXR1cFBhaW50KCZmaWxsUGFpbnQpOwogICAgICAgICAgICAg
YWRqdXN0VGV4dFJlbmRlck1vZGUoJmZpbGxQYWludCwgZ2MtPnBsYXRmb3JtQ29udGV4dCgpKTsK
LSAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1Bvc1RleHRIKHdhbGtlci5nbHlwaHMoKSwgd2Fsa2Vy
Lmxlbmd0aCgpIDw8IDEsIHdhbGtlci54UG9zaXRpb25zKCksIHBvaW50LnkoKSwgZmlsbFBhaW50
KTsKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1Bvc1RleHRIKGNvbnRyb2xsZXIuZ2x5cGhzKCks
IGNvbnRyb2xsZXIubGVuZ3RoKCkgPDwgMSwgY29udHJvbGxlci54UG9zaXRpb25zKCksIHBvaW50
LnkoKSwgZmlsbFBhaW50KTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdHJva2UpIHsKLSAg
ICAgICAgICAgIHdhbGtlci5mb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCktPnNldHVwUGFp
bnQoJnN0cm9rZVBhaW50KTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFBsYXRmb3JtRGF0
YUZvclNjcmlwdFJ1bigpLT5zZXR1cFBhaW50KCZzdHJva2VQYWludCk7CiAgICAgICAgICAgICBh
ZGp1c3RUZXh0UmVuZGVyTW9kZSgmc3Ryb2tlUGFpbnQsIGdjLT5wbGF0Zm9ybUNvbnRleHQoKSk7
Ci0gICAgICAgICAgICBjYW52YXMtPmRyYXdQb3NUZXh0SCh3YWxrZXIuZ2x5cGhzKCksIHdhbGtl
ci5sZW5ndGgoKSA8PCAxLCB3YWxrZXIueFBvc2l0aW9ucygpLCBwb2ludC55KCksIHN0cm9rZVBh
aW50KTsKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1Bvc1RleHRIKGNvbnRyb2xsZXIuZ2x5cGhz
KCksIGNvbnRyb2xsZXIubGVuZ3RoKCkgPDwgMSwgY29udHJvbGxlci54UG9zaXRpb25zKCksIHBv
aW50LnkoKSwgc3Ryb2tlUGFpbnQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNzI0LDI3ICsy
MjgsMjcgQEAgdm9pZCBGb250OjpkcmF3RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KEdyYXBo
aWNzQ29udGV4dCogLyogY29udGV4dCAqLywgY29uc3QKIAogZmxvYXQgRm9udDo6ZmxvYXRXaWR0
aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVG
b250RGF0YSo+KiAvKiBmYWxsYmFja0ZvbnRzICovLCBHbHlwaE92ZXJmbG93KiAvKiBnbHlwaE92
ZXJmbG93ICovKSBjb25zdAogewotICAgIFRleHRSdW5XYWxrZXIgd2Fsa2VyKHJ1biwgMCwgdGhp
cyk7Ci0gICAgd2Fsa2VyLnNldFdvcmRTcGFjaW5nQWRqdXN0bWVudCh3b3JkU3BhY2luZygpKTsK
LSAgICB3YWxrZXIuc2V0TGV0dGVyU3BhY2luZ0FkanVzdG1lbnQobGV0dGVyU3BhY2luZygpKTsK
LSAgICByZXR1cm4gd2Fsa2VyLndpZHRoT2ZGdWxsUnVuKCk7CisgICAgQ29tcGxleFRleHRDb250
cm9sbGVyIGNvbnRyb2xsZXIocnVuLCAwLCB0aGlzKTsKKyAgICBjb250cm9sbGVyLnNldFdvcmRT
cGFjaW5nQWRqdXN0bWVudCh3b3JkU3BhY2luZygpKTsKKyAgICBjb250cm9sbGVyLnNldExldHRl
clNwYWNpbmdBZGp1c3RtZW50KGxldHRlclNwYWNpbmcoKSk7CisgICAgcmV0dXJuIGNvbnRyb2xs
ZXIud2lkdGhPZkZ1bGxSdW4oKTsKIH0KIAotc3RhdGljIGludCBnbHlwaEluZGV4Rm9yWFBvc2l0
aW9uSW5TY3JpcHRSdW4oY29uc3QgVGV4dFJ1bldhbGtlciYgd2Fsa2VyLCBpbnQgeCkKK3N0YXRp
YyBpbnQgZ2x5cGhJbmRleEZvclhQb3NpdGlvbkluU2NyaXB0UnVuKGNvbnN0IENvbXBsZXhUZXh0
Q29udHJvbGxlciYgY29udHJvbGxlciwgaW50IHgpCiB7Ci0gICAgY29uc3QgSEJfRml4ZWQqIGFk
dmFuY2VzID0gd2Fsa2VyLmFkdmFuY2VzKCk7Ci0gICAgaW50IGxldHRlclNwYWNpbmcgPSB3YWxr
ZXIubGV0dGVyU3BhY2luZygpOworICAgIGNvbnN0IEhCX0ZpeGVkKiBhZHZhbmNlcyA9IGNvbnRy
b2xsZXIuYWR2YW5jZXMoKTsKKyAgICBpbnQgbGV0dGVyU3BhY2luZyA9IGNvbnRyb2xsZXIubGV0
dGVyU3BhY2luZygpOwogICAgIGludCBnbHlwaEluZGV4OwotICAgIGlmICh3YWxrZXIucnRsKCkp
IHsKLSAgICAgICAgZm9yIChnbHlwaEluZGV4ID0gd2Fsa2VyLmxlbmd0aCgpIC0gMTsgZ2x5cGhJ
bmRleCA+PSAwOyAtLWdseXBoSW5kZXgpIHsKKyAgICBpZiAoY29udHJvbGxlci5ydGwoKSkgewor
ICAgICAgICBmb3IgKGdseXBoSW5kZXggPSBjb250cm9sbGVyLmxlbmd0aCgpIC0gMTsgZ2x5cGhJ
bmRleCA+PSAwOyAtLWdseXBoSW5kZXgpIHsKICAgICAgICAgICAgIC8vIFdoZW4gaXRlcmF0aW5n
IExUUiBvdmVyIFJUTCB0ZXh0LCB3ZSBtdXN0IGluY2x1ZGUgdGhlIHdoaXRlc3BhY2UKICAgICAg
ICAgICAgIC8vIF9iZWZvcmVfIHRoZSBnbHlwaCwgc28gbm8gKyAxIGhlcmUuCi0gICAgICAgICAg
ICBpZiAoeCA8IChzdGF0aWNfY2FzdDxpbnQ+KHdhbGtlci5sZW5ndGgoKSkgLSBnbHlwaEluZGV4
KSAqIGxldHRlclNwYWNpbmcgKyB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIoYWR2YW5jZXNb
Z2x5cGhJbmRleF0pKQorICAgICAgICAgICAgaWYgKHggPCAoc3RhdGljX2Nhc3Q8aW50Pihjb250
cm9sbGVyLmxlbmd0aCgpKSAtIGdseXBoSW5kZXgpICogbGV0dGVyU3BhY2luZyArIHRydW5jYXRl
Rml4ZWRQb2ludFRvSW50ZWdlcihhZHZhbmNlc1tnbHlwaEluZGV4XSkpCiAgICAgICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgICAgICB4IC09IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihh
ZHZhbmNlc1tnbHlwaEluZGV4XSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBm
b3IgKGdseXBoSW5kZXggPSAwOyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ2x5cGhJbmRleCkgPCB3
YWxrZXIubGVuZ3RoKCk7ICsrZ2x5cGhJbmRleCkgeworICAgICAgICBmb3IgKGdseXBoSW5kZXgg
PSAwOyBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ2x5cGhJbmRleCkgPCBjb250cm9sbGVyLmxlbmd0
aCgpOyArK2dseXBoSW5kZXgpIHsKICAgICAgICAgICAgIGlmICh4IDwgKGdseXBoSW5kZXggKiBs
ZXR0ZXJTcGFjaW5nICsgdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKGFkdmFuY2VzW2dseXBo
SW5kZXhdKSkpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB4IC09IHRydW5j
YXRlRml4ZWRQb2ludFRvSW50ZWdlcihhZHZhbmNlc1tnbHlwaEluZGV4XSk7CkBAIC03NjQsOSAr
MjY4LDkgQEAgaW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3Qg
VGV4dFJ1biYgcnVuLCBmbG9hdCB4RmxvYXQsCiAKICAgICAvLyAoTWFjIGNvZGUgaWdub3JlcyBp
bmNsdWRlUGFydGlhbEdseXBocywgYW5kIHRoZXkgZG9uJ3Qga25vdyB3aGF0IGl0J3MKICAgICAv
LyBzdXBwb3NlZCB0byBkbywgc28gd2UganVzdCBpZ25vcmUgaXQgYXMgd2VsbC4pCi0gICAgVGV4
dFJ1bldhbGtlciB3YWxrZXIocnVuLCAwLCB0aGlzKTsKLSAgICB3YWxrZXIuc2V0V29yZFNwYWNp
bmdBZGp1c3RtZW50KHdvcmRTcGFjaW5nKCkpOwotICAgIHdhbGtlci5zZXRMZXR0ZXJTcGFjaW5n
QWRqdXN0bWVudChsZXR0ZXJTcGFjaW5nKCkpOworICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciBj
b250cm9sbGVyKHJ1biwgMCwgdGhpcyk7CisgICAgY29udHJvbGxlci5zZXRXb3JkU3BhY2luZ0Fk
anVzdG1lbnQod29yZFNwYWNpbmcoKSk7CisgICAgY29udHJvbGxlci5zZXRMZXR0ZXJTcGFjaW5n
QWRqdXN0bWVudChsZXR0ZXJTcGFjaW5nKCkpOwogCiAgICAgLy8gSWYgdGhpcyBpcyBSVEwgdGV4
dCwgdGhlIGZpcnN0IGdseXBoIGZyb20gdGhlIGxlZnQgaXMgYWN0dWFsbHkgdGhlIGxhc3QKICAg
ICAvLyBjb2RlIHBvaW50LiBTbyB3ZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgY29kZSBwb2ludHMg
dGhlcmUgYXJlIHRvdGFsIGluCkBAIC03NzUsNyArMjc5LDcgQEAgaW50IEZvbnQ6Om9mZnNldEZv
clBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBmbG9hdCB4RmxvYXQs
CiAgICAgLy8gSW4gTFRSIHdlIGxlYXZlIHRoaXMgYXMgMCBzbyB0aGF0IHdlIGdldCB0aGUgY29y
cmVjdCB2YWx1ZSBmb3IKICAgICAvLyB8YmFzZVBvc2l0aW9ufCwgYmVsb3cuCiAgICAgdW5zaWdu
ZWQgdG90YWxDb2RlUG9pbnRzID0gMDsKLSAgICBpZiAod2Fsa2VyLnJ0bCgpKSB7CisgICAgaWYg
KGNvbnRyb2xsZXIucnRsKCkpIHsKICAgICAgICAgc3NpemVfdCBvZmZzZXQgPSAwOwogICAgICAg
ICB3aGlsZSAob2Zmc2V0IDwgcnVuLmxlbmd0aCgpKSB7CiAgICAgICAgICAgICB1dGYxNl90b19j
b2RlX3BvaW50KHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSwgJm9mZnNldCk7CkBAIC03
OTgsMTUgKzMwMiwxNSBAQCBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4
dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHhGbG9hdCwKICAgICAvLwogICAgIC8vIEZvciBM
VFIsIGJhc2VQb3NpdGlvbiBpcyB6ZXJvIHNvIGl0IGFscmVhZHkgcG9pbnRzIHRvIHRoZSBzdGFy
dCBvZiB0aGUKICAgICAvLyBmaXJzdCBzY3JpcHQgcnVuLgotICAgIHdoaWxlICh3YWxrZXIubmV4
dFNjcmlwdFJ1bigpKSB7Ci0gICAgICAgIGlmICh3YWxrZXIucnRsKCkpCi0gICAgICAgICAgICBi
YXNlUG9zaXRpb24gLT0gd2Fsa2VyLm51bUNvZGVQb2ludHMoKTsKKyAgICB3aGlsZSAoY29udHJv
bGxlci5uZXh0U2NyaXB0UnVuKCkpIHsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIucnRsKCkpCisg
ICAgICAgICAgICBiYXNlUG9zaXRpb24gLT0gY29udHJvbGxlci5udW1Db2RlUG9pbnRzKCk7CiAK
LSAgICAgICAgaWYgKHggPj0gMCAmJiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oeCkgPCB3YWxrZXIu
d2lkdGgoKSkgeworICAgICAgICBpZiAoeCA+PSAwICYmIHN0YXRpY19jYXN0PHVuc2lnbmVkPih4
KSA8IGNvbnRyb2xsZXIud2lkdGgoKSkgewogICAgICAgICAgICAgLy8gVGhlIHggdmFsdWUgaW4g
cXVlc3Rpb24gaXMgd2l0aGluIHRoaXMgc2NyaXB0IHJ1bi4gV2UgY29uc2lkZXIKICAgICAgICAg
ICAgIC8vIGVhY2ggZ2x5cGggaW4gcHJlc2VudGF0aW9uIG9yZGVyIGFuZCBzdG9wIHdoZW4gd2Ug
ZmluZCB0aGUgb25lCiAgICAgICAgICAgICAvLyBjb3ZlcmluZyB0aGlzIHBvc2l0aW9uLgotICAg
ICAgICAgICAgY29uc3QgaW50IGdseXBoSW5kZXggPSBnbHlwaEluZGV4Rm9yWFBvc2l0aW9uSW5T
Y3JpcHRSdW4od2Fsa2VyLCB4KTsKKyAgICAgICAgICAgIGNvbnN0IGludCBnbHlwaEluZGV4ID0g
Z2x5cGhJbmRleEZvclhQb3NpdGlvbkluU2NyaXB0UnVuKGNvbnRyb2xsZXIsIHgpOwogCiAgICAg
ICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgZ2x5cGggaW5kZXgsIHdlIGhhdmUgdG8gdHVy
biB0aGF0IGludG8gYQogICAgICAgICAgICAgLy8gY29kZS1wb2ludCBpbmRleC4gQmVjYXVzZSBv
ZiBsaWdhdHVyZXMsIHNldmVyYWwgY29kZS1wb2ludHMgbWF5CkBAIC04MTgsMTkgKzMyMiwxOSBA
QCBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVu
JiBydW4sIGZsb2F0IHhGbG9hdCwKICAgICAgICAgICAgIC8vIHRoaXMsIHdlIHRha2UgYW55IGNv
ZGUgcG9pbnQgd2hpY2ggY29udHJpYnV0ZWQgdG8gdGhlIGdseXBoIGluCiAgICAgICAgICAgICAv
LyBxdWVzdGlvbiwgb3IgYW55IHN1YnNlcXVlbnQgZ2x5cGguIElmIHdlIHJ1biBvZmYgdGhlIGVu
ZCwgdGhlbgogICAgICAgICAgICAgLy8gd2UgdGFrZSB0aGUgbGFzdCBjb2RlIHBvaW50LgotICAg
ICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIGxvZyA9IHdhbGtlci5sb2dDbHVzdGVycygp
OwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHdhbGtlci5udW1Db2RlUG9p
bnRzKCk7ICsraikgeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIGxvZyA9IGNv
bnRyb2xsZXIubG9nQ2x1c3RlcnMoKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7
IGogPCBjb250cm9sbGVyLm51bUNvZGVQb2ludHMoKTsgKytqKSB7CiAgICAgICAgICAgICAgICAg
aWYgKGxvZ1tqXSA+PSBnbHlwaEluZGV4KQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFz
ZVBvc2l0aW9uICsgajsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmV0dXJuIGJhc2VQ
b3NpdGlvbiArIHdhbGtlci5udW1Db2RlUG9pbnRzKCkgLSAxOworICAgICAgICAgICAgcmV0dXJu
IGJhc2VQb3NpdGlvbiArIGNvbnRyb2xsZXIubnVtQ29kZVBvaW50cygpIC0gMTsKICAgICAgICAg
fQogCi0gICAgICAgIHggLT0gd2Fsa2VyLndpZHRoKCk7CisgICAgICAgIHggLT0gY29udHJvbGxl
ci53aWR0aCgpOwogCi0gICAgICAgIGlmICghd2Fsa2VyLnJ0bCgpKQotICAgICAgICAgICAgYmFz
ZVBvc2l0aW9uICs9IHdhbGtlci5udW1Db2RlUG9pbnRzKCk7CisgICAgICAgIGlmICghY29udHJv
bGxlci5ydGwoKSkKKyAgICAgICAgICAgIGJhc2VQb3NpdGlvbiArPSBjb250cm9sbGVyLm51bUNv
ZGVQb2ludHMoKTsKICAgICB9CiAKICAgICByZXR1cm4gYmFzZVBvc2l0aW9uOwpAQCAtODQyLDU0
ICszNDYsNTQgQEAgRmxvYXRSZWN0IEZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dChj
b25zdCBUZXh0UnVuJiBydW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CiAgICAgaW50IGZyb21YID0gLTEsIHRv
WCA9IC0xLCBmcm9tQWR2YW5jZSA9IC0xLCB0b0FkdmFuY2UgPSAtMTsKLSAgICBUZXh0UnVuV2Fs
a2VyIHdhbGtlcihydW4sIDAsIHRoaXMpOwotICAgIHdhbGtlci5zZXRXb3JkU3BhY2luZ0FkanVz
dG1lbnQod29yZFNwYWNpbmcoKSk7Ci0gICAgd2Fsa2VyLnNldExldHRlclNwYWNpbmdBZGp1c3Rt
ZW50KGxldHRlclNwYWNpbmcoKSk7CisgICAgQ29tcGxleFRleHRDb250cm9sbGVyIGNvbnRyb2xs
ZXIocnVuLCAwLCB0aGlzKTsKKyAgICBjb250cm9sbGVyLnNldFdvcmRTcGFjaW5nQWRqdXN0bWVu
dCh3b3JkU3BhY2luZygpKTsKKyAgICBjb250cm9sbGVyLnNldExldHRlclNwYWNpbmdBZGp1c3Rt
ZW50KGxldHRlclNwYWNpbmcoKSk7CiAKICAgICAvLyBCYXNlIHdpbGwgcG9pbnQgdG8gdGhlIHgg
b2Zmc2V0IGZvciB0aGUgY3VycmVudCBzY3JpcHQgcnVuLiBOb3RlIHRoYXQsIGluCiAgICAgLy8g
dGhlIExUUiBjYXNlLCB3aWR0aCB3aWxsIGJlIDAuCi0gICAgaW50IGJhc2UgPSB3YWxrZXIucnRs
KCkgPyB3YWxrZXIud2lkdGhPZkZ1bGxSdW4oKSA6IDA7CisgICAgaW50IGJhc2UgPSBjb250cm9s
bGVyLnJ0bCgpID8gY29udHJvbGxlci53aWR0aE9mRnVsbFJ1bigpIDogMDsKICAgICBjb25zdCBp
bnQgbGVmdEVkZ2UgPSBiYXNlOwogCiAgICAgLy8gV2Ugd2FudCB0byBlbnVtZXJhdGUgdGhlIHNj
cmlwdCBydW5zIGluIGNvZGUgcG9pbnQgb3JkZXIgaW4gdGhlIGZvbGxvd2luZwotICAgIC8vIGNv
ZGUuIFRoaXMgY2FsbCBhbHNvIHJlc2V0cyB8d2Fsa2VyfC4KLSAgICB3YWxrZXIuc2V0QmFja3dh
cmRzSXRlcmF0aW9uKGZhbHNlKTsKKyAgICAvLyBjb2RlLiBUaGlzIGNhbGwgYWxzbyByZXNldHMg
fGNvbnRyb2xsZXJ8LgorICAgIGNvbnRyb2xsZXIuc2V0QmFja3dhcmRzSXRlcmF0aW9uKGZhbHNl
KTsKIAotICAgIHdoaWxlICh3YWxrZXIubmV4dFNjcmlwdFJ1bigpICYmIChmcm9tWCA9PSAtMSB8
fCB0b1ggPT0gLTEpKSB7Ci0gICAgICAgIC8vIFRleHRSdW5XYWxrZXIgd2lsbCBoZWxwZnVsbHkg
YWNjdWx1bGF0ZSB0aGUgeCBvZmZzZXRzIGZvciBkaWZmZXJlbnQKKyAgICB3aGlsZSAoY29udHJv
bGxlci5uZXh0U2NyaXB0UnVuKCkgJiYgKGZyb21YID09IC0xIHx8IHRvWCA9PSAtMSkpIHsKKyAg
ICAgICAgLy8gQ29tcGxleFRleHRDb250cm9sbGVyIHdpbGwgaGVscGZ1bGx5IGFjY3VsdWxhdGUg
dGhlIHggb2Zmc2V0cyBmb3IgZGlmZmVyZW50CiAgICAgICAgIC8vIHNjcmlwdCBydW5zIGZvciB1
cy4gRm9yIHRoaXMgY29kZSwgaG93ZXZlciwgd2UgYWx3YXlzIHdhbnQgdGhlIHggb2Zmc2V0cwog
ICAgICAgICAvLyB0byBzdGFydCBmcm9tIHplcm8gc28gd2UgY2FsbCB0aGlzIGJlZm9yZSBlYWNo
IHNjcmlwdCBydW4uCi0gICAgICAgIHdhbGtlci5zZXRYT2Zmc2V0VG9aZXJvKCk7CisgICAgICAg
IGNvbnRyb2xsZXIuc2V0WE9mZnNldFRvWmVybygpOwogCi0gICAgICAgIGlmICh3YWxrZXIucnRs
KCkpCi0gICAgICAgICAgICBiYXNlIC09IHdhbGtlci53aWR0aCgpOworICAgICAgICBpZiAoY29u
dHJvbGxlci5ydGwoKSkKKyAgICAgICAgICAgIGJhc2UgLT0gY29udHJvbGxlci53aWR0aCgpOwog
Ci0gICAgICAgIGlmIChmcm9tWCA9PSAtMSAmJiBmcm9tID49IDAgJiYgc3RhdGljX2Nhc3Q8dW5z
aWduZWQ+KGZyb20pIDwgd2Fsa2VyLm51bUNvZGVQb2ludHMoKSkgeworICAgICAgICBpZiAoZnJv
bVggPT0gLTEgJiYgZnJvbSA+PSAwICYmIHN0YXRpY19jYXN0PHVuc2lnbmVkPihmcm9tKSA8IGNv
bnRyb2xsZXIubnVtQ29kZVBvaW50cygpKSB7CiAgICAgICAgICAgICAvLyB8ZnJvbXwgaXMgd2l0
aGluIHRoaXMgc2NyaXB0IHJ1bi4gU28gd2UgaW5kZXggdGhlIGNsdXN0ZXJzIGxvZyB0bwogICAg
ICAgICAgICAgLy8gZmluZCB3aGljaCBnbHlwaCB0aGlzIGNvZGUtcG9pbnQgY29udHJpYnV0ZWQg
dG8gYW5kIGZpbmQgaXRzIHgKICAgICAgICAgICAgIC8vIHBvc2l0aW9uLgotICAgICAgICAgICAg
aW50IGdseXBoID0gd2Fsa2VyLmxvZ0NsdXN0ZXJzKClbZnJvbV07Ci0gICAgICAgICAgICBmcm9t
WCA9IGJhc2UgKyB3YWxrZXIueFBvc2l0aW9ucygpW2dseXBoXTsKLSAgICAgICAgICAgIGZyb21B
ZHZhbmNlID0gd2Fsa2VyLmFkdmFuY2VzKClbZ2x5cGhdOworICAgICAgICAgICAgaW50IGdseXBo
ID0gY29udHJvbGxlci5sb2dDbHVzdGVycygpW2Zyb21dOworICAgICAgICAgICAgZnJvbVggPSBi
YXNlICsgY29udHJvbGxlci54UG9zaXRpb25zKClbZ2x5cGhdOworICAgICAgICAgICAgZnJvbUFk
dmFuY2UgPSBjb250cm9sbGVyLmFkdmFuY2VzKClbZ2x5cGhdOwogICAgICAgICB9IGVsc2UKLSAg
ICAgICAgICAgIGZyb20gLT0gd2Fsa2VyLm51bUNvZGVQb2ludHMoKTsKKyAgICAgICAgICAgIGZy
b20gLT0gY29udHJvbGxlci5udW1Db2RlUG9pbnRzKCk7CiAKLSAgICAgICAgaWYgKHRvWCA9PSAt
MSAmJiB0byA+PSAwICYmIHN0YXRpY19jYXN0PHVuc2lnbmVkPih0bykgPCB3YWxrZXIubnVtQ29k
ZVBvaW50cygpKSB7Ci0gICAgICAgICAgICBpbnQgZ2x5cGggPSB3YWxrZXIubG9nQ2x1c3RlcnMo
KVt0b107Ci0gICAgICAgICAgICB0b1ggPSBiYXNlICsgd2Fsa2VyLnhQb3NpdGlvbnMoKVtnbHlw
aF07Ci0gICAgICAgICAgICB0b0FkdmFuY2UgPSB3YWxrZXIuYWR2YW5jZXMoKVtnbHlwaF07Cisg
ICAgICAgIGlmICh0b1ggPT0gLTEgJiYgdG8gPj0gMCAmJiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4o
dG8pIDwgY29udHJvbGxlci5udW1Db2RlUG9pbnRzKCkpIHsKKyAgICAgICAgICAgIGludCBnbHlw
aCA9IGNvbnRyb2xsZXIubG9nQ2x1c3RlcnMoKVt0b107CisgICAgICAgICAgICB0b1ggPSBiYXNl
ICsgY29udHJvbGxlci54UG9zaXRpb25zKClbZ2x5cGhdOworICAgICAgICAgICAgdG9BZHZhbmNl
ID0gY29udHJvbGxlci5hZHZhbmNlcygpW2dseXBoXTsKICAgICAgICAgfSBlbHNlCi0gICAgICAg
ICAgICB0byAtPSB3YWxrZXIubnVtQ29kZVBvaW50cygpOworICAgICAgICAgICAgdG8gLT0gY29u
dHJvbGxlci5udW1Db2RlUG9pbnRzKCk7CiAKLSAgICAgICAgaWYgKCF3YWxrZXIucnRsKCkpCi0g
ICAgICAgICAgICBiYXNlICs9IHdhbGtlci53aWR0aCgpOworICAgICAgICBpZiAoIWNvbnRyb2xs
ZXIucnRsKCkpCisgICAgICAgICAgICBiYXNlICs9IGNvbnRyb2xsZXIud2lkdGgoKTsKICAgICB9
CiAKICAgICAvLyBUaGUgcG9zaXRpb24gaW4gcXVlc3Rpb24gbWlnaHQgYmUganVzdCBhZnRlciB0
aGUgdGV4dC4KICAgICBjb25zdCBpbnQgcmlnaHRFZGdlID0gYmFzZTsKICAgICBpZiAoZnJvbVgg
PT0gLTEgJiYgIWZyb20pCiAgICAgICAgIGZyb21YID0gbGVmdEVkZ2U7Ci0gICAgZWxzZSBpZiAo
d2Fsa2VyLnJ0bCgpKQorICAgIGVsc2UgaWYgKGNvbnRyb2xsZXIucnRsKCkpCiAgICAgICAgZnJv
bVggKz0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKGZyb21BZHZhbmNlKTsKIAogICAgIGlm
ICh0b1ggPT0gLTEgJiYgIXRvKQo=
</data>
<flag name="review"
          id="69300"
          type_id="1"
          status="+"
          setter="tony"
    />
          </attachment>
      

    </bug>

</bugzilla>