<?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>37174</bug_id>
          
          <creation_ts>2010-04-06 15:39:47 -0700</creation_ts>
          <short_desc>Must resolve multisampled back buffer during copyTexImage2D and copyTexSubImage2D</short_desc>
          <delta_ts>2010-04-09 03:07:09 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Zhenyao Mo">zmo</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>oliver</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>209292</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-06 15:39:47 -0700</bug_when>
    <thetext>If the WebGL back buffer is multisampled (the antialias parameter is set to true during context creation), then during both copyTexImage2D and copyTexSubImage2D operations, it is necessary to resolve the framebuffer, bind the resolved version of the framebuffer, and then perform the operation. Afterward, the multisampled framebuffer should be re-bound. Currently these operations are raising an INVALID_OPERATION error because of the attempt to copy directly from the multisampled framebuffer to the texture.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209373</commentid>
    <comment_count>1</comment_count>
      <attachid>52690</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-06 18:12:51 -0700</bug_when>
    <thetext>Created attachment 52690
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209836</commentid>
    <comment_count>2</comment_count>
      <attachid>52690</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-07 14:21:01 -0700</bug_when>
    <thetext>Comment on attachment 52690
patch

The code looks good. One comment on the test case.

&gt; Index: LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d.html
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d.html	(revision 0)
&gt; +++ LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d.html	(revision 0)
&gt; @@ -0,0 +1,185 @@
&gt; +&lt;html&gt;
&gt; +&lt;head&gt;
&gt; +&lt;link rel=&quot;stylesheet&quot; href=&quot;../../js/resources/js-test-style.css&quot;/&gt;
&gt; +&lt;script src=&quot;../../js/resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
&gt; +&lt;script src=&quot;resources/webgl-test.js&quot;&gt;&lt;/script&gt;
&gt; +&lt;script src=&quot;resources/utils3d.js&quot;&gt; &lt;/script&gt;
&gt; +&lt;script id=&quot;vshader&quot; type=&quot;x-shader/x-vertex&quot;&gt;
&gt; +attribute vec3 g_Position;
&gt; +attribute vec2 g_TexCoord0;
&gt; +
&gt; +varying vec2 texCoord;
&gt; +
&gt; +void main()
&gt; +{
&gt; +    gl_Position = vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);
&gt; +    texCoord = g_TexCoord0;
&gt; +}
&gt; +&lt;/script&gt;
&gt; +
&gt; +&lt;script id=&quot;fshader&quot; type=&quot;x-shader/x-fragment&quot;&gt;
&gt; +uniform sampler2D tex;
&gt; +varying vec2 texCoord;
&gt; +
&gt; +void main()
&gt; +{
&gt; +    gl_FragColor = texture2D(tex, texCoord);
&gt; +}
&gt; +&lt;/script&gt;
&gt; +
&gt; +&lt;script&gt;
&gt; +var successfullyParsed = false;
&gt; +
&gt; +function init()
&gt; +{
&gt; +    if (window.layoutTestController) {
&gt; +        layoutTestController.overridePreference(&quot;WebKitWebGLEnabled&quot;, &quot;1&quot;);
&gt; +        layoutTestController.dumpAsText();
&gt; +        layoutTestController.waitUntilDone();
&gt; +    }
&gt; +
&gt; +    description(&apos;Verify copyTexImage2D and copyTexSubImage2D&apos;);
&gt; +
&gt; +    runTest();
&gt; +}
&gt; +
&gt; +// These two declarations need to be global for &quot;shouldBe&quot; to see them
&gt; +var pixel = [0, 0, 0];
&gt; +var correctColor = null;
&gt; +
&gt; +function runTestIteration(antialias)
&gt; +{
&gt; +    var gl = null;
&gt; +    if (antialias)
&gt; +        gl = initWebGL(&quot;antialiasOn&quot;, &quot;vshader&quot;, &quot;fshader&quot;, [ &quot;g_Position&quot;, &quot;g_TexCoord0&quot; ], [ 0, 0, 0, 1 ], 1);
&gt; +    else
&gt; +        gl = initWebGL(&quot;antialiasOff&quot;, &quot;vshader&quot;, &quot;fshader&quot;, [ &quot;g_Position&quot;, &quot;g_TexCoord0&quot; ], [ 0, 0, 0, 1 ], 1, { antialias: false });
&gt; +
&gt; +    var textureLoc = gl.getUniformLocation(gl.program, &quot;tex&quot;);
&gt; +
&gt; +    var vertices = new WebGLFloatArray([
&gt; +         1.0,  1.0, 0.0,
&gt; +        -1.0,  1.0, 0.0,
&gt; +        -1.0, -1.0, 0.0,
&gt; +         1.0,  1.0, 0.0,
&gt; +        -1.0, -1.0, 0.0,
&gt; +         1.0, -1.0, 0.0]);
&gt; +    var texCoords = new WebGLFloatArray([
&gt; +        1.0, 1.0,
&gt; +        0.0, 1.0,
&gt; +        0.0, 0.0,
&gt; +        1.0, 1.0,
&gt; +        0.0, 0.0,
&gt; +        1.0, 0.0]);
&gt; +    var texCoordOffset = vertices.byteLength;
&gt; +
&gt; +    var vbo = gl.createBuffer();
&gt; +    gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
&gt; +    gl.bufferData(gl.ARRAY_BUFFER,
&gt; +                  texCoordOffset + texCoords.byteLength,
&gt; +                  gl.STATIC_DRAW);
&gt; +    gl.bufferSubData(gl.ARRAY_BUFFER, 0, vertices);
&gt; +    gl.bufferSubData(gl.ARRAY_BUFFER, texCoordOffset, texCoords);
&gt; +
&gt; +    gl.enableVertexAttribArray(0);
&gt; +    gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
&gt; +    gl.enableVertexAttribArray(1);
&gt; +    gl.vertexAttribPointer(1, 2, gl.FLOAT, gl.FALSE, 0, texCoordOffset);
&gt; +
&gt; +    gl.colorMask(1, 1, 1, 0);
&gt; +    gl.disable(gl.BLEND);
&gt; +    debug(&apos;Testing copyTexImage2D&apos;);
&gt; +
&gt; +    // Red canvas
&gt; +    gl.clearColor(1, 0, 0, 1);
&gt; +    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
&gt; +
&gt; +    var texture = gl.createTexture();
&gt; +    // Bind the texture to texture unit 0
&gt; +    gl.bindTexture(gl.TEXTURE_2D, texture);
&gt; +    // Set up texture
&gt; +    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);    
&gt; +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
&gt; +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);

I think there should be a shouldBe(&quot;gl.getError()&quot;, &quot;gl.NO_ERROR&quot;) here.

&gt; +    gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, 2, 2, 0);

There should be a shouldBe(&quot;gl.getError()&quot;, &quot;gl.NO_ERROR&quot;) here. Previously this was generating INVALID_OPERATION.

&gt; +
&gt; +    // Green canvas
&gt; +    gl.clearColor(0, 1, 0, 1);
&gt; +    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
&gt; +
&gt; +    // Point the uniform sampler to texture unit 0
&gt; +    gl.uniform1i(textureLoc, 0);
&gt; +    // Draw the triangles
&gt; +    gl.drawArrays(gl.TRIANGLES, 0, 6);
&gt; +
&gt; +    // Read back the rendering results, should be red
&gt; +    var buf = gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE);
&gt; +    var idx = 0;
&gt; +    correctColor = [255, 0, 0];
&gt; +    for (var y = 0; y &lt; 2; y++) {
&gt; +        for (var x = 0; x &lt; 2; x++) {
&gt; +            idx = (y * 2 + x) * 4;
&gt; +            pixel[0] = buf[idx];
&gt; +            pixel[1] = buf[idx + 1];
&gt; +            pixel[2] = buf[idx + 2];
&gt; +            shouldBe(&quot;pixel&quot;, &quot;correctColor&quot;);
&gt; +        }
&gt; +    }
&gt; +
&gt; +    debug(&apos;Testing copyTexSubImage2D&apos;);
&gt; +
&gt; +    // Green canvas
&gt; +    gl.clearColor(0, 1, 0, 1);
&gt; +    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

I think there should be a shouldBe(&quot;gl.getError()&quot;, &quot;gl.NO_ERROR&quot;) here.

&gt; +
&gt; +    gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2);

There should be a shouldBe(&quot;gl.getError()&quot;, &quot;gl.NO_ERROR&quot;) here. Previously this was generating INVALID_OPERATION.

&gt; +
&gt; +    // Blue canvas
&gt; +    gl.clearColor(0, 0, 1, 1);
&gt; +    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
&gt; +
&gt; +    // Draw the triangles
&gt; +    gl.drawArrays(gl.TRIANGLES, 0, 6);
&gt; +
&gt; +    // Read back the rendering results, should be green
&gt; +    buf = gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE);
&gt; +    correctColor = [0, 255, 0];
&gt; +    for (var y = 0; y &lt; 2; y++) {
&gt; +        for (var x = 0; x &lt; 2; x++) {
&gt; +            idx = (y * 2 + x) * 4;
&gt; +            pixel[0] = buf[idx];
&gt; +            pixel[1] = buf[idx + 1];
&gt; +            pixel[2] = buf[idx + 2];
&gt; +            shouldBe(&quot;pixel&quot;, &quot;correctColor&quot;);
&gt; +        }
&gt; +    }
&gt; +}
&gt; +
&gt; +function runTest(antialias)
&gt; +{
&gt; +    debug(&quot;Testing with antialias on&quot;);
&gt; +    runTestIteration(true);
&gt; +    debug(&quot;Testing with antialias off&quot;);
&gt; +    runTestIteration(false);
&gt; +
&gt; +    successfullyParsed = true;
&gt; +    var epilogue = document.createElement(&quot;script&quot;);
&gt; +    epilogue.onload = finish;
&gt; +    epilogue.src = &quot;../../js/resources/js-test-post.js&quot;;
&gt; +    document.body.appendChild(epilogue);
&gt; +}
&gt; +
&gt; +function finish() {
&gt; +    if (window.layoutTestController) {
&gt; +        layoutTestController.notifyDone();
&gt; +    }
&gt; +}
&gt; +&lt;/script&gt;
&gt; +&lt;/head&gt;
&gt; +&lt;body onload=&quot;init()&quot;&gt;
&gt; +&lt;canvas id=&quot;antialiasOn&quot; width=&quot;2px&quot; height=&quot;2px&quot;&gt;&lt;/canvas&gt;
&gt; +&lt;canvas id=&quot;antialiasOff&quot; width=&quot;2px&quot; height=&quot;2px&quot;&gt;&lt;/canvas&gt;
&gt; +&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
&gt; +&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
&gt; +&lt;/body&gt;
&gt; +&lt;/html&gt;
&gt; Index: LayoutTests/fast/canvas/webgl/resources/utils3d.js
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/resources/utils3d.js	(revision 57160)
&gt; +++ LayoutTests/fast/canvas/webgl/resources/utils3d.js	(working copy)
&gt; @@ -17,10 +17,10 @@
&gt;  // by the caller. By default, it maps to the window.console() function on WebKit and to
&gt;  // an empty function on other browsers.
&gt;  //
&gt; -function initWebGL(canvasName, vshader, fshader, attribs, clearColor, clearDepth)
&gt; +function initWebGL(canvasName, vshader, fshader, attribs, clearColor, clearDepth, contextAttribs)
&gt;  {
&gt;      var canvas = document.getElementById(canvasName);
&gt; -    var gl = canvas.getContext(&quot;experimental-webgl&quot;);
&gt; +    var gl = canvas.getContext(&quot;experimental-webgl&quot;, contextAttribs);
&gt;      if (!gl) {
&gt;          alert(&quot;No WebGL context found&quot;);
&gt;          return null;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209846</commentid>
    <comment_count>3</comment_count>
      <attachid>52782</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-07 14:31:17 -0700</bug_when>
    <thetext>Created attachment 52782
revised patch: responding to Ken Russell&apos;s review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209856</commentid>
    <comment_count>4</comment_count>
      <attachid>52782</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-07 14:52:46 -0700</bug_when>
    <thetext>Comment on attachment 52782
revised patch: responding to Ken Russell&apos;s review

Looks good to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210456</commentid>
    <comment_count>5</comment_count>
      <attachid>52782</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-04-08 16:00:36 -0700</bug_when>
    <thetext>Comment on attachment 52782
revised patch: responding to Ken Russell&apos;s review

kbr&apos;s word is good as gold.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210657</commentid>
    <comment_count>6</comment_count>
      <attachid>52782</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-09 03:07:03 -0700</bug_when>
    <thetext>Comment on attachment 52782
revised patch: responding to Ken Russell&apos;s review

Clearing flags on attachment: 52782

Committed r57322: &lt;http://trac.webkit.org/changeset/57322&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210658</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-09 03:07:09 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52690</attachid>
            <date>2010-04-06 18:12:51 -0700</date>
            <delta_ts>2010-04-07 14:31:17 -0700</delta_ts>
            <desc>patch</desc>
            <filename>tex.patch</filename>
            <type>text/plain</type>
            <size>15054</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzE4MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTYgQEAKKzIwMTAtMDQtMDYgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNdXN0IHJl
c29sdmUgbXVsdGlzYW1wbGVkIGJhY2sgYnVmZmVyIGR1cmluZyBjb3B5VGV4SW1hZ2UyRCBhbmQg
Y29weVRleFN1YkltYWdlMkQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTM3MTc0CisKKyAgICAgICAgVGVzdDogZmFzdC9jYW52YXMvd2ViZ2wvY29weS10
ZXgtaW1hZ2UtYW5kLXN1Yi1pbWFnZS0yZC5odG1sCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3BwOiByZXNvbHZlIG11bHRpc2FtcGxlZCBi
YWNrIGJ1ZmZlciBkdXJpbmcgY29weVRleEltYWdlMkQgYW5kIGNvcHlUZXhTdWJJbWFnZTJELgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyRCk6CisK
IDIwMTAtMDQtMDYgIE5pY29sYXMgV2ViZXIgIDx0aGFraXNAY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IERpbWl0cmkgR2xhemtvdi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5jcHAJKHJldmlz
aW9uIDU3MTU0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250
ZXh0M0RNYWMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OTksMTMgKzQ5OSwyOSBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFdlCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojpjb3B5VGV4SW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgdW5zaWdu
ZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lk
dGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCBsb25nIGJvcmRlcikKIHsKICAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRG
Qk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgeworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAg
ICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwg
eCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5F
QVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOworICAgIH0KICAgICA6OmdsQ29weVRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50
ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlcik7CisgICAgaWYgKG1fYXR0
cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKKyAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVG
Qk8pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyRCh1bnNp
Z25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgbG9uZyB4b2Zmc2V0LCBsb25nIHlvZmZzZXQs
IGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdo
dCkKIHsKICAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgaWYgKG1fYXR0cnMu
YW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgeworICAgICAgICA6
OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2Ft
cGxlRkJPKTsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVG
RkVSX0VYVCwgbV9mYm8pOworICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHksIHgg
KyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xP
Ul9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgIH0KICAgICA6OmdsQ29weVRleFN1Yklt
YWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdo
dCk7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNh
bXBsZUZCTykKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVGQk8pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjdWxs
RmFjZSh1bnNpZ25lZCBsb25nIG1vZGUpCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU3MTgw
KQorKysgV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDE2IEBACisyMDEwLTA0LTA2ICBaaGVueWFvIE1vICA8em1vQGdvb2dsZS5jb20+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTXVzdCByZXNvbHZlIG11
bHRpc2FtcGxlZCBiYWNrIGJ1ZmZlciBkdXJpbmcgY29weVRleEltYWdlMkQgYW5kIGNvcHlUZXhT
dWJJbWFnZTJECisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0zNzE3NAorCisgICAgICAgIFRlc3Q6IGZhc3QvY2FudmFzL3dlYmdsL2NvcHktdGV4LWltYWdl
LWFuZC1zdWItaW1hZ2UtMmQuaHRtbAorCisgICAgICAgICogc3JjL1dlYkdyYXBoaWNzQ29udGV4
dDNERGVmYXVsdEltcGwuY3BwOiBSZXNvbHZlIG11bHRpc2FtcGxlZCBiYWNrIGJ1ZmZlciBkdXJp
bmcgY29weVRleEltYWdlMkQgYW5kIGNvcHlUZXhTdWJJbWFnZTJELgorICAgICAgICAoV2ViS2l0
OjpXZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsOjpjb3B5VGV4SW1hZ2UyRCk6CisgICAg
ICAgIChXZWJLaXQ6OldlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdEltcGw6OmNvcHlUZXhTdWJJ
bWFnZTJEKToKKwogMjAxMC0wNC0wNiAgTmljb2xhcyBXZWJlciAgPHRoYWtpc0BjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292LgpJbmRleDogV2ViS2l0
L2Nocm9taXVtL3NyYy9XZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdElt
cGwuY3BwCShyZXZpc2lvbiA1NzE1NCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViR3JhcGhp
Y3NDb250ZXh0M0REZWZhdWx0SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgzOCw5ICs4Mzgs
NDMgQEAgREVMRUdBVEVfVE9fR0xfNChjb2xvck1hc2ssIENvbG9yTWFzaywgYgogCiBERUxFR0FU
RV9UT19HTF8xKGNvbXBpbGVTaGFkZXIsIENvbXBpbGVTaGFkZXIsIFdlYkdMSWQpCiAKLURFTEVH
QVRFX1RPX0dMXzgoY29weVRleEltYWdlMkQsIENvcHlUZXhJbWFnZTJELCB1bnNpZ25lZCBsb25n
LCBsb25nLCB1bnNpZ25lZCBsb25nLCBsb25nLCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25l
ZCBsb25nLCBsb25nKQordm9pZCBXZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsOjpjb3B5
VGV4SW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgdW5zaWduZWQgbG9u
ZyBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2ln
bmVkIGxvbmcgaGVpZ2h0LCBsb25nIGJvcmRlcikKK3sKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKKyNpZm5kZWYgUkVOREVSX1RPX0RFQlVHR0lOR19XSU5ET1cKKyAgICBpZiAobV9hdHRyaWJ1
dGVzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKKyAgICAg
ICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlz
YW1wbGVGQk8pOworICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVG
RkVSX0VYVCwgbV9mYm8pOworICAgICAgICBnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsg
d2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1Jf
QlVGRkVSX0JJVCwgR0xfTElORUFSKTsKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgfQorI2VuZGlmCisgICAgZ2xDb3B5VGV4SW1h
Z2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsIGhlaWdodCwg
Ym9yZGVyKTsKKyNpZm5kZWYgUkVOREVSX1RPX0RFQlVHR0lOR19XSU5ET1cKKyAgICBpZiAobV9h
dHRyaWJ1dGVzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCisg
ICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZC
Tyk7CisjZW5kaWYKK30KIAotREVMRUdBVEVfVE9fR0xfOChjb3B5VGV4U3ViSW1hZ2UyRCwgQ29w
eVRleFN1YkltYWdlMkQsIHVuc2lnbmVkIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxv
bmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpCit2b2lkIFdlYkdyYXBoaWNzQ29udGV4
dDNERGVmYXVsdEltcGw6OmNvcHlUZXhTdWJJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBs
b25nIGxldmVsLCBsb25nIHhvZmZzZXQsIGxvbmcgeW9mZnNldCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB4LCBsb25nIHksIHVu
c2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIG1ha2VDb250
ZXh0Q3VycmVudCgpOworI2lmbmRlZiBSRU5ERVJfVE9fREVCVUdHSU5HX1dJTkRPVworICAgIGlm
IChtX2F0dHJpYnV0ZXMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZC
TykgeworICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VY
VCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RS
QVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIGdsQmxpdEZyYW1lYnVmZmVyRVhU
KHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0
LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICBnbEJpbmRGcmFtZWJ1
ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICB9CisjZW5kaWYKKyAgICBn
bENvcHlUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHks
IHdpZHRoLCBoZWlnaHQpOworI2lmbmRlZiBSRU5ERVJfVE9fREVCVUdHSU5HX1dJTkRPVworICAg
IGlmIChtX2F0dHJpYnV0ZXMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBs
ZUZCTykKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBt
X2JvdW5kRkJPKTsKKyNlbmRpZgorfQogCiBERUxFR0FURV9UT19HTF8xKGN1bGxGYWNlLCBDdWxs
RmFjZSwgdW5zaWduZWQgbG9uZykKIApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNTcxODApCisrKyBMYXlv
dXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNCBAQAorMjAxMC0w
NC0wNiAgWmhlbnlhbyBNbyAgPHptb0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE11c3QgcmVzb2x2ZSBtdWx0aXNhbXBsZWQgYmFj
ayBidWZmZXIgZHVyaW5nIGNvcHlUZXhJbWFnZTJEIGFuZCBjb3B5VGV4U3ViSW1hZ2UyRAorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzcxNzQKKworICAg
ICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2NvcHktdGV4LWltYWdlLWFuZC1zdWItaW1hZ2UtMmQt
ZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L2NhbnZhcy93ZWJnbC9jb3B5LXRl
eC1pbWFnZS1hbmQtc3ViLWltYWdlLTJkLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGZhc3QvY2Fu
dmFzL3dlYmdsL3Jlc291cmNlcy91dGlsczNkLmpzOiBBZGQgQ29udGV4dEF0dHJpYnV0ZXMgcGFy
YW1ldGVyIHRvIGluaXRXZWJHTCBmdW5jdGlvbi4KKwogMjAxMC0wNC0wNiAgTWFyayBSb3dlICA8
bXJvd2VAYXBwbGUuY29tPgogCiAgICAgICAgIFJ1YmJlci1zdGFtcGVkIGJ5IE9saXZlciBIdW50
LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvY29weS10ZXgtaW1hZ2UtYW5k
LXN1Yi1pbWFnZS0yZC1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFz
dC9jYW52YXMvd2ViZ2wvY29weS10ZXgtaW1hZ2UtYW5kLXN1Yi1pbWFnZS0yZC1leHBlY3RlZC50
eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9jb3B5LXRl
eC1pbWFnZS1hbmQtc3ViLWltYWdlLTJkLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwzMSBAQAorIAorVmVyaWZ5IGNvcHlUZXhJbWFnZTJEIGFuZCBjb3B5VGV4U3ViSW1hZ2Uy
RAorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2Vz
LCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKK1Rlc3Rpbmcgd2l0aCBhbnRpYWxpYXMg
b24KK1Rlc3RpbmcgY29weVRleEltYWdlMkQKK1BBU1MgcGl4ZWwgaXMgY29ycmVjdENvbG9yCitQ
QVNTIHBpeGVsIGlzIGNvcnJlY3RDb2xvcgorUEFTUyBwaXhlbCBpcyBjb3JyZWN0Q29sb3IKK1BB
U1MgcGl4ZWwgaXMgY29ycmVjdENvbG9yCitUZXN0aW5nIGNvcHlUZXhTdWJJbWFnZTJECitQQVNT
IHBpeGVsIGlzIGNvcnJlY3RDb2xvcgorUEFTUyBwaXhlbCBpcyBjb3JyZWN0Q29sb3IKK1BBU1Mg
cGl4ZWwgaXMgY29ycmVjdENvbG9yCitQQVNTIHBpeGVsIGlzIGNvcnJlY3RDb2xvcgorVGVzdGlu
ZyB3aXRoIGFudGlhbGlhcyBvZmYKK1Rlc3RpbmcgY29weVRleEltYWdlMkQKK1BBU1MgcGl4ZWwg
aXMgY29ycmVjdENvbG9yCitQQVNTIHBpeGVsIGlzIGNvcnJlY3RDb2xvcgorUEFTUyBwaXhlbCBp
cyBjb3JyZWN0Q29sb3IKK1BBU1MgcGl4ZWwgaXMgY29ycmVjdENvbG9yCitUZXN0aW5nIGNvcHlU
ZXhTdWJJbWFnZTJECitQQVNTIHBpeGVsIGlzIGNvcnJlY3RDb2xvcgorUEFTUyBwaXhlbCBpcyBj
b3JyZWN0Q29sb3IKK1BBU1MgcGl4ZWwgaXMgY29ycmVjdENvbG9yCitQQVNTIHBpeGVsIGlzIGNv
cnJlY3RDb2xvcgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBM
RVRFCisKSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2NvcHktdGV4LWltYWdl
LWFuZC1zdWItaW1hZ2UtMmQuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2Nh
bnZhcy93ZWJnbC9jb3B5LXRleC1pbWFnZS1hbmQtc3ViLWltYWdlLTJkLmh0bWwJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9jb3B5LXRleC1pbWFnZS1hbmQt
c3ViLWltYWdlLTJkLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTg1IEBACis8aHRtbD4K
KzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9qcy9yZXNvdXJjZXMv
anMtdGVzdC1zdHlsZS5jc3MiLz4KKzxzY3JpcHQgc3JjPSIuLi8uLi9qcy9yZXNvdXJjZXMvanMt
dGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InJlc291cmNlcy93ZWJnbC10ZXN0
LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvdXRpbHMzZC5qcyI+IDwvc2Ny
aXB0PgorPHNjcmlwdCBpZD0idnNoYWRlciIgdHlwZT0ieC1zaGFkZXIveC12ZXJ0ZXgiPgorYXR0
cmlidXRlIHZlYzMgZ19Qb3NpdGlvbjsKK2F0dHJpYnV0ZSB2ZWMyIGdfVGV4Q29vcmQwOworCit2
YXJ5aW5nIHZlYzIgdGV4Q29vcmQ7CisKK3ZvaWQgbWFpbigpCit7CisgICAgZ2xfUG9zaXRpb24g
PSB2ZWM0KGdfUG9zaXRpb24ueCwgZ19Qb3NpdGlvbi55LCBnX1Bvc2l0aW9uLnosIDEuMCk7Cisg
ICAgdGV4Q29vcmQgPSBnX1RleENvb3JkMDsKK30KKzwvc2NyaXB0PgorCis8c2NyaXB0IGlkPSJm
c2hhZGVyIiB0eXBlPSJ4LXNoYWRlci94LWZyYWdtZW50Ij4KK3VuaWZvcm0gc2FtcGxlcjJEIHRl
eDsKK3ZhcnlpbmcgdmVjMiB0ZXhDb29yZDsKKwordm9pZCBtYWluKCkKK3sKKyAgICBnbF9GcmFn
Q29sb3IgPSB0ZXh0dXJlMkQodGV4LCB0ZXhDb29yZCk7Cit9Cis8L3NjcmlwdD4KKworPHNjcmlw
dD4KK3ZhciBzdWNjZXNzZnVsbHlQYXJzZWQgPSBmYWxzZTsKKworZnVuY3Rpb24gaW5pdCgpCit7
CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICBsYXlvdXRU
ZXN0Q29udHJvbGxlci5vdmVycmlkZVByZWZlcmVuY2UoIldlYktpdFdlYkdMRW5hYmxlZCIsICIx
Iik7CisgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAg
bGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgpOworICAgIH0KKworICAgIGRlc2Ny
aXB0aW9uKCdWZXJpZnkgY29weVRleEltYWdlMkQgYW5kIGNvcHlUZXhTdWJJbWFnZTJEJyk7CisK
KyAgICBydW5UZXN0KCk7Cit9CisKKy8vIFRoZXNlIHR3byBkZWNsYXJhdGlvbnMgbmVlZCB0byBi
ZSBnbG9iYWwgZm9yICJzaG91bGRCZSIgdG8gc2VlIHRoZW0KK3ZhciBwaXhlbCA9IFswLCAwLCAw
XTsKK3ZhciBjb3JyZWN0Q29sb3IgPSBudWxsOworCitmdW5jdGlvbiBydW5UZXN0SXRlcmF0aW9u
KGFudGlhbGlhcykKK3sKKyAgICB2YXIgZ2wgPSBudWxsOworICAgIGlmIChhbnRpYWxpYXMpCisg
ICAgICAgIGdsID0gaW5pdFdlYkdMKCJhbnRpYWxpYXNPbiIsICJ2c2hhZGVyIiwgImZzaGFkZXIi
LCBbICJnX1Bvc2l0aW9uIiwgImdfVGV4Q29vcmQwIiBdLCBbIDAsIDAsIDAsIDEgXSwgMSk7Cisg
ICAgZWxzZQorICAgICAgICBnbCA9IGluaXRXZWJHTCgiYW50aWFsaWFzT2ZmIiwgInZzaGFkZXIi
LCAiZnNoYWRlciIsIFsgImdfUG9zaXRpb24iLCAiZ19UZXhDb29yZDAiIF0sIFsgMCwgMCwgMCwg
MSBdLCAxLCB7IGFudGlhbGlhczogZmFsc2UgfSk7CisKKyAgICB2YXIgdGV4dHVyZUxvYyA9IGds
LmdldFVuaWZvcm1Mb2NhdGlvbihnbC5wcm9ncmFtLCAidGV4Iik7CisKKyAgICB2YXIgdmVydGlj
ZXMgPSBuZXcgV2ViR0xGbG9hdEFycmF5KFsKKyAgICAgICAgIDEuMCwgIDEuMCwgMC4wLAorICAg
ICAgICAtMS4wLCAgMS4wLCAwLjAsCisgICAgICAgIC0xLjAsIC0xLjAsIDAuMCwKKyAgICAgICAg
IDEuMCwgIDEuMCwgMC4wLAorICAgICAgICAtMS4wLCAtMS4wLCAwLjAsCisgICAgICAgICAxLjAs
IC0xLjAsIDAuMF0pOworICAgIHZhciB0ZXhDb29yZHMgPSBuZXcgV2ViR0xGbG9hdEFycmF5KFsK
KyAgICAgICAgMS4wLCAxLjAsCisgICAgICAgIDAuMCwgMS4wLAorICAgICAgICAwLjAsIDAuMCwK
KyAgICAgICAgMS4wLCAxLjAsCisgICAgICAgIDAuMCwgMC4wLAorICAgICAgICAxLjAsIDAuMF0p
OworICAgIHZhciB0ZXhDb29yZE9mZnNldCA9IHZlcnRpY2VzLmJ5dGVMZW5ndGg7CisKKyAgICB2
YXIgdmJvID0gZ2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9C
VUZGRVIsIHZibyk7CisgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsCisgICAgICAg
ICAgICAgICAgICB0ZXhDb29yZE9mZnNldCArIHRleENvb3Jkcy5ieXRlTGVuZ3RoLAorICAgICAg
ICAgICAgICAgICAgZ2wuU1RBVElDX0RSQVcpOworICAgIGdsLmJ1ZmZlclN1YkRhdGEoZ2wuQVJS
QVlfQlVGRkVSLCAwLCB2ZXJ0aWNlcyk7CisgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9C
VUZGRVIsIHRleENvb3JkT2Zmc2V0LCB0ZXhDb29yZHMpOworCisgICAgZ2wuZW5hYmxlVmVydGV4
QXR0cmliQXJyYXkoMCk7CisgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcigwLCAzLCBnbC5GTE9B
VCwgZmFsc2UsIDAsIDApOworICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpOworICAg
IGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoMSwgMiwgZ2wuRkxPQVQsIGdsLkZBTFNFLCAwLCB0ZXhD
b29yZE9mZnNldCk7CisKKyAgICBnbC5jb2xvck1hc2soMSwgMSwgMSwgMCk7CisgICAgZ2wuZGlz
YWJsZShnbC5CTEVORCk7CisgICAgZGVidWcoJ1Rlc3RpbmcgY29weVRleEltYWdlMkQnKTsKKwor
ICAgIC8vIFJlZCBjYW52YXMKKyAgICBnbC5jbGVhckNvbG9yKDEsIDAsIDAsIDEpOworICAgIGds
LmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQgfCBnbC5ERVBUSF9CVUZGRVJfQklUKTsKKworICAg
IHZhciB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOworICAgIC8vIEJpbmQgdGhlIHRleHR1
cmUgdG8gdGV4dHVyZSB1bml0IDAKKyAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0
ZXh0dXJlKTsKKyAgICAvLyBTZXQgdXAgdGV4dHVyZQorICAgIGdsLnRleEltYWdlMkQoZ2wuVEVY
VFVSRV8yRCwgMCwgZ2wuUkdCQSwgMiwgMiwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwg
bnVsbCk7ICAgIAorICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVS
RV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKTsKKyAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRV
UkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CisgICAgZ2wuY29weVRl
eEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMCwgMCwgMiwgMiwgMCk7CisKKyAg
ICAvLyBHcmVlbiBjYW52YXMKKyAgICBnbC5jbGVhckNvbG9yKDAsIDEsIDAsIDEpOworICAgIGds
LmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQgfCBnbC5ERVBUSF9CVUZGRVJfQklUKTsKKworICAg
IC8vIFBvaW50IHRoZSB1bmlmb3JtIHNhbXBsZXIgdG8gdGV4dHVyZSB1bml0IDAKKyAgICBnbC51
bmlmb3JtMWkodGV4dHVyZUxvYywgMCk7CisgICAgLy8gRHJhdyB0aGUgdHJpYW5nbGVzCisgICAg
Z2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRVMsIDAsIDYpOworCisgICAgLy8gUmVhZCBiYWNrIHRo
ZSByZW5kZXJpbmcgcmVzdWx0cywgc2hvdWxkIGJlIHJlZAorICAgIHZhciBidWYgPSBnbC5yZWFk
UGl4ZWxzKDAsIDAsIDIsIDIsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUpOworICAgIHZhciBp
ZHggPSAwOworICAgIGNvcnJlY3RDb2xvciA9IFsyNTUsIDAsIDBdOworICAgIGZvciAodmFyIHkg
PSAwOyB5IDwgMjsgeSsrKSB7CisgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgMjsgeCsrKSB7
CisgICAgICAgICAgICBpZHggPSAoeSAqIDIgKyB4KSAqIDQ7CisgICAgICAgICAgICBwaXhlbFsw
XSA9IGJ1ZltpZHhdOworICAgICAgICAgICAgcGl4ZWxbMV0gPSBidWZbaWR4ICsgMV07CisgICAg
ICAgICAgICBwaXhlbFsyXSA9IGJ1ZltpZHggKyAyXTsKKyAgICAgICAgICAgIHNob3VsZEJlKCJw
aXhlbCIsICJjb3JyZWN0Q29sb3IiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlYnVnKCdU
ZXN0aW5nIGNvcHlUZXhTdWJJbWFnZTJEJyk7CisKKyAgICAvLyBHcmVlbiBjYW52YXMKKyAgICBn
bC5jbGVhckNvbG9yKDAsIDEsIDAsIDEpOworICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9C
SVQgfCBnbC5ERVBUSF9CVUZGRVJfQklUKTsKKworICAgIGdsLmNvcHlUZXhTdWJJbWFnZTJEKGds
LlRFWFRVUkVfMkQsIDAsIDAsIDAsIDAsIDAsIDIsIDIpOworCisgICAgLy8gQmx1ZSBjYW52YXMK
KyAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDEsIDEpOworICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JV
RkZFUl9CSVQgfCBnbC5ERVBUSF9CVUZGRVJfQklUKTsKKworICAgIC8vIERyYXcgdGhlIHRyaWFu
Z2xlcworICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVTLCAwLCA2KTsKKworICAgIC8vIFJl
YWQgYmFjayB0aGUgcmVuZGVyaW5nIHJlc3VsdHMsIHNob3VsZCBiZSBncmVlbgorICAgIGJ1ZiA9
IGdsLnJlYWRQaXhlbHMoMCwgMCwgMiwgMiwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSk7Cisg
ICAgY29ycmVjdENvbG9yID0gWzAsIDI1NSwgMF07CisgICAgZm9yICh2YXIgeSA9IDA7IHkgPCAy
OyB5KyspIHsKKyAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCAyOyB4KyspIHsKKyAgICAgICAg
ICAgIGlkeCA9ICh5ICogMiArIHgpICogNDsKKyAgICAgICAgICAgIHBpeGVsWzBdID0gYnVmW2lk
eF07CisgICAgICAgICAgICBwaXhlbFsxXSA9IGJ1ZltpZHggKyAxXTsKKyAgICAgICAgICAgIHBp
eGVsWzJdID0gYnVmW2lkeCArIDJdOworICAgICAgICAgICAgc2hvdWxkQmUoInBpeGVsIiwgImNv
cnJlY3RDb2xvciIpOworICAgICAgICB9CisgICAgfQorfQorCitmdW5jdGlvbiBydW5UZXN0KGFu
dGlhbGlhcykKK3sKKyAgICBkZWJ1ZygiVGVzdGluZyB3aXRoIGFudGlhbGlhcyBvbiIpOworICAg
IHJ1blRlc3RJdGVyYXRpb24odHJ1ZSk7CisgICAgZGVidWcoIlRlc3Rpbmcgd2l0aCBhbnRpYWxp
YXMgb2ZmIik7CisgICAgcnVuVGVzdEl0ZXJhdGlvbihmYWxzZSk7CisKKyAgICBzdWNjZXNzZnVs
bHlQYXJzZWQgPSB0cnVlOworICAgIHZhciBlcGlsb2d1ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l
bnQoInNjcmlwdCIpOworICAgIGVwaWxvZ3VlLm9ubG9hZCA9IGZpbmlzaDsKKyAgICBlcGlsb2d1
ZS5zcmMgPSAiLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI7CisgICAgZG9jdW1l
bnQuYm9keS5hcHBlbmRDaGlsZChlcGlsb2d1ZSk7Cit9CisKK2Z1bmN0aW9uIGZpbmlzaCgpIHsK
KyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgIGxheW91dFRl
c3RDb250cm9sbGVyLm5vdGlmeURvbmUoKTsKKyAgICB9Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4K
Kzxib2R5IG9ubG9hZD0iaW5pdCgpIj4KKzxjYW52YXMgaWQ9ImFudGlhbGlhc09uIiB3aWR0aD0i
MnB4IiBoZWlnaHQ9IjJweCI+PC9jYW52YXM+Cis8Y2FudmFzIGlkPSJhbnRpYWxpYXNPZmYiIHdp
ZHRoPSIycHgiIGhlaWdodD0iMnB4Ij48L2NhbnZhcz4KKzxkaXYgaWQ9ImRlc2NyaXB0aW9uIj48
L2Rpdj4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDog
TGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcmVzb3VyY2VzL3V0aWxzM2QuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcmVzb3VyY2VzL3V0aWxzM2Qu
anMJKHJldmlzaW9uIDU3MTYwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcmVz
b3VyY2VzL3V0aWxzM2QuanMJKHdvcmtpbmcgY29weSkKQEAgLTE3LDEwICsxNywxMCBAQAogLy8g
YnkgdGhlIGNhbGxlci4gQnkgZGVmYXVsdCwgaXQgbWFwcyB0byB0aGUgd2luZG93LmNvbnNvbGUo
KSBmdW5jdGlvbiBvbiBXZWJLaXQgYW5kIHRvCiAvLyBhbiBlbXB0eSBmdW5jdGlvbiBvbiBvdGhl
ciBicm93c2Vycy4KIC8vCi1mdW5jdGlvbiBpbml0V2ViR0woY2FudmFzTmFtZSwgdnNoYWRlciwg
ZnNoYWRlciwgYXR0cmlicywgY2xlYXJDb2xvciwgY2xlYXJEZXB0aCkKK2Z1bmN0aW9uIGluaXRX
ZWJHTChjYW52YXNOYW1lLCB2c2hhZGVyLCBmc2hhZGVyLCBhdHRyaWJzLCBjbGVhckNvbG9yLCBj
bGVhckRlcHRoLCBjb250ZXh0QXR0cmlicykKIHsKICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoY2FudmFzTmFtZSk7Ci0gICAgdmFyIGdsID0gY2FudmFzLmdldENvbnRl
eHQoImV4cGVyaW1lbnRhbC13ZWJnbCIpOworICAgIHZhciBnbCA9IGNhbnZhcy5nZXRDb250ZXh0
KCJleHBlcmltZW50YWwtd2ViZ2wiLCBjb250ZXh0QXR0cmlicyk7CiAgICAgaWYgKCFnbCkgewog
ICAgICAgICBhbGVydCgiTm8gV2ViR0wgY29udGV4dCBmb3VuZCIpOwogICAgICAgICByZXR1cm4g
bnVsbDsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52782</attachid>
            <date>2010-04-07 14:31:17 -0700</date>
            <delta_ts>2010-04-09 03:07:03 -0700</delta_ts>
            <desc>revised patch: responding to Ken Russell&apos;s review</desc>
            <filename>tex.patch</filename>
            <type>text/plain</type>
            <size>15520</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzE4MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTYgQEAKKzIwMTAtMDQtMDYgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNdXN0IHJl
c29sdmUgbXVsdGlzYW1wbGVkIGJhY2sgYnVmZmVyIGR1cmluZyBjb3B5VGV4SW1hZ2UyRCBhbmQg
Y29weVRleFN1YkltYWdlMkQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTM3MTc0CisKKyAgICAgICAgVGVzdDogZmFzdC9jYW52YXMvd2ViZ2wvY29weS10
ZXgtaW1hZ2UtYW5kLXN1Yi1pbWFnZS0yZC5odG1sCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMuY3BwOiByZXNvbHZlIG11bHRpc2FtcGxlZCBi
YWNrIGJ1ZmZlciBkdXJpbmcgY29weVRleEltYWdlMkQgYW5kIGNvcHlUZXhTdWJJbWFnZTJELgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyRCk6CisK
IDIwMTAtMDQtMDYgIE5pY29sYXMgV2ViZXIgIDx0aGFraXNAY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IERpbWl0cmkgR2xhemtvdi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5jcHAJKHJldmlz
aW9uIDU3MTU0KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250
ZXh0M0RNYWMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OTksMTMgKzQ5OSwyOSBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFdlCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojpjb3B5VGV4SW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgdW5zaWdu
ZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lk
dGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCBsb25nIGJvcmRlcikKIHsKICAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRG
Qk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgeworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAg
ICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwg
eCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5F
QVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOworICAgIH0KICAgICA6OmdsQ29weVRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50
ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlcik7CisgICAgaWYgKG1fYXR0
cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKKyAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVG
Qk8pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyRCh1bnNp
Z25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgbG9uZyB4b2Zmc2V0LCBsb25nIHlvZmZzZXQs
IGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdo
dCkKIHsKICAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgaWYgKG1fYXR0cnMu
YW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgeworICAgICAgICA6
OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2Ft
cGxlRkJPKTsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVG
RkVSX0VYVCwgbV9mYm8pOworICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHksIHgg
KyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xP
Ul9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgIH0KICAgICA6OmdsQ29weVRleFN1Yklt
YWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdo
dCk7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNh
bXBsZUZCTykKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVGQk8pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjdWxs
RmFjZSh1bnNpZ25lZCBsb25nIG1vZGUpCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU3MTgw
KQorKysgV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDE2IEBACisyMDEwLTA0LTA2ICBaaGVueWFvIE1vICA8em1vQGdvb2dsZS5jb20+CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTXVzdCByZXNvbHZlIG11
bHRpc2FtcGxlZCBiYWNrIGJ1ZmZlciBkdXJpbmcgY29weVRleEltYWdlMkQgYW5kIGNvcHlUZXhT
dWJJbWFnZTJECisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0zNzE3NAorCisgICAgICAgIFRlc3Q6IGZhc3QvY2FudmFzL3dlYmdsL2NvcHktdGV4LWltYWdl
LWFuZC1zdWItaW1hZ2UtMmQuaHRtbAorCisgICAgICAgICogc3JjL1dlYkdyYXBoaWNzQ29udGV4
dDNERGVmYXVsdEltcGwuY3BwOiBSZXNvbHZlIG11bHRpc2FtcGxlZCBiYWNrIGJ1ZmZlciBkdXJp
bmcgY29weVRleEltYWdlMkQgYW5kIGNvcHlUZXhTdWJJbWFnZTJELgorICAgICAgICAoV2ViS2l0
OjpXZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsOjpjb3B5VGV4SW1hZ2UyRCk6CisgICAg
ICAgIChXZWJLaXQ6OldlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdEltcGw6OmNvcHlUZXhTdWJJ
bWFnZTJEKToKKwogMjAxMC0wNC0wNiAgTmljb2xhcyBXZWJlciAgPHRoYWtpc0BjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292LgpJbmRleDogV2ViS2l0
L2Nocm9taXVtL3NyYy9XZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkdyYXBoaWNzQ29udGV4dDNERGVmYXVsdElt
cGwuY3BwCShyZXZpc2lvbiA1NzE1NCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViR3JhcGhp
Y3NDb250ZXh0M0REZWZhdWx0SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgzOCw5ICs4Mzgs
NDMgQEAgREVMRUdBVEVfVE9fR0xfNChjb2xvck1hc2ssIENvbG9yTWFzaywgYgogCiBERUxFR0FU
RV9UT19HTF8xKGNvbXBpbGVTaGFkZXIsIENvbXBpbGVTaGFkZXIsIFdlYkdMSWQpCiAKLURFTEVH
QVRFX1RPX0dMXzgoY29weVRleEltYWdlMkQsIENvcHlUZXhJbWFnZTJELCB1bnNpZ25lZCBsb25n
LCBsb25nLCB1bnNpZ25lZCBsb25nLCBsb25nLCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25l
ZCBsb25nLCBsb25nKQordm9pZCBXZWJHcmFwaGljc0NvbnRleHQzRERlZmF1bHRJbXBsOjpjb3B5
VGV4SW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgdW5zaWduZWQgbG9u
ZyBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2ln
bmVkIGxvbmcgaGVpZ2h0LCBsb25nIGJvcmRlcikKK3sKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKKyNpZm5kZWYgUkVOREVSX1RPX0RFQlVHR0lOR19XSU5ET1cKKyAgICBpZiAobV9hdHRyaWJ1
dGVzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKKyAgICAg
ICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlz
YW1wbGVGQk8pOworICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVG
RkVSX0VYVCwgbV9mYm8pOworICAgICAgICBnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsg
d2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1Jf
QlVGRkVSX0JJVCwgR0xfTElORUFSKTsKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgfQorI2VuZGlmCisgICAgZ2xDb3B5VGV4SW1h
Z2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsIGhlaWdodCwg
Ym9yZGVyKTsKKyNpZm5kZWYgUkVOREVSX1RPX0RFQlVHR0lOR19XSU5ET1cKKyAgICBpZiAobV9h
dHRyaWJ1dGVzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCisg
ICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZC
Tyk7CisjZW5kaWYKK30KIAotREVMRUdBVEVfVE9fR0xfOChjb3B5VGV4U3ViSW1hZ2UyRCwgQ29w
eVRleFN1YkltYWdlMkQsIHVuc2lnbmVkIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxv
bmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpCit2b2lkIFdlYkdyYXBoaWNzQ29udGV4
dDNERGVmYXVsdEltcGw6OmNvcHlUZXhTdWJJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBs
b25nIGxldmVsLCBsb25nIHhvZmZzZXQsIGxvbmcgeW9mZnNldCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB4LCBsb25nIHksIHVu
c2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIG1ha2VDb250
ZXh0Q3VycmVudCgpOworI2lmbmRlZiBSRU5ERVJfVE9fREVCVUdHSU5HX1dJTkRPVworICAgIGlm
IChtX2F0dHJpYnV0ZXMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZC
TykgeworICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VY
VCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RS
QVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIGdsQmxpdEZyYW1lYnVmZmVyRVhU
KHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0
LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICBnbEJpbmRGcmFtZWJ1
ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICB9CisjZW5kaWYKKyAgICBn
bENvcHlUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHks
IHdpZHRoLCBoZWlnaHQpOworI2lmbmRlZiBSRU5ERVJfVE9fREVCVUdHSU5HX1dJTkRPVworICAg
IGlmIChtX2F0dHJpYnV0ZXMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBs
ZUZCTykKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBt
X2JvdW5kRkJPKTsKKyNlbmRpZgorfQogCiBERUxFR0FURV9UT19HTF8xKGN1bGxGYWNlLCBDdWxs
RmFjZSwgdW5zaWduZWQgbG9uZykKIApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNTcxODApCisrKyBMYXlv
dXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNCBAQAorMjAxMC0w
NC0wNiAgWmhlbnlhbyBNbyAgPHptb0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIE11c3QgcmVzb2x2ZSBtdWx0aXNhbXBsZWQgYmFj
ayBidWZmZXIgZHVyaW5nIGNvcHlUZXhJbWFnZTJEIGFuZCBjb3B5VGV4U3ViSW1hZ2UyRAorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzcxNzQKKworICAg
ICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2NvcHktdGV4LWltYWdlLWFuZC1zdWItaW1hZ2UtMmQt
ZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L2NhbnZhcy93ZWJnbC9jb3B5LXRl
eC1pbWFnZS1hbmQtc3ViLWltYWdlLTJkLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGZhc3QvY2Fu
dmFzL3dlYmdsL3Jlc291cmNlcy91dGlsczNkLmpzOiBBZGQgQ29udGV4dEF0dHJpYnV0ZXMgcGFy
YW1ldGVyIHRvIGluaXRXZWJHTCBmdW5jdGlvbi4KKwogMjAxMC0wNC0wNiAgTWFyayBSb3dlICA8
bXJvd2VAYXBwbGUuY29tPgogCiAgICAgICAgIFJ1YmJlci1zdGFtcGVkIGJ5IE9saXZlciBIdW50
LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvY29weS10ZXgtaW1hZ2UtYW5k
LXN1Yi1pbWFnZS0yZC1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFz
dC9jYW52YXMvd2ViZ2wvY29weS10ZXgtaW1hZ2UtYW5kLXN1Yi1pbWFnZS0yZC1leHBlY3RlZC50
eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9jb3B5LXRl
eC1pbWFnZS1hbmQtc3ViLWltYWdlLTJkLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwzOSBAQAorIAorVmVyaWZ5IGNvcHlUZXhJbWFnZTJEIGFuZCBjb3B5VGV4U3ViSW1hZ2Uy
RAorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2Vz
LCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKK1Rlc3Rpbmcgd2l0aCBhbnRpYWxpYXMg
b24KK1Rlc3RpbmcgY29weVRleEltYWdlMkQKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyBnbC5OT19F
UlJPUgorUEFTUyBnbC5nZXRFcnJvcigpIGlzIGdsLk5PX0VSUk9SCitQQVNTIHBpeGVsIGlzIGNv
cnJlY3RDb2xvcgorUEFTUyBwaXhlbCBpcyBjb3JyZWN0Q29sb3IKK1BBU1MgcGl4ZWwgaXMgY29y
cmVjdENvbG9yCitQQVNTIHBpeGVsIGlzIGNvcnJlY3RDb2xvcgorVGVzdGluZyBjb3B5VGV4U3Vi
SW1hZ2UyRAorUEFTUyBnbC5nZXRFcnJvcigpIGlzIGdsLk5PX0VSUk9SCitQQVNTIGdsLmdldEVy
cm9yKCkgaXMgZ2wuTk9fRVJST1IKK1BBU1MgcGl4ZWwgaXMgY29ycmVjdENvbG9yCitQQVNTIHBp
eGVsIGlzIGNvcnJlY3RDb2xvcgorUEFTUyBwaXhlbCBpcyBjb3JyZWN0Q29sb3IKK1BBU1MgcGl4
ZWwgaXMgY29ycmVjdENvbG9yCitUZXN0aW5nIHdpdGggYW50aWFsaWFzIG9mZgorVGVzdGluZyBj
b3B5VGV4SW1hZ2UyRAorUEFTUyBnbC5nZXRFcnJvcigpIGlzIGdsLk5PX0VSUk9SCitQQVNTIGds
LmdldEVycm9yKCkgaXMgZ2wuTk9fRVJST1IKK1BBU1MgcGl4ZWwgaXMgY29ycmVjdENvbG9yCitQ
QVNTIHBpeGVsIGlzIGNvcnJlY3RDb2xvcgorUEFTUyBwaXhlbCBpcyBjb3JyZWN0Q29sb3IKK1BB
U1MgcGl4ZWwgaXMgY29ycmVjdENvbG9yCitUZXN0aW5nIGNvcHlUZXhTdWJJbWFnZTJECitQQVNT
IGdsLmdldEVycm9yKCkgaXMgZ2wuTk9fRVJST1IKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyBnbC5O
T19FUlJPUgorUEFTUyBwaXhlbCBpcyBjb3JyZWN0Q29sb3IKK1BBU1MgcGl4ZWwgaXMgY29ycmVj
dENvbG9yCitQQVNTIHBpeGVsIGlzIGNvcnJlY3RDb2xvcgorUEFTUyBwaXhlbCBpcyBjb3JyZWN0
Q29sb3IKK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQor
CkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9jb3B5LXRleC1pbWFnZS1hbmQt
c3ViLWltYWdlLTJkLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMv
d2ViZ2wvY29weS10ZXgtaW1hZ2UtYW5kLXN1Yi1pbWFnZS0yZC5odG1sCShyZXZpc2lvbiAwKQor
KysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvY29weS10ZXgtaW1hZ2UtYW5kLXN1Yi1p
bWFnZS0yZC5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE5MCBAQAorPGh0bWw+Cis8aGVh
ZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRl
c3Qtc3R5bGUuY3NzIi8+Cis8c2NyaXB0IHNyYz0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qt
cHJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvd2ViZ2wtdGVzdC5qcyI+
PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL3V0aWxzM2QuanMiPiA8L3NjcmlwdD4K
KzxzY3JpcHQgaWQ9InZzaGFkZXIiIHR5cGU9Ingtc2hhZGVyL3gtdmVydGV4Ij4KK2F0dHJpYnV0
ZSB2ZWMzIGdfUG9zaXRpb247CithdHRyaWJ1dGUgdmVjMiBnX1RleENvb3JkMDsKKwordmFyeWlu
ZyB2ZWMyIHRleENvb3JkOworCit2b2lkIG1haW4oKQoreworICAgIGdsX1Bvc2l0aW9uID0gdmVj
NChnX1Bvc2l0aW9uLngsIGdfUG9zaXRpb24ueSwgZ19Qb3NpdGlvbi56LCAxLjApOworICAgIHRl
eENvb3JkID0gZ19UZXhDb29yZDA7Cit9Cis8L3NjcmlwdD4KKworPHNjcmlwdCBpZD0iZnNoYWRl
ciIgdHlwZT0ieC1zaGFkZXIveC1mcmFnbWVudCI+Cit1bmlmb3JtIHNhbXBsZXIyRCB0ZXg7Cit2
YXJ5aW5nIHZlYzIgdGV4Q29vcmQ7CisKK3ZvaWQgbWFpbigpCit7CisgICAgZ2xfRnJhZ0NvbG9y
ID0gdGV4dHVyZTJEKHRleCwgdGV4Q29vcmQpOworfQorPC9zY3JpcHQ+CisKKzxzY3JpcHQ+Cit2
YXIgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gZmFsc2U7CisKK2Z1bmN0aW9uIGluaXQoKQoreworICAg
IGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAgICAgbGF5b3V0VGVzdENv
bnRyb2xsZXIub3ZlcnJpZGVQcmVmZXJlbmNlKCJXZWJLaXRXZWJHTEVuYWJsZWQiLCAiMSIpOwor
ICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgIGxheW91
dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdGlv
bignVmVyaWZ5IGNvcHlUZXhJbWFnZTJEIGFuZCBjb3B5VGV4U3ViSW1hZ2UyRCcpOworCisgICAg
cnVuVGVzdCgpOworfQorCisvLyBUaGVzZSB0d28gZGVjbGFyYXRpb25zIG5lZWQgdG8gYmUgZ2xv
YmFsIGZvciAic2hvdWxkQmUiIHRvIHNlZSB0aGVtCit2YXIgcGl4ZWwgPSBbMCwgMCwgMF07Cit2
YXIgY29ycmVjdENvbG9yID0gbnVsbDsKK3ZhciBnbCA9IG51bGw7CisKK2Z1bmN0aW9uIHJ1blRl
c3RJdGVyYXRpb24oYW50aWFsaWFzKQoreworICAgIGlmIChhbnRpYWxpYXMpCisgICAgICAgIGds
ID0gaW5pdFdlYkdMKCJhbnRpYWxpYXNPbiIsICJ2c2hhZGVyIiwgImZzaGFkZXIiLCBbICJnX1Bv
c2l0aW9uIiwgImdfVGV4Q29vcmQwIiBdLCBbIDAsIDAsIDAsIDEgXSwgMSk7CisgICAgZWxzZQor
ICAgICAgICBnbCA9IGluaXRXZWJHTCgiYW50aWFsaWFzT2ZmIiwgInZzaGFkZXIiLCAiZnNoYWRl
ciIsIFsgImdfUG9zaXRpb24iLCAiZ19UZXhDb29yZDAiIF0sIFsgMCwgMCwgMCwgMSBdLCAxLCB7
IGFudGlhbGlhczogZmFsc2UgfSk7CisKKyAgICB2YXIgdGV4dHVyZUxvYyA9IGdsLmdldFVuaWZv
cm1Mb2NhdGlvbihnbC5wcm9ncmFtLCAidGV4Iik7CisKKyAgICB2YXIgdmVydGljZXMgPSBuZXcg
V2ViR0xGbG9hdEFycmF5KFsKKyAgICAgICAgIDEuMCwgIDEuMCwgMC4wLAorICAgICAgICAtMS4w
LCAgMS4wLCAwLjAsCisgICAgICAgIC0xLjAsIC0xLjAsIDAuMCwKKyAgICAgICAgIDEuMCwgIDEu
MCwgMC4wLAorICAgICAgICAtMS4wLCAtMS4wLCAwLjAsCisgICAgICAgICAxLjAsIC0xLjAsIDAu
MF0pOworICAgIHZhciB0ZXhDb29yZHMgPSBuZXcgV2ViR0xGbG9hdEFycmF5KFsKKyAgICAgICAg
MS4wLCAxLjAsCisgICAgICAgIDAuMCwgMS4wLAorICAgICAgICAwLjAsIDAuMCwKKyAgICAgICAg
MS4wLCAxLjAsCisgICAgICAgIDAuMCwgMC4wLAorICAgICAgICAxLjAsIDAuMF0pOworICAgIHZh
ciB0ZXhDb29yZE9mZnNldCA9IHZlcnRpY2VzLmJ5dGVMZW5ndGg7CisKKyAgICB2YXIgdmJvID0g
Z2wuY3JlYXRlQnVmZmVyKCk7CisgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHZi
byk7CisgICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsCisgICAgICAgICAgICAgICAg
ICB0ZXhDb29yZE9mZnNldCArIHRleENvb3Jkcy5ieXRlTGVuZ3RoLAorICAgICAgICAgICAgICAg
ICAgZ2wuU1RBVElDX0RSQVcpOworICAgIGdsLmJ1ZmZlclN1YkRhdGEoZ2wuQVJSQVlfQlVGRkVS
LCAwLCB2ZXJ0aWNlcyk7CisgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5BUlJBWV9CVUZGRVIsIHRl
eENvb3JkT2Zmc2V0LCB0ZXhDb29yZHMpOworCisgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJy
YXkoMCk7CisgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcigwLCAzLCBnbC5GTE9BVCwgZmFsc2Us
IDAsIDApOworICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpOworICAgIGdsLnZlcnRl
eEF0dHJpYlBvaW50ZXIoMSwgMiwgZ2wuRkxPQVQsIGdsLkZBTFNFLCAwLCB0ZXhDb29yZE9mZnNl
dCk7CisKKyAgICBnbC5jb2xvck1hc2soMSwgMSwgMSwgMCk7CisgICAgZ2wuZGlzYWJsZShnbC5C
TEVORCk7CisgICAgZGVidWcoJ1Rlc3RpbmcgY29weVRleEltYWdlMkQnKTsKKworICAgIC8vIFJl
ZCBjYW52YXMKKyAgICBnbC5jbGVhckNvbG9yKDEsIDAsIDAsIDEpOworICAgIGdsLmNsZWFyKGds
LkNPTE9SX0JVRkZFUl9CSVQgfCBnbC5ERVBUSF9CVUZGRVJfQklUKTsKKworICAgIHZhciB0ZXh0
dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOworICAgIC8vIEJpbmQgdGhlIHRleHR1cmUgdG8gdGV4
dHVyZSB1bml0IDAKKyAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsK
KyAgICAvLyBTZXQgdXAgdGV4dHVyZQorICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwg
MCwgZ2wuUkdCQSwgMiwgMiwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgbnVsbCk7ICAg
IAorICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklM
VEVSLCBnbC5ORUFSRVNUKTsKKyAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGds
LlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CisKKyAgICBzaG91bGRCZSgiZ2wuZ2V0
RXJyb3IoKSIsICJnbC5OT19FUlJPUiIpOworICAgIGdsLmNvcHlUZXhJbWFnZTJEKGdsLlRFWFRV
UkVfMkQsIDAsIGdsLlJHQkEsIDAsIDAsIDIsIDIsIDApOworICAgIHNob3VsZEJlKCJnbC5nZXRF
cnJvcigpIiwgImdsLk5PX0VSUk9SIik7CisKKyAgICAvLyBHcmVlbiBjYW52YXMKKyAgICBnbC5j
bGVhckNvbG9yKDAsIDEsIDAsIDEpOworICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQg
fCBnbC5ERVBUSF9CVUZGRVJfQklUKTsKKworICAgIC8vIFBvaW50IHRoZSB1bmlmb3JtIHNhbXBs
ZXIgdG8gdGV4dHVyZSB1bml0IDAKKyAgICBnbC51bmlmb3JtMWkodGV4dHVyZUxvYywgMCk7Cisg
ICAgLy8gRHJhdyB0aGUgdHJpYW5nbGVzCisgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRVMs
IDAsIDYpOworCisgICAgLy8gUmVhZCBiYWNrIHRoZSByZW5kZXJpbmcgcmVzdWx0cywgc2hvdWxk
IGJlIHJlZAorICAgIHZhciBidWYgPSBnbC5yZWFkUGl4ZWxzKDAsIDAsIDIsIDIsIGdsLlJHQkEs
IGdsLlVOU0lHTkVEX0JZVEUpOworICAgIHZhciBpZHggPSAwOworICAgIGNvcnJlY3RDb2xvciA9
IFsyNTUsIDAsIDBdOworICAgIGZvciAodmFyIHkgPSAwOyB5IDwgMjsgeSsrKSB7CisgICAgICAg
IGZvciAodmFyIHggPSAwOyB4IDwgMjsgeCsrKSB7CisgICAgICAgICAgICBpZHggPSAoeSAqIDIg
KyB4KSAqIDQ7CisgICAgICAgICAgICBwaXhlbFswXSA9IGJ1ZltpZHhdOworICAgICAgICAgICAg
cGl4ZWxbMV0gPSBidWZbaWR4ICsgMV07CisgICAgICAgICAgICBwaXhlbFsyXSA9IGJ1ZltpZHgg
KyAyXTsKKyAgICAgICAgICAgIHNob3VsZEJlKCJwaXhlbCIsICJjb3JyZWN0Q29sb3IiKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIGRlYnVnKCdUZXN0aW5nIGNvcHlUZXhTdWJJbWFnZTJEJyk7
CisKKyAgICAvLyBHcmVlbiBjYW52YXMKKyAgICBnbC5jbGVhckNvbG9yKDAsIDEsIDAsIDEpOwor
ICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQgfCBnbC5ERVBUSF9CVUZGRVJfQklUKTsK
KworICAgIHNob3VsZEJlKCJnbC5nZXRFcnJvcigpIiwgImdsLk5PX0VSUk9SIik7CisgICAgZ2wu
Y29weVRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgMCwgMCwgMiwgMik7Cisg
ICAgc2hvdWxkQmUoImdsLmdldEVycm9yKCkiLCAiZ2wuTk9fRVJST1IiKTsKKworICAgIC8vIEJs
dWUgY2FudmFzCisgICAgZ2wuY2xlYXJDb2xvcigwLCAwLCAxLCAxKTsKKyAgICBnbC5jbGVhcihn
bC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7CisKKyAgICAvLyBEcmF3
IHRoZSB0cmlhbmdsZXMKKyAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFUywgMCwgNik7CisK
KyAgICAvLyBSZWFkIGJhY2sgdGhlIHJlbmRlcmluZyByZXN1bHRzLCBzaG91bGQgYmUgZ3JlZW4K
KyAgICBidWYgPSBnbC5yZWFkUGl4ZWxzKDAsIDAsIDIsIDIsIGdsLlJHQkEsIGdsLlVOU0lHTkVE
X0JZVEUpOworICAgIGNvcnJlY3RDb2xvciA9IFswLCAyNTUsIDBdOworICAgIGZvciAodmFyIHkg
PSAwOyB5IDwgMjsgeSsrKSB7CisgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgMjsgeCsrKSB7
CisgICAgICAgICAgICBpZHggPSAoeSAqIDIgKyB4KSAqIDQ7CisgICAgICAgICAgICBwaXhlbFsw
XSA9IGJ1ZltpZHhdOworICAgICAgICAgICAgcGl4ZWxbMV0gPSBidWZbaWR4ICsgMV07CisgICAg
ICAgICAgICBwaXhlbFsyXSA9IGJ1ZltpZHggKyAyXTsKKyAgICAgICAgICAgIHNob3VsZEJlKCJw
aXhlbCIsICJjb3JyZWN0Q29sb3IiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZnVuY3Rpb24g
cnVuVGVzdChhbnRpYWxpYXMpCit7CisgICAgZGVidWcoIlRlc3Rpbmcgd2l0aCBhbnRpYWxpYXMg
b24iKTsKKyAgICBydW5UZXN0SXRlcmF0aW9uKHRydWUpOworICAgIGRlYnVnKCJUZXN0aW5nIHdp
dGggYW50aWFsaWFzIG9mZiIpOworICAgIHJ1blRlc3RJdGVyYXRpb24oZmFsc2UpOworCisgICAg
c3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKKyAgICB2YXIgZXBpbG9ndWUgPSBkb2N1bWVudC5j
cmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKKyAgICBlcGlsb2d1ZS5vbmxvYWQgPSBmaW5pc2g7Cisg
ICAgZXBpbG9ndWUuc3JjID0gIi4uLy4uL2pzL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiOwor
ICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZXBpbG9ndWUpOworfQorCitmdW5jdGlvbiBm
aW5pc2goKSB7CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICAg
ICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7CisgICAgfQorfQorPC9zY3JpcHQ+
Cis8L2hlYWQ+Cis8Ym9keSBvbmxvYWQ9ImluaXQoKSI+Cis8Y2FudmFzIGlkPSJhbnRpYWxpYXNP
biIgd2lkdGg9IjJweCIgaGVpZ2h0PSIycHgiPjwvY2FudmFzPgorPGNhbnZhcyBpZD0iYW50aWFs
aWFzT2ZmIiB3aWR0aD0iMnB4IiBoZWlnaHQ9IjJweCI+PC9jYW52YXM+Cis8ZGl2IGlkPSJkZXNj
cmlwdGlvbiI+PC9kaXY+Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKzwvYm9keT4KKzwvaHRt
bD4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3Jlc291cmNlcy91dGlsczNk
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3Jlc291cmNl
cy91dGlsczNkLmpzCShyZXZpc2lvbiA1NzE2MCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFz
L3dlYmdsL3Jlc291cmNlcy91dGlsczNkLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0xNywxMCArMTcs
MTAgQEAKIC8vIGJ5IHRoZSBjYWxsZXIuIEJ5IGRlZmF1bHQsIGl0IG1hcHMgdG8gdGhlIHdpbmRv
dy5jb25zb2xlKCkgZnVuY3Rpb24gb24gV2ViS2l0IGFuZCB0bwogLy8gYW4gZW1wdHkgZnVuY3Rp
b24gb24gb3RoZXIgYnJvd3NlcnMuCiAvLwotZnVuY3Rpb24gaW5pdFdlYkdMKGNhbnZhc05hbWUs
IHZzaGFkZXIsIGZzaGFkZXIsIGF0dHJpYnMsIGNsZWFyQ29sb3IsIGNsZWFyRGVwdGgpCitmdW5j
dGlvbiBpbml0V2ViR0woY2FudmFzTmFtZSwgdnNoYWRlciwgZnNoYWRlciwgYXR0cmlicywgY2xl
YXJDb2xvciwgY2xlYXJEZXB0aCwgY29udGV4dEF0dHJpYnMpCiB7CiAgICAgdmFyIGNhbnZhcyA9
IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNhbnZhc05hbWUpOwotICAgIHZhciBnbCA9IGNhbnZh
cy5nZXRDb250ZXh0KCJleHBlcmltZW50YWwtd2ViZ2wiKTsKKyAgICB2YXIgZ2wgPSBjYW52YXMu
Z2V0Q29udGV4dCgiZXhwZXJpbWVudGFsLXdlYmdsIiwgY29udGV4dEF0dHJpYnMpOwogICAgIGlm
ICghZ2wpIHsKICAgICAgICAgYWxlcnQoIk5vIFdlYkdMIGNvbnRleHQgZm91bmQiKTsKICAgICAg
ICAgcmV0dXJuIG51bGw7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>