<?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>314618</bug_id>
          
          <creation_ts>2026-05-11 23:43:50 -0700</creation_ts>
          <short_desc>SVG text: character-data mutation on a `&lt;tspan&gt;` triggers O(N) re-measure of all visible siblings</short_desc>
          <delta_ts>2026-05-18 23:44:11 -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>SVG</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=65711</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=19118</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar, Performance</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Karl Dubost">karlcow</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>sabouhallawa</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>2210031</commentid>
    <comment_count>0</comment_count>
      <attachid>479626</attachid>
    <who name="Karl Dubost">karlcow</who>
    <bug_when>2026-05-11 23:43:50 -0700</bug_when>
    <thetext>Created attachment 479626
benchmark

Replacing the text node of a single `&lt;tspan&gt;` inside a `&lt;text&gt;` element forces the renderer to re-measure every visible `RenderSVGInlineText` in the subtree, not just the one whose character data actually changed. Cost grows linearly with the number of visible siblings. Blink and Gecko don&apos;t have this scaling — they&apos;re 3× and 11× faster respectively on the same workload.


Steps to reproduce
Open the attached standalone benchmark in the browser under test, click &quot;Run benchmark&quot;, wait ~30s for the sweep over N visible tspans in {5, 10, 25, 50, 100, 200}. Each iteration is `tspan.replaceChild(newTextNode, oldTextNode)` + a forced layout (`getBoundingClientRect`).

### Measurements (2026-05-12, macOS, same page, same run)

| Engine | ms / tspan (slope) | ms @ N=200 | vs Safari |
| --- | --- | --- | --- |
| Safari (WebKit)  | 0.0281 | 5.75 | 1.0× |
| Chrome (Blink)   | 0.0092 | 1.84 | 3.1× faster |
| Firefox (Gecko)  | 0.0025 | 0.65 | 11.2× faster |

Raw Safari data (median ms/iter across 3 repeats of 80 iterations, 10-iter warmup):

```
visible tspans   median   min     max
 5               0.263    0.263   0.263
 10              0.400    0.400   0.412
 25              0.825    0.813   0.825
 50              1.575    1.525   1.575
100              2.925    2.900   2.938
200              5.750    5.687   5.775
linear fit: 0.0281 ms / tspan + 0.129 ms fixed overhead
```

Linear fit quality is excellent in all three engines — the algorithmic shape (O(N) in visible siblings) is the same everywhere; WebKit&apos;s constant factor is the outlier.


`RenderSVGInlineText::setTextInternal()` calls `RenderSVGText::subtreeTextDidChange()` (`Source/WebCore/rendering/svg/RenderSVGInlineText.cpp:107`), which sets `m_needsPositioningValuesUpdate` and marks the `&lt;text&gt;` renderer for layout. In `RenderSVGText::layout()` (`Source/WebCore/rendering/svg/RenderSVGText.cpp:345-354`) that flag triggers:

```cpp
m_layoutAttributesBuilder.buildLayoutAttributesForForSubtree(*this);
```

which calls `SVGTextMetricsBuilder::walkTree(textRoot, /*stopAtLeaf=*/nullptr, data)` — a full preorder walk that re-measures every `RenderSVGInlineText` in the subtree. The existing `stopAtLeaf` parameter shows the infrastructure for scoped measurement is already in the API, but isn&apos;t plumbed through this path.

The file even carries an explicit FIXME acknowledging the issue at `Source/WebCore/rendering/svg/SVGTextMetricsBuilder.cpp:174`:

&gt; FIXME: This function is called even though width information is not changed at all. `RenderSVGText` / `RenderSVGInlineText` should track the potential changes to width etc. and invoke this function only when it is actually changed.

### History

The 2012 fix for bug 65711 (r104683 – r105143, Niko Zimmermann) introduced the per-renderer `SVGTextLayoutAttributes` architecture and fixed add/remove paths via `subtreeChildWasAdded` / `subtreeChildWillBeRemoved` (only rebuilds prev/current/next). The character-data-change path (`subtreeTextDidChange`) was left on the full-subtree rebuild path. Blink forked post-2012 and has since rewritten SVG text layout on top of LayoutNG, which appears to have addressed this. WebKit still runs on the legacy `SVGTextLayoutEngine` / `SVGTextMetricsBuilder` pipeline.

### Suggested direction (not prescriptive)

When `subtreeTextDidChange(text)` fires, only the passed `RenderSVGInlineText` and its immediate previous/next siblings should need remeasurement (same scope as `subtreeChildWasAdded`). The `stopAtLeaf` plumbing already exists in `SVGTextMetricsBuilder::walkTree`; the question is whether the x/y/dx/dy/rotate list redistribution across the subtree can be made incremental, or whether the character-data-change path can skip that redistribution entirely when the list shapes haven&apos;t changed. Matching Blink&apos;s slope (3× improvement) looks like a reasonable first milestone without needing a ground-up rewrite.


- bug 65711 — the 2011 regression this code path originally fixed; propose closing as RESOLVED FIXED since the original &lt;1 FPS regression is long gone and REOPENED was for a long-dead Qt assertion.
- bug 19118 — general &quot;SVG text perf&quot; umbrella.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2211950</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2026-05-18 23:44:11 -0700</bug_when>
    <thetext>&lt;rdar://problem/177409377&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>479626</attachid>
            <date>2026-05-11 23:43:50 -0700</date>
            <delta_ts>2026-05-11 23:43:50 -0700</delta_ts>
            <desc>benchmark</desc>
            <filename>benchmark.html</filename>
            <type>text/html</type>
            <size>9205</size>
            <attacher name="Karl Dubost">karlcow</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0
Zi04Ij4KPHRpdGxlPlNWRyB0ZXh0IGNoYXJhY3Rlci1kYXRhIG11dGF0aW9uIGJlbmNobWFyayAo
V2ViS2l0IGJ1ZyA2NTcxMSByZXNpZHVhbCk8L3RpdGxlPgo8c3R5bGU+CiAgYm9keSB7IGZvbnQt
ZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIHN5c3RlbS11aSwgc2Fu
cy1zZXJpZjsgbWFyZ2luOiAxNnB4OyBtYXgtd2lkdGg6IDkwMHB4OyB9CiAgaDEgeyBmb250LXNp
emU6IDE4cHg7IG1hcmdpbjogMCAwIDhweDsgfQogIHAgIHsgZm9udC1zaXplOiAxM3B4OyBjb2xv
cjogIzQ0NDsgbWFyZ2luOiA0cHggMDsgfQogIGJ1dHRvbiB7IGZvbnQtc2l6ZTogMTRweDsgcGFk
ZGluZzogNnB4IDEycHg7IGN1cnNvcjogcG9pbnRlcjsgfQogIGJ1dHRvbjpkaXNhYmxlZCB7IGN1
cnNvcjogd2FpdDsgb3BhY2l0eTogMC41OyB9CiAgLmNvbnRyb2xzIHsgbWFyZ2luOiAxMnB4IDA7
IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyB9CiAgI3N0YXR1
cyB7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTJweDsgfQogIHRhYmxlIHsg
Ym9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luLXRvcDogMTJweDsgZm9udC1zaXplOiAx
M3B4OyBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOyB9CiAgdGgsIHRkIHsgYm9y
ZGVyOiAxcHggc29saWQgI2NjYzsgcGFkZGluZzogNHB4IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7
IH0KICB0aCB7IGJhY2tncm91bmQ6ICNmM2YzZjM7IH0KICB0ZDpmaXJzdC1jaGlsZCwgdGg6Zmly
c3QtY2hpbGQgeyB0ZXh0LWFsaWduOiBsZWZ0OyB9CiAgI2NoYXJ0IHsgbWFyZ2luLXRvcDogMTJw
eDsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgfQogICNzY3JhdGNoIHsgcG9zaXRpb246IGFic29s
dXRlOyB0b3A6IC0yMDAwMHB4OyBsZWZ0OiAtMjAwMDBweDsgfQogICNmaXQgeyBmb250LWZhbWls
eTogbW9ub3NwYWNlOyBmb250LXNpemU6IDEzcHg7IG1hcmdpbi10b3A6IDhweDsgfQogIC5lbnYg
eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDExcHg7IGNvbG9yOiAjNjY2OyBt
YXJnaW4tdG9wOiAxNnB4OyB9Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+Cgo8aDE+U1ZHIHRleHQg
Y2hhcmFjdGVyLWRhdGEgbXV0YXRpb24gYmVuY2htYXJrPC9oMT4KPHA+CiAgTWVhc3VyZXMgdGhl
IGNvc3Qgb2YgcmVwbGFjaW5nIG9uZSA8Y29kZT4mbHQ7dHNwYW4mZ3Q7PC9jb2RlPidzIHRleHQg
bm9kZSB3aGlsZQogIHRoZSBzdXJyb3VuZGluZyA8Y29kZT4mbHQ7dGV4dCZndDs8L2NvZGU+IGVs
ZW1lbnQgaGFzIDxlbT5OPC9lbT4gdmlzaWJsZSB0c3BhbgogIHNpYmxpbmdzLiBFYWNoIGl0ZXJh
dGlvbiBkb2VzIDxjb2RlPnJlcGxhY2VDaGlsZDwvY29kZT4gKyBhIGZvcmNlZCBsYXlvdXQKICAo
PGNvZGU+Z2V0Qm91bmRpbmdDbGllbnRSZWN0PC9jb2RlPikuIFRoZSBzbG9wZSA8ZW0+bXMgLyB0
c3BhbjwvZW0+IG1lYXN1cmVzCiAgdGhlIHBlci1zaWJsaW5nIHJlLW1lYXN1cmUgY29zdCDigJQg
dGhlIHJlc2lkdWFsIE8oTikgYmVoYXZpb3VyIGZyb20KICA8YSBocmVmPSJodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU3MTEiPmJ1ZyA2NTcxMTwvYT4uCjwvcD4KCjxk
aXYgY2xhc3M9ImNvbnRyb2xzIj4KICA8YnV0dG9uIGlkPSJydW4iPlJ1biBiZW5jaG1hcms8L2J1
dHRvbj4KICA8c3BhbiBpZD0ic3RhdHVzIj5yZWFkeTwvc3Bhbj4KPC9kaXY+Cgo8ZGl2IGlkPSJy
ZXN1bHRzIj48L2Rpdj4KPGRpdiBpZD0iZml0Ij48L2Rpdj4KPHN2ZyBpZD0iY2hhcnQiIHdpZHRo
PSI4NjAiIGhlaWdodD0iMjgwIiB2aWV3Qm94PSIwIDAgODYwIDI4MCIgc3R5bGU9ImRpc3BsYXk6
bm9uZSI+PC9zdmc+Cgo8ZGl2IGlkPSJzY3JhdGNoIj48L2Rpdj4KPGRpdiBjbGFzcz0iZW52IiBp
ZD0iZW52Ij48L2Rpdj4KCjxzY3JpcHQ+CigoKSA9PiB7CiAgY29uc3QgTlNfU1ZHID0gJ2h0dHA6
Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsKICBjb25zdCBURVhUX1NUUklOR1MgPSBbCiAgICAiSnVz
dG8gZmVybWVudHVtIGlkLiBNYWxlc3VhZGEgZWxlaWZlbmQsIHRvcnRvciBtb2xlc3RpZSwgYSBm
dXNjZSBhIHZlbCBldC4iLAogICAgIlRoZXNpczogTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQs
IGxpZ3VsYSBzdXNwZW5kaXNzZSBudWxsYSBwcmV0aXVtLiIsCiAgICAiQ29uc2VjdGV0dWVyIGFy
Y3UgaXBzdW0gb3JuYXJlIHBlbGxlbnRlc3F1ZSB2ZWhpY3VsYSwgaW4gdmVoaWN1bGEgZGlhbS4i
LAogICAgIldpc2kgbWF0dGlzIGxlbyBzdXNjaXBpdCBuZWMgYW1ldCwgbmlzbCBmZXJtZW50dW0g
dGVtcG9yIGFjIGEuIgogIF07CgogIC8vIENvbmZpZzogdmlzaWJsZSB0c3BhbiBjb3VudHMgdG8g
c3dlZXAuIEhpZGRlbiBjb3VudCBpcyAobWF4IC0gdmlzaWJsZSksIHNvIHRvdGFsCiAgLy8gdHJl
ZSBzaGFwZSBzdGF5cyBjb25zdGFudCB3aGlsZSB2aXNpYmxlLWNvdW50IHZhcmllcyDigJQgdGhp
cyBpc29sYXRlcyB0aGUgY29zdAogIC8vIG9mIHZpc2libGUtc3VidHJlZSByZS1tZWFzdXJlIHZz
LiBwbGFpbiB0cmVlLXdhbGsgb3ZlcmhlYWQuCiAgY29uc3QgVklTSUJMRV9DT1VOVFMgPSBbNSwg
MTAsIDI1LCA1MCwgMTAwLCAyMDBdOwogIGNvbnN0IFRPVEFMX1RTUEFOUyA9IDIwMDsKICBjb25z
dCBXQVJNVVBfSVRFUlMgPSAxMDsKICBjb25zdCBNRUFTVVJFX0lURVJTID0gODA7CiAgY29uc3Qg
UkVQRUFUUyA9IDM7CgogIGNvbnN0IHNjcmF0Y2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn
c2NyYXRjaCcpOwogIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0
YXR1cycpOwogIGNvbnN0IHJlc3VsdHNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1
bHRzJyk7CiAgY29uc3QgZml0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZml0Jyk7CiAg
Y29uc3QgY2hhcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnQnKTsKICBjb25zdCBl
bnZFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbnYnKTsKCiAgZG9jdW1lbnQuZ2V0RWxl
bWVudEJ5SWQoJ2VudicpLnRleHRDb250ZW50ID0KICAgIGBVQTogJHtuYXZpZ2F0b3IudXNlckFn
ZW50fVxuYCArCiAgICBgZGV2aWNlUGl4ZWxSYXRpbzogJHtkZXZpY2VQaXhlbFJhdGlvfSAgIGhh
cmR3YXJlQ29uY3VycmVuY3k6ICR7bmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgPz8gJz8n
fWA7CgogIGZ1bmN0aW9uIGJ1aWxkU2NlbmUodmlzaWJsZSkgewogICAgc2NyYXRjaC50ZXh0Q29u
dGVudCA9ICcnOwogICAgY29uc3Qgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5TX1NW
RywgJ3N2ZycpOwogICAgc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnODAwJyk7CiAgICBzdmcu
c2V0QXR0cmlidXRlKCdoZWlnaHQnLCBTdHJpbmcoVE9UQUxfVFNQQU5TICogMTIgKyA2MCkpOwog
ICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOU19TVkcsICd0ZXh0Jyk7
CiAgICB0ZXh0LnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgxMCwgNTApJyk7
CiAgICB0ZXh0LnN0eWxlLmZvbnRTaXplID0gJzEycHgnOwogICAgc3ZnLmFwcGVuZENoaWxkKHRl
eHQpOwogICAgY29uc3QgdHNwYW5zID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IFRPVEFM
X1RTUEFOUzsgaSsrKSB7CiAgICAgIGNvbnN0IHRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5T
KE5TX1NWRywgJ3RzcGFuJyk7CiAgICAgIHRzLnNldEF0dHJpYnV0ZSgneCcsICcwJyk7CiAgICAg
IHRzLnNldEF0dHJpYnV0ZSgneScsIFN0cmluZygoaSArIDEpICogMTIpKTsKICAgICAgdHMuYXBw
ZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoVEVYVF9TVFJJTkdTWzBdKSk7CiAgICAg
IHRleHQuYXBwZW5kQ2hpbGQodHMpOwogICAgICB0c3BhbnMucHVzaCh0cyk7CiAgICB9CiAgICBm
b3IgKGxldCBpID0gMDsgaSA8IFRPVEFMX1RTUEFOUzsgaSsrKQogICAgICB0c3BhbnNbaV0uc3R5
bGUuZGlzcGxheSA9IGkgPj0gdmlzaWJsZSA/ICdub25lJyA6ICcnOwogICAgc2NyYXRjaC5hcHBl
bmRDaGlsZChzdmcpOwogICAgc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgcmV0dXJu
IHsgc3ZnLCB0c3BhbnMgfTsKICB9CgogIGZ1bmN0aW9uIGJlbmNoKHNjZW5lLCBpdGVycykgewog
ICAgY29uc3QgdGFyZ2V0ID0gc2NlbmUudHNwYW5zWzBdOwogICAgbGV0IGMgPSAwOwogICAgY29u
c3QgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcnM7
IGkrKykgewogICAgICB0YXJnZXQucmVwbGFjZUNoaWxkKAogICAgICAgIGRvY3VtZW50LmNyZWF0
ZVRleHROb2RlKFRFWFRfU1RSSU5HU1tjICUgVEVYVF9TVFJJTkdTLmxlbmd0aF0pLAogICAgICAg
IHRhcmdldC5maXJzdENoaWxkCiAgICAgICk7CiAgICAgIGMrKzsKICAgICAgc2NlbmUuc3ZnLmdl
dEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgfQogICAgcmV0dXJuIChwZXJmb3JtYW5jZS5ub3co
KSAtIHQwKSAvIGl0ZXJzOwogIH0KCiAgZnVuY3Rpb24gbWVkaWFuKGFycikgewogICAgY29uc3Qg
cyA9IFsuLi5hcnJdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTsKICAgIGNvbnN0IG0gPSBzLmxlbmd0
aCA+PiAxOwogICAgcmV0dXJuIHMubGVuZ3RoICUgMiA/IHNbbV0gOiAoc1ttIC0gMV0gKyBzW21d
KSAvIDI7CiAgfQoKICAvLyBMZWFzdC1zcXVhcmVzIGxpbmVhciBmaXQ6IHJldHVybnMgeyBzbG9w
ZSwgaW50ZXJjZXB0IH0uCiAgZnVuY3Rpb24gbGluZWFyRml0KHBvaW50cykgewogICAgY29uc3Qg
biA9IHBvaW50cy5sZW5ndGg7CiAgICBjb25zdCBzeCAgPSBwb2ludHMucmVkdWNlKChhLCBbeF0p
ID0+IGEgKyB4LCAwKTsKICAgIGNvbnN0IHN5ICA9IHBvaW50cy5yZWR1Y2UoKGEsIFssIHldKSA9
PiBhICsgeSwgMCk7CiAgICBjb25zdCBzeHggPSBwb2ludHMucmVkdWNlKChhLCBbeF0pID0+IGEg
KyB4ICogeCwgMCk7CiAgICBjb25zdCBzeHkgPSBwb2ludHMucmVkdWNlKChhLCBbeCwgeV0pID0+
IGEgKyB4ICogeSwgMCk7CiAgICBjb25zdCBzbG9wZSA9IChuICogc3h5IC0gc3ggKiBzeSkgLyAo
biAqIHN4eCAtIHN4ICogc3gpOwogICAgY29uc3QgaW50ZXJjZXB0ID0gKHN5IC0gc2xvcGUgKiBz
eCkgLyBuOwogICAgcmV0dXJuIHsgc2xvcGUsIGludGVyY2VwdCB9OwogIH0KCiAgZnVuY3Rpb24g
ZHJhd0NoYXJ0KHBvaW50cywgZml0KSB7CiAgICBjaGFydC5zdHlsZS5kaXNwbGF5ID0gJyc7CiAg
ICBjaGFydC50ZXh0Q29udGVudCA9ICcnOwogICAgY29uc3QgVyA9IDg2MCwgSCA9IDI4MCwgUEFE
ID0gNDA7CiAgICBjb25zdCB4cyA9IHBvaW50cy5tYXAocCA9PiBwWzBdKTsKICAgIGNvbnN0IHlz
ID0gcG9pbnRzLm1hcChwID0+IHBbMV0pOwogICAgY29uc3QgeE1heCA9IE1hdGgubWF4KC4uLnhz
LCAxKTsKICAgIGNvbnN0IHlNYXggPSBNYXRoLm1heCguLi55cywgMSkgKiAxLjE7CiAgICBjb25z
dCB4MnB4ID0geCA9PiBQQUQgKyAoeCAvIHhNYXgpICogKFcgLSAyICogUEFEKTsKICAgIGNvbnN0
IHkycHggPSB5ID0+IEggLSBQQUQgLSAoeSAvIHlNYXgpICogKEggLSAyICogUEFEKTsKCiAgICBj
b25zdCBucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CiAgICBmdW5jdGlvbiBlbCh0
YWcsIGF0dHJzKSB7CiAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobnMs
IHRhZyk7CiAgICAgIGZvciAoY29uc3QgayBpbiBhdHRycykgZS5zZXRBdHRyaWJ1dGUoaywgYXR0
cnNba10pOwogICAgICByZXR1cm4gZTsKICAgIH0KICAgIC8vIGF4ZXMKICAgIGNoYXJ0LmFwcGVu
ZENoaWxkKGVsKCdsaW5lJywgeyB4MTogUEFELCB5MTogSCAtIFBBRCwgeDI6IFcgLSBQQUQsIHky
OiBIIC0gUEFELCBzdHJva2U6ICcjODg4JyB9KSk7CiAgICBjaGFydC5hcHBlbmRDaGlsZChlbCgn
bGluZScsIHsgeDE6IFBBRCwgeTE6IFBBRCwgICAgIHgyOiBQQUQsICAgICB5MjogSCAtIFBBRCwg
c3Ryb2tlOiAnIzg4OCcgfSkpOwogICAgLy8gYXhpcyBsYWJlbHMKICAgIGZvciAobGV0IGkgPSAw
OyBpIDw9IDU7IGkrKykgewogICAgICBjb25zdCB5diA9ICh5TWF4ICogaSkgLyA1OwogICAgICBj
b25zdCB5ID0geTJweCh5dik7CiAgICAgIGNvbnN0IHQgPSBlbCgndGV4dCcsIHsgeDogNSwgeTog
eSArIDQsICdmb250LXNpemUnOiAxMCwgZmlsbDogJyM2NjYnIH0pOwogICAgICB0LnRleHRDb250
ZW50ID0geXYudG9GaXhlZCgxKSArICcgbXMnOwogICAgICBjaGFydC5hcHBlbmRDaGlsZCh0KTsK
ICAgICAgY2hhcnQuYXBwZW5kQ2hpbGQoZWwoJ2xpbmUnLCB7IHgxOiBQQUQgLSAzLCB5MTogeSwg
eDI6IFBBRCwgeTI6IHksIHN0cm9rZTogJyM4ODgnIH0pKTsKICAgIH0KICAgIHhzLmZvckVhY2go
eHYgPT4gewogICAgICBjb25zdCB4ID0geDJweCh4dik7CiAgICAgIGNvbnN0IHQgPSBlbCgndGV4
dCcsIHsgeDogeCAtIDYsIHk6IEggLSBQQUQgKyAxNCwgJ2ZvbnQtc2l6ZSc6IDEwLCBmaWxsOiAn
IzY2NicgfSk7CiAgICAgIHQudGV4dENvbnRlbnQgPSBTdHJpbmcoeHYpOwogICAgICBjaGFydC5h
cHBlbmRDaGlsZCh0KTsKICAgICAgY2hhcnQuYXBwZW5kQ2hpbGQoZWwoJ2xpbmUnLCB7IHgxOiB4
LCB5MTogSCAtIFBBRCwgeDI6IHgsIHkyOiBIIC0gUEFEICsgMywgc3Ryb2tlOiAnIzg4OCcgfSkp
OwogICAgfSk7CiAgICBjb25zdCB4TGFiZWwgPSBlbCgndGV4dCcsIHsgeDogVyAvIDIsIHk6IEgg
LSA2LCAnZm9udC1zaXplJzogMTEsIGZpbGw6ICcjNDQ0JywgJ3RleHQtYW5jaG9yJzogJ21pZGRs
ZScgfSk7CiAgICB4TGFiZWwudGV4dENvbnRlbnQgPSAndmlzaWJsZSB0c3BhbnMnOwogICAgY2hh
cnQuYXBwZW5kQ2hpbGQoeExhYmVsKTsKICAgIC8vIGZpdCBsaW5lCiAgICBjb25zdCBmaXRYMSA9
IDAsIGZpdFgyID0geE1heDsKICAgIGNvbnN0IGZpdFkxID0gZml0LmludGVyY2VwdCArIGZpdC5z
bG9wZSAqIGZpdFgxOwogICAgY29uc3QgZml0WTIgPSBmaXQuaW50ZXJjZXB0ICsgZml0LnNsb3Bl
ICogZml0WDI7CiAgICBjaGFydC5hcHBlbmRDaGlsZChlbCgnbGluZScsIHsKICAgICAgeDE6IHgy
cHgoZml0WDEpLCB5MTogeTJweChmaXRZMSksCiAgICAgIHgyOiB4MnB4KGZpdFgyKSwgeTI6IHky
cHgoZml0WTIpLAogICAgICBzdHJva2U6ICcjZDQzJywgJ3N0cm9rZS13aWR0aCc6IDEsICdzdHJv
a2UtZGFzaGFycmF5JzogJzQgMycKICAgIH0pKTsKICAgIC8vIHBvaW50cwogICAgZm9yIChjb25z
dCBbeCwgeV0gb2YgcG9pbnRzKSB7CiAgICAgIGNoYXJ0LmFwcGVuZENoaWxkKGVsKCdjaXJjbGUn
LCB7IGN4OiB4MnB4KHgpLCBjeTogeTJweCh5KSwgcjogNCwgZmlsbDogJyMyNmMnIH0pKTsKICAg
IH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHsKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCdydW4nKTsKICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICByZXN1
bHRzRWwuaW5uZXJIVE1MID0gJyc7CiAgICBjaGFydC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwog
ICAgZml0RWwudGV4dENvbnRlbnQgPSAnJzsKCiAgICBjb25zdCByb3dzID0gW107CiAgICBmb3Ig
KGNvbnN0IHYgb2YgVklTSUJMRV9DT1VOVFMpIHsKICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQg
PSBgbWVhc3VyaW5nIHZpc2libGU9JHt2fSDigKZgOwogICAgICAvLyB5aWVsZCB0byB0aGUgZXZl
bnQgbG9vcCBzbyB0aGUgRE9NICsgc3RhdHVzIHVwZGF0ZSBwYWludAogICAgICBhd2FpdCBuZXcg
UHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMCkpOwogICAgICBjb25zdCBzY2VuZSA9IGJ1aWxk
U2NlbmUodik7CiAgICAgIGJlbmNoKHNjZW5lLCBXQVJNVVBfSVRFUlMpOwogICAgICBjb25zdCBz
YW1wbGVzID0gW107CiAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgUkVQRUFUUzsgcisrKSBzYW1w
bGVzLnB1c2goYmVuY2goc2NlbmUsIE1FQVNVUkVfSVRFUlMpKTsKICAgICAgc2NlbmUuc3ZnLnJl
bW92ZSgpOwogICAgICBjb25zdCBtZWQgPSBtZWRpYW4oc2FtcGxlcyk7CiAgICAgIGNvbnN0IG1u
ID0gTWF0aC5taW4oLi4uc2FtcGxlcyk7CiAgICAgIGNvbnN0IG14ID0gTWF0aC5tYXgoLi4uc2Ft
cGxlcyk7CiAgICAgIHJvd3MucHVzaCh7IHZpc2libGU6IHYsIG1lZGlhbjogbWVkLCBtaW46IG1u
LCBtYXg6IG14LCBzYW1wbGVzIH0pOwogICAgfQoKICAgIGNvbnN0IHBvaW50cyA9IHJvd3MubWFw
KHIgPT4gW3IudmlzaWJsZSwgci5tZWRpYW5dKTsKICAgIGNvbnN0IGZpdCA9IGxpbmVhckZpdChw
b2ludHMpOwoKICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUn
KTsKICAgIHRhYmxlLmlubmVySFRNTCA9CiAgICAgICc8dHI+PHRoPnZpc2libGUgdHNwYW5zPC90
aD48dGg+bWVkaWFuIG1zL2l0ZXI8L3RoPjx0aD5taW48L3RoPjx0aD5tYXg8L3RoPjx0aD5zYW1w
bGVzPC90aD48L3RyPicgKwogICAgICByb3dzLm1hcChyID0+CiAgICAgICAgYDx0cj48dGQ+JHty
LnZpc2libGV9PC90ZD48dGQ+JHtyLm1lZGlhbi50b0ZpeGVkKDMpfTwvdGQ+PHRkPiR7ci5taW4u
dG9GaXhlZCgzKX08L3RkPjx0ZD4ke3IubWF4LnRvRml4ZWQoMyl9PC90ZD48dGQ+JHtyLnNhbXBs
ZXMubWFwKHMgPT4gcy50b0ZpeGVkKDIpKS5qb2luKCcsICcpfTwvdGQ+PC90cj5gCiAgICAgICku
am9pbignJyk7CiAgICByZXN1bHRzRWwuYXBwZW5kQ2hpbGQodGFibGUpOwoKICAgIGZpdEVsLnRl
eHRDb250ZW50ID0KICAgICAgYGxpbmVhciBmaXQgKG1lZGlhbiB2cyB2aXNpYmxlKTogJHtmaXQu
c2xvcGUudG9GaXhlZCg0KX0gbXMgLyB0c3BhbiAgKyAgJHtmaXQuaW50ZXJjZXB0LnRvRml4ZWQo
Myl9IG1zIGZpeGVkIG92ZXJoZWFkYDsKICAgIGRyYXdDaGFydChwb2ludHMsIGZpdCk7CgogICAg
c3RhdHVzRWwudGV4dENvbnRlbnQgPSBgZG9uZSDigJQgY29weSB0aGUgdGFibGUgb3IgdGFrZSBh
IHNjcmVlbnNob3RgOwogICAgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgfQoKICBkb2N1bWVudC5n
ZXRFbGVtZW50QnlJZCgncnVuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBydW4pOwp9KSgp
Owo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>