<?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>115086</bug_id>
          
          <creation_ts>2013-04-23 21:50:40 -0700</creation_ts>
          <short_desc>Fold RenderThemeMacShared into RenderThemeMac</short_desc>
          <delta_ts>2013-04-24 08:43:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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="Nico Weber">thakis</reporter>
          <assigned_to name="Nico Weber">thakis</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>esprehn+autocc</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>880322</commentid>
    <comment_count>0</comment_count>
    <who name="Nico Weber">thakis</who>
    <bug_when>2013-04-23 21:50:40 -0700</bug_when>
    <thetext>Fold RenderThemeMacShared into RenderThemeMac</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>880323</commentid>
    <comment_count>1</comment_count>
      <attachid>199386</attachid>
    <who name="Nico Weber">thakis</who>
    <bug_when>2013-04-23 21:51:26 -0700</bug_when>
    <thetext>Created attachment 199386
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>880639</commentid>
    <comment_count>2</comment_count>
      <attachid>199386</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-04-24 08:43:50 -0700</bug_when>
    <thetext>Comment on attachment 199386
Patch

Clearing flags on attachment: 199386

Committed r149040: &lt;http://trac.webkit.org/changeset/149040&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>880640</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-04-24 08:43:52 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>199386</attachid>
            <date>2013-04-23 21:51:26 -0700</date>
            <delta_ts>2013-04-24 08:43:50 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-115086-20130423215051.patch</filename>
            <type>text/plain</type>
            <size>184504</size>
            <attacher name="Nico Weber">thakis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQ5MDE1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYmE5MmZlOWVlNmNkNWIz
NTY0NTQ3NWI3NTU3NDRkMDU5MDI4NDQxOC4uMWU1N2U5NWEyYmQzN2NiYTg2ZTgxYWYxMmFiMzcx
NTVlZTY3YmZjYiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEyOCBAQAorMjAxMy0wNC0yMyAgTmlj
byBXZWJlciAgPHRoYWtpc0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgRm9sZCBSZW5kZXJUaGVt
ZU1hY1NoYXJlZCBpbnRvIFJlbmRlclRoZW1lTWFjCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUwODYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBObyBpbnRlbmRlZCBmdW5jdGlvbmFsaXR5IGNoYW5nZS4K
KworICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAg
KiByZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWMuaDoKKyAgICAgICAgKFJlbmRlclRoZW1lTWFjKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpzdXBwb3J0c0NvbnRyb2xUaW50cyk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6c2Nyb2xsYmFyQ29udHJvbFNpemVG
b3JQYXJ0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpzdXBwb3J0c1NlbGVj
dGlvbkZvcmVncm91bmRDb2xvcnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6
OnN1cHBvcnRzQ2xvc2VkQ2FwdGlvbmluZyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hYzo6dXBkYXRlQWN0aXZlU3RhdGUpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVt
ZU1hYy5tbToKKyAgICAgICAgKC1bV2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2
ZXIgaW5pdFdpdGhUaGVtZTpXZWJDb3JlOjpdKToKKyAgICAgICAgKC1bV2ViQ29yZVJlbmRlclRo
ZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXIgc3lzdGVtQ29sb3JzRGlkQ2hhbmdlOl0pOgorICAgICAg
ICAoLVtXZWJDb3JlVGV4dEZpZWxkQ2VsbCBfY29yZVVJRHJhd09wdGlvbnNXaXRoRnJhbWU6aW5W
aWV3OmluY2x1ZGVGb2N1czpdKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpS
ZW5kZXJUaGVtZU1hYyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6flJlbmRl
clRoZW1lTWFjKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwbGF0Zm9ybUFj
dGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFj
a2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwbGF0Zm9y
bUFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVNYWM6OnBsYXRmb3JtQWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91
bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1JbmFj
dGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVNYWM6OnBsYXRmb3JtRm9jdXNSaW5nQ29sb3IpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVNYWM6OnBsYXRmb3JtSW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OnRvRm9udFdlaWdodCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6c3lzdGVtRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpj
b252ZXJ0TlNDb2xvclRvQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6bWVudUJhY2tncm91bmRD
b2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1Db2xvcnNE
aWRDaGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnN5c3RlbUNvbG9y
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjp1c2VzVGVzdE1vZGVGb2N1c1Jp
bmdDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6aXNDb250cm9sU3R5
bGVkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjphZGp1c3RSZXBhaW50UmVj
dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6aW5mbGF0ZVJlY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OmNvbnZlcnRUb1BhaW50aW5nUmVjdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6dXBkYXRlQ2hlY2tlZFN0YXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjp1cGRhdGVFbmFibGVkU3RhdGUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnVwZGF0ZUZvY3VzZWRTdGF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6dXBkYXRlUHJlc3NlZFN0YXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpjb250cm9sU3VwcG9ydHNUaW50cyk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6Y29udHJvbFNpemVGb3JGb250KToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpzZXRDb250cm9sU2l6ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6c2l6ZUZvckZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVNYWM6OnNpemVGb3JTeXN0ZW1Gb250KToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lTWFjOjpzZXRTaXplRnJvbUZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVNYWM6OnNldEZvbnRGcm9tQ29udHJvbFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVNYWM6OmNvbnRyb2xTaXplRm9yU3lzdGVtRm9udCk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hYzo6cGFpbnRUZXh0RmllbGQpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGhlbWVNYWM6OmFkanVzdFRleHRGaWVsZFN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRoZW1lTWFjOjpwYWludENhcHNMb2NrSW5kaWNhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lTWFjOjpwYWludFRleHRBcmVhKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjOjphZGp1c3RUZXh0QXJlYVN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lTWFjOjpwb3B1cEJ1dHRvbk1hcmdpbnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVNYWM6OnBvcHVwQnV0dG9uU2l6ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVNYWM6OnBvcHVwQnV0dG9uUGFkZGluZyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hYzo6cGFpbnRNZW51TGlzdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6
bWV0ZXJTaXplRm9yQm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpw
YWludE1ldGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpzdXBwb3J0c01l
dGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpsZXZlbEluZGljYXRvclN0
eWxlRm9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpsZXZlbEluZGljYXRv
ckZvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cHJvZ3Jlc3NCYXJTaXpl
cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cHJvZ3Jlc3NCYXJNYXJnaW5z
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjptaW5pbXVtUHJvZ3Jlc3NCYXJI
ZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OmFuaW1hdGlvblJlcGVh
dEludGVydmFsRm9yUHJvZ3Jlc3NCYXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVN
YWM6OmFuaW1hdGlvbkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVNYWM6OmFkanVzdFByb2dyZXNzQmFyU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVNYWM6OnBhaW50UHJvZ3Jlc3NCYXIpOgorICAgICAgICAoV2ViQ29yZTo6
VG9wR3JhZGllbnRJbnRlcnBvbGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpCb3R0b21HcmFkaWVu
dEludGVycG9sYXRlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1haW5HcmFkaWVudEludGVycG9sYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWNrR3JhZGllbnRJbnRlcnBvbGF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZW51TGlzdEJ1dHRvbkdyYWRpZW50cyk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cGFpbnRNZW51TGlzdEJ1dHRvbik6
CisgICAgICAgIChXZWJDb3JlOjptZW51TGlzdEJ1dHRvblNpemVzKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lTWFjOjphZGp1c3RNZW51TGlzdFN0eWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lTWFjOjpwb3B1cEludGVybmFsUGFkZGluZ0xlZnQpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBvcHVwSW50ZXJuYWxQYWRkaW5nVG9wKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwb3B1cEludGVybmFsUGFkZGluZ0Jv
dHRvbSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6YWRqdXN0TWVudUxpc3RC
dXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6c2V0UG9wdXBC
dXR0b25DZWxsU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6Om1lbnVM
aXN0U2l6ZXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6Om1pbmltdW1NZW51
TGlzdFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OmFkanVzdFNsaWRl
clRyYWNrU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBhaW50U2xp
ZGVyVHJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OmFkanVzdFNsaWRl
clRodW1iU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBhaW50U2xp
ZGVyVGh1bWIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBhaW50U2VhcmNo
RmllbGQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnNldFNlYXJjaENlbGxT
dGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6c2VhcmNoRmllbGRTaXpl
cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6c2V0U2VhcmNoRmllbGRTaXpl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjphZGp1c3RTZWFyY2hGaWVsZFN0
eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpwYWludFNlYXJjaEZpZWxk
Q2FuY2VsQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpjYW5jZWxC
dXR0b25TaXplcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6YWRqdXN0U2Vh
cmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZU1hYzo6cmVzdWx0c0J1dHRvblNpemVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
TWFjOjphZGp1c3RTZWFyY2hGaWVsZERlY29yYXRpb25TdHlsZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hYzo6cGFpbnRTZWFyY2hGaWVsZERlY29yYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRp
b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6cGFpbnRTZWFyY2hG
aWVsZFJlc3VsdHNEZWNvcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFj
OjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUaGVtZU1hYzo6cGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b24pOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnBhaW50U25hcHNob3R0ZWRQbHVnaW5PdmVybGF5
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpzbGlkZXJUaWNrU2l6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6c2xpZGVyVGlja09mZnNldEZyb21UcmFj
a0NlbnRlcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6YWRqdXN0U2xpZGVy
VGh1bWJTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpzaG91bGRTaG93
UGxhY2Vob2xkZXJXaGVuRm9jdXNlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1h
Yzo6cG9wdXBCdXR0b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnNlYXJj
aCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6c2VhcmNoTWVudVRlbXBsYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lTWFjOjpzbGlkZXJUaHVtYkhvcml6b250
YWwpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnNsaWRlclRodW1iVmVydGlj
YWwpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVNYWM6OnRleHRGaWVsZCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZU1hYzo6ZmlsZUxpc3ROYW1lRm9yV2lkdGgpOgorICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJlZC5oOiBSZW1vdmVkLgorICAgICAg
ICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJlZC5tbTogUmVtb3ZlZC4KKwogMjAxMy0w
NC0yMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmVtb3Zl
IFRleHRGaWVsZERlY29yYXRpb24gZmVhdHVyZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDQ2YjZlMGFhYWFhN2FhZDRmOTQ4N2Q4
MmNmYTdmNDNmYWRkNjRhOGUuLjAyYTk5NzM2MDQ4OGQ3MjJhZWQ5MmYxYjA5M2MyNDUzZDFhMGI3
MTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oKQEAgLTY4Miw4ICs2ODIsNiBAQAogCQkxQ0Y2QkUxNDBFOUJCNDY3MDAyNUUxQ0QgLyog
T2JqQ05vZGVGaWx0ZXJDb25kaXRpb24ubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSAxQ0Y2QkUxMjBFOUJCNDY3MDAyNUUxQ0QgLyogT2JqQ05vZGVGaWx0
ZXJDb25kaXRpb24ubW0gKi87IH07CiAJCTFDRjZCRTE1MEU5QkI0NjcwMDI1RTFDRCAvKiBPYmpD
Tm9kZUZpbHRlckNvbmRpdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMUNGNkJFMTMwRTlCQjQ2NzAwMjVFMUNEIC8qIE9iakNOb2RlRmlsdGVyQ29u
ZGl0aW9uLmggKi87IH07CiAJCTFDRkFFMzIzMEE2RDZBM0YwMDMyNTkzRCAvKiBsaWJvYmpjLmR5
bGliIGluIEZyYW1ld29ya3MgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUNG
QUUzMjIwQTZENkEzRjAwMzI1OTNEIC8qIGxpYm9iamMuZHlsaWIgKi87IH07Ci0JCTFFNTAwODQ3
MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVtZU1hY1NoYXJlZC5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUU1MDA4NDUxNjUxNkFEODAwQjdFMDk4
IC8qIFJlbmRlclRoZW1lTWFjU2hhcmVkLmggKi87IH07Ci0JCTFFNTAwODQ4MTY1MTZBRDgwMEI3
RTA5OCAvKiBSZW5kZXJUaGVtZU1hY1NoYXJlZC5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDFFNTAwODQ2MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJU
aGVtZU1hY1NoYXJlZC5tbSAqLzsgfTsKIAkJMUYzQzNCRUExMzVDQUYzQzAwQjhDMUFDIC8qIE1l
ZGlhQ29udHJvbHMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMUYzQzNCRTgxMzVDQUYzQzAwQjhDMUFDIC8qIE1lZGlhQ29udHJvbHMuY3BwICovOyB9
OwogCQkxRjNDM0JFQjEzNUNBRjNDMDBCOEMxQUMgLyogTWVkaWFDb250cm9scy5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUYzQzNCRTkxMzVDQUYzQzAw
QjhDMUFDIC8qIE1lZGlhQ29udHJvbHMuaCAqLzsgfTsKIAkJMUYzRjE5NTMxNDk5Q0E3NjAwQTVB
RUE3IC8qIFBPREZyZWVMaXN0QXJlbmEuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDFGM0YxOTUyMTQ5OUNBNzYwMEE1QUVBNyAvKiBQT0RGcmVlTGlzdEFy
ZW5hLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAg
LTY5NzQsOCArNjk3Miw2IEBACiAJCTFDRjZCRTEyMEU5QkI0NjcwMDI1RTFDRCAvKiBPYmpDTm9k
ZUZpbHRlckNvbmRpdGlvbi5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0
aCA9IE9iakNOb2RlRmlsdGVyQ29uZGl0aW9uLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQkxQ0Y2QkUxMzBFOUJCNDY3MDAyNUUxQ0QgLyogT2JqQ05vZGVGaWx0ZXJDb25kaXRpb24u
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gT2JqQ05vZGVGaWx0ZXJDb25kaXRp
b24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMUNGQUUzMjIwQTZENkEzRjAwMzI1
OTNEIC8qIGxpYm9iamMuZHlsaWIgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtu
b3duRmlsZVR5cGUgPSAiY29tcGlsZWQubWFjaC1vLmR5bGliIjsgbmFtZSA9IGxpYm9iamMuZHls
aWI7IHBhdGggPSAvdXNyL2xpYi9saWJvYmpjLmR5bGliOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0
ZT4iOyB9OwotCQkxRTUwMDg0NTE2NTE2QUQ4MDBCN0UwOTggLyogUmVuZGVyVGhlbWVNYWNTaGFy
ZWQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyVGhlbWVNYWNTaGFy
ZWQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJMUU1MDA4NDYxNjUxNkFEODAwQjdF
MDk4IC8qIFJlbmRlclRoZW1lTWFjU2hhcmVkLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
b2JqY3BwOyBwYXRoID0gUmVuZGVyVGhlbWVNYWNTaGFyZWQubW07IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTFGM0MzQkU4MTM1Q0FGM0MwMEI4QzFBQyAvKiBNZWRpYUNvbnRyb2xzLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE1lZGlhQ29udHJvbHMuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxRjNDM0JFOTEzNUNBRjNDMDBCOEMxQUMg
LyogTWVkaWFDb250cm9scy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBNZWRp
YUNvbnRyb2xzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFGM0YxOTUyMTQ5OUNB
NzYwMEE1QUVBNyAvKiBQT0RGcmVlTGlzdEFyZW5hLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IFBPREZyZWVMaXN0QXJlbmEuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
QEAgLTIwMTk3LDggKzIwMTkzLDYgQEAKIAkJCQlCQ0VBNDg0QjA5N0Q5MzAyMDA5NEM5RTQgLyog
UmVuZGVyVGhlbWUuaCAqLywKIAkJCQlCQ0VBNDg0ODA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVy
VGhlbWVNYWMuaCAqLywKIAkJCQlCQ0VBNDg0OTA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGhl
bWVNYWMubW0gKi8sCi0JCQkJMUU1MDA4NDUxNjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRoZW1l
TWFjU2hhcmVkLmggKi8sCi0JCQkJMUU1MDA4NDYxNjUxNkFEODAwQjdFMDk4IC8qIFJlbmRlclRo
ZW1lTWFjU2hhcmVkLm1tICovLAogCQkJCTkzOTU1QTQyMDNENzI5MzIwMDg2MzVDRSAvKiBSZW5k
ZXJUcmVlQXNUZXh0LmNwcCAqLywKIAkJCQk5Mzk1NUE0MTAzRDcyOTMyMDA4NjM1Q0UgLyogUmVu
ZGVyVHJlZUFzVGV4dC5oICovLAogCQkJCUU0QjQxRTMzMENCRkI2MDkwMEFGMkVDRSAvKiBSZW5k
ZXJWaWRlby5jcHAgKi8sCkBAIC0yMzI5Myw3ICsyMzI4Nyw2IEBACiAJCQkJODZGRjg4NjIxNURF
M0QwNzAwQkQ2QjI4IC8qIFJlbmRlclRleHRUcmFja0N1ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
QkNFQTQ4OEEwOTdEOTMwMjAwOTRDOUU0IC8qIFJlbmRlclRoZW1lLmggaW4gSGVhZGVycyAqLywK
IAkJCQlCQ0VBNDg4NzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGhlbWVNYWMuaCBpbiBIZWFk
ZXJzICovLAotCQkJCTFFNTAwODQ3MTY1MTZBRDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVtZU1hY1No
YXJlZC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk5OEMwODI0NUU1OTAwMUU5QUJDIC8qIFJl
bmRlclRyZWVBc1RleHQuaCBpbiBIZWFkZXJzICovLAogCQkJCUU0NDYxNDUyMENENjhBMzUwMEZB
REE3NSAvKiBSZW5kZXJWaWRlby5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4NjgwOTdEOTMw
MjAwOTRDOUU0IC8qIFJlbmRlclZpZXcuaCBpbiBIZWFkZXJzICovLApAQCAtMjYzNzgsNyArMjYz
NzEsNiBAQAogCQkJCTg2RkY4ODYxMTVERTNEMDcwMEJENkIyOCAvKiBSZW5kZXJUZXh0VHJhY2tD
dWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNFQTQ4ODkwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlclRoZW1lLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0ODg4MDk3RDkzMDIwMDk0QzlF
NCAvKiBSZW5kZXJUaGVtZU1hYy5tbSBpbiBTb3VyY2VzICovLAotCQkJCTFFNTAwODQ4MTY1MTZB
RDgwMEI3RTA5OCAvKiBSZW5kZXJUaGVtZU1hY1NoYXJlZC5tbSBpbiBTb3VyY2VzICovLAogCQkJ
CTkzRjE5QUQ1MDgyNDVFNTkwMDFFOUFCQyAvKiBSZW5kZXJUcmVlQXNUZXh0LmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTdDRTMwREE5MTcxQjYzRDIwMEVDMzNFMSAvKiBGcmFtZVNuYXBzaG90dGlu
Z01hYy5tbSBpbiBTb3VyY2VzICovLAogCQkJCUU0NDYxNDUxMENENjhBMzUwMEZBREE3NSAvKiBS
ZW5kZXJWaWRlby5jcHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlclRoZW1lTWFjLmgKaW5kZXggNzk1YTBhYzk3NzgzNmNiZjA5OTJjNDk1MzI5YjZiNzFmMDcz
MDZhOC4uZWE0OGZkNDEyOTYzZWY4NGIzNzViZGZmNzA4YWNiMzdjZDFjYTU4ZSAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLmgKQEAgLTIzLDE5ICsyMyw4MyBAQAog
I2lmbmRlZiBSZW5kZXJUaGVtZU1hY19oCiAjZGVmaW5lIFJlbmRlclRoZW1lTWFjX2gKIAotI2lt
cG9ydCAiUmVuZGVyVGhlbWVNYWNTaGFyZWQuaCIKKyNpbXBvcnQgIlJlbmRlclRoZW1lLmgiCiAj
aW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+CisjaW1wb3J0IDx3dGYvSGFzaE1hcC5oPgorCitPQkpD
X0NMQVNTIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyOwogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKIGNsYXNzIFJlbmRlclByb2dyZXNzOwogY2xhc3MgUmVuZGVyU3R5bGU7
CiAKLWNsYXNzIFJlbmRlclRoZW1lTWFjIDogcHVibGljIFJlbmRlclRoZW1lTWFjU2hhcmVkIHsK
K2NsYXNzIFJlbmRlclRoZW1lTWFjIDogcHVibGljIFJlbmRlclRoZW1lIHsKIHB1YmxpYzoKICAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gY3JlYXRlKCk7CiAKLSAgICB2aXJ0dWFs
IE5TVmlldyogZG9jdW1lbnRWaWV3Rm9yKFJlbmRlck9iamVjdCopIGNvbnN0OworICAgIC8vIEEg
bWV0aG9kIGFza2luZyBpZiB0aGUgY29udHJvbCBjaGFuZ2VzIGl0cyB0aW50IHdoZW4gdGhlIHdp
bmRvdyBoYXMgZm9jdXMgb3Igbm90LgorICAgIHZpcnR1YWwgYm9vbCBjb250cm9sU3VwcG9ydHNU
aW50cyhjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKKworICAgIC8vIEEgZ2VuZXJhbCBtZXRo
b2QgYXNraW5nIGlmIGFueSBjb250cm9sIHRpbnRpbmcgaXMgc3VwcG9ydGVkIGF0IGFsbC4KKyAg
ICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNDb250cm9sVGludHMoKSBjb25zdCB7IHJldHVybiB0cnVl
OyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0UmVwYWludFJlY3QoY29uc3QgUmVuZGVyT2Jq
ZWN0KiwgSW50UmVjdCYpIE9WRVJSSURFOworCisgICAgdmlydHVhbCBib29sIGlzQ29udHJvbFN0
eWxlZChjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IEJvcmRlckRhdGEmLCBjb25zdCBGaWxsTGF5
ZXImLCBjb25zdCBDb2xvciYgYmFja2dyb3VuZENvbG9yKSBjb25zdDsKKworICAgIHZpcnR1YWwg
Q29sb3IgcGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAg
ICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3Io
KSBjb25zdDsKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlTGlzdEJveFNlbGVjdGlv
bkJhY2tncm91bmRDb2xvcigpIGNvbnN0OworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1BY3Rp
dmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBD
b2xvciBwbGF0Zm9ybUluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNv
bnN0OworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25G
b3JlZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtRm9jdXNS
aW5nQ29sb3IoKSBjb25zdDsKKworICAgIHZpcnR1YWwgU2Nyb2xsYmFyQ29udHJvbFNpemUgc2Ny
b2xsYmFyQ29udHJvbFNpemVGb3JQYXJ0KENvbnRyb2xQYXJ0KSB7IHJldHVybiBTbWFsbFNjcm9s
bGJhcjsgfQorCisgICAgdmlydHVhbCB2b2lkIHBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7CisK
KyAgICAvLyBTeXN0ZW0gZm9udHMuCisgICAgdmlydHVhbCB2b2lkIHN5c3RlbUZvbnQoaW50IGNz
c1ZhbHVlSWQsIEZvbnREZXNjcmlwdGlvbiYpIGNvbnN0OworCisgICAgdmlydHVhbCBpbnQgbWlu
aW11bU1lbnVMaXN0U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lk
IGFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKwor
I2lmIEVOQUJMRShEQVRBTElTVF9FTEVNRU5UKQorICAgIHZpcnR1YWwgSW50U2l6ZSBzbGlkZXJU
aWNrU2l6ZSgpIGNvbnN0IE9WRVJSSURFOworICAgIHZpcnR1YWwgaW50IHNsaWRlclRpY2tPZmZz
ZXRGcm9tVHJhY2tDZW50ZXIoKSBjb25zdCBPVkVSUklERTsKKyNlbmRpZgorCisgICAgdmlydHVh
bCBpbnQgcG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAg
dmlydHVhbCBpbnQgcG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSopIGNvbnN0
OworICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5nVG9wKFJlbmRlclN0eWxlKikg
Y29uc3Q7CisgICAgdmlydHVhbCBpbnQgcG9wdXBJbnRlcm5hbFBhZGRpbmdCb3R0b20oUmVuZGVy
U3R5bGUqKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludENhcHNMb2NrSW5kaWNhdG9y
KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKSBPVkVSUklE
RTsKKworICAgIHZpcnR1YWwgYm9vbCBwb3BzTWVudUJ5QXJyb3dLZXlzKCkgY29uc3QgT1ZFUlJJ
REUgeyByZXR1cm4gdHJ1ZTsgfQorCisjaWYgRU5BQkxFKE1FVEVSX0VMRU1FTlQpCisgICAgdmly
dHVhbCBJbnRTaXplIG1ldGVyU2l6ZUZvckJvdW5kcyhjb25zdCBSZW5kZXJNZXRlciosIGNvbnN0
IEludFJlY3QmKSBjb25zdCBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZXRlcihS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmly
dHVhbCBib29sIHN1cHBvcnRzTWV0ZXIoQ29udHJvbFBhcnQpIGNvbnN0OworI2VuZGlmCisKKyNp
ZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKKyAgICAvLyBSZXR1cm5zIHRoZSByZXBlYXQgaW50
ZXJ2YWwgb2YgdGhlIGFuaW1hdGlvbiBmb3IgdGhlIHByb2dyZXNzIGJhci4KKyAgICB2aXJ0dWFs
IGRvdWJsZSBhbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dy
ZXNzKikgY29uc3Q7CisgICAgLy8gUmV0dXJucyB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlv
biBmb3IgdGhlIHByb2dyZXNzIGJhci4KKyAgICB2aXJ0dWFsIGRvdWJsZSBhbmltYXRpb25EdXJh
dGlvbkZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3Q7CisjZW5kaWYKKworICAg
IHZpcnR1YWwgQ29sb3Igc3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0OworICAgIC8v
IENvbnRyb2xzIGNvbG9yIHZhbHVlcyByZXR1cm5lZCBmcm9tIHBsYXRmb3JtRm9jdXNSaW5nQ29s
b3IoKS4gc3lzdGVtQ29sb3IoKSB3aWxsIGJlIHVzZWQgd2hlbiBmYWxzZS4KKyAgICB2aXJ0dWFs
IGJvb2wgdXNlc1Rlc3RNb2RlRm9jdXNSaW5nQ29sb3IoKSBjb25zdDsKKyAgICAvLyBBIHZpZXcg
YXNzb2NpYXRlZCB0byB0aGUgY29udGFpbmVkIGRvY3VtZW50LiBTdWJjbGFzc2VzIG1heSBub3Qg
aGF2ZSBzdWNoIGEgdmlldyBhbmQgcmV0dXJuIGEgZmFrZS4KKyAgICBOU1ZpZXcqIGRvY3VtZW50
Vmlld0ZvcihSZW5kZXJPYmplY3QqKSBjb25zdDsKKwogCiBwcm90ZWN0ZWQ6CiAgICAgUmVuZGVy
VGhlbWVNYWMoKTsKQEAgLTcyLDYgKzEzNiwxMjUgQEAgcHJvdGVjdGVkOgogICAgIHZpcnR1YWwg
dm9pZCBhZGp1c3RNZWRpYVNsaWRlclRodW1iU2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OwogICAg
IHZpcnR1YWwgSW50UG9pbnQgdm9sdW1lU2xpZGVyT2Zmc2V0RnJvbU11dGVCdXR0b24oUmVuZGVy
Qm94KiwgY29uc3QgSW50U2l6ZSYpIGNvbnN0IE9WRVJSSURFOwogI2VuZGlmCisgICAgdmlydHVh
bCBib29sIHN1cHBvcnRzU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9ycygpIGNvbnN0IHsgcmV0dXJu
IGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBh
ZGp1c3RUZXh0RmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50
KikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3Qq
LCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIGFk
anVzdFRleHRBcmVhU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCop
IGNvbnN0OworCisgICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBhZGp1
c3RNZW51TGlzdFN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBj
b25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVj
dCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQg
YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBF
bGVtZW50KikgY29uc3Q7CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKKyAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0UHJvZ3Jlc3NCYXJTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5
bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50UHJvZ3Jlc3NCYXIo
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworI2VuZGlm
CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdFNs
aWRlclRyYWNrU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNv
bnN0OworCisgICAgdmlydHVhbCBib29sIHBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBhZGp1
c3RTbGlkZXJUaHVtYlN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQq
KSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkKFJlbmRlck9iamVj
dCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQg
YWRqdXN0U2VhcmNoRmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVt
ZW50KikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRDYW5jZWxC
dXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7
CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0b24oUmVuZGVyT2Jq
ZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2
b2lkIGFkanVzdFNlYXJjaEZpZWxkRGVjb3JhdGlvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5k
ZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hG
aWVsZERlY29yYXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50
UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0RlY29y
YXRpb25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7
CisgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvbihSZW5k
ZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZl
ciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWlu
dFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8m
LCBjb25zdCBJbnRSZWN0Jik7CisKKyNpZiBFTkFCTEUoVklERU8pCisgICAgdmlydHVhbCBib29s
IHN1cHBvcnRzQ2xvc2VkQ2FwdGlvbmluZygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyNlbmRp
ZgorCisgICAgdmlydHVhbCBib29sIHNob3VsZFNob3dQbGFjZWhvbGRlcldoZW5Gb2N1c2VkKCkg
Y29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbmFwc2hvdHRlZFBsdWdpbk92ZXJsYXko
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCitwcml2
YXRlOgorICAgIHZpcnR1YWwgU3RyaW5nIGZpbGVMaXN0TmFtZUZvcldpZHRoKGNvbnN0IEZpbGVM
aXN0KiwgY29uc3QgRm9udCYsIGludCB3aWR0aCwgYm9vbCBtdWx0aXBsZUZpbGVzQWxsb3dlZCkg
Y29uc3QgT1ZFUlJJREU7CisKKyAgICBJbnRSZWN0IGluZmxhdGVSZWN0KGNvbnN0IEludFJlY3Qm
LCBjb25zdCBJbnRTaXplJiwgY29uc3QgaW50KiBtYXJnaW5zLCBmbG9hdCB6b29tTGV2ZWwgPSAx
LjBmKSBjb25zdDsKKworICAgIEZsb2F0UmVjdCBjb252ZXJ0VG9QYWludGluZ1JlY3QoY29uc3Qg
UmVuZGVyT2JqZWN0KiBpbnB1dFJlbmRlcmVyLCBjb25zdCBSZW5kZXJPYmplY3QqIHBhcnRSZW5k
ZXJlciwgY29uc3QgRmxvYXRSZWN0JiBpbnB1dFJlY3QsIGNvbnN0IEludFJlY3QmKSBjb25zdDsK
KworICAgIC8vIEdldCB0aGUgY29udHJvbCBzaXplIGJhc2VkIG9mZiB0aGUgZm9udC4gVXNlZCBi
eSBzb21lIG9mIHRoZSBjb250cm9scyAobGlrZSBidXR0b25zKS4KKyAgICBOU0NvbnRyb2xTaXpl
IGNvbnRyb2xTaXplRm9yRm9udChSZW5kZXJTdHlsZSopIGNvbnN0OworICAgIE5TQ29udHJvbFNp
emUgY29udHJvbFNpemVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgdm9p
ZCBzZXRDb250cm9sU2l6ZShOU0NlbGwqLCBjb25zdCBJbnRTaXplKiBzaXplcywgY29uc3QgSW50
U2l6ZSYgbWluU2l6ZSwgZmxvYXQgem9vbUxldmVsID0gMS4wZik7CisgICAgdm9pZCBzZXRTaXpl
RnJvbUZvbnQoUmVuZGVyU3R5bGUqLCBjb25zdCBJbnRTaXplKiBzaXplcykgY29uc3Q7CisgICAg
SW50U2l6ZSBzaXplRm9yRm9udChSZW5kZXJTdHlsZSosIGNvbnN0IEludFNpemUqIHNpemVzKSBj
b25zdDsKKyAgICBJbnRTaXplIHNpemVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxlKiwgY29uc3Qg
SW50U2l6ZSogc2l6ZXMpIGNvbnN0OworICAgIHZvaWQgc2V0Rm9udEZyb21Db250cm9sU2l6ZShT
dHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBOU0NvbnRyb2xTaXplKSBjb25zdDsKKworICAg
IHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOwor
ICAgIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCop
OworICAgIHZvaWQgdXBkYXRlRm9jdXNlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVj
dCopOworICAgIHZvaWQgdXBkYXRlUHJlc3NlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9i
amVjdCopOworICAgIC8vIEFuIG9wdGlvbmFsIGhvb2sgZm9yIHN1YmNsYXNzZXMgdG8gdXBkYXRl
IHRoZSBjb250cm9sIHRpbnQgb2YgTlNDZWxsLgorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVBY3Rp
dmVTdGF0ZShOU0NlbGwqLCBjb25zdCBSZW5kZXJPYmplY3QqKSB7IH0KKworICAgIC8vIEhlbHBl
cnMgZm9yIGFkanVzdGluZyBhcHBlYXJhbmNlIGFuZCBmb3IgcGFpbnRpbmcKKworICAgIHZvaWQg
c2V0UG9wdXBCdXR0b25DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVj
dCYpOworICAgIGNvbnN0IEludFNpemUqIHBvcHVwQnV0dG9uU2l6ZXMoKSBjb25zdDsKKyAgICBj
b25zdCBpbnQqIHBvcHVwQnV0dG9uTWFyZ2lucygpIGNvbnN0OworICAgIGNvbnN0IGludCogcG9w
dXBCdXR0b25QYWRkaW5nKE5TQ29udHJvbFNpemUpIGNvbnN0OworICAgIHZvaWQgcGFpbnRNZW51
TGlzdEJ1dHRvbkdyYWRpZW50cyhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25z
dCBJbnRSZWN0Jik7CisgICAgY29uc3QgSW50U2l6ZSogbWVudUxpc3RTaXplcygpIGNvbnN0Owor
CisgICAgY29uc3QgSW50U2l6ZSogc2VhcmNoRmllbGRTaXplcygpIGNvbnN0OworICAgIGNvbnN0
IEludFNpemUqIGNhbmNlbEJ1dHRvblNpemVzKCkgY29uc3Q7CisgICAgY29uc3QgSW50U2l6ZSog
cmVzdWx0c0J1dHRvblNpemVzKCkgY29uc3Q7CisgICAgdm9pZCBzZXRTZWFyY2hDZWxsU3RhdGUo
UmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVjdCYpOworICAgIHZvaWQgc2V0U2VhcmNoRmllbGRT
aXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICBOU1BvcFVwQnV0dG9uQ2VsbCogcG9wdXBC
dXR0b24oKSBjb25zdDsKKyAgICBOU1NlYXJjaEZpZWxkQ2VsbCogc2VhcmNoKCkgY29uc3Q7Cisg
ICAgTlNNZW51KiBzZWFyY2hNZW51VGVtcGxhdGUoKSBjb25zdDsKKyAgICBOU1NsaWRlckNlbGwq
IHNsaWRlclRodW1iSG9yaXpvbnRhbCgpIGNvbnN0OworICAgIE5TU2xpZGVyQ2VsbCogc2xpZGVy
VGh1bWJWZXJ0aWNhbCgpIGNvbnN0OworICAgIE5TVGV4dEZpZWxkQ2VsbCogdGV4dEZpZWxkKCkg
Y29uc3Q7CisKKyNpZiBFTkFCTEUoTUVURVJfRUxFTUVOVCkKKyAgICBOU0xldmVsSW5kaWNhdG9y
U3R5bGUgbGV2ZWxJbmRpY2F0b3JTdHlsZUZvcihDb250cm9sUGFydCkgY29uc3Q7CisgICAgTlNM
ZXZlbEluZGljYXRvckNlbGwqIGxldmVsSW5kaWNhdG9yRm9yKGNvbnN0IFJlbmRlck1ldGVyKikg
Y29uc3Q7CisjZW5kaWYKKworI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQorICAgIGludCBt
aW5pbXVtUHJvZ3Jlc3NCYXJIZWlnaHQoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICBjb25zdCBJ
bnRTaXplKiBwcm9ncmVzc0JhclNpemVzKCkgY29uc3Q7CisgICAgY29uc3QgaW50KiBwcm9ncmVz
c0Jhck1hcmdpbnMoTlNDb250cm9sU2l6ZSkgY29uc3Q7CisjZW5kaWYKKworcHJpdmF0ZToKKyAg
ICBtdXRhYmxlIFJldGFpblB0cjxOU1BvcFVwQnV0dG9uQ2VsbD4gbV9wb3B1cEJ1dHRvbjsKKyAg
ICBtdXRhYmxlIFJldGFpblB0cjxOU1NlYXJjaEZpZWxkQ2VsbD4gbV9zZWFyY2g7CisgICAgbXV0
YWJsZSBSZXRhaW5QdHI8TlNNZW51PiBtX3NlYXJjaE1lbnVUZW1wbGF0ZTsKKyAgICBtdXRhYmxl
IFJldGFpblB0cjxOU1NsaWRlckNlbGw+IG1fc2xpZGVyVGh1bWJIb3Jpem9udGFsOworICAgIG11
dGFibGUgUmV0YWluUHRyPE5TU2xpZGVyQ2VsbD4gbV9zbGlkZXJUaHVtYlZlcnRpY2FsOworICAg
IG11dGFibGUgUmV0YWluUHRyPE5TTGV2ZWxJbmRpY2F0b3JDZWxsPiBtX2xldmVsSW5kaWNhdG9y
OworICAgIG11dGFibGUgUmV0YWluUHRyPE5TVGV4dEZpZWxkQ2VsbD4gbV90ZXh0RmllbGQ7CisK
KyAgICBib29sIG1faXNTbGlkZXJUaHVtYkhvcml6b250YWxQcmVzc2VkOworICAgIGJvb2wgbV9p
c1NsaWRlclRodW1iVmVydGljYWxQcmVzc2VkOworCisgICAgbXV0YWJsZSBIYXNoTWFwPGludCwg
UkdCQTMyPiBtX3N5c3RlbUNvbG9yQ2FjaGU7CisKKyAgICBSZXRhaW5QdHI8V2ViQ29yZVJlbmRl
clRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXI+IG1fbm90aWZpY2F0aW9uT2JzZXJ2ZXI7CiB9Owog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyVGhlbWVNYWMubW0gYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
VGhlbWVNYWMubW0KaW5kZXggMmU4ZDU2ZWYzNjA1NmFhM2U2MGQ0NmQxY2VjZmI2ZWY5Y2UzODlm
Mi4uMWQ2OTdmMzdjNTMwOGU4ZjlhZDQ0YTg0MDc3ZTcxMzJmYzgzYmE5NyAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjLm1tCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hYy5tbQpAQCAtMjAsMjkgKzIwLDEzMyBAQAog
I2ltcG9ydCAiY29uZmlnLmgiCiAjaW1wb3J0ICJSZW5kZXJUaGVtZU1hYy5oIgogCisjaW1wb3J0
ICJCaXRtYXBJbWFnZS5oIgorI2ltcG9ydCAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2ltcG9ydCAi
Q1NTVmFsdWVMaXN0LmgiCisjaW1wb3J0ICJDb2xvck1hYy5oIgorI2ltcG9ydCAiRG9jdW1lbnQu
aCIKICNpbXBvcnQgIkVsZW1lbnQuaCIKICNpbXBvcnQgIkV4Y2VwdGlvbkNvZGVQbGFjZWhvbGRl
ci5oIgorI2ltcG9ydCAiRmlsZUxpc3QuaCIKKyNpbXBvcnQgIkZyYW1lVmlldy5oIgogI2ltcG9y
dCAiR3JhcGhpY3NDb250ZXh0Q0cuaCIKKyNpbXBvcnQgIkhUTUxJbnB1dEVsZW1lbnQuaCIKICNp
bXBvcnQgIkhUTUxNZWRpYUVsZW1lbnQuaCIKKyNpbXBvcnQgIkhUTUxOYW1lcy5oIgorI2ltcG9y
dCAiSFRNTFBsdWdJbkltYWdlRWxlbWVudC5oIgorI2ltcG9ydCAiSW1hZ2UuaCIKKyNpbXBvcnQg
IkltYWdlQnVmZmVyLmgiCiAjaW1wb3J0ICJMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQuaCIK
KyNpbXBvcnQgIkxvY2FsaXplZFN0cmluZ3MuaCIKICNpbXBvcnQgIk1lZGlhQ29udHJvbEVsZW1l
bnRzLmgiCiAjaW1wb3J0ICJQYWludEluZm8uaCIKKyNpbXBvcnQgIlJlbmRlckxheWVyLmgiCiAj
aW1wb3J0ICJSZW5kZXJNZWRpYS5oIgogI2ltcG9ydCAiUmVuZGVyTWVkaWFDb250cm9sRWxlbWVu
dHMuaCIKICNpbXBvcnQgIlJlbmRlck1lZGlhQ29udHJvbHMuaCIKKyNpbXBvcnQgIlJlbmRlclBy
b2dyZXNzLmgiCisjaW1wb3J0ICJSZW5kZXJTbGlkZXIuaCIKKyNpbXBvcnQgIlJlbmRlclNuYXBz
aG90dGVkUGx1Z0luLmgiCiAjaW1wb3J0ICJSZW5kZXJWaWV3LmgiCi0jaW1wb3J0ICJUaW1lUmFu
Z2VzLmgiCisjaW1wb3J0ICJTaGFyZWRCdWZmZXIuaCIKKyNpbXBvcnQgIlN0cmluZ1RydW5jYXRv
ci5oIgorI2ltcG9ydCAiU3R5bGVSZXNvbHZlci5oIgogI2ltcG9ydCAiVGhlbWVNYWMuaCIKLSNp
bXBvcnQgIldlYkNvcmVTeXN0ZW1JbnRlcmZhY2UuaCIKKyNpbXBvcnQgIlRpbWVSYW5nZXMuaCIK
ICNpbXBvcnQgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisjaW1wb3J0ICJXZWJDb3JlTlNDZWxs
RXh0cmFzLmgiCisjaW1wb3J0ICJXZWJDb3JlU3lzdGVtSW50ZXJmYWNlLmgiCisjaW1wb3J0IDx3
dGYvUmV0YWluUHRyLmg+CisjaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+CisjaW1wb3J0IDx3dGYv
U3RkTGliRXh0cmFzLmg+CiAjaW1wb3J0IDxDYXJib24vQ2FyYm9uLmg+CiAjaW1wb3J0IDxDb2Nv
YS9Db2NvYS5oPgotI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgorI2ltcG9ydCA8bWF0aC5oPgor
CisjaWYgRU5BQkxFKE1FVEVSX0VMRU1FTlQpCisjaW5jbHVkZSAiUmVuZGVyTWV0ZXIuaCIKKyNp
bmNsdWRlICJIVE1MTWV0ZXJFbGVtZW50LmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHN0
ZDsKKworLy8gVGhlIG1ldGhvZHMgaW4gdGhpcyBmaWxlIGFyZSBzcGVjaWZpYyB0byB0aGUgTWFj
IE9TIFggcGxhdGZvcm0uCisKKy8vIEZJWE1FOiBUaGUgcGxhdGZvcm0taW5kZXBlbmRlbnQgY29k
ZSBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBmYWN0b3JlZCBvdXQgYW5kIG1lcmdlZCB3aXRoIFJl
bmRlclRoZW1lU2FmYXJpLgorCisvLyBXZSBlc3RpbWF0ZSB0aGUgYW5pbWF0aW9uIHJhdGUgb2Yg
YSBNYWMgT1MgWCBwcm9ncmVzcyBiYXIgaXMgMzMgZnBzLgorLy8gSGFyZCBjb2RlIHRoZSB2YWx1
ZSBoZXJlIGJlY2F1c2Ugd2UgaGF2ZW4ndCBmb3VuZCBBUEkgZm9yIGl0LgorY29uc3QgZG91Ymxl
IHByb2dyZXNzQW5pbWF0aW9uRnJhbWVSYXRlID0gMC4wMzM7CisKKy8vIE1hYyBPUyBYIHByb2dy
ZXNzIGJhciBhbmltYXRpb24gc2VlbXMgdG8gaGF2ZSAyNTYgZnJhbWVzLgorY29uc3QgZG91Ymxl
IHByb2dyZXNzQW5pbWF0aW9uTnVtRnJhbWVzID0gMjU2OworCitAaW50ZXJmYWNlIFdlYkNvcmVS
ZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyIDogTlNPYmplY3QKK3sKKyAgICBXZWJDb3Jl
OjpSZW5kZXJUaGVtZSAqX3RoZW1lOworfQorCistIChpZClpbml0V2l0aFRoZW1lOihXZWJDb3Jl
OjpSZW5kZXJUaGVtZSAqKXRoZW1lOworLSAodm9pZClzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6KE5T
Tm90aWZpY2F0aW9uICopbm90aWZpY2F0aW9uOworCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBX
ZWJDb3JlUmVuZGVyVGhlbWVOb3RpZmljYXRpb25PYnNlcnZlcgorCistIChpZClpbml0V2l0aFRo
ZW1lOihXZWJDb3JlOjpSZW5kZXJUaGVtZSAqKXRoZW1lCit7CisgICAgaWYgKCEoc2VsZiA9IFtz
dXBlciBpbml0XSkpCisgICAgICAgIHJldHVybiBuaWw7CisKKyAgICBfdGhlbWUgPSB0aGVtZTsK
KyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZClzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6KE5T
Tm90aWZpY2F0aW9uICopdW51c2VkTm90aWZpY2F0aW9uCit7CisgICAgQVNTRVJUX1VOVVNFRCh1
bnVzZWROb3RpZmljYXRpb24sIFtbdW51c2VkTm90aWZpY2F0aW9uIG5hbWVdIGlzRXF1YWxUb1N0
cmluZzpOU1N5c3RlbUNvbG9yc0RpZENoYW5nZU5vdGlmaWNhdGlvbl0pOworICAgIF90aGVtZS0+
cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKK30KKworQGVuZAorCitAaW50ZXJmYWNlIE5TVGV4
dEZpZWxkQ2VsbCAoV0tEZXRhaWxzKQorLSAoQ0ZEaWN0aW9uYXJ5UmVmKV9jb3JlVUlEcmF3T3B0
aW9uc1dpdGhGcmFtZTooTlNSZWN0KWNlbGxGcmFtZSBpblZpZXc6KE5TVmlldyAqKWNvbnRyb2xW
aWV3IGluY2x1ZGVGb2N1czooQk9PTClpbmNsdWRlRm9jdXM7CitAZW5kCisKKworQGludGVyZmFj
ZSBXZWJDb3JlVGV4dEZpZWxkQ2VsbCA6IE5TVGV4dEZpZWxkQ2VsbAorLSAoQ0ZEaWN0aW9uYXJ5
UmVmKV9jb3JlVUlEcmF3T3B0aW9uc1dpdGhGcmFtZTooTlNSZWN0KWNlbGxGcmFtZSBpblZpZXc6
KE5TVmlldyAqKWNvbnRyb2xWaWV3IGluY2x1ZGVGb2N1czooQk9PTClpbmNsdWRlRm9jdXM7CitA
ZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBXZWJDb3JlVGV4dEZpZWxkQ2VsbAorLSAoQ0ZEaWN0aW9u
YXJ5UmVmKV9jb3JlVUlEcmF3T3B0aW9uc1dpdGhGcmFtZTooTlNSZWN0KWNlbGxGcmFtZSBpblZp
ZXc6KE5TVmlldyAqKWNvbnRyb2xWaWV3IGluY2x1ZGVGb2N1czooQk9PTClpbmNsdWRlRm9jdXMK
K3sKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhIHBvc3QtTGlvbi1vbmx5IHdvcmthcm91bmQgZm9y
IDxyZGFyOi8vcHJvYmxlbS8xMTM4NTQ2MT4uIFdoZW4gdGhhdCBidWcgaXMgcmVzb2x2ZWQsIHdl
IHNob3VsZCByZW1vdmUgdGhpcyBjb2RlLgorICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgY29y
ZVVJRHJhd09wdGlvbnMgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weShOVUxMLCAwLCBb
c3VwZXIgX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lOmNlbGxGcmFtZSBpblZpZXc6Y29udHJv
bFZpZXcgaW5jbHVkZUZvY3VzOmluY2x1ZGVGb2N1c10pOworICAgIENGRGljdGlvbmFyeVNldFZh
bHVlKGNvcmVVSURyYXdPcHRpb25zLCBAImJvcmRlcnMgb25seSIsIGtDRkJvb2xlYW5UcnVlKTsK
KyAgICByZXR1cm4gKENGRGljdGlvbmFyeVJlZilbTlNNYWtlQ29sbGVjdGFibGUoY29yZVVJRHJh
d09wdGlvbnMpIGF1dG9yZWxlYXNlXTsKK30KK0BlbmQKIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
CiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCitlbnVtIHsKKyAgICB0b3BNYXJnaW4sCisg
ICAgcmlnaHRNYXJnaW4sCisgICAgYm90dG9tTWFyZ2luLAorICAgIGxlZnRNYXJnaW4KK307CisK
K2VudW0geworICAgIHRvcFBhZGRpbmcsCisgICAgcmlnaHRQYWRkaW5nLAorICAgIGJvdHRvbVBh
ZGRpbmcsCisgICAgbGVmdFBhZGRpbmcKK307CisKIFBhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJl
bmRlclRoZW1lOjp0aGVtZUZvclBhZ2UoUGFnZSopCiB7CiAgICAgc3RhdGljIFJlbmRlclRoZW1l
KiBydCA9IFJlbmRlclRoZW1lTWFjOjpjcmVhdGUoKS5sZWFrUmVmKCk7CkBAIC01NSwxMSArMTU5
LDE5IEBAIFBhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lTWFjOjpjcmVhdGUoKQog
fQogCiBSZW5kZXJUaGVtZU1hYzo6UmVuZGVyVGhlbWVNYWMoKQorICAgIDogbV9pc1NsaWRlclRo
dW1iSG9yaXpvbnRhbFByZXNzZWQoZmFsc2UpCisgICAgLCBtX2lzU2xpZGVyVGh1bWJWZXJ0aWNh
bFByZXNzZWQoZmFsc2UpCisgICAgLCBtX25vdGlmaWNhdGlvbk9ic2VydmVyKEFkb3B0TlMsIFtb
V2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXIgYWxsb2NdIGluaXRXaXRoVGhl
bWU6dGhpc10pCiB7CisgICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBh
ZGRPYnNlcnZlcjptX25vdGlmaWNhdGlvbk9ic2VydmVyLmdldCgpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOkBzZWxlY3Rv
cihzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTpOU1N5c3RlbUNvbG9yc0RpZENoYW5n
ZU5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG9iamVjdDpuaWxdOwogfQogCiBSZW5kZXJUaGVtZU1hYzo6flJlbmRl
clRoZW1lTWFjKCkKIHsKKyAgICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJd
IHJlbW92ZU9ic2VydmVyOm1fbm90aWZpY2F0aW9uT2JzZXJ2ZXIuZ2V0KCldOwogfQogCiBOU1Zp
ZXcqIFJlbmRlclRoZW1lTWFjOjpkb2N1bWVudFZpZXdGb3IoUmVuZGVyT2JqZWN0KiBvKSBjb25z
dApAQCAtNDE4LDQgKzUzMCwxNzQ5IEBAIEludFBvaW50IFJlbmRlclRoZW1lTWFjOjp2b2x1bWVT
bGlkZXJPZmZzZXRGcm9tTXV0ZUJ1dHRvbihSZW5kZXJCb3gqIG11dGVCdXR0b25CCiAKICNlbmRp
ZiAvLyBFTkFCTEUoVklERU8pCiAKK0NvbG9yIFJlbmRlclRoZW1lTWFjOjpwbGF0Zm9ybUFjdGl2
ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgTlNDb2xvciogY29sb3Ig
PSBbW05TQ29sb3Igc2VsZWN0ZWRUZXh0QmFja2dyb3VuZENvbG9yXSBjb2xvclVzaW5nQ29sb3JT
cGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlXTsKKyAgICByZXR1cm4gQ29sb3Ioc3RhdGlj
X2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciByZWRDb21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50
PigyNTUuMCAqIFtjb2xvciBncmVlbkNvbXBvbmVudF0pLCBzdGF0aWNfY2FzdDxpbnQ+KDI1NS4w
ICogW2NvbG9yIGJsdWVDb21wb25lbnRdKSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lTWFjOjpw
bGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBO
U0NvbG9yKiBjb2xvciA9IFtbTlNDb2xvciBzZWNvbmRhcnlTZWxlY3RlZENvbnRyb2xDb2xvcl0g
Y29sb3JVc2luZ0NvbG9yU3BhY2VOYW1lOk5TRGV2aWNlUkdCQ29sb3JTcGFjZV07CisgICAgcmV0
dXJuIENvbG9yKHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgcmVkQ29tcG9uZW50XSks
IHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgZ3JlZW5Db21wb25lbnRdKSwgc3RhdGlj
X2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBibHVlQ29tcG9uZW50XSkpOworfQorCitDb2xvciBS
ZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1BY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENv
bG9yKCkgY29uc3QKK3sKKyAgICBOU0NvbG9yKiBjb2xvciA9IFtbTlNDb2xvciBhbHRlcm5hdGVT
ZWxlY3RlZENvbnRyb2xDb2xvcl0gY29sb3JVc2luZ0NvbG9yU3BhY2VOYW1lOk5TRGV2aWNlUkdC
Q29sb3JTcGFjZV07CisgICAgcmV0dXJuIENvbG9yKHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBb
Y29sb3IgcmVkQ29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgZ3Jl
ZW5Db21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBibHVlQ29tcG9u
ZW50XSkpOworfQorCitDb2xvciBSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1BY3RpdmVMaXN0Qm94
U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gQ29sb3I6Ondo
aXRlOworfQorCitDb2xvciBSZW5kZXJUaGVtZU1hYzo6cGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hT
ZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xvcjo6Ymxh
Y2s7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lTWFjOjpwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkg
Y29uc3QKK3sKKyAgICBpZiAodXNlc1Rlc3RNb2RlRm9jdXNSaW5nQ29sb3IoKSkKKyAgICAgICAg
cmV0dXJuIG9sZEFxdWFGb2N1c1JpbmdDb2xvcigpOworCisgICAgcmV0dXJuIHN5c3RlbUNvbG9y
KENTU1ZhbHVlV2Via2l0Rm9jdXNSaW5nQ29sb3IpOworfQorCitDb2xvciBSZW5kZXJUaGVtZU1h
Yzo6cGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25z
dAoreworICAgIHJldHVybiBwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9y
KCk7Cit9CisKK3N0YXRpYyBGb250V2VpZ2h0IHRvRm9udFdlaWdodChOU0ludGVnZXIgYXBwS2l0
Rm9udFdlaWdodCkKK3sKKyAgICBBU1NFUlQoYXBwS2l0Rm9udFdlaWdodCA+IDAgJiYgYXBwS2l0
Rm9udFdlaWdodCA8IDE1KTsKKyAgICBpZiAoYXBwS2l0Rm9udFdlaWdodCA+IDE0KQorICAgICAg
ICBhcHBLaXRGb250V2VpZ2h0ID0gMTQ7CisgICAgZWxzZSBpZiAoYXBwS2l0Rm9udFdlaWdodCA8
IDEpCisgICAgICAgIGFwcEtpdEZvbnRXZWlnaHQgPSAxOworCisgICAgc3RhdGljIEZvbnRXZWln
aHQgZm9udFdlaWdodHNbXSA9IHsKKyAgICAgICAgRm9udFdlaWdodDEwMCwKKyAgICAgICAgRm9u
dFdlaWdodDEwMCwKKyAgICAgICAgRm9udFdlaWdodDIwMCwKKyAgICAgICAgRm9udFdlaWdodDMw
MCwKKyAgICAgICAgRm9udFdlaWdodDQwMCwKKyAgICAgICAgRm9udFdlaWdodDUwMCwKKyAgICAg
ICAgRm9udFdlaWdodDYwMCwKKyAgICAgICAgRm9udFdlaWdodDYwMCwKKyAgICAgICAgRm9udFdl
aWdodDcwMCwKKyAgICAgICAgRm9udFdlaWdodDgwMCwKKyAgICAgICAgRm9udFdlaWdodDgwMCwK
KyAgICAgICAgRm9udFdlaWdodDkwMCwKKyAgICAgICAgRm9udFdlaWdodDkwMCwKKyAgICAgICAg
Rm9udFdlaWdodDkwMAorICAgIH07CisgICAgcmV0dXJuIGZvbnRXZWlnaHRzW2FwcEtpdEZvbnRX
ZWlnaHQgLSAxXTsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hYzo6c3lzdGVtRm9udChpbnQgY3Nz
VmFsdWVJZCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIHN5c3RlbUZvbnQsICgpKTsKKyAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgc21hbGxTeXN0ZW1Gb250LCAo
KSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIG1lbnVGb250LCAo
KSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIGxhYmVsRm9udCwg
KCkpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0aW9uLCBtaW5pQ29udHJv
bEZvbnQsICgpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlvbiwgc21h
bGxDb250cm9sRm9udCwgKCkpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0
aW9uLCBjb250cm9sRm9udCwgKCkpOworCisgICAgRm9udERlc2NyaXB0aW9uKiBjYWNoZWREZXNj
OworICAgIE5TRm9udCogZm9udCA9IG5pbDsKKyAgICBzd2l0Y2ggKGNzc1ZhbHVlSWQpIHsKKyAg
ICAgICAgY2FzZSBDU1NWYWx1ZVNtYWxsQ2FwdGlvbjoKKyAgICAgICAgICAgIGNhY2hlZERlc2Mg
PSAmc21hbGxTeXN0ZW1Gb250OworICAgICAgICAgICAgaWYgKCFzbWFsbFN5c3RlbUZvbnQuaXNB
YnNvbHV0ZVNpemUoKSkKKyAgICAgICAgICAgICAgICBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250
T2ZTaXplOltOU0ZvbnQgc21hbGxTeXN0ZW1Gb250U2l6ZV1dOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgQ1NTVmFsdWVNZW51OgorICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZt
ZW51Rm9udDsKKyAgICAgICAgICAgIGlmICghbWVudUZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAg
ICAgICAgICAgICAgICBmb250ID0gW05TRm9udCBtZW51Rm9udE9mU2l6ZTpbTlNGb250IHN5c3Rl
bUZvbnRTaXplXV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVN0
YXR1c0JhcjoKKyAgICAgICAgICAgIGNhY2hlZERlc2MgPSAmbGFiZWxGb250OworICAgICAgICAg
ICAgaWYgKCFsYWJlbEZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAgICAgICAgICAgICBmb250
ID0gW05TRm9udCBsYWJlbEZvbnRPZlNpemU6W05TRm9udCBsYWJlbEZvbnRTaXplXV07CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdE1pbmlDb250cm9sOgor
ICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZtaW5pQ29udHJvbEZvbnQ7CisgICAgICAgICAgICBp
ZiAoIW1pbmlDb250cm9sRm9udC5pc0Fic29sdXRlU2l6ZSgpKQorICAgICAgICAgICAgICAgIGZv
bnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNv
bnRyb2xTaXplOk5TTWluaUNvbnRyb2xTaXplXV07CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFNtYWxsQ29udHJvbDoKKyAgICAgICAgICAgIGNhY2hlZERl
c2MgPSAmc21hbGxDb250cm9sRm9udDsKKyAgICAgICAgICAgIGlmICghc21hbGxDb250cm9sRm9u
dC5pc0Fic29sdXRlU2l6ZSgpKQorICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3Rl
bUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXplOk5TU21hbGxD
b250cm9sU2l6ZV1dOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVX
ZWJraXRDb250cm9sOgorICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZjb250cm9sRm9udDsKKyAg
ICAgICAgICAgIGlmICghY29udHJvbEZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAgICAgICAg
ICAgICBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNp
emVGb3JDb250cm9sU2l6ZTpOU1JlZ3VsYXJDb250cm9sU2l6ZV1dOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYWNoZWREZXNjID0gJnN5c3RlbUZv
bnQ7CisgICAgICAgICAgICBpZiAoIXN5c3RlbUZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAg
ICAgICAgICAgICBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVt
Rm9udFNpemVdXTsKKyAgICB9CisKKyAgICBpZiAoZm9udCkgeworICAgICAgICBOU0ZvbnRNYW5h
Z2VyICpmb250TWFuYWdlciA9IFtOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5hZ2VyXTsKKyAg
ICAgICAgY2FjaGVkRGVzYy0+c2V0SXNBYnNvbHV0ZVNpemUodHJ1ZSk7CisgICAgICAgIGNhY2hl
ZERlc2MtPnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7CisgICAg
ICAgIGNhY2hlZERlc2MtPmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KFtmb250IHdlYkNvcmVGYW1p
bHlOYW1lXSk7CisgICAgICAgIGNhY2hlZERlc2MtPnNldFNwZWNpZmllZFNpemUoW2ZvbnQgcG9p
bnRTaXplXSk7CisgICAgICAgIGNhY2hlZERlc2MtPnNldFdlaWdodCh0b0ZvbnRXZWlnaHQoW2Zv
bnRNYW5hZ2VyIHdlaWdodE9mRm9udDpmb250XSkpOworICAgICAgICBjYWNoZWREZXNjLT5zZXRJ
dGFsaWMoW2ZvbnRNYW5hZ2VyIHRyYWl0c09mRm9udDpmb250XSAmIE5TSXRhbGljRm9udE1hc2sp
OworICAgIH0KKyAgICBmb250RGVzY3JpcHRpb24gPSAqY2FjaGVkRGVzYzsKK30KKworc3RhdGlj
IFJHQkEzMiBjb252ZXJ0TlNDb2xvclRvQ29sb3IoTlNDb2xvciAqY29sb3IpCit7CisgICAgTlND
b2xvciAqY29sb3JJbkNvbG9yU3BhY2UgPSBbY29sb3IgY29sb3JVc2luZ0NvbG9yU3BhY2VOYW1l
Ok5TRGV2aWNlUkdCQ29sb3JTcGFjZV07CisgICAgaWYgKGNvbG9ySW5Db2xvclNwYWNlKSB7Cisg
ICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgc2NhbGVGYWN0b3IgPSBuZXh0YWZ0ZXIoMjU2LjAs
IDAuMCk7CisgICAgICAgIHJldHVybiBtYWtlUkdCKHN0YXRpY19jYXN0PGludD4oc2NhbGVGYWN0
b3IgKiBbY29sb3JJbkNvbG9yU3BhY2UgcmVkQ29tcG9uZW50XSksCisgICAgICAgICAgICBzdGF0
aWNfY2FzdDxpbnQ+KHNjYWxlRmFjdG9yICogW2NvbG9ySW5Db2xvclNwYWNlIGdyZWVuQ29tcG9u
ZW50XSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNjYWxlRmFjdG9yICogW2NvbG9y
SW5Db2xvclNwYWNlIGJsdWVDb21wb25lbnRdKSk7CisgICAgfQorCisgICAgLy8gVGhpcyBjb252
ZXJzaW9uIGFib3ZlIGNhbiBmYWlsIGlmIHRoZSBOU0NvbG9yIGluIHF1ZXN0aW9uIGlzIGFuIE5T
UGF0dGVybkNvbG9yCisgICAgLy8gKGFzIG1hbnkgc3lzdGVtIGNvbG9ycyBhcmUpLiBUaGVzZSBj
b2xvcnMgYXJlIGFjdHVhbGx5IGEgcmVwZWF0aW5nIHBhdHRlcm4KKyAgICAvLyBub3QganVzdCBh
IHNvbGlkIGNvbG9yLiBUbyB3b3JrIGFyb3VuZCB0aGlzIHdlIHNpbXBseSBkcmF3IGEgMXgxIGlt
YWdlIG9mCisgICAgLy8gdGhlIGNvbG9yIGFuZCB1c2UgdGhhdCBwaXhlbCdzIGNvbG9yLiBJdCBt
aWdodCBiZSBiZXR0ZXIgdG8gdXNlIGFuIGF2ZXJhZ2Ugb2YKKyAgICAvLyB0aGUgY29sb3JzIGlu
IHRoZSBwYXR0ZXJuIGluc3RlYWQuCisgICAgTlNCaXRtYXBJbWFnZVJlcCAqb2Zmc2NyZWVuUmVw
ID0gW1tOU0JpdG1hcEltYWdlUmVwIGFsbG9jXSBpbml0V2l0aEJpdG1hcERhdGFQbGFuZXM6bmls
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1dpZGU6MQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
aXhlbHNIaWdoOjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZTo4CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzYW1wbGVzUGVyUGl4ZWw6NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FscGhhOllF
UworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGxhbmFyOk5PCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29s
b3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0
ZXNQZXJSb3c6NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclBpeGVsOjMyXTsKKworICAgIFtO
U0dyYXBoaWNzQ29udGV4dCBzYXZlR3JhcGhpY3NTdGF0ZV07CisgICAgW05TR3JhcGhpY3NDb250
ZXh0IHNldEN1cnJlbnRDb250ZXh0OltOU0dyYXBoaWNzQ29udGV4dCBncmFwaGljc0NvbnRleHRX
aXRoQml0bWFwSW1hZ2VSZXA6b2Zmc2NyZWVuUmVwXV07CisgICAgTlNFcmFzZVJlY3QoTlNNYWtl
UmVjdCgwLCAwLCAxLCAxKSk7CisgICAgW2NvbG9yIGRyYXdTd2F0Y2hJblJlY3Q6TlNNYWtlUmVj
dCgwLCAwLCAxLCAxKV07CisgICAgW05TR3JhcGhpY3NDb250ZXh0IHJlc3RvcmVHcmFwaGljc1N0
YXRlXTsKKworICAgIE5TVUludGVnZXIgcGl4ZWxbNF07CisgICAgW29mZnNjcmVlblJlcCBnZXRQ
aXhlbDpwaXhlbCBhdFg6MCB5OjBdOworCisgICAgW29mZnNjcmVlblJlcCByZWxlYXNlXTsKKwor
ICAgIHJldHVybiBtYWtlUkdCKHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pOworfQorCitz
dGF0aWMgUkdCQTMyIG1lbnVCYWNrZ3JvdW5kQ29sb3IoKQoreworICAgIE5TQml0bWFwSW1hZ2VS
ZXAgKm9mZnNjcmVlblJlcCA9IFtbTlNCaXRtYXBJbWFnZVJlcCBhbGxvY10gaW5pdFdpdGhCaXRt
YXBEYXRhUGxhbmVzOm5pbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNXaWRlOjEKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcGl4ZWxzSGlnaDoxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1w
bGU6OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlclBpeGVsOjQKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBoYXNBbHBoYTpZRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BsYW5hcjpOTworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbG9yU3BhY2VOYW1lOk5TRGV2aWNlUkdCQ29sb3JTcGFjZQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJ5dGVzUGVyUm93OjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJQaXhl
bDozMl07CisKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHN0YXRpY19jYXN0PENHQ29udGV4
dFJlZj4oW1tOU0dyYXBoaWNzQ29udGV4dCBncmFwaGljc0NvbnRleHRXaXRoQml0bWFwSW1hZ2VS
ZXA6b2Zmc2NyZWVuUmVwXSBncmFwaGljc1BvcnRdKTsKKyAgICBDR1JlY3QgcmVjdCA9IENHUmVj
dE1ha2UoMCwgMCwgMSwgMSk7CisgICAgSElUaGVtZU1lbnVEcmF3SW5mbyBkcmF3SW5mbzsKKyAg
ICBkcmF3SW5mby52ZXJzaW9uID0gIDA7CisgICAgZHJhd0luZm8ubWVudVR5cGUgPSBrVGhlbWVN
ZW51VHlwZVBvcFVwOworICAgIEhJVGhlbWVEcmF3TWVudUJhY2tncm91bmQoJnJlY3QsICZkcmF3
SW5mbywgY29udGV4dCwga0hJVGhlbWVPcmllbnRhdGlvbkludmVydGVkKTsKKworICAgIE5TVUlu
dGVnZXIgcGl4ZWxbNF07CisgICAgW29mZnNjcmVlblJlcCBnZXRQaXhlbDpwaXhlbCBhdFg6MCB5
OjBdOworCisgICAgW29mZnNjcmVlblJlcCByZWxlYXNlXTsKKworICAgIHJldHVybiBtYWtlUkdC
KHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFj
OjpwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpCit7CisgICAgbV9zeXN0ZW1Db2xvckNhY2hlLmNs
ZWFyKCk7CisgICAgUmVuZGVyVGhlbWU6OnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7Cit9CisK
K0NvbG9yIFJlbmRlclRoZW1lTWFjOjpzeXN0ZW1Db2xvcihpbnQgY3NzVmFsdWVJZCkgY29uc3QK
K3sKKyAgICB7CisgICAgICAgIEhhc2hNYXA8aW50LCBSR0JBMzI+OjppdGVyYXRvciBpdCA9IG1f
c3lzdGVtQ29sb3JDYWNoZS5maW5kKGNzc1ZhbHVlSWQpOworICAgICAgICBpZiAoaXQgIT0gbV9z
eXN0ZW1Db2xvckNhY2hlLmVuZCgpKQorICAgICAgICAgICAgcmV0dXJuIGl0LT52YWx1ZTsKKyAg
ICB9CisKKyAgICBDb2xvciBjb2xvcjsKKyAgICBzd2l0Y2ggKGNzc1ZhbHVlSWQpIHsKKyAgICAg
ICAgY2FzZSBDU1NWYWx1ZUFjdGl2ZWJvcmRlcjoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVy
dE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGtleWJvYXJkRm9jdXNJbmRpY2F0b3JDb2xvcl0pOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVBY3RpdmVjYXB0aW9uOgor
ICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igd2luZG93
RnJhbWVUZXh0Q29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1Zh
bHVlQXBwd29ya3NwYWNlOgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29s
b3IoW05TQ29sb3IgaGVhZGVyQ29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIENTU1ZhbHVlQmFja2dyb3VuZDoKKyAgICAgICAgICAgIC8vIFVzZSB0aGVtZSBpbmRlcGVu
ZGVudCBkZWZhdWx0CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUJ1
dHRvbmZhY2U6CisgICAgICAgICAgICAvLyBXZSB1c2UgdGhpcyB2YWx1ZSBpbnN0ZWFkIG9mIE5T
Q29sb3IncyBjb250cm9sQ29sb3IgdG8gYXZvaWQgd2Vic2l0ZSBpbmNvbXBhdGliaWxpdGllcy4K
KyAgICAgICAgICAgIC8vIFdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIHRvIHVzZSB0aGUgTlND
b2xvciBpbiBmdXR1cmUuCisgICAgICAgICAgICBjb2xvciA9IDB4RkZDMEMwQzA7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbmhpZ2hsaWdodDoKKyAgICAg
ICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xIaWdo
bGlnaHRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVC
dXR0b25zaGFkb3c6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihb
TlNDb2xvciBjb250cm9sU2hhZG93Q29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIENTU1ZhbHVlQnV0dG9udGV4dDoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5T
Q29sb3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xUZXh0Q29sb3JdKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlQ2FwdGlvbnRleHQ6CisgICAgICAgICAgICBjb2xv
ciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0Q29sb3JdKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlR3JheXRleHQ6CisgICAgICAgICAgICBj
b2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBkaXNhYmxlZENvbnRyb2xUZXh0
Q29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlSGlnaGxp
Z2h0OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Ig
c2VsZWN0ZWRUZXh0QmFja2dyb3VuZENvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBDU1NWYWx1ZUhpZ2hsaWdodHRleHQ6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZl
cnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBzZWxlY3RlZFRleHRDb2xvcl0pOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVJbmFjdGl2ZWJvcmRlcjoKKyAgICAgICAg
ICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xCYWNrZ3Jv
dW5kQ29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlSW5h
Y3RpdmVjYXB0aW9uOgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3Io
W05TQ29sb3IgY29udHJvbEJhY2tncm91bmRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgQ1NTVmFsdWVJbmFjdGl2ZWNhcHRpb250ZXh0OgorICAgICAgICAgICAgY29s
b3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgdGV4dENvbG9yXSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUluZm9iYWNrZ3JvdW5kOgorICAgICAg
ICAgICAgLy8gVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBOU0NvbG9yIGZvciB0aGlzIHNvIHdl
IHVzZSBhIGhhcmQgY29kZWQgdmFsdWUuCisgICAgICAgICAgICBjb2xvciA9IDB4RkZGQkZDQzU7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZUluZm90ZXh0OgorICAg
ICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgdGV4dENvbG9y
XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZU1lbnU6CisgICAg
ICAgICAgICBjb2xvciA9IG1lbnVCYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIENTU1ZhbHVlTWVudXRleHQ6CisgICAgICAgICAgICBjb2xvciA9IGNv
bnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBzZWxlY3RlZE1lbnVJdGVtVGV4dENvbG9yXSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVNjcm9sbGJhcjoKKyAg
ICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHNjcm9sbEJh
ckNvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVRleHQ6
CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0
Q29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlVGhyZWVk
ZGFya3NoYWRvdzoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtO
U0NvbG9yIGNvbnRyb2xEYXJrU2hhZG93Q29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIENTU1ZhbHVlVGhyZWVkc2hhZG93OgorICAgICAgICAgICAgY29sb3IgPSBjb252
ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igc2hhZG93Q29sb3JdKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlVGhyZWVkZmFjZToKKyAgICAgICAgICAgIC8vIFdl
IHVzZSB0aGlzIHZhbHVlIGluc3RlYWQgb2YgTlNDb2xvcidzIGNvbnRyb2xDb2xvciB0byBhdm9p
ZCB3ZWJzaXRlIGluY29tcGF0aWJpbGl0aWVzLgorICAgICAgICAgICAgLy8gV2UgbWF5IHdhbnQg
dG8gY2hhbmdlIHRoaXMgdG8gdXNlIHRoZSBOU0NvbG9yIGluIGZ1dHVyZS4KKyAgICAgICAgICAg
IGNvbG9yID0gMHhGRkMwQzBDMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENT
U1ZhbHVlVGhyZWVkaGlnaGxpZ2h0OgorICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xv
clRvQ29sb3IoW05TQ29sb3IgaGlnaGxpZ2h0Q29sb3JdKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIENTU1ZhbHVlVGhyZWVkbGlnaHRzaGFkb3c6CisgICAgICAgICAgICBjb2xv
ciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBjb250cm9sTGlnaHRIaWdobGlnaHRD
b2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRG
b2N1c1JpbmdDb2xvcjoKKyAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9y
KFtOU0NvbG9yIGtleWJvYXJkRm9jdXNJbmRpY2F0b3JDb2xvcl0pOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3c6CisgICAgICAgICAgICBjb2xvciA9IGNv
bnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB3aW5kb3dCYWNrZ3JvdW5kQ29sb3JdKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENTU1ZhbHVlV2luZG93ZnJhbWU6CisgICAg
ICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB3aW5kb3dGcmFt
ZUNvbG9yXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVdpbmRv
d3RleHQ6CisgICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xv
ciB3aW5kb3dGcmFtZVRleHRDb2xvcl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisg
ICAgaWYgKCFjb2xvci5pc1ZhbGlkKCkpCisgICAgICAgIGNvbG9yID0gUmVuZGVyVGhlbWU6OnN5
c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworCisgICAgaWYgKGNvbG9yLmlzVmFsaWQoKSkKKyAgICAg
ICAgbV9zeXN0ZW1Db2xvckNhY2hlLnNldChjc3NWYWx1ZUlkLCBjb2xvci5yZ2IoKSk7CisKKyAg
ICByZXR1cm4gY29sb3I7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWM6OnVzZXNUZXN0TW9kZUZv
Y3VzUmluZ0NvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gV2ViQ29yZTo6dXNlc1Rlc3RNb2Rl
Rm9jdXNSaW5nQ29sb3IoKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hYzo6aXNDb250cm9sU3R5
bGVkKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgQm9yZGVyRGF0YSYgYm9yZGVyLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGxMYXllciYgYmFj
a2dyb3VuZCwgY29uc3QgQ29sb3ImIGJhY2tncm91bmRDb2xvcikgY29uc3QKK3sKKyAgICBpZiAo
c3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBUZXh0RmllbGRQYXJ0IHx8IHN0eWxlLT5hcHBlYXJhbmNl
KCkgPT0gVGV4dEFyZWFQYXJ0IHx8IHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTGlzdGJveFBhcnQp
CisgICAgICAgIHJldHVybiBzdHlsZS0+Ym9yZGVyKCkgIT0gYm9yZGVyOworCisgICAgLy8gRklY
TUU6IFRoaXMgaXMgaG9ycmlibGUsIGJ1dCB0aGVyZSBpcyBub3QgbXVjaCBlbHNlIHRoYXQgY2Fu
IGJlIGRvbmUuICBNZW51IGxpc3RzIGNhbm5vdCBkcmF3IHByb3Blcmx5IHdoZW4KKyAgICAvLyBz
Y2FsZWQuICBUaGV5IGNhbid0IHJlYWxseSBkcmF3IHByb3Blcmx5IHdoZW4gdHJhbnNmb3JtZWQg
ZWl0aGVyLiAgV2UgY2FuJ3QgZGV0ZWN0IHRoZSB0cmFuc2Zvcm0gY2FzZSBhdCBzdHlsZQorICAg
IC8vIGFkanVzdG1lbnQgdGltZSBzbyB0aGF0IHdpbGwganVzdCBoYXZlIHRvIHN0YXkgYnJva2Vu
LiAgV2UgY2FuIGhvd2V2ZXIgZGV0ZWN0IHRoYXQgd2UncmUgem9vbWluZy4gIElmIHpvb21pbmcK
KyAgICAvLyBpcyBpbiBlZmZlY3Qgd2UgdHJlYXQgaXQgbGlrZSB0aGUgY29udHJvbCBpcyBzdHls
ZWQuCisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0ICYmIHN0eWxl
LT5lZmZlY3RpdmVab29tKCkgIT0gMS4wZikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBy
ZXR1cm4gUmVuZGVyVGhlbWU6OmlzQ29udHJvbFN0eWxlZChzdHlsZSwgYm9yZGVyLCBiYWNrZ3Jv
dW5kLCBiYWNrZ3JvdW5kQ29sb3IpOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RS
ZXBhaW50UmVjdChjb25zdCBSZW5kZXJPYmplY3QqIG8sIEludFJlY3QmIHIpCit7CisgICAgQ29u
dHJvbFBhcnQgcGFydCA9IG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKKworI2lmIFVTRShORVdf
VEhFTUUpCisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgICAgIGNhc2UgQ2hlY2tib3hQYXJ0Ogor
ICAgICAgICBjYXNlIFJhZGlvUGFydDoKKyAgICAgICAgY2FzZSBQdXNoQnV0dG9uUGFydDoKKyAg
ICAgICAgY2FzZSBTcXVhcmVCdXR0b25QYXJ0OgorICAgICAgICBjYXNlIERlZmF1bHRCdXR0b25Q
YXJ0OgorICAgICAgICBjYXNlIEJ1dHRvblBhcnQ6CisgICAgICAgIGNhc2UgSW5uZXJTcGluQnV0
dG9uUGFydDoKKyAgICAgICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6YWRqdXN0UmVwYWludFJl
Y3Qobywgcik7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cisj
ZW5kaWYKKworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20o
KTsKKworICAgIGlmIChwYXJ0ID09IE1lbnVsaXN0UGFydCkgeworICAgICAgICBzZXRQb3B1cEJ1
dHRvbkNlbGxTdGF0ZShvLCByKTsKKyAgICAgICAgSW50U2l6ZSBzaXplID0gcG9wdXBCdXR0b25T
aXplcygpW1twb3B1cEJ1dHRvbigpIGNvbnRyb2xTaXplXV07CisgICAgICAgIHNpemUuc2V0SGVp
Z2h0KHNpemUuaGVpZ2h0KCkgKiB6b29tTGV2ZWwpOworICAgICAgICBzaXplLnNldFdpZHRoKHIu
d2lkdGgoKSk7CisgICAgICAgIHIgPSBpbmZsYXRlUmVjdChyLCBzaXplLCBwb3B1cEJ1dHRvbk1h
cmdpbnMoKSwgem9vbUxldmVsKTsKKyAgICB9Cit9CisKK0ludFJlY3QgUmVuZGVyVGhlbWVNYWM6
OmluZmxhdGVSZWN0KGNvbnN0IEludFJlY3QmIHIsIGNvbnN0IEludFNpemUmIHNpemUsIGNvbnN0
IGludCogbWFyZ2lucywgZmxvYXQgem9vbUxldmVsKSBjb25zdAoreworICAgIC8vIE9ubHkgZG8g
dGhlIGluZmxhdGlvbiBpZiB0aGUgYXZhaWxhYmxlIHdpZHRoL2hlaWdodCBhcmUgdG9vIHNtYWxs
LiAgT3RoZXJ3aXNlIHRyeSB0bworICAgIC8vIGZpdCB0aGUgZ2xvdy9jaGVjayBzcGFjZSBpbnRv
IHRoZSBhdmFpbGFibGUgYm94J3Mgd2lkdGgvaGVpZ2h0LgorICAgIGludCB3aWR0aERlbHRhID0g
ci53aWR0aCgpIC0gKHNpemUud2lkdGgoKSArIG1hcmdpbnNbbGVmdE1hcmdpbl0gKiB6b29tTGV2
ZWwgKyBtYXJnaW5zW3JpZ2h0TWFyZ2luXSAqIHpvb21MZXZlbCk7CisgICAgaW50IGhlaWdodERl
bHRhID0gci5oZWlnaHQoKSAtIChzaXplLmhlaWdodCgpICsgbWFyZ2luc1t0b3BNYXJnaW5dICog
em9vbUxldmVsICsgbWFyZ2luc1tib3R0b21NYXJnaW5dICogem9vbUxldmVsKTsKKyAgICBJbnRS
ZWN0IHJlc3VsdChyKTsKKyAgICBpZiAod2lkdGhEZWx0YSA8IDApIHsKKyAgICAgICAgcmVzdWx0
LnNldFgocmVzdWx0LngoKSAtIG1hcmdpbnNbbGVmdE1hcmdpbl0gKiB6b29tTGV2ZWwpOworICAg
ICAgICByZXN1bHQuc2V0V2lkdGgocmVzdWx0LndpZHRoKCkgLSB3aWR0aERlbHRhKTsKKyAgICB9
CisgICAgaWYgKGhlaWdodERlbHRhIDwgMCkgeworICAgICAgICByZXN1bHQuc2V0WShyZXN1bHQu
eSgpIC0gbWFyZ2luc1t0b3BNYXJnaW5dICogem9vbUxldmVsKTsKKyAgICAgICAgcmVzdWx0LnNl
dEhlaWdodChyZXN1bHQuaGVpZ2h0KCkgLSBoZWlnaHREZWx0YSk7CisgICAgfQorICAgIHJldHVy
biByZXN1bHQ7Cit9CisKK0Zsb2F0UmVjdCBSZW5kZXJUaGVtZU1hYzo6Y29udmVydFRvUGFpbnRp
bmdSZWN0KGNvbnN0IFJlbmRlck9iamVjdCogaW5wdXRSZW5kZXJlciwgY29uc3QgUmVuZGVyT2Jq
ZWN0KiBwYXJ0UmVuZGVyZXIsIGNvbnN0IEZsb2F0UmVjdCYgaW5wdXRSZWN0LCBjb25zdCBJbnRS
ZWN0JiByKSBjb25zdAoreworICAgIEZsb2F0UmVjdCBwYXJ0UmVjdChpbnB1dFJlY3QpOworCisg
ICAgLy8gQ29tcHV0ZSBhbiBvZmZzZXQgYmV0d2VlbiB0aGUgcGFydCByZW5kZXJlciBhbmQgdGhl
IGlucHV0IHJlbmRlcmVyCisgICAgRmxvYXRTaXplIG9mZnNldEZyb21JbnB1dFJlbmRlcmVyOwor
ICAgIGNvbnN0IFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBwYXJ0UmVuZGVyZXI7CisgICAgd2hp
bGUgKHJlbmRlcmVyICYmIHJlbmRlcmVyICE9IGlucHV0UmVuZGVyZXIpIHsKKyAgICAgICAgUmVu
ZGVyT2JqZWN0KiBjb250YWluaW5nUmVuZGVyZXIgPSByZW5kZXJlci0+Y29udGFpbmVyKCk7Cisg
ICAgICAgIG9mZnNldEZyb21JbnB1dFJlbmRlcmVyIC09IHJvdW5kZWRJbnRTaXplKHJlbmRlcmVy
LT5vZmZzZXRGcm9tQ29udGFpbmVyKGNvbnRhaW5pbmdSZW5kZXJlciwgTGF5b3V0UG9pbnQoKSkp
OworICAgICAgICByZW5kZXJlciA9IGNvbnRhaW5pbmdSZW5kZXJlcjsKKyAgICB9CisgICAgLy8g
SWYgdGhlIGlucHV0IHJlbmRlcmVyIHdhcyBub3QgYSBjb250YWluZXIsIHNvbWV0aGluZyB3ZW50
IHdyb25nCisgICAgQVNTRVJUKHJlbmRlcmVyID09IGlucHV0UmVuZGVyZXIpOworICAgIC8vIE1v
dmUgdGhlIHJlY3QgaW50byBwYXJ0UmVuZGVyZXIncyBjb29yZHMKKyAgICBwYXJ0UmVjdC5tb3Zl
KG9mZnNldEZyb21JbnB1dFJlbmRlcmVyKTsKKyAgICAvLyBBY2NvdW50IGZvciB0aGUgbG9jYWwg
ZHJhd2luZyBvZmZzZXQgKHR4LCB0eSkKKyAgICBwYXJ0UmVjdC5tb3ZlKHIueCgpLCByLnkoKSk7
CisKKyAgICByZXR1cm4gcGFydFJlY3Q7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWM6OnVwZGF0
ZUNoZWNrZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykKK3sKKyAg
ICBib29sIG9sZEluZGV0ZXJtaW5hdGUgPSBbY2VsbCBzdGF0ZV0gPT0gTlNNaXhlZFN0YXRlOwor
ICAgIGJvb2wgaW5kZXRlcm1pbmF0ZSA9IGlzSW5kZXRlcm1pbmF0ZShvKTsKKyAgICBib29sIGNo
ZWNrZWQgPSBpc0NoZWNrZWQobyk7CisKKyAgICBpZiAob2xkSW5kZXRlcm1pbmF0ZSAhPSBpbmRl
dGVybWluYXRlKSB7CisgICAgICAgIFtjZWxsIHNldFN0YXRlOmluZGV0ZXJtaW5hdGUgPyBOU01p
eGVkU3RhdGUgOiAoY2hlY2tlZCA/IE5TT25TdGF0ZSA6IE5TT2ZmU3RhdGUpXTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGJvb2wgb2xkQ2hlY2tlZCA9IFtjZWxsIHN0YXRlXSA9PSBO
U09uU3RhdGU7CisgICAgaWYgKGNoZWNrZWQgIT0gb2xkQ2hlY2tlZCkKKyAgICAgICAgW2NlbGwg
c2V0U3RhdGU6Y2hlY2tlZCA/IE5TT25TdGF0ZSA6IE5TT2ZmU3RhdGVdOworfQorCit2b2lkIFJl
bmRlclRoZW1lTWFjOjp1cGRhdGVFbmFibGVkU3RhdGUoTlNDZWxsKiBjZWxsLCBjb25zdCBSZW5k
ZXJPYmplY3QqIG8pCit7CisgICAgYm9vbCBvbGRFbmFibGVkID0gW2NlbGwgaXNFbmFibGVkXTsK
KyAgICBib29sIGVuYWJsZWQgPSBpc0VuYWJsZWQobyk7CisgICAgaWYgKGVuYWJsZWQgIT0gb2xk
RW5hYmxlZCkKKyAgICAgICAgW2NlbGwgc2V0RW5hYmxlZDplbmFibGVkXTsKK30KKwordm9pZCBS
ZW5kZXJUaGVtZU1hYzo6dXBkYXRlRm9jdXNlZFN0YXRlKE5TQ2VsbCogY2VsbCwgY29uc3QgUmVu
ZGVyT2JqZWN0KiBvKQoreworICAgIGJvb2wgb2xkRm9jdXNlZCA9IFtjZWxsIHNob3dzRmlyc3RS
ZXNwb25kZXJdOworICAgIGJvb2wgZm9jdXNlZCA9IGlzRm9jdXNlZChvKSAmJiBvLT5zdHlsZSgp
LT5vdXRsaW5lU3R5bGVJc0F1dG8oKTsKKyAgICBpZiAoZm9jdXNlZCAhPSBvbGRGb2N1c2VkKQor
ICAgICAgICBbY2VsbCBzZXRTaG93c0ZpcnN0UmVzcG9uZGVyOmZvY3VzZWRdOworfQorCit2b2lk
IFJlbmRlclRoZW1lTWFjOjp1cGRhdGVQcmVzc2VkU3RhdGUoTlNDZWxsKiBjZWxsLCBjb25zdCBS
ZW5kZXJPYmplY3QqIG8pCit7CisgICAgYm9vbCBvbGRQcmVzc2VkID0gW2NlbGwgaXNIaWdobGln
aHRlZF07CisgICAgYm9vbCBwcmVzc2VkID0gKG8tPm5vZGUoKSAmJiBvLT5ub2RlKCktPmFjdGl2
ZSgpKTsKKyAgICBpZiAocHJlc3NlZCAhPSBvbGRQcmVzc2VkKQorICAgICAgICBbY2VsbCBzZXRI
aWdobGlnaHRlZDpwcmVzc2VkXTsKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hYzo6Y29udHJvbFN1
cHBvcnRzVGludHMoY29uc3QgUmVuZGVyT2JqZWN0KiBvKSBjb25zdAoreworICAgIC8vIEFuIGFs
dGVybmF0ZSB3YXkgdG8gaW1wbGVtZW50IHRoaXMgd291bGQgYmUgdG8gZ2V0IHRoZSBhcHByb3By
aWF0ZSBjZWxsIG9iamVjdAorICAgIC8vIGFuZCBjYWxsIHRoZSBwcml2YXRlIF9uZWVkUmVkcmF3
T25XaW5kb3dDaGFuZ2VkS2V5U3RhdGUgbWV0aG9kLiBBbiBhZHZhbnRhZ2Ugb2YKKyAgICAvLyB0
aGF0IHdvdWxkIGJlIHRoYXQgd2Ugd291bGQgbWF0Y2ggQXBwS2l0IGJlaGF2aW9yIG1vcmUgY2xv
c2VseSwgYnV0IGEgZGlzYWR2YW50YWdlCisgICAgLy8gd291bGQgYmUgdGhhdCB3ZSB3b3VsZCBy
ZWx5IG9uIGFuIEFwcEtpdCBTUEkgbWV0aG9kLgorCisgICAgaWYgKCFpc0VuYWJsZWQobykpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENoZWNrYm94ZXMgb25seSBoYXZlIHRpbnQg
d2hlbiBjaGVja2VkLgorICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gQ2hlY2ti
b3hQYXJ0KQorICAgICAgICByZXR1cm4gaXNDaGVja2VkKG8pOworCisgICAgLy8gRm9yIG5vdyBh
c3N1bWUgb3RoZXIgY29udHJvbHMgaGF2ZSB0aW50IGlmIGVuYWJsZWQuCisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK05TQ29udHJvbFNpemUgUmVuZGVyVGhlbWVNYWM6OmNvbnRyb2xTaXplRm9yRm9u
dChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgaW50IGZvbnRTaXplID0gc3R5bGUt
PmZvbnRTaXplKCk7CisgICAgaWYgKGZvbnRTaXplID49IDE2KQorICAgICAgICByZXR1cm4gTlNS
ZWd1bGFyQ29udHJvbFNpemU7CisgICAgaWYgKGZvbnRTaXplID49IDExKQorICAgICAgICByZXR1
cm4gTlNTbWFsbENvbnRyb2xTaXplOworICAgIHJldHVybiBOU01pbmlDb250cm9sU2l6ZTsKK30K
Kwordm9pZCBSZW5kZXJUaGVtZU1hYzo6c2V0Q29udHJvbFNpemUoTlNDZWxsKiBjZWxsLCBjb25z
dCBJbnRTaXplKiBzaXplcywgY29uc3QgSW50U2l6ZSYgbWluU2l6ZSwgZmxvYXQgem9vbUxldmVs
KQoreworICAgIE5TQ29udHJvbFNpemUgc2l6ZTsKKyAgICBpZiAobWluU2l6ZS53aWR0aCgpID49
IHN0YXRpY19jYXN0PGludD4oc2l6ZXNbTlNSZWd1bGFyQ29udHJvbFNpemVdLndpZHRoKCkgKiB6
b29tTGV2ZWwpICYmCisgICAgICAgIG1pblNpemUuaGVpZ2h0KCkgPj0gc3RhdGljX2Nhc3Q8aW50
PihzaXplc1tOU1JlZ3VsYXJDb250cm9sU2l6ZV0uaGVpZ2h0KCkgKiB6b29tTGV2ZWwpKQorICAg
ICAgICBzaXplID0gTlNSZWd1bGFyQ29udHJvbFNpemU7CisgICAgZWxzZSBpZiAobWluU2l6ZS53
aWR0aCgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZXNbTlNTbWFsbENvbnRyb2xTaXplXS53aWR0
aCgpICogem9vbUxldmVsKSAmJgorICAgICAgICAgICAgIG1pblNpemUuaGVpZ2h0KCkgPj0gc3Rh
dGljX2Nhc3Q8aW50PihzaXplc1tOU1NtYWxsQ29udHJvbFNpemVdLmhlaWdodCgpICogem9vbUxl
dmVsKSkKKyAgICAgICAgc2l6ZSA9IE5TU21hbGxDb250cm9sU2l6ZTsKKyAgICBlbHNlCisgICAg
ICAgIHNpemUgPSBOU01pbmlDb250cm9sU2l6ZTsKKyAgICBpZiAoc2l6ZSAhPSBbY2VsbCBjb250
cm9sU2l6ZV0pIC8vIE9ubHkgdXBkYXRlIGlmIHdlIGhhdmUgdG8sIHNpbmNlIEFwcEtpdCBkb2Vz
IHdvcmsgZXZlbiBpZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZS4KKyAgICAgICAgW2NlbGwgc2V0Q29u
dHJvbFNpemU6c2l6ZV07Cit9CisKK0ludFNpemUgUmVuZGVyVGhlbWVNYWM6OnNpemVGb3JGb250
KFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgSW50U2l6ZSogc2l6ZXMpIGNvbnN0Cit7CisgICAg
aWYgKHN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gMS4wZikgeworICAgICAgICBJbnRTaXplIHJl
c3VsdCA9IHNpemVzW2NvbnRyb2xTaXplRm9yRm9udChzdHlsZSldOworICAgICAgICByZXR1cm4g
SW50U2l6ZShyZXN1bHQud2lkdGgoKSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCksIHJlc3VsdC5o
ZWlnaHQoKSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCkpOworICAgIH0KKyAgICByZXR1cm4gc2l6
ZXNbY29udHJvbFNpemVGb3JGb250KHN0eWxlKV07Cit9CisKK0ludFNpemUgUmVuZGVyVGhlbWVN
YWM6OnNpemVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgSW50U2l6ZSog
c2l6ZXMpIGNvbnN0Cit7CisgICAgaWYgKHN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gMS4wZikg
eworICAgICAgICBJbnRTaXplIHJlc3VsdCA9IHNpemVzW2NvbnRyb2xTaXplRm9yU3lzdGVtRm9u
dChzdHlsZSldOworICAgICAgICByZXR1cm4gSW50U2l6ZShyZXN1bHQud2lkdGgoKSAqIHN0eWxl
LT5lZmZlY3RpdmVab29tKCksIHJlc3VsdC5oZWlnaHQoKSAqIHN0eWxlLT5lZmZlY3RpdmVab29t
KCkpOworICAgIH0KKyAgICByZXR1cm4gc2l6ZXNbY29udHJvbFNpemVGb3JTeXN0ZW1Gb250KHN0
eWxlKV07Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWM6OnNldFNpemVGcm9tRm9udChSZW5kZXJT
dHlsZSogc3R5bGUsIGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdAoreworICAgIC8vIEZJWE1F
OiBDaGVjayBpcyBmbGF3ZWQsIHNpbmNlIGl0IGRvZXNuJ3QgdGFrZSBtaW4td2lkdGgvbWF4LXdp
ZHRoIGludG8gYWNjb3VudC4KKyAgICBJbnRTaXplIHNpemUgPSBzaXplRm9yRm9udChzdHlsZSwg
c2l6ZXMpOworICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmIHNp
emUud2lkdGgoKSA+IDApCisgICAgICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0
aCgpLCBGaXhlZCkpOworICAgIGlmIChzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkgJiYgc2l6ZS5o
ZWlnaHQoKSA+IDApCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0
KCksIEZpeGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWM6OnNldEZvbnRGcm9tQ29udHJv
bFNpemUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiBzdHlsZSwgTlNDb250cm9sU2l6ZSBj
b250cm9sU2l6ZSkgY29uc3QKK3sKKyAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9u
OworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc0Fic29sdXRlU2l6ZSh0cnVlKTsKKyAgICBmb250
RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5
KTsKKworICAgIE5TRm9udCogZm9udCA9IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNGb250
IHN5c3RlbUZvbnRTaXplRm9yQ29udHJvbFNpemU6Y29udHJvbFNpemVdXTsKKyAgICBmb250RGVz
Y3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoW2ZvbnQgd2ViQ29yZUZhbWlseU5hbWVd
KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKFtmb250IHBvaW50U2l6ZV0g
KiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lm
aWVkU2l6ZShbZm9udCBwb2ludFNpemVdICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSk7CisKKyAg
ICAvLyBSZXNldCBsaW5lIGhlaWdodAorICAgIHN0eWxlLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0
eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKworICAgIGlmIChzdHlsZS0+c2V0Rm9udERlc2Ny
aXB0aW9uKGZvbnREZXNjcmlwdGlvbikpCisgICAgICAgIHN0eWxlLT5mb250KCkudXBkYXRlKDAp
OworfQorCitOU0NvbnRyb2xTaXplIFJlbmRlclRoZW1lTWFjOjpjb250cm9sU2l6ZUZvclN5c3Rl
bUZvbnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGludCBmb250U2l6ZSA9IHN0
eWxlLT5mb250U2l6ZSgpOworICAgIGlmIChmb250U2l6ZSA+PSBbTlNGb250IHN5c3RlbUZvbnRT
aXplRm9yQ29udHJvbFNpemU6TlNSZWd1bGFyQ29udHJvbFNpemVdKQorICAgICAgICByZXR1cm4g
TlNSZWd1bGFyQ29udHJvbFNpemU7CisgICAgaWYgKGZvbnRTaXplID49IFtOU0ZvbnQgc3lzdGVt
Rm9udFNpemVGb3JDb250cm9sU2l6ZTpOU1NtYWxsQ29udHJvbFNpemVdKQorICAgICAgICByZXR1
cm4gTlNTbWFsbENvbnRyb2xTaXplOworICAgIHJldHVybiBOU01pbmlDb250cm9sU2l6ZTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBMb2Nh
bEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsK
KworI2lmIF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPD0gMTA3MAorICAgIGJvb2wg
dXNlTlNUZXh0RmllbGRDZWxsID0gby0+c3R5bGUoKS0+aGFzQXBwZWFyYW5jZSgpCisgICAgICAg
ICYmIG8tPnN0eWxlKCktPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUJhY2tncm91
bmRDb2xvcikgPT0gQ29sb3I6OndoaXRlCisgICAgICAgICYmICFvLT5zdHlsZSgpLT5oYXNCYWNr
Z3JvdW5kSW1hZ2UoKTsKKworICAgIC8vIFdlIGRvIG5vdCB1c2UgTlNUZXh0RmllbGRDZWxsIHRv
IGRyYXcgc3R5bGVkIHRleHQgZmllbGRzIG9uIExpb24gYW5kIFNub3dMZW9wYXJkIGJlY2F1c2UK
KyAgICAvLyB0aGVyZSBhcmUgYSBudW1iZXIgb2YgYnVncyBvbiB0aG9zZSBwbGF0Zm9ybXMgdGhh
dCByZXF1aXJlIE5TVGV4dEZpZWxkQ2VsbCB0byBiZSBpbiBjaGFyZ2UKKyAgICAvLyBvZiBwYWlu
dGluZyBpdHMgb3duIGJhY2tncm91bmQuIFdlIG5lZWQgV2ViQ29yZSB0byBwYWludCBzdHlsZWQg
YmFja2dyb3VuZHMsIHNvIHdlJ2xsIHVzZQorICAgIC8vIHRoaXMgV2ViQ29yZVN5c3RlbUludGVy
ZmFjZSBmdW5jdGlvbiBpbnN0ZWFkLgorICAgIGlmICghdXNlTlNUZXh0RmllbGRDZWxsKSB7Cisg
ICAgICAgIHdrRHJhd0JlemVsZWRUZXh0RmllbGRDZWxsKHIsIGlzRW5hYmxlZChvKSAmJiAhaXNS
ZWFkT25seUNvbnRyb2wobykpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlm
CisKKyAgICBOU1RleHRGaWVsZENlbGwgKnRleHRGaWVsZCA9IHRoaXMtPnRleHRGaWVsZCgpOwor
CisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29u
dGV4dCk7CisKKyAgICBbdGV4dEZpZWxkIHNldEVuYWJsZWQ6KGlzRW5hYmxlZChvKSAmJiAhaXNS
ZWFkT25seUNvbnRyb2wobykpXTsKKyAgICBbdGV4dEZpZWxkIGRyYXdXaXRoRnJhbWU6TlNSZWN0
KHIpIGluVmlldzpkb2N1bWVudFZpZXdGb3IobyldOworCisgICAgW3RleHRGaWVsZCBzZXRDb250
cm9sVmlldzpuaWxdOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1l
TWFjOjphZGp1c3RUZXh0RmllbGRTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBF
bGVtZW50KikgY29uc3QKK3sKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRDYXBzTG9j
a0luZGljYXRvcihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29u
c3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGlj
c0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICB3a0RyYXdDYXBz
TG9ja0luZGljYXRvcihsb2NhbENvbnRleHQuY2dDb250ZXh0KCksIHIpOworCisgICAgcmV0dXJu
IGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lTWFjOjpwYWludFRleHRBcmVhKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7
CisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8u
Y29udGV4dCk7CisgICAgd2tEcmF3QmV6ZWxlZFRleHRBcmVhKHIsIGlzRW5hYmxlZChvKSAmJiAh
aXNSZWFkT25seUNvbnRyb2wobykpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5k
ZXJUaGVtZU1hYzo6YWRqdXN0VGV4dEFyZWFTdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5
bGUqLCBFbGVtZW50KikgY29uc3QKK3sKK30KKworY29uc3QgaW50KiBSZW5kZXJUaGVtZU1hYzo6
cG9wdXBCdXR0b25NYXJnaW5zKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IG1hcmdp
bnNbM11bNF0gPQorICAgIHsKKyAgICAgICAgeyAwLCAzLCAxLCAzIH0sCisgICAgICAgIHsgMCwg
MywgMiwgMyB9LAorICAgICAgICB7IDAsIDEsIDAsIDEgfQorICAgIH07CisgICAgcmV0dXJuIG1h
cmdpbnNbW3BvcHVwQnV0dG9uKCkgY29udHJvbFNpemVdXTsKK30KKworY29uc3QgSW50U2l6ZSog
UmVuZGVyVGhlbWVNYWM6OnBvcHVwQnV0dG9uU2l6ZXMoKSBjb25zdAoreworICAgIHN0YXRpYyBj
b25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDAsIDIxKSwgSW50U2l6ZSgwLCAxOCks
IEludFNpemUoMCwgMTUpIH07CisgICAgcmV0dXJuIHNpemVzOworfQorCitjb25zdCBpbnQqIFJl
bmRlclRoZW1lTWFjOjpwb3B1cEJ1dHRvblBhZGRpbmcoTlNDb250cm9sU2l6ZSBzaXplKSBjb25z
dAoreworICAgIHN0YXRpYyBjb25zdCBpbnQgcGFkZGluZ1szXVs0XSA9CisgICAgeworICAgICAg
ICB7IDIsIDI2LCAzLCA4IH0sCisgICAgICAgIHsgMiwgMjMsIDMsIDggfSwKKyAgICAgICAgeyAy
LCAyMiwgMywgMTAgfQorICAgIH07CisgICAgcmV0dXJuIHBhZGRpbmdbc2l6ZV07Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBMb2NhbEN1cnJl
bnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICBz
ZXRQb3B1cEJ1dHRvbkNlbGxTdGF0ZShvLCByKTsKKworICAgIE5TUG9wVXBCdXR0b25DZWxsKiBw
b3B1cEJ1dHRvbiA9IHRoaXMtPnBvcHVwQnV0dG9uKCk7CisKKyAgICBmbG9hdCB6b29tTGV2ZWwg
PSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7CisgICAgSW50U2l6ZSBzaXplID0gcG9wdXBC
dXR0b25TaXplcygpW1twb3B1cEJ1dHRvbiBjb250cm9sU2l6ZV1dOworICAgIHNpemUuc2V0SGVp
Z2h0KHNpemUuaGVpZ2h0KCkgKiB6b29tTGV2ZWwpOworICAgIHNpemUuc2V0V2lkdGgoci53aWR0
aCgpKTsKKworICAgIC8vIE5vdyBpbmZsYXRlIGl0IHRvIGFjY291bnQgZm9yIHRoZSBzaGFkb3cu
CisgICAgSW50UmVjdCBpbmZsYXRlZFJlY3QgPSByOworICAgIGlmIChyLndpZHRoKCkgPj0gbWlu
aW11bU1lbnVMaXN0U2l6ZShvLT5zdHlsZSgpKSkKKyAgICAgICAgaW5mbGF0ZWRSZWN0ID0gaW5m
bGF0ZVJlY3QoaW5mbGF0ZWRSZWN0LCBzaXplLCBwb3B1cEJ1dHRvbk1hcmdpbnMoKSwgem9vbUxl
dmVsKTsKKworICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJ
bmZvLmNvbnRleHQpOworCisgICAgLy8gT24gTGVvcGFyZCwgdGhlIGNlbGwgd2lsbCBkcmF3IG91
dHNpZGUgb2YgdGhlIGdpdmVuIHJlY3QsIHNvIHdlIGhhdmUgdG8gY2xpcCB0byB0aGUgcmVjdAor
ICAgIHBhaW50SW5mby5jb250ZXh0LT5jbGlwKGluZmxhdGVkUmVjdCk7CisKKyAgICBpZiAoem9v
bUxldmVsICE9IDEuMGYpIHsKKyAgICAgICAgaW5mbGF0ZWRSZWN0LnNldFdpZHRoKGluZmxhdGVk
UmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgaW5mbGF0ZWRSZWN0LnNldEhlaWdo
dChpbmZsYXRlZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOworICAgICAgICBwYWludEluZm8u
Y29udGV4dC0+dHJhbnNsYXRlKGluZmxhdGVkUmVjdC54KCksIGluZmxhdGVkUmVjdC55KCkpOwor
ICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZlbCwgem9v
bUxldmVsKSk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLWluZmxhdGVk
UmVjdC54KCksIC1pbmZsYXRlZFJlY3QueSgpKTsKKyAgICB9CisKKyAgICBOU1ZpZXcgKnZpZXcg
PSBkb2N1bWVudFZpZXdGb3Iobyk7CisgICAgW3BvcHVwQnV0dG9uIGRyYXdXaXRoRnJhbWU6aW5m
bGF0ZWRSZWN0IGluVmlldzp2aWV3XTsKKyNpZiAhQlVUVE9OX0NFTExfRFJBV19XSVRIX0ZSQU1F
X0RSQVdTX0ZPQ1VTX1JJTkcKKyAgICBpZiAoaXNGb2N1c2VkKG8pICYmIG8tPnN0eWxlKCktPm91
dGxpbmVTdHlsZUlzQXV0bygpKQorICAgICAgICBbcG9wdXBCdXR0b24gX3dlYl9kcmF3Rm9jdXNS
aW5nV2l0aEZyYW1lOmluZmxhdGVkUmVjdCBpblZpZXc6dmlld107CisjZW5kaWYKKyAgICBbcG9w
dXBCdXR0b24gc2V0Q29udHJvbFZpZXc6bmlsXTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwor
I2lmIEVOQUJMRShNRVRFUl9FTEVNRU5UKQorCitJbnRTaXplIFJlbmRlclRoZW1lTWFjOjptZXRl
clNpemVGb3JCb3VuZHMoY29uc3QgUmVuZGVyTWV0ZXIqIHJlbmRlck1ldGVyLCBjb25zdCBJbnRS
ZWN0JiBib3VuZHMpIGNvbnN0Cit7CisgICAgaWYgKE5vQ29udHJvbFBhcnQgPT0gcmVuZGVyTWV0
ZXItPnN0eWxlKCktPmFwcGVhcmFuY2UoKSkKKyAgICAgICAgcmV0dXJuIGJvdW5kcy5zaXplKCk7
CisKKyAgICBOU0xldmVsSW5kaWNhdG9yQ2VsbCogY2VsbCA9IGxldmVsSW5kaWNhdG9yRm9yKHJl
bmRlck1ldGVyKTsKKyAgICAvLyBNYWtlcyBlbm91Z2ggcm9vbSBmb3IgY2VsbCdzIGludHJpbnNp
YyBzaXplLgorICAgIE5TU2l6ZSBjZWxsU2l6ZSA9IFtjZWxsIGNlbGxTaXplRm9yQm91bmRzOklu
dFJlY3QoSW50UG9pbnQoKSwgYm91bmRzLnNpemUoKSldOworICAgIHJldHVybiBJbnRTaXplKGJv
dW5kcy53aWR0aCgpIDwgY2VsbFNpemUud2lkdGggPyBjZWxsU2l6ZS53aWR0aCA6IGJvdW5kcy53
aWR0aCgpLAorICAgICAgICAgICAgICAgICAgIGJvdW5kcy5oZWlnaHQoKSA8IGNlbGxTaXplLmhl
aWdodCA/IGNlbGxTaXplLmhlaWdodCA6IGJvdW5kcy5oZWlnaHQoKSk7Cit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVNYWM6OnBhaW50TWV0ZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0
IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICgh
cmVuZGVyT2JqZWN0LT5pc01ldGVyKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgTG9j
YWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7
CisKKyAgICBOU0xldmVsSW5kaWNhdG9yQ2VsbCogY2VsbCA9IGxldmVsSW5kaWNhdG9yRm9yKHRv
UmVuZGVyTWV0ZXIocmVuZGVyT2JqZWN0KSk7CisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZl
ciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7CisKKyAgICBbY2VsbCBkcmF3V2l0aEZy
YW1lOnJlY3QgaW5WaWV3OmRvY3VtZW50Vmlld0ZvcihyZW5kZXJPYmplY3QpXTsKKyAgICBbY2Vs
bCBzZXRDb250cm9sVmlldzpuaWxdOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZU1hYzo6c3VwcG9ydHNNZXRlcihDb250cm9sUGFydCBwYXJ0KSBjb25zdAoreworICAg
IHN3aXRjaCAocGFydCkgeworICAgIGNhc2UgUmVsZXZhbmN5TGV2ZWxJbmRpY2F0b3JQYXJ0Ogor
ICAgIGNhc2UgRGlzY3JldGVDYXBhY2l0eUxldmVsSW5kaWNhdG9yUGFydDoKKyAgICBjYXNlIFJh
dGluZ0xldmVsSW5kaWNhdG9yUGFydDoKKyAgICBjYXNlIE1ldGVyUGFydDoKKyAgICBjYXNlIENv
bnRpbnVvdXNDYXBhY2l0eUxldmVsSW5kaWNhdG9yUGFydDoKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworTlNMZXZl
bEluZGljYXRvclN0eWxlIFJlbmRlclRoZW1lTWFjOjpsZXZlbEluZGljYXRvclN0eWxlRm9yKENv
bnRyb2xQYXJ0IHBhcnQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgY2FzZSBS
ZWxldmFuY3lMZXZlbEluZGljYXRvclBhcnQ6CisgICAgICAgIHJldHVybiBOU1JlbGV2YW5jeUxl
dmVsSW5kaWNhdG9yU3R5bGU7CisgICAgY2FzZSBEaXNjcmV0ZUNhcGFjaXR5TGV2ZWxJbmRpY2F0
b3JQYXJ0OgorICAgICAgICByZXR1cm4gTlNEaXNjcmV0ZUNhcGFjaXR5TGV2ZWxJbmRpY2F0b3JT
dHlsZTsKKyAgICBjYXNlIFJhdGluZ0xldmVsSW5kaWNhdG9yUGFydDoKKyAgICAgICAgcmV0dXJu
IE5TUmF0aW5nTGV2ZWxJbmRpY2F0b3JTdHlsZTsKKyAgICBjYXNlIE1ldGVyUGFydDoKKyAgICBj
YXNlIENvbnRpbnVvdXNDYXBhY2l0eUxldmVsSW5kaWNhdG9yUGFydDoKKyAgICBkZWZhdWx0Ogor
ICAgICAgICByZXR1cm4gTlNDb250aW51b3VzQ2FwYWNpdHlMZXZlbEluZGljYXRvclN0eWxlOwor
ICAgIH0KKworfQorCitOU0xldmVsSW5kaWNhdG9yQ2VsbCogUmVuZGVyVGhlbWVNYWM6OmxldmVs
SW5kaWNhdG9yRm9yKGNvbnN0IFJlbmRlck1ldGVyKiByZW5kZXJNZXRlcikgY29uc3QKK3sKKyAg
ICBSZW5kZXJTdHlsZSogc3R5bGUgPSByZW5kZXJNZXRlci0+c3R5bGUoKTsKKyAgICBBU1NFUlQo
c3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBOb0NvbnRyb2xQYXJ0KTsKKworICAgIGlmICghbV9sZXZl
bEluZGljYXRvcikKKyAgICAgICAgbV9sZXZlbEluZGljYXRvci5hZG9wdE5TKFtbTlNMZXZlbElu
ZGljYXRvckNlbGwgYWxsb2NdIGluaXRXaXRoTGV2ZWxJbmRpY2F0b3JTdHlsZTpOU0NvbnRpbnVv
dXNDYXBhY2l0eUxldmVsSW5kaWNhdG9yU3R5bGVdKTsKKyAgICBOU0xldmVsSW5kaWNhdG9yQ2Vs
bCogY2VsbCA9IG1fbGV2ZWxJbmRpY2F0b3IuZ2V0KCk7CisKKyAgICBIVE1MTWV0ZXJFbGVtZW50
KiBlbGVtZW50ID0gcmVuZGVyTWV0ZXItPm1ldGVyRWxlbWVudCgpOworICAgIGRvdWJsZSB2YWx1
ZSA9IGVsZW1lbnQtPnZhbHVlKCk7CisKKyAgICAvLyBCZWNhdXNlIE5TTGV2ZWxJbmRpY2F0b3JD
ZWxsIGRvZXMgbm90IHN1cHBvcnQgb3B0aW11bS1pbi10aGUtbWlkZGxlIHR5cGUgY29sb3Jpbmcs
CisgICAgLy8gd2UgZXhwbGljaXRseSBjb250cm9sIHRoZSBjb2xvciBpbnN0ZWFkIGdpdmluZyBs
b3cgYW5kIGhpZ2ggdmFsdWUgdG8gTlNMZXZlbEluZGljYXRvckNlbGwgYXMgaXMuCisgICAgc3dp
dGNoIChlbGVtZW50LT5nYXVnZVJlZ2lvbigpKSB7CisgICAgY2FzZSBIVE1MTWV0ZXJFbGVtZW50
OjpHYXVnZVJlZ2lvbk9wdGltdW06CisgICAgICAgIC8vIE1ha2UgbWV0ZXIgdGhlIGdyZWVuCisg
ICAgICAgIFtjZWxsIHNldFdhcm5pbmdWYWx1ZTp2YWx1ZSArIDFdOworICAgICAgICBbY2VsbCBz
ZXRDcml0aWNhbFZhbHVlOnZhbHVlICsgMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSFRN
TE1ldGVyRWxlbWVudDo6R2F1Z2VSZWdpb25TdWJvcHRpbWFsOgorICAgICAgICAvLyBNYWtlIHRo
ZSBtZXRlciB5ZWxsb3cKKyAgICAgICAgW2NlbGwgc2V0V2FybmluZ1ZhbHVlOnZhbHVlIC0gMV07
CisgICAgICAgIFtjZWxsIHNldENyaXRpY2FsVmFsdWU6dmFsdWUgKyAxXTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBIVE1MTWV0ZXJFbGVtZW50OjpHYXVnZVJlZ2lvbkV2ZW5MZXNzR29vZDoK
KyAgICAgICAgLy8gTWFrZSB0aGUgbWV0ZXIgcmVkCisgICAgICAgIFtjZWxsIHNldFdhcm5pbmdW
YWx1ZTp2YWx1ZSAtIDJdOworICAgICAgICBbY2VsbCBzZXRDcml0aWNhbFZhbHVlOnZhbHVlIC0g
MV07CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIFtjZWxsIHNldExldmVsSW5kaWNhdG9y
U3R5bGU6bGV2ZWxJbmRpY2F0b3JTdHlsZUZvcihzdHlsZS0+YXBwZWFyYW5jZSgpKV07CisgICAg
W2NlbGwgc2V0QmFzZVdyaXRpbmdEaXJlY3Rpb246c3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rp
b24oKSA/IE5TV3JpdGluZ0RpcmVjdGlvbkxlZnRUb1JpZ2h0IDogTlNXcml0aW5nRGlyZWN0aW9u
UmlnaHRUb0xlZnRdOworICAgIFtjZWxsIHNldE1pblZhbHVlOmVsZW1lbnQtPm1pbigpXTsKKyAg
ICBbY2VsbCBzZXRNYXhWYWx1ZTplbGVtZW50LT5tYXgoKV07CisgICAgUmV0YWluUHRyPE5TTnVt
YmVyPiB2YWx1ZU9iamVjdCA9IFtOU051bWJlciBudW1iZXJXaXRoRG91YmxlOnZhbHVlXTsKKyAg
ICBbY2VsbCBzZXRPYmplY3RWYWx1ZTp2YWx1ZU9iamVjdC5nZXQoKV07CisKKyAgICByZXR1cm4g
Y2VsbDsKK30KKworI2VuZGlmCisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKK2NvbnN0
IEludFNpemUqIFJlbmRlclRoZW1lTWFjOjpwcm9ncmVzc0JhclNpemVzKCkgY29uc3QKK3sKKyAg
ICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsgSW50U2l6ZSgwLCAyMCksIEludFNp
emUoMCwgMTIpLCBJbnRTaXplKDAsIDEyKSB9OworICAgIHJldHVybiBzaXplczsKK30KKworY29u
c3QgaW50KiBSZW5kZXJUaGVtZU1hYzo6cHJvZ3Jlc3NCYXJNYXJnaW5zKE5TQ29udHJvbFNpemUg
Y29udHJvbFNpemUpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0IGludCBtYXJnaW5zWzNdWzRd
ID0KKyAgICB7CisgICAgICAgIHsgMCwgMCwgMSwgMCB9LAorICAgICAgICB7IDAsIDAsIDEsIDAg
fSwKKyAgICAgICAgeyAwLCAwLCAxLCAwIH0sCisgICAgfTsKKyAgICByZXR1cm4gbWFyZ2luc1tj
b250cm9sU2l6ZV07Cit9CisKK2ludCBSZW5kZXJUaGVtZU1hYzo6bWluaW11bVByb2dyZXNzQmFy
SGVpZ2h0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICByZXR1cm4gc2l6ZUZvclN5
c3RlbUZvbnQoc3R5bGUsIHByb2dyZXNzQmFyU2l6ZXMoKSkuaGVpZ2h0KCk7Cit9CisKK2RvdWJs
ZSBSZW5kZXJUaGVtZU1hYzo6YW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0JhcihS
ZW5kZXJQcm9ncmVzcyopIGNvbnN0Cit7CisgICAgcmV0dXJuIHByb2dyZXNzQW5pbWF0aW9uRnJh
bWVSYXRlOworfQorCitkb3VibGUgUmVuZGVyVGhlbWVNYWM6OmFuaW1hdGlvbkR1cmF0aW9uRm9y
UHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3MqKSBjb25zdAoreworICAgIHJldHVybiBwcm9ncmVz
c0FuaW1hdGlvbk51bUZyYW1lcyAqIHByb2dyZXNzQW5pbWF0aW9uRnJhbWVSYXRlOworfQorCit2
b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RQcm9ncmVzc0JhclN0eWxlKFN0eWxlUmVzb2x2ZXIq
LCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdAoreworfQorCitib29sIFJlbmRlclRoZW1l
TWFjOjpwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIXJl
bmRlck9iamVjdC0+aXNQcm9ncmVzcygpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGZs
b2F0IHpvb21MZXZlbCA9IHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwor
ICAgIGludCBjb250cm9sU2l6ZSA9IGNvbnRyb2xTaXplRm9yRm9udChyZW5kZXJPYmplY3QtPnN0
eWxlKCkpOworICAgIEludFNpemUgc2l6ZSA9IHByb2dyZXNzQmFyU2l6ZXMoKVtjb250cm9sU2l6
ZV07CisgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7CisgICAg
c2l6ZS5zZXRXaWR0aChyZWN0LndpZHRoKCkpOworCisgICAgLy8gTm93IGluZmxhdGUgaXQgdG8g
YWNjb3VudCBmb3IgdGhlIHNoYWRvdy4KKyAgICBJbnRSZWN0IGluZmxhdGVkUmVjdCA9IHJlY3Q7
CisgICAgaWYgKHJlY3QuaGVpZ2h0KCkgPD0gbWluaW11bVByb2dyZXNzQmFySGVpZ2h0KHJlbmRl
ck9iamVjdC0+c3R5bGUoKSkpCisgICAgICAgIGluZmxhdGVkUmVjdCA9IGluZmxhdGVSZWN0KGlu
ZmxhdGVkUmVjdCwgc2l6ZSwgcHJvZ3Jlc3NCYXJNYXJnaW5zKGNvbnRyb2xTaXplKSwgem9vbUxl
dmVsKTsKKworICAgIFJlbmRlclByb2dyZXNzKiByZW5kZXJQcm9ncmVzcyA9IHRvUmVuZGVyUHJv
Z3Jlc3MocmVuZGVyT2JqZWN0KTsKKyAgICBISVRoZW1lVHJhY2tEcmF3SW5mbyB0cmFja0luZm87
CisgICAgdHJhY2tJbmZvLnZlcnNpb24gPSAwOworICAgIGlmIChjb250cm9sU2l6ZSA9PSBOU1Jl
Z3VsYXJDb250cm9sU2l6ZSkKKyAgICAgICAgdHJhY2tJbmZvLmtpbmQgPSByZW5kZXJQcm9ncmVz
cy0+cG9zaXRpb24oKSA8IDAgPyBrVGhlbWVMYXJnZUluZGV0ZXJtaW5hdGVCYXIgOiBrVGhlbWVM
YXJnZVByb2dyZXNzQmFyOworICAgIGVsc2UKKyAgICAgICAgdHJhY2tJbmZvLmtpbmQgPSByZW5k
ZXJQcm9ncmVzcy0+cG9zaXRpb24oKSA8IDAgPyBrVGhlbWVNZWRpdW1JbmRldGVybWluYXRlQmFy
IDoga1RoZW1lTWVkaXVtUHJvZ3Jlc3NCYXI7CisKKyAgICB0cmFja0luZm8uYm91bmRzID0gSW50
UmVjdChJbnRQb2ludCgpLCBpbmZsYXRlZFJlY3Quc2l6ZSgpKTsKKyAgICB0cmFja0luZm8ubWlu
ID0gMDsKKyAgICB0cmFja0luZm8ubWF4ID0gbnVtZXJpY19saW1pdHM8U0ludDMyPjo6bWF4KCk7
CisgICAgdHJhY2tJbmZvLnZhbHVlID0gbHJvdW5kKHJlbmRlclByb2dyZXNzLT5wb3NpdGlvbigp
ICogbmV4dGFmdGVyKHRyYWNrSW5mby5tYXgsIDApKTsKKyAgICB0cmFja0luZm8udHJhY2tJbmZv
LnByb2dyZXNzLnBoYXNlID0gbHJvdW5kKHJlbmRlclByb2dyZXNzLT5hbmltYXRpb25Qcm9ncmVz
cygpICogbmV4dGFmdGVyKHByb2dyZXNzQW5pbWF0aW9uTnVtRnJhbWVzLCAwKSk7CisgICAgdHJh
Y2tJbmZvLmF0dHJpYnV0ZXMgPSBrVGhlbWVUcmFja0hvcml6b250YWw7CisgICAgdHJhY2tJbmZv
LmVuYWJsZVN0YXRlID0gaXNBY3RpdmUocmVuZGVyT2JqZWN0KSA/IGtUaGVtZVRyYWNrQWN0aXZl
IDoga1RoZW1lVHJhY2tJbmFjdGl2ZTsKKyAgICB0cmFja0luZm8ucmVzZXJ2ZWQgPSAwOworICAg
IHRyYWNrSW5mby5maWxsZXIxID0gMDsKKworICAgIE93blB0cjxJbWFnZUJ1ZmZlcj4gaW1hZ2VC
dWZmZXIgPSBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKGluZmxhdGVkUmVjdC5zaXplKCksIDEpOworICAg
IGlmICghaW1hZ2VCdWZmZXIpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgQ29udGV4dENv
bnRhaW5lciBjZ0NvbnRleHRDb250YWluZXIoaW1hZ2VCdWZmZXItPmNvbnRleHQoKSk7CisgICAg
Q0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IGNnQ29udGV4dENvbnRhaW5lci5jb250ZXh0KCk7Cisg
ICAgSElUaGVtZURyYXdUcmFjaygmdHJhY2tJbmZvLCAwLCBjZ0NvbnRleHQsIGtISVRoZW1lT3Jp
ZW50YXRpb25Ob3JtYWwpOworCisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNh
dmVyKCpwYWludEluZm8uY29udGV4dCk7CisKKyAgICBpZiAoIXJlbmRlclByb2dyZXNzLT5zdHls
ZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnRyYW5zbGF0ZSgyICogaW5mbGF0ZWRSZWN0LngoKSArIGluZmxhdGVkUmVjdC53aWR0aCgp
LCAwKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSgtMSwgMSkp
OworICAgIH0KKworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3SW1hZ2VCdWZmZXIoaW1hZ2VC
dWZmZXIuZ2V0KCksIENvbG9yU3BhY2VEZXZpY2VSR0IsIGluZmxhdGVkUmVjdC5sb2NhdGlvbigp
KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworY29uc3QgZmxvYXQgYmFzZUZvbnRT
aXplID0gMTEuMGY7Citjb25zdCBmbG9hdCBiYXNlQXJyb3dIZWlnaHQgPSA0LjBmOworY29uc3Qg
ZmxvYXQgYmFzZUFycm93V2lkdGggPSA1LjBmOworY29uc3QgZmxvYXQgYmFzZVNwYWNlQmV0d2Vl
bkFycm93cyA9IDIuMGY7Citjb25zdCBpbnQgYXJyb3dQYWRkaW5nTGVmdCA9IDY7Citjb25zdCBp
bnQgYXJyb3dQYWRkaW5nUmlnaHQgPSA2OworY29uc3QgaW50IHBhZGRpbmdCZWZvcmVTZXBhcmF0
b3IgPSA0OworY29uc3QgaW50IGJhc2VCb3JkZXJSYWRpdXMgPSA1OworY29uc3QgaW50IHN0eWxl
ZFBvcHVwUGFkZGluZ0xlZnQgPSA4OworY29uc3QgaW50IHN0eWxlZFBvcHVwUGFkZGluZ1RvcCA9
IDE7Citjb25zdCBpbnQgc3R5bGVkUG9wdXBQYWRkaW5nQm90dG9tID0gMjsKKworc3RhdGljIHZv
aWQgVG9wR3JhZGllbnRJbnRlcnBvbGF0ZSh2b2lkKiwgY29uc3QgQ0dGbG9hdCogaW5EYXRhLCBD
R0Zsb2F0KiBvdXREYXRhKQoreworICAgIHN0YXRpYyBmbG9hdCBkYXJrWzRdID0geyAxLjBmLCAx
LjBmLCAxLjBmLCAwLjRmIH07CisgICAgc3RhdGljIGZsb2F0IGxpZ2h0WzRdID0geyAxLjBmLCAx
LjBmLCAxLjBmLCAwLjE1ZiB9OworICAgIGZsb2F0IGEgPSBpbkRhdGFbMF07CisgICAgaW50IGkg
PSAwOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIG91dERhdGFbaV0gPSAo
MS4wZiAtIGEpICogZGFya1tpXSArIGEgKiBsaWdodFtpXTsKK30KKworc3RhdGljIHZvaWQgQm90
dG9tR3JhZGllbnRJbnRlcnBvbGF0ZSh2b2lkKiwgY29uc3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zs
b2F0KiBvdXREYXRhKQoreworICAgIHN0YXRpYyBmbG9hdCBkYXJrWzRdID0geyAxLjBmLCAxLjBm
LCAxLjBmLCAwLjBmIH07CisgICAgc3RhdGljIGZsb2F0IGxpZ2h0WzRdID0geyAxLjBmLCAxLjBm
LCAxLjBmLCAwLjNmIH07CisgICAgZmxvYXQgYSA9IGluRGF0YVswXTsKKyAgICBpbnQgaSA9IDA7
CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgb3V0RGF0YVtpXSA9ICgxLjBm
IC0gYSkgKiBkYXJrW2ldICsgYSAqIGxpZ2h0W2ldOworfQorCitzdGF0aWMgdm9pZCBNYWluR3Jh
ZGllbnRJbnRlcnBvbGF0ZSh2b2lkKiwgY29uc3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zsb2F0KiBv
dXREYXRhKQoreworICAgIHN0YXRpYyBmbG9hdCBkYXJrWzRdID0geyAwLjBmLCAwLjBmLCAwLjBm
LCAwLjE1ZiB9OworICAgIHN0YXRpYyBmbG9hdCBsaWdodFs0XSA9IHsgMC4wZiwgMC4wZiwgMC4w
ZiwgMC4wZiB9OworICAgIGZsb2F0IGEgPSBpbkRhdGFbMF07CisgICAgaW50IGkgPSAwOworICAg
IGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIG91dERhdGFbaV0gPSAoMS4wZiAtIGEp
ICogZGFya1tpXSArIGEgKiBsaWdodFtpXTsKK30KKworc3RhdGljIHZvaWQgVHJhY2tHcmFkaWVu
dEludGVycG9sYXRlKHZvaWQqLCBjb25zdCBDR0Zsb2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERh
dGEpCit7CisgICAgc3RhdGljIGZsb2F0IGRhcmtbNF0gPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAu
Njc4ZiB9OworICAgIHN0YXRpYyBmbG9hdCBsaWdodFs0XSA9IHsgMC4wZiwgMC4wZiwgMC4wZiwg
MC4xM2YgfTsKKyAgICBmbG9hdCBhID0gaW5EYXRhWzBdOworICAgIGludCBpID0gMDsKKyAgICBm
b3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBvdXREYXRhW2ldID0gKDEuMGYgLSBhKSAq
IGRhcmtbaV0gKyBhICogbGlnaHRbaV07Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVNYWM6OnBhaW50
TWVudUxpc3RCdXR0b25HcmFkaWVudHMoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8m
IHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAoci5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIENvbnRleHRDb250YWluZXIgY2dDb250ZXh0Q29udGFpbmVy
KHBhaW50SW5mby5jb250ZXh0KTsKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IGNnQ29udGV4
dENvbnRhaW5lci5jb250ZXh0KCk7CisKKyAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0
YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKKworICAgIFJvdW5kZWRSZWN0IGJvcmRlciA9
IG8tPnN0eWxlKCktPmdldFJvdW5kZWRCb3JkZXJGb3Iociwgby0+dmlldygpKTsKKyAgICBpbnQg
cmFkaXVzID0gYm9yZGVyLnJhZGlpKCkudG9wTGVmdCgpLndpZHRoKCk7CisKKyAgICBDR0NvbG9y
U3BhY2VSZWYgY3NwYWNlID0gZGV2aWNlUkdCQ29sb3JTcGFjZVJlZigpOworCisgICAgRmxvYXRS
ZWN0IHRvcEdyYWRpZW50KHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhlaWdodCgpIC8gMi4w
Zik7CisgICAgc3RydWN0IENHRnVuY3Rpb25DYWxsYmFja3MgdG9wQ2FsbGJhY2tzID0geyAwLCBU
b3BHcmFkaWVudEludGVycG9sYXRlLCBOVUxMIH07CisgICAgUmV0YWluUHRyPENHRnVuY3Rpb25S
ZWY+IHRvcEZ1bmN0aW9uKEFkb3B0Q0YsIENHRnVuY3Rpb25DcmVhdGUoTlVMTCwgMSwgTlVMTCwg
NCwgTlVMTCwgJnRvcENhbGxiYWNrcykpOworICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IHRv
cFNoYWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLCBDR1BvaW50TWFr
ZSh0b3BHcmFkaWVudC54KCksIHRvcEdyYWRpZW50LnkoKSksIENHUG9pbnRNYWtlKHRvcEdyYWRp
ZW50LngoKSwgdG9wR3JhZGllbnQubWF4WSgpKSwgdG9wRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBm
YWxzZSkpOworCisgICAgRmxvYXRSZWN0IGJvdHRvbUdyYWRpZW50KHIueCgpICsgcmFkaXVzLCBy
LnkoKSArIHIuaGVpZ2h0KCkgLyAyLjBmLCByLndpZHRoKCkgLSAyLjBmICogcmFkaXVzLCByLmhl
aWdodCgpIC8gMi4wZik7CisgICAgc3RydWN0IENHRnVuY3Rpb25DYWxsYmFja3MgYm90dG9tQ2Fs
bGJhY2tzID0geyAwLCBCb3R0b21HcmFkaWVudEludGVycG9sYXRlLCBOVUxMIH07CisgICAgUmV0
YWluUHRyPENHRnVuY3Rpb25SZWY+IGJvdHRvbUZ1bmN0aW9uKEFkb3B0Q0YsIENHRnVuY3Rpb25D
cmVhdGUoTlVMTCwgMSwgTlVMTCwgNCwgTlVMTCwgJmJvdHRvbUNhbGxiYWNrcykpOworICAgIFJl
dGFpblB0cjxDR1NoYWRpbmdSZWY+IGJvdHRvbVNoYWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3Jl
YXRlQXhpYWwoY3NwYWNlLCBDR1BvaW50TWFrZShib3R0b21HcmFkaWVudC54KCksICBib3R0b21H
cmFkaWVudC55KCkpLCBDR1BvaW50TWFrZShib3R0b21HcmFkaWVudC54KCksIGJvdHRvbUdyYWRp
ZW50Lm1heFkoKSksIGJvdHRvbUZ1bmN0aW9uLmdldCgpLCBmYWxzZSwgZmFsc2UpKTsKKworICAg
IHN0cnVjdCBDR0Z1bmN0aW9uQ2FsbGJhY2tzIG1haW5DYWxsYmFja3MgPSB7IDAsIE1haW5HcmFk
aWVudEludGVycG9sYXRlLCBOVUxMIH07CisgICAgUmV0YWluUHRyPENHRnVuY3Rpb25SZWY+IG1h
aW5GdW5jdGlvbihBZG9wdENGLCBDR0Z1bmN0aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQsIE5V
TEwsICZtYWluQ2FsbGJhY2tzKSk7CisgICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gbWFpblNo
YWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLCBDR1BvaW50TWFrZShy
LngoKSwgIHIueSgpKSwgQ0dQb2ludE1ha2Uoci54KCksIHIubWF4WSgpKSwgbWFpbkZ1bmN0aW9u
LmdldCgpLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IGxl
ZnRTaGFkaW5nKEFkb3B0Q0YsIENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1h
a2Uoci54KCksICByLnkoKSksIENHUG9pbnRNYWtlKHIueCgpICsgcmFkaXVzLCByLnkoKSksIG1h
aW5GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICBSZXRhaW5QdHI8Q0dTaGFk
aW5nUmVmPiByaWdodFNoYWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNl
LCBDR1BvaW50TWFrZShyLm1heFgoKSwgIHIueSgpKSwgQ0dQb2ludE1ha2Uoci5tYXhYKCkgLSBy
YWRpdXMsIHIueSgpKSwgbWFpbkZ1bmN0aW9uLmdldCgpLCBmYWxzZSwgZmFsc2UpKTsKKworICAg
IHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludElu
Zm8uY29udGV4dCk7CisgICAgICAgIENHQ29udGV4dENsaXBUb1JlY3QoY29udGV4dCwgcik7Cisg
ICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jbGlwUm91bmRlZFJlY3QoYm9yZGVyKTsKKyAgICAg
ICAgY29udGV4dCA9IGNnQ29udGV4dENvbnRhaW5lci5jb250ZXh0KCk7CisgICAgICAgIENHQ29u
dGV4dERyYXdTaGFkaW5nKGNvbnRleHQsIG1haW5TaGFkaW5nLmdldCgpKTsKKyAgICB9CisKKyAg
ICB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJ
bmZvLmNvbnRleHQpOworICAgICAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIHRvcEdy
YWRpZW50KTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmNsaXBSb3VuZGVkUmVjdChSb3Vu
ZGVkUmVjdChlbmNsb3NpbmdJbnRSZWN0KHRvcEdyYWRpZW50KSwgYm9yZGVyLnJhZGlpKCkudG9w
TGVmdCgpLCBib3JkZXIucmFkaWkoKS50b3BSaWdodCgpLCBJbnRTaXplKCksIEludFNpemUoKSkp
OworICAgICAgICBjb250ZXh0ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKKyAgICAg
ICAgQ0dDb250ZXh0RHJhd1NoYWRpbmcoY29udGV4dCwgdG9wU2hhZGluZy5nZXQoKSk7CisgICAg
fQorCisgICAgaWYgKCFib3R0b21HcmFkaWVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgR3JhcGhp
Y3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7CisgICAg
ICAgIENHQ29udGV4dENsaXBUb1JlY3QoY29udGV4dCwgYm90dG9tR3JhZGllbnQpOworICAgICAg
ICBwYWludEluZm8uY29udGV4dC0+Y2xpcFJvdW5kZWRSZWN0KFJvdW5kZWRSZWN0KGVuY2xvc2lu
Z0ludFJlY3QoYm90dG9tR3JhZGllbnQpLCBJbnRTaXplKCksIEludFNpemUoKSwgYm9yZGVyLnJh
ZGlpKCkuYm90dG9tTGVmdCgpLCBib3JkZXIucmFkaWkoKS5ib3R0b21SaWdodCgpKSk7CisgICAg
ICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOworICAgICAgICBDR0Nv
bnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBib3R0b21TaGFkaW5nLmdldCgpKTsKKyAgICB9CisK
KyAgICB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFp
bnRJbmZvLmNvbnRleHQpOworICAgICAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIHIp
OworICAgICAgICBwYWludEluZm8uY29udGV4dC0+Y2xpcFJvdW5kZWRSZWN0KGJvcmRlcik7Cisg
ICAgICAgIGNvbnRleHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOworICAgICAgICBD
R0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBsZWZ0U2hhZGluZy5nZXQoKSk7CisgICAgICAg
IENHQ29udGV4dERyYXdTaGFkaW5nKGNvbnRleHQsIHJpZ2h0U2hhZGluZy5nZXQoKSk7CisgICAg
fQorfQorCitib29sIFJlbmRlclRoZW1lTWFjOjpwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7
CisgICAgSW50UmVjdCBib3VuZHMgPSBJbnRSZWN0KHIueCgpICsgby0+c3R5bGUoKS0+Ym9yZGVy
TGVmdFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueSgpICsgby0+c3R5
bGUoKS0+Ym9yZGVyVG9wV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci53
aWR0aCgpIC0gby0+c3R5bGUoKS0+Ym9yZGVyTGVmdFdpZHRoKCkgLSBvLT5zdHlsZSgpLT5ib3Jk
ZXJSaWdodFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaGVpZ2h0KCkg
LSBvLT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpIC0gby0+c3R5bGUoKS0+Ym9yZGVyQm90dG9t
V2lkdGgoKSk7CisgICAgLy8gRHJhdyB0aGUgZ3JhZGllbnRzIHRvIGdpdmUgdGhlIHN0eWxlZCBw
b3B1cCBtZW51IGEgYnV0dG9uIGFwcGVhcmFuY2UKKyAgICBwYWludE1lbnVMaXN0QnV0dG9uR3Jh
ZGllbnRzKG8sIHBhaW50SW5mbywgYm91bmRzKTsKKworICAgIC8vIFNpbmNlIHdlIGFjdHVhbGx5
IGtub3cgdGhlIHNpemUgb2YgdGhlIGNvbnRyb2wgaGVyZSwgd2UgcmVzdHJpY3QgdGhlIGZvbnQg
c2NhbGUgdG8gbWFrZSBzdXJlIHRoZSBhcnJvd3Mgd2lsbCBmaXQgdmVydGljYWxseSBpbiB0aGUg
Ym91bmRzCisgICAgZmxvYXQgZm9udFNjYWxlID0gbWluKG8tPnN0eWxlKCktPmZvbnRTaXplKCkg
LyBiYXNlRm9udFNpemUsIGJvdW5kcy5oZWlnaHQoKSAvIChiYXNlQXJyb3dIZWlnaHQgKiAyICsg
YmFzZVNwYWNlQmV0d2VlbkFycm93cykpOworICAgIGZsb2F0IGNlbnRlclkgPSBib3VuZHMueSgp
ICsgYm91bmRzLmhlaWdodCgpIC8gMi4wZjsKKyAgICBmbG9hdCBhcnJvd0hlaWdodCA9IGJhc2VB
cnJvd0hlaWdodCAqIGZvbnRTY2FsZTsKKyAgICBmbG9hdCBhcnJvd1dpZHRoID0gYmFzZUFycm93
V2lkdGggKiBmb250U2NhbGU7CisgICAgZmxvYXQgbGVmdEVkZ2UgPSBib3VuZHMubWF4WCgpIC0g
YXJyb3dQYWRkaW5nUmlnaHQgKiBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkgLSBhcnJvd1dp
ZHRoOworICAgIGZsb2F0IHNwYWNlQmV0d2VlbkFycm93cyA9IGJhc2VTcGFjZUJldHdlZW5BcnJv
d3MgKiBmb250U2NhbGU7CisKKyAgICBpZiAoYm91bmRzLndpZHRoKCkgPCBhcnJvd1dpZHRoICsg
YXJyb3dQYWRkaW5nTGVmdCAqIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVy
KCpwYWludEluZm8uY29udGV4dCk7CisKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0RmlsbENv
bG9yKG8tPnN0eWxlKCktPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0eUNvbG9yKSwg
by0+c3R5bGUoKS0+Y29sb3JTcGFjZSgpKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ry
b2tlU3R5bGUoTm9TdHJva2UpOworCisgICAgRmxvYXRQb2ludCBhcnJvdzFbM107CisgICAgYXJy
b3cxWzBdID0gRmxvYXRQb2ludChsZWZ0RWRnZSwgY2VudGVyWSAtIHNwYWNlQmV0d2VlbkFycm93
cyAvIDIuMGYpOworICAgIGFycm93MVsxXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBhcnJvd1dp
ZHRoLCBjZW50ZXJZIC0gc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZik7CisgICAgYXJyb3cxWzJd
ID0gRmxvYXRQb2ludChsZWZ0RWRnZSArIGFycm93V2lkdGggLyAyLjBmLCBjZW50ZXJZIC0gc3Bh
Y2VCZXR3ZWVuQXJyb3dzIC8gMi4wZiAtIGFycm93SGVpZ2h0KTsKKworICAgIC8vIERyYXcgdGhl
IHRvcCBhcnJvdworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBh
cnJvdzEsIHRydWUpOworCisgICAgRmxvYXRQb2ludCBhcnJvdzJbM107CisgICAgYXJyb3cyWzBd
ID0gRmxvYXRQb2ludChsZWZ0RWRnZSwgY2VudGVyWSArIHNwYWNlQmV0d2VlbkFycm93cyAvIDIu
MGYpOworICAgIGFycm93MlsxXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBhcnJvd1dpZHRoLCBj
ZW50ZXJZICsgc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZik7CisgICAgYXJyb3cyWzJdID0gRmxv
YXRQb2ludChsZWZ0RWRnZSArIGFycm93V2lkdGggLyAyLjBmLCBjZW50ZXJZICsgc3BhY2VCZXR3
ZWVuQXJyb3dzIC8gMi4wZiArIGFycm93SGVpZ2h0KTsKKworICAgIC8vIERyYXcgdGhlIGJvdHRv
bSBhcnJvdworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3Q29udmV4UG9seWdvbigzLCBhcnJv
dzIsIHRydWUpOworCisgICAgQ29sb3IgbGVmdFNlcGFyYXRvckNvbG9yKDAsIDAsIDAsIDQwKTsK
KyAgICBDb2xvciByaWdodFNlcGFyYXRvckNvbG9yKDI1NSwgMjU1LCAyNTUsIDQwKTsKKworICAg
IC8vIEZJWE1FOiBTaG91bGQgdGhlIHNlcGFyYXRvciB0aGlja25lc3MgYW5kIHNwYWNlIGJlIHNj
YWxlZCB1cCBieSBmb250U2NhbGU/CisgICAgaW50IHNlcGFyYXRvclNwYWNlID0gMjsgLy8gRGVs
aWJlcmF0ZWx5IGlnbm9yZXMgem9vbSBzaW5jZSBpdCBsb29rcyBuaWNlciBpZiBpdCBzdGF5cyB0
aGluLgorICAgIGludCBsZWZ0RWRnZU9mU2VwYXJhdG9yID0gc3RhdGljX2Nhc3Q8aW50PihsZWZ0
RWRnZSAtIGFycm93UGFkZGluZ0xlZnQgKiBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOyAv
LyBGSVhNRTogUm91bmQ/CisKKyAgICAvLyBEcmF3IHRoZSBzZXBhcmF0b3IgdG8gdGhlIGxlZnQg
b2YgdGhlIGFycm93cworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VUaGlja25lc3Mo
MS4wZik7IC8vIERlbGliZXJhdGVseSBpZ25vcmVzIHpvb20gc2luY2UgaXQgbG9va3MgbmljZXIg
aWYgaXQgc3RheXMgdGhpbi4KKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlU3R5bGUo
U29saWRTdHJva2UpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VDb2xvcihsZWZ0
U2VwYXJhdG9yQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIHBhaW50SW5mby5jb250
ZXh0LT5kcmF3TGluZShJbnRQb2ludChsZWZ0RWRnZU9mU2VwYXJhdG9yLCBib3VuZHMueSgpKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50UG9pbnQobGVmdEVkZ2VPZlNlcGFy
YXRvciwgYm91bmRzLm1heFkoKSkpOworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9r
ZUNvbG9yKHJpZ2h0U2VwYXJhdG9yQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIHBh
aW50SW5mby5jb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChsZWZ0RWRnZU9mU2VwYXJhdG9yICsg
c2VwYXJhdG9yU3BhY2UsIGJvdW5kcy55KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBJbnRQb2ludChsZWZ0RWRnZU9mU2VwYXJhdG9yICsgc2VwYXJhdG9yU3BhY2UsIGJvdW5k
cy5tYXhZKCkpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBjb25zdCBJbnRTaXpl
KiBtZW51TGlzdEJ1dHRvblNpemVzKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXpl
c1szXSA9IHsgSW50U2l6ZSgwLCAyMSksIEludFNpemUoMCwgMTgpLCBJbnRTaXplKDAsIDE1KSB9
OworICAgIHJldHVybiBzaXplczsKK30KKwordm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0TWVu
dUxpc3RTdHlsZShTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSogc3R5
bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgTlNDb250cm9sU2l6ZSBjb250cm9sU2l6ZSA9
IGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSk7CisKKyAgICBzdHlsZS0+cmVzZXRCb3JkZXIoKTsK
KyAgICBzdHlsZS0+cmVzZXRQYWRkaW5nKCk7CisKKyAgICAvLyBIZWlnaHQgaXMgbG9ja2VkIHRv
IGF1dG8uCisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoQXV0bykpOworCisgICAgLy8gV2hp
dGUtc3BhY2UgaXMgbG9ja2VkIHRvIHByZQorICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKFBSRSk7
CisKKyAgICAvLyBTZXQgdGhlIGZvcmVncm91bmQgY29sb3IgdG8gYmxhY2sgb3IgZ3JheSB3aGVu
IHdlIGhhdmUgdGhlIGFxdWEgbG9vay4KKyAgICAvLyBDYXN0IHRvIFJHQjMyIGlzIHRvIHdvcmsg
YXJvdW5kIGEgY29tcGlsZXIgYnVnLgorICAgIHN0eWxlLT5zZXRDb2xvcihlICYmICFlLT5pc0Rp
c2FibGVkRm9ybUNvbnRyb2woKSA/IHN0YXRpY19jYXN0PFJHQkEzMj4oQ29sb3I6OmJsYWNrKSA6
IENvbG9yOjpkYXJrR3JheSk7CisKKyAgICAvLyBTZXQgdGhlIGJ1dHRvbidzIHZlcnRpY2FsIHNp
emUuCisgICAgc2V0U2l6ZUZyb21Gb250KHN0eWxlLCBtZW51TGlzdEJ1dHRvblNpemVzKCkpOwor
CisgICAgLy8gT3VyIGZvbnQgaXMgbG9ja2VkIHRvIHRoZSBhcHByb3ByaWF0ZSBzeXN0ZW0gZm9u
dCBzaXplIGZvciB0aGUgY29udHJvbC4gIFRvIGNsYXJpZnksIHdlIGZpcnN0IHVzZSB0aGUgQ1NT
LXNwZWNpZmllZCBmb250IHRvIGZpZ3VyZSBvdXQKKyAgICAvLyBhIHJlYXNvbmFibGUgY29udHJv
bCBzaXplLCBidXQgb25jZSB0aGF0IGNvbnRyb2wgc2l6ZSBpcyBkZXRlcm1pbmVkLCB3ZSB0aHJv
dyB0aGF0IGZvbnQgYXdheSBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZQorICAgIC8vIHN5c3RlbSBm
b250IGZvciB0aGUgY29udHJvbCBzaXplIGluc3RlYWQuCisgICAgc2V0Rm9udEZyb21Db250cm9s
U2l6ZShzdHlsZVJlc29sdmVyLCBzdHlsZSwgY29udHJvbFNpemUpOworCisgICAgc3R5bGUtPnNl
dEJveFNoYWRvdyhudWxscHRyKTsKK30KKworaW50IFJlbmRlclRoZW1lTWFjOjpwb3B1cEludGVy
bmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGlmIChzdHls
ZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkKKyAgICAgICAgcmV0dXJuIHBvcHVwQnV0
dG9uUGFkZGluZyhjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpKVtsZWZ0UGFkZGluZ10gKiBzdHls
ZS0+ZWZmZWN0aXZlWm9vbSgpOworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVs
aXN0QnV0dG9uUGFydCkKKyAgICAgICAgcmV0dXJuIHN0eWxlZFBvcHVwUGFkZGluZ0xlZnQgKiBz
dHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworICAgIHJldHVybiAwOworfQorCitpbnQgUmVuZGVyVGhl
bWVNYWM6OnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25z
dAoreworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkKKyAgICAg
ICAgcmV0dXJuIHBvcHVwQnV0dG9uUGFkZGluZyhjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpKVty
aWdodFBhZGRpbmddICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBpZiAoc3R5bGUtPmFw
cGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRvblBhcnQpIHsKKyAgICAgICAgZmxvYXQgZm9udFNj
YWxlID0gc3R5bGUtPmZvbnRTaXplKCkgLyBiYXNlRm9udFNpemU7CisgICAgICAgIGZsb2F0IGFy
cm93V2lkdGggPSBiYXNlQXJyb3dXaWR0aCAqIGZvbnRTY2FsZTsKKyAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGludD4oY2VpbGYoYXJyb3dXaWR0aCArIChhcnJvd1BhZGRpbmdMZWZ0ICsgYXJy
b3dQYWRkaW5nUmlnaHQgKyBwYWRkaW5nQmVmb3JlU2VwYXJhdG9yKSAqIHN0eWxlLT5lZmZlY3Rp
dmVab29tKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBSZW5kZXJUaGVtZU1h
Yzo6cG9wdXBJbnRlcm5hbFBhZGRpbmdUb3AoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAorewor
ICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkKKyAgICAgICAgcmV0
dXJuIHBvcHVwQnV0dG9uUGFkZGluZyhjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpKVt0b3BQYWRk
aW5nXSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNl
KCkgPT0gTWVudWxpc3RCdXR0b25QYXJ0KQorICAgICAgICByZXR1cm4gc3R5bGVkUG9wdXBQYWRk
aW5nVG9wICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50
IFJlbmRlclRoZW1lTWFjOjpwb3B1cEludGVybmFsUGFkZGluZ0JvdHRvbShSZW5kZXJTdHlsZSog
c3R5bGUpIGNvbnN0Cit7CisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQ
YXJ0KQorICAgICAgICByZXR1cm4gcG9wdXBCdXR0b25QYWRkaW5nKGNvbnRyb2xTaXplRm9yRm9u
dChzdHlsZSkpW2JvdHRvbVBhZGRpbmddICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBp
ZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRvblBhcnQpCisgICAgICAgIHJl
dHVybiBzdHlsZWRQb3B1cFBhZGRpbmdCb3R0b20gKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwor
ICAgIHJldHVybiAwOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RNZW51TGlzdEJ1
dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBj
b25zdAoreworICAgIGZsb2F0IGZvbnRTY2FsZSA9IHN0eWxlLT5mb250U2l6ZSgpIC8gYmFzZUZv
bnRTaXplOworCisgICAgc3R5bGUtPnJlc2V0UGFkZGluZygpOworICAgIHN0eWxlLT5zZXRCb3Jk
ZXJSYWRpdXMoSW50U2l6ZShpbnQoYmFzZUJvcmRlclJhZGl1cyArIGZvbnRTY2FsZSAtIDEpLCBp
bnQoYmFzZUJvcmRlclJhZGl1cyArIGZvbnRTY2FsZSAtIDEpKSk7IC8vIEZJWE1FOiBSb3VuZCB1
cD8KKworICAgIGNvbnN0IGludCBtaW5IZWlnaHQgPSAxNTsKKyAgICBzdHlsZS0+c2V0TWluSGVp
Z2h0KExlbmd0aChtaW5IZWlnaHQsIEZpeGVkKSk7CisKKyAgICBzdHlsZS0+c2V0TGluZUhlaWdo
dChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVNYWM6OnNldFBvcHVwQnV0dG9uQ2VsbFN0YXRlKGNvbnN0IFJlbmRlck9iamVjdCogbywgY29u
c3QgSW50UmVjdCYgcikKK3sKKyAgICBOU1BvcFVwQnV0dG9uQ2VsbCogcG9wdXBCdXR0b24gPSB0
aGlzLT5wb3B1cEJ1dHRvbigpOworCisgICAgLy8gU2V0IHRoZSBjb250cm9sIHNpemUgYmFzZWQg
b2ZmIHRoZSByZWN0YW5nbGUgd2UncmUgcGFpbnRpbmcgaW50by4KKyAgICBzZXRDb250cm9sU2l6
ZShwb3B1cEJ1dHRvbiwgcG9wdXBCdXR0b25TaXplcygpLCByLnNpemUoKSwgby0+c3R5bGUoKS0+
ZWZmZWN0aXZlWm9vbSgpKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgdmFyaW91cyBzdGF0ZXMgd2Ug
cmVzcG9uZCB0by4KKyAgICB1cGRhdGVBY3RpdmVTdGF0ZShwb3B1cEJ1dHRvbiwgbyk7CisgICAg
dXBkYXRlQ2hlY2tlZFN0YXRlKHBvcHVwQnV0dG9uLCBvKTsKKyAgICB1cGRhdGVFbmFibGVkU3Rh
dGUocG9wdXBCdXR0b24sIG8pOworICAgIHVwZGF0ZVByZXNzZWRTdGF0ZShwb3B1cEJ1dHRvbiwg
byk7CisjaWYgQlVUVE9OX0NFTExfRFJBV19XSVRIX0ZSQU1FX0RSQVdTX0ZPQ1VTX1JJTkcKKyAg
ICB1cGRhdGVGb2N1c2VkU3RhdGUocG9wdXBCdXR0b24sIG8pOworI2VuZGlmCit9CisKK2NvbnN0
IEludFNpemUqIFJlbmRlclRoZW1lTWFjOjptZW51TGlzdFNpemVzKCkgY29uc3QKK3sKKyAgICBz
dGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsgSW50U2l6ZSg5LCAwKSwgSW50U2l6ZSg1
LCAwKSwgSW50U2l6ZSgwLCAwKSB9OworICAgIHJldHVybiBzaXplczsKK30KKworaW50IFJlbmRl
clRoZW1lTWFjOjptaW5pbXVtTWVudUxpc3RTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QK
K3sKKyAgICByZXR1cm4gc2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUsIG1lbnVMaXN0U2l6ZXMoKSku
d2lkdGgoKTsKK30KKworY29uc3QgaW50IHRyYWNrV2lkdGggPSA1OworY29uc3QgaW50IHRyYWNr
UmFkaXVzID0gMjsKKwordm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0U2xpZGVyVHJhY2tTdHls
ZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sK
KyAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworfQorCitib29sIFJlbmRlclRoZW1l
TWFjOjpwYWludFNsaWRlclRyYWNrKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgSW50UmVjdCBib3VuZHMgPSByOwor
ICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBm
bG9hdCB6b29tZWRUcmFja1dpZHRoID0gdHJhY2tXaWR0aCAqIHpvb21MZXZlbDsKKworICAgIGlm
IChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gIFNsaWRlckhvcml6b250YWxQYXJ0IHx8IG8t
PnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSAgTWVkaWFTbGlkZXJQYXJ0KSB7CisgICAgICAgIGJv
dW5kcy5zZXRIZWlnaHQoem9vbWVkVHJhY2tXaWR0aCk7CisgICAgICAgIGJvdW5kcy5zZXRZKHIu
eSgpICsgci5oZWlnaHQoKSAvIDIgLSB6b29tZWRUcmFja1dpZHRoIC8gMik7CisgICAgfSBlbHNl
IGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVmVydGljYWxQYXJ0KSB7Cisg
ICAgICAgIGJvdW5kcy5zZXRXaWR0aCh6b29tZWRUcmFja1dpZHRoKTsKKyAgICAgICAgYm91bmRz
LnNldFgoci54KCkgKyByLndpZHRoKCkgLyAyIC0gem9vbWVkVHJhY2tXaWR0aCAvIDIpOworICAg
IH0KKworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJ
bmZvLmNvbnRleHQpOworICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gbG9jYWxDb250ZXh0LmNn
Q29udGV4dCgpOworICAgIENHQ29sb3JTcGFjZVJlZiBjc3BhY2UgPSBkZXZpY2VSR0JDb2xvclNw
YWNlUmVmKCk7CisKKyNpZiBFTkFCTEUoREFUQUxJU1RfRUxFTUVOVCkKKyAgICBwYWludFNsaWRl
clRpY2tzKG8sIHBhaW50SW5mbywgcik7CisjZW5kaWYKKworICAgIEdyYXBoaWNzQ29udGV4dFN0
YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOworICAgIENHQ29udGV4dENs
aXBUb1JlY3QoY29udGV4dCwgYm91bmRzKTsKKworICAgIHN0cnVjdCBDR0Z1bmN0aW9uQ2FsbGJh
Y2tzIG1haW5DYWxsYmFja3MgPSB7IDAsIFRyYWNrR3JhZGllbnRJbnRlcnBvbGF0ZSwgTlVMTCB9
OworICAgIFJldGFpblB0cjxDR0Z1bmN0aW9uUmVmPiBtYWluRnVuY3Rpb24oQWRvcHRDRiwgQ0dG
dW5jdGlvbkNyZWF0ZShOVUxMLCAxLCBOVUxMLCA0LCBOVUxMLCAmbWFpbkNhbGxiYWNrcykpOwor
ICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IG1haW5TaGFkaW5nOworICAgIGlmIChvLT5zdHls
ZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVmVydGljYWxQYXJ0KQorICAgICAgICBtYWluU2hh
ZGluZy5hZG9wdENGKENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZSwgQ0dQb2ludE1ha2UoYm91
bmRzLngoKSwgIGJvdW5kcy5tYXhZKCkpLCBDR1BvaW50TWFrZShib3VuZHMubWF4WCgpLCBib3Vu
ZHMubWF4WSgpKSwgbWFpbkZ1bmN0aW9uLmdldCgpLCBmYWxzZSwgZmFsc2UpKTsKKyAgICBlbHNl
CisgICAgICAgIG1haW5TaGFkaW5nLmFkb3B0Q0YoQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNl
LCBDR1BvaW50TWFrZShib3VuZHMueCgpLCAgYm91bmRzLnkoKSksIENHUG9pbnRNYWtlKGJvdW5k
cy54KCksIGJvdW5kcy5tYXhZKCkpLCBtYWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkp
OworCisgICAgSW50U2l6ZSByYWRpdXModHJhY2tSYWRpdXMsIHRyYWNrUmFkaXVzKTsKKyAgICBw
YWludEluZm8uY29udGV4dC0+Y2xpcFJvdW5kZWRSZWN0KFJvdW5kZWRSZWN0KGJvdW5kcywgcmFk
aXVzLCByYWRpdXMsIHJhZGl1cywgcmFkaXVzKSk7CisgICAgY29udGV4dCA9IGxvY2FsQ29udGV4
dC5jZ0NvbnRleHQoKTsKKyAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBtYWluU2hh
ZGluZy5nZXQoKSk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVN
YWM6OmFkanVzdFNsaWRlclRodW1iU3R5bGUoU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlciwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIFJlbmRl
clRoZW1lOjphZGp1c3RTbGlkZXJUaHVtYlN0eWxlKHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBlbGVt
ZW50KTsKKyAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworfQorCitjb25zdCBmbG9h
dCB2ZXJ0aWNhbFNsaWRlckhlaWdodFBhZGRpbmcgPSAwLjFmOworCitib29sIFJlbmRlclRoZW1l
TWFjOjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgTlNTbGlkZXJDZWxsKiBzbGlkZXJU
aHVtYkNlbGwgPSBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNh
bFBhcnQKKyAgICAgICAgPyBzbGlkZXJUaHVtYlZlcnRpY2FsKCkKKyAgICAgICAgOiBzbGlkZXJU
aHVtYkhvcml6b250YWwoKTsKKworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworCisgICAgLy8gVXBkYXRlIHRoZSB2YXJpb3Vz
IHN0YXRlcyB3ZSByZXNwb25kIHRvLgorICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKHNsaWRlclRodW1i
Q2VsbCwgbyk7CisgICAgdXBkYXRlRW5hYmxlZFN0YXRlKHNsaWRlclRodW1iQ2VsbCwgbyk7Cisg
ICAgdXBkYXRlRm9jdXNlZFN0YXRlKHNsaWRlclRodW1iQ2VsbCwgKG8tPm5vZGUoKSAmJiBvLT5u
b2RlKCktPmZvY3VzRGVsZWdhdGUoKS0+cmVuZGVyZXIoKSkgPyBvLT5ub2RlKCktPmZvY3VzRGVs
ZWdhdGUoKS0+cmVuZGVyZXIoKSA6IG8pOworCisgICAgLy8gVXBkYXRlIHRoZSBwcmVzc2VkIHN0
YXRlIHVzaW5nIHRoZSBOU0NlbGwgdHJhY2tpbmcgbWV0aG9kcywgc2luY2UgdGhhdCdzIGhvdyBO
U1NsaWRlckNlbGwga2VlcHMgdHJhY2sgb2YgaXQuCisgICAgYm9vbCBvbGRQcmVzc2VkOworICAg
IGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQp
CisgICAgICAgIG9sZFByZXNzZWQgPSBtX2lzU2xpZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQ7Cisg
ICAgZWxzZQorICAgICAgICBvbGRQcmVzc2VkID0gbV9pc1NsaWRlclRodW1iSG9yaXpvbnRhbFBy
ZXNzZWQ7CisKKyAgICBib29sIHByZXNzZWQgPSBpc1ByZXNzZWQobyk7CisKKyAgICBpZiAoby0+
c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KQorICAgICAg
ICBtX2lzU2xpZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQgPSBwcmVzc2VkOworICAgIGVsc2UKKyAg
ICAgICAgbV9pc1NsaWRlclRodW1iSG9yaXpvbnRhbFByZXNzZWQgPSBwcmVzc2VkOworCisgICAg
aWYgKHByZXNzZWQgIT0gb2xkUHJlc3NlZCkgeworICAgICAgICBpZiAocHJlc3NlZCkKKyAgICAg
ICAgICAgIFtzbGlkZXJUaHVtYkNlbGwgc3RhcnRUcmFja2luZ0F0Ok5TUG9pbnQoKSBpblZpZXc6
bmlsXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgW3NsaWRlclRodW1iQ2VsbCBzdG9wVHJh
Y2tpbmc6TlNQb2ludCgpIGF0Ok5TUG9pbnQoKSBpblZpZXc6bmlsIG1vdXNlSXNVcDpZRVNdOwor
ICAgIH0KKworICAgIEZsb2F0UmVjdCBib3VuZHMgPSByOworICAgIC8vIE1ha2UgdGhlIGhlaWdo
dCBvZiB0aGUgdmVydGljYWwgc2xpZGVyIHNsaWdodGx5IGxhcmdlciBzbyBOU1NsaWRlckNlbGwg
d2lsbCBkcmF3IGEgdmVydGljYWwgc2xpZGVyLgorICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJh
bmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpCisgICAgICAgIGJvdW5kcy5zZXRIZWln
aHQoYm91bmRzLmhlaWdodCgpICsgdmVydGljYWxTbGlkZXJIZWlnaHRQYWRkaW5nICogby0+c3R5
bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsKKworICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIg
c3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8t
PnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIEZsb2F0UmVjdCB1bnpvb21lZFJlY3Qg
PSBib3VuZHM7CisgICAgaWYgKHpvb21MZXZlbCAhPSAxLjBmKSB7CisgICAgICAgIHVuem9vbWVk
UmVjdC5zZXRXaWR0aCh1bnpvb21lZFJlY3Qud2lkdGgoKSAvIHpvb21MZXZlbCk7CisgICAgICAg
IHVuem9vbWVkUmVjdC5zZXRIZWlnaHQodW56b29tZWRSZWN0LmhlaWdodCgpIC8gem9vbUxldmVs
KTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSh1bnpvb21lZFJlY3QueCgp
LCB1bnpvb21lZFJlY3QueSgpKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZs
b2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkpOworICAgICAgICBwYWludEluZm8uY29udGV4
dC0+dHJhbnNsYXRlKC11bnpvb21lZFJlY3QueCgpLCAtdW56b29tZWRSZWN0LnkoKSk7CisgICAg
fQorCisgICAgW3NsaWRlclRodW1iQ2VsbCBkcmF3SW50ZXJpb3JXaXRoRnJhbWU6dW56b29tZWRS
ZWN0IGluVmlldzpkb2N1bWVudFZpZXdGb3IobyldOworICAgIFtzbGlkZXJUaHVtYkNlbGwgc2V0
Q29udHJvbFZpZXc6bmlsXTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZU1hYzo6cGFpbnRTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5m
byYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIExvY2FsQ3VycmVudEdyYXBo
aWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworICAgIE5TU2VhcmNo
RmllbGRDZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsKKworICAgIHNldFNlYXJjaENlbGxT
dGF0ZShvLCByKTsKKworICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigq
cGFpbnRJbmZvLmNvbnRleHQpOworCisgICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+
ZWZmZWN0aXZlWm9vbSgpOworCisgICAgSW50UmVjdCB1bnpvb21lZFJlY3QgPSByOworCisgICAg
aWYgKHpvb21MZXZlbCAhPSAxLjBmKSB7CisgICAgICAgIHVuem9vbWVkUmVjdC5zZXRXaWR0aCh1
bnpvb21lZFJlY3Qud2lkdGgoKSAvIHpvb21MZXZlbCk7CisgICAgICAgIHVuem9vbWVkUmVjdC5z
ZXRIZWlnaHQodW56b29tZWRSZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSh1bnpvb21lZFJlY3QueCgpLCB1bnpvb21lZFJlY3Qu
eSgpKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2
ZWwsIHpvb21MZXZlbCkpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC11
bnpvb21lZFJlY3QueCgpLCAtdW56b29tZWRSZWN0LnkoKSk7CisgICAgfQorCisgICAgLy8gU2V0
IHRoZSBzZWFyY2ggYnV0dG9uIHRvIG5pbCBiZWZvcmUgZHJhd2luZy4gIFRoZW4gcmVzZXQgaXQg
c28gd2UgY2FuIGRyYXcgaXQgbGF0ZXIuCisgICAgW3NlYXJjaCBzZXRTZWFyY2hCdXR0b25DZWxs
Om5pbF07CisKKyAgICBbc2VhcmNoIGRyYXdXaXRoRnJhbWU6TlNSZWN0KHVuem9vbWVkUmVjdCkg
aW5WaWV3OmRvY3VtZW50Vmlld0ZvcihvKV07CisKKyAgICBbc2VhcmNoIHNldENvbnRyb2xWaWV3
Om5pbF07CisgICAgW3NlYXJjaCByZXNldFNlYXJjaEJ1dHRvbkNlbGxdOworCisgICAgcmV0dXJu
IGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjOjpzZXRTZWFyY2hDZWxsU3RhdGUoUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBJbnRSZWN0JikKK3sKKyAgICBOU1NlYXJjaEZpZWxkQ2VsbCog
c2VhcmNoID0gdGhpcy0+c2VhcmNoKCk7CisKKyAgICBbc2VhcmNoIHNldENvbnRyb2xTaXplOmNv
bnRyb2xTaXplRm9yRm9udChvLT5zdHlsZSgpKV07CisKKyAgICAvLyBVcGRhdGUgdGhlIHZhcmlv
dXMgc3RhdGVzIHdlIHJlc3BvbmQgdG8uCisgICAgdXBkYXRlQWN0aXZlU3RhdGUoc2VhcmNoLCBv
KTsKKyAgICB1cGRhdGVFbmFibGVkU3RhdGUoc2VhcmNoLCBvKTsKKyAgICB1cGRhdGVGb2N1c2Vk
U3RhdGUoc2VhcmNoLCBvKTsKK30KKworY29uc3QgSW50U2l6ZSogUmVuZGVyVGhlbWVNYWM6OnNl
YXJjaEZpZWxkU2l6ZXMoKSBjb25zdAoreworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVz
WzNdID0geyBJbnRTaXplKDAsIDIyKSwgSW50U2l6ZSgwLCAxOSksIEludFNpemUoMCwgMTcpIH07
CisgICAgcmV0dXJuIHNpemVzOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjOjpzZXRTZWFyY2hG
aWVsZFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIElmIHRoZSB3aWR0
aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8g
ZG8uCisgICAgaWYgKCFzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHls
ZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFVzZSB0aGUg
Zm9udCBzaXplIHRvIGRldGVybWluZSB0aGUgaW50cmluc2ljIHdpZHRoIG9mIHRoZSBjb250cm9s
LgorICAgIHNldFNpemVGcm9tRm9udChzdHlsZSwgc2VhcmNoRmllbGRTaXplcygpKTsKK30KKwor
dm9pZCBSZW5kZXJUaGVtZU1hYzo6YWRqdXN0U2VhcmNoRmllbGRTdHlsZShTdHlsZVJlc29sdmVy
KiBzdHlsZVJlc29sdmVyLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAorewor
ICAgIC8vIE92ZXJyaWRlIGJvcmRlci4KKyAgICBzdHlsZS0+cmVzZXRCb3JkZXIoKTsKKyAgICBj
b25zdCBzaG9ydCBib3JkZXJXaWR0aCA9IDIgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworICAg
IHN0eWxlLT5zZXRCb3JkZXJMZWZ0V2lkdGgoYm9yZGVyV2lkdGgpOworICAgIHN0eWxlLT5zZXRC
b3JkZXJMZWZ0U3R5bGUoSU5TRVQpOworICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdodFdpZHRoKGJv
cmRlcldpZHRoKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyUmlnaHRTdHlsZShJTlNFVCk7CisgICAg
c3R5bGUtPnNldEJvcmRlckJvdHRvbVdpZHRoKGJvcmRlcldpZHRoKTsKKyAgICBzdHlsZS0+c2V0
Qm9yZGVyQm90dG9tU3R5bGUoSU5TRVQpOworICAgIHN0eWxlLT5zZXRCb3JkZXJUb3BXaWR0aChi
b3JkZXJXaWR0aCk7CisgICAgc3R5bGUtPnNldEJvcmRlclRvcFN0eWxlKElOU0VUKTsKKworICAg
IC8vIE92ZXJyaWRlIGhlaWdodC4KKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChBdXRvKSk7
CisgICAgc2V0U2VhcmNoRmllbGRTaXplKHN0eWxlKTsKKworICAgIC8vIE92ZXJyaWRlIHBhZGRp
bmcgc2l6ZSB0byBtYXRjaCBBcHBLaXQgdGV4dCBwb3NpdGlvbmluZy4KKyAgICBjb25zdCBpbnQg
cGFkZGluZyA9IDEgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworICAgIHN0eWxlLT5zZXRQYWRk
aW5nTGVmdChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1Jp
Z2h0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExl
bmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0
aChwYWRkaW5nLCBGaXhlZCkpOworCisgICAgTlNDb250cm9sU2l6ZSBjb250cm9sU2l6ZSA9IGNv
bnRyb2xTaXplRm9yRm9udChzdHlsZSk7CisgICAgc2V0Rm9udEZyb21Db250cm9sU2l6ZShzdHls
ZVJlc29sdmVyLCBzdHlsZSwgY29udHJvbFNpemUpOworCisgICAgc3R5bGUtPnNldEJveFNoYWRv
dyhudWxscHRyKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRTZWFyY2hGaWVsZENh
bmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByKQoreworICAgIEVsZW1lbnQqIGlucHV0ID0gby0+bm9kZSgpLT5zaGFk
b3dIb3N0KCk7CisgICAgaWYgKCFpbnB1dCkKKyAgICAgICAgaW5wdXQgPSB0b0VsZW1lbnQoby0+
bm9kZSgpKTsKKworICAgIGlmICghaW5wdXQtPnJlbmRlcmVyKCktPmlzQm94KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENv
bnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworICAgIHNldFNlYXJjaENlbGxTdGF0ZShpbnB1dC0+
cmVuZGVyZXIoKSwgcik7CisKKyAgICBOU1NlYXJjaEZpZWxkQ2VsbCogc2VhcmNoID0gdGhpcy0+
c2VhcmNoKCk7CisKKyAgICBpZiAoIWlucHV0LT5pc0Rpc2FibGVkRm9ybUNvbnRyb2woKSAmJiAo
aW5wdXQtPmlzVGV4dEZvcm1Db250cm9sKCkgJiYgIXRvSFRNTFRleHRGb3JtQ29udHJvbEVsZW1l
bnQoaW5wdXQpLT5pc1JlYWRPbmx5KCkpKSB7CisgICAgICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKFtz
ZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0sIG8pOworICAgICAgICB1cGRhdGVQcmVzc2VkU3RhdGUo
W3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSwgbyk7CisgICAgfQorICAgIGVsc2UgaWYgKFtbc2Vh
cmNoIGNhbmNlbEJ1dHRvbkNlbGxdIGlzSGlnaGxpZ2h0ZWRdKQorICAgICAgICBbW3NlYXJjaCBj
YW5jZWxCdXR0b25DZWxsXSBzZXRIaWdobGlnaHRlZDpOT107CisKKyAgICBHcmFwaGljc0NvbnRl
eHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKKworICAgIGZsb2F0
IHpvb21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIEZsb2F0UmVj
dCBsb2NhbEJvdW5kcyA9IFtzZWFyY2ggY2FuY2VsQnV0dG9uUmVjdEZvckJvdW5kczpOU1JlY3Qo
aW5wdXQtPnJlbmRlckJveCgpLT5waXhlbFNuYXBwZWRCb3JkZXJCb3hSZWN0KCkpXTsKKworI2lm
IEVOQUJMRShJTlBVVF9TUEVFQ0gpCisgICAgLy8gVGFrZSBjYXJlIG9mIGNhc2VzIHdoZXJlIHRo
ZSBjYW5jZWwgYnV0dG9uIHdhcyBub3QgYWxpZ25lZCB3aXRoIHRoZSByaWdodCBib3JkZXIgb2Yg
dGhlIGlucHV0IGVsZW1lbnQgKGZvciBlLmcuCisgICAgLy8gd2hlbiBzcGVlY2ggaW5wdXQgaXMg
ZW5hYmxlZCBmb3IgdGhlIGlucHV0IGVsZW1lbnQuCisgICAgSW50UmVjdCBhYnNCb3VuZGluZ0Jv
eCA9IGlucHV0LT5yZW5kZXJlcigpLT5hYnNvbHV0ZUJvdW5kaW5nQm94UmVjdCgpOworICAgIGlu
dCBhYnNSaWdodCA9IGFic0JvdW5kaW5nQm94LngoKSArIGFic0JvdW5kaW5nQm94LndpZHRoKCkg
LSBpbnB1dC0+cmVuZGVyQm94KCktPnBhZGRpbmdSaWdodCgpIC0gaW5wdXQtPnJlbmRlckJveCgp
LT5ib3JkZXJSaWdodCgpOworICAgIGludCBzcGFjZVRvUmlnaHRPZkNhbmNlbEJ1dHRvbiA9IGFi
c1JpZ2h0IC0gKHIueCgpICsgci53aWR0aCgpKTsKKyAgICBsb2NhbEJvdW5kcy5zZXRYKGxvY2Fs
Qm91bmRzLngoKSAtIHNwYWNlVG9SaWdodE9mQ2FuY2VsQnV0dG9uKTsKKyNlbmRpZgorCisgICAg
bG9jYWxCb3VuZHMgPSBjb252ZXJ0VG9QYWludGluZ1JlY3QoaW5wdXQtPnJlbmRlcmVyKCksIG8s
IGxvY2FsQm91bmRzLCByKTsKKworICAgIEZsb2F0UmVjdCB1bnpvb21lZFJlY3QobG9jYWxCb3Vu
ZHMpOworICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikgeworICAgICAgICB1bnpvb21lZFJlY3Qu
c2V0V2lkdGgodW56b29tZWRSZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOworICAgICAgICB1bnpv
b21lZFJlY3Quc2V0SGVpZ2h0KHVuem9vbWVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7Cisg
ICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUodW56b29tZWRSZWN0LngoKSwgdW56
b29tZWRSZWN0LnkoKSk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNp
emUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRy
YW5zbGF0ZSgtdW56b29tZWRSZWN0LngoKSwgLXVuem9vbWVkUmVjdC55KCkpOworICAgIH0KKwor
ICAgIFtbc2VhcmNoIGNhbmNlbEJ1dHRvbkNlbGxdIGRyYXdXaXRoRnJhbWU6dW56b29tZWRSZWN0
IGluVmlldzpkb2N1bWVudFZpZXdGb3IobyldOworICAgIFtbc2VhcmNoIGNhbmNlbEJ1dHRvbkNl
bGxdIHNldENvbnRyb2xWaWV3Om5pbF07CisgICAgcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBJ
bnRTaXplKiBSZW5kZXJUaGVtZU1hYzo6Y2FuY2VsQnV0dG9uU2l6ZXMoKSBjb25zdAoreworICAg
IHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDE2LCAxMyksIEludFNp
emUoMTMsIDExKSwgSW50U2l6ZSgxMywgOSkgfTsKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK3Zv
aWQgUmVuZGVyVGhlbWVNYWM6OmFkanVzdFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoU3R5
bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAg
SW50U2l6ZSBzaXplID0gc2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUsIGNhbmNlbEJ1dHRvblNpemVz
KCkpOworICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpLCBGaXhlZCkpOwor
ICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0KCksIEZpeGVkKSk7CisgICAg
c3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKK30KKworY29uc3QgSW50U2l6ZSogUmVuZGVy
VGhlbWVNYWM6OnJlc3VsdHNCdXR0b25TaXplcygpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0
IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMTksIDEzKSwgSW50U2l6ZSgxNywgMTEpLCBJ
bnRTaXplKDE3LCA5KSB9OworICAgIHJldHVybiBzaXplczsKK30KKworY29uc3QgaW50IGVtcHR5
UmVzdWx0c09mZnNldCA9IDk7Cit2b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1c3RTZWFyY2hGaWVs
ZERlY29yYXRpb25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVt
ZW50KikgY29uc3QKK3sKKyAgICBJbnRTaXplIHNpemUgPSBzaXplRm9yU3lzdGVtRm9udChzdHls
ZSwgcmVzdWx0c0J1dHRvblNpemVzKCkpOworICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6
ZS53aWR0aCgpIC0gZW1wdHlSZXN1bHRzT2Zmc2V0LCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRI
ZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0KCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEJveFNo
YWRvdyhudWxscHRyKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZU1hYzo6cGFpbnRTZWFyY2hGaWVs
ZERlY29yYXRpb24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lTWFjOjphZGp1
c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRl
clN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgSW50U2l6ZSBzaXplID0gc2l6
ZUZvclN5c3RlbUZvbnQoc3R5bGUsIHJlc3VsdHNCdXR0b25TaXplcygpKTsKKyAgICBzdHlsZS0+
c2V0V2lkdGgoTGVuZ3RoKHNpemUud2lkdGgoKSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0SGVp
Z2h0KExlbmd0aChzaXplLmhlaWdodCgpLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRCb3hTaGFk
b3cobnVsbHB0cik7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50U2VhcmNoRmllbGRS
ZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5vZGUqIGlucHV0ID0gby0+bm9kZSgpLT5z
aGFkb3dIb3N0KCk7CisgICAgaWYgKCFpbnB1dCkKKyAgICAgICAgaW5wdXQgPSBvLT5ub2RlKCk7
CisgICAgaWYgKCFpbnB1dC0+cmVuZGVyZXIoKS0+aXNCb3goKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWlu
dEluZm8uY29udGV4dCk7CisgICAgc2V0U2VhcmNoQ2VsbFN0YXRlKGlucHV0LT5yZW5kZXJlcigp
LCByKTsKKworICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsK
KworICAgIGlmIChbc2VhcmNoIHNlYXJjaE1lbnVUZW1wbGF0ZV0gIT0gbmlsKQorICAgICAgICBb
c2VhcmNoIHNldFNlYXJjaE1lbnVUZW1wbGF0ZTpuaWxdOworCisgICAgdXBkYXRlQWN0aXZlU3Rh
dGUoW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSwgbyk7CisKKyAgICBGbG9hdFJlY3QgbG9jYWxC
b3VuZHMgPSBbc2VhcmNoIHNlYXJjaEJ1dHRvblJlY3RGb3JCb3VuZHM6TlNSZWN0KGlucHV0LT5y
ZW5kZXJCb3goKS0+cGl4ZWxTbmFwcGVkQm9yZGVyQm94UmVjdCgpKV07CisgICAgbG9jYWxCb3Vu
ZHMgPSBjb252ZXJ0VG9QYWludGluZ1JlY3QoaW5wdXQtPnJlbmRlcmVyKCksIG8sIGxvY2FsQm91
bmRzLCByKTsKKworICAgIFtbc2VhcmNoIHNlYXJjaEJ1dHRvbkNlbGxdIGRyYXdXaXRoRnJhbWU6
bG9jYWxCb3VuZHMgaW5WaWV3OmRvY3VtZW50Vmlld0ZvcihvKV07CisgICAgW1tzZWFyY2ggc2Vh
cmNoQnV0dG9uQ2VsbF0gc2V0Q29udHJvbFZpZXc6bmlsXTsKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2NvbnN0IGludCByZXN1bHRzQXJyb3dXaWR0aCA9IDU7Cit2b2lkIFJlbmRlclRoZW1lTWFj
OjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVu
ZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICBJbnRTaXplIHNpemUgPSBz
aXplRm9yU3lzdGVtRm9udChzdHlsZSwgcmVzdWx0c0J1dHRvblNpemVzKCkpOworICAgIHN0eWxl
LT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpICsgcmVzdWx0c0Fycm93V2lkdGgsIEZpeGVk
KSk7CisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsK
KyAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworfQorCitib29sIFJlbmRlclRoZW1l
TWFjOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0
IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5vZGUqIGlu
cHV0ID0gby0+bm9kZSgpLT5zaGFkb3dIb3N0KCk7CisgICAgaWYgKCFpbnB1dCkKKyAgICAgICAg
aW5wdXQgPSBvLT5ub2RlKCk7CisgICAgaWYgKCFpbnB1dC0+cmVuZGVyZXIoKS0+aXNCb3goKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0
IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgc2V0U2VhcmNoQ2VsbFN0YXRl
KGlucHV0LT5yZW5kZXJlcigpLCByKTsKKworICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFyY2gg
PSB0aGlzLT5zZWFyY2goKTsKKworICAgIHVwZGF0ZUFjdGl2ZVN0YXRlKFtzZWFyY2ggc2VhcmNo
QnV0dG9uQ2VsbF0sIG8pOworCisgICAgaWYgKCFbc2VhcmNoIHNlYXJjaE1lbnVUZW1wbGF0ZV0p
CisgICAgICAgIFtzZWFyY2ggc2V0U2VhcmNoTWVudVRlbXBsYXRlOnNlYXJjaE1lbnVUZW1wbGF0
ZSgpXTsKKworICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJ
bmZvLmNvbnRleHQpOworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2
ZVpvb20oKTsKKworICAgIEZsb2F0UmVjdCBsb2NhbEJvdW5kcyA9IFtzZWFyY2ggc2VhcmNoQnV0
dG9uUmVjdEZvckJvdW5kczpOU1JlY3QoaW5wdXQtPnJlbmRlckJveCgpLT5waXhlbFNuYXBwZWRC
b3JkZXJCb3hSZWN0KCkpXTsKKyAgICBsb2NhbEJvdW5kcyA9IGNvbnZlcnRUb1BhaW50aW5nUmVj
dChpbnB1dC0+cmVuZGVyZXIoKSwgbywgbG9jYWxCb3VuZHMsIHIpOworCisgICAgSW50UmVjdCB1
bnpvb21lZFJlY3QobG9jYWxCb3VuZHMpOworICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikgewor
ICAgICAgICB1bnpvb21lZFJlY3Quc2V0V2lkdGgodW56b29tZWRSZWN0LndpZHRoKCkgLyB6b29t
TGV2ZWwpOworICAgICAgICB1bnpvb21lZFJlY3Quc2V0SGVpZ2h0KHVuem9vbWVkUmVjdC5oZWln
aHQoKSAvIHpvb21MZXZlbCk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUo
dW56b29tZWRSZWN0LngoKSwgdW56b29tZWRSZWN0LnkoKSk7CisgICAgICAgIHBhaW50SW5mby5j
b250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKKyAgICAgICAg
cGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtdW56b29tZWRSZWN0LngoKSwgLXVuem9vbWVk
UmVjdC55KCkpOworICAgIH0KKworICAgIFtbc2VhcmNoIHNlYXJjaEJ1dHRvbkNlbGxdIGRyYXdX
aXRoRnJhbWU6dW56b29tZWRSZWN0IGluVmlldzpkb2N1bWVudFZpZXdGb3IobyldOworICAgIFtb
c2VhcmNoIHNlYXJjaEJ1dHRvbkNlbGxdIHNldENvbnRyb2xWaWV3Om5pbF07CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWM6OnBhaW50U25hcHNob3R0ZWRQbHVn
aW5PdmVybGF5KFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IEludFJlY3QmKQoreworICAgIGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUJs
b2NrQmFja2dyb3VuZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoIW8tPmlzUmVu
ZGVyQmxvY2soKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBSZW5kZXJCbG9jayogcmVu
ZGVyQmxvY2sgPSB0b1JlbmRlckJsb2NrKG8pOworCisgICAgTGF5b3V0VW5pdCBjb250ZW50V2lk
dGggPSByZW5kZXJCbG9jay0+Y29udGVudFdpZHRoKCk7CisgICAgTGF5b3V0VW5pdCBjb250ZW50
SGVpZ2h0ID0gcmVuZGVyQmxvY2stPmNvbnRlbnRIZWlnaHQoKTsKKyAgICBpZiAoIWNvbnRlbnRX
aWR0aCB8fCAhY29udGVudEhlaWdodCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQgPSBwYWludEluZm8uY29udGV4dDsKKworICAgIExheW91dFNp
emUgY29udGVudFNpemUoY29udGVudFdpZHRoLCBjb250ZW50SGVpZ2h0KTsKKyAgICBMYXlvdXRQ
b2ludCBjb250ZW50TG9jYXRpb24gPSByZW5kZXJCbG9jay0+bG9jYXRpb24oKTsKKyAgICBjb250
ZW50TG9jYXRpb24ubW92ZShyZW5kZXJCbG9jay0+Ym9yZGVyTGVmdCgpICsgcmVuZGVyQmxvY2st
PnBhZGRpbmdMZWZ0KCksIHJlbmRlckJsb2NrLT5ib3JkZXJUb3AoKSArIHJlbmRlckJsb2NrLT5w
YWRkaW5nVG9wKCkpOworCisgICAgTGF5b3V0UmVjdCByZWN0KGNvbnRlbnRMb2NhdGlvbiwgY29u
dGVudFNpemUpOworICAgIEludFJlY3QgYWxpZ25lZFJlY3QgPSBwaXhlbFNuYXBwZWRJbnRSZWN0
KHJlY3QpOworICAgIGlmIChhbGlnbmVkUmVjdC53aWR0aCgpIDw9IDAgfHwgYWxpZ25lZFJlY3Qu
aGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBXZSBuZWVkIHRv
IGdldCB0aGUgc25hcHNob3QgaW1hZ2UgZnJvbSB0aGUgcGx1Z2luIGVsZW1lbnQsIHdoaWNoIHNo
b3VsZCBiZSBhdmFpbGFibGUKKyAgICAvLyBmcm9tIG91ciBub2RlLiBBc3N1bWluZyB0aGlzIG5v
ZGUgaXMgdGhlIHBsdWdpbiBvdmVybGF5IGVsZW1lbnQsIHdlIHNob3VsZCBnZXQgdG8gdGhlCisg
ICAgLy8gcGx1Z2luIGl0c2VsZiBieSBhc2tpbmcgZm9yIHRoZSBzaGFkb3cgcm9vdCBwYXJlbnQs
IGFuZCB0aGVuIGl0cyBwYXJlbnQuCisKKyAgICBpZiAoIXJlbmRlckJsb2NrLT5ub2RlKCktPmlz
SFRNTEVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBIVE1MRWxlbWVudCog
cGx1Z0luT3ZlcmxheSA9IHRvSFRNTEVsZW1lbnQocmVuZGVyQmxvY2stPm5vZGUoKSk7CisgICAg
RWxlbWVudCogcGFyZW50ID0gcGx1Z0luT3ZlcmxheS0+cGFyZW50T3JTaGFkb3dIb3N0RWxlbWVu
dCgpOworICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC0+aXNQbHVnaW5FbGVtZW50KCkpCisg
ICAgICAgIHBhcmVudCA9IHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0RWxlbWVudCgpOworCisg
ICAgaWYgKCFwYXJlbnQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgSFRNTFBsdWdJbkVs
ZW1lbnQqIHBsdWdJbkVsZW1lbnQgPSB0b0hUTUxQbHVnSW5FbGVtZW50KHBhcmVudCk7CisgICAg
aWYgKCFwbHVnSW5FbGVtZW50LT5pc1BsdWdJbkltYWdlRWxlbWVudCgpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIEhUTUxQbHVnSW5JbWFnZUVsZW1lbnQqIHBsdWdJbkltYWdlRWxlbWVu
dCA9IHRvSFRNTFBsdWdJbkltYWdlRWxlbWVudChwbHVnSW5FbGVtZW50KTsKKworICAgIEltYWdl
KiBzbmFwc2hvdCA9IHBsdWdJbkltYWdlRWxlbWVudC0+c25hcHNob3RJbWFnZSgpOworICAgIGlm
ICghc25hcHNob3QpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgUmVuZGVyU25hcHNob3R0
ZWRQbHVnSW4qIHBsdWdJblJlbmRlcmVyID0gdG9SZW5kZXJTbmFwc2hvdHRlZFBsdWdJbihwbHVn
SW5JbWFnZUVsZW1lbnQtPnJlbmRlcmVyKCkpOworICAgIEZsb2F0UG9pbnQgc25hcHNob3RBYnNQ
b3MgPSBwbHVnSW5SZW5kZXJlci0+bG9jYWxUb0Fic29sdXRlKCk7CisgICAgc25hcHNob3RBYnNQ
b3MubW92ZShwbHVnSW5SZW5kZXJlci0+Ym9yZGVyTGVmdCgpICsgcGx1Z0luUmVuZGVyZXItPnBh
ZGRpbmdMZWZ0KCksIHBsdWdJblJlbmRlcmVyLT5ib3JkZXJUb3AoKSArIHBsdWdJblJlbmRlcmVy
LT5wYWRkaW5nVG9wKCkpOworCisgICAgLy8gV2UgY291bGQgZHJhdyB0aGUgc25hcHNob3Qgd2l0
aCB0aGF0IGNvb3JkaW5hdGVzLCBidXQgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUKKyAgICAv
LyBpc24ndCBhIGNvbXBvc2l0ZWQgbGF5ZXIgYmV0d2VlbiB1cyBhbmQgdGhlIHBsdWdJblJlbmRl
cmVyLgorICAgIFJlbmRlckJveCogcmVuZGVyQm94ID0gdG9SZW5kZXJCb3gobyk7CisgICAgd2hp
bGUgKHJlbmRlckJveCAhPSBwbHVnSW5SZW5kZXJlcikgeworICAgICAgICBpZiAocmVuZGVyQm94
LT5oYXNMYXllcigpICYmIHJlbmRlckJveC0+bGF5ZXIoKSAmJiByZW5kZXJCb3gtPmxheWVyKCkt
PmlzQ29tcG9zaXRlZCgpKSB7CisgICAgICAgICAgICBzbmFwc2hvdEFic1BvcyA9IC1yZW5kZXJC
b3gtPmxvY2F0aW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBy
ZW5kZXJCb3ggPSByZW5kZXJCb3gtPnBhcmVudEJveCgpOworICAgIH0KKworICAgIExheW91dFNp
emUgcGx1Z2luU2l6ZShwbHVnSW5SZW5kZXJlci0+Y29udGVudFdpZHRoKCksIHBsdWdJblJlbmRl
cmVyLT5jb250ZW50SGVpZ2h0KCkpOworICAgIExheW91dFJlY3QgcGx1Z2luUmVjdChzbmFwc2hv
dEFic1BvcywgcGx1Z2luU2l6ZSk7CisgICAgSW50UmVjdCBhbGlnbmVkUGx1Z2luUmVjdCA9IHBp
eGVsU25hcHBlZEludFJlY3QocGx1Z2luUmVjdCk7CisKKyAgICBpZiAoYWxpZ25lZFBsdWdpblJl
Y3Qud2lkdGgoKSA8PSAwIHx8IGFsaWduZWRQbHVnaW5SZWN0LmhlaWdodCgpIDw9IDApCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgY29udGV4dC0+ZHJhd0ltYWdlKHNuYXBzaG90LCBwbHVn
SW5SZW5kZXJlci0+c3R5bGUoKS0+Y29sb3JTcGFjZSgpLCBhbGlnbmVkUGx1Z2luUmVjdCwgQ29t
cG9zaXRlU291cmNlT3Zlcik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWYgRU5BQkxFKERB
VEFMSVNUX0VMRU1FTlQpCitJbnRTaXplIFJlbmRlclRoZW1lTWFjOjpzbGlkZXJUaWNrU2l6ZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIEludFNpemUoMSwgMyk7Cit9CisKK2ludCBSZW5kZXJUaGVt
ZU1hYzo6c2xpZGVyVGlja09mZnNldEZyb21UcmFja0NlbnRlcigpIGNvbnN0Cit7CisgICAgcmV0
dXJuIC05OworfQorI2VuZGlmCisKK2NvbnN0IGludCBzbGlkZXJUaHVtYldpZHRoID0gMTU7Citj
b25zdCBpbnQgc2xpZGVyVGh1bWJIZWlnaHQgPSAxNTsKKwordm9pZCBSZW5kZXJUaGVtZU1hYzo6
YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0
Cit7CisgICAgZmxvYXQgem9vbUxldmVsID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBp
ZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0IHx8IHN0
eWxlLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAg
c3R5bGUtPnNldFdpZHRoKExlbmd0aChzdGF0aWNfY2FzdDxpbnQ+KHNsaWRlclRodW1iV2lkdGgg
KiB6b29tTGV2ZWwpLCBGaXhlZCkpOworICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChz
dGF0aWNfY2FzdDxpbnQ+KHNsaWRlclRodW1iSGVpZ2h0ICogem9vbUxldmVsKSwgRml4ZWQpKTsK
KyAgICB9CisKKyNpZiBFTkFCTEUoVklERU8pCisgICAgYWRqdXN0TWVkaWFTbGlkZXJUaHVtYlNp
emUoc3R5bGUpOworI2VuZGlmCit9CisKK2Jvb2wgUmVuZGVyVGhlbWVNYWM6OnNob3VsZFNob3dQ
bGFjZWhvbGRlcldoZW5Gb2N1c2VkKCkgY29uc3QKK3sKKyNpZiBfX01BQ19PU19YX1ZFUlNJT05f
TUlOX1JFUVVJUkVEID49IDEwNzAKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgICAgcmV0dXJu
IGZhbHNlOworI2VuZGlmCit9CisKK05TUG9wVXBCdXR0b25DZWxsKiBSZW5kZXJUaGVtZU1hYzo6
cG9wdXBCdXR0b24oKSBjb25zdAoreworICAgIGlmICghbV9wb3B1cEJ1dHRvbikgeworICAgICAg
ICBtX3BvcHVwQnV0dG9uLmFkb3B0TlMoW1tOU1BvcFVwQnV0dG9uQ2VsbCBhbGxvY10gaW5pdFRl
eHRDZWxsOkAiIiBwdWxsc0Rvd246Tk9dKTsKKyAgICAgICAgW21fcG9wdXBCdXR0b24uZ2V0KCkg
c2V0VXNlc0l0ZW1Gcm9tTWVudTpOT107CisgICAgICAgIFttX3BvcHVwQnV0dG9uLmdldCgpIHNl
dEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOworICAgIH0KKworICAgIHJl
dHVybiBtX3BvcHVwQnV0dG9uLmdldCgpOworfQorCitOU1NlYXJjaEZpZWxkQ2VsbCogUmVuZGVy
VGhlbWVNYWM6OnNlYXJjaCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX3NlYXJjaCkgeworICAgICAg
ICBtX3NlYXJjaC5hZG9wdE5TKFtbTlNTZWFyY2hGaWVsZENlbGwgYWxsb2NdIGluaXRUZXh0Q2Vs
bDpAIiJdKTsKKyAgICAgICAgW21fc2VhcmNoLmdldCgpIHNldEJlemVsU3R5bGU6TlNUZXh0Rmll
bGRSb3VuZGVkQmV6ZWxdOworICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0QmV6ZWxlZDpZRVNd
OworICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0RWRpdGFibGU6WUVTXTsKKyAgICAgICAgW21f
c2VhcmNoLmdldCgpIHNldEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOwor
ICAgIH0KKworICAgIHJldHVybiBtX3NlYXJjaC5nZXQoKTsKK30KKworTlNNZW51KiBSZW5kZXJU
aGVtZU1hYzo6c2VhcmNoTWVudVRlbXBsYXRlKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fc2VhcmNo
TWVudVRlbXBsYXRlKQorICAgICAgICBtX3NlYXJjaE1lbnVUZW1wbGF0ZS5hZG9wdE5TKFtbTlNN
ZW51IGFsbG9jXSBpbml0V2l0aFRpdGxlOkAiIl0pOworCisgICAgcmV0dXJuIG1fc2VhcmNoTWVu
dVRlbXBsYXRlLmdldCgpOworfQorCitOU1NsaWRlckNlbGwqIFJlbmRlclRoZW1lTWFjOjpzbGlk
ZXJUaHVtYkhvcml6b250YWwoKSBjb25zdAoreworICAgIGlmICghbV9zbGlkZXJUaHVtYkhvcml6
b250YWwpIHsKKyAgICAgICAgbV9zbGlkZXJUaHVtYkhvcml6b250YWwuYWRvcHROUyhbW05TU2xp
ZGVyQ2VsbCBhbGxvY10gaW5pdF0pOworICAgICAgICBbbV9zbGlkZXJUaHVtYkhvcml6b250YWwu
Z2V0KCkgc2V0U2xpZGVyVHlwZTpOU0xpbmVhclNsaWRlcl07CisgICAgICAgIFttX3NsaWRlclRo
dW1iSG9yaXpvbnRhbC5nZXQoKSBzZXRDb250cm9sU2l6ZTpOU1NtYWxsQ29udHJvbFNpemVdOwor
ICAgICAgICBbbV9zbGlkZXJUaHVtYkhvcml6b250YWwuZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpO
U0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07CisgICAgfQorCisgICAgcmV0dXJuIG1fc2xpZGVyVGh1
bWJIb3Jpem9udGFsLmdldCgpOworfQorCitOU1NsaWRlckNlbGwqIFJlbmRlclRoZW1lTWFjOjpz
bGlkZXJUaHVtYlZlcnRpY2FsKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fc2xpZGVyVGh1bWJWZXJ0
aWNhbCkgeworICAgICAgICBtX3NsaWRlclRodW1iVmVydGljYWwuYWRvcHROUyhbW05TU2xpZGVy
Q2VsbCBhbGxvY10gaW5pdF0pOworICAgICAgICBbbV9zbGlkZXJUaHVtYlZlcnRpY2FsLmdldCgp
IHNldFNsaWRlclR5cGU6TlNMaW5lYXJTbGlkZXJdOworICAgICAgICBbbV9zbGlkZXJUaHVtYlZl
cnRpY2FsLmdldCgpIHNldENvbnRyb2xTaXplOk5TU21hbGxDb250cm9sU2l6ZV07CisgICAgICAg
IFttX3NsaWRlclRodW1iVmVydGljYWwuZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmlu
Z1R5cGVFeHRlcmlvcl07CisgICAgfQorCisgICAgcmV0dXJuIG1fc2xpZGVyVGh1bWJWZXJ0aWNh
bC5nZXQoKTsKK30KKworTlNUZXh0RmllbGRDZWxsKiBSZW5kZXJUaGVtZU1hYzo6dGV4dEZpZWxk
KCkgY29uc3QKK3sKKyAgICBpZiAoIW1fdGV4dEZpZWxkKSB7CisgICAgICAgIG1fdGV4dEZpZWxk
LmFkb3B0TlMoW1tXZWJDb3JlVGV4dEZpZWxkQ2VsbCBhbGxvY10gaW5pdFRleHRDZWxsOkAiIl0p
OworICAgICAgICBbbV90ZXh0RmllbGQuZ2V0KCkgc2V0QmV6ZWxlZDpZRVNdOworICAgICAgICBb
bV90ZXh0RmllbGQuZ2V0KCkgc2V0RWRpdGFibGU6WUVTXTsKKyAgICAgICAgW21fdGV4dEZpZWxk
LmdldCgpIHNldEZvY3VzUmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOworI2lmIF9f
TUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPD0gMTA3MAorICAgICAgICBbbV90ZXh0Rmll
bGQuZ2V0KCkgc2V0RHJhd3NCYWNrZ3JvdW5kOllFU107CisgICAgICAgIFttX3RleHRGaWVsZC5n
ZXQoKSBzZXRCYWNrZ3JvdW5kQ29sb3I6W05TQ29sb3Igd2hpdGVDb2xvcl1dOworI2Vsc2UKKyAg
ICAgICAgLy8gUG9zdC1MaW9uLCBXZWJDb3JlIGNhbiBiZSBpbiBjaGFyZ2Ugb2YgcGFpbnRpbm5n
IHRoZSBiYWNrZ3JvdW5kIHRoYW5rcyB0bworICAgICAgICAvLyB0aGUgd29ya2Fyb3VuZCBpbiBw
bGFjZSBmb3IgPHJkYXI6Ly9wcm9ibGVtLzExMzg1NDYxPiwgd2hpY2ggaXMgaW1wbGVtZW50ZWQK
KyAgICAgICAgLy8gYWJvdmUgYXMgX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lLgorICAgICAg
ICBbbV90ZXh0RmllbGQuZ2V0KCkgc2V0RHJhd3NCYWNrZ3JvdW5kOk5PXTsKKyNlbmRpZgorICAg
IH0KKworICAgIHJldHVybiBtX3RleHRGaWVsZC5nZXQoKTsKK30KKworU3RyaW5nIFJlbmRlclRo
ZW1lTWFjOjpmaWxlTGlzdE5hbWVGb3JXaWR0aChjb25zdCBGaWxlTGlzdCogZmlsZUxpc3QsIGNv
bnN0IEZvbnQmIGZvbnQsIGludCB3aWR0aCwgYm9vbCBtdWx0aXBsZUZpbGVzQWxsb3dlZCkgY29u
c3QKK3sKKyAgICBpZiAod2lkdGggPD0gMCkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisg
ICAgU3RyaW5nIHN0clRvVHJ1bmNhdGU7CisgICAgaWYgKGZpbGVMaXN0LT5pc0VtcHR5KCkpCisg
ICAgICAgIHN0clRvVHJ1bmNhdGUgPSBmaWxlTGlzdERlZmF1bHRMYWJlbChtdWx0aXBsZUZpbGVz
QWxsb3dlZCk7CisgICAgZWxzZSBpZiAoZmlsZUxpc3QtPmxlbmd0aCgpID09IDEpCisgICAgICAg
IHN0clRvVHJ1bmNhdGUgPSBbW05TRmlsZU1hbmFnZXIgZGVmYXVsdE1hbmFnZXJdIGRpc3BsYXlO
YW1lQXRQYXRoOihmaWxlTGlzdC0+aXRlbSgwKS0+cGF0aCgpKV07CisgICAgZWxzZQorICAgICAg
ICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKG11bHRpcGxlRmlsZVVwbG9h
ZFRleHQoZmlsZUxpc3QtPmxlbmd0aCgpKSwgd2lkdGgsIGZvbnQsIFN0cmluZ1RydW5jYXRvcjo6
RW5hYmxlUm91bmRpbmdIYWNrcyk7CisKKyAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpjZW50
ZXJUcnVuY2F0ZShzdHJUb1RydW5jYXRlLCB3aWR0aCwgZm9udCwgU3RyaW5nVHJ1bmNhdG9yOjpF
bmFibGVSb3VuZGluZ0hhY2tzKTsKK30KKworCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQuaCBi
L1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJlZC5oCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2EzY2UxYTExMjBiYjkzMTdjMzVmMDM5YjdiOWI3ZTA3
ODJjOTM2Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZU1hY1NoYXJlZC5oCisrKyAvZGV2L251
bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgdGhl
bWUgaW1wbGVtZW50YXRpb24gZm9yIGZvcm0gY29udHJvbHMgaW4gV2ViQ29yZS4KLSAqCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIw
MTIgQXBwbGUgQ29tcHV0ZXIsIEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpZm5kZWYgUmVuZGVyVGhlbWVNYWNTaGFyZWRf
aAotI2RlZmluZSBSZW5kZXJUaGVtZU1hY1NoYXJlZF9oCi0KLSNpbXBvcnQgIlJlbmRlclRoZW1l
LmgiCi0jaW1wb3J0IDx3dGYvSGFzaE1hcC5oPgotI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgot
Ci1PQkpDX0NMQVNTIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyOwotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIFJlbmRlclByb2dyZXNzOwotY2xhc3MgUmVuZGVy
U3R5bGU7Ci0KLWNsYXNzIFJlbmRlclRoZW1lTWFjU2hhcmVkIDogcHVibGljIFJlbmRlclRoZW1l
IHsKLXB1YmxpYzoKLSAgICAvLyBBIG1ldGhvZCBhc2tpbmcgaWYgdGhlIGNvbnRyb2wgY2hhbmdl
cyBpdHMgdGludCB3aGVuIHRoZSB3aW5kb3cgaGFzIGZvY3VzIG9yIG5vdC4KLSAgICB2aXJ0dWFs
IGJvb2wgY29udHJvbFN1cHBvcnRzVGludHMoY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7Ci0K
LSAgICAvLyBBIGdlbmVyYWwgbWV0aG9kIGFza2luZyBpZiBhbnkgY29udHJvbCB0aW50aW5nIGlz
IHN1cHBvcnRlZCBhdCBhbGwuCi0gICAgdmlydHVhbCBib29sIHN1cHBvcnRzQ29udHJvbFRpbnRz
KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIGFkanVzdFJlcGFp
bnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCosIEludFJlY3QmKSBPVkVSUklERTsKLQotICAgIHZp
cnR1YWwgYm9vbCBpc0NvbnRyb2xTdHlsZWQoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBCb3Jk
ZXJEYXRhJiwgY29uc3QgRmlsbExheWVyJiwgY29uc3QgQ29sb3ImIGJhY2tncm91bmRDb2xvcikg
Y29uc3Q7Ci0KLSAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUluYWN0aXZlU2Vs
ZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBDb2xvciBwbGF0Zm9y
bUFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKLSAgICB2aXJ0
dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigp
IGNvbnN0OwotICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZUxpc3RCb3hTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKLSAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtSW5h
Y3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7Ci0gICAgdmlydHVh
bCBDb2xvciBwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIFNj
cm9sbGJhckNvbnRyb2xTaXplIHNjcm9sbGJhckNvbnRyb2xTaXplRm9yUGFydChDb250cm9sUGFy
dCkgeyByZXR1cm4gU21hbGxTY3JvbGxiYXI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBwbGF0Zm9y
bUNvbG9yc0RpZENoYW5nZSgpOwotCi0gICAgLy8gU3lzdGVtIGZvbnRzLgotICAgIHZpcnR1YWwg
dm9pZCBzeXN0ZW1Gb250KGludCBjc3NWYWx1ZUlkLCBGb250RGVzY3JpcHRpb24mKSBjb25zdDsK
LQotICAgIHZpcnR1YWwgaW50IG1pbmltdW1NZW51TGlzdFNpemUoUmVuZGVyU3R5bGUqKSBjb25z
dDsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUq
LCBFbGVtZW50KikgY29uc3Q7Ci0KLSNpZiBFTkFCTEUoREFUQUxJU1RfRUxFTUVOVCkKLSAgICB2
aXJ0dWFsIEludFNpemUgc2xpZGVyVGlja1NpemUoKSBjb25zdCBPVkVSUklERTsKLSAgICB2aXJ0
dWFsIGludCBzbGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKCkgY29uc3QgT1ZFUlJJREU7
Ci0jZW5kaWYKLQotICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdChSZW5k
ZXJTdHlsZSopIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5nUmln
aHQoUmVuZGVyU3R5bGUqKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBwb3B1cEludGVybmFsUGFk
ZGluZ1RvcChSZW5kZXJTdHlsZSopIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJu
YWxQYWRkaW5nQm90dG9tKFJlbmRlclN0eWxlKikgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wg
cGFpbnRDYXBzTG9ja0luZGljYXRvcihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0JikgT1ZFUlJJREU7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcG9wc01lbnVCeUFy
cm93S2V5cygpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KLQotI2lmIEVOQUJMRShN
RVRFUl9FTEVNRU5UKQotICAgIHZpcnR1YWwgSW50U2l6ZSBtZXRlclNpemVGb3JCb3VuZHMoY29u
c3QgUmVuZGVyTWV0ZXIqLCBjb25zdCBJbnRSZWN0JikgY29uc3QgT1ZFUlJJREU7Ci0gICAgdmly
dHVhbCBib29sIHBhaW50TWV0ZXIoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29u
c3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c01ldGVyKENvbnRyb2xQYXJ0
KSBjb25zdDsKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1FTlQpCi0gICAgLy8g
UmV0dXJucyB0aGUgcmVwZWF0IGludGVydmFsIG9mIHRoZSBhbmltYXRpb24gZm9yIHRoZSBwcm9n
cmVzcyBiYXIuCi0gICAgdmlydHVhbCBkb3VibGUgYW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxGb3JQ
cm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0OwotICAgIC8vIFJldHVybnMgdGhlIGR1
cmF0aW9uIG9mIHRoZSBhbmltYXRpb24gZm9yIHRoZSBwcm9ncmVzcyBiYXIuCi0gICAgdmlydHVh
bCBkb3VibGUgYW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyop
IGNvbnN0OwotI2VuZGlmCi0KLSAgICB2aXJ0dWFsIENvbG9yIHN5c3RlbUNvbG9yKGludCBjc3NW
YWx1ZUlkKSBjb25zdDsKLSAgICAvLyBDb250cm9scyBjb2xvciB2YWx1ZXMgcmV0dXJuZWQgZnJv
bSBwbGF0Zm9ybUZvY3VzUmluZ0NvbG9yKCkuIHN5c3RlbUNvbG9yKCkgd2lsbCBiZSB1c2VkIHdo
ZW4gZmFsc2UuCi0gICAgdmlydHVhbCBib29sIHVzZXNUZXN0TW9kZUZvY3VzUmluZ0NvbG9yKCkg
Y29uc3Q7Ci0gICAgLy8gQSB2aWV3IGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRhaW5lZCBkb2N1bWVu
dC4gU3ViY2xhc3NlcyBtYXkgbm90IGhhdmUgc3VjaCBhIHZpZXcgYW5kIHJldHVybiBhIGZha2Uu
Ci0gICAgdmlydHVhbCBOU1ZpZXcqIGRvY3VtZW50Vmlld0ZvcihSZW5kZXJPYmplY3QqKSBjb25z
dCA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICBSZW5kZXJUaGVtZU1hY1NoYXJlZCgpOwotICAgIHZp
cnR1YWwgflJlbmRlclRoZW1lTWFjU2hhcmVkKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9y
dHNTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3JzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQot
ICAgIHZpcnR1YWwgYm9vbCBwYWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRGaWVs
ZFN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKLQot
ICAgIHZpcnR1YWwgYm9vbCBwYWludFRleHRBcmVhKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0VGV4dEFyZWFT
dHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgcGFpbnRNZW51TGlzdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludElu
Zm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0U3R5
bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OwotCi0gICAg
dmlydHVhbCBib29sIHBhaW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlz
dEJ1dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25z
dDsKLQotI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQotICAgIHZpcnR1YWwgdm9pZCBhZGp1
c3RQcm9ncmVzc0JhclN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQq
KSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRQcm9ncmVzc0JhcihSZW5kZXJPYmplY3Qq
LCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0jZW5kaWYKLQotICAgIHZpcnR1
YWwgYm9vbCBwYWludFNsaWRlclRyYWNrKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYs
IGNvbnN0IEludFJlY3QmKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2xpZGVyVHJhY2tTdHls
ZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0KLSAgICB2
aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludElu
Zm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRlclRodW1i
U3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OwotCi0g
ICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hG
aWVsZFN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsK
LQotICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZENhbmNlbEJ1dHRvblN0eWxlKFN0
eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKLSAgICB2aXJ0dWFs
IGJvb2wgcGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2Vh
cmNoRmllbGREZWNvcmF0aW9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxl
bWVudCopIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkRGVjb3JhdGlv
bihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Ci0KLSAg
ICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKFN0
eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKLSAgICB2aXJ0dWFs
IGJvb2wgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uKFJlbmRlck9iamVjdCosIGNv
bnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKLQotICAgIHZpcnR1YWwgdm9pZCBhZGp1
c3RTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25TdHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5
bGUqLCBFbGVtZW50KikgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGRS
ZXN1bHRzQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKLQotI2lmIEVOQUJMRShWSURFTykKLSAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TWVkaWFT
bGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUqKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBib29s
IHN1cHBvcnRzQ2xvc2VkQ2FwdGlvbmluZygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSNlbmRp
ZgotCi0gICAgdmlydHVhbCBib29sIHNob3VsZFNob3dQbGFjZWhvbGRlcldoZW5Gb2N1c2VkKCkg
Y29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbmFwc2hvdHRlZFBsdWdpbk92ZXJsYXko
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwotCi1wcml2
YXRlOgotICAgIHZpcnR1YWwgU3RyaW5nIGZpbGVMaXN0TmFtZUZvcldpZHRoKGNvbnN0IEZpbGVM
aXN0KiwgY29uc3QgRm9udCYsIGludCB3aWR0aCwgYm9vbCBtdWx0aXBsZUZpbGVzQWxsb3dlZCkg
Y29uc3QgT1ZFUlJJREU7Ci0KLSAgICBJbnRSZWN0IGluZmxhdGVSZWN0KGNvbnN0IEludFJlY3Qm
LCBjb25zdCBJbnRTaXplJiwgY29uc3QgaW50KiBtYXJnaW5zLCBmbG9hdCB6b29tTGV2ZWwgPSAx
LjBmKSBjb25zdDsKLQotICAgIEZsb2F0UmVjdCBjb252ZXJ0VG9QYWludGluZ1JlY3QoY29uc3Qg
UmVuZGVyT2JqZWN0KiBpbnB1dFJlbmRlcmVyLCBjb25zdCBSZW5kZXJPYmplY3QqIHBhcnRSZW5k
ZXJlciwgY29uc3QgRmxvYXRSZWN0JiBpbnB1dFJlY3QsIGNvbnN0IEludFJlY3QmKSBjb25zdDsK
LQotICAgIC8vIEdldCB0aGUgY29udHJvbCBzaXplIGJhc2VkIG9mZiB0aGUgZm9udC4gVXNlZCBi
eSBzb21lIG9mIHRoZSBjb250cm9scyAobGlrZSBidXR0b25zKS4KLSAgICBOU0NvbnRyb2xTaXpl
IGNvbnRyb2xTaXplRm9yRm9udChSZW5kZXJTdHlsZSopIGNvbnN0OwotICAgIE5TQ29udHJvbFNp
emUgY29udHJvbFNpemVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxlKikgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRDb250cm9sU2l6ZShOU0NlbGwqLCBjb25zdCBJbnRTaXplKiBzaXplcywgY29uc3QgSW50
U2l6ZSYgbWluU2l6ZSwgZmxvYXQgem9vbUxldmVsID0gMS4wZik7Ci0gICAgdm9pZCBzZXRTaXpl
RnJvbUZvbnQoUmVuZGVyU3R5bGUqLCBjb25zdCBJbnRTaXplKiBzaXplcykgY29uc3Q7Ci0gICAg
SW50U2l6ZSBzaXplRm9yRm9udChSZW5kZXJTdHlsZSosIGNvbnN0IEludFNpemUqIHNpemVzKSBj
b25zdDsKLSAgICBJbnRTaXplIHNpemVGb3JTeXN0ZW1Gb250KFJlbmRlclN0eWxlKiwgY29uc3Qg
SW50U2l6ZSogc2l6ZXMpIGNvbnN0OwotICAgIHZvaWQgc2V0Rm9udEZyb21Db250cm9sU2l6ZShT
dHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqLCBOU0NvbnRyb2xTaXplKSBjb25zdDsKLQotICAg
IHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOwot
ICAgIHZvaWQgdXBkYXRlRW5hYmxlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCop
OwotICAgIHZvaWQgdXBkYXRlRm9jdXNlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9iamVj
dCopOwotICAgIHZvaWQgdXBkYXRlUHJlc3NlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9i
amVjdCopOwotICAgIC8vIEFuIG9wdGlvbmFsIGhvb2sgZm9yIHN1YmNsYXNzZXMgdG8gdXBkYXRl
IHRoZSBjb250cm9sIHRpbnQgb2YgTlNDZWxsLgotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVBY3Rp
dmVTdGF0ZShOU0NlbGwqLCBjb25zdCBSZW5kZXJPYmplY3QqKSB7IH0KLQotICAgIC8vIEhlbHBl
cnMgZm9yIGFkanVzdGluZyBhcHBlYXJhbmNlIGFuZCBmb3IgcGFpbnRpbmcKLQotICAgIHZvaWQg
c2V0UG9wdXBCdXR0b25DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVj
dCYpOwotICAgIGNvbnN0IEludFNpemUqIHBvcHVwQnV0dG9uU2l6ZXMoKSBjb25zdDsKLSAgICBj
b25zdCBpbnQqIHBvcHVwQnV0dG9uTWFyZ2lucygpIGNvbnN0OwotICAgIGNvbnN0IGludCogcG9w
dXBCdXR0b25QYWRkaW5nKE5TQ29udHJvbFNpemUpIGNvbnN0OwotICAgIHZvaWQgcGFpbnRNZW51
TGlzdEJ1dHRvbkdyYWRpZW50cyhSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25z
dCBJbnRSZWN0Jik7Ci0gICAgY29uc3QgSW50U2l6ZSogbWVudUxpc3RTaXplcygpIGNvbnN0Owot
Ci0gICAgY29uc3QgSW50U2l6ZSogc2VhcmNoRmllbGRTaXplcygpIGNvbnN0OwotICAgIGNvbnN0
IEludFNpemUqIGNhbmNlbEJ1dHRvblNpemVzKCkgY29uc3Q7Ci0gICAgY29uc3QgSW50U2l6ZSog
cmVzdWx0c0J1dHRvblNpemVzKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRTZWFyY2hDZWxsU3RhdGUo
UmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZvaWQgc2V0U2VhcmNoRmllbGRT
aXplKFJlbmRlclN0eWxlKikgY29uc3Q7Ci0KLSAgICBOU1BvcFVwQnV0dG9uQ2VsbCogcG9wdXBC
dXR0b24oKSBjb25zdDsKLSAgICBOU1NlYXJjaEZpZWxkQ2VsbCogc2VhcmNoKCkgY29uc3Q7Ci0g
ICAgTlNNZW51KiBzZWFyY2hNZW51VGVtcGxhdGUoKSBjb25zdDsKLSAgICBOU1NsaWRlckNlbGwq
IHNsaWRlclRodW1iSG9yaXpvbnRhbCgpIGNvbnN0OwotICAgIE5TU2xpZGVyQ2VsbCogc2xpZGVy
VGh1bWJWZXJ0aWNhbCgpIGNvbnN0OwotICAgIE5TVGV4dEZpZWxkQ2VsbCogdGV4dEZpZWxkKCkg
Y29uc3Q7Ci0KLSNpZiBFTkFCTEUoTUVURVJfRUxFTUVOVCkKLSAgICBOU0xldmVsSW5kaWNhdG9y
U3R5bGUgbGV2ZWxJbmRpY2F0b3JTdHlsZUZvcihDb250cm9sUGFydCkgY29uc3Q7Ci0gICAgTlNM
ZXZlbEluZGljYXRvckNlbGwqIGxldmVsSW5kaWNhdG9yRm9yKGNvbnN0IFJlbmRlck1ldGVyKikg
Y29uc3Q7Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQotICAgIGludCBt
aW5pbXVtUHJvZ3Jlc3NCYXJIZWlnaHQoUmVuZGVyU3R5bGUqKSBjb25zdDsKLSAgICBjb25zdCBJ
bnRTaXplKiBwcm9ncmVzc0JhclNpemVzKCkgY29uc3Q7Ci0gICAgY29uc3QgaW50KiBwcm9ncmVz
c0Jhck1hcmdpbnMoTlNDb250cm9sU2l6ZSkgY29uc3Q7Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAg
ICBtdXRhYmxlIFJldGFpblB0cjxOU1BvcFVwQnV0dG9uQ2VsbD4gbV9wb3B1cEJ1dHRvbjsKLSAg
ICBtdXRhYmxlIFJldGFpblB0cjxOU1NlYXJjaEZpZWxkQ2VsbD4gbV9zZWFyY2g7Ci0gICAgbXV0
YWJsZSBSZXRhaW5QdHI8TlNNZW51PiBtX3NlYXJjaE1lbnVUZW1wbGF0ZTsKLSAgICBtdXRhYmxl
IFJldGFpblB0cjxOU1NsaWRlckNlbGw+IG1fc2xpZGVyVGh1bWJIb3Jpem9udGFsOwotICAgIG11
dGFibGUgUmV0YWluUHRyPE5TU2xpZGVyQ2VsbD4gbV9zbGlkZXJUaHVtYlZlcnRpY2FsOwotICAg
IG11dGFibGUgUmV0YWluUHRyPE5TTGV2ZWxJbmRpY2F0b3JDZWxsPiBtX2xldmVsSW5kaWNhdG9y
OwotICAgIG11dGFibGUgUmV0YWluUHRyPE5TVGV4dEZpZWxkQ2VsbD4gbV90ZXh0RmllbGQ7Ci0K
LSAgICBib29sIG1faXNTbGlkZXJUaHVtYkhvcml6b250YWxQcmVzc2VkOwotICAgIGJvb2wgbV9p
c1NsaWRlclRodW1iVmVydGljYWxQcmVzc2VkOwotCi0gICAgbXV0YWJsZSBIYXNoTWFwPGludCwg
UkdCQTMyPiBtX3N5c3RlbUNvbG9yQ2FjaGU7Ci0KLSAgICBSZXRhaW5QdHI8V2ViQ29yZVJlbmRl
clRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXI+IG1fbm90aWZpY2F0aW9uT2JzZXJ2ZXI7Ci19Owot
Ci19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0KLSNlbmRpZiAvLyBSZW5kZXJUaGVtZU1hY1NoYXJl
ZF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNT
aGFyZWQubW0gYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWVNYWNTaGFyZWQu
bW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODEyMjk5Y2Q3Y2JhNzIxMzcyMjJl
ZjNmYWI0MzBhYTcwOWExMzkuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lTWFjU2hhcmVkLm1t
CisrKyAvZGV2L251bGwKQEAgLTEsMTkwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCi0gKi8KLQotI2ltcG9ydCAiY29uZmlnLmgiCi0jaW1wb3J0ICJSZW5kZXJU
aGVtZU1hY1NoYXJlZC5oIgotCi0jaW1wb3J0ICJCaXRtYXBJbWFnZS5oIgotI2ltcG9ydCAiQ29s
b3JNYWMuaCIKLSNpbXBvcnQgIkNTU1ZhbHVlTGlzdC5oIgotI2ltcG9ydCAiQ1NTVmFsdWVLZXl3
b3Jkcy5oIgotI2ltcG9ydCAiRG9jdW1lbnQuaCIKLSNpbXBvcnQgIkVsZW1lbnQuaCIKLSNpbXBv
cnQgIkZpbGVMaXN0LmgiCi0jaW1wb3J0ICJGcmFtZVZpZXcuaCIKLSNpbXBvcnQgIkdyYXBoaWNz
Q29udGV4dENHLmgiCi0jaW1wb3J0ICJIVE1MSW5wdXRFbGVtZW50LmgiCi0jaW1wb3J0ICJIVE1M
TWVkaWFFbGVtZW50LmgiCi0jaW1wb3J0ICJIVE1MTmFtZXMuaCIKLSNpbXBvcnQgIkhUTUxQbHVn
SW5JbWFnZUVsZW1lbnQuaCIKLSNpbXBvcnQgIkltYWdlLmgiCi0jaW1wb3J0ICJJbWFnZUJ1ZmZl
ci5oIgotI2ltcG9ydCAiTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0LmgiCi0jaW1wb3J0ICJM
b2NhbGl6ZWRTdHJpbmdzLmgiCi0jaW1wb3J0ICJNZWRpYUNvbnRyb2xFbGVtZW50cy5oIgotI2lt
cG9ydCAiUGFpbnRJbmZvLmgiCi0jaW1wb3J0ICJSZW5kZXJMYXllci5oIgotI2ltcG9ydCAiUmVu
ZGVyTWVkaWEuaCIKLSNpbXBvcnQgIlJlbmRlck1lZGlhQ29udHJvbHMuaCIKLSNpbXBvcnQgIlJl
bmRlclNsaWRlci5oIgotI2ltcG9ydCAiUmVuZGVyU25hcHNob3R0ZWRQbHVnSW4uaCIKLSNpbXBv
cnQgIlJlbmRlclZpZXcuaCIKLSNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5oIgotI2ltcG9ydCAiU3Ry
aW5nVHJ1bmNhdG9yLmgiCi0jaW1wb3J0ICJTdHlsZVJlc29sdmVyLmgiCi0jaW1wb3J0ICJUaW1l
UmFuZ2VzLmgiCi0jaW1wb3J0ICJUaGVtZU1hYy5oIgotI2ltcG9ydCAiV2ViQ29yZU5TQ2VsbEV4
dHJhcy5oIgotI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgotI2ltcG9ydCAiVXNl
ckFnZW50U3R5bGVTaGVldHMuaCIKLSNpbXBvcnQgPENhcmJvbi9DYXJib24uaD4KLSNpbXBvcnQg
PENvY29hL0NvY29hLmg+Ci0jaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+Ci0jaW1wb3J0IDx3dGYv
U3RkTGliRXh0cmFzLmg+Ci0jaW1wb3J0IDxtYXRoLmg+Ci0KLSNpbXBvcnQgIlJlbmRlclByb2dy
ZXNzLmgiCi0KLSNpZiBFTkFCTEUoTUVURVJfRUxFTUVOVCkKLSNpbmNsdWRlICJSZW5kZXJNZXRl
ci5oIgotI2luY2x1ZGUgIkhUTUxNZXRlckVsZW1lbnQuaCIKLSNlbmRpZgotCi11c2luZyBuYW1l
c3BhY2Ugc3RkOwotCi0vLyBUaGUgbWV0aG9kcyBpbiB0aGlzIGZpbGUgYXJlIHNwZWNpZmljIHRv
IHRoZSBNYWMgT1MgWCBwbGF0Zm9ybS4KLQotLy8gRklYTUU6IFRoZSBwbGF0Zm9ybS1pbmRlcGVu
ZGVudCBjb2RlIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGZhY3RvcmVkIG91dCBhbmQgbWVyZ2Vk
IHdpdGggUmVuZGVyVGhlbWVTYWZhcmkuCi0KLS8vIFdlIGVzdGltYXRlIHRoZSBhbmltYXRpb24g
cmF0ZSBvZiBhIE1hYyBPUyBYIHByb2dyZXNzIGJhciBpcyAzMyBmcHMuCi0vLyBIYXJkIGNvZGUg
dGhlIHZhbHVlIGhlcmUgYmVjYXVzZSB3ZSBoYXZlbid0IGZvdW5kIEFQSSBmb3IgaXQuCi1jb25z
dCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25GcmFtZVJhdGUgPSAwLjAzMzsKLQotLy8gTWFjIE9T
IFggcHJvZ3Jlc3MgYmFyIGFuaW1hdGlvbiBzZWVtcyB0byBoYXZlIDI1NiBmcmFtZXMuCi1jb25z
dCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25OdW1GcmFtZXMgPSAyNTY7Ci0KLUBpbnRlcmZhY2Ug
V2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXIgOiBOU09iamVjdAotewotICAg
IFdlYkNvcmU6OlJlbmRlclRoZW1lICpfdGhlbWU7Ci19Ci0KLS0gKGlkKWluaXRXaXRoVGhlbWU6
KFdlYkNvcmU6OlJlbmRlclRoZW1lICopdGhlbWU7Ci0tICh2b2lkKXN5c3RlbUNvbG9yc0RpZENo
YW5nZTooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb247Ci0KLUBlbmQKLQotQGltcGxlbWVu
dGF0aW9uIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyCi0KLS0gKGlkKWlu
aXRXaXRoVGhlbWU6KFdlYkNvcmU6OlJlbmRlclRoZW1lICopdGhlbWUKLXsKLSAgICBpZiAoIShz
ZWxmID0gW3N1cGVyIGluaXRdKSkKLSAgICAgICAgcmV0dXJuIG5pbDsKLQotICAgIF90aGVtZSA9
IHRoZW1lOwotICAgIHJldHVybiBzZWxmOwotfQotCi0tICh2b2lkKXN5c3RlbUNvbG9yc0RpZENo
YW5nZTooTlNOb3RpZmljYXRpb24gKil1bnVzZWROb3RpZmljYXRpb24KLXsKLSAgICBBU1NFUlRf
VU5VU0VEKHVudXNlZE5vdGlmaWNhdGlvbiwgW1t1bnVzZWROb3RpZmljYXRpb24gbmFtZV0gaXNF
cXVhbFRvU3RyaW5nOk5TU3lzdGVtQ29sb3JzRGlkQ2hhbmdlTm90aWZpY2F0aW9uXSk7Ci0gICAg
X3RoZW1lLT5wbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOwotfQotCi1AZW5kCi0KLUBpbnRlcmZh
Y2UgTlNUZXh0RmllbGRDZWxsIChXS0RldGFpbHMpCi0tIChDRkRpY3Rpb25hcnlSZWYpX2NvcmVV
SURyYXdPcHRpb25zV2l0aEZyYW1lOihOU1JlY3QpY2VsbEZyYW1lIGluVmlldzooTlNWaWV3ICop
Y29udHJvbFZpZXcgaW5jbHVkZUZvY3VzOihCT09MKWluY2x1ZGVGb2N1czsKLUBlbmQKLQotCi1A
aW50ZXJmYWNlIFdlYkNvcmVUZXh0RmllbGRDZWxsIDogTlNUZXh0RmllbGRDZWxsCi0tIChDRkRp
Y3Rpb25hcnlSZWYpX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lOihOU1JlY3QpY2VsbEZyYW1l
IGluVmlldzooTlNWaWV3ICopY29udHJvbFZpZXcgaW5jbHVkZUZvY3VzOihCT09MKWluY2x1ZGVG
b2N1czsKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIFdlYkNvcmVUZXh0RmllbGRDZWxsCi0tIChD
RkRpY3Rpb25hcnlSZWYpX2NvcmVVSURyYXdPcHRpb25zV2l0aEZyYW1lOihOU1JlY3QpY2VsbEZy
YW1lIGluVmlldzooTlNWaWV3ICopY29udHJvbFZpZXcgaW5jbHVkZUZvY3VzOihCT09MKWluY2x1
ZGVGb2N1cwotewotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgcG9zdC1MaW9uLW9ubHkgd29ya2Fy
b3VuZCBmb3IgPHJkYXI6Ly9wcm9ibGVtLzExMzg1NDYxPi4gV2hlbiB0aGF0IGJ1ZyBpcyByZXNv
bHZlZCwgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzIGNvZGUuCi0gICAgQ0ZNdXRhYmxlRGljdGlvbmFy
eVJlZiBjb3JlVUlEcmF3T3B0aW9ucyA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KE5V
TEwsIDAsIFtzdXBlciBfY29yZVVJRHJhd09wdGlvbnNXaXRoRnJhbWU6Y2VsbEZyYW1lIGluVmll
dzpjb250cm9sVmlldyBpbmNsdWRlRm9jdXM6aW5jbHVkZUZvY3VzXSk7Ci0gICAgQ0ZEaWN0aW9u
YXJ5U2V0VmFsdWUoY29yZVVJRHJhd09wdGlvbnMsIEAiYm9yZGVycyBvbmx5Iiwga0NGQm9vbGVh
blRydWUpOwotICAgIHJldHVybiAoQ0ZEaWN0aW9uYXJ5UmVmKVtOU01ha2VDb2xsZWN0YWJsZShj
b3JlVUlEcmF3T3B0aW9ucykgYXV0b3JlbGVhc2VdOwotfQotQGVuZAotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLWVudW0gewotICAgIHRvcE1h
cmdpbiwKLSAgICByaWdodE1hcmdpbiwKLSAgICBib3R0b21NYXJnaW4sCi0gICAgbGVmdE1hcmdp
bgotfTsKLQotZW51bSB7Ci0gICAgdG9wUGFkZGluZywKLSAgICByaWdodFBhZGRpbmcsCi0gICAg
Ym90dG9tUGFkZGluZywKLSAgICBsZWZ0UGFkZGluZwotfTsKLQotUmVuZGVyVGhlbWVNYWNTaGFy
ZWQ6OlJlbmRlclRoZW1lTWFjU2hhcmVkKCkKLSAgICA6IG1faXNTbGlkZXJUaHVtYkhvcml6b250
YWxQcmVzc2VkKGZhbHNlKQotICAgICwgbV9pc1NsaWRlclRodW1iVmVydGljYWxQcmVzc2VkKGZh
bHNlKQotICAgICwgbV9ub3RpZmljYXRpb25PYnNlcnZlcihBZG9wdE5TLCBbW1dlYkNvcmVSZW5k
ZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyIGFsbG9jXSBpbml0V2l0aFRoZW1lOnRoaXNdKQot
ewotICAgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6
bV9ub3RpZmljYXRpb25PYnNlcnZlci5nZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjpAc2VsZWN0b3Ioc3lzdGVtQ29s
b3JzRGlkQ2hhbmdlOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG5hbWU6TlNTeXN0ZW1Db2xvcnNEaWRDaGFuZ2VOb3RpZmljYXRp
b24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBvYmplY3Q6bmlsXTsKLX0KLQotUmVuZGVyVGhlbWVNYWNTaGFyZWQ6On5SZW5kZXJUaGVt
ZU1hY1NoYXJlZCgpCi17Ci0gICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVy
XSByZW1vdmVPYnNlcnZlcjptX25vdGlmaWNhdGlvbk9ic2VydmVyLmdldCgpXTsKLX0KLQotQ29s
b3IgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3Vu
ZENvbG9yKCkgY29uc3QKLXsKLSAgICBOU0NvbG9yKiBjb2xvciA9IFtbTlNDb2xvciBzZWxlY3Rl
ZFRleHRCYWNrZ3JvdW5kQ29sb3JdIGNvbG9yVXNpbmdDb2xvclNwYWNlTmFtZTpOU0RldmljZVJH
QkNvbG9yU3BhY2VdOwotICAgIHJldHVybiBDb2xvcihzdGF0aWNfY2FzdDxpbnQ+KDI1NS4wICog
W2NvbG9yIHJlZENvbXBvbmVudF0pLCBzdGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIGdy
ZWVuQ29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgYmx1ZUNvbXBv
bmVudF0pKTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBsYXRmb3JtSW5hY3Rp
dmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIE5TQ29sb3IqIGNvbG9y
ID0gW1tOU0NvbG9yIHNlY29uZGFyeVNlbGVjdGVkQ29udHJvbENvbG9yXSBjb2xvclVzaW5nQ29s
b3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlXTsKLSAgICByZXR1cm4gQ29sb3Ioc3Rh
dGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciByZWRDb21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8
aW50PigyNTUuMCAqIFtjb2xvciBncmVlbkNvbXBvbmVudF0pLCBzdGF0aWNfY2FzdDxpbnQ+KDI1
NS4wICogW2NvbG9yIGJsdWVDb21wb25lbnRdKSk7Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lTWFj
U2hhcmVkOjpwbGF0Zm9ybUFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBj
b25zdAotewotICAgIE5TQ29sb3IqIGNvbG9yID0gW1tOU0NvbG9yIGFsdGVybmF0ZVNlbGVjdGVk
Q29udHJvbENvbG9yXSBjb2xvclVzaW5nQ29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNw
YWNlXTsKLSAgICByZXR1cm4gQ29sb3Ioc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBy
ZWRDb21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBncmVlbkNvbXBv
bmVudF0pLCBzdGF0aWNfY2FzdDxpbnQ+KDI1NS4wICogW2NvbG9yIGJsdWVDb21wb25lbnRdKSk7
Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUFjdGl2ZUxpc3RCb3hT
ZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBDb2xvcjo6d2hp
dGU7Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUluYWN0aXZlTGlz
dEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENvbG9y
OjpibGFjazsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBsYXRmb3JtRm9jdXNS
aW5nQ29sb3IoKSBjb25zdAotewotICAgIGlmICh1c2VzVGVzdE1vZGVGb2N1c1JpbmdDb2xvcigp
KQotICAgICAgICByZXR1cm4gb2xkQXF1YUZvY3VzUmluZ0NvbG9yKCk7Ci0KLSAgICByZXR1cm4g
c3lzdGVtQ29sb3IoQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdDb2xvcik7Ci19Ci0KLUNvbG9yIFJl
bmRlclRoZW1lTWFjU2hhcmVkOjpwbGF0Zm9ybUluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tn
cm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3IoKTsKLX0KLQotc3RhdGljIEZvbnRXZWlnaHQgdG9Gb250V2VpZ2h0
KE5TSW50ZWdlciBhcHBLaXRGb250V2VpZ2h0KQotewotICAgIEFTU0VSVChhcHBLaXRGb250V2Vp
Z2h0ID4gMCAmJiBhcHBLaXRGb250V2VpZ2h0IDwgMTUpOwotICAgIGlmIChhcHBLaXRGb250V2Vp
Z2h0ID4gMTQpCi0gICAgICAgIGFwcEtpdEZvbnRXZWlnaHQgPSAxNDsKLSAgICBlbHNlIGlmIChh
cHBLaXRGb250V2VpZ2h0IDwgMSkKLSAgICAgICAgYXBwS2l0Rm9udFdlaWdodCA9IDE7Ci0KLSAg
ICBzdGF0aWMgRm9udFdlaWdodCBmb250V2VpZ2h0c1tdID0gewotICAgICAgICBGb250V2VpZ2h0
MTAwLAotICAgICAgICBGb250V2VpZ2h0MTAwLAotICAgICAgICBGb250V2VpZ2h0MjAwLAotICAg
ICAgICBGb250V2VpZ2h0MzAwLAotICAgICAgICBGb250V2VpZ2h0NDAwLAotICAgICAgICBGb250
V2VpZ2h0NTAwLAotICAgICAgICBGb250V2VpZ2h0NjAwLAotICAgICAgICBGb250V2VpZ2h0NjAw
LAotICAgICAgICBGb250V2VpZ2h0NzAwLAotICAgICAgICBGb250V2VpZ2h0ODAwLAotICAgICAg
ICBGb250V2VpZ2h0ODAwLAotICAgICAgICBGb250V2VpZ2h0OTAwLAotICAgICAgICBGb250V2Vp
Z2h0OTAwLAotICAgICAgICBGb250V2VpZ2h0OTAwCi0gICAgfTsKLSAgICByZXR1cm4gZm9udFdl
aWdodHNbYXBwS2l0Rm9udFdlaWdodCAtIDFdOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjU2hh
cmVkOjpzeXN0ZW1Gb250KGludCBjc3NWYWx1ZUlkLCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNj
cmlwdGlvbikgY29uc3QKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnREZXNjcmlwdGlv
biwgc3lzdGVtRm9udCwgKCkpOwotICAgIERFRklORV9TVEFUSUNfTE9DQUwoRm9udERlc2NyaXB0
aW9uLCBzbWFsbFN5c3RlbUZvbnQsICgpKTsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnRE
ZXNjcmlwdGlvbiwgbWVudUZvbnQsICgpKTsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEZvbnRE
ZXNjcmlwdGlvbiwgbGFiZWxGb250LCAoKSk7Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChGb250
RGVzY3JpcHRpb24sIG1pbmlDb250cm9sRm9udCwgKCkpOwotICAgIERFRklORV9TVEFUSUNfTE9D
QUwoRm9udERlc2NyaXB0aW9uLCBzbWFsbENvbnRyb2xGb250LCAoKSk7Ci0gICAgREVGSU5FX1NU
QVRJQ19MT0NBTChGb250RGVzY3JpcHRpb24sIGNvbnRyb2xGb250LCAoKSk7Ci0KLSAgICBGb250
RGVzY3JpcHRpb24qIGNhY2hlZERlc2M7Ci0gICAgTlNGb250KiBmb250ID0gbmlsOwotICAgIHN3
aXRjaCAoY3NzVmFsdWVJZCkgewotICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGxDYXB0aW9uOgot
ICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZzbWFsbFN5c3RlbUZvbnQ7Ci0gICAgICAgICAgICBp
ZiAoIXNtYWxsU3lzdGVtRm9udC5pc0Fic29sdXRlU2l6ZSgpKQotICAgICAgICAgICAgICAgIGZv
bnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBzbWFsbFN5c3RlbUZvbnRTaXpl
XV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZU1lbnU6Ci0gICAg
ICAgICAgICBjYWNoZWREZXNjID0gJm1lbnVGb250OwotICAgICAgICAgICAgaWYgKCFtZW51Rm9u
dC5pc0Fic29sdXRlU2l6ZSgpKQotICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IG1lbnVG
b250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVdXTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIENTU1ZhbHVlU3RhdHVzQmFyOgotICAgICAgICAgICAgY2FjaGVkRGVzYyA9
ICZsYWJlbEZvbnQ7Ci0gICAgICAgICAgICBpZiAoIWxhYmVsRm9udC5pc0Fic29sdXRlU2l6ZSgp
KQotICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IGxhYmVsRm9udE9mU2l6ZTpbTlNGb250
IGxhYmVsRm9udFNpemVdXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1Zh
bHVlV2Via2l0TWluaUNvbnRyb2w6Ci0gICAgICAgICAgICBjYWNoZWREZXNjID0gJm1pbmlDb250
cm9sRm9udDsKLSAgICAgICAgICAgIGlmICghbWluaUNvbnRyb2xGb250LmlzQWJzb2x1dGVTaXpl
KCkpCi0gICAgICAgICAgICAgICAgZm9udCA9IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNG
b250IHN5c3RlbUZvbnRTaXplRm9yQ29udHJvbFNpemU6TlNNaW5pQ29udHJvbFNpemVdXTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0U21hbGxDb250cm9s
OgotICAgICAgICAgICAgY2FjaGVkRGVzYyA9ICZzbWFsbENvbnRyb2xGb250OwotICAgICAgICAg
ICAgaWYgKCFzbWFsbENvbnRyb2xGb250LmlzQWJzb2x1dGVTaXplKCkpCi0gICAgICAgICAgICAg
ICAgZm9udCA9IFtOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZTpbTlNGb250IHN5c3RlbUZvbnRTaXpl
Rm9yQ29udHJvbFNpemU6TlNTbWFsbENvbnRyb2xTaXplXV07Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdENvbnRyb2w6Ci0gICAgICAgICAgICBjYWNoZWRE
ZXNjID0gJmNvbnRyb2xGb250OwotICAgICAgICAgICAgaWYgKCFjb250cm9sRm9udC5pc0Fic29s
dXRlU2l6ZSgpKQotICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNp
emU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXplOk5TUmVndWxhckNvbnRyb2xT
aXplXV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg
IGNhY2hlZERlc2MgPSAmc3lzdGVtRm9udDsKLSAgICAgICAgICAgIGlmICghc3lzdGVtRm9udC5p
c0Fic29sdXRlU2l6ZSgpKQotICAgICAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3RlbUZv
bnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZV1dOwotICAgIH0KLQotICAgIGlmIChmb250
KSB7Ci0gICAgICAgIE5TRm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIg
c2hhcmVkRm9udE1hbmFnZXJdOwotICAgICAgICBjYWNoZWREZXNjLT5zZXRJc0Fic29sdXRlU2l6
ZSh0cnVlKTsKLSAgICAgICAgY2FjaGVkRGVzYy0+c2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3Jp
cHRpb246Ok5vRmFtaWx5KTsKLSAgICAgICAgY2FjaGVkRGVzYy0+Zmlyc3RGYW1pbHkoKS5zZXRG
YW1pbHkoW2ZvbnQgd2ViQ29yZUZhbWlseU5hbWVdKTsKLSAgICAgICAgY2FjaGVkRGVzYy0+c2V0
U3BlY2lmaWVkU2l6ZShbZm9udCBwb2ludFNpemVdKTsKLSAgICAgICAgY2FjaGVkRGVzYy0+c2V0
V2VpZ2h0KHRvRm9udFdlaWdodChbZm9udE1hbmFnZXIgd2VpZ2h0T2ZGb250OmZvbnRdKSk7Ci0g
ICAgICAgIGNhY2hlZERlc2MtPnNldEl0YWxpYyhbZm9udE1hbmFnZXIgdHJhaXRzT2ZGb250OmZv
bnRdICYgTlNJdGFsaWNGb250TWFzayk7Ci0gICAgfQotICAgIGZvbnREZXNjcmlwdGlvbiA9ICpj
YWNoZWREZXNjOwotfQotCi1zdGF0aWMgUkdCQTMyIGNvbnZlcnROU0NvbG9yVG9Db2xvcihOU0Nv
bG9yICpjb2xvcikKLXsKLSAgICBOU0NvbG9yICpjb2xvckluQ29sb3JTcGFjZSA9IFtjb2xvciBj
b2xvclVzaW5nQ29sb3JTcGFjZU5hbWU6TlNEZXZpY2VSR0JDb2xvclNwYWNlXTsKLSAgICBpZiAo
Y29sb3JJbkNvbG9yU3BhY2UpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBzY2FsZUZh
Y3RvciA9IG5leHRhZnRlcigyNTYuMCwgMC4wKTsKLSAgICAgICAgcmV0dXJuIG1ha2VSR0Ioc3Rh
dGljX2Nhc3Q8aW50PihzY2FsZUZhY3RvciAqIFtjb2xvckluQ29sb3JTcGFjZSByZWRDb21wb25l
bnRdKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2NhbGVGYWN0b3IgKiBbY29sb3JJ
bkNvbG9yU3BhY2UgZ3JlZW5Db21wb25lbnRdKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGlu
dD4oc2NhbGVGYWN0b3IgKiBbY29sb3JJbkNvbG9yU3BhY2UgYmx1ZUNvbXBvbmVudF0pKTsKLSAg
ICB9Ci0KLSAgICAvLyBUaGlzIGNvbnZlcnNpb24gYWJvdmUgY2FuIGZhaWwgaWYgdGhlIE5TQ29s
b3IgaW4gcXVlc3Rpb24gaXMgYW4gTlNQYXR0ZXJuQ29sb3IKLSAgICAvLyAoYXMgbWFueSBzeXN0
ZW0gY29sb3JzIGFyZSkuIFRoZXNlIGNvbG9ycyBhcmUgYWN0dWFsbHkgYSByZXBlYXRpbmcgcGF0
dGVybgotICAgIC8vIG5vdCBqdXN0IGEgc29saWQgY29sb3IuIFRvIHdvcmsgYXJvdW5kIHRoaXMg
d2Ugc2ltcGx5IGRyYXcgYSAxeDEgaW1hZ2Ugb2YKLSAgICAvLyB0aGUgY29sb3IgYW5kIHVzZSB0
aGF0IHBpeGVsJ3MgY29sb3IuIEl0IG1pZ2h0IGJlIGJldHRlciB0byB1c2UgYW4gYXZlcmFnZSBv
ZgotICAgIC8vIHRoZSBjb2xvcnMgaW4gdGhlIHBhdHRlcm4gaW5zdGVhZC4KLSAgICBOU0JpdG1h
cEltYWdlUmVwICpvZmZzY3JlZW5SZXAgPSBbW05TQml0bWFwSW1hZ2VSZXAgYWxsb2NdIGluaXRX
aXRoQml0bWFwRGF0YVBsYW5lczpuaWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzV2lkZTox
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc0hpZ2g6MQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRz
UGVyU2FtcGxlOjgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJQaXhlbDo0Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaGFzQWxwaGE6WUVTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFuYXI6
Tk8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb2xvclNwYWNlTmFtZTpOU0RldmljZVJHQkNvbG9yU3BhY2UK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBieXRlc1BlclJvdzo0Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRz
UGVyUGl4ZWw6MzJdOwotCi0gICAgW05TR3JhcGhpY3NDb250ZXh0IHNhdmVHcmFwaGljc1N0YXRl
XTsKLSAgICBbTlNHcmFwaGljc0NvbnRleHQgc2V0Q3VycmVudENvbnRleHQ6W05TR3JhcGhpY3ND
b250ZXh0IGdyYXBoaWNzQ29udGV4dFdpdGhCaXRtYXBJbWFnZVJlcDpvZmZzY3JlZW5SZXBdXTsK
LSAgICBOU0VyYXNlUmVjdChOU01ha2VSZWN0KDAsIDAsIDEsIDEpKTsKLSAgICBbY29sb3IgZHJh
d1N3YXRjaEluUmVjdDpOU01ha2VSZWN0KDAsIDAsIDEsIDEpXTsKLSAgICBbTlNHcmFwaGljc0Nv
bnRleHQgcmVzdG9yZUdyYXBoaWNzU3RhdGVdOwotCi0gICAgTlNVSW50ZWdlciBwaXhlbFs0XTsK
LSAgICBbb2Zmc2NyZWVuUmVwIGdldFBpeGVsOnBpeGVsIGF0WDowIHk6MF07Ci0KLSAgICBbb2Zm
c2NyZWVuUmVwIHJlbGVhc2VdOwotCi0gICAgcmV0dXJuIG1ha2VSR0IocGl4ZWxbMF0sIHBpeGVs
WzFdLCBwaXhlbFsyXSk7Ci19Ci0KLXN0YXRpYyBSR0JBMzIgbWVudUJhY2tncm91bmRDb2xvcigp
Ci17Ci0gICAgTlNCaXRtYXBJbWFnZVJlcCAqb2Zmc2NyZWVuUmVwID0gW1tOU0JpdG1hcEltYWdl
UmVwIGFsbG9jXSBpbml0V2l0aEJpdG1hcERhdGFQbGFuZXM6bmlsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHBpeGVsc1dpZGU6MQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNIaWdoOjEKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYml0c1BlclNhbXBsZTo4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyUGl4
ZWw6NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FscGhhOllFUwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGlzUGxhbmFyOk5PCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU5hbWU6TlNEZXZp
Y2VSR0JDb2xvclNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJSb3c6NAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYml0c1BlclBpeGVsOjMyXTsKLQotICAgIENHQ29udGV4dFJlZiBjb250ZXh0
ID0gc3RhdGljX2Nhc3Q8Q0dDb250ZXh0UmVmPihbW05TR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNz
Q29udGV4dFdpdGhCaXRtYXBJbWFnZVJlcDpvZmZzY3JlZW5SZXBdIGdyYXBoaWNzUG9ydF0pOwot
ICAgIENHUmVjdCByZWN0ID0gQ0dSZWN0TWFrZSgwLCAwLCAxLCAxKTsKLSAgICBISVRoZW1lTWVu
dURyYXdJbmZvIGRyYXdJbmZvOwotICAgIGRyYXdJbmZvLnZlcnNpb24gPSAgMDsKLSAgICBkcmF3
SW5mby5tZW51VHlwZSA9IGtUaGVtZU1lbnVUeXBlUG9wVXA7Ci0gICAgSElUaGVtZURyYXdNZW51
QmFja2dyb3VuZCgmcmVjdCwgJmRyYXdJbmZvLCBjb250ZXh0LCBrSElUaGVtZU9yaWVudGF0aW9u
SW52ZXJ0ZWQpOwotCi0gICAgTlNVSW50ZWdlciBwaXhlbFs0XTsKLSAgICBbb2Zmc2NyZWVuUmVw
IGdldFBpeGVsOnBpeGVsIGF0WDowIHk6MF07Ci0KLSAgICBbb2Zmc2NyZWVuUmVwIHJlbGVhc2Vd
OwotCi0gICAgcmV0dXJuIG1ha2VSR0IocGl4ZWxbMF0sIHBpeGVsWzFdLCBwaXhlbFsyXSk7Ci19
Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCkK
LXsKLSAgICBtX3N5c3RlbUNvbG9yQ2FjaGUuY2xlYXIoKTsKLSAgICBSZW5kZXJUaGVtZTo6cGxh
dGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OnN5c3RlbUNvbG9yKGludCBjc3NWYWx1ZUlkKSBjb25zdAotewotICAgIHsKLSAgICAgICAgSGFz
aE1hcDxpbnQsIFJHQkEzMj46Oml0ZXJhdG9yIGl0ID0gbV9zeXN0ZW1Db2xvckNhY2hlLmZpbmQo
Y3NzVmFsdWVJZCk7Ci0gICAgICAgIGlmIChpdCAhPSBtX3N5c3RlbUNvbG9yQ2FjaGUuZW5kKCkp
Ci0gICAgICAgICAgICByZXR1cm4gaXQtPnZhbHVlOwotICAgIH0KLQotICAgIENvbG9yIGNvbG9y
OwotICAgIHN3aXRjaCAoY3NzVmFsdWVJZCkgewotICAgICAgICBjYXNlIENTU1ZhbHVlQWN0aXZl
Ym9yZGVyOgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29s
b3Iga2V5Ym9hcmRGb2N1c0luZGljYXRvckNvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBDU1NWYWx1ZUFjdGl2ZWNhcHRpb246Ci0gICAgICAgICAgICBjb2xvciA9IGNv
bnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB3aW5kb3dGcmFtZVRleHRDb2xvcl0pOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVBcHB3b3Jrc3BhY2U6Ci0gICAg
ICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBoZWFkZXJDb2xv
cl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVCYWNrZ3JvdW5k
OgotICAgICAgICAgICAgLy8gVXNlIHRoZW1lIGluZGVwZW5kZW50IGRlZmF1bHQKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlQnV0dG9uZmFjZToKLSAgICAgICAgICAg
IC8vIFdlIHVzZSB0aGlzIHZhbHVlIGluc3RlYWQgb2YgTlNDb2xvcidzIGNvbnRyb2xDb2xvciB0
byBhdm9pZCB3ZWJzaXRlIGluY29tcGF0aWJpbGl0aWVzLgotICAgICAgICAgICAgLy8gV2UgbWF5
IHdhbnQgdG8gY2hhbmdlIHRoaXMgdG8gdXNlIHRoZSBOU0NvbG9yIGluIGZ1dHVyZS4KLSAgICAg
ICAgICAgIGNvbG9yID0gMHhGRkMwQzBDMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIENTU1ZhbHVlQnV0dG9uaGlnaGxpZ2h0OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0
TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbEhpZ2hsaWdodENvbG9yXSk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbnNoYWRvdzoKLSAgICAgICAg
ICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xTaGFkb3dD
b2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVCdXR0b250
ZXh0OgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Ig
Y29udHJvbFRleHRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NT
VmFsdWVDYXB0aW9udGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0Nv
bG9yKFtOU0NvbG9yIHRleHRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgQ1NTVmFsdWVHcmF5dGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JU
b0NvbG9yKFtOU0NvbG9yIGRpc2FibGVkQ29udHJvbFRleHRDb2xvcl0pOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVIaWdobGlnaHQ6Ci0gICAgICAgICAgICBjb2xv
ciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBzZWxlY3RlZFRleHRCYWNrZ3JvdW5k
Q29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlSGlnaGxp
Z2h0dGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0Nv
bG9yIHNlbGVjdGVkVGV4dENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBDU1NWYWx1ZUluYWN0aXZlYm9yZGVyOgotICAgICAgICAgICAgY29sb3IgPSBjb252ZXJ0TlND
b2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbEJhY2tncm91bmRDb2xvcl0pOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVJbmFjdGl2ZWNhcHRpb246Ci0gICAgICAg
ICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBjb250cm9sQmFja2dy
b3VuZENvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZUlu
YWN0aXZlY2FwdGlvbnRleHQ6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9D
b2xvcihbTlNDb2xvciB0ZXh0Q29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIENTU1ZhbHVlSW5mb2JhY2tncm91bmQ6Ci0gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBj
b3JyZXNwb25kaW5nIE5TQ29sb3IgZm9yIHRoaXMgc28gd2UgdXNlIGEgaGFyZCBjb2RlZCB2YWx1
ZS4KLSAgICAgICAgICAgIGNvbG9yID0gMHhGRkZCRkNDNTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIENTU1ZhbHVlSW5mb3RleHQ6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZl
cnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0Q29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIENTU1ZhbHVlTWVudToKLSAgICAgICAgICAgIGNvbG9yID0gbWVudUJh
Y2tncm91bmRDb2xvcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFs
dWVNZW51dGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtO
U0NvbG9yIHNlbGVjdGVkTWVudUl0ZW1UZXh0Q29sb3JdKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIENTU1ZhbHVlU2Nyb2xsYmFyOgotICAgICAgICAgICAgY29sb3IgPSBjb252
ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Igc2Nyb2xsQmFyQ29sb3JdKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlVGV4dDoKLSAgICAgICAgICAgIGNvbG9yID0g
Y29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHRleHRDb2xvcl0pOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRkYXJrc2hhZG93OgotICAgICAgICAg
ICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbERhcmtTaGFk
b3dDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJl
ZWRzaGFkb3c6Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlND
b2xvciBzaGFkb3dDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NT
VmFsdWVUaHJlZWRmYWNlOgotICAgICAgICAgICAgLy8gV2UgdXNlIHRoaXMgdmFsdWUgaW5zdGVh
ZCBvZiBOU0NvbG9yJ3MgY29udHJvbENvbG9yIHRvIGF2b2lkIHdlYnNpdGUgaW5jb21wYXRpYmls
aXRpZXMuCi0gICAgICAgICAgICAvLyBXZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyB0byB1c2Ug
dGhlIE5TQ29sb3IgaW4gZnV0dXJlLgotICAgICAgICAgICAgY29sb3IgPSAweEZGQzBDMEMwOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaHJlZWRoaWdobGlnaHQ6
Ci0gICAgICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBoaWdo
bGlnaHRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVU
aHJlZWRsaWdodHNoYWRvdzoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0Nv
bG9yKFtOU0NvbG9yIGNvbnRyb2xMaWdodEhpZ2hsaWdodENvbG9yXSk7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEZvY3VzUmluZ0NvbG9yOgotICAgICAg
ICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Iga2V5Ym9hcmRGb2N1
c0luZGljYXRvckNvbG9yXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDU1NW
YWx1ZVdpbmRvdzoKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtO
U0NvbG9yIHdpbmRvd0JhY2tncm91bmRDb2xvcl0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3dmcmFtZToKLSAgICAgICAgICAgIGNvbG9yID0gY29udmVy
dE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHdpbmRvd0ZyYW1lQ29sb3JdKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIENTU1ZhbHVlV2luZG93dGV4dDoKLSAgICAgICAgICAgIGNv
bG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIHdpbmRvd0ZyYW1lVGV4dENvbG9y
XSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIWNvbG9yLmlzVmFsaWQo
KSkKLSAgICAgICAgY29sb3IgPSBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7
Ci0KLSAgICBpZiAoY29sb3IuaXNWYWxpZCgpKQotICAgICAgICBtX3N5c3RlbUNvbG9yQ2FjaGUu
c2V0KGNzc1ZhbHVlSWQsIGNvbG9yLnJnYigpKTsKLQotICAgIHJldHVybiBjb2xvcjsKLX0KLQot
Ym9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6dXNlc1Rlc3RNb2RlRm9jdXNSaW5nQ29sb3IoKSBj
b25zdAotewotICAgIHJldHVybiBXZWJDb3JlOjp1c2VzVGVzdE1vZGVGb2N1c1JpbmdDb2xvcigp
OwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjppc0NvbnRyb2xTdHlsZWQoY29uc3Qg
UmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBCb3JkZXJEYXRhJiBib3JkZXIsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsbExheWVyJiBiYWNrZ3JvdW5kLCBj
b25zdCBDb2xvciYgYmFja2dyb3VuZENvbG9yKSBjb25zdAotewotICAgIGlmIChzdHlsZS0+YXBw
ZWFyYW5jZSgpID09IFRleHRGaWVsZFBhcnQgfHwgc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBUZXh0
QXJlYVBhcnQgfHwgc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBMaXN0Ym94UGFydCkKLSAgICAgICAg
cmV0dXJuIHN0eWxlLT5ib3JkZXIoKSAhPSBib3JkZXI7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBp
cyBob3JyaWJsZSwgYnV0IHRoZXJlIGlzIG5vdCBtdWNoIGVsc2UgdGhhdCBjYW4gYmUgZG9uZS4g
IE1lbnUgbGlzdHMgY2Fubm90IGRyYXcgcHJvcGVybHkgd2hlbgotICAgIC8vIHNjYWxlZC4gIFRo
ZXkgY2FuJ3QgcmVhbGx5IGRyYXcgcHJvcGVybHkgd2hlbiB0cmFuc2Zvcm1lZCBlaXRoZXIuICBX
ZSBjYW4ndCBkZXRlY3QgdGhlIHRyYW5zZm9ybSBjYXNlIGF0IHN0eWxlCi0gICAgLy8gYWRqdXN0
bWVudCB0aW1lIHNvIHRoYXQgd2lsbCBqdXN0IGhhdmUgdG8gc3RheSBicm9rZW4uICBXZSBjYW4g
aG93ZXZlciBkZXRlY3QgdGhhdCB3ZSdyZSB6b29taW5nLiAgSWYgem9vbWluZwotICAgIC8vIGlz
IGluIGVmZmVjdCB3ZSB0cmVhdCBpdCBsaWtlIHRoZSBjb250cm9sIGlzIHN0eWxlZC4KLSAgICBp
ZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQgJiYgc3R5bGUtPmVmZmVjdGl2
ZVpvb20oKSAhPSAxLjBmKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBSZW5k
ZXJUaGVtZTo6aXNDb250cm9sU3R5bGVkKHN0eWxlLCBib3JkZXIsIGJhY2tncm91bmQsIGJhY2tn
cm91bmRDb2xvcik7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFJlcGFp
bnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCogbywgSW50UmVjdCYgcikKLXsKLSAgICBDb250cm9s
UGFydCBwYXJ0ID0gby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOwotCi0jaWYgVVNFKE5FV19USEVN
RSkKLSAgICBzd2l0Y2ggKHBhcnQpIHsKLSAgICAgICAgY2FzZSBDaGVja2JveFBhcnQ6Ci0gICAg
ICAgIGNhc2UgUmFkaW9QYXJ0OgotICAgICAgICBjYXNlIFB1c2hCdXR0b25QYXJ0OgotICAgICAg
ICBjYXNlIFNxdWFyZUJ1dHRvblBhcnQ6Ci0gICAgICAgIGNhc2UgRGVmYXVsdEJ1dHRvblBhcnQ6
Ci0gICAgICAgIGNhc2UgQnV0dG9uUGFydDoKLSAgICAgICAgY2FzZSBJbm5lclNwaW5CdXR0b25Q
YXJ0OgotICAgICAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjphZGp1c3RSZXBhaW50UmVjdChv
LCByKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSNlbmRp
ZgotCi0gICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwot
Ci0gICAgaWYgKHBhcnQgPT0gTWVudWxpc3RQYXJ0KSB7Ci0gICAgICAgIHNldFBvcHVwQnV0dG9u
Q2VsbFN0YXRlKG8sIHIpOwotICAgICAgICBJbnRTaXplIHNpemUgPSBwb3B1cEJ1dHRvblNpemVz
KClbW3BvcHVwQnV0dG9uKCkgY29udHJvbFNpemVdXTsKLSAgICAgICAgc2l6ZS5zZXRIZWlnaHQo
c2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7Ci0gICAgICAgIHNpemUuc2V0V2lkdGgoci53aWR0
aCgpKTsKLSAgICAgICAgciA9IGluZmxhdGVSZWN0KHIsIHNpemUsIHBvcHVwQnV0dG9uTWFyZ2lu
cygpLCB6b29tTGV2ZWwpOwotICAgIH0KLX0KLQotSW50UmVjdCBSZW5kZXJUaGVtZU1hY1NoYXJl
ZDo6aW5mbGF0ZVJlY3QoY29uc3QgSW50UmVjdCYgciwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29u
c3QgaW50KiBtYXJnaW5zLCBmbG9hdCB6b29tTGV2ZWwpIGNvbnN0Ci17Ci0gICAgLy8gT25seSBk
byB0aGUgaW5mbGF0aW9uIGlmIHRoZSBhdmFpbGFibGUgd2lkdGgvaGVpZ2h0IGFyZSB0b28gc21h
bGwuICBPdGhlcndpc2UgdHJ5IHRvCi0gICAgLy8gZml0IHRoZSBnbG93L2NoZWNrIHNwYWNlIGlu
dG8gdGhlIGF2YWlsYWJsZSBib3gncyB3aWR0aC9oZWlnaHQuCi0gICAgaW50IHdpZHRoRGVsdGEg
PSByLndpZHRoKCkgLSAoc2l6ZS53aWR0aCgpICsgbWFyZ2luc1tsZWZ0TWFyZ2luXSAqIHpvb21M
ZXZlbCArIG1hcmdpbnNbcmlnaHRNYXJnaW5dICogem9vbUxldmVsKTsKLSAgICBpbnQgaGVpZ2h0
RGVsdGEgPSByLmhlaWdodCgpIC0gKHNpemUuaGVpZ2h0KCkgKyBtYXJnaW5zW3RvcE1hcmdpbl0g
KiB6b29tTGV2ZWwgKyBtYXJnaW5zW2JvdHRvbU1hcmdpbl0gKiB6b29tTGV2ZWwpOwotICAgIElu
dFJlY3QgcmVzdWx0KHIpOwotICAgIGlmICh3aWR0aERlbHRhIDwgMCkgewotICAgICAgICByZXN1
bHQuc2V0WChyZXN1bHQueCgpIC0gbWFyZ2luc1tsZWZ0TWFyZ2luXSAqIHpvb21MZXZlbCk7Ci0g
ICAgICAgIHJlc3VsdC5zZXRXaWR0aChyZXN1bHQud2lkdGgoKSAtIHdpZHRoRGVsdGEpOwotICAg
IH0KLSAgICBpZiAoaGVpZ2h0RGVsdGEgPCAwKSB7Ci0gICAgICAgIHJlc3VsdC5zZXRZKHJlc3Vs
dC55KCkgLSBtYXJnaW5zW3RvcE1hcmdpbl0gKiB6b29tTGV2ZWwpOwotICAgICAgICByZXN1bHQu
c2V0SGVpZ2h0KHJlc3VsdC5oZWlnaHQoKSAtIGhlaWdodERlbHRhKTsKLSAgICB9Ci0gICAgcmV0
dXJuIHJlc3VsdDsKLX0KLQotRmxvYXRSZWN0IFJlbmRlclRoZW1lTWFjU2hhcmVkOjpjb252ZXJ0
VG9QYWludGluZ1JlY3QoY29uc3QgUmVuZGVyT2JqZWN0KiBpbnB1dFJlbmRlcmVyLCBjb25zdCBS
ZW5kZXJPYmplY3QqIHBhcnRSZW5kZXJlciwgY29uc3QgRmxvYXRSZWN0JiBpbnB1dFJlY3QsIGNv
bnN0IEludFJlY3QmIHIpIGNvbnN0Ci17Ci0gICAgRmxvYXRSZWN0IHBhcnRSZWN0KGlucHV0UmVj
dCk7Ci0KLSAgICAvLyBDb21wdXRlIGFuIG9mZnNldCBiZXR3ZWVuIHRoZSBwYXJ0IHJlbmRlcmVy
IGFuZCB0aGUgaW5wdXQgcmVuZGVyZXIKLSAgICBGbG9hdFNpemUgb2Zmc2V0RnJvbUlucHV0UmVu
ZGVyZXI7Ci0gICAgY29uc3QgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IHBhcnRSZW5kZXJlcjsK
LSAgICB3aGlsZSAocmVuZGVyZXIgJiYgcmVuZGVyZXIgIT0gaW5wdXRSZW5kZXJlcikgewotICAg
ICAgICBSZW5kZXJPYmplY3QqIGNvbnRhaW5pbmdSZW5kZXJlciA9IHJlbmRlcmVyLT5jb250YWlu
ZXIoKTsKLSAgICAgICAgb2Zmc2V0RnJvbUlucHV0UmVuZGVyZXIgLT0gcm91bmRlZEludFNpemUo
cmVuZGVyZXItPm9mZnNldEZyb21Db250YWluZXIoY29udGFpbmluZ1JlbmRlcmVyLCBMYXlvdXRQ
b2ludCgpKSk7Ci0gICAgICAgIHJlbmRlcmVyID0gY29udGFpbmluZ1JlbmRlcmVyOwotICAgIH0K
LSAgICAvLyBJZiB0aGUgaW5wdXQgcmVuZGVyZXIgd2FzIG5vdCBhIGNvbnRhaW5lciwgc29tZXRo
aW5nIHdlbnQgd3JvbmcKLSAgICBBU1NFUlQocmVuZGVyZXIgPT0gaW5wdXRSZW5kZXJlcik7Ci0g
ICAgLy8gTW92ZSB0aGUgcmVjdCBpbnRvIHBhcnRSZW5kZXJlcidzIGNvb3JkcwotICAgIHBhcnRS
ZWN0Lm1vdmUob2Zmc2V0RnJvbUlucHV0UmVuZGVyZXIpOwotICAgIC8vIEFjY291bnQgZm9yIHRo
ZSBsb2NhbCBkcmF3aW5nIG9mZnNldCAodHgsIHR5KQotICAgIHBhcnRSZWN0Lm1vdmUoci54KCks
IHIueSgpKTsKLQotICAgIHJldHVybiBwYXJ0UmVjdDsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6dXBkYXRlQ2hlY2tlZFN0YXRlKE5TQ2VsbCogY2VsbCwgY29uc3QgUmVuZGVyT2Jq
ZWN0KiBvKQotewotICAgIGJvb2wgb2xkSW5kZXRlcm1pbmF0ZSA9IFtjZWxsIHN0YXRlXSA9PSBO
U01peGVkU3RhdGU7Ci0gICAgYm9vbCBpbmRldGVybWluYXRlID0gaXNJbmRldGVybWluYXRlKG8p
OwotICAgIGJvb2wgY2hlY2tlZCA9IGlzQ2hlY2tlZChvKTsKLQotICAgIGlmIChvbGRJbmRldGVy
bWluYXRlICE9IGluZGV0ZXJtaW5hdGUpIHsKLSAgICAgICAgW2NlbGwgc2V0U3RhdGU6aW5kZXRl
cm1pbmF0ZSA/IE5TTWl4ZWRTdGF0ZSA6IChjaGVja2VkID8gTlNPblN0YXRlIDogTlNPZmZTdGF0
ZSldOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBvbGRDaGVja2VkID0gW2Nl
bGwgc3RhdGVdID09IE5TT25TdGF0ZTsKLSAgICBpZiAoY2hlY2tlZCAhPSBvbGRDaGVja2VkKQot
ICAgICAgICBbY2VsbCBzZXRTdGF0ZTpjaGVja2VkID8gTlNPblN0YXRlIDogTlNPZmZTdGF0ZV07
Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnVwZGF0ZUVuYWJsZWRTdGF0ZShOU0Nl
bGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykKLXsKLSAgICBib29sIG9sZEVuYWJsZWQg
PSBbY2VsbCBpc0VuYWJsZWRdOwotICAgIGJvb2wgZW5hYmxlZCA9IGlzRW5hYmxlZChvKTsKLSAg
ICBpZiAoZW5hYmxlZCAhPSBvbGRFbmFibGVkKQotICAgICAgICBbY2VsbCBzZXRFbmFibGVkOmVu
YWJsZWRdOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjp1cGRhdGVGb2N1c2VkU3Rh
dGUoTlNDZWxsKiBjZWxsLCBjb25zdCBSZW5kZXJPYmplY3QqIG8pCi17Ci0gICAgYm9vbCBvbGRG
b2N1c2VkID0gW2NlbGwgc2hvd3NGaXJzdFJlc3BvbmRlcl07Ci0gICAgYm9vbCBmb2N1c2VkID0g
aXNGb2N1c2VkKG8pICYmIG8tPnN0eWxlKCktPm91dGxpbmVTdHlsZUlzQXV0bygpOwotICAgIGlm
IChmb2N1c2VkICE9IG9sZEZvY3VzZWQpCi0gICAgICAgIFtjZWxsIHNldFNob3dzRmlyc3RSZXNw
b25kZXI6Zm9jdXNlZF07Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnVwZGF0ZVBy
ZXNzZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykKLXsKLSAgICBi
b29sIG9sZFByZXNzZWQgPSBbY2VsbCBpc0hpZ2hsaWdodGVkXTsKLSAgICBib29sIHByZXNzZWQg
PSAoby0+bm9kZSgpICYmIG8tPm5vZGUoKS0+YWN0aXZlKCkpOwotICAgIGlmIChwcmVzc2VkICE9
IG9sZFByZXNzZWQpCi0gICAgICAgIFtjZWxsIHNldEhpZ2hsaWdodGVkOnByZXNzZWRdOwotfQot
Ci1ib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpjb250cm9sU3VwcG9ydHNUaW50cyhjb25zdCBS
ZW5kZXJPYmplY3QqIG8pIGNvbnN0Ci17Ci0gICAgLy8gQW4gYWx0ZXJuYXRlIHdheSB0byBpbXBs
ZW1lbnQgdGhpcyB3b3VsZCBiZSB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIGNlbGwgb2JqZWN0Ci0g
ICAgLy8gYW5kIGNhbGwgdGhlIHByaXZhdGUgX25lZWRSZWRyYXdPbldpbmRvd0NoYW5nZWRLZXlT
dGF0ZSBtZXRob2QuIEFuIGFkdmFudGFnZSBvZgotICAgIC8vIHRoYXQgd291bGQgYmUgdGhhdCB3
ZSB3b3VsZCBtYXRjaCBBcHBLaXQgYmVoYXZpb3IgbW9yZSBjbG9zZWx5LCBidXQgYSBkaXNhZHZh
bnRhZ2UKLSAgICAvLyB3b3VsZCBiZSB0aGF0IHdlIHdvdWxkIHJlbHkgb24gYW4gQXBwS2l0IFNQ
SSBtZXRob2QuCi0KLSAgICBpZiAoIWlzRW5hYmxlZChvKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gQ2hlY2tib3hlcyBvbmx5IGhhdmUgdGludCB3aGVuIGNoZWNrZWQuCi0gICAg
aWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBDaGVja2JveFBhcnQpCi0gICAgICAgIHJl
dHVybiBpc0NoZWNrZWQobyk7Ci0KLSAgICAvLyBGb3Igbm93IGFzc3VtZSBvdGhlciBjb250cm9s
cyBoYXZlIHRpbnQgaWYgZW5hYmxlZC4KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotTlNDb250cm9s
U2l6ZSBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6Y29udHJvbFNpemVGb3JGb250KFJlbmRlclN0eWxl
KiBzdHlsZSkgY29uc3QKLXsKLSAgICBpbnQgZm9udFNpemUgPSBzdHlsZS0+Zm9udFNpemUoKTsK
LSAgICBpZiAoZm9udFNpemUgPj0gMTYpCi0gICAgICAgIHJldHVybiBOU1JlZ3VsYXJDb250cm9s
U2l6ZTsKLSAgICBpZiAoZm9udFNpemUgPj0gMTEpCi0gICAgICAgIHJldHVybiBOU1NtYWxsQ29u
dHJvbFNpemU7Ci0gICAgcmV0dXJuIE5TTWluaUNvbnRyb2xTaXplOwotfQotCi12b2lkIFJlbmRl
clRoZW1lTWFjU2hhcmVkOjpzZXRDb250cm9sU2l6ZShOU0NlbGwqIGNlbGwsIGNvbnN0IEludFNp
emUqIHNpemVzLCBjb25zdCBJbnRTaXplJiBtaW5TaXplLCBmbG9hdCB6b29tTGV2ZWwpCi17Ci0g
ICAgTlNDb250cm9sU2l6ZSBzaXplOwotICAgIGlmIChtaW5TaXplLndpZHRoKCkgPj0gc3RhdGlj
X2Nhc3Q8aW50PihzaXplc1tOU1JlZ3VsYXJDb250cm9sU2l6ZV0ud2lkdGgoKSAqIHpvb21MZXZl
bCkgJiYKLSAgICAgICAgbWluU2l6ZS5oZWlnaHQoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVz
W05TUmVndWxhckNvbnRyb2xTaXplXS5oZWlnaHQoKSAqIHpvb21MZXZlbCkpCi0gICAgICAgIHNp
emUgPSBOU1JlZ3VsYXJDb250cm9sU2l6ZTsKLSAgICBlbHNlIGlmIChtaW5TaXplLndpZHRoKCkg
Pj0gc3RhdGljX2Nhc3Q8aW50PihzaXplc1tOU1NtYWxsQ29udHJvbFNpemVdLndpZHRoKCkgKiB6
b29tTGV2ZWwpICYmCi0gICAgICAgICAgICAgbWluU2l6ZS5oZWlnaHQoKSA+PSBzdGF0aWNfY2Fz
dDxpbnQ+KHNpemVzW05TU21hbGxDb250cm9sU2l6ZV0uaGVpZ2h0KCkgKiB6b29tTGV2ZWwpKQot
ICAgICAgICBzaXplID0gTlNTbWFsbENvbnRyb2xTaXplOwotICAgIGVsc2UKLSAgICAgICAgc2l6
ZSA9IE5TTWluaUNvbnRyb2xTaXplOwotICAgIGlmIChzaXplICE9IFtjZWxsIGNvbnRyb2xTaXpl
XSkgLy8gT25seSB1cGRhdGUgaWYgd2UgaGF2ZSB0bywgc2luY2UgQXBwS2l0IGRvZXMgd29yayBl
dmVuIGlmIHRoZSBzaXplIGlzIHRoZSBzYW1lLgotICAgICAgICBbY2VsbCBzZXRDb250cm9sU2l6
ZTpzaXplXTsKLX0KLQotSW50U2l6ZSBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2l6ZUZvckZvbnQo
UmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBJbnRTaXplKiBzaXplcykgY29uc3QKLXsKLSAgICBp
ZiAoc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSAxLjBmKSB7Ci0gICAgICAgIEludFNpemUgcmVz
dWx0ID0gc2l6ZXNbY29udHJvbFNpemVGb3JGb250KHN0eWxlKV07Ci0gICAgICAgIHJldHVybiBJ
bnRTaXplKHJlc3VsdC53aWR0aCgpICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSwgcmVzdWx0Lmhl
aWdodCgpICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSk7Ci0gICAgfQotICAgIHJldHVybiBzaXpl
c1tjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpXTsKLX0KLQotSW50U2l6ZSBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6c2l6ZUZvclN5c3RlbUZvbnQoUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBJbnRT
aXplKiBzaXplcykgY29uc3QKLXsKLSAgICBpZiAoc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSAx
LjBmKSB7Ci0gICAgICAgIEludFNpemUgcmVzdWx0ID0gc2l6ZXNbY29udHJvbFNpemVGb3JTeXN0
ZW1Gb250KHN0eWxlKV07Ci0gICAgICAgIHJldHVybiBJbnRTaXplKHJlc3VsdC53aWR0aCgpICog
c3R5bGUtPmVmZmVjdGl2ZVpvb20oKSwgcmVzdWx0LmhlaWdodCgpICogc3R5bGUtPmVmZmVjdGl2
ZVpvb20oKSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplc1tjb250cm9sU2l6ZUZvclN5c3RlbUZv
bnQoc3R5bGUpXTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2V0U2l6ZUZyb21G
b250KFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgSW50U2l6ZSogc2l6ZXMpIGNvbnN0Ci17Ci0g
ICAgLy8gRklYTUU6IENoZWNrIGlzIGZsYXdlZCwgc2luY2UgaXQgZG9lc24ndCB0YWtlIG1pbi13
aWR0aC9tYXgtd2lkdGggaW50byBhY2NvdW50LgotICAgIEludFNpemUgc2l6ZSA9IHNpemVGb3JG
b250KHN0eWxlLCBzaXplcyk7Ci0gICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JB
dXRvKCkgJiYgc2l6ZS53aWR0aCgpID4gMCkKLSAgICAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0
aChzaXplLndpZHRoKCksIEZpeGVkKSk7Ci0gICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8o
KSAmJiBzaXplLmhlaWdodCgpID4gMCkKLSAgICAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgo
c2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6
c2V0Rm9udEZyb21Db250cm9sU2l6ZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxl
LCBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplKSBjb25zdAotewotICAgIEZvbnREZXNjcmlwdGlv
biBmb250RGVzY3JpcHRpb247Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldElzQWJzb2x1dGVTaXpl
KHRydWUpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlw
dGlvbjo6U2VyaWZGYW1pbHkpOwotCi0gICAgTlNGb250KiBmb250ID0gW05TRm9udCBzeXN0ZW1G
b250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250cm9sU2l6ZTpjb250cm9sU2l6
ZV1dOwotICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShbZm9udCB3
ZWJDb3JlRmFtaWx5TmFtZV0pOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUo
W2ZvbnQgcG9pbnRTaXplXSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCkpOwotICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKFtmb250IHBvaW50U2l6ZV0gKiBzdHlsZS0+ZWZmZWN0
aXZlWm9vbSgpKTsKLQotICAgIC8vIFJlc2V0IGxpbmUgaGVpZ2h0Ci0gICAgc3R5bGUtPnNldExp
bmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOwotCi0gICAgaWYgKHN0
eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKSkKLSAgICAgICAgc3R5bGUt
PmZvbnQoKS51cGRhdGUoMCk7Ci19Ci0KLU5TQ29udHJvbFNpemUgUmVuZGVyVGhlbWVNYWNTaGFy
ZWQ6OmNvbnRyb2xTaXplRm9yU3lzdGVtRm9udChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17
Ci0gICAgaW50IGZvbnRTaXplID0gc3R5bGUtPmZvbnRTaXplKCk7Ci0gICAgaWYgKGZvbnRTaXpl
ID49IFtOU0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250cm9sU2l6ZTpOU1JlZ3VsYXJDb250cm9s
U2l6ZV0pCi0gICAgICAgIHJldHVybiBOU1JlZ3VsYXJDb250cm9sU2l6ZTsKLSAgICBpZiAoZm9u
dFNpemUgPj0gW05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXplOk5TU21hbGxDb250
cm9sU2l6ZV0pCi0gICAgICAgIHJldHVybiBOU1NtYWxsQ29udHJvbFNpemU7Ci0gICAgcmV0dXJu
IE5TTWluaUNvbnRyb2xTaXplOwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWlu
dFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByKQotewotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotCi0jaWYgX19NQUNfT1NfWF9WRVJTSU9OX01J
Tl9SRVFVSVJFRCA8PSAxMDcwCi0gICAgYm9vbCB1c2VOU1RleHRGaWVsZENlbGwgPSBvLT5zdHls
ZSgpLT5oYXNBcHBlYXJhbmNlKCkKLSAgICAgICAgJiYgby0+c3R5bGUoKS0+dmlzaXRlZERlcGVu
ZGVudENvbG9yKENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKSA9PSBDb2xvcjo6d2hpdGUKLSAg
ICAgICAgJiYgIW8tPnN0eWxlKCktPmhhc0JhY2tncm91bmRJbWFnZSgpOwotCi0gICAgLy8gV2Ug
ZG8gbm90IHVzZSBOU1RleHRGaWVsZENlbGwgdG8gZHJhdyBzdHlsZWQgdGV4dCBmaWVsZHMgb24g
TGlvbiBhbmQgU25vd0xlb3BhcmQgYmVjYXVzZQotICAgIC8vIHRoZXJlIGFyZSBhIG51bWJlciBv
ZiBidWdzIG9uIHRob3NlIHBsYXRmb3JtcyB0aGF0IHJlcXVpcmUgTlNUZXh0RmllbGRDZWxsIHRv
IGJlIGluIGNoYXJnZQotICAgIC8vIG9mIHBhaW50aW5nIGl0cyBvd24gYmFja2dyb3VuZC4gV2Ug
bmVlZCBXZWJDb3JlIHRvIHBhaW50IHN0eWxlZCBiYWNrZ3JvdW5kcywgc28gd2UnbGwgdXNlCi0g
ICAgLy8gdGhpcyBXZWJDb3JlU3lzdGVtSW50ZXJmYWNlIGZ1bmN0aW9uIGluc3RlYWQuCi0gICAg
aWYgKCF1c2VOU1RleHRGaWVsZENlbGwpIHsKLSAgICAgICAgd2tEcmF3QmV6ZWxlZFRleHRGaWVs
ZENlbGwociwgaXNFbmFibGVkKG8pICYmICFpc1JlYWRPbmx5Q29udHJvbChvKSk7Ci0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIE5TVGV4dEZpZWxkQ2VsbCAqdGV4
dEZpZWxkID0gdGhpcy0+dGV4dEZpZWxkKCk7Ci0KLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNh
dmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKLQotICAgIFt0ZXh0RmllbGQgc2V0
RW5hYmxlZDooaXNFbmFibGVkKG8pICYmICFpc1JlYWRPbmx5Q29udHJvbChvKSldOwotICAgIFt0
ZXh0RmllbGQgZHJhd1dpdGhGcmFtZTpOU1JlY3QocikgaW5WaWV3OmRvY3VtZW50Vmlld0Zvcihv
KV07Ci0KLSAgICBbdGV4dEZpZWxkIHNldENvbnRyb2xWaWV3Om5pbF07Ci0KLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFRleHRGaWVsZFN0
eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdAotewotfQot
Ci1ib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludENhcHNMb2NrSW5kaWNhdG9yKFJlbmRl
ck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQot
ewotICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLQotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENv
bnRleHQocGFpbnRJbmZvLmNvbnRleHQpOwotICAgIHdrRHJhd0NhcHNMb2NrSW5kaWNhdG9yKGxv
Y2FsQ29udGV4dC5jZ0NvbnRleHQoKSwgcik7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJv
b2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50VGV4dEFyZWEoUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBMb2Nh
bEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsK
LSAgICB3a0RyYXdCZXplbGVkVGV4dEFyZWEociwgaXNFbmFibGVkKG8pICYmICFpc1JlYWRPbmx5
Q29udHJvbChvKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFj
U2hhcmVkOjphZGp1c3RUZXh0QXJlYVN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSos
IEVsZW1lbnQqKSBjb25zdAotewotfQotCi1jb25zdCBpbnQqIFJlbmRlclRoZW1lTWFjU2hhcmVk
Ojpwb3B1cEJ1dHRvbk1hcmdpbnMoKSBjb25zdAotewotICAgIHN0YXRpYyBjb25zdCBpbnQgbWFy
Z2luc1szXVs0XSA9Ci0gICAgewotICAgICAgICB7IDAsIDMsIDEsIDMgfSwKLSAgICAgICAgeyAw
LCAzLCAyLCAzIH0sCi0gICAgICAgIHsgMCwgMSwgMCwgMSB9Ci0gICAgfTsKLSAgICByZXR1cm4g
bWFyZ2luc1tbcG9wdXBCdXR0b24oKSBjb250cm9sU2l6ZV1dOwotfQotCi1jb25zdCBJbnRTaXpl
KiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cG9wdXBCdXR0b25TaXplcygpIGNvbnN0Ci17Ci0gICAg
c3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMCwgMjEpLCBJbnRTaXpl
KDAsIDE4KSwgSW50U2l6ZSgwLCAxNSkgfTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19Ci0KLWNvbnN0
IGludCogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwQnV0dG9uUGFkZGluZyhOU0NvbnRyb2xT
aXplIHNpemUpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGNvbnN0IGludCBwYWRkaW5nWzNdWzRdID0K
LSAgICB7Ci0gICAgICAgIHsgMiwgMjYsIDMsIDggfSwKLSAgICAgICAgeyAyLCAyMywgMywgOCB9
LAotICAgICAgICB7IDIsIDIyLCAzLCAxMCB9Ci0gICAgfTsKLSAgICByZXR1cm4gcGFkZGluZ1tz
aXplXTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRNZW51TGlzdChSZW5k
ZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
KQotewotICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJ
bmZvLmNvbnRleHQpOwotICAgIHNldFBvcHVwQnV0dG9uQ2VsbFN0YXRlKG8sIHIpOwotCi0gICAg
TlNQb3BVcEJ1dHRvbkNlbGwqIHBvcHVwQnV0dG9uID0gdGhpcy0+cG9wdXBCdXR0b24oKTsKLQot
ICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKLSAgICBJ
bnRTaXplIHNpemUgPSBwb3B1cEJ1dHRvblNpemVzKClbW3BvcHVwQnV0dG9uIGNvbnRyb2xTaXpl
XV07Ci0gICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7Ci0gICAg
c2l6ZS5zZXRXaWR0aChyLndpZHRoKCkpOwotCi0gICAgLy8gTm93IGluZmxhdGUgaXQgdG8gYWNj
b3VudCBmb3IgdGhlIHNoYWRvdy4KLSAgICBJbnRSZWN0IGluZmxhdGVkUmVjdCA9IHI7Ci0gICAg
aWYgKHIud2lkdGgoKSA+PSBtaW5pbXVtTWVudUxpc3RTaXplKG8tPnN0eWxlKCkpKQotICAgICAg
ICBpbmZsYXRlZFJlY3QgPSBpbmZsYXRlUmVjdChpbmZsYXRlZFJlY3QsIHNpemUsIHBvcHVwQnV0
dG9uTWFyZ2lucygpLCB6b29tTGV2ZWwpOwotCi0gICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZl
ciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0KLSAgICAvLyBPbiBMZW9wYXJkLCB0
aGUgY2VsbCB3aWxsIGRyYXcgb3V0c2lkZSBvZiB0aGUgZ2l2ZW4gcmVjdCwgc28gd2UgaGF2ZSB0
byBjbGlwIHRvIHRoZSByZWN0Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPmNsaXAoaW5mbGF0ZWRS
ZWN0KTsKLQotICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikgewotICAgICAgICBpbmZsYXRlZFJl
Y3Quc2V0V2lkdGgoaW5mbGF0ZWRSZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOwotICAgICAgICBp
bmZsYXRlZFJlY3Quc2V0SGVpZ2h0KGluZmxhdGVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7
Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoaW5mbGF0ZWRSZWN0LngoKSwg
aW5mbGF0ZWRSZWN0LnkoKSk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9h
dFNpemUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQt
PnRyYW5zbGF0ZSgtaW5mbGF0ZWRSZWN0LngoKSwgLWluZmxhdGVkUmVjdC55KCkpOwotICAgIH0K
LQotICAgIE5TVmlldyAqdmlldyA9IGRvY3VtZW50Vmlld0ZvcihvKTsKLSAgICBbcG9wdXBCdXR0
b24gZHJhd1dpdGhGcmFtZTppbmZsYXRlZFJlY3QgaW5WaWV3OnZpZXddOwotI2lmICFCVVRUT05f
Q0VMTF9EUkFXX1dJVEhfRlJBTUVfRFJBV1NfRk9DVVNfUklORwotICAgIGlmIChpc0ZvY3VzZWQo
bykgJiYgby0+c3R5bGUoKS0+b3V0bGluZVN0eWxlSXNBdXRvKCkpCi0gICAgICAgIFtwb3B1cEJ1
dHRvbiBfd2ViX2RyYXdGb2N1c1JpbmdXaXRoRnJhbWU6aW5mbGF0ZWRSZWN0IGluVmlldzp2aWV3
XTsKLSNlbmRpZgotICAgIFtwb3B1cEJ1dHRvbiBzZXRDb250cm9sVmlldzpuaWxdOwotCi0gICAg
cmV0dXJuIGZhbHNlOwotfQotCi0jaWYgRU5BQkxFKE1FVEVSX0VMRU1FTlQpCi0KLUludFNpemUg
UmVuZGVyVGhlbWVNYWNTaGFyZWQ6Om1ldGVyU2l6ZUZvckJvdW5kcyhjb25zdCBSZW5kZXJNZXRl
ciogcmVuZGVyTWV0ZXIsIGNvbnN0IEludFJlY3QmIGJvdW5kcykgY29uc3QKLXsKLSAgICBpZiAo
Tm9Db250cm9sUGFydCA9PSByZW5kZXJNZXRlci0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpKQotICAg
ICAgICByZXR1cm4gYm91bmRzLnNpemUoKTsKLQotICAgIE5TTGV2ZWxJbmRpY2F0b3JDZWxsKiBj
ZWxsID0gbGV2ZWxJbmRpY2F0b3JGb3IocmVuZGVyTWV0ZXIpOwotICAgIC8vIE1ha2VzIGVub3Vn
aCByb29tIGZvciBjZWxsJ3MgaW50cmluc2ljIHNpemUuCi0gICAgTlNTaXplIGNlbGxTaXplID0g
W2NlbGwgY2VsbFNpemVGb3JCb3VuZHM6SW50UmVjdChJbnRQb2ludCgpLCBib3VuZHMuc2l6ZSgp
KV07Ci0gICAgcmV0dXJuIEludFNpemUoYm91bmRzLndpZHRoKCkgPCBjZWxsU2l6ZS53aWR0aCA/
IGNlbGxTaXplLndpZHRoIDogYm91bmRzLndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgYm91
bmRzLmhlaWdodCgpIDwgY2VsbFNpemUuaGVpZ2h0ID8gY2VsbFNpemUuaGVpZ2h0IDogYm91bmRz
LmhlaWdodCgpKTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRNZXRlcihS
ZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNv
bnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKCFyZW5kZXJPYmplY3QtPmlzTWV0ZXIoKSkK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQg
bG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLQotICAgIE5TTGV2ZWxJbmRpY2F0b3JD
ZWxsKiBjZWxsID0gbGV2ZWxJbmRpY2F0b3JGb3IodG9SZW5kZXJNZXRlcihyZW5kZXJPYmplY3Qp
KTsKLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5j
b250ZXh0KTsKLQotICAgIFtjZWxsIGRyYXdXaXRoRnJhbWU6cmVjdCBpblZpZXc6ZG9jdW1lbnRW
aWV3Rm9yKHJlbmRlck9iamVjdCldOwotICAgIFtjZWxsIHNldENvbnRyb2xWaWV3Om5pbF07Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzdXBwb3J0
c01ldGVyKENvbnRyb2xQYXJ0IHBhcnQpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChwYXJ0KSB7Ci0g
ICAgY2FzZSBSZWxldmFuY3lMZXZlbEluZGljYXRvclBhcnQ6Ci0gICAgY2FzZSBEaXNjcmV0ZUNh
cGFjaXR5TGV2ZWxJbmRpY2F0b3JQYXJ0OgotICAgIGNhc2UgUmF0aW5nTGV2ZWxJbmRpY2F0b3JQ
YXJ0OgotICAgIGNhc2UgTWV0ZXJQYXJ0OgotICAgIGNhc2UgQ29udGludW91c0NhcGFjaXR5TGV2
ZWxJbmRpY2F0b3JQYXJ0OgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1OU0xldmVsSW5kaWNhdG9yU3R5bGUgUmVu
ZGVyVGhlbWVNYWNTaGFyZWQ6OmxldmVsSW5kaWNhdG9yU3R5bGVGb3IoQ29udHJvbFBhcnQgcGFy
dCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKHBhcnQpIHsKLSAgICBjYXNlIFJlbGV2YW5jeUxldmVs
SW5kaWNhdG9yUGFydDoKLSAgICAgICAgcmV0dXJuIE5TUmVsZXZhbmN5TGV2ZWxJbmRpY2F0b3JT
dHlsZTsKLSAgICBjYXNlIERpc2NyZXRlQ2FwYWNpdHlMZXZlbEluZGljYXRvclBhcnQ6Ci0gICAg
ICAgIHJldHVybiBOU0Rpc2NyZXRlQ2FwYWNpdHlMZXZlbEluZGljYXRvclN0eWxlOwotICAgIGNh
c2UgUmF0aW5nTGV2ZWxJbmRpY2F0b3JQYXJ0OgotICAgICAgICByZXR1cm4gTlNSYXRpbmdMZXZl
bEluZGljYXRvclN0eWxlOwotICAgIGNhc2UgTWV0ZXJQYXJ0OgotICAgIGNhc2UgQ29udGludW91
c0NhcGFjaXR5TGV2ZWxJbmRpY2F0b3JQYXJ0OgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVy
biBOU0NvbnRpbnVvdXNDYXBhY2l0eUxldmVsSW5kaWNhdG9yU3R5bGU7Ci0gICAgfQotCi19Ci0K
LU5TTGV2ZWxJbmRpY2F0b3JDZWxsKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6bGV2ZWxJbmRpY2F0
b3JGb3IoY29uc3QgUmVuZGVyTWV0ZXIqIHJlbmRlck1ldGVyKSBjb25zdAotewotICAgIFJlbmRl
clN0eWxlKiBzdHlsZSA9IHJlbmRlck1ldGVyLT5zdHlsZSgpOwotICAgIEFTU0VSVChzdHlsZS0+
YXBwZWFyYW5jZSgpICE9IE5vQ29udHJvbFBhcnQpOwotCi0gICAgaWYgKCFtX2xldmVsSW5kaWNh
dG9yKQotICAgICAgICBtX2xldmVsSW5kaWNhdG9yLmFkb3B0TlMoW1tOU0xldmVsSW5kaWNhdG9y
Q2VsbCBhbGxvY10gaW5pdFdpdGhMZXZlbEluZGljYXRvclN0eWxlOk5TQ29udGludW91c0NhcGFj
aXR5TGV2ZWxJbmRpY2F0b3JTdHlsZV0pOwotICAgIE5TTGV2ZWxJbmRpY2F0b3JDZWxsKiBjZWxs
ID0gbV9sZXZlbEluZGljYXRvci5nZXQoKTsKLQotICAgIEhUTUxNZXRlckVsZW1lbnQqIGVsZW1l
bnQgPSByZW5kZXJNZXRlci0+bWV0ZXJFbGVtZW50KCk7Ci0gICAgZG91YmxlIHZhbHVlID0gZWxl
bWVudC0+dmFsdWUoKTsKLQotICAgIC8vIEJlY2F1c2UgTlNMZXZlbEluZGljYXRvckNlbGwgZG9l
cyBub3Qgc3VwcG9ydCBvcHRpbXVtLWluLXRoZS1taWRkbGUgdHlwZSBjb2xvcmluZywKLSAgICAv
LyB3ZSBleHBsaWNpdGx5IGNvbnRyb2wgdGhlIGNvbG9yIGluc3RlYWQgZ2l2aW5nIGxvdyBhbmQg
aGlnaCB2YWx1ZSB0byBOU0xldmVsSW5kaWNhdG9yQ2VsbCBhcyBpcy4KLSAgICBzd2l0Y2ggKGVs
ZW1lbnQtPmdhdWdlUmVnaW9uKCkpIHsKLSAgICBjYXNlIEhUTUxNZXRlckVsZW1lbnQ6OkdhdWdl
UmVnaW9uT3B0aW11bToKLSAgICAgICAgLy8gTWFrZSBtZXRlciB0aGUgZ3JlZW4KLSAgICAgICAg
W2NlbGwgc2V0V2FybmluZ1ZhbHVlOnZhbHVlICsgMV07Ci0gICAgICAgIFtjZWxsIHNldENyaXRp
Y2FsVmFsdWU6dmFsdWUgKyAyXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIVE1MTWV0ZXJF
bGVtZW50OjpHYXVnZVJlZ2lvblN1Ym9wdGltYWw6Ci0gICAgICAgIC8vIE1ha2UgdGhlIG1ldGVy
IHllbGxvdwotICAgICAgICBbY2VsbCBzZXRXYXJuaW5nVmFsdWU6dmFsdWUgLSAxXTsKLSAgICAg
ICAgW2NlbGwgc2V0Q3JpdGljYWxWYWx1ZTp2YWx1ZSArIDFdOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIEhUTUxNZXRlckVsZW1lbnQ6OkdhdWdlUmVnaW9uRXZlbkxlc3NHb29kOgotICAgICAg
ICAvLyBNYWtlIHRoZSBtZXRlciByZWQKLSAgICAgICAgW2NlbGwgc2V0V2FybmluZ1ZhbHVlOnZh
bHVlIC0gMl07Ci0gICAgICAgIFtjZWxsIHNldENyaXRpY2FsVmFsdWU6dmFsdWUgLSAxXTsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgW2NlbGwgc2V0TGV2ZWxJbmRpY2F0b3JTdHlsZTps
ZXZlbEluZGljYXRvclN0eWxlRm9yKHN0eWxlLT5hcHBlYXJhbmNlKCkpXTsKLSAgICBbY2VsbCBz
ZXRCYXNlV3JpdGluZ0RpcmVjdGlvbjpzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8g
TlNXcml0aW5nRGlyZWN0aW9uTGVmdFRvUmlnaHQgOiBOU1dyaXRpbmdEaXJlY3Rpb25SaWdodFRv
TGVmdF07Ci0gICAgW2NlbGwgc2V0TWluVmFsdWU6ZWxlbWVudC0+bWluKCldOwotICAgIFtjZWxs
IHNldE1heFZhbHVlOmVsZW1lbnQtPm1heCgpXTsKLSAgICBSZXRhaW5QdHI8TlNOdW1iZXI+IHZh
bHVlT2JqZWN0ID0gW05TTnVtYmVyIG51bWJlcldpdGhEb3VibGU6dmFsdWVdOwotICAgIFtjZWxs
IHNldE9iamVjdFZhbHVlOnZhbHVlT2JqZWN0LmdldCgpXTsKLQotICAgIHJldHVybiBjZWxsOwot
fQotCi0jZW5kaWYKLQotI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQotY29uc3QgSW50U2l6
ZSogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnByb2dyZXNzQmFyU2l6ZXMoKSBjb25zdAotewotICAg
IHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDAsIDIwKSwgSW50U2l6
ZSgwLCAxMiksIEludFNpemUoMCwgMTIpIH07Ci0gICAgcmV0dXJuIHNpemVzOwotfQotCi1jb25z
dCBpbnQqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwcm9ncmVzc0Jhck1hcmdpbnMoTlNDb250cm9s
U2l6ZSBjb250cm9sU2l6ZSkgY29uc3QKLXsKLSAgICBzdGF0aWMgY29uc3QgaW50IG1hcmdpbnNb
M11bNF0gPQotICAgIHsKLSAgICAgICAgeyAwLCAwLCAxLCAwIH0sCi0gICAgICAgIHsgMCwgMCwg
MSwgMCB9LAotICAgICAgICB7IDAsIDAsIDEsIDAgfSwKLSAgICB9OwotICAgIHJldHVybiBtYXJn
aW5zW2NvbnRyb2xTaXplXTsKLX0KLQotaW50IFJlbmRlclRoZW1lTWFjU2hhcmVkOjptaW5pbXVt
UHJvZ3Jlc3NCYXJIZWlnaHQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIHJldHVy
biBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgcHJvZ3Jlc3NCYXJTaXplcygpKS5oZWlnaHQoKTsK
LX0KLQotZG91YmxlIFJlbmRlclRoZW1lTWFjU2hhcmVkOjphbmltYXRpb25SZXBlYXRJbnRlcnZh
bEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKLXsKLSAgICByZXR1cm4gcHJv
Z3Jlc3NBbmltYXRpb25GcmFtZVJhdGU7Ci19Ci0KLWRvdWJsZSBSZW5kZXJUaGVtZU1hY1NoYXJl
ZDo6YW5pbWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIHByb2dyZXNzQW5pbWF0aW9uTnVtRnJhbWVzICogcHJvZ3Jlc3NBbmlt
YXRpb25GcmFtZVJhdGU7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFBy
b2dyZXNzQmFyU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNv
bnN0Ci17Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50UHJvZ3Jlc3NCYXIo
UmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGlmICghcmVuZGVyT2JqZWN0LT5pc1Byb2dyZXNz
KCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgZmxvYXQgem9vbUxldmVsID0gcmVuZGVy
T2JqZWN0LT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgaW50IGNvbnRyb2xTaXplID0g
Y29udHJvbFNpemVGb3JGb250KHJlbmRlck9iamVjdC0+c3R5bGUoKSk7Ci0gICAgSW50U2l6ZSBz
aXplID0gcHJvZ3Jlc3NCYXJTaXplcygpW2NvbnRyb2xTaXplXTsKLSAgICBzaXplLnNldEhlaWdo
dChzaXplLmhlaWdodCgpICogem9vbUxldmVsKTsKLSAgICBzaXplLnNldFdpZHRoKHJlY3Qud2lk
dGgoKSk7Ci0KLSAgICAvLyBOb3cgaW5mbGF0ZSBpdCB0byBhY2NvdW50IGZvciB0aGUgc2hhZG93
LgotICAgIEludFJlY3QgaW5mbGF0ZWRSZWN0ID0gcmVjdDsKLSAgICBpZiAocmVjdC5oZWlnaHQo
KSA8PSBtaW5pbXVtUHJvZ3Jlc3NCYXJIZWlnaHQocmVuZGVyT2JqZWN0LT5zdHlsZSgpKSkKLSAg
ICAgICAgaW5mbGF0ZWRSZWN0ID0gaW5mbGF0ZVJlY3QoaW5mbGF0ZWRSZWN0LCBzaXplLCBwcm9n
cmVzc0Jhck1hcmdpbnMoY29udHJvbFNpemUpLCB6b29tTGV2ZWwpOwotCi0gICAgUmVuZGVyUHJv
Z3Jlc3MqIHJlbmRlclByb2dyZXNzID0gdG9SZW5kZXJQcm9ncmVzcyhyZW5kZXJPYmplY3QpOwot
ICAgIEhJVGhlbWVUcmFja0RyYXdJbmZvIHRyYWNrSW5mbzsKLSAgICB0cmFja0luZm8udmVyc2lv
biA9IDA7Ci0gICAgaWYgKGNvbnRyb2xTaXplID09IE5TUmVndWxhckNvbnRyb2xTaXplKQotICAg
ICAgICB0cmFja0luZm8ua2luZCA9IHJlbmRlclByb2dyZXNzLT5wb3NpdGlvbigpIDwgMCA/IGtU
aGVtZUxhcmdlSW5kZXRlcm1pbmF0ZUJhciA6IGtUaGVtZUxhcmdlUHJvZ3Jlc3NCYXI7Ci0gICAg
ZWxzZQotICAgICAgICB0cmFja0luZm8ua2luZCA9IHJlbmRlclByb2dyZXNzLT5wb3NpdGlvbigp
IDwgMCA/IGtUaGVtZU1lZGl1bUluZGV0ZXJtaW5hdGVCYXIgOiBrVGhlbWVNZWRpdW1Qcm9ncmVz
c0JhcjsKLQotICAgIHRyYWNrSW5mby5ib3VuZHMgPSBJbnRSZWN0KEludFBvaW50KCksIGluZmxh
dGVkUmVjdC5zaXplKCkpOwotICAgIHRyYWNrSW5mby5taW4gPSAwOwotICAgIHRyYWNrSW5mby5t
YXggPSBudW1lcmljX2xpbWl0czxTSW50MzI+OjptYXgoKTsKLSAgICB0cmFja0luZm8udmFsdWUg
PSBscm91bmQocmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkgKiBuZXh0YWZ0ZXIodHJhY2tJbmZv
Lm1heCwgMCkpOwotICAgIHRyYWNrSW5mby50cmFja0luZm8ucHJvZ3Jlc3MucGhhc2UgPSBscm91
bmQocmVuZGVyUHJvZ3Jlc3MtPmFuaW1hdGlvblByb2dyZXNzKCkgKiBuZXh0YWZ0ZXIocHJvZ3Jl
c3NBbmltYXRpb25OdW1GcmFtZXMsIDApKTsKLSAgICB0cmFja0luZm8uYXR0cmlidXRlcyA9IGtU
aGVtZVRyYWNrSG9yaXpvbnRhbDsKLSAgICB0cmFja0luZm8uZW5hYmxlU3RhdGUgPSBpc0FjdGl2
ZShyZW5kZXJPYmplY3QpID8ga1RoZW1lVHJhY2tBY3RpdmUgOiBrVGhlbWVUcmFja0luYWN0aXZl
OwotICAgIHRyYWNrSW5mby5yZXNlcnZlZCA9IDA7Ci0gICAgdHJhY2tJbmZvLmZpbGxlcjEgPSAw
OwotCi0gICAgT3duUHRyPEltYWdlQnVmZmVyPiBpbWFnZUJ1ZmZlciA9IEltYWdlQnVmZmVyOjpj
cmVhdGUoaW5mbGF0ZWRSZWN0LnNpemUoKSwgMSk7Ci0gICAgaWYgKCFpbWFnZUJ1ZmZlcikKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBDb250ZXh0Q29udGFpbmVyIGNnQ29udGV4dENvbnRh
aW5lcihpbWFnZUJ1ZmZlci0+Y29udGV4dCgpKTsKLSAgICBDR0NvbnRleHRSZWYgY2dDb250ZXh0
ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKLSAgICBISVRoZW1lRHJhd1RyYWNrKCZ0
cmFja0luZm8sIDAsIGNnQ29udGV4dCwga0hJVGhlbWVPcmllbnRhdGlvbk5vcm1hbCk7Ci0KLSAg
ICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0
KTsKLQotICAgIGlmICghcmVuZGVyUHJvZ3Jlc3MtPnN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSkgewotICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKDIgKiBpbmZs
YXRlZFJlY3QueCgpICsgaW5mbGF0ZWRSZWN0LndpZHRoKCksIDApOwotICAgICAgICBwYWludElu
Zm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKC0xLCAxKSk7Ci0gICAgfQotCi0gICAgcGFpbnRJ
bmZvLmNvbnRleHQtPmRyYXdJbWFnZUJ1ZmZlcihpbWFnZUJ1ZmZlci5nZXQoKSwgQ29sb3JTcGFj
ZURldmljZVJHQiwgaW5mbGF0ZWRSZWN0LmxvY2F0aW9uKCkpOwotICAgIHJldHVybiBmYWxzZTsK
LX0KLSNlbmRpZgotCi1jb25zdCBmbG9hdCBiYXNlRm9udFNpemUgPSAxMS4wZjsKLWNvbnN0IGZs
b2F0IGJhc2VBcnJvd0hlaWdodCA9IDQuMGY7Ci1jb25zdCBmbG9hdCBiYXNlQXJyb3dXaWR0aCA9
IDUuMGY7Ci1jb25zdCBmbG9hdCBiYXNlU3BhY2VCZXR3ZWVuQXJyb3dzID0gMi4wZjsKLWNvbnN0
IGludCBhcnJvd1BhZGRpbmdMZWZ0ID0gNjsKLWNvbnN0IGludCBhcnJvd1BhZGRpbmdSaWdodCA9
IDY7Ci1jb25zdCBpbnQgcGFkZGluZ0JlZm9yZVNlcGFyYXRvciA9IDQ7Ci1jb25zdCBpbnQgYmFz
ZUJvcmRlclJhZGl1cyA9IDU7Ci1jb25zdCBpbnQgc3R5bGVkUG9wdXBQYWRkaW5nTGVmdCA9IDg7
Ci1jb25zdCBpbnQgc3R5bGVkUG9wdXBQYWRkaW5nVG9wID0gMTsKLWNvbnN0IGludCBzdHlsZWRQ
b3B1cFBhZGRpbmdCb3R0b20gPSAyOwotCi1zdGF0aWMgdm9pZCBUb3BHcmFkaWVudEludGVycG9s
YXRlKHZvaWQqLCBjb25zdCBDR0Zsb2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERhdGEpCi17Ci0g
ICAgc3RhdGljIGZsb2F0IGRhcmtbNF0gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDAuNGYgfTsKLSAg
ICBzdGF0aWMgZmxvYXQgbGlnaHRbNF0gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDAuMTVmIH07Ci0g
ICAgZmxvYXQgYSA9IGluRGF0YVswXTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsg
aSA8IDQ7IGkrKykKLSAgICAgICAgb3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJrW2ldICsg
YSAqIGxpZ2h0W2ldOwotfQotCi1zdGF0aWMgdm9pZCBCb3R0b21HcmFkaWVudEludGVycG9sYXRl
KHZvaWQqLCBjb25zdCBDR0Zsb2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERhdGEpCi17Ci0gICAg
c3RhdGljIGZsb2F0IGRhcmtbNF0gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDAuMGYgfTsKLSAgICBz
dGF0aWMgZmxvYXQgbGlnaHRbNF0gPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDAuM2YgfTsKLSAgICBm
bG9hdCBhID0gaW5EYXRhWzBdOwotICAgIGludCBpID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwg
NDsgaSsrKQotICAgICAgICBvdXREYXRhW2ldID0gKDEuMGYgLSBhKSAqIGRhcmtbaV0gKyBhICog
bGlnaHRbaV07Ci19Ci0KLXN0YXRpYyB2b2lkIE1haW5HcmFkaWVudEludGVycG9sYXRlKHZvaWQq
LCBjb25zdCBDR0Zsb2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERhdGEpCi17Ci0gICAgc3RhdGlj
IGZsb2F0IGRhcmtbNF0gPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuMTVmIH07Ci0gICAgc3RhdGlj
IGZsb2F0IGxpZ2h0WzRdID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmIH07Ci0gICAgZmxvYXQg
YSA9IGluRGF0YVswXTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkr
KykKLSAgICAgICAgb3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJrW2ldICsgYSAqIGxpZ2h0
W2ldOwotfQotCi1zdGF0aWMgdm9pZCBUcmFja0dyYWRpZW50SW50ZXJwb2xhdGUodm9pZCosIGNv
bnN0IENHRmxvYXQqIGluRGF0YSwgQ0dGbG9hdCogb3V0RGF0YSkKLXsKLSAgICBzdGF0aWMgZmxv
YXQgZGFya1s0XSA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMC42NzhmIH07Ci0gICAgc3RhdGljIGZs
b2F0IGxpZ2h0WzRdID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjEzZiB9OwotICAgIGZsb2F0IGEg
PSBpbkRhdGFbMF07Ci0gICAgaW50IGkgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKysp
Ci0gICAgICAgIG91dERhdGFbaV0gPSAoMS4wZiAtIGEpICogZGFya1tpXSArIGEgKiBsaWdodFtp
XTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRNZW51TGlzdEJ1dHRvbkdy
YWRpZW50cyhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25z
dCBJbnRSZWN0JiByKQotewotICAgIGlmIChyLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgQ29udGV4dENvbnRhaW5lciBjZ0NvbnRleHRDb250YWluZXIocGFpbnRJbmZvLmNvbnRl
eHQpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gY2dDb250ZXh0Q29udGFpbmVyLmNvbnRl
eHQoKTsKLQotICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2ZXIgc3RhdGVTYXZlcigqcGFpbnRJ
bmZvLmNvbnRleHQpOwotCi0gICAgUm91bmRlZFJlY3QgYm9yZGVyID0gby0+c3R5bGUoKS0+Z2V0
Um91bmRlZEJvcmRlckZvcihyLCBvLT52aWV3KCkpOwotICAgIGludCByYWRpdXMgPSBib3JkZXIu
cmFkaWkoKS50b3BMZWZ0KCkud2lkdGgoKTsKLQotICAgIENHQ29sb3JTcGFjZVJlZiBjc3BhY2Ug
PSBkZXZpY2VSR0JDb2xvclNwYWNlUmVmKCk7Ci0KLSAgICBGbG9hdFJlY3QgdG9wR3JhZGllbnQo
ci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkgLyAyLjBmKTsKLSAgICBzdHJ1Y3Qg
Q0dGdW5jdGlvbkNhbGxiYWNrcyB0b3BDYWxsYmFja3MgPSB7IDAsIFRvcEdyYWRpZW50SW50ZXJw
b2xhdGUsIE5VTEwgfTsKLSAgICBSZXRhaW5QdHI8Q0dGdW5jdGlvblJlZj4gdG9wRnVuY3Rpb24o
QWRvcHRDRiwgQ0dGdW5jdGlvbkNyZWF0ZShOVUxMLCAxLCBOVUxMLCA0LCBOVUxMLCAmdG9wQ2Fs
bGJhY2tzKSk7Ci0gICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gdG9wU2hhZGluZyhBZG9wdENG
LCBDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENHUG9pbnRNYWtlKHRvcEdyYWRpZW50Lngo
KSwgdG9wR3JhZGllbnQueSgpKSwgQ0dQb2ludE1ha2UodG9wR3JhZGllbnQueCgpLCB0b3BHcmFk
aWVudC5tYXhZKCkpLCB0b3BGdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICBG
bG9hdFJlY3QgYm90dG9tR3JhZGllbnQoci54KCkgKyByYWRpdXMsIHIueSgpICsgci5oZWlnaHQo
KSAvIDIuMGYsIHIud2lkdGgoKSAtIDIuMGYgKiByYWRpdXMsIHIuaGVpZ2h0KCkgLyAyLjBmKTsK
LSAgICBzdHJ1Y3QgQ0dGdW5jdGlvbkNhbGxiYWNrcyBib3R0b21DYWxsYmFja3MgPSB7IDAsIEJv
dHRvbUdyYWRpZW50SW50ZXJwb2xhdGUsIE5VTEwgfTsKLSAgICBSZXRhaW5QdHI8Q0dGdW5jdGlv
blJlZj4gYm90dG9tRnVuY3Rpb24oQWRvcHRDRiwgQ0dGdW5jdGlvbkNyZWF0ZShOVUxMLCAxLCBO
VUxMLCA0LCBOVUxMLCAmYm90dG9tQ2FsbGJhY2tzKSk7Ci0gICAgUmV0YWluUHRyPENHU2hhZGlu
Z1JlZj4gYm90dG9tU2hhZGluZyhBZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2Us
IENHUG9pbnRNYWtlKGJvdHRvbUdyYWRpZW50LngoKSwgIGJvdHRvbUdyYWRpZW50LnkoKSksIENH
UG9pbnRNYWtlKGJvdHRvbUdyYWRpZW50LngoKSwgYm90dG9tR3JhZGllbnQubWF4WSgpKSwgYm90
dG9tRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgc3RydWN0IENHRnVuY3Rp
b25DYWxsYmFja3MgbWFpbkNhbGxiYWNrcyA9IHsgMCwgTWFpbkdyYWRpZW50SW50ZXJwb2xhdGUs
IE5VTEwgfTsKLSAgICBSZXRhaW5QdHI8Q0dGdW5jdGlvblJlZj4gbWFpbkZ1bmN0aW9uKEFkb3B0
Q0YsIENHRnVuY3Rpb25DcmVhdGUoTlVMTCwgMSwgTlVMTCwgNCwgTlVMTCwgJm1haW5DYWxsYmFj
a3MpKTsKLSAgICBSZXRhaW5QdHI8Q0dTaGFkaW5nUmVmPiBtYWluU2hhZGluZyhBZG9wdENGLCBD
R1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENHUG9pbnRNYWtlKHIueCgpLCAgci55KCkpLCBD
R1BvaW50TWFrZShyLngoKSwgci5tYXhZKCkpLCBtYWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBm
YWxzZSkpOwotCi0gICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gbGVmdFNoYWRpbmcoQWRvcHRD
RiwgQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLCBDR1BvaW50TWFrZShyLngoKSwgIHIueSgp
KSwgQ0dQb2ludE1ha2Uoci54KCkgKyByYWRpdXMsIHIueSgpKSwgbWFpbkZ1bmN0aW9uLmdldCgp
LCBmYWxzZSwgZmFsc2UpKTsKLQotICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IHJpZ2h0U2hh
ZGluZyhBZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UsIENHUG9pbnRNYWtlKHIu
bWF4WCgpLCAgci55KCkpLCBDR1BvaW50TWFrZShyLm1heFgoKSAtIHJhZGl1cywgci55KCkpLCBt
YWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgewotICAgICAgICBHcmFw
aGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKLSAg
ICAgICAgQ0dDb250ZXh0Q2xpcFRvUmVjdChjb250ZXh0LCByKTsKLSAgICAgICAgcGFpbnRJbmZv
LmNvbnRleHQtPmNsaXBSb3VuZGVkUmVjdChib3JkZXIpOwotICAgICAgICBjb250ZXh0ID0gY2dD
b250ZXh0Q29udGFpbmVyLmNvbnRleHQoKTsKLSAgICAgICAgQ0dDb250ZXh0RHJhd1NoYWRpbmco
Y29udGV4dCwgbWFpblNoYWRpbmcuZ2V0KCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgR3Jh
cGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0g
ICAgICAgIENHQ29udGV4dENsaXBUb1JlY3QoY29udGV4dCwgdG9wR3JhZGllbnQpOwotICAgICAg
ICBwYWludEluZm8uY29udGV4dC0+Y2xpcFJvdW5kZWRSZWN0KFJvdW5kZWRSZWN0KGVuY2xvc2lu
Z0ludFJlY3QodG9wR3JhZGllbnQpLCBib3JkZXIucmFkaWkoKS50b3BMZWZ0KCksIGJvcmRlci5y
YWRpaSgpLnRvcFJpZ2h0KCksIEludFNpemUoKSwgSW50U2l6ZSgpKSk7Ci0gICAgICAgIGNvbnRl
eHQgPSBjZ0NvbnRleHRDb250YWluZXIuY29udGV4dCgpOwotICAgICAgICBDR0NvbnRleHREcmF3
U2hhZGluZyhjb250ZXh0LCB0b3BTaGFkaW5nLmdldCgpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWJv
dHRvbUdyYWRpZW50LmlzRW1wdHkoKSkgewotICAgICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNh
dmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5mby5jb250ZXh0KTsKLSAgICAgICAgQ0dDb250ZXh0Q2xp
cFRvUmVjdChjb250ZXh0LCBib3R0b21HcmFkaWVudCk7Ci0gICAgICAgIHBhaW50SW5mby5jb250
ZXh0LT5jbGlwUm91bmRlZFJlY3QoUm91bmRlZFJlY3QoZW5jbG9zaW5nSW50UmVjdChib3R0b21H
cmFkaWVudCksIEludFNpemUoKSwgSW50U2l6ZSgpLCBib3JkZXIucmFkaWkoKS5ib3R0b21MZWZ0
KCksIGJvcmRlci5yYWRpaSgpLmJvdHRvbVJpZ2h0KCkpKTsKLSAgICAgICAgY29udGV4dCA9IGNn
Q29udGV4dENvbnRhaW5lci5jb250ZXh0KCk7Ci0gICAgICAgIENHQ29udGV4dERyYXdTaGFkaW5n
KGNvbnRleHQsIGJvdHRvbVNoYWRpbmcuZ2V0KCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAg
R3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7
Ci0gICAgICAgIENHQ29udGV4dENsaXBUb1JlY3QoY29udGV4dCwgcik7Ci0gICAgICAgIHBhaW50
SW5mby5jb250ZXh0LT5jbGlwUm91bmRlZFJlY3QoYm9yZGVyKTsKLSAgICAgICAgY29udGV4dCA9
IGNnQ29udGV4dENvbnRhaW5lci5jb250ZXh0KCk7Ci0gICAgICAgIENHQ29udGV4dERyYXdTaGFk
aW5nKGNvbnRleHQsIGxlZnRTaGFkaW5nLmdldCgpKTsKLSAgICAgICAgQ0dDb250ZXh0RHJhd1No
YWRpbmcoY29udGV4dCwgcmlnaHRTaGFkaW5nLmdldCgpKTsKLSAgICB9Ci19Ci0KLWJvb2wgUmVu
ZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBJbnRS
ZWN0IGJvdW5kcyA9IEludFJlY3Qoci54KCkgKyBvLT5zdHlsZSgpLT5ib3JkZXJMZWZ0V2lkdGgo
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci55KCkgKyBvLT5zdHlsZSgpLT5ib3Jk
ZXJUb3BXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLndpZHRoKCkgLSBv
LT5zdHlsZSgpLT5ib3JkZXJMZWZ0V2lkdGgoKSAtIG8tPnN0eWxlKCktPmJvcmRlclJpZ2h0V2lk
dGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oZWlnaHQoKSAtIG8tPnN0eWxl
KCktPmJvcmRlclRvcFdpZHRoKCkgLSBvLT5zdHlsZSgpLT5ib3JkZXJCb3R0b21XaWR0aCgpKTsK
LSAgICAvLyBEcmF3IHRoZSBncmFkaWVudHMgdG8gZ2l2ZSB0aGUgc3R5bGVkIHBvcHVwIG1lbnUg
YSBidXR0b24gYXBwZWFyYW5jZQotICAgIHBhaW50TWVudUxpc3RCdXR0b25HcmFkaWVudHMobywg
cGFpbnRJbmZvLCBib3VuZHMpOwotCi0gICAgLy8gU2luY2Ugd2UgYWN0dWFsbHkga25vdyB0aGUg
c2l6ZSBvZiB0aGUgY29udHJvbCBoZXJlLCB3ZSByZXN0cmljdCB0aGUgZm9udCBzY2FsZSB0byBt
YWtlIHN1cmUgdGhlIGFycm93cyB3aWxsIGZpdCB2ZXJ0aWNhbGx5IGluIHRoZSBib3VuZHMKLSAg
ICBmbG9hdCBmb250U2NhbGUgPSBtaW4oby0+c3R5bGUoKS0+Zm9udFNpemUoKSAvIGJhc2VGb250
U2l6ZSwgYm91bmRzLmhlaWdodCgpIC8gKGJhc2VBcnJvd0hlaWdodCAqIDIgKyBiYXNlU3BhY2VC
ZXR3ZWVuQXJyb3dzKSk7Ci0gICAgZmxvYXQgY2VudGVyWSA9IGJvdW5kcy55KCkgKyBib3VuZHMu
aGVpZ2h0KCkgLyAyLjBmOwotICAgIGZsb2F0IGFycm93SGVpZ2h0ID0gYmFzZUFycm93SGVpZ2h0
ICogZm9udFNjYWxlOwotICAgIGZsb2F0IGFycm93V2lkdGggPSBiYXNlQXJyb3dXaWR0aCAqIGZv
bnRTY2FsZTsKLSAgICBmbG9hdCBsZWZ0RWRnZSA9IGJvdW5kcy5tYXhYKCkgLSBhcnJvd1BhZGRp
bmdSaWdodCAqIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSAtIGFycm93V2lkdGg7Ci0gICAg
ZmxvYXQgc3BhY2VCZXR3ZWVuQXJyb3dzID0gYmFzZVNwYWNlQmV0d2VlbkFycm93cyAqIGZvbnRT
Y2FsZTsKLQotICAgIGlmIChib3VuZHMud2lkdGgoKSA8IGFycm93V2lkdGggKyBhcnJvd1BhZGRp
bmdMZWZ0ICogby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKnBhaW50SW5m
by5jb250ZXh0KTsKLQotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRGaWxsQ29sb3Ioby0+c3R5
bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5Q29sb3IpLCBvLT5zdHlsZSgp
LT5jb2xvclNwYWNlKCkpOwotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VTdHlsZShO
b1N0cm9rZSk7Ci0KLSAgICBGbG9hdFBvaW50IGFycm93MVszXTsKLSAgICBhcnJvdzFbMF0gPSBG
bG9hdFBvaW50KGxlZnRFZGdlLCBjZW50ZXJZIC0gc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZik7
Ci0gICAgYXJyb3cxWzFdID0gRmxvYXRQb2ludChsZWZ0RWRnZSArIGFycm93V2lkdGgsIGNlbnRl
clkgLSBzcGFjZUJldHdlZW5BcnJvd3MgLyAyLjBmKTsKLSAgICBhcnJvdzFbMl0gPSBGbG9hdFBv
aW50KGxlZnRFZGdlICsgYXJyb3dXaWR0aCAvIDIuMGYsIGNlbnRlclkgLSBzcGFjZUJldHdlZW5B
cnJvd3MgLyAyLjBmIC0gYXJyb3dIZWlnaHQpOwotCi0gICAgLy8gRHJhdyB0aGUgdG9wIGFycm93
Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdDb252ZXhQb2x5Z29uKDMsIGFycm93MSwgdHJ1
ZSk7Ci0KLSAgICBGbG9hdFBvaW50IGFycm93MlszXTsKLSAgICBhcnJvdzJbMF0gPSBGbG9hdFBv
aW50KGxlZnRFZGdlLCBjZW50ZXJZICsgc3BhY2VCZXR3ZWVuQXJyb3dzIC8gMi4wZik7Ci0gICAg
YXJyb3cyWzFdID0gRmxvYXRQb2ludChsZWZ0RWRnZSArIGFycm93V2lkdGgsIGNlbnRlclkgKyBz
cGFjZUJldHdlZW5BcnJvd3MgLyAyLjBmKTsKLSAgICBhcnJvdzJbMl0gPSBGbG9hdFBvaW50KGxl
ZnRFZGdlICsgYXJyb3dXaWR0aCAvIDIuMGYsIGNlbnRlclkgKyBzcGFjZUJldHdlZW5BcnJvd3Mg
LyAyLjBmICsgYXJyb3dIZWlnaHQpOwotCi0gICAgLy8gRHJhdyB0aGUgYm90dG9tIGFycm93Ci0g
ICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdDb252ZXhQb2x5Z29uKDMsIGFycm93MiwgdHJ1ZSk7
Ci0KLSAgICBDb2xvciBsZWZ0U2VwYXJhdG9yQ29sb3IoMCwgMCwgMCwgNDApOwotICAgIENvbG9y
IHJpZ2h0U2VwYXJhdG9yQ29sb3IoMjU1LCAyNTUsIDI1NSwgNDApOwotCi0gICAgLy8gRklYTUU6
IFNob3VsZCB0aGUgc2VwYXJhdG9yIHRoaWNrbmVzcyBhbmQgc3BhY2UgYmUgc2NhbGVkIHVwIGJ5
IGZvbnRTY2FsZT8KLSAgICBpbnQgc2VwYXJhdG9yU3BhY2UgPSAyOyAvLyBEZWxpYmVyYXRlbHkg
aWdub3JlcyB6b29tIHNpbmNlIGl0IGxvb2tzIG5pY2VyIGlmIGl0IHN0YXlzIHRoaW4uCi0gICAg
aW50IGxlZnRFZGdlT2ZTZXBhcmF0b3IgPSBzdGF0aWNfY2FzdDxpbnQ+KGxlZnRFZGdlIC0gYXJy
b3dQYWRkaW5nTGVmdCAqIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7IC8vIEZJWE1FOiBS
b3VuZD8KLQotICAgIC8vIERyYXcgdGhlIHNlcGFyYXRvciB0byB0aGUgbGVmdCBvZiB0aGUgYXJy
b3dzCi0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVRoaWNrbmVzcygxLjBmKTsgLy8g
RGVsaWJlcmF0ZWx5IGlnbm9yZXMgem9vbSBzaW5jZSBpdCBsb29rcyBuaWNlciBpZiBpdCBzdGF5
cyB0aGluLgotICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRTdHJva2VTdHlsZShTb2xpZFN0cm9r
ZSk7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKGxlZnRTZXBhcmF0b3JD
b2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgcGFpbnRJbmZvLmNvbnRleHQtPmRyYXdM
aW5lKEludFBvaW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IsIGJvdW5kcy55KCkpLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBJbnRQb2ludChsZWZ0RWRnZU9mU2VwYXJhdG9yLCBib3Vu
ZHMubWF4WSgpKSk7Ci0KLSAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3Iocmln
aHRTZXBhcmF0b3JDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgcGFpbnRJbmZvLmNv
bnRleHQtPmRyYXdMaW5lKEludFBvaW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IgKyBzZXBhcmF0b3JT
cGFjZSwgYm91bmRzLnkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFBv
aW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IgKyBzZXBhcmF0b3JTcGFjZSwgYm91bmRzLm1heFkoKSkp
OwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IEludFNpemUqIG1lbnVMaXN0
QnV0dG9uU2l6ZXMoKQotewotICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJ
bnRTaXplKDAsIDIxKSwgSW50U2l6ZSgwLCAxOCksIEludFNpemUoMCwgMTUpIH07Ci0gICAgcmV0
dXJuIHNpemVzOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RNZW51TGlz
dFN0eWxlKFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIsIFJlbmRlclN0eWxlKiBzdHlsZSwg
RWxlbWVudCogZSkgY29uc3QKLXsKLSAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplID0gY29u
dHJvbFNpemVGb3JGb250KHN0eWxlKTsKLQotICAgIHN0eWxlLT5yZXNldEJvcmRlcigpOwotICAg
IHN0eWxlLT5yZXNldFBhZGRpbmcoKTsKLQotICAgIC8vIEhlaWdodCBpcyBsb2NrZWQgdG8gYXV0
by4KLSAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChBdXRvKSk7Ci0KLSAgICAvLyBXaGl0ZS1z
cGFjZSBpcyBsb2NrZWQgdG8gcHJlCi0gICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoUFJFKTsKLQot
ICAgIC8vIFNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciB0byBibGFjayBvciBncmF5IHdoZW4gd2Ug
aGF2ZSB0aGUgYXF1YSBsb29rLgotICAgIC8vIENhc3QgdG8gUkdCMzIgaXMgdG8gd29yayBhcm91
bmQgYSBjb21waWxlciBidWcuCi0gICAgc3R5bGUtPnNldENvbG9yKGUgJiYgIWUtPmlzRGlzYWJs
ZWRGb3JtQ29udHJvbCgpID8gc3RhdGljX2Nhc3Q8UkdCQTMyPihDb2xvcjo6YmxhY2spIDogQ29s
b3I6OmRhcmtHcmF5KTsKLQotICAgIC8vIFNldCB0aGUgYnV0dG9uJ3MgdmVydGljYWwgc2l6ZS4K
LSAgICBzZXRTaXplRnJvbUZvbnQoc3R5bGUsIG1lbnVMaXN0QnV0dG9uU2l6ZXMoKSk7Ci0KLSAg
ICAvLyBPdXIgZm9udCBpcyBsb2NrZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHN5c3RlbSBmb250IHNp
emUgZm9yIHRoZSBjb250cm9sLiAgVG8gY2xhcmlmeSwgd2UgZmlyc3QgdXNlIHRoZSBDU1Mtc3Bl
Y2lmaWVkIGZvbnQgdG8gZmlndXJlIG91dAotICAgIC8vIGEgcmVhc29uYWJsZSBjb250cm9sIHNp
emUsIGJ1dCBvbmNlIHRoYXQgY29udHJvbCBzaXplIGlzIGRldGVybWluZWQsIHdlIHRocm93IHRo
YXQgZm9udCBhd2F5IGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlCi0gICAgLy8gc3lzdGVtIGZvbnQg
Zm9yIHRoZSBjb250cm9sIHNpemUgaW5zdGVhZC4KLSAgICBzZXRGb250RnJvbUNvbnRyb2xTaXpl
KHN0eWxlUmVzb2x2ZXIsIHN0eWxlLCBjb250cm9sU2l6ZSk7Ci0KLSAgICBzdHlsZS0+c2V0Qm94
U2hhZG93KG51bGxwdHIpOwotfQotCi1pbnQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwSW50
ZXJuYWxQYWRkaW5nTGVmdChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaWYgKHN0
eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KQotICAgICAgICByZXR1cm4gcG9wdXBC
dXR0b25QYWRkaW5nKGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSkpW2xlZnRQYWRkaW5nXSAqIHN0
eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVu
dWxpc3RCdXR0b25QYXJ0KQotICAgICAgICByZXR1cm4gc3R5bGVkUG9wdXBQYWRkaW5nTGVmdCAq
IHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBSZW5kZXJU
aGVtZU1hY1NoYXJlZDo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSogc3R5
bGUpIGNvbnN0Ci17Ci0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0
KQotICAgICAgICByZXR1cm4gcG9wdXBCdXR0b25QYWRkaW5nKGNvbnRyb2xTaXplRm9yRm9udChz
dHlsZSkpW3JpZ2h0UGFkZGluZ10gKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotICAgIGlmIChz
dHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0QnV0dG9uUGFydCkgewotICAgICAgICBmbG9h
dCBmb250U2NhbGUgPSBzdHlsZS0+Zm9udFNpemUoKSAvIGJhc2VGb250U2l6ZTsKLSAgICAgICAg
ZmxvYXQgYXJyb3dXaWR0aCA9IGJhc2VBcnJvd1dpZHRoICogZm9udFNjYWxlOwotICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihhcnJvd1dpZHRoICsgKGFycm93UGFkZGluZ0xl
ZnQgKyBhcnJvd1BhZGRpbmdSaWdodCArIHBhZGRpbmdCZWZvcmVTZXBhcmF0b3IpICogc3R5bGUt
PmVmZmVjdGl2ZVpvb20oKSkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFJlbmRl
clRoZW1lTWFjU2hhcmVkOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcChSZW5kZXJTdHlsZSogc3R5
bGUpIGNvbnN0Ci17Ci0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0
KQotICAgICAgICByZXR1cm4gcG9wdXBCdXR0b25QYWRkaW5nKGNvbnRyb2xTaXplRm9yRm9udChz
dHlsZSkpW3RvcFBhZGRpbmddICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLSAgICBpZiAoc3R5
bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRvblBhcnQpCi0gICAgICAgIHJldHVybiBz
dHlsZWRQb3B1cFBhZGRpbmdUb3AgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotICAgIHJldHVy
biAwOwotfQotCi1pbnQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBvcHVwSW50ZXJuYWxQYWRkaW5n
Qm90dG9tKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICBpZiAoc3R5bGUtPmFwcGVh
cmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpCi0gICAgICAgIHJldHVybiBwb3B1cEJ1dHRvblBhZGRp
bmcoY29udHJvbFNpemVGb3JGb250KHN0eWxlKSlbYm90dG9tUGFkZGluZ10gKiBzdHlsZS0+ZWZm
ZWN0aXZlWm9vbSgpOwotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0QnV0
dG9uUGFydCkKLSAgICAgICAgcmV0dXJuIHN0eWxlZFBvcHVwUGFkZGluZ0JvdHRvbSAqIHN0eWxl
LT5lZmZlY3RpdmVab29tKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVN
YWNTaGFyZWQ6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoU3R5bGVSZXNvbHZlciosIFJlbmRl
clN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Ci17Ci0gICAgZmxvYXQgZm9udFNjYWxlID0g
c3R5bGUtPmZvbnRTaXplKCkgLyBiYXNlRm9udFNpemU7Ci0KLSAgICBzdHlsZS0+cmVzZXRQYWRk
aW5nKCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlclJhZGl1cyhJbnRTaXplKGludChiYXNlQm9yZGVy
UmFkaXVzICsgZm9udFNjYWxlIC0gMSksIGludChiYXNlQm9yZGVyUmFkaXVzICsgZm9udFNjYWxl
IC0gMSkpKTsgLy8gRklYTUU6IFJvdW5kIHVwPwotCi0gICAgY29uc3QgaW50IG1pbkhlaWdodCA9
IDE1OwotICAgIHN0eWxlLT5zZXRNaW5IZWlnaHQoTGVuZ3RoKG1pbkhlaWdodCwgRml4ZWQpKTsK
LQotICAgIHN0eWxlLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdo
dCgpKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2V0UG9wdXBCdXR0b25DZWxs
U3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBJbnRSZWN0JiByKQotewotICAgIE5T
UG9wVXBCdXR0b25DZWxsKiBwb3B1cEJ1dHRvbiA9IHRoaXMtPnBvcHVwQnV0dG9uKCk7Ci0KLSAg
ICAvLyBTZXQgdGhlIGNvbnRyb2wgc2l6ZSBiYXNlZCBvZmYgdGhlIHJlY3RhbmdsZSB3ZSdyZSBw
YWludGluZyBpbnRvLgotICAgIHNldENvbnRyb2xTaXplKHBvcHVwQnV0dG9uLCBwb3B1cEJ1dHRv
blNpemVzKCksIHIuc2l6ZSgpLCBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOwotCi0gICAg
Ly8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNwb25kIHRvLgotICAgIHVwZGF0ZUFj
dGl2ZVN0YXRlKHBvcHVwQnV0dG9uLCBvKTsKLSAgICB1cGRhdGVDaGVja2VkU3RhdGUocG9wdXBC
dXR0b24sIG8pOwotICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZShwb3B1cEJ1dHRvbiwgbyk7Ci0gICAg
dXBkYXRlUHJlc3NlZFN0YXRlKHBvcHVwQnV0dG9uLCBvKTsKLSNpZiBCVVRUT05fQ0VMTF9EUkFX
X1dJVEhfRlJBTUVfRFJBV1NfRk9DVVNfUklORwotICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShwb3B1
cEJ1dHRvbiwgbyk7Ci0jZW5kaWYKLX0KLQotY29uc3QgSW50U2l6ZSogUmVuZGVyVGhlbWVNYWNT
aGFyZWQ6Om1lbnVMaXN0U2l6ZXMoKSBjb25zdAotewotICAgIHN0YXRpYyBjb25zdCBJbnRTaXpl
IHNpemVzWzNdID0geyBJbnRTaXplKDksIDApLCBJbnRTaXplKDUsIDApLCBJbnRTaXplKDAsIDAp
IH07Ci0gICAgcmV0dXJuIHNpemVzOwotfQotCi1pbnQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6Om1p
bmltdW1NZW51TGlzdFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIHJldHVy
biBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgbWVudUxpc3RTaXplcygpKS53aWR0aCgpOwotfQot
Ci1jb25zdCBpbnQgdHJhY2tXaWR0aCA9IDU7Ci1jb25zdCBpbnQgdHJhY2tSYWRpdXMgPSAyOwot
Ci12b2lkIFJlbmRlclRoZW1lTWFjU2hhcmVkOjphZGp1c3RTbGlkZXJUcmFja1N0eWxlKFN0eWxl
UmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAotewotICAgIHN0
eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWNTaGFy
ZWQ6OnBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBh
aW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBJbnRSZWN0IGJvdW5kcyA9IHI7Ci0g
ICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotICAgIGZs
b2F0IHpvb21lZFRyYWNrV2lkdGggPSB0cmFja1dpZHRoICogem9vbUxldmVsOwotCi0gICAgaWYg
KG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSAgU2xpZGVySG9yaXpvbnRhbFBhcnQgfHwgby0+
c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09ICBNZWRpYVNsaWRlclBhcnQpIHsKLSAgICAgICAgYm91
bmRzLnNldEhlaWdodCh6b29tZWRUcmFja1dpZHRoKTsKLSAgICAgICAgYm91bmRzLnNldFkoci55
KCkgKyByLmhlaWdodCgpIC8gMiAtIHpvb21lZFRyYWNrV2lkdGggLyAyKTsKLSAgICB9IGVsc2Ug
aWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpIHsKLSAg
ICAgICAgYm91bmRzLnNldFdpZHRoKHpvb21lZFRyYWNrV2lkdGgpOwotICAgICAgICBib3VuZHMu
c2V0WChyLngoKSArIHIud2lkdGgoKSAvIDIgLSB6b29tZWRUcmFja1dpZHRoIC8gMik7Ci0gICAg
fQotCi0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludElu
Zm8uY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBsb2NhbENvbnRleHQuY2dD
b250ZXh0KCk7Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGNzcGFjZSA9IGRldmljZVJHQkNvbG9yU3Bh
Y2VSZWYoKTsKLQotI2lmIEVOQUJMRShEQVRBTElTVF9FTEVNRU5UKQotICAgIHBhaW50U2xpZGVy
VGlja3MobywgcGFpbnRJbmZvLCByKTsKLSNlbmRpZgotCi0gICAgR3JhcGhpY3NDb250ZXh0U3Rh
dGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0gICAgQ0dDb250ZXh0Q2xp
cFRvUmVjdChjb250ZXh0LCBib3VuZHMpOwotCi0gICAgc3RydWN0IENHRnVuY3Rpb25DYWxsYmFj
a3MgbWFpbkNhbGxiYWNrcyA9IHsgMCwgVHJhY2tHcmFkaWVudEludGVycG9sYXRlLCBOVUxMIH07
Ci0gICAgUmV0YWluUHRyPENHRnVuY3Rpb25SZWY+IG1haW5GdW5jdGlvbihBZG9wdENGLCBDR0Z1
bmN0aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQsIE5VTEwsICZtYWluQ2FsbGJhY2tzKSk7Ci0g
ICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gbWFpblNoYWRpbmc7Ci0gICAgaWYgKG8tPnN0eWxl
KCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpCi0gICAgICAgIG1haW5TaGFk
aW5nLmFkb3B0Q0YoQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLCBDR1BvaW50TWFrZShib3Vu
ZHMueCgpLCAgYm91bmRzLm1heFkoKSksIENHUG9pbnRNYWtlKGJvdW5kcy5tYXhYKCksIGJvdW5k
cy5tYXhZKCkpLCBtYWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkpOwotICAgIGVsc2UK
LSAgICAgICAgbWFpblNoYWRpbmcuYWRvcHRDRihDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2Us
IENHUG9pbnRNYWtlKGJvdW5kcy54KCksICBib3VuZHMueSgpKSwgQ0dQb2ludE1ha2UoYm91bmRz
LngoKSwgYm91bmRzLm1heFkoKSksIG1haW5GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7
Ci0KLSAgICBJbnRTaXplIHJhZGl1cyh0cmFja1JhZGl1cywgdHJhY2tSYWRpdXMpOwotICAgIHBh
aW50SW5mby5jb250ZXh0LT5jbGlwUm91bmRlZFJlY3QoUm91bmRlZFJlY3QoYm91bmRzLCByYWRp
dXMsIHJhZGl1cywgcmFkaXVzLCByYWRpdXMpKTsKLSAgICBjb250ZXh0ID0gbG9jYWxDb250ZXh0
LmNnQ29udGV4dCgpOwotICAgIENHQ29udGV4dERyYXdTaGFkaW5nKGNvbnRleHQsIG1haW5TaGFk
aW5nLmdldCgpKTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZU1h
Y1NoYXJlZDo6YWRqdXN0U2xpZGVyVGh1bWJTdHlsZShTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29s
dmVyLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAg
UmVuZGVyVGhlbWU6OmFkanVzdFNsaWRlclRodW1iU3R5bGUoc3R5bGVSZXNvbHZlciwgc3R5bGUs
IGVsZW1lbnQpOwotICAgIHN0eWxlLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Ci19Ci0KLWNvbnN0
IGZsb2F0IHZlcnRpY2FsU2xpZGVySGVpZ2h0UGFkZGluZyA9IDAuMWY7Ci0KLWJvb2wgUmVuZGVy
VGhlbWVNYWNTaGFyZWQ6OnBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQ
YWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKLXsKLSAgICBOU1NsaWRlckNl
bGwqIHNsaWRlclRodW1iQ2VsbCA9IG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJU
aHVtYlZlcnRpY2FsUGFydAotICAgICAgICA/IHNsaWRlclRodW1iVmVydGljYWwoKQotICAgICAg
ICA6IHNsaWRlclRodW1iSG9yaXpvbnRhbCgpOwotCi0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3ND
b250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7Ci0KLSAgICAvLyBVcGRhdGUg
dGhlIHZhcmlvdXMgc3RhdGVzIHdlIHJlc3BvbmQgdG8uCi0gICAgdXBkYXRlQWN0aXZlU3RhdGUo
c2xpZGVyVGh1bWJDZWxsLCBvKTsKLSAgICB1cGRhdGVFbmFibGVkU3RhdGUoc2xpZGVyVGh1bWJD
ZWxsLCBvKTsKLSAgICB1cGRhdGVGb2N1c2VkU3RhdGUoc2xpZGVyVGh1bWJDZWxsLCAoby0+bm9k
ZSgpICYmIG8tPm5vZGUoKS0+Zm9jdXNEZWxlZ2F0ZSgpLT5yZW5kZXJlcigpKSA/IG8tPm5vZGUo
KS0+Zm9jdXNEZWxlZ2F0ZSgpLT5yZW5kZXJlcigpIDogbyk7Ci0KLSAgICAvLyBVcGRhdGUgdGhl
IHByZXNzZWQgc3RhdGUgdXNpbmcgdGhlIE5TQ2VsbCB0cmFja2luZyBtZXRob2RzLCBzaW5jZSB0
aGF0J3MgaG93IE5TU2xpZGVyQ2VsbCBrZWVwcyB0cmFjayBvZiBpdC4KLSAgICBib29sIG9sZFBy
ZXNzZWQ7Ci0gICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZl
cnRpY2FsUGFydCkKLSAgICAgICAgb2xkUHJlc3NlZCA9IG1faXNTbGlkZXJUaHVtYlZlcnRpY2Fs
UHJlc3NlZDsKLSAgICBlbHNlCi0gICAgICAgIG9sZFByZXNzZWQgPSBtX2lzU2xpZGVyVGh1bWJI
b3Jpem9udGFsUHJlc3NlZDsKLQotICAgIGJvb2wgcHJlc3NlZCA9IGlzUHJlc3NlZChvKTsKLQot
ICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBh
cnQpCi0gICAgICAgIG1faXNTbGlkZXJUaHVtYlZlcnRpY2FsUHJlc3NlZCA9IHByZXNzZWQ7Ci0g
ICAgZWxzZQotICAgICAgICBtX2lzU2xpZGVyVGh1bWJIb3Jpem9udGFsUHJlc3NlZCA9IHByZXNz
ZWQ7Ci0KLSAgICBpZiAocHJlc3NlZCAhPSBvbGRQcmVzc2VkKSB7Ci0gICAgICAgIGlmIChwcmVz
c2VkKQotICAgICAgICAgICAgW3NsaWRlclRodW1iQ2VsbCBzdGFydFRyYWNraW5nQXQ6TlNQb2lu
dCgpIGluVmlldzpuaWxdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBbc2xpZGVyVGh1bWJD
ZWxsIHN0b3BUcmFja2luZzpOU1BvaW50KCkgYXQ6TlNQb2ludCgpIGluVmlldzpuaWwgbW91c2VJ
c1VwOllFU107Ci0gICAgfQotCi0gICAgRmxvYXRSZWN0IGJvdW5kcyA9IHI7Ci0gICAgLy8gTWFr
ZSB0aGUgaGVpZ2h0IG9mIHRoZSB2ZXJ0aWNhbCBzbGlkZXIgc2xpZ2h0bHkgbGFyZ2VyIHNvIE5T
U2xpZGVyQ2VsbCB3aWxsIGRyYXcgYSB2ZXJ0aWNhbCBzbGlkZXIuCi0gICAgaWYgKG8tPnN0eWxl
KCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkKLSAgICAgICAgYm91
bmRzLnNldEhlaWdodChib3VuZHMuaGVpZ2h0KCkgKyB2ZXJ0aWNhbFNsaWRlckhlaWdodFBhZGRp
bmcgKiBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOwotCi0gICAgR3JhcGhpY3NDb250ZXh0
U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0gICAgZmxvYXQgem9v
bUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgRmxvYXRSZWN0IHVu
em9vbWVkUmVjdCA9IGJvdW5kczsKLSAgICBpZiAoem9vbUxldmVsICE9IDEuMGYpIHsKLSAgICAg
ICAgdW56b29tZWRSZWN0LnNldFdpZHRoKHVuem9vbWVkUmVjdC53aWR0aCgpIC8gem9vbUxldmVs
KTsKLSAgICAgICAgdW56b29tZWRSZWN0LnNldEhlaWdodCh1bnpvb21lZFJlY3QuaGVpZ2h0KCkg
LyB6b29tTGV2ZWwpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKHVuem9v
bWVkUmVjdC54KCksIHVuem9vbWVkUmVjdC55KCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4
dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZlbCwgem9vbUxldmVsKSk7Ci0gICAgICAgIHBhaW50
SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLXVuem9vbWVkUmVjdC54KCksIC11bnpvb21lZFJlY3Qu
eSgpKTsKLSAgICB9Ci0KLSAgICBbc2xpZGVyVGh1bWJDZWxsIGRyYXdJbnRlcmlvcldpdGhGcmFt
ZTp1bnpvb21lZFJlY3QgaW5WaWV3OmRvY3VtZW50Vmlld0ZvcihvKV07Ci0gICAgW3NsaWRlclRo
dW1iQ2VsbCBzZXRDb250cm9sVmlldzpuaWxdOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1i
b29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFNlYXJjaEZpZWxkKFJlbmRlck9iamVjdCog
bywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAg
TG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4
dCk7Ci0gICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJjaCgpOwotCi0g
ICAgc2V0U2VhcmNoQ2VsbFN0YXRlKG8sIHIpOwotCi0gICAgR3JhcGhpY3NDb250ZXh0U3RhdGVT
YXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7Ci0KLSAgICBmbG9hdCB6b29tTGV2
ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0KLSAgICBJbnRSZWN0IHVuem9vbWVk
UmVjdCA9IHI7Ci0KLSAgICBpZiAoem9vbUxldmVsICE9IDEuMGYpIHsKLSAgICAgICAgdW56b29t
ZWRSZWN0LnNldFdpZHRoKHVuem9vbWVkUmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsKLSAgICAg
ICAgdW56b29tZWRSZWN0LnNldEhlaWdodCh1bnpvb21lZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2
ZWwpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKHVuem9vbWVkUmVjdC54
KCksIHVuem9vbWVkUmVjdC55KCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUo
RmxvYXRTaXplKHpvb21MZXZlbCwgem9vbUxldmVsKSk7Ci0gICAgICAgIHBhaW50SW5mby5jb250
ZXh0LT50cmFuc2xhdGUoLXVuem9vbWVkUmVjdC54KCksIC11bnpvb21lZFJlY3QueSgpKTsKLSAg
ICB9Ci0KLSAgICAvLyBTZXQgdGhlIHNlYXJjaCBidXR0b24gdG8gbmlsIGJlZm9yZSBkcmF3aW5n
LiAgVGhlbiByZXNldCBpdCBzbyB3ZSBjYW4gZHJhdyBpdCBsYXRlci4KLSAgICBbc2VhcmNoIHNl
dFNlYXJjaEJ1dHRvbkNlbGw6bmlsXTsKLQotICAgIFtzZWFyY2ggZHJhd1dpdGhGcmFtZTpOU1Jl
Y3QodW56b29tZWRSZWN0KSBpblZpZXc6ZG9jdW1lbnRWaWV3Rm9yKG8pXTsKLQotICAgIFtzZWFy
Y2ggc2V0Q29udHJvbFZpZXc6bmlsXTsKLSAgICBbc2VhcmNoIHJlc2V0U2VhcmNoQnV0dG9uQ2Vs
bF07Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6
OnNldFNlYXJjaENlbGxTdGF0ZShSZW5kZXJPYmplY3QqIG8sIGNvbnN0IEludFJlY3QmKQotewot
ICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsKLQotICAgIFtz
ZWFyY2ggc2V0Q29udHJvbFNpemU6Y29udHJvbFNpemVGb3JGb250KG8tPnN0eWxlKCkpXTsKLQot
ICAgIC8vIFVwZGF0ZSB0aGUgdmFyaW91cyBzdGF0ZXMgd2UgcmVzcG9uZCB0by4KLSAgICB1cGRh
dGVBY3RpdmVTdGF0ZShzZWFyY2gsIG8pOwotICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZShzZWFyY2gs
IG8pOwotICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShzZWFyY2gsIG8pOwotfQotCi1jb25zdCBJbnRT
aXplKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2VhcmNoRmllbGRTaXplcygpIGNvbnN0Ci17Ci0g
ICAgc3RhdGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMCwgMjIpLCBJbnRT
aXplKDAsIDE5KSwgSW50U2l6ZSgwLCAxNykgfTsKLSAgICByZXR1cm4gc2l6ZXM7Ci19Ci0KLXZv
aWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNldFNlYXJjaEZpZWxkU2l6ZShSZW5kZXJTdHlsZSog
c3R5bGUpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGgg
c3BlY2lmaWVkLCB0aGVuIHdlIGhhdmUgbm90aGluZyB0byBkby4KLSAgICBpZiAoIXN0eWxlLT53
aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVXNlIHRoZSBmb250IHNpemUgdG8gZGV0ZXJtaW5l
IHRoZSBpbnRyaW5zaWMgd2lkdGggb2YgdGhlIGNvbnRyb2wuCi0gICAgc2V0U2l6ZUZyb21Gb250
KHN0eWxlLCBzZWFyY2hGaWVsZFNpemVzKCkpOwotfQotCi12b2lkIFJlbmRlclRoZW1lTWFjU2hh
cmVkOjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIs
IFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Ci17Ci0gICAgLy8gT3ZlcnJpZGUg
Ym9yZGVyLgotICAgIHN0eWxlLT5yZXNldEJvcmRlcigpOwotICAgIGNvbnN0IHNob3J0IGJvcmRl
cldpZHRoID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgc3R5bGUtPnNldEJvcmRl
ckxlZnRXaWR0aChib3JkZXJXaWR0aCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlckxlZnRTdHlsZShJ
TlNFVCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlclJpZ2h0V2lkdGgoYm9yZGVyV2lkdGgpOwotICAg
IHN0eWxlLT5zZXRCb3JkZXJSaWdodFN0eWxlKElOU0VUKTsKLSAgICBzdHlsZS0+c2V0Qm9yZGVy
Qm90dG9tV2lkdGgoYm9yZGVyV2lkdGgpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJCb3R0b21TdHls
ZShJTlNFVCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlclRvcFdpZHRoKGJvcmRlcldpZHRoKTsKLSAg
ICBzdHlsZS0+c2V0Qm9yZGVyVG9wU3R5bGUoSU5TRVQpOwotCi0gICAgLy8gT3ZlcnJpZGUgaGVp
Z2h0LgotICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKEF1dG8pKTsKLSAgICBzZXRTZWFyY2hG
aWVsZFNpemUoc3R5bGUpOwotCi0gICAgLy8gT3ZlcnJpZGUgcGFkZGluZyBzaXplIHRvIG1hdGNo
IEFwcEtpdCB0ZXh0IHBvc2l0aW9uaW5nLgotICAgIGNvbnN0IGludCBwYWRkaW5nID0gMSAqIHN0
eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdMZWZ0KExlbmd0aChw
YWRkaW5nLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3RoKHBhZGRp
bmcsIEZpeGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdUb3AoTGVuZ3RoKHBhZGRpbmcsIEZp
eGVkKSk7Ci0gICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20oTGVuZ3RoKHBhZGRpbmcsIEZpeGVk
KSk7Ci0KLSAgICBOU0NvbnRyb2xTaXplIGNvbnRyb2xTaXplID0gY29udHJvbFNpemVGb3JGb250
KHN0eWxlKTsKLSAgICBzZXRGb250RnJvbUNvbnRyb2xTaXplKHN0eWxlUmVzb2x2ZXIsIHN0eWxl
LCBjb250cm9sU2l6ZSk7Ci0KLSAgICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOwotfQot
Ci1ib29sIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9u
KFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJl
Y3QmIHIpCi17Ci0gICAgRWxlbWVudCogaW5wdXQgPSBvLT5ub2RlKCktPnNoYWRvd0hvc3QoKTsK
LSAgICBpZiAoIWlucHV0KQotICAgICAgICBpbnB1dCA9IHRvRWxlbWVudChvLT5ub2RlKCkpOwot
Ci0gICAgaWYgKCFpbnB1dC0+cmVuZGVyZXIoKS0+aXNCb3goKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWlu
dEluZm8uY29udGV4dCk7Ci0gICAgc2V0U2VhcmNoQ2VsbFN0YXRlKGlucHV0LT5yZW5kZXJlcigp
LCByKTsKLQotICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFyY2ggPSB0aGlzLT5zZWFyY2goKTsK
LQotICAgIGlmICghaW5wdXQtPmlzRGlzYWJsZWRGb3JtQ29udHJvbCgpICYmIChpbnB1dC0+aXNU
ZXh0Rm9ybUNvbnRyb2woKSAmJiAhdG9IVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudChpbnB1dCkt
PmlzUmVhZE9ubHkoKSkpIHsKLSAgICAgICAgdXBkYXRlQWN0aXZlU3RhdGUoW3NlYXJjaCBjYW5j
ZWxCdXR0b25DZWxsXSwgbyk7Ci0gICAgICAgIHVwZGF0ZVByZXNzZWRTdGF0ZShbc2VhcmNoIGNh
bmNlbEJ1dHRvbkNlbGxdLCBvKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoW1tzZWFyY2ggY2FuY2Vs
QnV0dG9uQ2VsbF0gaXNIaWdobGlnaHRlZF0pCi0gICAgICAgIFtbc2VhcmNoIGNhbmNlbEJ1dHRv
bkNlbGxdIHNldEhpZ2hsaWdodGVkOk5PXTsKLQotICAgIEdyYXBoaWNzQ29udGV4dFN0YXRlU2F2
ZXIgc3RhdGVTYXZlcigqcGFpbnRJbmZvLmNvbnRleHQpOwotCi0gICAgZmxvYXQgem9vbUxldmVs
ID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgRmxvYXRSZWN0IGxvY2FsQm91
bmRzID0gW3NlYXJjaCBjYW5jZWxCdXR0b25SZWN0Rm9yQm91bmRzOk5TUmVjdChpbnB1dC0+cmVu
ZGVyQm94KCktPnBpeGVsU25hcHBlZEJvcmRlckJveFJlY3QoKSldOwotCi0jaWYgRU5BQkxFKElO
UFVUX1NQRUVDSCkKLSAgICAvLyBUYWtlIGNhcmUgb2YgY2FzZXMgd2hlcmUgdGhlIGNhbmNlbCBi
dXR0b24gd2FzIG5vdCBhbGlnbmVkIHdpdGggdGhlIHJpZ2h0IGJvcmRlciBvZiB0aGUgaW5wdXQg
ZWxlbWVudCAoZm9yIGUuZy4KLSAgICAvLyB3aGVuIHNwZWVjaCBpbnB1dCBpcyBlbmFibGVkIGZv
ciB0aGUgaW5wdXQgZWxlbWVudC4KLSAgICBJbnRSZWN0IGFic0JvdW5kaW5nQm94ID0gaW5wdXQt
PnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdCb3hSZWN0KCk7Ci0gICAgaW50IGFic1JpZ2h0
ID0gYWJzQm91bmRpbmdCb3gueCgpICsgYWJzQm91bmRpbmdCb3gud2lkdGgoKSAtIGlucHV0LT5y
ZW5kZXJCb3goKS0+cGFkZGluZ1JpZ2h0KCkgLSBpbnB1dC0+cmVuZGVyQm94KCktPmJvcmRlclJp
Z2h0KCk7Ci0gICAgaW50IHNwYWNlVG9SaWdodE9mQ2FuY2VsQnV0dG9uID0gYWJzUmlnaHQgLSAo
ci54KCkgKyByLndpZHRoKCkpOwotICAgIGxvY2FsQm91bmRzLnNldFgobG9jYWxCb3VuZHMueCgp
IC0gc3BhY2VUb1JpZ2h0T2ZDYW5jZWxCdXR0b24pOwotI2VuZGlmCi0KLSAgICBsb2NhbEJvdW5k
cyA9IGNvbnZlcnRUb1BhaW50aW5nUmVjdChpbnB1dC0+cmVuZGVyZXIoKSwgbywgbG9jYWxCb3Vu
ZHMsIHIpOwotCi0gICAgRmxvYXRSZWN0IHVuem9vbWVkUmVjdChsb2NhbEJvdW5kcyk7Ci0gICAg
aWYgKHpvb21MZXZlbCAhPSAxLjBmKSB7Ci0gICAgICAgIHVuem9vbWVkUmVjdC5zZXRXaWR0aCh1
bnpvb21lZFJlY3Qud2lkdGgoKSAvIHpvb21MZXZlbCk7Ci0gICAgICAgIHVuem9vbWVkUmVjdC5z
ZXRIZWlnaHQodW56b29tZWRSZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKLSAgICAgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSh1bnpvb21lZFJlY3QueCgpLCB1bnpvb21lZFJlY3Qu
eSgpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2
ZWwsIHpvb21MZXZlbCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC11
bnpvb21lZFJlY3QueCgpLCAtdW56b29tZWRSZWN0LnkoKSk7Ci0gICAgfQotCi0gICAgW1tzZWFy
Y2ggY2FuY2VsQnV0dG9uQ2VsbF0gZHJhd1dpdGhGcmFtZTp1bnpvb21lZFJlY3QgaW5WaWV3OmRv
Y3VtZW50Vmlld0ZvcihvKV07Ci0gICAgW1tzZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0gc2V0Q29u
dHJvbFZpZXc6bmlsXTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNvbnN0IEludFNpemUqIFJl
bmRlclRoZW1lTWFjU2hhcmVkOjpjYW5jZWxCdXR0b25TaXplcygpIGNvbnN0Ci17Ci0gICAgc3Rh
dGljIGNvbnN0IEludFNpemUgc2l6ZXNbM10gPSB7IEludFNpemUoMTYsIDEzKSwgSW50U2l6ZSgx
MywgMTEpLCBJbnRTaXplKDEzLCA5KSB9OwotICAgIHJldHVybiBzaXplczsKLX0KLQotdm9pZCBS
ZW5kZXJUaGVtZU1hY1NoYXJlZDo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShT
dHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKLXsKLSAg
ICBJbnRTaXplIHNpemUgPSBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgY2FuY2VsQnV0dG9uU2l6
ZXMoKSk7Ci0gICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCksIEZpeGVkKSk7
Ci0gICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKLSAg
ICBzdHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOwotfQotCi1jb25zdCBJbnRTaXplKiBSZW5k
ZXJUaGVtZU1hY1NoYXJlZDo6cmVzdWx0c0J1dHRvblNpemVzKCkgY29uc3QKLXsKLSAgICBzdGF0
aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsgSW50U2l6ZSgxOSwgMTMpLCBJbnRTaXplKDE3
LCAxMSksIEludFNpemUoMTcsIDkpIH07Ci0gICAgcmV0dXJuIHNpemVzOwotfQotCi1jb25zdCBp
bnQgZW1wdHlSZXN1bHRzT2Zmc2V0ID0gOTsKLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFk
anVzdFNlYXJjaEZpZWxkRGVjb3JhdGlvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHls
ZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAotewotICAgIEludFNpemUgc2l6ZSA9IHNpemVGb3JT
eXN0ZW1Gb250KHN0eWxlLCByZXN1bHRzQnV0dG9uU2l6ZXMoKSk7Ci0gICAgc3R5bGUtPnNldFdp
ZHRoKExlbmd0aChzaXplLndpZHRoKCkgLSBlbXB0eVJlc3VsdHNPZmZzZXQsIEZpeGVkKSk7Ci0g
ICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKLSAgICBz
dHlsZS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOwotfQotCi1ib29sIFJlbmRlclRoZW1lTWFjU2hh
cmVkOjpwYWludFNlYXJjaEZpZWxkRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0JikKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQg
UmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb25T
dHlsZShTdHlsZVJlc29sdmVyKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QK
LXsKLSAgICBJbnRTaXplIHNpemUgPSBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgcmVzdWx0c0J1
dHRvblNpemVzKCkpOwotICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpLCBG
aXhlZCkpOwotICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0KCksIEZpeGVk
KSk7Ci0gICAgc3R5bGUtPnNldEJveFNoYWRvdyhudWxscHRyKTsKLX0KLQotYm9vbCBSZW5kZXJU
aGVtZU1hY1NoYXJlZDo6cGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uKFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17
Ci0gICAgTm9kZSogaW5wdXQgPSBvLT5ub2RlKCktPnNoYWRvd0hvc3QoKTsKLSAgICBpZiAoIWlu
cHV0KQotICAgICAgICBpbnB1dCA9IG8tPm5vZGUoKTsKLSAgICBpZiAoIWlucHV0LT5yZW5kZXJl
cigpLT5pc0JveCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBMb2NhbEN1cnJlbnRH
cmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICBzZXRT
ZWFyY2hDZWxsU3RhdGUoaW5wdXQtPnJlbmRlcmVyKCksIHIpOwotCi0gICAgTlNTZWFyY2hGaWVs
ZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJjaCgpOwotCi0gICAgaWYgKFtzZWFyY2ggc2VhcmNo
TWVudVRlbXBsYXRlXSAhPSBuaWwpCi0gICAgICAgIFtzZWFyY2ggc2V0U2VhcmNoTWVudVRlbXBs
YXRlOm5pbF07Ci0KLSAgICB1cGRhdGVBY3RpdmVTdGF0ZShbc2VhcmNoIHNlYXJjaEJ1dHRvbkNl
bGxdLCBvKTsKLQotICAgIEZsb2F0UmVjdCBsb2NhbEJvdW5kcyA9IFtzZWFyY2ggc2VhcmNoQnV0
dG9uUmVjdEZvckJvdW5kczpOU1JlY3QoaW5wdXQtPnJlbmRlckJveCgpLT5waXhlbFNuYXBwZWRC
b3JkZXJCb3hSZWN0KCkpXTsKLSAgICBsb2NhbEJvdW5kcyA9IGNvbnZlcnRUb1BhaW50aW5nUmVj
dChpbnB1dC0+cmVuZGVyZXIoKSwgbywgbG9jYWxCb3VuZHMsIHIpOwotCi0gICAgW1tzZWFyY2gg
c2VhcmNoQnV0dG9uQ2VsbF0gZHJhd1dpdGhGcmFtZTpsb2NhbEJvdW5kcyBpblZpZXc6ZG9jdW1l
bnRWaWV3Rm9yKG8pXTsKLSAgICBbW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSBzZXRDb250cm9s
VmlldzpuaWxdOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotY29uc3QgaW50IHJlc3VsdHNBcnJv
d1dpZHRoID0gNTsKLXZvaWQgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OmFkanVzdFNlYXJjaEZpZWxk
UmVzdWx0c0J1dHRvblN0eWxlKFN0eWxlUmVzb2x2ZXIqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVs
ZW1lbnQqKSBjb25zdAotewotICAgIEludFNpemUgc2l6ZSA9IHNpemVGb3JTeXN0ZW1Gb250KHN0
eWxlLCByZXN1bHRzQnV0dG9uU2l6ZXMoKSk7Ci0gICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChz
aXplLndpZHRoKCkgKyByZXN1bHRzQXJyb3dXaWR0aCwgRml4ZWQpKTsKLSAgICBzdHlsZS0+c2V0
SGVpZ2h0KExlbmd0aChzaXplLmhlaWdodCgpLCBGaXhlZCkpOwotICAgIHN0eWxlLT5zZXRCb3hT
aGFkb3cobnVsbHB0cik7Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnBhaW50U2Vh
cmNoRmllbGRSZXN1bHRzQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTm9kZSogaW5wdXQgPSBvLT5ub2Rl
KCktPnNoYWRvd0hvc3QoKTsKLSAgICBpZiAoIWlucHV0KQotICAgICAgICBpbnB1dCA9IG8tPm5v
ZGUoKTsKLSAgICBpZiAoIWlucHV0LT5yZW5kZXJlcigpLT5pc0JveCgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0
KHBhaW50SW5mby5jb250ZXh0KTsKLSAgICBzZXRTZWFyY2hDZWxsU3RhdGUoaW5wdXQtPnJlbmRl
cmVyKCksIHIpOwotCi0gICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJj
aCgpOwotCi0gICAgdXBkYXRlQWN0aXZlU3RhdGUoW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSwg
byk7Ci0KLSAgICBpZiAoIVtzZWFyY2ggc2VhcmNoTWVudVRlbXBsYXRlXSkKLSAgICAgICAgW3Nl
YXJjaCBzZXRTZWFyY2hNZW51VGVtcGxhdGU6c2VhcmNoTWVudVRlbXBsYXRlKCldOwotCi0gICAg
R3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0ZVNhdmVyKCpwYWludEluZm8uY29udGV4dCk7
Ci0gICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0g
ICAgRmxvYXRSZWN0IGxvY2FsQm91bmRzID0gW3NlYXJjaCBzZWFyY2hCdXR0b25SZWN0Rm9yQm91
bmRzOk5TUmVjdChpbnB1dC0+cmVuZGVyQm94KCktPnBpeGVsU25hcHBlZEJvcmRlckJveFJlY3Qo
KSldOwotICAgIGxvY2FsQm91bmRzID0gY29udmVydFRvUGFpbnRpbmdSZWN0KGlucHV0LT5yZW5k
ZXJlcigpLCBvLCBsb2NhbEJvdW5kcywgcik7Ci0KLSAgICBJbnRSZWN0IHVuem9vbWVkUmVjdChs
b2NhbEJvdW5kcyk7Ci0gICAgaWYgKHpvb21MZXZlbCAhPSAxLjBmKSB7Ci0gICAgICAgIHVuem9v
bWVkUmVjdC5zZXRXaWR0aCh1bnpvb21lZFJlY3Qud2lkdGgoKSAvIHpvb21MZXZlbCk7Ci0gICAg
ICAgIHVuem9vbWVkUmVjdC5zZXRIZWlnaHQodW56b29tZWRSZWN0LmhlaWdodCgpIC8gem9vbUxl
dmVsKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSh1bnpvb21lZFJlY3Qu
eCgpLCB1bnpvb21lZFJlY3QueSgpKTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxl
KEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkpOwotICAgICAgICBwYWludEluZm8uY29u
dGV4dC0+dHJhbnNsYXRlKC11bnpvb21lZFJlY3QueCgpLCAtdW56b29tZWRSZWN0LnkoKSk7Ci0g
ICAgfQotCi0gICAgW1tzZWFyY2ggc2VhcmNoQnV0dG9uQ2VsbF0gZHJhd1dpdGhGcmFtZTp1bnpv
b21lZFJlY3QgaW5WaWV3OmRvY3VtZW50Vmlld0ZvcihvKV07Ci0gICAgW1tzZWFyY2ggc2VhcmNo
QnV0dG9uQ2VsbF0gc2V0Q29udHJvbFZpZXc6bmlsXTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotYm9vbCBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6cGFpbnRTbmFwc2hvdHRlZFBsdWdpbk92ZXJs
YXkoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50
UmVjdCYpCi17Ci0gICAgaWYgKHBhaW50SW5mby5waGFzZSAhPSBQYWludFBoYXNlQmxvY2tCYWNr
Z3JvdW5kKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmICghby0+aXNSZW5kZXJCbG9j
aygpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFJlbmRlckJsb2NrKiByZW5kZXJCbG9j
ayA9IHRvUmVuZGVyQmxvY2sobyk7Ci0KLSAgICBMYXlvdXRVbml0IGNvbnRlbnRXaWR0aCA9IHJl
bmRlckJsb2NrLT5jb250ZW50V2lkdGgoKTsKLSAgICBMYXlvdXRVbml0IGNvbnRlbnRIZWlnaHQg
PSByZW5kZXJCbG9jay0+Y29udGVudEhlaWdodCgpOwotICAgIGlmICghY29udGVudFdpZHRoIHx8
ICFjb250ZW50SGVpZ2h0KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEdyYXBoaWNzQ29u
dGV4dCogY29udGV4dCA9IHBhaW50SW5mby5jb250ZXh0OwotCi0gICAgTGF5b3V0U2l6ZSBjb250
ZW50U2l6ZShjb250ZW50V2lkdGgsIGNvbnRlbnRIZWlnaHQpOwotICAgIExheW91dFBvaW50IGNv
bnRlbnRMb2NhdGlvbiA9IHJlbmRlckJsb2NrLT5sb2NhdGlvbigpOwotICAgIGNvbnRlbnRMb2Nh
dGlvbi5tb3ZlKHJlbmRlckJsb2NrLT5ib3JkZXJMZWZ0KCkgKyByZW5kZXJCbG9jay0+cGFkZGlu
Z0xlZnQoKSwgcmVuZGVyQmxvY2stPmJvcmRlclRvcCgpICsgcmVuZGVyQmxvY2stPnBhZGRpbmdU
b3AoKSk7Ci0KLSAgICBMYXlvdXRSZWN0IHJlY3QoY29udGVudExvY2F0aW9uLCBjb250ZW50U2l6
ZSk7Ci0gICAgSW50UmVjdCBhbGlnbmVkUmVjdCA9IHBpeGVsU25hcHBlZEludFJlY3QocmVjdCk7
Ci0gICAgaWYgKGFsaWduZWRSZWN0LndpZHRoKCkgPD0gMCB8fCBhbGlnbmVkUmVjdC5oZWlnaHQo
KSA8PSAwKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIFdlIG5lZWQgdG8gZ2V0IHRo
ZSBzbmFwc2hvdCBpbWFnZSBmcm9tIHRoZSBwbHVnaW4gZWxlbWVudCwgd2hpY2ggc2hvdWxkIGJl
IGF2YWlsYWJsZQotICAgIC8vIGZyb20gb3VyIG5vZGUuIEFzc3VtaW5nIHRoaXMgbm9kZSBpcyB0
aGUgcGx1Z2luIG92ZXJsYXkgZWxlbWVudCwgd2Ugc2hvdWxkIGdldCB0byB0aGUKLSAgICAvLyBw
bHVnaW4gaXRzZWxmIGJ5IGFza2luZyBmb3IgdGhlIHNoYWRvdyByb290IHBhcmVudCwgYW5kIHRo
ZW4gaXRzIHBhcmVudC4KLQotICAgIGlmICghcmVuZGVyQmxvY2stPm5vZGUoKS0+aXNIVE1MRWxl
bWVudCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEhUTUxFbGVtZW50KiBwbHVnSW5P
dmVybGF5ID0gdG9IVE1MRWxlbWVudChyZW5kZXJCbG9jay0+bm9kZSgpKTsKLSAgICBFbGVtZW50
KiBwYXJlbnQgPSBwbHVnSW5PdmVybGF5LT5wYXJlbnRPclNoYWRvd0hvc3RFbGVtZW50KCk7Ci0g
ICAgd2hpbGUgKHBhcmVudCAmJiAhcGFyZW50LT5pc1BsdWdpbkVsZW1lbnQoKSkKLSAgICAgICAg
cGFyZW50ID0gcGFyZW50LT5wYXJlbnRPclNoYWRvd0hvc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAo
IXBhcmVudCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBIVE1MUGx1Z0luRWxlbWVudCog
cGx1Z0luRWxlbWVudCA9IHRvSFRNTFBsdWdJbkVsZW1lbnQocGFyZW50KTsKLSAgICBpZiAoIXBs
dWdJbkVsZW1lbnQtPmlzUGx1Z0luSW1hZ2VFbGVtZW50KCkpCi0gICAgICAgIHJldHVybiB0cnVl
OwotCi0gICAgSFRNTFBsdWdJbkltYWdlRWxlbWVudCogcGx1Z0luSW1hZ2VFbGVtZW50ID0gdG9I
VE1MUGx1Z0luSW1hZ2VFbGVtZW50KHBsdWdJbkVsZW1lbnQpOwotCi0gICAgSW1hZ2UqIHNuYXBz
aG90ID0gcGx1Z0luSW1hZ2VFbGVtZW50LT5zbmFwc2hvdEltYWdlKCk7Ci0gICAgaWYgKCFzbmFw
c2hvdCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBSZW5kZXJTbmFwc2hvdHRlZFBsdWdJ
biogcGx1Z0luUmVuZGVyZXIgPSB0b1JlbmRlclNuYXBzaG90dGVkUGx1Z0luKHBsdWdJbkltYWdl
RWxlbWVudC0+cmVuZGVyZXIoKSk7Ci0gICAgRmxvYXRQb2ludCBzbmFwc2hvdEFic1BvcyA9IHBs
dWdJblJlbmRlcmVyLT5sb2NhbFRvQWJzb2x1dGUoKTsKLSAgICBzbmFwc2hvdEFic1Bvcy5tb3Zl
KHBsdWdJblJlbmRlcmVyLT5ib3JkZXJMZWZ0KCkgKyBwbHVnSW5SZW5kZXJlci0+cGFkZGluZ0xl
ZnQoKSwgcGx1Z0luUmVuZGVyZXItPmJvcmRlclRvcCgpICsgcGx1Z0luUmVuZGVyZXItPnBhZGRp
bmdUb3AoKSk7Ci0KLSAgICAvLyBXZSBjb3VsZCBkcmF3IHRoZSBzbmFwc2hvdCB3aXRoIHRoYXQg
Y29vcmRpbmF0ZXMsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGVyZQotICAgIC8vIGlzbid0
IGEgY29tcG9zaXRlZCBsYXllciBiZXR3ZWVuIHVzIGFuZCB0aGUgcGx1Z0luUmVuZGVyZXIuCi0g
ICAgUmVuZGVyQm94KiByZW5kZXJCb3ggPSB0b1JlbmRlckJveChvKTsKLSAgICB3aGlsZSAocmVu
ZGVyQm94ICE9IHBsdWdJblJlbmRlcmVyKSB7Ci0gICAgICAgIGlmIChyZW5kZXJCb3gtPmhhc0xh
eWVyKCkgJiYgcmVuZGVyQm94LT5sYXllcigpICYmIHJlbmRlckJveC0+bGF5ZXIoKS0+aXNDb21w
b3NpdGVkKCkpIHsKLSAgICAgICAgICAgIHNuYXBzaG90QWJzUG9zID0gLXJlbmRlckJveC0+bG9j
YXRpb24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJlbmRlckJv
eCA9IHJlbmRlckJveC0+cGFyZW50Qm94KCk7Ci0gICAgfQotCi0gICAgTGF5b3V0U2l6ZSBwbHVn
aW5TaXplKHBsdWdJblJlbmRlcmVyLT5jb250ZW50V2lkdGgoKSwgcGx1Z0luUmVuZGVyZXItPmNv
bnRlbnRIZWlnaHQoKSk7Ci0gICAgTGF5b3V0UmVjdCBwbHVnaW5SZWN0KHNuYXBzaG90QWJzUG9z
LCBwbHVnaW5TaXplKTsKLSAgICBJbnRSZWN0IGFsaWduZWRQbHVnaW5SZWN0ID0gcGl4ZWxTbmFw
cGVkSW50UmVjdChwbHVnaW5SZWN0KTsKLQotICAgIGlmIChhbGlnbmVkUGx1Z2luUmVjdC53aWR0
aCgpIDw9IDAgfHwgYWxpZ25lZFBsdWdpblJlY3QuaGVpZ2h0KCkgPD0gMCkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0KLSAgICBjb250ZXh0LT5kcmF3SW1hZ2Uoc25hcHNob3QsIHBsdWdJblJlbmRl
cmVyLT5zdHlsZSgpLT5jb2xvclNwYWNlKCksIGFsaWduZWRQbHVnaW5SZWN0LCBDb21wb3NpdGVT
b3VyY2VPdmVyKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZiBFTkFCTEUoREFUQUxJU1Rf
RUxFTUVOVCkKLUludFNpemUgUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNsaWRlclRpY2tTaXplKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gSW50U2l6ZSgxLCAzKTsKLX0KLQotaW50IFJlbmRlclRoZW1l
TWFjU2hhcmVkOjpzbGlkZXJUaWNrT2Zmc2V0RnJvbVRyYWNrQ2VudGVyKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gLTk7Ci19Ci0jZW5kaWYKLQotY29uc3QgaW50IHNsaWRlclRodW1iV2lkdGggPSAx
NTsKLWNvbnN0IGludCBzbGlkZXJUaHVtYkhlaWdodCA9IDE1OwotCi12b2lkIFJlbmRlclRoZW1l
TWFjU2hhcmVkOjphZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVt
ZW50KikgY29uc3QKLXsKLSAgICBmbG9hdCB6b29tTGV2ZWwgPSBzdHlsZS0+ZWZmZWN0aXZlWm9v
bSgpOwotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iSG9yaXpvbnRh
bFBhcnQgfHwgc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkg
ewotICAgICAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKHN0YXRpY19jYXN0PGludD4oc2xpZGVy
VGh1bWJXaWR0aCAqIHpvb21MZXZlbCksIEZpeGVkKSk7Ci0gICAgICAgIHN0eWxlLT5zZXRIZWln
aHQoTGVuZ3RoKHN0YXRpY19jYXN0PGludD4oc2xpZGVyVGh1bWJIZWlnaHQgKiB6b29tTGV2ZWwp
LCBGaXhlZCkpOwotICAgIH0KLQotI2lmIEVOQUJMRShWSURFTykKLSAgICBhZGp1c3RNZWRpYVNs
aWRlclRodW1iU2l6ZShzdHlsZSk7Ci0jZW5kaWYKLX0KLQotYm9vbCBSZW5kZXJUaGVtZU1hY1No
YXJlZDo6c2hvdWxkU2hvd1BsYWNlaG9sZGVyV2hlbkZvY3VzZWQoKSBjb25zdAotewotI2lmIF9f
TUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPj0gMTA3MAotICAgIHJldHVybiB0cnVlOwot
I2Vsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotTlNQb3BVcEJ1dHRvbkNlbGwq
IFJlbmRlclRoZW1lTWFjU2hhcmVkOjpwb3B1cEJ1dHRvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFt
X3BvcHVwQnV0dG9uKSB7Ci0gICAgICAgIG1fcG9wdXBCdXR0b24uYWRvcHROUyhbW05TUG9wVXBC
dXR0b25DZWxsIGFsbG9jXSBpbml0VGV4dENlbGw6QCIiIHB1bGxzRG93bjpOT10pOwotICAgICAg
ICBbbV9wb3B1cEJ1dHRvbi5nZXQoKSBzZXRVc2VzSXRlbUZyb21NZW51Ok5PXTsKLSAgICAgICAg
W21fcG9wdXBCdXR0b24uZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRl
cmlvcl07Ci0gICAgfQotCi0gICAgcmV0dXJuIG1fcG9wdXBCdXR0b24uZ2V0KCk7Ci19Ci0KLU5T
U2VhcmNoRmllbGRDZWxsKiBSZW5kZXJUaGVtZU1hY1NoYXJlZDo6c2VhcmNoKCkgY29uc3QKLXsK
LSAgICBpZiAoIW1fc2VhcmNoKSB7Ci0gICAgICAgIG1fc2VhcmNoLmFkb3B0TlMoW1tOU1NlYXJj
aEZpZWxkQ2VsbCBhbGxvY10gaW5pdFRleHRDZWxsOkAiIl0pOwotICAgICAgICBbbV9zZWFyY2gu
Z2V0KCkgc2V0QmV6ZWxTdHlsZTpOU1RleHRGaWVsZFJvdW5kZWRCZXplbF07Ci0gICAgICAgIFtt
X3NlYXJjaC5nZXQoKSBzZXRCZXplbGVkOllFU107Ci0gICAgICAgIFttX3NlYXJjaC5nZXQoKSBz
ZXRFZGl0YWJsZTpZRVNdOwotICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0Rm9jdXNSaW5nVHlw
ZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07Ci0gICAgfQotCi0gICAgcmV0dXJuIG1fc2VhcmNo
LmdldCgpOwotfQotCi1OU01lbnUqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjpzZWFyY2hNZW51VGVt
cGxhdGUoKSBjb25zdAotewotICAgIGlmICghbV9zZWFyY2hNZW51VGVtcGxhdGUpCi0gICAgICAg
IG1fc2VhcmNoTWVudVRlbXBsYXRlLmFkb3B0TlMoW1tOU01lbnUgYWxsb2NdIGluaXRXaXRoVGl0
bGU6QCIiXSk7Ci0KLSAgICByZXR1cm4gbV9zZWFyY2hNZW51VGVtcGxhdGUuZ2V0KCk7Ci19Ci0K
LU5TU2xpZGVyQ2VsbCogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNsaWRlclRodW1iSG9yaXpvbnRh
bCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3NsaWRlclRodW1iSG9yaXpvbnRhbCkgewotICAgICAg
ICBtX3NsaWRlclRodW1iSG9yaXpvbnRhbC5hZG9wdE5TKFtbTlNTbGlkZXJDZWxsIGFsbG9jXSBp
bml0XSk7Ci0gICAgICAgIFttX3NsaWRlclRodW1iSG9yaXpvbnRhbC5nZXQoKSBzZXRTbGlkZXJU
eXBlOk5TTGluZWFyU2xpZGVyXTsKLSAgICAgICAgW21fc2xpZGVyVGh1bWJIb3Jpem9udGFsLmdl
dCgpIHNldENvbnRyb2xTaXplOk5TU21hbGxDb250cm9sU2l6ZV07Ci0gICAgICAgIFttX3NsaWRl
clRodW1iSG9yaXpvbnRhbC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNSaW5nVHlwZUV4
dGVyaW9yXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbV9zbGlkZXJUaHVtYkhvcml6b250YWwuZ2V0
KCk7Ci19Ci0KLU5TU2xpZGVyQ2VsbCogUmVuZGVyVGhlbWVNYWNTaGFyZWQ6OnNsaWRlclRodW1i
VmVydGljYWwoKSBjb25zdAotewotICAgIGlmICghbV9zbGlkZXJUaHVtYlZlcnRpY2FsKSB7Ci0g
ICAgICAgIG1fc2xpZGVyVGh1bWJWZXJ0aWNhbC5hZG9wdE5TKFtbTlNTbGlkZXJDZWxsIGFsbG9j
XSBpbml0XSk7Ci0gICAgICAgIFttX3NsaWRlclRodW1iVmVydGljYWwuZ2V0KCkgc2V0U2xpZGVy
VHlwZTpOU0xpbmVhclNsaWRlcl07Ci0gICAgICAgIFttX3NsaWRlclRodW1iVmVydGljYWwuZ2V0
KCkgc2V0Q29udHJvbFNpemU6TlNTbWFsbENvbnRyb2xTaXplXTsKLSAgICAgICAgW21fc2xpZGVy
VGh1bWJWZXJ0aWNhbC5nZXQoKSBzZXRGb2N1c1JpbmdUeXBlOk5TRm9jdXNSaW5nVHlwZUV4dGVy
aW9yXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbV9zbGlkZXJUaHVtYlZlcnRpY2FsLmdldCgpOwot
fQotCi1OU1RleHRGaWVsZENlbGwqIFJlbmRlclRoZW1lTWFjU2hhcmVkOjp0ZXh0RmllbGQoKSBj
b25zdAotewotICAgIGlmICghbV90ZXh0RmllbGQpIHsKLSAgICAgICAgbV90ZXh0RmllbGQuYWRv
cHROUyhbW1dlYkNvcmVUZXh0RmllbGRDZWxsIGFsbG9jXSBpbml0VGV4dENlbGw6QCIiXSk7Ci0g
ICAgICAgIFttX3RleHRGaWVsZC5nZXQoKSBzZXRCZXplbGVkOllFU107Ci0gICAgICAgIFttX3Rl
eHRGaWVsZC5nZXQoKSBzZXRFZGl0YWJsZTpZRVNdOwotICAgICAgICBbbV90ZXh0RmllbGQuZ2V0
KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07Ci0jaWYgX19NQUNf
T1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSAxMDcwCi0gICAgICAgIFttX3RleHRGaWVsZC5n
ZXQoKSBzZXREcmF3c0JhY2tncm91bmQ6WUVTXTsKLSAgICAgICAgW21fdGV4dEZpZWxkLmdldCgp
IHNldEJhY2tncm91bmRDb2xvcjpbTlNDb2xvciB3aGl0ZUNvbG9yXV07Ci0jZWxzZQotICAgICAg
ICAvLyBQb3N0LUxpb24sIFdlYkNvcmUgY2FuIGJlIGluIGNoYXJnZSBvZiBwYWludGlubmcgdGhl
IGJhY2tncm91bmQgdGhhbmtzIHRvCi0gICAgICAgIC8vIHRoZSB3b3JrYXJvdW5kIGluIHBsYWNl
IGZvciA8cmRhcjovL3Byb2JsZW0vMTEzODU0NjE+LCB3aGljaCBpcyBpbXBsZW1lbnRlZAotICAg
ICAgICAvLyBhYm92ZSBhcyBfY29yZVVJRHJhd09wdGlvbnNXaXRoRnJhbWUuCi0gICAgICAgIFtt
X3RleHRGaWVsZC5nZXQoKSBzZXREcmF3c0JhY2tncm91bmQ6Tk9dOwotI2VuZGlmCi0gICAgfQot
Ci0gICAgcmV0dXJuIG1fdGV4dEZpZWxkLmdldCgpOwotfQotCi1TdHJpbmcgUmVuZGVyVGhlbWVN
YWNTaGFyZWQ6OmZpbGVMaXN0TmFtZUZvcldpZHRoKGNvbnN0IEZpbGVMaXN0KiBmaWxlTGlzdCwg
Y29uc3QgRm9udCYgZm9udCwgaW50IHdpZHRoLCBib29sIG11bHRpcGxlRmlsZXNBbGxvd2VkKSBj
b25zdAotewotICAgIGlmICh3aWR0aCA8PSAwKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0K
LSAgICBTdHJpbmcgc3RyVG9UcnVuY2F0ZTsKLSAgICBpZiAoZmlsZUxpc3QtPmlzRW1wdHkoKSkK
LSAgICAgICAgc3RyVG9UcnVuY2F0ZSA9IGZpbGVMaXN0RGVmYXVsdExhYmVsKG11bHRpcGxlRmls
ZXNBbGxvd2VkKTsKLSAgICBlbHNlIGlmIChmaWxlTGlzdC0+bGVuZ3RoKCkgPT0gMSkKLSAgICAg
ICAgc3RyVG9UcnVuY2F0ZSA9IFtbTlNGaWxlTWFuYWdlciBkZWZhdWx0TWFuYWdlcl0gZGlzcGxh
eU5hbWVBdFBhdGg6KGZpbGVMaXN0LT5pdGVtKDApLT5wYXRoKCkpXTsKLSAgICBlbHNlCi0gICAg
ICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUobXVsdGlwbGVGaWxlVXBs
b2FkVGV4dChmaWxlTGlzdC0+bGVuZ3RoKCkpLCB3aWR0aCwgZm9udCwgU3RyaW5nVHJ1bmNhdG9y
OjpFbmFibGVSb3VuZGluZ0hhY2tzKTsKLQotICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OmNl
bnRlclRydW5jYXRlKHN0clRvVHJ1bmNhdGUsIHdpZHRoLCBmb250LCBTdHJpbmdUcnVuY2F0b3I6
OkVuYWJsZVJvdW5kaW5nSGFja3MpOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>