<?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>133819</bug_id>
          
          <creation_ts>2014-06-12 13:43:00 -0700</creation_ts>
          <short_desc>Convert TileController and TileGrid from ObjC to C++</short_desc>
          <delta_ts>2014-06-12 17:28:55 -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>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>133704</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Brent Fulgham">bfulgham</reporter>
          <assigned_to name="Brent Fulgham">bfulgham</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>commit-queue</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1015224</commentid>
    <comment_count>0</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2014-06-12 13:43:00 -0700</bug_when>
    <thetext>This is a first step in porting the Mac Tiled Drawing logic to Windows.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1015225</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2014-06-12 13:43:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/17291841&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1015248</commentid>
    <comment_count>2</comment_count>
      <attachid>232994</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2014-06-12 15:02:20 -0700</bug_when>
    <thetext>Created attachment 232994
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1015249</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2014-06-12 15:04:36 -0700</bug_when>
    <thetext>Attachment 232994 did not pass style-queue:


ERROR: Source/WebCore/platform/graphics/ca/mac/TileGrid.cpp:186:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebCore/platform/graphics/ca/mac/TileGrid.cpp:259:  Missing space after ,  [whitespace/comma] [3]
Total errors found: 2 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1015251</commentid>
    <comment_count>4</comment_count>
      <attachid>232994</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2014-06-12 15:09:19 -0700</bug_when>
    <thetext>Comment on attachment 232994
Patch

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

&gt; Source/WebCore/platform/graphics/ca/mac/TileController.cpp:386
&gt; +        FloatRect visiblePart(CGRectOffset([tileLayer frame], tileTranslation.x(), tileTranslation.y()));

looks like ObjC to me!

&gt; Source/WebCore/platform/graphics/ca/mac/TileController.cpp:386
&gt; -        FloatRect visiblePart(CGRectOffset([tileLayer frame], tileTranslation.x(), tileTranslation.y()));
&gt; +        FloatRect visiblePart(CGRectOffset(frameForLayer(tileLayer), tileTranslation.x(), tileTranslation.y()));

wut. weird patch format, I guess?

&gt; Source/WebCore/platform/graphics/mac/WebLayer.h:31
&gt; +#include &lt;WebCore/FloatRect.h&gt;

we&apos;re in webcore, is there any need for WebCore/?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1015261</commentid>
    <comment_count>5</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2014-06-12 15:35:13 -0700</bug_when>
    <thetext>Committed r169914: &lt;http://trac.webkit.org/changeset/169914&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1015275</commentid>
    <comment_count>6</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2014-06-12 16:13:07 -0700</bug_when>
    <thetext>Follow-up commit:
 r169919 &lt;http://trac.webkit.org/changeset/169919&gt;

This was needed because Xcode only changed the logical folder names of the new files; they were meant to be moved from the &apos;mac&apos; specific folder.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1015292</commentid>
    <comment_count>7</comment_count>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2014-06-12 17:28:55 -0700</bug_when>
    <thetext>Second follow up commit:
Committed revision 169923.

This was needed because &apos;TileController.h&apos; must be marked as a Private header or else the WebKit2 build will fail.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>232994</attachid>
            <date>2014-06-12 15:02:20 -0700</date>
            <delta_ts>2014-06-12 15:09:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-133819-20140612150155.patch</filename>
            <type>text/plain</type>
            <size>105124</size>
            <attacher name="Brent Fulgham">bfulgham</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2OTkxMikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBACisyMDE0LTA2LTEyICBCcmVudCBG
dWxnaGFtICA8YmZ1bGdoYW1AYXBwbGUuY29tPgorCisgICAgICAgIENvbnZlcnQgVGlsZUNvbnRy
b2xsZXIgYW5kIFRpbGVHcmlkIGZyb20gT2JqQyB0byBDKysKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzMzgxOQorICAgICAgICA8cmRhcjovL3Byb2Js
ZW0vMTcyOTE4NDE+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQ29udmVydCBUaWxlR3JpZC5tbSBhbmQgVGlsZUNvbnRyb2xsZXIubW0gaW50byBDKysg
aW1wbGVtZW50YXRpb25zLiBUaGlzIHJlcXVpcmVkIGNyZWF0aW5nIGEgJ2ZyYW1lRm9yTGF5ZXIn
CisgICAgICAgIHdyYXBwZXIgdG8gY2FsbCB0aGUgJ2ZyYW1lJyBtZXRob2Qgb2YgdGhlIENBTGF5
ZXIgb2JqZWN0LgorCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9q
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlQ29udHJvbGxlci5jcHA6
IENvcGllZCBmcm9tIHBsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlQ29udHJvbGxlci5tbS4K
KyAgICAgICAgKFdlYkNvcmU6OlRpbGVDb250cm9sbGVyOjpibGFua1BpeGVsQ291bnRGb3JUaWxl
cyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFjL1RpbGVDb250cm9sbGVyLm1t
OiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3JpZC5j
cHA6IENvcGllZCBmcm9tIHBsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3JpZC5tbS4KKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jYS9tYWMvVGlsZUdyaWQuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9jYS9tYWMvVGlsZUdyaWQubW06IFJlbW92ZWQuCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkxheWVyLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjL1dlYkxheWVyLm1tOgorICAgICAgICAoV2ViQ29yZTo6ZnJhbWVGb3JMYXllcik6
IFdyYXBwZXIgZnVuY3Rpb24gdG8gaGlkZSBPYmpDIGNhbGwgZnJvbSBDKysgY29tcGlsYXRpb24g
dW5pdC4KKwogMjAxNC0wNi0xMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29t
PgogCiAgICAgICAgIEFkZCBhIHNwYWNlIGFmdGVyIHRoZSBjb21tYS4KSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9u
IDE2OTgwOSkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkod29ya2luZyBjb3B5KQpAQCAtNzc3LDcgKzc3Nyw3IEBACiAJCTFBOTI3RkQzMTQxNkEx
NUIwMDNBODNDOCAvKiBucHJ1bnRpbWUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDFBOTI3RkQwMTQxNkExNUIwMDNBODNDOCAvKiBucHJ1bnRpbWUuaCAq
Lzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkxQTkyN0ZE
NDE0MTZBMTVCMDAzQTgzQzggLyogbnB0eXBlcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gMUE5MjdGRDExNDE2QTE1QjAwM0E4M0M4IC8qIG5wdHlwZXMu
aCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkxQTk4
OTU2QjBBQTc4RjgwMDA1RUY1RUYgLyogVVJMQ0YuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUE5ODk1NkEwQUE3OEY4MDAwNUVGNUVGIC8qIFVSTENG
LmNwcCAqLzsgfTsKLQkJMUFBNzE2MEExNDlCQzREQjAwMTZFQzE5IC8qIFRpbGVDb250cm9sbGVy
Lm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFBNzE2
MDgxNDlCQzREQTAwMTZFQzE5IC8qIFRpbGVDb250cm9sbGVyLm1tICovOyB9OworCQkxQUE3MTYw
QTE0OUJDNERCMDAxNkVDMTkgLyogVGlsZUNvbnRyb2xsZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFBNzE2MDgxNDlCQzREQTAwMTZFQzE5IC8q
IFRpbGVDb250cm9sbGVyLmNwcCAqLzsgfTsKIAkJMUFBNzE2MEIxNDlCQzREQjAwMTZFQzE5IC8q
IFRpbGVDb250cm9sbGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAxQUE3MTYwOTE0OUJDNERCMDAxNkVDMTkgLyogVGlsZUNvbnRyb2xsZXIuaCAqLzsg
c2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkxQUE4NEYwNDE0
M0JBN0JEMDA1MUQxNTMgLyogU2Nyb2xsRWxhc3RpY2l0eUNvbnRyb2xsZXIubW0gaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxQUE4NEYwMjE0M0JBN0JEMDA1
MUQxNTMgLyogU2Nyb2xsRWxhc3RpY2l0eUNvbnRyb2xsZXIubW0gKi87IH07CiAJCTFBQTg0RjA1
MTQzQkE3QkQwMDUxRDE1MyAvKiBTY3JvbGxFbGFzdGljaXR5Q29udHJvbGxlci5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMUFBODRGMDMxNDNCQTdCRDAw
NTFEMTUzIC8qIFNjcm9sbEVsYXN0aWNpdHlDb250cm9sbGVyLmggKi87IHNldHRpbmdzID0ge0FU
VFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTYxNDMsNyArNjE0Myw3IEBACiAJCUU0
QkJFRDREMTRGQ0RCQTEwMDNGMEI5OCAvKiBTdHlsZVJ1bGUuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0QkJFRDRCMTRGQ0RCQTEwMDNGMEI5OCAvKiBT
dHlsZVJ1bGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9
OwogCQlFNEMxNzg5QTBFRTY5MDM4MDA4MjRENjkgLyogQ1NTU2VsZWN0b3JMaXN0LmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0QzE3ODk1MEVFNjkw
MzgwMDgyNEQ2OSAvKiBDU1NTZWxlY3Rvckxpc3QuY3BwICovOyB9OwogCQlFNEMxNzg5QjBFRTY5
MDM4MDA4MjRENjkgLyogQ1NTU2VsZWN0b3JMaXN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNEMxNzg5NjBFRTY5MDM4MDA4MjRENjkgLyogQ1NTU2Vs
ZWN0b3JMaXN0LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKLQkJRTRDMjc0Q0ExOEU5ODhFQTAwNjAyQzc2IC8qIFRpbGVHcmlkLm1tIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRDMjc0QzkxOEU5ODhFQTAwNjAy
Qzc2IC8qIFRpbGVHcmlkLm1tICovOyB9OworCQlFNEMyNzRDQTE4RTk4OEVBMDA2MDJDNzYgLyog
VGlsZUdyaWQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRTRDMjc0QzkxOEU5ODhFQTAwNjAyQzc2IC8qIFRpbGVHcmlkLmNwcCAqLzsgfTsKIAkJRTRD
Mjc0Q0MxOEU5ODhGNTAwNjAyQzc2IC8qIFRpbGVHcmlkLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNEMyNzRDQjE4RTk4OEY1MDA2MDJDNzYgLyogVGls
ZUdyaWQuaCAqLzsgfTsKIAkJRTRDMjc5NTgwQ0Y5NzQxOTAwRTk3Qjk4IC8qIFJlbmRlck1lZGlh
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0QzI3
OTU2MENGOTc0MTkwMEU5N0I5OCAvKiBSZW5kZXJNZWRpYS5jcHAgKi87IH07CiAJCUU0QzI3OTU5
MENGOTc0MTkwMEU5N0I5OCAvKiBSZW5kZXJNZWRpYS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRDMjc5NTcwQ0Y5NzQxOTAwRTk3Qjk4IC8qIFJlbmRl
ck1lZGlhLmggKi87IH07CkBAIC03NzAyLDcgKzc3MDIsNyBAQAogCQkxQTkyN0ZEMDE0MTZBMTVC
MDAzQTgzQzggLyogbnBydW50aW1lLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IG5wcnVudGltZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxQTkyN0ZEMTE0MTZB
MTVCMDAzQTgzQzggLyogbnB0eXBlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBucHR5cGVzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFBOTg5NTZBMEFBNzhG
ODAwMDVFRjVFRiAvKiBVUkxDRi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gVVJMQ0YuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQkxQUE3MTYwODE0
OUJDNERBMDAxNkVDMTkgLyogVGlsZUNvbnRyb2xsZXIubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5vYmpjcHA7IG5hbWUgPSBUaWxlQ29udHJvbGxlci5tbTsgcGF0aCA9IGNhL21hYy9UaWxl
Q29udHJvbGxlci5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMUFBNzE2MDgxNDlC
QzREQTAwMTZFQzE5IC8qIFRpbGVDb250cm9sbGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgbmFtZSA9IFRpbGVDb250cm9sbGVyLmNwcDsgcGF0aCA9IGNhL21hYy9UaWxlQ29u
dHJvbGxlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFBQTcxNjA5MTQ5QkM0
REIwMDE2RUMxOSAvKiBUaWxlQ29udHJvbGxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IG5hbWUgPSBUaWxlQ29udHJvbGxlci5oOyBwYXRoID0gY2EvbWFjL1RpbGVDb250cm9sbGVyLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTFBQTg0RjAyMTQzQkE3QkQwMDUxRDE1MyAv
KiBTY3JvbGxFbGFzdGljaXR5Q29udHJvbGxlci5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
Lm9iamNwcDsgcGF0aCA9IFNjcm9sbEVsYXN0aWNpdHlDb250cm9sbGVyLm1tOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkxQUE4NEYwMzE0M0JBN0JEMDA1MUQxNTMgLyogU2Nyb2xsRWxh
c3RpY2l0eUNvbnRyb2xsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2Ny
b2xsRWxhc3RpY2l0eUNvbnRyb2xsZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAg
LTEzNjE1LDcgKzEzNjE1LDcgQEAKIAkJRTRCQkVENEIxNEZDREJBMTAwM0YwQjk4IC8qIFN0eWxl
UnVsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTdHlsZVJ1bGUuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTRDMTc4OTUwRUU2OTAzODAwODI0RDY5IC8qIENT
U1NlbGVjdG9yTGlzdC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBD
U1NTZWxlY3Rvckxpc3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNEMxNzg5
NjBFRTY5MDM4MDA4MjRENjkgLyogQ1NTU2VsZWN0b3JMaXN0LmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IENTU1NlbGVjdG9yTGlzdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwotCQlFNEMyNzRDOTE4RTk4OEVBMDA2MDJDNzYgLyogVGlsZUdyaWQubW0gKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IG5hbWUgPSBUaWxlR3JpZC5tbTsgcGF0aCA9IGNhL21h
Yy9UaWxlR3JpZC5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRTRDMjc0QzkxOEU5
ODhFQTAwNjAyQzc2IC8qIFRpbGVHcmlkLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgbmFtZSA9IFRpbGVHcmlkLmNwcDsgcGF0aCA9IGNhL21hYy9UaWxlR3JpZC5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0QzI3NENCMThFOTg4RjUwMDYwMkM3NiAvKiBUaWxl
R3JpZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBUaWxlR3JpZC5oOyBwYXRo
ID0gY2EvbWFjL1RpbGVHcmlkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0QzI3
OTU2MENGOTc0MTkwMEU5N0I5OCAvKiBSZW5kZXJNZWRpYS5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJNZWRpYS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCUU0QzI3OTU3MENGOTc0MTkwMEU5N0I5OCAvKiBSZW5kZXJNZWRpYS5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJNZWRpYS5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwpAQCAtMTU3ODAsMTIgKzE1NzgwLDggQEAKIAkJCQkwRjEzMTYzRjE2RUQw
Q0RFMDAzNUNDMDQgLyogUGxhdGZvcm1DQUZpbHRlcnNNYWMubW0gKi8sCiAJCQkJMkQ3MEJBMTIx
ODA3NERERjAwMDE5MDhBIC8qIFBsYXRmb3JtQ0FMYXllck1hYy5oICovLAogCQkJCTQ5NTg3ODIw
MTJBNTdEREYwMDcyMzhBQyAvKiBQbGF0Zm9ybUNBTGF5ZXJNYWMubW0gKi8sCi0JCQkJMUFBNzE2
MDkxNDlCQzREQjAwMTZFQzE5IC8qIFRpbGVDb250cm9sbGVyLmggKi8sCi0JCQkJMUFBNzE2MDgx
NDlCQzREQTAwMTZFQzE5IC8qIFRpbGVDb250cm9sbGVyLm1tICovLAogCQkJCUU0ODMwQTNDMThG
NEM1QjcwMDE1NEExQiAvKiBUaWxlQ292ZXJhZ2VNYXAuaCAqLywKIAkJCQlFNDgzMEEzODE4RjRD
NTk0MDAxNTRBMUIgLyogVGlsZUNvdmVyYWdlTWFwLm1tICovLAotCQkJCUU0QzI3NENCMThFOTg4
RjUwMDYwMkM3NiAvKiBUaWxlR3JpZC5oICovLAotCQkJCUU0QzI3NEM5MThFOTg4RUEwMDYwMkM3
NiAvKiBUaWxlR3JpZC5tbSAqLywKIAkJCQkwRjU4MEZBMTE0OTY5MzkxMDBGQjVCRDggLyogV2Vi
VGlsZWRCYWNraW5nTGF5ZXIuaCAqLywKIAkJCQkwRjU4MEZBMjE0OTY5MzkxMDBGQjVCRDggLyog
V2ViVGlsZWRCYWNraW5nTGF5ZXIubW0gKi8sCiAJCQkpOwpAQCAtMTU4MjksNiArMTU4MjUsMTAg
QEAKIAkJCQkyRDcwQkExNDE4MDc0Rjg1MDAwMTkwOEEgLyogUGxhdGZvcm1DQUxheWVyLmNwcCAq
LywKIAkJCQk0OTlCM0VDMzEyOENDQzQ3MDBFNzI2QzIgLyogUGxhdGZvcm1DQUxheWVyLmggKi8s
CiAJCQkJNDkzRTVFMDgxMkQ2NDIwNTAwMDIwMDgxIC8qIFBsYXRmb3JtQ0FMYXllckNsaWVudC5o
ICovLAorCQkJCTFBQTcxNjA5MTQ5QkM0REIwMDE2RUMxOSAvKiBUaWxlQ29udHJvbGxlci5oICov
LAorCQkJCTFBQTcxNjA4MTQ5QkM0REEwMDE2RUMxOSAvKiBUaWxlQ29udHJvbGxlci5jcHAgKi8s
CisJCQkJRTRDMjc0Q0IxOEU5ODhGNTAwNjAyQzc2IC8qIFRpbGVHcmlkLmggKi8sCisJCQkJRTRD
Mjc0QzkxOEU5ODhFQTAwNjAyQzc2IC8qIFRpbGVHcmlkLmNwcCAqLywKIAkJCQk0OTRCQzQwQzEy
QUVERDlFMDA3NDNCRDIgLyogVHJhbnNmb3JtYXRpb25NYXRyaXhDQS5jcHAgKi8sCiAJCQkpOwog
CQkJbmFtZSA9IGNhOwpAQCAtMjg1MDcsNyArMjg1MDcsNyBAQAogCQkJCTUxNkJCNzk0MENFOTFF
NjgwMDUxMkY3OSAvKiBKU1RyZWVXYWxrZXJDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
QTg2NjI5RDAwOURBMkI0ODAwOTYzM0E1IC8qIEpTVUlFdmVudC5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQlBQUE0RkFEMzE3NUQ1Q0IzMDA3NDM4NzMgLyogSlNVSVJlcXVlc3RFdmVudC5jcHAgaW4g
U291cmNlcyAqLywKLQkJCQlFNEMyNzRDQTE4RTk4OEVBMDA2MDJDNzYgLyogVGlsZUdyaWQubW0g
aW4gU291cmNlcyAqLywKKwkJCQlFNEMyNzRDQTE4RTk4OEVBMDA2MDJDNzYgLyogVGlsZUdyaWQu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTVDNzcwOTQxMDBEM0NBODAwNUJBMjY3IC8qIEpTVmFs
aWRpdHlTdGF0ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlDREU4M0RCNjE4M0QzNTJBMDAzMUVB
QTMgLyogSlNWaWRlb1BsYXliYWNrUXVhbGl0eS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwN0M1
OUI1RjE3RjRCMjA4MDAwRkJDQkIgLyogSlNWaWRlb1N0cmVhbVRyYWNrLmNwcCBpbiBTb3VyY2Vz
ICovLApAQCAtMjk1MTIsNyArMjk1MTIsNyBAQAogCQkJCUUxRkY1N0E2MEYwMTI1NkIwMDg5MUVC
QiAvKiBUaHJlYWRHbG9iYWxEYXRhLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE4NUJDRjI4MEYz
Mjc5Q0UwMDBFQTI2MiAvKiBUaHJlYWRUaW1lcnMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJRTRD
M0IxRkMwRjBFNDE3MDAwOTY5M0Y2IC8qIExlZ2FjeVRpbGVDYWNoZS5tbSBpbiBTb3VyY2VzICov
LAotCQkJCTFBQTcxNjBBMTQ5QkM0REIwMDE2RUMxOSAvKiBUaWxlQ29udHJvbGxlci5tbSBpbiBT
b3VyY2VzICovLAorCQkJCTFBQTcxNjBBMTQ5QkM0REIwMDE2RUMxOSAvKiBUaWxlQ29udHJvbGxl
ci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxRjcyQkYwQTE4N0ZENDQ5MDAwOUJDQjMgLyogVGls
ZUNvbnRyb2xsZXJNZW1vcnlIYW5kbGVySU9TLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUU0QjY1
QTVBMTMyRkFBRjkwMDcwRTdCRSAvKiBMZWdhY3lUaWxlR3JpZC5tbSBpbiBTb3VyY2VzICovLAog
CQkJCUU0MjRBM0EwMTMzMERGMUUwMENGNkRDOSAvKiBMZWdhY3lUaWxlR3JpZFRpbGUubW0gaW4g
U291cmNlcyAqLywKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21h
Yy9UaWxlQ29udHJvbGxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2EvbWFjL1RpbGVDb250cm9sbGVyLmNwcAkocmV2aXNpb24gMTY5ODA5KQko
ZnJvbSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYS9tYWMvVGlsZUNvbnRyb2xs
ZXIubW06MTY5ODA5KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFj
L1RpbGVDb250cm9sbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU1MSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiVGlsZUNv
bnRyb2xsZXIuaCIKKworI2ltcG9ydCAiSW50UmVjdC5oIgorI2ltcG9ydCAiUGxhdGZvcm1DQUxh
eWVyLmgiCisjaW1wb3J0ICJSZWdpb24uaCIKKyNpbXBvcnQgIlRpbGVDb3ZlcmFnZU1hcC5oIgor
I2ltcG9ydCAiVGlsZUdyaWQuaCIKKyNpbXBvcnQgIldlYkxheWVyLmgiCisjaW1wb3J0ICJMYXll
clBvb2wuaCIKKyNpbXBvcnQgPHd0Zi9NYWluVGhyZWFkLmg+CisjaW1wb3J0IDx1dGlsaXR5Pgor
CisjaWYgUExBVEZPUk0oSU9TKQorI2ltcG9ydCAiVGlsZUNvbnRyb2xsZXJNZW1vcnlIYW5kbGVy
SU9TLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzT3duUHRyPFRpbGVD
b250cm9sbGVyPiBUaWxlQ29udHJvbGxlcjo6Y3JlYXRlKFBsYXRmb3JtQ0FMYXllciogcm9vdFBs
YXRmb3JtTGF5ZXIpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBUaWxlQ29udHJvbGxlcihy
b290UGxhdGZvcm1MYXllcikpOworfQorCitUaWxlQ29udHJvbGxlcjo6VGlsZUNvbnRyb2xsZXIo
UGxhdGZvcm1DQUxheWVyKiByb290UGxhdGZvcm1MYXllcikKKyAgICA6IG1fdGlsZUNhY2hlTGF5
ZXIocm9vdFBsYXRmb3JtTGF5ZXIpCisgICAgLCBtX3RpbGVHcmlkKHN0ZDo6bWFrZV91bmlxdWU8
VGlsZUdyaWQ+KCp0aGlzKSkKKyAgICAsIG1fdGlsZVNpemUoZGVmYXVsdFRpbGVXaWR0aCwgZGVm
YXVsdFRpbGVIZWlnaHQpCisgICAgLCBtX3RpbGVSZXZhbGlkYXRpb25UaW1lcih0aGlzLCAmVGls
ZUNvbnRyb2xsZXI6OnRpbGVSZXZhbGlkYXRpb25UaW1lckZpcmVkKQorICAgICwgbV96b29tZWRP
dXRDb250ZW50c1NjYWxlKDApCisgICAgLCBtX2RldmljZVNjYWxlRmFjdG9yKG93bmluZ0dyYXBo
aWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyRGV2aWNlU2NhbGVGYWN0b3IoKSkKKyAgICAsIG1f
dGlsZUNvdmVyYWdlKENvdmVyYWdlRm9yVmlzaWJsZUFyZWEpCisgICAgLCBtX21hcmdpblRvcCgw
KQorICAgICwgbV9tYXJnaW5Cb3R0b20oMCkKKyAgICAsIG1fbWFyZ2luTGVmdCgwKQorICAgICwg
bV9tYXJnaW5SaWdodCgwKQorICAgICwgbV9pc0luV2luZG93KGZhbHNlKQorICAgICwgbV9zY3Jv
bGxpbmdQZXJmb3JtYW5jZUxvZ2dpbmdFbmFibGVkKGZhbHNlKQorICAgICwgbV91bnBhcmVudHNP
ZmZzY3JlZW5UaWxlcyhmYWxzZSkKKyAgICAsIG1fYWNjZWxlcmF0ZXNEcmF3aW5nKGZhbHNlKQor
ICAgICwgbV90aWxlc0FyZU9wYXF1ZShmYWxzZSkKKyAgICAsIG1faGFzVGlsZXNXaXRoVGVtcG9y
YXJ5U2NhbGVGYWN0b3IoZmFsc2UpCisgICAgLCBtX3RpbGVEZWJ1Z0JvcmRlcldpZHRoKDApCisg
ICAgLCBtX2luZGljYXRvck1vZGUoQXN5bmNTY3JvbGxpbmdJbmRpY2F0aW9uKQorICAgICwgbV90
b3BDb250ZW50SW5zZXQoMCkKK3sKK30KKworVGlsZUNvbnRyb2xsZXI6On5UaWxlQ29udHJvbGxl
cigpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworI2lmIFBMQVRGT1JNKElPUykK
KyAgICB0aWxlQ29udHJvbGxlck1lbW9yeUhhbmRsZXIoKS5yZW1vdmVUaWxlQ29udHJvbGxlcih0
aGlzKTsKKyNlbmRpZgorfQorCit2b2lkIFRpbGVDb250cm9sbGVyOjp0aWxlQ2FjaGVMYXllckJv
dW5kc0NoYW5nZWQoKQoreworICAgIEFTU0VSVChvd25pbmdHcmFwaGljc0xheWVyKCktPmlzQ29t
bWl0dGluZ0NoYW5nZXMoKSk7CisgICAgc2V0TmVlZHNSZXZhbGlkYXRlVGlsZXMoKTsKK30KKwor
dm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKKyAgICB0aWxlR3JpZCgp
LnNldE5lZWRzRGlzcGxheSgpOworICAgIG1fem9vbWVkT3V0VGlsZUdyaWQgPSBudWxscHRyOwor
fQorCit2b2lkIFRpbGVDb250cm9sbGVyOjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICB0aWxlR3JpZCgpLnNldE5lZWRzRGlzcGxheUluUmVjdChyZWN0
KTsKKyAgICBpZiAobV96b29tZWRPdXRUaWxlR3JpZCkKKyAgICAgICAgbV96b29tZWRPdXRUaWxl
R3JpZC0+ZHJvcFRpbGVzSW5SZWN0KHJlY3QpOworfQorCit2b2lkIFRpbGVDb250cm9sbGVyOjpz
ZXRDb250ZW50c1NjYWxlKGZsb2F0IHNjYWxlKQoreworICAgIEFTU0VSVChvd25pbmdHcmFwaGlj
c0xheWVyKCktPmlzQ29tbWl0dGluZ0NoYW5nZXMoKSk7CisKKyAgICBmbG9hdCBkZXZpY2VTY2Fs
ZUZhY3RvciA9IG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyRGV2aWNlU2Nh
bGVGYWN0b3IoKTsKKyAgICAvLyBUaGUgc2NhbGUgd2UgZ2V0IGlzIHRoZSBwcm9kdWN0IG9mIHRo
ZSBwYWdlIHNjYWxlIGZhY3RvciBhbmQgZGV2aWNlIHNjYWxlIGZhY3Rvci4KKyAgICAvLyBEaXZp
ZGUgYnkgdGhlIGRldmljZSBzY2FsZSBmYWN0b3Igc28gd2UnbGwgZ2V0IHRoZSBwYWdlIHNjYWxl
IGZhY3Rvci4KKyAgICBzY2FsZSAvPSBkZXZpY2VTY2FsZUZhY3RvcjsKKworICAgIGlmICh0aWxl
R3JpZCgpLnNjYWxlKCkgPT0gc2NhbGUgJiYgbV9kZXZpY2VTY2FsZUZhY3RvciA9PSBkZXZpY2VT
Y2FsZUZhY3RvciAmJiAhbV9oYXNUaWxlc1dpdGhUZW1wb3JhcnlTY2FsZUZhY3RvcikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9oYXNUaWxlc1dpdGhUZW1wb3JhcnlTY2FsZUZhY3RvciA9IGZh
bHNlOworICAgIG1fZGV2aWNlU2NhbGVGYWN0b3IgPSBkZXZpY2VTY2FsZUZhY3RvcjsKKworICAg
IGlmIChtX2NvdmVyYWdlTWFwKQorICAgICAgICBtX2NvdmVyYWdlTWFwLT5zZXREZXZpY2VTY2Fs
ZUZhY3RvcihkZXZpY2VTY2FsZUZhY3Rvcik7CisKKyAgICBpZiAobV96b29tZWRPdXRUaWxlR3Jp
ZCAmJiBtX3pvb21lZE91dFRpbGVHcmlkLT5zY2FsZSgpID09IHNjYWxlKSB7CisgICAgICAgIG1f
dGlsZUdyaWQgPSBzdGQ6Om1vdmUobV96b29tZWRPdXRUaWxlR3JpZCk7CisgICAgICAgIG1fdGls
ZUdyaWQtPnJldmFsaWRhdGVUaWxlcygwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGlmIChtX3pvb21lZE91dENvbnRlbnRzU2NhbGUgJiYgbV96b29tZWRPdXRDb250ZW50c1NjYWxl
ID09IHRpbGVHcmlkKCkuc2NhbGUoKSAmJiB0aWxlR3JpZCgpLnNjYWxlKCkgIT0gc2NhbGUgJiYg
IW1faGFzVGlsZXNXaXRoVGVtcG9yYXJ5U2NhbGVGYWN0b3IpIHsKKyAgICAgICAgbV96b29tZWRP
dXRUaWxlR3JpZCA9IHN0ZDo6bW92ZShtX3RpbGVHcmlkKTsKKyAgICAgICAgbV90aWxlR3JpZCA9
IHN0ZDo6bWFrZV91bmlxdWU8VGlsZUdyaWQ+KCp0aGlzKTsKKyAgICB9CisKKyAgICB0aWxlR3Jp
ZCgpLnNldFNjYWxlKHNjYWxlKTsKKyAgICB0aWxlR3JpZCgpLnNldE5lZWRzRGlzcGxheSgpOwor
fQorCitmbG9hdCBUaWxlQ29udHJvbGxlcjo6Y29udGVudHNTY2FsZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHRpbGVHcmlkKCkuc2NhbGUoKSAqIG1fZGV2aWNlU2NhbGVGYWN0b3I7Cit9CisKK2Zs
b2F0IFRpbGVDb250cm9sbGVyOjp6b29tZWRPdXRDb250ZW50c1NjYWxlKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV96b29tZWRPdXRDb250ZW50c1NjYWxlICogbV9kZXZpY2VTY2FsZUZhY3RvcjsK
K30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0Wm9vbWVkT3V0Q29udGVudHNTY2FsZShmbG9h
dCBzY2FsZSkKK3sKKyAgICBBU1NFUlQob3duaW5nR3JhcGhpY3NMYXllcigpLT5pc0NvbW1pdHRp
bmdDaGFuZ2VzKCkpOworCisgICAgZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IgPSBvd25pbmdHcmFw
aGljc0xheWVyKCktPnBsYXRmb3JtQ0FMYXllckRldmljZVNjYWxlRmFjdG9yKCk7CisgICAgc2Nh
bGUgLz0gZGV2aWNlU2NhbGVGYWN0b3I7CisKKyAgICBpZiAobV96b29tZWRPdXRDb250ZW50c1Nj
YWxlID09IHNjYWxlKQorICAgICAgICByZXR1cm47CisgICAgbV96b29tZWRPdXRDb250ZW50c1Nj
YWxlID0gc2NhbGU7CisKKyAgICBpZiAobV96b29tZWRPdXRUaWxlR3JpZCAmJiBtX3pvb21lZE91
dFRpbGVHcmlkLT5zY2FsZSgpICE9IG1fem9vbWVkT3V0Q29udGVudHNTY2FsZSkKKyAgICAgICAg
bV96b29tZWRPdXRUaWxlR3JpZCA9IG51bGxwdHI7Cit9CisKK3ZvaWQgVGlsZUNvbnRyb2xsZXI6
OnNldEFjY2VsZXJhdGVzRHJhd2luZyhib29sIGFjY2VsZXJhdGVzRHJhd2luZykKK3sKKyAgICBp
ZiAobV9hY2NlbGVyYXRlc0RyYXdpbmcgPT0gYWNjZWxlcmF0ZXNEcmF3aW5nKQorICAgICAgICBy
ZXR1cm47CisgICAgbV9hY2NlbGVyYXRlc0RyYXdpbmcgPSBhY2NlbGVyYXRlc0RyYXdpbmc7CisK
KyAgICB0aWxlR3JpZCgpLnVwZGF0ZVRpbGVMYXllclByb3BlcnRpZXMoKTsKK30KKwordm9pZCBU
aWxlQ29udHJvbGxlcjo6c2V0VGlsZXNPcGFxdWUoYm9vbCBvcGFxdWUpCit7CisgICAgaWYgKG9w
YXF1ZSA9PSBtX3RpbGVzQXJlT3BhcXVlKQorICAgICAgICByZXR1cm47CisgICAgbV90aWxlc0Fy
ZU9wYXF1ZSA9IG9wYXF1ZTsKKworICAgIHRpbGVHcmlkKCkudXBkYXRlVGlsZUxheWVyUHJvcGVy
dGllcygpOworfQorCit2b2lkIFRpbGVDb250cm9sbGVyOjpzZXRWaXNpYmxlUmVjdChjb25zdCBG
bG9hdFJlY3QmIHZpc2libGVSZWN0KQoreworICAgIEFTU0VSVChvd25pbmdHcmFwaGljc0xheWVy
KCktPmlzQ29tbWl0dGluZ0NoYW5nZXMoKSk7CisgICAgaWYgKG1fdmlzaWJsZVJlY3QgPT0gdmlz
aWJsZVJlY3QpCisgICAgICAgIHJldHVybjsKKworICAgIG1fdmlzaWJsZVJlY3QgPSB2aXNpYmxl
UmVjdDsKKyAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOworfQorCitib29sIFRpbGVDb250
cm9sbGVyOjp0aWxlc1dvdWxkQ2hhbmdlRm9yVmlzaWJsZVJlY3QoY29uc3QgRmxvYXRSZWN0JiBu
ZXdWaXNpYmxlUmVjdCkgY29uc3QKK3sKKyAgICBpZiAoYm91bmRzKCkuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRpbGVHcmlkKCkudGlsZXNXb3VsZENoYW5n
ZUZvclZpc2libGVSZWN0KG5ld1Zpc2libGVSZWN0LCBtX3Zpc2libGVSZWN0KTsKK30KKwordm9p
ZCBUaWxlQ29udHJvbGxlcjo6c2V0VG9wQ29udGVudEluc2V0KGZsb2F0IHRvcENvbnRlbnRJbnNl
dCkKK3sKKyAgICBtX3RvcENvbnRlbnRJbnNldCA9IHRvcENvbnRlbnRJbnNldDsKKyAgICBzZXRU
aWxlZFNjcm9sbGluZ0luZGljYXRvclBvc2l0aW9uKEZsb2F0UG9pbnQoMCwgbV90b3BDb250ZW50
SW5zZXQpKTsKK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0VGlsZWRTY3JvbGxpbmdJbmRp
Y2F0b3JQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50JiBwb3NpdGlvbikKK3sKKyAgICBpZiAoIW1f
Y292ZXJhZ2VNYXApCisgICAgICAgIHJldHVybjsKKyAgICBtX2NvdmVyYWdlTWFwLT5zZXRQb3Np
dGlvbihwb3NpdGlvbik7CisgICAgbV9jb3ZlcmFnZU1hcC0+dXBkYXRlKCk7Cit9CisKK3ZvaWQg
VGlsZUNvbnRyb2xsZXI6OnByZXBvcHVsYXRlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKHRpbGVHcmlkKCkucHJlcG9wdWxhdGVSZWN0KHJlY3QpKQorICAgICAgICBzZXRO
ZWVkc1JldmFsaWRhdGVUaWxlcygpOworfQorCit2b2lkIFRpbGVDb250cm9sbGVyOjpzZXRJc0lu
V2luZG93KGJvb2wgaXNJbldpbmRvdykKK3sKKyAgICBpZiAobV9pc0luV2luZG93ID09IGlzSW5X
aW5kb3cpCisgICAgICAgIHJldHVybjsKKworICAgIG1faXNJbldpbmRvdyA9IGlzSW5XaW5kb3c7
CisKKyAgICBpZiAobV9pc0luV2luZG93KQorICAgICAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxl
cygpOworICAgIGVsc2UgeworICAgICAgICBjb25zdCBkb3VibGUgdGlsZVJldmFsaWRhdGlvblRp
bWVvdXQgPSA0OworICAgICAgICBzY2hlZHVsZVRpbGVSZXZhbGlkYXRpb24odGlsZVJldmFsaWRh
dGlvblRpbWVvdXQpOworICAgIH0KK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0VGlsZUNv
dmVyYWdlKFRpbGVDb3ZlcmFnZSBjb3ZlcmFnZSkKK3sKKyAgICBpZiAoY292ZXJhZ2UgPT0gbV90
aWxlQ292ZXJhZ2UpCisgICAgICAgIHJldHVybjsKKworICAgIG1fdGlsZUNvdmVyYWdlID0gY292
ZXJhZ2U7CisgICAgc2V0TmVlZHNSZXZhbGlkYXRlVGlsZXMoKTsKK30KKwordm9pZCBUaWxlQ29u
dHJvbGxlcjo6cmV2YWxpZGF0ZVRpbGVzKCkKK3sKKyAgICBBU1NFUlQob3duaW5nR3JhcGhpY3NM
YXllcigpLT5pc0NvbW1pdHRpbmdDaGFuZ2VzKCkpOworICAgIHRpbGVHcmlkKCkucmV2YWxpZGF0
ZVRpbGVzKDApOworICAgIG1fdmlzaWJsZVJlY3RBdExhc3RSZXZhbGlkYXRlID0gbV92aXNpYmxl
UmVjdDsKK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6Zm9yY2VSZXBhaW50KCkKK3sKKyAgICBz
ZXROZWVkc0Rpc3BsYXkoKTsKK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0VGlsZURlYnVn
Qm9yZGVyV2lkdGgoZmxvYXQgYm9yZGVyV2lkdGgpCit7CisgICAgaWYgKG1fdGlsZURlYnVnQm9y
ZGVyV2lkdGggPT0gYm9yZGVyV2lkdGgpCisgICAgICAgIHJldHVybjsKKyAgICBtX3RpbGVEZWJ1
Z0JvcmRlcldpZHRoID0gYm9yZGVyV2lkdGg7CisKKyAgICB0aWxlR3JpZCgpLnVwZGF0ZVRpbGVM
YXllclByb3BlcnRpZXMoKTsKK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0VGlsZURlYnVn
Qm9yZGVyQ29sb3IoQ29sb3IgYm9yZGVyQ29sb3IpCit7CisgICAgaWYgKG1fdGlsZURlYnVnQm9y
ZGVyQ29sb3IgPT0gYm9yZGVyQ29sb3IpCisgICAgICAgIHJldHVybjsKKyAgICBtX3RpbGVEZWJ1
Z0JvcmRlckNvbG9yID0gYm9yZGVyQ29sb3I7CisKKyAgICB0aWxlR3JpZCgpLnVwZGF0ZVRpbGVM
YXllclByb3BlcnRpZXMoKTsKK30KKworSW50UmVjdCBUaWxlQ29udHJvbGxlcjo6Ym91bmRzKCkg
Y29uc3QKK3sKKyAgICBJbnRQb2ludCBib3VuZHNPcmlnaW5JbmNsdWRpbmdNYXJnaW4oLWxlZnRN
YXJnaW5XaWR0aCgpLCAtdG9wTWFyZ2luSGVpZ2h0KCkpOworICAgIEludFNpemUgYm91bmRzU2l6
ZUluY2x1ZGluZ01hcmdpbiA9IGV4cGFuZGVkSW50U2l6ZShtX3RpbGVDYWNoZUxheWVyLT5ib3Vu
ZHMoKS5zaXplKCkpOworICAgIGJvdW5kc1NpemVJbmNsdWRpbmdNYXJnaW4uZXhwYW5kKGxlZnRN
YXJnaW5XaWR0aCgpICsgcmlnaHRNYXJnaW5XaWR0aCgpLCB0b3BNYXJnaW5IZWlnaHQoKSArIGJv
dHRvbU1hcmdpbkhlaWdodCgpKTsKKworICAgIHJldHVybiBJbnRSZWN0KGJvdW5kc09yaWdpbklu
Y2x1ZGluZ01hcmdpbiwgYm91bmRzU2l6ZUluY2x1ZGluZ01hcmdpbik7Cit9CisKK0ludFJlY3Qg
VGlsZUNvbnRyb2xsZXI6OmJvdW5kc1dpdGhvdXRNYXJnaW4oKSBjb25zdAoreworICAgIHJldHVy
biBJbnRSZWN0KEludFBvaW50KCksIGV4cGFuZGVkSW50U2l6ZShtX3RpbGVDYWNoZUxheWVyLT5i
b3VuZHMoKS5zaXplKCkpKTsKK30KKworSW50UmVjdCBUaWxlQ29udHJvbGxlcjo6Ym91bmRzQXRM
YXN0UmV2YWxpZGF0ZVdpdGhvdXRNYXJnaW4oKSBjb25zdAoreworICAgIEludFJlY3QgYm91bmRz
V2l0aG91dE1hcmdpbiA9IEludFJlY3QoSW50UG9pbnQoKSwgbV9ib3VuZHNBdExhc3RSZXZhbGlk
YXRlLnNpemUoKSk7CisgICAgYm91bmRzV2l0aG91dE1hcmdpbi5jb250cmFjdChJbnRTaXplKGxl
ZnRNYXJnaW5XaWR0aCgpICsgcmlnaHRNYXJnaW5XaWR0aCgpLCB0b3BNYXJnaW5IZWlnaHQoKSAr
IGJvdHRvbU1hcmdpbkhlaWdodCgpKSk7CisgICAgcmV0dXJuIGJvdW5kc1dpdGhvdXRNYXJnaW47
Cit9CisKK0Zsb2F0UmVjdCBUaWxlQ29udHJvbGxlcjo6Y29tcHV0ZVRpbGVDb3ZlcmFnZVJlY3Qo
Y29uc3QgRmxvYXRSZWN0JiBwcmV2aW91c1Zpc2libGVSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHZp
c2libGVSZWN0KSBjb25zdAoreworICAgIC8vIElmIHRoZSBwYWdlIGlzIG5vdCBpbiBhIHdpbmRv
dyAoZm9yIGV4YW1wbGUgaWYgaXQncyBpbiBhIGJhY2tncm91bmQgdGFiKSwgd2UgbGltaXQgdGhl
IHRpbGUgY292ZXJhZ2UgcmVjdCB0byB0aGUgdmlzaWJsZSByZWN0LgorICAgIGlmICghbV9pc0lu
V2luZG93KQorICAgICAgICByZXR1cm4gdmlzaWJsZVJlY3Q7CisKKyAgICAvLyBGSVhNRTogbG9v
ayBhdCBob3cgZmFyIHRoZSBkb2N1bWVudCBjYW4gc2Nyb2xsIGluIGVhY2ggZGltZW5zaW9uLgor
ICAgIGZsb2F0IGNvdmVyYWdlSG9yaXpvbnRhbFNpemUgPSB2aXNpYmxlUmVjdC53aWR0aCgpOwor
ICAgIGZsb2F0IGNvdmVyYWdlVmVydGljYWxTaXplID0gdmlzaWJsZVJlY3QuaGVpZ2h0KCk7CisK
KyNpZiBQTEFURk9STShJT1MpCisgICAgVU5VU0VEX1BBUkFNKHByZXZpb3VzVmlzaWJsZVJlY3Qp
OworICAgIHJldHVybiB2aXNpYmxlUmVjdDsKKyNlbHNlCisgICAgYm9vbCBsYXJnZVZpc2libGVS
ZWN0Q2hhbmdlID0gIXByZXZpb3VzVmlzaWJsZVJlY3QuaXNFbXB0eSgpICYmICF2aXNpYmxlUmVj
dC5pbnRlcnNlY3RzKHByZXZpb3VzVmlzaWJsZVJlY3QpOworCisgICAgLy8gSW5mbGF0ZSB0aGUg
Y292ZXJhZ2UgcmVjdCBzbyB0aGF0IGl0IGNvdmVycyAyeCBvZiB0aGUgdmlzaWJsZSB3aWR0aCBh
bmQgM3ggb2YgdGhlIHZpc2libGUgaGVpZ2h0LgorICAgIC8vIFRoZXNlIHZhbHVlcyB3ZXJlIGNo
b3NlbiBiZWNhdXNlIGl0J3MgbW9yZSBjb21tb24gdG8gaGF2ZSB0YWxsIHBhZ2VzIGFuZCB0byBz
Y3JvbGwgdmVydGljYWxseSwKKyAgICAvLyBzbyB3ZSBrZWVwIG1vcmUgdGlsZXMgYWJvdmUgYW5k
IGJlbG93IHRoZSBjdXJyZW50IGFyZWEuCisKKyAgICBpZiAobV90aWxlQ292ZXJhZ2UgJiBDb3Zl
cmFnZUZvckhvcml6b250YWxTY3JvbGxpbmcgJiYgIWxhcmdlVmlzaWJsZVJlY3RDaGFuZ2UpCisg
ICAgICAgIGNvdmVyYWdlSG9yaXpvbnRhbFNpemUgKj0gMjsKKworICAgIGlmIChtX3RpbGVDb3Zl
cmFnZSAmIENvdmVyYWdlRm9yVmVydGljYWxTY3JvbGxpbmcgJiYgIWxhcmdlVmlzaWJsZVJlY3RD
aGFuZ2UpCisgICAgICAgIGNvdmVyYWdlVmVydGljYWxTaXplICo9IDM7CisjZW5kaWYKKyAgICBj
b3ZlcmFnZVZlcnRpY2FsU2l6ZSArPSB0b3BNYXJnaW5IZWlnaHQoKSArIGJvdHRvbU1hcmdpbkhl
aWdodCgpOworICAgIGNvdmVyYWdlSG9yaXpvbnRhbFNpemUgKz0gbGVmdE1hcmdpbldpZHRoKCkg
KyByaWdodE1hcmdpbldpZHRoKCk7CisKKyAgICBGbG9hdFJlY3QgY292ZXJhZ2VCb3VuZHMgPSBi
b3VuZHMoKTsKKyAgICBmbG9hdCBjb3ZlcmFnZUxlZnQgPSB2aXNpYmxlUmVjdC54KCkgLSAoY292
ZXJhZ2VIb3Jpem9udGFsU2l6ZSAtIHZpc2libGVSZWN0LndpZHRoKCkpIC8gMjsKKyAgICBjb3Zl
cmFnZUxlZnQgPSBzdGQ6Om1pbihjb3ZlcmFnZUxlZnQsIGNvdmVyYWdlQm91bmRzLm1heFgoKSAt
IGNvdmVyYWdlSG9yaXpvbnRhbFNpemUpOworICAgIGNvdmVyYWdlTGVmdCA9IHN0ZDo6bWF4KGNv
dmVyYWdlTGVmdCwgY292ZXJhZ2VCb3VuZHMueCgpKTsKKworICAgIGZsb2F0IGNvdmVyYWdlVG9w
ID0gdmlzaWJsZVJlY3QueSgpIC0gKGNvdmVyYWdlVmVydGljYWxTaXplIC0gdmlzaWJsZVJlY3Qu
aGVpZ2h0KCkpIC8gMjsKKyAgICBjb3ZlcmFnZVRvcCA9IHN0ZDo6bWluKGNvdmVyYWdlVG9wLCBj
b3ZlcmFnZUJvdW5kcy5tYXhZKCkgLSBjb3ZlcmFnZVZlcnRpY2FsU2l6ZSk7CisgICAgY292ZXJh
Z2VUb3AgPSBzdGQ6Om1heChjb3ZlcmFnZVRvcCwgY292ZXJhZ2VCb3VuZHMueSgpKTsKKworICAg
IHJldHVybiBGbG9hdFJlY3QoY292ZXJhZ2VMZWZ0LCBjb3ZlcmFnZVRvcCwgY292ZXJhZ2VIb3Jp
em9udGFsU2l6ZSwgY292ZXJhZ2VWZXJ0aWNhbFNpemUpOworfQorCit2b2lkIFRpbGVDb250cm9s
bGVyOjpzY2hlZHVsZVRpbGVSZXZhbGlkYXRpb24oZG91YmxlIGludGVydmFsKQoreworICAgIGlm
IChtX3RpbGVSZXZhbGlkYXRpb25UaW1lci5pc0FjdGl2ZSgpICYmIG1fdGlsZVJldmFsaWRhdGlv
blRpbWVyLm5leHRGaXJlSW50ZXJ2YWwoKSA8IGludGVydmFsKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX3RpbGVSZXZhbGlkYXRpb25UaW1lci5zdGFydE9uZVNob3QoaW50ZXJ2YWwpOworfQor
Citib29sIFRpbGVDb250cm9sbGVyOjpzaG91bGRBZ2dyZXNzaXZlbHlSZXRhaW5UaWxlcygpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVy
U2hvdWxkQWdncmVzc2l2ZWx5UmV0YWluVGlsZXMobV90aWxlQ2FjaGVMYXllcik7Cit9CisKK2Jv
b2wgVGlsZUNvbnRyb2xsZXI6OnNob3VsZFRlbXBvcmFyaWx5UmV0YWluVGlsZUNvaG9ydHMoKSBj
b25zdAoreworICAgIHJldHVybiBvd25pbmdHcmFwaGljc0xheWVyKCktPnBsYXRmb3JtQ0FMYXll
clNob3VsZFRlbXBvcmFyaWx5UmV0YWluVGlsZUNvaG9ydHMobV90aWxlQ2FjaGVMYXllcik7Cit9
CisKK3ZvaWQgVGlsZUNvbnRyb2xsZXI6OnRpbGVSZXZhbGlkYXRpb25UaW1lckZpcmVkKFRpbWVy
PFRpbGVDb250cm9sbGVyPiopCit7CisgICAgaWYgKCFvd25pbmdHcmFwaGljc0xheWVyKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2lzSW5XaW5kb3cpIHsKKyAgICAgICAgc2V0TmVl
ZHNSZXZhbGlkYXRlVGlsZXMoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZiB3
ZSBhcmUgbm90IHZpc2libGUgZ2V0IHJpZCBvZiB0aGUgem9vbWVkLW91dCB0aWxlcy4KKyAgICBt
X3pvb21lZE91dFRpbGVHcmlkID0gbnVsbHB0cjsKKworICAgIHVuc2lnbmVkIHZhbGlkYXRpb25Q
b2xpY3kgPSAoc2hvdWxkQWdncmVzc2l2ZWx5UmV0YWluVGlsZXMoKSA/IDAgOiBUaWxlR3JpZDo6
UHJ1bmVTZWNvbmRhcnlUaWxlcykgfCBUaWxlR3JpZDo6VW5wYXJlbnRBbGxUaWxlczsKKworICAg
IHRpbGVHcmlkKCkucmV2YWxpZGF0ZVRpbGVzKHZhbGlkYXRpb25Qb2xpY3kpOworfQorCit2b2lk
IFRpbGVDb250cm9sbGVyOjpkaWRSZXZhbGlkYXRlVGlsZXMoKQoreworICAgIG1fdmlzaWJsZVJl
Y3RBdExhc3RSZXZhbGlkYXRlID0gdmlzaWJsZVJlY3QoKTsKKyAgICBtX2JvdW5kc0F0TGFzdFJl
dmFsaWRhdGUgPSBib3VuZHMoKTsKKworICAgIHVwZGF0ZVRpbGVDb3ZlcmFnZU1hcCgpOworfQor
Cit1bnNpZ25lZCBUaWxlQ29udHJvbGxlcjo6YmxhbmtQaXhlbENvdW50KCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gdGlsZUdyaWQoKS5ibGFua1BpeGVsQ291bnQoKTsKK30KKwordW5zaWduZWQgVGls
ZUNvbnRyb2xsZXI6OmJsYW5rUGl4ZWxDb3VudEZvclRpbGVzKGNvbnN0IFBsYXRmb3JtTGF5ZXJM
aXN0JiB0aWxlcywgY29uc3QgRmxvYXRSZWN0JiB2aXNpYmxlUmVjdCwgY29uc3QgSW50UG9pbnQm
IHRpbGVUcmFuc2xhdGlvbikKK3sKKyAgICBSZWdpb24gcGFpbnRlZFZpc2libGVUaWxlczsKKwor
ICAgIGZvciAoUGxhdGZvcm1MYXllckxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGlsZXMuYmVn
aW4oKSwgZW5kID0gdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBjb25z
dCBQbGF0Zm9ybUxheWVyKiB0aWxlTGF5ZXIgPSBpdC0+Z2V0KCk7CisKKyAgICAgICAgRmxvYXRS
ZWN0IHZpc2libGVQYXJ0KENHUmVjdE9mZnNldChbdGlsZUxheWVyIGZyYW1lXSwgdGlsZVRyYW5z
bGF0aW9uLngoKSwgdGlsZVRyYW5zbGF0aW9uLnkoKSkpOworICAgICAgICB2aXNpYmxlUGFydC5p
bnRlcnNlY3QodmlzaWJsZVJlY3QpOworCisgICAgICAgIGlmICghdmlzaWJsZVBhcnQuaXNFbXB0
eSgpKQorICAgICAgICAgICAgcGFpbnRlZFZpc2libGVUaWxlcy51bml0ZShlbmNsb3NpbmdJbnRS
ZWN0KHZpc2libGVQYXJ0KSk7CisgICAgfQorCisgICAgUmVnaW9uIHVuY292ZXJlZFJlZ2lvbihl
bmNsb3NpbmdJbnRSZWN0KHZpc2libGVSZWN0KSk7CisgICAgdW5jb3ZlcmVkUmVnaW9uLnN1YnRy
YWN0KHBhaW50ZWRWaXNpYmxlVGlsZXMpOworCisgICAgcmV0dXJuIHVuY292ZXJlZFJlZ2lvbi50
b3RhbEFyZWEoKTsKK30KKwordm9pZCBUaWxlQ29udHJvbGxlcjo6c2V0TmVlZHNSZXZhbGlkYXRl
VGlsZXMoKQoreworICAgIG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyU2V0
TmVlZHNUb1JldmFsaWRhdGVUaWxlcygpOworfQorCit2b2lkIFRpbGVDb250cm9sbGVyOjp1cGRh
dGVUaWxlQ292ZXJhZ2VNYXAoKQoreworICAgIGlmIChtX2NvdmVyYWdlTWFwKQorICAgICAgICBt
X2NvdmVyYWdlTWFwLT51cGRhdGUoKTsKK30KKworSW50UmVjdCBUaWxlQ29udHJvbGxlcjo6dGls
ZUdyaWRFeHRlbnQoKSBjb25zdAoreworICAgIHJldHVybiB0aWxlR3JpZCgpLmV4dGVudCgpOwor
fQorCitkb3VibGUgVGlsZUNvbnRyb2xsZXI6OnJldGFpbmVkVGlsZUJhY2tpbmdTdG9yZU1lbW9y
eSgpIGNvbnN0Cit7CisgICAgZG91YmxlIGJ5dGVzID0gdGlsZUdyaWQoKS5yZXRhaW5lZFRpbGVC
YWNraW5nU3RvcmVNZW1vcnkoKTsKKyAgICBpZiAobV96b29tZWRPdXRUaWxlR3JpZCkKKyAgICAg
ICAgYnl0ZXMgKz0gbV96b29tZWRPdXRUaWxlR3JpZC0+cmV0YWluZWRUaWxlQmFja2luZ1N0b3Jl
TWVtb3J5KCk7CisgICAgcmV0dXJuIGJ5dGVzOworfQorCisvLyBSZXR1cm4gdGhlIHJlY3QgaW4g
bGF5ZXIgY29vcmRzLCBub3QgdGlsZSBjb29yZHMuCitJbnRSZWN0IFRpbGVDb250cm9sbGVyOjp0
aWxlQ292ZXJhZ2VSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdGlsZUdyaWQoKS50aWxlQ292
ZXJhZ2VSZWN0KCk7Cit9CisKK1BsYXRmb3JtQ0FMYXllciogVGlsZUNvbnRyb2xsZXI6OnRpbGVk
U2Nyb2xsaW5nSW5kaWNhdG9yTGF5ZXIoKQoreworICAgIGlmICghbV9jb3ZlcmFnZU1hcCkKKyAg
ICAgICAgbV9jb3ZlcmFnZU1hcCA9IHN0ZDo6bWFrZV91bmlxdWU8VGlsZUNvdmVyYWdlTWFwPigq
dGhpcyk7CisKKyAgICByZXR1cm4gJm1fY292ZXJhZ2VNYXAtPmxheWVyKCk7Cit9CisKK3ZvaWQg
VGlsZUNvbnRyb2xsZXI6OnNldFNjcm9sbGluZ01vZGVJbmRpY2F0aW9uKFNjcm9sbGluZ01vZGVJ
bmRpY2F0aW9uIHNjcm9sbGluZ01vZGUpCit7CisgICAgaWYgKHNjcm9sbGluZ01vZGUgPT0gbV9p
bmRpY2F0b3JNb2RlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2luZGljYXRvck1vZGUgPSBz
Y3JvbGxpbmdNb2RlOworCisgICAgdXBkYXRlVGlsZUNvdmVyYWdlTWFwKCk7Cit9CisKK3ZvaWQg
VGlsZUNvbnRyb2xsZXI6OnNldFRpbGVNYXJnaW5zKGludCBtYXJnaW5Ub3AsIGludCBtYXJnaW5C
b3R0b20sIGludCBtYXJnaW5MZWZ0LCBpbnQgbWFyZ2luUmlnaHQpCit7CisgICAgbV9tYXJnaW5U
b3AgPSBtYXJnaW5Ub3A7CisgICAgbV9tYXJnaW5Cb3R0b20gPSBtYXJnaW5Cb3R0b207CisgICAg
bV9tYXJnaW5MZWZ0ID0gbWFyZ2luTGVmdDsKKyAgICBtX21hcmdpblJpZ2h0ID0gbWFyZ2luUmln
aHQ7CisKKyAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOworfQorCitib29sIFRpbGVDb250
cm9sbGVyOjpoYXNNYXJnaW5zKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9tYXJnaW5Ub3AgfHwg
bV9tYXJnaW5Cb3R0b20gfHwgbV9tYXJnaW5MZWZ0IHx8IG1fbWFyZ2luUmlnaHQ7Cit9CisKK2Jv
b2wgVGlsZUNvbnRyb2xsZXI6Omhhc0hvcml6b250YWxNYXJnaW5zKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9tYXJnaW5MZWZ0IHx8IG1fbWFyZ2luUmlnaHQ7Cit9CisKK2Jvb2wgVGlsZUNvbnRy
b2xsZXI6Omhhc1ZlcnRpY2FsTWFyZ2lucygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWFyZ2lu
VG9wIHx8IG1fbWFyZ2luQm90dG9tOworfQorCitpbnQgVGlsZUNvbnRyb2xsZXI6OnRvcE1hcmdp
bkhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbWFyZ2luVG9wIC8gdGlsZUdyaWQoKS5z
Y2FsZSgpOworfQorCitpbnQgVGlsZUNvbnRyb2xsZXI6OmJvdHRvbU1hcmdpbkhlaWdodCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fbWFyZ2luQm90dG9tIC8gdGlsZUdyaWQoKS5zY2FsZSgpOwor
fQorCitpbnQgVGlsZUNvbnRyb2xsZXI6OmxlZnRNYXJnaW5XaWR0aCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fbWFyZ2luTGVmdCAvIHRpbGVHcmlkKCkuc2NhbGUoKTsKK30KKworaW50IFRpbGVD
b250cm9sbGVyOjpyaWdodE1hcmdpbldpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9tYXJn
aW5SaWdodCAvIHRpbGVHcmlkKCkuc2NhbGUoKTsKK30KKworUmVmUHRyPFBsYXRmb3JtQ0FMYXll
cj4gVGlsZUNvbnRyb2xsZXI6OmNyZWF0ZVRpbGVMYXllcihjb25zdCBJbnRSZWN0JiB0aWxlUmVj
dCwgVGlsZUdyaWQmIGdyaWQpCit7CisgICAgUmVmUHRyPFBsYXRmb3JtQ0FMYXllcj4gbGF5ZXIg
PSBMYXllclBvb2w6OnNoYXJlZFBvb2woKS0+dGFrZUxheWVyV2l0aFNpemUodGlsZVJlY3Quc2l6
ZSgpKTsKKworICAgIGlmIChsYXllcikKKyAgICAgICAgbGF5ZXItPnNldE93bmVyKCZncmlkKTsK
KyAgICBlbHNlCisgICAgICAgIGxheWVyID0gbV90aWxlQ2FjaGVMYXllci0+Y3JlYXRlQ29tcGF0
aWJsZUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlVGlsZWRCYWNraW5nVGlsZUxheWVy
LCAmZ3JpZCk7CisKKyAgICBsYXllci0+c2V0QW5jaG9yUG9pbnQoRmxvYXRQb2ludDNEKCkpOwor
ICAgIGxheWVyLT5zZXRCb3VuZHMoRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgdGlsZVJlY3Quc2l6
ZSgpKSk7CisgICAgbGF5ZXItPnNldFBvc2l0aW9uKHRpbGVSZWN0LmxvY2F0aW9uKCkpOworICAg
IGxheWVyLT5zZXRCb3JkZXJDb2xvcihtX3RpbGVEZWJ1Z0JvcmRlckNvbG9yKTsKKyAgICBsYXll
ci0+c2V0Qm9yZGVyV2lkdGgobV90aWxlRGVidWdCb3JkZXJXaWR0aCk7CisgICAgbGF5ZXItPnNl
dEVkZ2VBbnRpYWxpYXNpbmdNYXNrKDApOworICAgIGxheWVyLT5zZXRPcGFxdWUobV90aWxlc0Fy
ZU9wYXF1ZSk7CisjaWZuZGVmIE5ERUJVRworICAgIGxheWVyLT5zZXROYW1lKCJUaWxlIik7Cisj
ZW5kaWYKKworICAgIGZsb2F0IHRlbXBvcmFyeVNjYWxlRmFjdG9yID0gb3duaW5nR3JhcGhpY3NM
YXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJDb250ZW50c1NjYWxlTXVsdGlwbGllckZvck5ld1RpbGVz
KG1fdGlsZUNhY2hlTGF5ZXIpOworICAgIG1faGFzVGlsZXNXaXRoVGVtcG9yYXJ5U2NhbGVGYWN0
b3IgfD0gdGVtcG9yYXJ5U2NhbGVGYWN0b3IgIT0gMTsKKworICAgIGxheWVyLT5zZXRDb250ZW50
c1NjYWxlKG1fZGV2aWNlU2NhbGVGYWN0b3IgKiB0ZW1wb3JhcnlTY2FsZUZhY3Rvcik7CisgICAg
bGF5ZXItPnNldEFjY2VsZXJhdGVzRHJhd2luZyhtX2FjY2VsZXJhdGVzRHJhd2luZyk7CisKKyAg
ICBsYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisKKyAgICByZXR1cm4gbGF5ZXI7Cit9CisKK1Zl
Y3RvcjxSZWZQdHI8UGxhdGZvcm1DQUxheWVyPj4gVGlsZUNvbnRyb2xsZXI6OmNvbnRhaW5lckxh
eWVycygpCit7CisgICAgVmVjdG9yPFJlZlB0cjxQbGF0Zm9ybUNBTGF5ZXI+PiBsYXllckxpc3Q7
CisgICAgaWYgKG1fem9vbWVkT3V0VGlsZUdyaWQpCisgICAgICAgIGxheWVyTGlzdC5hcHBlbmQo
Jm1fem9vbWVkT3V0VGlsZUdyaWQtPmNvbnRhaW5lckxheWVyKCkpOworICAgIGxheWVyTGlzdC5h
cHBlbmQoJnRpbGVHcmlkKCkuY29udGFpbmVyTGF5ZXIoKSk7CisgICAgcmV0dXJuIGxheWVyTGlz
dDsKK30KKworI2lmIFBMQVRGT1JNKElPUykKK3Vuc2lnbmVkIFRpbGVDb250cm9sbGVyOjpudW1i
ZXJPZlVucGFyZW50ZWRUaWxlcygpIGNvbnN0Cit7CisgICAgdW5zaWduZWQgY291bnQgPSB0aWxl
R3JpZCgpLm51bWJlck9mVW5wYXJlbnRlZFRpbGVzKCk7CisgICAgaWYgKG1fem9vbWVkT3V0VGls
ZUdyaWQpCisgICAgICAgIGNvdW50ICs9IG1fem9vbWVkT3V0VGlsZUdyaWQtPm51bWJlck9mVW5w
YXJlbnRlZFRpbGVzKCk7CisgICAgcmV0dXJuIGNvdW50OworfQorCit2b2lkIFRpbGVDb250cm9s
bGVyOjpyZW1vdmVVbnBhcmVudGVkVGlsZXNOb3coKQoreworICAgIHRpbGVHcmlkKCkucmVtb3Zl
VW5wYXJlbnRlZFRpbGVzTm93KCk7CisgICAgaWYgKG1fem9vbWVkT3V0VGlsZUdyaWQpCisgICAg
ICAgIG1fem9vbWVkT3V0VGlsZUdyaWQtPnJlbW92ZVVucGFyZW50ZWRUaWxlc05vdygpOworCisg
ICAgdXBkYXRlVGlsZUNvdmVyYWdlTWFwKCk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFjL1Rp
bGVDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jYS9tYWMvVGlsZUNvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYS9tYWMvVGlsZUNvbnRyb2xsZXIuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwg
MjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTEtMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTIzLDIxICsyMywyMSBAQAogICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbXBvcnQgImNvbmZpZy5oIgotI2ltcG9ydCAi
VGlsZUNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJUaWxlQ29u
dHJvbGxlci5oIgogCi0jaW1wb3J0ICJJbnRSZWN0LmgiCi0jaW1wb3J0ICJQbGF0Zm9ybUNBTGF5
ZXIuaCIKLSNpbXBvcnQgIlJlZ2lvbi5oIgotI2ltcG9ydCAiVGlsZUNvdmVyYWdlTWFwLmgiCi0j
aW1wb3J0ICJUaWxlR3JpZC5oIgotI2ltcG9ydCAiV2ViTGF5ZXIuaCIKLSNpbXBvcnQgIkxheWVy
UG9vbC5oIgotI2ltcG9ydCA8d3RmL01haW5UaHJlYWQuaD4KLSNpbXBvcnQgPHV0aWxpdHk+Cisj
aW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIkxheWVyUG9vbC5oIgorI2luY2x1ZGUgIlBs
YXRmb3JtQ0FMYXllci5oIgorI2luY2x1ZGUgIlJlZ2lvbi5oIgorI2luY2x1ZGUgIlRpbGVDb3Zl
cmFnZU1hcC5oIgorI2luY2x1ZGUgIlRpbGVHcmlkLmgiCisjaW5jbHVkZSAiV2ViTGF5ZXIuaCIK
KyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CiAKICNpZiBQ
TEFURk9STShJT1MpCi0jaW1wb3J0ICJUaWxlQ29udHJvbGxlck1lbW9yeUhhbmRsZXJJT1MuaCIK
KyNpbmNsdWRlICJUaWxlQ29udHJvbGxlck1lbW9yeUhhbmRsZXJJT1MuaCIKICNlbmRpZgogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CkBAIC0zODMsNyArMzgzLDcgQEAgdW5zaWduZWQgVGlsZUNvbnRy
b2xsZXI6OmJsYW5rUGl4ZWxDb3VudAogICAgIGZvciAoUGxhdGZvcm1MYXllckxpc3Q6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gdGlsZXMuYmVnaW4oKSwgZW5kID0gdGlsZXMuZW5kKCk7IGl0ICE9IGVu
ZDsgKytpdCkgewogICAgICAgICBjb25zdCBQbGF0Zm9ybUxheWVyKiB0aWxlTGF5ZXIgPSBpdC0+
Z2V0KCk7CiAKLSAgICAgICAgRmxvYXRSZWN0IHZpc2libGVQYXJ0KENHUmVjdE9mZnNldChbdGls
ZUxheWVyIGZyYW1lXSwgdGlsZVRyYW5zbGF0aW9uLngoKSwgdGlsZVRyYW5zbGF0aW9uLnkoKSkp
OworICAgICAgICBGbG9hdFJlY3QgdmlzaWJsZVBhcnQoQ0dSZWN0T2Zmc2V0KGZyYW1lRm9yTGF5
ZXIodGlsZUxheWVyKSwgdGlsZVRyYW5zbGF0aW9uLngoKSwgdGlsZVRyYW5zbGF0aW9uLnkoKSkp
OwogICAgICAgICB2aXNpYmxlUGFydC5pbnRlcnNlY3QodmlzaWJsZVJlY3QpOwogCiAgICAgICAg
IGlmICghdmlzaWJsZVBhcnQuaXNFbXB0eSgpKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2EvbWFjL1RpbGVDb250cm9sbGVyLm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlQ29udHJvbGxlci5tbQkocmV2
aXNpb24gMTY5ODA5KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFj
L1RpbGVDb250cm9sbGVyLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xLDU1MSArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgot
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2ltcG9ydCAiY29uZmlnLmgiCi0jaW1wb3J0ICJUaWxlQ29u
dHJvbGxlci5oIgotCi0jaW1wb3J0ICJJbnRSZWN0LmgiCi0jaW1wb3J0ICJQbGF0Zm9ybUNBTGF5
ZXIuaCIKLSNpbXBvcnQgIlJlZ2lvbi5oIgotI2ltcG9ydCAiVGlsZUNvdmVyYWdlTWFwLmgiCi0j
aW1wb3J0ICJUaWxlR3JpZC5oIgotI2ltcG9ydCAiV2ViTGF5ZXIuaCIKLSNpbXBvcnQgIkxheWVy
UG9vbC5oIgotI2ltcG9ydCA8d3RmL01haW5UaHJlYWQuaD4KLSNpbXBvcnQgPHV0aWxpdHk+Ci0K
LSNpZiBQTEFURk9STShJT1MpCi0jaW1wb3J0ICJUaWxlQ29udHJvbGxlck1lbW9yeUhhbmRsZXJJ
T1MuaCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLVBhc3NPd25QdHI8VGlsZUNv
bnRyb2xsZXI+IFRpbGVDb250cm9sbGVyOjpjcmVhdGUoUGxhdGZvcm1DQUxheWVyKiByb290UGxh
dGZvcm1MYXllcikKLXsKLSAgICByZXR1cm4gYWRvcHRQdHIobmV3IFRpbGVDb250cm9sbGVyKHJv
b3RQbGF0Zm9ybUxheWVyKSk7Ci19Ci0KLVRpbGVDb250cm9sbGVyOjpUaWxlQ29udHJvbGxlcihQ
bGF0Zm9ybUNBTGF5ZXIqIHJvb3RQbGF0Zm9ybUxheWVyKQotICAgIDogbV90aWxlQ2FjaGVMYXll
cihyb290UGxhdGZvcm1MYXllcikKLSAgICAsIG1fdGlsZUdyaWQoc3RkOjptYWtlX3VuaXF1ZTxU
aWxlR3JpZD4oKnRoaXMpKQotICAgICwgbV90aWxlU2l6ZShkZWZhdWx0VGlsZVdpZHRoLCBkZWZh
dWx0VGlsZUhlaWdodCkKLSAgICAsIG1fdGlsZVJldmFsaWRhdGlvblRpbWVyKHRoaXMsICZUaWxl
Q29udHJvbGxlcjo6dGlsZVJldmFsaWRhdGlvblRpbWVyRmlyZWQpCi0gICAgLCBtX3pvb21lZE91
dENvbnRlbnRzU2NhbGUoMCkKLSAgICAsIG1fZGV2aWNlU2NhbGVGYWN0b3Iob3duaW5nR3JhcGhp
Y3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJEZXZpY2VTY2FsZUZhY3RvcigpKQotICAgICwgbV90
aWxlQ292ZXJhZ2UoQ292ZXJhZ2VGb3JWaXNpYmxlQXJlYSkKLSAgICAsIG1fbWFyZ2luVG9wKDAp
Ci0gICAgLCBtX21hcmdpbkJvdHRvbSgwKQotICAgICwgbV9tYXJnaW5MZWZ0KDApCi0gICAgLCBt
X21hcmdpblJpZ2h0KDApCi0gICAgLCBtX2lzSW5XaW5kb3coZmFsc2UpCi0gICAgLCBtX3Njcm9s
bGluZ1BlcmZvcm1hbmNlTG9nZ2luZ0VuYWJsZWQoZmFsc2UpCi0gICAgLCBtX3VucGFyZW50c09m
ZnNjcmVlblRpbGVzKGZhbHNlKQotICAgICwgbV9hY2NlbGVyYXRlc0RyYXdpbmcoZmFsc2UpCi0g
ICAgLCBtX3RpbGVzQXJlT3BhcXVlKGZhbHNlKQotICAgICwgbV9oYXNUaWxlc1dpdGhUZW1wb3Jh
cnlTY2FsZUZhY3RvcihmYWxzZSkKLSAgICAsIG1fdGlsZURlYnVnQm9yZGVyV2lkdGgoMCkKLSAg
ICAsIG1faW5kaWNhdG9yTW9kZShBc3luY1Njcm9sbGluZ0luZGljYXRpb24pCi0gICAgLCBtX3Rv
cENvbnRlbnRJbnNldCgwKQotewotfQotCi1UaWxlQ29udHJvbGxlcjo6flRpbGVDb250cm9sbGVy
KCkKLXsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwotCi0jaWYgUExBVEZPUk0oSU9TKQot
ICAgIHRpbGVDb250cm9sbGVyTWVtb3J5SGFuZGxlcigpLnJlbW92ZVRpbGVDb250cm9sbGVyKHRo
aXMpOwotI2VuZGlmCi19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnRpbGVDYWNoZUxheWVyQm91
bmRzQ2hhbmdlZCgpCi17Ci0gICAgQVNTRVJUKG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+aXNDb21t
aXR0aW5nQ2hhbmdlcygpKTsKLSAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOwotfQotCi12
b2lkIFRpbGVDb250cm9sbGVyOjpzZXROZWVkc0Rpc3BsYXkoKQotewotICAgIHRpbGVHcmlkKCku
c2V0TmVlZHNEaXNwbGF5KCk7Ci0gICAgbV96b29tZWRPdXRUaWxlR3JpZCA9IG51bGxwdHI7Ci19
Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBJbnRS
ZWN0JiByZWN0KQotewotICAgIHRpbGVHcmlkKCkuc2V0TmVlZHNEaXNwbGF5SW5SZWN0KHJlY3Qp
OwotICAgIGlmIChtX3pvb21lZE91dFRpbGVHcmlkKQotICAgICAgICBtX3pvb21lZE91dFRpbGVH
cmlkLT5kcm9wVGlsZXNJblJlY3QocmVjdCk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNl
dENvbnRlbnRzU2NhbGUoZmxvYXQgc2NhbGUpCi17Ci0gICAgQVNTRVJUKG93bmluZ0dyYXBoaWNz
TGF5ZXIoKS0+aXNDb21taXR0aW5nQ2hhbmdlcygpKTsKLQotICAgIGZsb2F0IGRldmljZVNjYWxl
RmFjdG9yID0gb3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJEZXZpY2VTY2Fs
ZUZhY3RvcigpOwotICAgIC8vIFRoZSBzY2FsZSB3ZSBnZXQgaXMgdGhlIHByb2R1Y3Qgb2YgdGhl
IHBhZ2Ugc2NhbGUgZmFjdG9yIGFuZCBkZXZpY2Ugc2NhbGUgZmFjdG9yLgotICAgIC8vIERpdmlk
ZSBieSB0aGUgZGV2aWNlIHNjYWxlIGZhY3RvciBzbyB3ZSdsbCBnZXQgdGhlIHBhZ2Ugc2NhbGUg
ZmFjdG9yLgotICAgIHNjYWxlIC89IGRldmljZVNjYWxlRmFjdG9yOwotCi0gICAgaWYgKHRpbGVH
cmlkKCkuc2NhbGUoKSA9PSBzY2FsZSAmJiBtX2RldmljZVNjYWxlRmFjdG9yID09IGRldmljZVNj
YWxlRmFjdG9yICYmICFtX2hhc1RpbGVzV2l0aFRlbXBvcmFyeVNjYWxlRmFjdG9yKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBtX2hhc1RpbGVzV2l0aFRlbXBvcmFyeVNjYWxlRmFjdG9yID0gZmFs
c2U7Ci0gICAgbV9kZXZpY2VTY2FsZUZhY3RvciA9IGRldmljZVNjYWxlRmFjdG9yOwotCi0gICAg
aWYgKG1fY292ZXJhZ2VNYXApCi0gICAgICAgIG1fY292ZXJhZ2VNYXAtPnNldERldmljZVNjYWxl
RmFjdG9yKGRldmljZVNjYWxlRmFjdG9yKTsKLQotICAgIGlmIChtX3pvb21lZE91dFRpbGVHcmlk
ICYmIG1fem9vbWVkT3V0VGlsZUdyaWQtPnNjYWxlKCkgPT0gc2NhbGUpIHsKLSAgICAgICAgbV90
aWxlR3JpZCA9IHN0ZDo6bW92ZShtX3pvb21lZE91dFRpbGVHcmlkKTsKLSAgICAgICAgbV90aWxl
R3JpZC0+cmV2YWxpZGF0ZVRpbGVzKDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
aWYgKG1fem9vbWVkT3V0Q29udGVudHNTY2FsZSAmJiBtX3pvb21lZE91dENvbnRlbnRzU2NhbGUg
PT0gdGlsZUdyaWQoKS5zY2FsZSgpICYmIHRpbGVHcmlkKCkuc2NhbGUoKSAhPSBzY2FsZSAmJiAh
bV9oYXNUaWxlc1dpdGhUZW1wb3JhcnlTY2FsZUZhY3RvcikgewotICAgICAgICBtX3pvb21lZE91
dFRpbGVHcmlkID0gc3RkOjptb3ZlKG1fdGlsZUdyaWQpOwotICAgICAgICBtX3RpbGVHcmlkID0g
c3RkOjptYWtlX3VuaXF1ZTxUaWxlR3JpZD4oKnRoaXMpOwotICAgIH0KLQotICAgIHRpbGVHcmlk
KCkuc2V0U2NhbGUoc2NhbGUpOwotICAgIHRpbGVHcmlkKCkuc2V0TmVlZHNEaXNwbGF5KCk7Ci19
Ci0KLWZsb2F0IFRpbGVDb250cm9sbGVyOjpjb250ZW50c1NjYWxlKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gdGlsZUdyaWQoKS5zY2FsZSgpICogbV9kZXZpY2VTY2FsZUZhY3RvcjsKLX0KLQotZmxv
YXQgVGlsZUNvbnRyb2xsZXI6Onpvb21lZE91dENvbnRlbnRzU2NhbGUoKSBjb25zdAotewotICAg
IHJldHVybiBtX3pvb21lZE91dENvbnRlbnRzU2NhbGUgKiBtX2RldmljZVNjYWxlRmFjdG9yOwot
fQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXRab29tZWRPdXRDb250ZW50c1NjYWxlKGZsb2F0
IHNjYWxlKQotewotICAgIEFTU0VSVChvd25pbmdHcmFwaGljc0xheWVyKCktPmlzQ29tbWl0dGlu
Z0NoYW5nZXMoKSk7Ci0KLSAgICBmbG9hdCBkZXZpY2VTY2FsZUZhY3RvciA9IG93bmluZ0dyYXBo
aWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVyRGV2aWNlU2NhbGVGYWN0b3IoKTsKLSAgICBzY2Fs
ZSAvPSBkZXZpY2VTY2FsZUZhY3RvcjsKLQotICAgIGlmIChtX3pvb21lZE91dENvbnRlbnRzU2Nh
bGUgPT0gc2NhbGUpCi0gICAgICAgIHJldHVybjsKLSAgICBtX3pvb21lZE91dENvbnRlbnRzU2Nh
bGUgPSBzY2FsZTsKLQotICAgIGlmIChtX3pvb21lZE91dFRpbGVHcmlkICYmIG1fem9vbWVkT3V0
VGlsZUdyaWQtPnNjYWxlKCkgIT0gbV96b29tZWRPdXRDb250ZW50c1NjYWxlKQotICAgICAgICBt
X3pvb21lZE91dFRpbGVHcmlkID0gbnVsbHB0cjsKLX0KLQotdm9pZCBUaWxlQ29udHJvbGxlcjo6
c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKGJvb2wgYWNjZWxlcmF0ZXNEcmF3aW5nKQotewotICAgIGlm
IChtX2FjY2VsZXJhdGVzRHJhd2luZyA9PSBhY2NlbGVyYXRlc0RyYXdpbmcpCi0gICAgICAgIHJl
dHVybjsKLSAgICBtX2FjY2VsZXJhdGVzRHJhd2luZyA9IGFjY2VsZXJhdGVzRHJhd2luZzsKLQot
ICAgIHRpbGVHcmlkKCkudXBkYXRlVGlsZUxheWVyUHJvcGVydGllcygpOwotfQotCi12b2lkIFRp
bGVDb250cm9sbGVyOjpzZXRUaWxlc09wYXF1ZShib29sIG9wYXF1ZSkKLXsKLSAgICBpZiAob3Bh
cXVlID09IG1fdGlsZXNBcmVPcGFxdWUpCi0gICAgICAgIHJldHVybjsKLSAgICBtX3RpbGVzQXJl
T3BhcXVlID0gb3BhcXVlOwotCi0gICAgdGlsZUdyaWQoKS51cGRhdGVUaWxlTGF5ZXJQcm9wZXJ0
aWVzKCk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldFZpc2libGVSZWN0KGNvbnN0IEZs
b2F0UmVjdCYgdmlzaWJsZVJlY3QpCi17Ci0gICAgQVNTRVJUKG93bmluZ0dyYXBoaWNzTGF5ZXIo
KS0+aXNDb21taXR0aW5nQ2hhbmdlcygpKTsKLSAgICBpZiAobV92aXNpYmxlUmVjdCA9PSB2aXNp
YmxlUmVjdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV92aXNpYmxlUmVjdCA9IHZpc2libGVS
ZWN0OwotICAgIHNldE5lZWRzUmV2YWxpZGF0ZVRpbGVzKCk7Ci19Ci0KLWJvb2wgVGlsZUNvbnRy
b2xsZXI6OnRpbGVzV291bGRDaGFuZ2VGb3JWaXNpYmxlUmVjdChjb25zdCBGbG9hdFJlY3QmIG5l
d1Zpc2libGVSZWN0KSBjb25zdAotewotICAgIGlmIChib3VuZHMoKS5pc0VtcHR5KCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdGlsZUdyaWQoKS50aWxlc1dvdWxkQ2hhbmdl
Rm9yVmlzaWJsZVJlY3QobmV3VmlzaWJsZVJlY3QsIG1fdmlzaWJsZVJlY3QpOwotfQotCi12b2lk
IFRpbGVDb250cm9sbGVyOjpzZXRUb3BDb250ZW50SW5zZXQoZmxvYXQgdG9wQ29udGVudEluc2V0
KQotewotICAgIG1fdG9wQ29udGVudEluc2V0ID0gdG9wQ29udGVudEluc2V0OwotICAgIHNldFRp
bGVkU2Nyb2xsaW5nSW5kaWNhdG9yUG9zaXRpb24oRmxvYXRQb2ludCgwLCBtX3RvcENvbnRlbnRJ
bnNldCkpOwotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXRUaWxlZFNjcm9sbGluZ0luZGlj
YXRvclBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIHBvc2l0aW9uKQotewotICAgIGlmICghbV9j
b3ZlcmFnZU1hcCkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fY292ZXJhZ2VNYXAtPnNldFBvc2l0
aW9uKHBvc2l0aW9uKTsKLSAgICBtX2NvdmVyYWdlTWFwLT51cGRhdGUoKTsKLX0KLQotdm9pZCBU
aWxlQ29udHJvbGxlcjo6cHJlcG9wdWxhdGVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKLXsK
LSAgICBpZiAodGlsZUdyaWQoKS5wcmVwb3B1bGF0ZVJlY3QocmVjdCkpCi0gICAgICAgIHNldE5l
ZWRzUmV2YWxpZGF0ZVRpbGVzKCk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnNldElzSW5X
aW5kb3coYm9vbCBpc0luV2luZG93KQotewotICAgIGlmIChtX2lzSW5XaW5kb3cgPT0gaXNJbldp
bmRvdykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9pc0luV2luZG93ID0gaXNJbldpbmRvdzsK
LQotICAgIGlmIChtX2lzSW5XaW5kb3cpCi0gICAgICAgIHNldE5lZWRzUmV2YWxpZGF0ZVRpbGVz
KCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSB0aWxlUmV2YWxpZGF0aW9uVGlt
ZW91dCA9IDQ7Ci0gICAgICAgIHNjaGVkdWxlVGlsZVJldmFsaWRhdGlvbih0aWxlUmV2YWxpZGF0
aW9uVGltZW91dCk7Ci0gICAgfQotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXRUaWxlQ292
ZXJhZ2UoVGlsZUNvdmVyYWdlIGNvdmVyYWdlKQotewotICAgIGlmIChjb3ZlcmFnZSA9PSBtX3Rp
bGVDb3ZlcmFnZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV90aWxlQ292ZXJhZ2UgPSBjb3Zl
cmFnZTsKLSAgICBzZXROZWVkc1JldmFsaWRhdGVUaWxlcygpOwotfQotCi12b2lkIFRpbGVDb250
cm9sbGVyOjpyZXZhbGlkYXRlVGlsZXMoKQotewotICAgIEFTU0VSVChvd25pbmdHcmFwaGljc0xh
eWVyKCktPmlzQ29tbWl0dGluZ0NoYW5nZXMoKSk7Ci0gICAgdGlsZUdyaWQoKS5yZXZhbGlkYXRl
VGlsZXMoMCk7Ci0gICAgbV92aXNpYmxlUmVjdEF0TGFzdFJldmFsaWRhdGUgPSBtX3Zpc2libGVS
ZWN0OwotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpmb3JjZVJlcGFpbnQoKQotewotICAgIHNl
dE5lZWRzRGlzcGxheSgpOwotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXRUaWxlRGVidWdC
b3JkZXJXaWR0aChmbG9hdCBib3JkZXJXaWR0aCkKLXsKLSAgICBpZiAobV90aWxlRGVidWdCb3Jk
ZXJXaWR0aCA9PSBib3JkZXJXaWR0aCkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fdGlsZURlYnVn
Qm9yZGVyV2lkdGggPSBib3JkZXJXaWR0aDsKLQotICAgIHRpbGVHcmlkKCkudXBkYXRlVGlsZUxh
eWVyUHJvcGVydGllcygpOwotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXRUaWxlRGVidWdC
b3JkZXJDb2xvcihDb2xvciBib3JkZXJDb2xvcikKLXsKLSAgICBpZiAobV90aWxlRGVidWdCb3Jk
ZXJDb2xvciA9PSBib3JkZXJDb2xvcikKLSAgICAgICAgcmV0dXJuOwotICAgIG1fdGlsZURlYnVn
Qm9yZGVyQ29sb3IgPSBib3JkZXJDb2xvcjsKLQotICAgIHRpbGVHcmlkKCkudXBkYXRlVGlsZUxh
eWVyUHJvcGVydGllcygpOwotfQotCi1JbnRSZWN0IFRpbGVDb250cm9sbGVyOjpib3VuZHMoKSBj
b25zdAotewotICAgIEludFBvaW50IGJvdW5kc09yaWdpbkluY2x1ZGluZ01hcmdpbigtbGVmdE1h
cmdpbldpZHRoKCksIC10b3BNYXJnaW5IZWlnaHQoKSk7Ci0gICAgSW50U2l6ZSBib3VuZHNTaXpl
SW5jbHVkaW5nTWFyZ2luID0gZXhwYW5kZWRJbnRTaXplKG1fdGlsZUNhY2hlTGF5ZXItPmJvdW5k
cygpLnNpemUoKSk7Ci0gICAgYm91bmRzU2l6ZUluY2x1ZGluZ01hcmdpbi5leHBhbmQobGVmdE1h
cmdpbldpZHRoKCkgKyByaWdodE1hcmdpbldpZHRoKCksIHRvcE1hcmdpbkhlaWdodCgpICsgYm90
dG9tTWFyZ2luSGVpZ2h0KCkpOwotCi0gICAgcmV0dXJuIEludFJlY3QoYm91bmRzT3JpZ2luSW5j
bHVkaW5nTWFyZ2luLCBib3VuZHNTaXplSW5jbHVkaW5nTWFyZ2luKTsKLX0KLQotSW50UmVjdCBU
aWxlQ29udHJvbGxlcjo6Ym91bmRzV2l0aG91dE1hcmdpbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IEludFJlY3QoSW50UG9pbnQoKSwgZXhwYW5kZWRJbnRTaXplKG1fdGlsZUNhY2hlTGF5ZXItPmJv
dW5kcygpLnNpemUoKSkpOwotfQotCi1JbnRSZWN0IFRpbGVDb250cm9sbGVyOjpib3VuZHNBdExh
c3RSZXZhbGlkYXRlV2l0aG91dE1hcmdpbigpIGNvbnN0Ci17Ci0gICAgSW50UmVjdCBib3VuZHNX
aXRob3V0TWFyZ2luID0gSW50UmVjdChJbnRQb2ludCgpLCBtX2JvdW5kc0F0TGFzdFJldmFsaWRh
dGUuc2l6ZSgpKTsKLSAgICBib3VuZHNXaXRob3V0TWFyZ2luLmNvbnRyYWN0KEludFNpemUobGVm
dE1hcmdpbldpZHRoKCkgKyByaWdodE1hcmdpbldpZHRoKCksIHRvcE1hcmdpbkhlaWdodCgpICsg
Ym90dG9tTWFyZ2luSGVpZ2h0KCkpKTsKLSAgICByZXR1cm4gYm91bmRzV2l0aG91dE1hcmdpbjsK
LX0KLQotRmxvYXRSZWN0IFRpbGVDb250cm9sbGVyOjpjb21wdXRlVGlsZUNvdmVyYWdlUmVjdChj
b25zdCBGbG9hdFJlY3QmIHByZXZpb3VzVmlzaWJsZVJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgdmlz
aWJsZVJlY3QpIGNvbnN0Ci17Ci0gICAgLy8gSWYgdGhlIHBhZ2UgaXMgbm90IGluIGEgd2luZG93
IChmb3IgZXhhbXBsZSBpZiBpdCdzIGluIGEgYmFja2dyb3VuZCB0YWIpLCB3ZSBsaW1pdCB0aGUg
dGlsZSBjb3ZlcmFnZSByZWN0IHRvIHRoZSB2aXNpYmxlIHJlY3QuCi0gICAgaWYgKCFtX2lzSW5X
aW5kb3cpCi0gICAgICAgIHJldHVybiB2aXNpYmxlUmVjdDsKLQotICAgIC8vIEZJWE1FOiBsb29r
IGF0IGhvdyBmYXIgdGhlIGRvY3VtZW50IGNhbiBzY3JvbGwgaW4gZWFjaCBkaW1lbnNpb24uCi0g
ICAgZmxvYXQgY292ZXJhZ2VIb3Jpem9udGFsU2l6ZSA9IHZpc2libGVSZWN0LndpZHRoKCk7Ci0g
ICAgZmxvYXQgY292ZXJhZ2VWZXJ0aWNhbFNpemUgPSB2aXNpYmxlUmVjdC5oZWlnaHQoKTsKLQot
I2lmIFBMQVRGT1JNKElPUykKLSAgICBVTlVTRURfUEFSQU0ocHJldmlvdXNWaXNpYmxlUmVjdCk7
Ci0gICAgcmV0dXJuIHZpc2libGVSZWN0OwotI2Vsc2UKLSAgICBib29sIGxhcmdlVmlzaWJsZVJl
Y3RDaGFuZ2UgPSAhcHJldmlvdXNWaXNpYmxlUmVjdC5pc0VtcHR5KCkgJiYgIXZpc2libGVSZWN0
LmludGVyc2VjdHMocHJldmlvdXNWaXNpYmxlUmVjdCk7Ci0KLSAgICAvLyBJbmZsYXRlIHRoZSBj
b3ZlcmFnZSByZWN0IHNvIHRoYXQgaXQgY292ZXJzIDJ4IG9mIHRoZSB2aXNpYmxlIHdpZHRoIGFu
ZCAzeCBvZiB0aGUgdmlzaWJsZSBoZWlnaHQuCi0gICAgLy8gVGhlc2UgdmFsdWVzIHdlcmUgY2hv
c2VuIGJlY2F1c2UgaXQncyBtb3JlIGNvbW1vbiB0byBoYXZlIHRhbGwgcGFnZXMgYW5kIHRvIHNj
cm9sbCB2ZXJ0aWNhbGx5LAotICAgIC8vIHNvIHdlIGtlZXAgbW9yZSB0aWxlcyBhYm92ZSBhbmQg
YmVsb3cgdGhlIGN1cnJlbnQgYXJlYS4KLQotICAgIGlmIChtX3RpbGVDb3ZlcmFnZSAmIENvdmVy
YWdlRm9ySG9yaXpvbnRhbFNjcm9sbGluZyAmJiAhbGFyZ2VWaXNpYmxlUmVjdENoYW5nZSkKLSAg
ICAgICAgY292ZXJhZ2VIb3Jpem9udGFsU2l6ZSAqPSAyOwotCi0gICAgaWYgKG1fdGlsZUNvdmVy
YWdlICYgQ292ZXJhZ2VGb3JWZXJ0aWNhbFNjcm9sbGluZyAmJiAhbGFyZ2VWaXNpYmxlUmVjdENo
YW5nZSkKLSAgICAgICAgY292ZXJhZ2VWZXJ0aWNhbFNpemUgKj0gMzsKLSNlbmRpZgotICAgIGNv
dmVyYWdlVmVydGljYWxTaXplICs9IHRvcE1hcmdpbkhlaWdodCgpICsgYm90dG9tTWFyZ2luSGVp
Z2h0KCk7Ci0gICAgY292ZXJhZ2VIb3Jpem9udGFsU2l6ZSArPSBsZWZ0TWFyZ2luV2lkdGgoKSAr
IHJpZ2h0TWFyZ2luV2lkdGgoKTsKLQotICAgIEZsb2F0UmVjdCBjb3ZlcmFnZUJvdW5kcyA9IGJv
dW5kcygpOwotICAgIGZsb2F0IGNvdmVyYWdlTGVmdCA9IHZpc2libGVSZWN0LngoKSAtIChjb3Zl
cmFnZUhvcml6b250YWxTaXplIC0gdmlzaWJsZVJlY3Qud2lkdGgoKSkgLyAyOwotICAgIGNvdmVy
YWdlTGVmdCA9IHN0ZDo6bWluKGNvdmVyYWdlTGVmdCwgY292ZXJhZ2VCb3VuZHMubWF4WCgpIC0g
Y292ZXJhZ2VIb3Jpem9udGFsU2l6ZSk7Ci0gICAgY292ZXJhZ2VMZWZ0ID0gc3RkOjptYXgoY292
ZXJhZ2VMZWZ0LCBjb3ZlcmFnZUJvdW5kcy54KCkpOwotCi0gICAgZmxvYXQgY292ZXJhZ2VUb3Ag
PSB2aXNpYmxlUmVjdC55KCkgLSAoY292ZXJhZ2VWZXJ0aWNhbFNpemUgLSB2aXNpYmxlUmVjdC5o
ZWlnaHQoKSkgLyAyOwotICAgIGNvdmVyYWdlVG9wID0gc3RkOjptaW4oY292ZXJhZ2VUb3AsIGNv
dmVyYWdlQm91bmRzLm1heFkoKSAtIGNvdmVyYWdlVmVydGljYWxTaXplKTsKLSAgICBjb3ZlcmFn
ZVRvcCA9IHN0ZDo6bWF4KGNvdmVyYWdlVG9wLCBjb3ZlcmFnZUJvdW5kcy55KCkpOwotCi0gICAg
cmV0dXJuIEZsb2F0UmVjdChjb3ZlcmFnZUxlZnQsIGNvdmVyYWdlVG9wLCBjb3ZlcmFnZUhvcml6
b250YWxTaXplLCBjb3ZlcmFnZVZlcnRpY2FsU2l6ZSk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xs
ZXI6OnNjaGVkdWxlVGlsZVJldmFsaWRhdGlvbihkb3VibGUgaW50ZXJ2YWwpCi17Ci0gICAgaWYg
KG1fdGlsZVJldmFsaWRhdGlvblRpbWVyLmlzQWN0aXZlKCkgJiYgbV90aWxlUmV2YWxpZGF0aW9u
VGltZXIubmV4dEZpcmVJbnRlcnZhbCgpIDwgaW50ZXJ2YWwpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIG1fdGlsZVJldmFsaWRhdGlvblRpbWVyLnN0YXJ0T25lU2hvdChpbnRlcnZhbCk7Ci19Ci0K
LWJvb2wgVGlsZUNvbnRyb2xsZXI6OnNob3VsZEFnZ3Jlc3NpdmVseVJldGFpblRpbGVzKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gb3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJT
aG91bGRBZ2dyZXNzaXZlbHlSZXRhaW5UaWxlcyhtX3RpbGVDYWNoZUxheWVyKTsKLX0KLQotYm9v
bCBUaWxlQ29udHJvbGxlcjo6c2hvdWxkVGVtcG9yYXJpbHlSZXRhaW5UaWxlQ29ob3J0cygpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG93bmluZ0dyYXBoaWNzTGF5ZXIoKS0+cGxhdGZvcm1DQUxheWVy
U2hvdWxkVGVtcG9yYXJpbHlSZXRhaW5UaWxlQ29ob3J0cyhtX3RpbGVDYWNoZUxheWVyKTsKLX0K
LQotdm9pZCBUaWxlQ29udHJvbGxlcjo6dGlsZVJldmFsaWRhdGlvblRpbWVyRmlyZWQoVGltZXI8
VGlsZUNvbnRyb2xsZXI+KikKLXsKLSAgICBpZiAoIW93bmluZ0dyYXBoaWNzTGF5ZXIoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1faXNJbldpbmRvdykgewotICAgICAgICBzZXROZWVk
c1JldmFsaWRhdGVUaWxlcygpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIElmIHdl
IGFyZSBub3QgdmlzaWJsZSBnZXQgcmlkIG9mIHRoZSB6b29tZWQtb3V0IHRpbGVzLgotICAgIG1f
em9vbWVkT3V0VGlsZUdyaWQgPSBudWxscHRyOwotCi0gICAgdW5zaWduZWQgdmFsaWRhdGlvblBv
bGljeSA9IChzaG91bGRBZ2dyZXNzaXZlbHlSZXRhaW5UaWxlcygpID8gMCA6IFRpbGVHcmlkOjpQ
cnVuZVNlY29uZGFyeVRpbGVzKSB8IFRpbGVHcmlkOjpVbnBhcmVudEFsbFRpbGVzOwotCi0gICAg
dGlsZUdyaWQoKS5yZXZhbGlkYXRlVGlsZXModmFsaWRhdGlvblBvbGljeSk7Ci19Ci0KLXZvaWQg
VGlsZUNvbnRyb2xsZXI6OmRpZFJldmFsaWRhdGVUaWxlcygpCi17Ci0gICAgbV92aXNpYmxlUmVj
dEF0TGFzdFJldmFsaWRhdGUgPSB2aXNpYmxlUmVjdCgpOwotICAgIG1fYm91bmRzQXRMYXN0UmV2
YWxpZGF0ZSA9IGJvdW5kcygpOwotCi0gICAgdXBkYXRlVGlsZUNvdmVyYWdlTWFwKCk7Ci19Ci0K
LXVuc2lnbmVkIFRpbGVDb250cm9sbGVyOjpibGFua1BpeGVsQ291bnQoKSBjb25zdAotewotICAg
IHJldHVybiB0aWxlR3JpZCgpLmJsYW5rUGl4ZWxDb3VudCgpOwotfQotCi11bnNpZ25lZCBUaWxl
Q29udHJvbGxlcjo6YmxhbmtQaXhlbENvdW50Rm9yVGlsZXMoY29uc3QgUGxhdGZvcm1MYXllckxp
c3QmIHRpbGVzLCBjb25zdCBGbG9hdFJlY3QmIHZpc2libGVSZWN0LCBjb25zdCBJbnRQb2ludCYg
dGlsZVRyYW5zbGF0aW9uKQotewotICAgIFJlZ2lvbiBwYWludGVkVmlzaWJsZVRpbGVzOwotCi0g
ICAgZm9yIChQbGF0Zm9ybUxheWVyTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0aWxlcy5iZWdp
bigpLCBlbmQgPSB0aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIGNvbnN0
IFBsYXRmb3JtTGF5ZXIqIHRpbGVMYXllciA9IGl0LT5nZXQoKTsKLQotICAgICAgICBGbG9hdFJl
Y3QgdmlzaWJsZVBhcnQoQ0dSZWN0T2Zmc2V0KFt0aWxlTGF5ZXIgZnJhbWVdLCB0aWxlVHJhbnNs
YXRpb24ueCgpLCB0aWxlVHJhbnNsYXRpb24ueSgpKSk7Ci0gICAgICAgIHZpc2libGVQYXJ0Lmlu
dGVyc2VjdCh2aXNpYmxlUmVjdCk7Ci0KLSAgICAgICAgaWYgKCF2aXNpYmxlUGFydC5pc0VtcHR5
KCkpCi0gICAgICAgICAgICBwYWludGVkVmlzaWJsZVRpbGVzLnVuaXRlKGVuY2xvc2luZ0ludFJl
Y3QodmlzaWJsZVBhcnQpKTsKLSAgICB9Ci0KLSAgICBSZWdpb24gdW5jb3ZlcmVkUmVnaW9uKGVu
Y2xvc2luZ0ludFJlY3QodmlzaWJsZVJlY3QpKTsKLSAgICB1bmNvdmVyZWRSZWdpb24uc3VidHJh
Y3QocGFpbnRlZFZpc2libGVUaWxlcyk7Ci0KLSAgICByZXR1cm4gdW5jb3ZlcmVkUmVnaW9uLnRv
dGFsQXJlYSgpOwotfQotCi12b2lkIFRpbGVDb250cm9sbGVyOjpzZXROZWVkc1JldmFsaWRhdGVU
aWxlcygpCi17Ci0gICAgb3duaW5nR3JhcGhpY3NMYXllcigpLT5wbGF0Zm9ybUNBTGF5ZXJTZXRO
ZWVkc1RvUmV2YWxpZGF0ZVRpbGVzKCk7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xsZXI6OnVwZGF0
ZVRpbGVDb3ZlcmFnZU1hcCgpCi17Ci0gICAgaWYgKG1fY292ZXJhZ2VNYXApCi0gICAgICAgIG1f
Y292ZXJhZ2VNYXAtPnVwZGF0ZSgpOwotfQotCi1JbnRSZWN0IFRpbGVDb250cm9sbGVyOjp0aWxl
R3JpZEV4dGVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHRpbGVHcmlkKCkuZXh0ZW50KCk7Ci19
Ci0KLWRvdWJsZSBUaWxlQ29udHJvbGxlcjo6cmV0YWluZWRUaWxlQmFja2luZ1N0b3JlTWVtb3J5
KCkgY29uc3QKLXsKLSAgICBkb3VibGUgYnl0ZXMgPSB0aWxlR3JpZCgpLnJldGFpbmVkVGlsZUJh
Y2tpbmdTdG9yZU1lbW9yeSgpOwotICAgIGlmIChtX3pvb21lZE91dFRpbGVHcmlkKQotICAgICAg
ICBieXRlcyArPSBtX3pvb21lZE91dFRpbGVHcmlkLT5yZXRhaW5lZFRpbGVCYWNraW5nU3RvcmVN
ZW1vcnkoKTsKLSAgICByZXR1cm4gYnl0ZXM7Ci19Ci0KLS8vIFJldHVybiB0aGUgcmVjdCBpbiBs
YXllciBjb29yZHMsIG5vdCB0aWxlIGNvb3Jkcy4KLUludFJlY3QgVGlsZUNvbnRyb2xsZXI6OnRp
bGVDb3ZlcmFnZVJlY3QoKSBjb25zdAotewotICAgIHJldHVybiB0aWxlR3JpZCgpLnRpbGVDb3Zl
cmFnZVJlY3QoKTsKLX0KLQotUGxhdGZvcm1DQUxheWVyKiBUaWxlQ29udHJvbGxlcjo6dGlsZWRT
Y3JvbGxpbmdJbmRpY2F0b3JMYXllcigpCi17Ci0gICAgaWYgKCFtX2NvdmVyYWdlTWFwKQotICAg
ICAgICBtX2NvdmVyYWdlTWFwID0gc3RkOjptYWtlX3VuaXF1ZTxUaWxlQ292ZXJhZ2VNYXA+KCp0
aGlzKTsKLQotICAgIHJldHVybiAmbV9jb3ZlcmFnZU1hcC0+bGF5ZXIoKTsKLX0KLQotdm9pZCBU
aWxlQ29udHJvbGxlcjo6c2V0U2Nyb2xsaW5nTW9kZUluZGljYXRpb24oU2Nyb2xsaW5nTW9kZUlu
ZGljYXRpb24gc2Nyb2xsaW5nTW9kZSkKLXsKLSAgICBpZiAoc2Nyb2xsaW5nTW9kZSA9PSBtX2lu
ZGljYXRvck1vZGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5kaWNhdG9yTW9kZSA9IHNj
cm9sbGluZ01vZGU7Ci0KLSAgICB1cGRhdGVUaWxlQ292ZXJhZ2VNYXAoKTsKLX0KLQotdm9pZCBU
aWxlQ29udHJvbGxlcjo6c2V0VGlsZU1hcmdpbnMoaW50IG1hcmdpblRvcCwgaW50IG1hcmdpbkJv
dHRvbSwgaW50IG1hcmdpbkxlZnQsIGludCBtYXJnaW5SaWdodCkKLXsKLSAgICBtX21hcmdpblRv
cCA9IG1hcmdpblRvcDsKLSAgICBtX21hcmdpbkJvdHRvbSA9IG1hcmdpbkJvdHRvbTsKLSAgICBt
X21hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0OwotICAgIG1fbWFyZ2luUmlnaHQgPSBtYXJnaW5SaWdo
dDsKLQotICAgIHNldE5lZWRzUmV2YWxpZGF0ZVRpbGVzKCk7Ci19Ci0KLWJvb2wgVGlsZUNvbnRy
b2xsZXI6Omhhc01hcmdpbnMoKSBjb25zdAotewotICAgIHJldHVybiBtX21hcmdpblRvcCB8fCBt
X21hcmdpbkJvdHRvbSB8fCBtX21hcmdpbkxlZnQgfHwgbV9tYXJnaW5SaWdodDsKLX0KLQotYm9v
bCBUaWxlQ29udHJvbGxlcjo6aGFzSG9yaXpvbnRhbE1hcmdpbnMoKSBjb25zdAotewotICAgIHJl
dHVybiBtX21hcmdpbkxlZnQgfHwgbV9tYXJnaW5SaWdodDsKLX0KLQotYm9vbCBUaWxlQ29udHJv
bGxlcjo6aGFzVmVydGljYWxNYXJnaW5zKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9tYXJnaW5U
b3AgfHwgbV9tYXJnaW5Cb3R0b207Ci19Ci0KLWludCBUaWxlQ29udHJvbGxlcjo6dG9wTWFyZ2lu
SGVpZ2h0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9tYXJnaW5Ub3AgLyB0aWxlR3JpZCgpLnNj
YWxlKCk7Ci19Ci0KLWludCBUaWxlQ29udHJvbGxlcjo6Ym90dG9tTWFyZ2luSGVpZ2h0KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9tYXJnaW5Cb3R0b20gLyB0aWxlR3JpZCgpLnNjYWxlKCk7Ci19
Ci0KLWludCBUaWxlQ29udHJvbGxlcjo6bGVmdE1hcmdpbldpZHRoKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gbV9tYXJnaW5MZWZ0IC8gdGlsZUdyaWQoKS5zY2FsZSgpOwotfQotCi1pbnQgVGlsZUNv
bnRyb2xsZXI6OnJpZ2h0TWFyZ2luV2lkdGgoKSBjb25zdAotewotICAgIHJldHVybiBtX21hcmdp
blJpZ2h0IC8gdGlsZUdyaWQoKS5zY2FsZSgpOwotfQotCi1SZWZQdHI8UGxhdGZvcm1DQUxheWVy
PiBUaWxlQ29udHJvbGxlcjo6Y3JlYXRlVGlsZUxheWVyKGNvbnN0IEludFJlY3QmIHRpbGVSZWN0
LCBUaWxlR3JpZCYgZ3JpZCkKLXsKLSAgICBSZWZQdHI8UGxhdGZvcm1DQUxheWVyPiBsYXllciA9
IExheWVyUG9vbDo6c2hhcmVkUG9vbCgpLT50YWtlTGF5ZXJXaXRoU2l6ZSh0aWxlUmVjdC5zaXpl
KCkpOwotCi0gICAgaWYgKGxheWVyKQotICAgICAgICBsYXllci0+c2V0T3duZXIoJmdyaWQpOwot
ICAgIGVsc2UKLSAgICAgICAgbGF5ZXIgPSBtX3RpbGVDYWNoZUxheWVyLT5jcmVhdGVDb21wYXRp
YmxlTGF5ZXIoUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGVUaWxlZEJhY2tpbmdUaWxlTGF5ZXIs
ICZncmlkKTsKLQotICAgIGxheWVyLT5zZXRBbmNob3JQb2ludChGbG9hdFBvaW50M0QoKSk7Ci0g
ICAgbGF5ZXItPnNldEJvdW5kcyhGbG9hdFJlY3QoRmxvYXRQb2ludCgpLCB0aWxlUmVjdC5zaXpl
KCkpKTsKLSAgICBsYXllci0+c2V0UG9zaXRpb24odGlsZVJlY3QubG9jYXRpb24oKSk7Ci0gICAg
bGF5ZXItPnNldEJvcmRlckNvbG9yKG1fdGlsZURlYnVnQm9yZGVyQ29sb3IpOwotICAgIGxheWVy
LT5zZXRCb3JkZXJXaWR0aChtX3RpbGVEZWJ1Z0JvcmRlcldpZHRoKTsKLSAgICBsYXllci0+c2V0
RWRnZUFudGlhbGlhc2luZ01hc2soMCk7Ci0gICAgbGF5ZXItPnNldE9wYXF1ZShtX3RpbGVzQXJl
T3BhcXVlKTsKLSNpZm5kZWYgTkRFQlVHCi0gICAgbGF5ZXItPnNldE5hbWUoIlRpbGUiKTsKLSNl
bmRpZgotCi0gICAgZmxvYXQgdGVtcG9yYXJ5U2NhbGVGYWN0b3IgPSBvd25pbmdHcmFwaGljc0xh
eWVyKCktPnBsYXRmb3JtQ0FMYXllckNvbnRlbnRzU2NhbGVNdWx0aXBsaWVyRm9yTmV3VGlsZXMo
bV90aWxlQ2FjaGVMYXllcik7Ci0gICAgbV9oYXNUaWxlc1dpdGhUZW1wb3JhcnlTY2FsZUZhY3Rv
ciB8PSB0ZW1wb3JhcnlTY2FsZUZhY3RvciAhPSAxOwotCi0gICAgbGF5ZXItPnNldENvbnRlbnRz
U2NhbGUobV9kZXZpY2VTY2FsZUZhY3RvciAqIHRlbXBvcmFyeVNjYWxlRmFjdG9yKTsKLSAgICBs
YXllci0+c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKG1fYWNjZWxlcmF0ZXNEcmF3aW5nKTsKLQotICAg
IGxheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKLQotICAgIHJldHVybiBsYXllcjsKLX0KLQotVmVj
dG9yPFJlZlB0cjxQbGF0Zm9ybUNBTGF5ZXI+PiBUaWxlQ29udHJvbGxlcjo6Y29udGFpbmVyTGF5
ZXJzKCkKLXsKLSAgICBWZWN0b3I8UmVmUHRyPFBsYXRmb3JtQ0FMYXllcj4+IGxheWVyTGlzdDsK
LSAgICBpZiAobV96b29tZWRPdXRUaWxlR3JpZCkKLSAgICAgICAgbGF5ZXJMaXN0LmFwcGVuZCgm
bV96b29tZWRPdXRUaWxlR3JpZC0+Y29udGFpbmVyTGF5ZXIoKSk7Ci0gICAgbGF5ZXJMaXN0LmFw
cGVuZCgmdGlsZUdyaWQoKS5jb250YWluZXJMYXllcigpKTsKLSAgICByZXR1cm4gbGF5ZXJMaXN0
OwotfQotCi0jaWYgUExBVEZPUk0oSU9TKQotdW5zaWduZWQgVGlsZUNvbnRyb2xsZXI6Om51bWJl
ck9mVW5wYXJlbnRlZFRpbGVzKCkgY29uc3QKLXsKLSAgICB1bnNpZ25lZCBjb3VudCA9IHRpbGVH
cmlkKCkubnVtYmVyT2ZVbnBhcmVudGVkVGlsZXMoKTsKLSAgICBpZiAobV96b29tZWRPdXRUaWxl
R3JpZCkKLSAgICAgICAgY291bnQgKz0gbV96b29tZWRPdXRUaWxlR3JpZC0+bnVtYmVyT2ZVbnBh
cmVudGVkVGlsZXMoKTsKLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLXZvaWQgVGlsZUNvbnRyb2xs
ZXI6OnJlbW92ZVVucGFyZW50ZWRUaWxlc05vdygpCi17Ci0gICAgdGlsZUdyaWQoKS5yZW1vdmVV
bnBhcmVudGVkVGlsZXNOb3coKTsKLSAgICBpZiAobV96b29tZWRPdXRUaWxlR3JpZCkKLSAgICAg
ICAgbV96b29tZWRPdXRUaWxlR3JpZC0+cmVtb3ZlVW5wYXJlbnRlZFRpbGVzTm93KCk7Ci0KLSAg
ICB1cGRhdGVUaWxlQ292ZXJhZ2VNYXAoKTsKLX0KLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYS9tYWMvVGls
ZUdyaWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2NhL21hYy9UaWxlR3JpZC5jcHAJKHJldmlzaW9uIDE2OTgwOSkJKGZyb20gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFjL1RpbGVHcmlkLm1tOjE2OTgwOSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3JpZC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw3MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgImNvbmZp
Zy5oIgorI2ltcG9ydCAiVGlsZUdyaWQuaCIKKworI2ltcG9ydCAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW1wb3J0ICJMYXllclBvb2wuaCIKKyNpbXBvcnQgIlBsYXRmb3JtQ0FMYXllci5oIgorI2lt
cG9ydCAiVGlsZUNvbnRyb2xsZXIuaCIKKyNpbXBvcnQgIldlYkxheWVyLmgiCisjaW1wb3J0IDx3
dGYvTWFpblRocmVhZC5oPgorCisjaWYgUExBVEZPUk0oSU9TKQorI2ltcG9ydCAiVGlsZUNvbnRy
b2xsZXJNZW1vcnlIYW5kbGVySU9TLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitUaWxlR3JpZDo6VGlsZUdyaWQoVGlsZUNvbnRyb2xsZXImIGNvbnRyb2xsZXIpCisgICAgOiBt
X2NvbnRyb2xsZXIoY29udHJvbGxlcikKKyAgICAsIG1fY29udGFpbmVyTGF5ZXIoKmNvbnRyb2xs
ZXIucm9vdExheWVyKCkuY3JlYXRlQ29tcGF0aWJsZUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5
ZXJUeXBlTGF5ZXIsIG51bGxwdHIpKQorICAgICwgbV9zY2FsZSgxKQorICAgICwgbV9jb2hvcnRS
ZW1vdmFsVGltZXIodGhpcywgJlRpbGVHcmlkOjpjb2hvcnRSZW1vdmFsVGltZXJGaXJlZCkKK3sK
KyNpZm5kZWYgTkRFQlVHCisgICAgbV9jb250YWluZXJMYXllci5nZXQoKS5zZXROYW1lKCJUaWxl
R3JpZCBDb250YWluZXIgTGF5ZXIiKTsKKyNlbmRpZgorfQorCitUaWxlR3JpZDo6flRpbGVHcmlk
KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgZm9yIChhdXRvJiB0aWxl
IDogbV90aWxlcy52YWx1ZXMoKSkKKyAgICAgICAgdGlsZS5sYXllci0+c2V0T3duZXIobnVsbHB0
cik7Cit9CisKK3ZvaWQgVGlsZUdyaWQ6OnNldFNjYWxlKGZsb2F0IHNjYWxlKQoreworICAgIG1f
c2NhbGUgPSBzY2FsZTsKKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybTsKKyAg
ICB0cmFuc2Zvcm0uc2NhbGUoMSAvIG1fc2NhbGUpOworICAgIG1fY29udGFpbmVyTGF5ZXItPnNl
dFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworCisgICAgLy8gRklYTUU6IHdlIG1heSByZXZhbGlkYXRl
VGlsZXMgdHdpY2UgaW4gdGhpcyBjb21taXQuCisgICAgcmV2YWxpZGF0ZVRpbGVzKFBydW5lU2Vj
b25kYXJ5VGlsZXMpOworCisgICAgZm9yIChhdXRvJiB0aWxlIDogbV90aWxlcy52YWx1ZXMoKSkK
KyAgICAgICAgdGlsZS5sYXllci0+c2V0Q29udGVudHNTY2FsZShtX2NvbnRyb2xsZXIuZGV2aWNl
U2NhbGVGYWN0b3IoKSk7Cit9CisKK3ZvaWQgVGlsZUdyaWQ6OnNldE5lZWRzRGlzcGxheSgpCit7
CisgICAgZm9yIChhdXRvJiBlbnRyeSA6IG1fdGlsZXMpIHsKKyAgICAgICAgVGlsZUluZm8mIHRp
bGVJbmZvID0gZW50cnkudmFsdWU7CisgICAgICAgIEludFJlY3QgdGlsZVJlY3QgPSByZWN0Rm9y
VGlsZUluZGV4KGVudHJ5LmtleSk7CisKKyAgICAgICAgaWYgKHRpbGVSZWN0LmludGVyc2VjdHMo
bV9wcmltYXJ5VGlsZUNvdmVyYWdlUmVjdCkgJiYgdGlsZUluZm8ubGF5ZXItPnN1cGVybGF5ZXIo
KSkKKyAgICAgICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgdGlsZUluZm8uaGFzU3RhbGVDb250ZW50ID0gdHJ1ZTsKKyAg
ICB9Cit9CisKK3ZvaWQgVGlsZUdyaWQ6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBJbnRS
ZWN0JiByZWN0KQoreworICAgIGlmIChtX3RpbGVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QocmVjdCk7CisgICAgc2NhbGVkUmVjdC5zY2Fs
ZShtX3NjYWxlKTsKKyAgICBJbnRSZWN0IHJlcGFpbnRSZWN0SW5UaWxlQ29vcmRzKGVuY2xvc2lu
Z0ludFJlY3Qoc2NhbGVkUmVjdCkpOworCisgICAgSW50U2l6ZSB0aWxlU2l6ZSA9IG1fY29udHJv
bGxlci50aWxlU2l6ZSgpOworCisgICAgLy8gRm9yIHNtYWxsIGludmFsaWRhdGlvbnMsIGxvb2t1
cCB0aGUgY292ZXJlZCB0aWxlcy4KKyAgICBpZiAocmVwYWludFJlY3RJblRpbGVDb29yZHMuaGVp
Z2h0KCkgPCAyICogdGlsZVNpemUuaGVpZ2h0KCkgJiYgcmVwYWludFJlY3RJblRpbGVDb29yZHMu
d2lkdGgoKSA8IDIgKiB0aWxlU2l6ZS53aWR0aCgpKSB7CisgICAgICAgIFRpbGVJbmRleCB0b3BM
ZWZ0OworICAgICAgICBUaWxlSW5kZXggYm90dG9tUmlnaHQ7CisgICAgICAgIGdldFRpbGVJbmRl
eFJhbmdlRm9yUmVjdChyZXBhaW50UmVjdEluVGlsZUNvb3JkcywgdG9wTGVmdCwgYm90dG9tUmln
aHQpOworCisgICAgICAgIGZvciAoaW50IHkgPSB0b3BMZWZ0LnkoKTsgeSA8PSBib3R0b21SaWdo
dC55KCk7ICsreSkgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IHRvcExlZnQueCgpOyB4IDw9
IGJvdHRvbVJpZ2h0LngoKTsgKyt4KSB7CisgICAgICAgICAgICAgICAgVGlsZUluZGV4IHRpbGVJ
bmRleCh4LCB5KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBUaWxlTWFwOjpp
dGVyYXRvciBpdCA9IG1fdGlsZXMuZmluZCh0aWxlSW5kZXgpOworICAgICAgICAgICAgICAgIGlm
IChpdCAhPSBtX3RpbGVzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICBzZXRUaWxlTmVlZHNE
aXNwbGF5SW5SZWN0KHRpbGVJbmRleCwgaXQtPnZhbHVlLCByZXBhaW50UmVjdEluVGlsZUNvb3Jk
cywgbV9wcmltYXJ5VGlsZUNvdmVyYWdlUmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoVGlsZU1hcDo6aXRlcmF0b3IgaXQg
PSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkK
KyAgICAgICAgc2V0VGlsZU5lZWRzRGlzcGxheUluUmVjdChpdC0+a2V5LCBpdC0+dmFsdWUsIHJl
cGFpbnRSZWN0SW5UaWxlQ29vcmRzLCBtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0KTsKK30KKwor
dm9pZCBUaWxlR3JpZDo6ZHJvcFRpbGVzSW5SZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7Cisg
ICAgaWYgKG1fdGlsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBGbG9hdFJl
Y3Qgc2NhbGVkUmVjdChyZWN0KTsKKyAgICBzY2FsZWRSZWN0LnNjYWxlKG1fc2NhbGUpOworICAg
IEludFJlY3QgZHJvcFJlY3RJblRpbGVDb29yZHMoZW5jbG9zaW5nSW50UmVjdChzY2FsZWRSZWN0
KSk7CisKKyAgICBWZWN0b3I8VGlsZUluZGV4PiB0aWxlc1RvUmVtb3ZlOworCisgICAgZm9yIChh
dXRvJiBpbmRleCA6IG1fdGlsZXMua2V5cygpKSB7CisgICAgICAgIGlmIChyZWN0Rm9yVGlsZUlu
ZGV4KGluZGV4KS5pbnRlcnNlY3RzKGRyb3BSZWN0SW5UaWxlQ29vcmRzKSkKKyAgICAgICAgICAg
IHRpbGVzVG9SZW1vdmUuYXBwZW5kKGluZGV4KTsKKyAgICB9CisKKyAgICByZW1vdmVUaWxlcyh0
aWxlc1RvUmVtb3ZlKTsKK30KKwordm9pZCBUaWxlR3JpZDo6c2V0VGlsZU5lZWRzRGlzcGxheUlu
UmVjdChjb25zdCBUaWxlSW5kZXgmIHRpbGVJbmRleCwgVGlsZUluZm8mIHRpbGVJbmZvLCBjb25z
dCBJbnRSZWN0JiByZXBhaW50UmVjdEluVGlsZUNvb3JkcywgY29uc3QgSW50UmVjdCYgY292ZXJh
Z2VSZWN0SW5UaWxlQ29vcmRzKQoreworICAgIFBsYXRmb3JtQ0FMYXllciogdGlsZUxheWVyID0g
dGlsZUluZm8ubGF5ZXIuZ2V0KCk7CisKKyAgICBJbnRSZWN0IHRpbGVSZWN0ID0gcmVjdEZvclRp
bGVJbmRleCh0aWxlSW5kZXgpOworICAgIEZsb2F0UmVjdCB0aWxlUmVwYWludFJlY3QgPSB0aWxl
UmVjdDsKKyAgICB0aWxlUmVwYWludFJlY3QuaW50ZXJzZWN0KHJlcGFpbnRSZWN0SW5UaWxlQ29v
cmRzKTsKKyAgICBpZiAodGlsZVJlcGFpbnRSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgdGlsZVJlcGFpbnRSZWN0Lm1vdmVCeSgtdGlsZVJlY3QubG9jYXRpb24oKSk7Cisg
ICAgCisgICAgLy8gV2UgY291bGQgdGVzdCBmb3IgaW50ZXJzZWN0aW9uIHdpdGggdGhlIHZpc2li
bGUgcmVjdC4gVGhpcyB3b3VsZCByZWR1Y2UgcGFpbnRpbmcgeWV0IG1vcmUsCisgICAgLy8gYnV0
IG1heSBtYWtlIHNjcm9sbGluZyBzdGFsZSB0aWxlcyBpbnRvIHZpZXcgbW9yZSBmcmVxdWVudC4K
KyAgICBpZiAodGlsZVJlY3QuaW50ZXJzZWN0cyhjb3ZlcmFnZVJlY3RJblRpbGVDb29yZHMpICYm
IHRpbGVMYXllci0+c3VwZXJsYXllcigpKSB7CisgICAgICAgIHRpbGVMYXllci0+c2V0TmVlZHNE
aXNwbGF5KCZ0aWxlUmVwYWludFJlY3QpOworCisgICAgICAgIGlmIChtX2NvbnRyb2xsZXIucm9v
dExheWVyKCkub3duZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvd1JlcGFpbnRDb3VudGVyKDApKSB7
CisgICAgICAgICAgICBGbG9hdFJlY3QgaW5kaWNhdG9yUmVjdCgwLCAwLCA1MiwgMjcpOworICAg
ICAgICAgICAgdGlsZUxheWVyLT5zZXROZWVkc0Rpc3BsYXkoJmluZGljYXRvclJlY3QpOworICAg
ICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIHRpbGVJbmZvLmhhc1N0YWxlQ29udGVudCA9IHRy
dWU7Cit9CisKK3ZvaWQgVGlsZUdyaWQ6OnVwZGF0ZVRpbGVMYXllclByb3BlcnRpZXMoKQorewor
ICAgIGJvb2wgYWNjZWxlcmF0ZXNEcmF3aW5nID0gbV9jb250cm9sbGVyLmFjY2VsZXJhdGVzRHJh
d2luZygpOworICAgIGJvb2wgb3BhcXVlID0gbV9jb250cm9sbGVyLnRpbGVzQXJlT3BhcXVlKCk7
CisgICAgQ29sb3IgdGlsZURlYnVnQm9yZGVyQ29sb3IgPSBtX2NvbnRyb2xsZXIudGlsZURlYnVn
Qm9yZGVyQ29sb3IoKTsKKyAgICBmbG9hdCB0aWxlRGVidWdCb3JkZXJXaWR0aCA9IG1fY29udHJv
bGxlci50aWxlRGVidWdCb3JkZXJXaWR0aCgpOworCisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9p
dGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0g
ZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IFRpbGVJbmZvJiB0aWxlSW5mbyA9IGl0LT52YWx1
ZTsKKyAgICAgICAgdGlsZUluZm8ubGF5ZXItPnNldEFjY2VsZXJhdGVzRHJhd2luZyhhY2NlbGVy
YXRlc0RyYXdpbmcpOworICAgICAgICB0aWxlSW5mby5sYXllci0+c2V0T3BhcXVlKG9wYXF1ZSk7
CisgICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXRCb3JkZXJDb2xvcih0aWxlRGVidWdCb3JkZXJD
b2xvcik7CisgICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXRCb3JkZXJXaWR0aCh0aWxlRGVidWdC
b3JkZXJXaWR0aCk7CisgICAgfQorfQorCitib29sIFRpbGVHcmlkOjp0aWxlc1dvdWxkQ2hhbmdl
Rm9yVmlzaWJsZVJlY3QoY29uc3QgRmxvYXRSZWN0JiBuZXdWaXNpYmxlUmVjdCwgY29uc3QgRmxv
YXRSZWN0JiBvbGRWaXNpYmxlUmVjdCkgY29uc3QKK3sKKyAgICBGbG9hdFJlY3QgdmlzaWJsZVJl
Y3QgPSBuZXdWaXNpYmxlUmVjdDsKKworICAgIGlmICh2aXNpYmxlUmVjdC5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgRmxvYXRSZWN0IGN1cnJlbnRUaWxl
Q292ZXJhZ2VSZWN0ID0gbV9jb250cm9sbGVyLmNvbXB1dGVUaWxlQ292ZXJhZ2VSZWN0KG9sZFZp
c2libGVSZWN0LCBuZXdWaXNpYmxlUmVjdCk7CisgICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QoY3Vy
cmVudFRpbGVDb3ZlcmFnZVJlY3QpOworICAgIHNjYWxlZFJlY3Quc2NhbGUobV9zY2FsZSk7Cisg
ICAgSW50UmVjdCBjdXJyZW50Q292ZXJhZ2VSZWN0SW5UaWxlQ29vcmRzKGVuY2xvc2luZ0ludFJl
Y3Qoc2NhbGVkUmVjdCkpOworCisgICAgVGlsZUluZGV4IHRvcExlZnQ7CisgICAgVGlsZUluZGV4
IGJvdHRvbVJpZ2h0OworICAgIGdldFRpbGVJbmRleFJhbmdlRm9yUmVjdChjdXJyZW50Q292ZXJh
Z2VSZWN0SW5UaWxlQ29vcmRzLCB0b3BMZWZ0LCBib3R0b21SaWdodCk7CisKKyAgICBJbnRSZWN0
IGNvdmVyYWdlUmVjdCA9IHJlY3RGb3JUaWxlSW5kZXgodG9wTGVmdCk7CisgICAgY292ZXJhZ2VS
ZWN0LnVuaXRlKHJlY3RGb3JUaWxlSW5kZXgoYm90dG9tUmlnaHQpKTsKKyAgICByZXR1cm4gY292
ZXJhZ2VSZWN0ICE9IG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3Q7Cit9CisKK2Jvb2wgVGlsZUdy
aWQ6OnByZXBvcHVsYXRlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgSW50UmVj
dCBlbmNsb3NpbmdDb3ZlcmFnZVJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHJlY3QpOworICAgIGlm
IChtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0LmNvbnRhaW5zKGVuY2xvc2luZ0NvdmVyYWdlUmVj
dCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1fc2Vjb25kYXJ5VGlsZUNvdmVyYWdl
UmVjdHMuYXBwZW5kKGVuY2xvc2luZ0NvdmVyYWdlUmVjdCk7CisgICAgcmV0dXJuIHRydWU7Cit9
CisKK0ludFJlY3QgVGlsZUdyaWQ6OnJlY3RGb3JUaWxlSW5kZXgoY29uc3QgVGlsZUluZGV4JiB0
aWxlSW5kZXgpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IGNhbGN1bGF0aW5nIHRoZSBzY2FsZWQg
c2l6ZSBoZXJlIHNob3VsZCBtYXRjaCB3aXRoIHRoZSByZXN0IG9mIGNhbGN1bGF0ZWQgc2l6ZXMg
d2hlcmUgd2UgdXNlIHRoZSBjb21iaW5hdGlvbiBvZgorICAgIC8vIGVuY2xvc2luZ0ludFJlY3Qs
IGV4cGFuZGVkSW50U2l6ZSAoZmxvb3IgdnMgY2VpbCkuCisgICAgLy8gSG93ZXZlciBlbmNsb3Np
bmcgdGhpcyBzaXplIGNvdWxkIHJldmVhbCBnYXAgb24gcm9vdCBsYXllcidzIGJhY2tncm91bmQu
IHNlZSBSZW5kZXJWaWV3OjpiYWNrZ3JvdW5kUmVjdCgpCisgICAgSW50U2l6ZSB0aWxlU2l6ZSA9
IG1fY29udHJvbGxlci50aWxlU2l6ZSgpOworICAgIEludFJlY3QgcmVjdCh0aWxlSW5kZXgueCgp
ICogdGlsZVNpemUud2lkdGgoKSwgdGlsZUluZGV4LnkoKSAqIHRpbGVTaXplLmhlaWdodCgpLCB0
aWxlU2l6ZS53aWR0aCgpLCB0aWxlU2l6ZS5oZWlnaHQoKSk7CisgICAgSW50UmVjdCBzY2FsZWRC
b3VuZHMobV9jb250cm9sbGVyLmJvdW5kcygpKTsKKyAgICBzY2FsZWRCb3VuZHMuc2NhbGUobV9z
Y2FsZSk7CisgICAgcmVjdC5pbnRlcnNlY3Qoc2NhbGVkQm91bmRzKTsKKyAgICByZXR1cm4gcmVj
dDsKK30KKwordm9pZCBUaWxlR3JpZDo6Z2V0VGlsZUluZGV4UmFuZ2VGb3JSZWN0KGNvbnN0IElu
dFJlY3QmIHJlY3QsIFRpbGVJbmRleCYgdG9wTGVmdCwgVGlsZUluZGV4JiBib3R0b21SaWdodCkg
Y29uc3QKK3sKKyAgICBJbnRSZWN0IGNsYW1wZWRSZWN0ID0gbV9jb250cm9sbGVyLmJvdW5kcygp
OworICAgIGNsYW1wZWRSZWN0LnNjYWxlKG1fc2NhbGUpOworICAgIGNsYW1wZWRSZWN0LmludGVy
c2VjdChyZWN0KTsKKworICAgIGF1dG8gdGlsZVNpemUgPSBtX2NvbnRyb2xsZXIudGlsZVNpemUo
KTsKKyAgICBpZiAoY2xhbXBlZFJlY3QueCgpID49IDApCisgICAgICAgIHRvcExlZnQuc2V0WChj
bGFtcGVkUmVjdC54KCkgLyB0aWxlU2l6ZS53aWR0aCgpKTsKKyAgICBlbHNlCisgICAgICAgIHRv
cExlZnQuc2V0WChmbG9vcmYoKGZsb2F0KWNsYW1wZWRSZWN0LngoKSAvIHRpbGVTaXplLndpZHRo
KCkpKTsKKworICAgIGlmIChjbGFtcGVkUmVjdC55KCkgPj0gMCkKKyAgICAgICAgdG9wTGVmdC5z
ZXRZKGNsYW1wZWRSZWN0LnkoKSAvIHRpbGVTaXplLmhlaWdodCgpKTsKKyAgICBlbHNlCisgICAg
ICAgIHRvcExlZnQuc2V0WShmbG9vcmYoKGZsb2F0KWNsYW1wZWRSZWN0LnkoKSAvIHRpbGVTaXpl
LmhlaWdodCgpKSk7CisKKyAgICBpbnQgYm90dG9tWFJhdGlvID0gY2VpbCgoZmxvYXQpY2xhbXBl
ZFJlY3QubWF4WCgpIC8gdGlsZVNpemUud2lkdGgoKSk7CisgICAgYm90dG9tUmlnaHQuc2V0WChz
dGQ6Om1heChib3R0b21YUmF0aW8gLSAxLCAwKSk7CisKKyAgICBpbnQgYm90dG9tWVJhdGlvID0g
Y2VpbCgoZmxvYXQpY2xhbXBlZFJlY3QubWF4WSgpIC8gdGlsZVNpemUuaGVpZ2h0KCkpOworICAg
IGJvdHRvbVJpZ2h0LnNldFkoc3RkOjptYXgoYm90dG9tWVJhdGlvIC0gMSwgMCkpOworfQorCit1
bnNpZ25lZCBUaWxlR3JpZDo6YmxhbmtQaXhlbENvdW50KCkgY29uc3QKK3sKKyAgICBQbGF0Zm9y
bUxheWVyTGlzdCB0aWxlcyhtX3RpbGVzLnNpemUoKSk7CisKKyAgICBmb3IgKFRpbGVNYXA6OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgaWYgKFBsYXRmb3JtTGF5ZXIgKmxheWVyID0gaXQt
PnZhbHVlLmxheWVyLT5wbGF0Zm9ybUxheWVyKCkpCisgICAgICAgICAgICB0aWxlcy5hcHBlbmQo
bGF5ZXIpOworICAgIH0KKworICAgIHJldHVybiBUaWxlQ29udHJvbGxlcjo6YmxhbmtQaXhlbENv
dW50Rm9yVGlsZXModGlsZXMsIG1fY29udHJvbGxlci52aXNpYmxlUmVjdCgpLCBJbnRQb2ludCgw
LDApKTsKK30KKwordm9pZCBUaWxlR3JpZDo6cmVtb3ZlVGlsZXMoVmVjdG9yPFRpbGVHcmlkOjpU
aWxlSW5kZXg+JiB0b1JlbW92ZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvUmVt
b3ZlLnNpemUoKTsgKytpKSB7CisgICAgICAgIFRpbGVJbmZvIHRpbGVJbmZvID0gbV90aWxlcy50
YWtlKHRvUmVtb3ZlW2ldKTsKKyAgICAgICAgdGlsZUluZm8ubGF5ZXItPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7CisgICAgICAgIG1fdGlsZVJlcGFpbnRDb3VudHMucmVtb3ZlKHRpbGVJbmZvLmxh
eWVyLmdldCgpKTsKKyAgICAgICAgTGF5ZXJQb29sOjpzaGFyZWRQb29sKCktPmFkZExheWVyKHRp
bGVJbmZvLmxheWVyKTsKKyAgICB9Cit9CisKK3ZvaWQgVGlsZUdyaWQ6OnJlbW92ZUFsbFNlY29u
ZGFyeVRpbGVzKCkKK3sKKyAgICBWZWN0b3I8VGlsZUluZGV4PiB0aWxlc1RvUmVtb3ZlOworCisg
ICAgZm9yIChhdXRvJiBlbnRyeSA6IG1fdGlsZXMpIHsKKyAgICAgICAgY29uc3QgVGlsZUluZm8m
IHRpbGVJbmZvID0gZW50cnkudmFsdWU7CisgICAgICAgIGlmICh0aWxlSW5mby5jb2hvcnQgPT0g
VmlzaWJsZVRpbGVDb2hvcnQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdGlsZXNU
b1JlbW92ZS5hcHBlbmQoZW50cnkua2V5KTsKKyAgICB9CisKKyAgICByZW1vdmVUaWxlcyh0aWxl
c1RvUmVtb3ZlKTsKK30KKwordm9pZCBUaWxlR3JpZDo6cmVtb3ZlVGlsZXNJbkNvaG9ydChUaWxl
Q29ob3J0IGNvaG9ydCkKK3sKKyAgICBBU1NFUlQoY29ob3J0ICE9IFZpc2libGVUaWxlQ29ob3J0
KTsKKyAgICBWZWN0b3I8VGlsZUluZGV4PiB0aWxlc1RvUmVtb3ZlOworCisgICAgZm9yIChhdXRv
JiBlbnRyeSA6IG1fdGlsZXMpIHsKKyAgICAgICAgY29uc3QgVGlsZUluZm8mIHRpbGVJbmZvID0g
ZW50cnkudmFsdWU7CisgICAgICAgIGlmICh0aWxlSW5mby5jb2hvcnQgIT0gY29ob3J0KQorICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIHRpbGVzVG9SZW1vdmUuYXBwZW5kKGVudHJ5Lmtl
eSk7CisgICAgfQorCisgICAgcmVtb3ZlVGlsZXModGlsZXNUb1JlbW92ZSk7Cit9CisKK3ZvaWQg
VGlsZUdyaWQ6OnJldmFsaWRhdGVUaWxlcyh1bnNpZ25lZCB2YWxpZGF0aW9uUG9saWN5KQorewor
ICAgIEZsb2F0UmVjdCB2aXNpYmxlUmVjdCA9IG1fY29udHJvbGxlci52aXNpYmxlUmVjdCgpOwor
ICAgIEludFJlY3QgYm91bmRzID0gbV9jb250cm9sbGVyLmJvdW5kcygpOworCisgICAgaWYgKHZp
c2libGVSZWN0LmlzRW1wdHkoKSB8fCBib3VuZHMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBGbG9hdFJlY3QgdGlsZUNvdmVyYWdlUmVjdCA9IG1fY29udHJvbGxlci5jb21wdXRl
VGlsZUNvdmVyYWdlUmVjdChtX2NvbnRyb2xsZXIudmlzaWJsZVJlY3RBdExhc3RSZXZhbGlkYXRl
KCksIHZpc2libGVSZWN0KTsKKyAgICBGbG9hdFJlY3Qgc2NhbGVkUmVjdCh0aWxlQ292ZXJhZ2VS
ZWN0KTsKKyAgICBzY2FsZWRSZWN0LnNjYWxlKG1fc2NhbGUpOworICAgIEludFJlY3QgY292ZXJh
Z2VSZWN0SW5UaWxlQ29vcmRzKGVuY2xvc2luZ0ludFJlY3Qoc2NhbGVkUmVjdCkpOworCisgICAg
VGlsZUNvaG9ydCBjdXJyQ29ob3J0ID0gbmV4dFRpbGVDb2hvcnQoKTsKKyAgICB1bnNpZ25lZCB0
aWxlc0luQ29ob3J0ID0gMDsKKworICAgIGRvdWJsZSBtaW5pbXVtUmV2YWxpZGF0aW9uVGltZXJE
dXJhdGlvbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7CisgICAgYm9vbCBu
ZWVkc1RpbGVSZXZhbGlkYXRpb24gPSBmYWxzZTsKKworICAgIC8vIE1vdmUgdGlsZXMgbmV3bHkg
b3V0c2lkZSB0aGUgY292ZXJhZ2UgcmVjdCBpbnRvIHRoZSBjb2hvcnQgbWFwLgorICAgIGZvciAo
VGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5k
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+
dmFsdWU7CisgICAgICAgIFRpbGVJbmRleCB0aWxlSW5kZXggPSBpdC0+a2V5OworCisgICAgICAg
IFBsYXRmb3JtQ0FMYXllciogdGlsZUxheWVyID0gdGlsZUluZm8ubGF5ZXIuZ2V0KCk7CisgICAg
ICAgIEludFJlY3QgdGlsZVJlY3QgPSByZWN0Rm9yVGlsZUluZGV4KHRpbGVJbmRleCk7CisgICAg
ICAgIGlmICh0aWxlUmVjdC5pbnRlcnNlY3RzKGNvdmVyYWdlUmVjdEluVGlsZUNvb3JkcykpIHsK
KyAgICAgICAgICAgIHRpbGVJbmZvLmNvaG9ydCA9IFZpc2libGVUaWxlQ29ob3J0OworICAgICAg
ICAgICAgaWYgKHRpbGVJbmZvLmhhc1N0YWxlQ29udGVudCkgeworICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiBzdG9yZSBhIGRpcnR5IHJlZ2lvbiBwZXIgbGF5ZXI/CisgICAgICAgICAgICAgICAg
dGlsZUxheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAgICAgICAgICAgICB0aWxlSW5mby5o
YXNTdGFsZUNvbnRlbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIC8vIEFkZCB0byB0aGUgY3VycmVudENvaG9ydCBpZiBub3QgYWxyZWFkeSBp
biBvbmUuCisgICAgICAgICAgICBpZiAodGlsZUluZm8uY29ob3J0ID09IFZpc2libGVUaWxlQ29o
b3J0KSB7CisgICAgICAgICAgICAgICAgdGlsZUluZm8uY29ob3J0ID0gY3VyckNvaG9ydDsKKyAg
ICAgICAgICAgICAgICArK3RpbGVzSW5Db2hvcnQ7CisKKyAgICAgICAgICAgICAgICBpZiAobV9j
b250cm9sbGVyLnVucGFyZW50c09mZnNjcmVlblRpbGVzKCkpCisgICAgICAgICAgICAgICAgICAg
IHRpbGVMYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSBp
ZiAobV9jb250cm9sbGVyLnVucGFyZW50c09mZnNjcmVlblRpbGVzKCkgJiYgbV9jb250cm9sbGVy
LnNob3VsZEFnZ3Jlc3NpdmVseVJldGFpblRpbGVzKCkgJiYgdGlsZUxheWVyLT5zdXBlcmxheWVy
KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBBZ2dyZXNzaXZlIHRpbGUgcmV0ZW50aW9uIG1lYW5z
IHdlJ2xsIG5ldmVyIHJlbW92ZSBjb2hvcnRzLCBidXQgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhl
eSdyZSB1bnBhcmVudGVkLgorICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGltbWVkaWF0ZWx5
IHVucGFyZW50IGNvaG9ydHMgY29tcHJpc2VkIG9mIHNlY29uZGFyeSB0aWxlcyB0aGF0IG5ldmVy
IHRvdWNoIHRoZSBwcmltYXJ5IGNvdmVyYWdlIHJlY3QsCisgICAgICAgICAgICAgICAgLy8gYmVj
YXVzZSB0aGF0IHdvdWxkIGRlZmVhdCB0aGUgdXNlZnVsbmVzcyBvZiBwcmVwb3B1bGF0ZVJlY3Qo
KTsgaW5zdGVhZCwgYWdlIHByZXBvcHVsYXRlZCB0aWxlcyBvdXQgYXMgaWYgdGhleSB3ZXJlIGJl
aW5nIHJlbW92ZWQuCisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBjb2hvcnQgOiBtX2NvaG9y
dExpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvaG9ydC5jb2hvcnQgIT0gdGlsZUlu
Zm8uY29ob3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICAgICAgICAgIGRvdWJsZSB0aW1lVW50aWxDb2hvcnRFeHBpcmVzID0gY29ob3J0LnRpbWVVbnRp
bEV4cGlyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVbnRpbENvaG9ydEV4
cGlyZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUmV2YWxpZGF0aW9u
VGltZXJEdXJhdGlvbiA9IHN0ZDo6bWluKG1pbmltdW1SZXZhbGlkYXRpb25UaW1lckR1cmF0aW9u
LCB0aW1lVW50aWxDb2hvcnRFeHBpcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRz
VGlsZVJldmFsaWRhdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgICAgICAgICAgICAgdGlsZUxheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZHNUaWxlUmV2YWxpZGF0aW9uKQor
ICAgICAgICBtX2NvbnRyb2xsZXIuc2NoZWR1bGVUaWxlUmV2YWxpZGF0aW9uKG1pbmltdW1SZXZh
bGlkYXRpb25UaW1lckR1cmF0aW9uKTsKKworICAgIGlmICh0aWxlc0luQ29ob3J0KQorICAgICAg
ICBzdGFydGVkTmV3Q29ob3J0KGN1cnJDb2hvcnQpOworCisgICAgaWYgKCFtX2NvbnRyb2xsZXIu
c2hvdWxkQWdncmVzc2l2ZWx5UmV0YWluVGlsZXMoKSkgeworICAgICAgICBpZiAobV9jb250cm9s
bGVyLnNob3VsZFRlbXBvcmFyaWx5UmV0YWluVGlsZUNvaG9ydHMoKSkKKyAgICAgICAgICAgIHNj
aGVkdWxlQ29ob3J0UmVtb3ZhbCgpOworICAgICAgICBlbHNlIGlmICh0aWxlc0luQ29ob3J0KQor
ICAgICAgICAgICAgcmVtb3ZlVGlsZXNJbkNvaG9ydChjdXJyQ29ob3J0KTsKKyAgICB9CisKKyAg
ICAvLyBFbnN1cmUgcHJpbWFyeSB0aWxlIGNvdmVyYWdlIHRpbGVzLgorICAgIG1fcHJpbWFyeVRp
bGVDb3ZlcmFnZVJlY3QgPSBlbnN1cmVUaWxlc0ZvclJlY3QodGlsZUNvdmVyYWdlUmVjdCwgQ292
ZXJhZ2VUeXBlOjpQcmltYXJ5VGlsZXMpOworCisgICAgaWYgKHZhbGlkYXRpb25Qb2xpY3kgJiBQ
cnVuZVNlY29uZGFyeVRpbGVzKSB7CisgICAgICAgIHJlbW92ZUFsbFNlY29uZGFyeVRpbGVzKCk7
CisgICAgICAgIG1fY29ob3J0TGlzdC5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZv
ciAoYXV0byYgc2Vjb25kYXJ5Q292ZXJhZ2VSZWN0IDogbV9zZWNvbmRhcnlUaWxlQ292ZXJhZ2VS
ZWN0cykgeworICAgICAgICAgICAgRmxvYXRSZWN0IHNlY29uZGFyeVJlY3RJbkxheWVyQ29vcmRp
bmF0ZXMoc2Vjb25kYXJ5Q292ZXJhZ2VSZWN0KTsKKyAgICAgICAgICAgIHNlY29uZGFyeVJlY3RJ
bkxheWVyQ29vcmRpbmF0ZXMuc2NhbGUoMSAvIG1fc2NhbGUpOworICAgICAgICAgICAgZW5zdXJl
VGlsZXNGb3JSZWN0KHNlY29uZGFyeVJlY3RJbkxheWVyQ29vcmRpbmF0ZXMsIENvdmVyYWdlVHlw
ZTo6U2Vjb25kYXJ5VGlsZXMpOworICAgICAgICB9CisgICAgICAgIG1fc2Vjb25kYXJ5VGlsZUNv
dmVyYWdlUmVjdHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobV9jb250cm9sbGVyLnVucGFy
ZW50c09mZnNjcmVlblRpbGVzKCkgJiYgKHZhbGlkYXRpb25Qb2xpY3kgJiBVbnBhcmVudEFsbFRp
bGVzKSkgeworICAgICAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdp
bigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgICAgICBp
dC0+dmFsdWUubGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgfQorCisgICAgYXV0
byBib3VuZHNBdExhc3RSZXZhbGlkYXRlID0gbV9jb250cm9sbGVyLmJvdW5kc0F0TGFzdFJldmFs
aWRhdGUoKTsKKyAgICBpZiAoYm91bmRzQXRMYXN0UmV2YWxpZGF0ZSAhPSBib3VuZHMpIHsKKyAg
ICAgICAgLy8gSWYgdGhlcmUgYXJlIG1hcmdpbiB0aWxlcyBhbmQgdGhlIGJvdW5kcyBoYXZlIGdy
b3duIHRhbGxlciBvciB3aWRlciwgdGhlbiB0aGUgdGlsZXMgdGhhdCB1c2VkIHRvCisgICAgICAg
IC8vIGJlIGJvdHRvbSBvciByaWdodCBtYXJnaW4gdGlsZXMgbmVlZCB0byBiZSBpbnZhbGlkYXRl
ZC4KKyAgICAgICAgaWYgKG1fY29udHJvbGxlci5oYXNNYXJnaW5zKCkpIHsKKyAgICAgICAgICAg
IGlmIChib3VuZHMud2lkdGgoKSA+IGJvdW5kc0F0TGFzdFJldmFsaWRhdGUud2lkdGgoKSB8fCBi
b3VuZHMuaGVpZ2h0KCkgPiBib3VuZHNBdExhc3RSZXZhbGlkYXRlLmhlaWdodCgpKSB7CisgICAg
ICAgICAgICAgICAgSW50UmVjdCBib3VuZHNXaXRob3V0TWFyZ2luID0gbV9jb250cm9sbGVyLmJv
dW5kc1dpdGhvdXRNYXJnaW4oKTsKKyAgICAgICAgICAgICAgICBJbnRSZWN0IG9sZEJvdW5kc1dp
dGhvdXRNYXJnaW4gPSBtX2NvbnRyb2xsZXIuYm91bmRzQXRMYXN0UmV2YWxpZGF0ZVdpdGhvdXRN
YXJnaW4oKTsKKworICAgICAgICAgICAgICAgIGlmIChib3VuZHMuaGVpZ2h0KCkgPiBib3VuZHNB
dExhc3RSZXZhbGlkYXRlLmhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEludFJlY3Qg
Zm9ybWVyQm90dG9tTWFyZ2luUmVjdCA9IEludFJlY3Qob2xkQm91bmRzV2l0aG91dE1hcmdpbi54
KCksIG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4uaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAg
ICAgICBvbGRCb3VuZHNXaXRob3V0TWFyZ2luLndpZHRoKCksIGJvdW5kc1dpdGhvdXRNYXJnaW4u
aGVpZ2h0KCkgLSBvbGRCb3VuZHNXaXRob3V0TWFyZ2luLmhlaWdodCgpKTsKKyAgICAgICAgICAg
ICAgICAgICAgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGZvcm1lckJvdHRvbU1hcmdpblJlY3QpOwor
ICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChib3VuZHMud2lkdGgoKSA+
IGJvdW5kc0F0TGFzdFJldmFsaWRhdGUud2lkdGgoKSkgeworICAgICAgICAgICAgICAgICAgICBJ
bnRSZWN0IGZvcm1lclJpZ2h0TWFyZ2luUmVjdCA9IEludFJlY3Qob2xkQm91bmRzV2l0aG91dE1h
cmdpbi53aWR0aCgpLCBvbGRCb3VuZHNXaXRob3V0TWFyZ2luLnkoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGJvdW5kc1dpdGhvdXRNYXJnaW4ud2lkdGgoKSAtIG9sZEJvdW5kc1dpdGhvdXRN
YXJnaW4ud2lkdGgoKSwgb2xkQm91bmRzV2l0aG91dE1hcmdpbi5oZWlnaHQoKSk7CisgICAgICAg
ICAgICAgICAgICAgIHNldE5lZWRzRGlzcGxheUluUmVjdChmb3JtZXJSaWdodE1hcmdpblJlY3Qp
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
IEZsb2F0UmVjdCBzY2FsZWRCb3VuZHMoYm91bmRzKTsKKyAgICAgICAgc2NhbGVkQm91bmRzLnNj
YWxlKG1fc2NhbGUpOworICAgICAgICBJbnRSZWN0IGJvdW5kc0luVGlsZUNvb3JkcyhlbmNsb3Np
bmdJbnRSZWN0KHNjYWxlZEJvdW5kcykpOworCisgICAgICAgIFRpbGVJbmRleCB0b3BMZWZ0Rm9y
Qm91bmRzOworICAgICAgICBUaWxlSW5kZXggYm90dG9tUmlnaHRGb3JCb3VuZHM7CisgICAgICAg
IGdldFRpbGVJbmRleFJhbmdlRm9yUmVjdChib3VuZHNJblRpbGVDb29yZHMsIHRvcExlZnRGb3JC
b3VuZHMsIGJvdHRvbVJpZ2h0Rm9yQm91bmRzKTsKKworICAgICAgICBWZWN0b3I8VGlsZUluZGV4
PiB0aWxlc1RvUmVtb3ZlOworICAgICAgICBmb3IgKGF1dG8mIGluZGV4IDogbV90aWxlcy5rZXlz
KCkpIHsKKyAgICAgICAgICAgIGlmIChpbmRleC55KCkgPCB0b3BMZWZ0Rm9yQm91bmRzLnkoKSB8
fCBpbmRleC55KCkgPiBib3R0b21SaWdodEZvckJvdW5kcy55KCkgfHwgaW5kZXgueCgpIDwgdG9w
TGVmdEZvckJvdW5kcy54KCkgfHwgaW5kZXgueCgpID4gYm90dG9tUmlnaHRGb3JCb3VuZHMueCgp
KQorICAgICAgICAgICAgICAgIHRpbGVzVG9SZW1vdmUuYXBwZW5kKGluZGV4KTsKKyAgICAgICAg
fQorICAgICAgICByZW1vdmVUaWxlcyh0aWxlc1RvUmVtb3ZlKTsKKyAgICB9CisKKyAgICBtX2Nv
bnRyb2xsZXIuZGlkUmV2YWxpZGF0ZVRpbGVzKCk7Cit9CisKK1RpbGVHcmlkOjpUaWxlQ29ob3J0
IFRpbGVHcmlkOjpuZXh0VGlsZUNvaG9ydCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2NvaG9ydExp
c3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gbV9jb2hvcnRMaXN0Lmxhc3QoKS5jb2hvcnQg
KyAxOworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVGlsZUdyaWQ6OnN0YXJ0ZWROZXdDb2hv
cnQoVGlsZUNvaG9ydCBjb2hvcnQpCit7CisgICAgbV9jb2hvcnRMaXN0LmFwcGVuZChUaWxlQ29o
b3J0SW5mbyhjb2hvcnQsIG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpKSk7CisjaWYgUExB
VEZPUk0oSU9TKQorICAgIGlmICghbV9jb250cm9sbGVyLmlzSW5XaW5kb3coKSkKKyAgICAgICAg
dGlsZUNvbnRyb2xsZXJNZW1vcnlIYW5kbGVyKCkudGlsZUNvbnRyb2xsZXJHYWluZWRVbnBhcmVu
dGVkVGlsZXMoJm1fY29udHJvbGxlcik7CisjZW5kaWYKK30KKworVGlsZUdyaWQ6OlRpbGVDb2hv
cnQgVGlsZUdyaWQ6Om5ld2VzdFRpbGVDb2hvcnQoKSBjb25zdAoreworICAgIHJldHVybiBtX2Nv
aG9ydExpc3QuaXNFbXB0eSgpID8gMCA6IG1fY29ob3J0TGlzdC5sYXN0KCkuY29ob3J0OworfQor
CitUaWxlR3JpZDo6VGlsZUNvaG9ydCBUaWxlR3JpZDo6b2xkZXN0VGlsZUNvaG9ydCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fY29ob3J0TGlzdC5pc0VtcHR5KCkgPyAwIDogbV9jb2hvcnRMaXN0
LmZpcnN0KCkuY29ob3J0OworfQorCit2b2lkIFRpbGVHcmlkOjpzY2hlZHVsZUNvaG9ydFJlbW92
YWwoKQoreworICAgIGNvbnN0IGRvdWJsZSBjb2hvcnRSZW1vdmFsVGltZXJTZWNvbmRzID0gMTsK
KworICAgIC8vIFN0YXJ0IHRoZSB0aW1lciwgb3IgcmVzY2hlZHVsZSB0aGUgdGltZXIgZnJvbSBu
b3cgaWYgaXQncyBhbHJlYWR5IGFjdGl2ZS4KKyAgICBpZiAoIW1fY29ob3J0UmVtb3ZhbFRpbWVy
LmlzQWN0aXZlKCkpCisgICAgICAgIG1fY29ob3J0UmVtb3ZhbFRpbWVyLnN0YXJ0UmVwZWF0aW5n
KGNvaG9ydFJlbW92YWxUaW1lclNlY29uZHMpOworfQorCitkb3VibGUgVGlsZUdyaWQ6OlRpbGVD
b2hvcnRJbmZvOjp0aW1lVW50aWxFeHBpcmF0aW9uKCkKK3sKKyAgICBkb3VibGUgY29ob3J0TGlm
ZVRpbWVTZWNvbmRzID0gMjsKKyAgICBkb3VibGUgdGltZVRocmVzaG9sZCA9IG1vbm90b25pY2Fs
bHlJbmNyZWFzaW5nVGltZSgpIC0gY29ob3J0TGlmZVRpbWVTZWNvbmRzOworICAgIHJldHVybiBj
cmVhdGlvblRpbWUgLSB0aW1lVGhyZXNob2xkOworfQorCit2b2lkIFRpbGVHcmlkOjpjb2hvcnRS
ZW1vdmFsVGltZXJGaXJlZChUaW1lcjxUaWxlR3JpZD4qKQoreworICAgIGlmIChtX2NvaG9ydExp
c3QuaXNFbXB0eSgpKSB7CisgICAgICAgIG1fY29ob3J0UmVtb3ZhbFRpbWVyLnN0b3AoKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICghbV9jb2hvcnRMaXN0LmlzRW1wdHko
KSAmJiBtX2NvaG9ydExpc3QuZmlyc3QoKS50aW1lVW50aWxFeHBpcmF0aW9uKCkgPCAwKSB7Cisg
ICAgICAgIFRpbGVDb2hvcnRJbmZvIGZpcnN0Q29ob3J0ID0gbV9jb2hvcnRMaXN0LnRha2VGaXJz
dCgpOworICAgICAgICByZW1vdmVUaWxlc0luQ29ob3J0KGZpcnN0Q29ob3J0LmNvaG9ydCk7Cisg
ICAgfQorCisgICAgbV9jb250cm9sbGVyLnVwZGF0ZVRpbGVDb3ZlcmFnZU1hcCgpOworfQorCitJ
bnRSZWN0IFRpbGVHcmlkOjplbnN1cmVUaWxlc0ZvclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0
LCBDb3ZlcmFnZVR5cGUgbmV3VGlsZVR5cGUpCit7CisgICAgaWYgKG1fY29udHJvbGxlci51bnBh
cmVudHNPZmZzY3JlZW5UaWxlcygpICYmICFtX2NvbnRyb2xsZXIuaXNJbldpbmRvdygpKQorICAg
ICAgICByZXR1cm4gSW50UmVjdCgpOworCisgICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QocmVjdCk7
CisgICAgc2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKKyAgICBJbnRSZWN0IHJlY3RJblRpbGVD
b29yZHMoZW5jbG9zaW5nSW50UmVjdChzY2FsZWRSZWN0KSk7CisKKyAgICBUaWxlSW5kZXggdG9w
TGVmdDsKKyAgICBUaWxlSW5kZXggYm90dG9tUmlnaHQ7CisgICAgZ2V0VGlsZUluZGV4UmFuZ2VG
b3JSZWN0KHJlY3RJblRpbGVDb29yZHMsIHRvcExlZnQsIGJvdHRvbVJpZ2h0KTsKKworICAgIFRp
bGVDb2hvcnQgY3VyckNvaG9ydCA9IG5leHRUaWxlQ29ob3J0KCk7CisgICAgdW5zaWduZWQgdGls
ZXNJbkNvaG9ydCA9IDA7CisKKyAgICBJbnRSZWN0IGNvdmVyYWdlUmVjdDsKKworICAgIGZvciAo
aW50IHkgPSB0b3BMZWZ0LnkoKTsgeSA8PSBib3R0b21SaWdodC55KCk7ICsreSkgeworICAgICAg
ICBmb3IgKGludCB4ID0gdG9wTGVmdC54KCk7IHggPD0gYm90dG9tUmlnaHQueCgpOyArK3gpIHsK
KyAgICAgICAgICAgIFRpbGVJbmRleCB0aWxlSW5kZXgoeCwgeSk7CisKKyAgICAgICAgICAgIElu
dFJlY3QgdGlsZVJlY3QgPSByZWN0Rm9yVGlsZUluZGV4KHRpbGVJbmRleCk7CisgICAgICAgICAg
ICBUaWxlSW5mbyYgdGlsZUluZm8gPSBtX3RpbGVzLmFkZCh0aWxlSW5kZXgsIFRpbGVJbmZvKCkp
Lml0ZXJhdG9yLT52YWx1ZTsKKworICAgICAgICAgICAgY292ZXJhZ2VSZWN0LnVuaXRlKHRpbGVS
ZWN0KTsKKworICAgICAgICAgICAgYm9vbCBzaG91bGRDaGFuZ2VUaWxlTGF5ZXJGcmFtZSA9IGZh
bHNlOworCisgICAgICAgICAgICBpZiAoIXRpbGVJbmZvLmxheWVyKSB7CisgICAgICAgICAgICAg
ICAgdGlsZUluZm8ubGF5ZXIgPSBtX2NvbnRyb2xsZXIuY3JlYXRlVGlsZUxheWVyKHRpbGVSZWN0
LCAqdGhpcyk7CisgICAgICAgICAgICAgICAgQVNTRVJUKCFtX3RpbGVSZXBhaW50Q291bnRzLmNv
bnRhaW5zKHRpbGVJbmZvLmxheWVyLmdldCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhIGxheWVyIGZvciB0aGlzIHRpbGUuIEVu
c3VyZSB0aGF0IGl0cyBzaXplIGlzIGNvcnJlY3QuCisgICAgICAgICAgICAgICAgRmxvYXRTaXpl
IHRpbGVMYXllclNpemUodGlsZUluZm8ubGF5ZXItPmJvdW5kcygpLnNpemUoKSk7CisgICAgICAg
ICAgICAgICAgc2hvdWxkQ2hhbmdlVGlsZUxheWVyRnJhbWUgPSB0aWxlTGF5ZXJTaXplICE9IEZs
b2F0U2l6ZSh0aWxlUmVjdC5zaXplKCkpOworCisgICAgICAgICAgICAgICAgaWYgKHNob3VsZENo
YW5nZVRpbGVMYXllckZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbGVJbmZvLmxheWVy
LT5zZXRCb3VuZHMoRmxvYXRSZWN0KEZsb2F0UG9pbnQoKSwgdGlsZVJlY3Quc2l6ZSgpKSk7Cisg
ICAgICAgICAgICAgICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXRQb3NpdGlvbih0aWxlUmVjdC5s
b2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZUluZm8ubGF5ZXItPnNldE5lZWRz
RGlzcGxheSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKG5ld1RpbGVUeXBlID09IENvdmVyYWdlVHlwZTo6U2Vjb25kYXJ5VGlsZXMgJiYgIXRp
bGVSZWN0LmludGVyc2VjdHMobV9wcmltYXJ5VGlsZUNvdmVyYWdlUmVjdCkpIHsKKyAgICAgICAg
ICAgICAgICB0aWxlSW5mby5jb2hvcnQgPSBjdXJyQ29ob3J0OworICAgICAgICAgICAgICAgICsr
dGlsZXNJbkNvaG9ydDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBzaG91bGRQ
YXJlbnRUaWxlTGF5ZXIgPSAoIW1fY29udHJvbGxlci51bnBhcmVudHNPZmZzY3JlZW5UaWxlcygp
IHx8IG1fY29udHJvbGxlci5pc0luV2luZG93KCkpICYmICF0aWxlSW5mby5sYXllci0+c3VwZXJs
YXllcigpOworCisgICAgICAgICAgICBpZiAoc2hvdWxkUGFyZW50VGlsZUxheWVyKQorICAgICAg
ICAgICAgICAgIG1fY29udGFpbmVyTGF5ZXIuZ2V0KCkuYXBwZW5kU3VibGF5ZXIodGlsZUluZm8u
bGF5ZXIuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmICh0aWxlc0luQ29o
b3J0KQorICAgICAgICBzdGFydGVkTmV3Q29ob3J0KGN1cnJDb2hvcnQpOworCisgICAgcmV0dXJu
IGNvdmVyYWdlUmVjdDsKK30KKworSW50UmVjdCBUaWxlR3JpZDo6ZXh0ZW50KCkgY29uc3QKK3sK
KyAgICBUaWxlSW5kZXggdG9wTGVmdDsKKyAgICBUaWxlSW5kZXggYm90dG9tUmlnaHQ7CisgICAg
Z2V0VGlsZUluZGV4UmFuZ2VGb3JSZWN0KG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3QsIHRvcExl
ZnQsIGJvdHRvbVJpZ2h0KTsKKworICAgIC8vIFJldHVybiBpbmRleCBvZiB0b3AsIGxlZnQgdGls
ZSBhbmQgdGhlIG51bWJlciBvZiB0aWxlcyBhY3Jvc3MgYW5kIGRvd24uCisgICAgcmV0dXJuIElu
dFJlY3QodG9wTGVmdC54KCksIHRvcExlZnQueSgpLCBib3R0b21SaWdodC54KCkgLSB0b3BMZWZ0
LngoKSArIDEsIGJvdHRvbVJpZ2h0LnkoKSAtIHRvcExlZnQueSgpICsgMSk7Cit9CisKK2RvdWJs
ZSBUaWxlR3JpZDo6cmV0YWluZWRUaWxlQmFja2luZ1N0b3JlTWVtb3J5KCkgY29uc3QKK3sKKyAg
ICBkb3VibGUgdG90YWxCeXRlcyA9IDA7CisgICAgCisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9p
dGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0g
ZW5kOyArK2l0KSB7CisgICAgICAgIGNvbnN0IFRpbGVJbmZvJiB0aWxlSW5mbyA9IGl0LT52YWx1
ZTsKKyAgICAgICAgaWYgKHRpbGVJbmZvLmxheWVyLT5zdXBlcmxheWVyKCkpIHsKKyAgICAgICAg
ICAgIEZsb2F0UmVjdCBib3VuZHMgPSB0aWxlSW5mby5sYXllci0+Ym91bmRzKCk7CisgICAgICAg
ICAgICBkb3VibGUgY29udGVudHNTY2FsZSA9IHRpbGVJbmZvLmxheWVyLT5jb250ZW50c1NjYWxl
KCk7CisgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IDQgKiBib3VuZHMud2lkdGgoKSAqIGNvbnRl
bnRzU2NhbGUgKiBib3VuZHMuaGVpZ2h0KCkgKiBjb250ZW50c1NjYWxlOworICAgICAgICB9Cisg
ICAgfQorCisgICAgcmV0dXJuIHRvdGFsQnl0ZXM7Cit9CisKKy8vIFJldHVybiB0aGUgcmVjdCBp
biBsYXllciBjb29yZHMsIG5vdCB0aWxlIGNvb3Jkcy4KK0ludFJlY3QgVGlsZUdyaWQ6OnRpbGVD
b3ZlcmFnZVJlY3QoKSBjb25zdAoreworICAgIEludFJlY3QgY292ZXJhZ2VSZWN0SW5MYXllckNv
b3JkcyhtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0KTsKKyAgICBjb3ZlcmFnZVJlY3RJbkxheWVy
Q29vcmRzLnNjYWxlKDEgLyBtX3NjYWxlKTsKKyAgICByZXR1cm4gY292ZXJhZ2VSZWN0SW5MYXll
ckNvb3JkczsKK30KKwordm9pZCBUaWxlR3JpZDo6ZHJhd1RpbGVNYXBDb250ZW50cyhDR0NvbnRl
eHRSZWYgY29udGV4dCwgQ0dSZWN0IGxheWVyQm91bmRzKSBjb25zdAoreworICAgIENHQ29udGV4
dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCAwLjMsIDAuMywgMC4zLCAxKTsKKyAgICBDR0NvbnRl
eHRGaWxsUmVjdChjb250ZXh0LCBsYXllckJvdW5kcyk7CisKKyAgICBDR0Zsb2F0IHNjYWxlRmFj
dG9yID0gbGF5ZXJCb3VuZHMuc2l6ZS53aWR0aCAvIG1fY29udHJvbGxlci5ib3VuZHMoKS53aWR0
aCgpOworCisgICAgQ0dGbG9hdCBjb250ZXh0U2NhbGUgPSBzY2FsZUZhY3RvciAvIG1fc2NhbGU7
CisgICAgQ0dDb250ZXh0U2NhbGVDVE0oY29udGV4dCwgY29udGV4dFNjYWxlLCBjb250ZXh0U2Nh
bGUpOworICAgIAorICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RpbGVz
LmJlZ2luKCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAg
ICBjb25zdCBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+dmFsdWU7CisgICAgICAgIFBsYXRmb3Jt
Q0FMYXllciogdGlsZUxheWVyID0gdGlsZUluZm8ubGF5ZXIuZ2V0KCk7CisKKyAgICAgICAgQ0dG
bG9hdCByZWQgPSAxOworICAgICAgICBDR0Zsb2F0IGdyZWVuID0gMTsKKyAgICAgICAgQ0dGbG9h
dCBibHVlID0gMTsKKyAgICAgICAgQ0dGbG9hdCBhbHBoYSA9IDE7CisgICAgICAgIGlmICh0aWxl
SW5mby5oYXNTdGFsZUNvbnRlbnQpIHsKKyAgICAgICAgICAgIHJlZCA9IDAuMjU7CisgICAgICAg
ICAgICBncmVlbiA9IDAuMTI1OworICAgICAgICAgICAgYmx1ZSA9IDA7CisgICAgICAgIH0gZWxz
ZSBpZiAobV9jb250cm9sbGVyLnNob3VsZEFnZ3Jlc3NpdmVseVJldGFpblRpbGVzKCkgJiYgdGls
ZUluZm8uY29ob3J0ICE9IFZpc2libGVUaWxlQ29ob3J0KSB7CisgICAgICAgICAgICByZWQgPSAw
Ljg7CisgICAgICAgICAgICBncmVlbiA9IDAuODsKKyAgICAgICAgICAgIGJsdWUgPSAwLjg7Cisg
ICAgICAgIH0KKworICAgICAgICBUaWxlQ29ob3J0IG5ld2VzdENvaG9ydCA9IG5ld2VzdFRpbGVD
b2hvcnQoKTsKKyAgICAgICAgVGlsZUNvaG9ydCBvbGRlc3RDb2hvcnQgPSBvbGRlc3RUaWxlQ29o
b3J0KCk7CisKKyAgICAgICAgaWYgKCFtX2NvbnRyb2xsZXIuc2hvdWxkQWdncmVzc2l2ZWx5UmV0
YWluVGlsZXMoKSAmJiB0aWxlSW5mby5jb2hvcnQgIT0gVmlzaWJsZVRpbGVDb2hvcnQgJiYgbmV3
ZXN0Q29ob3J0ID4gb2xkZXN0Q29ob3J0KQorICAgICAgICAgICAgYWxwaGEgPSAxIC0gKHN0YXRp
Y19jYXN0PGZsb2F0PigobmV3ZXN0Q29ob3J0IC0gdGlsZUluZm8uY29ob3J0KSkgLyAobmV3ZXN0
Q29ob3J0IC0gb2xkZXN0Q29ob3J0KSk7CisKKyAgICAgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENv
bG9yKGNvbnRleHQsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKworICAgICAgICBpZiAodGls
ZUxheWVyLT5zdXBlcmxheWVyKCkpIHsKKyAgICAgICAgICAgIENHQ29udGV4dFNldExpbmVXaWR0
aChjb250ZXh0LCAwLjUgLyBjb250ZXh0U2NhbGUpOworICAgICAgICAgICAgQ0dDb250ZXh0U2V0
UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgMCwgMCwgMCwgMSk7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICBDR0NvbnRleHRTZXRMaW5lV2lkdGgoY29udGV4dCwgMSAvIGNvbnRleHRTY2Fs
ZSk7CisgICAgICAgICAgICBDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihjb250ZXh0LCAwLjIs
IDAuMSwgMC45LCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIENHUmVjdCBmcmFtZSA9IENHUmVj
dE1ha2UodGlsZUxheWVyLT5wb3NpdGlvbigpLngoKSwgdGlsZUxheWVyLT5wb3NpdGlvbigpLnko
KSwgdGlsZUxheWVyLT5ib3VuZHMoKS5zaXplKCkud2lkdGgoKSwgdGlsZUxheWVyLT5ib3VuZHMo
KS5zaXplKCkuaGVpZ2h0KCkpOworICAgICAgICBDR0NvbnRleHRGaWxsUmVjdChjb250ZXh0LCBm
cmFtZSk7CisgICAgICAgIENHQ29udGV4dFN0cm9rZVJlY3QoY29udGV4dCwgZnJhbWUpOworICAg
IH0KK30KKwordm9pZCBUaWxlR3JpZDo6cGxhdGZvcm1DQUxheWVyUGFpbnRDb250ZW50cyhQbGF0
Zm9ybUNBTGF5ZXIqIHBsYXRmb3JtQ0FMYXllciwgR3JhcGhpY3NDb250ZXh0JiBjb250ZXh0LCBj
b25zdCBGbG9hdFJlY3QmKQoreworI2lmIFBMQVRGT1JNKElPUykKKyAgICBpZiAocHRocmVhZF9t
YWluX25wKCkpCisgICAgICAgIFdlYlRocmVhZExvY2soKTsKKyNlbmRpZgorCisgICAgeworICAg
ICAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoY29udGV4dCk7CisKKyAg
ICAgICAgRmxvYXRQb2ludDNEIGxheWVyT3JpZ2luID0gcGxhdGZvcm1DQUxheWVyLT5wb3NpdGlv
bigpOworICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtbGF5ZXJPcmlnaW4ueCgpLCAtbGF5ZXJP
cmlnaW4ueSgpKTsKKyAgICAgICAgY29udGV4dC5zY2FsZShGbG9hdFNpemUobV9zY2FsZSwgbV9z
Y2FsZSkpOworCisgICAgICAgIFJlcGFpbnRSZWN0TGlzdCBkaXJ0eVJlY3RzID0gY29sbGVjdFJl
Y3RzVG9QYWludChjb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLCBwbGF0Zm9ybUNBTGF5ZXIpOwor
ICAgICAgICBkcmF3TGF5ZXJDb250ZW50cyhjb250ZXh0LnBsYXRmb3JtQ29udGV4dCgpLCAmbV9j
b250cm9sbGVyLnJvb3RMYXllcigpLCBkaXJ0eVJlY3RzKTsKKyAgICB9CisKKyAgICBpbnQgcmVw
YWludENvdW50ID0gcGxhdGZvcm1DQUxheWVySW5jcmVtZW50UmVwYWludENvdW50KHBsYXRmb3Jt
Q0FMYXllcik7CisgICAgaWYgKG1fY29udHJvbGxlci5yb290TGF5ZXIoKS5vd25lcigpLT5wbGF0
Zm9ybUNBTGF5ZXJTaG93UmVwYWludENvdW50ZXIoMCkpCisgICAgICAgIGRyYXdSZXBhaW50SW5k
aWNhdG9yKGNvbnRleHQucGxhdGZvcm1Db250ZXh0KCksIHBsYXRmb3JtQ0FMYXllciwgcmVwYWlu
dENvdW50LCBjYWNoZWRDR0NvbG9yKG1fY29udHJvbGxlci50aWxlRGVidWdCb3JkZXJDb2xvcigp
LCBDb2xvclNwYWNlRGV2aWNlUkdCKSk7CisKKyAgICBpZiAobV9jb250cm9sbGVyLnNjcm9sbGlu
Z1BlcmZvcm1hbmNlTG9nZ2luZ0VuYWJsZWQoKSkgeworICAgICAgICBGbG9hdFJlY3QgdmlzaWJs
ZVBhcnQocGxhdGZvcm1DQUxheWVyLT5wb3NpdGlvbigpLngoKSwgcGxhdGZvcm1DQUxheWVyLT5w
b3NpdGlvbigpLnkoKSwgcGxhdGZvcm1DQUxheWVyLT5ib3VuZHMoKS5zaXplKCkud2lkdGgoKSwg
cGxhdGZvcm1DQUxheWVyLT5ib3VuZHMoKS5zaXplKCkuaGVpZ2h0KCkpOworICAgICAgICB2aXNp
YmxlUGFydC5pbnRlcnNlY3QobV9jb250cm9sbGVyLnZpc2libGVSZWN0KCkpOworCisgICAgICAg
IGlmIChyZXBhaW50Q291bnQgPT0gMSAmJiAhdmlzaWJsZVBhcnQuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgV1RGTG9nQWx3YXlzKCJTQ1JPTExJTkc6IEZpbGxlZCB2aXNpYmxlIGZyZXNoIHRpbGUu
IFRpbWU6ICVmIFVuZmlsbGVkIFBpeGVsczogJXVcbiIsIFdURjo6bW9ub3RvbmljYWxseUluY3Jl
YXNpbmdUaW1lKCksIGJsYW5rUGl4ZWxDb3VudCgpKTsKKyAgICB9Cit9CisKK2Zsb2F0IFRpbGVH
cmlkOjpwbGF0Zm9ybUNBTGF5ZXJEZXZpY2VTY2FsZUZhY3RvcigpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fY29udHJvbGxlci5yb290TGF5ZXIoKS5vd25lcigpLT5wbGF0Zm9ybUNBTGF5ZXJEZXZp
Y2VTY2FsZUZhY3RvcigpOworfQorCitib29sIFRpbGVHcmlkOjpwbGF0Zm9ybUNBTGF5ZXJTaG93
RGVidWdCb3JkZXJzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jb250cm9sbGVyLnJvb3RMYXll
cigpLm93bmVyKCktPnBsYXRmb3JtQ0FMYXllclNob3dEZWJ1Z0JvcmRlcnMoKTsKK30KKworYm9v
bCBUaWxlR3JpZDo6cGxhdGZvcm1DQUxheWVyU2hvd1JlcGFpbnRDb3VudGVyKFBsYXRmb3JtQ0FM
YXllciopIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY29udHJvbGxlci5yb290TGF5ZXIoKS5vd25l
cigpLT5wbGF0Zm9ybUNBTGF5ZXJTaG93UmVwYWludENvdW50ZXIoMCk7Cit9CisKK2Jvb2wgVGls
ZUdyaWQ6OnBsYXRmb3JtQ0FMYXllckNvbnRlbnRzT3BhcXVlKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9jb250cm9sbGVyLnRpbGVzQXJlT3BhcXVlKCk7Cit9CisKK2ludCBUaWxlR3JpZDo6cGxh
dGZvcm1DQUxheWVySW5jcmVtZW50UmVwYWludENvdW50KFBsYXRmb3JtQ0FMYXllciogcGxhdGZv
cm1DQUxheWVyKQoreworICAgIGludCByZXBhaW50Q291bnQgPSAwOworCisgICAgaWYgKG1fdGls
ZVJlcGFpbnRDb3VudHMuY29udGFpbnMocGxhdGZvcm1DQUxheWVyKSkKKyAgICAgICAgcmVwYWlu
dENvdW50ID0gbV90aWxlUmVwYWludENvdW50cy5nZXQocGxhdGZvcm1DQUxheWVyKTsKKworICAg
IG1fdGlsZVJlcGFpbnRDb3VudHMuc2V0KHBsYXRmb3JtQ0FMYXllciwgKytyZXBhaW50Q291bnQp
OworCisgICAgcmV0dXJuIHJlcGFpbnRDb3VudDsKK30KKworI2lmIFBMQVRGT1JNKElPUykKK3Zv
aWQgVGlsZUdyaWQ6OnJlbW92ZVVucGFyZW50ZWRUaWxlc05vdygpCit7CisgICAgd2hpbGUgKCFt
X2NvaG9ydExpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgIFRpbGVDb2hvcnRJbmZvIGZpcnN0Q29o
b3J0ID0gbV9jb2hvcnRMaXN0LnRha2VGaXJzdCgpOworICAgICAgICByZW1vdmVUaWxlc0luQ29o
b3J0KGZpcnN0Q29ob3J0LmNvaG9ydCk7CisgICAgfQorfQorI2VuZGlmCisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21h
Yy9UaWxlR3JpZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2EvbWFjL1RpbGVHcmlkLmNwcAkod29ya2luZyBjb3B5KQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFjL1RpbGVHcmlkLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjMsMTggKzIzLDE4IEBACiAgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAg
Ki8KIAotI2ltcG9ydCAiY29uZmlnLmgiCi0jaW1wb3J0ICJUaWxlR3JpZC5oIgorI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlRpbGVHcmlkLmgiCiAKLSNpbXBvcnQgIkdyYXBoaWNzQ29u
dGV4dC5oIgotI2ltcG9ydCAiTGF5ZXJQb29sLmgiCi0jaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXIu
aCIKLSNpbXBvcnQgIlRpbGVDb250cm9sbGVyLmgiCi0jaW1wb3J0ICJXZWJMYXllci5oIgotI2lt
cG9ydCA8d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNp
bmNsdWRlICJMYXllclBvb2wuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNBTGF5ZXIuaCIKKyNpbmNs
dWRlICJUaWxlQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIldlYkxheWVyLmgiCisjaW5jbHVkZSA8
d3RmL01haW5UaHJlYWQuaD4KIAogI2lmIFBMQVRGT1JNKElPUykKLSNpbXBvcnQgIlRpbGVDb250
cm9sbGVyTWVtb3J5SGFuZGxlcklPUy5oIgorI2luY2x1ZGUgIlRpbGVDb250cm9sbGVyTWVtb3J5
SGFuZGxlcklPUy5oIgogI2VuZGlmCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3JpZC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3JpZC5oCShy
ZXZpc2lvbiAxNjk4MDkpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYS9t
YWMvVGlsZUdyaWQuaAkod29ya2luZyBjb3B5KQpAQCAtMzUsNiArMzUsMTAgQEAKICNpbmNsdWRl
IDx3dGYvTm9uY29weWFibGUuaD4KICNpbmNsdWRlIDx3dGYvUmVmLmg+CiAKKyNpZiBQTEFURk9S
TShDT0NPQSkKK3R5cGVkZWYgc3RydWN0IENHQ29udGV4dCAqQ0dDb250ZXh0UmVmOworI2VuZGlm
CisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgR3JhcGhpY3NDb250ZXh0OwpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2EvbWFjL1RpbGVHcmlkLm1tCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhL21hYy9UaWxlR3Jp
ZC5tbQkocmV2aXNpb24gMTY5ODA5KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2EvbWFjL1RpbGVHcmlkLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xLDcxMyArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KLSAqLwotCi0jaW1wb3J0ICJjb25maWcuaCIKLSNpbXBvcnQgIlRpbGVHcmlkLmgi
Ci0KLSNpbXBvcnQgIkdyYXBoaWNzQ29udGV4dC5oIgotI2ltcG9ydCAiTGF5ZXJQb29sLmgiCi0j
aW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXIuaCIKLSNpbXBvcnQgIlRpbGVDb250cm9sbGVyLmgiCi0j
aW1wb3J0ICJXZWJMYXllci5oIgotI2ltcG9ydCA8d3RmL01haW5UaHJlYWQuaD4KLQotI2lmIFBM
QVRGT1JNKElPUykKLSNpbXBvcnQgIlRpbGVDb250cm9sbGVyTWVtb3J5SGFuZGxlcklPUy5oIgot
I2VuZGlmCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotVGlsZUdyaWQ6OlRpbGVHcmlkKFRpbGVD
b250cm9sbGVyJiBjb250cm9sbGVyKQotICAgIDogbV9jb250cm9sbGVyKGNvbnRyb2xsZXIpCi0g
ICAgLCBtX2NvbnRhaW5lckxheWVyKCpjb250cm9sbGVyLnJvb3RMYXllcigpLmNyZWF0ZUNvbXBh
dGlibGVMYXllcihQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZUxheWVyLCBudWxscHRyKSkKLSAg
ICAsIG1fc2NhbGUoMSkKLSAgICAsIG1fY29ob3J0UmVtb3ZhbFRpbWVyKHRoaXMsICZUaWxlR3Jp
ZDo6Y29ob3J0UmVtb3ZhbFRpbWVyRmlyZWQpCi17Ci0jaWZuZGVmIE5ERUJVRwotICAgIG1fY29u
dGFpbmVyTGF5ZXIuZ2V0KCkuc2V0TmFtZSgiVGlsZUdyaWQgQ29udGFpbmVyIExheWVyIik7Ci0j
ZW5kaWYKLX0KLQotVGlsZUdyaWQ6On5UaWxlR3JpZCgpCi17Ci0gICAgQVNTRVJUKGlzTWFpblRo
cmVhZCgpKTsKLQotICAgIGZvciAoYXV0byYgdGlsZSA6IG1fdGlsZXMudmFsdWVzKCkpCi0gICAg
ICAgIHRpbGUubGF5ZXItPnNldE93bmVyKG51bGxwdHIpOwotfQotCi12b2lkIFRpbGVHcmlkOjpz
ZXRTY2FsZShmbG9hdCBzY2FsZSkKLXsKLSAgICBtX3NjYWxlID0gc2NhbGU7Ci0KLSAgICBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm07Ci0gICAgdHJhbnNmb3JtLnNjYWxlKDEgLyBtX3Nj
YWxlKTsKLSAgICBtX2NvbnRhaW5lckxheWVyLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQot
ICAgIC8vIEZJWE1FOiB3ZSBtYXkgcmV2YWxpZGF0ZVRpbGVzIHR3aWNlIGluIHRoaXMgY29tbWl0
LgotICAgIHJldmFsaWRhdGVUaWxlcyhQcnVuZVNlY29uZGFyeVRpbGVzKTsKLQotICAgIGZvciAo
YXV0byYgdGlsZSA6IG1fdGlsZXMudmFsdWVzKCkpCi0gICAgICAgIHRpbGUubGF5ZXItPnNldENv
bnRlbnRzU2NhbGUobV9jb250cm9sbGVyLmRldmljZVNjYWxlRmFjdG9yKCkpOwotfQotCi12b2lk
IFRpbGVHcmlkOjpzZXROZWVkc0Rpc3BsYXkoKQotewotICAgIGZvciAoYXV0byYgZW50cnkgOiBt
X3RpbGVzKSB7Ci0gICAgICAgIFRpbGVJbmZvJiB0aWxlSW5mbyA9IGVudHJ5LnZhbHVlOwotICAg
ICAgICBJbnRSZWN0IHRpbGVSZWN0ID0gcmVjdEZvclRpbGVJbmRleChlbnRyeS5rZXkpOwotCi0g
ICAgICAgIGlmICh0aWxlUmVjdC5pbnRlcnNlY3RzKG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJlY3Qp
ICYmIHRpbGVJbmZvLmxheWVyLT5zdXBlcmxheWVyKCkpCi0gICAgICAgICAgICB0aWxlSW5mby5s
YXllci0+c2V0TmVlZHNEaXNwbGF5KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRpbGVJ
bmZvLmhhc1N0YWxlQ29udGVudCA9IHRydWU7Ci0gICAgfQotfQotCi12b2lkIFRpbGVHcmlkOjpz
ZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAobV90
aWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEZsb2F0UmVjdCBzY2FsZWRS
ZWN0KHJlY3QpOwotICAgIHNjYWxlZFJlY3Quc2NhbGUobV9zY2FsZSk7Ci0gICAgSW50UmVjdCBy
ZXBhaW50UmVjdEluVGlsZUNvb3JkcyhlbmNsb3NpbmdJbnRSZWN0KHNjYWxlZFJlY3QpKTsKLQot
ICAgIEludFNpemUgdGlsZVNpemUgPSBtX2NvbnRyb2xsZXIudGlsZVNpemUoKTsKLQotICAgIC8v
IEZvciBzbWFsbCBpbnZhbGlkYXRpb25zLCBsb29rdXAgdGhlIGNvdmVyZWQgdGlsZXMuCi0gICAg
aWYgKHJlcGFpbnRSZWN0SW5UaWxlQ29vcmRzLmhlaWdodCgpIDwgMiAqIHRpbGVTaXplLmhlaWdo
dCgpICYmIHJlcGFpbnRSZWN0SW5UaWxlQ29vcmRzLndpZHRoKCkgPCAyICogdGlsZVNpemUud2lk
dGgoKSkgewotICAgICAgICBUaWxlSW5kZXggdG9wTGVmdDsKLSAgICAgICAgVGlsZUluZGV4IGJv
dHRvbVJpZ2h0OwotICAgICAgICBnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3QocmVwYWludFJlY3RJ
blRpbGVDb29yZHMsIHRvcExlZnQsIGJvdHRvbVJpZ2h0KTsKLQotICAgICAgICBmb3IgKGludCB5
ID0gdG9wTGVmdC55KCk7IHkgPD0gYm90dG9tUmlnaHQueSgpOyArK3kpIHsKLSAgICAgICAgICAg
IGZvciAoaW50IHggPSB0b3BMZWZ0LngoKTsgeCA8PSBib3R0b21SaWdodC54KCk7ICsreCkgewot
ICAgICAgICAgICAgICAgIFRpbGVJbmRleCB0aWxlSW5kZXgoeCwgeSk7Ci0gICAgICAgICAgICAg
ICAgCi0gICAgICAgICAgICAgICAgVGlsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX3RpbGVzLmZpbmQo
dGlsZUluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbV90aWxlcy5lbmQoKSkKLSAg
ICAgICAgICAgICAgICAgICAgc2V0VGlsZU5lZWRzRGlzcGxheUluUmVjdCh0aWxlSW5kZXgsIGl0
LT52YWx1ZSwgcmVwYWludFJlY3RJblRpbGVDb29yZHMsIG1fcHJpbWFyeVRpbGVDb3ZlcmFnZVJl
Y3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpLCBlbmQgPSBt
X3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgIHNldFRpbGVOZWVkc0Rpc3Bs
YXlJblJlY3QoaXQtPmtleSwgaXQtPnZhbHVlLCByZXBhaW50UmVjdEluVGlsZUNvb3JkcywgbV9w
cmltYXJ5VGlsZUNvdmVyYWdlUmVjdCk7Ci19Ci0KLXZvaWQgVGlsZUdyaWQ6OmRyb3BUaWxlc0lu
UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGlmIChtX3RpbGVzLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgRmxvYXRSZWN0IHNjYWxlZFJlY3QocmVjdCk7Ci0gICAg
c2NhbGVkUmVjdC5zY2FsZShtX3NjYWxlKTsKLSAgICBJbnRSZWN0IGRyb3BSZWN0SW5UaWxlQ29v
cmRzKGVuY2xvc2luZ0ludFJlY3Qoc2NhbGVkUmVjdCkpOwotCi0gICAgVmVjdG9yPFRpbGVJbmRl
eD4gdGlsZXNUb1JlbW92ZTsKLQotICAgIGZvciAoYXV0byYgaW5kZXggOiBtX3RpbGVzLmtleXMo
KSkgewotICAgICAgICBpZiAocmVjdEZvclRpbGVJbmRleChpbmRleCkuaW50ZXJzZWN0cyhkcm9w
UmVjdEluVGlsZUNvb3JkcykpCi0gICAgICAgICAgICB0aWxlc1RvUmVtb3ZlLmFwcGVuZChpbmRl
eCk7Ci0gICAgfQotCi0gICAgcmVtb3ZlVGlsZXModGlsZXNUb1JlbW92ZSk7Ci19Ci0KLXZvaWQg
VGlsZUdyaWQ6OnNldFRpbGVOZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgVGlsZUluZGV4JiB0aWxl
SW5kZXgsIFRpbGVJbmZvJiB0aWxlSW5mbywgY29uc3QgSW50UmVjdCYgcmVwYWludFJlY3RJblRp
bGVDb29yZHMsIGNvbnN0IEludFJlY3QmIGNvdmVyYWdlUmVjdEluVGlsZUNvb3JkcykKLXsKLSAg
ICBQbGF0Zm9ybUNBTGF5ZXIqIHRpbGVMYXllciA9IHRpbGVJbmZvLmxheWVyLmdldCgpOwotCi0g
ICAgSW50UmVjdCB0aWxlUmVjdCA9IHJlY3RGb3JUaWxlSW5kZXgodGlsZUluZGV4KTsKLSAgICBG
bG9hdFJlY3QgdGlsZVJlcGFpbnRSZWN0ID0gdGlsZVJlY3Q7Ci0gICAgdGlsZVJlcGFpbnRSZWN0
LmludGVyc2VjdChyZXBhaW50UmVjdEluVGlsZUNvb3Jkcyk7Ci0gICAgaWYgKHRpbGVSZXBhaW50
UmVjdC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHRpbGVSZXBhaW50UmVjdC5t
b3ZlQnkoLXRpbGVSZWN0LmxvY2F0aW9uKCkpOwotICAgIAotICAgIC8vIFdlIGNvdWxkIHRlc3Qg
Zm9yIGludGVyc2VjdGlvbiB3aXRoIHRoZSB2aXNpYmxlIHJlY3QuIFRoaXMgd291bGQgcmVkdWNl
IHBhaW50aW5nIHlldCBtb3JlLAotICAgIC8vIGJ1dCBtYXkgbWFrZSBzY3JvbGxpbmcgc3RhbGUg
dGlsZXMgaW50byB2aWV3IG1vcmUgZnJlcXVlbnQuCi0gICAgaWYgKHRpbGVSZWN0LmludGVyc2Vj
dHMoY292ZXJhZ2VSZWN0SW5UaWxlQ29vcmRzKSAmJiB0aWxlTGF5ZXItPnN1cGVybGF5ZXIoKSkg
ewotICAgICAgICB0aWxlTGF5ZXItPnNldE5lZWRzRGlzcGxheSgmdGlsZVJlcGFpbnRSZWN0KTsK
LQotICAgICAgICBpZiAobV9jb250cm9sbGVyLnJvb3RMYXllcigpLm93bmVyKCktPnBsYXRmb3Jt
Q0FMYXllclNob3dSZXBhaW50Q291bnRlcigwKSkgewotICAgICAgICAgICAgRmxvYXRSZWN0IGlu
ZGljYXRvclJlY3QoMCwgMCwgNTIsIDI3KTsKLSAgICAgICAgICAgIHRpbGVMYXllci0+c2V0TmVl
ZHNEaXNwbGF5KCZpbmRpY2F0b3JSZWN0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAg
ICB0aWxlSW5mby5oYXNTdGFsZUNvbnRlbnQgPSB0cnVlOwotfQotCi12b2lkIFRpbGVHcmlkOjp1
cGRhdGVUaWxlTGF5ZXJQcm9wZXJ0aWVzKCkKLXsKLSAgICBib29sIGFjY2VsZXJhdGVzRHJhd2lu
ZyA9IG1fY29udHJvbGxlci5hY2NlbGVyYXRlc0RyYXdpbmcoKTsKLSAgICBib29sIG9wYXF1ZSA9
IG1fY29udHJvbGxlci50aWxlc0FyZU9wYXF1ZSgpOwotICAgIENvbG9yIHRpbGVEZWJ1Z0JvcmRl
ckNvbG9yID0gbV9jb250cm9sbGVyLnRpbGVEZWJ1Z0JvcmRlckNvbG9yKCk7Ci0gICAgZmxvYXQg
dGlsZURlYnVnQm9yZGVyV2lkdGggPSBtX2NvbnRyb2xsZXIudGlsZURlYnVnQm9yZGVyV2lkdGgo
KTsKLQotICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2lu
KCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBjb25z
dCBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+dmFsdWU7Ci0gICAgICAgIHRpbGVJbmZvLmxheWVy
LT5zZXRBY2NlbGVyYXRlc0RyYXdpbmcoYWNjZWxlcmF0ZXNEcmF3aW5nKTsKLSAgICAgICAgdGls
ZUluZm8ubGF5ZXItPnNldE9wYXF1ZShvcGFxdWUpOwotICAgICAgICB0aWxlSW5mby5sYXllci0+
c2V0Qm9yZGVyQ29sb3IodGlsZURlYnVnQm9yZGVyQ29sb3IpOwotICAgICAgICB0aWxlSW5mby5s
YXllci0+c2V0Qm9yZGVyV2lkdGgodGlsZURlYnVnQm9yZGVyV2lkdGgpOwotICAgIH0KLX0KLQot
Ym9vbCBUaWxlR3JpZDo6dGlsZXNXb3VsZENoYW5nZUZvclZpc2libGVSZWN0KGNvbnN0IEZsb2F0
UmVjdCYgbmV3VmlzaWJsZVJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgb2xkVmlzaWJsZVJlY3QpIGNv
bnN0Ci17Ci0gICAgRmxvYXRSZWN0IHZpc2libGVSZWN0ID0gbmV3VmlzaWJsZVJlY3Q7Ci0KLSAg
ICBpZiAodmlzaWJsZVJlY3QuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIAotICAgIEZsb2F0UmVjdCBjdXJyZW50VGlsZUNvdmVyYWdlUmVjdCA9IG1fY29udHJvbGxl
ci5jb21wdXRlVGlsZUNvdmVyYWdlUmVjdChvbGRWaXNpYmxlUmVjdCwgbmV3VmlzaWJsZVJlY3Qp
OwotICAgIEZsb2F0UmVjdCBzY2FsZWRSZWN0KGN1cnJlbnRUaWxlQ292ZXJhZ2VSZWN0KTsKLSAg
ICBzY2FsZWRSZWN0LnNjYWxlKG1fc2NhbGUpOwotICAgIEludFJlY3QgY3VycmVudENvdmVyYWdl
UmVjdEluVGlsZUNvb3JkcyhlbmNsb3NpbmdJbnRSZWN0KHNjYWxlZFJlY3QpKTsKLQotICAgIFRp
bGVJbmRleCB0b3BMZWZ0OwotICAgIFRpbGVJbmRleCBib3R0b21SaWdodDsKLSAgICBnZXRUaWxl
SW5kZXhSYW5nZUZvclJlY3QoY3VycmVudENvdmVyYWdlUmVjdEluVGlsZUNvb3JkcywgdG9wTGVm
dCwgYm90dG9tUmlnaHQpOwotCi0gICAgSW50UmVjdCBjb3ZlcmFnZVJlY3QgPSByZWN0Rm9yVGls
ZUluZGV4KHRvcExlZnQpOwotICAgIGNvdmVyYWdlUmVjdC51bml0ZShyZWN0Rm9yVGlsZUluZGV4
KGJvdHRvbVJpZ2h0KSk7Ci0gICAgcmV0dXJuIGNvdmVyYWdlUmVjdCAhPSBtX3ByaW1hcnlUaWxl
Q292ZXJhZ2VSZWN0OwotfQotCi1ib29sIFRpbGVHcmlkOjpwcmVwb3B1bGF0ZVJlY3QoY29uc3Qg
RmxvYXRSZWN0JiByZWN0KQotewotICAgIEludFJlY3QgZW5jbG9zaW5nQ292ZXJhZ2VSZWN0ID0g
ZW5jbG9zaW5nSW50UmVjdChyZWN0KTsKLSAgICBpZiAobV9wcmltYXJ5VGlsZUNvdmVyYWdlUmVj
dC5jb250YWlucyhlbmNsb3NpbmdDb3ZlcmFnZVJlY3QpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICBtX3NlY29uZGFyeVRpbGVDb3ZlcmFnZVJlY3RzLmFwcGVuZChlbmNsb3NpbmdDb3Zl
cmFnZVJlY3QpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1JbnRSZWN0IFRpbGVHcmlkOjpyZWN0
Rm9yVGlsZUluZGV4KGNvbnN0IFRpbGVJbmRleCYgdGlsZUluZGV4KSBjb25zdAotewotICAgIC8v
IEZJWE1FOiBjYWxjdWxhdGluZyB0aGUgc2NhbGVkIHNpemUgaGVyZSBzaG91bGQgbWF0Y2ggd2l0
aCB0aGUgcmVzdCBvZiBjYWxjdWxhdGVkIHNpemVzIHdoZXJlIHdlIHVzZSB0aGUgY29tYmluYXRp
b24gb2YKLSAgICAvLyBlbmNsb3NpbmdJbnRSZWN0LCBleHBhbmRlZEludFNpemUgKGZsb29yIHZz
IGNlaWwpLgotICAgIC8vIEhvd2V2ZXIgZW5jbG9zaW5nIHRoaXMgc2l6ZSBjb3VsZCByZXZlYWwg
Z2FwIG9uIHJvb3QgbGF5ZXIncyBiYWNrZ3JvdW5kLiBzZWUgUmVuZGVyVmlldzo6YmFja2dyb3Vu
ZFJlY3QoKQotICAgIEludFNpemUgdGlsZVNpemUgPSBtX2NvbnRyb2xsZXIudGlsZVNpemUoKTsK
LSAgICBJbnRSZWN0IHJlY3QodGlsZUluZGV4LngoKSAqIHRpbGVTaXplLndpZHRoKCksIHRpbGVJ
bmRleC55KCkgKiB0aWxlU2l6ZS5oZWlnaHQoKSwgdGlsZVNpemUud2lkdGgoKSwgdGlsZVNpemUu
aGVpZ2h0KCkpOwotICAgIEludFJlY3Qgc2NhbGVkQm91bmRzKG1fY29udHJvbGxlci5ib3VuZHMo
KSk7Ci0gICAgc2NhbGVkQm91bmRzLnNjYWxlKG1fc2NhbGUpOwotICAgIHJlY3QuaW50ZXJzZWN0
KHNjYWxlZEJvdW5kcyk7Ci0gICAgcmV0dXJuIHJlY3Q7Ci19Ci0KLXZvaWQgVGlsZUdyaWQ6Omdl
dFRpbGVJbmRleFJhbmdlRm9yUmVjdChjb25zdCBJbnRSZWN0JiByZWN0LCBUaWxlSW5kZXgmIHRv
cExlZnQsIFRpbGVJbmRleCYgYm90dG9tUmlnaHQpIGNvbnN0Ci17Ci0gICAgSW50UmVjdCBjbGFt
cGVkUmVjdCA9IG1fY29udHJvbGxlci5ib3VuZHMoKTsKLSAgICBjbGFtcGVkUmVjdC5zY2FsZSht
X3NjYWxlKTsKLSAgICBjbGFtcGVkUmVjdC5pbnRlcnNlY3QocmVjdCk7Ci0KLSAgICBhdXRvIHRp
bGVTaXplID0gbV9jb250cm9sbGVyLnRpbGVTaXplKCk7Ci0gICAgaWYgKGNsYW1wZWRSZWN0Lngo
KSA+PSAwKQotICAgICAgICB0b3BMZWZ0LnNldFgoY2xhbXBlZFJlY3QueCgpIC8gdGlsZVNpemUu
d2lkdGgoKSk7Ci0gICAgZWxzZQotICAgICAgICB0b3BMZWZ0LnNldFgoZmxvb3JmKChmbG9hdClj
bGFtcGVkUmVjdC54KCkgLyB0aWxlU2l6ZS53aWR0aCgpKSk7Ci0KLSAgICBpZiAoY2xhbXBlZFJl
Y3QueSgpID49IDApCi0gICAgICAgIHRvcExlZnQuc2V0WShjbGFtcGVkUmVjdC55KCkgLyB0aWxl
U2l6ZS5oZWlnaHQoKSk7Ci0gICAgZWxzZQotICAgICAgICB0b3BMZWZ0LnNldFkoZmxvb3JmKChm
bG9hdCljbGFtcGVkUmVjdC55KCkgLyB0aWxlU2l6ZS5oZWlnaHQoKSkpOwotCi0gICAgaW50IGJv
dHRvbVhSYXRpbyA9IGNlaWwoKGZsb2F0KWNsYW1wZWRSZWN0Lm1heFgoKSAvIHRpbGVTaXplLndp
ZHRoKCkpOwotICAgIGJvdHRvbVJpZ2h0LnNldFgoc3RkOjptYXgoYm90dG9tWFJhdGlvIC0gMSwg
MCkpOwotCi0gICAgaW50IGJvdHRvbVlSYXRpbyA9IGNlaWwoKGZsb2F0KWNsYW1wZWRSZWN0Lm1h
eFkoKSAvIHRpbGVTaXplLmhlaWdodCgpKTsKLSAgICBib3R0b21SaWdodC5zZXRZKHN0ZDo6bWF4
KGJvdHRvbVlSYXRpbyAtIDEsIDApKTsKLX0KLQotdW5zaWduZWQgVGlsZUdyaWQ6OmJsYW5rUGl4
ZWxDb3VudCgpIGNvbnN0Ci17Ci0gICAgUGxhdGZvcm1MYXllckxpc3QgdGlsZXMobV90aWxlcy5z
aXplKCkpOwotCi0gICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdGlsZXMu
YmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IGlmIChQbGF0Zm9ybUxheWVyICpsYXllciA9IGl0LT52YWx1ZS5sYXllci0+cGxhdGZvcm1MYXll
cigpKQotICAgICAgICAgICAgdGlsZXMuYXBwZW5kKGxheWVyKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gVGlsZUNvbnRyb2xsZXI6OmJsYW5rUGl4ZWxDb3VudEZvclRpbGVzKHRpbGVzLCBtX2NvbnRy
b2xsZXIudmlzaWJsZVJlY3QoKSwgSW50UG9pbnQoMCwwKSk7Ci19Ci0KLXZvaWQgVGlsZUdyaWQ6
OnJlbW92ZVRpbGVzKFZlY3RvcjxUaWxlR3JpZDo6VGlsZUluZGV4PiYgdG9SZW1vdmUpCi17Ci0g
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0b1JlbW92ZS5zaXplKCk7ICsraSkgewotICAgICAg
ICBUaWxlSW5mbyB0aWxlSW5mbyA9IG1fdGlsZXMudGFrZSh0b1JlbW92ZVtpXSk7Ci0gICAgICAg
IHRpbGVJbmZvLmxheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwotICAgICAgICBtX3RpbGVS
ZXBhaW50Q291bnRzLnJlbW92ZSh0aWxlSW5mby5sYXllci5nZXQoKSk7Ci0gICAgICAgIExheWVy
UG9vbDo6c2hhcmVkUG9vbCgpLT5hZGRMYXllcih0aWxlSW5mby5sYXllcik7Ci0gICAgfQotfQot
Ci12b2lkIFRpbGVHcmlkOjpyZW1vdmVBbGxTZWNvbmRhcnlUaWxlcygpCi17Ci0gICAgVmVjdG9y
PFRpbGVJbmRleD4gdGlsZXNUb1JlbW92ZTsKLQotICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3Rp
bGVzKSB7Ci0gICAgICAgIGNvbnN0IFRpbGVJbmZvJiB0aWxlSW5mbyA9IGVudHJ5LnZhbHVlOwot
ICAgICAgICBpZiAodGlsZUluZm8uY29ob3J0ID09IFZpc2libGVUaWxlQ29ob3J0KQotICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgIHRpbGVzVG9SZW1vdmUuYXBwZW5kKGVudHJ5LmtleSk7
Ci0gICAgfQotCi0gICAgcmVtb3ZlVGlsZXModGlsZXNUb1JlbW92ZSk7Ci19Ci0KLXZvaWQgVGls
ZUdyaWQ6OnJlbW92ZVRpbGVzSW5Db2hvcnQoVGlsZUNvaG9ydCBjb2hvcnQpCi17Ci0gICAgQVNT
RVJUKGNvaG9ydCAhPSBWaXNpYmxlVGlsZUNvaG9ydCk7Ci0gICAgVmVjdG9yPFRpbGVJbmRleD4g
dGlsZXNUb1JlbW92ZTsKLQotICAgIGZvciAoYXV0byYgZW50cnkgOiBtX3RpbGVzKSB7Ci0gICAg
ICAgIGNvbnN0IFRpbGVJbmZvJiB0aWxlSW5mbyA9IGVudHJ5LnZhbHVlOwotICAgICAgICBpZiAo
dGlsZUluZm8uY29ob3J0ICE9IGNvaG9ydCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB0aWxlc1RvUmVtb3ZlLmFwcGVuZChlbnRyeS5rZXkpOwotICAgIH0KLQotICAgIHJlbW92ZVRp
bGVzKHRpbGVzVG9SZW1vdmUpOwotfQotCi12b2lkIFRpbGVHcmlkOjpyZXZhbGlkYXRlVGlsZXMo
dW5zaWduZWQgdmFsaWRhdGlvblBvbGljeSkKLXsKLSAgICBGbG9hdFJlY3QgdmlzaWJsZVJlY3Qg
PSBtX2NvbnRyb2xsZXIudmlzaWJsZVJlY3QoKTsKLSAgICBJbnRSZWN0IGJvdW5kcyA9IG1fY29u
dHJvbGxlci5ib3VuZHMoKTsKLQotICAgIGlmICh2aXNpYmxlUmVjdC5pc0VtcHR5KCkgfHwgYm91
bmRzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRmxvYXRSZWN0IHRpbGVDb3Zl
cmFnZVJlY3QgPSBtX2NvbnRyb2xsZXIuY29tcHV0ZVRpbGVDb3ZlcmFnZVJlY3QobV9jb250cm9s
bGVyLnZpc2libGVSZWN0QXRMYXN0UmV2YWxpZGF0ZSgpLCB2aXNpYmxlUmVjdCk7Ci0gICAgRmxv
YXRSZWN0IHNjYWxlZFJlY3QodGlsZUNvdmVyYWdlUmVjdCk7Ci0gICAgc2NhbGVkUmVjdC5zY2Fs
ZShtX3NjYWxlKTsKLSAgICBJbnRSZWN0IGNvdmVyYWdlUmVjdEluVGlsZUNvb3JkcyhlbmNsb3Np
bmdJbnRSZWN0KHNjYWxlZFJlY3QpKTsKLQotICAgIFRpbGVDb2hvcnQgY3VyckNvaG9ydCA9IG5l
eHRUaWxlQ29ob3J0KCk7Ci0gICAgdW5zaWduZWQgdGlsZXNJbkNvaG9ydCA9IDA7Ci0KLSAgICBk
b3VibGUgbWluaW11bVJldmFsaWRhdGlvblRpbWVyRHVyYXRpb24gPSBzdGQ6Om51bWVyaWNfbGlt
aXRzPGRvdWJsZT46Om1heCgpOwotICAgIGJvb2wgbmVlZHNUaWxlUmV2YWxpZGF0aW9uID0gZmFs
c2U7Ci0KLSAgICAvLyBNb3ZlIHRpbGVzIG5ld2x5IG91dHNpZGUgdGhlIGNvdmVyYWdlIHJlY3Qg
aW50byB0aGUgY29ob3J0IG1hcC4KLSAgICBmb3IgKFRpbGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV90
aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAg
ICAgICAgVGlsZUluZm8mIHRpbGVJbmZvID0gaXQtPnZhbHVlOwotICAgICAgICBUaWxlSW5kZXgg
dGlsZUluZGV4ID0gaXQtPmtleTsKLQotICAgICAgICBQbGF0Zm9ybUNBTGF5ZXIqIHRpbGVMYXll
ciA9IHRpbGVJbmZvLmxheWVyLmdldCgpOwotICAgICAgICBJbnRSZWN0IHRpbGVSZWN0ID0gcmVj
dEZvclRpbGVJbmRleCh0aWxlSW5kZXgpOwotICAgICAgICBpZiAodGlsZVJlY3QuaW50ZXJzZWN0
cyhjb3ZlcmFnZVJlY3RJblRpbGVDb29yZHMpKSB7Ci0gICAgICAgICAgICB0aWxlSW5mby5jb2hv
cnQgPSBWaXNpYmxlVGlsZUNvaG9ydDsKLSAgICAgICAgICAgIGlmICh0aWxlSW5mby5oYXNTdGFs
ZUNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRTogc3RvcmUgYSBkaXJ0eSByZWdp
b24gcGVyIGxheWVyPwotICAgICAgICAgICAgICAgIHRpbGVMYXllci0+c2V0TmVlZHNEaXNwbGF5
KCk7Ci0gICAgICAgICAgICAgICAgdGlsZUluZm8uaGFzU3RhbGVDb250ZW50ID0gZmFsc2U7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBZGQgdG8gdGhl
IGN1cnJlbnRDb2hvcnQgaWYgbm90IGFscmVhZHkgaW4gb25lLgotICAgICAgICAgICAgaWYgKHRp
bGVJbmZvLmNvaG9ydCA9PSBWaXNpYmxlVGlsZUNvaG9ydCkgewotICAgICAgICAgICAgICAgIHRp
bGVJbmZvLmNvaG9ydCA9IGN1cnJDb2hvcnQ7Ci0gICAgICAgICAgICAgICAgKyt0aWxlc0luQ29o
b3J0OwotCi0gICAgICAgICAgICAgICAgaWYgKG1fY29udHJvbGxlci51bnBhcmVudHNPZmZzY3Jl
ZW5UaWxlcygpKQotICAgICAgICAgICAgICAgICAgICB0aWxlTGF5ZXItPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fY29udHJvbGxlci51bnBhcmVudHNP
ZmZzY3JlZW5UaWxlcygpICYmIG1fY29udHJvbGxlci5zaG91bGRBZ2dyZXNzaXZlbHlSZXRhaW5U
aWxlcygpICYmIHRpbGVMYXllci0+c3VwZXJsYXllcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
QWdncmVzc2l2ZSB0aWxlIHJldGVudGlvbiBtZWFucyB3ZSdsbCBuZXZlciByZW1vdmUgY29ob3J0
cywgYnV0IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXkncmUgdW5wYXJlbnRlZC4KLSAgICAgICAg
ICAgICAgICAvLyBXZSBjYW4ndCBpbW1lZGlhdGVseSB1bnBhcmVudCBjb2hvcnRzIGNvbXByaXNl
ZCBvZiBzZWNvbmRhcnkgdGlsZXMgdGhhdCBuZXZlciB0b3VjaCB0aGUgcHJpbWFyeSBjb3ZlcmFn
ZSByZWN0LAotICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b3VsZCBkZWZlYXQgdGhl
IHVzZWZ1bG5lc3Mgb2YgcHJlcG9wdWxhdGVSZWN0KCk7IGluc3RlYWQsIGFnZSBwcmVwb3B1bGF0
ZWQgdGlsZXMgb3V0IGFzIGlmIHRoZXkgd2VyZSBiZWluZyByZW1vdmVkLgotICAgICAgICAgICAg
ICAgIGZvciAoYXV0byYgY29ob3J0IDogbV9jb2hvcnRMaXN0KSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChjb2hvcnQuY29ob3J0ICE9IHRpbGVJbmZvLmNvaG9ydCkKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZVVudGls
Q29ob3J0RXhwaXJlcyA9IGNvaG9ydC50aW1lVW50aWxFeHBpcmF0aW9uKCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGlmICh0aW1lVW50aWxDb2hvcnRFeHBpcmVzID4gMCkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgbWluaW11bVJldmFsaWRhdGlvblRpbWVyRHVyYXRpb24gPSBzdGQ6Om1pbiht
aW5pbXVtUmV2YWxpZGF0aW9uVGltZXJEdXJhdGlvbiwgdGltZVVudGlsQ29ob3J0RXhwaXJlcyk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZWVkc1RpbGVSZXZhbGlkYXRpb24gPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVM
YXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgaWYgKG5lZWRzVGlsZVJldmFsaWRhdGlvbikKLSAgICAgICAgbV9jb250cm9sbGVyLnNjaGVk
dWxlVGlsZVJldmFsaWRhdGlvbihtaW5pbXVtUmV2YWxpZGF0aW9uVGltZXJEdXJhdGlvbik7Ci0K
LSAgICBpZiAodGlsZXNJbkNvaG9ydCkKLSAgICAgICAgc3RhcnRlZE5ld0NvaG9ydChjdXJyQ29o
b3J0KTsKLQotICAgIGlmICghbV9jb250cm9sbGVyLnNob3VsZEFnZ3Jlc3NpdmVseVJldGFpblRp
bGVzKCkpIHsKLSAgICAgICAgaWYgKG1fY29udHJvbGxlci5zaG91bGRUZW1wb3JhcmlseVJldGFp
blRpbGVDb2hvcnRzKCkpCi0gICAgICAgICAgICBzY2hlZHVsZUNvaG9ydFJlbW92YWwoKTsKLSAg
ICAgICAgZWxzZSBpZiAodGlsZXNJbkNvaG9ydCkKLSAgICAgICAgICAgIHJlbW92ZVRpbGVzSW5D
b2hvcnQoY3VyckNvaG9ydCk7Ci0gICAgfQotCi0gICAgLy8gRW5zdXJlIHByaW1hcnkgdGlsZSBj
b3ZlcmFnZSB0aWxlcy4KLSAgICBtX3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0ID0gZW5zdXJlVGls
ZXNGb3JSZWN0KHRpbGVDb3ZlcmFnZVJlY3QsIENvdmVyYWdlVHlwZTo6UHJpbWFyeVRpbGVzKTsK
LQotICAgIGlmICh2YWxpZGF0aW9uUG9saWN5ICYgUHJ1bmVTZWNvbmRhcnlUaWxlcykgewotICAg
ICAgICByZW1vdmVBbGxTZWNvbmRhcnlUaWxlcygpOwotICAgICAgICBtX2NvaG9ydExpc3QuY2xl
YXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8mIHNlY29uZGFyeUNvdmVyYWdl
UmVjdCA6IG1fc2Vjb25kYXJ5VGlsZUNvdmVyYWdlUmVjdHMpIHsKLSAgICAgICAgICAgIEZsb2F0
UmVjdCBzZWNvbmRhcnlSZWN0SW5MYXllckNvb3JkaW5hdGVzKHNlY29uZGFyeUNvdmVyYWdlUmVj
dCk7Ci0gICAgICAgICAgICBzZWNvbmRhcnlSZWN0SW5MYXllckNvb3JkaW5hdGVzLnNjYWxlKDEg
LyBtX3NjYWxlKTsKLSAgICAgICAgICAgIGVuc3VyZVRpbGVzRm9yUmVjdChzZWNvbmRhcnlSZWN0
SW5MYXllckNvb3JkaW5hdGVzLCBDb3ZlcmFnZVR5cGU6OlNlY29uZGFyeVRpbGVzKTsKLSAgICAg
ICAgfQotICAgICAgICBtX3NlY29uZGFyeVRpbGVDb3ZlcmFnZVJlY3RzLmNsZWFyKCk7Ci0gICAg
fQotCi0gICAgaWYgKG1fY29udHJvbGxlci51bnBhcmVudHNPZmZzY3JlZW5UaWxlcygpICYmICh2
YWxpZGF0aW9uUG9saWN5ICYgVW5wYXJlbnRBbGxUaWxlcykpIHsKLSAgICAgICAgZm9yIChUaWxl
TWFwOjppdGVyYXRvciBpdCA9IG1fdGlsZXMuYmVnaW4oKSwgZW5kID0gbV90aWxlcy5lbmQoKTsg
aXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgaXQtPnZhbHVlLmxheWVyLT5yZW1vdmVGcm9t
U3VwZXJsYXllcigpOwotICAgIH0KLQotICAgIGF1dG8gYm91bmRzQXRMYXN0UmV2YWxpZGF0ZSA9
IG1fY29udHJvbGxlci5ib3VuZHNBdExhc3RSZXZhbGlkYXRlKCk7Ci0gICAgaWYgKGJvdW5kc0F0
TGFzdFJldmFsaWRhdGUgIT0gYm91bmRzKSB7Ci0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBtYXJn
aW4gdGlsZXMgYW5kIHRoZSBib3VuZHMgaGF2ZSBncm93biB0YWxsZXIgb3Igd2lkZXIsIHRoZW4g
dGhlIHRpbGVzIHRoYXQgdXNlZCB0bwotICAgICAgICAvLyBiZSBib3R0b20gb3IgcmlnaHQgbWFy
Z2luIHRpbGVzIG5lZWQgdG8gYmUgaW52YWxpZGF0ZWQuCi0gICAgICAgIGlmIChtX2NvbnRyb2xs
ZXIuaGFzTWFyZ2lucygpKSB7Ci0gICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoKCkgPiBib3Vu
ZHNBdExhc3RSZXZhbGlkYXRlLndpZHRoKCkgfHwgYm91bmRzLmhlaWdodCgpID4gYm91bmRzQXRM
YXN0UmV2YWxpZGF0ZS5oZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIEludFJlY3QgYm91bmRz
V2l0aG91dE1hcmdpbiA9IG1fY29udHJvbGxlci5ib3VuZHNXaXRob3V0TWFyZ2luKCk7Ci0gICAg
ICAgICAgICAgICAgSW50UmVjdCBvbGRCb3VuZHNXaXRob3V0TWFyZ2luID0gbV9jb250cm9sbGVy
LmJvdW5kc0F0TGFzdFJldmFsaWRhdGVXaXRob3V0TWFyZ2luKCk7Ci0KLSAgICAgICAgICAgICAg
ICBpZiAoYm91bmRzLmhlaWdodCgpID4gYm91bmRzQXRMYXN0UmV2YWxpZGF0ZS5oZWlnaHQoKSkg
ewotICAgICAgICAgICAgICAgICAgICBJbnRSZWN0IGZvcm1lckJvdHRvbU1hcmdpblJlY3QgPSBJ
bnRSZWN0KG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4ueCgpLCBvbGRCb3VuZHNXaXRob3V0TWFyZ2lu
LmhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgb2xkQm91bmRzV2l0aG91dE1hcmdp
bi53aWR0aCgpLCBib3VuZHNXaXRob3V0TWFyZ2luLmhlaWdodCgpIC0gb2xkQm91bmRzV2l0aG91
dE1hcmdpbi5oZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldE5lZWRzRGlzcGxheUlu
UmVjdChmb3JtZXJCb3R0b21NYXJnaW5SZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoKCkgPiBib3VuZHNBdExhc3RSZXZhbGlkYXRlLndp
ZHRoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSW50UmVjdCBmb3JtZXJSaWdodE1hcmdpblJl
Y3QgPSBJbnRSZWN0KG9sZEJvdW5kc1dpdGhvdXRNYXJnaW4ud2lkdGgoKSwgb2xkQm91bmRzV2l0
aG91dE1hcmdpbi55KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNXaXRob3V0TWFy
Z2luLndpZHRoKCkgLSBvbGRCb3VuZHNXaXRob3V0TWFyZ2luLndpZHRoKCksIG9sZEJvdW5kc1dp
dGhvdXRNYXJnaW4uaGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICBzZXROZWVkc0Rpc3Bs
YXlJblJlY3QoZm9ybWVyUmlnaHRNYXJnaW5SZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBGbG9hdFJlY3Qgc2NhbGVkQm91bmRzKGJv
dW5kcyk7Ci0gICAgICAgIHNjYWxlZEJvdW5kcy5zY2FsZShtX3NjYWxlKTsKLSAgICAgICAgSW50
UmVjdCBib3VuZHNJblRpbGVDb29yZHMoZW5jbG9zaW5nSW50UmVjdChzY2FsZWRCb3VuZHMpKTsK
LQotICAgICAgICBUaWxlSW5kZXggdG9wTGVmdEZvckJvdW5kczsKLSAgICAgICAgVGlsZUluZGV4
IGJvdHRvbVJpZ2h0Rm9yQm91bmRzOwotICAgICAgICBnZXRUaWxlSW5kZXhSYW5nZUZvclJlY3Qo
Ym91bmRzSW5UaWxlQ29vcmRzLCB0b3BMZWZ0Rm9yQm91bmRzLCBib3R0b21SaWdodEZvckJvdW5k
cyk7Ci0KLSAgICAgICAgVmVjdG9yPFRpbGVJbmRleD4gdGlsZXNUb1JlbW92ZTsKLSAgICAgICAg
Zm9yIChhdXRvJiBpbmRleCA6IG1fdGlsZXMua2V5cygpKSB7Ci0gICAgICAgICAgICBpZiAoaW5k
ZXgueSgpIDwgdG9wTGVmdEZvckJvdW5kcy55KCkgfHwgaW5kZXgueSgpID4gYm90dG9tUmlnaHRG
b3JCb3VuZHMueSgpIHx8IGluZGV4LngoKSA8IHRvcExlZnRGb3JCb3VuZHMueCgpIHx8IGluZGV4
LngoKSA+IGJvdHRvbVJpZ2h0Rm9yQm91bmRzLngoKSkKLSAgICAgICAgICAgICAgICB0aWxlc1Rv
UmVtb3ZlLmFwcGVuZChpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3ZlVGlsZXModGls
ZXNUb1JlbW92ZSk7Ci0gICAgfQotCi0gICAgbV9jb250cm9sbGVyLmRpZFJldmFsaWRhdGVUaWxl
cygpOwotfQotCi1UaWxlR3JpZDo6VGlsZUNvaG9ydCBUaWxlR3JpZDo6bmV4dFRpbGVDb2hvcnQo
KSBjb25zdAotewotICAgIGlmICghbV9jb2hvcnRMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuIG1fY29ob3J0TGlzdC5sYXN0KCkuY29ob3J0ICsgMTsKLQotICAgIHJldHVybiAxOwotfQot
Ci12b2lkIFRpbGVHcmlkOjpzdGFydGVkTmV3Q29ob3J0KFRpbGVDb2hvcnQgY29ob3J0KQotewot
ICAgIG1fY29ob3J0TGlzdC5hcHBlbmQoVGlsZUNvaG9ydEluZm8oY29ob3J0LCBtb25vdG9uaWNh
bGx5SW5jcmVhc2luZ1RpbWUoKSkpOwotI2lmIFBMQVRGT1JNKElPUykKLSAgICBpZiAoIW1fY29u
dHJvbGxlci5pc0luV2luZG93KCkpCi0gICAgICAgIHRpbGVDb250cm9sbGVyTWVtb3J5SGFuZGxl
cigpLnRpbGVDb250cm9sbGVyR2FpbmVkVW5wYXJlbnRlZFRpbGVzKCZtX2NvbnRyb2xsZXIpOwot
I2VuZGlmCi19Ci0KLVRpbGVHcmlkOjpUaWxlQ29ob3J0IFRpbGVHcmlkOjpuZXdlc3RUaWxlQ29o
b3J0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9jb2hvcnRMaXN0LmlzRW1wdHkoKSA/IDAgOiBt
X2NvaG9ydExpc3QubGFzdCgpLmNvaG9ydDsKLX0KLQotVGlsZUdyaWQ6OlRpbGVDb2hvcnQgVGls
ZUdyaWQ6Om9sZGVzdFRpbGVDb2hvcnQoKSBjb25zdAotewotICAgIHJldHVybiBtX2NvaG9ydExp
c3QuaXNFbXB0eSgpID8gMCA6IG1fY29ob3J0TGlzdC5maXJzdCgpLmNvaG9ydDsKLX0KLQotdm9p
ZCBUaWxlR3JpZDo6c2NoZWR1bGVDb2hvcnRSZW1vdmFsKCkKLXsKLSAgICBjb25zdCBkb3VibGUg
Y29ob3J0UmVtb3ZhbFRpbWVyU2Vjb25kcyA9IDE7Ci0KLSAgICAvLyBTdGFydCB0aGUgdGltZXIs
IG9yIHJlc2NoZWR1bGUgdGhlIHRpbWVyIGZyb20gbm93IGlmIGl0J3MgYWxyZWFkeSBhY3RpdmUu
Ci0gICAgaWYgKCFtX2NvaG9ydFJlbW92YWxUaW1lci5pc0FjdGl2ZSgpKQotICAgICAgICBtX2Nv
aG9ydFJlbW92YWxUaW1lci5zdGFydFJlcGVhdGluZyhjb2hvcnRSZW1vdmFsVGltZXJTZWNvbmRz
KTsKLX0KLQotZG91YmxlIFRpbGVHcmlkOjpUaWxlQ29ob3J0SW5mbzo6dGltZVVudGlsRXhwaXJh
dGlvbigpCi17Ci0gICAgZG91YmxlIGNvaG9ydExpZmVUaW1lU2Vjb25kcyA9IDI7Ci0gICAgZG91
YmxlIHRpbWVUaHJlc2hvbGQgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKSAtIGNvaG9y
dExpZmVUaW1lU2Vjb25kczsKLSAgICByZXR1cm4gY3JlYXRpb25UaW1lIC0gdGltZVRocmVzaG9s
ZDsKLX0KLQotdm9pZCBUaWxlR3JpZDo6Y29ob3J0UmVtb3ZhbFRpbWVyRmlyZWQoVGltZXI8VGls
ZUdyaWQ+KikKLXsKLSAgICBpZiAobV9jb2hvcnRMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICBt
X2NvaG9ydFJlbW92YWxUaW1lci5zdG9wKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICB3aGlsZSAoIW1fY29ob3J0TGlzdC5pc0VtcHR5KCkgJiYgbV9jb2hvcnRMaXN0LmZpcnN0KCku
dGltZVVudGlsRXhwaXJhdGlvbigpIDwgMCkgewotICAgICAgICBUaWxlQ29ob3J0SW5mbyBmaXJz
dENvaG9ydCA9IG1fY29ob3J0TGlzdC50YWtlRmlyc3QoKTsKLSAgICAgICAgcmVtb3ZlVGlsZXNJ
bkNvaG9ydChmaXJzdENvaG9ydC5jb2hvcnQpOwotICAgIH0KLQotICAgIG1fY29udHJvbGxlci51
cGRhdGVUaWxlQ292ZXJhZ2VNYXAoKTsKLX0KLQotSW50UmVjdCBUaWxlR3JpZDo6ZW5zdXJlVGls
ZXNGb3JSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgQ292ZXJhZ2VUeXBlIG5ld1RpbGVUeXBl
KQotewotICAgIGlmIChtX2NvbnRyb2xsZXIudW5wYXJlbnRzT2Zmc2NyZWVuVGlsZXMoKSAmJiAh
bV9jb250cm9sbGVyLmlzSW5XaW5kb3coKSkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKLQot
ICAgIEZsb2F0UmVjdCBzY2FsZWRSZWN0KHJlY3QpOwotICAgIHNjYWxlZFJlY3Quc2NhbGUobV9z
Y2FsZSk7Ci0gICAgSW50UmVjdCByZWN0SW5UaWxlQ29vcmRzKGVuY2xvc2luZ0ludFJlY3Qoc2Nh
bGVkUmVjdCkpOwotCi0gICAgVGlsZUluZGV4IHRvcExlZnQ7Ci0gICAgVGlsZUluZGV4IGJvdHRv
bVJpZ2h0OwotICAgIGdldFRpbGVJbmRleFJhbmdlRm9yUmVjdChyZWN0SW5UaWxlQ29vcmRzLCB0
b3BMZWZ0LCBib3R0b21SaWdodCk7Ci0KLSAgICBUaWxlQ29ob3J0IGN1cnJDb2hvcnQgPSBuZXh0
VGlsZUNvaG9ydCgpOwotICAgIHVuc2lnbmVkIHRpbGVzSW5Db2hvcnQgPSAwOwotCi0gICAgSW50
UmVjdCBjb3ZlcmFnZVJlY3Q7Ci0KLSAgICBmb3IgKGludCB5ID0gdG9wTGVmdC55KCk7IHkgPD0g
Ym90dG9tUmlnaHQueSgpOyArK3kpIHsKLSAgICAgICAgZm9yIChpbnQgeCA9IHRvcExlZnQueCgp
OyB4IDw9IGJvdHRvbVJpZ2h0LngoKTsgKyt4KSB7Ci0gICAgICAgICAgICBUaWxlSW5kZXggdGls
ZUluZGV4KHgsIHkpOwotCi0gICAgICAgICAgICBJbnRSZWN0IHRpbGVSZWN0ID0gcmVjdEZvclRp
bGVJbmRleCh0aWxlSW5kZXgpOwotICAgICAgICAgICAgVGlsZUluZm8mIHRpbGVJbmZvID0gbV90
aWxlcy5hZGQodGlsZUluZGV4LCBUaWxlSW5mbygpKS5pdGVyYXRvci0+dmFsdWU7Ci0KLSAgICAg
ICAgICAgIGNvdmVyYWdlUmVjdC51bml0ZSh0aWxlUmVjdCk7Ci0KLSAgICAgICAgICAgIGJvb2wg
c2hvdWxkQ2hhbmdlVGlsZUxheWVyRnJhbWUgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCF0
aWxlSW5mby5sYXllcikgewotICAgICAgICAgICAgICAgIHRpbGVJbmZvLmxheWVyID0gbV9jb250
cm9sbGVyLmNyZWF0ZVRpbGVMYXllcih0aWxlUmVjdCwgKnRoaXMpOwotICAgICAgICAgICAgICAg
IEFTU0VSVCghbV90aWxlUmVwYWludENvdW50cy5jb250YWlucyh0aWxlSW5mby5sYXllci5nZXQo
KSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5
IGhhdmUgYSBsYXllciBmb3IgdGhpcyB0aWxlLiBFbnN1cmUgdGhhdCBpdHMgc2l6ZSBpcyBjb3Jy
ZWN0LgotICAgICAgICAgICAgICAgIEZsb2F0U2l6ZSB0aWxlTGF5ZXJTaXplKHRpbGVJbmZvLmxh
eWVyLT5ib3VuZHMoKS5zaXplKCkpOwotICAgICAgICAgICAgICAgIHNob3VsZENoYW5nZVRpbGVM
YXllckZyYW1lID0gdGlsZUxheWVyU2l6ZSAhPSBGbG9hdFNpemUodGlsZVJlY3Quc2l6ZSgpKTsK
LQotICAgICAgICAgICAgICAgIGlmIChzaG91bGRDaGFuZ2VUaWxlTGF5ZXJGcmFtZSkgewotICAg
ICAgICAgICAgICAgICAgICB0aWxlSW5mby5sYXllci0+c2V0Qm91bmRzKEZsb2F0UmVjdChGbG9h
dFBvaW50KCksIHRpbGVSZWN0LnNpemUoKSkpOwotICAgICAgICAgICAgICAgICAgICB0aWxlSW5m
by5sYXllci0+c2V0UG9zaXRpb24odGlsZVJlY3QubG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAg
ICAgICAgIHRpbGVJbmZvLmxheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZXdUaWxlVHlwZSA9PSBDb3Zl
cmFnZVR5cGU6OlNlY29uZGFyeVRpbGVzICYmICF0aWxlUmVjdC5pbnRlcnNlY3RzKG1fcHJpbWFy
eVRpbGVDb3ZlcmFnZVJlY3QpKSB7Ci0gICAgICAgICAgICAgICAgdGlsZUluZm8uY29ob3J0ID0g
Y3VyckNvaG9ydDsKLSAgICAgICAgICAgICAgICArK3RpbGVzSW5Db2hvcnQ7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGJvb2wgc2hvdWxkUGFyZW50VGlsZUxheWVyID0gKCFtX2NvbnRy
b2xsZXIudW5wYXJlbnRzT2Zmc2NyZWVuVGlsZXMoKSB8fCBtX2NvbnRyb2xsZXIuaXNJbldpbmRv
dygpKSAmJiAhdGlsZUluZm8ubGF5ZXItPnN1cGVybGF5ZXIoKTsKLQotICAgICAgICAgICAgaWYg
KHNob3VsZFBhcmVudFRpbGVMYXllcikKLSAgICAgICAgICAgICAgICBtX2NvbnRhaW5lckxheWVy
LmdldCgpLmFwcGVuZFN1YmxheWVyKHRpbGVJbmZvLmxheWVyLmdldCgpKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICAKLSAgICBpZiAodGlsZXNJbkNvaG9ydCkKLSAgICAgICAgc3RhcnRlZE5ld0Nv
aG9ydChjdXJyQ29ob3J0KTsKLQotICAgIHJldHVybiBjb3ZlcmFnZVJlY3Q7Ci19Ci0KLUludFJl
Y3QgVGlsZUdyaWQ6OmV4dGVudCgpIGNvbnN0Ci17Ci0gICAgVGlsZUluZGV4IHRvcExlZnQ7Ci0g
ICAgVGlsZUluZGV4IGJvdHRvbVJpZ2h0OwotICAgIGdldFRpbGVJbmRleFJhbmdlRm9yUmVjdCht
X3ByaW1hcnlUaWxlQ292ZXJhZ2VSZWN0LCB0b3BMZWZ0LCBib3R0b21SaWdodCk7Ci0KLSAgICAv
LyBSZXR1cm4gaW5kZXggb2YgdG9wLCBsZWZ0IHRpbGUgYW5kIHRoZSBudW1iZXIgb2YgdGlsZXMg
YWNyb3NzIGFuZCBkb3duLgotICAgIHJldHVybiBJbnRSZWN0KHRvcExlZnQueCgpLCB0b3BMZWZ0
LnkoKSwgYm90dG9tUmlnaHQueCgpIC0gdG9wTGVmdC54KCkgKyAxLCBib3R0b21SaWdodC55KCkg
LSB0b3BMZWZ0LnkoKSArIDEpOwotfQotCi1kb3VibGUgVGlsZUdyaWQ6OnJldGFpbmVkVGlsZUJh
Y2tpbmdTdG9yZU1lbW9yeSgpIGNvbnN0Ci17Ci0gICAgZG91YmxlIHRvdGFsQnl0ZXMgPSAwOwot
ICAgIAotICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RpbGVzLmJlZ2lu
KCksIGVuZCA9IG1fdGlsZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBjb25z
dCBUaWxlSW5mbyYgdGlsZUluZm8gPSBpdC0+dmFsdWU7Ci0gICAgICAgIGlmICh0aWxlSW5mby5s
YXllci0+c3VwZXJsYXllcigpKSB7Ci0gICAgICAgICAgICBGbG9hdFJlY3QgYm91bmRzID0gdGls
ZUluZm8ubGF5ZXItPmJvdW5kcygpOwotICAgICAgICAgICAgZG91YmxlIGNvbnRlbnRzU2NhbGUg
PSB0aWxlSW5mby5sYXllci0+Y29udGVudHNTY2FsZSgpOwotICAgICAgICAgICAgdG90YWxCeXRl
cyArPSA0ICogYm91bmRzLndpZHRoKCkgKiBjb250ZW50c1NjYWxlICogYm91bmRzLmhlaWdodCgp
ICogY29udGVudHNTY2FsZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0b3RhbEJ5
dGVzOwotfQotCi0vLyBSZXR1cm4gdGhlIHJlY3QgaW4gbGF5ZXIgY29vcmRzLCBub3QgdGlsZSBj
b29yZHMuCi1JbnRSZWN0IFRpbGVHcmlkOjp0aWxlQ292ZXJhZ2VSZWN0KCkgY29uc3QKLXsKLSAg
ICBJbnRSZWN0IGNvdmVyYWdlUmVjdEluTGF5ZXJDb29yZHMobV9wcmltYXJ5VGlsZUNvdmVyYWdl
UmVjdCk7Ci0gICAgY292ZXJhZ2VSZWN0SW5MYXllckNvb3Jkcy5zY2FsZSgxIC8gbV9zY2FsZSk7
Ci0gICAgcmV0dXJuIGNvdmVyYWdlUmVjdEluTGF5ZXJDb29yZHM7Ci19Ci0KLXZvaWQgVGlsZUdy
aWQ6OmRyYXdUaWxlTWFwQ29udGVudHMoQ0dDb250ZXh0UmVmIGNvbnRleHQsIENHUmVjdCBsYXll
ckJvdW5kcykgY29uc3QKLXsKLSAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwg
MC4zLCAwLjMsIDAuMywgMSk7Ci0gICAgQ0dDb250ZXh0RmlsbFJlY3QoY29udGV4dCwgbGF5ZXJC
b3VuZHMpOwotCi0gICAgQ0dGbG9hdCBzY2FsZUZhY3RvciA9IGxheWVyQm91bmRzLnNpemUud2lk
dGggLyBtX2NvbnRyb2xsZXIuYm91bmRzKCkud2lkdGgoKTsKLQotICAgIENHRmxvYXQgY29udGV4
dFNjYWxlID0gc2NhbGVGYWN0b3IgLyBtX3NjYWxlOwotICAgIENHQ29udGV4dFNjYWxlQ1RNKGNv
bnRleHQsIGNvbnRleHRTY2FsZSwgY29udGV4dFNjYWxlKTsKLSAgICAKLSAgICBmb3IgKFRpbGVN
YXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90aWxlcy5iZWdpbigpLCBlbmQgPSBtX3RpbGVzLmVu
ZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgY29uc3QgVGlsZUluZm8mIHRpbGVJbmZv
ID0gaXQtPnZhbHVlOwotICAgICAgICBQbGF0Zm9ybUNBTGF5ZXIqIHRpbGVMYXllciA9IHRpbGVJ
bmZvLmxheWVyLmdldCgpOwotCi0gICAgICAgIENHRmxvYXQgcmVkID0gMTsKLSAgICAgICAgQ0dG
bG9hdCBncmVlbiA9IDE7Ci0gICAgICAgIENHRmxvYXQgYmx1ZSA9IDE7Ci0gICAgICAgIENHRmxv
YXQgYWxwaGEgPSAxOwotICAgICAgICBpZiAodGlsZUluZm8uaGFzU3RhbGVDb250ZW50KSB7Ci0g
ICAgICAgICAgICByZWQgPSAwLjI1OwotICAgICAgICAgICAgZ3JlZW4gPSAwLjEyNTsKLSAgICAg
ICAgICAgIGJsdWUgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKG1fY29udHJvbGxlci5zaG91bGRB
Z2dyZXNzaXZlbHlSZXRhaW5UaWxlcygpICYmIHRpbGVJbmZvLmNvaG9ydCAhPSBWaXNpYmxlVGls
ZUNvaG9ydCkgewotICAgICAgICAgICAgcmVkID0gMC44OwotICAgICAgICAgICAgZ3JlZW4gPSAw
Ljg7Ci0gICAgICAgICAgICBibHVlID0gMC44OwotICAgICAgICB9Ci0KLSAgICAgICAgVGlsZUNv
aG9ydCBuZXdlc3RDb2hvcnQgPSBuZXdlc3RUaWxlQ29ob3J0KCk7Ci0gICAgICAgIFRpbGVDb2hv
cnQgb2xkZXN0Q29ob3J0ID0gb2xkZXN0VGlsZUNvaG9ydCgpOwotCi0gICAgICAgIGlmICghbV9j
b250cm9sbGVyLnNob3VsZEFnZ3Jlc3NpdmVseVJldGFpblRpbGVzKCkgJiYgdGlsZUluZm8uY29o
b3J0ICE9IFZpc2libGVUaWxlQ29ob3J0ICYmIG5ld2VzdENvaG9ydCA+IG9sZGVzdENvaG9ydCkK
LSAgICAgICAgICAgIGFscGhhID0gMSAtIChzdGF0aWNfY2FzdDxmbG9hdD4oKG5ld2VzdENvaG9y
dCAtIHRpbGVJbmZvLmNvaG9ydCkpIC8gKG5ld2VzdENvaG9ydCAtIG9sZGVzdENvaG9ydCkpOwot
Ci0gICAgICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByZWQsIGdyZWVuLCBi
bHVlLCBhbHBoYSk7Ci0KLSAgICAgICAgaWYgKHRpbGVMYXllci0+c3VwZXJsYXllcigpKSB7Ci0g
ICAgICAgICAgICBDR0NvbnRleHRTZXRMaW5lV2lkdGgoY29udGV4dCwgMC41IC8gY29udGV4dFNj
YWxlKTsKLSAgICAgICAgICAgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKGNvbnRleHQsIDAs
IDAsIDAsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0dDb250ZXh0U2V0TGlu
ZVdpZHRoKGNvbnRleHQsIDEgLyBjb250ZXh0U2NhbGUpOwotICAgICAgICAgICAgQ0dDb250ZXh0
U2V0UkdCU3Ryb2tlQ29sb3IoY29udGV4dCwgMC4yLCAwLjEsIDAuOSwgMSk7Ci0gICAgICAgIH0K
LQotICAgICAgICBDR1JlY3QgZnJhbWUgPSBDR1JlY3RNYWtlKHRpbGVMYXllci0+cG9zaXRpb24o
KS54KCksIHRpbGVMYXllci0+cG9zaXRpb24oKS55KCksIHRpbGVMYXllci0+Ym91bmRzKCkuc2l6
ZSgpLndpZHRoKCksIHRpbGVMYXllci0+Ym91bmRzKCkuc2l6ZSgpLmhlaWdodCgpKTsKLSAgICAg
ICAgQ0dDb250ZXh0RmlsbFJlY3QoY29udGV4dCwgZnJhbWUpOwotICAgICAgICBDR0NvbnRleHRT
dHJva2VSZWN0KGNvbnRleHQsIGZyYW1lKTsKLSAgICB9Ci19Ci0KLXZvaWQgVGlsZUdyaWQ6OnBs
YXRmb3JtQ0FMYXllclBhaW50Q29udGVudHMoUGxhdGZvcm1DQUxheWVyKiBwbGF0Zm9ybUNBTGF5
ZXIsIEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgY29uc3QgRmxvYXRSZWN0JikKLXsKLSNpZiBQ
TEFURk9STShJT1MpCi0gICAgaWYgKHB0aHJlYWRfbWFpbl9ucCgpKQotICAgICAgICBXZWJUaHJl
YWRMb2NrKCk7Ci0jZW5kaWYKLQotICAgIHsKLSAgICAgICAgR3JhcGhpY3NDb250ZXh0U3RhdGVT
YXZlciBzdGF0ZVNhdmVyKGNvbnRleHQpOwotCi0gICAgICAgIEZsb2F0UG9pbnQzRCBsYXllck9y
aWdpbiA9IHBsYXRmb3JtQ0FMYXllci0+cG9zaXRpb24oKTsKLSAgICAgICAgY29udGV4dC50cmFu
c2xhdGUoLWxheWVyT3JpZ2luLngoKSwgLWxheWVyT3JpZ2luLnkoKSk7Ci0gICAgICAgIGNvbnRl
eHQuc2NhbGUoRmxvYXRTaXplKG1fc2NhbGUsIG1fc2NhbGUpKTsKLQotICAgICAgICBSZXBhaW50
UmVjdExpc3QgZGlydHlSZWN0cyA9IGNvbGxlY3RSZWN0c1RvUGFpbnQoY29udGV4dC5wbGF0Zm9y
bUNvbnRleHQoKSwgcGxhdGZvcm1DQUxheWVyKTsKLSAgICAgICAgZHJhd0xheWVyQ29udGVudHMo
Y29udGV4dC5wbGF0Zm9ybUNvbnRleHQoKSwgJm1fY29udHJvbGxlci5yb290TGF5ZXIoKSwgZGly
dHlSZWN0cyk7Ci0gICAgfQotCi0gICAgaW50IHJlcGFpbnRDb3VudCA9IHBsYXRmb3JtQ0FMYXll
ckluY3JlbWVudFJlcGFpbnRDb3VudChwbGF0Zm9ybUNBTGF5ZXIpOwotICAgIGlmIChtX2NvbnRy
b2xsZXIucm9vdExheWVyKCkub3duZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvd1JlcGFpbnRDb3Vu
dGVyKDApKQotICAgICAgICBkcmF3UmVwYWludEluZGljYXRvcihjb250ZXh0LnBsYXRmb3JtQ29u
dGV4dCgpLCBwbGF0Zm9ybUNBTGF5ZXIsIHJlcGFpbnRDb3VudCwgY2FjaGVkQ0dDb2xvcihtX2Nv
bnRyb2xsZXIudGlsZURlYnVnQm9yZGVyQ29sb3IoKSwgQ29sb3JTcGFjZURldmljZVJHQikpOwot
Ci0gICAgaWYgKG1fY29udHJvbGxlci5zY3JvbGxpbmdQZXJmb3JtYW5jZUxvZ2dpbmdFbmFibGVk
KCkpIHsKLSAgICAgICAgRmxvYXRSZWN0IHZpc2libGVQYXJ0KHBsYXRmb3JtQ0FMYXllci0+cG9z
aXRpb24oKS54KCksIHBsYXRmb3JtQ0FMYXllci0+cG9zaXRpb24oKS55KCksIHBsYXRmb3JtQ0FM
YXllci0+Ym91bmRzKCkuc2l6ZSgpLndpZHRoKCksIHBsYXRmb3JtQ0FMYXllci0+Ym91bmRzKCku
c2l6ZSgpLmhlaWdodCgpKTsKLSAgICAgICAgdmlzaWJsZVBhcnQuaW50ZXJzZWN0KG1fY29udHJv
bGxlci52aXNpYmxlUmVjdCgpKTsKLQotICAgICAgICBpZiAocmVwYWludENvdW50ID09IDEgJiYg
IXZpc2libGVQYXJ0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIFdURkxvZ0Fsd2F5cygiU0NST0xM
SU5HOiBGaWxsZWQgdmlzaWJsZSBmcmVzaCB0aWxlLiBUaW1lOiAlZiBVbmZpbGxlZCBQaXhlbHM6
ICV1XG4iLCBXVEY6Om1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpLCBibGFua1BpeGVsQ291
bnQoKSk7Ci0gICAgfQotfQotCi1mbG9hdCBUaWxlR3JpZDo6cGxhdGZvcm1DQUxheWVyRGV2aWNl
U2NhbGVGYWN0b3IoKSBjb25zdAotewotICAgIHJldHVybiBtX2NvbnRyb2xsZXIucm9vdExheWVy
KCkub3duZXIoKS0+cGxhdGZvcm1DQUxheWVyRGV2aWNlU2NhbGVGYWN0b3IoKTsKLX0KLQotYm9v
bCBUaWxlR3JpZDo6cGxhdGZvcm1DQUxheWVyU2hvd0RlYnVnQm9yZGVycygpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIG1fY29udHJvbGxlci5yb290TGF5ZXIoKS5vd25lcigpLT5wbGF0Zm9ybUNBTGF5
ZXJTaG93RGVidWdCb3JkZXJzKCk7Ci19Ci0KLWJvb2wgVGlsZUdyaWQ6OnBsYXRmb3JtQ0FMYXll
clNob3dSZXBhaW50Q291bnRlcihQbGF0Zm9ybUNBTGF5ZXIqKSBjb25zdAotewotICAgIHJldHVy
biBtX2NvbnRyb2xsZXIucm9vdExheWVyKCkub3duZXIoKS0+cGxhdGZvcm1DQUxheWVyU2hvd1Jl
cGFpbnRDb3VudGVyKDApOwotfQotCi1ib29sIFRpbGVHcmlkOjpwbGF0Zm9ybUNBTGF5ZXJDb250
ZW50c09wYXF1ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fY29udHJvbGxlci50aWxlc0FyZU9w
YXF1ZSgpOwotfQotCi1pbnQgVGlsZUdyaWQ6OnBsYXRmb3JtQ0FMYXllckluY3JlbWVudFJlcGFp
bnRDb3VudChQbGF0Zm9ybUNBTGF5ZXIqIHBsYXRmb3JtQ0FMYXllcikKLXsKLSAgICBpbnQgcmVw
YWludENvdW50ID0gMDsKLQotICAgIGlmIChtX3RpbGVSZXBhaW50Q291bnRzLmNvbnRhaW5zKHBs
YXRmb3JtQ0FMYXllcikpCi0gICAgICAgIHJlcGFpbnRDb3VudCA9IG1fdGlsZVJlcGFpbnRDb3Vu
dHMuZ2V0KHBsYXRmb3JtQ0FMYXllcik7Ci0KLSAgICBtX3RpbGVSZXBhaW50Q291bnRzLnNldChw
bGF0Zm9ybUNBTGF5ZXIsICsrcmVwYWludENvdW50KTsKLQotICAgIHJldHVybiByZXBhaW50Q291
bnQ7Ci19Ci0KLSNpZiBQTEFURk9STShJT1MpCi12b2lkIFRpbGVHcmlkOjpyZW1vdmVVbnBhcmVu
dGVkVGlsZXNOb3coKQotewotICAgIHdoaWxlICghbV9jb2hvcnRMaXN0LmlzRW1wdHkoKSkgewot
ICAgICAgICBUaWxlQ29ob3J0SW5mbyBmaXJzdENvaG9ydCA9IG1fY29ob3J0TGlzdC50YWtlRmly
c3QoKTsKLSAgICAgICAgcmVtb3ZlVGlsZXNJbkNvaG9ydChmaXJzdENvaG9ydC5jb2hvcnQpOwot
ICAgIH0KLX0KLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIuaAkocmV2aXNpb24g
MTY5ODA5KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkxheWVy
LmgJKHdvcmtpbmcgY29weSkKQEAgLTI2LDE4ICsyNiwyMSBAQAogI2lmbmRlZiBXZWJMYXllcl9o
CiAjZGVmaW5lIFdlYkxheWVyX2gKIAotI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+
Ci0jaW1wb3J0IDxXZWJDb3JlL0Zsb2F0UmVjdC5oPgotI2ltcG9ydCA8d3RmL1ZlY3Rvci5oPgor
I2luY2x1ZGUgIlBsYXRmb3JtTGF5ZXIuaCIKKyNpbmNsdWRlIDxRdWFydHpDb3JlL1F1YXJ0ekNv
cmUuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0Zsb2F0UmVjdC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0
b3IuaD4KIAogY29uc3QgdW5zaWduZWQgd2ViTGF5ZXJNYXhSZWN0c1RvUGFpbnQgPSA1OwogY29u
c3QgZmxvYXQgd2ViTGF5ZXJXYXN0ZWRTcGFjZVRocmVzaG9sZCA9IDAuNzVmOwogCisjaWZkZWYg
X19PQkpDX18KIEBpbnRlcmZhY2UgV2ViU2ltcGxlTGF5ZXIgOiBDQUxheWVyCiBAZW5kCiAKIEBp
bnRlcmZhY2UgV2ViTGF5ZXIgOiBXZWJTaW1wbGVMYXllcgogQGVuZAorI2VuZGlmCiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIGNsYXNzIEdyYXBoaWNzTGF5ZXI7CkBAIC01MCw2ICs1Myw3IEBAIHR5
cGVkZWYgVmVjdG9yPEZsb2F0UmVjdCwgd2ViTGF5ZXJNYXhSZWMKIFJlcGFpbnRSZWN0TGlzdCBj
b2xsZWN0UmVjdHNUb1BhaW50KENHQ29udGV4dFJlZiwgUGxhdGZvcm1DQUxheWVyKik7CiB2b2lk
IGRyYXdMYXllckNvbnRlbnRzKENHQ29udGV4dFJlZiwgUGxhdGZvcm1DQUxheWVyKiwgUmVwYWlu
dFJlY3RMaXN0JiBkaXJ0eVJlY3RzKTsKIHZvaWQgZHJhd1JlcGFpbnRJbmRpY2F0b3IoQ0dDb250
ZXh0UmVmLCBQbGF0Zm9ybUNBTGF5ZXIqLCBpbnQgcmVwYWludENvdW50LCBDR0NvbG9yUmVmIGN1
c3RvbUJhY2tncm91bmRDb2xvcik7CitDR1JlY3QgZnJhbWVGb3JMYXllcihjb25zdCBQbGF0Zm9y
bUxheWVyKik7CiB9CiAKICNlbmRpZiAvLyBXZWJMYXllcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkxheWVyLm1tCShyZXZpc2lvbiAxNjk4
MDkpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViTGF5ZXIubW0J
KHdvcmtpbmcgY29weSkKQEAgLTE5NSw2ICsxOTUsMTEgQEAgdm9pZCBkcmF3UmVwYWludEluZGlj
YXRvcihDR0NvbnRleHRSZWYgYwogICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7
CiB9CiAKK0NHUmVjdCBmcmFtZUZvckxheWVyKGNvbnN0IFBsYXRmb3JtTGF5ZXIqIHRpbGVMYXll
cikKK3sKKyAgICByZXR1cm4gW3RpbGVMYXllciBmcmFtZV07Cit9CisKIH0KIAogQGltcGxlbWVu
dGF0aW9uIFdlYkxheWVyCg==
</data>
<flag name="review"
          id="257494"
          type_id="1"
          status="+"
          setter="thorton"
    />
          </attachment>
      

    </bug>

</bugzilla>