<?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>40643</bug_id>
          
          <creation_ts>2010-06-15 16:20:18 -0700</creation_ts>
          <short_desc>Move ownership of Canvas3DLayer to GraphicsContext3D</short_desc>
          <delta_ts>2010-06-23 11:27:27 -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>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>OS X 10.6</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Marrin">cmarrin</reporter>
          <assigned_to name="Chris Marrin">cmarrin</assigned_to>
          <cc>dino</cc>
    
    <cc>eric</cc>
    
    <cc>kbr</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>vangelis</cc>
    
    <cc>webkit-ews</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>238603</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-15 16:20:18 -0700</bug_when>
    <thetext>This would make WebGL behave more like the media layer. It would not only clean up the code, but would make it possible to get rid of one GL context and a copy of the pixels. We may also want to rename Canvas3DLayer to WebGLLayer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>238628</commentid>
    <comment_count>1</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-15 17:33:56 -0700</bug_when>
    <thetext>I will do this in 3 phases:

1) Rename GraphicsContext3DMac.cpp to GraphicsContext3DMac.mm to allow handling of CALayer

2) Rename Canvas3DLayer to WebGLLayer

3) Move WebGLLayer ownership to GraphicsContext3D and use a single CGLContext for rendering</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>238631</commentid>
    <comment_count>2</comment_count>
      <attachid>58841</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-15 17:38:37 -0700</bug_when>
    <thetext>Created attachment 58841
Patch to rename GraphicsContext3DMac.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>238632</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-06-15 17:43:28 -0700</bug_when>
    <thetext>Attachment 58841 did not build on mac:
Build output: http://webkit-commit-queue.appspot.com/results/3324197</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>238640</commentid>
    <comment_count>4</comment_count>
      <attachid>58841</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-06-15 18:21:48 -0700</bug_when>
    <thetext>Comment on attachment 58841
Patch to rename GraphicsContext3DMac.cpp

r=me assuming that you also intend to fix the Xcode project.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>238936</commentid>
    <comment_count>5</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-16 10:08:06 -0700</bug_when>
    <thetext>Landed GraphicsContext3DMac rename in http://trac.webkit.org/changeset/61262 (along with xcodeproj change)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>238943</commentid>
    <comment_count>6</comment_count>
      <attachid>58901</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-16 10:26:52 -0700</bug_when>
    <thetext>Created attachment 58901
Patch to rename Canvas3DLayer to WebGLLayer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>238966</commentid>
    <comment_count>7</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-06-16 11:07:49 -0700</bug_when>
    <thetext>I&apos;d suggesting using a more specific name than WebGLLayer, to avoid Obj-C name conflicts with embedding apps (Obj-C just has one global namespace). I have to rename WebLayer/WebTiledLayer for the same reasons.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>239608</commentid>
    <comment_count>8</comment_count>
      <attachid>58841</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-06-17 15:30:36 -0700</bug_when>
    <thetext>Comment on attachment 58841
Patch to rename GraphicsContext3DMac.cpp

Cleared Simon Fraser&apos;s review+ from obsolete attachment 58841 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241439</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-22 13:50:53 -0700</bug_when>
    <thetext>Landed WebGLLayer rename in http://trac.webkit.org/changeset/61263</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241440</commentid>
    <comment_count>10</comment_count>
      <attachid>59413</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-22 13:52:23 -0700</bug_when>
    <thetext>Created attachment 59413
Final patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241446</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-22 13:56:40 -0700</bug_when>
    <thetext>Attachment 59413 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/platform/graphics/mac/GraphicsLayerCA.h:336:  Missing space after ,  [whitespace/comma] [3]
Total errors found: 1 in 9 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>241451</commentid>
    <comment_count>12</comment_count>
      <attachid>59413</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-06-22 14:05:25 -0700</bug_when>
    <thetext>Comment on attachment 59413
Final patch

&gt; Index: WebCore/platform/graphics/mac/GraphicsContext3DMac.mm
&gt; ===================================================================
&gt; +#ifndef NDEBUG
&gt; +        [m_webGLLayer.get() setName:@&quot;3D Layer&quot;];
&gt; +#endif    

I think &quot;WebGL Layer&quot; would be a better name.

&gt; Index: WebCore/platform/graphics/mac/GraphicsLayerCA.h
&gt; ===================================================================

&gt;  #if ENABLE(3D_CANVAS)
&gt; -    virtual void setGraphicsContext3DNeedsDisplay();
&gt; +    virtual void setWebGLNeedsDisplay();
&gt;  #endif

Do you really need the setWebGLNeedsDisplay() method? The GraphicsContext3D now holds onto the layer, so maybe it should do the -setNeedsDisplay itself?

However, this will bypass the syncing logic, so may cause flashes with some content.

&gt; Index: WebCore/platform/graphics/mac/GraphicsLayerCA.mm
&gt; ===================================================================

&gt; -void GraphicsLayerCA::setGraphicsContext3DNeedsDisplay()
&gt; +void GraphicsLayerCA::setWebGLNeedsDisplay()
&gt;  {
&gt; -    if (m_contentsLayerPurpose == ContentsLayerForGraphicsLayer3D)
&gt; +    if (m_contentsLayerPurpose == ContentsLayerForWebGL)
&gt;          [m_contentsLayer.get() setNeedsDisplay];
&gt;  }

This may cause an early CA commit, which can result in flashes in some content. You should really use a dirty bit for this.

r=me but please reconsider setWebGLNeedsDisplay().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241468</commentid>
    <comment_count>13</comment_count>
      <attachid>59418</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-22 14:55:31 -0700</bug_when>
    <thetext>Created attachment 59418
replacement patch with setContentsNeedsDisplay</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241469</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-06-22 14:58:09 -0700</bug_when>
    <thetext>Attachment 59418 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/platform/graphics/mac/GraphicsLayerCA.h:335:  Missing space after ,  [whitespace/comma] [3]
Total errors found: 1 in 9 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>241472</commentid>
    <comment_count>15</comment_count>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2010-06-22 15:01:47 -0700</bug_when>
    <thetext>Attachment 59418 did not build on qt:
Build output: http://webkit-commit-queue.appspot.com/results/3280610</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241474</commentid>
    <comment_count>16</comment_count>
      <attachid>59419</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-22 15:06:58 -0700</bug_when>
    <thetext>Created attachment 59419
Replacement patch fixing style issue and Qt build failure</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241482</commentid>
    <comment_count>17</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-22 15:25:23 -0700</bug_when>
    <thetext>Landed final patch in http://trac.webkit.org/changeset/61631</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241548</commentid>
    <comment_count>18</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-06-22 17:01:59 -0700</bug_when>
    <thetext>The changes to RenderLayerBacking.cpp break the Chromium build (and most likely the Qt build as well).

[line: 219] if (context-&gt;graphicsContext3D()-&gt;platformLayer())

platformLayer() is only defined for PLATFORM(MAC)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241552</commentid>
    <comment_count>19</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-22 17:11:32 -0700</bug_when>
    <thetext>I suppose the bots didn&apos;t catch this because they build with 3D_CANVAS off? Are either Qt or Chromium building with both 3D_CANVAS and ACCELERATED_COMPOSITING enabled? I didn&apos;t think so. Vangelis, since you have a Chromium build environment, could you make a #else case that defines platformLayer() for other than Mac. I suppose it would just be a stub for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241561</commentid>
    <comment_count>20</comment_count>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2010-06-22 17:33:03 -0700</bug_when>
    <thetext>chromium on windows currently builds with both ACCELERATED_COMPOSITING and 3D_CANVAS but it look like the windows trybot didn&apos;t get to run. 

I&apos;ll check in a quick fix to get the chrome build green again, however, there&apos;s an issue with the new API. The idea that GraphicsContext3D knows about the PlatformLayer it renders into is, I believe, unique to CoreAnimation. In other ports, the PlatformLayer&apos;s actually get created by the GraphicsLayer&apos;s and are managed by them as well. I found the old API where you provide a pointer to the GraphicsContext3D when you set the contents of a layer more general. Can&apos;t you extract the CALayer information from it within GraphicsLayerCA::setContentsToWebGL ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241964</commentid>
    <comment_count>21</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-06-23 11:25:56 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; chromium on windows currently builds with both ACCELERATED_COMPOSITING and 3D_CANVAS but it look like the windows trybot didn&apos;t get to run. 
&gt; 
&gt; I&apos;ll check in a quick fix to get the chrome build green again, however, there&apos;s an issue with the new API. The idea that GraphicsContext3D knows about the PlatformLayer it renders into is, I believe, unique to CoreAnimation. In other ports, the PlatformLayer&apos;s actually get created by the GraphicsLayer&apos;s and are managed by them as well. I found the old API where you provide a pointer to the GraphicsContext3D when you set the contents of a layer more general. Can&apos;t you extract the CALayer information from it within GraphicsLayerCA::setContentsToWebGL ?

One of the biggest motivators for this change was to make WebGL layers behave like the media layer, which hands ownership of the layer to the client. For video this allows acceleration of the video contents without GraphicsLayer having to know anything about it. The same is true of WebGL layers. There was hackery involved to communicate enough information to GraphicsLayer to get it to be able to render accelerated 3D content. 

With the current design GraphicsLayer doesn&apos;t have to know about GraphicsContext3D or WebGLLayer. So I think this is the better design. I think your design would really benefit from contracting out the creation and management of the PlatformLayer. Remember PlatformLayer could be anything you want in Chromium, a GL context, a GraphicsContext3D, or a wrapper with the appropriate functionality. It really does reduce dependencies.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>241970</commentid>
    <comment_count>22</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2010-06-23 11:27:27 -0700</bug_when>
    <thetext>*** Bug 34036 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58841</attachid>
            <date>2010-06-15 17:38:37 -0700</date>
            <delta_ts>2010-06-17 15:30:36 -0700</delta_ts>
            <desc>Patch to rename GraphicsContext3DMac.cpp</desc>
            <filename>40643-1.patch</filename>
            <type>text/plain</type>
            <size>95741</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MTIyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTQgQEAKKzIwMTAtMDYtMTUgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDY0MworICAgICAgICAKKyAg
ICAgICAgUmVuYW1lIEdyYXBoaWNzQ29udGV4dDNETWFjLmNwcCBzbyBpdCBjYW4gaW50ZXJhY3Qg
d2l0aCBDQUxheWVyCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3ND
b250ZXh0M0RNYWMuY3BwOiBSZW1vdmVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21h
Yy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbTogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3BwLgorCiAyMDEwLTA2LTE1ICBLaW51
a28gWWFzdWRhICA8a2ludWtvQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBE
YXZpZCBMZXZpbi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNz
Q29udGV4dDNETWFjLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5jcHAJKHJldmlzaW9uIDYxMjIxKQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDE0NzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQot
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
LSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIK
LQotI2lmIEVOQUJMRSgzRF9DQU5WQVMpCi0KLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5o
IgotCi0jaW5jbHVkZSAiQ2FudmFzT2JqZWN0LmgiCi0jaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIK
LSNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIldlYkdMQWN0aXZlSW5mby5o
IgotI2luY2x1ZGUgIkFycmF5QnVmZmVyVmlldy5oIgotI2luY2x1ZGUgIldlYkdMQnVmZmVyLmgi
Ci0jaW5jbHVkZSAiRmxvYXQzMkFycmF5LmgiCi0jaW5jbHVkZSAiV2ViR0xGcmFtZWJ1ZmZlci5o
IgotI2luY2x1ZGUgIkludDMyQXJyYXkuaCIKLSNpbmNsdWRlICJXZWJHTFByb2dyYW0uaCIKLSNp
bmNsdWRlICJXZWJHTFJlbmRlcmJ1ZmZlci5oIgotI2luY2x1ZGUgIldlYkdMU2hhZGVyLmgiCi0j
aW5jbHVkZSAiV2ViR0xUZXh0dXJlLmgiCi0jaW5jbHVkZSAiVWludDhBcnJheS5oIgotI2luY2x1
ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KLSNpbmNsdWRlIDxPcGVuR0wvQ0dM
UmVuZGVyZXJzLmg+Ci0jaW5jbHVkZSA8T3BlbkdML2dsLmg+Ci0jaW5jbHVkZSA8d3RmL1VudXNl
ZFBhcmFtLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci0KLXN0YXRpYyB2b2lkIHNldFBpeGVsRm9ybWF0KFZlY3RvcjxDR0xQaXhlbEZvcm1h
dEF0dHJpYnV0ZT4mIGF0dHJpYnMsIGludCBjb2xvckJpdHMsIGludCBkZXB0aEJpdHMsIGJvb2wg
YWNjZWxlcmF0ZWQsIGJvb2wgc3VwZXJzYW1wbGUsIGJvb2wgY2xvc2VzdCkKLXsKLSAgICBhdHRy
aWJzLmNsZWFyKCk7Ci0gICAgCi0gICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQUNvbG9yU2l6ZSk7
Ci0gICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+
KGNvbG9yQml0cykpOwotICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFEZXB0aFNpemUpOwotICAg
IGF0dHJpYnMuYXBwZW5kKHN0YXRpY19jYXN0PENHTFBpeGVsRm9ybWF0QXR0cmlidXRlPihkZXB0
aEJpdHMpKTsKLSAgICAKLSAgICBpZiAoYWNjZWxlcmF0ZWQpCi0gICAgICAgIGF0dHJpYnMuYXBw
ZW5kKGtDR0xQRkFBY2NlbGVyYXRlZCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF0dHJpYnMuYXBw
ZW5kKGtDR0xQRkFSZW5kZXJlcklEKTsKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nh
c3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGtDR0xSZW5kZXJlckdlbmVyaWNGbG9hdElEKSk7
Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAoc3VwZXJzYW1wbGUpCi0gICAgICAgIGF0dHJpYnMu
YXBwZW5kKGtDR0xQRkFTdXBlcnNhbXBsZSk7Ci0gICAgICAgIAotICAgIGlmIChjbG9zZXN0KQot
ICAgICAgICBhdHRyaWJzLmFwcGVuZChrQ0dMUEZBQ2xvc2VzdFBvbGljeSk7Ci0gICAgICAgIAot
ICAgIGF0dHJpYnMuYXBwZW5kKHN0YXRpY19jYXN0PENHTFBpeGVsRm9ybWF0QXR0cmlidXRlPigw
KSk7Ci19Ci0KLVBhc3NPd25QdHI8R3JhcGhpY3NDb250ZXh0M0Q+IEdyYXBoaWNzQ29udGV4dDNE
OjpjcmVhdGUoR3JhcGhpY3NDb250ZXh0M0Q6OkF0dHJpYnV0ZXMgYXR0cnMsIEhvc3RXaW5kb3cq
IGhvc3RXaW5kb3cpCi17Ci0gICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dDNEPiBjb250ZXh0KG5l
dyBHcmFwaGljc0NvbnRleHQzRChhdHRycywgaG9zdFdpbmRvdykpOwotICAgIHJldHVybiBjb250
ZXh0LT5tX2NvbnRleHRPYmogPyBjb250ZXh0LnJlbGVhc2UoKSA6IDA7Ci19Ci0KLUdyYXBoaWNz
Q29udGV4dDNEOjpHcmFwaGljc0NvbnRleHQzRChHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRl
cyBhdHRycywgSG9zdFdpbmRvdyogaG9zdFdpbmRvdykKLSAgICA6IG1fY3VycmVudFdpZHRoKDAp
Ci0gICAgLCBtX2N1cnJlbnRIZWlnaHQoMCkKLSAgICAsIG1fYXR0cnMoYXR0cnMpCi0gICAgLCBt
X2NvbnRleHRPYmooMCkKLSAgICAsIG1fdGV4dHVyZSgwKQotICAgICwgbV9mYm8oMCkKLSAgICAs
IG1fZGVwdGhTdGVuY2lsQnVmZmVyKDApCi0gICAgLCBtX2JvdW5kRkJPKDApCi0gICAgLCBtX211
bHRpc2FtcGxlRkJPKDApCi0gICAgLCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKDAp
Ci0gICAgLCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIoMCkKLXsKLSAgICBVTlVTRURfUEFSQU0o
aG9zdFdpbmRvdyk7Ci0KLSAgICBWZWN0b3I8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+IGF0dHJp
YnM7Ci0gICAgQ0dMUGl4ZWxGb3JtYXRPYmogcGl4ZWxGb3JtYXRPYmogPSAwOwotICAgIEdMaW50
IG51bVBpeGVsRm9ybWF0cyA9IDA7Ci0gICAgCi0gICAgLy8gV2Ugd2lsbCB0cnk6Ci0gICAgLy8K
LSAgICAvLyAgMSkgMzIgYml0IFJHQkEvMzIgYml0IGRlcHRoL2FjY2VsZXJhdGVkL3N1cGVyc2Ft
cGxlZAotICAgIC8vICAyKSAzMiBiaXQgUkdCQS8zMiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQKLSAg
ICAvLyAgMykgMzIgYml0IFJHQkEvMTYgYml0IGRlcHRoL2FjY2VsZXJhdGVkCi0gICAgLy8gIDQp
IGNsb3Nlc3QgdG8gMzIgYml0IFJHQkEvMTYgYml0IGRlcHRoL3NvZnR3YXJlIHJlbmRlcmVyCi0g
ICAgLy8KLSAgICAvLyAgSWYgbm9uZSBvZiB0aGF0IHdvcmtzLCB3ZSBzaW1wbHkgZmFpbCBhbmQg
c2V0IG1fY29udGV4dE9iaiB0byAwLgotICAgIAotICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMs
IDMyLCAzMiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0
dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOwotICAgIGlm
IChudW1QaXhlbEZvcm1hdHMgPT0gMCkgewotICAgICAgICBzZXRQaXhlbEZvcm1hdChhdHRyaWJz
LCAzMiwgMzIsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIENHTENob29zZVBpeGVsRm9y
bWF0KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOwot
ICAgICAgICAKLSAgICAgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7Ci0gICAgICAgICAg
ICBzZXRQaXhlbEZvcm1hdChhdHRyaWJzLCAzMiwgMTYsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0g
ICAgICAgICAgICBDR0xDaG9vc2VQaXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwgJnBpeGVsRm9y
bWF0T2JqLCAmbnVtUGl4ZWxGb3JtYXRzKTsKLSAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVt
UGl4ZWxGb3JtYXRzID09IDApIHsKLSAgICAgICAgICAgICAgICBzZXRQaXhlbEZvcm1hdChhdHRy
aWJzLCAzMiwgMTYsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgQ0dMQ2hv
b3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVs
Rm9ybWF0cyk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChudW1QaXhlbEZvcm1hdHMg
PT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgZmluZCBhbiBhY2NlcHRh
YmxlIHJlbmRlcmVyIC0gZmFpbAotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIENH
TEVycm9yIGVyciA9IENHTENyZWF0ZUNvbnRleHQocGl4ZWxGb3JtYXRPYmosIDAsICZtX2NvbnRl
eHRPYmopOwotICAgIENHTERlc3Ryb3lQaXhlbEZvcm1hdChwaXhlbEZvcm1hdE9iaik7Ci0gICAg
Ci0gICAgaWYgKGVyciAhPSBrQ0dMTm9FcnJvciB8fCAhbV9jb250ZXh0T2JqKSB7Ci0gICAgICAg
IC8vIENvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbnRleHQgLSBmYWlsCi0gICAgICAgIG1fY29udGV4
dE9iaiA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIGN1cnJl
bnQgY29udGV4dCB0byB0aGUgb25lIGdpdmVuIHRvIHVzLgotICAgIENHTFNldEN1cnJlbnRDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgCi0gICAgdmFsaWRhdGVBdHRyaWJ1dGVzKCk7Ci0KLSAg
ICAvLyBjcmVhdGUgYSB0ZXh0dXJlIHRvIHJlbmRlciBpbnRvCi0gICAgOjpnbEdlblRleHR1cmVz
KDEsICZtX3RleHR1cmUpOwotICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3Rl
eHR1cmUpOwotICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVf
TUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJF
XzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgOjpnbFRleFBhcmFt
ZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QKTsKLSAgICA6
OmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xB
TVApOwotICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICAKLSAgICAv
LyBjcmVhdGUgYW4gRkJPCi0gICAgOjpnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmbV9mYm8pOwot
ICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0g
ICAgCi0gICAgbV9ib3VuZEZCTyA9IG1fZmJvOwotICAgIGlmICghbV9hdHRycy5hbnRpYWxpYXMg
JiYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKSkKLSAgICAgICAgOjpnbEdlblJl
bmRlcmJ1ZmZlcnNFWFQoMSwgJm1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLQotICAgIC8vIGNyZWF0
ZSBhbiBtdWx0aXNhbXBsZSBGQk8KLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKLSAgICAg
ICAgOjpnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxl
RkJPKTsKLSAgICAgICAgbV9ib3VuZEZCTyA9IG1fbXVsdGlzYW1wbGVGQk87Ci0gICAgICAgIDo6
Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOwotICAg
ICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICA6
OmdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZl
cik7Ci0gICAgfQotICAgIAotICAgIDo6Z2xFbmFibGUoR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRf
U0laRSk7Ci0gICAgOjpnbENsZWFyQ29sb3IoMCwgMCwgMCwgMCk7Ci19Ci0KLUdyYXBoaWNzQ29u
dGV4dDNEOjp+R3JhcGhpY3NDb250ZXh0M0QoKQotewotICAgIGlmIChtX2NvbnRleHRPYmopIHsK
LSAgICAgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAgICAgOjpn
bERlbGV0ZVRleHR1cmVzKDEsICZtX3RleHR1cmUpOwotICAgICAgICBpZiAobV9hdHRycy5hbnRp
YWxpYXMpIHsKLSAgICAgICAgICAgIDo6Z2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZtX211
bHRpc2FtcGxlQ29sb3JCdWZmZXIpOwotICAgICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8
fCBtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgICAgIDo6Z2xEZWxldGVSZW5kZXJidWZmZXJz
RVhUKDEsICZtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgICAgIDo6
Z2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRo
KQotICAgICAgICAgICAgICAgIDo6Z2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZtX2RlcHRo
U3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgOjpnbERlbGV0ZUZyYW1lYnVmZmVy
c0VYVCgxLCAmbV9mYm8pOwotICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dCgwKTsKLSAgICAg
ICAgQ0dMRGVzdHJveUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICB9Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlQXR0cmlidXRlcygpCi17Ci0gICAgY29uc3QgY2hhciog
ZXh0ZW5zaW9ucyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDo6Z2xHZXRTdHJpbmco
R0xfRVhURU5TSU9OUykpOwotICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpIHsKLSAgICAgICAgaWYg
KHN0ZDo6c3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9FWFRfcGFja2VkX2RlcHRoX3N0ZW5jaWwiKSkg
ewotICAgICAgICAgICAgaWYgKCFtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgICAgIG1fYXR0
cnMuZGVwdGggPSB0cnVlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fYXR0cnMuc3Rl
bmNpbCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKLSAgICAg
ICAgYm9vbCBpc1ZhbGlkVmVuZG9yID0gdHJ1ZTsKLSAgICAgICAgLy8gQ3VycmVudGx5IGluIE1h
YyB3ZSBvbmx5IHR1cm4gb24gYW50aWFsaWFzIGlmIHZlbmRvciBpcyBOVklESUEuCi0gICAgICAg
IGNvbnN0IGNoYXIqIHZlbmRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDo6Z2xH
ZXRTdHJpbmcoR0xfVkVORE9SKSk7Ci0gICAgICAgIGlmICghc3RkOjpzdHJzdHIodmVuZG9yLCAi
TlZJRElBIikpCi0gICAgICAgICAgICBpc1ZhbGlkVmVuZG9yID0gZmFsc2U7Ci0gICAgICAgIGlm
ICghaXNWYWxpZFZlbmRvciB8fCAhc3RkOjpzdHJzdHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9mcmFt
ZWJ1ZmZlcl9tdWx0aXNhbXBsZSIpKQotICAgICAgICAgICAgbV9hdHRycy5hbnRpYWxpYXMgPSBm
YWxzZTsKLSAgICB9Ci0gICAgLy8gRklYTUU6IGluc3RlYWQgb2YgZW5mb3JjaW5nIHByZW11bHRp
cGxpZWRBbHBoYSA9IHRydWUsIGltcGxlbWVudCB0aGUKLSAgICAvLyBjb3JyZWN0IGJlaGF2aW9y
IHdoZW4gcHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2UgaXMgcmVxdWVzdGVkLgotICAgIG1fYXR0
cnMucHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6bWFrZUNvbnRleHRDdXJyZW50KCkKLXsKLSAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2Nv
bnRleHRPYmopOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiZWdpblBhaW50KFdlYkdM
UmVuZGVyaW5nQ29udGV4dCogY29udGV4dCkKLXsKLSAgICBVTlVTRURfUEFSQU0oY29udGV4dCk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuZFBhaW50KCkKLXsKLX0KLQotYm9vbCBH
cmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMkNvbXBsaWFudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNoYXBlKGludCB3aWR0aCwg
aW50IGhlaWdodCkKLXsKLSAgICBpZiAod2lkdGggPT0gbV9jdXJyZW50V2lkdGggJiYgaGVpZ2h0
ID09IG1fY3VycmVudEhlaWdodCB8fCAhbV9jb250ZXh0T2JqKQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgbV9jdXJyZW50V2lkdGggPSB3aWR0aDsKLSAgICBtX2N1cnJlbnRIZWlnaHQgPSBo
ZWlnaHQ7Ci0gICAgCi0gICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICAKLSAgICBHTHVpbnQgaW50ZXJuYWxDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQsIGludGVybmFs
RGVwdGhTdGVuY2lsRm9ybWF0ID0gMDsKLSAgICBpZiAobV9hdHRycy5hbHBoYSkgewotICAgICAg
ICBpbnRlcm5hbENvbG9yRm9ybWF0ID0gR0xfUkdCQTg7Ci0gICAgICAgIGNvbG9yRm9ybWF0ID0g
R0xfUkdCQTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnRlcm5hbENvbG9yRm9ybWF0ID0gR0xf
UkdCODsKLSAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9SR0I7Ci0gICAgfQotICAgIGlmIChtX2F0
dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkgewotICAgICAgICAvLyBXZSBkb24ndCBhbGxv
dyB0aGUgbG9naWMgd2hlcmUgc3RlbmNpbCBpcyByZXF1aXJlZCBhbmQgZGVwdGggaXMgbm90Lgot
ICAgICAgICAvLyBTZWUgR3JhcGhpY3NDb250ZXh0M0QgY29uc3RydWN0b3IuCi0gICAgICAgIGlm
IChtX2F0dHJzLnN0ZW5jaWwgJiYgbV9hdHRycy5kZXB0aCkKLSAgICAgICAgICAgIGludGVybmFs
RGVwdGhTdGVuY2lsRm9ybWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7Ci0gICAgICAgIGVs
c2UKLSAgICAgICAgICAgIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0gR0xfREVQVEhfQ09N
UE9ORU5UOwotICAgIH0KLQotICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKLQotICAg
IC8vIHJlc2l6ZSBtdWx0aXNhbXBsZSBGQk8KLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsK
LSAgICAgICAgR0xpbnQgbWF4U2FtcGxlQ291bnQ7Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihH
TF9NQVhfU0FNUExFU19FWFQsICZtYXhTYW1wbGVDb3VudCk7Ci0gICAgICAgIEdMaW50IHNhbXBs
ZUNvdW50ID0gc3RkOjptaW4oOCwgbWF4U2FtcGxlQ291bnQpOwotICAgICAgICBpZiAoc2FtcGxl
Q291bnQgPiBtYXhTYW1wbGVDb3VudCkKLSAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gbWF4U2Ft
cGxlQ291bnQ7Ci0gICAgICAgIGlmIChtX2JvdW5kRkJPICE9IG1fbXVsdGlzYW1wbGVGQk8pIHsK
LSAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBt
X211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKLSAg
ICAgICAgfQotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOwotICAgICAgICA6OmdsUmVuZGVyYnVmZmVy
U3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBp
bnRlcm5hbENvbG9yRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgOjpnbEZyYW1lYnVm
ZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVO
VDBfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOwot
ICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpIHsKLSAgICAgICAg
ICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlz
YW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICAgICAgOjpnbFJlbmRlcmJ1ZmZlclN0
b3JhZ2VNdWx0aXNhbXBsZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBzYW1wbGVDb3VudCwgaW50
ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgaWYg
KG1fYXR0cnMuc3RlbmNpbCkKLSAgICAgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJi
dWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhULCBH
TF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAg
ICAgICAgICAgIGlmIChtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgICAgIDo6Z2xGcmFtZWJ1
ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0RFUFRIX0FUVEFDSE1F
TlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVm
ZmVyKTsKLSAgICAgICAgfQotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5E
RVJCVUZGRVJfRVhULCAwKTsKLSAgICAgICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VY
VChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgewot
ICAgICAgICAgICAgLy8gRklYTUU6IGNsZWFudXAuCi0gICAgICAgICAgICBub3RJbXBsZW1lbnRl
ZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcmVzaXplIHJlZ3VsYXIgRkJPCi0gICAg
aWYgKG1fYm91bmRGQk8gIT0gbV9mYm8pIHsKLSAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVl
OwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9m
Ym8pOwotICAgIH0KLSAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJl
KTsKLSAgICA6OmdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBpbnRlcm5hbENvbG9yRm9y
bWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBjb2xvckZvcm1hdCwgR0xfVU5TSUdORURfQllURSwgMCk7
Ci0gICAgOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xf
Q09MT1JfQVRUQUNITUVOVDBfRVhULCBHTF9URVhUVVJFXzJELCBtX3RleHR1cmUsIDApOwotICAg
IDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICBpZiAoIW1fYXR0cnMuYW50
aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkpIHsKLSAgICAgICAg
OjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0ZW5j
aWxCdWZmZXIpOwotICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVChHTF9SRU5ERVJC
VUZGRVJfRVhULCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0g
ICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCi0gICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJS
ZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRf
RVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAg
IGlmIChtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVm
ZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JF
TkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgOjpnbEJpbmRS
ZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgMCk7Ci0gICAgfQotICAgIGlmIChn
bENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQoR0xfRlJBTUVCVUZGRVJfRVhUKSAhPSBHTF9GUkFN
RUJVRkZFUl9DT01QTEVURV9FWFQpIHsKLSAgICAgICAgLy8gRklYTUU6IGNsZWFudXAKLSAgICAg
ICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMp
IHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1f
bXVsdGlzYW1wbGVGQk8pOwotICAgICAgICBpZiAobV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxl
RkJPKQotICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAv
LyBJbml0aWFsaXplIHJlbmRlcmJ1ZmZlcnMgdG8gMC4KLSAgICBHTGJvb2xlYW4gY29sb3JNYXNr
W10gPSB7R0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRX0sIGRlcHRoTWFzayA9IEdM
X1RSVUUsIHN0ZW5jaWxNYXNrID0gR0xfVFJVRTsKLSAgICBHTGJvb2xlYW4gaXNTY2lzc29yRW5h
YmxlZCA9IEdMX0ZBTFNFOwotICAgIEdMYm9vbGVhbiBpc0RpdGhlckVuYWJsZWQgPSBHTF9GQUxT
RTsKLSAgICBHTGJpdGZpZWxkIGNsZWFyTWFzayA9IEdMX0NPTE9SX0JVRkZFUl9CSVQ7Ci0gICAg
OjpnbEdldEJvb2xlYW52KEdMX0NPTE9SX1dSSVRFTUFTSywgY29sb3JNYXNrKTsKLSAgICA6Omds
Q29sb3JNYXNrKEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUpOwotICAgIGlmICht
X2F0dHJzLmRlcHRoKSB7Ci0gICAgICAgIDo6Z2xHZXRCb29sZWFudihHTF9ERVBUSF9XUklURU1B
U0ssICZkZXB0aE1hc2spOwotICAgICAgICA6OmdsRGVwdGhNYXNrKEdMX1RSVUUpOwotICAgICAg
ICBjbGVhck1hc2sgfD0gR0xfREVQVEhfQlVGRkVSX0JJVDsKLSAgICB9Ci0gICAgaWYgKG1fYXR0
cnMuc3RlbmNpbCkgewotICAgICAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfU1RFTkNJTF9XUklURU1B
U0ssICZzdGVuY2lsTWFzayk7Ci0gICAgICAgIDo6Z2xTdGVuY2lsTWFzayhHTF9UUlVFKTsKLSAg
ICAgICAgY2xlYXJNYXNrIHw9IEdMX1NURU5DSUxfQlVGRkVSX0JJVDsKLSAgICB9Ci0gICAgaXNT
Y2lzc29yRW5hYmxlZCA9IDo6Z2xJc0VuYWJsZWQoR0xfU0NJU1NPUl9URVNUKTsKLSAgICA6Omds
RGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGlzRGl0aGVyRW5hYmxlZCA9IDo6Z2xJc0Vu
YWJsZWQoR0xfRElUSEVSKTsKLSAgICA6OmdsRGlzYWJsZShHTF9ESVRIRVIpOwotCi0gICAgOjpn
bENsZWFyKGNsZWFyTWFzayk7Ci0KLSAgICA6OmdsQ29sb3JNYXNrKGNvbG9yTWFza1swXSwgY29s
b3JNYXNrWzFdLCBjb2xvck1hc2tbMl0sIGNvbG9yTWFza1szXSk7Ci0gICAgaWYgKG1fYXR0cnMu
ZGVwdGgpCi0gICAgICAgIDo6Z2xEZXB0aE1hc2soZGVwdGhNYXNrKTsKLSAgICBpZiAobV9hdHRy
cy5zdGVuY2lsKQotICAgICAgICA6OmdsU3RlbmNpbE1hc2soc3RlbmNpbE1hc2spOwotICAgIGlm
IChpc1NjaXNzb3JFbmFibGVkKQotICAgICAgICA6OmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7
Ci0gICAgZWxzZQotICAgICAgICA6OmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGlm
IChpc0RpdGhlckVuYWJsZWQpCi0gICAgICAgIDo6Z2xFbmFibGUoR0xfRElUSEVSKTsKLSAgICBl
bHNlCi0gICAgICAgIDo6Z2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0KLSAgICBpZiAobXVzdFJlc3Rv
cmVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
LCBtX2JvdW5kRkJPKTsKLQotICAgIDo6Z2xGbHVzaCgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZv
aWQgZW5zdXJlQ29udGV4dChDR0xDb250ZXh0T2JqIGNvbnRleHQpCi17Ci0gICAgaWYgKCFjb250
ZXh0KQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIENHTENvbnRleHRPYmogY3VycmVu
dENvbnRleHQgPSBDR0xHZXRDdXJyZW50Q29udGV4dCgpOwotICAgIGlmIChjdXJyZW50Q29udGV4
dCAhPSBjb250ZXh0KQotICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChjb250ZXh0KTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cHJlcGFyZVRleHR1cmUoKQotewotICAgIGlmICht
X2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQs
IG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RS
QVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJF
WFQoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgMCwgMCwgbV9jdXJyZW50
V2lkdGgsIG1fY3VycmVudEhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsK
LSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91
bmRGQk8pOwotICAgIH0KLSAgICA6OmdsRmluaXNoKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmFjdGl2ZVRleHR1cmUodW5zaWduZWQgbG9uZyB0ZXh0dXJlKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YXR0YWNoU2hhZGVyKFdlYkdMUHJvZ3JhbSog
cHJvZ3JhbSwgV2ViR0xTaGFkZXIqIHNoYWRlcikKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0g
ICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xBdHRhY2hTaGFkZXIoKEdMdWludCkgcHJvZ3JhbS0+b2JqZWN0KCksIChHTHVpbnQpIHNo
YWRlci0+b2JqZWN0KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQXR0cmli
TG9jYXRpb24oV2ViR0xQcm9ncmFtKiBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIGluZGV4LCBjb25z
dCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmluZEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHBy
b2dyYW0tPm9iamVjdCgpLCBpbmRleCwgbmFtZS51dGY4KCkuZGF0YSgpKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6YmluZEJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgV2ViR0xC
dWZmZXIqIGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEJpbmRCdWZmZXIodGFyZ2V0LCBidWZmZXIgPyAoR0x1aW50KSBidWZmZXItPm9iamVjdCgp
IDogMCk7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEZyYW1lYnVmZmVyKHVu
c2lnbmVkIGxvbmcgdGFyZ2V0LCBXZWJHTEZyYW1lYnVmZmVyKiBidWZmZXIpCi17Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWludCBmYm87Ci0gICAgaWYgKGJ1ZmZl
ciAmJiBidWZmZXItPm9iamVjdCgpKQotICAgICAgICBmYm8gPSAoR0x1aW50KWJ1ZmZlci0+b2Jq
ZWN0KCk7Ci0gICAgZWxzZQotICAgICAgICBmYm8gPSAobV9hdHRycy5hbnRpYWxpYXMgPyBtX211
bHRpc2FtcGxlRkJPIDogbV9mYm8pOwotICAgIGlmIChmYm8gIT0gbV9ib3VuZEZCTykgewotICAg
ICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKHRhcmdldCwgZmJvKTsKLSAgICAgICAgbV9ib3Vu
ZEZCTyA9IGZibzsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRSZW5k
ZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFdlYkdMUmVuZGVyYnVmZmVyKiByZW5kZXJi
dWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCaW5k
UmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgcmVuZGVyYnVmZmVyID8gKEdMdWludCkgcmVuZGVyYnVm
ZmVyLT5vYmplY3QoKSA6IDApOwotfQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRU
ZXh0dXJlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBXZWJHTFRleHR1cmUqIHRleHR1cmUpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCaW5kVGV4dHVyZSh0YXJn
ZXQsIHRleHR1cmUgPyAoR0x1aW50KSB0ZXh0dXJlLT5vYmplY3QoKSA6IDApOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZENvbG9yKGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbiwg
ZG91YmxlIGJsdWUsIGRvdWJsZSBhbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgOjpnbEJsZW5kQ29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRp
Y19jYXN0PGZsb2F0PihncmVlbiksIHN0YXRpY19jYXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGFscGhhKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1
YXRpb24oIHVuc2lnbmVkIGxvbmcgbW9kZSApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xCbGVuZEVxdWF0aW9uKG1vZGUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpibGVuZEVxdWF0aW9uU2VwYXJhdGUodW5zaWduZWQgbG9uZyBtb2RlUkdCLCB1
bnNpZ25lZCBsb25nIG1vZGVBbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZShtb2RlUkdCLCBtb2RlQWxwaGEpOwot
fQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuYyh1bnNpZ25lZCBsb25nIHNm
YWN0b3IsIHVuc2lnbmVkIGxvbmcgZGZhY3RvcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbEJsZW5kRnVuYyhzZmFjdG9yLCBkZmFjdG9yKTsKLX0gICAgICAg
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxv
bmcgc3JjUkdCLCB1bnNpZ25lZCBsb25nIGRzdFJHQiwgdW5zaWduZWQgbG9uZyBzcmNBbHBoYSwg
dW5zaWduZWQgbG9uZyBkc3RBbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEJsZW5kRnVuY1NlcGFyYXRlKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwg
ZHN0QWxwaGEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCBpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0LCBz
aXplLCAwLCB1c2FnZSk7Ci19Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVu
c2lnbmVkIGxvbmcgdGFyZ2V0LCBBcnJheUJ1ZmZlclZpZXcqIGFycmF5LCB1bnNpZ25lZCBsb25n
IHVzYWdlKQotewotICAgIGlmICghYXJyYXkgfHwgIWFycmF5LT5sZW5ndGgoKSkKLSAgICAgICAg
cmV0dXJuOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
QnVmZmVyRGF0YSh0YXJnZXQsIGFycmF5LT5ieXRlTGVuZ3RoKCksIGFycmF5LT5iYXNlQWRkcmVz
cygpLCB1c2FnZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlclN1YkRhdGEo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgb2Zmc2V0LCBBcnJheUJ1ZmZlclZpZXcqIGFycmF5
KQotewotICAgIGlmICghYXJyYXkgfHwgIWFycmF5LT5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJu
OwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQnVmZmVy
U3ViRGF0YSh0YXJnZXQsIG9mZnNldCwgYXJyYXktPmJ5dGVMZW5ndGgoKSwgYXJyYXktPmJhc2VB
ZGRyZXNzKCkpOwotfQotCi11bnNpZ25lZCBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpjaGVja0Zy
YW1lYnVmZmVyU3RhdHVzKHVuc2lnbmVkIGxvbmcgdGFyZ2V0KQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNF
WFQodGFyZ2V0KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJDb2xvcihkb3Vi
bGUgciwgZG91YmxlIGcsIGRvdWJsZSBiLCBkb3VibGUgYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyQ29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHIp
LCBzdGF0aWNfY2FzdDxmbG9hdD4oZyksIHN0YXRpY19jYXN0PGZsb2F0PihiKSwgc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGEpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXIodW5zaWdu
ZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsQ2xlYXIobWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyRGVwdGgo
ZG91YmxlIGRlcHRoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsQ2xlYXJEZXB0aChkZXB0aCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFy
U3RlbmNpbChsb25nIHMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xDbGVhclN0ZW5jaWwocyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvbG9y
TWFzayhib29sIHJlZCwgYm9vbCBncmVlbiwgYm9vbCBibHVlLCBib29sIGFscGhhKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ29sb3JNYXNrKHJlZCwgZ3Jl
ZW4sIGJsdWUsIGFscGhhKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29tcGlsZVNo
YWRlcihXZWJHTFNoYWRlciogc2hhZGVyKQotewotICAgIEFTU0VSVChzaGFkZXIpOwotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ29tcGlsZVNoYWRlcigoR0x1aW50
KSBzaGFkZXItPm9iamVjdCgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRl
eEltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcg
aW50ZXJuYWxmb3JtYXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNp
Z25lZCBsb25nIGhlaWdodCwgbG9uZyBib3JkZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1f
bXVsdGlzYW1wbGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFE
X0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpn
bEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHgg
KyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsK
LSAgICB9Ci0gICAgOjpnbENvcHlUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9y
bWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOwotICAgIGlmIChtX2F0dHJzLmFudGlh
bGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5k
RnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleFN1YkltYWdlMkQodW5zaWduZWQgbG9u
ZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIGxvbmcgeG9mZnNldCwgbG9uZyB5b2Zmc2V0LCBsb25nIHgs
IGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlh
cyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7
Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQs
IG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgs
IHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVS
X0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFN
RUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0gICAgOjpnbENvcHlUZXhTdWJJbWFnZTJEKHRh
cmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAg
IGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8p
Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211
bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y3VsbEZhY2UodW5z
aWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsQ3VsbEZhY2UobW9kZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRo
RnVuYyh1bnNpZ25lZCBsb25nIGZ1bmMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIDo6Z2xEZXB0aEZ1bmMoZnVuYyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmRlcHRoTWFzayhib29sIGZsYWcpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIDo6Z2xEZXB0aE1hc2soZmxhZyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmRlcHRoUmFuZ2UoZG91YmxlIHpOZWFyLCBkb3VibGUgekZhcikKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERlcHRoUmFuZ2Uoek5lYXIsIHpGYXIpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXRhY2hTaGFkZXIoV2ViR0xQcm9ncmFtKiBw
cm9ncmFtLCBXZWJHTFNoYWRlciogc2hhZGVyKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAg
ICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbERldGFjaFNoYWRlcigoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSwgKEdMdWludCkgc2hh
ZGVyLT5vYmplY3QoKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGUodW5z
aWduZWQgbG9uZyBjYXApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xEaXNhYmxlKGNhcCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGVW
ZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGluZGV4KQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0FycmF5cyh1bnNpZ25lZCBsb25n
IG1vZGUsIGxvbmcgZmlyc3QsIGxvbmcgY291bnQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0LCBjb3VudCk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVtZW50cyh1bnNpZ25lZCBsb25nIG1vZGUs
IHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEcmF3RWxlbWVudHMo
bW9kZSwgY291bnQsIHR5cGUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGlu
dHB0cl90PihvZmZzZXQpKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZSh1
bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbEVuYWJsZShjYXApOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjplbmFibGVW
ZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGluZGV4KQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmaW5pc2goKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmluaXNoKCk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmZsdXNoKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbEZsdXNoKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVm
ZmVyUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFj
aG1lbnQsIHVuc2lnbmVkIGxvbmcgcmVuZGVyYnVmZmVydGFyZ2V0LCBXZWJHTFJlbmRlcmJ1ZmZl
ciogYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVp
bnQgcmVuZGVyYnVmZmVyID0gKGJ1ZmZlciA/IChHTHVpbnQpIGJ1ZmZlci0+b2JqZWN0KCkgOiAw
KTsKLSAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHsKLSAg
ICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgREVQVEhfQVRUQUNI
TUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOwotICAgICAgICA6OmdsRnJh
bWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBTVEVOQ0lMX0FUVEFDSE1FTlQsIHJlbmRl
cmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLSAgICB9IGVsc2UKLSAgICAgICAgOjpnbEZy
YW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVy
dGFyZ2V0LCByZW5kZXJidWZmZXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFt
ZWJ1ZmZlclRleHR1cmUyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRh
Y2htZW50LCB1bnNpZ25lZCBsb25nIHRleHRhcmdldCwgV2ViR0xUZXh0dXJlKiB0ZXh0dXJlLCBs
b25nIGxldmVsKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
RnJhbWVidWZmZXJUZXh0dXJlMkRFWFQodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRl
eHR1cmUgPyAoR0x1aW50KSB0ZXh0dXJlLT5vYmplY3QoKSA6IDAsIGxldmVsKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJvbnRGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZyb250RmFjZShtb2RlKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2VuZXJhdGVNaXBtYXAodW5zaWduZWQgbG9u
ZyB0YXJnZXQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xH
ZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQpOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRBY3RpdmVBdHRyaWIoV2ViR0xQcm9ncmFtKiBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIGluZGV4
LCBBY3RpdmVJbmZvJiBpbmZvKQotewotICAgIGlmICghcHJvZ3JhbS0+b2JqZWN0KCkpIHsKLSAg
ICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50
IG1heEF0dHJpYnV0ZVNpemUgPSAwOwotICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGljX2Nhc3Q8
R0x1aW50Pihwcm9ncmFtLT5vYmplY3QoKSksIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdU
SCwgJm1heEF0dHJpYnV0ZVNpemUpOwotICAgIEdMY2hhciBuYW1lW21heEF0dHJpYnV0ZVNpemVd
OyAvLyBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEggaW5jbHVkZXMgbnVsbCB0ZXJtaW5h
dGlvbgotICAgIEdMc2l6ZWkgbmFtZUxlbmd0aCA9IDA7Ci0gICAgR0xpbnQgc2l6ZSA9IDA7Ci0g
ICAgR0xlbnVtIHR5cGUgPSAwOwotICAgIDo6Z2xHZXRBY3RpdmVBdHRyaWIoc3RhdGljX2Nhc3Q8
R0x1aW50Pihwcm9ncmFtLT5vYmplY3QoKSksIGluZGV4LCBtYXhBdHRyaWJ1dGVTaXplLCAmbmFt
ZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKLSAgICBpZiAoIW5hbWVMZW5ndGgpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBpbmZvLm5hbWUgPSBTdHJpbmcobmFtZSwgbmFtZUxlbmd0
aCk7Ci0gICAgaW5mby50eXBlID0gdHlwZTsKLSAgICBpbmZvLnNpemUgPSBzaXplOwotICAgIHJl
dHVybiB0cnVlOwotfQotICAgIAotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlVW5p
Zm9ybShXZWJHTFByb2dyYW0qIHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUlu
Zm8mIGluZm8pCi17Ci0gICAgaWYgKCFwcm9ncmFtLT5vYmplY3QoKSkgewotICAgICAgICBzeW50
aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0xpbnQgbWF4VW5pZm9y
bVNpemUgPSAwOwotICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9n
cmFtLT5vYmplY3QoKSksIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3Jt
U2l6ZSk7Ci0gICAgR0xjaGFyIG5hbWVbbWF4VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5J
Rk9STV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVybWluYXRpb24KLSAgICBHTHNpemVpIG5h
bWVMZW5ndGggPSAwOwotICAgIEdMaW50IHNpemUgPSAwOwotICAgIEdMZW51bSB0eXBlID0gMDsK
LSAgICA6OmdsR2V0QWN0aXZlVW5pZm9ybShzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0tPm9i
amVjdCgpKSwgaW5kZXgsIG1heFVuaWZvcm1TaXplLCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBl
LCBuYW1lKTsKLSAgICBpZiAoIW5hbWVMZW5ndGgpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICBpbmZvLm5hbWUgPSBTdHJpbmcobmFtZSwgbmFtZUxlbmd0aCk7Ci0gICAgaW5mby50eXBlID0g
dHlwZTsKLSAgICBpbmZvLnNpemUgPSBzaXplOwotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQg
R3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dHJpYkxvY2F0aW9uKFdlYkdMUHJvZ3JhbSogcHJvZ3Jh
bSwgY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIGlmICghcHJvZ3JhbSkKLSAgICAgICAgcmV0
dXJuIC0xOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1
cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0tPm9iamVjdCgpLCBuYW1l
LnV0ZjgoKS5kYXRhKCkpOwotfQotCi1HcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0Q29udGV4dEF0dHJpYnV0ZXMoKQotewotICAgIHJldHVybiBtX2F0
dHJzOwotfQotCi11bnNpZ25lZCBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRFcnJvcigpCi17
Ci0gICAgaWYgKG1fc3ludGhldGljRXJyb3JzLnNpemUoKSA+IDApIHsKLSAgICAgICAgTGlzdEhh
c2hTZXQ8dW5zaWduZWQgbG9uZz46Oml0ZXJhdG9yIGl0ZXIgPSBtX3N5bnRoZXRpY0Vycm9ycy5i
ZWdpbigpOwotICAgICAgICB1bnNpZ25lZCBsb25nIGVyciA9ICppdGVyOwotICAgICAgICBtX3N5
bnRoZXRpY0Vycm9ycy5yZW1vdmUoaXRlcik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQot
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsR2V0RXJy
b3IoKTsKLX0KLQotU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTdHJpbmcodW5zaWduZWQg
bG9uZyBuYW1lKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1
cm4gU3RyaW5nKChjb25zdCBjaGFyKikgOjpnbEdldFN0cmluZyhuYW1lKSk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmhpbnQodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxv
bmcgbW9kZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEhp
bnQodGFyZ2V0LCBtb2RlKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNCdWZmZXIo
V2ViR0xCdWZmZXIqIGJ1ZmZlcikKLXsKLSAgICBpZiAoIWJ1ZmZlcikKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1
cm4gOjpnbElzQnVmZmVyKChHTHVpbnQpIGJ1ZmZlci0+b2JqZWN0KCkpOwotfQotCi1ib29sIEdy
YXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQodW5zaWduZWQgbG9uZyBjYXApCi17Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNFbmFibGVkKGNhcCk7
Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRnJhbWVidWZmZXIoV2ViR0xGcmFtZWJ1
ZmZlciogZnJhbWVidWZmZXIpCi17Ci0gICAgaWYgKCFmcmFtZWJ1ZmZlcikKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBy
ZXR1cm4gOjpnbElzRnJhbWVidWZmZXJFWFQoKEdMdWludCkgZnJhbWVidWZmZXItPm9iamVjdCgp
KTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNQcm9ncmFtKFdlYkdMUHJvZ3JhbSog
cHJvZ3JhbSkKLXsKLSAgICBpZiAoIXByb2dyYW0pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc1By
b2dyYW0oKEdMdWludCkgcHJvZ3JhbS0+b2JqZWN0KCkpOwotfQotCi1ib29sIEdyYXBoaWNzQ29u
dGV4dDNEOjppc1JlbmRlcmJ1ZmZlcihXZWJHTFJlbmRlcmJ1ZmZlciogcmVuZGVyYnVmZmVyKQot
ewotICAgIGlmICghcmVuZGVyYnVmZmVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNSZW5kZXJi
dWZmZXJFWFQoKEdMdWludCkgcmVuZGVyYnVmZmVyLT5vYmplY3QoKSk7Ci19Ci0KLWJvb2wgR3Jh
cGhpY3NDb250ZXh0M0Q6OmlzU2hhZGVyKFdlYkdMU2hhZGVyKiBzaGFkZXIpCi17Ci0gICAgaWYg
KCFzaGFkZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc1NoYWRlcigoR0x1aW50KSBzaGFkZXIt
Pm9iamVjdCgpKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJlKFdlYkdM
VGV4dHVyZSogdGV4dHVyZSkKLXsKLSAgICBpZiAoIXRleHR1cmUpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJu
IDo6Z2xJc1RleHR1cmUoKEdMdWludCkgdGV4dHVyZS0+b2JqZWN0KCkpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpsaW5lV2lkdGgoZG91YmxlIHdpZHRoKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsTGluZVdpZHRoKHN0YXRpY19jYXN0PGZsb2F0
Pih3aWR0aCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpsaW5rUHJvZ3JhbShXZWJH
TFByb2dyYW0qIHByb2dyYW0pCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsTGlua1Byb2dyYW0oKEdMdWludCkgcHJvZ3Jh
bS0+b2JqZWN0KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwaXhlbFN0b3JlaSh1
bnNpZ25lZCBsb25nIHBuYW1lLCBsb25nIHBhcmFtKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFtKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChkb3VibGUgZmFjdG9yLCBkb3VibGUg
dW5pdHMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xQb2x5
Z29uT2Zmc2V0KHN0YXRpY19jYXN0PGZsb2F0PihmYWN0b3IpLCBzdGF0aWNfY2FzdDxmbG9hdD4o
dW5pdHMpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVhZFBpeGVscyhsb25nIHgs
IGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2ln
bmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUsIHZvaWQqIGRhdGEpCi17Ci0gICAg
Ly8gRklYTUU6IHJlbW92ZSB0aGUgdHdvIGdsRmx1c2ggY2FsbHMgd2hlbiB0aGUgZHJpdmVyIGJ1
ZyBpcyBmaXhlZCwgaS5lLiwKLSAgICAvLyBhbGwgcHJldmlvdXMgcmVuZGVyaW5nIGNhbGxzIHNo
b3VsZCBiZSBkb25lIGJlZm9yZSByZWFkaW5nIHBpeGVscy4KLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbEZsdXNoKCk7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFz
ICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsK
LSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwg
eSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJf
QklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsRmx1c2goKTsKLSAgICB9Ci0gICAgOjpn
bFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBkYXRhKTsKLSAg
ICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJP
KQotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9t
dWx0aXNhbXBsZUZCTyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlbGVhc2VTaGFk
ZXJDb21waWxlcigpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgbm90IGltcGxlbWVudGVkIG9u
IGRlc2t0b3AgT3BlbkdMLiBXZSBuZWVkIHRvIGhhdmUgaWZkZWZzIGZvciB0aGUgZGlmZmVyZW50
IEdMIHZhcmlhbnRzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIC8vOjpn
bFJlbGVhc2VTaGFkZXJDb21waWxlcigpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpy
ZW5kZXJidWZmZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGlu
dGVybmFsZm9ybWF0LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgc3dpdGNoIChpbnRlcm5h
bGZvcm1hdCkgewotICAgIGNhc2UgREVQVEhfU1RFTkNJTDoKLSAgICAgICAgaW50ZXJuYWxmb3Jt
YXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBE
RVBUSF9DT01QT05FTlQxNjoKLSAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSF9DT01Q
T05FTlQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkdCQTQ6Ci0gICAgY2FzZSBSR0I1X0Ex
OgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JHQkE7Ci0gICAgICAgIGJyZWFrOwotICAg
IGNhc2UgUkdCNTY1OgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JHQjsKLSAgICAgICAg
YnJlYWs7Ci0gICAgfQotICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlRVhUKHRhcmdldCwgaW50
ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpzYW1wbGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJvb2wgaW52ZXJ0KQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU2FtcGxlQ292ZXJhZ2Uoc3RhdGljX2Nh
c3Q8ZmxvYXQ+KHZhbHVlKSwgaW52ZXJ0KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
c2Npc3Nvcihsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9u
ZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xT
Y2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpzaGFkZXJTb3VyY2UoV2ViR0xTaGFkZXIqIHNoYWRlciwgY29uc3QgU3RyaW5nJiBzdHJpbmcp
Ci17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIGNvbnN0IENTdHJpbmcmIGNzID0gc3RyaW5nLnV0ZjgoKTsKLSAgICBjb25z
dCBjaGFyKiBzID0gY3MuZGF0YSgpOwotICAgIAotICAgIGludCBsZW5ndGggPSBzdHJpbmcubGVu
Z3RoKCk7Ci0gICAgOjpnbFNoYWRlclNvdXJjZSgoR0x1aW50KSBzaGFkZXItPm9iamVjdCgpLCAx
LCAmcywgJmxlbmd0aCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5j
KHVuc2lnbmVkIGxvbmcgZnVuYywgbG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxGdW5jKGZ1bmMs
IHJlZiwgbWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jU2Vw
YXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1
bnNpZ25lZCBsb25nIG1hc2spCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xTdGVuY2lsRnVuY1NlcGFyYXRlKGZhY2UsIGZ1bmMsIHJlZiwgbWFzayk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrKHVuc2lnbmVkIGxvbmcgbWFzaykK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxNYXNr
KG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFza1NlcGFyYXRl
KHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU3RlbmNpbE1hc2tTZXBhcmF0ZShmYWNlLCBt
YXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wKHVuc2lnbmVkIGxv
bmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwgdW5zaWduZWQgbG9uZyB6cGFzcykKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxPcChmYWlsLCB6
ZmFpbCwgenBhc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3BTZXBh
cmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQgbG9u
ZyB6ZmFpbCwgdW5zaWduZWQgbG9uZyB6cGFzcykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxPcFNlcGFyYXRlKGZhY2UsIGZhaWwsIHpmYWlsLCB6
cGFzcyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmYodW5zaWdu
ZWQgdGFyZ2V0LCB1bnNpZ25lZCBwbmFtZSwgZmxvYXQgdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgcG5hbWUs
IHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp0ZXhQYXJhbWV0ZXJpKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGludCB2YWx1
ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFRleFBhcmFt
ZXRlcmkodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0xZihs
b2NhdGlvbiwgdjApOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWZ2KGxv
bmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWZ2KGxvY2F0aW9uLCBzaXplLCBhcnJh
eSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZihsb25nIGxvY2F0aW9u
LCBmbG9hdCB2MCwgZmxvYXQgdjEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xVbmlmb3JtMmYobG9jYXRpb24sIHYwLCB2MSk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0yZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQg
c2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2Yg
MgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJmdihs
b2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlm
b3JtM2YobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zZihsb2NhdGlv
biwgdjAsIHYxLCB2Mik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZnYo
bG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTog
bGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTNmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYobG9uZyBsb2NhdGlvbiwgZmxv
YXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGYobG9jYXRpb24sIHYwLCB2MSwgdjIs
IHYzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmdihsb25nIGxvY2F0
aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVl
ZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xVbmlmb3JtNGZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaShsb25nIGxvY2F0aW9uLCBpbnQgdjApCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWkobG9jYXRp
b24sIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpdihsb25nIGxv
Y2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0xaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJpKGxvbmcgbG9jYXRpb24sIGludCB2
MCwgaW50IHYxKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
VW5pZm9ybTJpKGxvY2F0aW9uLCB2MCwgdjEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp1bmlmb3JtMml2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQotewotICAg
IC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAyCi0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMml2KGxvY2F0aW9uLCBzaXpl
LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaShsb25nIGxv
Y2F0aW9uLCBpbnQgdjAsIGludCB2MSwgaW50IHYyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTNpKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNpdihsb25nIGxvY2F0aW9uLCBpbnQq
IGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEg
bXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
VW5pZm9ybTNpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtNGkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2Miwg
aW50IHYzKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5p
Zm9ybTRpKGxvY2F0aW9uLCB2MCwgdjEsIHYyLCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnVuaWZvcm00aXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17
Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm00aXYobG9jYXRpb24s
IHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJp
eDJmdihsb25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6
ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybU1hdHJpeDJm
dihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgzZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2Us
IGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0
byBiZSBhIG11bHRpcGxlIG9mIDkKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4NGZ2KGxvbmcgbG9j
YXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8v
IEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNgotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwg
c2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVz
ZVByb2dyYW0oV2ViR0xQcm9ncmFtKiBwcm9ncmFtKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsK
LSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVzZVByb2dy
YW0oKEdMdWludCkgcHJvZ3JhbS0+b2JqZWN0KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp2YWxpZGF0ZVByb2dyYW0oV2ViR0xQcm9ncmFtKiBwcm9ncmFtKQotewotICAgIEFTU0VS
VChwcm9ncmFtKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbFZhbGlkYXRlUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmKHVuc2lnbmVkIGxvbmcgaW5keCwg
ZmxvYXQgdjApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xW
ZXJ0ZXhBdHRyaWIxZihpbmR4LCB2MCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZl
cnRleEF0dHJpYjFmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjFmdihpbmR4
LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjJmKHVu
c2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliMmYoaW5keCwgdjAsIHYxKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmZ2KHVuc2lnbmVkIGxv
bmcgaW5keCwgZmxvYXQqIGFycmF5KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsVmVydGV4QXR0cmliMmZ2KGluZHgsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2YodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2
MCwgZmxvYXQgdjEsIGZsb2F0IHYyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsVmVydGV4QXR0cmliM2YoaW5keCwgdjAsIHYxLCB2Mik7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmdih1bnNpZ25lZCBsb25nIGluZHgsIGZs
b2F0KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFZlcnRleEF0dHJpYjNmdihpbmR4LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnZlcnRleEF0dHJpYjRmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYx
LCBmbG9hdCB2MiwgZmxvYXQgdjMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZihpbmR4LCB2MCwgdjEsIHYyLCB2Myk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmdih1bnNpZ25lZCBsb25nIGluZHgs
IGZsb2F0KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbFZlcnRleEF0dHJpYjRmdihpbmR4LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnZlcnRleEF0dHJpYlBvaW50ZXIodW5zaWduZWQgbG9uZyBpbmR4LCBpbnQgc2l6ZSwg
aW50IHR5cGUsIGJvb2wgbm9ybWFsaXplZCwgdW5zaWduZWQgbG9uZyBzdHJpZGUsIHVuc2lnbmVk
IGxvbmcgb2Zmc2V0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsVmVydGV4QXR0cmliUG9pbnRlcihpbmR4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJp
ZGUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQp
KSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZpZXdwb3J0KGxvbmcgeCwgbG9uZyB5
LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZpZXdwb3J0KHN0YXRpY19jYXN0PEdM
aW50Pih4KSwgc3RhdGljX2Nhc3Q8R0xpbnQ+KHkpLCBzdGF0aWNfY2FzdDxHTHNpemVpPih3aWR0
aCksIHN0YXRpY19jYXN0PEdMc2l6ZWk+KGhlaWdodCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRCb29sZWFudih1bnNpZ25lZCBsb25nIHBuYW1lLCB1bnNpZ25lZCBjaGFyKiB2
YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldEJv
b2xlYW52KHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEJ1
ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1l
LCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGbG9hdHYodW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQq
IHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0
RmxvYXR2KHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEZy
YW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNp
Z25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGlmIChhdHRhY2htZW50ID09
IERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCkKLSAgICAgICAgYXR0YWNobWVudCA9IERFUFRIX0FU
VEFDSE1FTlQ7IC8vIE9yIFNURU5DSUxfQVRUQUNITUVOVCwgZWl0aGVyIHdvcmtzLgotICAgIDo6
Z2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVCh0YXJnZXQsIGF0dGFjaG1l
bnQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEludGVn
ZXJ2KHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCi17Ci0gICAgLy8gTmVlZCB0byBl
bXVsYXRlIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUL1RZUEUgZm9yIEdMLiAgQW55
IHZhbGlkCi0gICAgLy8gY29tYmluYXRpb24gc2hvdWxkIHdvcmssIGJ1dCBHTF9SR0IvR0xfVU5T
SUdORURfQllURSBtaWdodCBiZSB0aGUgbW9zdAotICAgIC8vIHVzZWZ1bCBmb3IgZGVza3RvcCBX
ZWJHTCB1c2Vycy4KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgc3dpdGNo
IChwbmFtZSkgewotICAgIGNhc2UgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6Ci0g
ICAgICAgICp2YWx1ZSA9IEdMX1JHQjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTVBMRU1F
TlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6Ci0gICAgICAgICp2YWx1ZSA9IEdMX1VOU0lHTkVEX0JZ
VEU7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2Vy
dihwbmFtZSwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
UHJvZ3JhbWl2KFdlYkdMUHJvZ3JhbSogcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50
KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdl
dFByb2dyYW1pdigoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSwgcG5hbWUsIHZhbHVlKTsKLX0K
LQotU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5mb0xvZyhXZWJHTFByb2dy
YW0qIHByb2dyYW0pCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTGludCBsZW5ndGg7Ci0gICAgOjpnbEdldFByb2dy
YW1pdigoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVu
Z3RoKTsKLSAgICAKLSAgICBHTHNpemVpIHNpemU7Ci0gICAgR0xjaGFyKiBpbmZvID0gKEdMY2hh
ciopIGZhc3RNYWxsb2MobGVuZ3RoKTsKLSAgICBpZiAoIWluZm8pCi0gICAgICAgIHJldHVybiAi
IjsKLQotICAgIDo6Z2xHZXRQcm9ncmFtSW5mb0xvZygoR0x1aW50KSBwcm9ncmFtLT5vYmplY3Qo
KSwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7Ci0gICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgZmFzdEZy
ZWUoaW5mbyk7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBs
b25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBwbmFtZSwg
dmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdihXZWJHTFNo
YWRlciogc2hhZGVyLCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIEFT
U0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLT5vYmplY3QoKSwgcG5hbWUsIHZhbHVl
KTsKLX0KLQotU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJJbmZvTG9nKFdlYkdM
U2hhZGVyKiBzaGFkZXIpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IGxlbmd0aDsKLSAgICA6OmdsR2V0U2hh
ZGVyaXYoKEdMdWludCkgc2hhZGVyLT5vYmplY3QoKSwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVu
Z3RoKTsKLSAgICAKLSAgICBHTHNpemVpIHNpemU7Ci0gICAgR0xjaGFyKiBpbmZvID0gKEdMY2hh
ciopIGZhc3RNYWxsb2MobGVuZ3RoKTsKLSAgICBpZiAoIWluZm8pCi0gICAgICAgIHJldHVybiAi
IjsKLSAgICAgICAgCi0gICAgOjpnbEdldFNoYWRlckluZm9Mb2coKEdMdWludCkgc2hhZGVyLT5v
YmplY3QoKSwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7Ci0gICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAg
ZmFzdEZyZWUoaW5mbyk7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLVN0cmluZyBHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0U2hhZGVyU291cmNlKFdlYkdMU2hhZGVyKiBzaGFkZXIpCi17Ci0gICAgQVNTRVJU
KHNoYWRlcik7Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0xpbnQg
bGVuZ3RoOwotICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXItPm9iamVjdCgpLCBH
TF9TSEFERVJfU09VUkNFX0xFTkdUSCwgJmxlbmd0aCk7Ci0gICAgCi0gICAgR0xzaXplaSBzaXpl
OwotICAgIEdMY2hhciogaW5mbyA9IChHTGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7Ci0gICAg
aWYgKCFpbmZvKQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIAotICAgIDo6Z2xHZXRTaGFk
ZXJTb3VyY2UoKEdMdWludCkgc2hhZGVyLT5vYmplY3QoKSwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7
Ci0gICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgZmFzdEZyZWUoaW5mbyk7Ci0gICAgcmV0dXJuIHM7
Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVyZnYodW5zaWdu
ZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFRleFBhcmFtZXRlcmZ2
KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
VGV4UGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUs
IGludCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xHZXRUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1mdihXZWJHTFByb2dyYW0qIHByb2dyYW0sIGxvbmcg
bG9jYXRpb24sIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEdldFVuaWZvcm1mdigoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSwgbG9j
YXRpb24sIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWl2
KFdlYkdMUHJvZ3JhbSogcHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgaW50KiB2YWx1ZSkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFVuaWZvcm1pdigoR0x1
aW50KSBwcm9ncmFtLT5vYmplY3QoKSwgbG9jYXRpb24sIHZhbHVlKTsKLX0KLQotbG9uZyBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybUxvY2F0aW9uKFdlYkdMUHJvZ3JhbSogcHJvZ3JhbSwg
Y29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICAKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xHZXRVbmlmb3JtTG9j
YXRpb24oKEdMdWludCkgcHJvZ3JhbS0+b2JqZWN0KCksIG5hbWUudXRmOCgpLmRhdGEoKSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYmZ2KHVuc2lnbmVkIGxv
bmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFZlcnRleEF0dHJpYmZ2KGluZGV4
LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhB
dHRyaWJpdih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZh
bHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VmVy
dGV4QXR0cmliaXYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLWxvbmcgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFZlcnRleEF0dHJpYk9mZnNldCh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25l
ZCBsb25nIHBuYW1lKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAK
LSAgICB2b2lkKiBwb2ludGVyOwotICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydihpbmRl
eCwgcG5hbWUsICZwb2ludGVyKTsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxsb25nPihw
b2ludGVyKTsKLX0KLQotaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhJbWFnZTJEKHVuc2lnbmVk
IHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIGludGVybmFsZm9ybWF0LCB1bnNpZ25l
ZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBib3JkZXIsIHVuc2lnbmVkIGZvcm1h
dCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLQotICAgIDo6Z2xUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFs
Zm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSAg
ICByZXR1cm4gMDsKLX0KLQotaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhTdWJJbWFnZTJEKHVu
c2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIHhvZmYsIHVuc2lnbmVkIHlv
ZmYsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGZvcm1hdCwgdW5z
aWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLQotICAgIC8vIEZJWE1FOiB3ZSB3aWxsIG5lZWQgdG8gZGVhbCB3aXRoIFBpeGVsU3Rv
cmUgcGFyYW1zIHdoZW4gZGVhbGluZyB3aXRoIGltYWdlIGJ1ZmZlcnMgdGhhdCBkaWZmZXIgZnJv
bSB0aGUgc3ViaW1hZ2Ugc2l6ZQotICAgIDo6Z2xUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWws
IHhvZmYsIHlvZmYsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSAgICBy
ZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUJ1ZmZlcigp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWludCBvOwotICAg
IGdsR2VuQnVmZmVycygxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXVuc2lnbmVkIEdyYXBo
aWNzQ29udGV4dDNEOjpjcmVhdGVGcmFtZWJ1ZmZlcigpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIEdMdWludCBvOwotICAgIGdsR2VuRnJhbWVidWZmZXJzRVhUKDEs
ICZvKTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNy
ZWF0ZVByb2dyYW0oKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBy
ZXR1cm4gZ2xDcmVhdGVQcm9ncmFtKCk7Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNE
OjpjcmVhdGVSZW5kZXJidWZmZXIoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm8pOwotICAg
IHJldHVybiBvOwotfQotCi11bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlU2hhZGVy
KHVuc2lnbmVkIGxvbmcgdHlwZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgcmV0dXJuIGdsQ3JlYXRlU2hhZGVyKCh0eXBlID09IEZSQUdNRU5UX1NIQURFUikgPyBH
TF9GUkFHTUVOVF9TSEFERVIgOiBHTF9WRVJURVhfU0hBREVSKTsKLX0KLQotdW5zaWduZWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVRleHR1cmUoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlblRleHR1cmVzKDEsICZvKTsKLSAg
ICByZXR1cm4gbzsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlQnVmZmVyKHVu
c2lnbmVkIGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
Z2xEZWxldGVCdWZmZXJzKDEsICZidWZmZXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVGcmFtZWJ1ZmZlcih1bnNpZ25lZCBmcmFtZWJ1ZmZlcikKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJmZy
YW1lYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUHJvZ3JhbSh1
bnNpZ25lZCBwcm9ncmFtKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRlbGV0ZVJlbmRlcmJ1ZmZlcih1bnNpZ25lZCByZW5kZXJidWZmZXIpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAm
cmVuZGVyYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlU2hhZGVy
KHVuc2lnbmVkIHNoYWRlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
ZGVsZXRlVGV4dHVyZSh1bnNpZ25lZCB0ZXh0dXJlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKLX0KLQotaW50
IEdyYXBoaWNzQ29udGV4dDNEOjpzaXplSW5CeXRlcyhpbnQgdHlwZSkKLXsKLSAgICBzd2l0Y2gg
KHR5cGUpIHsKLSAgICAgICAgY2FzZSBHTF9CWVRFOgotICAgICAgICAgICAgcmV0dXJuIHNpemVv
ZihHTGJ5dGUpOwotICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6Ci0gICAgICAgICAgICBy
ZXR1cm4gc2l6ZW9mKEdMdWJ5dGUpOwotICAgICAgICBjYXNlIEdMX1NIT1JUOgotICAgICAgICAg
ICAgcmV0dXJuIHNpemVvZihHTHNob3J0KTsKLSAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9S
VDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1c2hvcnQpOwotICAgICAgICBjYXNlIEdM
X0lOVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0xpbnQpOwotICAgICAgICBjYXNlIEdM
X1VOU0lHTkVEX0lOVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1aW50KTsKLSAgICAg
ICAgY2FzZSBHTF9GTE9BVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0xmbG9hdCk7Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnN5bnRoZXNpemVHTEVycm9yKHVuc2lnbmVkIGxvbmcgZXJyb3Ip
Ci17Ci0gICAgbV9zeW50aGV0aWNFcnJvcnMuYWRkKGVycm9yKTsKLX0KLQotfQotCi0jZW5kaWYg
Ly8gRU5BQkxFKDNEX0NBTlZBUykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFj
L0dyYXBoaWNzQ29udGV4dDNETWFjLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1tCShyZXZpc2lvbiA2MTIyMSkJKGZy
b20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3Bw
OjYxMjIxKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0
M0RNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDcxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKDNEX0NBTlZBUykKKworI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dDNELmgiCisKKyNpbmNsdWRlICJDYW52YXNPYmplY3QuaCIKKyNpbmNsdWRl
ICJJbWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAi
V2ViR0xBY3RpdmVJbmZvLmgiCisjaW5jbHVkZSAiQXJyYXlCdWZmZXJWaWV3LmgiCisjaW5jbHVk
ZSAiV2ViR0xCdWZmZXIuaCIKKyNpbmNsdWRlICJGbG9hdDMyQXJyYXkuaCIKKyNpbmNsdWRlICJX
ZWJHTEZyYW1lYnVmZmVyLmgiCisjaW5jbHVkZSAiSW50MzJBcnJheS5oIgorI2luY2x1ZGUgIldl
YkdMUHJvZ3JhbS5oIgorI2luY2x1ZGUgIldlYkdMUmVuZGVyYnVmZmVyLmgiCisjaW5jbHVkZSAi
V2ViR0xTaGFkZXIuaCIKKyNpbmNsdWRlICJXZWJHTFRleHR1cmUuaCIKKyNpbmNsdWRlICJVaW50
OEFycmF5LmgiCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgorI2lu
Y2x1ZGUgPE9wZW5HTC9DR0xSZW5kZXJlcnMuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNp
bmNsdWRlIDx3dGYvVW51c2VkUGFyYW0uaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgc2V0UGl4ZWxGb3JtYXQoVmVj
dG9yPENHTFBpeGVsRm9ybWF0QXR0cmlidXRlPiYgYXR0cmlicywgaW50IGNvbG9yQml0cywgaW50
IGRlcHRoQml0cywgYm9vbCBhY2NlbGVyYXRlZCwgYm9vbCBzdXBlcnNhbXBsZSwgYm9vbCBjbG9z
ZXN0KQoreworICAgIGF0dHJpYnMuY2xlYXIoKTsKKyAgICAKKyAgICBhdHRyaWJzLmFwcGVuZChr
Q0dMUEZBQ29sb3JTaXplKTsKKyAgICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxDR0xQaXhl
bEZvcm1hdEF0dHJpYnV0ZT4oY29sb3JCaXRzKSk7CisgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBG
QURlcHRoU2l6ZSk7CisgICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3Jt
YXRBdHRyaWJ1dGU+KGRlcHRoQml0cykpOworICAgIAorICAgIGlmIChhY2NlbGVyYXRlZCkKKyAg
ICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQUFjY2VsZXJhdGVkKTsKKyAgICBlbHNlIHsKKyAg
ICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQVJlbmRlcmVySUQpOworICAgICAgICBhdHRyaWJz
LmFwcGVuZChzdGF0aWNfY2FzdDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oa0NHTFJlbmRlcmVy
R2VuZXJpY0Zsb2F0SUQpKTsKKyAgICB9CisgICAgICAgIAorICAgIGlmIChzdXBlcnNhbXBsZSkK
KyAgICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQVN1cGVyc2FtcGxlKTsKKyAgICAgICAgCisg
ICAgaWYgKGNsb3Nlc3QpCisgICAgICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFDbG9zZXN0UG9s
aWN5KTsKKyAgICAgICAgCisgICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxG
b3JtYXRBdHRyaWJ1dGU+KDApKTsKK30KKworUGFzc093blB0cjxHcmFwaGljc0NvbnRleHQzRD4g
R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBh
dHRycywgSG9zdFdpbmRvdyogaG9zdFdpbmRvdykKK3sKKyAgICBPd25QdHI8R3JhcGhpY3NDb250
ZXh0M0Q+IGNvbnRleHQobmV3IEdyYXBoaWNzQ29udGV4dDNEKGF0dHJzLCBob3N0V2luZG93KSk7
CisgICAgcmV0dXJuIGNvbnRleHQtPm1fY29udGV4dE9iaiA/IGNvbnRleHQucmVsZWFzZSgpIDog
MDsKK30KKworR3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdyYXBoaWNzQ29u
dGV4dDNEOjpBdHRyaWJ1dGVzIGF0dHJzLCBIb3N0V2luZG93KiBob3N0V2luZG93KQorICAgIDog
bV9jdXJyZW50V2lkdGgoMCkKKyAgICAsIG1fY3VycmVudEhlaWdodCgwKQorICAgICwgbV9hdHRy
cyhhdHRycykKKyAgICAsIG1fY29udGV4dE9iaigwKQorICAgICwgbV90ZXh0dXJlKDApCisgICAg
LCBtX2ZibygwKQorICAgICwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIoMCkKKyAgICAsIG1fYm91bmRG
Qk8oMCkKKyAgICAsIG1fbXVsdGlzYW1wbGVGQk8oMCkKKyAgICAsIG1fbXVsdGlzYW1wbGVEZXB0
aFN0ZW5jaWxCdWZmZXIoMCkKKyAgICAsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcigwKQorewor
ICAgIFVOVVNFRF9QQVJBTShob3N0V2luZG93KTsKKworICAgIFZlY3RvcjxDR0xQaXhlbEZvcm1h
dEF0dHJpYnV0ZT4gYXR0cmliczsKKyAgICBDR0xQaXhlbEZvcm1hdE9iaiBwaXhlbEZvcm1hdE9i
aiA9IDA7CisgICAgR0xpbnQgbnVtUGl4ZWxGb3JtYXRzID0gMDsKKyAgICAKKyAgICAvLyBXZSB3
aWxsIHRyeToKKyAgICAvLworICAgIC8vICAxKSAzMiBiaXQgUkdCQS8zMiBiaXQgZGVwdGgvYWNj
ZWxlcmF0ZWQvc3VwZXJzYW1wbGVkCisgICAgLy8gIDIpIDMyIGJpdCBSR0JBLzMyIGJpdCBkZXB0
aC9hY2NlbGVyYXRlZAorICAgIC8vICAzKSAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvYWNjZWxl
cmF0ZWQKKyAgICAvLyAgNCkgY2xvc2VzdCB0byAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvc29m
dHdhcmUgcmVuZGVyZXIKKyAgICAvLworICAgIC8vICBJZiBub25lIG9mIHRoYXQgd29ya3MsIHdl
IHNpbXBseSBmYWlsIGFuZCBzZXQgbV9jb250ZXh0T2JqIHRvIDAuCisgICAgCisgICAgc2V0UGl4
ZWxGb3JtYXQoYXR0cmlicywgMzIsIDMyLCB0cnVlLCB0cnVlLCBmYWxzZSk7CisgICAgQ0dMQ2hv
b3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVs
Rm9ybWF0cyk7CisgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7CisgICAgICAgIHNldFBp
eGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAzMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAg
Q0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51
bVBpeGVsRm9ybWF0cyk7CisgICAgICAgIAorICAgICAgICBpZiAobnVtUGl4ZWxGb3JtYXRzID09
IDApIHsKKyAgICAgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgdHJ1ZSwg
ZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMu
ZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOworICAgICAgICAKKyAg
ICAgICAgICAgIGlmIChudW1QaXhlbEZvcm1hdHMgPT0gMCkgeworICAgICAgICAgICAgICAgIHNl
dFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAg
ICAgICAgICAgICBDR0xDaG9vc2VQaXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwgJnBpeGVsRm9y
bWF0T2JqLCAmbnVtUGl4ZWxGb3JtYXRzKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYg
KG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIG5v
dCBmaW5kIGFuIGFjY2VwdGFibGUgcmVuZGVyZXIgLSBmYWlsCisgICAgICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgQ0dMRXJyb3IgZXJyID0gQ0dMQ3JlYXRlQ29udGV4dChwaXhlbEZvcm1h
dE9iaiwgMCwgJm1fY29udGV4dE9iaik7CisgICAgQ0dMRGVzdHJveVBpeGVsRm9ybWF0KHBpeGVs
Rm9ybWF0T2JqKTsKKyAgICAKKyAgICBpZiAoZXJyICE9IGtDR0xOb0Vycm9yIHx8ICFtX2NvbnRl
eHRPYmopIHsKKyAgICAgICAgLy8gQ291bGQgbm90IGNyZWF0ZSB0aGUgY29udGV4dCAtIGZhaWwK
KyAgICAgICAgbV9jb250ZXh0T2JqID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFNldCB0aGUgY3VycmVudCBjb250ZXh0IHRvIHRoZSBvbmUgZ2l2ZW4gdG8gdXMuCisgICAg
Q0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICAKKyAgICB2YWxpZGF0ZUF0
dHJpYnV0ZXMoKTsKKworICAgIC8vIGNyZWF0ZSBhIHRleHR1cmUgdG8gcmVuZGVyIGludG8KKyAg
ICA6OmdsR2VuVGV4dHVyZXMoMSwgJm1fdGV4dHVyZSk7CisgICAgOjpnbEJpbmRUZXh0dXJlKEdM
X1RFWFRVUkVfMkQsIG1fdGV4dHVyZSk7CisgICAgOjpnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVS
RV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIDo6Z2xUZXhQYXJh
bWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsK
KyAgICA6OmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywg
R0xfQ0xBTVApOworICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRV
UkVfV1JBUF9ULCBHTF9DTEFNUCk7CisgICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQs
IDApOworICAgIAorICAgIC8vIGNyZWF0ZSBhbiBGQk8KKyAgICA6OmdsR2VuRnJhbWVidWZmZXJz
RVhUKDEsICZtX2Zibyk7CisgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZF
Ul9FWFQsIG1fZmJvKTsKKyAgICAKKyAgICBtX2JvdW5kRkJPID0gbV9mYm87CisgICAgaWYgKCFt
X2F0dHJzLmFudGlhbGlhcyAmJiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpKQor
ICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9kZXB0aFN0ZW5jaWxCdWZmZXIp
OworCisgICAgLy8gY3JlYXRlIGFuIG11bHRpc2FtcGxlIEZCTworICAgIGlmIChtX2F0dHJzLmFu
dGlhbGlhcykgeworICAgICAgICA6OmdsR2VuRnJhbWVidWZmZXJzRVhUKDEsICZtX211bHRpc2Ft
cGxlRkJPKTsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICBtX2JvdW5kRkJPID0gbV9tdWx0aXNhbXBs
ZUZCTzsKKyAgICAgICAgOjpnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVD
b2xvckJ1ZmZlcik7CisgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0
aCkKKyAgICAgICAgICAgIDo6Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxl
RGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICB9CisgICAgCisgICAgOjpnbEVuYWJsZShHTF9WRVJU
RVhfUFJPR1JBTV9QT0lOVF9TSVpFKTsKKyAgICA6OmdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsK
K30KKworR3JhcGhpY3NDb250ZXh0M0Q6On5HcmFwaGljc0NvbnRleHQzRCgpCit7CisgICAgaWYg
KG1fY29udGV4dE9iaikgeworICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRP
YmopOworICAgICAgICA6OmdsRGVsZXRlVGV4dHVyZXMoMSwgJm1fdGV4dHVyZSk7CisgICAgICAg
IGlmIChtX2F0dHJzLmFudGlhbGlhcykgeworICAgICAgICAgICAgOjpnbERlbGV0ZVJlbmRlcmJ1
ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7CisgICAgICAgICAgICBpZiAo
bV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpCisgICAgICAgICAgICAgICAgOjpnbERl
bGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIp
OworICAgICAgICAgICAgOjpnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBs
ZUZCTyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2ls
IHx8IG1fYXR0cnMuZGVwdGgpCisgICAgICAgICAgICAgICAgOjpnbERlbGV0ZVJlbmRlcmJ1ZmZl
cnNFWFQoMSwgJm1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICA6Omds
RGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZtX2Zibyk7CisgICAgICAgIENHTFNldEN1cnJlbnRD
b250ZXh0KDApOworICAgICAgICBDR0xEZXN0cm95Q29udGV4dChtX2NvbnRleHRPYmopOworICAg
IH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVBdHRyaWJ1dGVzKCkKK3sK
KyAgICBjb25zdCBjaGFyKiBleHRlbnNpb25zID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFy
Kj4oOjpnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSk7CisgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCkgeworICAgICAgICBpZiAoc3RkOjpzdHJzdHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9wYWNrZWRf
ZGVwdGhfc3RlbmNpbCIpKSB7CisgICAgICAgICAgICBpZiAoIW1fYXR0cnMuZGVwdGgpCisgICAg
ICAgICAgICAgICAgbV9hdHRycy5kZXB0aCA9IHRydWU7CisgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgbV9hdHRycy5zdGVuY2lsID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtX2F0dHJzLmFu
dGlhbGlhcykgeworICAgICAgICBib29sIGlzVmFsaWRWZW5kb3IgPSB0cnVlOworICAgICAgICAv
LyBDdXJyZW50bHkgaW4gTWFjIHdlIG9ubHkgdHVybiBvbiBhbnRpYWxpYXMgaWYgdmVuZG9yIGlz
IE5WSURJQS4KKyAgICAgICAgY29uc3QgY2hhciogdmVuZG9yID0gcmVpbnRlcnByZXRfY2FzdDxj
b25zdCBjaGFyKj4oOjpnbEdldFN0cmluZyhHTF9WRU5ET1IpKTsKKyAgICAgICAgaWYgKCFzdGQ6
OnN0cnN0cih2ZW5kb3IsICJOVklESUEiKSkKKyAgICAgICAgICAgIGlzVmFsaWRWZW5kb3IgPSBm
YWxzZTsKKyAgICAgICAgaWYgKCFpc1ZhbGlkVmVuZG9yIHx8ICFzdGQ6OnN0cnN0cihleHRlbnNp
b25zLCAiR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlIikpCisgICAgICAgICAgICBtX2F0
dHJzLmFudGlhbGlhcyA9IGZhbHNlOworICAgIH0KKyAgICAvLyBGSVhNRTogaW5zdGVhZCBvZiBl
bmZvcmNpbmcgcHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZSwgaW1wbGVtZW50IHRoZQorICAgIC8v
IGNvcnJlY3QgYmVoYXZpb3Igd2hlbiBwcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZSBpcyByZXF1
ZXN0ZWQuCisgICAgbV9hdHRycy5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjptYWtlQ29udGV4dEN1cnJlbnQoKQoreworICAgIENHTFNldEN1
cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmJlZ2luUGFpbnQoV2ViR0xSZW5kZXJpbmdDb250ZXh0KiBjb250ZXh0KQoreworICAgIFVOVVNF
RF9QQVJBTShjb250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZW5kUGFpbnQo
KQoreworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0dMRVMyQ29tcGxpYW50KCkgY29u
c3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJl
c2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGlmICh3aWR0aCA9PSBtX2N1cnJl
bnRXaWR0aCAmJiBoZWlnaHQgPT0gbV9jdXJyZW50SGVpZ2h0IHx8ICFtX2NvbnRleHRPYmopCisg
ICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtX2N1cnJlbnRXaWR0aCA9IHdpZHRoOworICAgIG1f
Y3VycmVudEhlaWdodCA9IGhlaWdodDsKKyAgICAKKyAgICBDR0xTZXRDdXJyZW50Q29udGV4dCht
X2NvbnRleHRPYmopOworICAgIAorICAgIEdMdWludCBpbnRlcm5hbENvbG9yRm9ybWF0LCBjb2xv
ckZvcm1hdCwgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSAwOworICAgIGlmIChtX2F0dHJz
LmFscGhhKSB7CisgICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBHTF9SR0JBODsKKyAgICAg
ICAgY29sb3JGb3JtYXQgPSBHTF9SR0JBOworICAgIH0gZWxzZSB7CisgICAgICAgIGludGVybmFs
Q29sb3JGb3JtYXQgPSBHTF9SR0I4OworICAgICAgICBjb2xvckZvcm1hdCA9IEdMX1JHQjsKKyAg
ICB9CisgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKSB7CisgICAgICAg
IC8vIFdlIGRvbid0IGFsbG93IHRoZSBsb2dpYyB3aGVyZSBzdGVuY2lsIGlzIHJlcXVpcmVkIGFu
ZCBkZXB0aCBpcyBub3QuCisgICAgICAgIC8vIFNlZSBHcmFwaGljc0NvbnRleHQzRCBjb25zdHJ1
Y3Rvci4KKyAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCAmJiBtX2F0dHJzLmRlcHRoKQorICAg
ICAgICAgICAgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4
X0VYVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3Jt
YXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7CisgICAgfQorCisgICAgYm9vbCBtdXN0UmVzdG9yZUZC
TyA9IGZhbHNlOworCisgICAgLy8gcmVzaXplIG11bHRpc2FtcGxlIEZCTworICAgIGlmIChtX2F0
dHJzLmFudGlhbGlhcykgeworICAgICAgICBHTGludCBtYXhTYW1wbGVDb3VudDsKKyAgICAgICAg
OjpnbEdldEludGVnZXJ2KEdMX01BWF9TQU1QTEVTX0VYVCwgJm1heFNhbXBsZUNvdW50KTsKKyAg
ICAgICAgR0xpbnQgc2FtcGxlQ291bnQgPSBzdGQ6Om1pbig4LCBtYXhTYW1wbGVDb3VudCk7Cisg
ICAgICAgIGlmIChzYW1wbGVDb3VudCA+IG1heFNhbXBsZUNvdW50KQorICAgICAgICAgICAgc2Ft
cGxlQ291bnQgPSBtYXhTYW1wbGVDb3VudDsKKyAgICAgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9t
dWx0aXNhbXBsZUZCTykgeworICAgICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9G
UkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICAgICAgbXVzdFJlc3Rv
cmVGQk8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhU
KEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7CisgICAgICAg
IDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoR0xfUkVOREVSQlVGRkVSX0VY
VCwgc2FtcGxlQ291bnQsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICAg
ICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBH
TF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1w
bGVDb2xvckJ1ZmZlcik7CisgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5k
ZXB0aCkgeworICAgICAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAgICAgICA6
OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQs
IHNhbXBsZUNvdW50LCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7
CisgICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsKQorICAgICAgICAgICAgICAgIDo6Z2xG
cmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX1NURU5DSUxf
QVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0
ZW5jaWxCdWZmZXIpOworICAgICAgICAgICAgaWYgKG1fYXR0cnMuZGVwdGgpCisgICAgICAgICAg
ICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwg
R0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1w
bGVEZXB0aFN0ZW5jaWxCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIDo6Z2xCaW5kUmVuZGVy
YnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIDApOworICAgICAgICBpZiAoZ2xDaGVja0Zy
YW1lYnVmZmVyU3RhdHVzRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCkgIT0gR0xfRlJBTUVCVUZGRVJf
Q09NUExFVEVfRVhUKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogY2xlYW51cC4KKyAgICAgICAg
ICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZXNpemUg
cmVndWxhciBGQk8KKyAgICBpZiAobV9ib3VuZEZCTyAhPSBtX2ZibykgeworICAgICAgICBtdXN0
UmVzdG9yZUZCTyA9IHRydWU7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgfQorICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhU
VVJFXzJELCBtX3RleHR1cmUpOworICAgIDo6Z2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAs
IGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGNvbG9yRm9ybWF0LCBHTF9V
TlNJR05FRF9CWVRFLCAwKTsKKyAgICA6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdMX1RFWFRVUkVfMkQsIG1f
dGV4dHVyZSwgMCk7CisgICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAg
IGlmICghbV9hdHRycy5hbnRpYWxpYXMgJiYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRl
cHRoKSkgeworICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJf
RVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9y
YWdlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0LCB3
aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkKKyAgICAgICAgICAg
IDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX1NU
RU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2ls
QnVmZmVyKTsKKyAgICAgICAgaWYgKG1fYXR0cnMuZGVwdGgpCisgICAgICAgICAgICA6OmdsRnJh
bWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9ERVBUSF9BVFRB
Q0hNRU5UX0VYVCwgR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwor
ICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCAwKTsK
KyAgICB9CisgICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVChHTF9GUkFNRUJVRkZF
Ul9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgeworICAgICAgICAvLyBGSVhN
RTogY2xlYW51cAorICAgICAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIH0KKworICAgIGlmICht
X2F0dHJzLmFudGlhbGlhcykgeworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIGlmIChtX2JvdW5kRkJP
ID09IG1fbXVsdGlzYW1wbGVGQk8pCisgICAgICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IGZhbHNl
OworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgcmVuZGVyYnVmZmVycyB0byAwLgorICAgIEdM
Ym9vbGVhbiBjb2xvck1hc2tbXSA9IHtHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVF
fSwgZGVwdGhNYXNrID0gR0xfVFJVRSwgc3RlbmNpbE1hc2sgPSBHTF9UUlVFOworICAgIEdMYm9v
bGVhbiBpc1NjaXNzb3JFbmFibGVkID0gR0xfRkFMU0U7CisgICAgR0xib29sZWFuIGlzRGl0aGVy
RW5hYmxlZCA9IEdMX0ZBTFNFOworICAgIEdMYml0ZmllbGQgY2xlYXJNYXNrID0gR0xfQ09MT1Jf
QlVGRkVSX0JJVDsKKyAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfQ09MT1JfV1JJVEVNQVNLLCBjb2xv
ck1hc2spOworICAgIDo6Z2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xf
VFJVRSk7CisgICAgaWYgKG1fYXR0cnMuZGVwdGgpIHsKKyAgICAgICAgOjpnbEdldEJvb2xlYW52
KEdMX0RFUFRIX1dSSVRFTUFTSywgJmRlcHRoTWFzayk7CisgICAgICAgIDo6Z2xEZXB0aE1hc2so
R0xfVFJVRSk7CisgICAgICAgIGNsZWFyTWFzayB8PSBHTF9ERVBUSF9CVUZGRVJfQklUOworICAg
IH0KKyAgICBpZiAobV9hdHRycy5zdGVuY2lsKSB7CisgICAgICAgIDo6Z2xHZXRCb29sZWFudihH
TF9TVEVOQ0lMX1dSSVRFTUFTSywgJnN0ZW5jaWxNYXNrKTsKKyAgICAgICAgOjpnbFN0ZW5jaWxN
YXNrKEdMX1RSVUUpOworICAgICAgICBjbGVhck1hc2sgfD0gR0xfU1RFTkNJTF9CVUZGRVJfQklU
OworICAgIH0KKyAgICBpc1NjaXNzb3JFbmFibGVkID0gOjpnbElzRW5hYmxlZChHTF9TQ0lTU09S
X1RFU1QpOworICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgaXNEaXRoZXJF
bmFibGVkID0gOjpnbElzRW5hYmxlZChHTF9ESVRIRVIpOworICAgIDo6Z2xEaXNhYmxlKEdMX0RJ
VEhFUik7CisKKyAgICA6OmdsQ2xlYXIoY2xlYXJNYXNrKTsKKworICAgIDo6Z2xDb2xvck1hc2so
Y29sb3JNYXNrWzBdLCBjb2xvck1hc2tbMV0sIGNvbG9yTWFza1syXSwgY29sb3JNYXNrWzNdKTsK
KyAgICBpZiAobV9hdHRycy5kZXB0aCkKKyAgICAgICAgOjpnbERlcHRoTWFzayhkZXB0aE1hc2sp
OworICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCisgICAgICAgIDo6Z2xTdGVuY2lsTWFzayhzdGVu
Y2lsTWFzayk7CisgICAgaWYgKGlzU2Npc3NvckVuYWJsZWQpCisgICAgICAgIDo6Z2xFbmFibGUo
R0xfU0NJU1NPUl9URVNUKTsKKyAgICBlbHNlCisgICAgICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNT
T1JfVEVTVCk7CisgICAgaWYgKGlzRGl0aGVyRW5hYmxlZCkKKyAgICAgICAgOjpnbEVuYWJsZShH
TF9ESVRIRVIpOworICAgIGVsc2UKKyAgICAgICAgOjpnbERpc2FibGUoR0xfRElUSEVSKTsKKwor
ICAgIGlmIChtdXN0UmVzdG9yZUZCTykKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91bmRGQk8pOworCisgICAgOjpnbEZsdXNoKCk7Cit9CisK
K3N0YXRpYyBpbmxpbmUgdm9pZCBlbnN1cmVDb250ZXh0KENHTENvbnRleHRPYmogY29udGV4dCkK
K3sKKyAgICBpZiAoIWNvbnRleHQpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgQ0dM
Q29udGV4dE9iaiBjdXJyZW50Q29udGV4dCA9IENHTEdldEN1cnJlbnRDb250ZXh0KCk7CisgICAg
aWYgKGN1cnJlbnRDb250ZXh0ICE9IGNvbnRleHQpCisgICAgICAgIENHTFNldEN1cnJlbnRDb250
ZXh0KGNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVy
ZSgpCit7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAgICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFE
X0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpn
bEJsaXRGcmFtZWJ1ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0
LCAwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJf
QklULCBHTF9MSU5FQVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7CisgICAgfQorICAgIDo6Z2xGaW5pc2goKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YWN0aXZlVGV4dHVyZSh1bnNpZ25lZCBsb25nIHRleHR1
cmUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xBY3RpdmVU
ZXh0dXJlKHRleHR1cmUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphdHRhY2hTaGFk
ZXIoV2ViR0xQcm9ncmFtKiBwcm9ncmFtLCBXZWJHTFNoYWRlciogc2hhZGVyKQoreworICAgIEFT
U0VSVChwcm9ncmFtKTsKKyAgICBBU1NFUlQoc2hhZGVyKTsKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbEF0dGFjaFNoYWRlcigoR0x1aW50KSBwcm9ncmFtLT5vYmpl
Y3QoKSwgKEdMdWludCkgc2hhZGVyLT5vYmplY3QoKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmJpbmRBdHRyaWJMb2NhdGlvbihXZWJHTFByb2dyYW0qIHByb2dyYW0sIHVuc2lnbmVk
IGxvbmcgaW5kZXgsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5kQXR0cmliTG9j
YXRpb24oKEdMdWludCkgcHJvZ3JhbS0+b2JqZWN0KCksIGluZGV4LCBuYW1lLnV0ZjgoKS5kYXRh
KCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQnVmZmVyKHVuc2lnbmVkIGxv
bmcgdGFyZ2V0LCBXZWJHTEJ1ZmZlciogYnVmZmVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsQmluZEJ1ZmZlcih0YXJnZXQsIGJ1ZmZlciA/IChHTHVpbnQp
IGJ1ZmZlci0+b2JqZWN0KCkgOiAwKTsKK30KKworCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpi
aW5kRnJhbWVidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFdlYkdMRnJhbWVidWZmZXIqIGJ1
ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0x1aW50IGZi
bzsKKyAgICBpZiAoYnVmZmVyICYmIGJ1ZmZlci0+b2JqZWN0KCkpCisgICAgICAgIGZibyA9IChH
THVpbnQpYnVmZmVyLT5vYmplY3QoKTsKKyAgICBlbHNlCisgICAgICAgIGZibyA9IChtX2F0dHJz
LmFudGlhbGlhcyA/IG1fbXVsdGlzYW1wbGVGQk8gOiBtX2Zibyk7CisgICAgaWYgKGZibyAhPSBt
X2JvdW5kRkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQodGFyZ2V0LCBmYm8p
OworICAgICAgICBtX2JvdW5kRkJPID0gZmJvOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6YmluZFJlbmRlcmJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgV2ViR0xSZW5k
ZXJidWZmZXIqIHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCByZW5kZXJidWZmZXIgPyAo
R0x1aW50KSByZW5kZXJidWZmZXItPm9iamVjdCgpIDogMCk7Cit9CisKKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6YmluZFRleHR1cmUodW5zaWduZWQgbG9uZyB0YXJnZXQsIFdlYkdMVGV4dHVy
ZSogdGV4dHVyZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bEJpbmRUZXh0dXJlKHRhcmdldCwgdGV4dHVyZSA/IChHTHVpbnQpIHRleHR1cmUtPm9iamVjdCgp
IDogMCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IoZG91YmxlIHJl
ZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQoreworICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQmxlbmRDb2xvcihzdGF0aWNfY2FzdDxm
bG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdyZWVuKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+
KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYWxwaGEpKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5zaWduZWQgbG9uZyBtb2RlICkKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kRXF1YXRpb24obW9kZSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBhcmF0ZSh1bnNpZ25l
ZCBsb25nIG1vZGVSR0IsIHVuc2lnbmVkIGxvbmcgbW9kZUFscGhhKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKG1vZGVS
R0IsIG1vZGVBbHBoYSk7Cit9CisKKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5j
KHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQgbG9uZyBkZmFjdG9yKQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQmxlbmRGdW5jKHNmYWN0b3IsIGRm
YWN0b3IpOworfSAgICAgICAKKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5jU2Vw
YXJhdGUodW5zaWduZWQgbG9uZyBzcmNSR0IsIHVuc2lnbmVkIGxvbmcgZHN0UkdCLCB1bnNpZ25l
ZCBsb25nIHNyY0FscGhhLCB1bnNpZ25lZCBsb25nIGRzdEFscGhhKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQmxlbmRGdW5jU2VwYXJhdGUoc3JjUkdCLCBk
c3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGludCBzaXplLCB1bnNpZ25lZCBsb25n
IHVzYWdlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQnVm
ZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsKK30KK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIEFycmF5QnVmZmVyVmlldyogYXJy
YXksIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCit7CisgICAgaWYgKCFhcnJheSB8fCAhYXJyYXktPmxl
bmd0aCgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgYXJyYXktPmJ5dGVMZW5ndGgoKSwg
YXJyYXktPmJhc2VBZGRyZXNzKCksIHVzYWdlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6YnVmZmVyU3ViRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBvZmZzZXQsIEFycmF5
QnVmZmVyVmlldyogYXJyYXkpCit7CisgICAgaWYgKCFhcnJheSB8fCAhYXJyYXktPmxlbmd0aCgp
KQorICAgICAgICByZXR1cm47CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xCdWZmZXJTdWJEYXRhKHRhcmdldCwgb2Zmc2V0LCBhcnJheS0+Ynl0ZUxlbmd0
aCgpLCBhcnJheS0+YmFzZUFkZHJlc3MoKSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgR3JhcGhpY3ND
b250ZXh0M0Q6OmNoZWNrRnJhbWVidWZmZXJTdGF0dXModW5zaWduZWQgbG9uZyB0YXJnZXQpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6OmdsQ2hlY2tG
cmFtZWJ1ZmZlclN0YXR1c0VYVCh0YXJnZXQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpjbGVhckNvbG9yKGRvdWJsZSByLCBkb3VibGUgZywgZG91YmxlIGIsIGRvdWJsZSBhKQorewor
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQ2xlYXJDb2xvcihzdGF0
aWNfY2FzdDxmbG9hdD4ociksIHN0YXRpY19jYXN0PGZsb2F0PihnKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGIpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpjbGVhcih1bnNpZ25lZCBsb25nIG1hc2spCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIDo6Z2xDbGVhcihtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Y2xlYXJEZXB0aChkb3VibGUgZGVwdGgpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIDo6Z2xDbGVhckRlcHRoKGRlcHRoKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Y2xlYXJTdGVuY2lsKGxvbmcgcykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbENsZWFyU3RlbmNpbChzKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Y29sb3JNYXNrKGJvb2wgcmVkLCBib29sIGdyZWVuLCBib29sIGJsdWUsIGJv
b2wgYWxwaGEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xD
b2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpjb21waWxlU2hhZGVyKFdlYkdMU2hhZGVyKiBzaGFkZXIpCit7CisgICAgQVNTRVJU
KHNoYWRlcik7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDb21w
aWxlU2hhZGVyKChHTHVpbnQpIHNoYWRlci0+b2JqZWN0KCkpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpjb3B5VGV4SW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZl
bCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVk
IGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCBsb25nIGJvcmRlcikKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYm
IG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgeworICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKKyAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9m
Ym8pOworICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSAr
IGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklU
LCBHTF9MSU5FQVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVG
RkVSX0VYVCwgbV9mYm8pOworICAgIH0KKyAgICA6OmdsQ29weVRleEltYWdlMkQodGFyZ2V0LCBs
ZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlcik7CisgICAg
aWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykK
KyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVs
dGlzYW1wbGVGQk8pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1h
Z2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgbG9uZyB4b2Zmc2V0LCBsb25n
IHlvZmZzZXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBs
b25nIGhlaWdodCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgaWYg
KG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewor
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBt
X211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFX
X0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhU
KHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0
LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgIH0KKyAgICA6OmdsQ29w
eVRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lk
dGgsIGhlaWdodCk7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0g
bV9tdWx0aXNhbXBsZUZCTykKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFN
RUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpjdWxsRmFjZSh1bnNpZ25lZCBsb25nIG1vZGUpCit7CisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIDo6Z2xDdWxsRmFjZShtb2RlKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6ZGVwdGhGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYykKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbERlcHRoRnVuYyhmdW5jKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhNYXNrKGJvb2wgZmxhZykKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbERlcHRoTWFzayhmbGFnKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhSYW5nZShkb3VibGUgek5lYXIsIGRvdWJsZSB6RmFy
KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGVwdGhSYW5n
ZSh6TmVhciwgekZhcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRldGFjaFNoYWRl
cihXZWJHTFByb2dyYW0qIHByb2dyYW0sIFdlYkdMU2hhZGVyKiBzaGFkZXIpCit7CisgICAgQVNT
RVJUKHByb2dyYW0pOworICAgIEFTU0VSVChzaGFkZXIpOworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsRGV0YWNoU2hhZGVyKChHTHVpbnQpIHByb2dyYW0tPm9iamVj
dCgpLCAoR0x1aW50KSBzaGFkZXItPm9iamVjdCgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZGlzYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbERpc2FibGUoY2FwKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEaXNhYmxlVmVydGV4
QXR0cmliQXJyYXkoaW5kZXgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkcmF3QXJy
YXlzKHVuc2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwgbG9uZyBjb3VudCkKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbERyYXdBcnJheXMobW9kZSwgZmly
c3QsIGNvdW50KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1lbnRzKHVu
c2lnbmVkIGxvbmcgbW9kZSwgdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBl
LCBsb25nIG9mZnNldCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
OjpnbERyYXdFbGVtZW50cyhtb2RlLCBjb3VudCwgdHlwZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lk
Kj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZW5hYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQoreworICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRW5hYmxlKGNhcCk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xFbmFibGVWZXJ0ZXhB
dHRyaWJBcnJheShpbmRleCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZpbmlzaCgp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xGaW5pc2goKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Zmx1c2goKQoreworICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRmx1c2goKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVu
c2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJidWZmZXJ0YXJnZXQs
IFdlYkdMUmVuZGVyYnVmZmVyKiBidWZmZXIpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIEdMdWludCByZW5kZXJidWZmZXIgPSAoYnVmZmVyID8gKEdMdWludCkgYnVm
ZmVyLT5vYmplY3QoKSA6IDApOworICAgIGlmIChhdHRhY2htZW50ID09IERFUFRIX1NURU5DSUxf
QVRUQUNITUVOVCkgeworICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFy
Z2V0LCBERVBUSF9BVFRBQ0hNRU5ULCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7
CisgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIFNURU5DSUxf
QVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOworICAgIH0gZWxz
ZQorICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBhdHRhY2ht
ZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVyZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1
bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcgdGV4dGFyZ2V0LCBXZWJHTFRl
eHR1cmUqIHRleHR1cmUsIGxvbmcgbGV2ZWwpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCh0YXJnZXQsIGF0dGFjaG1l
bnQsIHRleHRhcmdldCwgdGV4dHVyZSA/IChHTHVpbnQpIHRleHR1cmUtPm9iamVjdCgpIDogMCwg
bGV2ZWwpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcm9udEZhY2UodW5zaWduZWQg
bG9uZyBtb2RlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
RnJvbnRGYWNlKG1vZGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZW5lcmF0ZU1p
cG1hcCh1bnNpZ25lZCBsb25nIHRhcmdldCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgOjpnbEdlbmVyYXRlTWlwbWFwRVhUKHRhcmdldCk7Cit9CisKK2Jvb2wgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZUF0dHJpYihXZWJHTFByb2dyYW0qIHByb2dyYW0sIHVu
c2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUluZm8mIGluZm8pCit7CisgICAgaWYgKCFwcm9ncmFt
LT5vYmplY3QoKSkgeworICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgR0xpbnQgbWF4QXR0cmlidXRlU2l6ZSA9IDA7CisgICAgOjpnbEdldFByb2dy
YW1pdihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0tPm9iamVjdCgpKSwgR0xfQUNUSVZFX0FU
VFJJQlVURV9NQVhfTEVOR1RILCAmbWF4QXR0cmlidXRlU2l6ZSk7CisgICAgR0xjaGFyIG5hbWVb
bWF4QXR0cmlidXRlU2l6ZV07IC8vIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCBpbmNs
dWRlcyBudWxsIHRlcm1pbmF0aW9uCisgICAgR0xzaXplaSBuYW1lTGVuZ3RoID0gMDsKKyAgICBH
TGludCBzaXplID0gMDsKKyAgICBHTGVudW0gdHlwZSA9IDA7CisgICAgOjpnbEdldEFjdGl2ZUF0
dHJpYihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0tPm9iamVjdCgpKSwgaW5kZXgsIG1heEF0
dHJpYnV0ZVNpemUsICZuYW1lTGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOworICAgIGlmICgh
bmFtZUxlbmd0aCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGluZm8ubmFtZSA9IFN0cmlu
ZyhuYW1lLCBuYW1lTGVuZ3RoKTsKKyAgICBpbmZvLnR5cGUgPSB0eXBlOworICAgIGluZm8uc2l6
ZSA9IHNpemU7CisgICAgcmV0dXJuIHRydWU7Cit9CisgICAgCitib29sIEdyYXBoaWNzQ29udGV4
dDNEOjpnZXRBY3RpdmVVbmlmb3JtKFdlYkdMUHJvZ3JhbSogcHJvZ3JhbSwgdW5zaWduZWQgbG9u
ZyBpbmRleCwgQWN0aXZlSW5mbyYgaW5mbykKK3sKKyAgICBpZiAoIXByb2dyYW0tPm9iamVjdCgp
KSB7CisgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBHTGludCBtYXhVbmlmb3JtU2l6ZSA9IDA7CisgICAgOjpnbEdldFByb2dyYW1pdihzdGF0aWNf
Y2FzdDxHTHVpbnQ+KHByb2dyYW0tPm9iamVjdCgpKSwgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xF
TkdUSCwgJm1heFVuaWZvcm1TaXplKTsKKyAgICBHTGNoYXIgbmFtZVttYXhVbmlmb3JtU2l6ZV07
IC8vIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggaW5jbHVkZXMgbnVsbCB0ZXJtaW5hdGlv
bgorICAgIEdMc2l6ZWkgbmFtZUxlbmd0aCA9IDA7CisgICAgR0xpbnQgc2l6ZSA9IDA7CisgICAg
R0xlbnVtIHR5cGUgPSAwOworICAgIDo6Z2xHZXRBY3RpdmVVbmlmb3JtKHN0YXRpY19jYXN0PEdM
dWludD4ocHJvZ3JhbS0+b2JqZWN0KCkpLCBpbmRleCwgbWF4VW5pZm9ybVNpemUsICZuYW1lTGVu
Z3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOworICAgIGlmICghbmFtZUxlbmd0aCkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1lTGVuZ3RoKTsK
KyAgICBpbmZvLnR5cGUgPSB0eXBlOworICAgIGluZm8uc2l6ZSA9IHNpemU7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK2ludCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QXR0cmliTG9jYXRpb24oV2Vi
R0xQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgaWYgKCFwcm9n
cmFtKQorICAgICAgICByZXR1cm4gLTE7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIHJldHVybiA6OmdsR2V0QXR0cmliTG9jYXRpb24oKEdMdWludCkgcHJvZ3Jh
bS0+b2JqZWN0KCksIG5hbWUudXRmOCgpLmRhdGEoKSk7Cit9CisKK0dyYXBoaWNzQ29udGV4dDNE
OjpBdHRyaWJ1dGVzIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRDb250ZXh0QXR0cmlidXRlcygpCit7
CisgICAgcmV0dXJuIG1fYXR0cnM7Cit9CisKK3Vuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldEVycm9yKCkKK3sKKyAgICBpZiAobV9zeW50aGV0aWNFcnJvcnMuc2l6ZSgpID4gMCkg
eworICAgICAgICBMaXN0SGFzaFNldDx1bnNpZ25lZCBsb25nPjo6aXRlcmF0b3IgaXRlciA9IG1f
c3ludGhldGljRXJyb3JzLmJlZ2luKCk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZXJyID0gKml0
ZXI7CisgICAgICAgIG1fc3ludGhldGljRXJyb3JzLnJlbW92ZShpdGVyKTsKKyAgICAgICAgcmV0
dXJuIGVycjsKKyAgICB9CisKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
cmV0dXJuIDo6Z2xHZXRFcnJvcigpOworfQorCitTdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dFN0cmluZyh1bnNpZ25lZCBsb25nIG5hbWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIHJldHVybiBTdHJpbmcoKGNvbnN0IGNoYXIqKSA6OmdsR2V0U3RyaW5nKG5h
bWUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6aGludCh1bnNpZ25lZCBsb25nIHRh
cmdldCwgdW5zaWduZWQgbG9uZyBtb2RlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOworfQorCitib29sIEdyYXBoaWNzQ29u
dGV4dDNEOjppc0J1ZmZlcihXZWJHTEJ1ZmZlciogYnVmZmVyKQoreworICAgIGlmICghYnVmZmVy
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIHJldHVybiA6OmdsSXNCdWZmZXIoKEdMdWludCkgYnVmZmVyLT5vYmplY3Qo
KSk7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRW5hYmxlZCh1bnNpZ25lZCBsb25n
IGNhcCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6
Z2xJc0VuYWJsZWQoY2FwKTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1
ZmZlcihXZWJHTEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikKK3sKKyAgICBpZiAoIWZyYW1lYnVm
ZmVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIHJldHVybiA6OmdsSXNGcmFtZWJ1ZmZlckVYVCgoR0x1aW50KSBmcmFt
ZWJ1ZmZlci0+b2JqZWN0KCkpOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1Byb2dy
YW0oV2ViR0xQcm9ncmFtKiBwcm9ncmFtKQoreworICAgIGlmICghcHJvZ3JhbSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICByZXR1cm4gOjpnbElzUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSk7Cit9CisK
K2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUmVuZGVyYnVmZmVyKFdlYkdMUmVuZGVyYnVmZmVy
KiByZW5kZXJidWZmZXIpCit7CisgICAgaWYgKCFyZW5kZXJidWZmZXIpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0
dXJuIDo6Z2xJc1JlbmRlcmJ1ZmZlckVYVCgoR0x1aW50KSByZW5kZXJidWZmZXItPm9iamVjdCgp
KTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNTaGFkZXIoV2ViR0xTaGFkZXIqIHNo
YWRlcikKK3sKKyAgICBpZiAoIXNoYWRlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAor
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gOjpnbElzU2hhZGVy
KChHTHVpbnQpIHNoYWRlci0+b2JqZWN0KCkpOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNE
Ojppc1RleHR1cmUoV2ViR0xUZXh0dXJlKiB0ZXh0dXJlKQoreworICAgIGlmICghdGV4dHVyZSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICByZXR1cm4gOjpnbElzVGV4dHVyZSgoR0x1aW50KSB0ZXh0dXJlLT5vYmplY3Qo
KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmxpbmVXaWR0aChkb3VibGUgd2lkdGgp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xMaW5lV2lkdGgo
c3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZHRoKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmxpbmtQcm9ncmFtKFdlYkdMUHJvZ3JhbSogcHJvZ3JhbSkKK3sKKyAgICBBU1NFUlQocHJvZ3Jh
bSk7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xMaW5rUHJvZ3Jh
bSgoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxvbmcgcGFyYW0pCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xQaXhlbFN0b3JlaShwbmFtZSwg
cGFyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwb2x5Z29uT2Zmc2V0KGRvdWJs
ZSBmYWN0b3IsIGRvdWJsZSB1bml0cykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgOjpnbFBvbHlnb25PZmZzZXQoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGZhY3RvciksIHN0
YXRpY19jYXN0PGZsb2F0Pih1bml0cykpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpy
ZWFkUGl4ZWxzKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBs
b25nIGhlaWdodCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgdm9p
ZCogZGF0YSkKK3sKKyAgICAvLyBGSVhNRTogcmVtb3ZlIHRoZSB0d28gZ2xGbHVzaCBjYWxscyB3
aGVuIHRoZSBkcml2ZXIgYnVnIGlzIGZpeGVkLCBpLmUuLAorICAgIC8vIGFsbCBwcmV2aW91cyBy
ZW5kZXJpbmcgY2FsbHMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHJlYWRpbmcgcGl4ZWxzLgorICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRmx1c2goKTsKKyAgICBpZiAo
bV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7Cisg
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1f
bXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdf
RlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQo
eCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQs
IEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xGbHVzaCgp
OworICAgIH0KKyAgICA6OmdsUmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQs
IHR5cGUsIGRhdGEpOworICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09
IG1fbXVsdGlzYW1wbGVGQk8pCisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6cmVsZWFzZVNoYWRlckNvbXBpbGVyKCkKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBu
b3QgaW1wbGVtZW50ZWQgb24gZGVza3RvcCBPcGVuR0wuIFdlIG5lZWQgdG8gaGF2ZSBpZmRlZnMg
Zm9yIHRoZSBkaWZmZXJlbnQgR0wgdmFyaWFudHMKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgLy86OmdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZlclN0b3JhZ2UodW5zaWduZWQgbG9uZyB0YXJnZXQs
IHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2ln
bmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7CisgICAgY2FzZSBERVBUSF9TVEVOQ0lMOgorICAg
ICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIERFUFRIX0NPTVBPTkVOVDE2OgorICAgICAgICBpbnRlcm5hbGZvcm1h
dCA9IEdMX0RFUFRIX0NPTVBPTkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSR0JBNDoK
KyAgICBjYXNlIFJHQjVfQTE6CisgICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfUkdCQTsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBSR0I1NjU6CisgICAgICAgIGludGVybmFsZm9ybWF0ID0g
R0xfUkdCOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgOjpnbFJlbmRlcmJ1ZmZlclN0b3Jh
Z2VFWFQodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnNhbXBsZUNvdmVyYWdlKGRvdWJsZSB2YWx1ZSwgYm9vbCBpbnZl
cnQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xTYW1wbGVD
b3ZlcmFnZShzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpLCBpbnZlcnQpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpzY2lzc29yKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdp
ZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgOjpnbFNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShXZWJHTFNoYWRlciogc2hhZGVyLCBjb25z
dCBTdHJpbmcmIHN0cmluZykKK3sKKyAgICBBU1NFUlQoc2hhZGVyKTsKKyAgICAKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgY29uc3QgQ1N0cmluZyYgY3MgPSBzdHJpbmcu
dXRmOCgpOworICAgIGNvbnN0IGNoYXIqIHMgPSBjcy5kYXRhKCk7CisgICAgCisgICAgaW50IGxl
bmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKKyAgICA6OmdsU2hhZGVyU291cmNlKChHTHVpbnQpIHNo
YWRlci0+b2JqZWN0KCksIDEsICZzLCAmbGVuZ3RoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6c3RlbmNpbEZ1bmModW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwgdW5zaWduZWQg
bG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
U3RlbmNpbEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6c3RlbmNpbEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcg
ZnVuYywgbG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgOjpnbFN0ZW5jaWxGdW5jU2VwYXJhdGUoZmFjZSwgZnVuYywg
cmVmLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2sodW5z
aWduZWQgbG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICA6OmdsU3RlbmNpbE1hc2sobWFzayk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0
ZW5jaWxNYXNrU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIG1hc2sp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xTdGVuY2lsTWFz
a1NlcGFyYXRlKGZhY2UsIG1hc2spOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVu
Y2lsT3AodW5zaWduZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBs
b25nIHpwYXNzKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
U3RlbmNpbE9wKGZhaWwsIHpmYWlsLCB6cGFzcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnN0ZW5jaWxPcFNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBm
YWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBsb25nIHpwYXNzKQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNpbE9wU2VwYXJhdGUoZmFj
ZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dGV4
UGFyYW1ldGVyZih1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBmbG9hdCB2YWx1ZSkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFRleFBhcmFtZXRl
cmYodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmkodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25l
ZCBwbmFtZSwgaW50IHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIHBuYW1lLCBzdGF0aWNfY2FzdDxmbG9hdD4o
dmFsdWUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmKGxvbmcgbG9j
YXRpb24sIGZsb2F0IHYwKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICA6OmdsVW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0xZnYobG9j
YXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9y
bTJmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSkKK3sKKyAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0yZihsb2NhdGlvbiwgdjAsIHYxKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmdihsb25nIGxvY2F0aW9uLCBm
bG9hdCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8g
YmUgYSBtdWx0aXBsZSBvZiAyCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IDo6Z2xVbmlmb3JtMmZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0zZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEs
IGZsb2F0IHYyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
VW5pZm9ybTNmKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dW5pZm9ybTNmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQor
eworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2Z2KGxvY2F0aW9u
LCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00Zihs
b25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00Zihsb2Nh
dGlvbiwgdjAsIHYxLCB2MiwgdjMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlm
b3JtNGZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCit7CisgICAgLy8g
RklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00ZnYobG9jYXRpb24sIHNpemUsIGFy
cmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpKGxvbmcgbG9jYXRp
b24sIGludCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bFVuaWZvcm0xaShsb2NhdGlvbiwgdjApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtMWl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybTFpdihsb2NhdGlvbiwg
c2l6ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmkobG9u
ZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xVbmlmb3JtMmkobG9jYXRpb24sIHYwLCB2MSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwg
aW50IHNpemUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxl
IG9mIDIKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0y
aXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dW5pZm9ybTNpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2kobG9jYXRpb24s
IHYwLCB2MSwgdjIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2KGxv
bmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5n
dGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2l2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aShsb25nIGxvY2F0aW9uLCBpbnQgdjAs
IGludCB2MSwgaW50IHYyLCBpbnQgdjMpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIDo6Z2xVbmlmb3JtNGkobG9jYXRpb24sIHYwLCB2MSwgdjIsIHYzKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFy
cmF5LCBpbnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVs
dGlwbGUgb2YgNAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5p
Zm9ybTRpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtTWF0cml4MmZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9h
dCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUg
YSBtdWx0aXBsZSBvZiA0CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6
Z2xVbmlmb3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdihsb25nIGxvY2F0aW9u
LCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhN
RTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgOQorICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgc2l6ZSwg
dHJhbnNwb3NlLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1N
YXRyaXg0ZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50
IHNpemUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9m
IDE2CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtTWF0
cml4NGZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dXNlUHJvZ3JhbShXZWJHTFByb2dyYW0qIHByb2dyYW0pCit7CisgICAg
QVNTRVJUKHByb2dyYW0pOworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsVXNlUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbShXZWJHTFByb2dyYW0qIHByb2dy
YW0pCit7CisgICAgQVNTRVJUKHByb2dyYW0pOworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsVmFsaWRhdGVQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0tPm9i
amVjdCgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWYodW5z
aWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjFmKGluZHgsIHYwKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQq
IGFycmF5KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVy
dGV4QXR0cmliMWZ2KGluZHgsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dmVydGV4QXR0cmliMmYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIy
ZihpbmR4LCB2MCwgdjEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRy
aWIyZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZnYoaW5keCwgYXJyYXkp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZih1bnNpZ25lZCBs
b25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4LCB2MCwgdjEs
IHYyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2Z2KHVuc2ln
bmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliM2Z2KGluZHgsIGFycmF5KTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGYodW5zaWduZWQgbG9uZyBpbmR4LCBm
bG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykKK3sKKyAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjRmKGluZHgsIHYwLCB2MSwg
djIsIHYzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGZ2KHVu
c2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliNGZ2KGluZHgsIGFycmF5KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliUG9pbnRlcih1bnNpZ25lZCBsb25n
IGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwgYm9vbCBub3JtYWxpemVkLCB1bnNpZ25lZCBsb25n
IHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGluZHgsIHNpemUsIHR5cGUs
IG5vcm1hbGl6ZWQsIHN0cmlkZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8
aW50cHRyX3Q+KG9mZnNldCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmlld3Bv
cnQobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVp
Z2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmlld3Bv
cnQoc3RhdGljX2Nhc3Q8R0xpbnQ+KHgpLCBzdGF0aWNfY2FzdDxHTGludD4oeSksIHN0YXRpY19j
YXN0PEdMc2l6ZWk+KHdpZHRoKSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4oaGVpZ2h0KSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEJvb2xlYW52KHVuc2lnbmVkIGxvbmcgcG5hbWUs
IHVuc2lnbmVkIGNoYXIqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICA6OmdsR2V0Qm9vbGVhbnYocG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0QnVmZmVyUGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVu
c2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIDo6Z2xHZXRCdWZmZXJQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2
YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEZsb2F0dih1bnNpZ25lZCBs
b25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIDo6Z2xHZXRGbG9hdHYocG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYodW5zaWduZWQg
bG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyBwbmFt
ZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
aWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UKQorICAgICAgICBhdHRh
Y2htZW50ID0gREVQVEhfQVRUQUNITUVOVDsgLy8gT3IgU1RFTkNJTF9BVFRBQ0hNRU5ULCBlaXRo
ZXIgd29ya3MuCisgICAgOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhU
KHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0SW50ZWdlcnYodW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sK
KyAgICAvLyBOZWVkIHRvIGVtdWxhdGUgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQv
VFlQRSBmb3IgR0wuICBBbnkgdmFsaWQKKyAgICAvLyBjb21iaW5hdGlvbiBzaG91bGQgd29yaywg
YnV0IEdMX1JHQi9HTF9VTlNJR05FRF9CWVRFIG1pZ2h0IGJlIHRoZSBtb3N0CisgICAgLy8gdXNl
ZnVsIGZvciBkZXNrdG9wIFdlYkdMIHVzZXJzLgorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xP
Ul9SRUFEX0ZPUk1BVDoKKyAgICAgICAgKnZhbHVlID0gR0xfUkdCOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRToKKyAgICAgICAgKnZhbHVl
ID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAg
ICAgOjpnbEdldEludGVnZXJ2KHBuYW1lLCB2YWx1ZSk7CisgICAgfQorfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtaXYoV2ViR0xQcm9ncmFtKiBwcm9ncmFtLCB1bnNpZ25l
ZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0tPm9iamVjdCgpLCBw
bmFtZSwgdmFsdWUpOworfQorCitTdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1J
bmZvTG9nKFdlYkdMUHJvZ3JhbSogcHJvZ3JhbSkKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7Cisg
ICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIEdMaW50IGxlbmd0aDsK
KyAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0tPm9iamVjdCgpLCBHTF9JTkZP
X0xPR19MRU5HVEgsICZsZW5ndGgpOworICAgIAorICAgIEdMc2l6ZWkgc2l6ZTsKKyAgICBHTGNo
YXIqIGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxvYyhsZW5ndGgpOworICAgIGlmICghaW5mbykK
KyAgICAgICAgcmV0dXJuICIiOworCisgICAgOjpnbEdldFByb2dyYW1JbmZvTG9nKChHTHVpbnQp
IHByb2dyYW0tPm9iamVjdCgpLCBsZW5ndGgsICZzaXplLCBpbmZvKTsKKyAgICBTdHJpbmcgcyhp
bmZvKTsKKyAgICBmYXN0RnJlZShpbmZvKTsKKyAgICByZXR1cm4gczsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0
YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVY
VCh0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dFNoYWRlcml2KFdlYkdMU2hhZGVyKiBzaGFkZXIsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCog
dmFsdWUpCit7CisgICAgQVNTRVJUKHNoYWRlcik7CisgICAgCisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXItPm9iamVj
dCgpLCBwbmFtZSwgdmFsdWUpOworfQorCitTdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNo
YWRlckluZm9Mb2coV2ViR0xTaGFkZXIqIHNoYWRlcikKK3sKKyAgICBBU1NFUlQoc2hhZGVyKTsK
KyAgICAKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0xpbnQgbGVuZ3Ro
OworICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXItPm9iamVjdCgpLCBHTF9JTkZP
X0xPR19MRU5HVEgsICZsZW5ndGgpOworICAgIAorICAgIEdMc2l6ZWkgc2l6ZTsKKyAgICBHTGNo
YXIqIGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxvYyhsZW5ndGgpOworICAgIGlmICghaW5mbykK
KyAgICAgICAgcmV0dXJuICIiOworICAgICAgICAKKyAgICA6OmdsR2V0U2hhZGVySW5mb0xvZygo
R0x1aW50KSBzaGFkZXItPm9iamVjdCgpLCBsZW5ndGgsICZzaXplLCBpbmZvKTsKKyAgICBTdHJp
bmcgcyhpbmZvKTsKKyAgICBmYXN0RnJlZShpbmZvKTsKKyAgICByZXR1cm4gczsKK30KKworU3Ry
aW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJTb3VyY2UoV2ViR0xTaGFkZXIqIHNoYWRl
cikKK3sKKyAgICBBU1NFUlQoc2hhZGVyKTsKKworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBHTGludCBsZW5ndGg7CisgICAgOjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNo
YWRlci0+b2JqZWN0KCksIEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RILCAmbGVuZ3RoKTsKKyAgICAK
KyAgICBHTHNpemVpIHNpemU7CisgICAgR0xjaGFyKiBpbmZvID0gKEdMY2hhciopIGZhc3RNYWxs
b2MobGVuZ3RoKTsKKyAgICBpZiAoIWluZm8pCisgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAg
CisgICAgOjpnbEdldFNoYWRlclNvdXJjZSgoR0x1aW50KSBzaGFkZXItPm9iamVjdCgpLCBsZW5n
dGgsICZzaXplLCBpbmZvKTsKKyAgICBTdHJpbmcgcyhpbmZvKTsKKyAgICBmYXN0RnJlZShpbmZv
KTsKKyAgICByZXR1cm4gczsKK30KKworCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQ
YXJhbWV0ZXJmdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgZmxv
YXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
R2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgOjpnbEdldFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZhbHVl
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KFdlYkdMUHJvZ3Jh
bSogcHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgZmxvYXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VW5pZm9ybWZ2KChHTHVpbnQpIHByb2dy
YW0tPm9iamVjdCgpLCBsb2NhdGlvbiwgdmFsdWUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpnZXRVbmlmb3JtaXYoV2ViR0xQcm9ncmFtKiBwcm9ncmFtLCBsb25nIGxvY2F0aW9uLCBp
bnQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
R2V0VW5pZm9ybWl2KChHTHVpbnQpIHByb2dyYW0tPm9iamVjdCgpLCBsb2NhdGlvbiwgdmFsdWUp
OworfQorCitsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtTG9jYXRpb24oV2ViR0xQ
cm9ncmFtKiBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgQVNTRVJUKHByb2dy
YW0pOworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4g
OjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLT5vYmplY3QoKSwgbmFtZS51
dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0
cmliZnYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZh
bHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VmVy
dGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxv
bmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJpdihpbmRleCwgcG5hbWUsIHZhbHVlKTsKK30KKwor
bG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliT2Zmc2V0KHVuc2lnbmVkIGxv
bmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIAorICAgIHZvaWQqIHBvaW50ZXI7CisgICAgOjpnbEdldFZlcnRleEF0
dHJpYlBvaW50ZXJ2KGluZGV4LCBwbmFtZSwgJnBvaW50ZXIpOworICAgIHJldHVybiByZWludGVy
cHJldF9jYXN0PGxvbmc+KHBvaW50ZXIpOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRl
eEltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgaW50ZXJu
YWxmb3JtYXQsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGJvcmRl
ciwgdW5zaWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgOjpnbFRleEltYWdlMkQodGFyZ2V0
LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0
eXBlLCBwaXhlbHMpOworICAgIHJldHVybiAwOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6
OnRleFN1YkltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQg
eG9mZiwgdW5zaWduZWQgeW9mZiwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5z
aWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgLy8gRklYTUU6IHdlIHdpbGwgbmVlZCB0byBk
ZWFsIHdpdGggUGl4ZWxTdG9yZSBwYXJhbXMgd2hlbiBkZWFsaW5nIHdpdGggaW1hZ2UgYnVmZmVy
cyB0aGF0IGRpZmZlciBmcm9tIHRoZSBzdWJpbWFnZSBzaXplCisgICAgOjpnbFRleFN1YkltYWdl
MkQodGFyZ2V0LCBsZXZlbCwgeG9mZiwgeW9mZiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBl
LCBwaXhlbHMpOworICAgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQz
RDo6Y3JlYXRlQnVmZmVyKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgR0x1aW50IG87CisgICAgZ2xHZW5CdWZmZXJzKDEsICZvKTsKKyAgICByZXR1cm4gbzsKK30K
KwordW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUZyYW1lYnVmZmVyKCkKK3sKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0x1aW50IG87CisgICAgZ2xHZW5G
cmFtZWJ1ZmZlcnNFWFQoMSwgJm8pOworICAgIHJldHVybiBvOworfQorCit1bnNpZ25lZCBHcmFw
aGljc0NvbnRleHQzRDo6Y3JlYXRlUHJvZ3JhbSgpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIHJldHVybiBnbENyZWF0ZVByb2dyYW0oKTsKK30KKwordW5zaWduZWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVJlbmRlcmJ1ZmZlcigpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIEdMdWludCBvOworICAgIGdsR2VuUmVuZGVyYnVmZmVy
c0VYVCgxLCAmbyk7CisgICAgcmV0dXJuIG87Cit9CisKK3Vuc2lnbmVkIEdyYXBoaWNzQ29udGV4
dDNEOjpjcmVhdGVTaGFkZXIodW5zaWduZWQgbG9uZyB0eXBlKQoreworICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gZ2xDcmVhdGVTaGFkZXIoKHR5cGUgPT0gRlJB
R01FTlRfU0hBREVSKSA/IEdMX0ZSQUdNRU5UX1NIQURFUiA6IEdMX1ZFUlRFWF9TSEFERVIpOwor
fQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4dHVyZSgpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIEdMdWludCBvOworICAgIGdsR2VuVGV4
dHVyZXMoMSwgJm8pOworICAgIHJldHVybiBvOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVCdWZmZXIodW5zaWduZWQgYnVmZmVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwgJmJ1ZmZlcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUZyYW1lYnVmZmVyKHVuc2lnbmVkIGZyYW1lYnVmZmVy
KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZUZyYW1l
YnVmZmVyc0VYVCgxLCAmZnJhbWVidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVQcm9ncmFtKHVuc2lnbmVkIHByb2dyYW0pCit7CisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVyYnVmZmVyKHVuc2lnbmVkIHJlbmRlcmJ1ZmZl
cikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZ2xEZWxldGVSZW5k
ZXJidWZmZXJzRVhUKDEsICZyZW5kZXJidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpkZWxldGVTaGFkZXIodW5zaWduZWQgc2hhZGVyKQoreworICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpkZWxldGVUZXh0dXJlKHVuc2lnbmVkIHRleHR1cmUpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRl
eHR1cmUpOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnNpemVJbkJ5dGVzKGludCB0eXBl
KQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEdMX0JZVEU6CisgICAgICAg
ICAgICByZXR1cm4gc2l6ZW9mKEdMYnl0ZSk7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllU
RToKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1Ynl0ZSk7CisgICAgICAgIGNhc2UgR0xf
U0hPUlQ6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMc2hvcnQpOworICAgICAgICBjYXNl
IEdMX1VOU0lHTkVEX1NIT1JUOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHVzaG9ydCk7
CisgICAgICAgIGNhc2UgR0xfSU5UOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTGludCk7
CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5UOgorICAgICAgICAgICAgcmV0dXJuIHNpemVv
ZihHTHVpbnQpOworICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIHNp
emVvZihHTGZsb2F0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3ludGhlc2l6ZUdMRXJyb3IodW5z
aWduZWQgbG9uZyBlcnJvcikKK3sKKyAgICBtX3N5bnRoZXRpY0Vycm9ycy5hZGQoZXJyb3IpOwor
fQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoM0RfQ0FOVkFTKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>58901</attachid>
            <date>2010-06-16 10:26:52 -0700</date>
            <delta_ts>2010-06-22 13:51:33 -0700</delta_ts>
            <desc>Patch to rename Canvas3DLayer to WebGLLayer</desc>
            <filename>40643-2.patch</filename>
            <type>text/plain</type>
            <size>29224</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MTI2MikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMTAtMDYtMTYgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDY0MworICAgICAgICAKKyAg
ICAgICAgU2Vjb25kIG9mIHRocmVlIHN0ZXBzIC0gcmVuYW1lIENhbnZhczNETGF5ZXIgdG8gV2Vi
R0xMYXllcgorCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9DYW52YXMzRExheWVyLmg6IFJlbW92ZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NhbnZhczNETGF5ZXIubW06IFJlbW92
ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDQTo6c2V0Q29udGVudHNUb0dyYXBoaWNz
Q29udGV4dDNEKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViR0xMYXllci5o
OiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9DYW52YXMzRExheWVy
LmguCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkdMTGF5ZXIubW06IENvcGll
ZCBmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NhbnZhczNETGF5ZXIubW0uCisK
IDIwMTAtMDYtMTYgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUuY29tPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IFNpbW9uIEZyYXNlci4KSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiA2MTI2MikKKysrIFdlYkNvcmUvV2ViQ29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC04OTUsOCArODk1LDYg
QEAKIAkJNDlDN0I5RTUxMDQyRDMyRjAwMDlENDQ3IC8qIFdlYkdMVGV4dHVyZS5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUM3QjlDNTEwNDJEMzJG
MDAwOUQ0NDcgLyogV2ViR0xUZXh0dXJlLmNwcCAqLzsgfTsKIAkJNDlDN0I5RTYxMDQyRDMyRjAw
MDlENDQ3IC8qIFdlYkdMVGV4dHVyZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNDlDN0I5QzYxMDQyRDMyRjAwMDlENDQ3IC8qIFdlYkdMVGV4dHVyZS5o
ICovOyB9OwogCQk0OUM3QjlGQzEwNDJEMzY1MDAwOUQ0NDcgLyogR3JhcGhpY3NDb250ZXh0M0Qu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5QzdCOUZC
MTA0MkQzNjUwMDA5RDQ0NyAvKiBHcmFwaGljc0NvbnRleHQzRC5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07Ci0JCTQ5QzdCQTAwMTA0MkQzOEMwMDA5RDQ0
NyAvKiBDYW52YXMzRExheWVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSA0OUM3QjlGRDEwNDJEMzhDMDAwOUQ0NDcgLyogQ2FudmFzM0RMYXllci5oICov
OyB9OwotCQk0OUM3QkEwMTEwNDJEMzhDMDAwOUQ0NDcgLyogQ2FudmFzM0RMYXllci5tbSBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5QzdCOUZFMTA0MkQz
OEMwMDA5RDQ0NyAvKiBDYW52YXMzRExheWVyLm1tICovOyB9OwogCQk0OUM3QkE3OTEwNDJFRkFF
MDAwOUQ0NDcgLyogT3BlbkdMLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5QzdCQTc4MTA0MkVGQUUwMDA5RDQ0NyAvKiBPcGVuR0wu
ZnJhbWV3b3JrICovOyB9OwogCQk0OUM3QkE4RDEwNDJGNUIxMDAwOUQ0NDcgLyogSlNEb2N1bWVu
dEN1c3RvbS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSA0OUM3QkE4QzEwNDJGNUIxMDAwOUQ0NDcgLyogSlNEb2N1bWVudEN1c3RvbS5jcHAgKi87IH07
CiAJCTQ5RDVEQzJCMEY0MjNBNzMwMDhGMjBGRCAvKiBNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlv
bi5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUQ1
REMyNzBGNDIzQTczMDA4RjIwRkQgLyogTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uY3BwICov
OyB9OwpAQCAtOTczLDYgKzk3MSw4IEBACiAJCTQ5RUVEMTRGMTA1MTk3MUEwMDA5OUZBQiAvKiBK
U1dlYkdMUmVuZGVyaW5nQ29udGV4dEN1c3RvbS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUVFRDE0QzEwNTE5NzFBMDAwOTlGQUIgLyogSlNXZWJH
TFJlbmRlcmluZ0NvbnRleHRDdXN0b20uY3BwICovOyB9OwogCQk0OUVFRDE1MDEwNTE5NzFBMDAw
OTlGQUIgLyogSlNDYW52YXNSZW5kZXJpbmdDb250ZXh0Q3VzdG9tLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5RUVEMTREMTA1MTk3MUEwMDA5OUZB
QiAvKiBKU0NhbnZhc1JlbmRlcmluZ0NvbnRleHRDdXN0b20uY3BwICovOyB9OwogCQk0OUZGQkYx
RDExQzg1NTBFMDA2QTcxMTggLyogR3JhcGhpY3NDb250ZXh0M0RNYWMubW0gaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUZGQkYxQzExQzg1NTBFMDA2QTcx
MTggLyogR3JhcGhpY3NDb250ZXh0M0RNYWMubW0gKi87IH07CisJCTQ5RkZCRjNGMTFDOTNFRTMw
MDZBNzExOCAvKiBXZWJHTExheWVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA0OUZGQkYzRDExQzkzRUUzMDA2QTcxMTggLyogV2ViR0xMYXllci5oICov
OyB9OworCQk0OUZGQkY0MDExQzkzRUUzMDA2QTcxMTggLyogV2ViR0xMYXllci5tbSBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5RkZCRjNFMTFDOTNFRTMw
MDZBNzExOCAvKiBXZWJHTExheWVyLm1tICovOyB9OwogCQk0QThDOTZFQjBCRTY5MDMyMDA0RUVG
RjAgLyogU2VsZWN0aW9uQ29udHJvbGxlck1hYy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDRBOEM5NkVBMEJFNjkwMzIwMDRFRUZGMCAvKiBTZWxlY3Rp
b25Db250cm9sbGVyTWFjLm1tICovOyB9OwogCQk0QjI3MDhDNzBBRjE5RUU0MDA2NTEyN0YgLyog
UGFzdGVib2FyZC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNEIyNzA4QzUwQUYxOUVFNDAwNjUxMjdGIC8qIFBhc3RlYm9hcmQuaCAqLzsgfTsKIAkJNEIy
NzA5ODMwQUYyRTVFMDAwNjUxMjdGIC8qIFBhc3RlYm9hcmRNYWMubW0gaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0QjI3MDk4MTBBRjJFNUUwMDA2NTEyN0Yg
LyogUGFzdGVib2FyZE1hYy5tbSAqLzsgfTsKQEAgLTY0OTQsOCArNjQ5NCw2IEBACiAJCTQ5QzdC
OUM2MTA0MkQzMkYwMDA5RDQ0NyAvKiBXZWJHTFRleHR1cmUuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBuYW1lID0gV2ViR0xUZXh0dXJlLmg7IHBhdGggPSBjYW52YXMvV2ViR0xUZXh0dXJl
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQ5QzdCOUM3MTA0MkQzMkYwMDA5RDQ0
NyAvKiBXZWJHTFRleHR1cmUuaWRsICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IFdlYkdMVGV4dHVy
ZS5pZGw7IHBhdGggPSBjYW52YXMvV2ViR0xUZXh0dXJlLmlkbDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJNDlDN0I5RkIxMDQyRDM2NTAwMDlENDQ3IC8qIEdyYXBoaWNzQ29udGV4dDNE
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEdyYXBoaWNzQ29udGV4dDNELmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTQ5QzdCOUZEMTA0MkQzOEMwMDA5RDQ0NyAv
KiBDYW52YXMzRExheWVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENhbnZh
czNETGF5ZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJNDlDN0I5RkUxMDQyRDM4
QzAwMDlENDQ3IC8qIENhbnZhczNETGF5ZXIubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5v
YmpjcHA7IHBhdGggPSBDYW52YXMzRExheWVyLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk0OUM3QkE3ODEwNDJFRkFFMDAwOUQ0NDcgLyogT3BlbkdMLmZyYW1ld29yayAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3
b3JrOyBuYW1lID0gT3BlbkdMLmZyYW1ld29yazsgcGF0aCA9IC9TeXN0ZW0vTGlicmFyeS9GcmFt
ZXdvcmtzL09wZW5HTC5mcmFtZXdvcms7IHNvdXJjZVRyZWUgPSAiPGFic29sdXRlPiI7IH07CiAJ
CTQ5QzdCQThDMTA0MkY1QjEwMDA5RDQ0NyAvKiBKU0RvY3VtZW50Q3VzdG9tLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTRG9jdW1lbnRDdXN0b20uY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk0OUQ1REMyNzBGNDIzQTczMDA4RjIwRkQgLyogTWF0
cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBuYW1lID0gTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uY3BwOyBwYXRoID0gdHJhbnNmb3Jt
cy9NYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CkBAIC02NTgwLDYgKzY1NzgsOCBAQAogCQk0OUVFRDE0QzEwNTE5NzFBMDAwOTlGQUIgLyog
SlNXZWJHTFJlbmRlcmluZ0NvbnRleHRDdXN0b20uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gSlNXZWJHTFJlbmRlcmluZ0NvbnRleHRDdXN0b20uY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk0OUVFRDE0RDEwNTE5NzFBMDAwOTlGQUIgLyogSlNDYW52
YXNSZW5kZXJpbmdDb250ZXh0Q3VzdG9tLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IEpTQ2FudmFzUmVuZGVyaW5nQ29udGV4dEN1c3RvbS5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTQ5RkZCRjFDMTFDODU1MEUwMDZBNzExOCAvKiBHcmFwaGljc0Nv
bnRleHQzRE1hYy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgbmFtZSA9IEdy
YXBoaWNzQ29udGV4dDNETWFjLm1tOyBwYXRoID0gLi4vLi4vLi4vV2ViS2l0L09wZW5Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMubW07IHNv
dXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKKwkJNDlGRkJGM0QxMUM5M0VFMzAwNkE3MTE4IC8q
IFdlYkdMTGF5ZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gV2ViR0xMYXll
ci5oOyBwYXRoID0gLi4vLi4vLi4vV2ViS2l0L09wZW5Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9tYWMvV2ViR0xMYXllci5oOyBzb3VyY2VUcmVlID0gU09VUkNFX1JPT1Q7IH07CisJ
CTQ5RkZCRjNFMTFDOTNFRTMwMDZBNzExOCAvKiBXZWJHTExheWVyLm1tICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAub2JqY3BwOyBuYW1lID0gV2ViR0xMYXllci5tbTsgcGF0aCA9IC4uLy4uLy4u
L1dlYktpdC9PcGVuU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkdMTGF5
ZXIubW07IHNvdXJjZVRyZWUgPSBTT1VSQ0VfUk9PVDsgfTsKIAkJNEE4Qzk2RUEwQkU2OTAzMjAw
NEVFRkYwIC8qIFNlbGVjdGlvbkNvbnRyb2xsZXJNYWMubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAub2JqY3BwOyBuYW1lID0gU2VsZWN0aW9uQ29udHJvbGxlck1hYy5tbTsgcGF0aCA9IG1h
Yy9TZWxlY3Rpb25Db250cm9sbGVyTWFjLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQk0QjI3MDhDNTBBRjE5RUU0MDA2NTEyN0YgLyogUGFzdGVib2FyZC5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBQYXN0ZWJvYXJkLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCTRCMjcwOTgxMEFGMkU1RTAwMDY1MTI3RiAvKiBQYXN0ZWJvYXJkTWFjLm1tICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gUGFzdGVib2FyZE1hYy5tbTsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE1MDU4LDggKzE1MDU4LDYgQEAKIAkJQjI3NTM1
NDkwQjA1MzgxNDAwMkNFNjRGIC8qIG1hYyAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJ
Y2hpbGRyZW4gPSAoCi0JCQkJNDlDN0I5RkQxMDQyRDM4QzAwMDlENDQ3IC8qIENhbnZhczNETGF5
ZXIuaCAqLywKLQkJCQk0OUM3QjlGRTEwNDJEMzhDMDAwOUQ0NDcgLyogQ2FudmFzM0RMYXllci5t
bSAqLywKIAkJCQlFREUzQTRGRjBDN0E0MzA2MDA5NTZBMzcgLyogQ29sb3JNYWMuaCAqLywKIAkJ
CQlCMjc1MzU0QTBCMDUzODE0MDAyQ0U2NEYgLyogQ29sb3JNYWMubW0gKi8sCiAJCQkJMzdDMjM2
MEUxMDk3RUU3NzAwRUY5RjcyIC8qIENvbXBsZXhUZXh0Q29udHJvbGxlci5jcHAgKi8sCkBAIC0x
NTA5Miw2ICsxNTA5MCw4IEBACiAJCQkJMTYzRThCMTIxMThCM0FERDAwRUQ5MjMxIC8qIFNpbXBs
ZUZvbnREYXRhQVRTVUkubW0gKi8sCiAJCQkJMTYzRTg4RjUxMThBMzlEMjAwRUQ5MjMxIC8qIFNp
bXBsZUZvbnREYXRhQ29yZVRleHQuY3BwICovLAogCQkJCUIyQUZGQzc3MEQwMEE1QzEwMDMwMDc0
RCAvKiBTaW1wbGVGb250RGF0YU1hYy5tbSAqLywKKwkJCQk0OUZGQkYzRDExQzkzRUUzMDA2QTcx
MTggLyogV2ViR0xMYXllci5oICovLAorCQkJCTQ5RkZCRjNFMTFDOTNFRTMwMDZBNzExOCAvKiBX
ZWJHTExheWVyLm1tICovLAogCQkJCTBGQ0YzMzJCMEYyQjlBMjUwMDRCNjc5NSAvKiBXZWJMYXll
ci5oICovLAogCQkJCTBGQ0YzMzJBMEYyQjlBMjUwMDRCNjc5NSAvKiBXZWJMYXllci5tbSAqLywK
IAkJCQkwRkNGMzMyOTBGMkI5QTI1MDA0QjY3OTUgLyogV2ViVGlsZWRMYXllci5oICovLApAQCAt
MTY5MzEsNyArMTY5MzEsNiBAQAogCQkJCUJDQjE2QzI2MDk3OUMzQkQwMDQ2Nzc0MSAvKiBDYWNo
ZWRYQkxEb2N1bWVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNCMTZDMjgwOTc5QzNCRDAwNDY3
NzQxIC8qIENhY2hlZFhTTFN0eWxlU2hlZXQuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OTUw
MDgyNDVFNTkwMDFFOUFCQyAvKiBDYWNoZVBvbGljeS5oIGluIEhlYWRlcnMgKi8sCi0JCQkJNDlD
N0JBMDAxMDQyRDM4QzAwMDlENDQ3IC8qIENhbnZhczNETGF5ZXIuaCBpbiBIZWFkZXJzICovLAog
CQkJCTZFNEU5MUFEMTBGN0ZCMzEwMEEyNzc5QyAvKiBDYW52YXNDb250ZXh0QXR0cmlidXRlcy5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJNDk0ODRGQzIxMDJDRjIzQzAwMTg3REQzIC8qIENhbnZhc0dy
YWRpZW50LmggaW4gSGVhZGVycyAqLywKIAkJCQk0OUM3QjlENTEwNDJEMzJGMDAwOUQ0NDcgLyog
Q2FudmFzT2JqZWN0LmggaW4gSGVhZGVycyAqLywKQEAgLTE5NDI1LDYgKzE5NDI0LDcgQEAKIAkJ
CQk4MTZDODA2OTExQkU4ODdFMDA5QTQ1RTkgLyogSURCS2V5UmFuZ2UuaCBpbiBIZWFkZXJzICov
LAogCQkJCTgxNkM4MEFGMTFCRTk5MEQwMDlBNDVFOSAvKiBKU0lEQktleVJhbmdlLmggaW4gSGVh
ZGVycyAqLywKIAkJCQkwODUzRDczNDExQzkxMDkwMDBCMkZENDIgLyogU1ZHVGV4dFF1ZXJ5Lmgg
aW4gSGVhZGVycyAqLywKKwkJCQk0OUZGQkYzRjExQzkzRUUzMDA2QTcxMTggLyogV2ViR0xMYXll
ci5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJv
Y2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xOTc2Miw3ICsxOTc2Miw2IEBACiAJCQkJQkNCMTZDMjMw
OTc5QzNCRDAwNDY3NzQxIC8qIENhY2hlZFNjcmlwdC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlC
Q0IxNkMyNTA5NzlDM0JEMDA0Njc3NDEgLyogQ2FjaGVkWEJMRG9jdW1lbnQuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQkNCMTZDMjcwOTc5QzNCRDAwNDY3NzQxIC8qIENhY2hlZFhTTFN0eWxlU2hl
ZXQuY3BwIGluIFNvdXJjZXMgKi8sCi0JCQkJNDlDN0JBMDExMDQyRDM4QzAwMDlENDQ3IC8qIENh
bnZhczNETGF5ZXIubW0gaW4gU291cmNlcyAqLywKIAkJCQk2RTRFOTFBQzEwRjdGQjMxMDBBMjc3
OUMgLyogQ2FudmFzQ29udGV4dEF0dHJpYnV0ZXMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNDk0
ODRGQzExMDJDRjIzQzAwMTg3REQzIC8qIENhbnZhc0dyYWRpZW50LmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTQ5QzdCOUQ0MTA0MkQzMkYwMDA5RDQ0NyAvKiBDYW52YXNPYmplY3QuY3BwIGluIFNv
dXJjZXMgKi8sCkBAIC0yMTczMiw2ICsyMTczMSw3IEBACiAJCQkJNDlGRkJGMUQxMUM4NTUwRTAw
NkE3MTE4IC8qIEdyYXBoaWNzQ29udGV4dDNETWFjLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJMDg1
M0Q3MzIxMUM5MTA5MDAwQjJGRDQyIC8qIFNWR1RleHRDaHVua0xheW91dEluZm8uY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJMDg1M0Q3MzMxMUM5MTA5MDAwQjJGRDQyIC8qIFNWR1RleHRRdWVyeS5j
cHAgaW4gU291cmNlcyAqLywKKwkJCQk0OUZGQkY0MDExQzkzRUUzMDA2QTcxMTggLyogV2ViR0xM
YXllci5tbSBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9z
dHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvQ2FudmFzM0RMYXllci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL0NhbnZhczNETGF5ZXIuaAkocmV2aXNpb24gNjEyNjIpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL21hYy9DYW52YXMzRExheWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNTQg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAotICovCi0KLSNpZm5kZWYgQ2FudmFzM0RMYXllcl9oCi0jZGVmaW5lIENhbnZh
czNETGF5ZXJfaAotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotCi0jaW1wb3J0
ICJXZWJMYXllci5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0gICAgY2xhc3MgR3JhcGhpY3NM
YXllcjsKLSAgICBjbGFzcyBHcmFwaGljc0NvbnRleHQzRDsKLX0KLQotQGludGVyZmFjZSBDYW52
YXMzRExheWVyIDogQ0FPcGVuR0xMYXllciAKLXsKLSAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVy
KiBtX2xheWVyT3duZXI7Ci0gICAgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0QqIG1fY29udGV4
dDsKLSAgICBDR0xDb250ZXh0T2JqIG1fY29udGV4dE9iajsKLSAgICBHTHVpbnQgbV90ZXh0dXJl
OwotfQotCi0tIChpZClpbml0V2l0aENvbnRleHQ6KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
Kiljb250ZXh0OwotCi0tIChDR0ltYWdlUmVmKWNvcHlJbWFnZVNuYXBzaG90V2l0aENvbG9yU3Bh
Y2U6KENHQ29sb3JTcGFjZVJlZiljb2xvclNwYWNlOwotCi1AZW5kCi0KLSNlbmRpZiAvLyBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0KLSNlbmRpZiAvLyBDYW52YXMzRExheWVyX2gKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0NhbnZhczNETGF5ZXIubW0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvQ2FudmFzM0RMYXllci5tbQko
cmV2aXNpb24gNjEyNjIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9DYW52YXMz
RExheWVyLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
Ci0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAq
Ci0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
LSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKi8KLQotI2lu
Y2x1ZGUgImNvbmZpZy5oIgotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotI2lm
IEVOQUJMRSgzRF9DQU5WQVMpCi0KLSNpbXBvcnQgIkNhbnZhczNETGF5ZXIuaCIKLQotI2ltcG9y
dCAiR3JhcGhpY3NMYXllci5oIgotI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+Ci0j
aW1wb3J0IDxPcGVuR0wvT3BlbkdMLmg+Ci0jaW1wb3J0IDx3dGYvRmFzdE1hbGxvYy5oPgotI2lt
cG9ydCA8d3RmL1JldGFpblB0ci5oPgotI2ltcG9ydCA8d3RmL1VudXNlZFBhcmFtLmg+Ci0KLXVz
aW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1AaW1wbGVtZW50YXRpb24gQ2FudmFzM0RMYXllcgot
Ci0tKGlkKWluaXRXaXRoQ29udGV4dDooR3JhcGhpY3NDb250ZXh0M0QqKWNvbnRleHQKLXsKLSAg
ICBtX2NvbnRleHQgPSBjb250ZXh0OwotICAgIG1fY29udGV4dE9iaiA9IHN0YXRpY19jYXN0PENH
TENvbnRleHRPYmo+KGNvbnRleHQtPnBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoKSk7Ci0gICAg
bV90ZXh0dXJlID0gc3RhdGljX2Nhc3Q8R0x1aW50Pihjb250ZXh0LT5wbGF0Zm9ybVRleHR1cmUo
KSk7Ci0gICAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgICByZXR1cm4gc2VsZjsKLX0KLQotLShD
R0xQaXhlbEZvcm1hdE9iailjb3B5Q0dMUGl4ZWxGb3JtYXRGb3JEaXNwbGF5TWFzazoodWludDMy
X3QpbWFzawotewotICAgIC8vIEZJWE1FOiBUaGUgbWFzayBwYXJhbSB0ZWxscyB5b3Ugd2hpY2gg
ZGlzcGxheSAob24gYSBtdWx0aS1kaXNwbGF5IHN5c3RlbSkKLSAgICAvLyBpcyB0byBiZSB1c2Vk
LiBCdXQgc2luY2Ugd2UgYXJlIG5vdyBnZXR0aW5nIHRoZSBwaXhlbCBmb3JtYXQgZnJvbSB0aGUg
Ci0gICAgLy8gQ2FudmFzIENHTCBjb250ZXh0LCB3ZSBkb24ndCB1c2UgaXQuIFRoaXMgc2VlbXMg
dG8gZG8gdGhlIHJpZ2h0IHRoaW5nIG9uCi0gICAgLy8gb25lIG11bHRpLWRpc3BsYXkgc3lzdGVt
LiBCdXQgdGhlcmUgbWF5IGJlIGNhc2VzIHdoZXJlIHRoaXMgaXMgbm90IHRoZSBjYXNlLgotICAg
IC8vIElmIG5lZWRlZCB3ZSB3aWxsIGhhdmUgdG8gc2V0IHRoZSBkaXNwbGF5IG1hc2sgaW4gdGhl
IENhbnZhcyBDR0xDb250ZXh0IGFuZAotICAgIC8vIG1ha2Ugc3VyZSBpdCBtYXRjaGVzLgotICAg
IFVOVVNFRF9QQVJBTShtYXNrKTsKLSAgICByZXR1cm4gQ0dMUmV0YWluUGl4ZWxGb3JtYXQoQ0dM
R2V0UGl4ZWxGb3JtYXQobV9jb250ZXh0T2JqKSk7Ci19Ci0KLS0oQ0dMQ29udGV4dE9iailjb3B5
Q0dMQ29udGV4dEZvclBpeGVsRm9ybWF0OihDR0xQaXhlbEZvcm1hdE9iailwaXhlbEZvcm1hdAot
ewotICAgIENHTENvbnRleHRPYmogY29udGV4dE9iajsKLSAgICBDR0xDcmVhdGVDb250ZXh0KHBp
eGVsRm9ybWF0LCBtX2NvbnRleHRPYmosICZjb250ZXh0T2JqKTsKLSAgICByZXR1cm4gY29udGV4
dE9iajsKLX0KLQotLSh2b2lkKWRyYXdJbkNHTENvbnRleHQ6KENHTENvbnRleHRPYmopZ2xDb250
ZXh0IHBpeGVsRm9ybWF0OihDR0xQaXhlbEZvcm1hdE9iailwaXhlbEZvcm1hdCBmb3JMYXllclRp
bWU6KENGVGltZUludGVydmFsKXRpbWVJbnRlcnZhbCBkaXNwbGF5VGltZTooY29uc3QgQ1ZUaW1l
U3RhbXAgKil0aW1lU3RhbXAKLXsKLSAgICBtX2NvbnRleHQtPnByZXBhcmVUZXh0dXJlKCk7Ci0K
LSAgICBDR0xTZXRDdXJyZW50Q29udGV4dChnbENvbnRleHQpOwotCi0gICAgQ0dSZWN0IGZyYW1l
ID0gW3NlbGYgZnJhbWVdOwotICAgICAgICAKLSAgICAvLyBkcmF3IHRoZSBGQk8gaW50byB0aGUg
bGF5ZXIKLSAgICBnbFZpZXdwb3J0KDAsIDAsIGZyYW1lLnNpemUud2lkdGgsIGZyYW1lLnNpemUu
aGVpZ2h0KTsKLSAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgZ2xMb2FkSWRl
bnRpdHkoKTsKLSAgICBnbE9ydGhvKC0xLCAxLCAtMSwgMSwgLTEsIDEpOwotICAgIGdsTWF0cml4
TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0KLSAgICBnbEVuYWJs
ZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4
dHVyZSk7Ci0gICAgCi0gICAgZ2xCZWdpbihHTF9UUklBTkdMRV9GQU4pOwotICAgICAgICBnbFRl
eENvb3JkMmYoMCwgMCk7Ci0gICAgICAgIGdsVmVydGV4MmYoLTEsIC0xKTsKLSAgICAgICAgZ2xU
ZXhDb29yZDJmKDEsIDApOwotICAgICAgICBnbFZlcnRleDJmKDEsIC0xKTsKLSAgICAgICAgZ2xU
ZXhDb29yZDJmKDEsIDEpOwotICAgICAgICBnbFZlcnRleDJmKDEsIDEpOwotICAgICAgICBnbFRl
eENvb3JkMmYoMCwgMSk7Ci0gICAgICAgIGdsVmVydGV4MmYoLTEsIDEpOwotICAgIGdsRW5kKCk7
Ci0gICAgCi0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICBnbERpc2Fi
bGUoR0xfVEVYVFVSRV8yRCk7Ci0KLSAgICAvLyBDYWxsIHN1cGVyIHRvIGZpbmFsaXplIHRoZSBk
cmF3aW5nLiBCeSBkZWZhdWx0IGFsbCBpdCBkb2VzIGlzIGNhbGwgZ2xGbHVzaCgpLgotICAgIFtz
dXBlciBkcmF3SW5DR0xDb250ZXh0OmdsQ29udGV4dCBwaXhlbEZvcm1hdDpwaXhlbEZvcm1hdCBm
b3JMYXllclRpbWU6dGltZUludGVydmFsIGRpc3BsYXlUaW1lOnRpbWVTdGFtcF07Ci19Ci0KLXN0
YXRpYyB2b2lkIGZyZWVEYXRhKHZvaWQgKiwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IC8qIHNp
emUgKi8pCi17Ci0gICAgZmFzdEZyZWUoY29uc3RfY2FzdDx2b2lkICo+KGRhdGEpKTsKLX0KLQot
LShDR0ltYWdlUmVmKWNvcHlJbWFnZVNuYXBzaG90V2l0aENvbG9yU3BhY2U6KENHQ29sb3JTcGFj
ZVJlZiljb2xvclNwYWNlCi17Ci0gICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2Jq
KTsKLQotICAgIFJldGFpblB0cjxDR0NvbG9yU3BhY2VSZWY+IGltYWdlQ29sb3JTcGFjZSA9IGNv
bG9yU3BhY2U7Ci0gICAgaWYgKCFpbWFnZUNvbG9yU3BhY2UpCi0gICAgICAgIGltYWdlQ29sb3JT
cGFjZS5hZG9wdENGKENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpKTsKLQotICAgIENHUmVj
dCBsYXllckJvdW5kcyA9IENHUmVjdEludGVncmFsKFtzZWxmIGJvdW5kc10pOwotICAgIAotICAg
IHNpemVfdCB3aWR0aCA9IGxheWVyQm91bmRzLnNpemUud2lkdGg7Ci0gICAgc2l6ZV90IGhlaWdo
dCA9IGxheWVyQm91bmRzLnNpemUuaGVpZ2h0OwotCi0gICAgc2l6ZV90IHJvd0J5dGVzID0gKHdp
ZHRoICogNCArIDE1KSAmIH4xNTsKLSAgICBzaXplX3QgZGF0YVNpemUgPSByb3dCeXRlcyAqIGhl
aWdodDsKLSAgICB2b2lkKiBkYXRhID0gZmFzdE1hbGxvYyhkYXRhU2l6ZSk7Ci0gICAgaWYgKCFk
YXRhKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19ST1df
TEVOR1RILCByb3dCeXRlcyAvIDQpOwotICAgIGdsUmVhZFBpeGVscygwLCAwLCB3aWR0aCwgaGVp
Z2h0LCBHTF9CR1JBLCBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYsIGRhdGEpOwotCi0gICAg
Q0dEYXRhUHJvdmlkZXJSZWYgcHJvdmlkZXIgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRh
KDAsIGRhdGEsIGRhdGFTaXplLCBmcmVlRGF0YSk7Ci0gICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENH
SW1hZ2VDcmVhdGUod2lkdGgsIGhlaWdodCwgOCwgMzIsIHJvd0J5dGVzLCBpbWFnZUNvbG9yU3Bh
Y2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAga0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCB8IGtDR0JpdG1hcEJ5dGVPcmRlcjMy
SG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
cm92aWRlciwgMCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBrQ0dSZW5kZXJpbmdJbnRlbnREZWZhdWx0KTsKLSAgICBDR0RhdGFQcm92aWRl
clJlbGVhc2UocHJvdmlkZXIpOwotICAgIHJldHVybiBpbWFnZTsKLX0KLQotLSAodm9pZClkaXNw
bGF5Ci17Ci0gICAgW3N1cGVyIGRpc3BsYXldOwotICAgIGlmIChtX2xheWVyT3duZXIpCi0gICAg
ICAgIG1fbGF5ZXJPd25lci0+ZGlkRGlzcGxheShzZWxmKTsKLX0KLQotQGVuZAotCi1AaW1wbGVt
ZW50YXRpb24gQ2FudmFzM0RMYXllcihXZWJMYXllckFkZGl0aW9ucykKLQotLSh2b2lkKXNldExh
eWVyT3duZXI6KEdyYXBoaWNzTGF5ZXIqKWFMYXllcgotewotICAgIG1fbGF5ZXJPd25lciA9IGFM
YXllcjsKLX0KLQotLShHcmFwaGljc0xheWVyKilsYXllck93bmVyCi17Ci0gICAgcmV0dXJuIG1f
bGF5ZXJPd25lcjsKLX0KLQotQGVuZAotCi0jZW5kaWYgLy8gRU5BQkxFKDNEX0NBTlZBUykKLSNl
bmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EubW0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1tCShyZXZpc2lvbiA2MTI2
MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbQko
d29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsNyBAQAogI2ltcG9ydCAiQW5pbWF0aW9uLmgiCiAj
aW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKICNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotI2ltcG9y
dCAiQ2FudmFzM0RMYXllci5oIgorI2ltcG9ydCAiV2ViR0xMYXllci5oIgogI2VuZGlmCiAjaW1w
b3J0ICJGbG9hdENvbnZlcnNpb24uaCIKICNpbXBvcnQgIkZsb2F0UmVjdC5oIgpAQCAtMTczMyw3
ICsxNzMzLDcgQEAgdm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENvbnRlbnRzVG9HcmFwaAogCiAg
ICAgaWYgKG1fcGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCAhPSBOdWxsUGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQzRCAmJiBtX3BsYXRmb3JtVGV4dHVyZSAhPSBOdWxsUGxhdGZvcm0zRE9iamVjdCkg
ewogICAgICAgICAvLyBjcmVhdGUgdGhlIGlubmVyIDNkIGxheWVyCi0gICAgICAgIG1fY29udGVu
dHNMYXllci5hZG9wdE5TKFtbQ2FudmFzM0RMYXllciBhbGxvY10gaW5pdFdpdGhDb250ZXh0OmNv
bnN0X2Nhc3Q8R3JhcGhpY3NDb250ZXh0M0QqPihncmFwaGljc0NvbnRleHQzRCldKTsKKyAgICAg
ICAgbV9jb250ZW50c0xheWVyLmFkb3B0TlMoW1tXZWJHTExheWVyIGFsbG9jXSBpbml0V2l0aENv
bnRleHQ6Y29uc3RfY2FzdDxHcmFwaGljc0NvbnRleHQzRCo+KGdyYXBoaWNzQ29udGV4dDNEKV0p
OwogI2lmbmRlZiBOREVCVUcKICAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXROYW1l
OkAiM0QgTGF5ZXIiXTsKICNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvV2ViR0xMYXllci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL1dlYkdMTGF5ZXIuaAkocmV2aXNpb24gNjEyNjIpCShmcm9tIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL0NhbnZhczNETGF5ZXIuaDo2MTI2MikKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL1dlYkdMTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBDYW52YXMzRExheWVyX2gKKyNkZWZpbmUgQ2FudmFzM0RMYXll
cl9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNpbXBvcnQgIldlYkxh
eWVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBjbGFzcyBHcmFwaGljc0xheWVyOwor
ICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDNEOworfQorCitAaW50ZXJmYWNlIENhbnZhczNETGF5
ZXIgOiBDQU9wZW5HTExheWVyIAoreworICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqIG1fbGF5
ZXJPd25lcjsKKyAgICBXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRCogbV9jb250ZXh0OworICAg
IENHTENvbnRleHRPYmogbV9jb250ZXh0T2JqOworICAgIEdMdWludCBtX3RleHR1cmU7Cit9CisK
Ky0gKGlkKWluaXRXaXRoQ29udGV4dDooV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0QqKWNvbnRl
eHQ7CisKKy0gKENHSW1hZ2VSZWYpY29weUltYWdlU25hcHNob3RXaXRoQ29sb3JTcGFjZTooQ0dD
b2xvclNwYWNlUmVmKWNvbG9yU3BhY2U7CisKK0BlbmQKKworI2VuZGlmIC8vIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKworI2VuZGlmIC8vIENhbnZhczNETGF5ZXJfaApJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViR0xMYXllci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkdMTGF5ZXIuaAkocmV2aXNpb24gNjEyNjIp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJHTExheWVyLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTIzLDggKzIzLDggQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAogICovCiAKLSNpZm5kZWYg
Q2FudmFzM0RMYXllcl9oCi0jZGVmaW5lIENhbnZhczNETGF5ZXJfaAorI2lmbmRlZiBXZWJHTExh
eWVyX2gKKyNkZWZpbmUgV2ViR0xMYXllcl9oCiAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCiAKQEAgLTM1LDcgKzM1LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIGNsYXNz
IEdyYXBoaWNzQ29udGV4dDNEOwogfQogCi1AaW50ZXJmYWNlIENhbnZhczNETGF5ZXIgOiBDQU9w
ZW5HTExheWVyIAorQGludGVyZmFjZSBXZWJHTExheWVyIDogQ0FPcGVuR0xMYXllciAKIHsKICAg
ICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX2xheWVyT3duZXI7CiAgICAgV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0QqIG1fY29udGV4dDsKQEAgLTUxLDQgKzUxLDQgQEAgQGludGVyZmFjZSBD
YW52YXMzRExheWVyIDogQ0FPcGVuR0xMYXllcgogCiAjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQogCi0jZW5kaWYgLy8gQ2FudmFzM0RMYXllcl9oCisjZW5kaWYgLy8gV2Vi
R0xMYXllcl9oCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJHTExheWVy
Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkdMTGF5
ZXIubW0JKHJldmlzaW9uIDYxMjYyKQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21h
Yy9DYW52YXMzRExheWVyLm1tOjYxMjYyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvV2ViR0xMYXllci5tbQkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyNpZiBFTkFCTEUoM0RfQ0FOVkFTKQorCisjaW1wb3J0ICJDYW52YXMzRExheWVyLmgiCisK
KyNpbXBvcnQgIkdyYXBoaWNzTGF5ZXIuaCIKKyNpbXBvcnQgPFF1YXJ0ekNvcmUvUXVhcnR6Q29y
ZS5oPgorI2ltcG9ydCA8T3BlbkdML09wZW5HTC5oPgorI2ltcG9ydCA8d3RmL0Zhc3RNYWxsb2Mu
aD4KKyNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KKyNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5o
PgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworQGltcGxlbWVudGF0aW9uIENhbnZhczNE
TGF5ZXIKKworLShpZClpbml0V2l0aENvbnRleHQ6KEdyYXBoaWNzQ29udGV4dDNEKiljb250ZXh0
Cit7CisgICAgbV9jb250ZXh0ID0gY29udGV4dDsKKyAgICBtX2NvbnRleHRPYmogPSBzdGF0aWNf
Y2FzdDxDR0xDb250ZXh0T2JqPihjb250ZXh0LT5wbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCkp
OworICAgIG1fdGV4dHVyZSA9IHN0YXRpY19jYXN0PEdMdWludD4oY29udGV4dC0+cGxhdGZvcm1U
ZXh0dXJlKCkpOworICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgICAgcmV0dXJuIHNlbGY7Cit9
CisKKy0oQ0dMUGl4ZWxGb3JtYXRPYmopY29weUNHTFBpeGVsRm9ybWF0Rm9yRGlzcGxheU1hc2s6
KHVpbnQzMl90KW1hc2sKK3sKKyAgICAvLyBGSVhNRTogVGhlIG1hc2sgcGFyYW0gdGVsbHMgeW91
IHdoaWNoIGRpc3BsYXkgKG9uIGEgbXVsdGktZGlzcGxheSBzeXN0ZW0pCisgICAgLy8gaXMgdG8g
YmUgdXNlZC4gQnV0IHNpbmNlIHdlIGFyZSBub3cgZ2V0dGluZyB0aGUgcGl4ZWwgZm9ybWF0IGZy
b20gdGhlIAorICAgIC8vIENhbnZhcyBDR0wgY29udGV4dCwgd2UgZG9uJ3QgdXNlIGl0LiBUaGlz
IHNlZW1zIHRvIGRvIHRoZSByaWdodCB0aGluZyBvbgorICAgIC8vIG9uZSBtdWx0aS1kaXNwbGF5
IHN5c3RlbS4gQnV0IHRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSB0aGlzIGlzIG5vdCB0aGUgY2Fz
ZS4KKyAgICAvLyBJZiBuZWVkZWQgd2Ugd2lsbCBoYXZlIHRvIHNldCB0aGUgZGlzcGxheSBtYXNr
IGluIHRoZSBDYW52YXMgQ0dMQ29udGV4dCBhbmQKKyAgICAvLyBtYWtlIHN1cmUgaXQgbWF0Y2hl
cy4KKyAgICBVTlVTRURfUEFSQU0obWFzayk7CisgICAgcmV0dXJuIENHTFJldGFpblBpeGVsRm9y
bWF0KENHTEdldFBpeGVsRm9ybWF0KG1fY29udGV4dE9iaikpOworfQorCistKENHTENvbnRleHRP
YmopY29weUNHTENvbnRleHRGb3JQaXhlbEZvcm1hdDooQ0dMUGl4ZWxGb3JtYXRPYmopcGl4ZWxG
b3JtYXQKK3sKKyAgICBDR0xDb250ZXh0T2JqIGNvbnRleHRPYmo7CisgICAgQ0dMQ3JlYXRlQ29u
dGV4dChwaXhlbEZvcm1hdCwgbV9jb250ZXh0T2JqLCAmY29udGV4dE9iaik7CisgICAgcmV0dXJu
IGNvbnRleHRPYmo7Cit9CisKKy0odm9pZClkcmF3SW5DR0xDb250ZXh0OihDR0xDb250ZXh0T2Jq
KWdsQ29udGV4dCBwaXhlbEZvcm1hdDooQ0dMUGl4ZWxGb3JtYXRPYmopcGl4ZWxGb3JtYXQgZm9y
TGF5ZXJUaW1lOihDRlRpbWVJbnRlcnZhbCl0aW1lSW50ZXJ2YWwgZGlzcGxheVRpbWU6KGNvbnN0
IENWVGltZVN0YW1wICopdGltZVN0YW1wCit7CisgICAgbV9jb250ZXh0LT5wcmVwYXJlVGV4dHVy
ZSgpOworCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQoZ2xDb250ZXh0KTsKKworICAgIENHUmVj
dCBmcmFtZSA9IFtzZWxmIGZyYW1lXTsKKyAgICAgICAgCisgICAgLy8gZHJhdyB0aGUgRkJPIGlu
dG8gdGhlIGxheWVyCisgICAgZ2xWaWV3cG9ydCgwLCAwLCBmcmFtZS5zaXplLndpZHRoLCBmcmFt
ZS5zaXplLmhlaWdodCk7CisgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgIGds
TG9hZElkZW50aXR5KCk7CisgICAgZ2xPcnRobygtMSwgMSwgLTEsIDEsIC0xLCAxKTsKKyAgICBn
bE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgICBnbExvYWRJZGVudGl0eSgpOworCisgICAg
Z2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJE
LCBtX3RleHR1cmUpOworICAgIAorICAgIGdsQmVnaW4oR0xfVFJJQU5HTEVfRkFOKTsKKyAgICAg
ICAgZ2xUZXhDb29yZDJmKDAsIDApOworICAgICAgICBnbFZlcnRleDJmKC0xLCAtMSk7CisgICAg
ICAgIGdsVGV4Q29vcmQyZigxLCAwKTsKKyAgICAgICAgZ2xWZXJ0ZXgyZigxLCAtMSk7CisgICAg
ICAgIGdsVGV4Q29vcmQyZigxLCAxKTsKKyAgICAgICAgZ2xWZXJ0ZXgyZigxLCAxKTsKKyAgICAg
ICAgZ2xUZXhDb29yZDJmKDAsIDEpOworICAgICAgICBnbFZlcnRleDJmKC0xLCAxKTsKKyAgICBn
bEVuZCgpOworICAgIAorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAg
Z2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOworCisgICAgLy8gQ2FsbCBzdXBlciB0byBmaW5hbGl6
ZSB0aGUgZHJhd2luZy4gQnkgZGVmYXVsdCBhbGwgaXQgZG9lcyBpcyBjYWxsIGdsRmx1c2goKS4K
KyAgICBbc3VwZXIgZHJhd0luQ0dMQ29udGV4dDpnbENvbnRleHQgcGl4ZWxGb3JtYXQ6cGl4ZWxG
b3JtYXQgZm9yTGF5ZXJUaW1lOnRpbWVJbnRlcnZhbCBkaXNwbGF5VGltZTp0aW1lU3RhbXBdOwor
fQorCitzdGF0aWMgdm9pZCBmcmVlRGF0YSh2b2lkICosIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVf
dCAvKiBzaXplICovKQoreworICAgIGZhc3RGcmVlKGNvbnN0X2Nhc3Q8dm9pZCAqPihkYXRhKSk7
Cit9CisKKy0oQ0dJbWFnZVJlZiljb3B5SW1hZ2VTbmFwc2hvdFdpdGhDb2xvclNwYWNlOihDR0Nv
bG9yU3BhY2VSZWYpY29sb3JTcGFjZQoreworICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29u
dGV4dE9iaik7CisKKyAgICBSZXRhaW5QdHI8Q0dDb2xvclNwYWNlUmVmPiBpbWFnZUNvbG9yU3Bh
Y2UgPSBjb2xvclNwYWNlOworICAgIGlmICghaW1hZ2VDb2xvclNwYWNlKQorICAgICAgICBpbWFn
ZUNvbG9yU3BhY2UuYWRvcHRDRihDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKSk7CisKKyAg
ICBDR1JlY3QgbGF5ZXJCb3VuZHMgPSBDR1JlY3RJbnRlZ3JhbChbc2VsZiBib3VuZHNdKTsKKyAg
ICAKKyAgICBzaXplX3Qgd2lkdGggPSBsYXllckJvdW5kcy5zaXplLndpZHRoOworICAgIHNpemVf
dCBoZWlnaHQgPSBsYXllckJvdW5kcy5zaXplLmhlaWdodDsKKworICAgIHNpemVfdCByb3dCeXRl
cyA9ICh3aWR0aCAqIDQgKyAxNSkgJiB+MTU7CisgICAgc2l6ZV90IGRhdGFTaXplID0gcm93Qnl0
ZXMgKiBoZWlnaHQ7CisgICAgdm9pZCogZGF0YSA9IGZhc3RNYWxsb2MoZGF0YVNpemUpOworICAg
IGlmICghZGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1BB
Q0tfUk9XX0xFTkdUSCwgcm93Qnl0ZXMgLyA0KTsKKyAgICBnbFJlYWRQaXhlbHMoMCwgMCwgd2lk
dGgsIGhlaWdodCwgR0xfQkdSQSwgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWLCBkYXRhKTsK
KworICAgIENHRGF0YVByb3ZpZGVyUmVmIHByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVX
aXRoRGF0YSgwLCBkYXRhLCBkYXRhU2l6ZSwgZnJlZURhdGEpOworICAgIENHSW1hZ2VSZWYgaW1h
Z2UgPSBDR0ltYWdlQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIDgsIDMyLCByb3dCeXRlcywgaW1hZ2VD
b2xvclNwYWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QgfCBrQ0dCaXRtYXBCeXRl
T3JkZXIzMkhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcHJvdmlkZXIsIDAsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAga0NHUmVuZGVyaW5nSW50ZW50RGVmYXVsdCk7CisgICAgQ0dEYXRh
UHJvdmlkZXJSZWxlYXNlKHByb3ZpZGVyKTsKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKKy0gKHZv
aWQpZGlzcGxheQoreworICAgIFtzdXBlciBkaXNwbGF5XTsKKyAgICBpZiAobV9sYXllck93bmVy
KQorICAgICAgICBtX2xheWVyT3duZXItPmRpZERpc3BsYXkoc2VsZik7Cit9CisKK0BlbmQKKwor
QGltcGxlbWVudGF0aW9uIENhbnZhczNETGF5ZXIoV2ViTGF5ZXJBZGRpdGlvbnMpCisKKy0odm9p
ZClzZXRMYXllck93bmVyOihHcmFwaGljc0xheWVyKilhTGF5ZXIKK3sKKyAgICBtX2xheWVyT3du
ZXIgPSBhTGF5ZXI7Cit9CisKKy0oR3JhcGhpY3NMYXllciopbGF5ZXJPd25lcgoreworICAgIHJl
dHVybiBtX2xheWVyT3duZXI7Cit9CisKK0BlbmQKKworI2VuZGlmIC8vIEVOQUJMRSgzRF9DQU5W
QVMpCisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViR0xMYXllci5tbQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJHTExheWVyLm1tCShyZXZpc2lvbiA2MTI2MikK
KysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkdMTGF5ZXIubW0JKHdvcmtpbmcg
Y29weSkKQEAgLTI4LDcgKzI4LDcgQEAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKIAotI2ltcG9ydCAiQ2FudmFzM0RMYXllci5oIgorI2lt
cG9ydCAiV2ViR0xMYXllci5oIgogCiAjaW1wb3J0ICJHcmFwaGljc0xheWVyLmgiCiAjaW1wb3J0
IDxRdWFydHpDb3JlL1F1YXJ0ekNvcmUuaD4KQEAgLTM5LDcgKzM5LDcgQEAKIAogdXNpbmcgbmFt
ZXNwYWNlIFdlYkNvcmU7CiAKLUBpbXBsZW1lbnRhdGlvbiBDYW52YXMzRExheWVyCitAaW1wbGVt
ZW50YXRpb24gV2ViR0xMYXllcgogCiAtKGlkKWluaXRXaXRoQ29udGV4dDooR3JhcGhpY3NDb250
ZXh0M0QqKWNvbnRleHQKIHsKQEAgLTE1MSw3ICsxNTEsNyBAQCAtICh2b2lkKWRpc3BsYXkKIAog
QGVuZAogCi1AaW1wbGVtZW50YXRpb24gQ2FudmFzM0RMYXllcihXZWJMYXllckFkZGl0aW9ucykK
K0BpbXBsZW1lbnRhdGlvbiBXZWJHTExheWVyKFdlYkxheWVyQWRkaXRpb25zKQogCiAtKHZvaWQp
c2V0TGF5ZXJPd25lcjooR3JhcGhpY3NMYXllciopYUxheWVyCiB7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>59413</attachid>
            <date>2010-06-22 13:52:23 -0700</date>
            <delta_ts>2010-06-22 14:55:31 -0700</delta_ts>
            <desc>Final patch</desc>
            <filename>40643-3.patch</filename>
            <type>text/plain</type>
            <size>16920</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MTYyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDQgQEAKKzIwMTAtMDYtMjIgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDY0MworICAgICAgICAKKyAg
ICAgICAgRmluYWwgcGhhc2Ugb2YgbW92aW5nIG93bmVyc2hpcCBvZiBXZWJHTExheWVyIHRvIEdy
YXBoaWNzQ29udGV4dDNELgorICAgICAgICBBcyBpdCB0dXJucyBvdXQsIEkgc3RpbGwgaGF2ZSB0
byBoYXZlIGEgc2VwYXJhdGUgQ0dMQ29udGV4dE9iaiBmb3IKKyAgICAgICAgcmVuZGVyaW5nIGJl
Y2F1c2UgQ29yZSBBbmltYXRpb24gY29tcG9zaXRlcyBpbiBhIHNlcGFyYXRlIHRocmVhZCwKKyAg
ICAgICAgc28gd2UgbmVlZCB0byBkaXNjb25uZWN0IFdlYkdMIHJlbmRlcmluZyBmcm9tIENBIGNv
bXBvc2l0aW5nLiBCdXQKKyAgICAgICAgdGhpcyBjaGFuZ2UgaXMgc3RpbGwgd29ydGh3aGlsZSBi
ZWNhdXNlIGl0IHJlZHVjZXMgZGVwZW5kZW5jaWVzCisgICAgICAgIGFuZCBtYWtlcyBpdCBlYXNp
ZXIgdG8gcG9ydCBXZWJHTCB0byBvdGhlciBwbGF0Zm9ybXMuCisgICAgICAgIAorICAgICAgICBO
byBuZXcgdGVzdHMgc2luY2UgdGhpcyBpcyBqdXN0IHJlc3RydWN0dXJpbmcgYW5kIHRoZSBjdXJy
ZW50IHRlc3RzCisgICAgICAgIGFyZSBhbGwgc3RpbGwgdmFsaWQgYW5kIGRvIGEgc3VmZmljaWVu
dCB0ZXN0IG9mIFdlYkdMIGZ1bmN0aW9uYWxpdHkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9HcmFwaGljc0NvbnRleHQzRC5oOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OnBsYXRmb3JtTGF5ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRz
VG9XZWJHTCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpzZXRXZWJHTE5lZWRz
RGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4
dDNETWFjLm1tOiBBZGQgY3JlYXRpb24gb2YgV2ViR0xMYXllcgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLmg6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0xheWVyQ0E6Oik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNz
TGF5ZXJDQS5tbTogSGFuZGxlIHNldHRpbmcgb2YgV2ViR0xMYXllciBhcyBjb250ZW50IHRoZSBz
YW1lIGFzIGZvciBNZWRpYUxheWVyLiBBbHNvIGNoYW5nZWQgV2ViR0wgcmVsYXRlZCBuYW1lcyBm
b3IgY2xhcml0eQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBOjpHcmFwaGljc0xh
eWVyQ0EpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBOjpjb21taXRMYXllckNo
YW5nZXNCZWZvcmVTdWJsYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNB
Ojp1cGRhdGVDb250ZW50c1dlYkdMTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNBOjpzZXRDb250ZW50c1RvV2ViR0wpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNBOjpzZXRXZWJHTE5lZWRzRGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1dlYkdMTGF5ZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2Vi
R0xMYXllci5tbTogR290IHJpZCBvZiBzdG9yYWdlIGZvciBjb250ZXh0IGFuZCB0ZXh0dXJlLCBu
b3cganVzdCBzdG9yZSBHcmFwaGljc0NvbnRleHQzRCBhbmQgZ2V0IHRoZW0gZnJvbSB0aGVyZSB3
aGVuIG5lZWRlZAorICAgICAgICAoLVtXZWJHTExheWVyIGNvcHlDR0xQaXhlbEZvcm1hdEZvckRp
c3BsYXlNYXNrOl0pOgorICAgICAgICAoLVtXZWJHTExheWVyIGNvcHlDR0xDb250ZXh0Rm9yUGl4
ZWxGb3JtYXQ6XSk6CisgICAgICAgICgtW1dlYkdMTGF5ZXIgZHJhd0luQ0dMQ29udGV4dDpwaXhl
bEZvcm1hdDpmb3JMYXllclRpbWU6ZGlzcGxheVRpbWU6XSk6CisgICAgICAgICgtW1dlYkdMTGF5
ZXIgY29weUltYWdlU25hcHNob3RXaXRoQ29sb3JTcGFjZTpdKToKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcDogQ2hhbmdlZCBpbml0IG9mIFdlYkdMIGNvbnRlbnRz
TGF5ZXIgdG8gcGFzcyBXZWJHTExheWVyIHJhdGhlciB0aGFuIEdyYXBoaWNzQ29udGV4dDNECisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUdyYXBoaWNzTGF5ZXJD
b25maWd1cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxheWVyQmFja2luZzo6cmVu
ZGVyZXJDb250ZW50Q2hhbmdlZCk6CisKIDIwMTAtMDYtMjIgIERhcmluIEFkbGVyICA8ZGFyaW5A
YXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFsZXhleSBQcm9za3VyeWFrb3YuCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRC5oCShy
ZXZpc2lvbiA2MTI2NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250
ZXh0M0QuaAkod29ya2luZyBjb3B5KQpAQCAtMzksMTEgKzM5LDIwIEBACiAKICNpZiBQTEFURk9S
TShNQUMpCiAjaW5jbHVkZSA8T3BlbkdML09wZW5HTC5oPgorI2luY2x1ZGUgPHd0Zi9SZXRhaW5Q
dHIuaD4KIAotdHlwZWRlZiB2b2lkKiBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEOwordHlwZWRl
ZiBDR0xDb250ZXh0T2JqIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0Q7CiBjb25zdCAgUGxhdGZv
cm1HcmFwaGljc0NvbnRleHQzRCBOdWxsUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCA9IDA7CiB0
eXBlZGVmIEdMdWludCBQbGF0Zm9ybTNET2JqZWN0OwogY29uc3QgUGxhdGZvcm0zRE9iamVjdCBO
dWxsUGxhdGZvcm0zRE9iamVjdCA9IDA7CisKKyNpZmRlZiBfX09CSkNfXworQGNsYXNzIENBTGF5
ZXI7CitAY2xhc3MgV2ViR0xMYXllcjsKKyNlbHNlCit0eXBlZGVmIHZvaWQqIENBTGF5ZXI7Cit0
eXBlZGVmIHZvaWQqIFdlYkdMTGF5ZXI7CisjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFFUKQogY2xh
c3MgUVBhaW50ZXI7CiBjbGFzcyBRUmVjdDsKQEAgLTQyMSw2ICs0MzAsNyBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAjaWYgUExBVEZPUk0oTUFDKQogICAgICAgICBQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dDNEIHBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoKSBjb25zdCB7IHJldHVybiBtX2NvbnRl
eHRPYmo7IH0KICAgICAgICAgUGxhdGZvcm0zRE9iamVjdCBwbGF0Zm9ybVRleHR1cmUoKSBjb25z
dCB7IHJldHVybiBtX3RleHR1cmU7IH0KKyAgICAgICAgQ0FMYXllciogcGxhdGZvcm1MYXllcigp
IGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PENBTGF5ZXIqPihtX3dlYkdMTGF5ZXIuZ2V0KCkp
OyB9CiAjZWxpZiBQTEFURk9STShDSFJPTUlVTSkKICAgICAgICAgUGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQzRCBwbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCkgY29uc3Q7CiAgICAgICAgIFBsYXRm
b3JtM0RPYmplY3QgcGxhdGZvcm1UZXh0dXJlKCkgY29uc3Q7CkBAIC03MzYsNiArNzQ2LDcgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBWZWN0b3I8VmVjdG9yPGZsb2F0PiA+IG1fdmVy
dGV4QXJyYXk7CiAgICAgICAgIAogICAgICAgICBDR0xDb250ZXh0T2JqIG1fY29udGV4dE9iajsK
KyAgICAgICAgUmV0YWluUHRyPFdlYkdMTGF5ZXI+IG1fd2ViR0xMYXllcjsKICAgICAgICAgR0x1
aW50IG1fdGV4dHVyZTsKICAgICAgICAgR0x1aW50IG1fZmJvOwogICAgICAgICBHTHVpbnQgbV9k
ZXB0aFN0ZW5jaWxCdWZmZXI7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaAkocmV2aXNpb24gNjEyNjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMzMsOSArMzMsNiBAQAogI2luY2x1
ZGUgIkZsb2F0UG9pbnQuaCIKICNpbmNsdWRlICJGbG9hdFBvaW50M0QuaCIKICNpbmNsdWRlICJG
bG9hdFNpemUuaCIKLSNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dDNELmgiCi0jZW5kaWYKICNpbmNsdWRlICJHcmFwaGljc0xheWVyQ2xpZW50LmgiCiAjaW5j
bHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCkBAIC0z
MDIsOCArMjk5LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c0JhY2tn
cm91bmRDb2xvcihjb25zdCBDb2xvciYpIHsgfQogICAgIAogI2lmIEVOQUJMRSgzRF9DQU5WQVMp
Ci0gICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9HcmFwaGljc0NvbnRleHQzRChjb25zdCBH
cmFwaGljc0NvbnRleHQzRCopIHsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRHcmFwaGljc0NvbnRl
eHQzRE5lZWRzRGlzcGxheSgpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1RvV2Vi
R0woUGxhdGZvcm1MYXllciopIHsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRXZWJHTE5lZWRzRGlz
cGxheSgpIHsgfQogI2VuZGlmCiAgICAgLy8gQ2FsbGJhY2sgZnJvbSB0aGUgdW5kZXJseWluZyBn
cmFwaGljcyBzeXN0ZW0gdG8gZHJhdyBsYXllciBjb250ZW50cy4KICAgICB2b2lkIHBhaW50R3Jh
cGhpY3NMYXllckNvbnRlbnRzKEdyYXBoaWNzQ29udGV4dCYsIGNvbnN0IEludFJlY3QmIGNsaXAp
OwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RN
YWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhp
Y3NDb250ZXh0M0RNYWMubW0JKHJldmlzaW9uIDYxMjY2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTI5
LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCiAKKyNpbXBvcnQg
IkJsb2NrRXhjZXB0aW9ucy5oIgogI2luY2x1ZGUgIkNhbnZhc09iamVjdC5oIgogI2luY2x1ZGUg
IkltYWdlQnVmZmVyLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKQEAgLTM4LDYgKzM5
LDcgQEAKICNpbmNsdWRlICJGbG9hdDMyQXJyYXkuaCIKICNpbmNsdWRlICJXZWJHTEZyYW1lYnVm
ZmVyLmgiCiAjaW5jbHVkZSAiSW50MzJBcnJheS5oIgorI2luY2x1ZGUgIldlYkdMTGF5ZXIuaCIK
ICNpbmNsdWRlICJXZWJHTFByb2dyYW0uaCIKICNpbmNsdWRlICJXZWJHTFJlbmRlcmJ1ZmZlci5o
IgogI2luY2x1ZGUgIldlYkdMU2hhZGVyLmgiCkBAIC0xNDYsNiArMTQ4LDE0IEBAIEdyYXBoaWNz
Q29udGV4dDNEOjpHcmFwaGljc0NvbnRleHQzRChHcmEKICAgICAKICAgICB2YWxpZGF0ZUF0dHJp
YnV0ZXMoKTsKIAorICAgIC8vIENyZWF0ZSB0aGUgV2ViR0xMYXllcgorICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUworICAgICAgICBtX3dlYkdMTGF5ZXIuYWRvcHROUyhbW1dlYkdMTGF5
ZXIgYWxsb2NdIGluaXRXaXRoR3JhcGhpY3NDb250ZXh0M0Q6dGhpc10pOworI2lmbmRlZiBOREVC
VUcKKyAgICAgICAgW21fd2ViR0xMYXllci5nZXQoKSBzZXROYW1lOkAiM0QgTGF5ZXIiXTsKKyNl
bmRpZiAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCiAgICAgLy8gY3Jl
YXRlIGEgdGV4dHVyZSB0byByZW5kZXIgaW50bwogICAgIDo6Z2xHZW5UZXh0dXJlcygxLCAmbV90
ZXh0dXJlKTsKICAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJD
QS5oCShyZXZpc2lvbiA2MTI2NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dy
YXBoaWNzTGF5ZXJDQS5oCSh3b3JraW5nIGNvcHkpCkBAIC05MSw3ICs5MSw3IEBAIHB1YmxpYzoK
ICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYp
OwogCiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAgICB2aXJ0dWFsIHZvaWQgc2V0R3JhcGhpY3ND
b250ZXh0M0ROZWVkc0Rpc3BsYXkoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0V2ViR0xOZWVkc0Rp
c3BsYXkoKTsKICNlbmRpZgogICAgIAogICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1JlY3Qo
Y29uc3QgSW50UmVjdCYpOwpAQCAtMTA3LDcgKzEwNyw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFs
IHZvaWQgc2V0Q29udGVudHNUb0ltYWdlKEltYWdlKik7CiAgICAgdmlydHVhbCB2b2lkIHNldENv
bnRlbnRzVG9NZWRpYShQbGF0Zm9ybUxheWVyKik7CiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAg
ICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0dyYXBoaWNzQ29udGV4dDNEKGNvbnN0IEdyYXBo
aWNzQ29udGV4dDNEKik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9XZWJHTChQbGF0
Zm9ybUxheWVyKik7CiAjZW5kaWYKICAgICAKICAgICB2aXJ0dWFsIFBsYXRmb3JtTGF5ZXIqIHBs
YXRmb3JtTGF5ZXIoKSBjb25zdDsKQEAgLTI2MCw3ICsyNjAsNyBAQCBwcml2YXRlOgogICAgIHZv
aWQgdXBkYXRlQ29udGVudHNJbWFnZSgpOwogICAgIHZvaWQgdXBkYXRlQ29udGVudHNNZWRpYUxh
eWVyKCk7CiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzR3Jh
cGhpY3NDb250ZXh0M0QoKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzV2ViR0xMYXllcigpOwog
I2VuZGlmCiAgICAgdm9pZCB1cGRhdGVDb250ZW50c1JlY3QoKTsKICAgICB2b2lkIHVwZGF0ZUdl
b21ldHJ5T3JpZW50YXRpb24oKTsKQEAgLTMwNiw3ICszMDYsNyBAQCBwcml2YXRlOgogICAgICAg
ICBDb250ZW50c0ltYWdlQ2hhbmdlZCA9IDEgPDwgMTcsCiAgICAgICAgIENvbnRlbnRzTWVkaWFM
YXllckNoYW5nZWQgPSAxIDw8IDE4LAogI2lmIEVOQUJMRSgzRF9DQU5WQVMpCi0gICAgICAgIENv
bnRlbnRzR3JhcGhpY3NDb250ZXh0M0RDaGFuZ2VkID0gMSA8PCAxOSwKKyAgICAgICAgQ29udGVu
dHNXZWJHTExheWVyQ2hhbmdlZCA9IDEgPDwgMTksCiAjZW5kaWYKICAgICAgICAgQ29udGVudHNS
ZWN0Q2hhbmdlZCA9IDEgPDwgMjAsCiAgICAgICAgIEdlb21ldHJ5T3JpZW50YXRpb25DaGFuZ2Vk
ID0gMSA8PCAyMSwKQEAgLTMzMyw3ICszMzMsNyBAQCBwcml2YXRlOgogICAgICAgICBDb250ZW50
c0xheWVyRm9ySW1hZ2UsCiAgICAgICAgIENvbnRlbnRzTGF5ZXJGb3JNZWRpYQogI2lmIEVOQUJM
RSgzRF9DQU5WQVMpCi0gICAgICAgICxDb250ZW50c0xheWVyRm9yR3JhcGhpY3NMYXllcjNECisg
ICAgICAgICxDb250ZW50c0xheWVyRm9yV2ViR0wKICNlbmRpZgogICAgIH07CiAgICAgCkBAIC0z
ODksMTEgKzM4OSw2IEBAIHByaXZhdGU6CiAgICAgVmVjdG9yPEZsb2F0UmVjdD4gbV9kaXJ0eVJl
Y3RzOwogICAgIAogICAgIExheWVyQ2hhbmdlRmxhZ3MgbV91bmNvbW1pdHRlZENoYW5nZXM7Ci0g
ICAgCi0jaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNE
IG1fcGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRDsKLSAgICBQbGF0Zm9ybTNET2JqZWN0IG1fcGxh
dGZvcm1UZXh0dXJlOwotI2VuZGlmCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EubW0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1t
CShyZXZpc2lvbiA2MTI2NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBo
aWNzTGF5ZXJDQS5tbQkod29ya2luZyBjb3B5KQpAQCAtMzEsOSArMzEsNiBAQAogCiAjaW1wb3J0
ICJBbmltYXRpb24uaCIKICNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgotI2lmIEVOQUJMRSgz
RF9DQU5WQVMpCi0jaW1wb3J0ICJXZWJHTExheWVyLmgiCi0jZW5kaWYKICNpbXBvcnQgIkZsb2F0
Q29udmVyc2lvbi5oIgogI2ltcG9ydCAiRmxvYXRSZWN0LmgiCiAjaW1wb3J0ICJJbWFnZS5oIgpA
QCAtMzY5LDEwICszNjYsNiBAQCBHcmFwaGljc0xheWVyQ0E6OkdyYXBoaWNzTGF5ZXJDQShHcmFw
aGljCiAgICAgLCBtX2NvbnRlbnRzTGF5ZXJQdXJwb3NlKE5vQ29udGVudHNMYXllcikKICAgICAs
IG1fY29udGVudHNMYXllckhhc0JhY2tncm91bmRDb2xvcihmYWxzZSkKICAgICAsIG1fdW5jb21t
aXR0ZWRDaGFuZ2VzKE5vQ2hhbmdlKQotI2lmIEVOQUJMRSgzRF9DQU5WQVMpCi0gICAgLCBtX3Bs
YXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoTnVsbFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QpCi0g
ICAgLCBtX3BsYXRmb3JtVGV4dHVyZShOdWxsUGxhdGZvcm0zRE9iamVjdCkKLSNlbmRpZgogewog
ICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUwogICAgIG1fbGF5ZXIuYWRvcHROUyhbW1dl
YkxheWVyIGFsbG9jXSBpbml0XSk7CkBAIC05MTQsOCArOTA3LDggQEAgdm9pZCBHcmFwaGljc0xh
eWVyQ0E6OmNvbW1pdExheWVyQ2hhbmdlcwogICAgICAgICB1cGRhdGVDb250ZW50c01lZGlhTGF5
ZXIoKTsKICAgICAKICNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotICAgIGlmIChtX3VuY29tbWl0dGVk
Q2hhbmdlcyAmIENvbnRlbnRzR3JhcGhpY3NDb250ZXh0M0RDaGFuZ2VkKSAvLyBOZWVkcyB0byBo
YXBwZW4gYmVmb3JlIENoaWxkcmVuQ2hhbmdlZAotICAgICAgICB1cGRhdGVDb250ZW50c0dyYXBo
aWNzQ29udGV4dDNEKCk7CisgICAgaWYgKG1fdW5jb21taXR0ZWRDaGFuZ2VzICYgQ29udGVudHNX
ZWJHTExheWVyQ2hhbmdlZCkgLy8gTmVlZHMgdG8gaGFwcGVuIGJlZm9yZSBDaGlsZHJlbkNoYW5n
ZWQKKyAgICAgICAgdXBkYXRlQ29udGVudHNXZWJHTExheWVyKCk7CiAjZW5kaWYKICAgICAKICAg
ICBpZiAobV91bmNvbW1pdHRlZENoYW5nZXMgJiBCYWNrZ3JvdW5kQ29sb3JDaGFuZ2VkKSAgLy8g
TmVlZHMgdG8gaGFwcGVuIGJlZm9yZSBDaGlsZHJlbkNoYW5nZWQsIGFuZCBhZnRlciB1cGRhdGlu
ZyBpbWFnZSBvciB2aWRlbwpAQCAtMTM5MCw5ICsxMzgzLDkgQEAgdm9pZCBHcmFwaGljc0xheWVy
Q0E6OnVwZGF0ZUNvbnRlbnRzTWVkaQogfQogCiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKLXZvaWQg
R3JhcGhpY3NMYXllckNBOjp1cGRhdGVDb250ZW50c0dyYXBoaWNzQ29udGV4dDNEKCkKK3ZvaWQg
R3JhcGhpY3NMYXllckNBOjp1cGRhdGVDb250ZW50c1dlYkdMTGF5ZXIoKQogewotICAgIC8vIENh
bnZhczNEIGxheWVyIHdhcyBzZXQgYXMgbV9jb250ZW50c0xheWVyLCBhbmQgd2lsbCBnZXQgcGFy
ZW50ZWQgaW4gdXBkYXRlU3VibGF5ZXJMaXN0KCkuCisgICAgLy8gV2ViR0xMYXllciB3YXMgc2V0
IGFzIG1fY29udGVudHNMYXllciwgYW5kIHdpbGwgZ2V0IHBhcmVudGVkIGluIHVwZGF0ZVN1Ymxh
eWVyTGlzdCgpLgogICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKICAgICAgICAgc2V0dXBDb250
ZW50c0xheWVyKG1fY29udGVudHNMYXllci5nZXQoKSk7CiAgICAgICAgIFttX2NvbnRlbnRzTGF5
ZXIuZ2V0KCkgc2V0TmVlZHNEaXNwbGF5XTsKQEAgLTE3MTYsMzggKzE3MDksMTkgQEAgdm9pZCBH
cmFwaGljc0xheWVyQ0E6OnBhdXNlQW5pbWF0aW9uT25MYQogfQogCiAjaWYgRU5BQkxFKDNEX0NB
TlZBUykKLXZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRDb250ZW50c1RvR3JhcGhpY3NDb250ZXh0
M0QoY29uc3QgR3JhcGhpY3NDb250ZXh0M0QqIGdyYXBoaWNzQ29udGV4dDNEKQordm9pZCBHcmFw
aGljc0xheWVyQ0E6OnNldENvbnRlbnRzVG9XZWJHTChQbGF0Zm9ybUxheWVyKiB3ZWJnbExheWVy
KQogewotICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QgY29udGV4dCA9IGdyYXBoaWNzQ29u
dGV4dDNELT5wbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCk7Ci0gICAgUGxhdGZvcm0zRE9iamVj
dCB0ZXh0dXJlID0gZ3JhcGhpY3NDb250ZXh0M0QtPnBsYXRmb3JtVGV4dHVyZSgpOwotICAgIAot
ICAgIGlmIChjb250ZXh0ID09IG1fcGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCAmJiB0ZXh0dXJl
ID09IG1fcGxhdGZvcm1UZXh0dXJlKQorICAgIGlmICh3ZWJnbExheWVyID09IG1fY29udGVudHNM
YXllcikKICAgICAgICAgcmV0dXJuOwogICAgICAgICAKLSAgICBtX3BsYXRmb3JtR3JhcGhpY3ND
b250ZXh0M0QgPSBjb250ZXh0OwotICAgIG1fcGxhdGZvcm1UZXh0dXJlID0gdGV4dHVyZTsKKyAg
ICBtX2NvbnRlbnRzTGF5ZXIgPSB3ZWJnbExheWVyOworICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIg
JiYgW21fY29udGVudHNMYXllci5nZXQoKSByZXNwb25kc1RvU2VsZWN0b3I6QHNlbGVjdG9yKHNl
dExheWVyT3duZXI6KV0pCisgICAgICAgIFsoaWQpbV9jb250ZW50c0xheWVyLmdldCgpIHNldExh
eWVyT3duZXI6dGhpc107CiAgICAgCi0gICAgbm90ZVN1YmxheWVyc0NoYW5nZWQoKTsKLSAgICAK
LSAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBtX2NvbnRlbnRzTGF5ZXJQdXJw
b3NlID0gd2ViZ2xMYXllciA/IENvbnRlbnRzTGF5ZXJGb3JXZWJHTCA6IE5vQ29udGVudHNMYXll
cjsKIAotICAgIGlmIChtX3BsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QgIT0gTnVsbFBsYXRmb3Jt
R3JhcGhpY3NDb250ZXh0M0QgJiYgbV9wbGF0Zm9ybVRleHR1cmUgIT0gTnVsbFBsYXRmb3JtM0RP
YmplY3QpIHsKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBpbm5lciAzZCBsYXllcgotICAgICAgICBt
X2NvbnRlbnRzTGF5ZXIuYWRvcHROUyhbW1dlYkdMTGF5ZXIgYWxsb2NdIGluaXRXaXRoQ29udGV4
dDpjb25zdF9jYXN0PEdyYXBoaWNzQ29udGV4dDNEKj4oZ3JhcGhpY3NDb250ZXh0M0QpXSk7Ci0j
aWZuZGVmIE5ERUJVRwotICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHNldE5hbWU6QCIz
RCBMYXllciJdOwotI2VuZGlmCi0gICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0TGF5
ZXJPd25lcjp0aGlzXTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyByZW1vdmUgdGhlIGlubmVy
IGxheWVyCi0gICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0TGF5ZXJPd25lcjowXTsK
LSAgICAgICAgbV9jb250ZW50c0xheWVyID0gMDsKLSAgICB9Ci0gICAgCi0gICAgRU5EX0JMT0NL
X09CSkNfRVhDRVBUSU9OUwotICAgIAotICAgIG5vdGVMYXllclByb3BlcnR5Q2hhbmdlZChDb250
ZW50c0dyYXBoaWNzQ29udGV4dDNEQ2hhbmdlZCk7Ci0gICAgbV9jb250ZW50c0xheWVyUHVycG9z
ZSA9IG1fY29udGVudHNMYXllciA/IENvbnRlbnRzTGF5ZXJGb3JHcmFwaGljc0xheWVyM0QgOiBO
b0NvbnRlbnRzTGF5ZXI7CisgICAgbm90ZVN1YmxheWVyc0NoYW5nZWQoKTsKKyAgICBub3RlTGF5
ZXJQcm9wZXJ0eUNoYW5nZWQoQ29udGVudHNXZWJHTExheWVyQ2hhbmdlZCk7CiB9CiAjZW5kaWYK
ICAgICAKQEAgLTI1NjcsOSArMjU0MSw5IEBAIHZvaWQgR3JhcGhpY3NMYXllckNBOjpub3RlTGF5
ZXJQcm9wZXJ0eUMKIH0KIAogI2lmIEVOQUJMRSgzRF9DQU5WQVMpCi12b2lkIEdyYXBoaWNzTGF5
ZXJDQTo6c2V0R3JhcGhpY3NDb250ZXh0M0ROZWVkc0Rpc3BsYXkoKQordm9pZCBHcmFwaGljc0xh
eWVyQ0E6OnNldFdlYkdMTmVlZHNEaXNwbGF5KCkKIHsKLSAgICBpZiAobV9jb250ZW50c0xheWVy
UHVycG9zZSA9PSBDb250ZW50c0xheWVyRm9yR3JhcGhpY3NMYXllcjNEKQorICAgIGlmIChtX2Nv
bnRlbnRzTGF5ZXJQdXJwb3NlID09IENvbnRlbnRzTGF5ZXJGb3JXZWJHTCkKICAgICAgICAgW21f
Y29udGVudHNMYXllci5nZXQoKSBzZXROZWVkc0Rpc3BsYXldOwogfQogI2VuZGlmCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJHTExheWVyLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViR0xMYXllci5oCShyZXZpc2lvbiA2MTI2
NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkdMTGF5ZXIuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMjgsNyArMjgsNyBAQAogCiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQogCi0jaW1wb3J0ICJXZWJMYXllci5oIgorI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpD
b3JlLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBjbGFzcyBHcmFwaGljc0xheWVyOwpA
QCAtMzksMTEgKzM5LDkgQEAgQGludGVyZmFjZSBXZWJHTExheWVyIDogQ0FPcGVuR0xMYXllciAK
IHsKICAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX2xheWVyT3duZXI7CiAgICAgV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0QqIG1fY29udGV4dDsKLSAgICBDR0xDb250ZXh0T2JqIG1fY29u
dGV4dE9iajsKLSAgICBHTHVpbnQgbV90ZXh0dXJlOwogfQogCi0tIChpZClpbml0V2l0aENvbnRl
eHQ6KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEKiljb250ZXh0OworLSAoaWQpaW5pdFdpdGhH
cmFwaGljc0NvbnRleHQzRDooV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0QqKWNvbnRleHQ7CiAK
IC0gKENHSW1hZ2VSZWYpY29weUltYWdlU25hcHNob3RXaXRoQ29sb3JTcGFjZTooQ0dDb2xvclNw
YWNlUmVmKWNvbG9yU3BhY2U7CiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFj
L1dlYkdMTGF5ZXIubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvV2ViR0xMYXllci5tbQkocmV2aXNpb24gNjEyNjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL21hYy9XZWJHTExheWVyLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw4ICszMCw4IEBA
CiAKICNpbXBvcnQgIldlYkdMTGF5ZXIuaCIKIAorI2ltcG9ydCAiR3JhcGhpY3NDb250ZXh0M0Qu
aCIKICNpbXBvcnQgIkdyYXBoaWNzTGF5ZXIuaCIKLSNpbXBvcnQgPFF1YXJ0ekNvcmUvUXVhcnR6
Q29yZS5oPgogI2ltcG9ydCA8T3BlbkdML09wZW5HTC5oPgogI2ltcG9ydCA8d3RmL0Zhc3RNYWxs
b2MuaD4KICNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KQEAgLTQxLDExICs0MSw5IEBAIHVzaW5n
IG5hbWVzcGFjZSBXZWJDb3JlOwogCiBAaW1wbGVtZW50YXRpb24gV2ViR0xMYXllcgogCi0tKGlk
KWluaXRXaXRoQ29udGV4dDooR3JhcGhpY3NDb250ZXh0M0QqKWNvbnRleHQKKy0oaWQpaW5pdFdp
dGhHcmFwaGljc0NvbnRleHQzRDooR3JhcGhpY3NDb250ZXh0M0QqKWNvbnRleHQKIHsKICAgICBt
X2NvbnRleHQgPSBjb250ZXh0OwotICAgIG1fY29udGV4dE9iaiA9IHN0YXRpY19jYXN0PENHTENv
bnRleHRPYmo+KGNvbnRleHQtPnBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoKSk7Ci0gICAgbV90
ZXh0dXJlID0gc3RhdGljX2Nhc3Q8R0x1aW50Pihjb250ZXh0LT5wbGF0Zm9ybVRleHR1cmUoKSk7
CiAgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKICAgICByZXR1cm4gc2VsZjsKIH0KQEAgLTU5LDEz
ICs1NywxMyBAQCAtKENHTFBpeGVsRm9ybWF0T2JqKWNvcHlDR0xQaXhlbEZvcm1hdEZvCiAgICAg
Ly8gSWYgbmVlZGVkIHdlIHdpbGwgaGF2ZSB0byBzZXQgdGhlIGRpc3BsYXkgbWFzayBpbiB0aGUg
Q2FudmFzIENHTENvbnRleHQgYW5kCiAgICAgLy8gbWFrZSBzdXJlIGl0IG1hdGNoZXMuCiAgICAg
VU5VU0VEX1BBUkFNKG1hc2spOwotICAgIHJldHVybiBDR0xSZXRhaW5QaXhlbEZvcm1hdChDR0xH
ZXRQaXhlbEZvcm1hdChtX2NvbnRleHRPYmopKTsKKyAgICByZXR1cm4gQ0dMUmV0YWluUGl4ZWxG
b3JtYXQoQ0dMR2V0UGl4ZWxGb3JtYXQobV9jb250ZXh0LT5wbGF0Zm9ybUdyYXBoaWNzQ29udGV4
dDNEKCkpKTsKIH0KIAogLShDR0xDb250ZXh0T2JqKWNvcHlDR0xDb250ZXh0Rm9yUGl4ZWxGb3Jt
YXQ6KENHTFBpeGVsRm9ybWF0T2JqKXBpeGVsRm9ybWF0CiB7CiAgICAgQ0dMQ29udGV4dE9iaiBj
b250ZXh0T2JqOwotICAgIENHTENyZWF0ZUNvbnRleHQocGl4ZWxGb3JtYXQsIG1fY29udGV4dE9i
aiwgJmNvbnRleHRPYmopOworICAgIENHTENyZWF0ZUNvbnRleHQocGl4ZWxGb3JtYXQsIG1fY29u
dGV4dC0+cGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCgpLCAmY29udGV4dE9iaik7CiAgICAgcmV0
dXJuIGNvbnRleHRPYmo7CiB9CiAKQEAgLTg2LDcgKzg0LDcgQEAgLSh2b2lkKWRyYXdJbkNHTENv
bnRleHQ6KENHTENvbnRleHRPYmopZwogICAgIGdsTG9hZElkZW50aXR5KCk7CiAKICAgICBnbEVu
YWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1f
dGV4dHVyZSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX2NvbnRleHQtPnBs
YXRmb3JtVGV4dHVyZSgpKTsKICAgICAKICAgICBnbEJlZ2luKEdMX1RSSUFOR0xFX0ZBTik7CiAg
ICAgICAgIGdsVGV4Q29vcmQyZigwLCAwKTsKQEAgLTExMyw3ICsxMTEsNyBAQCBzdGF0aWMgdm9p
ZCBmcmVlRGF0YSh2b2lkICosIGNvbnN0IHZvaWQgCiAKIC0oQ0dJbWFnZVJlZiljb3B5SW1hZ2VT
bmFwc2hvdFdpdGhDb2xvclNwYWNlOihDR0NvbG9yU3BhY2VSZWYpY29sb3JTcGFjZQogewotICAg
IENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgQ0dMU2V0Q3VycmVudENv
bnRleHQobV9jb250ZXh0LT5wbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCkpOwogCiAgICAgUmV0
YWluUHRyPENHQ29sb3JTcGFjZVJlZj4gaW1hZ2VDb2xvclNwYWNlID0gY29sb3JTcGFjZTsKICAg
ICBpZiAoIWltYWdlQ29sb3JTcGFjZSkKQEAgLTE1MSw3ICsxNDksNyBAQCAtICh2b2lkKWRpc3Bs
YXkKIAogQGVuZAogCi1AaW1wbGVtZW50YXRpb24gV2ViR0xMYXllcihXZWJMYXllckFkZGl0aW9u
cykKK0BpbXBsZW1lbnRhdGlvbiBXZWJHTExheWVyKFdlYkdMTGF5ZXJBZGRpdGlvbnMpCiAKIC0o
dm9pZClzZXRMYXllck93bmVyOihHcmFwaGljc0xheWVyKilhTGF5ZXIKIHsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2luZy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcAkocmV2aXNpb24gNjEyNjYpCisrKyBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMTYsOCArMjE2LDggQEAgYm9vbCBSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUdyYXBoaWNz
TAogICAgIGVsc2UgaWYgKGlzM0RDYW52YXMocmVuZGVyZXIoKSkpIHsKICAgICAgICAgSFRNTENh
bnZhc0VsZW1lbnQqIGNhbnZhcyA9IHN0YXRpY19jYXN0PEhUTUxDYW52YXNFbGVtZW50Kj4ocmVu
ZGVyZXIoKS0+bm9kZSgpKTsKICAgICAgICAgV2ViR0xSZW5kZXJpbmdDb250ZXh0KiBjb250ZXh0
ID0gc3RhdGljX2Nhc3Q8V2ViR0xSZW5kZXJpbmdDb250ZXh0Kj4oY2FudmFzLT5yZW5kZXJpbmdD
b250ZXh0KCkpOwotICAgICAgICBpZiAoY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+cGxh
dGZvcm1HcmFwaGljc0NvbnRleHQzRCgpKQotICAgICAgICAgICAgbV9ncmFwaGljc0xheWVyLT5z
ZXRDb250ZW50c1RvR3JhcGhpY3NDb250ZXh0M0QoY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0Qo
KSk7CisgICAgICAgIGlmIChjb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5wbGF0Zm9ybUxh
eWVyKCkpCisgICAgICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldENvbnRlbnRzVG9XZWJHTChj
b250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5wbGF0Zm9ybUxheWVyKCkpOwogICAgIH0KICNl
bmRpZgogCkBAIC03MjYsNyArNzI2LDcgQEAgdm9pZCBSZW5kZXJMYXllckJhY2tpbmc6OnJlbmRl
cmVyQ29udGVudAogCiAjaWYgRU5BQkxFKDNEX0NBTlZBUykgICAgCiAgICAgaWYgKGlzM0RDYW52
YXMocmVuZGVyZXIoKSkpIHsKLSAgICAgICAgbV9ncmFwaGljc0xheWVyLT5zZXRHcmFwaGljc0Nv
bnRleHQzRE5lZWRzRGlzcGxheSgpOworICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldFdlYkdM
TmVlZHNEaXNwbGF5KCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAjZW5kaWYK
</data>
<flag name="review"
          id="46250"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>59418</attachid>
            <date>2010-06-22 14:55:31 -0700</date>
            <delta_ts>2010-06-22 15:06:58 -0700</delta_ts>
            <desc>replacement patch with setContentsNeedsDisplay</desc>
            <filename>40643-3.patch</filename>
            <type>text/plain</type>
            <size>18887</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MTYyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDQgQEAKKzIwMTAtMDYtMjIgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDY0MworICAgICAgICAKKyAg
ICAgICAgRmluYWwgcGhhc2Ugb2YgbW92aW5nIG93bmVyc2hpcCBvZiBXZWJHTExheWVyIHRvIEdy
YXBoaWNzQ29udGV4dDNELgorICAgICAgICBBcyBpdCB0dXJucyBvdXQsIEkgc3RpbGwgaGF2ZSB0
byBoYXZlIGEgc2VwYXJhdGUgQ0dMQ29udGV4dE9iaiBmb3IKKyAgICAgICAgcmVuZGVyaW5nIGJl
Y2F1c2UgQ29yZSBBbmltYXRpb24gY29tcG9zaXRlcyBpbiBhIHNlcGFyYXRlIHRocmVhZCwKKyAg
ICAgICAgc28gd2UgbmVlZCB0byBkaXNjb25uZWN0IFdlYkdMIHJlbmRlcmluZyBmcm9tIENBIGNv
bXBvc2l0aW5nLiBCdXQKKyAgICAgICAgdGhpcyBjaGFuZ2UgaXMgc3RpbGwgd29ydGh3aGlsZSBi
ZWNhdXNlIGl0IHJlZHVjZXMgZGVwZW5kZW5jaWVzCisgICAgICAgIGFuZCBtYWtlcyBpdCBlYXNp
ZXIgdG8gcG9ydCBXZWJHTCB0byBvdGhlciBwbGF0Zm9ybXMuCisgICAgICAgIAorICAgICAgICBO
byBuZXcgdGVzdHMgc2luY2UgdGhpcyBpcyBqdXN0IHJlc3RydWN0dXJpbmcgYW5kIHRoZSBjdXJy
ZW50IHRlc3RzCisgICAgICAgIGFyZSBhbGwgc3RpbGwgdmFsaWQgYW5kIGRvIGEgc3VmZmljaWVu
dCB0ZXN0IG9mIFdlYkdMIGZ1bmN0aW9uYWxpdHkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9HcmFwaGljc0NvbnRleHQzRC5oOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OnBsYXRmb3JtTGF5ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRz
VG9XZWJHTCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpzZXRXZWJHTE5lZWRz
RGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4
dDNETWFjLm1tOiBBZGQgY3JlYXRpb24gb2YgV2ViR0xMYXllcgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLmg6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0xheWVyQ0E6Oik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNz
TGF5ZXJDQS5tbTogSGFuZGxlIHNldHRpbmcgb2YgV2ViR0xMYXllciBhcyBjb250ZW50IHRoZSBz
YW1lIGFzIGZvciBNZWRpYUxheWVyLiBBbHNvIGNoYW5nZWQgV2ViR0wgcmVsYXRlZCBuYW1lcyBm
b3IgY2xhcml0eQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBOjpHcmFwaGljc0xh
eWVyQ0EpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBOjpjb21taXRMYXllckNo
YW5nZXNCZWZvcmVTdWJsYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNB
Ojp1cGRhdGVDb250ZW50c1dlYkdMTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNBOjpzZXRDb250ZW50c1RvV2ViR0wpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNBOjpzZXRXZWJHTE5lZWRzRGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1dlYkdMTGF5ZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2Vi
R0xMYXllci5tbTogR290IHJpZCBvZiBzdG9yYWdlIGZvciBjb250ZXh0IGFuZCB0ZXh0dXJlLCBu
b3cganVzdCBzdG9yZSBHcmFwaGljc0NvbnRleHQzRCBhbmQgZ2V0IHRoZW0gZnJvbSB0aGVyZSB3
aGVuIG5lZWRlZAorICAgICAgICAoLVtXZWJHTExheWVyIGNvcHlDR0xQaXhlbEZvcm1hdEZvckRp
c3BsYXlNYXNrOl0pOgorICAgICAgICAoLVtXZWJHTExheWVyIGNvcHlDR0xDb250ZXh0Rm9yUGl4
ZWxGb3JtYXQ6XSk6CisgICAgICAgICgtW1dlYkdMTGF5ZXIgZHJhd0luQ0dMQ29udGV4dDpwaXhl
bEZvcm1hdDpmb3JMYXllclRpbWU6ZGlzcGxheVRpbWU6XSk6CisgICAgICAgICgtW1dlYkdMTGF5
ZXIgY29weUltYWdlU25hcHNob3RXaXRoQ29sb3JTcGFjZTpdKToKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcDogQ2hhbmdlZCBpbml0IG9mIFdlYkdMIGNvbnRlbnRz
TGF5ZXIgdG8gcGFzcyBXZWJHTExheWVyIHJhdGhlciB0aGFuIEdyYXBoaWNzQ29udGV4dDNECisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUdyYXBoaWNzTGF5ZXJD
b25maWd1cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxheWVyQmFja2luZzo6cmVu
ZGVyZXJDb250ZW50Q2hhbmdlZCk6CisKIDIwMTAtMDYtMjIgIERhcmluIEFkbGVyICA8ZGFyaW5A
YXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFsZXhleSBQcm9za3VyeWFrb3YuCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRC5oCShy
ZXZpc2lvbiA2MTI2NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250
ZXh0M0QuaAkod29ya2luZyBjb3B5KQpAQCAtMzksMTEgKzM5LDIwIEBACiAKICNpZiBQTEFURk9S
TShNQUMpCiAjaW5jbHVkZSA8T3BlbkdML09wZW5HTC5oPgorI2luY2x1ZGUgPHd0Zi9SZXRhaW5Q
dHIuaD4KIAotdHlwZWRlZiB2b2lkKiBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEOwordHlwZWRl
ZiBDR0xDb250ZXh0T2JqIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0Q7CiBjb25zdCAgUGxhdGZv
cm1HcmFwaGljc0NvbnRleHQzRCBOdWxsUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCA9IDA7CiB0
eXBlZGVmIEdMdWludCBQbGF0Zm9ybTNET2JqZWN0OwogY29uc3QgUGxhdGZvcm0zRE9iamVjdCBO
dWxsUGxhdGZvcm0zRE9iamVjdCA9IDA7CisKKyNpZmRlZiBfX09CSkNfXworQGNsYXNzIENBTGF5
ZXI7CitAY2xhc3MgV2ViR0xMYXllcjsKKyNlbHNlCit0eXBlZGVmIHZvaWQqIENBTGF5ZXI7Cit0
eXBlZGVmIHZvaWQqIFdlYkdMTGF5ZXI7CisjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFFUKQogY2xh
c3MgUVBhaW50ZXI7CiBjbGFzcyBRUmVjdDsKQEAgLTQyMSw2ICs0MzAsNyBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAjaWYgUExBVEZPUk0oTUFDKQogICAgICAgICBQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dDNEIHBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoKSBjb25zdCB7IHJldHVybiBtX2NvbnRl
eHRPYmo7IH0KICAgICAgICAgUGxhdGZvcm0zRE9iamVjdCBwbGF0Zm9ybVRleHR1cmUoKSBjb25z
dCB7IHJldHVybiBtX3RleHR1cmU7IH0KKyAgICAgICAgQ0FMYXllciogcGxhdGZvcm1MYXllcigp
IGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PENBTGF5ZXIqPihtX3dlYkdMTGF5ZXIuZ2V0KCkp
OyB9CiAjZWxpZiBQTEFURk9STShDSFJPTUlVTSkKICAgICAgICAgUGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQzRCBwbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCkgY29uc3Q7CiAgICAgICAgIFBsYXRm
b3JtM0RPYmplY3QgcGxhdGZvcm1UZXh0dXJlKCkgY29uc3Q7CkBAIC03MzYsNiArNzQ2LDcgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBWZWN0b3I8VmVjdG9yPGZsb2F0PiA+IG1fdmVy
dGV4QXJyYXk7CiAgICAgICAgIAogICAgICAgICBDR0xDb250ZXh0T2JqIG1fY29udGV4dE9iajsK
KyAgICAgICAgUmV0YWluUHRyPFdlYkdMTGF5ZXI+IG1fd2ViR0xMYXllcjsKICAgICAgICAgR0x1
aW50IG1fdGV4dHVyZTsKICAgICAgICAgR0x1aW50IG1fZmJvOwogICAgICAgICBHTHVpbnQgbV9k
ZXB0aFN0ZW5jaWxCdWZmZXI7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaAkocmV2aXNpb24gNjEyNjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMzMsOSArMzMsNiBAQAogI2luY2x1
ZGUgIkZsb2F0UG9pbnQuaCIKICNpbmNsdWRlICJGbG9hdFBvaW50M0QuaCIKICNpbmNsdWRlICJG
bG9hdFNpemUuaCIKLSNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dDNELmgiCi0jZW5kaWYKICNpbmNsdWRlICJHcmFwaGljc0xheWVyQ2xpZW50LmgiCiAjaW5j
bHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCkBAIC0y
ODEsNiArMjc4LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXko
KSA9IDA7CiAgICAgLy8gbWFyayB0aGUgZ2l2ZW4gcmVjdCAoaW4gbGF5ZXIgY29vcmRzKSBhcyBu
ZWVkaW5nIGRpc3BheS4gTmV2ZXIgZ29lcyBkZWVwLgogICAgIHZpcnR1YWwgdm9pZCBzZXROZWVk
c0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JikgPSAwOworICAgIAorICAgIHZpcnR1YWwg
dm9pZCBzZXRDb250ZW50c05lZWRzRGlzcGxheSgpID0gMDsKIAogICAgIC8vIFNldCB0aGF0IHRo
ZSBwb3NpdGlvbi9zaXplIG9mIHRoZSBjb250ZW50cyAoaW1hZ2Ugb3IgdmlkZW8pLgogICAgIElu
dFJlY3QgY29udGVudHNSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50c1JlY3Q7IH0KQEAg
LTMwMiw4ICszMDEsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzQmFj
a2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJikgeyB9CiAgICAgCiAjaWYgRU5BQkxFKDNEX0NBTlZB
UykKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0dyYXBoaWNzQ29udGV4dDNEKGNvbnN0
IEdyYXBoaWNzQ29udGV4dDNEKikgeyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldEdyYXBoaWNzQ29u
dGV4dDNETmVlZHNEaXNwbGF5KCkgeyB9CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9X
ZWJHTChQbGF0Zm9ybUxheWVyKikgeyB9CiAjZW5kaWYKICAgICAvLyBDYWxsYmFjayBmcm9tIHRo
ZSB1bmRlcmx5aW5nIGdyYXBoaWNzIHN5c3RlbSB0byBkcmF3IGxheWVyIGNvbnRlbnRzLgogICAg
IHZvaWQgcGFpbnRHcmFwaGljc0xheWVyQ29udGVudHMoR3JhcGhpY3NDb250ZXh0JiwgY29uc3Qg
SW50UmVjdCYgY2xpcCk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFw
aGljc0NvbnRleHQzRE1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQkocmV2aXNpb24gNjEyNjYpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0Qu
aCIKIAorI2ltcG9ydCAiQmxvY2tFeGNlcHRpb25zLmgiCiAjaW5jbHVkZSAiQ2FudmFzT2JqZWN0
LmgiCiAjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5o
IgpAQCAtMzgsNiArMzksNyBAQAogI2luY2x1ZGUgIkZsb2F0MzJBcnJheS5oIgogI2luY2x1ZGUg
IldlYkdMRnJhbWVidWZmZXIuaCIKICNpbmNsdWRlICJJbnQzMkFycmF5LmgiCisjaW5jbHVkZSAi
V2ViR0xMYXllci5oIgogI2luY2x1ZGUgIldlYkdMUHJvZ3JhbS5oIgogI2luY2x1ZGUgIldlYkdM
UmVuZGVyYnVmZmVyLmgiCiAjaW5jbHVkZSAiV2ViR0xTaGFkZXIuaCIKQEAgLTE0Niw2ICsxNDgs
MTQgQEAgR3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdyYQogICAgIAogICAg
IHZhbGlkYXRlQXR0cmlidXRlcygpOwogCisgICAgLy8gQ3JlYXRlIHRoZSBXZWJHTExheWVyCisg
ICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAgIG1fd2ViR0xMYXllci5hZG9w
dE5TKFtbV2ViR0xMYXllciBhbGxvY10gaW5pdFdpdGhHcmFwaGljc0NvbnRleHQzRDp0aGlzXSk7
CisjaWZuZGVmIE5ERUJVRworICAgICAgICBbbV93ZWJHTExheWVyLmdldCgpIHNldE5hbWU6QCJX
ZWJHTCBMYXllciJdOworI2VuZGlmICAgIAorICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMK
KyAgICAKICAgICAvLyBjcmVhdGUgYSB0ZXh0dXJlIHRvIHJlbmRlciBpbnRvCiAgICAgOjpnbEdl
blRleHR1cmVzKDEsICZtX3RleHR1cmUpOwogICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJF
XzJELCBtX3RleHR1cmUpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3Jh
cGhpY3NMYXllckNBLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvR3JhcGhpY3NMYXllckNBLmgJKHJldmlzaW9uIDYxMjY2KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLmgJKHdvcmtpbmcgY29weSkKQEAgLTg5LDEw
ICs4OSw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsK
ICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYp
OwotCi0jaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAgICB2aXJ0dWFsIHZvaWQgc2V0R3JhcGhpY3ND
b250ZXh0M0ROZWVkc0Rpc3BsYXkoKTsKLSNlbmRpZgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb250
ZW50c05lZWRzRGlzcGxheSgpOwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1Jl
Y3QoY29uc3QgSW50UmVjdCYpOwogICAgIApAQCAtMTA3LDcgKzEwNCw3IEBAIHB1YmxpYzoKICAg
ICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0ltYWdlKEltYWdlKik7CiAgICAgdmlydHVhbCB2
b2lkIHNldENvbnRlbnRzVG9NZWRpYShQbGF0Zm9ybUxheWVyKik7CiAjaWYgRU5BQkxFKDNEX0NB
TlZBUykKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0dyYXBoaWNzQ29udGV4dDNEKGNv
bnN0IEdyYXBoaWNzQ29udGV4dDNEKik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9X
ZWJHTChQbGF0Zm9ybUxheWVyKik7CiAjZW5kaWYKICAgICAKICAgICB2aXJ0dWFsIFBsYXRmb3Jt
TGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKQEAgLTI2MCw3ICsyNTcsNyBAQCBwcml2YXRl
OgogICAgIHZvaWQgdXBkYXRlQ29udGVudHNJbWFnZSgpOwogICAgIHZvaWQgdXBkYXRlQ29udGVu
dHNNZWRpYUxheWVyKCk7CiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAgICB2b2lkIHVwZGF0ZUNv
bnRlbnRzR3JhcGhpY3NDb250ZXh0M0QoKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzV2ViR0xM
YXllcigpOwogI2VuZGlmCiAgICAgdm9pZCB1cGRhdGVDb250ZW50c1JlY3QoKTsKICAgICB2b2lk
IHVwZGF0ZUdlb21ldHJ5T3JpZW50YXRpb24oKTsKQEAgLTI2OCw2ICsyNjUsNyBAQCBwcml2YXRl
OgogICAgIHZvaWQgdXBkYXRlUmVwbGljYXRlZExheWVycygpOwogCiAgICAgdm9pZCB1cGRhdGVM
YXllckFuaW1hdGlvbnMoKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzTmVlZHNEaXNwbGF5KCk7
CiAgICAgCiAgICAgZW51bSBTdHJ1Y3R1cmFsTGF5ZXJQdXJwb3NlIHsKICAgICAgICAgTm9TdHJ1
Y3R1cmFsTGF5ZXIgPSAwLApAQCAtMzA2LDEyICszMDQsMTMgQEAgcHJpdmF0ZToKICAgICAgICAg
Q29udGVudHNJbWFnZUNoYW5nZWQgPSAxIDw8IDE3LAogICAgICAgICBDb250ZW50c01lZGlhTGF5
ZXJDaGFuZ2VkID0gMSA8PCAxOCwKICNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotICAgICAgICBDb250
ZW50c0dyYXBoaWNzQ29udGV4dDNEQ2hhbmdlZCA9IDEgPDwgMTksCisgICAgICAgIENvbnRlbnRz
V2ViR0xMYXllckNoYW5nZWQgPSAxIDw8IDE5LAogI2VuZGlmCiAgICAgICAgIENvbnRlbnRzUmVj
dENoYW5nZWQgPSAxIDw8IDIwLAogICAgICAgICBHZW9tZXRyeU9yaWVudGF0aW9uQ2hhbmdlZCA9
IDEgPDwgMjEsCiAgICAgICAgIE1hc2tMYXllckNoYW5nZWQgPSAxIDw8IDIyLAotICAgICAgICBS
ZXBsaWNhdGVkTGF5ZXJDaGFuZ2VkID0gMSA8PCAyMworICAgICAgICBSZXBsaWNhdGVkTGF5ZXJD
aGFuZ2VkID0gMSA8PCAyMywKKyAgICAgICAgQ29udGVudHNOZWVkc0Rpc3BsYXkgPSAxIDw8IDI0
CiAgICAgfTsKICAgICB0eXBlZGVmIHVuc2lnbmVkIExheWVyQ2hhbmdlRmxhZ3M7CiAgICAgdm9p
ZCBub3RlTGF5ZXJQcm9wZXJ0eUNoYW5nZWQoTGF5ZXJDaGFuZ2VGbGFncyBmbGFncyk7CkBAIC0z
MzMsNyArMzMyLDcgQEAgcHJpdmF0ZToKICAgICAgICAgQ29udGVudHNMYXllckZvckltYWdlLAog
ICAgICAgICBDb250ZW50c0xheWVyRm9yTWVkaWEKICNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotICAg
ICAgICAsQ29udGVudHNMYXllckZvckdyYXBoaWNzTGF5ZXIzRAorICAgICAgICAsQ29udGVudHNM
YXllckZvcldlYkdMCiAjZW5kaWYKICAgICB9OwogICAgIApAQCAtMzg5LDExICszODgsNiBAQCBw
cml2YXRlOgogICAgIFZlY3RvcjxGbG9hdFJlY3Q+IG1fZGlydHlSZWN0czsKICAgICAKICAgICBM
YXllckNoYW5nZUZsYWdzIG1fdW5jb21taXR0ZWRDaGFuZ2VzOwotICAgIAotI2lmIEVOQUJMRSgz
RF9DQU5WQVMpCi0gICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCBtX3BsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0M0Q7Ci0gICAgUGxhdGZvcm0zRE9iamVjdCBtX3BsYXRmb3JtVGV4dHVyZTsKLSNl
bmRpZgogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1tCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbQkocmV2aXNpb24gNjEyNjYp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EubW0JKHdv
cmtpbmcgY29weSkKQEAgLTMxLDkgKzMxLDYgQEAKIAogI2ltcG9ydCAiQW5pbWF0aW9uLmgiCiAj
aW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKLSNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotI2ltcG9y
dCAiV2ViR0xMYXllci5oIgotI2VuZGlmCiAjaW1wb3J0ICJGbG9hdENvbnZlcnNpb24uaCIKICNp
bXBvcnQgIkZsb2F0UmVjdC5oIgogI2ltcG9ydCAiSW1hZ2UuaCIKQEAgLTM2OSwxMCArMzY2LDYg
QEAgR3JhcGhpY3NMYXllckNBOjpHcmFwaGljc0xheWVyQ0EoR3JhcGhpYwogICAgICwgbV9jb250
ZW50c0xheWVyUHVycG9zZShOb0NvbnRlbnRzTGF5ZXIpCiAgICAgLCBtX2NvbnRlbnRzTGF5ZXJI
YXNCYWNrZ3JvdW5kQ29sb3IoZmFsc2UpCiAgICAgLCBtX3VuY29tbWl0dGVkQ2hhbmdlcyhOb0No
YW5nZSkKLSNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotICAgICwgbV9wbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dDNEKE51bGxQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKQotICAgICwgbV9wbGF0Zm9ybVRl
eHR1cmUoTnVsbFBsYXRmb3JtM0RPYmplY3QpCi0jZW5kaWYKIHsKICAgICBCRUdJTl9CTE9DS19P
QkpDX0VYQ0VQVElPTlMKICAgICBtX2xheWVyLmFkb3B0TlMoW1tXZWJMYXllciBhbGxvY10gaW5p
dF0pOwpAQCAtNjk3LDYgKzY5MCwxMSBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0TmVlZHNE
aXNwbGF5SW5SCiAgICAgbm90ZUxheWVyUHJvcGVydHlDaGFuZ2VkKERpcnR5UmVjdHNDaGFuZ2Vk
KTsKIH0KIAordm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENvbnRlbnRzTmVlZHNEaXNwbGF5KCkK
K3sKKyAgICBub3RlTGF5ZXJQcm9wZXJ0eUNoYW5nZWQoQ29udGVudHNOZWVkc0Rpc3BsYXkpOwor
fQorCiB2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0Q29udGVudHNSZWN0KGNvbnN0IEludFJlY3Qm
IHJlY3QpCiB7CiAgICAgaWYgKHJlY3QgPT0gbV9jb250ZW50c1JlY3QpCkBAIC05MTQsOCArOTEy
LDggQEAgdm9pZCBHcmFwaGljc0xheWVyQ0E6OmNvbW1pdExheWVyQ2hhbmdlcwogICAgICAgICB1
cGRhdGVDb250ZW50c01lZGlhTGF5ZXIoKTsKICAgICAKICNpZiBFTkFCTEUoM0RfQ0FOVkFTKQot
ICAgIGlmIChtX3VuY29tbWl0dGVkQ2hhbmdlcyAmIENvbnRlbnRzR3JhcGhpY3NDb250ZXh0M0RD
aGFuZ2VkKSAvLyBOZWVkcyB0byBoYXBwZW4gYmVmb3JlIENoaWxkcmVuQ2hhbmdlZAotICAgICAg
ICB1cGRhdGVDb250ZW50c0dyYXBoaWNzQ29udGV4dDNEKCk7CisgICAgaWYgKG1fdW5jb21taXR0
ZWRDaGFuZ2VzICYgQ29udGVudHNXZWJHTExheWVyQ2hhbmdlZCkgLy8gTmVlZHMgdG8gaGFwcGVu
IGJlZm9yZSBDaGlsZHJlbkNoYW5nZWQKKyAgICAgICAgdXBkYXRlQ29udGVudHNXZWJHTExheWVy
KCk7CiAjZW5kaWYKICAgICAKICAgICBpZiAobV91bmNvbW1pdHRlZENoYW5nZXMgJiBCYWNrZ3Jv
dW5kQ29sb3JDaGFuZ2VkKSAgLy8gTmVlZHMgdG8gaGFwcGVuIGJlZm9yZSBDaGlsZHJlbkNoYW5n
ZWQsIGFuZCBhZnRlciB1cGRhdGluZyBpbWFnZSBvciB2aWRlbwpAQCAtOTY5LDYgKzk2Nyw5IEBA
IHZvaWQgR3JhcGhpY3NMYXllckNBOjpjb21taXRMYXllckNoYW5nZXMKICAgICBpZiAobV91bmNv
bW1pdHRlZENoYW5nZXMgJiBNYXNrTGF5ZXJDaGFuZ2VkKQogICAgICAgICB1cGRhdGVNYXNrTGF5
ZXIoKTsKIAorICAgIGlmIChtX3VuY29tbWl0dGVkQ2hhbmdlcyAmIENvbnRlbnRzTmVlZHNEaXNw
bGF5KQorICAgICAgICB1cGRhdGVDb250ZW50c05lZWRzRGlzcGxheSgpOworCiAgICAgRU5EX0JM
T0NLX09CSkNfRVhDRVBUSU9OUwogfQogCkBAIC0xMzkwLDkgKzEzOTEsOSBAQCB2b2lkIEdyYXBo
aWNzTGF5ZXJDQTo6dXBkYXRlQ29udGVudHNNZWRpCiB9CiAKICNpZiBFTkFCTEUoM0RfQ0FOVkFT
KQotdm9pZCBHcmFwaGljc0xheWVyQ0E6OnVwZGF0ZUNvbnRlbnRzR3JhcGhpY3NDb250ZXh0M0Qo
KQordm9pZCBHcmFwaGljc0xheWVyQ0E6OnVwZGF0ZUNvbnRlbnRzV2ViR0xMYXllcigpCiB7Ci0g
ICAgLy8gQ2FudmFzM0QgbGF5ZXIgd2FzIHNldCBhcyBtX2NvbnRlbnRzTGF5ZXIsIGFuZCB3aWxs
IGdldCBwYXJlbnRlZCBpbiB1cGRhdGVTdWJsYXllckxpc3QoKS4KKyAgICAvLyBXZWJHTExheWVy
IHdhcyBzZXQgYXMgbV9jb250ZW50c0xheWVyLCBhbmQgd2lsbCBnZXQgcGFyZW50ZWQgaW4gdXBk
YXRlU3VibGF5ZXJMaXN0KCkuCiAgICAgaWYgKG1fY29udGVudHNMYXllcikgewogICAgICAgICBz
ZXR1cENvbnRlbnRzTGF5ZXIobV9jb250ZW50c0xheWVyLmdldCgpKTsKICAgICAgICAgW21fY29u
dGVudHNMYXllci5nZXQoKSBzZXROZWVkc0Rpc3BsYXldOwpAQCAtMTcxNiwzOCArMTcxNywxOSBA
QCB2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6cGF1c2VBbmltYXRpb25PbkxhCiB9CiAKICNpZiBFTkFC
TEUoM0RfQ0FOVkFTKQotdm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENvbnRlbnRzVG9HcmFwaGlj
c0NvbnRleHQzRChjb25zdCBHcmFwaGljc0NvbnRleHQzRCogZ3JhcGhpY3NDb250ZXh0M0QpCit2
b2lkIEdyYXBoaWNzTGF5ZXJDQTo6c2V0Q29udGVudHNUb1dlYkdMKFBsYXRmb3JtTGF5ZXIqIHdl
YmdsTGF5ZXIpCiB7Ci0gICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCBjb250ZXh0ID0gZ3Jh
cGhpY3NDb250ZXh0M0QtPnBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoKTsKLSAgICBQbGF0Zm9y
bTNET2JqZWN0IHRleHR1cmUgPSBncmFwaGljc0NvbnRleHQzRC0+cGxhdGZvcm1UZXh0dXJlKCk7
Ci0gICAgCi0gICAgaWYgKGNvbnRleHQgPT0gbV9wbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEICYm
IHRleHR1cmUgPT0gbV9wbGF0Zm9ybVRleHR1cmUpCisgICAgaWYgKHdlYmdsTGF5ZXIgPT0gbV9j
b250ZW50c0xheWVyKQogICAgICAgICByZXR1cm47CiAgICAgICAgIAotICAgIG1fcGxhdGZvcm1H
cmFwaGljc0NvbnRleHQzRCA9IGNvbnRleHQ7Ci0gICAgbV9wbGF0Zm9ybVRleHR1cmUgPSB0ZXh0
dXJlOwotICAgIAotICAgIG5vdGVTdWJsYXllcnNDaGFuZ2VkKCk7CisgICAgbV9jb250ZW50c0xh
eWVyID0gd2ViZ2xMYXllcjsKKyAgICBpZiAobV9jb250ZW50c0xheWVyICYmIFttX2NvbnRlbnRz
TGF5ZXIuZ2V0KCkgcmVzcG9uZHNUb1NlbGVjdG9yOkBzZWxlY3RvcihzZXRMYXllck93bmVyOild
KQorICAgICAgICBbKGlkKW1fY29udGVudHNMYXllci5nZXQoKSBzZXRMYXllck93bmVyOnRoaXNd
OwogICAgIAotICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUworICAgIG1fY29udGVudHNM
YXllclB1cnBvc2UgPSB3ZWJnbExheWVyID8gQ29udGVudHNMYXllckZvcldlYkdMIDogTm9Db250
ZW50c0xheWVyOwogCi0gICAgaWYgKG1fcGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCAhPSBOdWxs
UGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCAmJiBtX3BsYXRmb3JtVGV4dHVyZSAhPSBOdWxsUGxh
dGZvcm0zRE9iamVjdCkgewotICAgICAgICAvLyBjcmVhdGUgdGhlIGlubmVyIDNkIGxheWVyCi0g
ICAgICAgIG1fY29udGVudHNMYXllci5hZG9wdE5TKFtbV2ViR0xMYXllciBhbGxvY10gaW5pdFdp
dGhDb250ZXh0OmNvbnN0X2Nhc3Q8R3JhcGhpY3NDb250ZXh0M0QqPihncmFwaGljc0NvbnRleHQz
RCldKTsKLSNpZm5kZWYgTkRFQlVHCi0gICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0
TmFtZTpAIjNEIExheWVyIl07Ci0jZW5kaWYKLSAgICAgICAgW21fY29udGVudHNMYXllci5nZXQo
KSBzZXRMYXllck93bmVyOnRoaXNdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHJlbW92ZSB0
aGUgaW5uZXIgbGF5ZXIKLSAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXRMYXllck93
bmVyOjBdOwotICAgICAgICBtX2NvbnRlbnRzTGF5ZXIgPSAwOwotICAgIH0KLSAgICAKLSAgICBF
TkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCi0gICAgCi0gICAgbm90ZUxheWVyUHJvcGVydHlDaGFu
Z2VkKENvbnRlbnRzR3JhcGhpY3NDb250ZXh0M0RDaGFuZ2VkKTsKLSAgICBtX2NvbnRlbnRzTGF5
ZXJQdXJwb3NlID0gbV9jb250ZW50c0xheWVyID8gQ29udGVudHNMYXllckZvckdyYXBoaWNzTGF5
ZXIzRCA6IE5vQ29udGVudHNMYXllcjsKKyAgICBub3RlU3VibGF5ZXJzQ2hhbmdlZCgpOworICAg
IG5vdGVMYXllclByb3BlcnR5Q2hhbmdlZChDb250ZW50c1dlYkdMTGF5ZXJDaGFuZ2VkKTsKIH0K
ICNlbmRpZgogICAgIApAQCAtMTc2Miw2ICsxNzQ0LDEyIEBAIHZvaWQgR3JhcGhpY3NMYXllckNB
OjpyZXBhaW50TGF5ZXJEaXJ0eVIKICAgICBtX2RpcnR5UmVjdHMuY2xlYXIoKTsKIH0KIAordm9p
ZCBHcmFwaGljc0xheWVyQ0E6OnVwZGF0ZUNvbnRlbnRzTmVlZHNEaXNwbGF5KCkKK3sKKyAgICBp
ZiAobV9jb250ZW50c0xheWVyKQorICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHNldE5l
ZWRzRGlzcGxheV07Cit9CisKIGJvb2wgR3JhcGhpY3NMYXllckNBOjpjcmVhdGVBbmltYXRpb25G
cm9tS2V5ZnJhbWVzKGNvbnN0IEtleWZyYW1lVmFsdWVMaXN0JiB2YWx1ZUxpc3QsIGNvbnN0IEFu
aW1hdGlvbiogYW5pbWF0aW9uLCBjb25zdCBTdHJpbmcmIGtleWZyYW1lc05hbWUsIGRvdWJsZSB0
aW1lT2Zmc2V0KQogewogICAgIEFTU0VSVCh2YWx1ZUxpc3QucHJvcGVydHkoKSAhPSBBbmltYXRl
ZFByb3BlcnR5V2Via2l0VHJhbnNmb3JtKTsKQEAgLTI1NjYsMTQgKzI1NTQsNiBAQCB2b2lkIEdy
YXBoaWNzTGF5ZXJDQTo6bm90ZUxheWVyUHJvcGVydHlDCiAgICAgbV91bmNvbW1pdHRlZENoYW5n
ZXMgfD0gZmxhZ3M7CiB9CiAKLSNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotdm9pZCBHcmFwaGljc0xh
eWVyQ0E6OnNldEdyYXBoaWNzQ29udGV4dDNETmVlZHNEaXNwbGF5KCkKLXsKLSAgICBpZiAobV9j
b250ZW50c0xheWVyUHVycG9zZSA9PSBDb250ZW50c0xheWVyRm9yR3JhcGhpY3NMYXllcjNEKQot
ICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHNldE5lZWRzRGlzcGxheV07Ci19Ci0jZW5k
aWYKLSAgICAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dl
YkdMTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9X
ZWJHTExheWVyLmgJKHJldmlzaW9uIDYxMjY2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvV2ViR0xMYXllci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw3IEBACiAKICNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAKLSNpbXBvcnQgIldlYkxheWVyLmgiCisj
aW1wb3J0IDxRdWFydHpDb3JlL1F1YXJ0ekNvcmUuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
ICAgIGNsYXNzIEdyYXBoaWNzTGF5ZXI7CkBAIC0zOSwxMSArMzksOSBAQCBAaW50ZXJmYWNlIFdl
YkdMTGF5ZXIgOiBDQU9wZW5HTExheWVyIAogewogICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIq
IG1fbGF5ZXJPd25lcjsKICAgICBXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRCogbV9jb250ZXh0
OwotICAgIENHTENvbnRleHRPYmogbV9jb250ZXh0T2JqOwotICAgIEdMdWludCBtX3RleHR1cmU7
CiB9CiAKLS0gKGlkKWluaXRXaXRoQ29udGV4dDooV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Qq
KWNvbnRleHQ7CistIChpZClpbml0V2l0aEdyYXBoaWNzQ29udGV4dDNEOihXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRCopY29udGV4dDsKIAogLSAoQ0dJbWFnZVJlZiljb3B5SW1hZ2VTbmFwc2hv
dFdpdGhDb2xvclNwYWNlOihDR0NvbG9yU3BhY2VSZWYpY29sb3JTcGFjZTsKIApJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViR0xMYXllci5tbQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJHTExheWVyLm1tCShyZXZpc2lvbiA2MTI2
NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkdMTGF5ZXIubW0JKHdvcmtp
bmcgY29weSkKQEAgLTMwLDggKzMwLDggQEAKIAogI2ltcG9ydCAiV2ViR0xMYXllci5oIgogCisj
aW1wb3J0ICJHcmFwaGljc0NvbnRleHQzRC5oIgogI2ltcG9ydCAiR3JhcGhpY3NMYXllci5oIgot
I2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+CiAjaW1wb3J0IDxPcGVuR0wvT3BlbkdM
Lmg+CiAjaW1wb3J0IDx3dGYvRmFzdE1hbGxvYy5oPgogI2ltcG9ydCA8d3RmL1JldGFpblB0ci5o
PgpAQCAtNDEsMTEgKzQxLDkgQEAgdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIEBpbXBsZW1l
bnRhdGlvbiBXZWJHTExheWVyCiAKLS0oaWQpaW5pdFdpdGhDb250ZXh0OihHcmFwaGljc0NvbnRl
eHQzRCopY29udGV4dAorLShpZClpbml0V2l0aEdyYXBoaWNzQ29udGV4dDNEOihHcmFwaGljc0Nv
bnRleHQzRCopY29udGV4dAogewogICAgIG1fY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgbV9jb250
ZXh0T2JqID0gc3RhdGljX2Nhc3Q8Q0dMQ29udGV4dE9iaj4oY29udGV4dC0+cGxhdGZvcm1HcmFw
aGljc0NvbnRleHQzRCgpKTsKLSAgICBtX3RleHR1cmUgPSBzdGF0aWNfY2FzdDxHTHVpbnQ+KGNv
bnRleHQtPnBsYXRmb3JtVGV4dHVyZSgpKTsKICAgICBzZWxmID0gW3N1cGVyIGluaXRdOwogICAg
IHJldHVybiBzZWxmOwogfQpAQCAtNTksMTMgKzU3LDEzIEBAIC0oQ0dMUGl4ZWxGb3JtYXRPYmop
Y29weUNHTFBpeGVsRm9ybWF0Rm8KICAgICAvLyBJZiBuZWVkZWQgd2Ugd2lsbCBoYXZlIHRvIHNl
dCB0aGUgZGlzcGxheSBtYXNrIGluIHRoZSBDYW52YXMgQ0dMQ29udGV4dCBhbmQKICAgICAvLyBt
YWtlIHN1cmUgaXQgbWF0Y2hlcy4KICAgICBVTlVTRURfUEFSQU0obWFzayk7Ci0gICAgcmV0dXJu
IENHTFJldGFpblBpeGVsRm9ybWF0KENHTEdldFBpeGVsRm9ybWF0KG1fY29udGV4dE9iaikpOwor
ICAgIHJldHVybiBDR0xSZXRhaW5QaXhlbEZvcm1hdChDR0xHZXRQaXhlbEZvcm1hdChtX2NvbnRl
eHQtPnBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoKSkpOwogfQogCiAtKENHTENvbnRleHRPYmop
Y29weUNHTENvbnRleHRGb3JQaXhlbEZvcm1hdDooQ0dMUGl4ZWxGb3JtYXRPYmopcGl4ZWxGb3Jt
YXQKIHsKICAgICBDR0xDb250ZXh0T2JqIGNvbnRleHRPYmo7Ci0gICAgQ0dMQ3JlYXRlQ29udGV4
dChwaXhlbEZvcm1hdCwgbV9jb250ZXh0T2JqLCAmY29udGV4dE9iaik7CisgICAgQ0dMQ3JlYXRl
Q29udGV4dChwaXhlbEZvcm1hdCwgbV9jb250ZXh0LT5wbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNE
KCksICZjb250ZXh0T2JqKTsKICAgICByZXR1cm4gY29udGV4dE9iajsKIH0KIApAQCAtODYsNyAr
ODQsNyBAQCAtKHZvaWQpZHJhd0luQ0dMQ29udGV4dDooQ0dMQ29udGV4dE9iailnCiAgICAgZ2xM
b2FkSWRlbnRpdHkoKTsKIAogICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIGdsQmlu
ZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdM
X1RFWFRVUkVfMkQsIG1fY29udGV4dC0+cGxhdGZvcm1UZXh0dXJlKCkpOwogICAgIAogICAgIGds
QmVnaW4oR0xfVFJJQU5HTEVfRkFOKTsKICAgICAgICAgZ2xUZXhDb29yZDJmKDAsIDApOwpAQCAt
MTEzLDcgKzExMSw3IEBAIHN0YXRpYyB2b2lkIGZyZWVEYXRhKHZvaWQgKiwgY29uc3Qgdm9pZCAK
IAogLShDR0ltYWdlUmVmKWNvcHlJbWFnZVNuYXBzaG90V2l0aENvbG9yU3BhY2U6KENHQ29sb3JT
cGFjZVJlZiljb2xvclNwYWNlCiB7Ci0gICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHQtPnBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0M0QoKSk7CiAKICAgICBSZXRhaW5QdHI8Q0dDb2xvclNwYWNlUmVmPiBpbWFnZUNv
bG9yU3BhY2UgPSBjb2xvclNwYWNlOwogICAgIGlmICghaW1hZ2VDb2xvclNwYWNlKQpAQCAtMTUx
LDcgKzE0OSw3IEBAIC0gKHZvaWQpZGlzcGxheQogCiBAZW5kCiAKLUBpbXBsZW1lbnRhdGlvbiBX
ZWJHTExheWVyKFdlYkxheWVyQWRkaXRpb25zKQorQGltcGxlbWVudGF0aW9uIFdlYkdMTGF5ZXIo
V2ViR0xMYXllckFkZGl0aW9ucykKIAogLSh2b2lkKXNldExheWVyT3duZXI6KEdyYXBoaWNzTGF5
ZXIqKWFMYXllcgogewpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5n
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJhY2tpbmcu
Y3BwCShyZXZpc2lvbiA2MTI2NikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFj
a2luZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIxNiw4ICsyMTYsOCBAQCBib29sIFJlbmRlckxh
eWVyQmFja2luZzo6dXBkYXRlR3JhcGhpY3NMCiAgICAgZWxzZSBpZiAoaXMzRENhbnZhcyhyZW5k
ZXJlcigpKSkgewogICAgICAgICBIVE1MQ2FudmFzRWxlbWVudCogY2FudmFzID0gc3RhdGljX2Nh
c3Q8SFRNTENhbnZhc0VsZW1lbnQqPihyZW5kZXJlcigpLT5ub2RlKCkpOwogICAgICAgICBXZWJH
TFJlbmRlcmluZ0NvbnRleHQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxXZWJHTFJlbmRlcmluZ0Nv
bnRleHQqPihjYW52YXMtPnJlbmRlcmluZ0NvbnRleHQoKSk7Ci0gICAgICAgIGlmIChjb250ZXh0
LT5ncmFwaGljc0NvbnRleHQzRCgpLT5wbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCkpCi0gICAg
ICAgICAgICBtX2dyYXBoaWNzTGF5ZXItPnNldENvbnRlbnRzVG9HcmFwaGljc0NvbnRleHQzRChj
b250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpKTsKKyAgICAgICAgaWYgKGNvbnRleHQtPmdyYXBo
aWNzQ29udGV4dDNEKCktPnBsYXRmb3JtTGF5ZXIoKSkKKyAgICAgICAgICAgIG1fZ3JhcGhpY3NM
YXllci0+c2V0Q29udGVudHNUb1dlYkdMKGNvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPnBs
YXRmb3JtTGF5ZXIoKSk7CiAgICAgfQogI2VuZGlmCiAKQEAgLTcyNiw3ICs3MjYsNyBAQCB2b2lk
IFJlbmRlckxheWVyQmFja2luZzo6cmVuZGVyZXJDb250ZW50CiAKICNpZiBFTkFCTEUoM0RfQ0FO
VkFTKSAgICAKICAgICBpZiAoaXMzRENhbnZhcyhyZW5kZXJlcigpKSkgewotICAgICAgICBtX2dy
YXBoaWNzTGF5ZXItPnNldEdyYXBoaWNzQ29udGV4dDNETmVlZHNEaXNwbGF5KCk7CisgICAgICAg
IG1fZ3JhcGhpY3NMYXllci0+c2V0Q29udGVudHNOZWVkc0Rpc3BsYXkoKTsKICAgICAgICAgcmV0
dXJuOwogICAgIH0KICNlbmRpZgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>59419</attachid>
            <date>2010-06-22 15:06:58 -0700</date>
            <delta_ts>2010-06-22 15:16:40 -0700</delta_ts>
            <desc>Replacement patch fixing style issue and Qt build failure</desc>
            <filename>40643-3.patch</filename>
            <type>text/plain</type>
            <size>18888</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2MTYyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDQgQEAKKzIwMTAtMDYtMjIgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MDY0MworICAgICAgICAKKyAg
ICAgICAgRmluYWwgcGhhc2Ugb2YgbW92aW5nIG93bmVyc2hpcCBvZiBXZWJHTExheWVyIHRvIEdy
YXBoaWNzQ29udGV4dDNELgorICAgICAgICBBcyBpdCB0dXJucyBvdXQsIEkgc3RpbGwgaGF2ZSB0
byBoYXZlIGEgc2VwYXJhdGUgQ0dMQ29udGV4dE9iaiBmb3IKKyAgICAgICAgcmVuZGVyaW5nIGJl
Y2F1c2UgQ29yZSBBbmltYXRpb24gY29tcG9zaXRlcyBpbiBhIHNlcGFyYXRlIHRocmVhZCwKKyAg
ICAgICAgc28gd2UgbmVlZCB0byBkaXNjb25uZWN0IFdlYkdMIHJlbmRlcmluZyBmcm9tIENBIGNv
bXBvc2l0aW5nLiBCdXQKKyAgICAgICAgdGhpcyBjaGFuZ2UgaXMgc3RpbGwgd29ydGh3aGlsZSBi
ZWNhdXNlIGl0IHJlZHVjZXMgZGVwZW5kZW5jaWVzCisgICAgICAgIGFuZCBtYWtlcyBpdCBlYXNp
ZXIgdG8gcG9ydCBXZWJHTCB0byBvdGhlciBwbGF0Zm9ybXMuCisgICAgICAgIAorICAgICAgICBO
byBuZXcgdGVzdHMgc2luY2UgdGhpcyBpcyBqdXN0IHJlc3RydWN0dXJpbmcgYW5kIHRoZSBjdXJy
ZW50IHRlc3RzCisgICAgICAgIGFyZSBhbGwgc3RpbGwgdmFsaWQgYW5kIGRvIGEgc3VmZmljaWVu
dCB0ZXN0IG9mIFdlYkdMIGZ1bmN0aW9uYWxpdHkuCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9HcmFwaGljc0NvbnRleHQzRC5oOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OnBsYXRmb3JtTGF5ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OnNldENvbnRlbnRz
VG9XZWJHTCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpzZXRXZWJHTE5lZWRz
RGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4
dDNETWFjLm1tOiBBZGQgY3JlYXRpb24gb2YgV2ViR0xMYXllcgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLmg6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0xheWVyQ0E6Oik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNz
TGF5ZXJDQS5tbTogSGFuZGxlIHNldHRpbmcgb2YgV2ViR0xMYXllciBhcyBjb250ZW50IHRoZSBz
YW1lIGFzIGZvciBNZWRpYUxheWVyLiBBbHNvIGNoYW5nZWQgV2ViR0wgcmVsYXRlZCBuYW1lcyBm
b3IgY2xhcml0eQorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBOjpHcmFwaGljc0xh
eWVyQ0EpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBOjpjb21taXRMYXllckNo
YW5nZXNCZWZvcmVTdWJsYXllcnMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNB
Ojp1cGRhdGVDb250ZW50c1dlYkdMTGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNBOjpzZXRDb250ZW50c1RvV2ViR0wpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNBOjpzZXRXZWJHTE5lZWRzRGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1dlYkdMTGF5ZXIuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2Vi
R0xMYXllci5tbTogR290IHJpZCBvZiBzdG9yYWdlIGZvciBjb250ZXh0IGFuZCB0ZXh0dXJlLCBu
b3cganVzdCBzdG9yZSBHcmFwaGljc0NvbnRleHQzRCBhbmQgZ2V0IHRoZW0gZnJvbSB0aGVyZSB3
aGVuIG5lZWRlZAorICAgICAgICAoLVtXZWJHTExheWVyIGNvcHlDR0xQaXhlbEZvcm1hdEZvckRp
c3BsYXlNYXNrOl0pOgorICAgICAgICAoLVtXZWJHTExheWVyIGNvcHlDR0xDb250ZXh0Rm9yUGl4
ZWxGb3JtYXQ6XSk6CisgICAgICAgICgtW1dlYkdMTGF5ZXIgZHJhd0luQ0dMQ29udGV4dDpwaXhl
bEZvcm1hdDpmb3JMYXllclRpbWU6ZGlzcGxheVRpbWU6XSk6CisgICAgICAgICgtW1dlYkdMTGF5
ZXIgY29weUltYWdlU25hcHNob3RXaXRoQ29sb3JTcGFjZTpdKToKKyAgICAgICAgKiByZW5kZXJp
bmcvUmVuZGVyTGF5ZXJCYWNraW5nLmNwcDogQ2hhbmdlZCBpbml0IG9mIFdlYkdMIGNvbnRlbnRz
TGF5ZXIgdG8gcGFzcyBXZWJHTExheWVyIHJhdGhlciB0aGFuIEdyYXBoaWNzQ29udGV4dDNECisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJMYXllckJhY2tpbmc6OnVwZGF0ZUdyYXBoaWNzTGF5ZXJD
b25maWd1cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckxheWVyQmFja2luZzo6cmVu
ZGVyZXJDb250ZW50Q2hhbmdlZCk6CisKIDIwMTAtMDYtMjIgIERhcmluIEFkbGVyICA8ZGFyaW5A
YXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFsZXhleSBQcm9za3VyeWFrb3YuCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRC5oCShy
ZXZpc2lvbiA2MTI2NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250
ZXh0M0QuaAkod29ya2luZyBjb3B5KQpAQCAtMzksMTEgKzM5LDIwIEBACiAKICNpZiBQTEFURk9S
TShNQUMpCiAjaW5jbHVkZSA8T3BlbkdML09wZW5HTC5oPgorI2luY2x1ZGUgPHd0Zi9SZXRhaW5Q
dHIuaD4KIAotdHlwZWRlZiB2b2lkKiBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEOwordHlwZWRl
ZiBDR0xDb250ZXh0T2JqIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0Q7CiBjb25zdCAgUGxhdGZv
cm1HcmFwaGljc0NvbnRleHQzRCBOdWxsUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCA9IDA7CiB0
eXBlZGVmIEdMdWludCBQbGF0Zm9ybTNET2JqZWN0OwogY29uc3QgUGxhdGZvcm0zRE9iamVjdCBO
dWxsUGxhdGZvcm0zRE9iamVjdCA9IDA7CisKKyNpZmRlZiBfX09CSkNfXworQGNsYXNzIENBTGF5
ZXI7CitAY2xhc3MgV2ViR0xMYXllcjsKKyNlbHNlCit0eXBlZGVmIHZvaWQqIENBTGF5ZXI7Cit0
eXBlZGVmIHZvaWQqIFdlYkdMTGF5ZXI7CisjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFFUKQogY2xh
c3MgUVBhaW50ZXI7CiBjbGFzcyBRUmVjdDsKQEAgLTQyMSw2ICs0MzAsNyBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAjaWYgUExBVEZPUk0oTUFDKQogICAgICAgICBQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dDNEIHBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoKSBjb25zdCB7IHJldHVybiBtX2NvbnRl
eHRPYmo7IH0KICAgICAgICAgUGxhdGZvcm0zRE9iamVjdCBwbGF0Zm9ybVRleHR1cmUoKSBjb25z
dCB7IHJldHVybiBtX3RleHR1cmU7IH0KKyAgICAgICAgQ0FMYXllciogcGxhdGZvcm1MYXllcigp
IGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PENBTGF5ZXIqPihtX3dlYkdMTGF5ZXIuZ2V0KCkp
OyB9CiAjZWxpZiBQTEFURk9STShDSFJPTUlVTSkKICAgICAgICAgUGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQzRCBwbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCkgY29uc3Q7CiAgICAgICAgIFBsYXRm
b3JtM0RPYmplY3QgcGxhdGZvcm1UZXh0dXJlKCkgY29uc3Q7CkBAIC03MzYsNiArNzQ2LDcgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBWZWN0b3I8VmVjdG9yPGZsb2F0PiA+IG1fdmVy
dGV4QXJyYXk7CiAgICAgICAgIAogICAgICAgICBDR0xDb250ZXh0T2JqIG1fY29udGV4dE9iajsK
KyAgICAgICAgUmV0YWluUHRyPFdlYkdMTGF5ZXI+IG1fd2ViR0xMYXllcjsKICAgICAgICAgR0x1
aW50IG1fdGV4dHVyZTsKICAgICAgICAgR0x1aW50IG1fZmJvOwogICAgICAgICBHTHVpbnQgbV9k
ZXB0aFN0ZW5jaWxCdWZmZXI7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzTGF5ZXIuaAkocmV2aXNpb24gNjEyNjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMzMsOSArMzMsNiBAQAogI2luY2x1
ZGUgIkZsb2F0UG9pbnQuaCIKICNpbmNsdWRlICJGbG9hdFBvaW50M0QuaCIKICNpbmNsdWRlICJG
bG9hdFNpemUuaCIKLSNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dDNELmgiCi0jZW5kaWYKICNpbmNsdWRlICJHcmFwaGljc0xheWVyQ2xpZW50LmgiCiAjaW5j
bHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCkBAIC0y
ODEsNiArMjc4LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXko
KSA9IDA7CiAgICAgLy8gbWFyayB0aGUgZ2l2ZW4gcmVjdCAoaW4gbGF5ZXIgY29vcmRzKSBhcyBu
ZWVkaW5nIGRpc3BheS4gTmV2ZXIgZ29lcyBkZWVwLgogICAgIHZpcnR1YWwgdm9pZCBzZXROZWVk
c0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JikgPSAwOworICAgIAorICAgIHZpcnR1YWwg
dm9pZCBzZXRDb250ZW50c05lZWRzRGlzcGxheSgpIHsgfTsKIAogICAgIC8vIFNldCB0aGF0IHRo
ZSBwb3NpdGlvbi9zaXplIG9mIHRoZSBjb250ZW50cyAoaW1hZ2Ugb3IgdmlkZW8pLgogICAgIElu
dFJlY3QgY29udGVudHNSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50c1JlY3Q7IH0KQEAg
LTMwMiw4ICszMDEsNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzQmFj
a2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJikgeyB9CiAgICAgCiAjaWYgRU5BQkxFKDNEX0NBTlZB
UykKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0dyYXBoaWNzQ29udGV4dDNEKGNvbnN0
IEdyYXBoaWNzQ29udGV4dDNEKikgeyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldEdyYXBoaWNzQ29u
dGV4dDNETmVlZHNEaXNwbGF5KCkgeyB9CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9X
ZWJHTChQbGF0Zm9ybUxheWVyKikgeyB9CiAjZW5kaWYKICAgICAvLyBDYWxsYmFjayBmcm9tIHRo
ZSB1bmRlcmx5aW5nIGdyYXBoaWNzIHN5c3RlbSB0byBkcmF3IGxheWVyIGNvbnRlbnRzLgogICAg
IHZvaWQgcGFpbnRHcmFwaGljc0xheWVyQ29udGVudHMoR3JhcGhpY3NDb250ZXh0JiwgY29uc3Qg
SW50UmVjdCYgY2xpcCk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFw
aGljc0NvbnRleHQzRE1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQkocmV2aXNpb24gNjEyNjYpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQkod29ya2lu
ZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0Qu
aCIKIAorI2ltcG9ydCAiQmxvY2tFeGNlcHRpb25zLmgiCiAjaW5jbHVkZSAiQ2FudmFzT2JqZWN0
LmgiCiAjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5o
IgpAQCAtMzgsNiArMzksNyBAQAogI2luY2x1ZGUgIkZsb2F0MzJBcnJheS5oIgogI2luY2x1ZGUg
IldlYkdMRnJhbWVidWZmZXIuaCIKICNpbmNsdWRlICJJbnQzMkFycmF5LmgiCisjaW5jbHVkZSAi
V2ViR0xMYXllci5oIgogI2luY2x1ZGUgIldlYkdMUHJvZ3JhbS5oIgogI2luY2x1ZGUgIldlYkdM
UmVuZGVyYnVmZmVyLmgiCiAjaW5jbHVkZSAiV2ViR0xTaGFkZXIuaCIKQEAgLTE0Niw2ICsxNDgs
MTQgQEAgR3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdyYQogICAgIAogICAg
IHZhbGlkYXRlQXR0cmlidXRlcygpOwogCisgICAgLy8gQ3JlYXRlIHRoZSBXZWJHTExheWVyCisg
ICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgICAgIG1fd2ViR0xMYXllci5hZG9w
dE5TKFtbV2ViR0xMYXllciBhbGxvY10gaW5pdFdpdGhHcmFwaGljc0NvbnRleHQzRDp0aGlzXSk7
CisjaWZuZGVmIE5ERUJVRworICAgICAgICBbbV93ZWJHTExheWVyLmdldCgpIHNldE5hbWU6QCJX
ZWJHTCBMYXllciJdOworI2VuZGlmICAgIAorICAgIEVORF9CTE9DS19PQkpDX0VYQ0VQVElPTlMK
KyAgICAKICAgICAvLyBjcmVhdGUgYSB0ZXh0dXJlIHRvIHJlbmRlciBpbnRvCiAgICAgOjpnbEdl
blRleHR1cmVzKDEsICZtX3RleHR1cmUpOwogICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJF
XzJELCBtX3RleHR1cmUpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3Jh
cGhpY3NMYXllckNBLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9t
YWMvR3JhcGhpY3NMYXllckNBLmgJKHJldmlzaW9uIDYxMjY2KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLmgJKHdvcmtpbmcgY29weSkKQEAgLTg5LDEw
ICs4OSw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsK
ICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYp
OwotCi0jaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAgICB2aXJ0dWFsIHZvaWQgc2V0R3JhcGhpY3ND
b250ZXh0M0ROZWVkc0Rpc3BsYXkoKTsKLSNlbmRpZgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb250
ZW50c05lZWRzRGlzcGxheSgpOwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c1Jl
Y3QoY29uc3QgSW50UmVjdCYpOwogICAgIApAQCAtMTA3LDcgKzEwNCw3IEBAIHB1YmxpYzoKICAg
ICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0ltYWdlKEltYWdlKik7CiAgICAgdmlydHVhbCB2
b2lkIHNldENvbnRlbnRzVG9NZWRpYShQbGF0Zm9ybUxheWVyKik7CiAjaWYgRU5BQkxFKDNEX0NB
TlZBUykKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNUb0dyYXBoaWNzQ29udGV4dDNEKGNv
bnN0IEdyYXBoaWNzQ29udGV4dDNEKik7CisgICAgdmlydHVhbCB2b2lkIHNldENvbnRlbnRzVG9X
ZWJHTChQbGF0Zm9ybUxheWVyKik7CiAjZW5kaWYKICAgICAKICAgICB2aXJ0dWFsIFBsYXRmb3Jt
TGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdDsKQEAgLTI2MCw3ICsyNTcsNyBAQCBwcml2YXRl
OgogICAgIHZvaWQgdXBkYXRlQ29udGVudHNJbWFnZSgpOwogICAgIHZvaWQgdXBkYXRlQ29udGVu
dHNNZWRpYUxheWVyKCk7CiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAgICB2b2lkIHVwZGF0ZUNv
bnRlbnRzR3JhcGhpY3NDb250ZXh0M0QoKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzV2ViR0xM
YXllcigpOwogI2VuZGlmCiAgICAgdm9pZCB1cGRhdGVDb250ZW50c1JlY3QoKTsKICAgICB2b2lk
IHVwZGF0ZUdlb21ldHJ5T3JpZW50YXRpb24oKTsKQEAgLTI2OCw2ICsyNjUsNyBAQCBwcml2YXRl
OgogICAgIHZvaWQgdXBkYXRlUmVwbGljYXRlZExheWVycygpOwogCiAgICAgdm9pZCB1cGRhdGVM
YXllckFuaW1hdGlvbnMoKTsKKyAgICB2b2lkIHVwZGF0ZUNvbnRlbnRzTmVlZHNEaXNwbGF5KCk7
CiAgICAgCiAgICAgZW51bSBTdHJ1Y3R1cmFsTGF5ZXJQdXJwb3NlIHsKICAgICAgICAgTm9TdHJ1
Y3R1cmFsTGF5ZXIgPSAwLApAQCAtMzA2LDEyICszMDQsMTMgQEAgcHJpdmF0ZToKICAgICAgICAg
Q29udGVudHNJbWFnZUNoYW5nZWQgPSAxIDw8IDE3LAogICAgICAgICBDb250ZW50c01lZGlhTGF5
ZXJDaGFuZ2VkID0gMSA8PCAxOCwKICNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotICAgICAgICBDb250
ZW50c0dyYXBoaWNzQ29udGV4dDNEQ2hhbmdlZCA9IDEgPDwgMTksCisgICAgICAgIENvbnRlbnRz
V2ViR0xMYXllckNoYW5nZWQgPSAxIDw8IDE5LAogI2VuZGlmCiAgICAgICAgIENvbnRlbnRzUmVj
dENoYW5nZWQgPSAxIDw8IDIwLAogICAgICAgICBHZW9tZXRyeU9yaWVudGF0aW9uQ2hhbmdlZCA9
IDEgPDwgMjEsCiAgICAgICAgIE1hc2tMYXllckNoYW5nZWQgPSAxIDw8IDIyLAotICAgICAgICBS
ZXBsaWNhdGVkTGF5ZXJDaGFuZ2VkID0gMSA8PCAyMworICAgICAgICBSZXBsaWNhdGVkTGF5ZXJD
aGFuZ2VkID0gMSA8PCAyMywKKyAgICAgICAgQ29udGVudHNOZWVkc0Rpc3BsYXkgPSAxIDw8IDI0
CiAgICAgfTsKICAgICB0eXBlZGVmIHVuc2lnbmVkIExheWVyQ2hhbmdlRmxhZ3M7CiAgICAgdm9p
ZCBub3RlTGF5ZXJQcm9wZXJ0eUNoYW5nZWQoTGF5ZXJDaGFuZ2VGbGFncyBmbGFncyk7CkBAIC0z
MzMsNyArMzMyLDcgQEAgcHJpdmF0ZToKICAgICAgICAgQ29udGVudHNMYXllckZvckltYWdlLAog
ICAgICAgICBDb250ZW50c0xheWVyRm9yTWVkaWEKICNpZiBFTkFCTEUoM0RfQ0FOVkFTKQotICAg
ICAgICAsQ29udGVudHNMYXllckZvckdyYXBoaWNzTGF5ZXIzRAorICAgICAgICAsIENvbnRlbnRz
TGF5ZXJGb3JXZWJHTAogI2VuZGlmCiAgICAgfTsKICAgICAKQEAgLTM4OSwxMSArMzg4LDYgQEAg
cHJpdmF0ZToKICAgICBWZWN0b3I8RmxvYXRSZWN0PiBtX2RpcnR5UmVjdHM7CiAgICAgCiAgICAg
TGF5ZXJDaGFuZ2VGbGFncyBtX3VuY29tbWl0dGVkQ2hhbmdlczsKLSAgICAKLSNpZiBFTkFCTEUo
M0RfQ0FOVkFTKQotICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QgbV9wbGF0Zm9ybUdyYXBo
aWNzQ29udGV4dDNEOwotICAgIFBsYXRmb3JtM0RPYmplY3QgbV9wbGF0Zm9ybVRleHR1cmU7Ci0j
ZW5kaWYKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzTGF5ZXJDQS5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0xheWVyQ0EubW0JKHJldmlzaW9uIDYxMjY2
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NMYXllckNBLm1tCSh3
b3JraW5nIGNvcHkpCkBAIC0zMSw5ICszMSw2IEBACiAKICNpbXBvcnQgIkFuaW1hdGlvbi5oIgog
I2ltcG9ydCAiQmxvY2tFeGNlcHRpb25zLmgiCi0jaWYgRU5BQkxFKDNEX0NBTlZBUykKLSNpbXBv
cnQgIldlYkdMTGF5ZXIuaCIKLSNlbmRpZgogI2ltcG9ydCAiRmxvYXRDb252ZXJzaW9uLmgiCiAj
aW1wb3J0ICJGbG9hdFJlY3QuaCIKICNpbXBvcnQgIkltYWdlLmgiCkBAIC0zNjksMTAgKzM2Niw2
IEBAIEdyYXBoaWNzTGF5ZXJDQTo6R3JhcGhpY3NMYXllckNBKEdyYXBoaWMKICAgICAsIG1fY29u
dGVudHNMYXllclB1cnBvc2UoTm9Db250ZW50c0xheWVyKQogICAgICwgbV9jb250ZW50c0xheWVy
SGFzQmFja2dyb3VuZENvbG9yKGZhbHNlKQogICAgICwgbV91bmNvbW1pdHRlZENoYW5nZXMoTm9D
aGFuZ2UpCi0jaWYgRU5BQkxFKDNEX0NBTlZBUykKLSAgICAsIG1fcGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQzRChOdWxsUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCkKLSAgICAsIG1fcGxhdGZvcm1U
ZXh0dXJlKE51bGxQbGF0Zm9ybTNET2JqZWN0KQotI2VuZGlmCiB7CiAgICAgQkVHSU5fQkxPQ0tf
T0JKQ19FWENFUFRJT05TCiAgICAgbV9sYXllci5hZG9wdE5TKFtbV2ViTGF5ZXIgYWxsb2NdIGlu
aXRdKTsKQEAgLTY5Nyw2ICs2OTAsMTEgQEAgdm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldE5lZWRz
RGlzcGxheUluUgogICAgIG5vdGVMYXllclByb3BlcnR5Q2hhbmdlZChEaXJ0eVJlY3RzQ2hhbmdl
ZCk7CiB9CiAKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRDb250ZW50c05lZWRzRGlzcGxheSgp
Cit7CisgICAgbm90ZUxheWVyUHJvcGVydHlDaGFuZ2VkKENvbnRlbnRzTmVlZHNEaXNwbGF5KTsK
K30KKwogdm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENvbnRlbnRzUmVjdChjb25zdCBJbnRSZWN0
JiByZWN0KQogewogICAgIGlmIChyZWN0ID09IG1fY29udGVudHNSZWN0KQpAQCAtOTE0LDggKzkx
Miw4IEBAIHZvaWQgR3JhcGhpY3NMYXllckNBOjpjb21taXRMYXllckNoYW5nZXMKICAgICAgICAg
dXBkYXRlQ29udGVudHNNZWRpYUxheWVyKCk7CiAgICAgCiAjaWYgRU5BQkxFKDNEX0NBTlZBUykK
LSAgICBpZiAobV91bmNvbW1pdHRlZENoYW5nZXMgJiBDb250ZW50c0dyYXBoaWNzQ29udGV4dDNE
Q2hhbmdlZCkgLy8gTmVlZHMgdG8gaGFwcGVuIGJlZm9yZSBDaGlsZHJlbkNoYW5nZWQKLSAgICAg
ICAgdXBkYXRlQ29udGVudHNHcmFwaGljc0NvbnRleHQzRCgpOworICAgIGlmIChtX3VuY29tbWl0
dGVkQ2hhbmdlcyAmIENvbnRlbnRzV2ViR0xMYXllckNoYW5nZWQpIC8vIE5lZWRzIHRvIGhhcHBl
biBiZWZvcmUgQ2hpbGRyZW5DaGFuZ2VkCisgICAgICAgIHVwZGF0ZUNvbnRlbnRzV2ViR0xMYXll
cigpOwogI2VuZGlmCiAgICAgCiAgICAgaWYgKG1fdW5jb21taXR0ZWRDaGFuZ2VzICYgQmFja2dy
b3VuZENvbG9yQ2hhbmdlZCkgIC8vIE5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgQ2hpbGRyZW5DaGFu
Z2VkLCBhbmQgYWZ0ZXIgdXBkYXRpbmcgaW1hZ2Ugb3IgdmlkZW8KQEAgLTk2OSw2ICs5NjcsOSBA
QCB2b2lkIEdyYXBoaWNzTGF5ZXJDQTo6Y29tbWl0TGF5ZXJDaGFuZ2VzCiAgICAgaWYgKG1fdW5j
b21taXR0ZWRDaGFuZ2VzICYgTWFza0xheWVyQ2hhbmdlZCkKICAgICAgICAgdXBkYXRlTWFza0xh
eWVyKCk7CiAKKyAgICBpZiAobV91bmNvbW1pdHRlZENoYW5nZXMgJiBDb250ZW50c05lZWRzRGlz
cGxheSkKKyAgICAgICAgdXBkYXRlQ29udGVudHNOZWVkc0Rpc3BsYXkoKTsKKwogICAgIEVORF9C
TE9DS19PQkpDX0VYQ0VQVElPTlMKIH0KIApAQCAtMTM5MCw5ICsxMzkxLDkgQEAgdm9pZCBHcmFw
aGljc0xheWVyQ0E6OnVwZGF0ZUNvbnRlbnRzTWVkaQogfQogCiAjaWYgRU5BQkxFKDNEX0NBTlZB
UykKLXZvaWQgR3JhcGhpY3NMYXllckNBOjp1cGRhdGVDb250ZW50c0dyYXBoaWNzQ29udGV4dDNE
KCkKK3ZvaWQgR3JhcGhpY3NMYXllckNBOjp1cGRhdGVDb250ZW50c1dlYkdMTGF5ZXIoKQogewot
ICAgIC8vIENhbnZhczNEIGxheWVyIHdhcyBzZXQgYXMgbV9jb250ZW50c0xheWVyLCBhbmQgd2ls
bCBnZXQgcGFyZW50ZWQgaW4gdXBkYXRlU3VibGF5ZXJMaXN0KCkuCisgICAgLy8gV2ViR0xMYXll
ciB3YXMgc2V0IGFzIG1fY29udGVudHNMYXllciwgYW5kIHdpbGwgZ2V0IHBhcmVudGVkIGluIHVw
ZGF0ZVN1YmxheWVyTGlzdCgpLgogICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKICAgICAgICAg
c2V0dXBDb250ZW50c0xheWVyKG1fY29udGVudHNMYXllci5nZXQoKSk7CiAgICAgICAgIFttX2Nv
bnRlbnRzTGF5ZXIuZ2V0KCkgc2V0TmVlZHNEaXNwbGF5XTsKQEAgLTE3MTYsMzggKzE3MTcsMTkg
QEAgdm9pZCBHcmFwaGljc0xheWVyQ0E6OnBhdXNlQW5pbWF0aW9uT25MYQogfQogCiAjaWYgRU5B
QkxFKDNEX0NBTlZBUykKLXZvaWQgR3JhcGhpY3NMYXllckNBOjpzZXRDb250ZW50c1RvR3JhcGhp
Y3NDb250ZXh0M0QoY29uc3QgR3JhcGhpY3NDb250ZXh0M0QqIGdyYXBoaWNzQ29udGV4dDNEKQor
dm9pZCBHcmFwaGljc0xheWVyQ0E6OnNldENvbnRlbnRzVG9XZWJHTChQbGF0Zm9ybUxheWVyKiB3
ZWJnbExheWVyKQogewotICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QgY29udGV4dCA9IGdy
YXBoaWNzQ29udGV4dDNELT5wbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCk7Ci0gICAgUGxhdGZv
cm0zRE9iamVjdCB0ZXh0dXJlID0gZ3JhcGhpY3NDb250ZXh0M0QtPnBsYXRmb3JtVGV4dHVyZSgp
OwotICAgIAotICAgIGlmIChjb250ZXh0ID09IG1fcGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCAm
JiB0ZXh0dXJlID09IG1fcGxhdGZvcm1UZXh0dXJlKQorICAgIGlmICh3ZWJnbExheWVyID09IG1f
Y29udGVudHNMYXllcikKICAgICAgICAgcmV0dXJuOwogICAgICAgICAKLSAgICBtX3BsYXRmb3Jt
R3JhcGhpY3NDb250ZXh0M0QgPSBjb250ZXh0OwotICAgIG1fcGxhdGZvcm1UZXh0dXJlID0gdGV4
dHVyZTsKLSAgICAKLSAgICBub3RlU3VibGF5ZXJzQ2hhbmdlZCgpOworICAgIG1fY29udGVudHNM
YXllciA9IHdlYmdsTGF5ZXI7CisgICAgaWYgKG1fY29udGVudHNMYXllciAmJiBbbV9jb250ZW50
c0xheWVyLmdldCgpIHJlc3BvbmRzVG9TZWxlY3RvcjpAc2VsZWN0b3Ioc2V0TGF5ZXJPd25lcjop
XSkKKyAgICAgICAgWyhpZCltX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0TGF5ZXJPd25lcjp0aGlz
XTsKICAgICAKLSAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKKyAgICBtX2NvbnRlbnRz
TGF5ZXJQdXJwb3NlID0gd2ViZ2xMYXllciA/IENvbnRlbnRzTGF5ZXJGb3JXZWJHTCA6IE5vQ29u
dGVudHNMYXllcjsKIAotICAgIGlmIChtX3BsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QgIT0gTnVs
bFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QgJiYgbV9wbGF0Zm9ybVRleHR1cmUgIT0gTnVsbFBs
YXRmb3JtM0RPYmplY3QpIHsKLSAgICAgICAgLy8gY3JlYXRlIHRoZSBpbm5lciAzZCBsYXllcgot
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXIuYWRvcHROUyhbW1dlYkdMTGF5ZXIgYWxsb2NdIGluaXRX
aXRoQ29udGV4dDpjb25zdF9jYXN0PEdyYXBoaWNzQ29udGV4dDNEKj4oZ3JhcGhpY3NDb250ZXh0
M0QpXSk7Ci0jaWZuZGVmIE5ERUJVRwotICAgICAgICBbbV9jb250ZW50c0xheWVyLmdldCgpIHNl
dE5hbWU6QCIzRCBMYXllciJdOwotI2VuZGlmCi0gICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0
KCkgc2V0TGF5ZXJPd25lcjp0aGlzXTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyByZW1vdmUg
dGhlIGlubmVyIGxheWVyCi0gICAgICAgIFttX2NvbnRlbnRzTGF5ZXIuZ2V0KCkgc2V0TGF5ZXJP
d25lcjowXTsKLSAgICAgICAgbV9jb250ZW50c0xheWVyID0gMDsKLSAgICB9Ci0gICAgCi0gICAg
RU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUwotICAgIAotICAgIG5vdGVMYXllclByb3BlcnR5Q2hh
bmdlZChDb250ZW50c0dyYXBoaWNzQ29udGV4dDNEQ2hhbmdlZCk7Ci0gICAgbV9jb250ZW50c0xh
eWVyUHVycG9zZSA9IG1fY29udGVudHNMYXllciA/IENvbnRlbnRzTGF5ZXJGb3JHcmFwaGljc0xh
eWVyM0QgOiBOb0NvbnRlbnRzTGF5ZXI7CisgICAgbm90ZVN1YmxheWVyc0NoYW5nZWQoKTsKKyAg
ICBub3RlTGF5ZXJQcm9wZXJ0eUNoYW5nZWQoQ29udGVudHNXZWJHTExheWVyQ2hhbmdlZCk7CiB9
CiAjZW5kaWYKICAgICAKQEAgLTE3NjIsNiArMTc0NCwxMiBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJD
QTo6cmVwYWludExheWVyRGlydHlSCiAgICAgbV9kaXJ0eVJlY3RzLmNsZWFyKCk7CiB9CiAKK3Zv
aWQgR3JhcGhpY3NMYXllckNBOjp1cGRhdGVDb250ZW50c05lZWRzRGlzcGxheSgpCit7CisgICAg
aWYgKG1fY29udGVudHNMYXllcikKKyAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXRO
ZWVkc0Rpc3BsYXldOworfQorCiBib29sIEdyYXBoaWNzTGF5ZXJDQTo6Y3JlYXRlQW5pbWF0aW9u
RnJvbUtleWZyYW1lcyhjb25zdCBLZXlmcmFtZVZhbHVlTGlzdCYgdmFsdWVMaXN0LCBjb25zdCBB
bmltYXRpb24qIGFuaW1hdGlvbiwgY29uc3QgU3RyaW5nJiBrZXlmcmFtZXNOYW1lLCBkb3VibGUg
dGltZU9mZnNldCkKIHsKICAgICBBU1NFUlQodmFsdWVMaXN0LnByb3BlcnR5KCkgIT0gQW5pbWF0
ZWRQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybSk7CkBAIC0yNTY2LDE0ICsyNTU0LDYgQEAgdm9pZCBH
cmFwaGljc0xheWVyQ0E6Om5vdGVMYXllclByb3BlcnR5QwogICAgIG1fdW5jb21taXR0ZWRDaGFu
Z2VzIHw9IGZsYWdzOwogfQogCi0jaWYgRU5BQkxFKDNEX0NBTlZBUykKLXZvaWQgR3JhcGhpY3NM
YXllckNBOjpzZXRHcmFwaGljc0NvbnRleHQzRE5lZWRzRGlzcGxheSgpCi17Ci0gICAgaWYgKG1f
Y29udGVudHNMYXllclB1cnBvc2UgPT0gQ29udGVudHNMYXllckZvckdyYXBoaWNzTGF5ZXIzRCkK
LSAgICAgICAgW21fY29udGVudHNMYXllci5nZXQoKSBzZXROZWVkc0Rpc3BsYXldOwotfQotI2Vu
ZGlmCi0gICAgCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9X
ZWJHTExheWVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMv
V2ViR0xMYXllci5oCShyZXZpc2lvbiA2MTI2NikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1dlYkdMTGF5ZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgsNyBAQAogCiAj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogCi0jaW1wb3J0ICJXZWJMYXllci5oIgor
I2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
ICAgICBjbGFzcyBHcmFwaGljc0xheWVyOwpAQCAtMzksMTEgKzM5LDkgQEAgQGludGVyZmFjZSBX
ZWJHTExheWVyIDogQ0FPcGVuR0xMYXllciAKIHsKICAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVy
KiBtX2xheWVyT3duZXI7CiAgICAgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0QqIG1fY29udGV4
dDsKLSAgICBDR0xDb250ZXh0T2JqIG1fY29udGV4dE9iajsKLSAgICBHTHVpbnQgbV90ZXh0dXJl
OwogfQogCi0tIChpZClpbml0V2l0aENvbnRleHQ6KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
Kiljb250ZXh0OworLSAoaWQpaW5pdFdpdGhHcmFwaGljc0NvbnRleHQzRDooV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0QqKWNvbnRleHQ7CiAKIC0gKENHSW1hZ2VSZWYpY29weUltYWdlU25hcHNo
b3RXaXRoQ29sb3JTcGFjZTooQ0dDb2xvclNwYWNlUmVmKWNvbG9yU3BhY2U7CiAKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1dlYkdMTGF5ZXIubW0KPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvV2ViR0xMYXllci5tbQkocmV2aXNpb24gNjEy
NjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9XZWJHTExheWVyLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMCw4ICszMCw4IEBACiAKICNpbXBvcnQgIldlYkdMTGF5ZXIuaCIKIAor
I2ltcG9ydCAiR3JhcGhpY3NDb250ZXh0M0QuaCIKICNpbXBvcnQgIkdyYXBoaWNzTGF5ZXIuaCIK
LSNpbXBvcnQgPFF1YXJ0ekNvcmUvUXVhcnR6Q29yZS5oPgogI2ltcG9ydCA8T3BlbkdML09wZW5H
TC5oPgogI2ltcG9ydCA8d3RmL0Zhc3RNYWxsb2MuaD4KICNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIu
aD4KQEAgLTQxLDExICs0MSw5IEBAIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiBAaW1wbGVt
ZW50YXRpb24gV2ViR0xMYXllcgogCi0tKGlkKWluaXRXaXRoQ29udGV4dDooR3JhcGhpY3NDb250
ZXh0M0QqKWNvbnRleHQKKy0oaWQpaW5pdFdpdGhHcmFwaGljc0NvbnRleHQzRDooR3JhcGhpY3ND
b250ZXh0M0QqKWNvbnRleHQKIHsKICAgICBtX2NvbnRleHQgPSBjb250ZXh0OwotICAgIG1fY29u
dGV4dE9iaiA9IHN0YXRpY19jYXN0PENHTENvbnRleHRPYmo+KGNvbnRleHQtPnBsYXRmb3JtR3Jh
cGhpY3NDb250ZXh0M0QoKSk7Ci0gICAgbV90ZXh0dXJlID0gc3RhdGljX2Nhc3Q8R0x1aW50Pihj
b250ZXh0LT5wbGF0Zm9ybVRleHR1cmUoKSk7CiAgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKICAg
ICByZXR1cm4gc2VsZjsKIH0KQEAgLTU5LDEzICs1NywxMyBAQCAtKENHTFBpeGVsRm9ybWF0T2Jq
KWNvcHlDR0xQaXhlbEZvcm1hdEZvCiAgICAgLy8gSWYgbmVlZGVkIHdlIHdpbGwgaGF2ZSB0byBz
ZXQgdGhlIGRpc3BsYXkgbWFzayBpbiB0aGUgQ2FudmFzIENHTENvbnRleHQgYW5kCiAgICAgLy8g
bWFrZSBzdXJlIGl0IG1hdGNoZXMuCiAgICAgVU5VU0VEX1BBUkFNKG1hc2spOwotICAgIHJldHVy
biBDR0xSZXRhaW5QaXhlbEZvcm1hdChDR0xHZXRQaXhlbEZvcm1hdChtX2NvbnRleHRPYmopKTsK
KyAgICByZXR1cm4gQ0dMUmV0YWluUGl4ZWxGb3JtYXQoQ0dMR2V0UGl4ZWxGb3JtYXQobV9jb250
ZXh0LT5wbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKCkpKTsKIH0KIAogLShDR0xDb250ZXh0T2Jq
KWNvcHlDR0xDb250ZXh0Rm9yUGl4ZWxGb3JtYXQ6KENHTFBpeGVsRm9ybWF0T2JqKXBpeGVsRm9y
bWF0CiB7CiAgICAgQ0dMQ29udGV4dE9iaiBjb250ZXh0T2JqOwotICAgIENHTENyZWF0ZUNvbnRl
eHQocGl4ZWxGb3JtYXQsIG1fY29udGV4dE9iaiwgJmNvbnRleHRPYmopOworICAgIENHTENyZWF0
ZUNvbnRleHQocGl4ZWxGb3JtYXQsIG1fY29udGV4dC0+cGxhdGZvcm1HcmFwaGljc0NvbnRleHQz
RCgpLCAmY29udGV4dE9iaik7CiAgICAgcmV0dXJuIGNvbnRleHRPYmo7CiB9CiAKQEAgLTg2LDcg
Kzg0LDcgQEAgLSh2b2lkKWRyYXdJbkNHTENvbnRleHQ6KENHTENvbnRleHRPYmopZwogICAgIGds
TG9hZElkZW50aXR5KCk7CiAKICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbEJp
bmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZSk7CisgICAgZ2xCaW5kVGV4dHVyZShH
TF9URVhUVVJFXzJELCBtX2NvbnRleHQtPnBsYXRmb3JtVGV4dHVyZSgpKTsKICAgICAKICAgICBn
bEJlZ2luKEdMX1RSSUFOR0xFX0ZBTik7CiAgICAgICAgIGdsVGV4Q29vcmQyZigwLCAwKTsKQEAg
LTExMyw3ICsxMTEsNyBAQCBzdGF0aWMgdm9pZCBmcmVlRGF0YSh2b2lkICosIGNvbnN0IHZvaWQg
CiAKIC0oQ0dJbWFnZVJlZiljb3B5SW1hZ2VTbmFwc2hvdFdpdGhDb2xvclNwYWNlOihDR0NvbG9y
U3BhY2VSZWYpY29sb3JTcGFjZQogewotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0LT5wbGF0Zm9ybUdyYXBo
aWNzQ29udGV4dDNEKCkpOwogCiAgICAgUmV0YWluUHRyPENHQ29sb3JTcGFjZVJlZj4gaW1hZ2VD
b2xvclNwYWNlID0gY29sb3JTcGFjZTsKICAgICBpZiAoIWltYWdlQ29sb3JTcGFjZSkKQEAgLTE1
MSw3ICsxNDksNyBAQCAtICh2b2lkKWRpc3BsYXkKIAogQGVuZAogCi1AaW1wbGVtZW50YXRpb24g
V2ViR0xMYXllcihXZWJMYXllckFkZGl0aW9ucykKK0BpbXBsZW1lbnRhdGlvbiBXZWJHTExheWVy
KFdlYkdMTGF5ZXJBZGRpdGlvbnMpCiAKIC0odm9pZClzZXRMYXllck93bmVyOihHcmFwaGljc0xh
eWVyKilhTGF5ZXIKIHsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckxheWVyQmFja2lu
Zy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTGF5ZXJCYWNraW5n
LmNwcAkocmV2aXNpb24gNjEyNjYpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJMYXllckJh
Y2tpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMTYsOCArMjE2LDggQEAgYm9vbCBSZW5kZXJM
YXllckJhY2tpbmc6OnVwZGF0ZUdyYXBoaWNzTAogICAgIGVsc2UgaWYgKGlzM0RDYW52YXMocmVu
ZGVyZXIoKSkpIHsKICAgICAgICAgSFRNTENhbnZhc0VsZW1lbnQqIGNhbnZhcyA9IHN0YXRpY19j
YXN0PEhUTUxDYW52YXNFbGVtZW50Kj4ocmVuZGVyZXIoKS0+bm9kZSgpKTsKICAgICAgICAgV2Vi
R0xSZW5kZXJpbmdDb250ZXh0KiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8V2ViR0xSZW5kZXJpbmdD
b250ZXh0Kj4oY2FudmFzLT5yZW5kZXJpbmdDb250ZXh0KCkpOwotICAgICAgICBpZiAoY29udGV4
dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+cGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCgpKQotICAg
ICAgICAgICAgbV9ncmFwaGljc0xheWVyLT5zZXRDb250ZW50c1RvR3JhcGhpY3NDb250ZXh0M0Qo
Y29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKSk7CisgICAgICAgIGlmIChjb250ZXh0LT5ncmFw
aGljc0NvbnRleHQzRCgpLT5wbGF0Zm9ybUxheWVyKCkpCisgICAgICAgICAgICBtX2dyYXBoaWNz
TGF5ZXItPnNldENvbnRlbnRzVG9XZWJHTChjb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5w
bGF0Zm9ybUxheWVyKCkpOwogICAgIH0KICNlbmRpZgogCkBAIC03MjYsNyArNzI2LDcgQEAgdm9p
ZCBSZW5kZXJMYXllckJhY2tpbmc6OnJlbmRlcmVyQ29udGVudAogCiAjaWYgRU5BQkxFKDNEX0NB
TlZBUykgICAgCiAgICAgaWYgKGlzM0RDYW52YXMocmVuZGVyZXIoKSkpIHsKLSAgICAgICAgbV9n
cmFwaGljc0xheWVyLT5zZXRHcmFwaGljc0NvbnRleHQzRE5lZWRzRGlzcGxheSgpOworICAgICAg
ICBtX2dyYXBoaWNzTGF5ZXItPnNldENvbnRlbnRzTmVlZHNEaXNwbGF5KCk7CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAjZW5kaWYK
</data>
<flag name="review"
          id="46259"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
      

    </bug>

</bugzilla>