<?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>302711</bug_id>
          
          <creation_ts>2025-11-18 06:08:27 -0800</creation_ts>
          <short_desc>WebGPU Crash on iOS with Time-Varying Mesh Access using instancing vertex buffers</short_desc>
          <delta_ts>2026-01-08 12:26:39 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGPU</component>
          <version>Safari 26</version>
          <rep_platform>iPhone / iPad</rep_platform>
          <op_sys>iOS 26</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P1</priority>
          <bug_severity>Major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter>s.todchuk</reporter>
          <assigned_to name="Mike Wyrzykowski">mwyrzykowski</assigned_to>
          <cc>ashley</cc>
    
    <cc>mwyrzykowski</cc>
    
    <cc>tzagallo</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>2159571</commentid>
    <comment_count>0</comment_count>
      <attachid>477420</attachid>
    <who name="">s.todchuk</who>
    <bug_when>2025-11-18 06:08:27 -0800</bug_when>
    <thetext>Created attachment 477420
HTML file demonstrating the crash (takes around 70 sec)

Rendering with instancing vertex buffers crashes after ~70s when mesh access order varies per frame. Works fine with fixed order or storage buffers.

# WebGPU Crash on iOS with Time-Varying Mesh Access Patterns

## Summary
Safari on iOS crashes when rendering multiple meshes with **mesh access order that varies per frame** while using instancing vertex buffers for transforms. The crash is **time-dependent** (accumulates over ~70 seconds), **scales with mesh count and object count**, indicating a memory corruption or resource tracking bug in iOS WebGPU&apos;s Metal backend.

**Does NOT crash on macOS Safari** - iOS-specific bug.

## Environment
- **Device**: iPhone 15 Pro/16 Pro Max, iOS 26.0/26.1
- **Browser**: Safari (WebKit Metal backend)
- **Cross-platform**: DOES not crash on Chrome/Edge/Firefox (Windows/Android/macOS) and Safari macOS

## Reproduction Steps

### Test Case: `iPhoneWGPUCrash.html`

Standalone HTML file demonstrating the crash. Error after ~70 seconds: `&quot;InvalidStateError: GPUCommandEncoder.finish: Unable to finish.&quot;`

**Minimum crash conditions:**
- 1000+ unique meshes, 10000+ object instances
- Instancing vertex buffer for per-object transforms
- **Mesh access order that changes every frame** (random shuffle OR random start offset)

**Config:** `MESH_COUNT`, `GRID_SIZE`, `VARY_RQ_HEAD`, `DO_RQ_SHUFFLE` (see code comments)

### Key Findings

**What triggers the crash:**
- **Time-varying mesh access patterns** - order changes per frame (whether via `firstIndex` OR buffer binding)
- Instancing vertex buffer for transforms
- Scales with mesh count (min: 1000) and object count (min: 4096 on iPhone 15 Pro)
- Time-dependent failure (~70s), not immediate validation error

**What does NOT affect crash:**
- Mesh complexity or vertex format
- `baseVertex` parameter
- Buffer layout (shared vs separate buffers)
- Draw call count (batching improves FPS but doesn&apos;t prevent crash)

### Workarounds Tested

| Workaround | Result |
|------------|--------|
| Bake vertex offsets, `baseVertex=0` | ❌ Crashes |
| Separate buffers per mesh | ❌ Crashes |
| Batch draws via instancing | ❌ Crashes |
| Static transform buffers (no updates) | ❌ Crashes |
| Indirect drawing (`drawIndexedIndirect`) | ❌ Crashes |
| **Fixed mesh order per frame** (sequential OR constant random) | ✅ Works |
| **Storage/constant buffer for transforms** (instead of instancing vertex buffer) | ✅ Works |

**Root cause:** Instancing vertex buffer + time-varying mesh access order = crash. Fixed order (even if non-sequential) works fine.

## Impact on Real-World Applications

This bug **blocks all standard 3D engine techniques** that vary rendering order per frame:

- **Frustum Culling** - rendering only visible objects
- **Depth Sorting** - transparent object ordering
- **Material Batching** - grouping by material/shader
- **LOD Systems** - dynamic mesh detail switching
- **Dynamic Scenes** - adding/removing objects

**Result:** iOS WebGPU is effectively unusable for production 3D applications.

## Business Impact

**Blocking delivery to enterprise customers:** ConocoPhillips and AkerBP (major oil &amp; gas companies) are waiting for our 3D engine product, which uses these exact rendering patterns. We cannot ship a product that crashes on iOS.

**Storage buffer workaround limitations:**
- Requires major architectural changes
- Reduces rendering efficiency (alignment overhead, suboptimal memory access)
- Limits hardware/browser compatibility (stricter size limits)

## Request

Please investigate this memory corruption/resource tracking bug in iOS WebGPU&apos;s Metal backend. This is a **critical, reproducible issue** blocking legitimate 3D rendering techniques and enterprise product deliveries.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2159572</commentid>
    <comment_count>1</comment_count>
    <who name="">s.todchuk</who>
    <bug_when>2025-11-18 06:31:08 -0800</bug_when>
    <thetext>https://webgpu.github.io/webgpu-samples/sample/animometer/ also crashes after some time (~2 minutes) with numTriangles=20000, renderBundles=false, dynamicOffsets=true</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2159807</commentid>
    <comment_count>2</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2025-11-18 22:09:08 -0800</bug_when>
    <thetext>&lt;rdar://problem/165023230&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2159811</commentid>
    <comment_count>3</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-18 22:21:28 -0800</bug_when>
    <thetext>Thank you for the repro case.

The main difference between iOS and macOS is that iOS will terminate due to memory pressure whereas macOS will not until it reaches much higher thresholds.

In the repro, memory starts at 2GB and climbs to 3GB in WebKit&apos;s GPU process on macOS as well. Retain issue is reproducible on macOS.

Seems something some large amount of memory is being retained when it should not, I will take a look</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2159817</commentid>
    <comment_count>4</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-18 22:29:25 -0800</bug_when>
    <thetext>checking memgraphs for the com.apple.WebKit.GPU and com.apple.WebKit.WebKit processes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2159818</commentid>
    <comment_count>5</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-18 22:30:00 -0800</bug_when>
    <thetext>memory usage seems about half or less on Chrome for reference</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2159819</commentid>
    <comment_count>6</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-18 22:32:21 -0800</bug_when>
    <thetext>Guess based on the report details is this repro constantly triggers vertex buffer validation and we have a retain issue with that</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160068</commentid>
    <comment_count>7</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-19 14:59:36 -0800</bug_when>
    <thetext>Skipping vertex buffer validation keeps memory usage stable around ~500MB over the same 70 second time period

Certainly it appears we have unbounded memory growth due to buffer validation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160069</commentid>
    <comment_count>8</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-19 15:00:00 -0800</bug_when>
    <thetext>Great bug report by the way, thank you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160082</commentid>
    <comment_count>9</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-19 15:35:33 -0800</bug_when>
    <thetext>So it appears our cache quickly approaches ~5 million elements https://github.com/WebKit/WebKit/blob/7d08e130dc4395638075edb553966d2b4a6659b9/Source/WebGPU/WebGPU/Buffer.h#L183

Either we are incorrectly missing the cache or we need to clear it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160088</commentid>
    <comment_count>10</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-19 15:56:30 -0800</bug_when>
    <thetext>Perf wise the buffer validation is severely negatively impacting performance here.

Disabling buffer validation I observe ~45fps. With buffer validation I observe ~9fps. Chrome on the same Mac is ~30fps.

There is more occurring than just an out of control cache. Memory usage limiting the cache size to 10 elements is still 1.6GB</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160284</commentid>
    <comment_count>11</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-20 09:06:26 -0800</bug_when>
    <thetext>The memory usage appears to originate from Vertex : Vertex memory barriers we emit, of which there are several thousand per frame</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160287</commentid>
    <comment_count>12</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-20 09:31:10 -0800</bug_when>
    <thetext>We can emit a single memory barrier by switching to MTLParallelRenderCommandEncoder.

I.e., perform vertex buffer validation for all draws first, then proceed with standard rendering.

I will try migrating to MTLParallelRenderCommandEncoder</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160289</commentid>
    <comment_count>13</comment_count>
      <attachid>477453</attachid>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-20 10:03:54 -0800</bug_when>
    <thetext>Created attachment 477453
patch from April

I wrote a patch in April to switch to parallel command encoding for this purpose but there were some bugs and it was deemed too risky.

I&apos;m going to try and clean it up so we remove all but one of the memory barriers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160370</commentid>
    <comment_count>14</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-20 14:48:12 -0800</bug_when>
    <thetext>MTLParallelRenderCommandEncoder and limiting the cache size resolves the memory growth. Perf wise is still not great. Maybe something easy to resolve that too</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160390</commentid>
    <comment_count>15</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-20 15:21:25 -0800</bug_when>
    <thetext>Oh nice using the ring buffer allocator gets us ~35 fps and Chrome is ~33 fps on the same Mac so virtually identical.

Going to make an iOS build to ensure the issue is fully addressed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2160393</commentid>
    <comment_count>16</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-20 15:31:25 -0800</bug_when>
    <thetext>Pull request: https://github.com/WebKit/WebKit/pull/54279</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2161108</commentid>
    <comment_count>17</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2025-11-24 12:30:26 -0800</bug_when>
    <thetext>Seems fine on an iPhone 13 mini, no crashes after several minutes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2163398</commentid>
    <comment_count>18</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2025-12-04 16:20:06 -0800</bug_when>
    <thetext>Committed 303942@main (df6c49376568): &lt;https://commits.webkit.org/303942@main&gt;

Reviewed commits have been landed. Closing PR #54279 and removing active labels.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2170381</commentid>
    <comment_count>19</comment_count>
    <who name="Mike Wyrzykowski">mwyrzykowski</who>
    <bug_when>2026-01-08 12:26:39 -0800</bug_when>
    <thetext>*** Bug 301627 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>477420</attachid>
            <date>2025-11-18 06:08:27 -0800</date>
            <delta_ts>2025-11-18 06:08:27 -0800</delta_ts>
            <desc>HTML file demonstrating the crash (takes around 70 sec)</desc>
            <filename>iPhoneWGPUCrash.html</filename>
            <type>text/html</type>
            <size>28326</size>
            <attacher>s.todchuk</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0
PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNl
LXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+V2ViR1BVIDNEIFJlbmRlcmlu
ZzwvdGl0bGU+CiAgICA8c3R5bGU+CiAgICAgICAgYm9keSB7CiAgICAgICAgICAgIG1hcmdpbjog
MDsKICAgICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsK
ICAgICAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICAgICAgZm9udC1mYW1pbHk6IG1v
bm9zcGFjZTsKICAgICAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgfQogICAgICAgICNjYW52
YXMgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgd2lkdGg6IDEwMHZ3
OwogICAgICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIH0KICAgICAgICAjaW5mbyB7CiAg
ICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgdG9wOiAxMHB4OwogICAg
ICAgICAgICBsZWZ0OiAxMHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAs
IDAuNyk7CiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRp
dXM6IDVweDsKICAgICAgICB9CiAgICAgICAgI2Vycm9yIHsKICAgICAgICAgICAgcG9zaXRpb246
IGFic29sdXRlOwogICAgICAgICAgICB0b3A6IDUwJTsKICAgICAgICAgICAgbGVmdDogNTAlOwog
ICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICAgICAg
YmFja2dyb3VuZDogcmdiYSgyNTUsIDAsIDAsIDAuOCk7CiAgICAgICAgICAgIHBhZGRpbmc6IDIw
cHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgICAgIGRpc3BsYXk6
IG5vbmU7CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICAgIDxjYW52YXMg
aWQ9ImNhbnZhcyI+PC9jYW52YXM+CiAgICA8ZGl2IGlkPSJpbmZvIj4KICAgICAgICA8ZGl2PkZQ
UzogPHNwYW4gaWQ9ImZwcyI+MDwvc3Bhbj48L2Rpdj4KICAgICAgICA8ZGl2Pk9iamVjdHM6IDxz
cGFuIGlkPSJvYmplY3RDb3VudCI+MDwvc3Bhbj4gLyA8c3BhbiBpZD0idG90YWxPYmplY3RzIj4w
PC9zcGFuPjwvZGl2PgogICAgICAgIDxkaXY+TWVzaGVzOiA8c3BhbiBpZD0ibWVzaENvdW50Ij4w
PC9zcGFuPjwvZGl2PgogICAgICAgIDxkaXY+RHJhdyBDYWxsczogPHNwYW4gaWQ9ImRyYXdDYWxs
cyI+MDwvc3Bhbj48L2Rpdj4KICAgICAgICA8ZGl2PjxzdHJvbmc+RWxhcHNlZDogPHNwYW4gaWQ9
ImVsYXBzZWQiPjA8L3NwYW4+czwvc3Ryb25nPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlk
PSJlcnJvciI+PC9kaXY+CgogICAgPHNjcmlwdD4KLy8gV2ViR1BVIDNEIFJlbmRlcmluZyB3aXRo
IEluc3RhbmNpbmcKLy8gQ29uZmlndXJhYmxlIG1lc2ggY291bnQgYW5kIGdyaWQgc2l6ZSB0byB0
ZXN0IGlPUyBXZWJHUFUgY3Jhc2gKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gQ09ORklHVVJB
VElPTiAtIEFkanVzdCB0aGVzZSB0byB0ZXN0IGRpZmZlcmVudCBzY2VuYXJpb3MKLy8gPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQoKLy8gTnVtYmVyIG9mIHVuaXF1ZSBzcGhlcmUgbWVzaGVzICgxMDAsIDEw
MDAgLSBzZWVtcyB3b3JrIG9ubHkgd2hlbiBET19SUV9TSFVGRkxFIGlzIG9uKQpjb25zdCBNRVNI
X0NPVU5UID0gMTAwMDA7Ly9ET0VTIGFmZmVjdCBjcmFzaDogbWFraW5nIGl0IGxvd2VyIGZpeGVz
IHRoZSBjcmFzaCAoZGlmZmVyZW50IG51bWJlciBmb3IgZGlmZmVyZW50IGRldmljZSkKLy8gR3Jp
ZCBkaW1lbnNpb25zLCB0b3RhbCBvYmplY3RzID0gR1JJRF9TSVpFXjMgKDUweDUweDUwID0gMTI1
LDAwMCBvYmplY3RzKS4gCmNvbnN0IEdSSURfU0laRSA9IDUwOy8vRE9FUyBhZmZlY3QgY3Jhc2g6
IG1ha2luZyBpdCBsb3dlciBmaXhlcyB0aGUgY3Jhc2ggKGRpZmZlcmVudCBudW1iZXIgZm9yIGRp
ZmZlcmVudCBkZXZpY2UpCgovLyAtIHRydWU6ICBVc2UgYmFzZVZlcnRleCBwYXJhbWV0ZXIgaW4g
ZHJhd0luZGV4ZWQgKGluZGljZXMgYXJlIHJlbGF0aXZlLCBmYXN0ZXIgY3Jhc2gpCi8vIC0gZmFs
c2U6IEJha2UgdmVydGV4IG9mZnNldHMgaW50byBpbmRpY2VzLCBiYXNlVmVydGV4PTAgKGluZGlj
ZXMgYXJlIGFic29sdXRlLCBzbG93ZXIgY3Jhc2gpCmNvbnN0IFVTRV9CQVNFX1ZFUlRFWCA9IHRy
dWU7Ly9kb2VzIE5PVCBhZmZlY3QgY3Jhc2gKCi8vIFRoaXMgZ2F0aGVycyBhbGwgdGhlIGNvbnNl
Y3V0aXZlIGluc3RhbmNlcyBmb3IgY3VycmVudCBtZXNoIGFuZCBmaXJlcyB0aGVtIGluIG9uZSBk
cmF3IGNhbGwKY29uc3QgR1JPVVBfSU5TVEFOQ0VTID0gdHJ1ZTsvL2RvZXMgTk9UIGFmZmVjdCBj
cmFzaCwgYnV0IG1ha2VzIGZyYW1lcmF0ZSBoaWdoZXIgd2hlbiBET19SUV9TSFVGRkxFIGlzIG9m
ZgoKLy8gUmFuZG9tbHkgdmFyeSBvYmplY3QgY291bnQgYmV0d2VlbiA3MCUgYW5kIDEwMCUgb2Yg
dG90YWwgb2JqZWN0czoKY29uc3QgVkFSWV9SUV9UQUlMID0gZmFsc2U7Ly8gZG9lcyBOT1QgYWZm
ZWN0IGNyYXNoCiAgICAgICAgCi8vIFJhbmRvbWx5IHZhcnkgc3RhcnQgb2JqZWN0IGJldHdlZW4g
MCUgYW5kIDMwJSBvZiB0b3RhbCBvYmplY3RzOgpjb25zdCBWQVJZX1JRX0hFQUQgPSB0cnVlOy8v
RE9FUyBjcmFzaCBpZiBpdCBpcyB0cnVlCgovLyBSYW5kb21seSBzaHVmZmxlIHJlbmRlciBvcmRl
cjoKY29uc3QgRE9fUlFfU0hVRkZMRSA9IGZhbHNlOy8vRE9FUyBjcmFzaCBpZiBpdCBpcyB0cnVl
CgovLyBJdCBpcyBlbm91Z2ggdG8gZW5hYmxlIGVpdGhlciBWQVJZX1JRX0hFQUQgb3IgRE9fUlFf
U1VGRkxFIHRvIGNyYXNoIFdlYkdQVSBvbiBpUGhvbmUKCi8vID09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
Ly8gTWF0aCBVdGlsaXRpZXMKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKY2xhc3MgVmVjMyB7CiAg
ICBjb25zdHJ1Y3Rvcih4ID0gMCwgeSA9IDAsIHogPSAwKSB7CiAgICAgICAgdGhpcy54ID0geDsK
ICAgICAgICB0aGlzLnkgPSB5OwogICAgICAgIHRoaXMueiA9IHo7CiAgICB9CgogICAgc3RhdGlj
IG5vcm1hbGl6ZSh2KSB7CiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5zcXJ0KHYueCAqIHYueCAr
IHYueSAqIHYueSArIHYueiAqIHYueik7CiAgICAgICAgcmV0dXJuIGxlbiA+IDAgPyBuZXcgVmVj
Myh2LnggLyBsZW4sIHYueSAvIGxlbiwgdi56IC8gbGVuKSA6IG5ldyBWZWMzKDAsIDAsIDApOwog
ICAgfQoKICAgIHN0YXRpYyBjcm9zcyhhLCBiKSB7CiAgICAgICAgcmV0dXJuIG5ldyBWZWMzKAog
ICAgICAgICAgICBhLnkgKiBiLnogLSBhLnogKiBiLnksCiAgICAgICAgICAgIGEueiAqIGIueCAt
IGEueCAqIGIueiwKICAgICAgICAgICAgYS54ICogYi55IC0gYS55ICogYi54CiAgICAgICAgKTsK
ICAgIH0KCiAgICBzdGF0aWMgc3VidHJhY3QoYSwgYikgewogICAgICAgIHJldHVybiBuZXcgVmVj
MyhhLnggLSBiLngsIGEueSAtIGIueSwgYS56IC0gYi56KTsKICAgIH0KfQoKY2xhc3MgTWF0NCB7
CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLmRhdGEgPSBuZXcgRmxvYXQzMkFycmF5
KDE2KTsKICAgICAgICB0aGlzLmlkZW50aXR5KCk7CiAgICB9CgogICAgaWRlbnRpdHkoKSB7CiAg
ICAgICAgdGhpcy5kYXRhLmZpbGwoMCk7CiAgICAgICAgdGhpcy5kYXRhWzBdID0gdGhpcy5kYXRh
WzVdID0gdGhpcy5kYXRhWzEwXSA9IHRoaXMuZGF0YVsxNV0gPSAxOwogICAgICAgIHJldHVybiB0
aGlzOwogICAgfQoKICAgIHN0YXRpYyBwZXJzcGVjdGl2ZShmb3YsIGFzcGVjdCwgbmVhciwgZmFy
KSB7CiAgICAgICAgY29uc3QgbWF0ID0gbmV3IE1hdDQoKTsKICAgICAgICBjb25zdCBmID0gMS4w
IC8gTWF0aC50YW4oZm92IC8gMik7CiAgICAgICAgY29uc3QgbmYgPSAxIC8gKG5lYXIgLSBmYXIp
OwoKICAgICAgICBtYXQuZGF0YVswXSA9IGYgLyBhc3BlY3Q7CiAgICAgICAgbWF0LmRhdGFbNV0g
PSBmOwogICAgICAgIG1hdC5kYXRhWzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mOwogICAgICAgIG1h
dC5kYXRhWzExXSA9IC0xOwogICAgICAgIG1hdC5kYXRhWzE0XSA9IDIgKiBmYXIgKiBuZWFyICog
bmY7CiAgICAgICAgbWF0LmRhdGFbMTVdID0gMDsKCiAgICAgICAgcmV0dXJuIG1hdDsKICAgIH0K
CiAgICBzdGF0aWMgbG9va0F0KGV5ZSwgY2VudGVyLCB1cCkgewogICAgICAgIGNvbnN0IG1hdCA9
IG5ldyBNYXQ0KCk7CiAgICAgICAgY29uc3QgeiA9IFZlYzMubm9ybWFsaXplKFZlYzMuc3VidHJh
Y3QoZXllLCBjZW50ZXIpKTsKICAgICAgICBjb25zdCB4ID0gVmVjMy5ub3JtYWxpemUoVmVjMy5j
cm9zcyh1cCwgeikpOwogICAgICAgIGNvbnN0IHkgPSBWZWMzLmNyb3NzKHosIHgpOwoKICAgICAg
ICBtYXQuZGF0YVswXSA9IHgueDsKICAgICAgICBtYXQuZGF0YVsxXSA9IHkueDsKICAgICAgICBt
YXQuZGF0YVsyXSA9IHoueDsKICAgICAgICBtYXQuZGF0YVs0XSA9IHgueTsKICAgICAgICBtYXQu
ZGF0YVs1XSA9IHkueTsKICAgICAgICBtYXQuZGF0YVs2XSA9IHoueTsKICAgICAgICBtYXQuZGF0
YVs4XSA9IHguejsKICAgICAgICBtYXQuZGF0YVs5XSA9IHkuejsKICAgICAgICBtYXQuZGF0YVsx
MF0gPSB6Lno7CiAgICAgICAgbWF0LmRhdGFbMTJdID0gLXgueCAqIGV5ZS54IC0geC55ICogZXll
LnkgLSB4LnogKiBleWUuejsKICAgICAgICBtYXQuZGF0YVsxM10gPSAteS54ICogZXllLnggLSB5
LnkgKiBleWUueSAtIHkueiAqIGV5ZS56OwogICAgICAgIG1hdC5kYXRhWzE0XSA9IC16LnggKiBl
eWUueCAtIHoueSAqIGV5ZS55IC0gei56ICogZXllLno7CiAgICAgICAgbWF0LmRhdGFbMTVdID0g
MTsKCiAgICAgICAgcmV0dXJuIG1hdDsKICAgIH0KCiAgICBzdGF0aWMgdHJhbnNsYXRpb24oeCwg
eSwgeikgewogICAgICAgIGNvbnN0IG1hdCA9IG5ldyBNYXQ0KCk7CiAgICAgICAgbWF0LmRhdGFb
MTJdID0geDsKICAgICAgICBtYXQuZGF0YVsxM10gPSB5OwogICAgICAgIG1hdC5kYXRhWzE0XSA9
IHo7CiAgICAgICAgcmV0dXJuIG1hdDsKICAgIH0KCiAgICBzdGF0aWMgcm90YXRpb25ZKGFuZ2xl
KSB7CiAgICAgICAgY29uc3QgbWF0ID0gbmV3IE1hdDQoKTsKICAgICAgICBjb25zdCBjID0gTWF0
aC5jb3MoYW5nbGUpOwogICAgICAgIGNvbnN0IHMgPSBNYXRoLnNpbihhbmdsZSk7CiAgICAgICAg
bWF0LmRhdGFbMF0gPSBjOwogICAgICAgIG1hdC5kYXRhWzJdID0gczsKICAgICAgICBtYXQuZGF0
YVs4XSA9IC1zOwogICAgICAgIG1hdC5kYXRhWzEwXSA9IGM7CiAgICAgICAgcmV0dXJuIG1hdDsK
ICAgIH0KCiAgICBzdGF0aWMgbXVsdGlwbHkoYSwgYikgewogICAgICAgIGNvbnN0IHJlc3VsdCA9
IG5ldyBNYXQ0KCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAg
ICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHsKICAgICAgICAgICAgICAgIGxldCBz
dW0gPSAwOwogICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCA0OyBrKyspIHsKICAg
ICAgICAgICAgICAgICAgICBzdW0gKz0gYS5kYXRhW2kgKiA0ICsga10gKiBiLmRhdGFbayAqIDQg
KyBqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhW2kgKiA0
ICsgal0gPSBzdW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKICAgIH0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBTcGhlcmUgTWVzaCBHZW5lcmF0
aW9uICg3LXNlZ21lbnQgc3BoZXJlKQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpmdW5jdGlvbiBn
ZW5lcmF0ZVNwaGVyZU1lc2goc2VnbWVudHMgPSA3KSB7CiAgICBjb25zdCB2ZXJ0aWNlcyA9IFtd
OwogICAgY29uc3QgaW5kaWNlcyA9IFtdOwoKICAgIC8vIEdlbmVyYXRlIHZlcnRpY2VzCiAgICBm
b3IgKGxldCBsYXQgPSAwOyBsYXQgPD0gc2VnbWVudHM7IGxhdCsrKSB7CiAgICAgICAgY29uc3Qg
dGhldGEgPSAobGF0ICogTWF0aC5QSSkgLyBzZWdtZW50czsKICAgICAgICBjb25zdCBzaW5UaGV0
YSA9IE1hdGguc2luKHRoZXRhKTsKICAgICAgICBjb25zdCBjb3NUaGV0YSA9IE1hdGguY29zKHRo
ZXRhKTsKCiAgICAgICAgZm9yIChsZXQgbG9uID0gMDsgbG9uIDw9IHNlZ21lbnRzOyBsb24rKykg
ewogICAgICAgICAgICBjb25zdCBwaGkgPSAobG9uICogMiAqIE1hdGguUEkpIC8gc2VnbWVudHM7
CiAgICAgICAgICAgIGNvbnN0IHNpblBoaSA9IE1hdGguc2luKHBoaSk7CiAgICAgICAgICAgIGNv
bnN0IGNvc1BoaSA9IE1hdGguY29zKHBoaSk7CgogICAgICAgICAgICBjb25zdCB4ID0gY29zUGhp
ICogc2luVGhldGE7CiAgICAgICAgICAgIGNvbnN0IHkgPSBjb3NUaGV0YTsKICAgICAgICAgICAg
Y29uc3QgeiA9IHNpblBoaSAqIHNpblRoZXRhOwoKICAgICAgICAgICAgLy8gUG9zaXRpb24KICAg
ICAgICAgICAgdmVydGljZXMucHVzaCh4LCB5LCB6KTsKICAgICAgICAgICAgLy8gTm9ybWFsIChz
YW1lIGFzIHBvc2l0aW9uIGZvciB1bml0IHNwaGVyZSkKICAgICAgICAgICAgdmVydGljZXMucHVz
aCh4LCB5LCB6KTsKICAgICAgICB9CiAgICB9CgogICAgLy8gR2VuZXJhdGUgaW5kaWNlcwogICAg
Zm9yIChsZXQgbGF0ID0gMDsgbGF0IDwgc2VnbWVudHM7IGxhdCsrKSB7CiAgICAgICAgZm9yIChs
ZXQgbG9uID0gMDsgbG9uIDwgc2VnbWVudHM7IGxvbisrKSB7CiAgICAgICAgICAgIGNvbnN0IGZp
cnN0ID0gbGF0ICogKHNlZ21lbnRzICsgMSkgKyBsb247CiAgICAgICAgICAgIGNvbnN0IHNlY29u
ZCA9IGZpcnN0ICsgc2VnbWVudHMgKyAxOwoKICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGZpcnN0
LCBzZWNvbmQsIGZpcnN0ICsgMSk7CiAgICAgICAgICAgIGluZGljZXMucHVzaChzZWNvbmQsIHNl
Y29uZCArIDEsIGZpcnN0ICsgMSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB7CiAgICAg
ICAgdmVydGljZXM6IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXMpLAogICAgICAgIGluZGljZXM6
IG5ldyBVaW50MzJBcnJheShpbmRpY2VzKSwKICAgICAgICB2ZXJ0ZXhDb3VudDogdmVydGljZXMu
bGVuZ3RoIC8gNiwKICAgICAgICBpbmRleENvdW50OiBpbmRpY2VzLmxlbmd0aAogICAgfTsKfQoK
Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQovLyBXZWJHUFUgQXBwbGljYXRpb24KLy8gPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQoKY2xhc3MgV2ViR1BVQXBwIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAg
IHRoaXMuY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbnZhcycpOwogICAgICAg
IHRoaXMuZGV2aWNlID0gbnVsbDsKICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsOwogICAgICAg
IHRoaXMucGlwZWxpbmUgPSBudWxsOwogICAgICAgIHRoaXMubWVzaGVzID0gW107CiAgICAgICAg
dGhpcy5vYmplY3RzID0gW107CiAgICAgICAgdGhpcy50cmFuc2Zvcm1CdWZmZXIgPSBudWxsOwog
ICAgICAgIHRoaXMudW5pZm9ybUJ1ZmZlciA9IG51bGw7CiAgICAgICAgdGhpcy5iaW5kR3JvdXAg
PSBudWxsOwogICAgICAgIHRoaXMuZGVwdGhUZXh0dXJlID0gbnVsbDsKICAgICAgICB0aGlzLnRp
bWUgPSAwOwogICAgICAgIHRoaXMuZnBzID0gMDsKICAgICAgICB0aGlzLmZyYW1lQ291bnQgPSAw
OwogICAgICAgIHRoaXMubGFzdFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICB0aGlz
LnN0YXJ0VGltZSA9IDA7CiAgICAgICAgdGhpcy5jdXJyZW50T2JqZWN0Q291bnQgPSAwOwogICAg
ICAgIHRoaXMuZHJhd0NhbGxDb3VudCA9IDA7CiAgICB9CgogICAgYXN5bmMgaW5pdCgpIHsKICAg
ICAgICB0cnkgewogICAgICAgICAgICAvLyBDaGVjayBXZWJHUFUgc3VwcG9ydAogICAgICAgICAg
ICBpZiAoIW5hdmlnYXRvci5ncHUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcign
V2ViR1BVIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyJyk7CiAgICAgICAgICAgIH0K
CiAgICAgICAgICAgIC8vIFJlcXVlc3QgYWRhcHRlciBhbmQgZGV2aWNlCiAgICAgICAgICAgIGNv
bnN0IGFkYXB0ZXIgPSBhd2FpdCBuYXZpZ2F0b3IuZ3B1LnJlcXVlc3RBZGFwdGVyKCk7CiAgICAg
ICAgICAgIGlmICghYWRhcHRlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdG
YWlsZWQgdG8gZ2V0IEdQVSBhZGFwdGVyJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRo
aXMuZGV2aWNlID0gYXdhaXQgYWRhcHRlci5yZXF1ZXN0RGV2aWNlKCk7CgogICAgICAgICAgICAv
LyBDb25maWd1cmUgY2FudmFzIGNvbnRleHQKICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhp
cy5jYW52YXMuZ2V0Q29udGV4dCgnd2ViZ3B1Jyk7CiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9
IG5hdmlnYXRvci5ncHUuZ2V0UHJlZmVycmVkQ2FudmFzRm9ybWF0KCk7CgogICAgICAgICAgICB0
aGlzLmNvbnRleHQuY29uZmlndXJlKHsKICAgICAgICAgICAgICAgIGRldmljZTogdGhpcy5kZXZp
Y2UsCiAgICAgICAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCwKICAgICAgICAgICAgICAgIGFscGhh
TW9kZTogJ29wYXF1ZScKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBSZXNpemUgY2Fu
dmFzCiAgICAgICAgICAgIHRoaXMucmVzaXplQ2FudmFzKCk7CiAgICAgICAgICAgIHdpbmRvdy5h
ZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZUNhbnZhcygpKTsKCiAg
ICAgICAgICAgIC8vIEluaXRpYWxpemUgcmVuZGVyaW5nIHJlc291cmNlcwogICAgICAgICAgICBh
d2FpdCB0aGlzLmNyZWF0ZU1lc2hlcygpOwogICAgICAgICAgICB0aGlzLmNyZWF0ZU9iamVjdHMo
KTsKICAgICAgICAgICAgdGhpcy5jcmVhdGVCdWZmZXJzKCk7CiAgICAgICAgICAgIHRoaXMuaW5p
dGlhbGl6ZVRyYW5zZm9ybXMoKTsgLy8gSW5pdGlhbGl6ZSBzdGF0aWMgdHJhbnNmb3JtcyBvbmNl
CiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVwdGhUZXh0dXJlKCk7CiAgICAgICAgICAgIHRoaXMu
Y3JlYXRlUGlwZWxpbmUoZm9ybWF0KTsKICAgICAgICAgICAgdGhpcy5jcmVhdGVCaW5kR3JvdXAo
KTsKCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXZWJHUFUgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1
bGx5Jyk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNZXNoZXM6ICR7dGhpcy5tZXNoZXMubGVu
Z3RofSwgT2JqZWN0czogJHt0aGlzLm9iamVjdHMubGVuZ3RofWApOwoKICAgICAgICAgICAgLy8g
VXBkYXRlIFVJIHdpdGggYWN0dWFsIGNvdW50cwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgndG90YWxPYmplY3RzJykudGV4dENvbnRlbnQgPSB0aGlzLm9iamVjdHMubGVuZ3Ro
OwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzaENvdW50JykudGV4dENv
bnRlbnQgPSB0aGlzLm1lc2hlcy5sZW5ndGg7CgogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAg
ICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKGVycm9yLm1lc3NhZ2UpOwogICAgICAgICAgICB0aHJv
dyBlcnJvcjsKICAgICAgICB9CiAgICB9CgogICAgcmVzaXplQ2FudmFzKCkgewogICAgICAgIHRo
aXMuY2FudmFzLndpZHRoID0gd2luZG93LmlubmVyV2lkdGggKiBkZXZpY2VQaXhlbFJhdGlvOwog
ICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAqIGRldmljZVBp
eGVsUmF0aW87CiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSAnMTAwdncnOwogICAg
ICAgIHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodCA9ICcxMDB2aCc7CgogICAgICAgIGlmICh0aGlz
LmRlcHRoVGV4dHVyZSkgewogICAgICAgICAgICB0aGlzLmNyZWF0ZURlcHRoVGV4dHVyZSgpOwog
ICAgICAgIH0KICAgIH0KCiAgICBjcmVhdGVNZXNoZXMoKSB7CiAgICAgICAgLy8gR2VuZXJhdGUg
c3BoZXJlIG1lc2hlcyAoNy1zZWdtZW50IHNwaGVyZXMpCiAgICAgICAgY29uc29sZS5sb2coYEdl
bmVyYXRpbmcgJHtNRVNIX0NPVU5UfSBzcGhlcmUgbWVzaGVzLi4uYCk7CgogICAgICAgIGZvciAo
bGV0IGkgPSAwOyBpIDwgTUVTSF9DT1VOVDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IG1lc2gg
PSBnZW5lcmF0ZVNwaGVyZU1lc2goNyk7CiAgICAgICAgICAgIHRoaXMubWVzaGVzLnB1c2gobWVz
aCk7CiAgICAgICAgfQoKICAgICAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkICR7dGhpcy5tZXNo
ZXMubGVuZ3RofSBtZXNoZXNgKTsKICAgIH0KCiAgICBjcmVhdGVPYmplY3RzKCkgewogICAgICAg
IC8vIENyZWF0ZSBncmlkIGJhc2VkIG9uIEdSSURfU0laRSBjb25zdGFudAogICAgICAgIGNvbnN0
IHRvdGFsT2JqZWN0cyA9IEdSSURfU0laRSAqIEdSSURfU0laRSAqIEdSSURfU0laRTsKICAgICAg
ICBjb25zb2xlLmxvZyhgQ3JlYXRpbmcgJHtHUklEX1NJWkV9eCR7R1JJRF9TSVpFfXgke0dSSURf
U0laRX0gZ3JpZCAoJHt0b3RhbE9iamVjdHN9IG9iamVjdHMpLi4uYCk7CgogICAgICAgIGNvbnN0
IHNwYWNpbmcgPSAyLjU7CiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKEdSSURfU0laRSAtIDEpICog
c3BhY2luZyAvIDI7CgogICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgR1JJRF9TSVpFOyB4Kysp
IHsKICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBHUklEX1NJWkU7IHkrKykgewogICAg
ICAgICAgICAgICAgZm9yIChsZXQgeiA9IDA7IHogPCBHUklEX1NJWkU7IHorKykgewogICAgICAg
ICAgICAgICAgICAgIC8vIERpc3RyaWJ1dGUgb2JqZWN0cyBhY3Jvc3MgbWVzaGVzIGV2ZW5seQog
ICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc2hJbmRleCA9IE1hdGguZmxvb3IoKHRoaXMub2Jq
ZWN0cy5sZW5ndGggKiBNRVNIX0NPVU5UKSAvIHRvdGFsT2JqZWN0cykgJSB0aGlzLm1lc2hlcy5s
ZW5ndGg7CgogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHsKICAgICAgICAgICAg
ICAgICAgICAgICAgbWVzaEluZGV4OiBtZXNoSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAg
IHBvc2l0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB4ICogc3BhY2luZyAt
IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKiBzcGFjaW5nIC0gb2Zm
c2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgejogeiAqIHNwYWNpbmcgLSBvZmZzZXQK
ICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRp
b246IE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMgogICAgICAgICAgICAgICAgICAgIH07Cgog
ICAgICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKG9iamVjdCk7CiAgICAgICAgICAg
ICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvbnNvbGUubG9nKGBDcmVh
dGVkICR7dGhpcy5vYmplY3RzLmxlbmd0aH0gb2JqZWN0c2ApOwogICAgfQoKICAgIGNyZWF0ZUJ1
ZmZlcnMoKSB7CiAgICAgICAgLy8gQ3JlYXRlIHNpbmdsZSBzaGFyZWQgdmVydGV4IGFuZCBpbmRl
eCBidWZmZXJzIGZvciBhbGwgbWVzaGVzCiAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0aW5nIHNo
YXJlZCBidWZmZXJzIGZvciBhbGwgbWVzaGVzLi4uJyk7CiAgICAgICAgY29uc29sZS5sb2coYFVT
RV9CQVNFX1ZFUlRFWDogJHtVU0VfQkFTRV9WRVJURVh9ICgke1VTRV9CQVNFX1ZFUlRFWCA/ICdy
ZWxhdGl2ZSBpbmRpY2VzJyA6ICdhYnNvbHV0ZSBpbmRpY2VzJ30pYCk7CgogICAgICAgIC8vIENh
bGN1bGF0ZSB0b3RhbCBzaXplIG5lZWRlZAogICAgICAgIGxldCB0b3RhbFZlcnRpY2VzID0gMDsK
ICAgICAgICBsZXQgdG90YWxJbmRpY2VzID0gMDsKICAgICAgICBmb3IgKGNvbnN0IG1lc2ggb2Yg
dGhpcy5tZXNoZXMpIHsKICAgICAgICAgICAgdG90YWxWZXJ0aWNlcyArPSBtZXNoLnZlcnRleENv
dW50OwogICAgICAgICAgICB0b3RhbEluZGljZXMgKz0gbWVzaC5pbmRleENvdW50OwogICAgICAg
IH0KCiAgICAgICAgLy8gQWxsb2NhdGUgY29tYmluZWQgYnVmZmVycwogICAgICAgIGNvbnN0IGFs
bFZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbFZlcnRpY2VzICogNik7IC8vIDYgZmxv
YXRzIHBlciB2ZXJ0ZXggKHBvcyArIG5vcm1hbCkKICAgICAgICBjb25zdCBhbGxJbmRpY2VzID0g
bmV3IFVpbnQzMkFycmF5KHRvdGFsSW5kaWNlcyk7CgogICAgICAgIC8vIENvcHkgbWVzaCBkYXRh
IGludG8gY29tYmluZWQgYnVmZmVycyBhbmQgcmVjb3JkIG9mZnNldHMKICAgICAgICBsZXQgdmVy
dGV4T2Zmc2V0ID0gMDsKICAgICAgICBsZXQgaW5kZXhPZmZzZXQgPSAwOwoKICAgICAgICBmb3Ig
KGNvbnN0IG1lc2ggb2YgdGhpcy5tZXNoZXMpIHsKICAgICAgICAgICAgLy8gQ29weSB2ZXJ0aWNl
cwogICAgICAgICAgICBhbGxWZXJ0aWNlcy5zZXQobWVzaC52ZXJ0aWNlcywgdmVydGV4T2Zmc2V0
ICogNik7CgogICAgICAgICAgICAvLyBDb3B5IGluZGljZXMKICAgICAgICAgICAgaWYgKFVTRV9C
QVNFX1ZFUlRFWCkgewogICAgICAgICAgICAgICAgLy8gS2VlcCBpbmRpY2VzIHJlbGF0aXZlICgw
LWJhc2VkKSAtIHdpbGwgdXNlIGJhc2VWZXJ0ZXggcGFyYW1ldGVyCiAgICAgICAgICAgICAgICBm
b3IgKGxldCBpID0gMDsgaSA8IG1lc2guaW5kZXhDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAg
ICAgICAgYWxsSW5kaWNlc1tpbmRleE9mZnNldCArIGldID0gbWVzaC5pbmRpY2VzW2ldOwogICAg
ICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gQmFr
ZSB2ZXJ0ZXggb2Zmc2V0IGludG8gaW5kaWNlcyAoYWJzb2x1dGUgYWRkcmVzc2luZykgLSBiYXNl
VmVydGV4IHdpbGwgYmUgMAogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNo
LmluZGV4Q291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGFsbEluZGljZXNbaW5kZXhP
ZmZzZXQgKyBpXSA9IG1lc2guaW5kaWNlc1tpXSArIHZlcnRleE9mZnNldDsKICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU3RvcmUgb2Zmc2V0cyBmb3IgdGhp
cyBtZXNoCiAgICAgICAgICAgIG1lc2gudmVydGV4T2Zmc2V0ID0gdmVydGV4T2Zmc2V0OwogICAg
ICAgICAgICBtZXNoLmluZGV4T2Zmc2V0ID0gaW5kZXhPZmZzZXQ7CgogICAgICAgICAgICB2ZXJ0
ZXhPZmZzZXQgKz0gbWVzaC52ZXJ0ZXhDb3VudDsKICAgICAgICAgICAgaW5kZXhPZmZzZXQgKz0g
bWVzaC5pbmRleENvdW50OwogICAgICAgIH0KCiAgICAgICAgLy8gQ3JlYXRlIEdQVSBidWZmZXJz
CiAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSB0aGlzLmRldmljZS5jcmVhdGVCdWZmZXIoewog
ICAgICAgICAgICBzaXplOiBhbGxWZXJ0aWNlcy5ieXRlTGVuZ3RoLAogICAgICAgICAgICB1c2Fn
ZTogR1BVQnVmZmVyVXNhZ2UuVkVSVEVYIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QKICAgICAg
ICB9KTsKICAgICAgICB0aGlzLmRldmljZS5xdWV1ZS53cml0ZUJ1ZmZlcih0aGlzLnZlcnRleEJ1
ZmZlciwgMCwgYWxsVmVydGljZXMpOwoKICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gdGhpcy5k
ZXZpY2UuY3JlYXRlQnVmZmVyKHsKICAgICAgICAgICAgc2l6ZTogYWxsSW5kaWNlcy5ieXRlTGVu
Z3RoLAogICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuSU5ERVggfCBHUFVCdWZmZXJV
c2FnZS5DT1BZX0RTVAogICAgICAgIH0pOwogICAgICAgIHRoaXMuZGV2aWNlLnF1ZXVlLndyaXRl
QnVmZmVyKHRoaXMuaW5kZXhCdWZmZXIsIDAsIGFsbEluZGljZXMpOwoKICAgICAgICAvLyBDcmVh
dGUgdHJhbnNmb3JtIGJ1ZmZlciBmb3IgYWxsIGluc3RhbmNlcwogICAgICAgIGNvbnN0IHRyYW5z
Zm9ybUJ1ZmZlclNpemUgPSB0aGlzLm9iamVjdHMubGVuZ3RoICogMTYgKiA0OwogICAgICAgIHRo
aXMudHJhbnNmb3JtQnVmZmVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKHsKICAgICAgICAg
ICAgc2l6ZTogdHJhbnNmb3JtQnVmZmVyU2l6ZSwKICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZl
clVzYWdlLlZFUlRFWCB8IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUCiAgICAgICAgfSk7CgogICAg
ICAgIC8vIENyZWF0ZSB1bmlmb3JtIGJ1ZmZlciBmb3Igdmlldy9wcm9qZWN0aW9uIG1hdHJpY2Vz
CiAgICAgICAgdGhpcy51bmlmb3JtQnVmZmVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQnVmZmVyKHsK
ICAgICAgICAgICAgc2l6ZTogMTI4LCAvLyAyIG1hdHJpY2VzICogMTYgZmxvYXRzICogNCBieXRl
cwogICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuVU5JRk9STSB8IEdQVUJ1ZmZlclVz
YWdlLkNPUFlfRFNUCiAgICAgICAgfSk7CgogICAgICAgIGNvbnNvbGUubG9nKGBTaGFyZWQgdmVy
dGV4IGJ1ZmZlcjogJHthbGxWZXJ0aWNlcy5ieXRlTGVuZ3RofSBieXRlcyAoJHt0b3RhbFZlcnRp
Y2VzfSB2ZXJ0aWNlcylgKTsKICAgICAgICBjb25zb2xlLmxvZyhgU2hhcmVkIGluZGV4IGJ1ZmZl
cjogJHthbGxJbmRpY2VzLmJ5dGVMZW5ndGh9IGJ5dGVzICgke3RvdGFsSW5kaWNlc30gaW5kaWNl
cylgKTsKICAgICAgICBjb25zb2xlLmxvZyhgVHJhbnNmb3JtIGJ1ZmZlcjogJHt0cmFuc2Zvcm1C
dWZmZXJTaXplfSBieXRlc2ApOwogICAgfQoKICAgIGNyZWF0ZURlcHRoVGV4dHVyZSgpIHsKICAg
ICAgICBpZiAodGhpcy5kZXB0aFRleHR1cmUpIHsKICAgICAgICAgICAgdGhpcy5kZXB0aFRleHR1
cmUuZGVzdHJveSgpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5kZXB0aFRleHR1cmUgPSB0aGlz
LmRldmljZS5jcmVhdGVUZXh0dXJlKHsKICAgICAgICAgICAgc2l6ZTogW3RoaXMuY2FudmFzLndp
ZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHRdLAogICAgICAgICAgICBmb3JtYXQ6ICdkZXB0aDI0cGx1
cycsCiAgICAgICAgICAgIHVzYWdlOiBHUFVUZXh0dXJlVXNhZ2UuUkVOREVSX0FUVEFDSE1FTlQK
ICAgICAgICB9KTsKICAgIH0KCiAgICBjcmVhdGVQaXBlbGluZShmb3JtYXQpIHsKICAgICAgICBj
b25zdCBzaGFkZXJNb2R1bGUgPSB0aGlzLmRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoewogICAg
ICAgICAgICBjb2RlOiBgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgVW5pZm9ybXMgewogICAgICAg
ICAgICAgICAgICAgIHZpZXc6IG1hdDR4NDxmMzI+LAogICAgICAgICAgICAgICAgICAgIHByb2pl
Y3Rpb246IG1hdDR4NDxmMzI+LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBA
Z3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHVuaWZvcm0+IHVuaWZvcm1zOiBVbmlmb3JtczsKCiAg
ICAgICAgICAgICAgICBzdHJ1Y3QgVmVydGV4SW5wdXQgewogICAgICAgICAgICAgICAgICAgIEBs
b2NhdGlvbigwKSBwb3NpdGlvbjogdmVjMzxmMzI+LAogICAgICAgICAgICAgICAgICAgIEBsb2Nh
dGlvbigxKSBub3JtYWw6IHZlYzM8ZjMyPiwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAg
ICAgICAgc3RydWN0IEluc3RhbmNlSW5wdXQgewogICAgICAgICAgICAgICAgICAgIEBsb2NhdGlv
bigyKSBtb2RlbDA6IHZlYzQ8ZjMyPiwKICAgICAgICAgICAgICAgICAgICBAbG9jYXRpb24oMykg
bW9kZWwxOiB2ZWM0PGYzMj4sCiAgICAgICAgICAgICAgICAgICAgQGxvY2F0aW9uKDQpIG1vZGVs
MjogdmVjNDxmMzI+LAogICAgICAgICAgICAgICAgICAgIEBsb2NhdGlvbig1KSBtb2RlbDM6IHZl
YzQ8ZjMyPiwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgc3RydWN0IFZlcnRl
eE91dHB1dCB7CiAgICAgICAgICAgICAgICAgICAgQGJ1aWx0aW4ocG9zaXRpb24pIHBvc2l0aW9u
OiB2ZWM0PGYzMj4sCiAgICAgICAgICAgICAgICAgICAgQGxvY2F0aW9uKDApIG5vcm1hbDogdmVj
MzxmMzI+LAogICAgICAgICAgICAgICAgICAgIEBsb2NhdGlvbigxKSB3b3JsZFBvczogdmVjMzxm
MzI+LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBAdmVydGV4CiAgICAgICAg
ICAgICAgICBmbiB2ZXJ0ZXhNYWluKHZlcnRleDogVmVydGV4SW5wdXQsIGluc3RhbmNlOiBJbnN0
YW5jZUlucHV0KSAtPiBWZXJ0ZXhPdXRwdXQgewogICAgICAgICAgICAgICAgICAgIHZhciBvdXRw
dXQ6IFZlcnRleE91dHB1dDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGVsID0gbWF0NHg0
PGYzMj4oCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLm1vZGVsMCwKICAgICAgICAg
ICAgICAgICAgICAgICAgaW5zdGFuY2UubW9kZWwxLAogICAgICAgICAgICAgICAgICAgICAgICBp
bnN0YW5jZS5tb2RlbDIsCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLm1vZGVsMwog
ICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGxldCB3b3JsZFBvcyA9
IG1vZGVsICogdmVjNDxmMzI+KHZlcnRleC5wb3NpdGlvbiwgMS4wKTsKICAgICAgICAgICAgICAg
ICAgICBvdXRwdXQucG9zaXRpb24gPSB1bmlmb3Jtcy5wcm9qZWN0aW9uICogdW5pZm9ybXMudmll
dyAqIHdvcmxkUG9zOwogICAgICAgICAgICAgICAgICAgIG91dHB1dC53b3JsZFBvcyA9IHdvcmxk
UG9zLnh5ejsKCiAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIG5vcm1hbCB0byB3b3Js
ZCBzcGFjZQogICAgICAgICAgICAgICAgICAgIG91dHB1dC5ub3JtYWwgPSBub3JtYWxpemUoKG1v
ZGVsICogdmVjNDxmMzI+KHZlcnRleC5ub3JtYWwsIDAuMCkpLnh5eik7CgogICAgICAgICAgICAg
ICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAg
QGZyYWdtZW50CiAgICAgICAgICAgICAgICBmbiBmcmFnbWVudE1haW4oaW5wdXQ6IFZlcnRleE91
dHB1dCkgLT4gQGxvY2F0aW9uKDApIHZlYzQ8ZjMyPiB7CiAgICAgICAgICAgICAgICAgICAgLy8g
U2ltcGxlIGxpZ2h0aW5nCiAgICAgICAgICAgICAgICAgICAgbGV0IGxpZ2h0RGlyID0gbm9ybWFs
aXplKHZlYzM8ZjMyPigxLjAsIDEuMCwgMS4wKSk7CiAgICAgICAgICAgICAgICAgICAgbGV0IGFt
YmllbnQgPSAwLjM7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmZ1c2UgPSBtYXgoZG90KGlu
cHV0Lm5vcm1hbCwgbGlnaHREaXIpLCAwLjApICogMC43OwogICAgICAgICAgICAgICAgICAgIGxl
dCBsaWdodGluZyA9IGFtYmllbnQgKyBkaWZmdXNlOwoKICAgICAgICAgICAgICAgICAgICAvLyBD
b2xvciBiYXNlZCBvbiB3b3JsZCBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgIGxldCBjb2xv
ciA9IHZlYzM8ZjMyPigKICAgICAgICAgICAgICAgICAgICAgICAgYWJzKHNpbihpbnB1dC53b3Js
ZFBvcy54ICogMC4xKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGFicyhzaW4oaW5wdXQud29y
bGRQb3MueSAqIDAuMSkpLAogICAgICAgICAgICAgICAgICAgICAgICBhYnMoc2luKGlucHV0Lndv
cmxkUG9zLnogKiAwLjEpKQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAg
ICAgIHJldHVybiB2ZWM0PGYzMj4oY29sb3IgKiBsaWdodGluZywgMS4wKTsKICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgYAogICAgICAgIH0pOwoKICAgICAgICBjb25zdCBwaXBlbGluZUxh
eW91dCA9IHRoaXMuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHsKICAgICAgICAgICAgYmlu
ZEdyb3VwTGF5b3V0czogWwogICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuY3JlYXRlQmluZEdy
b3VwTGF5b3V0KHsKICAgICAgICAgICAgICAgICAgICBlbnRyaWVzOiBbewogICAgICAgICAgICAg
ICAgICAgICAgICBiaW5kaW5nOiAwLAogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5
OiBHUFVTaGFkZXJTdGFnZS5WRVJURVgsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjog
eyB0eXBlOiAndW5pZm9ybScgfQogICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAg
ICB9KQogICAgICAgICAgICBdCiAgICAgICAgfSk7CgogICAgICAgIHRoaXMucGlwZWxpbmUgPSB0
aGlzLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZSh7CiAgICAgICAgICAgIGxheW91dDogcGlw
ZWxpbmVMYXlvdXQsCiAgICAgICAgICAgIHZlcnRleDogewogICAgICAgICAgICAgICAgbW9kdWxl
OiBzaGFkZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAndmVydGV4TWFpbics
CiAgICAgICAgICAgICAgICBidWZmZXJzOiBbCiAgICAgICAgICAgICAgICAgICAgLy8gVmVydGV4
IGJ1ZmZlciAocG9zaXRpb24gKyBub3JtYWwpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAg
ICAgICAgICAgICAgICAgICBhcnJheVN0cmlkZTogMjQsIC8vIDYgZmxvYXRzICogNCBieXRlcwog
ICAgICAgICAgICAgICAgICAgICAgICBzdGVwTW9kZTogJ3ZlcnRleCcsCiAgICAgICAgICAgICAg
ICAgICAgICAgIGF0dHJpYnV0ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc2hh
ZGVyTG9jYXRpb246IDAsIG9mZnNldDogMCwgZm9ybWF0OiAnZmxvYXQzMngzJyB9LCAgLy8gcG9z
aXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc2hhZGVyTG9jYXRpb246IDEsIG9m
ZnNldDogMTIsIGZvcm1hdDogJ2Zsb2F0MzJ4MycgfSwgLy8gbm9ybWFsCiAgICAgICAgICAgICAg
ICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIC8v
IEluc3RhbmNlIGJ1ZmZlciAodHJhbnNmb3JtIG1hdHJpeCkKICAgICAgICAgICAgICAgICAgICB7
CiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5U3RyaWRlOiA2NCwgLy8gMTYgZmxvYXRzICog
NCBieXRlcyAoNHg0IG1hdHJpeCkKICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE1vZGU6ICdp
bnN0YW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFsKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHsgc2hhZGVyTG9jYXRpb246IDIsIG9mZnNldDogMCwgZm9ybWF0
OiAnZmxvYXQzMng0JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzaGFkZXJMb2Nh
dGlvbjogMywgb2Zmc2V0OiAxNiwgZm9ybWF0OiAnZmxvYXQzMng0JyB9LAogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgeyBzaGFkZXJMb2NhdGlvbjogNCwgb2Zmc2V0OiAzMiwgZm9ybWF0OiAn
ZmxvYXQzMng0JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzaGFkZXJMb2NhdGlv
bjogNSwgb2Zmc2V0OiA0OCwgZm9ybWF0OiAnZmxvYXQzMng0JyB9LAogICAgICAgICAgICAgICAg
ICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAg
ICAgICB9LAogICAgICAgICAgICBmcmFnbWVudDogewogICAgICAgICAgICAgICAgbW9kdWxlOiBz
aGFkZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAnZnJhZ21lbnRNYWluJywK
ICAgICAgICAgICAgICAgIHRhcmdldHM6IFt7IGZvcm1hdDogZm9ybWF0IH1dCiAgICAgICAgICAg
IH0sCiAgICAgICAgICAgIHByaW1pdGl2ZTogewogICAgICAgICAgICAgICAgdG9wb2xvZ3k6ICd0
cmlhbmdsZS1saXN0JywKICAgICAgICAgICAgICAgIGN1bGxNb2RlOiAnYmFjaycKICAgICAgICAg
ICAgfSwKICAgICAgICAgICAgZGVwdGhTdGVuY2lsOiB7CiAgICAgICAgICAgICAgICBmb3JtYXQ6
ICdkZXB0aDI0cGx1cycsCiAgICAgICAgICAgICAgICBkZXB0aFdyaXRlRW5hYmxlZDogdHJ1ZSwK
ICAgICAgICAgICAgICAgIGRlcHRoQ29tcGFyZTogJ2xlc3MnCiAgICAgICAgICAgIH0KICAgICAg
ICB9KTsKICAgIH0KCiAgICBjcmVhdGVCaW5kR3JvdXAoKSB7CiAgICAgICAgdGhpcy5iaW5kR3Jv
dXAgPSB0aGlzLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoewogICAgICAgICAgICBsYXlvdXQ6IHRo
aXMucGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KDApLAogICAgICAgICAgICBlbnRyaWVzOiBb
ewogICAgICAgICAgICAgICAgYmluZGluZzogMCwKICAgICAgICAgICAgICAgIHJlc291cmNlOiB7
IGJ1ZmZlcjogdGhpcy51bmlmb3JtQnVmZmVyIH0KICAgICAgICAgICAgfV0KICAgICAgICB9KTsK
ICAgIH0KCiAgICB1cGRhdGVDYW1lcmEodGltZSkgewogICAgICAgIC8vIENhbWVyYSBmbGllcyBh
cm91bmQgdGhlIGdyaWQKICAgICAgICBjb25zdCByYWRpdXMgPSAxODA7CiAgICAgICAgY29uc3Qg
aGVpZ2h0ID0gMzA7CiAgICAgICAgY29uc3Qgc3BlZWQgPSAwLjI7CgogICAgICAgIGNvbnN0IGV5
ZSA9IG5ldyBWZWMzKAogICAgICAgICAgICBNYXRoLmNvcyh0aW1lICogc3BlZWQpICogcmFkaXVz
LAogICAgICAgICAgICBoZWlnaHQgKyBNYXRoLnNpbih0aW1lICogc3BlZWQgKiAwLjUpICogMTAs
CiAgICAgICAgICAgIE1hdGguc2luKHRpbWUgKiBzcGVlZCkgKiByYWRpdXMKICAgICAgICApOwog
ICAgICAgIGNvbnN0IGNlbnRlciA9IG5ldyBWZWMzKDAsIDAsIDApOwogICAgICAgIGNvbnN0IHVw
ID0gbmV3IFZlYzMoMCwgMSwgMCk7CgogICAgICAgIGNvbnN0IHZpZXcgPSBNYXQ0Lmxvb2tBdChl
eWUsIGNlbnRlciwgdXApOwogICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMuY2FudmFzLndpZHRo
IC8gdGhpcy5jYW52YXMuaGVpZ2h0OwogICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSBNYXQ0LnBl
cnNwZWN0aXZlKE1hdGguUEkgLyA0LCBhc3BlY3QsIDAuMSwgMTAwMCk7CgogICAgICAgIC8vIFVw
bG9hZCB0byB1bmlmb3JtIGJ1ZmZlcgogICAgICAgIGNvbnN0IHVuaWZvcm1EYXRhID0gbmV3IEZs
b2F0MzJBcnJheSgzMik7IC8vIDIgbWF0cmljZXMKICAgICAgICB1bmlmb3JtRGF0YS5zZXQodmll
dy5kYXRhLCAwKTsKICAgICAgICB1bmlmb3JtRGF0YS5zZXQocHJvamVjdGlvbi5kYXRhLCAxNik7
CgogICAgICAgIHRoaXMuZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHRoaXMudW5pZm9ybUJ1ZmZl
ciwgMCwgdW5pZm9ybURhdGEpOwogICAgfQoKICAgIGluaXRpYWxpemVUcmFuc2Zvcm1zKCkgewog
ICAgICAgIC8vIEluaXRpYWxpemUgYWxsIHRyYW5zZm9ybXMgb25jZSBhdCBzdGFydHVwIChubyBh
bmltYXRpb24pCiAgICAgICAgY29uc3QgdHJhbnNmb3JtRGF0YSA9IG5ldyBGbG9hdDMyQXJyYXko
dGhpcy5vYmplY3RzLmxlbmd0aCAqIDE2KTsKCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0
aGlzLm9iamVjdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3Qgb2JqID0gdGhpcy5v
YmplY3RzW2ldOwoKICAgICAgICAgICAgLy8gQ3JlYXRlIHN0YXRpYyB0cmFuc2Zvcm0gbWF0cml4
IChubyByb3RhdGlvbiBhbmltYXRpb24pCiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0g
TWF0NC50cmFuc2xhdGlvbihvYmoucG9zaXRpb24ueCwgb2JqLnBvc2l0aW9uLnksIG9iai5wb3Np
dGlvbi56KTsKICAgICAgICAgICAgY29uc3Qgcm90YXRpb24gPSBNYXQ0LnJvdGF0aW9uWShvYmou
cm90YXRpb24pOwogICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBNYXQ0Lm11bHRpcGx5KHRy
YW5zbGF0aW9uLCByb3RhdGlvbik7CgogICAgICAgICAgICB0cmFuc2Zvcm1EYXRhLnNldCh0cmFu
c2Zvcm0uZGF0YSwgaSAqIDE2KTsKICAgICAgICB9CgogICAgICAgIC8vIFVwbG9hZCBvbmNlIGFu
ZCBuZXZlciB1cGRhdGUgYWdhaW4KICAgICAgICB0aGlzLmRldmljZS5xdWV1ZS53cml0ZUJ1ZmZl
cih0aGlzLnRyYW5zZm9ybUJ1ZmZlciwgMCwgdHJhbnNmb3JtRGF0YSk7CiAgICAgICAgLy9jb25z
b2xlLmxvZygnVHJhbnNmb3JtIGJ1ZmZlciBpbml0aWFsaXplZCAoc3RhdGljLCBubyB1cGRhdGVz
KScpOwogICAgfQoKICAgIHVwZGF0ZVJlbmRlck9yZGVyKCkgewogICAgICAgIC8vIFJhbmRvbWx5
IHZhcnkgb2JqZWN0IGNvdW50IGJldHdlZW4gNzAlIGFuZCAxMDAlIG9mIHRvdGFsIG9iamVjdHM6
CiAgICAgICAgY29uc3QgbWluQ291bnQgPSBNYXRoLmZsb29yKHRoaXMub2JqZWN0cy5sZW5ndGgg
KiAwLjcpOwogICAgICAgIGNvbnN0IG1heENvdW50ID0gdGhpcy5vYmplY3RzLmxlbmd0aDsKICAg
ICAgICBjb25zdCBlbmRDdXRDb3VudCA9IFZBUllfUlFfVEFJTCA/CiAgICAgICAgICAgIE1hdGgu
Zmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhDb3VudCAtIG1pbkNvdW50ICsgMSkpICsgbWluQ291
bnQgOgogICAgICAgICAgICBtYXhDb3VudDsKICAgICAgICAKICAgICAgICAvLyBSYW5kb21seSB2
YXJ5IHN0YXJ0IG9iamVjdCBiZXR3ZWVuIDAlIGFuZCAzMCUgb2YgdG90YWwgb2JqZWN0czoKICAg
ICAgICBjb25zdCBzdGFydEN1dENvdW50ID0gVkFSWV9SUV9IRUFEID8KICAgICAgICAgICAgTWF0
aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5vYmplY3RzLmxlbmd0aCAqIDAuMykgOgogICAg
ICAgICAgICAwOwoKICAgICAgICBjb25zdCByZW5kZXJPcmRlciA9IEFycmF5LmZyb20oeyBsZW5n
dGg6IHRoaXMub2JqZWN0cy5sZW5ndGggfSwgKF8sIGkpID0+IGkpOwogICAgICAgIAogICAgICAg
IC8vIFJhbmRvbWx5IHNodWZmbGUgcmVuZGVyIG9yZGVyOgogICAgICAgIGlmKERPX1JRX1NIVUZG
TEUpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlbmRlck9yZGVyLmxlbmd0aCAtIDE7IGkg
PiAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFu
ZG9tKCkgKiAoaSArIDEpKTsKICAgICAgICAgICAgICAgIFtyZW5kZXJPcmRlcltpXSwgcmVuZGVy
T3JkZXJbal1dID0gW3JlbmRlck9yZGVyW2pdLCByZW5kZXJPcmRlcltpXV07CiAgICAgICAgICAg
IH0KICAgICAgICB9CgogICAgICAgIC8vIEl0IGlzIGVub3VnaCBzZXQgdG8gdHJ1ZSBlaXRoZXIg
dmFyeUhlYWQgb3IgZG9TaHVmZmxlIHRvIGNyYXNoIFdlYkdQVSBvbiBpUGhvbmUKCiAgICAgICAg
Ly8gT25seSB0YWtlIHRoZSBmaXJzdCBvYmplY3RDb3VudCBpdGVtcyBmcm9tIHNodWZmbGVkIGFy
cmF5CiAgICAgICAgY29uc3Qgb2JqZWN0Q291bnQgPSBlbmRDdXRDb3VudCAtIHN0YXJ0Q3V0Q291
bnQ7CiAgICAgICAgdGhpcy5yZW5kZXJPcmRlciA9IHJlbmRlck9yZGVyLnNsaWNlKHN0YXJ0Q3V0
Q291bnQsIGVuZEN1dENvdW50KTsKICAgICAgICB0aGlzLmN1cnJlbnRPYmplY3RDb3VudCA9IG9i
amVjdENvdW50OwoKICAgICAgICAvLyBOTyBidWZmZXIgdXBkYXRlcyAtIGp1c3QgY2hhbmdpbmcg
d2hpY2ggb2JqZWN0cyB3ZSByZW5kZXIKICAgIH0KCiAgICByZW5kZXIodGltZSkgewogICAgICAg
IHRoaXMudGltZSA9IHRpbWUgKiAwLjAwMTsgLy8gQ29udmVydCB0byBzZWNvbmRzCgogICAgICAg
IC8vIFVwZGF0ZSBjYW1lcmEgYW5kIHJlbmRlciBvcmRlciAodHJhbnNmb3JtcyBhcmUgc3RhdGlj
IG5vdykKICAgICAgICB0aGlzLnVwZGF0ZUNhbWVyYSh0aGlzLnRpbWUpOwogICAgICAgIHRoaXMu
dXBkYXRlUmVuZGVyT3JkZXIoKTsKICAgICAgICB0aGlzLmluaXRpYWxpemVUcmFuc2Zvcm1zKCk7
CgogICAgICAgIC8vIENyZWF0ZSBjb21tYW5kIGVuY29kZXIKICAgICAgICBjb25zdCBjb21tYW5k
RW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7CgogICAgICAgIGNv
bnN0IHRleHR1cmVWaWV3ID0gdGhpcy5jb250ZXh0LmdldEN1cnJlbnRUZXh0dXJlKCkuY3JlYXRl
VmlldygpOwogICAgICAgIGNvbnN0IGRlcHRoVmlldyA9IHRoaXMuZGVwdGhUZXh0dXJlLmNyZWF0
ZVZpZXcoKTsKCiAgICAgICAgY29uc3QgcmVuZGVyUGFzcyA9IGNvbW1hbmRFbmNvZGVyLmJlZ2lu
UmVuZGVyUGFzcyh7CiAgICAgICAgICAgIGNvbG9yQXR0YWNobWVudHM6IFt7CiAgICAgICAgICAg
ICAgICB2aWV3OiB0ZXh0dXJlVmlldywKICAgICAgICAgICAgICAgIGNsZWFyVmFsdWU6IHsgcjog
MC4xLCBnOiAwLjEsIGI6IDAuMTUsIGE6IDEuMCB9LAogICAgICAgICAgICAgICAgbG9hZE9wOiAn
Y2xlYXInLAogICAgICAgICAgICAgICAgc3RvcmVPcDogJ3N0b3JlJwogICAgICAgICAgICB9XSwK
ICAgICAgICAgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudDogewogICAgICAgICAgICAgICAgdmll
dzogZGVwdGhWaWV3LAogICAgICAgICAgICAgICAgZGVwdGhDbGVhclZhbHVlOiAxLjAsCiAgICAg
ICAgICAgICAgICBkZXB0aExvYWRPcDogJ2NsZWFyJywKICAgICAgICAgICAgICAgIGRlcHRoU3Rv
cmVPcDogJ3N0b3JlJwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJlbmRlclBh
c3Muc2V0UGlwZWxpbmUodGhpcy5waXBlbGluZSk7CiAgICAgICAgcmVuZGVyUGFzcy5zZXRCaW5k
R3JvdXAoMCwgdGhpcy5iaW5kR3JvdXApOwoKICAgICAgICAvLyBCaW5kIHNoYXJlZCBidWZmZXJz
IG9uY2UKICAgICAgICByZW5kZXJQYXNzLnNldFZlcnRleEJ1ZmZlcigwLCB0aGlzLnZlcnRleEJ1
ZmZlcik7CiAgICAgICAgcmVuZGVyUGFzcy5zZXRWZXJ0ZXhCdWZmZXIoMSwgdGhpcy50cmFuc2Zv
cm1CdWZmZXIpOwogICAgICAgIHJlbmRlclBhc3Muc2V0SW5kZXhCdWZmZXIodGhpcy5pbmRleEJ1
ZmZlciwgJ3VpbnQzMicpOwoKICAgICAgICAvLyBCYXRjaCBjb25zZWN1dGl2ZSBkcmF3cyBvZiB0
aGUgc2FtZSBtZXNoIGludG8gaW5zdGFuY2VkIGRyYXdzCiAgICAgICAgdGhpcy5kcmF3Q2FsbENv
dW50ID0gMDsKICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLmN1cnJl
bnRPYmplY3RDb3VudCkgewogICAgICAgICAgICBjb25zdCBvYmpJbmRleCA9IHRoaXMucmVuZGVy
T3JkZXJbaV07CiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHRoaXMub2JqZWN0c1tvYmpJbmRleF07
CiAgICAgICAgICAgIGNvbnN0IG1lc2ggPSB0aGlzLm1lc2hlc1tvYmoubWVzaEluZGV4XTsKCiAg
ICAgICAgICAgIC8vIENvdW50IGNvbnNlY3V0aXZlIG9iamVjdHMgdXNpbmcgdGhlIHNhbWUgbWVz
aAogICAgICAgICAgICBsZXQgaW5zdGFuY2VDb3VudCA9IDE7CiAgICAgICAgICAgIGNvbnN0IGZp
cnN0SW5zdGFuY2UgPSBpOwoKICAgICAgICAgICAgaWYoR1JPVVBfSU5TVEFOQ0VTKSB7CiAgICAg
ICAgICAgICAgICB3aGlsZSAoaSArIGluc3RhbmNlQ291bnQgPCB0aGlzLmN1cnJlbnRPYmplY3RD
b3VudCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRPYmpJbmRleCA9IHRoaXMucmVu
ZGVyT3JkZXJbaSArIGluc3RhbmNlQ291bnRdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5l
eHRPYmogPSB0aGlzLm9iamVjdHNbbmV4dE9iakluZGV4XTsKICAgICAgICAgICAgICAgICAgICBp
ZiAobmV4dE9iai5tZXNoSW5kZXggIT09IG9iai5tZXNoSW5kZXgpIHsKICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAg
IGluc3RhbmNlQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAg
ICAgICAgLy8gRHJhdyBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgbWVzaCBpbiBvbmUgY2FsbAogICAg
ICAgICAgICAvLyBkcmF3SW5kZXhlZChpbmRleENvdW50LCBpbnN0YW5jZUNvdW50LCBmaXJzdElu
ZGV4LCBiYXNlVmVydGV4LCBmaXJzdEluc3RhbmNlKQogICAgICAgICAgICBjb25zdCBiYXNlVmVy
dGV4ID0gVVNFX0JBU0VfVkVSVEVYID8gbWVzaC52ZXJ0ZXhPZmZzZXQgOiAwOwogICAgICAgICAg
ICByZW5kZXJQYXNzLmRyYXdJbmRleGVkKAogICAgICAgICAgICAgICAgbWVzaC5pbmRleENvdW50
LCAgICAgIC8vIGluZGV4Q291bnQgLSBob3cgbWFueSBpbmRpY2VzIHBlciBpbnN0YW5jZQogICAg
ICAgICAgICAgICAgaW5zdGFuY2VDb3VudCwgICAgICAgIC8vIGluc3RhbmNlQ291bnQgLSBob3cg
bWFueSBpbnN0YW5jZXMgdG8gZHJhdwogICAgICAgICAgICAgICAgbWVzaC5pbmRleE9mZnNldCwg
ICAgIC8vIGZpcnN0SW5kZXggLSB3aGVyZSB0byBzdGFydCBpbiB0aGUgaW5kZXggYnVmZmVyCiAg
ICAgICAgICAgICAgICBiYXNlVmVydGV4LCAgICAgICAgICAgLy8gYmFzZVZlcnRleCAtIHZlcnRl
eCBvZmZzZXQgKFVTRV9CQVNFX1ZFUlRFWCA/IG9mZnNldCA6IDApCiAgICAgICAgICAgICAgICBm
aXJzdEluc3RhbmNlICAgICAgICAgLy8gZmlyc3RJbnN0YW5jZSAtIHdoZXJlIHRvIHN0YXJ0IGlu
IHRyYW5zZm9ybSBidWZmZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5kcmF3Q2Fs
bENvdW50Kys7CgogICAgICAgICAgICBpICs9IGluc3RhbmNlQ291bnQ7CiAgICAgICAgfQoKICAg
ICAgICByZW5kZXJQYXNzLmVuZCgpOwogICAgICAgIHRoaXMuZGV2aWNlLnF1ZXVlLnN1Ym1pdChb
Y29tbWFuZEVuY29kZXIuZmluaXNoKCldKTsKCiAgICAgICAgLy8gVXBkYXRlIEZQUwogICAgICAg
IHRoaXMudXBkYXRlRlBTKCk7CiAgICB9CgogICAgdXBkYXRlRlBTKCkgewogICAgICAgIHRoaXMu
ZnJhbWVDb3VudCsrOwogICAgICAgIGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAg
ICAgIGNvbnN0IGVsYXBzZWQgPSBub3cgLSB0aGlzLmxhc3RUaW1lOwoKICAgICAgICAvLyBVcGRh
dGUgZWxhcHNlZCB0aW1lIGV2ZXJ5IGZyYW1lCiAgICAgICAgY29uc3QgZWxhcHNlZFNlY29uZHMg
PSBNYXRoLmZsb29yKChub3cgLSB0aGlzLnN0YXJ0VGltZSkgLyAxMDAwKTsKICAgICAgICBkb2N1
bWVudC5nZXRFbGVtZW50QnlJZCgnZWxhcHNlZCcpLnRleHRDb250ZW50ID0gZWxhcHNlZFNlY29u
ZHM7CgogICAgICAgIGlmIChlbGFwc2VkID49IDEwMDApIHsKICAgICAgICAgICAgdGhpcy5mcHMg
PSBNYXRoLnJvdW5kKCh0aGlzLmZyYW1lQ291bnQgKiAxMDAwKSAvIGVsYXBzZWQpOwogICAgICAg
ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnBzJykudGV4dENvbnRlbnQgPSB0aGlzLmZw
czsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29iamVjdENvdW50JykudGV4
dENvbnRlbnQgPSB0aGlzLmN1cnJlbnRPYmplY3RDb3VudDsKICAgICAgICAgICAgZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoJ2RyYXdDYWxscycpLnRleHRDb250ZW50ID0gdGhpcy5kcmF3Q2FsbENv
dW50OwogICAgICAgICAgICB0aGlzLmZyYW1lQ291bnQgPSAwOwogICAgICAgICAgICB0aGlzLmxh
c3RUaW1lID0gbm93OwogICAgICAgIH0KICAgIH0KCiAgICBzaG93RXJyb3IobWVzc2FnZSkgewog
ICAgICAgIGNvbnN0IGVycm9yRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yJyk7
CiAgICAgICAgZXJyb3JEaXYudGV4dENvbnRlbnQgPSAnRXJyb3I6ICcgKyBtZXNzYWdlOwogICAg
ICAgIGVycm9yRGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgIGNvbnNvbGUuZXJy
b3IobWVzc2FnZSk7CiAgICB9CgogICAgc3RhcnQoKSB7CiAgICAgICAgdGhpcy5zdGFydFRpbWUg
PSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICBjb25zdCBmcmFtZSA9ICh0aW1lKSA9PiB7CiAg
ICAgICAgICAgIHRoaXMucmVuZGVyKHRpbWUpOwogICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9u
RnJhbWUoZnJhbWUpOwogICAgICAgIH07CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZy
YW1lKTsKICAgIH0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBJbml0aWFsaXplIEFwcGxp
Y2F0aW9uCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCihhc3luYyAoKSA9PiB7CiAgICBjb25zdCBh
cHAgPSBuZXcgV2ViR1BVQXBwKCk7CiAgICBhd2FpdCBhcHAuaW5pdCgpOwogICAgYXBwLnN0YXJ0
KCk7Cn0pKCkuY2F0Y2goZXJyb3IgPT4gewogICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGlu
aXRpYWxpemU6JywgZXJyb3IpOwp9KTsKICAgIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>477453</attachid>
            <date>2025-11-20 10:03:54 -0800</date>
            <delta_ts>2025-11-20 10:03:54 -0800</delta_ts>
            <desc>patch from April</desc>
            <filename>parallel_render_command_encoder.patch</filename>
            <type>text/plain</type>
            <size>27163</size>
            <attacher name="Mike Wyrzykowski">mwyrzykowski</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJHUFUvV2ViR1BVL0NvbW1hbmRFbmNvZGVyLmggYi9Tb3Vy
Y2UvV2ViR1BVL1dlYkdQVS9Db21tYW5kRW5jb2Rlci5oCmluZGV4IDVlMTBjNmYxOWYwNS4uYmU5
NDhiZGE4OWZmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9Db21tYW5kRW5jb2Rl
ci5oCisrKyBiL1NvdXJjZS9XZWJHUFUvV2ViR1BVL0NvbW1hbmRFbmNvZGVyLmgKQEAgLTEzNCw3
ICsxMzQsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBhZGRUZXh0dXJlKGNvbnN0IFRleHR1cmUmKTsK
ICAgICB2b2lkIGFkZFNhbXBsZXIoY29uc3QgU2FtcGxlciYpOwogICAgIGlkPE1UTENvbW1hbmRC
dWZmZXI+IGNvbW1hbmRCdWZmZXIoKSBjb25zdDsKLSAgICB2b2lkIHNldEV4aXN0aW5nRW5jb2Rl
cihpZDxNVExDb21tYW5kRW5jb2Rlcj4pOworICAgIHZvaWQgc2V0RXhpc3RpbmdFbmNvZGVyKGlk
PE1UTENvbW1hbmRFbmNvZGVyPiwgaWQ8TVRMQ29tbWFuZEVuY29kZXI+ID0gbmlsLCBpZDxNVExD
b21tYW5kRW5jb2Rlcj4gPSBuaWwpOwogICAgIHZvaWQgZ2VuZXJhdGVJbnZhbGlkRW5jb2RlclN0
YXRlRXJyb3IoKTsKICAgICBib29sIHZhbGlkYXRlQ2xlYXJCdWZmZXIoY29uc3QgQnVmZmVyJiwg
dWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKICAgICBzdGF0aWMgdm9pZCB0cmFja0Vu
Y29kZXIoQ29tbWFuZEVuY29kZXImLCBWZWN0b3I8dWludDY0X3Q+Jik7CkBAIC0xODksNiArMTg5
LDcgQEAgcHJpdmF0ZToKICAgICBOU011dGFibGVTZXQ8aWQ8TVRMQnVmZmVyPj4gKm1fcmV0YWlu
ZWRCdWZmZXJzIHsgbmlsIH07CiAgICAgSGFzaFNldDxSZWZQdHI8Y29uc3QgU2FtcGxlcj4+IG1f
cmV0YWluZWRTYW1wbGVyczsKICAgICBOU011dGFibGVTZXQ8aWQ8TVRMQ291bnRlclNhbXBsZUJ1
ZmZlcj4+ICptX3JldGFpbmVkVGltZXN0YW1wQnVmZmVycyB7IG5pbCB9OworICAgIE5TQXJyYXk8
aWQ8TVRMQ29tbWFuZEVuY29kZXI+PiogbV9kZXBlbmRlbnRFbmNvZGVycyB7IG5pbCB9OwogICAg
IFZlY3RvcjxGdW5jdGlvbjxib29sKENvbW1hbmRCdWZmZXImKT4+IG1fb25Db21taXRIYW5kbGVy
czsKIHByaXZhdGUgUFVCTElDX0lOX1dFQkdQVV9TV0lGVDoKICAgICBpbnQgbV9idWZmZXJNYXBD
b3VudCB7IDAgfTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJHUFUvV2ViR1BVL0NvbW1hbmRFbmNv
ZGVyLm1tIGIvU291cmNlL1dlYkdQVS9XZWJHUFUvQ29tbWFuZEVuY29kZXIubW0KaW5kZXggZTNj
ZWY0MjBkZmYxLi5hNDdjYzY1ZDE2MjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJHUFUvV2ViR1BV
L0NvbW1hbmRFbmNvZGVyLm1tCisrKyBiL1NvdXJjZS9XZWJHUFUvV2ViR1BVL0NvbW1hbmRFbmNv
ZGVyLm1tCkBAIC0yOTEsMTAgKzI5MSwxNiBAQCBSZWY8Q29tcHV0ZVBhc3NFbmNvZGVyPiBDb21t
YW5kRW5jb2Rlcjo6YmVnaW5Db21wdXRlUGFzcyhjb25zdCBXR1BVQ29tcHV0ZVBhc3NEZQogfQog
I2VuZGlmCiAKLXZvaWQgQ29tbWFuZEVuY29kZXI6OnNldEV4aXN0aW5nRW5jb2RlcihpZDxNVExD
b21tYW5kRW5jb2Rlcj4gZW5jb2RlcikKK3ZvaWQgQ29tbWFuZEVuY29kZXI6OnNldEV4aXN0aW5n
RW5jb2RlcihpZDxNVExDb21tYW5kRW5jb2Rlcj4gZW5jb2RlciwgaWQ8TVRMQ29tbWFuZEVuY29k
ZXI+IHZhbGlkYXRpb25FbmNvZGVyLCBpZDxNVExDb21tYW5kRW5jb2Rlcj4gcmVndWxhckVuY29k
ZXIpCiB7CiAgICAgQVNTRVJUKCFtX2V4aXN0aW5nQ29tbWFuZEVuY29kZXIgfHwgIWVuY29kZXIp
OwogICAgIG1fZXhpc3RpbmdDb21tYW5kRW5jb2RlciA9IGVuY29kZXI7CisgICAgaWYgKHZhbGlk
YXRpb25FbmNvZGVyICYmIHJlZ3VsYXJFbmNvZGVyKQorICAgICAgICBtX2RlcGVuZGVudEVuY29k
ZXJzID0gQFsgdmFsaWRhdGlvbkVuY29kZXIsIHJlZ3VsYXJFbmNvZGVyIF07CisgICAgZWxzZSBp
ZiAodmFsaWRhdGlvbkVuY29kZXIgfHwgcmVndWxhckVuY29kZXIpCisgICAgICAgIG1fZGVwZW5k
ZW50RW5jb2RlcnMgPSB2YWxpZGF0aW9uRW5jb2RlciA/IEBbIHZhbGlkYXRpb25FbmNvZGVyIF0g
OiBAWyByZWd1bGFyRW5jb2RlciBdOworICAgIGVsc2UKKyAgICAgICAgbV9kZXBlbmRlbnRFbmNv
ZGVycyA9IG5pbDsKICAgICBtX2RldmljZS0+cHJvdGVjdGVkUXVldWUoKS0+c2V0RW5jb2RlckZv
ckJ1ZmZlcihtX2NvbW1hbmRCdWZmZXIsIGVuY29kZXIpOwogfQogCkBAIC0zMDgsNiArMzE0LDEw
IEBAIHZvaWQgQ29tbWFuZEVuY29kZXI6OmRpc2NhcmRDb21tYW5kQnVmZmVyKCkKIAogICAgIGlk
PE1UTENvbW1hbmRFbmNvZGVyPiBleGlzdGluZ0VuY29kZXIgPSBtX2RldmljZS0+cHJvdGVjdGVk
UXVldWUoKS0+ZW5jb2RlckZvckJ1ZmZlcihtX2NvbW1hbmRCdWZmZXIpOwogICAgIGF1dG8gcXVl
dWUgPSBtX2RldmljZS0+cHJvdGVjdGVkUXVldWUoKTsKKyAgICBmb3IgKGlkPE1UTENvbW1hbmRF
bmNvZGVyPiBlbmNvZGVyIGluIG1fZGVwZW5kZW50RW5jb2RlcnMpCisgICAgICAgIFtlbmNvZGVy
IGVuZEVuY29kaW5nXTsKKyAgICBtX2RlcGVuZGVudEVuY29kZXJzID0gbmlsOworCiAgICAgcXVl
dWUtPmVuZEVuY29kaW5nKGV4aXN0aW5nRW5jb2RlciwgbV9jb21tYW5kQnVmZmVyKTsKICAgICBx
dWV1ZS0+cmVtb3ZlTVRMQ29tbWFuZEJ1ZmZlcihtX2NvbW1hbmRCdWZmZXIpOwogICAgIHJldGFp
blRpbWVzdGFtcHNGb3JPbmVVcGRhdGVMb29wKCk7CkBAIC0zMjYsNiArMzM2LDEwIEBAIHZvaWQg
Q29tbWFuZEVuY29kZXI6OmVuZEVuY29kaW5nKGlkPE1UTENvbW1hbmRFbmNvZGVyPiBlbmNvZGVy
KQogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgZm9yIChpZDxNVExDb21tYW5kRW5jb2Rl
cj4gZW5jb2RlciBpbiBtX2RlcGVuZGVudEVuY29kZXJzKQorICAgICAgICBbZW5jb2RlciBlbmRF
bmNvZGluZ107CisgICAgbV9kZXBlbmRlbnRFbmNvZGVycyA9IG5pbDsKKwogICAgIHF1ZXVlLT5l
bmRFbmNvZGluZyhtX2V4aXN0aW5nQ29tbWFuZEVuY29kZXIsIG1fY29tbWFuZEJ1ZmZlcik7CiAg
ICAgc2V0RXhpc3RpbmdFbmNvZGVyKG5pbCk7CiAgICAgbV9ibGl0Q29tbWFuZEVuY29kZXIgPSBu
aWw7CkBAIC03NzMsOSArNzg3LDggQEAgV1RGX0FMTE9XX1VOU0FGRV9CVUZGRVJfVVNBR0VfRU5E
CiAgICAgaWYgKCFtX2RldmljZS0+aXNWYWxpZCgpKQogICAgICAgICByZXR1cm4gUmVuZGVyUGFz
c0VuY29kZXI6OmNyZWF0ZUludmFsaWQoKnRoaXMsIG1fZGV2aWNlLCBAIkdQVURldmljZSB3YXMg
aW52YWxpZCwgdGhpcyB3aWxsIGJlIGFuIGVycm9yIHN1Ym1pdHRpbmcgdGhlIGNvbW1hbmQgYnVm
ZmVyIik7CiAKLSAgICBhdXRvIG10bFJlbmRlckNvbW1hbmRFbmNvZGVyID0gW21fY29tbWFuZEJ1
ZmZlciByZW5kZXJDb21tYW5kRW5jb2RlcldpdGhEZXNjcmlwdG9yOm10bERlc2NyaXB0b3JdOwor
ICAgIGF1dG8gbXRsUmVuZGVyQ29tbWFuZEVuY29kZXIgPSBbbV9jb21tYW5kQnVmZmVyIHBhcmFs
bGVsUmVuZGVyQ29tbWFuZEVuY29kZXJXaXRoRGVzY3JpcHRvcjptdGxEZXNjcmlwdG9yXTsKICAg
ICBBU1NFUlQoIW1fZXhpc3RpbmdDb21tYW5kRW5jb2Rlcik7Ci0gICAgc2V0RXhpc3RpbmdFbmNv
ZGVyKG10bFJlbmRlckNvbW1hbmRFbmNvZGVyKTsKICAgICByZXR1cm4gUmVuZGVyUGFzc0VuY29k
ZXI6OmNyZWF0ZShtdGxSZW5kZXJDb21tYW5kRW5jb2RlciwgZGVzY3JpcHRvciwgdmlzaWJpbGl0
eVJlc3VsdEJ1ZmZlclNpemUsIGRlcHRoUmVhZE9ubHksIHN0ZW5jaWxSZWFkT25seSwgKnRoaXMs
IHZpc2liaWxpdHlSZXN1bHRCdWZmZXIsIG1heERyYXdDb3VudCwgbV9kZXZpY2UsIG10bERlc2Ny
aXB0b3IpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9EZXZp
Y2UuaCBiL1NvdXJjZS9XZWJHUFUvV2ViR1BVL0RldmljZS5oCmluZGV4IGYyNmM1ZGQ4NWYzOC4u
MzdhMjVkMTgxYTk2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9EZXZpY2UuaAor
KysgYi9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9EZXZpY2UuaApAQCAtMTkwLDYgKzE5MCw3IEBAIHB1
YmxpYzoKICAgICBOU1N0cmluZyAqZXJyb3JWYWxpZGF0aW5nVGV4dHVyZUNyZWF0aW9uKGNvbnN0
IFdHUFVUZXh0dXJlRGVzY3JpcHRvciYsIGNvbnN0IFZlY3RvcjxXR1BVVGV4dHVyZUZvcm1hdD4m
IHZpZXdGb3JtYXRzKTsKICAgICBpZDxNVExCdWZmZXI+IGRpc3BhdGNoQ2FsbEJ1ZmZlcigpOwog
ICAgIGlkPE1UTENvbXB1dGVQaXBlbGluZVN0YXRlPiBkaXNwYXRjaENhbGxQaXBlbGluZVN0YXRl
KGlkPE1UTEZ1bmN0aW9uPik7CisgICAgaWQ8TVRMUmVuZGVyUGlwZWxpbmVTdGF0ZT4gbm9wUGlw
ZWxpbmUoKTsKICAgICBpZDxNVExSZW5kZXJQaXBlbGluZVN0YXRlPiBpbmRleEJ1ZmZlckNsYW1w
UGlwZWxpbmUoTVRMSW5kZXhUeXBlLCBOU1VJbnRlZ2VyIHJhc3RlclNhbXBsZUNvdW50KTsKICAg
ICBpZDxNVExSZW5kZXJQaXBlbGluZVN0YXRlPiBpbmRleGVkSW5kaXJlY3RCdWZmZXJDbGFtcFBp
cGVsaW5lKE5TVUludGVnZXIgcmFzdGVyU2FtcGxlQ291bnQpOwogICAgIGlkPE1UTFJlbmRlclBp
cGVsaW5lU3RhdGU+IGluZGlyZWN0QnVmZmVyQ2xhbXBQaXBlbGluZShOU1VJbnRlZ2VyIHJhc3Rl
clNhbXBsZUNvdW50KTsKQEAgLTI5NCw2ICsyOTUsNyBAQCBwcml2YXRlOgogICAgIGlkPE1UTEJ1
ZmZlcj4gbV9kaXNwYXRjaENhbGxCdWZmZXIgeyBuaWwgfTsKICAgICBpZDxNVExDb21wdXRlUGlw
ZWxpbmVTdGF0ZT4gbV9kaXNwYXRjaENhbGxQaXBlbGluZVN0YXRlIHsgbmlsIH07CiAKKyAgICBp
ZDxNVExSZW5kZXJQaXBlbGluZVN0YXRlPiBtX25vcFBpcGVsaW5lIHsgbmlsIH07CiAgICAgaWQ8
TVRMUmVuZGVyUGlwZWxpbmVTdGF0ZT4gbV9pbmRleEJ1ZmZlckNsYW1wVWludFBTTyB7IG5pbCB9
OwogICAgIGlkPE1UTFJlbmRlclBpcGVsaW5lU3RhdGU+IG1faW5kZXhCdWZmZXJDbGFtcFVzaG9y
dFBTTyB7IG5pbCB9OwogICAgIGlkPE1UTFJlbmRlclBpcGVsaW5lU3RhdGU+IG1faW5kZXhCdWZm
ZXJDbGFtcFVpbnRQU09NUyB7IG5pbCB9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkdQVS9XZWJH
UFUvRGV2aWNlLm1tIGIvU291cmNlL1dlYkdQVS9XZWJHUFUvRGV2aWNlLm1tCmluZGV4IDY4NzYx
ZWU3OTc1Yi4uODI4YWUzMTM0Y2E4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9E
ZXZpY2UubW0KKysrIGIvU291cmNlL1dlYkdQVS9XZWJHUFUvRGV2aWNlLm1tCkBAIC00OTIsNiAr
NDkyLDcgQEAgdm9pZCBEZXZpY2U6OmdlbmVyYXRlQVZhbGlkYXRpb25FcnJvcihTdHJpbmcmJiBt
ZXNzYWdlKQogCiAgICAgLy8gaHR0cHM6Ly9ncHV3ZWIuZ2l0aHViLmlvL2dwdXdlYi8jYWJzdHJh
Y3Qtb3BkZWYtZ2VuZXJhdGUtYS12YWxpZGF0aW9uLWVycm9yCiAgICAgYXV0byogc2NvcGUgPSBj
dXJyZW50RXJyb3JTY29wZShXR1BVRXJyb3JGaWx0ZXJfVmFsaWRhdGlvbik7CisgICAgV1RGTG9n
QWx3YXlzKCJWYWxpZGF0aW9uIGVycm9yOiAlcyIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7CiAg
ICAgaWYgKHNjb3BlKSB7CiAgICAgICAgIGlmICghc2NvcGUtPmVycm9yKQogICAgICAgICAgICAg
c2NvcGUtPmVycm9yID0gRXJyb3IgeyBXR1BVRXJyb3JUeXBlX1ZhbGlkYXRpb24sIFdURk1vdmUo
bWVzc2FnZSkgfTsKQEAgLTY3NSw2ICs2NzYsNTAgQEAgaWQ8TVRMQ29tcHV0ZVBpcGVsaW5lU3Rh
dGU+IERldmljZTo6ZGlzcGF0Y2hDYWxsUGlwZWxpbmVTdGF0ZShpZDxNVExGdW5jdGlvbj4gZnUK
ICAgICByZXR1cm4gbV9kaXNwYXRjaENhbGxQaXBlbGluZVN0YXRlOwogfQogCitpZDxNVExSZW5k
ZXJQaXBlbGluZVN0YXRlPiBEZXZpY2U6Om5vcFBpcGVsaW5lKCkKK3sKKyAgICBpZiAoIW1fZGV2
aWNlKQorICAgICAgICByZXR1cm4gbmlsOworCisgICAgaWYgKG1fbm9wUGlwZWxpbmUpCisgICAg
ICAgIHJldHVybiBtX25vcFBpcGVsaW5lOworCisgICAgc3RhdGljIGlkPE1UTEZ1bmN0aW9uPiBm
dW5jdGlvbiA9IG5pbDsKKyAgICBOU0Vycm9yICplcnJvciA9IG5pbDsKKyAgICBzdGF0aWMgc3Rk
OjpvbmNlX2ZsYWcgb25jZUZsYWc7CisgICAgc3RkOjpjYWxsX29uY2Uob25jZUZsYWcsIFsmXSB7
CisgICAgICAgIE1UTENvbXBpbGVPcHRpb25zKiBvcHRpb25zID0gW01UTENvbXBpbGVPcHRpb25z
IG5ld107CisgICAgICAgIEFMTE9XX0RFUFJFQ0FURURfREVDTEFSQVRJT05TX0JFR0lOCisgICAg
ICAgIG9wdGlvbnMuZmFzdE1hdGhFbmFibGVkID0gWUVTOworICAgICAgICBBTExPV19ERVBSRUNB
VEVEX0RFQ0xBUkFUSU9OU19FTkQKKyAgICAgICAgLyogTk9MSU5UICovIGlkPE1UTExpYnJhcnk+
IGxpYnJhcnkgPSBbbV9kZXZpY2UgbmV3TGlicmFyeVdpdGhTb3VyY2U6QFIiKAorICAgIHVzaW5n
IG5hbWVzcGFjZSBtZXRhbDsKKyAgICApIiAgT0JKQ19TVFJJTkdJRlkoV0VCS0lUX0RSQVdfSU5E
RVhFRF9JTkRJUkVDVF9TVFJVQ1RfVFlQRSkgICBAUiIoCisgICAgW1t2ZXJ0ZXhdXSB2b2lkIHZz
Tm9wKCkgeyB9CisgICAgKSIgLyogTk9MSU5UICovIG9wdGlvbnM6b3B0aW9ucyBlcnJvcjomZXJy
b3JdOworICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICBXVEZMb2dBbHdheXMoIiVAIiwg
ZXJyb3IpOworCisgICAgICAgIGZ1bmN0aW9uID0gW2xpYnJhcnkgbmV3RnVuY3Rpb25XaXRoTmFt
ZTpAInZzTm9wIl07CisgICAgfSk7CisKKyAgICBSRUxFQVNFX0FTU0VSVChmdW5jdGlvbik7Cisg
ICAgTVRMUmVuZGVyUGlwZWxpbmVEZXNjcmlwdG9yKiBtdGxSZW5kZXJQaXBlbGluZURlc2NyaXB0
b3IgPSBbTVRMUmVuZGVyUGlwZWxpbmVEZXNjcmlwdG9yIG5ld107CisgICAgbXRsUmVuZGVyUGlw
ZWxpbmVEZXNjcmlwdG9yLnZlcnRleEZ1bmN0aW9uID0gZnVuY3Rpb247CisgICAgbXRsUmVuZGVy
UGlwZWxpbmVEZXNjcmlwdG9yLnJhc3Rlcml6YXRpb25FbmFibGVkID0gZmFsc2U7CisgICAgbXRs
UmVuZGVyUGlwZWxpbmVEZXNjcmlwdG9yLnJhc3RlclNhbXBsZUNvdW50ID0gMTsKKyAgICBtdGxS
ZW5kZXJQaXBlbGluZURlc2NyaXB0b3IuZnJhZ21lbnRGdW5jdGlvbiA9IG5pbDsKKyAgICBtdGxS
ZW5kZXJQaXBlbGluZURlc2NyaXB0b3IuaW5wdXRQcmltaXRpdmVUb3BvbG9neSA9IE1UTFByaW1p
dGl2ZVRvcG9sb2d5Q2xhc3NQb2ludDsKKworICAgIG1fbm9wUGlwZWxpbmUgPSBbbV9kZXZpY2Ug
bmV3UmVuZGVyUGlwZWxpbmVTdGF0ZVdpdGhEZXNjcmlwdG9yOm10bFJlbmRlclBpcGVsaW5lRGVz
Y3JpcHRvciBlcnJvcjomZXJyb3JdOworCisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIFdURkxv
Z0Fsd2F5cygiJUAiLCBlcnJvcik7CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIHJl
dHVybiBtX25vcFBpcGVsaW5lOworfQorCiBpZDxNVExSZW5kZXJQaXBlbGluZVN0YXRlPiBEZXZp
Y2U6OmluZGV4QnVmZmVyQ2xhbXBQaXBlbGluZShNVExJbmRleFR5cGUgaW5kZXhUeXBlLCBOU1VJ
bnRlZ2VyIHJhc3RlclNhbXBsZUNvdW50KQogewogICAgIGlmICghbV9kZXZpY2UpCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9RdWV1ZS5oIGIvU291cmNlL1dlYkdQVS9XZWJHUFUv
UXVldWUuaAppbmRleCAwODQyYjc3OGZmM2IuLjc5YjZmZDQ5ODNhOCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkdQVS9XZWJHUFUvUXVldWUuaAorKysgYi9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9RdWV1
ZS5oCkBAIC03Myw2ICs3Myw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHdyaXRlVGV4dHVyZShjb25z
dCBXR1BVSW1hZ2VDb3B5VGV4dHVyZSYgZGVzdGluYXRpb24sIHN0ZDo6c3Bhbjx1aW50OF90PiBk
YXRhLCBjb25zdCBXR1BVVGV4dHVyZURhdGFMYXlvdXQmLCBjb25zdCBXR1BVRXh0ZW50M0QmIHdy
aXRlU2l6ZSwgYm9vbCBza2lwVmFsaWRhdGlvbiA9IGZhbHNlKTsKICAgICB2b2lkIHNldExhYmVs
KFN0cmluZyYmKTsKIAorICAgIGlkPE1UTENvbW1hbmRRdWV1ZT4gcXVldWUoKSBjb25zdCB7IHJl
dHVybiBtX2NvbW1hbmRRdWV1ZTsgfQogICAgIHZvaWQgb25TdWJtaXR0ZWRXb3JrU2NoZWR1bGVk
KEZ1bmN0aW9uPHZvaWQoKT4mJik7CiAKICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVy
biBtX2NvbW1hbmRRdWV1ZTsgfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkdQVS9XZWJHUFUvUXVl
dWUubW0gYi9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9RdWV1ZS5tbQppbmRleCBlMGIxZmIxOWVjMjYu
LjViODQwZTY5MmFlNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkdQVS9XZWJHUFUvUXVldWUubW0K
KysrIGIvU291cmNlL1dlYkdQVS9XZWJHUFUvUXVldWUubW0KQEAgLTI5MCw2ICsyOTAsOSBAQCB2
b2lkIFF1ZXVlOjpjb21taXRNVExDb21tYW5kQnVmZmVyKGlkPE1UTENvbW1hbmRCdWZmZXI+IGNv
bW1hbmRCdWZmZXIpCiAgICAgICAgICAgICAgICAgaWYgKHVuZGVybHlpbmdFcnJvci5jb2RlID09
IDB4MTBhKQogICAgICAgICAgICAgICAgICAgICBsb3NlVGhlRGV2aWNlID0gZmFsc2U7CiAgICAg
ICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChbTVRMQ2FwdHVyZU1h
bmFnZXIgc2hhcmVkQ2FwdHVyZU1hbmFnZXJdLmlzQ2FwdHVyaW5nKQorICAgICAgICAgICAgICAg
ICAgICAgICAgW1tNVExDYXB0dXJlTWFuYWdlciBzaGFyZWRDYXB0dXJlTWFuYWdlcl0gc3RvcENh
cHR1cmVdOworCiAgICAgICAgICAgICAgICAgICAgIFdURkxvZ0Fsd2F5cygiRW5jb3VudGVyZWQg
ZmF0YWwgY29tbWFuZCBidWZmZXIgZXJyb3IgJUAsIHVuZGVybHlpbmcgZXJyb3IgJUAiLCBlcnJv
ciwgdW5kZXJseWluZ0Vycm9yKTsKICAgICAgICAgICAgICAgICAgICAgYm9vbCBmYXRhbCA9IGZh
bHNlOwogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHVuZGVybHlpbmdFcnJvci5jb2RlKSB7
CkBAIC0zMDksNyArMzEyLDcgQEAgdm9pZCBRdWV1ZTo6Y29tbWl0TVRMQ29tbWFuZEJ1ZmZlcihp
ZDxNVExDb21tYW5kQnVmZmVyPiBjb21tYW5kQnVmZmVyKQogICAgICAgICAgICAgICAgICAgICBk
ZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWZhdGFsKTsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gUkVMRUFTRV9BU1NFUlQoIWZhdGFsKTsKICAgICAgICAgICAgICAg
ICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJHUFUv
V2ViR1BVL1JlbmRlclBhc3NFbmNvZGVyLmggYi9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9SZW5kZXJQ
YXNzRW5jb2Rlci5oCmluZGV4IGZjNTY2NWJkN2JmMi4uZTFiZDkwZDE4NzFhIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9SZW5kZXJQYXNzRW5jb2Rlci5oCisrKyBiL1NvdXJjZS9X
ZWJHUFUvV2ViR1BVL1JlbmRlclBhc3NFbmNvZGVyLmgKQEAgLTYwLDcgKzYwLDcgQEAgc3RydWN0
IEJpbmRhYmxlUmVzb3VyY2VzOwogY2xhc3MgUmVuZGVyUGFzc0VuY29kZXIgOiBwdWJsaWMgUmVm
Q291bnRlZEFuZENhbk1ha2VXZWFrUHRyPFJlbmRlclBhc3NFbmNvZGVyPiwgcHVibGljIFdHUFVS
ZW5kZXJQYXNzRW5jb2RlckltcGwsIHB1YmxpYyBDb21tYW5kc01peGluIHsKICAgICBXVEZfTUFL
RV9UWk9ORV9BTExPQ0FURUQoUmVuZGVyUGFzc0VuY29kZXIpOwogcHVibGljOgotICAgIHN0YXRp
YyBSZWY8UmVuZGVyUGFzc0VuY29kZXI+IGNyZWF0ZShpZDxNVExSZW5kZXJDb21tYW5kRW5jb2Rl
cj4gcmVuZGVyQ29tbWFuZEVuY29kZXIsIGNvbnN0IFdHUFVSZW5kZXJQYXNzRGVzY3JpcHRvciYg
ZGVzY3JpcHRvciwgTlNVSW50ZWdlciB2aXNpYmlsaXR5UmVzdWx0QnVmZmVyU2l6ZSwgYm9vbCBk
ZXB0aFJlYWRPbmx5LCBib29sIHN0ZW5jaWxSZWFkT25seSwgQ29tbWFuZEVuY29kZXImIHBhcmVu
dEVuY29kZXIsIGlkPE1UTEJ1ZmZlcj4gdmlzaWJpbGl0eVJlc3VsdEJ1ZmZlciwgdWludDY0X3Qg
bWF4RHJhd0NvdW50LCBEZXZpY2UmIGRldmljZSwgTVRMUmVuZGVyUGFzc0Rlc2NyaXB0b3IqIG10
bERlc2NyaXB0b3IpCisgICAgc3RhdGljIFJlZjxSZW5kZXJQYXNzRW5jb2Rlcj4gY3JlYXRlKGlk
PE1UTFBhcmFsbGVsUmVuZGVyQ29tbWFuZEVuY29kZXI+IHJlbmRlckNvbW1hbmRFbmNvZGVyLCBj
b25zdCBXR1BVUmVuZGVyUGFzc0Rlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIE5TVUludGVnZXIgdmlz
aWJpbGl0eVJlc3VsdEJ1ZmZlclNpemUsIGJvb2wgZGVwdGhSZWFkT25seSwgYm9vbCBzdGVuY2ls
UmVhZE9ubHksIENvbW1hbmRFbmNvZGVyJiBwYXJlbnRFbmNvZGVyLCBpZDxNVExCdWZmZXI+IHZp
c2liaWxpdHlSZXN1bHRCdWZmZXIsIHVpbnQ2NF90IG1heERyYXdDb3VudCwgRGV2aWNlJiBkZXZp
Y2UsIE1UTFJlbmRlclBhc3NEZXNjcmlwdG9yKiBtdGxEZXNjcmlwdG9yKQogICAgIHsKICAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgUmVuZGVyUGFzc0VuY29kZXIocmVuZGVyQ29tbWFuZEVu
Y29kZXIsIGRlc2NyaXB0b3IsIHZpc2liaWxpdHlSZXN1bHRCdWZmZXJTaXplLCBkZXB0aFJlYWRP
bmx5LCBzdGVuY2lsUmVhZE9ubHksIHBhcmVudEVuY29kZXIsIHZpc2liaWxpdHlSZXN1bHRCdWZm
ZXIsIG1heERyYXdDb3VudCwgZGV2aWNlLCBtdGxEZXNjcmlwdG9yKSk7CiAgICAgfQpAQCAtMTE0
LDcgKzExNCw3IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgc3RkOjpwYWlyPHVpbnQzMl90LCB1aW50
MzJfdD4gY29tcHV0ZU1pbmludW1WZXJ0ZXhJbnN0YW5jZUNvdW50KGNvbnN0IFJlbmRlclBpcGVs
aW5lKiwgYm9vbCYgbmVlZHNWYWxpZGF0aW9uTGF5ZXJXb3JrYXJvdW5kLCB1aW50NjRfdCAoXiko
dWludDMyX3QpKTsKIAogcHJpdmF0ZToKLSAgICBSZW5kZXJQYXNzRW5jb2RlcihpZDxNVExSZW5k
ZXJDb21tYW5kRW5jb2Rlcj4sIGNvbnN0IFdHUFVSZW5kZXJQYXNzRGVzY3JpcHRvciYsIE5TVUlu
dGVnZXIsIGJvb2wgZGVwdGhSZWFkT25seSwgYm9vbCBzdGVuY2lsUmVhZE9ubHksIENvbW1hbmRF
bmNvZGVyJiwgaWQ8TVRMQnVmZmVyPiwgdWludDY0X3QgbWF4RHJhd0NvdW50LCBEZXZpY2UmLCBN
VExSZW5kZXJQYXNzRGVzY3JpcHRvciopOworICAgIFJlbmRlclBhc3NFbmNvZGVyKGlkPE1UTFBh
cmFsbGVsUmVuZGVyQ29tbWFuZEVuY29kZXI+LCBjb25zdCBXR1BVUmVuZGVyUGFzc0Rlc2NyaXB0
b3ImLCBOU1VJbnRlZ2VyLCBib29sIGRlcHRoUmVhZE9ubHksIGJvb2wgc3RlbmNpbFJlYWRPbmx5
LCBDb21tYW5kRW5jb2RlciYsIGlkPE1UTEJ1ZmZlcj4sIHVpbnQ2NF90IG1heERyYXdDb3VudCwg
RGV2aWNlJiwgTVRMUmVuZGVyUGFzc0Rlc2NyaXB0b3IqKTsKICAgICBSZW5kZXJQYXNzRW5jb2Rl
cihDb21tYW5kRW5jb2RlciYsIERldmljZSYsIE5TU3RyaW5nKik7CiAKICAgICBib29sIHZhbGlk
YXRlUG9wRGVidWdHcm91cCgpIGNvbnN0OwpAQCAtMTQwLDggKzE0MCwxMiBAQCBwcml2YXRlOgog
ICAgIHN0ZDo6cGFpcjxpZDxNVExCdWZmZXI+LCB1aW50NjRfdD4gY2xhbXBJbmRpcmVjdEJ1ZmZl
clRvVmFsaWRWYWx1ZXMoQnVmZmVyJiwgdWludDY0X3QgaW5kaXJlY3RPZmZzZXQsIHVpbnQzMl90
IG1pblZlcnRleENvdW50LCB1aW50MzJfdCBtaW5JbnN0YW5jZUNvdW50LCBib29sJiBzcGxpdEVu
Y29kZXIpOwogICAgIHZvaWQgc2V0Q2FjaGVkUmVuZGVyUGFzc1N0YXRlKGlkPE1UTFJlbmRlckNv
bW1hbmRFbmNvZGVyPik7CiAgICAgdm9pZCBlbWl0TWVtb3J5QmFycmllcihpZDxNVExSZW5kZXJD
b21tYW5kRW5jb2Rlcj4pOworICAgIHZvaWQgZW5kRW5jb2RpbmcoKTsKKyAgICBpZDxNVExSZW5k
ZXJDb21tYW5kRW5jb2Rlcj4gdmFsaWRhdGlvblJlbmRlckNvbW1hbmRFbmNvZGVyKCk7CiAKKyAg
ICBpZDxNVExSZW5kZXJDb21tYW5kRW5jb2Rlcj4gbV92YWxpZGF0aW9uUmVuZGVyQ29tbWFuZEVu
Y29kZXIgeyBuaWwgfTsKICAgICBpZDxNVExSZW5kZXJDb21tYW5kRW5jb2Rlcj4gbV9yZW5kZXJD
b21tYW5kRW5jb2RlciB7IG5pbCB9OworICAgIGlkPE1UTFBhcmFsbGVsUmVuZGVyQ29tbWFuZEVu
Y29kZXI+IG1fcGFyYWxsZWxSZW5kZXJDb21tYW5kRW5jb2RlciB7IG5pbCB9OwogCiAgICAgdWlu
dDY0X3QgbV9kZWJ1Z0dyb3VwU3RhY2tTaXplIHsgMCB9OwogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViR1BVL1dlYkdQVS9SZW5kZXJQYXNzRW5jb2Rlci5tbSBiL1NvdXJjZS9XZWJHUFUvV2ViR1BV
L1JlbmRlclBhc3NFbmNvZGVyLm1tCmluZGV4IDU1Y2YzMzY4ZWU3Ni4uY2U4MDgyNDk5ZmFiIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9SZW5kZXJQYXNzRW5jb2Rlci5tbQorKysg
Yi9Tb3VyY2UvV2ViR1BVL1dlYkdQVS9SZW5kZXJQYXNzRW5jb2Rlci5tbQpAQCAtNDcsMTEgKzQ3
LDExIEBAIG5hbWVzcGFjZSBXZWJHUFUgewogI2RlZmluZSBSRVRVUk5fSUZfRklOSVNIRUQoKSBc
CiBpZiAoIW1fcGFyZW50RW5jb2Rlci0+aXNMb2NrZWQoKSB8fCBtX3BhcmVudEVuY29kZXItPmlz
RmluaXNoZWQoKSkgeyBcCiAgICAgUmVmIHsgbV9kZXZpY2UgfS0+Z2VuZXJhdGVBVmFsaWRhdGlv
bkVycm9yKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXM6IGZhaWxlZCBhcyBlbmNvZGlu
ZyBoYXMgZmluaXNoZWQiLCBfX1BSRVRUWV9GVU5DVElPTl9fXSk7IFwKLSAgICBtX3JlbmRlckNv
bW1hbmRFbmNvZGVyID0gbmlsOyBcCisgICAgbV9wYXJhbGxlbFJlbmRlckNvbW1hbmRFbmNvZGVy
ID0gbmlsOyBcCiAgICAgcmV0dXJuOyBcCiB9IFwKLWlmICghbV9yZW5kZXJDb21tYW5kRW5jb2Rl
ciB8fCAhbV9wYXJlbnRFbmNvZGVyLT5pc1ZhbGlkKCkgfHwgIVJlZiB7IG1fcGFyZW50RW5jb2Rl
ciB9LT5lbmNvZGVySXNDdXJyZW50KG1fcmVuZGVyQ29tbWFuZEVuY29kZXIpKSB7IFwKLSAgICBt
X3JlbmRlckNvbW1hbmRFbmNvZGVyID0gbmlsOyBcCitpZiAoIW1fcGFyYWxsZWxSZW5kZXJDb21t
YW5kRW5jb2RlciB8fCAhbV9wYXJlbnRFbmNvZGVyLT5pc1ZhbGlkKCkgfHwgIVJlZiB7IG1fcGFy
ZW50RW5jb2RlciB9LT5lbmNvZGVySXNDdXJyZW50KG1fcGFyYWxsZWxSZW5kZXJDb21tYW5kRW5j
b2RlcikpIHsgXAorbV9wYXJhbGxlbFJlbmRlckNvbW1hbmRFbmNvZGVyID0gbmlsOyBcCiAgICAg
cmV0dXJuOyBcCiB9CiAKQEAgLTYzLDggKzYzLDggQEAgZWxzZSBcCiAKIFdURl9NQUtFX1RaT05F
X0FMTE9DQVRFRF9JTVBMKFJlbmRlclBhc3NFbmNvZGVyKTsKIAotUmVuZGVyUGFzc0VuY29kZXI6
OlJlbmRlclBhc3NFbmNvZGVyKGlkPE1UTFJlbmRlckNvbW1hbmRFbmNvZGVyPiByZW5kZXJDb21t
YW5kRW5jb2RlciwgY29uc3QgV0dQVVJlbmRlclBhc3NEZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBO
U1VJbnRlZ2VyIHZpc2liaWxpdHlSZXN1bHRCdWZmZXJTaXplLCBib29sIGRlcHRoUmVhZE9ubHks
IGJvb2wgc3RlbmNpbFJlYWRPbmx5LCBDb21tYW5kRW5jb2RlciYgcmF3UGFyZW50RW5jb2Rlciwg
aWQ8TVRMQnVmZmVyPiB2aXNpYmlsaXR5UmVzdWx0QnVmZmVyLCB1aW50NjRfdCBtYXhEcmF3Q291
bnQsIERldmljZSYgZGV2aWNlLCBNVExSZW5kZXJQYXNzRGVzY3JpcHRvciogbWV0YWxEZXNjcmlw
dG9yKQotICAgIDogbV9yZW5kZXJDb21tYW5kRW5jb2RlcihyZW5kZXJDb21tYW5kRW5jb2RlcikK
K1JlbmRlclBhc3NFbmNvZGVyOjpSZW5kZXJQYXNzRW5jb2RlcihpZDxNVExQYXJhbGxlbFJlbmRl
ckNvbW1hbmRFbmNvZGVyPiByZW5kZXJDb21tYW5kRW5jb2RlciwgY29uc3QgV0dQVVJlbmRlclBh
c3NEZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBOU1VJbnRlZ2VyIHZpc2liaWxpdHlSZXN1bHRCdWZm
ZXJTaXplLCBib29sIGRlcHRoUmVhZE9ubHksIGJvb2wgc3RlbmNpbFJlYWRPbmx5LCBDb21tYW5k
RW5jb2RlciYgcmF3UGFyZW50RW5jb2RlciwgaWQ8TVRMQnVmZmVyPiB2aXNpYmlsaXR5UmVzdWx0
QnVmZmVyLCB1aW50NjRfdCBtYXhEcmF3Q291bnQsIERldmljZSYgZGV2aWNlLCBNVExSZW5kZXJQ
YXNzRGVzY3JpcHRvciogbWV0YWxEZXNjcmlwdG9yKQorICAgIDogbV9wYXJhbGxlbFJlbmRlckNv
bW1hbmRFbmNvZGVyKHJlbmRlckNvbW1hbmRFbmNvZGVyKQogICAgICwgbV9kZXZpY2UoZGV2aWNl
KQogICAgICwgbV92aXNpYmlsaXR5UmVzdWx0QnVmZmVyU2l6ZSh2aXNpYmlsaXR5UmVzdWx0QnVm
ZmVyU2l6ZSkKICAgICAsIG1fZGVwdGhSZWFkT25seShkZXB0aFJlYWRPbmx5KQpAQCAtNzksNiAr
NzksMTUgQEAgV1RGX0FMTE9XX1VOU0FGRV9CVUZGRVJfVVNBR0VfRU5ECiAgICAgLCBtX21ldGFs
RGVzY3JpcHRvcihtZXRhbERlc2NyaXB0b3IpCiAgICAgLCBtX21heERyYXdDb3VudChtYXhEcmF3
Q291bnQpCiB7CisgICAgbV92YWxpZGF0aW9uUmVuZGVyQ29tbWFuZEVuY29kZXIgPSBbbV9wYXJh
bGxlbFJlbmRlckNvbW1hbmRFbmNvZGVyIHJlbmRlckNvbW1hbmRFbmNvZGVyXTsKKyAgICBpZiAo
aWQ8TVRMUmVuZGVyUGlwZWxpbmVTdGF0ZT4gcHNvID0gZGV2aWNlLm5vcFBpcGVsaW5lKCkpIHsK
KyAgICAgICAgW21fdmFsaWRhdGlvblJlbmRlckNvbW1hbmRFbmNvZGVyIHNldFJlbmRlclBpcGVs
aW5lU3RhdGU6cHNvXTsKKyAgICAgICAgW21fdmFsaWRhdGlvblJlbmRlckNvbW1hbmRFbmNvZGVy
IGRyYXdQcmltaXRpdmVzOk1UTFByaW1pdGl2ZVR5cGVQb2ludCB2ZXJ0ZXhTdGFydDowIHZlcnRl
eENvdW50OjFdOworICAgIH0KKworICAgIG1fcmVuZGVyQ29tbWFuZEVuY29kZXIgPSBbbV9wYXJh
bGxlbFJlbmRlckNvbW1hbmRFbmNvZGVyIHJlbmRlckNvbW1hbmRFbmNvZGVyXTsKKyAgICByYXdQ
YXJlbnRFbmNvZGVyLnNldEV4aXN0aW5nRW5jb2RlcihtX3BhcmFsbGVsUmVuZGVyQ29tbWFuZEVu
Y29kZXIsIG1fdmFsaWRhdGlvblJlbmRlckNvbW1hbmRFbmNvZGVyLCBtX3JlbmRlckNvbW1hbmRF
bmNvZGVyKTsKKwogICAgIGlmIChtX2RldmljZS0+YmFzZUNhcGFiaWxpdGllcygpLm1lbW9yeUJh
cnJpZXJMaW1pdCA+IG1heERyYXdDb3VudCkKICAgICAgICAgbV9tZXRhbERlc2NyaXB0b3IgPSBu
aWw7CiAKQEAgLTE4NSw5ICsxOTQsMTEgQEAgUmVuZGVyUGFzc0VuY29kZXI6OlJlbmRlclBhc3NF
bmNvZGVyKENvbW1hbmRFbmNvZGVyJiBwYXJlbnRFbmNvZGVyLCBEZXZpY2UmIGRldmkKIAogUmVu
ZGVyUGFzc0VuY29kZXI6On5SZW5kZXJQYXNzRW5jb2RlcigpCiB7Ci0gICAgaWYgKG1fcmVuZGVy
Q29tbWFuZEVuY29kZXIpCisgICAgaWYgKG1fcGFyYWxsZWxSZW5kZXJDb21tYW5kRW5jb2RlcikK
ICAgICAgICAgUmVmIHsgbV9wYXJlbnRFbmNvZGVyIH0tPm1ha2VJbnZhbGlkKEAiR1BVUmVuZGVy
UGFzc0VuY29kZXIuZmluaXNoIHdhcyBuZXZlciBjYWxsZWQiKTsKIAorICAgIG1fcGFyYWxsZWxS
ZW5kZXJDb21tYW5kRW5jb2RlciA9IG5pbDsKKyAgICBtX3ZhbGlkYXRpb25SZW5kZXJDb21tYW5k
RW5jb2RlciA9IG5pbDsKICAgICBtX3JlbmRlckNvbW1hbmRFbmNvZGVyID0gbmlsOwogfQogCkBA
IC02OTgsNyArNzA5LDggQEAgc3RkOjpwYWlyPHVpbnQzMl90LCB1aW50MzJfdD4gUmVuZGVyUGFz
c0VuY29kZXI6OmNvbXB1dGVNaW5pbnVtVmVydGV4SW5zdGFuY2VDb3UKIHZvaWQgUmVuZGVyUGFz
c0VuY29kZXI6OmVtaXRNZW1vcnlCYXJyaWVyKGlkPE1UTFJlbmRlckNvbW1hbmRFbmNvZGVyPiBy
ZW5kZXJDb21tYW5kRW5jb2RlcikKIHsKICAgICArK21fbWVtb3J5QmFycmllckNvdW50OwotICAg
IFtyZW5kZXJDb21tYW5kRW5jb2RlciBtZW1vcnlCYXJyaWVyV2l0aFNjb3BlOk1UTEJhcnJpZXJT
Y29wZUJ1ZmZlcnMgYWZ0ZXJTdGFnZXM6TVRMUmVuZGVyU3RhZ2VWZXJ0ZXggYmVmb3JlU3RhZ2Vz
Ok1UTFJlbmRlclN0YWdlVmVydGV4XTsKKyAgICBpZiAobV9kZXZpY2UtPmJhc2VDYXBhYmlsaXRp
ZXMoKS5tZW1vcnlCYXJyaWVyTGltaXQpCisgICAgICAgIFtyZW5kZXJDb21tYW5kRW5jb2RlciBt
ZW1vcnlCYXJyaWVyV2l0aFNjb3BlOk1UTEJhcnJpZXJTY29wZUJ1ZmZlcnMgYWZ0ZXJTdGFnZXM6
TVRMUmVuZGVyU3RhZ2VWZXJ0ZXggYmVmb3JlU3RhZ2VzOk1UTFJlbmRlclN0YWdlVmVydGV4XTsK
IH0KIAogc3RkOjpwYWlyPFJlbmRlclBhc3NFbmNvZGVyOjpJbmRleENhbGwsIGlkPE1UTEJ1ZmZl
cj4+IFJlbmRlclBhc3NFbmNvZGVyOjpjbGFtcEluZGV4QnVmZmVyVG9WYWxpZFZhbHVlcyh1aW50
MzJfdCBpbmRleENvdW50LCB1aW50MzJfdCBpbnN0YW5jZUNvdW50LCBpbnQzMl90IGJhc2VWZXJ0
ZXgsIHVpbnQzMl90IGZpcnN0SW5zdGFuY2UsIE1UTEluZGV4VHlwZSBpbmRleFR5cGUsIE5TVUlu
dGVnZXIgaW5kZXhCdWZmZXJPZmZzZXRJbkJ5dGVzLCBCdWZmZXIqIGFwaUluZGV4QnVmZmVyLCB1
aW50MzJfdCBtaW5WZXJ0ZXhDb3VudCwgdWludDMyX3QgbWluSW5zdGFuY2VDb3VudCwgUmVuZGVy
UGFzc0VuY29kZXImIGVuY29kZXIsIERldmljZSYgZGV2aWNlLCB1aW50MzJfdCByYXN0ZXJTYW1w
bGVDb3VudCwgTVRMUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlKQpAQCAtNzQzLDcgKzc1NSw3
IEBAIHN0ZDo6cGFpcjxSZW5kZXJQYXNzRW5jb2Rlcjo6SW5kZXhDYWxsLCBpZDxNVExCdWZmZXI+
PiBSZW5kZXJQYXNzRW5jb2Rlcjo6Y2xhbXBJCiAgICAgICAgIC5sb3N0T3JPT0JSZWFkID0gMHUK
ICAgICB9OwogCi0gICAgaWQ8TVRMUmVuZGVyQ29tbWFuZEVuY29kZXI+IHJlbmRlckNvbW1hbmRF
bmNvZGVyID0gZW5jb2Rlci5yZW5kZXJDb21tYW5kRW5jb2RlcigpOworICAgIGlkPE1UTFJlbmRl
ckNvbW1hbmRFbmNvZGVyPiByZW5kZXJDb21tYW5kRW5jb2RlciA9IGVuY29kZXIudmFsaWRhdGlv
blJlbmRlckNvbW1hbmRFbmNvZGVyKCk7CiAgICAgaWQ8TVRMQnVmZmVyPiBpbmRleGVkSW5kaXJl
Y3RCdWZmZXIgPSBkZXZpY2Uuc2FmZUNyZWF0ZUJ1ZmZlcldpdGhEYXRhKGluZGlyZWN0QXJndW1l
bnRzKTsKICAgICBDSEVDS0VEX1NFVF9QU08ocmVuZGVyQ29tbWFuZEVuY29kZXIsIGRldmljZS5p
bmRleEJ1ZmZlckNsYW1wUGlwZWxpbmUoaW5kZXhUeXBlLCByYXN0ZXJTYW1wbGVDb3VudCksIHN0
ZDo6bWFrZV9wYWlyKEluZGV4Q2FsbDo6U2tpcCwgbmlsKSk7CiAgICAgW3JlbmRlckNvbW1hbmRF
bmNvZGVyIHNldFZlcnRleEJ1ZmZlcjppbmRleEJ1ZmZlciBvZmZzZXQ6aW5kZXhCdWZmZXJPZmZz
ZXRJbkJ5dGVzIGF0SW5kZXg6MF07CkBAIC04MDAsNiArODEyLDExIEBAIHN0YXRpYyB2b2lkIGNo
ZWNrRm9ySW5kaXJlY3REcmF3RGV2aWNlTG9zdChEZXZpY2UgJmRldmljZSwgUmVuZGVyUGFzc0Vu
Y29kZXIgJmVuCiAgICAgfV07CiB9CiAKK2lkPE1UTFJlbmRlckNvbW1hbmRFbmNvZGVyPiBSZW5k
ZXJQYXNzRW5jb2Rlcjo6dmFsaWRhdGlvblJlbmRlckNvbW1hbmRFbmNvZGVyKCkKK3sKKyAgICBy
ZXR1cm4gbV92YWxpZGF0aW9uUmVuZGVyQ29tbWFuZEVuY29kZXI7Cit9CisKIHN0ZDo6cGFpcjxp
ZDxNVExCdWZmZXI+LCB1aW50NjRfdD4gUmVuZGVyUGFzc0VuY29kZXI6OmNsYW1wSW5kaXJlY3RJ
bmRleEJ1ZmZlclRvVmFsaWRWYWx1ZXMoQnVmZmVyKiBhcGlJbmRleEJ1ZmZlciwgQnVmZmVyJiBp
bmRleGVkSW5kaXJlY3RCdWZmZXIsIE1UTEluZGV4VHlwZSBpbmRleFR5cGUsIE5TVUludGVnZXIg
aW5kZXhCdWZmZXJPZmZzZXRJbkJ5dGVzLCB1aW50NjRfdCBpbmRpcmVjdE9mZnNldCwgdWludDMy
X3QgbWluVmVydGV4Q291bnQsIHVpbnQzMl90IG1pbkluc3RhbmNlQ291bnQsIE1UTFByaW1pdGl2
ZVR5cGUgcHJpbWl0aXZlVHlwZSwgRGV2aWNlJiBkZXZpY2UsIHVpbnQzMl90IHJhc3RlclNhbXBs
ZUNvdW50LCBSZW5kZXJQYXNzRW5jb2RlciYgZW5jb2RlciwgYm9vbCYgc3BsaXRFbmNvZGVyKQog
ewogICAgIGlmIChtaW5WZXJ0ZXhDb3VudCA9PSBSZW5kZXJCdW5kbGVFbmNvZGVyOjppbnZhbGlk
VmVydGV4SW5zdGFuY2VDb3VudCAmJiBtaW5JbnN0YW5jZUNvdW50ID09IFJlbmRlckJ1bmRsZUVu
Y29kZXI6OmludmFsaWRWZXJ0ZXhJbnN0YW5jZUNvdW50KQpAQCAtODIwLDExICs4MzcsMTIgQEAg
c3RkOjpwYWlyPGlkPE1UTEJ1ZmZlcj4sIHVpbnQ2NF90PiBSZW5kZXJQYXNzRW5jb2Rlcjo6Y2xh
bXBJbmRpcmVjdEluZGV4QnVmZmVyVG8KICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGlu
ZGV4ZWRJbmRpcmVjdEJ1ZmZlci5pbmRpcmVjdEluZGV4ZWRCdWZmZXIoKSwgMHVsbCk7CiAgICAg
fQogCi0gICAgaWQ8TVRMUmVuZGVyQ29tbWFuZEVuY29kZXI+IHJlbmRlckNvbW1hbmRFbmNvZGVy
ID0gZW5jb2Rlci5yZW5kZXJDb21tYW5kRW5jb2RlcigpOworICAgIGlkPE1UTEJ1ZmZlcj4gaW5k
aXJlY3RJbmRleGVkQnVmZmVyID0gZGV2aWNlLnNhZmVDcmVhdGVCdWZmZXIoc2l6ZW9mKFdlYktp
dE1UTERyYXdJbmRleGVkUHJpbWl0aXZlc0luZGlyZWN0QXJndW1lbnRzKSwgTVRMU3RvcmFnZU1v
ZGVTaGFyZWQpOworICAgIGlkPE1UTFJlbmRlckNvbW1hbmRFbmNvZGVyPiByZW5kZXJDb21tYW5k
RW5jb2RlciA9IGVuY29kZXIudmFsaWRhdGlvblJlbmRlckNvbW1hbmRFbmNvZGVyKCk7CiAgICAg
Q0hFQ0tFRF9TRVRfUFNPKHJlbmRlckNvbW1hbmRFbmNvZGVyLCBkZXZpY2UuaW5kZXhlZEluZGly
ZWN0QnVmZmVyQ2xhbXBQaXBlbGluZShyYXN0ZXJTYW1wbGVDb3VudCksIHN0ZDo6bWFrZV9wYWly
KG5pbCwgMHVsbCkpOwogICAgIHVpbnQzMl90IGluZGV4QnVmZmVyQ291bnQgPSBzdGF0aWNfY2Fz
dDx1aW50MzJfdD4oKGluZGV4QnVmZmVyLmxlbmd0aCAtIGluZGV4QnVmZmVyT2Zmc2V0SW5CeXRl
cykgLyBpbmRleFNpemUpOwogICAgIFtyZW5kZXJDb21tYW5kRW5jb2RlciBzZXRWZXJ0ZXhCdWZm
ZXI6aW5kZXhlZEluZGlyZWN0QnVmZmVyLmJ1ZmZlcigpIG9mZnNldDppbmRpcmVjdE9mZnNldCBh
dEluZGV4OjBdOwotICAgIFtyZW5kZXJDb21tYW5kRW5jb2RlciBzZXRWZXJ0ZXhCdWZmZXI6aW5k
ZXhlZEluZGlyZWN0QnVmZmVyLmluZGlyZWN0SW5kZXhlZEJ1ZmZlcigpIG9mZnNldDowIGF0SW5k
ZXg6MV07CisgICAgW3JlbmRlckNvbW1hbmRFbmNvZGVyIHNldFZlcnRleEJ1ZmZlcjppbmRpcmVj
dEluZGV4ZWRCdWZmZXIgb2Zmc2V0OjAgYXRJbmRleDoxXTsKICAgICBbcmVuZGVyQ29tbWFuZEVu
Y29kZXIgc2V0VmVydGV4QnVmZmVyOmluZGlyZWN0QnVmZmVyIG9mZnNldDowIGF0SW5kZXg6Ml07
CiAgICAgdWludDMyX3QgaW5kaXJlY3REYXRhW10gPSB7IGluZGV4QnVmZmVyQ291bnQsIG1pbklu
c3RhbmNlQ291bnQgfTsKICAgICBbcmVuZGVyQ29tbWFuZEVuY29kZXIgc2V0VmVydGV4Qnl0ZXM6
aW5kaXJlY3REYXRhIGxlbmd0aDpzaXplb2YoaW5kaXJlY3REYXRhKSBhdEluZGV4OjNdOwpAQCAt
ODQzLDcgKzg2MSw3IEBAIHN0ZDo6cGFpcjxpZDxNVExCdWZmZXI+LCB1aW50NjRfdD4gUmVuZGVy
UGFzc0VuY29kZXI6OmNsYW1wSW5kaXJlY3RJbmRleEJ1ZmZlclRvCiAgICAgaW5kZXhlZEluZGly
ZWN0QnVmZmVyLmluZGlyZWN0SW5kZXhlZEJ1ZmZlclJlY29tcHV0ZWQoaW5kZXhUeXBlLCBpbmRl
eEJ1ZmZlck9mZnNldEluQnl0ZXMsIGluZGlyZWN0T2Zmc2V0LCBtaW5WZXJ0ZXhDb3VudCwgbWlu
SW5zdGFuY2VDb3VudCk7CiAgICAgY2hlY2tGb3JJbmRpcmVjdERyYXdEZXZpY2VMb3N0KGRldmlj
ZSwgZW5jb2RlciwgaW5kaXJlY3RCdWZmZXIpOwogCi0gICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWly
KGluZGV4ZWRJbmRpcmVjdEJ1ZmZlci5pbmRpcmVjdEluZGV4ZWRCdWZmZXIoKSwgMHVsbCk7Cisg
ICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGluZGlyZWN0SW5kZXhlZEJ1ZmZlciwgMHVsbCk7CiB9
CiAKIHN0ZDo6cGFpcjxpZDxNVExCdWZmZXI+LCB1aW50NjRfdD4gUmVuZGVyUGFzc0VuY29kZXI6
OmNsYW1wSW5kaXJlY3RJbmRleEJ1ZmZlclRvVmFsaWRWYWx1ZXMoQnVmZmVyJiBpbmRleGVkSW5k
aXJlY3RCdWZmZXIsIE1UTEluZGV4VHlwZSBpbmRleFR5cGUsIE5TVUludGVnZXIgaW5kZXhCdWZm
ZXJPZmZzZXRJbkJ5dGVzLCB1aW50NjRfdCBpbmRpcmVjdE9mZnNldCwgdWludDMyX3QgbWluVmVy
dGV4Q291bnQsIHVpbnQzMl90IG1pbkluc3RhbmNlQ291bnQsIGJvb2wmIHNwbGl0RW5jb2RlcikK
QEAgLTg2NCw3ICs4ODIsNyBAQCBzdGQ6OnBhaXI8aWQ8TVRMQnVmZmVyPiwgdWludDY0X3Q+IFJl
bmRlclBhc3NFbmNvZGVyOjpjbGFtcEluZGlyZWN0QnVmZmVyVG9WYWxpZAogICAgICAgICByZXR1
cm4gc3RkOjptYWtlX3BhaXIoaW5kaXJlY3RCdWZmZXIuaW5kaXJlY3RCdWZmZXIoKSwgMHVsbCk7
CiAgICAgfQogCi0gICAgaWQ8TVRMUmVuZGVyQ29tbWFuZEVuY29kZXI+IHJlbmRlckNvbW1hbmRF
bmNvZGVyID0gZW5jb2Rlci5yZW5kZXJDb21tYW5kRW5jb2RlcigpOworICAgIGlkPE1UTFJlbmRl
ckNvbW1hbmRFbmNvZGVyPiByZW5kZXJDb21tYW5kRW5jb2RlciA9IGVuY29kZXIudmFsaWRhdGlv
blJlbmRlckNvbW1hbmRFbmNvZGVyKCk7CiAgICAgaWQ8TVRMUmVuZGVyUGlwZWxpbmVTdGF0ZT4g
cmVuZGVyUGlwZWxpbmVTdGF0ZSA9IGRldmljZS5pbmRpcmVjdEJ1ZmZlckNsYW1wUGlwZWxpbmUo
cmFzdGVyU2FtcGxlQ291bnQpOwogICAgIENIRUNLRURfU0VUX1BTTyhyZW5kZXJDb21tYW5kRW5j
b2RlciwgcmVuZGVyUGlwZWxpbmVTdGF0ZSwgc3RkOjptYWtlX3BhaXIobmlsLCAwdWxsKSk7CiAg
ICAgW3JlbmRlckNvbW1hbmRFbmNvZGVyIHNldFZlcnRleEJ1ZmZlcjppbmRpcmVjdEJ1ZmZlci5i
dWZmZXIoKSBvZmZzZXQ6aW5kaXJlY3RPZmZzZXQgYXRJbmRleDowXTsKQEAgLTEwMDQsNDUgKzEw
MjIsMjYgQEAgdm9pZCBSZW5kZXJQYXNzRW5jb2Rlcjo6ZHJhd0luZGV4ZWRJbmRpcmVjdChCdWZm
ZXImIGluZGlyZWN0QnVmZmVyLCB1aW50NjRfdCBpbmQKICAgICBbcmVuZGVyQ29tbWFuZEVuY29k
ZXIoKSBkcmF3SW5kZXhlZFByaW1pdGl2ZXM6bV9wcmltaXRpdmVUeXBlIGluZGV4VHlwZTptX2lu
ZGV4VHlwZSBpbmRleEJ1ZmZlcjppbmRleEJ1ZmZlciBpbmRleEJ1ZmZlck9mZnNldDptX2luZGV4
QnVmZmVyT2Zmc2V0IGluZGlyZWN0QnVmZmVyOm10bEluZGlyZWN0QnVmZmVyIGluZGlyZWN0QnVm
ZmVyT2Zmc2V0Om1vZGlmaWVkSW5kaXJlY3RPZmZzZXRdOwogfQogCit2b2lkIFJlbmRlclBhc3NF
bmNvZGVyOjplbmRFbmNvZGluZygpCit7CisgICAgUmVmIHBhcmVudEVuY29kZXIgPSBtX3BhcmVu
dEVuY29kZXI7CisgICAgcGFyZW50RW5jb2Rlci0+ZW5kRW5jb2RpbmcobV9wYXJhbGxlbFJlbmRl
ckNvbW1hbmRFbmNvZGVyKTsKKyAgICBtX3BhcmFsbGVsUmVuZGVyQ29tbWFuZEVuY29kZXIgPSBu
aWw7CisgICAgbV9yZW5kZXJDb21tYW5kRW5jb2RlciA9IG5pbDsKKyAgICBtX3ZhbGlkYXRpb25S
ZW5kZXJDb21tYW5kRW5jb2RlciA9IG5pbDsKK30KKwogYm9vbCBSZW5kZXJQYXNzRW5jb2Rlcjo6
c3BsaXRSZW5kZXJQYXNzKCkKIHsKLSAgICBpZiAobV9tZW1vcnlCYXJyaWVyQ291bnQgPCBtX2Rl
dmljZS0+YmFzZUNhcGFiaWxpdGllcygpLm1lbW9yeUJhcnJpZXJMaW1pdCB8fCAhbV9yZW5kZXJD
b21tYW5kRW5jb2RlcikKKyAgICBpZiAobV9tZW1vcnlCYXJyaWVyQ291bnQgPCBtX2RldmljZS0+
YmFzZUNhcGFiaWxpdGllcygpLm1lbW9yeUJhcnJpZXJMaW1pdCB8fCAhbV92YWxpZGF0aW9uUmVu
ZGVyQ29tbWFuZEVuY29kZXIgfHwgIW1fcmVuZGVyQ29tbWFuZEVuY29kZXIpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKIAotICAgIG1fbWVtb3J5QmFycmllckNvdW50ID0gMDsKLSNpZm5kZWYgTkRF
QlVHCi0jaWYgQ1BVKEFSTTY0KQotICAgIFdURkxvZ0Fsd2F5cygiV2ViR1BVOiBTcGxpdHRpbmcg
cmVuZGVyIHBhc3Mgb24gQVJNNjQgLSBzZXZlcmUgcGVyZm9ybWFuY2UgcGVuYWx0eSIpOyAvLyBO
T0xJTlQKLSNlbmRpZgotI2VuZGlmCi0gICAgUmVmIHBhcmVudEVuY29kZXIgPSBtX3BhcmVudEVu
Y29kZXI7CiAgICAgaWQ8TVRMRmVuY2U+IGZlbmNlID0gW21fZGV2aWNlLT5kZXZpY2UoKSBuZXdG
ZW5jZV07Ci0gICAgW21fcmVuZGVyQ29tbWFuZEVuY29kZXIgdXBkYXRlRmVuY2U6ZmVuY2UgYWZ0
ZXJTdGFnZXM6TVRMUmVuZGVyU3RhZ2VWZXJ0ZXhdOwotICAgIHBhcmVudEVuY29kZXItPmVuZEVu
Y29kaW5nKG1fcmVuZGVyQ29tbWFuZEVuY29kZXIpOwotICAgIGlmIChpc3N1ZWREcmF3Q2FsbCgp
KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9kZXNjcmlwdG9yQ29sb3JBdHRh
Y2htZW50cy5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIG1fbWV0YWxEZXNjcmlwdG9yLmNvbG9y
QXR0YWNobWVudHNbaV0ubG9hZEFjdGlvbiA9IE1UTExvYWRBY3Rpb25Mb2FkOwotCi0gICAgICAg
IG1fbWV0YWxEZXNjcmlwdG9yLmRlcHRoQXR0YWNobWVudC5sb2FkQWN0aW9uID0gTVRMTG9hZEFj
dGlvbkxvYWQ7Ci0gICAgICAgIG1fbWV0YWxEZXNjcmlwdG9yLnN0ZW5jaWxBdHRhY2htZW50Lmxv
YWRBY3Rpb24gPSBNVExMb2FkQWN0aW9uTG9hZDsKLSAgICB9Ci0gICAgbV9wcmlvclZlcnRleER5
bmFtaWNPZmZzZXRzLmNsZWFyKCk7Ci0gICAgbV9wcmlvckZyYWdtZW50RHluYW1pY09mZnNldHMu
Y2xlYXIoKTsKLQotICAgIG1fcmVuZGVyQ29tbWFuZEVuY29kZXIgPSBbcGFyZW50RW5jb2Rlci0+
Y29tbWFuZEJ1ZmZlcigpIHJlbmRlckNvbW1hbmRFbmNvZGVyV2l0aERlc2NyaXB0b3I6bV9tZXRh
bERlc2NyaXB0b3JdOworICAgIFttX3ZhbGlkYXRpb25SZW5kZXJDb21tYW5kRW5jb2RlciB1cGRh
dGVGZW5jZTpmZW5jZSBhZnRlclN0YWdlczpNVExSZW5kZXJTdGFnZVZlcnRleF07CisgICAgW21f
dmFsaWRhdGlvblJlbmRlckNvbW1hbmRFbmNvZGVyIAogICAgIFttX3JlbmRlckNvbW1hbmRFbmNv
ZGVyIHdhaXRGb3JGZW5jZTpmZW5jZSBiZWZvcmVTdGFnZXM6TVRMUmVuZGVyU3RhZ2VWZXJ0ZXhd
OwotICAgIHBhcmVudEVuY29kZXItPnNldEV4aXN0aW5nRW5jb2RlcihtX3JlbmRlckNvbW1hbmRF
bmNvZGVyKTsKLSAgICBbbV9yZW5kZXJDb21tYW5kRW5jb2RlciBzZXRWaWV3cG9ydDogeyBtX3Zp
ZXdwb3J0WCwgbV92aWV3cG9ydFksIG1fdmlld3BvcnRXaWR0aCwgbV92aWV3cG9ydEhlaWdodCwg
bV9taW5EZXB0aCwgbV9tYXhEZXB0aCB9IF07Ci0gICAgaWYgKG1fYmxlbmRDb2xvcikKLSAgICAg
ICAgW21fcmVuZGVyQ29tbWFuZEVuY29kZXIgc2V0QmxlbmRDb2xvclJlZDptX2JsZW5kQ29sb3It
PnIgZ3JlZW46bV9ibGVuZENvbG9yLT5nIGJsdWU6bV9ibGVuZENvbG9yLT5iIGFscGhhOm1fYmxl
bmRDb2xvci0+YV07Ci0gICAgaWYgKG1fc3RlbmNpbFJlZmVyZW5jZVZhbHVlKQotICAgICAgICBb
bV9yZW5kZXJDb21tYW5kRW5jb2RlciBzZXRTdGVuY2lsUmVmZXJlbmNlVmFsdWU6Km1fc3RlbmNp
bFJlZmVyZW5jZVZhbHVlXTsKLSAgICBpZiAobV9zY2lzc29yUmVjdCkKLSAgICAgICAgW21fcmVu
ZGVyQ29tbWFuZEVuY29kZXIgc2V0U2Npc3NvclJlY3Q6Km1fc2Npc3NvclJlY3RdOwotICAgIGlm
IChSZWZQdHIgcGlwZWxpbmUgPSBtX3BpcGVsaW5lKQotICAgICAgICBzZXRQaXBlbGluZSgqcGlw
ZWxpbmUpOwogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lk
IFJlbmRlclBhc3NFbmNvZGVyOjpkcmF3SW5kaXJlY3QoQnVmZmVyJiBpbmRpcmVjdEJ1ZmZlciwg
dWludDY0X3QgaW5kaXJlY3RPZmZzZXQpCkBAIC0xMDkzLDI0ICsxMDkyLDE5IEBAIHZvaWQgUmVu
ZGVyUGFzc0VuY29kZXI6OmVuZFBhc3MoKQogCiAgICAgYXV0byBwYXNzSXNWYWxpZCA9IGlzVmFs
aWQoKTsKICAgICBpZiAobV9kZWJ1Z0dyb3VwU3RhY2tTaXplIHx8IG1fb2NjbHVzaW9uUXVlcnlB
Y3RpdmUgfHwgIXBhc3NJc1ZhbGlkKSB7Ci0gICAgICAgIHBhcmVudEVuY29kZXItPmVuZEVuY29k
aW5nKG1fcmVuZGVyQ29tbWFuZEVuY29kZXIpOwotICAgICAgICBtX3JlbmRlckNvbW1hbmRFbmNv
ZGVyID0gbmlsOworICAgICAgICBlbmRFbmNvZGluZygpOwogICAgICAgICBwYXJlbnRFbmNvZGVy
LT5tYWtlSW52YWxpZChbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIlJlbmRlclBhc3NFbmNv
ZGVyLmVuZFBhc3MgZmFpbHVyZSwgbV9kZWJ1Z0dyb3VwU3RhY2tTaXplID0gJWxsdSwgbV9vY2Ns
dXNpb25RdWVyeUFjdGl2ZSA9ICVkLCBpc1ZhbGlkID0gJWQsIGVycm9yID0gJUAiLCBtX2RlYnVn
R3JvdXBTdGFja1NpemUsIG1fb2NjbHVzaW9uUXVlcnlBY3RpdmUsIHBhc3NJc1ZhbGlkLCBtX2xh
c3RFcnJvclN0cmluZ10pOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYXV0byBlbmRF
bmNvZGVyID0gXnsKLSAgICAgICAgcGFyZW50RW5jb2Rlci0+ZW5kRW5jb2RpbmcobV9yZW5kZXJD
b21tYW5kRW5jb2Rlcik7Ci0gICAgfTsKICAgICBib29sIGhhc1RleHR1cmVzVG9DbGVhciA9IG1f
YXR0YWNobWVudHNUb0NsZWFyLmNvdW50IHx8IChtX2RlcHRoU3RlbmNpbEF0dGFjaG1lbnRUb0Ns
ZWFyICYmIChtX2NsZWFyRGVwdGhBdHRhY2htZW50IHx8IG1fY2xlYXJTdGVuY2lsQXR0YWNobWVu
dCkpOwogCiAgICAgaWYgKGhhc1RleHR1cmVzVG9DbGVhcikgewotICAgICAgICBlbmRFbmNvZGVy
KCk7CisgICAgICAgIGVuZEVuY29kaW5nKCk7CiAgICAgICAgIHBhcmVudEVuY29kZXItPnJ1bkNs
ZWFyRW5jb2RlcihtX2F0dGFjaG1lbnRzVG9DbGVhciwgbV9kZXB0aFN0ZW5jaWxBdHRhY2htZW50
VG9DbGVhciwgbV9jbGVhckRlcHRoQXR0YWNobWVudCwgbV9jbGVhclN0ZW5jaWxBdHRhY2htZW50
LCBtX2RlcHRoQ2xlYXJWYWx1ZSwgbV9zdGVuY2lsQ2xlYXJWYWx1ZSwgbmlsKTsKICAgICB9IGVs
c2UKLSAgICAgICAgZW5kRW5jb2RlcigpOworICAgICAgICBlbmRFbmNvZGluZygpOwogCi0gICAg
bV9yZW5kZXJDb21tYW5kRW5jb2RlciA9IG5pbDsKICAgICBwYXJlbnRFbmNvZGVyLT5sb2NrKGZh
bHNlKTsKIAogICAgIGlmIChtX3F1ZXJ5QnVmZmVySW5kaWNlc1RvQ2xlYXIuc2l6ZSgpICYmICFv
Y2NsdXNpb25RdWVyeUlzRGVzdHJveWVkKCkpIHsKQEAgLTEzMDksMTMgKzEzMDMsMTUgQEAgdm9p
ZCBSZW5kZXJQYXNzRW5jb2Rlcjo6bWFrZUludmFsaWQoTlNTdHJpbmcqIGVycm9yU3RyaW5nKQog
CiAgICAgUmVmIHBhcmVudEVuY29kZXIgPSBtX3BhcmVudEVuY29kZXI7CiAKLSAgICBpZiAoIW1f
cmVuZGVyQ29tbWFuZEVuY29kZXIpIHsKKyAgICBpZiAoIW1fcGFyYWxsZWxSZW5kZXJDb21tYW5k
RW5jb2RlcikgewogICAgICAgICBwYXJlbnRFbmNvZGVyLT5tYWtlSW52YWxpZChbTlNTdHJpbmcg
c3RyaW5nV2l0aEZvcm1hdDpAIlJlbmRlclBhc3NFbmNvZGVyLm1ha2VJbnZhbGlkLCByYXNvbiA9
ICVAIiwgZXJyb3JTdHJpbmddKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHBhcmVu
dEVuY29kZXItPnNldExhc3RFcnJvcihlcnJvclN0cmluZyk7Ci0gICAgcGFyZW50RW5jb2Rlci0+
ZW5kRW5jb2RpbmcobV9yZW5kZXJDb21tYW5kRW5jb2Rlcik7CisgICAgZW5kRW5jb2RpbmcoKTsK
KyAgICBtX3BhcmFsbGVsUmVuZGVyQ29tbWFuZEVuY29kZXIgPSBuaWw7CisgICAgbV92YWxpZGF0
aW9uUmVuZGVyQ29tbWFuZEVuY29kZXIgPSBuaWw7CiAgICAgbV9yZW5kZXJDb21tYW5kRW5jb2Rl
ciA9IG5pbDsKIH0KIApAQCAtMTU1MSw2ICsxNTQ3LDggQEAgdm9pZCBSZW5kZXJQYXNzRW5jb2Rl
cjo6c2V0Vmlld3BvcnQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdo
dCwKIAogdm9pZCBSZW5kZXJQYXNzRW5jb2Rlcjo6c2V0TGFiZWwoU3RyaW5nJiYgbGFiZWwpCiB7
CisgICAgbV9wYXJhbGxlbFJlbmRlckNvbW1hbmRFbmNvZGVyLmxhYmVsID0gbGFiZWw7CisgICAg
bV92YWxpZGF0aW9uUmVuZGVyQ29tbWFuZEVuY29kZXIubGFiZWwgPSBsYWJlbDsKICAgICBtX3Jl
bmRlckNvbW1hbmRFbmNvZGVyLmxhYmVsID0gbGFiZWw7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJHUFUvV2ViR1BVL1NoYWRlck1vZHVsZS5tbSBiL1NvdXJjZS9XZWJHUFUvV2ViR1BVL1No
YWRlck1vZHVsZS5tbQppbmRleCA1NmM3MTQ3OGYyMDYuLmJjMWZlZTk0YWY5OCAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkdQVS9XZWJHUFUvU2hhZGVyTW9kdWxlLm1tCisrKyBiL1NvdXJjZS9XZWJH
UFUvV2ViR1BVL1NoYWRlck1vZHVsZS5tbQpAQCAtNzMsMTAgKzczLDI4IEBAIHN0YXRpYyBzdGQ6
Om9wdGlvbmFsPFNoYWRlck1vZHVsZVBhcmFtZXRlcnM+IGZpbmRTaGFkZXJNb2R1bGVQYXJhbWV0
ZXJzKGNvbnN0IFdHCiAgICAgcmV0dXJuIHsgeyAqd2dzbCwgaGludHMgfSB9OwogfQogCitzdGF0
aWMgTlNTdHJpbmcqIGFwcGxlR1BVRmFtaWx5VG9TdHJpbmcoaWQ8TVRMRGV2aWNlPiBkZXZpY2Up
Cit7CisgICAgaWYgKFtkZXZpY2Ugc3VwcG9ydHNGYW1pbHk6TVRMR1BVRmFtaWx5QXBwbGU5XSkK
KyAgICAgICAgcmV0dXJuIEAiOSI7CisgICAgaWYgKFtkZXZpY2Ugc3VwcG9ydHNGYW1pbHk6TVRM
R1BVRmFtaWx5QXBwbGU4XSkKKyAgICAgICAgcmV0dXJuIEAiOCI7CisgICAgaWYgKFtkZXZpY2Ug
c3VwcG9ydHNGYW1pbHk6TVRMR1BVRmFtaWx5QXBwbGU3XSkKKyAgICAgICAgcmV0dXJuIEAiNyI7
CisgICAgaWYgKFtkZXZpY2Ugc3VwcG9ydHNGYW1pbHk6TVRMR1BVRmFtaWx5QXBwbGU2XSkKKyAg
ICAgICAgcmV0dXJuIEAiNiI7CisgICAgaWYgKFtkZXZpY2Ugc3VwcG9ydHNGYW1pbHk6TVRMR1BV
RmFtaWx5QXBwbGU1XSkKKyAgICAgICAgcmV0dXJuIEAiNSI7CisgICAgaWYgKFtkZXZpY2Ugc3Vw
cG9ydHNGYW1pbHk6TVRMR1BVRmFtaWx5QXBwbGU0XSkKKyAgICAgICAgcmV0dXJuIEAiNCI7Cisg
ICAgcmV0dXJuIEAiMHg3ZkZGZmZGRiI7Cit9CisKIGlkPE1UTExpYnJhcnk+IFNoYWRlck1vZHVs
ZTo6Y3JlYXRlTGlicmFyeShpZDxNVExEZXZpY2U+IGRldmljZSwgY29uc3QgU3RyaW5nJiBtc2ws
IFN0cmluZyYmIGxhYmVsLCBOU0Vycm9yKiogZXJyb3IpCiB7CiAgICAgc3RhdGljIGJvb2wgcmVx
dWlyZVNhZmVNYXRoID0gZmFsc2U7CiAgICAgYXV0byBvcHRpb25zID0gW01UTENvbXBpbGVPcHRp
b25zIG5ld107CisgICAgb3B0aW9ucy5wcmVwcm9jZXNzb3JNYWNyb3MgPSBAeyBAIl9fd2dzbE1l
dGFsQXBwbGVHUFVGYW1pbHkiIDogYXBwbGVHUFVGYW1pbHlUb1N0cmluZyhkZXZpY2UpIH07CiAj
aWYgRU5BQkxFKFdFQkdQVV9CWV9ERUZBVUxUKQogICAgIHN0YXRpYyBhdXRvIG1hdGhNb2RlID0g
TVRMTWF0aE1vZGVSZWxheGVkOwogICAgIHN0YXRpYyBhdXRvIG1hdGhGdW5jdGlvbnMgPSBNVExN
YXRoRmxvYXRpbmdQb2ludEZ1bmN0aW9uc0Zhc3Q7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>